@k2b/ui 0.27.0 → 0.28.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 (191) hide show
  1. package/README.md +1 -1
  2. package/dist/base.css +147 -2
  3. package/dist/browser/actions/ContextMenu.js +30 -4
  4. package/dist/browser/actions/ContextMenu.js.map +1 -1
  5. package/dist/browser/actions/Dropdown.js +184 -158
  6. package/dist/browser/actions/Dropdown.js.map +1 -1
  7. package/dist/browser/actions/GestureMenu.js +71 -138
  8. package/dist/browser/actions/GestureMenu.js.map +1 -1
  9. package/dist/browser/actions/Toolbar.js +379 -48
  10. package/dist/browser/actions/Toolbar.js.map +1 -1
  11. package/dist/browser/actions/index.js.map +1 -1
  12. package/dist/browser/actions/menu-rows.js +15 -0
  13. package/dist/browser/actions/menu-rows.js.map +1 -0
  14. package/dist/browser/actions/menu-sheet.js +154 -0
  15. package/dist/browser/actions/menu-sheet.js.map +1 -0
  16. package/dist/browser/actions/toolbar-messages.js +20 -0
  17. package/dist/browser/actions/toolbar-messages.js.map +1 -0
  18. package/dist/browser/chart-inspection.js +3 -0
  19. package/dist/browser/chart-inspection.js.map +1 -0
  20. package/dist/browser/chat/ChatComposer.js +581 -397
  21. package/dist/browser/chat/ChatComposer.js.map +1 -1
  22. package/dist/browser/chat/chat-messages.js +19 -1
  23. package/dist/browser/chat/chat-messages.js.map +1 -1
  24. package/dist/browser/chat/command-search.js +3 -0
  25. package/dist/browser/chat/command-search.js.map +1 -1
  26. package/dist/browser/chat/index.js +2 -0
  27. package/dist/browser/chat/index.js.map +1 -1
  28. package/dist/browser/chat/reaction-people.js +15 -0
  29. package/dist/browser/chat/reaction-people.js.map +1 -0
  30. package/dist/browser/content/Chart.js +6 -15
  31. package/dist/browser/content/Chart.js.map +1 -1
  32. package/dist/browser/content/ChartSnapshotView.js +7 -10
  33. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  34. package/dist/browser/content/MessageRow.js +330 -448
  35. package/dist/browser/content/MessageRow.js.map +1 -1
  36. package/dist/browser/content/ReactionBar.js +419 -0
  37. package/dist/browser/content/ReactionBar.js.map +1 -0
  38. package/dist/browser/content/chart-inspection-core.js +557 -0
  39. package/dist/browser/content/chart-inspection-core.js.map +1 -0
  40. package/dist/browser/content/chart-inspection.js +10 -445
  41. package/dist/browser/content/chart-inspection.js.map +1 -1
  42. package/dist/browser/content/chart-line-gaps.js +1 -1
  43. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  44. package/dist/browser/content/chart-snapshot.js +1 -1
  45. package/dist/browser/content/chart-snapshot.js.map +1 -1
  46. package/dist/browser/content/index.js +1 -0
  47. package/dist/browser/content/index.js.map +1 -1
  48. package/dist/browser/feedback/dialog-core.js +135 -23
  49. package/dist/browser/feedback/dialog-core.js.map +1 -1
  50. package/dist/browser/index.js +1 -0
  51. package/dist/browser/index.js.map +1 -1
  52. package/dist/browser/input-mode.js +40 -0
  53. package/dist/browser/input-mode.js.map +1 -0
  54. package/dist/browser/inputs/FileDropTarget.js +24 -9
  55. package/dist/browser/inputs/FileDropTarget.js.map +1 -1
  56. package/dist/browser/inputs/FileInputs.js +2 -2
  57. package/dist/browser/inputs/FileInputs.js.map +1 -1
  58. package/dist/browser/inputs/SelectChip.js +9 -0
  59. package/dist/browser/inputs/SelectChip.js.map +1 -1
  60. package/dist/browser/inputs/emoji/EmojiPicker.js +13 -0
  61. package/dist/browser/inputs/emoji/EmojiPicker.js.map +1 -1
  62. package/dist/browser/inputs/file-drop.js.map +1 -1
  63. package/dist/browser/layout/DetailPanel.js +283 -197
  64. package/dist/browser/layout/DetailPanel.js.map +1 -1
  65. package/dist/browser/layout/Discussion.js +233 -185
  66. package/dist/browser/layout/Discussion.js.map +1 -1
  67. package/dist/browser/layout/TableOfContents.js +10 -2
  68. package/dist/browser/layout/TableOfContents.js.map +1 -1
  69. package/dist/browser/layout/detail-panel-messages.js +35 -0
  70. package/dist/browser/layout/detail-panel-messages.js.map +1 -0
  71. package/dist/browser/surfaces/Avatar.js +50 -20
  72. package/dist/browser/surfaces/Avatar.js.map +1 -1
  73. package/dist/browser/surfaces/AvatarStack.js +406 -0
  74. package/dist/browser/surfaces/AvatarStack.js.map +1 -0
  75. package/dist/browser/surfaces/avatar-messages.js +8 -2
  76. package/dist/browser/surfaces/avatar-messages.js.map +1 -1
  77. package/dist/browser/surfaces/index.js +1 -0
  78. package/dist/browser/surfaces/index.js.map +1 -1
  79. package/dist/ssr/actions/ContextMenu.js +21 -3
  80. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  81. package/dist/ssr/actions/Dropdown.js +140 -72
  82. package/dist/ssr/actions/Dropdown.js.map +1 -1
  83. package/dist/ssr/actions/GestureMenu.js +52 -106
  84. package/dist/ssr/actions/GestureMenu.js.map +1 -1
  85. package/dist/ssr/actions/Toolbar.js +294 -14
  86. package/dist/ssr/actions/Toolbar.js.map +1 -1
  87. package/dist/ssr/actions/index.js.map +1 -1
  88. package/dist/ssr/actions/menu-rows.js +15 -0
  89. package/dist/ssr/actions/menu-rows.js.map +1 -0
  90. package/dist/ssr/actions/menu-sheet.js +138 -0
  91. package/dist/ssr/actions/menu-sheet.js.map +1 -0
  92. package/dist/ssr/actions/toolbar-messages.js +20 -0
  93. package/dist/ssr/actions/toolbar-messages.js.map +1 -0
  94. package/dist/ssr/chart-inspection.js +3 -0
  95. package/dist/ssr/chart-inspection.js.map +1 -0
  96. package/dist/ssr/chat/ChatComposer.js +263 -89
  97. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  98. package/dist/ssr/chat/chat-messages.js +19 -1
  99. package/dist/ssr/chat/chat-messages.js.map +1 -1
  100. package/dist/ssr/chat/command-search.js +3 -0
  101. package/dist/ssr/chat/command-search.js.map +1 -1
  102. package/dist/ssr/chat/index.js +2 -0
  103. package/dist/ssr/chat/index.js.map +1 -1
  104. package/dist/ssr/chat/reaction-people.js +15 -0
  105. package/dist/ssr/chat/reaction-people.js.map +1 -0
  106. package/dist/ssr/content/Chart.js +6 -15
  107. package/dist/ssr/content/Chart.js.map +1 -1
  108. package/dist/ssr/content/ChartSnapshotView.js +7 -10
  109. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  110. package/dist/ssr/content/MessageRow.js +98 -152
  111. package/dist/ssr/content/MessageRow.js.map +1 -1
  112. package/dist/ssr/content/ReactionBar.js +304 -0
  113. package/dist/ssr/content/ReactionBar.js.map +1 -0
  114. package/dist/ssr/content/chart-inspection-core.js +557 -0
  115. package/dist/ssr/content/chart-inspection-core.js.map +1 -0
  116. package/dist/ssr/content/chart-inspection.js +10 -445
  117. package/dist/ssr/content/chart-inspection.js.map +1 -1
  118. package/dist/ssr/content/chart-line-gaps.js +1 -1
  119. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  120. package/dist/ssr/content/chart-snapshot.js +1 -1
  121. package/dist/ssr/content/chart-snapshot.js.map +1 -1
  122. package/dist/ssr/content/index.js +1 -0
  123. package/dist/ssr/content/index.js.map +1 -1
  124. package/dist/ssr/feedback/dialog-core.js +135 -23
  125. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  126. package/dist/ssr/index.js +1 -0
  127. package/dist/ssr/index.js.map +1 -1
  128. package/dist/ssr/input-mode.js +40 -0
  129. package/dist/ssr/input-mode.js.map +1 -0
  130. package/dist/ssr/inputs/FileDropTarget.js +17 -5
  131. package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
  132. package/dist/ssr/inputs/FileInputs.js +2 -2
  133. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  134. package/dist/ssr/inputs/SelectChip.js +9 -0
  135. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  136. package/dist/ssr/inputs/emoji/EmojiPicker.js +12 -0
  137. package/dist/ssr/inputs/emoji/EmojiPicker.js.map +1 -1
  138. package/dist/ssr/inputs/file-drop.js.map +1 -1
  139. package/dist/ssr/layout/DetailPanel.js +112 -58
  140. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  141. package/dist/ssr/layout/Discussion.js +63 -36
  142. package/dist/ssr/layout/Discussion.js.map +1 -1
  143. package/dist/ssr/layout/TableOfContents.js +10 -2
  144. package/dist/ssr/layout/TableOfContents.js.map +1 -1
  145. package/dist/ssr/layout/detail-panel-messages.js +35 -0
  146. package/dist/ssr/layout/detail-panel-messages.js.map +1 -0
  147. package/dist/ssr/surfaces/Avatar.js +20 -2
  148. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  149. package/dist/ssr/surfaces/AvatarStack.js +286 -0
  150. package/dist/ssr/surfaces/AvatarStack.js.map +1 -0
  151. package/dist/ssr/surfaces/avatar-messages.js +8 -2
  152. package/dist/ssr/surfaces/avatar-messages.js.map +1 -1
  153. package/dist/ssr/surfaces/index.js +1 -0
  154. package/dist/ssr/surfaces/index.js.map +1 -1
  155. package/dist/styles.css +1 -1
  156. package/dist/types/actions/ContextMenu.d.ts +8 -0
  157. package/dist/types/actions/Dropdown.d.ts +12 -5
  158. package/dist/types/actions/GestureMenu.d.ts +6 -4
  159. package/dist/types/actions/Toolbar.d.ts +20 -0
  160. package/dist/types/actions/index.d.ts +1 -1
  161. package/dist/types/actions/menu-rows.d.ts +5 -0
  162. package/dist/types/actions/menu-sheet.d.ts +22 -0
  163. package/dist/types/actions/toolbar-messages.d.ts +8 -0
  164. package/dist/types/chart-inspection.d.ts +2 -0
  165. package/dist/types/chat/ChatComposer.d.ts +7 -0
  166. package/dist/types/chat/chat-messages.d.ts +10 -2
  167. package/dist/types/chat/command-search.d.ts +2 -0
  168. package/dist/types/chat/index.d.ts +2 -0
  169. package/dist/types/chat/reaction-people.d.ts +9 -0
  170. package/dist/types/content/Chart.d.ts +2 -2
  171. package/dist/types/content/MessageRow.d.ts +3 -10
  172. package/dist/types/content/ReactionBar.d.ts +32 -0
  173. package/dist/types/content/chart-inspection-core.d.ts +61 -0
  174. package/dist/types/content/chart-inspection.d.ts +4 -20
  175. package/dist/types/content/chart-snapshot.d.ts +1 -1
  176. package/dist/types/content/index.d.ts +2 -1
  177. package/dist/types/feedback/dialog-core.d.ts +16 -1
  178. package/dist/types/index.d.ts +1 -0
  179. package/dist/types/input-mode.d.ts +7 -0
  180. package/dist/types/inputs/FileDropTarget.d.ts +6 -3
  181. package/dist/types/inputs/SelectChip.d.ts +2 -0
  182. package/dist/types/inputs/file-drop.d.ts +2 -0
  183. package/dist/types/layout/DetailPanel.d.ts +11 -0
  184. package/dist/types/layout/Discussion.d.ts +8 -0
  185. package/dist/types/layout/TableOfContents.d.ts +2 -0
  186. package/dist/types/layout/detail-panel-messages.d.ts +15 -0
  187. package/dist/types/surfaces/Avatar.d.ts +12 -0
  188. package/dist/types/surfaces/AvatarStack.d.ts +41 -0
  189. package/dist/types/surfaces/avatar-messages.d.ts +3 -0
  190. package/dist/types/surfaces/index.d.ts +3 -1
  191. package/package.json +6 -1
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["chat/ChatComposer.tsx"],"sourcesContent":["import {\n batch,\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, toggleInlineMarker } from \"../inputs/markdown/actions\";\nimport { openCodeFence } from \"../inputs/markdown/code-zone\";\nimport { type MarkdownToolbarMessages, useMarkdownToolbarMessages } from \"../inputs/markdown/toolbar-messages\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useSelectMessages } from \"../inputs/select-messages\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { ChatContextUsage as ContextUsage } from \"./ChatPrimitives\";\nimport {\n chatCommandKey,\n conversationEnterAction,\n executeChatAction,\n nextChatCommandIndex,\n reportChatFailure,\n runChatSubmission,\n} from \"./chat-behavior\";\nimport { useChatMessages } from \"./chat-messages\";\nimport { chatCommandListModel, parseChatCommandQuery } from \"./command-search\";\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;\nconst commandDoneMs = 3_000;\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\n/** An action can cancel and restore its token, or report a short completion message. */\nexport type ChatCommandResult = void | \"cancelled\" | { done: string };\n\n/** A fixed place in the slash list. Sections keep the given order, also while searching. */\nexport type ChatCommandSection = {\n id: string;\n label: string;\n /** Rows come from `searchCommands`: loading keeps a heading spinner; empty placeholders reserve the first search or retained rows. */\n searched?: boolean;\n /** Only while searching or narrowed: absent from the overview (empty query), including its loading placeholder. */\n searchOnly?: boolean;\n};\n/** First-word narrowing; Tab writes `words[0]` followed by a space. */\nexport type ChatCommandScope = { id: string; title: string; words: readonly string[] };\n/** Passed as the third argument to `searchCommands`. */\nexport type ChatCommandSearch = { scope?: string };\n\nexport type ChatCommand = {\n /** Section id; unknown or missing ids render in a trailing part without a heading. */\n section?: string;\n /** Tab writes this scope's first word; a row without an action or mention also narrows on Enter. */\n scope?: string;\n /** Absent from the overview; appears when searched, including its unavailable reason. */\n hiddenUntilSearch?: boolean;\n /** Application name, searchable but not displayed. */\n app?: string;\n /** Stable row key for option ids, marking and de-duplication. Defaults to `name`. */\n id?: string;\n name: string;\n description: string;\n icon?: string;\n /** Extra search words, for example in German and English. */\n keywords?: readonly string[];\n /** Unavailable now; this short reason replaces the description. */\n reason?: string;\n /** Shown in the status line while the action runs. */\n busyLabel?: string;\n /** Failures restore an unchanged draft and appear once in the status line, without calling `onError`. */\n action?: (context: ChatCommandContext) => ChatCommandResult | Promise<ChatCommandResult>;\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 commandSections?: readonly ChatCommandSection[];\n commandScopes?: readonly ChatCommandScope[];\n searchCommands?: (query: string, signal: AbortSignal, search: ChatCommandSearch) => 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 /**\n * Adds \"Aa\", which opens one row above the field with Bold, Italic and Bullet list (Ctrl/⌘+B, Ctrl/⌘+I, Ctrl/⌘+Shift+8);\n * the field and its controls stay put. Other Markdown is typed by hand.\n */\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: MarkdownToolbarMessages) => 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\n/** The row stays short: what a chat message needs. Other Markdown, typed by hand, keeps working. */\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 { id: \"bullet-list\", icon: \"ti ti-list\", label: (m) => m.bulletListShortcut, run: toggleBulletList, shiftCode: \"Digit8\" },\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 markdownToolbarMessages = useMarkdownToolbarMessages();\n const chatMessages = useChatMessages();\n const selectMessages = useSelectMessages();\n const commandListId = `k2b-chat-commands-${createUniqueId().replace(/[^A-Za-z0-9_-]/g, \"-\")}`;\n const formatGroupId = `${commandListId}-format`;\n // Emoji suggestions keep their index-based selection and ids.\n const [selectedCommandIndex, setSelectedCommandIndex] = createSignal(0);\n const [activeCommandKey, setActiveCommandKey] = createSignal<string>();\n const [commandMoved, setCommandMoved] = createSignal(false);\n const commandIds = new Map<string, number>();\n let commandIdCounter = 0;\n const commandOptionId = (command: ChatCommand) => {\n const key = chatCommandKey(command);\n if (!commandIds.has(key)) commandIds.set(key, commandIdCounter++);\n return `${commandListId}-c${commandIds.get(key)}`;\n };\n const [closedAt, setClosedAt] = createSignal<number>();\n // Where the pending native edit starts; a selection replaced as a whole starts at its beginning.\n let inputStart: number | undefined;\n const [commandStatus, setCommandStatus] = createSignal<{ tone: \"busy\" | \"done\" | \"error\"; text: string }>();\n const [announcement, setAnnouncement] = createSignal<{ text: string }>();\n let statusTimer: ReturnType<typeof setTimeout> | undefined;\n let disposed = false;\n const showCommandStatus = (status?: { tone: \"busy\" | \"done\" | \"error\"; text: string }) => {\n if (disposed) return;\n clearTimeout(statusTimer);\n setCommandStatus(status);\n if (status?.tone === \"done\") {\n statusTimer = setTimeout(() => setCommandStatus(undefined), commandDoneMs);\n }\n };\n onCleanup(() => {\n disposed = true;\n clearTimeout(statusTimer);\n });\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 [searchResultsQuery, setSearchResultsQuery] = createSignal<string>();\n const [searchResultsScope, setSearchResultsScope] = createSignal<string>();\n const [suggestionAnnouncement, setSuggestionAnnouncement] = createSignal<{ text: string }>();\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 caretCommandToken = createMemo(() => chatCommandQuery(props.value, caret(), selectionEnd()));\n const caretCommandStart = createMemo(() => caretCommandToken()?.start);\n // Retained server rows belong to one `/`: they go when it does or when another `/` starts.\n createEffect(() => {\n caretCommandStart();\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n });\n // Escape closes the list for one `/` character, wherever the caret or selection goes; only that `/` going away ends it.\n createEffect(() => {\n const closed = closedAt();\n if (closed !== undefined && props.value[closed] !== \"/\") setClosedAt(undefined);\n });\n const commandQuery = createMemo(() => {\n const token = caretCommandToken();\n return dismissed() || composing() || token?.start === closedAt() ? null : token;\n });\n const parsedCommandQuery = createMemo(() => parseChatCommandQuery(commandQuery()?.query ?? \"\", props.commandScopes ?? []));\n const currentCommandScope = createMemo(() => parsedCommandQuery().scope?.id);\n createEffect(() => {\n currentCommandScope();\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n });\n const localCommands = createMemo(() => props.commands ?? []);\n const commandModel = createMemo(() =>\n chatCommandListModel({\n query: commandQuery()?.query ?? \"\",\n scopes: props.commandScopes,\n sections: props.commandSections,\n commands: localCommands(),\n searchResults: searchResultsScope() === parsedCommandQuery().scope?.id ? searchResults() : [],\n searchResultsFresh: searchResultsQuery() === commandQuery()?.query && searchResultsScope() === parsedCommandQuery().scope?.id,\n searchSettled: searchResultsQuery() !== undefined && searchResultsScope() === parsedCommandQuery().scope?.id,\n searching: searching(),\n }),\n );\n const commandMatches = createMemo(() => (commandQuery() ? commandModel().rows.map((row) => row.command) : []));\n const currentCommandQuery = createMemo(() => caretCommandToken()?.query);\n // Arrow marking belongs to one token in one draft; another draft or `/` starts at the top row again.\n createEffect(() => {\n props.draftKey;\n caretCommandStart();\n currentCommandQuery();\n setCommandMoved(false);\n });\n const commandsOpen = () => Boolean(!emojiOpen() && commandQuery() && (localCommands().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 props.draftKey;\n const token = commandQuery();\n setSearchError(false);\n if (!token || !props.searchCommands) {\n setSearching(false);\n return;\n }\n const parsed = parsedCommandQuery();\n const abort = new AbortController();\n setSearching(true);\n const timer = setTimeout(() => {\n Promise.resolve()\n .then(() => props.searchCommands!(parsed.query, abort.signal, { scope: parsed.scope?.id }))\n .then((results) => {\n if (!abort.signal.aborted) {\n batch(() => {\n setSearchResults(results);\n setSearchResultsQuery(token.query);\n setSearchResultsScope(parsed.scope?.id);\n });\n }\n })\n .catch(() => {\n if (!abort.signal.aborted) {\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n setSearchError(true);\n }\n })\n .finally(() => {\n if (!abort.signal.aborted) setSearching(false);\n });\n }, 120);\n onCleanup(() => {\n clearTimeout(timer);\n abort.abort();\n });\n });\n let settledEmpty: { start: number; query: string } | undefined;\n createEffect(() => {\n const token = commandQuery();\n if (!token || parsedCommandQuery().scope || searchError()) {\n settledEmpty = undefined;\n return;\n }\n const previous = settledEmpty;\n if (/\\s$/.test(token.query) && previous?.start === token.start && previous.query.trimEnd() === token.query.trimEnd()) {\n setClosedAt(token.start);\n return;\n }\n const settled = !searching() && (!props.searchCommands || searchResultsQuery() === token.query);\n if (settled && commandModel().empty) {\n settledEmpty = { start: token.start, query: token.query };\n if (/\\s$/.test(token.query)) setClosedAt(token.start);\n } else if (!searching()) settledEmpty = undefined;\n });\n let lastSuggestion: { query: string; text: string } | undefined;\n createEffect(() => {\n const model = commandModel();\n const query = commandQuery()?.query;\n if (!commandsOpen()) {\n setSuggestionAnnouncement(undefined);\n lastSuggestion = undefined;\n return;\n }\n if (searching() || searchError() || (props.searchCommands && searchResultsQuery() !== query)) return;\n const text = chatMessages().commandSuggestions({ count: model.rows.length });\n const timer = setTimeout(() => {\n if (lastSuggestion && lastSuggestion.query === query && lastSuggestion.text === text) return;\n lastSuggestion = { query: query ?? \"\", text };\n setSuggestionAnnouncement({ text });\n }, 350);\n onCleanup(() => clearTimeout(timer));\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 setClosedAt(undefined);\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n // A failure belongs to the draft it happened in; success notes may follow a command into the chat it opened.\n if (commandStatus()?.tone === \"error\") showCommandStatus();\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 if (commandStatus()?.tone === \"error\") showCommandStatus();\n // An edit that starts at or before the closed `/` (select all, then type `/`) replaces it; the new `/` may open again.\n const closed = closedAt();\n if (closed !== undefined) {\n let same = 0;\n while (same <= closed && props.value[same] === value[same]) same++;\n if (Math.min(same, inputStart ?? same) <= closed) setClosedAt(undefined);\n }\n inputStart = undefined;\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 // One update, so no effect sees a half-moved selection (it would read as \"no `/` here\" and reopen a closed list).\n batch(() => {\n setCaret(textareaRef?.selectionStart ?? props.value.length);\n setSelectionEnd(textareaRef?.selectionEnd ?? props.value.length);\n });\n };\n const selectedCommand = createMemo(() => {\n const rows = commandMatches();\n return (commandMoved() && rows.find((command) => chatCommandKey(command) === activeCommandKey())) || rows[0];\n });\n const selectedCommandKey = createMemo(() => {\n const command = selectedCommand();\n return command ? chatCommandKey(command) : undefined;\n });\n createEffect(() => {\n if (!commandsOpen()) commandIds.clear();\n selectedCommandKey();\n setAnnouncement(undefined);\n });\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 ?? chatMessages().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 emojiMatches();\n setSelectedCommandIndex(0);\n });\n\n createEffect(() => {\n const command = selectedCommand();\n const id = emojiOpen() ? `${commandListId}-${selectedCommandIndex()}` : command ? commandOptionId(command) : undefined;\n queueMicrotask(() => {\n const list = commandListRef;\n const item = id ? list?.querySelector<HTMLElement>(`[id=\"${id}\"]`) : undefined;\n if (!list || !item?.isConnected) return;\n // Measured against the visible part of the list: a sticky section heading covers the top of it.\n const heading = item.closest(\".k2b-chat-composer__command-group\")?.querySelector<HTMLElement>(\".k2b-chat-composer__command-heading\");\n const listTop = list.getBoundingClientRect().top + list.clientTop;\n const box = item.getBoundingClientRect();\n const top = box.top - listTop - (heading?.offsetHeight ?? 0);\n const bottom = box.bottom - listTop - list.clientHeight;\n if (top < 0) list.scrollTop += top;\n else if (bottom > 0) list.scrollTop += bottom;\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 narrowCommand = (command: ChatCommand): boolean => {\n const scope = props.commandScopes?.find((scope) => scope.id === command.scope);\n const word = scope?.words[0];\n const token = commandQuery();\n if (!word || !token || !textareaRef) return false;\n replaceTextareaRange(textareaRef, token.start + 1, token.end, `${word} `);\n syncCaret();\n return true;\n };\n const executeCommand = async (command: ChatCommand, tab = false) => {\n const token = commandQuery();\n if (!token || blocked()) return;\n if (command.disabled || command.reason) {\n // A new object each time, so choosing the same row again inserts and announces its reason again.\n setAnnouncement(command.reason ? { text: command.reason } : undefined);\n return;\n }\n if (command.scope && (tab || (!command.action && !command.mention)) && narrowCommand(command)) 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 // A cancelled or failed command leaves no undo step behind: restoring puts the history back as well.\n const previousHistory = { entries: [...history], index: historyIndex };\n edit(nextValue, nextMentions);\n setDismissed(true);\n setExecuting(true);\n let submitRequested = false;\n let restored = false;\n const restore = () => {\n if (props.draftKey !== key || props.value !== nextValue) return;\n setDismissed(true);\n props.onValueChange(previous.value);\n props.onMentionsChange?.(previous.mentions);\n history.splice(0, history.length, ...previousHistory.entries);\n historyIndex = previousHistory.index;\n restored = true;\n };\n showCommandStatus(command.busyLabel ? { tone: \"busy\", text: command.busyLabel } : undefined);\n try {\n const result = await command.action?.({\n setValue: (value) => edit(value),\n submit: () => {\n submitRequested = true;\n },\n focus,\n });\n if (result === \"cancelled\") {\n submitRequested = false;\n restore();\n showCommandStatus();\n } else if (result) {\n showCommandStatus({ tone: \"done\", text: result.done });\n }\n } catch (error) {\n submitRequested = false;\n restore();\n // An unmounted composer has no status line left; the app's error channel keeps the failure from going silent.\n if (disposed) props.onError?.(error);\n else\n showCommandStatus({ tone: \"error\", text: error instanceof Error && error.message ? error.message : chatMessages().commandFailed });\n } finally {\n if (commandStatus()?.tone === \"busy\") showCommandStatus();\n setExecuting(false);\n }\n if (submitRequested && props.draftKey === key) await submit();\n queueMicrotask(() => {\n if (props.draftKey !== key) return;\n if (restored || props.value === nextValue) {\n const position = restored ? token.end : token.start + replacement.length;\n textareaRef?.setSelectionRange(position, position);\n }\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 const index = matches.indexOf(selectedCommand()!);\n const next = matches[nextChatCommandIndex(index, matches.length, event.key === \"ArrowUp\" ? -1 : 1)];\n setActiveCommandKey(next ? chatCommandKey(next) : undefined);\n setCommandMoved(true);\n setAnnouncement(undefined);\n return;\n }\n // Ctrl/⌘+Enter sends, also while suggestions are open.\n const plain = !event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey;\n if (plain && (event.key === \"Tab\" || event.key === \"Enter\") && matches.length > 0) {\n event.preventDefault();\n const command = selectedCommand();\n // A server row answering an earlier query may no longer match; wait for fresh results. Local rows match now.\n const row = commandModel().rows.find((row) => chatCommandKey(row.command) === selectedCommandKey());\n const staleServerRow =\n row?.server && (searchResultsQuery() !== commandQuery()?.query || searchResultsScope() !== parsedCommandQuery().scope?.id);\n if (staleServerRow) return;\n if (command) void executeCommand(command, event.key === \"Tab\");\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n setClosedAt(commandQuery()?.start);\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: chatMessages().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: chatMessages().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: chatMessages().dictationListening };\n case \"refining\":\n return { icon: \"ti ti-loader-2 k2b-spin\", text: chatMessages().dictationRefining };\n case \"refined\":\n return { icon: \"ti ti-sparkles\", text: chatMessages().dictationRefined };\n case \"unrefined\":\n return { icon: \"ti ti-microphone\", text: chatMessages().dictationUnrefined };\n case \"interrupted\":\n return { icon: \"ti ti-alert-triangle\", text: chatMessages().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={chatMessages().addToChat} items={menuItems()} disabled={blocked()}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class={`k2b-chat-composer__icon-action${extraClass}`}\n label={chatMessages().addToChat}\n tooltip={chatMessages().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 ?? chatMessages().attachFiles}\n content={selection().label ?? chatMessages().attachFiles}\n disabled={!canSelectFiles()}\n onClick={chooseFiles}\n >\n <i class={addingFiles() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-plus\"} 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={chatMessages().composerFormatting}\n aria-pressed={formattingOpen()}\n aria-controls={formattingOpen() ? formatGroupId : undefined}\n content={chatMessages().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={chatMessages().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(markdownToolbarMessages())}\n content={tool.label(markdownToolbarMessages())}\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={chatMessages().insertEmoji}\n content={chatMessages().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 ? chatMessages().dictate : chatMessages().recordVoiceMessage}\n content={\n dictation() === \"listening\"\n ? chatMessages().stopDictation\n : microphone().onDictate\n ? microphone().onVoiceMessage\n ? chatMessages().dictateOrHold\n : chatMessages().dictate\n : chatMessages().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={chatMessages().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={chatMessages().microphoneOptions}\n tooltip={chatMessages().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 ? chatMessages().queueing\n : chatMessages().steering\n : chatMessages().sending\n : running()\n ? runningSubmitIntent() === \"queue\"\n ? chatMessages().queueMessage\n : chatMessages().steerResponse\n : chatMessages().sendMessage\n }\n content={\n running()\n ? runningSubmitIntent() === \"queue\"\n ? chatMessages().queueMessage\n : chatMessages().steerResponse\n : chatMessages().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() ? chatMessages().stopping : chatMessages().stopResponse}\n content={chatMessages().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={chatMessages().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() ? chatMessages().addGuidance : conversation() ? chatMessages().writeConversationMessage : chatMessages().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() ? `${commandListId}-${selectedCommandIndex()}` : selectedCommand() ? commandOptionId(selectedCommand()!) : undefined\n }\n onInput={(event) => {\n batch(() => {\n edit(event.currentTarget.value);\n syncCaret();\n });\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 inputStart = event.currentTarget.selectionStart;\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 const commandRowMap = createMemo(() => new Map(commandModel().rows.map((row) => [row.command, row])));\n const commandGroupKey = (group: ReturnType<typeof commandModel>[\"groups\"][number]) =>\n group.scopeTitle ? \"scope\" : group.section ? `section:${group.section.id}` : \"flat\";\n const renderCommandRow = (command: ChatCommand) => {\n const highlight = () => commandRowMap().get(command)?.highlight;\n const title = () => command.label ?? command.name;\n return (\n <button\n class=\"k2b-chat-composer__command\"\n id={commandOptionId(command)}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={selectedCommand() === command}\n aria-disabled={Boolean(command.disabled || command.reason)}\n aria-describedby={command.reason ? `${commandOptionId(command)}-reason` : undefined}\n data-reason={command.reason ? \"true\" : undefined}\n data-active={selectedCommand() === command ? \"true\" : undefined}\n onPointerDown={(event) => event.preventDefault()}\n onClick={(event) => {\n event.preventDefault();\n void executeCommand(command);\n }}\n >\n <i class={command.icon ?? \"ti ti-slash\"} aria-hidden=\"true\" />\n <span class=\"k2b-chat-composer__command-text\">\n <strong>\n <Show when={highlight()} fallback={title()}>\n {(range) => (\n <>\n {title().slice(0, range()[0])}\n <b>{title().slice(range()[0], range()[1])}</b>\n {title().slice(range()[1])}\n </>\n )}\n </Show>\n </strong>\n <Show when={command.reason ?? command.description}>\n <small id={command.reason ? `${commandOptionId(command)}-reason` : undefined}>{command.reason ?? command.description}</small>\n </Show>\n </span>\n </button>\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={chatMessages().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={chatMessages().commands}\n aria-busy={searching() ? \"true\" : undefined}\n >\n <For each={commandModel().groups.map(commandGroupKey)}>\n {(key) => {\n const group = createMemo(() => commandModel().groups.find((group) => commandGroupKey(group) === key));\n const headingId = () =>\n `${commandListId}-g-${key === \"scope\" ? \"scope\" : props.commandSections?.findIndex((section) => section.id === group()?.section?.id)}`;\n const rows = () => group()?.rows.map((row) => row.command) ?? [];\n return (\n <Show when={key !== \"flat\"} fallback={<For each={rows()}>{renderCommandRow}</For>}>\n <div class=\"k2b-chat-composer__command-group\" role=\"group\" aria-labelledby={headingId()}>\n <div class=\"k2b-chat-composer__command-heading\" id={headingId()} role=\"presentation\">\n <span>{group()?.scopeTitle ?? group()?.section?.label}</span>\n <Show when={group()?.loading}>\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n </Show>\n </div>\n <For each={rows()}>{renderCommandRow}</For>\n <Show when={group()?.placeholder}>\n <div class=\"k2b-chat-composer__command-placeholder\" aria-hidden=\"true\">\n <span />\n <span>\n <span />\n <span />\n </span>\n </div>\n </Show>\n </div>\n </Show>\n );\n }}\n </For>\n <Show\n when={\n searching() &&\n commandMatches().length === 0 &&\n !commandModel().groups.some((group) => group.section || group.scopeTitle)\n }\n >\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\">\n {!parsedCommandQuery().query.trim()\n ? messages().noResults\n : chatMessages().commandsNothingFound({ query: parsedCommandQuery().query.trim() })}\n </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 ?? chatMessages().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 {chatMessages().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={chatMessages().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={chatMessages().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={selectMessages().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={chatMessages().chooseModel}\n position=\"top-right\"\n class=\"k2b-chat-composer__model\"\n menuWidth=\"15rem\"\n placeholder={chatMessages().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={chatMessages().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 class=\"k2b-sr-only\" role=\"status\" aria-live=\"polite\">\n <Show when={suggestionAnnouncement()} keyed>\n {(announced) => <span>{announced.text}</span>}\n </Show>\n </div>\n <div class=\"k2b-chat-composer__status\" role=\"status\">\n <Show when={!suggestionsOpen() && commandStatus()}>\n {(status) => (\n <div class=\"k2b-chat-composer__status-line\" data-tone={status().tone}>\n <i\n aria-hidden=\"true\"\n class={\n status().tone === \"busy\" ? \"ti ti-loader-2 k2b-spin\" : status().tone === \"done\" ? \"ti ti-check\" : \"ti ti-alert-circle\"\n }\n />\n <span>{status().text}</span>\n </div>\n )}\n </Show>\n <Show when={suggestionsOpen() && announcement()} keyed>\n {(announced) => <span class=\"k2b-sr-only\">{announced.text}</span>}\n </Show>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["chat/ChatComposer.tsx"],"sourcesContent":["import {\n batch,\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 { dialogHistorySettled, holdDialogHistory } from \"../feedback/dialog-core\";\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, toggleInlineMarker } from \"../inputs/markdown/actions\";\nimport { openCodeFence } from \"../inputs/markdown/code-zone\";\nimport { type MarkdownToolbarMessages, useMarkdownToolbarMessages } from \"../inputs/markdown/toolbar-messages\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useSelectMessages } from \"../inputs/select-messages\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { ChatContextUsage as ContextUsage } from \"./ChatPrimitives\";\nimport {\n chatCommandKey,\n conversationEnterAction,\n executeChatAction,\n nextChatCommandIndex,\n reportChatFailure,\n runChatSubmission,\n} from \"./chat-behavior\";\nimport { useChatMessages } from \"./chat-messages\";\nimport { chatCommandListModel, parseChatCommandQuery } from \"./command-search\";\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;\nconst commandDoneMs = 3_000;\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 openModelSelection: () => Promise<string | null>;\n};\n\n/** An action can cancel and restore its token, or report a short completion message. */\nexport type ChatCommandResult = void | \"cancelled\" | { done: string };\n\n/** A fixed place in the slash list. Sections keep the given order, also while searching. */\nexport type ChatCommandSection = {\n id: string;\n label: string;\n /** Rows come from `searchCommands`: loading keeps a heading spinner; empty placeholders reserve the first search or retained rows. */\n searched?: boolean;\n /** Only while searching or narrowed: absent from the overview (empty query), including its loading placeholder. */\n searchOnly?: boolean;\n};\n/** First-word narrowing; Tab writes `words[0]` followed by a space. */\nexport type ChatCommandScope = { id: string; title: string; words: readonly string[] };\n/** Passed as the third argument to `searchCommands`. */\nexport type ChatCommandSearch = {\n scope?: string;\n /** One list opening, unchanged across queries and narrowing; retries start another opening. */\n opening: number;\n};\n\nexport type ChatCommand = {\n /** Section id; unknown or missing ids render in a trailing part without a heading. */\n section?: string;\n /** Tab writes this scope's first word; a row without an action or mention also narrows on Enter. */\n scope?: string;\n /** Absent from the overview; appears when searched, including its unavailable reason. */\n hiddenUntilSearch?: boolean;\n /** A chosen value, independent of the row marked by keyboard navigation. */\n selected?: boolean;\n /** Retry discovery in a new opening, retaining the token and currently displayed rows. */\n searchAgain?: boolean;\n /** Application name, searchable but not displayed. */\n app?: string;\n /** Stable row key for option ids, marking and de-duplication. Defaults to `name`. */\n id?: string;\n name: string;\n description: string;\n icon?: string;\n /** Extra search words, for example in German and English. */\n keywords?: readonly string[];\n /** Unavailable now; this short reason replaces the description. */\n reason?: string;\n /** Shown in the status line while the action runs. */\n busyLabel?: string;\n /** Failures restore an unchanged draft and appear once in the status line, without calling `onError`. */\n action?: (context: ChatCommandContext) => ChatCommandResult | Promise<ChatCommandResult>;\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 commandSections?: readonly ChatCommandSection[];\n commandScopes?: readonly ChatCommandScope[];\n searchCommands?: (query: string, signal: AbortSignal, search: ChatCommandSearch) => 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 /**\n * Adds \"Aa\", which opens one row above the field with Bold, Italic and Bullet list (Ctrl/⌘+B, Ctrl/⌘+I, Ctrl/⌘+Shift+8);\n * the field and its controls stay put. Other Markdown is typed by hand.\n */\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: MarkdownToolbarMessages) => 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\n/** The row stays short: what a chat message needs. Other Markdown, typed by hand, keeps working. */\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 { id: \"bullet-list\", icon: \"ti ti-list\", label: (m) => m.bulletListShortcut, run: toggleBulletList, shiftCode: \"Digit8\" },\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/**\n * Keeps one tap from reaching the page: its pointer, touch and mouse events stop at the window, and neither focus nor a\n * click happens. A finger's tap ends with `touchend`, a scroll with `pointercancel`, a mouse's press with `click`.\n */\nconst swallowTap = (down: PointerEvent) => {\n const blocked = [\"pointerup\", \"pointercancel\", \"touchstart\", \"touchend\", \"mousedown\", \"mouseup\", \"click\", \"contextmenu\"] as const;\n const stop = () => {\n window.removeEventListener(\"pointerdown\", next, true);\n for (const type of blocked) window.removeEventListener(type, block, true);\n };\n const block = (event: Event) => {\n event.stopPropagation();\n if (event.type !== \"pointercancel\" && event.type !== \"touchstart\" && event.type !== \"pointerup\") event.preventDefault();\n if (event.type === \"click\" || event.type === \"touchend\" || event.type === \"pointercancel\") stop();\n };\n // The next press is a new gesture, whatever became of this one.\n const next = (event: Event) => {\n if (event !== down) stop();\n };\n down.stopPropagation();\n down.preventDefault();\n window.addEventListener(\"pointerdown\", next, true);\n for (const type of blocked) window.addEventListener(type, block, { capture: true, passive: false });\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\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 footer = children(() => props.footerContent);\n const messages = useUiMessages();\n const markdownToolbarMessages = useMarkdownToolbarMessages();\n const chatMessages = useChatMessages();\n const selectMessages = useSelectMessages();\n const commandListId = `k2b-chat-commands-${createUniqueId().replace(/[^A-Za-z0-9_-]/g, \"-\")}`;\n const formatGroupId = `${commandListId}-format`;\n // Emoji suggestions keep their index-based selection and ids.\n const [selectedCommandIndex, setSelectedCommandIndex] = createSignal(0);\n const [activeCommandKey, setActiveCommandKey] = createSignal<string>();\n const [commandMoved, setCommandMoved] = createSignal(false);\n const commandIds = new Map<string, number>();\n let commandIdCounter = 0;\n const commandOptionId = (command: ChatCommand) => {\n const key = chatCommandKey(command);\n if (!commandIds.has(key)) commandIds.set(key, commandIdCounter++);\n return `${commandListId}-c${commandIds.get(key)}`;\n };\n const [closedAt, setClosedAt] = createSignal<number>();\n // Where the pending native edit starts; a selection replaced as a whole starts at its beginning.\n let inputStart: number | undefined;\n let inputEnd: number | undefined;\n const [commandStatus, setCommandStatus] = createSignal<{ tone: \"busy\" | \"done\" | \"error\"; text: string }>();\n const [announcement, setAnnouncement] = createSignal<{ text: string }>();\n let statusTimer: ReturnType<typeof setTimeout> | undefined;\n let disposed = false;\n const showCommandStatus = (status?: { tone: \"busy\" | \"done\" | \"error\"; text: string }) => {\n if (disposed) return;\n clearTimeout(statusTimer);\n setCommandStatus(status);\n if (status?.tone === \"done\") {\n statusTimer = setTimeout(() => setCommandStatus(undefined), commandDoneMs);\n }\n };\n onCleanup(() => {\n disposed = true;\n clearTimeout(statusTimer);\n });\n const [addingFiles, setAddingFiles] = createSignal(false);\n const [submitting, setSubmitting] = createSignal(false);\n let shellRef: HTMLDivElement | undefined;\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 [searchResultsQuery, setSearchResultsQuery] = createSignal<string>();\n const [searchResultsScope, setSearchResultsScope] = createSignal<string>();\n const [suggestionAnnouncement, setSuggestionAnnouncement] = createSignal<{ text: string }>();\n const [searching, setSearching] = createSignal(false);\n const [searchError, setSearchError] = createSignal(false);\n const [executing, setExecuting] = createSignal(false);\n const [modelOpen, setModelOpen] = createSignal<boolean>();\n const [choosingModel, setChoosingModel] = createSignal(false);\n let resolveModel: ((id: string | null) => void) | undefined;\n const finishModelSelection = (id: string | null) => {\n const resolve = resolveModel;\n resolveModel = undefined;\n if (choosingModel()) {\n setModelOpen(false);\n // Let the controlled close reach Dropdown before returning normal clicks to its own state.\n queueMicrotask(() => {\n if (!choosingModel()) setModelOpen(undefined);\n });\n }\n setChoosingModel(false);\n resolve?.(id);\n };\n const blockedBesidesCommand = () => Boolean(props.disabled || stopping() || state() === \"submitting\" || addingFiles() || submitting());\n const usableModelControl = () =>\n !conversation() && !footer() && !blockedBesidesCommand() && !running() && Boolean(props.models?.length && props.onModelChange);\n const openModelSelection = (): Promise<string | null> => {\n if (!usableModelControl()) return Promise.resolve(null);\n finishModelSelection(null);\n return new Promise((resolve) => {\n resolveModel = resolve;\n setChoosingModel(true);\n setModelOpen(true);\n queueMicrotask(() => {\n if (!choosingModel() || !modelOpen()) return;\n // Start on the current model, as a click on the chip would show it checked.\n const menu = composerRef?.querySelector(\".k2b-chat-composer__model\");\n (\n menu?.querySelector<HTMLButtonElement>('[role=\"menuitemradio\"][aria-checked=\"true\"]:not(:disabled)') ??\n menu?.querySelector<HTMLButtonElement>('[role=\"menuitemradio\"]:not(:disabled)')\n )?.focus();\n });\n });\n };\n createEffect(() => {\n if (!usableModelControl()) finishModelSelection(null);\n });\n onCleanup(() => finishModelSelection(null));\n const [commandOpening, setCommandOpening] = createSignal(0);\n let retrySearch = 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 caretCommandToken = createMemo(() => chatCommandQuery(props.value, caret(), selectionEnd()));\n const caretCommandStart = createMemo(() => caretCommandToken()?.start);\n // Retained server rows belong to one `/`: they go when it does or when another `/` starts.\n createEffect(() => {\n caretCommandStart();\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n });\n // Escape closes the list for one `/` character, wherever the caret or selection goes; only that `/` going away ends it.\n createEffect(() => {\n const closed = closedAt();\n if (closed !== undefined && props.value[closed] !== \"/\") setClosedAt(undefined);\n });\n const commandQuery = createMemo(() => {\n const token = caretCommandToken();\n return dismissed() || composing() || token?.start === closedAt() ? null : token;\n });\n const openingStart = createMemo(() => commandQuery()?.start);\n createEffect(() => {\n props.draftKey;\n const start = openingStart();\n if (start !== undefined) setCommandOpening((opening) => opening + 1);\n });\n const parsedCommandQuery = createMemo(() => parseChatCommandQuery(commandQuery()?.query ?? \"\", props.commandScopes ?? []));\n const currentCommandScope = createMemo(() => parsedCommandQuery().scope?.id);\n createEffect(() => {\n currentCommandScope();\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n });\n const localCommands = createMemo(() => props.commands ?? []);\n const commandModel = createMemo(() =>\n chatCommandListModel({\n query: commandQuery()?.query ?? \"\",\n scopes: props.commandScopes,\n sections: props.commandSections,\n commands: localCommands(),\n searchResults: searchResultsScope() === parsedCommandQuery().scope?.id ? searchResults() : [],\n searchResultsFresh: searchResultsQuery() === commandQuery()?.query && searchResultsScope() === parsedCommandQuery().scope?.id,\n searchSettled: searchResultsQuery() !== undefined && searchResultsScope() === parsedCommandQuery().scope?.id,\n searching: searching(),\n }),\n );\n const commandMatches = createMemo(() => (commandQuery() ? commandModel().rows.map((row) => row.command) : []));\n const currentCommandQuery = createMemo(() => caretCommandToken()?.query);\n // Arrow marking belongs to one token in one draft; another draft or `/` starts at the top row again.\n createEffect(() => {\n props.draftKey;\n caretCommandStart();\n currentCommandQuery();\n setCommandMoved(false);\n });\n const commandsOpen = () => Boolean(!emojiOpen() && commandQuery() && (localCommands().length || props.searchCommands));\n const commandSheetHeld = createMemo(() => commandsOpen() && isTouchOnly());\n createEffect(() => {\n if (!commandSheetHeld()) return;\n onCleanup(holdDialogHistory(() => setClosedAt(commandQuery()?.start)));\n });\n const suggestionsOpen = () => commandsOpen() || emojiOpen();\n createEffect(() => {\n if (!suggestionsOpen()) return;\n let disposed = false;\n const measure = () => {\n if (disposed || !commandListRef) return;\n const accessory = commandListRef.parentElement!;\n const viewportTop = window.visualViewport?.offsetTop ?? 0;\n let top = viewportTop;\n // The column a phone sheet spans: the nearest ancestor that clips sideways, or the page.\n let column: { left: number; right: number } | undefined;\n for (let parent = accessory.parentElement; parent; parent = parent.parentElement) {\n const style = window.getComputedStyle(parent);\n if (/(auto|scroll|hidden|clip)/.test(style.overflowY)) {\n top = Math.max(top, parent.getBoundingClientRect().top);\n }\n if (!column && /(auto|scroll|hidden|clip)/.test(style.overflowX)) {\n const left = parent.getBoundingClientRect().left + parent.clientLeft;\n column = { left, right: left + parent.clientWidth };\n }\n }\n const page = document.documentElement.clientWidth;\n const left = Math.max(0, column?.left ?? 0);\n const right = Math.min(page, column?.right ?? page);\n const slot = accessory.parentElement!.getBoundingClientRect();\n const bottom = accessory.getBoundingClientRect().bottom;\n commandListRef.style.setProperty(\"--k2b-chat-command-space\", `${Math.max(40, bottom - top - 8)}px`);\n // Only a list that reaches the screen's top edge keeps clear of a notch or the status bar.\n commandListRef.style.setProperty(\"--k2b-chat-command-safe-top\", top === viewportTop ? \"env(safe-area-inset-top, 0px)\" : \"0px\");\n accessory.style.setProperty(\"--k2b-chat-command-reach-left\", `${Math.max(0, slot.left - left)}px`);\n accessory.style.setProperty(\"--k2b-chat-command-reach-right\", `${Math.max(0, right - slot.right)}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 // A press outside the command list and the field closes the list, as Escape does; the text stays. With a mouse or a\n // trackpad the press then acts as usual. On a touch-only device a tap outside the composer closes only the list: it\n // reaches nothing beneath, and the field keeps focus, so the keyboard stays open.\n createEffect(() => {\n if (!commandsOpen()) return;\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node) || commandListRef?.contains(target) || textareaRef?.parentElement?.contains(target)) return;\n setClosedAt(commandQuery()?.start);\n if (isTouchOnly() && !shellRef?.contains(target)) swallowTap(event);\n };\n window.addEventListener(\"pointerdown\", onPointerDown, true);\n onCleanup(() => window.removeEventListener(\"pointerdown\", onPointerDown, true));\n });\n createEffect(() => {\n props.draftKey;\n const token = commandQuery();\n setSearchError(false);\n if (!token || !props.searchCommands) {\n setSearching(false);\n return;\n }\n running();\n const parsed = parsedCommandQuery();\n const opening = commandOpening();\n const abort = new AbortController();\n setSearching(true);\n const delay = retrySearch ? 0 : 120;\n retrySearch = false;\n const timer = setTimeout(() => {\n Promise.resolve()\n .then(() => props.searchCommands!(parsed.query, abort.signal, { scope: parsed.scope?.id, opening }))\n .then((results) => {\n if (!abort.signal.aborted) {\n batch(() => {\n setSearchResults(results);\n setSearchResultsQuery(token.query);\n setSearchResultsScope(parsed.scope?.id);\n });\n }\n })\n .catch(() => {\n if (!abort.signal.aborted) {\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n setSearchError(true);\n }\n })\n .finally(() => {\n if (!abort.signal.aborted) setSearching(false);\n });\n }, delay);\n onCleanup(() => {\n clearTimeout(timer);\n abort.abort();\n });\n });\n let settledEmpty: { start: number; query: string } | undefined;\n createEffect(() => {\n const token = commandQuery();\n if (!token || parsedCommandQuery().scope || searchError()) {\n settledEmpty = undefined;\n return;\n }\n const previous = settledEmpty;\n if (/\\s$/.test(token.query) && previous?.start === token.start && previous.query.trimEnd() === token.query.trimEnd()) {\n setClosedAt(token.start);\n return;\n }\n const settled = !searching() && (!props.searchCommands || searchResultsQuery() === token.query);\n if (settled && commandModel().empty) {\n settledEmpty = { start: token.start, query: token.query };\n if (/\\s$/.test(token.query)) setClosedAt(token.start);\n } else if (!searching()) settledEmpty = undefined;\n });\n let lastSuggestion: { query: string; text: string } | undefined;\n createEffect(() => {\n const model = commandModel();\n const query = commandQuery()?.query;\n if (!commandsOpen()) {\n setSuggestionAnnouncement(undefined);\n lastSuggestion = undefined;\n return;\n }\n if (searching() || searchError() || (props.searchCommands && searchResultsQuery() !== query)) return;\n const text = chatMessages().commandSuggestions({ count: model.rows.length });\n const timer = setTimeout(() => {\n if (lastSuggestion && lastSuggestion.query === query && lastSuggestion.text === text) return;\n lastSuggestion = { query: query ?? \"\", text };\n setSuggestionAnnouncement({ text });\n }, 350);\n onCleanup(() => clearTimeout(timer));\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 finishModelSelection(null);\n setDismissed(true);\n setClosedAt(undefined);\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n // A failure belongs to the draft it happened in; success notes may follow a command into the chat it opened.\n if (commandStatus()?.tone === \"error\") showCommandStatus();\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 if (commandStatus()?.tone === \"error\") showCommandStatus();\n // Replacing `/` can leave its position and query identical, but starts a new opening.\n if (inputStart !== undefined && inputEnd !== undefined && props.value.slice(inputStart, inputEnd).includes(\"/\")) {\n setCommandOpening((opening) => opening + 1);\n setSearchResults([]);\n setSearchResultsQuery(undefined);\n setCommandMoved(false);\n }\n // An edit that starts at or before the closed `/` (select all, then type `/`) replaces it; the new `/` may open again.\n const closed = closedAt();\n if (closed !== undefined) {\n let same = 0;\n while (same <= closed && props.value[same] === value[same]) same++;\n if (Math.min(same, inputStart ?? same) <= closed) setClosedAt(undefined);\n }\n inputStart = undefined;\n inputEnd = undefined;\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 // One update, so no effect sees a half-moved selection (it would read as \"no `/` here\" and reopen a closed list).\n batch(() => {\n setCaret(textareaRef?.selectionStart ?? props.value.length);\n setSelectionEnd(textareaRef?.selectionEnd ?? props.value.length);\n });\n };\n const selectedCommand = createMemo(() => {\n const rows = commandMatches();\n return (commandMoved() && rows.find((command) => chatCommandKey(command) === activeCommandKey())) || rows[0];\n });\n const selectedCommandKey = createMemo(() => {\n const command = selectedCommand();\n return command ? chatCommandKey(command) : undefined;\n });\n createEffect(() => {\n if (!commandsOpen()) commandIds.clear();\n selectedCommandKey();\n setAnnouncement(undefined);\n });\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 /** The draft may go out now, apart from a submission that is already on its way. */\n const submittable = () => !busy() && hasDraft() && !(running() && runningSubmitIntent() === \"steer\" && mentions().length);\n const canSubmit = () => !submitting() && submittable();\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 ?? chatMessages().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 emojiMatches();\n setSelectedCommandIndex(0);\n });\n\n createEffect(() => {\n const command = selectedCommand();\n const id = emojiOpen() ? `${commandListId}-${selectedCommandIndex()}` : command ? commandOptionId(command) : undefined;\n queueMicrotask(() => {\n const list = commandListRef;\n const item = id ? list?.querySelector<HTMLElement>(`[id=\"${id}\"]`) : undefined;\n if (!list || !item?.isConnected) return;\n // Measured against the visible part of the list: a sticky section heading covers the top of it.\n const heading = item.closest(\".k2b-chat-composer__command-group\")?.querySelector<HTMLElement>(\".k2b-chat-composer__command-heading\");\n const listTop = list.getBoundingClientRect().top + list.clientTop;\n const box = item.getBoundingClientRect();\n const top = box.top - listTop - (heading?.offsetHeight ?? 0);\n const bottom = box.bottom - listTop - list.clientHeight;\n if (top < 0) list.scrollTop += top;\n else if (bottom > 0) list.scrollTop += bottom;\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 key = props.draftKey;\n setSubmitting(true);\n try {\n if (isTouchOnly()) {\n if (commandSheetHeld()) setClosedAt(commandQuery()?.start);\n // The sheet's Back entry leaves first, so a submit handler that navigates finds the history settled.\n await dialogHistorySettled();\n // A draft that another one replaced, or that may no longer go out, is not sent and keeps its text.\n if (disposed || props.draftKey !== key || !submittable()) return;\n }\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 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 narrowCommand = (command: ChatCommand): boolean => {\n const scope = props.commandScopes?.find((scope) => scope.id === command.scope);\n const word = scope?.words[0];\n const token = commandQuery();\n if (!word || !token || !textareaRef) return false;\n replaceTextareaRange(textareaRef, token.start + 1, token.end, `${word} `);\n syncCaret();\n return true;\n };\n const executeCommand = async (command: ChatCommand, tab = false) => {\n const token = commandQuery();\n const heldHistory = commandSheetHeld();\n if (!token || blocked()) return;\n if (command.disabled || command.reason) {\n // A new object each time, so choosing the same row again inserts and announces its reason again.\n setAnnouncement(command.reason ? { text: command.reason } : undefined);\n return;\n }\n if (command.searchAgain) {\n retrySearch = true;\n setCommandOpening((opening) => opening + 1);\n return;\n }\n if (command.scope && (tab || (!command.action && !command.mention)) && narrowCommand(command)) 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 // A cancelled or failed command leaves no undo step behind: restoring puts the history back as well.\n const previousHistory = { entries: [...history], index: historyIndex };\n edit(nextValue, nextMentions);\n setDismissed(true);\n setExecuting(true);\n let submitRequested = false;\n let restored = false;\n const restore = () => {\n if (props.draftKey !== key || props.value !== nextValue) return;\n setDismissed(true);\n props.onValueChange(previous.value);\n props.onMentionsChange?.(previous.mentions);\n history.splice(0, history.length, ...previousHistory.entries);\n historyIndex = previousHistory.index;\n restored = true;\n };\n showCommandStatus(command.busyLabel ? { tone: \"busy\", text: command.busyLabel } : undefined);\n try {\n // The sheet's Back entry leaves first, so an action that navigates or opens a dialog finds the history settled.\n if (heldHistory && command.action) {\n await dialogHistorySettled();\n // Another draft or no composer any more: the command does not run against it.\n if (disposed || props.draftKey !== key) return;\n }\n const result = await command.action?.({\n setValue: (value) => edit(value),\n submit: () => {\n submitRequested = true;\n },\n focus,\n openModelSelection,\n });\n if (result === \"cancelled\") {\n submitRequested = false;\n restore();\n showCommandStatus();\n } else if (result) {\n showCommandStatus({ tone: \"done\", text: result.done });\n }\n } catch (error) {\n submitRequested = false;\n restore();\n // An unmounted composer has no status line left; the app's error channel keeps the failure from going silent.\n if (disposed) props.onError?.(error);\n else\n showCommandStatus({ tone: \"error\", text: error instanceof Error && error.message ? error.message : chatMessages().commandFailed });\n } finally {\n if (commandStatus()?.tone === \"busy\") showCommandStatus();\n setExecuting(false);\n }\n if (submitRequested && props.draftKey === key) await submit();\n queueMicrotask(() => {\n if (props.draftKey !== key) return;\n if (restored || props.value === nextValue) {\n const position = restored ? token.end : token.start + replacement.length;\n textareaRef?.setSelectionRange(position, position);\n }\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 const index = matches.indexOf(selectedCommand()!);\n const next = matches[nextChatCommandIndex(index, matches.length, event.key === \"ArrowUp\" ? -1 : 1)];\n setActiveCommandKey(next ? chatCommandKey(next) : undefined);\n setCommandMoved(true);\n setAnnouncement(undefined);\n return;\n }\n // Ctrl/⌘+Enter sends, also while suggestions are open.\n const plain = !event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey;\n if (plain && (event.key === \"Tab\" || event.key === \"Enter\") && matches.length > 0) {\n event.preventDefault();\n const command = selectedCommand();\n // A server row answering an earlier query may no longer match; wait for fresh results. Local rows match now.\n const row = commandModel().rows.find((row) => chatCommandKey(row.command) === selectedCommandKey());\n const staleServerRow =\n row?.server && (searchResultsQuery() !== commandQuery()?.query || searchResultsScope() !== parsedCommandQuery().scope?.id);\n if (staleServerRow) return;\n if (command) void executeCommand(command, event.key === \"Tab\");\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n setClosedAt(commandQuery()?.start);\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: chatMessages().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: chatMessages().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: chatMessages().dictationListening };\n case \"refining\":\n return { icon: \"ti ti-loader-2 k2b-spin\", text: chatMessages().dictationRefining };\n case \"refined\":\n return { icon: \"ti ti-sparkles\", text: chatMessages().dictationRefined };\n case \"unrefined\":\n return { icon: \"ti ti-microphone\", text: chatMessages().dictationUnrefined };\n case \"interrupted\":\n return { icon: \"ti ti-alert-triangle\", text: chatMessages().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={chatMessages().addToChat} items={menuItems()} disabled={blocked()}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class={`k2b-chat-composer__icon-action${extraClass}`}\n label={chatMessages().addToChat}\n tooltip={chatMessages().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 ?? chatMessages().attachFiles}\n content={selection().label ?? chatMessages().attachFiles}\n disabled={!canSelectFiles()}\n onClick={chooseFiles}\n >\n <i class={addingFiles() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-plus\"} 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={chatMessages().composerFormatting}\n aria-pressed={formattingOpen()}\n aria-controls={formattingOpen() ? formatGroupId : undefined}\n content={chatMessages().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={chatMessages().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(markdownToolbarMessages())}\n content={tool.label(markdownToolbarMessages())}\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={chatMessages().insertEmoji}\n content={chatMessages().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 ? chatMessages().dictate : chatMessages().recordVoiceMessage}\n content={\n dictation() === \"listening\"\n ? chatMessages().stopDictation\n : microphone().onDictate\n ? microphone().onVoiceMessage\n ? chatMessages().dictateOrHold\n : chatMessages().dictate\n : chatMessages().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={chatMessages().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={chatMessages().microphoneOptions}\n tooltip={chatMessages().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 ? chatMessages().queueing\n : chatMessages().steering\n : chatMessages().sending\n : running()\n ? runningSubmitIntent() === \"queue\"\n ? chatMessages().queueMessage\n : chatMessages().steerResponse\n : chatMessages().sendMessage\n }\n content={\n running()\n ? runningSubmitIntent() === \"queue\"\n ? chatMessages().queueMessage\n : chatMessages().steerResponse\n : chatMessages().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() ? chatMessages().stopping : chatMessages().stopResponse}\n content={chatMessages().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={chatMessages().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() ? chatMessages().addGuidance : conversation() ? chatMessages().writeConversationMessage : chatMessages().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() ? `${commandListId}-${selectedCommandIndex()}` : selectedCommand() ? commandOptionId(selectedCommand()!) : undefined\n }\n onInput={(event) => {\n batch(() => {\n edit(event.currentTarget.value);\n syncCaret();\n });\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 inputStart = event.currentTarget.selectionStart;\n inputEnd = event.currentTarget.selectionEnd;\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 const commandRowMap = createMemo(() => new Map(commandModel().rows.map((row) => [row.command, row])));\n const commandGroupKey = (group: ReturnType<typeof commandModel>[\"groups\"][number]) =>\n group.scopeTitle ? \"scope\" : group.section ? `section:${group.section.id}` : \"flat\";\n const renderCommandRow = (command: ChatCommand) => {\n const highlight = () => commandRowMap().get(command)?.highlight;\n const title = () => command.label ?? command.name;\n return (\n <button\n class=\"k2b-chat-composer__command\"\n id={commandOptionId(command)}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={selectedCommand() === command}\n aria-disabled={Boolean(command.disabled || command.reason)}\n aria-describedby={command.reason ? `${commandOptionId(command)}-reason` : undefined}\n data-reason={command.reason ? \"true\" : undefined}\n data-active={selectedCommand() === command ? \"true\" : undefined}\n onMouseDown={keepFieldFocus}\n onClick={(event) => {\n event.preventDefault();\n void executeCommand(command);\n }}\n >\n <i class={command.icon ?? \"ti ti-slash\"} aria-hidden=\"true\" />\n <span class=\"k2b-chat-composer__command-text\">\n <strong>\n <Show when={highlight()} fallback={title()}>\n {(range) => (\n <>\n {title().slice(0, range()[0])}\n <b>{title().slice(range()[0], range()[1])}</b>\n {title().slice(range()[1])}\n </>\n )}\n </Show>\n </strong>\n <Show when={command.reason ?? command.description}>\n <small id={command.reason ? `${commandOptionId(command)}-reason` : undefined}>{command.reason ?? command.description}</small>\n </Show>\n </span>\n <Show when={command.selected}>\n <span class=\"k2b-chat-composer__command-end\">\n <i class=\"ti ti-check\" aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{chatMessages().commandSelected}</span>\n </span>\n </Show>\n </button>\n );\n };\n return (\n <div ref={shellRef} 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={chatMessages().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 onMouseDown={keepFieldFocus}\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\" data-commands=\"\">\n <div\n ref={commandListRef}\n id={commandListId}\n class=\"k2b-chat-composer__commands\"\n role=\"listbox\"\n aria-label={chatMessages().commands}\n aria-busy={searching() ? \"true\" : undefined}\n >\n <For each={commandModel().groups.map(commandGroupKey)}>\n {(key) => {\n const group = createMemo(() => commandModel().groups.find((group) => commandGroupKey(group) === key));\n const headingId = () =>\n `${commandListId}-g-${key === \"scope\" ? \"scope\" : props.commandSections?.findIndex((section) => section.id === group()?.section?.id)}`;\n const rows = () => group()?.rows.map((row) => row.command) ?? [];\n return (\n <Show when={key !== \"flat\"} fallback={<For each={rows()}>{renderCommandRow}</For>}>\n <div class=\"k2b-chat-composer__command-group\" role=\"group\" aria-labelledby={headingId()}>\n <div class=\"k2b-chat-composer__command-heading\" id={headingId()} role=\"presentation\">\n <span>{group()?.scopeTitle ?? group()?.section?.label}</span>\n <Show when={group()?.loading}>\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n </Show>\n </div>\n <For each={rows()}>{renderCommandRow}</For>\n <Show when={group()?.placeholder}>\n <div class=\"k2b-chat-composer__command-placeholder\" aria-hidden=\"true\">\n <span />\n <span>\n <span />\n <span />\n </span>\n </div>\n </Show>\n </div>\n </Show>\n );\n }}\n </For>\n <Show\n when={\n searching() &&\n commandMatches().length === 0 &&\n !commandModel().groups.some((group) => group.section || group.scopeTitle)\n }\n >\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\">\n {!parsedCommandQuery().query.trim()\n ? messages().noResults\n : chatMessages().commandsNothingFound({ query: parsedCommandQuery().query.trim() })}\n </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 ?? chatMessages().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 {chatMessages().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={chatMessages().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={chatMessages().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={selectMessages().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={footer()}\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={chatMessages().chooseModel}\n position=\"top-right\"\n class=\"k2b-chat-composer__model\"\n menuWidth=\"15rem\"\n placeholder={chatMessages().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 open={modelOpen()}\n onOpenChange={(open) => {\n if (!choosingModel()) return;\n setModelOpen(open);\n // Dropdown closes before committing the choice; let onValueChange settle it first.\n if (!open)\n queueMicrotask(() => {\n if (!modelOpen()) finishModelSelection(null);\n });\n }}\n disabled={(choosingModel() ? blockedBesidesCommand() : blocked()) || running() || !props.onModelChange}\n onValueChange={(modelId) => {\n props.onModelChange?.(modelId);\n finishModelSelection(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 {footer()}\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={chatMessages().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 class=\"k2b-sr-only\" role=\"status\" aria-live=\"polite\">\n <Show when={suggestionAnnouncement()} keyed>\n {(announced) => <span>{announced.text}</span>}\n </Show>\n </div>\n <div class=\"k2b-chat-composer__status\" role=\"status\">\n <Show when={!suggestionsOpen() && commandStatus()}>\n {(status) => (\n <div class=\"k2b-chat-composer__status-line\" data-tone={status().tone}>\n <i\n aria-hidden=\"true\"\n class={\n status().tone === \"busy\" ? \"ti ti-loader-2 k2b-spin\" : status().tone === \"done\" ? \"ti ti-check\" : \"ti ti-alert-circle\"\n }\n />\n <span>{status().text}</span>\n </div>\n )}\n </Show>\n <Show when={suggestionsOpen() && announcement()} keyed>\n {(announced) => <span class=\"k2b-sr-only\">{announced.text}</span>}\n </Show>\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}