@mieweb/ui 0.10.0-dev.19 → 0.10.0-dev.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-QR7EG7YH.js → chunk-2ABWFQQH.js} +3 -3
- package/dist/{chunk-QR7EG7YH.js.map → chunk-2ABWFQQH.js.map} +1 -1
- package/dist/{chunk-GVBHDRC7.cjs → chunk-6N6LIAUJ.cjs} +6 -6
- package/dist/{chunk-GVBHDRC7.cjs.map → chunk-6N6LIAUJ.cjs.map} +1 -1
- package/dist/{chunk-VILW53UZ.js → chunk-BIQ7GSO2.js} +3 -3
- package/dist/{chunk-VILW53UZ.js.map → chunk-BIQ7GSO2.js.map} +1 -1
- package/dist/{chunk-XI34EGK5.cjs → chunk-CPPUT74P.cjs} +9 -9
- package/dist/{chunk-XI34EGK5.cjs.map → chunk-CPPUT74P.cjs.map} +1 -1
- package/dist/{chunk-5JJ2DAE4.js → chunk-ENMXHZNE.js} +3 -3
- package/dist/{chunk-5JJ2DAE4.js.map → chunk-ENMXHZNE.js.map} +1 -1
- package/dist/{chunk-XCP454Q6.js → chunk-F4N67NAF.js} +12 -3
- package/dist/chunk-F4N67NAF.js.map +1 -0
- package/dist/{chunk-OYBJQBLO.js → chunk-G45FBKKV.js} +3 -3
- package/dist/{chunk-OYBJQBLO.js.map → chunk-G45FBKKV.js.map} +1 -1
- package/dist/{chunk-NUQSQRG3.cjs → chunk-HQ4CGVWX.cjs} +27 -27
- package/dist/{chunk-NUQSQRG3.cjs.map → chunk-HQ4CGVWX.cjs.map} +1 -1
- package/dist/{chunk-NV2CWBI2.cjs → chunk-IEY3ZJIT.cjs} +12 -3
- package/dist/chunk-IEY3ZJIT.cjs.map +1 -0
- package/dist/{chunk-K2K2HP35.js → chunk-IH55BEB3.js} +3 -3
- package/dist/{chunk-K2K2HP35.js.map → chunk-IH55BEB3.js.map} +1 -1
- package/dist/{chunk-PEUCQ2YP.cjs → chunk-LJZKEMAH.cjs} +9 -9
- package/dist/{chunk-PEUCQ2YP.cjs.map → chunk-LJZKEMAH.cjs.map} +1 -1
- package/dist/{chunk-673GMFA6.js → chunk-MZNCLXXU.js} +3 -3
- package/dist/{chunk-673GMFA6.js.map → chunk-MZNCLXXU.js.map} +1 -1
- package/dist/{chunk-X5KAO35W.cjs → chunk-R2O72G6Z.cjs} +7 -7
- package/dist/{chunk-X5KAO35W.cjs.map → chunk-R2O72G6Z.cjs.map} +1 -1
- package/dist/{chunk-VPWJCJCX.cjs → chunk-S45EERW3.cjs} +5 -5
- package/dist/{chunk-VPWJCJCX.cjs.map → chunk-S45EERW3.cjs.map} +1 -1
- package/dist/{chunk-SVXWO37F.cjs → chunk-SQ2D7AON.cjs} +21 -21
- package/dist/{chunk-SVXWO37F.cjs.map → chunk-SQ2D7AON.cjs.map} +1 -1
- package/dist/{chunk-P2CA3XGI.js → chunk-SYRLCTDV.js} +3 -3
- package/dist/{chunk-P2CA3XGI.js.map → chunk-SYRLCTDV.js.map} +1 -1
- package/dist/{chunk-7ZDPD5ZX.cjs → chunk-T4L7Q5FA.cjs} +7 -7
- package/dist/{chunk-7ZDPD5ZX.cjs.map → chunk-T4L7Q5FA.cjs.map} +1 -1
- package/dist/{chunk-ZGRCSNPK.js → chunk-TF7YWJHU.js} +3 -3
- package/dist/{chunk-ZGRCSNPK.js.map → chunk-TF7YWJHU.js.map} +1 -1
- package/dist/{chunk-YIV4Y4SK.js → chunk-UBSH27C2.js} +3 -3
- package/dist/{chunk-YIV4Y4SK.js.map → chunk-UBSH27C2.js.map} +1 -1
- package/dist/{chunk-SGFYA22I.cjs → chunk-VYPPQPSZ.cjs} +7 -7
- package/dist/{chunk-SGFYA22I.cjs.map → chunk-VYPPQPSZ.cjs.map} +1 -1
- package/dist/{chunk-5FU7LVZF.cjs → chunk-Z4JR23IB.cjs} +9 -9
- package/dist/{chunk-5FU7LVZF.cjs.map → chunk-Z4JR23IB.cjs.map} +1 -1
- package/dist/{chunk-CXEKSA7I.js → chunk-ZTW4KODY.js} +3 -3
- package/dist/{chunk-CXEKSA7I.js.map → chunk-ZTW4KODY.js.map} +1 -1
- package/dist/components/AlertDialog/index.cjs +4 -4
- package/dist/components/AlertDialog/index.js +3 -3
- package/dist/components/Collapsible/index.cjs +5 -5
- package/dist/components/Collapsible/index.js +2 -2
- package/dist/components/Dropdown/index.cjs +9 -9
- package/dist/components/Dropdown/index.js +2 -2
- package/dist/components/KeyboardShortcutsOverlay/index.cjs +5 -5
- package/dist/components/KeyboardShortcutsOverlay/index.js +3 -3
- package/dist/components/MediaEditor/index.cjs +8 -8
- package/dist/components/MediaEditor/index.js +3 -3
- package/dist/components/Modal/index.cjs +10 -10
- package/dist/components/Modal/index.js +2 -2
- package/dist/components/RichTextEditor/index.cjs +6 -6
- package/dist/components/RichTextEditor/index.js +3 -3
- package/dist/components/SuperChat/index.cjs +43 -21
- package/dist/components/SuperChat/index.cjs.map +1 -1
- package/dist/components/SuperChat/index.js +36 -14
- package/dist/components/SuperChat/index.js.map +1 -1
- package/dist/components/SuperChat/plugins/index.cjs +5 -5
- package/dist/components/SuperChat/plugins/index.js +4 -4
- package/dist/esheet.cjs +6 -6
- package/dist/esheet.js +3 -3
- package/dist/index.cjs +281 -281
- package/dist/index.js +18 -18
- package/dist/motion.cjs +7 -7
- package/dist/motion.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-NV2CWBI2.cjs.map +0 -1
- package/dist/chunk-XCP454Q6.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/AI/ComposerModelSelector.tsx","../src/components/Messaging/AttachmentPicker.tsx","../src/components/Messaging/useMentionAutocomplete.tsx","../src/components/ChatComposer/ChatComposer.tsx","../src/components/ChatComposer/migration-notice.ts"],"names":["React","useAnchoredPosition","value","useClickOutside","useEscapeKey","jsxs","Fragment","cn","jsx","ChevronUp","createPortal","Check","ChevronRight","ChevronLeft","React2","React3","React4","ChatComposer","AlertTriangle","X","Dropdown","Plus","DropdownItem","Paperclip","DropdownSeparator","Mic","Square","Loader2","ArrowUp","Bot"],"mappings":"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","file":"chunk-PEUCQ2YP.cjs","sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { Check, ChevronLeft, ChevronRight, ChevronUp } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\nexport type ProviderModelValue = {\n provider: string;\n model: string;\n};\n\nexport type ProviderModelOption = ProviderModelValue & {\n label?: string;\n providerLabel?: string;\n id?: string;\n};\n\n/** A reasoning-effort level offered alongside the model. */\nexport type ComposerEffortOption = {\n value: string;\n label: string;\n /** Optional secondary line, e.g. a caveat about cost or latency. */\n description?: string;\n};\n\ntype ComposerModelSelectorBaseProps = {\n models: ProviderModelOption[];\n value: ProviderModelValue | null;\n onChange: (value: ProviderModelValue) => void;\n disabled?: boolean;\n /**\n * Trigger appearance: 'default' is the bordered pill; 'ghost' is a quiet\n * text trigger that matches ChatComposer's selector-row controls.\n */\n variant?: 'default' | 'ghost';\n className?: string;\n boundaryRef?: React.RefObject<HTMLElement | null>;\n placeholder?: string;\n anyLabel?: string;\n emptyLabel?: string;\n ariaLabel?: string;\n /**\n * Reasoning-effort levels for the selected model. Omit or pass an empty\n * array to hide the effort row entirely, which is what a model that cannot\n * reason should resolve to — the levels are provider-specific, so the caller\n * owns deciding which apply.\n */\n effortOptions?: ComposerEffortOption[];\n /** Currently selected effort. */\n effort?: string | null;\n /** Effort marked with a \"default\" badge in the list. */\n defaultEffort?: string;\n onEffortChange?: (value: string) => void;\n effortLabel?: string;\n effortHint?: string;\n defaultBadgeLabel?: string;\n backLabel?: string;\n};\n\ntype ControlledProviderFilterProps = {\n providerFilter: string | null;\n onProviderFilterChange: (provider: string | null) => void;\n};\n\ntype UncontrolledProviderFilterProps = {\n providerFilter?: undefined;\n onProviderFilterChange?: (provider: string | null) => void;\n};\n\nexport type ComposerModelSelectorProps = ComposerModelSelectorBaseProps &\n (ControlledProviderFilterProps | UncontrolledProviderFilterProps);\n\nconst MENU_OFFSET_PX = 6;\nconst MENU_MAX_HEIGHT_PX = 320;\n\nfunction optionKey(option: ProviderModelValue) {\n return `${option.provider}\\u0000${option.model}`;\n}\n\nfunction renderedOptionKey(option: ProviderModelOption, index: number) {\n return `${option.id ?? optionKey(option)}\\u0000${index}`;\n}\n\ntype RenderedModelOption = {\n option: ProviderModelOption;\n index: number;\n key: string;\n};\n\nfunction groupByProvider(models: ProviderModelOption[]) {\n const groups = new Map<string, ProviderModelOption[]>();\n\n for (const model of models) {\n const group = groups.get(model.provider);\n if (group) {\n group.push(model);\n } else {\n groups.set(model.provider, [model]);\n }\n }\n\n return Array.from(groups, ([provider, options]) => ({ provider, options }));\n}\n\nfunction getProviderLabel(models: ProviderModelOption[], provider: string) {\n return (\n models.find((model) => model.provider === provider && model.providerLabel)\n ?.providerLabel ?? provider\n );\n}\n\nexport function ComposerModelSelector({\n models,\n value,\n providerFilter,\n onProviderFilterChange,\n onChange,\n disabled = false,\n variant = 'default',\n className,\n boundaryRef,\n placeholder = 'Model',\n anyLabel = 'Any',\n emptyLabel = 'No models',\n ariaLabel = 'Model',\n effortOptions,\n effort = null,\n defaultEffort,\n onEffortChange,\n effortLabel = 'Effort',\n effortHint,\n defaultBadgeLabel = 'Default',\n backLabel = 'Back',\n}: ComposerModelSelectorProps) {\n const [open, setOpen] = React.useState(false);\n // The menu drills down rather than opening a side panel: one anchored\n // surface is far less fragile near the viewport edge, which is exactly where\n // a composer sits.\n const [view, setView] = React.useState<'models' | 'effort'>('models');\n const [effortHighlight, setEffortHighlight] = React.useState(0);\n const [internalProviderFilter, setInternalProviderFilter] = React.useState<\n string | null\n >(null);\n const [highlightedIndex, setHighlightedIndex] = React.useState(0);\n const listRef = React.useRef<HTMLDivElement>(null);\n const effortListRef = React.useRef<HTMLDivElement>(null);\n const menuId = React.useId();\n const {\n anchorRef: triggerRef,\n floatingRef: menuRef,\n style: menuStyle,\n } = useAnchoredPosition<HTMLButtonElement, HTMLDivElement>({\n open,\n placement: 'top-start',\n offset: MENU_OFFSET_PX,\n matchMinWidth: true,\n maxHeight: MENU_MAX_HEIGHT_PX,\n allowFlip: false,\n boundaryRef,\n });\n\n const activeProviderFilter =\n providerFilter === undefined ? internalProviderFilter : providerFilter;\n const selectedKey = value ? optionKey(value) : null;\n const selectedOption = models.find(\n (model) => optionKey(model) === selectedKey\n );\n const providers = React.useMemo(\n () => Array.from(new Set(models.map((model) => model.provider))),\n [models]\n );\n const providerLabels = React.useMemo(\n () =>\n new Map(\n providers.map((provider) => [\n provider,\n getProviderLabel(models, provider),\n ])\n ),\n [models, providers]\n );\n const filteredModels = React.useMemo(\n () =>\n activeProviderFilter === null\n ? models\n : models.filter((model) => model.provider === activeProviderFilter),\n [activeProviderFilter, models]\n );\n const groupedModels = React.useMemo(\n () => groupByProvider(filteredModels),\n [filteredModels]\n );\n const groupedRenderedModels = React.useMemo(() => {\n let index = 0;\n return groupedModels.map((group) => ({\n provider: group.provider,\n options: group.options.map((option) => {\n const rendered: RenderedModelOption = {\n option,\n index,\n key: renderedOptionKey(option, index),\n };\n index += 1;\n return rendered;\n }),\n }));\n }, [groupedModels]);\n const renderedModels = React.useMemo(\n () => groupedRenderedModels.flatMap((group) => group.options),\n [groupedRenderedModels]\n );\n const getOptionId = React.useCallback(\n (index: number) => `${menuId}-option-${index}`,\n [menuId]\n );\n // The two views are mutually exclusive, so both listboxes carry `menuId` and\n // the trigger's `aria-controls` stays pointed at whichever one is rendered.\n // Option ids are namespaced per view so they cannot collide.\n const getEffortOptionId = React.useCallback(\n (index: number) => `${menuId}-effort-option-${index}`,\n [menuId]\n );\n const activeOptionId =\n open && renderedModels[highlightedIndex]\n ? getOptionId(highlightedIndex)\n : undefined;\n const selectedRenderedIndex = React.useMemo(\n () =>\n selectedKey\n ? renderedModels.findIndex(\n (renderedModel) => optionKey(renderedModel.option) === selectedKey\n )\n : -1,\n [renderedModels, selectedKey]\n );\n\n const setProvider = React.useCallback(\n (provider: string | null) => {\n if (providerFilter === undefined) {\n setInternalProviderFilter(provider);\n }\n onProviderFilterChange?.(provider);\n },\n [onProviderFilterChange, providerFilter]\n );\n\n const close = React.useCallback(\n (restoreFocus = true) => {\n setOpen(false);\n if (restoreFocus) {\n triggerRef.current?.focus({ preventScroll: true });\n }\n },\n [triggerRef]\n );\n\n const selectModel = React.useCallback(\n (model: ProviderModelOption) => {\n onChange({ provider: model.provider, model: model.model });\n close();\n },\n [close, onChange]\n );\n\n const efforts = React.useMemo(() => effortOptions ?? [], [effortOptions]);\n const activeEffortOptionId =\n open && efforts[effortHighlight]\n ? getEffortOptionId(effortHighlight)\n : undefined;\n const selectedEffortOption = efforts.find(\n (option) => option.value === effort\n );\n\n const selectEffort = React.useCallback(\n (value: string) => {\n onEffortChange?.(value);\n close();\n },\n [close, onEffortChange]\n );\n\n const handleEffortKeyDown = (event: React.KeyboardEvent) => {\n if (efforts.length === 0) return;\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setEffortHighlight((current) => (current + 1) % efforts.length);\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setEffortHighlight(\n (current) => (current - 1 + efforts.length) % efforts.length\n );\n }\n if (event.key === 'Home') {\n event.preventDefault();\n setEffortHighlight(0);\n }\n if (event.key === 'End') {\n event.preventDefault();\n setEffortHighlight(efforts.length - 1);\n }\n // Left/Backspace mirrors the drill-down affordance so keyboard users can\n // get back to the model list without reaching for the mouse.\n if (event.key === 'ArrowLeft' || event.key === 'Backspace') {\n event.preventDefault();\n setView('models');\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const highlighted = efforts[effortHighlight];\n if (highlighted) selectEffort(highlighted.value);\n }\n };\n\n const outsideRefs = React.useMemo(\n () => [triggerRef, menuRef],\n [triggerRef, menuRef]\n );\n\n useClickOutside(outsideRefs, () => close(false), open);\n\n useEscapeKey(close, open);\n\n React.useEffect(() => {\n if (!open) return;\n setHighlightedIndex(selectedRenderedIndex >= 0 ? selectedRenderedIndex : 0);\n }, [activeProviderFilter, open, selectedRenderedIndex]);\n\n // Every open starts on the model list. Deliberately keyed on `open` alone:\n // callers commonly derive `effortOptions` from the selected model, so the\n // array identity changes on every parent render, and folding that into this\n // effect would drop the user back to the model list mid-interaction.\n React.useEffect(() => {\n if (!open) return;\n setView('models');\n }, [open]);\n\n // The effort list starts on the current value so Enter is a no-op rather\n // than a surprise change.\n React.useEffect(() => {\n if (!open) return;\n const current = efforts.findIndex((option) => option.value === effort);\n setEffortHighlight(current >= 0 ? current : 0);\n }, [effort, efforts, open]);\n\n React.useEffect(() => {\n if (!open) return;\n setHighlightedIndex((current) =>\n Math.min(current, Math.max(renderedModels.length - 1, 0))\n );\n }, [open, renderedModels.length]);\n\n React.useEffect(() => {\n if (!open) return;\n requestAnimationFrame(() => {\n const target =\n view === 'effort' ? effortListRef.current : listRef.current;\n target?.focus({ preventScroll: true });\n });\n }, [open, view]);\n\n const handleTriggerKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n const handleMenuKeyDown = (event: React.KeyboardEvent) => {\n if (renderedModels.length === 0) return;\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlightedIndex((current) => (current + 1) % renderedModels.length);\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlightedIndex(\n (current) =>\n (current - 1 + renderedModels.length) % renderedModels.length\n );\n }\n if (event.key === 'Home') {\n event.preventDefault();\n setHighlightedIndex(0);\n }\n if (event.key === 'End') {\n event.preventDefault();\n setHighlightedIndex(renderedModels.length - 1);\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const highlightedModel = renderedModels[highlightedIndex]?.option;\n if (highlightedModel) {\n selectModel(highlightedModel);\n }\n }\n };\n\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? menuId : undefined}\n onClick={() => setOpen((current) => !current)}\n onKeyDown={handleTriggerKeyDown}\n data-slot=\"composer-model-selector-trigger\"\n className={cn(\n variant === 'ghost'\n ? [\n 'inline-flex max-w-full min-w-0 items-center gap-1 rounded-md px-2 py-1 text-xs',\n 'text-neutral-600 dark:text-neutral-400',\n 'transition-colors duration-150',\n 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-700 dark:hover:text-white',\n 'focus-visible:ring-primary-500 focus-visible:ring-2 focus-visible:outline-none',\n 'disabled:pointer-events-none disabled:opacity-40',\n ]\n : [\n 'inline-flex h-8 max-w-full items-center gap-1.5 rounded-full border px-2.5 text-sm font-medium',\n 'border-border bg-background text-foreground shadow-sm',\n 'hover:bg-muted/50',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n ],\n className\n )}\n >\n <span className=\"min-w-0 truncate\">\n {selectedOption?.label ?? selectedOption?.model ?? placeholder}\n </span>\n {selectedEffortOption && (\n <span\n data-slot=\"composer-model-selector-trigger-effort\"\n className=\"text-muted-foreground min-w-0 truncate font-normal\"\n >\n {selectedEffortOption.label}\n </span>\n )}\n <ChevronUp\n aria-hidden=\"true\"\n className={cn(\n 'shrink-0',\n variant === 'ghost' ? 'h-3 w-3' : 'h-3.5 w-3.5'\n )}\n />\n </button>\n\n {open &&\n createPortal(\n <div\n ref={menuRef}\n style={menuStyle}\n data-slot=\"composer-model-selector-menu\"\n className={cn(\n 'border-border bg-card text-card-foreground flex w-80 max-w-full flex-col rounded-lg border shadow-lg',\n 'animate-in fade-in overflow-hidden duration-100'\n )}\n >\n {view === 'models' && (\n <>\n <div\n data-slot=\"composer-model-selector-provider-filter\"\n className=\"border-border flex min-h-9 items-center gap-1 overflow-x-auto overflow-y-hidden border-b p-2\"\n >\n {[null, ...providers].map((provider) => {\n const selected = activeProviderFilter === provider;\n return (\n <button\n key={provider ?? 'all-providers'}\n type=\"button\"\n aria-pressed={selected}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setProvider(provider)}\n className={cn(\n 'inline-flex h-6 shrink-0 items-center justify-center rounded-full px-2.5 text-xs font-medium whitespace-nowrap transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n selected\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n >\n {provider === null\n ? anyLabel\n : (providerLabels.get(provider) ?? provider)}\n </button>\n );\n })}\n </div>\n\n <div\n ref={listRef}\n id={menuId}\n role=\"listbox\"\n aria-label={ariaLabel}\n aria-activedescendant={activeOptionId}\n tabIndex={-1}\n onKeyDown={handleMenuKeyDown}\n className=\"min-h-0 flex-1 overflow-y-auto p-1\"\n >\n {groupedModels.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-4 text-center text-sm\">\n {emptyLabel}\n </div>\n ) : (\n groupedRenderedModels.map((group) => (\n <div\n key={group.provider}\n role=\"group\"\n aria-label={\n providerLabels.get(group.provider) ?? group.provider\n }\n >\n <div className=\"text-muted-foreground px-3 py-1.5 text-xs font-semibold uppercase\">\n {providerLabels.get(group.provider) ?? group.provider}\n </div>\n {group.options.map((renderedModel) => {\n const { index, key, option: model } = renderedModel;\n\n const selected = optionKey(model) === selectedKey;\n const highlighted = index === highlightedIndex;\n\n return (\n <button\n key={key}\n id={getOptionId(index)}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => selectModel(model)}\n onMouseEnter={() => setHighlightedIndex(index)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm',\n 'focus-visible:ring-ring transition-colors focus-visible:ring-2 focus-visible:outline-none',\n highlighted && 'bg-muted',\n selected && 'bg-primary/10 text-primary'\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {model.label ?? model.model}\n </span>\n {selected && (\n <Check\n aria-hidden=\"true\"\n className=\"text-primary h-4 w-4 shrink-0\"\n />\n )}\n </button>\n );\n })}\n </div>\n ))\n )}\n </div>\n\n {efforts.length > 0 && (\n <div className=\"border-border border-t p-1\">\n <button\n type=\"button\"\n data-slot=\"composer-model-selector-effort-row\"\n aria-haspopup=\"listbox\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setView('effort')}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm',\n 'hover:bg-muted transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none'\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {effortLabel}\n </span>\n {selectedEffortOption && (\n <span className=\"text-muted-foreground min-w-0 truncate\">\n {selectedEffortOption.label}\n </span>\n )}\n <ChevronRight\n aria-hidden=\"true\"\n className=\"text-muted-foreground h-4 w-4 shrink-0 rtl:-scale-x-100\"\n />\n </button>\n </div>\n )}\n </>\n )}\n\n {view === 'effort' && (\n <>\n <div className=\"border-border flex items-center gap-1 border-b p-2\">\n <button\n type=\"button\"\n data-slot=\"composer-model-selector-effort-back\"\n aria-label={backLabel}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setView('models')}\n className={cn(\n 'inline-flex h-6 shrink-0 items-center gap-1 rounded-full px-2 text-xs font-medium',\n 'text-muted-foreground hover:bg-muted hover:text-foreground transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none'\n )}\n >\n <ChevronLeft\n aria-hidden=\"true\"\n className=\"h-3.5 w-3.5 rtl:-scale-x-100\"\n />\n {effortLabel}\n </button>\n </div>\n\n {effortHint && (\n <p className=\"text-muted-foreground px-3 pt-2 text-xs\">\n {effortHint}\n </p>\n )}\n\n <div\n ref={effortListRef}\n id={menuId}\n role=\"listbox\"\n aria-label={effortLabel}\n aria-activedescendant={activeEffortOptionId}\n tabIndex={-1}\n onKeyDown={handleEffortKeyDown}\n className=\"min-h-0 flex-1 overflow-y-auto p-1\"\n >\n {efforts.map((option, index) => {\n const selected = option.value === effort;\n const highlighted = index === effortHighlight;\n\n return (\n <button\n key={option.value}\n id={getEffortOptionId(index)}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => selectEffort(option.value)}\n onMouseEnter={() => setEffortHighlight(index)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm',\n 'focus-visible:ring-ring transition-colors focus-visible:ring-2 focus-visible:outline-none',\n highlighted && 'bg-muted',\n selected && 'bg-primary/10 text-primary'\n )}\n >\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{option.label}</span>\n {option.description && (\n <span className=\"text-muted-foreground block truncate text-xs\">\n {option.description}\n </span>\n )}\n </span>\n {option.value === defaultEffort && (\n <span className=\"bg-muted text-muted-foreground shrink-0 rounded px-1.5 py-0.5 text-xs\">\n {defaultBadgeLabel}\n </span>\n )}\n {selected && (\n <Check\n aria-hidden=\"true\"\n className=\"text-primary h-4 w-4 shrink-0\"\n />\n )}\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>,\n document.body\n )}\n </>\n );\n}\n\nComposerModelSelector.displayName = 'ComposerModelSelector';\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport type { AttachmentType, AttachmentState } from './types';\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get file type from MIME type.\n */\nfunction getFileType(mimeType: string): AttachmentType {\n if (mimeType.startsWith('image/')) return 'image';\n if (mimeType.startsWith('video/')) return 'video';\n if (mimeType.startsWith('audio/')) return 'audio';\n if (\n mimeType.includes('pdf') ||\n mimeType.includes('document') ||\n mimeType.includes('text')\n ) {\n return 'document';\n }\n return 'file';\n}\n\n/**\n * Format file size in human-readable format.\n */\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Validate file type and size.\n */\nfunction validateFile(\n file: File,\n acceptedTypes?: string[],\n maxSize?: number\n): { valid: boolean; error?: string } {\n if (acceptedTypes && acceptedTypes.length > 0) {\n const isAccepted = acceptedTypes.some((type) => {\n if (type.startsWith('.')) {\n return file.name.toLowerCase().endsWith(type.toLowerCase());\n }\n if (type.endsWith('/*')) {\n return file.type.startsWith(type.replace('/*', '/'));\n }\n return file.type === type;\n });\n if (!isAccepted) {\n return { valid: false, error: 'File type not supported' };\n }\n }\n\n if (maxSize && file.size > maxSize) {\n return {\n valid: false,\n error: `File too large (max ${formatFileSize(maxSize)})`,\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Generate a unique ID for attachments.\n */\nfunction generateAttachmentId(): string {\n return `attachment-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * MessageComposer's historical attachment validation defaults. Shared so\n * hosts that mount `ChatComposer` (which leaves file types and size\n * unrestricted) can apply the same limits — `MessageThread` does, and\n * `AIChat` does for legacy `composerProps` consumers.\n */\nconst DEFAULT_ACCEPTED_FILE_TYPES = [\n 'image/*',\n 'video/*',\n '.pdf',\n '.doc',\n '.docx',\n];\nconst DEFAULT_MAX_FILE_SIZE = 25 * 1024 * 1024;\n\n// ============================================================================\n// Attachment Preview Item Component\n// ============================================================================\n\nexport interface AttachmentPreviewItemProps {\n /** The attachment to preview */\n attachment: {\n id: string;\n file: File;\n previewUrl?: string;\n type: AttachmentType;\n state: AttachmentState;\n progress?: number;\n error?: string;\n };\n /** Called when remove is clicked */\n onRemove: () => void;\n /** Called when retry is clicked */\n onRetry?: () => void;\n /** Disables the remove/retry actions. */\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Preview item for a pending attachment.\n */\nfunction AttachmentPreviewItem({\n attachment,\n onRemove,\n onRetry,\n disabled = false,\n className,\n}: AttachmentPreviewItemProps) {\n const { file, previewUrl, type, state, progress } = attachment;\n const isImage = type === 'image';\n const isVideo = type === 'video';\n const isUploading = state === 'uploading';\n const isFailed = state === 'failed';\n\n return (\n <div\n className={cn(\n 'group relative overflow-hidden rounded-lg',\n 'bg-neutral-100 dark:bg-neutral-800',\n 'border border-neutral-200 dark:border-neutral-700',\n isFailed && 'border-red-500',\n className\n )}\n >\n {/* Image/Video preview */}\n {(isImage || isVideo) && previewUrl ? (\n <div className=\"relative h-20 w-20\">\n {isVideo ? (\n <video\n src={previewUrl}\n aria-label={file.name}\n muted\n playsInline\n preload=\"metadata\"\n className={cn(\n 'h-full w-full object-cover',\n (isUploading || isFailed) && 'opacity-50'\n )}\n />\n ) : (\n <img\n src={previewUrl}\n alt={file.name}\n className={cn(\n 'h-full w-full object-cover',\n (isUploading || isFailed) && 'opacity-50'\n )}\n />\n )}\n {isVideo && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <svg\n aria-hidden=\"true\"\n className=\"h-6 w-6 text-white drop-shadow\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </div>\n )}\n </div>\n ) : (\n /* File preview */\n <div className=\"flex h-20 w-20 flex-col items-center justify-center p-2\">\n <svg\n aria-hidden=\"true\"\n className=\"h-8 w-8 text-neutral-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <span className=\"mt-1 max-w-full truncate px-1 text-xs text-neutral-600 dark:text-neutral-400\">\n {file.name.split('.').pop()?.toUpperCase()}\n </span>\n </div>\n )}\n\n {/* Upload progress overlay */}\n {isUploading && progress !== undefined && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50\">\n <div className=\"text-center text-white\">\n <svg\n aria-hidden=\"true\"\n className=\"mx-auto h-6 w-6 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n <span className=\"mt-1 text-xs\">{progress}%</span>\n </div>\n </div>\n )}\n\n {/* Error overlay */}\n {isFailed && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50\">\n <div className=\"text-center\">\n <svg\n aria-hidden=\"true\"\n className=\"mx-auto h-6 w-6 text-red-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n disabled={disabled}\n className=\"mt-1 text-xs text-white underline hover:no-underline disabled:no-underline disabled:opacity-50\"\n >\n Retry\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Remove button */}\n <button\n type=\"button\"\n onClick={onRemove}\n disabled={disabled}\n className={cn(\n 'absolute -end-1 -top-1 z-10',\n 'rounded-full p-1',\n 'bg-neutral-900 text-white',\n 'opacity-0 group-hover:opacity-100',\n 'focus:ring-primary-500 focus:opacity-100 focus:ring-2 focus:outline-none',\n 'transition-opacity',\n 'disabled:cursor-not-allowed disabled:group-hover:opacity-0'\n )}\n aria-label={`Remove ${file.name}`}\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n\n {/* File name tooltip on hover */}\n <div\n className={cn(\n 'absolute start-0 end-0 bottom-0',\n 'bg-black/70 px-1 py-0.5',\n 'opacity-0 group-hover:opacity-100',\n 'transition-opacity'\n )}\n >\n <p className=\"truncate text-xs text-white\">{file.name}</p>\n </div>\n </div>\n );\n}\n\nAttachmentPreviewItem.displayName = 'AttachmentPreviewItem';\n\n// ============================================================================\n// Attachment Picker Component\n// ============================================================================\n\nexport interface AttachmentPickerProps {\n /** Called when files are selected */\n onFilesSelected: (files: File[]) => void;\n /** Accepted file types (MIME types or extensions) */\n acceptedTypes?: string[];\n /** Maximum file size in bytes */\n maxFileSize?: number;\n /** Maximum number of files */\n maxFiles?: number;\n /** Whether multiple files can be selected */\n multiple?: boolean;\n /** Whether the picker is disabled */\n disabled?: boolean;\n /** Called when an error occurs */\n onError?: (error: string) => void;\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * A button/trigger component for selecting attachments.\n */\nconst AttachmentPicker = React.forwardRef<\n HTMLInputElement,\n AttachmentPickerProps\n>(\n (\n {\n onFilesSelected,\n acceptedTypes = DEFAULT_ACCEPTED_FILE_TYPES,\n maxFileSize = DEFAULT_MAX_FILE_SIZE,\n maxFiles = 10,\n multiple = true,\n disabled = false,\n onError,\n className,\n children,\n },\n ref\n ) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Combine refs\n React.useImperativeHandle(ref, () => inputRef.current!);\n\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files || []);\n if (files.length === 0) return;\n\n // Validate files\n const validFiles: File[] = [];\n for (const file of files.slice(0, maxFiles)) {\n const validation = validateFile(file, acceptedTypes, maxFileSize);\n if (validation.valid) {\n validFiles.push(file);\n } else if (onError) {\n onError(`${file.name}: ${validation.error}`);\n }\n }\n\n if (files.length > maxFiles && onError) {\n onError(`Maximum ${maxFiles} files allowed`);\n }\n\n if (validFiles.length > 0) {\n onFilesSelected(validFiles);\n }\n\n // Reset input\n event.target.value = '';\n };\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n accept={acceptedTypes.join(',')}\n multiple={multiple}\n onChange={handleChange}\n disabled={disabled}\n className=\"sr-only\"\n aria-label=\"Select files to attach\"\n />\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n data-slot=\"attachment-picker-button\"\n className={cn(\n 'inline-flex items-center justify-center',\n 'rounded-full p-2',\n 'text-neutral-500 hover:text-neutral-700',\n 'dark:text-neutral-400 dark:hover:text-neutral-200',\n 'hover:bg-neutral-100 dark:hover:bg-neutral-800',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'transition-colors',\n className\n )}\n aria-label=\"Attach files\"\n >\n {children || (\n <svg\n aria-hidden=\"true\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15.172 7l-6.586 6.586a2 2 0 102.828 2.828l6.414-6.586a4 4 0 00-5.656-5.656l-6.415 6.585a6 6 0 108.486 8.486L20.5 13\"\n />\n </svg>\n )}\n </button>\n </>\n );\n }\n);\n\nAttachmentPicker.displayName = 'AttachmentPicker';\n\n// ============================================================================\n// Drag Drop Zone Component\n// ============================================================================\n\nexport interface DragDropZoneProps {\n /** Called when files are dropped */\n onFilesDropped: (files: File[]) => void;\n /** Accepted file types */\n acceptedTypes?: string[];\n /** Maximum file size */\n maxFileSize?: number;\n /** Maximum number of files */\n maxFiles?: number;\n /** Whether the zone is disabled */\n disabled?: boolean;\n /** Called when an error occurs */\n onError?: (error: string) => void;\n /** Overlay text shown while dragging files over the zone. @default 'Drop files here' */\n overlayLabel?: string;\n /** Children to render inside the zone */\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * A wrapper component that accepts drag-and-drop files.\n */\nfunction DragDropZone({\n onFilesDropped,\n acceptedTypes,\n maxFileSize,\n maxFiles = 10,\n disabled = false,\n onError,\n overlayLabel = 'Drop files here',\n children,\n className,\n}: DragDropZoneProps) {\n const [isDragging, setIsDragging] = React.useState(false);\n const dragCounterRef = React.useRef(0);\n\n const handleDragEnter = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (disabled) return;\n\n dragCounterRef.current++;\n if (event.dataTransfer.items && event.dataTransfer.items.length > 0) {\n setIsDragging(true);\n }\n };\n\n const handleDragLeave = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (disabled) return;\n\n dragCounterRef.current--;\n if (dragCounterRef.current === 0) {\n setIsDragging(false);\n }\n };\n\n const handleDragOver = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n const handleDrop = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (disabled) return;\n\n setIsDragging(false);\n dragCounterRef.current = 0;\n\n const files = Array.from(event.dataTransfer.files);\n if (files.length === 0) return;\n\n // Validate files\n const validFiles: File[] = [];\n for (const file of files.slice(0, maxFiles)) {\n const validation = validateFile(file, acceptedTypes, maxFileSize);\n if (validation.valid) {\n validFiles.push(file);\n } else if (onError) {\n onError(`${file.name}: ${validation.error}`);\n }\n }\n\n if (files.length > maxFiles && onError) {\n onError(`Maximum ${maxFiles} files allowed`);\n }\n\n if (validFiles.length > 0) {\n onFilesDropped(validFiles);\n }\n };\n\n return (\n <div\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n className={cn('relative', className)}\n >\n {children}\n\n {/* Drag overlay */}\n {isDragging && (\n <div\n className={cn(\n 'absolute inset-0 z-50',\n 'flex items-center justify-center',\n 'bg-primary-50/90 dark:bg-primary-900/90',\n 'border-primary-500 border-2 border-dashed',\n 'rounded-lg'\n )}\n >\n <div className=\"text-center\">\n <svg\n aria-hidden=\"true\"\n className=\"text-primary-800 mx-auto h-12 w-12\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\"\n />\n </svg>\n <p className=\"text-primary-700 dark:text-primary-300 mt-2 text-sm font-medium\">\n {overlayLabel}\n </p>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nDragDropZone.displayName = 'DragDropZone';\n\n// ============================================================================\n// Camera Button Component (Mobile)\n// ============================================================================\n\nexport interface CameraButtonProps {\n /** Called when a photo is captured */\n onCapture: (file: File) => void;\n /** Whether to use front camera */\n useFrontCamera?: boolean;\n /** Whether the button is disabled */\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Button to capture photos from camera (mobile).\n */\nfunction CameraButton({\n onCapture,\n useFrontCamera = false,\n disabled = false,\n className,\n}: CameraButtonProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (file) {\n onCapture(file);\n }\n event.target.value = '';\n };\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n capture={useFrontCamera ? 'user' : 'environment'}\n onChange={handleChange}\n disabled={disabled}\n className=\"sr-only\"\n aria-label=\"Take a photo\"\n />\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'inline-flex items-center justify-center',\n 'rounded-full p-2',\n 'text-neutral-500 hover:text-neutral-700',\n 'dark:text-neutral-400 dark:hover:text-neutral-200',\n 'hover:bg-neutral-100 dark:hover:bg-neutral-800',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'transition-colors',\n className\n )}\n aria-label=\"Take a photo\"\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 13a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n </button>\n </>\n );\n}\n\nCameraButton.displayName = 'CameraButton';\n\nexport {\n AttachmentPicker,\n AttachmentPreviewItem,\n DragDropZone,\n CameraButton,\n DEFAULT_ACCEPTED_FILE_TYPES,\n DEFAULT_MAX_FILE_SIZE,\n getFileType,\n formatFileSize,\n validateFile,\n generateAttachmentId,\n};\n","import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\n\n// ============================================================================\n// @mention autocomplete — consumed by ChatComposer (and, before its\n// retirement in 0.10.0, MessageComposer — it was extracted verbatim from it:\n// query detection, keyboard navigation, insertion, ARIA combobox wiring,\n// listbox rendering). Do not change semantics here without running\n// ChatComposer's test suite plus the SuperChat/AIChat consumer suites.\n// ============================================================================\n\n/**\n * A candidate for the composer's `@mention` autocomplete. Generic so any\n * surface (multi-party chat, agent picker, …) can supply its own list.\n */\nexport interface MentionOption {\n /** Stable unique key for the suggestion list. */\n id: string;\n /** Display name shown in the suggestion list. */\n label: string;\n /** Text inserted after `@` on selection. Defaults to the first word of `label`. */\n value?: string;\n /** Optional secondary text shown after the label. */\n description?: string;\n /** Optional leading node (e.g. an avatar). */\n icon?: React.ReactNode;\n /** Optional trailing meta text (e.g. a kind tag). */\n meta?: string;\n}\n\n/**\n * Find the active `@query` immediately before the caret, if any. The `@` must\n * start the string or follow whitespace, and the token must contain no spaces\n * or further `@`.\n */\nexport function activeMentionQuery(\n value: string,\n caret: number\n): { query: string; start: number } | null {\n const upToCaret = value.slice(0, caret);\n const match = /(^|\\s)@([^\\s@]*)$/.exec(upToCaret);\n if (!match) return null;\n const query = match[2];\n return { query, start: caret - query.length - 1 };\n}\n\nexport interface UseMentionAutocompleteOptions {\n /** Mention candidates. Mentions are disabled when undefined or empty. */\n options?: MentionOption[];\n /** Current composer text. */\n value: string;\n /** Write the composer text (host handles controlled/uncontrolled). */\n setValue: (next: string) => void;\n /** The composer textarea, for caret restore after insertion. */\n textareaRef: React.RefObject<HTMLTextAreaElement | null>;\n}\n\nexport interface MentionAutocomplete {\n /** Whether mention support is active (options provided and non-empty). */\n enabled: boolean;\n /** Whether the suggestion menu is currently open. */\n menuOpen: boolean;\n /** Suggestions matching the active query. */\n suggestions: MentionOption[];\n /** Clamped highlight index (`-1` while the menu is closed). */\n highlight: number;\n /** id of the listbox element. */\n listId: string;\n /** id for the option at `index`. */\n optionId: (index: number) => string;\n /** Ref for the element the menu anchors to (the input wrapper). */\n anchorRef: React.RefObject<HTMLDivElement | null>;\n /** Ref for the floating listbox. */\n floatingRef: React.RefObject<HTMLUListElement | null>;\n /** Fixed-position style for the floating listbox. */\n menuStyle: React.CSSProperties;\n /** Re-derive the active query from the value and caret position. */\n sync: (value: string, caret: number) => void;\n /** Insert the given option at the active query and restore the caret. */\n insert: (option: MentionOption) => void;\n /** Move the highlight (mouse hover). */\n setHighlight: (index: number) => void;\n /**\n * Menu keyboard navigation. Returns `true` when the event was consumed\n * (callers must skip their own key handling, e.g. Enter-to-send).\n */\n handleKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => boolean;\n /** ARIA combobox attributes to spread onto the textarea. */\n inputProps: React.TextareaHTMLAttributes<HTMLTextAreaElement>;\n}\n\n/**\n * State machine for `@mention` autocomplete in a composer textarea. Pair with\n * {@link MentionMenu} for the floating listbox.\n */\nexport function useMentionAutocomplete({\n options,\n value,\n setValue,\n textareaRef,\n}: UseMentionAutocompleteOptions): MentionAutocomplete {\n const enabled = !!options && options.length > 0;\n const [mention, setMention] = React.useState<{\n query: string;\n start: number;\n } | null>(null);\n const [highlight, setHighlight] = React.useState(0);\n const listId = React.useId();\n const optionId = React.useCallback(\n (index: number) => `${listId}-option-${index}`,\n [listId]\n );\n\n const suggestions = React.useMemo(() => {\n if (!mention || !options) return [];\n const q = mention.query.toLowerCase();\n return options.filter((o) => o.label.toLowerCase().includes(q));\n }, [mention, options]);\n\n const menuOpen = enabled && mention !== null && suggestions.length > 0;\n\n // Portal + fixed positioning so the mention menu escapes overflow-hidden\n // ancestors.\n const {\n anchorRef,\n floatingRef,\n style: menuStyle,\n } = useAnchoredPosition<HTMLDivElement, HTMLUListElement>({\n open: menuOpen,\n placement: 'top-start',\n maxHeight: 224,\n });\n\n // Clamp the highlight to the current suggestion range so the active option\n // never points at a stale/out-of-range index (the list can shrink while the\n // menu is open as the query narrows). The same clamped index drives\n // `aria-activedescendant`, `aria-selected`, and the visual highlight so they\n // can never disagree.\n const clampedHighlight = menuOpen\n ? Math.min(highlight, suggestions.length - 1)\n : -1;\n const activeOptionId = menuOpen ? optionId(clampedHighlight) : undefined;\n\n const sync = React.useCallback(\n (nextValue: string, caret: number) => {\n if (!enabled) return;\n setMention(activeMentionQuery(nextValue, caret));\n setHighlight(0);\n },\n [enabled]\n );\n\n const insert = (option: MentionOption) => {\n if (!mention) return;\n const insertValue = option.value ?? option.label.split(' ')[0];\n const before = value.slice(0, mention.start);\n const after = value.slice(mention.start + 1 + mention.query.length);\n const insertText = `@${insertValue} `;\n setValue(before + insertText + after);\n setMention(null);\n // Restore caret just after the inserted mention.\n const caret = before.length + insertText.length;\n requestAnimationFrame(() => {\n const el = textareaRef.current;\n if (el) {\n el.focus();\n el.setSelectionRange(caret, caret);\n }\n });\n };\n\n const handleKeyDown = (\n event: React.KeyboardEvent<HTMLTextAreaElement>\n ): boolean => {\n if (!menuOpen) return false;\n // All keyboard branches index with the clamped highlight so keyboard\n // behavior always agrees with the visible/ARIA selection, even when the\n // list shrank while the menu was open (e.g. the host swapped `options`\n // asynchronously).\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlight(\n (h) => (Math.min(h, suggestions.length - 1) + 1) % suggestions.length\n );\n return true;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlight(\n (h) =>\n (Math.min(h, suggestions.length - 1) - 1 + suggestions.length) %\n suggestions.length\n );\n return true;\n }\n if (event.key === 'Enter' || event.key === 'Tab') {\n event.preventDefault();\n const chosen = suggestions[clampedHighlight];\n if (chosen) insert(chosen);\n return true;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n setMention(null);\n return true;\n }\n return false;\n };\n\n const inputProps: React.TextareaHTMLAttributes<HTMLTextAreaElement> = enabled\n ? {\n 'aria-controls': menuOpen ? listId : undefined,\n 'aria-activedescendant': activeOptionId,\n 'aria-autocomplete': 'list' as const,\n }\n : {};\n\n return {\n enabled,\n menuOpen,\n suggestions,\n highlight: clampedHighlight,\n listId,\n optionId,\n anchorRef,\n floatingRef,\n menuStyle,\n sync,\n insert,\n setHighlight,\n handleKeyDown,\n inputProps,\n };\n}\n\nexport interface MentionMenuProps {\n /** State returned by {@link useMentionAutocomplete}. */\n mention: MentionAutocomplete;\n /** Accessible label for the listbox. @default 'Mention' */\n label?: string;\n /** `data-slot` for the listbox. @default 'composer-mention-list' */\n dataSlot?: string;\n}\n\n/**\n * The floating `@mention` suggestion listbox. Rendered in a portal so it\n * escapes overflow-hidden ancestors; renders nothing while closed.\n */\nexport function MentionMenu({\n mention,\n label = 'Mention',\n dataSlot = 'composer-mention-list',\n}: MentionMenuProps) {\n if (!mention.menuOpen) return null;\n return createPortal(\n <ul\n ref={mention.floatingRef}\n style={mention.menuStyle}\n id={mention.listId}\n role=\"listbox\"\n aria-label={label}\n data-slot={dataSlot}\n className=\"w-64 overflow-y-auto rounded-lg border border-neutral-200 bg-white py-1 shadow-lg dark:border-neutral-700 dark:bg-neutral-800\"\n >\n {mention.suggestions.map((option, i) => (\n <li key={option.id}>\n <button\n type=\"button\"\n id={mention.optionId(i)}\n role=\"option\"\n aria-selected={i === mention.highlight}\n // onMouseDown (not onClick) so the textarea keeps focus.\n onMouseDown={(e) => {\n e.preventDefault();\n mention.insert(option);\n }}\n onMouseEnter={() => mention.setHighlight(i)}\n className={cn(\n 'flex w-full items-center gap-2 px-3 py-1.5 text-start text-sm',\n i === mention.highlight\n ? 'bg-primary-100 text-primary-900 dark:bg-primary-900/40 dark:text-primary-100'\n : 'text-neutral-700 dark:text-neutral-200'\n )}\n >\n {option.icon}\n <span className=\"min-w-0 flex-1 truncate\">\n <span className=\"font-medium\">{option.label}</span>\n {option.description && (\n <span className=\"ms-1 text-xs text-neutral-400\">\n {option.description}\n </span>\n )}\n </span>\n {option.meta && (\n <span className=\"text-[10px] text-neutral-400\">\n {option.meta}\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>,\n document.body\n );\n}\n\nMentionMenu.displayName = 'MentionMenu';\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Dropdown, DropdownItem, DropdownSeparator } from '../Dropdown';\nimport {\n ComposerModelSelector,\n type ComposerModelSelectorProps,\n} from '../AI/ComposerModelSelector';\nimport {\n AttachmentPreviewItem,\n DragDropZone,\n getFileType,\n validateFile,\n generateAttachmentId,\n} from '../Messaging/AttachmentPicker';\nimport {\n MentionMenu,\n useMentionAutocomplete,\n type MentionOption,\n} from '../Messaging/useMentionAutocomplete';\nimport type { AttachmentType, NewMessage } from '../Messaging/types';\nimport {\n AlertTriangleIcon,\n ArrowUpIcon,\n BotIcon,\n CheckIcon,\n ChevronUpIcon,\n LoaderIcon,\n MicIcon,\n PaperclipIcon,\n PlusIcon,\n StopIcon,\n XIcon,\n} from '../Icons';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** A file staged for sending, with preview metadata. */\ninterface StagedAttachment {\n id: string;\n file: File;\n previewUrl?: string;\n type: AttachmentType;\n}\n\n/** An entry in the composer's `+` menu. */\nexport interface ChatComposerMenuItem {\n /** Stable id (used as the React key). */\n id: string;\n /** Display label. */\n label: React.ReactNode;\n /** Optional leading icon. */\n icon?: React.ReactNode;\n /** Whether the item is disabled. */\n disabled?: boolean;\n /**\n * Toggle state. When set (true or false) the item renders as a\n * `menuitemcheckbox` with `aria-checked` and a leading checkbox.\n */\n checked?: boolean;\n /** Danger styling for destructive actions. */\n variant?: 'default' | 'danger';\n /** Called when the item is selected. */\n onSelect?: () => void;\n}\n\n/** An agent shown in the composer's agent selector. */\nexport interface ChatComposerAgentOption {\n /** Stable id (returned via `onAgentChange`). */\n id: string;\n /** Display label. */\n label: string;\n /** Optional leading icon (defaults to a bot glyph in the trigger). */\n icon?: React.ReactNode;\n /** Optional secondary text shown in the menu. */\n description?: string;\n}\n\n/** Imperative handle exposed via `ref` for host-level integrations. */\nexport interface ChatComposerHandle {\n /**\n * Stage files programmatically (e.g. from a page-level drop zone or a\n * camera capture in `micSlot`). Deliberately NOT gated by\n * `allowAttachments` — that prop only hides the composer's own attach\n * affordances (the + button, paste, internal drop zone). Imperative calls\n * are explicit host actions; validation and `onError` still apply.\n */\n addFiles: (files: File[]) => void;\n /** Focus the text input. */\n focus: () => void;\n /**\n * The underlying textarea element, for host integrations that need caret\n * access (e.g. mention insertion via `setSelectionRange`).\n */\n getTextarea: () => HTMLTextAreaElement | null;\n}\n\n/** Structured context passed to `onError` so hosts can localize by reason. */\nexport interface ChatComposerError {\n reason: 'file-type' | 'file-size' | 'attachment-limit' | 'send-failed';\n /** The rejected file, when the error concerns a single file. */\n file?: File;\n}\n\nexport interface ChatComposerProps {\n /** Called when the user sends a message. */\n onSend?: (message: NewMessage) => void | Promise<void>;\n /** Controlled input value. Leave undefined for uncontrolled usage. */\n value?: string;\n /** Called when the input value changes. */\n onValueChange?: (value: string) => void;\n /** Placeholder text for the input. */\n placeholder?: string;\n /**\n * Disables all built-in interaction. Custom content (`micSlot`,\n * `addMenuItems` icons) is rendered as-is — hosts must disable their own\n * controls when they disable the composer.\n */\n disabled?: boolean;\n /** Shows the send button in a busy state and prevents duplicate sends. */\n isSending?: boolean;\n /** Autofocus the input on mount. */\n autoFocus?: boolean;\n /** Maximum message length. Sends are blocked while over the limit. */\n maxLength?: number;\n /** Show a character counter (requires `maxLength`). */\n showCharacterCount?: boolean;\n /**\n * Allow sending while the composer itself is empty (e.g. when the host\n * stages attachments outside the composer). The host receives a message\n * with empty `content` and no attachments and owns any further guarding.\n * @default false\n */\n canSendWhenEmpty?: boolean;\n /**\n * When the Enter key sends. `'desktop'` sends on Enter only on devices\n * with a fine pointer; on touch devices Return inserts a newline and the\n * send button sends (claude.ai / chatgpt.com parity). Shift+Enter always\n * inserts a newline, and Enter never sends mid IME composition.\n * @default 'desktop'\n */\n submitOnEnter?: 'desktop' | 'always' | 'never';\n /**\n * Maximum height of the auto-growing input: a pixel number or any CSS\n * length. Prefer small-viewport units (e.g. `'30svh'`) over `vh`: on iOS\n * `vh` is the full screen and ignores the on-screen keyboard.\n * @default 160\n */\n maxHeight?: number | string;\n /**\n * Extra props spread onto the underlying textarea. Event handlers run\n * before the composer's built-in handlers; call `event.preventDefault()`\n * in `onKeyDown` / `onPaste` to claim that event (e.g. for a mention\n * menu's arrow/Enter navigation). `className` and `style` are merged\n * with the composer's own.\n */\n textareaProps?: Omit<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'value' | 'defaultValue'\n >;\n\n /**\n * Custom node rendered at the leading edge, before the `+` menu (e.g. a\n * voice-activation toggle). Wrapped in a 32px-tall (`h-8`) flex row so it\n * aligns with the other controls; taller content overflows and stays\n * vertically centered. Interaction state is not managed: pass your own\n * disabled state when the composer is `disabled`.\n */\n leadingSlot?: React.ReactNode;\n /** Extra entries for the `+` menu, rendered after the built-in items. */\n addMenuItems?: ChatComposerMenuItem[];\n /** Enable file attachments (built-in \"Attach files\" menu item, paste-to-attach, drag-and-drop, chips). @default true */\n allowAttachments?: boolean;\n /** Accepted file types for the picker/paste validation (native `accept` tokens). */\n acceptedFileTypes?: string[];\n /** Maximum file size in bytes. */\n maxFileSize?: number;\n /** Maximum number of staged attachments. @default 10 */\n maxAttachments?: number;\n\n /**\n * Candidates for `@mention` autocomplete. When provided (non-empty), typing\n * `@` opens a suggestion listbox (same behavior as `MessageComposer`).\n * Omit to disable mentions entirely (default).\n */\n mentionOptions?: MentionOption[];\n\n /**\n * Message being replied to. When set, a dismissible preview row renders at\n * the top of the card, the input is focused, and the sent `NewMessage`\n * carries `replyToId`. The host owns the state: sending does not clear it\n * (clear it in `onSend`), and the preview's close button only calls\n * `onCancelReply`. Same contract as `MessageComposer`.\n */\n replyTo?: {\n id: string;\n content: string;\n senderName: string;\n } | null;\n /** Called when the reply preview's cancel button is clicked. */\n onCancelReply?: () => void;\n\n /** Show the built-in mic button. @default false */\n showMic?: boolean;\n /** Called when the built-in mic button is clicked. */\n onMicClick?: () => void;\n /**\n * Custom node rendered in place of the built-in mic button (e.g.\n * `RecordButton`). The slot is wrapped in a 32px-tall (`h-8`) flex row so it\n * aligns with the other composer controls; taller content overflows and\n * stays vertically centered without inflating the row. Interaction state is\n * not managed: pass your own disabled state when the composer is `disabled`.\n */\n micSlot?: React.ReactNode;\n /** When to show the mic: always, or only while the composer is empty. @default 'always' */\n micBehavior?: 'always' | 'whenEmpty';\n\n /** While true, the send button becomes a stop button (requires `onStop`). */\n isStreaming?: boolean;\n /** Called when the stop button is clicked during streaming. */\n onStop?: () => void;\n\n /** Show the agent selector in the bottom row. @default false */\n showAgentSelector?: boolean;\n /** Agents available in the agent selector. */\n agents?: ChatComposerAgentOption[];\n /** Selected agent id (controlled). */\n selectedAgent?: string | null;\n /** Called when an agent is selected. */\n onAgentChange?: (agentId: string) => void;\n\n /** Show the model selector in the bottom row. @default false */\n showModelSelector?: boolean;\n /** Props passed through to the embedded `ComposerModelSelector`. */\n modelSelectorProps?: ComposerModelSelectorProps;\n\n /** Replaces the composer with a read-only notice. */\n readOnly?: boolean;\n /** Notice text shown when `readOnly` is set. */\n readOnlyMessage?: string;\n\n /**\n * Called when a file is rejected or a send fails. `message` is a default\n * English string; `context.reason` lets hosts substitute localized copy.\n */\n onError?: (message: string, context?: ChatComposerError) => void;\n\n /** Message reported when the attachment limit is hit. Overrides the English default. */\n attachmentLimitLabel?: string;\n /** Message reported when an async `onSend` rejects. @default 'Failed to send message' */\n sendFailedLabel?: string;\n /** Accessible label for the send button while `isSending`. @default 'Sending message…' */\n sendingLabel?: string;\n\n /** Accessible label for the text input. @default 'Message input' */\n inputLabel?: string;\n /** Accessible label for the `+` menu trigger. @default 'Add to message' */\n addMenuLabel?: string;\n /** Label for the built-in attach menu item. @default 'Attach files' */\n attachFilesLabel?: string;\n /** Accessible label for the built-in mic button. @default 'Start voice input' */\n micLabel?: string;\n /** Accessible label for the send button. @default 'Send message' */\n sendLabel?: string;\n /** Accessible label for the stop button. @default 'Stop generating' */\n stopLabel?: string;\n /** Accessible label / empty-state text for the agent selector. @default 'Select agent' */\n agentSelectorLabel?: string;\n /** Accessible label for the `@mention` suggestion listbox. @default 'Mention' */\n mentionListLabel?: string;\n /** Overlay text shown while dragging files over the composer. @default 'Drop files here' */\n dropFilesLabel?: string;\n /** Prefix shown before the sender name in the reply preview. @default 'Replying to' */\n replyingToLabel?: string;\n /** Accessible label for the reply preview's cancel button. @default 'Cancel reply' */\n cancelReplyLabel?: string;\n\n className?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst iconButtonClasses = cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-lg',\n 'text-neutral-500 dark:text-neutral-400',\n 'transition-colors duration-150',\n 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-700 dark:hover:text-white',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500',\n 'disabled:pointer-events-none disabled:opacity-40'\n);\n\nconst selectorTriggerClasses = cn(\n 'flex min-w-0 items-center gap-1 rounded-md px-2 py-1 text-xs',\n 'text-neutral-600 dark:text-neutral-400',\n 'transition-colors duration-150',\n 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-700 dark:hover:text-white',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500',\n 'disabled:pointer-events-none disabled:opacity-40'\n);\n\nconst MAX_INPUT_HEIGHT = 160;\n\n/** Touch-first devices (phones, tablets without a trackpad). */\nconst TOUCH_DEVICE_QUERY = '(hover: none) and (pointer: coarse)';\n\n// Touch detection as an external store: during hydration React renders the\n// server snapshot (fine pointer) and then re-renders with the client value,\n// so SSR-emitted attributes like `enterkeyhint` never go stale.\nconst subscribeTouchDevice = (onChange: () => void) => {\n const query = window.matchMedia?.(TOUCH_DEVICE_QUERY);\n query?.addEventListener('change', onChange);\n return () => query?.removeEventListener('change', onChange);\n};\nconst getTouchDeviceSnapshot = () =>\n window.matchMedia?.(TOUCH_DEVICE_QUERY).matches ?? false;\nconst getServerTouchDeviceSnapshot = () => false;\n\n/**\n * Card descendants that keep their own pointer behavior (and text that\n * stays selectable) instead of forwarding a tap to the textarea.\n */\nconst CARD_INTERACTIVE_SELECTOR = [\n 'button',\n 'a',\n 'input',\n 'textarea',\n 'select',\n 'label',\n 'video',\n '[role=\"listbox\"]',\n '[role=\"menu\"]',\n '[data-slot=\"chat-composer-reply-preview\"]',\n '[data-slot=\"chat-composer-attachments\"]',\n].join(',');\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Standardized chat input. At `md+` it renders as a single-row pill — `+`\n * menu, text input and actions (mic, send/stop) side by side; below `md` the\n * input stacks above the icon row. The optional agent/model selector row\n * hangs below the card on the page background.\n */\nexport const ChatComposer = React.forwardRef<\n ChatComposerHandle,\n ChatComposerProps\n>(function ChatComposer(\n {\n onSend,\n value: controlledValue,\n onValueChange,\n placeholder = 'Type a message…',\n disabled = false,\n isSending = false,\n autoFocus = false,\n maxLength,\n showCharacterCount = false,\n canSendWhenEmpty = false,\n submitOnEnter = 'desktop',\n maxHeight = MAX_INPUT_HEIGHT,\n textareaProps,\n leadingSlot,\n addMenuItems,\n allowAttachments = true,\n acceptedFileTypes,\n maxFileSize,\n maxAttachments = 10,\n mentionOptions,\n replyTo = null,\n onCancelReply,\n showMic = false,\n onMicClick,\n micSlot,\n micBehavior = 'always',\n isStreaming = false,\n onStop,\n showAgentSelector = false,\n agents = [],\n selectedAgent = null,\n onAgentChange,\n showModelSelector = false,\n modelSelectorProps,\n readOnly = false,\n readOnlyMessage = 'You have read-only access and cannot send messages.',\n onError,\n attachmentLimitLabel,\n sendFailedLabel = 'Failed to send message',\n sendingLabel = 'Sending message…',\n inputLabel = 'Message input',\n addMenuLabel = 'Add to message',\n attachFilesLabel = 'Attach files',\n micLabel = 'Start voice input',\n sendLabel = 'Send message',\n stopLabel = 'Stop generating',\n agentSelectorLabel = 'Select agent',\n mentionListLabel = 'Mention',\n dropFilesLabel = 'Drop files here',\n replyingToLabel = 'Replying to',\n cancelReplyLabel = 'Cancel reply',\n className,\n },\n ref\n) {\n const [internalValue, setInternalValue] = React.useState('');\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : internalValue;\n\n const [attachments, setAttachments] = React.useState<StagedAttachment[]>([]);\n const attachmentsRef = React.useRef(attachments);\n attachmentsRef.current = attachments;\n\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n\n const [addMenuOpen, setAddMenuOpen] = React.useState(false);\n const [agentMenuOpen, setAgentMenuOpen] = React.useState(false);\n\n const isTouchDevice = React.useSyncExternalStore(\n subscribeTouchDevice,\n getTouchDeviceSnapshot,\n getServerTouchDeviceSnapshot\n );\n const sendsOnEnter =\n submitOnEnter === 'always' ||\n (submitOnEnter === 'desktop' && !isTouchDevice);\n\n // Focus the input when a reply target is set (MessageComposer parity).\n // Keyed on the id, not the object: hosts often build `replyTo` inline, so\n // an object dependency would re-steal focus (and reset the caret) on every\n // parent render while the user is typing.\n const replyToId = replyTo?.id;\n React.useEffect(() => {\n if (replyToId !== undefined) {\n textareaRef.current?.focus();\n }\n }, [replyToId]);\n\n // Host-opt-in autofocus, applied on the client only after confirming a\n // fine pointer. A rendered `autofocus` attribute would ship in SSR markup\n // (where the touch check can't run) and pop the on-screen keyboard over\n // the page the user just navigated to.\n React.useEffect(() => {\n if (!autoFocus) return;\n if (window.matchMedia?.(TOUCH_DEVICE_QUERY).matches) return;\n textareaRef.current?.focus();\n // Mount-only, matching native `autofocus` semantics.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const hasText = value.trim().length > 0;\n const hasContent = hasText || attachments.length > 0;\n const isOverLimit = maxLength !== undefined && value.length > maxLength;\n // Without an onSend handler, sending would silently discard the draft.\n const canSend =\n (hasContent || canSendWhenEmpty) &&\n onSend !== undefined &&\n !disabled &&\n !isSending &&\n !isStreaming &&\n !isOverLimit;\n\n // --------------------------------------------------------------------\n // Input handling\n // --------------------------------------------------------------------\n\n const setValue = React.useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n },\n [isControlled, onValueChange]\n );\n\n // @mention autocomplete (opt-in via `mentionOptions`) — shared with\n // MessageComposer so both composers behave identically.\n const mention = useMentionAutocomplete({\n options: mentionOptions,\n value,\n setValue,\n textareaRef,\n });\n\n // Auto-grow the textarea. The cap is enforced with CSS max-height so it\n // can be any CSS length (e.g. '40vh'), not just a pixel number.\n const resizeTextarea = React.useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.style.height = 'auto';\n // While the textarea is not laid out (hidden container, e.g. a\n // just-mounted Storybook story or a closed panel) scrollHeight is 0 —\n // keep height auto and let the ResizeObserver below re-measure once\n // the element becomes visible.\n if (textarea.scrollHeight === 0) return;\n textarea.style.height = `${textarea.scrollHeight}px`;\n }, []);\n\n React.useLayoutEffect(resizeTextarea, [resizeTextarea, value]);\n\n // Re-measure when the textarea's box changes for reasons other than\n // typing: the container becoming visible, width changes, font loading,\n // or crossing the md breakpoint (different paddings).\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea || typeof ResizeObserver === 'undefined') return;\n // Defer the re-measure to the next frame: mutating the observed\n // element's height synchronously inside the observer callback triggers\n // the browser's \"ResizeObserver loop completed with undelivered\n // notifications\" error, which dev overlays surface as a runtime error.\n let frame = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(resizeTextarea);\n });\n observer.observe(textarea);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [resizeTextarea]);\n\n // --------------------------------------------------------------------\n // Attachments\n // --------------------------------------------------------------------\n\n const addFiles = React.useCallback(\n (files: File[]) => {\n // No `allowAttachments` gate here: every user-facing entry point\n // (paste handler, + button, internal drop zone) is gated separately,\n // so this only opens the imperative `ref.addFiles()` path for hosts\n // (e.g. MessageThread's camera capture with the picker disabled).\n if (files.length === 0) return;\n // Staging happens outside the state updater so object-URL creation,\n // id generation and onError stay out of a function React may re-invoke.\n const limitMessage =\n attachmentLimitLabel ??\n `Attachment limit reached (max ${maxAttachments})`;\n const room = maxAttachments - attachmentsRef.current.length;\n if (files.length > room) {\n onError?.(limitMessage, { reason: 'attachment-limit' });\n if (room <= 0) return;\n }\n const staged: StagedAttachment[] = [];\n for (const file of files.slice(0, Math.max(room, 0))) {\n const typeCheck = validateFile(file, acceptedFileTypes, undefined);\n if (!typeCheck.valid) {\n onError?.(`${file.name}: ${typeCheck.error}`, {\n reason: 'file-type',\n file,\n });\n continue;\n }\n const sizeCheck = validateFile(file, undefined, maxFileSize);\n if (!sizeCheck.valid) {\n onError?.(`${file.name}: ${sizeCheck.error}`, {\n reason: 'file-size',\n file,\n });\n continue;\n }\n const type = getFileType(file.type);\n staged.push({\n id: generateAttachmentId(),\n file,\n type,\n previewUrl:\n type === 'image' || type === 'video'\n ? URL.createObjectURL(file)\n : undefined,\n });\n }\n if (staged.length > 0) {\n // Reserve slots synchronously: a second addFiles call in the same\n // React batch reads attachmentsRef before re-render, so without this\n // both calls could see the same free room and overshoot the cap.\n attachmentsRef.current = [...attachmentsRef.current, ...staged];\n setAttachments((current) => [...current, ...staged]);\n }\n },\n [\n maxAttachments,\n acceptedFileTypes,\n maxFileSize,\n onError,\n attachmentLimitLabel,\n ]\n );\n\n const removeAttachment = React.useCallback((id: string) => {\n // Same discipline as addFiles: revoke and update the ref synchronously,\n // keep the state updater pure (StrictMode may re-invoke it).\n const target = attachmentsRef.current.find(\n (attachment) => attachment.id === id\n );\n if (target?.previewUrl) URL.revokeObjectURL(target.previewUrl);\n attachmentsRef.current = attachmentsRef.current.filter(\n (attachment) => attachment.id !== id\n );\n setAttachments((current) =>\n current.filter((attachment) => attachment.id !== id)\n );\n }, []);\n\n // Revoke any outstanding preview URLs on unmount.\n React.useEffect(() => {\n return () => {\n for (const attachment of attachmentsRef.current) {\n if (attachment.previewUrl) URL.revokeObjectURL(attachment.previewUrl);\n }\n };\n }, []);\n\n const handleFileInputChange = (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const files = Array.from(event.target.files ?? []);\n addFiles(files);\n event.target.value = '';\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (!allowAttachments) return;\n const files = Array.from(event.clipboardData.files);\n if (files.length > 0) {\n event.preventDefault();\n addFiles(files);\n }\n };\n\n React.useImperativeHandle(\n ref,\n () => ({\n addFiles,\n focus: () => textareaRef.current?.focus(),\n getTextarea: () => textareaRef.current,\n }),\n [addFiles]\n );\n\n // --------------------------------------------------------------------\n // Sending\n // --------------------------------------------------------------------\n\n const handleSend = () => {\n if (!canSend || !onSend) return;\n const message: NewMessage = {\n content: value.trim(),\n attachments: attachments.map((attachment) => attachment.file),\n // Only add the key when replying — hosts may key-check the payload.\n ...(replyTo ? { replyToId: replyTo.id } : {}),\n };\n for (const attachment of attachments) {\n if (attachment.previewUrl) URL.revokeObjectURL(attachment.previewUrl);\n }\n // Clear the ref alongside the state: the unmount cleanup reads the ref,\n // so if onSend unmounts the composer synchronously it must not see (and\n // re-revoke) the already-revoked preview URLs.\n attachmentsRef.current = [];\n setAttachments([]);\n setValue('');\n // The draft is cleared optimistically; hosts own retry/restore. Both a\n // synchronous throw and a rejected promise surface through onError\n // instead of being swallowed.\n try {\n Promise.resolve(onSend(message)).catch(() => {\n onError?.(sendFailedLabel, { reason: 'send-failed' });\n });\n } catch {\n onError?.(sendFailedLabel, { reason: 'send-failed' });\n }\n textareaRef.current?.focus();\n };\n\n // Pressing a button moves focus off the textarea, which on mobile starts\n // dismissing the keyboard before `handleSend` refocuses it (a visible\n // close/reopen bounce). Cancelling mousedown keeps focus where it is; the\n // click still fires, and keyboard users can still tab to the button.\n const keepInputFocus = (event: React.MouseEvent) => {\n event.preventDefault();\n };\n\n // Tapping the card's padding or empty toolbar space focuses the input\n // (claude.ai / chatgpt.com parity) instead of doing nothing — or, with the\n // keyboard open, blurring the input and dismissing it.\n const focusInputFromCard = (event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n const target = event.target as HTMLElement;\n if (target.closest(CARD_INTERACTIVE_SELECTOR)) return;\n event.preventDefault();\n textareaRef.current?.focus();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // @mention menu navigation takes priority over send.\n if (mention.handleKeyDown(event)) return;\n // Enter confirms an IME candidate (CJK input) rather than sending.\n if (event.nativeEvent.isComposing) return;\n if (event.key === 'Enter' && !event.shiftKey && sendsOnEnter) {\n event.preventDefault();\n handleSend();\n }\n };\n\n // --------------------------------------------------------------------\n // Render\n // --------------------------------------------------------------------\n\n if (readOnly) {\n return (\n <div\n data-slot=\"chat-composer\"\n // A live status region (implicit aria-live=\"polite\"): readOnly can\n // flip at runtime (e.g. after permissions resolve), and screen-reader\n // users must be told the input became read-only.\n role=\"status\"\n className={cn(\n 'flex items-center gap-2 rounded-xl border px-4 py-3 text-sm',\n 'border-amber-300 bg-amber-50 text-amber-900',\n 'dark:border-amber-700 dark:bg-amber-950 dark:text-amber-200',\n className\n )}\n >\n <AlertTriangleIcon className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n <span data-slot=\"chat-composer-readonly\">{readOnlyMessage}</span>\n </div>\n );\n }\n\n const showAddMenu =\n allowAttachments || (addMenuItems && addMenuItems.length > 0);\n const micVisible =\n (showMic || onMicClick !== undefined || micSlot !== undefined) &&\n (micBehavior === 'always' || !hasContent);\n const showSelectorRow = showAgentSelector || showModelSelector;\n const selectedAgentOption =\n agents.find((agent) => agent.id === selectedAgent) ?? null;\n\n // One responsive grid: below `md` the input sits on row 1 spanning all\n // columns with the `+`/actions on row 2; at `md+` the `+`, input and\n // actions sit side by side on row 1 as a single pill (actions pin to the\n // bottom via self-end as the input grows).\n const cells = {\n input:\n 'col-span-3 col-start-1 row-start-1 px-1 pt-1 md:col-span-1 md:col-start-2 md:self-end md:px-0 md:py-1.5',\n textarea: 'px-2 pt-2 pb-1 md:py-1.5',\n add: 'col-start-1 row-start-2 pb-2 ps-2 md:row-start-1 md:self-end md:p-1.5 md:pe-0.5',\n actions:\n 'col-start-3 row-start-2 flex items-center gap-1 pb-2 pe-2 md:row-start-1 md:self-end md:gap-0.5 md:p-1.5 md:ps-0.5',\n };\n\n const composerCard = (\n <>\n {replyTo && (\n <div\n data-slot=\"chat-composer-reply-preview\"\n className={cn(\n 'flex items-center gap-2 rounded-t-2xl px-4 py-2',\n 'bg-neutral-50 dark:bg-neutral-800/50',\n 'border-b border-neutral-200 dark:border-neutral-700',\n 'border-s-primary-500 border-s-4'\n )}\n >\n {/* role=\"status\" politely announces the reply target to screen readers\n when the row is inserted (focus jumps to the textarea, so the text\n would otherwise be skipped). The cancel button stays outside it. */}\n <div role=\"status\" className=\"min-w-0 flex-1\">\n <span className=\"text-primary-800 dark:text-primary-400 block text-xs font-medium\">\n {replyingToLabel} {replyTo.senderName}\n </span>\n <p className=\"truncate text-sm text-neutral-600 dark:text-neutral-300\">\n {replyTo.content}\n </p>\n </div>\n <button\n type=\"button\"\n data-slot=\"chat-composer-cancel-reply\"\n aria-label={cancelReplyLabel}\n disabled={disabled}\n onClick={onCancelReply}\n className={iconButtonClasses}\n >\n <XIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n\n {attachments.length > 0 && (\n <div\n data-slot=\"chat-composer-attachments\"\n className=\"flex flex-wrap gap-2 px-3 pt-3\"\n >\n {attachments.map((attachment) => (\n <AttachmentPreviewItem\n key={attachment.id}\n attachment={{ ...attachment, state: 'pending' }}\n onRemove={() => removeAttachment(attachment.id)}\n disabled={disabled}\n />\n ))}\n </div>\n )}\n\n <div className=\"grid grid-cols-[auto_minmax(0,1fr)_auto]\">\n {/* Inset cell: the textarea sits inside the card with a matching\n inner radius so focus outlines / a11y highlights render as a\n clean nested rounded rect instead of stacking on the card's\n border. The padding split (cell + textarea) keeps the text in\n place using only standard utilities. */}\n <div className={cells.input} ref={mention.anchorRef}>\n <MentionMenu\n mention={mention}\n label={mentionListLabel}\n dataSlot=\"chat-composer-mention-list\"\n />\n <textarea\n // Mobile keyboard hints; overridable via `textareaProps`.\n enterKeyHint={sendsOnEnter ? 'send' : 'enter'}\n inputMode=\"text\"\n autoCapitalize=\"sentences\"\n autoCorrect=\"on\"\n spellCheck\n // Follows the typed script, so RTL text aligns correctly.\n dir=\"auto\"\n {...textareaProps}\n ref={textareaRef}\n data-slot=\"chat-composer-input\"\n value={value}\n onChange={(event) => {\n textareaProps?.onChange?.(event);\n setValue(event.target.value);\n mention.sync(\n event.target.value,\n event.target.selectionStart ?? event.target.value.length\n );\n }}\n // Host handlers run first; preventDefault() opts out of the\n // built-in behavior (mention menu, Enter-to-send,\n // paste-to-attach).\n onKeyDown={(event) => {\n textareaProps?.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n handleKeyDown(event);\n }}\n onClick={(event) => {\n textareaProps?.onClick?.(event);\n if (event.defaultPrevented) return;\n const el = event.currentTarget;\n mention.sync(el.value, el.selectionStart ?? el.value.length);\n }}\n onPaste={(event) => {\n textareaProps?.onPaste?.(event);\n if (event.defaultPrevented) return;\n handlePaste(event);\n }}\n placeholder={placeholder}\n disabled={disabled}\n rows={1}\n aria-label={inputLabel}\n {...mention.inputProps}\n style={{\n ...textareaProps?.style,\n maxHeight:\n typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight,\n }}\n className={cn(\n 'block w-full resize-none bg-transparent',\n // 16px below `sm`: iOS zooms the page when focusing an input\n // with a smaller font.\n 'rounded-lg text-base sm:text-sm',\n cells.textarea,\n 'text-neutral-900 placeholder:text-neutral-400 dark:text-white dark:placeholder:text-neutral-500',\n // Ring the input itself on focus rather than the whole shell.\n 'focus:ring-primary-500 focus:ring-1 focus:outline-none',\n 'disabled:cursor-not-allowed',\n textareaProps?.className\n )}\n />\n </div>\n\n {(showAddMenu || leadingSlot != null) && (\n <div\n className={cn(\n cells.add,\n leadingSlot != null && 'flex items-center gap-0.5'\n )}\n >\n {leadingSlot != null && (\n <div\n data-slot=\"chat-composer-leading-slot\"\n className=\"flex h-8 shrink-0 items-center\"\n >\n {leadingSlot}\n </div>\n )}\n\n {showAddMenu && (\n <Dropdown\n placement=\"top-start\"\n open={addMenuOpen}\n onOpenChange={setAddMenuOpen}\n trigger={\n <button\n type=\"button\"\n data-slot=\"chat-composer-add-button\"\n aria-label={addMenuLabel}\n disabled={disabled}\n className={iconButtonClasses}\n >\n <PlusIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n }\n >\n {allowAttachments && (\n <DropdownItem\n icon={\n <PaperclipIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n }\n onClick={() => {\n setAddMenuOpen(false);\n fileInputRef.current?.click();\n }}\n >\n {attachFilesLabel}\n </DropdownItem>\n )}\n {allowAttachments &&\n addMenuItems &&\n addMenuItems.length > 0 && <DropdownSeparator />}\n {addMenuItems?.map((item) => (\n <DropdownItem\n key={item.id}\n icon={item.icon}\n disabled={item.disabled}\n variant={item.variant}\n checked={item.checked}\n onClick={() => {\n setAddMenuOpen(false);\n item.onSelect?.();\n }}\n >\n <span className=\"min-w-0 truncate\">{item.label}</span>\n </DropdownItem>\n ))}\n </Dropdown>\n )}\n </div>\n )}\n\n {allowAttachments && (\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={acceptedFileTypes?.join(',')}\n onChange={handleFileInputChange}\n className=\"hidden\"\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n )}\n\n <div className={cells.actions}>\n {showCharacterCount && maxLength !== undefined && (\n <span\n data-slot=\"chat-composer-char-count\"\n aria-live=\"polite\"\n className={cn(\n 'pe-1 text-xs tabular-nums',\n isOverLimit\n ? 'font-medium text-red-700 dark:text-red-400'\n : 'text-neutral-500 dark:text-neutral-400'\n )}\n >\n {value.length}/{maxLength}\n </span>\n )}\n\n {micVisible &&\n (micSlot != null ? (\n // Normalize slot content (e.g. a RecordButton) to the 32px\n // control row: taller content overflow-centers instead of\n // inflating the pill and pushing the other cells apart. A div\n // so block-level slot content stays valid HTML.\n <div\n data-slot=\"chat-composer-mic-slot\"\n className=\"flex h-8 shrink-0 items-center\"\n >\n {micSlot}\n </div>\n ) : (\n <button\n type=\"button\"\n data-slot=\"chat-composer-mic-button\"\n aria-label={micLabel}\n disabled={disabled}\n onClick={onMicClick}\n className={iconButtonClasses}\n >\n <MicIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n ))}\n\n {isStreaming && onStop ? (\n <button\n type=\"button\"\n data-slot=\"chat-composer-stop-button\"\n aria-label={stopLabel}\n disabled={disabled}\n onMouseDown={keepInputFocus}\n onClick={onStop}\n className={cn(\n iconButtonClasses,\n 'text-neutral-700 dark:text-neutral-200'\n )}\n >\n <StopIcon\n className=\"h-3.5 w-3.5 fill-current\"\n aria-hidden=\"true\"\n />\n </button>\n ) : (\n <button\n type=\"button\"\n data-slot=\"chat-composer-send-button\"\n aria-label={isSending ? sendingLabel : sendLabel}\n aria-busy={isSending || undefined}\n disabled={!canSend}\n onMouseDown={keepInputFocus}\n onClick={handleSend}\n className={cn(\n iconButtonClasses,\n canSend &&\n 'bg-primary-800 hover:bg-primary-700 dark:bg-primary-600 dark:hover:bg-primary-500 text-white hover:text-white dark:hover:text-white'\n )}\n >\n {isSending ? (\n <LoaderIcon\n className=\"h-4 w-4 animate-spin\"\n aria-hidden=\"true\"\n />\n ) : (\n <ArrowUpIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n )}\n </button>\n )}\n </div>\n </div>\n </>\n );\n\n const selectorsRow = showSelectorRow && (\n <div\n data-slot=\"chat-composer-selectors\"\n className=\"flex items-center justify-between gap-2 px-2 pt-1\"\n >\n {showAgentSelector ? (\n <Dropdown\n placement=\"top-start\"\n open={agentMenuOpen}\n onOpenChange={setAgentMenuOpen}\n trigger={\n <button\n type=\"button\"\n data-slot=\"chat-composer-agent-trigger\"\n aria-label={\n selectedAgentOption\n ? `${agentSelectorLabel}: ${selectedAgentOption.label}`\n : agentSelectorLabel\n }\n disabled={disabled}\n className={selectorTriggerClasses}\n >\n {selectedAgentOption?.icon ?? (\n <BotIcon className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n )}\n <span className=\"min-w-0 truncate\">\n {selectedAgentOption?.label ?? agentSelectorLabel}\n </span>\n <ChevronUpIcon className=\"h-3 w-3 shrink-0\" aria-hidden=\"true\" />\n </button>\n }\n >\n {agents.map((agent) => (\n <DropdownItem\n key={agent.id}\n icon={agent.icon}\n role=\"menuitemradio\"\n aria-checked={agent.id === selectedAgent}\n onClick={() => {\n setAgentMenuOpen(false);\n onAgentChange?.(agent.id);\n }}\n >\n <span className=\"flex w-full items-center justify-between gap-2\">\n <span className=\"min-w-0\">\n <span className=\"block truncate\">{agent.label}</span>\n {agent.description && (\n <span className=\"block truncate text-xs text-neutral-500 dark:text-neutral-400\">\n {agent.description}\n </span>\n )}\n </span>\n {agent.id === selectedAgent && (\n <CheckIcon\n className=\"text-primary-600 dark:text-primary-400 h-4 w-4 shrink-0\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n </DropdownItem>\n ))}\n </Dropdown>\n ) : (\n <span aria-hidden=\"true\" />\n )}\n\n {showModelSelector && modelSelectorProps && (\n <ComposerModelSelector\n variant=\"ghost\"\n {...modelSelectorProps}\n disabled={disabled || modelSelectorProps.disabled}\n />\n )}\n </div>\n );\n\n // The bordered card holds only the input row(s); the selector row hangs\n // below it on the page background. When attachments are enabled the card\n // doubles as a drop target; all dropped files run through `addFiles` so\n // validation and structured `onError` reporting stay in one place (the\n // zone itself does not validate).\n const card = (\n // Pointer-only convenience: the textarea stays the keyboard/AT target.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n data-slot=\"chat-composer-card\"\n onMouseDown={focusInputFromCard}\n className={cn(\n 'cursor-text rounded-2xl border border-neutral-200 bg-white shadow-sm',\n 'dark:border-[#2e2e30] dark:bg-[#1c1c1e]'\n )}\n >\n {composerCard}\n </div>\n );\n\n return (\n <div\n data-slot=\"chat-composer\"\n className={cn(\n 'flex w-full flex-col',\n disabled && 'opacity-60',\n className\n )}\n >\n {allowAttachments ? (\n <DragDropZone\n onFilesDropped={addFiles}\n maxFiles={Number.MAX_SAFE_INTEGER}\n disabled={disabled}\n overlayLabel={dropFilesLabel}\n >\n {card}\n </DragDropZone>\n ) : (\n card\n )}\n {selectorsRow}\n </div>\n );\n});\n\nChatComposer.displayName = 'ChatComposer';\n","// Dev-only, one-time notice that the chat surfaces now mount ChatComposer in\n// place of the retired MessageComposer (mieweb/ui#465, 0.10.0). Bundlers\n// replace `process.env.NODE_ENV` at build time, so the whole branch is\n// dead-code-eliminated from production bundles.\n// TODO(0.11.0): remove this notice one release after the retirement ships.\nlet didNotify = false;\n\n/** Log a one-time dev pointer to the ChatComposer migration guide. */\nexport function notifyComposerMigrationOnce(surface: string): void {\n if (process.env.NODE_ENV === 'production' || didNotify) return;\n didNotify = true;\n console.warn(\n `[@mieweb/ui] ${surface} renders the shared ChatComposer — the standalone ` +\n 'MessageComposer was retired in 0.10.0. If your CSS or tests reach into ' +\n 'composer internals, see MIGRATION.md#chat-composer ' +\n '(https://github.com/mieweb/ui/blob/main/MIGRATION.md#chat-composer). ' +\n 'This dev-only notice will be removed in 0.11.0.'\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/AI/ComposerModelSelector.tsx","../src/components/Messaging/AttachmentPicker.tsx","../src/components/Messaging/useMentionAutocomplete.tsx","../src/components/ChatComposer/ChatComposer.tsx","../src/components/ChatComposer/migration-notice.ts"],"names":["React","useAnchoredPosition","value","useClickOutside","useEscapeKey","jsxs","Fragment","cn","jsx","ChevronUp","createPortal","Check","ChevronRight","ChevronLeft","React2","React3","React4","ChatComposer","AlertTriangle","X","Dropdown","Plus","DropdownItem","Paperclip","DropdownSeparator","Mic","Square","Loader2","ArrowUp","Bot"],"mappings":"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","file":"chunk-LJZKEMAH.cjs","sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { Check, ChevronLeft, ChevronRight, ChevronUp } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\nexport type ProviderModelValue = {\n provider: string;\n model: string;\n};\n\nexport type ProviderModelOption = ProviderModelValue & {\n label?: string;\n providerLabel?: string;\n id?: string;\n};\n\n/** A reasoning-effort level offered alongside the model. */\nexport type ComposerEffortOption = {\n value: string;\n label: string;\n /** Optional secondary line, e.g. a caveat about cost or latency. */\n description?: string;\n};\n\ntype ComposerModelSelectorBaseProps = {\n models: ProviderModelOption[];\n value: ProviderModelValue | null;\n onChange: (value: ProviderModelValue) => void;\n disabled?: boolean;\n /**\n * Trigger appearance: 'default' is the bordered pill; 'ghost' is a quiet\n * text trigger that matches ChatComposer's selector-row controls.\n */\n variant?: 'default' | 'ghost';\n className?: string;\n boundaryRef?: React.RefObject<HTMLElement | null>;\n placeholder?: string;\n anyLabel?: string;\n emptyLabel?: string;\n ariaLabel?: string;\n /**\n * Reasoning-effort levels for the selected model. Omit or pass an empty\n * array to hide the effort row entirely, which is what a model that cannot\n * reason should resolve to — the levels are provider-specific, so the caller\n * owns deciding which apply.\n */\n effortOptions?: ComposerEffortOption[];\n /** Currently selected effort. */\n effort?: string | null;\n /** Effort marked with a \"default\" badge in the list. */\n defaultEffort?: string;\n onEffortChange?: (value: string) => void;\n effortLabel?: string;\n effortHint?: string;\n defaultBadgeLabel?: string;\n backLabel?: string;\n};\n\ntype ControlledProviderFilterProps = {\n providerFilter: string | null;\n onProviderFilterChange: (provider: string | null) => void;\n};\n\ntype UncontrolledProviderFilterProps = {\n providerFilter?: undefined;\n onProviderFilterChange?: (provider: string | null) => void;\n};\n\nexport type ComposerModelSelectorProps = ComposerModelSelectorBaseProps &\n (ControlledProviderFilterProps | UncontrolledProviderFilterProps);\n\nconst MENU_OFFSET_PX = 6;\nconst MENU_MAX_HEIGHT_PX = 320;\n\nfunction optionKey(option: ProviderModelValue) {\n return `${option.provider}\\u0000${option.model}`;\n}\n\nfunction renderedOptionKey(option: ProviderModelOption, index: number) {\n return `${option.id ?? optionKey(option)}\\u0000${index}`;\n}\n\ntype RenderedModelOption = {\n option: ProviderModelOption;\n index: number;\n key: string;\n};\n\nfunction groupByProvider(models: ProviderModelOption[]) {\n const groups = new Map<string, ProviderModelOption[]>();\n\n for (const model of models) {\n const group = groups.get(model.provider);\n if (group) {\n group.push(model);\n } else {\n groups.set(model.provider, [model]);\n }\n }\n\n return Array.from(groups, ([provider, options]) => ({ provider, options }));\n}\n\nfunction getProviderLabel(models: ProviderModelOption[], provider: string) {\n return (\n models.find((model) => model.provider === provider && model.providerLabel)\n ?.providerLabel ?? provider\n );\n}\n\nexport function ComposerModelSelector({\n models,\n value,\n providerFilter,\n onProviderFilterChange,\n onChange,\n disabled = false,\n variant = 'default',\n className,\n boundaryRef,\n placeholder = 'Model',\n anyLabel = 'Any',\n emptyLabel = 'No models',\n ariaLabel = 'Model',\n effortOptions,\n effort = null,\n defaultEffort,\n onEffortChange,\n effortLabel = 'Effort',\n effortHint,\n defaultBadgeLabel = 'Default',\n backLabel = 'Back',\n}: ComposerModelSelectorProps) {\n const [open, setOpen] = React.useState(false);\n // The menu drills down rather than opening a side panel: one anchored\n // surface is far less fragile near the viewport edge, which is exactly where\n // a composer sits.\n const [view, setView] = React.useState<'models' | 'effort'>('models');\n const [effortHighlight, setEffortHighlight] = React.useState(0);\n const [internalProviderFilter, setInternalProviderFilter] = React.useState<\n string | null\n >(null);\n const [highlightedIndex, setHighlightedIndex] = React.useState(0);\n const listRef = React.useRef<HTMLDivElement>(null);\n const effortListRef = React.useRef<HTMLDivElement>(null);\n const menuId = React.useId();\n const {\n anchorRef: triggerRef,\n floatingRef: menuRef,\n style: menuStyle,\n } = useAnchoredPosition<HTMLButtonElement, HTMLDivElement>({\n open,\n placement: 'top-start',\n offset: MENU_OFFSET_PX,\n matchMinWidth: true,\n maxHeight: MENU_MAX_HEIGHT_PX,\n allowFlip: false,\n boundaryRef,\n });\n\n const activeProviderFilter =\n providerFilter === undefined ? internalProviderFilter : providerFilter;\n const selectedKey = value ? optionKey(value) : null;\n const selectedOption = models.find(\n (model) => optionKey(model) === selectedKey\n );\n const providers = React.useMemo(\n () => Array.from(new Set(models.map((model) => model.provider))),\n [models]\n );\n const providerLabels = React.useMemo(\n () =>\n new Map(\n providers.map((provider) => [\n provider,\n getProviderLabel(models, provider),\n ])\n ),\n [models, providers]\n );\n const filteredModels = React.useMemo(\n () =>\n activeProviderFilter === null\n ? models\n : models.filter((model) => model.provider === activeProviderFilter),\n [activeProviderFilter, models]\n );\n const groupedModels = React.useMemo(\n () => groupByProvider(filteredModels),\n [filteredModels]\n );\n const groupedRenderedModels = React.useMemo(() => {\n let index = 0;\n return groupedModels.map((group) => ({\n provider: group.provider,\n options: group.options.map((option) => {\n const rendered: RenderedModelOption = {\n option,\n index,\n key: renderedOptionKey(option, index),\n };\n index += 1;\n return rendered;\n }),\n }));\n }, [groupedModels]);\n const renderedModels = React.useMemo(\n () => groupedRenderedModels.flatMap((group) => group.options),\n [groupedRenderedModels]\n );\n const getOptionId = React.useCallback(\n (index: number) => `${menuId}-option-${index}`,\n [menuId]\n );\n // The two views are mutually exclusive, so both listboxes carry `menuId` and\n // the trigger's `aria-controls` stays pointed at whichever one is rendered.\n // Option ids are namespaced per view so they cannot collide.\n const getEffortOptionId = React.useCallback(\n (index: number) => `${menuId}-effort-option-${index}`,\n [menuId]\n );\n const activeOptionId =\n open && renderedModels[highlightedIndex]\n ? getOptionId(highlightedIndex)\n : undefined;\n const selectedRenderedIndex = React.useMemo(\n () =>\n selectedKey\n ? renderedModels.findIndex(\n (renderedModel) => optionKey(renderedModel.option) === selectedKey\n )\n : -1,\n [renderedModels, selectedKey]\n );\n\n const setProvider = React.useCallback(\n (provider: string | null) => {\n if (providerFilter === undefined) {\n setInternalProviderFilter(provider);\n }\n onProviderFilterChange?.(provider);\n },\n [onProviderFilterChange, providerFilter]\n );\n\n const close = React.useCallback(\n (restoreFocus = true) => {\n setOpen(false);\n if (restoreFocus) {\n triggerRef.current?.focus({ preventScroll: true });\n }\n },\n [triggerRef]\n );\n\n const selectModel = React.useCallback(\n (model: ProviderModelOption) => {\n onChange({ provider: model.provider, model: model.model });\n close();\n },\n [close, onChange]\n );\n\n const efforts = React.useMemo(() => effortOptions ?? [], [effortOptions]);\n const activeEffortOptionId =\n open && efforts[effortHighlight]\n ? getEffortOptionId(effortHighlight)\n : undefined;\n const selectedEffortOption = efforts.find(\n (option) => option.value === effort\n );\n\n const selectEffort = React.useCallback(\n (value: string) => {\n onEffortChange?.(value);\n close();\n },\n [close, onEffortChange]\n );\n\n const handleEffortKeyDown = (event: React.KeyboardEvent) => {\n if (efforts.length === 0) return;\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setEffortHighlight((current) => (current + 1) % efforts.length);\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setEffortHighlight(\n (current) => (current - 1 + efforts.length) % efforts.length\n );\n }\n if (event.key === 'Home') {\n event.preventDefault();\n setEffortHighlight(0);\n }\n if (event.key === 'End') {\n event.preventDefault();\n setEffortHighlight(efforts.length - 1);\n }\n // Left/Backspace mirrors the drill-down affordance so keyboard users can\n // get back to the model list without reaching for the mouse.\n if (event.key === 'ArrowLeft' || event.key === 'Backspace') {\n event.preventDefault();\n setView('models');\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const highlighted = efforts[effortHighlight];\n if (highlighted) selectEffort(highlighted.value);\n }\n };\n\n const outsideRefs = React.useMemo(\n () => [triggerRef, menuRef],\n [triggerRef, menuRef]\n );\n\n useClickOutside(outsideRefs, () => close(false), open);\n\n useEscapeKey(close, open);\n\n React.useEffect(() => {\n if (!open) return;\n setHighlightedIndex(selectedRenderedIndex >= 0 ? selectedRenderedIndex : 0);\n }, [activeProviderFilter, open, selectedRenderedIndex]);\n\n // Every open starts on the model list. Deliberately keyed on `open` alone:\n // callers commonly derive `effortOptions` from the selected model, so the\n // array identity changes on every parent render, and folding that into this\n // effect would drop the user back to the model list mid-interaction.\n React.useEffect(() => {\n if (!open) return;\n setView('models');\n }, [open]);\n\n // The effort list starts on the current value so Enter is a no-op rather\n // than a surprise change.\n React.useEffect(() => {\n if (!open) return;\n const current = efforts.findIndex((option) => option.value === effort);\n setEffortHighlight(current >= 0 ? current : 0);\n }, [effort, efforts, open]);\n\n React.useEffect(() => {\n if (!open) return;\n setHighlightedIndex((current) =>\n Math.min(current, Math.max(renderedModels.length - 1, 0))\n );\n }, [open, renderedModels.length]);\n\n React.useEffect(() => {\n if (!open) return;\n requestAnimationFrame(() => {\n const target =\n view === 'effort' ? effortListRef.current : listRef.current;\n target?.focus({ preventScroll: true });\n });\n }, [open, view]);\n\n const handleTriggerKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n const handleMenuKeyDown = (event: React.KeyboardEvent) => {\n if (renderedModels.length === 0) return;\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlightedIndex((current) => (current + 1) % renderedModels.length);\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlightedIndex(\n (current) =>\n (current - 1 + renderedModels.length) % renderedModels.length\n );\n }\n if (event.key === 'Home') {\n event.preventDefault();\n setHighlightedIndex(0);\n }\n if (event.key === 'End') {\n event.preventDefault();\n setHighlightedIndex(renderedModels.length - 1);\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const highlightedModel = renderedModels[highlightedIndex]?.option;\n if (highlightedModel) {\n selectModel(highlightedModel);\n }\n }\n };\n\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? menuId : undefined}\n onClick={() => setOpen((current) => !current)}\n onKeyDown={handleTriggerKeyDown}\n data-slot=\"composer-model-selector-trigger\"\n className={cn(\n variant === 'ghost'\n ? [\n 'inline-flex max-w-full min-w-0 items-center gap-1 rounded-md px-2 py-1 text-xs',\n 'text-neutral-600 dark:text-neutral-400',\n 'transition-colors duration-150',\n 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-700 dark:hover:text-white',\n 'focus-visible:ring-primary-500 focus-visible:ring-2 focus-visible:outline-none',\n 'disabled:pointer-events-none disabled:opacity-40',\n ]\n : [\n 'inline-flex h-8 max-w-full items-center gap-1.5 rounded-full border px-2.5 text-sm font-medium',\n 'border-border bg-background text-foreground shadow-sm',\n 'hover:bg-muted/50',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n ],\n className\n )}\n >\n <span className=\"min-w-0 truncate\">\n {selectedOption?.label ?? selectedOption?.model ?? placeholder}\n </span>\n {selectedEffortOption && (\n <span\n data-slot=\"composer-model-selector-trigger-effort\"\n className=\"text-muted-foreground min-w-0 truncate font-normal\"\n >\n {selectedEffortOption.label}\n </span>\n )}\n <ChevronUp\n aria-hidden=\"true\"\n className={cn(\n 'shrink-0',\n variant === 'ghost' ? 'h-3 w-3' : 'h-3.5 w-3.5'\n )}\n />\n </button>\n\n {open &&\n createPortal(\n <div\n ref={menuRef}\n style={menuStyle}\n data-slot=\"composer-model-selector-menu\"\n className={cn(\n 'border-border bg-card text-card-foreground flex w-80 max-w-full flex-col rounded-lg border shadow-lg',\n 'animate-in fade-in overflow-hidden duration-100'\n )}\n >\n {view === 'models' && (\n <>\n <div\n data-slot=\"composer-model-selector-provider-filter\"\n className=\"border-border flex min-h-9 items-center gap-1 overflow-x-auto overflow-y-hidden border-b p-2\"\n >\n {[null, ...providers].map((provider) => {\n const selected = activeProviderFilter === provider;\n return (\n <button\n key={provider ?? 'all-providers'}\n type=\"button\"\n aria-pressed={selected}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setProvider(provider)}\n className={cn(\n 'inline-flex h-6 shrink-0 items-center justify-center rounded-full px-2.5 text-xs font-medium whitespace-nowrap transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n selected\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n >\n {provider === null\n ? anyLabel\n : (providerLabels.get(provider) ?? provider)}\n </button>\n );\n })}\n </div>\n\n <div\n ref={listRef}\n id={menuId}\n role=\"listbox\"\n aria-label={ariaLabel}\n aria-activedescendant={activeOptionId}\n tabIndex={-1}\n onKeyDown={handleMenuKeyDown}\n className=\"min-h-0 flex-1 overflow-y-auto p-1\"\n >\n {groupedModels.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-4 text-center text-sm\">\n {emptyLabel}\n </div>\n ) : (\n groupedRenderedModels.map((group) => (\n <div\n key={group.provider}\n role=\"group\"\n aria-label={\n providerLabels.get(group.provider) ?? group.provider\n }\n >\n <div className=\"text-muted-foreground px-3 py-1.5 text-xs font-semibold uppercase\">\n {providerLabels.get(group.provider) ?? group.provider}\n </div>\n {group.options.map((renderedModel) => {\n const { index, key, option: model } = renderedModel;\n\n const selected = optionKey(model) === selectedKey;\n const highlighted = index === highlightedIndex;\n\n return (\n <button\n key={key}\n id={getOptionId(index)}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => selectModel(model)}\n onMouseEnter={() => setHighlightedIndex(index)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm',\n 'focus-visible:ring-ring transition-colors focus-visible:ring-2 focus-visible:outline-none',\n highlighted && 'bg-muted',\n selected && 'bg-primary/10 text-primary'\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {model.label ?? model.model}\n </span>\n {selected && (\n <Check\n aria-hidden=\"true\"\n className=\"text-primary h-4 w-4 shrink-0\"\n />\n )}\n </button>\n );\n })}\n </div>\n ))\n )}\n </div>\n\n {efforts.length > 0 && (\n <div className=\"border-border border-t p-1\">\n <button\n type=\"button\"\n data-slot=\"composer-model-selector-effort-row\"\n aria-haspopup=\"listbox\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setView('effort')}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm',\n 'hover:bg-muted transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none'\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {effortLabel}\n </span>\n {selectedEffortOption && (\n <span className=\"text-muted-foreground min-w-0 truncate\">\n {selectedEffortOption.label}\n </span>\n )}\n <ChevronRight\n aria-hidden=\"true\"\n className=\"text-muted-foreground h-4 w-4 shrink-0 rtl:-scale-x-100\"\n />\n </button>\n </div>\n )}\n </>\n )}\n\n {view === 'effort' && (\n <>\n <div className=\"border-border flex items-center gap-1 border-b p-2\">\n <button\n type=\"button\"\n data-slot=\"composer-model-selector-effort-back\"\n aria-label={backLabel}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setView('models')}\n className={cn(\n 'inline-flex h-6 shrink-0 items-center gap-1 rounded-full px-2 text-xs font-medium',\n 'text-muted-foreground hover:bg-muted hover:text-foreground transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none'\n )}\n >\n <ChevronLeft\n aria-hidden=\"true\"\n className=\"h-3.5 w-3.5 rtl:-scale-x-100\"\n />\n {effortLabel}\n </button>\n </div>\n\n {effortHint && (\n <p className=\"text-muted-foreground px-3 pt-2 text-xs\">\n {effortHint}\n </p>\n )}\n\n <div\n ref={effortListRef}\n id={menuId}\n role=\"listbox\"\n aria-label={effortLabel}\n aria-activedescendant={activeEffortOptionId}\n tabIndex={-1}\n onKeyDown={handleEffortKeyDown}\n className=\"min-h-0 flex-1 overflow-y-auto p-1\"\n >\n {efforts.map((option, index) => {\n const selected = option.value === effort;\n const highlighted = index === effortHighlight;\n\n return (\n <button\n key={option.value}\n id={getEffortOptionId(index)}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => selectEffort(option.value)}\n onMouseEnter={() => setEffortHighlight(index)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm',\n 'focus-visible:ring-ring transition-colors focus-visible:ring-2 focus-visible:outline-none',\n highlighted && 'bg-muted',\n selected && 'bg-primary/10 text-primary'\n )}\n >\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{option.label}</span>\n {option.description && (\n <span className=\"text-muted-foreground block truncate text-xs\">\n {option.description}\n </span>\n )}\n </span>\n {option.value === defaultEffort && (\n <span className=\"bg-muted text-muted-foreground shrink-0 rounded px-1.5 py-0.5 text-xs\">\n {defaultBadgeLabel}\n </span>\n )}\n {selected && (\n <Check\n aria-hidden=\"true\"\n className=\"text-primary h-4 w-4 shrink-0\"\n />\n )}\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>,\n document.body\n )}\n </>\n );\n}\n\nComposerModelSelector.displayName = 'ComposerModelSelector';\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport type { AttachmentType, AttachmentState } from './types';\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get file type from MIME type.\n */\nfunction getFileType(mimeType: string): AttachmentType {\n if (mimeType.startsWith('image/')) return 'image';\n if (mimeType.startsWith('video/')) return 'video';\n if (mimeType.startsWith('audio/')) return 'audio';\n if (\n mimeType.includes('pdf') ||\n mimeType.includes('document') ||\n mimeType.includes('text')\n ) {\n return 'document';\n }\n return 'file';\n}\n\n/**\n * Format file size in human-readable format.\n */\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/**\n * Validate file type and size.\n */\nfunction validateFile(\n file: File,\n acceptedTypes?: string[],\n maxSize?: number\n): { valid: boolean; error?: string } {\n if (acceptedTypes && acceptedTypes.length > 0) {\n const isAccepted = acceptedTypes.some((type) => {\n if (type.startsWith('.')) {\n return file.name.toLowerCase().endsWith(type.toLowerCase());\n }\n if (type.endsWith('/*')) {\n return file.type.startsWith(type.replace('/*', '/'));\n }\n return file.type === type;\n });\n if (!isAccepted) {\n return { valid: false, error: 'File type not supported' };\n }\n }\n\n if (maxSize && file.size > maxSize) {\n return {\n valid: false,\n error: `File too large (max ${formatFileSize(maxSize)})`,\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Generate a unique ID for attachments.\n */\nfunction generateAttachmentId(): string {\n return `attachment-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * MessageComposer's historical attachment validation defaults. Shared so\n * hosts that mount `ChatComposer` (which leaves file types and size\n * unrestricted) can apply the same limits — `MessageThread` does, and\n * `AIChat` does for legacy `composerProps` consumers.\n */\nconst DEFAULT_ACCEPTED_FILE_TYPES = [\n 'image/*',\n 'video/*',\n '.pdf',\n '.doc',\n '.docx',\n];\nconst DEFAULT_MAX_FILE_SIZE = 25 * 1024 * 1024;\n\n// ============================================================================\n// Attachment Preview Item Component\n// ============================================================================\n\nexport interface AttachmentPreviewItemProps {\n /** The attachment to preview */\n attachment: {\n id: string;\n file: File;\n previewUrl?: string;\n type: AttachmentType;\n state: AttachmentState;\n progress?: number;\n error?: string;\n };\n /** Called when remove is clicked */\n onRemove: () => void;\n /** Called when retry is clicked */\n onRetry?: () => void;\n /** Disables the remove/retry actions. */\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Preview item for a pending attachment.\n */\nfunction AttachmentPreviewItem({\n attachment,\n onRemove,\n onRetry,\n disabled = false,\n className,\n}: AttachmentPreviewItemProps) {\n const { file, previewUrl, type, state, progress } = attachment;\n const isImage = type === 'image';\n const isVideo = type === 'video';\n const isUploading = state === 'uploading';\n const isFailed = state === 'failed';\n\n return (\n <div\n className={cn(\n 'group relative overflow-hidden rounded-lg',\n 'bg-neutral-100 dark:bg-neutral-800',\n 'border border-neutral-200 dark:border-neutral-700',\n isFailed && 'border-red-500',\n className\n )}\n >\n {/* Image/Video preview */}\n {(isImage || isVideo) && previewUrl ? (\n <div className=\"relative h-20 w-20\">\n {isVideo ? (\n <video\n src={previewUrl}\n aria-label={file.name}\n muted\n playsInline\n preload=\"metadata\"\n className={cn(\n 'h-full w-full object-cover',\n (isUploading || isFailed) && 'opacity-50'\n )}\n />\n ) : (\n <img\n src={previewUrl}\n alt={file.name}\n className={cn(\n 'h-full w-full object-cover',\n (isUploading || isFailed) && 'opacity-50'\n )}\n />\n )}\n {isVideo && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <svg\n aria-hidden=\"true\"\n className=\"h-6 w-6 text-white drop-shadow\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </div>\n )}\n </div>\n ) : (\n /* File preview */\n <div className=\"flex h-20 w-20 flex-col items-center justify-center p-2\">\n <svg\n aria-hidden=\"true\"\n className=\"h-8 w-8 text-neutral-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <span className=\"mt-1 max-w-full truncate px-1 text-xs text-neutral-600 dark:text-neutral-400\">\n {file.name.split('.').pop()?.toUpperCase()}\n </span>\n </div>\n )}\n\n {/* Upload progress overlay */}\n {isUploading && progress !== undefined && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50\">\n <div className=\"text-center text-white\">\n <svg\n aria-hidden=\"true\"\n className=\"mx-auto h-6 w-6 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n <span className=\"mt-1 text-xs\">{progress}%</span>\n </div>\n </div>\n )}\n\n {/* Error overlay */}\n {isFailed && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/50\">\n <div className=\"text-center\">\n <svg\n aria-hidden=\"true\"\n className=\"mx-auto h-6 w-6 text-red-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n />\n </svg>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n disabled={disabled}\n className=\"mt-1 text-xs text-white underline hover:no-underline disabled:no-underline disabled:opacity-50\"\n >\n Retry\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Remove button */}\n <button\n type=\"button\"\n onClick={onRemove}\n disabled={disabled}\n className={cn(\n 'absolute -end-1 -top-1 z-10',\n 'rounded-full p-1',\n 'bg-neutral-900 text-white',\n 'opacity-0 group-hover:opacity-100',\n 'focus:ring-primary-500 focus:opacity-100 focus:ring-2 focus:outline-none',\n 'transition-opacity',\n 'disabled:cursor-not-allowed disabled:group-hover:opacity-0'\n )}\n aria-label={`Remove ${file.name}`}\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n\n {/* File name tooltip on hover */}\n <div\n className={cn(\n 'absolute start-0 end-0 bottom-0',\n 'bg-black/70 px-1 py-0.5',\n 'opacity-0 group-hover:opacity-100',\n 'transition-opacity'\n )}\n >\n <p className=\"truncate text-xs text-white\">{file.name}</p>\n </div>\n </div>\n );\n}\n\nAttachmentPreviewItem.displayName = 'AttachmentPreviewItem';\n\n// ============================================================================\n// Attachment Picker Component\n// ============================================================================\n\nexport interface AttachmentPickerProps {\n /** Called when files are selected */\n onFilesSelected: (files: File[]) => void;\n /** Accepted file types (MIME types or extensions) */\n acceptedTypes?: string[];\n /** Maximum file size in bytes */\n maxFileSize?: number;\n /** Maximum number of files */\n maxFiles?: number;\n /** Whether multiple files can be selected */\n multiple?: boolean;\n /** Whether the picker is disabled */\n disabled?: boolean;\n /** Called when an error occurs */\n onError?: (error: string) => void;\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * A button/trigger component for selecting attachments.\n */\nconst AttachmentPicker = React.forwardRef<\n HTMLInputElement,\n AttachmentPickerProps\n>(\n (\n {\n onFilesSelected,\n acceptedTypes = DEFAULT_ACCEPTED_FILE_TYPES,\n maxFileSize = DEFAULT_MAX_FILE_SIZE,\n maxFiles = 10,\n multiple = true,\n disabled = false,\n onError,\n className,\n children,\n },\n ref\n ) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Combine refs\n React.useImperativeHandle(ref, () => inputRef.current!);\n\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files || []);\n if (files.length === 0) return;\n\n // Validate files\n const validFiles: File[] = [];\n for (const file of files.slice(0, maxFiles)) {\n const validation = validateFile(file, acceptedTypes, maxFileSize);\n if (validation.valid) {\n validFiles.push(file);\n } else if (onError) {\n onError(`${file.name}: ${validation.error}`);\n }\n }\n\n if (files.length > maxFiles && onError) {\n onError(`Maximum ${maxFiles} files allowed`);\n }\n\n if (validFiles.length > 0) {\n onFilesSelected(validFiles);\n }\n\n // Reset input\n event.target.value = '';\n };\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n accept={acceptedTypes.join(',')}\n multiple={multiple}\n onChange={handleChange}\n disabled={disabled}\n className=\"sr-only\"\n aria-label=\"Select files to attach\"\n />\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n data-slot=\"attachment-picker-button\"\n className={cn(\n 'inline-flex items-center justify-center',\n 'rounded-full p-2',\n 'text-neutral-500 hover:text-neutral-700',\n 'dark:text-neutral-400 dark:hover:text-neutral-200',\n 'hover:bg-neutral-100 dark:hover:bg-neutral-800',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'transition-colors',\n className\n )}\n aria-label=\"Attach files\"\n >\n {children || (\n <svg\n aria-hidden=\"true\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15.172 7l-6.586 6.586a2 2 0 102.828 2.828l6.414-6.586a4 4 0 00-5.656-5.656l-6.415 6.585a6 6 0 108.486 8.486L20.5 13\"\n />\n </svg>\n )}\n </button>\n </>\n );\n }\n);\n\nAttachmentPicker.displayName = 'AttachmentPicker';\n\n// ============================================================================\n// Drag Drop Zone Component\n// ============================================================================\n\nexport interface DragDropZoneProps {\n /** Called when files are dropped */\n onFilesDropped: (files: File[]) => void;\n /** Accepted file types */\n acceptedTypes?: string[];\n /** Maximum file size */\n maxFileSize?: number;\n /** Maximum number of files */\n maxFiles?: number;\n /** Whether the zone is disabled */\n disabled?: boolean;\n /** Called when an error occurs */\n onError?: (error: string) => void;\n /** Overlay text shown while dragging files over the zone. @default 'Drop files here' */\n overlayLabel?: string;\n /** Children to render inside the zone */\n children: React.ReactNode;\n className?: string;\n}\n\n/**\n * A wrapper component that accepts drag-and-drop files.\n */\nfunction DragDropZone({\n onFilesDropped,\n acceptedTypes,\n maxFileSize,\n maxFiles = 10,\n disabled = false,\n onError,\n overlayLabel = 'Drop files here',\n children,\n className,\n}: DragDropZoneProps) {\n const [isDragging, setIsDragging] = React.useState(false);\n const dragCounterRef = React.useRef(0);\n\n const handleDragEnter = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (disabled) return;\n\n dragCounterRef.current++;\n if (event.dataTransfer.items && event.dataTransfer.items.length > 0) {\n setIsDragging(true);\n }\n };\n\n const handleDragLeave = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (disabled) return;\n\n dragCounterRef.current--;\n if (dragCounterRef.current === 0) {\n setIsDragging(false);\n }\n };\n\n const handleDragOver = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n const handleDrop = (event: React.DragEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (disabled) return;\n\n setIsDragging(false);\n dragCounterRef.current = 0;\n\n const files = Array.from(event.dataTransfer.files);\n if (files.length === 0) return;\n\n // Validate files\n const validFiles: File[] = [];\n for (const file of files.slice(0, maxFiles)) {\n const validation = validateFile(file, acceptedTypes, maxFileSize);\n if (validation.valid) {\n validFiles.push(file);\n } else if (onError) {\n onError(`${file.name}: ${validation.error}`);\n }\n }\n\n if (files.length > maxFiles && onError) {\n onError(`Maximum ${maxFiles} files allowed`);\n }\n\n if (validFiles.length > 0) {\n onFilesDropped(validFiles);\n }\n };\n\n return (\n <div\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n className={cn('relative', className)}\n >\n {children}\n\n {/* Drag overlay */}\n {isDragging && (\n <div\n className={cn(\n 'absolute inset-0 z-50',\n 'flex items-center justify-center',\n 'bg-primary-50/90 dark:bg-primary-900/90',\n 'border-primary-500 border-2 border-dashed',\n 'rounded-lg'\n )}\n >\n <div className=\"text-center\">\n <svg\n aria-hidden=\"true\"\n className=\"text-primary-800 mx-auto h-12 w-12\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\"\n />\n </svg>\n <p className=\"text-primary-700 dark:text-primary-300 mt-2 text-sm font-medium\">\n {overlayLabel}\n </p>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nDragDropZone.displayName = 'DragDropZone';\n\n// ============================================================================\n// Camera Button Component (Mobile)\n// ============================================================================\n\nexport interface CameraButtonProps {\n /** Called when a photo is captured */\n onCapture: (file: File) => void;\n /** Whether to use front camera */\n useFrontCamera?: boolean;\n /** Whether the button is disabled */\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Button to capture photos from camera (mobile).\n */\nfunction CameraButton({\n onCapture,\n useFrontCamera = false,\n disabled = false,\n className,\n}: CameraButtonProps) {\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const handleClick = () => {\n inputRef.current?.click();\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (file) {\n onCapture(file);\n }\n event.target.value = '';\n };\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n capture={useFrontCamera ? 'user' : 'environment'}\n onChange={handleChange}\n disabled={disabled}\n className=\"sr-only\"\n aria-label=\"Take a photo\"\n />\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'inline-flex items-center justify-center',\n 'rounded-full p-2',\n 'text-neutral-500 hover:text-neutral-700',\n 'dark:text-neutral-400 dark:hover:text-neutral-200',\n 'hover:bg-neutral-100 dark:hover:bg-neutral-800',\n 'focus:ring-primary-500 focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'transition-colors',\n className\n )}\n aria-label=\"Take a photo\"\n >\n <svg\n aria-hidden=\"true\"\n className=\"h-5 w-5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 13a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n </button>\n </>\n );\n}\n\nCameraButton.displayName = 'CameraButton';\n\nexport {\n AttachmentPicker,\n AttachmentPreviewItem,\n DragDropZone,\n CameraButton,\n DEFAULT_ACCEPTED_FILE_TYPES,\n DEFAULT_MAX_FILE_SIZE,\n getFileType,\n formatFileSize,\n validateFile,\n generateAttachmentId,\n};\n","import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\n\n// ============================================================================\n// @mention autocomplete — consumed by ChatComposer (and, before its\n// retirement in 0.10.0, MessageComposer — it was extracted verbatim from it:\n// query detection, keyboard navigation, insertion, ARIA combobox wiring,\n// listbox rendering). Do not change semantics here without running\n// ChatComposer's test suite plus the SuperChat/AIChat consumer suites.\n// ============================================================================\n\n/**\n * A candidate for the composer's `@mention` autocomplete. Generic so any\n * surface (multi-party chat, agent picker, …) can supply its own list.\n */\nexport interface MentionOption {\n /** Stable unique key for the suggestion list. */\n id: string;\n /** Display name shown in the suggestion list. */\n label: string;\n /** Text inserted after `@` on selection. Defaults to the first word of `label`. */\n value?: string;\n /** Optional secondary text shown after the label. */\n description?: string;\n /** Optional leading node (e.g. an avatar). */\n icon?: React.ReactNode;\n /** Optional trailing meta text (e.g. a kind tag). */\n meta?: string;\n}\n\n/**\n * Find the active `@query` immediately before the caret, if any. The `@` must\n * start the string or follow whitespace, and the token must contain no spaces\n * or further `@`.\n */\nexport function activeMentionQuery(\n value: string,\n caret: number\n): { query: string; start: number } | null {\n const upToCaret = value.slice(0, caret);\n const match = /(^|\\s)@([^\\s@]*)$/.exec(upToCaret);\n if (!match) return null;\n const query = match[2];\n return { query, start: caret - query.length - 1 };\n}\n\nexport interface UseMentionAutocompleteOptions {\n /** Mention candidates. Mentions are disabled when undefined or empty. */\n options?: MentionOption[];\n /** Current composer text. */\n value: string;\n /** Write the composer text (host handles controlled/uncontrolled). */\n setValue: (next: string) => void;\n /** The composer textarea, for caret restore after insertion. */\n textareaRef: React.RefObject<HTMLTextAreaElement | null>;\n}\n\nexport interface MentionAutocomplete {\n /** Whether mention support is active (options provided and non-empty). */\n enabled: boolean;\n /** Whether the suggestion menu is currently open. */\n menuOpen: boolean;\n /** Suggestions matching the active query. */\n suggestions: MentionOption[];\n /** Clamped highlight index (`-1` while the menu is closed). */\n highlight: number;\n /** id of the listbox element. */\n listId: string;\n /** id for the option at `index`. */\n optionId: (index: number) => string;\n /** Ref for the element the menu anchors to (the input wrapper). */\n anchorRef: React.RefObject<HTMLDivElement | null>;\n /** Ref for the floating listbox. */\n floatingRef: React.RefObject<HTMLUListElement | null>;\n /** Fixed-position style for the floating listbox. */\n menuStyle: React.CSSProperties;\n /** Re-derive the active query from the value and caret position. */\n sync: (value: string, caret: number) => void;\n /** Insert the given option at the active query and restore the caret. */\n insert: (option: MentionOption) => void;\n /** Move the highlight (mouse hover). */\n setHighlight: (index: number) => void;\n /**\n * Menu keyboard navigation. Returns `true` when the event was consumed\n * (callers must skip their own key handling, e.g. Enter-to-send).\n */\n handleKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => boolean;\n /** ARIA combobox attributes to spread onto the textarea. */\n inputProps: React.TextareaHTMLAttributes<HTMLTextAreaElement>;\n}\n\n/**\n * State machine for `@mention` autocomplete in a composer textarea. Pair with\n * {@link MentionMenu} for the floating listbox.\n */\nexport function useMentionAutocomplete({\n options,\n value,\n setValue,\n textareaRef,\n}: UseMentionAutocompleteOptions): MentionAutocomplete {\n const enabled = !!options && options.length > 0;\n const [mention, setMention] = React.useState<{\n query: string;\n start: number;\n } | null>(null);\n const [highlight, setHighlight] = React.useState(0);\n const listId = React.useId();\n const optionId = React.useCallback(\n (index: number) => `${listId}-option-${index}`,\n [listId]\n );\n\n const suggestions = React.useMemo(() => {\n if (!mention || !options) return [];\n const q = mention.query.toLowerCase();\n return options.filter((o) => o.label.toLowerCase().includes(q));\n }, [mention, options]);\n\n const menuOpen = enabled && mention !== null && suggestions.length > 0;\n\n // Portal + fixed positioning so the mention menu escapes overflow-hidden\n // ancestors.\n const {\n anchorRef,\n floatingRef,\n style: menuStyle,\n } = useAnchoredPosition<HTMLDivElement, HTMLUListElement>({\n open: menuOpen,\n placement: 'top-start',\n maxHeight: 224,\n });\n\n // Clamp the highlight to the current suggestion range so the active option\n // never points at a stale/out-of-range index (the list can shrink while the\n // menu is open as the query narrows). The same clamped index drives\n // `aria-activedescendant`, `aria-selected`, and the visual highlight so they\n // can never disagree.\n const clampedHighlight = menuOpen\n ? Math.min(highlight, suggestions.length - 1)\n : -1;\n const activeOptionId = menuOpen ? optionId(clampedHighlight) : undefined;\n\n const sync = React.useCallback(\n (nextValue: string, caret: number) => {\n if (!enabled) return;\n setMention(activeMentionQuery(nextValue, caret));\n setHighlight(0);\n },\n [enabled]\n );\n\n const insert = (option: MentionOption) => {\n if (!mention) return;\n const insertValue = option.value ?? option.label.split(' ')[0];\n const before = value.slice(0, mention.start);\n const after = value.slice(mention.start + 1 + mention.query.length);\n const insertText = `@${insertValue} `;\n setValue(before + insertText + after);\n setMention(null);\n // Restore caret just after the inserted mention.\n const caret = before.length + insertText.length;\n requestAnimationFrame(() => {\n const el = textareaRef.current;\n if (el) {\n el.focus();\n el.setSelectionRange(caret, caret);\n }\n });\n };\n\n const handleKeyDown = (\n event: React.KeyboardEvent<HTMLTextAreaElement>\n ): boolean => {\n if (!menuOpen) return false;\n // All keyboard branches index with the clamped highlight so keyboard\n // behavior always agrees with the visible/ARIA selection, even when the\n // list shrank while the menu was open (e.g. the host swapped `options`\n // asynchronously).\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlight(\n (h) => (Math.min(h, suggestions.length - 1) + 1) % suggestions.length\n );\n return true;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlight(\n (h) =>\n (Math.min(h, suggestions.length - 1) - 1 + suggestions.length) %\n suggestions.length\n );\n return true;\n }\n if (event.key === 'Enter' || event.key === 'Tab') {\n event.preventDefault();\n const chosen = suggestions[clampedHighlight];\n if (chosen) insert(chosen);\n return true;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n setMention(null);\n return true;\n }\n return false;\n };\n\n const inputProps: React.TextareaHTMLAttributes<HTMLTextAreaElement> = enabled\n ? {\n 'aria-controls': menuOpen ? listId : undefined,\n 'aria-activedescendant': activeOptionId,\n 'aria-autocomplete': 'list' as const,\n }\n : {};\n\n return {\n enabled,\n menuOpen,\n suggestions,\n highlight: clampedHighlight,\n listId,\n optionId,\n anchorRef,\n floatingRef,\n menuStyle,\n sync,\n insert,\n setHighlight,\n handleKeyDown,\n inputProps,\n };\n}\n\nexport interface MentionMenuProps {\n /** State returned by {@link useMentionAutocomplete}. */\n mention: MentionAutocomplete;\n /** Accessible label for the listbox. @default 'Mention' */\n label?: string;\n /** `data-slot` for the listbox. @default 'composer-mention-list' */\n dataSlot?: string;\n}\n\n/**\n * The floating `@mention` suggestion listbox. Rendered in a portal so it\n * escapes overflow-hidden ancestors; renders nothing while closed.\n */\nexport function MentionMenu({\n mention,\n label = 'Mention',\n dataSlot = 'composer-mention-list',\n}: MentionMenuProps) {\n if (!mention.menuOpen) return null;\n return createPortal(\n <ul\n ref={mention.floatingRef}\n style={mention.menuStyle}\n id={mention.listId}\n role=\"listbox\"\n aria-label={label}\n data-slot={dataSlot}\n className=\"w-64 overflow-y-auto rounded-lg border border-neutral-200 bg-white py-1 shadow-lg dark:border-neutral-700 dark:bg-neutral-800\"\n >\n {mention.suggestions.map((option, i) => (\n <li key={option.id}>\n <button\n type=\"button\"\n id={mention.optionId(i)}\n role=\"option\"\n aria-selected={i === mention.highlight}\n // onMouseDown (not onClick) so the textarea keeps focus.\n onMouseDown={(e) => {\n e.preventDefault();\n mention.insert(option);\n }}\n onMouseEnter={() => mention.setHighlight(i)}\n className={cn(\n 'flex w-full items-center gap-2 px-3 py-1.5 text-start text-sm',\n i === mention.highlight\n ? 'bg-primary-100 text-primary-900 dark:bg-primary-900/40 dark:text-primary-100'\n : 'text-neutral-700 dark:text-neutral-200'\n )}\n >\n {option.icon}\n <span className=\"min-w-0 flex-1 truncate\">\n <span className=\"font-medium\">{option.label}</span>\n {option.description && (\n <span className=\"ms-1 text-xs text-neutral-400\">\n {option.description}\n </span>\n )}\n </span>\n {option.meta && (\n <span className=\"text-[10px] text-neutral-400\">\n {option.meta}\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>,\n document.body\n );\n}\n\nMentionMenu.displayName = 'MentionMenu';\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Dropdown, DropdownItem, DropdownSeparator } from '../Dropdown';\nimport {\n ComposerModelSelector,\n type ComposerModelSelectorProps,\n} from '../AI/ComposerModelSelector';\nimport {\n AttachmentPreviewItem,\n DragDropZone,\n getFileType,\n validateFile,\n generateAttachmentId,\n} from '../Messaging/AttachmentPicker';\nimport {\n MentionMenu,\n useMentionAutocomplete,\n type MentionOption,\n} from '../Messaging/useMentionAutocomplete';\nimport type { AttachmentType, NewMessage } from '../Messaging/types';\nimport {\n AlertTriangleIcon,\n ArrowUpIcon,\n BotIcon,\n CheckIcon,\n ChevronUpIcon,\n LoaderIcon,\n MicIcon,\n PaperclipIcon,\n PlusIcon,\n StopIcon,\n XIcon,\n} from '../Icons';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** A file staged for sending, with preview metadata. */\ninterface StagedAttachment {\n id: string;\n file: File;\n previewUrl?: string;\n type: AttachmentType;\n}\n\n/** An entry in the composer's `+` menu. */\nexport interface ChatComposerMenuItem {\n /** Stable id (used as the React key). */\n id: string;\n /** Display label. */\n label: React.ReactNode;\n /** Optional leading icon. */\n icon?: React.ReactNode;\n /** Whether the item is disabled. */\n disabled?: boolean;\n /**\n * Toggle state. When set (true or false) the item renders as a\n * `menuitemcheckbox` with `aria-checked` and a leading checkbox.\n */\n checked?: boolean;\n /** Danger styling for destructive actions. */\n variant?: 'default' | 'danger';\n /** Called when the item is selected. */\n onSelect?: () => void;\n}\n\n/** An agent shown in the composer's agent selector. */\nexport interface ChatComposerAgentOption {\n /** Stable id (returned via `onAgentChange`). */\n id: string;\n /** Display label. */\n label: string;\n /** Optional leading icon (defaults to a bot glyph in the trigger). */\n icon?: React.ReactNode;\n /** Optional secondary text shown in the menu. */\n description?: string;\n}\n\n/** Imperative handle exposed via `ref` for host-level integrations. */\nexport interface ChatComposerHandle {\n /**\n * Stage files programmatically (e.g. from a page-level drop zone or a\n * camera capture in `micSlot`). Deliberately NOT gated by\n * `allowAttachments` — that prop only hides the composer's own attach\n * affordances (the + button, paste, internal drop zone). Imperative calls\n * are explicit host actions; validation and `onError` still apply.\n */\n addFiles: (files: File[]) => void;\n /** Focus the text input. */\n focus: () => void;\n /**\n * The underlying textarea element, for host integrations that need caret\n * access (e.g. mention insertion via `setSelectionRange`).\n */\n getTextarea: () => HTMLTextAreaElement | null;\n}\n\n/** Structured context passed to `onError` so hosts can localize by reason. */\nexport interface ChatComposerError {\n reason: 'file-type' | 'file-size' | 'attachment-limit' | 'send-failed';\n /** The rejected file, when the error concerns a single file. */\n file?: File;\n}\n\nexport interface ChatComposerProps {\n /** Called when the user sends a message. */\n onSend?: (message: NewMessage) => void | Promise<void>;\n /** Controlled input value. Leave undefined for uncontrolled usage. */\n value?: string;\n /** Called when the input value changes. */\n onValueChange?: (value: string) => void;\n /** Placeholder text for the input. */\n placeholder?: string;\n /**\n * Disables all built-in interaction. Custom content (`micSlot`,\n * `addMenuItems` icons) is rendered as-is — hosts must disable their own\n * controls when they disable the composer.\n */\n disabled?: boolean;\n /** Shows the send button in a busy state and prevents duplicate sends. */\n isSending?: boolean;\n /** Autofocus the input on mount. */\n autoFocus?: boolean;\n /** Maximum message length. Sends are blocked while over the limit. */\n maxLength?: number;\n /** Show a character counter (requires `maxLength`). */\n showCharacterCount?: boolean;\n /**\n * Allow sending while the composer itself is empty (e.g. when the host\n * stages attachments outside the composer). The host receives a message\n * with empty `content` and no attachments and owns any further guarding.\n * @default false\n */\n canSendWhenEmpty?: boolean;\n /**\n * When the Enter key sends. `'desktop'` sends on Enter only on devices\n * with a fine pointer; on touch devices Return inserts a newline and the\n * send button sends (claude.ai / chatgpt.com parity). Shift+Enter always\n * inserts a newline, and Enter never sends mid IME composition.\n * @default 'desktop'\n */\n submitOnEnter?: 'desktop' | 'always' | 'never';\n /**\n * Maximum height of the auto-growing input: a pixel number or any CSS\n * length. Prefer small-viewport units (e.g. `'30svh'`) over `vh`: on iOS\n * `vh` is the full screen and ignores the on-screen keyboard.\n * @default 160\n */\n maxHeight?: number | string;\n /**\n * Extra props spread onto the underlying textarea. Event handlers run\n * before the composer's built-in handlers; call `event.preventDefault()`\n * in `onKeyDown` / `onPaste` to claim that event (e.g. for a mention\n * menu's arrow/Enter navigation). `className` and `style` are merged\n * with the composer's own.\n */\n textareaProps?: Omit<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'value' | 'defaultValue'\n >;\n\n /**\n * Custom node rendered at the leading edge, before the `+` menu (e.g. a\n * voice-activation toggle). Wrapped in a 32px-tall (`h-8`) flex row so it\n * aligns with the other controls; taller content overflows and stays\n * vertically centered. Interaction state is not managed: pass your own\n * disabled state when the composer is `disabled`.\n */\n leadingSlot?: React.ReactNode;\n /** Extra entries for the `+` menu, rendered after the built-in items. */\n addMenuItems?: ChatComposerMenuItem[];\n /** Enable file attachments (built-in \"Attach files\" menu item, paste-to-attach, drag-and-drop, chips). @default true */\n allowAttachments?: boolean;\n /** Accepted file types for the picker/paste validation (native `accept` tokens). */\n acceptedFileTypes?: string[];\n /** Maximum file size in bytes. */\n maxFileSize?: number;\n /** Maximum number of staged attachments. @default 10 */\n maxAttachments?: number;\n\n /**\n * Candidates for `@mention` autocomplete. When provided (non-empty), typing\n * `@` opens a suggestion listbox (same behavior as `MessageComposer`).\n * Omit to disable mentions entirely (default).\n */\n mentionOptions?: MentionOption[];\n\n /**\n * Message being replied to. When set, a dismissible preview row renders at\n * the top of the card, the input is focused, and the sent `NewMessage`\n * carries `replyToId`. The host owns the state: sending does not clear it\n * (clear it in `onSend`), and the preview's close button only calls\n * `onCancelReply`. Same contract as `MessageComposer`.\n */\n replyTo?: {\n id: string;\n content: string;\n senderName: string;\n } | null;\n /** Called when the reply preview's cancel button is clicked. */\n onCancelReply?: () => void;\n\n /** Show the built-in mic button. @default false */\n showMic?: boolean;\n /** Called when the built-in mic button is clicked. */\n onMicClick?: () => void;\n /**\n * Custom node rendered in place of the built-in mic button (e.g.\n * `RecordButton`). The slot is wrapped in a 32px-tall (`h-8`) flex row so it\n * aligns with the other composer controls; taller content overflows and\n * stays vertically centered without inflating the row. Interaction state is\n * not managed: pass your own disabled state when the composer is `disabled`.\n */\n micSlot?: React.ReactNode;\n /** When to show the mic: always, or only while the composer is empty. @default 'always' */\n micBehavior?: 'always' | 'whenEmpty';\n\n /** While true, the send button becomes a stop button (requires `onStop`). */\n isStreaming?: boolean;\n /** Called when the stop button is clicked during streaming. */\n onStop?: () => void;\n\n /** Show the agent selector in the bottom row. @default false */\n showAgentSelector?: boolean;\n /** Agents available in the agent selector. */\n agents?: ChatComposerAgentOption[];\n /** Selected agent id (controlled). */\n selectedAgent?: string | null;\n /** Called when an agent is selected. */\n onAgentChange?: (agentId: string) => void;\n\n /** Show the model selector in the bottom row. @default false */\n showModelSelector?: boolean;\n /** Props passed through to the embedded `ComposerModelSelector`. */\n modelSelectorProps?: ComposerModelSelectorProps;\n\n /** Replaces the composer with a read-only notice. */\n readOnly?: boolean;\n /** Notice text shown when `readOnly` is set. */\n readOnlyMessage?: string;\n\n /**\n * Called when a file is rejected or a send fails. `message` is a default\n * English string; `context.reason` lets hosts substitute localized copy.\n */\n onError?: (message: string, context?: ChatComposerError) => void;\n\n /** Message reported when the attachment limit is hit. Overrides the English default. */\n attachmentLimitLabel?: string;\n /** Message reported when an async `onSend` rejects. @default 'Failed to send message' */\n sendFailedLabel?: string;\n /** Accessible label for the send button while `isSending`. @default 'Sending message…' */\n sendingLabel?: string;\n\n /** Accessible label for the text input. @default 'Message input' */\n inputLabel?: string;\n /** Accessible label for the `+` menu trigger. @default 'Add to message' */\n addMenuLabel?: string;\n /** Label for the built-in attach menu item. @default 'Attach files' */\n attachFilesLabel?: string;\n /** Accessible label for the built-in mic button. @default 'Start voice input' */\n micLabel?: string;\n /** Accessible label for the send button. @default 'Send message' */\n sendLabel?: string;\n /** Accessible label for the stop button. @default 'Stop generating' */\n stopLabel?: string;\n /** Accessible label / empty-state text for the agent selector. @default 'Select agent' */\n agentSelectorLabel?: string;\n /** Accessible label for the `@mention` suggestion listbox. @default 'Mention' */\n mentionListLabel?: string;\n /** Overlay text shown while dragging files over the composer. @default 'Drop files here' */\n dropFilesLabel?: string;\n /** Prefix shown before the sender name in the reply preview. @default 'Replying to' */\n replyingToLabel?: string;\n /** Accessible label for the reply preview's cancel button. @default 'Cancel reply' */\n cancelReplyLabel?: string;\n\n className?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst iconButtonClasses = cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-lg',\n 'text-neutral-500 dark:text-neutral-400',\n 'transition-colors duration-150',\n 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-700 dark:hover:text-white',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500',\n 'disabled:pointer-events-none disabled:opacity-40'\n);\n\nconst selectorTriggerClasses = cn(\n 'flex min-w-0 items-center gap-1 rounded-md px-2 py-1 text-xs',\n 'text-neutral-600 dark:text-neutral-400',\n 'transition-colors duration-150',\n 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-700 dark:hover:text-white',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500',\n 'disabled:pointer-events-none disabled:opacity-40'\n);\n\nconst MAX_INPUT_HEIGHT = 160;\n\n/** Touch-first devices (phones, tablets without a trackpad). */\nconst TOUCH_DEVICE_QUERY = '(hover: none) and (pointer: coarse)';\n\n// Touch detection as an external store: during hydration React renders the\n// server snapshot (fine pointer) and then re-renders with the client value,\n// so SSR-emitted attributes like `enterkeyhint` never go stale.\nconst subscribeTouchDevice = (onChange: () => void) => {\n const query = window.matchMedia?.(TOUCH_DEVICE_QUERY);\n query?.addEventListener('change', onChange);\n return () => query?.removeEventListener('change', onChange);\n};\nconst getTouchDeviceSnapshot = () =>\n window.matchMedia?.(TOUCH_DEVICE_QUERY).matches ?? false;\nconst getServerTouchDeviceSnapshot = () => false;\n\n/**\n * Card descendants that keep their own pointer behavior (and text that\n * stays selectable) instead of forwarding a tap to the textarea.\n */\nconst CARD_INTERACTIVE_SELECTOR = [\n 'button',\n 'a',\n 'input',\n 'textarea',\n 'select',\n 'label',\n 'video',\n '[role=\"listbox\"]',\n '[role=\"menu\"]',\n '[data-slot=\"chat-composer-reply-preview\"]',\n '[data-slot=\"chat-composer-attachments\"]',\n].join(',');\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Standardized chat input. At `md+` it renders as a single-row pill — `+`\n * menu, text input and actions (mic, send/stop) side by side; below `md` the\n * input stacks above the icon row. The optional agent/model selector row\n * hangs below the card on the page background.\n */\nexport const ChatComposer = React.forwardRef<\n ChatComposerHandle,\n ChatComposerProps\n>(function ChatComposer(\n {\n onSend,\n value: controlledValue,\n onValueChange,\n placeholder = 'Type a message…',\n disabled = false,\n isSending = false,\n autoFocus = false,\n maxLength,\n showCharacterCount = false,\n canSendWhenEmpty = false,\n submitOnEnter = 'desktop',\n maxHeight = MAX_INPUT_HEIGHT,\n textareaProps,\n leadingSlot,\n addMenuItems,\n allowAttachments = true,\n acceptedFileTypes,\n maxFileSize,\n maxAttachments = 10,\n mentionOptions,\n replyTo = null,\n onCancelReply,\n showMic = false,\n onMicClick,\n micSlot,\n micBehavior = 'always',\n isStreaming = false,\n onStop,\n showAgentSelector = false,\n agents = [],\n selectedAgent = null,\n onAgentChange,\n showModelSelector = false,\n modelSelectorProps,\n readOnly = false,\n readOnlyMessage = 'You have read-only access and cannot send messages.',\n onError,\n attachmentLimitLabel,\n sendFailedLabel = 'Failed to send message',\n sendingLabel = 'Sending message…',\n inputLabel = 'Message input',\n addMenuLabel = 'Add to message',\n attachFilesLabel = 'Attach files',\n micLabel = 'Start voice input',\n sendLabel = 'Send message',\n stopLabel = 'Stop generating',\n agentSelectorLabel = 'Select agent',\n mentionListLabel = 'Mention',\n dropFilesLabel = 'Drop files here',\n replyingToLabel = 'Replying to',\n cancelReplyLabel = 'Cancel reply',\n className,\n },\n ref\n) {\n const [internalValue, setInternalValue] = React.useState('');\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : internalValue;\n\n const [attachments, setAttachments] = React.useState<StagedAttachment[]>([]);\n const attachmentsRef = React.useRef(attachments);\n attachmentsRef.current = attachments;\n\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n\n const [addMenuOpen, setAddMenuOpen] = React.useState(false);\n const [agentMenuOpen, setAgentMenuOpen] = React.useState(false);\n\n const isTouchDevice = React.useSyncExternalStore(\n subscribeTouchDevice,\n getTouchDeviceSnapshot,\n getServerTouchDeviceSnapshot\n );\n const sendsOnEnter =\n submitOnEnter === 'always' ||\n (submitOnEnter === 'desktop' && !isTouchDevice);\n\n // Focus the input when a reply target is set (MessageComposer parity).\n // Keyed on the id, not the object: hosts often build `replyTo` inline, so\n // an object dependency would re-steal focus (and reset the caret) on every\n // parent render while the user is typing.\n const replyToId = replyTo?.id;\n React.useEffect(() => {\n if (replyToId !== undefined) {\n textareaRef.current?.focus();\n }\n }, [replyToId]);\n\n // Host-opt-in autofocus, applied on the client only after confirming a\n // fine pointer. A rendered `autofocus` attribute would ship in SSR markup\n // (where the touch check can't run) and pop the on-screen keyboard over\n // the page the user just navigated to.\n React.useEffect(() => {\n if (!autoFocus) return;\n if (window.matchMedia?.(TOUCH_DEVICE_QUERY).matches) return;\n textareaRef.current?.focus();\n // Mount-only, matching native `autofocus` semantics.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const hasText = value.trim().length > 0;\n const hasContent = hasText || attachments.length > 0;\n const isOverLimit = maxLength !== undefined && value.length > maxLength;\n // Without an onSend handler, sending would silently discard the draft.\n const canSend =\n (hasContent || canSendWhenEmpty) &&\n onSend !== undefined &&\n !disabled &&\n !isSending &&\n !isStreaming &&\n !isOverLimit;\n\n // --------------------------------------------------------------------\n // Input handling\n // --------------------------------------------------------------------\n\n const setValue = React.useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n },\n [isControlled, onValueChange]\n );\n\n // @mention autocomplete (opt-in via `mentionOptions`) — shared with\n // MessageComposer so both composers behave identically.\n const mention = useMentionAutocomplete({\n options: mentionOptions,\n value,\n setValue,\n textareaRef,\n });\n\n // Auto-grow the textarea. The cap is enforced with CSS max-height so it\n // can be any CSS length (e.g. '40vh'), not just a pixel number.\n const resizeTextarea = React.useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.style.height = 'auto';\n // While the textarea is not laid out (hidden container, e.g. a\n // just-mounted Storybook story or a closed panel) scrollHeight is 0 —\n // keep height auto and let the ResizeObserver below re-measure once\n // the element becomes visible.\n if (textarea.scrollHeight === 0) return;\n textarea.style.height = `${textarea.scrollHeight}px`;\n }, []);\n\n React.useLayoutEffect(resizeTextarea, [resizeTextarea, value]);\n\n // Re-measure when the textarea's box changes for reasons other than\n // typing: the container becoming visible, width changes, font loading,\n // or crossing the md breakpoint (different paddings).\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea || typeof ResizeObserver === 'undefined') return;\n // Defer the re-measure to the next frame: mutating the observed\n // element's height synchronously inside the observer callback triggers\n // the browser's \"ResizeObserver loop completed with undelivered\n // notifications\" error, which dev overlays surface as a runtime error.\n let frame = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(resizeTextarea);\n });\n observer.observe(textarea);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [resizeTextarea]);\n\n // --------------------------------------------------------------------\n // Attachments\n // --------------------------------------------------------------------\n\n const addFiles = React.useCallback(\n (files: File[]) => {\n // No `allowAttachments` gate here: every user-facing entry point\n // (paste handler, + button, internal drop zone) is gated separately,\n // so this only opens the imperative `ref.addFiles()` path for hosts\n // (e.g. MessageThread's camera capture with the picker disabled).\n if (files.length === 0) return;\n // Staging happens outside the state updater so object-URL creation,\n // id generation and onError stay out of a function React may re-invoke.\n const limitMessage =\n attachmentLimitLabel ??\n `Attachment limit reached (max ${maxAttachments})`;\n const room = maxAttachments - attachmentsRef.current.length;\n if (files.length > room) {\n onError?.(limitMessage, { reason: 'attachment-limit' });\n if (room <= 0) return;\n }\n const staged: StagedAttachment[] = [];\n for (const file of files.slice(0, Math.max(room, 0))) {\n const typeCheck = validateFile(file, acceptedFileTypes, undefined);\n if (!typeCheck.valid) {\n onError?.(`${file.name}: ${typeCheck.error}`, {\n reason: 'file-type',\n file,\n });\n continue;\n }\n const sizeCheck = validateFile(file, undefined, maxFileSize);\n if (!sizeCheck.valid) {\n onError?.(`${file.name}: ${sizeCheck.error}`, {\n reason: 'file-size',\n file,\n });\n continue;\n }\n const type = getFileType(file.type);\n staged.push({\n id: generateAttachmentId(),\n file,\n type,\n previewUrl:\n type === 'image' || type === 'video'\n ? URL.createObjectURL(file)\n : undefined,\n });\n }\n if (staged.length > 0) {\n // Reserve slots synchronously: a second addFiles call in the same\n // React batch reads attachmentsRef before re-render, so without this\n // both calls could see the same free room and overshoot the cap.\n attachmentsRef.current = [...attachmentsRef.current, ...staged];\n setAttachments((current) => [...current, ...staged]);\n }\n },\n [\n maxAttachments,\n acceptedFileTypes,\n maxFileSize,\n onError,\n attachmentLimitLabel,\n ]\n );\n\n const removeAttachment = React.useCallback((id: string) => {\n // Same discipline as addFiles: revoke and update the ref synchronously,\n // keep the state updater pure (StrictMode may re-invoke it).\n const target = attachmentsRef.current.find(\n (attachment) => attachment.id === id\n );\n if (target?.previewUrl) URL.revokeObjectURL(target.previewUrl);\n attachmentsRef.current = attachmentsRef.current.filter(\n (attachment) => attachment.id !== id\n );\n setAttachments((current) =>\n current.filter((attachment) => attachment.id !== id)\n );\n }, []);\n\n // Revoke any outstanding preview URLs on unmount.\n React.useEffect(() => {\n return () => {\n for (const attachment of attachmentsRef.current) {\n if (attachment.previewUrl) URL.revokeObjectURL(attachment.previewUrl);\n }\n };\n }, []);\n\n const handleFileInputChange = (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const files = Array.from(event.target.files ?? []);\n addFiles(files);\n event.target.value = '';\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (!allowAttachments) return;\n const files = Array.from(event.clipboardData.files);\n if (files.length > 0) {\n event.preventDefault();\n addFiles(files);\n }\n };\n\n React.useImperativeHandle(\n ref,\n () => ({\n addFiles,\n focus: () => textareaRef.current?.focus(),\n getTextarea: () => textareaRef.current,\n }),\n [addFiles]\n );\n\n // --------------------------------------------------------------------\n // Sending\n // --------------------------------------------------------------------\n\n const handleSend = () => {\n if (!canSend || !onSend) return;\n const message: NewMessage = {\n content: value.trim(),\n attachments: attachments.map((attachment) => attachment.file),\n // Only add the key when replying — hosts may key-check the payload.\n ...(replyTo ? { replyToId: replyTo.id } : {}),\n };\n for (const attachment of attachments) {\n if (attachment.previewUrl) URL.revokeObjectURL(attachment.previewUrl);\n }\n // Clear the ref alongside the state: the unmount cleanup reads the ref,\n // so if onSend unmounts the composer synchronously it must not see (and\n // re-revoke) the already-revoked preview URLs.\n attachmentsRef.current = [];\n setAttachments([]);\n setValue('');\n // The draft is cleared optimistically; hosts own retry/restore. Both a\n // synchronous throw and a rejected promise surface through onError\n // instead of being swallowed.\n try {\n Promise.resolve(onSend(message)).catch(() => {\n onError?.(sendFailedLabel, { reason: 'send-failed' });\n });\n } catch {\n onError?.(sendFailedLabel, { reason: 'send-failed' });\n }\n textareaRef.current?.focus();\n };\n\n // Pressing a button moves focus off the textarea, which on mobile starts\n // dismissing the keyboard before `handleSend` refocuses it (a visible\n // close/reopen bounce). Cancelling mousedown keeps focus where it is; the\n // click still fires, and keyboard users can still tab to the button.\n const keepInputFocus = (event: React.MouseEvent) => {\n event.preventDefault();\n };\n\n // Tapping the card's padding or empty toolbar space focuses the input\n // (claude.ai / chatgpt.com parity) instead of doing nothing — or, with the\n // keyboard open, blurring the input and dismissing it.\n const focusInputFromCard = (event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n const target = event.target as HTMLElement;\n if (target.closest(CARD_INTERACTIVE_SELECTOR)) return;\n event.preventDefault();\n textareaRef.current?.focus();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // @mention menu navigation takes priority over send.\n if (mention.handleKeyDown(event)) return;\n // Enter confirms an IME candidate (CJK input) rather than sending.\n if (event.nativeEvent.isComposing) return;\n if (event.key === 'Enter' && !event.shiftKey && sendsOnEnter) {\n event.preventDefault();\n handleSend();\n }\n };\n\n // --------------------------------------------------------------------\n // Render\n // --------------------------------------------------------------------\n\n if (readOnly) {\n return (\n <div\n data-slot=\"chat-composer\"\n // A live status region (implicit aria-live=\"polite\"): readOnly can\n // flip at runtime (e.g. after permissions resolve), and screen-reader\n // users must be told the input became read-only.\n role=\"status\"\n className={cn(\n 'flex items-center gap-2 rounded-xl border px-4 py-3 text-sm',\n 'border-amber-300 bg-amber-50 text-amber-900',\n 'dark:border-amber-700 dark:bg-amber-950 dark:text-amber-200',\n className\n )}\n >\n <AlertTriangleIcon className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n <span data-slot=\"chat-composer-readonly\">{readOnlyMessage}</span>\n </div>\n );\n }\n\n const showAddMenu =\n allowAttachments || (addMenuItems && addMenuItems.length > 0);\n const micVisible =\n (showMic || onMicClick !== undefined || micSlot !== undefined) &&\n (micBehavior === 'always' || !hasContent);\n const showSelectorRow = showAgentSelector || showModelSelector;\n const selectedAgentOption =\n agents.find((agent) => agent.id === selectedAgent) ?? null;\n\n // One responsive grid: below `md` the input sits on row 1 spanning all\n // columns with the `+`/actions on row 2; at `md+` the `+`, input and\n // actions sit side by side on row 1 as a single pill (actions pin to the\n // bottom via self-end as the input grows).\n const cells = {\n input:\n 'col-span-3 col-start-1 row-start-1 px-1 pt-1 md:col-span-1 md:col-start-2 md:self-end md:px-0 md:py-1.5',\n textarea: 'px-2 pt-2 pb-1 md:py-1.5',\n add: 'col-start-1 row-start-2 pb-2 ps-2 md:row-start-1 md:self-end md:p-1.5 md:pe-0.5',\n actions:\n 'col-start-3 row-start-2 flex items-center gap-1 pb-2 pe-2 md:row-start-1 md:self-end md:gap-0.5 md:p-1.5 md:ps-0.5',\n };\n\n const composerCard = (\n <>\n {replyTo && (\n <div\n data-slot=\"chat-composer-reply-preview\"\n className={cn(\n 'flex items-center gap-2 rounded-t-2xl px-4 py-2',\n 'bg-neutral-50 dark:bg-neutral-800/50',\n 'border-b border-neutral-200 dark:border-neutral-700',\n 'border-s-primary-500 border-s-4'\n )}\n >\n {/* role=\"status\" politely announces the reply target to screen readers\n when the row is inserted (focus jumps to the textarea, so the text\n would otherwise be skipped). The cancel button stays outside it. */}\n <div role=\"status\" className=\"min-w-0 flex-1\">\n <span className=\"text-primary-800 dark:text-primary-400 block text-xs font-medium\">\n {replyingToLabel} {replyTo.senderName}\n </span>\n <p className=\"truncate text-sm text-neutral-600 dark:text-neutral-300\">\n {replyTo.content}\n </p>\n </div>\n <button\n type=\"button\"\n data-slot=\"chat-composer-cancel-reply\"\n aria-label={cancelReplyLabel}\n disabled={disabled}\n onClick={onCancelReply}\n className={iconButtonClasses}\n >\n <XIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n\n {attachments.length > 0 && (\n <div\n data-slot=\"chat-composer-attachments\"\n className=\"flex flex-wrap gap-2 px-3 pt-3\"\n >\n {attachments.map((attachment) => (\n <AttachmentPreviewItem\n key={attachment.id}\n attachment={{ ...attachment, state: 'pending' }}\n onRemove={() => removeAttachment(attachment.id)}\n disabled={disabled}\n />\n ))}\n </div>\n )}\n\n <div className=\"grid grid-cols-[auto_minmax(0,1fr)_auto]\">\n {/* Inset cell: the textarea sits inside the card with a matching\n inner radius so focus outlines / a11y highlights render as a\n clean nested rounded rect instead of stacking on the card's\n border. The padding split (cell + textarea) keeps the text in\n place using only standard utilities. */}\n <div className={cells.input} ref={mention.anchorRef}>\n <MentionMenu\n mention={mention}\n label={mentionListLabel}\n dataSlot=\"chat-composer-mention-list\"\n />\n <textarea\n // Mobile keyboard hints; overridable via `textareaProps`.\n enterKeyHint={sendsOnEnter ? 'send' : 'enter'}\n inputMode=\"text\"\n autoCapitalize=\"sentences\"\n autoCorrect=\"on\"\n spellCheck\n // Follows the typed script, so RTL text aligns correctly.\n dir=\"auto\"\n {...textareaProps}\n ref={textareaRef}\n data-slot=\"chat-composer-input\"\n value={value}\n onChange={(event) => {\n textareaProps?.onChange?.(event);\n setValue(event.target.value);\n mention.sync(\n event.target.value,\n event.target.selectionStart ?? event.target.value.length\n );\n }}\n // Host handlers run first; preventDefault() opts out of the\n // built-in behavior (mention menu, Enter-to-send,\n // paste-to-attach).\n onKeyDown={(event) => {\n textareaProps?.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n handleKeyDown(event);\n }}\n onClick={(event) => {\n textareaProps?.onClick?.(event);\n if (event.defaultPrevented) return;\n const el = event.currentTarget;\n mention.sync(el.value, el.selectionStart ?? el.value.length);\n }}\n onPaste={(event) => {\n textareaProps?.onPaste?.(event);\n if (event.defaultPrevented) return;\n handlePaste(event);\n }}\n placeholder={placeholder}\n disabled={disabled}\n rows={1}\n aria-label={inputLabel}\n {...mention.inputProps}\n style={{\n ...textareaProps?.style,\n maxHeight:\n typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight,\n }}\n className={cn(\n 'block w-full resize-none bg-transparent',\n // 16px below `sm`: iOS zooms the page when focusing an input\n // with a smaller font.\n 'rounded-lg text-base sm:text-sm',\n cells.textarea,\n 'text-neutral-900 placeholder:text-neutral-400 dark:text-white dark:placeholder:text-neutral-500',\n // Ring the input itself on focus rather than the whole shell.\n 'focus:ring-primary-500 focus:ring-1 focus:outline-none',\n 'disabled:cursor-not-allowed',\n textareaProps?.className\n )}\n />\n </div>\n\n {(showAddMenu || leadingSlot != null) && (\n <div\n className={cn(\n cells.add,\n leadingSlot != null && 'flex items-center gap-0.5'\n )}\n >\n {leadingSlot != null && (\n <div\n data-slot=\"chat-composer-leading-slot\"\n className=\"flex h-8 shrink-0 items-center\"\n >\n {leadingSlot}\n </div>\n )}\n\n {showAddMenu && (\n <Dropdown\n placement=\"top-start\"\n open={addMenuOpen}\n onOpenChange={setAddMenuOpen}\n trigger={\n <button\n type=\"button\"\n data-slot=\"chat-composer-add-button\"\n aria-label={addMenuLabel}\n disabled={disabled}\n className={iconButtonClasses}\n >\n <PlusIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n }\n >\n {allowAttachments && (\n <DropdownItem\n icon={\n <PaperclipIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n }\n onClick={() => {\n setAddMenuOpen(false);\n fileInputRef.current?.click();\n }}\n >\n {attachFilesLabel}\n </DropdownItem>\n )}\n {allowAttachments &&\n addMenuItems &&\n addMenuItems.length > 0 && <DropdownSeparator />}\n {addMenuItems?.map((item) => (\n <DropdownItem\n key={item.id}\n icon={item.icon}\n disabled={item.disabled}\n variant={item.variant}\n checked={item.checked}\n onClick={() => {\n setAddMenuOpen(false);\n item.onSelect?.();\n }}\n >\n <span className=\"min-w-0 truncate\">{item.label}</span>\n </DropdownItem>\n ))}\n </Dropdown>\n )}\n </div>\n )}\n\n {allowAttachments && (\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={acceptedFileTypes?.join(',')}\n onChange={handleFileInputChange}\n className=\"hidden\"\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n )}\n\n <div className={cells.actions}>\n {showCharacterCount && maxLength !== undefined && (\n <span\n data-slot=\"chat-composer-char-count\"\n aria-live=\"polite\"\n className={cn(\n 'pe-1 text-xs tabular-nums',\n isOverLimit\n ? 'font-medium text-red-700 dark:text-red-400'\n : 'text-neutral-500 dark:text-neutral-400'\n )}\n >\n {value.length}/{maxLength}\n </span>\n )}\n\n {micVisible &&\n (micSlot != null ? (\n // Normalize slot content (e.g. a RecordButton) to the 32px\n // control row: taller content overflow-centers instead of\n // inflating the pill and pushing the other cells apart. A div\n // so block-level slot content stays valid HTML.\n <div\n data-slot=\"chat-composer-mic-slot\"\n className=\"flex h-8 shrink-0 items-center\"\n >\n {micSlot}\n </div>\n ) : (\n <button\n type=\"button\"\n data-slot=\"chat-composer-mic-button\"\n aria-label={micLabel}\n disabled={disabled}\n onClick={onMicClick}\n className={iconButtonClasses}\n >\n <MicIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n ))}\n\n {isStreaming && onStop ? (\n <button\n type=\"button\"\n data-slot=\"chat-composer-stop-button\"\n aria-label={stopLabel}\n disabled={disabled}\n onMouseDown={keepInputFocus}\n onClick={onStop}\n className={cn(\n iconButtonClasses,\n 'text-neutral-700 dark:text-neutral-200'\n )}\n >\n <StopIcon\n className=\"h-3.5 w-3.5 fill-current\"\n aria-hidden=\"true\"\n />\n </button>\n ) : (\n <button\n type=\"button\"\n data-slot=\"chat-composer-send-button\"\n aria-label={isSending ? sendingLabel : sendLabel}\n aria-busy={isSending || undefined}\n disabled={!canSend}\n onMouseDown={keepInputFocus}\n onClick={handleSend}\n className={cn(\n iconButtonClasses,\n canSend &&\n 'bg-primary-800 hover:bg-primary-700 dark:bg-primary-600 dark:hover:bg-primary-500 text-white hover:text-white dark:hover:text-white'\n )}\n >\n {isSending ? (\n <LoaderIcon\n className=\"h-4 w-4 animate-spin\"\n aria-hidden=\"true\"\n />\n ) : (\n <ArrowUpIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n )}\n </button>\n )}\n </div>\n </div>\n </>\n );\n\n const selectorsRow = showSelectorRow && (\n <div\n data-slot=\"chat-composer-selectors\"\n className=\"flex items-center justify-between gap-2 px-2 pt-1\"\n >\n {showAgentSelector ? (\n <Dropdown\n placement=\"top-start\"\n open={agentMenuOpen}\n onOpenChange={setAgentMenuOpen}\n trigger={\n <button\n type=\"button\"\n data-slot=\"chat-composer-agent-trigger\"\n aria-label={\n selectedAgentOption\n ? `${agentSelectorLabel}: ${selectedAgentOption.label}`\n : agentSelectorLabel\n }\n disabled={disabled}\n className={selectorTriggerClasses}\n >\n {selectedAgentOption?.icon ?? (\n <BotIcon className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n )}\n <span className=\"min-w-0 truncate\">\n {selectedAgentOption?.label ?? agentSelectorLabel}\n </span>\n <ChevronUpIcon className=\"h-3 w-3 shrink-0\" aria-hidden=\"true\" />\n </button>\n }\n >\n {agents.map((agent) => (\n <DropdownItem\n key={agent.id}\n icon={agent.icon}\n role=\"menuitemradio\"\n aria-checked={agent.id === selectedAgent}\n onClick={() => {\n setAgentMenuOpen(false);\n onAgentChange?.(agent.id);\n }}\n >\n <span className=\"flex w-full items-center justify-between gap-2\">\n <span className=\"min-w-0\">\n <span className=\"block truncate\">{agent.label}</span>\n {agent.description && (\n <span className=\"block truncate text-xs text-neutral-500 dark:text-neutral-400\">\n {agent.description}\n </span>\n )}\n </span>\n {agent.id === selectedAgent && (\n <CheckIcon\n className=\"text-primary-600 dark:text-primary-400 h-4 w-4 shrink-0\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n </DropdownItem>\n ))}\n </Dropdown>\n ) : (\n <span aria-hidden=\"true\" />\n )}\n\n {showModelSelector && modelSelectorProps && (\n <ComposerModelSelector\n variant=\"ghost\"\n {...modelSelectorProps}\n disabled={disabled || modelSelectorProps.disabled}\n />\n )}\n </div>\n );\n\n // The bordered card holds only the input row(s); the selector row hangs\n // below it on the page background. When attachments are enabled the card\n // doubles as a drop target; all dropped files run through `addFiles` so\n // validation and structured `onError` reporting stay in one place (the\n // zone itself does not validate).\n const card = (\n // Pointer-only convenience: the textarea stays the keyboard/AT target.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n data-slot=\"chat-composer-card\"\n onMouseDown={focusInputFromCard}\n className={cn(\n 'cursor-text rounded-2xl border border-neutral-200 bg-white shadow-sm',\n 'dark:border-[#2e2e30] dark:bg-[#1c1c1e]'\n )}\n >\n {composerCard}\n </div>\n );\n\n return (\n <div\n data-slot=\"chat-composer\"\n className={cn(\n 'flex w-full flex-col',\n disabled && 'opacity-60',\n className\n )}\n >\n {allowAttachments ? (\n <DragDropZone\n onFilesDropped={addFiles}\n maxFiles={Number.MAX_SAFE_INTEGER}\n disabled={disabled}\n overlayLabel={dropFilesLabel}\n >\n {card}\n </DragDropZone>\n ) : (\n card\n )}\n {selectorsRow}\n </div>\n );\n});\n\nChatComposer.displayName = 'ChatComposer';\n","// Dev-only, one-time notice that the chat surfaces now mount ChatComposer in\n// place of the retired MessageComposer (mieweb/ui#465, 0.10.0). Bundlers\n// replace `process.env.NODE_ENV` at build time, so the whole branch is\n// dead-code-eliminated from production bundles.\n// TODO(0.11.0): remove this notice one release after the retirement ships.\nlet didNotify = false;\n\n/** Log a one-time dev pointer to the ChatComposer migration guide. */\nexport function notifyComposerMigrationOnce(surface: string): void {\n if (process.env.NODE_ENV === 'production' || didNotify) return;\n didNotify = true;\n console.warn(\n `[@mieweb/ui] ${surface} renders the shared ChatComposer — the standalone ` +\n 'MessageComposer was retired in 0.10.0. If your CSS or tests reach into ' +\n 'composer internals, see MIGRATION.md#chat-composer ' +\n '(https://github.com/mieweb/ui/blob/main/MIGRATION.md#chat-composer). ' +\n 'This dev-only notice will be removed in 0.11.0.'\n );\n}\n"]}
|