@arbidocs/blocks 0.5.37 → 0.5.38
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/dist/{ConnectedCallDock-2NYM46HU.js → ConnectedCallDock-CT3D6LLI.js} +8 -8
- package/dist/{ConnectedCallDock-2NYM46HU.js.map → ConnectedCallDock-CT3D6LLI.js.map} +1 -1
- package/dist/{ConnectedCallDock-2LMIR4ID.cjs → ConnectedCallDock-V7DPSE6X.cjs} +17 -17
- package/dist/{ConnectedCallDock-2LMIR4ID.cjs.map → ConnectedCallDock-V7DPSE6X.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-QJ2UV6GV.js → ConnectedCallRoom-A27AM7IQ.js} +8 -8
- package/dist/{ConnectedCallRoom-QJ2UV6GV.js.map → ConnectedCallRoom-A27AM7IQ.js.map} +1 -1
- package/dist/{ConnectedCallRoom-26PBMTCC.cjs → ConnectedCallRoom-TNOCSTX2.cjs} +9 -9
- package/dist/{ConnectedCallRoom-26PBMTCC.cjs.map → ConnectedCallRoom-TNOCSTX2.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-5MN7PVRE.cjs → ConnectedNativeDocxComparison-H2OZMWHT.cjs} +13 -13
- package/dist/{ConnectedNativeDocxComparison-5MN7PVRE.cjs.map → ConnectedNativeDocxComparison-H2OZMWHT.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-GHOEFJUN.js → ConnectedNativeDocxComparison-RWKFPJPJ.js} +12 -12
- package/dist/{ConnectedNativeDocxComparison-GHOEFJUN.js.map → ConnectedNativeDocxComparison-RWKFPJPJ.js.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-HWPSWU2A.js → ConnectedNativeDocxEditor-43BI5LN6.js} +11 -11
- package/dist/{ConnectedNativeDocxEditor-HWPSWU2A.js.map → ConnectedNativeDocxEditor-43BI5LN6.js.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-VA7476NF.cjs → ConnectedNativeDocxEditor-6DQEM6SD.cjs} +13 -13
- package/dist/{ConnectedNativeDocxEditor-VA7476NF.cjs.map → ConnectedNativeDocxEditor-6DQEM6SD.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-UMSTUZBY.cjs → ConnectedStreamedWordArtifact-3VKYIG6C.cjs} +13 -13
- package/dist/ConnectedStreamedWordArtifact-3VKYIG6C.cjs.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-KZUZB47X.js → ConnectedStreamedWordArtifact-TEB332E3.js} +12 -12
- package/dist/ConnectedStreamedWordArtifact-TEB332E3.js.map +1 -0
- package/dist/{WorkspaceTableView-DYXHUIRA.cjs → WorkspaceTableView-KG546U7M.cjs} +9 -9
- package/dist/{WorkspaceTableView-DYXHUIRA.cjs.map → WorkspaceTableView-KG546U7M.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-HXSBJY42.js → WorkspaceTableView-OSFIWJ5C.js} +7 -7
- package/dist/{WorkspaceTableView-HXSBJY42.js.map → WorkspaceTableView-OSFIWJ5C.js.map} +1 -1
- package/dist/agents/index.cjs +401 -401
- package/dist/agents/index.js +10 -10
- package/dist/calls/index.cjs +131 -131
- package/dist/calls/index.js +9 -9
- package/dist/chat/index.cjs +81 -81
- package/dist/chat/index.js +3 -3
- package/dist/{chunk-3ON5DJLR.js → chunk-24H5WTGM.js} +4 -4
- package/dist/{chunk-3ON5DJLR.js.map → chunk-24H5WTGM.js.map} +1 -1
- package/dist/{chunk-EHRT5M5F.js → chunk-2C3I27VI.js} +3 -3
- package/dist/{chunk-EHRT5M5F.js.map → chunk-2C3I27VI.js.map} +1 -1
- package/dist/{chunk-UKG4DDLI.cjs → chunk-2QDNQM63.cjs} +10 -10
- package/dist/{chunk-UKG4DDLI.cjs.map → chunk-2QDNQM63.cjs.map} +1 -1
- package/dist/{chunk-EZJOJFY2.cjs → chunk-3ZLNI7ZA.cjs} +3 -3
- package/dist/{chunk-EZJOJFY2.cjs.map → chunk-3ZLNI7ZA.cjs.map} +1 -1
- package/dist/{chunk-JYASRZUQ.js → chunk-4DKI37QQ.js} +7 -7
- package/dist/{chunk-JYASRZUQ.js.map → chunk-4DKI37QQ.js.map} +1 -1
- package/dist/{chunk-OXIGJYMO.cjs → chunk-5NTSJV5H.cjs} +3 -3
- package/dist/{chunk-OXIGJYMO.cjs.map → chunk-5NTSJV5H.cjs.map} +1 -1
- package/dist/{chunk-7P2IL7RX.cjs → chunk-6EQSP77K.cjs} +5 -5
- package/dist/{chunk-7P2IL7RX.cjs.map → chunk-6EQSP77K.cjs.map} +1 -1
- package/dist/{chunk-T7O73MX2.js → chunk-7CHI36EP.js} +5 -5
- package/dist/{chunk-T7O73MX2.js.map → chunk-7CHI36EP.js.map} +1 -1
- package/dist/{chunk-CXY2ELL5.js → chunk-AL7EXOX5.js} +3 -3
- package/dist/{chunk-CXY2ELL5.js.map → chunk-AL7EXOX5.js.map} +1 -1
- package/dist/{chunk-YRWMYVHU.cjs → chunk-BIWPXSGS.cjs} +20 -20
- package/dist/{chunk-YRWMYVHU.cjs.map → chunk-BIWPXSGS.cjs.map} +1 -1
- package/dist/{chunk-ZZ76AUGX.cjs → chunk-BRYRZOS3.cjs} +4 -4
- package/dist/{chunk-ZZ76AUGX.cjs.map → chunk-BRYRZOS3.cjs.map} +1 -1
- package/dist/{chunk-ABKRLMWN.cjs → chunk-EFSL4O3B.cjs} +5 -5
- package/dist/{chunk-ABKRLMWN.cjs.map → chunk-EFSL4O3B.cjs.map} +1 -1
- package/dist/{chunk-32ZIHUXE.cjs → chunk-EGSSLWNZ.cjs} +3 -3
- package/dist/{chunk-32ZIHUXE.cjs.map → chunk-EGSSLWNZ.cjs.map} +1 -1
- package/dist/{chunk-ZXU2TKUV.js → chunk-EZSYYENN.js} +6 -6
- package/dist/{chunk-ZXU2TKUV.js.map → chunk-EZSYYENN.js.map} +1 -1
- package/dist/{chunk-LPGFODB4.cjs → chunk-FEVJA4BP.cjs} +3 -3
- package/dist/{chunk-LPGFODB4.cjs.map → chunk-FEVJA4BP.cjs.map} +1 -1
- package/dist/{chunk-IC2BXIUT.js → chunk-FHB4G77H.js} +3 -3
- package/dist/{chunk-IC2BXIUT.js.map → chunk-FHB4G77H.js.map} +1 -1
- package/dist/{chunk-UCCYCT3R.cjs → chunk-FY4C7HU5.cjs} +16 -16
- package/dist/{chunk-UCCYCT3R.cjs.map → chunk-FY4C7HU5.cjs.map} +1 -1
- package/dist/{chunk-RVCQE66I.cjs → chunk-H5BFOVVL.cjs} +5 -5
- package/dist/{chunk-RVCQE66I.cjs.map → chunk-H5BFOVVL.cjs.map} +1 -1
- package/dist/{chunk-WDMWWBPB.cjs → chunk-H6K7EWL2.cjs} +7 -7
- package/dist/{chunk-WDMWWBPB.cjs.map → chunk-H6K7EWL2.cjs.map} +1 -1
- package/dist/{chunk-NNUNS47F.js → chunk-ICCBNHPU.js} +3 -3
- package/dist/{chunk-NNUNS47F.js.map → chunk-ICCBNHPU.js.map} +1 -1
- package/dist/{chunk-U7IEC2EM.cjs → chunk-JKMV4QNV.cjs} +74 -74
- package/dist/{chunk-U7IEC2EM.cjs.map → chunk-JKMV4QNV.cjs.map} +1 -1
- package/dist/{chunk-GMECFWVT.js → chunk-K6W2GWCN.js} +3 -3
- package/dist/{chunk-GMECFWVT.js.map → chunk-K6W2GWCN.js.map} +1 -1
- package/dist/{chunk-7W7TPWSZ.cjs → chunk-LNYEYR7W.cjs} +3 -3
- package/dist/{chunk-7W7TPWSZ.cjs.map → chunk-LNYEYR7W.cjs.map} +1 -1
- package/dist/{chunk-VWX5UECZ.js → chunk-MLHOG7YH.js} +3 -3
- package/dist/{chunk-VWX5UECZ.js.map → chunk-MLHOG7YH.js.map} +1 -1
- package/dist/{chunk-L7IBURSP.js → chunk-N3HVTMQK.js} +3 -3
- package/dist/{chunk-L7IBURSP.js.map → chunk-N3HVTMQK.js.map} +1 -1
- package/dist/{chunk-OJTXFIXU.cjs → chunk-NOKTUWTN.cjs} +4 -4
- package/dist/{chunk-OJTXFIXU.cjs.map → chunk-NOKTUWTN.cjs.map} +1 -1
- package/dist/{chunk-2VEBUYEJ.js → chunk-NUV5F6MM.js} +3 -3
- package/dist/{chunk-2VEBUYEJ.js.map → chunk-NUV5F6MM.js.map} +1 -1
- package/dist/{chunk-MJYGHJ4Y.js → chunk-P6MVDOCL.js} +3 -3
- package/dist/{chunk-MJYGHJ4Y.js.map → chunk-P6MVDOCL.js.map} +1 -1
- package/dist/{chunk-GI5ITZ53.js → chunk-PRY52BW5.js} +4 -4
- package/dist/{chunk-GI5ITZ53.js.map → chunk-PRY52BW5.js.map} +1 -1
- package/dist/chunk-PTYERKEU.js +2132 -0
- package/dist/chunk-PTYERKEU.js.map +1 -0
- package/dist/{chunk-IYW6Q33D.cjs → chunk-PUX4M22Q.cjs} +50 -50
- package/dist/{chunk-IYW6Q33D.cjs.map → chunk-PUX4M22Q.cjs.map} +1 -1
- package/dist/{chunk-ORBXJ4IT.js → chunk-QFYRXQTD.js} +3 -3
- package/dist/{chunk-ORBXJ4IT.js.map → chunk-QFYRXQTD.js.map} +1 -1
- package/dist/{chunk-UHYO2E25.js → chunk-RH4XIABH.js} +3 -3
- package/dist/{chunk-UHYO2E25.js.map → chunk-RH4XIABH.js.map} +1 -1
- package/dist/{chunk-GMZ2XFQQ.js → chunk-S3YRRD54.js} +3 -3
- package/dist/{chunk-GMZ2XFQQ.js.map → chunk-S3YRRD54.js.map} +1 -1
- package/dist/chunk-TQSU3I4C.cjs +2180 -0
- package/dist/chunk-TQSU3I4C.cjs.map +1 -0
- package/dist/{chunk-LXF22VRI.js → chunk-VKY4SQMH.js} +4 -4
- package/dist/{chunk-LXF22VRI.js.map → chunk-VKY4SQMH.js.map} +1 -1
- package/dist/{chunk-H3JKC55K.cjs → chunk-VMLEISRZ.cjs} +9 -9
- package/dist/{chunk-H3JKC55K.cjs.map → chunk-VMLEISRZ.cjs.map} +1 -1
- package/dist/{chunk-VP5TGUBY.js → chunk-VPWCARVO.js} +5 -5
- package/dist/{chunk-VP5TGUBY.js.map → chunk-VPWCARVO.js.map} +1 -1
- package/dist/{chunk-N2SUDWY2.cjs → chunk-WALADS2S.cjs} +3 -3
- package/dist/{chunk-N2SUDWY2.cjs.map → chunk-WALADS2S.cjs.map} +1 -1
- package/dist/{chunk-ME3R44JN.cjs → chunk-XFSEPGF7.cjs} +4 -4
- package/dist/{chunk-ME3R44JN.cjs.map → chunk-XFSEPGF7.cjs.map} +1 -1
- package/dist/{chunk-K7OF4KGP.cjs → chunk-YDY4GIC2.cjs} +5 -5
- package/dist/{chunk-K7OF4KGP.cjs.map → chunk-YDY4GIC2.cjs.map} +1 -1
- package/dist/{chunk-APPHGHMM.js → chunk-YPR4FSDJ.js} +3 -3
- package/dist/{chunk-APPHGHMM.js.map → chunk-YPR4FSDJ.js.map} +1 -1
- package/dist/collaboration/index.cjs +1 -1
- package/dist/collaboration/index.js +1 -1
- package/dist/connect/docx.cjs +15 -15
- package/dist/connect/docx.js +11 -11
- package/dist/connect/index.cjs +1433 -928
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/index.d.ts +1 -0
- package/dist/connect/index.js +563 -59
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/viewer.cjs +63 -63
- package/dist/connect/viewer.js +16 -16
- package/dist/connection/databases/ConnectedDatabasesPage.d.ts +1 -0
- package/dist/connection/databases/DatabaseViewsMenu.d.ts +10 -0
- package/dist/connection/databases/index.d.ts +1 -0
- package/dist/connection/databases/useDatabaseCellSources.d.ts +6 -0
- package/dist/databases/index.cjs +193 -2173
- package/dist/databases/index.cjs.map +1 -1
- package/dist/databases/index.js +4 -2129
- package/dist/databases/index.js.map +1 -1
- package/dist/facts/index.cjs +2 -2
- package/dist/facts/index.js +2 -2
- package/dist/files/index.cjs +223 -223
- package/dist/files/index.js +3 -3
- package/dist/home/index.cjs +29 -29
- package/dist/home/index.js +4 -4
- package/dist/index.cjs +1656 -1656
- package/dist/index.js +22 -22
- package/dist/settings/index.cjs +156 -156
- package/dist/settings/index.js +3 -3
- package/dist/shell/index.cjs +72 -72
- package/dist/shell/index.js +4 -4
- package/dist/studio/index.cjs +8 -8
- package/dist/studio/index.js +7 -7
- package/dist/workflow-canvas/index.cjs +23 -23
- package/dist/workflow-canvas/index.js +10 -10
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/ConnectedStreamedWordArtifact-KZUZB47X.js.map +0 -1
- package/dist/ConnectedStreamedWordArtifact-UMSTUZBY.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/calls/ControlButton.tsx","../src/calls/hooks.ts","../src/calls/tiles.tsx","../src/calls/status.tsx","../src/calls/ControlBar.tsx","../src/calls/CallStage.tsx","../src/calls/CallSidePanel.tsx","../src/calls/panels.tsx","../src/calls/cards.tsx","../src/calls/join-choices.ts","../src/calls/PreJoin.tsx","../src/calls/webinar/WebinarWaiting.tsx","../src/calls/webinar/hooks.ts","../src/calls/webinar/live.tsx","../src/calls/webinar/RaiseHandButton.tsx","../src/calls/webinar/WebinarAudiencePanel.tsx","../src/calls/webinar/QAPanel.tsx","../src/calls/webinar/ChatPermissionSetting.tsx","../src/calls/webinar/OnStageCheck.tsx","../src/calls/webinar/WebinarViewer.tsx","../src/calls/voice-levels.ts","../src/calls/ringtone.ts","../src/calls/composite-canvas.ts","../src/calls/call-status.ts","../src/calls/recording-labels.ts","../src/calls/self-view.ts","../src/calls/call-cards.ts","../src/calls/HeaderAction.tsx","../src/calls/CallsExperimentalBadge.tsx","../src/calls/recording-link.ts","../src/calls/connected/CallUserPill.tsx"],"names":["forwardRef","CallControlButton","jsx","Button","cn","Tooltip","TooltipTrigger","jsxs","TooltipContent","useState","useRef","useMemo","useEffect","NOTICE_MS","CallTile","MonitorUp","MicOff","AudioLines","SignalLow","gridSlots","gridLayout","Users","spotlightBox","Fragment","Captions","Mic","Lock","LockOpen","CAPTION_TTL_MS","CAPTION_LINES","speakerAccent","Separator","formatElapsed","pending","Video","VideoOff","DropdownMenu","DropdownMenuTrigger","ChevronUp","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","DropdownMenuRadioGroup","DropdownMenuRadioItem","DropdownMenuSeparator","DropdownMenuCheckboxItem","Loader2","Circle","PhoneOff","MoreHorizontal","status","TabHeader","Phone","LayoutGrid","UserRound","PictureInPicture2","TabsList","TabsTrigger","X","Tabs","TabsContent","UserX","Maximize2","BellOff","Bell","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","CalendarCheck","useCallback","Radio","SquareX","ConfirmDialog","EyeOff","Hand","formatRelativeTime","Search","Input","Textarea","Send","CheckCheck","RotateCcw","Trash2","MessageSquareText","Dialog","DialogContent","DialogTitle","DialogDescription","MessageCircleQuestion","EMPTY","useSyncExternalStore","INITIAL_SPOTLIGHT","prev","SPEAKING_LEVEL","id","nextSpotlight","listeners","subscribe","FlaskConical","buildDeepLinkUrl","memo","CallUserPill","useArbiHost","useArbi","UserEntity","initialsOf","getUserAvatarColor"],"mappings":"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","file":"chunk-32ZIHUXE.cjs","sourcesContent":["/**\n * The one button style of the call controls: an ARBI `Button` (36 px, 44 px on touch) with a\n * tooltip naming the action and its shortcut. Three tones:\n * neutral — a plain control (share, chat, more);\n * active — a control whose thing is on or open (captions on, chat open);\n * off — a device the user turned off (mic / camera), red-tinted, not a giant block.\n * The status chips of the header (`CallStatusChip`) live here too, so all call chrome shares\n * one source of sizes and colours.\n */\n\nimport { forwardRef, type ReactElement, type ReactNode } from 'react'\nimport {\n Button,\n cn,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n type ButtonProps,\n} from '@arbidocs/react/ui'\n\nexport type ControlTone = 'neutral' | 'active' | 'off' | 'danger'\n\nconst TONE: Record<ControlTone, string> = {\n neutral: 'bg-muted text-foreground hover:bg-accent',\n // Solid: a control whose thing is on reads as on at a glance (CC on, chat open, sharing).\n active: 'bg-primary text-primary-foreground hover:bg-primary/90',\n off: 'bg-red-bg text-red-text hover:bg-red-bg/80',\n danger: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n}\n\nexport interface CallControlButtonProps extends Omit<ButtonProps, 'variant'> {\n /** What the button does now (\"Turn off microphone\"). Also its accessible name. */\n label: string\n /** Shown in the tooltip after the label, e.g. \"M\". */\n shortcut?: string\n tone?: ControlTone\n /** Tooltip side (default above: the bar sits at the bottom). */\n side?: 'top' | 'bottom'\n /** False for a menu trigger: the open menu says it all, and a tip would sit on top of it. */\n tooltip?: boolean\n}\n\nexport const CallControlButton = forwardRef<HTMLButtonElement, CallControlButtonProps>(\n function CallControlButton(\n {\n label,\n shortcut,\n tone = 'neutral',\n side = 'top',\n tooltip = true,\n className,\n children,\n ...props\n },\n ref\n ) {\n const button = (\n <Button\n ref={ref}\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={label}\n className={cn('relative shrink-0 [&_svg]:size-[18px]', TONE[tone], className)}\n {...props}\n >\n {children}\n </Button>\n )\n if (!tooltip) return button\n return (\n <Tooltip>\n {/* The tooltip binds to a wrapper so the button keeps its own ref (a menu trigger needs it). */}\n <TooltipTrigger asChild>\n <span className=\"inline-flex shrink-0\">{button}</span>\n </TooltipTrigger>\n <TooltipContent side={side}>\n {label}\n {shortcut && (\n <kbd className=\"ml-2 rounded-sm border border-border px-1 font-sans text-[11px] text-muted-foreground\">\n {shortcut}\n </kbd>\n )}\n </TooltipContent>\n </Tooltip>\n )\n }\n)\n\n/** A count on a control's corner: unread messages (red, top) or how many people (quiet, bottom). */\nexport function ControlBadge({\n count,\n tone = 'alert',\n testId,\n}: {\n count: number\n tone?: 'alert' | 'quiet'\n testId?: string\n}): ReactElement {\n return (\n <span\n className={cn(\n 'pointer-events-none absolute -right-1 min-w-[1.125rem] rounded-full px-1 text-center text-[10px] font-semibold leading-[1.125rem]',\n tone === 'alert'\n ? '-top-1 bg-destructive text-destructive-foreground ring-2 ring-background'\n : '-bottom-1 bg-background text-muted-foreground ring-1 ring-border'\n )}\n data-testid={testId}\n >\n {count > 99 ? '99+' : count}\n </span>\n )\n}\n\n/** A small quiet status chip for the call header (recording, transcription, encryption). */\nexport function CallStatusChip({\n tone,\n icon,\n label,\n compact = false,\n pulse = false,\n title,\n children,\n className,\n testId,\n ...rest\n}: {\n tone: 'red' | 'green' | 'yellow' | 'neutral'\n icon?: ReactNode\n /** Visible text (hidden when compact; the accessible text stays). */\n label: ReactNode\n compact?: boolean\n /** A pulsing dot in front (live capture). */\n pulse?: boolean\n title?: string\n children?: ReactNode\n className?: string\n testId?: string\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, 'title'>): ReactElement {\n const tones = {\n red: 'border-red-border bg-red-bg text-red-text',\n green: 'border-green-border bg-green-bg text-green-text',\n yellow: 'border-yellow-border bg-yellow-bg text-yellow-text',\n neutral: 'border-border bg-muted text-muted-foreground',\n }\n return (\n <span\n className={cn(\n 'inline-flex h-6 shrink-0 items-center gap-1.5 rounded-md border px-2 text-xs font-medium',\n tones[tone],\n className\n )}\n title={title}\n data-testid={testId}\n {...rest}\n >\n {pulse && (\n <span className=\"relative flex size-2 shrink-0\" aria-hidden>\n <span className=\"absolute inline-flex size-full animate-ping rounded-full bg-red-solid opacity-60 motion-reduce:hidden\" />\n <span className=\"relative inline-flex size-2 rounded-full bg-red-solid\" />\n </span>\n )}\n {icon}\n <span className={cn('min-w-0 truncate', compact && 'sr-only')}>{label}</span>\n {children}\n </span>\n )\n}\n","/** Small hooks of the call blocks. */\n\nimport { useEffect, useMemo, useRef, useState, type RefObject } from 'react'\nimport { NOTICE_MS } from './layout'\n\n/** Size of an element, kept current with a ResizeObserver. */\nexport function useElementSize<T extends HTMLElement>(): [\n (el: T | null) => void,\n { width: number; height: number },\n] {\n const [size, setSize] = useState({ width: 0, height: 0 })\n const observer = useRef<ResizeObserver | null>(null)\n const ref = useMemo(\n () => (el: T | null) => {\n observer.current?.disconnect()\n observer.current = null\n if (!el || typeof ResizeObserver === 'undefined') return\n const ro = new ResizeObserver((entries) => {\n const r = entries[0]?.contentRect\n if (!r) return\n setSize((s) =>\n s.width === r.width && s.height === r.height ? s : { width: r.width, height: r.height }\n )\n })\n ro.observe(el)\n observer.current = ro\n },\n []\n )\n useEffect(() => () => observer.current?.disconnect(), [])\n return [ref, size]\n}\n\n/**\n * A notice that is spelled out on mount (when `announce`) and folds after `ms`; `onFolded` runs\n * once it folds, so the app can avoid spelling it out again on the next mount.\n */\nexport function useBriefNotice(announce = true, onFolded?: () => void, ms = NOTICE_MS): boolean {\n const [expanded, setExpanded] = useState(announce)\n const folded = useRef(onFolded)\n folded.current = onFolded\n useEffect(() => {\n if (!expanded) return\n const id = setTimeout(() => {\n setExpanded(false)\n folded.current?.()\n }, ms)\n return () => clearTimeout(id)\n }, [expanded, ms])\n return expanded\n}\n\n/** Is the keyboard event typed into a field (where a shortcut letter is just a letter)? */\nfunction typing(e: KeyboardEvent): boolean {\n const el = e.target as HTMLElement | null\n return !!el?.closest?.('input, textarea, select, [contenteditable=\"true\"], [role=\"textbox\"]')\n}\n\n/**\n * Single-key shortcuts inside `ref`: a control marked `data-call-shortcut=\"m\"` is clicked by the M\n * key while `enabled` and nobody is typing (or holding a modifier).\n */\nexport function useShortcutKeys(ref: RefObject<HTMLElement | null>, enabled: boolean): void {\n useEffect(() => {\n if (!enabled) return\n const onKey = (e: KeyboardEvent) => {\n if (e.repeat || e.ctrlKey || e.metaKey || e.altKey || typing(e)) return\n const key = e.key.toLowerCase()\n if (!/^[a-z]$/.test(key)) return\n const button = ref.current?.querySelector<HTMLButtonElement>(\n `[data-call-shortcut=\"${key}\"]:not(:disabled)`\n )\n if (!button) return\n e.preventDefault()\n button.click()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [ref, enabled])\n}\n","/**\n * The call stage's tiles: one participant tile (with a voice-level ring, so it is plain who is\n * talking), the gallery grid (fills the stage: 1, 2 side by side, 2 + 1, 2 × 2, 3 + 2, …), and the\n * spotlight layout — the speaker (or a shared screen) large, everyone else in a filmstrip.\n *\n * Media-library free: the app hands each tile its `<video>` (or nothing, for initials) and its\n * state. Extra props (data attributes the app's recorder reads, say) land on the tile's root.\n * Styles: `@arbidocs/blocks/calls.css`.\n */\n\nimport {\n forwardRef,\n type CSSProperties,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { AudioLines, MicOff, MonitorUp, SignalLow, Users } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { useElementSize } from './hooks'\nimport { gridLayout, gridSlots, spotlightBox } from './layout'\n\nexport interface CallTileProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /**\n * The name, once, at the bottom left: a node (the app's person pill, say), or a string shown in\n * a small dark chip.\n */\n name: ReactNode\n /** Shown large while there is no video (camera off). */\n initials: string\n /** The `<video>` element; omit while the camera is off. */\n video?: ReactNode\n source?: 'camera' | 'screen'\n /** My own tile: the name says \"(me)\". */\n local?: boolean\n /** Mirror the video (my own camera, as a selfie). Only the <video> flips; labels never do. */\n mirror?: boolean\n /** Talking now: a ring (thicker with `level`) and a sound icon by the name — never colour alone. */\n speaking?: boolean\n /** Voice level 0..1, updated fast (~60 ms): drives the ring's size. */\n level?: number\n micMuted?: boolean\n poorConnection?: boolean\n /** Small tiles (filmstrip, picture-in-picture) use a smaller avatar. */\n size?: 'normal' | 'small'\n /** Text after my own name when `name` is a string (a pill says \"(me)\" itself). */\n youLabel?: string\n}\n\n/** One participant (or screen-share) tile. */\nexport const CallTile = forwardRef<HTMLDivElement, CallTileProps>(function CallTile(\n {\n name,\n initials,\n video,\n source = 'camera',\n local = false,\n mirror = false,\n speaking = false,\n level = 0,\n micMuted = false,\n poorConnection = false,\n size = 'normal',\n youLabel,\n className,\n style,\n ...rest\n },\n ref\n) {\n const screen = source === 'screen'\n const ring = speaking && !screen ? Math.min(1, Math.max(0, level)) : 0\n return (\n <div\n ref={ref}\n className={cn('call-tile', className)}\n data-call-tile=\"\"\n data-source={source}\n data-local={local}\n data-mirror={mirror && source === 'camera' && !!video}\n data-speaking={speaking && !screen}\n style={{ '--call-level': ring.toFixed(2), ...style } as CSSProperties}\n {...rest}\n >\n {video ?? (\n <div className=\"call-tile-placeholder\" aria-hidden>\n <span className={cn('call-tile-avatar', size === 'small' && 'call-tile-avatar-sm')}>\n {initials}\n </span>\n </div>\n )}\n <div className=\"call-tile-name\">\n {typeof name === 'string' ? (\n <span className=\"call-tile-chip min-w-0\">\n <span className=\"truncate\">{name}</span>\n {local && !screen && youLabel && (\n <span className=\"shrink-0 opacity-80\">{youLabel}</span>\n )}\n </span>\n ) : (\n <span className=\"call-tile-chip min-w-0 overflow-hidden py-0.5 pl-0.5\">{name}</span>\n )}\n {(screen || micMuted || speaking) && (\n <span className=\"call-tile-chip shrink-0\">\n {screen && <MonitorUp className=\"size-3.5\" aria-label=\"Screen\" />}\n {!screen && micMuted && <MicOff className=\"size-3.5\" aria-label=\"Microphone off\" />}\n {speaking && !screen && (\n <AudioLines className=\"call-tile-speaking size-3.5\" aria-label=\"Speaking\" />\n )}\n </span>\n )}\n </div>\n {poorConnection && (\n <span className=\"call-tile-signal\" title=\"Poor connection\">\n <SignalLow className=\"size-3.5\" aria-label=\"Poor connection\" />\n </span>\n )}\n </div>\n )\n})\n\nconst GRID_GAP = 8\n\n/** The adaptive grid. Tiles keep 16:9 and the largest size the stage allows. */\nexport function CallGrid<T>({\n items,\n getKey,\n renderTile,\n moreLabel = (n: number) => `${n} more`,\n className,\n}: {\n items: T[]\n getKey(item: T): string\n /** The tile for one item; it fills a box the grid sizes. */\n renderTile(item: T): ReactElement\n moreLabel?(hidden: number): string\n className?: string\n}): ReactElement {\n const [ref, size] = useElementSize<HTMLDivElement>()\n const { shown, hidden } = gridSlots(items)\n const count = shown.length + (hidden ? 1 : 0)\n // The 16:9 maths picks rows × columns and the largest 16:9 tile that fits; tiles keep the\n // camera's shape (never stretched into portrait), the grid sits at the top of the stage.\n const layout = gridLayout(count, size.width, size.height, GRID_GAP)\n const box = { width: layout.tileWidth, height: layout.tileHeight }\n const rows: number[][] = []\n let next = 0\n for (const n of layout.rowCounts) rows.push(Array.from({ length: n }, () => next++))\n return (\n <div\n ref={ref}\n className={cn('flex size-full min-h-0 flex-col items-center', className)}\n style={{ gap: GRID_GAP }}\n data-testid=\"call-grid\"\n data-cols={layout.cols}\n >\n {layout.tileWidth > 0 &&\n rows.map((row, r) => (\n <div key={r} className=\"flex justify-center\" style={{ gap: GRID_GAP }}>\n {row.map((i) =>\n i < shown.length ? (\n <div key={getKey(shown[i])} className=\"call-tile-box\" style={box}>\n {renderTile(shown[i])}\n </div>\n ) : (\n <div key=\"more\" className=\"call-tile call-tile-more\" style={box}>\n <Users className=\"size-5\" aria-hidden />\n <span>{moreLabel(hidden)}</span>\n </div>\n )\n )}\n </div>\n ))}\n </div>\n )\n}\n\n/**\n * Spotlight: one tile large (the speaker, or a shared screen), everyone else in a filmstrip\n * beside it — below it on a narrow stage such as the docked call panel.\n */\nexport function CallFocus<T>({\n focus,\n others,\n getKey,\n renderTile,\n className,\n testId = 'call-focus',\n}: {\n focus: T\n others: T[]\n getKey(item: T): string\n renderTile(item: T, size: 'normal' | 'small'): ReactElement\n className?: string\n testId?: string\n}): ReactElement {\n const [ref, size] = useElementSize<HTMLDivElement>()\n const narrow = size.width > 0 && size.width < 640\n const box = spotlightBox(size.width, size.height, others.length, narrow)\n return (\n <div\n ref={ref}\n className={cn(\n 'flex size-full min-h-0 gap-2',\n narrow ? 'flex-col items-center' : 'flex-row items-start justify-center',\n className\n )}\n data-testid={testId}\n >\n {/* The large tile keeps 16:9 at the top: a camera is never cropped into portrait. */}\n <div\n key={getKey(focus)}\n className=\"call-tile-box shrink-0\"\n style={{ width: box.width, height: box.height }}\n data-testid=\"call-spotlight\"\n >\n {box.width > 0 && renderTile(focus, 'normal')}\n </div>\n {others.length > 0 && (\n <div\n className={cn(\n 'grid shrink-0 gap-2',\n narrow ? 'w-full grid-cols-3 content-start' : 'w-60 grid-cols-1 overflow-y-auto'\n )}\n style={narrow ? { width: box.width } : undefined}\n data-testid=\"call-filmstrip\"\n >\n {others.map((t) => (\n <div key={getKey(t)} className=\"call-tile-box aspect-video w-full min-w-0\">\n {renderTile(t, 'small')}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","/**\n * The call's status, each shown once in the header (or on the minimised card): recording,\n * transcription and encryption chips, and the live captions strip below the tiles.\n *\n * Recording and transcription chips first spell out who started them (\"Recording (Audio) —\n * started by Ada\"), then fold to a short label after {@link NOTICE_MS}; the full sentence stays\n * available to screen readers and as the tooltip.\n */\n\nimport { useEffect, useState, type ReactElement, type ReactNode } from 'react'\nimport { Captions, Lock, LockOpen, Mic, MicOff } from 'lucide-react'\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { CallStatusChip } from './ControlButton'\nimport { CAPTION_LINES, CAPTION_TTL_MS, speakerAccent } from './layout'\nimport { useBriefNotice } from './hooks'\n\nfunction FoldingLabel({\n sentence,\n short,\n expanded,\n}: {\n sentence: string\n short: string\n expanded: boolean\n}): ReactElement {\n return (\n <>\n <span className={cn(!expanded && 'sr-only')}>{sentence}</span>\n {!expanded && <span aria-hidden>{short}</span>}\n </>\n )\n}\n\n/** \"Recording\" with a pulsing dot. */\nexport function RecordingStatusChip({\n sentence,\n short = 'Recording',\n compact = false,\n announce = true,\n onAnnounced,\n className,\n ...rest\n}: {\n /** Spell the sentence out first (false once it has been, e.g. after a re-mount). */\n announce?: boolean\n onAnnounced?(): void\n /** e.g. \"Recording (Audio + video) — started by you\". */\n sentence: string\n short?: string\n /** Dot only once folded (a narrow header, the minimised card). */\n compact?: boolean\n className?: string\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, 'title'>): ReactElement {\n const expanded = useBriefNotice(announce, onAnnounced)\n return (\n <CallStatusChip\n tone=\"red\"\n pulse\n role=\"status\"\n aria-live=\"polite\"\n label={<FoldingLabel sentence={sentence} short={short} expanded={expanded} />}\n compact={compact && !expanded}\n title={sentence}\n className={className}\n data-expanded={expanded}\n {...rest}\n />\n )\n}\n\n/** \"Transcribing\", with my own \"stop sending my voice\" switch in it. */\nexport function TranscriptionStatusChip({\n sentence,\n announce = true,\n onAnnounced,\n short = 'Transcribing',\n detail,\n muted,\n onMutedChange,\n muteLabel,\n unmuteLabel,\n compact = false,\n className,\n ...rest\n}: {\n /** e.g. \"Transcription on — started by Ada\". */\n sentence: string\n announce?: boolean\n onAnnounced?(): void\n short?: string\n /** Tooltip after the sentence (what transcription does). */\n detail?: string\n muted: boolean\n onMutedChange(muted: boolean): void\n muteLabel: string\n unmuteLabel: string\n compact?: boolean\n className?: string\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, 'title'>): ReactElement {\n const expanded = useBriefNotice(announce, onAnnounced)\n const label = muted ? unmuteLabel : muteLabel\n return (\n <CallStatusChip\n tone=\"red\"\n role=\"status\"\n aria-live=\"polite\"\n icon={<Captions className=\"size-3.5 shrink-0\" aria-hidden />}\n label={<FoldingLabel sentence={sentence} short={short} expanded={expanded} />}\n compact={compact && !expanded}\n title={detail ? `${sentence}. ${detail}` : sentence}\n className={cn('pr-0.5', className)}\n data-expanded={expanded}\n {...rest}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n // `!`: a header section may force its buttons to a toolbar size.\n className=\"inline-flex h-5! w-5! shrink-0 items-center justify-center rounded-sm p-0! hover:bg-red-text/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-pressed={muted}\n aria-label={label}\n onClick={() => onMutedChange(!muted)}\n data-testid=\"transcription-mute\"\n >\n {muted ? (\n <MicOff className=\"size-3.5\" aria-hidden />\n ) : (\n <Mic className=\"size-3.5\" aria-hidden />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n </CallStatusChip>\n )\n}\n\n/** Whether the media is end-to-end encrypted. */\nexport function EncryptionStatusChip({\n state,\n compact = false,\n labels = {\n on: 'Encrypted',\n pending: 'Encrypting…',\n off: 'Not encrypted',\n onTitle: 'Media is end-to-end encrypted; the media server only sees ciphertext.',\n offTitle: 'This call is not end-to-end encrypted.',\n },\n}: {\n state: 'on' | 'pending' | 'off'\n compact?: boolean\n labels?: { on: string; pending: string; off: string; onTitle: string; offTitle: string }\n}): ReactElement {\n const on = state === 'on'\n return (\n <CallStatusChip\n tone={on ? 'neutral' : 'yellow'}\n icon={\n on ? (\n <Lock className=\"size-3.5 shrink-0\" aria-hidden />\n ) : (\n <LockOpen className=\"size-3.5 shrink-0\" aria-hidden />\n )\n }\n label={on ? labels.on : state === 'pending' ? labels.pending : labels.off}\n compact={compact}\n title={on ? labels.onTitle : labels.offTitle}\n data-testid=\"call-encryption-badge\"\n data-state={state}\n />\n )\n}\n\n/** One caption: a speaker's latest segment. */\nexport interface CaptionEntry {\n id: string\n speakerId: string\n name: string\n text: string\n /** Local receipt time, ms (drives the fade). */\n receivedAt: number\n}\n\n/**\n * Live captions in a strip below the tiles (never over a face): at most two lines, the newest at\n * the bottom, each speaker's name in their own accent. With `reserve` the strip keeps its height\n * while empty, so the tiles do not jump each time someone starts or stops talking.\n */\nexport function CaptionsStrip({\n captions,\n reserve = false,\n waitingText = 'Captions appear here as people speak.',\n className,\n}: {\n captions: CaptionEntry[]\n reserve?: boolean\n waitingText?: ReactNode\n className?: string\n}): ReactElement | null {\n const [now, setNow] = useState(() => Date.now())\n const visible = captions.filter((c) => now - c.receivedAt < CAPTION_TTL_MS).slice(-CAPTION_LINES)\n const showing = visible.length > 0\n const newest = captions[captions.length - 1]?.receivedAt\n useEffect(() => {\n setNow(Date.now())\n }, [newest])\n useEffect(() => {\n if (!showing) return\n const id = setInterval(() => setNow(Date.now()), 1000)\n return () => clearInterval(id)\n }, [showing])\n if (!showing && !reserve) return null\n return (\n <div\n className={cn(\n 'shrink-0 rounded-md bg-muted px-3 py-2 text-sm leading-5 text-foreground',\n className\n )}\n aria-live=\"polite\"\n data-testid=\"captions-overlay\"\n >\n {/* Two lines in all. Each caption is its speaker's name (never clipped) beside the tail of\n what they said: the text is bottom-aligned in a clip, so a long caption loses its start,\n not its speaker. One caption gets both lines; two get one each. */}\n <div className=\"flex h-10 flex-col justify-end overflow-hidden\">\n {!showing && (\n <p className=\"truncate text-muted-foreground\" data-testid=\"captions-waiting\">\n {waitingText}\n </p>\n )}\n {visible.map((c) => (\n <p\n key={`${c.speakerId}:${c.id}`}\n className=\"flex min-w-0 shrink-0 gap-1.5\"\n data-testid=\"caption-line\"\n data-speaker={c.speakerId}\n >\n <span\n className={cn(\n 'max-w-[40%] shrink-0 truncate font-semibold',\n speakerAccent(c.speakerId)\n )}\n >\n {c.name}\n </span>\n <span className=\"sr-only\">: </span>\n <span\n className=\"flex min-w-0 flex-1 flex-col justify-end overflow-hidden\"\n style={{ height: `${(visible.length > 1 ? 1 : CAPTION_LINES) * 1.25}rem` }}\n >\n <span className=\"break-words\">{c.text}</span>\n </span>\n </p>\n ))}\n </div>\n </div>\n )\n}\n","/**\n * The call's control bar: one row, three columns. Left, the elapsed time (and any warning);\n * centre, the controls in groups; right, Leave. Controls are `CallControlButton`s; Record carries\n * its label, so its state is never a guess.\n * Press-shortcuts: a control marked `data-call-shortcut=\"m\"` is clicked by the M key while\n * `shortcuts` is on and nobody is typing.\n */\n\nimport { useEffect, useRef, useState, type ReactElement, type ReactNode } from 'react'\nimport {\n ChevronUp,\n Circle,\n Loader2,\n Mic,\n MicOff,\n MoreHorizontal,\n PhoneOff,\n Video,\n VideoOff,\n} from 'lucide-react'\nimport {\n Button,\n cn,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Separator,\n} from '@arbidocs/react/ui'\nimport { CallControlButton } from './ControlButton'\nimport { useShortcutKeys } from './hooks'\nimport { formatElapsed } from './layout'\n\nexport function CallControlBar({\n left,\n right,\n children,\n shortcuts = false,\n className,\n}: {\n left?: ReactNode\n right?: ReactNode\n /** The centre controls (use `ControlGroup` / `ControlDivider`). */\n children: ReactNode\n /** Single-key shortcuts on (the call is on screen). */\n shortcuts?: boolean\n className?: string\n}): ReactElement {\n const ref = useRef<HTMLDivElement>(null)\n useShortcutKeys(ref, shortcuts)\n return (\n <div\n ref={ref}\n className={cn(\n 'grid h-16 shrink-0 grid-cols-[1fr_auto_1fr] items-center gap-2 border-t border-border bg-background px-3 sm:px-4',\n className\n )}\n data-testid=\"call-controls\"\n >\n <div className=\"flex min-w-0 items-center gap-2\">{left}</div>\n <div className=\"flex items-center gap-2\">{children}</div>\n <div className=\"flex items-center justify-end gap-2\">{right}</div>\n </div>\n )\n}\n\nexport function ControlGroup({ children }: { children: ReactNode }): ReactElement {\n return <div className=\"flex items-center gap-2\">{children}</div>\n}\n\nexport function ControlDivider(): ReactElement {\n return <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n}\n\n/** `m:ss` since `since`, ticking every second. */\nexport function ElapsedTime({ since, title }: { since: number; title?: string }): ReactElement {\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), 1000)\n return () => clearInterval(id)\n }, [])\n return (\n <span className=\"text-sm tabular-nums text-muted-foreground\" title={title}>\n {formatElapsed(now - since)}\n </span>\n )\n}\n\nexport interface MediaDevice {\n deviceId: string\n label: string\n}\n\n/** Microphone or camera: one toggle with an attached caret that opens the device list. */\nexport function MediaControl({\n kind,\n enabled,\n pending = false,\n onToggle,\n devices,\n activeDeviceId,\n onSelectDevice,\n shortcut,\n testId,\n options = [],\n}: {\n kind: 'microphone' | 'camera'\n enabled: boolean\n pending?: boolean\n onToggle(): void\n devices: MediaDevice[]\n activeDeviceId?: string\n onSelectDevice(deviceId: string): void\n shortcut?: string\n testId: string\n /** On/off settings under the device list (e.g. \"Mirror my video\"). */\n options?: { label: string; checked: boolean; onChange(checked: boolean): void; testId?: string }[]\n}): ReactElement {\n const mic = kind === 'microphone'\n const label = enabled ? `Turn off ${kind}` : `Turn on ${kind}`\n const Icon = mic ? (enabled ? Mic : MicOff) : enabled ? Video : VideoOff\n const title = mic ? 'Microphone' : 'Camera'\n return (\n <div className=\"flex shrink-0 items-center\" role=\"group\" aria-label={title}>\n <CallControlButton\n label={label}\n shortcut={shortcut}\n tone={enabled ? 'neutral' : 'off'}\n aria-pressed={enabled}\n disabled={pending}\n onClick={onToggle}\n className=\"rounded-r-none\"\n data-testid={testId}\n data-call-shortcut={shortcut?.toLowerCase()}\n data-enabled={enabled}\n >\n <Icon aria-hidden />\n </CallControlButton>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n aria-label={`Choose ${kind}`}\n title={`Choose ${kind}`}\n className={cn(\n 'h-9 w-6 shrink-0 rounded-l-none border-l px-0 pointer-coarse:h-11! pointer-coarse:w-8',\n enabled\n ? 'border-background bg-muted text-muted-foreground hover:bg-accent hover:text-foreground'\n : 'border-background bg-red-bg text-red-text hover:bg-red-bg/80'\n )}\n data-testid={`${testId}-devices`}\n >\n <ChevronUp className=\"size-3.5\" aria-hidden />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent side=\"top\" align=\"start\" className=\"w-72\">\n <DropdownMenuLabel className=\"text-xs font-medium text-muted-foreground\">\n {title}\n </DropdownMenuLabel>\n {devices.length === 0 ? (\n <DropdownMenuItem disabled>No {kind} found</DropdownMenuItem>\n ) : (\n <DropdownMenuRadioGroup value={activeDeviceId} onValueChange={onSelectDevice}>\n {devices.map((d, i) => (\n <DropdownMenuRadioItem key={d.deviceId} value={d.deviceId}>\n <span className=\"truncate\">{d.label || `${title} ${i + 1}`}</span>\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n )}\n {options.length > 0 && <DropdownMenuSeparator />}\n {options.map((o) => (\n <DropdownMenuCheckboxItem\n key={o.label}\n checked={o.checked}\n onCheckedChange={(c) => o.onChange(c === true)}\n data-testid={o.testId}\n >\n {o.label}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )\n}\n\nexport interface RecordMode<M extends string = string> {\n mode: M\n label: string\n description: string\n testId?: string\n}\n\n/**\n * The host's record button: off, it opens the mode choice; on, it stops (red). A plain menu\n * rather than a portal so the choice stays next to its button.\n */\nexport function RecordControl<M extends string>({\n on,\n busy = false,\n modes,\n note,\n onStart,\n onStop,\n}: {\n on: boolean\n busy?: boolean\n modes: RecordMode<M>[]\n /** One line above the modes (how recording works). */\n note?: string\n onStart(mode: M): void\n onStop(): void\n}): ReactElement {\n const [choosing, setChoosing] = useState(false)\n const menuRef = useRef<HTMLDivElement>(null)\n useEffect(() => {\n if (!choosing) return\n const onDown = (e: PointerEvent) => {\n if (!menuRef.current?.contains(e.target as Node)) setChoosing(false)\n }\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setChoosing(false)\n }\n document.addEventListener('pointerdown', onDown)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('pointerdown', onDown)\n document.removeEventListener('keydown', onKey)\n }\n }, [choosing])\n // Labelled, so its state is never a guess: \"Record\" (red dot) or \"Stop recording\" (pulsing).\n const base = 'h-9 shrink-0 gap-2 px-3 pointer-coarse:h-11!'\n if (on) {\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className={cn(base, 'bg-red-bg text-red-text hover:bg-red-bg/80')}\n disabled={busy}\n onClick={onStop}\n data-testid=\"recording-stop\"\n >\n {busy ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <span className=\"relative flex size-2.5\" aria-hidden>\n <span className=\"absolute inline-flex size-full animate-ping rounded-full bg-red-solid opacity-60 motion-reduce:hidden\" />\n <span className=\"relative inline-flex size-2.5 rounded-full bg-red-solid\" />\n </span>\n )}\n Stop recording\n </Button>\n )\n }\n return (\n <div ref={menuRef} className=\"relative\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n className={cn(base, 'bg-muted text-foreground hover:bg-accent')}\n disabled={busy}\n aria-expanded={choosing}\n aria-haspopup=\"menu\"\n onClick={() => setChoosing((c) => !c)}\n data-testid=\"recording-start\"\n >\n {busy ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Circle className=\"size-3 fill-red-solid text-red-solid\" aria-hidden />\n )}\n Record\n </Button>\n {choosing && (\n <div\n role=\"menu\"\n aria-label=\"Record\"\n className=\"absolute bottom-full left-1/2 z-50 mb-2 w-64 -translate-x-1/2 rounded-md border bg-popover p-1 text-popover-foreground shadow-lg\"\n >\n {note && <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">{note}</p>}\n {modes.map((m) => (\n <button\n key={m.mode}\n type=\"button\"\n role=\"menuitem\"\n className=\"flex w-full flex-col items-start rounded-sm px-2 py-1.5 text-left text-sm outline-none hover:bg-accent focus-visible:bg-accent pointer-coarse:min-h-11\"\n onClick={() => {\n setChoosing(false)\n onStart(m.mode)\n }}\n data-testid={m.testId}\n >\n <span className=\"font-medium\">{m.label}</span>\n <span className=\"text-xs text-muted-foreground\">{m.description}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** Leave: the one filled red control, at the right end. */\n/** A further way out offered by Leave (e.g. a webinar's \"End webinar for everyone\"). */\nexport interface LeaveOption {\n key: string\n label: string\n onSelect(): void\n testId?: string\n}\n\n/**\n * Leave: one red button. With `options` it opens a menu instead — Leave itself first, then the\n * options (a host ending the webinar for everyone) — so leaving and ending share one control.\n */\nexport function LeaveButton({\n onLeave,\n compact = false,\n label = 'Leave',\n title = 'Leave call',\n options,\n}: {\n onLeave(): void\n compact?: boolean\n label?: string\n title?: string\n options?: LeaveOption[]\n}): ReactElement {\n const menu = !!options?.length\n const button = (\n <Button\n type=\"button\"\n variant=\"destructive\"\n size={compact ? 'icon' : 'default'}\n className={cn('shrink-0', !compact && 'px-4')}\n aria-label={title}\n title={title}\n onClick={menu ? undefined : onLeave}\n data-testid=\"call-leave\"\n >\n <PhoneOff className=\"size-4\" aria-hidden />\n {!compact && label}\n </Button>\n )\n if (!menu) return button\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>{button}</DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n <DropdownMenuItem onSelect={onLeave} data-testid=\"call-leave-only\">\n <PhoneOff aria-hidden />\n {label}\n </DropdownMenuItem>\n {options.map((o) => (\n <DropdownMenuItem\n key={o.key}\n onSelect={o.onSelect}\n className=\"text-red-text focus:text-red-text\"\n data-testid={o.testId}\n >\n {o.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport interface MoreMenuItem {\n key: string\n label: ReactNode\n icon?: ReactNode\n onSelect(): void\n disabled?: boolean\n /** Right-aligned extra (a count). */\n trailing?: ReactNode\n testId?: string\n}\n\n/**\n * A group of More that is a setting rather than actions (e.g. the webinar's \"Who can chat\"): its\n * own menu content (a `DropdownMenuLabel` and radio items), between the same hairlines.\n */\nexport interface MoreMenuSection {\n key: string\n content: ReactNode\n}\n\ntype MoreMenuGroup = MoreMenuItem[] | MoreMenuSection\n\nconst isSection = (g: MoreMenuGroup): g is MoreMenuSection => !Array.isArray(g)\n\n/** \"More\": a details header, then groups of items (or settings) separated by hairlines. */\nexport function MoreMenu({\n details,\n groups,\n label = 'More options',\n}: {\n details?: ReactNode\n groups: MoreMenuGroup[]\n label?: string\n}): ReactElement {\n const shown = groups.filter((g) => isSection(g) || g.length > 0)\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <CallControlButton label={label} tooltip={false} data-testid=\"call-more\">\n <MoreHorizontal aria-hidden />\n </CallControlButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent side=\"top\" align=\"end\" className=\"w-72\" data-testid=\"call-more-menu\">\n {details && (\n <>\n <DropdownMenuLabel className=\"flex flex-col gap-1 font-normal\">\n {details}\n </DropdownMenuLabel>\n {shown.length > 0 && <DropdownMenuSeparator />}\n </>\n )}\n {shown.map((group, i) => (\n <div key={isSection(group) ? group.key : group[0].key} role=\"none\">\n {i > 0 && <DropdownMenuSeparator />}\n {isSection(group)\n ? group.content\n : group.map((item) => (\n <DropdownMenuItem\n key={item.key}\n onSelect={item.onSelect}\n disabled={item.disabled}\n data-testid={item.testId}\n >\n {item.icon}\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.trailing}\n </DropdownMenuItem>\n ))}\n </div>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","/**\n * The call panel, docked beside the call's conversation like the document viewer: the app's\n * header (`TabHeader`: one tab with the call's title; status chips, the view switch and\n * \"Minimise\" on the right), a \"Speaking: …\" line, the stage (tiles, or a side panel over them)\n * and the control bar. Normal app surfaces in both themes; only the tiles are dark.\n */\n\nimport type { ReactElement, ReactNode } from 'react'\nimport { useElementSize } from './hooks'\nimport { AudioLines, LayoutGrid, PictureInPicture2, Phone, UserRound } from 'lucide-react'\nimport { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { TabHeader } from '../shell/TabHeader'\n\nexport type CallView = 'speaker' | 'gallery'\n\nfunction HeaderIconButton({\n label,\n onClick,\n children,\n testId,\n pressed,\n}: {\n label: string\n onClick(): void\n children: ReactNode\n testId?: string\n pressed?: boolean\n}): ReactElement {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"text-muted-foreground hover:text-foreground\"\n aria-label={label}\n aria-pressed={pressed}\n onClick={onClick}\n data-testid={testId}\n >\n {children}\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n )\n}\n\nexport function CallHeader({\n title,\n icon,\n status,\n view,\n onViewChange,\n onMinimise,\n minimiseLabel = 'Minimise — keep working while the call goes on',\n}: {\n title: string\n icon?: ReactNode\n /** The status chips; given `compact` on a narrow header. */\n status?: ReactNode | ((compact: boolean) => ReactNode)\n /** Speaker (the talker large) or gallery (everyone equal): one switch. */\n view?: CallView\n onViewChange?(view: CallView): void\n onMinimise?(): void\n minimiseLabel?: string\n}): ReactElement {\n return (\n <div className=\"@container\">\n <TabHeader\n tabs={[\n {\n id: 'call',\n label: (\n <Tooltip>\n {/* Sized by the header's width (a container): the status chips and buttons keep\n their room; the title truncates with an ellipsis only when it must. */}\n <TooltipTrigger asChild showWithText>\n <span\n className=\"block min-w-0 max-w-[calc(100cqw-16rem)] truncate\"\n data-testid=\"call-title\"\n >\n {title}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{title}</TooltipContent>\n </Tooltip>\n ),\n icon: icon ?? <Phone className=\"size-4\" />,\n },\n ]}\n activeTabId=\"call\"\n onTabChange={() => undefined}\n testId=\"call-header\"\n // The hairline is the header's lower edge, flush with the panel below it.\n className=\"pb-0\"\n rightContent={(compact: boolean) => (\n <>\n {typeof status === 'function' ? status(compact) : status}\n {view && onViewChange && (\n <HeaderIconButton\n label={\n view === 'speaker'\n ? 'Gallery view (everyone equal)'\n : 'Speaker view (who talks, large)'\n }\n onClick={() => onViewChange(view === 'speaker' ? 'gallery' : 'speaker')}\n testId=\"call-view-toggle\"\n >\n {view === 'speaker' ? (\n <LayoutGrid className=\"size-4\" />\n ) : (\n <UserRound className=\"size-4\" />\n )}\n </HeaderIconButton>\n )}\n {onMinimise && (\n <HeaderIconButton\n label={minimiseLabel}\n onClick={onMinimise}\n testId=\"call-dock-toggle\"\n >\n <PictureInPicture2 className=\"size-4\" />\n </HeaderIconButton>\n )}\n </>\n )}\n />\n </div>\n )\n}\n\n/**\n * \"Speaking: Ada, Bo\" — who is talking right now, in words (the tile rings say it in colour and\n * motion). Polite live region, so a screen reader hears changes without being flooded.\n */\nexport function SpeakingNow({\n names,\n idleText = 'No one is speaking',\n className,\n}: {\n /** Who is talking (person pills, or plain names). */\n names: ReactNode[]\n idleText?: string\n className?: string\n}): ReactElement {\n const talking = names.length > 0\n return (\n <p\n className={cn(\n 'flex min-w-0 items-center gap-1.5 text-sm',\n talking ? 'text-foreground' : 'text-muted-foreground',\n className\n )}\n aria-live=\"polite\"\n data-testid=\"call-speaking-now\"\n >\n <AudioLines\n className={cn(\n 'size-4 shrink-0',\n talking ? 'text-theme-cyan motion-safe:animate-pulse' : 'text-muted-foreground'\n )}\n aria-hidden\n />\n {talking ? (\n <span className=\"flex min-w-0 items-center gap-1 overflow-hidden\">\n <span className=\"shrink-0 text-muted-foreground\">Speaking:</span>\n {names.map((n, i) => (\n <span key={i} className=\"flex min-w-0 shrink-0 items-center\">\n {n}\n </span>\n ))}\n </span>\n ) : (\n <span className=\"min-w-0 truncate\">{idleText}</span>\n )}\n </p>\n )\n}\n\n/**\n * A short-lived line under the header (\"Transcription on — started by Ada\"): the notice gets its\n * own line, so it never takes the title's room; the header keeps only the short chip.\n */\nexport function CallNotice({ children }: { children: ReactNode }): ReactElement {\n return (\n <p\n className=\"flex min-w-0 items-center gap-1.5 text-sm text-red-text motion-safe:animate-in motion-safe:fade-in-0\"\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"call-notice\"\n >\n <span className=\"size-2 shrink-0 rounded-full bg-red-solid\" aria-hidden />\n <span className=\"min-w-0 truncate\">{children}</span>\n </p>\n )\n}\n\n/**\n * The panel frame: header, a slim line under it (\"Speaking: …\", notices), the video stage, the\n * participant list under the video, and the control bar. `stageHeight` sizes the video to its\n * tiles (they keep 16:9 at the top) so the rest of the panel goes to the list rather than to blank\n * space; without it, or with a `compact` list, the stage takes the room.\n */\nexport function CallStageFrame({\n header,\n subheader,\n stage,\n stageRef,\n stageOverlay,\n people,\n stageHeight,\n controls,\n className,\n}: {\n header: ReactNode\n /** A slim line under the header (\"Speaking: …\"). */\n subheader?: ReactNode\n stage: ReactNode\n stageRef?: React.Ref<HTMLDivElement>\n /** Floating over the tiles' top-left corner (lobby requests, connection state). */\n stageOverlay?: ReactNode\n /** The participant list, under the video. */\n people?: ReactNode\n /** The video's natural height for a stage `width` wide and at most `maxHeight` tall. */\n stageHeight?(width: number, maxHeight: number): number\n controls: ReactNode\n className?: string\n}): ReactElement {\n const [bodyRef, body] = useElementSize<HTMLDivElement>()\n // Padding of the stage box (px-3 + pb-3).\n const PAD_X = 24\n const PAD_B = 12\n const sized =\n !!people && !!stageHeight && body.width > 0 && body.height > 0\n ? Math.ceil(stageHeight(body.width - PAD_X, Math.round(body.height * 0.62)) + PAD_B)\n : null\n return (\n <div className={cn('flex size-full min-h-0 flex-col bg-background text-foreground', className)}>\n {header}\n {subheader && (\n <div className=\"flex min-h-9 shrink-0 flex-col justify-center gap-0.5 px-3 py-1\">\n {subheader}\n </div>\n )}\n <div ref={bodyRef} className=\"relative flex min-h-0 flex-1 flex-col\">\n <div\n className={cn('flex min-h-0 flex-col px-3 pb-3', sized == null ? 'flex-1' : 'shrink-0')}\n style={sized == null ? undefined : { height: sized }}\n >\n <div ref={stageRef} className=\"relative min-h-0 flex-1\" data-testid=\"call-stage\">\n {stage}\n {stageOverlay}\n </div>\n </div>\n {people}\n </div>\n {controls}\n </div>\n )\n}\n","/**\n * A side panel inside the call (chat, participants): the same header as the app's docked panels\n * (FloatingPanel: title in the brand colour, hairline below, a ghost close button), on the normal\n * background, beside the tiles rather than over them.\n *\n * With `tabs` the one panel carries several views (People | Q&A | Audience in a webinar): the tabs\n * take the title's place in the header, and `children` is the active tab's content.\n */\n\nimport type { ReactElement, ReactNode } from 'react'\nimport { X } from 'lucide-react'\nimport { Button, cn, Tabs, TabsContent, TabsList, TabsTrigger } from '@arbidocs/react/ui'\n\nexport interface CallSidePanelTab {\n id: string\n label: string\n /** A count after the label (questions, people); hidden when undefined. */\n count?: number\n testId?: string\n}\n\nexport function CallSidePanel({\n title,\n icon,\n actions,\n onClose,\n closeLabel,\n closeTestId,\n tabs,\n activeTab,\n onTabChange,\n children,\n className,\n ...rest\n}: {\n /** The panel's name (its accessible name; shown when there are no tabs). */\n title: string\n icon?: ReactNode\n /** Extra header actions, left of the close button. */\n actions?: ReactNode\n onClose(): void\n closeLabel: string\n closeTestId?: string\n /** Views of the panel, shown as tabs in the header instead of the title. */\n tabs?: CallSidePanelTab[]\n activeTab?: string\n onTabChange?(id: string): void\n children: ReactNode\n className?: string\n} & React.HTMLAttributes<HTMLElement>): ReactElement {\n const tabbed = !!tabs?.length\n const current = activeTab ?? tabs?.[0]?.id\n const header = (\n <div className=\"flex h-12 shrink-0 items-center gap-2 border-b border-border pl-3 pr-1.5\">\n {tabbed ? (\n <TabsList className=\"h-8 min-w-0 flex-1 justify-start overflow-x-auto bg-transparent p-0\">\n {tabs.map((t) => (\n <TabsTrigger\n key={t.id}\n value={t.id}\n className=\"h-8 gap-1.5 px-2.5 data-[state=active]:bg-muted data-[state=active]:text-primary data-[state=active]:shadow-none\"\n data-testid={t.testId}\n >\n {t.label}\n {t.count !== undefined && (\n <span className=\"text-xs tabular-nums text-muted-foreground\">{t.count}</span>\n )}\n </TabsTrigger>\n ))}\n </TabsList>\n ) : (\n <span className=\"flex min-w-0 flex-1 items-center gap-2 text-base font-semibold text-primary\">\n {icon}\n <span className=\"truncate\">{title}</span>\n </span>\n )}\n {actions}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 text-muted-foreground hover:text-foreground\"\n aria-label={closeLabel}\n title={closeLabel}\n onClick={onClose}\n data-testid={closeTestId}\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n )\n return (\n <aside\n className={cn('flex min-h-0 flex-col bg-background text-foreground', className)}\n aria-label={title}\n {...rest}\n >\n {tabbed ? (\n <Tabs\n value={current}\n onValueChange={(id) => onTabChange?.(id)}\n className=\"flex min-h-0 flex-1 flex-col\"\n >\n {header}\n {current && (\n <TabsContent value={current} className=\"mt-0 flex min-h-0 flex-1 flex-col\">\n {children}\n </TabsContent>\n )}\n </Tabs>\n ) : (\n <>\n {header}\n {children}\n </>\n )}\n </aside>\n )\n}\n","/**\n * The call panel's participant list and the lobby requests. Presentational: the app supplies the people\n * and the actions. (Chat happens in the call's conversation, beside the panel.)\n */\n\nimport { useState, type ReactElement, type ReactNode } from 'react'\nimport { MicOff, MoreHorizontal, UserX, Video, VideoOff } from 'lucide-react'\nimport {\n Button,\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { initialsOf } from './layout'\n\nexport interface CallPerson {\n id: string\n name: string\n isLocal: boolean\n micMuted?: boolean\n /** Publishing an unmuted camera (the host may turn it off). */\n cameraOn?: boolean\n /** Talking now, and how loud (0..1): the live speaker list. */\n speaking?: boolean\n level?: number\n /** Extra state after the name (e.g. \"Presenting\"). */\n note?: ReactNode\n /** The person as the app shows people (a pill); else initials and `name`. */\n entity?: ReactNode\n}\n\n/** A small live voice meter: five bars lit by level; \"muted\" when the mic is off. */\nexport function VoiceMeter({\n level,\n muted = false,\n className,\n}: {\n level: number\n muted?: boolean\n className?: string\n}): ReactElement {\n if (muted) {\n return (\n <span className={cn('flex items-center text-red-text', className)} title=\"Microphone off\">\n <MicOff className=\"size-4\" aria-label=\"Microphone off\" />\n </span>\n )\n }\n const lit = Math.round(Math.min(1, Math.max(0, level)) * 5)\n return (\n <span\n className={cn('flex h-4 items-end gap-0.5', className)}\n role=\"meter\"\n aria-label=\"Voice level\"\n aria-valuemin={0}\n aria-valuemax={5}\n aria-valuenow={lit}\n >\n {[0.35, 0.55, 0.75, 0.9, 1].map((h, i) => (\n <span\n key={i}\n className={cn('w-1 rounded-sm', i < lit ? 'bg-theme-cyan' : 'bg-muted-foreground/30')}\n style={{ height: `${h * 100}%` }}\n />\n ))}\n </span>\n )\n}\n\n/**\n * A person's name as the call shows people: the app's pill (`entity`, which says \"(me)\" itself),\n * else initials and the name, with `youLabel` after my own. Every list of people in the call\n * (participants, lobby, webinar audience, Q&A askers) names them through this one piece.\n */\nexport function CallPersonLabel({\n name,\n entity,\n isLocal = false,\n youLabel = '(me)',\n}: {\n name: string\n entity?: ReactNode\n isLocal?: boolean\n youLabel?: string\n}): ReactElement {\n if (entity) return <>{entity}</>\n return (\n <>\n <span\n className=\"flex size-7 shrink-0 items-center justify-center rounded-full bg-primary/10 text-xs font-semibold text-primary\"\n aria-hidden\n >\n {initialsOf(name)}\n </span>\n <span className=\"min-w-0 truncate\">\n {name}\n {isLocal && <span className=\"text-muted-foreground\"> {youLabel}</span>}\n </span>\n </>\n )\n}\n\n/** One participant row: pill, live voice meter, mic / camera state, and the host's \"…\" actions. */\nfunction PersonRow({\n p,\n canRemove,\n removingId,\n onRemove,\n onAskToMute,\n onMute,\n}: {\n p: CallPerson\n canRemove: boolean\n removingId?: string | null\n onRemove(person: CallPerson): void\n onAskToMute?(person: CallPerson): void\n onMute?(person: CallPerson, track: 'audio' | 'video'): void\n}): ReactElement {\n const hasActions =\n !p.isLocal && (canRemove || ((onAskToMute || onMute) && !p.micMuted) || (onMute && p.cameraOn))\n return (\n <li\n className=\"flex h-10 items-center gap-2 rounded-md px-2 hover:bg-muted\"\n data-testid={`call-person-${p.id}`}\n data-speaking={p.speaking || undefined}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5 text-sm\">\n {p.entity ? (\n // The ring hugs the person's pill, not the whole row.\n <span\n className={cn(\n 'inline-flex min-w-0 rounded-full',\n p.speaking && 'ring-2 ring-theme-cyan ring-offset-2 ring-offset-background'\n )}\n >\n {p.entity}\n </span>\n ) : (\n <CallPersonLabel name={p.name} isLocal={p.isLocal} />\n )}\n {p.speaking && <span className=\"sr-only\"> — speaking</span>}\n {p.note && <span className=\"text-xs text-muted-foreground\">{p.note}</span>}\n </span>\n <VoiceMeter level={p.level ?? 0} muted={p.micMuted} />\n <span\n className={cn(\n 'flex w-4 justify-center',\n p.cameraOn ? 'text-muted-foreground' : 'text-red-text'\n )}\n title={p.cameraOn ? 'Camera on' : 'Camera off'}\n >\n {p.cameraOn ? (\n <Video className=\"size-4\" aria-label=\"Camera on\" />\n ) : (\n <VideoOff className=\"size-4\" aria-label=\"Camera off\" />\n )}\n </span>\n {hasActions ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 text-muted-foreground hover:text-foreground\"\n aria-label={`Actions for ${p.name}`}\n data-testid={`call-person-menu-${p.id}`}\n >\n <MoreHorizontal className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n {onAskToMute && !p.micMuted && (\n <DropdownMenuItem\n onSelect={() => onAskToMute(p)}\n data-testid={`call-ask-mute-${p.id}`}\n >\n <MicOff aria-hidden />\n Ask to mute\n </DropdownMenuItem>\n )}\n {onMute && !p.micMuted && (\n <DropdownMenuItem\n onSelect={() => onMute(p, 'audio')}\n data-testid={`call-mute-${p.id}`}\n >\n <MicOff aria-hidden />\n Mute\n </DropdownMenuItem>\n )}\n {onMute && p.cameraOn && (\n <DropdownMenuItem\n onSelect={() => onMute(p, 'video')}\n data-testid={`call-camera-off-${p.id}`}\n >\n <VideoOff aria-hidden />\n Turn off camera\n </DropdownMenuItem>\n )}\n {canRemove && (\n <DropdownMenuItem\n onSelect={() => onRemove(p)}\n disabled={removingId === p.id}\n className=\"text-destructive focus:text-destructive\"\n data-testid={`call-remove-${p.id}`}\n >\n <UserX aria-hidden />\n Remove from call\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : (\n // Keeps every row's meter and icons in the same column.\n <span className=\"size-8 shrink-0\" aria-hidden />\n )}\n </li>\n )\n}\n\n/**\n * Who is in the call, always on show under the video in the call panel: a live speaker list (the\n * app orders it, talkers first), each row with the person's pill, voice meter, mic and camera\n * state, and — for the host — mute / ask to mute / remove in its \"…\". Scrolls when long. In a\n * short panel (`compact`) it folds to one strip — who is talking, and \"Show all (N)\".\n */\nexport function CallParticipants({\n people,\n canRemove,\n removingId,\n onRemove,\n onAskToMute,\n onMute,\n compact = false,\n className,\n}: {\n people: CallPerson[]\n canRemove: boolean\n removingId?: string | null\n onRemove(person: CallPerson): void\n /** Shown for others whose mic is on (the host). */\n onAskToMute?(person: CallPerson): void\n /** The host's force-mute of a mic (`audio`, shown while it is on) or a camera (`video`, while on). */\n onMute?(person: CallPerson, track: 'audio' | 'video'): void\n compact?: boolean\n className?: string\n}): ReactElement {\n const [expanded, setExpanded] = useState(false)\n const rows = (\n <ul className=\"min-h-0 flex-1 overflow-y-auto px-1 pb-2\" data-testid=\"call-people-list\">\n {people.map((p) => (\n <PersonRow\n key={p.id}\n p={p}\n canRemove={canRemove}\n removingId={removingId}\n onRemove={onRemove}\n onAskToMute={onAskToMute}\n onMute={onMute}\n />\n ))}\n </ul>\n )\n const heading = (\n <span className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n People ({people.length})\n </span>\n )\n if (compact && !expanded) {\n const talking = people.filter((p) => p.speaking)\n return (\n <section\n className={cn(\n 'flex h-11 shrink-0 items-center gap-2 border-t border-border px-3',\n className\n )}\n aria-label=\"People\"\n data-testid=\"call-people\"\n data-compact=\"\"\n >\n {heading}\n <span className=\"flex min-w-0 flex-1 items-center gap-1 overflow-hidden\">\n {talking.map((p) => (\n <span key={p.id} className=\"flex shrink-0 items-center\">\n {p.entity ?? p.name}\n </span>\n ))}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 shrink-0\"\n aria-expanded={false}\n onClick={() => setExpanded(true)}\n data-testid=\"call-people-show-all\"\n >\n Show all ({people.length})\n </Button>\n </section>\n )\n }\n return (\n <section\n className={cn(\n 'flex min-h-0 flex-col border-t border-border',\n compact && 'absolute inset-x-0 bottom-0 z-20 max-h-[80%] bg-background shadow-lg',\n className\n )}\n aria-label=\"People\"\n data-testid=\"call-people\"\n >\n <div className=\"flex h-9 shrink-0 items-center justify-between px-3\">\n {heading}\n {compact && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7\"\n aria-expanded\n onClick={() => setExpanded(false)}\n data-testid=\"call-people-show-less\"\n >\n Show less\n </Button>\n )}\n </div>\n {rows}\n </section>\n )\n}\n\nexport interface LobbyRequest {\n id: string\n name: string\n /** The person as the app shows people (a pill); else `name`. */\n entity?: ReactNode\n}\n\n/** People asking to join, as cards over the stage's top-left corner. */\nexport function LobbyRequests({\n requests,\n onDecide,\n}: {\n requests: LobbyRequest[]\n onDecide(id: string, admit: boolean): void\n}): ReactElement | null {\n if (!requests.length) return null\n return (\n <div\n className=\"absolute left-3 top-3 z-10 flex w-72 max-w-[calc(100%-1.5rem)] flex-col gap-2\"\n role=\"region\"\n aria-label=\"Lobby\"\n data-testid=\"call-lobby\"\n >\n {requests.map((k) => (\n <div\n key={k.id}\n className=\"flex items-center gap-3 rounded-md border border-border bg-popover p-3 text-sm text-popover-foreground shadow-lg\"\n data-testid=\"call-lobby-knock\"\n >\n <span className=\"flex min-w-0 flex-1 flex-wrap items-center gap-1\">\n {k.entity ?? <span className=\"font-medium\">{k.name}</span>}\n <span>wants to join.</span>\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8\"\n onClick={() => onDecide(k.id, false)}\n data-testid=\"call-lobby-deny\"\n >\n Deny\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-8\"\n onClick={() => onDecide(k.id, true)}\n data-testid=\"call-lobby-admit\"\n >\n Admit\n </Button>\n </div>\n ))}\n </div>\n )\n}\n","/**\n * The call's small cards: the minimised call (picture-in-picture, so the user keeps working),\n * the incoming-call card, and the waiting / connecting states. Same surfaces as the app's popovers.\n */\n\nimport { useRef, type ReactElement, type ReactNode } from 'react'\nimport {\n Bell,\n BellOff,\n Loader2,\n Maximize2,\n Mic,\n MicOff,\n Phone,\n PhoneOff,\n Video,\n VideoOff,\n} from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { CallControlButton } from './ControlButton'\nimport { useShortcutKeys } from './hooks'\n\n/**\n * The minimised call: the current speaker (their tile, with its voice ring), \"Speaking: …\", the\n * status chips, and my microphone and camera, back to the call, leave.\n */\nexport function MinimisedCall({\n title,\n video,\n status,\n speaking,\n micEnabled,\n onToggleMic,\n cameraEnabled,\n onToggleCamera,\n onRestore,\n onLeave,\n restoreLabel = 'Back to the call',\n shortcuts = true,\n className,\n}: {\n title: string\n /** M / V work on the card too. */\n shortcuts?: boolean\n /** The current speaker's tile; omitted (before the call connects), a phone placeholder. */\n video?: ReactNode\n status?: ReactNode\n /** \"Speaking: …\" (a `SpeakingNow`), shown instead of the title while someone talks. */\n speaking?: ReactNode\n /** Omit (with the toggle) before the call connects. */\n micEnabled?: boolean\n onToggleMic?(): void\n cameraEnabled?: boolean\n onToggleCamera?(): void\n onRestore(): void\n onLeave(): void\n restoreLabel?: string\n className?: string\n}): ReactElement {\n const ref = useRef<HTMLDivElement>(null)\n useShortcutKeys(ref, shortcuts)\n return (\n <div ref={ref} className={cn('flex flex-col', className)} data-testid=\"call-minimised\">\n <button\n type=\"button\"\n className=\"group relative aspect-video w-full overflow-hidden rounded-t-md bg-hero focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\"\n onClick={onRestore}\n aria-label={restoreLabel}\n data-testid=\"call-minimised-restore\"\n >\n <span className=\"call-tile-box absolute inset-0\">\n {video ?? (\n <span className=\"call-tile\">\n <span className=\"call-tile-placeholder\">\n <span className=\"call-tile-avatar call-tile-avatar-sm\">\n <Phone className=\"size-4\" aria-hidden />\n </span>\n </span>\n </span>\n )}\n </span>\n </button>\n <div className=\"flex flex-col gap-2 px-3 py-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\" title={title}>\n {title}\n </span>\n {status && <span className=\"flex shrink-0 items-center gap-1\">{status}</span>}\n </div>\n {speaking}\n <div className=\"flex items-center gap-2\">\n {onToggleMic && micEnabled !== undefined && (\n <CallControlButton\n label={micEnabled ? 'Turn off microphone' : 'Turn on microphone'}\n shortcut=\"M\"\n tone={micEnabled ? 'neutral' : 'off'}\n aria-pressed={micEnabled}\n onClick={onToggleMic}\n className=\"size-8\"\n data-testid=\"call-minimised-mic\"\n data-call-shortcut=\"m\"\n >\n {micEnabled ? <Mic aria-hidden /> : <MicOff aria-hidden />}\n </CallControlButton>\n )}\n {onToggleCamera && cameraEnabled !== undefined && (\n <CallControlButton\n label={cameraEnabled ? 'Turn off camera' : 'Turn on camera'}\n shortcut=\"V\"\n tone={cameraEnabled ? 'neutral' : 'off'}\n aria-pressed={cameraEnabled}\n onClick={onToggleCamera}\n className=\"size-8\"\n data-testid=\"call-minimised-camera\"\n data-call-shortcut=\"v\"\n >\n {cameraEnabled ? <Video aria-hidden /> : <VideoOff aria-hidden />}\n </CallControlButton>\n )}\n <span className=\"flex-1\" />\n <CallControlButton\n label={restoreLabel}\n onClick={onRestore}\n className=\"size-8\"\n data-testid=\"call-dock-expand\"\n >\n <Maximize2 aria-hidden />\n </CallControlButton>\n <CallControlButton\n label=\"Leave call\"\n tone=\"danger\"\n onClick={onLeave}\n className=\"size-8\"\n data-testid=\"call-dock-leave\"\n >\n <PhoneOff aria-hidden />\n </CallControlButton>\n </div>\n </div>\n </div>\n )\n}\n\n/** A ring: who calls, in what context, accept / decline, and the ringtone switch. */\nexport function IncomingCallCard({\n callerName,\n caller,\n context,\n busy = false,\n muted,\n onMutedChange,\n onAccept,\n onDecline,\n className,\n}: {\n callerName: string\n /** The caller as the app shows people (a pill); else `callerName`. */\n caller?: ReactNode\n /** \"is calling you\", \"invites you to a group call\", … */\n context: string\n busy?: boolean\n muted: boolean\n onMutedChange(muted: boolean): void\n onAccept(): void\n onDecline(): void\n className?: string\n}): ReactElement {\n return (\n <div\n role=\"alertdialog\"\n aria-labelledby=\"incoming-call-title\"\n aria-describedby=\"incoming-call-desc\"\n data-testid=\"incoming-call-dialog\"\n className={cn(\n 'w-80 max-w-[calc(100vw-2rem)] rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-xl motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-top-2',\n className\n )}\n >\n <div className=\"flex items-start gap-3\">\n <span className=\"relative flex size-10 shrink-0\" aria-hidden>\n <span className=\"absolute inset-0 rounded-full bg-primary/20 motion-safe:animate-ping\" />\n <span className=\"relative flex size-10 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <Phone className=\"size-5\" />\n </span>\n </span>\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <div id=\"incoming-call-title\" className=\"flex min-w-0 text-sm font-semibold\">\n {caller ?? <span className=\"truncate\">{callerName}</span>}\n {caller && <span className=\"sr-only\">{callerName}</span>}\n </div>\n <p id=\"incoming-call-desc\" className=\"text-xs text-muted-foreground\">\n {context}\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"-mr-1 -mt-1 size-8 shrink-0 text-muted-foreground hover:text-foreground\"\n aria-pressed={muted}\n aria-label={muted ? 'Unmute ringtone' : 'Mute ringtone'}\n title={muted ? 'Unmute ringtone' : 'Mute ringtone'}\n onClick={() => onMutedChange(!muted)}\n data-testid=\"incoming-call-mute\"\n >\n {muted ? <BellOff className=\"size-4\" /> : <Bell className=\"size-4\" />}\n </Button>\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-2\">\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={onDecline}\n disabled={busy}\n data-testid=\"incoming-call-decline\"\n >\n <PhoneOff className=\"size-4\" aria-hidden />\n Decline\n </Button>\n <Button\n type=\"button\"\n onClick={onAccept}\n disabled={busy}\n data-testid=\"incoming-call-accept\"\n autoFocus\n >\n {busy ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Phone className=\"size-4\" aria-hidden />\n )}\n Accept\n </Button>\n </div>\n </div>\n )\n}\n\n/** A centred state on the stage (waiting in the lobby, connecting, a webinar starting soon). */\nexport function CallStateMessage({\n title,\n description,\n spinner = true,\n icon,\n action,\n children,\n testId,\n}: {\n title: string\n description?: string\n spinner?: boolean\n /** Shown instead of the spinner (a calm state that is not loading). */\n icon?: ReactNode\n action?: ReactNode\n /** Extra lines between the description and the action (when, who hosts). */\n children?: ReactNode\n testId?: string\n}): ReactElement {\n return (\n <div\n className=\"flex size-full flex-col items-center justify-center gap-3 p-6 text-center\"\n role=\"status\"\n data-testid={testId}\n >\n {icon ??\n (spinner && <Loader2 className=\"size-6 animate-spin text-muted-foreground\" aria-hidden />)}\n <p className=\"text-base font-semibold\">{title}</p>\n {description && <p className=\"max-w-sm text-sm text-muted-foreground\">{description}</p>}\n {children}\n {action}\n </div>\n )\n}\n\n/** Covers the tiles while (re)connecting. */\nexport function ConnectionOverlay({ label }: { label: string }): ReactElement {\n return (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center rounded-md bg-background/70 text-sm text-muted-foreground\">\n <Loader2 className=\"mr-2 size-4 animate-spin\" aria-hidden />\n {label}\n </div>\n )\n}\n","/** What the pre-join hands the call: microphone / camera on or off, and which devices. */\nimport type { JoinChoices } from '@arbidocs/react'\n\nexport type { JoinChoices }\n\nexport type MediaKind = 'camera' | 'microphone'\n\n/** A readable sentence for a getUserMedia failure (the app may pass a richer one). */\nexport function describeMediaError(err: unknown, kind: MediaKind): string {\n const Kind = kind === 'camera' ? 'Camera' : 'Microphone'\n const name = (err as { name?: string } | null)?.name\n if (name === 'NotAllowedError' || name === 'SecurityError')\n return `${Kind} access is blocked. Allow it in the browser's site settings and try again.`\n if (name === 'NotFoundError' || name === 'OverconstrainedError') return `No ${kind} was found.`\n if (name === 'NotReadableError') return `${Kind} is in use by another app.`\n return `${Kind} could not start${(err as Error)?.message ? `: ${(err as Error).message}` : '.'}`\n}\n","/**\n * PreJoin — device check before entering a call: camera preview, microphone level meter, camera /\n * microphone pickers and on/off toggles. Used when starting a call, joining a scheduled call or a\n * call link. (Answering a ring skips it and joins straight away, microphone on.)\n *\n * Plain getUserMedia — no media library — so it is cheap to show. The preview tracks are stopped on\n * join / unmount; the call opens its own with the chosen devices. Wide: preview left, choices\n * right; narrow: stacked.\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n type ElementType,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { Loader2, Mic, MicOff, Video, VideoOff } from 'lucide-react'\nimport {\n Button,\n cn,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@arbidocs/react/ui'\nimport { CallControlButton } from './ControlButton'\nimport { describeMediaError, type JoinChoices, type MediaKind } from './join-choices'\n\nexport interface PreJoinProps {\n /** The choices the pre-join opens with (`DEFAULT_JOIN_CHOICES` from `@arbidocs/react`). */\n initialChoices: JoinChoices\n /** The call's name, shown above the choices. */\n title?: string | null\n /** Heading of the choices (default \"Ready to join?\"). */\n heading?: string\n /** The heading's element (default `h2`); a dialog passes its `DialogTitle`. */\n headingAs?: ElementType\n /** Extra fields above the join button (optional). */\n children?: ReactNode\n joinLabel?: string\n /** The cancel button's text (default \"Cancel\"). */\n cancelLabel?: string\n busy?: boolean\n /** Shown under the controls (e.g. a join error). */\n error?: string | null\n onJoin(choices: JoinChoices): void\n onCancel?(): void\n /** Mirror the camera preview (a selfie view, the default; only the <video> flips). */\n mirror?: boolean\n /** Turns a device error into a sentence (defaults to {@link describeMediaError}). */\n describeError?(err: unknown, kind: MediaKind): string\n className?: string\n}\n\ntype Kind = 'audioinput' | 'videoinput'\n\nfunction useDevices(kind: Kind, refreshKey: unknown): MediaDeviceInfo[] {\n const [devices, setDevices] = useState<MediaDeviceInfo[]>([])\n useEffect(() => {\n const md = navigator.mediaDevices\n if (!md?.enumerateDevices) return\n let cancelled = false\n const load = () =>\n md\n .enumerateDevices()\n .then((all) => {\n if (!cancelled) setDevices(all.filter((d) => d.kind === kind && d.deviceId))\n })\n .catch(() => {})\n void load()\n md.addEventListener?.('devicechange', load)\n return () => {\n cancelled = true\n md.removeEventListener?.('devicechange', load)\n }\n }, [kind, refreshKey])\n return devices\n}\n\n/** A live preview track for one device kind while `enabled`; errors are reported, not thrown. */\nfunction usePreviewStream(\n kind: Kind,\n enabled: boolean,\n deviceId: string | undefined,\n describe: (err: unknown, kind: MediaKind) => string\n) {\n const [stream, setStream] = useState<MediaStream | null>(null)\n const [error, setError] = useState<string | null>(null)\n const describeRef = useRef(describe)\n describeRef.current = describe\n useEffect(() => {\n if (!enabled) {\n setStream(null)\n return\n }\n const md = navigator.mediaDevices\n if (!md?.getUserMedia) {\n setError(\n window.isSecureContext\n ? 'This browser cannot access the camera or microphone.'\n : 'Camera and microphone need HTTPS (or localhost).'\n )\n return\n }\n let cancelled = false\n let opened: MediaStream | null = null\n const constraint: MediaTrackConstraints | boolean = deviceId\n ? { deviceId: { exact: deviceId } }\n : true\n md.getUserMedia(kind === 'videoinput' ? { video: constraint } : { audio: constraint })\n .then((s) => {\n opened = s\n if (cancelled) s.getTracks().forEach((t) => t.stop())\n else {\n setError(null)\n setStream(s)\n }\n })\n .catch((err: unknown) => {\n if (!cancelled)\n setError(describeRef.current(err, kind === 'videoinput' ? 'camera' : 'microphone'))\n })\n return () => {\n cancelled = true\n opened?.getTracks().forEach((t) => t.stop())\n setStream(null)\n }\n }, [kind, enabled, deviceId])\n return { stream, error }\n}\n\n/** 0..1 input level from an AnalyserNode, sampled every animation frame. */\nfunction useAudioLevel(stream: MediaStream | null): number {\n const [level, setLevel] = useState(0)\n useEffect(() => {\n if (!stream || typeof AudioContext === 'undefined') {\n setLevel(0)\n return\n }\n let ctx: AudioContext\n try {\n ctx = new AudioContext()\n } catch {\n return\n }\n const analyser = ctx.createAnalyser()\n analyser.fftSize = 512\n ctx.createMediaStreamSource(stream).connect(analyser)\n const buf = new Uint8Array(analyser.fftSize)\n let frame = 0\n const tick = () => {\n analyser.getByteTimeDomainData(buf)\n let peak = 0\n for (const v of buf) peak = Math.max(peak, Math.abs(v - 128))\n setLevel(Math.min(1, peak / 64))\n frame = requestAnimationFrame(tick)\n }\n void ctx.resume().catch(() => {})\n tick()\n return () => {\n cancelAnimationFrame(frame)\n void ctx.close().catch(() => {})\n }\n }, [stream])\n return level\n}\n\nfunction DeviceSelect({\n devices,\n value,\n onChange,\n label,\n icon,\n disabled,\n testId,\n}: {\n devices: MediaDeviceInfo[]\n value: string | undefined\n onChange(id: string): void\n label: string\n icon: ReactNode\n disabled?: boolean\n testId: string\n}): ReactElement {\n const current = value ?? devices[0]?.deviceId\n return (\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n <span className=\"flex items-center gap-1.5 text-xs font-medium text-muted-foreground [&_svg]:size-3.5\">\n {icon}\n {label}\n </span>\n <Select value={current} onValueChange={onChange} disabled={disabled || devices.length < 2}>\n <SelectTrigger aria-label={label} className=\"h-9 min-w-0 text-sm\" data-testid={testId}>\n <SelectValue placeholder={`Default ${label.toLowerCase()}`} />\n </SelectTrigger>\n <SelectContent>\n {devices.map((d, i) => (\n <SelectItem key={d.deviceId} value={d.deviceId}>\n {d.label || `${label} ${i + 1}`}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )\n}\n\nexport function PreJoin({\n title,\n heading = 'Ready to join?',\n headingAs: Heading = 'h2',\n children,\n joinLabel = 'Join',\n cancelLabel = 'Cancel',\n busy = false,\n error,\n onJoin,\n onCancel,\n describeError = describeMediaError,\n mirror = true,\n className,\n initialChoices,\n}: PreJoinProps): ReactElement {\n const [choices, setChoices] = useState<JoinChoices>(initialChoices)\n const video = usePreviewStream(\n 'videoinput',\n choices.videoEnabled,\n choices.videoDeviceId,\n describeError\n )\n const audio = usePreviewStream(\n 'audioinput',\n choices.audioEnabled,\n choices.audioDeviceId,\n describeError\n )\n const level = useAudioLevel(audio.stream)\n // Labels appear only after permission is granted: re-enumerate once a stream opens.\n const cameras = useDevices('videoinput', video.stream)\n const mics = useDevices('audioinput', audio.stream)\n const videoRef = useRef<HTMLVideoElement>(null)\n\n useEffect(() => {\n if (videoRef.current) videoRef.current.srcObject = video.stream\n }, [video.stream])\n\n const set = (patch: Partial<JoinChoices>) => setChoices((c) => ({ ...c, ...patch }))\n const deviceError = video.error ?? audio.error\n\n return (\n <div className={cn('@container flex w-full', className)} data-testid=\"call-prejoin\">\n <div className=\"mx-auto grid w-full max-w-4xl items-center gap-6 @2xl:grid-cols-[3fr_2fr] @2xl:gap-8\">\n <div className=\"flex flex-col gap-3\">\n <div className=\"relative aspect-video w-full overflow-hidden rounded-md bg-hero\">\n {choices.videoEnabled && video.stream ? (\n <video\n ref={videoRef}\n autoPlay\n muted\n playsInline\n className={cn('size-full object-cover', mirror && '-scale-x-100')}\n data-testid=\"call-prejoin-video\"\n />\n ) : (\n <div className=\"flex size-full items-center justify-center text-sm text-white/80\">\n {choices.videoEnabled ? (\n <Loader2 className=\"size-5 animate-spin\" aria-label=\"Starting camera\" />\n ) : (\n 'Camera is off'\n )}\n </div>\n )}\n </div>\n <div className=\"flex items-center justify-center gap-3\">\n <CallControlButton\n label={choices.audioEnabled ? 'Turn off microphone' : 'Turn on microphone'}\n tone={choices.audioEnabled ? 'neutral' : 'off'}\n aria-pressed={choices.audioEnabled}\n onClick={() => set({ audioEnabled: !choices.audioEnabled })}\n data-testid=\"call-prejoin-mic-toggle\"\n >\n {choices.audioEnabled ? <Mic aria-hidden /> : <MicOff aria-hidden />}\n </CallControlButton>\n <CallControlButton\n label={choices.videoEnabled ? 'Turn off camera' : 'Turn on camera'}\n tone={choices.videoEnabled ? 'neutral' : 'off'}\n aria-pressed={choices.videoEnabled}\n onClick={() => set({ videoEnabled: !choices.videoEnabled })}\n data-testid=\"call-prejoin-camera-toggle\"\n >\n {choices.videoEnabled ? <Video aria-hidden /> : <VideoOff aria-hidden />}\n </CallControlButton>\n </div>\n </div>\n\n <div className=\"flex min-w-0 flex-col gap-4\">\n <div className=\"flex flex-col gap-1\">\n <Heading className=\"text-xl font-semibold\">{heading}</Heading>\n {title && <p className=\"truncate text-sm text-muted-foreground\">{title}</p>}\n </div>\n\n <div className=\"flex flex-col gap-3\">\n <DeviceSelect\n devices={mics}\n value={choices.audioDeviceId}\n onChange={(id) => set({ audioDeviceId: id })}\n label=\"Microphone\"\n icon={<Mic />}\n disabled={!choices.audioEnabled}\n testId=\"call-prejoin-mic-select\"\n />\n <div\n className=\"h-1.5 w-full overflow-hidden rounded-full bg-muted\"\n role=\"meter\"\n aria-label=\"Microphone level\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(level * 100)}\n data-testid=\"call-prejoin-mic-level\"\n >\n <div\n className=\"h-full bg-primary transition-[width] duration-75 motion-reduce:transition-none\"\n style={{ width: `${Math.round(level * 100)}%` }}\n />\n </div>\n <DeviceSelect\n devices={cameras}\n value={choices.videoDeviceId}\n onChange={(id) => set({ videoDeviceId: id })}\n label=\"Camera\"\n icon={<Video />}\n disabled={!choices.videoEnabled}\n testId=\"call-prejoin-camera-select\"\n />\n </div>\n\n {children}\n\n {(error || deviceError) && (\n <p role=\"alert\" className=\"text-sm text-destructive\" data-testid=\"call-prejoin-error\">\n {error ?? deviceError}\n </p>\n )}\n\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n className=\"flex-1\"\n disabled={busy}\n onClick={() => onJoin(choices)}\n data-testid=\"call-prejoin-join\"\n >\n {busy && <Loader2 className=\"size-4 animate-spin\" aria-hidden />}\n {joinLabel}\n </Button>\n {onCancel && (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onCancel}\n disabled={busy}\n data-testid=\"call-prejoin-cancel\"\n >\n {cancelLabel}\n </Button>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n","/**\n * The attendee's holding screen: \"Starting soon\" before the host goes live (the app keeps polling\n * and joins on its own), and \"This webinar has ended\" after. A `CallStateMessage`, so it reads like\n * every other state of the call stage.\n */\n\nimport type { ReactElement, ReactNode } from 'react'\nimport { CalendarCheck } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { CallStateMessage } from '../cards'\n\nexport interface WebinarWaitingProps {\n variant: 'waiting' | 'ended'\n /** The webinar's name. */\n title?: string | null\n /** When it is scheduled, already formatted by the app (\"Today, 15:00\"). */\n when?: string | null\n /** The host as the app shows people (a pill): \"Hosted by …\". */\n host?: ReactNode\n /** A way out (back to the app); omitted, no button. */\n onLeave?(): void\n leaveLabel?: string\n}\n\nexport function WebinarWaiting({\n variant,\n title,\n when,\n host,\n onLeave,\n leaveLabel = 'Leave',\n}: WebinarWaitingProps): ReactElement {\n const waiting = variant === 'waiting'\n return (\n <CallStateMessage\n title={waiting ? 'Starting soon' : 'This webinar has ended'}\n description={\n waiting\n ? \"The host hasn't gone live yet. You'll join automatically when the webinar starts.\"\n : 'Thanks for attending.'\n }\n spinner={waiting}\n icon={\n waiting ? undefined : <CalendarCheck className=\"size-6 text-muted-foreground\" aria-hidden />\n }\n testId={waiting ? 'webinar-waiting' : 'webinar-ended'}\n action={\n onLeave && (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onLeave}\n data-testid=\"webinar-waiting-leave\"\n >\n {leaveLabel}\n </Button>\n )\n }\n >\n {(title || when || host) && (\n <div className=\"flex max-w-sm flex-col items-center gap-1 text-sm\">\n {title && (\n <p className=\"font-medium\" data-testid=\"webinar-waiting-title\">\n {title}\n </p>\n )}\n {when && (\n <p className=\"text-muted-foreground\" data-testid=\"webinar-waiting-when\">\n {when}\n </p>\n )}\n {host && (\n <p\n className=\"flex flex-wrap items-center justify-center gap-1 text-muted-foreground\"\n data-testid=\"webinar-waiting-host\"\n >\n <span>Hosted by</span>\n {host}\n </p>\n )}\n </div>\n )}\n </CallStateMessage>\n )\n}\n","/** Small hooks of the webinar blocks. */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { MaybePromise } from './types'\n\n/**\n * Pending state for handlers that may return a promise: `run(key, fn)` marks `key` busy until the\n * promise settles and resolves to whether it succeeded (a rejection is the app's to report; the\n * block only stops spinning).\n */\nexport function usePending(): {\n isPending(key: string): boolean\n run(key: string, fn: () => MaybePromise): Promise<boolean>\n} {\n const [keys, setKeys] = useState<ReadonlySet<string>>(() => new Set())\n const mounted = useRef(true)\n useEffect(() => {\n mounted.current = true\n return () => {\n mounted.current = false\n }\n }, [])\n const set = useCallback((key: string, on: boolean) => {\n if (!mounted.current) return\n setKeys((prev) => {\n if (prev.has(key) === on) return prev\n const next = new Set(prev)\n if (on) next.add(key)\n else next.delete(key)\n return next\n })\n }, [])\n const run = useCallback(\n async (key: string, fn: () => MaybePromise) => {\n let result: MaybePromise\n try {\n result = fn()\n } catch {\n return false\n }\n if (!result || typeof (result as Promise<unknown>).then !== 'function') return true\n set(key, true)\n try {\n await result\n return true\n } catch {\n return false\n } finally {\n set(key, false)\n }\n },\n [set]\n )\n const isPending = useCallback((key: string) => keys.has(key), [keys])\n return { isPending, run }\n}\n\n/** The current time, refreshed every `ms` (relative times like \"2 minutes ago\"). */\nexport function useNow(ms = 30_000, fixed?: Date): Date {\n const [now, setNow] = useState(() => new Date())\n const ticking = !fixed\n useEffect(() => {\n if (!ticking) return\n const id = setInterval(() => setNow(new Date()), ms)\n return () => clearInterval(id)\n }, [ms, ticking])\n return fixed ?? now\n}\n","/**\n * Backstage → live → ended, for the team. While backstage, `BackstageBanner` (under the header)\n * says so and carries Go live for the moderators; once live, the header shows `WebinarLiveChip` and\n * the control bar `WebinarLiveControl` (End webinar, confirmed). Each action appears once: Go live\n * only in the banner, End only in the bar.\n */\n\nimport { useState, type ReactElement } from 'react'\nimport { EyeOff, Loader2, Radio, SquareX } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { ConfirmDialog } from '../../provider/dialogs'\nimport { CallStatusChip } from '../ControlButton'\nimport { usePending } from './hooks'\nimport type { MaybePromise } from './types'\n\n/** \"Live\" in the header while the stage is open to the audience. */\nexport function WebinarLiveChip({\n compact = false,\n className,\n}: {\n compact?: boolean\n className?: string\n}): ReactElement {\n return (\n <CallStatusChip\n tone=\"red\"\n icon={<Radio className=\"size-3.5 shrink-0\" aria-hidden />}\n label=\"Live\"\n compact={compact}\n title=\"Live: attendees see and hear the stage\"\n role=\"status\"\n className={className}\n testId=\"webinar-live-chip\"\n />\n )\n}\n\nexport interface WebinarLiveControlProps {\n /** The stage is open to the audience. */\n live: boolean\n /** Moderators only: opens the stage (shown while backstage). */\n onGoLive?(): MaybePromise\n /** Moderators only: ends the webinar for everyone, after a confirmation (shown while live). */\n onEnd?(): MaybePromise\n /** Icon only (a narrow bar). */\n compact?: boolean\n className?: string\n}\n\n/** Go live (backstage) or End webinar (live); nothing for someone who may do neither. */\nexport function WebinarLiveControl({\n live,\n onGoLive,\n onEnd,\n compact = false,\n className,\n}: WebinarLiveControlProps): ReactElement | null {\n const { isPending, run } = usePending()\n const [confirming, setConfirming] = useState(false)\n if (!live) {\n if (!onGoLive) return null\n const busy = isPending('live')\n return (\n <Button\n type=\"button\"\n size={compact ? 'icon' : 'sm'}\n className={cn('h-8 shrink-0', !compact && 'px-3', className)}\n disabled={busy}\n aria-label=\"Go live\"\n title=\"Go live: let attendees see and hear the stage\"\n onClick={() => void run('live', onGoLive)}\n data-testid=\"webinar-go-live\"\n >\n {busy ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Radio className=\"size-4\" aria-hidden />\n )}\n {!compact && 'Go live'}\n </Button>\n )\n }\n if (!onEnd) return null\n return (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n size={compact ? 'icon' : 'default'}\n className={cn(\n 'shrink-0 border-red-border text-red-text hover:bg-red-bg hover:text-red-text',\n !compact && 'px-4',\n className\n )}\n aria-label=\"End webinar\"\n title=\"End webinar for everyone\"\n onClick={() => setConfirming(true)}\n data-testid=\"webinar-end\"\n >\n <SquareX className=\"size-4\" aria-hidden />\n {!compact && 'End webinar'}\n </Button>\n <WebinarEndConfirm open={confirming} onOpenChange={setConfirming} onEnd={onEnd} />\n </>\n )\n}\n\n/**\n * \"End the webinar?\" — the one confirmation before ending it for everyone, wherever End is offered\n * (`WebinarLiveControl`, or the Leave button's menu in the app's call bar).\n */\nexport function WebinarEndConfirm({\n open,\n onOpenChange,\n onEnd,\n}: {\n open: boolean\n onOpenChange(open: boolean): void\n onEnd(): MaybePromise\n}): ReactElement {\n const { isPending, run } = usePending()\n const ending = isPending('end')\n return (\n <ConfirmDialog\n isOpen={open}\n onClose={() => onOpenChange(false)}\n onConfirm={() =>\n void run('end', onEnd).then((ok) => {\n if (ok) onOpenChange(false)\n })\n }\n title=\"End the webinar?\"\n description=\"Everyone leaves, attendees and panelists alike. The stage closes and cannot be reopened in this session.\"\n confirmText=\"End webinar\"\n isLoading={ending}\n testId=\"webinar-end-confirm\"\n testIds={{ cancel: 'webinar-end-cancel', confirm: 'webinar-end-confirm-button' }}\n />\n )\n}\n\n/**\n * Under the header while backstage: the team knows the audience cannot see or hear them yet.\n * Moderators get Go live here (`onGoLive`); other panelists read that the host will start it.\n */\nexport function BackstageBanner({\n onGoLive,\n className,\n}: {\n onGoLive?(): MaybePromise\n className?: string\n}): ReactElement {\n return (\n <div\n className={cn(\n 'flex min-h-10 min-w-0 items-center gap-2 rounded-md border border-yellow-border bg-yellow-bg py-1 pl-3 pr-1 text-sm text-yellow-text',\n className\n )}\n role=\"status\"\n data-testid=\"webinar-backstage\"\n >\n <EyeOff className=\"size-4 shrink-0\" aria-hidden />\n <span className=\"min-w-0 flex-1\">\n <span className=\"font-medium\">Backstage</span>\n {\" — attendees can't see or hear you yet\"}\n {!onGoLive && <span className=\"text-yellow-text/80\">. The host goes live when ready.</span>}\n </span>\n {onGoLive && <WebinarLiveControl live={false} onGoLive={onGoLive} />}\n </div>\n )\n}\n","/** Raise / lower my hand: one control-bar button, on (solid) while the hand is up. */\n\nimport type { ReactElement } from 'react'\nimport { Hand } from 'lucide-react'\nimport { CallControlButton } from '../ControlButton'\nimport { usePending } from './hooks'\nimport type { MaybePromise } from './types'\n\nexport interface RaiseHandButtonProps {\n raised: boolean\n /** Asked with the new state (`true` = raise). */\n onToggle(raised: boolean): MaybePromise\n /** Busy from outside (the app's own request in flight). */\n pending?: boolean\n /** Press-shortcut inside a `CallControlBar` (default H). */\n shortcut?: string\n className?: string\n}\n\nexport function RaiseHandButton({\n raised,\n onToggle,\n pending = false,\n shortcut = 'H',\n className,\n}: RaiseHandButtonProps): ReactElement {\n const { isPending, run } = usePending()\n const busy = pending || isPending('hand')\n return (\n <CallControlButton\n label={raised ? 'Lower hand' : 'Raise hand'}\n shortcut={shortcut}\n tone={raised ? 'active' : 'neutral'}\n aria-pressed={raised}\n disabled={busy}\n aria-busy={busy || undefined}\n onClick={() => void run('hand', () => onToggle(!raised))}\n className={className}\n data-testid=\"webinar-raise-hand\"\n data-raised={raised}\n data-call-shortcut={shortcut.toLowerCase()}\n >\n <Hand aria-hidden />\n </CallControlButton>\n )\n}\n","/**\n * The moderators' audience view, the body of a `CallSidePanel` (its Audience tab): the raised\n * hands, oldest first, each with Promote; then everyone in the room with their stage state, Promote\n * or Move to audience. Only moderators get this; an attendee's UI never lists attendees.\n */\n\nimport { useMemo, useState, type ReactElement, type ReactNode } from 'react'\nimport { Hand, Loader2, Search } from 'lucide-react'\nimport { Button, cn, Input } from '@arbidocs/react/ui'\nimport { formatRelativeTime } from '@arbidocs/react/ui'\nimport { CallPersonLabel } from '../panels'\nimport { useNow, usePending } from './hooks'\nimport type { MaybePromise, WebinarAttendee, WebinarHand, WebinarRole } from './types'\n\nconst ROLE_NOTE: Record<WebinarRole, string | null> = {\n host: 'Host',\n cohost: 'Co-host',\n panelist: 'Panelist',\n attendee: null,\n}\n\nexport interface WebinarAudiencePanelProps {\n /** Raised hands (any order: shown oldest first). */\n hands: WebinarHand[]\n /** Everyone in the room, team included (the app's order). */\n attendees: WebinarAttendee[]\n /** Bring someone on stage. */\n onPromote(id: string): MaybePromise\n /** Send someone on stage back to the audience (never offered for the host). */\n onDemote(id: string): MaybePromise\n /** A search field appears above the attendees when there are more than this many (default 8). */\n searchThreshold?: number\n /** \"Now\" for the raised times (tests); live by default. */\n now?: Date\n className?: string\n}\n\nfunction SectionTitle({ children }: { children: ReactNode }): ReactElement {\n return (\n <h3 className=\"flex items-center gap-1.5 px-2 pb-1 pt-3 text-xs font-medium text-muted-foreground\">\n {children}\n </h3>\n )\n}\n\nfunction Row({ testId, children }: { testId: string; children: ReactNode }): ReactElement {\n return (\n <li\n className=\"flex min-h-11 items-center gap-3 rounded-md px-2 py-1 hover:bg-muted\"\n data-testid={testId}\n >\n {children}\n </li>\n )\n}\n\nexport function WebinarAudiencePanel({\n hands,\n attendees,\n onPromote,\n onDemote,\n searchThreshold = 8,\n now: fixedNow,\n className,\n}: WebinarAudiencePanelProps): ReactElement {\n const now = useNow(30_000, fixedNow)\n const { isPending, run } = usePending()\n const [query, setQuery] = useState('')\n const queue = useMemo(\n () => [...hands].sort((a, b) => Date.parse(a.raisedAt) - Date.parse(b.raisedAt)),\n [hands]\n )\n const searchable = attendees.length > searchThreshold\n const q = searchable ? query.trim().toLowerCase() : ''\n const shown = q ? attendees.filter((a) => a.name.toLowerCase().includes(q)) : attendees\n\n // One request per person: the hand queue's Promote and the list's share the pending state.\n const action = (id: string, name: string, promote: boolean, where: 'hand' | 'list') => {\n const key = `${promote ? 'promote' : 'demote'}:${id}`\n const busy = isPending(key)\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 shrink-0\"\n disabled={busy}\n aria-label={promote ? `Promote ${name} to the stage` : `Move ${name} to the audience`}\n onClick={() => void run(key, () => (promote ? onPromote(id) : onDemote(id)))}\n data-testid={`webinar-${where === 'hand' ? 'hand-' : ''}${promote ? 'promote' : 'demote'}-${id}`}\n >\n {busy && <Loader2 className=\"size-4 animate-spin\" aria-hidden />}\n {promote ? 'Promote' : 'Move to audience'}\n </Button>\n )\n }\n\n return (\n <div\n className={cn('min-h-0 flex-1 overflow-y-auto px-2 pb-2', className)}\n data-testid=\"webinar-audience\"\n >\n <section aria-label=\"Raised hands\">\n <SectionTitle>\n <Hand className=\"size-3.5\" aria-hidden />\n Raised hands ({queue.length})\n </SectionTitle>\n {queue.length === 0 ? (\n <p className=\"px-2 py-2 text-sm text-muted-foreground\" data-testid=\"webinar-hands-empty\">\n No hands raised.\n </p>\n ) : (\n <ol>\n {queue.map((h) => (\n <Row key={h.id} testId={`webinar-hand-${h.id}`}>\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"flex min-w-0 items-center gap-1.5 text-sm\">\n <CallPersonLabel name={h.name} entity={h.entity} />\n </span>\n <span className=\"text-xs text-muted-foreground\">\n Raised {formatRelativeTime(h.raisedAt, { now: now.getTime() })}\n </span>\n </span>\n {action(h.id, h.name, true, 'hand')}\n </Row>\n ))}\n </ol>\n )}\n </section>\n\n <section aria-label=\"Attendees\">\n <SectionTitle>Attendees ({attendees.length})</SectionTitle>\n {searchable && (\n <div className=\"relative px-2 pb-1\">\n <Search\n className=\"pointer-events-none absolute left-4.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\"\n aria-hidden\n />\n <Input\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Find someone\"\n aria-label=\"Find an attendee\"\n className=\"h-8 pl-8 text-sm\"\n data-testid=\"webinar-attendee-search\"\n />\n </div>\n )}\n {shown.length === 0 ? (\n <p\n className=\"px-2 py-2 text-sm text-muted-foreground\"\n data-testid=\"webinar-attendees-empty\"\n >\n {q ? `No one matches “${query.trim()}”.` : 'No attendees yet.'}\n </p>\n ) : (\n <ul>\n {shown.map((a) => {\n const note = ROLE_NOTE[a.role]\n return (\n <Row key={a.id} testId={`webinar-attendee-${a.id}`}>\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5 text-sm\">\n <CallPersonLabel name={a.name} entity={a.entity} />\n {(note || a.onStage) && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {[note, a.onStage ? 'On stage' : null].filter(Boolean).join(' · ')}\n </span>\n )}\n </span>\n {a.handRaised && (\n <Hand\n className=\"size-4 shrink-0 text-primary\"\n aria-label=\"Hand raised\"\n data-testid={`webinar-attendee-hand-${a.id}`}\n />\n )}\n {/* A raised hand's Promote is in the queue above: here only its hand shows. */}\n {a.onStage\n ? a.role !== 'host' && action(a.id, a.name, false, 'list')\n : !a.handRaised && action(a.id, a.name, true, 'list')}\n </Row>\n )\n })}\n </ul>\n )}\n </section>\n </div>\n )\n}\n","/**\n * The webinar's Q&A, the body of a `CallSidePanel` (the attendee viewer's side, the team's Q&A tab):\n * Open / Answered (and, for the team, Dismissed) questions, most upvoted first; an upvote toggle on\n * each (never on my own); status chips (\"Answering live\", \"Answered\") and a text answer under the\n * question. The team answers live, answers in text (an inline composer), marks answered,\n * dismisses or reopens. The ask box sits at the bottom, like a chat composer.\n *\n * Askers are named through the app's pill (`asker`); another attendee's question is \"Attendee\"\n * (the server hides who asked it), so attendees never learn who else attends.\n */\n\nimport { useMemo, useState, type KeyboardEvent, type ReactElement, type ReactNode } from 'react'\nimport {\n CheckCheck,\n ChevronUp,\n Loader2,\n MessageSquareText,\n MoreHorizontal,\n Radio,\n RotateCcw,\n Send,\n Trash2,\n X,\n} from 'lucide-react'\nimport {\n Button,\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Textarea,\n} from '@arbidocs/react/ui'\nimport { formatRelativeTime } from '@arbidocs/react/ui'\nimport { CallStatusChip } from '../ControlButton'\nimport { CallPersonLabel } from '../panels'\nimport { useNow, usePending } from './hooks'\nimport type { MaybePromise, QuestionStatus, WebinarQuestion } from './types'\n\nexport type QAFilter = 'open' | 'answered' | 'dismissed'\n\nexport interface QAPanelProps {\n questions: WebinarQuestion[]\n /** A team member (host, co-host, panelist): moderates, and sees dismissed questions. */\n team?: boolean\n /** The ask box's limit (default 500 characters). */\n maxLength?: number\n /** Hide the ask box (e.g. before the webinar is live). */\n canAsk?: boolean\n /** Resolve to clear the box; reject to keep the text (the app reports the error). */\n onAsk(body: string): MaybePromise\n /** `up` = add my vote, else take it back. */\n onVote(question: WebinarQuestion, up: boolean): MaybePromise\n /** Team: Answer live (`answering`), Mark answered, Dismiss, Reopen (`open`). */\n onStatusChange?(question: WebinarQuestion, status: QuestionStatus): MaybePromise\n /** Team: a text answer (the server marks the question answered). */\n onAnswer?(question: WebinarQuestion, answer: string): MaybePromise\n /** Delete one of my own questions while it is still open. */\n onDelete?(question: WebinarQuestion): MaybePromise\n /** The filter to start on (default Open). */\n defaultFilter?: QAFilter\n /** \"Now\" for the asked times (tests); live by default. */\n now?: Date\n className?: string\n}\n\nconst DEFAULT_MAX = 500\n\n/** Questions of a filter, in reading order: live first, then most upvoted, then oldest. */\nexport function sortQuestions(questions: WebinarQuestion[], filter: QAFilter): WebinarQuestion[] {\n const match = (s: QuestionStatus) =>\n filter === 'open' ? s === 'open' || s === 'answering' : s === filter\n return questions\n .filter((q) => match(q.status))\n .sort(\n (a, b) =>\n Number(b.status === 'answering') - Number(a.status === 'answering') ||\n b.voteCount - a.voteCount ||\n Date.parse(a.createdAt) - Date.parse(b.createdAt)\n )\n}\n\n/**\n * A text box with a counter and a send button; Enter sends, Shift+Enter breaks the line. The ask\n * box and the text answer here, and the webinar's live chat in the same side panel.\n */\nexport function PanelComposer({\n placeholder,\n ariaLabel,\n sendLabel,\n maxLength,\n busy,\n onSend,\n onCancel,\n autoFocus,\n testId,\n}: {\n placeholder: string\n ariaLabel: string\n sendLabel: string\n maxLength: number\n busy: boolean\n /** Resolves to whether it went (then the box clears). */\n onSend(text: string): Promise<boolean>\n onCancel?(): void\n autoFocus?: boolean\n testId: string\n}): ReactElement {\n const [text, setText] = useState('')\n const body = text.trim()\n const canSend = !!body && body.length <= maxLength && !busy\n const send = () => {\n if (!canSend) return\n void onSend(body).then((ok) => {\n if (ok) setText('')\n })\n }\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault()\n send()\n } else if (e.key === 'Escape' && onCancel) {\n e.preventDefault()\n onCancel()\n }\n }\n return (\n <div className=\"flex flex-col gap-1.5\" data-testid={testId}>\n <Textarea\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n aria-label={ariaLabel}\n maxLength={maxLength}\n rows={2}\n disabled={busy}\n autoFocus={autoFocus}\n className=\"min-h-[60px] resize-none\"\n data-testid={`${testId}-input`}\n />\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'flex-1 text-xs tabular-nums text-muted-foreground',\n text.length >= maxLength && 'text-red-text'\n )}\n aria-live=\"polite\"\n data-testid={`${testId}-count`}\n >\n {text.length}/{maxLength}\n </span>\n {onCancel && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8\"\n onClick={onCancel}\n disabled={busy}\n data-testid={`${testId}-cancel`}\n >\n Cancel\n </Button>\n )}\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-8\"\n onClick={send}\n disabled={!canSend}\n data-testid={`${testId}-send`}\n >\n {busy ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Send className=\"size-4\" aria-hidden />\n )}\n {sendLabel}\n </Button>\n </div>\n </div>\n )\n}\n\ninterface TeamAction {\n key: string\n label: string\n icon: ReactNode\n run(): MaybePromise\n destructive?: boolean\n}\n\nfunction QuestionItem({\n q,\n team,\n now,\n maxLength,\n pending,\n run,\n onVote,\n onStatusChange,\n onAnswer,\n onDelete,\n}: {\n q: WebinarQuestion\n team: boolean\n now: Date\n maxLength: number\n pending(key: string): boolean\n run(key: string, fn: () => MaybePromise): Promise<boolean>\n onVote: QAPanelProps['onVote']\n onStatusChange?: QAPanelProps['onStatusChange']\n onAnswer?: QAPanelProps['onAnswer']\n onDelete?: QAPanelProps['onDelete']\n}): ReactElement {\n const [answering, setAnswering] = useState(false)\n const voteKey = `vote:${q.id}`\n const statusKey = `status:${q.id}`\n const answerKey = `answer:${q.id}`\n const busy = pending(statusKey) || pending(answerKey) || pending(`delete:${q.id}`)\n\n const setStatus = (status: QuestionStatus) => () =>\n onStatusChange ? onStatusChange(q, status) : undefined\n const can = team && !!onStatusChange\n // The one prominent next step of the question's state; the rest sit in its menu.\n const primary: TeamAction | null = !can\n ? null\n : q.status === 'open'\n ? { key: 'live', label: 'Answer live', icon: <Radio />, run: setStatus('answering') }\n : q.status === 'answering'\n ? {\n key: 'answered',\n label: 'Mark answered',\n icon: <CheckCheck />,\n run: setStatus('answered'),\n }\n : { key: 'reopen', label: 'Reopen', icon: <RotateCcw />, run: setStatus('open') }\n const more: TeamAction[] = [\n ...(can && q.status === 'open'\n ? [\n {\n key: 'answered',\n label: 'Mark answered',\n icon: <CheckCheck />,\n run: setStatus('answered'),\n },\n ]\n : []),\n ...(can && q.status === 'answering'\n ? [{ key: 'reopen', label: 'Reopen', icon: <RotateCcw />, run: setStatus('open') }]\n : []),\n ...(can && q.status !== 'dismissed'\n ? [{ key: 'dismiss', label: 'Dismiss', icon: <X />, run: setStatus('dismissed') }]\n : []),\n ...(q.mine && q.status === 'open' && onDelete\n ? [\n {\n key: 'delete',\n label: 'Delete question',\n icon: <Trash2 />,\n run: () => onDelete(q),\n destructive: true,\n },\n ]\n : []),\n ]\n const canAnswerInText = team && !!onAnswer && !q.answer && q.status !== 'dismissed'\n\n return (\n <li\n className=\"flex gap-2 rounded-md border border-border p-2\"\n data-testid={`webinar-question-${q.id}`}\n data-status={q.status}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n className={cn(\n 'h-auto w-10 shrink-0 flex-col gap-0 self-start px-0 py-1 text-xs tabular-nums',\n q.voted ? 'bg-primary/10 text-primary hover:bg-primary/15' : 'text-muted-foreground'\n )}\n aria-pressed={q.voted}\n aria-label={\n q.mine\n ? `${q.voteCount} upvotes (your question)`\n : q.voted\n ? `Remove upvote (${q.voteCount})`\n : `Upvote (${q.voteCount})`\n }\n title={q.mine ? \"You can't upvote your own question\" : undefined}\n disabled={q.mine || pending(voteKey)}\n onClick={() => void run(voteKey, () => onVote(q, !q.voted))}\n data-testid={`webinar-question-vote-${q.id}`}\n >\n <ChevronUp className=\"size-4\" aria-hidden />\n <span data-testid={`webinar-question-votes-${q.id}`}>{q.voteCount}</span>\n </Button>\n\n <div className=\"flex min-w-0 flex-1 flex-col gap-1.5\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted-foreground\">\n <span\n className=\"flex min-w-0 items-center gap-1.5 text-sm text-foreground\"\n data-testid={`webinar-question-asker-${q.id}`}\n >\n {q.askerName === null && !q.asker ? (\n <span className=\"text-muted-foreground\">Attendee</span>\n ) : (\n <CallPersonLabel name={q.askerName ?? ''} entity={q.asker} isLocal={q.mine} />\n )}\n </span>\n <time dateTime={q.createdAt}>\n {formatRelativeTime(q.createdAt, { now: now.getTime() })}\n </time>\n {q.status === 'answering' && (\n <CallStatusChip\n tone=\"red\"\n icon={<Radio className=\"size-3.5 shrink-0\" aria-hidden />}\n label=\"Answering live\"\n testId={`webinar-question-live-${q.id}`}\n />\n )}\n {q.status === 'answered' && (\n <CallStatusChip\n tone=\"green\"\n icon={<CheckCheck className=\"size-3.5 shrink-0\" aria-hidden />}\n label=\"Answered\"\n testId={`webinar-question-answered-${q.id}`}\n />\n )}\n {q.status === 'dismissed' && <CallStatusChip tone=\"neutral\" label=\"Dismissed\" />}\n </div>\n\n <p\n className=\"whitespace-pre-wrap break-words text-sm\"\n data-testid={`webinar-question-body-${q.id}`}\n >\n {q.body}\n </p>\n\n {q.answer && (\n <div\n className=\"flex flex-col gap-1 rounded-md bg-muted px-2.5 py-2 text-sm\"\n data-testid={`webinar-question-answer-${q.id}`}\n >\n <span className=\"flex min-w-0 items-center gap-1.5 text-xs font-medium text-muted-foreground\">\n Answer\n {q.answeredBy}\n </span>\n <p className=\"whitespace-pre-wrap break-words\">{q.answer}</p>\n </div>\n )}\n\n {answering && onAnswer && (\n <PanelComposer\n placeholder=\"Write an answer\"\n ariaLabel=\"Answer in text\"\n sendLabel=\"Send answer\"\n maxLength={maxLength}\n busy={pending(answerKey)}\n autoFocus\n onSend={(text) =>\n run(answerKey, () => onAnswer(q, text)).then((ok) => {\n if (ok) setAnswering(false)\n return ok\n })\n }\n onCancel={() => setAnswering(false)}\n testId={`webinar-answer-${q.id}`}\n />\n )}\n\n {(primary || canAnswerInText || more.length > 0) && !answering && (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {primary && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 gap-1.5 px-2 text-xs [&_svg]:size-3.5\"\n disabled={busy}\n onClick={() => void run(statusKey, primary.run)}\n data-testid={`webinar-question-${primary.key}-${q.id}`}\n >\n {pending(statusKey) ? (\n <Loader2 className=\"animate-spin\" aria-hidden />\n ) : (\n primary.icon\n )}\n {primary.label}\n </Button>\n )}\n {canAnswerInText && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 gap-1.5 px-2 text-xs [&_svg]:size-3.5\"\n disabled={busy}\n onClick={() => setAnswering(true)}\n data-testid={`webinar-question-answer-text-${q.id}`}\n >\n <MessageSquareText aria-hidden />\n Answer in text\n </Button>\n )}\n {more.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"ml-auto size-7 text-muted-foreground hover:text-foreground\"\n aria-label=\"More question actions\"\n disabled={busy}\n data-testid={`webinar-question-menu-${q.id}`}\n >\n <MoreHorizontal className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n {more.map((a) => (\n <DropdownMenuItem\n key={a.key}\n onSelect={() =>\n void run(a.key === 'delete' ? `delete:${q.id}` : statusKey, a.run)\n }\n className={cn(a.destructive && 'text-destructive focus:text-destructive')}\n data-testid={`webinar-question-${a.key}-${q.id}`}\n >\n {a.icon}\n {a.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n )}\n </div>\n </li>\n )\n}\n\nconst EMPTY: Record<QAFilter, { team: string; audience: string }> = {\n open: {\n team: 'Questions from the audience appear here.',\n audience: 'No questions yet. Ask the first one.',\n },\n answered: { team: 'No answered questions yet.', audience: 'No answered questions yet.' },\n dismissed: { team: 'Nothing dismissed.', audience: 'Nothing dismissed.' },\n}\n\nexport function QAPanel({\n questions,\n team = false,\n maxLength = DEFAULT_MAX,\n canAsk = true,\n onAsk,\n onVote,\n onStatusChange,\n onAnswer,\n onDelete,\n defaultFilter = 'open',\n now: fixedNow,\n className,\n}: QAPanelProps): ReactElement {\n const now = useNow(30_000, fixedNow)\n const { isPending, run } = usePending()\n const [filter, setFilter] = useState<QAFilter>(\n defaultFilter === 'dismissed' && !team ? 'open' : defaultFilter\n )\n const filters: { id: QAFilter; label: string }[] = [\n { id: 'open', label: 'Open' },\n { id: 'answered', label: 'Answered' },\n ...(team ? [{ id: 'dismissed' as const, label: 'Dismissed' }] : []),\n ]\n const lists = useMemo(\n () => ({\n open: sortQuestions(questions, 'open'),\n answered: sortQuestions(questions, 'answered'),\n // Dismissed questions are the team's business only.\n dismissed: team ? sortQuestions(questions, 'dismissed') : [],\n }),\n [questions, team]\n )\n const shown = lists[filter]\n\n return (\n <div className={cn('flex min-h-0 flex-1 flex-col', className)} data-testid=\"webinar-qa\">\n <Tabs\n value={filter}\n onValueChange={(v) => setFilter(v as QAFilter)}\n className=\"flex min-h-0 flex-1 flex-col\"\n >\n <div className=\"shrink-0 px-3 pt-3\">\n <TabsList className=\"h-8 w-full\">\n {filters.map((f) => (\n <TabsTrigger\n key={f.id}\n value={f.id}\n className=\"h-6 flex-1 gap-1.5 px-2 text-xs\"\n data-testid={`webinar-qa-filter-${f.id}`}\n >\n {f.label}\n <span className=\"tabular-nums text-muted-foreground\">{lists[f.id].length}</span>\n </TabsTrigger>\n ))}\n </TabsList>\n </div>\n <TabsContent value={filter} className=\"mt-0 min-h-0 flex-1 overflow-y-auto p-3\">\n {shown.length === 0 ? (\n <p\n className=\"py-6 text-center text-sm text-muted-foreground\"\n data-testid=\"webinar-qa-empty\"\n >\n {filter === 'open' && questions.length > 0\n ? 'No open questions right now.'\n : EMPTY[filter][team ? 'team' : 'audience']}\n </p>\n ) : (\n <ol className=\"flex flex-col gap-2\">\n {shown.map((q) => (\n <QuestionItem\n key={q.id}\n q={q}\n team={team}\n now={now}\n maxLength={maxLength}\n pending={isPending}\n run={run}\n onVote={onVote}\n onStatusChange={onStatusChange}\n onAnswer={onAnswer}\n onDelete={onDelete}\n />\n ))}\n </ol>\n )}\n </TabsContent>\n </Tabs>\n {canAsk && (\n <div className=\"shrink-0 border-t border-border p-3\">\n <PanelComposer\n placeholder=\"Ask a question\"\n ariaLabel=\"Ask a question\"\n sendLabel=\"Ask\"\n maxLength={maxLength}\n busy={isPending('ask')}\n onSend={(text) => run('ask', () => onAsk(text))}\n testId=\"webinar-ask\"\n />\n </div>\n )}\n </div>\n )\n}\n","/**\n * \"Who can chat: Panelists only | Everyone\" — the moderators' setting, as a group of the call's\n * More menu (`chatPermissionSection` for `MoreMenu`'s `groups`), so it lives with the other call\n * settings rather than as a control of its own.\n */\n\nimport { useState, type ReactElement } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport {\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n} from '@arbidocs/react/ui'\nimport type { MoreMenuSection } from '../ControlBar'\nimport type { MaybePromise, WebinarChatPermission } from './types'\n\nexport interface ChatPermissionSettingProps {\n value: WebinarChatPermission\n onChange(value: WebinarChatPermission): MaybePromise\n /** The app's change in flight (the menu may have closed and reopened since). */\n pending?: boolean\n}\n\nconst OPTIONS: { value: WebinarChatPermission; label: string }[] = [\n { value: 'panelists', label: 'Panelists only' },\n { value: 'everyone', label: 'Everyone' },\n]\n\n/** Menu content: a label and two radio items. Render it inside a `DropdownMenuContent`. */\nexport function ChatPermissionSetting({\n value,\n onChange,\n pending = false,\n}: ChatPermissionSettingProps): ReactElement {\n // Show the choice at once while the app applies it (the menu usually closes on select).\n const [choosing, setChoosing] = useState<WebinarChatPermission | null>(null)\n const busy = pending || choosing !== null\n const select = (next: string) => {\n const v = next as WebinarChatPermission\n if (v === value || busy) return\n const result = onChange(v)\n if (result && typeof result.then === 'function') {\n setChoosing(v)\n void result.then(\n () => setChoosing(null),\n () => setChoosing(null)\n )\n }\n }\n return (\n <div role=\"group\" aria-label=\"Who can chat\" data-testid=\"webinar-chat-permission\">\n <DropdownMenuLabel className=\"flex items-center gap-1.5 text-xs font-medium text-muted-foreground\">\n Who can chat\n {busy && <Loader2 className=\"size-3.5 animate-spin\" aria-label=\"Saving\" />}\n </DropdownMenuLabel>\n <DropdownMenuRadioGroup value={choosing ?? value} onValueChange={select}>\n {OPTIONS.map((o) => (\n <DropdownMenuRadioItem\n key={o.value}\n value={o.value}\n disabled={busy}\n data-testid={`webinar-chat-${o.value}`}\n >\n {o.label}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </div>\n )\n}\n\n/** The setting as a `MoreMenu` group: `groups={[…, chatPermissionSection(props)]}`. */\nexport function chatPermissionSection(props: ChatPermissionSettingProps): MoreMenuSection {\n return { key: 'webinar-chat', content: <ChatPermissionSetting {...props} /> }\n}\n","/**\n * \"You're on stage\": a moderator promoted me, so before my microphone and camera go out I check\n * them — the call's own `PreJoin` (preview, level meter, device pickers) in a dialog (a bottom\n * sheet on a phone). Only the camera video is mirrored in the self-view; no text ever is.\n */\n\nimport type { ReactElement } from 'react'\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from '@arbidocs/react/ui'\nimport { PreJoin } from '../PreJoin'\nimport { describeMediaError, type JoinChoices, type MediaKind } from '../join-choices'\nimport { usePending } from './hooks'\nimport type { MaybePromise } from './types'\n\nexport interface OnStageCheckProps {\n open: boolean\n /** The devices the check opens with (`DEFAULT_JOIN_CHOICES` from `@arbidocs/react`). */\n initialChoices: JoinChoices\n /** Go on stage with these devices. */\n onJoinStage(choices: JoinChoices): MaybePromise\n /** Decline: step back down (also on Escape / close). */\n onStayInAudience(): MaybePromise\n /** Busy from outside (the app's request in flight). */\n busy?: boolean\n /** A failure to show above the buttons. */\n error?: string | null\n /** Mirror my camera preview (default true; only the <video> flips). */\n mirror?: boolean\n describeError?(err: unknown, kind: MediaKind): string\n}\n\nexport function OnStageCheck({\n open,\n initialChoices,\n onJoinStage,\n onStayInAudience,\n busy = false,\n error,\n mirror = true,\n describeError = describeMediaError,\n}: OnStageCheckProps): ReactElement {\n const { isPending, run } = usePending()\n const working = busy || isPending('join') || isPending('stay')\n const stay = () => {\n if (!working) void run('stay', onStayInAudience)\n }\n return (\n <Dialog open={open} onOpenChange={(next) => !next && stay()}>\n <DialogContent presentation=\"sheet\" className=\"max-w-3xl\" data-testid=\"webinar-on-stage\">\n {/* PreJoin's own heading and note are the dialog's title and description. */}\n <PreJoin\n initialChoices={initialChoices}\n heading=\"You're on stage\"\n headingAs={DialogTitle}\n joinLabel=\"Join stage\"\n cancelLabel=\"Stay in audience\"\n busy={working}\n error={error}\n mirror={mirror}\n describeError={describeError}\n onJoin={(choices) => void run('join', () => onJoinStage(choices))}\n onCancel={stay}\n >\n <DialogDescription>\n A host invited you to speak. Check your microphone and camera: once you join, everyone\n sees and hears you.\n </DialogDescription>\n </PreJoin>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * The attendee's clean viewer: the stage (the app's `CallGrid` / `CallFocus` of the panelists),\n * the live captions under it, a side slot (Q&A in a `CallSidePanel`) docked on a wide screen and\n * over the stage on a narrow one, and a bottom bar with Raise hand, the side toggle and Leave.\n * Audio-first, and no list of other attendees anywhere. (The team keeps the normal call UI.)\n */\n\nimport type { ReactElement, ReactNode, Ref } from 'react'\nimport { MessageCircleQuestion } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { CallControlBar, ControlGroup, LeaveButton } from '../ControlBar'\nimport { CallControlButton, ControlBadge } from '../ControlButton'\nimport { RaiseHandButton, type RaiseHandButtonProps } from './RaiseHandButton'\n\nexport interface WebinarViewerProps {\n /** The header (a `CallHeader` with the title and the live chip). */\n header?: ReactNode\n /** The stage: the visible panelists' tiles. */\n stage: ReactNode\n stageRef?: Ref<HTMLDivElement>\n /** Floating over the stage (connection state). */\n stageOverlay?: ReactNode\n /** Under the stage: a `CaptionsStrip` (or the live transcript). */\n captions?: ReactNode\n /** The side (a `CallSidePanel` with the `QAPanel`); omit while closed. */\n side?: ReactNode\n /** The side's toggle in the bar (Q&A); omit for none. */\n sideToggle?: { open: boolean; onToggle(): void; label: string; count?: number }\n /** My raised hand. */\n hand: RaiseHandButtonProps\n onLeave(): void\n /** The bar's left end (e.g. \"Enable audio\"). */\n left?: ReactNode\n /** More centre controls after Raise hand (e.g. a captions switch). */\n controls?: ReactNode\n /** Single-key shortcuts on (the viewer is on screen). */\n shortcuts?: boolean\n className?: string\n}\n\nexport function WebinarViewer({\n header,\n stage,\n stageRef,\n stageOverlay,\n captions,\n side,\n sideToggle,\n hand,\n onLeave,\n left,\n controls,\n shortcuts = true,\n className,\n}: WebinarViewerProps): ReactElement {\n return (\n <div\n className={cn(\n '@container flex size-full min-h-0 flex-col bg-background text-foreground',\n className\n )}\n data-testid=\"webinar-viewer\"\n >\n {header}\n <div className=\"relative flex min-h-0 flex-1\">\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col gap-2 px-3 pb-3 pt-1\">\n <div ref={stageRef} className=\"relative min-h-0 flex-1\" data-testid=\"call-stage\">\n {stage}\n {stageOverlay}\n </div>\n {captions}\n </div>\n {side && (\n <div\n className=\"absolute inset-0 z-20 flex min-h-0 flex-col border-t border-border motion-safe:animate-in motion-safe:fade-in-0 @3xl:static @3xl:z-auto @3xl:w-80 @3xl:shrink-0 @3xl:border-l @3xl:border-t-0\"\n data-testid=\"webinar-viewer-side\"\n >\n {side}\n </div>\n )}\n </div>\n <CallControlBar shortcuts={shortcuts} left={left} right={<LeaveButton onLeave={onLeave} />}>\n <ControlGroup>\n <RaiseHandButton {...hand} />\n {sideToggle && (\n <CallControlButton\n label={sideToggle.open ? `Close ${sideToggle.label}` : sideToggle.label}\n tone={sideToggle.open ? 'active' : 'neutral'}\n aria-pressed={sideToggle.open}\n onClick={sideToggle.onToggle}\n data-testid=\"webinar-side-toggle\"\n >\n <MessageCircleQuestion aria-hidden />\n {!!sideToggle.count && <ControlBadge count={sideToggle.count} tone=\"quiet\" />}\n </CallControlButton>\n )}\n {controls}\n </ControlGroup>\n </CallControlBar>\n </div>\n )\n}\n","/**\n * Who is talking, fast: each participant's microphone level, measured in this browser from the\n * audio it already plays (WebAudio analysers, ~60 ms), not from the media server's slower\n * active-speaker events. One store for the whole app, so the call panel (rings, spotlight, live\n * speaker list) and the conversation beside it (the transcript line being spoken) agree.\n *\n * The store is plain data; `startVoiceLevels` (used by the call room) feeds it.\n */\n\nimport { useSyncExternalStore } from 'react'\nimport { INITIAL_SPOTLIGHT, SPEAKING_LEVEL, nextSpotlight, type SpotlightState } from './layout'\n\n/** Sampling period. */\nexport const LEVEL_TICK_MS = 60\n/** A voice stays \"speaking\" this long after it drops below the threshold (no flicker between words). */\nconst SPEAKING_RELEASE_MS = 350\n\ninterface Snapshot {\n /** identity → level 0..1, rounded to 0.05. */\n levels: Readonly<Record<string, number>>\n /** Talking now, loudest first. */\n speaking: readonly string[]\n /** The speaker view's spotlight (with hysteresis). */\n spotlight: string | null\n}\n\nconst EMPTY: Snapshot = { levels: {}, speaking: [], spotlight: null }\nlet snapshot: Snapshot = EMPTY\nconst listeners = new Set<() => void>()\n\nfunction publish(next: Snapshot) {\n snapshot = next\n listeners.forEach((fn) => fn())\n}\n\nfunction subscribe(fn: () => void): () => void {\n listeners.add(fn)\n return () => listeners.delete(fn)\n}\n\nconst get = () => snapshot\n\n/** My voice level (0..1, in 0.05 steps) — re-renders only when it changes. */\nexport function useVoiceLevel(identity: string | null | undefined): number {\n return useSyncExternalStore(\n subscribe,\n () => (identity ? (get().levels[identity] ?? 0) : 0),\n () => 0\n )\n}\n\n/** Everyone's level (re-renders at the level rate: for small lists). */\nexport function useVoiceLevels(): Readonly<Record<string, number>> {\n return useSyncExternalStore(\n subscribe,\n () => get().levels,\n () => EMPTY.levels\n )\n}\n\nexport function useIsSpeaking(identity: string | null | undefined): boolean {\n return useSyncExternalStore(\n subscribe,\n () => (identity ? get().speaking.includes(identity) : false),\n () => false\n )\n}\n\n/** Identities talking now, loudest first (a stable string key, split by the caller). */\nexport function useSpeakingIds(): string[] {\n const key = useSyncExternalStore(\n subscribe,\n () => get().speaking.join('\\n'),\n () => ''\n )\n return key ? key.split('\\n') : []\n}\n\nexport function useSpotlightId(): string | null {\n return useSyncExternalStore(\n subscribe,\n () => get().spotlight,\n () => null\n )\n}\n\n/** A track to measure: whose it is, and its audio. */\nexport interface VoiceSource {\n identity: string\n track: MediaStreamTrack | null\n /** Mic muted / off: level 0 without measuring. */\n muted: boolean\n /** Me: measured (my ring, \"Speaking: … (me)\") but never put in the spotlight. */\n local?: boolean\n}\n\ninterface Meter {\n track: MediaStreamTrack\n source: MediaStreamAudioSourceNode\n analyser: AnalyserNode\n buf: Float32Array<ArrayBuffer>\n}\n\n/**\n * Measure the given sources every {@link LEVEL_TICK_MS} until stopped. `sources()` is read each\n * tick, so the caller can hand over a ref to its current track list.\n */\nexport function startVoiceLevels(sources: () => VoiceSource[]): () => void {\n let ctx: AudioContext | null = null\n try {\n ctx = typeof AudioContext !== 'undefined' ? new AudioContext() : null\n } catch {\n ctx = null\n }\n const meters = new Map<string, Meter>()\n const smoothed = new Map<string, number>()\n const loudAt = new Map<string, number>()\n let spot: SpotlightState = INITIAL_SPOTLIGHT\n\n const meterFor = (s: VoiceSource): Meter | null => {\n if (!ctx || !s.track || s.track.readyState === 'ended') return null\n const have = meters.get(s.identity)\n if (have && have.track === s.track) return have\n have?.source.disconnect()\n try {\n const source = ctx.createMediaStreamSource(new MediaStream([s.track]))\n const analyser = ctx.createAnalyser()\n analyser.fftSize = 512\n source.connect(analyser)\n const m = { track: s.track, source, analyser, buf: new Float32Array(analyser.fftSize) }\n meters.set(s.identity, m)\n return m\n } catch {\n return null\n }\n }\n\n const tick = () => {\n if (ctx?.state === 'suspended') void ctx.resume().catch(() => undefined)\n const now = Date.now()\n const list = sources()\n const seen = new Set<string>()\n const levels: Record<string, number> = {}\n for (const s of list) {\n seen.add(s.identity)\n let raw = 0\n const m = s.muted ? null : meterFor(s)\n if (m) {\n m.analyser.getFloatTimeDomainData(m.buf)\n let sum = 0\n for (let i = 0; i < m.buf.length; i++) sum += m.buf[i] * m.buf[i]\n raw = Math.min(1, Math.sqrt(sum / m.buf.length) * 5)\n }\n // Fast attack, gentle release.\n const prev = smoothed.get(s.identity) ?? 0\n const level = raw >= prev ? raw : prev * 0.8 + raw * 0.2\n smoothed.set(s.identity, level)\n if (level >= SPEAKING_LEVEL) loudAt.set(s.identity, now)\n levels[s.identity] = Math.round(level * 20) / 20\n }\n for (const id of [...meters.keys()]) {\n if (!seen.has(id)) {\n meters.get(id)?.source.disconnect()\n meters.delete(id)\n smoothed.delete(id)\n loudAt.delete(id)\n }\n }\n const speaking = list\n .map((s) => s.identity)\n .filter((id) => now - (loudAt.get(id) ?? -Infinity) <= SPEAKING_RELEASE_MS)\n .sort((a, b) => (smoothed.get(b) ?? 0) - (smoothed.get(a) ?? 0))\n spot = nextSpotlight(spot, Object.fromEntries(smoothed), now, {\n exclude: list.filter((s) => s.local).map((s) => s.identity),\n })\n if (spot.id && !seen.has(spot.id)) spot = INITIAL_SPOTLIGHT\n const prev = snapshot\n const same =\n prev.spotlight === spot.id &&\n prev.speaking.join('\\n') === speaking.join('\\n') &&\n Object.keys(levels).length === Object.keys(prev.levels).length &&\n Object.entries(levels).every(([k, v]) => prev.levels[k] === v)\n if (!same) publish({ levels, speaking, spotlight: spot.id })\n }\n\n const id = setInterval(tick, LEVEL_TICK_MS)\n return () => {\n clearInterval(id)\n for (const m of meters.values()) m.source.disconnect()\n meters.clear()\n void ctx?.close().catch(() => undefined)\n publish(EMPTY)\n }\n}\n","/**\n * Incoming-call ringtone, synthesised with WebAudio (no audio asset): a soft\n * two-tone ring (440 Hz + 480 Hz, like a phone line), 1.2 s on / 2.8 s off,\n * repeating until stopped. The mute preference is per browser.\n *\n * Browsers only let audio start after a user gesture on the page; when the\n * AudioContext stays suspended the ring is silent and the visual ringer still\n * shows. Nothing throws.\n */\n\nimport { useCallback, useEffect, useState } from 'react'\n\nexport const RINGTONE_MUTED_KEY = 'arbi-call-ringtone-muted'\nconst RING_ON_S = 1.2\nconst RING_PERIOD_S = 4\nconst GAIN = 0.08\n\ntype AudioContextCtor = typeof AudioContext\n\nfunction audioContextCtor(): AudioContextCtor | null {\n if (typeof window === 'undefined') return null\n return (\n window.AudioContext ??\n (window as unknown as { webkitAudioContext?: AudioContextCtor }).webkitAudioContext ??\n null\n )\n}\n\n/** Start ringing; returns a stop function (idempotent). */\nexport function startRingtone(): () => void {\n const Ctor = audioContextCtor()\n if (!Ctor) return () => {}\n let ctx: AudioContext\n try {\n ctx = new Ctor()\n } catch {\n return () => {}\n }\n const out = ctx.createGain()\n out.gain.value = 0\n out.connect(ctx.destination)\n const oscillators = [440, 480].map((frequency) => {\n const osc = ctx.createOscillator()\n osc.type = 'sine'\n osc.frequency.value = frequency\n osc.connect(out)\n osc.start()\n return osc\n })\n\n let nextRingAt = ctx.currentTime + 0.05\n const schedule = () => {\n // Keep ~2 rings scheduled ahead so a throttled background tab keeps ringing.\n while (nextRingAt < ctx.currentTime + RING_PERIOD_S * 2) {\n out.gain.setValueAtTime(0, nextRingAt)\n out.gain.linearRampToValueAtTime(GAIN, nextRingAt + 0.03)\n out.gain.setValueAtTime(GAIN, nextRingAt + RING_ON_S - 0.03)\n out.gain.linearRampToValueAtTime(0, nextRingAt + RING_ON_S)\n nextRingAt += RING_PERIOD_S\n }\n }\n schedule()\n const timer = setInterval(schedule, 1000)\n void ctx.resume().catch(() => {})\n\n let stopped = false\n return () => {\n if (stopped) return\n stopped = true\n clearInterval(timer)\n for (const osc of oscillators) {\n try {\n osc.stop()\n } catch {\n // already stopped\n }\n }\n void ctx.close().catch(() => {})\n }\n}\n\nfunction readMuted(): boolean {\n try {\n return localStorage.getItem(RINGTONE_MUTED_KEY) === '1'\n } catch {\n return false\n }\n}\n\n/** The per-browser \"mute ringtone\" preference. */\nexport function useRingtoneMuted(): [boolean, (muted: boolean) => void] {\n const [muted, setMutedState] = useState(readMuted)\n const setMuted = useCallback((next: boolean) => {\n setMutedState(next)\n try {\n if (next) localStorage.setItem(RINGTONE_MUTED_KEY, '1')\n else localStorage.removeItem(RINGTONE_MUTED_KEY)\n } catch {\n // private mode: the choice lasts for this page only\n }\n }, [])\n return [muted, setMuted]\n}\n\n/** Ring while `ringing` and not muted; stops on unmount, mute, or when the ring goes away. */\nexport function useRingtone(ringing: boolean, muted: boolean): void {\n useEffect(() => {\n if (!ringing || muted) return\n return startRingtone()\n }, [ringing, muted])\n}\n","/**\n * The host's composite recording (ARBI `docs/meeting-chats-plan.md` §6, \"Audio + video\"): a canvas\n * that mirrors the host's call stage — the same tiles in the same places (grid, or the screen share\n * large with the others in a strip), since it is drawn from the stage's own rendered <video>\n * elements — plus the mixed audio the host hears (WebAudio: every remote audio track and the host's\n * microphone). The stream is recorded by the chunked recorder in the host's browser.\n */\n\n/** Frame rate and size of the composite recording canvas. */\nexport const COMPOSITE_FPS = 15\nexport const COMPOSITE_MAX_WIDTH = 1280\nexport const COMPOSITE_MAX_HEIGHT = 720\n\n/** Fit a `w × h` stage into the canvas, centred, aspect kept. */\nexport function fitStage(\n stage: { width: number; height: number },\n canvas: { width: number; height: number }\n): { scale: number; dx: number; dy: number } {\n if (stage.width <= 0 || stage.height <= 0) return { scale: 0, dx: 0, dy: 0 }\n const scale = Math.min(canvas.width / stage.width, canvas.height / stage.height)\n return {\n scale,\n dx: (canvas.width - stage.width * scale) / 2,\n dy: (canvas.height - stage.height * scale) / 2,\n }\n}\n\n/** Draw `src` (w × h) into a box, `contain` (letterboxed) or `cover` (cropped). */\nexport function fitMedia(\n src: { width: number; height: number },\n box: { x: number; y: number; width: number; height: number },\n mode: 'contain' | 'cover'\n): {\n sx: number\n sy: number\n sw: number\n sh: number\n dx: number\n dy: number\n dw: number\n dh: number\n} {\n const srcRatio = src.width / src.height\n const boxRatio = box.width / box.height\n if (mode === 'contain') {\n const dw = srcRatio > boxRatio ? box.width : box.height * srcRatio\n const dh = srcRatio > boxRatio ? box.width / srcRatio : box.height\n return {\n sx: 0,\n sy: 0,\n sw: src.width,\n sh: src.height,\n dx: box.x + (box.width - dw) / 2,\n dy: box.y + (box.height - dh) / 2,\n dw,\n dh,\n }\n }\n const sw = srcRatio > boxRatio ? src.height * boxRatio : src.width\n const sh = srcRatio > boxRatio ? src.height : src.width / boxRatio\n return {\n sx: (src.width - sw) / 2,\n sy: (src.height - sh) / 2,\n sw,\n sh,\n dx: box.x,\n dy: box.y,\n dw: box.width,\n dh: box.height,\n }\n}\n\n/** One frame of the stage. */\nexport function drawStageFrame(\n ctx: CanvasRenderingContext2D,\n stage: HTMLElement,\n width: number,\n height: number\n): void {\n ctx.fillStyle = '#111'\n ctx.fillRect(0, 0, width, height)\n const stageRect = stage.getBoundingClientRect()\n const { scale, dx, dy } = fitStage(stageRect, { width, height })\n if (!scale) {\n // The call is minimized: the stage is not rendered (and its video is paused).\n ctx.fillStyle = '#bbb'\n ctx.font = '24px sans-serif'\n ctx.textAlign = 'center'\n ctx.fillText('Video paused', width / 2, height / 2)\n ctx.textAlign = 'start'\n return\n }\n const tiles = Array.from(stage.querySelectorAll<HTMLElement>('.lk-participant-tile'))\n for (const tile of tiles) {\n const r = tile.getBoundingClientRect()\n if (r.width <= 0 || r.height <= 0) continue\n const box = {\n x: dx + (r.left - stageRect.left) * scale,\n y: dy + (r.top - stageRect.top) * scale,\n width: r.width * scale,\n height: r.height * scale,\n }\n ctx.fillStyle = '#222'\n ctx.fillRect(box.x, box.y, box.width, box.height)\n const video = tile.querySelector('video')\n if (video && video.readyState >= 2 && video.videoWidth > 0 && video.videoHeight > 0) {\n const screen = tile.getAttribute('data-lk-source') === 'screen_share'\n const f = fitMedia(\n { width: video.videoWidth, height: video.videoHeight },\n box,\n screen ? 'contain' : 'cover'\n )\n try {\n ctx.drawImage(video, f.sx, f.sy, f.sw, f.sh, f.dx, f.dy, f.dw, f.dh)\n } catch {\n // A frame not ready yet.\n }\n }\n if (tile.getAttribute('data-lk-speaking') === 'true') {\n ctx.strokeStyle = '#4ade80'\n ctx.lineWidth = 3\n ctx.strokeRect(box.x + 1.5, box.y + 1.5, box.width - 3, box.height - 3)\n }\n const name = tile.querySelector('.lk-participant-name')?.textContent?.trim()\n if (name) {\n ctx.font = `${Math.max(11, Math.round(14 * Math.min(1, scale * 1.2)))}px sans-serif`\n const w = ctx.measureText(name).width\n ctx.fillStyle = 'rgba(0,0,0,0.6)'\n ctx.fillRect(box.x + 6, box.y + box.height - 26, w + 12, 20)\n ctx.fillStyle = '#fff'\n ctx.fillText(name, box.x + 12, box.y + box.height - 11)\n }\n }\n}\n\nexport interface CompositeCapture {\n stream: MediaStream\n /** Keep the mixed audio in step with the room's audio tracks. */\n setAudioTracks(tracks: MediaStreamTrack[]): void\n dispose(): void\n}\n\n/** Start drawing the stage into a ≤720p canvas and mixing the given audio. */\nexport function startCompositeCapture(stage: HTMLElement): CompositeCapture {\n const canvas = document.createElement('canvas')\n canvas.width = COMPOSITE_MAX_WIDTH\n canvas.height = COMPOSITE_MAX_HEIGHT\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error('This browser cannot draw the recording')\n const draw = () => drawStageFrame(ctx, stage, canvas.width, canvas.height)\n draw()\n // A timer, not animation frames: frames stop in a background tab, recording must not.\n const timer = setInterval(draw, Math.round(1000 / COMPOSITE_FPS))\n const video = canvas.captureStream(COMPOSITE_FPS)\n\n const audio = new AudioContext()\n const destination = audio.createMediaStreamDestination()\n const sources = new Map<string, MediaStreamAudioSourceNode>()\n\n const stream = new MediaStream([\n ...video.getVideoTracks(),\n ...destination.stream.getAudioTracks(),\n ])\n\n return {\n stream,\n setAudioTracks(tracks) {\n const wanted = new Map(tracks.map((t) => [t.id, t]))\n for (const [id, node] of sources) {\n if (!wanted.has(id)) {\n node.disconnect()\n sources.delete(id)\n }\n }\n for (const [id, track] of wanted) {\n if (sources.has(id) || track.readyState === 'ended') continue\n try {\n const node = audio.createMediaStreamSource(new MediaStream([track]))\n node.connect(destination)\n sources.set(id, node)\n } catch {\n // A track WebAudio cannot read: left out of the mix.\n }\n }\n if (audio.state === 'suspended') void audio.resume().catch(() => undefined)\n },\n dispose() {\n clearInterval(timer)\n for (const node of sources.values()) node.disconnect()\n sources.clear()\n video.getTracks().forEach((t) => t.stop())\n void audio.close().catch(() => undefined)\n },\n }\n}\n","/**\n * The call I am in, as the rest of the app needs it (its conversation's empty state and\n * provisional transcript rows): which call, and whether it is being transcribed. Published by the\n * call room; plain data, no LiveKit.\n */\n\nimport { useSyncExternalStore } from 'react'\n\ninterface CallStatus {\n callExtId: string | null\n transcribing: boolean\n}\n\nlet status: CallStatus = { callExtId: null, transcribing: false }\nconst listeners = new Set<() => void>()\n\nexport function publishCallStatus(next: CallStatus): void {\n if (next.callExtId === status.callExtId && next.transcribing === status.transcribing) return\n status = next\n listeners.forEach((fn) => fn())\n}\n\nfunction subscribe(fn: () => void): () => void {\n listeners.add(fn)\n return () => listeners.delete(fn)\n}\n\n/** Whether I am in this call, and whether it is transcribed. */\nexport function useMyCallStatus(callExtId: string | null | undefined): {\n inCall: boolean\n transcribing: boolean\n} {\n const inCall = useSyncExternalStore(\n subscribe,\n () => !!callExtId && status.callExtId === callExtId,\n () => false\n )\n const transcribing = useSyncExternalStore(\n subscribe,\n () => !!callExtId && status.callExtId === callExtId && status.transcribing,\n () => false\n )\n return { inCall, transcribing }\n}\n","import type { calls } from '@arbidocs/sdk/browser'\n\n/** Shared by the recording UI (kept out of the component files for fast refresh). */\n\n/** How a recording mode is named in the UI. */\nexport const MODE_LABEL: Record<calls.RecordingMode, string> = {\n audio: 'Audio',\n audio_video: 'Audio + video',\n}\n\n/** Expiry choices (days; null = kept). */\nexport const EXPIRY_DAYS = [null, 7, 30, 90] as const\n\n/** `expires_at` for a choice, from now. */\nexport function expiryFor(days: number | null, now = Date.now()): string | null {\n return days ? new Date(now + days * 86_400_000).toISOString() : null\n}\n\n/** Which expiry choice an `expires_at` is closest to (for the select). */\nexport function expiryChoiceOf(expiresAt: string | null, now = Date.now()): string {\n if (!expiresAt) return 'none'\n const days = (Date.parse(expiresAt) - now) / 86_400_000\n const nearest = [7, 30, 90].reduce((best, d) =>\n Math.abs(d - days) < Math.abs(best - days) ? d : best\n )\n return String(nearest)\n}\n","/**\n * \"Mirror my video\": whether my own camera is shown mirrored (a selfie view). On by default, kept\n * per browser like the ringtone switch. Only my own on-screen <video> flips — never labels, and\n * never what others or the recording see.\n */\n\nimport { useSyncExternalStore } from 'react'\n\nexport const MIRROR_SELF_VIEW_KEY = 'arbi-call-mirror-self-view'\n\nconst listeners = new Set<() => void>()\nlet memory: boolean | null = null\n\nfunction read(): boolean {\n if (memory !== null) return memory\n try {\n return localStorage.getItem(MIRROR_SELF_VIEW_KEY) !== 'off'\n } catch {\n return true\n }\n}\n\nexport function setMirrorSelfView(on: boolean): void {\n memory = on\n try {\n if (on) localStorage.removeItem(MIRROR_SELF_VIEW_KEY)\n else localStorage.setItem(MIRROR_SELF_VIEW_KEY, 'off')\n } catch {\n // Private mode: the choice lasts for this page only.\n }\n listeners.forEach((fn) => fn())\n}\n\nfunction subscribe(fn: () => void): () => void {\n listeners.add(fn)\n return () => listeners.delete(fn)\n}\n\n/** [mirrored, set] — shared by every tile, the pre-join and the camera menu. */\nexport function useMirrorSelfView(): [boolean, (on: boolean) => void] {\n const on = useSyncExternalStore(subscribe, read, () => true)\n return [on, setMirrorSelfView]\n}\n","/** Pure helpers for the call cards and call titles (kept apart from the components). */\n\nimport type { calls } from '@arbidocs/sdk/browser'\n\nexport interface CallLogDetail {\n call_ext_id: string\n started_by: string | null\n invited: string[]\n started_at: string | null\n ended_at: string | null\n duration_s: number | null\n joined: string[]\n meeting_conversation_ext_id: string | null\n}\n\nconst ids = (v: unknown): string[] =>\n Array.isArray(v) ? v.filter((x): x is string => typeof x === 'string') : []\nconst str = (v: unknown): string | null => (typeof v === 'string' && v ? v : null)\n\n/** The card's detail from an activity event's `detail`, or null when it is not a call card. */\nexport function parseCallLogDetail(\n detail: Record<string, unknown> | null | undefined\n): CallLogDetail | null {\n const callExtId = str(detail?.call_ext_id)\n if (!detail || !callExtId) return null\n return {\n call_ext_id: callExtId,\n started_by: str(detail.started_by),\n invited: ids(detail.invited),\n started_at: str(detail.started_at),\n ended_at: str(detail.ended_at),\n duration_s: typeof detail.duration_s === 'number' ? detail.duration_s : null,\n joined: ids(detail.joined),\n meeting_conversation_ext_id: str(detail.meeting_conversation_ext_id),\n }\n}\n\n/** \"45 s\", \"12 min\", \"1 h 5 min\". */\nexport function formatCallDuration(seconds: number | null | undefined): string | null {\n if (seconds == null || seconds < 0) return null\n if (seconds < 60) return `${Math.round(seconds)} s`\n const minutes = Math.round(seconds / 60)\n if (minutes < 60) return `${minutes} min`\n const h = Math.floor(minutes / 60)\n const m = minutes % 60\n return m ? `${h} h ${m} min` : `${h} h`\n}\n\n/** Whether the call's current session is running (the server's view, or `call.started`). */\nexport function isCallLive(\n call: Pick<calls.CallResponse, 'started_at' | 'ended_at' | 'cancelled'> | undefined,\n liveNow: boolean\n): boolean {\n if (liveNow) return true\n if (!call?.started_at || call.cancelled) return false\n return !call.ended_at || Date.parse(call.started_at) > Date.parse(call.ended_at)\n}\n\n/** \"Call with Ada, Bob\" (the title is encrypted under the call key). */\nexport function contactsCallTitle(names: string[]): string | null {\n if (!names.length) return null\n const shown = names.slice(0, 3).join(', ')\n return `Call with ${shown}${names.length > 3 ? ` +${names.length - 3}` : ''}`\n}\n","/**\n * A secondary action of a conversation header (Save transcript, Recordings): labelled where there\n * is room, or icon-only with the label in a tooltip (and for screen readers) where the header is\n * crowded — the thread's title keeps priority.\n */\n\nimport type { ReactElement, ReactNode } from 'react'\nimport { Button, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\n\nexport function HeaderAction({\n label,\n icon,\n iconOnly = false,\n onClick,\n testId,\n className,\n}: {\n label: string\n icon: ReactNode\n iconOnly?: boolean\n onClick(): void\n testId?: string\n className?: string\n}): ReactElement {\n if (!iconOnly) {\n return (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className={className}\n onClick={onClick}\n data-testid={testId}\n >\n <span className=\"mr-1 inline-flex\">{icon}</span>\n {label}\n </Button>\n )\n }\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className={className}\n aria-label={label}\n onClick={onClick}\n data-testid={testId}\n >\n {icon}\n <span className=\"sr-only\">{label}</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n )\n}\n","/** \"Experimental\" marker for the call UI headers (calls are behind Settings → Experimental). */\n\nimport type { ReactElement } from 'react'\nimport { FlaskConical } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport function CallsExperimentalBadge({ className }: { className?: string }): ReactElement {\n return (\n <span\n data-testid=\"calls-experimental-badge\"\n title=\"Calls are an experimental feature.\"\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-sm border border-border px-1.5 py-0.5 text-[11px] font-medium text-muted-foreground',\n className\n )}\n >\n <FlaskConical className=\"size-3\" aria-hidden />\n Experimental\n </span>\n )\n}\n","/**\n * In-app links to a call recording (ARBI `docs/meeting-chats-plan.md` §6).\n *\n * A recording is never shared by a public link: it is protected by the room key (the meeting chat's\n * key, or the workspace key for a thread call). \"Copy link\" copies an IN-APP deep link that opens\n * the recording where it lives — sign-in and membership required, like the chat itself:\n * - a contacts call's meeting chat: `/?chat=<cht-…>&recording=<crc-…>`\n * - a workspace meeting thread: `/<wrk-…>/<con-…>?recording=<crc-…>`\n * The presigned object-store URLs never leave the upload/download code.\n */\n\nimport { useSyncExternalStore } from 'react'\nimport type { MeetingChatRef } from '@arbidocs/react'\nimport { buildDeepLinkUrl } from '../lib/deep-link'\n\nexport const RECORDING_ID_PATTERN = /^crc-[A-Za-z0-9]{4,64}$/\nexport const CHAT_ID_PATTERN = /^cht-[A-Za-z0-9]{4,64}$/\n\n/**\n * The in-app link to a recording in its meeting chat, on the deployment (`deploymentDomain`, from\n * the host environment's runtime config).\n */\nexport function recordingLink(\n ref: MeetingChatRef,\n recordingExtId: string,\n deploymentDomain?: string | null\n): string {\n const recording = encodeURIComponent(recordingExtId)\n if (ref.kind === 'chat') {\n return `${buildDeepLinkUrl({}, deploymentDomain)}?chat=${encodeURIComponent(ref.chatExtId)}&recording=${recording}`\n }\n const url = buildDeepLinkUrl(\n { workspaceId: ref.workspaceExtId, conversationId: ref.conversationExtId },\n deploymentDomain\n )\n return `${url}?recording=${recording}`\n}\n\n/** The recording (and chat) a URL's query names; invalid ids are ignored. */\nexport function parseRecordingLinkParams(search: string): {\n chat?: string\n recording?: string\n} {\n const params = new URLSearchParams(search)\n const chat = params.get('chat')\n const recording = params.get('recording')\n return {\n ...(chat && CHAT_ID_PATTERN.test(chat) ? { chat } : {}),\n ...(recording && RECORDING_ID_PATTERN.test(recording) ? { recording } : {}),\n }\n}\n\n// ── The recording a link asked to show (until its card shows it) ────────────\n\nlet pending: string | null = null\nconst listeners = new Set<() => void>()\n\nexport function setPendingRecording(recordingExtId: string | null): void {\n pending = recordingExtId\n for (const l of listeners) l()\n}\n\nexport function getPendingRecording(): string | null {\n return pending\n}\n\nexport function usePendingRecording(): string | null {\n return useSyncExternalStore(\n (cb) => {\n listeners.add(cb)\n return () => {\n listeners.delete(cb)\n }\n },\n () => pending,\n () => pending\n )\n}\n","/**\n * A person in the call UI: the host's own pill (`<ArbiHost config={{ calls: { UserPill } }}>`, e.g.\n * ARBI's people pills with avatars and the verified tick), else the plain user pill with the\n * initials of the call's name for them. My own reads \"Name (me)\".\n */\n\nimport { memo, type ReactElement } from 'react'\nimport { useArbi, useArbiHost, type CallUserPillProps } from '@arbidocs/react'\nimport { UserEntity, getUserAvatarColor } from '@arbidocs/react/ui'\nimport { initialsOf } from '../ui'\n\nexport const CallUserPill = memo(function CallUserPill(props: CallUserPillProps): ReactElement {\n const HostPill = useArbiHost().calls?.UserPill\n if (HostPill) return <HostPill {...props} />\n return <PlainUserPill {...props} />\n})\n\nfunction PlainUserPill({\n identity,\n name,\n size = 'xs',\n variant = 'pill',\n interactive = false,\n className,\n}: CallUserPillProps): ReactElement {\n const arbi = useArbi()\n const isMe = arbi.isLoggedIn && arbi.user.identity()?.externalId === identity\n const displayName = name?.trim() || identity\n return (\n <UserEntity\n size={size}\n variant={variant}\n interactive={interactive}\n className={className}\n initials={initialsOf(displayName)}\n displayName={isMe ? `${displayName} (me)` : displayName}\n colorClass={getUserAvatarColor(identity)}\n isMe={isMe}\n />\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/calls/ControlButton.tsx","../src/calls/hooks.ts","../src/calls/tiles.tsx","../src/calls/status.tsx","../src/calls/ControlBar.tsx","../src/calls/CallStage.tsx","../src/calls/CallSidePanel.tsx","../src/calls/panels.tsx","../src/calls/cards.tsx","../src/calls/join-choices.ts","../src/calls/PreJoin.tsx","../src/calls/webinar/WebinarWaiting.tsx","../src/calls/webinar/hooks.ts","../src/calls/webinar/live.tsx","../src/calls/webinar/RaiseHandButton.tsx","../src/calls/webinar/WebinarAudiencePanel.tsx","../src/calls/webinar/QAPanel.tsx","../src/calls/webinar/ChatPermissionSetting.tsx","../src/calls/webinar/OnStageCheck.tsx","../src/calls/webinar/WebinarViewer.tsx","../src/calls/voice-levels.ts","../src/calls/ringtone.ts","../src/calls/composite-canvas.ts","../src/calls/call-status.ts","../src/calls/recording-labels.ts","../src/calls/self-view.ts","../src/calls/call-cards.ts","../src/calls/HeaderAction.tsx","../src/calls/CallsExperimentalBadge.tsx","../src/calls/recording-link.ts","../src/calls/connected/CallUserPill.tsx"],"names":["forwardRef","CallControlButton","jsx","Button","cn","Tooltip","TooltipTrigger","jsxs","TooltipContent","useState","useRef","useMemo","useEffect","NOTICE_MS","CallTile","MonitorUp","MicOff","AudioLines","SignalLow","gridSlots","gridLayout","Users","spotlightBox","Fragment","Captions","Mic","Lock","LockOpen","CAPTION_TTL_MS","CAPTION_LINES","speakerAccent","Separator","formatElapsed","pending","Video","VideoOff","DropdownMenu","DropdownMenuTrigger","ChevronUp","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","DropdownMenuRadioGroup","DropdownMenuRadioItem","DropdownMenuSeparator","DropdownMenuCheckboxItem","Loader2","Circle","PhoneOff","MoreHorizontal","status","TabHeader","Phone","LayoutGrid","UserRound","PictureInPicture2","TabsList","TabsTrigger","X","Tabs","TabsContent","UserX","Maximize2","BellOff","Bell","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","CalendarCheck","useCallback","Radio","SquareX","ConfirmDialog","EyeOff","Hand","formatRelativeTime","Search","Input","Textarea","Send","CheckCheck","RotateCcw","Trash2","MessageSquareText","Dialog","DialogContent","DialogTitle","DialogDescription","MessageCircleQuestion","EMPTY","useSyncExternalStore","INITIAL_SPOTLIGHT","prev","SPEAKING_LEVEL","id","nextSpotlight","listeners","subscribe","FlaskConical","buildDeepLinkUrl","memo","CallUserPill","useArbiHost","useArbi","UserEntity","initialsOf","getUserAvatarColor"],"mappings":"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","file":"chunk-EGSSLWNZ.cjs","sourcesContent":["/**\n * The one button style of the call controls: an ARBI `Button` (36 px, 44 px on touch) with a\n * tooltip naming the action and its shortcut. Three tones:\n * neutral — a plain control (share, chat, more);\n * active — a control whose thing is on or open (captions on, chat open);\n * off — a device the user turned off (mic / camera), red-tinted, not a giant block.\n * The status chips of the header (`CallStatusChip`) live here too, so all call chrome shares\n * one source of sizes and colours.\n */\n\nimport { forwardRef, type ReactElement, type ReactNode } from 'react'\nimport {\n Button,\n cn,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n type ButtonProps,\n} from '@arbidocs/react/ui'\n\nexport type ControlTone = 'neutral' | 'active' | 'off' | 'danger'\n\nconst TONE: Record<ControlTone, string> = {\n neutral: 'bg-muted text-foreground hover:bg-accent',\n // Solid: a control whose thing is on reads as on at a glance (CC on, chat open, sharing).\n active: 'bg-primary text-primary-foreground hover:bg-primary/90',\n off: 'bg-red-bg text-red-text hover:bg-red-bg/80',\n danger: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n}\n\nexport interface CallControlButtonProps extends Omit<ButtonProps, 'variant'> {\n /** What the button does now (\"Turn off microphone\"). Also its accessible name. */\n label: string\n /** Shown in the tooltip after the label, e.g. \"M\". */\n shortcut?: string\n tone?: ControlTone\n /** Tooltip side (default above: the bar sits at the bottom). */\n side?: 'top' | 'bottom'\n /** False for a menu trigger: the open menu says it all, and a tip would sit on top of it. */\n tooltip?: boolean\n}\n\nexport const CallControlButton = forwardRef<HTMLButtonElement, CallControlButtonProps>(\n function CallControlButton(\n {\n label,\n shortcut,\n tone = 'neutral',\n side = 'top',\n tooltip = true,\n className,\n children,\n ...props\n },\n ref\n ) {\n const button = (\n <Button\n ref={ref}\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={label}\n className={cn('relative shrink-0 [&_svg]:size-[18px]', TONE[tone], className)}\n {...props}\n >\n {children}\n </Button>\n )\n if (!tooltip) return button\n return (\n <Tooltip>\n {/* The tooltip binds to a wrapper so the button keeps its own ref (a menu trigger needs it). */}\n <TooltipTrigger asChild>\n <span className=\"inline-flex shrink-0\">{button}</span>\n </TooltipTrigger>\n <TooltipContent side={side}>\n {label}\n {shortcut && (\n <kbd className=\"ml-2 rounded-sm border border-border px-1 font-sans text-[11px] text-muted-foreground\">\n {shortcut}\n </kbd>\n )}\n </TooltipContent>\n </Tooltip>\n )\n }\n)\n\n/** A count on a control's corner: unread messages (red, top) or how many people (quiet, bottom). */\nexport function ControlBadge({\n count,\n tone = 'alert',\n testId,\n}: {\n count: number\n tone?: 'alert' | 'quiet'\n testId?: string\n}): ReactElement {\n return (\n <span\n className={cn(\n 'pointer-events-none absolute -right-1 min-w-[1.125rem] rounded-full px-1 text-center text-[10px] font-semibold leading-[1.125rem]',\n tone === 'alert'\n ? '-top-1 bg-destructive text-destructive-foreground ring-2 ring-background'\n : '-bottom-1 bg-background text-muted-foreground ring-1 ring-border'\n )}\n data-testid={testId}\n >\n {count > 99 ? '99+' : count}\n </span>\n )\n}\n\n/** A small quiet status chip for the call header (recording, transcription, encryption). */\nexport function CallStatusChip({\n tone,\n icon,\n label,\n compact = false,\n pulse = false,\n title,\n children,\n className,\n testId,\n ...rest\n}: {\n tone: 'red' | 'green' | 'yellow' | 'neutral'\n icon?: ReactNode\n /** Visible text (hidden when compact; the accessible text stays). */\n label: ReactNode\n compact?: boolean\n /** A pulsing dot in front (live capture). */\n pulse?: boolean\n title?: string\n children?: ReactNode\n className?: string\n testId?: string\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, 'title'>): ReactElement {\n const tones = {\n red: 'border-red-border bg-red-bg text-red-text',\n green: 'border-green-border bg-green-bg text-green-text',\n yellow: 'border-yellow-border bg-yellow-bg text-yellow-text',\n neutral: 'border-border bg-muted text-muted-foreground',\n }\n return (\n <span\n className={cn(\n 'inline-flex h-6 shrink-0 items-center gap-1.5 rounded-md border px-2 text-xs font-medium',\n tones[tone],\n className\n )}\n title={title}\n data-testid={testId}\n {...rest}\n >\n {pulse && (\n <span className=\"relative flex size-2 shrink-0\" aria-hidden>\n <span className=\"absolute inline-flex size-full animate-ping rounded-full bg-red-solid opacity-60 motion-reduce:hidden\" />\n <span className=\"relative inline-flex size-2 rounded-full bg-red-solid\" />\n </span>\n )}\n {icon}\n <span className={cn('min-w-0 truncate', compact && 'sr-only')}>{label}</span>\n {children}\n </span>\n )\n}\n","/** Small hooks of the call blocks. */\n\nimport { useEffect, useMemo, useRef, useState, type RefObject } from 'react'\nimport { NOTICE_MS } from './layout'\n\n/** Size of an element, kept current with a ResizeObserver. */\nexport function useElementSize<T extends HTMLElement>(): [\n (el: T | null) => void,\n { width: number; height: number },\n] {\n const [size, setSize] = useState({ width: 0, height: 0 })\n const observer = useRef<ResizeObserver | null>(null)\n const ref = useMemo(\n () => (el: T | null) => {\n observer.current?.disconnect()\n observer.current = null\n if (!el || typeof ResizeObserver === 'undefined') return\n const ro = new ResizeObserver((entries) => {\n const r = entries[0]?.contentRect\n if (!r) return\n setSize((s) =>\n s.width === r.width && s.height === r.height ? s : { width: r.width, height: r.height }\n )\n })\n ro.observe(el)\n observer.current = ro\n },\n []\n )\n useEffect(() => () => observer.current?.disconnect(), [])\n return [ref, size]\n}\n\n/**\n * A notice that is spelled out on mount (when `announce`) and folds after `ms`; `onFolded` runs\n * once it folds, so the app can avoid spelling it out again on the next mount.\n */\nexport function useBriefNotice(announce = true, onFolded?: () => void, ms = NOTICE_MS): boolean {\n const [expanded, setExpanded] = useState(announce)\n const folded = useRef(onFolded)\n folded.current = onFolded\n useEffect(() => {\n if (!expanded) return\n const id = setTimeout(() => {\n setExpanded(false)\n folded.current?.()\n }, ms)\n return () => clearTimeout(id)\n }, [expanded, ms])\n return expanded\n}\n\n/** Is the keyboard event typed into a field (where a shortcut letter is just a letter)? */\nfunction typing(e: KeyboardEvent): boolean {\n const el = e.target as HTMLElement | null\n return !!el?.closest?.('input, textarea, select, [contenteditable=\"true\"], [role=\"textbox\"]')\n}\n\n/**\n * Single-key shortcuts inside `ref`: a control marked `data-call-shortcut=\"m\"` is clicked by the M\n * key while `enabled` and nobody is typing (or holding a modifier).\n */\nexport function useShortcutKeys(ref: RefObject<HTMLElement | null>, enabled: boolean): void {\n useEffect(() => {\n if (!enabled) return\n const onKey = (e: KeyboardEvent) => {\n if (e.repeat || e.ctrlKey || e.metaKey || e.altKey || typing(e)) return\n const key = e.key.toLowerCase()\n if (!/^[a-z]$/.test(key)) return\n const button = ref.current?.querySelector<HTMLButtonElement>(\n `[data-call-shortcut=\"${key}\"]:not(:disabled)`\n )\n if (!button) return\n e.preventDefault()\n button.click()\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [ref, enabled])\n}\n","/**\n * The call stage's tiles: one participant tile (with a voice-level ring, so it is plain who is\n * talking), the gallery grid (fills the stage: 1, 2 side by side, 2 + 1, 2 × 2, 3 + 2, …), and the\n * spotlight layout — the speaker (or a shared screen) large, everyone else in a filmstrip.\n *\n * Media-library free: the app hands each tile its `<video>` (or nothing, for initials) and its\n * state. Extra props (data attributes the app's recorder reads, say) land on the tile's root.\n * Styles: `@arbidocs/blocks/calls.css`.\n */\n\nimport {\n forwardRef,\n type CSSProperties,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { AudioLines, MicOff, MonitorUp, SignalLow, Users } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { useElementSize } from './hooks'\nimport { gridLayout, gridSlots, spotlightBox } from './layout'\n\nexport interface CallTileProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /**\n * The name, once, at the bottom left: a node (the app's person pill, say), or a string shown in\n * a small dark chip.\n */\n name: ReactNode\n /** Shown large while there is no video (camera off). */\n initials: string\n /** The `<video>` element; omit while the camera is off. */\n video?: ReactNode\n source?: 'camera' | 'screen'\n /** My own tile: the name says \"(me)\". */\n local?: boolean\n /** Mirror the video (my own camera, as a selfie). Only the <video> flips; labels never do. */\n mirror?: boolean\n /** Talking now: a ring (thicker with `level`) and a sound icon by the name — never colour alone. */\n speaking?: boolean\n /** Voice level 0..1, updated fast (~60 ms): drives the ring's size. */\n level?: number\n micMuted?: boolean\n poorConnection?: boolean\n /** Small tiles (filmstrip, picture-in-picture) use a smaller avatar. */\n size?: 'normal' | 'small'\n /** Text after my own name when `name` is a string (a pill says \"(me)\" itself). */\n youLabel?: string\n}\n\n/** One participant (or screen-share) tile. */\nexport const CallTile = forwardRef<HTMLDivElement, CallTileProps>(function CallTile(\n {\n name,\n initials,\n video,\n source = 'camera',\n local = false,\n mirror = false,\n speaking = false,\n level = 0,\n micMuted = false,\n poorConnection = false,\n size = 'normal',\n youLabel,\n className,\n style,\n ...rest\n },\n ref\n) {\n const screen = source === 'screen'\n const ring = speaking && !screen ? Math.min(1, Math.max(0, level)) : 0\n return (\n <div\n ref={ref}\n className={cn('call-tile', className)}\n data-call-tile=\"\"\n data-source={source}\n data-local={local}\n data-mirror={mirror && source === 'camera' && !!video}\n data-speaking={speaking && !screen}\n style={{ '--call-level': ring.toFixed(2), ...style } as CSSProperties}\n {...rest}\n >\n {video ?? (\n <div className=\"call-tile-placeholder\" aria-hidden>\n <span className={cn('call-tile-avatar', size === 'small' && 'call-tile-avatar-sm')}>\n {initials}\n </span>\n </div>\n )}\n <div className=\"call-tile-name\">\n {typeof name === 'string' ? (\n <span className=\"call-tile-chip min-w-0\">\n <span className=\"truncate\">{name}</span>\n {local && !screen && youLabel && (\n <span className=\"shrink-0 opacity-80\">{youLabel}</span>\n )}\n </span>\n ) : (\n <span className=\"call-tile-chip min-w-0 overflow-hidden py-0.5 pl-0.5\">{name}</span>\n )}\n {(screen || micMuted || speaking) && (\n <span className=\"call-tile-chip shrink-0\">\n {screen && <MonitorUp className=\"size-3.5\" aria-label=\"Screen\" />}\n {!screen && micMuted && <MicOff className=\"size-3.5\" aria-label=\"Microphone off\" />}\n {speaking && !screen && (\n <AudioLines className=\"call-tile-speaking size-3.5\" aria-label=\"Speaking\" />\n )}\n </span>\n )}\n </div>\n {poorConnection && (\n <span className=\"call-tile-signal\" title=\"Poor connection\">\n <SignalLow className=\"size-3.5\" aria-label=\"Poor connection\" />\n </span>\n )}\n </div>\n )\n})\n\nconst GRID_GAP = 8\n\n/** The adaptive grid. Tiles keep 16:9 and the largest size the stage allows. */\nexport function CallGrid<T>({\n items,\n getKey,\n renderTile,\n moreLabel = (n: number) => `${n} more`,\n className,\n}: {\n items: T[]\n getKey(item: T): string\n /** The tile for one item; it fills a box the grid sizes. */\n renderTile(item: T): ReactElement\n moreLabel?(hidden: number): string\n className?: string\n}): ReactElement {\n const [ref, size] = useElementSize<HTMLDivElement>()\n const { shown, hidden } = gridSlots(items)\n const count = shown.length + (hidden ? 1 : 0)\n // The 16:9 maths picks rows × columns and the largest 16:9 tile that fits; tiles keep the\n // camera's shape (never stretched into portrait), the grid sits at the top of the stage.\n const layout = gridLayout(count, size.width, size.height, GRID_GAP)\n const box = { width: layout.tileWidth, height: layout.tileHeight }\n const rows: number[][] = []\n let next = 0\n for (const n of layout.rowCounts) rows.push(Array.from({ length: n }, () => next++))\n return (\n <div\n ref={ref}\n className={cn('flex size-full min-h-0 flex-col items-center', className)}\n style={{ gap: GRID_GAP }}\n data-testid=\"call-grid\"\n data-cols={layout.cols}\n >\n {layout.tileWidth > 0 &&\n rows.map((row, r) => (\n <div key={r} className=\"flex justify-center\" style={{ gap: GRID_GAP }}>\n {row.map((i) =>\n i < shown.length ? (\n <div key={getKey(shown[i])} className=\"call-tile-box\" style={box}>\n {renderTile(shown[i])}\n </div>\n ) : (\n <div key=\"more\" className=\"call-tile call-tile-more\" style={box}>\n <Users className=\"size-5\" aria-hidden />\n <span>{moreLabel(hidden)}</span>\n </div>\n )\n )}\n </div>\n ))}\n </div>\n )\n}\n\n/**\n * Spotlight: one tile large (the speaker, or a shared screen), everyone else in a filmstrip\n * beside it — below it on a narrow stage such as the docked call panel.\n */\nexport function CallFocus<T>({\n focus,\n others,\n getKey,\n renderTile,\n className,\n testId = 'call-focus',\n}: {\n focus: T\n others: T[]\n getKey(item: T): string\n renderTile(item: T, size: 'normal' | 'small'): ReactElement\n className?: string\n testId?: string\n}): ReactElement {\n const [ref, size] = useElementSize<HTMLDivElement>()\n const narrow = size.width > 0 && size.width < 640\n const box = spotlightBox(size.width, size.height, others.length, narrow)\n return (\n <div\n ref={ref}\n className={cn(\n 'flex size-full min-h-0 gap-2',\n narrow ? 'flex-col items-center' : 'flex-row items-start justify-center',\n className\n )}\n data-testid={testId}\n >\n {/* The large tile keeps 16:9 at the top: a camera is never cropped into portrait. */}\n <div\n key={getKey(focus)}\n className=\"call-tile-box shrink-0\"\n style={{ width: box.width, height: box.height }}\n data-testid=\"call-spotlight\"\n >\n {box.width > 0 && renderTile(focus, 'normal')}\n </div>\n {others.length > 0 && (\n <div\n className={cn(\n 'grid shrink-0 gap-2',\n narrow ? 'w-full grid-cols-3 content-start' : 'w-60 grid-cols-1 overflow-y-auto'\n )}\n style={narrow ? { width: box.width } : undefined}\n data-testid=\"call-filmstrip\"\n >\n {others.map((t) => (\n <div key={getKey(t)} className=\"call-tile-box aspect-video w-full min-w-0\">\n {renderTile(t, 'small')}\n </div>\n ))}\n </div>\n )}\n </div>\n )\n}\n","/**\n * The call's status, each shown once in the header (or on the minimised card): recording,\n * transcription and encryption chips, and the live captions strip below the tiles.\n *\n * Recording and transcription chips first spell out who started them (\"Recording (Audio) —\n * started by Ada\"), then fold to a short label after {@link NOTICE_MS}; the full sentence stays\n * available to screen readers and as the tooltip.\n */\n\nimport { useEffect, useState, type ReactElement, type ReactNode } from 'react'\nimport { Captions, Lock, LockOpen, Mic, MicOff } from 'lucide-react'\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { CallStatusChip } from './ControlButton'\nimport { CAPTION_LINES, CAPTION_TTL_MS, speakerAccent } from './layout'\nimport { useBriefNotice } from './hooks'\n\nfunction FoldingLabel({\n sentence,\n short,\n expanded,\n}: {\n sentence: string\n short: string\n expanded: boolean\n}): ReactElement {\n return (\n <>\n <span className={cn(!expanded && 'sr-only')}>{sentence}</span>\n {!expanded && <span aria-hidden>{short}</span>}\n </>\n )\n}\n\n/** \"Recording\" with a pulsing dot. */\nexport function RecordingStatusChip({\n sentence,\n short = 'Recording',\n compact = false,\n announce = true,\n onAnnounced,\n className,\n ...rest\n}: {\n /** Spell the sentence out first (false once it has been, e.g. after a re-mount). */\n announce?: boolean\n onAnnounced?(): void\n /** e.g. \"Recording (Audio + video) — started by you\". */\n sentence: string\n short?: string\n /** Dot only once folded (a narrow header, the minimised card). */\n compact?: boolean\n className?: string\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, 'title'>): ReactElement {\n const expanded = useBriefNotice(announce, onAnnounced)\n return (\n <CallStatusChip\n tone=\"red\"\n pulse\n role=\"status\"\n aria-live=\"polite\"\n label={<FoldingLabel sentence={sentence} short={short} expanded={expanded} />}\n compact={compact && !expanded}\n title={sentence}\n className={className}\n data-expanded={expanded}\n {...rest}\n />\n )\n}\n\n/** \"Transcribing\", with my own \"stop sending my voice\" switch in it. */\nexport function TranscriptionStatusChip({\n sentence,\n announce = true,\n onAnnounced,\n short = 'Transcribing',\n detail,\n muted,\n onMutedChange,\n muteLabel,\n unmuteLabel,\n compact = false,\n className,\n ...rest\n}: {\n /** e.g. \"Transcription on — started by Ada\". */\n sentence: string\n announce?: boolean\n onAnnounced?(): void\n short?: string\n /** Tooltip after the sentence (what transcription does). */\n detail?: string\n muted: boolean\n onMutedChange(muted: boolean): void\n muteLabel: string\n unmuteLabel: string\n compact?: boolean\n className?: string\n} & Omit<React.HTMLAttributes<HTMLSpanElement>, 'title'>): ReactElement {\n const expanded = useBriefNotice(announce, onAnnounced)\n const label = muted ? unmuteLabel : muteLabel\n return (\n <CallStatusChip\n tone=\"red\"\n role=\"status\"\n aria-live=\"polite\"\n icon={<Captions className=\"size-3.5 shrink-0\" aria-hidden />}\n label={<FoldingLabel sentence={sentence} short={short} expanded={expanded} />}\n compact={compact && !expanded}\n title={detail ? `${sentence}. ${detail}` : sentence}\n className={cn('pr-0.5', className)}\n data-expanded={expanded}\n {...rest}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n // `!`: a header section may force its buttons to a toolbar size.\n className=\"inline-flex h-5! w-5! shrink-0 items-center justify-center rounded-sm p-0! hover:bg-red-text/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-pressed={muted}\n aria-label={label}\n onClick={() => onMutedChange(!muted)}\n data-testid=\"transcription-mute\"\n >\n {muted ? (\n <MicOff className=\"size-3.5\" aria-hidden />\n ) : (\n <Mic className=\"size-3.5\" aria-hidden />\n )}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n </CallStatusChip>\n )\n}\n\n/** Whether the media is end-to-end encrypted. */\nexport function EncryptionStatusChip({\n state,\n compact = false,\n labels = {\n on: 'Encrypted',\n pending: 'Encrypting…',\n off: 'Not encrypted',\n onTitle: 'Media is end-to-end encrypted; the media server only sees ciphertext.',\n offTitle: 'This call is not end-to-end encrypted.',\n },\n}: {\n state: 'on' | 'pending' | 'off'\n compact?: boolean\n labels?: { on: string; pending: string; off: string; onTitle: string; offTitle: string }\n}): ReactElement {\n const on = state === 'on'\n return (\n <CallStatusChip\n tone={on ? 'neutral' : 'yellow'}\n icon={\n on ? (\n <Lock className=\"size-3.5 shrink-0\" aria-hidden />\n ) : (\n <LockOpen className=\"size-3.5 shrink-0\" aria-hidden />\n )\n }\n label={on ? labels.on : state === 'pending' ? labels.pending : labels.off}\n compact={compact}\n title={on ? labels.onTitle : labels.offTitle}\n data-testid=\"call-encryption-badge\"\n data-state={state}\n />\n )\n}\n\n/** One caption: a speaker's latest segment. */\nexport interface CaptionEntry {\n id: string\n speakerId: string\n name: string\n text: string\n /** Local receipt time, ms (drives the fade). */\n receivedAt: number\n}\n\n/**\n * Live captions in a strip below the tiles (never over a face): at most two lines, the newest at\n * the bottom, each speaker's name in their own accent. With `reserve` the strip keeps its height\n * while empty, so the tiles do not jump each time someone starts or stops talking.\n */\nexport function CaptionsStrip({\n captions,\n reserve = false,\n waitingText = 'Captions appear here as people speak.',\n className,\n}: {\n captions: CaptionEntry[]\n reserve?: boolean\n waitingText?: ReactNode\n className?: string\n}): ReactElement | null {\n const [now, setNow] = useState(() => Date.now())\n const visible = captions.filter((c) => now - c.receivedAt < CAPTION_TTL_MS).slice(-CAPTION_LINES)\n const showing = visible.length > 0\n const newest = captions[captions.length - 1]?.receivedAt\n useEffect(() => {\n setNow(Date.now())\n }, [newest])\n useEffect(() => {\n if (!showing) return\n const id = setInterval(() => setNow(Date.now()), 1000)\n return () => clearInterval(id)\n }, [showing])\n if (!showing && !reserve) return null\n return (\n <div\n className={cn(\n 'shrink-0 rounded-md bg-muted px-3 py-2 text-sm leading-5 text-foreground',\n className\n )}\n aria-live=\"polite\"\n data-testid=\"captions-overlay\"\n >\n {/* Two lines in all. Each caption is its speaker's name (never clipped) beside the tail of\n what they said: the text is bottom-aligned in a clip, so a long caption loses its start,\n not its speaker. One caption gets both lines; two get one each. */}\n <div className=\"flex h-10 flex-col justify-end overflow-hidden\">\n {!showing && (\n <p className=\"truncate text-muted-foreground\" data-testid=\"captions-waiting\">\n {waitingText}\n </p>\n )}\n {visible.map((c) => (\n <p\n key={`${c.speakerId}:${c.id}`}\n className=\"flex min-w-0 shrink-0 gap-1.5\"\n data-testid=\"caption-line\"\n data-speaker={c.speakerId}\n >\n <span\n className={cn(\n 'max-w-[40%] shrink-0 truncate font-semibold',\n speakerAccent(c.speakerId)\n )}\n >\n {c.name}\n </span>\n <span className=\"sr-only\">: </span>\n <span\n className=\"flex min-w-0 flex-1 flex-col justify-end overflow-hidden\"\n style={{ height: `${(visible.length > 1 ? 1 : CAPTION_LINES) * 1.25}rem` }}\n >\n <span className=\"break-words\">{c.text}</span>\n </span>\n </p>\n ))}\n </div>\n </div>\n )\n}\n","/**\n * The call's control bar: one row, three columns. Left, the elapsed time (and any warning);\n * centre, the controls in groups; right, Leave. Controls are `CallControlButton`s; Record carries\n * its label, so its state is never a guess.\n * Press-shortcuts: a control marked `data-call-shortcut=\"m\"` is clicked by the M key while\n * `shortcuts` is on and nobody is typing.\n */\n\nimport { useEffect, useRef, useState, type ReactElement, type ReactNode } from 'react'\nimport {\n ChevronUp,\n Circle,\n Loader2,\n Mic,\n MicOff,\n MoreHorizontal,\n PhoneOff,\n Video,\n VideoOff,\n} from 'lucide-react'\nimport {\n Button,\n cn,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Separator,\n} from '@arbidocs/react/ui'\nimport { CallControlButton } from './ControlButton'\nimport { useShortcutKeys } from './hooks'\nimport { formatElapsed } from './layout'\n\nexport function CallControlBar({\n left,\n right,\n children,\n shortcuts = false,\n className,\n}: {\n left?: ReactNode\n right?: ReactNode\n /** The centre controls (use `ControlGroup` / `ControlDivider`). */\n children: ReactNode\n /** Single-key shortcuts on (the call is on screen). */\n shortcuts?: boolean\n className?: string\n}): ReactElement {\n const ref = useRef<HTMLDivElement>(null)\n useShortcutKeys(ref, shortcuts)\n return (\n <div\n ref={ref}\n className={cn(\n 'grid h-16 shrink-0 grid-cols-[1fr_auto_1fr] items-center gap-2 border-t border-border bg-background px-3 sm:px-4',\n className\n )}\n data-testid=\"call-controls\"\n >\n <div className=\"flex min-w-0 items-center gap-2\">{left}</div>\n <div className=\"flex items-center gap-2\">{children}</div>\n <div className=\"flex items-center justify-end gap-2\">{right}</div>\n </div>\n )\n}\n\nexport function ControlGroup({ children }: { children: ReactNode }): ReactElement {\n return <div className=\"flex items-center gap-2\">{children}</div>\n}\n\nexport function ControlDivider(): ReactElement {\n return <Separator orientation=\"vertical\" className=\"mx-1 h-6\" />\n}\n\n/** `m:ss` since `since`, ticking every second. */\nexport function ElapsedTime({ since, title }: { since: number; title?: string }): ReactElement {\n const [now, setNow] = useState(() => Date.now())\n useEffect(() => {\n const id = setInterval(() => setNow(Date.now()), 1000)\n return () => clearInterval(id)\n }, [])\n return (\n <span className=\"text-sm tabular-nums text-muted-foreground\" title={title}>\n {formatElapsed(now - since)}\n </span>\n )\n}\n\nexport interface MediaDevice {\n deviceId: string\n label: string\n}\n\n/** Microphone or camera: one toggle with an attached caret that opens the device list. */\nexport function MediaControl({\n kind,\n enabled,\n pending = false,\n onToggle,\n devices,\n activeDeviceId,\n onSelectDevice,\n shortcut,\n testId,\n options = [],\n}: {\n kind: 'microphone' | 'camera'\n enabled: boolean\n pending?: boolean\n onToggle(): void\n devices: MediaDevice[]\n activeDeviceId?: string\n onSelectDevice(deviceId: string): void\n shortcut?: string\n testId: string\n /** On/off settings under the device list (e.g. \"Mirror my video\"). */\n options?: { label: string; checked: boolean; onChange(checked: boolean): void; testId?: string }[]\n}): ReactElement {\n const mic = kind === 'microphone'\n const label = enabled ? `Turn off ${kind}` : `Turn on ${kind}`\n const Icon = mic ? (enabled ? Mic : MicOff) : enabled ? Video : VideoOff\n const title = mic ? 'Microphone' : 'Camera'\n return (\n <div className=\"flex shrink-0 items-center\" role=\"group\" aria-label={title}>\n <CallControlButton\n label={label}\n shortcut={shortcut}\n tone={enabled ? 'neutral' : 'off'}\n aria-pressed={enabled}\n disabled={pending}\n onClick={onToggle}\n className=\"rounded-r-none\"\n data-testid={testId}\n data-call-shortcut={shortcut?.toLowerCase()}\n data-enabled={enabled}\n >\n <Icon aria-hidden />\n </CallControlButton>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n aria-label={`Choose ${kind}`}\n title={`Choose ${kind}`}\n className={cn(\n 'h-9 w-6 shrink-0 rounded-l-none border-l px-0 pointer-coarse:h-11! pointer-coarse:w-8',\n enabled\n ? 'border-background bg-muted text-muted-foreground hover:bg-accent hover:text-foreground'\n : 'border-background bg-red-bg text-red-text hover:bg-red-bg/80'\n )}\n data-testid={`${testId}-devices`}\n >\n <ChevronUp className=\"size-3.5\" aria-hidden />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent side=\"top\" align=\"start\" className=\"w-72\">\n <DropdownMenuLabel className=\"text-xs font-medium text-muted-foreground\">\n {title}\n </DropdownMenuLabel>\n {devices.length === 0 ? (\n <DropdownMenuItem disabled>No {kind} found</DropdownMenuItem>\n ) : (\n <DropdownMenuRadioGroup value={activeDeviceId} onValueChange={onSelectDevice}>\n {devices.map((d, i) => (\n <DropdownMenuRadioItem key={d.deviceId} value={d.deviceId}>\n <span className=\"truncate\">{d.label || `${title} ${i + 1}`}</span>\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n )}\n {options.length > 0 && <DropdownMenuSeparator />}\n {options.map((o) => (\n <DropdownMenuCheckboxItem\n key={o.label}\n checked={o.checked}\n onCheckedChange={(c) => o.onChange(c === true)}\n data-testid={o.testId}\n >\n {o.label}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )\n}\n\nexport interface RecordMode<M extends string = string> {\n mode: M\n label: string\n description: string\n testId?: string\n}\n\n/**\n * The host's record button: off, it opens the mode choice; on, it stops (red). A plain menu\n * rather than a portal so the choice stays next to its button.\n */\nexport function RecordControl<M extends string>({\n on,\n busy = false,\n modes,\n note,\n onStart,\n onStop,\n}: {\n on: boolean\n busy?: boolean\n modes: RecordMode<M>[]\n /** One line above the modes (how recording works). */\n note?: string\n onStart(mode: M): void\n onStop(): void\n}): ReactElement {\n const [choosing, setChoosing] = useState(false)\n const menuRef = useRef<HTMLDivElement>(null)\n useEffect(() => {\n if (!choosing) return\n const onDown = (e: PointerEvent) => {\n if (!menuRef.current?.contains(e.target as Node)) setChoosing(false)\n }\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setChoosing(false)\n }\n document.addEventListener('pointerdown', onDown)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('pointerdown', onDown)\n document.removeEventListener('keydown', onKey)\n }\n }, [choosing])\n // Labelled, so its state is never a guess: \"Record\" (red dot) or \"Stop recording\" (pulsing).\n const base = 'h-9 shrink-0 gap-2 px-3 pointer-coarse:h-11!'\n if (on) {\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className={cn(base, 'bg-red-bg text-red-text hover:bg-red-bg/80')}\n disabled={busy}\n onClick={onStop}\n data-testid=\"recording-stop\"\n >\n {busy ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <span className=\"relative flex size-2.5\" aria-hidden>\n <span className=\"absolute inline-flex size-full animate-ping rounded-full bg-red-solid opacity-60 motion-reduce:hidden\" />\n <span className=\"relative inline-flex size-2.5 rounded-full bg-red-solid\" />\n </span>\n )}\n Stop recording\n </Button>\n )\n }\n return (\n <div ref={menuRef} className=\"relative\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n className={cn(base, 'bg-muted text-foreground hover:bg-accent')}\n disabled={busy}\n aria-expanded={choosing}\n aria-haspopup=\"menu\"\n onClick={() => setChoosing((c) => !c)}\n data-testid=\"recording-start\"\n >\n {busy ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Circle className=\"size-3 fill-red-solid text-red-solid\" aria-hidden />\n )}\n Record\n </Button>\n {choosing && (\n <div\n role=\"menu\"\n aria-label=\"Record\"\n className=\"absolute bottom-full left-1/2 z-50 mb-2 w-64 -translate-x-1/2 rounded-md border bg-popover p-1 text-popover-foreground shadow-lg\"\n >\n {note && <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">{note}</p>}\n {modes.map((m) => (\n <button\n key={m.mode}\n type=\"button\"\n role=\"menuitem\"\n className=\"flex w-full flex-col items-start rounded-sm px-2 py-1.5 text-left text-sm outline-none hover:bg-accent focus-visible:bg-accent pointer-coarse:min-h-11\"\n onClick={() => {\n setChoosing(false)\n onStart(m.mode)\n }}\n data-testid={m.testId}\n >\n <span className=\"font-medium\">{m.label}</span>\n <span className=\"text-xs text-muted-foreground\">{m.description}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/** Leave: the one filled red control, at the right end. */\n/** A further way out offered by Leave (e.g. a webinar's \"End webinar for everyone\"). */\nexport interface LeaveOption {\n key: string\n label: string\n onSelect(): void\n testId?: string\n}\n\n/**\n * Leave: one red button. With `options` it opens a menu instead — Leave itself first, then the\n * options (a host ending the webinar for everyone) — so leaving and ending share one control.\n */\nexport function LeaveButton({\n onLeave,\n compact = false,\n label = 'Leave',\n title = 'Leave call',\n options,\n}: {\n onLeave(): void\n compact?: boolean\n label?: string\n title?: string\n options?: LeaveOption[]\n}): ReactElement {\n const menu = !!options?.length\n const button = (\n <Button\n type=\"button\"\n variant=\"destructive\"\n size={compact ? 'icon' : 'default'}\n className={cn('shrink-0', !compact && 'px-4')}\n aria-label={title}\n title={title}\n onClick={menu ? undefined : onLeave}\n data-testid=\"call-leave\"\n >\n <PhoneOff className=\"size-4\" aria-hidden />\n {!compact && label}\n </Button>\n )\n if (!menu) return button\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>{button}</DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n <DropdownMenuItem onSelect={onLeave} data-testid=\"call-leave-only\">\n <PhoneOff aria-hidden />\n {label}\n </DropdownMenuItem>\n {options.map((o) => (\n <DropdownMenuItem\n key={o.key}\n onSelect={o.onSelect}\n className=\"text-red-text focus:text-red-text\"\n data-testid={o.testId}\n >\n {o.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport interface MoreMenuItem {\n key: string\n label: ReactNode\n icon?: ReactNode\n onSelect(): void\n disabled?: boolean\n /** Right-aligned extra (a count). */\n trailing?: ReactNode\n testId?: string\n}\n\n/**\n * A group of More that is a setting rather than actions (e.g. the webinar's \"Who can chat\"): its\n * own menu content (a `DropdownMenuLabel` and radio items), between the same hairlines.\n */\nexport interface MoreMenuSection {\n key: string\n content: ReactNode\n}\n\ntype MoreMenuGroup = MoreMenuItem[] | MoreMenuSection\n\nconst isSection = (g: MoreMenuGroup): g is MoreMenuSection => !Array.isArray(g)\n\n/** \"More\": a details header, then groups of items (or settings) separated by hairlines. */\nexport function MoreMenu({\n details,\n groups,\n label = 'More options',\n}: {\n details?: ReactNode\n groups: MoreMenuGroup[]\n label?: string\n}): ReactElement {\n const shown = groups.filter((g) => isSection(g) || g.length > 0)\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <CallControlButton label={label} tooltip={false} data-testid=\"call-more\">\n <MoreHorizontal aria-hidden />\n </CallControlButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent side=\"top\" align=\"end\" className=\"w-72\" data-testid=\"call-more-menu\">\n {details && (\n <>\n <DropdownMenuLabel className=\"flex flex-col gap-1 font-normal\">\n {details}\n </DropdownMenuLabel>\n {shown.length > 0 && <DropdownMenuSeparator />}\n </>\n )}\n {shown.map((group, i) => (\n <div key={isSection(group) ? group.key : group[0].key} role=\"none\">\n {i > 0 && <DropdownMenuSeparator />}\n {isSection(group)\n ? group.content\n : group.map((item) => (\n <DropdownMenuItem\n key={item.key}\n onSelect={item.onSelect}\n disabled={item.disabled}\n data-testid={item.testId}\n >\n {item.icon}\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.trailing}\n </DropdownMenuItem>\n ))}\n </div>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","/**\n * The call panel, docked beside the call's conversation like the document viewer: the app's\n * header (`TabHeader`: one tab with the call's title; status chips, the view switch and\n * \"Minimise\" on the right), a \"Speaking: …\" line, the stage (tiles, or a side panel over them)\n * and the control bar. Normal app surfaces in both themes; only the tiles are dark.\n */\n\nimport type { ReactElement, ReactNode } from 'react'\nimport { useElementSize } from './hooks'\nimport { AudioLines, LayoutGrid, PictureInPicture2, Phone, UserRound } from 'lucide-react'\nimport { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { TabHeader } from '../shell/TabHeader'\n\nexport type CallView = 'speaker' | 'gallery'\n\nfunction HeaderIconButton({\n label,\n onClick,\n children,\n testId,\n pressed,\n}: {\n label: string\n onClick(): void\n children: ReactNode\n testId?: string\n pressed?: boolean\n}): ReactElement {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"text-muted-foreground hover:text-foreground\"\n aria-label={label}\n aria-pressed={pressed}\n onClick={onClick}\n data-testid={testId}\n >\n {children}\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n )\n}\n\nexport function CallHeader({\n title,\n icon,\n status,\n view,\n onViewChange,\n onMinimise,\n minimiseLabel = 'Minimise — keep working while the call goes on',\n}: {\n title: string\n icon?: ReactNode\n /** The status chips; given `compact` on a narrow header. */\n status?: ReactNode | ((compact: boolean) => ReactNode)\n /** Speaker (the talker large) or gallery (everyone equal): one switch. */\n view?: CallView\n onViewChange?(view: CallView): void\n onMinimise?(): void\n minimiseLabel?: string\n}): ReactElement {\n return (\n <div className=\"@container\">\n <TabHeader\n tabs={[\n {\n id: 'call',\n label: (\n <Tooltip>\n {/* Sized by the header's width (a container): the status chips and buttons keep\n their room; the title truncates with an ellipsis only when it must. */}\n <TooltipTrigger asChild showWithText>\n <span\n className=\"block min-w-0 max-w-[calc(100cqw-16rem)] truncate\"\n data-testid=\"call-title\"\n >\n {title}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{title}</TooltipContent>\n </Tooltip>\n ),\n icon: icon ?? <Phone className=\"size-4\" />,\n },\n ]}\n activeTabId=\"call\"\n onTabChange={() => undefined}\n testId=\"call-header\"\n // The hairline is the header's lower edge, flush with the panel below it.\n className=\"pb-0\"\n rightContent={(compact: boolean) => (\n <>\n {typeof status === 'function' ? status(compact) : status}\n {view && onViewChange && (\n <HeaderIconButton\n label={\n view === 'speaker'\n ? 'Gallery view (everyone equal)'\n : 'Speaker view (who talks, large)'\n }\n onClick={() => onViewChange(view === 'speaker' ? 'gallery' : 'speaker')}\n testId=\"call-view-toggle\"\n >\n {view === 'speaker' ? (\n <LayoutGrid className=\"size-4\" />\n ) : (\n <UserRound className=\"size-4\" />\n )}\n </HeaderIconButton>\n )}\n {onMinimise && (\n <HeaderIconButton\n label={minimiseLabel}\n onClick={onMinimise}\n testId=\"call-dock-toggle\"\n >\n <PictureInPicture2 className=\"size-4\" />\n </HeaderIconButton>\n )}\n </>\n )}\n />\n </div>\n )\n}\n\n/**\n * \"Speaking: Ada, Bo\" — who is talking right now, in words (the tile rings say it in colour and\n * motion). Polite live region, so a screen reader hears changes without being flooded.\n */\nexport function SpeakingNow({\n names,\n idleText = 'No one is speaking',\n className,\n}: {\n /** Who is talking (person pills, or plain names). */\n names: ReactNode[]\n idleText?: string\n className?: string\n}): ReactElement {\n const talking = names.length > 0\n return (\n <p\n className={cn(\n 'flex min-w-0 items-center gap-1.5 text-sm',\n talking ? 'text-foreground' : 'text-muted-foreground',\n className\n )}\n aria-live=\"polite\"\n data-testid=\"call-speaking-now\"\n >\n <AudioLines\n className={cn(\n 'size-4 shrink-0',\n talking ? 'text-theme-cyan motion-safe:animate-pulse' : 'text-muted-foreground'\n )}\n aria-hidden\n />\n {talking ? (\n <span className=\"flex min-w-0 items-center gap-1 overflow-hidden\">\n <span className=\"shrink-0 text-muted-foreground\">Speaking:</span>\n {names.map((n, i) => (\n <span key={i} className=\"flex min-w-0 shrink-0 items-center\">\n {n}\n </span>\n ))}\n </span>\n ) : (\n <span className=\"min-w-0 truncate\">{idleText}</span>\n )}\n </p>\n )\n}\n\n/**\n * A short-lived line under the header (\"Transcription on — started by Ada\"): the notice gets its\n * own line, so it never takes the title's room; the header keeps only the short chip.\n */\nexport function CallNotice({ children }: { children: ReactNode }): ReactElement {\n return (\n <p\n className=\"flex min-w-0 items-center gap-1.5 text-sm text-red-text motion-safe:animate-in motion-safe:fade-in-0\"\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"call-notice\"\n >\n <span className=\"size-2 shrink-0 rounded-full bg-red-solid\" aria-hidden />\n <span className=\"min-w-0 truncate\">{children}</span>\n </p>\n )\n}\n\n/**\n * The panel frame: header, a slim line under it (\"Speaking: …\", notices), the video stage, the\n * participant list under the video, and the control bar. `stageHeight` sizes the video to its\n * tiles (they keep 16:9 at the top) so the rest of the panel goes to the list rather than to blank\n * space; without it, or with a `compact` list, the stage takes the room.\n */\nexport function CallStageFrame({\n header,\n subheader,\n stage,\n stageRef,\n stageOverlay,\n people,\n stageHeight,\n controls,\n className,\n}: {\n header: ReactNode\n /** A slim line under the header (\"Speaking: …\"). */\n subheader?: ReactNode\n stage: ReactNode\n stageRef?: React.Ref<HTMLDivElement>\n /** Floating over the tiles' top-left corner (lobby requests, connection state). */\n stageOverlay?: ReactNode\n /** The participant list, under the video. */\n people?: ReactNode\n /** The video's natural height for a stage `width` wide and at most `maxHeight` tall. */\n stageHeight?(width: number, maxHeight: number): number\n controls: ReactNode\n className?: string\n}): ReactElement {\n const [bodyRef, body] = useElementSize<HTMLDivElement>()\n // Padding of the stage box (px-3 + pb-3).\n const PAD_X = 24\n const PAD_B = 12\n const sized =\n !!people && !!stageHeight && body.width > 0 && body.height > 0\n ? Math.ceil(stageHeight(body.width - PAD_X, Math.round(body.height * 0.62)) + PAD_B)\n : null\n return (\n <div className={cn('flex size-full min-h-0 flex-col bg-background text-foreground', className)}>\n {header}\n {subheader && (\n <div className=\"flex min-h-9 shrink-0 flex-col justify-center gap-0.5 px-3 py-1\">\n {subheader}\n </div>\n )}\n <div ref={bodyRef} className=\"relative flex min-h-0 flex-1 flex-col\">\n <div\n className={cn('flex min-h-0 flex-col px-3 pb-3', sized == null ? 'flex-1' : 'shrink-0')}\n style={sized == null ? undefined : { height: sized }}\n >\n <div ref={stageRef} className=\"relative min-h-0 flex-1\" data-testid=\"call-stage\">\n {stage}\n {stageOverlay}\n </div>\n </div>\n {people}\n </div>\n {controls}\n </div>\n )\n}\n","/**\n * A side panel inside the call (chat, participants): the same header as the app's docked panels\n * (FloatingPanel: title in the brand colour, hairline below, a ghost close button), on the normal\n * background, beside the tiles rather than over them.\n *\n * With `tabs` the one panel carries several views (People | Q&A | Audience in a webinar): the tabs\n * take the title's place in the header, and `children` is the active tab's content.\n */\n\nimport type { ReactElement, ReactNode } from 'react'\nimport { X } from 'lucide-react'\nimport { Button, cn, Tabs, TabsContent, TabsList, TabsTrigger } from '@arbidocs/react/ui'\n\nexport interface CallSidePanelTab {\n id: string\n label: string\n /** A count after the label (questions, people); hidden when undefined. */\n count?: number\n testId?: string\n}\n\nexport function CallSidePanel({\n title,\n icon,\n actions,\n onClose,\n closeLabel,\n closeTestId,\n tabs,\n activeTab,\n onTabChange,\n children,\n className,\n ...rest\n}: {\n /** The panel's name (its accessible name; shown when there are no tabs). */\n title: string\n icon?: ReactNode\n /** Extra header actions, left of the close button. */\n actions?: ReactNode\n onClose(): void\n closeLabel: string\n closeTestId?: string\n /** Views of the panel, shown as tabs in the header instead of the title. */\n tabs?: CallSidePanelTab[]\n activeTab?: string\n onTabChange?(id: string): void\n children: ReactNode\n className?: string\n} & React.HTMLAttributes<HTMLElement>): ReactElement {\n const tabbed = !!tabs?.length\n const current = activeTab ?? tabs?.[0]?.id\n const header = (\n <div className=\"flex h-12 shrink-0 items-center gap-2 border-b border-border pl-3 pr-1.5\">\n {tabbed ? (\n <TabsList className=\"h-8 min-w-0 flex-1 justify-start overflow-x-auto bg-transparent p-0\">\n {tabs.map((t) => (\n <TabsTrigger\n key={t.id}\n value={t.id}\n className=\"h-8 gap-1.5 px-2.5 data-[state=active]:bg-muted data-[state=active]:text-primary data-[state=active]:shadow-none\"\n data-testid={t.testId}\n >\n {t.label}\n {t.count !== undefined && (\n <span className=\"text-xs tabular-nums text-muted-foreground\">{t.count}</span>\n )}\n </TabsTrigger>\n ))}\n </TabsList>\n ) : (\n <span className=\"flex min-w-0 flex-1 items-center gap-2 text-base font-semibold text-primary\">\n {icon}\n <span className=\"truncate\">{title}</span>\n </span>\n )}\n {actions}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 text-muted-foreground hover:text-foreground\"\n aria-label={closeLabel}\n title={closeLabel}\n onClick={onClose}\n data-testid={closeTestId}\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n )\n return (\n <aside\n className={cn('flex min-h-0 flex-col bg-background text-foreground', className)}\n aria-label={title}\n {...rest}\n >\n {tabbed ? (\n <Tabs\n value={current}\n onValueChange={(id) => onTabChange?.(id)}\n className=\"flex min-h-0 flex-1 flex-col\"\n >\n {header}\n {current && (\n <TabsContent value={current} className=\"mt-0 flex min-h-0 flex-1 flex-col\">\n {children}\n </TabsContent>\n )}\n </Tabs>\n ) : (\n <>\n {header}\n {children}\n </>\n )}\n </aside>\n )\n}\n","/**\n * The call panel's participant list and the lobby requests. Presentational: the app supplies the people\n * and the actions. (Chat happens in the call's conversation, beside the panel.)\n */\n\nimport { useState, type ReactElement, type ReactNode } from 'react'\nimport { MicOff, MoreHorizontal, UserX, Video, VideoOff } from 'lucide-react'\nimport {\n Button,\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { initialsOf } from './layout'\n\nexport interface CallPerson {\n id: string\n name: string\n isLocal: boolean\n micMuted?: boolean\n /** Publishing an unmuted camera (the host may turn it off). */\n cameraOn?: boolean\n /** Talking now, and how loud (0..1): the live speaker list. */\n speaking?: boolean\n level?: number\n /** Extra state after the name (e.g. \"Presenting\"). */\n note?: ReactNode\n /** The person as the app shows people (a pill); else initials and `name`. */\n entity?: ReactNode\n}\n\n/** A small live voice meter: five bars lit by level; \"muted\" when the mic is off. */\nexport function VoiceMeter({\n level,\n muted = false,\n className,\n}: {\n level: number\n muted?: boolean\n className?: string\n}): ReactElement {\n if (muted) {\n return (\n <span className={cn('flex items-center text-red-text', className)} title=\"Microphone off\">\n <MicOff className=\"size-4\" aria-label=\"Microphone off\" />\n </span>\n )\n }\n const lit = Math.round(Math.min(1, Math.max(0, level)) * 5)\n return (\n <span\n className={cn('flex h-4 items-end gap-0.5', className)}\n role=\"meter\"\n aria-label=\"Voice level\"\n aria-valuemin={0}\n aria-valuemax={5}\n aria-valuenow={lit}\n >\n {[0.35, 0.55, 0.75, 0.9, 1].map((h, i) => (\n <span\n key={i}\n className={cn('w-1 rounded-sm', i < lit ? 'bg-theme-cyan' : 'bg-muted-foreground/30')}\n style={{ height: `${h * 100}%` }}\n />\n ))}\n </span>\n )\n}\n\n/**\n * A person's name as the call shows people: the app's pill (`entity`, which says \"(me)\" itself),\n * else initials and the name, with `youLabel` after my own. Every list of people in the call\n * (participants, lobby, webinar audience, Q&A askers) names them through this one piece.\n */\nexport function CallPersonLabel({\n name,\n entity,\n isLocal = false,\n youLabel = '(me)',\n}: {\n name: string\n entity?: ReactNode\n isLocal?: boolean\n youLabel?: string\n}): ReactElement {\n if (entity) return <>{entity}</>\n return (\n <>\n <span\n className=\"flex size-7 shrink-0 items-center justify-center rounded-full bg-primary/10 text-xs font-semibold text-primary\"\n aria-hidden\n >\n {initialsOf(name)}\n </span>\n <span className=\"min-w-0 truncate\">\n {name}\n {isLocal && <span className=\"text-muted-foreground\"> {youLabel}</span>}\n </span>\n </>\n )\n}\n\n/** One participant row: pill, live voice meter, mic / camera state, and the host's \"…\" actions. */\nfunction PersonRow({\n p,\n canRemove,\n removingId,\n onRemove,\n onAskToMute,\n onMute,\n}: {\n p: CallPerson\n canRemove: boolean\n removingId?: string | null\n onRemove(person: CallPerson): void\n onAskToMute?(person: CallPerson): void\n onMute?(person: CallPerson, track: 'audio' | 'video'): void\n}): ReactElement {\n const hasActions =\n !p.isLocal && (canRemove || ((onAskToMute || onMute) && !p.micMuted) || (onMute && p.cameraOn))\n return (\n <li\n className=\"flex h-10 items-center gap-2 rounded-md px-2 hover:bg-muted\"\n data-testid={`call-person-${p.id}`}\n data-speaking={p.speaking || undefined}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5 text-sm\">\n {p.entity ? (\n // The ring hugs the person's pill, not the whole row.\n <span\n className={cn(\n 'inline-flex min-w-0 rounded-full',\n p.speaking && 'ring-2 ring-theme-cyan ring-offset-2 ring-offset-background'\n )}\n >\n {p.entity}\n </span>\n ) : (\n <CallPersonLabel name={p.name} isLocal={p.isLocal} />\n )}\n {p.speaking && <span className=\"sr-only\"> — speaking</span>}\n {p.note && <span className=\"text-xs text-muted-foreground\">{p.note}</span>}\n </span>\n <VoiceMeter level={p.level ?? 0} muted={p.micMuted} />\n <span\n className={cn(\n 'flex w-4 justify-center',\n p.cameraOn ? 'text-muted-foreground' : 'text-red-text'\n )}\n title={p.cameraOn ? 'Camera on' : 'Camera off'}\n >\n {p.cameraOn ? (\n <Video className=\"size-4\" aria-label=\"Camera on\" />\n ) : (\n <VideoOff className=\"size-4\" aria-label=\"Camera off\" />\n )}\n </span>\n {hasActions ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 text-muted-foreground hover:text-foreground\"\n aria-label={`Actions for ${p.name}`}\n data-testid={`call-person-menu-${p.id}`}\n >\n <MoreHorizontal className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n {onAskToMute && !p.micMuted && (\n <DropdownMenuItem\n onSelect={() => onAskToMute(p)}\n data-testid={`call-ask-mute-${p.id}`}\n >\n <MicOff aria-hidden />\n Ask to mute\n </DropdownMenuItem>\n )}\n {onMute && !p.micMuted && (\n <DropdownMenuItem\n onSelect={() => onMute(p, 'audio')}\n data-testid={`call-mute-${p.id}`}\n >\n <MicOff aria-hidden />\n Mute\n </DropdownMenuItem>\n )}\n {onMute && p.cameraOn && (\n <DropdownMenuItem\n onSelect={() => onMute(p, 'video')}\n data-testid={`call-camera-off-${p.id}`}\n >\n <VideoOff aria-hidden />\n Turn off camera\n </DropdownMenuItem>\n )}\n {canRemove && (\n <DropdownMenuItem\n onSelect={() => onRemove(p)}\n disabled={removingId === p.id}\n className=\"text-destructive focus:text-destructive\"\n data-testid={`call-remove-${p.id}`}\n >\n <UserX aria-hidden />\n Remove from call\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : (\n // Keeps every row's meter and icons in the same column.\n <span className=\"size-8 shrink-0\" aria-hidden />\n )}\n </li>\n )\n}\n\n/**\n * Who is in the call, always on show under the video in the call panel: a live speaker list (the\n * app orders it, talkers first), each row with the person's pill, voice meter, mic and camera\n * state, and — for the host — mute / ask to mute / remove in its \"…\". Scrolls when long. In a\n * short panel (`compact`) it folds to one strip — who is talking, and \"Show all (N)\".\n */\nexport function CallParticipants({\n people,\n canRemove,\n removingId,\n onRemove,\n onAskToMute,\n onMute,\n compact = false,\n className,\n}: {\n people: CallPerson[]\n canRemove: boolean\n removingId?: string | null\n onRemove(person: CallPerson): void\n /** Shown for others whose mic is on (the host). */\n onAskToMute?(person: CallPerson): void\n /** The host's force-mute of a mic (`audio`, shown while it is on) or a camera (`video`, while on). */\n onMute?(person: CallPerson, track: 'audio' | 'video'): void\n compact?: boolean\n className?: string\n}): ReactElement {\n const [expanded, setExpanded] = useState(false)\n const rows = (\n <ul className=\"min-h-0 flex-1 overflow-y-auto px-1 pb-2\" data-testid=\"call-people-list\">\n {people.map((p) => (\n <PersonRow\n key={p.id}\n p={p}\n canRemove={canRemove}\n removingId={removingId}\n onRemove={onRemove}\n onAskToMute={onAskToMute}\n onMute={onMute}\n />\n ))}\n </ul>\n )\n const heading = (\n <span className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n People ({people.length})\n </span>\n )\n if (compact && !expanded) {\n const talking = people.filter((p) => p.speaking)\n return (\n <section\n className={cn(\n 'flex h-11 shrink-0 items-center gap-2 border-t border-border px-3',\n className\n )}\n aria-label=\"People\"\n data-testid=\"call-people\"\n data-compact=\"\"\n >\n {heading}\n <span className=\"flex min-w-0 flex-1 items-center gap-1 overflow-hidden\">\n {talking.map((p) => (\n <span key={p.id} className=\"flex shrink-0 items-center\">\n {p.entity ?? p.name}\n </span>\n ))}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 shrink-0\"\n aria-expanded={false}\n onClick={() => setExpanded(true)}\n data-testid=\"call-people-show-all\"\n >\n Show all ({people.length})\n </Button>\n </section>\n )\n }\n return (\n <section\n className={cn(\n 'flex min-h-0 flex-col border-t border-border',\n compact && 'absolute inset-x-0 bottom-0 z-20 max-h-[80%] bg-background shadow-lg',\n className\n )}\n aria-label=\"People\"\n data-testid=\"call-people\"\n >\n <div className=\"flex h-9 shrink-0 items-center justify-between px-3\">\n {heading}\n {compact && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7\"\n aria-expanded\n onClick={() => setExpanded(false)}\n data-testid=\"call-people-show-less\"\n >\n Show less\n </Button>\n )}\n </div>\n {rows}\n </section>\n )\n}\n\nexport interface LobbyRequest {\n id: string\n name: string\n /** The person as the app shows people (a pill); else `name`. */\n entity?: ReactNode\n}\n\n/** People asking to join, as cards over the stage's top-left corner. */\nexport function LobbyRequests({\n requests,\n onDecide,\n}: {\n requests: LobbyRequest[]\n onDecide(id: string, admit: boolean): void\n}): ReactElement | null {\n if (!requests.length) return null\n return (\n <div\n className=\"absolute left-3 top-3 z-10 flex w-72 max-w-[calc(100%-1.5rem)] flex-col gap-2\"\n role=\"region\"\n aria-label=\"Lobby\"\n data-testid=\"call-lobby\"\n >\n {requests.map((k) => (\n <div\n key={k.id}\n className=\"flex items-center gap-3 rounded-md border border-border bg-popover p-3 text-sm text-popover-foreground shadow-lg\"\n data-testid=\"call-lobby-knock\"\n >\n <span className=\"flex min-w-0 flex-1 flex-wrap items-center gap-1\">\n {k.entity ?? <span className=\"font-medium\">{k.name}</span>}\n <span>wants to join.</span>\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8\"\n onClick={() => onDecide(k.id, false)}\n data-testid=\"call-lobby-deny\"\n >\n Deny\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-8\"\n onClick={() => onDecide(k.id, true)}\n data-testid=\"call-lobby-admit\"\n >\n Admit\n </Button>\n </div>\n ))}\n </div>\n )\n}\n","/**\n * The call's small cards: the minimised call (picture-in-picture, so the user keeps working),\n * the incoming-call card, and the waiting / connecting states. Same surfaces as the app's popovers.\n */\n\nimport { useRef, type ReactElement, type ReactNode } from 'react'\nimport {\n Bell,\n BellOff,\n Loader2,\n Maximize2,\n Mic,\n MicOff,\n Phone,\n PhoneOff,\n Video,\n VideoOff,\n} from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { CallControlButton } from './ControlButton'\nimport { useShortcutKeys } from './hooks'\n\n/**\n * The minimised call: the current speaker (their tile, with its voice ring), \"Speaking: …\", the\n * status chips, and my microphone and camera, back to the call, leave.\n */\nexport function MinimisedCall({\n title,\n video,\n status,\n speaking,\n micEnabled,\n onToggleMic,\n cameraEnabled,\n onToggleCamera,\n onRestore,\n onLeave,\n restoreLabel = 'Back to the call',\n shortcuts = true,\n className,\n}: {\n title: string\n /** M / V work on the card too. */\n shortcuts?: boolean\n /** The current speaker's tile; omitted (before the call connects), a phone placeholder. */\n video?: ReactNode\n status?: ReactNode\n /** \"Speaking: …\" (a `SpeakingNow`), shown instead of the title while someone talks. */\n speaking?: ReactNode\n /** Omit (with the toggle) before the call connects. */\n micEnabled?: boolean\n onToggleMic?(): void\n cameraEnabled?: boolean\n onToggleCamera?(): void\n onRestore(): void\n onLeave(): void\n restoreLabel?: string\n className?: string\n}): ReactElement {\n const ref = useRef<HTMLDivElement>(null)\n useShortcutKeys(ref, shortcuts)\n return (\n <div ref={ref} className={cn('flex flex-col', className)} data-testid=\"call-minimised\">\n <button\n type=\"button\"\n className=\"group relative aspect-video w-full overflow-hidden rounded-t-md bg-hero focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\"\n onClick={onRestore}\n aria-label={restoreLabel}\n data-testid=\"call-minimised-restore\"\n >\n <span className=\"call-tile-box absolute inset-0\">\n {video ?? (\n <span className=\"call-tile\">\n <span className=\"call-tile-placeholder\">\n <span className=\"call-tile-avatar call-tile-avatar-sm\">\n <Phone className=\"size-4\" aria-hidden />\n </span>\n </span>\n </span>\n )}\n </span>\n </button>\n <div className=\"flex flex-col gap-2 px-3 py-2\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium\" title={title}>\n {title}\n </span>\n {status && <span className=\"flex shrink-0 items-center gap-1\">{status}</span>}\n </div>\n {speaking}\n <div className=\"flex items-center gap-2\">\n {onToggleMic && micEnabled !== undefined && (\n <CallControlButton\n label={micEnabled ? 'Turn off microphone' : 'Turn on microphone'}\n shortcut=\"M\"\n tone={micEnabled ? 'neutral' : 'off'}\n aria-pressed={micEnabled}\n onClick={onToggleMic}\n className=\"size-8\"\n data-testid=\"call-minimised-mic\"\n data-call-shortcut=\"m\"\n >\n {micEnabled ? <Mic aria-hidden /> : <MicOff aria-hidden />}\n </CallControlButton>\n )}\n {onToggleCamera && cameraEnabled !== undefined && (\n <CallControlButton\n label={cameraEnabled ? 'Turn off camera' : 'Turn on camera'}\n shortcut=\"V\"\n tone={cameraEnabled ? 'neutral' : 'off'}\n aria-pressed={cameraEnabled}\n onClick={onToggleCamera}\n className=\"size-8\"\n data-testid=\"call-minimised-camera\"\n data-call-shortcut=\"v\"\n >\n {cameraEnabled ? <Video aria-hidden /> : <VideoOff aria-hidden />}\n </CallControlButton>\n )}\n <span className=\"flex-1\" />\n <CallControlButton\n label={restoreLabel}\n onClick={onRestore}\n className=\"size-8\"\n data-testid=\"call-dock-expand\"\n >\n <Maximize2 aria-hidden />\n </CallControlButton>\n <CallControlButton\n label=\"Leave call\"\n tone=\"danger\"\n onClick={onLeave}\n className=\"size-8\"\n data-testid=\"call-dock-leave\"\n >\n <PhoneOff aria-hidden />\n </CallControlButton>\n </div>\n </div>\n </div>\n )\n}\n\n/** A ring: who calls, in what context, accept / decline, and the ringtone switch. */\nexport function IncomingCallCard({\n callerName,\n caller,\n context,\n busy = false,\n muted,\n onMutedChange,\n onAccept,\n onDecline,\n className,\n}: {\n callerName: string\n /** The caller as the app shows people (a pill); else `callerName`. */\n caller?: ReactNode\n /** \"is calling you\", \"invites you to a group call\", … */\n context: string\n busy?: boolean\n muted: boolean\n onMutedChange(muted: boolean): void\n onAccept(): void\n onDecline(): void\n className?: string\n}): ReactElement {\n return (\n <div\n role=\"alertdialog\"\n aria-labelledby=\"incoming-call-title\"\n aria-describedby=\"incoming-call-desc\"\n data-testid=\"incoming-call-dialog\"\n className={cn(\n 'w-80 max-w-[calc(100vw-2rem)] rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-xl motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-top-2',\n className\n )}\n >\n <div className=\"flex items-start gap-3\">\n <span className=\"relative flex size-10 shrink-0\" aria-hidden>\n <span className=\"absolute inset-0 rounded-full bg-primary/20 motion-safe:animate-ping\" />\n <span className=\"relative flex size-10 items-center justify-center rounded-full bg-primary/10 text-primary\">\n <Phone className=\"size-5\" />\n </span>\n </span>\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <div id=\"incoming-call-title\" className=\"flex min-w-0 text-sm font-semibold\">\n {caller ?? <span className=\"truncate\">{callerName}</span>}\n {caller && <span className=\"sr-only\">{callerName}</span>}\n </div>\n <p id=\"incoming-call-desc\" className=\"text-xs text-muted-foreground\">\n {context}\n </p>\n </div>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"-mr-1 -mt-1 size-8 shrink-0 text-muted-foreground hover:text-foreground\"\n aria-pressed={muted}\n aria-label={muted ? 'Unmute ringtone' : 'Mute ringtone'}\n title={muted ? 'Unmute ringtone' : 'Mute ringtone'}\n onClick={() => onMutedChange(!muted)}\n data-testid=\"incoming-call-mute\"\n >\n {muted ? <BellOff className=\"size-4\" /> : <Bell className=\"size-4\" />}\n </Button>\n </div>\n <div className=\"mt-4 grid grid-cols-2 gap-2\">\n <Button\n type=\"button\"\n variant=\"destructive\"\n onClick={onDecline}\n disabled={busy}\n data-testid=\"incoming-call-decline\"\n >\n <PhoneOff className=\"size-4\" aria-hidden />\n Decline\n </Button>\n <Button\n type=\"button\"\n onClick={onAccept}\n disabled={busy}\n data-testid=\"incoming-call-accept\"\n autoFocus\n >\n {busy ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Phone className=\"size-4\" aria-hidden />\n )}\n Accept\n </Button>\n </div>\n </div>\n )\n}\n\n/** A centred state on the stage (waiting in the lobby, connecting, a webinar starting soon). */\nexport function CallStateMessage({\n title,\n description,\n spinner = true,\n icon,\n action,\n children,\n testId,\n}: {\n title: string\n description?: string\n spinner?: boolean\n /** Shown instead of the spinner (a calm state that is not loading). */\n icon?: ReactNode\n action?: ReactNode\n /** Extra lines between the description and the action (when, who hosts). */\n children?: ReactNode\n testId?: string\n}): ReactElement {\n return (\n <div\n className=\"flex size-full flex-col items-center justify-center gap-3 p-6 text-center\"\n role=\"status\"\n data-testid={testId}\n >\n {icon ??\n (spinner && <Loader2 className=\"size-6 animate-spin text-muted-foreground\" aria-hidden />)}\n <p className=\"text-base font-semibold\">{title}</p>\n {description && <p className=\"max-w-sm text-sm text-muted-foreground\">{description}</p>}\n {children}\n {action}\n </div>\n )\n}\n\n/** Covers the tiles while (re)connecting. */\nexport function ConnectionOverlay({ label }: { label: string }): ReactElement {\n return (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center rounded-md bg-background/70 text-sm text-muted-foreground\">\n <Loader2 className=\"mr-2 size-4 animate-spin\" aria-hidden />\n {label}\n </div>\n )\n}\n","/** What the pre-join hands the call: microphone / camera on or off, and which devices. */\nimport type { JoinChoices } from '@arbidocs/react'\n\nexport type { JoinChoices }\n\nexport type MediaKind = 'camera' | 'microphone'\n\n/** A readable sentence for a getUserMedia failure (the app may pass a richer one). */\nexport function describeMediaError(err: unknown, kind: MediaKind): string {\n const Kind = kind === 'camera' ? 'Camera' : 'Microphone'\n const name = (err as { name?: string } | null)?.name\n if (name === 'NotAllowedError' || name === 'SecurityError')\n return `${Kind} access is blocked. Allow it in the browser's site settings and try again.`\n if (name === 'NotFoundError' || name === 'OverconstrainedError') return `No ${kind} was found.`\n if (name === 'NotReadableError') return `${Kind} is in use by another app.`\n return `${Kind} could not start${(err as Error)?.message ? `: ${(err as Error).message}` : '.'}`\n}\n","/**\n * PreJoin — device check before entering a call: camera preview, microphone level meter, camera /\n * microphone pickers and on/off toggles. Used when starting a call, joining a scheduled call or a\n * call link. (Answering a ring skips it and joins straight away, microphone on.)\n *\n * Plain getUserMedia — no media library — so it is cheap to show. The preview tracks are stopped on\n * join / unmount; the call opens its own with the chosen devices. Wide: preview left, choices\n * right; narrow: stacked.\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n type ElementType,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { Loader2, Mic, MicOff, Video, VideoOff } from 'lucide-react'\nimport {\n Button,\n cn,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@arbidocs/react/ui'\nimport { CallControlButton } from './ControlButton'\nimport { describeMediaError, type JoinChoices, type MediaKind } from './join-choices'\n\nexport interface PreJoinProps {\n /** The choices the pre-join opens with (`DEFAULT_JOIN_CHOICES` from `@arbidocs/react`). */\n initialChoices: JoinChoices\n /** The call's name, shown above the choices. */\n title?: string | null\n /** Heading of the choices (default \"Ready to join?\"). */\n heading?: string\n /** The heading's element (default `h2`); a dialog passes its `DialogTitle`. */\n headingAs?: ElementType\n /** Extra fields above the join button (optional). */\n children?: ReactNode\n joinLabel?: string\n /** The cancel button's text (default \"Cancel\"). */\n cancelLabel?: string\n busy?: boolean\n /** Shown under the controls (e.g. a join error). */\n error?: string | null\n onJoin(choices: JoinChoices): void\n onCancel?(): void\n /** Mirror the camera preview (a selfie view, the default; only the <video> flips). */\n mirror?: boolean\n /** Turns a device error into a sentence (defaults to {@link describeMediaError}). */\n describeError?(err: unknown, kind: MediaKind): string\n className?: string\n}\n\ntype Kind = 'audioinput' | 'videoinput'\n\nfunction useDevices(kind: Kind, refreshKey: unknown): MediaDeviceInfo[] {\n const [devices, setDevices] = useState<MediaDeviceInfo[]>([])\n useEffect(() => {\n const md = navigator.mediaDevices\n if (!md?.enumerateDevices) return\n let cancelled = false\n const load = () =>\n md\n .enumerateDevices()\n .then((all) => {\n if (!cancelled) setDevices(all.filter((d) => d.kind === kind && d.deviceId))\n })\n .catch(() => {})\n void load()\n md.addEventListener?.('devicechange', load)\n return () => {\n cancelled = true\n md.removeEventListener?.('devicechange', load)\n }\n }, [kind, refreshKey])\n return devices\n}\n\n/** A live preview track for one device kind while `enabled`; errors are reported, not thrown. */\nfunction usePreviewStream(\n kind: Kind,\n enabled: boolean,\n deviceId: string | undefined,\n describe: (err: unknown, kind: MediaKind) => string\n) {\n const [stream, setStream] = useState<MediaStream | null>(null)\n const [error, setError] = useState<string | null>(null)\n const describeRef = useRef(describe)\n describeRef.current = describe\n useEffect(() => {\n if (!enabled) {\n setStream(null)\n return\n }\n const md = navigator.mediaDevices\n if (!md?.getUserMedia) {\n setError(\n window.isSecureContext\n ? 'This browser cannot access the camera or microphone.'\n : 'Camera and microphone need HTTPS (or localhost).'\n )\n return\n }\n let cancelled = false\n let opened: MediaStream | null = null\n const constraint: MediaTrackConstraints | boolean = deviceId\n ? { deviceId: { exact: deviceId } }\n : true\n md.getUserMedia(kind === 'videoinput' ? { video: constraint } : { audio: constraint })\n .then((s) => {\n opened = s\n if (cancelled) s.getTracks().forEach((t) => t.stop())\n else {\n setError(null)\n setStream(s)\n }\n })\n .catch((err: unknown) => {\n if (!cancelled)\n setError(describeRef.current(err, kind === 'videoinput' ? 'camera' : 'microphone'))\n })\n return () => {\n cancelled = true\n opened?.getTracks().forEach((t) => t.stop())\n setStream(null)\n }\n }, [kind, enabled, deviceId])\n return { stream, error }\n}\n\n/** 0..1 input level from an AnalyserNode, sampled every animation frame. */\nfunction useAudioLevel(stream: MediaStream | null): number {\n const [level, setLevel] = useState(0)\n useEffect(() => {\n if (!stream || typeof AudioContext === 'undefined') {\n setLevel(0)\n return\n }\n let ctx: AudioContext\n try {\n ctx = new AudioContext()\n } catch {\n return\n }\n const analyser = ctx.createAnalyser()\n analyser.fftSize = 512\n ctx.createMediaStreamSource(stream).connect(analyser)\n const buf = new Uint8Array(analyser.fftSize)\n let frame = 0\n const tick = () => {\n analyser.getByteTimeDomainData(buf)\n let peak = 0\n for (const v of buf) peak = Math.max(peak, Math.abs(v - 128))\n setLevel(Math.min(1, peak / 64))\n frame = requestAnimationFrame(tick)\n }\n void ctx.resume().catch(() => {})\n tick()\n return () => {\n cancelAnimationFrame(frame)\n void ctx.close().catch(() => {})\n }\n }, [stream])\n return level\n}\n\nfunction DeviceSelect({\n devices,\n value,\n onChange,\n label,\n icon,\n disabled,\n testId,\n}: {\n devices: MediaDeviceInfo[]\n value: string | undefined\n onChange(id: string): void\n label: string\n icon: ReactNode\n disabled?: boolean\n testId: string\n}): ReactElement {\n const current = value ?? devices[0]?.deviceId\n return (\n <div className=\"flex min-w-0 flex-col gap-1.5\">\n <span className=\"flex items-center gap-1.5 text-xs font-medium text-muted-foreground [&_svg]:size-3.5\">\n {icon}\n {label}\n </span>\n <Select value={current} onValueChange={onChange} disabled={disabled || devices.length < 2}>\n <SelectTrigger aria-label={label} className=\"h-9 min-w-0 text-sm\" data-testid={testId}>\n <SelectValue placeholder={`Default ${label.toLowerCase()}`} />\n </SelectTrigger>\n <SelectContent>\n {devices.map((d, i) => (\n <SelectItem key={d.deviceId} value={d.deviceId}>\n {d.label || `${label} ${i + 1}`}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )\n}\n\nexport function PreJoin({\n title,\n heading = 'Ready to join?',\n headingAs: Heading = 'h2',\n children,\n joinLabel = 'Join',\n cancelLabel = 'Cancel',\n busy = false,\n error,\n onJoin,\n onCancel,\n describeError = describeMediaError,\n mirror = true,\n className,\n initialChoices,\n}: PreJoinProps): ReactElement {\n const [choices, setChoices] = useState<JoinChoices>(initialChoices)\n const video = usePreviewStream(\n 'videoinput',\n choices.videoEnabled,\n choices.videoDeviceId,\n describeError\n )\n const audio = usePreviewStream(\n 'audioinput',\n choices.audioEnabled,\n choices.audioDeviceId,\n describeError\n )\n const level = useAudioLevel(audio.stream)\n // Labels appear only after permission is granted: re-enumerate once a stream opens.\n const cameras = useDevices('videoinput', video.stream)\n const mics = useDevices('audioinput', audio.stream)\n const videoRef = useRef<HTMLVideoElement>(null)\n\n useEffect(() => {\n if (videoRef.current) videoRef.current.srcObject = video.stream\n }, [video.stream])\n\n const set = (patch: Partial<JoinChoices>) => setChoices((c) => ({ ...c, ...patch }))\n const deviceError = video.error ?? audio.error\n\n return (\n <div className={cn('@container flex w-full', className)} data-testid=\"call-prejoin\">\n <div className=\"mx-auto grid w-full max-w-4xl items-center gap-6 @2xl:grid-cols-[3fr_2fr] @2xl:gap-8\">\n <div className=\"flex flex-col gap-3\">\n <div className=\"relative aspect-video w-full overflow-hidden rounded-md bg-hero\">\n {choices.videoEnabled && video.stream ? (\n <video\n ref={videoRef}\n autoPlay\n muted\n playsInline\n className={cn('size-full object-cover', mirror && '-scale-x-100')}\n data-testid=\"call-prejoin-video\"\n />\n ) : (\n <div className=\"flex size-full items-center justify-center text-sm text-white/80\">\n {choices.videoEnabled ? (\n <Loader2 className=\"size-5 animate-spin\" aria-label=\"Starting camera\" />\n ) : (\n 'Camera is off'\n )}\n </div>\n )}\n </div>\n <div className=\"flex items-center justify-center gap-3\">\n <CallControlButton\n label={choices.audioEnabled ? 'Turn off microphone' : 'Turn on microphone'}\n tone={choices.audioEnabled ? 'neutral' : 'off'}\n aria-pressed={choices.audioEnabled}\n onClick={() => set({ audioEnabled: !choices.audioEnabled })}\n data-testid=\"call-prejoin-mic-toggle\"\n >\n {choices.audioEnabled ? <Mic aria-hidden /> : <MicOff aria-hidden />}\n </CallControlButton>\n <CallControlButton\n label={choices.videoEnabled ? 'Turn off camera' : 'Turn on camera'}\n tone={choices.videoEnabled ? 'neutral' : 'off'}\n aria-pressed={choices.videoEnabled}\n onClick={() => set({ videoEnabled: !choices.videoEnabled })}\n data-testid=\"call-prejoin-camera-toggle\"\n >\n {choices.videoEnabled ? <Video aria-hidden /> : <VideoOff aria-hidden />}\n </CallControlButton>\n </div>\n </div>\n\n <div className=\"flex min-w-0 flex-col gap-4\">\n <div className=\"flex flex-col gap-1\">\n <Heading className=\"text-xl font-semibold\">{heading}</Heading>\n {title && <p className=\"truncate text-sm text-muted-foreground\">{title}</p>}\n </div>\n\n <div className=\"flex flex-col gap-3\">\n <DeviceSelect\n devices={mics}\n value={choices.audioDeviceId}\n onChange={(id) => set({ audioDeviceId: id })}\n label=\"Microphone\"\n icon={<Mic />}\n disabled={!choices.audioEnabled}\n testId=\"call-prejoin-mic-select\"\n />\n <div\n className=\"h-1.5 w-full overflow-hidden rounded-full bg-muted\"\n role=\"meter\"\n aria-label=\"Microphone level\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(level * 100)}\n data-testid=\"call-prejoin-mic-level\"\n >\n <div\n className=\"h-full bg-primary transition-[width] duration-75 motion-reduce:transition-none\"\n style={{ width: `${Math.round(level * 100)}%` }}\n />\n </div>\n <DeviceSelect\n devices={cameras}\n value={choices.videoDeviceId}\n onChange={(id) => set({ videoDeviceId: id })}\n label=\"Camera\"\n icon={<Video />}\n disabled={!choices.videoEnabled}\n testId=\"call-prejoin-camera-select\"\n />\n </div>\n\n {children}\n\n {(error || deviceError) && (\n <p role=\"alert\" className=\"text-sm text-destructive\" data-testid=\"call-prejoin-error\">\n {error ?? deviceError}\n </p>\n )}\n\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n className=\"flex-1\"\n disabled={busy}\n onClick={() => onJoin(choices)}\n data-testid=\"call-prejoin-join\"\n >\n {busy && <Loader2 className=\"size-4 animate-spin\" aria-hidden />}\n {joinLabel}\n </Button>\n {onCancel && (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onCancel}\n disabled={busy}\n data-testid=\"call-prejoin-cancel\"\n >\n {cancelLabel}\n </Button>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n","/**\n * The attendee's holding screen: \"Starting soon\" before the host goes live (the app keeps polling\n * and joins on its own), and \"This webinar has ended\" after. A `CallStateMessage`, so it reads like\n * every other state of the call stage.\n */\n\nimport type { ReactElement, ReactNode } from 'react'\nimport { CalendarCheck } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { CallStateMessage } from '../cards'\n\nexport interface WebinarWaitingProps {\n variant: 'waiting' | 'ended'\n /** The webinar's name. */\n title?: string | null\n /** When it is scheduled, already formatted by the app (\"Today, 15:00\"). */\n when?: string | null\n /** The host as the app shows people (a pill): \"Hosted by …\". */\n host?: ReactNode\n /** A way out (back to the app); omitted, no button. */\n onLeave?(): void\n leaveLabel?: string\n}\n\nexport function WebinarWaiting({\n variant,\n title,\n when,\n host,\n onLeave,\n leaveLabel = 'Leave',\n}: WebinarWaitingProps): ReactElement {\n const waiting = variant === 'waiting'\n return (\n <CallStateMessage\n title={waiting ? 'Starting soon' : 'This webinar has ended'}\n description={\n waiting\n ? \"The host hasn't gone live yet. You'll join automatically when the webinar starts.\"\n : 'Thanks for attending.'\n }\n spinner={waiting}\n icon={\n waiting ? undefined : <CalendarCheck className=\"size-6 text-muted-foreground\" aria-hidden />\n }\n testId={waiting ? 'webinar-waiting' : 'webinar-ended'}\n action={\n onLeave && (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={onLeave}\n data-testid=\"webinar-waiting-leave\"\n >\n {leaveLabel}\n </Button>\n )\n }\n >\n {(title || when || host) && (\n <div className=\"flex max-w-sm flex-col items-center gap-1 text-sm\">\n {title && (\n <p className=\"font-medium\" data-testid=\"webinar-waiting-title\">\n {title}\n </p>\n )}\n {when && (\n <p className=\"text-muted-foreground\" data-testid=\"webinar-waiting-when\">\n {when}\n </p>\n )}\n {host && (\n <p\n className=\"flex flex-wrap items-center justify-center gap-1 text-muted-foreground\"\n data-testid=\"webinar-waiting-host\"\n >\n <span>Hosted by</span>\n {host}\n </p>\n )}\n </div>\n )}\n </CallStateMessage>\n )\n}\n","/** Small hooks of the webinar blocks. */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { MaybePromise } from './types'\n\n/**\n * Pending state for handlers that may return a promise: `run(key, fn)` marks `key` busy until the\n * promise settles and resolves to whether it succeeded (a rejection is the app's to report; the\n * block only stops spinning).\n */\nexport function usePending(): {\n isPending(key: string): boolean\n run(key: string, fn: () => MaybePromise): Promise<boolean>\n} {\n const [keys, setKeys] = useState<ReadonlySet<string>>(() => new Set())\n const mounted = useRef(true)\n useEffect(() => {\n mounted.current = true\n return () => {\n mounted.current = false\n }\n }, [])\n const set = useCallback((key: string, on: boolean) => {\n if (!mounted.current) return\n setKeys((prev) => {\n if (prev.has(key) === on) return prev\n const next = new Set(prev)\n if (on) next.add(key)\n else next.delete(key)\n return next\n })\n }, [])\n const run = useCallback(\n async (key: string, fn: () => MaybePromise) => {\n let result: MaybePromise\n try {\n result = fn()\n } catch {\n return false\n }\n if (!result || typeof (result as Promise<unknown>).then !== 'function') return true\n set(key, true)\n try {\n await result\n return true\n } catch {\n return false\n } finally {\n set(key, false)\n }\n },\n [set]\n )\n const isPending = useCallback((key: string) => keys.has(key), [keys])\n return { isPending, run }\n}\n\n/** The current time, refreshed every `ms` (relative times like \"2 minutes ago\"). */\nexport function useNow(ms = 30_000, fixed?: Date): Date {\n const [now, setNow] = useState(() => new Date())\n const ticking = !fixed\n useEffect(() => {\n if (!ticking) return\n const id = setInterval(() => setNow(new Date()), ms)\n return () => clearInterval(id)\n }, [ms, ticking])\n return fixed ?? now\n}\n","/**\n * Backstage → live → ended, for the team. While backstage, `BackstageBanner` (under the header)\n * says so and carries Go live for the moderators; once live, the header shows `WebinarLiveChip` and\n * the control bar `WebinarLiveControl` (End webinar, confirmed). Each action appears once: Go live\n * only in the banner, End only in the bar.\n */\n\nimport { useState, type ReactElement } from 'react'\nimport { EyeOff, Loader2, Radio, SquareX } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { ConfirmDialog } from '../../provider/dialogs'\nimport { CallStatusChip } from '../ControlButton'\nimport { usePending } from './hooks'\nimport type { MaybePromise } from './types'\n\n/** \"Live\" in the header while the stage is open to the audience. */\nexport function WebinarLiveChip({\n compact = false,\n className,\n}: {\n compact?: boolean\n className?: string\n}): ReactElement {\n return (\n <CallStatusChip\n tone=\"red\"\n icon={<Radio className=\"size-3.5 shrink-0\" aria-hidden />}\n label=\"Live\"\n compact={compact}\n title=\"Live: attendees see and hear the stage\"\n role=\"status\"\n className={className}\n testId=\"webinar-live-chip\"\n />\n )\n}\n\nexport interface WebinarLiveControlProps {\n /** The stage is open to the audience. */\n live: boolean\n /** Moderators only: opens the stage (shown while backstage). */\n onGoLive?(): MaybePromise\n /** Moderators only: ends the webinar for everyone, after a confirmation (shown while live). */\n onEnd?(): MaybePromise\n /** Icon only (a narrow bar). */\n compact?: boolean\n className?: string\n}\n\n/** Go live (backstage) or End webinar (live); nothing for someone who may do neither. */\nexport function WebinarLiveControl({\n live,\n onGoLive,\n onEnd,\n compact = false,\n className,\n}: WebinarLiveControlProps): ReactElement | null {\n const { isPending, run } = usePending()\n const [confirming, setConfirming] = useState(false)\n if (!live) {\n if (!onGoLive) return null\n const busy = isPending('live')\n return (\n <Button\n type=\"button\"\n size={compact ? 'icon' : 'sm'}\n className={cn('h-8 shrink-0', !compact && 'px-3', className)}\n disabled={busy}\n aria-label=\"Go live\"\n title=\"Go live: let attendees see and hear the stage\"\n onClick={() => void run('live', onGoLive)}\n data-testid=\"webinar-go-live\"\n >\n {busy ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Radio className=\"size-4\" aria-hidden />\n )}\n {!compact && 'Go live'}\n </Button>\n )\n }\n if (!onEnd) return null\n return (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n size={compact ? 'icon' : 'default'}\n className={cn(\n 'shrink-0 border-red-border text-red-text hover:bg-red-bg hover:text-red-text',\n !compact && 'px-4',\n className\n )}\n aria-label=\"End webinar\"\n title=\"End webinar for everyone\"\n onClick={() => setConfirming(true)}\n data-testid=\"webinar-end\"\n >\n <SquareX className=\"size-4\" aria-hidden />\n {!compact && 'End webinar'}\n </Button>\n <WebinarEndConfirm open={confirming} onOpenChange={setConfirming} onEnd={onEnd} />\n </>\n )\n}\n\n/**\n * \"End the webinar?\" — the one confirmation before ending it for everyone, wherever End is offered\n * (`WebinarLiveControl`, or the Leave button's menu in the app's call bar).\n */\nexport function WebinarEndConfirm({\n open,\n onOpenChange,\n onEnd,\n}: {\n open: boolean\n onOpenChange(open: boolean): void\n onEnd(): MaybePromise\n}): ReactElement {\n const { isPending, run } = usePending()\n const ending = isPending('end')\n return (\n <ConfirmDialog\n isOpen={open}\n onClose={() => onOpenChange(false)}\n onConfirm={() =>\n void run('end', onEnd).then((ok) => {\n if (ok) onOpenChange(false)\n })\n }\n title=\"End the webinar?\"\n description=\"Everyone leaves, attendees and panelists alike. The stage closes and cannot be reopened in this session.\"\n confirmText=\"End webinar\"\n isLoading={ending}\n testId=\"webinar-end-confirm\"\n testIds={{ cancel: 'webinar-end-cancel', confirm: 'webinar-end-confirm-button' }}\n />\n )\n}\n\n/**\n * Under the header while backstage: the team knows the audience cannot see or hear them yet.\n * Moderators get Go live here (`onGoLive`); other panelists read that the host will start it.\n */\nexport function BackstageBanner({\n onGoLive,\n className,\n}: {\n onGoLive?(): MaybePromise\n className?: string\n}): ReactElement {\n return (\n <div\n className={cn(\n 'flex min-h-10 min-w-0 items-center gap-2 rounded-md border border-yellow-border bg-yellow-bg py-1 pl-3 pr-1 text-sm text-yellow-text',\n className\n )}\n role=\"status\"\n data-testid=\"webinar-backstage\"\n >\n <EyeOff className=\"size-4 shrink-0\" aria-hidden />\n <span className=\"min-w-0 flex-1\">\n <span className=\"font-medium\">Backstage</span>\n {\" — attendees can't see or hear you yet\"}\n {!onGoLive && <span className=\"text-yellow-text/80\">. The host goes live when ready.</span>}\n </span>\n {onGoLive && <WebinarLiveControl live={false} onGoLive={onGoLive} />}\n </div>\n )\n}\n","/** Raise / lower my hand: one control-bar button, on (solid) while the hand is up. */\n\nimport type { ReactElement } from 'react'\nimport { Hand } from 'lucide-react'\nimport { CallControlButton } from '../ControlButton'\nimport { usePending } from './hooks'\nimport type { MaybePromise } from './types'\n\nexport interface RaiseHandButtonProps {\n raised: boolean\n /** Asked with the new state (`true` = raise). */\n onToggle(raised: boolean): MaybePromise\n /** Busy from outside (the app's own request in flight). */\n pending?: boolean\n /** Press-shortcut inside a `CallControlBar` (default H). */\n shortcut?: string\n className?: string\n}\n\nexport function RaiseHandButton({\n raised,\n onToggle,\n pending = false,\n shortcut = 'H',\n className,\n}: RaiseHandButtonProps): ReactElement {\n const { isPending, run } = usePending()\n const busy = pending || isPending('hand')\n return (\n <CallControlButton\n label={raised ? 'Lower hand' : 'Raise hand'}\n shortcut={shortcut}\n tone={raised ? 'active' : 'neutral'}\n aria-pressed={raised}\n disabled={busy}\n aria-busy={busy || undefined}\n onClick={() => void run('hand', () => onToggle(!raised))}\n className={className}\n data-testid=\"webinar-raise-hand\"\n data-raised={raised}\n data-call-shortcut={shortcut.toLowerCase()}\n >\n <Hand aria-hidden />\n </CallControlButton>\n )\n}\n","/**\n * The moderators' audience view, the body of a `CallSidePanel` (its Audience tab): the raised\n * hands, oldest first, each with Promote; then everyone in the room with their stage state, Promote\n * or Move to audience. Only moderators get this; an attendee's UI never lists attendees.\n */\n\nimport { useMemo, useState, type ReactElement, type ReactNode } from 'react'\nimport { Hand, Loader2, Search } from 'lucide-react'\nimport { Button, cn, Input } from '@arbidocs/react/ui'\nimport { formatRelativeTime } from '@arbidocs/react/ui'\nimport { CallPersonLabel } from '../panels'\nimport { useNow, usePending } from './hooks'\nimport type { MaybePromise, WebinarAttendee, WebinarHand, WebinarRole } from './types'\n\nconst ROLE_NOTE: Record<WebinarRole, string | null> = {\n host: 'Host',\n cohost: 'Co-host',\n panelist: 'Panelist',\n attendee: null,\n}\n\nexport interface WebinarAudiencePanelProps {\n /** Raised hands (any order: shown oldest first). */\n hands: WebinarHand[]\n /** Everyone in the room, team included (the app's order). */\n attendees: WebinarAttendee[]\n /** Bring someone on stage. */\n onPromote(id: string): MaybePromise\n /** Send someone on stage back to the audience (never offered for the host). */\n onDemote(id: string): MaybePromise\n /** A search field appears above the attendees when there are more than this many (default 8). */\n searchThreshold?: number\n /** \"Now\" for the raised times (tests); live by default. */\n now?: Date\n className?: string\n}\n\nfunction SectionTitle({ children }: { children: ReactNode }): ReactElement {\n return (\n <h3 className=\"flex items-center gap-1.5 px-2 pb-1 pt-3 text-xs font-medium text-muted-foreground\">\n {children}\n </h3>\n )\n}\n\nfunction Row({ testId, children }: { testId: string; children: ReactNode }): ReactElement {\n return (\n <li\n className=\"flex min-h-11 items-center gap-3 rounded-md px-2 py-1 hover:bg-muted\"\n data-testid={testId}\n >\n {children}\n </li>\n )\n}\n\nexport function WebinarAudiencePanel({\n hands,\n attendees,\n onPromote,\n onDemote,\n searchThreshold = 8,\n now: fixedNow,\n className,\n}: WebinarAudiencePanelProps): ReactElement {\n const now = useNow(30_000, fixedNow)\n const { isPending, run } = usePending()\n const [query, setQuery] = useState('')\n const queue = useMemo(\n () => [...hands].sort((a, b) => Date.parse(a.raisedAt) - Date.parse(b.raisedAt)),\n [hands]\n )\n const searchable = attendees.length > searchThreshold\n const q = searchable ? query.trim().toLowerCase() : ''\n const shown = q ? attendees.filter((a) => a.name.toLowerCase().includes(q)) : attendees\n\n // One request per person: the hand queue's Promote and the list's share the pending state.\n const action = (id: string, name: string, promote: boolean, where: 'hand' | 'list') => {\n const key = `${promote ? 'promote' : 'demote'}:${id}`\n const busy = isPending(key)\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 shrink-0\"\n disabled={busy}\n aria-label={promote ? `Promote ${name} to the stage` : `Move ${name} to the audience`}\n onClick={() => void run(key, () => (promote ? onPromote(id) : onDemote(id)))}\n data-testid={`webinar-${where === 'hand' ? 'hand-' : ''}${promote ? 'promote' : 'demote'}-${id}`}\n >\n {busy && <Loader2 className=\"size-4 animate-spin\" aria-hidden />}\n {promote ? 'Promote' : 'Move to audience'}\n </Button>\n )\n }\n\n return (\n <div\n className={cn('min-h-0 flex-1 overflow-y-auto px-2 pb-2', className)}\n data-testid=\"webinar-audience\"\n >\n <section aria-label=\"Raised hands\">\n <SectionTitle>\n <Hand className=\"size-3.5\" aria-hidden />\n Raised hands ({queue.length})\n </SectionTitle>\n {queue.length === 0 ? (\n <p className=\"px-2 py-2 text-sm text-muted-foreground\" data-testid=\"webinar-hands-empty\">\n No hands raised.\n </p>\n ) : (\n <ol>\n {queue.map((h) => (\n <Row key={h.id} testId={`webinar-hand-${h.id}`}>\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"flex min-w-0 items-center gap-1.5 text-sm\">\n <CallPersonLabel name={h.name} entity={h.entity} />\n </span>\n <span className=\"text-xs text-muted-foreground\">\n Raised {formatRelativeTime(h.raisedAt, { now: now.getTime() })}\n </span>\n </span>\n {action(h.id, h.name, true, 'hand')}\n </Row>\n ))}\n </ol>\n )}\n </section>\n\n <section aria-label=\"Attendees\">\n <SectionTitle>Attendees ({attendees.length})</SectionTitle>\n {searchable && (\n <div className=\"relative px-2 pb-1\">\n <Search\n className=\"pointer-events-none absolute left-4.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\"\n aria-hidden\n />\n <Input\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Find someone\"\n aria-label=\"Find an attendee\"\n className=\"h-8 pl-8 text-sm\"\n data-testid=\"webinar-attendee-search\"\n />\n </div>\n )}\n {shown.length === 0 ? (\n <p\n className=\"px-2 py-2 text-sm text-muted-foreground\"\n data-testid=\"webinar-attendees-empty\"\n >\n {q ? `No one matches “${query.trim()}”.` : 'No attendees yet.'}\n </p>\n ) : (\n <ul>\n {shown.map((a) => {\n const note = ROLE_NOTE[a.role]\n return (\n <Row key={a.id} testId={`webinar-attendee-${a.id}`}>\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5 text-sm\">\n <CallPersonLabel name={a.name} entity={a.entity} />\n {(note || a.onStage) && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n {[note, a.onStage ? 'On stage' : null].filter(Boolean).join(' · ')}\n </span>\n )}\n </span>\n {a.handRaised && (\n <Hand\n className=\"size-4 shrink-0 text-primary\"\n aria-label=\"Hand raised\"\n data-testid={`webinar-attendee-hand-${a.id}`}\n />\n )}\n {/* A raised hand's Promote is in the queue above: here only its hand shows. */}\n {a.onStage\n ? a.role !== 'host' && action(a.id, a.name, false, 'list')\n : !a.handRaised && action(a.id, a.name, true, 'list')}\n </Row>\n )\n })}\n </ul>\n )}\n </section>\n </div>\n )\n}\n","/**\n * The webinar's Q&A, the body of a `CallSidePanel` (the attendee viewer's side, the team's Q&A tab):\n * Open / Answered (and, for the team, Dismissed) questions, most upvoted first; an upvote toggle on\n * each (never on my own); status chips (\"Answering live\", \"Answered\") and a text answer under the\n * question. The team answers live, answers in text (an inline composer), marks answered,\n * dismisses or reopens. The ask box sits at the bottom, like a chat composer.\n *\n * Askers are named through the app's pill (`asker`); another attendee's question is \"Attendee\"\n * (the server hides who asked it), so attendees never learn who else attends.\n */\n\nimport { useMemo, useState, type KeyboardEvent, type ReactElement, type ReactNode } from 'react'\nimport {\n CheckCheck,\n ChevronUp,\n Loader2,\n MessageSquareText,\n MoreHorizontal,\n Radio,\n RotateCcw,\n Send,\n Trash2,\n X,\n} from 'lucide-react'\nimport {\n Button,\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Textarea,\n} from '@arbidocs/react/ui'\nimport { formatRelativeTime } from '@arbidocs/react/ui'\nimport { CallStatusChip } from '../ControlButton'\nimport { CallPersonLabel } from '../panels'\nimport { useNow, usePending } from './hooks'\nimport type { MaybePromise, QuestionStatus, WebinarQuestion } from './types'\n\nexport type QAFilter = 'open' | 'answered' | 'dismissed'\n\nexport interface QAPanelProps {\n questions: WebinarQuestion[]\n /** A team member (host, co-host, panelist): moderates, and sees dismissed questions. */\n team?: boolean\n /** The ask box's limit (default 500 characters). */\n maxLength?: number\n /** Hide the ask box (e.g. before the webinar is live). */\n canAsk?: boolean\n /** Resolve to clear the box; reject to keep the text (the app reports the error). */\n onAsk(body: string): MaybePromise\n /** `up` = add my vote, else take it back. */\n onVote(question: WebinarQuestion, up: boolean): MaybePromise\n /** Team: Answer live (`answering`), Mark answered, Dismiss, Reopen (`open`). */\n onStatusChange?(question: WebinarQuestion, status: QuestionStatus): MaybePromise\n /** Team: a text answer (the server marks the question answered). */\n onAnswer?(question: WebinarQuestion, answer: string): MaybePromise\n /** Delete one of my own questions while it is still open. */\n onDelete?(question: WebinarQuestion): MaybePromise\n /** The filter to start on (default Open). */\n defaultFilter?: QAFilter\n /** \"Now\" for the asked times (tests); live by default. */\n now?: Date\n className?: string\n}\n\nconst DEFAULT_MAX = 500\n\n/** Questions of a filter, in reading order: live first, then most upvoted, then oldest. */\nexport function sortQuestions(questions: WebinarQuestion[], filter: QAFilter): WebinarQuestion[] {\n const match = (s: QuestionStatus) =>\n filter === 'open' ? s === 'open' || s === 'answering' : s === filter\n return questions\n .filter((q) => match(q.status))\n .sort(\n (a, b) =>\n Number(b.status === 'answering') - Number(a.status === 'answering') ||\n b.voteCount - a.voteCount ||\n Date.parse(a.createdAt) - Date.parse(b.createdAt)\n )\n}\n\n/**\n * A text box with a counter and a send button; Enter sends, Shift+Enter breaks the line. The ask\n * box and the text answer here, and the webinar's live chat in the same side panel.\n */\nexport function PanelComposer({\n placeholder,\n ariaLabel,\n sendLabel,\n maxLength,\n busy,\n onSend,\n onCancel,\n autoFocus,\n testId,\n}: {\n placeholder: string\n ariaLabel: string\n sendLabel: string\n maxLength: number\n busy: boolean\n /** Resolves to whether it went (then the box clears). */\n onSend(text: string): Promise<boolean>\n onCancel?(): void\n autoFocus?: boolean\n testId: string\n}): ReactElement {\n const [text, setText] = useState('')\n const body = text.trim()\n const canSend = !!body && body.length <= maxLength && !busy\n const send = () => {\n if (!canSend) return\n void onSend(body).then((ok) => {\n if (ok) setText('')\n })\n }\n const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault()\n send()\n } else if (e.key === 'Escape' && onCancel) {\n e.preventDefault()\n onCancel()\n }\n }\n return (\n <div className=\"flex flex-col gap-1.5\" data-testid={testId}>\n <Textarea\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n aria-label={ariaLabel}\n maxLength={maxLength}\n rows={2}\n disabled={busy}\n autoFocus={autoFocus}\n className=\"min-h-[60px] resize-none\"\n data-testid={`${testId}-input`}\n />\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'flex-1 text-xs tabular-nums text-muted-foreground',\n text.length >= maxLength && 'text-red-text'\n )}\n aria-live=\"polite\"\n data-testid={`${testId}-count`}\n >\n {text.length}/{maxLength}\n </span>\n {onCancel && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8\"\n onClick={onCancel}\n disabled={busy}\n data-testid={`${testId}-cancel`}\n >\n Cancel\n </Button>\n )}\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-8\"\n onClick={send}\n disabled={!canSend}\n data-testid={`${testId}-send`}\n >\n {busy ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Send className=\"size-4\" aria-hidden />\n )}\n {sendLabel}\n </Button>\n </div>\n </div>\n )\n}\n\ninterface TeamAction {\n key: string\n label: string\n icon: ReactNode\n run(): MaybePromise\n destructive?: boolean\n}\n\nfunction QuestionItem({\n q,\n team,\n now,\n maxLength,\n pending,\n run,\n onVote,\n onStatusChange,\n onAnswer,\n onDelete,\n}: {\n q: WebinarQuestion\n team: boolean\n now: Date\n maxLength: number\n pending(key: string): boolean\n run(key: string, fn: () => MaybePromise): Promise<boolean>\n onVote: QAPanelProps['onVote']\n onStatusChange?: QAPanelProps['onStatusChange']\n onAnswer?: QAPanelProps['onAnswer']\n onDelete?: QAPanelProps['onDelete']\n}): ReactElement {\n const [answering, setAnswering] = useState(false)\n const voteKey = `vote:${q.id}`\n const statusKey = `status:${q.id}`\n const answerKey = `answer:${q.id}`\n const busy = pending(statusKey) || pending(answerKey) || pending(`delete:${q.id}`)\n\n const setStatus = (status: QuestionStatus) => () =>\n onStatusChange ? onStatusChange(q, status) : undefined\n const can = team && !!onStatusChange\n // The one prominent next step of the question's state; the rest sit in its menu.\n const primary: TeamAction | null = !can\n ? null\n : q.status === 'open'\n ? { key: 'live', label: 'Answer live', icon: <Radio />, run: setStatus('answering') }\n : q.status === 'answering'\n ? {\n key: 'answered',\n label: 'Mark answered',\n icon: <CheckCheck />,\n run: setStatus('answered'),\n }\n : { key: 'reopen', label: 'Reopen', icon: <RotateCcw />, run: setStatus('open') }\n const more: TeamAction[] = [\n ...(can && q.status === 'open'\n ? [\n {\n key: 'answered',\n label: 'Mark answered',\n icon: <CheckCheck />,\n run: setStatus('answered'),\n },\n ]\n : []),\n ...(can && q.status === 'answering'\n ? [{ key: 'reopen', label: 'Reopen', icon: <RotateCcw />, run: setStatus('open') }]\n : []),\n ...(can && q.status !== 'dismissed'\n ? [{ key: 'dismiss', label: 'Dismiss', icon: <X />, run: setStatus('dismissed') }]\n : []),\n ...(q.mine && q.status === 'open' && onDelete\n ? [\n {\n key: 'delete',\n label: 'Delete question',\n icon: <Trash2 />,\n run: () => onDelete(q),\n destructive: true,\n },\n ]\n : []),\n ]\n const canAnswerInText = team && !!onAnswer && !q.answer && q.status !== 'dismissed'\n\n return (\n <li\n className=\"flex gap-2 rounded-md border border-border p-2\"\n data-testid={`webinar-question-${q.id}`}\n data-status={q.status}\n >\n <Button\n type=\"button\"\n variant=\"ghost\"\n className={cn(\n 'h-auto w-10 shrink-0 flex-col gap-0 self-start px-0 py-1 text-xs tabular-nums',\n q.voted ? 'bg-primary/10 text-primary hover:bg-primary/15' : 'text-muted-foreground'\n )}\n aria-pressed={q.voted}\n aria-label={\n q.mine\n ? `${q.voteCount} upvotes (your question)`\n : q.voted\n ? `Remove upvote (${q.voteCount})`\n : `Upvote (${q.voteCount})`\n }\n title={q.mine ? \"You can't upvote your own question\" : undefined}\n disabled={q.mine || pending(voteKey)}\n onClick={() => void run(voteKey, () => onVote(q, !q.voted))}\n data-testid={`webinar-question-vote-${q.id}`}\n >\n <ChevronUp className=\"size-4\" aria-hidden />\n <span data-testid={`webinar-question-votes-${q.id}`}>{q.voteCount}</span>\n </Button>\n\n <div className=\"flex min-w-0 flex-1 flex-col gap-1.5\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs text-muted-foreground\">\n <span\n className=\"flex min-w-0 items-center gap-1.5 text-sm text-foreground\"\n data-testid={`webinar-question-asker-${q.id}`}\n >\n {q.askerName === null && !q.asker ? (\n <span className=\"text-muted-foreground\">Attendee</span>\n ) : (\n <CallPersonLabel name={q.askerName ?? ''} entity={q.asker} isLocal={q.mine} />\n )}\n </span>\n <time dateTime={q.createdAt}>\n {formatRelativeTime(q.createdAt, { now: now.getTime() })}\n </time>\n {q.status === 'answering' && (\n <CallStatusChip\n tone=\"red\"\n icon={<Radio className=\"size-3.5 shrink-0\" aria-hidden />}\n label=\"Answering live\"\n testId={`webinar-question-live-${q.id}`}\n />\n )}\n {q.status === 'answered' && (\n <CallStatusChip\n tone=\"green\"\n icon={<CheckCheck className=\"size-3.5 shrink-0\" aria-hidden />}\n label=\"Answered\"\n testId={`webinar-question-answered-${q.id}`}\n />\n )}\n {q.status === 'dismissed' && <CallStatusChip tone=\"neutral\" label=\"Dismissed\" />}\n </div>\n\n <p\n className=\"whitespace-pre-wrap break-words text-sm\"\n data-testid={`webinar-question-body-${q.id}`}\n >\n {q.body}\n </p>\n\n {q.answer && (\n <div\n className=\"flex flex-col gap-1 rounded-md bg-muted px-2.5 py-2 text-sm\"\n data-testid={`webinar-question-answer-${q.id}`}\n >\n <span className=\"flex min-w-0 items-center gap-1.5 text-xs font-medium text-muted-foreground\">\n Answer\n {q.answeredBy}\n </span>\n <p className=\"whitespace-pre-wrap break-words\">{q.answer}</p>\n </div>\n )}\n\n {answering && onAnswer && (\n <PanelComposer\n placeholder=\"Write an answer\"\n ariaLabel=\"Answer in text\"\n sendLabel=\"Send answer\"\n maxLength={maxLength}\n busy={pending(answerKey)}\n autoFocus\n onSend={(text) =>\n run(answerKey, () => onAnswer(q, text)).then((ok) => {\n if (ok) setAnswering(false)\n return ok\n })\n }\n onCancel={() => setAnswering(false)}\n testId={`webinar-answer-${q.id}`}\n />\n )}\n\n {(primary || canAnswerInText || more.length > 0) && !answering && (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {primary && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 gap-1.5 px-2 text-xs [&_svg]:size-3.5\"\n disabled={busy}\n onClick={() => void run(statusKey, primary.run)}\n data-testid={`webinar-question-${primary.key}-${q.id}`}\n >\n {pending(statusKey) ? (\n <Loader2 className=\"animate-spin\" aria-hidden />\n ) : (\n primary.icon\n )}\n {primary.label}\n </Button>\n )}\n {canAnswerInText && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 gap-1.5 px-2 text-xs [&_svg]:size-3.5\"\n disabled={busy}\n onClick={() => setAnswering(true)}\n data-testid={`webinar-question-answer-text-${q.id}`}\n >\n <MessageSquareText aria-hidden />\n Answer in text\n </Button>\n )}\n {more.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"ml-auto size-7 text-muted-foreground hover:text-foreground\"\n aria-label=\"More question actions\"\n disabled={busy}\n data-testid={`webinar-question-menu-${q.id}`}\n >\n <MoreHorizontal className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n {more.map((a) => (\n <DropdownMenuItem\n key={a.key}\n onSelect={() =>\n void run(a.key === 'delete' ? `delete:${q.id}` : statusKey, a.run)\n }\n className={cn(a.destructive && 'text-destructive focus:text-destructive')}\n data-testid={`webinar-question-${a.key}-${q.id}`}\n >\n {a.icon}\n {a.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n )}\n </div>\n </li>\n )\n}\n\nconst EMPTY: Record<QAFilter, { team: string; audience: string }> = {\n open: {\n team: 'Questions from the audience appear here.',\n audience: 'No questions yet. Ask the first one.',\n },\n answered: { team: 'No answered questions yet.', audience: 'No answered questions yet.' },\n dismissed: { team: 'Nothing dismissed.', audience: 'Nothing dismissed.' },\n}\n\nexport function QAPanel({\n questions,\n team = false,\n maxLength = DEFAULT_MAX,\n canAsk = true,\n onAsk,\n onVote,\n onStatusChange,\n onAnswer,\n onDelete,\n defaultFilter = 'open',\n now: fixedNow,\n className,\n}: QAPanelProps): ReactElement {\n const now = useNow(30_000, fixedNow)\n const { isPending, run } = usePending()\n const [filter, setFilter] = useState<QAFilter>(\n defaultFilter === 'dismissed' && !team ? 'open' : defaultFilter\n )\n const filters: { id: QAFilter; label: string }[] = [\n { id: 'open', label: 'Open' },\n { id: 'answered', label: 'Answered' },\n ...(team ? [{ id: 'dismissed' as const, label: 'Dismissed' }] : []),\n ]\n const lists = useMemo(\n () => ({\n open: sortQuestions(questions, 'open'),\n answered: sortQuestions(questions, 'answered'),\n // Dismissed questions are the team's business only.\n dismissed: team ? sortQuestions(questions, 'dismissed') : [],\n }),\n [questions, team]\n )\n const shown = lists[filter]\n\n return (\n <div className={cn('flex min-h-0 flex-1 flex-col', className)} data-testid=\"webinar-qa\">\n <Tabs\n value={filter}\n onValueChange={(v) => setFilter(v as QAFilter)}\n className=\"flex min-h-0 flex-1 flex-col\"\n >\n <div className=\"shrink-0 px-3 pt-3\">\n <TabsList className=\"h-8 w-full\">\n {filters.map((f) => (\n <TabsTrigger\n key={f.id}\n value={f.id}\n className=\"h-6 flex-1 gap-1.5 px-2 text-xs\"\n data-testid={`webinar-qa-filter-${f.id}`}\n >\n {f.label}\n <span className=\"tabular-nums text-muted-foreground\">{lists[f.id].length}</span>\n </TabsTrigger>\n ))}\n </TabsList>\n </div>\n <TabsContent value={filter} className=\"mt-0 min-h-0 flex-1 overflow-y-auto p-3\">\n {shown.length === 0 ? (\n <p\n className=\"py-6 text-center text-sm text-muted-foreground\"\n data-testid=\"webinar-qa-empty\"\n >\n {filter === 'open' && questions.length > 0\n ? 'No open questions right now.'\n : EMPTY[filter][team ? 'team' : 'audience']}\n </p>\n ) : (\n <ol className=\"flex flex-col gap-2\">\n {shown.map((q) => (\n <QuestionItem\n key={q.id}\n q={q}\n team={team}\n now={now}\n maxLength={maxLength}\n pending={isPending}\n run={run}\n onVote={onVote}\n onStatusChange={onStatusChange}\n onAnswer={onAnswer}\n onDelete={onDelete}\n />\n ))}\n </ol>\n )}\n </TabsContent>\n </Tabs>\n {canAsk && (\n <div className=\"shrink-0 border-t border-border p-3\">\n <PanelComposer\n placeholder=\"Ask a question\"\n ariaLabel=\"Ask a question\"\n sendLabel=\"Ask\"\n maxLength={maxLength}\n busy={isPending('ask')}\n onSend={(text) => run('ask', () => onAsk(text))}\n testId=\"webinar-ask\"\n />\n </div>\n )}\n </div>\n )\n}\n","/**\n * \"Who can chat: Panelists only | Everyone\" — the moderators' setting, as a group of the call's\n * More menu (`chatPermissionSection` for `MoreMenu`'s `groups`), so it lives with the other call\n * settings rather than as a control of its own.\n */\n\nimport { useState, type ReactElement } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport {\n DropdownMenuLabel,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n} from '@arbidocs/react/ui'\nimport type { MoreMenuSection } from '../ControlBar'\nimport type { MaybePromise, WebinarChatPermission } from './types'\n\nexport interface ChatPermissionSettingProps {\n value: WebinarChatPermission\n onChange(value: WebinarChatPermission): MaybePromise\n /** The app's change in flight (the menu may have closed and reopened since). */\n pending?: boolean\n}\n\nconst OPTIONS: { value: WebinarChatPermission; label: string }[] = [\n { value: 'panelists', label: 'Panelists only' },\n { value: 'everyone', label: 'Everyone' },\n]\n\n/** Menu content: a label and two radio items. Render it inside a `DropdownMenuContent`. */\nexport function ChatPermissionSetting({\n value,\n onChange,\n pending = false,\n}: ChatPermissionSettingProps): ReactElement {\n // Show the choice at once while the app applies it (the menu usually closes on select).\n const [choosing, setChoosing] = useState<WebinarChatPermission | null>(null)\n const busy = pending || choosing !== null\n const select = (next: string) => {\n const v = next as WebinarChatPermission\n if (v === value || busy) return\n const result = onChange(v)\n if (result && typeof result.then === 'function') {\n setChoosing(v)\n void result.then(\n () => setChoosing(null),\n () => setChoosing(null)\n )\n }\n }\n return (\n <div role=\"group\" aria-label=\"Who can chat\" data-testid=\"webinar-chat-permission\">\n <DropdownMenuLabel className=\"flex items-center gap-1.5 text-xs font-medium text-muted-foreground\">\n Who can chat\n {busy && <Loader2 className=\"size-3.5 animate-spin\" aria-label=\"Saving\" />}\n </DropdownMenuLabel>\n <DropdownMenuRadioGroup value={choosing ?? value} onValueChange={select}>\n {OPTIONS.map((o) => (\n <DropdownMenuRadioItem\n key={o.value}\n value={o.value}\n disabled={busy}\n data-testid={`webinar-chat-${o.value}`}\n >\n {o.label}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </div>\n )\n}\n\n/** The setting as a `MoreMenu` group: `groups={[…, chatPermissionSection(props)]}`. */\nexport function chatPermissionSection(props: ChatPermissionSettingProps): MoreMenuSection {\n return { key: 'webinar-chat', content: <ChatPermissionSetting {...props} /> }\n}\n","/**\n * \"You're on stage\": a moderator promoted me, so before my microphone and camera go out I check\n * them — the call's own `PreJoin` (preview, level meter, device pickers) in a dialog (a bottom\n * sheet on a phone). Only the camera video is mirrored in the self-view; no text ever is.\n */\n\nimport type { ReactElement } from 'react'\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from '@arbidocs/react/ui'\nimport { PreJoin } from '../PreJoin'\nimport { describeMediaError, type JoinChoices, type MediaKind } from '../join-choices'\nimport { usePending } from './hooks'\nimport type { MaybePromise } from './types'\n\nexport interface OnStageCheckProps {\n open: boolean\n /** The devices the check opens with (`DEFAULT_JOIN_CHOICES` from `@arbidocs/react`). */\n initialChoices: JoinChoices\n /** Go on stage with these devices. */\n onJoinStage(choices: JoinChoices): MaybePromise\n /** Decline: step back down (also on Escape / close). */\n onStayInAudience(): MaybePromise\n /** Busy from outside (the app's request in flight). */\n busy?: boolean\n /** A failure to show above the buttons. */\n error?: string | null\n /** Mirror my camera preview (default true; only the <video> flips). */\n mirror?: boolean\n describeError?(err: unknown, kind: MediaKind): string\n}\n\nexport function OnStageCheck({\n open,\n initialChoices,\n onJoinStage,\n onStayInAudience,\n busy = false,\n error,\n mirror = true,\n describeError = describeMediaError,\n}: OnStageCheckProps): ReactElement {\n const { isPending, run } = usePending()\n const working = busy || isPending('join') || isPending('stay')\n const stay = () => {\n if (!working) void run('stay', onStayInAudience)\n }\n return (\n <Dialog open={open} onOpenChange={(next) => !next && stay()}>\n <DialogContent presentation=\"sheet\" className=\"max-w-3xl\" data-testid=\"webinar-on-stage\">\n {/* PreJoin's own heading and note are the dialog's title and description. */}\n <PreJoin\n initialChoices={initialChoices}\n heading=\"You're on stage\"\n headingAs={DialogTitle}\n joinLabel=\"Join stage\"\n cancelLabel=\"Stay in audience\"\n busy={working}\n error={error}\n mirror={mirror}\n describeError={describeError}\n onJoin={(choices) => void run('join', () => onJoinStage(choices))}\n onCancel={stay}\n >\n <DialogDescription>\n A host invited you to speak. Check your microphone and camera: once you join, everyone\n sees and hears you.\n </DialogDescription>\n </PreJoin>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * The attendee's clean viewer: the stage (the app's `CallGrid` / `CallFocus` of the panelists),\n * the live captions under it, a side slot (Q&A in a `CallSidePanel`) docked on a wide screen and\n * over the stage on a narrow one, and a bottom bar with Raise hand, the side toggle and Leave.\n * Audio-first, and no list of other attendees anywhere. (The team keeps the normal call UI.)\n */\n\nimport type { ReactElement, ReactNode, Ref } from 'react'\nimport { MessageCircleQuestion } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { CallControlBar, ControlGroup, LeaveButton } from '../ControlBar'\nimport { CallControlButton, ControlBadge } from '../ControlButton'\nimport { RaiseHandButton, type RaiseHandButtonProps } from './RaiseHandButton'\n\nexport interface WebinarViewerProps {\n /** The header (a `CallHeader` with the title and the live chip). */\n header?: ReactNode\n /** The stage: the visible panelists' tiles. */\n stage: ReactNode\n stageRef?: Ref<HTMLDivElement>\n /** Floating over the stage (connection state). */\n stageOverlay?: ReactNode\n /** Under the stage: a `CaptionsStrip` (or the live transcript). */\n captions?: ReactNode\n /** The side (a `CallSidePanel` with the `QAPanel`); omit while closed. */\n side?: ReactNode\n /** The side's toggle in the bar (Q&A); omit for none. */\n sideToggle?: { open: boolean; onToggle(): void; label: string; count?: number }\n /** My raised hand. */\n hand: RaiseHandButtonProps\n onLeave(): void\n /** The bar's left end (e.g. \"Enable audio\"). */\n left?: ReactNode\n /** More centre controls after Raise hand (e.g. a captions switch). */\n controls?: ReactNode\n /** Single-key shortcuts on (the viewer is on screen). */\n shortcuts?: boolean\n className?: string\n}\n\nexport function WebinarViewer({\n header,\n stage,\n stageRef,\n stageOverlay,\n captions,\n side,\n sideToggle,\n hand,\n onLeave,\n left,\n controls,\n shortcuts = true,\n className,\n}: WebinarViewerProps): ReactElement {\n return (\n <div\n className={cn(\n '@container flex size-full min-h-0 flex-col bg-background text-foreground',\n className\n )}\n data-testid=\"webinar-viewer\"\n >\n {header}\n <div className=\"relative flex min-h-0 flex-1\">\n <div className=\"flex min-h-0 min-w-0 flex-1 flex-col gap-2 px-3 pb-3 pt-1\">\n <div ref={stageRef} className=\"relative min-h-0 flex-1\" data-testid=\"call-stage\">\n {stage}\n {stageOverlay}\n </div>\n {captions}\n </div>\n {side && (\n <div\n className=\"absolute inset-0 z-20 flex min-h-0 flex-col border-t border-border motion-safe:animate-in motion-safe:fade-in-0 @3xl:static @3xl:z-auto @3xl:w-80 @3xl:shrink-0 @3xl:border-l @3xl:border-t-0\"\n data-testid=\"webinar-viewer-side\"\n >\n {side}\n </div>\n )}\n </div>\n <CallControlBar shortcuts={shortcuts} left={left} right={<LeaveButton onLeave={onLeave} />}>\n <ControlGroup>\n <RaiseHandButton {...hand} />\n {sideToggle && (\n <CallControlButton\n label={sideToggle.open ? `Close ${sideToggle.label}` : sideToggle.label}\n tone={sideToggle.open ? 'active' : 'neutral'}\n aria-pressed={sideToggle.open}\n onClick={sideToggle.onToggle}\n data-testid=\"webinar-side-toggle\"\n >\n <MessageCircleQuestion aria-hidden />\n {!!sideToggle.count && <ControlBadge count={sideToggle.count} tone=\"quiet\" />}\n </CallControlButton>\n )}\n {controls}\n </ControlGroup>\n </CallControlBar>\n </div>\n )\n}\n","/**\n * Who is talking, fast: each participant's microphone level, measured in this browser from the\n * audio it already plays (WebAudio analysers, ~60 ms), not from the media server's slower\n * active-speaker events. One store for the whole app, so the call panel (rings, spotlight, live\n * speaker list) and the conversation beside it (the transcript line being spoken) agree.\n *\n * The store is plain data; `startVoiceLevels` (used by the call room) feeds it.\n */\n\nimport { useSyncExternalStore } from 'react'\nimport { INITIAL_SPOTLIGHT, SPEAKING_LEVEL, nextSpotlight, type SpotlightState } from './layout'\n\n/** Sampling period. */\nexport const LEVEL_TICK_MS = 60\n/** A voice stays \"speaking\" this long after it drops below the threshold (no flicker between words). */\nconst SPEAKING_RELEASE_MS = 350\n\ninterface Snapshot {\n /** identity → level 0..1, rounded to 0.05. */\n levels: Readonly<Record<string, number>>\n /** Talking now, loudest first. */\n speaking: readonly string[]\n /** The speaker view's spotlight (with hysteresis). */\n spotlight: string | null\n}\n\nconst EMPTY: Snapshot = { levels: {}, speaking: [], spotlight: null }\nlet snapshot: Snapshot = EMPTY\nconst listeners = new Set<() => void>()\n\nfunction publish(next: Snapshot) {\n snapshot = next\n listeners.forEach((fn) => fn())\n}\n\nfunction subscribe(fn: () => void): () => void {\n listeners.add(fn)\n return () => listeners.delete(fn)\n}\n\nconst get = () => snapshot\n\n/** My voice level (0..1, in 0.05 steps) — re-renders only when it changes. */\nexport function useVoiceLevel(identity: string | null | undefined): number {\n return useSyncExternalStore(\n subscribe,\n () => (identity ? (get().levels[identity] ?? 0) : 0),\n () => 0\n )\n}\n\n/** Everyone's level (re-renders at the level rate: for small lists). */\nexport function useVoiceLevels(): Readonly<Record<string, number>> {\n return useSyncExternalStore(\n subscribe,\n () => get().levels,\n () => EMPTY.levels\n )\n}\n\nexport function useIsSpeaking(identity: string | null | undefined): boolean {\n return useSyncExternalStore(\n subscribe,\n () => (identity ? get().speaking.includes(identity) : false),\n () => false\n )\n}\n\n/** Identities talking now, loudest first (a stable string key, split by the caller). */\nexport function useSpeakingIds(): string[] {\n const key = useSyncExternalStore(\n subscribe,\n () => get().speaking.join('\\n'),\n () => ''\n )\n return key ? key.split('\\n') : []\n}\n\nexport function useSpotlightId(): string | null {\n return useSyncExternalStore(\n subscribe,\n () => get().spotlight,\n () => null\n )\n}\n\n/** A track to measure: whose it is, and its audio. */\nexport interface VoiceSource {\n identity: string\n track: MediaStreamTrack | null\n /** Mic muted / off: level 0 without measuring. */\n muted: boolean\n /** Me: measured (my ring, \"Speaking: … (me)\") but never put in the spotlight. */\n local?: boolean\n}\n\ninterface Meter {\n track: MediaStreamTrack\n source: MediaStreamAudioSourceNode\n analyser: AnalyserNode\n buf: Float32Array<ArrayBuffer>\n}\n\n/**\n * Measure the given sources every {@link LEVEL_TICK_MS} until stopped. `sources()` is read each\n * tick, so the caller can hand over a ref to its current track list.\n */\nexport function startVoiceLevels(sources: () => VoiceSource[]): () => void {\n let ctx: AudioContext | null = null\n try {\n ctx = typeof AudioContext !== 'undefined' ? new AudioContext() : null\n } catch {\n ctx = null\n }\n const meters = new Map<string, Meter>()\n const smoothed = new Map<string, number>()\n const loudAt = new Map<string, number>()\n let spot: SpotlightState = INITIAL_SPOTLIGHT\n\n const meterFor = (s: VoiceSource): Meter | null => {\n if (!ctx || !s.track || s.track.readyState === 'ended') return null\n const have = meters.get(s.identity)\n if (have && have.track === s.track) return have\n have?.source.disconnect()\n try {\n const source = ctx.createMediaStreamSource(new MediaStream([s.track]))\n const analyser = ctx.createAnalyser()\n analyser.fftSize = 512\n source.connect(analyser)\n const m = { track: s.track, source, analyser, buf: new Float32Array(analyser.fftSize) }\n meters.set(s.identity, m)\n return m\n } catch {\n return null\n }\n }\n\n const tick = () => {\n if (ctx?.state === 'suspended') void ctx.resume().catch(() => undefined)\n const now = Date.now()\n const list = sources()\n const seen = new Set<string>()\n const levels: Record<string, number> = {}\n for (const s of list) {\n seen.add(s.identity)\n let raw = 0\n const m = s.muted ? null : meterFor(s)\n if (m) {\n m.analyser.getFloatTimeDomainData(m.buf)\n let sum = 0\n for (let i = 0; i < m.buf.length; i++) sum += m.buf[i] * m.buf[i]\n raw = Math.min(1, Math.sqrt(sum / m.buf.length) * 5)\n }\n // Fast attack, gentle release.\n const prev = smoothed.get(s.identity) ?? 0\n const level = raw >= prev ? raw : prev * 0.8 + raw * 0.2\n smoothed.set(s.identity, level)\n if (level >= SPEAKING_LEVEL) loudAt.set(s.identity, now)\n levels[s.identity] = Math.round(level * 20) / 20\n }\n for (const id of [...meters.keys()]) {\n if (!seen.has(id)) {\n meters.get(id)?.source.disconnect()\n meters.delete(id)\n smoothed.delete(id)\n loudAt.delete(id)\n }\n }\n const speaking = list\n .map((s) => s.identity)\n .filter((id) => now - (loudAt.get(id) ?? -Infinity) <= SPEAKING_RELEASE_MS)\n .sort((a, b) => (smoothed.get(b) ?? 0) - (smoothed.get(a) ?? 0))\n spot = nextSpotlight(spot, Object.fromEntries(smoothed), now, {\n exclude: list.filter((s) => s.local).map((s) => s.identity),\n })\n if (spot.id && !seen.has(spot.id)) spot = INITIAL_SPOTLIGHT\n const prev = snapshot\n const same =\n prev.spotlight === spot.id &&\n prev.speaking.join('\\n') === speaking.join('\\n') &&\n Object.keys(levels).length === Object.keys(prev.levels).length &&\n Object.entries(levels).every(([k, v]) => prev.levels[k] === v)\n if (!same) publish({ levels, speaking, spotlight: spot.id })\n }\n\n const id = setInterval(tick, LEVEL_TICK_MS)\n return () => {\n clearInterval(id)\n for (const m of meters.values()) m.source.disconnect()\n meters.clear()\n void ctx?.close().catch(() => undefined)\n publish(EMPTY)\n }\n}\n","/**\n * Incoming-call ringtone, synthesised with WebAudio (no audio asset): a soft\n * two-tone ring (440 Hz + 480 Hz, like a phone line), 1.2 s on / 2.8 s off,\n * repeating until stopped. The mute preference is per browser.\n *\n * Browsers only let audio start after a user gesture on the page; when the\n * AudioContext stays suspended the ring is silent and the visual ringer still\n * shows. Nothing throws.\n */\n\nimport { useCallback, useEffect, useState } from 'react'\n\nexport const RINGTONE_MUTED_KEY = 'arbi-call-ringtone-muted'\nconst RING_ON_S = 1.2\nconst RING_PERIOD_S = 4\nconst GAIN = 0.08\n\ntype AudioContextCtor = typeof AudioContext\n\nfunction audioContextCtor(): AudioContextCtor | null {\n if (typeof window === 'undefined') return null\n return (\n window.AudioContext ??\n (window as unknown as { webkitAudioContext?: AudioContextCtor }).webkitAudioContext ??\n null\n )\n}\n\n/** Start ringing; returns a stop function (idempotent). */\nexport function startRingtone(): () => void {\n const Ctor = audioContextCtor()\n if (!Ctor) return () => {}\n let ctx: AudioContext\n try {\n ctx = new Ctor()\n } catch {\n return () => {}\n }\n const out = ctx.createGain()\n out.gain.value = 0\n out.connect(ctx.destination)\n const oscillators = [440, 480].map((frequency) => {\n const osc = ctx.createOscillator()\n osc.type = 'sine'\n osc.frequency.value = frequency\n osc.connect(out)\n osc.start()\n return osc\n })\n\n let nextRingAt = ctx.currentTime + 0.05\n const schedule = () => {\n // Keep ~2 rings scheduled ahead so a throttled background tab keeps ringing.\n while (nextRingAt < ctx.currentTime + RING_PERIOD_S * 2) {\n out.gain.setValueAtTime(0, nextRingAt)\n out.gain.linearRampToValueAtTime(GAIN, nextRingAt + 0.03)\n out.gain.setValueAtTime(GAIN, nextRingAt + RING_ON_S - 0.03)\n out.gain.linearRampToValueAtTime(0, nextRingAt + RING_ON_S)\n nextRingAt += RING_PERIOD_S\n }\n }\n schedule()\n const timer = setInterval(schedule, 1000)\n void ctx.resume().catch(() => {})\n\n let stopped = false\n return () => {\n if (stopped) return\n stopped = true\n clearInterval(timer)\n for (const osc of oscillators) {\n try {\n osc.stop()\n } catch {\n // already stopped\n }\n }\n void ctx.close().catch(() => {})\n }\n}\n\nfunction readMuted(): boolean {\n try {\n return localStorage.getItem(RINGTONE_MUTED_KEY) === '1'\n } catch {\n return false\n }\n}\n\n/** The per-browser \"mute ringtone\" preference. */\nexport function useRingtoneMuted(): [boolean, (muted: boolean) => void] {\n const [muted, setMutedState] = useState(readMuted)\n const setMuted = useCallback((next: boolean) => {\n setMutedState(next)\n try {\n if (next) localStorage.setItem(RINGTONE_MUTED_KEY, '1')\n else localStorage.removeItem(RINGTONE_MUTED_KEY)\n } catch {\n // private mode: the choice lasts for this page only\n }\n }, [])\n return [muted, setMuted]\n}\n\n/** Ring while `ringing` and not muted; stops on unmount, mute, or when the ring goes away. */\nexport function useRingtone(ringing: boolean, muted: boolean): void {\n useEffect(() => {\n if (!ringing || muted) return\n return startRingtone()\n }, [ringing, muted])\n}\n","/**\n * The host's composite recording (ARBI `docs/meeting-chats-plan.md` §6, \"Audio + video\"): a canvas\n * that mirrors the host's call stage — the same tiles in the same places (grid, or the screen share\n * large with the others in a strip), since it is drawn from the stage's own rendered <video>\n * elements — plus the mixed audio the host hears (WebAudio: every remote audio track and the host's\n * microphone). The stream is recorded by the chunked recorder in the host's browser.\n */\n\n/** Frame rate and size of the composite recording canvas. */\nexport const COMPOSITE_FPS = 15\nexport const COMPOSITE_MAX_WIDTH = 1280\nexport const COMPOSITE_MAX_HEIGHT = 720\n\n/** Fit a `w × h` stage into the canvas, centred, aspect kept. */\nexport function fitStage(\n stage: { width: number; height: number },\n canvas: { width: number; height: number }\n): { scale: number; dx: number; dy: number } {\n if (stage.width <= 0 || stage.height <= 0) return { scale: 0, dx: 0, dy: 0 }\n const scale = Math.min(canvas.width / stage.width, canvas.height / stage.height)\n return {\n scale,\n dx: (canvas.width - stage.width * scale) / 2,\n dy: (canvas.height - stage.height * scale) / 2,\n }\n}\n\n/** Draw `src` (w × h) into a box, `contain` (letterboxed) or `cover` (cropped). */\nexport function fitMedia(\n src: { width: number; height: number },\n box: { x: number; y: number; width: number; height: number },\n mode: 'contain' | 'cover'\n): {\n sx: number\n sy: number\n sw: number\n sh: number\n dx: number\n dy: number\n dw: number\n dh: number\n} {\n const srcRatio = src.width / src.height\n const boxRatio = box.width / box.height\n if (mode === 'contain') {\n const dw = srcRatio > boxRatio ? box.width : box.height * srcRatio\n const dh = srcRatio > boxRatio ? box.width / srcRatio : box.height\n return {\n sx: 0,\n sy: 0,\n sw: src.width,\n sh: src.height,\n dx: box.x + (box.width - dw) / 2,\n dy: box.y + (box.height - dh) / 2,\n dw,\n dh,\n }\n }\n const sw = srcRatio > boxRatio ? src.height * boxRatio : src.width\n const sh = srcRatio > boxRatio ? src.height : src.width / boxRatio\n return {\n sx: (src.width - sw) / 2,\n sy: (src.height - sh) / 2,\n sw,\n sh,\n dx: box.x,\n dy: box.y,\n dw: box.width,\n dh: box.height,\n }\n}\n\n/** One frame of the stage. */\nexport function drawStageFrame(\n ctx: CanvasRenderingContext2D,\n stage: HTMLElement,\n width: number,\n height: number\n): void {\n ctx.fillStyle = '#111'\n ctx.fillRect(0, 0, width, height)\n const stageRect = stage.getBoundingClientRect()\n const { scale, dx, dy } = fitStage(stageRect, { width, height })\n if (!scale) {\n // The call is minimized: the stage is not rendered (and its video is paused).\n ctx.fillStyle = '#bbb'\n ctx.font = '24px sans-serif'\n ctx.textAlign = 'center'\n ctx.fillText('Video paused', width / 2, height / 2)\n ctx.textAlign = 'start'\n return\n }\n const tiles = Array.from(stage.querySelectorAll<HTMLElement>('.lk-participant-tile'))\n for (const tile of tiles) {\n const r = tile.getBoundingClientRect()\n if (r.width <= 0 || r.height <= 0) continue\n const box = {\n x: dx + (r.left - stageRect.left) * scale,\n y: dy + (r.top - stageRect.top) * scale,\n width: r.width * scale,\n height: r.height * scale,\n }\n ctx.fillStyle = '#222'\n ctx.fillRect(box.x, box.y, box.width, box.height)\n const video = tile.querySelector('video')\n if (video && video.readyState >= 2 && video.videoWidth > 0 && video.videoHeight > 0) {\n const screen = tile.getAttribute('data-lk-source') === 'screen_share'\n const f = fitMedia(\n { width: video.videoWidth, height: video.videoHeight },\n box,\n screen ? 'contain' : 'cover'\n )\n try {\n ctx.drawImage(video, f.sx, f.sy, f.sw, f.sh, f.dx, f.dy, f.dw, f.dh)\n } catch {\n // A frame not ready yet.\n }\n }\n if (tile.getAttribute('data-lk-speaking') === 'true') {\n ctx.strokeStyle = '#4ade80'\n ctx.lineWidth = 3\n ctx.strokeRect(box.x + 1.5, box.y + 1.5, box.width - 3, box.height - 3)\n }\n const name = tile.querySelector('.lk-participant-name')?.textContent?.trim()\n if (name) {\n ctx.font = `${Math.max(11, Math.round(14 * Math.min(1, scale * 1.2)))}px sans-serif`\n const w = ctx.measureText(name).width\n ctx.fillStyle = 'rgba(0,0,0,0.6)'\n ctx.fillRect(box.x + 6, box.y + box.height - 26, w + 12, 20)\n ctx.fillStyle = '#fff'\n ctx.fillText(name, box.x + 12, box.y + box.height - 11)\n }\n }\n}\n\nexport interface CompositeCapture {\n stream: MediaStream\n /** Keep the mixed audio in step with the room's audio tracks. */\n setAudioTracks(tracks: MediaStreamTrack[]): void\n dispose(): void\n}\n\n/** Start drawing the stage into a ≤720p canvas and mixing the given audio. */\nexport function startCompositeCapture(stage: HTMLElement): CompositeCapture {\n const canvas = document.createElement('canvas')\n canvas.width = COMPOSITE_MAX_WIDTH\n canvas.height = COMPOSITE_MAX_HEIGHT\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error('This browser cannot draw the recording')\n const draw = () => drawStageFrame(ctx, stage, canvas.width, canvas.height)\n draw()\n // A timer, not animation frames: frames stop in a background tab, recording must not.\n const timer = setInterval(draw, Math.round(1000 / COMPOSITE_FPS))\n const video = canvas.captureStream(COMPOSITE_FPS)\n\n const audio = new AudioContext()\n const destination = audio.createMediaStreamDestination()\n const sources = new Map<string, MediaStreamAudioSourceNode>()\n\n const stream = new MediaStream([\n ...video.getVideoTracks(),\n ...destination.stream.getAudioTracks(),\n ])\n\n return {\n stream,\n setAudioTracks(tracks) {\n const wanted = new Map(tracks.map((t) => [t.id, t]))\n for (const [id, node] of sources) {\n if (!wanted.has(id)) {\n node.disconnect()\n sources.delete(id)\n }\n }\n for (const [id, track] of wanted) {\n if (sources.has(id) || track.readyState === 'ended') continue\n try {\n const node = audio.createMediaStreamSource(new MediaStream([track]))\n node.connect(destination)\n sources.set(id, node)\n } catch {\n // A track WebAudio cannot read: left out of the mix.\n }\n }\n if (audio.state === 'suspended') void audio.resume().catch(() => undefined)\n },\n dispose() {\n clearInterval(timer)\n for (const node of sources.values()) node.disconnect()\n sources.clear()\n video.getTracks().forEach((t) => t.stop())\n void audio.close().catch(() => undefined)\n },\n }\n}\n","/**\n * The call I am in, as the rest of the app needs it (its conversation's empty state and\n * provisional transcript rows): which call, and whether it is being transcribed. Published by the\n * call room; plain data, no LiveKit.\n */\n\nimport { useSyncExternalStore } from 'react'\n\ninterface CallStatus {\n callExtId: string | null\n transcribing: boolean\n}\n\nlet status: CallStatus = { callExtId: null, transcribing: false }\nconst listeners = new Set<() => void>()\n\nexport function publishCallStatus(next: CallStatus): void {\n if (next.callExtId === status.callExtId && next.transcribing === status.transcribing) return\n status = next\n listeners.forEach((fn) => fn())\n}\n\nfunction subscribe(fn: () => void): () => void {\n listeners.add(fn)\n return () => listeners.delete(fn)\n}\n\n/** Whether I am in this call, and whether it is transcribed. */\nexport function useMyCallStatus(callExtId: string | null | undefined): {\n inCall: boolean\n transcribing: boolean\n} {\n const inCall = useSyncExternalStore(\n subscribe,\n () => !!callExtId && status.callExtId === callExtId,\n () => false\n )\n const transcribing = useSyncExternalStore(\n subscribe,\n () => !!callExtId && status.callExtId === callExtId && status.transcribing,\n () => false\n )\n return { inCall, transcribing }\n}\n","import type { calls } from '@arbidocs/sdk/browser'\n\n/** Shared by the recording UI (kept out of the component files for fast refresh). */\n\n/** How a recording mode is named in the UI. */\nexport const MODE_LABEL: Record<calls.RecordingMode, string> = {\n audio: 'Audio',\n audio_video: 'Audio + video',\n}\n\n/** Expiry choices (days; null = kept). */\nexport const EXPIRY_DAYS = [null, 7, 30, 90] as const\n\n/** `expires_at` for a choice, from now. */\nexport function expiryFor(days: number | null, now = Date.now()): string | null {\n return days ? new Date(now + days * 86_400_000).toISOString() : null\n}\n\n/** Which expiry choice an `expires_at` is closest to (for the select). */\nexport function expiryChoiceOf(expiresAt: string | null, now = Date.now()): string {\n if (!expiresAt) return 'none'\n const days = (Date.parse(expiresAt) - now) / 86_400_000\n const nearest = [7, 30, 90].reduce((best, d) =>\n Math.abs(d - days) < Math.abs(best - days) ? d : best\n )\n return String(nearest)\n}\n","/**\n * \"Mirror my video\": whether my own camera is shown mirrored (a selfie view). On by default, kept\n * per browser like the ringtone switch. Only my own on-screen <video> flips — never labels, and\n * never what others or the recording see.\n */\n\nimport { useSyncExternalStore } from 'react'\n\nexport const MIRROR_SELF_VIEW_KEY = 'arbi-call-mirror-self-view'\n\nconst listeners = new Set<() => void>()\nlet memory: boolean | null = null\n\nfunction read(): boolean {\n if (memory !== null) return memory\n try {\n return localStorage.getItem(MIRROR_SELF_VIEW_KEY) !== 'off'\n } catch {\n return true\n }\n}\n\nexport function setMirrorSelfView(on: boolean): void {\n memory = on\n try {\n if (on) localStorage.removeItem(MIRROR_SELF_VIEW_KEY)\n else localStorage.setItem(MIRROR_SELF_VIEW_KEY, 'off')\n } catch {\n // Private mode: the choice lasts for this page only.\n }\n listeners.forEach((fn) => fn())\n}\n\nfunction subscribe(fn: () => void): () => void {\n listeners.add(fn)\n return () => listeners.delete(fn)\n}\n\n/** [mirrored, set] — shared by every tile, the pre-join and the camera menu. */\nexport function useMirrorSelfView(): [boolean, (on: boolean) => void] {\n const on = useSyncExternalStore(subscribe, read, () => true)\n return [on, setMirrorSelfView]\n}\n","/** Pure helpers for the call cards and call titles (kept apart from the components). */\n\nimport type { calls } from '@arbidocs/sdk/browser'\n\nexport interface CallLogDetail {\n call_ext_id: string\n started_by: string | null\n invited: string[]\n started_at: string | null\n ended_at: string | null\n duration_s: number | null\n joined: string[]\n meeting_conversation_ext_id: string | null\n}\n\nconst ids = (v: unknown): string[] =>\n Array.isArray(v) ? v.filter((x): x is string => typeof x === 'string') : []\nconst str = (v: unknown): string | null => (typeof v === 'string' && v ? v : null)\n\n/** The card's detail from an activity event's `detail`, or null when it is not a call card. */\nexport function parseCallLogDetail(\n detail: Record<string, unknown> | null | undefined\n): CallLogDetail | null {\n const callExtId = str(detail?.call_ext_id)\n if (!detail || !callExtId) return null\n return {\n call_ext_id: callExtId,\n started_by: str(detail.started_by),\n invited: ids(detail.invited),\n started_at: str(detail.started_at),\n ended_at: str(detail.ended_at),\n duration_s: typeof detail.duration_s === 'number' ? detail.duration_s : null,\n joined: ids(detail.joined),\n meeting_conversation_ext_id: str(detail.meeting_conversation_ext_id),\n }\n}\n\n/** \"45 s\", \"12 min\", \"1 h 5 min\". */\nexport function formatCallDuration(seconds: number | null | undefined): string | null {\n if (seconds == null || seconds < 0) return null\n if (seconds < 60) return `${Math.round(seconds)} s`\n const minutes = Math.round(seconds / 60)\n if (minutes < 60) return `${minutes} min`\n const h = Math.floor(minutes / 60)\n const m = minutes % 60\n return m ? `${h} h ${m} min` : `${h} h`\n}\n\n/** Whether the call's current session is running (the server's view, or `call.started`). */\nexport function isCallLive(\n call: Pick<calls.CallResponse, 'started_at' | 'ended_at' | 'cancelled'> | undefined,\n liveNow: boolean\n): boolean {\n if (liveNow) return true\n if (!call?.started_at || call.cancelled) return false\n return !call.ended_at || Date.parse(call.started_at) > Date.parse(call.ended_at)\n}\n\n/** \"Call with Ada, Bob\" (the title is encrypted under the call key). */\nexport function contactsCallTitle(names: string[]): string | null {\n if (!names.length) return null\n const shown = names.slice(0, 3).join(', ')\n return `Call with ${shown}${names.length > 3 ? ` +${names.length - 3}` : ''}`\n}\n","/**\n * A secondary action of a conversation header (Save transcript, Recordings): labelled where there\n * is room, or icon-only with the label in a tooltip (and for screen readers) where the header is\n * crowded — the thread's title keeps priority.\n */\n\nimport type { ReactElement, ReactNode } from 'react'\nimport { Button, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\n\nexport function HeaderAction({\n label,\n icon,\n iconOnly = false,\n onClick,\n testId,\n className,\n}: {\n label: string\n icon: ReactNode\n iconOnly?: boolean\n onClick(): void\n testId?: string\n className?: string\n}): ReactElement {\n if (!iconOnly) {\n return (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className={className}\n onClick={onClick}\n data-testid={testId}\n >\n <span className=\"mr-1 inline-flex\">{icon}</span>\n {label}\n </Button>\n )\n }\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n className={className}\n aria-label={label}\n onClick={onClick}\n data-testid={testId}\n >\n {icon}\n <span className=\"sr-only\">{label}</span>\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n )\n}\n","/** \"Experimental\" marker for the call UI headers (calls are behind Settings → Experimental). */\n\nimport type { ReactElement } from 'react'\nimport { FlaskConical } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport function CallsExperimentalBadge({ className }: { className?: string }): ReactElement {\n return (\n <span\n data-testid=\"calls-experimental-badge\"\n title=\"Calls are an experimental feature.\"\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-sm border border-border px-1.5 py-0.5 text-[11px] font-medium text-muted-foreground',\n className\n )}\n >\n <FlaskConical className=\"size-3\" aria-hidden />\n Experimental\n </span>\n )\n}\n","/**\n * In-app links to a call recording (ARBI `docs/meeting-chats-plan.md` §6).\n *\n * A recording is never shared by a public link: it is protected by the room key (the meeting chat's\n * key, or the workspace key for a thread call). \"Copy link\" copies an IN-APP deep link that opens\n * the recording where it lives — sign-in and membership required, like the chat itself:\n * - a contacts call's meeting chat: `/?chat=<cht-…>&recording=<crc-…>`\n * - a workspace meeting thread: `/<wrk-…>/<con-…>?recording=<crc-…>`\n * The presigned object-store URLs never leave the upload/download code.\n */\n\nimport { useSyncExternalStore } from 'react'\nimport type { MeetingChatRef } from '@arbidocs/react'\nimport { buildDeepLinkUrl } from '../lib/deep-link'\n\nexport const RECORDING_ID_PATTERN = /^crc-[A-Za-z0-9]{4,64}$/\nexport const CHAT_ID_PATTERN = /^cht-[A-Za-z0-9]{4,64}$/\n\n/**\n * The in-app link to a recording in its meeting chat, on the deployment (`deploymentDomain`, from\n * the host environment's runtime config).\n */\nexport function recordingLink(\n ref: MeetingChatRef,\n recordingExtId: string,\n deploymentDomain?: string | null\n): string {\n const recording = encodeURIComponent(recordingExtId)\n if (ref.kind === 'chat') {\n return `${buildDeepLinkUrl({}, deploymentDomain)}?chat=${encodeURIComponent(ref.chatExtId)}&recording=${recording}`\n }\n const url = buildDeepLinkUrl(\n { workspaceId: ref.workspaceExtId, conversationId: ref.conversationExtId },\n deploymentDomain\n )\n return `${url}?recording=${recording}`\n}\n\n/** The recording (and chat) a URL's query names; invalid ids are ignored. */\nexport function parseRecordingLinkParams(search: string): {\n chat?: string\n recording?: string\n} {\n const params = new URLSearchParams(search)\n const chat = params.get('chat')\n const recording = params.get('recording')\n return {\n ...(chat && CHAT_ID_PATTERN.test(chat) ? { chat } : {}),\n ...(recording && RECORDING_ID_PATTERN.test(recording) ? { recording } : {}),\n }\n}\n\n// ── The recording a link asked to show (until its card shows it) ────────────\n\nlet pending: string | null = null\nconst listeners = new Set<() => void>()\n\nexport function setPendingRecording(recordingExtId: string | null): void {\n pending = recordingExtId\n for (const l of listeners) l()\n}\n\nexport function getPendingRecording(): string | null {\n return pending\n}\n\nexport function usePendingRecording(): string | null {\n return useSyncExternalStore(\n (cb) => {\n listeners.add(cb)\n return () => {\n listeners.delete(cb)\n }\n },\n () => pending,\n () => pending\n )\n}\n","/**\n * A person in the call UI: the host's own pill (`<ArbiHost config={{ calls: { UserPill } }}>`, e.g.\n * ARBI's people pills with avatars and the verified tick), else the plain user pill with the\n * initials of the call's name for them. My own reads \"Name (me)\".\n */\n\nimport { memo, type ReactElement } from 'react'\nimport { useArbi, useArbiHost, type CallUserPillProps } from '@arbidocs/react'\nimport { UserEntity, getUserAvatarColor } from '@arbidocs/react/ui'\nimport { initialsOf } from '../ui'\n\nexport const CallUserPill = memo(function CallUserPill(props: CallUserPillProps): ReactElement {\n const HostPill = useArbiHost().calls?.UserPill\n if (HostPill) return <HostPill {...props} />\n return <PlainUserPill {...props} />\n})\n\nfunction PlainUserPill({\n identity,\n name,\n size = 'xs',\n variant = 'pill',\n interactive = false,\n className,\n}: CallUserPillProps): ReactElement {\n const arbi = useArbi()\n const isMe = arbi.isLoggedIn && arbi.user.identity()?.externalId === identity\n const displayName = name?.trim() || identity\n return (\n <UserEntity\n size={size}\n variant={variant}\n interactive={interactive}\n className={className}\n initials={initialsOf(displayName)}\n displayName={isMe ? `${displayName} (me)` : displayName}\n colorClass={getUserAvatarColor(identity)}\n isMe={isMe}\n />\n )\n}\n"]}
|