@k2b/ui 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) 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 +10 -4
  6. package/dist/browser/actions/Dropdown.js.map +1 -1
  7. package/dist/browser/actions/FilterChip.js +16 -2
  8. package/dist/browser/actions/FilterChip.js.map +1 -1
  9. package/dist/browser/actions/SplitButton.js +69 -22
  10. package/dist/browser/actions/SplitButton.js.map +1 -1
  11. package/dist/browser/actions/SpotlightSearch.js +3 -7
  12. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  13. package/dist/browser/actions/Tabs.js +132 -47
  14. package/dist/browser/actions/Tabs.js.map +1 -1
  15. package/dist/browser/actions/index.js +1 -1
  16. package/dist/browser/actions/index.js.map +1 -1
  17. package/dist/browser/chat/ChatComposer.js +751 -423
  18. package/dist/browser/chat/ChatComposer.js.map +1 -1
  19. package/dist/browser/chat/ChatContextPopup.js +123 -0
  20. package/dist/browser/chat/ChatContextPopup.js.map +1 -0
  21. package/dist/browser/chat/ChatPrimitives.js +143 -77
  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 +34 -15
  26. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  27. package/dist/browser/chat/chat-behavior.js +0 -5
  28. package/dist/browser/chat/chat-behavior.js.map +1 -1
  29. package/dist/browser/chat/composer-document.js +55 -0
  30. package/dist/browser/chat/composer-document.js.map +1 -0
  31. package/dist/browser/chat/index.js +6 -1
  32. package/dist/browser/chat/index.js.map +1 -1
  33. package/dist/browser/chat/types.js.map +1 -1
  34. package/dist/browser/content/Chart.js +148 -239
  35. package/dist/browser/content/Chart.js.map +1 -1
  36. package/dist/browser/content/ChartExplorer.js +324 -0
  37. package/dist/browser/content/ChartExplorer.js.map +1 -0
  38. package/dist/browser/content/ChartExplorerControls.js +153 -0
  39. package/dist/browser/content/ChartExplorerControls.js.map +1 -0
  40. package/dist/browser/content/ChartFilterControls.js +200 -0
  41. package/dist/browser/content/ChartFilterControls.js.map +1 -0
  42. package/dist/browser/content/ChartSnapshotView.js +113 -0
  43. package/dist/browser/content/ChartSnapshotView.js.map +1 -0
  44. package/dist/browser/content/DataTable.js +48 -32
  45. package/dist/browser/content/DataTable.js.map +1 -1
  46. package/dist/browser/content/FileBrowser.js +3 -0
  47. package/dist/browser/content/FileBrowser.js.map +1 -1
  48. package/dist/browser/content/FileGrid.js +93 -0
  49. package/dist/browser/content/FileGrid.js.map +1 -0
  50. package/dist/browser/content/FileTree.js +2 -2
  51. package/dist/browser/content/FileTree.js.map +1 -1
  52. package/dist/browser/content/FileView.js +507 -162
  53. package/dist/browser/content/FileView.js.map +1 -1
  54. package/dist/browser/content/MarkdownView.js +20 -3
  55. package/dist/browser/content/MarkdownView.js.map +1 -1
  56. package/dist/browser/content/PdfPreview.js +107 -90
  57. package/dist/browser/content/PdfPreview.js.map +1 -1
  58. package/dist/browser/content/chart-cursor.js +33 -0
  59. package/dist/browser/content/chart-cursor.js.map +1 -0
  60. package/dist/browser/content/chart-explorer.js +147 -0
  61. package/dist/browser/content/chart-explorer.js.map +1 -0
  62. package/dist/browser/content/chart-inspection.js +447 -0
  63. package/dist/browser/content/chart-inspection.js.map +1 -0
  64. package/dist/browser/content/chart-line-gaps.js +53 -0
  65. package/dist/browser/content/chart-line-gaps.js.map +1 -0
  66. package/dist/browser/content/chart-map-viewport.js +5 -1
  67. package/dist/browser/content/chart-map-viewport.js.map +1 -1
  68. package/dist/browser/content/chart-snapshot.js +63 -0
  69. package/dist/browser/content/chart-snapshot.js.map +1 -0
  70. package/dist/browser/content/chart-state-timeline.js +32 -4
  71. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  72. package/dist/browser/content/chart-svg.js +54 -0
  73. package/dist/browser/content/chart-svg.js.map +1 -0
  74. package/dist/browser/content/collection-selection.js +109 -0
  75. package/dist/browser/content/collection-selection.js.map +1 -0
  76. package/dist/browser/content/delimited-preferences.js +21 -0
  77. package/dist/browser/content/delimited-preferences.js.map +1 -0
  78. package/dist/browser/content/file-tree.js.map +1 -1
  79. package/dist/browser/content/file-view-preview.js +11 -7
  80. package/dist/browser/content/file-view-preview.js.map +1 -1
  81. package/dist/browser/content/index.js +9 -0
  82. package/dist/browser/content/index.js.map +1 -1
  83. package/dist/browser/feedback/InlineGuidance.js +17 -3
  84. package/dist/browser/feedback/InlineGuidance.js.map +1 -1
  85. package/dist/browser/feedback/Tooltip.js +6 -2
  86. package/dist/browser/feedback/Tooltip.js.map +1 -1
  87. package/dist/browser/feedback/dialog-core.js +102 -9
  88. package/dist/browser/feedback/dialog-core.js.map +1 -1
  89. package/dist/browser/feedback/prompts.js +6 -0
  90. package/dist/browser/feedback/prompts.js.map +1 -1
  91. package/dist/browser/feedback/toast.js +29 -6
  92. package/dist/browser/feedback/toast.js.map +1 -1
  93. package/dist/browser/feedback/tooltip-position.js +15 -0
  94. package/dist/browser/feedback/tooltip-position.js.map +1 -1
  95. package/dist/browser/inputs/ChoiceInputs.js +47 -38
  96. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  97. package/dist/browser/inputs/SelectChip.js +3 -2
  98. package/dist/browser/inputs/SelectChip.js.map +1 -1
  99. package/dist/browser/inputs/TextInput.js +7 -1
  100. package/dist/browser/inputs/TextInput.js.map +1 -1
  101. package/dist/browser/inputs/markdown/MarkdownEditor.js +61 -37
  102. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  103. package/dist/browser/internal/portal.js +1 -1
  104. package/dist/browser/internal/portal.js.map +1 -1
  105. package/dist/browser/intl/Format.js +89 -16
  106. package/dist/browser/intl/Format.js.map +1 -1
  107. package/dist/browser/intl/index.js.map +1 -1
  108. package/dist/browser/intl/messages.js +130 -2
  109. package/dist/browser/intl/messages.js.map +1 -1
  110. package/dist/browser/layout/AppWorkspace.js +712 -624
  111. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  112. package/dist/browser/layout/BottomSheet.js +95 -0
  113. package/dist/browser/layout/BottomSheet.js.map +1 -0
  114. package/dist/browser/layout/DetailPanel.js +232 -107
  115. package/dist/browser/layout/DetailPanel.js.map +1 -1
  116. package/dist/browser/layout/Navigation.js +278 -0
  117. package/dist/browser/layout/Navigation.js.map +1 -0
  118. package/dist/browser/layout/PanelDialog.js +229 -72
  119. package/dist/browser/layout/PanelDialog.js.map +1 -1
  120. package/dist/browser/layout/ScrollArea.js +21 -1
  121. package/dist/browser/layout/ScrollArea.js.map +1 -1
  122. package/dist/browser/layout/Settings.js.map +1 -1
  123. package/dist/browser/layout/SidebarItemPreview.js +183 -0
  124. package/dist/browser/layout/SidebarItemPreview.js.map +1 -0
  125. package/dist/browser/layout/app-workspace-controller.js +3 -0
  126. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  127. package/dist/browser/layout/index.js +3 -0
  128. package/dist/browser/layout/index.js.map +1 -1
  129. package/dist/browser/layout/navigation-model.js +23 -0
  130. package/dist/browser/layout/navigation-model.js.map +1 -0
  131. package/dist/browser/layout/scroll-fade.js +100 -0
  132. package/dist/browser/layout/scroll-fade.js.map +1 -0
  133. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  134. package/dist/browser/surfaces/StatusBadge.js +2 -1
  135. package/dist/browser/surfaces/StatusBadge.js.map +1 -1
  136. package/dist/fonts/ibm-plex-mono-cyrillic-400-italic-4aded3f2f2a7d27d.woff2 +0 -0
  137. package/dist/fonts/ibm-plex-mono-cyrillic-400-normal-7635422bd10ddbbc.woff2 +0 -0
  138. package/dist/fonts/ibm-plex-mono-cyrillic-500-normal-1d89462e86cb8e87.woff2 +0 -0
  139. package/dist/fonts/ibm-plex-mono-cyrillic-600-normal-2b05a8695c7f9f4a.woff2 +0 -0
  140. package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-italic-a0b3b8cbe5a516e7.woff2 +0 -0
  141. package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-normal-f8c22ec1804bd696.woff2 +0 -0
  142. package/dist/fonts/ibm-plex-mono-cyrillic-ext-500-normal-3febe5c7f22e4b07.woff2 +0 -0
  143. package/dist/fonts/ibm-plex-mono-cyrillic-ext-600-normal-83109cdd4f8665b4.woff2 +0 -0
  144. package/dist/fonts/ibm-plex-mono-latin-400-italic-0840095faae86403.woff2 +0 -0
  145. package/dist/fonts/ibm-plex-mono-latin-400-normal-08949f728dc52d52.woff2 +0 -0
  146. package/dist/fonts/ibm-plex-mono-latin-500-normal-01d285447409c8a5.woff2 +0 -0
  147. package/dist/fonts/ibm-plex-mono-latin-600-normal-0d1f0b8d0722224e.woff2 +0 -0
  148. package/dist/fonts/ibm-plex-mono-latin-ext-400-italic-1b07eee6df7d26b3.woff2 +0 -0
  149. package/dist/fonts/ibm-plex-mono-latin-ext-400-normal-6bc0f226a5b7884a.woff2 +0 -0
  150. package/dist/fonts/ibm-plex-mono-latin-ext-500-normal-6bb06407c97584b0.woff2 +0 -0
  151. package/dist/fonts/ibm-plex-mono-latin-ext-600-normal-32057cf50dd14bdb.woff2 +0 -0
  152. package/dist/fonts/ibm-plex-mono-vietnamese-400-italic-a6bab38af4f9c761.woff2 +0 -0
  153. package/dist/fonts/ibm-plex-mono-vietnamese-400-normal-62632b6375305e70.woff2 +0 -0
  154. package/dist/fonts/ibm-plex-mono-vietnamese-500-normal-781633d95de88040.woff2 +0 -0
  155. package/dist/fonts/ibm-plex-mono-vietnamese-600-normal-51b74d53e106ba8a.woff2 +0 -0
  156. package/dist/fonts/ibm-plex-sans-cyrillic-400-italic-e8731a7e2b00fc4f.woff2 +0 -0
  157. package/dist/fonts/ibm-plex-sans-cyrillic-400-normal-69afad88a0740b6e.woff2 +0 -0
  158. package/dist/fonts/ibm-plex-sans-cyrillic-500-normal-200be3a2a6b1789f.woff2 +0 -0
  159. package/dist/fonts/ibm-plex-sans-cyrillic-600-normal-730becc6f005c18c.woff2 +0 -0
  160. package/dist/fonts/ibm-plex-sans-cyrillic-700-normal-40540598b4c9eb2c.woff2 +0 -0
  161. package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-italic-4ffb25726a7ce4cc.woff2 +0 -0
  162. package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-normal-e2580ad78906551e.woff2 +0 -0
  163. package/dist/fonts/ibm-plex-sans-cyrillic-ext-500-normal-08578d906af6d986.woff2 +0 -0
  164. package/dist/fonts/ibm-plex-sans-cyrillic-ext-600-normal-d60d3d0b182753d5.woff2 +0 -0
  165. package/dist/fonts/ibm-plex-sans-cyrillic-ext-700-normal-d07dd53642480097.woff2 +0 -0
  166. package/dist/fonts/ibm-plex-sans-greek-400-italic-1bc10b01688ba9fa.woff2 +0 -0
  167. package/dist/fonts/ibm-plex-sans-greek-400-normal-02296067bc904d2a.woff2 +0 -0
  168. package/dist/fonts/ibm-plex-sans-greek-500-normal-8cb6e20b4dbbaa5f.woff2 +0 -0
  169. package/dist/fonts/ibm-plex-sans-greek-600-normal-0a9ebd9019415ee9.woff2 +0 -0
  170. package/dist/fonts/ibm-plex-sans-greek-700-normal-c949641d10a3bebc.woff2 +0 -0
  171. package/dist/fonts/ibm-plex-sans-latin-400-italic-6de912e531b6c980.woff2 +0 -0
  172. package/dist/fonts/ibm-plex-sans-latin-400-normal-3b646991d30055a9.woff2 +0 -0
  173. package/dist/fonts/ibm-plex-sans-latin-500-normal-0717336fb31fcdcd.woff2 +0 -0
  174. package/dist/fonts/ibm-plex-sans-latin-600-normal-8960851d691c054e.woff2 +0 -0
  175. package/dist/fonts/ibm-plex-sans-latin-700-normal-42e7b0c143c19df9.woff2 +0 -0
  176. package/dist/fonts/ibm-plex-sans-latin-ext-400-italic-c5c00e8a32022dfe.woff2 +0 -0
  177. package/dist/fonts/ibm-plex-sans-latin-ext-400-normal-c93d2a12aaa280f6.woff2 +0 -0
  178. package/dist/fonts/ibm-plex-sans-latin-ext-500-normal-2846035d85100f84.woff2 +0 -0
  179. package/dist/fonts/ibm-plex-sans-latin-ext-600-normal-b25dfd4f979e442a.woff2 +0 -0
  180. package/dist/fonts/ibm-plex-sans-latin-ext-700-normal-92f0392bd74fa395.woff2 +0 -0
  181. package/dist/fonts/ibm-plex-sans-vietnamese-400-italic-675d4bace127bffb.woff2 +0 -0
  182. package/dist/fonts/ibm-plex-sans-vietnamese-400-normal-771538f7f26551bd.woff2 +0 -0
  183. package/dist/fonts/ibm-plex-sans-vietnamese-500-normal-85ba3d9c2488a813.woff2 +0 -0
  184. package/dist/fonts/ibm-plex-sans-vietnamese-600-normal-5d34b803637befe3.woff2 +0 -0
  185. package/dist/fonts/ibm-plex-sans-vietnamese-700-normal-b79d0c4b68b85007.woff2 +0 -0
  186. package/dist/plex.css +1 -1
  187. package/dist/ssr/actions/Button.js +11 -2
  188. package/dist/ssr/actions/Button.js.map +1 -1
  189. package/dist/ssr/actions/Disclosure.js +2 -2
  190. package/dist/ssr/actions/Disclosure.js.map +1 -1
  191. package/dist/ssr/actions/Dropdown.js +5 -2
  192. package/dist/ssr/actions/Dropdown.js.map +1 -1
  193. package/dist/ssr/actions/FilterChip.js +16 -2
  194. package/dist/ssr/actions/FilterChip.js.map +1 -1
  195. package/dist/ssr/actions/SplitButton.js +69 -22
  196. package/dist/ssr/actions/SplitButton.js.map +1 -1
  197. package/dist/ssr/actions/SpotlightSearch.js +3 -7
  198. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  199. package/dist/ssr/actions/Tabs.js +58 -11
  200. package/dist/ssr/actions/Tabs.js.map +1 -1
  201. package/dist/ssr/actions/index.js +1 -1
  202. package/dist/ssr/actions/index.js.map +1 -1
  203. package/dist/ssr/chat/ChatComposer.js +366 -134
  204. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  205. package/dist/ssr/chat/ChatContextPopup.js +86 -0
  206. package/dist/ssr/chat/ChatContextPopup.js.map +1 -0
  207. package/dist/ssr/chat/ChatPrimitives.js +50 -12
  208. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  209. package/dist/ssr/chat/ChatTasks.js +48 -0
  210. package/dist/ssr/chat/ChatTasks.js.map +1 -0
  211. package/dist/ssr/chat/ChatTimeline.js +16 -4
  212. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  213. package/dist/ssr/chat/chat-behavior.js +0 -5
  214. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  215. package/dist/ssr/chat/composer-document.js +55 -0
  216. package/dist/ssr/chat/composer-document.js.map +1 -0
  217. package/dist/ssr/chat/index.js +6 -1
  218. package/dist/ssr/chat/index.js.map +1 -1
  219. package/dist/ssr/chat/types.js.map +1 -1
  220. package/dist/ssr/content/Chart.js +121 -219
  221. package/dist/ssr/content/Chart.js.map +1 -1
  222. package/dist/ssr/content/ChartExplorer.js +257 -0
  223. package/dist/ssr/content/ChartExplorer.js.map +1 -0
  224. package/dist/ssr/content/ChartExplorerControls.js +105 -0
  225. package/dist/ssr/content/ChartExplorerControls.js.map +1 -0
  226. package/dist/ssr/content/ChartFilterControls.js +139 -0
  227. package/dist/ssr/content/ChartFilterControls.js.map +1 -0
  228. package/dist/ssr/content/ChartSnapshotView.js +57 -0
  229. package/dist/ssr/content/ChartSnapshotView.js.map +1 -0
  230. package/dist/ssr/content/DataTable.js +13 -9
  231. package/dist/ssr/content/DataTable.js.map +1 -1
  232. package/dist/ssr/content/FileBrowser.js +3 -0
  233. package/dist/ssr/content/FileBrowser.js.map +1 -1
  234. package/dist/ssr/content/FileGrid.js +38 -0
  235. package/dist/ssr/content/FileGrid.js.map +1 -0
  236. package/dist/ssr/content/FileTree.js +2 -2
  237. package/dist/ssr/content/FileTree.js.map +1 -1
  238. package/dist/ssr/content/FileView.js +352 -75
  239. package/dist/ssr/content/FileView.js.map +1 -1
  240. package/dist/ssr/content/MarkdownView.js +20 -3
  241. package/dist/ssr/content/MarkdownView.js.map +1 -1
  242. package/dist/ssr/content/PdfPreview.js +37 -24
  243. package/dist/ssr/content/PdfPreview.js.map +1 -1
  244. package/dist/ssr/content/chart-cursor.js +33 -0
  245. package/dist/ssr/content/chart-cursor.js.map +1 -0
  246. package/dist/ssr/content/chart-explorer.js +147 -0
  247. package/dist/ssr/content/chart-explorer.js.map +1 -0
  248. package/dist/ssr/content/chart-inspection.js +447 -0
  249. package/dist/ssr/content/chart-inspection.js.map +1 -0
  250. package/dist/ssr/content/chart-line-gaps.js +53 -0
  251. package/dist/ssr/content/chart-line-gaps.js.map +1 -0
  252. package/dist/ssr/content/chart-map-viewport.js +5 -1
  253. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  254. package/dist/ssr/content/chart-snapshot.js +63 -0
  255. package/dist/ssr/content/chart-snapshot.js.map +1 -0
  256. package/dist/ssr/content/chart-state-timeline.js +32 -4
  257. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  258. package/dist/ssr/content/chart-svg.js +54 -0
  259. package/dist/ssr/content/chart-svg.js.map +1 -0
  260. package/dist/ssr/content/collection-selection.js +109 -0
  261. package/dist/ssr/content/collection-selection.js.map +1 -0
  262. package/dist/ssr/content/delimited-preferences.js +21 -0
  263. package/dist/ssr/content/delimited-preferences.js.map +1 -0
  264. package/dist/ssr/content/file-tree.js.map +1 -1
  265. package/dist/ssr/content/file-view-preview.js +11 -7
  266. package/dist/ssr/content/file-view-preview.js.map +1 -1
  267. package/dist/ssr/content/index.js +9 -0
  268. package/dist/ssr/content/index.js.map +1 -1
  269. package/dist/ssr/feedback/InlineGuidance.js +17 -3
  270. package/dist/ssr/feedback/InlineGuidance.js.map +1 -1
  271. package/dist/ssr/feedback/Tooltip.js +6 -4
  272. package/dist/ssr/feedback/Tooltip.js.map +1 -1
  273. package/dist/ssr/feedback/dialog-core.js +102 -9
  274. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  275. package/dist/ssr/feedback/prompts.js +6 -0
  276. package/dist/ssr/feedback/prompts.js.map +1 -1
  277. package/dist/ssr/feedback/toast.js +29 -6
  278. package/dist/ssr/feedback/toast.js.map +1 -1
  279. package/dist/ssr/feedback/tooltip-position.js +15 -0
  280. package/dist/ssr/feedback/tooltip-position.js.map +1 -1
  281. package/dist/ssr/inputs/ChoiceInputs.js +9 -6
  282. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  283. package/dist/ssr/inputs/SelectChip.js +3 -3
  284. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  285. package/dist/ssr/inputs/TextInput.js.map +1 -1
  286. package/dist/ssr/inputs/markdown/MarkdownEditor.js +19 -11
  287. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  288. package/dist/ssr/internal/portal.js +1 -1
  289. package/dist/ssr/internal/portal.js.map +1 -1
  290. package/dist/ssr/intl/Format.js +61 -0
  291. package/dist/ssr/intl/Format.js.map +1 -1
  292. package/dist/ssr/intl/index.js.map +1 -1
  293. package/dist/ssr/intl/messages.js +130 -2
  294. package/dist/ssr/intl/messages.js.map +1 -1
  295. package/dist/ssr/layout/AppWorkspace.js +368 -275
  296. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  297. package/dist/ssr/layout/BottomSheet.js +43 -0
  298. package/dist/ssr/layout/BottomSheet.js.map +1 -0
  299. package/dist/ssr/layout/DetailPanel.js +95 -17
  300. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  301. package/dist/ssr/layout/Navigation.js +181 -0
  302. package/dist/ssr/layout/Navigation.js.map +1 -0
  303. package/dist/ssr/layout/PanelDialog.js +112 -27
  304. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  305. package/dist/ssr/layout/ScrollArea.js +16 -1
  306. package/dist/ssr/layout/ScrollArea.js.map +1 -1
  307. package/dist/ssr/layout/Settings.js.map +1 -1
  308. package/dist/ssr/layout/SidebarItemPreview.js +133 -0
  309. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -0
  310. package/dist/ssr/layout/app-workspace-controller.js +3 -0
  311. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  312. package/dist/ssr/layout/index.js +3 -0
  313. package/dist/ssr/layout/index.js.map +1 -1
  314. package/dist/ssr/layout/navigation-model.js +23 -0
  315. package/dist/ssr/layout/navigation-model.js.map +1 -0
  316. package/dist/ssr/layout/scroll-fade.js +100 -0
  317. package/dist/ssr/layout/scroll-fade.js.map +1 -0
  318. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  319. package/dist/ssr/surfaces/StatusBadge.js +2 -1
  320. package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
  321. package/dist/styles.css +1 -1
  322. package/dist/tabler.css +1 -1
  323. package/dist/types/actions/Button.d.ts +4 -0
  324. package/dist/types/actions/Disclosure.d.ts +1 -0
  325. package/dist/types/actions/Dropdown.d.ts +3 -1
  326. package/dist/types/actions/FilterChip.d.ts +4 -0
  327. package/dist/types/actions/SplitButton.d.ts +6 -0
  328. package/dist/types/actions/SpotlightSearch.d.ts +0 -4
  329. package/dist/types/actions/Tabs.d.ts +4 -0
  330. package/dist/types/actions/index.d.ts +1 -1
  331. package/dist/types/chat/ChatComposer.d.ts +20 -2
  332. package/dist/types/chat/ChatContextPopup.d.ts +6 -0
  333. package/dist/types/chat/ChatPrimitives.d.ts +4 -0
  334. package/dist/types/chat/ChatTasks.d.ts +15 -0
  335. package/dist/types/chat/ChatTimeline.d.ts +2 -0
  336. package/dist/types/chat/chat-behavior.d.ts +0 -3
  337. package/dist/types/chat/composer-document.d.ts +14 -0
  338. package/dist/types/chat/index.d.ts +8 -1
  339. package/dist/types/chat/types.d.ts +9 -0
  340. package/dist/types/content/Chart.d.ts +42 -23
  341. package/dist/types/content/ChartExplorer.d.ts +34 -0
  342. package/dist/types/content/ChartExplorerControls.d.ts +10 -0
  343. package/dist/types/content/ChartFilterControls.d.ts +21 -0
  344. package/dist/types/content/ChartSnapshotView.d.ts +11 -0
  345. package/dist/types/content/DataTable.d.ts +4 -0
  346. package/dist/types/content/FileBrowser.d.ts +1 -0
  347. package/dist/types/content/FileGrid.d.ts +21 -0
  348. package/dist/types/content/FileView.d.ts +20 -0
  349. package/dist/types/content/MarkdownView.d.ts +6 -1
  350. package/dist/types/content/PdfPreview.d.ts +8 -1
  351. package/dist/types/content/chart-cursor.d.ts +15 -0
  352. package/dist/types/content/chart-explorer.d.ts +48 -0
  353. package/dist/types/content/chart-inspection.d.ts +40 -0
  354. package/dist/types/content/chart-line-gaps.d.ts +5 -0
  355. package/dist/types/content/chart-map-viewport.d.ts +1 -1
  356. package/dist/types/content/chart-snapshot.d.ts +26 -0
  357. package/dist/types/content/chart-svg.d.ts +21 -0
  358. package/dist/types/content/collection-selection.d.ts +24 -0
  359. package/dist/types/content/delimited-preferences.d.ts +11 -0
  360. package/dist/types/content/file-tree.d.ts +2 -0
  361. package/dist/types/content/file-view-preview.d.ts +4 -1
  362. package/dist/types/content/index.d.ts +15 -1
  363. package/dist/types/feedback/InlineGuidance.d.ts +1 -0
  364. package/dist/types/feedback/dialog-core.d.ts +13 -0
  365. package/dist/types/feedback/prompts.d.ts +2 -0
  366. package/dist/types/feedback/toast.d.ts +7 -1
  367. package/dist/types/feedback/tooltip-position.d.ts +1 -1
  368. package/dist/types/inputs/ChoiceInputs.d.ts +3 -0
  369. package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -1
  370. package/dist/types/intl/Format.d.ts +9 -0
  371. package/dist/types/intl/index.d.ts +1 -1
  372. package/dist/types/intl/messages.d.ts +31 -1
  373. package/dist/types/layout/AppWorkspace.d.ts +35 -18
  374. package/dist/types/layout/BottomSheet.d.ts +23 -0
  375. package/dist/types/layout/DetailPanel.d.ts +7 -0
  376. package/dist/types/layout/Navigation.d.ts +8 -0
  377. package/dist/types/layout/PanelDialog.d.ts +14 -1
  378. package/dist/types/layout/ScrollArea.d.ts +4 -0
  379. package/dist/types/layout/Settings.d.ts +1 -1
  380. package/dist/types/layout/SidebarItemPreview.d.ts +11 -0
  381. package/dist/types/layout/index.d.ts +4 -1
  382. package/dist/types/layout/navigation-model.d.ts +48 -0
  383. package/dist/types/layout/scroll-fade.d.ts +3 -0
  384. package/dist/types/surfaces/DescriptionList.d.ts +1 -1
  385. package/dist/types/surfaces/StatusBadge.d.ts +1 -1
  386. package/package.json +8 -8
@@ -0,0 +1,112 @@
1
+ import { template as _$template } from "solid-js/web";
2
+ import { delegateEvents as _$delegateEvents } from "solid-js/web";
3
+ import { className as _$className } from "solid-js/web";
4
+ import { effect as _$effect } from "solid-js/web";
5
+ import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
6
+ import { getNextElement as _$getNextElement } from "solid-js/web";
7
+ import { getNextMarker as _$getNextMarker } from "solid-js/web";
8
+ import { insert as _$insert } from "solid-js/web";
9
+ import { createComponent as _$createComponent } from "solid-js/web";
10
+ import { memo as _$memo } from "solid-js/web";
11
+ import { setAttribute as _$setAttribute } from "solid-js/web";
12
+ var _tmpl$ = /*#__PURE__*/_$template(`<ol class=k2b-chat-tasks__list>`),
13
+ _tmpl$2 = /*#__PURE__*/_$template(`<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><!$><!/>`),
14
+ _tmpl$3 = /*#__PURE__*/_$template(`<span>`),
15
+ _tmpl$4 = /*#__PURE__*/_$template(`<li><i aria-hidden=true></i><span class=k2b-chat-tasks__content></span><span class=k2b-chat-tasks__status>`);
16
+ import { For, Show, createUniqueId } from "solid-js";
17
+ /** Presentation only. The host owns the plan and execution state. */
18
+ export function ChatTasks(props) {
19
+ const id = createUniqueId();
20
+ const active = () => props.items.find(item => item.status === "in_progress");
21
+ const icon = status => status === "completed" ? "ti ti-check" : status === "cancelled" ? "ti ti-minus" : status === "in_progress" ? "ti ti-wave-saw-tool" : "ti ti-circle";
22
+ return _$createComponent(Show, {
23
+ get when() {
24
+ return props.items.length;
25
+ },
26
+ get children() {
27
+ var _el$ = _$getNextElement(_tmpl$2),
28
+ _el$2 = _el$.firstChild,
29
+ _el$3 = _el$2.firstChild,
30
+ _el$4 = _el$3.nextSibling,
31
+ _el$5 = _el$4.firstChild,
32
+ [_el$6, _co$] = _$getNextMarker(_el$5.nextSibling),
33
+ _el$7 = _el$6.nextSibling,
34
+ [_el$8, _co$2] = _$getNextMarker(_el$7.nextSibling),
35
+ _el$9 = _el$4.nextSibling,
36
+ _el$0 = _el$9.nextSibling,
37
+ _el$1 = _el$0.nextSibling,
38
+ _el$11 = _el$2.nextSibling,
39
+ [_el$12, _co$3] = _$getNextMarker(_el$11.nextSibling);
40
+ _el$2.$$click = () => props.onOpenChange(!props.open);
41
+ _$setAttribute(_el$2, "aria-controls", id);
42
+ _$insert(_el$4, () => props.label, _el$6, _co$);
43
+ _$insert(_el$4, _$createComponent(Show, {
44
+ get when() {
45
+ return active();
46
+ },
47
+ get children() {
48
+ return [" \xB7 ", _$memo(() => active().content)];
49
+ }
50
+ }), _el$8, _co$2);
51
+ _$insert(_el$9, () => props.progressLabel);
52
+ _$insert(_el$0, _$createComponent(For, {
53
+ get each() {
54
+ return props.items;
55
+ },
56
+ children: item => (() => {
57
+ var _el$13 = _$getNextElement(_tmpl$3);
58
+ _$effect(() => _$setAttribute(_el$13, "data-status", item.status));
59
+ return _el$13;
60
+ })()
61
+ }));
62
+ _$insert(_el$, _$createComponent(Show, {
63
+ get when() {
64
+ return props.open;
65
+ },
66
+ get children() {
67
+ var _el$10 = _$getNextElement(_tmpl$);
68
+ _$setAttribute(_el$10, "id", id);
69
+ _$insert(_el$10, _$createComponent(For, {
70
+ get each() {
71
+ return props.items;
72
+ },
73
+ children: item => (() => {
74
+ var _el$14 = _$getNextElement(_tmpl$4),
75
+ _el$15 = _el$14.firstChild,
76
+ _el$16 = _el$15.nextSibling,
77
+ _el$17 = _el$16.nextSibling;
78
+ _$insert(_el$16, () => item.content);
79
+ _$insert(_el$17, () => props.statusLabels[item.status]);
80
+ _$effect(_p$ => {
81
+ var _v$3 = item.status,
82
+ _v$4 = icon(item.status);
83
+ _v$3 !== _p$.e && _$setAttribute(_el$14, "data-status", _p$.e = _v$3);
84
+ _v$4 !== _p$.t && _$className(_el$15, _p$.t = _v$4);
85
+ return _p$;
86
+ }, {
87
+ e: undefined,
88
+ t: undefined
89
+ });
90
+ return _el$14;
91
+ })()
92
+ }));
93
+ return _el$10;
94
+ }
95
+ }), _el$12, _co$3);
96
+ _$effect(_p$ => {
97
+ var _v$ = props.open,
98
+ _v$2 = props.open ? "ti ti-chevron-up" : "ti ti-chevron-down";
99
+ _v$ !== _p$.e && _$setAttribute(_el$2, "aria-expanded", _p$.e = _v$);
100
+ _v$2 !== _p$.t && _$className(_el$1, _p$.t = _v$2);
101
+ return _p$;
102
+ }, {
103
+ e: undefined,
104
+ t: undefined
105
+ });
106
+ _$runHydrationEvents();
107
+ return _el$;
108
+ }
109
+ });
110
+ }
111
+ _$delegateEvents(["click"]);
112
+ //# sourceMappingURL=ChatTasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["For","Show","createUniqueId","ChatTasks","props","id","active","items","find","item","status","icon","_$createComponent","when","length","children","_el$","_$getNextElement","_tmpl$2","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_co$","_$getNextMarker","_el$7","_el$8","_co$2","_el$9","_el$0","_el$1","_el$11","_el$12","_co$3","$$click","onOpenChange","open","_$setAttribute","_$insert","label","_$memo","content","progressLabel","each","_el$13","_tmpl$3","_$effect","_el$10","_tmpl$","_el$14","_tmpl$4","_el$15","_el$16","_el$17","statusLabels","_p$","_v$3","_v$4","e","t","_$className","undefined","_v$","_v$2","_$runHydrationEvents","_$delegateEvents"],"sources":["chat/ChatTasks.tsx"],"sourcesContent":["import { For, Show, createUniqueId } 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\"]) => status === \"completed\" ? \"ti ti-check\" : status === \"cancelled\" ? \"ti ti-minus\" : status === \"in_progress\" ? \"ti ti-wave-saw-tool\" : \"ti ti-circle\";\n return <Show when={props.items.length}>\n <section class=\"k2b-chat-tasks\">\n <button type=\"button\" class=\"k2b-chat-tasks__header\" aria-expanded={props.open} aria-controls={id} onClick={() => props.onOpenChange(!props.open)}>\n <i class=\"ti ti-list-check\" aria-hidden=\"true\" />\n <span class=\"k2b-chat-tasks__title\">{props.label}<Show when={active()}> · {active()!.content}</Show></span>\n <span class=\"k2b-chat-tasks__count\">{props.progressLabel}</span>\n <span class=\"k2b-chat-tasks__segments\" aria-hidden=\"true\"><For each={props.items}>{item => <span data-status={item.status} />}</For></span>\n <i class={props.open ? \"ti ti-chevron-up\" : \"ti ti-chevron-down\"} aria-hidden=\"true\" />\n </button>\n <Show when={props.open}><ol id={id} class=\"k2b-chat-tasks__list\"><For each={props.items}>{item =>\n <li data-status={item.status}><i class={icon(item.status)} aria-hidden=\"true\" /><span class=\"k2b-chat-tasks__content\">{item.content}</span><span class=\"k2b-chat-tasks__status\">{props.statusLabels[item.status]}</span></li>\n }</For></ol></Show>\n </section>\n </Show>;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -13,10 +13,11 @@ import { use as _$use } from "solid-js/web";
13
13
  var _tmpl$ = /*#__PURE__*/_$template(`<div class=k2b-chat-timeline__navigation aria-live=off>`),
14
14
  _tmpl$2 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-timeline__older><i class="ti ti-history"aria-hidden=true></i><!$><!/>`),
15
15
  _tmpl$3 = /*#__PURE__*/_$template(`<div class=k2b-chat-timeline__history aria-live=off><!$><!/><!$><!/><!$><!/>`),
16
- _tmpl$4 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-timeline__latest><i class="ti ti-arrow-down"aria-hidden=true></i>Jump to latest`),
17
- _tmpl$5 = /*#__PURE__*/_$template(`<section><div class=k2b-chat-timeline__viewport 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><!$><!/>`),
16
+ _tmpl$4 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-timeline__latest><i class="ti ti-arrow-down"aria-hidden=true></i><!$><!/>`),
17
+ _tmpl$5 = /*#__PURE__*/_$template(`<section><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><!$><!/>`),
18
18
  _tmpl$6 = /*#__PURE__*/_$template(`<i class="ti ti-loader-2 k2b-spin"aria-hidden=true>`),
19
19
  _tmpl$7 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-timeline__retry><i class="ti ti-refresh"aria-hidden=true>`);
20
+ import { createScrollFade } from "../layout/scroll-fade";
20
21
  import { createEffect, createSignal, For, onCleanup, onMount, Show, untrack } from "solid-js";
21
22
  import { useUiMessages } from "../intl/messages";
22
23
  import Placeholder from "../surfaces/Placeholder";
@@ -28,6 +29,7 @@ export function ChatTimeline(props) {
28
29
  const [loadingOlderInternally, setLoadingOlderInternally] = createSignal(false);
29
30
  const [historyError, setHistoryError] = createSignal(null);
30
31
  let viewportRef;
32
+ createScrollFade(() => viewportRef, () => props.scrollFade !== false);
31
33
  let contentRef;
32
34
  let topSentinelRef;
33
35
  let followFrame;
@@ -44,6 +46,14 @@ export function ChatTimeline(props) {
44
46
  if (followFrame !== undefined) cancelAnimationFrame(followFrame);
45
47
  followFrame = undefined;
46
48
  };
49
+ props.scrollToAnchorRef?.(anchorId => {
50
+ const anchor = Array.from(contentRef?.querySelectorAll("[data-chat-anchor]") ?? []).find(element => element.dataset.chatAnchor === String(anchorId));
51
+ if (!viewportRef || !anchor) return false;
52
+ cancelFollow();
53
+ setPinned(false);
54
+ viewportRef.scrollTop = Math.max(0, viewportRef.scrollTop + anchor.getBoundingClientRect().top - viewportRef.getBoundingClientRect().top - 16);
55
+ return true;
56
+ });
47
57
  const noteUserScrollAway = () => {
48
58
  userScrollingAway = true;
49
59
  if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);
@@ -98,6 +108,8 @@ export function ChatTimeline(props) {
98
108
  if (viewportRef.scrollTop <= threshold()) void loadOlder();
99
109
  };
100
110
  onMount(() => {
111
+ // Switch from CSS-only SSR anchoring to normal scroll coordinates before paint.
112
+ viewportRef?.removeAttribute("data-initializing");
101
113
  scrollToLatest();
102
114
  const resizeObserver = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(() => scheduleFollow());
103
115
  if (contentRef) resizeObserver?.observe(contentRef);
@@ -140,8 +152,8 @@ export function ChatTimeline(props) {
140
152
  [_el$16, _co$5] = _$getNextMarker(_el$15.nextSibling),
141
153
  _el$17 = _el$16.nextSibling,
142
154
  [_el$18, _co$6] = _$getNextMarker(_el$17.nextSibling),
143
- _el$22 = _el$2.nextSibling,
144
- [_el$23, _co$8] = _$getNextMarker(_el$22.nextSibling);
155
+ _el$25 = _el$2.nextSibling,
156
+ [_el$26, _co$9] = _$getNextMarker(_el$25.nextSibling);
145
157
  _el$2.addEventListener("scroll", updatePinned);
146
158
  _el$2.$$touchend = () => {
147
159
  touchY = undefined;
@@ -241,11 +253,11 @@ export function ChatTimeline(props) {
241
253
  tone: "danger",
242
254
  get trailing() {
243
255
  return (() => {
244
- var _el$25 = _$getNextElement(_tmpl$7);
245
- _el$25.$$click = () => void loadOlder();
246
- _$effect(() => _$setAttribute(_el$25, "aria-label", messages().retryOlderMessages));
256
+ var _el$28 = _$getNextElement(_tmpl$7);
257
+ _el$28.$$click = () => void loadOlder();
258
+ _$effect(() => _$setAttribute(_el$28, "aria-label", messages().retryOlderMessages));
247
259
  _$runHydrationEvents();
248
- return _el$25;
260
+ return _el$28;
249
261
  })();
250
262
  }
251
263
  })
@@ -372,29 +384,36 @@ export function ChatTimeline(props) {
372
384
  return _$memo(() => !!!pinned())() && hasContent();
373
385
  },
374
386
  get children() {
375
- var _el$21 = _$getNextElement(_tmpl$4);
387
+ var _el$21 = _$getNextElement(_tmpl$4),
388
+ _el$22 = _el$21.firstChild,
389
+ _el$23 = _el$22.nextSibling,
390
+ [_el$24, _co$8] = _$getNextMarker(_el$23.nextSibling);
376
391
  _el$21.$$click = scrollToLatest;
392
+ _$insert(_el$21, () => messages().jumpToLatest, _el$24, _co$8);
377
393
  _$runHydrationEvents();
378
394
  return _el$21;
379
395
  }
380
- }), _el$23, _co$8);
396
+ }), _el$26, _co$9);
381
397
  _$effect(_p$ => {
382
398
  var _v$ = `k2b-chat-timeline ${props.class ?? ""}`,
383
399
  _v$2 = props.label ?? messages().conversation,
384
- _v$3 = messages().conversationMessages({
400
+ _v$3 = props.scrollFade !== false ? "bottom" : undefined,
401
+ _v$4 = messages().conversationMessages({
385
402
  label: props.label ?? messages().conversation
386
403
  }),
387
- _v$4 = props.loading ? "true" : undefined;
404
+ _v$5 = props.loading ? "true" : undefined;
388
405
  _v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
389
406
  _v$2 !== _p$.t && _$setAttribute(_el$, "aria-label", _p$.t = _v$2);
390
- _v$3 !== _p$.a && _$setAttribute(_el$2, "aria-label", _p$.a = _v$3);
391
- _v$4 !== _p$.o && _$setAttribute(_el$4, "aria-busy", _p$.o = _v$4);
407
+ _v$3 !== _p$.a && _$setAttribute(_el$2, "data-scroll-fade-mode", _p$.a = _v$3);
408
+ _v$4 !== _p$.o && _$setAttribute(_el$2, "aria-label", _p$.o = _v$4);
409
+ _v$5 !== _p$.i && _$setAttribute(_el$4, "aria-busy", _p$.i = _v$5);
392
410
  return _p$;
393
411
  }, {
394
412
  e: undefined,
395
413
  t: undefined,
396
414
  a: undefined,
397
- o: undefined
415
+ o: undefined,
416
+ i: undefined
398
417
  });
399
418
  _$runHydrationEvents();
400
419
  return _el$;
@@ -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","resizeObserver","ResizeObserver","observe","historyObserver","IntersectionObserver","entries","some","entry","isIntersecting","root","rootMargin","disconnect","key","conversationKey","at","id","_el$","_$getNextElement","_tmpl$5","_el$2","firstChild","_el$19","_el$20","_co$7","_$getNextMarker","nextSibling","_el$4","_el$5","_el$15","_el$16","_co$5","_el$17","_el$18","_co$6","_el$22","_el$23","_co$8","addEventListener","$$touchend","$$touchmove","event","nextY","touches","clientY","$$touchstart","$$keydown","target","currentTarget","shiftKey","deltaY","_$use","element","_$insert","_$createComponent","when","navigation","children","_el$3","_tmpl$","_ref$","_el$6","_tmpl$3","_el$1","_el$10","_co$2","_el$11","_el$12","_co$3","_el$13","_el$14","_co$4","_el$7","_tmpl$2","_el$8","_el$9","_el$0","_co$","$$click","loadOlderMessages","_$runHydrationEvents","label","loadingOlderMessages","icon","trailing","_tmpl$6","description","tone","_el$25","_tmpl$7","_$effect","_$setAttribute","retryOlderMessages","_$memo","loading","fallback","state","title","loadingConversation","emptyTitle","startConversation","emptyDescription","each","item","kind","leading","accent","busy","defaultOpen","anchorId","class","content","role","createdAt","timeLabel","status","attachments","actions","actionDisplay","onActionError","_el$21","_tmpl$4","_p$","_v$","_v$2","conversation","_v$3","conversationMessages","_v$4","e","_$className","t","a","o","_$delegateEvents"],"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 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 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":["createScrollFade","createEffect","createSignal","For","onCleanup","onMount","Show","untrack","useUiMessages","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","_el$","_$getNextElement","_tmpl$5","_el$2","firstChild","_el$19","_el$20","_co$7","_$getNextMarker","nextSibling","_el$4","_el$5","_el$15","_el$16","_co$5","_el$17","_el$18","_co$6","_el$25","_el$26","_co$9","addEventListener","$$touchend","$$touchmove","event","nextY","touches","clientY","$$touchstart","$$keydown","target","currentTarget","shiftKey","deltaY","_$use","_$insert","_$createComponent","when","navigation","children","_el$3","_tmpl$","_ref$","_el$6","_tmpl$3","_el$1","_el$10","_co$2","_el$11","_el$12","_co$3","_el$13","_el$14","_co$4","_el$7","_tmpl$2","_el$8","_el$9","_el$0","_co$","$$click","loadOlderMessages","_$runHydrationEvents","label","loadingOlderMessages","icon","trailing","_tmpl$6","description","tone","_el$28","_tmpl$7","_$effect","_$setAttribute","retryOlderMessages","_$memo","loading","fallback","state","title","loadingConversation","emptyTitle","startConversation","emptyDescription","each","item","kind","leading","accent","busy","defaultOpen","class","content","role","createdAt","timeLabel","status","attachments","actions","actionDisplay","onActionError","_el$21","_tmpl$4","_el$22","_el$23","_el$24","_co$8","jumpToLatest","_p$","_v$","_v$2","conversation","_v$3","_v$4","conversationMessages","_v$5","e","_$className","t","a","o","i","_$delegateEvents"],"sources":["chat/ChatTimeline.tsx"],"sourcesContent":["import { createScrollFade } from \"../layout/scroll-fade\";\nimport { 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 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(() => viewportRef, () => props.scrollFade !== false);\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]\") ?? [])\n .find((element) => element.dataset.chatAnchor === String(anchorId));\n if (!viewportRef || !anchor) return false;\n cancelFollow();\n setPinned(false);\n viewportRef.scrollTop = Math.max(0, viewportRef.scrollTop + anchor.getBoundingClientRect().top - viewportRef.getBoundingClientRect().top - 16);\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, newEnd = after.length;\n while (oldEnd > start && newEnd > start && before[oldEnd - 1] === after[newEnd - 1]) { oldEnd--; newEnd--; }\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\";\nimport { ChatContextPopup } from \"./ChatContextPopup\";\nimport { ChatTasks } from \"./ChatTasks\";\nexport type { ChatTask, ChatTasksProps } from \"./ChatTasks\";\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 ChatMention,\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 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":"AACA,SAASA,gBAAgB,QAAQ,oBAAoB;AACrD,SAASC,SAAS,QAAQ,aAAa;AAEvC,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":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["chat/types.ts"],"sourcesContent":["export type ChatRole = \"user\" | \"assistant\" | \"system\" | \"tool\";\n\nexport type ChatMessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n\nexport type ChatActivityTone = \"neutral\" | \"ai\" | \"success\" | \"danger\";\n\ntype ChatActionBase = {\n id: string;\n label: string;\n icon?: string;\n variant?: \"danger\";\n disabled?: boolean;\n /** Toggle state for persistent message actions such as feedback. */\n pressed?: boolean;\n};\n\n/** Exactly one executable behavior for every chat action. */\nexport type ChatAction = ChatActionBase &\n ({ onSelect: () => void | Promise<void>; copyText?: never } | { copyText: string; onSelect?: never });\n\nexport type ChatAttachment = {\n id: string;\n name: string;\n size?: number;\n kind?: \"file\" | \"image\" | \"resource\";\n icon?: string;\n previewUrl?: string;\n alt?: string;\n /** Optional destination represented by this attachment. */\n href?: string;\n /** Opaque application-owned payload returned unchanged with ChatSubmitInput. */\n data?: unknown;\n /** Optional application-owned action presented below the attachment label. */\n action?: ChatAction;\n};\n\nexport type ChatUsage = {\n input?: number;\n output?: number;\n total?: number;\n};\n\nexport type ChatContextUsageData = {\n usage?: ChatUsage | null;\n loopUsage?: ChatUsage | null;\n contextWindow?: number;\n modelLabel?: string;\n};\n\nexport type ChatModelOption = {\n id: string;\n label: string;\n description?: string;\n image?: string;\n icon?: string;\n capabilities?: readonly string[];\n};\n\nexport type ChatComposerState = \"idle\" | \"submitting\" | \"running\" | \"stopping\";\n\nexport type ChatSubmitIntent = \"send\" | \"steer\" | \"queue\";\n\nexport type ChatSubmitInput = {\n intent: ChatSubmitIntent;\n text: string;\n attachments: readonly ChatAttachment[];\n};\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["chat/types.ts"],"sourcesContent":["export type ChatRole = \"user\" | \"assistant\" | \"system\" | \"tool\";\n\nexport type ChatMessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n\nexport type ChatActivityTone = \"neutral\" | \"ai\" | \"success\" | \"danger\";\n\ntype ChatActionBase = {\n id: string;\n label: string;\n icon?: string;\n variant?: \"danger\";\n disabled?: boolean;\n /** Toggle state for persistent message actions such as feedback. */\n pressed?: boolean;\n /** Semantic foreground for selected feedback actions, without a persistent background. */\n pressedTone?: \"success\" | \"danger\";\n};\n\n/** Exactly one executable behavior for every chat action. */\nexport type ChatAction = ChatActionBase &\n ({ onSelect: () => void | Promise<void>; copyText?: never } | { copyText: string; onSelect?: never });\n\nexport type ChatAttachment = {\n id: string;\n name: string;\n size?: number;\n kind?: \"file\" | \"image\" | \"resource\";\n icon?: string;\n previewUrl?: string;\n alt?: string;\n /** Optional destination represented by this attachment. */\n href?: string;\n /** Opaque application-owned payload returned unchanged with ChatSubmitInput. */\n data?: unknown;\n /** Optional application-owned action presented below the attachment label. */\n action?: ChatAction;\n};\n\nexport type ChatUsage = {\n input?: number;\n output?: number;\n total?: number;\n};\n\nexport type ChatContextUsageData = {\n usage?: ChatUsage | null;\n loopUsage?: ChatUsage | null;\n contextWindow?: number;\n modelLabel?: string;\n};\n\nexport type ChatModelOption = {\n id: string;\n label: string;\n description?: string;\n image?: string;\n icon?: string;\n capabilities?: readonly string[];\n};\n\nexport type ChatComposerState = \"idle\" | \"submitting\" | \"running\" | \"stopping\";\n\nexport type ChatSubmitIntent = \"send\" | \"steer\" | \"queue\";\n\nexport type ChatSubmitInput = {\n intent: ChatSubmitIntent;\n text: string;\n attachments: readonly ChatAttachment[];\n mentions?: readonly ChatMention[];\n};\n\n/** Ranges use UTF-16 offsets into the untrimmed composer text. Payloads stay application-owned. */\nexport type ChatMention = { start: number; end: number; attachment: ChatAttachment };\n"],"mappings":"","ignoreList":[]}