@k2b/ui 0.4.2 → 0.5.1

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 (383) hide show
  1. package/dist/browser/actions/Button.js.map +1 -1
  2. package/dist/browser/actions/ContextMenu.js.map +1 -1
  3. package/dist/browser/actions/CopyButton.js.map +1 -1
  4. package/dist/browser/actions/Disclosure.js.map +1 -1
  5. package/dist/browser/actions/Dropdown.js.map +1 -1
  6. package/dist/browser/actions/FilterChip.js.map +1 -1
  7. package/dist/browser/actions/RemoveButton.js.map +1 -1
  8. package/dist/browser/actions/SegmentedControl.js.map +1 -1
  9. package/dist/browser/actions/SplitButton.js.map +1 -1
  10. package/dist/browser/actions/SpotlightSearch.js.map +1 -1
  11. package/dist/browser/actions/Tabs.js.map +1 -1
  12. package/dist/browser/actions/Toolbar.js.map +1 -1
  13. package/dist/browser/actions/index.js.map +1 -1
  14. package/dist/browser/chat/ChatComposer.js.map +1 -1
  15. package/dist/browser/chat/ChatContextPopup.js.map +1 -1
  16. package/dist/browser/chat/ChatPrimitives.js.map +1 -1
  17. package/dist/browser/chat/ChatRoot.js.map +1 -1
  18. package/dist/browser/chat/ChatTasks.js +1 -1
  19. package/dist/browser/chat/ChatTasks.js.map +1 -1
  20. package/dist/browser/chat/ChatTimeline.js.map +1 -1
  21. package/dist/browser/chat/chat-behavior.js.map +1 -1
  22. package/dist/browser/chat/composer-document.js.map +1 -1
  23. package/dist/browser/chat/index.js.map +1 -1
  24. package/dist/browser/content/Calendar.js.map +1 -1
  25. package/dist/browser/content/Chart.js.map +1 -1
  26. package/dist/browser/content/ChartExplorer.js.map +1 -1
  27. package/dist/browser/content/ChartExplorerControls.js.map +1 -1
  28. package/dist/browser/content/ChartFilterControls.js +1 -1
  29. package/dist/browser/content/ChartFilterControls.js.map +1 -1
  30. package/dist/browser/content/ChartSnapshotView.js.map +1 -1
  31. package/dist/browser/content/CodeDisplay.js.map +1 -1
  32. package/dist/browser/content/DataTable.js.map +1 -1
  33. package/dist/browser/content/Docs.js.map +1 -1
  34. package/dist/browser/content/FileBrowser.js.map +1 -1
  35. package/dist/browser/content/FileGrid.js.map +1 -1
  36. package/dist/browser/content/FileTree.js.map +1 -1
  37. package/dist/browser/content/FileView.js.map +1 -1
  38. package/dist/browser/content/Lightbox.js.map +1 -1
  39. package/dist/browser/content/LogEntriesTable.js.map +1 -1
  40. package/dist/browser/content/MarkdownView.js.map +1 -1
  41. package/dist/browser/content/Pagination.js.map +1 -1
  42. package/dist/browser/content/PdfPreview.js.map +1 -1
  43. package/dist/browser/content/RangePicker.js.map +1 -1
  44. package/dist/browser/content/StructuredDataPreview.js.map +1 -1
  45. package/dist/browser/content/calendar-event-layout.js.map +1 -1
  46. package/dist/browser/content/calendar-pointer.js.map +1 -1
  47. package/dist/browser/content/chart-cursor.js.map +1 -1
  48. package/dist/browser/content/chart-explorer.js.map +1 -1
  49. package/dist/browser/content/chart-inspection.js.map +1 -1
  50. package/dist/browser/content/chart-line-gaps.js.map +1 -1
  51. package/dist/browser/content/chart-map-viewport.js.map +1 -1
  52. package/dist/browser/content/chart-snapshot.js.map +1 -1
  53. package/dist/browser/content/chart-state-timeline.js.map +1 -1
  54. package/dist/browser/content/chart-svg.js.map +1 -1
  55. package/dist/browser/content/code-highlight.js.map +1 -1
  56. package/dist/browser/content/collection-selection.js.map +1 -1
  57. package/dist/browser/content/delimited-preferences.js.map +1 -1
  58. package/dist/browser/content/file-tree.js.map +1 -1
  59. package/dist/browser/content/file-view-preview.js.map +1 -1
  60. package/dist/browser/content/index.js.map +1 -1
  61. package/dist/browser/feedback/InlineGuidance.js.map +1 -1
  62. package/dist/browser/feedback/Tooltip.js.map +1 -1
  63. package/dist/browser/feedback/dialog-core.js.map +1 -1
  64. package/dist/browser/feedback/index.js.map +1 -1
  65. package/dist/browser/feedback/prompts.js.map +1 -1
  66. package/dist/browser/feedback/toast.js.map +1 -1
  67. package/dist/browser/feedback/tooltip-position.js.map +1 -1
  68. package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
  69. package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
  70. package/dist/browser/inputs/Checkbox.js.map +1 -1
  71. package/dist/browser/inputs/CheckboxCard.js.map +1 -1
  72. package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
  73. package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
  74. package/dist/browser/inputs/Combobox.js.map +1 -1
  75. package/dist/browser/inputs/DatePicker.js.map +1 -1
  76. package/dist/browser/inputs/FileInputs.js.map +1 -1
  77. package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
  78. package/dist/browser/inputs/NumberInput.js.map +1 -1
  79. package/dist/browser/inputs/Select.js.map +1 -1
  80. package/dist/browser/inputs/SelectChip.js.map +1 -1
  81. package/dist/browser/inputs/SpecialInputs.js.map +1 -1
  82. package/dist/browser/inputs/Switch.js.map +1 -1
  83. package/dist/browser/inputs/TagEditor.js.map +1 -1
  84. package/dist/browser/inputs/TagsInput.js.map +1 -1
  85. package/dist/browser/inputs/TemplateEditor.js.map +1 -1
  86. package/dist/browser/inputs/TextInput.js.map +1 -1
  87. package/dist/browser/inputs/choice.js.map +1 -1
  88. package/dist/browser/inputs/completion/behaviors.js.map +1 -1
  89. package/dist/browser/inputs/completion/engine.js.map +1 -1
  90. package/dist/browser/inputs/completion/index.js.map +1 -1
  91. package/dist/browser/inputs/completion/overlay.js.map +1 -1
  92. package/dist/browser/inputs/date-picker.js.map +1 -1
  93. package/dist/browser/inputs/editor-dom.js.map +1 -1
  94. package/dist/browser/inputs/field-contract.js.map +1 -1
  95. package/dist/browser/inputs/icon-options.js.map +1 -1
  96. package/dist/browser/inputs/image-crop.js.map +1 -1
  97. package/dist/browser/inputs/index.js.map +1 -1
  98. package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
  99. package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
  100. package/dist/browser/inputs/markdown/actions.js.map +1 -1
  101. package/dist/browser/inputs/markdown/active-formats.js.map +1 -1
  102. package/dist/browser/inputs/markdown/behaviors.js.map +1 -1
  103. package/dist/browser/inputs/markdown/code-zone.js.map +1 -1
  104. package/dist/browser/internal/color.js.map +1 -1
  105. package/dist/browser/internal/field.js.map +1 -1
  106. package/dist/browser/internal/portal.js.map +1 -1
  107. package/dist/browser/intl/Format.js.map +1 -1
  108. package/dist/browser/intl/index.js.map +1 -1
  109. package/dist/browser/intl/locale.js.map +1 -1
  110. package/dist/browser/intl/messages.js +2 -0
  111. package/dist/browser/intl/messages.js.map +1 -1
  112. package/dist/browser/layout/AppOverview.js +29 -20
  113. package/dist/browser/layout/AppOverview.js.map +1 -1
  114. package/dist/browser/layout/AppWorkspace.js +60 -54
  115. package/dist/browser/layout/AppWorkspace.js.map +1 -1
  116. package/dist/browser/layout/BottomSheet.js.map +1 -1
  117. package/dist/browser/layout/DataPanel.js.map +1 -1
  118. package/dist/browser/layout/DetailPanel.js.map +1 -1
  119. package/dist/browser/layout/Discussion.js.map +1 -1
  120. package/dist/browser/layout/FloatingWindow.js.map +1 -1
  121. package/dist/browser/layout/Navigation.js.map +1 -1
  122. package/dist/browser/layout/PanelDialog.js.map +1 -1
  123. package/dist/browser/layout/PanelHeader.js +1 -1
  124. package/dist/browser/layout/PanelHeader.js.map +1 -1
  125. package/dist/browser/layout/Panes.js.map +1 -1
  126. package/dist/browser/layout/PullToRefresh.js +217 -0
  127. package/dist/browser/layout/PullToRefresh.js.map +1 -0
  128. package/dist/browser/layout/ScrollArea.js.map +1 -1
  129. package/dist/browser/layout/Settings.js.map +1 -1
  130. package/dist/browser/layout/SettingsCollection.js.map +1 -1
  131. package/dist/browser/layout/SettingsModal.js.map +1 -1
  132. package/dist/browser/layout/SidebarItemPreview.js.map +1 -1
  133. package/dist/browser/layout/app-workspace-controller.js.map +1 -1
  134. package/dist/browser/layout/app-workspace-state.js.map +1 -1
  135. package/dist/browser/layout/floating-window-geometry.js.map +1 -1
  136. package/dist/browser/layout/index.js +1 -0
  137. package/dist/browser/layout/index.js.map +1 -1
  138. package/dist/browser/layout/navigation-model.js.map +1 -1
  139. package/dist/browser/layout/panes-layout.js.map +1 -1
  140. package/dist/browser/layout/scroll-fade.js.map +1 -1
  141. package/dist/browser/layout/stable-id.js.map +1 -1
  142. package/dist/browser/surfaces/Avatar.js.map +1 -1
  143. package/dist/browser/surfaces/DescriptionList.js.map +1 -1
  144. package/dist/browser/surfaces/LinkCard.js +13 -2
  145. package/dist/browser/surfaces/LinkCard.js.map +1 -1
  146. package/dist/browser/surfaces/NotFoundState.js.map +1 -1
  147. package/dist/browser/surfaces/NoticeCard.js.map +1 -1
  148. package/dist/browser/surfaces/Paper.js.map +1 -1
  149. package/dist/browser/surfaces/Placeholder.js.map +1 -1
  150. package/dist/browser/surfaces/ProgressBar.js.map +1 -1
  151. package/dist/browser/surfaces/StatCell.js.map +1 -1
  152. package/dist/browser/surfaces/StatGrid.js.map +1 -1
  153. package/dist/browser/surfaces/StatusBadge.js.map +1 -1
  154. package/dist/browser/surfaces/Tag.js.map +1 -1
  155. package/dist/browser/surfaces/index.js.map +1 -1
  156. package/dist/browser/widgets/Widget.js.map +1 -1
  157. package/dist/browser/widgets/WidgetHero.js.map +1 -1
  158. package/dist/browser/widgets/WidgetList.js.map +1 -1
  159. package/dist/browser/widgets/WidgetPills.js.map +1 -1
  160. package/dist/browser/widgets/WidgetStat.js.map +1 -1
  161. package/dist/browser/widgets/WidgetStatus.js.map +1 -1
  162. package/dist/ssr/actions/Button.js +5 -4
  163. package/dist/ssr/actions/Button.js.map +1 -1
  164. package/dist/ssr/actions/ContextMenu.js.map +1 -1
  165. package/dist/ssr/actions/CopyButton.js +2 -1
  166. package/dist/ssr/actions/CopyButton.js.map +1 -1
  167. package/dist/ssr/actions/Disclosure.js.map +1 -1
  168. package/dist/ssr/actions/Dropdown.js +7 -6
  169. package/dist/ssr/actions/Dropdown.js.map +1 -1
  170. package/dist/ssr/actions/FilterChip.js +5 -4
  171. package/dist/ssr/actions/FilterChip.js.map +1 -1
  172. package/dist/ssr/actions/RemoveButton.js +1 -0
  173. package/dist/ssr/actions/RemoveButton.js.map +1 -1
  174. package/dist/ssr/actions/SegmentedControl.js.map +1 -1
  175. package/dist/ssr/actions/SplitButton.js +1 -0
  176. package/dist/ssr/actions/SplitButton.js.map +1 -1
  177. package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
  178. package/dist/ssr/actions/Tabs.js.map +1 -1
  179. package/dist/ssr/actions/Toolbar.js.map +1 -1
  180. package/dist/ssr/actions/index.js.map +1 -1
  181. package/dist/ssr/chat/ChatComposer.js +6 -5
  182. package/dist/ssr/chat/ChatComposer.js.map +1 -1
  183. package/dist/ssr/chat/ChatContextPopup.js.map +1 -1
  184. package/dist/ssr/chat/ChatPrimitives.js +6 -5
  185. package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
  186. package/dist/ssr/chat/ChatRoot.js.map +1 -1
  187. package/dist/ssr/chat/ChatTasks.js +1 -1
  188. package/dist/ssr/chat/ChatTasks.js.map +1 -1
  189. package/dist/ssr/chat/ChatTimeline.js +5 -4
  190. package/dist/ssr/chat/ChatTimeline.js.map +1 -1
  191. package/dist/ssr/chat/chat-behavior.js.map +1 -1
  192. package/dist/ssr/chat/composer-document.js.map +1 -1
  193. package/dist/ssr/chat/index.js.map +1 -1
  194. package/dist/ssr/content/Calendar.js +2 -1
  195. package/dist/ssr/content/Calendar.js.map +1 -1
  196. package/dist/ssr/content/Chart.js.map +1 -1
  197. package/dist/ssr/content/ChartExplorer.js.map +1 -1
  198. package/dist/ssr/content/ChartExplorerControls.js +5 -4
  199. package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
  200. package/dist/ssr/content/ChartFilterControls.js +3 -2
  201. package/dist/ssr/content/ChartFilterControls.js.map +1 -1
  202. package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
  203. package/dist/ssr/content/CodeDisplay.js.map +1 -1
  204. package/dist/ssr/content/DataTable.js +1 -0
  205. package/dist/ssr/content/DataTable.js.map +1 -1
  206. package/dist/ssr/content/Docs.js +1 -0
  207. package/dist/ssr/content/Docs.js.map +1 -1
  208. package/dist/ssr/content/FileBrowser.js +2 -1
  209. package/dist/ssr/content/FileBrowser.js.map +1 -1
  210. package/dist/ssr/content/FileGrid.js.map +1 -1
  211. package/dist/ssr/content/FileTree.js +2 -1
  212. package/dist/ssr/content/FileTree.js.map +1 -1
  213. package/dist/ssr/content/FileView.js +5 -4
  214. package/dist/ssr/content/FileView.js.map +1 -1
  215. package/dist/ssr/content/Lightbox.js +2 -1
  216. package/dist/ssr/content/Lightbox.js.map +1 -1
  217. package/dist/ssr/content/LogEntriesTable.js.map +1 -1
  218. package/dist/ssr/content/MarkdownView.js.map +1 -1
  219. package/dist/ssr/content/Pagination.js +2 -1
  220. package/dist/ssr/content/Pagination.js.map +1 -1
  221. package/dist/ssr/content/PdfPreview.js.map +1 -1
  222. package/dist/ssr/content/RangePicker.js.map +1 -1
  223. package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
  224. package/dist/ssr/content/calendar-event-layout.js.map +1 -1
  225. package/dist/ssr/content/calendar-pointer.js.map +1 -1
  226. package/dist/ssr/content/chart-cursor.js.map +1 -1
  227. package/dist/ssr/content/chart-explorer.js.map +1 -1
  228. package/dist/ssr/content/chart-inspection.js.map +1 -1
  229. package/dist/ssr/content/chart-line-gaps.js.map +1 -1
  230. package/dist/ssr/content/chart-map-viewport.js.map +1 -1
  231. package/dist/ssr/content/chart-snapshot.js.map +1 -1
  232. package/dist/ssr/content/chart-state-timeline.js.map +1 -1
  233. package/dist/ssr/content/chart-svg.js.map +1 -1
  234. package/dist/ssr/content/code-highlight.js.map +1 -1
  235. package/dist/ssr/content/collection-selection.js.map +1 -1
  236. package/dist/ssr/content/delimited-preferences.js.map +1 -1
  237. package/dist/ssr/content/file-tree.js.map +1 -1
  238. package/dist/ssr/content/file-view-preview.js.map +1 -1
  239. package/dist/ssr/content/index.js.map +1 -1
  240. package/dist/ssr/feedback/InlineGuidance.js.map +1 -1
  241. package/dist/ssr/feedback/Tooltip.js.map +1 -1
  242. package/dist/ssr/feedback/dialog-core.js.map +1 -1
  243. package/dist/ssr/feedback/index.js.map +1 -1
  244. package/dist/ssr/feedback/prompts.js +3 -2
  245. package/dist/ssr/feedback/prompts.js.map +1 -1
  246. package/dist/ssr/feedback/toast.js.map +1 -1
  247. package/dist/ssr/feedback/tooltip-position.js.map +1 -1
  248. package/dist/ssr/inputs/AutocompleteEditor.js +3 -2
  249. package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
  250. package/dist/ssr/inputs/AutocompleteSelect.js +5 -4
  251. package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
  252. package/dist/ssr/inputs/Checkbox.js +1 -0
  253. package/dist/ssr/inputs/Checkbox.js.map +1 -1
  254. package/dist/ssr/inputs/CheckboxCard.js.map +1 -1
  255. package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
  256. package/dist/ssr/inputs/ChoiceInputs.js +1 -0
  257. package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
  258. package/dist/ssr/inputs/Combobox.js +2 -1
  259. package/dist/ssr/inputs/Combobox.js.map +1 -1
  260. package/dist/ssr/inputs/DatePicker.js +4 -3
  261. package/dist/ssr/inputs/DatePicker.js.map +1 -1
  262. package/dist/ssr/inputs/FileInputs.js +2 -1
  263. package/dist/ssr/inputs/FileInputs.js.map +1 -1
  264. package/dist/ssr/inputs/MultiSelectInput.js +4 -3
  265. package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
  266. package/dist/ssr/inputs/NumberInput.js +2 -1
  267. package/dist/ssr/inputs/NumberInput.js.map +1 -1
  268. package/dist/ssr/inputs/Select.js +4 -3
  269. package/dist/ssr/inputs/Select.js.map +1 -1
  270. package/dist/ssr/inputs/SelectChip.js +3 -2
  271. package/dist/ssr/inputs/SelectChip.js.map +1 -1
  272. package/dist/ssr/inputs/SpecialInputs.js +1 -0
  273. package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
  274. package/dist/ssr/inputs/Switch.js.map +1 -1
  275. package/dist/ssr/inputs/TagEditor.js +3 -2
  276. package/dist/ssr/inputs/TagEditor.js.map +1 -1
  277. package/dist/ssr/inputs/TagsInput.js.map +1 -1
  278. package/dist/ssr/inputs/TemplateEditor.js +1 -0
  279. package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
  280. package/dist/ssr/inputs/TextInput.js +4 -3
  281. package/dist/ssr/inputs/TextInput.js.map +1 -1
  282. package/dist/ssr/inputs/choice.js.map +1 -1
  283. package/dist/ssr/inputs/completion/behaviors.js.map +1 -1
  284. package/dist/ssr/inputs/completion/engine.js.map +1 -1
  285. package/dist/ssr/inputs/completion/index.js.map +1 -1
  286. package/dist/ssr/inputs/completion/overlay.js.map +1 -1
  287. package/dist/ssr/inputs/date-picker.js.map +1 -1
  288. package/dist/ssr/inputs/editor-dom.js.map +1 -1
  289. package/dist/ssr/inputs/field-contract.js.map +1 -1
  290. package/dist/ssr/inputs/icon-options.js.map +1 -1
  291. package/dist/ssr/inputs/image-crop.js.map +1 -1
  292. package/dist/ssr/inputs/index.js.map +1 -1
  293. package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
  294. package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
  295. package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
  296. package/dist/ssr/inputs/markdown/actions.js.map +1 -1
  297. package/dist/ssr/inputs/markdown/active-formats.js.map +1 -1
  298. package/dist/ssr/inputs/markdown/behaviors.js.map +1 -1
  299. package/dist/ssr/inputs/markdown/code-zone.js.map +1 -1
  300. package/dist/ssr/internal/color.js.map +1 -1
  301. package/dist/ssr/internal/field.js.map +1 -1
  302. package/dist/ssr/internal/portal.js.map +1 -1
  303. package/dist/ssr/intl/Format.js.map +1 -1
  304. package/dist/ssr/intl/index.js.map +1 -1
  305. package/dist/ssr/intl/locale.js.map +1 -1
  306. package/dist/ssr/intl/messages.js +2 -0
  307. package/dist/ssr/intl/messages.js.map +1 -1
  308. package/dist/ssr/layout/AppOverview.js +16 -6
  309. package/dist/ssr/layout/AppOverview.js.map +1 -1
  310. package/dist/ssr/layout/AppWorkspace.js +12 -8
  311. package/dist/ssr/layout/AppWorkspace.js.map +1 -1
  312. package/dist/ssr/layout/BottomSheet.js.map +1 -1
  313. package/dist/ssr/layout/DataPanel.js +1 -0
  314. package/dist/ssr/layout/DataPanel.js.map +1 -1
  315. package/dist/ssr/layout/DetailPanel.js +1 -0
  316. package/dist/ssr/layout/DetailPanel.js.map +1 -1
  317. package/dist/ssr/layout/Discussion.js +3 -2
  318. package/dist/ssr/layout/Discussion.js.map +1 -1
  319. package/dist/ssr/layout/FloatingWindow.js +1 -0
  320. package/dist/ssr/layout/FloatingWindow.js.map +1 -1
  321. package/dist/ssr/layout/Navigation.js +3 -2
  322. package/dist/ssr/layout/Navigation.js.map +1 -1
  323. package/dist/ssr/layout/PanelDialog.js +1 -0
  324. package/dist/ssr/layout/PanelDialog.js.map +1 -1
  325. package/dist/ssr/layout/PanelHeader.js +1 -1
  326. package/dist/ssr/layout/PanelHeader.js.map +1 -1
  327. package/dist/ssr/layout/Panes.js.map +1 -1
  328. package/dist/ssr/layout/PullToRefresh.js +177 -0
  329. package/dist/ssr/layout/PullToRefresh.js.map +1 -0
  330. package/dist/ssr/layout/ScrollArea.js.map +1 -1
  331. package/dist/ssr/layout/Settings.js +2 -1
  332. package/dist/ssr/layout/Settings.js.map +1 -1
  333. package/dist/ssr/layout/SettingsCollection.js +1 -0
  334. package/dist/ssr/layout/SettingsCollection.js.map +1 -1
  335. package/dist/ssr/layout/SettingsModal.js.map +1 -1
  336. package/dist/ssr/layout/SidebarItemPreview.js.map +1 -1
  337. package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
  338. package/dist/ssr/layout/app-workspace-state.js.map +1 -1
  339. package/dist/ssr/layout/floating-window-geometry.js.map +1 -1
  340. package/dist/ssr/layout/index.js +1 -0
  341. package/dist/ssr/layout/index.js.map +1 -1
  342. package/dist/ssr/layout/navigation-model.js.map +1 -1
  343. package/dist/ssr/layout/panes-layout.js.map +1 -1
  344. package/dist/ssr/layout/scroll-fade.js.map +1 -1
  345. package/dist/ssr/layout/stable-id.js.map +1 -1
  346. package/dist/ssr/surfaces/Avatar.js +2 -1
  347. package/dist/ssr/surfaces/Avatar.js.map +1 -1
  348. package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
  349. package/dist/ssr/surfaces/LinkCard.js +11 -2
  350. package/dist/ssr/surfaces/LinkCard.js.map +1 -1
  351. package/dist/ssr/surfaces/NotFoundState.js.map +1 -1
  352. package/dist/ssr/surfaces/NoticeCard.js.map +1 -1
  353. package/dist/ssr/surfaces/Paper.js +2 -1
  354. package/dist/ssr/surfaces/Paper.js.map +1 -1
  355. package/dist/ssr/surfaces/Placeholder.js +2 -1
  356. package/dist/ssr/surfaces/Placeholder.js.map +1 -1
  357. package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
  358. package/dist/ssr/surfaces/StatCell.js +2 -1
  359. package/dist/ssr/surfaces/StatCell.js.map +1 -1
  360. package/dist/ssr/surfaces/StatGrid.js +1 -0
  361. package/dist/ssr/surfaces/StatGrid.js.map +1 -1
  362. package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
  363. package/dist/ssr/surfaces/Tag.js.map +1 -1
  364. package/dist/ssr/surfaces/index.js.map +1 -1
  365. package/dist/ssr/widgets/Widget.js +1 -0
  366. package/dist/ssr/widgets/Widget.js.map +1 -1
  367. package/dist/ssr/widgets/WidgetHero.js.map +1 -1
  368. package/dist/ssr/widgets/WidgetList.js.map +1 -1
  369. package/dist/ssr/widgets/WidgetPills.js.map +1 -1
  370. package/dist/ssr/widgets/WidgetStat.js +1 -0
  371. package/dist/ssr/widgets/WidgetStat.js.map +1 -1
  372. package/dist/ssr/widgets/WidgetStatus.js.map +1 -1
  373. package/dist/styles.css +1 -1
  374. package/dist/types/actions/SpotlightSearch.d.ts +1 -1
  375. package/dist/types/feedback/prompts.d.ts +2 -2
  376. package/dist/types/intl/messages.d.ts +1 -0
  377. package/dist/types/layout/AppOverview.d.ts +7 -0
  378. package/dist/types/layout/AppWorkspace.d.ts +14 -2
  379. package/dist/types/layout/PanelHeader.d.ts +1 -1
  380. package/dist/types/layout/PullToRefresh.d.ts +21 -0
  381. package/dist/types/layout/index.d.ts +3 -1
  382. package/dist/types/surfaces/LinkCard.d.ts +5 -2
  383. package/package.json +7 -7
@@ -1 +1 @@
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":[]}
1
+ {"version":3,"names":[],"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":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["useUiMessages","ChatRoot","props","messages","_$ssr","_tmpl$","_$escape","class","_$ssrAttribute","label","chat","children"],"sources":["chat/ChatRoot.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\nexport type ChatRootProps = {\n children: JSX.Element;\n class?: string;\n label?: string;\n};\n\nexport function ChatRoot(props: ChatRootProps): JSX.Element {\n const messages = useUiMessages();\n return (\n <section class={`k2b-chat ${props.class ?? \"\"}`} aria-label={props.label ?? messages().chat}>\n {props.children}\n </section>\n );\n}\n"],"mappings":";;;;AACA,SAASA,aAAa,QAAQ,kBAAkB;AAQhD,OAAO,SAASC,QAAQA,CAACC,KAAoB,EAAe;EAC1D,MAAMC,QAAQ,GAAGH,aAAa,CAAC,CAAC;EAChC,OAAAI,KAAA,CAAAC,MAAA,EACkB,YAAAC,QAAA,CAAYJ,KAAK,CAACK,KAAK,IAAI,EAAE,SAAE,EAAAC,cAAA,eAAAF,QAAA,CAAcJ,KAAK,CAACO,KAAK,IAAIN,QAAQ,CAAC,CAAC,CAACO,IAAI,iBAAAJ,QAAA,CACxFJ,KAAK,CAACS,QAAQ;AAGrB","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["chat/ChatRoot.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\nexport type ChatRootProps = {\n children: JSX.Element;\n class?: string;\n label?: string;\n};\n\nexport function ChatRoot(props: ChatRootProps): JSX.Element {\n const messages = useUiMessages();\n return (\n <section class={`k2b-chat ${props.class ?? \"\"}`} aria-label={props.label ?? messages().chat}>\n {props.children}\n </section>\n );\n}\n"],"mappings":";;;;AACA,SAAS,aAAa,QAAQ,kBAAkB;AAQhD,OAAO,SAAS,QAAQ,CAAC,KAAoB,EAAe;EAC1D,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC;EAChC,qBACkB,qBAAY,KAAK,CAAC,KAAK,IAAI,EAAE,SAAE,wCAAc,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,0BACxF,KAAK,CAAC,QAAQ;AAGrB","ignoreList":[]}
@@ -22,7 +22,7 @@ export function ChatTasks(props) {
22
22
  return active();
23
23
  },
24
24
  get children() {
25
- return [" \xB7 ", active().content];
25
+ return [" · ", active().content];
26
26
  }
27
27
  })), _$escape(props.progressLabel), _$escape(_$createComponent(For, {
28
28
  get each() {
@@ -1 +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":[]}
1
+ {"version":3,"names":[],"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,SAAS,cAAc,EAAE,GAAG,EAAE,IAAI,QAAQ,UAAU;AAYpD;AACA,OAAO,SAAS,SAAS,CAAC,KAAqB,EAAE;EAC/C,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC;EAC3B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAAE,IAAI,IAAK,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC;EAC9E,MAAM,IAAI,GAAI,MAA0B,IACtC,MAAM,KAAK,WAAW,GAClB,aAAa,GACb,MAAM,KAAK,WAAW,GACpB,aAAa,GACb,MAAM,KAAK,aAAa,GACtB,qBAAqB,GACrB,cAAc;EACxB,yBACG,IAAI;IAAA,IAAC,IAAI;MAAA,OAAE,KAAK,CAAC,KAAK,CAAC,MAAM;IAAA;IAAA;MAAA,+DAKT,KAAK,CAAC,IAAI,2DACV,EAAE,0BAKd,KAAK,CAAC,KAAK,8BACX,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,MAAM,CAAC,CAAC;QAAA;QAAA;UAAA,eAAM,MAAM,CAAC,CAAC,CAAE,OAAO;QAAA;MAAA,cAER,KAAK,CAAC,aAAa,8BAErD,GAAG;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,KAAK;QAAA;QAAA,UAAI,IAAI,0DAAwB,IAAI,CAAC,MAAM;MAAI,6BAE7D,KAAK,CAAC,IAAI,GAAG,kBAAkB,GAAG,oBAAoB,qCAEjE,IAAI;QAAA,IAAC,IAAI;UAAA,OAAE,KAAK,CAAC,IAAI;QAAA;QAAA;UAAA,mDACZ,EAAE,4CACP,GAAG;YAAA,IAAC,IAAI;cAAA,OAAE,KAAK,CAAC,KAAK;YAAA;YAAA,UAClB,IAAI,0DACa,IAAI,CAAC,MAAM,kDAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,0BACY,IAAI,CAAC,OAAO,YACb,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;UAExE;QAAA;MAAA;IAAA;EAAA;AAOf","ignoreList":[]}
@@ -1,3 +1,4 @@
1
+ import { memo as _$memo } from "solid-js/web";
1
2
  import { createComponent as _$createComponent } from "solid-js/web";
2
3
  import { ssr as _$ssr } from "solid-js/web";
3
4
  import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
@@ -190,7 +191,7 @@ export function ChatTimeline(props) {
190
191
  }
191
192
  })), _$escape(_$createComponent(Show, {
192
193
  get when() {
193
- return !props.loading && hasContent();
194
+ return _$memo(() => !!!props.loading)() && hasContent();
194
195
  },
195
196
  get fallback() {
196
197
  return _$createComponent(Placeholder, {
@@ -202,10 +203,10 @@ export function ChatTimeline(props) {
202
203
  return props.loading ? undefined : "ti ti-sparkles";
203
204
  },
204
205
  get title() {
205
- return props.loading ? messages().loadingConversation : props.emptyTitle ?? messages().startConversation;
206
+ return _$memo(() => !!props.loading)() ? messages().loadingConversation : props.emptyTitle ?? messages().startConversation;
206
207
  },
207
208
  get description() {
208
- return !props.loading ? props.emptyDescription : undefined;
209
+ return _$memo(() => !!!props.loading)() ? props.emptyDescription : undefined;
209
210
  }
210
211
  });
211
212
  },
@@ -303,7 +304,7 @@ export function ChatTimeline(props) {
303
304
  }
304
305
  })), _$escape(_$createComponent(Show, {
305
306
  get when() {
306
- return !pinned() && hasContent();
307
+ return _$memo(() => !!!pinned())() && hasContent();
307
308
  },
308
309
  get children() {
309
310
  return _$ssr(_tmpl$4, _$escape(messages().jumpToLatest));
@@ -1 +1 @@
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
+ {"version":3,"names":[],"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 +1 @@
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":[]}
1
+ {"version":3,"names":[],"sources":["chat/chat-behavior.ts"],"sourcesContent":["import type { ChatAction } from \"./types\";\n\nexport const nextChatCommandIndex = (index: number, length: number, direction: 1 | -1): number =>\n length <= 0 ? 0 : (index + direction + length) % length;\n\nexport const isChatNearBottom = (scrollHeight: number, scrollTop: number, clientHeight: number, threshold = 96): boolean =>\n scrollHeight - scrollTop - clientHeight <= threshold;\n\nexport const restoredChatScrollTop = (previousScrollTop: number, previousScrollHeight: number, nextScrollHeight: number): number =>\n Math.max(0, previousScrollTop + nextScrollHeight - previousScrollHeight);\n\nexport type ChatSubmissionRun = {\n /** Clears the controlled draft (and attachments) before the handler runs. */\n clear: () => void;\n /**\n * The application handler. A synchronous throw, a rejected promise, and a\n * `false` result all count as a rejected submission.\n */\n perform: () => boolean | void | Promise<boolean | void>;\n /** Restores the cleared draft (and attachments) after a rejected submission. */\n restore: () => void;\n onError?: (error: unknown) => void;\n};\n\n/**\n * Runs one composer submission with optimistic clearing. Resolves to `true`\n * when the handler accepted the submission. A synchronous throw is handled\n * exactly like a rejected promise so a controlled draft is never lost.\n */\nexport const runChatSubmission = async (run: ChatSubmissionRun): Promise<boolean> => {\n run.clear();\n try {\n if ((await run.perform()) === false) {\n run.restore();\n return false;\n }\n return true;\n } catch (error) {\n run.onError?.(error);\n run.restore();\n return false;\n }\n};\n\n/** Reports a handler failure without letting a synchronous throw escape. */\nexport const reportChatFailure = (perform: () => unknown, onError?: (error: unknown) => void): void => {\n try {\n const result = perform();\n if (result instanceof Promise) void result.catch((error) => onError?.(error));\n } catch (error) {\n onError?.(error);\n }\n};\n\nconst writeChatClipboard = async (value: string): Promise<void> => {\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.writeText) {\n throw new Error(\"Clipboard access is unavailable.\");\n }\n await navigator.clipboard.writeText(value);\n};\n\n/** Executes the one behavior guaranteed by the ChatAction contract. */\nexport const executeChatAction = async (action: ChatAction): Promise<void> => {\n if (typeof action.copyText === \"string\") {\n await writeChatClipboard(action.copyText);\n return;\n }\n await action.onSelect();\n};\n"],"mappings":"AAEA,OAAO,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,SAAiB,KACnF,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,SAAS,GAAG,MAAM,IAAI,MAAM;AAEzD,OAAO,MAAM,gBAAgB,GAAG,CAAC,YAAoB,EAAE,SAAiB,EAAE,YAAoB,EAAE,SAAS,GAAG,EAAE,KAC5G,YAAY,GAAG,SAAS,GAAG,YAAY,IAAI,SAAS;AAEtD,OAAO,MAAM,qBAAqB,GAAG,CAAC,iBAAyB,EAAE,oBAA4B,EAAE,gBAAwB,KACrH,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,oBAAoB,CAAC;AAe1E;AACA;AACA;AACA;AACA;AACA,OAAO,MAAM,iBAAiB,GAAG,MAAO,GAAsB,IAAuB;EACnF,GAAG,CAAC,KAAK,CAAC,CAAC;EACX,IAAI;IACF,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,EAAE;MACnC,GAAG,CAAC,OAAO,CAAC,CAAC;MACb,OAAO,KAAK;IACd;IACA,OAAO,IAAI;EACb,CAAC,CAAC,OAAO,KAAK,EAAE;IACd,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACpB,GAAG,CAAC,OAAO,CAAC,CAAC;IACb,OAAO,KAAK;EACd;AACF,CAAC;;AAED;AACA,OAAO,MAAM,iBAAiB,GAAG,CAAC,OAAsB,EAAE,OAAkC,KAAW;EACrG,IAAI;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC;IACxB,IAAI,MAAM,YAAY,OAAO,EAAE,KAAK,MAAM,CAAC,KAAK,CAAE,KAAK,IAAK,OAAO,GAAG,KAAK,CAAC,CAAC;EAC/E,CAAC,CAAC,OAAO,KAAK,EAAE;IACd,OAAO,GAAG,KAAK,CAAC;EAClB;AACF,CAAC;AAED,MAAM,kBAAkB,GAAG,MAAO,KAAa,IAAoB;EACjE,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE;IACvE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC;EACrD;EACA,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC;AAC5C,CAAC;;AAED;AACA,OAAO,MAAM,iBAAiB,GAAG,MAAO,MAAkB,IAAoB;EAC5E,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE;IACvC,MAAM,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC;IACzC;EACF;EACA,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC","ignoreList":[]}
@@ -1 +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
+ {"version":3,"names":[],"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 +1 @@
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":[]}
1
+ {"version":3,"names":[],"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,SAAS,gBAAgB,QAAQ,oBAAoB;AACrD,SAAS,SAAS,QAAQ,aAAa;AAIvC,SAAS,YAAY,QAAQ,gBAAgB;AAC7C,SAAS,YAAY,EAAE,gBAAgB,EAAE,WAAW,QAAQ,kBAAkB;AAC9E,SAAS,QAAQ,QAAQ,YAAY;AACrC,SAAS,YAAY,QAAQ,gBAAgB;AAI7C,SAAS,gBAAgB,QAAQ,kBAAkB;AAkBnD;AACA;AACA;AACA;AACA,OAAO,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;EAC1C,KAAK,EAAE,SAAS;EAChB,QAAQ,EAAE,YAAY;EACtB,OAAO,EAAE,WAAW;EACpB,QAAQ,EAAE,YAAY;EACtB,QAAQ,EAAE,YAAY;EACtB,YAAY,EAAE,gBAAgB;EAC9B,YAAY,EAAE;AAChB,CAAC,CAAC;AAEF,SAAS,qBAAqB,QAAQ,qBAAqB","ignoreList":[]}
@@ -1,4 +1,5 @@
1
1
  import { ssrStyleProperty as _$ssrStyleProperty } from "solid-js/web";
2
+ import { memo as _$memo } from "solid-js/web";
2
3
  import { ssrElement as _$ssrElement } from "solid-js/web";
3
4
  import { mergeProps as _$mergeProps } from "solid-js/web";
4
5
  import { ssrStyle as _$ssrStyle } from "solid-js/web";
@@ -522,7 +523,7 @@ const CalendarHeader = props => {
522
523
  }].filter(option => !props.owner.views || props.owner.views.includes(option.value)));
523
524
  return _$ssr(_tmpl$10, _$escape(navButton(previous(), "ti-chevron-left", props.labels.previous)), _$escape(navButton(next(), "ti-chevron-right", props.labels.next)), _$escape(title()), _$escape(todayButton()), _$escape(_$createComponent(Show, {
524
525
  get when() {
525
- return !props.owner.onViewChange && props.owner.getViewHref;
526
+ return _$memo(() => !!!props.owner.onViewChange)() && props.owner.getViewHref;
526
527
  },
527
528
  get fallback() {
528
529
  return _$createComponent(SegmentedControl, {