@k2b/ui 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/actions/Button.js +11 -2
- package/dist/browser/actions/Button.js.map +1 -1
- package/dist/browser/actions/Disclosure.js +11 -8
- package/dist/browser/actions/Disclosure.js.map +1 -1
- package/dist/browser/actions/Dropdown.js +4 -1
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/FilterChip.js +16 -2
- package/dist/browser/actions/FilterChip.js.map +1 -1
- package/dist/browser/actions/SplitButton.js +69 -22
- package/dist/browser/actions/SplitButton.js.map +1 -1
- package/dist/browser/actions/SpotlightSearch.js +3 -7
- package/dist/browser/actions/SpotlightSearch.js.map +1 -1
- package/dist/browser/actions/Tabs.js +132 -47
- package/dist/browser/actions/Tabs.js.map +1 -1
- package/dist/browser/actions/index.js +2 -2
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/chat/ChatComposer.js +751 -423
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatContextPopup.js +123 -0
- package/dist/browser/chat/ChatContextPopup.js.map +1 -0
- package/dist/browser/chat/ChatPrimitives.js +141 -78
- package/dist/browser/chat/ChatPrimitives.js.map +1 -1
- package/dist/browser/chat/ChatTasks.js +112 -0
- package/dist/browser/chat/ChatTasks.js.map +1 -0
- package/dist/browser/chat/ChatTimeline.js +31 -14
- package/dist/browser/chat/ChatTimeline.js.map +1 -1
- package/dist/browser/chat/chat-behavior.js +0 -5
- package/dist/browser/chat/chat-behavior.js.map +1 -1
- package/dist/browser/chat/composer-document.js +55 -0
- package/dist/browser/chat/composer-document.js.map +1 -0
- package/dist/browser/chat/index.js +6 -1
- package/dist/browser/chat/index.js.map +1 -1
- package/dist/browser/chat/types.js.map +1 -1
- package/dist/browser/content/Chart.js +148 -239
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartExplorer.js +324 -0
- package/dist/browser/content/ChartExplorer.js.map +1 -0
- package/dist/browser/content/ChartExplorerControls.js +153 -0
- package/dist/browser/content/ChartExplorerControls.js.map +1 -0
- package/dist/browser/content/ChartFilterControls.js +200 -0
- package/dist/browser/content/ChartFilterControls.js.map +1 -0
- package/dist/browser/content/ChartSnapshotView.js +114 -0
- package/dist/browser/content/ChartSnapshotView.js.map +1 -0
- package/dist/browser/content/DataTable.js +48 -32
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/FileBrowser.js +3 -0
- package/dist/browser/content/FileBrowser.js.map +1 -1
- package/dist/browser/content/FileGrid.js +93 -0
- package/dist/browser/content/FileGrid.js.map +1 -0
- package/dist/browser/content/FileTree.js +2 -2
- package/dist/browser/content/FileTree.js.map +1 -1
- package/dist/browser/content/FileView.js +511 -162
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/MarkdownView.js +6 -0
- package/dist/browser/content/MarkdownView.js.map +1 -1
- package/dist/browser/content/Pagination.js.map +1 -1
- package/dist/browser/content/PdfPreview.js +107 -90
- package/dist/browser/content/PdfPreview.js.map +1 -1
- package/dist/browser/content/chart-cursor.js +33 -0
- package/dist/browser/content/chart-cursor.js.map +1 -0
- package/dist/browser/content/chart-explorer.js +147 -0
- package/dist/browser/content/chart-explorer.js.map +1 -0
- package/dist/browser/content/chart-inspection.js +447 -0
- package/dist/browser/content/chart-inspection.js.map +1 -0
- package/dist/browser/content/chart-line-gaps.js +53 -0
- package/dist/browser/content/chart-line-gaps.js.map +1 -0
- package/dist/browser/content/chart-map-viewport.js +5 -1
- package/dist/browser/content/chart-map-viewport.js.map +1 -1
- package/dist/browser/content/chart-snapshot.js +63 -0
- package/dist/browser/content/chart-snapshot.js.map +1 -0
- package/dist/browser/content/chart-state-timeline.js +32 -4
- package/dist/browser/content/chart-state-timeline.js.map +1 -1
- package/dist/browser/content/chart-svg.js +54 -0
- package/dist/browser/content/chart-svg.js.map +1 -0
- package/dist/browser/content/collection-selection.js +109 -0
- package/dist/browser/content/collection-selection.js.map +1 -0
- package/dist/browser/content/delimited-preferences.js +21 -0
- package/dist/browser/content/delimited-preferences.js.map +1 -0
- package/dist/browser/content/file-tree.js.map +1 -1
- package/dist/browser/content/file-view-preview.js +11 -7
- package/dist/browser/content/file-view-preview.js.map +1 -1
- package/dist/browser/content/index.js +9 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/feedback/InlineGuidance.js +17 -3
- package/dist/browser/feedback/InlineGuidance.js.map +1 -1
- package/dist/browser/feedback/dialog-core.js +81 -7
- package/dist/browser/feedback/dialog-core.js.map +1 -1
- package/dist/browser/feedback/prompts.js +6 -0
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/feedback/toast.js +29 -6
- package/dist/browser/feedback/toast.js.map +1 -1
- package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
- package/dist/browser/inputs/Select.js.map +1 -1
- package/dist/browser/inputs/SelectChip.js +3 -2
- package/dist/browser/inputs/SelectChip.js.map +1 -1
- package/dist/browser/inputs/TextInput.js +7 -1
- package/dist/browser/inputs/TextInput.js.map +1 -1
- package/dist/browser/inputs/markdown/MarkdownEditor.js +61 -37
- package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/browser/inputs/markdown/behaviors.js +1 -1
- package/dist/browser/inputs/markdown/behaviors.js.map +1 -1
- package/dist/browser/intl/Format.js +89 -16
- package/dist/browser/intl/Format.js.map +1 -1
- package/dist/browser/intl/index.js.map +1 -1
- package/dist/browser/intl/messages.js +130 -2
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +712 -624
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/BottomSheet.js +95 -0
- package/dist/browser/layout/BottomSheet.js.map +1 -0
- package/dist/browser/layout/DetailPanel.js +56 -44
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/Navigation.js +278 -0
- package/dist/browser/layout/Navigation.js.map +1 -0
- package/dist/browser/layout/PanelDialog.js +219 -71
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/ScrollArea.js +21 -1
- package/dist/browser/layout/ScrollArea.js.map +1 -1
- package/dist/browser/layout/Settings.js.map +1 -1
- package/dist/browser/layout/SidebarItemPreview.js +183 -0
- package/dist/browser/layout/SidebarItemPreview.js.map +1 -0
- package/dist/browser/layout/app-workspace-controller.js +3 -0
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/app-workspace-state.js.map +1 -1
- package/dist/browser/layout/index.js +3 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/navigation-model.js +23 -0
- package/dist/browser/layout/navigation-model.js.map +1 -0
- package/dist/browser/layout/scroll-fade.js +100 -0
- package/dist/browser/layout/scroll-fade.js.map +1 -0
- package/dist/browser/surfaces/DescriptionList.js.map +1 -1
- package/dist/browser/surfaces/StatusBadge.js +2 -1
- package/dist/browser/surfaces/StatusBadge.js.map +1 -1
- package/dist/fonts/ibm-plex-mono-cyrillic-400-italic-4aded3f2f2a7d27d.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-cyrillic-400-normal-7635422bd10ddbbc.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-cyrillic-500-normal-1d89462e86cb8e87.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-cyrillic-600-normal-2b05a8695c7f9f4a.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-italic-a0b3b8cbe5a516e7.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-normal-f8c22ec1804bd696.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-cyrillic-ext-500-normal-3febe5c7f22e4b07.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-cyrillic-ext-600-normal-83109cdd4f8665b4.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-400-italic-0840095faae86403.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-400-normal-08949f728dc52d52.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-500-normal-01d285447409c8a5.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-600-normal-0d1f0b8d0722224e.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-ext-400-italic-1b07eee6df7d26b3.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-ext-400-normal-6bc0f226a5b7884a.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-ext-500-normal-6bb06407c97584b0.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-ext-600-normal-32057cf50dd14bdb.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-vietnamese-400-italic-a6bab38af4f9c761.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-vietnamese-400-normal-62632b6375305e70.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-vietnamese-500-normal-781633d95de88040.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-vietnamese-600-normal-51b74d53e106ba8a.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-400-italic-e8731a7e2b00fc4f.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-400-normal-69afad88a0740b6e.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-500-normal-200be3a2a6b1789f.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-600-normal-730becc6f005c18c.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-700-normal-40540598b4c9eb2c.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-italic-4ffb25726a7ce4cc.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-normal-e2580ad78906551e.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-ext-500-normal-08578d906af6d986.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-ext-600-normal-d60d3d0b182753d5.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-ext-700-normal-d07dd53642480097.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-greek-400-italic-1bc10b01688ba9fa.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-greek-400-normal-02296067bc904d2a.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-greek-500-normal-8cb6e20b4dbbaa5f.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-greek-600-normal-0a9ebd9019415ee9.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-greek-700-normal-c949641d10a3bebc.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-400-italic-6de912e531b6c980.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-400-normal-3b646991d30055a9.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-500-normal-0717336fb31fcdcd.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-600-normal-8960851d691c054e.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-700-normal-42e7b0c143c19df9.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-ext-400-italic-c5c00e8a32022dfe.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-ext-400-normal-c93d2a12aaa280f6.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-ext-500-normal-2846035d85100f84.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-ext-600-normal-b25dfd4f979e442a.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-ext-700-normal-92f0392bd74fa395.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-vietnamese-400-italic-675d4bace127bffb.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-vietnamese-400-normal-771538f7f26551bd.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-vietnamese-500-normal-85ba3d9c2488a813.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-vietnamese-600-normal-5d34b803637befe3.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-vietnamese-700-normal-b79d0c4b68b85007.woff2 +0 -0
- package/dist/plex.css +1 -1
- package/dist/ssr/actions/Button.js +11 -2
- package/dist/ssr/actions/Button.js.map +1 -1
- package/dist/ssr/actions/Disclosure.js +2 -2
- package/dist/ssr/actions/Disclosure.js.map +1 -1
- package/dist/ssr/actions/Dropdown.js +4 -1
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/FilterChip.js +16 -2
- package/dist/ssr/actions/FilterChip.js.map +1 -1
- package/dist/ssr/actions/SplitButton.js +69 -22
- package/dist/ssr/actions/SplitButton.js.map +1 -1
- package/dist/ssr/actions/SpotlightSearch.js +3 -7
- package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
- package/dist/ssr/actions/Tabs.js +58 -11
- package/dist/ssr/actions/Tabs.js.map +1 -1
- package/dist/ssr/actions/index.js +2 -2
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/chat/ChatComposer.js +366 -134
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatContextPopup.js +86 -0
- package/dist/ssr/chat/ChatContextPopup.js.map +1 -0
- package/dist/ssr/chat/ChatPrimitives.js +49 -11
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
- package/dist/ssr/chat/ChatTasks.js +48 -0
- package/dist/ssr/chat/ChatTasks.js.map +1 -0
- package/dist/ssr/chat/ChatTimeline.js +14 -4
- package/dist/ssr/chat/ChatTimeline.js.map +1 -1
- package/dist/ssr/chat/chat-behavior.js +0 -5
- package/dist/ssr/chat/chat-behavior.js.map +1 -1
- package/dist/ssr/chat/composer-document.js +55 -0
- package/dist/ssr/chat/composer-document.js.map +1 -0
- package/dist/ssr/chat/index.js +6 -1
- package/dist/ssr/chat/index.js.map +1 -1
- package/dist/ssr/chat/types.js.map +1 -1
- package/dist/ssr/content/Chart.js +121 -219
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartExplorer.js +257 -0
- package/dist/ssr/content/ChartExplorer.js.map +1 -0
- package/dist/ssr/content/ChartExplorerControls.js +105 -0
- package/dist/ssr/content/ChartExplorerControls.js.map +1 -0
- package/dist/ssr/content/ChartFilterControls.js +139 -0
- package/dist/ssr/content/ChartFilterControls.js.map +1 -0
- package/dist/ssr/content/ChartSnapshotView.js +58 -0
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -0
- package/dist/ssr/content/DataTable.js +13 -9
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/FileBrowser.js +3 -0
- package/dist/ssr/content/FileBrowser.js.map +1 -1
- package/dist/ssr/content/FileGrid.js +38 -0
- package/dist/ssr/content/FileGrid.js.map +1 -0
- package/dist/ssr/content/FileTree.js +2 -2
- package/dist/ssr/content/FileTree.js.map +1 -1
- package/dist/ssr/content/FileView.js +356 -75
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/MarkdownView.js +6 -0
- package/dist/ssr/content/MarkdownView.js.map +1 -1
- package/dist/ssr/content/Pagination.js.map +1 -1
- package/dist/ssr/content/PdfPreview.js +37 -24
- package/dist/ssr/content/PdfPreview.js.map +1 -1
- package/dist/ssr/content/chart-cursor.js +33 -0
- package/dist/ssr/content/chart-cursor.js.map +1 -0
- package/dist/ssr/content/chart-explorer.js +147 -0
- package/dist/ssr/content/chart-explorer.js.map +1 -0
- package/dist/ssr/content/chart-inspection.js +447 -0
- package/dist/ssr/content/chart-inspection.js.map +1 -0
- package/dist/ssr/content/chart-line-gaps.js +53 -0
- package/dist/ssr/content/chart-line-gaps.js.map +1 -0
- package/dist/ssr/content/chart-map-viewport.js +5 -1
- package/dist/ssr/content/chart-map-viewport.js.map +1 -1
- package/dist/ssr/content/chart-snapshot.js +63 -0
- package/dist/ssr/content/chart-snapshot.js.map +1 -0
- package/dist/ssr/content/chart-state-timeline.js +32 -4
- package/dist/ssr/content/chart-state-timeline.js.map +1 -1
- package/dist/ssr/content/chart-svg.js +54 -0
- package/dist/ssr/content/chart-svg.js.map +1 -0
- package/dist/ssr/content/collection-selection.js +109 -0
- package/dist/ssr/content/collection-selection.js.map +1 -0
- package/dist/ssr/content/delimited-preferences.js +21 -0
- package/dist/ssr/content/delimited-preferences.js.map +1 -0
- package/dist/ssr/content/file-tree.js.map +1 -1
- package/dist/ssr/content/file-view-preview.js +11 -7
- package/dist/ssr/content/file-view-preview.js.map +1 -1
- package/dist/ssr/content/index.js +9 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/feedback/InlineGuidance.js +17 -3
- package/dist/ssr/feedback/InlineGuidance.js.map +1 -1
- package/dist/ssr/feedback/dialog-core.js +81 -7
- package/dist/ssr/feedback/dialog-core.js.map +1 -1
- package/dist/ssr/feedback/prompts.js +6 -0
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/feedback/toast.js +29 -6
- package/dist/ssr/feedback/toast.js.map +1 -1
- package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
- package/dist/ssr/inputs/Select.js.map +1 -1
- package/dist/ssr/inputs/SelectChip.js +3 -3
- package/dist/ssr/inputs/SelectChip.js.map +1 -1
- package/dist/ssr/inputs/TextInput.js.map +1 -1
- package/dist/ssr/inputs/markdown/MarkdownEditor.js +19 -11
- package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/ssr/inputs/markdown/behaviors.js +1 -1
- package/dist/ssr/inputs/markdown/behaviors.js.map +1 -1
- package/dist/ssr/intl/Format.js +61 -0
- package/dist/ssr/intl/Format.js.map +1 -1
- package/dist/ssr/intl/index.js.map +1 -1
- package/dist/ssr/intl/messages.js +130 -2
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +368 -275
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/BottomSheet.js +43 -0
- package/dist/ssr/layout/BottomSheet.js.map +1 -0
- package/dist/ssr/layout/DetailPanel.js +11 -4
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/Navigation.js +181 -0
- package/dist/ssr/layout/Navigation.js.map +1 -0
- package/dist/ssr/layout/PanelDialog.js +111 -26
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/ScrollArea.js +16 -1
- package/dist/ssr/layout/ScrollArea.js.map +1 -1
- package/dist/ssr/layout/Settings.js.map +1 -1
- package/dist/ssr/layout/SidebarItemPreview.js +133 -0
- package/dist/ssr/layout/SidebarItemPreview.js.map +1 -0
- package/dist/ssr/layout/app-workspace-controller.js +3 -0
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/app-workspace-state.js.map +1 -1
- package/dist/ssr/layout/index.js +3 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/navigation-model.js +23 -0
- package/dist/ssr/layout/navigation-model.js.map +1 -0
- package/dist/ssr/layout/scroll-fade.js +100 -0
- package/dist/ssr/layout/scroll-fade.js.map +1 -0
- package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
- package/dist/ssr/surfaces/StatusBadge.js +2 -1
- package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tabler.css +1 -1
- package/dist/types/actions/Button.d.ts +4 -0
- package/dist/types/actions/Disclosure.d.ts +1 -0
- package/dist/types/actions/FilterChip.d.ts +4 -0
- package/dist/types/actions/SplitButton.d.ts +6 -0
- package/dist/types/actions/SpotlightSearch.d.ts +0 -4
- package/dist/types/actions/Tabs.d.ts +4 -0
- package/dist/types/actions/index.d.ts +4 -4
- package/dist/types/chat/ChatComposer.d.ts +20 -2
- package/dist/types/chat/ChatContextPopup.d.ts +6 -0
- package/dist/types/chat/ChatPrimitives.d.ts +4 -0
- package/dist/types/chat/ChatTasks.d.ts +15 -0
- package/dist/types/chat/ChatTimeline.d.ts +2 -0
- package/dist/types/chat/chat-behavior.d.ts +0 -3
- package/dist/types/chat/composer-document.d.ts +14 -0
- package/dist/types/chat/index.d.ts +8 -1
- package/dist/types/chat/types.d.ts +7 -0
- package/dist/types/content/Chart.d.ts +42 -23
- package/dist/types/content/ChartExplorer.d.ts +34 -0
- package/dist/types/content/ChartExplorerControls.d.ts +10 -0
- package/dist/types/content/ChartFilterControls.d.ts +21 -0
- package/dist/types/content/ChartSnapshotView.d.ts +11 -0
- package/dist/types/content/DataTable.d.ts +4 -0
- package/dist/types/content/FileBrowser.d.ts +1 -0
- package/dist/types/content/FileGrid.d.ts +21 -0
- package/dist/types/content/FileView.d.ts +20 -0
- package/dist/types/content/PdfPreview.d.ts +8 -1
- package/dist/types/content/chart-cursor.d.ts +15 -0
- package/dist/types/content/chart-explorer.d.ts +48 -0
- package/dist/types/content/chart-inspection.d.ts +40 -0
- package/dist/types/content/chart-line-gaps.d.ts +5 -0
- package/dist/types/content/chart-map-viewport.d.ts +1 -1
- package/dist/types/content/chart-snapshot.d.ts +26 -0
- package/dist/types/content/chart-svg.d.ts +21 -0
- package/dist/types/content/collection-selection.d.ts +24 -0
- package/dist/types/content/delimited-preferences.d.ts +11 -0
- package/dist/types/content/file-tree.d.ts +2 -0
- package/dist/types/content/file-view-preview.d.ts +4 -1
- package/dist/types/content/index.d.ts +16 -2
- package/dist/types/feedback/InlineGuidance.d.ts +1 -0
- package/dist/types/feedback/dialog-core.d.ts +11 -0
- package/dist/types/feedback/prompts.d.ts +2 -0
- package/dist/types/feedback/toast.d.ts +7 -1
- package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -1
- package/dist/types/intl/Format.d.ts +9 -0
- package/dist/types/intl/index.d.ts +1 -1
- package/dist/types/intl/messages.d.ts +31 -1
- package/dist/types/layout/AppWorkspace.d.ts +35 -18
- package/dist/types/layout/BottomSheet.d.ts +23 -0
- package/dist/types/layout/DetailPanel.d.ts +1 -0
- package/dist/types/layout/Navigation.d.ts +8 -0
- package/dist/types/layout/PanelDialog.d.ts +14 -1
- package/dist/types/layout/ScrollArea.d.ts +4 -0
- package/dist/types/layout/Settings.d.ts +1 -1
- package/dist/types/layout/SidebarItemPreview.d.ts +11 -0
- package/dist/types/layout/index.d.ts +4 -1
- package/dist/types/layout/navigation-model.d.ts +48 -0
- package/dist/types/layout/scroll-fade.d.ts +3 -0
- package/dist/types/surfaces/DescriptionList.d.ts +1 -1
- package/dist/types/surfaces/StatusBadge.d.ts +1 -1
- package/package.json +5 -7
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { template as _$template } from "solid-js/web";
|
|
2
|
+
import { delegateEvents as _$delegateEvents } from "solid-js/web";
|
|
3
|
+
import { className as _$className } from "solid-js/web";
|
|
4
|
+
import { effect as _$effect } from "solid-js/web";
|
|
5
|
+
import { runHydrationEvents as _$runHydrationEvents } from "solid-js/web";
|
|
6
|
+
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
7
|
+
import { getNextMarker as _$getNextMarker } from "solid-js/web";
|
|
8
|
+
import { insert as _$insert } from "solid-js/web";
|
|
9
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
10
|
+
import { memo as _$memo } from "solid-js/web";
|
|
11
|
+
import { setAttribute as _$setAttribute } from "solid-js/web";
|
|
12
|
+
var _tmpl$ = /*#__PURE__*/_$template(`<ol class=k2b-chat-tasks__list>`),
|
|
13
|
+
_tmpl$2 = /*#__PURE__*/_$template(`<section class=k2b-chat-tasks><button type=button class=k2b-chat-tasks__header><i class="ti ti-list-check"aria-hidden=true></i><span class=k2b-chat-tasks__title><!$><!/><!$><!/></span><span class=k2b-chat-tasks__count></span><span class=k2b-chat-tasks__segments aria-hidden=true></span><i aria-hidden=true></i></button><!$><!/>`),
|
|
14
|
+
_tmpl$3 = /*#__PURE__*/_$template(`<span>`),
|
|
15
|
+
_tmpl$4 = /*#__PURE__*/_$template(`<li><i aria-hidden=true></i><span class=k2b-chat-tasks__content></span><span class=k2b-chat-tasks__status>`);
|
|
16
|
+
import { createUniqueId, For, Show } from "solid-js";
|
|
17
|
+
/** Presentation only. The host owns the plan and execution state. */
|
|
18
|
+
export function ChatTasks(props) {
|
|
19
|
+
const id = createUniqueId();
|
|
20
|
+
const active = () => props.items.find(item => item.status === "in_progress");
|
|
21
|
+
const icon = status => status === "completed" ? "ti ti-check" : status === "cancelled" ? "ti ti-minus" : status === "in_progress" ? "ti ti-wave-saw-tool" : "ti ti-circle";
|
|
22
|
+
return _$createComponent(Show, {
|
|
23
|
+
get when() {
|
|
24
|
+
return props.items.length;
|
|
25
|
+
},
|
|
26
|
+
get children() {
|
|
27
|
+
var _el$ = _$getNextElement(_tmpl$2),
|
|
28
|
+
_el$2 = _el$.firstChild,
|
|
29
|
+
_el$3 = _el$2.firstChild,
|
|
30
|
+
_el$4 = _el$3.nextSibling,
|
|
31
|
+
_el$5 = _el$4.firstChild,
|
|
32
|
+
[_el$6, _co$] = _$getNextMarker(_el$5.nextSibling),
|
|
33
|
+
_el$7 = _el$6.nextSibling,
|
|
34
|
+
[_el$8, _co$2] = _$getNextMarker(_el$7.nextSibling),
|
|
35
|
+
_el$9 = _el$4.nextSibling,
|
|
36
|
+
_el$0 = _el$9.nextSibling,
|
|
37
|
+
_el$1 = _el$0.nextSibling,
|
|
38
|
+
_el$11 = _el$2.nextSibling,
|
|
39
|
+
[_el$12, _co$3] = _$getNextMarker(_el$11.nextSibling);
|
|
40
|
+
_el$2.$$click = () => props.onOpenChange(!props.open);
|
|
41
|
+
_$setAttribute(_el$2, "aria-controls", id);
|
|
42
|
+
_$insert(_el$4, () => props.label, _el$6, _co$);
|
|
43
|
+
_$insert(_el$4, _$createComponent(Show, {
|
|
44
|
+
get when() {
|
|
45
|
+
return active();
|
|
46
|
+
},
|
|
47
|
+
get children() {
|
|
48
|
+
return [" \xB7 ", _$memo(() => active().content)];
|
|
49
|
+
}
|
|
50
|
+
}), _el$8, _co$2);
|
|
51
|
+
_$insert(_el$9, () => props.progressLabel);
|
|
52
|
+
_$insert(_el$0, _$createComponent(For, {
|
|
53
|
+
get each() {
|
|
54
|
+
return props.items;
|
|
55
|
+
},
|
|
56
|
+
children: item => (() => {
|
|
57
|
+
var _el$13 = _$getNextElement(_tmpl$3);
|
|
58
|
+
_$effect(() => _$setAttribute(_el$13, "data-status", item.status));
|
|
59
|
+
return _el$13;
|
|
60
|
+
})()
|
|
61
|
+
}));
|
|
62
|
+
_$insert(_el$, _$createComponent(Show, {
|
|
63
|
+
get when() {
|
|
64
|
+
return props.open;
|
|
65
|
+
},
|
|
66
|
+
get children() {
|
|
67
|
+
var _el$10 = _$getNextElement(_tmpl$);
|
|
68
|
+
_$setAttribute(_el$10, "id", id);
|
|
69
|
+
_$insert(_el$10, _$createComponent(For, {
|
|
70
|
+
get each() {
|
|
71
|
+
return props.items;
|
|
72
|
+
},
|
|
73
|
+
children: item => (() => {
|
|
74
|
+
var _el$14 = _$getNextElement(_tmpl$4),
|
|
75
|
+
_el$15 = _el$14.firstChild,
|
|
76
|
+
_el$16 = _el$15.nextSibling,
|
|
77
|
+
_el$17 = _el$16.nextSibling;
|
|
78
|
+
_$insert(_el$16, () => item.content);
|
|
79
|
+
_$insert(_el$17, () => props.statusLabels[item.status]);
|
|
80
|
+
_$effect(_p$ => {
|
|
81
|
+
var _v$3 = item.status,
|
|
82
|
+
_v$4 = icon(item.status);
|
|
83
|
+
_v$3 !== _p$.e && _$setAttribute(_el$14, "data-status", _p$.e = _v$3);
|
|
84
|
+
_v$4 !== _p$.t && _$className(_el$15, _p$.t = _v$4);
|
|
85
|
+
return _p$;
|
|
86
|
+
}, {
|
|
87
|
+
e: undefined,
|
|
88
|
+
t: undefined
|
|
89
|
+
});
|
|
90
|
+
return _el$14;
|
|
91
|
+
})()
|
|
92
|
+
}));
|
|
93
|
+
return _el$10;
|
|
94
|
+
}
|
|
95
|
+
}), _el$12, _co$3);
|
|
96
|
+
_$effect(_p$ => {
|
|
97
|
+
var _v$ = props.open,
|
|
98
|
+
_v$2 = props.open ? "ti ti-chevron-up" : "ti ti-chevron-down";
|
|
99
|
+
_v$ !== _p$.e && _$setAttribute(_el$2, "aria-expanded", _p$.e = _v$);
|
|
100
|
+
_v$2 !== _p$.t && _$className(_el$1, _p$.t = _v$2);
|
|
101
|
+
return _p$;
|
|
102
|
+
}, {
|
|
103
|
+
e: undefined,
|
|
104
|
+
t: undefined
|
|
105
|
+
});
|
|
106
|
+
_$runHydrationEvents();
|
|
107
|
+
return _el$;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
_$delegateEvents(["click"]);
|
|
112
|
+
//# sourceMappingURL=ChatTasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createUniqueId","For","Show","ChatTasks","props","id","active","items","find","item","status","icon","_$createComponent","when","length","children","_el$","_$getNextElement","_tmpl$2","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_el$6","_co$","_$getNextMarker","_el$7","_el$8","_co$2","_el$9","_el$0","_el$1","_el$11","_el$12","_co$3","$$click","onOpenChange","open","_$setAttribute","_$insert","label","_$memo","content","progressLabel","each","_el$13","_tmpl$3","_$effect","_el$10","_tmpl$","_el$14","_tmpl$4","_el$15","_el$16","_el$17","statusLabels","_p$","_v$3","_v$4","e","t","_$className","undefined","_v$","_v$2","_$runHydrationEvents","_$delegateEvents"],"sources":["chat/ChatTasks.tsx"],"sourcesContent":["import { 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":"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","ignoreList":[]}
|
|
@@ -13,12 +13,13 @@ import { use as _$use } from "solid-js/web";
|
|
|
13
13
|
var _tmpl$ = /*#__PURE__*/_$template(`<div class=k2b-chat-timeline__navigation aria-live=off>`),
|
|
14
14
|
_tmpl$2 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-timeline__older><i class="ti ti-history"aria-hidden=true></i><!$><!/>`),
|
|
15
15
|
_tmpl$3 = /*#__PURE__*/_$template(`<div class=k2b-chat-timeline__history aria-live=off><!$><!/><!$><!/><!$><!/>`),
|
|
16
|
-
_tmpl$4 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-timeline__latest><i class="ti ti-arrow-down"aria-hidden=true></i
|
|
16
|
+
_tmpl$4 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-timeline__latest><i class="ti ti-arrow-down"aria-hidden=true></i><!$><!/>`),
|
|
17
17
|
_tmpl$5 = /*#__PURE__*/_$template(`<section><div class=k2b-chat-timeline__viewport data-initializing role=region tabindex=0><!$><!/><div class=k2b-chat-timeline__content role=log aria-live=polite aria-relevant="additions text"><div class=k2b-chat-timeline__sentinel aria-hidden=true></div><!$><!/><!$><!/></div></div><!$><!/>`),
|
|
18
18
|
_tmpl$6 = /*#__PURE__*/_$template(`<i class="ti ti-loader-2 k2b-spin"aria-hidden=true>`),
|
|
19
19
|
_tmpl$7 = /*#__PURE__*/_$template(`<button type=button class=k2b-chat-timeline__retry><i class="ti ti-refresh"aria-hidden=true>`);
|
|
20
20
|
import { createEffect, createSignal, For, onCleanup, onMount, Show, untrack } from "solid-js";
|
|
21
21
|
import { useUiMessages } from "../intl/messages";
|
|
22
|
+
import { createScrollFade } from "../layout/scroll-fade";
|
|
22
23
|
import Placeholder from "../surfaces/Placeholder";
|
|
23
24
|
import { ChatActivity, ChatMessage } from "./ChatPrimitives";
|
|
24
25
|
import { isChatNearBottom, restoredChatScrollTop } from "./chat-behavior";
|
|
@@ -28,6 +29,7 @@ export function ChatTimeline(props) {
|
|
|
28
29
|
const [loadingOlderInternally, setLoadingOlderInternally] = createSignal(false);
|
|
29
30
|
const [historyError, setHistoryError] = createSignal(null);
|
|
30
31
|
let viewportRef;
|
|
32
|
+
createScrollFade(() => viewportRef, () => props.scrollFade !== false);
|
|
31
33
|
let contentRef;
|
|
32
34
|
let topSentinelRef;
|
|
33
35
|
let followFrame;
|
|
@@ -44,6 +46,14 @@ export function ChatTimeline(props) {
|
|
|
44
46
|
if (followFrame !== undefined) cancelAnimationFrame(followFrame);
|
|
45
47
|
followFrame = undefined;
|
|
46
48
|
};
|
|
49
|
+
props.scrollToAnchorRef?.(anchorId => {
|
|
50
|
+
const anchor = Array.from(contentRef?.querySelectorAll("[data-chat-anchor]") ?? []).find(element => element.dataset.chatAnchor === String(anchorId));
|
|
51
|
+
if (!viewportRef || !anchor) return false;
|
|
52
|
+
cancelFollow();
|
|
53
|
+
setPinned(false);
|
|
54
|
+
viewportRef.scrollTop = Math.max(0, viewportRef.scrollTop + anchor.getBoundingClientRect().top - viewportRef.getBoundingClientRect().top - 16);
|
|
55
|
+
return true;
|
|
56
|
+
});
|
|
47
57
|
const noteUserScrollAway = () => {
|
|
48
58
|
userScrollingAway = true;
|
|
49
59
|
if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);
|
|
@@ -142,8 +152,8 @@ export function ChatTimeline(props) {
|
|
|
142
152
|
[_el$16, _co$5] = _$getNextMarker(_el$15.nextSibling),
|
|
143
153
|
_el$17 = _el$16.nextSibling,
|
|
144
154
|
[_el$18, _co$6] = _$getNextMarker(_el$17.nextSibling),
|
|
145
|
-
_el$
|
|
146
|
-
[_el$
|
|
155
|
+
_el$25 = _el$2.nextSibling,
|
|
156
|
+
[_el$26, _co$9] = _$getNextMarker(_el$25.nextSibling);
|
|
147
157
|
_el$2.addEventListener("scroll", updatePinned);
|
|
148
158
|
_el$2.$$touchend = () => {
|
|
149
159
|
touchY = undefined;
|
|
@@ -243,11 +253,11 @@ export function ChatTimeline(props) {
|
|
|
243
253
|
tone: "danger",
|
|
244
254
|
get trailing() {
|
|
245
255
|
return (() => {
|
|
246
|
-
var _el$
|
|
247
|
-
_el$
|
|
248
|
-
_$effect(() => _$setAttribute(_el$
|
|
256
|
+
var _el$28 = _$getNextElement(_tmpl$7);
|
|
257
|
+
_el$28.$$click = () => void loadOlder();
|
|
258
|
+
_$effect(() => _$setAttribute(_el$28, "aria-label", messages().retryOlderMessages));
|
|
249
259
|
_$runHydrationEvents();
|
|
250
|
-
return _el$
|
|
260
|
+
return _el$28;
|
|
251
261
|
})();
|
|
252
262
|
}
|
|
253
263
|
})
|
|
@@ -374,29 +384,36 @@ export function ChatTimeline(props) {
|
|
|
374
384
|
return _$memo(() => !!!pinned())() && hasContent();
|
|
375
385
|
},
|
|
376
386
|
get children() {
|
|
377
|
-
var _el$21 = _$getNextElement(_tmpl$4)
|
|
387
|
+
var _el$21 = _$getNextElement(_tmpl$4),
|
|
388
|
+
_el$22 = _el$21.firstChild,
|
|
389
|
+
_el$23 = _el$22.nextSibling,
|
|
390
|
+
[_el$24, _co$8] = _$getNextMarker(_el$23.nextSibling);
|
|
378
391
|
_el$21.$$click = scrollToLatest;
|
|
392
|
+
_$insert(_el$21, () => messages().jumpToLatest, _el$24, _co$8);
|
|
379
393
|
_$runHydrationEvents();
|
|
380
394
|
return _el$21;
|
|
381
395
|
}
|
|
382
|
-
}), _el$
|
|
396
|
+
}), _el$26, _co$9);
|
|
383
397
|
_$effect(_p$ => {
|
|
384
398
|
var _v$ = `k2b-chat-timeline ${props.class ?? ""}`,
|
|
385
399
|
_v$2 = props.label ?? messages().conversation,
|
|
386
|
-
_v$3 =
|
|
400
|
+
_v$3 = props.scrollFade !== false ? "bottom" : undefined,
|
|
401
|
+
_v$4 = messages().conversationMessages({
|
|
387
402
|
label: props.label ?? messages().conversation
|
|
388
403
|
}),
|
|
389
|
-
_v$
|
|
404
|
+
_v$5 = props.loading ? "true" : undefined;
|
|
390
405
|
_v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
|
|
391
406
|
_v$2 !== _p$.t && _$setAttribute(_el$, "aria-label", _p$.t = _v$2);
|
|
392
|
-
_v$3 !== _p$.a && _$setAttribute(_el$2, "
|
|
393
|
-
_v$4 !== _p$.o && _$setAttribute(_el$
|
|
407
|
+
_v$3 !== _p$.a && _$setAttribute(_el$2, "data-scroll-fade-mode", _p$.a = _v$3);
|
|
408
|
+
_v$4 !== _p$.o && _$setAttribute(_el$2, "aria-label", _p$.o = _v$4);
|
|
409
|
+
_v$5 !== _p$.i && _$setAttribute(_el$4, "aria-busy", _p$.i = _v$5);
|
|
394
410
|
return _p$;
|
|
395
411
|
}, {
|
|
396
412
|
e: undefined,
|
|
397
413
|
t: undefined,
|
|
398
414
|
a: undefined,
|
|
399
|
-
o: undefined
|
|
415
|
+
o: undefined,
|
|
416
|
+
i: undefined
|
|
400
417
|
});
|
|
401
418
|
_$runHydrationEvents();
|
|
402
419
|
return _el$;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createEffect","createSignal","For","onCleanup","onMount","Show","untrack","useUiMessages","Placeholder","ChatActivity","ChatMessage","isChatNearBottom","restoredChatScrollTop","ChatTimeline","props","messages","pinned","setPinned","loadingOlderInternally","setLoadingOlderInternally","historyError","setHistoryError","viewportRef","contentRef","topSentinelRef","followFrame","userScrollFrame","userScrollingAway","touchY","lastConversationKey","loadingOlder","Boolean","canLoadOlder","onLoadOlder","hasMore","hasHistoryControls","hasContent","items","length","threshold","Math","max","followThreshold","cancelFollow","undefined","cancelAnimationFrame","noteUserScrollAway","requestAnimationFrame","scrollToLatest","scrollTop","scrollHeight","scheduleFollow","loadOlder","viewport","previousScrollTop","previousScrollHeight","prepended","error","Error","message","couldNotLoadOlderMessages","queueMicrotask","updatePinned","nearBottom","clientHeight","removeAttribute","resizeObserver","ResizeObserver","observe","historyObserver","IntersectionObserver","entries","some","entry","isIntersecting","root","rootMargin","disconnect","key","conversationKey","at","id","_el$","_$getNextElement","_tmpl$5","_el$2","firstChild","_el$19","_el$20","_co$7","_$getNextMarker","nextSibling","_el$4","_el$5","_el$15","_el$16","_co$5","_el$17","_el$18","_co$6","_el$22","_el$23","_co$8","addEventListener","$$touchend","$$touchmove","event","nextY","touches","clientY","$$touchstart","$$keydown","target","currentTarget","shiftKey","deltaY","_$use","element","_$insert","_$createComponent","when","navigation","children","_el$3","_tmpl$","_ref$","_el$6","_tmpl$3","_el$1","_el$10","_co$2","_el$11","_el$12","_co$3","_el$13","_el$14","_co$4","_el$7","_tmpl$2","_el$8","_el$9","_el$0","_co$","$$click","loadOlderMessages","_$runHydrationEvents","label","loadingOlderMessages","icon","trailing","_tmpl$6","description","tone","_el$25","_tmpl$7","_$effect","_$setAttribute","retryOlderMessages","_$memo","loading","fallback","state","title","loadingConversation","emptyTitle","startConversation","emptyDescription","each","item","kind","leading","accent","busy","defaultOpen","anchorId","class","content","role","createdAt","timeLabel","status","attachments","actions","actionDisplay","onActionError","_el$21","_tmpl$4","_p$","_v$","_v$2","conversation","_v$3","conversationMessages","_v$4","e","_$className","t","a","o","_$delegateEvents"],"sources":["chat/ChatTimeline.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, onCleanup, onMount, Show, untrack } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport { ChatActivity, ChatMessage } from \"./ChatPrimitives\";\nimport { isChatNearBottom, restoredChatScrollTop } from \"./chat-behavior\";\nimport type { ChatAction, ChatActivityTone, ChatAttachment, ChatMessageStatus, ChatRole } from \"./types\";\n\nexport type ChatMessageItem = {\n kind: \"message\";\n id: string;\n role: ChatRole;\n content?: JSX.Element;\n label?: string;\n createdAt?: string | Date;\n timeLabel?: string;\n status?: ChatMessageStatus;\n attachments?: readonly ChatAttachment[];\n actions?: readonly ChatAction[];\n actionDisplay?: \"auto\" | \"inline\" | \"menu\";\n anchorId?: string | number;\n class?: string;\n};\n\nexport type ChatActivityItem = {\n kind: \"activity\";\n id: string;\n label: string;\n description?: string;\n icon?: string;\n leading?: JSX.Element;\n accent?: string;\n tone?: ChatActivityTone;\n busy?: boolean;\n trailing?: JSX.Element;\n defaultOpen?: boolean;\n anchorId?: string | number;\n content?: JSX.Element;\n class?: string;\n};\n\nexport type ChatTimelineItem = ChatMessageItem | ChatActivityItem;\n\nexport type ChatTimelineProps = {\n items: readonly ChatTimelineItem[];\n conversationKey?: string | null;\n loading?: boolean;\n hasMore?: boolean;\n loadingOlder?: boolean;\n onLoadOlder?: () => boolean | void | Promise<boolean | void>;\n emptyTitle?: string;\n emptyDescription?: string;\n navigation?: JSX.Element;\n onActionError?: (error: unknown) => void;\n viewportRef?: (element: HTMLDivElement) => void;\n contentRef?: (element: HTMLDivElement) => void;\n label?: string;\n followThreshold?: number;\n class?: string;\n};\n\nexport function ChatTimeline(props: ChatTimelineProps): JSX.Element {\n const messages = useUiMessages();\n const [pinned, setPinned] = createSignal(true);\n const [loadingOlderInternally, setLoadingOlderInternally] = createSignal(false);\n const [historyError, setHistoryError] = createSignal<string | null>(null);\n let viewportRef: HTMLDivElement | undefined;\n let contentRef: HTMLDivElement | undefined;\n let topSentinelRef: HTMLDivElement | undefined;\n let followFrame: number | undefined;\n let userScrollFrame: number | undefined;\n let userScrollingAway = false;\n let touchY: number | undefined;\n let lastConversationKey: string | null | undefined;\n\n const loadingOlder = () => Boolean(props.loadingOlder || loadingOlderInternally());\n const canLoadOlder = () => Boolean(props.onLoadOlder && props.hasMore && !loadingOlder());\n const hasHistoryControls = () => loadingOlder() || historyError() !== null || canLoadOlder();\n const hasContent = () => props.items.length > 0;\n const threshold = () => Math.max(0, props.followThreshold ?? 96);\n\n const cancelFollow = () => {\n if (followFrame !== undefined) cancelAnimationFrame(followFrame);\n followFrame = undefined;\n };\n\n const noteUserScrollAway = () => {\n userScrollingAway = true;\n if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);\n userScrollFrame = requestAnimationFrame(() => {\n userScrollFrame = undefined;\n userScrollingAway = false;\n });\n };\n\n const scrollToLatest = () => {\n if (!viewportRef) return;\n setPinned(true);\n viewportRef.scrollTop = viewportRef.scrollHeight;\n };\n\n const scheduleFollow = () => {\n if (!pinned() || followFrame !== undefined) return;\n followFrame = requestAnimationFrame(() => {\n followFrame = undefined;\n if (pinned()) scrollToLatest();\n });\n };\n\n const loadOlder = async () => {\n if (!props.onLoadOlder || !props.hasMore || loadingOlder()) return;\n const viewport = viewportRef;\n if (!viewport) return;\n const previousScrollTop = viewport.scrollTop;\n const previousScrollHeight = viewport.scrollHeight;\n setHistoryError(null);\n setLoadingOlderInternally(true);\n let prepended = false;\n try {\n prepended = (await props.onLoadOlder()) !== false;\n } catch (error) {\n setHistoryError(error instanceof Error ? error.message : messages().couldNotLoadOlderMessages);\n } finally {\n setLoadingOlderInternally(false);\n }\n if (!prepended || viewportRef !== viewport) return;\n queueMicrotask(() => {\n requestAnimationFrame(() => {\n if (viewportRef !== viewport) return;\n viewport.scrollTop = restoredChatScrollTop(previousScrollTop, previousScrollHeight, viewport.scrollHeight);\n });\n });\n };\n\n const updatePinned = () => {\n if (!viewportRef) return;\n const nearBottom = isChatNearBottom(viewportRef.scrollHeight, viewportRef.scrollTop, viewportRef.clientHeight, threshold());\n if (nearBottom) setPinned(true);\n else if (userScrollingAway || followFrame === undefined) {\n if (userScrollingAway) cancelFollow();\n setPinned(false);\n }\n if (viewportRef.scrollTop <= threshold()) void loadOlder();\n };\n\n onMount(() => {\n // Switch from CSS-only SSR anchoring to normal scroll coordinates before paint.\n viewportRef?.removeAttribute(\"data-initializing\");\n scrollToLatest();\n const resizeObserver = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(() => scheduleFollow());\n if (contentRef) resizeObserver?.observe(contentRef);\n if (viewportRef) resizeObserver?.observe(viewportRef);\n\n const historyObserver =\n typeof IntersectionObserver === \"undefined\" || !topSentinelRef\n ? null\n : new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) void loadOlder();\n },\n { root: viewportRef, rootMargin: \"160px 0px 0px\" },\n );\n if (topSentinelRef) historyObserver?.observe(topSentinelRef);\n\n onCleanup(() => {\n cancelFollow();\n if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);\n resizeObserver?.disconnect();\n historyObserver?.disconnect();\n });\n });\n\n createEffect(() => {\n const key = props.conversationKey;\n if (key === lastConversationKey) return;\n lastConversationKey = key;\n setHistoryError(null);\n setPinned(true);\n queueMicrotask(scrollToLatest);\n });\n\n createEffect(() => {\n props.items.length;\n props.items.at(-1)?.id;\n untrack(scheduleFollow);\n });\n\n return (\n <section class={`k2b-chat-timeline ${props.class ?? \"\"}`} aria-label={props.label ?? messages().conversation}>\n <div\n ref={(element) => {\n viewportRef = element;\n props.viewportRef?.(element);\n }}\n class=\"k2b-chat-timeline__viewport\"\n data-initializing=\"\"\n role=\"region\"\n aria-label={messages().conversationMessages({ label: props.label ?? messages().conversation })}\n tabIndex={0}\n onWheel={(event) => {\n if (event.deltaY < 0) noteUserScrollAway();\n }}\n onKeyDown={(event) => {\n if (event.target !== event.currentTarget) return;\n if (event.key === \"ArrowUp\" || event.key === \"PageUp\" || event.key === \"Home\" || (event.key === \" \" && event.shiftKey)) {\n noteUserScrollAway();\n }\n }}\n onTouchStart={(event) => {\n touchY = event.touches[0]?.clientY;\n }}\n onTouchMove={(event) => {\n const nextY = event.touches[0]?.clientY;\n if (nextY !== undefined && touchY !== undefined && nextY > touchY) noteUserScrollAway();\n touchY = nextY;\n }}\n onTouchEnd={() => {\n touchY = undefined;\n }}\n onScroll={updatePinned}\n >\n <Show when={props.navigation}>\n <div class=\"k2b-chat-timeline__navigation\" aria-live=\"off\">\n {props.navigation}\n </div>\n </Show>\n <div\n ref={(element) => {\n contentRef = element;\n props.contentRef?.(element);\n }}\n class=\"k2b-chat-timeline__content\"\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions text\"\n aria-busy={props.loading ? \"true\" : undefined}\n >\n <div ref={topSentinelRef} class=\"k2b-chat-timeline__sentinel\" aria-hidden=\"true\" />\n <Show when={hasHistoryControls()}>\n <div class=\"k2b-chat-timeline__history\" aria-live=\"off\">\n <Show when={canLoadOlder()}>\n <button type=\"button\" class=\"k2b-chat-timeline__older\" onClick={() => void loadOlder()}>\n <i class=\"ti ti-history\" aria-hidden=\"true\" />\n {messages().loadOlderMessages}\n </button>\n </Show>\n <Show when={loadingOlder()}>\n <ChatActivity\n label={messages().loadingOlderMessages}\n icon=\"ti ti-history\"\n trailing={<i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />}\n />\n </Show>\n <Show when={historyError()}>\n {(message) => (\n <ChatActivity\n label={messages().couldNotLoadOlderMessages}\n description={message()}\n icon=\"ti ti-alert-circle\"\n tone=\"danger\"\n trailing={\n <button\n type=\"button\"\n class=\"k2b-chat-timeline__retry\"\n aria-label={messages().retryOlderMessages}\n onClick={() => void loadOlder()}\n >\n <i class=\"ti ti-refresh\" aria-hidden=\"true\" />\n </button>\n }\n />\n )}\n </Show>\n </div>\n </Show>\n <Show\n when={!props.loading && hasContent()}\n fallback={\n <Placeholder\n class=\"k2b-chat-timeline__placeholder\"\n state={props.loading ? \"loading\" : \"empty\"}\n icon={props.loading ? undefined : \"ti ti-sparkles\"}\n title={props.loading ? messages().loadingConversation : (props.emptyTitle ?? messages().startConversation)}\n description={!props.loading ? props.emptyDescription : undefined}\n />\n }\n >\n <For each={props.items}>\n {(item) => (\n <Show\n when={item.kind === \"message\"}\n fallback={\n <ChatActivity\n label={(item as ChatActivityItem).label}\n description={(item as ChatActivityItem).description}\n icon={(item as ChatActivityItem).icon}\n leading={(item as ChatActivityItem).leading}\n accent={(item as ChatActivityItem).accent}\n tone={(item as ChatActivityItem).tone}\n busy={(item as ChatActivityItem).busy}\n trailing={(item as ChatActivityItem).trailing}\n defaultOpen={(item as ChatActivityItem).defaultOpen}\n anchorId={(item as ChatActivityItem).anchorId}\n class={(item as ChatActivityItem).class}\n >\n {(item as ChatActivityItem).content}\n </ChatActivity>\n }\n >\n <ChatMessage\n role={(item as ChatMessageItem).role}\n label={(item as ChatMessageItem).label}\n createdAt={(item as ChatMessageItem).createdAt}\n timeLabel={(item as ChatMessageItem).timeLabel}\n status={(item as ChatMessageItem).status}\n attachments={(item as ChatMessageItem).attachments}\n actions={(item as ChatMessageItem).actions}\n actionDisplay={(item as ChatMessageItem).actionDisplay}\n anchorId={(item as ChatMessageItem).anchorId}\n onActionError={props.onActionError}\n class={(item as ChatMessageItem).class}\n >\n {(item as ChatMessageItem).content}\n </ChatMessage>\n </Show>\n )}\n </For>\n </Show>\n </div>\n </div>\n <Show when={!pinned() && hasContent()}>\n <button type=\"button\" class=\"k2b-chat-timeline__latest\" onClick={scrollToLatest}>\n <i class=\"ti ti-arrow-down\" aria-hidden=\"true\" />\n Jump to latest\n </button>\n </Show>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,SAASA,YAAY,EAAEC,YAAY,EAAEC,GAAG,EAAYC,SAAS,EAAEC,OAAO,EAAEC,IAAI,EAAEC,OAAO,QAAQ,UAAU;AACvG,SAASC,aAAa,QAAQ,kBAAkB;AAChD,OAAOC,WAAW,MAAM,yBAAyB;AACjD,SAASC,YAAY,EAAEC,WAAW,QAAQ,kBAAkB;AAC5D,SAASC,gBAAgB,EAAEC,qBAAqB,QAAQ,iBAAiB;AAwDzE,OAAO,SAASC,YAAYA,CAACC,KAAwB,EAAe;EAClE,MAAMC,QAAQ,GAAGR,aAAa,CAAC,CAAC;EAChC,MAAM,CAACS,MAAM,EAAEC,SAAS,CAAC,GAAGhB,YAAY,CAAC,IAAI,CAAC;EAC9C,MAAM,CAACiB,sBAAsB,EAAEC,yBAAyB,CAAC,GAAGlB,YAAY,CAAC,KAAK,CAAC;EAC/E,MAAM,CAACmB,YAAY,EAAEC,eAAe,CAAC,GAAGpB,YAAY,CAAgB,IAAI,CAAC;EACzE,IAAIqB,WAAuC;EAC3C,IAAIC,UAAsC;EAC1C,IAAIC,cAA0C;EAC9C,IAAIC,WAA+B;EACnC,IAAIC,eAAmC;EACvC,IAAIC,iBAAiB,GAAG,KAAK;EAC7B,IAAIC,MAA0B;EAC9B,IAAIC,mBAA8C;EAElD,MAAMC,YAAY,GAAGA,CAAA,KAAMC,OAAO,CAACjB,KAAK,CAACgB,YAAY,IAAIZ,sBAAsB,CAAC,CAAC,CAAC;EAClF,MAAMc,YAAY,GAAGA,CAAA,KAAMD,OAAO,CAACjB,KAAK,CAACmB,WAAW,IAAInB,KAAK,CAACoB,OAAO,IAAI,CAACJ,YAAY,CAAC,CAAC,CAAC;EACzF,MAAMK,kBAAkB,GAAGA,CAAA,KAAML,YAAY,CAAC,CAAC,IAAIV,YAAY,CAAC,CAAC,KAAK,IAAI,IAAIY,YAAY,CAAC,CAAC;EAC5F,MAAMI,UAAU,GAAGA,CAAA,KAAMtB,KAAK,CAACuB,KAAK,CAACC,MAAM,GAAG,CAAC;EAC/C,MAAMC,SAAS,GAAGA,CAAA,KAAMC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAE3B,KAAK,CAAC4B,eAAe,IAAI,EAAE,CAAC;EAEhE,MAAMC,YAAY,GAAGA,CAAA,KAAM;IACzB,IAAIlB,WAAW,KAAKmB,SAAS,EAAEC,oBAAoB,CAACpB,WAAW,CAAC;IAChEA,WAAW,GAAGmB,SAAS;EACzB,CAAC;EAED,MAAME,kBAAkB,GAAGA,CAAA,KAAM;IAC/BnB,iBAAiB,GAAG,IAAI;IACxB,IAAID,eAAe,KAAKkB,SAAS,EAAEC,oBAAoB,CAACnB,eAAe,CAAC;IACxEA,eAAe,GAAGqB,qBAAqB,CAAC,MAAM;MAC5CrB,eAAe,GAAGkB,SAAS;MAC3BjB,iBAAiB,GAAG,KAAK;IAC3B,CAAC,CAAC;EACJ,CAAC;EAED,MAAMqB,cAAc,GAAGA,CAAA,KAAM;IAC3B,IAAI,CAAC1B,WAAW,EAAE;IAClBL,SAAS,CAAC,IAAI,CAAC;IACfK,WAAW,CAAC2B,SAAS,GAAG3B,WAAW,CAAC4B,YAAY;EAClD,CAAC;EAED,MAAMC,cAAc,GAAGA,CAAA,KAAM;IAC3B,IAAI,CAACnC,MAAM,CAAC,CAAC,IAAIS,WAAW,KAAKmB,SAAS,EAAE;IAC5CnB,WAAW,GAAGsB,qBAAqB,CAAC,MAAM;MACxCtB,WAAW,GAAGmB,SAAS;MACvB,IAAI5B,MAAM,CAAC,CAAC,EAAEgC,cAAc,CAAC,CAAC;IAChC,CAAC,CAAC;EACJ,CAAC;EAED,MAAMI,SAAS,GAAG,MAAAA,CAAA,KAAY;IAC5B,IAAI,CAACtC,KAAK,CAACmB,WAAW,IAAI,CAACnB,KAAK,CAACoB,OAAO,IAAIJ,YAAY,CAAC,CAAC,EAAE;IAC5D,MAAMuB,QAAQ,GAAG/B,WAAW;IAC5B,IAAI,CAAC+B,QAAQ,EAAE;IACf,MAAMC,iBAAiB,GAAGD,QAAQ,CAACJ,SAAS;IAC5C,MAAMM,oBAAoB,GAAGF,QAAQ,CAACH,YAAY;IAClD7B,eAAe,CAAC,IAAI,CAAC;IACrBF,yBAAyB,CAAC,IAAI,CAAC;IAC/B,IAAIqC,SAAS,GAAG,KAAK;IACrB,IAAI;MACFA,SAAS,GAAG,CAAC,MAAM1C,KAAK,CAACmB,WAAW,CAAC,CAAC,MAAM,KAAK;IACnD,CAAC,CAAC,OAAOwB,KAAK,EAAE;MACdpC,eAAe,CAACoC,KAAK,YAAYC,KAAK,GAAGD,KAAK,CAACE,OAAO,GAAG5C,QAAQ,CAAC,CAAC,CAAC6C,yBAAyB,CAAC;IAChG,CAAC,SAAS;MACRzC,yBAAyB,CAAC,KAAK,CAAC;IAClC;IACA,IAAI,CAACqC,SAAS,IAAIlC,WAAW,KAAK+B,QAAQ,EAAE;IAC5CQ,cAAc,CAAC,MAAM;MACnBd,qBAAqB,CAAC,MAAM;QAC1B,IAAIzB,WAAW,KAAK+B,QAAQ,EAAE;QAC9BA,QAAQ,CAACJ,SAAS,GAAGrC,qBAAqB,CAAC0C,iBAAiB,EAAEC,oBAAoB,EAAEF,QAAQ,CAACH,YAAY,CAAC;MAC5G,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ,CAAC;EAED,MAAMY,YAAY,GAAGA,CAAA,KAAM;IACzB,IAAI,CAACxC,WAAW,EAAE;IAClB,MAAMyC,UAAU,GAAGpD,gBAAgB,CAACW,WAAW,CAAC4B,YAAY,EAAE5B,WAAW,CAAC2B,SAAS,EAAE3B,WAAW,CAAC0C,YAAY,EAAEzB,SAAS,CAAC,CAAC,CAAC;IAC3H,IAAIwB,UAAU,EAAE9C,SAAS,CAAC,IAAI,CAAC,CAAC,KAC3B,IAAIU,iBAAiB,IAAIF,WAAW,KAAKmB,SAAS,EAAE;MACvD,IAAIjB,iBAAiB,EAAEgB,YAAY,CAAC,CAAC;MACrC1B,SAAS,CAAC,KAAK,CAAC;IAClB;IACA,IAAIK,WAAW,CAAC2B,SAAS,IAAIV,SAAS,CAAC,CAAC,EAAE,KAAKa,SAAS,CAAC,CAAC;EAC5D,CAAC;EAEDhD,OAAO,CAAC,MAAM;IACZ;IACAkB,WAAW,EAAE2C,eAAe,CAAC,mBAAmB,CAAC;IACjDjB,cAAc,CAAC,CAAC;IAChB,MAAMkB,cAAc,GAAG,OAAOC,cAAc,KAAK,WAAW,GAAG,IAAI,GAAG,IAAIA,cAAc,CAAC,MAAMhB,cAAc,CAAC,CAAC,CAAC;IAChH,IAAI5B,UAAU,EAAE2C,cAAc,EAAEE,OAAO,CAAC7C,UAAU,CAAC;IACnD,IAAID,WAAW,EAAE4C,cAAc,EAAEE,OAAO,CAAC9C,WAAW,CAAC;IAErD,MAAM+C,eAAe,GACnB,OAAOC,oBAAoB,KAAK,WAAW,IAAI,CAAC9C,cAAc,GAC1D,IAAI,GACJ,IAAI8C,oBAAoB,CACrBC,OAAO,IAAK;MACX,IAAIA,OAAO,CAACC,IAAI,CAAEC,KAAK,IAAKA,KAAK,CAACC,cAAc,CAAC,EAAE,KAAKtB,SAAS,CAAC,CAAC;IACrE,CAAC,EACD;MAAEuB,IAAI,EAAErD,WAAW;MAAEsD,UAAU,EAAE;IAAgB,CACnD,CAAC;IACP,IAAIpD,cAAc,EAAE6C,eAAe,EAAED,OAAO,CAAC5C,cAAc,CAAC;IAE5DrB,SAAS,CAAC,MAAM;MACdwC,YAAY,CAAC,CAAC;MACd,IAAIjB,eAAe,KAAKkB,SAAS,EAAEC,oBAAoB,CAACnB,eAAe,CAAC;MACxEwC,cAAc,EAAEW,UAAU,CAAC,CAAC;MAC5BR,eAAe,EAAEQ,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF7E,YAAY,CAAC,MAAM;IACjB,MAAM8E,GAAG,GAAGhE,KAAK,CAACiE,eAAe;IACjC,IAAID,GAAG,KAAKjD,mBAAmB,EAAE;IACjCA,mBAAmB,GAAGiD,GAAG;IACzBzD,eAAe,CAAC,IAAI,CAAC;IACrBJ,SAAS,CAAC,IAAI,CAAC;IACf4C,cAAc,CAACb,cAAc,CAAC;EAChC,CAAC,CAAC;EAEFhD,YAAY,CAAC,MAAM;IACjBc,KAAK,CAACuB,KAAK,CAACC,MAAM;IAClBxB,KAAK,CAACuB,KAAK,CAAC2C,EAAE,CAAC,CAAC,CAAC,CAAC,EAAEC,EAAE;IACtB3E,OAAO,CAAC6C,cAAc,CAAC;EACzB,CAAC,CAAC;EAEF;IAAA,IAAA+B,IAAA,GAAAC,gBAAA,CAAAC,OAAA;MAAAC,KAAA,GAAAH,IAAA,CAAAI,UAAA;MAAAC,MAAA,GAAAF,KAAA,CAAAC,UAAA;MAAA,CAAAE,MAAA,EAAAC,KAAA,IAAAC,eAAA,CAAAH,MAAA,CAAAI,WAAA;MAAAC,KAAA,GAAAJ,MAAA,CAAAG,WAAA;MAAAE,KAAA,GAAAD,KAAA,CAAAN,UAAA;MAAAQ,MAAA,GAAAD,KAAA,CAAAF,WAAA;MAAA,CAAAI,MAAA,EAAAC,KAAA,IAAAN,eAAA,CAAAI,MAAA,CAAAH,WAAA;MAAAM,MAAA,GAAAF,MAAA,CAAAJ,WAAA;MAAA,CAAAO,MAAA,EAAAC,KAAA,IAAAT,eAAA,CAAAO,MAAA,CAAAN,WAAA;MAAAS,MAAA,GAAAf,KAAA,CAAAM,WAAA;MAAA,CAAAU,MAAA,EAAAC,KAAA,IAAAZ,eAAA,CAAAU,MAAA,CAAAT,WAAA;IAAAN,KAAA,CAAAkB,gBAAA,WAgCgBzC,YAAY;IAAAuB,KAAA,CAAAmB,UAAA,GAHV,MAAM;MAChB5E,MAAM,GAAGgB,SAAS;IACpB,CAAC;IAAAyC,KAAA,CAAAoB,WAAA,GAPaC,KAAK,IAAK;MACtB,MAAMC,KAAK,GAAGD,KAAK,CAACE,OAAO,CAAC,CAAC,CAAC,EAAEC,OAAO;MACvC,IAAIF,KAAK,KAAK/D,SAAS,IAAIhB,MAAM,KAAKgB,SAAS,IAAI+D,KAAK,GAAG/E,MAAM,EAAEkB,kBAAkB,CAAC,CAAC;MACvFlB,MAAM,GAAG+E,KAAK;IAChB,CAAC;IAAAtB,KAAA,CAAAyB,YAAA,GAPcJ,KAAK,IAAK;MACvB9E,MAAM,GAAG8E,KAAK,CAACE,OAAO,CAAC,CAAC,CAAC,EAAEC,OAAO;IACpC,CAAC;IAAAxB,KAAA,CAAA0B,SAAA,GARWL,KAAK,IAAK;MACpB,IAAIA,KAAK,CAACM,MAAM,KAAKN,KAAK,CAACO,aAAa,EAAE;MAC1C,IAAIP,KAAK,CAAC5B,GAAG,KAAK,SAAS,IAAI4B,KAAK,CAAC5B,GAAG,KAAK,QAAQ,IAAI4B,KAAK,CAAC5B,GAAG,KAAK,MAAM,IAAK4B,KAAK,CAAC5B,GAAG,KAAK,GAAG,IAAI4B,KAAK,CAACQ,QAAS,EAAE;QACtHpE,kBAAkB,CAAC,CAAC;MACtB;IACF,CAAC;IAAAuC,KAAA,CAAAkB,gBAAA,UARSG,KAAK,IAAK;MAClB,IAAIA,KAAK,CAACS,MAAM,GAAG,CAAC,EAAErE,kBAAkB,CAAC,CAAC;IAC5C,CAAC;IAAAsE,KAAA,CAXKC,OAAO,IAAK;MAChB/F,WAAW,GAAG+F,OAAO;MACrBvG,KAAK,CAACQ,WAAW,GAAG+F,OAAO,CAAC;IAC9B,CAAC,EAAAhC,KAAA;IAAAiC,QAAA,CAAAjC,KAAA,EAAAkC,iBAAA,CA4BAlH,IAAI;MAAA,IAACmH,IAAIA,CAAA;QAAA,OAAE1G,KAAK,CAAC2G,UAAU;MAAA;MAAA,IAAAC,SAAA;QAAA,IAAAC,KAAA,GAAAxC,gBAAA,CAAAyC,MAAA;QAAAN,QAAA,CAAAK,KAAA,QAEvB7G,KAAK,CAAC2G,UAAU;QAAA,OAAAE,KAAA;MAAA;IAAA,IAAAnC,MAAA,EAAAC,KAAA;IAAA2B,KAAA,CAIbC,OAAO,IAAK;MAChB9F,UAAU,GAAG8F,OAAO;MACpBvG,KAAK,CAACS,UAAU,GAAG8F,OAAO,CAAC;IAC7B,CAAC,EAAAzB,KAAA;IAAA,IAAAiC,KAAA,GAOSrG,cAAc;IAAA,OAAAqG,KAAA,kBAAAT,KAAA,CAAAS,KAAA,EAAAhC,KAAA,IAAdrE,cAAc,GAAAqE,KAAA;IAAAyB,QAAA,CAAA1B,KAAA,EAAA2B,iBAAA,CACvBlH,IAAI;MAAA,IAACmH,IAAIA,CAAA;QAAA,OAAErF,kBAAkB,CAAC,CAAC;MAAA;MAAA,IAAAuF,SAAA;QAAA,IAAAI,KAAA,GAAA3C,gBAAA,CAAA4C,OAAA;UAAAC,KAAA,GAAAF,KAAA,CAAAxC,UAAA;UAAA,CAAA2C,MAAA,EAAAC,KAAA,IAAAxC,eAAA,CAAAsC,KAAA,CAAArC,WAAA;UAAAwC,MAAA,GAAAF,MAAA,CAAAtC,WAAA;UAAA,CAAAyC,MAAA,EAAAC,KAAA,IAAA3C,eAAA,CAAAyC,MAAA,CAAAxC,WAAA;UAAA2C,MAAA,GAAAF,MAAA,CAAAzC,WAAA;UAAA,CAAA4C,MAAA,EAAAC,KAAA,IAAA9C,eAAA,CAAA4C,MAAA,CAAA3C,WAAA;QAAA2B,QAAA,CAAAQ,KAAA,EAAAP,iBAAA,CAE3BlH,IAAI;UAAA,IAACmH,IAAIA,CAAA;YAAA,OAAExF,YAAY,CAAC,CAAC;UAAA;UAAA,IAAA0F,SAAA;YAAA,IAAAe,KAAA,GAAAtD,gBAAA,CAAAuD,OAAA;cAAAC,KAAA,GAAAF,KAAA,CAAAnD,UAAA;cAAAsD,KAAA,GAAAD,KAAA,CAAAhD,WAAA;cAAA,CAAAkD,KAAA,EAAAC,IAAA,IAAApD,eAAA,CAAAkD,KAAA,CAAAjD,WAAA;YAAA8C,KAAA,CAAAM,OAAA,GACwC,MAAM,KAAK3F,SAAS,CAAC,CAAC;YAAAkE,QAAA,CAAAmB,KAAA,QAEnF1H,QAAQ,CAAC,CAAC,CAACiI,iBAAiB,EAAAH,KAAA,EAAAC,IAAA;YAAAG,oBAAA;YAAA,OAAAR,KAAA;UAAA;QAAA,IAAAR,MAAA,EAAAC,KAAA;QAAAZ,QAAA,CAAAQ,KAAA,EAAAP,iBAAA,CAGhClH,IAAI;UAAA,IAACmH,IAAIA,CAAA;YAAA,OAAE1F,YAAY,CAAC,CAAC;UAAA;UAAA,IAAA4F,SAAA;YAAA,OAAAH,iBAAA,CACvB9G,YAAY;cAAA,IACXyI,KAAKA,CAAA;gBAAA,OAAEnI,QAAQ,CAAC,CAAC,CAACoI,oBAAoB;cAAA;cACtCC,IAAI;cAAA,IACJC,QAAQA,CAAA;gBAAA,OAAAlE,gBAAA,CAAAmE,OAAA;cAAA;YAAA;UAAA;QAAA,IAAAlB,MAAA,EAAAC,KAAA;QAAAf,QAAA,CAAAQ,KAAA,EAAAP,iBAAA,CAGXlH,IAAI;UAAA,IAACmH,IAAIA,CAAA;YAAA,OAAEpG,YAAY,CAAC,CAAC;UAAA;UAAAsG,QAAA,EACtB/D,OAAO,IAAA4D,iBAAA,CACN9G,YAAY;YAAA,IACXyI,KAAKA,CAAA;cAAA,OAAEnI,QAAQ,CAAC,CAAC,CAAC6C,yBAAyB;YAAA;YAAA,IAC3C2F,WAAWA,CAAA;cAAA,OAAE5F,OAAO,CAAC,CAAC;YAAA;YACtByF,IAAI;YACJI,IAAI;YAAA,IACJH,QAAQA,CAAA;cAAA;gBAAA,IAAAI,MAAA,GAAAtE,gBAAA,CAAAuE,OAAA;gBAAAD,MAAA,CAAAV,OAAA,GAKK,MAAM,KAAK3F,SAAS,CAAC,CAAC;gBAAAuG,QAAA,OAAAC,cAAA,CAAAH,MAAA,gBADnB1I,QAAQ,CAAC,CAAC,CAAC8I,kBAAkB;gBAAAZ,oBAAA;gBAAA,OAAAQ,MAAA;cAAA;YAAA;UAAA;QAOhD,IAAAlB,MAAA,EAAAC,KAAA;QAAA,OAAAV,KAAA;MAAA;IAAA,IAAA/B,MAAA,EAAAC,KAAA;IAAAsB,QAAA,CAAA1B,KAAA,EAAA2B,iBAAA,CAINlH,IAAI;MAAA,IACHmH,IAAIA,CAAA;QAAA,OAAEsC,MAAA,UAAChJ,KAAK,CAACiJ,OAAO,OAAI3H,UAAU,CAAC,CAAC;MAAA;MAAA,IACpC4H,QAAQA,CAAA;QAAA,OAAAzC,iBAAA,CACL/G,WAAW;UAAA;UAAA,IAEVyJ,KAAKA,CAAA;YAAA,OAAEnJ,KAAK,CAACiJ,OAAO,GAAG,SAAS,GAAG,OAAO;UAAA;UAAA,IAC1CX,IAAIA,CAAA;YAAA,OAAEtI,KAAK,CAACiJ,OAAO,GAAGnH,SAAS,GAAG,gBAAgB;UAAA;UAAA,IAClDsH,KAAKA,CAAA;YAAA,OAAEJ,MAAA,SAAAhJ,KAAK,CAACiJ,OAAO,MAAGhJ,QAAQ,CAAC,CAAC,CAACoJ,mBAAmB,GAAIrJ,KAAK,CAACsJ,UAAU,IAAIrJ,QAAQ,CAAC,CAAC,CAACsJ,iBAAkB;UAAA;UAAA,IAC1Gd,WAAWA,CAAA;YAAA,OAAEO,MAAA,UAAChJ,KAAK,CAACiJ,OAAO,MAAGjJ,KAAK,CAACwJ,gBAAgB,GAAG1H,SAAS;UAAA;QAAA;MAAA;MAAA,IAAA8E,SAAA;QAAA,OAAAH,iBAAA,CAInErH,GAAG;UAAA,IAACqK,IAAIA,CAAA;YAAA,OAAEzJ,KAAK,CAACuB,KAAK;UAAA;UAAAqF,QAAA,EAClB8C,IAAI,IAAAjD,iBAAA,CACHlH,IAAI;YAAA,IACHmH,IAAIA,CAAA;cAAA,OAAEgD,IAAI,CAACC,IAAI,KAAK,SAAS;YAAA;YAAA,IAC7BT,QAAQA,CAAA;cAAA,OAAAzC,iBAAA,CACL9G,YAAY;gBAAA,IACXyI,KAAKA,CAAA;kBAAA,OAAGsB,IAAI,CAAsBtB,KAAK;gBAAA;gBAAA,IACvCK,WAAWA,CAAA;kBAAA,OAAGiB,IAAI,CAAsBjB,WAAW;gBAAA;gBAAA,IACnDH,IAAIA,CAAA;kBAAA,OAAGoB,IAAI,CAAsBpB,IAAI;gBAAA;gBAAA,IACrCsB,OAAOA,CAAA;kBAAA,OAAGF,IAAI,CAAsBE,OAAO;gBAAA;gBAAA,IAC3CC,MAAMA,CAAA;kBAAA,OAAGH,IAAI,CAAsBG,MAAM;gBAAA;gBAAA,IACzCnB,IAAIA,CAAA;kBAAA,OAAGgB,IAAI,CAAsBhB,IAAI;gBAAA;gBAAA,IACrCoB,IAAIA,CAAA;kBAAA,OAAGJ,IAAI,CAAsBI,IAAI;gBAAA;gBAAA,IACrCvB,QAAQA,CAAA;kBAAA,OAAGmB,IAAI,CAAsBnB,QAAQ;gBAAA;gBAAA,IAC7CwB,WAAWA,CAAA;kBAAA,OAAGL,IAAI,CAAsBK,WAAW;gBAAA;gBAAA,IACnDC,QAAQA,CAAA;kBAAA,OAAGN,IAAI,CAAsBM,QAAQ;gBAAA;gBAAA,aAAAC,CAAA;kBAAA,OACrCP,IAAI,CAAsBO,KAAK;gBAAA;gBAAA,IAAArD,SAAA;kBAAA,OAErC8C,IAAI,CAAsBQ,OAAO;gBAAA;cAAA;YAAA;YAAA,IAAAtD,SAAA;cAAA,OAAAH,iBAAA,CAItC7G,WAAW;gBAAA,IACVuK,IAAIA,CAAA;kBAAA,OAAGT,IAAI,CAAqBS,IAAI;gBAAA;gBAAA,IACpC/B,KAAKA,CAAA;kBAAA,OAAGsB,IAAI,CAAqBtB,KAAK;gBAAA;gBAAA,IACtCgC,SAASA,CAAA;kBAAA,OAAGV,IAAI,CAAqBU,SAAS;gBAAA;gBAAA,IAC9CC,SAASA,CAAA;kBAAA,OAAGX,IAAI,CAAqBW,SAAS;gBAAA;gBAAA,IAC9CC,MAAMA,CAAA;kBAAA,OAAGZ,IAAI,CAAqBY,MAAM;gBAAA;gBAAA,IACxCC,WAAWA,CAAA;kBAAA,OAAGb,IAAI,CAAqBa,WAAW;gBAAA;gBAAA,IAClDC,OAAOA,CAAA;kBAAA,OAAGd,IAAI,CAAqBc,OAAO;gBAAA;gBAAA,IAC1CC,aAAaA,CAAA;kBAAA,OAAGf,IAAI,CAAqBe,aAAa;gBAAA;gBAAA,IACtDT,QAAQA,CAAA;kBAAA,OAAGN,IAAI,CAAqBM,QAAQ;gBAAA;gBAAA,IAC5CU,aAAaA,CAAA;kBAAA,OAAE1K,KAAK,CAAC0K,aAAa;gBAAA;gBAAA,aAAAT,CAAA;kBAAA,OAC1BP,IAAI,CAAqBO,KAAK;gBAAA;gBAAA,IAAArD,SAAA;kBAAA,OAEpC8C,IAAI,CAAqBQ,OAAO;gBAAA;cAAA;YAAA;UAAA;QAGvC;MAAA;IAAA,IAAA9E,MAAA,EAAAC,KAAA;IAAAmB,QAAA,CAAApC,IAAA,EAAAqC,iBAAA,CAKRlH,IAAI;MAAA,IAACmH,IAAIA,CAAA;QAAA,OAAEsC,MAAA,UAAC9I,MAAM,CAAC,CAAC,OAAIoB,UAAU,CAAC,CAAC;MAAA;MAAA,IAAAsF,SAAA;QAAA,IAAA+D,MAAA,GAAAtG,gBAAA,CAAAuG,OAAA;QAAAD,MAAA,CAAA1C,OAAA,GAC8B/F,cAAc;QAAAiG,oBAAA;QAAA,OAAAwC,MAAA;MAAA;IAAA,IAAApF,MAAA,EAAAC,KAAA;IAAAqD,QAAA,CAAAgC,GAAA;MAAA,IAAAC,GAAA,GA/InE,qBAAqB9K,KAAK,CAACiK,KAAK,IAAI,EAAE,EAAE;QAAAc,IAAA,GAAc/K,KAAK,CAACoI,KAAK,IAAInI,QAAQ,CAAC,CAAC,CAAC+K,YAAY;QAAAC,IAAA,GAS5FhL,QAAQ,CAAC,CAAC,CAACiL,oBAAoB,CAAC;UAAE9C,KAAK,EAAEpI,KAAK,CAACoI,KAAK,IAAInI,QAAQ,CAAC,CAAC,CAAC+K;QAAa,CAAC,CAAC;QAAAG,IAAA,GAsCjFnL,KAAK,CAACiJ,OAAO,GAAG,MAAM,GAAGnH,SAAS;MAAAgJ,GAAA,KAAAD,GAAA,CAAAO,CAAA,IAAAC,WAAA,CAAAjH,IAAA,EAAAyG,GAAA,CAAAO,CAAA,GAAAN,GAAA;MAAAC,IAAA,KAAAF,GAAA,CAAAS,CAAA,IAAAxC,cAAA,CAAA1E,IAAA,gBAAAyG,GAAA,CAAAS,CAAA,GAAAP,IAAA;MAAAE,IAAA,KAAAJ,GAAA,CAAAU,CAAA,IAAAzC,cAAA,CAAAvE,KAAA,gBAAAsG,GAAA,CAAAU,CAAA,GAAAN,IAAA;MAAAE,IAAA,KAAAN,GAAA,CAAAW,CAAA,IAAA1C,cAAA,CAAAhE,KAAA,eAAA+F,GAAA,CAAAW,CAAA,GAAAL,IAAA;MAAA,OAAAN,GAAA;IAAA;MAAAO,CAAA,EAAAtJ,SAAA;MAAAwJ,CAAA,EAAAxJ,SAAA;MAAAyJ,CAAA,EAAAzJ,SAAA;MAAA0J,CAAA,EAAA1J;IAAA;IAAAqG,oBAAA;IAAA,OAAA/D,IAAA;EAAA;AAuGvD;AAACqH,gBAAA","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["createEffect","createSignal","For","onCleanup","onMount","Show","untrack","useUiMessages","createScrollFade","Placeholder","ChatActivity","ChatMessage","isChatNearBottom","restoredChatScrollTop","ChatTimeline","props","messages","pinned","setPinned","loadingOlderInternally","setLoadingOlderInternally","historyError","setHistoryError","viewportRef","scrollFade","contentRef","topSentinelRef","followFrame","userScrollFrame","userScrollingAway","touchY","lastConversationKey","loadingOlder","Boolean","canLoadOlder","onLoadOlder","hasMore","hasHistoryControls","hasContent","items","length","threshold","Math","max","followThreshold","cancelFollow","undefined","cancelAnimationFrame","scrollToAnchorRef","anchorId","anchor","Array","from","querySelectorAll","find","element","dataset","chatAnchor","String","scrollTop","getBoundingClientRect","top","noteUserScrollAway","requestAnimationFrame","scrollToLatest","scrollHeight","scheduleFollow","loadOlder","viewport","previousScrollTop","previousScrollHeight","prepended","error","Error","message","couldNotLoadOlderMessages","queueMicrotask","updatePinned","nearBottom","clientHeight","removeAttribute","resizeObserver","ResizeObserver","observe","historyObserver","IntersectionObserver","entries","some","entry","isIntersecting","root","rootMargin","disconnect","key","conversationKey","at","id","_el$","_$getNextElement","_tmpl$5","_el$2","firstChild","_el$19","_el$20","_co$7","_$getNextMarker","nextSibling","_el$4","_el$5","_el$15","_el$16","_co$5","_el$17","_el$18","_co$6","_el$25","_el$26","_co$9","addEventListener","$$touchend","$$touchmove","event","nextY","touches","clientY","$$touchstart","$$keydown","target","currentTarget","shiftKey","deltaY","_$use","_$insert","_$createComponent","when","navigation","children","_el$3","_tmpl$","_ref$","_el$6","_tmpl$3","_el$1","_el$10","_co$2","_el$11","_el$12","_co$3","_el$13","_el$14","_co$4","_el$7","_tmpl$2","_el$8","_el$9","_el$0","_co$","$$click","loadOlderMessages","_$runHydrationEvents","label","loadingOlderMessages","icon","trailing","_tmpl$6","description","tone","_el$28","_tmpl$7","_$effect","_$setAttribute","retryOlderMessages","_$memo","loading","fallback","state","title","loadingConversation","emptyTitle","startConversation","emptyDescription","each","item","kind","leading","accent","busy","defaultOpen","class","content","role","createdAt","timeLabel","status","attachments","actions","actionDisplay","onActionError","_el$21","_tmpl$4","_el$22","_el$23","_el$24","_co$8","jumpToLatest","_p$","_v$","_v$2","conversation","_v$3","_v$4","conversationMessages","_v$5","e","_$className","t","a","o","i","_$delegateEvents"],"sources":["chat/ChatTimeline.tsx"],"sourcesContent":["import { createEffect, createSignal, For, type JSX, onCleanup, onMount, Show, untrack } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { createScrollFade } from \"../layout/scroll-fade\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport { ChatActivity, ChatMessage } from \"./ChatPrimitives\";\nimport { isChatNearBottom, restoredChatScrollTop } from \"./chat-behavior\";\nimport type { ChatAction, ChatActivityTone, ChatAttachment, ChatMessageStatus, ChatRole } from \"./types\";\n\nexport type ChatMessageItem = {\n kind: \"message\";\n id: string;\n role: ChatRole;\n content?: JSX.Element;\n label?: string;\n createdAt?: string | Date;\n timeLabel?: string;\n status?: ChatMessageStatus;\n attachments?: readonly ChatAttachment[];\n actions?: readonly ChatAction[];\n actionDisplay?: \"auto\" | \"inline\" | \"menu\";\n anchorId?: string | number;\n class?: string;\n};\n\nexport type ChatActivityItem = {\n kind: \"activity\";\n id: string;\n label: string;\n description?: string;\n icon?: string;\n leading?: JSX.Element;\n accent?: string;\n tone?: ChatActivityTone;\n busy?: boolean;\n trailing?: JSX.Element;\n defaultOpen?: boolean;\n anchorId?: string | number;\n content?: JSX.Element;\n class?: string;\n};\n\nexport type ChatTimelineItem = ChatMessageItem | ChatActivityItem;\n\nexport type ChatTimelineProps = {\n scrollFade?: boolean;\n items: readonly ChatTimelineItem[];\n conversationKey?: string | null;\n loading?: boolean;\n hasMore?: boolean;\n loadingOlder?: boolean;\n onLoadOlder?: () => boolean | void | Promise<boolean | void>;\n emptyTitle?: string;\n emptyDescription?: string;\n navigation?: JSX.Element;\n onActionError?: (error: unknown) => void;\n viewportRef?: (element: HTMLDivElement) => void;\n contentRef?: (element: HTMLDivElement) => void;\n scrollToAnchorRef?: (scrollToAnchor: (anchorId: string | number) => boolean) => void;\n label?: string;\n followThreshold?: number;\n class?: string;\n};\n\nexport function ChatTimeline(props: ChatTimelineProps): JSX.Element {\n const messages = useUiMessages();\n const [pinned, setPinned] = createSignal(true);\n const [loadingOlderInternally, setLoadingOlderInternally] = createSignal(false);\n const [historyError, setHistoryError] = createSignal<string | null>(null);\n let viewportRef: HTMLDivElement | undefined;\n createScrollFade(\n () => viewportRef,\n () => props.scrollFade !== false,\n );\n let contentRef: HTMLDivElement | undefined;\n let topSentinelRef: HTMLDivElement | undefined;\n let followFrame: number | undefined;\n let userScrollFrame: number | undefined;\n let userScrollingAway = false;\n let touchY: number | undefined;\n let lastConversationKey: string | null | undefined;\n\n const loadingOlder = () => Boolean(props.loadingOlder || loadingOlderInternally());\n const canLoadOlder = () => Boolean(props.onLoadOlder && props.hasMore && !loadingOlder());\n const hasHistoryControls = () => loadingOlder() || historyError() !== null || canLoadOlder();\n const hasContent = () => props.items.length > 0;\n const threshold = () => Math.max(0, props.followThreshold ?? 96);\n\n const cancelFollow = () => {\n if (followFrame !== undefined) cancelAnimationFrame(followFrame);\n followFrame = undefined;\n };\n\n props.scrollToAnchorRef?.((anchorId) => {\n const anchor = Array.from(contentRef?.querySelectorAll<HTMLElement>(\"[data-chat-anchor]\") ?? []).find(\n (element) => element.dataset.chatAnchor === String(anchorId),\n );\n if (!viewportRef || !anchor) return false;\n cancelFollow();\n setPinned(false);\n viewportRef.scrollTop = Math.max(\n 0,\n viewportRef.scrollTop + anchor.getBoundingClientRect().top - viewportRef.getBoundingClientRect().top - 16,\n );\n return true;\n });\n\n const noteUserScrollAway = () => {\n userScrollingAway = true;\n if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);\n userScrollFrame = requestAnimationFrame(() => {\n userScrollFrame = undefined;\n userScrollingAway = false;\n });\n };\n\n const scrollToLatest = () => {\n if (!viewportRef) return;\n setPinned(true);\n viewportRef.scrollTop = viewportRef.scrollHeight;\n };\n\n const scheduleFollow = () => {\n if (!pinned() || followFrame !== undefined) return;\n followFrame = requestAnimationFrame(() => {\n followFrame = undefined;\n if (pinned()) scrollToLatest();\n });\n };\n\n const loadOlder = async () => {\n if (!props.onLoadOlder || !props.hasMore || loadingOlder()) return;\n const viewport = viewportRef;\n if (!viewport) return;\n const previousScrollTop = viewport.scrollTop;\n const previousScrollHeight = viewport.scrollHeight;\n setHistoryError(null);\n setLoadingOlderInternally(true);\n let prepended = false;\n try {\n prepended = (await props.onLoadOlder()) !== false;\n } catch (error) {\n setHistoryError(error instanceof Error ? error.message : messages().couldNotLoadOlderMessages);\n } finally {\n setLoadingOlderInternally(false);\n }\n if (!prepended || viewportRef !== viewport) return;\n queueMicrotask(() => {\n requestAnimationFrame(() => {\n if (viewportRef !== viewport) return;\n viewport.scrollTop = restoredChatScrollTop(previousScrollTop, previousScrollHeight, viewport.scrollHeight);\n });\n });\n };\n\n const updatePinned = () => {\n if (!viewportRef) return;\n const nearBottom = isChatNearBottom(viewportRef.scrollHeight, viewportRef.scrollTop, viewportRef.clientHeight, threshold());\n if (nearBottom) setPinned(true);\n else if (userScrollingAway || followFrame === undefined) {\n if (userScrollingAway) cancelFollow();\n setPinned(false);\n }\n if (viewportRef.scrollTop <= threshold()) void loadOlder();\n };\n\n onMount(() => {\n // Switch from CSS-only SSR anchoring to normal scroll coordinates before paint.\n viewportRef?.removeAttribute(\"data-initializing\");\n scrollToLatest();\n const resizeObserver = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(() => scheduleFollow());\n if (contentRef) resizeObserver?.observe(contentRef);\n if (viewportRef) resizeObserver?.observe(viewportRef);\n\n const historyObserver =\n typeof IntersectionObserver === \"undefined\" || !topSentinelRef\n ? null\n : new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) void loadOlder();\n },\n { root: viewportRef, rootMargin: \"160px 0px 0px\" },\n );\n if (topSentinelRef) historyObserver?.observe(topSentinelRef);\n\n onCleanup(() => {\n cancelFollow();\n if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);\n resizeObserver?.disconnect();\n historyObserver?.disconnect();\n });\n });\n\n createEffect(() => {\n const key = props.conversationKey;\n if (key === lastConversationKey) return;\n lastConversationKey = key;\n setHistoryError(null);\n setPinned(true);\n queueMicrotask(scrollToLatest);\n });\n\n createEffect(() => {\n props.items.length;\n props.items.at(-1)?.id;\n untrack(scheduleFollow);\n });\n\n return (\n <section class={`k2b-chat-timeline ${props.class ?? \"\"}`} aria-label={props.label ?? messages().conversation}>\n <div\n ref={(element) => {\n viewportRef = element;\n props.viewportRef?.(element);\n }}\n class=\"k2b-chat-timeline__viewport\"\n data-scroll-fade-mode={props.scrollFade !== false ? \"bottom\" : undefined}\n data-initializing=\"\"\n role=\"region\"\n aria-label={messages().conversationMessages({ label: props.label ?? messages().conversation })}\n tabIndex={0}\n onWheel={(event) => {\n if (event.deltaY < 0) noteUserScrollAway();\n }}\n onKeyDown={(event) => {\n if (event.target !== event.currentTarget) return;\n if (event.key === \"ArrowUp\" || event.key === \"PageUp\" || event.key === \"Home\" || (event.key === \" \" && event.shiftKey)) {\n noteUserScrollAway();\n }\n }}\n onTouchStart={(event) => {\n touchY = event.touches[0]?.clientY;\n }}\n onTouchMove={(event) => {\n const nextY = event.touches[0]?.clientY;\n if (nextY !== undefined && touchY !== undefined && nextY > touchY) noteUserScrollAway();\n touchY = nextY;\n }}\n onTouchEnd={() => {\n touchY = undefined;\n }}\n onScroll={updatePinned}\n >\n <Show when={props.navigation}>\n <div class=\"k2b-chat-timeline__navigation\" aria-live=\"off\">\n {props.navigation}\n </div>\n </Show>\n <div\n ref={(element) => {\n contentRef = element;\n props.contentRef?.(element);\n }}\n class=\"k2b-chat-timeline__content\"\n role=\"log\"\n aria-live=\"polite\"\n aria-relevant=\"additions text\"\n aria-busy={props.loading ? \"true\" : undefined}\n >\n <div ref={topSentinelRef} class=\"k2b-chat-timeline__sentinel\" aria-hidden=\"true\" />\n <Show when={hasHistoryControls()}>\n <div class=\"k2b-chat-timeline__history\" aria-live=\"off\">\n <Show when={canLoadOlder()}>\n <button type=\"button\" class=\"k2b-chat-timeline__older\" onClick={() => void loadOlder()}>\n <i class=\"ti ti-history\" aria-hidden=\"true\" />\n {messages().loadOlderMessages}\n </button>\n </Show>\n <Show when={loadingOlder()}>\n <ChatActivity\n label={messages().loadingOlderMessages}\n icon=\"ti ti-history\"\n trailing={<i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />}\n />\n </Show>\n <Show when={historyError()}>\n {(message) => (\n <ChatActivity\n label={messages().couldNotLoadOlderMessages}\n description={message()}\n icon=\"ti ti-alert-circle\"\n tone=\"danger\"\n trailing={\n <button\n type=\"button\"\n class=\"k2b-chat-timeline__retry\"\n aria-label={messages().retryOlderMessages}\n onClick={() => void loadOlder()}\n >\n <i class=\"ti ti-refresh\" aria-hidden=\"true\" />\n </button>\n }\n />\n )}\n </Show>\n </div>\n </Show>\n <Show\n when={!props.loading && hasContent()}\n fallback={\n <Placeholder\n class=\"k2b-chat-timeline__placeholder\"\n state={props.loading ? \"loading\" : \"empty\"}\n icon={props.loading ? undefined : \"ti ti-sparkles\"}\n title={props.loading ? messages().loadingConversation : (props.emptyTitle ?? messages().startConversation)}\n description={!props.loading ? props.emptyDescription : undefined}\n />\n }\n >\n <For each={props.items}>\n {(item) => (\n <Show\n when={item.kind === \"message\"}\n fallback={\n <ChatActivity\n label={(item as ChatActivityItem).label}\n description={(item as ChatActivityItem).description}\n icon={(item as ChatActivityItem).icon}\n leading={(item as ChatActivityItem).leading}\n accent={(item as ChatActivityItem).accent}\n tone={(item as ChatActivityItem).tone}\n busy={(item as ChatActivityItem).busy}\n trailing={(item as ChatActivityItem).trailing}\n defaultOpen={(item as ChatActivityItem).defaultOpen}\n anchorId={(item as ChatActivityItem).anchorId}\n class={(item as ChatActivityItem).class}\n >\n {(item as ChatActivityItem).content}\n </ChatActivity>\n }\n >\n <ChatMessage\n role={(item as ChatMessageItem).role}\n label={(item as ChatMessageItem).label}\n createdAt={(item as ChatMessageItem).createdAt}\n timeLabel={(item as ChatMessageItem).timeLabel}\n status={(item as ChatMessageItem).status}\n attachments={(item as ChatMessageItem).attachments}\n actions={(item as ChatMessageItem).actions}\n actionDisplay={(item as ChatMessageItem).actionDisplay}\n anchorId={(item as ChatMessageItem).anchorId}\n onActionError={props.onActionError}\n class={(item as ChatMessageItem).class}\n >\n {(item as ChatMessageItem).content}\n </ChatMessage>\n </Show>\n )}\n </For>\n </Show>\n </div>\n </div>\n <Show when={!pinned() && hasContent()}>\n <button type=\"button\" class=\"k2b-chat-timeline__latest\" onClick={scrollToLatest}>\n <i class=\"ti ti-arrow-down\" aria-hidden=\"true\" />\n {messages().jumpToLatest}\n </button>\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
export const filterChatCommands = (value, commands) => {
|
|
2
|
-
if (!value.startsWith("/") || /\s/.test(value)) return [];
|
|
3
|
-
const query = value.slice(1).toLowerCase();
|
|
4
|
-
return commands.filter(command => command.name.toLowerCase().startsWith(query));
|
|
5
|
-
};
|
|
6
1
|
export const nextChatCommandIndex = (index, length, direction) => length <= 0 ? 0 : (index + direction + length) % length;
|
|
7
2
|
export const isChatNearBottom = (scrollHeight, scrollTop, clientHeight, threshold = 96) => scrollHeight - scrollTop - clientHeight <= threshold;
|
|
8
3
|
export const restoredChatScrollTop = (previousScrollTop, previousScrollHeight, nextScrollHeight) => Math.max(0, previousScrollTop + nextScrollHeight - previousScrollHeight);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["nextChatCommandIndex","index","length","direction","isChatNearBottom","scrollHeight","scrollTop","clientHeight","threshold","restoredChatScrollTop","previousScrollTop","previousScrollHeight","nextScrollHeight","Math","max","runChatSubmission","run","clear","perform","restore","error","onError","reportChatFailure","result","Promise","catch","writeChatClipboard","value","navigator","clipboard","writeText","Error","executeChatAction","action","copyText","onSelect"],"sources":["chat/chat-behavior.ts"],"sourcesContent":["import type { ChatAction } from \"./types\";\n\nexport const nextChatCommandIndex = (index: number, length: number, direction: 1 | -1): number =>\n length <= 0 ? 0 : (index + direction + length) % length;\n\nexport const isChatNearBottom = (scrollHeight: number, scrollTop: number, clientHeight: number, threshold = 96): boolean =>\n scrollHeight - scrollTop - clientHeight <= threshold;\n\nexport const restoredChatScrollTop = (previousScrollTop: number, previousScrollHeight: number, nextScrollHeight: number): number =>\n Math.max(0, previousScrollTop + nextScrollHeight - previousScrollHeight);\n\nexport type ChatSubmissionRun = {\n /** Clears the controlled draft (and attachments) before the handler runs. */\n clear: () => void;\n /**\n * The application handler. A synchronous throw, a rejected promise, and a\n * `false` result all count as a rejected submission.\n */\n perform: () => boolean | void | Promise<boolean | void>;\n /** Restores the cleared draft (and attachments) after a rejected submission. */\n restore: () => void;\n onError?: (error: unknown) => void;\n};\n\n/**\n * Runs one composer submission with optimistic clearing. Resolves to `true`\n * when the handler accepted the submission. A synchronous throw is handled\n * exactly like a rejected promise so a controlled draft is never lost.\n */\nexport const runChatSubmission = async (run: ChatSubmissionRun): Promise<boolean> => {\n run.clear();\n try {\n if ((await run.perform()) === false) {\n run.restore();\n return false;\n }\n return true;\n } catch (error) {\n run.onError?.(error);\n run.restore();\n return false;\n }\n};\n\n/** Reports a handler failure without letting a synchronous throw escape. */\nexport const reportChatFailure = (perform: () => unknown, onError?: (error: unknown) => void): void => {\n try {\n const result = perform();\n if (result instanceof Promise) void result.catch((error) => onError?.(error));\n } catch (error) {\n onError?.(error);\n }\n};\n\nconst writeChatClipboard = async (value: string): Promise<void> => {\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.writeText) {\n throw new Error(\"Clipboard access is unavailable.\");\n }\n await navigator.clipboard.writeText(value);\n};\n\n/** Executes the one behavior guaranteed by the ChatAction contract. */\nexport const executeChatAction = async (action: ChatAction): Promise<void> => {\n if (typeof action.copyText === \"string\") {\n await writeChatClipboard(action.copyText);\n return;\n }\n await action.onSelect();\n};\n"],"mappings":"AAEA,OAAO,MAAMA,oBAAoB,GAAGA,CAACC,KAAa,EAAEC,MAAc,EAAEC,SAAiB,KACnFD,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAACD,KAAK,GAAGE,SAAS,GAAGD,MAAM,IAAIA,MAAM;AAEzD,OAAO,MAAME,gBAAgB,GAAGA,CAACC,YAAoB,EAAEC,SAAiB,EAAEC,YAAoB,EAAEC,SAAS,GAAG,EAAE,KAC5GH,YAAY,GAAGC,SAAS,GAAGC,YAAY,IAAIC,SAAS;AAEtD,OAAO,MAAMC,qBAAqB,GAAGA,CAACC,iBAAyB,EAAEC,oBAA4B,EAAEC,gBAAwB,KACrHC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEJ,iBAAiB,GAAGE,gBAAgB,GAAGD,oBAAoB,CAAC;AAe1E;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMI,iBAAiB,GAAG,MAAOC,GAAsB,IAAuB;EACnFA,GAAG,CAACC,KAAK,CAAC,CAAC;EACX,IAAI;IACF,IAAI,CAAC,MAAMD,GAAG,CAACE,OAAO,CAAC,CAAC,MAAM,KAAK,EAAE;MACnCF,GAAG,CAACG,OAAO,CAAC,CAAC;MACb,OAAO,KAAK;IACd;IACA,OAAO,IAAI;EACb,CAAC,CAAC,OAAOC,KAAK,EAAE;IACdJ,GAAG,CAACK,OAAO,GAAGD,KAAK,CAAC;IACpBJ,GAAG,CAACG,OAAO,CAAC,CAAC;IACb,OAAO,KAAK;EACd;AACF,CAAC;;AAED;AACA,OAAO,MAAMG,iBAAiB,GAAGA,CAACJ,OAAsB,EAAEG,OAAkC,KAAW;EACrG,IAAI;IACF,MAAME,MAAM,GAAGL,OAAO,CAAC,CAAC;IACxB,IAAIK,MAAM,YAAYC,OAAO,EAAE,KAAKD,MAAM,CAACE,KAAK,CAAEL,KAAK,IAAKC,OAAO,GAAGD,KAAK,CAAC,CAAC;EAC/E,CAAC,CAAC,OAAOA,KAAK,EAAE;IACdC,OAAO,GAAGD,KAAK,CAAC;EAClB;AACF,CAAC;AAED,MAAMM,kBAAkB,GAAG,MAAOC,KAAa,IAAoB;EACjE,IAAI,OAAOC,SAAS,KAAK,WAAW,IAAI,CAACA,SAAS,CAACC,SAAS,EAAEC,SAAS,EAAE;IACvE,MAAM,IAAIC,KAAK,CAAC,kCAAkC,CAAC;EACrD;EACA,MAAMH,SAAS,CAACC,SAAS,CAACC,SAAS,CAACH,KAAK,CAAC;AAC5C,CAAC;;AAED;AACA,OAAO,MAAMK,iBAAiB,GAAG,MAAOC,MAAkB,IAAoB;EAC5E,IAAI,OAAOA,MAAM,CAACC,QAAQ,KAAK,QAAQ,EAAE;IACvC,MAAMR,kBAAkB,CAACO,MAAM,CAACC,QAAQ,CAAC;IACzC;EACF;EACA,MAAMD,MAAM,CAACE,QAAQ,CAAC,CAAC;AACzB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/** Only the token at the caret; URLs, paths and inline/fenced code are ordinary text. */
|
|
2
|
+
export function chatCommandQuery(text, caret, selectionEnd = caret) {
|
|
3
|
+
if (caret !== selectionEnd) return null;
|
|
4
|
+
const before = text.slice(0, caret);
|
|
5
|
+
if ((before.match(/`/g)?.length ?? 0) % 2) return null;
|
|
6
|
+
const match = /(?:^|[\s(])\/([^\n/`]*)$/.exec(before);
|
|
7
|
+
if (!match) return null;
|
|
8
|
+
return {
|
|
9
|
+
start: caret - match[1].length - 1,
|
|
10
|
+
end: caret,
|
|
11
|
+
query: match[1]
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** An edit inside a mention removes its identity; edits around it shift the range. */
|
|
16
|
+
export function reconcileChatMentions(before, after, mentions) {
|
|
17
|
+
if (before === after) return [...mentions];
|
|
18
|
+
let start = 0;
|
|
19
|
+
while (start < before.length && start < after.length && before[start] === after[start]) start++;
|
|
20
|
+
let oldEnd = before.length,
|
|
21
|
+
newEnd = after.length;
|
|
22
|
+
while (oldEnd > start && newEnd > start && before[oldEnd - 1] === after[newEnd - 1]) {
|
|
23
|
+
oldEnd--;
|
|
24
|
+
newEnd--;
|
|
25
|
+
}
|
|
26
|
+
return mentions.flatMap(mention => {
|
|
27
|
+
if (mention.end <= start) return [mention];
|
|
28
|
+
if (mention.start >= oldEnd) return [{
|
|
29
|
+
...mention,
|
|
30
|
+
start: mention.start + newEnd - oldEnd,
|
|
31
|
+
end: mention.end + newEnd - oldEnd
|
|
32
|
+
}];
|
|
33
|
+
return [];
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export function chatMentionSegments(text, mentions) {
|
|
37
|
+
const segments = [];
|
|
38
|
+
let offset = 0;
|
|
39
|
+
for (const mention of [...mentions].sort((a, b) => a.start - b.start)) {
|
|
40
|
+
if (mention.start < offset || mention.end > text.length || mention.start >= mention.end) continue;
|
|
41
|
+
segments.push({
|
|
42
|
+
text: text.slice(offset, mention.start)
|
|
43
|
+
});
|
|
44
|
+
segments.push({
|
|
45
|
+
text: text.slice(mention.start, mention.end),
|
|
46
|
+
mention
|
|
47
|
+
});
|
|
48
|
+
offset = mention.end;
|
|
49
|
+
}
|
|
50
|
+
segments.push({
|
|
51
|
+
text: text.slice(offset)
|
|
52
|
+
});
|
|
53
|
+
return segments;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=composer-document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["chatCommandQuery","text","caret","selectionEnd","before","slice","match","length","exec","start","end","query","reconcileChatMentions","after","mentions","oldEnd","newEnd","flatMap","mention","chatMentionSegments","segments","offset","sort","a","b","push"],"sources":["chat/composer-document.ts"],"sourcesContent":["import type { ChatMention } from \"./types\";\n\nexport type ChatCommandQuery = { start: number; end: number; query: string };\n\n/** Only the token at the caret; URLs, paths and inline/fenced code are ordinary text. */\nexport function chatCommandQuery(text: string, caret: number, selectionEnd = caret): ChatCommandQuery | null {\n if (caret !== selectionEnd) return null;\n const before = text.slice(0, caret);\n if ((before.match(/`/g)?.length ?? 0) % 2) return null;\n const match = /(?:^|[\\s(])\\/([^\\n/`]*)$/.exec(before);\n if (!match) return null;\n return { start: caret - match[1]!.length - 1, end: caret, query: match[1]! };\n}\n\n/** An edit inside a mention removes its identity; edits around it shift the range. */\nexport function reconcileChatMentions(before: string, after: string, mentions: readonly ChatMention[]): ChatMention[] {\n if (before === after) return [...mentions];\n let start = 0;\n while (start < before.length && start < after.length && before[start] === after[start]) start++;\n let oldEnd = before.length,\n newEnd = after.length;\n while (oldEnd > start && newEnd > start && before[oldEnd - 1] === after[newEnd - 1]) {\n oldEnd--;\n newEnd--;\n }\n return mentions.flatMap((mention) => {\n if (mention.end <= start) return [mention];\n if (mention.start >= oldEnd) return [{ ...mention, start: mention.start + newEnd - oldEnd, end: mention.end + newEnd - oldEnd }];\n return [];\n });\n}\n\nexport function chatMentionSegments(text: string, mentions: readonly ChatMention[]) {\n const segments: { text: string; mention?: ChatMention }[] = [];\n let offset = 0;\n for (const mention of [...mentions].sort((a, b) => a.start - b.start)) {\n if (mention.start < offset || mention.end > text.length || mention.start >= mention.end) continue;\n segments.push({ text: text.slice(offset, mention.start) });\n segments.push({ text: text.slice(mention.start, mention.end), mention });\n offset = mention.end;\n }\n segments.push({ text: text.slice(offset) });\n return segments;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { ChatContextPopup } from "./ChatContextPopup";
|
|
2
|
+
import { ChatTasks } from "./ChatTasks";
|
|
1
3
|
import { ChatComposer } from "./ChatComposer";
|
|
2
4
|
import { ChatActivity, ChatContextUsage, ChatMessage } from "./ChatPrimitives";
|
|
3
5
|
import { ChatRoot } from "./ChatRoot";
|
|
@@ -8,10 +10,13 @@ export { formatChatTokens } from "./ChatPrimitives";
|
|
|
8
10
|
* authorization, rich message rendering, and domain actions.
|
|
9
11
|
*/
|
|
10
12
|
export const Chat = Object.assign(ChatRoot, {
|
|
13
|
+
Tasks: ChatTasks,
|
|
11
14
|
Timeline: ChatTimeline,
|
|
12
15
|
Message: ChatMessage,
|
|
13
16
|
Activity: ChatActivity,
|
|
14
17
|
Composer: ChatComposer,
|
|
15
|
-
ContextUsage: ChatContextUsage
|
|
18
|
+
ContextUsage: ChatContextUsage,
|
|
19
|
+
ContextPopup: ChatContextPopup
|
|
16
20
|
});
|
|
21
|
+
export { reconcileChatMentions } from "./composer-document";
|
|
17
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ChatComposer","ChatActivity","ChatContextUsage","ChatMessage","ChatRoot","ChatTimeline","formatChatTokens","Chat","Object","assign","Timeline","Message","Activity","Composer","ContextUsage"],"sources":["chat/index.ts"],"sourcesContent":["
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["chat/types.ts"],"sourcesContent":["export type ChatRole = \"user\" | \"assistant\" | \"system\" | \"tool\";\n\nexport type ChatMessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n\nexport type ChatActivityTone = \"neutral\" | \"ai\" | \"success\" | \"danger\";\n\ntype ChatActionBase = {\n id: string;\n label: string;\n icon?: string;\n variant?: \"danger\";\n disabled?: boolean;\n /** Toggle state for persistent message actions such as feedback. */\n pressed?: boolean;\n /** Semantic foreground for selected feedback actions, without a persistent background. */\n pressedTone?: \"success\" | \"danger\";\n};\n\n/** Exactly one executable behavior for every chat action. */\nexport type ChatAction = ChatActionBase &\n ({ onSelect: () => void | Promise<void>; copyText?: never } | { copyText: string; onSelect?: never });\n\nexport type ChatAttachment = {\n id: string;\n name: string;\n size?: number;\n kind?: \"file\" | \"image\" | \"resource\";\n icon?: string;\n previewUrl?: string;\n alt?: string;\n /** Optional destination represented by this attachment. */\n href?: string;\n /** Opaque application-owned payload returned unchanged with ChatSubmitInput. */\n data?: unknown;\n /** Optional application-owned action presented below the attachment label. */\n action?: ChatAction;\n};\n\nexport type ChatUsage = {\n input?: number;\n output?: number;\n total?: number;\n};\n\nexport type ChatContextUsageData = {\n usage?: ChatUsage | null;\n loopUsage?: ChatUsage | null;\n contextWindow?: number;\n modelLabel?: string;\n};\n\nexport type ChatModelOption = {\n id: string;\n label: string;\n description?: string;\n image?: string;\n icon?: string;\n capabilities?: readonly string[];\n};\n\nexport type ChatComposerState = \"idle\" | \"submitting\" | \"running\" | \"stopping\";\n\nexport type ChatSubmitIntent = \"send\" | \"steer\" | \"queue\";\n\nexport type ChatSubmitInput = {\n intent: ChatSubmitIntent;\n text: string;\n attachments: readonly ChatAttachment[];\n};\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["chat/types.ts"],"sourcesContent":["export type ChatRole = \"user\" | \"assistant\" | \"system\" | \"tool\";\n\nexport type ChatMessageStatus = \"pending\" | \"streaming\" | \"complete\" | \"error\";\n\nexport type ChatActivityTone = \"neutral\" | \"ai\" | \"success\" | \"danger\";\n\ntype ChatActionBase = {\n id: string;\n label: string;\n icon?: string;\n variant?: \"danger\";\n disabled?: boolean;\n /** Toggle state for persistent message actions such as feedback. */\n pressed?: boolean;\n /** Semantic foreground for selected feedback actions, without a persistent background. */\n pressedTone?: \"success\" | \"danger\";\n};\n\n/** Exactly one executable behavior for every chat action. */\nexport type ChatAction = ChatActionBase &\n ({ onSelect: () => void | Promise<void>; copyText?: never } | { copyText: string; onSelect?: never });\n\nexport type ChatAttachment = {\n id: string;\n name: string;\n size?: number;\n kind?: \"file\" | \"image\" | \"resource\";\n icon?: string;\n previewUrl?: string;\n alt?: string;\n /** Optional destination represented by this attachment. */\n href?: string;\n /** Opaque application-owned payload returned unchanged with ChatSubmitInput. */\n data?: unknown;\n /** Optional application-owned action presented below the attachment label. */\n action?: ChatAction;\n};\n\nexport type ChatUsage = {\n input?: number;\n output?: number;\n total?: number;\n};\n\nexport type ChatContextUsageData = {\n usage?: ChatUsage | null;\n loopUsage?: ChatUsage | null;\n contextWindow?: number;\n modelLabel?: string;\n};\n\nexport type ChatModelOption = {\n id: string;\n label: string;\n description?: string;\n image?: string;\n icon?: string;\n capabilities?: readonly string[];\n};\n\nexport type ChatComposerState = \"idle\" | \"submitting\" | \"running\" | \"stopping\";\n\nexport type ChatSubmitIntent = \"send\" | \"steer\" | \"queue\";\n\nexport type ChatSubmitInput = {\n intent: ChatSubmitIntent;\n text: string;\n attachments: readonly ChatAttachment[];\n mentions?: readonly ChatMention[];\n};\n\n/** Ranges use UTF-16 offsets into the untrimmed composer text. Payloads stay application-owned. */\nexport type ChatMention = { start: number; end: number; attachment: ChatAttachment };\n"],"mappings":"","ignoreList":[]}
|