@k2b/ui 0.2.0 → 0.3.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 (366) hide show
  1. package/dist/browser/actions/Button.js +11 -2
  2. package/dist/browser/actions/Button.js.map +1 -1
  3. package/dist/browser/actions/Disclosure.js +11 -8
  4. package/dist/browser/actions/Disclosure.js.map +1 -1
  5. package/dist/browser/actions/Dropdown.js +4 -1
  6. package/dist/browser/actions/Dropdown.js.map +1 -1
  7. package/dist/browser/actions/FilterChip.js +16 -2
  8. package/dist/browser/actions/FilterChip.js.map +1 -1
  9. package/dist/browser/actions/SplitButton.js +69 -22
  10. package/dist/browser/actions/SplitButton.js.map +1 -1
  11. package/dist/browser/actions/SpotlightSearch.js +3 -7
  12. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  13. package/dist/browser/actions/Tabs.js +132 -47
  14. package/dist/browser/actions/Tabs.js.map +1 -1
  15. package/dist/browser/actions/index.js +1 -1
  16. package/dist/browser/actions/index.js.map +1 -1
  17. package/dist/browser/chat/ChatComposer.js +751 -423
  18. package/dist/browser/chat/ChatComposer.js.map +1 -1
  19. package/dist/browser/chat/ChatContextPopup.js +123 -0
  20. package/dist/browser/chat/ChatContextPopup.js.map +1 -0
  21. package/dist/browser/chat/ChatPrimitives.js +141 -78
  22. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  23. package/dist/browser/chat/ChatTasks.js +112 -0
  24. package/dist/browser/chat/ChatTasks.js.map +1 -0
  25. package/dist/browser/chat/ChatTimeline.js +31 -14
  26. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  27. package/dist/browser/chat/chat-behavior.js +0 -5
  28. package/dist/browser/chat/chat-behavior.js.map +1 -1
  29. package/dist/browser/chat/composer-document.js +55 -0
  30. package/dist/browser/chat/composer-document.js.map +1 -0
  31. package/dist/browser/chat/index.js +6 -1
  32. package/dist/browser/chat/index.js.map +1 -1
  33. package/dist/browser/chat/types.js.map +1 -1
  34. package/dist/browser/content/Chart.js +148 -239
  35. package/dist/browser/content/Chart.js.map +1 -1
  36. package/dist/browser/content/ChartExplorer.js +324 -0
  37. package/dist/browser/content/ChartExplorer.js.map +1 -0
  38. package/dist/browser/content/ChartExplorerControls.js +153 -0
  39. package/dist/browser/content/ChartExplorerControls.js.map +1 -0
  40. package/dist/browser/content/ChartFilterControls.js +200 -0
  41. package/dist/browser/content/ChartFilterControls.js.map +1 -0
  42. package/dist/browser/content/ChartSnapshotView.js +113 -0
  43. package/dist/browser/content/ChartSnapshotView.js.map +1 -0
  44. package/dist/browser/content/DataTable.js +48 -32
  45. package/dist/browser/content/DataTable.js.map +1 -1
  46. package/dist/browser/content/FileBrowser.js +3 -0
  47. package/dist/browser/content/FileBrowser.js.map +1 -1
  48. package/dist/browser/content/FileGrid.js +93 -0
  49. package/dist/browser/content/FileGrid.js.map +1 -0
  50. package/dist/browser/content/FileTree.js +2 -2
  51. package/dist/browser/content/FileTree.js.map +1 -1
  52. package/dist/browser/content/FileView.js +507 -162
  53. package/dist/browser/content/FileView.js.map +1 -1
  54. package/dist/browser/content/MarkdownView.js +6 -0
  55. package/dist/browser/content/MarkdownView.js.map +1 -1
  56. package/dist/browser/content/PdfPreview.js +107 -90
  57. package/dist/browser/content/PdfPreview.js.map +1 -1
  58. package/dist/browser/content/chart-cursor.js +33 -0
  59. package/dist/browser/content/chart-cursor.js.map +1 -0
  60. package/dist/browser/content/chart-explorer.js +147 -0
  61. package/dist/browser/content/chart-explorer.js.map +1 -0
  62. package/dist/browser/content/chart-inspection.js +447 -0
  63. package/dist/browser/content/chart-inspection.js.map +1 -0
  64. package/dist/browser/content/chart-line-gaps.js +53 -0
  65. package/dist/browser/content/chart-line-gaps.js.map +1 -0
  66. package/dist/browser/content/chart-map-viewport.js +5 -1
  67. package/dist/browser/content/chart-map-viewport.js.map +1 -1
  68. package/dist/browser/content/chart-snapshot.js +63 -0
  69. package/dist/browser/content/chart-snapshot.js.map +1 -0
  70. package/dist/browser/content/chart-state-timeline.js +32 -4
  71. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  72. package/dist/browser/content/chart-svg.js +54 -0
  73. package/dist/browser/content/chart-svg.js.map +1 -0
  74. package/dist/browser/content/collection-selection.js +109 -0
  75. package/dist/browser/content/collection-selection.js.map +1 -0
  76. package/dist/browser/content/delimited-preferences.js +21 -0
  77. package/dist/browser/content/delimited-preferences.js.map +1 -0
  78. package/dist/browser/content/file-tree.js.map +1 -1
  79. package/dist/browser/content/file-view-preview.js +11 -7
  80. package/dist/browser/content/file-view-preview.js.map +1 -1
  81. package/dist/browser/content/index.js +9 -0
  82. package/dist/browser/content/index.js.map +1 -1
  83. package/dist/browser/feedback/InlineGuidance.js +17 -3
  84. package/dist/browser/feedback/InlineGuidance.js.map +1 -1
  85. package/dist/browser/feedback/dialog-core.js +81 -7
  86. package/dist/browser/feedback/dialog-core.js.map +1 -1
  87. package/dist/browser/feedback/prompts.js +6 -0
  88. package/dist/browser/feedback/prompts.js.map +1 -1
  89. package/dist/browser/feedback/toast.js +29 -6
  90. package/dist/browser/feedback/toast.js.map +1 -1
  91. package/dist/browser/inputs/SelectChip.js +3 -2
  92. package/dist/browser/inputs/SelectChip.js.map +1 -1
  93. package/dist/browser/inputs/TextInput.js +7 -1
  94. package/dist/browser/inputs/TextInput.js.map +1 -1
  95. package/dist/browser/inputs/markdown/MarkdownEditor.js +61 -37
  96. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  97. package/dist/browser/intl/Format.js +89 -16
  98. package/dist/browser/intl/Format.js.map +1 -1
  99. package/dist/browser/intl/index.js.map +1 -1
  100. package/dist/browser/intl/messages.js +130 -2
  101. package/dist/browser/intl/messages.js.map +1 -1
  102. package/dist/browser/layout/AppWorkspace.js +712 -624
  103. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  104. package/dist/browser/layout/BottomSheet.js +95 -0
  105. package/dist/browser/layout/BottomSheet.js.map +1 -0
  106. package/dist/browser/layout/DetailPanel.js +56 -44
  107. package/dist/browser/layout/DetailPanel.js.map +1 -1
  108. package/dist/browser/layout/Navigation.js +278 -0
  109. package/dist/browser/layout/Navigation.js.map +1 -0
  110. package/dist/browser/layout/PanelDialog.js +219 -71
  111. package/dist/browser/layout/PanelDialog.js.map +1 -1
  112. package/dist/browser/layout/ScrollArea.js +21 -1
  113. package/dist/browser/layout/ScrollArea.js.map +1 -1
  114. package/dist/browser/layout/Settings.js.map +1 -1
  115. package/dist/browser/layout/SidebarItemPreview.js +183 -0
  116. package/dist/browser/layout/SidebarItemPreview.js.map +1 -0
  117. package/dist/browser/layout/app-workspace-controller.js +3 -0
  118. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  119. package/dist/browser/layout/index.js +3 -0
  120. package/dist/browser/layout/index.js.map +1 -1
  121. package/dist/browser/layout/navigation-model.js +23 -0
  122. package/dist/browser/layout/navigation-model.js.map +1 -0
  123. package/dist/browser/layout/scroll-fade.js +100 -0
  124. package/dist/browser/layout/scroll-fade.js.map +1 -0
  125. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  126. package/dist/browser/surfaces/StatusBadge.js +2 -1
  127. package/dist/browser/surfaces/StatusBadge.js.map +1 -1
  128. package/dist/fonts/ibm-plex-mono-cyrillic-400-italic-4aded3f2f2a7d27d.woff2 +0 -0
  129. package/dist/fonts/ibm-plex-mono-cyrillic-400-normal-7635422bd10ddbbc.woff2 +0 -0
  130. package/dist/fonts/ibm-plex-mono-cyrillic-500-normal-1d89462e86cb8e87.woff2 +0 -0
  131. package/dist/fonts/ibm-plex-mono-cyrillic-600-normal-2b05a8695c7f9f4a.woff2 +0 -0
  132. package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-italic-a0b3b8cbe5a516e7.woff2 +0 -0
  133. package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-normal-f8c22ec1804bd696.woff2 +0 -0
  134. package/dist/fonts/ibm-plex-mono-cyrillic-ext-500-normal-3febe5c7f22e4b07.woff2 +0 -0
  135. package/dist/fonts/ibm-plex-mono-cyrillic-ext-600-normal-83109cdd4f8665b4.woff2 +0 -0
  136. package/dist/fonts/ibm-plex-mono-latin-400-italic-0840095faae86403.woff2 +0 -0
  137. package/dist/fonts/ibm-plex-mono-latin-400-normal-08949f728dc52d52.woff2 +0 -0
  138. package/dist/fonts/ibm-plex-mono-latin-500-normal-01d285447409c8a5.woff2 +0 -0
  139. package/dist/fonts/ibm-plex-mono-latin-600-normal-0d1f0b8d0722224e.woff2 +0 -0
  140. package/dist/fonts/ibm-plex-mono-latin-ext-400-italic-1b07eee6df7d26b3.woff2 +0 -0
  141. package/dist/fonts/ibm-plex-mono-latin-ext-400-normal-6bc0f226a5b7884a.woff2 +0 -0
  142. package/dist/fonts/ibm-plex-mono-latin-ext-500-normal-6bb06407c97584b0.woff2 +0 -0
  143. package/dist/fonts/ibm-plex-mono-latin-ext-600-normal-32057cf50dd14bdb.woff2 +0 -0
  144. package/dist/fonts/ibm-plex-mono-vietnamese-400-italic-a6bab38af4f9c761.woff2 +0 -0
  145. package/dist/fonts/ibm-plex-mono-vietnamese-400-normal-62632b6375305e70.woff2 +0 -0
  146. package/dist/fonts/ibm-plex-mono-vietnamese-500-normal-781633d95de88040.woff2 +0 -0
  147. package/dist/fonts/ibm-plex-mono-vietnamese-600-normal-51b74d53e106ba8a.woff2 +0 -0
  148. package/dist/fonts/ibm-plex-sans-cyrillic-400-italic-e8731a7e2b00fc4f.woff2 +0 -0
  149. package/dist/fonts/ibm-plex-sans-cyrillic-400-normal-69afad88a0740b6e.woff2 +0 -0
  150. package/dist/fonts/ibm-plex-sans-cyrillic-500-normal-200be3a2a6b1789f.woff2 +0 -0
  151. package/dist/fonts/ibm-plex-sans-cyrillic-600-normal-730becc6f005c18c.woff2 +0 -0
  152. package/dist/fonts/ibm-plex-sans-cyrillic-700-normal-40540598b4c9eb2c.woff2 +0 -0
  153. package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-italic-4ffb25726a7ce4cc.woff2 +0 -0
  154. package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-normal-e2580ad78906551e.woff2 +0 -0
  155. package/dist/fonts/ibm-plex-sans-cyrillic-ext-500-normal-08578d906af6d986.woff2 +0 -0
  156. package/dist/fonts/ibm-plex-sans-cyrillic-ext-600-normal-d60d3d0b182753d5.woff2 +0 -0
  157. package/dist/fonts/ibm-plex-sans-cyrillic-ext-700-normal-d07dd53642480097.woff2 +0 -0
  158. package/dist/fonts/ibm-plex-sans-greek-400-italic-1bc10b01688ba9fa.woff2 +0 -0
  159. package/dist/fonts/ibm-plex-sans-greek-400-normal-02296067bc904d2a.woff2 +0 -0
  160. package/dist/fonts/ibm-plex-sans-greek-500-normal-8cb6e20b4dbbaa5f.woff2 +0 -0
  161. package/dist/fonts/ibm-plex-sans-greek-600-normal-0a9ebd9019415ee9.woff2 +0 -0
  162. package/dist/fonts/ibm-plex-sans-greek-700-normal-c949641d10a3bebc.woff2 +0 -0
  163. package/dist/fonts/ibm-plex-sans-latin-400-italic-6de912e531b6c980.woff2 +0 -0
  164. package/dist/fonts/ibm-plex-sans-latin-400-normal-3b646991d30055a9.woff2 +0 -0
  165. package/dist/fonts/ibm-plex-sans-latin-500-normal-0717336fb31fcdcd.woff2 +0 -0
  166. package/dist/fonts/ibm-plex-sans-latin-600-normal-8960851d691c054e.woff2 +0 -0
  167. package/dist/fonts/ibm-plex-sans-latin-700-normal-42e7b0c143c19df9.woff2 +0 -0
  168. package/dist/fonts/ibm-plex-sans-latin-ext-400-italic-c5c00e8a32022dfe.woff2 +0 -0
  169. package/dist/fonts/ibm-plex-sans-latin-ext-400-normal-c93d2a12aaa280f6.woff2 +0 -0
  170. package/dist/fonts/ibm-plex-sans-latin-ext-500-normal-2846035d85100f84.woff2 +0 -0
  171. package/dist/fonts/ibm-plex-sans-latin-ext-600-normal-b25dfd4f979e442a.woff2 +0 -0
  172. package/dist/fonts/ibm-plex-sans-latin-ext-700-normal-92f0392bd74fa395.woff2 +0 -0
  173. package/dist/fonts/ibm-plex-sans-vietnamese-400-italic-675d4bace127bffb.woff2 +0 -0
  174. package/dist/fonts/ibm-plex-sans-vietnamese-400-normal-771538f7f26551bd.woff2 +0 -0
  175. package/dist/fonts/ibm-plex-sans-vietnamese-500-normal-85ba3d9c2488a813.woff2 +0 -0
  176. package/dist/fonts/ibm-plex-sans-vietnamese-600-normal-5d34b803637befe3.woff2 +0 -0
  177. package/dist/fonts/ibm-plex-sans-vietnamese-700-normal-b79d0c4b68b85007.woff2 +0 -0
  178. package/dist/plex.css +1 -1
  179. package/dist/ssr/actions/Button.js +11 -2
  180. package/dist/ssr/actions/Button.js.map +1 -1
  181. package/dist/ssr/actions/Disclosure.js +2 -2
  182. package/dist/ssr/actions/Disclosure.js.map +1 -1
  183. package/dist/ssr/actions/Dropdown.js +4 -1
  184. package/dist/ssr/actions/Dropdown.js.map +1 -1
  185. package/dist/ssr/actions/FilterChip.js +16 -2
  186. package/dist/ssr/actions/FilterChip.js.map +1 -1
  187. package/dist/ssr/actions/SplitButton.js +69 -22
  188. package/dist/ssr/actions/SplitButton.js.map +1 -1
  189. package/dist/ssr/actions/SpotlightSearch.js +3 -7
  190. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  191. package/dist/ssr/actions/Tabs.js +58 -11
  192. package/dist/ssr/actions/Tabs.js.map +1 -1
  193. package/dist/ssr/actions/index.js +1 -1
  194. package/dist/ssr/actions/index.js.map +1 -1
  195. package/dist/ssr/chat/ChatComposer.js +366 -134
  196. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  197. package/dist/ssr/chat/ChatContextPopup.js +86 -0
  198. package/dist/ssr/chat/ChatContextPopup.js.map +1 -0
  199. package/dist/ssr/chat/ChatPrimitives.js +49 -11
  200. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  201. package/dist/ssr/chat/ChatTasks.js +48 -0
  202. package/dist/ssr/chat/ChatTasks.js.map +1 -0
  203. package/dist/ssr/chat/ChatTimeline.js +14 -4
  204. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  205. package/dist/ssr/chat/chat-behavior.js +0 -5
  206. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  207. package/dist/ssr/chat/composer-document.js +55 -0
  208. package/dist/ssr/chat/composer-document.js.map +1 -0
  209. package/dist/ssr/chat/index.js +6 -1
  210. package/dist/ssr/chat/index.js.map +1 -1
  211. package/dist/ssr/chat/types.js.map +1 -1
  212. package/dist/ssr/content/Chart.js +121 -219
  213. package/dist/ssr/content/Chart.js.map +1 -1
  214. package/dist/ssr/content/ChartExplorer.js +257 -0
  215. package/dist/ssr/content/ChartExplorer.js.map +1 -0
  216. package/dist/ssr/content/ChartExplorerControls.js +105 -0
  217. package/dist/ssr/content/ChartExplorerControls.js.map +1 -0
  218. package/dist/ssr/content/ChartFilterControls.js +139 -0
  219. package/dist/ssr/content/ChartFilterControls.js.map +1 -0
  220. package/dist/ssr/content/ChartSnapshotView.js +57 -0
  221. package/dist/ssr/content/ChartSnapshotView.js.map +1 -0
  222. package/dist/ssr/content/DataTable.js +13 -9
  223. package/dist/ssr/content/DataTable.js.map +1 -1
  224. package/dist/ssr/content/FileBrowser.js +3 -0
  225. package/dist/ssr/content/FileBrowser.js.map +1 -1
  226. package/dist/ssr/content/FileGrid.js +38 -0
  227. package/dist/ssr/content/FileGrid.js.map +1 -0
  228. package/dist/ssr/content/FileTree.js +2 -2
  229. package/dist/ssr/content/FileTree.js.map +1 -1
  230. package/dist/ssr/content/FileView.js +352 -75
  231. package/dist/ssr/content/FileView.js.map +1 -1
  232. package/dist/ssr/content/MarkdownView.js +6 -0
  233. package/dist/ssr/content/MarkdownView.js.map +1 -1
  234. package/dist/ssr/content/PdfPreview.js +37 -24
  235. package/dist/ssr/content/PdfPreview.js.map +1 -1
  236. package/dist/ssr/content/chart-cursor.js +33 -0
  237. package/dist/ssr/content/chart-cursor.js.map +1 -0
  238. package/dist/ssr/content/chart-explorer.js +147 -0
  239. package/dist/ssr/content/chart-explorer.js.map +1 -0
  240. package/dist/ssr/content/chart-inspection.js +447 -0
  241. package/dist/ssr/content/chart-inspection.js.map +1 -0
  242. package/dist/ssr/content/chart-line-gaps.js +53 -0
  243. package/dist/ssr/content/chart-line-gaps.js.map +1 -0
  244. package/dist/ssr/content/chart-map-viewport.js +5 -1
  245. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  246. package/dist/ssr/content/chart-snapshot.js +63 -0
  247. package/dist/ssr/content/chart-snapshot.js.map +1 -0
  248. package/dist/ssr/content/chart-state-timeline.js +32 -4
  249. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  250. package/dist/ssr/content/chart-svg.js +54 -0
  251. package/dist/ssr/content/chart-svg.js.map +1 -0
  252. package/dist/ssr/content/collection-selection.js +109 -0
  253. package/dist/ssr/content/collection-selection.js.map +1 -0
  254. package/dist/ssr/content/delimited-preferences.js +21 -0
  255. package/dist/ssr/content/delimited-preferences.js.map +1 -0
  256. package/dist/ssr/content/file-tree.js.map +1 -1
  257. package/dist/ssr/content/file-view-preview.js +11 -7
  258. package/dist/ssr/content/file-view-preview.js.map +1 -1
  259. package/dist/ssr/content/index.js +9 -0
  260. package/dist/ssr/content/index.js.map +1 -1
  261. package/dist/ssr/feedback/InlineGuidance.js +17 -3
  262. package/dist/ssr/feedback/InlineGuidance.js.map +1 -1
  263. package/dist/ssr/feedback/dialog-core.js +81 -7
  264. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  265. package/dist/ssr/feedback/prompts.js +6 -0
  266. package/dist/ssr/feedback/prompts.js.map +1 -1
  267. package/dist/ssr/feedback/toast.js +29 -6
  268. package/dist/ssr/feedback/toast.js.map +1 -1
  269. package/dist/ssr/inputs/SelectChip.js +3 -3
  270. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  271. package/dist/ssr/inputs/TextInput.js.map +1 -1
  272. package/dist/ssr/inputs/markdown/MarkdownEditor.js +19 -11
  273. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  274. package/dist/ssr/intl/Format.js +61 -0
  275. package/dist/ssr/intl/Format.js.map +1 -1
  276. package/dist/ssr/intl/index.js.map +1 -1
  277. package/dist/ssr/intl/messages.js +130 -2
  278. package/dist/ssr/intl/messages.js.map +1 -1
  279. package/dist/ssr/layout/AppWorkspace.js +368 -275
  280. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  281. package/dist/ssr/layout/BottomSheet.js +43 -0
  282. package/dist/ssr/layout/BottomSheet.js.map +1 -0
  283. package/dist/ssr/layout/DetailPanel.js +11 -4
  284. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  285. package/dist/ssr/layout/Navigation.js +181 -0
  286. package/dist/ssr/layout/Navigation.js.map +1 -0
  287. package/dist/ssr/layout/PanelDialog.js +111 -26
  288. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  289. package/dist/ssr/layout/ScrollArea.js +16 -1
  290. package/dist/ssr/layout/ScrollArea.js.map +1 -1
  291. package/dist/ssr/layout/Settings.js.map +1 -1
  292. package/dist/ssr/layout/SidebarItemPreview.js +133 -0
  293. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -0
  294. package/dist/ssr/layout/app-workspace-controller.js +3 -0
  295. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  296. package/dist/ssr/layout/index.js +3 -0
  297. package/dist/ssr/layout/index.js.map +1 -1
  298. package/dist/ssr/layout/navigation-model.js +23 -0
  299. package/dist/ssr/layout/navigation-model.js.map +1 -0
  300. package/dist/ssr/layout/scroll-fade.js +100 -0
  301. package/dist/ssr/layout/scroll-fade.js.map +1 -0
  302. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  303. package/dist/ssr/surfaces/StatusBadge.js +2 -1
  304. package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
  305. package/dist/styles.css +1 -1
  306. package/dist/tabler.css +1 -1
  307. package/dist/types/actions/Button.d.ts +4 -0
  308. package/dist/types/actions/Disclosure.d.ts +1 -0
  309. package/dist/types/actions/FilterChip.d.ts +4 -0
  310. package/dist/types/actions/SplitButton.d.ts +6 -0
  311. package/dist/types/actions/SpotlightSearch.d.ts +0 -4
  312. package/dist/types/actions/Tabs.d.ts +4 -0
  313. package/dist/types/actions/index.d.ts +1 -1
  314. package/dist/types/chat/ChatComposer.d.ts +20 -2
  315. package/dist/types/chat/ChatContextPopup.d.ts +6 -0
  316. package/dist/types/chat/ChatPrimitives.d.ts +4 -0
  317. package/dist/types/chat/ChatTasks.d.ts +15 -0
  318. package/dist/types/chat/ChatTimeline.d.ts +2 -0
  319. package/dist/types/chat/chat-behavior.d.ts +0 -3
  320. package/dist/types/chat/composer-document.d.ts +14 -0
  321. package/dist/types/chat/index.d.ts +8 -1
  322. package/dist/types/chat/types.d.ts +7 -0
  323. package/dist/types/content/Chart.d.ts +42 -23
  324. package/dist/types/content/ChartExplorer.d.ts +34 -0
  325. package/dist/types/content/ChartExplorerControls.d.ts +10 -0
  326. package/dist/types/content/ChartFilterControls.d.ts +21 -0
  327. package/dist/types/content/ChartSnapshotView.d.ts +11 -0
  328. package/dist/types/content/DataTable.d.ts +4 -0
  329. package/dist/types/content/FileBrowser.d.ts +1 -0
  330. package/dist/types/content/FileGrid.d.ts +21 -0
  331. package/dist/types/content/FileView.d.ts +20 -0
  332. package/dist/types/content/PdfPreview.d.ts +8 -1
  333. package/dist/types/content/chart-cursor.d.ts +15 -0
  334. package/dist/types/content/chart-explorer.d.ts +48 -0
  335. package/dist/types/content/chart-inspection.d.ts +40 -0
  336. package/dist/types/content/chart-line-gaps.d.ts +5 -0
  337. package/dist/types/content/chart-map-viewport.d.ts +1 -1
  338. package/dist/types/content/chart-snapshot.d.ts +26 -0
  339. package/dist/types/content/chart-svg.d.ts +21 -0
  340. package/dist/types/content/collection-selection.d.ts +24 -0
  341. package/dist/types/content/delimited-preferences.d.ts +11 -0
  342. package/dist/types/content/file-tree.d.ts +2 -0
  343. package/dist/types/content/file-view-preview.d.ts +4 -1
  344. package/dist/types/content/index.d.ts +15 -1
  345. package/dist/types/feedback/InlineGuidance.d.ts +1 -0
  346. package/dist/types/feedback/dialog-core.d.ts +11 -0
  347. package/dist/types/feedback/prompts.d.ts +2 -0
  348. package/dist/types/feedback/toast.d.ts +7 -1
  349. package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -1
  350. package/dist/types/intl/Format.d.ts +9 -0
  351. package/dist/types/intl/index.d.ts +1 -1
  352. package/dist/types/intl/messages.d.ts +31 -1
  353. package/dist/types/layout/AppWorkspace.d.ts +35 -18
  354. package/dist/types/layout/BottomSheet.d.ts +23 -0
  355. package/dist/types/layout/DetailPanel.d.ts +1 -0
  356. package/dist/types/layout/Navigation.d.ts +8 -0
  357. package/dist/types/layout/PanelDialog.d.ts +14 -1
  358. package/dist/types/layout/ScrollArea.d.ts +4 -0
  359. package/dist/types/layout/Settings.d.ts +1 -1
  360. package/dist/types/layout/SidebarItemPreview.d.ts +11 -0
  361. package/dist/types/layout/index.d.ts +4 -1
  362. package/dist/types/layout/navigation-model.d.ts +48 -0
  363. package/dist/types/layout/scroll-fade.d.ts +3 -0
  364. package/dist/types/surfaces/DescriptionList.d.ts +1 -1
  365. package/dist/types/surfaces/StatusBadge.d.ts +1 -1
  366. package/package.json +5 -5
@@ -3,43 +3,57 @@ import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
3
  import { mergeProps as _$mergeProps } from "solid-js/web";
4
4
  import { className as _$className } from "solid-js/web";
5
5
  import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
6
- import { memo as _$memo } from "solid-js/web";
7
- import { getNextMarker as _$getNextMarker } from "solid-js/web";
8
6
  import { setProperty as _$setProperty } from "solid-js/web";
7
+ import { setStyleProperty as _$setStyleProperty } from "solid-js/web";
8
+ import { getNextMarker as _$getNextMarker } from "solid-js/web";
9
9
  import { createComponent as _$createComponent } from "solid-js/web";
10
10
  import { use as _$use } from "solid-js/web";
11
+ import { memo as _$memo } from "solid-js/web";
11
12
  import { setAttribute as _$setAttribute } from "solid-js/web";
12
13
  import { effect as _$effect } from "solid-js/web";
13
14
  import { getNextElement as _$getNextElement } from "solid-js/web";
14
15
  import { insert as _$insert } from "solid-js/web";
15
16
  var _tmpl$ = /*#__PURE__*/_$template(`<span><strong>`),
16
- _tmpl$2 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__commands role=listbox>`),
17
- _tmpl$3 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__attachments role=list tabindex=0>`),
18
- _tmpl$4 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__drop aria-hidden=true>`),
19
- _tmpl$5 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__error role=alert><i class="ti ti-alert-circle"aria-hidden=true></i><!$><!/>`),
20
- _tmpl$6 = /*#__PURE__*/_$template(`<i class="ti ti-plus"aria-hidden=true>`),
21
- _tmpl$7 = /*#__PURE__*/_$template(`<input class=k2b-sr-only type=file tabindex=-1 aria-hidden=true>`),
22
- _tmpl$8 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-composer__stop><i aria-hidden=true>`),
23
- _tmpl$9 = /*#__PURE__*/_$template(`<section role=group><!$><!/><!$><!/><div class=k2b-chat-composer__input role=group><!$><!/><textarea rows=1></textarea></div><!$><!/><footer class=k2b-chat-composer__footer><div class=k2b-chat-composer__tools><!$><!/><!$><!/><!$><!/><!$><!/></div><div class=k2b-chat-composer__submit><!$><!/><!$><!/><!$><!/>`),
24
- _tmpl$0 = /*#__PURE__*/_$template(`<button type=button role=option tabindex=-1><i aria-hidden=true></i><span><strong>/<!$><!/></strong><small>`),
25
- _tmpl$1 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-composer__attachment-remove><i class="ti ti-x"aria-hidden=true>`),
26
- _tmpl$10 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__attachment role=listitem><div class=k2b-chat-composer__attachment-content><!$><!/><!$><!/></div><!$><!/>`),
27
- _tmpl$11 = /*#__PURE__*/_$template(`<img>`),
28
- _tmpl$12 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__attachment-identity><!$><!/><!$><!/>`),
29
- _tmpl$13 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
30
- _tmpl$14 = /*#__PURE__*/_$template(`<a class=k2b-chat-composer__attachment-link target=_blank rel="noopener noreferrer"><!$><!/><!$><!/>`),
31
- _tmpl$15 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-composer__attachment-action><!$><!/><!$><!/>`),
32
- _tmpl$16 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-composer__icon-action><i aria-hidden=true>`),
33
- _tmpl$17 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-composer__send><i aria-hidden=true>`);
34
- import { createEffect, createMemo, createSignal, createUniqueId, For, onMount, Show } from "solid-js";
17
+ _tmpl$2 = /*#__PURE__*/_$template(`<div role=status class=k2b-chat-composer__loading><i class="ti ti-loader-2 k2b-spin"aria-hidden=true></i><strong>`),
18
+ _tmpl$3 = /*#__PURE__*/_$template(`<div role=status><i class="ti ti-alert-circle"></i> <!$><!/>`),
19
+ _tmpl$4 = /*#__PURE__*/_$template(`<div role=status>`),
20
+ _tmpl$5 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer-accessory><div class=k2b-chat-composer__commands role=listbox><!$><!/><!$><!/><!$><!/><!$><!/>`),
21
+ _tmpl$6 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer-slot><div></div><!$><!/>`),
22
+ _tmpl$7 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__attachments role=list tabindex=0>`),
23
+ _tmpl$8 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__drop aria-hidden=true>`),
24
+ _tmpl$9 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__highlight aria-hidden=true><!$><!/>\n`),
25
+ _tmpl$0 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__error role=alert><i class="ti ti-alert-circle"aria-hidden=true></i><!$><!/>`),
26
+ _tmpl$1 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer-shell><!$><!/><section role=group><!$><!/><div class=k2b-chat-composer__input role=group><!$><!/><!$><!/><textarea rows=1></textarea></div><!$><!/><footer class=k2b-chat-composer__footer>`),
27
+ _tmpl$10 = /*#__PURE__*/_$template(`<button type=button role=option tabindex=-1><i aria-hidden=true></i><strong></strong><small>`),
28
+ _tmpl$11 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-composer__attachment-remove><i class="ti ti-x"aria-hidden=true>`),
29
+ _tmpl$12 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__attachment role=listitem><div class=k2b-chat-composer__attachment-content><!$><!/><!$><!/></div><!$><!/>`),
30
+ _tmpl$13 = /*#__PURE__*/_$template(`<img>`),
31
+ _tmpl$14 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__attachment-identity><!$><!/><!$><!/>`),
32
+ _tmpl$15 = /*#__PURE__*/_$template(`<i aria-hidden=true>`),
33
+ _tmpl$16 = /*#__PURE__*/_$template(`<a class=k2b-chat-composer__attachment-link target=_blank rel="noopener noreferrer"><!$><!/><!$><!/>`),
34
+ _tmpl$17 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-composer__attachment-action><!$><!/><!$><!/>`),
35
+ _tmpl$18 = /*#__PURE__*/_$template(`<span>`),
36
+ _tmpl$19 = /*#__PURE__*/_$template(`<i class="ti ti-plus"aria-hidden=true>`),
37
+ _tmpl$20 = /*#__PURE__*/_$template(`<input class=k2b-sr-only type=file tabindex=-1 aria-hidden=true>`),
38
+ _tmpl$21 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__tools><!$><!/><!$><!/><!$><!/><!$><!/><!$><!/>`),
39
+ _tmpl$22 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-composer__stop><i aria-hidden=true>`),
40
+ _tmpl$23 = /*#__PURE__*/_$template(`<div class=k2b-chat-composer__submit><!$><!/><!$><!/><!$><!/><!$><!/>`),
41
+ _tmpl$24 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-composer__icon-action><i aria-hidden=true>`),
42
+ _tmpl$25 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-composer__send><i aria-hidden=true>`);
43
+ import { children, createEffect, createMemo, createSignal, createUniqueId, For, onMount, onCleanup, untrack, Show } from "solid-js";
35
44
  import { Dropdown } from "../actions/Dropdown";
36
45
  import { SelectChip } from "../inputs/SelectChip";
37
46
  import { useUiMessages } from "../intl/messages";
38
47
  import { ChatContextUsage as ContextUsage } from "./ChatPrimitives";
39
- import { executeChatAction, filterChatCommands, nextChatCommandIndex, reportChatFailure, runChatSubmission } from "./chat-behavior";
48
+ import { executeChatAction, nextChatCommandIndex, reportChatFailure, runChatSubmission } from "./chat-behavior";
49
+ import { chatCommandQuery, chatMentionSegments, reconcileChatMentions } from "./composer-document";
40
50
  const composerMaxInputHeight = 309;
51
+ // Keep editor undo text within approximately 2 MiB, plus the current edit.
52
+ const composerUndoBudgetChars = 1_000_000;
41
53
  const attachmentIcon = attachment => attachment.icon ?? (attachment.kind === "image" ? "ti ti-photo" : attachment.kind === "resource" ? "ti ti-link" : "ti ti-file");
42
54
  export function ChatComposer(props) {
55
+ const accessory = children(() => props.accessory);
56
+ const hasAccessory = () => accessory.toArray().some(item => item != null && typeof item !== "boolean" && item !== "");
43
57
  const messages = useUiMessages();
44
58
  const commandListId = `k2b-chat-commands-${createUniqueId().replace(/[^A-Za-z0-9_-]/g, "-")}`;
45
59
  const [selectedCommandIndex, setSelectedCommandIndex] = createSignal(0);
@@ -55,16 +69,129 @@ export function ChatComposer(props) {
55
69
  const stopping = () => state() === "stopping";
56
70
  const runningSubmitIntent = () => props.runningSubmitIntent ?? "steer";
57
71
  const attachments = () => props.attachments ?? [];
58
- const commands = () => props.commands ?? [];
59
- const commandMatches = createMemo(() => filterChatCommands(props.value, commands()));
60
- const commandsOpen = () => commandMatches().length > 0;
72
+ const [caret, setCaret] = createSignal(0);
73
+ const [selectionEnd, setSelectionEnd] = createSignal(0);
74
+ const [dismissed, setDismissed] = createSignal(false);
75
+ const [composing, setComposing] = createSignal(false);
76
+ const [searchResults, setSearchResults] = createSignal([]);
77
+ const [searching, setSearching] = createSignal(false);
78
+ const [searchError, setSearchError] = createSignal(false);
79
+ const [executing, setExecuting] = createSignal(false);
80
+ let highlightRef;
81
+ let commandListRef;
82
+ const mentions = () => props.mentions ?? [];
83
+ const commandQuery = createMemo(() => dismissed() || composing() ? null : chatCommandQuery(props.value, caret(), selectionEnd()));
84
+ const commandMatches = createMemo(() => {
85
+ const token = commandQuery();
86
+ if (!token) return [];
87
+ return [...(props.commands ?? []).filter(command => command.name.toLowerCase().includes(token.query.toLowerCase())), ...searchResults()];
88
+ });
89
+ const commandsOpen = () => Boolean(commandQuery() && (props.commands?.length || props.searchCommands));
90
+ createEffect(() => {
91
+ if (!commandsOpen()) return;
92
+ let disposed = false;
93
+ const measure = () => {
94
+ if (disposed || !commandListRef) return;
95
+ let top = window.visualViewport?.offsetTop ?? 0;
96
+ for (let parent = commandListRef.parentElement; parent; parent = parent.parentElement) {
97
+ if (/(auto|scroll|hidden|clip)/.test(window.getComputedStyle(parent).overflowY)) {
98
+ top = Math.max(top, parent.getBoundingClientRect().top);
99
+ }
100
+ }
101
+ const bottom = commandListRef.parentElement.getBoundingClientRect().bottom;
102
+ commandListRef.style.setProperty("--k2b-chat-command-space", `${Math.max(40, bottom - top - 8)}px`);
103
+ };
104
+ queueMicrotask(measure);
105
+ window.addEventListener("resize", measure);
106
+ window.addEventListener("scroll", measure, true);
107
+ window.visualViewport?.addEventListener("resize", measure);
108
+ onCleanup(() => {
109
+ disposed = true;
110
+ window.removeEventListener("resize", measure);
111
+ window.removeEventListener("scroll", measure, true);
112
+ window.visualViewport?.removeEventListener("resize", measure);
113
+ });
114
+ });
115
+ createEffect(() => {
116
+ const token = commandQuery();
117
+ setSearchResults([]);
118
+ setSearchError(false);
119
+ if (!token || !props.searchCommands) {
120
+ setSearching(false);
121
+ return;
122
+ }
123
+ const abort = new AbortController();
124
+ setSearching(true);
125
+ const timer = setTimeout(() => {
126
+ Promise.resolve(props.searchCommands(token.query, abort.signal)).then(results => {
127
+ if (!abort.signal.aborted) setSearchResults(results);
128
+ }).catch(() => {
129
+ if (!abort.signal.aborted) setSearchError(true);
130
+ }).finally(() => {
131
+ if (!abort.signal.aborted) setSearching(false);
132
+ });
133
+ }, 120);
134
+ onCleanup(() => {
135
+ clearTimeout(timer);
136
+ abort.abort();
137
+ });
138
+ });
139
+ const history = [];
140
+ let historyIndex = -1;
141
+ createEffect(() => {
142
+ props.draftKey;
143
+ untrack(() => {
144
+ history.length = 0;
145
+ historyIndex = -1;
146
+ setDismissed(true);
147
+ });
148
+ });
149
+ const snapshot = () => ({
150
+ value: props.value,
151
+ mentions: [...mentions()],
152
+ caret: textareaRef?.selectionStart ?? 0
153
+ });
154
+ const sameMentions = (a, b) => a.length === b.length && a.every((item, index) => item.start === b[index]?.start && item.end === b[index]?.end && item.attachment === b[index]?.attachment);
155
+ const record = () => {
156
+ if (history[historyIndex]?.value !== props.value || !sameMentions(history[historyIndex]?.mentions ?? [], mentions())) {
157
+ history.splice(historyIndex + 1);
158
+ history.push(snapshot());
159
+ let size = history.reduce((total, entry) => total + entry.value.length, 0);
160
+ while (history.length > 2 && size > composerUndoBudgetChars) size -= history.shift().value.length;
161
+ historyIndex = history.length - 1;
162
+ }
163
+ };
164
+ const edit = (value, nextMentions = reconcileChatMentions(props.value, value, mentions())) => {
165
+ record();
166
+ props.onValueChange(value);
167
+ props.onMentionsChange?.(nextMentions);
168
+ record();
169
+ setDismissed(false);
170
+ };
171
+ const restoreHistory = direction => {
172
+ record();
173
+ const next = history[historyIndex + direction];
174
+ if (!next) return;
175
+ historyIndex += direction;
176
+ props.onValueChange(next.value);
177
+ props.onMentionsChange?.(next.mentions);
178
+ queueMicrotask(() => {
179
+ textareaRef?.setSelectionRange(next.caret, next.caret);
180
+ syncCaret();
181
+ });
182
+ };
183
+ const syncCaret = () => {
184
+ setCaret(textareaRef?.selectionStart ?? props.value.length);
185
+ setSelectionEnd(textareaRef?.selectionEnd ?? props.value.length);
186
+ };
61
187
  const selectedCommand = () => commandMatches()[selectedCommandIndex()];
62
- const blocked = () => Boolean(props.disabled || stopping() || state() === "submitting" || addingFiles() || submitting());
188
+ const blocked = () => Boolean(props.disabled || stopping() || state() === "submitting" || executing() || addingFiles() || submitting());
63
189
  const hasDraft = () => Boolean(props.value.trim() || !running() && attachments().length > 0);
64
- const canSubmit = () => !blocked() && hasDraft();
190
+ const canSubmit = () => !blocked() && hasDraft() && !(running() && runningSubmitIntent() === "steer" && mentions().length);
65
191
  const canSelectFiles = () => Boolean(props.fileSelection && !props.fileSelection.disabled && !running() && !blocked());
66
192
  const hasAddMenu = () => Boolean(props.fileSelection || props.menuActions?.length);
67
193
  const hasContextUsage = () => {
194
+ if (props.contextPopupAction) return true;
68
195
  const context = props.contextUsage;
69
196
  if (!context || typeof context.contextWindow !== "number" || !Number.isFinite(context.contextWindow) || context.contextWindow <= 0) {
70
197
  return false;
@@ -106,6 +233,18 @@ export function ChatComposer(props) {
106
233
  commandMatches();
107
234
  setSelectedCommandIndex(0);
108
235
  });
236
+ createEffect(() => {
237
+ const index = selectedCommandIndex();
238
+ commandMatches();
239
+ queueMicrotask(() => {
240
+ const list = commandListRef;
241
+ const item = list?.querySelector(`[id="${commandListId}-${index}"]`);
242
+ if (!list || !item?.isConnected) return;
243
+ if (item.offsetTop < list.scrollTop) list.scrollTop = item.offsetTop;else if (item.offsetTop + item.offsetHeight > list.scrollTop + list.clientHeight) {
244
+ list.scrollTop = item.offsetTop + item.offsetHeight - list.clientHeight;
245
+ }
246
+ });
247
+ });
109
248
  createEffect(() => {
110
249
  props.value;
111
250
  queueMicrotask(autoResize);
@@ -152,22 +291,26 @@ export function ChatComposer(props) {
152
291
  const intent = running() ? runningSubmitIntent() : "send";
153
292
  const previousValue = props.value;
154
293
  const previousAttachments = attachments();
294
+ const previousMentions = mentions();
155
295
  const input = {
156
296
  intent,
157
- text: previousValue.trim(),
158
- attachments: intent === "send" ? previousAttachments : []
297
+ text: previousValue,
298
+ mentions: previousMentions,
299
+ attachments: intent !== "steer" ? previousAttachments : []
159
300
  };
160
301
  setSubmitting(true);
161
302
  try {
162
303
  await runChatSubmission({
163
304
  clear: () => {
164
305
  props.onValueChange("");
165
- if (intent === "send") setAttachments([]);
306
+ props.onMentionsChange?.([]);
307
+ if (intent !== "steer") setAttachments([]);
166
308
  },
167
309
  perform: () => props.onSubmit(input),
168
310
  restore: () => {
169
311
  props.onValueChange(previousValue);
170
- if (intent === "send") setAttachments(previousAttachments);
312
+ props.onMentionsChange?.(previousMentions);
313
+ if (intent !== "steer") setAttachments(previousAttachments);
171
314
  },
172
315
  onError: props.onError
173
316
  });
@@ -180,30 +323,64 @@ export function ChatComposer(props) {
180
323
  }
181
324
  };
182
325
  const executeCommand = async command => {
183
- props.onValueChange("");
326
+ const token = commandQuery();
327
+ if (!token || command.disabled || blocked()) return;
328
+ const previous = snapshot();
329
+ const key = props.draftKey;
330
+ const replacement = command.mention ? command.mention.name + " " : "";
331
+ const nextValue = props.value.slice(0, token.start) + replacement + props.value.slice(token.end);
332
+ const nextMentions = reconcileChatMentions(props.value, nextValue, mentions());
333
+ if (command.mention) nextMentions.push({
334
+ start: token.start,
335
+ end: token.start + command.mention.name.length,
336
+ attachment: command.mention
337
+ });
338
+ edit(nextValue, nextMentions);
339
+ setDismissed(true);
340
+ setExecuting(true);
341
+ let submitRequested = false;
184
342
  try {
185
- await command.action({
186
- setValue: props.onValueChange,
187
- submit: () => void submit(),
343
+ await command.action?.({
344
+ setValue: value => edit(value),
345
+ submit: () => {
346
+ submitRequested = true;
347
+ },
188
348
  focus
189
349
  });
190
350
  } catch (error) {
351
+ submitRequested = false;
352
+ if (props.draftKey === key && props.value === nextValue) {
353
+ props.onValueChange(previous.value);
354
+ props.onMentionsChange?.(previous.mentions);
355
+ }
191
356
  props.onError?.(error);
357
+ } finally {
358
+ setExecuting(false);
192
359
  }
360
+ if (submitRequested && props.draftKey === key) await submit();
193
361
  queueMicrotask(() => {
362
+ if (props.draftKey !== key) return;
363
+ textareaRef?.setSelectionRange(token.start + replacement.length, token.start + replacement.length);
364
+ syncCaret();
194
365
  autoResize();
195
366
  focus();
196
367
  });
197
368
  };
198
369
  const onKeyDown = event => {
370
+ if (event.isComposing || composing()) return;
371
+ if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === "z") {
372
+ event.preventDefault();
373
+ restoreHistory(event.shiftKey ? 1 : -1);
374
+ return;
375
+ }
199
376
  const matches = commandMatches();
200
- if (matches.length > 0) {
377
+ if (commandsOpen()) {
201
378
  if (event.key === "ArrowUp" || event.key === "ArrowDown") {
202
379
  event.preventDefault();
203
380
  setSelectedCommandIndex(index => nextChatCommandIndex(index, matches.length, event.key === "ArrowUp" ? -1 : 1));
204
381
  return;
205
382
  }
206
- if (event.key === "Enter" || event.key === "Tab") {
383
+ if ((event.key === "Enter" || event.key === "Tab") && matches.length > 0) {
207
384
  event.preventDefault();
208
385
  const command = selectedCommand();
209
386
  if (command) void executeCommand(command);
@@ -211,7 +388,7 @@ export function ChatComposer(props) {
211
388
  }
212
389
  if (event.key === "Escape") {
213
390
  event.preventDefault();
214
- props.onValueChange("");
391
+ setDismissed(true);
215
392
  return;
216
393
  }
217
394
  }
@@ -221,281 +398,383 @@ export function ChatComposer(props) {
221
398
  }
222
399
  };
223
400
  return (() => {
224
- var _el$3 = _$getNextElement(_tmpl$9),
225
- _el$34 = _el$3.firstChild,
226
- [_el$35, _co$0] = _$getNextMarker(_el$34.nextSibling),
401
+ var _el$3 = _$getNextElement(_tmpl$1),
402
+ _el$47 = _el$3.firstChild,
403
+ [_el$48, _co$11] = _$getNextMarker(_el$47.nextSibling),
404
+ _el$25 = _el$48.nextSibling,
405
+ _el$43 = _el$25.firstChild,
406
+ [_el$44, _co$1] = _$getNextMarker(_el$43.nextSibling),
407
+ _el$27 = _el$44.nextSibling,
408
+ _el$34 = _el$27.firstChild,
409
+ [_el$35, _co$8] = _$getNextMarker(_el$34.nextSibling),
227
410
  _el$36 = _el$35.nextSibling,
228
- [_el$37, _co$1] = _$getNextMarker(_el$36.nextSibling),
229
- _el$6 = _el$37.nextSibling,
230
- _el$9 = _el$6.firstChild,
231
- [_el$0, _co$] = _$getNextMarker(_el$9.nextSibling),
232
- _el$8 = _el$0.nextSibling,
233
- _el$38 = _el$6.nextSibling,
234
- [_el$39, _co$10] = _$getNextMarker(_el$38.nextSibling),
235
- _el$13 = _el$39.nextSibling,
236
- _el$14 = _el$13.firstChild,
237
- _el$17 = _el$14.firstChild,
238
- [_el$18, _co$3] = _$getNextMarker(_el$17.nextSibling),
239
- _el$19 = _el$18.nextSibling,
240
- [_el$20, _co$4] = _$getNextMarker(_el$19.nextSibling),
241
- _el$21 = _el$20.nextSibling,
242
- [_el$22, _co$5] = _$getNextMarker(_el$21.nextSibling),
243
- _el$23 = _el$22.nextSibling,
244
- [_el$24, _co$6] = _$getNextMarker(_el$23.nextSibling),
245
- _el$25 = _el$14.nextSibling,
246
- _el$28 = _el$25.firstChild,
247
- [_el$29, _co$7] = _$getNextMarker(_el$28.nextSibling),
248
- _el$30 = _el$29.nextSibling,
249
- [_el$31, _co$8] = _$getNextMarker(_el$30.nextSibling),
250
- _el$32 = _el$31.nextSibling,
251
- [_el$33, _co$9] = _$getNextMarker(_el$32.nextSibling);
252
- var _ref$ = composerRef;
253
- typeof _ref$ === "function" ? _$use(_ref$, _el$3) : composerRef = _el$3;
411
+ [_el$37, _co$9] = _$getNextMarker(_el$36.nextSibling),
412
+ _el$33 = _el$37.nextSibling,
413
+ _el$45 = _el$27.nextSibling,
414
+ [_el$46, _co$10] = _$getNextMarker(_el$45.nextSibling),
415
+ _el$42 = _el$46.nextSibling;
254
416
  _$insert(_el$3, _$createComponent(Show, {
255
417
  get when() {
256
- return commandsOpen();
418
+ return commandsOpen() || hasAccessory();
257
419
  },
258
420
  get children() {
259
- var _el$4 = _$getNextElement(_tmpl$2);
260
- _$setAttribute(_el$4, "id", commandListId);
261
- _$insert(_el$4, _$createComponent(For, {
262
- get each() {
263
- return commandMatches();
421
+ var _el$4 = _$getNextElement(_tmpl$6),
422
+ _el$5 = _el$4.firstChild,
423
+ _el$23 = _el$5.nextSibling,
424
+ [_el$24, _co$6] = _$getNextMarker(_el$23.nextSibling);
425
+ _$insert(_el$5, accessory);
426
+ _$insert(_el$4, _$createComponent(Show, {
427
+ get when() {
428
+ return commandsOpen();
264
429
  },
265
- children: (command, index) => (() => {
266
- var _el$40 = _$getNextElement(_tmpl$0),
267
- _el$41 = _el$40.firstChild,
268
- _el$42 = _el$41.nextSibling,
269
- _el$43 = _el$42.firstChild,
270
- _el$44 = _el$43.firstChild,
271
- _el$45 = _el$44.nextSibling,
272
- [_el$46, _co$11] = _$getNextMarker(_el$45.nextSibling),
273
- _el$47 = _el$43.nextSibling;
274
- _el$40.$$click = () => void executeCommand(command);
275
- _el$40.$$pointerdown = event => event.preventDefault();
276
- _$insert(_el$43, () => command.name, _el$46, _co$11);
277
- _$insert(_el$47, () => command.description);
278
- _$effect(_p$ => {
279
- var _v$18 = `${commandListId}-${index()}`,
280
- _v$19 = index() === selectedCommandIndex(),
281
- _v$20 = index() === selectedCommandIndex() ? "true" : undefined,
282
- _v$21 = command.icon ?? "ti ti-slash";
283
- _v$18 !== _p$.e && _$setAttribute(_el$40, "id", _p$.e = _v$18);
284
- _v$19 !== _p$.t && _$setAttribute(_el$40, "aria-selected", _p$.t = _v$19);
285
- _v$20 !== _p$.a && _$setAttribute(_el$40, "data-active", _p$.a = _v$20);
286
- _v$21 !== _p$.o && _$className(_el$41, _p$.o = _v$21);
287
- return _p$;
288
- }, {
289
- e: undefined,
290
- t: undefined,
291
- a: undefined,
292
- o: undefined
293
- });
294
- _$runHydrationEvents();
295
- return _el$40;
296
- })()
297
- }));
298
- _$effect(() => _$setAttribute(_el$4, "aria-label", messages().commands));
430
+ get children() {
431
+ var _el$6 = _$getNextElement(_tmpl$5),
432
+ _el$7 = _el$6.firstChild,
433
+ _el$15 = _el$7.firstChild,
434
+ [_el$16, _co$2] = _$getNextMarker(_el$15.nextSibling),
435
+ _el$17 = _el$16.nextSibling,
436
+ [_el$18, _co$3] = _$getNextMarker(_el$17.nextSibling),
437
+ _el$19 = _el$18.nextSibling,
438
+ [_el$20, _co$4] = _$getNextMarker(_el$19.nextSibling),
439
+ _el$21 = _el$20.nextSibling,
440
+ [_el$22, _co$5] = _$getNextMarker(_el$21.nextSibling);
441
+ var _ref$ = commandListRef;
442
+ typeof _ref$ === "function" ? _$use(_ref$, _el$7) : commandListRef = _el$7;
443
+ _$setAttribute(_el$7, "id", commandListId);
444
+ _$insert(_el$7, _$createComponent(For, {
445
+ get each() {
446
+ return commandMatches();
447
+ },
448
+ children: (command, index) => (() => {
449
+ var _el$49 = _$getNextElement(_tmpl$10),
450
+ _el$50 = _el$49.firstChild,
451
+ _el$51 = _el$50.nextSibling,
452
+ _el$52 = _el$51.nextSibling;
453
+ _el$49.$$click = () => void executeCommand(command);
454
+ _el$49.$$pointerdown = event => event.preventDefault();
455
+ _$insert(_el$51, () => command.label ?? `/${command.name}`);
456
+ _$insert(_el$52, () => command.description);
457
+ _$effect(_p$ => {
458
+ var _v$15 = `${commandListId}-${index()}`,
459
+ _v$16 = index() === selectedCommandIndex(),
460
+ _v$17 = command.disabled,
461
+ _v$18 = index() === selectedCommandIndex() ? "true" : undefined,
462
+ _v$19 = command.icon ?? "ti ti-slash";
463
+ _v$15 !== _p$.e && _$setAttribute(_el$49, "id", _p$.e = _v$15);
464
+ _v$16 !== _p$.t && _$setAttribute(_el$49, "aria-selected", _p$.t = _v$16);
465
+ _v$17 !== _p$.a && _$setAttribute(_el$49, "aria-disabled", _p$.a = _v$17);
466
+ _v$18 !== _p$.o && _$setAttribute(_el$49, "data-active", _p$.o = _v$18);
467
+ _v$19 !== _p$.i && _$className(_el$50, _p$.i = _v$19);
468
+ return _p$;
469
+ }, {
470
+ e: undefined,
471
+ t: undefined,
472
+ a: undefined,
473
+ o: undefined,
474
+ i: undefined
475
+ });
476
+ _$runHydrationEvents();
477
+ return _el$49;
478
+ })()
479
+ }), _el$16, _co$2);
480
+ _$insert(_el$7, _$createComponent(Show, {
481
+ get when() {
482
+ return searching();
483
+ },
484
+ get children() {
485
+ var _el$8 = _$getNextElement(_tmpl$2),
486
+ _el$9 = _el$8.firstChild,
487
+ _el$0 = _el$9.nextSibling;
488
+ _$insert(_el$0, () => messages().loading);
489
+ return _el$8;
490
+ }
491
+ }), _el$18, _co$3);
492
+ _$insert(_el$7, _$createComponent(Show, {
493
+ get when() {
494
+ return searchError();
495
+ },
496
+ get children() {
497
+ var _el$1 = _$getNextElement(_tmpl$3),
498
+ _el$10 = _el$1.firstChild,
499
+ _el$11 = _el$10.nextSibling,
500
+ _el$12 = _el$11.nextSibling,
501
+ [_el$13, _co$] = _$getNextMarker(_el$12.nextSibling);
502
+ _$insert(_el$1, () => messages().error, _el$13, _co$);
503
+ return _el$1;
504
+ }
505
+ }), _el$20, _co$4);
506
+ _$insert(_el$7, _$createComponent(Show, {
507
+ get when() {
508
+ return _$memo(() => !!(!searching() && !searchError()))() && commandMatches().length === 0;
509
+ },
510
+ get children() {
511
+ var _el$14 = _$getNextElement(_tmpl$4);
512
+ _$insert(_el$14, () => messages().noResults);
513
+ return _el$14;
514
+ }
515
+ }), _el$22, _co$5);
516
+ _$effect(() => _$setAttribute(_el$7, "aria-label", messages().commands));
517
+ return _el$6;
518
+ }
519
+ }), _el$24, _co$6);
520
+ _$effect(_p$ => {
521
+ var _v$ = commandsOpen() ? "hidden" : undefined,
522
+ _v$2 = commandsOpen();
523
+ _v$ !== _p$.e && _$setStyleProperty(_el$5, "visibility", _p$.e = _v$);
524
+ _v$2 !== _p$.t && _$setProperty(_el$5, "inert", _p$.t = _v$2);
525
+ return _p$;
526
+ }, {
527
+ e: undefined,
528
+ t: undefined
529
+ });
299
530
  return _el$4;
300
531
  }
301
- }), _el$35, _co$0);
302
- _$insert(_el$3, _$createComponent(Show, {
532
+ }), _el$48, _co$11);
533
+ var _ref$2 = composerRef;
534
+ typeof _ref$2 === "function" ? _$use(_ref$2, _el$25) : composerRef = _el$25;
535
+ _$insert(_el$25, _$createComponent(Show, {
303
536
  get when() {
304
537
  return attachments().length > 0;
305
538
  },
306
539
  get children() {
307
- var _el$5 = _$getNextElement(_tmpl$3);
308
- _$insert(_el$5, _$createComponent(For, {
540
+ var _el$26 = _$getNextElement(_tmpl$7);
541
+ _$insert(_el$26, _$createComponent(For, {
309
542
  get each() {
310
543
  return attachments();
311
544
  },
312
545
  children: attachment => (() => {
313
- var _el$48 = _$getNextElement(_tmpl$10),
314
- _el$49 = _el$48.firstChild,
315
- _el$50 = _el$49.firstChild,
316
- [_el$51, _co$12] = _$getNextMarker(_el$50.nextSibling),
317
- _el$52 = _el$51.nextSibling,
318
- [_el$53, _co$13] = _$getNextMarker(_el$52.nextSibling),
319
- _el$55 = _el$49.nextSibling,
320
- [_el$56, _co$14] = _$getNextMarker(_el$55.nextSibling);
321
- _$insert(_el$49, _$createComponent(Show, {
546
+ var _el$53 = _$getNextElement(_tmpl$12),
547
+ _el$54 = _el$53.firstChild,
548
+ _el$55 = _el$54.firstChild,
549
+ [_el$56, _co$12] = _$getNextMarker(_el$55.nextSibling),
550
+ _el$57 = _el$56.nextSibling,
551
+ [_el$58, _co$13] = _$getNextMarker(_el$57.nextSibling),
552
+ _el$60 = _el$54.nextSibling,
553
+ [_el$61, _co$14] = _$getNextMarker(_el$60.nextSibling);
554
+ _$insert(_el$54, _$createComponent(Show, {
322
555
  get when() {
323
556
  return attachment.href;
324
557
  },
325
558
  get fallback() {
326
559
  return (() => {
327
- var _el$57 = _$getNextElement(_tmpl$12),
328
- _el$59 = _el$57.firstChild,
329
- [_el$60, _co$15] = _$getNextMarker(_el$59.nextSibling),
330
- _el$61 = _el$60.nextSibling,
331
- [_el$62, _co$16] = _$getNextMarker(_el$61.nextSibling);
332
- _$insert(_el$57, _$createComponent(Show, {
560
+ var _el$62 = _$getNextElement(_tmpl$14),
561
+ _el$64 = _el$62.firstChild,
562
+ [_el$65, _co$15] = _$getNextMarker(_el$64.nextSibling),
563
+ _el$66 = _el$65.nextSibling,
564
+ [_el$67, _co$16] = _$getNextMarker(_el$66.nextSibling);
565
+ _$insert(_el$62, _$createComponent(Show, {
333
566
  get when() {
334
567
  return _$memo(() => attachment.kind === "image")() && attachment.previewUrl;
335
568
  },
336
569
  get fallback() {
337
570
  return (() => {
338
- var _el$63 = _$getNextElement(_tmpl$13);
339
- _$effect(() => _$className(_el$63, attachmentIcon(attachment)));
340
- return _el$63;
571
+ var _el$68 = _$getNextElement(_tmpl$15);
572
+ _$effect(() => _$className(_el$68, attachmentIcon(attachment)));
573
+ return _el$68;
341
574
  })();
342
575
  },
343
576
  get children() {
344
- var _el$58 = _$getNextElement(_tmpl$11);
577
+ var _el$63 = _$getNextElement(_tmpl$13);
345
578
  _$effect(_p$ => {
346
- var _v$24 = attachment.previewUrl,
347
- _v$25 = attachment.alt ?? "";
348
- _v$24 !== _p$.e && _$setAttribute(_el$58, "src", _p$.e = _v$24);
349
- _v$25 !== _p$.t && _$setAttribute(_el$58, "alt", _p$.t = _v$25);
579
+ var _v$22 = attachment.previewUrl,
580
+ _v$23 = attachment.alt ?? "";
581
+ _v$22 !== _p$.e && _$setAttribute(_el$63, "src", _p$.e = _v$22);
582
+ _v$23 !== _p$.t && _$setAttribute(_el$63, "alt", _p$.t = _v$23);
350
583
  return _p$;
351
584
  }, {
352
585
  e: undefined,
353
586
  t: undefined
354
587
  });
355
- return _el$58;
588
+ return _el$63;
356
589
  }
357
- }), _el$60, _co$15);
358
- _$insert(_el$57, () => renderAttachmentCopy(attachment), _el$62, _co$16);
359
- return _el$57;
590
+ }), _el$65, _co$15);
591
+ _$insert(_el$62, () => renderAttachmentCopy(attachment), _el$67, _co$16);
592
+ return _el$62;
360
593
  })();
361
594
  },
362
595
  children: href => (() => {
363
- var _el$64 = _$getNextElement(_tmpl$14),
364
- _el$66 = _el$64.firstChild,
365
- [_el$67, _co$17] = _$getNextMarker(_el$66.nextSibling),
366
- _el$68 = _el$67.nextSibling,
367
- [_el$69, _co$18] = _$getNextMarker(_el$68.nextSibling);
368
- _$insert(_el$64, _$createComponent(Show, {
596
+ var _el$69 = _$getNextElement(_tmpl$16),
597
+ _el$71 = _el$69.firstChild,
598
+ [_el$72, _co$17] = _$getNextMarker(_el$71.nextSibling),
599
+ _el$73 = _el$72.nextSibling,
600
+ [_el$74, _co$18] = _$getNextMarker(_el$73.nextSibling);
601
+ _$insert(_el$69, _$createComponent(Show, {
369
602
  get when() {
370
603
  return _$memo(() => attachment.kind === "image")() && attachment.previewUrl;
371
604
  },
372
605
  get fallback() {
373
606
  return (() => {
374
- var _el$70 = _$getNextElement(_tmpl$13);
375
- _$effect(() => _$className(_el$70, attachmentIcon(attachment)));
376
- return _el$70;
607
+ var _el$75 = _$getNextElement(_tmpl$15);
608
+ _$effect(() => _$className(_el$75, attachmentIcon(attachment)));
609
+ return _el$75;
377
610
  })();
378
611
  },
379
612
  get children() {
380
- var _el$65 = _$getNextElement(_tmpl$11);
613
+ var _el$70 = _$getNextElement(_tmpl$13);
381
614
  _$effect(_p$ => {
382
- var _v$26 = attachment.previewUrl,
383
- _v$27 = attachment.alt ?? "";
384
- _v$26 !== _p$.e && _$setAttribute(_el$65, "src", _p$.e = _v$26);
385
- _v$27 !== _p$.t && _$setAttribute(_el$65, "alt", _p$.t = _v$27);
615
+ var _v$24 = attachment.previewUrl,
616
+ _v$25 = attachment.alt ?? "";
617
+ _v$24 !== _p$.e && _$setAttribute(_el$70, "src", _p$.e = _v$24);
618
+ _v$25 !== _p$.t && _$setAttribute(_el$70, "alt", _p$.t = _v$25);
386
619
  return _p$;
387
620
  }, {
388
621
  e: undefined,
389
622
  t: undefined
390
623
  });
391
- return _el$65;
624
+ return _el$70;
392
625
  }
393
- }), _el$67, _co$17);
394
- _$insert(_el$64, () => renderAttachmentCopy(attachment), _el$69, _co$18);
626
+ }), _el$72, _co$17);
627
+ _$insert(_el$69, () => renderAttachmentCopy(attachment), _el$74, _co$18);
395
628
  _$effect(_p$ => {
396
- var _v$28 = href(),
397
- _v$29 = messages().openInNewTab({
629
+ var _v$26 = href(),
630
+ _v$27 = messages().openInNewTab({
398
631
  name: attachment.name
399
632
  });
400
- _v$28 !== _p$.e && _$setAttribute(_el$64, "href", _p$.e = _v$28);
401
- _v$29 !== _p$.t && _$setAttribute(_el$64, "aria-label", _p$.t = _v$29);
633
+ _v$26 !== _p$.e && _$setAttribute(_el$69, "href", _p$.e = _v$26);
634
+ _v$27 !== _p$.t && _$setAttribute(_el$69, "aria-label", _p$.t = _v$27);
402
635
  return _p$;
403
636
  }, {
404
637
  e: undefined,
405
638
  t: undefined
406
639
  });
407
- return _el$64;
640
+ return _el$69;
408
641
  })()
409
- }), _el$51, _co$12);
410
- _$insert(_el$49, _$createComponent(Show, {
642
+ }), _el$56, _co$12);
643
+ _$insert(_el$54, _$createComponent(Show, {
411
644
  get when() {
412
645
  return attachment.action;
413
646
  },
414
647
  children: action => (() => {
415
- var _el$71 = _$getNextElement(_tmpl$15),
416
- _el$72 = _el$71.firstChild,
417
- [_el$73, _co$19] = _$getNextMarker(_el$72.nextSibling),
418
- _el$74 = _el$73.nextSibling,
419
- [_el$75, _co$20] = _$getNextMarker(_el$74.nextSibling);
420
- _el$71.$$click = () => reportChatFailure(() => executeChatAction(action()), props.onError);
421
- _$insert(_el$71, _$createComponent(Show, {
648
+ var _el$76 = _$getNextElement(_tmpl$17),
649
+ _el$77 = _el$76.firstChild,
650
+ [_el$78, _co$19] = _$getNextMarker(_el$77.nextSibling),
651
+ _el$79 = _el$78.nextSibling,
652
+ [_el$80, _co$20] = _$getNextMarker(_el$79.nextSibling);
653
+ _el$76.$$click = () => reportChatFailure(() => executeChatAction(action()), props.onError);
654
+ _$insert(_el$76, _$createComponent(Show, {
422
655
  get when() {
423
656
  return action().icon;
424
657
  },
425
658
  children: icon => (() => {
426
- var _el$76 = _$getNextElement(_tmpl$13);
427
- _$effect(() => _$className(_el$76, icon()));
428
- return _el$76;
659
+ var _el$81 = _$getNextElement(_tmpl$15);
660
+ _$effect(() => _$className(_el$81, icon()));
661
+ return _el$81;
429
662
  })()
430
- }), _el$73, _co$19);
431
- _$insert(_el$71, () => action().label, _el$75, _co$20);
432
- _$effect(() => _$setProperty(_el$71, "disabled", blocked() || action().disabled));
663
+ }), _el$78, _co$19);
664
+ _$insert(_el$76, () => action().label, _el$80, _co$20);
665
+ _$effect(() => _$setProperty(_el$76, "disabled", blocked() || action().disabled));
433
666
  _$runHydrationEvents();
434
- return _el$71;
667
+ return _el$76;
435
668
  })()
436
- }), _el$53, _co$13);
437
- _$insert(_el$48, _$createComponent(Show, {
669
+ }), _el$58, _co$13);
670
+ _$insert(_el$53, _$createComponent(Show, {
438
671
  get when() {
439
672
  return props.onAttachmentsChange;
440
673
  },
441
674
  get children() {
442
- var _el$54 = _$getNextElement(_tmpl$1);
443
- _el$54.$$click = () => setAttachments(attachments().filter(candidate => candidate.id !== attachment.id));
675
+ var _el$59 = _$getNextElement(_tmpl$11);
676
+ _el$59.$$click = () => setAttachments(attachments().filter(candidate => candidate.id !== attachment.id));
444
677
  _$effect(_p$ => {
445
- var _v$22 = messages().removeNamed({
678
+ var _v$20 = messages().removeNamed({
446
679
  name: attachment.name
447
680
  }),
448
- _v$23 = blocked();
449
- _v$22 !== _p$.e && _$setAttribute(_el$54, "aria-label", _p$.e = _v$22);
450
- _v$23 !== _p$.t && _$setProperty(_el$54, "disabled", _p$.t = _v$23);
681
+ _v$21 = blocked();
682
+ _v$20 !== _p$.e && _$setAttribute(_el$59, "aria-label", _p$.e = _v$20);
683
+ _v$21 !== _p$.t && _$setProperty(_el$59, "disabled", _p$.t = _v$21);
451
684
  return _p$;
452
685
  }, {
453
686
  e: undefined,
454
687
  t: undefined
455
688
  });
456
689
  _$runHydrationEvents();
457
- return _el$54;
690
+ return _el$59;
458
691
  }
459
- }), _el$56, _co$14);
460
- _$effect(() => _el$49.classList.toggle("k2b-chat-composer__attachment-content--action", !!Boolean(attachment.action)));
461
- return _el$48;
692
+ }), _el$61, _co$14);
693
+ _$effect(() => _el$54.classList.toggle("k2b-chat-composer__attachment-content--action", !!Boolean(attachment.action)));
694
+ return _el$53;
462
695
  })()
463
696
  }));
464
- _$effect(() => _$setAttribute(_el$5, "aria-label", messages().attachments));
465
- return _el$5;
697
+ _$effect(() => _$setAttribute(_el$26, "aria-label", messages().attachments));
698
+ return _el$26;
466
699
  }
467
- }), _el$37, _co$1);
468
- _el$6.addEventListener("drop", event => {
700
+ }), _el$44, _co$1);
701
+ _el$27.addEventListener("drop", event => {
469
702
  if (!event.dataTransfer?.types.includes("Files")) return;
470
703
  event.preventDefault();
471
704
  setDragActive(false);
472
705
  if (canSelectFiles() && event.dataTransfer.files.length) void runFiles(event.dataTransfer.files);
473
706
  });
474
- _el$6.addEventListener("dragleave", event => {
707
+ _el$27.addEventListener("dragleave", event => {
475
708
  if (!event.currentTarget.contains(event.relatedTarget)) setDragActive(false);
476
709
  });
477
- _el$6.addEventListener("dragover", event => {
710
+ _el$27.addEventListener("dragover", event => {
478
711
  if (!canSelectFiles() || !event.dataTransfer?.types.includes("Files")) return;
479
712
  event.preventDefault();
480
713
  setDragActive(true);
481
714
  });
482
- _el$6.addEventListener("dragenter", event => {
715
+ _el$27.addEventListener("dragenter", event => {
483
716
  if (!canSelectFiles() || !event.dataTransfer?.types.includes("Files")) return;
484
717
  event.preventDefault();
485
718
  setDragActive(true);
486
719
  });
487
- _$insert(_el$6, _$createComponent(Show, {
720
+ _$insert(_el$27, _$createComponent(Show, {
488
721
  get when() {
489
722
  return dragActive();
490
723
  },
491
724
  get children() {
492
- var _el$7 = _$getNextElement(_tmpl$4);
493
- _$insert(_el$7, () => messages().dropFilesToAttach);
494
- return _el$7;
725
+ var _el$28 = _$getNextElement(_tmpl$8);
726
+ _$insert(_el$28, () => messages().dropFilesToAttach);
727
+ return _el$28;
728
+ }
729
+ }), _el$35, _co$8);
730
+ _$insert(_el$27, _$createComponent(Show, {
731
+ get when() {
732
+ return mentions().length > 0;
733
+ },
734
+ get children() {
735
+ var _el$29 = _$getNextElement(_tmpl$9),
736
+ _el$31 = _el$29.firstChild,
737
+ [_el$32, _co$7] = _$getNextMarker(_el$31.nextSibling),
738
+ _el$30 = _el$32.nextSibling;
739
+ var _ref$3 = highlightRef;
740
+ typeof _ref$3 === "function" ? _$use(_ref$3, _el$29) : highlightRef = _el$29;
741
+ _$insert(_el$29, _$createComponent(For, {
742
+ get each() {
743
+ return chatMentionSegments(props.value, mentions());
744
+ },
745
+ children: part => (() => {
746
+ var _el$82 = _$getNextElement(_tmpl$18);
747
+ _$insert(_el$82, () => part.text);
748
+ _$effect(() => _el$82.classList.toggle("k2b-chat-composer__mention", !!Boolean(part.mention)));
749
+ return _el$82;
750
+ })()
751
+ }), _el$32, _co$7);
752
+ return _el$29;
753
+ }
754
+ }), _el$37, _co$9);
755
+ _el$33.$$keydown = onKeyDown;
756
+ _el$33.$$beforeinput = event => {
757
+ if (event.inputType === "historyUndo" || event.inputType === "historyRedo") {
758
+ event.preventDefault();
759
+ restoreHistory(event.inputType === "historyUndo" ? -1 : 1);
495
760
  }
496
- }), _el$0, _co$);
497
- _el$8.$$keydown = onKeyDown;
498
- _el$8.addEventListener("paste", event => {
761
+ };
762
+ _el$33.addEventListener("scroll", () => {
763
+ if (highlightRef && textareaRef) highlightRef.scrollTop = textareaRef.scrollTop;
764
+ });
765
+ _el$33.addEventListener("compositionend", () => {
766
+ setComposing(false);
767
+ syncCaret();
768
+ });
769
+ _el$33.addEventListener("compositionstart", () => setComposing(true));
770
+ _el$33.$$keyup = syncCaret;
771
+ _el$33.$$click = () => {
772
+ setDismissed(false);
773
+ syncCaret();
774
+ };
775
+ _el$33.addEventListener("blur", () => setDismissed(true));
776
+ _el$33.addEventListener("select", syncCaret);
777
+ _el$33.addEventListener("paste", event => {
499
778
  const clipboardData = event.clipboardData;
500
779
  if (canSelectFiles() && clipboardData?.files.length) {
501
780
  event.preventDefault();
@@ -504,237 +783,285 @@ export function ChatComposer(props) {
504
783
  }
505
784
  props.onPaste?.(event);
506
785
  });
507
- _el$8.$$input = event => {
508
- props.onValueChange(event.currentTarget.value);
786
+ _el$33.$$input = event => {
787
+ edit(event.currentTarget.value);
788
+ syncCaret();
509
789
  autoResize();
510
790
  };
511
- var _ref$2 = textareaRef;
512
- typeof _ref$2 === "function" ? _$use(_ref$2, _el$8) : textareaRef = _el$8;
513
- _$insert(_el$3, _$createComponent(Show, {
791
+ var _ref$4 = textareaRef;
792
+ typeof _ref$4 === "function" ? _$use(_ref$4, _el$33) : textareaRef = _el$33;
793
+ _$insert(_el$25, _$createComponent(Show, {
514
794
  get when() {
515
795
  return props.error;
516
796
  },
517
797
  get children() {
518
- var _el$1 = _$getNextElement(_tmpl$5),
519
- _el$10 = _el$1.firstChild,
520
- _el$11 = _el$10.nextSibling,
521
- [_el$12, _co$2] = _$getNextMarker(_el$11.nextSibling);
522
- _$insert(_el$1, () => props.error, _el$12, _co$2);
523
- return _el$1;
798
+ var _el$38 = _$getNextElement(_tmpl$0),
799
+ _el$39 = _el$38.firstChild,
800
+ _el$40 = _el$39.nextSibling,
801
+ [_el$41, _co$0] = _$getNextMarker(_el$40.nextSibling);
802
+ _$insert(_el$38, () => props.error, _el$41, _co$0);
803
+ return _el$38;
524
804
  }
525
- }), _el$39, _co$10);
526
- _$insert(_el$14, () => props.footerTools, _el$18, _co$3);
527
- _$insert(_el$14, _$createComponent(Show, {
805
+ }), _el$46, _co$10);
806
+ _$insert(_el$42, _$createComponent(Show, {
528
807
  get when() {
529
- return hasAddMenu();
808
+ return props.footerContent;
530
809
  },
531
- get children() {
532
- return _$createComponent(Dropdown.Root, {
533
- position: "top-right",
534
- width: "12rem",
535
- get label() {
536
- return messages().addToChat;
537
- },
538
- get items() {
539
- return menuItems();
540
- },
541
- get disabled() {
542
- return blocked();
543
- },
544
- get children() {
545
- return _$createComponent(Dropdown.Trigger, {
546
- appearance: "plain",
547
- "class": "k2b-chat-composer__icon-action",
548
- get label() {
549
- return messages().addToChat;
550
- },
551
- get title() {
552
- return messages().addToChat;
810
+ get fallback() {
811
+ return [(() => {
812
+ var _el$83 = _$getNextElement(_tmpl$21),
813
+ _el$86 = _el$83.firstChild,
814
+ [_el$87, _co$21] = _$getNextMarker(_el$86.nextSibling),
815
+ _el$88 = _el$87.nextSibling,
816
+ [_el$89, _co$22] = _$getNextMarker(_el$88.nextSibling),
817
+ _el$90 = _el$89.nextSibling,
818
+ [_el$91, _co$23] = _$getNextMarker(_el$90.nextSibling),
819
+ _el$92 = _el$91.nextSibling,
820
+ [_el$93, _co$24] = _$getNextMarker(_el$92.nextSibling),
821
+ _el$94 = _el$93.nextSibling,
822
+ [_el$95, _co$25] = _$getNextMarker(_el$94.nextSibling);
823
+ _$insert(_el$83, () => props.footerTools, _el$87, _co$21);
824
+ _$insert(_el$83, _$createComponent(Show, {
825
+ get when() {
826
+ return hasAddMenu();
827
+ },
828
+ get children() {
829
+ return _$createComponent(Dropdown.Root, {
830
+ position: "top-right",
831
+ width: "12rem",
832
+ get label() {
833
+ return messages().addToChat;
834
+ },
835
+ get items() {
836
+ return menuItems();
837
+ },
838
+ get disabled() {
839
+ return blocked();
840
+ },
841
+ get children() {
842
+ return _$createComponent(Dropdown.Trigger, {
843
+ appearance: "plain",
844
+ "class": "k2b-chat-composer__icon-action",
845
+ get label() {
846
+ return messages().addToChat;
847
+ },
848
+ get title() {
849
+ return messages().addToChat;
850
+ },
851
+ get children() {
852
+ return _$getNextElement(_tmpl$19);
853
+ }
854
+ });
855
+ }
856
+ });
857
+ }
858
+ }), _el$89, _co$22);
859
+ _$insert(_el$83, _$createComponent(Show, {
860
+ get when() {
861
+ return props.fileSelection;
862
+ },
863
+ get children() {
864
+ var _el$85 = _$getNextElement(_tmpl$20);
865
+ _el$85.addEventListener("change", event => {
866
+ if (event.currentTarget.files?.length) void runFiles(event.currentTarget.files);
867
+ });
868
+ var _ref$5 = fileInputRef;
869
+ typeof _ref$5 === "function" ? _$use(_ref$5, _el$85) : fileInputRef = _el$85;
870
+ _$effect(_p$ => {
871
+ var _v$28 = props.fileSelection?.accept,
872
+ _v$29 = props.fileSelection?.multiple ?? true;
873
+ _v$28 !== _p$.e && _$setAttribute(_el$85, "accept", _p$.e = _v$28);
874
+ _v$29 !== _p$.t && _$setProperty(_el$85, "multiple", _p$.t = _v$29);
875
+ return _p$;
876
+ }, {
877
+ e: undefined,
878
+ t: undefined
879
+ });
880
+ return _el$85;
881
+ }
882
+ }), _el$91, _co$23);
883
+ _$insert(_el$83, _$createComponent(Show, {
884
+ get when() {
885
+ return (props.models?.length ?? 0) > 0;
886
+ },
887
+ get children() {
888
+ return _$createComponent(SelectChip, {
889
+ get ["aria-label"]() {
890
+ return messages().chooseModel;
891
+ },
892
+ position: "top-right",
893
+ "class": "k2b-chat-composer__model",
894
+ menuWidth: "15rem",
895
+ get placeholder() {
896
+ return messages().model;
897
+ },
898
+ value: () => props.selectedModelId ?? "",
899
+ get options() {
900
+ return (props.models ?? []).map(model => ({
901
+ value: model.id,
902
+ label: model.label,
903
+ description: model.description,
904
+ icon: model.icon,
905
+ image: model.image
906
+ }));
907
+ },
908
+ get disabled() {
909
+ return blocked() || running() || !props.onModelChange;
910
+ },
911
+ onValueChange: modelId => {
912
+ props.onModelChange?.(modelId);
913
+ queueMicrotask(focus);
914
+ }
915
+ });
916
+ }
917
+ }), _el$93, _co$24);
918
+ _$insert(_el$83, () => props.modelDetails, _el$95, _co$25);
919
+ return _el$83;
920
+ })(), (() => {
921
+ var _el$96 = _$getNextElement(_tmpl$23),
922
+ _el$99 = _el$96.firstChild,
923
+ [_el$100, _co$26] = _$getNextMarker(_el$99.nextSibling),
924
+ _el$101 = _el$100.nextSibling,
925
+ [_el$102, _co$27] = _$getNextMarker(_el$101.nextSibling),
926
+ _el$103 = _el$102.nextSibling,
927
+ [_el$104, _co$28] = _$getNextMarker(_el$103.nextSibling),
928
+ _el$105 = _el$104.nextSibling,
929
+ [_el$106, _co$29] = _$getNextMarker(_el$105.nextSibling);
930
+ _$insert(_el$96, _$createComponent(For, {
931
+ get each() {
932
+ return props.contextActions;
933
+ },
934
+ children: action => (() => {
935
+ var _el$107 = _$getNextElement(_tmpl$24),
936
+ _el$108 = _el$107.firstChild;
937
+ _el$107.$$click = () => reportChatFailure(() => executeChatAction(action), props.onError);
938
+ _$effect(_p$ => {
939
+ var _v$34 = action.variant === "danger" ? "danger" : undefined,
940
+ _v$35 = action.disabled,
941
+ _v$36 = action.pressed,
942
+ _v$37 = action.label,
943
+ _v$38 = action.label,
944
+ _v$39 = action.icon ?? "ti ti-dots";
945
+ _v$34 !== _p$.e && _$setAttribute(_el$107, "data-tone", _p$.e = _v$34);
946
+ _v$35 !== _p$.t && _$setProperty(_el$107, "disabled", _p$.t = _v$35);
947
+ _v$36 !== _p$.a && _$setAttribute(_el$107, "aria-pressed", _p$.a = _v$36);
948
+ _v$37 !== _p$.o && _$setAttribute(_el$107, "aria-label", _p$.o = _v$37);
949
+ _v$38 !== _p$.i && _$setAttribute(_el$107, "title", _p$.i = _v$38);
950
+ _v$39 !== _p$.n && _$className(_el$108, _p$.n = _v$39);
951
+ return _p$;
952
+ }, {
953
+ e: undefined,
954
+ t: undefined,
955
+ a: undefined,
956
+ o: undefined,
957
+ i: undefined,
958
+ n: undefined
959
+ });
960
+ _$runHydrationEvents();
961
+ return _el$107;
962
+ })()
963
+ }), _el$100, _co$26);
964
+ _$insert(_el$96, _$createComponent(Show, {
965
+ get when() {
966
+ return _$memo(() => !!hasContextUsage())() ? props.contextUsage ?? {} : undefined;
967
+ },
968
+ children: usage => _$createComponent(ContextUsage, _$mergeProps(usage, {
969
+ get action() {
970
+ return props.contextPopupAction;
553
971
  },
554
- get children() {
555
- return _$getNextElement(_tmpl$6);
972
+ get onActionError() {
973
+ return props.onError;
556
974
  }
557
- });
558
- }
559
- });
560
- }
561
- }), _el$20, _co$4);
562
- _$insert(_el$14, _$createComponent(Show, {
563
- get when() {
564
- return props.fileSelection;
565
- },
566
- get children() {
567
- var _el$16 = _$getNextElement(_tmpl$7);
568
- _el$16.addEventListener("change", event => {
569
- if (event.currentTarget.files?.length) void runFiles(event.currentTarget.files);
570
- });
571
- var _ref$3 = fileInputRef;
572
- typeof _ref$3 === "function" ? _$use(_ref$3, _el$16) : fileInputRef = _el$16;
573
- _$effect(_p$ => {
574
- var _v$ = props.fileSelection?.accept,
575
- _v$2 = props.fileSelection?.multiple ?? true;
576
- _v$ !== _p$.e && _$setAttribute(_el$16, "accept", _p$.e = _v$);
577
- _v$2 !== _p$.t && _$setProperty(_el$16, "multiple", _p$.t = _v$2);
578
- return _p$;
579
- }, {
580
- e: undefined,
581
- t: undefined
582
- });
583
- return _el$16;
584
- }
585
- }), _el$22, _co$5);
586
- _$insert(_el$14, _$createComponent(Show, {
587
- get when() {
588
- return (props.models?.length ?? 0) > 0;
589
- },
590
- get children() {
591
- return _$createComponent(SelectChip, {
592
- get ["aria-label"]() {
593
- return messages().chooseModel;
594
- },
595
- position: "top-right",
596
- "class": "k2b-chat-composer__model",
597
- menuWidth: "15rem",
598
- get placeholder() {
599
- return messages().model;
600
- },
601
- value: () => props.selectedModelId ?? "",
602
- get options() {
603
- return (props.models ?? []).map(model => ({
604
- value: model.id,
605
- label: model.label,
606
- description: model.description,
607
- icon: model.icon,
608
- image: model.image
609
- }));
610
- },
611
- get disabled() {
612
- return blocked() || running() || !props.onModelChange;
613
- },
614
- onValueChange: modelId => {
615
- props.onModelChange?.(modelId);
616
- queueMicrotask(focus);
617
- }
618
- });
619
- }
620
- }), _el$24, _co$6);
621
- _$insert(_el$25, _$createComponent(For, {
622
- get each() {
623
- return props.contextActions;
624
- },
625
- children: action => (() => {
626
- var _el$77 = _$getNextElement(_tmpl$16),
627
- _el$78 = _el$77.firstChild;
628
- _el$77.$$click = () => reportChatFailure(() => executeChatAction(action), props.onError);
629
- _$effect(_p$ => {
630
- var _v$30 = action.variant === "danger" ? "danger" : undefined,
631
- _v$31 = action.disabled,
632
- _v$32 = action.label,
633
- _v$33 = action.label,
634
- _v$34 = action.icon ?? "ti ti-dots";
635
- _v$30 !== _p$.e && _$setAttribute(_el$77, "data-tone", _p$.e = _v$30);
636
- _v$31 !== _p$.t && _$setProperty(_el$77, "disabled", _p$.t = _v$31);
637
- _v$32 !== _p$.a && _$setAttribute(_el$77, "aria-label", _p$.a = _v$32);
638
- _v$33 !== _p$.o && _$setAttribute(_el$77, "title", _p$.o = _v$33);
639
- _v$34 !== _p$.i && _$className(_el$78, _p$.i = _v$34);
640
- return _p$;
641
- }, {
642
- e: undefined,
643
- t: undefined,
644
- a: undefined,
645
- o: undefined,
646
- i: undefined
647
- });
648
- _$runHydrationEvents();
649
- return _el$77;
650
- })()
651
- }), _el$29, _co$7);
652
- _$insert(_el$25, _$createComponent(Show, {
653
- get when() {
654
- return _$memo(() => !!hasContextUsage())() ? props.contextUsage : undefined;
655
- },
656
- children: usage => _$createComponent(ContextUsage, _$mergeProps(usage))
657
- }), _el$31, _co$8);
658
- _$insert(_el$25, _$createComponent(Show, {
659
- get when() {
660
- return _$memo(() => !!(running() && !hasDraft()))() && props.onStop;
661
- },
662
- get fallback() {
663
- return (() => {
664
- var _el$79 = _$getNextElement(_tmpl$17),
665
- _el$80 = _el$79.firstChild;
666
- _el$79.$$click = () => void submit();
667
- _$effect(_p$ => {
668
- var _v$35 = !canSubmit(),
669
- _v$36 = submitting() ? running() ? runningSubmitIntent() === "queue" ? messages().queueing : messages().steering : messages().sending : running() ? runningSubmitIntent() === "queue" ? messages().queueMessage : messages().steerResponse : messages().sendMessage,
670
- _v$37 = running() ? runningSubmitIntent() === "queue" ? messages().queueMessage : messages().steerResponse : messages().sendMessage,
671
- _v$38 = submitting() ? "ti ti-loader-2 k2b-spin" : "ti ti-arrow-up";
672
- _v$35 !== _p$.e && _$setProperty(_el$79, "disabled", _p$.e = _v$35);
673
- _v$36 !== _p$.t && _$setAttribute(_el$79, "aria-label", _p$.t = _v$36);
674
- _v$37 !== _p$.a && _$setAttribute(_el$79, "title", _p$.a = _v$37);
675
- _v$38 !== _p$.o && _$className(_el$80, _p$.o = _v$38);
676
- return _p$;
677
- }, {
678
- e: undefined,
679
- t: undefined,
680
- a: undefined,
681
- o: undefined
682
- });
683
- _$runHydrationEvents();
684
- return _el$79;
685
- })();
975
+ }))
976
+ }), _el$102, _co$27);
977
+ _$insert(_el$96, () => props.submitTools, _el$104, _co$28);
978
+ _$insert(_el$96, _$createComponent(Show, {
979
+ get when() {
980
+ return _$memo(() => !!(running() && !hasDraft()))() && props.onStop;
981
+ },
982
+ get fallback() {
983
+ return (() => {
984
+ var _el$109 = _$getNextElement(_tmpl$25),
985
+ _el$110 = _el$109.firstChild;
986
+ _el$109.$$click = () => void submit();
987
+ _$effect(_p$ => {
988
+ var _v$40 = !canSubmit(),
989
+ _v$41 = submitting() ? running() ? runningSubmitIntent() === "queue" ? messages().queueing : messages().steering : messages().sending : running() ? runningSubmitIntent() === "queue" ? messages().queueMessage : messages().steerResponse : messages().sendMessage,
990
+ _v$42 = running() ? runningSubmitIntent() === "queue" ? messages().queueMessage : messages().steerResponse : messages().sendMessage,
991
+ _v$43 = submitting() ? "ti ti-loader-2 k2b-spin" : "ti ti-arrow-up";
992
+ _v$40 !== _p$.e && _$setProperty(_el$109, "disabled", _p$.e = _v$40);
993
+ _v$41 !== _p$.t && _$setAttribute(_el$109, "aria-label", _p$.t = _v$41);
994
+ _v$42 !== _p$.a && _$setAttribute(_el$109, "title", _p$.a = _v$42);
995
+ _v$43 !== _p$.o && _$className(_el$110, _p$.o = _v$43);
996
+ return _p$;
997
+ }, {
998
+ e: undefined,
999
+ t: undefined,
1000
+ a: undefined,
1001
+ o: undefined
1002
+ });
1003
+ _$runHydrationEvents();
1004
+ return _el$109;
1005
+ })();
1006
+ },
1007
+ get children() {
1008
+ var _el$97 = _$getNextElement(_tmpl$22),
1009
+ _el$98 = _el$97.firstChild;
1010
+ _el$97.$$click = () => reportChatFailure(() => props.onStop?.(), props.onError);
1011
+ _$effect(_p$ => {
1012
+ var _v$30 = stopping(),
1013
+ _v$31 = stopping() ? messages().stopping : messages().stopResponse,
1014
+ _v$32 = stopping() ? messages().stopping : messages().stopResponse,
1015
+ _v$33 = stopping() ? "ti ti-loader-2 k2b-spin" : "ti ti-player-stop";
1016
+ _v$30 !== _p$.e && _$setProperty(_el$97, "disabled", _p$.e = _v$30);
1017
+ _v$31 !== _p$.t && _$setAttribute(_el$97, "aria-label", _p$.t = _v$31);
1018
+ _v$32 !== _p$.a && _$setAttribute(_el$97, "title", _p$.a = _v$32);
1019
+ _v$33 !== _p$.o && _$className(_el$98, _p$.o = _v$33);
1020
+ return _p$;
1021
+ }, {
1022
+ e: undefined,
1023
+ t: undefined,
1024
+ a: undefined,
1025
+ o: undefined
1026
+ });
1027
+ _$runHydrationEvents();
1028
+ return _el$97;
1029
+ }
1030
+ }), _el$106, _co$29);
1031
+ return _el$96;
1032
+ })()];
686
1033
  },
687
- get children() {
688
- var _el$26 = _$getNextElement(_tmpl$8),
689
- _el$27 = _el$26.firstChild;
690
- _el$26.$$click = () => reportChatFailure(() => props.onStop?.(), props.onError);
691
- _$effect(_p$ => {
692
- var _v$3 = stopping(),
693
- _v$4 = stopping() ? messages().stopping : messages().stopResponse,
694
- _v$5 = stopping() ? messages().stopping : messages().stopResponse,
695
- _v$6 = stopping() ? "ti ti-loader-2 k2b-spin" : "ti ti-player-stop";
696
- _v$3 !== _p$.e && _$setProperty(_el$26, "disabled", _p$.e = _v$3);
697
- _v$4 !== _p$.t && _$setAttribute(_el$26, "aria-label", _p$.t = _v$4);
698
- _v$5 !== _p$.a && _$setAttribute(_el$26, "title", _p$.a = _v$5);
699
- _v$6 !== _p$.o && _$className(_el$27, _p$.o = _v$6);
700
- return _p$;
701
- }, {
702
- e: undefined,
703
- t: undefined,
704
- a: undefined,
705
- o: undefined
706
- });
707
- _$runHydrationEvents();
708
- return _el$26;
709
- }
710
- }), _el$33, _co$9);
1034
+ children: content => content()
1035
+ }));
711
1036
  _$effect(_p$ => {
712
- var _v$7 = `k2b-chat-composer ${props.class ?? ""}`,
713
- _v$8 = running() ? "true" : undefined,
714
- _v$9 = dragActive() ? "true" : undefined,
715
- _v$0 = props.label ?? messages().messageComposer,
716
- _v$1 = messages().messageInput,
717
- _v$10 = blocked(),
718
- _v$11 = props.placeholder ?? (running() ? messages().addGuidance : messages().writeMessage),
719
- _v$12 = props.inputLabel ?? messages().message,
720
- _v$13 = commandsOpen() ? "combobox" : undefined,
721
- _v$14 = commandsOpen() ? "list" : undefined,
722
- _v$15 = commandsOpen() ? commandListId : undefined,
723
- _v$16 = commandsOpen() ? "true" : undefined,
724
- _v$17 = selectedCommand() ? `${commandListId}-${selectedCommandIndex()}` : undefined;
725
- _v$7 !== _p$.e && _$className(_el$3, _p$.e = _v$7);
726
- _v$8 !== _p$.t && _$setAttribute(_el$3, "data-running", _p$.t = _v$8);
727
- _v$9 !== _p$.a && _$setAttribute(_el$3, "data-drag-active", _p$.a = _v$9);
728
- _v$0 !== _p$.o && _$setAttribute(_el$3, "aria-label", _p$.o = _v$0);
729
- _v$1 !== _p$.i && _$setAttribute(_el$6, "aria-label", _p$.i = _v$1);
730
- _v$10 !== _p$.n && _$setProperty(_el$8, "disabled", _p$.n = _v$10);
731
- _v$11 !== _p$.s && _$setAttribute(_el$8, "placeholder", _p$.s = _v$11);
732
- _v$12 !== _p$.h && _$setAttribute(_el$8, "aria-label", _p$.h = _v$12);
733
- _v$13 !== _p$.r && _$setAttribute(_el$8, "role", _p$.r = _v$13);
734
- _v$14 !== _p$.d && _$setAttribute(_el$8, "aria-autocomplete", _p$.d = _v$14);
735
- _v$15 !== _p$.l && _$setAttribute(_el$8, "aria-controls", _p$.l = _v$15);
736
- _v$16 !== _p$.u && _$setAttribute(_el$8, "aria-expanded", _p$.u = _v$16);
737
- _v$17 !== _p$.c && _$setAttribute(_el$8, "aria-activedescendant", _p$.c = _v$17);
1037
+ var _v$3 = `k2b-chat-composer ${props.class ?? ""}`,
1038
+ _v$4 = running() ? "true" : undefined,
1039
+ _v$5 = dragActive() ? "true" : undefined,
1040
+ _v$6 = props.label ?? messages().messageComposer,
1041
+ _v$7 = messages().messageInput,
1042
+ _v$8 = !!(mentions().length > 0),
1043
+ _v$9 = blocked(),
1044
+ _v$0 = props.placeholder ?? (running() ? messages().addGuidance : messages().writeMessage),
1045
+ _v$1 = props.inputLabel ?? messages().message,
1046
+ _v$10 = commandsOpen() ? "combobox" : undefined,
1047
+ _v$11 = commandsOpen() ? "list" : undefined,
1048
+ _v$12 = commandsOpen() ? commandListId : undefined,
1049
+ _v$13 = commandsOpen() ? "true" : undefined,
1050
+ _v$14 = selectedCommand() ? `${commandListId}-${selectedCommandIndex()}` : undefined;
1051
+ _v$3 !== _p$.e && _$className(_el$25, _p$.e = _v$3);
1052
+ _v$4 !== _p$.t && _$setAttribute(_el$25, "data-running", _p$.t = _v$4);
1053
+ _v$5 !== _p$.a && _$setAttribute(_el$25, "data-drag-active", _p$.a = _v$5);
1054
+ _v$6 !== _p$.o && _$setAttribute(_el$25, "aria-label", _p$.o = _v$6);
1055
+ _v$7 !== _p$.i && _$setAttribute(_el$27, "aria-label", _p$.i = _v$7);
1056
+ _v$8 !== _p$.n && _el$33.classList.toggle("k2b-chat-composer__textarea--highlighted", _p$.n = _v$8);
1057
+ _v$9 !== _p$.s && _$setProperty(_el$33, "disabled", _p$.s = _v$9);
1058
+ _v$0 !== _p$.h && _$setAttribute(_el$33, "placeholder", _p$.h = _v$0);
1059
+ _v$1 !== _p$.r && _$setAttribute(_el$33, "aria-label", _p$.r = _v$1);
1060
+ _v$10 !== _p$.d && _$setAttribute(_el$33, "role", _p$.d = _v$10);
1061
+ _v$11 !== _p$.l && _$setAttribute(_el$33, "aria-autocomplete", _p$.l = _v$11);
1062
+ _v$12 !== _p$.u && _$setAttribute(_el$33, "aria-controls", _p$.u = _v$12);
1063
+ _v$13 !== _p$.c && _$setAttribute(_el$33, "aria-expanded", _p$.c = _v$13);
1064
+ _v$14 !== _p$.w && _$setAttribute(_el$33, "aria-activedescendant", _p$.w = _v$14);
738
1065
  return _p$;
739
1066
  }, {
740
1067
  e: undefined,
@@ -749,12 +1076,13 @@ export function ChatComposer(props) {
749
1076
  d: undefined,
750
1077
  l: undefined,
751
1078
  u: undefined,
752
- c: undefined
1079
+ c: undefined,
1080
+ w: undefined
753
1081
  });
754
- _$effect(() => _$setProperty(_el$8, "value", props.value));
1082
+ _$effect(() => _$setProperty(_el$33, "value", props.value));
755
1083
  _$runHydrationEvents();
756
1084
  return _el$3;
757
1085
  })();
758
1086
  }
759
- _$delegateEvents(["input", "keydown", "click", "pointerdown"]);
1087
+ _$delegateEvents(["input", "click", "keyup", "beforeinput", "keydown", "pointerdown"]);
760
1088
  //# sourceMappingURL=ChatComposer.js.map