@k2b/ui 0.2.0 → 0.4.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 (378) 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 +2 -2
  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 +114 -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 +511 -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/Pagination.js.map +1 -1
  57. package/dist/browser/content/PdfPreview.js +107 -90
  58. package/dist/browser/content/PdfPreview.js.map +1 -1
  59. package/dist/browser/content/chart-cursor.js +33 -0
  60. package/dist/browser/content/chart-cursor.js.map +1 -0
  61. package/dist/browser/content/chart-explorer.js +147 -0
  62. package/dist/browser/content/chart-explorer.js.map +1 -0
  63. package/dist/browser/content/chart-inspection.js +447 -0
  64. package/dist/browser/content/chart-inspection.js.map +1 -0
  65. package/dist/browser/content/chart-line-gaps.js +53 -0
  66. package/dist/browser/content/chart-line-gaps.js.map +1 -0
  67. package/dist/browser/content/chart-map-viewport.js +5 -1
  68. package/dist/browser/content/chart-map-viewport.js.map +1 -1
  69. package/dist/browser/content/chart-snapshot.js +63 -0
  70. package/dist/browser/content/chart-snapshot.js.map +1 -0
  71. package/dist/browser/content/chart-state-timeline.js +32 -4
  72. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  73. package/dist/browser/content/chart-svg.js +54 -0
  74. package/dist/browser/content/chart-svg.js.map +1 -0
  75. package/dist/browser/content/collection-selection.js +109 -0
  76. package/dist/browser/content/collection-selection.js.map +1 -0
  77. package/dist/browser/content/delimited-preferences.js +21 -0
  78. package/dist/browser/content/delimited-preferences.js.map +1 -0
  79. package/dist/browser/content/file-tree.js.map +1 -1
  80. package/dist/browser/content/file-view-preview.js +11 -7
  81. package/dist/browser/content/file-view-preview.js.map +1 -1
  82. package/dist/browser/content/index.js +9 -0
  83. package/dist/browser/content/index.js.map +1 -1
  84. package/dist/browser/feedback/InlineGuidance.js +17 -3
  85. package/dist/browser/feedback/InlineGuidance.js.map +1 -1
  86. package/dist/browser/feedback/dialog-core.js +81 -7
  87. package/dist/browser/feedback/dialog-core.js.map +1 -1
  88. package/dist/browser/feedback/prompts.js +6 -0
  89. package/dist/browser/feedback/prompts.js.map +1 -1
  90. package/dist/browser/feedback/toast.js +29 -6
  91. package/dist/browser/feedback/toast.js.map +1 -1
  92. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  93. package/dist/browser/inputs/Select.js.map +1 -1
  94. package/dist/browser/inputs/SelectChip.js +3 -2
  95. package/dist/browser/inputs/SelectChip.js.map +1 -1
  96. package/dist/browser/inputs/TextInput.js +7 -1
  97. package/dist/browser/inputs/TextInput.js.map +1 -1
  98. package/dist/browser/inputs/markdown/MarkdownEditor.js +61 -37
  99. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  100. package/dist/browser/inputs/markdown/behaviors.js +1 -1
  101. package/dist/browser/inputs/markdown/behaviors.js.map +1 -1
  102. package/dist/browser/intl/Format.js +89 -16
  103. package/dist/browser/intl/Format.js.map +1 -1
  104. package/dist/browser/intl/index.js.map +1 -1
  105. package/dist/browser/intl/messages.js +130 -2
  106. package/dist/browser/intl/messages.js.map +1 -1
  107. package/dist/browser/layout/AppWorkspace.js +712 -624
  108. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  109. package/dist/browser/layout/BottomSheet.js +95 -0
  110. package/dist/browser/layout/BottomSheet.js.map +1 -0
  111. package/dist/browser/layout/DetailPanel.js +56 -44
  112. package/dist/browser/layout/DetailPanel.js.map +1 -1
  113. package/dist/browser/layout/Navigation.js +278 -0
  114. package/dist/browser/layout/Navigation.js.map +1 -0
  115. package/dist/browser/layout/PanelDialog.js +219 -71
  116. package/dist/browser/layout/PanelDialog.js.map +1 -1
  117. package/dist/browser/layout/ScrollArea.js +21 -1
  118. package/dist/browser/layout/ScrollArea.js.map +1 -1
  119. package/dist/browser/layout/Settings.js.map +1 -1
  120. package/dist/browser/layout/SidebarItemPreview.js +183 -0
  121. package/dist/browser/layout/SidebarItemPreview.js.map +1 -0
  122. package/dist/browser/layout/app-workspace-controller.js +3 -0
  123. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  124. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  125. package/dist/browser/layout/index.js +3 -0
  126. package/dist/browser/layout/index.js.map +1 -1
  127. package/dist/browser/layout/navigation-model.js +23 -0
  128. package/dist/browser/layout/navigation-model.js.map +1 -0
  129. package/dist/browser/layout/scroll-fade.js +100 -0
  130. package/dist/browser/layout/scroll-fade.js.map +1 -0
  131. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  132. package/dist/browser/surfaces/StatusBadge.js +2 -1
  133. package/dist/browser/surfaces/StatusBadge.js.map +1 -1
  134. package/dist/fonts/ibm-plex-mono-cyrillic-400-italic-4aded3f2f2a7d27d.woff2 +0 -0
  135. package/dist/fonts/ibm-plex-mono-cyrillic-400-normal-7635422bd10ddbbc.woff2 +0 -0
  136. package/dist/fonts/ibm-plex-mono-cyrillic-500-normal-1d89462e86cb8e87.woff2 +0 -0
  137. package/dist/fonts/ibm-plex-mono-cyrillic-600-normal-2b05a8695c7f9f4a.woff2 +0 -0
  138. package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-italic-a0b3b8cbe5a516e7.woff2 +0 -0
  139. package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-normal-f8c22ec1804bd696.woff2 +0 -0
  140. package/dist/fonts/ibm-plex-mono-cyrillic-ext-500-normal-3febe5c7f22e4b07.woff2 +0 -0
  141. package/dist/fonts/ibm-plex-mono-cyrillic-ext-600-normal-83109cdd4f8665b4.woff2 +0 -0
  142. package/dist/fonts/ibm-plex-mono-latin-400-italic-0840095faae86403.woff2 +0 -0
  143. package/dist/fonts/ibm-plex-mono-latin-400-normal-08949f728dc52d52.woff2 +0 -0
  144. package/dist/fonts/ibm-plex-mono-latin-500-normal-01d285447409c8a5.woff2 +0 -0
  145. package/dist/fonts/ibm-plex-mono-latin-600-normal-0d1f0b8d0722224e.woff2 +0 -0
  146. package/dist/fonts/ibm-plex-mono-latin-ext-400-italic-1b07eee6df7d26b3.woff2 +0 -0
  147. package/dist/fonts/ibm-plex-mono-latin-ext-400-normal-6bc0f226a5b7884a.woff2 +0 -0
  148. package/dist/fonts/ibm-plex-mono-latin-ext-500-normal-6bb06407c97584b0.woff2 +0 -0
  149. package/dist/fonts/ibm-plex-mono-latin-ext-600-normal-32057cf50dd14bdb.woff2 +0 -0
  150. package/dist/fonts/ibm-plex-mono-vietnamese-400-italic-a6bab38af4f9c761.woff2 +0 -0
  151. package/dist/fonts/ibm-plex-mono-vietnamese-400-normal-62632b6375305e70.woff2 +0 -0
  152. package/dist/fonts/ibm-plex-mono-vietnamese-500-normal-781633d95de88040.woff2 +0 -0
  153. package/dist/fonts/ibm-plex-mono-vietnamese-600-normal-51b74d53e106ba8a.woff2 +0 -0
  154. package/dist/fonts/ibm-plex-sans-cyrillic-400-italic-e8731a7e2b00fc4f.woff2 +0 -0
  155. package/dist/fonts/ibm-plex-sans-cyrillic-400-normal-69afad88a0740b6e.woff2 +0 -0
  156. package/dist/fonts/ibm-plex-sans-cyrillic-500-normal-200be3a2a6b1789f.woff2 +0 -0
  157. package/dist/fonts/ibm-plex-sans-cyrillic-600-normal-730becc6f005c18c.woff2 +0 -0
  158. package/dist/fonts/ibm-plex-sans-cyrillic-700-normal-40540598b4c9eb2c.woff2 +0 -0
  159. package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-italic-4ffb25726a7ce4cc.woff2 +0 -0
  160. package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-normal-e2580ad78906551e.woff2 +0 -0
  161. package/dist/fonts/ibm-plex-sans-cyrillic-ext-500-normal-08578d906af6d986.woff2 +0 -0
  162. package/dist/fonts/ibm-plex-sans-cyrillic-ext-600-normal-d60d3d0b182753d5.woff2 +0 -0
  163. package/dist/fonts/ibm-plex-sans-cyrillic-ext-700-normal-d07dd53642480097.woff2 +0 -0
  164. package/dist/fonts/ibm-plex-sans-greek-400-italic-1bc10b01688ba9fa.woff2 +0 -0
  165. package/dist/fonts/ibm-plex-sans-greek-400-normal-02296067bc904d2a.woff2 +0 -0
  166. package/dist/fonts/ibm-plex-sans-greek-500-normal-8cb6e20b4dbbaa5f.woff2 +0 -0
  167. package/dist/fonts/ibm-plex-sans-greek-600-normal-0a9ebd9019415ee9.woff2 +0 -0
  168. package/dist/fonts/ibm-plex-sans-greek-700-normal-c949641d10a3bebc.woff2 +0 -0
  169. package/dist/fonts/ibm-plex-sans-latin-400-italic-6de912e531b6c980.woff2 +0 -0
  170. package/dist/fonts/ibm-plex-sans-latin-400-normal-3b646991d30055a9.woff2 +0 -0
  171. package/dist/fonts/ibm-plex-sans-latin-500-normal-0717336fb31fcdcd.woff2 +0 -0
  172. package/dist/fonts/ibm-plex-sans-latin-600-normal-8960851d691c054e.woff2 +0 -0
  173. package/dist/fonts/ibm-plex-sans-latin-700-normal-42e7b0c143c19df9.woff2 +0 -0
  174. package/dist/fonts/ibm-plex-sans-latin-ext-400-italic-c5c00e8a32022dfe.woff2 +0 -0
  175. package/dist/fonts/ibm-plex-sans-latin-ext-400-normal-c93d2a12aaa280f6.woff2 +0 -0
  176. package/dist/fonts/ibm-plex-sans-latin-ext-500-normal-2846035d85100f84.woff2 +0 -0
  177. package/dist/fonts/ibm-plex-sans-latin-ext-600-normal-b25dfd4f979e442a.woff2 +0 -0
  178. package/dist/fonts/ibm-plex-sans-latin-ext-700-normal-92f0392bd74fa395.woff2 +0 -0
  179. package/dist/fonts/ibm-plex-sans-vietnamese-400-italic-675d4bace127bffb.woff2 +0 -0
  180. package/dist/fonts/ibm-plex-sans-vietnamese-400-normal-771538f7f26551bd.woff2 +0 -0
  181. package/dist/fonts/ibm-plex-sans-vietnamese-500-normal-85ba3d9c2488a813.woff2 +0 -0
  182. package/dist/fonts/ibm-plex-sans-vietnamese-600-normal-5d34b803637befe3.woff2 +0 -0
  183. package/dist/fonts/ibm-plex-sans-vietnamese-700-normal-b79d0c4b68b85007.woff2 +0 -0
  184. package/dist/plex.css +1 -1
  185. package/dist/ssr/actions/Button.js +11 -2
  186. package/dist/ssr/actions/Button.js.map +1 -1
  187. package/dist/ssr/actions/Disclosure.js +2 -2
  188. package/dist/ssr/actions/Disclosure.js.map +1 -1
  189. package/dist/ssr/actions/Dropdown.js +4 -1
  190. package/dist/ssr/actions/Dropdown.js.map +1 -1
  191. package/dist/ssr/actions/FilterChip.js +16 -2
  192. package/dist/ssr/actions/FilterChip.js.map +1 -1
  193. package/dist/ssr/actions/SplitButton.js +69 -22
  194. package/dist/ssr/actions/SplitButton.js.map +1 -1
  195. package/dist/ssr/actions/SpotlightSearch.js +3 -7
  196. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  197. package/dist/ssr/actions/Tabs.js +58 -11
  198. package/dist/ssr/actions/Tabs.js.map +1 -1
  199. package/dist/ssr/actions/index.js +2 -2
  200. package/dist/ssr/actions/index.js.map +1 -1
  201. package/dist/ssr/chat/ChatComposer.js +366 -134
  202. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  203. package/dist/ssr/chat/ChatContextPopup.js +86 -0
  204. package/dist/ssr/chat/ChatContextPopup.js.map +1 -0
  205. package/dist/ssr/chat/ChatPrimitives.js +49 -11
  206. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  207. package/dist/ssr/chat/ChatTasks.js +48 -0
  208. package/dist/ssr/chat/ChatTasks.js.map +1 -0
  209. package/dist/ssr/chat/ChatTimeline.js +14 -4
  210. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  211. package/dist/ssr/chat/chat-behavior.js +0 -5
  212. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  213. package/dist/ssr/chat/composer-document.js +55 -0
  214. package/dist/ssr/chat/composer-document.js.map +1 -0
  215. package/dist/ssr/chat/index.js +6 -1
  216. package/dist/ssr/chat/index.js.map +1 -1
  217. package/dist/ssr/chat/types.js.map +1 -1
  218. package/dist/ssr/content/Chart.js +121 -219
  219. package/dist/ssr/content/Chart.js.map +1 -1
  220. package/dist/ssr/content/ChartExplorer.js +257 -0
  221. package/dist/ssr/content/ChartExplorer.js.map +1 -0
  222. package/dist/ssr/content/ChartExplorerControls.js +105 -0
  223. package/dist/ssr/content/ChartExplorerControls.js.map +1 -0
  224. package/dist/ssr/content/ChartFilterControls.js +139 -0
  225. package/dist/ssr/content/ChartFilterControls.js.map +1 -0
  226. package/dist/ssr/content/ChartSnapshotView.js +58 -0
  227. package/dist/ssr/content/ChartSnapshotView.js.map +1 -0
  228. package/dist/ssr/content/DataTable.js +13 -9
  229. package/dist/ssr/content/DataTable.js.map +1 -1
  230. package/dist/ssr/content/FileBrowser.js +3 -0
  231. package/dist/ssr/content/FileBrowser.js.map +1 -1
  232. package/dist/ssr/content/FileGrid.js +38 -0
  233. package/dist/ssr/content/FileGrid.js.map +1 -0
  234. package/dist/ssr/content/FileTree.js +2 -2
  235. package/dist/ssr/content/FileTree.js.map +1 -1
  236. package/dist/ssr/content/FileView.js +356 -75
  237. package/dist/ssr/content/FileView.js.map +1 -1
  238. package/dist/ssr/content/MarkdownView.js +6 -0
  239. package/dist/ssr/content/MarkdownView.js.map +1 -1
  240. package/dist/ssr/content/Pagination.js.map +1 -1
  241. package/dist/ssr/content/PdfPreview.js +37 -24
  242. package/dist/ssr/content/PdfPreview.js.map +1 -1
  243. package/dist/ssr/content/chart-cursor.js +33 -0
  244. package/dist/ssr/content/chart-cursor.js.map +1 -0
  245. package/dist/ssr/content/chart-explorer.js +147 -0
  246. package/dist/ssr/content/chart-explorer.js.map +1 -0
  247. package/dist/ssr/content/chart-inspection.js +447 -0
  248. package/dist/ssr/content/chart-inspection.js.map +1 -0
  249. package/dist/ssr/content/chart-line-gaps.js +53 -0
  250. package/dist/ssr/content/chart-line-gaps.js.map +1 -0
  251. package/dist/ssr/content/chart-map-viewport.js +5 -1
  252. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  253. package/dist/ssr/content/chart-snapshot.js +63 -0
  254. package/dist/ssr/content/chart-snapshot.js.map +1 -0
  255. package/dist/ssr/content/chart-state-timeline.js +32 -4
  256. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  257. package/dist/ssr/content/chart-svg.js +54 -0
  258. package/dist/ssr/content/chart-svg.js.map +1 -0
  259. package/dist/ssr/content/collection-selection.js +109 -0
  260. package/dist/ssr/content/collection-selection.js.map +1 -0
  261. package/dist/ssr/content/delimited-preferences.js +21 -0
  262. package/dist/ssr/content/delimited-preferences.js.map +1 -0
  263. package/dist/ssr/content/file-tree.js.map +1 -1
  264. package/dist/ssr/content/file-view-preview.js +11 -7
  265. package/dist/ssr/content/file-view-preview.js.map +1 -1
  266. package/dist/ssr/content/index.js +9 -0
  267. package/dist/ssr/content/index.js.map +1 -1
  268. package/dist/ssr/feedback/InlineGuidance.js +17 -3
  269. package/dist/ssr/feedback/InlineGuidance.js.map +1 -1
  270. package/dist/ssr/feedback/dialog-core.js +81 -7
  271. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  272. package/dist/ssr/feedback/prompts.js +6 -0
  273. package/dist/ssr/feedback/prompts.js.map +1 -1
  274. package/dist/ssr/feedback/toast.js +29 -6
  275. package/dist/ssr/feedback/toast.js.map +1 -1
  276. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  277. package/dist/ssr/inputs/Select.js.map +1 -1
  278. package/dist/ssr/inputs/SelectChip.js +3 -3
  279. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  280. package/dist/ssr/inputs/TextInput.js.map +1 -1
  281. package/dist/ssr/inputs/markdown/MarkdownEditor.js +19 -11
  282. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  283. package/dist/ssr/inputs/markdown/behaviors.js +1 -1
  284. package/dist/ssr/inputs/markdown/behaviors.js.map +1 -1
  285. package/dist/ssr/intl/Format.js +61 -0
  286. package/dist/ssr/intl/Format.js.map +1 -1
  287. package/dist/ssr/intl/index.js.map +1 -1
  288. package/dist/ssr/intl/messages.js +130 -2
  289. package/dist/ssr/intl/messages.js.map +1 -1
  290. package/dist/ssr/layout/AppWorkspace.js +368 -275
  291. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  292. package/dist/ssr/layout/BottomSheet.js +43 -0
  293. package/dist/ssr/layout/BottomSheet.js.map +1 -0
  294. package/dist/ssr/layout/DetailPanel.js +11 -4
  295. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  296. package/dist/ssr/layout/Navigation.js +181 -0
  297. package/dist/ssr/layout/Navigation.js.map +1 -0
  298. package/dist/ssr/layout/PanelDialog.js +111 -26
  299. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  300. package/dist/ssr/layout/ScrollArea.js +16 -1
  301. package/dist/ssr/layout/ScrollArea.js.map +1 -1
  302. package/dist/ssr/layout/Settings.js.map +1 -1
  303. package/dist/ssr/layout/SidebarItemPreview.js +133 -0
  304. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -0
  305. package/dist/ssr/layout/app-workspace-controller.js +3 -0
  306. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  307. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  308. package/dist/ssr/layout/index.js +3 -0
  309. package/dist/ssr/layout/index.js.map +1 -1
  310. package/dist/ssr/layout/navigation-model.js +23 -0
  311. package/dist/ssr/layout/navigation-model.js.map +1 -0
  312. package/dist/ssr/layout/scroll-fade.js +100 -0
  313. package/dist/ssr/layout/scroll-fade.js.map +1 -0
  314. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  315. package/dist/ssr/surfaces/StatusBadge.js +2 -1
  316. package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
  317. package/dist/styles.css +1 -1
  318. package/dist/tabler.css +1 -1
  319. package/dist/types/actions/Button.d.ts +4 -0
  320. package/dist/types/actions/Disclosure.d.ts +1 -0
  321. package/dist/types/actions/FilterChip.d.ts +4 -0
  322. package/dist/types/actions/SplitButton.d.ts +6 -0
  323. package/dist/types/actions/SpotlightSearch.d.ts +0 -4
  324. package/dist/types/actions/Tabs.d.ts +4 -0
  325. package/dist/types/actions/index.d.ts +4 -4
  326. package/dist/types/chat/ChatComposer.d.ts +20 -2
  327. package/dist/types/chat/ChatContextPopup.d.ts +6 -0
  328. package/dist/types/chat/ChatPrimitives.d.ts +4 -0
  329. package/dist/types/chat/ChatTasks.d.ts +15 -0
  330. package/dist/types/chat/ChatTimeline.d.ts +2 -0
  331. package/dist/types/chat/chat-behavior.d.ts +0 -3
  332. package/dist/types/chat/composer-document.d.ts +14 -0
  333. package/dist/types/chat/index.d.ts +8 -1
  334. package/dist/types/chat/types.d.ts +7 -0
  335. package/dist/types/content/Chart.d.ts +42 -23
  336. package/dist/types/content/ChartExplorer.d.ts +34 -0
  337. package/dist/types/content/ChartExplorerControls.d.ts +10 -0
  338. package/dist/types/content/ChartFilterControls.d.ts +21 -0
  339. package/dist/types/content/ChartSnapshotView.d.ts +11 -0
  340. package/dist/types/content/DataTable.d.ts +4 -0
  341. package/dist/types/content/FileBrowser.d.ts +1 -0
  342. package/dist/types/content/FileGrid.d.ts +21 -0
  343. package/dist/types/content/FileView.d.ts +20 -0
  344. package/dist/types/content/PdfPreview.d.ts +8 -1
  345. package/dist/types/content/chart-cursor.d.ts +15 -0
  346. package/dist/types/content/chart-explorer.d.ts +48 -0
  347. package/dist/types/content/chart-inspection.d.ts +40 -0
  348. package/dist/types/content/chart-line-gaps.d.ts +5 -0
  349. package/dist/types/content/chart-map-viewport.d.ts +1 -1
  350. package/dist/types/content/chart-snapshot.d.ts +26 -0
  351. package/dist/types/content/chart-svg.d.ts +21 -0
  352. package/dist/types/content/collection-selection.d.ts +24 -0
  353. package/dist/types/content/delimited-preferences.d.ts +11 -0
  354. package/dist/types/content/file-tree.d.ts +2 -0
  355. package/dist/types/content/file-view-preview.d.ts +4 -1
  356. package/dist/types/content/index.d.ts +16 -2
  357. package/dist/types/feedback/InlineGuidance.d.ts +1 -0
  358. package/dist/types/feedback/dialog-core.d.ts +11 -0
  359. package/dist/types/feedback/prompts.d.ts +2 -0
  360. package/dist/types/feedback/toast.d.ts +7 -1
  361. package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -1
  362. package/dist/types/intl/Format.d.ts +9 -0
  363. package/dist/types/intl/index.d.ts +1 -1
  364. package/dist/types/intl/messages.d.ts +31 -1
  365. package/dist/types/layout/AppWorkspace.d.ts +35 -18
  366. package/dist/types/layout/BottomSheet.d.ts +23 -0
  367. package/dist/types/layout/DetailPanel.d.ts +1 -0
  368. package/dist/types/layout/Navigation.d.ts +8 -0
  369. package/dist/types/layout/PanelDialog.d.ts +14 -1
  370. package/dist/types/layout/ScrollArea.d.ts +4 -0
  371. package/dist/types/layout/Settings.d.ts +1 -1
  372. package/dist/types/layout/SidebarItemPreview.d.ts +11 -0
  373. package/dist/types/layout/index.d.ts +4 -1
  374. package/dist/types/layout/navigation-model.d.ts +48 -0
  375. package/dist/types/layout/scroll-fade.d.ts +3 -0
  376. package/dist/types/surfaces/DescriptionList.d.ts +1 -1
  377. package/dist/types/surfaces/StatusBadge.d.ts +1 -1
  378. package/package.json +5 -7
@@ -1 +1 @@
1
- {"version":3,"names":["createSignal","For","onCleanup","Show","Dropdown","Tooltip","useUiMessages","ProgressBar","executeChatAction","roleLabel","role","messages","assistant","user","tool","system","statusLabel","status","waiting","generating","failed","statusIcon","ChatProgressDots","_$ssr","_tmpl$","attachmentIcon","attachment","icon","kind","finiteNonNegative","value","Number","isFinite","Math","max","finiteUsageValue","normalizedUsage","usage","input","output","explicitTotal","total","reported","formatStableInteger","digits","String","round","replace","formatChatTokens","tokens","toFixed","dateTime","date","Date","getTime","toISOString","ChatMessage","props","busyActionId","setBusyActionId","completedActionId","setCompletedActionId","completedTimer","timestamp","createdAt","time","timeLabel","actions","actionDisplay","hasMeta","Boolean","length","runAction","action","disabled","id","clearTimeout","setTimeout","error","onActionError","actionIcon","menuItems","map","label","variant","_tmpl$8","_$escape","class","_$ssrAttribute","anchorId","undefined","_$createComponent","when","attachments","children","_tmpl$2","each","content","previewUrl","fallback","_tmpl$1","_tmpl$9","alt","name","_tmpl$0","href","_tmpl$10","_tmpl$11","openInNewTab","_tmpl$3","_tmpl$7","_tmpl$12","_tmpl$4","_tmpl$13","_tmpl$5","messageActions","_tmpl$14","pressed","pressedTone","Root","position","width","items","Trigger","appearance","title","_tmpl$6","ActivityContent","_tmpl$15","leading","_tmpl$19","_tmpl$16","description","_tmpl$20","trailing","_tmpl$17","disclosure","_tmpl$18","ChatActivity","tone","style","accent","_tmpl$22","busy","_$ssrStyle","_tmpl$21","bodyInset","open","defaultOpen","_$mergeProps","ChatContextUsage","formatNumber","formattedUsageValue","unknown","loopUsage","windowSize","contextWindow","percent","min","remaining","accessibleLabel","contextUsageUnavailableWithWindow","window","contextUsageUnavailable","tokensUsed","tokensUsedPercent","placement","_tmpl$25","lastRequestContext","size","contextWindowUsed","modelLabel","model","_tmpl$24","loopTotal","notConfigured","type","data-warning","aria-label","_tmpl$23"],"sources":["chat/ChatPrimitives.tsx"],"sourcesContent":["import { createSignal, For, type JSX, onCleanup, Show } from \"solid-js\";\nimport { Dropdown, type DropdownItem } from \"../actions/Dropdown\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { type UiMessages, useUiMessages } from \"../intl/messages\";\nimport { ProgressBar } from \"../surfaces/ProgressBar\";\nimport { executeChatAction } from \"./chat-behavior\";\nimport type { ChatAction, ChatActivityTone, ChatAttachment, ChatContextUsageData, ChatMessageStatus, ChatRole } from \"./types\";\n\nexport type ChatMessageProps = {\n role: ChatRole;\n children?: JSX.Element;\n label?: string;\n createdAt?: string | Date;\n timeLabel?: string;\n status?: ChatMessageStatus;\n attachments?: readonly ChatAttachment[];\n actions?: readonly ChatAction[];\n actionDisplay?: \"auto\" | \"inline\" | \"menu\";\n anchorId?: string | number;\n onActionError?: (error: unknown) => void;\n class?: string;\n};\n\nexport type ChatActivityProps = {\n label: string;\n description?: string;\n icon?: string;\n /** Optional host-owned leading visual rendered instead of the icon. */\n leading?: JSX.Element;\n /** Optional identity accent for the leading visual. Semantic tones still take precedence. */\n accent?: string;\n tone?: ChatActivityTone;\n /** Marks the activity as running with the shared accent sweep. */\n busy?: boolean;\n trailing?: JSX.Element;\n /** Controlled disclosure state. Omit to keep native details behavior. */\n open?: boolean;\n /** Reports disclosure changes when `open` is controlled by the host. */\n onOpenChange?: (open: boolean) => void;\n defaultOpen?: boolean;\n /** Set to false when the body is a peer list that should align with the activity row. */\n bodyInset?: boolean;\n anchorId?: string | number;\n children?: JSX.Element;\n class?: string;\n};\n\nexport type ChatContextUsageProps = ChatContextUsageData & {\n /** Host-owned number formatting. The default is locale-independent and SSR-stable. */\n formatNumber?: (value: number) => string;\n class?: string;\n};\n\nconst roleLabel = (role: ChatRole, messages: UiMessages): string => {\n if (role === \"assistant\") return messages.assistant;\n if (role === \"user\") return messages.user;\n if (role === \"tool\") return messages.tool;\n return messages.system;\n};\n\nconst statusLabel = (status: ChatMessageStatus | undefined, messages: UiMessages): string | null => {\n if (status === \"pending\") return messages.waiting;\n if (status === \"streaming\") return messages.generating;\n if (status === \"error\") return messages.failed;\n return null;\n};\n\nconst statusIcon = (status: ChatMessageStatus | undefined): string => {\n if (status === \"pending\") return \"ti ti-clock\";\n return \"ti ti-alert-circle\";\n};\n\nconst ChatProgressDots = () => (\n <span class=\"k2b-chat-progress-dots\" aria-hidden=\"true\">\n <span />\n <span />\n <span />\n </span>\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 finiteNonNegative = (value: number | undefined): number =>\n typeof value === \"number\" && Number.isFinite(value) ? Math.max(0, value) : 0;\n\nconst finiteUsageValue = (value: number | undefined): number | null =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : null;\n\nconst normalizedUsage = (usage: ChatContextUsageData[\"usage\"]) => {\n const input = finiteUsageValue(usage?.input);\n const output = finiteUsageValue(usage?.output);\n const explicitTotal = finiteUsageValue(usage?.total);\n const total = explicitTotal ?? (input !== null || output !== null ? (input ?? 0) + (output ?? 0) : null);\n return { input, output, total, reported: total !== null };\n};\n\nconst formatStableInteger = (value: number): string => {\n const digits = String(Math.round(finiteNonNegative(value)));\n return digits.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n};\n\nexport const formatChatTokens = (tokens: number): string => {\n const value = finiteNonNegative(tokens);\n if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (value >= 1_000) return `${(value / 1_000).toFixed(1)}k`;\n return String(Math.round(value));\n};\n\nconst dateTime = (value: string | Date | undefined): string | null => {\n if (!value) return null;\n const date = value instanceof Date ? value : new Date(value);\n return Number.isFinite(date.getTime()) ? date.toISOString() : null;\n};\n\nexport function ChatMessage(props: ChatMessageProps): JSX.Element {\n const messages = useUiMessages();\n const [busyActionId, setBusyActionId] = createSignal<string | null>(null);\n const [completedActionId, setCompletedActionId] = createSignal<string | null>(null);\n let completedTimer: ReturnType<typeof setTimeout> | undefined;\n const status = () => statusLabel(props.status, messages());\n const timestamp = () => dateTime(props.createdAt);\n // Locale and timezone are application policy. Requiring an explicit visible\n // label keeps SSR and hydration byte-stable while `createdAt` still supplies\n // the semantic machine-readable timestamp.\n const time = () => props.timeLabel ?? null;\n const actions = () => props.actions ?? [];\n const actionDisplay = () =>\n props.actionDisplay === \"auto\" || !props.actionDisplay ? (props.role === \"user\" ? \"menu\" : \"inline\") : props.actionDisplay;\n const hasMeta = () => props.status === \"streaming\" || status() !== null || Boolean(time()) || actions().length > 0;\n\n const runAction = async (action: ChatAction) => {\n if (action.disabled || busyActionId()) return;\n setBusyActionId(action.id);\n try {\n await executeChatAction(action);\n setCompletedActionId(action.id);\n if (completedTimer) clearTimeout(completedTimer);\n completedTimer = setTimeout(() => setCompletedActionId(null), 1400);\n } catch (error) {\n props.onActionError?.(error);\n } finally {\n setBusyActionId(null);\n }\n };\n\n const actionIcon = (action: ChatAction) =>\n busyActionId() === action.id\n ? \"ti ti-loader-2 k2b-spin\"\n : completedActionId() === action.id\n ? \"ti ti-check\"\n : (action.icon ?? \"ti ti-dots\");\n\n onCleanup(() => {\n if (completedTimer) clearTimeout(completedTimer);\n });\n\n const menuItems = (): readonly DropdownItem[] =>\n actions().map((action) => ({\n icon: actionIcon(action),\n label: action.label,\n variant: action.variant,\n disabled: action.disabled || Boolean(busyActionId()),\n action: () => void runAction(action),\n }));\n\n return (\n <article\n class={`k2b-chat-message ${props.class ?? \"\"}`}\n data-role={props.role}\n data-status={props.status ?? \"complete\"}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n aria-busy={props.status === \"pending\" || props.status === \"streaming\" ? \"true\" : undefined}\n >\n <span class=\"k2b-sr-only\">{props.label ?? roleLabel(props.role, messages())}: </span>\n <Show when={(props.attachments?.length ?? 0) > 0}>\n <div class=\"k2b-chat-message__attachments\" role=\"list\" aria-label={messages().attachments}>\n <For each={props.attachments}>\n {(attachment) => {\n const content = () => (\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 ?? attachment.name} />\n </Show>\n <Show when={attachment.kind !== \"image\"}>\n <span>{attachment.name}</span>\n </Show>\n </>\n );\n return (\n <Show\n when={attachment.href}\n fallback={\n <div class=\"k2b-chat-message__attachment\" role=\"listitem\" title={attachment.name}>\n {content()}\n </div>\n }\n >\n {(href) => (\n <a\n class=\"k2b-chat-message__attachment\"\n role=\"listitem\"\n title={attachment.name}\n href={href()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={messages().openInNewTab({ name: attachment.name })}\n >\n {content()}\n </a>\n )}\n </Show>\n );\n }}\n </For>\n </div>\n </Show>\n\n <Show when={props.children !== undefined && props.children !== null && props.children !== \"\"}>\n <div class=\"k2b-chat-message__bubble\">\n <div class=\"k2b-chat-message__content\">{props.children}</div>\n </div>\n </Show>\n\n <Show when={hasMeta()}>\n <footer class=\"k2b-chat-message__meta\">\n <Show\n when={props.status === \"streaming\"}\n fallback={\n <Show when={status()}>\n {(label) => (\n <span class=\"k2b-chat-message__status\" role={props.status === \"error\" ? \"alert\" : \"status\"}>\n <i class={statusIcon(props.status)} aria-hidden=\"true\" />\n {label()}\n </span>\n )}\n </Show>\n }\n >\n <span class=\"k2b-chat-message__status k2b-chat-message__status--streaming\" role=\"status\" aria-label={messages().generating}>\n <ChatProgressDots />\n </span>\n </Show>\n <Show when={time()}>{(label) => <time dateTime={timestamp() ?? undefined}>{label()}</time>}</Show>\n <Show when={actions().length > 0 && actionDisplay() === \"inline\"}>\n <span class=\"k2b-chat-message__actions\" role=\"group\" aria-label={messages().messageActions}>\n <For each={actions()}>\n {(action) => (\n <button\n type=\"button\"\n aria-label={action.label}\n aria-pressed={action.pressed}\n data-pressed-tone={action.pressedTone}\n title={action.label}\n data-danger={action.variant === \"danger\" ? \"true\" : undefined}\n disabled={action.disabled || Boolean(busyActionId())}\n onClick={() => void runAction(action)}\n >\n <i class={actionIcon(action)} aria-hidden=\"true\" />\n </button>\n )}\n </For>\n </span>\n </Show>\n <Show when={actions().length > 0 && actionDisplay() === \"menu\"}>\n <Dropdown.Root position=\"bottom-left\" width=\"12rem\" label={messages().messageActions} items={menuItems()}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-chat-message__menu\"\n label={messages().messageActions}\n title={messages().messageActions}\n >\n <i class=\"ti ti-dots\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </footer>\n </Show>\n </article>\n );\n}\n\nconst ActivityContent = (props: ChatActivityProps & { disclosure?: boolean }) => (\n <>\n <span class=\"k2b-chat-activity__leading\" aria-hidden=\"true\">\n <Show when={props.leading} fallback={<i class={props.icon ?? \"ti ti-sparkles\"} />}>\n {props.leading}\n </Show>\n </span>\n <span class=\"k2b-chat-activity__copy\">\n <strong>{props.label}</strong>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n <Show when={props.trailing}>\n <span class=\"k2b-chat-activity__trailing\">{props.trailing}</span>\n </Show>\n <Show when={props.disclosure}>\n <i class=\"ti ti-chevron-right k2b-chat-activity__chevron\" aria-hidden=\"true\" />\n </Show>\n </>\n);\n\nexport function ChatActivity(props: ChatActivityProps): JSX.Element {\n const tone = () => props.tone ?? \"neutral\";\n const style = () => (props.accent ? { \"--k2b-chat-activity-accent\": props.accent } : undefined);\n return (\n <Show\n when={props.children}\n fallback={\n <div\n class={`k2b-chat-activity ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-accent={props.accent ? \"true\" : undefined}\n data-busy={props.busy ? \"true\" : undefined}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n style={style()}\n aria-busy={props.busy ? \"true\" : undefined}\n >\n <div class=\"k2b-chat-activity__row\">\n <ActivityContent {...props} />\n </div>\n </div>\n }\n >\n <details\n class={`k2b-chat-activity ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-accent={props.accent ? \"true\" : undefined}\n data-busy={props.busy ? \"true\" : undefined}\n data-body-inset={props.bodyInset === false ? \"false\" : undefined}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n style={style()}\n open={props.open ?? props.defaultOpen}\n onToggle={(event) => props.onOpenChange?.(event.currentTarget.open)}\n aria-busy={props.busy ? \"true\" : undefined}\n >\n <summary class=\"k2b-chat-activity__row\">\n <ActivityContent {...props} disclosure />\n </summary>\n <div class=\"k2b-chat-activity__body\">{props.children}</div>\n </details>\n </Show>\n );\n}\n\nexport function ChatContextUsage(props: ChatContextUsageProps): JSX.Element {\n const messages = useUiMessages();\n const formatNumber = (value: number) => (props.formatNumber ?? formatStableInteger)(value);\n const formattedUsageValue = (value: number | null): string => (value === null ? messages().unknown : formatNumber(value));\n const usage = () => normalizedUsage(props.usage);\n const loopUsage = () => normalizedUsage(props.loopUsage);\n const total = () => usage().total ?? 0;\n const windowSize = () => finiteNonNegative(props.contextWindow);\n const reported = () => usage().reported;\n const percent = () => (reported() && windowSize() > 0 ? Math.min(100, Math.round((total() / windowSize()) * 100)) : null);\n const remaining = () => (reported() && windowSize() > 0 ? Math.max(0, windowSize() - total()) : null);\n const accessibleLabel = () => {\n if (!reported()) {\n return windowSize() > 0\n ? messages().contextUsageUnavailableWithWindow({ window: formatNumber(windowSize()) })\n : messages().contextUsageUnavailable;\n }\n return percent() === null\n ? messages().tokensUsed({ total: formatNumber(total()) })\n : messages().tokensUsedPercent({ total: formatNumber(total()), percent: percent()! });\n };\n\n return (\n <Tooltip.Trigger\n placement=\"top\"\n content={\n <div class=\"k2b-chat-context__tooltip\">\n <strong>{messages().lastRequestContext}</strong>\n <Show when={percent() !== null}>\n <ProgressBar\n value={percent() ?? 0}\n size=\"xs\"\n tone={(percent() ?? 0) >= 85 ? \"danger\" : \"info\"}\n label={messages().contextWindowUsed}\n />\n </Show>\n <dl>\n <Show when={props.modelLabel}>\n {(model) => (\n <div>\n <dt>{messages().model}</dt>\n <dd>{model()}</dd>\n </div>\n )}\n </Show>\n <div>\n <dt>{messages().input}</dt>\n <dd>{formattedUsageValue(usage().input)}</dd>\n </div>\n <div>\n <dt>{messages().output}</dt>\n <dd>{formattedUsageValue(usage().output)}</dd>\n </div>\n <Show when={loopUsage().reported}>\n <div>\n <dt>{messages().loopTotal}</dt>\n <dd>{formattedUsageValue(loopUsage().total)}</dd>\n </div>\n </Show>\n <div>\n <dt>{messages().window}</dt>\n <dd>{windowSize() > 0 ? formatNumber(windowSize()) : messages().notConfigured}</dd>\n </div>\n <Show when={remaining() !== null}>\n <div>\n <dt>{messages().remaining}</dt>\n <dd>{remaining() === null ? messages().unknown : formatNumber(remaining()!)}</dd>\n </div>\n </Show>\n </dl>\n </div>\n }\n type=\"button\"\n class={`k2b-chat-context ${props.class ?? \"\"}`}\n data-warning={reported() && (percent() ?? 0) >= 85 ? \"true\" : undefined}\n aria-label={accessibleLabel()}\n >\n <i class=\"ti ti-brain\" aria-hidden=\"true\" />\n <span>{percent() === null ? \"–\" : `${percent()}%`}</span>\n </Tooltip.Trigger>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["createSignal","For","onCleanup","Show","Button","Dropdown","useUiMessages","ProgressBar","ChatContextPopup","executeChatAction","roleLabel","role","messages","assistant","user","tool","system","statusLabel","status","waiting","generating","failed","statusIcon","ChatProgressDots","_$ssr","_tmpl$","attachmentIcon","attachment","icon","kind","finiteNonNegative","value","Number","isFinite","Math","max","finiteUsageValue","normalizedUsage","usage","input","output","explicitTotal","total","reported","formatStableInteger","digits","String","round","replace","formatChatTokens","tokens","toFixed","dateTime","date","Date","getTime","toISOString","ChatMessage","props","busyActionId","setBusyActionId","completedActionId","setCompletedActionId","completedTimer","timestamp","createdAt","time","timeLabel","actions","actionDisplay","hasMeta","Boolean","length","runAction","action","disabled","id","clearTimeout","setTimeout","error","onActionError","actionIcon","menuItems","map","label","variant","_tmpl$8","_$escape","class","_$ssrAttribute","anchorId","undefined","_$createComponent","when","attachments","children","_tmpl$2","each","content","previewUrl","fallback","_tmpl$1","_tmpl$9","alt","name","_tmpl$0","href","_tmpl$10","_tmpl$11","openInNewTab","_tmpl$3","_tmpl$7","_tmpl$12","_tmpl$4","_tmpl$13","_tmpl$5","messageActions","_tmpl$14","pressed","pressedTone","Root","position","width","items","Trigger","appearance","title","_tmpl$6","ActivityContent","_tmpl$15","leading","_tmpl$19","_tmpl$16","description","_tmpl$20","trailing","_tmpl$17","disclosure","_tmpl$18","ChatActivity","expanded","setExpanded","defaultOpen","open","tone","style","accent","renderBody","_tmpl$22","busy","_$ssrStyle","_tmpl$21","bodyInset","_$mergeProps","render","ChatContextUsage","setBusy","run","formatNumber","formattedUsageValue","unknown","loopUsage","windowSize","contextWindow","percent","min","remaining","accessibleLabel","contextUsageUnavailableWithWindow","window","contextUsageUnavailable","tokensUsed","tokensUsedPercent","_tmpl$25","lastRequestContext","size","contextWindowUsed","modelLabel","model","_tmpl$24","loopTotal","notConfigured","onClick","aria-busy","type","data-warning","aria-label","_tmpl$23"],"sources":["chat/ChatPrimitives.tsx"],"sourcesContent":["import { createSignal, For, type JSX, onCleanup, Show } from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { Dropdown, type DropdownItem } from \"../actions/Dropdown\";\nimport { type UiMessages, useUiMessages } from \"../intl/messages\";\nimport { ProgressBar } from \"../surfaces/ProgressBar\";\nimport { ChatContextPopup } from \"./ChatContextPopup\";\nimport { executeChatAction } from \"./chat-behavior\";\nimport type { ChatAction, ChatActivityTone, ChatAttachment, ChatContextUsageData, ChatMessageStatus, ChatRole } from \"./types\";\n\nexport type ChatMessageProps = {\n role: ChatRole;\n children?: JSX.Element;\n label?: string;\n createdAt?: string | Date;\n timeLabel?: string;\n status?: ChatMessageStatus;\n attachments?: readonly ChatAttachment[];\n actions?: readonly ChatAction[];\n actionDisplay?: \"auto\" | \"inline\" | \"menu\";\n anchorId?: string | number;\n onActionError?: (error: unknown) => void;\n class?: string;\n};\n\nexport type ChatActivityProps = {\n label: string;\n description?: string;\n icon?: string;\n /** Optional host-owned leading visual rendered instead of the icon. */\n leading?: JSX.Element;\n /** Optional identity accent for the leading visual. Semantic tones still take precedence. */\n accent?: string;\n tone?: ChatActivityTone;\n /** Marks the activity as running with the shared accent sweep. */\n busy?: boolean;\n trailing?: JSX.Element;\n /** Controlled disclosure state. Omit to keep native details behavior. */\n open?: boolean;\n /** Reports disclosure changes when `open` is controlled by the host. */\n onOpenChange?: (open: boolean) => void;\n defaultOpen?: boolean;\n /** Set to false when the body is a peer list that should align with the activity row. */\n bodyInset?: boolean;\n anchorId?: string | number;\n children?: JSX.Element;\n /** Mount expensive details only while expanded. */\n renderBody?: () => JSX.Element;\n class?: string;\n};\n\nexport type ChatContextUsageProps = ChatContextUsageData & {\n action?: ChatAction;\n onActionError?: (error: unknown) => void;\n /** Host-owned number formatting. The default is locale-independent and SSR-stable. */\n formatNumber?: (value: number) => string;\n class?: string;\n};\n\nconst roleLabel = (role: ChatRole, messages: UiMessages): string => {\n if (role === \"assistant\") return messages.assistant;\n if (role === \"user\") return messages.user;\n if (role === \"tool\") return messages.tool;\n return messages.system;\n};\n\nconst statusLabel = (status: ChatMessageStatus | undefined, messages: UiMessages): string | null => {\n if (status === \"pending\") return messages.waiting;\n if (status === \"streaming\") return messages.generating;\n if (status === \"error\") return messages.failed;\n return null;\n};\n\nconst statusIcon = (status: ChatMessageStatus | undefined): string => {\n if (status === \"pending\") return \"ti ti-clock\";\n return \"ti ti-alert-circle\";\n};\n\nconst ChatProgressDots = () => (\n <span class=\"k2b-chat-progress-dots\" aria-hidden=\"true\">\n <span />\n <span />\n <span />\n </span>\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 finiteNonNegative = (value: number | undefined): number =>\n typeof value === \"number\" && Number.isFinite(value) ? Math.max(0, value) : 0;\n\nconst finiteUsageValue = (value: number | undefined): number | null =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : null;\n\nconst normalizedUsage = (usage: ChatContextUsageData[\"usage\"]) => {\n const input = finiteUsageValue(usage?.input);\n const output = finiteUsageValue(usage?.output);\n const explicitTotal = finiteUsageValue(usage?.total);\n const total = explicitTotal ?? (input !== null || output !== null ? (input ?? 0) + (output ?? 0) : null);\n return { input, output, total, reported: total !== null };\n};\n\nconst formatStableInteger = (value: number): string => {\n const digits = String(Math.round(finiteNonNegative(value)));\n return digits.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n};\n\nexport const formatChatTokens = (tokens: number): string => {\n const value = finiteNonNegative(tokens);\n if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (value >= 1_000) return `${(value / 1_000).toFixed(1)}k`;\n return String(Math.round(value));\n};\n\nconst dateTime = (value: string | Date | undefined): string | null => {\n if (!value) return null;\n const date = value instanceof Date ? value : new Date(value);\n return Number.isFinite(date.getTime()) ? date.toISOString() : null;\n};\n\nexport function ChatMessage(props: ChatMessageProps): JSX.Element {\n const messages = useUiMessages();\n const [busyActionId, setBusyActionId] = createSignal<string | null>(null);\n const [completedActionId, setCompletedActionId] = createSignal<string | null>(null);\n let completedTimer: ReturnType<typeof setTimeout> | undefined;\n const status = () => statusLabel(props.status, messages());\n const timestamp = () => dateTime(props.createdAt);\n // Locale and timezone are application policy. Requiring an explicit visible\n // label keeps SSR and hydration byte-stable while `createdAt` still supplies\n // the semantic machine-readable timestamp.\n const time = () => props.timeLabel ?? null;\n const actions = () => props.actions ?? [];\n const actionDisplay = () =>\n props.actionDisplay === \"auto\" || !props.actionDisplay ? (props.role === \"user\" ? \"menu\" : \"inline\") : props.actionDisplay;\n const hasMeta = () => props.status === \"streaming\" || status() !== null || Boolean(time()) || actions().length > 0;\n\n const runAction = async (action: ChatAction) => {\n if (action.disabled || busyActionId()) return;\n setBusyActionId(action.id);\n try {\n await executeChatAction(action);\n setCompletedActionId(action.id);\n if (completedTimer) clearTimeout(completedTimer);\n completedTimer = setTimeout(() => setCompletedActionId(null), 1400);\n } catch (error) {\n props.onActionError?.(error);\n } finally {\n setBusyActionId(null);\n }\n };\n\n const actionIcon = (action: ChatAction) =>\n busyActionId() === action.id\n ? \"ti ti-loader-2 k2b-spin\"\n : completedActionId() === action.id\n ? \"ti ti-check\"\n : (action.icon ?? \"ti ti-dots\");\n\n onCleanup(() => {\n if (completedTimer) clearTimeout(completedTimer);\n });\n\n const menuItems = (): readonly DropdownItem[] =>\n actions().map((action) => ({\n icon: actionIcon(action),\n label: action.label,\n variant: action.variant,\n disabled: action.disabled || Boolean(busyActionId()),\n action: () => void runAction(action),\n }));\n\n return (\n <article\n class={`k2b-chat-message ${props.class ?? \"\"}`}\n data-role={props.role}\n data-status={props.status ?? \"complete\"}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n aria-busy={props.status === \"pending\" || props.status === \"streaming\" ? \"true\" : undefined}\n >\n <span class=\"k2b-sr-only\">{props.label ?? roleLabel(props.role, messages())}: </span>\n <Show when={(props.attachments?.length ?? 0) > 0}>\n <div class=\"k2b-chat-message__attachments\" role=\"list\" aria-label={messages().attachments}>\n <For each={props.attachments}>\n {(attachment) => {\n const content = () => (\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 ?? attachment.name} />\n </Show>\n <Show when={attachment.kind !== \"image\"}>\n <span>{attachment.name}</span>\n </Show>\n </>\n );\n return (\n <Show\n when={attachment.href}\n fallback={\n <div class=\"k2b-chat-message__attachment\" data-kind={attachment.kind} role=\"listitem\" title={attachment.name}>\n {content()}\n </div>\n }\n >\n {(href) => (\n <a\n class=\"k2b-chat-message__attachment\"\n data-kind={attachment.kind}\n role=\"listitem\"\n title={attachment.name}\n href={href()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={messages().openInNewTab({ name: attachment.name })}\n >\n {content()}\n </a>\n )}\n </Show>\n );\n }}\n </For>\n </div>\n </Show>\n\n <Show when={props.children !== undefined && props.children !== null && props.children !== \"\"}>\n <div class=\"k2b-chat-message__bubble\">\n <div class=\"k2b-chat-message__content\">{props.children}</div>\n </div>\n </Show>\n\n <Show when={hasMeta()}>\n <footer class=\"k2b-chat-message__meta\">\n <Show\n when={props.status === \"streaming\"}\n fallback={\n <Show when={status()}>\n {(label) => (\n <span class=\"k2b-chat-message__status\" role={props.status === \"error\" ? \"alert\" : \"status\"}>\n <i class={statusIcon(props.status)} aria-hidden=\"true\" />\n {label()}\n </span>\n )}\n </Show>\n }\n >\n <span class=\"k2b-chat-message__status k2b-chat-message__status--streaming\" role=\"status\" aria-label={messages().generating}>\n <ChatProgressDots />\n </span>\n </Show>\n <Show when={time()}>{(label) => <time dateTime={timestamp() ?? undefined}>{label()}</time>}</Show>\n <Show when={actions().length > 0 && actionDisplay() === \"inline\"}>\n <span class=\"k2b-chat-message__actions\" role=\"group\" aria-label={messages().messageActions}>\n <For each={actions()}>\n {(action) => (\n <button\n type=\"button\"\n aria-label={action.label}\n aria-pressed={action.pressed}\n data-pressed-tone={action.pressedTone}\n title={action.label}\n data-danger={action.variant === \"danger\" ? \"true\" : undefined}\n disabled={action.disabled || Boolean(busyActionId())}\n onClick={() => void runAction(action)}\n >\n <i class={actionIcon(action)} aria-hidden=\"true\" />\n </button>\n )}\n </For>\n </span>\n </Show>\n <Show when={actions().length > 0 && actionDisplay() === \"menu\"}>\n <Dropdown.Root position=\"bottom-left\" width=\"12rem\" label={messages().messageActions} items={menuItems()}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-chat-message__menu\"\n label={messages().messageActions}\n title={messages().messageActions}\n >\n <i class=\"ti ti-dots\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </footer>\n </Show>\n </article>\n );\n}\n\nconst ActivityContent = (props: ChatActivityProps & { disclosure?: boolean }) => (\n <>\n <span class=\"k2b-chat-activity__leading\" aria-hidden=\"true\">\n <Show when={props.leading} fallback={<i class={props.icon ?? \"ti ti-sparkles\"} />}>\n {props.leading}\n </Show>\n </span>\n <span class=\"k2b-chat-activity__copy\">\n <strong>{props.label}</strong>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n <Show when={props.trailing}>\n <span class=\"k2b-chat-activity__trailing\">{props.trailing}</span>\n </Show>\n <Show when={props.disclosure}>\n <i class=\"ti ti-chevron-right k2b-chat-activity__chevron\" aria-hidden=\"true\" />\n </Show>\n </>\n);\n\nexport function ChatActivity(props: ChatActivityProps): JSX.Element {\n const [expanded, setExpanded] = createSignal(props.defaultOpen ?? false);\n const open = () => props.open ?? expanded();\n const tone = () => props.tone ?? \"neutral\";\n const style = () => (props.accent ? { \"--k2b-chat-activity-accent\": props.accent } : undefined);\n return (\n <Show\n when={props.renderBody || props.children}\n fallback={\n <div\n class={`k2b-chat-activity ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-accent={props.accent ? \"true\" : undefined}\n data-busy={props.busy ? \"true\" : undefined}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n style={style()}\n aria-busy={props.busy ? \"true\" : undefined}\n >\n <div class=\"k2b-chat-activity__row\">\n <ActivityContent {...props} />\n </div>\n </div>\n }\n >\n <details\n class={`k2b-chat-activity ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-accent={props.accent ? \"true\" : undefined}\n data-busy={props.busy ? \"true\" : undefined}\n data-body-inset={props.bodyInset === false ? \"false\" : undefined}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n style={style()}\n open={open()}\n onToggle={(event) => {\n setExpanded(event.currentTarget.open);\n props.onOpenChange?.(event.currentTarget.open);\n }}\n aria-busy={props.busy ? \"true\" : undefined}\n >\n <summary class=\"k2b-chat-activity__row\">\n <ActivityContent {...props} disclosure />\n </summary>\n <div class=\"k2b-chat-activity__body\">\n {props.renderBody ? <Show when={open() ? props.renderBody : undefined}>{(render) => render()()}</Show> : props.children}\n </div>\n </details>\n </Show>\n );\n}\n\nexport function ChatContextUsage(props: ChatContextUsageProps): JSX.Element {\n const [busy, setBusy] = createSignal(false);\n const run = async () => {\n const action = props.action;\n if (!action || action.disabled || busy()) return;\n setBusy(true);\n try {\n await executeChatAction(action);\n } catch (error) {\n props.onActionError?.(error);\n } finally {\n setBusy(false);\n }\n };\n const messages = useUiMessages();\n const formatNumber = (value: number) => (props.formatNumber ?? formatStableInteger)(value);\n const formattedUsageValue = (value: number | null): string => (value === null ? messages().unknown : formatNumber(value));\n const usage = () => normalizedUsage(props.usage);\n const loopUsage = () => normalizedUsage(props.loopUsage);\n const total = () => usage().total ?? 0;\n const windowSize = () => finiteNonNegative(props.contextWindow);\n const reported = () => usage().reported;\n const percent = () => (reported() && windowSize() > 0 ? Math.min(100, Math.round((total() / windowSize()) * 100)) : null);\n const remaining = () => (reported() && windowSize() > 0 ? Math.max(0, windowSize() - total()) : null);\n const accessibleLabel = () => {\n if (!reported()) {\n return windowSize() > 0\n ? messages().contextUsageUnavailableWithWindow({ window: formatNumber(windowSize()) })\n : messages().contextUsageUnavailable;\n }\n return percent() === null\n ? messages().tokensUsed({ total: formatNumber(total()) })\n : messages().tokensUsedPercent({ total: formatNumber(total()), percent: percent()! });\n };\n\n return (\n <ChatContextPopup\n content={\n <div class=\"k2b-chat-context__tooltip\">\n <strong>{messages().lastRequestContext}</strong>\n <Show when={percent() !== null}>\n <ProgressBar\n value={percent() ?? 0}\n size=\"xs\"\n tone={(percent() ?? 0) >= 85 ? \"danger\" : \"info\"}\n label={messages().contextWindowUsed}\n />\n </Show>\n <dl>\n <Show when={props.modelLabel}>\n {(model) => (\n <div>\n <dt>{messages().model}</dt>\n <dd>{model()}</dd>\n </div>\n )}\n </Show>\n <div>\n <dt>{messages().input}</dt>\n <dd>{formattedUsageValue(usage().input)}</dd>\n </div>\n <div>\n <dt>{messages().output}</dt>\n <dd>{formattedUsageValue(usage().output)}</dd>\n </div>\n <Show when={loopUsage().reported}>\n <div>\n <dt>{messages().loopTotal}</dt>\n <dd>{formattedUsageValue(loopUsage().total)}</dd>\n </div>\n </Show>\n <div>\n <dt>{messages().window}</dt>\n <dd>{windowSize() > 0 ? formatNumber(windowSize()) : messages().notConfigured}</dd>\n </div>\n <Show when={remaining() !== null}>\n <div>\n <dt>{messages().remaining}</dt>\n <dd>{remaining() === null ? messages().unknown : formatNumber(remaining()!)}</dd>\n </div>\n </Show>\n </dl>\n <Show when={props.action}>\n {(action) => (\n <Button size=\"xs\" variant=\"subtle\" disabled={action().disabled || busy()} onClick={() => void run()} aria-busy={busy()}>\n <i class={busy() ? \"ti ti-loader-2 k2b-spin\" : action().icon} aria-hidden=\"true\" />\n {action().label}\n </Button>\n )}\n </Show>\n </div>\n }\n type=\"button\"\n class={`k2b-chat-context ${props.class ?? \"\"}`}\n data-warning={reported() && (percent() ?? 0) >= 85 ? \"true\" : undefined}\n aria-label={accessibleLabel()}\n >\n <i class=\"ti ti-brain\" aria-hidden=\"true\" />\n <span>{percent() === null ? \"–\" : `${percent()}%`}</span>\n </ChatContextPopup>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,48 @@
1
+ import { ssr as _$ssr } from "solid-js/web";
2
+ import { createComponent as _$createComponent } from "solid-js/web";
3
+ import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
4
+ import { escape as _$escape } from "solid-js/web";
5
+ var _tmpl$ = ["<ol", " class=\"k2b-chat-tasks__list\">", "</ol>"],
6
+ _tmpl$2 = ["<section class=\"k2b-chat-tasks\"><button type=\"button\" class=\"k2b-chat-tasks__header\"", "><i class=\"ti ti-list-check\" aria-hidden=\"true\"></i><span class=\"k2b-chat-tasks__title\">", "", "</span><span class=\"k2b-chat-tasks__count\">", "</span><span class=\"k2b-chat-tasks__segments\" aria-hidden=\"true\">", "</span><i", " aria-hidden=\"true\"></i></button>", "</section>"],
7
+ _tmpl$3 = ["<span", "></span>"],
8
+ _tmpl$4 = ["<li", "><i", " aria-hidden=\"true\"></i><span class=\"k2b-chat-tasks__content\">", "</span><span class=\"k2b-chat-tasks__status\">", "</span></li>"];
9
+ import { createUniqueId, For, Show } from "solid-js";
10
+ /** Presentation only. The host owns the plan and execution state. */
11
+ export function ChatTasks(props) {
12
+ const id = createUniqueId();
13
+ const active = () => props.items.find(item => item.status === "in_progress");
14
+ const icon = status => status === "completed" ? "ti ti-check" : status === "cancelled" ? "ti ti-minus" : status === "in_progress" ? "ti ti-wave-saw-tool" : "ti ti-circle";
15
+ return _$createComponent(Show, {
16
+ get when() {
17
+ return props.items.length;
18
+ },
19
+ get children() {
20
+ return _$ssr(_tmpl$2, _$ssrAttribute("aria-expanded", _$escape(props.open, true), false) + _$ssrAttribute("aria-controls", _$escape(id, true), false), _$escape(props.label), _$escape(_$createComponent(Show, {
21
+ get when() {
22
+ return active();
23
+ },
24
+ get children() {
25
+ return [" \xB7 ", active().content];
26
+ }
27
+ })), _$escape(props.progressLabel), _$escape(_$createComponent(For, {
28
+ get each() {
29
+ return props.items;
30
+ },
31
+ children: item => _$ssr(_tmpl$3, _$ssrAttribute("data-status", _$escape(item.status, true), false))
32
+ })), _$ssrAttribute("class", props.open ? "ti ti-chevron-up" : "ti ti-chevron-down", false), _$escape(_$createComponent(Show, {
33
+ get when() {
34
+ return props.open;
35
+ },
36
+ get children() {
37
+ return _$ssr(_tmpl$, _$ssrAttribute("id", _$escape(id, true), false), _$escape(_$createComponent(For, {
38
+ get each() {
39
+ return props.items;
40
+ },
41
+ children: item => _$ssr(_tmpl$4, _$ssrAttribute("data-status", _$escape(item.status, true), false), _$ssrAttribute("class", _$escape(icon(item.status), true), false), _$escape(item.content), _$escape(props.statusLabels[item.status]))
42
+ })));
43
+ }
44
+ })));
45
+ }
46
+ });
47
+ }
48
+ //# sourceMappingURL=ChatTasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createUniqueId","For","Show","ChatTasks","props","id","active","items","find","item","status","icon","_$createComponent","when","length","children","_$ssr","_tmpl$2","_$ssrAttribute","_$escape","open","label","content","progressLabel","each","_tmpl$3","_tmpl$","_tmpl$4","statusLabels"],"sources":["chat/ChatTasks.tsx"],"sourcesContent":["import { createUniqueId, For, Show } from \"solid-js\";\n\nexport type ChatTask = { id: string; content: string; status: \"pending\" | \"in_progress\" | \"completed\" | \"cancelled\" };\nexport type ChatTasksProps = {\n items: readonly ChatTask[];\n open: boolean;\n onOpenChange: (open: boolean) => void;\n label: string;\n progressLabel: string;\n statusLabels: Record<ChatTask[\"status\"], string>;\n};\n\n/** Presentation only. The host owns the plan and execution state. */\nexport function ChatTasks(props: ChatTasksProps) {\n const id = createUniqueId();\n const active = () => props.items.find((item) => item.status === \"in_progress\");\n const icon = (status: ChatTask[\"status\"]) =>\n status === \"completed\"\n ? \"ti ti-check\"\n : status === \"cancelled\"\n ? \"ti ti-minus\"\n : status === \"in_progress\"\n ? \"ti ti-wave-saw-tool\"\n : \"ti ti-circle\";\n return (\n <Show when={props.items.length}>\n <section class=\"k2b-chat-tasks\">\n <button\n type=\"button\"\n class=\"k2b-chat-tasks__header\"\n aria-expanded={props.open}\n aria-controls={id}\n onClick={() => props.onOpenChange(!props.open)}\n >\n <i class=\"ti ti-list-check\" aria-hidden=\"true\" />\n <span class=\"k2b-chat-tasks__title\">\n {props.label}\n <Show when={active()}> · {active()!.content}</Show>\n </span>\n <span class=\"k2b-chat-tasks__count\">{props.progressLabel}</span>\n <span class=\"k2b-chat-tasks__segments\" aria-hidden=\"true\">\n <For each={props.items}>{(item) => <span data-status={item.status} />}</For>\n </span>\n <i class={props.open ? \"ti ti-chevron-up\" : \"ti ti-chevron-down\"} aria-hidden=\"true\" />\n </button>\n <Show when={props.open}>\n <ol id={id} class=\"k2b-chat-tasks__list\">\n <For each={props.items}>\n {(item) => (\n <li data-status={item.status}>\n <i class={icon(item.status)} aria-hidden=\"true\" />\n <span class=\"k2b-chat-tasks__content\">{item.content}</span>\n <span class=\"k2b-chat-tasks__status\">{props.statusLabels[item.status]}</span>\n </li>\n )}\n </For>\n </ol>\n </Show>\n </section>\n </Show>\n );\n}\n"],"mappings":";;;;;;;;AAAA,SAASA,cAAc,EAAEC,GAAG,EAAEC,IAAI,QAAQ,UAAU;AAYpD;AACA,OAAO,SAASC,SAASA,CAACC,KAAqB,EAAE;EAC/C,MAAMC,EAAE,GAAGL,cAAc,CAAC,CAAC;EAC3B,MAAMM,MAAM,GAAGA,CAAA,KAAMF,KAAK,CAACG,KAAK,CAACC,IAAI,CAAEC,IAAI,IAAKA,IAAI,CAACC,MAAM,KAAK,aAAa,CAAC;EAC9E,MAAMC,IAAI,GAAID,MAA0B,IACtCA,MAAM,KAAK,WAAW,GAClB,aAAa,GACbA,MAAM,KAAK,WAAW,GACpB,aAAa,GACbA,MAAM,KAAK,aAAa,GACtB,qBAAqB,GACrB,cAAc;EACxB,OAAAE,iBAAA,CACGV,IAAI;IAAA,IAACW,IAAIA,CAAA;MAAA,OAAET,KAAK,CAACG,KAAK,CAACO,MAAM;IAAA;IAAA,IAAAC,SAAA;MAAA,OAAAC,KAAA,CAAAC,OAAA,EAAAC,cAAA,kBAAAC,QAAA,CAKTf,KAAK,CAACgB,IAAI,kBAAAF,cAAA,kBAAAC,QAAA,CACVd,EAAE,iBAAAc,QAAA,CAKdf,KAAK,CAACiB,KAAK,GAAAF,QAAA,CAAAP,iBAAA,CACXV,IAAI;QAAA,IAACW,IAAIA,CAAA;UAAA,OAAEP,MAAM,CAAC,CAAC;QAAA;QAAA,IAAAS,SAAA;UAAA,kBAAMT,MAAM,CAAC,CAAC,CAAEgB,OAAO;QAAA;MAAA,KAAAH,QAAA,CAERf,KAAK,CAACmB,aAAa,GAAAJ,QAAA,CAAAP,iBAAA,CAErDX,GAAG;QAAA,IAACuB,IAAIA,CAAA;UAAA,OAAEpB,KAAK,CAACG,KAAK;QAAA;QAAAQ,QAAA,EAAIN,IAAI,IAAAO,KAAA,CAAAS,OAAA,EAAAP,cAAA,gBAAAC,QAAA,CAAwBV,IAAI,CAACC,MAAM;MAAI,KAAAQ,cAAA,UAE7Dd,KAAK,CAACgB,IAAI,GAAG,kBAAkB,GAAG,oBAAoB,UAAAD,QAAA,CAAAP,iBAAA,CAEjEV,IAAI;QAAA,IAACW,IAAIA,CAAA;UAAA,OAAET,KAAK,CAACgB,IAAI;QAAA;QAAA,IAAAL,SAAA;UAAA,OAAAC,KAAA,CAAAU,MAAA,EAAAR,cAAA,OAAAC,QAAA,CACZd,EAAE,iBAAAc,QAAA,CAAAP,iBAAA,CACPX,GAAG;YAAA,IAACuB,IAAIA,CAAA;cAAA,OAAEpB,KAAK,CAACG,KAAK;YAAA;YAAAQ,QAAA,EAClBN,IAAI,IAAAO,KAAA,CAAAW,OAAA,EAAAT,cAAA,gBAAAC,QAAA,CACaV,IAAI,CAACC,MAAM,iBAAAQ,cAAA,UAAAC,QAAA,CAChBR,IAAI,CAACF,IAAI,CAACC,MAAM,CAAC,iBAAAS,QAAA,CACYV,IAAI,CAACa,OAAO,GAAAH,QAAA,CACbf,KAAK,CAACwB,YAAY,CAACnB,IAAI,CAACC,MAAM,CAAC;UAExE;QAAA;MAAA;IAAA;EAAA;AAOf","ignoreList":[]}
@@ -5,12 +5,13 @@ import { escape as _$escape } from "solid-js/web";
5
5
  var _tmpl$ = ["<div class=\"k2b-chat-timeline__navigation\" aria-live=\"off\">", "</div>"],
6
6
  _tmpl$2 = ["<button type=\"button\" class=\"k2b-chat-timeline__older\"><i class=\"ti ti-history\" aria-hidden=\"true\"></i>", "</button>"],
7
7
  _tmpl$3 = ["<div class=\"k2b-chat-timeline__history\" aria-live=\"off\">", "", "", "</div>"],
8
- _tmpl$4 = "<button type=\"button\" class=\"k2b-chat-timeline__latest\"><i class=\"ti ti-arrow-down\" aria-hidden=\"true\"></i>Jump to latest</button>",
9
- _tmpl$5 = ["<section class=\"", "\"", "><div class=\"k2b-chat-timeline__viewport\" data-initializing role=\"region\"", " tabindex=\"0\">", "<div class=\"k2b-chat-timeline__content\" role=\"log\" aria-live=\"polite\" aria-relevant=\"additions text\"", "><div class=\"k2b-chat-timeline__sentinel\" aria-hidden=\"true\"></div>", "", "</div></div>", "</section>"],
8
+ _tmpl$4 = ["<button type=\"button\" class=\"k2b-chat-timeline__latest\"><i class=\"ti ti-arrow-down\" aria-hidden=\"true\"></i>", "</button>"],
9
+ _tmpl$5 = ["<section class=\"", "\"", "><div class=\"k2b-chat-timeline__viewport\"", " data-initializing role=\"region\"", " tabindex=\"0\">", "<div class=\"k2b-chat-timeline__content\" role=\"log\" aria-live=\"polite\" aria-relevant=\"additions text\"", "><div class=\"k2b-chat-timeline__sentinel\" aria-hidden=\"true\"></div>", "", "</div></div>", "</section>"],
10
10
  _tmpl$6 = "<i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\"></i>",
11
11
  _tmpl$7 = ["<button type=\"button\" class=\"k2b-chat-timeline__retry\"", "><i class=\"ti ti-refresh\" aria-hidden=\"true\"></i></button>"];
12
12
  import { createEffect, createSignal, For, onCleanup, onMount, Show, untrack } from "solid-js";
13
13
  import { useUiMessages } from "../intl/messages";
14
+ import { createScrollFade } from "../layout/scroll-fade";
14
15
  import Placeholder from "../surfaces/Placeholder";
15
16
  import { ChatActivity, ChatMessage } from "./ChatPrimitives";
16
17
  import { isChatNearBottom, restoredChatScrollTop } from "./chat-behavior";
@@ -20,6 +21,7 @@ export function ChatTimeline(props) {
20
21
  const [loadingOlderInternally, setLoadingOlderInternally] = createSignal(false);
21
22
  const [historyError, setHistoryError] = createSignal(null);
22
23
  let viewportRef;
24
+ createScrollFade(() => viewportRef, () => props.scrollFade !== false);
23
25
  let contentRef;
24
26
  let topSentinelRef;
25
27
  let followFrame;
@@ -36,6 +38,14 @@ export function ChatTimeline(props) {
36
38
  if (followFrame !== undefined) cancelAnimationFrame(followFrame);
37
39
  followFrame = undefined;
38
40
  };
41
+ props.scrollToAnchorRef?.(anchorId => {
42
+ const anchor = Array.from(contentRef?.querySelectorAll("[data-chat-anchor]") ?? []).find(element => element.dataset.chatAnchor === String(anchorId));
43
+ if (!viewportRef || !anchor) return false;
44
+ cancelFollow();
45
+ setPinned(false);
46
+ viewportRef.scrollTop = Math.max(0, viewportRef.scrollTop + anchor.getBoundingClientRect().top - viewportRef.getBoundingClientRect().top - 16);
47
+ return true;
48
+ });
39
49
  const noteUserScrollAway = () => {
40
50
  userScrollingAway = true;
41
51
  if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);
@@ -123,7 +133,7 @@ export function ChatTimeline(props) {
123
133
  props.items.at(-1)?.id;
124
134
  untrack(scheduleFollow);
125
135
  });
126
- return _$ssr(_tmpl$5, `k2b-chat-timeline ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(props.label ?? messages().conversation, true), false), _$ssrAttribute("aria-label", _$escape(messages().conversationMessages({
136
+ return _$ssr(_tmpl$5, `k2b-chat-timeline ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("aria-label", _$escape(props.label ?? messages().conversation, true), false), _$ssrAttribute("data-scroll-fade-mode", props.scrollFade !== false ? "bottom" : _$escape(undefined, true), false), _$ssrAttribute("aria-label", _$escape(messages().conversationMessages({
127
137
  label: props.label ?? messages().conversation
128
138
  }), true), false), _$escape(_$createComponent(Show, {
129
139
  get when() {
@@ -296,7 +306,7 @@ export function ChatTimeline(props) {
296
306
  return !pinned() && hasContent();
297
307
  },
298
308
  get children() {
299
- return _$ssr(_tmpl$4);
309
+ return _$ssr(_tmpl$4, _$escape(messages().jumpToLatest));
300
310
  }
301
311
  })));
302
312
  }
@@ -1 +1 @@
1
- {"version":3,"names":["createEffect","createSignal","For","onCleanup","onMount","Show","untrack","useUiMessages","Placeholder","ChatActivity","ChatMessage","isChatNearBottom","restoredChatScrollTop","ChatTimeline","props","messages","pinned","setPinned","loadingOlderInternally","setLoadingOlderInternally","historyError","setHistoryError","viewportRef","contentRef","topSentinelRef","followFrame","userScrollFrame","userScrollingAway","touchY","lastConversationKey","loadingOlder","Boolean","canLoadOlder","onLoadOlder","hasMore","hasHistoryControls","hasContent","items","length","threshold","Math","max","followThreshold","cancelFollow","undefined","cancelAnimationFrame","noteUserScrollAway","requestAnimationFrame","scrollToLatest","scrollTop","scrollHeight","scheduleFollow","loadOlder","viewport","previousScrollTop","previousScrollHeight","prepended","error","Error","message","couldNotLoadOlderMessages","queueMicrotask","updatePinned","nearBottom","clientHeight","removeAttribute","resizeObserver","ResizeObserver","observe","historyObserver","IntersectionObserver","entries","some","entry","isIntersecting","root","rootMargin","disconnect","key","conversationKey","at","id","_$ssr","_tmpl$5","_$escape","class","_$ssrAttribute","label","conversation","conversationMessages","_$createComponent","when","navigation","children","_tmpl$","loading","_tmpl$3","_tmpl$2","loadOlderMessages","loadingOlderMessages","icon","trailing","_tmpl$6","description","tone","_tmpl$7","retryOlderMessages","fallback","state","title","loadingConversation","emptyTitle","startConversation","emptyDescription","each","item","kind","leading","accent","busy","defaultOpen","anchorId","content","role","createdAt","timeLabel","status","attachments","actions","actionDisplay","onActionError","_tmpl$4"],"sources":["chat/ChatTimeline.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, onCleanup, onMount, Show, untrack } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport { ChatActivity, ChatMessage } from \"./ChatPrimitives\";\nimport { isChatNearBottom, restoredChatScrollTop } from \"./chat-behavior\";\nimport type { ChatAction, ChatActivityTone, ChatAttachment, ChatMessageStatus, ChatRole } from \"./types\";\n\nexport type ChatMessageItem = {\n kind: \"message\";\n id: string;\n role: ChatRole;\n content?: JSX.Element;\n label?: string;\n createdAt?: string | Date;\n timeLabel?: string;\n status?: ChatMessageStatus;\n attachments?: readonly ChatAttachment[];\n actions?: readonly ChatAction[];\n actionDisplay?: \"auto\" | \"inline\" | \"menu\";\n anchorId?: string | number;\n class?: string;\n};\n\nexport type ChatActivityItem = {\n kind: \"activity\";\n id: string;\n label: string;\n description?: string;\n icon?: string;\n leading?: JSX.Element;\n accent?: string;\n tone?: ChatActivityTone;\n busy?: boolean;\n trailing?: JSX.Element;\n defaultOpen?: boolean;\n anchorId?: string | number;\n content?: JSX.Element;\n class?: string;\n};\n\nexport type ChatTimelineItem = ChatMessageItem | ChatActivityItem;\n\nexport type ChatTimelineProps = {\n items: readonly ChatTimelineItem[];\n conversationKey?: string | null;\n loading?: boolean;\n hasMore?: boolean;\n loadingOlder?: boolean;\n onLoadOlder?: () => boolean | void | Promise<boolean | void>;\n emptyTitle?: string;\n emptyDescription?: string;\n navigation?: JSX.Element;\n onActionError?: (error: unknown) => void;\n viewportRef?: (element: HTMLDivElement) => void;\n contentRef?: (element: HTMLDivElement) => void;\n label?: string;\n followThreshold?: number;\n class?: string;\n};\n\nexport function ChatTimeline(props: ChatTimelineProps): JSX.Element {\n const messages = useUiMessages();\n const [pinned, setPinned] = createSignal(true);\n const [loadingOlderInternally, setLoadingOlderInternally] = createSignal(false);\n const [historyError, setHistoryError] = createSignal<string | null>(null);\n let viewportRef: HTMLDivElement | undefined;\n let contentRef: HTMLDivElement | undefined;\n let topSentinelRef: HTMLDivElement | undefined;\n let followFrame: number | undefined;\n let userScrollFrame: number | undefined;\n let userScrollingAway = false;\n let touchY: number | undefined;\n let lastConversationKey: string | null | undefined;\n\n const loadingOlder = () => Boolean(props.loadingOlder || loadingOlderInternally());\n const canLoadOlder = () => Boolean(props.onLoadOlder && props.hasMore && !loadingOlder());\n const hasHistoryControls = () => loadingOlder() || historyError() !== null || canLoadOlder();\n const hasContent = () => props.items.length > 0;\n const threshold = () => Math.max(0, props.followThreshold ?? 96);\n\n const cancelFollow = () => {\n if (followFrame !== undefined) cancelAnimationFrame(followFrame);\n followFrame = undefined;\n };\n\n const noteUserScrollAway = () => {\n userScrollingAway = true;\n if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);\n userScrollFrame = requestAnimationFrame(() => {\n userScrollFrame = undefined;\n userScrollingAway = false;\n });\n };\n\n const scrollToLatest = () => {\n if (!viewportRef) return;\n setPinned(true);\n viewportRef.scrollTop = viewportRef.scrollHeight;\n };\n\n const scheduleFollow = () => {\n if (!pinned() || followFrame !== undefined) return;\n followFrame = requestAnimationFrame(() => {\n followFrame = undefined;\n if (pinned()) scrollToLatest();\n });\n };\n\n const loadOlder = async () => {\n if (!props.onLoadOlder || !props.hasMore || loadingOlder()) return;\n const viewport = viewportRef;\n if (!viewport) return;\n const previousScrollTop = viewport.scrollTop;\n const previousScrollHeight = viewport.scrollHeight;\n setHistoryError(null);\n setLoadingOlderInternally(true);\n let prepended = false;\n try {\n prepended = (await props.onLoadOlder()) !== false;\n } catch (error) {\n setHistoryError(error instanceof Error ? error.message : messages().couldNotLoadOlderMessages);\n } finally {\n setLoadingOlderInternally(false);\n }\n if (!prepended || viewportRef !== viewport) return;\n queueMicrotask(() => {\n requestAnimationFrame(() => {\n if (viewportRef !== viewport) return;\n viewport.scrollTop = restoredChatScrollTop(previousScrollTop, previousScrollHeight, viewport.scrollHeight);\n });\n });\n };\n\n const updatePinned = () => {\n if (!viewportRef) return;\n const nearBottom = isChatNearBottom(viewportRef.scrollHeight, viewportRef.scrollTop, viewportRef.clientHeight, threshold());\n if (nearBottom) setPinned(true);\n else if (userScrollingAway || followFrame === undefined) {\n if (userScrollingAway) cancelFollow();\n setPinned(false);\n }\n if (viewportRef.scrollTop <= threshold()) void loadOlder();\n };\n\n onMount(() => {\n // Switch from CSS-only SSR anchoring to normal scroll coordinates before paint.\n viewportRef?.removeAttribute(\"data-initializing\");\n scrollToLatest();\n const resizeObserver = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(() => scheduleFollow());\n if (contentRef) resizeObserver?.observe(contentRef);\n if (viewportRef) resizeObserver?.observe(viewportRef);\n\n const historyObserver =\n typeof IntersectionObserver === \"undefined\" || !topSentinelRef\n ? null\n : new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) void loadOlder();\n },\n { root: viewportRef, rootMargin: \"160px 0px 0px\" },\n );\n if (topSentinelRef) historyObserver?.observe(topSentinelRef);\n\n onCleanup(() => {\n cancelFollow();\n if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);\n resizeObserver?.disconnect();\n historyObserver?.disconnect();\n });\n });\n\n createEffect(() => {\n const key = props.conversationKey;\n if (key === lastConversationKey) return;\n lastConversationKey = key;\n setHistoryError(null);\n setPinned(true);\n queueMicrotask(scrollToLatest);\n });\n\n createEffect(() => {\n props.items.length;\n props.items.at(-1)?.id;\n untrack(scheduleFollow);\n });\n\n return (\n <section class={`k2b-chat-timeline ${props.class ?? \"\"}`} aria-label={props.label ?? messages().conversation}>\n <div\n ref={(element) => {\n viewportRef = element;\n props.viewportRef?.(element);\n }}\n class=\"k2b-chat-timeline__viewport\"\n data-initializing=\"\"\n role=\"region\"\n aria-label={messages().conversationMessages({ label: props.label ?? messages().conversation })}\n tabIndex={0}\n onWheel={(event) => {\n if (event.deltaY < 0) noteUserScrollAway();\n }}\n onKeyDown={(event) => {\n if (event.target !== event.currentTarget) return;\n if (event.key === \"ArrowUp\" || event.key === \"PageUp\" || event.key === \"Home\" || (event.key === \" \" && event.shiftKey)) {\n noteUserScrollAway();\n }\n }}\n onTouchStart={(event) => {\n touchY = event.touches[0]?.clientY;\n }}\n onTouchMove={(event) => {\n const nextY = event.touches[0]?.clientY;\n if (nextY !== undefined && touchY !== undefined && nextY > touchY) noteUserScrollAway();\n touchY = nextY;\n }}\n onTouchEnd={() => {\n touchY = undefined;\n }}\n onScroll={updatePinned}\n >\n <Show when={props.navigation}>\n <div class=\"k2b-chat-timeline__navigation\" aria-live=\"off\">\n {props.navigation}\n </div>\n </Show>\n <div\n ref={(element) => {\n contentRef = element;\n props.contentRef?.(element);\n }}\n class=\"k2b-chat-timeline__content\"\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions text\"\n aria-busy={props.loading ? \"true\" : undefined}\n >\n <div ref={topSentinelRef} class=\"k2b-chat-timeline__sentinel\" aria-hidden=\"true\" />\n <Show when={hasHistoryControls()}>\n <div class=\"k2b-chat-timeline__history\" aria-live=\"off\">\n <Show when={canLoadOlder()}>\n <button type=\"button\" class=\"k2b-chat-timeline__older\" onClick={() => void loadOlder()}>\n <i class=\"ti ti-history\" aria-hidden=\"true\" />\n {messages().loadOlderMessages}\n </button>\n </Show>\n <Show when={loadingOlder()}>\n <ChatActivity\n label={messages().loadingOlderMessages}\n icon=\"ti ti-history\"\n trailing={<i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />}\n />\n </Show>\n <Show when={historyError()}>\n {(message) => (\n <ChatActivity\n label={messages().couldNotLoadOlderMessages}\n description={message()}\n icon=\"ti ti-alert-circle\"\n tone=\"danger\"\n trailing={\n <button\n type=\"button\"\n class=\"k2b-chat-timeline__retry\"\n aria-label={messages().retryOlderMessages}\n onClick={() => void loadOlder()}\n >\n <i class=\"ti ti-refresh\" aria-hidden=\"true\" />\n </button>\n }\n />\n )}\n </Show>\n </div>\n </Show>\n <Show\n when={!props.loading && hasContent()}\n fallback={\n <Placeholder\n class=\"k2b-chat-timeline__placeholder\"\n state={props.loading ? \"loading\" : \"empty\"}\n icon={props.loading ? undefined : \"ti ti-sparkles\"}\n title={props.loading ? messages().loadingConversation : (props.emptyTitle ?? messages().startConversation)}\n description={!props.loading ? props.emptyDescription : undefined}\n />\n }\n >\n <For each={props.items}>\n {(item) => (\n <Show\n when={item.kind === \"message\"}\n fallback={\n <ChatActivity\n label={(item as ChatActivityItem).label}\n description={(item as ChatActivityItem).description}\n icon={(item as ChatActivityItem).icon}\n leading={(item as ChatActivityItem).leading}\n accent={(item as ChatActivityItem).accent}\n tone={(item as ChatActivityItem).tone}\n busy={(item as ChatActivityItem).busy}\n trailing={(item as ChatActivityItem).trailing}\n defaultOpen={(item as ChatActivityItem).defaultOpen}\n anchorId={(item as ChatActivityItem).anchorId}\n class={(item as ChatActivityItem).class}\n >\n {(item as ChatActivityItem).content}\n </ChatActivity>\n }\n >\n <ChatMessage\n role={(item as ChatMessageItem).role}\n label={(item as ChatMessageItem).label}\n createdAt={(item as ChatMessageItem).createdAt}\n timeLabel={(item as ChatMessageItem).timeLabel}\n status={(item as ChatMessageItem).status}\n attachments={(item as ChatMessageItem).attachments}\n actions={(item as ChatMessageItem).actions}\n actionDisplay={(item as ChatMessageItem).actionDisplay}\n anchorId={(item as ChatMessageItem).anchorId}\n onActionError={props.onActionError}\n class={(item as ChatMessageItem).class}\n >\n {(item as ChatMessageItem).content}\n </ChatMessage>\n </Show>\n )}\n </For>\n </Show>\n </div>\n </div>\n <Show when={!pinned() && hasContent()}>\n <button type=\"button\" class=\"k2b-chat-timeline__latest\" onClick={scrollToLatest}>\n <i class=\"ti ti-arrow-down\" aria-hidden=\"true\" />\n Jump to latest\n </button>\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["createEffect","createSignal","For","onCleanup","onMount","Show","untrack","useUiMessages","createScrollFade","Placeholder","ChatActivity","ChatMessage","isChatNearBottom","restoredChatScrollTop","ChatTimeline","props","messages","pinned","setPinned","loadingOlderInternally","setLoadingOlderInternally","historyError","setHistoryError","viewportRef","scrollFade","contentRef","topSentinelRef","followFrame","userScrollFrame","userScrollingAway","touchY","lastConversationKey","loadingOlder","Boolean","canLoadOlder","onLoadOlder","hasMore","hasHistoryControls","hasContent","items","length","threshold","Math","max","followThreshold","cancelFollow","undefined","cancelAnimationFrame","scrollToAnchorRef","anchorId","anchor","Array","from","querySelectorAll","find","element","dataset","chatAnchor","String","scrollTop","getBoundingClientRect","top","noteUserScrollAway","requestAnimationFrame","scrollToLatest","scrollHeight","scheduleFollow","loadOlder","viewport","previousScrollTop","previousScrollHeight","prepended","error","Error","message","couldNotLoadOlderMessages","queueMicrotask","updatePinned","nearBottom","clientHeight","removeAttribute","resizeObserver","ResizeObserver","observe","historyObserver","IntersectionObserver","entries","some","entry","isIntersecting","root","rootMargin","disconnect","key","conversationKey","at","id","_$ssr","_tmpl$5","_$escape","class","_$ssrAttribute","label","conversation","conversationMessages","_$createComponent","when","navigation","children","_tmpl$","loading","_tmpl$3","_tmpl$2","loadOlderMessages","loadingOlderMessages","icon","trailing","_tmpl$6","description","tone","_tmpl$7","retryOlderMessages","fallback","state","title","loadingConversation","emptyTitle","startConversation","emptyDescription","each","item","kind","leading","accent","busy","defaultOpen","content","role","createdAt","timeLabel","status","attachments","actions","actionDisplay","onActionError","_tmpl$4","jumpToLatest"],"sources":["chat/ChatTimeline.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, onCleanup, onMount, Show, untrack } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { createScrollFade } from \"../layout/scroll-fade\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport { ChatActivity, ChatMessage } from \"./ChatPrimitives\";\nimport { isChatNearBottom, restoredChatScrollTop } from \"./chat-behavior\";\nimport type { ChatAction, ChatActivityTone, ChatAttachment, ChatMessageStatus, ChatRole } from \"./types\";\n\nexport type ChatMessageItem = {\n kind: \"message\";\n id: string;\n role: ChatRole;\n content?: JSX.Element;\n label?: string;\n createdAt?: string | Date;\n timeLabel?: string;\n status?: ChatMessageStatus;\n attachments?: readonly ChatAttachment[];\n actions?: readonly ChatAction[];\n actionDisplay?: \"auto\" | \"inline\" | \"menu\";\n anchorId?: string | number;\n class?: string;\n};\n\nexport type ChatActivityItem = {\n kind: \"activity\";\n id: string;\n label: string;\n description?: string;\n icon?: string;\n leading?: JSX.Element;\n accent?: string;\n tone?: ChatActivityTone;\n busy?: boolean;\n trailing?: JSX.Element;\n defaultOpen?: boolean;\n anchorId?: string | number;\n content?: JSX.Element;\n class?: string;\n};\n\nexport type ChatTimelineItem = ChatMessageItem | ChatActivityItem;\n\nexport type ChatTimelineProps = {\n scrollFade?: boolean;\n items: readonly ChatTimelineItem[];\n conversationKey?: string | null;\n loading?: boolean;\n hasMore?: boolean;\n loadingOlder?: boolean;\n onLoadOlder?: () => boolean | void | Promise<boolean | void>;\n emptyTitle?: string;\n emptyDescription?: string;\n navigation?: JSX.Element;\n onActionError?: (error: unknown) => void;\n viewportRef?: (element: HTMLDivElement) => void;\n contentRef?: (element: HTMLDivElement) => void;\n scrollToAnchorRef?: (scrollToAnchor: (anchorId: string | number) => boolean) => void;\n label?: string;\n followThreshold?: number;\n class?: string;\n};\n\nexport function ChatTimeline(props: ChatTimelineProps): JSX.Element {\n const messages = useUiMessages();\n const [pinned, setPinned] = createSignal(true);\n const [loadingOlderInternally, setLoadingOlderInternally] = createSignal(false);\n const [historyError, setHistoryError] = createSignal<string | null>(null);\n let viewportRef: HTMLDivElement | undefined;\n createScrollFade(\n () => viewportRef,\n () => props.scrollFade !== false,\n );\n let contentRef: HTMLDivElement | undefined;\n let topSentinelRef: HTMLDivElement | undefined;\n let followFrame: number | undefined;\n let userScrollFrame: number | undefined;\n let userScrollingAway = false;\n let touchY: number | undefined;\n let lastConversationKey: string | null | undefined;\n\n const loadingOlder = () => Boolean(props.loadingOlder || loadingOlderInternally());\n const canLoadOlder = () => Boolean(props.onLoadOlder && props.hasMore && !loadingOlder());\n const hasHistoryControls = () => loadingOlder() || historyError() !== null || canLoadOlder();\n const hasContent = () => props.items.length > 0;\n const threshold = () => Math.max(0, props.followThreshold ?? 96);\n\n const cancelFollow = () => {\n if (followFrame !== undefined) cancelAnimationFrame(followFrame);\n followFrame = undefined;\n };\n\n props.scrollToAnchorRef?.((anchorId) => {\n const anchor = Array.from(contentRef?.querySelectorAll<HTMLElement>(\"[data-chat-anchor]\") ?? []).find(\n (element) => element.dataset.chatAnchor === String(anchorId),\n );\n if (!viewportRef || !anchor) return false;\n cancelFollow();\n setPinned(false);\n viewportRef.scrollTop = Math.max(\n 0,\n viewportRef.scrollTop + anchor.getBoundingClientRect().top - viewportRef.getBoundingClientRect().top - 16,\n );\n return true;\n });\n\n const noteUserScrollAway = () => {\n userScrollingAway = true;\n if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);\n userScrollFrame = requestAnimationFrame(() => {\n userScrollFrame = undefined;\n userScrollingAway = false;\n });\n };\n\n const scrollToLatest = () => {\n if (!viewportRef) return;\n setPinned(true);\n viewportRef.scrollTop = viewportRef.scrollHeight;\n };\n\n const scheduleFollow = () => {\n if (!pinned() || followFrame !== undefined) return;\n followFrame = requestAnimationFrame(() => {\n followFrame = undefined;\n if (pinned()) scrollToLatest();\n });\n };\n\n const loadOlder = async () => {\n if (!props.onLoadOlder || !props.hasMore || loadingOlder()) return;\n const viewport = viewportRef;\n if (!viewport) return;\n const previousScrollTop = viewport.scrollTop;\n const previousScrollHeight = viewport.scrollHeight;\n setHistoryError(null);\n setLoadingOlderInternally(true);\n let prepended = false;\n try {\n prepended = (await props.onLoadOlder()) !== false;\n } catch (error) {\n setHistoryError(error instanceof Error ? error.message : messages().couldNotLoadOlderMessages);\n } finally {\n setLoadingOlderInternally(false);\n }\n if (!prepended || viewportRef !== viewport) return;\n queueMicrotask(() => {\n requestAnimationFrame(() => {\n if (viewportRef !== viewport) return;\n viewport.scrollTop = restoredChatScrollTop(previousScrollTop, previousScrollHeight, viewport.scrollHeight);\n });\n });\n };\n\n const updatePinned = () => {\n if (!viewportRef) return;\n const nearBottom = isChatNearBottom(viewportRef.scrollHeight, viewportRef.scrollTop, viewportRef.clientHeight, threshold());\n if (nearBottom) setPinned(true);\n else if (userScrollingAway || followFrame === undefined) {\n if (userScrollingAway) cancelFollow();\n setPinned(false);\n }\n if (viewportRef.scrollTop <= threshold()) void loadOlder();\n };\n\n onMount(() => {\n // Switch from CSS-only SSR anchoring to normal scroll coordinates before paint.\n viewportRef?.removeAttribute(\"data-initializing\");\n scrollToLatest();\n const resizeObserver = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(() => scheduleFollow());\n if (contentRef) resizeObserver?.observe(contentRef);\n if (viewportRef) resizeObserver?.observe(viewportRef);\n\n const historyObserver =\n typeof IntersectionObserver === \"undefined\" || !topSentinelRef\n ? null\n : new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) void loadOlder();\n },\n { root: viewportRef, rootMargin: \"160px 0px 0px\" },\n );\n if (topSentinelRef) historyObserver?.observe(topSentinelRef);\n\n onCleanup(() => {\n cancelFollow();\n if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);\n resizeObserver?.disconnect();\n historyObserver?.disconnect();\n });\n });\n\n createEffect(() => {\n const key = props.conversationKey;\n if (key === lastConversationKey) return;\n lastConversationKey = key;\n setHistoryError(null);\n setPinned(true);\n queueMicrotask(scrollToLatest);\n });\n\n createEffect(() => {\n props.items.length;\n props.items.at(-1)?.id;\n untrack(scheduleFollow);\n });\n\n return (\n <section class={`k2b-chat-timeline ${props.class ?? \"\"}`} aria-label={props.label ?? messages().conversation}>\n <div\n ref={(element) => {\n viewportRef = element;\n props.viewportRef?.(element);\n }}\n class=\"k2b-chat-timeline__viewport\"\n data-scroll-fade-mode={props.scrollFade !== false ? \"bottom\" : undefined}\n data-initializing=\"\"\n role=\"region\"\n aria-label={messages().conversationMessages({ label: props.label ?? messages().conversation })}\n tabIndex={0}\n onWheel={(event) => {\n if (event.deltaY < 0) noteUserScrollAway();\n }}\n onKeyDown={(event) => {\n if (event.target !== event.currentTarget) return;\n if (event.key === \"ArrowUp\" || event.key === \"PageUp\" || event.key === \"Home\" || (event.key === \" \" && event.shiftKey)) {\n noteUserScrollAway();\n }\n }}\n onTouchStart={(event) => {\n touchY = event.touches[0]?.clientY;\n }}\n onTouchMove={(event) => {\n const nextY = event.touches[0]?.clientY;\n if (nextY !== undefined && touchY !== undefined && nextY > touchY) noteUserScrollAway();\n touchY = nextY;\n }}\n onTouchEnd={() => {\n touchY = undefined;\n }}\n onScroll={updatePinned}\n >\n <Show when={props.navigation}>\n <div class=\"k2b-chat-timeline__navigation\" aria-live=\"off\">\n {props.navigation}\n </div>\n </Show>\n <div\n ref={(element) => {\n contentRef = element;\n props.contentRef?.(element);\n }}\n class=\"k2b-chat-timeline__content\"\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions text\"\n aria-busy={props.loading ? \"true\" : undefined}\n >\n <div ref={topSentinelRef} class=\"k2b-chat-timeline__sentinel\" aria-hidden=\"true\" />\n <Show when={hasHistoryControls()}>\n <div class=\"k2b-chat-timeline__history\" aria-live=\"off\">\n <Show when={canLoadOlder()}>\n <button type=\"button\" class=\"k2b-chat-timeline__older\" onClick={() => void loadOlder()}>\n <i class=\"ti ti-history\" aria-hidden=\"true\" />\n {messages().loadOlderMessages}\n </button>\n </Show>\n <Show when={loadingOlder()}>\n <ChatActivity\n label={messages().loadingOlderMessages}\n icon=\"ti ti-history\"\n trailing={<i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />}\n />\n </Show>\n <Show when={historyError()}>\n {(message) => (\n <ChatActivity\n label={messages().couldNotLoadOlderMessages}\n description={message()}\n icon=\"ti ti-alert-circle\"\n tone=\"danger\"\n trailing={\n <button\n type=\"button\"\n class=\"k2b-chat-timeline__retry\"\n aria-label={messages().retryOlderMessages}\n onClick={() => void loadOlder()}\n >\n <i class=\"ti ti-refresh\" aria-hidden=\"true\" />\n </button>\n }\n />\n )}\n </Show>\n </div>\n </Show>\n <Show\n when={!props.loading && hasContent()}\n fallback={\n <Placeholder\n class=\"k2b-chat-timeline__placeholder\"\n state={props.loading ? \"loading\" : \"empty\"}\n icon={props.loading ? undefined : \"ti ti-sparkles\"}\n title={props.loading ? messages().loadingConversation : (props.emptyTitle ?? messages().startConversation)}\n description={!props.loading ? props.emptyDescription : undefined}\n />\n }\n >\n <For each={props.items}>\n {(item) => (\n <Show\n when={item.kind === \"message\"}\n fallback={\n <ChatActivity\n label={(item as ChatActivityItem).label}\n description={(item as ChatActivityItem).description}\n icon={(item as ChatActivityItem).icon}\n leading={(item as ChatActivityItem).leading}\n accent={(item as ChatActivityItem).accent}\n tone={(item as ChatActivityItem).tone}\n busy={(item as ChatActivityItem).busy}\n trailing={(item as ChatActivityItem).trailing}\n defaultOpen={(item as ChatActivityItem).defaultOpen}\n anchorId={(item as ChatActivityItem).anchorId}\n class={(item as ChatActivityItem).class}\n >\n {(item as ChatActivityItem).content}\n </ChatActivity>\n }\n >\n <ChatMessage\n role={(item as ChatMessageItem).role}\n label={(item as ChatMessageItem).label}\n createdAt={(item as ChatMessageItem).createdAt}\n timeLabel={(item as ChatMessageItem).timeLabel}\n status={(item as ChatMessageItem).status}\n attachments={(item as ChatMessageItem).attachments}\n actions={(item as ChatMessageItem).actions}\n actionDisplay={(item as ChatMessageItem).actionDisplay}\n anchorId={(item as ChatMessageItem).anchorId}\n onActionError={props.onActionError}\n class={(item as ChatMessageItem).class}\n >\n {(item as ChatMessageItem).content}\n </ChatMessage>\n </Show>\n )}\n </For>\n </Show>\n </div>\n </div>\n <Show when={!pinned() && hasContent()}>\n <button type=\"button\" class=\"k2b-chat-timeline__latest\" onClick={scrollToLatest}>\n <i class=\"ti ti-arrow-down\" aria-hidden=\"true\" />\n {messages().jumpToLatest}\n </button>\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,8 +1,3 @@
1
- export const filterChatCommands = (value, commands) => {
2
- if (!value.startsWith("/") || /\s/.test(value)) return [];
3
- const query = value.slice(1).toLowerCase();
4
- return commands.filter(command => command.name.toLowerCase().startsWith(query));
5
- };
6
1
  export const nextChatCommandIndex = (index, length, direction) => length <= 0 ? 0 : (index + direction + length) % length;
7
2
  export const isChatNearBottom = (scrollHeight, scrollTop, clientHeight, threshold = 96) => scrollHeight - scrollTop - clientHeight <= threshold;
8
3
  export const restoredChatScrollTop = (previousScrollTop, previousScrollHeight, nextScrollHeight) => Math.max(0, previousScrollTop + nextScrollHeight - previousScrollHeight);
@@ -1 +1 @@
1
- {"version":3,"names":["filterChatCommands","value","commands","startsWith","test","query","slice","toLowerCase","filter","command","name","nextChatCommandIndex","index","length","direction","isChatNearBottom","scrollHeight","scrollTop","clientHeight","threshold","restoredChatScrollTop","previousScrollTop","previousScrollHeight","nextScrollHeight","Math","max","runChatSubmission","run","clear","perform","restore","error","onError","reportChatFailure","result","Promise","catch","writeChatClipboard","navigator","clipboard","writeText","Error","executeChatAction","action","copyText","onSelect"],"sources":["chat/chat-behavior.ts"],"sourcesContent":["import type { ChatAction } from \"./types\";\n\nexport const filterChatCommands = <T extends { name: string }>(value: string, commands: readonly T[]): T[] => {\n if (!value.startsWith(\"/\") || /\\s/.test(value)) return [];\n const query = value.slice(1).toLowerCase();\n return commands.filter((command) => command.name.toLowerCase().startsWith(query));\n};\n\nexport const nextChatCommandIndex = (index: number, length: number, direction: 1 | -1): number =>\n length <= 0 ? 0 : (index + direction + length) % length;\n\nexport const isChatNearBottom = (scrollHeight: number, scrollTop: number, clientHeight: number, threshold = 96): boolean =>\n scrollHeight - scrollTop - clientHeight <= threshold;\n\nexport const restoredChatScrollTop = (previousScrollTop: number, previousScrollHeight: number, nextScrollHeight: number): number =>\n Math.max(0, previousScrollTop + nextScrollHeight - previousScrollHeight);\n\nexport type ChatSubmissionRun = {\n /** Clears the controlled draft (and attachments) before the handler runs. */\n clear: () => void;\n /**\n * The application handler. A synchronous throw, a rejected promise, and a\n * `false` result all count as a rejected submission.\n */\n perform: () => boolean | void | Promise<boolean | void>;\n /** Restores the cleared draft (and attachments) after a rejected submission. */\n restore: () => void;\n onError?: (error: unknown) => void;\n};\n\n/**\n * Runs one composer submission with optimistic clearing. Resolves to `true`\n * when the handler accepted the submission. A synchronous throw is handled\n * exactly like a rejected promise so a controlled draft is never lost.\n */\nexport const runChatSubmission = async (run: ChatSubmissionRun): Promise<boolean> => {\n run.clear();\n try {\n if ((await run.perform()) === false) {\n run.restore();\n return false;\n }\n return true;\n } catch (error) {\n run.onError?.(error);\n run.restore();\n return false;\n }\n};\n\n/** Reports a handler failure without letting a synchronous throw escape. */\nexport const reportChatFailure = (perform: () => unknown, onError?: (error: unknown) => void): void => {\n try {\n const result = perform();\n if (result instanceof Promise) void result.catch((error) => onError?.(error));\n } catch (error) {\n onError?.(error);\n }\n};\n\nconst writeChatClipboard = async (value: string): Promise<void> => {\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.writeText) {\n throw new Error(\"Clipboard access is unavailable.\");\n }\n await navigator.clipboard.writeText(value);\n};\n\n/** Executes the one behavior guaranteed by the ChatAction contract. */\nexport const executeChatAction = async (action: ChatAction): Promise<void> => {\n if (typeof action.copyText === \"string\") {\n await writeChatClipboard(action.copyText);\n return;\n }\n await action.onSelect();\n};\n"],"mappings":"AAEA,OAAO,MAAMA,kBAAkB,GAAGA,CAA6BC,KAAa,EAAEC,QAAsB,KAAU;EAC5G,IAAI,CAACD,KAAK,CAACE,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAACC,IAAI,CAACH,KAAK,CAAC,EAAE,OAAO,EAAE;EACzD,MAAMI,KAAK,GAAGJ,KAAK,CAACK,KAAK,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;EAC1C,OAAOL,QAAQ,CAACM,MAAM,CAAEC,OAAO,IAAKA,OAAO,CAACC,IAAI,CAACH,WAAW,CAAC,CAAC,CAACJ,UAAU,CAACE,KAAK,CAAC,CAAC;AACnF,CAAC;AAED,OAAO,MAAMM,oBAAoB,GAAGA,CAACC,KAAa,EAAEC,MAAc,EAAEC,SAAiB,KACnFD,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAACD,KAAK,GAAGE,SAAS,GAAGD,MAAM,IAAIA,MAAM;AAEzD,OAAO,MAAME,gBAAgB,GAAGA,CAACC,YAAoB,EAAEC,SAAiB,EAAEC,YAAoB,EAAEC,SAAS,GAAG,EAAE,KAC5GH,YAAY,GAAGC,SAAS,GAAGC,YAAY,IAAIC,SAAS;AAEtD,OAAO,MAAMC,qBAAqB,GAAGA,CAACC,iBAAyB,EAAEC,oBAA4B,EAAEC,gBAAwB,KACrHC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEJ,iBAAiB,GAAGE,gBAAgB,GAAGD,oBAAoB,CAAC;AAe1E;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMI,iBAAiB,GAAG,MAAOC,GAAsB,IAAuB;EACnFA,GAAG,CAACC,KAAK,CAAC,CAAC;EACX,IAAI;IACF,IAAI,CAAC,MAAMD,GAAG,CAACE,OAAO,CAAC,CAAC,MAAM,KAAK,EAAE;MACnCF,GAAG,CAACG,OAAO,CAAC,CAAC;MACb,OAAO,KAAK;IACd;IACA,OAAO,IAAI;EACb,CAAC,CAAC,OAAOC,KAAK,EAAE;IACdJ,GAAG,CAACK,OAAO,GAAGD,KAAK,CAAC;IACpBJ,GAAG,CAACG,OAAO,CAAC,CAAC;IACb,OAAO,KAAK;EACd;AACF,CAAC;;AAED;AACA,OAAO,MAAMG,iBAAiB,GAAGA,CAACJ,OAAsB,EAAEG,OAAkC,KAAW;EACrG,IAAI;IACF,MAAME,MAAM,GAAGL,OAAO,CAAC,CAAC;IACxB,IAAIK,MAAM,YAAYC,OAAO,EAAE,KAAKD,MAAM,CAACE,KAAK,CAAEL,KAAK,IAAKC,OAAO,GAAGD,KAAK,CAAC,CAAC;EAC/E,CAAC,CAAC,OAAOA,KAAK,EAAE;IACdC,OAAO,GAAGD,KAAK,CAAC;EAClB;AACF,CAAC;AAED,MAAMM,kBAAkB,GAAG,MAAOpC,KAAa,IAAoB;EACjE,IAAI,OAAOqC,SAAS,KAAK,WAAW,IAAI,CAACA,SAAS,CAACC,SAAS,EAAEC,SAAS,EAAE;IACvE,MAAM,IAAIC,KAAK,CAAC,kCAAkC,CAAC;EACrD;EACA,MAAMH,SAAS,CAACC,SAAS,CAACC,SAAS,CAACvC,KAAK,CAAC;AAC5C,CAAC;;AAED;AACA,OAAO,MAAMyC,iBAAiB,GAAG,MAAOC,MAAkB,IAAoB;EAC5E,IAAI,OAAOA,MAAM,CAACC,QAAQ,KAAK,QAAQ,EAAE;IACvC,MAAMP,kBAAkB,CAACM,MAAM,CAACC,QAAQ,CAAC;IACzC;EACF;EACA,MAAMD,MAAM,CAACE,QAAQ,CAAC,CAAC;AACzB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["nextChatCommandIndex","index","length","direction","isChatNearBottom","scrollHeight","scrollTop","clientHeight","threshold","restoredChatScrollTop","previousScrollTop","previousScrollHeight","nextScrollHeight","Math","max","runChatSubmission","run","clear","perform","restore","error","onError","reportChatFailure","result","Promise","catch","writeChatClipboard","value","navigator","clipboard","writeText","Error","executeChatAction","action","copyText","onSelect"],"sources":["chat/chat-behavior.ts"],"sourcesContent":["import type { ChatAction } from \"./types\";\n\nexport const nextChatCommandIndex = (index: number, length: number, direction: 1 | -1): number =>\n length <= 0 ? 0 : (index + direction + length) % length;\n\nexport const isChatNearBottom = (scrollHeight: number, scrollTop: number, clientHeight: number, threshold = 96): boolean =>\n scrollHeight - scrollTop - clientHeight <= threshold;\n\nexport const restoredChatScrollTop = (previousScrollTop: number, previousScrollHeight: number, nextScrollHeight: number): number =>\n Math.max(0, previousScrollTop + nextScrollHeight - previousScrollHeight);\n\nexport type ChatSubmissionRun = {\n /** Clears the controlled draft (and attachments) before the handler runs. */\n clear: () => void;\n /**\n * The application handler. A synchronous throw, a rejected promise, and a\n * `false` result all count as a rejected submission.\n */\n perform: () => boolean | void | Promise<boolean | void>;\n /** Restores the cleared draft (and attachments) after a rejected submission. */\n restore: () => void;\n onError?: (error: unknown) => void;\n};\n\n/**\n * Runs one composer submission with optimistic clearing. Resolves to `true`\n * when the handler accepted the submission. A synchronous throw is handled\n * exactly like a rejected promise so a controlled draft is never lost.\n */\nexport const runChatSubmission = async (run: ChatSubmissionRun): Promise<boolean> => {\n run.clear();\n try {\n if ((await run.perform()) === false) {\n run.restore();\n return false;\n }\n return true;\n } catch (error) {\n run.onError?.(error);\n run.restore();\n return false;\n }\n};\n\n/** Reports a handler failure without letting a synchronous throw escape. */\nexport const reportChatFailure = (perform: () => unknown, onError?: (error: unknown) => void): void => {\n try {\n const result = perform();\n if (result instanceof Promise) void result.catch((error) => onError?.(error));\n } catch (error) {\n onError?.(error);\n }\n};\n\nconst writeChatClipboard = async (value: string): Promise<void> => {\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.writeText) {\n throw new Error(\"Clipboard access is unavailable.\");\n }\n await navigator.clipboard.writeText(value);\n};\n\n/** Executes the one behavior guaranteed by the ChatAction contract. */\nexport const executeChatAction = async (action: ChatAction): Promise<void> => {\n if (typeof action.copyText === \"string\") {\n await writeChatClipboard(action.copyText);\n return;\n }\n await action.onSelect();\n};\n"],"mappings":"AAEA,OAAO,MAAMA,oBAAoB,GAAGA,CAACC,KAAa,EAAEC,MAAc,EAAEC,SAAiB,KACnFD,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAACD,KAAK,GAAGE,SAAS,GAAGD,MAAM,IAAIA,MAAM;AAEzD,OAAO,MAAME,gBAAgB,GAAGA,CAACC,YAAoB,EAAEC,SAAiB,EAAEC,YAAoB,EAAEC,SAAS,GAAG,EAAE,KAC5GH,YAAY,GAAGC,SAAS,GAAGC,YAAY,IAAIC,SAAS;AAEtD,OAAO,MAAMC,qBAAqB,GAAGA,CAACC,iBAAyB,EAAEC,oBAA4B,EAAEC,gBAAwB,KACrHC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEJ,iBAAiB,GAAGE,gBAAgB,GAAGD,oBAAoB,CAAC;AAe1E;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMI,iBAAiB,GAAG,MAAOC,GAAsB,IAAuB;EACnFA,GAAG,CAACC,KAAK,CAAC,CAAC;EACX,IAAI;IACF,IAAI,CAAC,MAAMD,GAAG,CAACE,OAAO,CAAC,CAAC,MAAM,KAAK,EAAE;MACnCF,GAAG,CAACG,OAAO,CAAC,CAAC;MACb,OAAO,KAAK;IACd;IACA,OAAO,IAAI;EACb,CAAC,CAAC,OAAOC,KAAK,EAAE;IACdJ,GAAG,CAACK,OAAO,GAAGD,KAAK,CAAC;IACpBJ,GAAG,CAACG,OAAO,CAAC,CAAC;IACb,OAAO,KAAK;EACd;AACF,CAAC;;AAED;AACA,OAAO,MAAMG,iBAAiB,GAAGA,CAACJ,OAAsB,EAAEG,OAAkC,KAAW;EACrG,IAAI;IACF,MAAME,MAAM,GAAGL,OAAO,CAAC,CAAC;IACxB,IAAIK,MAAM,YAAYC,OAAO,EAAE,KAAKD,MAAM,CAACE,KAAK,CAAEL,KAAK,IAAKC,OAAO,GAAGD,KAAK,CAAC,CAAC;EAC/E,CAAC,CAAC,OAAOA,KAAK,EAAE;IACdC,OAAO,GAAGD,KAAK,CAAC;EAClB;AACF,CAAC;AAED,MAAMM,kBAAkB,GAAG,MAAOC,KAAa,IAAoB;EACjE,IAAI,OAAOC,SAAS,KAAK,WAAW,IAAI,CAACA,SAAS,CAACC,SAAS,EAAEC,SAAS,EAAE;IACvE,MAAM,IAAIC,KAAK,CAAC,kCAAkC,CAAC;EACrD;EACA,MAAMH,SAAS,CAACC,SAAS,CAACC,SAAS,CAACH,KAAK,CAAC;AAC5C,CAAC;;AAED;AACA,OAAO,MAAMK,iBAAiB,GAAG,MAAOC,MAAkB,IAAoB;EAC5E,IAAI,OAAOA,MAAM,CAACC,QAAQ,KAAK,QAAQ,EAAE;IACvC,MAAMR,kBAAkB,CAACO,MAAM,CAACC,QAAQ,CAAC;IACzC;EACF;EACA,MAAMD,MAAM,CAACE,QAAQ,CAAC,CAAC;AACzB,CAAC","ignoreList":[]}
@@ -0,0 +1,55 @@
1
+ /** Only the token at the caret; URLs, paths and inline/fenced code are ordinary text. */
2
+ export function chatCommandQuery(text, caret, selectionEnd = caret) {
3
+ if (caret !== selectionEnd) return null;
4
+ const before = text.slice(0, caret);
5
+ if ((before.match(/`/g)?.length ?? 0) % 2) return null;
6
+ const match = /(?:^|[\s(])\/([^\n/`]*)$/.exec(before);
7
+ if (!match) return null;
8
+ return {
9
+ start: caret - match[1].length - 1,
10
+ end: caret,
11
+ query: match[1]
12
+ };
13
+ }
14
+
15
+ /** An edit inside a mention removes its identity; edits around it shift the range. */
16
+ export function reconcileChatMentions(before, after, mentions) {
17
+ if (before === after) return [...mentions];
18
+ let start = 0;
19
+ while (start < before.length && start < after.length && before[start] === after[start]) start++;
20
+ let oldEnd = before.length,
21
+ newEnd = after.length;
22
+ while (oldEnd > start && newEnd > start && before[oldEnd - 1] === after[newEnd - 1]) {
23
+ oldEnd--;
24
+ newEnd--;
25
+ }
26
+ return mentions.flatMap(mention => {
27
+ if (mention.end <= start) return [mention];
28
+ if (mention.start >= oldEnd) return [{
29
+ ...mention,
30
+ start: mention.start + newEnd - oldEnd,
31
+ end: mention.end + newEnd - oldEnd
32
+ }];
33
+ return [];
34
+ });
35
+ }
36
+ export function chatMentionSegments(text, mentions) {
37
+ const segments = [];
38
+ let offset = 0;
39
+ for (const mention of [...mentions].sort((a, b) => a.start - b.start)) {
40
+ if (mention.start < offset || mention.end > text.length || mention.start >= mention.end) continue;
41
+ segments.push({
42
+ text: text.slice(offset, mention.start)
43
+ });
44
+ segments.push({
45
+ text: text.slice(mention.start, mention.end),
46
+ mention
47
+ });
48
+ offset = mention.end;
49
+ }
50
+ segments.push({
51
+ text: text.slice(offset)
52
+ });
53
+ return segments;
54
+ }
55
+ //# sourceMappingURL=composer-document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["chatCommandQuery","text","caret","selectionEnd","before","slice","match","length","exec","start","end","query","reconcileChatMentions","after","mentions","oldEnd","newEnd","flatMap","mention","chatMentionSegments","segments","offset","sort","a","b","push"],"sources":["chat/composer-document.ts"],"sourcesContent":["import type { ChatMention } from \"./types\";\n\nexport type ChatCommandQuery = { start: number; end: number; query: string };\n\n/** Only the token at the caret; URLs, paths and inline/fenced code are ordinary text. */\nexport function chatCommandQuery(text: string, caret: number, selectionEnd = caret): ChatCommandQuery | null {\n if (caret !== selectionEnd) return null;\n const before = text.slice(0, caret);\n if ((before.match(/`/g)?.length ?? 0) % 2) return null;\n const match = /(?:^|[\\s(])\\/([^\\n/`]*)$/.exec(before);\n if (!match) return null;\n return { start: caret - match[1]!.length - 1, end: caret, query: match[1]! };\n}\n\n/** An edit inside a mention removes its identity; edits around it shift the range. */\nexport function reconcileChatMentions(before: string, after: string, mentions: readonly ChatMention[]): ChatMention[] {\n if (before === after) return [...mentions];\n let start = 0;\n while (start < before.length && start < after.length && before[start] === after[start]) start++;\n let oldEnd = before.length,\n newEnd = after.length;\n while (oldEnd > start && newEnd > start && before[oldEnd - 1] === after[newEnd - 1]) {\n oldEnd--;\n newEnd--;\n }\n return mentions.flatMap((mention) => {\n if (mention.end <= start) return [mention];\n if (mention.start >= oldEnd) return [{ ...mention, start: mention.start + newEnd - oldEnd, end: mention.end + newEnd - oldEnd }];\n return [];\n });\n}\n\nexport function chatMentionSegments(text: string, mentions: readonly ChatMention[]) {\n const segments: { text: string; mention?: ChatMention }[] = [];\n let offset = 0;\n for (const mention of [...mentions].sort((a, b) => a.start - b.start)) {\n if (mention.start < offset || mention.end > text.length || mention.start >= mention.end) continue;\n segments.push({ text: text.slice(offset, mention.start) });\n segments.push({ text: text.slice(mention.start, mention.end), mention });\n offset = mention.end;\n }\n segments.push({ text: text.slice(offset) });\n return segments;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,5 @@
1
+ import { ChatContextPopup } from "./ChatContextPopup";
2
+ import { ChatTasks } from "./ChatTasks";
1
3
  import { ChatComposer } from "./ChatComposer";
2
4
  import { ChatActivity, ChatContextUsage, ChatMessage } from "./ChatPrimitives";
3
5
  import { ChatRoot } from "./ChatRoot";
@@ -8,10 +10,13 @@ export { formatChatTokens } from "./ChatPrimitives";
8
10
  * authorization, rich message rendering, and domain actions.
9
11
  */
10
12
  export const Chat = Object.assign(ChatRoot, {
13
+ Tasks: ChatTasks,
11
14
  Timeline: ChatTimeline,
12
15
  Message: ChatMessage,
13
16
  Activity: ChatActivity,
14
17
  Composer: ChatComposer,
15
- ContextUsage: ChatContextUsage
18
+ ContextUsage: ChatContextUsage,
19
+ ContextPopup: ChatContextPopup
16
20
  });
21
+ export { reconcileChatMentions } from "./composer-document";
17
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["ChatComposer","ChatActivity","ChatContextUsage","ChatMessage","ChatRoot","ChatTimeline","formatChatTokens","Chat","Object","assign","Timeline","Message","Activity","Composer","ContextUsage"],"sources":["chat/index.ts"],"sourcesContent":["import { ChatComposer } from \"./ChatComposer\";\nimport { ChatActivity, ChatContextUsage, ChatMessage } from \"./ChatPrimitives\";\nimport { ChatRoot } from \"./ChatRoot\";\nimport { ChatTimeline } from \"./ChatTimeline\";\n\nexport type { ChatCommand, ChatCommandContext, ChatComposerProps, ChatFileSelection, ChatPasteHandler } from \"./ChatComposer\";\nexport type { ChatActivityProps, ChatContextUsageProps, ChatMessageProps } from \"./ChatPrimitives\";\nexport { formatChatTokens } from \"./ChatPrimitives\";\nexport type { ChatRootProps } from \"./ChatRoot\";\nexport type { ChatActivityItem, ChatMessageItem, ChatTimelineItem, ChatTimelineProps } from \"./ChatTimeline\";\nexport type {\n ChatAction,\n ChatActivityTone,\n ChatAttachment,\n ChatComposerState,\n ChatContextUsageData,\n ChatMessageStatus,\n ChatModelOption,\n ChatRole,\n ChatSubmitInput,\n ChatSubmitIntent,\n ChatUsage,\n} from \"./types\";\n\n/**\n * Portable, controlled chat surface. Applications own storage, streaming,\n * authorization, rich message rendering, and domain actions.\n */\nexport const Chat = Object.assign(ChatRoot, {\n Timeline: ChatTimeline,\n Message: ChatMessage,\n Activity: ChatActivity,\n Composer: ChatComposer,\n ContextUsage: ChatContextUsage,\n});\n"],"mappings":"AAAA,SAASA,YAAY,QAAQ,gBAAgB;AAC7C,SAASC,YAAY,EAAEC,gBAAgB,EAAEC,WAAW,QAAQ,kBAAkB;AAC9E,SAASC,QAAQ,QAAQ,YAAY;AACrC,SAASC,YAAY,QAAQ,gBAAgB;AAI7C,SAASC,gBAAgB,QAAQ,kBAAkB;AAiBnD;AACA;AACA;AACA;AACA,OAAO,MAAMC,IAAI,GAAGC,MAAM,CAACC,MAAM,CAACL,QAAQ,EAAE;EAC1CM,QAAQ,EAAEL,YAAY;EACtBM,OAAO,EAAER,WAAW;EACpBS,QAAQ,EAAEX,YAAY;EACtBY,QAAQ,EAAEb,YAAY;EACtBc,YAAY,EAAEZ;AAChB,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["ChatContextPopup","ChatTasks","ChatComposer","ChatActivity","ChatContextUsage","ChatMessage","ChatRoot","ChatTimeline","formatChatTokens","Chat","Object","assign","Tasks","Timeline","Message","Activity","Composer","ContextUsage","ContextPopup","reconcileChatMentions"],"sources":["chat/index.ts"],"sourcesContent":["export type { ChatContextPopupProps } from \"./ChatContextPopup\";\n\nimport { ChatContextPopup } from \"./ChatContextPopup\";\nimport { ChatTasks } from \"./ChatTasks\";\n\nexport type { ChatTask, ChatTasksProps } from \"./ChatTasks\";\n\nimport { ChatComposer } from \"./ChatComposer\";\nimport { ChatActivity, ChatContextUsage, ChatMessage } from \"./ChatPrimitives\";\nimport { ChatRoot } from \"./ChatRoot\";\nimport { ChatTimeline } from \"./ChatTimeline\";\n\nexport type { ChatCommand, ChatCommandContext, ChatComposerProps, ChatFileSelection, ChatPasteHandler } from \"./ChatComposer\";\nexport type { ChatActivityProps, ChatContextUsageProps, ChatMessageProps } from \"./ChatPrimitives\";\nexport { formatChatTokens } from \"./ChatPrimitives\";\nexport type { ChatRootProps } from \"./ChatRoot\";\nexport type { ChatActivityItem, ChatMessageItem, ChatTimelineItem, ChatTimelineProps } from \"./ChatTimeline\";\nexport type {\n ChatAction,\n ChatActivityTone,\n ChatAttachment,\n ChatComposerState,\n ChatContextUsageData,\n ChatMention,\n ChatMessageStatus,\n ChatModelOption,\n ChatRole,\n ChatSubmitInput,\n ChatSubmitIntent,\n ChatUsage,\n} from \"./types\";\n\n/**\n * Portable, controlled chat surface. Applications own storage, streaming,\n * authorization, rich message rendering, and domain actions.\n */\nexport const Chat = Object.assign(ChatRoot, {\n Tasks: ChatTasks,\n Timeline: ChatTimeline,\n Message: ChatMessage,\n Activity: ChatActivity,\n Composer: ChatComposer,\n ContextUsage: ChatContextUsage,\n ContextPopup: ChatContextPopup,\n});\n\nexport { reconcileChatMentions } from \"./composer-document\";\n"],"mappings":"AAEA,SAASA,gBAAgB,QAAQ,oBAAoB;AACrD,SAASC,SAAS,QAAQ,aAAa;AAIvC,SAASC,YAAY,QAAQ,gBAAgB;AAC7C,SAASC,YAAY,EAAEC,gBAAgB,EAAEC,WAAW,QAAQ,kBAAkB;AAC9E,SAASC,QAAQ,QAAQ,YAAY;AACrC,SAASC,YAAY,QAAQ,gBAAgB;AAI7C,SAASC,gBAAgB,QAAQ,kBAAkB;AAkBnD;AACA;AACA;AACA;AACA,OAAO,MAAMC,IAAI,GAAGC,MAAM,CAACC,MAAM,CAACL,QAAQ,EAAE;EAC1CM,KAAK,EAAEX,SAAS;EAChBY,QAAQ,EAAEN,YAAY;EACtBO,OAAO,EAAET,WAAW;EACpBU,QAAQ,EAAEZ,YAAY;EACtBa,QAAQ,EAAEd,YAAY;EACtBe,YAAY,EAAEb,gBAAgB;EAC9Bc,YAAY,EAAElB;AAChB,CAAC,CAAC;AAEF,SAASmB,qBAAqB,QAAQ,qBAAqB","ignoreList":[]}