@arbidocs/react 0.4.30 → 0.4.32

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/tooltip.tsx","../src/ui/IconToggle.tsx","../src/ui/VisibilityToggle.tsx","../src/ui/DictateContext.tsx","../src/ui/avatar.tsx","../src/ui/badge.tsx","../src/ui/button.tsx","../src/ui/hover-card.tsx","../src/ui/card.tsx","../src/documents/media-error.ts","../src/documents/useAudioRecorder.ts","../src/documents/format-elapsed.ts","../src/documents/MicWaveformIndicator.tsx","../src/documents/MicRecordingOverlay.tsx","../src/documents/InlineMicButton.tsx","../src/ui/input.tsx","../src/ui/label.tsx","../src/ui/separator.tsx","../src/ui/textarea.tsx","../src/ui/collapsible.tsx","../src/ui/progress.tsx","../src/ui/radio-group.tsx","../src/ui/checkbox.tsx","../src/ui/switch.tsx","../src/ui/tabs.tsx","../src/ui/table.tsx","../src/ui/slider.tsx","../src/ui/toggle.tsx","../src/ui/toggle-group.tsx","../src/lib/toast-interaction.ts","../src/ui/dialog.tsx","../src/ui/popover.tsx","../src/ui/mark-menu.tsx","../src/ui/select.tsx","../src/ui/command.tsx","../src/ai/AiMarkdown.tsx","../src/entities/EntityPill.tsx","../src/entities/tag-types.ts","../src/entities/TagEntity.tsx","../src/ai/PassageCard.tsx","../src/icons/colors.ts","../src/icons/PdfIcon.tsx","../src/icons/AudIcon.tsx","../src/icons/ImgIcon.tsx","../src/icons/VidIcon.tsx","../src/icons/EmlIcon.tsx","../src/icons/ArbiBotHeadIcon.tsx","../src/entities/DocumentEntity.tsx","../src/entities/ProjectEntity.tsx","../src/entities/UserEntity.tsx","../src/entities/AgentMarkers.tsx","../src/entities/status.tsx","../src/entities/registry.tsx","../src/entities/colors.ts","../src/usermenu/UserMenu.tsx","../src/documents/DocumentCard.tsx"],"names":["React","jsx","Fragment","createPortal","cn","Icon","jsxs","Minus","Plus","useMemo","Share2","createContext","useContext","React2","AvatarPrimitive","cva","React3","Slot","HoverCardPrimitive","React4","getCollisionPadding","React5","useState","useRef","useCallback","useEffect","Loader2","Square","Mic","React6","React7","React8","SeparatorPrimitive","React9","CollapsiblePrimitive","CollapsibleTrigger","CollapsibleContent","React10","ProgressPrimitive","React11","RadioGroupPrimitive","Circle","React12","CheckboxPrimitive","Check","React13","SwitchPrimitives","TabsPrimitive","React14","React15","React16","SliderPrimitive","React17","TogglePrimitive","React18","ToggleGroupPrimitive","DialogPrimitive","React19","X","PopoverPrimitive","React20","useId","SelectPrimitive","React21","ChevronDown","ChevronUp","React22","CommandPrimitive","Search","MarkdownRenderer","forwardRef","EntityPill","sizeClasses","MoreVertical","SquareCheckBig","List","Hash","NotebookPen","Folder","Calendar","Bot","document","Eye","FolderOpen","CreditCard","memo","UserEntity","MessageCircleMore","Badge","MessageSquareLock","ChevronsDown","SquareM","SquarePlus","LayoutGrid","Columns3Cog","MessagesSquare","MessageSquareOff","MessageSquareText","MessageSquarePlus","MessageSquareMore","CaptionsOff","EyeOff","FolderPlus","StickyNote","NotebookText","User","UserPlus","Settings2","Users","UserStar","ClipboardList","Wrench","CircleUserRound","Bell","MessageSquare","LogOut","Upload","BookOpen","FileQuestion","Info","NEUTRAL_GRAY","BASE_COLORS","getEntityColor","DropdownMenu","DropdownMenuTrigger","ChevronsUpDown","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","DropdownMenuSeparator","IMAGE_EXTENSIONS","VIDEO_EXTENSIONS","AUDIO_EXTENSIONS","EMAIL_EXTENSIONS","CheckCircle","XCircle","SkipForward","FileX","AlertTriangle"],"mappings":"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","file":"chunk-3AK4QJ62.cjs","sourcesContent":["import * as React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { cn } from '../lib/utils'\n\n/**\n * Minimal, dependency-free tooltip — a drop-in API replacement for a Radix\n * wrapper (same exports/props: Tooltip, TooltipTrigger, TooltipContent,\n * TooltipProvider). Promoted verbatim from the ARBI app.\n *\n * It attaches the trigger via a STABLE `useCallback` ref (never setStates,\n * identity never changes), so React 19 never detach/attach-thrashes.\n */\n\ntype Side = 'top' | 'bottom' | 'left' | 'right'\n\ninterface TooltipContextValue {\n open: boolean\n show: () => void\n hide: () => void\n setTrigger: (el: HTMLElement | null) => void\n /** A pointer click dismisses the tip and keeps it away until the pointer leaves. */\n suppress: () => void\n release: () => void\n triggerRef: React.MutableRefObject<HTMLElement | null>\n contentId: string\n}\n\nconst TooltipContext = React.createContext<TooltipContextValue | null>(null)\n\n/** App-wide tooltip defaults, set once by `TooltipProvider`. */\nconst DEFAULT_DELAY = 300\nconst TooltipConfigContext = React.createContext<{ delayDuration: number }>({\n delayDuration: DEFAULT_DELAY,\n})\n\ninterface TooltipProviderProps {\n children?: React.ReactNode\n /** Hover delay, in ms, inherited by every Tooltip below. Default 300. */\n delayDuration?: number\n skipDelayDuration?: number\n disableHoverableContent?: boolean\n}\n\n/**\n * Sets tooltip defaults for the whole tree. Mount it once, at the app root —\n * `AppShell` in @arbidocs/blocks does this so every app gets it for free.\n * Tooltips still render without it, at the default delay.\n */\nconst TooltipProvider = ({ children, delayDuration = DEFAULT_DELAY }: TooltipProviderProps) => {\n const value = React.useMemo(() => ({ delayDuration }), [delayDuration])\n return <TooltipConfigContext.Provider value={value}>{children}</TooltipConfigContext.Provider>\n}\n\ninterface TooltipProps {\n children: React.ReactNode\n /** Overrides the provider's delay for this one tooltip. */\n delayDuration?: number\n}\n\nfunction Tooltip({ children, delayDuration }: TooltipProps) {\n const config = React.useContext(TooltipConfigContext)\n const delay = delayDuration ?? config.delayDuration\n const [open, setOpen] = React.useState(false)\n const triggerRef = React.useRef<HTMLElement | null>(null)\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const contentId = React.useId()\n\n const clearTimer = () => {\n if (timer.current) {\n clearTimeout(timer.current)\n timer.current = null\n }\n }\n\n const suppressed = React.useRef(false)\n\n const show = React.useCallback(() => {\n clearTimer()\n if (suppressed.current) return\n timer.current = setTimeout(() => setOpen(true), delay)\n }, [delay])\n\n const hide = React.useCallback(() => {\n clearTimer()\n setOpen(false)\n }, [])\n\n const suppress = React.useCallback(() => {\n suppressed.current = true\n clearTimer()\n setOpen(false)\n }, [])\n\n const release = React.useCallback(() => {\n suppressed.current = false\n }, [])\n\n const setTrigger = React.useCallback((el: HTMLElement | null) => {\n triggerRef.current = el\n }, [])\n\n React.useEffect(() => () => clearTimer(), [])\n\n const value = React.useMemo<TooltipContextValue>(\n () => ({ open, show, hide, suppress, release, setTrigger, triggerRef, contentId }),\n [open, show, hide, suppress, release, setTrigger, contentId]\n )\n\n return <TooltipContext.Provider value={value}>{children}</TooltipContext.Provider>\n}\n\n/**\n * Keyboard focus only: a tap focuses the control without `:focus-visible`, and a tooltip opened by\n * that tap would stay stuck on screen (touch has no pointer-leave). Falls back to true where the\n * selector is unsupported.\n */\nfunction isKeyboardFocus(target: EventTarget): boolean {\n try {\n return (target as Element).matches(':focus-visible')\n } catch {\n return true\n }\n}\n\n/**\n * True when the control already shows its own words (a labelled button): repeating them in a\n * tooltip is noise. Text hidden with `sr-only` and bare counts (\"12\", \"999+\") do not count.\n */\nfunction showsOwnText(el: Element | null): boolean {\n if (!el) return false\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT)\n let visible = ''\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n if (node.parentElement?.closest('.sr-only')) continue\n visible += node.textContent ?? ''\n }\n return /\\p{L}{2,}/u.test(visible)\n}\n\ninterface TooltipTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n /** Allow explanatory tooltips on controls that already have a visible label. */\n showWithText?: boolean\n}\n\nfunction TooltipTrigger({\n asChild,\n showWithText = false,\n children,\n ...props\n}: TooltipTriggerProps) {\n const ctx = React.useContext(TooltipContext)\n if (!ctx) return <>{children}</>\n\n const triggerHandlers = {\n onPointerEnter: (e: React.PointerEvent) => {\n ;(props.onPointerEnter as ((e: React.PointerEvent) => void) | undefined)?.(e)\n // Touch has no hover: the tap itself is the action, and nothing would ever close the tip.\n if (e.pointerType === 'touch') return\n if (!showWithText && showsOwnText(e.currentTarget)) return\n ctx.show()\n },\n onPointerLeave: (e: React.PointerEvent) => {\n ;(props.onPointerLeave as ((e: React.PointerEvent) => void) | undefined)?.(e)\n ctx.release()\n ctx.hide()\n },\n onPointerDown: (e: React.PointerEvent) => {\n ;(props.onPointerDown as ((e: React.PointerEvent) => void) | undefined)?.(e)\n ;(asChild && React.isValidElement(children)\n ? ((children.props as Record<string, unknown>).onPointerDown as\n ((e: React.PointerEvent) => void) | undefined)\n : undefined)?.(e)\n ctx.suppress()\n },\n onFocus: (e: React.FocusEvent) => {\n ;(props.onFocus as ((e: React.FocusEvent) => void) | undefined)?.(e)\n if (isKeyboardFocus(e.target) && (showWithText || !showsOwnText(e.currentTarget))) ctx.show()\n },\n onBlur: (e: React.FocusEvent) => {\n ;(props.onBlur as ((e: React.FocusEvent) => void) | undefined)?.(e)\n ctx.hide()\n },\n 'aria-describedby': ctx.open ? ctx.contentId : undefined,\n 'data-state': ctx.open ? 'open' : 'closed',\n }\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<Record<string, unknown>>\n return React.cloneElement(child, {\n ...props,\n ...triggerHandlers,\n ref: ctx.setTrigger,\n })\n }\n\n return (\n <button\n type=\"button\"\n {...props}\n {...triggerHandlers}\n ref={ctx.setTrigger as unknown as React.Ref<HTMLButtonElement>}\n >\n {children}\n </button>\n )\n}\n\ninterface TooltipContentProps extends React.HTMLAttributes<HTMLDivElement> {\n side?: Side\n sideOffset?: number\n /** Minimum gap, in px, kept between the tip and the viewport edges. Default 8. */\n collisionPadding?: number\n}\n\nconst TRANSFORM_BY_SIDE: Record<Side, string> = {\n top: 'translate(-50%, -100%)',\n bottom: 'translate(-50%, 0)',\n left: 'translate(-100%, -50%)',\n right: 'translate(0, -50%)',\n}\n\nconst TooltipContent = React.forwardRef<HTMLDivElement, TooltipContentProps>(\n ({ className, side = 'top', sideOffset = 4, collisionPadding = 8, style, ...props }, ref) => {\n const ctx = React.useContext(TooltipContext)\n const innerRef = React.useRef<HTMLDivElement | null>(null)\n const [coords, setCoords] = React.useState<{\n top: number\n left: number\n transform: string\n } | null>(null)\n\n React.useLayoutEffect(() => {\n if (!ctx?.open || !ctx.triggerRef.current) {\n setCoords(null)\n return\n }\n const r = ctx.triggerRef.current.getBoundingClientRect()\n const c = innerRef.current?.getBoundingClientRect()\n const ch = c?.height ?? 0\n const cw = c?.width ?? 0\n const vh = window.innerHeight\n const vw = window.innerWidth\n\n let s: Side = side\n if (s === 'top' && r.top - sideOffset - ch < 0) s = 'bottom'\n else if (s === 'bottom' && r.bottom + sideOffset + ch > vh) s = 'top'\n else if (s === 'left' && r.left - sideOffset - cw < 0) s = 'right'\n else if (s === 'right' && r.right + sideOffset + cw > vw) s = 'left'\n\n // Keep the whole tip inside the viewport (8px padding): the anchor point is the centre of\n // the cross axis, so clamp it by half the tip's size.\n const PAD = collisionPadding\n const clamp = (value: number, half: number, max: number) =>\n Math.min(Math.max(value, PAD + half), Math.max(PAD + half, max - PAD - half))\n const rawTop =\n s === 'top'\n ? r.top - sideOffset\n : s === 'bottom'\n ? r.bottom + sideOffset\n : r.top + r.height / 2\n const rawLeft =\n s === 'left'\n ? r.left - sideOffset\n : s === 'right'\n ? r.right + sideOffset\n : r.left + r.width / 2\n setCoords({\n top: s === 'left' || s === 'right' ? clamp(rawTop, ch / 2, vh) : rawTop,\n left: s === 'top' || s === 'bottom' ? clamp(rawLeft, cw / 2, vw) : rawLeft,\n transform: TRANSFORM_BY_SIDE[s],\n })\n }, [ctx?.open, side, sideOffset, collisionPadding, ctx?.triggerRef])\n\n if (!ctx?.open) return null\n\n const setRefs = (node: HTMLDivElement | null) => {\n innerRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node\n }\n\n return createPortal(\n <div\n ref={setRefs}\n id={ctx.contentId}\n role=\"tooltip\"\n className={cn(\n // The kit owns the tooltip's look: semantic tokens only, so it is\n // legible in every app without one of them defining a global class.\n // The `tooltip-content` hook is kept last-but-one so a host stylesheet\n // can still restyle every tooltip in one place (the ARBI app does, with\n // `!important` rules that win over these defaults).\n 'pointer-events-none w-max max-w-[300px] break-words rounded-md border border-border bg-popover px-3 py-2 text-sm font-normal text-popover-foreground shadow-lg',\n 'tooltip-content',\n className\n )}\n style={{\n position: 'fixed',\n top: coords?.top ?? -9999,\n left: coords?.left ?? -9999,\n transform: coords?.transform ?? TRANSFORM_BY_SIDE[side],\n opacity: coords ? undefined : 0,\n zIndex: 9999,\n ...style,\n }}\n {...props}\n />,\n document.body\n )\n }\n)\nTooltipContent.displayName = 'TooltipContent'\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","/**\n * IconToggle Component\n *\n * Base visual toggle button - switch toggle with +/- on hover\n *\n * DO NOT use directly - use a purpose-named wrapper instead (e.g. a\n * ContactToggle, VisibilityToggle, InChatToggle) so each call site reads as\n * what it does, not as a generic switch.\n */\n\nimport { LucideIcon, Plus, Minus } from 'lucide-react'\nimport { Tooltip, TooltipContent, TooltipTrigger } from './tooltip'\n\ninterface ColorClasses {\n text: string\n bg: string\n}\n\nexport interface IconToggleProps {\n icon: LucideIcon\n isActive: boolean\n onToggle: (isActive: boolean) => void\n colors: ColorClasses\n inactiveColors?: ColorClasses\n fillWhenActive?: boolean\n disabled?: boolean\n /** Tooltip to show when disabled (e.g., \"You cannot unshare this resource\") */\n disabledTooltip?: string\n showLabel?: boolean\n label?: string\n tooltipActive?: string\n tooltipInactive?: string\n tooltipMixed?: string\n isMixed?: boolean\n /** Set to false to disable tooltip (useful when nested inside another tooltip) */\n showTooltip?: boolean\n 'data-testid'?: string\n}\n\nexport function IconToggle({\n icon: Icon,\n isActive,\n onToggle,\n colors,\n inactiveColors,\n fillWhenActive = false,\n disabled = false,\n disabledTooltip,\n showLabel = false,\n label,\n tooltipActive,\n tooltipInactive,\n tooltipMixed,\n isMixed = false,\n showTooltip = true,\n 'data-testid': dataTestId,\n}: IconToggleProps) {\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation()\n onToggle(!isActive)\n }\n\n const { bg: bgColorClass } = colors\n\n const tooltipText = disabled\n ? disabledTooltip\n : isMixed\n ? tooltipMixed\n : isActive\n ? tooltipActive\n : tooltipInactive\n\n const { text: textColorClass } = colors\n\n const button = (\n <div className=\"inline-flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n data-testid={dataTestId}\n aria-pressed={isMixed ? 'mixed' : isActive}\n aria-label={label ?? tooltipText}\n className={`\n group/toggle relative inline-flex items-center h-4 w-8 rounded-full\n pointer-coarse:after:absolute pointer-coarse:after:left-1/2 pointer-coarse:after:top-1/2 pointer-coarse:after:size-11 pointer-coarse:after:-translate-x-1/2 pointer-coarse:after:-translate-y-1/2 pointer-coarse:after:content-['']\n transition-colors cursor-pointer\n disabled:opacity-50 disabled:cursor-not-allowed\n ${isActive ? bgColorClass : isMixed ? 'bg-muted-foreground' : (inactiveColors?.bg ?? 'bg-muted')}\n `}\n >\n {/* Hover icon on the opposite side of thumb - hidden when disabled */}\n {isActive && !disabled && (\n <div className=\"absolute left-0 w-4 h-4 flex items-center justify-center\">\n <Minus className=\"w-2.5 h-2.5 text-white/70 hidden group-hover/toggle:block\" />\n </div>\n )}\n {!isActive && !disabled && (\n <div className=\"absolute right-0 w-4 h-4 flex items-center justify-center\">\n <Plus className=\"w-2.5 h-2.5 text-muted-foreground hidden group-hover/toggle:block\" />\n </div>\n )}\n {/* Sliding thumb */}\n <div\n className={`\n absolute h-4 w-4 rounded-full bg-white shadow-sm\n flex items-center justify-center\n transition-transform duration-200\n ${isActive ? 'translate-x-4' : 'translate-x-0'}\n `}\n >\n <Icon\n className={`w-2.5 h-2.5 ${isActive ? textColorClass : (inactiveColors?.text ?? 'text-muted-foreground')} ${isActive && fillWhenActive ? 'fill-current' : ''}`}\n />\n </div>\n </button>\n </div>\n )\n\n return (\n <div className=\"inline-flex items-center gap-2\">\n {showLabel && label && <span className=\"font-semibold text-sm text-primary\">{label}</span>}\n {tooltipText && showTooltip ? (\n <Tooltip>\n <TooltipTrigger asChild onFocusCapture={(e) => e.stopPropagation()}>\n {button}\n </TooltipTrigger>\n <TooltipContent>\n <p>{tooltipText}</p>\n </TooltipContent>\n </Tooltip>\n ) : (\n button\n )}\n </div>\n )\n}\n","/**\n * VisibilityToggle Component\n *\n * Toggle for private/shared visibility state, the one control every shareable thing in the app uses\n * (documents, conversations, tags, facts, tasks). Supports single items and bulk operations. It takes\n * the items (with a shared field) and `onToggle` because the mutation differs by context. The name the\n * app gives a workspace appears in its tooltips (`workspaceLabel`).\n */\n\nimport { useMemo } from 'react'\nimport { Share2 } from 'lucide-react'\nimport { IconToggle } from './IconToggle'\n\ninterface SharedItem {\n shared?: boolean | null\n is_shared?: boolean | null\n}\n\nexport interface VisibilityToggleProps {\n /** Single item or array of items with shared/is_shared field */\n items: SharedItem | SharedItem[]\n /** Called with true to share, false to unshare */\n onToggle: (shouldShare: boolean) => void\n disabled?: boolean\n /** Tooltip to show when disabled (e.g., \"You cannot unshare this resource\") */\n disabledTooltip?: string\n disablePrivate?: boolean\n showLabel?: boolean\n /** Set to false to disable tooltip (useful when nested inside another tooltip) */\n showTooltip?: boolean\n tooltipActive?: string\n tooltipInactive?: string\n tooltipMixed?: string\n /** The visible label (when `showLabel`); defaults to \"Visibility\". */\n label?: string\n /** What the app calls a workspace, for the default tooltips. */\n workspaceLabel?: string\n 'data-testid'?: string\n}\n\nconst COLORS = {\n text: 'text-secondary',\n bg: 'bg-secondary',\n}\n\n// Helper to check if item is shared (supports both shared and is_shared fields)\nfunction isItemShared(item: SharedItem): boolean {\n return item.shared === true || item.is_shared === true\n}\n\nexport function VisibilityToggle({\n items,\n onToggle,\n disabled = false,\n disabledTooltip,\n disablePrivate = false,\n showLabel = true,\n showTooltip = true,\n tooltipActive,\n tooltipInactive,\n tooltipMixed,\n label = 'Visibility',\n workspaceLabel = 'workspace',\n 'data-testid': dataTestId,\n}: VisibilityToggleProps) {\n // Normalize to array\n const itemsArray = useMemo(() => (Array.isArray(items) ? items : [items]), [items])\n\n // Calculate shared state\n const { isAllShared, isMixed } = useMemo(() => {\n if (itemsArray.length === 0) return { isAllShared: false, isMixed: false }\n\n const sharedCount = itemsArray.filter(isItemShared).length\n return {\n isAllShared: sharedCount === itemsArray.length,\n isMixed: sharedCount > 0 && sharedCount < itemsArray.length,\n }\n }, [itemsArray])\n\n const isSingle = itemsArray.length === 1\n\n // Default tooltips\n const defaultTooltipActive = `Hide${isSingle ? '' : ' all'} from ${workspaceLabel} members`\n const defaultTooltipInactive = `Make${isSingle ? '' : ' all'} visible to ${workspaceLabel} members`\n const defaultTooltipMixed = `Make all visible to ${workspaceLabel} members (some already shared)`\n\n const handleToggle = () => {\n // If all are shared, we want to unshare (unless disablePrivate)\n // If mixed or none shared, we want to share all\n const shouldShare = !isAllShared\n if (disablePrivate && !shouldShare) return\n onToggle(shouldShare)\n }\n\n return (\n <IconToggle\n icon={Share2}\n isActive={isAllShared}\n onToggle={handleToggle}\n colors={COLORS}\n inactiveColors={{ text: 'text-primary', bg: 'bg-primary/10' }}\n disabled={disabled || itemsArray.length === 0}\n disabledTooltip={disabledTooltip}\n showLabel={showLabel}\n showTooltip={showTooltip}\n label={label}\n isMixed={isMixed}\n tooltipActive={tooltipActive || defaultTooltipActive}\n tooltipInactive={tooltipInactive || defaultTooltipInactive}\n tooltipMixed={tooltipMixed || defaultTooltipMixed}\n data-testid={dataTestId}\n />\n )\n}\n","/**\n * DictateContext\n *\n * Lets `Input`/`Textarea`'s `dictate` prop work with a one-line `dictate` prop\n * anywhere in the app, instead of threading a `transcribe` function through\n * every field individually. A host app wraps its tree once with\n * `<DictateProvider transcribe={...} onError={...}>`; every `dictate`-enabled\n * field downstream then just works. Fields rendered outside a provider\n * silently render without a mic button — dictation is a progressive\n * enhancement, never a hard requirement.\n */\n\nimport { createContext, useContext } from 'react'\n\nexport interface DictateContextValue {\n transcribe: (blob: Blob) => Promise<string>\n onError?: (message: string) => void\n}\n\nconst DictateContext = createContext<DictateContextValue | null>(null)\n\nexport function DictateProvider({\n transcribe,\n onError,\n children,\n}: DictateContextValue & { children: React.ReactNode }) {\n return (\n <DictateContext.Provider value={{ transcribe, onError }}>{children}</DictateContext.Provider>\n )\n}\n\nexport function useDictateContext(): DictateContextValue | null {\n return useContext(DictateContext)\n}\n","import * as React from 'react'\nimport * as AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport { cn } from '../lib/utils'\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn('relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full', className)}\n {...props}\n />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('aspect-square h-full w-full object-cover', className)}\n {...props}\n />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn(\n 'flex h-full w-full items-center justify-center rounded-full bg-muted',\n className\n )}\n {...props}\n />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../lib/utils'\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-md border px-2.5 py-0.5 text-sm font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80',\n accent: 'border-transparent bg-ai-accent-soft text-ai-accent',\n secondary:\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n destructive:\n 'border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80',\n outline: 'text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return <div className={cn(badgeVariants({ variant }), className)} {...props} />\n}\n\nexport { Badge, badgeVariants }\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../lib/utils'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0',\n {\n variants: {\n // One filled primary per view; everything else is tonal, hairline or ghost. No\n // static shadows: separation is tone, and shadows are reserved for floating layers.\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n accent: 'bg-ai-accent text-ai-accent-foreground hover:bg-ai-accent/90',\n destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n outline: 'border border-border bg-background hover:bg-muted',\n secondary: 'bg-muted text-foreground hover:bg-muted/70',\n ghost: 'hover:bg-muted',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n // Touch screens get a 44px target (coarse pointers only), mouse keeps the compact 36px.\n // `!` so the floor also wins over a caller's compact `h-7` or a container's\n // `[&_button]:h-7` rule: a compact toolbar on a phone must still be tappable.\n size: {\n default: 'h-9 px-4 py-2 pointer-coarse:h-11!',\n sm: 'h-8 rounded-md px-3 pointer-coarse:h-11! pointer-coarse:min-w-11',\n lg: 'h-10 rounded-md px-8 pointer-coarse:h-12!',\n icon: 'h-9 w-9 pointer-coarse:h-11! pointer-coarse:w-11!',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","import * as React from 'react'\nimport * as HoverCardPrimitive from '@radix-ui/react-hover-card'\n\nimport { cn } from '../lib/utils'\nimport { getCollisionPadding } from '../lib/collision-padding'\n\nconst HoverCard = HoverCardPrimitive.Root\n\nconst HoverCardTrigger = HoverCardPrimitive.Trigger\n\nconst HoverCardContent = React.forwardRef<\n React.ElementRef<typeof HoverCardPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n <HoverCardPrimitive.Portal>\n <HoverCardPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n collisionPadding={getCollisionPadding()}\n className={cn(\n 'z-50 w-64 max-w-[calc(100vw-1rem)] rounded-md border bg-popover p-4 text-popover-foreground shadow-lg outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-hover-card-content-transform-origin]',\n className\n )}\n {...props}\n />\n </HoverCardPrimitive.Portal>\n))\nHoverCardContent.displayName = HoverCardPrimitive.Content.displayName\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n","import * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../lib/utils'\n\n/**\n * Clean-ARBI design contract rule 3: borderless by default; shadows\n * only when an element needs to read as elevated/floating.\n *\n * - `flat` (default): just a rounded surface, no border, no shadow.\n * Separation comes from background + spacing.\n * - `outline`: adds a single border for surfaces that need a visible\n * edge (e.g. selectable list cards, embedded panels).\n * - `elevated`: border + a subtle shadow for cards that should lift.\n *\n * `min-w-0` lets a card be a grid/flex item narrower than its content (a truncated row inside\n * must not widen the track and push the page into horizontal scroll).\n *\n * Self-styled consumers that pass their own border/shadow classes keep\n * working unchanged on the default `flat` base.\n */\nconst cardVariants = cva('min-w-0 rounded-lg bg-card text-card-foreground', {\n variants: {\n variant: {\n flat: '',\n outline: 'border',\n elevated: 'border shadow-sm',\n },\n },\n defaultVariants: {\n variant: 'flat',\n },\n})\n\nexport interface CardProps\n extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof cardVariants> {}\n\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card\"\n className={cn(cardVariants({ variant }), className)}\n {...props}\n />\n )\n)\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-header\"\n className={cn('flex flex-col space-y-1.5 p-6', className)}\n {...props}\n />\n )\n)\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-title\"\n className={cn('font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n )\n)\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-description\"\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n )\n)\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div ref={ref} data-slot=\"card-content\" className={cn('p-6 pt-0', className)} {...props} />\n )\n)\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-footer\"\n className={cn('flex items-center p-6 pt-0', className)}\n {...props}\n />\n )\n)\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent, cardVariants }\n","/**\n * Shared getUserMedia error classification — used by both `useAudioRecorder`\n * (microphone) and `useCameraStream` (camera), so \"permission denied\" /\n * \"device not found\" / \"not supported\" read as the same message shape\n * regardless of which device was requested, without duplicating the\n * DOMException-name matching in every recorder hook.\n */\nexport type MediaDeviceKind = 'microphone' | 'camera'\n\nexport function classifyMediaError(err: unknown, kind: MediaDeviceKind): string {\n const label = kind === 'camera' ? 'Camera' : 'Microphone'\n const name = err instanceof DOMException ? err.name : undefined\n if (name === 'NotAllowedError' || name === 'SecurityError') {\n return `${label} access is blocked. Allow ${kind} permission in your browser settings to use this feature.`\n }\n if (name === 'NotFoundError' || name === 'DevicesNotFoundError') {\n return `No ${kind} found on this device.`\n }\n if (!navigator.mediaDevices?.getUserMedia) {\n return `${kind === 'camera' ? 'Camera' : 'Voice'} input is not supported in this browser.`\n }\n return `Could not access the ${kind}. Please try again.`\n}\n","/**\n * useAudioRecorder\n *\n * Shared recording engine — getUserMedia capture, MediaRecorder lifecycle,\n * and an AnalyserNode-driven live level meter. Host apps layer their own\n * interaction model on top of the primitives here: a press-and-hold mic\n * calls start()/stop() on press/release and never pauses; a toggle-style\n * recorder exposes all of start/pause/resume/stop/reset as buttons.\n *\n * REUSE-FIRST: no app coupling. Failures surface via the returned `error`\n * string rather than an app-specific toast/notification call — the host\n * decides how (or whether) to display it.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { classifyMediaError } from './media-error'\n\n// How often the live level meter updates (ms). Fast enough to read as live,\n// slow enough not to spam React with a render per animation frame.\nconst LEVEL_UPDATE_INTERVAL_MS = 50\n\nexport type AudioRecorderState = 'idle' | 'recording' | 'paused' | 'stopped'\n\nexport interface UseAudioRecorderResult {\n state: AudioRecorderState\n /** Live input level, 0-1. 0 while idle/paused/stopped. */\n level: number\n /** Total recorded duration so far (excludes time spent paused). Frozen at\n * its final value once stopped, until reset() clears it. */\n elapsedMs: number\n /** The finished recording. Only set once state === 'stopped'. */\n blob: Blob | null\n /** The MediaRecorder MIME type used (e.g. 'audio/webm'). Only set once\n * recording has started at least once. */\n mimeType: string | null\n /** A human-readable message from the last failed start() attempt. Cleared\n * at the start of every new attempt, so it always transitions through\n * `null` even if the next failure has the same message. */\n error: string | null\n start: () => Promise<void>\n pause: () => void\n resume: () => void\n stop: () => void\n /** Back to idle: clears blob/elapsedMs/mimeType, ready to record again. */\n reset: () => void\n}\n\nexport function useAudioRecorder(): UseAudioRecorderResult {\n const [state, setState] = useState<AudioRecorderState>('idle')\n const [level, setLevel] = useState(0)\n const [elapsedMs, setElapsedMs] = useState(0)\n const [blob, setBlob] = useState<Blob | null>(null)\n const [mimeType, setMimeType] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n const mediaRecorderRef = useRef<MediaRecorder | null>(null)\n const chunksRef = useRef<Blob[]>([])\n const streamRef = useRef<MediaStream | null>(null)\n const stateRef = useRef<AudioRecorderState>('idle')\n stateRef.current = state\n // Elapsed time is tracked as (time accumulated in prior recording segments)\n // + (time since the current segment started) — pause/resume closes one\n // segment and opens another, so a pause never counts toward the duration.\n const segmentStartRef = useRef(0)\n const accumulatedMsRef = useRef(0)\n const audioContextRef = useRef<AudioContext | null>(null)\n const analyserRef = useRef<AnalyserNode | null>(null)\n const levelRafRef = useRef<number | null>(null)\n\n const stopMeter = useCallback(() => {\n if (levelRafRef.current !== null) cancelAnimationFrame(levelRafRef.current)\n levelRafRef.current = null\n analyserRef.current = null\n void audioContextRef.current?.close().catch(() => {})\n audioContextRef.current = null\n }, [])\n\n const startMeter = useCallback((stream: MediaStream) => {\n const audioContext = new AudioContext()\n const source = audioContext.createMediaStreamSource(stream)\n const analyser = audioContext.createAnalyser()\n analyser.fftSize = 256\n source.connect(analyser)\n audioContextRef.current = audioContext\n analyserRef.current = analyser\n\n const data = new Uint8Array(analyser.frequencyBinCount)\n let lastUpdate = 0\n const tick = (t: number) => {\n const active = analyserRef.current\n if (!active) return\n if (t - lastUpdate >= LEVEL_UPDATE_INTERVAL_MS) {\n lastUpdate = t\n active.getByteTimeDomainData(data)\n let sumSquares = 0\n for (let i = 0; i < data.length; i++) {\n const centered = (data[i] - 128) / 128\n sumSquares += centered * centered\n }\n const rms = Math.sqrt(sumSquares / data.length)\n // Normal speech RMS is tiny (a laptop mic at conversational\n // distance rarely exceeds ~0.1) — boost it, then apply a sqrt\n // (perceptual) curve so quiet-to-moderate speech is clearly\n // visible instead of needing to shout to move the meter at all.\n setLevel(Math.sqrt(Math.min(1, rms * 8)))\n setElapsedMs(accumulatedMsRef.current + (t - segmentStartRef.current))\n }\n levelRafRef.current = requestAnimationFrame(tick)\n }\n levelRafRef.current = requestAnimationFrame(tick)\n }, [])\n\n const stopTracks = useCallback(() => {\n streamRef.current?.getTracks().forEach((t) => t.stop())\n streamRef.current = null\n }, [])\n\n useEffect(\n () => () => {\n stopTracks()\n stopMeter()\n },\n [stopTracks, stopMeter]\n )\n\n const start = useCallback(async () => {\n if (stateRef.current === 'recording' || stateRef.current === 'paused') return\n setError(null)\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true })\n streamRef.current = stream\n const mt = MediaRecorder.isTypeSupported('audio/webm') ? 'audio/webm' : 'audio/mp4'\n const recorder = new MediaRecorder(stream, { mimeType: mt })\n chunksRef.current = []\n recorder.ondataavailable = (e) => {\n if (e.data.size > 0) chunksRef.current.push(e.data)\n }\n mediaRecorderRef.current = recorder\n setMimeType(mt)\n setBlob(null)\n accumulatedMsRef.current = 0\n segmentStartRef.current = performance.now()\n recorder.start()\n setState('recording')\n startMeter(stream)\n } catch (err) {\n stopTracks()\n setError(classifyMediaError(err, 'microphone'))\n }\n }, [startMeter, stopTracks])\n\n const pause = useCallback(() => {\n const recorder = mediaRecorderRef.current\n if (!recorder || recorder.state !== 'recording') return\n recorder.pause()\n accumulatedMsRef.current += performance.now() - segmentStartRef.current\n stopMeter()\n setLevel(0)\n setState('paused')\n }, [stopMeter])\n\n const resume = useCallback(() => {\n const recorder = mediaRecorderRef.current\n if (!recorder || recorder.state !== 'paused') return\n recorder.resume()\n segmentStartRef.current = performance.now()\n setState('recording')\n if (streamRef.current) startMeter(streamRef.current)\n }, [startMeter])\n\n const stop = useCallback(() => {\n const recorder = mediaRecorderRef.current\n if (!recorder || recorder.state === 'inactive') return\n // Freeze the final duration before tearing the meter down — recording\n // won't include the time it takes MediaRecorder to flush+fire onstop.\n const finalElapsed =\n recorder.state === 'paused'\n ? accumulatedMsRef.current\n : accumulatedMsRef.current + (performance.now() - segmentStartRef.current)\n stopMeter()\n recorder.onstop = () => {\n stopTracks()\n const finalBlob = chunksRef.current.length\n ? new Blob(chunksRef.current, { type: recorder.mimeType })\n : null\n setBlob(finalBlob)\n setElapsedMs(finalElapsed)\n setLevel(0)\n setState('stopped')\n }\n recorder.stop()\n }, [stopMeter, stopTracks])\n\n const reset = useCallback(() => {\n setState('idle')\n setBlob(null)\n setElapsedMs(0)\n setLevel(0)\n setMimeType(null)\n setError(null)\n }, [])\n\n return { state, level, elapsedMs, blob, mimeType, error, start, pause, resume, stop, reset }\n}\n","/** Formats a duration in milliseconds as \"mm:ss\", clamped to non-negative. */\nexport function formatElapsed(ms: number): string {\n const totalSeconds = Math.max(0, Math.floor(ms / 1000))\n const minutes = Math.floor(totalSeconds / 60)\n const seconds = totalSeconds % 60\n return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`\n}\n","/**\n * MicWaveformIndicator\n *\n * The REC-badge + timer + waveform visual — the reusable \"is it hearing me\"\n * piece shared by any press-and-hold or toggle-style audio recorder a host\n * app builds on `useAudioRecorder`. Purely presentational: no portal, no\n * card chrome, no caption — callers provide their own context around it.\n *\n * Styled like the REC-badge + timer + waveform convention every voice\n * recorder app uses (Voice Memos, WhatsApp, Slack huddles) — recognisable\n * at a glance as \"this bar height is how loud you are\", not just decoration.\n */\n\nimport { formatElapsed } from './format-elapsed'\n\n// A waveform silhouette (bell-shaped with a little natural asymmetry) rather\n// than a uniform bank of bars — reads as an actual audio waveform rather\n// than N identical dots. Every bar still scales with the same live `level`.\nconst BAR_WEIGHTS = [\n 0.25, 0.32, 0.48, 0.62, 0.82, 0.56, 0.92, 0.72, 1, 0.86, 0.62, 0.96, 0.76, 0.5, 0.84, 0.66, 0.42,\n 0.56, 0.36, 0.28, 0.22,\n]\nconst MIN_BAR_PX = 3\nconst MAX_BAR_PX = 40\n\nexport interface MicWaveformIndicatorProps {\n level: number\n elapsedMs: number\n /** Dims the REC badge and freezes the \"recording\" framing while paused,\n * without needing a separate visual language. */\n paused?: boolean\n}\n\nexport function MicWaveformIndicator({\n level,\n elapsedMs,\n paused = false,\n}: MicWaveformIndicatorProps) {\n return (\n <div className=\"flex flex-col items-center gap-3\" data-testid=\"mic-waveform-indicator\">\n <div className=\"flex items-center gap-2\">\n <span className=\"relative flex h-2 w-2\">\n {!paused && (\n <span className=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-red-500 opacity-75\" />\n )}\n <span\n className={`relative inline-flex h-2 w-2 rounded-full ${paused ? 'bg-muted-foreground' : 'bg-red-500'}`}\n />\n </span>\n <span\n className={`text-xs font-semibold uppercase tracking-wide ${paused ? 'text-muted-foreground' : 'text-red-500'}`}\n >\n {paused ? 'Paused' : 'Rec'}\n </span>\n <span className=\"font-mono text-xs tabular-nums text-muted-foreground\">\n {formatElapsed(elapsedMs)}\n </span>\n </div>\n <div className=\"flex h-10 items-end gap-[3px]\" data-testid=\"mic-waveform-indicator-bars\">\n {BAR_WEIGHTS.map((weight, i) => (\n <span\n key={i}\n className=\"w-1 rounded-full bg-secondary transition-[height] duration-75 ease-out\"\n style={{\n height: Math.min(MAX_BAR_PX, Math.max(MIN_BAR_PX, level * weight * MAX_BAR_PX)),\n }}\n />\n ))}\n </div>\n </div>\n )\n}\n","/**\n * MicRecordingOverlay\n *\n * The big, unmissable \"is it hearing me\" feedback for an active recording —\n * a centered, portaled card with the REC-badge/timer/waveform visual\n * (MicWaveformIndicator). Shared by any recorder in the app that wants the\n * same prominent treatment while actively recording: the chat composer's\n * press-and-hold mic and the inline dictate button both use this, so\n * \"you are recording\" looks and feels identical everywhere it happens.\n *\n * Non-interactive (pointer-events disabled) so it never blocks a click\n * elsewhere; mounted via a portal so it renders above whatever field or\n * layout it was triggered from, regardless of overflow/z-index there.\n */\n\nimport { createPortal } from 'react-dom'\nimport { MicWaveformIndicator } from './MicWaveformIndicator'\n\nexport interface MicRecordingOverlayProps {\n level: number\n elapsedMs: number\n paused?: boolean\n /** Caption under the waveform — defaults to the press-and-hold framing. */\n caption?: string\n}\n\nexport function MicRecordingOverlay({\n level,\n elapsedMs,\n paused,\n caption = 'Keep button pressed while speaking',\n}: MicRecordingOverlayProps) {\n if (typeof document === 'undefined') return null\n return createPortal(\n <div\n aria-hidden\n className=\"pointer-events-none fixed inset-0 z-[2147483647] flex items-center justify-center\"\n data-testid=\"mic-recording-overlay\"\n >\n <div className=\"flex w-72 flex-col items-center gap-3 rounded-2xl bg-background/95 px-6 py-5 shadow-2xl ring-1 ring-border backdrop-blur-sm\">\n <MicWaveformIndicator level={level} elapsedMs={elapsedMs} paused={paused} />\n <p className=\"text-center text-sm font-medium text-muted-foreground\">{caption}</p>\n </div>\n </div>,\n document.body\n )\n}\n","/**\n * InlineMicButton\n *\n * A dictate-instead-of-type button meant to sit inside a text field's own\n * padding (a corner of an `<input>`/`<textarea>`), not a standalone feature\n * in its own right — no waveform, no timer, no card chrome. Only shows while\n * the host field is focused (or mid-recording/transcribing, so it never\n * vanishes out from under an active dictation) — otherwise the field stays\n * clean. Idle it's subtle (small, muted); once pressed it's the opposite —\n * a solid, unmissable recording indicator, because \"is this thing listening\"\n * is the one moment subtlety actively hurts. Built on the same\n * useAudioRecorder engine as VoiceNoteRecorder/MicButton.\n *\n * Two ways to use it, same as WhatsApp/Telegram voice messages:\n * - Press and hold, release to stop — quick dictation, thumb-friendly.\n * - A quick tap instead locks it into hands-free recording (no need to keep\n * the pointer down for a long note); tap again to stop. A tap is whatever\n * releases before HOLD_THRESHOLD_MS — past that it's a hold, and release\n * stops it immediately.\n *\n * REUSE-FIRST: props/callbacks in. The host supplies `transcribe` (its own\n * speech-to-text endpoint), `focused` (its own focus state), and\n * `onTranscript` (where the text goes — append, insert at cursor, whatever\n * fits the field).\n *\n * `preventDefault()` on pointerdown so pressing this button never steals\n * focus from the field it's embedded in — without that, a field that blurs\n * to collapse itself (e.g. an editor that exits edit mode on blur) would\n * close out from under a user mid-dictation, and `focused` would immediately\n * flip false and hide the button being pressed.\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport { Mic, Square, Loader2 } from 'lucide-react'\nimport { useAudioRecorder } from './useAudioRecorder'\nimport { MicRecordingOverlay } from './MicRecordingOverlay'\n\n// Below this, a press-release is a \"tap\" (locks into hands-free recording);\n// at or above it, release stops the recording immediately (press-and-hold).\nconst HOLD_THRESHOLD_MS = 350\n\nexport interface InlineMicButtonProps {\n /** Whether the host field currently has focus. The button renders only\n * while this is true, or while actively recording/transcribing. */\n focused: boolean\n /** Called with the transcribed text once recording stops and transcription\n * resolves. The host decides how to merge it into the field's value. */\n onTranscript: (text: string) => void\n /** Surfaces recorder or transcription failures — wire to the host's own\n * notification system. Without it, failures are silent. */\n onError?: (message: string) => void\n /** The host's own speech-to-text call. */\n transcribe: (blob: Blob) => Promise<string>\n className?: string\n}\n\nexport function InlineMicButton({\n focused,\n onTranscript,\n onError,\n transcribe,\n className,\n}: InlineMicButtonProps) {\n const recorder = useAudioRecorder()\n const [isTranscribing, setIsTranscribing] = useState(false)\n // True once a quick tap has left the recording running hands-free — the\n // next press (of any length) is the \"stop\" gesture rather than a new hold.\n const [latched, setLatched] = useState(false)\n const pressedAtRef = useRef(0)\n\n useEffect(() => {\n if (recorder.error) onError?.(recorder.error)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recorder.error])\n\n useEffect(() => {\n if (recorder.state !== 'stopped' || !recorder.blob) return\n const blob = recorder.blob\n setIsTranscribing(true)\n transcribe(blob)\n .then((text) => {\n if (text.trim()) onTranscript(text.trim())\n })\n .catch((err) => {\n onError?.(err instanceof Error ? err.message : 'Could not transcribe audio.')\n })\n .finally(() => {\n setIsTranscribing(false)\n setLatched(false)\n recorder.reset()\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recorder.state, recorder.blob])\n\n const isRecording = recorder.state === 'recording'\n const isBusy = isTranscribing\n\n if (!focused && !isRecording && !isBusy) return null\n\n const handlePointerDown = (e: React.PointerEvent) => {\n e.preventDefault()\n if (isRecording) return // latched (or otherwise already going) — let pointerup stop it\n pressedAtRef.current = Date.now()\n void recorder.start()\n }\n\n const handlePointerUp = () => {\n if (!isRecording) return\n if (latched) {\n recorder.stop()\n setLatched(false)\n return\n }\n const held = Date.now() - pressedAtRef.current\n if (held >= HOLD_THRESHOLD_MS) {\n recorder.stop()\n } else {\n setLatched(true)\n }\n }\n\n const handlePointerLeave = () => {\n // Dragged off mid-hold (not latched into hands-free) — stop, same as\n // releasing over the button. Latched recording stays running regardless\n // of where the pointer goes; that's the point of hands-free.\n if (isRecording && !latched) recorder.stop()\n }\n\n return (\n <>\n <button\n type=\"button\"\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n onPointerLeave={handlePointerLeave}\n onPointerCancel={handlePointerLeave}\n disabled={isBusy}\n title={\n isRecording ? 'Release to stop, or tap again if hands-free' : 'Hold, or tap to dictate'\n }\n data-testid=\"inline-mic-button\"\n className={`inline-flex items-center justify-center rounded-full transition-colors disabled:pointer-events-none ${\n isRecording\n ? 'h-7 w-7 bg-red-500 text-white shadow-sm hover:bg-red-600'\n : isBusy\n ? 'h-6 w-6 text-muted-foreground'\n : 'h-6 w-6 text-muted-foreground/50 hover:bg-muted hover:text-muted-foreground'\n } ${className ?? ''}`}\n >\n {isBusy ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : isRecording ? (\n <Square className=\"h-3 w-3 fill-current\" />\n ) : (\n <Mic className=\"h-3.5 w-3.5\" />\n )}\n </button>\n {/* Same big, unmissable \"is it hearing me\" feedback as the chat\n composer's mic — reused, not reimplemented, so every recording in\n the app looks and feels the same. */}\n {isRecording && (\n <MicRecordingOverlay\n level={recorder.level}\n elapsedMs={recorder.elapsedMs}\n caption={latched ? 'Tap the mic again to stop' : 'Release to stop, or keep holding'}\n />\n )}\n </>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../lib/utils'\nimport { InlineMicButton } from '../documents/InlineMicButton'\nimport { useDictateContext } from './DictateContext'\n\nexport interface InputProps extends React.ComponentProps<'input'> {\n /** Adds a small dictate-instead-of-type button inside the field's right\n * edge (visible only while focused, or mid-recording) that appends\n * transcribed speech to the field's value. Requires a `DictateProvider`\n * ancestor supplying the host's transcribe endpoint — with none, this is\n * a no-op (no button renders). Not meant for password/search/numeric/code\n * fields — opt in per field, not on by default. */\n dictate?: boolean\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, dictate, onFocus, onBlur, ...props }, forwardedRef) => {\n const dictateCtx = useDictateContext()\n const [focused, setFocused] = React.useState(false)\n const innerRef = React.useRef<HTMLInputElement>(null)\n React.useImperativeHandle(forwardedRef, () => innerRef.current as HTMLInputElement)\n\n const showDictate = dictate && !!dictateCtx && !props.disabled && !props.readOnly\n\n const input = (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n 'flex h-9 pointer-coarse:h-11 w-full rounded-md border border-input bg-background px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground/60 focus-visible:outline-none focus-visible:border-ring/50 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n showDictate && 'pr-9',\n className\n )}\n ref={innerRef}\n onFocus={(e) => {\n setFocused(true)\n onFocus?.(e)\n }}\n onBlur={(e) => {\n setFocused(false)\n onBlur?.(e)\n }}\n {...props}\n />\n )\n\n if (!showDictate) return input\n\n return (\n <div className=\"relative w-full\">\n {input}\n <InlineMicButton\n focused={focused}\n transcribe={dictateCtx.transcribe}\n onError={dictateCtx.onError}\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2\"\n onTranscript={(text) => {\n const el = innerRef.current\n if (!el) return\n const next = el.value ? `${el.value} ${text}` : text\n const setter = Object.getOwnPropertyDescriptor(\n window.HTMLInputElement.prototype,\n 'value'\n )?.set\n setter?.call(el, next)\n el.dispatchEvent(new Event('input', { bubbles: true }))\n }}\n />\n </div>\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","'use client'\n\nimport * as React from 'react'\n\ninterface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n className?: string\n}\n\nconst Label = React.forwardRef<HTMLLabelElement, LabelProps>(({ className, ...props }, ref) => (\n <label\n ref={ref}\n className={`text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70 ${className || ''}`}\n {...props}\n />\n))\n\nLabel.displayName = 'Label'\n\nexport { Label }\n","import * as React from 'react'\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\n\nimport { cn } from '../lib/utils'\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(({ className, orientation = 'horizontal', decorative = true, ...props }, ref) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',\n className\n )}\n {...props}\n />\n))\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","import * as React from 'react'\n\nimport { cn } from '../lib/utils'\nimport { InlineMicButton } from '../documents/InlineMicButton'\nimport { useDictateContext } from './DictateContext'\n\nexport interface TextareaProps extends React.ComponentProps<'textarea'> {\n /** Adds a small dictate-instead-of-type button inside the field's top-right\n * corner (visible only while focused, or mid-recording) that appends\n * transcribed speech to the field's value. Requires a `DictateProvider`\n * ancestor supplying the host's transcribe endpoint — with none, this is\n * a no-op (no button renders). */\n dictate?: boolean\n}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, dictate, onFocus, onBlur, ...props }, forwardedRef) => {\n const dictateCtx = useDictateContext()\n const [focused, setFocused] = React.useState(false)\n const innerRef = React.useRef<HTMLTextAreaElement>(null)\n React.useImperativeHandle(forwardedRef, () => innerRef.current as HTMLTextAreaElement)\n\n const showDictate = dictate && !!dictateCtx && !props.disabled && !props.readOnly\n\n const textarea = (\n <textarea\n className={cn(\n 'flex min-h-[60px] w-full rounded-md border border-input bg-background px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground/60 focus-visible:outline-none focus-visible:border-ring/50 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n showDictate && 'pr-9',\n className\n )}\n ref={innerRef}\n onFocus={(e) => {\n setFocused(true)\n onFocus?.(e)\n }}\n onBlur={(e) => {\n setFocused(false)\n onBlur?.(e)\n }}\n {...props}\n />\n )\n\n if (!showDictate) return textarea\n\n return (\n <div className=\"relative w-full\">\n {textarea}\n <InlineMicButton\n focused={focused}\n transcribe={dictateCtx.transcribe}\n onError={dictateCtx.onError}\n className=\"absolute right-1.5 top-1.5\"\n onTranscript={(text) => {\n const el = innerRef.current\n if (!el) return\n const next = el.value ? `${el.value} ${text}` : text\n const setter = Object.getOwnPropertyDescriptor(\n window.HTMLTextAreaElement.prototype,\n 'value'\n )?.set\n setter?.call(el, next)\n el.dispatchEvent(new Event('input', { bubbles: true }))\n }}\n />\n </div>\n )\n }\n)\nTextarea.displayName = 'Textarea'\n\nexport { Textarea }\n","import * as CollapsiblePrimitive from '@radix-ui/react-collapsible'\n\nconst Collapsible = CollapsiblePrimitive.Root\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n","import * as React from 'react'\nimport * as ProgressPrimitive from '@radix-ui/react-progress'\n\nimport { cn } from '../lib/utils'\n\nconst Progress = React.forwardRef<\n React.ElementRef<typeof ProgressPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n <ProgressPrimitive.Root\n ref={ref}\n className={cn('relative h-2 w-full overflow-hidden rounded-full bg-primary/20', className)}\n {...props}\n >\n <ProgressPrimitive.Indicator\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n))\nProgress.displayName = ProgressPrimitive.Root.displayName\n\nexport { Progress }\n","import * as React from 'react'\nimport * as RadioGroupPrimitive from '@radix-ui/react-radio-group'\nimport { Circle } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\n\nconst RadioGroup = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => {\n return <RadioGroupPrimitive.Root className={cn('grid gap-2', className)} {...props} ref={ref} />\n})\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n className={cn(\n \"relative aspect-square h-4 w-4 rounded-full border border-primary text-primary after:absolute after:left-1/2 after:top-1/2 after:hidden after:size-11 after:-translate-x-1/2 after:-translate-y-1/2 after:content-[''] pointer-coarse:after:block focus:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <Circle className=\"h-2.5 w-2.5 fill-current text-current\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n})\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName\n\nexport { RadioGroup, RadioGroupItem }\n","import * as React from 'react'\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox'\nimport { Check } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n \"peer relative h-4 w-4 shrink-0 rounded-sm border border-muted-foreground/50 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground after:absolute after:left-1/2 after:top-1/2 after:hidden after:size-11 after:-translate-x-1/2 after:-translate-y-1/2 after:content-[''] pointer-coarse:after:block\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator className={cn('flex items-center justify-center text-current')}>\n <Check className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\nCheckbox.displayName = CheckboxPrimitive.Root.displayName\n\nexport { Checkbox }\n","import * as React from 'react'\nimport * as SwitchPrimitives from '@radix-ui/react-switch'\n\nimport { cn } from '../lib/utils'\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n \"peer relative inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input dark:data-[state=unchecked]:bg-muted-foreground/45 after:absolute after:left-1/2 after:top-1/2 after:hidden after:size-11 after:-translate-x-1/2 after:-translate-y-1/2 after:content-[''] pointer-coarse:after:block\",\n className\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n 'pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0'\n )}\n />\n </SwitchPrimitives.Root>\n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n","import * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\n\nimport { cn } from '../lib/utils'\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n 'inline-flex h-9 pointer-coarse:h-auto items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground',\n className\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm pointer-coarse:min-h-11 font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow',\n className\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","import * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Table = React.forwardRef<HTMLTableElement, React.HTMLAttributes<HTMLTableElement>>(\n ({ className, ...props }, ref) => (\n <div className=\"relative w-full overflow-auto\">\n <table ref={ref} className={cn('w-full caption-bottom text-sm', className)} {...props} />\n </div>\n )\n)\nTable.displayName = 'Table'\n\nconst TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <thead ref={ref} className={cn('[&_tr]:border-b', className)} {...props} />\n))\nTableHeader.displayName = 'TableHeader'\n\nconst TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tbody ref={ref} className={cn('[&_tr:last-child]:border-0', className)} {...props} />\n))\nTableBody.displayName = 'TableBody'\n\nconst TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn('border-t bg-muted/50 font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n))\nTableFooter.displayName = 'TableFooter'\n\nconst TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTMLTableRowElement>>(\n ({ className, ...props }, ref) => (\n <tr\n ref={ref}\n className={cn(\n 'border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted',\n className\n )}\n {...props}\n />\n )\n)\nTableRow.displayName = 'TableRow'\n\ninterface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n className?: string\n}\n\nconst TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({ className, ...props }, ref) => (\n <th\n ref={ref}\n className={cn(\n 'h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className\n )}\n {...props}\n />\n )\n)\nTableHead.displayName = 'TableHead'\n\ninterface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n className?: string\n}\n\nconst TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, ...props }, ref) => (\n <td\n ref={ref}\n className={cn(\n 'p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]',\n className\n )}\n {...props}\n />\n )\n)\nTableCell.displayName = 'TableCell'\n\nconst TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n <caption ref={ref} className={cn('mt-4 text-sm text-muted-foreground', className)} {...props} />\n))\nTableCaption.displayName = 'TableCaption'\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption }\n","import * as React from 'react'\nimport * as SliderPrimitive from '@radix-ui/react-slider'\n\nimport { cn } from '../lib/utils'\n\ninterface SliderProps extends React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root> {\n rangeClassName?: string\n}\n\nconst Slider = React.forwardRef<React.ElementRef<typeof SliderPrimitive.Root>, SliderProps>(\n ({ className, rangeClassName, ...props }, ref) => (\n <SliderPrimitive.Root\n ref={ref}\n className={cn('relative flex w-full touch-none select-none items-center', className)}\n {...props}\n >\n <SliderPrimitive.Track className=\"relative h-1.5 w-full grow overflow-hidden rounded-full bg-primary/20\">\n <SliderPrimitive.Range className={cn('absolute h-full bg-primary', rangeClassName)} />\n </SliderPrimitive.Track>\n <SliderPrimitive.Thumb className=\"block h-4 w-4 rounded-full border border-primary/50 bg-background shadow transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50\" />\n </SliderPrimitive.Root>\n )\n)\nSlider.displayName = SliderPrimitive.Root.displayName\n\nexport { Slider }\n","'use client'\n\nimport * as React from 'react'\nimport * as TogglePrimitive from '@radix-ui/react-toggle'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../lib/utils'\n\nconst toggleVariants = cva(\n 'inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'bg-transparent',\n outline:\n 'border border-input bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground',\n },\n size: {\n default: 'h-9 px-2 min-w-9 pointer-coarse:h-11 pointer-coarse:min-w-11',\n sm: 'h-8 px-1.5 min-w-8 pointer-coarse:h-11 pointer-coarse:min-w-11',\n lg: 'h-10 px-2.5 min-w-10 pointer-coarse:h-11 pointer-coarse:min-w-11',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root\n ref={ref}\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n))\n\nToggle.displayName = TogglePrimitive.Root.displayName\n\nexport { Toggle, toggleVariants }\n","import * as React from 'react'\nimport * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group'\nimport { type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../lib/utils'\nimport { toggleVariants } from './toggle'\n\nconst ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants>>({\n size: 'default',\n variant: 'default',\n})\n\nconst ToggleGroup = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants>\n>(({ className, variant, size, children, ...props }, ref) => (\n <ToggleGroupPrimitive.Root\n ref={ref}\n className={cn('flex items-center justify-center gap-1', className)}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size }}>{children}</ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n))\n\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName\n\nconst ToggleGroupItem = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleVariants>\n>(({ className, children, variant, size, ...props }, ref) => {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n <ToggleGroupPrimitive.Item\n ref={ref}\n className={cn(\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n )\n})\n\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName\n\nexport { ToggleGroup, ToggleGroupItem }\n","/**\n * True when an interaction landed on a sonner toast. The toaster renders in its own\n * portal, outside every dialog, so Radix counts a click (or the focus move from\n * clicking a toast's close button) as an \"outside\" interaction and dismisses the open\n * dialog — e.g. clicking the \"Welcome\" toast closed the create-workspace dialog\n * underneath it.\n */\nexport function isToastInteraction(event: Event): boolean {\n const original = (event as CustomEvent<{ originalEvent?: Event }>).detail?.originalEvent\n const target = original?.target ?? event.target\n return target instanceof Element && target.closest('[data-sonner-toaster]') !== null\n}\n","import * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { X } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\nimport { isToastInteraction } from '../lib/toast-interaction'\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\n/**\n * Where the dialog sits on a PHONE (< 640px). Wider screens always get a centred dialog.\n * - `center`: centred box with a 1rem margin (small prompts and confirmations).\n * - `sheet`: bottom sheet, full width, rounded top corners (forms and pickers).\n * - `full`: full-height sheet that stops below the status bar (large editors, wizards).\n */\nexport type DialogPresentation = 'center' | 'sheet' | 'full'\n\nconst PHONE_PRESENTATION: Record<DialogPresentation, string> = {\n center: '',\n sheet:\n 'max-sm:top-auto max-sm:bottom-0 max-sm:left-0 max-sm:w-full max-sm:max-w-full max-sm:border-x-0 max-sm:border-b-0 max-sm:translate-x-0 max-sm:translate-y-0 max-sm:rounded-b-none max-sm:rounded-t-xl max-sm:pb-[max(1.5rem,env(safe-area-inset-bottom))] max-sm:max-h-[calc(100dvh-env(safe-area-inset-top,0px)-2.5rem)] max-sm:data-[state=open]:slide-in-from-bottom-10 max-sm:data-[state=open]:zoom-in-100 max-sm:data-[state=closed]:zoom-out-100',\n full: 'max-sm:top-auto max-sm:bottom-0 max-sm:left-0 max-sm:border-x-0 max-sm:border-b-0 max-sm:h-[calc(100dvh-env(safe-area-inset-top,0px)-1rem)] max-sm:w-full max-sm:max-w-full max-sm:translate-x-0 max-sm:translate-y-0 max-sm:rounded-b-none max-sm:rounded-t-xl max-sm:pb-[max(1.5rem,env(safe-area-inset-bottom))] max-sm:max-h-none max-sm:data-[state=open]:slide-in-from-bottom-10 max-sm:data-[state=open]:zoom-in-100 max-sm:data-[state=closed]:zoom-out-100',\n}\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n hideCloseButton?: boolean\n /** Phone presentation (see {@link DialogPresentation}). Defaults to `center`. */\n presentation?: DialogPresentation\n }\n>(\n (\n { className, children, hideCloseButton, presentation = 'center', onInteractOutside, ...props },\n ref\n ) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n data-slot=\"dialog-content\"\n data-presentation={presentation}\n onInteractOutside={(event) => {\n if (isToastInteraction(event)) event.preventDefault()\n onInteractOutside?.(event)\n }}\n className={cn(\n // Always inside the viewport: width and height are capped by the DYNAMIC viewport (mobile\n // browser chrome) and the notch / home-indicator insets; the content scrolls inside.\n 'fixed left-[50%] top-[50%] z-50 grid w-[calc(100%-2rem-env(safe-area-inset-left,0px)-env(safe-area-inset-right,0px))] max-w-lg max-h-[calc(min(100dvh,100svh,100vh)-2rem-env(safe-area-inset-top,0px)-env(safe-area-inset-bottom,0px))] translate-x-[-50%] translate-y-[-50%] will-change-transform grid-cols-[minmax(0,1fr)] gap-4 overflow-x-hidden overflow-y-auto overscroll-contain scrollbar-themed border bg-background p-6 shadow-xl duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 rounded-md',\n PHONE_PRESENTATION[presentation],\n className\n )}\n {...props}\n >\n {children}\n {!hideCloseButton && (\n <DialogPrimitive.Close\n // `fixed` inside the transformed dialog is positioned against the dialog box, not its\n // scrolling content: the close button never scrolls away.\n className=\"fixed right-4 top-4 z-20 inline-flex items-center justify-center rounded-sm pointer-coarse:right-2 pointer-coarse:top-2 pointer-coarse:size-11 opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\"\n data-testid=\"dialog-close-button\"\n >\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close dialog</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n)\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div className={cn('flex min-w-0 flex-col space-y-1.5 pr-8 text-left', className)} {...props} />\n)\nDialogHeader.displayName = 'DialogHeader'\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n // Sticks to the bottom of a scrolling dialog so the actions stay reachable.\n 'sticky bottom-0 z-10 -mx-6 -mb-6 flex flex-col-reverse gap-2 bg-background px-6 pb-6 pt-3 sm:flex-row sm:justify-end',\n className\n )}\n {...props}\n />\n)\nDialogFooter.displayName = 'DialogFooter'\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('break-words text-lg font-semibold leading-tight tracking-tight', className)}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","import * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '../lib/utils'\nimport { getCollisionPadding } from '../lib/collision-padding'\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> & {\n container?: HTMLElement | null\n }\n>(({ className, align = 'center', sideOffset = 4, container, ...props }, ref) => (\n <PopoverPrimitive.Portal container={container ?? undefined}>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n collisionPadding={getCollisionPadding()}\n className={cn(\n 'z-50 w-72 max-w-[calc(100vw-1rem)] max-h-[var(--radix-popover-content-available-height)] overflow-y-auto overscroll-contain rounded-md border bg-popover p-4 text-popover-foreground shadow-lg outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]',\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","import {\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type PointerEvent as ReactPointerEvent,\n type Ref,\n type ReactNode,\n} from 'react'\nimport { Popover, PopoverAnchor, PopoverContent } from './popover'\nimport { cn } from '../lib/utils'\n\n/** One row of a mark's menu. Give it `onSelect`, or an `href` for a real link row. */\nexport interface MarkMenuItem {\n id: string\n label: string\n /** Runs when the row is chosen; the menu closes afterwards. */\n onSelect?: () => void\n /** Renders the row as a link (no `onSelect` needed). */\n href?: string\n /** The headline action: listed first, set a little larger, and run by a plain mouse click. */\n primary?: boolean\n destructive?: boolean\n testId?: string\n}\n\nexport interface MarkMenuProps extends Omit<HTMLAttributes<HTMLElement>, 'children' | 'onClick'> {\n /** The element the mark itself is: a real link or an inline span. */\n as?: 'a' | 'span'\n href?: string\n /** Rows of the menu. The `primary` one (else the first) is the mark's default action. */\n items: MarkMenuItem[]\n /** Optional read-only content above the rows (a quoted passage, a note, a label name). */\n preview?: ReactNode\n /** Accessible name of the menu. */\n menuLabel: string\n /** A plain mouse click runs the primary row (default). Touch and keyboard always open the menu. */\n shouldClickRunPrimary?: boolean\n /** Hover delay before the menu opens (ms). */\n openDelay?: number\n closeDelay?: number\n testId?: string\n menuTestId?: string\n /** The mark element, for hosts that move focus back to it. */\n triggerRef?: Ref<HTMLElement>\n children: ReactNode\n}\n\nconst FINE_OPEN_DELAY = 350\nconst FINE_CLOSE_DELAY = 180\n\nfunction isFocusVisible(el: HTMLElement): boolean {\n try {\n return el.matches(':focus-visible')\n } catch {\n return true\n }\n}\n\ntype OpenMode = 'hover' | 'focus' | 'press' | 'key'\n\nfunction isCoarse(pointerType: string): boolean {\n if (pointerType === 'touch' || pointerType === 'pen') return true\n if (pointerType === 'mouse') return false\n return typeof window !== 'undefined' && !!window.matchMedia?.('(pointer: coarse)').matches\n}\n\n/**\n * The ONE contextual menu of every inline mark (link, bookmark, citation, label, note).\n *\n * The mark stays quiet text. A compact popover opens on hover (short delay) and on keyboard focus;\n * on touch a tap opens it instead of acting, so the primary row is one deliberate tap away. A\n * plain mouse click runs the primary action, so existing click behaviour is unchanged.\n * Keyboard: Enter/Space/ArrowDown open it and move into it, arrows move, Escape closes and\n * returns focus to the mark. Rows are 44px high on coarse pointers.\n */\nexport function MarkMenu({\n as = 'span',\n href,\n items,\n preview,\n menuLabel,\n shouldClickRunPrimary = true,\n openDelay = FINE_OPEN_DELAY,\n closeDelay = FINE_CLOSE_DELAY,\n testId,\n menuTestId,\n triggerRef: externalRef,\n className,\n children,\n onPointerDown,\n onPointerEnter,\n onPointerLeave,\n onFocus,\n onBlur,\n onKeyDown,\n ...rest\n}: MarkMenuProps) {\n const [open, setOpen] = useState(false)\n const [side, setSide] = useState<'top' | 'bottom'>('bottom')\n const menuId = useId()\n const triggerRef = useRef<HTMLElement | null>(null)\n const contentRef = useRef<HTMLDivElement | null>(null)\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null)\n const mode = useRef<OpenMode>('hover')\n const lastPointer = useRef('mouse')\n const focusFirstOnOpen = useRef(false)\n\n const isEmpty = items.length === 0 && !preview\n const ordered = [...items].sort((a, b) => Number(!!b.primary) - Number(!!a.primary))\n const primary = ordered[0]\n\n const clearTimer = () => {\n if (timer.current) clearTimeout(timer.current)\n timer.current = null\n }\n useEffect(() => clearTimer, [])\n\n const rows = () =>\n Array.from(contentRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ?? [])\n const firstItem = () => rows()[0]\n\n const openWith = (next: OpenMode, focusFirst = false) => {\n clearTimer()\n mode.current = next\n focusFirstOnOpen.current = focusFirst\n // Touch: the finger covers what is below the mark, so open above it.\n setSide(next === 'press' && isCoarse(lastPointer.current) ? 'top' : 'bottom')\n setOpen(true)\n if (focusFirst) {\n // Already open (hover/focus opened it): move focus in right away.\n requestAnimationFrame(() => firstItem()?.focus())\n }\n }\n\n const close = (returnFocus = false) => {\n clearTimer()\n setOpen(false)\n if (returnFocus) triggerRef.current?.focus({ preventScroll: true })\n }\n\n const schedule = (action: () => void, delay: number) => {\n clearTimer()\n timer.current = setTimeout(action, delay)\n }\n\n const handlePointerDown = (e: ReactPointerEvent<HTMLElement>) => {\n lastPointer.current = e.pointerType\n onPointerDown?.(e)\n }\n const handlePointerEnter = (e: ReactPointerEvent<HTMLElement>) => {\n onPointerEnter?.(e)\n if (isCoarse(e.pointerType) || isEmpty) return\n lastPointer.current = e.pointerType\n schedule(() => openWith('hover'), openDelay)\n }\n const handlePointerLeave = (e: ReactPointerEvent<HTMLElement>) => {\n onPointerLeave?.(e)\n if (isCoarse(e.pointerType)) return\n if (!open) return clearTimer()\n if (mode.current === 'hover') schedule(() => close(), closeDelay)\n }\n const handleFocus = (e: React.FocusEvent<HTMLElement>) => {\n onFocus?.(e)\n if (isEmpty) return\n // Only keyboard focus opens it; a pointer press focuses too and has its own path.\n if (isFocusVisible(e.currentTarget)) schedule(() => openWith('focus'), openDelay)\n }\n const handleBlur = (e: React.FocusEvent<HTMLElement>) => {\n onBlur?.(e)\n const next = e.relatedTarget as Node | null\n if (next && contentRef.current?.contains(next)) return\n if (mode.current === 'focus' || mode.current === 'key') schedule(() => close(), closeDelay)\n else clearTimer()\n }\n const handleKeyDown = (e: ReactKeyboardEvent<HTMLElement>) => {\n onKeyDown?.(e)\n lastPointer.current = 'keyboard'\n if (e.defaultPrevented || isEmpty) return\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {\n e.preventDefault()\n openWith('key', true)\n } else if (e.key === 'Escape' && open) {\n e.preventDefault()\n e.stopPropagation()\n close(true)\n }\n }\n const handleClick = (e: ReactMouseEvent<HTMLElement>) => {\n if (isEmpty) return\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return\n // A keyboard-synthesised click is already handled in keydown (detail 0, no pointer).\n if (e.detail === 0 && lastPointer.current === 'keyboard') {\n e.preventDefault()\n return\n }\n if (isCoarse(lastPointer.current)) {\n // A tap shows the menu instead of acting or navigating.\n e.preventDefault()\n if (open) close()\n else openWith('press')\n return\n }\n if (shouldClickRunPrimary && primary?.onSelect) {\n e.preventDefault()\n close()\n primary.onSelect()\n }\n }\n\n const handleMenuKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {\n const list = rows()\n const index = list.indexOf(document.activeElement as HTMLElement)\n let target: HTMLElement | undefined\n if (e.key === 'ArrowDown') target = list[(index + 1) % list.length]\n else if (e.key === 'ArrowUp') target = list[(index - 1 + list.length) % list.length]\n else if (e.key === 'Home') target = list[0]\n else if (e.key === 'End') target = list[list.length - 1]\n else if (e.key === 'Escape') {\n e.preventDefault()\n e.stopPropagation()\n close(true)\n return\n } else if (e.key === 'Tab') {\n close()\n return\n }\n if (target) {\n e.preventDefault()\n target.focus()\n }\n }\n\n const choose = (item: MarkMenuItem) => {\n const wasKey = mode.current === 'key'\n close(wasKey)\n item.onSelect?.()\n }\n\n const setTriggerRef = useCallback(\n (el: HTMLElement | null) => {\n triggerRef.current = el\n if (typeof externalRef === 'function') externalRef(el)\n else if (externalRef) (externalRef as { current: HTMLElement | null }).current = el\n },\n [externalRef]\n )\n\n const triggerProps = {\n ref: setTriggerRef,\n className,\n 'data-testid': testId,\n 'data-slot': 'mark',\n 'aria-haspopup': 'true' as const,\n 'aria-expanded': open,\n 'aria-controls': open ? menuId : undefined,\n onPointerDown: handlePointerDown,\n onPointerEnter: handlePointerEnter,\n onPointerLeave: handlePointerLeave,\n onFocus: handleFocus,\n onBlur: handleBlur,\n onKeyDown: handleKeyDown,\n onClick: handleClick,\n ...rest,\n }\n\n return (\n <Popover open={open && !isEmpty}>\n <PopoverAnchor asChild>\n {as === 'a' ? (\n <a href={href} {...triggerProps}>\n {children}\n </a>\n ) : (\n <span role=\"button\" tabIndex={0} {...triggerProps}>\n {children}\n </span>\n )}\n </PopoverAnchor>\n <PopoverContent\n ref={contentRef}\n id={menuId}\n side={side}\n align=\"start\"\n sideOffset={6}\n collisionPadding={8}\n // A plain group, not Radix's default dialog: the named role=\"menu\" inside is the semantic\n // surface, and a second dialog with a near-identical name collides with docked dialogs.\n role=\"group\"\n data-testid={menuTestId}\n data-slot=\"mark-menu\"\n className=\"w-auto min-w-[12rem] max-w-[min(22rem,calc(100vw-1rem))] p-1\"\n onOpenAutoFocus={(e) => {\n e.preventDefault()\n if (focusFirstOnOpen.current) firstItem()?.focus()\n }}\n onCloseAutoFocus={(e) => e.preventDefault()}\n onEscapeKeyDown={(e) => {\n e.preventDefault()\n close(true)\n }}\n onInteractOutside={(e) => {\n if (triggerRef.current?.contains(e.target as Node)) e.preventDefault()\n }}\n onPointerDownOutside={() => close()}\n onPointerEnter={clearTimer}\n onPointerLeave={(e) => {\n if (!isCoarse(e.pointerType) && mode.current === 'hover')\n schedule(() => close(), closeDelay)\n }}\n >\n {preview && <div className=\"px-2 py-1.5 text-sm\">{preview}</div>}\n {ordered.length > 0 && (\n <div role=\"menu\" aria-label={menuLabel} onKeyDown={handleMenuKeyDown}>\n {ordered.map((item) => {\n const rowClass = cn(\n 'flex w-full cursor-pointer items-center rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent focus-visible:bg-accent pointer-coarse:min-h-11 pointer-coarse:px-3',\n item.primary && 'font-medium pointer-coarse:text-base',\n item.destructive && 'text-destructive'\n )\n return item.href && !item.onSelect ? (\n <a\n key={item.id}\n role=\"menuitem\"\n tabIndex={-1}\n href={item.href}\n className={rowClass}\n data-testid={item.testId}\n onClick={() => close()}\n >\n {item.label}\n </a>\n ) : (\n <button\n key={item.id}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={-1}\n className={rowClass}\n data-testid={item.testId}\n onClick={() => choose(item)}\n >\n {item.label}\n </button>\n )\n })}\n </div>\n )}\n </PopoverContent>\n </Popover>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as SelectPrimitive from '@radix-ui/react-select'\nimport { Check, ChevronDown, ChevronUp } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\nimport { getCollisionPadding } from '../lib/collision-padding'\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex h-9 pointer-coarse:min-h-11 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm placeholder:text-muted-foreground/60 focus:outline-none focus-visible:border-ring/50 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'relative z-50 max-h-[min(24rem,var(--radix-select-content-available-height))] min-w-[8rem] max-w-[calc(100vw-1rem)] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n position === 'popper' &&\n 'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',\n className\n )}\n position={position}\n collisionPadding={getCollisionPadding()}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)}\n {...props}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 pointer-coarse:min-h-11 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","'use client'\n\nimport * as React from 'react'\nimport { type DialogProps } from '@radix-ui/react-dialog'\nimport { Command as CommandPrimitive } from 'cmdk'\nimport { Search } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\nimport { Dialog, DialogContent } from './dialog'\n\nconst Command = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive\n ref={ref}\n className={cn(\n 'flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground',\n className\n )}\n {...props}\n />\n))\nCommand.displayName = CommandPrimitive.displayName\n\nconst CommandDialog = ({ children, ...props }: DialogProps) => {\n return (\n <Dialog {...props}>\n <DialogContent className=\"overflow-hidden p-0\">\n <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n )\n}\n\nconst CommandInput = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n <div className=\"flex items-center border-b px-3\" data-cmdk-input-wrapper=\"\">\n <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n ref={ref}\n className={cn(\n 'flex h-10 pointer-coarse:h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...props}\n />\n </div>\n))\n\nCommandInput.displayName = CommandPrimitive.Input.displayName\n\nconst CommandList = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.List\n ref={ref}\n className={cn('max-h-[min(300px,50dvh)] overflow-y-auto overflow-x-hidden', className)}\n {...props}\n />\n))\n\nCommandList.displayName = CommandPrimitive.List.displayName\n\nconst CommandEmpty = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Empty>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n <CommandPrimitive.Empty ref={ref} className=\"py-6 text-center text-sm\" {...props} />\n))\n\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName\n\nconst CommandGroup = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Group>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Group\n ref={ref}\n className={cn(\n 'overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-sm [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground',\n className\n )}\n {...props}\n />\n))\n\nCommandGroup.displayName = CommandPrimitive.Group.displayName\n\nconst CommandSeparator = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 h-px bg-border', className)}\n {...props}\n />\n))\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName\n\nconst CommandItem = React.forwardRef<\n React.ElementRef<typeof CommandPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <CommandPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 pointer-coarse:min-h-11 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n className\n )}\n {...props}\n />\n))\n\nCommandItem.displayName = CommandPrimitive.Item.displayName\n\nconst CommandShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn('ml-auto text-sm tracking-widest text-muted-foreground', className)}\n {...props}\n />\n )\n}\nCommandShortcut.displayName = 'CommandShortcut'\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n","import type { Components } from 'react-markdown'\nimport { MarkdownRenderer } from './MarkdownRenderer'\n\n/**\n * Renders agent output in the shared house style, layered with the AI-branded and\n * redline-specific overrides on top of the kit's {@link MarkdownRenderer}: accent\n * links and `<del>`/`<ins>`/`<mark>` as tracked-changes (deletions red-strike,\n * insertions accented). Everything else — headings, lists, GFM tables, fenced\n * code blocks, blockquotes, safe links — comes from the shared renderer, so AI\n * answers, chat messages and parsed documents all look identical.\n *\n * Token-neutral: shadcn semantic tokens plus the kit's `ai-accent` contract.\n */\nconst AI_COMPONENTS: Partial<Components> = {\n a: (p) => (\n <a\n className=\"text-ai-accent underline underline-offset-2\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n {...p}\n />\n ),\n // Redline marks: deletions in red strike, <ins>/<mark> additions accented.\n del: (p) => (\n <del className=\"rounded bg-destructive/10 text-destructive decoration-destructive/60\" {...p} />\n ),\n ins: (p) => (\n <ins className=\"rounded bg-ai-accent-soft px-0.5 text-ai-accent no-underline\" {...p} />\n ),\n mark: (p) => <mark className=\"rounded bg-ai-accent-soft px-0.5 text-ai-accent\" {...p} />,\n thead: (p) => <thead className=\"bg-secondary/60\" {...p} />,\n}\n\nexport function AiMarkdown({\n children,\n className,\n isStreaming,\n}: {\n children: string\n className?: string\n isStreaming?: boolean\n}) {\n return (\n <MarkdownRenderer\n className={className ?? 'text-sm'}\n components={AI_COMPONENTS}\n isStreaming={isStreaming}\n testId=\"ai-markdown\"\n >\n {children}\n </MarkdownRenderer>\n )\n}\n","/**\n * EntityPill Component\n *\n * Base component for pill-style entity displays. Provides consistent styling and\n * interaction patterns. Promoted verbatim from the ARBI app (import paths only\n * changed to resolve within the SDK).\n *\n * Pattern: [Icon] [Label] [Optional: secondary text] [MoreVertical when interactive]\n */\n\nimport React, { forwardRef } from 'react'\nimport { MoreVertical } from 'lucide-react'\nimport { cn } from '../lib/utils'\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip'\n\ninterface EntityPillProps {\n /** The icon element (Avatar, ShieldIcon, FileIcon, etc.) */\n icon: React.ReactNode\n /** Primary label text */\n label: string\n /** Optional secondary text (e.g., page notation \"p.1\") */\n secondaryText?: React.ReactNode\n\n // Styling\n /** Size variant: 'sm' for compact, 'base' for tab headers */\n size?: 'sm' | 'base'\n /** Shape variant: 'pill' for rounded-full, 'rounded' for rounded-md */\n shape?: 'pill' | 'rounded'\n /** Additional CSS classes */\n className?: string\n /** Max width for label truncation */\n labelMaxWidth?: string\n /** Extra classes on the label text (e.g. a heavier weight on a card face). */\n labelClassName?: string\n /** When true, the pill fills its container width (`flex w-full`) and the main\n * area flexes + truncates so the trailing control (⋯ menu) pins to the right\n * edge — used by the documents table's Document column. Default: shrink-to-fit. */\n fullWidth?: boolean\n /** When true, render the pill with the active/\"viewing\" highlight — a solid\n * dark-navy background with light text, applied LAST so it wins over both the\n * default background and the interactive hover. */\n highlight?: boolean\n\n // Behavior\n /** Click handler for main area (icon + label) - primary action */\n onClick?: (e: React.MouseEvent) => void\n /** Click handler for icon only — when set, only the icon is clickable (not the label) */\n onIconClick?: (e: React.MouseEvent) => void\n /** Click handler for MoreVertical - opens popover/menu. When provided, shows MoreVertical icon */\n onMoreClick?: (e: React.MouseEvent) => void\n /** Custom trailing element (e.g. a ⋯ dropdown menu). Rendered in the same\n * trailing zone as MoreVertical, but as-is — so it stays outside the pill's\n * primary click area. Takes precedence over `onMoreClick`. */\n moreContent?: React.ReactNode\n /** Link URL - makes the main area an anchor tag */\n href?: string\n /** Whether the pill is disabled */\n disabled?: boolean\n\n // Tooltip\n /** Tooltip for main area (describes primary action, e.g., \"View document\") */\n tooltipContent?: React.ReactNode\n /** Tooltip side placement */\n tooltipSide?: 'top' | 'bottom' | 'left' | 'right'\n\n /** Test ID for testing */\n 'data-testid'?: string\n}\n\nexport const EntityPill = forwardRef<HTMLElement, EntityPillProps>(function EntityPill(\n {\n icon,\n label,\n secondaryText,\n size = 'sm',\n shape = 'rounded',\n className,\n labelMaxWidth = 'max-w-[320px]',\n labelClassName,\n fullWidth = false,\n highlight = false,\n onClick,\n onIconClick,\n onMoreClick,\n moreContent,\n href,\n disabled = false,\n tooltipContent,\n tooltipSide = 'bottom',\n 'data-testid': testId,\n },\n ref\n) {\n const shapeClass = shape === 'pill' ? 'rounded-full' : 'rounded-md'\n\n // Size-based classes\n const sizeClasses = size === 'base' ? 'gap-1.5 px-1.5 py-0.5' : 'gap-1 px-1'\n const textSizeClass = size === 'base' ? 'text-base' : 'text-sm'\n\n const baseClasses = cn(\n 'group/pill items-center',\n fullWidth ? 'flex w-full' : 'inline-flex',\n sizeClasses,\n shapeClass,\n 'bg-muted',\n 'border border-border',\n 'transition-all',\n className\n )\n\n // Coarse pointers: an invisible 44px-tall hit area (the pill itself stays compact).\n const interactiveClasses =\n \"relative cursor-pointer hover:bg-muted/80 pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:-inset-y-3 pointer-coarse:after:content-['']\"\n const disabledClasses = 'cursor-default opacity-60'\n const highlightClasses =\n 'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground'\n\n // Main content (icon + label + secondary text)\n const mainContent = (\n <>\n {onIconClick ? (\n <span\n role=\"button\"\n tabIndex={0}\n className=\"flex-shrink-0 cursor-pointer hover:opacity-70 transition-opacity\"\n onClick={(e) => {\n e.stopPropagation()\n onIconClick(e)\n }}\n >\n {icon}\n </span>\n ) : (\n icon\n )}\n <span\n className={cn(\n textSizeClass,\n 'font-medium truncate leading-tight min-w-0',\n labelMaxWidth,\n labelClassName\n )}\n >\n {label}\n </span>\n {secondaryText && (\n <span className=\"text-xs text-muted-foreground flex-shrink-0 leading-none\">\n {secondaryText}\n </span>\n )}\n </>\n )\n\n // Helper: wrap any content in a Tooltip (no asChild — TooltipTrigger renders its own button)\n const tooltipWrap = (\n content: React.ReactNode,\n tip: React.ReactNode,\n side: 'top' | 'bottom' | 'left' | 'right' = tooltipSide,\n triggerClassName?: string,\n triggerProps?: Record<string, unknown>\n ) => (\n <Tooltip>\n <TooltipTrigger\n onFocusCapture={(e) => e.stopPropagation()}\n className={triggerClassName}\n {...triggerProps}\n >\n {content}\n </TooltipTrigger>\n <TooltipContent side={side} className=\"p-2\">\n {tip}\n </TooltipContent>\n </Tooltip>\n )\n\n // With a separate \"more\" control the touch hit area must grow on the MAIN area only: an overlay on\n // the whole pill would sit above both inner buttons and swallow their taps.\n const mainAreaClass = cn('inline-flex items-center gap-1', fullWidth && 'min-w-0 flex-1')\n const mainAreaTouchClass = cn(\n mainAreaClass,\n (onClick || href) &&\n !disabled &&\n \"relative pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:-inset-y-3 pointer-coarse:after:content-['']\"\n )\n\n if (onMoreClick || moreContent) {\n let mainArea: React.ReactNode\n if (tooltipContent) {\n mainArea = tooltipWrap(\n mainContent,\n tooltipContent,\n tooltipSide,\n cn(mainAreaTouchClass, disabled && 'opacity-60'),\n {\n type: 'button',\n onClick: href ? onClick : disabled ? undefined : onClick,\n disabled: disabled || undefined,\n }\n )\n } else if (href) {\n mainArea = (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={mainAreaTouchClass}\n onClick={onClick}\n >\n {mainContent}\n </a>\n )\n } else if (onClick) {\n mainArea = (\n <button\n type=\"button\"\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n className={cn(\n \"relative inline-flex items-center gap-1 pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:-inset-y-3 pointer-coarse:after:content-['']\",\n disabled && 'opacity-60'\n )}\n >\n {mainContent}\n </button>\n )\n } else {\n mainArea = <span className={mainAreaTouchClass}>{mainContent}</span>\n }\n\n const moreArea = moreContent ? (\n <span className=\"flex-shrink-0 leading-none\">{moreContent}</span>\n ) : (\n tooltipWrap(\n <MoreVertical className=\"w-3.5 h-3.5\" />,\n 'Click for more',\n tooltipSide,\n 'flex-shrink-0 leading-none text-muted-foreground hover:text-foreground',\n {\n type: 'button',\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation()\n onMoreClick?.(e)\n },\n }\n )\n )\n\n return (\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n className={cn(\n baseClasses,\n (onClick || href) && !disabled && 'cursor-pointer hover:bg-muted/80',\n highlight && highlightClasses\n )}\n data-testid={testId}\n >\n {mainArea}\n {moreArea}\n </span>\n )\n }\n\n if (tooltipContent) {\n if (href) {\n return tooltipWrap(\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={mainAreaClass}\n onClick={onClick}\n >\n {mainContent}\n </a>,\n tooltipContent,\n tooltipSide,\n cn(baseClasses, interactiveClasses),\n { 'data-testid': testId }\n )\n }\n\n return tooltipWrap(\n mainContent,\n tooltipContent,\n tooltipSide,\n cn(\n baseClasses,\n onClick && !disabled ? interactiveClasses : '',\n disabled ? disabledClasses : '',\n highlight && highlightClasses\n ),\n {\n type: 'button',\n ref: ref as React.Ref<HTMLButtonElement>,\n onClick: onClick && !disabled ? onClick : undefined,\n disabled: disabled || undefined,\n 'data-testid': testId,\n }\n )\n }\n\n if (href) {\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(baseClasses, interactiveClasses)}\n data-testid={testId}\n onClick={onClick}\n >\n {mainContent}\n </a>\n )\n }\n\n if (onClick) {\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n onClick={disabled ? undefined : onClick}\n disabled={disabled}\n className={cn(\n baseClasses,\n disabled ? disabledClasses : interactiveClasses,\n highlight && highlightClasses\n )}\n data-testid={testId}\n >\n {mainContent}\n </button>\n )\n }\n\n return (\n <span\n ref={ref as React.Ref<HTMLSpanElement>}\n className={cn(baseClasses, highlight && highlightClasses)}\n data-testid={testId}\n >\n {mainContent}\n </span>\n )\n})\n","/**\n * Tag-type presentation primitives — the brand-neutral icon and label maps that\n * back the shared `TagEntity` pill. Kept in their own module (not the component\n * file) so app-side wrappers can import them to build their own store-coupled\n * tooltip content without pulling in a component, and so the component file stays\n * fast-refresh friendly.\n */\n\nimport {\n SquareCheckBig,\n StickyNote,\n NotebookPen,\n List,\n Hash,\n Search,\n Folder,\n Calendar,\n Bot,\n} from 'lucide-react'\n\n/** Human-readable tag type names. */\nexport const TAG_TYPE_LABELS: Record<string, string> = {\n checkbox: 'Checkbox',\n select: 'Select',\n number: 'Number',\n text: 'Text',\n folder: 'Folder',\n search: 'Saved Search',\n date: 'Date',\n assistant: 'AI Assistant',\n}\n\n/** Icon mapping for tag types. */\nexport const TAG_TYPE_ICONS: Record<string, typeof StickyNote> = {\n checkbox: SquareCheckBig,\n select: List,\n number: Hash,\n text: NotebookPen,\n folder: Folder,\n search: Search,\n date: Calendar,\n assistant: Bot,\n}\n\n/** Resolve the icon component for a tag type, with the `text` (NotebookPen) fallback.\n * Annotations share the NotebookPen mark used by the AI Annotate bulk action, so\n * the table column and the batch bar name the same thing the same way. */\nexport function getTagTypeIcon(type?: string | null): typeof StickyNote {\n return TAG_TYPE_ICONS[type ?? 'text'] || NotebookPen\n}\n\n/** Resolve the human-readable label for a tag type, falling back to the raw type. */\nexport function getTagTypeLabel(type?: string | null): string {\n const t = type ?? 'text'\n return TAG_TYPE_LABELS[t] || t\n}\n","/**\n * TagEntity Component\n *\n * Single source of truth for tag visual appearance, promoted from the ARBI app\n * and DECOUPLED from the app store/API. It renders purely from the `tag` prop —\n * the app-only bits (creator/updater lookup, visibility toggle, live doctag\n * count from the query cache) are dropped; pass `doctagCount`/`shared` if you\n * want them shown in the built-in tooltip, or inject a fully custom `tooltipContent`.\n */\n\nimport React from 'react'\nimport { EntityPill } from './EntityPill'\nimport { Badge } from '../ui/badge'\nimport { getTagTypeIcon, getTagTypeLabel } from './tag-types'\n\n/** Base color map — source of truth for entity colors, keyed by the 5th char of\n * an entity id (matches the app's BASE_COLORS). */\nconst BASE_COLORS: Record<string, string> = {\n '0': '#10b981',\n '1': '#3b82f6',\n '2': '#8b5cf6',\n '3': '#f43f5e',\n '4': '#f59e0b',\n '5': '#84cc16',\n '6': '#a855f7',\n '7': '#06b6d4',\n '8': '#f97316',\n '9': '#14b8a6',\n a: '#ef4444',\n b: '#6366f1',\n c: '#ec4899',\n d: '#22c55e',\n e: '#eab308',\n f: '#0ea5e9',\n}\n\n/** Solid entity color derived from an entity id (matches the app's\n * `getEntityColor(id, 'medium')`). */\nfunction getEntityColor(entityId: string): string {\n return BASE_COLORS[entityId[4]] || BASE_COLORS['0']\n}\n\n/** Minimal, decoupled tag shape the pill needs. */\nexport interface TagLike {\n external_id: string\n name: string\n /** Tag type discriminator — drives the icon and the tooltip's \"Type\" line. */\n tag_type?: { type: string } | null\n /** Optional explicit color; when omitted it's derived from `external_id`. */\n color?: string\n /** Optional document count shown in the tooltip. */\n doctag_count?: number | null\n /** Optional shared/private flag shown in the tooltip. */\n shared?: boolean | null\n}\n\nexport interface TagEntityProps {\n tag: TagLike\n size?: 'sm' | 'md' | 'lg'\n className?: string\n onClick?: (e: React.MouseEvent) => void\n /** Whether to show a tooltip (default: true) */\n showTooltip?: boolean\n /** Injected tooltip override. When provided (and `showTooltip` is not false) it\n * replaces the built-in tooltip — used by the monolith to render its rich,\n * store-coupled tooltip (fresh count, creator/updater, visibility toggle). */\n tooltipContent?: React.ReactNode\n}\n\nexport function TagEntity({\n tag,\n size = 'md',\n className = '',\n onClick,\n showTooltip = true,\n tooltipContent,\n}: TagEntityProps) {\n const tagType = tag.tag_type?.type ?? 'text'\n const iconSize = size === 'sm' ? 12 : size === 'md' ? 14 : 16\n const Icon = getTagTypeIcon(tagType)\n\n const sizeClasses = {\n sm: 'p-0.5',\n md: 'p-1',\n lg: 'p-1.5',\n }\n\n const tagColor = tag.color ?? getEntityColor(tag.external_id)\n\n const iconElement = (\n <span\n className={`inline-flex items-center justify-center rounded-md text-white flex-shrink-0 ${sizeClasses[size]}`}\n style={{ backgroundColor: tagColor }}\n >\n <Icon size={iconSize} className=\"flex-shrink-0\" />\n </span>\n )\n\n const pillSize = size === 'lg' ? 'base' : 'sm'\n\n const defaultTooltip = (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center gap-2\">\n <span\n className=\"inline-flex items-center justify-center rounded-md text-white p-1\"\n style={{ backgroundColor: tagColor }}\n >\n <Icon size={16} />\n </span>\n <span className=\"font-medium text-sm\">{tag.name}</span>\n </div>\n\n <div className=\"flex flex-col gap-1.5 text-sm\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Type:</span>\n <span>{getTagTypeLabel(tagType)}</span>\n </div>\n\n {tag.doctag_count != null && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Documents:</span>\n <Badge variant=\"secondary\" className=\"h-5 min-w-[20px] justify-center\">\n {tag.doctag_count ?? 0}\n </Badge>\n </div>\n )}\n\n {tag.shared != null && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">{tag.shared ? 'Shared' : 'Private'}</span>\n </div>\n )}\n </div>\n </div>\n )\n\n const resolvedTooltip = showTooltip ? (tooltipContent ?? defaultTooltip) : undefined\n\n return (\n <EntityPill\n icon={iconElement}\n label={tag.name}\n size={pillSize}\n shape=\"rounded\"\n labelMaxWidth=\"max-w-[180px]\"\n tooltipContent={resolvedTooltip}\n onClick={onClick}\n className={className}\n data-testid={`tag-entity-${tag.external_id}`}\n />\n )\n}\n","/**\n * PassageCard — the card (\"bubble\") a single retrieved passage is rendered as.\n *\n * One presentation shared by every surface that lists retrieval hits: the\n * <SemanticSearch> block here and the ARBI-frontend monolith's SmartSearch\n * results. Those had drifted into two different looks for the same object; this\n * is the single one.\n *\n * The card owns the chrome only — the rounded border, the AI-accent hover /\n * focus / selected states, the header row and the relevance dot. What goes in\n * the header and how the snippet itself is rendered stays with the caller,\n * because those genuinely differ: the block shows a plain-text excerpt in a\n * narrow sidebar, the monolith renders markdown with a show-more toggle.\n *\n * Theming is semantic tokens only (shadcn + the AI-accent contract).\n */\n\nimport React from 'react'\nimport { cn } from '../lib/utils'\n\n/** Relevance bands. Shared so a hit is coloured the same wherever it appears. */\nconst TIERS = [\n { min: 0.7, tone: 'bg-emerald-500', label: 'High relevance' },\n { min: 0.4, tone: 'bg-amber-500', label: 'Medium relevance' },\n { min: -Infinity, tone: 'bg-muted-foreground/40', label: 'Low relevance' },\n] as const\n\n/**\n * A dot conveying relevance — green (high) / amber (mid) / muted (low).\n *\n * The band is shown, the raw number is not: scores are not on a normalized 0-1\n * scale across search modes (BM25 keyword scores can exceed 1), so a printed\n * figure invites a comparison it cannot support. The value is kept in the\n * tooltip for anyone debugging a ranking.\n */\nexport function RelevanceDot({ score }: { score?: number | null }) {\n if (score == null) return null\n const tier = TIERS.find((t) => score >= t.min) ?? TIERS[TIERS.length - 1]\n return (\n <span\n role=\"img\"\n aria-label={tier.label}\n title={`${tier.label} (${score.toFixed(2)})`}\n className={cn('size-1.5 shrink-0 rounded-full', tier.tone)}\n data-testid=\"passage-relevance\"\n />\n )\n}\n\nexport interface PassageCardProps {\n /** Left of the header row — the source affordance (document pill, page label). */\n header: React.ReactNode\n /** Relevance score for the dot. Omit to hide it. */\n score?: number | null\n /** Extra affordance pinned right of the dot (e.g. a hover-revealed open icon). */\n headerRight?: React.ReactNode\n /** Marks the card as the currently open passage. */\n active?: boolean\n onClick?: (e: React.MouseEvent) => void\n /** Rendered under the snippet, outside the click target's typography. */\n footer?: React.ReactNode\n className?: string\n children: React.ReactNode\n 'data-testid'?: string\n}\n\nexport function PassageCard({\n header,\n score,\n headerRight,\n active,\n onClick,\n footer,\n className,\n children,\n 'data-testid': testId,\n}: PassageCardProps) {\n const body = (\n <>\n <div className=\"mb-1.5 flex items-center gap-2\">\n {header}\n {(score != null || headerRight) && (\n <div className=\"ml-auto flex shrink-0 items-center gap-2\">\n <RelevanceDot score={score} />\n {headerRight}\n </div>\n )}\n </div>\n {/* Query-term highlights are styled here rather than by each caller, so a\n * <mark> reads as an accent on the passage instead of browser yellow. */}\n <div className=\"[&_mark]:rounded-sm [&_mark]:bg-ai-accent/20 [&_mark]:px-0.5 [&_mark]:font-medium [&_mark]:text-foreground\">\n {children}\n </div>\n </>\n )\n\n return (\n <div\n className={cn(\n 'group rounded-lg border border-border bg-card p-3 text-left transition-colors',\n onClick && 'hover:border-ai-accent/40 focus-within:ring-2 focus-within:ring-ai-accent/40',\n active && 'border-ai-accent/60 ring-1 ring-ai-accent/30',\n className\n )}\n >\n {/* The footer sits OUTSIDE the click target on purpose. It holds the\n * caller's own controls (a show-more toggle), and a button nested inside a\n * role=\"button\" is both invalid and ambiguous to hit — the whole passage\n * would otherwise become that control's accessible name.\n *\n * `data-testid` rides on the click target rather than this shell, so\n * \"click the result row\" keeps working for every caller's tests. */}\n {onClick ? (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick(e as unknown as React.MouseEvent)\n }\n }}\n aria-current={active || undefined}\n data-testid={testId}\n className=\"cursor-pointer focus:outline-none\"\n >\n {body}\n </div>\n ) : (\n <div aria-current={active || undefined} data-testid={testId}>\n {body}\n </div>\n )}\n {footer}\n </div>\n )\n}\n","/**\n * File-type icon colors — the subset of the app's FILE_TYPE_COLORS used by the\n * promoted file-type icons. Kept self-contained so the SDK icons render with the\n * same palette as the ARBI app without depending on the app's style constants.\n */\n\nconst NEUTRAL_GRAY = '#64748b' // slate-500\n\nexport const FILE_TYPE_COLORS = {\n pdf: '#ef4444', // red\n doc: '#3b82f6', // blue (Word docs)\n docx: '#3b82f6', // blue\n html: '#0284c7', // sky-600 (web files)\n img: '#8b5cf6', // violet-500 (images)\n vid: '#10b981', // emerald-500 (video)\n aud: '#f59e0b', // amber-500 (audio)\n xls: '#16a34a', // green-600 (Excel)\n eml: '#0d9488', // teal-600 (email)\n txt: NEUTRAL_GRAY, // gray (plain text)\n generic: NEUTRAL_GRAY, // gray (unknown)\n white: '#ffffff', // for strokes/text on colored backgrounds\n}\n","/** PDF file icon (red). Promoted from the ARBI app for SDK reuse. */\n\nimport React from 'react'\nimport { FILE_TYPE_COLORS } from './colors'\n\ninterface IconProps {\n size?: number\n className?: string\n}\n\nexport const PdfIcon: React.FC<IconProps> = ({ size = 16, className = '' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z\"\n fill={FILE_TYPE_COLORS.pdf}\n stroke={FILE_TYPE_COLORS.pdf}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n fill=\"none\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <text\n x=\"12\"\n y=\"16\"\n fontSize=\"6\"\n fill=\"white\"\n textAnchor=\"middle\"\n fontWeight=\"bold\"\n fontFamily=\"Arial, sans-serif\"\n >\n PDF\n </text>\n </svg>\n )\n}\n","/** Audio file icon (amber). Promoted from the ARBI app for SDK reuse. */\n\nimport React from 'react'\nimport { FILE_TYPE_COLORS } from './colors'\n\ninterface IconProps {\n size?: number\n className?: string\n}\n\nexport const AudIcon: React.FC<IconProps> = ({ size = 16, className = '' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z\"\n fill={FILE_TYPE_COLORS.aud}\n stroke={FILE_TYPE_COLORS.aud}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n fill=\"none\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <text\n x=\"12\"\n y=\"16\"\n fontSize=\"6\"\n fill=\"white\"\n textAnchor=\"middle\"\n fontWeight=\"bold\"\n fontFamily=\"Arial, sans-serif\"\n >\n AUD\n </text>\n </svg>\n )\n}\n","/** Image file icon (violet). Promoted from the ARBI app for SDK reuse. */\n\nimport React from 'react'\nimport { FILE_TYPE_COLORS } from './colors'\n\ninterface IconProps {\n size?: number\n className?: string\n}\n\nexport const ImgIcon: React.FC<IconProps> = ({ size = 16, className = '' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z\"\n fill={FILE_TYPE_COLORS.img}\n stroke={FILE_TYPE_COLORS.img}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n fill=\"none\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <text\n x=\"12\"\n y=\"16\"\n fontSize=\"6\"\n fill=\"white\"\n textAnchor=\"middle\"\n fontWeight=\"bold\"\n fontFamily=\"Arial, sans-serif\"\n >\n IMG\n </text>\n </svg>\n )\n}\n","/** Video file icon (emerald). Promoted from the ARBI app for SDK reuse. */\n\nimport React from 'react'\nimport { FILE_TYPE_COLORS } from './colors'\n\ninterface IconProps {\n size?: number\n className?: string\n}\n\nexport const VidIcon: React.FC<IconProps> = ({ size = 16, className = '' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z\"\n fill={FILE_TYPE_COLORS.vid}\n stroke={FILE_TYPE_COLORS.vid}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n fill=\"none\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <text\n x=\"12\"\n y=\"16\"\n fontSize=\"6\"\n fill=\"white\"\n textAnchor=\"middle\"\n fontWeight=\"bold\"\n fontFamily=\"Arial, sans-serif\"\n >\n VID\n </text>\n </svg>\n )\n}\n","/** Email file icon (teal). Promoted from the ARBI app for SDK reuse. */\n\nimport React from 'react'\nimport { FILE_TYPE_COLORS } from './colors'\n\ninterface IconProps {\n size?: number\n className?: string\n}\n\nexport const EmlIcon: React.FC<IconProps> = ({ size = 16, className = '' }) => {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8l-6-6z\"\n fill={FILE_TYPE_COLORS.eml}\n stroke={FILE_TYPE_COLORS.eml}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 2v6h6\"\n fill=\"none\"\n stroke={FILE_TYPE_COLORS.white}\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <rect\n x=\"7\"\n y=\"12\"\n width=\"10\"\n height=\"7\"\n rx=\"1\"\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"1.2\"\n />\n <path d=\"M7 13l5 3 5-3\" fill=\"none\" stroke=\"white\" strokeWidth=\"1.2\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n","import React, { useId } from 'react'\n\ninterface ArbiBotHeadIconProps {\n size?: number\n className?: string\n}\n\nexport const ArbiBotHeadIcon: React.FC<ArbiBotHeadIconProps> = ({ size = 24, className = '' }) => {\n const maskId = useId()\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"30 -5 190 190\"\n preserveAspectRatio=\"xMidYMid meet\"\n className={className}\n >\n <defs>\n <mask id={maskId}>\n <g transform=\"translate(0,250) scale(0.1,-0.1)\">\n <rect x=\"0\" y=\"0\" width=\"2500\" height=\"2500\" fill=\"white\" />\n <circle cx=\"855\" cy=\"1715\" r=\"190\" fill=\"black\" />\n <circle cx=\"855\" cy=\"1715\" r=\"50\" fill=\"white\" />\n <circle cx=\"1665\" cy=\"1700\" r=\"190\" fill=\"black\" />\n <circle cx=\"1665\" cy=\"1700\" r=\"50\" fill=\"white\" />\n </g>\n </mask>\n </defs>\n <g mask={`url(#${maskId})`}>\n <g\n transform=\"translate(0,250) scale(0.1,-0.1)\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeWidth=\"100\"\n >\n <path d=\"M1038 2434 c-217 -39 -406 -154 -522 -318 -121 -170 -176 -376 -103 -384 l27 -3 0 -106 c0 -88 -3 -108 -17 -118 -15 -11 -16 -18 -5 -66 44 -188 209 -369 420 -459 l65 -28 -74 -7 c-283 -26 -444 -152 -535 -418 -70 -204 -73 -507 -5 -507 4 0 12 75 19 168 18 263 68 419 167 530 78 87 224 162 263 134 9 -6 43 -26 76 -43 224 -117 802 -95 948 38 38 34 165 -22 253 -111 117 -119 168 -268 187 -549 6 -92 15 -167 19 -167 89 0 53 415 -54 627 -88 173 -238 270 -458 295 l-99 11 75 32 c201 88 367 274 406 454 10 47 9 56 -5 66 -13 10 -16 32 -16 118 l0 106 28 3 c91 10 -12 297 -165 459 -202 214 -544 307 -895 243z m472 -84 c170 -43 323 -140 416 -264 47 -61 117 -197 128 -248 l6 -28 -65 0 c-64 0 -65 1 -78 33 -43 102 -109 136 -262 137 l-110 0 -38 -40 c-25 -27 -46 -40 -65 -41 -134 -5 -394 1 -410 10 -11 6 -30 24 -42 41 l-21 30 -112 0 c-156 -1 -219 -33 -262 -136 -14 -34 -14 -34 -80 -34 -76 0 -74 -7 -30 103 96 243 311 406 595 452 118 20 319 13 430 -15z m-561 -505 c97 -50 126 -174 61 -263 -118 -163 -380 -23 -309 165 35 93 162 143 248 98z m799 -15 c129 -96 69 -304 -92 -318 -189 -16 -265 218 -106 326 48 33 149 29 198 -8z m272 -389 c0 -23 -45 -110 -86 -168 -245 -343 -856 -408 -1231 -130 -90 67 -213 236 -213 294 0 11 132 13 765 13 457 0 765 -4 765 -9z\" />\n </g>\n <g transform=\"translate(0,250) scale(0.1,-0.1)\" fill=\"currentColor\" stroke=\"none\">\n <path d=\"M785 1777 c-60 -60 -59 -134 1 -186 92 -82 236 9 204 128 -25 93 -138 125 -205 58z m161 -29 c7 -22 -19 -52 -40 -45 -21 7 -30 35 -17 51 19 23 48 20 57 -6z\" />\n <path d=\"M1591 1803 c-128 -67 -85 -243 60 -243 83 0 141 99 105 178 -32 69 -103 97 -165 65z m127 -59 c4 -25 -19 -47 -41 -38 -22 8 -30 34 -16 51 17 20 53 12 57 -13z\" />\n <path d=\"M843 1347 c-9 -15 9 -63 41 -108 148 -202 565 -209 730 -12 37 44 60 103 47 116 -13 13 -810 17 -818 4z\" />\n </g>\n </g>\n </svg>\n )\n}\n","/**\n * DocumentEntity Component\n *\n * Displays a document as a compact entity pill with file-type icon and name.\n * Promoted from the ARBI app and DECOUPLED from the app store/API: it renders\n * purely from the `doc` prop and optional `onClick`/`onIconClick` callbacks.\n */\n\nimport React from 'react'\nimport { Eye, FolderOpen } from 'lucide-react'\nimport { EntityPill } from './EntityPill'\nimport { AudIcon } from '../icons/AudIcon'\nimport { EmlIcon } from '../icons/EmlIcon'\nimport { ImgIcon } from '../icons/ImgIcon'\nimport { PdfIcon } from '../icons/PdfIcon'\nimport { VidIcon } from '../icons/VidIcon'\nimport { cn } from '../lib/utils'\n\n/** Minimal, decoupled document shape the pill needs. Structurally compatible\n * with the SDK's `DocResponse` (from `useDocuments`), but no dependency on it —\n * a consumer can pass any object with these fields. */\nexport interface DocumentLike {\n file_name?: string | null\n folder?: string | null\n doc_metadata?: { title?: string | null } | null\n}\n\n/** Title of a document: `doc_metadata.title`, falling back to `file_name`. */\nfunction getDocumentTitle(document: DocumentLike | null | undefined, defaultValue = ''): string {\n if (!document) return defaultValue\n return document.doc_metadata?.title || document.file_name || defaultValue\n}\n\n/** Hard cap on the pill's visible label. The full name still shows in the hover\n * tooltip; the pill stays compact so the trailing ⋮ menu never gets pushed. */\nconst MAX_LABEL_CHARS = 30\n\nfunction clampLabel(text: string): string {\n return text.length > MAX_LABEL_CHARS ? `${text.slice(0, MAX_LABEL_CHARS).trimEnd()}…` : text\n}\n\nconst IMAGE_EXTENSIONS = new Set(['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'tif', 'webp'])\nconst VIDEO_EXTENSIONS = new Set(['mp4', 'mpeg', 'mpg', 'webm', 'mov', 'avi', 'mkv'])\nconst AUDIO_EXTENSIONS = new Set(['mp3', 'wav', 'm4a', 'aac', 'ogg', 'flac'])\nconst EMAIL_EXTENSIONS = new Set(['eml', 'msg'])\n\n/**\n * The file-type glyph for a document, by extension.\n *\n * Exported because a document is recognisable by its icon before its name — any\n * surface that lists documents (the entity pill here, the workspace home's\n * Documents card) has to draw the same PDF/image/audio/video/email glyph, or\n * the same file looks like two different things in two places.\n */\nexport function getDocIcon(fileName?: string | null, iconSize = 14): React.ReactNode {\n const ext = fileName?.split('.').pop()?.toLowerCase()\n if (ext && VIDEO_EXTENSIONS.has(ext)) return <VidIcon size={iconSize} className=\"flex-shrink-0\" />\n if (ext && AUDIO_EXTENSIONS.has(ext)) return <AudIcon size={iconSize} className=\"flex-shrink-0\" />\n if (ext && IMAGE_EXTENSIONS.has(ext)) return <ImgIcon size={iconSize} className=\"flex-shrink-0\" />\n if (ext && EMAIL_EXTENSIONS.has(ext)) return <EmlIcon size={iconSize} className=\"flex-shrink-0\" />\n return <PdfIcon size={iconSize} className=\"flex-shrink-0\" />\n}\n\nexport interface DocumentEntityProps {\n doc: DocumentLike\n /** Override the default file-type icon */\n icon?: React.ReactNode\n /** Size variant — 'sm' (default) for inline/compact contexts, 'base' for a\n * larger pill (e.g. the documents grid's primary name column). */\n size?: 'sm' | 'base'\n /** Override default label max width */\n labelMaxWidth?: string\n /** Extra classes on the label text (e.g. a heavier weight on a card face). */\n labelClassName?: string\n /** Click handler for the whole pill */\n onClick?: (e: React.MouseEvent) => void\n /** Click handler for the icon only */\n onIconClick?: (e: React.MouseEvent) => void\n /** When true, the file-type icon is replaced by a pinned Eye — marks the\n * document that is currently open/being viewed. */\n viewing?: boolean\n /** Small overlay pinned to the icon's corner (e.g. an \"available offline\" pip). */\n iconBadge?: React.ReactNode\n /** Trailing control rendered outside the click area (e.g. a ⋯ actions menu). */\n actions?: React.ReactNode\n /** When true, the pill fills the available width and the name truncates via\n * CSS so the trailing ⋯ menu pins to the right edge. */\n fullWidth?: boolean\n /** Render the WHOLE title (skip the 30-char `clampLabel` string cut) while\n * keeping the normal content-width layout — for callers that want the full\n * name to show/wrap (via a `labelClassName`) without `fullWidth`'s w-full.\n * `fullWidth` already implies this. */\n noClamp?: boolean\n /** Override the default folder/title hover tooltip. */\n tooltipContent?: React.ReactNode\n className?: string\n /** Forwarded to the pill so a surface can address this document's chip. */\n 'data-testid'?: string\n}\n\nexport function DocumentEntity({\n doc,\n icon,\n size = 'sm',\n labelMaxWidth,\n labelClassName,\n onClick,\n onIconClick,\n viewing,\n iconBadge,\n actions,\n tooltipContent,\n className,\n fullWidth,\n noClamp,\n 'data-testid': testId,\n}: DocumentEntityProps) {\n const title = getDocumentTitle(doc)\n const ext = doc.file_name?.split('.').pop()?.toLowerCase()\n const iconSize = size === 'base' ? 16 : 14\n const eyeSizeClass = size === 'base' ? 'h-4 w-4' : 'h-3.5 w-3.5'\n\n const baseIcon = icon ?? getDocIcon(doc.file_name, iconSize)\n const displayIcon =\n viewing || iconBadge ? (\n <span className=\"relative inline-flex flex-shrink-0 items-center justify-center\">\n {viewing ? <Eye className={cn('text-primary-foreground', eyeSizeClass)} /> : baseIcon}\n {iconBadge}\n </span>\n ) : (\n baseIcon\n )\n\n const defaultTooltip = (\n <div className=\"flex flex-col gap-1 text-xs max-w-[440px]\">\n {doc.folder && (\n // `flex-wrap` so a deep folder path wraps WITHIN the balloon instead of\n // spilling out of it (each path segment is atomic and wraps as a unit;\n // `min-w-0` + `break-all` lets a single over-long segment break too).\n <span className=\"flex flex-wrap items-center gap-0.5 text-muted-foreground\">\n <FolderOpen className=\"h-3 w-3 text-yellow-600 shrink-0\" />\n {doc.folder.split('/').map((part, i, arr) => (\n <span key={i} className=\"flex min-w-0 items-center gap-0.5\">\n {i > 0 && <span className=\"text-muted-foreground/50 mx-0.5\">/</span>}\n <span className={`break-all ${i < arr.length - 1 ? 'text-muted-foreground/70' : ''}`}>\n {part}\n </span>\n </span>\n ))}\n </span>\n )}\n <span className=\"font-medium break-words\">\n {title}\n {ext ? `.${ext}` : ''}\n </span>\n </div>\n )\n\n return (\n <EntityPill\n icon={displayIcon}\n size={size}\n label={fullWidth || noClamp ? title : clampLabel(title)}\n labelMaxWidth={labelMaxWidth ?? 'max-w-[140px]'}\n labelClassName={labelClassName}\n fullWidth={fullWidth}\n onClick={onClick}\n onIconClick={onIconClick}\n moreContent={actions}\n className={className}\n highlight={viewing}\n data-testid={testId}\n tooltipContent={tooltipContent ?? defaultTooltip}\n />\n )\n}\n","/**\n * ProjectEntity Component\n *\n * Fully-rounded pill for a \"project\" (a.k.a. a \"matter\" in some consumer apps).\n * The viewer's relationship to the project drives a TINTED (soft-fill) colour\n * so the kinds read at a glance without shouting:\n * - your paid project → primary tint\n * - someone else's → secondary tint\n * - your free project → grey tint\n * \"Common\" keeps the neutral muted pill.\n *\n * Promoted from the ARBI app and DECOUPLED: no store/stripe deps. The icon\n * defaults to the `CreditCard` glyph and can be overridden via `icon`, and\n * the display text via `label` (falls back to `name`) so consumers can relabel\n * a \"project\" as a \"matter\", \"case\", etc.\n */\n\nimport React from 'react'\nimport { CreditCard } from 'lucide-react'\nimport { EntityPill } from './EntityPill'\nimport { cn } from '../lib/utils'\n\nexport type ProjectRelation = 'mine' | 'other' | 'common'\n\nexport interface ProjectEntityProps {\n name: string\n /** Display text override (defaults to `name`) — lets a consumer relabel. */\n label?: string\n /** Icon override (defaults to the CreditCard glyph). */\n icon?: React.ReactNode\n subscription?: string\n hasCollaborators?: boolean\n size?: 'sm' | 'base'\n className?: string\n onClick?: (e: React.MouseEvent) => void\n /** Viewer's relationship to the project — drives the inverted pill colour. */\n relation?: ProjectRelation\n /** Whether the given `subscription` should be treated as paid. When omitted,\n * it's inferred from the `subscription` value ('active' | 'past_due' | 'dev'). */\n isPaid?: boolean\n /** Hover tooltip. */\n tooltipContent?: React.ReactNode\n}\n\ntype PillVariant = 'mine-paid' | 'mine-free' | 'other' | 'common'\n\n// Soft tint fill + a light, neutral grey border (not a coloured one) so the\n// pill reads as a quiet chip rather than a heavy solid badge.\nconst VARIANT_STYLES: Record<PillVariant, { pill: string; icon: string }> = {\n 'mine-paid': {\n pill: 'bg-primary/10 text-primary border-border/60',\n icon: 'text-primary',\n },\n other: {\n pill: 'bg-secondary/10 text-secondary border-border/60',\n icon: 'text-secondary',\n },\n 'mine-free': {\n pill: 'bg-muted-foreground/10 text-muted-foreground border-border/60',\n icon: 'text-muted-foreground',\n },\n common: {\n pill: '',\n icon: 'text-muted-foreground',\n },\n}\n\nfunction resolveVariant(\n relation: ProjectRelation | undefined,\n paid: boolean,\n hasCollaborators: boolean\n): PillVariant {\n if (relation === 'common') return 'common'\n if (relation === 'other') return 'other'\n if (relation === 'mine') return paid ? 'mine-paid' : 'mine-free'\n // Legacy, subscription-driven callers (no relation given).\n if (paid) return hasCollaborators ? 'other' : 'mine-paid'\n return 'mine-free'\n}\n\nexport function ProjectEntity({\n name,\n label,\n icon,\n subscription = 'none',\n hasCollaborators = false,\n size = 'sm',\n className,\n onClick,\n relation,\n isPaid,\n tooltipContent,\n}: ProjectEntityProps) {\n const paid =\n isPaid ?? (subscription === 'active' || subscription === 'past_due' || subscription === 'dev')\n const variant = resolveVariant(relation, paid, hasCollaborators)\n const { pill, icon: iconClass } = VARIANT_STYLES[variant]\n\n const iconSizeClass = size === 'base' ? 'h-4 w-4' : 'h-3.5 w-3.5'\n const iconNode = icon ?? <CreditCard className={cn(iconSizeClass, iconClass)} />\n\n return (\n <EntityPill\n icon={iconNode}\n label={label ?? name}\n size={size}\n shape=\"rounded\"\n className={cn(pill, className)}\n onClick={onClick}\n tooltipContent={tooltipContent}\n />\n )\n}\n","/**\n * UserEntity Component\n *\n * Single source of truth for the user pill/avatar visual, promoted from the ARBI\n * app and DECOUPLED from the app store/API. It renders purely from injected,\n * already-resolved props — the app-coupled bits (current user, WebSocket presence\n * status, shared-workspace / agent-owner lookups) are resolved by the app adapter\n * and passed in as `isMe` / `displayStatus` / `tooltipContent` / `onClick`.\n *\n * Variants:\n * - pill: Avatar + name in a rounded container (default)\n * - icon: Avatar circle with hover tooltip\n *\n * Status-dot colours use the semantic `--color-status-*` token contract (see the\n * consuming app's @theme); they are seeded to the app's prior palette so the dots\n * stay pixel-identical.\n */\n\nimport React, { memo } from 'react'\nimport { MessageCircleMore } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'\nimport { ArbiBotHeadIcon } from '../icons/ArbiBotHeadIcon'\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip'\nimport { cn } from '../lib/utils'\n\n/** Presence display status - WebSocket states plus 'hidden' for when status is intentionally not shown */\nexport type PresenceDisplayStatus = 'connected' | 'connecting' | 'disconnected' | 'error' | 'hidden'\n\nexport interface UserEntityProps {\n size?: 'xs' | 'sm' | 'md' | 'lg'\n variant?: 'icon' | 'pill'\n className?: string\n /** When true (default), shows tooltip on hover */\n showTooltip?: boolean\n /** When true (default), clicking triggers the injected action. Set false to disable interaction. */\n interactive?: boolean\n /** When true, shows a blue unread indicator on the chat icon */\n hasUnreadMessages?: boolean\n\n /** Two-letter initials shown in the avatar fallback (resolved by the app). */\n initials?: string\n /** Display label — \"You\" for the current user, else the real name. */\n displayName?: string\n /** Avatar image URL, if any. */\n picture?: string | null\n /** Avatar background colour class for non-agents (e.g. 'bg-blue-500'). */\n colorClass?: string\n /** Whether this user is an agent — drives the dashed ring + bot badge. */\n isAgent?: boolean\n /** Inline border/text colour for agent avatars (from the app's agentAvatarColors). */\n agentStyle?: React.CSSProperties\n /**\n * Inline avatar colours for ANY user, not only agents — e.g. the deterministic\n * tint the DM rows derive from the user id. Takes precedence over\n * `agentStyle`, which predates it and is the same mechanism under a narrower\n * name.\n */\n avatarStyle?: React.CSSProperties\n /** Whether this pill represents the current user — hides the chat icon and drives\n * which action `onClick` performs. */\n isMe?: boolean\n /** Resolved presence dot state; undefined hides the dot. */\n displayStatus?: PresenceDisplayStatus\n /** Resolved click handler (open settings for me, DM for others). */\n onClick?: (e: React.MouseEvent) => void\n /** Injected rich tooltip content (built by the app adapter). */\n tooltipContent?: React.ReactNode\n /** Render the empty \"no user\" avatar. */\n empty?: boolean\n}\n\nconst sizeClasses = {\n xs: 'h-5 w-5',\n sm: 'h-6 w-6',\n md: 'h-8 w-8',\n lg: 'h-10 w-10',\n}\n\nconst textSizeClasses = {\n xs: 'text-xs',\n sm: 'text-xs',\n md: 'text-xs',\n lg: 'text-sm',\n}\n\n// Presence dot sizes proportional to avatar size (larger for better visibility)\nconst presenceDotClasses = {\n xs: 'w-2 h-2 border',\n sm: 'w-2.5 h-2.5 border',\n md: 'w-3 h-3 border-2',\n lg: 'w-3.5 h-3.5 border-2',\n}\n\n// Position the presence dot at edge of avatar\nconst presencePositionClasses = {\n xs: '-right-1 bottom-0',\n sm: '-right-1 bottom-0',\n md: '-right-1.5 -bottom-0.5',\n lg: '-right-1.5 -bottom-0.5',\n}\n\n// Presence colours — semantic status tokens seeded to the app's prior palette\n// (matches the sidebar's connection-status colours).\n/** Accessible name for each dot state — the same wording PresenceLabel prints. */\nconst PRESENCE_LABELS: Record<PresenceDisplayStatus, string> = {\n connected: 'Online',\n connecting: 'Connecting',\n disconnected: 'Offline',\n error: 'Connection problem',\n hidden: 'Status hidden',\n}\n\nconst presenceColorClasses: Record<PresenceDisplayStatus, string> = {\n connected: 'bg-status-online',\n connecting: 'bg-status-connecting',\n disconnected: 'bg-status-away',\n error: 'bg-status-busy',\n hidden: 'bg-status-offline',\n}\n\nexport const UserEntity = memo(function UserEntity({\n size = 'md',\n variant = 'pill',\n className,\n showTooltip = true,\n interactive = true,\n hasUnreadMessages = false,\n initials = '',\n displayName = '',\n picture,\n colorClass = '',\n isAgent = false,\n agentStyle,\n avatarStyle,\n isMe = false,\n displayStatus,\n onClick,\n tooltipContent,\n empty = false,\n}: UserEntityProps) {\n // Empty state - no user\n if (empty) {\n return (\n <Avatar\n className={cn(sizeClasses[size], 'border border-border', className)}\n data-testid=\"user-entity\"\n >\n <AvatarFallback className=\"bg-status-empty text-muted-foreground text-xs font-semibold\">\n ?\n </AvatarFallback>\n </Avatar>\n )\n }\n\n const agentBadge = isAgent ? (\n <ArbiBotHeadIcon className=\"w-3.5 h-3.5 text-muted-foreground\" />\n ) : undefined\n\n // Messaging another user: the pill avatar doubles as the affordance — on hover it\n // swaps to a chat icon (see pillAvatar below). `showUnread` recolours the single\n // bottom-right status dot instead of adding a second indicator.\n const canMessage = interactive && !isMe && !isAgent\n const showUnread = hasUnreadMessages && !isMe && !isAgent\n\n // One resolved inline style for the avatar surface. `agentStyle` was always\n // applied regardless of `isAgent`; `avatarStyle` is the same thing named for\n // what it does, so a non-agent tint no longer has to masquerade as one.\n const surfaceStyle = avatarStyle ?? agentStyle\n\n // Core avatar element - used in both icon and pill variants\n const avatarCore = (\n <Avatar\n className={cn(\n sizeClasses[size],\n isAgent ? 'rounded-full border-2 border-dashed' : 'border border-white'\n )}\n style={surfaceStyle}\n data-testid=\"user-entity\"\n >\n {picture && <AvatarImage src={picture} alt={initials} />}\n <AvatarFallback\n className={cn(\n textSizeClasses[size],\n 'font-semibold leading-none',\n isAgent ? 'rounded-full bg-transparent' : `text-white ${colorClass}`\n )}\n style={surfaceStyle}\n >\n {initials}\n </AvatarFallback>\n </Avatar>\n )\n\n // Bottom-right avatar dot — ONE dot, ONE location: blue (#00adef) when there's an\n // unread message from this user, otherwise the presence colour (green/grey/…).\n const statusDot =\n showUnread || displayStatus ? (\n <span\n className={cn(\n 'absolute rounded-full border-white',\n presenceDotClasses[size],\n presencePositionClasses[size],\n !showUnread && displayStatus ? presenceColorClasses[displayStatus] : ''\n )}\n style={showUnread ? { backgroundColor: '#00adef' } : undefined}\n data-testid=\"user-entity-presence\"\n // Named, not just coloured: a colour is legible only to someone who\n // already knows the convention, and to nobody using a screen reader.\n role=\"img\"\n aria-label={showUnread ? 'Unread messages' : PRESENCE_LABELS[displayStatus!]}\n title={showUnread ? 'Unread messages' : PRESENCE_LABELS[displayStatus!]}\n />\n ) : null\n\n // Icon variant avatar (used in stacks/columns) — avatar + optional status dot.\n // Inline-block at avatar size so a parent ring stays circular.\n const avatarElement = statusDot ? (\n <div\n className={cn(\n 'relative inline-block',\n sizeClasses[size],\n variant === 'pill' ? '' : className\n )}\n >\n {avatarCore}\n {statusDot}\n </div>\n ) : (\n <div className={cn('inline-block', variant === 'pill' ? '' : className)}>{avatarCore}</div>\n )\n\n // Pill variant avatar — the avatar itself IS the message affordance: on hover it\n // swaps to a chat icon (for other users), with the status dot pinned bottom-right.\n const pillAvatar = (\n // shrink-0: when the pill is squeezed the NAME truncates away — the avatar\n // must never collapse under it and overflow onto neighbouring text.\n <span className={cn('relative inline-block shrink-0', sizeClasses[size])}>\n <span className={cn('block transition-opacity', canMessage && 'group-hover/pill:opacity-0')}>\n {avatarCore}\n </span>\n {canMessage && (\n <span\n aria-hidden\n className=\"absolute inset-0 flex items-center justify-center rounded-full bg-muted text-foreground opacity-0 transition-opacity group-hover/pill:opacity-100\"\n >\n <MessageCircleMore className={size === 'xs' ? 'h-3 w-3' : 'h-4 w-4'} />\n </span>\n )}\n {statusDot}\n </span>\n )\n\n const resolvedTooltip = showTooltip ? tooltipContent : undefined\n\n // Pill variant — clean, borderless avatar + name (no container chrome). The avatar\n // itself is the message affordance (hover → chat icon); unread + presence share one\n // bottom-right dot. Only the agent badge trails the name. Interactivity + tooltip\n // are layered with no resting background — a subtle hover fill signals the target.\n if (variant === 'pill') {\n const row = (\n <>\n {pillAvatar}\n {displayName && (\n <span className=\"min-w-0 max-w-[320px] truncate text-sm leading-tight\">\n {displayName}\n </span>\n )}\n {agentBadge}\n </>\n )\n const rowClass = 'group/pill inline-flex min-w-0 items-center gap-2'\n const clickable = interactive && !!onClick\n const clickableClass =\n \"relative cursor-pointer rounded-md px-1 py-0.5 -mx-1 transition-colors hover:bg-muted/60 pointer-coarse:after:absolute pointer-coarse:after:inset-x-0 pointer-coarse:after:-inset-y-3 pointer-coarse:after:content-['']\"\n\n if (resolvedTooltip) {\n return (\n <Tooltip>\n <TooltipTrigger\n type=\"button\"\n onClick={clickable ? onClick : undefined}\n onFocusCapture={(e) => e.stopPropagation()}\n className={cn(rowClass, clickable && clickableClass, className)}\n data-testid=\"user-entity-pill\"\n >\n {row}\n </TooltipTrigger>\n <TooltipContent className=\"p-2\">{resolvedTooltip}</TooltipContent>\n </Tooltip>\n )\n }\n\n if (clickable) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(rowClass, clickableClass, className)}\n data-testid=\"user-entity-pill\"\n >\n {row}\n </button>\n )\n }\n\n return (\n <span className={cn(rowClass, className)} data-testid=\"user-entity-pill\">\n {row}\n </span>\n )\n }\n\n // Icon variant - always non-interactive, just show avatar with optional tooltip\n // Note: avoid asChild here — Radix ref merging with Avatar's internal refs causes infinite loops\n if (showTooltip) {\n return (\n <Tooltip>\n <TooltipTrigger\n onFocusCapture={(e) => e.stopPropagation()}\n className=\"touch-hit inline-flex\"\n >\n {avatarElement}\n </TooltipTrigger>\n <TooltipContent className=\"p-2\">{tooltipContent}</TooltipContent>\n </Tooltip>\n )\n }\n\n return avatarElement\n})\n","/**\n * The two things you need to know about a correspondent before you write to\n * them: whether it is an agent, and whether it is here.\n *\n * Both live beside {@link UserEntity} rather than in any one feature, because\n * an agent has to look like an agent wherever it appears — a conversation row,\n * a thread header, a members table. Splitting the mark per surface is how you\n * end up with three of them.\n */\n\nimport { ArbiBotHeadIcon } from '../icons/ArbiBotHeadIcon'\nimport { cn } from '../lib/utils'\nimport type { PresenceDisplayStatus } from './UserEntity'\n\n/**\n * \"AGENT\" stamp for an `agt-` peer.\n *\n * `UserEntity` already marks agents with a dashed ring and a bot icon, but that\n * is a detail you have to know to read. An agent is a different KIND of\n * correspondent — it acts on someone's behalf, and what you send it may be\n * acted on rather than read — so it also gets a label you cannot miss.\n */\nexport function AgentBadge({ className }: { className?: string }) {\n return (\n <span\n data-testid=\"agent-badge\"\n className={cn(\n 'inline-flex shrink-0 items-center gap-1 rounded-full border border-ai-accent/50',\n 'bg-ai-accent-soft px-2 py-0.5 text-xs font-bold uppercase tracking-wider text-ai-accent',\n className\n )}\n >\n <ArbiBotHeadIcon size={14} className=\"text-ai-accent\" />\n Agent\n </span>\n )\n}\n\n/** Wording for each presence state — `hidden` deliberately says nothing. */\nconst PRESENCE_WORDS: Record<PresenceDisplayStatus, string | null> = {\n connected: 'Online',\n connecting: 'Connecting',\n disconnected: 'Offline',\n error: 'Connection problem',\n hidden: null,\n}\n\n/**\n * Presence in words rather than a coloured dot alone.\n *\n * `status` is *resolved* by the app, exactly as {@link UserEntity} expects it,\n * and `undefined` renders nothing at all. That default matters: a consumer that\n * has not wired a WebSocket provider has no presence information, and labelling\n * every one of its contacts \"Offline\" would be stating something we do not\n * know. Whether absence of a signal means offline is a claim only the app can\n * make, so the app makes it by resolving to `disconnected`.\n */\nexport function PresenceLabel({\n status,\n className,\n}: {\n status?: PresenceDisplayStatus\n className?: string\n}) {\n if (!status) return null\n const word = PRESENCE_WORDS[status]\n if (!word) return null\n\n const online = status === 'connected'\n return (\n <span\n data-testid=\"presence-label\"\n className={cn('inline-flex shrink-0 items-center gap-1 text-xs', className)}\n >\n <span\n className={cn(\n 'size-1.5 rounded-full',\n online ? 'bg-status-online' : 'bg-muted-foreground/50'\n )}\n aria-hidden=\"true\"\n />\n <span className={online ? 'font-medium text-status-online' : 'text-muted-foreground'}>\n {word}\n </span>\n </span>\n )\n}\n","/**\n * Status pill + RAG dot — the generic presentation, with the domain vocabulary\n * INJECTED (never baked in), mirroring the entity registry (`configureEntityRegistry`).\n *\n * A deployment registers its own status→variant vocabulary and, if its Badge has\n * a bespoke skin (brand variants), injects that Badge too — so each app keeps its\n * exact pill look while sharing one component:\n *\n * configureStatusRegistry(\n * { Active: 'success', Privileged: 'brass', … }, // this firm's vocabulary\n * { fallback: 'outline', Badge: FirmBadge }, // this firm's Badge skin\n * )\n */\nimport { type ComponentType, type ReactNode } from 'react'\nimport { Badge as DefaultBadge } from '../ui/badge'\nimport { cn } from '../lib/utils'\n\n/** A status variant is an opaque string — its valid values are defined by the\n * injected Badge (or the default Badge's variants). */\nexport type StatusVariant = string\n\n/** The shape a consumer's Badge must satisfy to be injected as the pill skin. */\nexport interface StatusBadgeProps {\n variant?: StatusVariant\n className?: string\n children?: ReactNode\n 'data-testid'?: string\n}\nexport type StatusBadgeComponent = ComponentType<StatusBadgeProps>\n\n/** The package Badge's own variant vocabulary. Kept as an explicit runtime list so\n * the default skin can narrow a free-form StatusVariant to a known Badge variant\n * with a type guard (no cast) — an unrecognised status just renders as `outline`. */\ntype PackageBadgeVariant = 'default' | 'accent' | 'secondary' | 'destructive' | 'outline'\nconst PACKAGE_BADGE_VARIANTS: readonly PackageBadgeVariant[] = [\n 'default',\n 'accent',\n 'secondary',\n 'destructive',\n 'outline',\n]\nfunction isPackageBadgeVariant(v: string | undefined): v is PackageBadgeVariant {\n return PACKAGE_BADGE_VARIANTS.some((known) => known === v)\n}\n\n/** Default skin: the package Badge. A firm that registers variants outside this set\n * injects its own Badge (see `configureStatusRegistry`); here unknown → `outline`. */\nfunction PackageStatusBadge({ variant, ...rest }: StatusBadgeProps) {\n return <DefaultBadge variant={isPackageBadgeVariant(variant) ? variant : 'outline'} {...rest} />\n}\n\nconst registry: {\n variants: Record<string, StatusVariant>\n fallback: StatusVariant\n Badge: StatusBadgeComponent\n} = {\n variants: {},\n fallback: 'outline',\n Badge: PackageStatusBadge,\n}\n\n/** Register a firm's status→variant vocabulary (merged in place), and optionally\n * its fallback variant + its own Badge skin. Mirrors `configureEntityRegistry`. */\nexport function configureStatusRegistry(\n map: Record<string, StatusVariant>,\n opts?: { fallback?: StatusVariant; Badge?: StatusBadgeComponent }\n): void {\n Object.assign(registry.variants, map)\n if (opts?.fallback) registry.fallback = opts.fallback\n if (opts?.Badge) registry.Badge = opts.Badge\n}\n\n/** Resolve a status string to its variant (falls back to the registered default). */\nexport function getStatusVariant(status: string): StatusVariant {\n return registry.variants[status] ?? registry.fallback\n}\n\nexport interface StatusPillProps {\n status: string\n label?: string\n /** Escape hatch: force a variant, skipping the registry. */\n variant?: StatusVariant\n className?: string\n testId?: string\n}\n\n/** A status chip whose look comes from the injected Badge + registered vocabulary. */\nexport function StatusPill({ status, label, variant, className, testId }: StatusPillProps) {\n const Badge = registry.Badge\n return (\n <Badge variant={variant ?? getStatusVariant(status)} className={className} data-testid={testId}>\n {label ?? status}\n </Badge>\n )\n}\n\n// ── RAG dot ──────────────────────────────────────────────────────────────────\n\nexport type Rag = 'red' | 'amber' | 'green'\n\nlet RAG_LABELS: Record<Rag, string> = { red: 'At risk', amber: 'Attention', green: 'On track' }\n\n/** Override the RAG label copy (defaults are seeded so consumers stay identical). */\nexport function configureRagLabels(labels: Partial<Record<Rag, string>>): void {\n RAG_LABELS = { ...RAG_LABELS, ...labels }\n}\n\n/** A small RAG dot + optional label for dense tables. Semantic tokens only. */\nexport function RagDot({\n rag,\n withLabel,\n className,\n}: {\n rag: Rag\n withLabel?: boolean\n className?: string\n}) {\n const color = rag === 'red' ? 'bg-destructive' : rag === 'amber' ? 'bg-warning' : 'bg-success'\n return (\n <span className={cn('inline-flex items-center gap-1.5', className)} data-testid={`rag-${rag}`}>\n <span className={cn('size-2 rounded-full', color)} />\n {withLabel && <span className=\"text-xs text-muted-foreground\">{RAG_LABELS[rag]}</span>}\n </span>\n )\n}\n","/**\n * Entity registry — the single, canonical source of truth for entity icons and\n * display names across every ARBI app (monolith, clarum, any deployment).\n *\n * Centralises \"what glyph and what word represents a WORKSPACE / DOCUMENT / USER /\n * …\" so rebranding or re-skinning happens in ONE place. The monolith and other\n * deployments layer their own flourishes on top via {@link configureEntityRegistry}\n * (e.g. a custom workspace glyph, or brand names like \"MatterSpace\") without\n * forking this map.\n *\n * Deliberately dependency-light: lucide icon components + plain data. No store,\n * no app `@/` imports. Consumers render via {@link EntityIcon} or read\n * {@link getEntityIcon}/{@link getEntityLabel}.\n */\n\nimport React from 'react'\nimport {\n UserStar,\n Bell,\n BookOpen,\n CaptionsOff,\n ChevronsDown,\n CircleUserRound,\n ClipboardList,\n Columns3Cog,\n Eye,\n EyeOff,\n FileQuestion,\n FolderOpen,\n FolderPlus,\n Hash,\n Info,\n LayoutGrid,\n LogOut,\n MessageSquare,\n MessageSquareLock,\n MessageSquareMore,\n MessageSquareOff,\n MessageSquarePlus,\n MessageSquareText,\n MessagesSquare,\n NotebookPen,\n NotebookText,\n CreditCard,\n Settings2,\n SquareM,\n SquarePlus,\n StickyNote,\n Upload,\n User,\n UserPlus,\n Users,\n Wrench,\n} from 'lucide-react'\n\n/** An icon component usable in the registry (lucide icons + custom SVG wrappers). */\nexport type EntityIconComponent = React.ComponentType<\n React.SVGAttributes<SVGElement> & { size?: number | string; className?: string }\n>\n\n/**\n * Entity Mappings — naming conventions + icons for every entity in the app.\n *\n * `WORKSPACE.ICONS.DEFAULT` is the generic `SquareM` here; the monolith injects a\n * rotated variant via {@link configureEntityRegistry}. The object is mutated in\n * place by that helper, so existing `ENTITY_MAPPINGS` references stay live.\n */\nexport const ENTITY_MAPPINGS = {\n PRODUCT: {\n NAMES: {\n SINGULAR: 'ARBI Docs',\n },\n ICONS: {\n DEFAULT: MessageSquareLock,\n },\n },\n SECTION: {\n NAMES: {\n SINGULAR: 'Section',\n },\n ICONS: {\n DEFAULT: ChevronsDown,\n },\n },\n WORKSPACE: {\n NAMES: {\n SINGULAR: 'Workspace',\n PLURAL: 'Workspaces',\n },\n ICONS: {\n DEFAULT: SquareM,\n NEW: SquarePlus,\n LIST: LayoutGrid,\n SETTINGS: Columns3Cog,\n },\n },\n CONVERSATION: {\n NAMES: {\n SINGULAR: 'Thread',\n PLURAL: 'Threads',\n NEW: 'New Thread',\n },\n ICONS: {\n DEFAULT: MessagesSquare,\n OFF: MessageSquareOff,\n ACTIVE: MessageSquareText,\n NEW: MessageSquarePlus,\n LIST: MessageSquareMore,\n },\n },\n DOCUMENT: {\n NAMES: {\n SINGULAR: 'File',\n PLURAL: 'Files',\n },\n ICONS: {\n DEFAULT: FolderOpen,\n OFF: CaptionsOff,\n },\n },\n VIEWER: {\n NAMES: {\n SINGULAR: 'Viewer',\n PLURAL: 'Viewers',\n },\n ICONS: {\n DEFAULT: Eye,\n OFF: EyeOff,\n },\n },\n TAG: {\n NAMES: {\n SINGULAR: 'Field',\n PLURAL: 'Fields',\n },\n ICONS: {\n DEFAULT: Hash,\n NEW: FolderPlus,\n },\n },\n ANNOTATION: {\n NAMES: {\n SINGULAR: 'Annotation',\n PLURAL: 'Annotations',\n },\n ICONS: {\n DEFAULT: StickyNote,\n NEW: StickyNote,\n },\n },\n // Workspace knowledge the assistant retains and recalls — durable free text,\n // optionally grounded in source passages. Distinct from ANNOTATION, which is\n // attached TO a document field; a NOTE is workspace-scoped and stands alone.\n // Stored server-side as `memories` (mem-*); \"Note\" is the user-facing name.\n NOTE: {\n NAMES: {\n SINGULAR: 'Note',\n PLURAL: 'Notes',\n },\n ICONS: {\n DEFAULT: NotebookText,\n NEW: NotebookPen,\n },\n },\n USER: {\n NAMES: {\n SINGULAR: 'User',\n PLURAL: 'Users',\n },\n ICONS: {\n DEFAULT: User,\n NEW: UserPlus,\n SETTINGS: Settings2,\n },\n },\n WORKSPACEUSER: {\n NAMES: {\n SINGULAR: 'Member',\n PLURAL: 'Members',\n },\n ICONS: {\n DEFAULT: User,\n PLURAL: Users,\n NEW: UserPlus,\n SETTINGS: Settings2,\n },\n },\n CONTACT: {\n NAMES: {\n SINGULAR: 'Contact',\n PLURAL: 'Contacts',\n },\n ICONS: {\n // A starred person, not an address-book card: contacts here are the\n // people you talk to, and the star reads as \"your people\".\n DEFAULT: UserStar,\n NEW: UserPlus,\n },\n },\n TASK: {\n NAMES: {\n SINGULAR: 'Job',\n PLURAL: 'Jobs',\n },\n ICONS: {\n DEFAULT: ClipboardList,\n },\n },\n PROJECT: {\n NAMES: {\n SINGULAR: 'Project',\n PLURAL: 'Projects',\n },\n ICONS: {\n DEFAULT: CreditCard,\n },\n },\n SKILL: {\n NAMES: {\n SINGULAR: 'Skill',\n PLURAL: 'Skills',\n },\n ICONS: {\n DEFAULT: Wrench,\n },\n },\n ACCOUNT: {\n NAMES: {\n SINGULAR: 'Account',\n },\n ICONS: {\n DEFAULT: CircleUserRound,\n },\n },\n NOTIFICATIONS: {\n NAMES: {\n SINGULAR: 'Activity',\n PLURAL: 'Activities',\n },\n ICONS: {\n DEFAULT: Bell,\n },\n },\n MESSAGE: {\n NAMES: {\n SINGULAR: 'Message',\n PLURAL: 'Messages',\n },\n ICONS: {\n DEFAULT: MessageSquare,\n },\n },\n NOTIFICATION: {\n NAMES: {\n SINGULAR: 'Notification',\n PLURAL: 'Notifications',\n },\n ICONS: {\n DEFAULT: Bell,\n },\n },\n APP: {\n NAMES: {\n SINGULAR: 'Application',\n PLURAL: 'Applications',\n },\n ICONS: {\n DEFAULT: LayoutGrid,\n HOME: LayoutGrid,\n LOGOUT: LogOut,\n UPLOAD: Upload,\n },\n },\n HELP: {\n NAMES: {\n SINGULAR: 'Help',\n PLURAL: 'Help',\n },\n ICONS: {\n DEFAULT: MessageSquareLock,\n DOCS: BookOpen,\n FAQ: FileQuestion,\n ABOUT: Info,\n },\n },\n USERSHIELD: {\n NAMES: {\n SINGULAR: 'User Shield',\n PLURAL: 'User Shields',\n },\n ICONS: {\n DEFAULT: MessageSquareLock,\n },\n },\n}\n\n/** The set of registered entity types. */\nexport type EntityType = keyof typeof ENTITY_MAPPINGS\n\n/** Deployment override for a single entity: extra/replacement names and icons. */\nexport interface EntityRegistryOverride {\n NAMES?: Record<string, string>\n ICONS?: Record<string, EntityIconComponent>\n}\n\n/**\n * Layer deployment-specific names/icons onto the canonical registry — call once\n * at app startup. Merges in place (so live `ENTITY_MAPPINGS` refs pick it up) and\n * only touches the keys you pass, e.g.:\n *\n * ```ts\n * configureEntityRegistry({\n * WORKSPACE: { NAMES: { SINGULAR: 'MatterSpace' }, ICONS: { DEFAULT: RotatedSquareM } },\n * })\n * ```\n */\nexport function configureEntityRegistry(\n overrides: Partial<Record<EntityType, EntityRegistryOverride>>\n): void {\n for (const [type, def] of Object.entries(overrides)) {\n const target = ENTITY_MAPPINGS[type as EntityType] as {\n NAMES: Record<string, string>\n ICONS: Record<string, EntityIconComponent>\n }\n if (!target) continue\n if (def?.NAMES) Object.assign(target.NAMES, def.NAMES)\n if (def?.ICONS) Object.assign(target.ICONS, def.ICONS)\n }\n}\n\n/**\n * Resolve the icon component for an entity type + variant, falling back to the\n * type's DEFAULT icon for unknown variants.\n */\nexport const getEntityIcon = (\n entityType: EntityType,\n variant: string = 'DEFAULT'\n): EntityIconComponent | undefined => {\n const icons = ENTITY_MAPPINGS[entityType]?.ICONS as\n Record<string, EntityIconComponent> | undefined\n return icons?.[variant] || icons?.DEFAULT\n}\n\ninterface EntityNames {\n SINGULAR: string\n PLURAL?: string\n SHORT?: string\n NEW?: string\n}\n\n/**\n * Display label for an entity type. `SINGULAR` (default); `PLURAL`/`SHORT`/`NEW`\n * fall back to derivations of the singular when not explicitly configured.\n */\nexport const getEntityLabel = (\n entityType: EntityType,\n form: 'SINGULAR' | 'PLURAL' | 'SHORT' | 'NEW' = 'SINGULAR'\n): string => {\n const entityMapping = ENTITY_MAPPINGS[entityType]\n if (!entityMapping) return ''\n const names = entityMapping.NAMES as EntityNames\n const singularName = names.SINGULAR || ''\n\n if (form === 'NEW') return names.NEW !== undefined ? names.NEW : 'New ' + singularName\n if (form === 'SHORT')\n return names.SHORT !== undefined ? names.SHORT : singularName.substring(0, 3) + '.'\n if (form === 'PLURAL') return names.PLURAL !== undefined ? names.PLURAL : singularName + 's'\n return singularName\n}\n\ntype EntityIconProps = {\n entityType: EntityType\n variant?: string\n className?: string\n size?: number\n color?: string\n 'data-testid'?: string\n onClick?: () => void\n} & React.SVGAttributes<SVGElement>\n\n/**\n * Render an entity's icon — the recommended way to show entity glyphs so all\n * icon choices stay centralised.\n */\nexport const EntityIcon = ({ entityType, variant = 'DEFAULT', ...props }: EntityIconProps) => {\n const IconComponent = getEntityIcon(entityType, variant)\n return IconComponent ? React.createElement(IconComponent, props) : null\n}\n\n/** Centralised icons for private/shared visibility states. */\nexport const VISIBILITY_ICONS = {\n PRIVATE: MessageSquareLock,\n SHARED: Users,\n}\n\n/** Render the private/shared visibility glyph. */\nexport const VisibilityIcon = ({\n isShared,\n className,\n ...props\n}: {\n isShared: boolean\n className?: string\n size?: number\n color?: string\n 'data-testid'?: string\n onClick?: () => void\n} & React.SVGAttributes<SVGElement>) => {\n const IconComponent = isShared ? VISIBILITY_ICONS.SHARED : VISIBILITY_ICONS.PRIVATE\n return React.createElement(IconComponent, {\n ...props,\n className: [isShared ? 'text-secondary' : 'text-primary', className].filter(Boolean).join(' '),\n })\n}\n","/**\n * Entity colour system — the single source of truth for deriving a stable colour\n * from an entity id (workspace/tag/doc badges) shared across every app.\n *\n * ONE base palette (16 colours, indexed by the hex char at position 5 of an\n * entity id) + three opacity constants that shift every variant globally. Pure,\n * framework-free: no React, no store, no app `@/` imports.\n */\n\n// Adjust these three constants to shift all entity colours at once.\nconst OPACITY_LIGHT = 0.15 // Light backgrounds (tags with dark text)\nconst OPACITY_MEDIUM = 1.0 // Medium backgrounds (workspace icons with white text)\nconst OPACITY_BORDER = 0.3 // Borders\n\n/** Semantic placeholder colour for empty/pending states (gray-400). */\nexport const PLACEHOLDER_COLOR = '#9ca3af'\n\n/** Neutral gray for generic/unknown file types (slate-500). */\nexport const NEUTRAL_GRAY = '#64748b'\n\n/** Base palette — source of truth for all entity colours (hex char 0–f). */\nexport const BASE_COLORS: Record<string, string> = {\n '0': '#10b981',\n '1': '#3b82f6',\n '2': '#8b5cf6',\n '3': '#f43f5e',\n '4': '#f59e0b',\n '5': '#84cc16',\n '6': '#a855f7',\n '7': '#06b6d4',\n '8': '#f97316',\n '9': '#14b8a6',\n a: '#ef4444',\n b: '#6366f1',\n c: '#ec4899',\n d: '#22c55e',\n e: '#eab308',\n f: '#0ea5e9',\n}\n\n/** Convert a `#rrggbb` hex colour to an `rgba(...)` string at the given opacity. */\nfunction hexToRgba(hex: string, opacity: number): string {\n const r = parseInt(hex.slice(1, 3), 16)\n const g = parseInt(hex.slice(3, 5), 16)\n const b = parseInt(hex.slice(5, 7), 16)\n return `rgba(${r}, ${g}, ${b}, ${opacity})`\n}\n\n/**\n * Deterministic colour for an entity id. The 5th char (index 4) of the id selects\n * a base colour; the variant picks the opacity treatment.\n */\nexport function getEntityColor(\n entityId: string,\n variant: 'light' | 'medium' | 'text' = 'medium'\n): string {\n const baseColor = BASE_COLORS[entityId[4]] || BASE_COLORS['0']\n switch (variant) {\n case 'light':\n return hexToRgba(baseColor, OPACITY_LIGHT)\n case 'medium':\n return hexToRgba(baseColor, OPACITY_MEDIUM)\n case 'text':\n return baseColor\n }\n}\n\n/** Full badge colour set for an entity id: light background + solid text + border. */\nexport function getEntityColorStyles(entityId: string): {\n backgroundColor: string\n color: string\n borderColor: string\n} {\n const baseColor = BASE_COLORS[entityId[4]] || BASE_COLORS['0']\n return {\n backgroundColor: getEntityColor(entityId, 'light'),\n color: baseColor,\n borderColor: hexToRgba(baseColor, OPACITY_BORDER),\n }\n}\n\n/**\n * Colour for a workspace id — the MEDIUM (solid) variant, for white text on top.\n * Returns the `--primary` token when colours are disabled or the id is invalid,\n * so callers always get a paintable value.\n */\nexport const getWorkspaceColor = (\n workspaceId: string | undefined | null,\n useWorkspaceColors?: boolean\n): string => {\n const shouldUseWorkspaceColors = useWorkspaceColors !== undefined ? useWorkspaceColors : true\n if (!shouldUseWorkspaceColors) return 'hsl(var(--primary))'\n const isValidId = workspaceId && workspaceId.startsWith('wrk-') && workspaceId.length >= 5\n if (!isValidId) return 'hsl(var(--primary))'\n return getEntityColor(workspaceId, 'medium')\n}\n","/**\n * UserMenu — the topbar account dropdown: an avatar (picture or initials) with a\n * chevron that opens a menu of account actions and a sign-out. Firm-agnostic —\n * the user, the menu items and logout are all supplied by the host; styling\n * tracks semantic tokens.\n */\nimport { Fragment, type ComponentType } from 'react'\nimport { ChevronDown, ChevronsUpDown, LogOut, X } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n} from '../ui/dropdown-menu'\nimport { cn } from '../lib/utils'\n\n/** Initials from a display name (falls back to \"?\"). */\nfunction nameInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n if (!parts.length) return '?'\n return parts\n .slice(0, 2)\n .map((p) => p[0]?.toUpperCase() ?? '')\n .join('')\n}\n\nexport interface UserMenuItem {\n label: string\n icon?: ComponentType<{ className?: string }>\n onSelect: () => void\n testId?: string\n /** A count or short state on the right (e.g. the number of files processing). */\n badge?: string | number\n /** A small unread dot on the icon (e.g. new messages). */\n dot?: boolean\n /** Makes the row a labelled on/off switch (role menuitemcheckbox); selecting it flips the state. */\n checked?: boolean\n /** Draw a divider above this row to start a new group. */\n separatorBefore?: boolean\n}\n\n/** Connection/presence state shown as a dot on the avatar and a line under the\n * email — the account menu is where \"am I connected\" belongs. */\nexport interface UserMenuStatus {\n /** Short state word — \"Connected\", \"Working offline\". */\n label: string\n tone: 'online' | 'busy' | 'offline'\n /** Fine print under the label (e.g. the server domain). */\n detail?: string\n testId?: string\n}\n\nconst STATUS_DOT: Record<UserMenuStatus['tone'], string> = {\n online: 'bg-emerald-500',\n busy: 'bg-amber-500',\n offline: 'bg-destructive',\n}\n\nexport interface UserMenuProps {\n user: { name: string; email?: string | null; picture?: string | null }\n /** Optional connection status: avatar dot + a line in the dropdown header. */\n status?: UserMenuStatus\n /** Account actions above the sign-out divider (e.g. Settings). */\n items?: UserMenuItem[]\n onLogout: () => void\n logoutLabel?: string\n align?: 'start' | 'center' | 'end'\n /** Which side of the trigger the menu opens on (a footer trigger opens upward or sideways). */\n side?: 'top' | 'right' | 'bottom' | 'left'\n /**\n * `avatar` (default): avatar + chevron. `account`: a full-width account bar, avatar + display\n * name + chevron, for a sidebar footer.\n */\n variant?: 'avatar' | 'account'\n /** `avatar` only: draw the chevron (the icon-only rail hides it). */\n showChevron?: boolean\n classNames?: { trigger?: string; fallback?: string }\n testId?: string\n logoutTestId?: string\n}\n\nexport function UserMenu({\n user,\n status,\n items = [],\n onLogout,\n logoutLabel = 'Sign out',\n align = 'end',\n side = 'bottom',\n variant = 'avatar',\n showChevron = true,\n classNames,\n testId = 'user-menu',\n logoutTestId,\n}: UserMenuProps) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n 'flex items-center gap-2 rounded-md transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n variant === 'account'\n ? 'w-full min-w-0 p-1 text-left pointer-coarse:min-h-11'\n : 'px-1.5 py-1 pointer-coarse:min-h-11 pointer-coarse:min-w-11 pointer-coarse:justify-center',\n classNames?.trigger\n )}\n data-testid={testId}\n data-variant={variant}\n aria-label={variant === 'avatar' ? 'Account menu' : undefined}\n title={variant === 'avatar' ? user.name : undefined}\n >\n <span className=\"relative\">\n <Avatar className=\"size-8\">\n {user.picture ? <AvatarImage src={user.picture} alt={user.name} /> : null}\n <AvatarFallback\n className={cn('bg-primary text-primary-foreground', classNames?.fallback)}\n >\n {nameInitials(user.name)}\n </AvatarFallback>\n </Avatar>\n {status && (\n <span\n className={cn(\n 'absolute -bottom-0.5 -right-0.5 size-2.5 rounded-full border-2 border-background',\n STATUS_DOT[status.tone]\n )}\n title={status.detail ? `${status.label} · ${status.detail}` : status.label}\n data-testid={status.testId ? `${status.testId}-dot` : undefined}\n />\n )}\n </span>\n {variant === 'account' ? (\n <>\n <span className=\"min-w-0 flex-1 truncate text-sm font-medium text-foreground\">\n {user.name}\n </span>\n <ChevronsUpDown className=\"mr-1 size-4 shrink-0 text-muted-foreground\" />\n </>\n ) : (\n showChevron && <ChevronDown className=\"size-4 text-muted-foreground\" />\n )}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align={align}\n side={side}\n sideOffset={8}\n collisionPadding={12}\n className=\"w-60 rounded-lg border-border/60 shadow-lg\"\n data-testid=\"user-menu-panel\"\n data-topbar-popover=\"\"\n >\n <DropdownMenuLabel className=\"relative pr-8 pointer-coarse:pr-12\">\n {/* Explicit close — on a phone (see blocks.css, which pins\n this panel full-width under the topbar) tap-outside is easy to\n miss since the panel covers most of the screen. Radix closes a\n DropdownMenu on any item select by default, so a plain item\n with no other effect doubles as a close button. */}\n <DropdownMenuItem\n className=\"absolute right-1 top-1 flex size-6 items-center justify-center rounded-md p-0 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus:bg-accent pointer-coarse:right-0 pointer-coarse:top-0 pointer-coarse:size-11\"\n aria-label=\"Close account menu\"\n data-testid=\"user-menu-close\"\n >\n <X className=\"size-3.5\" />\n </DropdownMenuItem>\n <div className=\"truncate font-medium text-foreground\" title={user.name}>\n {user.name}\n </div>\n {user.email && (\n <div className=\"truncate text-xs font-normal text-muted-foreground\" title={user.email}>\n {user.email}\n </div>\n )}\n {status && (\n <div\n className=\"mt-1 text-xs font-normal text-muted-foreground\"\n data-testid={status.testId}\n >\n <span className=\"flex items-center gap-1.5\">\n <span className={cn('size-2 shrink-0 rounded-full', STATUS_DOT[status.tone])} />\n {status.label}\n </span>\n {status.detail && (\n <div className=\"mt-0.5 truncate pl-3.5 text-xs leading-tight text-muted-foreground/70\">\n {status.detail}\n </div>\n )}\n </div>\n )}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {items.map((item) => (\n <Fragment key={item.label}>\n {item.separatorBefore && <DropdownMenuSeparator />}\n <DropdownMenuItem\n onClick={item.onSelect}\n data-testid={item.testId}\n className=\"pointer-coarse:min-h-11\"\n {...(item.checked !== undefined\n ? { role: 'menuitemcheckbox', 'aria-checked': item.checked }\n : {})}\n >\n {item.icon && (\n <span className=\"relative flex shrink-0\">\n <item.icon className=\"size-4\" />\n {item.dot && (\n <span\n className=\"absolute -right-0.5 -top-0.5 size-2 rounded-full bg-primary ring-2 ring-popover\"\n aria-hidden\n />\n )}\n </span>\n )}\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n {item.badge !== undefined && (\n <span className=\"rounded-full bg-muted px-1.5 text-xs font-medium tabular-nums text-muted-foreground\">\n {item.badge}\n </span>\n )}\n {item.checked !== undefined && (\n <span\n aria-hidden\n className={cn(\n 'flex h-4 w-7 shrink-0 items-center rounded-full p-0.5 transition-colors',\n item.checked ? 'bg-primary' : 'bg-border'\n )}\n >\n <span\n className={cn(\n 'size-3 rounded-full bg-background transition-transform',\n item.checked && 'translate-x-3'\n )}\n />\n </span>\n )}\n </DropdownMenuItem>\n </Fragment>\n ))}\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={onLogout}\n data-testid={logoutTestId ?? `${testId}-logout`}\n className=\"pointer-coarse:min-h-11\"\n >\n <LogOut className=\"size-4\" />\n {logoutLabel}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","/**\n * DocumentCard — the canonical document thumbnail tile.\n *\n * One tile, shared by every app: a full-bleed first-page thumbnail (falling back\n * to the file-type icon) with the selection checkbox, the actions menu, the\n * processing state and the document's name pill layered on top of it, rather\n * than a thumbnail box with a separate meta strip beneath.\n *\n * Presentational only — it takes a thumbnail, a status and callbacks, and knows\n * nothing about how documents are fetched. `DocumentGallery` binds it to data.\n */\n\nimport React from 'react'\nimport { AlertTriangle, CheckCircle, FileX, SkipForward, XCircle } from 'lucide-react'\n\nimport { DocumentEntity, type DocumentLike } from '../entities/DocumentEntity'\nimport { Checkbox } from '../ui/checkbox'\nimport { PdfIcon } from '../icons/PdfIcon'\nimport { ImgIcon } from '../icons/ImgIcon'\nimport { VidIcon } from '../icons/VidIcon'\nimport { AudIcon } from '../icons/AudIcon'\nimport { EmlIcon } from '../icons/EmlIcon'\nimport { cn } from '../lib/utils'\n\n/** Statuses that mean work is still in flight — these get the progress overlay. */\nconst ACTIVE_STATUSES = new Set([\n 'queued',\n 'processing',\n 'parsing',\n 'encrypting',\n 'indexing',\n 'analysing',\n])\n\n/** Statuses the backend has settled on — these get a corner marker. */\nconst TERMINAL_STATUSES = new Set(['completed', 'failed', 'skipped', 'empty', 'low-content'])\n\nconst STATUS_LABEL: Record<string, string> = {\n queued: 'Queued',\n processing: 'Processing',\n parsing: 'Parsing',\n encrypting: 'Encrypting',\n indexing: 'Indexing',\n analysing: 'Analysing',\n}\n\nconst IMAGE_EXTENSIONS = new Set(['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'tif', 'webp'])\nconst VIDEO_EXTENSIONS = new Set(['mp4', 'mpeg', 'mpg', 'webm', 'mov', 'avi', 'mkv'])\nconst AUDIO_EXTENSIONS = new Set(['mp3', 'wav', 'm4a', 'aac', 'ogg', 'flac'])\nconst EMAIL_EXTENSIONS = new Set(['eml', 'msg'])\n\n/** Large file-type glyph shown when a document has no first-page thumbnail. */\nfunction fileIcon(fileName: string | null | undefined, size: number): React.ReactNode {\n const ext = fileName?.split('.').pop()?.toLowerCase()\n if (ext && VIDEO_EXTENSIONS.has(ext)) return <VidIcon size={size} />\n if (ext && AUDIO_EXTENSIONS.has(ext)) return <AudIcon size={size} />\n if (ext && IMAGE_EXTENSIONS.has(ext)) return <ImgIcon size={size} />\n if (ext && EMAIL_EXTENSIONS.has(ext)) return <EmlIcon size={size} />\n return <PdfIcon size={size} />\n}\n\n/**\n * Inline rename field, shown in place of the name pill. Enter or blur commits,\n * Escape cancels; guarded against the double commit an Enter-then-blur causes.\n */\nfunction RenameField({\n seed,\n onCommit,\n onCancel,\n testId,\n}: {\n seed: string\n onCommit: (value: string) => void\n onCancel: () => void\n testId?: string\n}) {\n const done = React.useRef(false)\n const commit = (value: string) => {\n if (done.current) return\n done.current = true\n const trimmed = value.trim()\n if (trimmed && trimmed !== seed) onCommit(trimmed)\n else onCancel()\n }\n return (\n <input\n autoFocus\n defaultValue={seed}\n data-testid={testId}\n onFocus={(e) => e.currentTarget.select()}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n commit(e.currentTarget.value)\n } else if (e.key === 'Escape') {\n e.preventDefault()\n done.current = true\n onCancel()\n }\n }}\n onBlur={(e) => commit(e.currentTarget.value)}\n className=\"w-full rounded border border-primary bg-background px-1 py-0.5 text-xs text-foreground outline-none\"\n />\n )\n}\n\n/** Corner marker for a settled status. Returns null for anything still in flight. */\nfunction StatusMarker({ status, testId }: { status: string; testId?: string }) {\n let icon: React.ReactNode = null\n let title = ''\n switch (status) {\n case 'completed':\n icon = <CheckCircle className=\"size-4 text-success\" strokeWidth={2.75} />\n title = 'Ready'\n break\n case 'failed':\n icon = <XCircle className=\"size-4 text-destructive\" strokeWidth={2.75} />\n title = 'Failed'\n break\n case 'skipped':\n icon = <SkipForward className=\"size-4 text-muted-foreground\" strokeWidth={2.75} />\n title = 'Skipped'\n break\n case 'empty':\n icon = <FileX className=\"size-4 text-warning\" strokeWidth={2.75} />\n title = 'Empty — no extractable content'\n break\n case 'low-content':\n icon = <AlertTriangle className=\"size-4 text-warning\" strokeWidth={2.75} />\n title = 'Low content — minimal extractable content'\n break\n default:\n return null\n }\n return (\n <span\n title={title}\n data-testid={testId}\n className=\"flex size-6 items-center justify-center rounded-full bg-background shadow-sm\"\n >\n {icon}\n </span>\n )\n}\n\nexport interface DocumentCardProps {\n /** The document — anything with a file name and optional metadata title. */\n doc: DocumentLike\n /** First-page thumbnail (data URI or URL). Falls back to the file-type icon. */\n thumbnailUrl?: string | null\n /** Processing status, e.g. `parsing` (overlay) or `completed` (corner marker). */\n status?: string | null\n /** Renders the selection checkbox. Omit `onToggleSelect` to hide it entirely. */\n selected?: boolean\n onToggleSelect?: () => void\n /** Pins the \"eye\" on the name pill — this is the document open in the viewer. */\n viewing?: boolean\n onOpen?: () => void\n /** Actions menu, pinned to the tile's top-right corner. */\n actions?: React.ReactNode\n /** Swaps the name pill for an inline rename field. */\n renaming?: boolean\n onCommitRename?: (name: string) => void\n onCancelRename?: () => void\n /** Replaces the pill's default hover tooltip (e.g. an AI summary + labels). */\n tooltipContent?: React.ReactNode\n /** Bottom-left marker slot (e.g. an \"available offline\" glyph). */\n marker?: React.ReactNode\n testId?: string\n className?: string\n}\n\nexport function DocumentCard({\n doc,\n thumbnailUrl,\n status,\n selected = false,\n onToggleSelect,\n viewing = false,\n onOpen,\n actions,\n renaming = false,\n onCommitRename,\n onCancelRename,\n tooltipContent,\n marker,\n testId = 'document-card',\n className,\n}: DocumentCardProps) {\n const normalised = (status ?? '').toLowerCase()\n const isProcessing = ACTIVE_STATUSES.has(normalised)\n const showStatusMarker = !isProcessing && TERMINAL_STATUSES.has(normalised)\n\n // A thumbnail only exists once a document is processed, so a processing tile\n // always shows the overlay. Portrait pages fill the tile (top-aligned) for\n // legibility; landscape ones are fit whole so nothing is cropped away.\n const [thumbFailed, setThumbFailed] = React.useState(false)\n const [thumbLandscape, setThumbLandscape] = React.useState(false)\n const showThumbnail = !!thumbnailUrl && !thumbFailed && !isProcessing\n\n return (\n <div\n data-testid={testId}\n className={cn(\n // Square corners and a portrait-page aspect (height = 1.3 × width), so a\n // cover-page thumbnail reads edge-to-edge.\n 'group relative aspect-[10/13] select-none overflow-hidden border bg-muted/20 transition',\n selected\n ? 'border-primary bg-primary/10'\n : 'border-border shadow-sm hover:border-border/80 hover:bg-muted/50',\n className\n )}\n >\n {/* Base layer: full-bleed thumbnail, else the centred file-type icon. */}\n {showThumbnail ? (\n <img\n src={thumbnailUrl}\n alt=\"\"\n loading=\"lazy\"\n draggable={false}\n onError={() => setThumbFailed(true)}\n onLoad={(e) =>\n setThumbLandscape(e.currentTarget.naturalWidth > e.currentTarget.naturalHeight)\n }\n className={cn(\n 'absolute inset-0 size-full bg-white',\n thumbLandscape ? 'object-contain' : 'object-cover object-top'\n )}\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center text-muted-foreground\">\n {fileIcon(doc.file_name, 44)}\n </div>\n )}\n\n {/* In flight: an indeterminate bar and the stage name, over a scrim. */}\n {isProcessing && (\n <div\n data-testid={`${testId}-processing`}\n className=\"absolute inset-0 z-10 flex flex-col items-center justify-center gap-1.5 bg-background/80 px-3\"\n >\n <div className=\"h-1.5 w-full overflow-hidden rounded-sm bg-muted\">\n <div className=\"h-full w-1/3 animate-pulse rounded-sm bg-primary\" />\n </div>\n <span className=\"text-xs font-medium text-primary\">\n {STATUS_LABEL[normalised] ?? normalised}\n </span>\n </div>\n )}\n\n {/* Selection (top-left) — faded until the tile is hovered or selected. */}\n {onToggleSelect && (\n <Checkbox\n checked={selected}\n onCheckedChange={() => onToggleSelect()}\n onClick={(e) => e.stopPropagation()}\n aria-label={selected ? 'Deselect' : 'Select'}\n data-testid={`${testId}-select`}\n className={cn(\n 'absolute left-1.5 top-1.5 z-20 size-6 rounded-none border-muted-foreground/60 bg-background shadow-sm transition',\n selected ? 'opacity-100' : 'opacity-40 group-hover:opacity-100'\n )}\n />\n )}\n\n {/* Actions (top-right). */}\n {actions && <div className=\"absolute right-1.5 top-1.5 z-20\">{actions}</div>}\n\n {/* Bottom stack: a markers row above the document's name pill. */}\n <div className=\"absolute inset-x-1.5 bottom-1.5 z-20 flex flex-col gap-1\">\n {(marker || showStatusMarker) && (\n <div className=\"flex items-center\">\n {marker}\n {showStatusMarker && (\n <div className=\"ml-auto flex\">\n <StatusMarker status={normalised} testId={`${testId}-status`} />\n </div>\n )}\n </div>\n )}\n {renaming ? (\n <RenameField\n seed={doc.doc_metadata?.title || doc.file_name || ''}\n onCommit={(name) => onCommitRename?.(name)}\n onCancel={() => onCancelRename?.()}\n testId={`${testId}-rename-input`}\n />\n ) : (\n <DocumentEntity\n doc={doc}\n fullWidth\n viewing={viewing}\n tooltipContent={tooltipContent}\n labelClassName=\"font-semibold\"\n className=\"w-full min-w-0 max-w-full bg-background/90 backdrop-blur-sm\"\n onClick={(e) => {\n e.stopPropagation()\n onOpen?.()\n }}\n />\n )}\n </div>\n </div>\n )\n}\n"]}