import { Activity, Heading, Text } from "@godxjp/ui/general"; import { Avatar, AvatarFallback, Card, CardContent, CardHeader, CardTitle, } from "@godxjp/ui/data-display"; import { Textarea } from "@godxjp/ui/data-entry"; import { Flex, PageContainer, Separator } from "@godxjp/ui/layout"; /** * Activity · the official AMBIENT-motion primitive: a continuous, unbounded "something is happening * right now, elsewhere". The LOOP counterpart to `Reveal`'s one-shot entrance. * * Reads the DS motion tokens (`--activity-interval`, `--activity-stagger-step`, * `--activity-mark-offset`, `--activity-color`, `--ease-standard`) so a consumer never hand-rolls a * looping `@keyframes` + its own `prefers-reduced-motion` guard. Under reduced motion the loop is * dropped and each mark falls back to a DESIGNED resting state · three solid dots, a solid pulse * mark, a bar segment parked at the reading-start · never to nothing. * * Composed only from real @godxjp/ui components. All copy is consumer-owned and localized. */ const MESSAGES = [ { id: "m1", who: "田中", initials: "田", body: "在庫の締めは今日の18時でお願いします。" }, { id: "m2", who: "佐藤", initials: "佐", body: "了解しました。倉庫Bの棚卸しを先に片付けます。" }, { id: "m3", who: "田中", initials: "田", body: "助かります。差異があれば共有してください。" }, ]; const TONES = [ { tone: "muted", label: "muted · 既定(環境音)" }, { tone: "default", label: "default · 前景色" }, { tone: "primary", label: "primary · 主要導線" }, { tone: "success", label: "success · 接続中" }, { tone: "warning", label: "warning · 再接続中" }, { tone: "destructive", label: "destructive · 録画中" }, { tone: "info", label: "info · 同期中" }, ] as const; const SIZES = [ { size: "xs", label: "xs" }, { size: "sm", label: "sm(既定)" }, { size: "md", label: "md" }, { size: "lg", label: "lg" }, ] as const; export default function Demo() { return ( {/* ── The real screen: a channel with a live typing affordance under the composer ── */} #倉庫-運用 {/* Ambient sync state at the top of the channel · the same primitive, `bar` mark. */} {MESSAGES.map((message) => ( {message.initials} {message.who} {message.body} ))} {/* * The typing affordance. `announce` is left at its default `false`: typing flickers * on and off with every socket event, and a live region there re-announces * continuously. The row sits ABOVE the composer and keeps its own height, so the * composer does not jump when the indicator appears or disappears. */}