@marktiderman/genesis-chat 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -7
- package/dist/{chunk-5D5A7I4Q.js → chunk-A4YJX7KT.js} +130 -16
- package/dist/chunk-A4YJX7KT.js.map +1 -0
- package/dist/chunk-AZS3HNLM.js +30 -0
- package/dist/chunk-AZS3HNLM.js.map +1 -0
- package/dist/{chunk-7S6HYNWW.js → chunk-GBJ3YI4E.js} +72 -5
- package/dist/chunk-GBJ3YI4E.js.map +1 -0
- package/dist/{chunk-PZTOY2LY.js → chunk-JU2FAPBI.js} +46 -13
- package/dist/chunk-JU2FAPBI.js.map +1 -0
- package/dist/{client-DMa2j7kz.d.ts → client-DUIG1hum.d.ts} +36 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -2
- package/dist/native.d.ts +36 -7
- package/dist/native.js +239 -116
- package/dist/native.js.map +1 -1
- package/dist/{outbox-B0y3phE0.d.ts → outbox-B9NAWQ58.d.ts} +74 -6
- package/dist/push.d.ts +2 -2
- package/dist/react.d.ts +48 -21
- package/dist/react.js +3 -3
- package/dist/server.d.ts +43 -2
- package/dist/server.js +115 -15
- package/dist/server.js.map +1 -1
- package/dist/{thread-DWXHKPdw.d.ts → thread-oPra7pkW.d.ts} +1 -1
- package/dist/web.d.ts +31 -11
- package/dist/web.js +97 -48
- package/dist/web.js.map +1 -1
- package/migrations/0003_genesis_chat_search_threads.sql +85 -0
- package/migrations/tests/0002_genesis_chat_coaching.test.sql +7 -3
- package/migrations/tests/0003_genesis_chat_search_threads.test.sql +50 -0
- package/package.json +13 -9
- package/src/__tests__/coaching-core.test.ts +3 -1
- package/src/__tests__/coaching-react.test.tsx +73 -2
- package/src/__tests__/coaching-web.test.tsx +78 -6
- package/src/__tests__/fake-xhr.ts +54 -0
- package/src/__tests__/outbox-hosted.test.ts +269 -0
- package/src/__tests__/review-279.test.ts +41 -0
- package/src/__tests__/review-fixes-web.test.tsx +13 -10
- package/src/__tests__/server-fake-video.test.ts +81 -0
- package/src/__tests__/server-fakes.ts +7 -1
- package/src/__tests__/server-safety.test.ts +17 -4
- package/src/__tests__/web.test.tsx +16 -0
- package/src/core/client.ts +28 -2
- package/src/core/outbox.ts +222 -16
- package/src/core/transfer.ts +71 -0
- package/src/core/types.ts +17 -0
- package/src/index.ts +1 -0
- package/src/native/__tests__/emoji.test.tsx +16 -0
- package/src/native/__tests__/organise-screens.test.tsx +80 -0
- package/src/native/__tests__/video-media.test.tsx +81 -4
- package/src/native/attachment-cards.tsx +22 -6
- package/src/native/inbox-screen.tsx +12 -6
- package/src/native/index.ts +2 -2
- package/src/native/message-actions-sheet.tsx +10 -5
- package/src/native/message-bubble.tsx +3 -11
- package/src/native/modules.ts +2 -0
- package/src/native/schedule-sheet.tsx +23 -9
- package/src/native/search-screen.tsx +26 -5
- package/src/native/thread-screen.tsx +30 -3
- package/src/native/topics.tsx +70 -15
- package/src/native/video-player.tsx +46 -6
- package/src/native/video-recorder.tsx +6 -3
- package/src/native/voice-player.tsx +18 -0
- package/src/react/index.tsx +103 -19
- package/src/react/previews.ts +51 -0
- package/src/server/fake-video.ts +171 -0
- package/src/server/index.ts +1 -0
- package/src/web/attachments.tsx +6 -6
- package/src/web/bubble.tsx +22 -0
- package/src/web/inbox.tsx +7 -6
- package/src/web/memory-client.ts +11 -3
- package/src/web/panel.tsx +2 -2
- package/src/web/schedule.tsx +14 -2
- package/src/web/thread.tsx +36 -8
- package/src/web/video.tsx +28 -34
- package/dist/chunk-5D5A7I4Q.js.map +0 -1
- package/dist/chunk-7S6HYNWW.js.map +0 -1
- package/dist/chunk-PZTOY2LY.js.map +0 -1
package/dist/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/web/format.ts","../src/web/inbox.tsx","../src/web/search.tsx","../src/web/markdown.tsx","../src/web/cards.tsx","../src/web/error-boundary.tsx","../src/web/video.tsx","../src/web/voice-note.tsx","../src/web/attachments.tsx","../src/web/emoji-picker.tsx","../src/web/thread-context.ts","../src/web/bubble.tsx","../src/web/schedule.tsx","../src/web/availability.tsx","../src/web/use-voice-recorder.ts","../src/web/composer.tsx","../src/web/topics.tsx","../src/web/thread.tsx","../src/web/panel.tsx","../src/web/memory-client.ts","../src/web/broadcast.tsx"],"names":["jsx","useRef","jsxs","cn","Button","Skeleton","EmptyState","Badge","useState","attachment","Fragment","useEffect","Spinner","useCallback","Dialog","DialogContent","DialogTitle","DialogDescription","startsGroup","UserAvatar","MessageSquare","Pin","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","Clock","DropdownMenuSeparator","DialogHeader","Input","AlertCircle","X","Alert","AlertDescription","useMemo","toast","Label","Textarea","Lock","Mic","Popover","PopoverTrigger","CalendarClock","PopoverContent","FileText","Trash2","SendHorizontal","Tooltip","Paperclip","Video","MoreHorizontal","Plus","DialogFooter","Search","DefaultEmpty","body","renderSlot","m","s"],"mappings":"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","file":"web.js","sourcesContent":["/**\n * @feat:chat\n * Small formatting helpers for the web renderers: times, sizes, and the\n * one-line description of a message a screen reader hears.\n */\nimport { previewText } from \"../core/thread\";\nimport type { ChatMessage } from \"../core/types\";\n\n/** A person as the app names them. The package knows no people tables: the app supplies this. */\nexport interface ChatUser {\n name: string;\n avatarUrl?: string | null;\n}\n\nexport type ResolveUser = (userId: string) => ChatUser;\n\n/** 10:42 (in the reader's locale). */\nexport function clockTime(iso: string, locale?: string): string {\n return new Date(iso).toLocaleTimeString(locale, { hour: \"numeric\", minute: \"2-digit\" });\n}\n\n/** The inbox's time: \"now\", \"5m\", \"10:42\" today, \"Yesterday\", \"Mon\", or \"12 Mar\". */\nexport function relativeTime(iso: string | null | undefined, now = new Date(), locale?: string): string {\n if (!iso) return \"\";\n const d = new Date(iso);\n const diff = now.getTime() - d.getTime();\n if (diff < 60_000) return \"now\";\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m`;\n const startOf = (x: Date) => new Date(x.getFullYear(), x.getMonth(), x.getDate()).getTime();\n const days = Math.round((startOf(now) - startOf(d)) / 86_400_000);\n if (days === 0) return clockTime(iso, locale);\n if (days === 1) return \"Yesterday\";\n if (days > 1 && days < 7) return d.toLocaleDateString(locale, { weekday: \"short\" });\n return d.toLocaleDateString(locale, {\n day: \"numeric\",\n month: \"short\",\n year: d.getFullYear() === now.getFullYear() ? undefined : \"numeric\",\n });\n}\n\n/** 12 KB, 3.4 MB. */\nexport function formatBytes(bytes: number | null | undefined): string {\n if (bytes == null || !Number.isFinite(bytes)) return \"\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n return `${(bytes / 1024 / 1024 / 1024).toFixed(1)} GB`;\n}\n\n/** What a screen reader hears for one bubble: \"Sam, 10:42: See you then\". */\nexport function messageLabel(message: Pick<ChatMessage, \"body\" | \"createdAt\" | \"deletedAt\" | \"attachments\" | \"editedAt\" | \"visibility\">, sender: string, locale?: string): string {\n const what = previewText(message.body, message.attachments[0]?.kind ?? null, Boolean(message.deletedAt)) || \"Message\";\n const extra = [message.visibility === \"observers\" ? \"internal note\" : null, message.editedAt && !message.deletedAt ? \"edited\" : null].filter(Boolean);\n return `${sender}, ${clockTime(message.createdAt, locale)}: ${what}${extra.length ? ` (${extra.join(\", \")})` : \"\"}`;\n}\n","/**\n * @feat:chat\n * The inbox: your conversations, newest first, each a button with an avatar,\n * the title (the other person's name in a two-person conversation), a one-line\n * preview, the time, an unread count, an @ when you were mentioned, and muted\n * and pinned marks. Arrow keys move between rows.\n */\nimport { useRef, type KeyboardEvent } from \"react\";\nimport { AtSign, BellOff, MessageSquare, Pin } from \"lucide-react\";\nimport { Badge, Button, EmptyState, Skeleton, UserAvatar, cn } from \"@marktiderman/genesis-ui\";\nimport { renderSlot, type SlotOverride } from \"@marktiderman/genesis-core/slots\";\nimport { previewText } from \"../core/thread\";\nimport type { ChatInboxItem } from \"../core/types\";\nimport { useChat, useInbox } from \"../react/index\";\nimport { relativeTime, type ResolveUser } from \"./format\";\n\nexport interface ChatInboxEmptyProps {\n archived: boolean;\n}\n\nexport interface ChatInboxProps {\n /** Names people (the app knows them; the package doesn't). */\n resolveUser: ResolveUser;\n /** Called with a conversation's id when its row is chosen. */\n onSelect: (conversationId: string) => void;\n /** The open conversation, marked as current. */\n selectedId?: string | null;\n /** Only this kind of conversation. */\n kind?: string;\n /** The archived conversations instead. */\n archived?: boolean;\n /** A conversation's title when it has none and isn't two-person. */\n fallbackTitle?: (item: ChatInboxItem) => string;\n /** Replace or eject (`null`) the empty state. */\n slots?: { empty?: SlotOverride<ChatInboxEmptyProps> };\n \"aria-label\"?: string;\n className?: string;\n}\n\nfunction DefaultEmpty({ archived }: ChatInboxEmptyProps) {\n return (\n <EmptyState\n icon={MessageSquare}\n title={archived ? \"No archived conversations\" : \"No conversations yet\"}\n description={archived ? undefined : \"When someone messages you, it shows up here.\"}\n />\n );\n}\n\n/** The title an inbox row shows. */\nexport function inboxTitle(item: ChatInboxItem, resolveUser: ResolveUser, fallback?: (item: ChatInboxItem) => string): string {\n if (item.title) return item.title;\n if (item.otherUserId) return resolveUser(item.otherUserId).name;\n return fallback?.(item) ?? \"Conversation\";\n}\n\nexport function ChatInbox({ resolveUser, onSelect, selectedId, kind, archived = false, fallbackTitle, slots, className, ...rest }: ChatInboxProps) {\n const { userId: me } = useChat();\n const { items, isLoading, error, refetch } = useInbox({ kind, archived });\n const list = useRef<HTMLUListElement>(null);\n\n // Rows are native buttons (Tab reaches each); the arrows are added here\n // because no Radix primitive is a list of buttons with vertical roving focus.\n const onKeyDown = (e: KeyboardEvent<HTMLUListElement>) => {\n const buttons = Array.from(list.current?.querySelectorAll<HTMLButtonElement>(\"button[data-inbox-row]\") ?? []);\n const at = buttons.indexOf(document.activeElement as HTMLButtonElement);\n const to =\n e.key === \"ArrowDown\" ? Math.min(buttons.length - 1, at + 1) : e.key === \"ArrowUp\" ? Math.max(0, at - 1) : e.key === \"Home\" ? 0 : e.key === \"End\" ? buttons.length - 1 : -2;\n if (to === -2 || buttons.length === 0) return;\n e.preventDefault();\n buttons[to < 0 ? 0 : to]?.focus();\n };\n\n if (isLoading) {\n return (\n <div className={cn(\"flex flex-col\", className)} aria-busy aria-label=\"Loading conversations\" data-testid=\"genesis-chat-inbox-loading\">\n {Array.from({ length: 6 }, (_, i) => (\n <div key={i} className=\"flex items-center gap-3 px-3 py-3\">\n <Skeleton className=\"size-10 shrink-0 rounded-full\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-3.5 w-2/5\" />\n <Skeleton className=\"h-3 w-4/5\" />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={className}>\n <EmptyState\n icon={MessageSquare}\n title=\"Couldn't load your conversations\"\n description=\"Check your connection and try again.\"\n action={\n <Button type=\"button\" variant=\"outline\" onClick={() => void refetch()}>\n Try again\n </Button>\n }\n />\n </div>\n );\n }\n\n if (items.length === 0) {\n return <div className={className}>{renderSlot(DefaultEmpty, slots?.empty, { archived })}</div>;\n }\n\n return (\n <nav aria-label={rest[\"aria-label\"] ?? \"Conversations\"} className={cn(\"min-h-0\", className)} data-testid=\"genesis-chat-inbox\">\n <ul ref={list} className=\"flex flex-col\" onKeyDown={onKeyDown}>\n {items.map((item) => (\n <li key={item.conversationId}>\n <InboxRow item={item} me={me} resolveUser={resolveUser} fallbackTitle={fallbackTitle} selected={item.conversationId === selectedId} onSelect={onSelect} />\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n\ninterface InboxRowProps {\n item: ChatInboxItem;\n me: string;\n resolveUser: ResolveUser;\n fallbackTitle?: (item: ChatInboxItem) => string;\n selected: boolean;\n onSelect: (id: string) => void;\n}\n\nfunction InboxRow({ item, me, resolveUser, fallbackTitle, selected, onSelect }: InboxRowProps) {\n const title = inboxTitle(item, resolveUser, fallbackTitle);\n const other = item.otherUserId ? resolveUser(item.otherUserId) : null;\n const last = item.lastMessage;\n const unread = item.unread > 0;\n let preview = last ? previewText(last.body, last.attachment, last.deleted) : \"\";\n if (last && last.kind !== \"system\" && !last.deleted && last.senderId) {\n if (last.senderId === me) preview = `You: ${preview}`;\n else if (!item.otherUserId && item.memberCount > 2) preview = `${resolveUser(last.senderId).name}: ${preview}`;\n }\n const time = relativeTime(item.lastMessageAt ?? last?.createdAt);\n const count = item.unread >= 99 ? \"99+\" : String(item.unread);\n const label = [\n title,\n unread ? `${count} unread` : null,\n item.mentioned ? \"you were mentioned\" : null,\n item.muted ? \"muted\" : null,\n item.pinned ? \"pinned\" : null,\n preview || null,\n time || null,\n ]\n .filter(Boolean)\n .join(\", \");\n\n return (\n <button\n type=\"button\"\n data-inbox-row\n aria-current={selected ? \"true\" : undefined}\n aria-label={label}\n onClick={() => onSelect(item.conversationId)}\n className={cn(\n \"flex w-full items-center gap-3 px-3 py-2.5 text-left transition-colors hover:bg-accent focus-visible:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n selected && \"bg-accent\",\n )}\n data-testid={`genesis-chat-inbox-row-${item.conversationId}`}\n >\n <UserAvatar name={title} src={other?.avatarUrl} className=\"shrink-0\" />\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\" aria-hidden>\n <span className=\"flex items-center gap-2\">\n <span className={cn(\"min-w-0 flex-1 truncate text-sm\", unread ? \"font-semibold text-foreground\" : \"font-medium text-foreground\")}>{title}</span>\n <span className={cn(\"shrink-0 text-xs tabular-nums\", unread && !item.muted ? \"font-medium text-primary\" : \"text-muted-foreground\")}>{time}</span>\n </span>\n <span className=\"flex items-center gap-1.5\">\n <span className={cn(\"min-w-0 flex-1 truncate text-sm\", unread ? \"text-foreground\" : \"text-muted-foreground\")}>{preview || \" \"}</span>\n {item.pinned ? <Pin className=\"size-3.5 shrink-0 text-muted-foreground\" /> : null}\n {item.muted ? <BellOff className=\"size-3.5 shrink-0 text-muted-foreground\" /> : null}\n {item.mentioned ? (\n <span className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-primary text-primary-foreground\">\n <AtSign className=\"size-3\" />\n </span>\n ) : null}\n {unread ? (\n <Badge variant={item.muted ? \"muted\" : \"default\"} className=\"h-5 min-w-5 shrink-0 justify-center rounded-full px-1.5 text-[11px] tabular-nums\">\n {count}\n </Badge>\n ) : null}\n </span>\n </span>\n </button>\n );\n}\n\n","/**\n * @feat:chat\n * `ChatSearch`: a search box and its results, across all your conversations or in one. Each\n * result shows who, when, where (across conversations) and the snippet with the matched words\n * highlighted; hits in a voice note's or video's transcript are marked. Choosing one calls\n * `onOpen`, which the thread uses to jump to the message. Arrow keys move through the results.\n */\nimport { useRef, useState, type KeyboardEvent } from \"react\";\nimport { Mic, Search, X } from \"lucide-react\";\nimport { Badge, Button, EmptyState, Input, Skeleton, cn } from \"@marktiderman/genesis-ui\";\nimport { snippetParts } from \"../core/extras\";\nimport type { ChatSearchHit } from \"../core/types\";\nimport { useSearch } from \"../react/index\";\nimport { relativeTime, type ResolveUser } from \"./format\";\n\nexport interface ChatSearchProps {\n resolveUser: ResolveUser;\n /** Search one conversation; all of yours without it. */\n conversationId?: string | null;\n /** Called with the chosen result. */\n onOpen: (hit: ChatSearchHit) => void;\n /** Names a conversation, on results across conversations. */\n conversationTitle?: (conversationId: string) => string;\n /** Start with the box focused. */\n autoFocus?: boolean;\n debounceMs?: number;\n className?: string;\n}\n\n/** A snippet with its « » marks as <mark>. */\nexport function SearchSnippet({ snippet, className }: { snippet: string; className?: string }) {\n return (\n <span className={className}>\n {snippetParts(snippet).map((p, i) =>\n p.match ? (\n <mark key={i} className=\"rounded-sm bg-warning/30 px-0.5 text-foreground\">\n {p.text}\n </mark>\n ) : (\n <span key={i}>{p.text}</span>\n ),\n )}\n </span>\n );\n}\n\nexport function ChatSearch({ resolveUser, conversationId, onOpen, conversationTitle, autoFocus, debounceMs, className }: ChatSearchProps) {\n const [value, setValue] = useState(\"\");\n const { hits, query, isSearching } = useSearch(value, { conversationId, debounceMs });\n const list = useRef<HTMLUListElement>(null);\n\n // Native buttons in a list; the arrows are added here (no Radix primitive is a vertical list of buttons).\n const onKeyDown = (e: KeyboardEvent<HTMLElement>) => {\n if (e.key !== \"ArrowDown\" && e.key !== \"ArrowUp\") return;\n const buttons = Array.from(list.current?.querySelectorAll<HTMLButtonElement>(\"button[data-search-hit]\") ?? []);\n if (!buttons.length) return;\n e.preventDefault();\n const at = buttons.indexOf(document.activeElement as HTMLButtonElement);\n const to = e.key === \"ArrowDown\" ? Math.min(buttons.length - 1, at + 1) : at <= 0 ? -1 : at - 1;\n if (to < 0) (e.currentTarget.querySelector(\"input\") as HTMLInputElement | null)?.focus();\n else buttons[to]?.focus();\n };\n\n const short = value.trim().length < 2;\n return (\n <div className={cn(\"flex min-h-0 flex-col\", className)} onKeyDown={onKeyDown} data-testid=\"genesis-chat-search\" role=\"search\">\n <div className=\"relative p-2\">\n <Search className=\"pointer-events-none absolute left-4.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" aria-hidden />\n <Input\n type=\"search\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={conversationId ? \"Search this conversation\" : \"Search messages\"}\n aria-label={conversationId ? \"Search this conversation\" : \"Search messages\"}\n autoFocus={autoFocus}\n className=\"pl-8 pr-8\"\n data-testid=\"genesis-chat-search-input\"\n />\n {value ? (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"absolute right-3 top-1/2 size-6 -translate-y-1/2\" onClick={() => setValue(\"\")} aria-label=\"Clear search\">\n <X />\n </Button>\n ) : null}\n </div>\n <div className=\"sr-only\" aria-live=\"polite\">\n {short || isSearching ? \"\" : hits.length === 0 ? \"No results\" : hits.length === 1 ? \"1 result\" : `${hits.length} results`}\n </div>\n {short ? null : isSearching && hits.length === 0 ? (\n <div className=\"flex flex-col gap-2 p-3\" aria-busy aria-label=\"Searching\">\n <Skeleton className=\"h-12 w-full\" />\n <Skeleton className=\"h-12 w-full\" />\n </div>\n ) : hits.length === 0 ? (\n <EmptyState icon={Search} title=\"No results\" description={`Nothing matches “${query}”.`} />\n ) : (\n <ul ref={list} className=\"min-h-0 flex-1 overflow-y-auto\" aria-label=\"Results\">\n {hits.map((h) => {\n const who = h.senderId ? resolveUser(h.senderId).name : \"Someone\";\n return (\n <li key={`${h.messageId}:${h.inTranscript}`}>\n <button\n type=\"button\"\n data-search-hit\n onClick={() => onOpen(h)}\n className=\"flex w-full flex-col gap-0.5 px-3 py-2 text-left hover:bg-accent focus-visible:bg-accent focus-visible:outline-none\"\n data-testid=\"genesis-chat-search-hit\"\n >\n <span className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"truncate font-medium text-foreground\">{who}</span>\n {!conversationId && conversationTitle ? <span className=\"truncate\">in {conversationTitle(h.conversationId)}</span> : null}\n <span className=\"ml-auto shrink-0\">{relativeTime(h.createdAt)}</span>\n </span>\n <span className=\"flex items-start gap-1.5 text-sm\">\n {h.inTranscript ? (\n <Badge variant=\"secondary\" className=\"mt-0.5 shrink-0 gap-1 px-1.5 py-0 text-[10px]\" data-testid=\"genesis-chat-search-transcript\">\n <Mic className=\"size-3\" aria-hidden /> Transcript\n </Badge>\n ) : null}\n <SearchSnippet snippet={h.snippet} className=\"line-clamp-2\" />\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n","/**\n * @feat:chat\n * The safe inline markdown a message body is written in: **bold**, *italic*\n * (or _italic_), `code`, [links](https://…), bare https links, line breaks and\n * mentions written `@[Name](user:<uuid>)`. A small tokenizer turns the text\n * into nodes and the nodes into React elements, so every character of the\n * body reaches the page as text: no HTML is ever parsed, and nothing uses\n * dangerouslySetInnerHTML. Links open only for http and https.\n */\nimport { Fragment, type ReactNode } from \"react\";\nimport { cn } from \"@marktiderman/genesis-ui\";\n\nexport type MarkdownNode =\n | { type: \"text\"; text: string }\n | { type: \"bold\"; children: MarkdownNode[] }\n | { type: \"italic\"; children: MarkdownNode[] }\n | { type: \"code\"; text: string }\n | { type: \"link\"; href: string; children: MarkdownNode[] }\n | { type: \"mention\"; name: string; userId: string }\n | { type: \"break\" };\n\n/** True for an absolute http or https URL; everything else (javascript:, data:, relative) is refused. */\nexport function isSafeHref(href: string): boolean {\n try {\n const url = new URL(href);\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nconst MENTION = /^@\\[([^\\]\\n]{1,80})\\]\\(user:([0-9a-f-]{36})\\)/i;\nconst LINK = /^\\[([^\\]\\n]{1,300})\\]\\(((?:[^()\\s]|\\([^()\\s]*\\)){1,2000})\\)/;\nconst BARE_URL = /^https?:\\/\\/[^\\s<>\"]+/i;\nconst TRAILING_PUNCTUATION = /[.,;:!?)\\]'\"]+$/;\n\n/** Parses one message body into inline nodes. Never throws. */\nexport function parseMarkdown(text: string): MarkdownNode[] {\n const out: MarkdownNode[] = [];\n const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n lines.forEach((line, i) => {\n if (i > 0) out.push({ type: \"break\" });\n out.push(...parseInline(line, 0));\n });\n return mergeText(out);\n}\n\nfunction parseInline(src: string, depth: number): MarkdownNode[] {\n const out: MarkdownNode[] = [];\n let text = \"\";\n const flush = () => {\n if (text) out.push({ type: \"text\", text });\n text = \"\";\n };\n let i = 0;\n while (i < src.length) {\n const ch = src[i]!;\n const rest = src.slice(i);\n const prev = i > 0 ? src[i - 1]! : \"\";\n\n if (ch === \"\\\\\" && i + 1 < src.length && /[*_`[\\]@\\\\]/.test(src[i + 1]!)) {\n text += src[i + 1];\n i += 2;\n continue;\n }\n\n if (ch === \"`\") {\n const end = src.indexOf(\"`\", i + 1);\n if (end > i + 1) {\n flush();\n out.push({ type: \"code\", text: src.slice(i + 1, end) });\n i = end + 1;\n continue;\n }\n }\n\n if (ch === \"@\") {\n const m = MENTION.exec(rest);\n if (m) {\n flush();\n out.push({ type: \"mention\", name: m[1]!, userId: m[2]!.toLowerCase() });\n i += m[0].length;\n continue;\n }\n }\n\n if (ch === \"[\") {\n const m = LINK.exec(rest);\n if (m) {\n flush();\n const label = depth < 3 ? parseInline(m[1]!, depth + 1) : [{ type: \"text\" as const, text: m[1]! }];\n if (isSafeHref(m[2]!)) out.push({ type: \"link\", href: m[2]!, children: label });\n // A link we won't open keeps its words and drops the target.\n else out.push(...label);\n i += m[0].length;\n continue;\n }\n }\n\n if ((ch === \"h\" || ch === \"H\") && !/[\\w/]/.test(prev)) {\n const m = BARE_URL.exec(rest);\n if (m) {\n const url = m[0].replace(TRAILING_PUNCTUATION, \"\");\n if (isSafeHref(url)) {\n flush();\n out.push({ type: \"link\", href: url, children: [{ type: \"text\", text: url }] });\n i += url.length;\n continue;\n }\n }\n }\n\n if ((ch === \"*\" || ch === \"_\") && depth < 3) {\n const double = src[i + 1] === ch;\n const marker = double ? ch + ch : ch;\n // `_` only opens at a word edge, so snake_case stays as written.\n const opens = ch === \"*\" || !/\\w/.test(prev);\n const after = src[i + marker.length];\n if (opens && after && after !== \" \" && after !== ch) {\n const end = findClose(src, i + marker.length, marker);\n if (end > 0) {\n flush();\n const inner = parseInline(src.slice(i + marker.length, end), depth + 1);\n out.push(double ? { type: \"bold\", children: inner } : { type: \"italic\", children: inner });\n i = end + marker.length;\n continue;\n }\n }\n }\n\n text += ch;\n i += 1;\n }\n flush();\n return out;\n}\n\n/** Where `marker` closes: not after a space, and (for `_`) at a word edge. */\nfunction findClose(src: string, from: number, marker: string): number {\n let j = from;\n while (j < src.length) {\n const k = src.indexOf(marker, j);\n if (k < 0) return -1;\n const before = src[k - 1]!;\n const next = src[k + marker.length];\n const doubled = marker.length === 1 && next === marker;\n const edge = marker[0] !== \"_\" || !next || !/\\w/.test(next);\n if (k > from && before !== \" \" && !doubled && edge) return k;\n j = k + (doubled ? 2 : 1);\n }\n return -1;\n}\n\nfunction mergeText(nodes: MarkdownNode[]): MarkdownNode[] {\n const out: MarkdownNode[] = [];\n for (const n of nodes) {\n const last = out[out.length - 1];\n if (n.type === \"text\" && last?.type === \"text\") last.text += n.text;\n else out.push(n);\n }\n return out;\n}\n\nexport interface ChatMarkdownProps {\n /** The message body. */\n text: string;\n /** Draws a mention; a highlighted chip by default. */\n renderMention?: (mention: { name: string; userId: string }) => ReactNode;\n /** Mentions of this user are drawn stronger. */\n me?: string;\n /** Bubble colours: on `primary`, links and chips use the primary foreground. */\n tone?: \"default\" | \"primary\";\n className?: string;\n}\n\n/** Renders a message body's inline markdown as React elements. */\nexport function ChatMarkdown({ text, renderMention, me, tone = \"default\", className }: ChatMarkdownProps) {\n const nodes = parseMarkdown(text);\n return <span className={cn(\"whitespace-pre-wrap break-words [overflow-wrap:anywhere]\", className)}>{renderNodes(nodes, { renderMention, me, tone })}</span>;\n}\n\ninterface RenderOptions {\n renderMention?: ChatMarkdownProps[\"renderMention\"];\n me?: string;\n tone: \"default\" | \"primary\";\n}\n\nfunction renderNodes(nodes: MarkdownNode[], opts: RenderOptions): ReactNode[] {\n return nodes.map((n, i) => {\n switch (n.type) {\n case \"text\":\n return <Fragment key={i}>{n.text}</Fragment>;\n case \"break\":\n return <br key={i} />;\n case \"bold\":\n return <strong key={i} className=\"font-semibold\">{renderNodes(n.children, opts)}</strong>;\n case \"italic\":\n return <em key={i}>{renderNodes(n.children, opts)}</em>;\n case \"code\":\n return (\n <code\n key={i}\n className={cn(\n \"rounded px-1 py-0.5 font-mono text-[0.85em]\",\n opts.tone === \"primary\" ? \"bg-primary-foreground/15\" : \"bg-background/70\",\n )}\n >\n {n.text}\n </code>\n );\n case \"link\":\n return (\n <a\n key={i}\n href={n.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\"underline underline-offset-2\", opts.tone === \"primary\" ? \"text-primary-foreground\" : \"text-primary\")}\n >\n {renderNodes(n.children, opts)}\n </a>\n );\n case \"mention\": {\n if (opts.renderMention) return <Fragment key={i}>{opts.renderMention(n)}</Fragment>;\n const mine = opts.me && n.userId === opts.me.toLowerCase();\n return (\n <span\n key={i}\n data-mention={n.userId}\n className={cn(\n \"rounded px-1 font-medium\",\n opts.tone === \"primary\"\n ? \"bg-primary-foreground/20 text-primary-foreground\"\n : mine\n ? \"bg-primary/20 text-primary\"\n : \"bg-primary/10 text-primary\",\n )}\n >\n @{n.name}\n </span>\n );\n }\n }\n });\n}\n","/**\n * @feat:chat\n * Two cards under a message: `ChatLinkPreview`, a link's title, description, site and image\n * (all plain text from Open Graph, never HTML), and\n * `ChatAttachmentCard`, the generic card apps use for their own attachment kinds (a form, a\n * check-in): a title, a subtitle and one action.\n */\nimport { useState, type ComponentType } from \"react\";\nimport { ClipboardList, ExternalLink } from \"lucide-react\";\nimport { Button, cn } from \"@marktiderman/genesis-ui\";\nimport { isHttpsUrl } from \"../core/extras\";\nimport type { ChatLinkPreview as LinkPreviewData } from \"../core/types\";\nimport { isSafeHref } from \"./markdown\";\n\n/**\n * Whether a link preview shows its image. The image lives on the linked site, so loading it\n * straight from there tells that site each reader's IP address and when they read the message\n * (a tracking pixel the sender controls). So:\n * - `\"off\"` (the default): no image;\n * - `\"proxy\"`: through your own image proxy, `proxyUrl(imageUrl)`; no image without it;\n * - `\"direct\"`: from the linked site (only if you accept that).\n */\nexport type LinkPreviewImages = \"off\" | \"proxy\" | \"direct\";\n\n/** The image a preview may show under this setting, or null. Only https image URLs are ever considered. */\nexport function linkPreviewImageSrc(imageUrl: string | null | undefined, images: LinkPreviewImages = \"off\", proxyUrl?: (url: string) => string | null | undefined): string | null {\n if (!isHttpsUrl(imageUrl)) return null;\n if (images === \"direct\") return imageUrl;\n if (images !== \"proxy\" || !proxyUrl) return null;\n try {\n return proxyUrl(imageUrl) || null;\n } catch {\n return null;\n }\n}\n\nexport interface ChatLinkPreviewProps {\n preview: LinkPreviewData;\n /** Whether to show its image, and how; `\"off\"` by default (see LinkPreviewImages). */\n images?: LinkPreviewImages;\n /** Your image proxy, for `images: \"proxy\"`: the URL to load instead of the linked site's. */\n proxyUrl?: (url: string) => string | null | undefined;\n tone?: \"default\" | \"primary\";\n className?: string;\n}\n\nexport function ChatLinkPreview({ preview, images = \"off\", proxyUrl, tone = \"default\", className }: ChatLinkPreviewProps) {\n const [imageFailed, setImageFailed] = useState(false);\n if (preview.status !== \"ok\" || !isSafeHref(preview.url) || !isHttpsUrl(preview.url)) return null;\n let host = preview.url;\n try {\n host = new URL(preview.url).hostname.replace(/^www\\./, \"\");\n } catch {\n // shown as written\n }\n const image = imageFailed ? null : linkPreviewImageSrc(preview.imageUrl, images, proxyUrl);\n const title = preview.title?.trim() || host;\n const primary = tone === \"primary\";\n return (\n <a\n href={preview.url}\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n referrerPolicy=\"no-referrer\"\n className={cn(\n \"mt-1.5 flex w-[min(20rem,100%)] flex-col overflow-hidden rounded-lg border-l-4 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n primary ? \"border-primary-foreground/60 bg-primary-foreground/15\" : \"border-primary bg-background hover:bg-accent\",\n className,\n )}\n aria-label={`${title}, ${preview.siteName ?? host}. Open link`}\n data-testid=\"genesis-chat-link-preview\"\n >\n {image ? (\n <img\n src={image}\n alt=\"\"\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n onError={() => setImageFailed(true)}\n className=\"aspect-[1.91/1] w-full bg-muted object-cover\"\n data-testid=\"genesis-chat-link-preview-image\"\n />\n ) : null}\n <span className=\"flex flex-col gap-0.5 px-2.5 py-2\">\n <span className={cn(\"truncate text-[11px] uppercase tracking-wide\", primary ? \"text-primary-foreground/75\" : \"text-muted-foreground\")}>{preview.siteName ?? host}</span>\n <span className=\"line-clamp-2 text-sm font-semibold leading-snug\">{title}</span>\n {preview.description ? <span className={cn(\"line-clamp-2 text-xs\", primary ? \"text-primary-foreground/85\" : \"text-muted-foreground\")}>{preview.description}</span> : null}\n </span>\n </a>\n );\n}\n\nexport interface ChatAttachmentCardProps {\n title: string;\n subtitle?: string | null;\n /** An icon component (lucide); a clipboard by default. */\n icon?: ComponentType<{ className?: string }>;\n /** One button: a link (`href`, safe schemes only) or a handler. */\n action?: { label: string; href?: string; onPress?: () => void } | null;\n tone?: \"default\" | \"primary\";\n className?: string;\n}\n\n/** A card for an app's own attachment kind: an icon, a title, a subtitle and one action. */\nexport function ChatAttachmentCard({ title, subtitle, icon: Icon = ClipboardList, action, tone = \"default\", className }: ChatAttachmentCardProps) {\n const primary = tone === \"primary\";\n const href = action?.href && isSafeHref(action.href) ? action.href : null;\n return (\n <div\n className={cn(\"flex w-[min(20rem,100%)] items-center gap-3 rounded-lg p-2.5\", primary ? \"bg-primary-foreground/15\" : \"border bg-background\", className)}\n data-testid=\"genesis-chat-attachment-card\"\n >\n <span className={cn(\"flex size-10 shrink-0 items-center justify-center rounded-md\", primary ? \"bg-primary-foreground/20\" : \"bg-primary/10 text-primary\")}>\n <Icon className=\"size-5\" aria-hidden />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-semibold\">{title}</span>\n {subtitle ? <span className={cn(\"block truncate text-xs\", primary ? \"text-primary-foreground/80\" : \"text-muted-foreground\")}>{subtitle}</span> : null}\n </span>\n {action && (href || action.onPress) ? (\n href ? (\n <Button asChild size=\"sm\" variant={primary ? \"secondary\" : \"default\"} className=\"shrink-0\">\n <a href={href} target={/^https?:/i.test(href) ? \"_blank\" : undefined} rel=\"noopener noreferrer\">\n {action.label}\n {/^https?:/i.test(href) ? <ExternalLink aria-hidden /> : null}\n </a>\n </Button>\n ) : (\n <Button type=\"button\" size=\"sm\" variant={primary ? \"secondary\" : \"default\"} className=\"shrink-0\" onClick={action.onPress}>\n {action.label}\n </Button>\n )\n ) : null}\n </div>\n );\n}\n","/**\n * @feat:chat\n * `ChatErrorBoundary`: what one message (or one app attachment card) draws can't take the whole\n * thread down. Messages carry what other people sent, and app renderers get sender-controlled\n * data, so a render that throws shows its fallback instead, and the error goes to `onError`\n * (console.error by default) so it is never silent.\n */\nimport { Component, type ErrorInfo, type ReactNode } from \"react\";\n\nexport interface ChatErrorBoundaryProps {\n /** Drawn instead of the children once they throw. */\n fallback: ReactNode;\n /** Told about the error; console.error by default. */\n onError?: (error: unknown, info: ErrorInfo) => void;\n children: ReactNode;\n}\n\nexport class ChatErrorBoundary extends Component<ChatErrorBoundaryProps, { failed: boolean }> {\n override state = { failed: false };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo) {\n if (this.props.onError) this.props.onError(error, info);\n else console.error(\"genesis-chat: a message couldn't be drawn\", error);\n }\n\n override render() {\n return this.state.failed ? this.props.fallback : this.props.children;\n }\n}\n","/**\n * @feat:chat\n * Video on the web. Recording: `useVideoRecorder` (camera and microphone through\n * MediaRecorder, a live preview, a limit by role, retake) and `ChatVideoRecorder`, the\n * composer's dialog around it, which sends through the provider's `videoUpload` (a Mux direct\n * upload: PUT the recording, then send a pending video attachment) or, without it, as a file\n * to storage. Playback: `ChatVideoPlayer`, Mux HLS with native HLS where the browser has it\n * (Safari) and `hls.js`, loaded only then, elsewhere; \"Processing…\" while Mux works.\n */\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Circle, RotateCcw, SendHorizontal, Square, Video, VideoOff } from \"lucide-react\";\nimport {\n Alert,\n AlertDescription,\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Spinner,\n cn,\n} from \"@marktiderman/genesis-ui\";\nimport { fileExtension, formatDuration } from \"../core/media\";\nimport type { LocalFile } from \"../core/outbox\";\nimport type { AttachmentInput, SendInput } from \"../core/types\";\nimport type { ChatVideoUpload } from \"../react/index\";\n\n// ── Recording ─────────────────────────────────────────────────────────────────\n\nexport type VideoRecorderState = \"idle\" | \"requesting\" | \"previewing\" | \"recording\" | \"recorded\" | \"denied\" | \"unsupported\" | \"error\";\n\nexport interface VideoRecording {\n blob: Blob;\n /** Without codec parameters: `video/webm` or `video/mp4`. */\n contentType: string;\n name: string;\n durationMs: number;\n /** An object URL for playback before sending. */\n url: string | null;\n}\n\n/** MP4 where the browser records it (Safari, recent Chrome), else WebM. */\nexport function pickVideoMimeType(): string | null {\n if (typeof MediaRecorder === \"undefined\") return null;\n for (const type of [\"video/mp4;codecs=avc1,mp4a\", \"video/mp4\", \"video/webm;codecs=vp9,opus\", \"video/webm;codecs=vp8,opus\", \"video/webm\"]) {\n try {\n if (MediaRecorder.isTypeSupported(type)) return type;\n } catch {\n // Older browsers throw on unknown types.\n }\n }\n return \"\";\n}\n\nexport interface UseVideoRecorderOptions {\n /** It stops itself here (`recordingLimitMs(role)`). */\n maxMs: number;\n /** About every second while recording (to tell the others). */\n onTick?: () => void;\n}\n\nexport function useVideoRecorder({ maxMs, onTick }: UseVideoRecorderOptions) {\n const [state, setState] = useState<VideoRecorderState>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n const [elapsedMs, setElapsedMs] = useState(0);\n const [stream, setStream] = useState<MediaStream | null>(null);\n const [recording, setRecording] = useState<VideoRecording | null>(null);\n const recorder = useRef<MediaRecorder | null>(null);\n const chunks = useRef<Blob[]>([]);\n const startedAt = useRef(0);\n const timer = useRef<ReturnType<typeof setInterval> | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const urlRef = useRef<string | null>(null);\n // Bumped by reset (closing, unmounting): a camera that answers after that is turned off at once.\n const session = useRef(0);\n const tick = useRef(onTick);\n tick.current = onTick;\n\n const stopTimer = () => {\n if (timer.current) clearInterval(timer.current);\n timer.current = null;\n };\n const releaseUrl = () => {\n if (urlRef.current && typeof URL !== \"undefined\" && URL.revokeObjectURL) URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n };\n const stopStream = useCallback(() => {\n streamRef.current?.getTracks().forEach((t) => t.stop());\n streamRef.current = null;\n setStream(null);\n }, []);\n\n /** Asks for the camera and microphone and shows the preview. */\n const open = useCallback(async () => {\n if (typeof navigator === \"undefined\" || !navigator.mediaDevices?.getUserMedia || pickVideoMimeType() === null) {\n setState(\"unsupported\");\n setError(\"This browser can't record video.\");\n return false;\n }\n const token = session.current;\n setState(\"requesting\");\n setError(null);\n try {\n const s = await navigator.mediaDevices.getUserMedia({ video: { facingMode: \"user\", width: { ideal: 1280 }, height: { ideal: 720 } }, audio: true });\n if (token !== session.current) {\n // Closed (or unmounted, or opened again) while the browser asked: never keep this camera on.\n s.getTracks().forEach((t) => t.stop());\n return false;\n }\n if (streamRef.current && streamRef.current !== s) streamRef.current.getTracks().forEach((t) => t.stop());\n streamRef.current = s;\n setStream(s);\n setState(\"previewing\");\n return true;\n } catch (e) {\n if (token !== session.current) return false;\n const denied = e instanceof Error && (e.name === \"NotAllowedError\" || e.name === \"SecurityError\");\n setState(denied ? \"denied\" : \"error\");\n setError(denied ? \"Allow the camera and microphone in your browser's settings to record a video.\" : \"The camera couldn't start.\");\n return false;\n }\n }, []);\n\n const stop = useCallback(() => {\n const r = recorder.current;\n if (r && r.state !== \"inactive\") r.stop();\n }, []);\n\n const start = useCallback(async () => {\n if (!streamRef.current && !(await open())) return;\n const s = streamRef.current!;\n const mime = pickVideoMimeType() ?? \"\";\n let r: MediaRecorder;\n try {\n r = mime ? new MediaRecorder(s, { mimeType: mime, videoBitsPerSecond: 2_500_000 }) : new MediaRecorder(s);\n } catch {\n stopStream();\n setState(\"error\");\n setError(\"This browser can't record video.\");\n return;\n }\n r.onerror = () => {\n stopTimer();\n r.onstop = null;\n recorder.current = null;\n stopStream();\n setState(\"error\");\n setError(\"The recording stopped. Try again.\");\n };\n releaseUrl();\n setRecording(null);\n chunks.current = [];\n r.ondataavailable = (ev: BlobEvent) => {\n if (ev.data && ev.data.size > 0) chunks.current.push(ev.data);\n };\n r.onstop = () => {\n stopTimer();\n const durationMs = Date.now() - startedAt.current;\n const contentType = (r.mimeType || mime || \"video/webm\").split(\";\")[0]!.trim() || \"video/webm\";\n const blob = new Blob(chunks.current, { type: contentType });\n const url = typeof URL !== \"undefined\" && URL.createObjectURL ? URL.createObjectURL(blob) : null;\n urlRef.current = url;\n setRecording({ blob, contentType, name: `video-${Date.now()}.${fileExtension(\"\", contentType) || \"webm\"}`, durationMs, url });\n setState(\"recorded\");\n // The camera light goes off while you review it.\n stopStream();\n };\n recorder.current = r;\n startedAt.current = Date.now();\n setElapsedMs(0);\n r.start(1000);\n setState(\"recording\");\n timer.current = setInterval(() => {\n const ms = Date.now() - startedAt.current;\n setElapsedMs(ms);\n tick.current?.();\n if (ms >= maxMs) stop();\n }, 250);\n }, [maxMs, open, stop, stopStream]);\n\n /** Throws the take away and opens the camera again. */\n const retake = useCallback(async () => {\n releaseUrl();\n setRecording(null);\n setElapsedMs(0);\n await open();\n }, [open]);\n\n /**\n * The take's object URL now belongs to whoever it was handed to (the outbox frees it once the\n * message lands): reset no longer revokes it.\n */\n const handOff = useCallback(() => {\n urlRef.current = null;\n }, []);\n\n /** Stops everything and forgets the take. */\n const reset = useCallback(() => {\n session.current += 1;\n stopTimer();\n const r = recorder.current;\n if (r && r.state !== \"inactive\") {\n r.onstop = null;\n r.stop();\n }\n recorder.current = null;\n stopStream();\n releaseUrl();\n setRecording(null);\n setElapsedMs(0);\n setError(null);\n setState(\"idle\");\n }, [stopStream]);\n\n useEffect(() => () => reset(), [reset]);\n\n return { state, error, elapsedMs, maxMs, stream, recording, open, start, stop, retake, reset, handOff };\n}\n\nexport type VideoRecorder = ReturnType<typeof useVideoRecorder>;\n\n/** A recording as a file the outbox uploads to storage (the fallback without `videoUpload`). */\nexport function videoFile(rec: VideoRecording): LocalFile {\n return {\n data: rec.blob,\n name: rec.name,\n contentType: rec.contentType,\n previewUrl: rec.url ?? undefined,\n meta: { kind: \"video\", durationMs: rec.durationMs, bytes: rec.blob.size },\n };\n}\n\n/**\n * Uploads a recording through the app's `videoUpload` (a Mux direct upload: PUT the bytes to\n * the URL it returns) and gives back the attachment to send, pending until Mux's webhook marks\n * it ready.\n */\nexport async function uploadVideo(\n videoUpload: ChatVideoUpload,\n conversationId: string,\n rec: Pick<VideoRecording, \"blob\" | \"contentType\" | \"durationMs\" | \"name\">,\n fetchImpl: typeof fetch = fetch,\n signal?: AbortSignal,\n): Promise<AttachmentInput> {\n const upload = await videoUpload.create(conversationId);\n signal?.throwIfAborted?.();\n const res = await fetchImpl(upload.url, { method: \"PUT\", body: rec.blob, headers: { \"Content-Type\": rec.contentType }, signal });\n if (!res.ok) throw new Error(`The video didn't upload (${res.status})`);\n return {\n kind: \"video\",\n provider: upload.provider,\n providerId: upload.providerId,\n status: \"pending\",\n name: rec.name,\n mime: rec.contentType,\n bytes: rec.blob.size,\n durationMs: rec.durationMs,\n };\n}\n\nexport interface ChatVideoRecorderProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n conversationId: string;\n maxMs: number;\n /** From useConversation: sends through the outbox. */\n send: (input: Omit<SendInput, \"conversationId\" | \"clientId\">, files?: LocalFile[]) => Promise<unknown>;\n /** Merged into what's sent (a reply, a topic, an internal note). */\n extra?: Omit<SendInput, \"conversationId\" | \"clientId\" | \"attachments\" | \"body\">;\n videoUpload?: ChatVideoUpload;\n onTick?: () => void;\n onSent?: () => void;\n /** For tests. */\n fetchImpl?: typeof fetch;\n}\n\nfunction Preview({ stream }: { stream: MediaStream | null }) {\n const ref = useRef<HTMLVideoElement>(null);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n try {\n (el as HTMLVideoElement & { srcObject: MediaStream | null }).srcObject = stream;\n } catch {\n // happy-dom and old engines\n }\n }, [stream]);\n return <video ref={ref} autoPlay muted playsInline className=\"h-full w-full -scale-x-100 object-cover\" aria-label=\"Camera preview\" data-testid=\"genesis-chat-video-preview\" />;\n}\n\n/** The composer's video dialog: preview, record (to the role's limit), review, retake, send. */\nexport function ChatVideoRecorder({ open, onOpenChange, conversationId, maxMs, send, extra, videoUpload, onTick, onSent, fetchImpl }: ChatVideoRecorderProps) {\n const rec = useVideoRecorder({ maxMs, onTick });\n const [sending, setSending] = useState(false);\n const [sendError, setSendError] = useState<string | null>(null);\n const upload = useRef<AbortController | null>(null);\n const { open: openCamera, reset } = rec;\n\n useEffect(() => {\n if (open) void openCamera();\n else reset();\n }, [open, openCamera, reset]);\n // Closing or unmounting stops an upload still going.\n useEffect(() => () => upload.current?.abort(), []);\n\n const submit = async () => {\n const take = rec.recording;\n if (!take || upload.current) return;\n const controller = new AbortController();\n upload.current = controller;\n setSending(true);\n setSendError(null);\n try {\n if (videoUpload) {\n const attachment = await uploadVideo(videoUpload, conversationId, take, fetchImpl, controller.signal);\n if (controller.signal.aborted) return;\n await send({ ...extra, body: \"\", attachments: [attachment] });\n } else {\n // The outbox shows the take while it uploads and frees its URL once it lands.\n await send({ ...extra, body: \"\" }, [videoFile(take)]);\n rec.handOff();\n }\n onSent?.();\n onOpenChange(false);\n } catch (e) {\n if (!controller.signal.aborted) setSendError(e instanceof Error ? e.message : \"The video didn't send\");\n } finally {\n upload.current = null;\n setSending(false);\n }\n };\n\n /** Closing while it uploads cancels the upload. */\n const close = (o: boolean) => {\n if (!o) upload.current?.abort();\n onOpenChange(o);\n };\n\n const recording = rec.state === \"recording\";\n return (\n <Dialog open={open} onOpenChange={close}>\n <DialogContent className=\"sm:max-w-lg\" data-testid=\"genesis-chat-video-recorder\">\n <DialogHeader>\n <DialogTitle>Record a video</DialogTitle>\n <DialogDescription>Up to {formatDuration(maxMs)}. You can watch it before you send it.</DialogDescription>\n </DialogHeader>\n {rec.error ? (\n <Alert variant=\"destructive\">\n <VideoOff className=\"size-4\" aria-hidden />\n <AlertDescription>{rec.error}</AlertDescription>\n </Alert>\n ) : null}\n <div className=\"relative aspect-video w-full overflow-hidden rounded-lg bg-muted\">\n {rec.state === \"recorded\" && rec.recording?.url ? (\n // eslint-disable-next-line jsx-a11y/media-has-caption -- your own recording, reviewed before sending\n <video src={rec.recording.url} controls playsInline className=\"h-full w-full object-contain\" aria-label=\"Your recording\" data-testid=\"genesis-chat-video-review\" />\n ) : rec.stream ? (\n <Preview stream={rec.stream} />\n ) : (\n <span className=\"absolute inset-0 flex items-center justify-center\">\n {rec.state === \"requesting\" ? <Spinner aria-label=\"Starting the camera\" /> : <Video className=\"size-8 text-muted-foreground\" aria-hidden />}\n </span>\n )}\n {recording ? (\n <span className=\"absolute left-2 top-2 flex items-center gap-1.5 rounded-full bg-background/85 px-2 py-0.5 text-xs font-medium tabular-nums\" role=\"timer\" aria-live=\"off\">\n <span className=\"size-2 animate-pulse rounded-full bg-destructive\" aria-hidden />\n {formatDuration(rec.elapsedMs)} / {formatDuration(maxMs)}\n </span>\n ) : null}\n {sending ? (\n <span className=\"absolute inset-0 flex flex-col items-center justify-center gap-2 bg-background/70 text-sm font-medium\" role=\"status\">\n <Spinner /> Uploading…\n {videoUpload ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => upload.current?.abort()} data-testid=\"genesis-chat-video-cancel-upload\">\n Cancel upload\n </Button>\n ) : null}\n </span>\n ) : null}\n </div>\n <div className=\"sr-only\" role=\"status\">\n {recording ? \"Recording\" : rec.state === \"recorded\" ? \"Recorded. Watch it, retake it or send it.\" : \"\"}\n </div>\n {sendError ? (\n <p className=\"text-sm text-destructive\" role=\"alert\">\n {sendError}\n </p>\n ) : null}\n <div className=\"flex items-center justify-center gap-3\">\n {rec.state === \"recorded\" ? (\n <>\n <Button type=\"button\" variant=\"outline\" onClick={() => void rec.retake()} disabled={sending} data-testid=\"genesis-chat-video-retake\">\n <RotateCcw /> Retake\n </Button>\n <Button type=\"button\" onClick={() => void submit()} loading={sending} data-testid=\"genesis-chat-video-send\">\n <SendHorizontal /> Send video\n </Button>\n </>\n ) : recording ? (\n <Button type=\"button\" variant=\"destructive\" className=\"rounded-full\" onClick={rec.stop} aria-label=\"Stop recording\" data-testid=\"genesis-chat-video-stop\">\n <Square className=\"fill-current\" /> Stop\n </Button>\n ) : (\n <Button\n type=\"button\"\n className=\"rounded-full\"\n onClick={() => void rec.start()}\n disabled={rec.state === \"requesting\" || rec.state === \"unsupported\"}\n aria-label=\"Start recording\"\n data-testid=\"genesis-chat-video-record\"\n >\n <Circle className=\"fill-destructive text-destructive\" /> Record\n </Button>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\n// ── Playback ──────────────────────────────────────────────────────────────────\n\nexport const muxStreamUrl = (playbackId: string) => `https://stream.mux.com/${encodeURIComponent(playbackId)}.m3u8`;\nexport const muxPosterUrl = (playbackId: string) => `https://image.mux.com/${encodeURIComponent(playbackId)}/thumbnail.jpg`;\n\nexport interface ChatVideoPlayerProps {\n /** A file URL (storage), when there is no playback id. */\n src?: string | null;\n /** Mux's playback id: streamed as HLS. */\n playbackId?: string | null;\n poster?: string | null;\n /** Mux is still working on it. */\n processing?: boolean;\n failed?: boolean;\n /** Still uploading from this device. */\n uploading?: boolean;\n label?: string;\n className?: string;\n}\n\ntype HlsLike = { loadSource(url: string): void; attachMedia(el: HTMLMediaElement): void; destroy(): void };\n\n/** Plays a chat video: Mux HLS (native, else hls.js loaded on demand), or a file. */\nexport function ChatVideoPlayer({ src, playbackId, poster, processing, failed, uploading, label, className }: ChatVideoPlayerProps) {\n const ref = useRef<HTMLVideoElement>(null);\n const [hlsFailed, setHlsFailed] = useState(false);\n const stream = playbackId ? muxStreamUrl(playbackId) : null;\n\n useEffect(() => {\n const el = ref.current;\n if (!el || !stream) return;\n if (typeof el.canPlayType === \"function\" && el.canPlayType(\"application/vnd.apple.mpegurl\")) {\n el.src = stream;\n return;\n }\n let hls: HlsLike | null = null;\n let cancelled = false;\n import(\"hls.js\")\n .then((mod) => {\n const Hls = (mod as unknown as { default: { isSupported(): boolean; new (): HlsLike } }).default;\n if (cancelled) return;\n if (!Hls?.isSupported?.()) {\n setHlsFailed(true);\n return;\n }\n hls = new Hls();\n hls.loadSource(stream);\n hls.attachMedia(el);\n })\n .catch(() => {\n // hls.js is an optional peer: without it, browsers lacking native HLS can't stream.\n if (!cancelled) setHlsFailed(true);\n });\n return () => {\n cancelled = true;\n hls?.destroy();\n };\n }, [stream]);\n\n const posterUrl = poster ?? (playbackId ? muxPosterUrl(playbackId) : null);\n if (failed) {\n return (\n <div className={cn(\"flex aspect-video w-[min(20rem,100%)] items-center justify-center gap-2 rounded-xl bg-muted text-sm text-muted-foreground\", className)} data-testid=\"genesis-chat-video-failed\">\n <VideoOff className=\"size-4\" aria-hidden /> This video couldn't be processed\n </div>\n );\n }\n if (processing && !playbackId) {\n return (\n <div className={cn(\"flex aspect-video w-[min(20rem,100%)] flex-col items-center justify-center gap-2 rounded-xl bg-muted text-sm text-muted-foreground\", className)} role=\"status\" data-testid=\"genesis-chat-video-processing\">\n <Spinner size=\"sm\" /> Processing…\n </div>\n );\n }\n return (\n <div className={cn(\"relative w-[min(20rem,100%)] overflow-hidden rounded-xl bg-muted\", className)} data-testid=\"genesis-chat-video\">\n {stream || src ? (\n // eslint-disable-next-line jsx-a11y/media-has-caption -- transcripts come from the provider's captions\n <video\n ref={ref}\n controls\n playsInline\n preload=\"metadata\"\n poster={posterUrl ?? undefined}\n src={stream ? undefined : (src ?? undefined)}\n className=\"block max-h-80 w-full\"\n aria-label={label ?? \"Video\"}\n data-testid={stream ? \"genesis-chat-video-hls\" : undefined}\n />\n ) : (\n <span className=\"block aspect-video w-full animate-pulse bg-muted\" />\n )}\n {hlsFailed ? <span className=\"absolute inset-x-0 bottom-0 bg-background/85 px-2 py-1 text-xs\">This browser can't stream this video.</span> : null}\n {uploading ? (\n <span className=\"absolute inset-0 flex items-center justify-center bg-background/40\" role=\"status\" aria-label=\"Uploading\">\n <Spinner size=\"sm\" className=\"text-foreground\" />\n </span>\n ) : null}\n </div>\n );\n}\n","/**\n * @feat:chat\n * A voice note: play and pause, a waveform that fills as it plays and seeks\n * where you click, the time, a 1× / 1.5× / 2× speed toggle, and the\n * transcript when there is one. Only one voice note plays at a time.\n */\nimport { useEffect, useRef, useState, type KeyboardEvent, type MouseEvent } from \"react\";\nimport { Pause, Play } from \"lucide-react\";\nimport { Button, Collapsible, CollapsibleContent, CollapsibleTrigger, cn } from \"@marktiderman/genesis-ui\";\nimport { formatDuration, nextPlaybackRate } from \"../core/media\";\n\n/** The one playing now, paused when another starts. */\nlet playing: HTMLAudioElement | null = null;\n\nexport interface VoiceNoteProps {\n /** The audio's (signed) URL; while it loads the waveform still draws. */\n src: string | null | undefined;\n durationMs?: number | null;\n /** Peaks 0–100. */\n waveform?: number[] | null;\n transcript?: string | null;\n transcriptStatus?: \"pending\" | \"ready\" | \"failed\" | \"off\" | null;\n /** On the primary (own) bubble. */\n tone?: \"default\" | \"primary\";\n className?: string;\n}\n\nconst BARS = 48;\n\nfunction resample(peaks: number[] | null | undefined, n = BARS): number[] {\n if (!peaks || peaks.length === 0) return new Array(n).fill(12);\n if (peaks.length === n) return peaks;\n return Array.from({ length: n }, (_, i) => peaks[Math.min(peaks.length - 1, Math.floor((i / n) * peaks.length))] ?? 0);\n}\n\nexport function VoiceNote({ src, durationMs, waveform, transcript, transcriptStatus, tone = \"default\", className }: VoiceNoteProps) {\n const audio = useRef<HTMLAudioElement | null>(null);\n const [isPlaying, setPlaying] = useState(false);\n const [current, setCurrent] = useState(0);\n const [duration, setDuration] = useState((durationMs ?? 0) / 1000);\n const [rate, setRate] = useState(1);\n const bars = resample(waveform);\n const progress = duration > 0 ? Math.min(1, current / duration) : 0;\n\n useEffect(() => {\n const el = audio.current;\n if (!el) return;\n const onPlay = () => {\n if (playing && playing !== el) playing.pause();\n playing = el;\n setPlaying(true);\n };\n const onPause = () => {\n if (playing === el) playing = null;\n setPlaying(false);\n };\n const onTime = () => setCurrent(el.currentTime);\n const onMeta = () => {\n if (Number.isFinite(el.duration) && el.duration > 0) setDuration(el.duration);\n };\n const onEnded = () => {\n setPlaying(false);\n setCurrent(0);\n };\n el.addEventListener(\"play\", onPlay);\n el.addEventListener(\"pause\", onPause);\n el.addEventListener(\"timeupdate\", onTime);\n el.addEventListener(\"loadedmetadata\", onMeta);\n el.addEventListener(\"durationchange\", onMeta);\n el.addEventListener(\"ended\", onEnded);\n return () => {\n el.removeEventListener(\"play\", onPlay);\n el.removeEventListener(\"pause\", onPause);\n el.removeEventListener(\"timeupdate\", onTime);\n el.removeEventListener(\"loadedmetadata\", onMeta);\n el.removeEventListener(\"durationchange\", onMeta);\n el.removeEventListener(\"ended\", onEnded);\n if (playing === el) playing = null;\n };\n }, []);\n\n useEffect(() => {\n if (audio.current) audio.current.playbackRate = rate;\n }, [rate]);\n\n const toggle = () => {\n const el = audio.current;\n if (!el || !src) return;\n if (el.paused) {\n el.playbackRate = rate;\n void Promise.resolve(el.play?.()).catch(() => setPlaying(false));\n } else el.pause();\n };\n\n const seekTo = (fraction: number) => {\n const el = audio.current;\n const f = Math.max(0, Math.min(1, fraction));\n if (el && duration > 0) {\n el.currentTime = f * duration;\n setCurrent(f * duration);\n }\n };\n\n const onBarsClick = (e: MouseEvent<HTMLDivElement>) => {\n const box = e.currentTarget.getBoundingClientRect();\n if (box.width > 0) seekTo((e.clientX - box.left) / box.width);\n };\n\n // The waveform is a slider drawn as bars: Radix Slider draws a track and a\n // thumb, not a waveform, so the role and keys are written here (arrows ±5 s,\n // Home/End), on one focusable element.\n const onBarsKey = (e: KeyboardEvent<HTMLDivElement>) => {\n if (duration <= 0) return;\n const step = 5 / duration;\n const keys: Record<string, number> = { ArrowRight: progress + step, ArrowUp: progress + step, ArrowLeft: progress - step, ArrowDown: progress - step, Home: 0, End: 1 };\n if (e.key in keys) {\n e.preventDefault();\n seekTo(keys[e.key]!);\n }\n };\n\n const shown = isPlaying || current > 0 ? current * 1000 : duration * 1000;\n const primary = tone === \"primary\";\n\n return (\n <div className={cn(\"flex min-w-[220px] max-w-full flex-col gap-1\", className)} data-testid=\"genesis-chat-voice\">\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n size=\"icon\"\n variant={primary ? \"secondary\" : \"default\"}\n className=\"h-9 w-9 shrink-0 rounded-full\"\n onClick={toggle}\n disabled={!src}\n aria-label={isPlaying ? \"Pause voice message\" : \"Play voice message\"}\n data-testid=\"genesis-chat-voice-play\"\n >\n {isPlaying ? <Pause /> : <Play />}\n </Button>\n <div\n role=\"slider\"\n tabIndex={0}\n aria-label=\"Position\"\n aria-valuemin={0}\n aria-valuemax={Math.round(duration)}\n aria-valuenow={Math.round(current)}\n aria-valuetext={`${formatDuration(current * 1000)} of ${formatDuration(duration * 1000)}`}\n className=\"flex h-8 flex-1 cursor-pointer items-center gap-[2px] rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={onBarsClick}\n onKeyDown={onBarsKey}\n >\n {bars.map((peak, i) => (\n <span\n key={i}\n aria-hidden\n className={cn(\n \"w-[3px] flex-1 rounded-full transition-colors\",\n (i + 0.5) / bars.length <= progress\n ? primary\n ? \"bg-primary-foreground\"\n : \"bg-primary\"\n : primary\n ? \"bg-primary-foreground/40\"\n : \"bg-muted-foreground/40\",\n )}\n style={{ height: `${Math.max(12, peak)}%` }}\n />\n ))}\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className={cn(\"h-7 shrink-0 rounded-full px-2 text-xs tabular-nums\", primary && \"text-primary-foreground hover:bg-primary-foreground/15 hover:text-primary-foreground\")}\n onClick={() => setRate((r) => nextPlaybackRate(r))}\n aria-label={`Playback speed ${rate}×`}\n data-testid=\"genesis-chat-voice-rate\"\n >\n {rate}×\n </Button>\n </div>\n <div className={cn(\"pl-11 text-xs tabular-nums\", primary ? \"text-primary-foreground/80\" : \"text-muted-foreground\")}>{formatDuration(shown)}</div>\n {transcriptStatus === \"pending\" ? (\n <div className={cn(\"pl-11 text-xs italic\", primary ? \"text-primary-foreground/80\" : \"text-muted-foreground\")}>Transcribing…</div>\n ) : transcript ? (\n <Collapsible className=\"pl-11\">\n <CollapsibleTrigger className={cn(\"text-xs font-medium underline-offset-2 hover:underline\", primary ? \"text-primary-foreground\" : \"text-primary\")}>\n Transcript\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pt-1 text-sm\">{transcript}</CollapsibleContent>\n </Collapsible>\n ) : null}\n {/* eslint-disable-next-line jsx-a11y/media-has-caption -- the transcript above is the caption */}\n <audio ref={audio} src={src ?? undefined} preload=\"metadata\" className=\"hidden\" />\n </div>\n );\n}\n","/**\n * @feat:chat\n * What a message carries: photos in a grid of up to four with a lightbox,\n * voice notes, videos, files as a chip, links, and the app's own kinds (a\n * form, a lesson) through the `attachment` slot, a generic card by default.\n * Pending uploads draw from their local previews with a spinner.\n */\nimport { useCallback, useState, type ComponentType, type KeyboardEvent } from \"react\";\nimport { ChevronLeft, ChevronRight, Download, FileText, Link2, Paperclip } from \"lucide-react\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n Spinner,\n VisuallyHidden,\n cn,\n} from \"@marktiderman/genesis-ui\";\nimport type { ChatAttachment, ChatMessage } from \"../core/types\";\nimport type { ChatAttachmentKind } from \"../react/index\";\nimport { ChatAttachmentCard, type ChatAttachmentCardProps } from \"./cards\";\nimport { ChatErrorBoundary } from \"./error-boundary\";\nimport { formatBytes } from \"./format\";\nimport { isSafeHref } from \"./markdown\";\nimport { ChatVideoPlayer } from \"./video\";\nimport { VoiceNote } from \"./voice-note\";\n\n/** One attachment as the renderers draw it, sent or still uploading. */\nexport interface AttachmentView {\n key: string;\n kind: string;\n /** Signed URL, or the local preview while uploading. */\n url: string | null;\n posterUrl: string | null;\n name: string | null;\n mime: string | null;\n bytes: number | null;\n width: number | null;\n height: number | null;\n durationMs: number | null;\n waveform: number[] | null;\n transcript: string | null;\n transcriptStatus: ChatAttachment[\"transcriptStatus\"];\n /** Still uploading (or the server says it is still processing). */\n pending: boolean;\n /** The stored attachment; absent while it uploads. */\n attachment?: ChatAttachment;\n}\n\n/** Props the `attachment` slot receives, for kinds the package doesn't draw (form, lesson…). */\nexport interface ChatAttachmentSlotProps {\n attachment: ChatAttachment;\n message: ChatMessage;\n /** Its signed URL when it has a file. */\n url: string | null;\n mine: boolean;\n}\n\nexport const BUILT_IN_KINDS = new Set([\"image\", \"voice\", \"video\", \"file\", \"link\"]);\n\nexport function toAttachmentView(a: ChatAttachment, urls: Record<string, string>): AttachmentView {\n return {\n key: a.id,\n kind: a.kind,\n url: (a.path ? urls[a.path] : null) ?? (a.provider === \"external\" ? a.url : null) ?? (a.kind === \"link\" ? a.url : null),\n posterUrl: a.posterPath ? (urls[a.posterPath] ?? null) : null,\n name: a.name,\n mime: a.mime,\n bytes: a.bytes,\n width: a.width,\n height: a.height,\n durationMs: a.durationMs,\n waveform: a.waveform,\n transcript: a.transcript,\n transcriptStatus: a.transcriptStatus,\n pending: a.status === \"pending\",\n attachment: a,\n };\n}\n\n/** Generic card for an app's own kind, when no `attachment` slot is given. */\nexport function GenericAttachment({ attachment, url }: ChatAttachmentSlotProps) {\n const label = attachment.name ?? attachment.kind.charAt(0).toUpperCase() + attachment.kind.slice(1);\n const body = (\n <>\n <Paperclip className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium\">{label}</span>\n <span className=\"block text-xs capitalize text-muted-foreground\">{attachment.kind}</span>\n </span>\n </>\n );\n return url && isSafeHref(url) ? (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"flex items-center gap-2 rounded-lg border bg-background p-2 text-foreground hover:bg-accent\">\n {body}\n </a>\n ) : (\n <div className=\"flex items-center gap-2 rounded-lg border bg-background p-2 text-foreground\">{body}</div>\n );\n}\n\nfunction Uploading({ className }: { className?: string }) {\n return (\n <span className={cn(\"absolute inset-0 flex items-center justify-center bg-background/40\", className)} aria-label=\"Uploading\" role=\"status\">\n <Spinner size=\"sm\" className=\"text-foreground\" />\n </span>\n );\n}\n\nexport interface ImageGridProps {\n images: AttachmentView[];\n className?: string;\n}\n\n/** Up to four photos in a grid (a \"+N\" on the fourth for more), opening a lightbox. */\nexport function ImageGrid({ images, className }: ImageGridProps) {\n const [open, setOpen] = useState<number | null>(null);\n const shown = images.slice(0, 4);\n const more = images.length - shown.length;\n const cols = shown.length === 1 ? \"grid-cols-1\" : \"grid-cols-2\";\n return (\n <>\n <div className={cn(\"grid w-[min(18rem,100%)] gap-1 overflow-hidden rounded-xl\", cols, className)} data-testid=\"genesis-chat-images\">\n {shown.map((img, i) => {\n const tall = shown.length === 3 && i === 0;\n return (\n <button\n key={img.key}\n type=\"button\"\n className={cn(\n \"relative block overflow-hidden bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n shown.length === 1 ? \"max-h-80\" : \"aspect-square\",\n tall && \"row-span-2 aspect-auto\",\n )}\n onClick={() => setOpen(i)}\n aria-label={`Open photo${img.name ? ` ${img.name}` : \"\"}`}\n >\n {img.url ? (\n <img\n src={img.url}\n alt={img.name ?? \"Photo\"}\n loading=\"lazy\"\n className={cn(\"h-full w-full object-cover\", img.pending && \"opacity-70\")}\n width={img.width ?? undefined}\n height={img.height ?? undefined}\n />\n ) : (\n <span className=\"block h-full min-h-24 w-full animate-pulse bg-muted\" />\n )}\n {img.pending ? <Uploading /> : null}\n {more > 0 && i === shown.length - 1 ? (\n <span className=\"absolute inset-0 flex items-center justify-center bg-foreground/50 text-xl font-semibold text-background\">+{more}</span>\n ) : null}\n </button>\n );\n })}\n </div>\n <Lightbox images={images} index={open} onIndexChange={setOpen} />\n </>\n );\n}\n\nexport interface LightboxProps {\n images: AttachmentView[];\n /** The photo shown; null closes it. */\n index: number | null;\n onIndexChange: (index: number | null) => void;\n}\n\n/** A photo full size, with the previous and next ones on the arrow keys. */\nexport function Lightbox({ images, index, onIndexChange }: LightboxProps) {\n const img = index === null ? null : images[index];\n const go = useCallback(\n (delta: number) => {\n if (index === null || images.length < 2) return;\n onIndexChange((index + delta + images.length) % images.length);\n },\n [images.length, index, onIndexChange],\n );\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"ArrowRight\") {\n e.preventDefault();\n go(1);\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n go(-1);\n }\n };\n return (\n <Dialog open={img != null} onOpenChange={(o) => !o && onIndexChange(null)}>\n <DialogContent className=\"max-w-[min(64rem,95vw)] border-0 bg-background p-2\" onKeyDown={onKey} data-testid=\"genesis-chat-lightbox\">\n <VisuallyHidden>\n <DialogTitle>{img?.name ?? \"Photo\"}</DialogTitle>\n <DialogDescription>\n Photo {index === null ? 0 : index + 1} of {images.length}. Use the arrow keys for the others.\n </DialogDescription>\n </VisuallyHidden>\n {img?.url ? <img src={img.url} alt={img.name ?? \"Photo\"} className=\"mx-auto max-h-[80vh] w-auto rounded-md object-contain\" /> : null}\n {images.length > 1 ? (\n <div className=\"flex items-center justify-between gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" onClick={() => go(-1)} aria-label=\"Previous photo\">\n <ChevronLeft />\n </Button>\n <span className=\"text-sm tabular-nums text-muted-foreground\">\n {(index ?? 0) + 1} / {images.length}\n </span>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" onClick={() => go(1)} aria-label=\"Next photo\">\n <ChevronRight />\n </Button>\n </div>\n ) : null}\n </DialogContent>\n </Dialog>\n );\n}\n\n/** A video: a hosted one (Mux) streams once ready and says \"Processing…\" until then; a file plays from storage. */\nexport function VideoAttachment({ view }: { view: AttachmentView }) {\n const a = view.attachment;\n const hosted = a != null && a.provider !== \"storage\" && a.provider !== \"external\" && a.provider !== \"none\";\n return (\n <ChatVideoPlayer\n src={hosted ? null : view.url}\n playbackId={hosted ? a.playbackId : null}\n poster={view.posterUrl}\n processing={hosted && a.status === \"pending\"}\n failed={a?.status === \"failed\"}\n uploading={!a && view.pending}\n label={view.name ?? \"Video\"}\n />\n );\n}\n\nexport function FileChip({ view, tone = \"default\" }: { view: AttachmentView; tone?: \"default\" | \"primary\" }) {\n const primary = tone === \"primary\";\n const ext = (view.name?.split(\".\").pop() ?? \"\").toUpperCase();\n return (\n <div\n className={cn(\"flex w-[min(18rem,100%)] items-center gap-2 rounded-lg p-2\", primary ? \"bg-primary-foreground/15\" : \"border bg-background\")}\n data-testid=\"genesis-chat-file\"\n >\n <span className={cn(\"relative flex size-9 shrink-0 items-center justify-center rounded-md\", primary ? \"bg-primary-foreground/20\" : \"bg-muted\")}>\n {view.pending ? <Spinner size=\"sm\" className={primary ? \"text-primary-foreground\" : undefined} /> : <FileText className=\"size-4\" aria-hidden />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium\">{view.name ?? \"File\"}</span>\n <span className={cn(\"block text-xs\", primary ? \"text-primary-foreground/80\" : \"text-muted-foreground\")}>\n {[ext, formatBytes(view.bytes)].filter(Boolean).join(\" · \")}\n {view.pending ? \" · Uploading…\" : \"\"}\n </span>\n </span>\n {view.url && !view.pending ? (\n <Button\n asChild\n size=\"icon\"\n variant=\"ghost\"\n className={cn(\"size-8 shrink-0\", primary && \"text-primary-foreground hover:bg-primary-foreground/15 hover:text-primary-foreground\")}\n >\n <a href={view.url} download={view.name ?? true} target=\"_blank\" rel=\"noopener noreferrer\" aria-label={`Download ${view.name ?? \"file\"}`}>\n <Download />\n </a>\n </Button>\n ) : null}\n </div>\n );\n}\n\nfunction LinkAttachment({ view, tone }: { view: AttachmentView; tone: \"default\" | \"primary\" }) {\n if (!view.url || !isSafeHref(view.url)) return null;\n let host = view.url;\n try {\n host = new URL(view.url).host;\n } catch {\n // shown as written\n }\n return (\n <a\n href={view.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\"flex w-[min(18rem,100%)] items-center gap-2 rounded-lg p-2\", tone === \"primary\" ? \"bg-primary-foreground/15\" : \"border bg-background hover:bg-accent\")}\n >\n <Link2 className=\"size-4 shrink-0\" aria-hidden />\n <span className=\"min-w-0\">\n <span className=\"block truncate text-sm font-medium\">{view.name ?? host}</span>\n <span className=\"block truncate text-xs opacity-80\">{host}</span>\n </span>\n </a>\n );\n}\n\n/** The app's kind for this name: its own key only (never `constructor` from the prototype), with a `title` function. */\nexport function attachmentKindOf(kinds: Record<string, ChatAttachmentKind> | undefined, kind: string): ChatAttachmentKind | null {\n if (!kinds || !Object.prototype.hasOwnProperty.call(kinds, kind)) return null;\n const k = kinds[kind];\n return k && typeof k.title === \"function\" ? k : null;\n}\n\n/**\n * What the app's kind says to draw for this attachment, or null when its functions throw or\n * return the wrong shapes (the attachment's `ref` is whatever the sender put there).\n */\nexport function attachmentCardOf(k: ChatAttachmentKind, a: ChatAttachment): Pick<ChatAttachmentCardProps, \"title\" | \"subtitle\" | \"action\"> | null {\n try {\n const title = k.title(a);\n if (typeof title !== \"string\") return null;\n const sub = typeof k.subtitle === \"function\" ? k.subtitle(a) : null;\n const act = typeof k.action === \"function\" ? k.action(a) : null;\n const action =\n act && typeof act === \"object\" && typeof act.label === \"string\" && (typeof act.href === \"string\" || typeof act.onPress === \"function\")\n ? { label: act.label, href: typeof act.href === \"string\" ? act.href : undefined, onPress: typeof act.onPress === \"function\" ? act.onPress : undefined }\n : null;\n return { title, subtitle: typeof sub === \"string\" ? sub : null, action };\n } catch (e) {\n console.error(`genesis-chat: the \"${a.kind}\" card couldn't be drawn`, e);\n return null;\n }\n}\n\nexport interface MessageAttachmentsProps {\n views: AttachmentView[];\n message?: ChatMessage;\n mine: boolean;\n tone: \"default\" | \"primary\";\n /** For kinds the package doesn't draw; a generic card by default. */\n slot?: ComponentType<ChatAttachmentSlotProps> | null;\n /** Cards for registered app kinds (ChatProvider `attachmentKinds`), drawn before the slot. */\n kinds?: Record<string, ChatAttachmentKind>;\n}\n\n/** Every attachment of one message, photos grouped into one grid. */\nexport function MessageAttachments({ views, message, mine, tone, slot, kinds }: MessageAttachmentsProps) {\n if (views.length === 0) return null;\n const images = views.filter((v) => v.kind === \"image\");\n const others = views.filter((v) => v.kind !== \"image\");\n const Custom = slot === undefined ? GenericAttachment : slot;\n return (\n <div className=\"flex flex-col gap-1.5\">\n {images.length ? <ImageGrid images={images} /> : null}\n {others.map((v) => {\n switch (v.kind) {\n case \"voice\":\n return (\n <VoiceNote\n key={v.key}\n src={v.url}\n durationMs={v.durationMs}\n waveform={v.waveform}\n transcript={v.transcript}\n transcriptStatus={v.transcriptStatus}\n tone={tone}\n />\n );\n case \"video\":\n return <VideoAttachment key={v.key} view={v} />;\n case \"file\":\n return <FileChip key={v.key} view={v} tone={tone} />;\n case \"link\":\n return <LinkAttachment key={v.key} view={v} tone={tone} />;\n default:\n if (!v.attachment || !message) return <FileChip key={v.key} view={v} tone={tone} />;\n const generic = <GenericAttachment attachment={v.attachment} message={message} url={v.url} mine={mine} />;\n const k = attachmentKindOf(kinds, v.kind);\n if (k) {\n const card = attachmentCardOf(k, v.attachment);\n return card ? <ChatAttachmentCard key={v.key} {...card} tone={tone} /> : <GenericAttachment key={v.key} attachment={v.attachment} message={message} url={v.url} mine={mine} />;\n }\n // The app's slot draws sender-controlled data: if it throws, the generic card stands in.\n return Custom ? (\n <ChatErrorBoundary key={v.key} fallback={generic}>\n <Custom attachment={v.attachment} message={message} url={v.url} mine={mine} />\n </ChatErrorBoundary>\n ) : null;\n }\n })}\n </div>\n );\n}\n","/**\n * @feat:chat\n * The full emoji picker, on frimousse (headless, MIT): a search box, every emoji by category\n * in a virtualised grid, keyboard navigation and screen-reader labels from frimousse, styled\n * here with Genesis tokens. Used for reactions (\"+\" beside the quick six) and in the composer.\n * The emoji data loads from `emojibaseUrl`, which the app must give: host the `emojibase-data`\n * package's `<locale>/data.json` and `<locale>/messages.json` (or name a CDN you accept, and add\n * it to your CSP's `connect-src`). Without it the picker loads nothing from anywhere, says so,\n * and the thread and composer don't offer it (the quick reactions still work). frimousse's own\n * default would be jsDelivr's unpinned `emojibase-data@latest`, a third party seeing every\n * reader's IP, so it is never used.\n */\nimport { EmojiPicker } from \"frimousse\";\nimport { Spinner, cn } from \"@marktiderman/genesis-ui\";\n\n/** The picker can load: an emojibase URL was given. */\nexport const canPickEmoji = (emojibaseUrl: string | null | undefined): emojibaseUrl is string => Boolean(emojibaseUrl?.trim());\n\nexport interface ChatEmojiPickerProps {\n onSelect: (emoji: string) => void;\n /** Where the Emojibase data is fetched from (`${emojibaseUrl}/en/data.json`). Required to load anything. */\n emojibaseUrl?: string;\n locale?: \"en\";\n columns?: number;\n className?: string;\n}\n\nexport function ChatEmojiPicker({ onSelect, emojibaseUrl, locale, columns = 8, className }: ChatEmojiPickerProps) {\n if (!canPickEmoji(emojibaseUrl)) {\n if (typeof console !== \"undefined\") console.warn(\"genesis-chat: ChatEmojiPicker needs `emojibaseUrl` (self-hosted emojibase-data); it loads nothing without it.\");\n return (\n <p className={cn(\"w-[18.5rem] p-3 text-sm text-muted-foreground\", className)} role=\"note\" data-testid=\"genesis-chat-emoji-picker-unset\">\n The emoji picker isn't set up.\n </p>\n );\n }\n return (\n <EmojiPicker.Root\n onEmojiSelect={(e) => onSelect(e.emoji)}\n emojibaseUrl={emojibaseUrl}\n locale={locale}\n columns={columns}\n className={cn(\"isolate flex h-80 w-[18.5rem] flex-col bg-popover text-popover-foreground\", className)}\n data-testid=\"genesis-chat-emoji-picker\"\n >\n <EmojiPicker.Search\n autoFocus\n aria-label=\"Search emoji\"\n placeholder=\"Search emoji\"\n className=\"m-2 h-9 shrink-0 rounded-md border border-input bg-background px-3 text-sm outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n />\n <EmojiPicker.Viewport className=\"relative flex-1 outline-none\">\n <EmojiPicker.Loading className=\"absolute inset-0 flex items-center justify-center\">\n <Spinner size=\"sm\" aria-label=\"Loading emoji\" />\n </EmojiPicker.Loading>\n <EmojiPicker.Empty className=\"absolute inset-0 flex items-center justify-center text-sm text-muted-foreground\">No emoji found</EmojiPicker.Empty>\n <EmojiPicker.List\n className=\"select-none pb-1.5\"\n components={{\n CategoryHeader: ({ category, ...props }) => (\n <div className=\"bg-popover px-3 pb-1 pt-2 text-xs font-medium text-muted-foreground\" {...props}>\n {category.label}\n </div>\n ),\n Row: ({ children, ...props }) => (\n <div className=\"scroll-my-1.5 px-1.5\" {...props}>\n {children}\n </div>\n ),\n Emoji: ({ emoji, ...props }) => (\n <button\n type=\"button\"\n className={cn(\"flex size-8 items-center justify-center rounded-md text-xl\", emoji.isActive && \"bg-accent\")}\n {...props}\n >\n {emoji.emoji}\n </button>\n ),\n }}\n />\n </EmojiPicker.Viewport>\n </EmojiPicker.Root>\n );\n}\n","/**\n * @feat:chat\n * What every bubble of one thread shares: who you are, how people are named,\n * your role, signed file URLs, and the actions, so a row needs only its item.\n */\nimport { createContext, useContext, type ComponentType } from \"react\";\nimport type { ChatLinkPreview, ChatMessage, ChatRole } from \"../core/types\";\nimport type { ChatAttachmentKind } from \"../react/index\";\nimport type { ChatAttachmentSlotProps } from \"./attachments\";\nimport type { LinkPreviewImages } from \"./cards\";\nimport type { ResolveUser } from \"./format\";\n\nexport interface ThreadContextValue {\n me: string;\n resolveUser: ResolveUser;\n role: ChatRole | null;\n /** More than two people: names and avatars show on others' messages. */\n isGroup: boolean;\n /** Owner or admin: may delete anyone's message. */\n canModerate: boolean;\n canPin: boolean;\n canPost: boolean;\n pins: Set<string>;\n urls: Record<string, string>;\n byId: Map<string, ChatMessage>;\n quickReactions: readonly string[];\n attachmentSlot?: ComponentType<ChatAttachmentSlotProps> | null;\n /** Cards for the app's registered attachment kinds. */\n attachmentKinds?: Record<string, ChatAttachmentKind>;\n /** Link previews by message id, in link order. */\n previews: Record<string, ChatLinkPreview[]>;\n /** Where the full emoji picker loads its data from; no full picker without it. */\n emojibaseUrl?: string;\n /** Link preview images: off by default (see LinkPreviewImages). */\n linkPreviewImages?: LinkPreviewImages;\n linkPreviewProxyUrl?: (url: string) => string | null | undefined;\n highlightedId: string | null;\n editingId: string | null;\n reply(m: ChatMessage): void;\n focusComposer(): void;\n startEdit(id: string | null): void;\n saveEdit(m: ChatMessage, body: string): Promise<void>;\n askDelete(m: ChatMessage): void;\n askReport(m: ChatMessage): void;\n react(m: ChatMessage, emoji: string, on: boolean): void;\n pin(m: ChatMessage, on: boolean): void;\n save(m: ChatMessage): void;\n copy(m: ChatMessage): void;\n jumpTo(messageId: string): void;\n retry(clientId: string): void;\n discard(clientId: string): void;\n openThread?: (m: ChatMessage) => void;\n}\n\nexport const ThreadContext = createContext<ThreadContextValue | null>(null);\n\nexport function useThreadContext(): ThreadContextValue {\n const ctx = useContext(ThreadContext);\n if (!ctx) throw new Error(\"Chat bubbles render inside <ChatThread>.\");\n return ctx;\n}\n\n/** The six quick reactions. */\nexport const QUICK_REACTIONS = [\"👍\", \"❤️\", \"😂\", \"😮\", \"😢\", \"🙏\"] as const;\n","/**\n * @feat:chat\n * One row of a thread: a system line, or a bubble (yours on the right in the\n * primary colour, theirs on the left), with its reply quote, body, attachments,\n * time and edited marker, reactions, and actions on hover, right-click or\n * long-press. Pending messages show \"Sending…\"; failed ones offer Retry and\n * Delete.\n */\nimport { useEffect, useRef, useState, type ComponentType, type MutableRefObject, type ReactNode } from \"react\";\nimport {\n AlertCircle,\n Ban,\n Bookmark,\n Clock,\n Copy,\n EyeOff,\n Flag,\n Lock,\n MessageSquare,\n MoreHorizontal,\n Pencil,\n Pin,\n PinOff,\n Plus,\n Reply,\n ShieldAlert,\n SmilePlus,\n Trash2,\n} from \"lucide-react\";\nimport {\n Badge,\n Button,\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator,\n ContextMenuTrigger,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Textarea,\n Tooltip,\n UserAvatar,\n cn,\n} from \"@marktiderman/genesis-ui\";\nimport { attachmentKindFor } from \"../core/media\";\nimport type { QueuedMessage } from \"../core/outbox\";\nimport { previewText, summarizeReactions, type ThreadItem } from \"../core/thread\";\nimport type { ChatMessage, PendingMessage } from \"../core/types\";\nimport { MessageAttachments, toAttachmentView, type AttachmentView } from \"./attachments\";\nimport { ChatLinkPreview } from \"./cards\";\nimport { ChatEmojiPicker, canPickEmoji } from \"./emoji-picker\";\nimport { clockTime, messageLabel } from \"./format\";\nimport { ChatMarkdown } from \"./markdown\";\nimport { useThreadContext } from \"./thread-context\";\n\nexport interface MessageRowProps {\n item: ThreadItem;\n /** First of a run from one sender: the name and avatar show (others' messages, in groups). */\n startsGroup: boolean;\n className?: string;\n}\n\n/** The pending message as a message, so one bubble draws both. */\nfunction pendingAsMessage(p: PendingMessage): ChatMessage {\n return {\n id: `pending:${p.clientId}`,\n conversationId: p.input.conversationId,\n seq: Number.MAX_SAFE_INTEGER,\n clientId: p.clientId,\n senderId: p.senderId,\n senderRole: \"member\",\n kind: \"text\",\n body: p.input.body ?? \"\",\n mentions: p.input.mentions ?? [],\n replyToId: p.input.replyToId ?? null,\n threadRootId: p.input.threadRootId ?? null,\n threadCount: 0,\n threadLastAt: null,\n topic: p.input.topic ?? null,\n visibility: p.input.visibility ?? \"everyone\",\n silent: Boolean(p.input.silent),\n meta: {},\n createdAt: p.createdAt,\n editedAt: null,\n deletedAt: null,\n moderation: null,\n attachments: [],\n reactions: [],\n };\n}\n\nfunction pendingViews(p: PendingMessage): AttachmentView[] {\n const files = (p as Partial<QueuedMessage>).files ?? [];\n return files.map((f, i) => ({\n key: `${p.clientId}:${i}`,\n kind: f.meta?.kind ?? attachmentKindFor(f.contentType),\n url: p.previews?.[i] ?? f.previewUrl ?? null,\n posterUrl: null,\n name: f.meta?.name ?? f.name,\n mime: f.contentType,\n bytes: f.meta?.bytes ?? (typeof Blob !== \"undefined\" && f.data instanceof Blob ? f.data.size : null),\n width: f.meta?.width ?? null,\n height: f.meta?.height ?? null,\n durationMs: f.meta?.durationMs ?? null,\n waveform: f.meta?.waveform ?? null,\n transcript: null,\n transcriptStatus: null,\n pending: p.status === \"sending\",\n }));\n}\n\n/** A menu gives focus back to what opened it, unless the action put it somewhere (the composer, the edit box). */\nfunction returnFocus(e: Event, keepFocus: MutableRefObject<(() => void) | null>) {\n const next = keepFocus.current;\n if (next) {\n e.preventDefault();\n keepFocus.current = null;\n next();\n }\n}\n\n/** Plain text for the clipboard: mentions as @Name. */\nexport function plainText(body: string): string {\n return body.replace(/@\\[([^\\]]+)\\]\\(user:[0-9a-f-]{36}\\)/gi, \"@$1\");\n}\n\nexport function MessageRow({ item, startsGroup, className }: MessageRowProps) {\n const ctx = useThreadContext();\n const keepFocus = useRef<(() => void) | null>(null);\n const pending = item.type === \"pending\" ? item.pending : null;\n const message = item.type === \"message\" ? item.message : pendingAsMessage(item.pending);\n\n if (message.kind === \"system\") {\n return (\n <div className={cn(\"flex justify-center px-4 py-1\", className)} role=\"note\" data-testid=\"genesis-chat-system\">\n <span className=\"max-w-[85%] rounded-full bg-muted px-3 py-1 text-center text-xs text-muted-foreground\">\n <ChatMarkdown text={message.body} me={ctx.me} />\n </span>\n </div>\n );\n }\n\n const mine = message.senderId === ctx.me;\n const sender = message.senderId ? ctx.resolveUser(message.senderId) : { name: \"Someone\" };\n const deleted = Boolean(message.deletedAt);\n const note = message.visibility === \"observers\";\n const showHeader = ctx.isGroup && !mine && startsGroup;\n const tone: \"default\" | \"primary\" = mine && !note && !deleted ? \"primary\" : \"default\";\n const views = pending ? pendingViews(pending) : message.attachments.map((a) => toAttachmentView(a, ctx.urls));\n const editing = ctx.editingId === message.id;\n const reactions = pending ? [] : summarizeReactions(message, ctx.me);\n const highlighted = ctx.highlightedId === message.id;\n const actionable = !pending && !deleted;\n const hidden = !deleted && message.moderation === \"hidden\";\n const flagged = !deleted && message.moderation === \"flagged\";\n const observer = ctx.role === \"observer\";\n // One preview per message, iMessage-style: the first link the server has fetched.\n const preview = !pending && !deleted && !hidden && message.body ? ctx.previews[message.id]?.[0] : undefined;\n\n const bubble = (\n <div\n className={cn(\n \"relative min-w-0 max-w-full rounded-2xl px-3 py-2 text-sm leading-relaxed shadow-sm transition-shadow\",\n tone === \"primary\" ? \"bg-primary text-primary-foreground\" : \"bg-muted text-foreground\",\n mine ? (startsGroup ? \"rounded-tr-md\" : \"\") : startsGroup ? \"rounded-tl-md\" : \"\",\n note && \"border border-warning/50 bg-warning/15 text-foreground\",\n deleted && \"border border-dashed bg-transparent text-muted-foreground shadow-none\",\n highlighted && \"ring-2 ring-ring ring-offset-2 ring-offset-background\",\n pending?.status === \"failed\" && \"opacity-80\",\n hidden && \"opacity-70\",\n )}\n data-testid={deleted ? \"genesis-chat-deleted\" : note ? \"genesis-chat-note\" : mine ? \"genesis-chat-mine\" : \"genesis-chat-theirs\"}\n >\n {note ? (\n <div className=\"mb-1 flex items-center gap-1 text-xs font-semibold text-foreground/80\">\n <Lock className=\"size-3\" aria-hidden /> Internal note\n </div>\n ) : null}\n {deleted ? (\n <span className=\"flex items-center gap-1.5 italic\">\n <Ban className=\"size-3.5\" aria-hidden /> Message deleted\n </span>\n ) : editing ? (\n <EditBox message={message} />\n ) : (\n <>\n {message.replyToId ? <ReplyQuote id={message.replyToId} tone={tone} /> : null}\n {views.length ? (\n <div className={cn(message.body ? \"mb-1.5\" : \"\")}>\n <MessageAttachments views={views} message={pending ? undefined : message} mine={mine} tone={tone} slot={ctx.attachmentSlot} kinds={ctx.attachmentKinds} />\n </div>\n ) : null}\n {message.body ? <ChatMarkdown text={message.body} me={ctx.me} tone={tone} /> : null}\n {preview ? <ChatLinkPreview preview={preview} images={ctx.linkPreviewImages} proxyUrl={ctx.linkPreviewProxyUrl} tone={tone} /> : null}\n {hidden && mine && !observer ? (\n <span className=\"mt-1 flex items-center gap-1 text-xs font-medium\" data-testid=\"genesis-chat-hidden-notice\">\n <EyeOff className=\"size-3\" aria-hidden /> Hidden by moderation. Only you can see it.\n </span>\n ) : null}\n <Meta message={message} pending={pending} tone={tone} />\n </>\n )}\n </div>\n );\n\n return (\n <article\n id={`genesis-chat-msg-${message.id}`}\n data-message-id={pending ? undefined : message.id}\n aria-label={`${messageLabel(message, mine ? \"You\" : sender.name)}${hidden ? \" (hidden by moderation)\" : flagged && observer ? \" (flagged)\" : \"\"}`}\n className={cn(\"group/msg flex gap-2 px-3\", mine ? \"flex-row-reverse\" : \"flex-row\", startsGroup ? \"mt-2\" : \"mt-0.5\", className)}\n data-testid={pending ? `genesis-chat-pending-${pending.status}` : \"genesis-chat-message\"}\n >\n {ctx.isGroup && !mine ? (\n showHeader ? (\n <UserAvatar name={sender.name} src={sender.avatarUrl} size=\"sm\" className=\"mt-5\" />\n ) : (\n <span className=\"w-8 shrink-0\" aria-hidden />\n )\n ) : null}\n <div className={cn(\"flex min-w-0 max-w-[min(78%,36rem)] flex-col\", mine ? \"items-end\" : \"items-start\")}>\n {showHeader ? <span className=\"mb-0.5 px-3 text-xs font-medium text-muted-foreground\">{sender.name}</span> : null}\n {observer && (hidden || flagged) ? (\n <Badge\n variant={hidden ? \"destructive\" : \"outline\"}\n className=\"mb-0.5 gap-1 px-1.5 py-0 text-[10px]\"\n data-testid={hidden ? \"genesis-chat-moderation-hidden\" : \"genesis-chat-moderation-flagged\"}\n >\n {hidden ? <EyeOff className=\"size-3\" aria-hidden /> : <ShieldAlert className=\"size-3\" aria-hidden />}\n {hidden ? \"Hidden by moderation\" : \"Flagged\"}\n </Badge>\n ) : null}\n <div className={cn(\"flex max-w-full items-center gap-1\", mine ? \"flex-row-reverse\" : \"flex-row\")}>\n {actionable ? (\n <ContextMenu>\n <ContextMenuTrigger asChild>{bubble}</ContextMenuTrigger>\n <ContextMenuContent className=\"w-56\" onCloseAutoFocus={(e) => returnFocus(e, keepFocus)}>\n <ActionItems message={message} mine={mine} keepFocus={keepFocus} Item={ContextMenuItem} Separator={ContextMenuSeparator} />\n </ContextMenuContent>\n </ContextMenu>\n ) : (\n bubble\n )}\n {actionable && !editing ? <HoverBar message={message} mine={mine} /> : null}\n </div>\n {reactions.length ? (\n <div className={cn(\"-mt-1 flex flex-wrap gap-1 px-2\", mine ? \"justify-end\" : \"justify-start\")} data-testid=\"genesis-chat-reactions\">\n {reactions.map((r) => (\n <Tooltip key={r.emoji} content={r.userIds.map((u) => (u === ctx.me ? \"You\" : ctx.resolveUser(u).name)).join(\", \")}>\n <button\n type=\"button\"\n aria-pressed={r.mine}\n aria-label={`${r.emoji} ${r.count}${r.mine ? \", including you\" : \"\"}. ${r.mine ? \"Remove\" : \"Add\"} your reaction`}\n onClick={() => ctx.react(message, r.emoji, !r.mine)}\n disabled={!ctx.canPost}\n className={cn(\n \"inline-flex h-6 items-center gap-1 rounded-full border bg-background px-2 text-xs shadow-sm transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none\",\n r.mine && \"border-primary bg-primary/10 text-primary\",\n )}\n data-testid={`genesis-chat-reaction-${r.emoji}`}\n >\n <span aria-hidden>{r.emoji}</span>\n <span className=\"tabular-nums\" aria-hidden>\n {r.count}\n </span>\n </button>\n </Tooltip>\n ))}\n </div>\n ) : null}\n {!pending && message.threadCount > 0 && ctx.openThread ? (\n <Button type=\"button\" variant=\"link\" size=\"sm\" className=\"h-6 px-2 text-xs\" onClick={() => ctx.openThread?.(message)}>\n <MessageSquare className=\"size-3\" aria-hidden />\n {message.threadCount === 1 ? \"1 reply\" : `${message.threadCount} replies`}\n </Button>\n ) : null}\n {pending?.status === \"failed\" ? (\n <div className=\"mt-1 flex items-center gap-1 text-xs text-destructive\" role=\"alert\">\n <AlertCircle className=\"size-3.5\" aria-hidden />\n <span>Not sent{pending.error && pending.error !== \"Not sent\" ? `: ${pending.error}` : \"\"}</span>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" className=\"h-6 px-2 text-xs\" onClick={() => ctx.retry(pending.clientId)} data-testid=\"genesis-chat-retry\">\n Retry\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" className=\"h-6 px-2 text-xs text-destructive hover:text-destructive\" onClick={() => ctx.discard(pending.clientId)} data-testid=\"genesis-chat-discard\">\n Delete\n </Button>\n </div>\n ) : null}\n </div>\n </article>\n );\n}\n\nfunction Meta({ message, pending, tone }: { message: ChatMessage; pending: PendingMessage | null; tone: \"default\" | \"primary\" }) {\n const muted = tone === \"primary\" ? \"text-primary-foreground/75\" : \"text-muted-foreground\";\n return (\n <span className={cn(\"float-right ml-3 mt-1 flex translate-y-1 items-center gap-1 text-[11px] leading-none\", muted)}>\n {message.editedAt ? <span>edited</span> : null}\n {pending?.status === \"sending\" ? (\n <>\n <Clock className=\"size-3\" aria-hidden />\n <span>Sending…</span>\n </>\n ) : pending?.status === \"failed\" ? (\n <AlertCircle className=\"size-3\" aria-label=\"Not sent\" />\n ) : (\n <time dateTime={message.createdAt}>{clockTime(message.createdAt)}</time>\n )}\n </span>\n );\n}\n\nfunction ReplyQuote({ id, tone }: { id: string; tone: \"default\" | \"primary\" }) {\n const ctx = useThreadContext();\n const original = ctx.byId.get(id);\n const who = original?.senderId ? (original.senderId === ctx.me ? \"You\" : ctx.resolveUser(original.senderId).name) : null;\n const text = original ? previewText(original.body, original.attachments[0]?.kind ?? null, Boolean(original.deletedAt)) : \"Earlier message\";\n return (\n <button\n type=\"button\"\n onClick={() => ctx.jumpTo(id)}\n className={cn(\n \"mb-1.5 block w-full min-w-0 rounded-md border-l-4 px-2 py-1 text-left text-xs focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n tone === \"primary\" ? \"border-primary-foreground/60 bg-primary-foreground/15\" : \"border-primary bg-background/60\",\n )}\n aria-label={`Replying to ${who ?? \"a message\"}: ${text}. Show it`}\n data-testid=\"genesis-chat-reply-quote\"\n >\n {who ? <span className=\"block font-semibold\">{who}</span> : null}\n <span className=\"line-clamp-2 opacity-80\">{text}</span>\n </button>\n );\n}\n\nfunction EditBox({ message }: { message: ChatMessage }) {\n const ctx = useThreadContext();\n const [value, setValue] = useState(message.body);\n const [busy, setBusy] = useState(false);\n const ref = useRef<HTMLTextAreaElement>(null);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n el.focus();\n el.setSelectionRange(el.value.length, el.value.length);\n }, []);\n const save = async () => {\n const body = value.trim();\n if (!body || body === message.body) return ctx.startEdit(null);\n setBusy(true);\n try {\n await ctx.saveEdit(message, body);\n ctx.startEdit(null);\n } finally {\n setBusy(false);\n }\n };\n return (\n <div className=\"flex min-w-[16rem] flex-col gap-2\">\n <Textarea\n ref={ref}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n ctx.startEdit(null);\n } else if (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault();\n void save();\n }\n }}\n id={`genesis-chat-edit-${message.id}`}\n aria-label=\"Edit message\"\n className=\"min-h-[60px] resize-none bg-background text-foreground\"\n />\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => ctx.startEdit(null)} className={cn(\"h-7\", \"text-current\")}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"secondary\" onClick={() => void save()} loading={busy} className=\"h-7\">\n Save\n </Button>\n </div>\n </div>\n );\n}\n\ntype ItemComponent = ComponentType<{ onSelect?: (e: Event) => void; className?: string; children?: ReactNode; \"data-testid\"?: string; \"aria-label\"?: string }>;\n\ninterface ActionItemsProps {\n message: ChatMessage;\n /** Set when the picked action moves focus itself (Reply, Edit), so the menu doesn't take it back. */\n keepFocus: MutableRefObject<(() => void) | null>;\n mine: boolean;\n Item: ItemComponent;\n Separator: ComponentType<{ className?: string }>;\n}\n\n/** The actions menu, the same in the right-click menu and the \"More\" menu. */\nfunction ActionItems({ message, mine, keepFocus, Item, Separator }: ActionItemsProps) {\n const ctx = useThreadContext();\n const pinned = ctx.pins.has(message.id);\n const canDelete = mine || ctx.canModerate;\n const canEdit = mine && message.kind === \"text\" && message.body.length > 0;\n return (\n <>\n {ctx.canPost ? (\n <>\n <div className=\"flex justify-between gap-0.5 px-1 py-1\" role=\"group\" aria-label=\"React\">\n {ctx.quickReactions.map((emoji) => {\n const on = message.reactions.some((r) => r.emoji === emoji && r.userId === ctx.me);\n return (\n <Item\n key={emoji}\n className={cn(\"justify-center rounded-full px-2 text-lg\", on && \"bg-primary/10\")}\n onSelect={() => ctx.react(message, emoji, !on)}\n aria-label={`${on ? \"Remove\" : \"React with\"} ${emoji}`}\n >\n {emoji}\n </Item>\n );\n })}\n </div>\n <Separator />\n <Item className=\"gap-2\" onSelect={() => { keepFocus.current = ctx.focusComposer; ctx.reply(message); }}>\n <Reply className=\"size-4\" aria-hidden /> Reply\n </Item>\n </>\n ) : null}\n {message.body ? (\n <Item className=\"gap-2\" onSelect={() => ctx.copy(message)}>\n <Copy className=\"size-4\" aria-hidden /> Copy text\n </Item>\n ) : null}\n {canEdit && ctx.canPost ? (\n <Item className=\"gap-2\" onSelect={() => { keepFocus.current = () => document.getElementById(`genesis-chat-edit-${message.id}`)?.focus(); ctx.startEdit(message.id); }}>\n <Pencil className=\"size-4\" aria-hidden /> Edit\n </Item>\n ) : null}\n {ctx.canPin ? (\n <Item className=\"gap-2\" onSelect={() => ctx.pin(message, !pinned)}>\n {pinned ? <PinOff className=\"size-4\" aria-hidden /> : <Pin className=\"size-4\" aria-hidden />} {pinned ? \"Unpin\" : \"Pin\"}\n </Item>\n ) : null}\n <Item className=\"gap-2\" onSelect={() => ctx.save(message)}>\n <Bookmark className=\"size-4\" aria-hidden /> Save\n </Item>\n {!mine && message.senderId ? (\n <Item className=\"gap-2\" onSelect={() => ctx.askReport(message)}>\n <Flag className=\"size-4\" aria-hidden /> Report\n </Item>\n ) : null}\n {canDelete ? (\n <>\n <Separator />\n <Item onSelect={() => ctx.askDelete(message)} className=\"gap-2 text-destructive focus:text-destructive\">\n <Trash2 className=\"size-4\" aria-hidden /> Delete\n </Item>\n </>\n ) : null}\n </>\n );\n}\n\n/** Desktop: a small bar beside the bubble on hover or focus (React, Reply, More). Touch uses long-press. */\nfunction HoverBar({ message, mine }: { message: ChatMessage; mine: boolean }) {\n const ctx = useThreadContext();\n const keepFocus = useRef<(() => void) | null>(null);\n const [open, setOpen] = useState<\"react\" | \"more\" | null>(null);\n const [full, setFull] = useState(false);\n return (\n <div\n className={cn(\n \"flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity focus-within:opacity-100 group-hover/msg:opacity-100 [@media(hover:none)]:hidden\",\n open && \"opacity-100\",\n mine ? \"flex-row-reverse\" : \"flex-row\",\n )}\n >\n {ctx.canPost ? (\n <Popover\n open={open === \"react\"}\n onOpenChange={(o) => {\n setOpen(o ? \"react\" : null);\n if (!o) setFull(false);\n }}\n >\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 rounded-full text-muted-foreground\" aria-label=\"React\">\n <SmilePlus />\n </Button>\n </PopoverTrigger>\n {full ? (\n <PopoverContent side=\"top\" align={mine ? \"end\" : \"start\"} className=\"w-auto overflow-hidden p-0\">\n <ChatEmojiPicker\n emojibaseUrl={ctx.emojibaseUrl}\n onSelect={(emoji) => {\n const on = message.reactions.some((r) => r.emoji === emoji && r.userId === ctx.me);\n ctx.react(message, emoji, !on);\n setOpen(null);\n setFull(false);\n }}\n />\n </PopoverContent>\n ) : (\n <PopoverContent side=\"top\" align={mine ? \"end\" : \"start\"} className=\"flex w-auto gap-0.5 rounded-full p-1\">\n {ctx.quickReactions.map((emoji) => {\n const on = message.reactions.some((r) => r.emoji === emoji && r.userId === ctx.me);\n return (\n <button\n key={emoji}\n type=\"button\"\n className={cn(\"flex size-9 items-center justify-center rounded-full text-xl transition-transform hover:scale-125 hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\", on && \"bg-primary/10\")}\n aria-label={`${on ? \"Remove\" : \"React with\"} ${emoji}`}\n aria-pressed={on}\n onClick={() => {\n ctx.react(message, emoji, !on);\n setOpen(null);\n }}\n >\n {emoji}\n </button>\n );\n })}\n {canPickEmoji(ctx.emojibaseUrl) ? (\n <button\n type=\"button\"\n className=\"flex size-9 items-center justify-center rounded-full text-muted-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label=\"More reactions\"\n onClick={() => setFull(true)}\n data-testid=\"genesis-chat-more-reactions\"\n >\n <Plus className=\"size-4\" />\n </button>\n ) : null}\n </PopoverContent>\n )}\n </Popover>\n ) : null}\n {ctx.canPost ? (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 rounded-full text-muted-foreground\" aria-label=\"Reply\" onClick={() => ctx.reply(message)}>\n <Reply />\n </Button>\n ) : null}\n <DropdownMenu open={open === \"more\"} onOpenChange={(o) => setOpen(o ? \"more\" : null)}>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 rounded-full text-muted-foreground\" aria-label=\"More actions\" data-testid=\"genesis-chat-more\">\n <MoreHorizontal />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={mine ? \"end\" : \"start\"} className=\"w-56\" onCloseAutoFocus={(e) => returnFocus(e, keepFocus)}>\n <ActionItems message={message} mine={mine} keepFocus={keepFocus} Item={DropdownMenuItem} Separator={DropdownMenuSeparator} />\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n\n","/**\n * @feat:chat\n * Scheduled send on the web: the send button's menu (tomorrow 9 AM, Monday 9 AM, or a date\n * and time you pick), and `ChatScheduledList`, your messages waiting to go, each with Cancel.\n */\nimport { useEffect, useMemo, useState } from \"react\";\nimport { AlertCircle, CalendarClock, ChevronUp, Clock, X } from \"lucide-react\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n EmptyState,\n Input,\n Label,\n Skeleton,\n cn,\n toast,\n} from \"@marktiderman/genesis-ui\";\nimport { isSchedulable, scheduleLabel, scheduleQuickPicks } from \"../core/extras\";\nimport { previewText } from \"../core/thread\";\nimport { useScheduled } from \"../react/index\";\n\nexport interface ChatScheduleMenuProps {\n /** Called with the chosen time. */\n onSchedule: (at: Date) => void;\n disabled?: boolean;\n /** For tests and demos. */\n now?: Date;\n}\n\n/** `YYYY-MM-DDTHH:mm` in local time, for a datetime-local input. */\nexport function toLocalInput(d: Date): string {\n const p = (n: number) => String(n).padStart(2, \"0\");\n return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}T${p(d.getHours())}:${p(d.getMinutes())}`;\n}\n\n/** The chevron beside Send: \"Schedule message\" with quick picks and a custom time. */\nexport function ChatScheduleMenu({ onSchedule, disabled, now }: ChatScheduleMenuProps) {\n const [picking, setPicking] = useState(false);\n const picks = useMemo(() => scheduleQuickPicks(now ?? new Date()), [now]);\n return (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"-ml-1 size-8 shrink-0 self-center rounded-full text-muted-foreground\"\n disabled={disabled}\n aria-label=\"Send options\"\n data-testid=\"genesis-chat-send-menu\"\n >\n <ChevronUp />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" side=\"top\" className=\"w-60\">\n <DropdownMenuLabel className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <CalendarClock className=\"size-3.5\" aria-hidden /> Schedule message\n </DropdownMenuLabel>\n {picks.map((p) => (\n <DropdownMenuItem key={p.label} className=\"gap-2\" onSelect={() => onSchedule(p.at)} data-testid=\"genesis-chat-schedule-pick\">\n <Clock className=\"size-4\" aria-hidden /> {p.label}\n </DropdownMenuItem>\n ))}\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"gap-2\" onSelect={() => setPicking(true)} data-testid=\"genesis-chat-schedule-custom\">\n <CalendarClock className=\"size-4\" aria-hidden /> Pick a date and time…\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n <ScheduleDialog open={picking} onOpenChange={setPicking} onSchedule={onSchedule} now={now} />\n </>\n );\n}\n\nfunction ScheduleDialog({ open, onOpenChange, onSchedule, now }: { open: boolean; onOpenChange: (o: boolean) => void; onSchedule: (at: Date) => void; now?: Date }) {\n const base = now ?? new Date();\n const [value, setValue] = useState(() => toLocalInput(new Date(base.getTime() + 60 * 60_000)));\n // The default is an hour from when it opens, not from when the composer first drew.\n useEffect(() => {\n if (open) setValue(toLocalInput(new Date((now ?? new Date()).getTime() + 60 * 60_000)));\n }, [open]); // eslint-disable-line react-hooks/exhaustive-deps\n const at = new Date(value);\n const ok = isSchedulable(at, now ?? new Date());\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-sm\">\n <DialogHeader>\n <DialogTitle>Schedule message</DialogTitle>\n <DialogDescription>It sends at this time, in your time zone, as if you'd sent it then.</DialogDescription>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n if (!ok) return;\n onSchedule(at);\n onOpenChange(false);\n }}\n >\n <Label htmlFor=\"genesis-chat-schedule-at\">Date and time</Label>\n <Input\n id=\"genesis-chat-schedule-at\"\n type=\"datetime-local\"\n value={value}\n min={toLocalInput(new Date(base.getTime() + 60_000))}\n onChange={(e) => setValue(e.target.value)}\n aria-invalid={!ok}\n aria-describedby=\"genesis-chat-schedule-hint\"\n data-testid=\"genesis-chat-schedule-input\"\n />\n <p id=\"genesis-chat-schedule-hint\" className={cn(\"text-xs\", ok ? \"text-muted-foreground\" : \"text-destructive\")}>\n {ok ? scheduleLabel(at, now ?? new Date()) : \"Pick a time from a minute to a year from now.\"}\n </p>\n <DialogFooter className=\"mt-2\">\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={!ok} data-testid=\"genesis-chat-schedule-confirm\">\n Schedule\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport interface ChatScheduledListProps {\n /** One conversation's; all of yours without it. */\n conversationId?: string | null;\n /** Names a conversation in the all-conversations list. */\n conversationTitle?: (conversationId: string) => string;\n className?: string;\n}\n\n/** Your scheduled messages, soonest first, each with when it goes and Cancel. */\nexport function ChatScheduledList({ conversationId, conversationTitle, className }: ChatScheduledListProps) {\n const { items, isLoading, cancel } = useScheduled(conversationId);\n if (isLoading) {\n return (\n <div className={cn(\"flex flex-col gap-2 p-3\", className)} aria-busy aria-label=\"Loading scheduled messages\">\n <Skeleton className=\"h-12 w-full\" />\n <Skeleton className=\"h-12 w-full\" />\n </div>\n );\n }\n if (items.length === 0) {\n return <EmptyState icon={CalendarClock} title=\"Nothing scheduled\" description=\"Use the arrow beside Send to schedule a message.\" className={className} />;\n }\n return (\n <ul className={cn(\"flex flex-col divide-y\", className)} aria-label=\"Scheduled messages\" data-testid=\"genesis-chat-scheduled-list\">\n {items.map((s) => (\n <li key={s.id} className=\"flex items-start gap-3 px-3 py-2.5\" data-testid=\"genesis-chat-scheduled-item\">\n {s.status === \"failed\" ? <AlertCircle className=\"mt-0.5 size-4 shrink-0 text-destructive\" aria-hidden /> : <Clock className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\" aria-hidden />}\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-xs font-medium text-muted-foreground\">\n {s.status === \"failed\" ? \"Couldn't send\" : scheduleLabel(s.sendAt)}\n {!conversationId && conversationTitle ? ` · ${conversationTitle(s.conversationId)}` : null}\n </div>\n <div className=\"truncate text-sm\">{previewText(s.body, s.attachments[0]?.kind ?? null)}</div>\n {s.error ? <div className=\"text-xs text-destructive\">{s.error}</div> : null}\n </div>\n {s.status === \"scheduled\" ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 shrink-0 gap-1 text-xs\"\n onClick={() => void cancel(s.id).then(() => toast.success(\"Scheduled message cancelled\"), () => toast.error(\"Couldn't cancel it\"))}\n aria-label={`Cancel the message scheduled for ${scheduleLabel(s.sendAt)}`}\n data-testid=\"genesis-chat-scheduled-cancel\"\n >\n <X className=\"size-3.5\" aria-hidden /> Cancel\n </Button>\n ) : null}\n </li>\n ))}\n </ul>\n );\n}\n","/**\n * @feat:chat\n * Availability on the web: `ChatAwayBanner`, the line a thread shows when the other person is\n * away or outside their hours, and `ChatAvailabilitySettings`, where you set your own away\n * message, its end, your hours per weekday and your time zone.\n */\nimport { useEffect, useMemo, useState } from \"react\";\nimport { Moon } from \"lucide-react\";\nimport {\n Alert,\n AlertDescription,\n Button,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Skeleton,\n Switch,\n Textarea,\n cn,\n toast,\n} from \"@marktiderman/genesis-ui\";\nimport { WEEKDAYS, awayLine, awaySummary } from \"../core/availability\";\nimport type { ChatAvailability, Weekday, WorkingHours } from \"../core/types\";\nimport { useAvailability } from \"../react/index\";\nimport { toLocalInput } from \"./schedule\";\n\nexport interface ChatAwayBannerProps {\n /** One person (a direct conversation). */\n availability?: ChatAvailability | null;\n /** The person's name, as the app shows it. */\n name?: string;\n /** Several people (a group): everyone away or outside their hours is named, two at most. */\n people?: { availability: ChatAvailability | null | undefined; name: string }[];\n now?: Date;\n className?: string;\n}\n\n/** \"Mark replies Mon–Fri, 9–5 (Eastern)\", \"Away until Monday: Back Monday\", \"Sam, Lee and 2 others are away\"; nothing when everyone is around. */\nexport function ChatAwayBanner({ availability, name, people, now, className }: ChatAwayBannerProps) {\n const line = people ? awaySummary(people, { now }) : awayLine(availability, name ?? \"They\", { now });\n if (!line) return null;\n return (\n <Alert className={cn(\"rounded-none border-x-0 border-t-0 px-3 py-2\", className)} role=\"status\" data-testid=\"genesis-chat-away-banner\">\n <Moon className=\"size-4\" aria-hidden />\n <AlertDescription className=\"text-xs\">{line}</AlertDescription>\n </Alert>\n );\n}\n\nconst DAY_NAMES: Record<Weekday, string> = {\n mon: \"Monday\",\n tue: \"Tuesday\",\n wed: \"Wednesday\",\n thu: \"Thursday\",\n fri: \"Friday\",\n sat: \"Saturday\",\n sun: \"Sunday\",\n};\n\nconst FALLBACK_ZONES = [\n \"UTC\", \"America/New_York\", \"America/Chicago\", \"America/Denver\", \"America/Los_Angeles\", \"America/Toronto\", \"America/Sao_Paulo\",\n \"Europe/London\", \"Europe/Paris\", \"Europe/Berlin\", \"Africa/Johannesburg\", \"Asia/Dubai\", \"Asia/Kolkata\", \"Asia/Singapore\",\n \"Asia/Tokyo\", \"Australia/Sydney\", \"Pacific/Auckland\",\n];\n\nfunction timeZones(): string[] {\n const intl = Intl as unknown as { supportedValuesOf?: (key: string) => string[] };\n try {\n const all = intl.supportedValuesOf?.(\"timeZone\");\n if (all?.length) return all.includes(\"UTC\") ? all : [\"UTC\", ...all];\n } catch {\n // older engines\n }\n return FALLBACK_ZONES;\n}\n\nconst deviceZone = () => {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || \"UTC\";\n } catch {\n return \"UTC\";\n }\n};\n\ninterface DayRow {\n on: boolean;\n from: string;\n to: string;\n}\n\nconst defaultDays = (): Record<Weekday, DayRow> =>\n Object.fromEntries(WEEKDAYS.map((d) => [d, { on: d !== \"sat\" && d !== \"sun\", from: \"09:00\", to: \"17:00\" }])) as Record<Weekday, DayRow>;\n\nfunction daysFrom(hours: WorkingHours | null | undefined): Record<Weekday, DayRow> {\n if (!hours) return defaultDays();\n return Object.fromEntries(\n WEEKDAYS.map((d) => {\n const first = hours[d]?.[0];\n return [d, first ? { on: true, from: first[0], to: first[1] } : { on: false, from: \"09:00\", to: \"17:00\" }];\n }),\n ) as Record<Weekday, DayRow>;\n}\n\nexport interface ChatAvailabilitySettingsProps {\n /** Called after a save. */\n onSaved?: () => void;\n className?: string;\n}\n\n/**\n * Your availability: an away message (and until when), working hours per weekday, and the\n * time zone they're read in. One range per day here; extra ranges saved elsewhere are kept\n * for the days you don't change.\n */\nexport function ChatAvailabilitySettings({ onSaved, className }: ChatAvailabilitySettingsProps) {\n const { mine, mineLoading, setMine } = useAvailability();\n const zones = useMemo(timeZones, []);\n const [message, setMessage] = useState(\"\");\n const [until, setUntil] = useState(\"\");\n const [zone, setZone] = useState(deviceZone);\n const [useHours, setUseHours] = useState(false);\n const [days, setDays] = useState<Record<Weekday, DayRow>>(defaultDays);\n const [busy, setBusy] = useState(false);\n\n useEffect(() => {\n if (mineLoading) return;\n setMessage(mine?.awayMessage ?? \"\");\n setUntil(mine?.awayUntil ? toLocalInput(new Date(mine.awayUntil)) : \"\");\n setZone(mine?.timeZone ?? deviceZone());\n setUseHours(Boolean(mine?.hours && Object.keys(mine.hours).length));\n setDays(daysFrom(mine?.hours));\n }, [mine, mineLoading]);\n\n if (mineLoading) {\n return (\n <div className={cn(\"flex flex-col gap-3\", className)} aria-busy aria-label=\"Loading availability\">\n <Skeleton className=\"h-20 w-full\" />\n <Skeleton className=\"h-40 w-full\" />\n </div>\n );\n }\n\n const badRange = useHours && WEEKDAYS.some((d) => days[d].on && days[d].from === days[d].to);\n\n const save = async () => {\n if (badRange) return;\n const hours: WorkingHours | null = useHours\n ? Object.fromEntries(\n WEEKDAYS.filter((d) => days[d].on).map((d) => {\n const kept = (mine?.hours?.[d] ?? []).slice(1);\n return [d, [[days[d].from, days[d].to] as [string, string], ...kept]];\n }),\n )\n : null;\n setBusy(true);\n try {\n await setMine({\n awayMessage: message.trim() || null,\n awayUntil: until ? new Date(until).toISOString() : null,\n timeZone: zone,\n hours,\n });\n toast.success(\"Availability saved\");\n onSaved?.();\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Couldn't save\");\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <form\n className={cn(\"flex flex-col gap-6\", className)}\n onSubmit={(e) => {\n e.preventDefault();\n void save();\n }}\n data-testid=\"genesis-chat-availability-settings\"\n >\n <fieldset className=\"flex flex-col gap-2\">\n <legend className=\"mb-1 text-sm font-semibold\">Away message</legend>\n <Label htmlFor=\"genesis-chat-away-message\" className=\"sr-only\">\n Away message\n </Label>\n <Textarea\n id=\"genesis-chat-away-message\"\n value={message}\n onChange={(e) => setMessage(e.target.value)}\n maxLength={280}\n placeholder=\"Back Monday. For anything urgent, call the office.\"\n className=\"min-h-20\"\n />\n <div className=\"flex flex-wrap items-end gap-2\">\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"genesis-chat-away-until\" className=\"text-xs text-muted-foreground\">\n Away until (optional)\n </Label>\n <Input id=\"genesis-chat-away-until\" type=\"datetime-local\" value={until} onChange={(e) => setUntil(e.target.value)} className=\"w-56\" />\n </div>\n {until || message ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n setUntil(\"\");\n setMessage(\"\");\n }}\n >\n I'm back\n </Button>\n ) : null}\n </div>\n </fieldset>\n\n <fieldset className=\"flex flex-col gap-3\">\n <legend className=\"mb-1 flex w-full items-center justify-between gap-2 text-sm font-semibold\">\n <span>Working hours</span>\n </legend>\n <div className=\"flex items-center justify-between gap-3\">\n <Label htmlFor=\"genesis-chat-use-hours\" className=\"text-sm font-normal text-muted-foreground\">\n Tell people when you usually reply\n </Label>\n <Switch id=\"genesis-chat-use-hours\" checked={useHours} onCheckedChange={setUseHours} />\n </div>\n {useHours ? (\n <div className=\"flex flex-col gap-1.5\" role=\"group\" aria-label=\"Hours per day\">\n {WEEKDAYS.map((d) => (\n <div key={d} className=\"flex flex-wrap items-center gap-2 text-sm\" data-testid={`genesis-chat-hours-${d}`}>\n <Switch\n checked={days[d].on}\n onCheckedChange={(on) => setDays((x) => ({ ...x, [d]: { ...x[d], on } }))}\n aria-label={`Working on ${DAY_NAMES[d]}`}\n />\n <span className={cn(\"w-24\", !days[d].on && \"text-muted-foreground\")}>{DAY_NAMES[d]}</span>\n {days[d].on ? (\n <>\n <Input\n type=\"time\"\n value={days[d].from}\n onChange={(e) => setDays((x) => ({ ...x, [d]: { ...x[d], from: e.target.value } }))}\n aria-label={`${DAY_NAMES[d]} from`}\n className=\"h-8 w-28\"\n />\n <span aria-hidden>–</span>\n <Input\n type=\"time\"\n value={days[d].to}\n onChange={(e) => setDays((x) => ({ ...x, [d]: { ...x[d], to: e.target.value } }))}\n aria-label={`${DAY_NAMES[d]} to`}\n className=\"h-8 w-28\"\n />\n </>\n ) : (\n <span className=\"text-xs text-muted-foreground\">Not working</span>\n )}\n </div>\n ))}\n {badRange ? (\n <p className=\"text-xs text-destructive\" role=\"alert\">\n A day's start and end can't be the same time.\n </p>\n ) : (\n <p className=\"text-xs text-muted-foreground\">An end before the start runs past midnight.</p>\n )}\n </div>\n ) : null}\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"genesis-chat-time-zone\" className=\"text-xs text-muted-foreground\">\n Time zone\n </Label>\n <Select value={zone} onValueChange={setZone}>\n <SelectTrigger id=\"genesis-chat-time-zone\" className=\"w-72\" aria-label=\"Time zone\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent className=\"max-h-72\">\n {(zones.includes(zone) ? zones : [zone, ...zones]).map((z) => (\n <SelectItem key={z} value={z}>\n {z.replace(/_/g, \" \")}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </fieldset>\n\n <div>\n <Button type=\"submit\" loading={busy} disabled={badRange} data-testid=\"genesis-chat-availability-save\">\n Save\n </Button>\n </div>\n </form>\n );\n}\n","/**\n * @feat:chat\n * Voice notes on the web: MediaRecorder (Opus in WebM, else MP4/AAC for\n * Safari), with an AnalyserNode read every 100 ms for a live level meter and,\n * at the end, the waveform the bubble draws before the audio loads.\n */\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { CHAT_LIMITS, fileExtension, waveformPeaks } from \"../core/media\";\nimport type { LocalFile } from \"../core/outbox\";\n\nexport type VoiceRecorderState = \"idle\" | \"requesting\" | \"recording\" | \"denied\" | \"unsupported\" | \"error\";\n\nexport interface VoiceRecording {\n blob: Blob;\n /** The container's type without codec parameters, e.g. `audio/webm`. */\n contentType: string;\n name: string;\n durationMs: number;\n /** 48 peaks, 0–100. */\n waveform: number[];\n}\n\nexport interface UseVoiceRecorderOptions {\n /** The longest recording; it stops itself there (`recordingLimitMs(role)`). Default five minutes. */\n maxMs?: number;\n /** Called about every 100 ms while recording (e.g. to tell the others). */\n onTick?: () => void;\n /** Called with the recording when it stopped itself at `maxMs`. */\n onLimit?: (recording: VoiceRecording) => void;\n}\n\nconst SAMPLE_MS = 100;\nconst METER_BARS = 32;\n\n/** The type to record in: Opus in WebM where the browser has it, else MP4 (Safari). */\nexport function pickVoiceMimeType(): string | null {\n if (typeof MediaRecorder === \"undefined\") return null;\n for (const type of [\"audio/webm;codecs=opus\", \"audio/mp4\", \"audio/webm\"]) {\n try {\n if (MediaRecorder.isTypeSupported(type)) return type;\n } catch {\n // Older browsers throw on unknown types.\n }\n }\n return \"\";\n}\n\n/** A recording as a file the outbox sends: a voice attachment with its duration and waveform. */\nexport function voiceFile(recording: VoiceRecording): LocalFile {\n return {\n data: recording.blob,\n name: recording.name,\n contentType: recording.contentType,\n previewUrl: typeof URL !== \"undefined\" && URL.createObjectURL ? URL.createObjectURL(recording.blob) : undefined,\n meta: { kind: \"voice\", durationMs: recording.durationMs, waveform: recording.waveform, bytes: recording.blob.size },\n };\n}\n\nexport function useVoiceRecorder(options: UseVoiceRecorderOptions = {}) {\n const maxMs = options.maxMs ?? CHAT_LIMITS.recordingMs;\n const [state, setState] = useState<VoiceRecorderState>(\"idle\");\n const [elapsedMs, setElapsedMs] = useState(0);\n const [levels, setLevels] = useState<number[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n const opts = useRef(options);\n opts.current = options;\n const session = useRef<{\n recorder: MediaRecorder;\n stream: MediaStream;\n context: AudioContext | null;\n timer: ReturnType<typeof setInterval>;\n chunks: Blob[];\n samples: number[];\n startedAt: number;\n mimeType: string;\n discard: boolean;\n done: Promise<VoiceRecording | null>;\n } | null>(null);\n\n const cleanup = useCallback(() => {\n const s = session.current;\n if (!s) return;\n clearInterval(s.timer);\n for (const t of s.stream.getTracks()) t.stop();\n void s.context?.close().catch(() => undefined);\n session.current = null;\n }, []);\n\n const stop = useCallback(async (): Promise<VoiceRecording | null> => {\n const s = session.current;\n if (!s) return null;\n if (s.recorder.state !== \"inactive\") s.recorder.stop();\n return s.done;\n }, []);\n\n // Cancel while the browser still asks for the microphone: the answer is dropped.\n const abandoned = useRef(false);\n\n const cancel = useCallback(() => {\n const s = session.current;\n if (!s) {\n abandoned.current = true;\n setState((st) => (st === \"requesting\" ? \"idle\" : st));\n return;\n }\n s.discard = true;\n if (s.recorder.state !== \"inactive\") s.recorder.stop();\n else cleanup();\n }, [cleanup]);\n\n const start = useCallback(async () => {\n if (session.current) return;\n const mimeType = pickVoiceMimeType();\n if (mimeType === null || typeof navigator === \"undefined\" || !navigator.mediaDevices?.getUserMedia) {\n setState(\"unsupported\");\n setError(\"This browser can't record voice messages.\");\n return;\n }\n setState(\"requesting\");\n setError(null);\n abandoned.current = false;\n let stream: MediaStream;\n try {\n stream = await navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true } });\n } catch (e) {\n const name = (e as { name?: string })?.name;\n if (name === \"NotAllowedError\" || name === \"SecurityError\") {\n setState(\"denied\");\n setError(\"Microphone access is blocked. Allow it for this site in your browser's settings to record voice messages.\");\n } else if (name === \"NotFoundError\") {\n setState(\"error\");\n setError(\"No microphone was found.\");\n } else {\n setState(\"error\");\n setError(\"The microphone couldn't be started.\");\n }\n return;\n }\n if (abandoned.current) {\n for (const t of stream.getTracks()) t.stop();\n return;\n }\n\n let recorder: MediaRecorder;\n try {\n recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);\n } catch {\n for (const t of stream.getTracks()) t.stop();\n setState(\"unsupported\");\n setError(\"This browser can't record voice messages.\");\n return;\n }\n\n let context: AudioContext | null = null;\n let analyser: AnalyserNode | null = null;\n try {\n const Ctx = window.AudioContext ?? (window as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (Ctx) {\n context = new Ctx();\n analyser = context.createAnalyser();\n analyser.fftSize = 1024;\n context.createMediaStreamSource(stream).connect(analyser);\n }\n } catch {\n context = null;\n analyser = null;\n }\n const buffer = analyser ? new Float32Array(analyser.fftSize) : null;\n\n const chunks: Blob[] = [];\n const samples: number[] = [];\n const startedAt = Date.now();\n let resolveDone!: (r: VoiceRecording | null) => void;\n const done = new Promise<VoiceRecording | null>((r) => (resolveDone = r));\n\n const timer = setInterval(() => {\n const s = session.current;\n if (!s) return;\n let level = 0;\n if (analyser && buffer) {\n analyser.getFloatTimeDomainData(buffer);\n for (let i = 0; i < buffer.length; i++) level = Math.max(level, Math.abs(buffer[i]!));\n }\n s.samples.push(level);\n setLevels((prev) => [...prev, level].slice(-METER_BARS));\n const elapsed = Date.now() - s.startedAt;\n setElapsedMs(elapsed);\n opts.current.onTick?.();\n if (elapsed >= maxMs && s.recorder.state === \"recording\") {\n void stop().then((r) => r && opts.current.onLimit?.(r));\n }\n }, SAMPLE_MS);\n\n recorder.ondataavailable = (e) => {\n if (e.data && e.data.size > 0) chunks.push(e.data);\n };\n recorder.onstop = () => {\n const s = session.current;\n const discard = s?.discard ?? true;\n const durationMs = Math.min(maxMs, Date.now() - startedAt);\n const contentType = (recorder.mimeType || mimeType || \"audio/webm\").split(\";\")[0]!.trim();\n cleanup();\n setState(\"idle\");\n setElapsedMs(0);\n setLevels([]);\n if (discard || chunks.length === 0) {\n resolveDone(null);\n return;\n }\n const blob = new Blob(chunks, { type: contentType });\n const ext = fileExtension(\"\", contentType) || \"webm\";\n resolveDone({\n blob,\n contentType,\n name: `voice-${new Date(startedAt).toISOString().replace(/[:.]/g, \"-\")}.${ext}`,\n durationMs,\n waveform: waveformPeaks(samples, 48),\n });\n };\n\n session.current = { recorder, stream, context, timer, chunks, samples, startedAt, mimeType: mimeType ?? \"\", discard: false, done };\n recorder.start(250);\n setElapsedMs(0);\n setLevels([]);\n setState(\"recording\");\n }, [cleanup, maxMs, stop]);\n\n // Leaving the screen mid-recording throws the recording away.\n useEffect(() => () => {\n const s = session.current;\n if (s) {\n s.discard = true;\n try {\n if (s.recorder.state !== \"inactive\") s.recorder.stop();\n } catch {\n // already stopped\n }\n clearInterval(s.timer);\n for (const t of s.stream.getTracks()) t.stop();\n void s.context?.close().catch(() => undefined);\n session.current = null;\n }\n }, []);\n\n return {\n state,\n recording: state === \"recording\",\n elapsedMs,\n maxMs,\n /** The latest levels, 0–1, newest last: a live meter. */\n levels,\n error,\n clearError: () => {\n setError(null);\n setState((s) => (s === \"denied\" || s === \"error\" || s === \"unsupported\" ? \"idle\" : s));\n },\n start,\n stop,\n cancel,\n };\n}\n\nexport type VoiceRecorder = ReturnType<typeof useVoiceRecorder>;\n","/**\n * @feat:chat\n * The composer: a growing text box (Enter sends, Shift+Enter is a new line;\n * on touch screens Enter is a new line), photos and files from a picker, a\n * paste or a drop, with previews to remove before sending, a reply banner,\n * internal notes for observers, voice notes recorded in place, videos from the\n * camera, emoji, and scheduled send (the arrow beside Send). Where you may not\n * post it says why instead; when who you are couldn't load, it offers a retry.\n */\nimport {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type ChangeEvent,\n type ClipboardEvent,\n type KeyboardEvent,\n type ReactNode,\n type Ref,\n} from \"react\";\nimport { CalendarClock, FileText, Lock, Mic, Paperclip, RefreshCw, SendHorizontal, Smile, Trash2, Video, X } from \"lucide-react\";\nimport {\n Alert,\n AlertDescription,\n Button,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Skeleton,\n Textarea,\n Toggle,\n Tooltip,\n cn,\n toast,\n} from \"@marktiderman/genesis-ui\";\nimport { scheduleLabel } from \"../core/extras\";\nimport { CHAT_LIMITS, attachmentKindFor, fileExtension, formatDuration, isAllowedExtension, randomId, recordingLimitMs } from \"../core/media\";\nimport type { LocalFile } from \"../core/outbox\";\nimport { parseMentions, previewText } from \"../core/thread\";\nimport type { ChatMessage } from \"../core/types\";\nimport { useChat, useScheduled, type ConversationState } from \"../react/index\";\nimport { ChatEmojiPicker, canPickEmoji } from \"./emoji-picker\";\nimport type { ResolveUser } from \"./format\";\nimport { ChatScheduleMenu, ChatScheduledList } from \"./schedule\";\nimport { ChatVideoRecorder } from \"./video\";\nimport { useVoiceRecorder, voiceFile } from \"./use-voice-recorder\";\n\nexport interface ChatComposerHandle {\n /** Adds files as if picked (a drop on the thread, say). Refused ones get a toast. */\n addFiles(files: File[] | FileList): void;\n /** Puts text at the cursor. */\n insertText(text: string): void;\n focus(): void;\n}\n\nexport interface ChatComposerProps {\n /** From `useConversation`: how to send, and whether you may. */\n conversation: Pick<ConversationState, \"send\" | \"signalTyping\" | \"signalRecording\" | \"role\" | \"canPost\" | \"accessLoading\" | \"conversation\"> &\n Partial<Pick<ConversationState, \"accessError\" | \"refetchAccess\" | \"signalRecordingVideo\" | \"conversationLoading\">>;\n /** The message being replied to; a banner shows above the box. */\n replyTo?: ChatMessage | null;\n onCancelReply?: () => void;\n /** Names the replied-to person. */\n resolveUser?: ResolveUser;\n placeholder?: string;\n /** Extra controls beside the attach button (the `composerAccessory` slot of ChatThread). */\n accessory?: ReactNode;\n /** Called after a message is queued. */\n onSent?: () => void;\n autoFocus?: boolean;\n /** Shown instead of the box, with a lock (a closed topic). */\n disabledReason?: string | null;\n /** The topic new messages go to (scheduled ones too). */\n topic?: string | null;\n /** Offer scheduled send (the arrow beside Send) and list what's scheduled. Default true. */\n scheduling?: boolean;\n /** Offer video recording. Default true where the browser can record. */\n video?: boolean;\n /** Offer the emoji picker (only when `emojibaseUrl` is given). Default true. */\n emoji?: boolean;\n /** Where the emoji picker loads its data from. */\n emojibaseUrl?: string;\n className?: string;\n ref?: Ref<ChatComposerHandle>;\n}\n\ninterface Draft {\n id: string;\n file: File;\n previewUrl: string | null;\n kind: string;\n}\n\nconst isTouch = () => typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(\"(pointer: coarse)\").matches;\nconst objectUrl = (f: Blob) => (typeof URL !== \"undefined\" && typeof URL.createObjectURL === \"function\" ? URL.createObjectURL(f) : null);\nconst revoke = (u: string | null) => {\n if (u && typeof URL !== \"undefined\" && typeof URL.revokeObjectURL === \"function\") URL.revokeObjectURL(u);\n};\nconst MAX_HEIGHT = 160;\n\nexport function ChatComposer({\n conversation: state,\n replyTo,\n onCancelReply,\n resolveUser,\n placeholder = \"Message\",\n accessory,\n onSent,\n autoFocus,\n disabledReason,\n topic,\n scheduling = true,\n video = true,\n emoji = true,\n emojibaseUrl,\n className,\n ref,\n}: ChatComposerProps) {\n const { userId: me, videoUpload } = useChat();\n const conversationId = state.conversation?.id ?? null;\n const scheduled = useScheduled(conversationId, { enabled: scheduling && Boolean(conversationId) });\n const [recordingVideo, setRecordingVideo] = useState(false);\n const [emojiOpen, setEmojiOpen] = useState(false);\n const canRecordVideo = video && typeof MediaRecorder !== \"undefined\" && typeof navigator !== \"undefined\" && Boolean(navigator.mediaDevices?.getUserMedia);\n const [text, setText] = useState(\"\");\n const [drafts, setDrafts] = useState<Draft[]>([]);\n const [internal, setInternal] = useState(false);\n const textarea = useRef<HTMLTextAreaElement>(null);\n const picker = useRef<HTMLInputElement>(null);\n const draftsRef = useRef(drafts);\n draftsRef.current = drafts;\n // One clientId per scheduled draft, kept until it is scheduled, so pressing Schedule again\n // after a timeout (the server may have saved it) never schedules it twice.\n const scheduleId = useRef<string | null>(null);\n const [schedulingNow, setSchedulingNow] = useState(false);\n const schedulingRef = useRef(false);\n\n const recorder = useVoiceRecorder({\n maxMs: recordingLimitMs(state.role),\n onTick: state.signalRecording,\n onLimit: (rec) => {\n void sendVoice(rec);\n toast.info(`Voice messages stop at ${formatDuration(recordingLimitMs(state.role))}. Sent.`);\n },\n });\n\n // Previews not sent are freed when the composer goes.\n useEffect(() => () => draftsRef.current.forEach((d) => revoke(d.previewUrl)), []);\n\n const autosize = useCallback(() => {\n const el = textarea.current;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = `${Math.min(el.scrollHeight, MAX_HEIGHT)}px`;\n }, []);\n useEffect(autosize, [text, autosize]);\n\n useEffect(() => {\n if (replyTo) textarea.current?.focus();\n }, [replyTo]);\n\n const addFiles = useCallback((list: File[] | FileList) => {\n const files = Array.from(list);\n if (files.length === 0) return;\n const next: Draft[] = [];\n let room = CHAT_LIMITS.attachmentsPerMessage - draftsRef.current.length;\n for (const file of files) {\n const ext = fileExtension(file.name, file.type);\n if (!isAllowedExtension(ext)) {\n toast.error(`${file.name} can't be sent`, { description: \"Photos, videos, audio, PDFs and office documents can.\" });\n continue;\n }\n const type = file.type || \"application/octet-stream\";\n const kind = attachmentKindFor(type);\n const limit = kind === \"video\" ? CHAT_LIMITS.videoBytes : CHAT_LIMITS.fileBytes;\n if (file.size > limit) {\n toast.error(`${file.name} is too big`, { description: `The limit is ${Math.round(limit / 1024 / 1024)} MB.` });\n continue;\n }\n if (room <= 0) {\n toast.error(`Up to ${CHAT_LIMITS.attachmentsPerMessage} files per message`);\n break;\n }\n room -= 1;\n next.push({ id: randomId(), file, kind, previewUrl: kind === \"image\" || kind === \"video\" ? objectUrl(file) : null });\n }\n if (next.length) setDrafts((d) => [...d, ...next]);\n }, []);\n\n const insertText = useCallback((value: string) => {\n const el = textarea.current;\n setText((t) => {\n if (!el) return t + value;\n const start = el.selectionStart ?? t.length;\n const end = el.selectionEnd ?? t.length;\n return t.slice(0, start) + value + t.slice(end);\n });\n el?.focus();\n }, []);\n\n useImperativeHandle(ref, () => ({ addFiles, insertText, focus: () => textarea.current?.focus() }), [addFiles, insertText]);\n\n const removeDraft = (id: string) =>\n setDrafts((d) => {\n const gone = d.find((x) => x.id === id);\n revoke(gone?.previewUrl ?? null);\n return d.filter((x) => x.id !== id);\n });\n\n const common = () => ({\n replyToId: replyTo?.id ?? null,\n visibility: internal ? (\"observers\" as const) : (\"everyone\" as const),\n ...(topic ? { topic } : {}),\n });\n\n const scheduleAt = async (at: Date) => {\n const body = text.trim();\n if ((!body && drafts.length === 0) || !conversationId || schedulingRef.current) return;\n schedulingRef.current = true;\n setSchedulingNow(true);\n scheduleId.current ??= randomId();\n const files: LocalFile[] = drafts.map((d) => ({\n data: d.file,\n name: d.file.name,\n contentType: d.file.type || \"application/octet-stream\",\n meta: { kind: d.kind, bytes: d.file.size, name: d.file.name },\n }));\n try {\n await scheduled.schedule(\n { conversationId, clientId: scheduleId.current, body, mentions: parseMentions(body), replyToId: replyTo?.id ?? null, topic: topic ?? null, sendAt: at },\n files,\n );\n scheduleId.current = null;\n setText(\"\");\n drafts.forEach((d) => revoke(d.previewUrl));\n setDrafts([]);\n onCancelReply?.();\n toast.success(`Scheduled for ${scheduleLabel(at)}`);\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Couldn't schedule it\");\n } finally {\n schedulingRef.current = false;\n setSchedulingNow(false);\n }\n };\n\n const submit = () => {\n const body = text.trim();\n if (!body && drafts.length === 0) return;\n if (body.length > CHAT_LIMITS.bodyChars) {\n toast.error(`Messages can be up to ${CHAT_LIMITS.bodyChars.toLocaleString()} characters`);\n return;\n }\n const files: LocalFile[] = drafts.map((d) => ({\n data: d.file,\n name: d.file.name,\n contentType: d.file.type || \"application/octet-stream\",\n previewUrl: d.previewUrl ?? undefined,\n meta: { kind: d.kind, bytes: d.file.size, name: d.file.name },\n }));\n void state.send({ body, mentions: parseMentions(body), ...common() }, files);\n setText(\"\");\n setDrafts([]);\n onCancelReply?.();\n onSent?.();\n textarea.current?.focus();\n };\n\n async function sendVoice(rec: Awaited<ReturnType<typeof recorder.stop>>) {\n if (!rec) return;\n if (rec.durationMs < 700) {\n toast.info(\"Hold on a little longer to record a voice message\");\n return;\n }\n await state.send({ body: \"\", ...common() }, [voiceFile(rec)]);\n onCancelReply?.();\n onSent?.();\n }\n\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing && !isTouch()) {\n e.preventDefault();\n submit();\n } else if (e.key === \"Escape\" && replyTo) {\n onCancelReply?.();\n }\n };\n\n const onChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n setText(e.target.value);\n if (e.target.value) state.signalTyping();\n };\n\n const onPaste = (e: ClipboardEvent<HTMLTextAreaElement>) => {\n const files = Array.from(e.clipboardData?.files ?? []);\n if (files.length) {\n e.preventDefault();\n addFiles(files);\n }\n };\n\n // Loading who you are in this conversation.\n if (state.accessLoading) {\n return (\n <div className={cn(\"border-t p-3\", className)} aria-busy>\n <Skeleton className=\"h-10 w-full rounded-2xl\" />\n </div>\n );\n }\n\n if (state.accessError) {\n return (\n <div className={cn(\"flex items-center justify-center gap-2 border-t p-3 text-sm text-muted-foreground\", className)} role=\"alert\" data-testid=\"genesis-chat-access-error\">\n <span>Couldn't check whether you can post here.</span>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"h-7 gap-1\" onClick={() => void state.refetchAccess?.()} data-testid=\"genesis-chat-access-retry\">\n <RefreshCw className=\"size-3.5\" aria-hidden /> Try again\n </Button>\n </div>\n );\n }\n\n // Who may post depends on the conversation's settings: wait for them rather than say the wrong reason.\n if (!state.canPost && state.conversationLoading) {\n return (\n <div className={cn(\"border-t p-3\", className)} aria-busy>\n <Skeleton className=\"h-10 w-full rounded-2xl\" />\n </div>\n );\n }\n\n if (state.canPost && disabledReason) {\n return (\n <div className={cn(\"border-t p-3 text-center text-sm text-muted-foreground\", className)} role=\"status\" data-testid=\"genesis-chat-composer-disabled\">\n <Lock className=\"mr-1 inline size-3.5 align-[-2px]\" aria-hidden />\n {disabledReason}\n </div>\n );\n }\n\n if (!state.canPost) {\n const adminsOnly = state.conversation?.settings?.who_posts === \"admins\";\n return (\n <div className={cn(\"border-t p-3 text-center text-sm text-muted-foreground\", className)} role=\"status\" data-testid=\"genesis-chat-cannot-post\">\n <Lock className=\"mr-1 inline size-3.5 align-[-2px]\" aria-hidden />\n {adminsOnly ? \"Only admins can post here\" : \"You can't post in this conversation\"}\n </div>\n );\n }\n\n const hasContent = text.trim().length > 0 || drafts.length > 0;\n const replyName = replyTo?.senderId ? (replyTo.senderId === me ? \"yourself\" : (resolveUser?.(replyTo.senderId).name ?? \"message\")) : \"message\";\n\n return (\n <div className={cn(\"border-t bg-background\", className)} data-testid=\"genesis-chat-composer\">\n {recorder.error ? (\n <Alert variant=\"destructive\" className=\"m-2 w-auto\" data-testid=\"genesis-chat-mic-error\">\n <Mic className=\"size-4\" aria-hidden />\n <AlertDescription className=\"flex items-start justify-between gap-2\">\n <span>{recorder.error}</span>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-6 shrink-0\" onClick={recorder.clearError} aria-label=\"Dismiss\">\n <X />\n </Button>\n </AlertDescription>\n </Alert>\n ) : null}\n {replyTo ? (\n <div className=\"flex items-center gap-2 border-b px-3 py-2\" data-testid=\"genesis-chat-reply-banner\">\n <div className=\"min-w-0 flex-1 border-l-4 border-primary pl-2\">\n <div className=\"text-xs font-semibold text-primary\">Replying to {replyName}</div>\n <div className=\"truncate text-xs text-muted-foreground\">{previewText(replyTo.body, replyTo.attachments[0]?.kind ?? null, Boolean(replyTo.deletedAt))}</div>\n </div>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 shrink-0\" onClick={onCancelReply} aria-label=\"Cancel reply\">\n <X />\n </Button>\n </div>\n ) : null}\n {scheduling && scheduled.items.length ? (\n <div className=\"flex items-center px-3 pt-1.5\">\n <Popover>\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"h-6 gap-1 px-2 text-xs text-muted-foreground\" data-testid=\"genesis-chat-scheduled-count\">\n <CalendarClock className=\"size-3.5\" aria-hidden />\n {scheduled.items.length === 1 ? \"1 scheduled message\" : `${scheduled.items.length} scheduled messages`}\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-80 p-0\">\n <ChatScheduledList conversationId={conversationId} />\n </PopoverContent>\n </Popover>\n </div>\n ) : null}\n {drafts.length ? (\n <ul className=\"flex gap-2 overflow-x-auto px-3 pt-3\" aria-label=\"Attachments to send\">\n {drafts.map((d) => (\n <li key={d.id} className=\"relative shrink-0\">\n {d.kind === \"image\" && d.previewUrl ? (\n <img src={d.previewUrl} alt={d.file.name} className=\"size-16 rounded-lg border object-cover\" />\n ) : d.kind === \"video\" && d.previewUrl ? (\n <video src={d.previewUrl} muted playsInline preload=\"metadata\" className=\"size-16 rounded-lg border object-cover\" aria-label={d.file.name} />\n ) : (\n <span className=\"flex h-16 w-40 items-center gap-2 rounded-lg border bg-muted px-2 text-xs\">\n <FileText className=\"size-4 shrink-0\" aria-hidden />\n <span className=\"line-clamp-2 break-all\">{d.file.name}</span>\n </span>\n )}\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"secondary\"\n className=\"absolute -right-1.5 -top-1.5 size-5 rounded-full border shadow-sm [&_svg]:size-3\"\n onClick={() => removeDraft(d.id)}\n aria-label={`Remove ${d.file.name}`}\n >\n <X />\n </Button>\n </li>\n ))}\n </ul>\n ) : null}\n\n {recorder.recording || recorder.state === \"requesting\" ? (\n <div className=\"flex items-center gap-2 p-2\" data-testid=\"genesis-chat-recording\">\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"shrink-0 rounded-full text-destructive hover:text-destructive\" onClick={recorder.cancel} aria-label=\"Cancel recording\">\n <Trash2 />\n </Button>\n <span className=\"size-2.5 shrink-0 animate-pulse rounded-full bg-destructive\" aria-hidden />\n <span className=\"w-24 shrink-0 text-sm tabular-nums\" role=\"timer\" aria-live=\"off\">\n {formatDuration(recorder.elapsedMs)}\n <span className=\"text-muted-foreground\"> / {formatDuration(recorder.maxMs)}</span>\n </span>\n <span className=\"flex h-8 flex-1 items-center justify-end gap-[2px] overflow-hidden\" aria-hidden>\n {recorder.levels.map((l, i) => (\n <span key={i} className=\"w-[3px] shrink-0 rounded-full bg-primary\" style={{ height: `${Math.max(10, Math.min(100, l * 140))}%` }} />\n ))}\n </span>\n <span className=\"sr-only\" role=\"status\">\n {recorder.state === \"requesting\" ? \"Asking for the microphone\" : \"Recording a voice message\"}\n </span>\n <Button\n type=\"button\"\n size=\"icon\"\n className=\"shrink-0 rounded-full\"\n disabled={!recorder.recording}\n onClick={() => void recorder.stop().then(sendVoice)}\n aria-label=\"Send voice message\"\n data-testid=\"genesis-chat-voice-send\"\n >\n <SendHorizontal />\n </Button>\n </div>\n ) : (\n <div className=\"flex items-end gap-1 p-2\">\n <input\n ref={picker}\n type=\"file\"\n multiple\n className=\"hidden\"\n tabIndex={-1}\n aria-hidden\n accept=\"image/*,video/*,audio/*,.pdf,.txt,.csv,.docx,.xlsx,.pptx,.heic,.heif\"\n onChange={(e) => {\n if (e.target.files) addFiles(e.target.files);\n e.target.value = \"\";\n }}\n data-testid=\"genesis-chat-file-input\"\n />\n <Tooltip content=\"Attach photos or files\">\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"shrink-0 rounded-full text-muted-foreground\" onClick={() => picker.current?.click()} aria-label=\"Attach photos or files\">\n <Paperclip />\n </Button>\n </Tooltip>\n {canRecordVideo && conversationId ? (\n <Tooltip content=\"Record a video\">\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"shrink-0 rounded-full text-muted-foreground\" onClick={() => setRecordingVideo(true)} aria-label=\"Record a video\" data-testid=\"genesis-chat-video-button\">\n <Video />\n </Button>\n </Tooltip>\n ) : null}\n {accessory}\n {state.role === \"observer\" ? (\n <Tooltip content={internal ? \"Internal note: only observers see it\" : \"Write an internal note\"}>\n <Toggle\n pressed={internal}\n onPressedChange={setInternal}\n aria-label=\"Internal note\"\n size=\"sm\"\n className=\"h-10 shrink-0 rounded-full data-[state=on]:bg-warning/20\"\n >\n <Lock className=\"size-4\" />\n </Toggle>\n </Tooltip>\n ) : null}\n <Textarea\n ref={textarea}\n rows={1}\n value={text}\n onChange={onChange}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n placeholder={internal ? \"Internal note\" : placeholder}\n aria-label={internal ? \"Internal note\" : placeholder}\n autoFocus={autoFocus}\n maxLength={CHAT_LIMITS.bodyChars}\n enterKeyHint=\"send\"\n className={cn(\n \"max-h-40 min-h-10 flex-1 resize-none rounded-2xl py-2 leading-snug\",\n internal && \"border-warning/60 bg-warning/10\",\n )}\n data-testid=\"genesis-chat-input\"\n />\n {emoji && canPickEmoji(emojibaseUrl) ? (\n <Popover open={emojiOpen} onOpenChange={setEmojiOpen}>\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"shrink-0 rounded-full text-muted-foreground\" aria-label=\"Add emoji\" data-testid=\"genesis-chat-emoji-button\">\n <Smile />\n </Button>\n </PopoverTrigger>\n <PopoverContent side=\"top\" align=\"end\" className=\"w-auto overflow-hidden p-0\" onCloseAutoFocus={(e) => { e.preventDefault(); textarea.current?.focus(); }}>\n <ChatEmojiPicker\n emojibaseUrl={emojibaseUrl}\n onSelect={(e) => {\n insertText(e);\n setEmojiOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n ) : null}\n {hasContent ? (\n <>\n <Button type=\"button\" size=\"icon\" className=\"shrink-0 rounded-full\" onClick={submit} aria-label=\"Send\" data-testid=\"genesis-chat-send\">\n <SendHorizontal />\n </Button>\n {scheduling && conversationId && !internal ? <ChatScheduleMenu onSchedule={(at) => void scheduleAt(at)} disabled={schedulingNow} /> : null}\n </>\n ) : (\n <Tooltip content=\"Record a voice message\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"shrink-0 rounded-full text-muted-foreground\"\n onClick={() => void recorder.start()}\n aria-label=\"Record a voice message\"\n data-testid=\"genesis-chat-mic\"\n >\n <Mic />\n </Button>\n </Tooltip>\n )}\n </div>\n )}\n {canRecordVideo && conversationId ? (\n <ChatVideoRecorder\n open={recordingVideo}\n onOpenChange={setRecordingVideo}\n conversationId={conversationId}\n maxMs={recordingLimitMs(state.role)}\n send={(input, files) => state.send({ ...input, ...common() }, files)}\n videoUpload={videoUpload}\n onTick={state.signalRecordingVideo ?? state.signalRecording}\n onSent={() => {\n onCancelReply?.();\n onSent?.();\n }}\n />\n ) : null}\n </div>\n );\n}\n","/**\n * @feat:chat\n * The topic bar: \"All\" and each of a conversation's topics as a single-choice toggle group\n * (Radix: arrow keys move between them), a lock on closed ones, and, for owners and admins, a\n * menu to start a topic and to close or reopen the one open. ChatThread shows it when the\n * conversation has topics.\n */\nimport { useState } from \"react\";\nimport { Hash, Lock, LockOpen, MoreHorizontal, Plus } from \"lucide-react\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Input,\n Label,\n ToggleGroup,\n ToggleGroupItem,\n cn,\n toast,\n} from \"@marktiderman/genesis-ui\";\nimport { topicKey } from \"../core/extras\";\nimport type { ChatTopic, TopicInput } from \"../core/types\";\n\nexport interface ChatTopicBarProps {\n topics: ChatTopic[];\n /** The topic shown; null for \"All\". */\n value: string | null;\n onValueChange: (topic: string | null) => void;\n /** Owners and admins: \"New topic\", and close or reopen. */\n canManage?: boolean;\n /** Saves a topic (from useTopics). */\n onSetTopic?: (topic: string, input: TopicInput) => Promise<void>;\n className?: string;\n}\n\nconst ALL = \"__all__\";\n\nexport function ChatTopicBar({ topics, value, onValueChange, canManage = false, onSetTopic, className }: ChatTopicBarProps) {\n const [creating, setCreating] = useState(false);\n const [title, setTitle] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const current = value ? topics.find((t) => t.topic === value) : undefined;\n\n const create = async () => {\n const name = title.trim();\n if (!name || !onSetTopic) return;\n const key = topicKey(name);\n if (topics.some((t) => t.topic === key)) {\n toast.error(\"There's already a topic with that name\");\n return;\n }\n setBusy(true);\n try {\n await onSetTopic(key, { title: name, position: topics.length });\n setCreating(false);\n setTitle(\"\");\n onValueChange(key);\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Couldn't add the topic\");\n } finally {\n setBusy(false);\n }\n };\n\n const toggleClosed = async (t: ChatTopic) => {\n try {\n await onSetTopic?.(t.topic, { closed: !t.closedAt });\n toast.success(t.closedAt ? `Reopened ${t.title}` : `Closed ${t.title}`);\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Couldn't change the topic\");\n }\n };\n\n return (\n <div className={cn(\"flex items-center gap-1 border-b px-2 py-1.5\", className)} data-testid=\"genesis-chat-topic-bar\">\n <ToggleGroup\n type=\"single\"\n value={value ?? ALL}\n onValueChange={(v) => {\n // A single toggle group clears on a second click; keep a choice instead.\n if (v) onValueChange(v === ALL ? null : v);\n }}\n aria-label=\"Topics\"\n className=\"flex min-w-0 flex-1 justify-start gap-1 overflow-x-auto [scrollbar-width:none]\"\n >\n <ToggleGroupItem value={ALL} size=\"sm\" className=\"h-7 shrink-0 rounded-full px-3 text-xs\" data-testid=\"genesis-chat-topic-all\">\n All\n </ToggleGroupItem>\n {topics.map((t) => (\n <ToggleGroupItem\n key={t.topic}\n value={t.topic}\n size=\"sm\"\n className=\"h-7 shrink-0 gap-1 rounded-full px-3 text-xs\"\n aria-label={t.closedAt ? `${t.title} (closed)` : t.title}\n data-testid={`genesis-chat-topic-${t.topic}`}\n >\n {t.closedAt ? <Lock className=\"size-3\" aria-hidden /> : <Hash className=\"size-3 opacity-60\" aria-hidden />}\n <span className=\"max-w-[10rem] truncate\">{t.title}</span>\n </ToggleGroupItem>\n ))}\n </ToggleGroup>\n {canManage && onSetTopic ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 shrink-0 rounded-full\" aria-label=\"Topic options\" data-testid=\"genesis-chat-topic-menu\">\n <MoreHorizontal />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuItem className=\"gap-2\" onSelect={() => setCreating(true)} data-testid=\"genesis-chat-topic-new\">\n <Plus className=\"size-4\" aria-hidden /> New topic\n </DropdownMenuItem>\n {current ? (\n <DropdownMenuItem className=\"gap-2\" onSelect={() => void toggleClosed(current)} data-testid=\"genesis-chat-topic-close\">\n {current.closedAt ? <LockOpen className=\"size-4\" aria-hidden /> : <Lock className=\"size-4\" aria-hidden />}\n {current.closedAt ? \"Reopen topic\" : \"Close topic\"}\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n\n <Dialog open={creating} onOpenChange={(o) => !busy && setCreating(o)}>\n <DialogContent className=\"sm:max-w-sm\">\n <DialogHeader>\n <DialogTitle>New topic</DialogTitle>\n <DialogDescription>Messages posted in a topic stay together, under its name.</DialogDescription>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n void create();\n }}\n >\n <Label htmlFor=\"genesis-chat-topic-title\">Name</Label>\n <Input id=\"genesis-chat-topic-title\" value={title} onChange={(e) => setTitle(e.target.value)} maxLength={160} autoFocus placeholder=\"Week 1: Habits\" />\n <DialogFooter className=\"mt-2\">\n <Button type=\"button\" variant=\"outline\" onClick={() => setCreating(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" loading={busy} disabled={!title.trim()} data-testid=\"genesis-chat-topic-create\">\n Add topic\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","/**\n * @feat:chat\n * One conversation, whole: a header, the messages (oldest at the top, kept at\n * the bottom as new ones arrive unless you scrolled up, then a \"New messages\"\n * pill; earlier ones load as you reach the top without moving what you were\n * reading), day dividers and the \"New\" line, who is typing, and the composer.\n * Files dropped anywhere on it attach. Screen readers hear incoming messages.\n * With topics, a topic bar filters it; when the other person is away or outside\n * their hours a banner says so; search (in the header) jumps to a message,\n * loading earlier ones as needed; links get preview cards.\n */\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type DragEvent,\n type ReactNode,\n} from \"react\";\nimport { ArrowDown, ArrowLeft, ImagePlus, MessageSquare, Pin, Search } from \"lucide-react\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n EmptyState,\n Label,\n RadioGroup,\n RadioGroupItem,\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n Skeleton,\n Spinner,\n Textarea,\n UserAvatar,\n cn,\n toast,\n} from \"@marktiderman/genesis-ui\";\nimport { renderSlot, type SlotOverride } from \"@marktiderman/genesis-core/slots\";\nimport { ChatError } from \"../core/client\";\nimport { extractLinks } from \"../core/extras\";\nimport { activityLine, dayLabel, itemSender, itemTime, parseMentions, previewText, startsDay, startsGroup, type ThreadItem } from \"../core/thread\";\nimport type { ChatConversation, ChatMember, ChatMessage, ChatRole, ChatSearchHit } from \"../core/types\";\nimport { useAvailability, useChat, useConversation, useFileUrls, useLinkPreviews, useMessageActions, usePins, useTopics } from \"../react/index\";\nimport { awaySummary } from \"../core/availability\";\nimport type { ChatAttachmentSlotProps } from \"./attachments\";\nimport { MessageRow, plainText } from \"./bubble\";\nimport { ChatAwayBanner } from \"./availability\";\nimport type { LinkPreviewImages } from \"./cards\";\nimport { ChatErrorBoundary } from \"./error-boundary\";\nimport { ChatComposer, type ChatComposerHandle } from \"./composer\";\nimport type { ResolveUser } from \"./format\";\nimport { ChatSearch } from \"./search\";\nimport { ChatTopicBar } from \"./topics\";\nimport { QUICK_REACTIONS, ThreadContext, type ThreadContextValue } from \"./thread-context\";\n\nexport interface ChatThreadHeaderProps {\n conversationId: string;\n conversation: ChatConversation | null;\n /** The title the thread worked out (the conversation's, or the other person's name). */\n title: string;\n /** How many people are in it, for a group. */\n subtitle: string | null;\n /** \"Sam is typing…\" while someone is. */\n activity: string | null;\n /** The other person in a two-person conversation. */\n otherUserId: string | null;\n members: ChatMember[];\n role: ChatRole | null;\n resolveUser: ResolveUser;\n onBack?: () => void;\n backClassName?: string;\n /** Opens search in this conversation (absent when search is off). */\n onSearch?: () => void;\n}\n\nexport interface ChatThreadEmptyProps {\n conversationId: string;\n canPost: boolean;\n}\n\nexport interface ChatComposerAccessoryProps {\n conversationId: string;\n insertText(text: string): void;\n addFiles(files: File[]): void;\n}\n\nexport interface ChatThreadSlots {\n /** The bar above the messages. */\n header?: SlotOverride<ChatThreadHeaderProps>;\n /** What a conversation with no messages shows. */\n empty?: SlotOverride<ChatThreadEmptyProps>;\n /** Draws the app's own attachment kinds (form, lesson…); a generic card by default, `null` hides them. */\n attachment?: ComponentType<ChatAttachmentSlotProps> | null;\n /** Extra controls in the composer, beside the attach button. */\n composerAccessory?: SlotOverride<ChatComposerAccessoryProps>;\n}\n\nexport interface ChatThreadProps {\n conversationId: string;\n /** Names people. Required: the package knows no people tables, the app does. */\n resolveUser: ResolveUser;\n /** The header's title; worked out from the conversation and its members by default. */\n title?: string;\n /** Shows a back button in the header. */\n onBack?: () => void;\n /** Classes for that back button (ChatPanel hides it on wide screens). */\n backClassName?: string;\n /** One thread's replies instead of the main timeline. */\n threadRootId?: string;\n /** One topic's messages. */\n topic?: string;\n /** Shown on messages that have replies, to open their thread. */\n onOpenThread?: (message: ChatMessage) => void;\n /** The quick reactions; 👍 ❤️ 😂 😮 😢 🙏 by default. */\n quickReactions?: readonly string[];\n placeholder?: string;\n /** Show the topic bar even before the first topic exists (so an owner can add one). */\n showTopics?: boolean;\n /** Scroll to this message once it's loaded (a search result across conversations); `seq` lets earlier pages load to reach it. */\n jumpTo?: { messageId: string; seq?: number } | null;\n /** A search button in the header. Default true. */\n search?: boolean;\n /** Scheduled send in the composer. Default true. */\n scheduling?: boolean;\n /** The away banner. Default true. */\n availability?: boolean;\n /** Where the emoji picker loads its data from (self-hosted emojibase-data). Without it there is no full picker; the quick reactions stay. */\n emojibaseUrl?: string;\n /** Link preview images: `\"off\"` by default, `\"proxy\"` through `linkPreviewProxyUrl`, or `\"direct\"` from the linked site (which then sees readers' IPs). */\n linkPreviewImages?: LinkPreviewImages;\n /** Your image proxy for `linkPreviewImages: \"proxy\"`: the URL to load for an og:image. */\n linkPreviewProxyUrl?: (url: string) => string | null | undefined;\n slots?: ChatThreadSlots;\n className?: string;\n}\n\nconst REPORT_REASONS = [\n { value: \"spam\", label: \"Spam\" },\n { value: \"harassment\", label: \"Harassment or bullying\" },\n { value: \"safety\", label: \"Someone may be at risk\" },\n { value: \"other\", label: \"Something else\" },\n] as const;\n\ntype ReportReason = (typeof REPORT_REASONS)[number][\"value\"];\n\nconst itemKey = (item: ThreadItem) => (item.type === \"message\" ? item.message.clientId || item.message.id : item.pending.clientId);\n\nfunction errorText(e: unknown): string {\n if (e instanceof ChatError) {\n if (e.forbidden) return \"You can't do that here\";\n if (e.rateLimited) return \"Slow down a little and try again\";\n if (e.transient) return \"Check your connection and try again\";\n }\n return e instanceof Error ? e.message : \"Something went wrong\";\n}\n\nfunction DefaultHeader({ title, subtitle, otherUserId, resolveUser, onBack, backClassName, onSearch }: ChatThreadHeaderProps) {\n const other = otherUserId ? resolveUser(otherUserId) : null;\n return (\n <header className=\"flex min-h-14 items-center gap-3 border-b px-3 py-2\" data-testid=\"genesis-chat-thread-header\">\n {onBack ? (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className={cn(\"-ml-1 shrink-0\", backClassName)} onClick={onBack} aria-label=\"Back to conversations\">\n <ArrowLeft />\n </Button>\n ) : null}\n <UserAvatar name={title} src={other?.avatarUrl} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-sm font-semibold leading-tight\">{title}</h2>\n {subtitle ? <p className=\"truncate text-xs text-muted-foreground\">{subtitle}</p> : null}\n </div>\n {onSearch ? (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"shrink-0\" onClick={onSearch} aria-label=\"Search this conversation\" data-testid=\"genesis-chat-thread-search\">\n <Search />\n </Button>\n ) : null}\n </header>\n );\n}\n\nfunction DefaultEmpty({ canPost }: ChatThreadEmptyProps) {\n return <EmptyState icon={MessageSquare} title=\"No messages yet\" description={canPost ? \"Say hello.\" : undefined} />;\n}\n\nexport function ChatThread({\n conversationId,\n resolveUser,\n title: titleProp,\n onBack,\n backClassName,\n threadRootId,\n topic: topicProp,\n onOpenThread,\n quickReactions = QUICK_REACTIONS,\n placeholder,\n showTopics,\n jumpTo: jumpToProp,\n search = true,\n scheduling = true,\n availability = true,\n emojibaseUrl,\n linkPreviewImages = \"off\",\n linkPreviewProxyUrl,\n slots,\n className,\n}: ChatThreadProps) {\n const { userId: me, attachmentKinds } = useChat();\n const topicsState = useTopics(threadRootId ? null : conversationId);\n const [chosenTopic, setChosenTopic] = useState<string | null>(null);\n const topic = topicProp ?? chosenTopic ?? undefined;\n const state = useConversation(conversationId, { threadRootId, topic });\n const actions = useMessageActions();\n const pinIds = usePins(conversationId);\n const { items, messages, members, role, canPost, conversation, activity } = state;\n\n const paths = useMemo(\n () => messages.flatMap((m) => m.attachments.flatMap((a) => [a.path, a.posterPath])).filter((p): p is string => Boolean(p)),\n [messages],\n );\n const urls = useFileUrls(paths);\n const byId = useMemo(() => new Map(messages.map((m) => [m.id, m])), [messages]);\n const pins = useMemo(() => new Set(pinIds), [pinIds]);\n\n const [replyTo, setReplyTo] = useState<ChatMessage | null>(null);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [highlightedId, setHighlightedId] = useState<string | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<ChatMessage | null>(null);\n const [reporting, setReporting] = useState<ChatMessage | null>(null);\n const [dragging, setDragging] = useState(false);\n const [newCount, setNewCount] = useState(0);\n const [announcement, setAnnouncement] = useState(\"\");\n const composer = useRef<ChatComposerHandle | null>(null);\n\n // A different conversation starts clean.\n useEffect(() => {\n setReplyTo(null);\n setEditingId(null);\n setNewCount(0);\n setChosenTopic(null);\n }, [conversationId]);\n\n const topics = topicsState.topics;\n const currentTopic = topic ? topics.find((t) => t.topic === topic) : undefined;\n const canManageTopics = role === \"owner\" || role === \"admin\";\n const showTopicBar = !threadRootId && topicProp === undefined && (topics.length > 0 || (showTopics && canManageTopics));\n const topicClosed = Boolean(currentTopic?.closedAt) && role !== \"owner\" && role !== \"admin\" && role !== \"observer\";\n\n const linkMessageIds = useMemo(\n () => messages.filter((m) => !m.deletedAt && m.moderation !== \"hidden\" && extractLinks(m.body).length > 0).map((m) => m.id),\n [messages],\n );\n const previews = useLinkPreviews(linkMessageIds);\n const avail = useAvailability(availability ? conversationId : null);\n const [searching, setSearching] = useState(false);\n\n const nameOf = useCallback((id: string) => (id === me ? \"You\" : resolveUser(id).name), [me, resolveUser]);\n const others = members.filter((m) => m.userId !== me);\n const otherUserId = members.length === 2 && others.length === 1 ? others[0]!.userId : null;\n const isGroup = members.length > 2 || role === \"observer\";\n const title =\n titleProp ??\n conversation?.title ??\n (otherUserId\n ? resolveUser(otherUserId).name\n : others.length\n ? others.length <= 3\n ? others.map((m) => resolveUser(m.userId).name).join(\", \")\n : `${others.slice(0, 2).map((m) => resolveUser(m.userId).name).join(\", \")} and ${others.length - 2} others`\n : \"Conversation\");\n // Someone who just posted has stopped typing, whatever their last signal said.\n const arrived = useRef(new Map<string, number>());\n const live = activityLine(\n activity.filter((a) => a.at > (arrived.current.get(a.userId) ?? 0)),\n (id) => resolveUser(id).name,\n );\n const subtitle = members.length > 2 ? `${members.length} members` : null;\n\n // The away line: the other person in a two-person conversation; in a group, everyone away or outside their hours.\n const awayPeople = useMemo(() => {\n if (!availability) return null;\n const ids = otherUserId ? [otherUserId] : members.filter((m) => m.userId !== me).map((m) => m.userId);\n const people = ids.flatMap((id) => {\n const a = avail.forUser(id);\n return a ? [{ availability: a, name: resolveUser(id).name }] : [];\n });\n return awaySummary(people) ? people : null;\n }, [availability, otherUserId, members, me, avail, resolveUser]);\n\n // ---- scrolling ------------------------------------------------------------\n const scroller = useRef<HTMLDivElement>(null);\n const content = useRef<HTMLDivElement>(null);\n const atBottom = useRef(true);\n const initialised = useRef<string | null>(null);\n const edges = useRef<{ first: string | null; last: string | null }>({ first: null, last: null });\n const anchor = useRef<{ height: number; top: number } | null>(null);\n\n const scrollToBottom = useCallback((smooth = false) => {\n const el = scroller.current;\n if (!el) return;\n if (smooth && typeof el.scrollTo === \"function\") el.scrollTo({ top: el.scrollHeight, behavior: \"smooth\" });\n else el.scrollTop = el.scrollHeight;\n atBottom.current = true;\n setNewCount(0);\n }, []);\n\n useLayoutEffect(() => {\n const el = scroller.current;\n if (!el || items.length === 0) return;\n const first = itemKey(items[0]!);\n const lastItem = items[items.length - 1]!;\n const last = itemKey(lastItem);\n const prev = edges.current;\n edges.current = { first, last };\n\n if (initialised.current !== conversationId) {\n initialised.current = conversationId;\n const unread = state.firstUnreadId ? document.getElementById(`genesis-chat-msg-${state.firstUnreadId}`) : null;\n if (unread && typeof unread.scrollIntoView === \"function\") unread.scrollIntoView({ block: \"center\" });\n else scrollToBottom();\n return;\n }\n if (anchor.current && first !== prev.first) {\n el.scrollTop = el.scrollHeight - anchor.current.height + anchor.current.top;\n anchor.current = null;\n }\n if (last !== prev.last) {\n const mine = itemSender(lastItem) === me;\n if (atBottom.current || mine) scrollToBottom();\n else setNewCount((n) => n + 1);\n if (!mine && lastItem.type === \"message\" && lastItem.message.kind !== \"system\") {\n const m = lastItem.message;\n if (m.senderId) arrived.current.set(m.senderId, Date.now());\n setAnnouncement(`${m.senderId ? resolveUser(m.senderId).name : \"Someone\"}: ${previewText(m.body, m.attachments[0]?.kind ?? null, Boolean(m.deletedAt))}`);\n }\n }\n }, [items, conversationId, me, resolveUser, scrollToBottom, state.firstUnreadId]);\n\n const hasItems = items.length > 0;\n // Photos and previews that load later grow the thread: stay at the bottom if you were there.\n useEffect(() => {\n const el = content.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => {\n if (atBottom.current && scroller.current) scroller.current.scrollTop = scroller.current.scrollHeight;\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [hasItems]);\n\n const { hasEarlier, loadingEarlier, loadEarlier } = state;\n const loadOlder = useCallback(() => {\n const el = scroller.current;\n if (!el || !hasEarlier || loadingEarlier) return;\n anchor.current = { height: el.scrollHeight, top: el.scrollTop };\n void loadEarlier().catch((e) => toast.error(errorText(e)));\n }, [hasEarlier, loadingEarlier, loadEarlier]);\n\n const onScroll = () => {\n const el = scroller.current;\n if (!el) return;\n const bottom = el.scrollHeight - el.scrollTop - el.clientHeight < 80;\n atBottom.current = bottom;\n if (bottom && newCount) setNewCount(0);\n if (el.scrollTop < 200) loadOlder();\n };\n\n const jumpTo = useCallback((id: string) => {\n const el = document.getElementById(`genesis-chat-msg-${id}`);\n if (!el) {\n toast.info(\"That message is further up\", { description: \"Scroll up to load it.\" });\n return;\n }\n if (typeof el.scrollIntoView === \"function\") el.scrollIntoView({ block: \"center\", behavior: \"smooth\" });\n setHighlightedId(id);\n setTimeout(() => setHighlightedId((h) => (h === id ? null : h)), 1600);\n }, []);\n\n // A message to reach: loads earlier pages until it is here (leaving a topic it isn't in), then scrolls to it.\n type Jump = { messageId: string; seq?: number; phase: \"new\" | \"loading\" | \"loaded\" };\n const [pendingJump, setPendingJump] = useState<Jump | null>(jumpToProp ? { ...jumpToProp, phase: \"new\" } : null);\n useEffect(() => {\n if (jumpToProp) setPendingJump({ ...jumpToProp, phase: \"new\" });\n }, [jumpToProp?.messageId, jumpToProp?.seq]); // eslint-disable-line react-hooks/exhaustive-deps\n const { loadUntil } = state;\n useEffect(() => {\n if (!pendingJump || state.isLoading) return;\n const { messageId, seq, phase } = pendingJump;\n if (byId.has(messageId)) {\n setPendingJump(null);\n // After the rows it needs have rendered.\n requestAnimationFrame(() => jumpTo(messageId));\n return;\n }\n if (phase === \"loading\") return;\n if (phase === \"loaded\" || seq == null) {\n setPendingJump(null);\n toast.info(\"That message isn't here any more\");\n return;\n }\n setPendingJump({ messageId, seq, phase: \"loading\" });\n const settle = () => setPendingJump((p) => (p && p.messageId === messageId ? { ...p, phase: \"loaded\" } : p));\n void loadUntil(seq).then(settle, (e) => {\n toast.error(errorText(e));\n settle();\n });\n }, [pendingJump, byId, state.isLoading, loadUntil, jumpTo]);\n\n const openHit = useCallback(\n (hit: ChatSearchHit) => {\n setSearching(false);\n if (topic && topicProp === undefined) setChosenTopic(null);\n setPendingJump({ messageId: hit.messageId, seq: hit.seq, phase: \"new\" });\n },\n [topic, topicProp],\n );\n\n // ---- actions --------------------------------------------------------------\n const run = useCallback(async (p: Promise<unknown>, done?: string) => {\n try {\n await p;\n if (done) toast.success(done);\n } catch (e) {\n toast.error(errorText(e));\n }\n }, []);\n\n const ctx: ThreadContextValue = {\n me,\n resolveUser,\n role,\n isGroup,\n canModerate: role === \"owner\" || role === \"admin\",\n canPin: role === \"owner\" || role === \"admin\" || members.length === 2,\n canPost,\n pins,\n urls,\n byId,\n quickReactions,\n attachmentSlot: slots?.attachment,\n attachmentKinds,\n previews,\n emojibaseUrl,\n linkPreviewImages,\n linkPreviewProxyUrl,\n highlightedId,\n editingId,\n reply: (m) => {\n setReplyTo(m);\n composer.current?.focus();\n },\n focusComposer: () => composer.current?.focus(),\n startEdit: setEditingId,\n saveEdit: async (m, body) => {\n try {\n await actions.edit(m, body, parseMentions(body));\n } catch (e) {\n toast.error(errorText(e));\n throw e;\n }\n },\n askDelete: setConfirmDelete,\n askReport: setReporting,\n react: (m, emoji, on) => void run(actions.react(m, emoji, on)),\n pin: (m, on) => void run(actions.pin(m, on), on ? \"Pinned\" : \"Unpinned\"),\n save: (m) => void run(actions.save(m, true), \"Saved\"),\n copy: (m) => {\n const text = plainText(m.body);\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) void run(navigator.clipboard.writeText(text), \"Copied\");\n else toast.error(\"Copying isn't available here\");\n },\n jumpTo,\n retry: (clientId) => void state.retry(clientId),\n discard: (clientId) => void state.discard(clientId),\n openThread: onOpenThread,\n };\n\n // ---- drag and drop --------------------------------------------------------\n const hasFiles = (e: DragEvent) => Array.from(e.dataTransfer?.types ?? []).includes(\"Files\");\n const dropProps = canPost\n ? {\n onDragOver: (e: DragEvent<HTMLDivElement>) => {\n if (!hasFiles(e)) return;\n e.preventDefault();\n if (!dragging) setDragging(true);\n },\n onDragLeave: (e: DragEvent<HTMLDivElement>) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) setDragging(false);\n },\n onDrop: (e: DragEvent<HTMLDivElement>) => {\n if (!hasFiles(e)) return;\n e.preventDefault();\n setDragging(false);\n composer.current?.addFiles(e.dataTransfer.files);\n },\n }\n : {};\n\n // ---- render ---------------------------------------------------------------\n const pinnedMessage = pinIds.length ? byId.get(pinIds[pinIds.length - 1]!) : undefined;\n let body: ReactNode;\n if (state.isLoading) {\n body = (\n <div className=\"flex flex-col gap-3 p-4\" aria-busy aria-label=\"Loading messages\" data-testid=\"genesis-chat-thread-loading\">\n {[40, 60, 30, 50].map((w, i) => (\n <Skeleton key={i} className={cn(\"h-9 rounded-2xl\", i % 2 ? \"self-end\" : \"self-start\")} style={{ width: `${w}%` }} />\n ))}\n </div>\n );\n } else if (state.error && items.length === 0) {\n body = (\n <EmptyState\n icon={MessageSquare}\n title=\"Couldn't load this conversation\"\n description={errorText(state.error)}\n action={\n <Button type=\"button\" variant=\"outline\" onClick={() => void state.refetch()}>\n Try again\n </Button>\n }\n />\n );\n } else if (items.length === 0) {\n body = renderSlot(DefaultEmpty, slots?.empty, { conversationId, canPost });\n } else {\n body = (\n <div ref={content} className=\"flex min-h-full flex-col justify-end pb-2 pt-1\">\n {hasEarlier ? (\n <div className=\"flex justify-center py-2\">\n {loadingEarlier ? (\n <Spinner size=\"sm\" aria-label=\"Loading earlier messages\" />\n ) : (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs text-muted-foreground\" onClick={loadOlder}>\n Load earlier messages\n </Button>\n )}\n </div>\n ) : null}\n {items.map((item, i) => {\n const id = item.type === \"message\" ? item.message.id : null;\n return (\n <div key={itemKey(item)}>\n {startsDay(items, i) ? (\n <div className=\"sticky top-1 z-10 flex justify-center py-2\" role=\"separator\" aria-label={dayLabel(itemTime(item))}>\n <span className=\"rounded-full border bg-background/95 px-3 py-0.5 text-xs font-medium text-muted-foreground shadow-sm\">{dayLabel(itemTime(item))}</span>\n </div>\n ) : null}\n {id && id === state.firstUnreadId ? (\n <div className=\"my-2 flex items-center gap-2 px-4\" role=\"separator\" aria-label=\"New messages\" data-testid=\"genesis-chat-new-line\">\n <span className=\"h-px flex-1 bg-primary/40\" />\n <span className=\"text-xs font-semibold text-primary\">New</span>\n <span className=\"h-px flex-1 bg-primary/40\" />\n </div>\n ) : null}\n <ChatErrorBoundary\n fallback={\n <p className=\"px-4 py-1 text-xs italic text-muted-foreground\" role=\"note\" data-testid=\"genesis-chat-row-error\">\n This message couldn't be shown.\n </p>\n }\n >\n <MessageRow item={item} startsGroup={startsGroup(items, i)} />\n </ChatErrorBoundary>\n </div>\n );\n })}\n </div>\n );\n }\n\n return (\n <ThreadContext.Provider value={ctx}>\n <section\n className={cn(\"relative flex h-full min-h-0 flex-col bg-background\", className)}\n aria-label={title}\n data-testid=\"genesis-chat-thread\"\n {...dropProps}\n >\n {renderSlot(DefaultHeader, slots?.header, {\n conversationId,\n conversation,\n title,\n subtitle,\n activity: live,\n otherUserId,\n members,\n role,\n resolveUser,\n onBack,\n backClassName,\n onSearch: search && !threadRootId ? () => setSearching(true) : undefined,\n })}\n {showTopicBar ? (\n <ChatTopicBar\n topics={topics}\n value={topic ?? null}\n onValueChange={setChosenTopic}\n canManage={canManageTopics}\n onSetTopic={topicsState.setTopic}\n />\n ) : null}\n {awayPeople ? <ChatAwayBanner people={awayPeople} /> : null}\n {pinnedMessage ? (\n <button\n type=\"button\"\n onClick={() => jumpTo(pinnedMessage.id)}\n className=\"flex items-center gap-2 border-b bg-muted/40 px-3 py-1.5 text-left text-xs hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\"\n aria-label={`Pinned message: ${previewText(pinnedMessage.body, pinnedMessage.attachments[0]?.kind ?? null, Boolean(pinnedMessage.deletedAt))}. Show it`}\n >\n <Pin className=\"size-3.5 shrink-0 text-primary\" aria-hidden />\n <span className=\"truncate\">{previewText(pinnedMessage.body, pinnedMessage.attachments[0]?.kind ?? null, Boolean(pinnedMessage.deletedAt))}</span>\n {pinIds.length > 1 ? <span className=\"ml-auto shrink-0 text-muted-foreground\">+{pinIds.length - 1}</span> : null}\n </button>\n ) : null}\n\n <div className=\"relative min-h-0 flex-1\">\n {/* A plain scroller, not ScrollArea: the thread sets scrollTop to keep your place as earlier messages load, and needs the element that scrolls. */}\n <div ref={scroller} onScroll={onScroll} className=\"h-full overflow-y-auto overscroll-contain\" role=\"log\" aria-live=\"off\" aria-label=\"Messages\" data-testid=\"genesis-chat-scroller\">\n {body}\n </div>\n {newCount > 0 ? (\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"absolute bottom-3 left-1/2 h-8 -translate-x-1/2 rounded-full shadow-md\"\n onClick={() => scrollToBottom(true)}\n data-testid=\"genesis-chat-new-pill\"\n >\n New messages <ArrowDown />\n </Button>\n ) : null}\n {dragging ? (\n <div className=\"pointer-events-none absolute inset-2 flex flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-primary bg-background/90 text-sm font-medium text-primary\">\n <ImagePlus className=\"size-6\" aria-hidden />\n Drop to attach\n </div>\n ) : null}\n </div>\n\n <div className=\"h-5 px-4 text-xs italic text-muted-foreground\" data-testid=\"genesis-chat-activity\">\n {live ? (\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"inline-flex gap-0.5\" aria-hidden>\n <span className=\"size-1 animate-bounce rounded-full bg-muted-foreground [animation-delay:-0.3s]\" />\n <span className=\"size-1 animate-bounce rounded-full bg-muted-foreground [animation-delay:-0.15s]\" />\n <span className=\"size-1 animate-bounce rounded-full bg-muted-foreground\" />\n </span>\n {live}\n </span>\n ) : null}\n </div>\n <div className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\" data-testid=\"genesis-chat-announcer\">\n {announcement}\n </div>\n\n <ChatComposer\n ref={composer}\n conversation={state}\n replyTo={replyTo}\n onCancelReply={() => setReplyTo(null)}\n resolveUser={resolveUser}\n placeholder={currentTopic ? `Message #${currentTopic.title}` : placeholder}\n topic={topic ?? null}\n disabledReason={topicClosed ? \"This topic is closed\" : null}\n scheduling={scheduling}\n emojibaseUrl={emojibaseUrl}\n accessory={renderSlot(EmptyAccessory, slots?.composerAccessory, {\n conversationId,\n insertText: (t) => composer.current?.insertText(t),\n addFiles: (f) => composer.current?.addFiles(f),\n })}\n />\n </section>\n\n {search && !threadRootId ? (\n <Sheet open={searching} onOpenChange={setSearching}>\n <SheetContent side=\"right\" className=\"flex w-full flex-col gap-0 p-0 sm:max-w-md\">\n <SheetHeader className=\"border-b px-4 py-3\">\n <SheetTitle>Search</SheetTitle>\n <SheetDescription className=\"sr-only\">Search this conversation and jump to a message.</SheetDescription>\n </SheetHeader>\n <ChatSearch conversationId={conversationId} resolveUser={resolveUser} onOpen={openHit} autoFocus className=\"min-h-0 flex-1\" />\n </SheetContent>\n </Sheet>\n ) : null}\n\n <AlertDialog open={confirmDelete !== null} onOpenChange={(o) => !o && setConfirmDelete(null)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete this message?</AlertDialogTitle>\n <AlertDialogDescription>\n {confirmDelete?.senderId === me ? \"It's deleted for everyone in the conversation.\" : \"It's deleted for everyone in the conversation, including the person who sent it.\"}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n onClick={() => {\n const m = confirmDelete;\n setConfirmDelete(null);\n if (m) void run(actions.remove(m));\n }}\n data-testid=\"genesis-chat-confirm-delete\"\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n\n <ReportDialog\n message={reporting}\n onClose={() => setReporting(null)}\n onSubmit={async (m, reason, note) => {\n await run(actions.report(m, reason, note || undefined), \"Reported. Thank you.\");\n setReporting(null);\n }}\n />\n </ThreadContext.Provider>\n );\n}\n\nfunction EmptyAccessory(_props: ChatComposerAccessoryProps) {\n return null;\n}\n\nfunction ReportDialog({\n message,\n onClose,\n onSubmit,\n}: {\n message: ChatMessage | null;\n onClose: () => void;\n onSubmit: (m: ChatMessage, reason: ReportReason, note: string) => Promise<void>;\n}) {\n const [reason, setReason] = useState<ReportReason>(\"spam\");\n const [note, setNote] = useState(\"\");\n const [busy, setBusy] = useState(false);\n useEffect(() => {\n if (message) {\n setReason(\"spam\");\n setNote(\"\");\n }\n }, [message]);\n return (\n <Dialog open={message !== null} onOpenChange={(o) => !o && onClose()}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Report this message</DialogTitle>\n <DialogDescription>The people who look after this conversation see your report and the messages around it.</DialogDescription>\n </DialogHeader>\n <RadioGroup value={reason} onValueChange={(v) => setReason(v as ReportReason)} aria-label=\"Reason\">\n {REPORT_REASONS.map((r) => (\n <div key={r.value} className=\"flex items-center gap-2\">\n <RadioGroupItem value={r.value} id={`genesis-chat-report-${r.value}`} />\n <Label htmlFor={`genesis-chat-report-${r.value}`}>{r.label}</Label>\n </div>\n ))}\n </RadioGroup>\n <Textarea value={note} onChange={(e) => setNote(e.target.value)} placeholder=\"Anything else? (optional)\" aria-label=\"Details\" maxLength={1000} />\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n loading={busy}\n onClick={async () => {\n if (!message) return;\n setBusy(true);\n try {\n await onSubmit(message, reason, note.trim());\n } finally {\n setBusy(false);\n }\n }}\n >\n Report\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","/**\n * @feat:chat\n * Messages, whole: the inbox on the left and the open conversation on the\n * right (Genesis `Split`); on a narrow screen one at a time, with a back\n * button from the conversation to the inbox. Search across every conversation\n * sits above the inbox; a result opens its conversation at the message.\n */\nimport { useState, type ReactNode } from \"react\";\nimport { MessageSquare, Search, X } from \"lucide-react\";\nimport { Button, EmptyState, Split, cn } from \"@marktiderman/genesis-ui\";\nimport { renderSlot, type SlotOverride } from \"@marktiderman/genesis-core/slots\";\nimport type { ChatInboxItem } from \"../core/types\";\nimport { useInbox } from \"../react/index\";\nimport { ChatInbox, inboxTitle, type ChatInboxProps } from \"./inbox\";\nimport { ChatSearch } from \"./search\";\nimport type { ResolveUser } from \"./format\";\nimport { ChatThread, type ChatThreadProps } from \"./thread\";\n\nexport interface ChatPanelNoSelectionProps {\n /** Words under the title; \"Pick one on the left to read and reply.\" by default. */\n hint?: string;\n}\n\nexport interface ChatPanelProps {\n resolveUser: ResolveUser;\n /** The open conversation (controlled). */\n selectedId?: string | null;\n /** The conversation open at first (uncontrolled). */\n defaultSelectedId?: string | null;\n /** Called when a conversation is opened, or with null on back. Put it in the URL to make it bookmarkable. */\n onSelectedChange?: (conversationId: string | null) => void;\n /** Above the inbox list: a title, a \"New message\" button. */\n inboxHeader?: ReactNode;\n inboxProps?: Partial<Omit<ChatInboxProps, \"resolveUser\" | \"onSelect\" | \"selectedId\">>;\n threadProps?: Partial<Omit<ChatThreadProps, \"conversationId\" | \"resolveUser\" | \"onBack\">>;\n /** What the right pane shows before a conversation is chosen. */\n slots?: { noSelection?: SlotOverride<ChatPanelNoSelectionProps> };\n /** Search across every conversation, above the inbox. Default true. */\n search?: boolean;\n className?: string;\n}\n\nfunction NoSelection({ hint }: ChatPanelNoSelectionProps) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <EmptyState icon={MessageSquare} title=\"Choose a conversation\" description={hint ?? \"Pick one on the left to read and reply.\"} />\n </div>\n );\n}\n\nexport function ChatPanel({\n resolveUser,\n selectedId: controlled,\n defaultSelectedId = null,\n onSelectedChange,\n inboxHeader,\n inboxProps,\n threadProps,\n slots,\n search = true,\n className,\n}: ChatPanelProps) {\n const [own, setOwn] = useState<string | null>(defaultSelectedId);\n const [searching, setSearching] = useState(false);\n const [jump, setJump] = useState<{ messageId: string; seq?: number } | null>(null);\n const { items } = useInbox({ kind: inboxProps?.kind });\n const titleOf = (id: string) => {\n const item = items.find((i: ChatInboxItem) => i.conversationId === id);\n return item ? inboxTitle(item, resolveUser, inboxProps?.fallbackTitle) : \"a conversation\";\n };\n const selected = controlled !== undefined ? controlled : own;\n const select = (id: string | null) => {\n if (controlled === undefined) setOwn(id);\n onSelectedChange?.(id);\n };\n\n return (\n <Split\n ratio=\"1/3\"\n at=\"md\"\n gap=\"none\"\n testID=\"genesis-chat-panel\"\n className={cn(\n \"h-full min-h-0 overflow-hidden rounded-lg border bg-background\",\n \"[&>[data-slot=split-start]]:min-h-0 [&>[data-slot=split-end]]:min-h-0 max-md:[&>[data-slot]]:flex-1\",\n selected ? \"max-md:[&>[data-slot=split-start]]:hidden\" : \"max-md:[&>[data-slot=split-end]]:hidden\",\n className,\n )}\n start={\n <div className=\"flex h-full min-h-0 flex-col md:border-r\">\n {inboxHeader || search ? (\n <div className=\"flex shrink-0 items-center gap-2 border-b px-3 py-2\">\n <div className=\"min-w-0 flex-1\">{inboxHeader}</div>\n {search ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 shrink-0\"\n onClick={() => setSearching((s) => !s)}\n aria-label={searching ? \"Close search\" : \"Search messages\"}\n aria-pressed={searching}\n data-testid=\"genesis-chat-panel-search\"\n >\n {searching ? <X /> : <Search />}\n </Button>\n ) : null}\n </div>\n ) : null}\n {searching ? (\n <ChatSearch\n resolveUser={resolveUser}\n autoFocus\n conversationTitle={titleOf}\n onOpen={(hit) => {\n setJump({ messageId: hit.messageId, seq: hit.seq });\n select(hit.conversationId);\n }}\n className=\"min-h-0 flex-1\"\n />\n ) : (\n <ChatInbox {...inboxProps} resolveUser={resolveUser} selectedId={selected} onSelect={(id) => { setJump(null); select(id); }} className={cn(\"min-h-0 flex-1 overflow-y-auto\", inboxProps?.className)} />\n )}\n </div>\n }\n end={\n selected ? (\n <ChatThread key={selected} {...threadProps} jumpTo={jump} conversationId={selected} resolveUser={resolveUser} onBack={() => select(null)} backClassName=\"md:hidden\" />\n ) : (\n renderSlot(NoSelection, slots?.noSelection, {})\n )\n }\n />\n );\n}\n","/**\n * @feat:chat\n * A chat client held in memory, for demos, stories and tests: the same shape\n * as `createChatClient`, with no Supabase behind it. It also plays the other\n * side (`receive`, `activity`) so a demo looks alive.\n */\nimport { ChatError, type ChatClient, type ChatSupabase, type ConversationChannel, type ConversationHandlers, type MessagePage } from \"../core/client\";\nimport { extractLinks } from \"../core/extras\";\nimport type {\n AvailabilityInput,\n ChatActivity,\n ChatAvailability,\n ChatLinkPreview,\n ChatSearchHit,\n ChatTopic,\n ScheduleInput,\n ScheduledMessage,\n TopicInput,\n ChatAttachment,\n ChatConversation,\n ChatInboxItem,\n ChatMember,\n ChatMessage,\n ChatRole,\n ChatSignal,\n SendInput,\n} from \"../core/types\";\n\nexport interface MemoryConversationSeed {\n id: string;\n kind?: string;\n title?: string | null;\n settings?: ChatConversation[\"settings\"];\n members: { userId: string; role?: ChatRole; lastReadSeq?: number }[];\n /** Your role when you aren't a member (an observer). */\n myRole?: ChatRole | null;\n canPost?: boolean;\n muted?: boolean;\n pinned?: boolean;\n messages?: (Partial<Omit<ChatMessage, \"attachments\">> & { attachments?: Partial<ChatAttachment>[] })[];\n pins?: string[];\n /** Its topics, in order. */\n topics?: { topic: string; title?: string; closed?: boolean }[];\n}\n\nexport interface MemoryChatOptions {\n /** The signed-in user. */\n me: string;\n conversations: MemoryConversationSeed[];\n /** Signed URLs for attachment paths. */\n files?: Record<string, string>;\n /** Milliseconds each call waits, to show loading states. Default 0. */\n latencyMs?: number;\n /** Away messages and working hours, by user id. */\n availability?: Record<string, Partial<Omit<ChatAvailability, \"userId\">>>;\n /** Link previews the \"server\" has fetched. */\n linkPreviews?: Partial<ChatLinkPreview>[];\n}\n\ninterface Conv {\n conversation: ChatConversation;\n members: ChatMember[];\n myRole: ChatRole | null;\n canPost: boolean;\n muted: boolean;\n pinned: boolean;\n messages: ChatMessage[];\n pins: string[];\n topics: ChatTopic[];\n}\n\nexport type MemoryChatClient = ChatClient & {\n /** Someone else posts (a demo's other side). */\n receive(conversationId: string, senderId: string, body: string, extra?: Partial<ChatMessage>): ChatMessage;\n /** Someone else starts typing or recording. */\n activity(conversationId: string, userId: string, activity: ChatActivity[\"activity\"]): void;\n /** The next `count` sends fail as if the connection dropped. */\n failNextSends(count?: number): void;\n /** The next send waits until the returned function is called (a test watching the sending state). */\n holdNextSend(): () => void;\n /** Posts every scheduled message due by `now` (a demo's clock), as the server's runner does. */\n sendDue(now?: Date): Promise<number>;\n /** Moderation's verdict on a message (the server's side). */\n moderate(messageId: string, result: \"clean\" | \"flagged\" | \"hidden\"): void;\n /** Every call made, for tests. */\n calls: { method: string; args: unknown[] }[];\n};\n\nlet counter = 0;\nconst uuid = () =>\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto ? crypto.randomUUID() : `00000000-0000-4000-8000-${String(++counter).padStart(12, \"0\")}`;\n\nfunction attachment(messageId: string, a: Partial<ChatAttachment>, i: number): ChatAttachment {\n return {\n id: a.id ?? uuid(),\n messageId,\n position: a.position ?? i,\n kind: a.kind ?? \"file\",\n ref: a.ref ?? {},\n provider: a.provider ?? \"storage\",\n path: a.path ?? null,\n providerId: a.providerId ?? null,\n playbackId: a.playbackId ?? null,\n url: a.url ?? null,\n status: a.status ?? \"ready\",\n name: a.name ?? null,\n mime: a.mime ?? null,\n bytes: a.bytes ?? null,\n width: a.width ?? null,\n height: a.height ?? null,\n durationMs: a.durationMs ?? null,\n waveform: a.waveform ?? null,\n posterPath: a.posterPath ?? null,\n thumbhash: a.thumbhash ?? null,\n transcript: a.transcript ?? null,\n transcriptStatus: a.transcriptStatus ?? null,\n };\n}\n\nexport function createMemoryChatClient(options: MemoryChatOptions): MemoryChatClient {\n const { me } = options;\n const files: Record<string, string> = { ...(options.files ?? {}) };\n const convs = new Map<string, Conv>();\n const convListeners = new Map<string, Set<{ onSignal: (s: ChatSignal) => void; onActivity?: (a: ChatActivity) => void }>>();\n const inboxListeners = new Set<(s: ChatSignal) => void>();\n const calls: { method: string; args: unknown[] }[] = [];\n let failing = 0;\n let held: Promise<void> | null = null;\n const wait = () => new Promise<void>((r) => setTimeout(r, options.latencyMs ?? 0));\n\n const makeMessage = (c: Conv, m: Partial<Omit<ChatMessage, \"attachments\">> & { attachments?: Partial<ChatAttachment>[] }): ChatMessage => {\n const id = m.id ?? uuid();\n const seq = ++c.conversation.lastSeq;\n const createdAt = m.createdAt ?? new Date().toISOString();\n c.conversation.lastMessageAt = createdAt;\n return {\n id,\n conversationId: c.conversation.id,\n seq,\n clientId: m.clientId ?? id,\n senderId: m.senderId ?? null,\n senderRole: m.senderRole ?? (m.kind === \"system\" ? \"system\" : \"member\"),\n kind: m.kind ?? \"text\",\n body: m.body ?? \"\",\n mentions: m.mentions ?? [],\n replyToId: m.replyToId ?? null,\n threadRootId: m.threadRootId ?? null,\n threadCount: m.threadCount ?? 0,\n threadLastAt: m.threadLastAt ?? null,\n topic: m.topic ?? null,\n visibility: m.visibility ?? \"everyone\",\n silent: m.silent ?? false,\n meta: m.meta ?? {},\n createdAt,\n editedAt: m.editedAt ?? null,\n deletedAt: m.deletedAt ?? null,\n moderation: m.moderation ?? null,\n attachments: (m.attachments ?? []).map((a, i) => attachment(id, a, i)),\n reactions: m.reactions ?? [],\n };\n };\n\n for (const seed of options.conversations) {\n const c: Conv = {\n conversation: {\n id: seed.id,\n kind: seed.kind ?? (seed.members.length === 2 ? \"direct\" : \"group\"),\n title: seed.title ?? null,\n subjectType: null,\n subjectId: null,\n settings: seed.settings ?? {},\n status: null,\n assigneeId: null,\n lastSeq: 0,\n lastMessageAt: null,\n createdAt: new Date().toISOString(),\n archivedAt: null,\n },\n members: seed.members.map((m) => ({\n conversationId: seed.id,\n userId: m.userId,\n role: m.role ?? \"member\",\n lastReadSeq: m.lastReadSeq ?? 0,\n joinedAt: new Date().toISOString(),\n })),\n myRole: seed.myRole !== undefined ? seed.myRole : (seed.members.find((m) => m.userId === me)?.role ?? \"member\"),\n canPost: seed.canPost ?? true,\n muted: seed.muted ?? false,\n pinned: seed.pinned ?? false,\n messages: [],\n pins: seed.pins ?? [],\n topics: (seed.topics ?? []).map((t, i) => ({\n conversationId: seed.id,\n topic: t.topic,\n title: t.title ?? t.topic,\n position: i,\n closedAt: t.closed ? new Date().toISOString() : null,\n createdBy: null,\n createdAt: new Date().toISOString(),\n })),\n };\n for (const m of seed.messages ?? []) c.messages.push(makeMessage(c, m));\n convs.set(seed.id, c);\n }\n\n const get = (id: string) => {\n const c = convs.get(id);\n if (!c) throw new ChatError(\"Conversation not found\", \"42501\", \"conversation\");\n return c;\n };\n const findMessage = (id: string) => {\n for (const c of convs.values()) {\n const m = c.messages.find((x) => x.id === id);\n if (m) return { c, m };\n }\n throw new ChatError(\"Message not found\", \"42501\", \"message\");\n };\n const visible = (c: Conv, m: ChatMessage) =>\n (m.visibility !== \"observers\" || c.myRole === \"observer\") && (m.moderation !== \"hidden\" || m.senderId === me || c.myRole === \"observer\");\n const scheduledList: ScheduledMessage[] = [];\n const availability = new Map<string, ChatAvailability>(\n Object.entries(options.availability ?? {}).map(([userId, a]) => [\n userId,\n { userId, awayMessage: a.awayMessage ?? null, awayUntil: a.awayUntil ?? null, timeZone: a.timeZone ?? null, hours: a.hours ?? null },\n ]),\n );\n const previews = new Map<string, ChatLinkPreview>(\n (options.linkPreviews ?? []).filter((p) => p.url).map((p) => [\n p.url!,\n { url: p.url!, status: p.status ?? \"ok\", title: p.title ?? null, description: p.description ?? null, imageUrl: p.imageUrl ?? null, siteName: p.siteName ?? null, fetchedAt: p.fetchedAt ?? new Date().toISOString() },\n ]),\n );\n const clone = (m: ChatMessage): ChatMessage => ({ ...m, attachments: m.attachments.map((a) => ({ ...a })), reactions: [...m.reactions] });\n const emit = (conversationId: string, s: ChatSignal) => {\n for (const l of convListeners.get(conversationId) ?? []) l.onSignal(s);\n for (const l of inboxListeners) l({ type: \"inbox\", conversationId });\n };\n const log = (method: string, ...args: unknown[]) => calls.push({ method, args });\n\n function inboxItem(c: Conv): ChatInboxItem {\n const mine = c.members.find((m) => m.userId === me);\n const lastRead = mine?.lastReadSeq ?? 0;\n const seen = c.messages.filter((m) => visible(c, m));\n const last = seen[seen.length - 1];\n const others = c.members.filter((m) => m.userId !== me);\n const unreadList = seen.filter((m) => m.seq > lastRead && m.senderId !== me && !m.deletedAt);\n return {\n conversationId: c.conversation.id,\n kind: c.conversation.kind,\n title: c.conversation.title,\n subjectType: null,\n subjectId: null,\n status: null,\n role: c.myRole ?? \"member\",\n otherUserId: c.members.length === 2 && others.length === 1 ? others[0]!.userId : null,\n memberCount: c.members.length,\n lastSeq: c.conversation.lastSeq,\n lastReadSeq: lastRead,\n unread: Math.min(99, unreadList.length),\n mentioned: unreadList.some((m) => m.mentions.includes(me)),\n muted: c.muted,\n pinned: c.pinned,\n archived: false,\n lastMessageAt: c.conversation.lastMessageAt,\n lastMessage: last\n ? {\n id: last.id,\n seq: last.seq,\n senderId: last.senderId,\n kind: last.kind,\n body: last.body,\n deleted: Boolean(last.deletedAt),\n createdAt: last.createdAt,\n attachment: last.attachments[0]?.kind ?? null,\n }\n : null,\n };\n }\n\n const client: MemoryChatClient = {\n supabase: null as unknown as ChatSupabase,\n calls,\n\n async inbox(opts: { kind?: string; kinds?: string[]; excludeKinds?: string[]; archived?: boolean; limit?: number; before?: string } = {}) {\n log(\"inbox\", opts);\n await wait();\n if (opts.archived) return [];\n return [...convs.values()]\n .filter((c) => keepKind(c.conversation.kind, opts))\n .map(inboxItem)\n .sort((a, b) => Number(b.pinned) - Number(a.pinned) || (b.lastMessageAt ?? \"\").localeCompare(a.lastMessageAt ?? \"\"));\n },\n async observed() {\n return [];\n },\n async unreadTotal(opts: { excludeKinds?: string[] } = {}) {\n return [...convs.values()].filter((c) => keepKind(c.conversation.kind, opts)).reduce((n, c) => n + inboxItem(c).unread, 0);\n },\n async conversation(id: string) {\n await wait();\n return convs.has(id) ? { ...get(id).conversation } : null;\n },\n async kind(kind: string) {\n return { kind, label: kind, maxMembers: kind === \"direct\" ? 2 : null, whoPosts: \"members\" as const, membership: \"admins\" as const, threads: true, observersPost: false };\n },\n\n async myRole(id: string) {\n return convs.get(id)?.myRole ?? null;\n },\n async canPost(id: string) {\n return convs.get(id)?.canPost ?? false;\n },\n async members(id: string) {\n return get(id).members.map((m) => ({ ...m }));\n },\n async messages(id: string, opts: { beforeSeq?: number; afterSeq?: number; limit?: number; threadRootId?: string; topic?: string } = {}): Promise<MessagePage> {\n log(\"messages\", id, opts);\n await wait();\n const c = get(id);\n const limit = Math.min(Math.max(opts.limit ?? 50, 1), 200);\n let list = c.messages.filter((m) => visible(c, m) && (opts.threadRootId ? m.threadRootId === opts.threadRootId : m.threadRootId === null));\n if (opts.topic) list = list.filter((m) => m.topic === opts.topic);\n if (opts.afterSeq != null) return { messages: list.filter((m) => m.seq > opts.afterSeq!).slice(0, limit).map(clone), hasEarlier: false };\n if (opts.beforeSeq != null) list = list.filter((m) => m.seq < opts.beforeSeq!);\n const page = list.slice(-limit);\n return { messages: page.map(clone), hasEarlier: list.length > page.length };\n },\n async message(id: string) {\n try {\n const { c, m } = findMessage(id);\n return visible(c, m) ? clone(m) : null;\n } catch {\n return null;\n }\n },\n async startConversation(kind: string, memberIds: string[], opts: { title?: string } = {}) {\n const id = uuid();\n convs.set(id, {\n conversation: {\n id,\n kind,\n title: opts.title ?? null,\n subjectType: null,\n subjectId: null,\n settings: {},\n status: null,\n assigneeId: null,\n lastSeq: 0,\n lastMessageAt: null,\n createdAt: new Date().toISOString(),\n archivedAt: null,\n },\n members: [me, ...memberIds.filter((m) => m !== me)].map((userId) => ({ conversationId: id, userId, role: userId === me ? \"owner\" : \"member\", lastReadSeq: 0, joinedAt: new Date().toISOString() })),\n myRole: \"owner\",\n canPost: true,\n muted: false,\n pinned: false,\n messages: [],\n pins: [],\n topics: [],\n });\n for (const l of inboxListeners) l({ type: \"inbox\", conversationId: id });\n return id;\n },\n async send(input: SendInput) {\n log(\"send\", input);\n await wait();\n if (held) {\n const hold = held;\n held = null;\n await hold;\n }\n if (failing > 0) {\n failing -= 1;\n throw new ChatError(\"Failed to fetch\", undefined, \"send_message\");\n }\n const c = get(input.conversationId);\n if (!c.canPost) throw new ChatError(\"You can't post here\", \"42501\", \"send_message\");\n const topic = input.topic ? c.topics.find((t) => t.topic === input.topic) : undefined;\n if (topic?.closedAt && ![\"owner\", \"admin\", \"observer\"].includes(c.myRole ?? \"member\")) {\n throw new ChatError(\"This topic is closed\", \"42501\", \"send_message\");\n }\n const existing = c.messages.find((m) => m.clientId === input.clientId);\n if (existing) return clone(existing);\n const m = makeMessage(c, {\n clientId: input.clientId,\n senderId: me,\n senderRole: c.myRole ?? \"member\",\n body: input.body ?? \"\",\n mentions: input.mentions ?? [],\n replyToId: input.replyToId ?? null,\n threadRootId: input.threadRootId ?? null,\n topic: input.topic ?? null,\n visibility: input.visibility ?? \"everyone\",\n silent: input.silent ?? false,\n attachments: (input.attachments ?? []).map((a) => ({ ...a, durationMs: a.durationMs ?? null, transcriptStatus: a.kind === \"voice\" ? \"pending\" : null })) as Partial<ChatAttachment>[],\n });\n c.messages.push(m);\n const mine = c.members.find((x) => x.userId === me);\n if (mine) mine.lastReadSeq = m.seq;\n emit(c.conversation.id, { type: \"message\", conversationId: c.conversation.id, id: m.id, seq: m.seq, op: \"insert\" });\n return clone(m);\n },\n async edit(messageId: string, body: string, mentions: string[] = []) {\n log(\"edit\", messageId, body);\n const { c, m } = findMessage(messageId);\n if (m.senderId !== me) throw new ChatError(\"You can't edit this message\", \"42501\", \"edit_message\");\n Object.assign(m, { body, mentions, editedAt: new Date().toISOString() });\n emit(c.conversation.id, { type: \"message\", conversationId: c.conversation.id, id: m.id, op: \"update\" });\n return clone(m);\n },\n async remove(messageId: string) {\n log(\"remove\", messageId);\n const { c, m } = findMessage(messageId);\n Object.assign(m, { body: \"\", attachments: [], reactions: [], deletedAt: new Date().toISOString() });\n emit(c.conversation.id, { type: \"message\", conversationId: c.conversation.id, id: m.id, op: \"update\" });\n },\n async react(messageId: string, emoji: string, on = true) {\n log(\"react\", messageId, emoji, on);\n const { c, m } = findMessage(messageId);\n m.reactions = m.reactions.filter((r) => !(r.emoji === emoji && r.userId === me));\n if (on) m.reactions.push({ emoji, userId: me });\n emit(c.conversation.id, { type: \"reaction\", conversationId: c.conversation.id, messageId });\n },\n async markRead(conversationId: string, seq?: number) {\n const c = get(conversationId);\n const mine = c.members.find((x) => x.userId === me);\n if (mine) mine.lastReadSeq = Math.max(mine.lastReadSeq, seq ?? c.conversation.lastSeq);\n return mine?.lastReadSeq ?? 0;\n },\n async setMySettings(conversationId: string, s: { mutedUntil?: string | null; archived?: boolean; pinned?: boolean }) {\n const c = get(conversationId);\n if (s.mutedUntil !== undefined) c.muted = s.mutedUntil !== null;\n if (s.pinned !== undefined) c.pinned = s.pinned;\n },\n async updateConversation(conversationId: string, s: { title?: string; settings?: Record<string, unknown> }) {\n const c = get(conversationId);\n if (s.title !== undefined) c.conversation.title = s.title;\n if (s.settings) c.conversation.settings = { ...c.conversation.settings, ...s.settings };\n },\n async addMembers(conversationId: string, userIds: string[]) {\n const c = get(conversationId);\n for (const userId of userIds) if (!c.members.some((m) => m.userId === userId)) c.members.push({ conversationId, userId, role: \"member\", lastReadSeq: 0, joinedAt: new Date().toISOString() });\n },\n async removeMember(conversationId: string, userId?: string) {\n const c = get(conversationId);\n c.members = c.members.filter((m) => m.userId !== (userId ?? me));\n },\n async setStatus(conversationId: string, status: ChatConversation[\"status\"], assigneeId?: string | null) {\n const c = get(conversationId);\n c.conversation.status = status;\n c.conversation.assigneeId = assigneeId ?? null;\n },\n async pin(messageId: string, on = true) {\n log(\"pin\", messageId, on);\n const { c } = findMessage(messageId);\n c.pins = c.pins.filter((p) => p !== messageId);\n if (on) c.pins.push(messageId);\n emit(c.conversation.id, { type: \"conversation\", conversationId: c.conversation.id });\n },\n async pins(conversationId: string) {\n return [...(convs.get(conversationId)?.pins ?? [])];\n },\n async save(messageId: string, on = true, note?: string) {\n log(\"save\", messageId, on, note);\n },\n async report(messageId: string, reason: \"spam\" | \"harassment\" | \"safety\" | \"other\", note?: string) {\n log(\"report\", messageId, reason, note);\n return uuid();\n },\n async upload(conversationId: string, userId: string, file: Blob | ArrayBuffer, opts: { name: string; contentType: string; id?: string }) {\n log(\"upload\", conversationId, opts.name);\n await wait();\n const path = `${conversationId}/${userId}/${opts.id ?? uuid()}-${opts.name}`;\n const blob = file instanceof Blob ? file : new Blob([file], { type: opts.contentType });\n files[path] = typeof URL !== \"undefined\" && typeof URL.createObjectURL === \"function\" ? URL.createObjectURL(blob) : `memory://${path}`;\n return path;\n },\n async fileUrls(paths: string[]) {\n const out: Record<string, string> = {};\n for (const p of paths) if (files[p]) out[p] = files[p]!;\n return out;\n },\n subscribeInbox(_userId: string, onSignal: (s: ChatSignal) => void) {\n inboxListeners.add(onSignal);\n return { unsubscribe: () => void inboxListeners.delete(onSignal) };\n },\n subscribeConversation(conversationId: string, _me: string, handlers: ConversationHandlers): ConversationChannel {\n const set = convListeners.get(conversationId) ?? new Set();\n convListeners.set(conversationId, set);\n const entry = { onSignal: handlers.onSignal, onActivity: handlers.onActivity };\n set.add(entry);\n // Joins at once, as a live channel does once it is subscribed.\n setTimeout(() => {\n if (set.has(entry)) handlers.onJoin?.();\n }, 0);\n return {\n signal(activity) {\n log(\"signal\", conversationId, activity);\n },\n unsubscribe: () => void set.delete(entry),\n };\n },\n\n // ── 0002 ──\n async topics(conversationId: string) {\n log(\"topics\", conversationId);\n await wait();\n return [...(convs.get(conversationId)?.topics ?? [])].sort((a, b) => a.position - b.position || a.topic.localeCompare(b.topic)).map((t) => ({ ...t }));\n },\n async setTopic(conversationId: string, topic: string, input: TopicInput = {}) {\n log(\"setTopic\", conversationId, topic, input);\n const c = get(conversationId);\n if (c.myRole !== \"owner\" && c.myRole !== \"admin\") throw new ChatError(\"Only an owner or admin manages topics\", \"42501\", \"set_topic\");\n const key = topic.trim();\n let t = c.topics.find((x) => x.topic === key);\n if (!t) {\n t = { conversationId, topic: key, title: input.title?.trim() || key, position: input.position ?? c.topics.length, closedAt: null, createdBy: me, createdAt: new Date().toISOString() };\n c.topics.push(t);\n } else {\n if (input.title?.trim()) t.title = input.title.trim();\n if (input.position != null) t.position = input.position;\n }\n if (input.closed === true) t.closedAt ??= new Date().toISOString();\n if (input.closed === false) t.closedAt = null;\n emit(conversationId, { type: \"conversation\", conversationId });\n },\n async schedule(input: ScheduleInput) {\n log(\"schedule\", input);\n await wait();\n const c = get(input.conversationId);\n if (!c.canPost) throw new ChatError(\"You can't post in this conversation\", \"42501\", \"schedule_message\");\n const sendAt = typeof input.sendAt === \"string\" ? input.sendAt : input.sendAt.toISOString();\n const t = Date.parse(sendAt);\n if (!(t >= Date.now() + 60_000 && t <= Date.now() + 365 * 86_400_000)) throw new ChatError(\"Schedule between a minute and a year from now\", \"22023\", \"schedule_message\");\n if (!(input.body ?? \"\").trim() && !(input.attachments ?? []).length) throw new ChatError(\"A message needs text or an attachment\", \"22023\", \"schedule_message\");\n const existing = scheduledList.find((s) => s.clientId === input.clientId);\n if (existing) {\n existing.sendAt = sendAt;\n return existing.id;\n }\n const s: ScheduledMessage = {\n id: uuid(),\n conversationId: input.conversationId,\n clientId: input.clientId,\n body: input.body ?? \"\",\n attachments: input.attachments ?? [],\n replyToId: input.replyToId ?? null,\n topic: input.topic ?? null,\n mentions: input.mentions ?? [],\n silent: input.silent ?? false,\n sendAt,\n sentMessageId: null,\n cancelledAt: null,\n error: null,\n createdAt: new Date().toISOString(),\n status: \"scheduled\",\n };\n scheduledList.push(s);\n return s.id;\n },\n async scheduled(conversationId?: string) {\n log(\"scheduled\", conversationId);\n await wait();\n return scheduledList\n .filter((s) => (s.status === \"scheduled\" || s.status === \"failed\") && (!conversationId || s.conversationId === conversationId))\n .sort((a, b) => a.sendAt.localeCompare(b.sendAt))\n .map((s) => ({ ...s }));\n },\n async cancelScheduled(id: string) {\n log(\"cancelScheduled\", id);\n const s = scheduledList.find((x) => x.id === id && x.status === \"scheduled\");\n if (!s) throw new ChatError(\"Nothing to cancel\", \"22023\", \"cancel_scheduled\");\n s.cancelledAt = new Date().toISOString();\n s.status = \"cancelled\";\n },\n async availabilityFor(conversationId: string) {\n log(\"availabilityFor\", conversationId);\n const c = get(conversationId);\n return c.members.filter((m) => m.role !== \"observer\" && availability.has(m.userId)).map((m) => ({ ...availability.get(m.userId)! }));\n },\n async myAvailability() {\n const a = availability.get(me);\n return a ? { ...a } : null;\n },\n async setAvailability(input: AvailabilityInput) {\n log(\"setAvailability\", input);\n availability.set(me, {\n userId: me,\n awayMessage: input.awayMessage?.trim() || null,\n awayUntil: input.awayUntil ?? null,\n timeZone: input.timeZone ?? null,\n hours: input.hours ?? null,\n });\n },\n async broadcast(conversationIds: string[], clientId: string, body: string, opts: { silent?: boolean } = {}) {\n log(\"broadcast\", conversationIds, clientId, body);\n await wait();\n const ids: string[] = [];\n for (const id of new Set(conversationIds)) {\n const c = convs.get(id);\n if (!c?.canPost) continue;\n const m = await client.send({ conversationId: id, clientId: `${clientId}:${id}`, body, silent: opts.silent });\n ids.push(m.id);\n }\n return ids;\n },\n async search(query: string, conversationId?: string | null) {\n log(\"search\", query, conversationId);\n await wait();\n const q = query.trim().toLowerCase();\n if (q.length < 2) return [];\n const hits: ChatSearchHit[] = [];\n // As search_messages does: the text's own « and » become ‹ and ›, so only real matches are marked.\n const mark = (raw: string) => {\n const text = raw.replace(/«/g, \"‹\").replace(/»/g, \"›\");\n const i = text.toLowerCase().indexOf(q);\n const start = Math.max(0, i - 40);\n return `${start > 0 ? \"…\" : \"\"}${text.slice(start, i)}«${text.slice(i, i + q.length)}»${text.slice(i + q.length, i + q.length + 60)}`;\n };\n for (const c of convs.values()) {\n if (conversationId && c.conversation.id !== conversationId) continue;\n for (const m of c.messages) {\n if (m.deletedAt || !visible(c, m)) continue;\n const base = { messageId: m.id, conversationId: c.conversation.id, seq: m.seq, senderId: m.senderId, createdAt: m.createdAt };\n if (m.body.toLowerCase().includes(q)) hits.push({ ...base, snippet: mark(m.body), inTranscript: false });\n else {\n const t = m.attachments.find((a) => a.transcript?.toLowerCase().includes(q))?.transcript;\n if (t) hits.push({ ...base, snippet: mark(t), inTranscript: true });\n }\n }\n }\n return hits.sort((a, b) => b.createdAt.localeCompare(a.createdAt)).slice(0, 30);\n },\n async linkPreviewsFor(messageIds: string[]) {\n log(\"linkPreviewsFor\", messageIds);\n const out: Record<string, ChatLinkPreview[]> = {};\n for (const id of new Set(messageIds)) {\n let found: { c: Conv; m: ChatMessage } | null = null;\n try {\n found = findMessage(id);\n } catch {\n found = null;\n }\n // Only for a message you can read, as link_previews_for answers.\n if (!found || found.m.deletedAt || !visible(found.c, found.m)) {\n out[id] = [];\n continue;\n }\n out[id] = extractLinks(found.m.body)\n .map((u) => previews.get(u))\n .filter((p): p is ChatLinkPreview => Boolean(p && p.status === \"ok\"))\n .map((p) => ({ ...p }));\n }\n return out;\n },\n async sendDue(now = new Date()) {\n let n = 0;\n for (const s of scheduledList) {\n if (s.status !== \"scheduled\" || Date.parse(s.sendAt) > now.getTime()) continue;\n try {\n const m = await client.send({ conversationId: s.conversationId, clientId: s.clientId, body: s.body, attachments: s.attachments, replyToId: s.replyToId, topic: s.topic, mentions: s.mentions, silent: s.silent });\n s.sentMessageId = m.id;\n s.status = \"sent\";\n n += 1;\n } catch (e) {\n s.error = e instanceof Error ? e.message : String(e);\n s.status = \"failed\";\n }\n }\n return n;\n },\n moderate(messageId: string, result: \"clean\" | \"flagged\" | \"hidden\") {\n if (result === \"clean\") return;\n const { c, m } = findMessage(messageId);\n m.moderation = result;\n emit(c.conversation.id, { type: \"message\", conversationId: c.conversation.id, id: m.id, seq: m.seq, op: \"update\" });\n },\n\n receive(conversationId: string, senderId: string, body: string, extra: Partial<ChatMessage> = {}) {\n const c = get(conversationId);\n const m = makeMessage(c, { senderId, body, ...extra } as Partial<ChatMessage>);\n c.messages.push(m);\n emit(conversationId, { type: \"message\", conversationId, id: m.id, seq: m.seq, op: \"insert\" });\n return clone(m);\n },\n activity(conversationId: string, userId: string, activity: ChatActivity[\"activity\"]) {\n for (const l of convListeners.get(conversationId) ?? []) l.onActivity?.({ userId, activity, at: Date.now() });\n },\n failNextSends(count = 1) {\n failing = count;\n },\n holdNextSend() {\n let release!: () => void;\n held = new Promise<void>((r) => (release = r));\n return () => release();\n },\n };\n return client;\n}\n\nfunction keepKind(kind: string, opts: { kind?: string; kinds?: string[]; excludeKinds?: string[] }): boolean {\n if (opts.kind && kind !== opts.kind) return false;\n if (opts.kinds?.length && !opts.kinds.includes(kind)) return false;\n return !opts.excludeKinds?.includes(kind);\n}\n","/**\n * @feat:chat\n * `ChatBroadcast`: write one message and send it into many of your conversations at once\n * (each client's direct conversation), so each person gets it on their own and their reply\n * comes back to you privately. Pick conversations from the inbox (filter, select all), then send.\n */\nimport { useMemo, useRef, useState } from \"react\";\nimport { Megaphone, Search } from \"lucide-react\";\nimport { Alert, AlertDescription, Button, Checkbox, EmptyState, Input, Label, Skeleton, Textarea, UserAvatar, cn, toast } from \"@marktiderman/genesis-ui\";\nimport { CHAT_LIMITS, randomId } from \"../core/media\";\nimport type { ChatInboxItem } from \"../core/types\";\nimport { useBroadcast, useInbox } from \"../react/index\";\nimport type { ResolveUser } from \"./format\";\nimport { inboxTitle } from \"./inbox\";\n\nexport interface ChatBroadcastProps {\n resolveUser: ResolveUser;\n /** Only this kind of conversation (`direct`, say). */\n kind?: string;\n /** Which inbox rows may be picked; every one by default. */\n filter?: (item: ChatInboxItem) => boolean;\n /** Called with how many it went to. */\n onSent?: (sent: number, picked: number) => void;\n className?: string;\n}\n\nexport function ChatBroadcast({ resolveUser, kind, filter, onSent, className }: ChatBroadcastProps) {\n const { items, isLoading } = useInbox({ kind, limit: 200 });\n const { send, sending } = useBroadcast();\n const [picked, setPicked] = useState<Set<string>>(new Set());\n const [text, setText] = useState(\"\");\n const [q, setQ] = useState(\"\");\n // One clientId per draft, kept until it goes: Send pressed again after a timeout (when the\n // server may already have posted it) is the same broadcast, never a second one.\n const draftId = useRef<string | null>(null);\n const busy = useRef(false);\n\n const rows = useMemo(\n () =>\n items\n .filter((i) => (filter ? filter(i) : true))\n .map((i) => ({ item: i, title: inboxTitle(i, resolveUser) }))\n .sort((a, b) => a.title.localeCompare(b.title)),\n [items, filter, resolveUser],\n );\n const shown = rows.filter((r) => !q.trim() || r.title.toLowerCase().includes(q.trim().toLowerCase()));\n const allShown = shown.length > 0 && shown.every((r) => picked.has(r.item.conversationId));\n\n const toggle = (id: string, on: boolean) =>\n setPicked((p) => {\n const next = new Set(p);\n if (on) next.add(id);\n else next.delete(id);\n return next;\n });\n\n const submit = async () => {\n const body = text.trim();\n if (!body || picked.size === 0 || busy.current) return;\n busy.current = true;\n draftId.current ??= randomId();\n try {\n const ids = await send([...picked], body, { clientId: draftId.current });\n draftId.current = null;\n const n = ids.length;\n if (n === picked.size) toast.success(n === 1 ? \"Sent to 1 conversation\" : `Sent to ${n} conversations`);\n else toast.warning(`Sent to ${n} of ${picked.size}`, { description: \"You can't post in the others.\" });\n onSent?.(n, picked.size);\n setText(\"\");\n setPicked(new Set());\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Couldn't send\");\n } finally {\n busy.current = false;\n }\n };\n\n return (\n <form\n className={cn(\"flex flex-col gap-3\", className)}\n onSubmit={(e) => {\n e.preventDefault();\n void submit();\n }}\n data-testid=\"genesis-chat-broadcast\"\n >\n <Alert>\n <Megaphone className=\"size-4\" aria-hidden />\n <AlertDescription>Each person gets this in their own conversation with you, so replies come back to you privately. No one sees who else got it.</AlertDescription>\n </Alert>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"genesis-chat-broadcast-text\">Message</Label>\n <Textarea\n id=\"genesis-chat-broadcast-text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n maxLength={CHAT_LIMITS.bodyChars}\n className=\"min-h-24\"\n placeholder=\"Write once, send to everyone you pick\"\n />\n </div>\n\n <fieldset className=\"flex min-h-0 flex-col gap-2\">\n <legend className=\"mb-1 text-sm font-medium\">Send to</legend>\n <div className=\"flex items-center gap-2\">\n <div className=\"relative flex-1\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" aria-hidden />\n <Input value={q} onChange={(e) => setQ(e.target.value)} placeholder=\"Filter\" aria-label=\"Filter conversations\" className=\"pl-8\" />\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={shown.length === 0}\n onClick={() =>\n setPicked((p) => {\n const next = new Set(p);\n for (const r of shown) {\n if (allShown) next.delete(r.item.conversationId);\n else next.add(r.item.conversationId);\n }\n return next;\n })\n }\n >\n {allShown ? \"Clear\" : \"Select all\"}\n </Button>\n </div>\n {isLoading ? (\n <div className=\"flex flex-col gap-2\" aria-busy aria-label=\"Loading conversations\">\n <Skeleton className=\"h-10 w-full\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n ) : shown.length === 0 ? (\n <EmptyState icon={Megaphone} title={rows.length ? \"No matches\" : \"No conversations yet\"} />\n ) : (\n <ul className=\"max-h-72 overflow-y-auto rounded-md border\" aria-label=\"Conversations\">\n {shown.map(({ item, title }) => {\n const id = `genesis-chat-broadcast-${item.conversationId}`;\n const avatar = item.otherUserId ? resolveUser(item.otherUserId).avatarUrl : null;\n return (\n <li key={item.conversationId} className=\"flex items-center gap-3 border-b px-3 py-2 last:border-b-0\">\n <Checkbox id={id} checked={picked.has(item.conversationId)} onCheckedChange={(v) => toggle(item.conversationId, v === true)} />\n <UserAvatar name={title} src={avatar} size=\"sm\" />\n <Label htmlFor={id} className=\"min-w-0 flex-1 cursor-pointer truncate font-normal\">\n {title}\n </Label>\n </li>\n );\n })}\n </ul>\n )}\n </fieldset>\n\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm text-muted-foreground\" aria-live=\"polite\">\n {picked.size === 0 ? \"Pick who gets it\" : picked.size === 1 ? \"1 conversation\" : `${picked.size} conversations`}\n </span>\n <Button type=\"submit\" loading={sending} disabled={!text.trim() || picked.size === 0} data-testid=\"genesis-chat-broadcast-send\">\n {picked.size > 1 ? `Send to ${picked.size}` : \"Send\"}\n </Button>\n </div>\n </form>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/web/format.ts","../src/web/inbox.tsx","../src/web/search.tsx","../src/web/markdown.tsx","../src/web/cards.tsx","../src/web/error-boundary.tsx","../src/web/video.tsx","../src/web/voice-note.tsx","../src/web/attachments.tsx","../src/web/emoji-picker.tsx","../src/web/thread-context.ts","../src/web/bubble.tsx","../src/web/schedule.tsx","../src/web/availability.tsx","../src/web/use-voice-recorder.ts","../src/web/composer.tsx","../src/web/topics.tsx","../src/web/thread.tsx","../src/web/panel.tsx","../src/web/memory-client.ts","../src/web/broadcast.tsx"],"names":["jsx","useRef","jsxs","cn","Button","Skeleton","EmptyState","Badge","useState","Fragment","useEffect","attachment","Spinner","useCallback","Dialog","DialogContent","DialogTitle","DialogDescription","startsGroup","UserAvatar","MessageSquare","Pin","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","Clock","DropdownMenuSeparator","DialogHeader","Input","AlertCircle","X","Alert","AlertDescription","useMemo","toast","Label","Textarea","Lock","Mic","Popover","PopoverTrigger","CalendarClock","PopoverContent","FileText","Trash2","SendHorizontal","Tooltip","Paperclip","Video","MoreHorizontal","Plus","DialogFooter","Search","DefaultEmpty","body","renderSlot","m","s"],"mappings":"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","file":"web.js","sourcesContent":["/**\n * @feat:chat\n * Small formatting helpers for the web renderers: times, sizes, and the\n * one-line description of a message a screen reader hears.\n */\nimport { previewText } from \"../core/thread\";\nimport type { ChatMessage } from \"../core/types\";\n\n/** A person as the app names them. The package knows no people tables: the app supplies this. */\nexport interface ChatUser {\n name: string;\n avatarUrl?: string | null;\n}\n\nexport type ResolveUser = (userId: string) => ChatUser;\n\n/** 10:42 (in the reader's locale). */\nexport function clockTime(iso: string, locale?: string): string {\n return new Date(iso).toLocaleTimeString(locale, { hour: \"numeric\", minute: \"2-digit\" });\n}\n\n/** The inbox's time: \"now\", \"5m\", \"10:42\" today, \"Yesterday\", \"Mon\", or \"12 Mar\". */\nexport function relativeTime(iso: string | null | undefined, now = new Date(), locale?: string): string {\n if (!iso) return \"\";\n const d = new Date(iso);\n const diff = now.getTime() - d.getTime();\n if (diff < 60_000) return \"now\";\n if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m`;\n const startOf = (x: Date) => new Date(x.getFullYear(), x.getMonth(), x.getDate()).getTime();\n const days = Math.round((startOf(now) - startOf(d)) / 86_400_000);\n if (days === 0) return clockTime(iso, locale);\n if (days === 1) return \"Yesterday\";\n if (days > 1 && days < 7) return d.toLocaleDateString(locale, { weekday: \"short\" });\n return d.toLocaleDateString(locale, {\n day: \"numeric\",\n month: \"short\",\n year: d.getFullYear() === now.getFullYear() ? undefined : \"numeric\",\n });\n}\n\n/** 12 KB, 3.4 MB. */\nexport function formatBytes(bytes: number | null | undefined): string {\n if (bytes == null || !Number.isFinite(bytes)) return \"\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n return `${(bytes / 1024 / 1024 / 1024).toFixed(1)} GB`;\n}\n\n/** What a screen reader hears for one bubble: \"Sam, 10:42: See you then\". */\nexport function messageLabel(message: Pick<ChatMessage, \"body\" | \"createdAt\" | \"deletedAt\" | \"attachments\" | \"editedAt\" | \"visibility\">, sender: string, locale?: string): string {\n const what = previewText(message.body, message.attachments[0]?.kind ?? null, Boolean(message.deletedAt)) || \"Message\";\n const extra = [message.visibility === \"observers\" ? \"internal note\" : null, message.editedAt && !message.deletedAt ? \"edited\" : null].filter(Boolean);\n return `${sender}, ${clockTime(message.createdAt, locale)}: ${what}${extra.length ? ` (${extra.join(\", \")})` : \"\"}`;\n}\n","/**\n * @feat:chat\n * The inbox: your conversations, newest first, each a button with an avatar,\n * the title (the other person's name in a two-person conversation), a one-line\n * preview, the time, an unread count, an @ when you were mentioned, and muted\n * and pinned marks. Arrow keys move between rows.\n */\nimport { useRef, type KeyboardEvent } from \"react\";\nimport { AtSign, BellOff, MessageSquare, Pin } from \"lucide-react\";\nimport { Badge, Button, EmptyState, Skeleton, UserAvatar, cn } from \"@marktiderman/genesis-ui\";\nimport { renderSlot, type SlotOverride } from \"@marktiderman/genesis-core/slots\";\nimport type { ChatInboxItem } from \"../core/types\";\nimport { useChat, useInbox, type ChatAttachmentKind } from \"../react/index\";\nimport { attachmentPreview } from \"../react/previews\";\nimport { relativeTime, type ResolveUser } from \"./format\";\n\nexport interface ChatInboxEmptyProps {\n archived: boolean;\n}\n\nexport interface ChatInboxProps {\n /** Names people (the app knows them; the package doesn't). */\n resolveUser: ResolveUser;\n /** Called with a conversation's id when its row is chosen. */\n onSelect: (conversationId: string) => void;\n /** The open conversation, marked as current. */\n selectedId?: string | null;\n /** Only this kind of conversation. */\n kind?: string;\n /** The archived conversations instead. */\n archived?: boolean;\n /** A conversation's title when it has none and isn't two-person. */\n fallbackTitle?: (item: ChatInboxItem) => string;\n /** Replace or eject (`null`) the empty state. */\n slots?: { empty?: SlotOverride<ChatInboxEmptyProps> };\n \"aria-label\"?: string;\n className?: string;\n}\n\nfunction DefaultEmpty({ archived }: ChatInboxEmptyProps) {\n return (\n <EmptyState\n icon={MessageSquare}\n title={archived ? \"No archived conversations\" : \"No conversations yet\"}\n description={archived ? undefined : \"When someone messages you, it shows up here.\"}\n />\n );\n}\n\n/** The title an inbox row shows. */\nexport function inboxTitle(item: ChatInboxItem, resolveUser: ResolveUser, fallback?: (item: ChatInboxItem) => string): string {\n if (item.title) return item.title;\n if (item.otherUserId) return resolveUser(item.otherUserId).name;\n return fallback?.(item) ?? \"Conversation\";\n}\n\nexport function ChatInbox({ resolveUser, onSelect, selectedId, kind, archived = false, fallbackTitle, slots, className, ...rest }: ChatInboxProps) {\n const { userId: me, attachmentKinds } = useChat();\n const { items, isLoading, error, refetch } = useInbox({ kind, archived });\n const list = useRef<HTMLUListElement>(null);\n\n // Rows are native buttons (Tab reaches each); the arrows are added here\n // because no Radix primitive is a list of buttons with vertical roving focus.\n const onKeyDown = (e: KeyboardEvent<HTMLUListElement>) => {\n const buttons = Array.from(list.current?.querySelectorAll<HTMLButtonElement>(\"button[data-inbox-row]\") ?? []);\n const at = buttons.indexOf(document.activeElement as HTMLButtonElement);\n const to =\n e.key === \"ArrowDown\" ? Math.min(buttons.length - 1, at + 1) : e.key === \"ArrowUp\" ? Math.max(0, at - 1) : e.key === \"Home\" ? 0 : e.key === \"End\" ? buttons.length - 1 : -2;\n if (to === -2 || buttons.length === 0) return;\n e.preventDefault();\n buttons[to < 0 ? 0 : to]?.focus();\n };\n\n if (isLoading) {\n return (\n <div className={cn(\"flex flex-col\", className)} aria-busy aria-label=\"Loading conversations\" data-testid=\"genesis-chat-inbox-loading\">\n {Array.from({ length: 6 }, (_, i) => (\n <div key={i} className=\"flex items-center gap-3 px-3 py-3\">\n <Skeleton className=\"size-10 shrink-0 rounded-full\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-3.5 w-2/5\" />\n <Skeleton className=\"h-3 w-4/5\" />\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={className}>\n <EmptyState\n icon={MessageSquare}\n title=\"Couldn't load your conversations\"\n description=\"Check your connection and try again.\"\n action={\n <Button type=\"button\" variant=\"outline\" onClick={() => void refetch()}>\n Try again\n </Button>\n }\n />\n </div>\n );\n }\n\n if (items.length === 0) {\n return <div className={className}>{renderSlot(DefaultEmpty, slots?.empty, { archived })}</div>;\n }\n\n return (\n <nav aria-label={rest[\"aria-label\"] ?? \"Conversations\"} className={cn(\"min-h-0\", className)} data-testid=\"genesis-chat-inbox\">\n <ul ref={list} className=\"flex flex-col\" onKeyDown={onKeyDown}>\n {items.map((item) => (\n <li key={item.conversationId}>\n <InboxRow item={item} me={me} kinds={attachmentKinds} resolveUser={resolveUser} fallbackTitle={fallbackTitle} selected={item.conversationId === selectedId} onSelect={onSelect} />\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n\ninterface InboxRowProps {\n item: ChatInboxItem;\n me: string;\n kinds?: Record<string, ChatAttachmentKind>;\n resolveUser: ResolveUser;\n fallbackTitle?: (item: ChatInboxItem) => string;\n selected: boolean;\n onSelect: (id: string) => void;\n}\n\nfunction InboxRow({ item, me, kinds, resolveUser, fallbackTitle, selected, onSelect }: InboxRowProps) {\n const title = inboxTitle(item, resolveUser, fallbackTitle);\n const other = item.otherUserId ? resolveUser(item.otherUserId) : null;\n const last = item.lastMessage;\n const unread = item.unread > 0;\n let preview = last ? attachmentPreview(last.body, last.attachment, kinds, last.deleted) : \"\";\n if (last && last.kind !== \"system\" && !last.deleted && last.senderId) {\n if (last.senderId === me) preview = `You: ${preview}`;\n else if (!item.otherUserId && item.memberCount > 2) preview = `${resolveUser(last.senderId).name}: ${preview}`;\n }\n const time = relativeTime(item.lastMessageAt ?? last?.createdAt);\n const count = item.unread >= 99 ? \"99+\" : String(item.unread);\n const label = [\n title,\n unread ? `${count} unread` : null,\n item.mentioned ? \"you were mentioned\" : null,\n item.muted ? \"muted\" : null,\n item.pinned ? \"pinned\" : null,\n preview || null,\n time || null,\n ]\n .filter(Boolean)\n .join(\", \");\n\n return (\n <button\n type=\"button\"\n data-inbox-row\n aria-current={selected ? \"true\" : undefined}\n aria-label={label}\n onClick={() => onSelect(item.conversationId)}\n className={cn(\n \"flex w-full items-center gap-3 px-3 py-2.5 text-left transition-colors hover:bg-accent focus-visible:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n selected && \"bg-accent\",\n )}\n data-testid={`genesis-chat-inbox-row-${item.conversationId}`}\n >\n <UserAvatar name={title} src={other?.avatarUrl} className=\"shrink-0\" />\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\" aria-hidden>\n <span className=\"flex items-center gap-2\">\n <span className={cn(\"min-w-0 flex-1 truncate text-sm\", unread ? \"font-semibold text-foreground\" : \"font-medium text-foreground\")}>{title}</span>\n <span className={cn(\"shrink-0 text-xs tabular-nums\", unread && !item.muted ? \"font-medium text-primary\" : \"text-muted-foreground\")}>{time}</span>\n </span>\n <span className=\"flex items-center gap-1.5\">\n <span className={cn(\"min-w-0 flex-1 truncate text-sm\", unread ? \"text-foreground\" : \"text-muted-foreground\")}>{preview || \" \"}</span>\n {item.pinned ? <Pin className=\"size-3.5 shrink-0 text-muted-foreground\" /> : null}\n {item.muted ? <BellOff className=\"size-3.5 shrink-0 text-muted-foreground\" /> : null}\n {item.mentioned ? (\n <span className=\"flex size-5 shrink-0 items-center justify-center rounded-full bg-primary text-primary-foreground\">\n <AtSign className=\"size-3\" />\n </span>\n ) : null}\n {unread ? (\n <Badge variant={item.muted ? \"muted\" : \"default\"} className=\"h-5 min-w-5 shrink-0 justify-center rounded-full px-1.5 text-[11px] tabular-nums\">\n {count}\n </Badge>\n ) : null}\n </span>\n </span>\n </button>\n );\n}\n\n","/**\n * @feat:chat\n * `ChatSearch`: a search box and its results, across all your conversations or in one. Each\n * result shows who, when, where (across conversations) and the snippet with the matched words\n * highlighted; hits in a voice note's or video's transcript are marked. Choosing one calls\n * `onOpen`, which the thread uses to jump to the message. Arrow keys move through the results.\n */\nimport { useRef, useState, type KeyboardEvent } from \"react\";\nimport { Mic, Search, X } from \"lucide-react\";\nimport { Badge, Button, EmptyState, Input, Skeleton, cn } from \"@marktiderman/genesis-ui\";\nimport { snippetParts } from \"../core/extras\";\nimport type { ChatSearchHit } from \"../core/types\";\nimport { useSearch } from \"../react/index\";\nimport { relativeTime, type ResolveUser } from \"./format\";\n\nexport interface ChatSearchProps {\n resolveUser: ResolveUser;\n /** Search one conversation; all of yours without it. */\n conversationId?: string | null;\n /** Called with the chosen result. */\n onOpen: (hit: ChatSearchHit) => void;\n /** Names a conversation, on results across conversations. */\n conversationTitle?: (conversationId: string) => string;\n /** Start with the box focused. */\n autoFocus?: boolean;\n debounceMs?: number;\n className?: string;\n}\n\n/** A snippet with its « » marks as <mark>. */\nexport function SearchSnippet({ snippet, className }: { snippet: string; className?: string }) {\n return (\n <span className={className}>\n {snippetParts(snippet).map((p, i) =>\n p.match ? (\n <mark key={i} className=\"rounded-sm bg-warning/30 px-0.5 text-foreground\">\n {p.text}\n </mark>\n ) : (\n <span key={i}>{p.text}</span>\n ),\n )}\n </span>\n );\n}\n\nexport function ChatSearch({ resolveUser, conversationId, onOpen, conversationTitle, autoFocus, debounceMs, className }: ChatSearchProps) {\n const [value, setValue] = useState(\"\");\n const { hits, query, isSearching } = useSearch(value, { conversationId, debounceMs });\n const list = useRef<HTMLUListElement>(null);\n\n // Native buttons in a list; the arrows are added here (no Radix primitive is a vertical list of buttons).\n const onKeyDown = (e: KeyboardEvent<HTMLElement>) => {\n if (e.key !== \"ArrowDown\" && e.key !== \"ArrowUp\") return;\n const buttons = Array.from(list.current?.querySelectorAll<HTMLButtonElement>(\"button[data-search-hit]\") ?? []);\n if (!buttons.length) return;\n e.preventDefault();\n const at = buttons.indexOf(document.activeElement as HTMLButtonElement);\n const to = e.key === \"ArrowDown\" ? Math.min(buttons.length - 1, at + 1) : at <= 0 ? -1 : at - 1;\n if (to < 0) (e.currentTarget.querySelector(\"input\") as HTMLInputElement | null)?.focus();\n else buttons[to]?.focus();\n };\n\n const short = value.trim().length < 2;\n return (\n <div className={cn(\"flex min-h-0 flex-col\", className)} onKeyDown={onKeyDown} data-testid=\"genesis-chat-search\" role=\"search\">\n <div className=\"relative p-2\">\n <Search className=\"pointer-events-none absolute left-4.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" aria-hidden />\n <Input\n type=\"search\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={conversationId ? \"Search this conversation\" : \"Search messages\"}\n aria-label={conversationId ? \"Search this conversation\" : \"Search messages\"}\n autoFocus={autoFocus}\n className=\"pl-8 pr-8\"\n data-testid=\"genesis-chat-search-input\"\n />\n {value ? (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"absolute right-3 top-1/2 size-6 -translate-y-1/2\" onClick={() => setValue(\"\")} aria-label=\"Clear search\">\n <X />\n </Button>\n ) : null}\n </div>\n <div className=\"sr-only\" aria-live=\"polite\">\n {short || isSearching ? \"\" : hits.length === 0 ? \"No results\" : hits.length === 1 ? \"1 result\" : `${hits.length} results`}\n </div>\n {short ? null : isSearching && hits.length === 0 ? (\n <div className=\"flex flex-col gap-2 p-3\" aria-busy aria-label=\"Searching\">\n <Skeleton className=\"h-12 w-full\" />\n <Skeleton className=\"h-12 w-full\" />\n </div>\n ) : hits.length === 0 ? (\n <EmptyState icon={Search} title=\"No results\" description={`Nothing matches “${query}”.`} />\n ) : (\n <ul ref={list} className=\"min-h-0 flex-1 overflow-y-auto\" aria-label=\"Results\">\n {hits.map((h) => {\n const who = h.senderId ? resolveUser(h.senderId).name : \"Someone\";\n return (\n <li key={`${h.messageId}:${h.inTranscript}`}>\n <button\n type=\"button\"\n data-search-hit\n onClick={() => onOpen(h)}\n className=\"flex w-full flex-col gap-0.5 px-3 py-2 text-left hover:bg-accent focus-visible:bg-accent focus-visible:outline-none\"\n data-testid=\"genesis-chat-search-hit\"\n >\n <span className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"truncate font-medium text-foreground\">{who}</span>\n {!conversationId && conversationTitle ? <span className=\"truncate\">in {conversationTitle(h.conversationId)}</span> : null}\n <span className=\"ml-auto shrink-0\">{relativeTime(h.createdAt)}</span>\n </span>\n <span className=\"flex items-start gap-1.5 text-sm\">\n {h.inTranscript ? (\n <Badge variant=\"secondary\" className=\"mt-0.5 shrink-0 gap-1 px-1.5 py-0 text-[10px]\" data-testid=\"genesis-chat-search-transcript\">\n <Mic className=\"size-3\" aria-hidden /> Transcript\n </Badge>\n ) : null}\n <SearchSnippet snippet={h.snippet} className=\"line-clamp-2\" />\n </span>\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n","/**\n * @feat:chat\n * The safe inline markdown a message body is written in: **bold**, *italic*\n * (or _italic_), `code`, [links](https://…), bare https links, line breaks and\n * mentions written `@[Name](user:<uuid>)`. A small tokenizer turns the text\n * into nodes and the nodes into React elements, so every character of the\n * body reaches the page as text: no HTML is ever parsed, and nothing uses\n * dangerouslySetInnerHTML. Links open only for http and https.\n */\nimport { Fragment, type ReactNode } from \"react\";\nimport { cn } from \"@marktiderman/genesis-ui\";\n\nexport type MarkdownNode =\n | { type: \"text\"; text: string }\n | { type: \"bold\"; children: MarkdownNode[] }\n | { type: \"italic\"; children: MarkdownNode[] }\n | { type: \"code\"; text: string }\n | { type: \"link\"; href: string; children: MarkdownNode[] }\n | { type: \"mention\"; name: string; userId: string }\n | { type: \"break\" };\n\n/** True for an absolute http or https URL; everything else (javascript:, data:, relative) is refused. */\nexport function isSafeHref(href: string): boolean {\n try {\n const url = new URL(href);\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nconst MENTION = /^@\\[([^\\]\\n]{1,80})\\]\\(user:([0-9a-f-]{36})\\)/i;\nconst LINK = /^\\[([^\\]\\n]{1,300})\\]\\(((?:[^()\\s]|\\([^()\\s]*\\)){1,2000})\\)/;\nconst BARE_URL = /^https?:\\/\\/[^\\s<>\"]+/i;\nconst TRAILING_PUNCTUATION = /[.,;:!?)\\]'\"]+$/;\n\n/** Parses one message body into inline nodes. Never throws. */\nexport function parseMarkdown(text: string): MarkdownNode[] {\n const out: MarkdownNode[] = [];\n const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n lines.forEach((line, i) => {\n if (i > 0) out.push({ type: \"break\" });\n out.push(...parseInline(line, 0));\n });\n return mergeText(out);\n}\n\nfunction parseInline(src: string, depth: number): MarkdownNode[] {\n const out: MarkdownNode[] = [];\n let text = \"\";\n const flush = () => {\n if (text) out.push({ type: \"text\", text });\n text = \"\";\n };\n let i = 0;\n while (i < src.length) {\n const ch = src[i]!;\n const rest = src.slice(i);\n const prev = i > 0 ? src[i - 1]! : \"\";\n\n if (ch === \"\\\\\" && i + 1 < src.length && /[*_`[\\]@\\\\]/.test(src[i + 1]!)) {\n text += src[i + 1];\n i += 2;\n continue;\n }\n\n if (ch === \"`\") {\n const end = src.indexOf(\"`\", i + 1);\n if (end > i + 1) {\n flush();\n out.push({ type: \"code\", text: src.slice(i + 1, end) });\n i = end + 1;\n continue;\n }\n }\n\n if (ch === \"@\") {\n const m = MENTION.exec(rest);\n if (m) {\n flush();\n out.push({ type: \"mention\", name: m[1]!, userId: m[2]!.toLowerCase() });\n i += m[0].length;\n continue;\n }\n }\n\n if (ch === \"[\") {\n const m = LINK.exec(rest);\n if (m) {\n flush();\n const label = depth < 3 ? parseInline(m[1]!, depth + 1) : [{ type: \"text\" as const, text: m[1]! }];\n if (isSafeHref(m[2]!)) out.push({ type: \"link\", href: m[2]!, children: label });\n // A link we won't open keeps its words and drops the target.\n else out.push(...label);\n i += m[0].length;\n continue;\n }\n }\n\n if ((ch === \"h\" || ch === \"H\") && !/[\\w/]/.test(prev)) {\n const m = BARE_URL.exec(rest);\n if (m) {\n const url = m[0].replace(TRAILING_PUNCTUATION, \"\");\n if (isSafeHref(url)) {\n flush();\n out.push({ type: \"link\", href: url, children: [{ type: \"text\", text: url }] });\n i += url.length;\n continue;\n }\n }\n }\n\n if ((ch === \"*\" || ch === \"_\") && depth < 3) {\n const double = src[i + 1] === ch;\n const marker = double ? ch + ch : ch;\n // `_` only opens at a word edge, so snake_case stays as written.\n const opens = ch === \"*\" || !/\\w/.test(prev);\n const after = src[i + marker.length];\n if (opens && after && after !== \" \" && after !== ch) {\n const end = findClose(src, i + marker.length, marker);\n if (end > 0) {\n flush();\n const inner = parseInline(src.slice(i + marker.length, end), depth + 1);\n out.push(double ? { type: \"bold\", children: inner } : { type: \"italic\", children: inner });\n i = end + marker.length;\n continue;\n }\n }\n }\n\n text += ch;\n i += 1;\n }\n flush();\n return out;\n}\n\n/** Where `marker` closes: not after a space, and (for `_`) at a word edge. */\nfunction findClose(src: string, from: number, marker: string): number {\n let j = from;\n while (j < src.length) {\n const k = src.indexOf(marker, j);\n if (k < 0) return -1;\n const before = src[k - 1]!;\n const next = src[k + marker.length];\n const doubled = marker.length === 1 && next === marker;\n const edge = marker[0] !== \"_\" || !next || !/\\w/.test(next);\n if (k > from && before !== \" \" && !doubled && edge) return k;\n j = k + (doubled ? 2 : 1);\n }\n return -1;\n}\n\nfunction mergeText(nodes: MarkdownNode[]): MarkdownNode[] {\n const out: MarkdownNode[] = [];\n for (const n of nodes) {\n const last = out[out.length - 1];\n if (n.type === \"text\" && last?.type === \"text\") last.text += n.text;\n else out.push(n);\n }\n return out;\n}\n\nexport interface ChatMarkdownProps {\n /** The message body. */\n text: string;\n /** Draws a mention; a highlighted chip by default. */\n renderMention?: (mention: { name: string; userId: string }) => ReactNode;\n /** Mentions of this user are drawn stronger. */\n me?: string;\n /** Bubble colours: on `primary`, links and chips use the primary foreground. */\n tone?: \"default\" | \"primary\";\n className?: string;\n}\n\n/** Renders a message body's inline markdown as React elements. */\nexport function ChatMarkdown({ text, renderMention, me, tone = \"default\", className }: ChatMarkdownProps) {\n const nodes = parseMarkdown(text);\n return <span className={cn(\"whitespace-pre-wrap break-words [overflow-wrap:anywhere]\", className)}>{renderNodes(nodes, { renderMention, me, tone })}</span>;\n}\n\ninterface RenderOptions {\n renderMention?: ChatMarkdownProps[\"renderMention\"];\n me?: string;\n tone: \"default\" | \"primary\";\n}\n\nfunction renderNodes(nodes: MarkdownNode[], opts: RenderOptions): ReactNode[] {\n return nodes.map((n, i) => {\n switch (n.type) {\n case \"text\":\n return <Fragment key={i}>{n.text}</Fragment>;\n case \"break\":\n return <br key={i} />;\n case \"bold\":\n return <strong key={i} className=\"font-semibold\">{renderNodes(n.children, opts)}</strong>;\n case \"italic\":\n return <em key={i}>{renderNodes(n.children, opts)}</em>;\n case \"code\":\n return (\n <code\n key={i}\n className={cn(\n \"rounded px-1 py-0.5 font-mono text-[0.85em]\",\n opts.tone === \"primary\" ? \"bg-primary-foreground/15\" : \"bg-background/70\",\n )}\n >\n {n.text}\n </code>\n );\n case \"link\":\n return (\n <a\n key={i}\n href={n.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\"underline underline-offset-2\", opts.tone === \"primary\" ? \"text-primary-foreground\" : \"text-primary\")}\n >\n {renderNodes(n.children, opts)}\n </a>\n );\n case \"mention\": {\n if (opts.renderMention) return <Fragment key={i}>{opts.renderMention(n)}</Fragment>;\n const mine = opts.me && n.userId === opts.me.toLowerCase();\n return (\n <span\n key={i}\n data-mention={n.userId}\n className={cn(\n \"rounded px-1 font-medium\",\n opts.tone === \"primary\"\n ? \"bg-primary-foreground/20 text-primary-foreground\"\n : mine\n ? \"bg-primary/20 text-primary\"\n : \"bg-primary/10 text-primary\",\n )}\n >\n @{n.name}\n </span>\n );\n }\n }\n });\n}\n","/**\n * @feat:chat\n * Two cards under a message: `ChatLinkPreview`, a link's title, description, site and image\n * (all plain text from Open Graph, never HTML), and\n * `ChatAttachmentCard`, the generic card apps use for their own attachment kinds (a form, a\n * check-in): a title, a subtitle and one action.\n */\nimport { useState, type ComponentType } from \"react\";\nimport { ClipboardList, ExternalLink } from \"lucide-react\";\nimport { Button, cn } from \"@marktiderman/genesis-ui\";\nimport { isHttpsUrl } from \"../core/extras\";\nimport type { ChatLinkPreview as LinkPreviewData } from \"../core/types\";\nimport { isSafeHref } from \"./markdown\";\n\n/**\n * Whether a link preview shows its image. The image lives on the linked site, so loading it\n * straight from there tells that site each reader's IP address and when they read the message\n * (a tracking pixel the sender controls). So:\n * - `\"off\"` (the default): no image;\n * - `\"proxy\"`: through your own image proxy, `proxyUrl(imageUrl)`; no image without it;\n * - `\"direct\"`: from the linked site (only if you accept that).\n */\nexport type LinkPreviewImages = \"off\" | \"proxy\" | \"direct\";\n\n/** The image a preview may show under this setting, or null. Only https image URLs are ever considered. */\nexport function linkPreviewImageSrc(imageUrl: string | null | undefined, images: LinkPreviewImages = \"off\", proxyUrl?: (url: string) => string | null | undefined): string | null {\n if (!isHttpsUrl(imageUrl)) return null;\n if (images === \"direct\") return imageUrl;\n if (images !== \"proxy\" || !proxyUrl) return null;\n try {\n return proxyUrl(imageUrl) || null;\n } catch {\n return null;\n }\n}\n\nexport interface ChatLinkPreviewProps {\n preview: LinkPreviewData;\n /** Whether to show its image, and how; `\"off\"` by default (see LinkPreviewImages). */\n images?: LinkPreviewImages;\n /** Your image proxy, for `images: \"proxy\"`: the URL to load instead of the linked site's. */\n proxyUrl?: (url: string) => string | null | undefined;\n tone?: \"default\" | \"primary\";\n className?: string;\n}\n\nexport function ChatLinkPreview({ preview, images = \"off\", proxyUrl, tone = \"default\", className }: ChatLinkPreviewProps) {\n const [imageFailed, setImageFailed] = useState(false);\n if (preview.status !== \"ok\" || !isSafeHref(preview.url) || !isHttpsUrl(preview.url)) return null;\n let host = preview.url;\n try {\n host = new URL(preview.url).hostname.replace(/^www\\./, \"\");\n } catch {\n // shown as written\n }\n const image = imageFailed ? null : linkPreviewImageSrc(preview.imageUrl, images, proxyUrl);\n const title = preview.title?.trim() || host;\n const primary = tone === \"primary\";\n return (\n <a\n href={preview.url}\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n referrerPolicy=\"no-referrer\"\n className={cn(\n \"mt-1.5 flex w-[min(20rem,100%)] flex-col overflow-hidden rounded-lg border-l-4 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n primary ? \"border-primary-foreground/60 bg-primary-foreground/15\" : \"border-primary bg-background hover:bg-accent\",\n className,\n )}\n aria-label={`${title}, ${preview.siteName ?? host}. Open link`}\n data-testid=\"genesis-chat-link-preview\"\n >\n {image ? (\n <img\n src={image}\n alt=\"\"\n loading=\"lazy\"\n referrerPolicy=\"no-referrer\"\n onError={() => setImageFailed(true)}\n className=\"aspect-[1.91/1] w-full bg-muted object-cover\"\n data-testid=\"genesis-chat-link-preview-image\"\n />\n ) : null}\n <span className=\"flex flex-col gap-0.5 px-2.5 py-2\">\n <span className={cn(\"truncate text-[11px] uppercase tracking-wide\", primary ? \"text-primary-foreground/75\" : \"text-muted-foreground\")}>{preview.siteName ?? host}</span>\n <span className=\"line-clamp-2 text-sm font-semibold leading-snug\">{title}</span>\n {preview.description ? <span className={cn(\"line-clamp-2 text-xs\", primary ? \"text-primary-foreground/85\" : \"text-muted-foreground\")}>{preview.description}</span> : null}\n </span>\n </a>\n );\n}\n\nexport interface ChatAttachmentCardProps {\n title: string;\n subtitle?: string | null;\n /** An icon component (lucide); a clipboard by default. */\n icon?: ComponentType<{ className?: string }>;\n /** One button: a link (`href`, safe schemes only) or a handler. */\n action?: { label: string; href?: string; onPress?: () => void } | null;\n tone?: \"default\" | \"primary\";\n className?: string;\n}\n\n/** A card for an app's own attachment kind: an icon, a title, a subtitle and one action. */\nexport function ChatAttachmentCard({ title, subtitle, icon: Icon = ClipboardList, action, tone = \"default\", className }: ChatAttachmentCardProps) {\n const primary = tone === \"primary\";\n const href = action?.href && isSafeHref(action.href) ? action.href : null;\n return (\n <div\n className={cn(\"flex w-[min(20rem,100%)] items-center gap-3 rounded-lg p-2.5\", primary ? \"bg-primary-foreground/15\" : \"border bg-background\", className)}\n data-testid=\"genesis-chat-attachment-card\"\n >\n <span className={cn(\"flex size-10 shrink-0 items-center justify-center rounded-md\", primary ? \"bg-primary-foreground/20\" : \"bg-primary/10 text-primary\")}>\n <Icon className=\"size-5\" aria-hidden />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-semibold\">{title}</span>\n {subtitle ? <span className={cn(\"block truncate text-xs\", primary ? \"text-primary-foreground/80\" : \"text-muted-foreground\")}>{subtitle}</span> : null}\n </span>\n {action && (href || action.onPress) ? (\n href ? (\n <Button asChild size=\"sm\" variant={primary ? \"secondary\" : \"default\"} className=\"shrink-0\">\n <a href={href} target={/^https?:/i.test(href) ? \"_blank\" : undefined} rel=\"noopener noreferrer\">\n {action.label}\n {/^https?:/i.test(href) ? <ExternalLink aria-hidden /> : null}\n </a>\n </Button>\n ) : (\n <Button type=\"button\" size=\"sm\" variant={primary ? \"secondary\" : \"default\"} className=\"shrink-0\" onClick={action.onPress}>\n {action.label}\n </Button>\n )\n ) : null}\n </div>\n );\n}\n","/**\n * @feat:chat\n * `ChatErrorBoundary`: what one message (or one app attachment card) draws can't take the whole\n * thread down. Messages carry what other people sent, and app renderers get sender-controlled\n * data, so a render that throws shows its fallback instead, and the error goes to `onError`\n * (console.error by default) so it is never silent.\n */\nimport { Component, type ErrorInfo, type ReactNode } from \"react\";\n\nexport interface ChatErrorBoundaryProps {\n /** Drawn instead of the children once they throw. */\n fallback: ReactNode;\n /** Told about the error; console.error by default. */\n onError?: (error: unknown, info: ErrorInfo) => void;\n children: ReactNode;\n}\n\nexport class ChatErrorBoundary extends Component<ChatErrorBoundaryProps, { failed: boolean }> {\n override state = { failed: false };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo) {\n if (this.props.onError) this.props.onError(error, info);\n else console.error(\"genesis-chat: a message couldn't be drawn\", error);\n }\n\n override render() {\n return this.state.failed ? this.props.fallback : this.props.children;\n }\n}\n","/**\n * @feat:chat\n * Video on the web. Recording: `useVideoRecorder` (camera and microphone through\n * MediaRecorder, a live preview, a limit by role, retake) and `ChatVideoRecorder`, the\n * composer's dialog around it, which sends through the provider's `videoUpload` (a Mux direct\n * upload: PUT the recording, then send a pending video attachment) or, without it, as a file\n * to storage. Playback: `ChatVideoPlayer`, Mux HLS with native HLS where the browser has it\n * (Safari) and `hls.js`, loaded only then, elsewhere; \"Processing…\" while Mux works.\n */\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Circle, RotateCcw, SendHorizontal, Square, Video, VideoOff } from \"lucide-react\";\nimport {\n Alert,\n AlertDescription,\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Spinner,\n cn,\n} from \"@marktiderman/genesis-ui\";\nimport { fileExtension, formatDuration } from \"../core/media\";\nimport type { LocalFile } from \"../core/outbox\";\nimport type { AttachmentInput, SendInput } from \"../core/types\";\nimport type { ChatVideoUpload } from \"../react/index\";\n\n// ── Recording ─────────────────────────────────────────────────────────────────\n\nexport type VideoRecorderState = \"idle\" | \"requesting\" | \"previewing\" | \"recording\" | \"recorded\" | \"denied\" | \"unsupported\" | \"error\";\n\nexport interface VideoRecording {\n blob: Blob;\n /** Without codec parameters: `video/webm` or `video/mp4`. */\n contentType: string;\n name: string;\n durationMs: number;\n /** An object URL for playback before sending. */\n url: string | null;\n}\n\n/** MP4 where the browser records it (Safari, recent Chrome), else WebM. */\nexport function pickVideoMimeType(): string | null {\n if (typeof MediaRecorder === \"undefined\") return null;\n for (const type of [\"video/mp4;codecs=avc1,mp4a\", \"video/mp4\", \"video/webm;codecs=vp9,opus\", \"video/webm;codecs=vp8,opus\", \"video/webm\"]) {\n try {\n if (MediaRecorder.isTypeSupported(type)) return type;\n } catch {\n // Older browsers throw on unknown types.\n }\n }\n return \"\";\n}\n\nexport interface UseVideoRecorderOptions {\n /** It stops itself here (`recordingLimitMs(role)`). */\n maxMs: number;\n /** About every second while recording (to tell the others). */\n onTick?: () => void;\n}\n\nexport function useVideoRecorder({ maxMs, onTick }: UseVideoRecorderOptions) {\n const [state, setState] = useState<VideoRecorderState>(\"idle\");\n const [error, setError] = useState<string | null>(null);\n const [elapsedMs, setElapsedMs] = useState(0);\n const [stream, setStream] = useState<MediaStream | null>(null);\n const [recording, setRecording] = useState<VideoRecording | null>(null);\n const recorder = useRef<MediaRecorder | null>(null);\n const chunks = useRef<Blob[]>([]);\n const startedAt = useRef(0);\n const timer = useRef<ReturnType<typeof setInterval> | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const urlRef = useRef<string | null>(null);\n // Bumped by reset (closing, unmounting): a camera that answers after that is turned off at once.\n const session = useRef(0);\n const tick = useRef(onTick);\n tick.current = onTick;\n\n const stopTimer = () => {\n if (timer.current) clearInterval(timer.current);\n timer.current = null;\n };\n const releaseUrl = () => {\n if (urlRef.current && typeof URL !== \"undefined\" && URL.revokeObjectURL) URL.revokeObjectURL(urlRef.current);\n urlRef.current = null;\n };\n const stopStream = useCallback(() => {\n streamRef.current?.getTracks().forEach((t) => t.stop());\n streamRef.current = null;\n setStream(null);\n }, []);\n\n /** Asks for the camera and microphone and shows the preview. */\n const open = useCallback(async () => {\n if (typeof navigator === \"undefined\" || !navigator.mediaDevices?.getUserMedia || pickVideoMimeType() === null) {\n setState(\"unsupported\");\n setError(\"This browser can't record video.\");\n return false;\n }\n const token = session.current;\n setState(\"requesting\");\n setError(null);\n try {\n const s = await navigator.mediaDevices.getUserMedia({ video: { facingMode: \"user\", width: { ideal: 1280 }, height: { ideal: 720 } }, audio: true });\n if (token !== session.current) {\n // Closed (or unmounted, or opened again) while the browser asked: never keep this camera on.\n s.getTracks().forEach((t) => t.stop());\n return false;\n }\n if (streamRef.current && streamRef.current !== s) streamRef.current.getTracks().forEach((t) => t.stop());\n streamRef.current = s;\n setStream(s);\n setState(\"previewing\");\n return true;\n } catch (e) {\n if (token !== session.current) return false;\n const denied = e instanceof Error && (e.name === \"NotAllowedError\" || e.name === \"SecurityError\");\n setState(denied ? \"denied\" : \"error\");\n setError(denied ? \"Allow the camera and microphone in your browser's settings to record a video.\" : \"The camera couldn't start.\");\n return false;\n }\n }, []);\n\n const stop = useCallback(() => {\n const r = recorder.current;\n if (r && r.state !== \"inactive\") r.stop();\n }, []);\n\n const start = useCallback(async () => {\n if (!streamRef.current && !(await open())) return;\n const s = streamRef.current!;\n const mime = pickVideoMimeType() ?? \"\";\n let r: MediaRecorder;\n try {\n r = mime ? new MediaRecorder(s, { mimeType: mime, videoBitsPerSecond: 2_500_000 }) : new MediaRecorder(s);\n } catch {\n stopStream();\n setState(\"error\");\n setError(\"This browser can't record video.\");\n return;\n }\n r.onerror = () => {\n stopTimer();\n r.onstop = null;\n recorder.current = null;\n stopStream();\n setState(\"error\");\n setError(\"The recording stopped. Try again.\");\n };\n releaseUrl();\n setRecording(null);\n chunks.current = [];\n r.ondataavailable = (ev: BlobEvent) => {\n if (ev.data && ev.data.size > 0) chunks.current.push(ev.data);\n };\n r.onstop = () => {\n stopTimer();\n const durationMs = Date.now() - startedAt.current;\n const contentType = (r.mimeType || mime || \"video/webm\").split(\";\")[0]!.trim() || \"video/webm\";\n const blob = new Blob(chunks.current, { type: contentType });\n const url = typeof URL !== \"undefined\" && URL.createObjectURL ? URL.createObjectURL(blob) : null;\n urlRef.current = url;\n setRecording({ blob, contentType, name: `video-${Date.now()}.${fileExtension(\"\", contentType) || \"webm\"}`, durationMs, url });\n setState(\"recorded\");\n // The camera light goes off while you review it.\n stopStream();\n };\n recorder.current = r;\n startedAt.current = Date.now();\n setElapsedMs(0);\n r.start(1000);\n setState(\"recording\");\n timer.current = setInterval(() => {\n const ms = Date.now() - startedAt.current;\n setElapsedMs(ms);\n tick.current?.();\n if (ms >= maxMs) stop();\n }, 250);\n }, [maxMs, open, stop, stopStream]);\n\n /** Throws the take away and opens the camera again. */\n const retake = useCallback(async () => {\n releaseUrl();\n setRecording(null);\n setElapsedMs(0);\n await open();\n }, [open]);\n\n /**\n * The take's object URL now belongs to whoever it was handed to (the outbox frees it once the\n * message lands): reset no longer revokes it.\n */\n const handOff = useCallback(() => {\n urlRef.current = null;\n }, []);\n\n /** Stops everything and forgets the take. */\n const reset = useCallback(() => {\n session.current += 1;\n stopTimer();\n const r = recorder.current;\n if (r && r.state !== \"inactive\") {\n r.onstop = null;\n r.stop();\n }\n recorder.current = null;\n stopStream();\n releaseUrl();\n setRecording(null);\n setElapsedMs(0);\n setError(null);\n setState(\"idle\");\n }, [stopStream]);\n\n useEffect(() => () => reset(), [reset]);\n\n return { state, error, elapsedMs, maxMs, stream, recording, open, start, stop, retake, reset, handOff };\n}\n\nexport type VideoRecorder = ReturnType<typeof useVideoRecorder>;\n\n/**\n * A recording as a file for the outbox: `hosted` sends it to the hosted provider (the provider's\n * `videoUpload`, the message going at once with the video pending); otherwise it goes to storage.\n */\nexport function videoFile(rec: VideoRecording, opts: { hosted?: boolean } = {}): LocalFile {\n return {\n data: rec.blob,\n name: rec.name,\n contentType: rec.contentType,\n previewUrl: rec.url ?? undefined,\n meta: { kind: \"video\", durationMs: rec.durationMs, bytes: rec.blob.size },\n ...(opts.hosted ? { hosted: true } : {}),\n };\n}\n\n/**\n * Uploads a recording through the app's `videoUpload` (a Mux direct upload: PUT the bytes to\n * the URL it returns) and gives back the attachment to send, pending until Mux's webhook marks\n * it ready. The composer no longer uses it: it sends `videoFile(rec, { hosted: true })` through\n * the outbox, so the message keeps its place in the order while the bytes go up.\n */\nexport async function uploadVideo(\n videoUpload: ChatVideoUpload,\n conversationId: string,\n rec: Pick<VideoRecording, \"blob\" | \"contentType\" | \"durationMs\" | \"name\">,\n fetchImpl: typeof fetch = fetch,\n signal?: AbortSignal,\n): Promise<AttachmentInput> {\n const upload = await videoUpload.create(conversationId);\n signal?.throwIfAborted?.();\n const res = await fetchImpl(upload.url, { method: \"PUT\", body: rec.blob, headers: { \"Content-Type\": rec.contentType }, signal });\n if (!res.ok) throw new Error(`The video didn't upload (${res.status})`);\n return {\n kind: \"video\",\n provider: upload.provider,\n providerId: upload.providerId,\n status: \"pending\",\n name: rec.name,\n mime: rec.contentType,\n bytes: rec.blob.size,\n durationMs: rec.durationMs,\n };\n}\n\nexport interface ChatVideoRecorderProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n conversationId: string;\n maxMs: number;\n /** From useConversation: sends through the outbox. */\n send: (input: Omit<SendInput, \"conversationId\" | \"clientId\">, files?: LocalFile[]) => Promise<unknown>;\n /** Merged into what's sent (a reply, a topic, an internal note). */\n extra?: Omit<SendInput, \"conversationId\" | \"clientId\" | \"attachments\" | \"body\">;\n /**\n * Marks the take as hosted. Pass the same `videoUpload` the `ChatProvider` has (or give the\n * provider a `hostedUpload`): the outbox does the upload, and without one it falls back to\n * storage with no error.\n */\n videoUpload?: ChatVideoUpload;\n onTick?: () => void;\n onSent?: () => void;\n /** @deprecated Unused: the bytes go through the outbox's `hostedUpload` now. */\n fetchImpl?: typeof fetch;\n}\n\nfunction Preview({ stream }: { stream: MediaStream | null }) {\n const ref = useRef<HTMLVideoElement>(null);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n try {\n (el as HTMLVideoElement & { srcObject: MediaStream | null }).srcObject = stream;\n } catch {\n // happy-dom and old engines\n }\n }, [stream]);\n return <video ref={ref} autoPlay muted playsInline className=\"h-full w-full -scale-x-100 object-cover\" aria-label=\"Camera preview\" data-testid=\"genesis-chat-video-preview\" />;\n}\n\n/** The composer's video dialog: preview, record (to the role's limit), review, retake, send. */\nexport function ChatVideoRecorder({ open, onOpenChange, maxMs, send, extra, videoUpload, onTick, onSent }: ChatVideoRecorderProps) {\n const rec = useVideoRecorder({ maxMs, onTick });\n const [sending, setSending] = useState(false);\n const [sendError, setSendError] = useState<string | null>(null);\n // One send at a time; once sent, the outbox owns the upload (its Delete cancels it).\n const sendingNow = useRef(false);\n const { open: openCamera, reset } = rec;\n\n useEffect(() => {\n if (open) void openCamera();\n else reset();\n }, [open, openCamera, reset]);\n\n const submit = async () => {\n const take = rec.recording;\n if (!take || sendingNow.current) return;\n sendingNow.current = true;\n setSending(true);\n setSendError(null);\n try {\n // Through the outbox either way, in its place in the order: shown at once, the take as its\n // preview (freed once it lands). Hosted, the message goes while the bytes go up.\n await send({ ...extra, body: \"\" }, [videoFile(take, { hosted: Boolean(videoUpload) })]);\n rec.handOff();\n onSent?.();\n onOpenChange(false);\n } catch (e) {\n setSendError(e instanceof Error ? e.message : \"The video didn't send\");\n } finally {\n sendingNow.current = false;\n setSending(false);\n }\n };\n\n\n const recording = rec.state === \"recording\";\n // It stays open while the take goes to the outbox: closing would free the preview it was handed.\n return (\n <Dialog open={open} onOpenChange={(o) => (o || !sendingNow.current) && onOpenChange(o)}>\n <DialogContent className=\"sm:max-w-lg\" data-testid=\"genesis-chat-video-recorder\">\n <DialogHeader>\n <DialogTitle>Record a video</DialogTitle>\n <DialogDescription>Up to {formatDuration(maxMs)}. You can watch it before you send it.</DialogDescription>\n </DialogHeader>\n {rec.error ? (\n <Alert variant=\"destructive\">\n <VideoOff className=\"size-4\" aria-hidden />\n <AlertDescription>{rec.error}</AlertDescription>\n </Alert>\n ) : null}\n <div className=\"relative aspect-video w-full overflow-hidden rounded-lg bg-muted\">\n {rec.state === \"recorded\" && rec.recording?.url ? (\n // eslint-disable-next-line jsx-a11y/media-has-caption -- your own recording, reviewed before sending\n <video src={rec.recording.url} controls playsInline className=\"h-full w-full object-contain\" aria-label=\"Your recording\" data-testid=\"genesis-chat-video-review\" />\n ) : rec.stream ? (\n <Preview stream={rec.stream} />\n ) : (\n <span className=\"absolute inset-0 flex items-center justify-center\">\n {rec.state === \"requesting\" ? <Spinner aria-label=\"Starting the camera\" /> : <Video className=\"size-8 text-muted-foreground\" aria-hidden />}\n </span>\n )}\n {recording ? (\n <span className=\"absolute left-2 top-2 flex items-center gap-1.5 rounded-full bg-background/85 px-2 py-0.5 text-xs font-medium tabular-nums\" role=\"timer\" aria-live=\"off\">\n <span className=\"size-2 animate-pulse rounded-full bg-destructive\" aria-hidden />\n {formatDuration(rec.elapsedMs)} / {formatDuration(maxMs)}\n </span>\n ) : null}\n {sending ? (\n <span className=\"absolute inset-0 flex flex-col items-center justify-center gap-2 bg-background/70 text-sm font-medium\" role=\"status\">\n <Spinner /> Sending…\n </span>\n ) : null}\n </div>\n <div className=\"sr-only\" role=\"status\">\n {recording ? \"Recording\" : rec.state === \"recorded\" ? \"Recorded. Watch it, retake it or send it.\" : \"\"}\n </div>\n {sendError ? (\n <p className=\"text-sm text-destructive\" role=\"alert\">\n {sendError}\n </p>\n ) : null}\n <div className=\"flex items-center justify-center gap-3\">\n {rec.state === \"recorded\" ? (\n <>\n <Button type=\"button\" variant=\"outline\" onClick={() => void rec.retake()} disabled={sending} data-testid=\"genesis-chat-video-retake\">\n <RotateCcw /> Retake\n </Button>\n <Button type=\"button\" onClick={() => void submit()} loading={sending} data-testid=\"genesis-chat-video-send\">\n <SendHorizontal /> Send video\n </Button>\n </>\n ) : recording ? (\n <Button type=\"button\" variant=\"destructive\" className=\"rounded-full\" onClick={rec.stop} aria-label=\"Stop recording\" data-testid=\"genesis-chat-video-stop\">\n <Square className=\"fill-current\" /> Stop\n </Button>\n ) : (\n <Button\n type=\"button\"\n className=\"rounded-full\"\n onClick={() => void rec.start()}\n disabled={rec.state === \"requesting\" || rec.state === \"unsupported\"}\n aria-label=\"Start recording\"\n data-testid=\"genesis-chat-video-record\"\n >\n <Circle className=\"fill-destructive text-destructive\" /> Record\n </Button>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\n// ── Playback ──────────────────────────────────────────────────────────────────\n\nexport const muxStreamUrl = (playbackId: string) => `https://stream.mux.com/${encodeURIComponent(playbackId)}.m3u8`;\nexport const muxPosterUrl = (playbackId: string) => `https://image.mux.com/${encodeURIComponent(playbackId)}/thumbnail.jpg`;\n\nexport interface ChatVideoPlayerProps {\n /** A file URL (storage), when there is no playback id. */\n src?: string | null;\n /** Mux's playback id: streamed as HLS. */\n playbackId?: string | null;\n poster?: string | null;\n /** Mux is still working on it. */\n processing?: boolean;\n failed?: boolean;\n /** Still uploading from this device. */\n uploading?: boolean;\n label?: string;\n className?: string;\n}\n\ntype HlsLike = { loadSource(url: string): void; attachMedia(el: HTMLMediaElement): void; destroy(): void };\n\n/** Plays a chat video: Mux HLS (native, else hls.js loaded on demand), or a file. */\nexport function ChatVideoPlayer({ src, playbackId, poster, processing, failed, uploading, label, className }: ChatVideoPlayerProps) {\n const ref = useRef<HTMLVideoElement>(null);\n const [hlsFailed, setHlsFailed] = useState(false);\n const stream = playbackId ? muxStreamUrl(playbackId) : null;\n\n useEffect(() => {\n const el = ref.current;\n if (!el || !stream) return;\n if (typeof el.canPlayType === \"function\" && el.canPlayType(\"application/vnd.apple.mpegurl\")) {\n el.src = stream;\n return;\n }\n let hls: HlsLike | null = null;\n let cancelled = false;\n import(\"hls.js\")\n .then((mod) => {\n const Hls = (mod as unknown as { default: { isSupported(): boolean; new (): HlsLike } }).default;\n if (cancelled) return;\n if (!Hls?.isSupported?.()) {\n setHlsFailed(true);\n return;\n }\n hls = new Hls();\n hls.loadSource(stream);\n hls.attachMedia(el);\n })\n .catch(() => {\n // hls.js is an optional peer: without it, browsers lacking native HLS can't stream.\n if (!cancelled) setHlsFailed(true);\n });\n return () => {\n cancelled = true;\n hls?.destroy();\n };\n }, [stream]);\n\n const posterUrl = poster ?? (playbackId ? muxPosterUrl(playbackId) : null);\n if (failed) {\n return (\n <div className={cn(\"flex aspect-video w-[min(20rem,100%)] items-center justify-center gap-2 rounded-xl bg-muted text-sm text-muted-foreground\", className)} data-testid=\"genesis-chat-video-failed\">\n <VideoOff className=\"size-4\" aria-hidden /> This video couldn't be processed\n </div>\n );\n }\n if (processing && !playbackId) {\n return (\n <div className={cn(\"flex aspect-video w-[min(20rem,100%)] flex-col items-center justify-center gap-2 rounded-xl bg-muted text-sm text-muted-foreground\", className)} role=\"status\" data-testid=\"genesis-chat-video-processing\">\n <Spinner size=\"sm\" /> Processing…\n </div>\n );\n }\n return (\n <div className={cn(\"relative w-[min(20rem,100%)] overflow-hidden rounded-xl bg-muted\", className)} data-testid=\"genesis-chat-video\">\n {stream || src ? (\n // eslint-disable-next-line jsx-a11y/media-has-caption -- transcripts come from the provider's captions\n <video\n ref={ref}\n controls\n playsInline\n preload=\"metadata\"\n poster={posterUrl ?? undefined}\n src={stream ? undefined : (src ?? undefined)}\n className=\"block max-h-80 w-full\"\n aria-label={label ?? \"Video\"}\n data-testid={stream ? \"genesis-chat-video-hls\" : undefined}\n />\n ) : (\n <span className=\"block aspect-video w-full animate-pulse bg-muted\" />\n )}\n {hlsFailed ? <span className=\"absolute inset-x-0 bottom-0 bg-background/85 px-2 py-1 text-xs\">This browser can't stream this video.</span> : null}\n {uploading ? (\n <span className=\"absolute inset-0 flex items-center justify-center bg-background/40\" role=\"status\" aria-label=\"Uploading\">\n <Spinner size=\"sm\" className=\"text-foreground\" />\n </span>\n ) : null}\n </div>\n );\n}\n","/**\n * @feat:chat\n * A voice note: play and pause, a waveform that fills as it plays and seeks\n * where you click, the time, a 1× / 1.5× / 2× speed toggle, and the\n * transcript when there is one. Only one voice note plays at a time.\n */\nimport { useEffect, useRef, useState, type KeyboardEvent, type MouseEvent } from \"react\";\nimport { Pause, Play } from \"lucide-react\";\nimport { Button, Collapsible, CollapsibleContent, CollapsibleTrigger, cn } from \"@marktiderman/genesis-ui\";\nimport { formatDuration, nextPlaybackRate } from \"../core/media\";\n\n/** The one playing now, paused when another starts. */\nlet playing: HTMLAudioElement | null = null;\n\nexport interface VoiceNoteProps {\n /** The audio's (signed) URL; while it loads the waveform still draws. */\n src: string | null | undefined;\n durationMs?: number | null;\n /** Peaks 0–100. */\n waveform?: number[] | null;\n transcript?: string | null;\n transcriptStatus?: \"pending\" | \"ready\" | \"failed\" | \"off\" | null;\n /** On the primary (own) bubble. */\n tone?: \"default\" | \"primary\";\n className?: string;\n}\n\nconst BARS = 48;\n\nfunction resample(peaks: number[] | null | undefined, n = BARS): number[] {\n if (!peaks || peaks.length === 0) return new Array(n).fill(12);\n if (peaks.length === n) return peaks;\n return Array.from({ length: n }, (_, i) => peaks[Math.min(peaks.length - 1, Math.floor((i / n) * peaks.length))] ?? 0);\n}\n\nexport function VoiceNote({ src, durationMs, waveform, transcript, transcriptStatus, tone = \"default\", className }: VoiceNoteProps) {\n const audio = useRef<HTMLAudioElement | null>(null);\n const [isPlaying, setPlaying] = useState(false);\n const [current, setCurrent] = useState(0);\n const [duration, setDuration] = useState((durationMs ?? 0) / 1000);\n const [rate, setRate] = useState(1);\n const bars = resample(waveform);\n const progress = duration > 0 ? Math.min(1, current / duration) : 0;\n\n useEffect(() => {\n const el = audio.current;\n if (!el) return;\n const onPlay = () => {\n if (playing && playing !== el) playing.pause();\n playing = el;\n setPlaying(true);\n };\n const onPause = () => {\n if (playing === el) playing = null;\n setPlaying(false);\n };\n const onTime = () => setCurrent(el.currentTime);\n const onMeta = () => {\n if (Number.isFinite(el.duration) && el.duration > 0) setDuration(el.duration);\n };\n const onEnded = () => {\n setPlaying(false);\n setCurrent(0);\n };\n el.addEventListener(\"play\", onPlay);\n el.addEventListener(\"pause\", onPause);\n el.addEventListener(\"timeupdate\", onTime);\n el.addEventListener(\"loadedmetadata\", onMeta);\n el.addEventListener(\"durationchange\", onMeta);\n el.addEventListener(\"ended\", onEnded);\n return () => {\n el.removeEventListener(\"play\", onPlay);\n el.removeEventListener(\"pause\", onPause);\n el.removeEventListener(\"timeupdate\", onTime);\n el.removeEventListener(\"loadedmetadata\", onMeta);\n el.removeEventListener(\"durationchange\", onMeta);\n el.removeEventListener(\"ended\", onEnded);\n if (playing === el) playing = null;\n };\n }, []);\n\n useEffect(() => {\n if (audio.current) audio.current.playbackRate = rate;\n }, [rate]);\n\n const toggle = () => {\n const el = audio.current;\n if (!el || !src) return;\n if (el.paused) {\n el.playbackRate = rate;\n void Promise.resolve(el.play?.()).catch(() => setPlaying(false));\n } else el.pause();\n };\n\n const seekTo = (fraction: number) => {\n const el = audio.current;\n const f = Math.max(0, Math.min(1, fraction));\n if (el && duration > 0) {\n el.currentTime = f * duration;\n setCurrent(f * duration);\n }\n };\n\n const onBarsClick = (e: MouseEvent<HTMLDivElement>) => {\n const box = e.currentTarget.getBoundingClientRect();\n if (box.width > 0) seekTo((e.clientX - box.left) / box.width);\n };\n\n // The waveform is a slider drawn as bars: Radix Slider draws a track and a\n // thumb, not a waveform, so the role and keys are written here (arrows ±5 s,\n // Home/End), on one focusable element.\n const onBarsKey = (e: KeyboardEvent<HTMLDivElement>) => {\n if (duration <= 0) return;\n const step = 5 / duration;\n const keys: Record<string, number> = { ArrowRight: progress + step, ArrowUp: progress + step, ArrowLeft: progress - step, ArrowDown: progress - step, Home: 0, End: 1 };\n if (e.key in keys) {\n e.preventDefault();\n seekTo(keys[e.key]!);\n }\n };\n\n const shown = isPlaying || current > 0 ? current * 1000 : duration * 1000;\n const primary = tone === \"primary\";\n\n return (\n <div className={cn(\"flex min-w-[220px] max-w-full flex-col gap-1\", className)} data-testid=\"genesis-chat-voice\">\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n size=\"icon\"\n variant={primary ? \"secondary\" : \"default\"}\n className=\"h-9 w-9 shrink-0 rounded-full\"\n onClick={toggle}\n disabled={!src}\n aria-label={isPlaying ? \"Pause voice message\" : \"Play voice message\"}\n data-testid=\"genesis-chat-voice-play\"\n >\n {isPlaying ? <Pause /> : <Play />}\n </Button>\n <div\n role=\"slider\"\n tabIndex={0}\n aria-label=\"Position\"\n aria-valuemin={0}\n aria-valuemax={Math.round(duration)}\n aria-valuenow={Math.round(current)}\n aria-valuetext={`${formatDuration(current * 1000)} of ${formatDuration(duration * 1000)}`}\n className=\"flex h-8 flex-1 cursor-pointer items-center gap-[2px] rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n onClick={onBarsClick}\n onKeyDown={onBarsKey}\n >\n {bars.map((peak, i) => (\n <span\n key={i}\n aria-hidden\n className={cn(\n \"w-[3px] flex-1 rounded-full transition-colors\",\n (i + 0.5) / bars.length <= progress\n ? primary\n ? \"bg-primary-foreground\"\n : \"bg-primary\"\n : primary\n ? \"bg-primary-foreground/40\"\n : \"bg-muted-foreground/40\",\n )}\n style={{ height: `${Math.max(12, peak)}%` }}\n />\n ))}\n </div>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n className={cn(\"h-7 shrink-0 rounded-full px-2 text-xs tabular-nums\", primary && \"text-primary-foreground hover:bg-primary-foreground/15 hover:text-primary-foreground\")}\n onClick={() => setRate((r) => nextPlaybackRate(r))}\n aria-label={`Playback speed ${rate}×`}\n data-testid=\"genesis-chat-voice-rate\"\n >\n {rate}×\n </Button>\n </div>\n <div className={cn(\"pl-11 text-xs tabular-nums\", primary ? \"text-primary-foreground/80\" : \"text-muted-foreground\")}>{formatDuration(shown)}</div>\n {transcriptStatus === \"pending\" ? (\n <div className={cn(\"pl-11 text-xs italic\", primary ? \"text-primary-foreground/80\" : \"text-muted-foreground\")}>Transcribing…</div>\n ) : transcript ? (\n <Collapsible className=\"pl-11\">\n <CollapsibleTrigger className={cn(\"text-xs font-medium underline-offset-2 hover:underline\", primary ? \"text-primary-foreground\" : \"text-primary\")}>\n Transcript\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pt-1 text-sm\">{transcript}</CollapsibleContent>\n </Collapsible>\n ) : null}\n {/* eslint-disable-next-line jsx-a11y/media-has-caption -- the transcript above is the caption */}\n <audio ref={audio} src={src ?? undefined} preload=\"metadata\" className=\"hidden\" />\n </div>\n );\n}\n","/**\n * @feat:chat\n * What a message carries: photos in a grid of up to four with a lightbox,\n * voice notes, videos, files as a chip, links, and the app's own kinds (a\n * form, a lesson) through the `attachment` slot, a generic card by default.\n * Pending uploads draw from their local previews with a spinner.\n */\nimport { useCallback, useState, type ComponentType, type KeyboardEvent } from \"react\";\nimport { ChevronLeft, ChevronRight, Download, FileText, Link2, Paperclip } from \"lucide-react\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogTitle,\n Spinner,\n VisuallyHidden,\n cn,\n} from \"@marktiderman/genesis-ui\";\nimport type { ChatAttachment, ChatMessage } from \"../core/types\";\nimport type { ChatAttachmentKind, ChatCardContext } from \"../react/index\";\nimport { ChatAttachmentCard, type ChatAttachmentCardProps } from \"./cards\";\nimport { ChatErrorBoundary } from \"./error-boundary\";\nimport { formatBytes } from \"./format\";\nimport { isSafeHref } from \"./markdown\";\nimport { ChatVideoPlayer } from \"./video\";\nimport { VoiceNote } from \"./voice-note\";\n\n/** One attachment as the renderers draw it, sent or still uploading. */\nexport interface AttachmentView {\n key: string;\n kind: string;\n /** Signed URL, or the local preview while uploading. */\n url: string | null;\n posterUrl: string | null;\n name: string | null;\n mime: string | null;\n bytes: number | null;\n width: number | null;\n height: number | null;\n durationMs: number | null;\n waveform: number[] | null;\n transcript: string | null;\n transcriptStatus: ChatAttachment[\"transcriptStatus\"];\n /** Still uploading (or the server says it is still processing). */\n pending: boolean;\n /** The stored attachment; absent while it uploads. */\n attachment?: ChatAttachment;\n}\n\n/** Props the `attachment` slot receives, for kinds the package doesn't draw (form, lesson…). */\nexport interface ChatAttachmentSlotProps {\n attachment: ChatAttachment;\n message: ChatMessage;\n /** Its signed URL when it has a file. */\n url: string | null;\n mine: boolean;\n}\n\nexport const BUILT_IN_KINDS = new Set([\"image\", \"voice\", \"video\", \"file\", \"link\"]);\n\nexport function toAttachmentView(a: ChatAttachment, urls: Record<string, string>): AttachmentView {\n return {\n key: a.id,\n kind: a.kind,\n url: (a.path ? urls[a.path] : null) ?? (a.provider === \"external\" ? a.url : null) ?? (a.kind === \"link\" ? a.url : null),\n posterUrl: a.posterPath ? (urls[a.posterPath] ?? null) : null,\n name: a.name,\n mime: a.mime,\n bytes: a.bytes,\n width: a.width,\n height: a.height,\n durationMs: a.durationMs,\n waveform: a.waveform,\n transcript: a.transcript,\n transcriptStatus: a.transcriptStatus,\n pending: a.status === \"pending\",\n attachment: a,\n };\n}\n\n/** Generic card for an app's own kind, when no `attachment` slot is given. */\nexport function GenericAttachment({ attachment, url }: ChatAttachmentSlotProps) {\n const label = attachment.name ?? attachment.kind.charAt(0).toUpperCase() + attachment.kind.slice(1);\n const body = (\n <>\n <Paperclip className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium\">{label}</span>\n <span className=\"block text-xs capitalize text-muted-foreground\">{attachment.kind}</span>\n </span>\n </>\n );\n return url && isSafeHref(url) ? (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"flex items-center gap-2 rounded-lg border bg-background p-2 text-foreground hover:bg-accent\">\n {body}\n </a>\n ) : (\n <div className=\"flex items-center gap-2 rounded-lg border bg-background p-2 text-foreground\">{body}</div>\n );\n}\n\nfunction Uploading({ className }: { className?: string }) {\n return (\n <span className={cn(\"absolute inset-0 flex items-center justify-center bg-background/40\", className)} aria-label=\"Uploading\" role=\"status\">\n <Spinner size=\"sm\" className=\"text-foreground\" />\n </span>\n );\n}\n\nexport interface ImageGridProps {\n images: AttachmentView[];\n className?: string;\n}\n\n/** Up to four photos in a grid (a \"+N\" on the fourth for more), opening a lightbox. */\nexport function ImageGrid({ images, className }: ImageGridProps) {\n const [open, setOpen] = useState<number | null>(null);\n const shown = images.slice(0, 4);\n const more = images.length - shown.length;\n const cols = shown.length === 1 ? \"grid-cols-1\" : \"grid-cols-2\";\n return (\n <>\n <div className={cn(\"grid w-[min(18rem,100%)] gap-1 overflow-hidden rounded-xl\", cols, className)} data-testid=\"genesis-chat-images\">\n {shown.map((img, i) => {\n const tall = shown.length === 3 && i === 0;\n return (\n <button\n key={img.key}\n type=\"button\"\n className={cn(\n \"relative block overflow-hidden bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n shown.length === 1 ? \"max-h-80\" : \"aspect-square\",\n tall && \"row-span-2 aspect-auto\",\n )}\n onClick={() => setOpen(i)}\n aria-label={`Open photo${img.name ? ` ${img.name}` : \"\"}`}\n >\n {img.url ? (\n <img\n src={img.url}\n alt={img.name ?? \"Photo\"}\n loading=\"lazy\"\n className={cn(\"h-full w-full object-cover\", img.pending && \"opacity-70\")}\n width={img.width ?? undefined}\n height={img.height ?? undefined}\n />\n ) : (\n <span className=\"block h-full min-h-24 w-full animate-pulse bg-muted\" />\n )}\n {img.pending ? <Uploading /> : null}\n {more > 0 && i === shown.length - 1 ? (\n <span className=\"absolute inset-0 flex items-center justify-center bg-foreground/50 text-xl font-semibold text-background\">+{more}</span>\n ) : null}\n </button>\n );\n })}\n </div>\n <Lightbox images={images} index={open} onIndexChange={setOpen} />\n </>\n );\n}\n\nexport interface LightboxProps {\n images: AttachmentView[];\n /** The photo shown; null closes it. */\n index: number | null;\n onIndexChange: (index: number | null) => void;\n}\n\n/** A photo full size, with the previous and next ones on the arrow keys. */\nexport function Lightbox({ images, index, onIndexChange }: LightboxProps) {\n const img = index === null ? null : images[index];\n const go = useCallback(\n (delta: number) => {\n if (index === null || images.length < 2) return;\n onIndexChange((index + delta + images.length) % images.length);\n },\n [images.length, index, onIndexChange],\n );\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"ArrowRight\") {\n e.preventDefault();\n go(1);\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n go(-1);\n }\n };\n return (\n <Dialog open={img != null} onOpenChange={(o) => !o && onIndexChange(null)}>\n <DialogContent className=\"max-w-[min(64rem,95vw)] border-0 bg-background p-2\" onKeyDown={onKey} data-testid=\"genesis-chat-lightbox\">\n <VisuallyHidden>\n <DialogTitle>{img?.name ?? \"Photo\"}</DialogTitle>\n <DialogDescription>\n Photo {index === null ? 0 : index + 1} of {images.length}. Use the arrow keys for the others.\n </DialogDescription>\n </VisuallyHidden>\n {img?.url ? <img src={img.url} alt={img.name ?? \"Photo\"} className=\"mx-auto max-h-[80vh] w-auto rounded-md object-contain\" /> : null}\n {images.length > 1 ? (\n <div className=\"flex items-center justify-between gap-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" onClick={() => go(-1)} aria-label=\"Previous photo\">\n <ChevronLeft />\n </Button>\n <span className=\"text-sm tabular-nums text-muted-foreground\">\n {(index ?? 0) + 1} / {images.length}\n </span>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" onClick={() => go(1)} aria-label=\"Next photo\">\n <ChevronRight />\n </Button>\n </div>\n ) : null}\n </DialogContent>\n </Dialog>\n );\n}\n\n/** A video: a hosted one (Mux) streams once ready and says \"Processing…\" until then; a file plays from storage. */\nexport function VideoAttachment({ view }: { view: AttachmentView }) {\n const a = view.attachment;\n const hosted = a != null && a.provider !== \"storage\" && a.provider !== \"external\" && a.provider !== \"none\";\n return (\n <ChatVideoPlayer\n src={hosted ? null : view.url}\n playbackId={hosted ? a.playbackId : null}\n poster={view.posterUrl}\n processing={hosted && a.status === \"pending\"}\n failed={a?.status === \"failed\"}\n uploading={!a && view.pending}\n label={view.name ?? \"Video\"}\n />\n );\n}\n\nexport function FileChip({ view, tone = \"default\" }: { view: AttachmentView; tone?: \"default\" | \"primary\" }) {\n const primary = tone === \"primary\";\n const ext = (view.name?.split(\".\").pop() ?? \"\").toUpperCase();\n return (\n <div\n className={cn(\"flex w-[min(18rem,100%)] items-center gap-2 rounded-lg p-2\", primary ? \"bg-primary-foreground/15\" : \"border bg-background\")}\n data-testid=\"genesis-chat-file\"\n >\n <span className={cn(\"relative flex size-9 shrink-0 items-center justify-center rounded-md\", primary ? \"bg-primary-foreground/20\" : \"bg-muted\")}>\n {view.pending ? <Spinner size=\"sm\" className={primary ? \"text-primary-foreground\" : undefined} /> : <FileText className=\"size-4\" aria-hidden />}\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium\">{view.name ?? \"File\"}</span>\n <span className={cn(\"block text-xs\", primary ? \"text-primary-foreground/80\" : \"text-muted-foreground\")}>\n {[ext, formatBytes(view.bytes)].filter(Boolean).join(\" · \")}\n {view.pending ? \" · Uploading…\" : \"\"}\n </span>\n </span>\n {view.url && !view.pending ? (\n <Button\n asChild\n size=\"icon\"\n variant=\"ghost\"\n className={cn(\"size-8 shrink-0\", primary && \"text-primary-foreground hover:bg-primary-foreground/15 hover:text-primary-foreground\")}\n >\n <a href={view.url} download={view.name ?? true} target=\"_blank\" rel=\"noopener noreferrer\" aria-label={`Download ${view.name ?? \"file\"}`}>\n <Download />\n </a>\n </Button>\n ) : null}\n </div>\n );\n}\n\nfunction LinkAttachment({ view, tone }: { view: AttachmentView; tone: \"default\" | \"primary\" }) {\n if (!view.url || !isSafeHref(view.url)) return null;\n let host = view.url;\n try {\n host = new URL(view.url).host;\n } catch {\n // shown as written\n }\n return (\n <a\n href={view.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\"flex w-[min(18rem,100%)] items-center gap-2 rounded-lg p-2\", tone === \"primary\" ? \"bg-primary-foreground/15\" : \"border bg-background hover:bg-accent\")}\n >\n <Link2 className=\"size-4 shrink-0\" aria-hidden />\n <span className=\"min-w-0\">\n <span className=\"block truncate text-sm font-medium\">{view.name ?? host}</span>\n <span className=\"block truncate text-xs opacity-80\">{host}</span>\n </span>\n </a>\n );\n}\n\n/** The app's kind for this name: its own key only (never `constructor` from the prototype), with a `title` function. */\nexport function attachmentKindOf(kinds: Record<string, ChatAttachmentKind> | undefined, kind: string): ChatAttachmentKind | null {\n if (!kinds || !Object.prototype.hasOwnProperty.call(kinds, kind)) return null;\n const k = kinds[kind];\n return k && typeof k.title === \"function\" ? k : null;\n}\n\n/**\n * What the app's kind says to draw for this attachment, or null when its functions throw or\n * return the wrong shapes (the attachment's `ref` is whatever the sender put there).\n */\nexport function attachmentCardOf(k: ChatAttachmentKind, a: ChatAttachment, ctx: ChatCardContext = { mine: false }): Pick<ChatAttachmentCardProps, \"title\" | \"subtitle\" | \"action\"> | null {\n try {\n const title = k.title(a, ctx);\n if (typeof title !== \"string\") return null;\n const sub = typeof k.subtitle === \"function\" ? k.subtitle(a, ctx) : null;\n const act = typeof k.action === \"function\" ? k.action(a, ctx) : null;\n const action =\n act && typeof act === \"object\" && typeof act.label === \"string\" && (typeof act.href === \"string\" || typeof act.onPress === \"function\")\n ? { label: act.label, href: typeof act.href === \"string\" ? act.href : undefined, onPress: typeof act.onPress === \"function\" ? act.onPress : undefined }\n : null;\n return { title, subtitle: typeof sub === \"string\" ? sub : null, action };\n } catch (e) {\n console.error(`genesis-chat: the \"${a.kind}\" card couldn't be drawn`, e);\n return null;\n }\n}\n\nexport interface MessageAttachmentsProps {\n views: AttachmentView[];\n message?: ChatMessage;\n mine: boolean;\n tone: \"default\" | \"primary\";\n /** For kinds the package doesn't draw; a generic card by default. */\n slot?: ComponentType<ChatAttachmentSlotProps> | null;\n /** Cards for registered app kinds (ChatProvider `attachmentKinds`), drawn before the slot. */\n kinds?: Record<string, ChatAttachmentKind>;\n}\n\n/** Every attachment of one message, photos grouped into one grid. */\nexport function MessageAttachments({ views, message, mine, tone, slot, kinds }: MessageAttachmentsProps) {\n if (views.length === 0) return null;\n const images = views.filter((v) => v.kind === \"image\");\n const others = views.filter((v) => v.kind !== \"image\");\n const Custom = slot === undefined ? GenericAttachment : slot;\n return (\n <div className=\"flex flex-col gap-1.5\">\n {images.length ? <ImageGrid images={images} /> : null}\n {others.map((v) => {\n switch (v.kind) {\n case \"voice\":\n return (\n <VoiceNote\n key={v.key}\n src={v.url}\n durationMs={v.durationMs}\n waveform={v.waveform}\n transcript={v.transcript}\n transcriptStatus={v.transcriptStatus}\n tone={tone}\n />\n );\n case \"video\":\n return <VideoAttachment key={v.key} view={v} />;\n case \"file\":\n return <FileChip key={v.key} view={v} tone={tone} />;\n case \"link\":\n return <LinkAttachment key={v.key} view={v} tone={tone} />;\n default:\n if (!v.attachment || !message) return <FileChip key={v.key} view={v} tone={tone} />;\n const generic = <GenericAttachment attachment={v.attachment} message={message} url={v.url} mine={mine} />;\n const k = attachmentKindOf(kinds, v.kind);\n if (k) {\n const card = attachmentCardOf(k, v.attachment, { mine });\n return card ? <ChatAttachmentCard key={v.key} {...card} tone={tone} /> : <GenericAttachment key={v.key} attachment={v.attachment} message={message} url={v.url} mine={mine} />;\n }\n // The app's slot draws sender-controlled data: if it throws, the generic card stands in.\n return Custom ? (\n <ChatErrorBoundary key={v.key} fallback={generic}>\n <Custom attachment={v.attachment} message={message} url={v.url} mine={mine} />\n </ChatErrorBoundary>\n ) : null;\n }\n })}\n </div>\n );\n}\n","/**\n * @feat:chat\n * The full emoji picker, on frimousse (headless, MIT): a search box, every emoji by category\n * in a virtualised grid, keyboard navigation and screen-reader labels from frimousse, styled\n * here with Genesis tokens. Used for reactions (\"+\" beside the quick six) and in the composer.\n * The emoji data loads from `emojibaseUrl`, which the app must give: host the `emojibase-data`\n * package's `<locale>/data.json` and `<locale>/messages.json` (or name a CDN you accept, and add\n * it to your CSP's `connect-src`). Without it the picker loads nothing from anywhere, says so,\n * and the thread and composer don't offer it (the quick reactions still work). frimousse's own\n * default would be jsDelivr's unpinned `emojibase-data@latest`, a third party seeing every\n * reader's IP, so it is never used.\n */\nimport { EmojiPicker } from \"frimousse\";\nimport { Spinner, cn } from \"@marktiderman/genesis-ui\";\n\n/** The picker can load: an emojibase URL was given. */\nexport const canPickEmoji = (emojibaseUrl: string | null | undefined): emojibaseUrl is string => Boolean(emojibaseUrl?.trim());\n\nexport interface ChatEmojiPickerProps {\n onSelect: (emoji: string) => void;\n /** Where the Emojibase data is fetched from (`${emojibaseUrl}/en/data.json`). Required to load anything. */\n emojibaseUrl?: string;\n locale?: \"en\";\n columns?: number;\n className?: string;\n}\n\nexport function ChatEmojiPicker({ onSelect, emojibaseUrl, locale, columns = 8, className }: ChatEmojiPickerProps) {\n if (!canPickEmoji(emojibaseUrl)) {\n if (typeof console !== \"undefined\") console.warn(\"genesis-chat: ChatEmojiPicker needs `emojibaseUrl` (self-hosted emojibase-data); it loads nothing without it.\");\n return (\n <p className={cn(\"w-[18.5rem] p-3 text-sm text-muted-foreground\", className)} role=\"note\" data-testid=\"genesis-chat-emoji-picker-unset\">\n The emoji picker isn't set up.\n </p>\n );\n }\n return (\n <EmojiPicker.Root\n onEmojiSelect={(e) => onSelect(e.emoji)}\n emojibaseUrl={emojibaseUrl}\n locale={locale}\n columns={columns}\n className={cn(\"isolate flex h-80 w-[18.5rem] flex-col bg-popover text-popover-foreground\", className)}\n data-testid=\"genesis-chat-emoji-picker\"\n >\n <EmojiPicker.Search\n autoFocus\n aria-label=\"Search emoji\"\n placeholder=\"Search emoji\"\n className=\"m-2 h-9 shrink-0 rounded-md border border-input bg-background px-3 text-sm outline-none placeholder:text-muted-foreground focus-visible:ring-2 focus-visible:ring-ring\"\n />\n <EmojiPicker.Viewport className=\"relative flex-1 outline-none\">\n <EmojiPicker.Loading className=\"absolute inset-0 flex items-center justify-center\">\n <Spinner size=\"sm\" aria-label=\"Loading emoji\" />\n </EmojiPicker.Loading>\n <EmojiPicker.Empty className=\"absolute inset-0 flex items-center justify-center text-sm text-muted-foreground\">No emoji found</EmojiPicker.Empty>\n <EmojiPicker.List\n className=\"select-none pb-1.5\"\n components={{\n CategoryHeader: ({ category, ...props }) => (\n <div className=\"bg-popover px-3 pb-1 pt-2 text-xs font-medium text-muted-foreground\" {...props}>\n {category.label}\n </div>\n ),\n Row: ({ children, ...props }) => (\n <div className=\"scroll-my-1.5 px-1.5\" {...props}>\n {children}\n </div>\n ),\n Emoji: ({ emoji, ...props }) => (\n <button\n type=\"button\"\n className={cn(\"flex size-8 items-center justify-center rounded-md text-xl\", emoji.isActive && \"bg-accent\")}\n {...props}\n >\n {emoji.emoji}\n </button>\n ),\n }}\n />\n </EmojiPicker.Viewport>\n </EmojiPicker.Root>\n );\n}\n","/**\n * @feat:chat\n * What every bubble of one thread shares: who you are, how people are named,\n * your role, signed file URLs, and the actions, so a row needs only its item.\n */\nimport { createContext, useContext, type ComponentType } from \"react\";\nimport type { ChatLinkPreview, ChatMessage, ChatRole } from \"../core/types\";\nimport type { ChatAttachmentKind } from \"../react/index\";\nimport type { ChatAttachmentSlotProps } from \"./attachments\";\nimport type { LinkPreviewImages } from \"./cards\";\nimport type { ResolveUser } from \"./format\";\n\nexport interface ThreadContextValue {\n me: string;\n resolveUser: ResolveUser;\n role: ChatRole | null;\n /** More than two people: names and avatars show on others' messages. */\n isGroup: boolean;\n /** Owner or admin: may delete anyone's message. */\n canModerate: boolean;\n canPin: boolean;\n canPost: boolean;\n pins: Set<string>;\n urls: Record<string, string>;\n byId: Map<string, ChatMessage>;\n quickReactions: readonly string[];\n attachmentSlot?: ComponentType<ChatAttachmentSlotProps> | null;\n /** Cards for the app's registered attachment kinds. */\n attachmentKinds?: Record<string, ChatAttachmentKind>;\n /** Link previews by message id, in link order. */\n previews: Record<string, ChatLinkPreview[]>;\n /** Where the full emoji picker loads its data from; no full picker without it. */\n emojibaseUrl?: string;\n /** Link preview images: off by default (see LinkPreviewImages). */\n linkPreviewImages?: LinkPreviewImages;\n linkPreviewProxyUrl?: (url: string) => string | null | undefined;\n highlightedId: string | null;\n editingId: string | null;\n reply(m: ChatMessage): void;\n focusComposer(): void;\n startEdit(id: string | null): void;\n saveEdit(m: ChatMessage, body: string): Promise<void>;\n askDelete(m: ChatMessage): void;\n askReport(m: ChatMessage): void;\n react(m: ChatMessage, emoji: string, on: boolean): void;\n pin(m: ChatMessage, on: boolean): void;\n save(m: ChatMessage): void;\n copy(m: ChatMessage): void;\n jumpTo(messageId: string): void;\n retry(clientId: string): void;\n discard(clientId: string): void;\n openThread?: (m: ChatMessage) => void;\n}\n\nexport const ThreadContext = createContext<ThreadContextValue | null>(null);\n\nexport function useThreadContext(): ThreadContextValue {\n const ctx = useContext(ThreadContext);\n if (!ctx) throw new Error(\"Chat bubbles render inside <ChatThread>.\");\n return ctx;\n}\n\n/** The six quick reactions. */\nexport const QUICK_REACTIONS = [\"👍\", \"❤️\", \"😂\", \"😮\", \"😢\", \"🙏\"] as const;\n","/**\n * @feat:chat\n * One row of a thread: a system line, or a bubble (yours on the right in the\n * primary colour, theirs on the left), with its reply quote, body, attachments,\n * time and edited marker, reactions, and actions on hover, right-click or\n * long-press. Pending messages show \"Sending…\"; failed ones offer Retry and\n * Delete.\n */\nimport { useEffect, useRef, useState, type ComponentType, type MutableRefObject, type ReactNode } from \"react\";\nimport {\n AlertCircle,\n Ban,\n Bookmark,\n Clock,\n Copy,\n EyeOff,\n Flag,\n Lock,\n MessageSquare,\n MoreHorizontal,\n Pencil,\n Pin,\n PinOff,\n Plus,\n Reply,\n ShieldAlert,\n SmilePlus,\n Trash2,\n} from \"lucide-react\";\nimport {\n Badge,\n Button,\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator,\n ContextMenuTrigger,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Progress,\n Textarea,\n Tooltip,\n UserAvatar,\n cn,\n} from \"@marktiderman/genesis-ui\";\nimport { attachmentKindFor } from \"../core/media\";\nimport type { QueuedMessage } from \"../core/outbox\";\nimport { previewText, summarizeReactions, type ThreadItem } from \"../core/thread\";\nimport type { ChatMessage, PendingMessage } from \"../core/types\";\nimport { MessageAttachments, toAttachmentView, type AttachmentView } from \"./attachments\";\nimport { ChatLinkPreview } from \"./cards\";\nimport { ChatEmojiPicker, canPickEmoji } from \"./emoji-picker\";\nimport { clockTime, messageLabel } from \"./format\";\nimport { ChatMarkdown } from \"./markdown\";\nimport { useThreadContext } from \"./thread-context\";\n\nexport interface MessageRowProps {\n item: ThreadItem;\n /** First of a run from one sender: the name and avatar show (others' messages, in groups). */\n startsGroup: boolean;\n className?: string;\n}\n\n/** The pending message as a message, so one bubble draws both. */\nfunction pendingAsMessage(p: PendingMessage): ChatMessage {\n return {\n id: `pending:${p.clientId}`,\n conversationId: p.input.conversationId,\n seq: Number.MAX_SAFE_INTEGER,\n clientId: p.clientId,\n senderId: p.senderId,\n senderRole: \"member\",\n kind: \"text\",\n body: p.input.body ?? \"\",\n mentions: p.input.mentions ?? [],\n replyToId: p.input.replyToId ?? null,\n threadRootId: p.input.threadRootId ?? null,\n threadCount: 0,\n threadLastAt: null,\n topic: p.input.topic ?? null,\n visibility: p.input.visibility ?? \"everyone\",\n silent: Boolean(p.input.silent),\n meta: {},\n createdAt: p.createdAt,\n editedAt: null,\n deletedAt: null,\n moderation: null,\n attachments: [],\n reactions: [],\n };\n}\n\nfunction pendingViews(p: PendingMessage): AttachmentView[] {\n const files = (p as Partial<QueuedMessage>).files ?? [];\n return files.map((f, i) => ({\n key: `${p.clientId}:${i}`,\n kind: f.meta?.kind ?? attachmentKindFor(f.contentType),\n url: p.previews?.[i] ?? f.previewUrl ?? null,\n posterUrl: null,\n name: f.meta?.name ?? f.name,\n mime: f.contentType,\n bytes: f.meta?.bytes ?? (typeof Blob !== \"undefined\" && f.data instanceof Blob ? f.data.size : null),\n width: f.meta?.width ?? null,\n height: f.meta?.height ?? null,\n durationMs: f.meta?.durationMs ?? null,\n waveform: f.meta?.waveform ?? null,\n transcript: null,\n transcriptStatus: null,\n pending: p.status === \"sending\",\n }));\n}\n\n/** How much of a sending message's files has uploaded (0–100), once any file reports progress. */\nexport function pendingProgress(p: PendingMessage): number | null {\n if (p.status !== \"sending\") return null;\n const files = p.files ?? [];\n if (!files.some((f) => typeof f.progress === \"number\")) return null;\n return Math.round((files.reduce((sum, f) => sum + (f.progress ?? 0), 0) / files.length) * 100);\n}\n\n/** A menu gives focus back to what opened it, unless the action put it somewhere (the composer, the edit box). */\nfunction returnFocus(e: Event, keepFocus: MutableRefObject<(() => void) | null>) {\n const next = keepFocus.current;\n if (next) {\n e.preventDefault();\n keepFocus.current = null;\n next();\n }\n}\n\n/** Plain text for the clipboard: mentions as @Name. */\nexport function plainText(body: string): string {\n return body.replace(/@\\[([^\\]]+)\\]\\(user:[0-9a-f-]{36}\\)/gi, \"@$1\");\n}\n\nexport function MessageRow({ item, startsGroup, className }: MessageRowProps) {\n const ctx = useThreadContext();\n const keepFocus = useRef<(() => void) | null>(null);\n const pending = item.type === \"pending\" ? item.pending : null;\n const message = item.type === \"message\" ? item.message : pendingAsMessage(item.pending);\n\n if (message.kind === \"system\") {\n return (\n <div className={cn(\"flex justify-center px-4 py-1\", className)} role=\"note\" data-testid=\"genesis-chat-system\">\n <span className=\"max-w-[85%] rounded-full bg-muted px-3 py-1 text-center text-xs text-muted-foreground\">\n <ChatMarkdown text={message.body} me={ctx.me} />\n </span>\n </div>\n );\n }\n\n const mine = message.senderId === ctx.me;\n const sender = message.senderId ? ctx.resolveUser(message.senderId) : { name: \"Someone\" };\n const deleted = Boolean(message.deletedAt);\n const note = message.visibility === \"observers\";\n const showHeader = ctx.isGroup && !mine && startsGroup;\n const tone: \"default\" | \"primary\" = mine && !note && !deleted ? \"primary\" : \"default\";\n const views = pending ? pendingViews(pending) : message.attachments.map((a) => toAttachmentView(a, ctx.urls));\n const progress = pending ? pendingProgress(pending) : null;\n const editing = ctx.editingId === message.id;\n const reactions = pending ? [] : summarizeReactions(message, ctx.me);\n const highlighted = ctx.highlightedId === message.id;\n const actionable = !pending && !deleted;\n const hidden = !deleted && message.moderation === \"hidden\";\n const flagged = !deleted && message.moderation === \"flagged\";\n const observer = ctx.role === \"observer\";\n // One preview per message, iMessage-style: the first link the server has fetched.\n const preview = !pending && !deleted && !hidden && message.body ? ctx.previews[message.id]?.[0] : undefined;\n\n const bubble = (\n <div\n className={cn(\n \"relative min-w-0 max-w-full rounded-2xl px-3 py-2 text-sm leading-relaxed shadow-sm transition-shadow\",\n tone === \"primary\" ? \"bg-primary text-primary-foreground\" : \"bg-muted text-foreground\",\n mine ? (startsGroup ? \"rounded-tr-md\" : \"\") : startsGroup ? \"rounded-tl-md\" : \"\",\n note && \"border border-warning/50 bg-warning/15 text-foreground\",\n deleted && \"border border-dashed bg-transparent text-muted-foreground shadow-none\",\n highlighted && \"ring-2 ring-ring ring-offset-2 ring-offset-background\",\n pending?.status === \"failed\" && \"opacity-80\",\n hidden && \"opacity-70\",\n )}\n data-testid={deleted ? \"genesis-chat-deleted\" : note ? \"genesis-chat-note\" : mine ? \"genesis-chat-mine\" : \"genesis-chat-theirs\"}\n >\n {note ? (\n <div className=\"mb-1 flex items-center gap-1 text-xs font-semibold text-foreground/80\">\n <Lock className=\"size-3\" aria-hidden /> Internal note\n </div>\n ) : null}\n {deleted ? (\n <span className=\"flex items-center gap-1.5 italic\">\n <Ban className=\"size-3.5\" aria-hidden /> Message deleted\n </span>\n ) : editing ? (\n <EditBox message={message} />\n ) : (\n <>\n {message.replyToId ? <ReplyQuote id={message.replyToId} tone={tone} /> : null}\n {views.length ? (\n <div className={cn(message.body ? \"mb-1.5\" : \"\")}>\n <MessageAttachments views={views} message={pending ? undefined : message} mine={mine} tone={tone} slot={ctx.attachmentSlot} kinds={ctx.attachmentKinds} />\n {progress !== null ? (\n <Progress\n value={progress}\n className={cn(\"mt-1.5 h-1\", tone === \"primary\" && \"bg-primary-foreground/30 [&>div]:bg-primary-foreground\")}\n role=\"progressbar\"\n aria-label=\"Uploading\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={progress}\n data-testid=\"genesis-chat-upload-progress\"\n />\n ) : null}\n </div>\n ) : null}\n {message.body ? <ChatMarkdown text={message.body} me={ctx.me} tone={tone} /> : null}\n {preview ? <ChatLinkPreview preview={preview} images={ctx.linkPreviewImages} proxyUrl={ctx.linkPreviewProxyUrl} tone={tone} /> : null}\n {hidden && mine && !observer ? (\n <span className=\"mt-1 flex items-center gap-1 text-xs font-medium\" data-testid=\"genesis-chat-hidden-notice\">\n <EyeOff className=\"size-3\" aria-hidden /> Hidden by moderation. Only you can see it.\n </span>\n ) : null}\n <Meta message={message} pending={pending} tone={tone} />\n </>\n )}\n </div>\n );\n\n return (\n <article\n id={`genesis-chat-msg-${message.id}`}\n data-message-id={pending ? undefined : message.id}\n aria-label={`${messageLabel(message, mine ? \"You\" : sender.name)}${hidden ? \" (hidden by moderation)\" : flagged && observer ? \" (flagged)\" : \"\"}`}\n className={cn(\"group/msg flex gap-2 px-3\", mine ? \"flex-row-reverse\" : \"flex-row\", startsGroup ? \"mt-2\" : \"mt-0.5\", className)}\n data-testid={pending ? `genesis-chat-pending-${pending.status}` : \"genesis-chat-message\"}\n >\n {ctx.isGroup && !mine ? (\n showHeader ? (\n <UserAvatar name={sender.name} src={sender.avatarUrl} size=\"sm\" className=\"mt-5\" />\n ) : (\n <span className=\"w-8 shrink-0\" aria-hidden />\n )\n ) : null}\n <div className={cn(\"flex min-w-0 max-w-[min(78%,36rem)] flex-col\", mine ? \"items-end\" : \"items-start\")}>\n {showHeader ? <span className=\"mb-0.5 px-3 text-xs font-medium text-muted-foreground\">{sender.name}</span> : null}\n {observer && (hidden || flagged) ? (\n <Badge\n variant={hidden ? \"destructive\" : \"outline\"}\n className=\"mb-0.5 gap-1 px-1.5 py-0 text-[10px]\"\n data-testid={hidden ? \"genesis-chat-moderation-hidden\" : \"genesis-chat-moderation-flagged\"}\n >\n {hidden ? <EyeOff className=\"size-3\" aria-hidden /> : <ShieldAlert className=\"size-3\" aria-hidden />}\n {hidden ? \"Hidden by moderation\" : \"Flagged\"}\n </Badge>\n ) : null}\n <div className={cn(\"flex max-w-full items-center gap-1\", mine ? \"flex-row-reverse\" : \"flex-row\")}>\n {actionable ? (\n <ContextMenu>\n <ContextMenuTrigger asChild>{bubble}</ContextMenuTrigger>\n <ContextMenuContent className=\"w-56\" onCloseAutoFocus={(e) => returnFocus(e, keepFocus)}>\n <ActionItems message={message} mine={mine} keepFocus={keepFocus} Item={ContextMenuItem} Separator={ContextMenuSeparator} />\n </ContextMenuContent>\n </ContextMenu>\n ) : (\n bubble\n )}\n {actionable && !editing ? <HoverBar message={message} mine={mine} /> : null}\n </div>\n {reactions.length ? (\n <div className={cn(\"-mt-1 flex flex-wrap gap-1 px-2\", mine ? \"justify-end\" : \"justify-start\")} data-testid=\"genesis-chat-reactions\">\n {reactions.map((r) => (\n <Tooltip key={r.emoji} content={r.userIds.map((u) => (u === ctx.me ? \"You\" : ctx.resolveUser(u).name)).join(\", \")}>\n <button\n type=\"button\"\n aria-pressed={r.mine}\n aria-label={`${r.emoji} ${r.count}${r.mine ? \", including you\" : \"\"}. ${r.mine ? \"Remove\" : \"Add\"} your reaction`}\n onClick={() => ctx.react(message, r.emoji, !r.mine)}\n disabled={!ctx.canPost}\n className={cn(\n \"inline-flex h-6 items-center gap-1 rounded-full border bg-background px-2 text-xs shadow-sm transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none\",\n r.mine && \"border-primary bg-primary/10 text-primary\",\n )}\n data-testid={`genesis-chat-reaction-${r.emoji}`}\n >\n <span aria-hidden>{r.emoji}</span>\n <span className=\"tabular-nums\" aria-hidden>\n {r.count}\n </span>\n </button>\n </Tooltip>\n ))}\n </div>\n ) : null}\n {!pending && message.threadCount > 0 && ctx.openThread ? (\n <Button type=\"button\" variant=\"link\" size=\"sm\" className=\"h-6 px-2 text-xs\" onClick={() => ctx.openThread?.(message)}>\n <MessageSquare className=\"size-3\" aria-hidden />\n {message.threadCount === 1 ? \"1 reply\" : `${message.threadCount} replies`}\n </Button>\n ) : null}\n {pending?.status === \"failed\" ? (\n <div className=\"mt-1 flex items-center gap-1 text-xs text-destructive\" role=\"alert\">\n <AlertCircle className=\"size-3.5\" aria-hidden />\n <span>Not sent{pending.error && pending.error !== \"Not sent\" ? `: ${pending.error}` : \"\"}</span>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" className=\"h-6 px-2 text-xs\" onClick={() => ctx.retry(pending.clientId)} data-testid=\"genesis-chat-retry\">\n Retry\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" className=\"h-6 px-2 text-xs text-destructive hover:text-destructive\" onClick={() => ctx.discard(pending.clientId)} data-testid=\"genesis-chat-discard\">\n Delete\n </Button>\n </div>\n ) : null}\n </div>\n </article>\n );\n}\n\nfunction Meta({ message, pending, tone }: { message: ChatMessage; pending: PendingMessage | null; tone: \"default\" | \"primary\" }) {\n const muted = tone === \"primary\" ? \"text-primary-foreground/75\" : \"text-muted-foreground\";\n return (\n <span className={cn(\"float-right ml-3 mt-1 flex translate-y-1 items-center gap-1 text-[11px] leading-none\", muted)}>\n {message.editedAt ? <span>edited</span> : null}\n {pending?.status === \"sending\" ? (\n <>\n <Clock className=\"size-3\" aria-hidden />\n <span>Sending…</span>\n </>\n ) : pending?.status === \"failed\" ? (\n <AlertCircle className=\"size-3\" aria-label=\"Not sent\" />\n ) : (\n <time dateTime={message.createdAt}>{clockTime(message.createdAt)}</time>\n )}\n </span>\n );\n}\n\nfunction ReplyQuote({ id, tone }: { id: string; tone: \"default\" | \"primary\" }) {\n const ctx = useThreadContext();\n const original = ctx.byId.get(id);\n const who = original?.senderId ? (original.senderId === ctx.me ? \"You\" : ctx.resolveUser(original.senderId).name) : null;\n const text = original ? previewText(original.body, original.attachments[0]?.kind ?? null, Boolean(original.deletedAt)) : \"Earlier message\";\n return (\n <button\n type=\"button\"\n onClick={() => ctx.jumpTo(id)}\n className={cn(\n \"mb-1.5 block w-full min-w-0 rounded-md border-l-4 px-2 py-1 text-left text-xs focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n tone === \"primary\" ? \"border-primary-foreground/60 bg-primary-foreground/15\" : \"border-primary bg-background/60\",\n )}\n aria-label={`Replying to ${who ?? \"a message\"}: ${text}. Show it`}\n data-testid=\"genesis-chat-reply-quote\"\n >\n {who ? <span className=\"block font-semibold\">{who}</span> : null}\n <span className=\"line-clamp-2 opacity-80\">{text}</span>\n </button>\n );\n}\n\nfunction EditBox({ message }: { message: ChatMessage }) {\n const ctx = useThreadContext();\n const [value, setValue] = useState(message.body);\n const [busy, setBusy] = useState(false);\n const ref = useRef<HTMLTextAreaElement>(null);\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n el.focus();\n el.setSelectionRange(el.value.length, el.value.length);\n }, []);\n const save = async () => {\n const body = value.trim();\n if (!body || body === message.body) return ctx.startEdit(null);\n setBusy(true);\n try {\n await ctx.saveEdit(message, body);\n ctx.startEdit(null);\n } finally {\n setBusy(false);\n }\n };\n return (\n <div className=\"flex min-w-[16rem] flex-col gap-2\">\n <Textarea\n ref={ref}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n ctx.startEdit(null);\n } else if (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault();\n void save();\n }\n }}\n id={`genesis-chat-edit-${message.id}`}\n aria-label=\"Edit message\"\n className=\"min-h-[60px] resize-none bg-background text-foreground\"\n />\n <div className=\"flex justify-end gap-2\">\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => ctx.startEdit(null)} className={cn(\"h-7\", \"text-current\")}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"secondary\" onClick={() => void save()} loading={busy} className=\"h-7\">\n Save\n </Button>\n </div>\n </div>\n );\n}\n\ntype ItemComponent = ComponentType<{ onSelect?: (e: Event) => void; className?: string; children?: ReactNode; \"data-testid\"?: string; \"aria-label\"?: string }>;\n\ninterface ActionItemsProps {\n message: ChatMessage;\n /** Set when the picked action moves focus itself (Reply, Edit), so the menu doesn't take it back. */\n keepFocus: MutableRefObject<(() => void) | null>;\n mine: boolean;\n Item: ItemComponent;\n Separator: ComponentType<{ className?: string }>;\n}\n\n/** The actions menu, the same in the right-click menu and the \"More\" menu. */\nfunction ActionItems({ message, mine, keepFocus, Item, Separator }: ActionItemsProps) {\n const ctx = useThreadContext();\n const pinned = ctx.pins.has(message.id);\n const canDelete = mine || ctx.canModerate;\n const canEdit = mine && message.kind === \"text\" && message.body.length > 0;\n return (\n <>\n {ctx.canPost ? (\n <>\n <div className=\"flex justify-between gap-0.5 px-1 py-1\" role=\"group\" aria-label=\"React\">\n {ctx.quickReactions.map((emoji) => {\n const on = message.reactions.some((r) => r.emoji === emoji && r.userId === ctx.me);\n return (\n <Item\n key={emoji}\n className={cn(\"justify-center rounded-full px-2 text-lg\", on && \"bg-primary/10\")}\n onSelect={() => ctx.react(message, emoji, !on)}\n aria-label={`${on ? \"Remove\" : \"React with\"} ${emoji}`}\n >\n {emoji}\n </Item>\n );\n })}\n </div>\n <Separator />\n <Item className=\"gap-2\" onSelect={() => { keepFocus.current = ctx.focusComposer; ctx.reply(message); }}>\n <Reply className=\"size-4\" aria-hidden /> Reply\n </Item>\n </>\n ) : null}\n {message.body ? (\n <Item className=\"gap-2\" onSelect={() => ctx.copy(message)}>\n <Copy className=\"size-4\" aria-hidden /> Copy text\n </Item>\n ) : null}\n {canEdit && ctx.canPost ? (\n <Item className=\"gap-2\" onSelect={() => { keepFocus.current = () => document.getElementById(`genesis-chat-edit-${message.id}`)?.focus(); ctx.startEdit(message.id); }}>\n <Pencil className=\"size-4\" aria-hidden /> Edit\n </Item>\n ) : null}\n {ctx.canPin ? (\n <Item className=\"gap-2\" onSelect={() => ctx.pin(message, !pinned)}>\n {pinned ? <PinOff className=\"size-4\" aria-hidden /> : <Pin className=\"size-4\" aria-hidden />} {pinned ? \"Unpin\" : \"Pin\"}\n </Item>\n ) : null}\n <Item className=\"gap-2\" onSelect={() => ctx.save(message)}>\n <Bookmark className=\"size-4\" aria-hidden /> Save\n </Item>\n {!mine && message.senderId ? (\n <Item className=\"gap-2\" onSelect={() => ctx.askReport(message)}>\n <Flag className=\"size-4\" aria-hidden /> Report\n </Item>\n ) : null}\n {canDelete ? (\n <>\n <Separator />\n <Item onSelect={() => ctx.askDelete(message)} className=\"gap-2 text-destructive focus:text-destructive\">\n <Trash2 className=\"size-4\" aria-hidden /> Delete\n </Item>\n </>\n ) : null}\n </>\n );\n}\n\n/** Desktop: a small bar beside the bubble on hover or focus (React, Reply, More). Touch uses long-press. */\nfunction HoverBar({ message, mine }: { message: ChatMessage; mine: boolean }) {\n const ctx = useThreadContext();\n const keepFocus = useRef<(() => void) | null>(null);\n const [open, setOpen] = useState<\"react\" | \"more\" | null>(null);\n const [full, setFull] = useState(false);\n return (\n <div\n className={cn(\n \"flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity focus-within:opacity-100 group-hover/msg:opacity-100 [@media(hover:none)]:hidden\",\n open && \"opacity-100\",\n mine ? \"flex-row-reverse\" : \"flex-row\",\n )}\n >\n {ctx.canPost ? (\n <Popover\n open={open === \"react\"}\n onOpenChange={(o) => {\n setOpen(o ? \"react\" : null);\n if (!o) setFull(false);\n }}\n >\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 rounded-full text-muted-foreground\" aria-label=\"React\">\n <SmilePlus />\n </Button>\n </PopoverTrigger>\n {full ? (\n <PopoverContent side=\"top\" align={mine ? \"end\" : \"start\"} className=\"w-auto overflow-hidden p-0\">\n <ChatEmojiPicker\n emojibaseUrl={ctx.emojibaseUrl}\n onSelect={(emoji) => {\n const on = message.reactions.some((r) => r.emoji === emoji && r.userId === ctx.me);\n ctx.react(message, emoji, !on);\n setOpen(null);\n setFull(false);\n }}\n />\n </PopoverContent>\n ) : (\n <PopoverContent side=\"top\" align={mine ? \"end\" : \"start\"} className=\"flex w-auto gap-0.5 rounded-full p-1\">\n {ctx.quickReactions.map((emoji) => {\n const on = message.reactions.some((r) => r.emoji === emoji && r.userId === ctx.me);\n return (\n <button\n key={emoji}\n type=\"button\"\n className={cn(\"flex size-9 items-center justify-center rounded-full text-xl transition-transform hover:scale-125 hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\", on && \"bg-primary/10\")}\n aria-label={`${on ? \"Remove\" : \"React with\"} ${emoji}`}\n aria-pressed={on}\n onClick={() => {\n ctx.react(message, emoji, !on);\n setOpen(null);\n }}\n >\n {emoji}\n </button>\n );\n })}\n {canPickEmoji(ctx.emojibaseUrl) ? (\n <button\n type=\"button\"\n className=\"flex size-9 items-center justify-center rounded-full text-muted-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label=\"More reactions\"\n onClick={() => setFull(true)}\n data-testid=\"genesis-chat-more-reactions\"\n >\n <Plus className=\"size-4\" />\n </button>\n ) : null}\n </PopoverContent>\n )}\n </Popover>\n ) : null}\n {ctx.canPost ? (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 rounded-full text-muted-foreground\" aria-label=\"Reply\" onClick={() => ctx.reply(message)}>\n <Reply />\n </Button>\n ) : null}\n <DropdownMenu open={open === \"more\"} onOpenChange={(o) => setOpen(o ? \"more\" : null)}>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 rounded-full text-muted-foreground\" aria-label=\"More actions\" data-testid=\"genesis-chat-more\">\n <MoreHorizontal />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={mine ? \"end\" : \"start\"} className=\"w-56\" onCloseAutoFocus={(e) => returnFocus(e, keepFocus)}>\n <ActionItems message={message} mine={mine} keepFocus={keepFocus} Item={DropdownMenuItem} Separator={DropdownMenuSeparator} />\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n\n","/**\n * @feat:chat\n * Scheduled send on the web: the send button's menu (tomorrow 9 AM, Monday 9 AM, or a date\n * and time you pick), and `ChatScheduledList`, your messages waiting to go, each with Cancel.\n */\nimport { useEffect, useMemo, useState } from \"react\";\nimport { AlertCircle, CalendarClock, ChevronUp, Clock, X } from \"lucide-react\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n EmptyState,\n Input,\n Label,\n Skeleton,\n cn,\n toast,\n} from \"@marktiderman/genesis-ui\";\nimport { isSchedulable, scheduleLabel, scheduleQuickPicks } from \"../core/extras\";\nimport { previewText } from \"../core/thread\";\nimport { useScheduled } from \"../react/index\";\n\nexport interface ChatScheduleMenuProps {\n /** Called with the chosen time. */\n onSchedule: (at: Date) => void;\n disabled?: boolean;\n /** For tests and demos. */\n now?: Date;\n}\n\n/** `YYYY-MM-DDTHH:mm` in local time, for a datetime-local input. */\nexport function toLocalInput(d: Date): string {\n const p = (n: number) => String(n).padStart(2, \"0\");\n return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}T${p(d.getHours())}:${p(d.getMinutes())}`;\n}\n\n/** The chevron beside Send: \"Schedule message\" with quick picks and a custom time. */\nexport function ChatScheduleMenu({ onSchedule, disabled, now }: ChatScheduleMenuProps) {\n const [picking, setPicking] = useState(false);\n const picks = useMemo(() => scheduleQuickPicks(now ?? new Date()), [now]);\n return (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"-ml-1 size-8 shrink-0 self-center rounded-full text-muted-foreground\"\n disabled={disabled}\n aria-label=\"Send options\"\n data-testid=\"genesis-chat-send-menu\"\n >\n <ChevronUp />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" side=\"top\" className=\"w-60\">\n <DropdownMenuLabel className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <CalendarClock className=\"size-3.5\" aria-hidden /> Schedule message\n </DropdownMenuLabel>\n {picks.map((p) => (\n <DropdownMenuItem key={p.label} className=\"gap-2\" onSelect={() => onSchedule(p.at)} data-testid=\"genesis-chat-schedule-pick\">\n <Clock className=\"size-4\" aria-hidden /> {p.label}\n </DropdownMenuItem>\n ))}\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"gap-2\" onSelect={() => setPicking(true)} data-testid=\"genesis-chat-schedule-custom\">\n <CalendarClock className=\"size-4\" aria-hidden /> Pick a date and time…\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n <ScheduleDialog open={picking} onOpenChange={setPicking} onSchedule={onSchedule} now={now} />\n </>\n );\n}\n\nfunction ScheduleDialog({ open, onOpenChange, onSchedule, now }: { open: boolean; onOpenChange: (o: boolean) => void; onSchedule: (at: Date) => void; now?: Date }) {\n const base = now ?? new Date();\n const [value, setValue] = useState(() => toLocalInput(new Date(base.getTime() + 60 * 60_000)));\n // The default is an hour from when it opens, not from when the composer first drew.\n useEffect(() => {\n if (open) setValue(toLocalInput(new Date((now ?? new Date()).getTime() + 60 * 60_000)));\n }, [open]); // eslint-disable-line react-hooks/exhaustive-deps\n const at = new Date(value);\n const ok = isSchedulable(at, now ?? new Date());\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-sm\">\n <DialogHeader>\n <DialogTitle>Schedule message</DialogTitle>\n <DialogDescription>It sends at this time, in your time zone, as if you'd sent it then.</DialogDescription>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n if (!ok) return;\n onSchedule(at);\n onOpenChange(false);\n }}\n >\n <Label htmlFor=\"genesis-chat-schedule-at\">Date and time</Label>\n <Input\n id=\"genesis-chat-schedule-at\"\n type=\"datetime-local\"\n value={value}\n min={toLocalInput(new Date(base.getTime() + 60_000))}\n onChange={(e) => setValue(e.target.value)}\n aria-invalid={!ok}\n aria-describedby=\"genesis-chat-schedule-hint\"\n data-testid=\"genesis-chat-schedule-input\"\n />\n <p id=\"genesis-chat-schedule-hint\" className={cn(\"text-xs\", ok ? \"text-muted-foreground\" : \"text-destructive\")}>\n {ok ? scheduleLabel(at, now ?? new Date()) : \"Pick a time from a minute to a year from now.\"}\n </p>\n <DialogFooter className=\"mt-2\">\n <Button type=\"button\" variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={!ok} data-testid=\"genesis-chat-schedule-confirm\">\n Schedule\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport interface ChatScheduledListProps {\n /** One conversation's; all of yours without it. */\n conversationId?: string | null;\n /** Names a conversation in the all-conversations list. */\n conversationTitle?: (conversationId: string) => string;\n className?: string;\n}\n\n/** Your scheduled messages, soonest first, each with when it goes and Cancel (Remove for one that failed). */\nexport function ChatScheduledList({ conversationId, conversationTitle, className }: ChatScheduledListProps) {\n const { items, isLoading, cancel } = useScheduled(conversationId);\n if (isLoading) {\n return (\n <div className={cn(\"flex flex-col gap-2 p-3\", className)} aria-busy aria-label=\"Loading scheduled messages\">\n <Skeleton className=\"h-12 w-full\" />\n <Skeleton className=\"h-12 w-full\" />\n </div>\n );\n }\n if (items.length === 0) {\n return <EmptyState icon={CalendarClock} title=\"Nothing scheduled\" description=\"Use the arrow beside Send to schedule a message.\" className={className} />;\n }\n return (\n <ul className={cn(\"flex flex-col divide-y\", className)} aria-label=\"Scheduled messages\" data-testid=\"genesis-chat-scheduled-list\">\n {items.map((s) => (\n <li key={s.id} className=\"flex items-start gap-3 px-3 py-2.5\" data-testid=\"genesis-chat-scheduled-item\">\n {s.status === \"failed\" ? <AlertCircle className=\"mt-0.5 size-4 shrink-0 text-destructive\" aria-hidden /> : <Clock className=\"mt-0.5 size-4 shrink-0 text-muted-foreground\" aria-hidden />}\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-xs font-medium text-muted-foreground\">\n {s.status === \"failed\" ? \"Couldn't send\" : scheduleLabel(s.sendAt)}\n {!conversationId && conversationTitle ? ` · ${conversationTitle(s.conversationId)}` : null}\n </div>\n <div className=\"truncate text-sm\">{previewText(s.body, s.attachments[0]?.kind ?? null)}</div>\n {s.error ? <div className=\"text-xs text-destructive\">{s.error}</div> : null}\n </div>\n {s.status === \"failed\" ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 shrink-0 gap-1 text-xs\"\n onClick={() => void cancel(s.id).then(() => toast.success(\"Removed\"), () => toast.error(\"Couldn't remove it\"))}\n aria-label=\"Remove the message that couldn't send\"\n data-testid=\"genesis-chat-scheduled-remove\"\n >\n <X className=\"size-3.5\" aria-hidden /> Remove\n </Button>\n ) : s.status === \"scheduled\" ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 shrink-0 gap-1 text-xs\"\n onClick={() => void cancel(s.id).then(() => toast.success(\"Scheduled message cancelled\"), () => toast.error(\"Couldn't cancel it\"))}\n aria-label={`Cancel the message scheduled for ${scheduleLabel(s.sendAt)}`}\n data-testid=\"genesis-chat-scheduled-cancel\"\n >\n <X className=\"size-3.5\" aria-hidden /> Cancel\n </Button>\n ) : null}\n </li>\n ))}\n </ul>\n );\n}\n","/**\n * @feat:chat\n * Availability on the web: `ChatAwayBanner`, the line a thread shows when the other person is\n * away or outside their hours, and `ChatAvailabilitySettings`, where you set your own away\n * message, its end, your hours per weekday and your time zone.\n */\nimport { useEffect, useMemo, useState } from \"react\";\nimport { Moon } from \"lucide-react\";\nimport {\n Alert,\n AlertDescription,\n Button,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Skeleton,\n Switch,\n Textarea,\n cn,\n toast,\n} from \"@marktiderman/genesis-ui\";\nimport { WEEKDAYS, awayLine, awaySummary } from \"../core/availability\";\nimport type { ChatAvailability, Weekday, WorkingHours } from \"../core/types\";\nimport { useAvailability } from \"../react/index\";\nimport { toLocalInput } from \"./schedule\";\n\nexport interface ChatAwayBannerProps {\n /** One person (a direct conversation). */\n availability?: ChatAvailability | null;\n /** The person's name, as the app shows it. */\n name?: string;\n /** Several people (a group): everyone away or outside their hours is named, two at most. */\n people?: { availability: ChatAvailability | null | undefined; name: string }[];\n now?: Date;\n className?: string;\n}\n\n/** \"Mark replies Mon–Fri, 9–5 (Eastern)\", \"Away until Monday: Back Monday\", \"Sam, Lee and 2 others are away\"; nothing when everyone is around. */\nexport function ChatAwayBanner({ availability, name, people, now, className }: ChatAwayBannerProps) {\n const line = people ? awaySummary(people, { now }) : awayLine(availability, name ?? \"They\", { now });\n if (!line) return null;\n return (\n <Alert className={cn(\"rounded-none border-x-0 border-t-0 px-3 py-2\", className)} role=\"status\" data-testid=\"genesis-chat-away-banner\">\n <Moon className=\"size-4\" aria-hidden />\n <AlertDescription className=\"text-xs\">{line}</AlertDescription>\n </Alert>\n );\n}\n\nconst DAY_NAMES: Record<Weekday, string> = {\n mon: \"Monday\",\n tue: \"Tuesday\",\n wed: \"Wednesday\",\n thu: \"Thursday\",\n fri: \"Friday\",\n sat: \"Saturday\",\n sun: \"Sunday\",\n};\n\nconst FALLBACK_ZONES = [\n \"UTC\", \"America/New_York\", \"America/Chicago\", \"America/Denver\", \"America/Los_Angeles\", \"America/Toronto\", \"America/Sao_Paulo\",\n \"Europe/London\", \"Europe/Paris\", \"Europe/Berlin\", \"Africa/Johannesburg\", \"Asia/Dubai\", \"Asia/Kolkata\", \"Asia/Singapore\",\n \"Asia/Tokyo\", \"Australia/Sydney\", \"Pacific/Auckland\",\n];\n\nfunction timeZones(): string[] {\n const intl = Intl as unknown as { supportedValuesOf?: (key: string) => string[] };\n try {\n const all = intl.supportedValuesOf?.(\"timeZone\");\n if (all?.length) return all.includes(\"UTC\") ? all : [\"UTC\", ...all];\n } catch {\n // older engines\n }\n return FALLBACK_ZONES;\n}\n\nconst deviceZone = () => {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || \"UTC\";\n } catch {\n return \"UTC\";\n }\n};\n\ninterface DayRow {\n on: boolean;\n from: string;\n to: string;\n}\n\nconst defaultDays = (): Record<Weekday, DayRow> =>\n Object.fromEntries(WEEKDAYS.map((d) => [d, { on: d !== \"sat\" && d !== \"sun\", from: \"09:00\", to: \"17:00\" }])) as Record<Weekday, DayRow>;\n\nfunction daysFrom(hours: WorkingHours | null | undefined): Record<Weekday, DayRow> {\n if (!hours) return defaultDays();\n return Object.fromEntries(\n WEEKDAYS.map((d) => {\n const first = hours[d]?.[0];\n return [d, first ? { on: true, from: first[0], to: first[1] } : { on: false, from: \"09:00\", to: \"17:00\" }];\n }),\n ) as Record<Weekday, DayRow>;\n}\n\nexport interface ChatAvailabilitySettingsProps {\n /** Called after a save. */\n onSaved?: () => void;\n className?: string;\n}\n\n/**\n * Your availability: an away message (and until when), working hours per weekday, and the\n * time zone they're read in. One range per day here; extra ranges saved elsewhere are kept\n * for the days you don't change.\n */\nexport function ChatAvailabilitySettings({ onSaved, className }: ChatAvailabilitySettingsProps) {\n const { mine, mineLoading, setMine } = useAvailability();\n const zones = useMemo(timeZones, []);\n const [message, setMessage] = useState(\"\");\n const [until, setUntil] = useState(\"\");\n const [zone, setZone] = useState(deviceZone);\n const [useHours, setUseHours] = useState(false);\n const [days, setDays] = useState<Record<Weekday, DayRow>>(defaultDays);\n const [busy, setBusy] = useState(false);\n\n useEffect(() => {\n if (mineLoading) return;\n setMessage(mine?.awayMessage ?? \"\");\n setUntil(mine?.awayUntil ? toLocalInput(new Date(mine.awayUntil)) : \"\");\n setZone(mine?.timeZone ?? deviceZone());\n setUseHours(Boolean(mine?.hours && Object.keys(mine.hours).length));\n setDays(daysFrom(mine?.hours));\n }, [mine, mineLoading]);\n\n if (mineLoading) {\n return (\n <div className={cn(\"flex flex-col gap-3\", className)} aria-busy aria-label=\"Loading availability\">\n <Skeleton className=\"h-20 w-full\" />\n <Skeleton className=\"h-40 w-full\" />\n </div>\n );\n }\n\n const badRange = useHours && WEEKDAYS.some((d) => days[d].on && days[d].from === days[d].to);\n\n const save = async () => {\n if (badRange) return;\n const hours: WorkingHours | null = useHours\n ? Object.fromEntries(\n WEEKDAYS.filter((d) => days[d].on).map((d) => {\n const kept = (mine?.hours?.[d] ?? []).slice(1);\n return [d, [[days[d].from, days[d].to] as [string, string], ...kept]];\n }),\n )\n : null;\n setBusy(true);\n try {\n await setMine({\n awayMessage: message.trim() || null,\n awayUntil: until ? new Date(until).toISOString() : null,\n timeZone: zone,\n hours,\n });\n toast.success(\"Availability saved\");\n onSaved?.();\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Couldn't save\");\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <form\n className={cn(\"flex flex-col gap-6\", className)}\n onSubmit={(e) => {\n e.preventDefault();\n void save();\n }}\n data-testid=\"genesis-chat-availability-settings\"\n >\n <fieldset className=\"flex flex-col gap-2\">\n <legend className=\"mb-1 text-sm font-semibold\">Away message</legend>\n <Label htmlFor=\"genesis-chat-away-message\" className=\"sr-only\">\n Away message\n </Label>\n <Textarea\n id=\"genesis-chat-away-message\"\n value={message}\n onChange={(e) => setMessage(e.target.value)}\n maxLength={280}\n placeholder=\"Back Monday. For anything urgent, call the office.\"\n className=\"min-h-20\"\n />\n <div className=\"flex flex-wrap items-end gap-2\">\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"genesis-chat-away-until\" className=\"text-xs text-muted-foreground\">\n Away until (optional)\n </Label>\n <Input id=\"genesis-chat-away-until\" type=\"datetime-local\" value={until} onChange={(e) => setUntil(e.target.value)} className=\"w-56\" />\n </div>\n {until || message ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n setUntil(\"\");\n setMessage(\"\");\n }}\n >\n I'm back\n </Button>\n ) : null}\n </div>\n </fieldset>\n\n <fieldset className=\"flex flex-col gap-3\">\n <legend className=\"mb-1 flex w-full items-center justify-between gap-2 text-sm font-semibold\">\n <span>Working hours</span>\n </legend>\n <div className=\"flex items-center justify-between gap-3\">\n <Label htmlFor=\"genesis-chat-use-hours\" className=\"text-sm font-normal text-muted-foreground\">\n Tell people when you usually reply\n </Label>\n <Switch id=\"genesis-chat-use-hours\" checked={useHours} onCheckedChange={setUseHours} />\n </div>\n {useHours ? (\n <div className=\"flex flex-col gap-1.5\" role=\"group\" aria-label=\"Hours per day\">\n {WEEKDAYS.map((d) => (\n <div key={d} className=\"flex flex-wrap items-center gap-2 text-sm\" data-testid={`genesis-chat-hours-${d}`}>\n <Switch\n checked={days[d].on}\n onCheckedChange={(on) => setDays((x) => ({ ...x, [d]: { ...x[d], on } }))}\n aria-label={`Working on ${DAY_NAMES[d]}`}\n />\n <span className={cn(\"w-24\", !days[d].on && \"text-muted-foreground\")}>{DAY_NAMES[d]}</span>\n {days[d].on ? (\n <>\n <Input\n type=\"time\"\n value={days[d].from}\n onChange={(e) => setDays((x) => ({ ...x, [d]: { ...x[d], from: e.target.value } }))}\n aria-label={`${DAY_NAMES[d]} from`}\n className=\"h-8 w-28\"\n />\n <span aria-hidden>–</span>\n <Input\n type=\"time\"\n value={days[d].to}\n onChange={(e) => setDays((x) => ({ ...x, [d]: { ...x[d], to: e.target.value } }))}\n aria-label={`${DAY_NAMES[d]} to`}\n className=\"h-8 w-28\"\n />\n </>\n ) : (\n <span className=\"text-xs text-muted-foreground\">Not working</span>\n )}\n </div>\n ))}\n {badRange ? (\n <p className=\"text-xs text-destructive\" role=\"alert\">\n A day's start and end can't be the same time.\n </p>\n ) : (\n <p className=\"text-xs text-muted-foreground\">An end before the start runs past midnight.</p>\n )}\n </div>\n ) : null}\n <div className=\"flex flex-col gap-1\">\n <Label htmlFor=\"genesis-chat-time-zone\" className=\"text-xs text-muted-foreground\">\n Time zone\n </Label>\n <Select value={zone} onValueChange={setZone}>\n <SelectTrigger id=\"genesis-chat-time-zone\" className=\"w-72\" aria-label=\"Time zone\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent className=\"max-h-72\">\n {(zones.includes(zone) ? zones : [zone, ...zones]).map((z) => (\n <SelectItem key={z} value={z}>\n {z.replace(/_/g, \" \")}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </fieldset>\n\n <div>\n <Button type=\"submit\" loading={busy} disabled={badRange} data-testid=\"genesis-chat-availability-save\">\n Save\n </Button>\n </div>\n </form>\n );\n}\n","/**\n * @feat:chat\n * Voice notes on the web: MediaRecorder (Opus in WebM, else MP4/AAC for\n * Safari), with an AnalyserNode read every 100 ms for a live level meter and,\n * at the end, the waveform the bubble draws before the audio loads.\n */\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { CHAT_LIMITS, fileExtension, waveformPeaks } from \"../core/media\";\nimport type { LocalFile } from \"../core/outbox\";\n\nexport type VoiceRecorderState = \"idle\" | \"requesting\" | \"recording\" | \"denied\" | \"unsupported\" | \"error\";\n\nexport interface VoiceRecording {\n blob: Blob;\n /** The container's type without codec parameters, e.g. `audio/webm`. */\n contentType: string;\n name: string;\n durationMs: number;\n /** 48 peaks, 0–100. */\n waveform: number[];\n}\n\nexport interface UseVoiceRecorderOptions {\n /** The longest recording; it stops itself there (`recordingLimitMs(role)`). Default five minutes. */\n maxMs?: number;\n /** Called about every 100 ms while recording (e.g. to tell the others). */\n onTick?: () => void;\n /** Called with the recording when it stopped itself at `maxMs`. */\n onLimit?: (recording: VoiceRecording) => void;\n}\n\nconst SAMPLE_MS = 100;\nconst METER_BARS = 32;\n\n/** The type to record in: Opus in WebM where the browser has it, else MP4 (Safari). */\nexport function pickVoiceMimeType(): string | null {\n if (typeof MediaRecorder === \"undefined\") return null;\n for (const type of [\"audio/webm;codecs=opus\", \"audio/mp4\", \"audio/webm\"]) {\n try {\n if (MediaRecorder.isTypeSupported(type)) return type;\n } catch {\n // Older browsers throw on unknown types.\n }\n }\n return \"\";\n}\n\n/** A recording as a file the outbox sends: a voice attachment with its duration and waveform. */\nexport function voiceFile(recording: VoiceRecording): LocalFile {\n return {\n data: recording.blob,\n name: recording.name,\n contentType: recording.contentType,\n previewUrl: typeof URL !== \"undefined\" && URL.createObjectURL ? URL.createObjectURL(recording.blob) : undefined,\n meta: { kind: \"voice\", durationMs: recording.durationMs, waveform: recording.waveform, bytes: recording.blob.size },\n };\n}\n\nexport function useVoiceRecorder(options: UseVoiceRecorderOptions = {}) {\n const maxMs = options.maxMs ?? CHAT_LIMITS.recordingMs;\n const [state, setState] = useState<VoiceRecorderState>(\"idle\");\n const [elapsedMs, setElapsedMs] = useState(0);\n const [levels, setLevels] = useState<number[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n const opts = useRef(options);\n opts.current = options;\n const session = useRef<{\n recorder: MediaRecorder;\n stream: MediaStream;\n context: AudioContext | null;\n timer: ReturnType<typeof setInterval>;\n chunks: Blob[];\n samples: number[];\n startedAt: number;\n mimeType: string;\n discard: boolean;\n done: Promise<VoiceRecording | null>;\n } | null>(null);\n\n const cleanup = useCallback(() => {\n const s = session.current;\n if (!s) return;\n clearInterval(s.timer);\n for (const t of s.stream.getTracks()) t.stop();\n void s.context?.close().catch(() => undefined);\n session.current = null;\n }, []);\n\n const stop = useCallback(async (): Promise<VoiceRecording | null> => {\n const s = session.current;\n if (!s) return null;\n if (s.recorder.state !== \"inactive\") s.recorder.stop();\n return s.done;\n }, []);\n\n // Cancel while the browser still asks for the microphone: the answer is dropped.\n const abandoned = useRef(false);\n\n const cancel = useCallback(() => {\n const s = session.current;\n if (!s) {\n abandoned.current = true;\n setState((st) => (st === \"requesting\" ? \"idle\" : st));\n return;\n }\n s.discard = true;\n if (s.recorder.state !== \"inactive\") s.recorder.stop();\n else cleanup();\n }, [cleanup]);\n\n const start = useCallback(async () => {\n if (session.current) return;\n const mimeType = pickVoiceMimeType();\n if (mimeType === null || typeof navigator === \"undefined\" || !navigator.mediaDevices?.getUserMedia) {\n setState(\"unsupported\");\n setError(\"This browser can't record voice messages.\");\n return;\n }\n setState(\"requesting\");\n setError(null);\n abandoned.current = false;\n let stream: MediaStream;\n try {\n stream = await navigator.mediaDevices.getUserMedia({ audio: { echoCancellation: true, noiseSuppression: true } });\n } catch (e) {\n const name = (e as { name?: string })?.name;\n if (name === \"NotAllowedError\" || name === \"SecurityError\") {\n setState(\"denied\");\n setError(\"Microphone access is blocked. Allow it for this site in your browser's settings to record voice messages.\");\n } else if (name === \"NotFoundError\") {\n setState(\"error\");\n setError(\"No microphone was found.\");\n } else {\n setState(\"error\");\n setError(\"The microphone couldn't be started.\");\n }\n return;\n }\n if (abandoned.current) {\n for (const t of stream.getTracks()) t.stop();\n return;\n }\n\n let recorder: MediaRecorder;\n try {\n recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);\n } catch {\n for (const t of stream.getTracks()) t.stop();\n setState(\"unsupported\");\n setError(\"This browser can't record voice messages.\");\n return;\n }\n\n let context: AudioContext | null = null;\n let analyser: AnalyserNode | null = null;\n try {\n const Ctx = window.AudioContext ?? (window as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (Ctx) {\n context = new Ctx();\n analyser = context.createAnalyser();\n analyser.fftSize = 1024;\n context.createMediaStreamSource(stream).connect(analyser);\n }\n } catch {\n context = null;\n analyser = null;\n }\n const buffer = analyser ? new Float32Array(analyser.fftSize) : null;\n\n const chunks: Blob[] = [];\n const samples: number[] = [];\n const startedAt = Date.now();\n let resolveDone!: (r: VoiceRecording | null) => void;\n const done = new Promise<VoiceRecording | null>((r) => (resolveDone = r));\n\n const timer = setInterval(() => {\n const s = session.current;\n if (!s) return;\n let level = 0;\n if (analyser && buffer) {\n analyser.getFloatTimeDomainData(buffer);\n for (let i = 0; i < buffer.length; i++) level = Math.max(level, Math.abs(buffer[i]!));\n }\n s.samples.push(level);\n setLevels((prev) => [...prev, level].slice(-METER_BARS));\n const elapsed = Date.now() - s.startedAt;\n setElapsedMs(elapsed);\n opts.current.onTick?.();\n if (elapsed >= maxMs && s.recorder.state === \"recording\") {\n void stop().then((r) => r && opts.current.onLimit?.(r));\n }\n }, SAMPLE_MS);\n\n recorder.ondataavailable = (e) => {\n if (e.data && e.data.size > 0) chunks.push(e.data);\n };\n recorder.onstop = () => {\n const s = session.current;\n const discard = s?.discard ?? true;\n const durationMs = Math.min(maxMs, Date.now() - startedAt);\n const contentType = (recorder.mimeType || mimeType || \"audio/webm\").split(\";\")[0]!.trim();\n cleanup();\n setState(\"idle\");\n setElapsedMs(0);\n setLevels([]);\n if (discard || chunks.length === 0) {\n resolveDone(null);\n return;\n }\n const blob = new Blob(chunks, { type: contentType });\n const ext = fileExtension(\"\", contentType) || \"webm\";\n resolveDone({\n blob,\n contentType,\n name: `voice-${new Date(startedAt).toISOString().replace(/[:.]/g, \"-\")}.${ext}`,\n durationMs,\n waveform: waveformPeaks(samples, 48),\n });\n };\n\n session.current = { recorder, stream, context, timer, chunks, samples, startedAt, mimeType: mimeType ?? \"\", discard: false, done };\n recorder.start(250);\n setElapsedMs(0);\n setLevels([]);\n setState(\"recording\");\n }, [cleanup, maxMs, stop]);\n\n // Leaving the screen mid-recording throws the recording away.\n useEffect(() => () => {\n const s = session.current;\n if (s) {\n s.discard = true;\n try {\n if (s.recorder.state !== \"inactive\") s.recorder.stop();\n } catch {\n // already stopped\n }\n clearInterval(s.timer);\n for (const t of s.stream.getTracks()) t.stop();\n void s.context?.close().catch(() => undefined);\n session.current = null;\n }\n }, []);\n\n return {\n state,\n recording: state === \"recording\",\n elapsedMs,\n maxMs,\n /** The latest levels, 0–1, newest last: a live meter. */\n levels,\n error,\n clearError: () => {\n setError(null);\n setState((s) => (s === \"denied\" || s === \"error\" || s === \"unsupported\" ? \"idle\" : s));\n },\n start,\n stop,\n cancel,\n };\n}\n\nexport type VoiceRecorder = ReturnType<typeof useVoiceRecorder>;\n","/**\n * @feat:chat\n * The composer: a growing text box (Enter sends, Shift+Enter is a new line;\n * on touch screens Enter is a new line), photos and files from a picker, a\n * paste or a drop, with previews to remove before sending, a reply banner,\n * internal notes for observers, voice notes recorded in place, videos from the\n * camera, emoji, and scheduled send (the arrow beside Send). Where you may not\n * post it says why instead; when who you are couldn't load, it offers a retry.\n */\nimport {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type ChangeEvent,\n type ClipboardEvent,\n type KeyboardEvent,\n type ReactNode,\n type Ref,\n} from \"react\";\nimport { CalendarClock, FileText, Lock, Mic, Paperclip, RefreshCw, SendHorizontal, Smile, Trash2, Video, X } from \"lucide-react\";\nimport {\n Alert,\n AlertDescription,\n Button,\n Popover,\n PopoverContent,\n PopoverTrigger,\n Skeleton,\n Textarea,\n Toggle,\n Tooltip,\n cn,\n toast,\n} from \"@marktiderman/genesis-ui\";\nimport { scheduleLabel } from \"../core/extras\";\nimport { CHAT_LIMITS, attachmentKindFor, fileExtension, formatDuration, isAllowedExtension, randomId, recordingLimitMs } from \"../core/media\";\nimport type { LocalFile } from \"../core/outbox\";\nimport { parseMentions, previewText } from \"../core/thread\";\nimport type { ChatMessage } from \"../core/types\";\nimport { useChat, useScheduled, type ConversationState } from \"../react/index\";\nimport { ChatEmojiPicker, canPickEmoji } from \"./emoji-picker\";\nimport type { ResolveUser } from \"./format\";\nimport { ChatScheduleMenu, ChatScheduledList } from \"./schedule\";\nimport { ChatVideoRecorder } from \"./video\";\nimport { useVoiceRecorder, voiceFile } from \"./use-voice-recorder\";\n\nexport interface ChatComposerHandle {\n /** Adds files as if picked (a drop on the thread, say). Refused ones get a toast. */\n addFiles(files: File[] | FileList): void;\n /** Puts text at the cursor. */\n insertText(text: string): void;\n focus(): void;\n}\n\nexport interface ChatComposerProps {\n /** From `useConversation`: how to send, and whether you may. */\n conversation: Pick<ConversationState, \"send\" | \"signalTyping\" | \"signalRecording\" | \"role\" | \"canPost\" | \"accessLoading\" | \"conversation\"> &\n Partial<Pick<ConversationState, \"accessError\" | \"refetchAccess\" | \"signalRecordingVideo\" | \"conversationLoading\">>;\n /** The message being replied to; a banner shows above the box. */\n replyTo?: ChatMessage | null;\n onCancelReply?: () => void;\n /** Names the replied-to person. */\n resolveUser?: ResolveUser;\n placeholder?: string;\n /** Extra controls beside the attach button (the `composerAccessory` slot of ChatThread). */\n accessory?: ReactNode;\n /** Called after a message is queued. */\n onSent?: () => void;\n autoFocus?: boolean;\n /** Shown instead of the box, with a lock (a closed topic). */\n disabledReason?: string | null;\n /** The topic new messages go to (scheduled ones too). */\n topic?: string | null;\n /** Offer scheduled send (the arrow beside Send) and list what's scheduled. Default true. */\n scheduling?: boolean;\n /** Offer video recording. Default true where the browser can record. */\n video?: boolean;\n /** Offer the emoji picker (only when `emojibaseUrl` is given). Default true. */\n emoji?: boolean;\n /** Where the emoji picker loads its data from. */\n emojibaseUrl?: string;\n className?: string;\n ref?: Ref<ChatComposerHandle>;\n}\n\ninterface Draft {\n id: string;\n file: File;\n previewUrl: string | null;\n kind: string;\n}\n\nconst isTouch = () => typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(\"(pointer: coarse)\").matches;\nconst objectUrl = (f: Blob) => (typeof URL !== \"undefined\" && typeof URL.createObjectURL === \"function\" ? URL.createObjectURL(f) : null);\nconst revoke = (u: string | null) => {\n if (u && typeof URL !== \"undefined\" && typeof URL.revokeObjectURL === \"function\") URL.revokeObjectURL(u);\n};\nconst MAX_HEIGHT = 160;\n\nexport function ChatComposer({\n conversation: state,\n replyTo,\n onCancelReply,\n resolveUser,\n placeholder = \"Message\",\n accessory,\n onSent,\n autoFocus,\n disabledReason,\n topic,\n scheduling = true,\n video = true,\n emoji = true,\n emojibaseUrl,\n className,\n ref,\n}: ChatComposerProps) {\n const { userId: me, videoUpload } = useChat();\n const conversationId = state.conversation?.id ?? null;\n const scheduled = useScheduled(conversationId, { enabled: scheduling && Boolean(conversationId) });\n const [recordingVideo, setRecordingVideo] = useState(false);\n const [emojiOpen, setEmojiOpen] = useState(false);\n const canRecordVideo = video && typeof MediaRecorder !== \"undefined\" && typeof navigator !== \"undefined\" && Boolean(navigator.mediaDevices?.getUserMedia);\n const [text, setText] = useState(\"\");\n const [drafts, setDrafts] = useState<Draft[]>([]);\n const [internal, setInternal] = useState(false);\n const textarea = useRef<HTMLTextAreaElement>(null);\n const picker = useRef<HTMLInputElement>(null);\n const draftsRef = useRef(drafts);\n draftsRef.current = drafts;\n // One clientId per scheduled draft, kept until it is scheduled, so pressing Schedule again\n // after a timeout (the server may have saved it) never schedules it twice.\n const scheduleId = useRef<string | null>(null);\n const [schedulingNow, setSchedulingNow] = useState(false);\n const schedulingRef = useRef(false);\n\n const recorder = useVoiceRecorder({\n maxMs: recordingLimitMs(state.role),\n onTick: state.signalRecording,\n onLimit: (rec) => {\n void sendVoice(rec);\n toast.info(`Voice messages stop at ${formatDuration(recordingLimitMs(state.role))}. Sent.`);\n },\n });\n\n // Previews not sent are freed when the composer goes.\n useEffect(() => () => draftsRef.current.forEach((d) => revoke(d.previewUrl)), []);\n\n const autosize = useCallback(() => {\n const el = textarea.current;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = `${Math.min(el.scrollHeight, MAX_HEIGHT)}px`;\n }, []);\n useEffect(autosize, [text, autosize]);\n\n useEffect(() => {\n if (replyTo) textarea.current?.focus();\n }, [replyTo]);\n\n const addFiles = useCallback((list: File[] | FileList) => {\n const files = Array.from(list);\n if (files.length === 0) return;\n const next: Draft[] = [];\n let room = CHAT_LIMITS.attachmentsPerMessage - draftsRef.current.length;\n for (const file of files) {\n const ext = fileExtension(file.name, file.type);\n if (!isAllowedExtension(ext)) {\n toast.error(`${file.name} can't be sent`, { description: \"Photos, videos, audio, PDFs and office documents can.\" });\n continue;\n }\n const type = file.type || \"application/octet-stream\";\n const kind = attachmentKindFor(type);\n const limit = kind === \"video\" ? CHAT_LIMITS.videoBytes : CHAT_LIMITS.fileBytes;\n if (file.size > limit) {\n toast.error(`${file.name} is too big`, { description: `The limit is ${Math.round(limit / 1024 / 1024)} MB.` });\n continue;\n }\n if (room <= 0) {\n toast.error(`Up to ${CHAT_LIMITS.attachmentsPerMessage} files per message`);\n break;\n }\n room -= 1;\n next.push({ id: randomId(), file, kind, previewUrl: kind === \"image\" || kind === \"video\" ? objectUrl(file) : null });\n }\n if (next.length) setDrafts((d) => [...d, ...next]);\n }, []);\n\n const insertText = useCallback((value: string) => {\n const el = textarea.current;\n setText((t) => {\n if (!el) return t + value;\n const start = el.selectionStart ?? t.length;\n const end = el.selectionEnd ?? t.length;\n return t.slice(0, start) + value + t.slice(end);\n });\n el?.focus();\n }, []);\n\n useImperativeHandle(ref, () => ({ addFiles, insertText, focus: () => textarea.current?.focus() }), [addFiles, insertText]);\n\n const removeDraft = (id: string) =>\n setDrafts((d) => {\n const gone = d.find((x) => x.id === id);\n revoke(gone?.previewUrl ?? null);\n return d.filter((x) => x.id !== id);\n });\n\n const common = () => ({\n replyToId: replyTo?.id ?? null,\n visibility: internal ? (\"observers\" as const) : (\"everyone\" as const),\n ...(topic ? { topic } : {}),\n });\n\n const scheduleAt = async (at: Date) => {\n const body = text.trim();\n if ((!body && drafts.length === 0) || !conversationId || schedulingRef.current) return;\n schedulingRef.current = true;\n setSchedulingNow(true);\n scheduleId.current ??= randomId();\n const files: LocalFile[] = drafts.map((d) => ({\n data: d.file,\n name: d.file.name,\n contentType: d.file.type || \"application/octet-stream\",\n meta: { kind: d.kind, bytes: d.file.size, name: d.file.name },\n }));\n try {\n await scheduled.schedule(\n { conversationId, clientId: scheduleId.current, body, mentions: parseMentions(body), replyToId: replyTo?.id ?? null, topic: topic ?? null, sendAt: at },\n files,\n );\n scheduleId.current = null;\n setText(\"\");\n drafts.forEach((d) => revoke(d.previewUrl));\n setDrafts([]);\n onCancelReply?.();\n toast.success(`Scheduled for ${scheduleLabel(at)}`);\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Couldn't schedule it\");\n } finally {\n schedulingRef.current = false;\n setSchedulingNow(false);\n }\n };\n\n const submit = () => {\n const body = text.trim();\n if (!body && drafts.length === 0) return;\n if (body.length > CHAT_LIMITS.bodyChars) {\n toast.error(`Messages can be up to ${CHAT_LIMITS.bodyChars.toLocaleString()} characters`);\n return;\n }\n const files: LocalFile[] = drafts.map((d) => ({\n data: d.file,\n name: d.file.name,\n contentType: d.file.type || \"application/octet-stream\",\n previewUrl: d.previewUrl ?? undefined,\n meta: { kind: d.kind, bytes: d.file.size, name: d.file.name },\n }));\n void state.send({ body, mentions: parseMentions(body), ...common() }, files);\n setText(\"\");\n setDrafts([]);\n onCancelReply?.();\n onSent?.();\n textarea.current?.focus();\n };\n\n async function sendVoice(rec: Awaited<ReturnType<typeof recorder.stop>>) {\n if (!rec) return;\n if (rec.durationMs < 700) {\n toast.info(\"Hold on a little longer to record a voice message\");\n return;\n }\n await state.send({ body: \"\", ...common() }, [voiceFile(rec)]);\n onCancelReply?.();\n onSent?.();\n }\n\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing && !isTouch()) {\n e.preventDefault();\n submit();\n } else if (e.key === \"Escape\" && replyTo) {\n onCancelReply?.();\n }\n };\n\n const onChange = (e: ChangeEvent<HTMLTextAreaElement>) => {\n setText(e.target.value);\n if (e.target.value) state.signalTyping();\n };\n\n const onPaste = (e: ClipboardEvent<HTMLTextAreaElement>) => {\n const files = Array.from(e.clipboardData?.files ?? []);\n if (files.length) {\n e.preventDefault();\n addFiles(files);\n }\n };\n\n // Loading who you are in this conversation.\n if (state.accessLoading) {\n return (\n <div className={cn(\"border-t p-3\", className)} aria-busy>\n <Skeleton className=\"h-10 w-full rounded-2xl\" />\n </div>\n );\n }\n\n if (state.accessError) {\n return (\n <div className={cn(\"flex items-center justify-center gap-2 border-t p-3 text-sm text-muted-foreground\", className)} role=\"alert\" data-testid=\"genesis-chat-access-error\">\n <span>Couldn't check whether you can post here.</span>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"h-7 gap-1\" onClick={() => void state.refetchAccess?.()} data-testid=\"genesis-chat-access-retry\">\n <RefreshCw className=\"size-3.5\" aria-hidden /> Try again\n </Button>\n </div>\n );\n }\n\n // Who may post depends on the conversation's settings: wait for them rather than say the wrong reason.\n if (!state.canPost && state.conversationLoading) {\n return (\n <div className={cn(\"border-t p-3\", className)} aria-busy>\n <Skeleton className=\"h-10 w-full rounded-2xl\" />\n </div>\n );\n }\n\n if (state.canPost && disabledReason) {\n return (\n <div className={cn(\"border-t p-3 text-center text-sm text-muted-foreground\", className)} role=\"status\" data-testid=\"genesis-chat-composer-disabled\">\n <Lock className=\"mr-1 inline size-3.5 align-[-2px]\" aria-hidden />\n {disabledReason}\n </div>\n );\n }\n\n if (!state.canPost) {\n const adminsOnly = state.conversation?.settings?.who_posts === \"admins\";\n return (\n <div className={cn(\"border-t p-3 text-center text-sm text-muted-foreground\", className)} role=\"status\" data-testid=\"genesis-chat-cannot-post\">\n <Lock className=\"mr-1 inline size-3.5 align-[-2px]\" aria-hidden />\n {adminsOnly ? \"Only admins can post here\" : \"You can't post in this conversation\"}\n </div>\n );\n }\n\n const hasContent = text.trim().length > 0 || drafts.length > 0;\n const replyName = replyTo?.senderId ? (replyTo.senderId === me ? \"yourself\" : (resolveUser?.(replyTo.senderId).name ?? \"message\")) : \"message\";\n\n return (\n <div className={cn(\"border-t bg-background\", className)} data-testid=\"genesis-chat-composer\">\n {recorder.error ? (\n <Alert variant=\"destructive\" className=\"m-2 w-auto\" data-testid=\"genesis-chat-mic-error\">\n <Mic className=\"size-4\" aria-hidden />\n <AlertDescription className=\"flex items-start justify-between gap-2\">\n <span>{recorder.error}</span>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-6 shrink-0\" onClick={recorder.clearError} aria-label=\"Dismiss\">\n <X />\n </Button>\n </AlertDescription>\n </Alert>\n ) : null}\n {replyTo ? (\n <div className=\"flex items-center gap-2 border-b px-3 py-2\" data-testid=\"genesis-chat-reply-banner\">\n <div className=\"min-w-0 flex-1 border-l-4 border-primary pl-2\">\n <div className=\"text-xs font-semibold text-primary\">Replying to {replyName}</div>\n <div className=\"truncate text-xs text-muted-foreground\">{previewText(replyTo.body, replyTo.attachments[0]?.kind ?? null, Boolean(replyTo.deletedAt))}</div>\n </div>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 shrink-0\" onClick={onCancelReply} aria-label=\"Cancel reply\">\n <X />\n </Button>\n </div>\n ) : null}\n {scheduling && scheduled.items.length ? (\n <div className=\"flex items-center px-3 pt-1.5\">\n <Popover>\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"h-6 gap-1 px-2 text-xs text-muted-foreground\" data-testid=\"genesis-chat-scheduled-count\">\n <CalendarClock className=\"size-3.5\" aria-hidden />\n {scheduled.items.length === 1 ? \"1 scheduled message\" : `${scheduled.items.length} scheduled messages`}\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-80 p-0\">\n <ChatScheduledList conversationId={conversationId} />\n </PopoverContent>\n </Popover>\n </div>\n ) : null}\n {drafts.length ? (\n <ul className=\"flex gap-2 overflow-x-auto px-3 pt-3\" aria-label=\"Attachments to send\">\n {drafts.map((d) => (\n <li key={d.id} className=\"relative shrink-0\">\n {d.kind === \"image\" && d.previewUrl ? (\n <img src={d.previewUrl} alt={d.file.name} className=\"size-16 rounded-lg border object-cover\" />\n ) : d.kind === \"video\" && d.previewUrl ? (\n <video src={d.previewUrl} muted playsInline preload=\"metadata\" className=\"size-16 rounded-lg border object-cover\" aria-label={d.file.name} />\n ) : (\n <span className=\"flex h-16 w-40 items-center gap-2 rounded-lg border bg-muted px-2 text-xs\">\n <FileText className=\"size-4 shrink-0\" aria-hidden />\n <span className=\"line-clamp-2 break-all\">{d.file.name}</span>\n </span>\n )}\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"secondary\"\n className=\"absolute -right-1.5 -top-1.5 size-5 rounded-full border shadow-sm [&_svg]:size-3\"\n onClick={() => removeDraft(d.id)}\n aria-label={`Remove ${d.file.name}`}\n >\n <X />\n </Button>\n </li>\n ))}\n </ul>\n ) : null}\n\n {recorder.recording || recorder.state === \"requesting\" ? (\n <div className=\"flex items-center gap-2 p-2\" data-testid=\"genesis-chat-recording\">\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"shrink-0 rounded-full text-destructive hover:text-destructive\" onClick={recorder.cancel} aria-label=\"Cancel recording\">\n <Trash2 />\n </Button>\n <span className=\"size-2.5 shrink-0 animate-pulse rounded-full bg-destructive\" aria-hidden />\n <span className=\"w-24 shrink-0 text-sm tabular-nums\" role=\"timer\" aria-live=\"off\">\n {formatDuration(recorder.elapsedMs)}\n <span className=\"text-muted-foreground\"> / {formatDuration(recorder.maxMs)}</span>\n </span>\n <span className=\"flex h-8 flex-1 items-center justify-end gap-[2px] overflow-hidden\" aria-hidden>\n {recorder.levels.map((l, i) => (\n <span key={i} className=\"w-[3px] shrink-0 rounded-full bg-primary\" style={{ height: `${Math.max(10, Math.min(100, l * 140))}%` }} />\n ))}\n </span>\n <span className=\"sr-only\" role=\"status\">\n {recorder.state === \"requesting\" ? \"Asking for the microphone\" : \"Recording a voice message\"}\n </span>\n <Button\n type=\"button\"\n size=\"icon\"\n className=\"shrink-0 rounded-full\"\n disabled={!recorder.recording}\n onClick={() => void recorder.stop().then(sendVoice)}\n aria-label=\"Send voice message\"\n data-testid=\"genesis-chat-voice-send\"\n >\n <SendHorizontal />\n </Button>\n </div>\n ) : (\n <div className=\"flex items-end gap-1 p-2\">\n <input\n ref={picker}\n type=\"file\"\n multiple\n className=\"hidden\"\n tabIndex={-1}\n aria-hidden\n accept=\"image/*,video/*,audio/*,.pdf,.txt,.csv,.docx,.xlsx,.pptx,.heic,.heif\"\n onChange={(e) => {\n if (e.target.files) addFiles(e.target.files);\n e.target.value = \"\";\n }}\n data-testid=\"genesis-chat-file-input\"\n />\n <Tooltip content=\"Attach photos or files\">\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"shrink-0 rounded-full text-muted-foreground\" onClick={() => picker.current?.click()} aria-label=\"Attach photos or files\">\n <Paperclip />\n </Button>\n </Tooltip>\n {canRecordVideo && conversationId ? (\n <Tooltip content=\"Record a video\">\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"shrink-0 rounded-full text-muted-foreground\" onClick={() => setRecordingVideo(true)} aria-label=\"Record a video\" data-testid=\"genesis-chat-video-button\">\n <Video />\n </Button>\n </Tooltip>\n ) : null}\n {accessory}\n {state.role === \"observer\" ? (\n <Tooltip content={internal ? \"Internal note: only observers see it\" : \"Write an internal note\"}>\n <Toggle\n pressed={internal}\n onPressedChange={setInternal}\n aria-label=\"Internal note\"\n size=\"sm\"\n className=\"h-10 shrink-0 rounded-full data-[state=on]:bg-warning/20\"\n >\n <Lock className=\"size-4\" />\n </Toggle>\n </Tooltip>\n ) : null}\n <Textarea\n ref={textarea}\n rows={1}\n value={text}\n onChange={onChange}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n placeholder={internal ? \"Internal note\" : placeholder}\n aria-label={internal ? \"Internal note\" : placeholder}\n autoFocus={autoFocus}\n maxLength={CHAT_LIMITS.bodyChars}\n enterKeyHint=\"send\"\n className={cn(\n \"max-h-40 min-h-10 flex-1 resize-none rounded-2xl py-2 leading-snug\",\n internal && \"border-warning/60 bg-warning/10\",\n )}\n data-testid=\"genesis-chat-input\"\n />\n {emoji && canPickEmoji(emojibaseUrl) ? (\n <Popover open={emojiOpen} onOpenChange={setEmojiOpen}>\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"shrink-0 rounded-full text-muted-foreground\" aria-label=\"Add emoji\" data-testid=\"genesis-chat-emoji-button\">\n <Smile />\n </Button>\n </PopoverTrigger>\n <PopoverContent side=\"top\" align=\"end\" className=\"w-auto overflow-hidden p-0\" onCloseAutoFocus={(e) => { e.preventDefault(); textarea.current?.focus(); }}>\n <ChatEmojiPicker\n emojibaseUrl={emojibaseUrl}\n onSelect={(e) => {\n insertText(e);\n setEmojiOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n ) : null}\n {hasContent ? (\n <>\n <Button type=\"button\" size=\"icon\" className=\"shrink-0 rounded-full\" onClick={submit} aria-label=\"Send\" data-testid=\"genesis-chat-send\">\n <SendHorizontal />\n </Button>\n {scheduling && conversationId && !internal ? <ChatScheduleMenu onSchedule={(at) => void scheduleAt(at)} disabled={schedulingNow} /> : null}\n </>\n ) : (\n <Tooltip content=\"Record a voice message\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"shrink-0 rounded-full text-muted-foreground\"\n onClick={() => void recorder.start()}\n aria-label=\"Record a voice message\"\n data-testid=\"genesis-chat-mic\"\n >\n <Mic />\n </Button>\n </Tooltip>\n )}\n </div>\n )}\n {canRecordVideo && conversationId ? (\n <ChatVideoRecorder\n open={recordingVideo}\n onOpenChange={setRecordingVideo}\n conversationId={conversationId}\n maxMs={recordingLimitMs(state.role)}\n send={(input, files) => state.send({ ...input, ...common() }, files)}\n videoUpload={videoUpload}\n onTick={state.signalRecordingVideo ?? state.signalRecording}\n onSent={() => {\n onCancelReply?.();\n onSent?.();\n }}\n />\n ) : null}\n </div>\n );\n}\n","/**\n * @feat:chat\n * The topic bar: \"All\" and each of a conversation's topics as a single-choice toggle group\n * (Radix: arrow keys move between them), a lock on closed ones, and, for owners and admins, a\n * menu to start a topic and to close or reopen the one open. ChatThread shows it when the\n * conversation has topics.\n */\nimport { useState } from \"react\";\nimport { Hash, Lock, LockOpen, MoreHorizontal, Plus } from \"lucide-react\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Input,\n Label,\n ToggleGroup,\n ToggleGroupItem,\n cn,\n toast,\n} from \"@marktiderman/genesis-ui\";\nimport { topicKey } from \"../core/extras\";\nimport type { ChatTopic, TopicInput } from \"../core/types\";\n\nexport interface ChatTopicBarProps {\n topics: ChatTopic[];\n /** The topic shown; null for \"All\". */\n value: string | null;\n onValueChange: (topic: string | null) => void;\n /** Owners and admins: \"New topic\", and close or reopen. */\n canManage?: boolean;\n /** Saves a topic (from useTopics). */\n onSetTopic?: (topic: string, input: TopicInput) => Promise<void>;\n className?: string;\n}\n\nconst ALL = \"__all__\";\n\nexport function ChatTopicBar({ topics, value, onValueChange, canManage = false, onSetTopic, className }: ChatTopicBarProps) {\n const [creating, setCreating] = useState(false);\n const [title, setTitle] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const current = value ? topics.find((t) => t.topic === value) : undefined;\n\n const create = async () => {\n const name = title.trim();\n if (!name || !onSetTopic) return;\n const key = topicKey(name);\n if (topics.some((t) => t.topic === key)) {\n toast.error(\"There's already a topic with that name\");\n return;\n }\n setBusy(true);\n try {\n await onSetTopic(key, { title: name, position: topics.length });\n setCreating(false);\n setTitle(\"\");\n onValueChange(key);\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Couldn't add the topic\");\n } finally {\n setBusy(false);\n }\n };\n\n const toggleClosed = async (t: ChatTopic) => {\n try {\n await onSetTopic?.(t.topic, { closed: !t.closedAt });\n toast.success(t.closedAt ? `Reopened ${t.title}` : `Closed ${t.title}`);\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Couldn't change the topic\");\n }\n };\n\n return (\n <div className={cn(\"flex items-center gap-1 border-b px-2 py-1.5\", className)} data-testid=\"genesis-chat-topic-bar\">\n <ToggleGroup\n type=\"single\"\n value={value ?? ALL}\n onValueChange={(v) => {\n // A single toggle group clears on a second click; keep a choice instead.\n if (v) onValueChange(v === ALL ? null : v);\n }}\n aria-label=\"Topics\"\n className=\"flex min-w-0 flex-1 justify-start gap-1 overflow-x-auto [scrollbar-width:none]\"\n >\n <ToggleGroupItem value={ALL} size=\"sm\" className=\"h-7 shrink-0 rounded-full px-3 text-xs\" data-testid=\"genesis-chat-topic-all\">\n All\n </ToggleGroupItem>\n {topics.map((t) => (\n <ToggleGroupItem\n key={t.topic}\n value={t.topic}\n size=\"sm\"\n className=\"h-7 shrink-0 gap-1 rounded-full px-3 text-xs\"\n aria-label={t.closedAt ? `${t.title} (closed)` : t.title}\n data-testid={`genesis-chat-topic-${t.topic}`}\n >\n {t.closedAt ? <Lock className=\"size-3\" aria-hidden /> : <Hash className=\"size-3 opacity-60\" aria-hidden />}\n <span className=\"max-w-[10rem] truncate\">{t.title}</span>\n </ToggleGroupItem>\n ))}\n </ToggleGroup>\n {canManage && onSetTopic ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"size-7 shrink-0 rounded-full\" aria-label=\"Topic options\" data-testid=\"genesis-chat-topic-menu\">\n <MoreHorizontal />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuItem className=\"gap-2\" onSelect={() => setCreating(true)} data-testid=\"genesis-chat-topic-new\">\n <Plus className=\"size-4\" aria-hidden /> New topic\n </DropdownMenuItem>\n {current ? (\n <DropdownMenuItem className=\"gap-2\" onSelect={() => void toggleClosed(current)} data-testid=\"genesis-chat-topic-close\">\n {current.closedAt ? <LockOpen className=\"size-4\" aria-hidden /> : <Lock className=\"size-4\" aria-hidden />}\n {current.closedAt ? \"Reopen topic\" : \"Close topic\"}\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n\n <Dialog open={creating} onOpenChange={(o) => !busy && setCreating(o)}>\n <DialogContent className=\"sm:max-w-sm\">\n <DialogHeader>\n <DialogTitle>New topic</DialogTitle>\n <DialogDescription>Messages posted in a topic stay together, under its name.</DialogDescription>\n </DialogHeader>\n <form\n className=\"flex flex-col gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n void create();\n }}\n >\n <Label htmlFor=\"genesis-chat-topic-title\">Name</Label>\n <Input id=\"genesis-chat-topic-title\" value={title} onChange={(e) => setTitle(e.target.value)} maxLength={160} autoFocus placeholder=\"Week 1: Habits\" />\n <DialogFooter className=\"mt-2\">\n <Button type=\"button\" variant=\"outline\" onClick={() => setCreating(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" loading={busy} disabled={!title.trim()} data-testid=\"genesis-chat-topic-create\">\n Add topic\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n","/**\n * @feat:chat\n * One conversation, whole: a header, the messages (oldest at the top, kept at\n * the bottom as new ones arrive unless you scrolled up, then a \"New messages\"\n * pill; earlier ones load as you reach the top without moving what you were\n * reading), day dividers and the \"New\" line, who is typing, and the composer.\n * Files dropped anywhere on it attach. Screen readers hear incoming messages.\n * With topics, a topic bar filters it; when the other person is away or outside\n * their hours a banner says so; search (in the header) jumps to a message,\n * loading earlier ones as needed; links get preview cards.\n */\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type DragEvent,\n type ReactNode,\n} from \"react\";\nimport { ArrowDown, ArrowLeft, ImagePlus, MessageSquare, Pin, Search } from \"lucide-react\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n EmptyState,\n Label,\n RadioGroup,\n RadioGroupItem,\n Sheet,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n Skeleton,\n Spinner,\n Textarea,\n UserAvatar,\n cn,\n toast,\n} from \"@marktiderman/genesis-ui\";\nimport { renderSlot, type SlotOverride } from \"@marktiderman/genesis-core/slots\";\nimport { ChatError } from \"../core/client\";\nimport { extractLinks } from \"../core/extras\";\nimport { activityLine, dayLabel, itemSender, itemTime, parseMentions, previewText, startsDay, startsGroup, type ThreadItem } from \"../core/thread\";\nimport type { ChatConversation, ChatMember, ChatMessage, ChatRole, ChatSearchHit } from \"../core/types\";\nimport { useAvailability, useChat, useConversation, useFileUrls, useLinkPreviews, useMessageActions, usePins, useTopics } from \"../react/index\";\nimport { awaySummary } from \"../core/availability\";\nimport type { ChatAttachmentSlotProps } from \"./attachments\";\nimport { MessageRow, plainText } from \"./bubble\";\nimport { ChatAwayBanner } from \"./availability\";\nimport type { LinkPreviewImages } from \"./cards\";\nimport { ChatErrorBoundary } from \"./error-boundary\";\nimport { ChatComposer, type ChatComposerHandle } from \"./composer\";\nimport type { ResolveUser } from \"./format\";\nimport { ChatSearch } from \"./search\";\nimport { ChatTopicBar } from \"./topics\";\nimport { QUICK_REACTIONS, ThreadContext, type ThreadContextValue } from \"./thread-context\";\n\nexport interface ChatThreadHeaderProps {\n conversationId: string;\n conversation: ChatConversation | null;\n /** The title the thread worked out (the conversation's, or the other person's name). */\n title: string;\n /** How many people are in it, for a group. */\n subtitle: string | null;\n /** \"Sam is typing…\" while someone is. */\n activity: string | null;\n /** The other person in a two-person conversation. */\n otherUserId: string | null;\n members: ChatMember[];\n role: ChatRole | null;\n resolveUser: ResolveUser;\n onBack?: () => void;\n backClassName?: string;\n /** Opens search in this conversation (absent when search is off). */\n onSearch?: () => void;\n}\n\nexport interface ChatThreadEmptyProps {\n conversationId: string;\n canPost: boolean;\n}\n\nexport interface ChatComposerAccessoryProps {\n conversationId: string;\n insertText(text: string): void;\n addFiles(files: File[]): void;\n}\n\nexport interface ChatThreadSlots {\n /** The bar above the messages. */\n header?: SlotOverride<ChatThreadHeaderProps>;\n /** What a conversation with no messages shows. */\n empty?: SlotOverride<ChatThreadEmptyProps>;\n /** Draws the app's own attachment kinds (form, lesson…); a generic card by default, `null` hides them. */\n attachment?: ComponentType<ChatAttachmentSlotProps> | null;\n /** Extra controls in the composer, beside the attach button. */\n composerAccessory?: SlotOverride<ChatComposerAccessoryProps>;\n}\n\nexport interface ChatThreadProps {\n conversationId: string;\n /** Names people. Required: the package knows no people tables, the app does. */\n resolveUser: ResolveUser;\n /** The header's title; worked out from the conversation and its members by default. */\n title?: string;\n /** Shows a back button in the header. */\n onBack?: () => void;\n /** Classes for that back button (ChatPanel hides it on wide screens). */\n backClassName?: string;\n /** One thread's replies instead of the main timeline. */\n threadRootId?: string;\n /** One topic's messages. */\n topic?: string;\n /**\n * Shown on messages that have replies, to open their thread. Also called when a search result\n * is a reply in a thread, with `jumpTo` (that reply) for the thread's own ChatThread.\n */\n onOpenThread?: (message: ChatMessage, opts?: { jumpTo?: { messageId: string; seq: number } }) => void;\n /** The quick reactions; 👍 ❤️ 😂 😮 😢 🙏 by default. */\n quickReactions?: readonly string[];\n placeholder?: string;\n /** Show the topic bar even before the first topic exists (so an owner can add one). */\n showTopics?: boolean;\n /** Scroll to this message once it's loaded (a search result across conversations); `seq` lets earlier pages load to reach it. */\n jumpTo?: { messageId: string; seq?: number; threadRootId?: string | null } | null;\n /** A search button in the header. Default true. */\n search?: boolean;\n /** Scheduled send in the composer. Default true. */\n scheduling?: boolean;\n /** The away banner. Default true. */\n availability?: boolean;\n /** Where the emoji picker loads its data from (self-hosted emojibase-data). Without it there is no full picker; the quick reactions stay. */\n emojibaseUrl?: string;\n /** Link preview images: `\"off\"` by default, `\"proxy\"` through `linkPreviewProxyUrl`, or `\"direct\"` from the linked site (which then sees readers' IPs). */\n linkPreviewImages?: LinkPreviewImages;\n /** Your image proxy for `linkPreviewImages: \"proxy\"`: the URL to load for an og:image. */\n linkPreviewProxyUrl?: (url: string) => string | null | undefined;\n slots?: ChatThreadSlots;\n className?: string;\n}\n\nconst REPORT_REASONS = [\n { value: \"spam\", label: \"Spam\" },\n { value: \"harassment\", label: \"Harassment or bullying\" },\n { value: \"safety\", label: \"Someone may be at risk\" },\n { value: \"other\", label: \"Something else\" },\n] as const;\n\ntype ReportReason = (typeof REPORT_REASONS)[number][\"value\"];\n\nconst itemKey = (item: ThreadItem) => (item.type === \"message\" ? item.message.clientId || item.message.id : item.pending.clientId);\n\nfunction errorText(e: unknown): string {\n if (e instanceof ChatError) {\n if (e.forbidden) return \"You can't do that here\";\n if (e.rateLimited) return \"Slow down a little and try again\";\n if (e.transient) return \"Check your connection and try again\";\n }\n return e instanceof Error ? e.message : \"Something went wrong\";\n}\n\nfunction DefaultHeader({ title, subtitle, otherUserId, resolveUser, onBack, backClassName, onSearch }: ChatThreadHeaderProps) {\n const other = otherUserId ? resolveUser(otherUserId) : null;\n return (\n <header className=\"flex min-h-14 items-center gap-3 border-b px-3 py-2\" data-testid=\"genesis-chat-thread-header\">\n {onBack ? (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className={cn(\"-ml-1 shrink-0\", backClassName)} onClick={onBack} aria-label=\"Back to conversations\">\n <ArrowLeft />\n </Button>\n ) : null}\n <UserAvatar name={title} src={other?.avatarUrl} size=\"sm\" />\n <div className=\"min-w-0 flex-1\">\n <h2 className=\"truncate text-sm font-semibold leading-tight\">{title}</h2>\n {subtitle ? <p className=\"truncate text-xs text-muted-foreground\">{subtitle}</p> : null}\n </div>\n {onSearch ? (\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" className=\"shrink-0\" onClick={onSearch} aria-label=\"Search this conversation\" data-testid=\"genesis-chat-thread-search\">\n <Search />\n </Button>\n ) : null}\n </header>\n );\n}\n\nfunction DefaultEmpty({ canPost }: ChatThreadEmptyProps) {\n return <EmptyState icon={MessageSquare} title=\"No messages yet\" description={canPost ? \"Say hello.\" : undefined} />;\n}\n\nexport function ChatThread({\n conversationId,\n resolveUser,\n title: titleProp,\n onBack,\n backClassName,\n threadRootId,\n topic: topicProp,\n onOpenThread,\n quickReactions = QUICK_REACTIONS,\n placeholder,\n showTopics,\n jumpTo: jumpToProp,\n search = true,\n scheduling = true,\n availability = true,\n emojibaseUrl,\n linkPreviewImages = \"off\",\n linkPreviewProxyUrl,\n slots,\n className,\n}: ChatThreadProps) {\n const { userId: me, attachmentKinds, client: chatClient } = useChat();\n const topicsState = useTopics(threadRootId ? null : conversationId);\n const [chosenTopic, setChosenTopic] = useState<string | null>(null);\n const topic = topicProp ?? chosenTopic ?? undefined;\n const state = useConversation(conversationId, { threadRootId, topic });\n const actions = useMessageActions();\n const pinIds = usePins(conversationId);\n const { items, messages, members, role, canPost, conversation, activity } = state;\n\n const paths = useMemo(\n () => messages.flatMap((m) => m.attachments.flatMap((a) => [a.path, a.posterPath])).filter((p): p is string => Boolean(p)),\n [messages],\n );\n const urls = useFileUrls(paths);\n const byId = useMemo(() => new Map(messages.map((m) => [m.id, m])), [messages]);\n const pins = useMemo(() => new Set(pinIds), [pinIds]);\n\n const [replyTo, setReplyTo] = useState<ChatMessage | null>(null);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [highlightedId, setHighlightedId] = useState<string | null>(null);\n const [confirmDelete, setConfirmDelete] = useState<ChatMessage | null>(null);\n const [reporting, setReporting] = useState<ChatMessage | null>(null);\n const [dragging, setDragging] = useState(false);\n const [newCount, setNewCount] = useState(0);\n const [announcement, setAnnouncement] = useState(\"\");\n const composer = useRef<ChatComposerHandle | null>(null);\n\n // A different conversation starts clean.\n useEffect(() => {\n setReplyTo(null);\n setEditingId(null);\n setNewCount(0);\n setChosenTopic(null);\n }, [conversationId]);\n\n const topics = topicsState.topics;\n const currentTopic = topic ? topics.find((t) => t.topic === topic) : undefined;\n const canManageTopics = role === \"owner\" || role === \"admin\";\n const showTopicBar = !threadRootId && topicProp === undefined && (topics.length > 0 || (showTopics && canManageTopics));\n const topicClosed = Boolean(currentTopic?.closedAt) && role !== \"owner\" && role !== \"admin\" && role !== \"observer\";\n\n const linkMessageIds = useMemo(\n () => messages.filter((m) => !m.deletedAt && m.moderation !== \"hidden\" && extractLinks(m.body).length > 0).map((m) => m.id),\n [messages],\n );\n const previews = useLinkPreviews(linkMessageIds);\n const avail = useAvailability(availability ? conversationId : null);\n const [searching, setSearching] = useState(false);\n\n const nameOf = useCallback((id: string) => (id === me ? \"You\" : resolveUser(id).name), [me, resolveUser]);\n const others = members.filter((m) => m.userId !== me);\n const otherUserId = members.length === 2 && others.length === 1 ? others[0]!.userId : null;\n const isGroup = members.length > 2 || role === \"observer\";\n const title =\n titleProp ??\n conversation?.title ??\n (otherUserId\n ? resolveUser(otherUserId).name\n : others.length\n ? others.length <= 3\n ? others.map((m) => resolveUser(m.userId).name).join(\", \")\n : `${others.slice(0, 2).map((m) => resolveUser(m.userId).name).join(\", \")} and ${others.length - 2} others`\n : \"Conversation\");\n // Someone who just posted has stopped typing, whatever their last signal said.\n const arrived = useRef(new Map<string, number>());\n const live = activityLine(\n activity.filter((a) => a.at > (arrived.current.get(a.userId) ?? 0)),\n (id) => resolveUser(id).name,\n );\n const subtitle = members.length > 2 ? `${members.length} members` : null;\n\n // The away line: the other person in a two-person conversation; in a group, everyone away or outside their hours.\n const awayPeople = useMemo(() => {\n if (!availability) return null;\n const ids = otherUserId ? [otherUserId] : members.filter((m) => m.userId !== me).map((m) => m.userId);\n const people = ids.flatMap((id) => {\n const a = avail.forUser(id);\n return a ? [{ availability: a, name: resolveUser(id).name }] : [];\n });\n return awaySummary(people) ? people : null;\n }, [availability, otherUserId, members, me, avail, resolveUser]);\n\n // ---- scrolling ------------------------------------------------------------\n const scroller = useRef<HTMLDivElement>(null);\n const content = useRef<HTMLDivElement>(null);\n const atBottom = useRef(true);\n const initialised = useRef<string | null>(null);\n const edges = useRef<{ first: string | null; last: string | null }>({ first: null, last: null });\n const anchor = useRef<{ height: number; top: number } | null>(null);\n\n const scrollToBottom = useCallback((smooth = false) => {\n const el = scroller.current;\n if (!el) return;\n if (smooth && typeof el.scrollTo === \"function\") el.scrollTo({ top: el.scrollHeight, behavior: \"smooth\" });\n else el.scrollTop = el.scrollHeight;\n atBottom.current = true;\n setNewCount(0);\n }, []);\n\n useLayoutEffect(() => {\n const el = scroller.current;\n if (!el || items.length === 0) return;\n const first = itemKey(items[0]!);\n const lastItem = items[items.length - 1]!;\n const last = itemKey(lastItem);\n const prev = edges.current;\n edges.current = { first, last };\n\n if (initialised.current !== conversationId) {\n initialised.current = conversationId;\n const unread = state.firstUnreadId ? document.getElementById(`genesis-chat-msg-${state.firstUnreadId}`) : null;\n if (unread && typeof unread.scrollIntoView === \"function\") unread.scrollIntoView({ block: \"center\" });\n else scrollToBottom();\n return;\n }\n if (anchor.current && first !== prev.first) {\n el.scrollTop = el.scrollHeight - anchor.current.height + anchor.current.top;\n anchor.current = null;\n }\n if (last !== prev.last) {\n const mine = itemSender(lastItem) === me;\n if (atBottom.current || mine) scrollToBottom();\n else setNewCount((n) => n + 1);\n if (!mine && lastItem.type === \"message\" && lastItem.message.kind !== \"system\") {\n const m = lastItem.message;\n if (m.senderId) arrived.current.set(m.senderId, Date.now());\n setAnnouncement(`${m.senderId ? resolveUser(m.senderId).name : \"Someone\"}: ${previewText(m.body, m.attachments[0]?.kind ?? null, Boolean(m.deletedAt))}`);\n }\n }\n }, [items, conversationId, me, resolveUser, scrollToBottom, state.firstUnreadId]);\n\n const hasItems = items.length > 0;\n // Photos and previews that load later grow the thread: stay at the bottom if you were there.\n useEffect(() => {\n const el = content.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => {\n if (atBottom.current && scroller.current) scroller.current.scrollTop = scroller.current.scrollHeight;\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [hasItems]);\n\n const { hasEarlier, loadingEarlier, loadEarlier } = state;\n const loadOlder = useCallback(() => {\n const el = scroller.current;\n if (!el || !hasEarlier || loadingEarlier) return;\n anchor.current = { height: el.scrollHeight, top: el.scrollTop };\n void loadEarlier().catch((e) => toast.error(errorText(e)));\n }, [hasEarlier, loadingEarlier, loadEarlier]);\n\n const onScroll = () => {\n const el = scroller.current;\n if (!el) return;\n const bottom = el.scrollHeight - el.scrollTop - el.clientHeight < 80;\n atBottom.current = bottom;\n if (bottom && newCount) setNewCount(0);\n if (el.scrollTop < 200) loadOlder();\n };\n\n const jumpTo = useCallback((id: string) => {\n const el = document.getElementById(`genesis-chat-msg-${id}`);\n if (!el) {\n toast.info(\"That message is further up\", { description: \"Scroll up to load it.\" });\n return;\n }\n if (typeof el.scrollIntoView === \"function\") el.scrollIntoView({ block: \"center\", behavior: \"smooth\" });\n setHighlightedId(id);\n setTimeout(() => setHighlightedId((h) => (h === id ? null : h)), 1600);\n }, []);\n\n // A message to reach: loads earlier pages until it is here (leaving a topic it isn't in), then scrolls to it.\n type Jump = { messageId: string; seq?: number; phase: \"new\" | \"loading\" | \"loaded\" };\n /**\n * A reply in a thread isn't on this timeline: open its thread (onOpenThread, scrolled to the\n * reply) and come here to the thread's first message; without onOpenThread, just to that.\n */\n const reach = useCallback(\n (target: { messageId: string; seq?: number; threadRootId?: string | null }) => {\n const root = target.threadRootId;\n if (!root || root === threadRootId || root === target.messageId) {\n setPendingJump({ messageId: target.messageId, seq: target.seq, phase: \"new\" });\n return;\n }\n void chatClient.message(root).then(\n (m) => {\n if (!m) {\n toast.info(\"That message isn't here any more\");\n return;\n }\n onOpenThread?.(m, target.seq != null ? { jumpTo: { messageId: target.messageId, seq: target.seq } } : undefined);\n setPendingJump({ messageId: m.id, seq: m.seq, phase: \"new\" });\n },\n (e) => toast.error(errorText(e)),\n );\n },\n [chatClient, onOpenThread, threadRootId],\n );\n const [pendingJump, setPendingJump] = useState<Jump | null>(jumpToProp && !jumpToProp.threadRootId ? { ...jumpToProp, phase: \"new\" } : null);\n useEffect(() => {\n if (jumpToProp) reach(jumpToProp);\n }, [jumpToProp?.messageId, jumpToProp?.seq]); // eslint-disable-line react-hooks/exhaustive-deps\n const { loadUntil } = state;\n useEffect(() => {\n if (!pendingJump || state.isLoading) return;\n const { messageId, seq, phase } = pendingJump;\n if (byId.has(messageId)) {\n setPendingJump(null);\n // After the rows it needs have rendered.\n requestAnimationFrame(() => jumpTo(messageId));\n return;\n }\n if (phase === \"loading\") return;\n if (phase === \"loaded\" || seq == null) {\n setPendingJump(null);\n toast.info(\"That message isn't here any more\");\n return;\n }\n setPendingJump({ messageId, seq, phase: \"loading\" });\n const settle = () => setPendingJump((p) => (p && p.messageId === messageId ? { ...p, phase: \"loaded\" } : p));\n void loadUntil(seq).then(settle, (e) => {\n toast.error(errorText(e));\n settle();\n });\n }, [pendingJump, byId, state.isLoading, loadUntil, jumpTo]);\n\n const openHit = useCallback(\n (hit: ChatSearchHit) => {\n setSearching(false);\n if (topic && topicProp === undefined) setChosenTopic(null);\n reach(hit);\n },\n [topic, topicProp, reach],\n );\n\n // ---- actions --------------------------------------------------------------\n const run = useCallback(async (p: Promise<unknown>, done?: string) => {\n try {\n await p;\n if (done) toast.success(done);\n } catch (e) {\n toast.error(errorText(e));\n }\n }, []);\n\n const ctx: ThreadContextValue = {\n me,\n resolveUser,\n role,\n isGroup,\n canModerate: role === \"owner\" || role === \"admin\",\n canPin: role === \"owner\" || role === \"admin\" || members.length === 2,\n canPost,\n pins,\n urls,\n byId,\n quickReactions,\n attachmentSlot: slots?.attachment,\n attachmentKinds,\n previews,\n emojibaseUrl,\n linkPreviewImages,\n linkPreviewProxyUrl,\n highlightedId,\n editingId,\n reply: (m) => {\n setReplyTo(m);\n composer.current?.focus();\n },\n focusComposer: () => composer.current?.focus(),\n startEdit: setEditingId,\n saveEdit: async (m, body) => {\n try {\n await actions.edit(m, body, parseMentions(body));\n } catch (e) {\n toast.error(errorText(e));\n throw e;\n }\n },\n askDelete: setConfirmDelete,\n askReport: setReporting,\n react: (m, emoji, on) => void run(actions.react(m, emoji, on)),\n pin: (m, on) => void run(actions.pin(m, on), on ? \"Pinned\" : \"Unpinned\"),\n save: (m) => void run(actions.save(m, true), \"Saved\"),\n copy: (m) => {\n const text = plainText(m.body);\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) void run(navigator.clipboard.writeText(text), \"Copied\");\n else toast.error(\"Copying isn't available here\");\n },\n jumpTo,\n retry: (clientId) => void state.retry(clientId),\n discard: (clientId) => void state.discard(clientId),\n openThread: onOpenThread,\n };\n\n // ---- drag and drop --------------------------------------------------------\n const hasFiles = (e: DragEvent) => Array.from(e.dataTransfer?.types ?? []).includes(\"Files\");\n const dropProps = canPost\n ? {\n onDragOver: (e: DragEvent<HTMLDivElement>) => {\n if (!hasFiles(e)) return;\n e.preventDefault();\n if (!dragging) setDragging(true);\n },\n onDragLeave: (e: DragEvent<HTMLDivElement>) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) setDragging(false);\n },\n onDrop: (e: DragEvent<HTMLDivElement>) => {\n if (!hasFiles(e)) return;\n e.preventDefault();\n setDragging(false);\n composer.current?.addFiles(e.dataTransfer.files);\n },\n }\n : {};\n\n // ---- render ---------------------------------------------------------------\n const pinnedMessage = pinIds.length ? byId.get(pinIds[pinIds.length - 1]!) : undefined;\n let body: ReactNode;\n if (state.isLoading) {\n body = (\n <div className=\"flex flex-col gap-3 p-4\" aria-busy aria-label=\"Loading messages\" data-testid=\"genesis-chat-thread-loading\">\n {[40, 60, 30, 50].map((w, i) => (\n <Skeleton key={i} className={cn(\"h-9 rounded-2xl\", i % 2 ? \"self-end\" : \"self-start\")} style={{ width: `${w}%` }} />\n ))}\n </div>\n );\n } else if (state.error && items.length === 0) {\n body = (\n <EmptyState\n icon={MessageSquare}\n title=\"Couldn't load this conversation\"\n description={errorText(state.error)}\n action={\n <Button type=\"button\" variant=\"outline\" onClick={() => void state.refetch()}>\n Try again\n </Button>\n }\n />\n );\n } else if (items.length === 0) {\n body = renderSlot(DefaultEmpty, slots?.empty, { conversationId, canPost });\n } else {\n body = (\n <div ref={content} className=\"flex min-h-full flex-col justify-end pb-2 pt-1\">\n {hasEarlier ? (\n <div className=\"flex justify-center py-2\">\n {loadingEarlier ? (\n <Spinner size=\"sm\" aria-label=\"Loading earlier messages\" />\n ) : (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs text-muted-foreground\" onClick={loadOlder}>\n Load earlier messages\n </Button>\n )}\n </div>\n ) : null}\n {items.map((item, i) => {\n const id = item.type === \"message\" ? item.message.id : null;\n return (\n <div key={itemKey(item)}>\n {startsDay(items, i) ? (\n <div className=\"sticky top-1 z-10 flex justify-center py-2\" role=\"separator\" aria-label={dayLabel(itemTime(item))}>\n <span className=\"rounded-full border bg-background/95 px-3 py-0.5 text-xs font-medium text-muted-foreground shadow-sm\">{dayLabel(itemTime(item))}</span>\n </div>\n ) : null}\n {id && id === state.firstUnreadId ? (\n <div className=\"my-2 flex items-center gap-2 px-4\" role=\"separator\" aria-label=\"New messages\" data-testid=\"genesis-chat-new-line\">\n <span className=\"h-px flex-1 bg-primary/40\" />\n <span className=\"text-xs font-semibold text-primary\">New</span>\n <span className=\"h-px flex-1 bg-primary/40\" />\n </div>\n ) : null}\n <ChatErrorBoundary\n fallback={\n <p className=\"px-4 py-1 text-xs italic text-muted-foreground\" role=\"note\" data-testid=\"genesis-chat-row-error\">\n This message couldn't be shown.\n </p>\n }\n >\n <MessageRow item={item} startsGroup={startsGroup(items, i)} />\n </ChatErrorBoundary>\n </div>\n );\n })}\n </div>\n );\n }\n\n return (\n <ThreadContext.Provider value={ctx}>\n <section\n className={cn(\"relative flex h-full min-h-0 flex-col bg-background\", className)}\n aria-label={title}\n data-testid=\"genesis-chat-thread\"\n {...dropProps}\n >\n {renderSlot(DefaultHeader, slots?.header, {\n conversationId,\n conversation,\n title,\n subtitle,\n activity: live,\n otherUserId,\n members,\n role,\n resolveUser,\n onBack,\n backClassName,\n onSearch: search && !threadRootId ? () => setSearching(true) : undefined,\n })}\n {showTopicBar ? (\n <ChatTopicBar\n topics={topics}\n value={topic ?? null}\n onValueChange={setChosenTopic}\n canManage={canManageTopics}\n onSetTopic={topicsState.setTopic}\n />\n ) : null}\n {awayPeople ? <ChatAwayBanner people={awayPeople} /> : null}\n {pinnedMessage ? (\n <button\n type=\"button\"\n onClick={() => jumpTo(pinnedMessage.id)}\n className=\"flex items-center gap-2 border-b bg-muted/40 px-3 py-1.5 text-left text-xs hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\"\n aria-label={`Pinned message: ${previewText(pinnedMessage.body, pinnedMessage.attachments[0]?.kind ?? null, Boolean(pinnedMessage.deletedAt))}. Show it`}\n >\n <Pin className=\"size-3.5 shrink-0 text-primary\" aria-hidden />\n <span className=\"truncate\">{previewText(pinnedMessage.body, pinnedMessage.attachments[0]?.kind ?? null, Boolean(pinnedMessage.deletedAt))}</span>\n {pinIds.length > 1 ? <span className=\"ml-auto shrink-0 text-muted-foreground\">+{pinIds.length - 1}</span> : null}\n </button>\n ) : null}\n\n <div className=\"relative min-h-0 flex-1\">\n {/* A plain scroller, not ScrollArea: the thread sets scrollTop to keep your place as earlier messages load, and needs the element that scrolls. */}\n <div ref={scroller} onScroll={onScroll} className=\"h-full overflow-y-auto overscroll-contain\" role=\"log\" aria-live=\"off\" aria-label=\"Messages\" data-testid=\"genesis-chat-scroller\">\n {body}\n </div>\n {newCount > 0 ? (\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"absolute bottom-3 left-1/2 h-8 -translate-x-1/2 rounded-full shadow-md\"\n onClick={() => scrollToBottom(true)}\n data-testid=\"genesis-chat-new-pill\"\n >\n New messages <ArrowDown />\n </Button>\n ) : null}\n {dragging ? (\n <div className=\"pointer-events-none absolute inset-2 flex flex-col items-center justify-center gap-2 rounded-xl border-2 border-dashed border-primary bg-background/90 text-sm font-medium text-primary\">\n <ImagePlus className=\"size-6\" aria-hidden />\n Drop to attach\n </div>\n ) : null}\n </div>\n\n <div className=\"h-5 px-4 text-xs italic text-muted-foreground\" data-testid=\"genesis-chat-activity\">\n {live ? (\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"inline-flex gap-0.5\" aria-hidden>\n <span className=\"size-1 animate-bounce rounded-full bg-muted-foreground [animation-delay:-0.3s]\" />\n <span className=\"size-1 animate-bounce rounded-full bg-muted-foreground [animation-delay:-0.15s]\" />\n <span className=\"size-1 animate-bounce rounded-full bg-muted-foreground\" />\n </span>\n {live}\n </span>\n ) : null}\n </div>\n <div className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\" data-testid=\"genesis-chat-announcer\">\n {announcement}\n </div>\n\n <ChatComposer\n ref={composer}\n conversation={state}\n replyTo={replyTo}\n onCancelReply={() => setReplyTo(null)}\n resolveUser={resolveUser}\n placeholder={currentTopic ? `Message #${currentTopic.title}` : placeholder}\n topic={topic ?? null}\n disabledReason={topicClosed ? \"This topic is closed\" : null}\n scheduling={scheduling}\n emojibaseUrl={emojibaseUrl}\n accessory={renderSlot(EmptyAccessory, slots?.composerAccessory, {\n conversationId,\n insertText: (t) => composer.current?.insertText(t),\n addFiles: (f) => composer.current?.addFiles(f),\n })}\n />\n </section>\n\n {search && !threadRootId ? (\n <Sheet open={searching} onOpenChange={setSearching}>\n <SheetContent side=\"right\" className=\"flex w-full flex-col gap-0 p-0 sm:max-w-md\">\n <SheetHeader className=\"border-b px-4 py-3\">\n <SheetTitle>Search</SheetTitle>\n <SheetDescription className=\"sr-only\">Search this conversation and jump to a message.</SheetDescription>\n </SheetHeader>\n <ChatSearch conversationId={conversationId} resolveUser={resolveUser} onOpen={openHit} autoFocus className=\"min-h-0 flex-1\" />\n </SheetContent>\n </Sheet>\n ) : null}\n\n <AlertDialog open={confirmDelete !== null} onOpenChange={(o) => !o && setConfirmDelete(null)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete this message?</AlertDialogTitle>\n <AlertDialogDescription>\n {confirmDelete?.senderId === me ? \"It's deleted for everyone in the conversation.\" : \"It's deleted for everyone in the conversation, including the person who sent it.\"}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n onClick={() => {\n const m = confirmDelete;\n setConfirmDelete(null);\n if (m) void run(actions.remove(m));\n }}\n data-testid=\"genesis-chat-confirm-delete\"\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n\n <ReportDialog\n message={reporting}\n onClose={() => setReporting(null)}\n onSubmit={async (m, reason, note) => {\n await run(actions.report(m, reason, note || undefined), \"Reported. Thank you.\");\n setReporting(null);\n }}\n />\n </ThreadContext.Provider>\n );\n}\n\nfunction EmptyAccessory(_props: ChatComposerAccessoryProps) {\n return null;\n}\n\nfunction ReportDialog({\n message,\n onClose,\n onSubmit,\n}: {\n message: ChatMessage | null;\n onClose: () => void;\n onSubmit: (m: ChatMessage, reason: ReportReason, note: string) => Promise<void>;\n}) {\n const [reason, setReason] = useState<ReportReason>(\"spam\");\n const [note, setNote] = useState(\"\");\n const [busy, setBusy] = useState(false);\n useEffect(() => {\n if (message) {\n setReason(\"spam\");\n setNote(\"\");\n }\n }, [message]);\n return (\n <Dialog open={message !== null} onOpenChange={(o) => !o && onClose()}>\n <DialogContent className=\"sm:max-w-md\">\n <DialogHeader>\n <DialogTitle>Report this message</DialogTitle>\n <DialogDescription>The people who look after this conversation see your report and the messages around it.</DialogDescription>\n </DialogHeader>\n <RadioGroup value={reason} onValueChange={(v) => setReason(v as ReportReason)} aria-label=\"Reason\">\n {REPORT_REASONS.map((r) => (\n <div key={r.value} className=\"flex items-center gap-2\">\n <RadioGroupItem value={r.value} id={`genesis-chat-report-${r.value}`} />\n <Label htmlFor={`genesis-chat-report-${r.value}`}>{r.label}</Label>\n </div>\n ))}\n </RadioGroup>\n <Textarea value={note} onChange={(e) => setNote(e.target.value)} placeholder=\"Anything else? (optional)\" aria-label=\"Details\" maxLength={1000} />\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n loading={busy}\n onClick={async () => {\n if (!message) return;\n setBusy(true);\n try {\n await onSubmit(message, reason, note.trim());\n } finally {\n setBusy(false);\n }\n }}\n >\n Report\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","/**\n * @feat:chat\n * Messages, whole: the inbox on the left and the open conversation on the\n * right (Genesis `Split`); on a narrow screen one at a time, with a back\n * button from the conversation to the inbox. Search across every conversation\n * sits above the inbox; a result opens its conversation at the message.\n */\nimport { useState, type ReactNode } from \"react\";\nimport { MessageSquare, Search, X } from \"lucide-react\";\nimport { Button, EmptyState, Split, cn } from \"@marktiderman/genesis-ui\";\nimport { renderSlot, type SlotOverride } from \"@marktiderman/genesis-core/slots\";\nimport type { ChatInboxItem } from \"../core/types\";\nimport { useInbox } from \"../react/index\";\nimport { ChatInbox, inboxTitle, type ChatInboxProps } from \"./inbox\";\nimport { ChatSearch } from \"./search\";\nimport type { ResolveUser } from \"./format\";\nimport { ChatThread, type ChatThreadProps } from \"./thread\";\n\nexport interface ChatPanelNoSelectionProps {\n /** Words under the title; \"Pick one on the left to read and reply.\" by default. */\n hint?: string;\n}\n\nexport interface ChatPanelProps {\n resolveUser: ResolveUser;\n /** The open conversation (controlled). */\n selectedId?: string | null;\n /** The conversation open at first (uncontrolled). */\n defaultSelectedId?: string | null;\n /** Called when a conversation is opened, or with null on back. Put it in the URL to make it bookmarkable. */\n onSelectedChange?: (conversationId: string | null) => void;\n /** Above the inbox list: a title, a \"New message\" button. */\n inboxHeader?: ReactNode;\n inboxProps?: Partial<Omit<ChatInboxProps, \"resolveUser\" | \"onSelect\" | \"selectedId\">>;\n threadProps?: Partial<Omit<ChatThreadProps, \"conversationId\" | \"resolveUser\" | \"onBack\">>;\n /** What the right pane shows before a conversation is chosen. */\n slots?: { noSelection?: SlotOverride<ChatPanelNoSelectionProps> };\n /** Search across every conversation, above the inbox. Default true. */\n search?: boolean;\n className?: string;\n}\n\nfunction NoSelection({ hint }: ChatPanelNoSelectionProps) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <EmptyState icon={MessageSquare} title=\"Choose a conversation\" description={hint ?? \"Pick one on the left to read and reply.\"} />\n </div>\n );\n}\n\nexport function ChatPanel({\n resolveUser,\n selectedId: controlled,\n defaultSelectedId = null,\n onSelectedChange,\n inboxHeader,\n inboxProps,\n threadProps,\n slots,\n search = true,\n className,\n}: ChatPanelProps) {\n const [own, setOwn] = useState<string | null>(defaultSelectedId);\n const [searching, setSearching] = useState(false);\n const [jump, setJump] = useState<{ messageId: string; seq?: number; threadRootId?: string | null } | null>(null);\n const { items } = useInbox({ kind: inboxProps?.kind });\n const titleOf = (id: string) => {\n const item = items.find((i: ChatInboxItem) => i.conversationId === id);\n return item ? inboxTitle(item, resolveUser, inboxProps?.fallbackTitle) : \"a conversation\";\n };\n const selected = controlled !== undefined ? controlled : own;\n const select = (id: string | null) => {\n if (controlled === undefined) setOwn(id);\n onSelectedChange?.(id);\n };\n\n return (\n <Split\n ratio=\"1/3\"\n at=\"md\"\n gap=\"none\"\n testID=\"genesis-chat-panel\"\n className={cn(\n \"h-full min-h-0 overflow-hidden rounded-lg border bg-background\",\n \"[&>[data-slot=split-start]]:min-h-0 [&>[data-slot=split-end]]:min-h-0 max-md:[&>[data-slot]]:flex-1\",\n selected ? \"max-md:[&>[data-slot=split-start]]:hidden\" : \"max-md:[&>[data-slot=split-end]]:hidden\",\n className,\n )}\n start={\n <div className=\"flex h-full min-h-0 flex-col md:border-r\">\n {inboxHeader || search ? (\n <div className=\"flex shrink-0 items-center gap-2 border-b px-3 py-2\">\n <div className=\"min-w-0 flex-1\">{inboxHeader}</div>\n {search ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 shrink-0\"\n onClick={() => setSearching((s) => !s)}\n aria-label={searching ? \"Close search\" : \"Search messages\"}\n aria-pressed={searching}\n data-testid=\"genesis-chat-panel-search\"\n >\n {searching ? <X /> : <Search />}\n </Button>\n ) : null}\n </div>\n ) : null}\n {searching ? (\n <ChatSearch\n resolveUser={resolveUser}\n autoFocus\n conversationTitle={titleOf}\n onOpen={(hit) => {\n setJump({ messageId: hit.messageId, seq: hit.seq, threadRootId: hit.threadRootId });\n select(hit.conversationId);\n }}\n className=\"min-h-0 flex-1\"\n />\n ) : (\n <ChatInbox {...inboxProps} resolveUser={resolveUser} selectedId={selected} onSelect={(id) => { setJump(null); select(id); }} className={cn(\"min-h-0 flex-1 overflow-y-auto\", inboxProps?.className)} />\n )}\n </div>\n }\n end={\n selected ? (\n <ChatThread key={selected} {...threadProps} jumpTo={jump} conversationId={selected} resolveUser={resolveUser} onBack={() => select(null)} backClassName=\"md:hidden\" />\n ) : (\n renderSlot(NoSelection, slots?.noSelection, {})\n )\n }\n />\n );\n}\n","/**\n * @feat:chat\n * A chat client held in memory, for demos, stories and tests: the same shape\n * as `createChatClient`, with no Supabase behind it. It also plays the other\n * side (`receive`, `activity`) so a demo looks alive.\n */\nimport { ChatError, type ChatClient, type ChatSupabase, type ConversationChannel, type ConversationHandlers, type MessagePage } from \"../core/client\";\nimport { extractLinks } from \"../core/extras\";\nimport type {\n AvailabilityInput,\n ChatActivity,\n ChatAvailability,\n ChatLinkPreview,\n ChatSearchHit,\n ChatTopic,\n ScheduleInput,\n ScheduledMessage,\n TopicInput,\n ChatAttachment,\n ChatConversation,\n ChatInboxItem,\n ChatMember,\n ChatMessage,\n ChatRole,\n ChatSignal,\n SendInput,\n} from \"../core/types\";\n\nexport interface MemoryConversationSeed {\n id: string;\n kind?: string;\n title?: string | null;\n settings?: ChatConversation[\"settings\"];\n members: { userId: string; role?: ChatRole; lastReadSeq?: number }[];\n /** Your role when you aren't a member (an observer). */\n myRole?: ChatRole | null;\n canPost?: boolean;\n muted?: boolean;\n pinned?: boolean;\n messages?: (Partial<Omit<ChatMessage, \"attachments\">> & { attachments?: Partial<ChatAttachment>[] })[];\n pins?: string[];\n /** Its topics, in order. */\n topics?: { topic: string; title?: string; closed?: boolean }[];\n}\n\nexport interface MemoryChatOptions {\n /** The signed-in user. */\n me: string;\n conversations: MemoryConversationSeed[];\n /** Signed URLs for attachment paths. */\n files?: Record<string, string>;\n /** Milliseconds each call waits, to show loading states. Default 0. */\n latencyMs?: number;\n /** Away messages and working hours, by user id. */\n availability?: Record<string, Partial<Omit<ChatAvailability, \"userId\">>>;\n /** Link previews the \"server\" has fetched. */\n linkPreviews?: Partial<ChatLinkPreview>[];\n}\n\ninterface Conv {\n conversation: ChatConversation;\n members: ChatMember[];\n myRole: ChatRole | null;\n canPost: boolean;\n muted: boolean;\n pinned: boolean;\n messages: ChatMessage[];\n pins: string[];\n topics: ChatTopic[];\n}\n\nexport type MemoryChatClient = ChatClient & {\n /** Someone else posts (a demo's other side). */\n receive(conversationId: string, senderId: string, body: string, extra?: Partial<ChatMessage>): ChatMessage;\n /** Someone else starts typing or recording. */\n activity(conversationId: string, userId: string, activity: ChatActivity[\"activity\"]): void;\n /** The next `count` sends fail as if the connection dropped. */\n failNextSends(count?: number): void;\n /** The next send waits until the returned function is called (a test watching the sending state). */\n holdNextSend(): () => void;\n /** Posts every scheduled message due by `now` (a demo's clock), as the server's runner does. */\n sendDue(now?: Date): Promise<number>;\n /** Moderation's verdict on a message (the server's side). */\n moderate(messageId: string, result: \"clean\" | \"flagged\" | \"hidden\"): void;\n /** Every call made, for tests. */\n calls: { method: string; args: unknown[] }[];\n};\n\nlet counter = 0;\nconst uuid = () =>\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto ? crypto.randomUUID() : `00000000-0000-4000-8000-${String(++counter).padStart(12, \"0\")}`;\n\nfunction attachment(messageId: string, a: Partial<ChatAttachment>, i: number): ChatAttachment {\n return {\n id: a.id ?? uuid(),\n messageId,\n position: a.position ?? i,\n kind: a.kind ?? \"file\",\n ref: a.ref ?? {},\n provider: a.provider ?? \"storage\",\n path: a.path ?? null,\n providerId: a.providerId ?? null,\n playbackId: a.playbackId ?? null,\n url: a.url ?? null,\n status: a.status ?? \"ready\",\n name: a.name ?? null,\n mime: a.mime ?? null,\n bytes: a.bytes ?? null,\n width: a.width ?? null,\n height: a.height ?? null,\n durationMs: a.durationMs ?? null,\n waveform: a.waveform ?? null,\n posterPath: a.posterPath ?? null,\n thumbhash: a.thumbhash ?? null,\n transcript: a.transcript ?? null,\n transcriptStatus: a.transcriptStatus ?? null,\n };\n}\n\nexport function createMemoryChatClient(options: MemoryChatOptions): MemoryChatClient {\n const { me } = options;\n const files: Record<string, string> = { ...(options.files ?? {}) };\n const convs = new Map<string, Conv>();\n const convListeners = new Map<string, Set<{ onSignal: (s: ChatSignal) => void; onActivity?: (a: ChatActivity) => void }>>();\n const inboxListeners = new Set<(s: ChatSignal) => void>();\n const calls: { method: string; args: unknown[] }[] = [];\n let failing = 0;\n let held: Promise<void> | null = null;\n const wait = () => new Promise<void>((r) => setTimeout(r, options.latencyMs ?? 0));\n\n const makeMessage = (c: Conv, m: Partial<Omit<ChatMessage, \"attachments\">> & { attachments?: Partial<ChatAttachment>[] }): ChatMessage => {\n const id = m.id ?? uuid();\n const seq = ++c.conversation.lastSeq;\n const createdAt = m.createdAt ?? new Date().toISOString();\n c.conversation.lastMessageAt = createdAt;\n return {\n id,\n conversationId: c.conversation.id,\n seq,\n clientId: m.clientId ?? id,\n senderId: m.senderId ?? null,\n senderRole: m.senderRole ?? (m.kind === \"system\" ? \"system\" : \"member\"),\n kind: m.kind ?? \"text\",\n body: m.body ?? \"\",\n mentions: m.mentions ?? [],\n replyToId: m.replyToId ?? null,\n threadRootId: m.threadRootId ?? null,\n threadCount: m.threadCount ?? 0,\n threadLastAt: m.threadLastAt ?? null,\n topic: m.topic ?? null,\n visibility: m.visibility ?? \"everyone\",\n silent: m.silent ?? false,\n meta: m.meta ?? {},\n createdAt,\n editedAt: m.editedAt ?? null,\n deletedAt: m.deletedAt ?? null,\n moderation: m.moderation ?? null,\n attachments: (m.attachments ?? []).map((a, i) => attachment(id, a, i)),\n reactions: m.reactions ?? [],\n };\n };\n\n for (const seed of options.conversations) {\n const c: Conv = {\n conversation: {\n id: seed.id,\n kind: seed.kind ?? (seed.members.length === 2 ? \"direct\" : \"group\"),\n title: seed.title ?? null,\n subjectType: null,\n subjectId: null,\n settings: seed.settings ?? {},\n status: null,\n assigneeId: null,\n lastSeq: 0,\n lastMessageAt: null,\n createdAt: new Date().toISOString(),\n archivedAt: null,\n },\n members: seed.members.map((m) => ({\n conversationId: seed.id,\n userId: m.userId,\n role: m.role ?? \"member\",\n lastReadSeq: m.lastReadSeq ?? 0,\n joinedAt: new Date().toISOString(),\n })),\n myRole: seed.myRole !== undefined ? seed.myRole : (seed.members.find((m) => m.userId === me)?.role ?? \"member\"),\n canPost: seed.canPost ?? true,\n muted: seed.muted ?? false,\n pinned: seed.pinned ?? false,\n messages: [],\n pins: seed.pins ?? [],\n topics: (seed.topics ?? []).map((t, i) => ({\n conversationId: seed.id,\n topic: t.topic,\n title: t.title ?? t.topic,\n position: i,\n closedAt: t.closed ? new Date().toISOString() : null,\n createdBy: null,\n createdAt: new Date().toISOString(),\n })),\n };\n for (const m of seed.messages ?? []) c.messages.push(makeMessage(c, m));\n convs.set(seed.id, c);\n }\n\n const get = (id: string) => {\n const c = convs.get(id);\n if (!c) throw new ChatError(\"Conversation not found\", \"42501\", \"conversation\");\n return c;\n };\n const findMessage = (id: string) => {\n for (const c of convs.values()) {\n const m = c.messages.find((x) => x.id === id);\n if (m) return { c, m };\n }\n throw new ChatError(\"Message not found\", \"42501\", \"message\");\n };\n const visible = (c: Conv, m: ChatMessage) =>\n (m.visibility !== \"observers\" || c.myRole === \"observer\") && (m.moderation !== \"hidden\" || m.senderId === me || c.myRole === \"observer\");\n const scheduledList: ScheduledMessage[] = [];\n const availability = new Map<string, ChatAvailability>(\n Object.entries(options.availability ?? {}).map(([userId, a]) => [\n userId,\n { userId, awayMessage: a.awayMessage ?? null, awayUntil: a.awayUntil ?? null, timeZone: a.timeZone ?? null, hours: a.hours ?? null },\n ]),\n );\n const previews = new Map<string, ChatLinkPreview>(\n (options.linkPreviews ?? []).filter((p) => p.url).map((p) => [\n p.url!,\n { url: p.url!, status: p.status ?? \"ok\", title: p.title ?? null, description: p.description ?? null, imageUrl: p.imageUrl ?? null, siteName: p.siteName ?? null, fetchedAt: p.fetchedAt ?? new Date().toISOString() },\n ]),\n );\n const clone = (m: ChatMessage): ChatMessage => ({ ...m, attachments: m.attachments.map((a) => ({ ...a })), reactions: [...m.reactions] });\n const emit = (conversationId: string, s: ChatSignal) => {\n for (const l of convListeners.get(conversationId) ?? []) l.onSignal(s);\n for (const l of inboxListeners) l({ type: \"inbox\", conversationId });\n };\n const log = (method: string, ...args: unknown[]) => calls.push({ method, args });\n\n function inboxItem(c: Conv): ChatInboxItem {\n const mine = c.members.find((m) => m.userId === me);\n const lastRead = mine?.lastReadSeq ?? 0;\n const seen = c.messages.filter((m) => visible(c, m));\n const last = seen[seen.length - 1];\n const others = c.members.filter((m) => m.userId !== me);\n const unreadList = seen.filter((m) => m.seq > lastRead && m.senderId !== me && !m.deletedAt);\n return {\n conversationId: c.conversation.id,\n kind: c.conversation.kind,\n title: c.conversation.title,\n subjectType: null,\n subjectId: null,\n status: null,\n role: c.myRole ?? \"member\",\n otherUserId: c.members.length === 2 && others.length === 1 ? others[0]!.userId : null,\n memberCount: c.members.length,\n lastSeq: c.conversation.lastSeq,\n lastReadSeq: lastRead,\n unread: Math.min(99, unreadList.length),\n mentioned: unreadList.some((m) => m.mentions.includes(me)),\n muted: c.muted,\n pinned: c.pinned,\n archived: false,\n lastMessageAt: c.conversation.lastMessageAt,\n lastMessage: last\n ? {\n id: last.id,\n seq: last.seq,\n senderId: last.senderId,\n kind: last.kind,\n body: last.body,\n deleted: Boolean(last.deletedAt),\n createdAt: last.createdAt,\n attachment: last.attachments[0]?.kind ?? null,\n }\n : null,\n };\n }\n\n const client: MemoryChatClient = {\n supabase: null as unknown as ChatSupabase,\n calls,\n\n async inbox(opts: { kind?: string; kinds?: string[]; excludeKinds?: string[]; archived?: boolean; limit?: number; before?: string } = {}) {\n log(\"inbox\", opts);\n await wait();\n if (opts.archived) return [];\n return [...convs.values()]\n .filter((c) => keepKind(c.conversation.kind, opts))\n .map(inboxItem)\n .sort((a, b) => Number(b.pinned) - Number(a.pinned) || (b.lastMessageAt ?? \"\").localeCompare(a.lastMessageAt ?? \"\"));\n },\n async observed() {\n return [];\n },\n async unreadTotal(opts: { excludeKinds?: string[] } = {}) {\n return [...convs.values()].filter((c) => keepKind(c.conversation.kind, opts)).reduce((n, c) => n + inboxItem(c).unread, 0);\n },\n async conversation(id: string) {\n await wait();\n return convs.has(id) ? { ...get(id).conversation } : null;\n },\n async kind(kind: string) {\n return { kind, label: kind, maxMembers: kind === \"direct\" ? 2 : null, whoPosts: \"members\" as const, membership: \"admins\" as const, threads: true, observersPost: false };\n },\n\n async myRole(id: string) {\n return convs.get(id)?.myRole ?? null;\n },\n async canPost(id: string) {\n return convs.get(id)?.canPost ?? false;\n },\n async members(id: string) {\n return get(id).members.map((m) => ({ ...m }));\n },\n async messages(id: string, opts: { beforeSeq?: number; afterSeq?: number; limit?: number; threadRootId?: string; topic?: string } = {}): Promise<MessagePage> {\n log(\"messages\", id, opts);\n await wait();\n const c = get(id);\n const limit = Math.min(Math.max(opts.limit ?? 50, 1), 200);\n let list = c.messages.filter((m) => visible(c, m) && (opts.threadRootId ? m.threadRootId === opts.threadRootId : m.threadRootId === null));\n if (opts.topic) list = list.filter((m) => m.topic === opts.topic);\n if (opts.afterSeq != null) return { messages: list.filter((m) => m.seq > opts.afterSeq!).slice(0, limit).map(clone), hasEarlier: false };\n if (opts.beforeSeq != null) list = list.filter((m) => m.seq < opts.beforeSeq!);\n const page = list.slice(-limit);\n return { messages: page.map(clone), hasEarlier: list.length > page.length };\n },\n async message(id: string) {\n try {\n const { c, m } = findMessage(id);\n return visible(c, m) ? clone(m) : null;\n } catch {\n return null;\n }\n },\n async startConversation(kind: string, memberIds: string[], opts: { title?: string } = {}) {\n const id = uuid();\n convs.set(id, {\n conversation: {\n id,\n kind,\n title: opts.title ?? null,\n subjectType: null,\n subjectId: null,\n settings: {},\n status: null,\n assigneeId: null,\n lastSeq: 0,\n lastMessageAt: null,\n createdAt: new Date().toISOString(),\n archivedAt: null,\n },\n members: [me, ...memberIds.filter((m) => m !== me)].map((userId) => ({ conversationId: id, userId, role: userId === me ? \"owner\" : \"member\", lastReadSeq: 0, joinedAt: new Date().toISOString() })),\n myRole: \"owner\",\n canPost: true,\n muted: false,\n pinned: false,\n messages: [],\n pins: [],\n topics: [],\n });\n for (const l of inboxListeners) l({ type: \"inbox\", conversationId: id });\n return id;\n },\n async send(input: SendInput) {\n log(\"send\", input);\n await wait();\n if (held) {\n const hold = held;\n held = null;\n await hold;\n }\n if (failing > 0) {\n failing -= 1;\n throw new ChatError(\"Failed to fetch\", undefined, \"send_message\");\n }\n const c = get(input.conversationId);\n if (!c.canPost) throw new ChatError(\"You can't post here\", \"42501\", \"send_message\");\n const topic = input.topic ? c.topics.find((t) => t.topic === input.topic) : undefined;\n if (topic?.closedAt && ![\"owner\", \"admin\", \"observer\"].includes(c.myRole ?? \"member\")) {\n throw new ChatError(\"This topic is closed\", \"42501\", \"send_message\");\n }\n const existing = c.messages.find((m) => m.clientId === input.clientId);\n if (existing) return clone(existing);\n const m = makeMessage(c, {\n clientId: input.clientId,\n senderId: me,\n senderRole: c.myRole ?? \"member\",\n body: input.body ?? \"\",\n mentions: input.mentions ?? [],\n replyToId: input.replyToId ?? null,\n threadRootId: input.threadRootId ?? null,\n topic: input.topic ?? null,\n visibility: input.visibility ?? \"everyone\",\n silent: input.silent ?? false,\n attachments: (input.attachments ?? []).map((a) => ({ ...a, durationMs: a.durationMs ?? null, transcriptStatus: a.kind === \"voice\" ? \"pending\" : null })) as Partial<ChatAttachment>[],\n });\n c.messages.push(m);\n const mine = c.members.find((x) => x.userId === me);\n if (mine) mine.lastReadSeq = m.seq;\n emit(c.conversation.id, { type: \"message\", conversationId: c.conversation.id, id: m.id, seq: m.seq, op: \"insert\" });\n return clone(m);\n },\n async edit(messageId: string, body: string, mentions: string[] = []) {\n log(\"edit\", messageId, body);\n const { c, m } = findMessage(messageId);\n if (m.senderId !== me) throw new ChatError(\"You can't edit this message\", \"42501\", \"edit_message\");\n Object.assign(m, { body, mentions, editedAt: new Date().toISOString() });\n emit(c.conversation.id, { type: \"message\", conversationId: c.conversation.id, id: m.id, op: \"update\" });\n return clone(m);\n },\n async remove(messageId: string) {\n log(\"remove\", messageId);\n const { c, m } = findMessage(messageId);\n Object.assign(m, { body: \"\", attachments: [], reactions: [], deletedAt: new Date().toISOString() });\n emit(c.conversation.id, { type: \"message\", conversationId: c.conversation.id, id: m.id, op: \"update\" });\n },\n async react(messageId: string, emoji: string, on = true) {\n log(\"react\", messageId, emoji, on);\n const { c, m } = findMessage(messageId);\n m.reactions = m.reactions.filter((r) => !(r.emoji === emoji && r.userId === me));\n if (on) m.reactions.push({ emoji, userId: me });\n emit(c.conversation.id, { type: \"reaction\", conversationId: c.conversation.id, messageId });\n },\n async markRead(conversationId: string, seq?: number) {\n const c = get(conversationId);\n const mine = c.members.find((x) => x.userId === me);\n if (mine) mine.lastReadSeq = Math.max(mine.lastReadSeq, seq ?? c.conversation.lastSeq);\n return mine?.lastReadSeq ?? 0;\n },\n async setMySettings(conversationId: string, s: { mutedUntil?: string | null; archived?: boolean; pinned?: boolean }) {\n const c = get(conversationId);\n if (s.mutedUntil !== undefined) c.muted = s.mutedUntil !== null;\n if (s.pinned !== undefined) c.pinned = s.pinned;\n },\n async updateConversation(conversationId: string, s: { title?: string; settings?: Record<string, unknown> }) {\n const c = get(conversationId);\n if (s.title !== undefined) c.conversation.title = s.title;\n if (s.settings) c.conversation.settings = { ...c.conversation.settings, ...s.settings };\n },\n async addMembers(conversationId: string, userIds: string[]) {\n const c = get(conversationId);\n for (const userId of userIds) if (!c.members.some((m) => m.userId === userId)) c.members.push({ conversationId, userId, role: \"member\", lastReadSeq: 0, joinedAt: new Date().toISOString() });\n },\n async removeMember(conversationId: string, userId?: string) {\n const c = get(conversationId);\n c.members = c.members.filter((m) => m.userId !== (userId ?? me));\n },\n async setStatus(conversationId: string, status: ChatConversation[\"status\"], assigneeId?: string | null) {\n const c = get(conversationId);\n c.conversation.status = status;\n c.conversation.assigneeId = assigneeId ?? null;\n },\n async pin(messageId: string, on = true) {\n log(\"pin\", messageId, on);\n const { c } = findMessage(messageId);\n c.pins = c.pins.filter((p) => p !== messageId);\n if (on) c.pins.push(messageId);\n emit(c.conversation.id, { type: \"conversation\", conversationId: c.conversation.id });\n },\n async pins(conversationId: string) {\n return [...(convs.get(conversationId)?.pins ?? [])];\n },\n async save(messageId: string, on = true, note?: string) {\n log(\"save\", messageId, on, note);\n },\n async report(messageId: string, reason: \"spam\" | \"harassment\" | \"safety\" | \"other\", note?: string) {\n log(\"report\", messageId, reason, note);\n return uuid();\n },\n async upload(\n conversationId: string,\n userId: string,\n file: Blob | ArrayBuffer,\n opts: { name: string; contentType: string; id?: string; onProgress?: (sent: number, total: number) => void; signal?: AbortSignal },\n ) {\n log(\"upload\", conversationId, opts.name);\n await wait();\n const total = file instanceof Blob ? file.size : file.byteLength;\n opts.onProgress?.(total, total);\n const path = `${conversationId}/${userId}/${opts.id ?? uuid()}-${opts.name}`;\n const blob = file instanceof Blob ? file : new Blob([file], { type: opts.contentType });\n files[path] = typeof URL !== \"undefined\" && typeof URL.createObjectURL === \"function\" ? URL.createObjectURL(blob) : `memory://${path}`;\n return path;\n },\n async fileUrls(paths: string[]) {\n const out: Record<string, string> = {};\n for (const p of paths) if (files[p]) out[p] = files[p]!;\n return out;\n },\n subscribeInbox(_userId: string, onSignal: (s: ChatSignal) => void) {\n inboxListeners.add(onSignal);\n return { unsubscribe: () => void inboxListeners.delete(onSignal) };\n },\n subscribeConversation(conversationId: string, _me: string, handlers: ConversationHandlers): ConversationChannel {\n const set = convListeners.get(conversationId) ?? new Set();\n convListeners.set(conversationId, set);\n const entry = { onSignal: handlers.onSignal, onActivity: handlers.onActivity };\n set.add(entry);\n // Joins at once, as a live channel does once it is subscribed.\n setTimeout(() => {\n if (set.has(entry)) handlers.onJoin?.();\n }, 0);\n return {\n signal(activity) {\n log(\"signal\", conversationId, activity);\n },\n unsubscribe: () => void set.delete(entry),\n };\n },\n\n // ── 0002 ──\n async topics(conversationId: string) {\n log(\"topics\", conversationId);\n await wait();\n return [...(convs.get(conversationId)?.topics ?? [])].sort((a, b) => a.position - b.position || a.topic.localeCompare(b.topic)).map((t) => ({ ...t }));\n },\n async setTopic(conversationId: string, topic: string, input: TopicInput = {}) {\n log(\"setTopic\", conversationId, topic, input);\n const c = get(conversationId);\n if (c.myRole !== \"owner\" && c.myRole !== \"admin\") throw new ChatError(\"Only an owner or admin manages topics\", \"42501\", \"set_topic\");\n const key = topic.trim();\n let t = c.topics.find((x) => x.topic === key);\n if (!t) {\n t = { conversationId, topic: key, title: input.title?.trim() || key, position: input.position ?? c.topics.length, closedAt: null, createdBy: me, createdAt: new Date().toISOString() };\n c.topics.push(t);\n } else {\n if (input.title?.trim()) t.title = input.title.trim();\n if (input.position != null) t.position = input.position;\n }\n if (input.closed === true) t.closedAt ??= new Date().toISOString();\n if (input.closed === false) t.closedAt = null;\n emit(conversationId, { type: \"conversation\", conversationId });\n },\n async schedule(input: ScheduleInput) {\n log(\"schedule\", input);\n await wait();\n const c = get(input.conversationId);\n if (!c.canPost) throw new ChatError(\"You can't post in this conversation\", \"42501\", \"schedule_message\");\n const sendAt = typeof input.sendAt === \"string\" ? input.sendAt : input.sendAt.toISOString();\n const t = Date.parse(sendAt);\n if (!(t >= Date.now() + 60_000 && t <= Date.now() + 365 * 86_400_000)) throw new ChatError(\"Schedule between a minute and a year from now\", \"22023\", \"schedule_message\");\n if (!(input.body ?? \"\").trim() && !(input.attachments ?? []).length) throw new ChatError(\"A message needs text or an attachment\", \"22023\", \"schedule_message\");\n const existing = scheduledList.find((s) => s.clientId === input.clientId);\n if (existing) {\n existing.sendAt = sendAt;\n return existing.id;\n }\n const s: ScheduledMessage = {\n id: uuid(),\n conversationId: input.conversationId,\n clientId: input.clientId,\n body: input.body ?? \"\",\n attachments: input.attachments ?? [],\n replyToId: input.replyToId ?? null,\n topic: input.topic ?? null,\n mentions: input.mentions ?? [],\n silent: input.silent ?? false,\n sendAt,\n sentMessageId: null,\n cancelledAt: null,\n error: null,\n createdAt: new Date().toISOString(),\n status: \"scheduled\",\n };\n scheduledList.push(s);\n return s.id;\n },\n async scheduled(conversationId?: string) {\n log(\"scheduled\", conversationId);\n await wait();\n return scheduledList\n .filter((s) => (s.status === \"scheduled\" || s.status === \"failed\") && (!conversationId || s.conversationId === conversationId))\n .sort((a, b) => a.sendAt.localeCompare(b.sendAt))\n .map((s) => ({ ...s }));\n },\n async cancelScheduled(id: string) {\n log(\"cancelScheduled\", id);\n // As cancel_scheduled: anything not sent and not cancelled, a failed one included.\n const s = scheduledList.find((x) => x.id === id && x.status !== \"sent\" && x.status !== \"cancelled\");\n if (!s) throw new ChatError(\"Nothing to cancel\", \"22023\", \"cancel_scheduled\");\n s.cancelledAt = new Date().toISOString();\n s.status = \"cancelled\";\n },\n async availabilityFor(conversationId: string) {\n log(\"availabilityFor\", conversationId);\n const c = get(conversationId);\n return c.members.filter((m) => m.role !== \"observer\" && availability.has(m.userId)).map((m) => ({ ...availability.get(m.userId)! }));\n },\n async myAvailability() {\n const a = availability.get(me);\n return a ? { ...a } : null;\n },\n async setAvailability(input: AvailabilityInput) {\n log(\"setAvailability\", input);\n availability.set(me, {\n userId: me,\n awayMessage: input.awayMessage?.trim() || null,\n awayUntil: input.awayUntil ?? null,\n timeZone: input.timeZone ?? null,\n hours: input.hours ?? null,\n });\n },\n async broadcast(conversationIds: string[], clientId: string, body: string, opts: { silent?: boolean } = {}) {\n log(\"broadcast\", conversationIds, clientId, body);\n await wait();\n const ids: string[] = [];\n for (const id of new Set(conversationIds)) {\n const c = convs.get(id);\n if (!c?.canPost) continue;\n const m = await client.send({ conversationId: id, clientId: `${clientId}:${id}`, body, silent: opts.silent });\n ids.push(m.id);\n }\n return ids;\n },\n async search(query: string, conversationId?: string | null) {\n log(\"search\", query, conversationId);\n await wait();\n const q = query.trim().toLowerCase();\n if (q.length < 2) return [];\n const hits: ChatSearchHit[] = [];\n // As search_messages does: the text's own « and » become ‹ and ›, so only real matches are marked.\n const mark = (raw: string) => {\n const text = raw.replace(/«/g, \"‹\").replace(/»/g, \"›\");\n const i = text.toLowerCase().indexOf(q);\n const start = Math.max(0, i - 40);\n return `${start > 0 ? \"…\" : \"\"}${text.slice(start, i)}«${text.slice(i, i + q.length)}»${text.slice(i + q.length, i + q.length + 60)}`;\n };\n for (const c of convs.values()) {\n if (conversationId && c.conversation.id !== conversationId) continue;\n for (const m of c.messages) {\n if (m.deletedAt || !visible(c, m)) continue;\n const base = { messageId: m.id, conversationId: c.conversation.id, seq: m.seq, senderId: m.senderId, createdAt: m.createdAt, threadRootId: m.threadRootId ?? null };\n if (m.body.toLowerCase().includes(q)) hits.push({ ...base, snippet: mark(m.body), inTranscript: false });\n else {\n const t = m.attachments.find((a) => a.transcript?.toLowerCase().includes(q))?.transcript;\n if (t) hits.push({ ...base, snippet: mark(t), inTranscript: true });\n }\n }\n }\n return hits.sort((a, b) => b.createdAt.localeCompare(a.createdAt)).slice(0, 30);\n },\n async linkPreviewsFor(messageIds: string[]) {\n log(\"linkPreviewsFor\", messageIds);\n const out: Record<string, ChatLinkPreview[]> = {};\n for (const id of new Set(messageIds)) {\n let found: { c: Conv; m: ChatMessage } | null = null;\n try {\n found = findMessage(id);\n } catch {\n found = null;\n }\n // Only for a message you can read, as link_previews_for answers.\n if (!found || found.m.deletedAt || !visible(found.c, found.m)) {\n out[id] = [];\n continue;\n }\n out[id] = extractLinks(found.m.body)\n .map((u) => previews.get(u))\n .filter((p): p is ChatLinkPreview => Boolean(p && p.status === \"ok\"))\n .map((p) => ({ ...p }));\n }\n return out;\n },\n async sendDue(now = new Date()) {\n let n = 0;\n for (const s of scheduledList) {\n if (s.status !== \"scheduled\" || Date.parse(s.sendAt) > now.getTime()) continue;\n try {\n const m = await client.send({ conversationId: s.conversationId, clientId: s.clientId, body: s.body, attachments: s.attachments, replyToId: s.replyToId, topic: s.topic, mentions: s.mentions, silent: s.silent });\n s.sentMessageId = m.id;\n s.status = \"sent\";\n n += 1;\n } catch (e) {\n s.error = e instanceof Error ? e.message : String(e);\n s.status = \"failed\";\n }\n }\n return n;\n },\n moderate(messageId: string, result: \"clean\" | \"flagged\" | \"hidden\") {\n if (result === \"clean\") return;\n const { c, m } = findMessage(messageId);\n m.moderation = result;\n emit(c.conversation.id, { type: \"message\", conversationId: c.conversation.id, id: m.id, seq: m.seq, op: \"update\" });\n },\n\n receive(conversationId: string, senderId: string, body: string, extra: Partial<ChatMessage> = {}) {\n const c = get(conversationId);\n const m = makeMessage(c, { senderId, body, ...extra } as Partial<ChatMessage>);\n c.messages.push(m);\n emit(conversationId, { type: \"message\", conversationId, id: m.id, seq: m.seq, op: \"insert\" });\n return clone(m);\n },\n activity(conversationId: string, userId: string, activity: ChatActivity[\"activity\"]) {\n for (const l of convListeners.get(conversationId) ?? []) l.onActivity?.({ userId, activity, at: Date.now() });\n },\n failNextSends(count = 1) {\n failing = count;\n },\n holdNextSend() {\n let release!: () => void;\n held = new Promise<void>((r) => (release = r));\n return () => release();\n },\n };\n return client;\n}\n\nfunction keepKind(kind: string, opts: { kind?: string; kinds?: string[]; excludeKinds?: string[] }): boolean {\n if (opts.kind && kind !== opts.kind) return false;\n if (opts.kinds?.length && !opts.kinds.includes(kind)) return false;\n return !opts.excludeKinds?.includes(kind);\n}\n","/**\n * @feat:chat\n * `ChatBroadcast`: write one message and send it into many of your conversations at once\n * (each client's direct conversation), so each person gets it on their own and their reply\n * comes back to you privately. Pick conversations from the inbox (filter, select all), then send.\n */\nimport { useMemo, useRef, useState } from \"react\";\nimport { Megaphone, Search } from \"lucide-react\";\nimport { Alert, AlertDescription, Button, Checkbox, EmptyState, Input, Label, Skeleton, Textarea, UserAvatar, cn, toast } from \"@marktiderman/genesis-ui\";\nimport { CHAT_LIMITS, randomId } from \"../core/media\";\nimport type { ChatInboxItem } from \"../core/types\";\nimport { useBroadcast, useInbox } from \"../react/index\";\nimport type { ResolveUser } from \"./format\";\nimport { inboxTitle } from \"./inbox\";\n\nexport interface ChatBroadcastProps {\n resolveUser: ResolveUser;\n /** Only this kind of conversation (`direct`, say). */\n kind?: string;\n /** Which inbox rows may be picked; every one by default. */\n filter?: (item: ChatInboxItem) => boolean;\n /** Called with how many it went to. */\n onSent?: (sent: number, picked: number) => void;\n className?: string;\n}\n\nexport function ChatBroadcast({ resolveUser, kind, filter, onSent, className }: ChatBroadcastProps) {\n const { items, isLoading } = useInbox({ kind, limit: 200 });\n const { send, sending } = useBroadcast();\n const [picked, setPicked] = useState<Set<string>>(new Set());\n const [text, setText] = useState(\"\");\n const [q, setQ] = useState(\"\");\n // One clientId per draft, kept until it goes: Send pressed again after a timeout (when the\n // server may already have posted it) is the same broadcast, never a second one.\n const draftId = useRef<string | null>(null);\n const busy = useRef(false);\n\n const rows = useMemo(\n () =>\n items\n .filter((i) => (filter ? filter(i) : true))\n .map((i) => ({ item: i, title: inboxTitle(i, resolveUser) }))\n .sort((a, b) => a.title.localeCompare(b.title)),\n [items, filter, resolveUser],\n );\n const shown = rows.filter((r) => !q.trim() || r.title.toLowerCase().includes(q.trim().toLowerCase()));\n const allShown = shown.length > 0 && shown.every((r) => picked.has(r.item.conversationId));\n\n const toggle = (id: string, on: boolean) =>\n setPicked((p) => {\n const next = new Set(p);\n if (on) next.add(id);\n else next.delete(id);\n return next;\n });\n\n const submit = async () => {\n const body = text.trim();\n if (!body || picked.size === 0 || busy.current) return;\n busy.current = true;\n draftId.current ??= randomId();\n try {\n const ids = await send([...picked], body, { clientId: draftId.current });\n draftId.current = null;\n const n = ids.length;\n if (n === picked.size) toast.success(n === 1 ? \"Sent to 1 conversation\" : `Sent to ${n} conversations`);\n else toast.warning(`Sent to ${n} of ${picked.size}`, { description: \"You can't post in the others.\" });\n onSent?.(n, picked.size);\n setText(\"\");\n setPicked(new Set());\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Couldn't send\");\n } finally {\n busy.current = false;\n }\n };\n\n return (\n <form\n className={cn(\"flex flex-col gap-3\", className)}\n onSubmit={(e) => {\n e.preventDefault();\n void submit();\n }}\n data-testid=\"genesis-chat-broadcast\"\n >\n <Alert>\n <Megaphone className=\"size-4\" aria-hidden />\n <AlertDescription>Each person gets this in their own conversation with you, so replies come back to you privately. No one sees who else got it.</AlertDescription>\n </Alert>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"genesis-chat-broadcast-text\">Message</Label>\n <Textarea\n id=\"genesis-chat-broadcast-text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n maxLength={CHAT_LIMITS.bodyChars}\n className=\"min-h-24\"\n placeholder=\"Write once, send to everyone you pick\"\n />\n </div>\n\n <fieldset className=\"flex min-h-0 flex-col gap-2\">\n <legend className=\"mb-1 text-sm font-medium\">Send to</legend>\n <div className=\"flex items-center gap-2\">\n <div className=\"relative flex-1\">\n <Search className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" aria-hidden />\n <Input value={q} onChange={(e) => setQ(e.target.value)} placeholder=\"Filter\" aria-label=\"Filter conversations\" className=\"pl-8\" />\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={shown.length === 0}\n onClick={() =>\n setPicked((p) => {\n const next = new Set(p);\n for (const r of shown) {\n if (allShown) next.delete(r.item.conversationId);\n else next.add(r.item.conversationId);\n }\n return next;\n })\n }\n >\n {allShown ? \"Clear\" : \"Select all\"}\n </Button>\n </div>\n {isLoading ? (\n <div className=\"flex flex-col gap-2\" aria-busy aria-label=\"Loading conversations\">\n <Skeleton className=\"h-10 w-full\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n ) : shown.length === 0 ? (\n <EmptyState icon={Megaphone} title={rows.length ? \"No matches\" : \"No conversations yet\"} />\n ) : (\n <ul className=\"max-h-72 overflow-y-auto rounded-md border\" aria-label=\"Conversations\">\n {shown.map(({ item, title }) => {\n const id = `genesis-chat-broadcast-${item.conversationId}`;\n const avatar = item.otherUserId ? resolveUser(item.otherUserId).avatarUrl : null;\n return (\n <li key={item.conversationId} className=\"flex items-center gap-3 border-b px-3 py-2 last:border-b-0\">\n <Checkbox id={id} checked={picked.has(item.conversationId)} onCheckedChange={(v) => toggle(item.conversationId, v === true)} />\n <UserAvatar name={title} src={avatar} size=\"sm\" />\n <Label htmlFor={id} className=\"min-w-0 flex-1 cursor-pointer truncate font-normal\">\n {title}\n </Label>\n </li>\n );\n })}\n </ul>\n )}\n </fieldset>\n\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm text-muted-foreground\" aria-live=\"polite\">\n {picked.size === 0 ? \"Pick who gets it\" : picked.size === 1 ? \"1 conversation\" : `${picked.size} conversations`}\n </span>\n <Button type=\"submit\" loading={sending} disabled={!text.trim() || picked.size === 0} data-testid=\"genesis-chat-broadcast-send\">\n {picked.size > 1 ? `Send to ${picked.size}` : \"Send\"}\n </Button>\n </div>\n </form>\n );\n}\n"]}
|