@k2b/ui 0.18.0 → 0.19.0

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.
Files changed (178) hide show
  1. package/README.md +3 -2
  2. package/dist/browser/actions/ContextMenu.js +3 -1
  3. package/dist/browser/actions/ContextMenu.js.map +1 -1
  4. package/dist/browser/actions/Dropdown.js +91 -46
  5. package/dist/browser/actions/Dropdown.js.map +1 -1
  6. package/dist/browser/actions/FilterChip.js +4 -1
  7. package/dist/browser/actions/FilterChip.js.map +1 -1
  8. package/dist/browser/chat/ChatComposer.js +1293 -534
  9. package/dist/browser/chat/ChatComposer.js.map +1 -1
  10. package/dist/browser/chat/chat-behavior.js +9 -0
  11. package/dist/browser/chat/chat-behavior.js.map +1 -1
  12. package/dist/browser/chat/index.js.map +1 -1
  13. package/dist/browser/chat/types.js.map +1 -1
  14. package/dist/browser/content/Calendar.js +579 -533
  15. package/dist/browser/content/Calendar.js.map +1 -1
  16. package/dist/browser/content/Lightbox.js +76 -40
  17. package/dist/browser/content/Lightbox.js.map +1 -1
  18. package/dist/browser/content/PdfPreview.js +146 -79
  19. package/dist/browser/content/PdfPreview.js.map +1 -1
  20. package/dist/browser/content/Timeline.js +1038 -0
  21. package/dist/browser/content/Timeline.js.map +1 -0
  22. package/dist/browser/content/VideoPlayer.js +29 -9
  23. package/dist/browser/content/VideoPlayer.js.map +1 -1
  24. package/dist/browser/content/chart-inspection.js +7 -2
  25. package/dist/browser/content/chart-inspection.js.map +1 -1
  26. package/dist/browser/content/index.js +1 -0
  27. package/dist/browser/content/index.js.map +1 -1
  28. package/dist/browser/content/timeline-model.js +579 -0
  29. package/dist/browser/content/timeline-model.js.map +1 -0
  30. package/dist/browser/feedback/dialog-core.js +26 -14
  31. package/dist/browser/feedback/dialog-core.js.map +1 -1
  32. package/dist/browser/inputs/ChoiceChips.js +66 -0
  33. package/dist/browser/inputs/ChoiceChips.js.map +1 -0
  34. package/dist/browser/inputs/ChoiceGroups.js +53 -12
  35. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  36. package/dist/browser/inputs/FileInputs.js +48 -33
  37. package/dist/browser/inputs/FileInputs.js.map +1 -1
  38. package/dist/browser/inputs/SignatureInput.js +558 -0
  39. package/dist/browser/inputs/SignatureInput.js.map +1 -0
  40. package/dist/browser/inputs/emoji/EmojiPicker.js +841 -0
  41. package/dist/browser/inputs/emoji/EmojiPicker.js.map +1 -0
  42. package/dist/browser/inputs/emoji/emoji-data.js +1903 -0
  43. package/dist/browser/inputs/emoji/emoji-data.js.map +1 -0
  44. package/dist/browser/inputs/emoji/emoji-index.js +209 -0
  45. package/dist/browser/inputs/emoji/emoji-index.js.map +1 -0
  46. package/dist/browser/inputs/emoji/emoji-messages.js +64 -0
  47. package/dist/browser/inputs/emoji/emoji-messages.js.map +1 -0
  48. package/dist/browser/inputs/index.js +5 -0
  49. package/dist/browser/inputs/index.js.map +1 -1
  50. package/dist/browser/inputs/markdown/actions.js +48 -2
  51. package/dist/browser/inputs/markdown/actions.js.map +1 -1
  52. package/dist/browser/inputs/markdown/code-zone.js +38 -2
  53. package/dist/browser/inputs/markdown/code-zone.js.map +1 -1
  54. package/dist/browser/inputs/signature-messages.js +39 -0
  55. package/dist/browser/inputs/signature-messages.js.map +1 -0
  56. package/dist/browser/inputs/signature.js +208 -0
  57. package/dist/browser/inputs/signature.js.map +1 -0
  58. package/dist/browser/internal/render-error.js +49 -0
  59. package/dist/browser/internal/render-error.js.map +1 -0
  60. package/dist/browser/intl/messages.js +108 -0
  61. package/dist/browser/intl/messages.js.map +1 -1
  62. package/dist/browser/layout/AppWorkspace.js +321 -222
  63. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  64. package/dist/browser/layout/FloatingWindow.js +4 -1
  65. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  66. package/dist/browser/layout/SidebarItemPreview.js +5 -1
  67. package/dist/browser/layout/SidebarItemPreview.js.map +1 -1
  68. package/dist/browser/layout/index.js.map +1 -1
  69. package/dist/browser/surfaces/ResourceCard.js +212 -0
  70. package/dist/browser/surfaces/ResourceCard.js.map +1 -0
  71. package/dist/browser/surfaces/index.js +1 -0
  72. package/dist/browser/surfaces/index.js.map +1 -1
  73. package/dist/licenses/emojibase-data.txt +21 -0
  74. package/dist/ssr/actions/ContextMenu.js +3 -1
  75. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  76. package/dist/ssr/actions/Dropdown.js +49 -12
  77. package/dist/ssr/actions/Dropdown.js.map +1 -1
  78. package/dist/ssr/actions/FilterChip.js +4 -1
  79. package/dist/ssr/actions/FilterChip.js.map +1 -1
  80. package/dist/ssr/chat/ChatComposer.js +805 -214
  81. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  82. package/dist/ssr/chat/chat-behavior.js +9 -0
  83. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  84. package/dist/ssr/chat/index.js.map +1 -1
  85. package/dist/ssr/chat/types.js.map +1 -1
  86. package/dist/ssr/content/Calendar.js +183 -142
  87. package/dist/ssr/content/Calendar.js.map +1 -1
  88. package/dist/ssr/content/Lightbox.js +19 -5
  89. package/dist/ssr/content/Lightbox.js.map +1 -1
  90. package/dist/ssr/content/PdfPreview.js +77 -36
  91. package/dist/ssr/content/PdfPreview.js.map +1 -1
  92. package/dist/ssr/content/Timeline.js +804 -0
  93. package/dist/ssr/content/Timeline.js.map +1 -0
  94. package/dist/ssr/content/VideoPlayer.js +29 -9
  95. package/dist/ssr/content/VideoPlayer.js.map +1 -1
  96. package/dist/ssr/content/chart-inspection.js +7 -2
  97. package/dist/ssr/content/chart-inspection.js.map +1 -1
  98. package/dist/ssr/content/index.js +1 -0
  99. package/dist/ssr/content/index.js.map +1 -1
  100. package/dist/ssr/content/timeline-model.js +579 -0
  101. package/dist/ssr/content/timeline-model.js.map +1 -0
  102. package/dist/ssr/feedback/dialog-core.js +26 -14
  103. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  104. package/dist/ssr/inputs/ChoiceChips.js +66 -0
  105. package/dist/ssr/inputs/ChoiceChips.js.map +1 -0
  106. package/dist/ssr/inputs/ChoiceGroups.js +12 -4
  107. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  108. package/dist/ssr/inputs/FileInputs.js +19 -4
  109. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  110. package/dist/ssr/inputs/SignatureInput.js +404 -0
  111. package/dist/ssr/inputs/SignatureInput.js.map +1 -0
  112. package/dist/ssr/inputs/emoji/EmojiPicker.js +551 -0
  113. package/dist/ssr/inputs/emoji/EmojiPicker.js.map +1 -0
  114. package/dist/ssr/inputs/emoji/emoji-data.js +1903 -0
  115. package/dist/ssr/inputs/emoji/emoji-data.js.map +1 -0
  116. package/dist/ssr/inputs/emoji/emoji-index.js +209 -0
  117. package/dist/ssr/inputs/emoji/emoji-index.js.map +1 -0
  118. package/dist/ssr/inputs/emoji/emoji-messages.js +64 -0
  119. package/dist/ssr/inputs/emoji/emoji-messages.js.map +1 -0
  120. package/dist/ssr/inputs/index.js +5 -0
  121. package/dist/ssr/inputs/index.js.map +1 -1
  122. package/dist/ssr/inputs/markdown/actions.js +48 -2
  123. package/dist/ssr/inputs/markdown/actions.js.map +1 -1
  124. package/dist/ssr/inputs/markdown/code-zone.js +38 -2
  125. package/dist/ssr/inputs/markdown/code-zone.js.map +1 -1
  126. package/dist/ssr/inputs/signature-messages.js +39 -0
  127. package/dist/ssr/inputs/signature-messages.js.map +1 -0
  128. package/dist/ssr/inputs/signature.js +208 -0
  129. package/dist/ssr/inputs/signature.js.map +1 -0
  130. package/dist/ssr/internal/render-error.js +49 -0
  131. package/dist/ssr/internal/render-error.js.map +1 -0
  132. package/dist/ssr/intl/messages.js +108 -0
  133. package/dist/ssr/intl/messages.js.map +1 -1
  134. package/dist/ssr/layout/AppWorkspace.js +112 -41
  135. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  136. package/dist/ssr/layout/FloatingWindow.js +4 -1
  137. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  138. package/dist/ssr/layout/SidebarItemPreview.js +5 -1
  139. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -1
  140. package/dist/ssr/layout/index.js.map +1 -1
  141. package/dist/ssr/surfaces/ResourceCard.js +115 -0
  142. package/dist/ssr/surfaces/ResourceCard.js.map +1 -0
  143. package/dist/ssr/surfaces/index.js +1 -0
  144. package/dist/ssr/surfaces/index.js.map +1 -1
  145. package/dist/styles.css +1 -1
  146. package/dist/types/actions/Dropdown.d.ts +13 -1
  147. package/dist/types/actions/FilterChip.d.ts +5 -0
  148. package/dist/types/chat/ChatComposer.d.ts +24 -1
  149. package/dist/types/chat/chat-behavior.d.ts +15 -0
  150. package/dist/types/chat/index.d.ts +1 -1
  151. package/dist/types/chat/types.d.ts +34 -0
  152. package/dist/types/content/Calendar.d.ts +28 -8
  153. package/dist/types/content/Lightbox.d.ts +8 -0
  154. package/dist/types/content/Timeline.d.ts +49 -0
  155. package/dist/types/content/index.d.ts +4 -2
  156. package/dist/types/content/timeline-model.d.ts +148 -0
  157. package/dist/types/feedback/dialog-core.d.ts +1 -1
  158. package/dist/types/inputs/ChoiceChips.d.ts +20 -0
  159. package/dist/types/inputs/ChoiceGroups.d.ts +11 -2
  160. package/dist/types/inputs/FileInputs.d.ts +6 -0
  161. package/dist/types/inputs/SignatureInput.d.ts +22 -0
  162. package/dist/types/inputs/emoji/EmojiPicker.d.ts +42 -0
  163. package/dist/types/inputs/emoji/emoji-data.d.ts +2 -0
  164. package/dist/types/inputs/emoji/emoji-index.d.ts +109 -0
  165. package/dist/types/inputs/emoji/emoji-messages.d.ts +30 -0
  166. package/dist/types/inputs/index.d.ts +10 -0
  167. package/dist/types/inputs/markdown/actions.d.ts +4 -0
  168. package/dist/types/inputs/markdown/code-zone.d.ts +7 -0
  169. package/dist/types/inputs/signature-messages.d.ts +11 -0
  170. package/dist/types/inputs/signature.d.ts +72 -0
  171. package/dist/types/internal/render-error.d.ts +13 -0
  172. package/dist/types/intl/messages.d.ts +54 -0
  173. package/dist/types/layout/AppWorkspace.d.ts +17 -0
  174. package/dist/types/layout/SidebarItemPreview.d.ts +2 -0
  175. package/dist/types/layout/index.d.ts +1 -1
  176. package/dist/types/surfaces/ResourceCard.d.ts +31 -0
  177. package/dist/types/surfaces/index.d.ts +2 -0
  178. package/package.json +5 -4
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["chat/ChatComposer.tsx"],"sourcesContent":["import {\n children,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n onCleanup,\n onMount,\n Show,\n untrack,\n} from \"solid-js\";\nimport { Dropdown, type DropdownItem as DropdownItemData } from \"../actions/Dropdown\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { FileDropTarget } from \"../inputs/FileDropTarget\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { ChatContextUsage as ContextUsage } from \"./ChatPrimitives\";\nimport { executeChatAction, nextChatCommandIndex, reportChatFailure, runChatSubmission } from \"./chat-behavior\";\nimport { chatCommandQuery, chatMentionSegments, reconcileChatMentions } from \"./composer-document\";\nimport type {\n ChatAction,\n ChatAttachment,\n ChatComposerState,\n ChatContextUsageData,\n ChatMention,\n ChatModelOption,\n ChatSubmitInput,\n} from \"./types\";\n\nconst composerMaxInputHeight = 309;\n// Keep editor undo text within approximately 2 MiB, plus the current edit.\nconst composerUndoBudgetChars = 1_000_000;\n\nexport type ChatCommandContext = {\n setValue: (value: string) => void;\n submit: () => void;\n focus: () => void;\n};\n\nexport type ChatCommand = {\n name: string;\n description: string;\n icon?: string;\n action?: (context: ChatCommandContext) => void | Promise<void>;\n /** Selecting a reference inserts its display name and retains its opaque payload. */\n mention?: ChatAttachment;\n label?: string;\n disabled?: boolean;\n};\n\nexport type ChatFileSelection = {\n onSelect: (files: readonly File[]) => void | Promise<void>;\n onError?: (error: unknown) => void;\n accept?: string;\n multiple?: boolean;\n disabled?: boolean;\n label?: string;\n};\n\nexport type ChatPasteHandler = (event: ClipboardEvent & { currentTarget: HTMLTextAreaElement; target: Element }) => void;\n\nexport type ChatComposerProps = {\n value: string;\n onValueChange: (value: string) => void;\n onSubmit: (input: ChatSubmitInput) => boolean | void | Promise<boolean | void>;\n /** Submit intent used for drafts entered while a response is running. Defaults to `steer`. */\n runningSubmitIntent?: \"steer\" | \"queue\";\n onStop?: () => void | Promise<void>;\n onError?: (error: unknown) => void;\n state?: ChatComposerState;\n attachments?: readonly ChatAttachment[];\n onAttachmentsChange?: (attachments: readonly ChatAttachment[]) => void;\n fileSelection?: ChatFileSelection;\n /** Handle non-file clipboard content. Pasted files already use `fileSelection`. */\n onPaste?: ChatPasteHandler;\n menuActions?: readonly ChatAction[];\n models?: readonly ChatModelOption[];\n selectedModelId?: string | null;\n onModelChange?: (modelId: string) => void;\n /** Compact application-owned details immediately after the model selector. */\n modelDetails?: JSX.Element;\n commands?: readonly ChatCommand[];\n searchCommands?: (query: string, signal: AbortSignal) => Promise<readonly ChatCommand[]>;\n mentions?: readonly ChatMention[];\n onMentionsChange?: (mentions: readonly ChatMention[]) => void;\n /** Shared surface above the editor; suggestions temporarily replace this content. */\n accessory?: JSX.Element;\n contextUsage?: ChatContextUsageData;\n contextActions?: readonly ChatAction[];\n /** Optional action inside the context details popup. */\n contextPopupAction?: ChatAction;\n /** Additional compact controls rendered with the add/model controls. */\n footerTools?: JSX.Element;\n /** Compact application controls immediately before the send/stop button. */\n submitTools?: JSX.Element;\n /** Replaces footer controls during an application-owned interaction, preserving the editor. */\n footerContent?: JSX.Element;\n placeholder?: string;\n label?: string;\n inputLabel?: string;\n disabled?: boolean;\n error?: string;\n focusToken?: unknown;\n draftKey?: unknown;\n class?: string;\n};\n\nconst attachmentIcon = (attachment: ChatAttachment): string =>\n attachment.icon ?? (attachment.kind === \"image\" ? \"ti ti-photo\" : attachment.kind === \"resource\" ? \"ti ti-link\" : \"ti ti-file\");\n\nexport function ChatComposer(props: ChatComposerProps): JSX.Element {\n const accessory = children(() => props.accessory);\n const hasAccessory = () => accessory.toArray().some((item) => item != null && typeof item !== \"boolean\" && item !== \"\");\n const messages = useUiMessages();\n const commandListId = `k2b-chat-commands-${createUniqueId().replace(/[^A-Za-z0-9_-]/g, \"-\")}`;\n const [selectedCommandIndex, setSelectedCommandIndex] = createSignal(0);\n const [addingFiles, setAddingFiles] = createSignal(false);\n const [submitting, setSubmitting] = createSignal(false);\n let composerRef: HTMLElement | undefined;\n let textareaRef: HTMLTextAreaElement | undefined;\n let fileInputRef: HTMLInputElement | undefined;\n let sawRunning = props.state === \"running\";\n\n const state = () => props.state ?? \"idle\";\n const running = () => state() === \"running\";\n const stopping = () => state() === \"stopping\";\n const runningSubmitIntent = () => props.runningSubmitIntent ?? \"steer\";\n const attachments = () => props.attachments ?? [];\n const [caret, setCaret] = createSignal(0);\n const [selectionEnd, setSelectionEnd] = createSignal(0);\n const [dismissed, setDismissed] = createSignal(false);\n const [composing, setComposing] = createSignal(false);\n const [searchResults, setSearchResults] = createSignal<readonly ChatCommand[]>([]);\n const [searching, setSearching] = createSignal(false);\n const [searchError, setSearchError] = createSignal(false);\n const [executing, setExecuting] = createSignal(false);\n let highlightRef: HTMLDivElement | undefined;\n let commandListRef: HTMLDivElement | undefined;\n const mentions = () => props.mentions ?? [];\n const commandQuery = createMemo(() => (dismissed() || composing() ? null : chatCommandQuery(props.value, caret(), selectionEnd())));\n const commandMatches = createMemo(() => {\n const token = commandQuery();\n if (!token) return [];\n return [\n ...(props.commands ?? []).filter((command) => command.name.toLowerCase().includes(token.query.toLowerCase())),\n ...searchResults(),\n ];\n });\n const commandsOpen = () => Boolean(commandQuery() && (props.commands?.length || props.searchCommands));\n createEffect(() => {\n if (!commandsOpen()) return;\n let disposed = false;\n const measure = () => {\n if (disposed || !commandListRef) return;\n let top = window.visualViewport?.offsetTop ?? 0;\n for (let parent = commandListRef.parentElement; parent; parent = parent.parentElement) {\n if (/(auto|scroll|hidden|clip)/.test(window.getComputedStyle(parent).overflowY)) {\n top = Math.max(top, parent.getBoundingClientRect().top);\n }\n }\n const bottom = commandListRef.parentElement!.getBoundingClientRect().bottom;\n commandListRef.style.setProperty(\"--k2b-chat-command-space\", `${Math.max(40, bottom - top - 8)}px`);\n };\n queueMicrotask(measure);\n window.addEventListener(\"resize\", measure);\n window.addEventListener(\"scroll\", measure, true);\n window.visualViewport?.addEventListener(\"resize\", measure);\n onCleanup(() => {\n disposed = true;\n window.removeEventListener(\"resize\", measure);\n window.removeEventListener(\"scroll\", measure, true);\n window.visualViewport?.removeEventListener(\"resize\", measure);\n });\n });\n createEffect(() => {\n const token = commandQuery();\n setSearchResults([]);\n setSearchError(false);\n if (!token || !props.searchCommands) {\n setSearching(false);\n return;\n }\n const abort = new AbortController();\n setSearching(true);\n const timer = setTimeout(() => {\n Promise.resolve(props.searchCommands!(token.query, abort.signal))\n .then((results) => {\n if (!abort.signal.aborted) setSearchResults(results);\n })\n .catch(() => {\n if (!abort.signal.aborted) setSearchError(true);\n })\n .finally(() => {\n if (!abort.signal.aborted) setSearching(false);\n });\n }, 120);\n onCleanup(() => {\n clearTimeout(timer);\n abort.abort();\n });\n });\n const history: { value: string; mentions: readonly ChatMention[]; caret: number }[] = [];\n let historyIndex = -1;\n createEffect(() => {\n props.draftKey;\n untrack(() => {\n history.length = 0;\n historyIndex = -1;\n setDismissed(true);\n });\n });\n const snapshot = () => ({ value: props.value, mentions: [...mentions()], caret: textareaRef?.selectionStart ?? 0 });\n const sameMentions = (a: readonly ChatMention[], b: readonly ChatMention[]) =>\n a.length === b.length &&\n a.every((item, index) => item.start === b[index]?.start && item.end === b[index]?.end && item.attachment === b[index]?.attachment);\n const record = () => {\n if (history[historyIndex]?.value !== props.value || !sameMentions(history[historyIndex]?.mentions ?? [], mentions())) {\n history.splice(historyIndex + 1);\n history.push(snapshot());\n let size = history.reduce((total, entry) => total + entry.value.length, 0);\n while (history.length > 2 && size > composerUndoBudgetChars) size -= history.shift()!.value.length;\n historyIndex = history.length - 1;\n }\n };\n const edit = (value: string, nextMentions = reconcileChatMentions(props.value, value, mentions())) => {\n record();\n props.onValueChange(value);\n props.onMentionsChange?.(nextMentions);\n record();\n setDismissed(false);\n };\n const restoreHistory = (direction: -1 | 1) => {\n record();\n const next = history[historyIndex + direction];\n if (!next) return;\n historyIndex += direction;\n props.onValueChange(next.value);\n props.onMentionsChange?.(next.mentions);\n queueMicrotask(() => {\n textareaRef?.setSelectionRange(next.caret, next.caret);\n syncCaret();\n });\n };\n const syncCaret = () => {\n setCaret(textareaRef?.selectionStart ?? props.value.length);\n setSelectionEnd(textareaRef?.selectionEnd ?? props.value.length);\n };\n const selectedCommand = () => commandMatches()[selectedCommandIndex()];\n const blocked = () => Boolean(props.disabled || stopping() || state() === \"submitting\" || executing() || addingFiles() || submitting());\n const hasDraft = () => Boolean(props.value.trim() || (!running() && attachments().length > 0));\n const canSubmit = () => !blocked() && hasDraft() && !(running() && runningSubmitIntent() === \"steer\" && mentions().length);\n const canSelectFiles = () => Boolean(props.fileSelection && !props.fileSelection.disabled && !running() && !blocked());\n const hasAddMenu = () => Boolean(props.fileSelection || props.menuActions?.length);\n const hasContextUsage = () => {\n if (props.contextPopupAction) return true;\n const context = props.contextUsage;\n if (!context || typeof context.contextWindow !== \"number\" || !Number.isFinite(context.contextWindow) || context.contextWindow <= 0) {\n return false;\n }\n return [context.usage?.total, context.usage?.input, context.usage?.output].some(\n (value) => typeof value === \"number\" && Number.isFinite(value) && value >= 0,\n );\n };\n\n const menuItems = (): readonly DropdownItemData[] => {\n const items: DropdownItemData[] = [];\n if (props.fileSelection) {\n items.push({\n icon: addingFiles() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-paperclip\",\n label: props.fileSelection.label ?? messages().attachFiles,\n disabled: !canSelectFiles(),\n action: () => fileInputRef?.click(),\n });\n }\n for (const action of props.menuActions ?? []) {\n items.push({\n icon: action.icon,\n label: action.label,\n variant: action.variant,\n disabled: action.disabled,\n action: () => reportChatFailure(() => executeChatAction(action), props.onError),\n });\n }\n return items;\n };\n\n const autoResize = () => {\n if (!textareaRef) return;\n textareaRef.style.height = \"auto\";\n textareaRef.style.height = `${Math.min(textareaRef.scrollHeight, composerMaxInputHeight)}px`;\n };\n\n const focus = () => textareaRef?.focus();\n\n onMount(() => {\n autoResize();\n if (props.focusToken !== undefined) focus();\n });\n\n createEffect(() => {\n commandMatches();\n setSelectedCommandIndex(0);\n });\n\n createEffect(() => {\n const index = selectedCommandIndex();\n commandMatches();\n queueMicrotask(() => {\n const list = commandListRef;\n const item = list?.querySelector<HTMLElement>(`[id=\"${commandListId}-${index}\"]`);\n if (!list || !item?.isConnected) return;\n if (item.offsetTop < list.scrollTop) list.scrollTop = item.offsetTop;\n else if (item.offsetTop + item.offsetHeight > list.scrollTop + list.clientHeight) {\n list.scrollTop = item.offsetTop + item.offsetHeight - list.clientHeight;\n }\n });\n });\n\n createEffect(() => {\n props.value;\n queueMicrotask(autoResize);\n });\n\n createEffect(() => {\n props.focusToken;\n if (props.focusToken !== undefined) queueMicrotask(focus);\n });\n\n createEffect(() => {\n const active = running();\n if (sawRunning && !active && !props.disabled && typeof document !== \"undefined\") {\n const focused = document.activeElement as HTMLElement | null;\n const insideComposer = Boolean(focused && composerRef?.contains(focused));\n const editingElsewhere = Boolean(\n focused &&\n focused !== document.body &&\n !insideComposer &&\n (focused.matches(\"input, textarea, select\") || focused.isContentEditable || focused.closest(\"[role='dialog'], [popover]\")),\n );\n if (!editingElsewhere) queueMicrotask(focus);\n }\n sawRunning = active;\n });\n\n const setAttachments = (next: readonly ChatAttachment[]) => props.onAttachmentsChange?.(next);\n\n const renderAttachmentCopy = (attachment: ChatAttachment) => (\n <span>\n <strong title={attachment.name}>{attachment.name}</strong>\n </span>\n );\n\n const runFiles = async (files: FileList | readonly File[]) => {\n if (!canSelectFiles()) return;\n const selected = Array.from(files);\n if (selected.length === 0) return;\n setAddingFiles(true);\n try {\n await props.fileSelection?.onSelect(selected);\n } catch (error) {\n (props.fileSelection?.onError ?? props.onError)?.(error);\n } finally {\n setAddingFiles(false);\n if (fileInputRef) fileInputRef.value = \"\";\n queueMicrotask(focus);\n }\n };\n\n const submit = async () => {\n if (!canSubmit()) return;\n const intent = running() ? runningSubmitIntent() : \"send\";\n const previousValue = props.value;\n const previousAttachments = attachments();\n const previousMentions = mentions();\n const input: ChatSubmitInput = {\n intent,\n text: previousValue,\n mentions: previousMentions,\n attachments: intent !== \"steer\" ? previousAttachments : [],\n };\n\n setSubmitting(true);\n try {\n await runChatSubmission({\n clear: () => {\n props.onValueChange(\"\");\n props.onMentionsChange?.([]);\n if (intent !== \"steer\") setAttachments([]);\n },\n perform: () => props.onSubmit(input),\n restore: () => {\n props.onValueChange(previousValue);\n props.onMentionsChange?.(previousMentions);\n if (intent !== \"steer\") setAttachments(previousAttachments);\n },\n onError: props.onError,\n });\n } finally {\n setSubmitting(false);\n queueMicrotask(() => {\n autoResize();\n focus();\n });\n }\n };\n\n const executeCommand = async (command: ChatCommand) => {\n const token = commandQuery();\n if (!token || command.disabled || blocked()) return;\n const previous = snapshot();\n const key = props.draftKey;\n const replacement = command.mention ? command.mention.name + \" \" : \"\";\n const nextValue = props.value.slice(0, token.start) + replacement + props.value.slice(token.end);\n const nextMentions = reconcileChatMentions(props.value, nextValue, mentions());\n if (command.mention)\n nextMentions.push({ start: token.start, end: token.start + command.mention.name.length, attachment: command.mention });\n edit(nextValue, nextMentions);\n setDismissed(true);\n setExecuting(true);\n let submitRequested = false;\n try {\n await command.action?.({\n setValue: (value) => edit(value),\n submit: () => {\n submitRequested = true;\n },\n focus,\n });\n } catch (error) {\n submitRequested = false;\n if (props.draftKey === key && props.value === nextValue) {\n props.onValueChange(previous.value);\n props.onMentionsChange?.(previous.mentions);\n }\n props.onError?.(error);\n } finally {\n setExecuting(false);\n }\n if (submitRequested && props.draftKey === key) await submit();\n queueMicrotask(() => {\n if (props.draftKey !== key) return;\n textareaRef?.setSelectionRange(token.start + replacement.length, token.start + replacement.length);\n syncCaret();\n autoResize();\n focus();\n });\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.isComposing || composing()) return;\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === \"z\") {\n event.preventDefault();\n restoreHistory(event.shiftKey ? 1 : -1);\n return;\n }\n const matches = commandMatches();\n if (commandsOpen()) {\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n setSelectedCommandIndex((index) => nextChatCommandIndex(index, matches.length, event.key === \"ArrowUp\" ? -1 : 1));\n return;\n }\n if ((event.key === \"Enter\" || event.key === \"Tab\") && matches.length > 0) {\n event.preventDefault();\n const command = selectedCommand();\n if (command) void executeCommand(command);\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n setDismissed(true);\n return;\n }\n }\n if (event.key === \"Enter\" && !event.shiftKey && !event.isComposing) {\n event.preventDefault();\n void submit();\n }\n };\n\n return (\n <div class=\"k2b-chat-composer-shell\">\n <Show when={commandsOpen() || hasAccessory()}>\n <div class=\"k2b-chat-composer-slot\">\n <div style={{ visibility: commandsOpen() ? \"hidden\" : undefined }} inert={commandsOpen()}>\n {accessory()}\n </div>\n <Show when={commandsOpen()}>\n <div class=\"k2b-chat-composer-accessory\">\n <div\n ref={commandListRef}\n id={commandListId}\n class=\"k2b-chat-composer__commands\"\n role=\"listbox\"\n aria-label={messages().commands}\n >\n <For each={commandMatches()}>\n {(command, index) => (\n <button\n id={`${commandListId}-${index()}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={index() === selectedCommandIndex()}\n aria-disabled={command.disabled}\n data-active={index() === selectedCommandIndex() ? \"true\" : undefined}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => void executeCommand(command)}\n >\n <i class={command.icon ?? \"ti ti-slash\"} aria-hidden=\"true\" />\n <strong>{command.label ?? `/${command.name}`}</strong>\n <small>{command.description}</small>\n </button>\n )}\n </For>\n <Show when={searching()}>\n <div role=\"status\" class=\"k2b-chat-composer__loading\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n <strong>{messages().loading}</strong>\n </div>\n </Show>\n <Show when={searchError()}>\n <div role=\"status\">\n <i class=\"ti ti-alert-circle\" /> {messages().error}\n </div>\n </Show>\n <Show when={!searching() && !searchError() && commandMatches().length === 0}>\n <div role=\"status\">{messages().noResults}</div>\n </Show>\n </div>\n </div>\n </Show>\n </div>\n </Show>\n <section\n ref={composerRef}\n class={`k2b-chat-composer ${props.class ?? \"\"}`}\n data-running={running() ? \"true\" : undefined}\n role=\"group\"\n aria-label={props.label ?? messages().messageComposer}\n >\n <Show when={attachments().length > 0}>\n <div class=\"k2b-chat-composer__attachments\" role=\"list\" aria-label={messages().attachments} tabIndex={0}>\n <For each={attachments()}>\n {(attachment) => (\n <div class=\"k2b-chat-composer__attachment\" role=\"listitem\">\n <div\n class=\"k2b-chat-composer__attachment-content\"\n classList={{ \"k2b-chat-composer__attachment-content--action\": Boolean(attachment.action) }}\n >\n <Show\n when={attachment.href}\n fallback={\n <div class=\"k2b-chat-composer__attachment-identity\">\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img src={attachment.previewUrl} alt={attachment.alt ?? \"\"} />\n </Show>\n {renderAttachmentCopy(attachment)}\n </div>\n }\n >\n {(href) => (\n <a\n class=\"k2b-chat-composer__attachment-link\"\n href={href()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={messages().openInNewTab({ name: attachment.name })}\n >\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img src={attachment.previewUrl} alt={attachment.alt ?? \"\"} />\n </Show>\n {renderAttachmentCopy(attachment)}\n </a>\n )}\n </Show>\n <Show when={attachment.action}>\n {(action) => (\n <button\n type=\"button\"\n class=\"k2b-chat-composer__attachment-action\"\n disabled={blocked() || action().disabled}\n onClick={() => reportChatFailure(() => executeChatAction(action()), props.onError)}\n >\n <Show when={action().icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n {action().label}\n </button>\n )}\n </Show>\n </div>\n <Show when={props.onAttachmentsChange}>\n <button\n type=\"button\"\n class=\"k2b-chat-composer__attachment-remove\"\n aria-label={messages().removeNamed({ name: attachment.name })}\n disabled={blocked()}\n onClick={() => setAttachments(attachments().filter((candidate) => candidate.id !== attachment.id))}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n )}\n </For>\n </div>\n </Show>\n\n <div class=\"k2b-chat-composer__input\" role=\"group\" aria-label={messages().messageInput}>\n <Show when={mentions().length > 0}>\n <div ref={highlightRef} class=\"k2b-chat-composer__highlight\" aria-hidden=\"true\">\n <For each={chatMentionSegments(props.value, mentions())}>\n {(part) => <span classList={{ \"k2b-chat-composer__mention\": Boolean(part.mention) }}>{part.text}</span>}\n </For>\n {\"\\n\"}\n </div>\n </Show>\n {/* biome-ignore lint/a11y/useAriaPropsSupportedByRole: popup attributes are conditional with the combobox role */}\n <textarea\n ref={textareaRef}\n classList={{ \"k2b-chat-composer__textarea--highlighted\": mentions().length > 0 }}\n rows={1}\n value={props.value}\n disabled={blocked()}\n placeholder={props.placeholder ?? (running() ? messages().addGuidance : messages().writeMessage)}\n aria-label={props.inputLabel ?? messages().message}\n role={commandsOpen() ? \"combobox\" : undefined}\n aria-autocomplete={commandsOpen() ? \"list\" : undefined}\n aria-controls={commandsOpen() ? commandListId : undefined}\n aria-expanded={commandsOpen() ? \"true\" : undefined}\n aria-activedescendant={selectedCommand() ? `${commandListId}-${selectedCommandIndex()}` : undefined}\n onInput={(event) => {\n edit(event.currentTarget.value);\n syncCaret();\n autoResize();\n }}\n onPaste={(event) => {\n const clipboardData = event.clipboardData;\n if (canSelectFiles() && clipboardData?.files.length) {\n event.preventDefault();\n void runFiles(clipboardData.files);\n return;\n }\n props.onPaste?.(event);\n }}\n onSelect={syncCaret}\n onBlur={() => setDismissed(true)}\n onClick={() => {\n setDismissed(false);\n syncCaret();\n }}\n onKeyUp={syncCaret}\n onCompositionStart={() => setComposing(true)}\n onCompositionEnd={() => {\n setComposing(false);\n syncCaret();\n }}\n onScroll={() => {\n if (highlightRef && textareaRef) highlightRef.scrollTop = textareaRef.scrollTop;\n }}\n onBeforeInput={(event) => {\n if (event.inputType === \"historyUndo\" || event.inputType === \"historyRedo\") {\n event.preventDefault();\n restoreHistory(event.inputType === \"historyUndo\" ? -1 : 1);\n }\n }}\n onKeyDown={onKeyDown}\n />\n </div>\n\n <Show when={props.error}>\n <div class=\"k2b-chat-composer__error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n {props.error}\n </div>\n </Show>\n\n <footer class=\"k2b-chat-composer__footer\">\n <Show\n when={props.footerContent}\n fallback={\n <>\n <div class=\"k2b-chat-composer__tools\">\n {props.footerTools}\n <Show when={hasAddMenu()}>\n <Dropdown.Root position=\"top-right\" label={messages().addToChat} items={menuItems()} disabled={blocked()}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-chat-composer__icon-action\"\n label={messages().addToChat}\n tooltip={messages().addToChat}\n >\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n <Show when={props.fileSelection}>\n <input\n ref={fileInputRef}\n class=\"k2b-sr-only\"\n type=\"file\"\n tabIndex={-1}\n aria-hidden=\"true\"\n accept={props.fileSelection?.accept}\n multiple={props.fileSelection?.multiple ?? true}\n onChange={(event) => {\n if (event.currentTarget.files?.length) void runFiles(event.currentTarget.files);\n }}\n />\n </Show>\n <Show when={(props.models?.length ?? 0) > 0}>\n <SelectChip\n aria-label={messages().chooseModel}\n position=\"top-right\"\n class=\"k2b-chat-composer__model\"\n menuWidth=\"15rem\"\n placeholder={messages().model}\n value={() => props.selectedModelId ?? \"\"}\n options={(props.models ?? []).map((model) => ({\n value: model.id,\n label: model.label,\n description: model.description,\n icon: model.icon,\n image: model.image,\n }))}\n disabled={blocked() || running() || !props.onModelChange}\n onValueChange={(modelId) => {\n props.onModelChange?.(modelId);\n queueMicrotask(focus);\n }}\n />\n </Show>\n {props.modelDetails}\n </div>\n\n <div class=\"k2b-chat-composer__submit\">\n <For each={props.contextActions}>\n {(action) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action\"\n data-tone={action.variant === \"danger\" ? \"danger\" : undefined}\n disabled={action.disabled}\n aria-pressed={action.pressed}\n aria-label={action.label}\n content={action.label}\n onClick={() => reportChatFailure(() => executeChatAction(action), props.onError)}\n >\n <i class={action.icon ?? \"ti ti-dots\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </For>\n <Show when={hasContextUsage() ? (props.contextUsage ?? {}) : undefined}>\n {(usage) => <ContextUsage {...usage()} action={props.contextPopupAction} onActionError={props.onError} />}\n </Show>\n {props.submitTools}\n <Show\n when={running() && !hasDraft() && props.onStop}\n fallback={\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__send\"\n disabled={!canSubmit()}\n aria-label={\n submitting()\n ? running()\n ? runningSubmitIntent() === \"queue\"\n ? messages().queueing\n : messages().steering\n : messages().sending\n : running()\n ? runningSubmitIntent() === \"queue\"\n ? messages().queueMessage\n : messages().steerResponse\n : messages().sendMessage\n }\n content={\n running()\n ? runningSubmitIntent() === \"queue\"\n ? messages().queueMessage\n : messages().steerResponse\n : messages().sendMessage\n }\n onClick={() => void submit()}\n >\n <i class={submitting() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-arrow-up\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n }\n >\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__stop\"\n disabled={stopping()}\n aria-label={stopping() ? messages().stopping : messages().stopResponse}\n content={messages().stopResponse}\n onClick={() => reportChatFailure(() => props.onStop?.(), props.onError)}\n >\n <i class={stopping() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-player-stop\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n </div>\n </>\n }\n >\n {(content) => content()}\n </Show>\n </footer>\n {/* Files dropped anywhere in the surrounding workspace area attach to the message. */}\n <Show when={props.fileSelection}>\n {(selection) => (\n <FileDropTarget\n label={messages().dropFilesToAttach}\n accept={selection().accept}\n multiple={selection().multiple}\n disabled={!canSelectFiles()}\n onDrop={(files) => void runFiles(files)}\n />\n )}\n </Show>\n </section>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["chat/ChatComposer.tsx"],"sourcesContent":["import {\n children,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n onCleanup,\n onMount,\n Show,\n untrack,\n} from \"solid-js\";\nimport { Dropdown, type DropdownItem as DropdownItemData } from \"../actions/Dropdown\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { replaceTextareaRange } from \"../inputs/editor-dom\";\nimport {\n completedEmojiShortcode,\n type EmojiIndex,\n emojiInTone,\n emojiName,\n emojiShortcodeQuery,\n loadEmojiIndex,\n suggestEmoji,\n} from \"../inputs/emoji/emoji-index\";\nimport { FileDropTarget } from \"../inputs/FileDropTarget\";\nimport { toggleBulletList, toggleCodeBlock, toggleInlineMarker, toggleQuote } from \"../inputs/markdown/actions\";\nimport { openCodeFence } from \"../inputs/markdown/code-zone\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useLocale } from \"../intl/locale\";\nimport { type UiMessages, useUiMessages } from \"../intl/messages\";\nimport { ChatContextUsage as ContextUsage } from \"./ChatPrimitives\";\nimport { conversationEnterAction, executeChatAction, nextChatCommandIndex, reportChatFailure, runChatSubmission } from \"./chat-behavior\";\nimport { chatCommandQuery, chatMentionSegments, reconcileChatMentions } from \"./composer-document\";\nimport type {\n ChatAction,\n ChatAttachment,\n ChatComposerEmoji,\n ChatComposerMicrophone,\n ChatComposerState,\n ChatContextUsageData,\n ChatMention,\n ChatModelOption,\n ChatSubmitInput,\n} from \"./types\";\n\nconst composerMaxInputHeight = 309;\n/** Emoji suggestions for a `:shortcode`, as many as fit the list without scrolling on a phone. */\nconst emojiSuggestionLimit = 8;\n// Keep editor undo text within approximately 2 MiB, plus the current edit.\nconst composerUndoBudgetChars = 1_000_000;\n\nexport type ChatCommandContext = {\n setValue: (value: string) => void;\n submit: () => void;\n focus: () => void;\n};\n\nexport type ChatCommand = {\n name: string;\n description: string;\n icon?: string;\n action?: (context: ChatCommandContext) => void | Promise<void>;\n /** Selecting a reference inserts its display name and retains its opaque payload. */\n mention?: ChatAttachment;\n label?: string;\n disabled?: boolean;\n};\n\nexport type ChatFileSelection = {\n onSelect: (files: readonly File[]) => void | Promise<void>;\n /**\n * Chooses files for \"Attach files\" instead of the device's file dialog, for example to offer other sources as well.\n * Called within the menu activation, so it may still open the device's dialog; resolve `[]` when the user cancels.\n * `multiple: false` keeps the first chosen file, and a rejection reaches `onError`.\n */\n choose?: () => Promise<readonly File[]>;\n onError?: (error: unknown) => void;\n accept?: string;\n multiple?: boolean;\n disabled?: boolean;\n label?: string;\n};\n\nexport type ChatPasteHandler = (event: ClipboardEvent & { currentTarget: HTMLTextAreaElement; target: Element }) => void;\n\nexport type ChatComposerProps = {\n value: string;\n onValueChange: (value: string) => void;\n onSubmit: (input: ChatSubmitInput) => boolean | void | Promise<boolean | void>;\n /** Submit intent used for drafts entered while a response is running. Defaults to `steer`. */\n runningSubmitIntent?: \"steer\" | \"queue\";\n onStop?: () => void | Promise<void>;\n onError?: (error: unknown) => void;\n state?: ChatComposerState;\n attachments?: readonly ChatAttachment[];\n onAttachmentsChange?: (attachments: readonly ChatAttachment[]) => void;\n fileSelection?: ChatFileSelection;\n /** Handle non-file clipboard content. Pasted files already use `fileSelection`. */\n onPaste?: ChatPasteHandler;\n menuActions?: readonly ChatAction[];\n models?: readonly ChatModelOption[];\n selectedModelId?: string | null;\n onModelChange?: (modelId: string) => void;\n /** Compact application-owned details immediately after the model selector. */\n modelDetails?: JSX.Element;\n commands?: readonly ChatCommand[];\n searchCommands?: (query: string, signal: AbortSignal) => Promise<readonly ChatCommand[]>;\n mentions?: readonly ChatMention[];\n onMentionsChange?: (mentions: readonly ChatMention[]) => void;\n /** Shared surface above the editor; suggestions temporarily replace this content. */\n accessory?: JSX.Element;\n contextUsage?: ChatContextUsageData;\n contextActions?: readonly ChatAction[];\n /** Optional action inside the context details popup. */\n contextPopupAction?: ChatAction;\n /** Additional compact controls rendered with the add/model controls. */\n footerTools?: JSX.Element;\n /** Compact application controls immediately before the send/stop button. */\n submitTools?: JSX.Element;\n /** Replaces footer controls during an application-owned interaction, preserving the editor. */\n footerContent?: JSX.Element;\n placeholder?: string;\n label?: string;\n inputLabel?: string;\n disabled?: boolean;\n error?: string;\n focusToken?: unknown;\n draftKey?: unknown;\n class?: string;\n /**\n * `\"conversation\"` is the composer for messages between people: one row with attach, a pill-shaped field and Send,\n * without the assistant prompt's footer. The field starts with one line and grows to a third of its nearest size\n * container, a hint line of fixed height sits above it, its buttons keep it focused, and Enter breaks the line\n * inside an open code block and on touch-only devices. The default is the assistant prompt.\n */\n variant?: \"default\" | \"conversation\";\n /** `\"enter\"` (default): Enter sends and Shift+Enter breaks the line. `\"mod-enter\"`: Enter breaks the line. Ctrl/⌘+Enter always sends. */\n sendKey?: \"enter\" | \"mod-enter\";\n /** Adds \"Aa\", which opens one row of Markdown formatting buttons above the field; the field and its controls stay put. */\n formatting?: boolean;\n /** An emoji button at a fixed place. Touch-only devices hide it; their keyboard has emoji. */\n emoji?: ChatComposerEmoji;\n /** A microphone at a fixed place: a tap dictates, holding it or its menu asks for a voice message. */\n microphone?: ChatComposerMicrophone;\n /** One line above the field. The conversation variant always keeps its height; the default shows it only with content. */\n hint?: JSX.Element;\n};\n\ntype FormatTool = {\n id: string;\n icon: string;\n label: (messages: UiMessages) => string;\n run: (textarea: HTMLTextAreaElement) => void;\n /** Ctrl/⌘ plus this `event.key`. */\n key?: string;\n /** Ctrl/⌘+Shift plus this `event.code`, the physical key, so every keyboard layout agrees. */\n shiftCode?: string;\n};\n\nconst insertComposerLink = (textarea: HTMLTextAreaElement): void => {\n const { value, selectionStart, selectionEnd } = textarea;\n const label = value.slice(selectionStart, selectionEnd);\n replaceTextareaRange(textarea, selectionStart, selectionEnd, `[${label}]()`);\n // Without a selection the label comes first, otherwise the address.\n const caret = label ? selectionStart + label.length + 3 : selectionStart + 1;\n textarea.setSelectionRange(caret, caret);\n};\n\nconst formatTools: readonly FormatTool[] = [\n { id: \"bold\", icon: \"ti ti-bold\", label: (m) => m.boldShortcut, run: (textarea) => toggleInlineMarker(textarea, \"**\"), key: \"b\" },\n { id: \"italic\", icon: \"ti ti-italic\", label: (m) => m.italicShortcut, run: (textarea) => toggleInlineMarker(textarea, \"*\"), key: \"i\" },\n {\n id: \"strikethrough\",\n icon: \"ti ti-strikethrough\",\n label: (m) => m.strikethroughShortcut,\n run: (textarea) => toggleInlineMarker(textarea, \"~~\"),\n shiftCode: \"KeyX\",\n },\n { id: \"code\", icon: \"ti ti-code\", label: (m) => m.inlineCodeShortcut, run: (textarea) => toggleInlineMarker(textarea, \"`\"), key: \"e\" },\n { id: \"code-block\", icon: \"ti ti-source-code\", label: (m) => m.codeBlock, run: toggleCodeBlock },\n { id: \"bullet-list\", icon: \"ti ti-list\", label: (m) => m.bulletListShortcut, run: toggleBulletList, shiftCode: \"Digit8\" },\n { id: \"quote\", icon: \"ti ti-quote\", label: (m) => m.quote, run: toggleQuote },\n { id: \"link\", icon: \"ti ti-link\", label: (m) => m.insertLink, run: insertComposerLink },\n];\n\nconst formatShortcut = (event: KeyboardEvent): FormatTool | undefined => {\n if (event.altKey || !(event.ctrlKey || event.metaKey)) return undefined;\n return formatTools.find((tool) => (event.shiftKey ? tool.shiftCode === event.code : tool.key === event.key.toLowerCase()));\n};\n\nconst touchOnlyQuery = \"(any-pointer: coarse) and (not (any-pointer: fine))\";\nconst isTouchOnly = () => typeof matchMedia === \"function\" && matchMedia(touchOnlyQuery).matches;\n/** How long a press on the microphone lasts before it asks for a voice message instead of dictation. */\nconst microphoneHoldMs = 500;\n/** Keeps the field focused (and a phone's keyboard open) when a composer button is pressed with a mouse or finger. */\nconst keepFieldFocus = (event: MouseEvent) => event.preventDefault();\n\nconst attachmentIcon = (attachment: ChatAttachment): string =>\n attachment.icon ?? (attachment.kind === \"image\" ? \"ti ti-photo\" : attachment.kind === \"resource\" ? \"ti ti-link\" : \"ti ti-file\");\n\nconst hasContent = (items: unknown[]) => items.some((item) => item != null && typeof item !== \"boolean\" && item !== \"\");\n\nexport function ChatComposer(props: ChatComposerProps): JSX.Element {\n const accessory = children(() => props.accessory);\n const hasAccessory = () => hasContent(accessory.toArray());\n const hint = children(() => props.hint);\n const messages = useUiMessages();\n const commandListId = `k2b-chat-commands-${createUniqueId().replace(/[^A-Za-z0-9_-]/g, \"-\")}`;\n const formatGroupId = `${commandListId}-format`;\n const [selectedCommandIndex, setSelectedCommandIndex] = createSignal(0);\n const [addingFiles, setAddingFiles] = createSignal(false);\n const [submitting, setSubmitting] = createSignal(false);\n let composerRef: HTMLElement | undefined;\n let textareaRef: HTMLTextAreaElement | undefined;\n let fileInputRef: HTMLInputElement | undefined;\n let measureRef: HTMLTextAreaElement | undefined;\n let microphoneRef: HTMLDivElement | undefined;\n let sawRunning = props.state === \"running\";\n const conversation = () => props.variant === \"conversation\";\n const [formattingOpen, setFormattingOpen] = createSignal(false);\n const [microphoneMenuOpen, setMicrophoneMenuOpen] = createSignal(false);\n const dictation = () => props.microphone?.dictation ?? null;\n const showHint = () => conversation() || dictation() !== null || hasContent(hint.toArray());\n\n const state = () => props.state ?? \"idle\";\n const running = () => state() === \"running\";\n const stopping = () => state() === \"stopping\";\n const runningSubmitIntent = () => props.runningSubmitIntent ?? \"steer\";\n const attachments = () => props.attachments ?? [];\n const [caret, setCaret] = createSignal(0);\n const [selectionEnd, setSelectionEnd] = createSignal(0);\n const [dismissed, setDismissed] = createSignal(false);\n const [composing, setComposing] = createSignal(false);\n const [searchResults, setSearchResults] = createSignal<readonly ChatCommand[]>([]);\n const [searching, setSearching] = createSignal(false);\n const [searchError, setSearchError] = createSignal(false);\n const [executing, setExecuting] = createSignal(false);\n let highlightRef: HTMLDivElement | undefined;\n let commandListRef: HTMLDivElement | undefined;\n const mentions = () => props.mentions ?? [];\n const locale = useLocale();\n const [emojiIndex, setEmojiIndex] = createSignal<EmojiIndex>();\n const emojiQuery = createMemo(() =>\n !props.emoji || dismissed() || composing() ? null : emojiShortcodeQuery(props.value, caret(), selectionEnd()),\n );\n // The emoji data loads with the first `:shortcode`; a failed load only means no suggestions.\n createEffect(() => {\n if (emojiQuery() && !emojiIndex()) loadEmojiIndex().then(setEmojiIndex, () => undefined);\n });\n const emojiMatches = createMemo(() => {\n const token = emojiQuery();\n const index = emojiIndex();\n return token && index ? suggestEmoji(index, token.query, emojiSuggestionLimit) : [];\n });\n const emojiOpen = () => emojiMatches().length > 0;\n const commandQuery = createMemo(() => (dismissed() || composing() ? null : chatCommandQuery(props.value, caret(), selectionEnd())));\n const commandMatches = createMemo(() => {\n const token = commandQuery();\n if (!token) return [];\n return [\n ...(props.commands ?? []).filter((command) => command.name.toLowerCase().includes(token.query.toLowerCase())),\n ...searchResults(),\n ];\n });\n const commandsOpen = () => Boolean(!emojiOpen() && commandQuery() && (props.commands?.length || props.searchCommands));\n const suggestionsOpen = () => commandsOpen() || emojiOpen();\n createEffect(() => {\n if (!suggestionsOpen()) return;\n let disposed = false;\n const measure = () => {\n if (disposed || !commandListRef) return;\n let top = window.visualViewport?.offsetTop ?? 0;\n for (let parent = commandListRef.parentElement; parent; parent = parent.parentElement) {\n if (/(auto|scroll|hidden|clip)/.test(window.getComputedStyle(parent).overflowY)) {\n top = Math.max(top, parent.getBoundingClientRect().top);\n }\n }\n const bottom = commandListRef.parentElement!.getBoundingClientRect().bottom;\n commandListRef.style.setProperty(\"--k2b-chat-command-space\", `${Math.max(40, bottom - top - 8)}px`);\n };\n queueMicrotask(measure);\n window.addEventListener(\"resize\", measure);\n window.addEventListener(\"scroll\", measure, true);\n window.visualViewport?.addEventListener(\"resize\", measure);\n onCleanup(() => {\n disposed = true;\n window.removeEventListener(\"resize\", measure);\n window.removeEventListener(\"scroll\", measure, true);\n window.visualViewport?.removeEventListener(\"resize\", measure);\n });\n });\n createEffect(() => {\n const token = commandQuery();\n setSearchResults([]);\n setSearchError(false);\n if (!token || !props.searchCommands) {\n setSearching(false);\n return;\n }\n const abort = new AbortController();\n setSearching(true);\n const timer = setTimeout(() => {\n Promise.resolve(props.searchCommands!(token.query, abort.signal))\n .then((results) => {\n if (!abort.signal.aborted) setSearchResults(results);\n })\n .catch(() => {\n if (!abort.signal.aborted) setSearchError(true);\n })\n .finally(() => {\n if (!abort.signal.aborted) setSearching(false);\n });\n }, 120);\n onCleanup(() => {\n clearTimeout(timer);\n abort.abort();\n });\n });\n const history: { value: string; mentions: readonly ChatMention[]; caret: number }[] = [];\n let historyIndex = -1;\n createEffect(() => {\n props.draftKey;\n untrack(() => {\n history.length = 0;\n historyIndex = -1;\n setDismissed(true);\n });\n });\n const snapshot = () => ({ value: props.value, mentions: [...mentions()], caret: textareaRef?.selectionStart ?? 0 });\n const sameMentions = (a: readonly ChatMention[], b: readonly ChatMention[]) =>\n a.length === b.length &&\n a.every((item, index) => item.start === b[index]?.start && item.end === b[index]?.end && item.attachment === b[index]?.attachment);\n const record = () => {\n if (history[historyIndex]?.value !== props.value || !sameMentions(history[historyIndex]?.mentions ?? [], mentions())) {\n history.splice(historyIndex + 1);\n history.push(snapshot());\n let size = history.reduce((total, entry) => total + entry.value.length, 0);\n while (history.length > 2 && size > composerUndoBudgetChars) size -= history.shift()!.value.length;\n historyIndex = history.length - 1;\n }\n };\n const edit = (value: string, nextMentions = reconcileChatMentions(props.value, value, mentions())) => {\n record();\n props.onValueChange(value);\n props.onMentionsChange?.(nextMentions);\n record();\n setDismissed(false);\n };\n const restoreHistory = (direction: -1 | 1) => {\n record();\n const next = history[historyIndex + direction];\n if (!next) return;\n historyIndex += direction;\n props.onValueChange(next.value);\n props.onMentionsChange?.(next.mentions);\n queueMicrotask(() => {\n textareaRef?.setSelectionRange(next.caret, next.caret);\n syncCaret();\n });\n };\n const syncCaret = () => {\n setCaret(textareaRef?.selectionStart ?? props.value.length);\n setSelectionEnd(textareaRef?.selectionEnd ?? props.value.length);\n };\n const selectedCommand = () => commandMatches()[selectedCommandIndex()];\n const busy = () => Boolean(props.disabled || stopping() || state() === \"submitting\" || executing() || addingFiles());\n const blocked = () => busy() || submitting();\n /** The conversation field stays editable while a message is sent, so it keeps the focus and a phone its keyboard. */\n const editBlocked = () => (conversation() ? busy() : blocked());\n const hasDraft = () => Boolean(props.value.trim() || (!running() && attachments().length > 0));\n const canSubmit = () => !blocked() && hasDraft() && !(running() && runningSubmitIntent() === \"steer\" && mentions().length);\n const canSelectFiles = () => Boolean(props.fileSelection && !props.fileSelection.disabled && !running() && !blocked());\n const hasAddMenu = () => Boolean(props.fileSelection || props.menuActions?.length);\n const hasContextUsage = () => {\n if (props.contextPopupAction) return true;\n const context = props.contextUsage;\n if (!context || typeof context.contextWindow !== \"number\" || !Number.isFinite(context.contextWindow) || context.contextWindow <= 0) {\n return false;\n }\n return [context.usage?.total, context.usage?.input, context.usage?.output].some(\n (value) => typeof value === \"number\" && Number.isFinite(value) && value >= 0,\n );\n };\n\n const menuItems = (): readonly DropdownItemData[] => {\n const items: DropdownItemData[] = [];\n if (props.fileSelection) {\n items.push({\n icon: addingFiles() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-paperclip\",\n label: props.fileSelection.label ?? messages().attachFiles,\n disabled: !canSelectFiles(),\n action: () => chooseFiles(),\n });\n }\n for (const action of props.menuActions ?? []) {\n items.push({\n icon: action.icon,\n label: action.label,\n variant: action.variant,\n disabled: action.disabled,\n action: () => reportChatFailure(() => executeChatAction(action), props.onError),\n });\n }\n return items;\n };\n\n const autoResize = () => {\n if (!textareaRef) return;\n if (conversation()) {\n // A hidden copy measures the text. Collapsing the field itself would shrink the composer for a frame, and\n // WebKit then clamps the scroll position of the conversation above it. CSS caps the height.\n if (!measureRef) return;\n measureRef.value = textareaRef.value;\n textareaRef.style.height = `${measureRef.scrollHeight}px`;\n return;\n }\n textareaRef.style.height = \"auto\";\n textareaRef.style.height = `${Math.min(textareaRef.scrollHeight, composerMaxInputHeight)}px`;\n };\n\n const focus = () => textareaRef?.focus();\n\n onMount(() => {\n autoResize();\n if (props.focusToken !== undefined) focus();\n // The copy follows the field's width, so a narrower composer measures more lines.\n if (measureRef && typeof ResizeObserver === \"function\") {\n const observer = new ResizeObserver(() => autoResize());\n observer.observe(measureRef);\n onCleanup(() => observer.disconnect());\n }\n });\n\n createEffect(() => {\n commandMatches();\n emojiMatches();\n setSelectedCommandIndex(0);\n });\n\n createEffect(() => {\n const index = selectedCommandIndex();\n commandMatches();\n emojiMatches();\n queueMicrotask(() => {\n const list = commandListRef;\n const item = list?.querySelector<HTMLElement>(`[id=\"${commandListId}-${index}\"]`);\n if (!list || !item?.isConnected) return;\n if (item.offsetTop < list.scrollTop) list.scrollTop = item.offsetTop;\n else if (item.offsetTop + item.offsetHeight > list.scrollTop + list.clientHeight) {\n list.scrollTop = item.offsetTop + item.offsetHeight - list.clientHeight;\n }\n });\n });\n\n createEffect(() => {\n props.value;\n queueMicrotask(autoResize);\n });\n\n createEffect(() => {\n props.focusToken;\n if (props.focusToken !== undefined) queueMicrotask(focus);\n });\n\n createEffect(() => {\n const active = running();\n if (sawRunning && !active && !props.disabled && typeof document !== \"undefined\") {\n const focused = document.activeElement as HTMLElement | null;\n const insideComposer = Boolean(focused && composerRef?.contains(focused));\n const editingElsewhere = Boolean(\n focused &&\n focused !== document.body &&\n !insideComposer &&\n (focused.matches(\"input, textarea, select\") || focused.isContentEditable || focused.closest(\"[role='dialog'], [popover]\")),\n );\n if (!editingElsewhere) queueMicrotask(focus);\n }\n sawRunning = active;\n });\n\n const setAttachments = (next: readonly ChatAttachment[]) => props.onAttachmentsChange?.(next);\n\n const renderAttachmentCopy = (attachment: ChatAttachment) => (\n <span>\n <strong title={attachment.name}>{attachment.name}</strong>\n </span>\n );\n\n const chooseFiles = () => {\n const selection = props.fileSelection;\n if (!selection?.choose) return fileInputRef?.click();\n selection.choose().then(\n // A single-file composer keeps the first chosen file, as its file dialog and drops do.\n (files) => void runFiles(selection.multiple === false ? files.slice(0, 1) : files),\n (error: unknown) => (props.fileSelection?.onError ?? props.onError)?.(error),\n );\n };\n\n const runFiles = async (files: FileList | readonly File[]) => {\n if (!canSelectFiles()) return;\n const selected = Array.from(files);\n if (selected.length === 0) return;\n setAddingFiles(true);\n try {\n await props.fileSelection?.onSelect(selected);\n } catch (error) {\n (props.fileSelection?.onError ?? props.onError)?.(error);\n } finally {\n setAddingFiles(false);\n if (fileInputRef) fileInputRef.value = \"\";\n queueMicrotask(focus);\n }\n };\n\n const submit = async () => {\n if (!canSubmit()) return;\n const intent = running() ? runningSubmitIntent() : \"send\";\n const previousValue = props.value;\n const previousAttachments = attachments();\n const previousMentions = mentions();\n const input: ChatSubmitInput = {\n intent,\n text: previousValue,\n mentions: previousMentions,\n attachments: intent !== \"steer\" ? previousAttachments : [],\n };\n\n setSubmitting(true);\n try {\n await runChatSubmission({\n clear: () => {\n props.onValueChange(\"\");\n props.onMentionsChange?.([]);\n if (intent !== \"steer\") setAttachments([]);\n },\n perform: () => props.onSubmit(input),\n restore: () => {\n // Text typed while the submission ran stays, after the returned draft. Its mentions are read first, because\n // an application may already move them when the text changes.\n const typed = props.value;\n const typedMentions = mentions();\n const shift = previousValue.length + 1;\n props.onValueChange(typed ? `${previousValue}\\n${typed}` : previousValue);\n props.onMentionsChange?.(\n typed\n ? [\n ...previousMentions,\n ...typedMentions.map((mention) => ({ ...mention, start: mention.start + shift, end: mention.end + shift })),\n ]\n : previousMentions,\n );\n if (intent !== \"steer\") setAttachments(previousAttachments);\n },\n onError: props.onError,\n });\n } finally {\n setSubmitting(false);\n queueMicrotask(() => {\n autoResize();\n focus();\n });\n }\n };\n\n const executeCommand = async (command: ChatCommand) => {\n const token = commandQuery();\n if (!token || command.disabled || blocked()) return;\n const previous = snapshot();\n const key = props.draftKey;\n const replacement = command.mention ? command.mention.name + \" \" : \"\";\n const nextValue = props.value.slice(0, token.start) + replacement + props.value.slice(token.end);\n const nextMentions = reconcileChatMentions(props.value, nextValue, mentions());\n if (command.mention)\n nextMentions.push({ start: token.start, end: token.start + command.mention.name.length, attachment: command.mention });\n edit(nextValue, nextMentions);\n setDismissed(true);\n setExecuting(true);\n let submitRequested = false;\n try {\n await command.action?.({\n setValue: (value) => edit(value),\n submit: () => {\n submitRequested = true;\n },\n focus,\n });\n } catch (error) {\n submitRequested = false;\n if (props.draftKey === key && props.value === nextValue) {\n props.onValueChange(previous.value);\n props.onMentionsChange?.(previous.mentions);\n }\n props.onError?.(error);\n } finally {\n setExecuting(false);\n }\n if (submitRequested && props.draftKey === key) await submit();\n queueMicrotask(() => {\n if (props.draftKey !== key) return;\n textareaRef?.setSelectionRange(token.start + replacement.length, token.start + replacement.length);\n syncCaret();\n autoResize();\n focus();\n });\n };\n\n /** Replaces `start`–`end` with the emoji through the editing path, so the browser's undo restores the shortcode. */\n const insertEmoji = (start: number, end: number, emoji: string) => {\n if (!textareaRef || editBlocked()) return;\n replaceTextareaRange(textareaRef, start, end, emoji);\n syncCaret();\n reportChatFailure(() => props.emoji?.onPick?.(emoji), props.onError);\n };\n const pickEmojiSuggestion = (position: number) => {\n const token = emojiQuery();\n const entry = emojiMatches()[position];\n if (!token || !entry) return;\n insertEmoji(token.start, token.end, emojiInTone(entry, props.emoji?.skinTone ?? 0));\n };\n /**\n * A typed colon loads the emoji data, and the closing colon of a known `:shortcode:` turns it into its emoji. A\n * shortcode closed before the data arrived turns when it arrives, as long as nothing changed in the meantime.\n */\n const completeShortcode = () => {\n const textarea = textareaRef;\n if (!props.emoji || !textarea) return;\n const { value, selectionStart: caret } = textarea;\n const completed = completedEmojiShortcode(value, caret);\n const convert = (index: EmojiIndex) => {\n const entry = completed && index.byShortcode.get(completed.shortcode.toLowerCase());\n if (completed && entry) insertEmoji(completed.start, completed.end, emojiInTone(entry, props.emoji?.skinTone ?? 0));\n };\n const index = emojiIndex();\n if (index) {\n convert(index);\n return;\n }\n loadEmojiIndex().then(\n (loaded) => {\n setEmojiIndex(loaded);\n const untouched = textarea.value === value && textarea.selectionStart === caret && textarea.selectionEnd === caret;\n if (untouched && textarea.matches(\":focus\")) convert(loaded);\n },\n () => undefined,\n );\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n // WebKit ends the composition before the keydown of the Enter that confirms it; that keydown keeps keyCode 229.\n if (event.isComposing || event.keyCode === 229 || composing()) return;\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === \"z\") {\n event.preventDefault();\n restoreHistory(event.shiftKey ? 1 : -1);\n return;\n }\n if (emojiOpen()) {\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n setSelectedCommandIndex((index) => nextChatCommandIndex(index, emojiMatches().length, event.key === \"ArrowUp\" ? -1 : 1));\n return;\n }\n // Only a plain Enter or Tab picks: Shift+Enter still breaks the line, Shift+Tab still moves the focus back.\n const plain = !event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey;\n if (plain && (event.key === \"Enter\" || event.key === \"Tab\")) {\n event.preventDefault();\n pickEmojiSuggestion(selectedCommandIndex());\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n setDismissed(true);\n return;\n }\n }\n const matches = commandMatches();\n if (commandsOpen()) {\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n setSelectedCommandIndex((index) => nextChatCommandIndex(index, matches.length, event.key === \"ArrowUp\" ? -1 : 1));\n return;\n }\n // Ctrl/⌘+Enter sends, also while suggestions are open.\n if ((event.key === \"Tab\" || (event.key === \"Enter\" && !event.ctrlKey && !event.metaKey)) && matches.length > 0) {\n event.preventDefault();\n const command = selectedCommand();\n if (command) void executeCommand(command);\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n setDismissed(true);\n return;\n }\n }\n const format = props.formatting && textareaRef ? formatShortcut(event) : undefined;\n if (format && textareaRef) {\n event.preventDefault();\n format.run(textareaRef);\n return;\n }\n if (event.key !== \"Enter\") return;\n if (conversation()) {\n const action = conversationEnterAction(event, {\n sendKey: props.sendKey ?? \"enter\",\n touchOnly: isTouchOnly(),\n inCodeBlock: openCodeFence(props.value, textareaRef?.selectionStart ?? props.value.length) !== null,\n });\n if (action === \"send\") {\n event.preventDefault();\n void submit();\n }\n return;\n }\n const send = props.sendKey === \"mod-enter\" ? event.ctrlKey || event.metaKey : !event.shiftKey;\n if (send && !event.isComposing) {\n event.preventDefault();\n void submit();\n }\n };\n\n const insertText = (text: string) => {\n if (!textareaRef || editBlocked()) return;\n replaceTextareaRange(textareaRef, textareaRef.selectionStart, textareaRef.selectionEnd, text);\n };\n\n let holdTimer: ReturnType<typeof setTimeout> | undefined;\n let held = false;\n const releaseHold = () => {\n clearTimeout(holdTimer);\n holdTimer = undefined;\n };\n onCleanup(releaseHold);\n const microphoneDisabled = () => Boolean(props.microphone?.disabled || blocked() || dictation() === \"refining\");\n const microphoneItems = (): readonly DropdownItemData[] => {\n const microphone = props.microphone;\n const items: DropdownItemData[] = [];\n if (microphone?.onDictate) {\n const dictate = microphone.onDictate;\n items.push({ icon: \"ti ti-microphone\", label: messages().dictate, action: () => reportChatFailure(dictate, props.onError) });\n }\n if (microphone?.onVoiceMessage) {\n const record = microphone.onVoiceMessage;\n items.push({\n icon: \"ti ti-player-record\",\n label: messages().recordVoiceMessage,\n action: () => reportChatFailure(record, props.onError),\n });\n }\n return items;\n };\n const dictationStatus = (): { icon: string; text: string } | null => {\n switch (dictation()) {\n case \"listening\":\n return { icon: \"ti ti-microphone\", text: messages().dictationListening };\n case \"refining\":\n return { icon: \"ti ti-loader-2 k2b-spin\", text: messages().dictationRefining };\n case \"refined\":\n return { icon: \"ti ti-sparkles\", text: messages().dictationRefined };\n case \"unrefined\":\n return { icon: \"ti ti-microphone\", text: messages().dictationUnrefined };\n case \"interrupted\":\n return { icon: \"ti ti-alert-triangle\", text: messages().dictationInterrupted };\n default:\n return null;\n }\n };\n\n const fileInput = () => (\n <Show when={props.fileSelection}>\n <input\n ref={fileInputRef}\n class=\"k2b-sr-only\"\n type=\"file\"\n tabIndex={-1}\n aria-hidden=\"true\"\n accept={props.fileSelection?.accept}\n multiple={props.fileSelection?.multiple ?? true}\n onChange={(event) => {\n if (event.currentTarget.files?.length) void runFiles(event.currentTarget.files);\n }}\n />\n </Show>\n );\n\n const addMenu = (icon: string, extraClass = \"\") => (\n <Dropdown.Root position=\"top-right\" label={messages().addToChat} items={menuItems()} disabled={blocked()}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class={`k2b-chat-composer__icon-action${extraClass}`}\n label={messages().addToChat}\n tooltip={messages().addToChat}\n >\n <i class={icon} aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n );\n\n /** The conversation's attach button opens the file choice directly; other actions turn it into the add menu. */\n const attachControl = () => (\n <Show\n when={props.menuActions?.length}\n fallback={\n <Show when={props.fileSelection}>\n {(selection) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__attach\"\n aria-label={selection().label ?? messages().attachFiles}\n content={selection().label ?? messages().attachFiles}\n disabled={!canSelectFiles()}\n onClick={chooseFiles}\n >\n <i class={addingFiles() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-paperclip\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </Show>\n }\n >\n {addMenu(\"ti ti-plus\", \" k2b-chat-composer__attach\")}\n </Show>\n );\n\n const formatToggle = () => (\n <Show when={props.formatting}>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__format-toggle\"\n aria-label={messages().composerFormatting}\n aria-pressed={formattingOpen()}\n aria-controls={formattingOpen() ? formatGroupId : undefined}\n content={messages().composerFormatting}\n onMouseDown={keepFieldFocus}\n onClick={() => setFormattingOpen((open) => !open)}\n >\n <i class=\"ti ti-letter-case\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n );\n\n /** One row of fixed height. It shows every button at once, also on a phone, so nothing hides behind a scroll. */\n const formatRow = () => (\n <Show when={props.formatting && formattingOpen()}>\n <div id={formatGroupId} class=\"k2b-chat-composer__format\" role=\"group\" aria-label={messages().composerFormatting}>\n <For each={formatTools}>\n {(tool) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action\"\n aria-label={tool.label(messages())}\n content={tool.label(messages())}\n disabled={editBlocked()}\n onMouseDown={keepFieldFocus}\n onClick={() => {\n if (textareaRef) tool.run(textareaRef);\n }}\n >\n <i class={tool.icon} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </For>\n </div>\n </Show>\n );\n\n const emojiButton = () => (\n <Show when={props.emoji}>\n {(emoji) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__emoji\"\n aria-label={messages().insertEmoji}\n content={messages().insertEmoji}\n disabled={editBlocked()}\n onMouseDown={keepFieldFocus}\n onClick={(event) => {\n const anchor = event.currentTarget;\n reportChatFailure(() => emoji().onOpen({ anchor, insert: insertText }), props.onError);\n }}\n >\n <i class=\"ti ti-mood-smile\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </Show>\n );\n\n const microphoneControl = () => (\n <Show when={props.microphone?.onDictate || props.microphone?.onVoiceMessage ? props.microphone : undefined}>\n {(microphone) => (\n <div ref={microphoneRef} class=\"k2b-chat-composer__microphone\">\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__microphone-button\"\n data-state={dictation() ?? undefined}\n disabled={microphoneDisabled()}\n aria-pressed={microphone().onDictate ? dictation() === \"listening\" : undefined}\n aria-haspopup={microphone().onDictate ? undefined : \"menu\"}\n aria-expanded={microphone().onDictate ? undefined : microphoneMenuOpen()}\n // A toggle keeps its name; the pressed state says that dictation runs.\n aria-label={microphone().onDictate ? messages().dictate : messages().recordVoiceMessage}\n content={\n dictation() === \"listening\"\n ? messages().stopDictation\n : microphone().onDictate\n ? microphone().onVoiceMessage\n ? messages().dictateOrHold\n : messages().dictate\n : messages().recordVoiceMessage\n }\n onMouseDown={keepFieldFocus}\n onContextMenu={(event) => event.preventDefault()}\n onPointerDown={(event) => {\n held = false;\n releaseHold();\n const record = microphone().onVoiceMessage;\n if (event.button !== 0 || !record || dictation() === \"listening\") return;\n holdTimer = setTimeout(() => {\n // The composer may have become blocked, or recording withdrawn, during the press.\n const current = props.microphone?.onVoiceMessage;\n if (!current || microphoneDisabled()) return;\n held = true;\n reportChatFailure(current, props.onError);\n }, microphoneHoldMs);\n }}\n onPointerUp={releaseHold}\n onPointerCancel={releaseHold}\n onPointerLeave={releaseHold}\n onClick={(event) => {\n // A press that already asked for a voice message ends here; a key press never holds.\n if (held) {\n held = false;\n if (event.detail > 0) return;\n }\n const dictate = microphone().onDictate;\n if (dictate) {\n reportChatFailure(dictate, props.onError);\n return;\n }\n setMicrophoneMenuOpen(true);\n // From the keyboard it opens the menu like a menu button: the focus moves to the first item.\n if (event.detail === 0) {\n queueMicrotask(() => microphoneRef?.querySelector<HTMLElement>('[role=\"menuitem\"]:not(:disabled)')?.focus());\n }\n }}\n >\n <i\n class={\n dictation() === \"listening\"\n ? \"ti ti-player-stop\"\n : dictation() === \"refining\"\n ? \"ti ti-loader-2 k2b-spin\"\n : \"ti ti-microphone\"\n }\n aria-hidden=\"true\"\n />\n </Tooltip.Trigger>\n <Show when={microphone().onVoiceMessage}>\n <Dropdown.Root\n position=\"top-left\"\n label={messages().microphoneOptions}\n items={microphoneItems()}\n disabled={microphoneDisabled()}\n open={microphoneMenuOpen()}\n onOpenChange={setMicrophoneMenuOpen}\n >\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__microphone-menu\"\n label={messages().microphoneOptions}\n tooltip={messages().microphoneOptions}\n >\n <i class=\"ti ti-chevron-up\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </div>\n )}\n </Show>\n );\n\n const sendControl = () => (\n <Show\n when={running() && !hasDraft() && props.onStop}\n fallback={\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__send\"\n disabled={!canSubmit()}\n onMouseDown={(event) => {\n if (conversation()) keepFieldFocus(event);\n }}\n aria-label={\n submitting()\n ? running()\n ? runningSubmitIntent() === \"queue\"\n ? messages().queueing\n : messages().steering\n : messages().sending\n : running()\n ? runningSubmitIntent() === \"queue\"\n ? messages().queueMessage\n : messages().steerResponse\n : messages().sendMessage\n }\n content={\n running() ? (runningSubmitIntent() === \"queue\" ? messages().queueMessage : messages().steerResponse) : messages().sendMessage\n }\n onClick={() => void submit()}\n >\n <i class={submitting() ? \"ti ti-loader-2 k2b-spin\" : conversation() ? \"ti ti-send\" : \"ti ti-arrow-up\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n }\n >\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__stop\"\n disabled={stopping()}\n aria-label={stopping() ? messages().stopping : messages().stopResponse}\n content={messages().stopResponse}\n onClick={() => reportChatFailure(() => props.onStop?.(), props.onError)}\n >\n <i class={stopping() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-player-stop\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n );\n\n const field = () => (\n <div class=\"k2b-chat-composer__input\" role=\"group\" aria-label={messages().messageInput}>\n <Show when={mentions().length > 0}>\n <div ref={highlightRef} class=\"k2b-chat-composer__highlight\" aria-hidden=\"true\">\n <For each={chatMentionSegments(props.value, mentions())}>\n {(part) => <span classList={{ \"k2b-chat-composer__mention\": Boolean(part.mention) }}>{part.text}</span>}\n </For>\n {\"\\n\"}\n </div>\n </Show>\n {/* biome-ignore lint/a11y/useAriaPropsSupportedByRole: popup attributes are conditional with the combobox role */}\n <textarea\n ref={textareaRef}\n classList={{ \"k2b-chat-composer__textarea--highlighted\": mentions().length > 0 }}\n rows={1}\n value={props.value}\n disabled={editBlocked()}\n enterkeyhint={conversation() ? \"enter\" : undefined}\n placeholder={\n props.placeholder ??\n (running() ? messages().addGuidance : conversation() ? messages().writeConversationMessage : messages().writeMessage)\n }\n aria-label={props.inputLabel ?? messages().message}\n role={suggestionsOpen() ? \"combobox\" : undefined}\n aria-autocomplete={suggestionsOpen() ? \"list\" : undefined}\n aria-controls={suggestionsOpen() ? commandListId : undefined}\n aria-expanded={suggestionsOpen() ? \"true\" : undefined}\n aria-activedescendant={\n (emojiOpen() ? emojiMatches()[selectedCommandIndex()] : selectedCommand())\n ? `${commandListId}-${selectedCommandIndex()}`\n : undefined\n }\n onInput={(event) => {\n edit(event.currentTarget.value);\n syncCaret();\n autoResize();\n const input = event as InputEvent;\n if (input.inputType === \"insertText\" && input.data === \":\") queueMicrotask(completeShortcode);\n }}\n onPaste={(event) => {\n const clipboardData = event.clipboardData;\n if (canSelectFiles() && clipboardData?.files.length) {\n event.preventDefault();\n void runFiles(clipboardData.files);\n return;\n }\n props.onPaste?.(event);\n }}\n onSelect={syncCaret}\n onBlur={() => setDismissed(true)}\n onClick={() => {\n setDismissed(false);\n syncCaret();\n }}\n onKeyUp={syncCaret}\n onCompositionStart={() => setComposing(true)}\n onCompositionEnd={() => {\n setComposing(false);\n syncCaret();\n }}\n onScroll={() => {\n if (highlightRef && textareaRef) highlightRef.scrollTop = textareaRef.scrollTop;\n }}\n onBeforeInput={(event) => {\n if (event.inputType === \"historyUndo\" || event.inputType === \"historyRedo\") {\n event.preventDefault();\n restoreHistory(event.inputType === \"historyUndo\" ? -1 : 1);\n }\n }}\n onKeyDown={onKeyDown}\n />\n <Show when={conversation()}>\n <textarea ref={measureRef} class=\"k2b-chat-composer__measure\" rows={1} tabIndex={-1} aria-hidden=\"true\" readOnly />\n </Show>\n </div>\n );\n\n return (\n <div class=\"k2b-chat-composer-shell\">\n <Show when={suggestionsOpen() || hasAccessory()}>\n {/* Suggestions alone float above the composer; a row of the shell's grid would add its gap and move the composer. */}\n <div class=\"k2b-chat-composer-slot\" data-overlay={hasAccessory() ? undefined : \"true\"}>\n <div style={{ visibility: suggestionsOpen() ? \"hidden\" : undefined }} inert={suggestionsOpen()}>\n {accessory()}\n </div>\n <Show when={emojiOpen()}>\n <div class=\"k2b-chat-composer-accessory\">\n <div\n ref={commandListRef}\n id={commandListId}\n class=\"k2b-chat-composer__commands\"\n role=\"listbox\"\n aria-label={messages().emojiSuggestions}\n >\n <For each={emojiMatches()}>\n {(entry, index) => (\n <button\n id={`${commandListId}-${index()}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={index() === selectedCommandIndex()}\n aria-label={emojiName(entry, locale())}\n data-active={index() === selectedCommandIndex() ? \"true\" : undefined}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => pickEmojiSuggestion(index())}\n >\n <span class=\"k2b-chat-composer__emoji-glyph\" aria-hidden=\"true\">\n {emojiInTone(entry, props.emoji?.skinTone ?? 0)}\n </span>\n <strong>{emojiName(entry, locale())}</strong>\n <Show when={entry.shortcodes[0]}>{(code) => <small>:{code()}:</small>}</Show>\n </button>\n )}\n </For>\n </div>\n </div>\n </Show>\n <Show when={commandsOpen()}>\n <div class=\"k2b-chat-composer-accessory\">\n <div\n ref={commandListRef}\n id={commandListId}\n class=\"k2b-chat-composer__commands\"\n role=\"listbox\"\n aria-label={messages().commands}\n >\n <For each={commandMatches()}>\n {(command, index) => (\n <button\n id={`${commandListId}-${index()}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={index() === selectedCommandIndex()}\n aria-disabled={command.disabled}\n data-active={index() === selectedCommandIndex() ? \"true\" : undefined}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => void executeCommand(command)}\n >\n <i class={command.icon ?? \"ti ti-slash\"} aria-hidden=\"true\" />\n <strong>{command.label ?? `/${command.name}`}</strong>\n <small>{command.description}</small>\n </button>\n )}\n </For>\n <Show when={searching()}>\n <div role=\"status\" class=\"k2b-chat-composer__loading\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n <strong>{messages().loading}</strong>\n </div>\n </Show>\n <Show when={searchError()}>\n <div role=\"status\">\n <i class=\"ti ti-alert-circle\" /> {messages().error}\n </div>\n </Show>\n <Show when={!searching() && !searchError() && commandMatches().length === 0}>\n <div role=\"status\">{messages().noResults}</div>\n </Show>\n </div>\n </div>\n </Show>\n </div>\n </Show>\n <section\n ref={composerRef}\n class={`k2b-chat-composer ${props.class ?? \"\"}`}\n data-running={running() ? \"true\" : undefined}\n data-variant={conversation() ? \"conversation\" : undefined}\n role=\"group\"\n aria-label={props.label ?? messages().messageComposer}\n >\n <Show when={showHint()}>\n <div class=\"k2b-chat-composer__hint\" aria-live=\"polite\">\n <Show when={dictationStatus()} fallback={<span class=\"k2b-chat-composer__hint-text\">{hint()}</span>}>\n {(status) => (\n <>\n <span class=\"k2b-chat-composer__dictation\" data-state={dictation() ?? undefined}>\n <i class={status().icon} aria-hidden=\"true\" />\n <span>{status().text}</span>\n </span>\n <Show when={dictation() === \"refined\" ? props.microphone?.onRestoreOriginal : undefined}>\n {(restore) => (\n <button\n type=\"button\"\n class=\"k2b-chat-composer__hint-action\"\n disabled={microphoneDisabled()}\n onMouseDown={keepFieldFocus}\n onClick={() => reportChatFailure(restore(), props.onError)}\n >\n {messages().restoreOriginal}\n </button>\n )}\n </Show>\n </>\n )}\n </Show>\n </div>\n </Show>\n <Show when={attachments().length > 0}>\n <div class=\"k2b-chat-composer__attachments\" role=\"list\" aria-label={messages().attachments} tabIndex={0}>\n <For each={attachments()}>\n {(attachment) => (\n <div class=\"k2b-chat-composer__attachment\" role=\"listitem\">\n <div\n class=\"k2b-chat-composer__attachment-content\"\n classList={{ \"k2b-chat-composer__attachment-content--action\": Boolean(attachment.action) }}\n >\n <Show\n when={attachment.href}\n fallback={\n <div class=\"k2b-chat-composer__attachment-identity\">\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img src={attachment.previewUrl} alt={attachment.alt ?? \"\"} />\n </Show>\n {renderAttachmentCopy(attachment)}\n </div>\n }\n >\n {(href) => (\n <a\n class=\"k2b-chat-composer__attachment-link\"\n href={href()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={messages().openInNewTab({ name: attachment.name })}\n >\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img src={attachment.previewUrl} alt={attachment.alt ?? \"\"} />\n </Show>\n {renderAttachmentCopy(attachment)}\n </a>\n )}\n </Show>\n <Show when={attachment.action}>\n {(action) => (\n <button\n type=\"button\"\n class=\"k2b-chat-composer__attachment-action\"\n disabled={blocked() || action().disabled}\n onClick={() => reportChatFailure(() => executeChatAction(action()), props.onError)}\n >\n <Show when={action().icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n {action().label}\n </button>\n )}\n </Show>\n </div>\n <Show when={props.onAttachmentsChange}>\n <button\n type=\"button\"\n class=\"k2b-chat-composer__attachment-remove\"\n aria-label={messages().removeNamed({ name: attachment.name })}\n disabled={blocked()}\n onClick={() => setAttachments(attachments().filter((candidate) => candidate.id !== attachment.id))}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n )}\n </For>\n </div>\n </Show>\n\n <Show\n when={conversation()}\n fallback={\n <>\n {field()}\n\n <Show when={props.error}>\n <div class=\"k2b-chat-composer__error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n {props.error}\n </div>\n </Show>\n\n {formatRow()}\n\n <footer class=\"k2b-chat-composer__footer\">\n <Show\n when={props.footerContent}\n fallback={\n <>\n <div class=\"k2b-chat-composer__tools\">\n {props.footerTools}\n <Show when={hasAddMenu()}>{addMenu(\"ti ti-plus\")}</Show>\n {fileInput()}\n {formatToggle()}\n {emojiButton()}\n <Show when={(props.models?.length ?? 0) > 0}>\n <SelectChip\n aria-label={messages().chooseModel}\n position=\"top-right\"\n class=\"k2b-chat-composer__model\"\n menuWidth=\"15rem\"\n placeholder={messages().model}\n value={() => props.selectedModelId ?? \"\"}\n options={(props.models ?? []).map((model) => ({\n value: model.id,\n label: model.label,\n description: model.description,\n icon: model.icon,\n image: model.image,\n }))}\n disabled={blocked() || running() || !props.onModelChange}\n onValueChange={(modelId) => {\n props.onModelChange?.(modelId);\n queueMicrotask(focus);\n }}\n />\n </Show>\n {props.modelDetails}\n </div>\n\n <div class=\"k2b-chat-composer__submit\">\n <For each={props.contextActions}>\n {(action) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action\"\n data-tone={action.variant === \"danger\" ? \"danger\" : undefined}\n disabled={action.disabled}\n aria-pressed={action.pressed}\n aria-label={action.label}\n content={action.label}\n onClick={() => reportChatFailure(() => executeChatAction(action), props.onError)}\n >\n <i class={action.icon ?? \"ti ti-dots\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </For>\n <Show when={hasContextUsage() ? (props.contextUsage ?? {}) : undefined}>\n {(usage) => <ContextUsage {...usage()} action={props.contextPopupAction} onActionError={props.onError} />}\n </Show>\n {props.submitTools}\n {microphoneControl()}\n {sendControl()}\n </div>\n </>\n }\n >\n {(content) => content()}\n </Show>\n </footer>\n </>\n }\n >\n <Show when={props.error}>\n <div class=\"k2b-chat-composer__error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n {props.error}\n </div>\n </Show>\n {formatRow()}\n {/* One row: attach, the field with its tools, and Send. */}\n <div class=\"k2b-chat-composer__row\">\n {attachControl()}\n {fileInput()}\n <div class=\"k2b-chat-composer__field\">\n {field()}\n <div class=\"k2b-chat-composer__field-tools\">\n {formatToggle()}\n {emojiButton()}\n {microphoneControl()}\n </div>\n </div>\n {sendControl()}\n </div>\n </Show>\n {/* Files dropped anywhere in the surrounding workspace area attach to the message. */}\n <Show when={props.fileSelection}>\n {(selection) => (\n <FileDropTarget\n label={messages().dropFilesToAttach}\n accept={selection().accept}\n multiple={selection().multiple}\n disabled={!canSelectFiles()}\n onDrop={(files) => void runFiles(files)}\n />\n )}\n </Show>\n </section>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -45,4 +45,13 @@ export const executeChatAction = async action => {
45
45
  }
46
46
  await action.onSelect();
47
47
  };
48
+ /**
49
+ * What Enter does in a conversation composer: Ctrl/⌘+Enter always sends; Shift+Enter, Enter inside an open code
50
+ * block, and Enter on a touch-only device break the line; otherwise `sendKey` decides. IME input is the caller's check.
51
+ */
52
+ export const conversationEnterAction = (key, context) => {
53
+ if (key.ctrlKey || key.metaKey) return "send";
54
+ if (key.shiftKey || key.altKey || context.touchOnly || context.inCodeBlock || context.sendKey === "mod-enter") return "newline";
55
+ return "send";
56
+ };
48
57
  //# sourceMappingURL=chat-behavior.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["chat/chat-behavior.ts"],"sourcesContent":["import type { ChatAction } from \"./types\";\n\nexport const nextChatCommandIndex = (index: number, length: number, direction: 1 | -1): number =>\n length <= 0 ? 0 : (index + direction + length) % length;\n\nexport const isChatNearBottom = (scrollHeight: number, scrollTop: number, clientHeight: number, threshold = 96): boolean =>\n scrollHeight - scrollTop - clientHeight <= threshold;\n\nexport const restoredChatScrollTop = (previousScrollTop: number, previousScrollHeight: number, nextScrollHeight: number): number =>\n Math.max(0, previousScrollTop + nextScrollHeight - previousScrollHeight);\n\nexport type ChatSubmissionRun = {\n /** Clears the controlled draft (and attachments) before the handler runs. */\n clear: () => void;\n /**\n * The application handler. A synchronous throw, a rejected promise, and a\n * `false` result all count as a rejected submission.\n */\n perform: () => boolean | void | Promise<boolean | void>;\n /** Restores the cleared draft (and attachments) after a rejected submission. */\n restore: () => void;\n onError?: (error: unknown) => void;\n};\n\n/**\n * Runs one composer submission with optimistic clearing. Resolves to `true`\n * when the handler accepted the submission. A synchronous throw is handled\n * exactly like a rejected promise so a controlled draft is never lost.\n */\nexport const runChatSubmission = async (run: ChatSubmissionRun): Promise<boolean> => {\n run.clear();\n try {\n if ((await run.perform()) === false) {\n run.restore();\n return false;\n }\n return true;\n } catch (error) {\n run.onError?.(error);\n run.restore();\n return false;\n }\n};\n\n/** Reports a handler failure without letting a synchronous throw escape. */\nexport const reportChatFailure = (perform: () => unknown, onError?: (error: unknown) => void): void => {\n try {\n const result = perform();\n if (result instanceof Promise) void result.catch((error) => onError?.(error));\n } catch (error) {\n onError?.(error);\n }\n};\n\nconst writeChatClipboard = async (value: string): Promise<void> => {\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.writeText) {\n throw new Error(\"Clipboard access is unavailable.\");\n }\n await navigator.clipboard.writeText(value);\n};\n\n/** Executes the one behavior guaranteed by the ChatAction contract. */\nexport const executeChatAction = async (action: ChatAction): Promise<void> => {\n if (typeof action.copyText === \"string\") {\n await writeChatClipboard(action.copyText);\n return;\n }\n await action.onSelect();\n};\n"],"mappings":"AAEA,OAAO,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,SAAiB,KACnF,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,SAAS,GAAG,MAAM,IAAI,MAAM;AAEzD,OAAO,MAAM,gBAAgB,GAAG,CAAC,YAAoB,EAAE,SAAiB,EAAE,YAAoB,EAAE,SAAS,GAAG,EAAE,KAC5G,YAAY,GAAG,SAAS,GAAG,YAAY,IAAI,SAAS;AAEtD,OAAO,MAAM,qBAAqB,GAAG,CAAC,iBAAyB,EAAE,oBAA4B,EAAE,gBAAwB,KACrH,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,oBAAoB,CAAC;AAe1E;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,iBAAiB,GAAG,MAAO,GAAsB,IAAuB;EACnF,GAAG,CAAC,KAAK,CAAC,CAAC;EACX,IAAI;IACF,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,EAAE;MACnC,GAAG,CAAC,OAAO,CAAC,CAAC;MACb,OAAO,KAAK;IACd;IACA,OAAO,IAAI;EACb,CAAC,CAAC,OAAO,KAAK,EAAE;IACd,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACpB,GAAG,CAAC,OAAO,CAAC,CAAC;IACb,OAAO,KAAK;EACd;AACF,CAAC;;AAED;AACA,OAAO,MAAM,iBAAiB,GAAG,CAAC,OAAsB,EAAE,OAAkC,KAAW;EACrG,IAAI;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC;IACxB,IAAI,MAAM,YAAY,OAAO,EAAE,KAAK,MAAM,CAAC,KAAK,CAAE,KAAK,IAAK,OAAO,GAAG,KAAK,CAAC,CAAC;EAC/E,CAAC,CAAC,OAAO,KAAK,EAAE;IACd,OAAO,GAAG,KAAK,CAAC;EAClB;AACF,CAAC;AAED,MAAM,kBAAkB,GAAG,MAAO,KAAa,IAAoB;EACjE,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE;IACvE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC;EACrD;EACA,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;AAC5C,CAAC;;AAED;AACA,OAAO,MAAM,iBAAiB,GAAG,MAAO,MAAkB,IAAoB;EAC5E,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE;IACvC,MAAM,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC;IACzC;EACF;EACA,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["chat/chat-behavior.ts"],"sourcesContent":["import type { ChatAction } from \"./types\";\n\nexport const nextChatCommandIndex = (index: number, length: number, direction: 1 | -1): number =>\n length <= 0 ? 0 : (index + direction + length) % length;\n\nexport const isChatNearBottom = (scrollHeight: number, scrollTop: number, clientHeight: number, threshold = 96): boolean =>\n scrollHeight - scrollTop - clientHeight <= threshold;\n\nexport const restoredChatScrollTop = (previousScrollTop: number, previousScrollHeight: number, nextScrollHeight: number): number =>\n Math.max(0, previousScrollTop + nextScrollHeight - previousScrollHeight);\n\nexport type ChatSubmissionRun = {\n /** Clears the controlled draft (and attachments) before the handler runs. */\n clear: () => void;\n /**\n * The application handler. A synchronous throw, a rejected promise, and a\n * `false` result all count as a rejected submission.\n */\n perform: () => boolean | void | Promise<boolean | void>;\n /** Restores the cleared draft (and attachments) after a rejected submission. */\n restore: () => void;\n onError?: (error: unknown) => void;\n};\n\n/**\n * Runs one composer submission with optimistic clearing. Resolves to `true`\n * when the handler accepted the submission. A synchronous throw is handled\n * exactly like a rejected promise so a controlled draft is never lost.\n */\nexport const runChatSubmission = async (run: ChatSubmissionRun): Promise<boolean> => {\n run.clear();\n try {\n if ((await run.perform()) === false) {\n run.restore();\n return false;\n }\n return true;\n } catch (error) {\n run.onError?.(error);\n run.restore();\n return false;\n }\n};\n\n/** Reports a handler failure without letting a synchronous throw escape. */\nexport const reportChatFailure = (perform: () => unknown, onError?: (error: unknown) => void): void => {\n try {\n const result = perform();\n if (result instanceof Promise) void result.catch((error) => onError?.(error));\n } catch (error) {\n onError?.(error);\n }\n};\n\nconst writeChatClipboard = async (value: string): Promise<void> => {\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.writeText) {\n throw new Error(\"Clipboard access is unavailable.\");\n }\n await navigator.clipboard.writeText(value);\n};\n\n/** Executes the one behavior guaranteed by the ChatAction contract. */\nexport const executeChatAction = async (action: ChatAction): Promise<void> => {\n if (typeof action.copyText === \"string\") {\n await writeChatClipboard(action.copyText);\n return;\n }\n await action.onSelect();\n};\n\nexport type ChatEnterKey = { shiftKey: boolean; ctrlKey: boolean; metaKey: boolean; altKey: boolean };\n\n/**\n * What Enter does in a conversation composer: Ctrl/⌘+Enter always sends; Shift+Enter, Enter inside an open code\n * block, and Enter on a touch-only device break the line; otherwise `sendKey` decides. IME input is the caller's check.\n */\nexport const conversationEnterAction = (\n key: ChatEnterKey,\n context: { sendKey: \"enter\" | \"mod-enter\"; touchOnly: boolean; inCodeBlock: boolean },\n): \"send\" | \"newline\" => {\n if (key.ctrlKey || key.metaKey) return \"send\";\n if (key.shiftKey || key.altKey || context.touchOnly || context.inCodeBlock || context.sendKey === \"mod-enter\") return \"newline\";\n return \"send\";\n};\n"],"mappings":"AAEA,OAAO,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,SAAiB,KACnF,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,SAAS,GAAG,MAAM,IAAI,MAAM;AAEzD,OAAO,MAAM,gBAAgB,GAAG,CAAC,YAAoB,EAAE,SAAiB,EAAE,YAAoB,EAAE,SAAS,GAAG,EAAE,KAC5G,YAAY,GAAG,SAAS,GAAG,YAAY,IAAI,SAAS;AAEtD,OAAO,MAAM,qBAAqB,GAAG,CAAC,iBAAyB,EAAE,oBAA4B,EAAE,gBAAwB,KACrH,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,oBAAoB,CAAC;AAe1E;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,iBAAiB,GAAG,MAAO,GAAsB,IAAuB;EACnF,GAAG,CAAC,KAAK,CAAC,CAAC;EACX,IAAI;IACF,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,EAAE;MACnC,GAAG,CAAC,OAAO,CAAC,CAAC;MACb,OAAO,KAAK;IACd;IACA,OAAO,IAAI;EACb,CAAC,CAAC,OAAO,KAAK,EAAE;IACd,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACpB,GAAG,CAAC,OAAO,CAAC,CAAC;IACb,OAAO,KAAK;EACd;AACF,CAAC;;AAED;AACA,OAAO,MAAM,iBAAiB,GAAG,CAAC,OAAsB,EAAE,OAAkC,KAAW;EACrG,IAAI;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC;IACxB,IAAI,MAAM,YAAY,OAAO,EAAE,KAAK,MAAM,CAAC,KAAK,CAAE,KAAK,IAAK,OAAO,GAAG,KAAK,CAAC,CAAC;EAC/E,CAAC,CAAC,OAAO,KAAK,EAAE;IACd,OAAO,GAAG,KAAK,CAAC;EAClB;AACF,CAAC;AAED,MAAM,kBAAkB,GAAG,MAAO,KAAa,IAAoB;EACjE,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE;IACvE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC;EACrD;EACA,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;AAC5C,CAAC;;AAED;AACA,OAAO,MAAM,iBAAiB,GAAG,MAAO,MAAkB,IAAoB;EAC5E,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE;IACvC,MAAM,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC;IACzC;EACF;EACA,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAID;AACA;AACA;AACA;AACA,OAAO,MAAM,uBAAuB,GAAG,CACrC,GAAiB,EACjB,OAAqF,KAC9D;EACvB,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,MAAM;EAC7C,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,KAAK,WAAW,EAAE,OAAO,SAAS;EAC/H,OAAO,MAAM;AACf,CAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["chat/index.ts"],"sourcesContent":["export type { ChatContextPanelProps, ChatContextPopupProps } from \"./ChatContextPopup\";\n\nimport { ChatContextPanel, ChatContextPopup } from \"./ChatContextPopup\";\nimport { ChatTasks } from \"./ChatTasks\";\n\nexport type { ChatTask, ChatTasksProps } from \"./ChatTasks\";\n\nimport { ChatComposer } from \"./ChatComposer\";\nimport { ChatActivity, ChatContextUsage, ChatMessage } from \"./ChatPrimitives\";\nimport { ChatRoot } from \"./ChatRoot\";\nimport { ChatTimeline } from \"./ChatTimeline\";\n\nexport type { ChatCommand, ChatCommandContext, ChatComposerProps, ChatFileSelection, ChatPasteHandler } from \"./ChatComposer\";\nexport type { ChatActivityProps, ChatContextUsageProps, ChatMessageProps } from \"./ChatPrimitives\";\nexport { formatChatTokens } from \"./ChatPrimitives\";\nexport type { ChatRootProps } from \"./ChatRoot\";\nexport type { ChatActivityItem, ChatMessageItem, ChatTimelineItem, ChatTimelineProps } from \"./ChatTimeline\";\nexport type {\n ChatAction,\n ChatActivityTone,\n ChatAttachment,\n ChatComposerState,\n ChatContextUsageData,\n ChatMention,\n ChatMessageStatus,\n ChatModelOption,\n ChatRole,\n ChatSubmitInput,\n ChatSubmitIntent,\n ChatUsage,\n} from \"./types\";\n\n/**\n * Portable, controlled chat surface. Applications own storage, streaming,\n * authorization, rich message rendering, and domain actions.\n */\nexport const Chat = Object.assign(ChatRoot, {\n Tasks: ChatTasks,\n Timeline: ChatTimeline,\n Message: ChatMessage,\n Activity: ChatActivity,\n Composer: ChatComposer,\n ContextUsage: ChatContextUsage,\n ContextPopup: ChatContextPopup,\n ContextPanel: ChatContextPanel,\n});\n\nexport { reconcileChatMentions } from \"./composer-document\";\n"],"mappings":"AAEA,SAAS,gBAAgB,EAAE,gBAAgB,QAAQ,oBAAoB;AACvE,SAAS,SAAS,QAAQ,aAAa;AAIvC,SAAS,YAAY,QAAQ,gBAAgB;AAC7C,SAAS,YAAY,EAAE,gBAAgB,EAAE,WAAW,QAAQ,kBAAkB;AAC9E,SAAS,QAAQ,QAAQ,YAAY;AACrC,SAAS,YAAY,QAAQ,gBAAgB;AAI7C,SAAS,gBAAgB,QAAQ,kBAAkB;AAkBnD;AACA;AACA;AACA;AACA,OAAO,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;EAC1C,KAAK,EAAE,SAAS;EAChB,QAAQ,EAAE,YAAY;EACtB,OAAO,EAAE,WAAW;EACpB,QAAQ,EAAE,YAAY;EACtB,QAAQ,EAAE,YAAY;EACtB,YAAY,EAAE,gBAAgB;EAC9B,YAAY,EAAE,gBAAgB;EAC9B,YAAY,EAAE;AAChB,CAAC,CAAC;AAEF,SAAS,qBAAqB,QAAQ,qBAAqB","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["chat/index.ts"],"sourcesContent":["export type { ChatContextPanelProps, ChatContextPopupProps } from \"./ChatContextPopup\";\n\nimport { ChatContextPanel, ChatContextPopup } from \"./ChatContextPopup\";\nimport { ChatTasks } from \"./ChatTasks\";\n\nexport type { ChatTask, ChatTasksProps } from \"./ChatTasks\";\n\nimport { ChatComposer } from \"./ChatComposer\";\nimport { ChatActivity, ChatContextUsage, ChatMessage } from \"./ChatPrimitives\";\nimport { ChatRoot } from \"./ChatRoot\";\nimport { ChatTimeline } from \"./ChatTimeline\";\n\nexport type { ChatCommand, ChatCommandContext, ChatComposerProps, ChatFileSelection, ChatPasteHandler } from \"./ChatComposer\";\nexport type { ChatActivityProps, ChatContextUsageProps, ChatMessageProps } from \"./ChatPrimitives\";\nexport { formatChatTokens } from \"./ChatPrimitives\";\nexport type { ChatRootProps } from \"./ChatRoot\";\nexport type { ChatActivityItem, ChatMessageItem, ChatTimelineItem, ChatTimelineProps } from \"./ChatTimeline\";\nexport type {\n ChatAction,\n ChatActivityTone,\n ChatAttachment,\n ChatComposerEmoji,\n ChatComposerMicrophone,\n ChatComposerState,\n ChatContextUsageData,\n ChatDictationState,\n ChatMention,\n ChatMessageStatus,\n ChatModelOption,\n ChatRole,\n ChatSubmitInput,\n ChatSubmitIntent,\n ChatUsage,\n} from \"./types\";\n\n/**\n * Portable, controlled chat surface. Applications own storage, streaming,\n * authorization, rich message rendering, and domain actions.\n */\nexport const Chat = Object.assign(ChatRoot, {\n Tasks: ChatTasks,\n Timeline: ChatTimeline,\n Message: ChatMessage,\n Activity: ChatActivity,\n Composer: ChatComposer,\n ContextUsage: ChatContextUsage,\n ContextPopup: ChatContextPopup,\n ContextPanel: ChatContextPanel,\n});\n\nexport { reconcileChatMentions } from \"./composer-document\";\n"],"mappings":"AAEA,SAAS,gBAAgB,EAAE,gBAAgB,QAAQ,oBAAoB;AACvE,SAAS,SAAS,QAAQ,aAAa;AAIvC,SAAS,YAAY,QAAQ,gBAAgB;AAC7C,SAAS,YAAY,EAAE,gBAAgB,EAAE,WAAW,QAAQ,kBAAkB;AAC9E,SAAS,QAAQ,QAAQ,YAAY;AACrC,SAAS,YAAY,QAAQ,gBAAgB;AAI7C,SAAS,gBAAgB,QAAQ,kBAAkB;AAqBnD;AACA;AACA;AACA;AACA,OAAO,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;EAC1C,KAAK,EAAE,SAAS;EAChB,QAAQ,EAAE,YAAY;EACtB,OAAO,EAAE,WAAW;EACpB,QAAQ,EAAE,YAAY;EACtB,QAAQ,EAAE,YAAY;EACtB,YAAY,EAAE,gBAAgB;EAC9B,YAAY,EAAE,gBAAgB;EAC9B,YAAY,EAAE;AAChB,CAAC,CAAC;AAEF,SAAS,qBAAqB,QAAQ,qBAAqB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["chat/types.ts"],"sourcesContent":["export type ChatRole = \"user\" | \"assistant\" | \"system\" | \"tool\";\n\nexport type ChatMessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n\nexport type ChatActivityTone = \"neutral\" | \"ai\" | \"success\" | \"danger\";\n\ntype ChatActionBase = {\n id: string;\n label: string;\n icon?: string;\n variant?: \"danger\";\n disabled?: boolean;\n /** Toggle state for persistent message actions such as feedback. */\n pressed?: boolean;\n /** Semantic foreground for selected feedback actions, without a persistent background. */\n pressedTone?: \"success\" | \"danger\";\n};\n\n/** Exactly one executable behavior for every chat action. */\nexport type ChatAction = ChatActionBase &\n ({ onSelect: () => void | Promise<void>; copyText?: never } | { copyText: string; onSelect?: never });\n\nexport type ChatAttachment = {\n id: string;\n name: string;\n size?: number;\n kind?: \"file\" | \"image\" | \"resource\";\n icon?: string;\n previewUrl?: string;\n alt?: string;\n /** Optional destination represented by this attachment. */\n href?: string;\n /** Opaque application-owned payload returned unchanged with ChatSubmitInput. */\n data?: unknown;\n /** Optional application-owned action presented below the attachment label. */\n action?: ChatAction;\n};\n\nexport type ChatUsage = {\n input?: number;\n output?: number;\n total?: number;\n};\n\nexport type ChatContextUsageData = {\n usage?: ChatUsage | null;\n loopUsage?: ChatUsage | null;\n contextWindow?: number;\n modelLabel?: string;\n};\n\nexport type ChatModelOption = {\n id: string;\n label: string;\n description?: string;\n image?: string;\n icon?: string;\n capabilities?: readonly string[];\n};\n\nexport type ChatComposerState = \"idle\" | \"submitting\" | \"running\" | \"stopping\";\n\nexport type ChatSubmitIntent = \"send\" | \"steer\" | \"queue\";\n\nexport type ChatSubmitInput = {\n intent: ChatSubmitIntent;\n text: string;\n attachments: readonly ChatAttachment[];\n mentions?: readonly ChatMention[];\n};\n\n/** Ranges use UTF-16 offsets into the untrimmed composer text. Payloads stay application-owned. */\nexport type ChatMention = { start: number; end: number; attachment: ChatAttachment };\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["chat/types.ts"],"sourcesContent":["import type { EmojiSkinTone } from \"../inputs/emoji/emoji-index\";\n\nexport type ChatRole = \"user\" | \"assistant\" | \"system\" | \"tool\";\n\nexport type ChatMessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n\nexport type ChatActivityTone = \"neutral\" | \"ai\" | \"success\" | \"danger\";\n\ntype ChatActionBase = {\n id: string;\n label: string;\n icon?: string;\n variant?: \"danger\";\n disabled?: boolean;\n /** Toggle state for persistent message actions such as feedback. */\n pressed?: boolean;\n /** Semantic foreground for selected feedback actions, without a persistent background. */\n pressedTone?: \"success\" | \"danger\";\n};\n\n/** Exactly one executable behavior for every chat action. */\nexport type ChatAction = ChatActionBase &\n ({ onSelect: () => void | Promise<void>; copyText?: never } | { copyText: string; onSelect?: never });\n\nexport type ChatAttachment = {\n id: string;\n name: string;\n size?: number;\n kind?: \"file\" | \"image\" | \"resource\";\n icon?: string;\n previewUrl?: string;\n alt?: string;\n /** Optional destination represented by this attachment. */\n href?: string;\n /** Opaque application-owned payload returned unchanged with ChatSubmitInput. */\n data?: unknown;\n /** Optional application-owned action presented below the attachment label. */\n action?: ChatAction;\n};\n\nexport type ChatUsage = {\n input?: number;\n output?: number;\n total?: number;\n};\n\nexport type ChatContextUsageData = {\n usage?: ChatUsage | null;\n loopUsage?: ChatUsage | null;\n contextWindow?: number;\n modelLabel?: string;\n};\n\nexport type ChatModelOption = {\n id: string;\n label: string;\n description?: string;\n image?: string;\n icon?: string;\n capabilities?: readonly string[];\n};\n\nexport type ChatComposerState = \"idle\" | \"submitting\" | \"running\" | \"stopping\";\n\nexport type ChatSubmitIntent = \"send\" | \"steer\" | \"queue\";\n\nexport type ChatSubmitInput = {\n intent: ChatSubmitIntent;\n text: string;\n attachments: readonly ChatAttachment[];\n mentions?: readonly ChatMention[];\n};\n\n/** Ranges use UTF-16 offsets into the untrimmed composer text. Payloads stay application-owned. */\nexport type ChatMention = { start: number; end: number; attachment: ChatAttachment };\n\n/**\n * Live dictation as the caller runs it: `listening` while speech arrives, `refining` after the stop until the refined\n * text replaced it, `refined` afterwards, `unrefined` when the raw text stays, and `interrupted` when the connection\n * ended early and the text so far stays.\n */\nexport type ChatDictationState = \"listening\" | \"refining\" | \"refined\" | \"unrefined\" | \"interrupted\";\n\n/** The composer's microphone. Dictation comes first; a voice message is the deliberate second action. */\nexport type ChatComposerMicrophone = {\n /** A tap starts or stops live dictation. Without it, a tap opens the microphone menu. */\n onDictate?: () => void;\n /** Holding the microphone, or \"Record voice message\" in its menu. Omit it where recording is not available. */\n onVoiceMessage?: () => void;\n /** The dictation state, shown on the microphone and in the hint line. */\n dictation?: ChatDictationState | null;\n /** Offered as \"Restore original\" while `dictation` is `refined`. */\n onRestoreOriginal?: () => void;\n disabled?: boolean;\n};\n\n/**\n * The composer's emoji button and `:shortcode` completion. Typing a colon and two letters suggests emoji by their\n * English or German name or GitHub shortcode; a complete `:thumbsup:` becomes 👍 when its closing colon is typed.\n */\nexport type ChatComposerEmoji = {\n /** Opens the emoji choice next to `anchor`, usually `EmojiPicker.Popover`; `insert` puts the chosen text at the caret. */\n onOpen: (context: { anchor: HTMLElement; insert: (text: string) => void }) => void;\n /** The skin tone of completed emoji that have one, as in the picker. */\n skinTone?: EmojiSkinTone;\n /** Called with each emoji the completion inserted, for example to remember it with `rememberEmoji`. */\n onPick?: (emoji: string) => void;\n};\n"],"mappings":"","ignoreList":[]}