@k2b/ui 0.21.0 → 0.23.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/ContextMenu.js +3 -1
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/FilterChip.js +3 -1
- package/dist/browser/actions/FilterChip.js.map +1 -1
- package/dist/browser/actions/SpotlightSearch.js +3 -1
- package/dist/browser/actions/SpotlightSearch.js.map +1 -1
- package/dist/browser/actions/filter-messages.js +20 -0
- package/dist/browser/actions/filter-messages.js.map +1 -0
- package/dist/browser/actions/spotlight-messages.js +16 -0
- package/dist/browser/actions/spotlight-messages.js.map +1 -0
- package/dist/browser/chat/ChatComposer.js +47 -41
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatPrimitives.js +25 -23
- package/dist/browser/chat/ChatPrimitives.js.map +1 -1
- package/dist/browser/chat/ChatRoot.js +3 -3
- package/dist/browser/chat/ChatRoot.js.map +1 -1
- package/dist/browser/chat/ChatTimeline.js +12 -12
- package/dist/browser/chat/ChatTimeline.js.map +1 -1
- package/dist/browser/chat/chat-messages.js +236 -0
- package/dist/browser/chat/chat-messages.js.map +1 -0
- package/dist/browser/content/Calendar.js +1096 -1060
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/CalendarDayView.js +1187 -0
- package/dist/browser/content/CalendarDayView.js.map +1 -0
- package/dist/browser/content/CalendarWeekView.js +1571 -0
- package/dist/browser/content/CalendarWeekView.js.map +1 -0
- package/dist/browser/content/Chart.js +15 -8
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartExplorer.js +185 -85
- package/dist/browser/content/ChartExplorer.js.map +1 -1
- package/dist/browser/content/ChartExplorerControls.js +9 -7
- package/dist/browser/content/ChartExplorerControls.js.map +1 -1
- package/dist/browser/content/ChartFilterControls.js +93 -34
- package/dist/browser/content/ChartFilterControls.js.map +1 -1
- package/dist/browser/content/ChartSnapshotView.js +3 -3
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/DataTable.js +238 -201
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/Docs.js +3 -1
- package/dist/browser/content/Docs.js.map +1 -1
- package/dist/browser/content/FileBrowser.js +30 -26
- package/dist/browser/content/FileBrowser.js.map +1 -1
- package/dist/browser/content/FileTree.js +9 -7
- package/dist/browser/content/FileTree.js.map +1 -1
- package/dist/browser/content/FileView.js +37 -28
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/Lightbox.js +9 -7
- package/dist/browser/content/Lightbox.js.map +1 -1
- package/dist/browser/content/LogEntriesTable.js +3 -3
- package/dist/browser/content/LogEntriesTable.js.map +1 -1
- package/dist/browser/content/MessageRow.js +24 -22
- package/dist/browser/content/MessageRow.js.map +1 -1
- package/dist/browser/content/Pagination.js +7 -7
- package/dist/browser/content/Pagination.js.map +1 -1
- package/dist/browser/content/PdfPreview.js +15 -13
- package/dist/browser/content/PdfPreview.js.map +1 -1
- package/dist/browser/content/RangePicker.js +3 -1
- package/dist/browser/content/RangePicker.js.map +1 -1
- package/dist/browser/content/StructuredDataPreview.js +3 -1
- package/dist/browser/content/StructuredDataPreview.js.map +1 -1
- package/dist/browser/content/Timeline.js +13 -11
- package/dist/browser/content/Timeline.js.map +1 -1
- package/dist/browser/content/VideoPlayer.js +5 -5
- package/dist/browser/content/VideoPlayer.js.map +1 -1
- package/dist/browser/content/VirtualFeed.js +6 -4
- package/dist/browser/content/VirtualFeed.js.map +1 -1
- package/dist/browser/content/ZoomPanViewport.js +10 -7
- package/dist/browser/content/ZoomPanViewport.js.map +1 -1
- package/dist/browser/content/calendar-day-scroll.js +98 -0
- package/dist/browser/content/calendar-day-scroll.js.map +1 -0
- package/dist/browser/content/calendar-days.js +408 -0
- package/dist/browser/content/calendar-days.js.map +1 -0
- package/dist/browser/content/calendar-dialogs.js +236 -0
- package/dist/browser/content/calendar-dialogs.js.map +1 -0
- package/dist/browser/content/calendar-messages.js +249 -3
- package/dist/browser/content/calendar-messages.js.map +1 -1
- package/dist/browser/content/calendar-pointer.js +19 -6
- package/dist/browser/content/calendar-pointer.js.map +1 -1
- package/dist/browser/content/calendar-shared.js +328 -0
- package/dist/browser/content/calendar-shared.js.map +1 -0
- package/dist/browser/content/calendar-time-view.js +1649 -0
- package/dist/browser/content/calendar-time-view.js.map +1 -0
- package/dist/browser/content/chart-messages.js +146 -0
- package/dist/browser/content/chart-messages.js.map +1 -0
- package/dist/browser/content/collection-selection.js +2 -0
- package/dist/browser/content/collection-selection.js.map +1 -1
- package/dist/browser/content/data-table-messages.js +24 -0
- package/dist/browser/content/data-table-messages.js.map +1 -0
- package/dist/browser/content/docs-messages.js +24 -0
- package/dist/browser/content/docs-messages.js.map +1 -0
- package/dist/browser/content/feed-messages.js +34 -0
- package/dist/browser/content/feed-messages.js.map +1 -0
- package/dist/browser/content/file-browser-messages.js +69 -0
- package/dist/browser/content/file-browser-messages.js.map +1 -0
- package/dist/browser/content/file-view-messages.js +64 -0
- package/dist/browser/content/file-view-messages.js.map +1 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/content/lightbox-messages.js +36 -0
- package/dist/browser/content/lightbox-messages.js.map +1 -0
- package/dist/browser/content/log-entries-messages.js +20 -0
- package/dist/browser/content/log-entries-messages.js.map +1 -0
- package/dist/browser/content/markdown-info-block-messages.js +24 -0
- package/dist/browser/content/markdown-info-block-messages.js.map +1 -0
- package/dist/browser/content/markdown-info-blocks.js +3 -3
- package/dist/browser/content/markdown-info-blocks.js.map +1 -1
- package/dist/browser/content/markdown-links.js +2 -2
- package/dist/browser/content/markdown-links.js.map +1 -1
- package/dist/browser/content/markdown-reference-messages.js +30 -0
- package/dist/browser/content/markdown-reference-messages.js.map +1 -0
- package/dist/browser/content/pagination-messages.js +38 -0
- package/dist/browser/content/pagination-messages.js.map +1 -0
- package/dist/browser/content/pdf-messages.js +43 -0
- package/dist/browser/content/pdf-messages.js.map +1 -0
- package/dist/browser/content/range-picker-messages.js +20 -0
- package/dist/browser/content/range-picker-messages.js.map +1 -0
- package/dist/browser/content/structured-data-messages.js +22 -0
- package/dist/browser/content/structured-data-messages.js.map +1 -0
- package/dist/browser/content/timeline-messages.js +62 -0
- package/dist/browser/content/timeline-messages.js.map +1 -0
- package/dist/browser/content/video-messages.js +24 -0
- package/dist/browser/content/video-messages.js.map +1 -0
- package/dist/browser/content/viewport-messages.js +28 -0
- package/dist/browser/content/viewport-messages.js.map +1 -0
- package/dist/browser/feedback/HoverPreview.js +34 -6
- package/dist/browser/feedback/HoverPreview.js.map +1 -1
- package/dist/browser/feedback/InstallGuide.js +18 -18
- package/dist/browser/feedback/InstallGuide.js.map +1 -1
- package/dist/browser/feedback/install-messages.js +104 -0
- package/dist/browser/feedback/install-messages.js.map +1 -0
- package/dist/browser/feedback/prompt-messages.js +65 -0
- package/dist/browser/feedback/prompt-messages.js.map +1 -0
- package/dist/browser/feedback/prompts.js +14 -11
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/feedback/toast-messages.js +18 -0
- package/dist/browser/feedback/toast-messages.js.map +1 -0
- package/dist/browser/feedback/toast.js +4 -3
- package/dist/browser/feedback/toast.js.map +1 -1
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/inputs/AutocompleteEditor.js +6 -4
- package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
- package/dist/browser/inputs/AutocompleteSelect.js +10 -8
- package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
- package/dist/browser/inputs/ChoiceGroups.js +4 -0
- package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
- package/dist/browser/inputs/ChoiceInputs.js +5 -5
- package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
- package/dist/browser/inputs/Combobox.js +3 -2
- package/dist/browser/inputs/Combobox.js.map +1 -1
- package/dist/browser/inputs/FileDropTarget.js +6 -6
- package/dist/browser/inputs/FileDropTarget.js.map +1 -1
- package/dist/browser/inputs/FileInputs.js +30 -21
- package/dist/browser/inputs/FileInputs.js.map +1 -1
- package/dist/browser/inputs/MultiSelectInput.js +7 -5
- package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
- package/dist/browser/inputs/NumberInput.js +4 -2
- package/dist/browser/inputs/NumberInput.js.map +1 -1
- package/dist/browser/inputs/QrScanner.js +5 -5
- package/dist/browser/inputs/QrScanner.js.map +1 -1
- package/dist/browser/inputs/Select.js +7 -5
- package/dist/browser/inputs/Select.js.map +1 -1
- package/dist/browser/inputs/SelectChip.js +3 -3
- package/dist/browser/inputs/SelectChip.js.map +1 -1
- package/dist/browser/inputs/SignatureInput.js +9 -3
- package/dist/browser/inputs/SignatureInput.js.map +1 -1
- package/dist/browser/inputs/SpecialInputs.js +4 -2
- package/dist/browser/inputs/SpecialInputs.js.map +1 -1
- package/dist/browser/inputs/TagEditor.js +8 -6
- package/dist/browser/inputs/TagEditor.js.map +1 -1
- package/dist/browser/inputs/TagsInput.js +5 -5
- package/dist/browser/inputs/TagsInput.js.map +1 -1
- package/dist/browser/inputs/TemplateEditor.js +5 -5
- package/dist/browser/inputs/TemplateEditor.js.map +1 -1
- package/dist/browser/inputs/TextInput.js +3 -1
- package/dist/browser/inputs/TextInput.js.map +1 -1
- package/dist/browser/inputs/completion-messages.js +24 -0
- package/dist/browser/inputs/completion-messages.js.map +1 -0
- package/dist/browser/inputs/file-drop-messages.js +63 -0
- package/dist/browser/inputs/file-drop-messages.js.map +1 -0
- package/dist/browser/inputs/file-drop.js.map +1 -1
- package/dist/browser/inputs/file-input-messages.js +60 -0
- package/dist/browser/inputs/file-input-messages.js.map +1 -0
- package/dist/browser/inputs/icon-messages.js +22 -0
- package/dist/browser/inputs/icon-messages.js.map +1 -0
- package/dist/browser/inputs/input-messages.js +38 -0
- package/dist/browser/inputs/input-messages.js.map +1 -0
- package/dist/browser/inputs/markdown/MarkdownEditor.js +10 -6
- package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/browser/inputs/markdown/Toolbar.js +13 -13
- package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
- package/dist/browser/inputs/markdown/editor-messages.js +43 -0
- package/dist/browser/inputs/markdown/editor-messages.js.map +1 -0
- package/dist/browser/inputs/markdown/toolbar-messages.js +40 -0
- package/dist/browser/inputs/markdown/toolbar-messages.js.map +1 -0
- package/dist/browser/inputs/qr-messages.js +26 -0
- package/dist/browser/inputs/qr-messages.js.map +1 -0
- package/dist/browser/inputs/select-messages.js +63 -0
- package/dist/browser/inputs/select-messages.js.map +1 -0
- package/dist/browser/inputs/tag-messages.js +44 -0
- package/dist/browser/inputs/tag-messages.js.map +1 -0
- package/dist/browser/inputs/template-messages.js +22 -0
- package/dist/browser/inputs/template-messages.js.map +1 -0
- package/dist/browser/internal/render-error-messages.js +20 -0
- package/dist/browser/internal/render-error-messages.js.map +1 -0
- package/dist/browser/internal/render-error.js +3 -1
- package/dist/browser/internal/render-error.js.map +1 -1
- package/dist/browser/internal/text-selection.js +101 -0
- package/dist/browser/internal/text-selection.js.map +1 -0
- package/dist/browser/intl/messages.js +6 -1155
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +594 -425
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/BottomSheet.js +6 -1
- package/dist/browser/layout/BottomSheet.js.map +1 -1
- package/dist/browser/layout/Discussion.js +8 -5
- package/dist/browser/layout/Discussion.js.map +1 -1
- package/dist/browser/layout/FloatingWindow.js +8 -5
- package/dist/browser/layout/FloatingWindow.js.map +1 -1
- package/dist/browser/layout/Navigation.js +7 -6
- package/dist/browser/layout/Navigation.js.map +1 -1
- package/dist/browser/layout/PageTitle.js +373 -0
- package/dist/browser/layout/PageTitle.js.map +1 -0
- package/dist/browser/layout/PanelDialog.js +8 -6
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/Panes.js +23 -15
- package/dist/browser/layout/Panes.js.map +1 -1
- package/dist/browser/layout/PullToRefresh.js +13 -4
- package/dist/browser/layout/PullToRefresh.js.map +1 -1
- package/dist/browser/layout/Settings.js +14 -12
- package/dist/browser/layout/Settings.js.map +1 -1
- package/dist/browser/layout/SettingsCollection.js +6 -5
- package/dist/browser/layout/SettingsCollection.js.map +1 -1
- package/dist/browser/layout/SettingsModal.js +3 -1
- package/dist/browser/layout/SettingsModal.js.map +1 -1
- package/dist/browser/layout/app-workspace-controller.js +821 -12
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/app-workspace-state.js +3 -2
- package/dist/browser/layout/app-workspace-state.js.map +1 -1
- package/dist/browser/layout/floating-window-messages.js +28 -0
- package/dist/browser/layout/floating-window-messages.js.map +1 -0
- package/dist/browser/layout/index.js +2 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/navigation-model.js.map +1 -1
- package/dist/browser/layout/page-title-controller.js +169 -0
- package/dist/browser/layout/page-title-controller.js.map +1 -0
- package/dist/browser/layout/panel-dialog-messages.js +20 -0
- package/dist/browser/layout/panel-dialog-messages.js.map +1 -0
- package/dist/browser/layout/panes-messages.js +48 -0
- package/dist/browser/layout/panes-messages.js.map +1 -0
- package/dist/browser/layout/refresh-messages.js +20 -0
- package/dist/browser/layout/refresh-messages.js.map +1 -0
- package/dist/browser/layout/settings-messages.js +54 -0
- package/dist/browser/layout/settings-messages.js.map +1 -0
- package/dist/browser/layout/workspace-messages.js +56 -0
- package/dist/browser/layout/workspace-messages.js.map +1 -0
- package/dist/browser/surfaces/Avatar.js +5 -5
- package/dist/browser/surfaces/Avatar.js.map +1 -1
- package/dist/browser/surfaces/ResourceCard.js +4 -2
- package/dist/browser/surfaces/ResourceCard.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +18 -6
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/browser/surfaces/Tag.js +3 -3
- package/dist/browser/surfaces/Tag.js.map +1 -1
- package/dist/browser/surfaces/avatar-messages.js +26 -0
- package/dist/browser/surfaces/avatar-messages.js.map +1 -0
- package/dist/browser/surfaces/resource-messages.js +26 -0
- package/dist/browser/surfaces/resource-messages.js.map +1 -0
- package/dist/browser/widgets/Widget.js +6 -0
- package/dist/browser/widgets/Widget.js.map +1 -1
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/FilterChip.js +3 -1
- package/dist/ssr/actions/FilterChip.js.map +1 -1
- package/dist/ssr/actions/SpotlightSearch.js +3 -1
- package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
- package/dist/ssr/actions/filter-messages.js +20 -0
- package/dist/ssr/actions/filter-messages.js.map +1 -0
- package/dist/ssr/actions/spotlight-messages.js +16 -0
- package/dist/ssr/actions/spotlight-messages.js.map +1 -0
- package/dist/ssr/chat/ChatComposer.js +47 -41
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatPrimitives.js +23 -21
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
- package/dist/ssr/chat/ChatRoot.js +3 -3
- package/dist/ssr/chat/ChatRoot.js.map +1 -1
- package/dist/ssr/chat/ChatTimeline.js +11 -11
- package/dist/ssr/chat/ChatTimeline.js.map +1 -1
- package/dist/ssr/chat/chat-messages.js +236 -0
- package/dist/ssr/chat/chat-messages.js.map +1 -0
- package/dist/ssr/content/Calendar.js +534 -346
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/CalendarDayView.js +800 -0
- package/dist/ssr/content/CalendarDayView.js.map +1 -0
- package/dist/ssr/content/CalendarWeekView.js +1069 -0
- package/dist/ssr/content/CalendarWeekView.js.map +1 -0
- package/dist/ssr/content/Chart.js +12 -5
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartExplorer.js +98 -37
- package/dist/ssr/content/ChartExplorer.js.map +1 -1
- package/dist/ssr/content/ChartExplorerControls.js +9 -7
- package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
- package/dist/ssr/content/ChartFilterControls.js +52 -8
- package/dist/ssr/content/ChartFilterControls.js.map +1 -1
- package/dist/ssr/content/ChartSnapshotView.js +3 -3
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/DataTable.js +77 -53
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/Docs.js +3 -1
- package/dist/ssr/content/Docs.js.map +1 -1
- package/dist/ssr/content/FileBrowser.js +30 -26
- package/dist/ssr/content/FileBrowser.js.map +1 -1
- package/dist/ssr/content/FileTree.js +9 -7
- package/dist/ssr/content/FileTree.js.map +1 -1
- package/dist/ssr/content/FileView.js +37 -28
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/Lightbox.js +8 -6
- package/dist/ssr/content/Lightbox.js.map +1 -1
- package/dist/ssr/content/LogEntriesTable.js +3 -3
- package/dist/ssr/content/LogEntriesTable.js.map +1 -1
- package/dist/ssr/content/MessageRow.js +24 -22
- package/dist/ssr/content/MessageRow.js.map +1 -1
- package/dist/ssr/content/Pagination.js +6 -6
- package/dist/ssr/content/Pagination.js.map +1 -1
- package/dist/ssr/content/PdfPreview.js +15 -13
- package/dist/ssr/content/PdfPreview.js.map +1 -1
- package/dist/ssr/content/RangePicker.js +3 -1
- package/dist/ssr/content/RangePicker.js.map +1 -1
- package/dist/ssr/content/StructuredDataPreview.js +3 -1
- package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
- package/dist/ssr/content/Timeline.js +13 -11
- package/dist/ssr/content/Timeline.js.map +1 -1
- package/dist/ssr/content/VideoPlayer.js +5 -5
- package/dist/ssr/content/VideoPlayer.js.map +1 -1
- package/dist/ssr/content/VirtualFeed.js +6 -4
- package/dist/ssr/content/VirtualFeed.js.map +1 -1
- package/dist/ssr/content/ZoomPanViewport.js +7 -4
- package/dist/ssr/content/ZoomPanViewport.js.map +1 -1
- package/dist/ssr/content/calendar-day-scroll.js +98 -0
- package/dist/ssr/content/calendar-day-scroll.js.map +1 -0
- package/dist/ssr/content/calendar-days.js +408 -0
- package/dist/ssr/content/calendar-days.js.map +1 -0
- package/dist/ssr/content/calendar-dialogs.js +159 -0
- package/dist/ssr/content/calendar-dialogs.js.map +1 -0
- package/dist/ssr/content/calendar-messages.js +249 -3
- package/dist/ssr/content/calendar-messages.js.map +1 -1
- package/dist/ssr/content/calendar-pointer.js +19 -6
- package/dist/ssr/content/calendar-pointer.js.map +1 -1
- package/dist/ssr/content/calendar-shared.js +261 -0
- package/dist/ssr/content/calendar-shared.js.map +1 -0
- package/dist/ssr/content/calendar-time-view.js +1306 -0
- package/dist/ssr/content/calendar-time-view.js.map +1 -0
- package/dist/ssr/content/chart-messages.js +146 -0
- package/dist/ssr/content/chart-messages.js.map +1 -0
- package/dist/ssr/content/collection-selection.js +2 -0
- package/dist/ssr/content/collection-selection.js.map +1 -1
- package/dist/ssr/content/data-table-messages.js +24 -0
- package/dist/ssr/content/data-table-messages.js.map +1 -0
- package/dist/ssr/content/docs-messages.js +24 -0
- package/dist/ssr/content/docs-messages.js.map +1 -0
- package/dist/ssr/content/feed-messages.js +34 -0
- package/dist/ssr/content/feed-messages.js.map +1 -0
- package/dist/ssr/content/file-browser-messages.js +69 -0
- package/dist/ssr/content/file-browser-messages.js.map +1 -0
- package/dist/ssr/content/file-view-messages.js +64 -0
- package/dist/ssr/content/file-view-messages.js.map +1 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/content/lightbox-messages.js +36 -0
- package/dist/ssr/content/lightbox-messages.js.map +1 -0
- package/dist/ssr/content/log-entries-messages.js +20 -0
- package/dist/ssr/content/log-entries-messages.js.map +1 -0
- package/dist/ssr/content/markdown-info-block-messages.js +24 -0
- package/dist/ssr/content/markdown-info-block-messages.js.map +1 -0
- package/dist/ssr/content/markdown-info-blocks.js +3 -3
- package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
- package/dist/ssr/content/markdown-links.js +2 -2
- package/dist/ssr/content/markdown-links.js.map +1 -1
- package/dist/ssr/content/markdown-reference-messages.js +30 -0
- package/dist/ssr/content/markdown-reference-messages.js.map +1 -0
- package/dist/ssr/content/pagination-messages.js +38 -0
- package/dist/ssr/content/pagination-messages.js.map +1 -0
- package/dist/ssr/content/pdf-messages.js +43 -0
- package/dist/ssr/content/pdf-messages.js.map +1 -0
- package/dist/ssr/content/range-picker-messages.js +20 -0
- package/dist/ssr/content/range-picker-messages.js.map +1 -0
- package/dist/ssr/content/structured-data-messages.js +22 -0
- package/dist/ssr/content/structured-data-messages.js.map +1 -0
- package/dist/ssr/content/timeline-messages.js +62 -0
- package/dist/ssr/content/timeline-messages.js.map +1 -0
- package/dist/ssr/content/video-messages.js +24 -0
- package/dist/ssr/content/video-messages.js.map +1 -0
- package/dist/ssr/content/viewport-messages.js +28 -0
- package/dist/ssr/content/viewport-messages.js.map +1 -0
- package/dist/ssr/feedback/HoverPreview.js +34 -6
- package/dist/ssr/feedback/HoverPreview.js.map +1 -1
- package/dist/ssr/feedback/InstallGuide.js +18 -18
- package/dist/ssr/feedback/InstallGuide.js.map +1 -1
- package/dist/ssr/feedback/install-messages.js +104 -0
- package/dist/ssr/feedback/install-messages.js.map +1 -0
- package/dist/ssr/feedback/prompt-messages.js +65 -0
- package/dist/ssr/feedback/prompt-messages.js.map +1 -0
- package/dist/ssr/feedback/prompts.js +14 -11
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/feedback/toast-messages.js +18 -0
- package/dist/ssr/feedback/toast-messages.js.map +1 -0
- package/dist/ssr/feedback/toast.js +4 -3
- package/dist/ssr/feedback/toast.js.map +1 -1
- package/dist/ssr/index.js +1 -1
- package/dist/ssr/index.js.map +1 -1
- package/dist/ssr/inputs/AutocompleteEditor.js +5 -3
- package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
- package/dist/ssr/inputs/AutocompleteSelect.js +10 -8
- package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
- package/dist/ssr/inputs/ChoiceGroups.js +4 -0
- package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
- package/dist/ssr/inputs/ChoiceInputs.js +5 -5
- package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
- package/dist/ssr/inputs/Combobox.js +3 -1
- package/dist/ssr/inputs/Combobox.js.map +1 -1
- package/dist/ssr/inputs/FileDropTarget.js +6 -6
- package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
- package/dist/ssr/inputs/FileInputs.js +29 -20
- package/dist/ssr/inputs/FileInputs.js.map +1 -1
- package/dist/ssr/inputs/MultiSelectInput.js +7 -5
- package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
- package/dist/ssr/inputs/NumberInput.js +4 -2
- package/dist/ssr/inputs/NumberInput.js.map +1 -1
- package/dist/ssr/inputs/QrScanner.js +4 -4
- package/dist/ssr/inputs/QrScanner.js.map +1 -1
- package/dist/ssr/inputs/Select.js +7 -5
- 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/SignatureInput.js +9 -3
- package/dist/ssr/inputs/SignatureInput.js.map +1 -1
- package/dist/ssr/inputs/SpecialInputs.js +4 -2
- package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
- package/dist/ssr/inputs/TagEditor.js +8 -6
- package/dist/ssr/inputs/TagEditor.js.map +1 -1
- package/dist/ssr/inputs/TagsInput.js +5 -5
- package/dist/ssr/inputs/TagsInput.js.map +1 -1
- package/dist/ssr/inputs/TemplateEditor.js +5 -5
- package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
- package/dist/ssr/inputs/TextInput.js +3 -1
- package/dist/ssr/inputs/TextInput.js.map +1 -1
- package/dist/ssr/inputs/completion-messages.js +24 -0
- package/dist/ssr/inputs/completion-messages.js.map +1 -0
- package/dist/ssr/inputs/file-drop-messages.js +63 -0
- package/dist/ssr/inputs/file-drop-messages.js.map +1 -0
- package/dist/ssr/inputs/file-drop.js.map +1 -1
- package/dist/ssr/inputs/file-input-messages.js +60 -0
- package/dist/ssr/inputs/file-input-messages.js.map +1 -0
- package/dist/ssr/inputs/icon-messages.js +22 -0
- package/dist/ssr/inputs/icon-messages.js.map +1 -0
- package/dist/ssr/inputs/input-messages.js +38 -0
- package/dist/ssr/inputs/input-messages.js.map +1 -0
- package/dist/ssr/inputs/markdown/MarkdownEditor.js +9 -5
- package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/ssr/inputs/markdown/Toolbar.js +13 -13
- package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
- package/dist/ssr/inputs/markdown/editor-messages.js +43 -0
- package/dist/ssr/inputs/markdown/editor-messages.js.map +1 -0
- package/dist/ssr/inputs/markdown/toolbar-messages.js +40 -0
- package/dist/ssr/inputs/markdown/toolbar-messages.js.map +1 -0
- package/dist/ssr/inputs/qr-messages.js +26 -0
- package/dist/ssr/inputs/qr-messages.js.map +1 -0
- package/dist/ssr/inputs/select-messages.js +63 -0
- package/dist/ssr/inputs/select-messages.js.map +1 -0
- package/dist/ssr/inputs/tag-messages.js +44 -0
- package/dist/ssr/inputs/tag-messages.js.map +1 -0
- package/dist/ssr/inputs/template-messages.js +22 -0
- package/dist/ssr/inputs/template-messages.js.map +1 -0
- package/dist/ssr/internal/render-error-messages.js +20 -0
- package/dist/ssr/internal/render-error-messages.js.map +1 -0
- package/dist/ssr/internal/render-error.js +3 -1
- package/dist/ssr/internal/render-error.js.map +1 -1
- package/dist/ssr/internal/text-selection.js +101 -0
- package/dist/ssr/internal/text-selection.js.map +1 -0
- package/dist/ssr/intl/messages.js +6 -1155
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +219 -103
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/BottomSheet.js +1 -0
- package/dist/ssr/layout/BottomSheet.js.map +1 -1
- package/dist/ssr/layout/Discussion.js +8 -5
- package/dist/ssr/layout/Discussion.js.map +1 -1
- package/dist/ssr/layout/FloatingWindow.js +8 -5
- package/dist/ssr/layout/FloatingWindow.js.map +1 -1
- package/dist/ssr/layout/Navigation.js +6 -5
- package/dist/ssr/layout/Navigation.js.map +1 -1
- package/dist/ssr/layout/PageTitle.js +256 -0
- package/dist/ssr/layout/PageTitle.js.map +1 -0
- package/dist/ssr/layout/PanelDialog.js +8 -6
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/Panes.js +22 -14
- package/dist/ssr/layout/Panes.js.map +1 -1
- package/dist/ssr/layout/PullToRefresh.js +13 -4
- package/dist/ssr/layout/PullToRefresh.js.map +1 -1
- package/dist/ssr/layout/Settings.js +14 -12
- package/dist/ssr/layout/Settings.js.map +1 -1
- package/dist/ssr/layout/SettingsCollection.js +6 -5
- package/dist/ssr/layout/SettingsCollection.js.map +1 -1
- package/dist/ssr/layout/SettingsModal.js +3 -1
- package/dist/ssr/layout/SettingsModal.js.map +1 -1
- package/dist/ssr/layout/app-workspace-controller.js +821 -12
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/app-workspace-state.js +3 -2
- package/dist/ssr/layout/app-workspace-state.js.map +1 -1
- package/dist/ssr/layout/floating-window-messages.js +28 -0
- package/dist/ssr/layout/floating-window-messages.js.map +1 -0
- package/dist/ssr/layout/index.js +2 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/navigation-model.js.map +1 -1
- package/dist/ssr/layout/page-title-controller.js +169 -0
- package/dist/ssr/layout/page-title-controller.js.map +1 -0
- package/dist/ssr/layout/panel-dialog-messages.js +20 -0
- package/dist/ssr/layout/panel-dialog-messages.js.map +1 -0
- package/dist/ssr/layout/panes-messages.js +48 -0
- package/dist/ssr/layout/panes-messages.js.map +1 -0
- package/dist/ssr/layout/refresh-messages.js +20 -0
- package/dist/ssr/layout/refresh-messages.js.map +1 -0
- package/dist/ssr/layout/settings-messages.js +54 -0
- package/dist/ssr/layout/settings-messages.js.map +1 -0
- package/dist/ssr/layout/workspace-messages.js +56 -0
- package/dist/ssr/layout/workspace-messages.js.map +1 -0
- package/dist/ssr/surfaces/Avatar.js +5 -5
- package/dist/ssr/surfaces/Avatar.js.map +1 -1
- package/dist/ssr/surfaces/ResourceCard.js +4 -2
- package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +2 -2
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/surfaces/Tag.js +3 -3
- package/dist/ssr/surfaces/Tag.js.map +1 -1
- package/dist/ssr/surfaces/avatar-messages.js +26 -0
- package/dist/ssr/surfaces/avatar-messages.js.map +1 -0
- package/dist/ssr/surfaces/resource-messages.js +26 -0
- package/dist/ssr/surfaces/resource-messages.js.map +1 -0
- package/dist/ssr/widgets/Widget.js +6 -0
- package/dist/ssr/widgets/Widget.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/filter-messages.d.ts +8 -0
- package/dist/types/actions/spotlight-messages.d.ts +8 -0
- package/dist/types/chat/chat-messages.d.ts +116 -0
- package/dist/types/content/Calendar.d.ts +91 -0
- package/dist/types/content/CalendarDayView.d.ts +7 -0
- package/dist/types/content/CalendarWeekView.d.ts +7 -0
- package/dist/types/content/ChartExplorer.d.ts +36 -1
- package/dist/types/content/ChartFilterControls.d.ts +6 -1
- package/dist/types/content/DataTable.d.ts +7 -0
- package/dist/types/content/FileView.d.ts +0 -10
- package/dist/types/content/calendar-day-scroll.d.ts +42 -0
- package/dist/types/content/calendar-days.d.ts +192 -0
- package/dist/types/content/calendar-dialogs.d.ts +22 -0
- package/dist/types/content/calendar-messages.d.ts +119 -1
- package/dist/types/content/calendar-pointer.d.ts +9 -0
- package/dist/types/content/calendar-shared.d.ts +69 -0
- package/dist/types/content/calendar-time-view.d.ts +252 -0
- package/dist/types/content/chart-messages.d.ts +37 -0
- package/dist/types/content/data-table-messages.d.ts +10 -0
- package/dist/types/content/docs-messages.d.ts +10 -0
- package/dist/types/content/feed-messages.d.ts +15 -0
- package/dist/types/content/file-browser-messages.d.ts +33 -0
- package/dist/types/content/file-view-messages.d.ts +30 -0
- package/dist/types/content/index.d.ts +2 -2
- package/dist/types/content/lightbox-messages.d.ts +16 -0
- package/dist/types/content/log-entries-messages.d.ts +8 -0
- package/dist/types/content/markdown-info-block-messages.d.ts +12 -0
- package/dist/types/content/markdown-reference-messages.d.ts +15 -0
- package/dist/types/content/pagination-messages.d.ts +17 -0
- package/dist/types/content/pdf-messages.d.ts +20 -0
- package/dist/types/content/range-picker-messages.d.ts +8 -0
- package/dist/types/content/structured-data-messages.d.ts +9 -0
- package/dist/types/content/timeline-messages.d.ts +29 -0
- package/dist/types/content/video-messages.d.ts +10 -0
- package/dist/types/content/viewport-messages.d.ts +12 -0
- package/dist/types/feedback/install-messages.d.ts +50 -0
- package/dist/types/feedback/prompt-messages.d.ts +31 -0
- package/dist/types/feedback/toast-messages.d.ts +9 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/inputs/completion-messages.d.ts +10 -0
- package/dist/types/inputs/file-drop-messages.d.ts +30 -0
- package/dist/types/inputs/file-drop.d.ts +3 -3
- package/dist/types/inputs/file-input-messages.d.ts +28 -0
- package/dist/types/inputs/icon-messages.d.ts +9 -0
- package/dist/types/inputs/input-messages.d.ts +17 -0
- package/dist/types/inputs/markdown/editor-messages.d.ts +20 -0
- package/dist/types/inputs/markdown/toolbar-messages.d.ts +18 -0
- package/dist/types/inputs/qr-messages.d.ts +11 -0
- package/dist/types/inputs/select-messages.d.ts +30 -0
- package/dist/types/inputs/tag-messages.d.ts +20 -0
- package/dist/types/inputs/template-messages.d.ts +9 -0
- package/dist/types/internal/render-error-messages.d.ts +8 -0
- package/dist/types/internal/text-selection.d.ts +18 -0
- package/dist/types/intl/messages.d.ts +3 -544
- package/dist/types/layout/AppWorkspace.d.ts +42 -5
- package/dist/types/layout/PageTitle.d.ts +65 -0
- package/dist/types/layout/app-workspace-controller.d.ts +12 -0
- package/dist/types/layout/app-workspace-state.d.ts +3 -2
- package/dist/types/layout/floating-window-messages.d.ts +12 -0
- package/dist/types/layout/index.d.ts +3 -0
- package/dist/types/layout/navigation-model.d.ts +7 -0
- package/dist/types/layout/page-title-controller.d.ts +13 -0
- package/dist/types/layout/panel-dialog-messages.d.ts +8 -0
- package/dist/types/layout/panes-messages.d.ts +22 -0
- package/dist/types/layout/refresh-messages.d.ts +8 -0
- package/dist/types/layout/settings-messages.d.ts +25 -0
- package/dist/types/layout/workspace-messages.d.ts +26 -0
- package/dist/types/surfaces/StatCell.d.ts +5 -0
- package/dist/types/surfaces/avatar-messages.d.ts +11 -0
- package/dist/types/surfaces/resource-messages.d.ts +11 -0
- package/dist/types/widgets/Widget.d.ts +5 -1
- package/package.json +1 -1
|
@@ -45,6 +45,7 @@ import { useUiMessages } from "../intl/messages";
|
|
|
45
45
|
import { ProgressBar } from "../surfaces/ProgressBar";
|
|
46
46
|
import { ChatContextPanel, ChatContextPopup } from "./ChatContextPopup";
|
|
47
47
|
import { executeChatAction } from "./chat-behavior";
|
|
48
|
+
import { useChatMessages } from "./chat-messages";
|
|
48
49
|
const roleLabel = (role, messages) => {
|
|
49
50
|
if (role === "assistant") return messages.assistant;
|
|
50
51
|
if (role === "user") return messages.user;
|
|
@@ -94,11 +95,11 @@ const dateTime = value => {
|
|
|
94
95
|
return Number.isFinite(date.getTime()) ? date.toISOString() : null;
|
|
95
96
|
};
|
|
96
97
|
export function ChatMessage(props) {
|
|
97
|
-
const
|
|
98
|
+
const chatMessages = useChatMessages();
|
|
98
99
|
const [busyActionId, setBusyActionId] = createSignal(null);
|
|
99
100
|
const [completedActionId, setCompletedActionId] = createSignal(null);
|
|
100
101
|
let completedTimer;
|
|
101
|
-
const status = () => statusLabel(props.status,
|
|
102
|
+
const status = () => statusLabel(props.status, chatMessages());
|
|
102
103
|
const timestamp = () => dateTime(props.createdAt);
|
|
103
104
|
// Locale and timezone are application policy. Requiring an explicit visible
|
|
104
105
|
// label keeps SSR and hydration byte-stable while `createdAt` still supplies
|
|
@@ -144,7 +145,7 @@ export function ChatMessage(props) {
|
|
|
144
145
|
[_el$23, _co$7] = _$getNextMarker(_el$22.nextSibling),
|
|
145
146
|
_el$24 = _el$23.nextSibling,
|
|
146
147
|
[_el$25, _co$8] = _$getNextMarker(_el$24.nextSibling);
|
|
147
|
-
_$insert(_el$3, () => props.label ?? roleLabel(props.role,
|
|
148
|
+
_$insert(_el$3, () => props.label ?? roleLabel(props.role, chatMessages()), _el$6, _co$);
|
|
148
149
|
_$insert(_el$2, _$createComponent(Show, {
|
|
149
150
|
get when() {
|
|
150
151
|
return (props.attachments?.length ?? 0) > 0;
|
|
@@ -222,7 +223,7 @@ export function ChatMessage(props) {
|
|
|
222
223
|
var _v$0 = attachment.kind,
|
|
223
224
|
_v$1 = attachment.name,
|
|
224
225
|
_v$10 = href(),
|
|
225
|
-
_v$11 =
|
|
226
|
+
_v$11 = chatMessages().openInNewTab({
|
|
226
227
|
name: attachment.name
|
|
227
228
|
});
|
|
228
229
|
_v$0 !== _p$.e && _$setAttribute(_el$30, "data-kind", _p$.e = _v$0);
|
|
@@ -241,7 +242,7 @@ export function ChatMessage(props) {
|
|
|
241
242
|
});
|
|
242
243
|
}
|
|
243
244
|
}));
|
|
244
|
-
_$effect(() => _$setAttribute(_el$7, "aria-label",
|
|
245
|
+
_$effect(() => _$setAttribute(_el$7, "aria-label", chatMessages().attachments));
|
|
245
246
|
return _el$7;
|
|
246
247
|
}
|
|
247
248
|
}), _el$21, _co$6);
|
|
@@ -302,7 +303,7 @@ export function ChatMessage(props) {
|
|
|
302
303
|
get children() {
|
|
303
304
|
var _el$1 = _$getNextElement(_tmpl$4);
|
|
304
305
|
_$insert(_el$1, _$createComponent(ChatProgressDots, {}));
|
|
305
|
-
_$effect(() => _$setAttribute(_el$1, "aria-label",
|
|
306
|
+
_$effect(() => _$setAttribute(_el$1, "aria-label", chatMessages().generating));
|
|
306
307
|
return _el$1;
|
|
307
308
|
}
|
|
308
309
|
}), _el$13, _co$2);
|
|
@@ -355,7 +356,7 @@ export function ChatMessage(props) {
|
|
|
355
356
|
}
|
|
356
357
|
})
|
|
357
358
|
}));
|
|
358
|
-
_$effect(() => _$setAttribute(_el$10, "aria-label",
|
|
359
|
+
_$effect(() => _$setAttribute(_el$10, "aria-label", chatMessages().messageActions));
|
|
359
360
|
return _el$10;
|
|
360
361
|
}
|
|
361
362
|
}), _el$17, _co$4);
|
|
@@ -367,7 +368,7 @@ export function ChatMessage(props) {
|
|
|
367
368
|
return _$createComponent(Dropdown.Root, {
|
|
368
369
|
position: "bottom-left",
|
|
369
370
|
get label() {
|
|
370
|
-
return
|
|
371
|
+
return chatMessages().messageActions;
|
|
371
372
|
},
|
|
372
373
|
get items() {
|
|
373
374
|
return menuItems();
|
|
@@ -377,10 +378,10 @@ export function ChatMessage(props) {
|
|
|
377
378
|
appearance: "plain",
|
|
378
379
|
"class": "k2b-chat-message__menu",
|
|
379
380
|
get label() {
|
|
380
|
-
return
|
|
381
|
+
return chatMessages().messageActions;
|
|
381
382
|
},
|
|
382
383
|
get title() {
|
|
383
|
-
return
|
|
384
|
+
return chatMessages().messageActions;
|
|
384
385
|
},
|
|
385
386
|
get children() {
|
|
386
387
|
return _$getNextElement(_tmpl$6);
|
|
@@ -590,6 +591,7 @@ export function ChatContextUsage(props) {
|
|
|
590
591
|
}
|
|
591
592
|
};
|
|
592
593
|
const messages = useUiMessages();
|
|
594
|
+
const chatMessages = useChatMessages();
|
|
593
595
|
const locale = useLocale();
|
|
594
596
|
const formatNumber = value => props.formatNumber ? props.formatNumber(value) : formatLocaleInteger(value, locale());
|
|
595
597
|
const formattedUsageValue = value => value === null ? messages().unknown : formatNumber(value);
|
|
@@ -602,13 +604,13 @@ export function ChatContextUsage(props) {
|
|
|
602
604
|
const remaining = () => reported() && windowSize() > 0 ? Math.max(0, windowSize() - total()) : null;
|
|
603
605
|
const accessibleLabel = () => {
|
|
604
606
|
if (!reported()) {
|
|
605
|
-
return windowSize() > 0 ?
|
|
607
|
+
return windowSize() > 0 ? chatMessages().contextUsageUnavailableWithWindow({
|
|
606
608
|
window: formatNumber(windowSize())
|
|
607
|
-
}) :
|
|
609
|
+
}) : chatMessages().contextUsageUnavailable;
|
|
608
610
|
}
|
|
609
|
-
return percent() === null ?
|
|
611
|
+
return percent() === null ? chatMessages().tokensUsed({
|
|
610
612
|
total: formatNumber(total())
|
|
611
|
-
}) :
|
|
613
|
+
}) : chatMessages().tokensUsedPercent({
|
|
612
614
|
total: formatNumber(total()),
|
|
613
615
|
percent: percent()
|
|
614
616
|
});
|
|
@@ -617,7 +619,7 @@ export function ChatContextUsage(props) {
|
|
|
617
619
|
get content() {
|
|
618
620
|
return _$createComponent(ChatContextPanel, {
|
|
619
621
|
get title() {
|
|
620
|
-
return
|
|
622
|
+
return chatMessages().lastRequestContext;
|
|
621
623
|
},
|
|
622
624
|
get children() {
|
|
623
625
|
return [_$createComponent(Show, {
|
|
@@ -634,7 +636,7 @@ export function ChatContextUsage(props) {
|
|
|
634
636
|
return (percent() ?? 0) >= 85 ? "danger" : "info";
|
|
635
637
|
},
|
|
636
638
|
get label() {
|
|
637
|
-
return
|
|
639
|
+
return chatMessages().contextWindowUsed;
|
|
638
640
|
}
|
|
639
641
|
});
|
|
640
642
|
}
|
|
@@ -663,14 +665,14 @@ export function ChatContextUsage(props) {
|
|
|
663
665
|
var _el$75 = _$getNextElement(_tmpl$23),
|
|
664
666
|
_el$76 = _el$75.firstChild,
|
|
665
667
|
_el$77 = _el$76.nextSibling;
|
|
666
|
-
_$insert(_el$76, () =>
|
|
668
|
+
_$insert(_el$76, () => chatMessages().model);
|
|
667
669
|
_$insert(_el$77, model);
|
|
668
670
|
return _el$75;
|
|
669
671
|
})()
|
|
670
672
|
}), _el$70, _co$1);
|
|
671
|
-
_$insert(_el$55, () =>
|
|
673
|
+
_$insert(_el$55, () => chatMessages().input);
|
|
672
674
|
_$insert(_el$56, () => formattedUsageValue(usage().input));
|
|
673
|
-
_$insert(_el$58, () =>
|
|
675
|
+
_$insert(_el$58, () => chatMessages().output);
|
|
674
676
|
_$insert(_el$59, () => formattedUsageValue(usage().output));
|
|
675
677
|
_$insert(_el$53, _$createComponent(Show, {
|
|
676
678
|
get when() {
|
|
@@ -680,15 +682,15 @@ export function ChatContextUsage(props) {
|
|
|
680
682
|
var _el$60 = _$getNextElement(_tmpl$23),
|
|
681
683
|
_el$61 = _el$60.firstChild,
|
|
682
684
|
_el$62 = _el$61.nextSibling;
|
|
683
|
-
_$insert(_el$61, () =>
|
|
685
|
+
_$insert(_el$61, () => chatMessages().loopTotal);
|
|
684
686
|
_$insert(_el$62, () => formattedUsageValue(loopUsage().total));
|
|
685
687
|
return _el$60;
|
|
686
688
|
}
|
|
687
689
|
}), _el$72, _co$10);
|
|
688
|
-
_$insert(_el$64, () =>
|
|
690
|
+
_$insert(_el$64, () => chatMessages().contextWindow);
|
|
689
691
|
_$insert(_el$65, (() => {
|
|
690
692
|
var _c$3 = _$memo(() => windowSize() > 0);
|
|
691
|
-
return () => _c$3() ? formatNumber(windowSize()) :
|
|
693
|
+
return () => _c$3() ? formatNumber(windowSize()) : chatMessages().notConfigured;
|
|
692
694
|
})());
|
|
693
695
|
_$insert(_el$53, _$createComponent(Show, {
|
|
694
696
|
get when() {
|
|
@@ -698,7 +700,7 @@ export function ChatContextUsage(props) {
|
|
|
698
700
|
var _el$66 = _$getNextElement(_tmpl$23),
|
|
699
701
|
_el$67 = _el$66.firstChild,
|
|
700
702
|
_el$68 = _el$67.nextSibling;
|
|
701
|
-
_$insert(_el$67, () =>
|
|
703
|
+
_$insert(_el$67, () => chatMessages().remaining);
|
|
702
704
|
_$insert(_el$68, (() => {
|
|
703
705
|
var _c$4 = _$memo(() => remaining() === null);
|
|
704
706
|
return () => _c$4() ? messages().unknown : formatNumber(remaining());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["chat/ChatPrimitives.tsx"],"sourcesContent":["import { createRenderEffect, createSignal, For, type JSX, onCleanup, Show } from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { Dropdown, type DropdownItem } from \"../actions/Dropdown\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { useLocale } from \"../intl/locale\";\nimport { type UiMessages, useUiMessages } from \"../intl/messages\";\nimport { ProgressBar } from \"../surfaces/ProgressBar\";\nimport { ChatContextPanel, ChatContextPopup } from \"./ChatContextPopup\";\nimport { executeChatAction } from \"./chat-behavior\";\nimport type { ChatAction, ChatActivityTone, ChatAttachment, ChatContextUsageData, ChatMessageStatus, ChatRole } from \"./types\";\n\nexport type ChatMessageProps = {\n role: ChatRole;\n children?: JSX.Element;\n label?: string;\n createdAt?: string | Date;\n timeLabel?: string;\n status?: ChatMessageStatus;\n attachments?: readonly ChatAttachment[];\n actions?: readonly ChatAction[];\n actionDisplay?: \"auto\" | \"inline\" | \"menu\";\n anchorId?: string | number;\n onActionError?: (error: unknown) => void;\n class?: string;\n};\n\nexport type ChatActivityProps = {\n label: string;\n /** Spelled-out name for an expandable row whose visible text abbreviates, such as durations. */\n ariaLabel?: string;\n description?: string;\n icon?: string;\n /** Optional host-owned leading visual rendered instead of the icon. */\n leading?: JSX.Element;\n /** Optional identity accent for the leading visual. Semantic tones still take precedence. */\n accent?: string;\n tone?: ChatActivityTone;\n /** Marks the activity as running with the shared accent sweep. */\n busy?: boolean;\n trailing?: JSX.Element;\n /** Controlled disclosure state. Omit to keep native details behavior. */\n open?: boolean;\n /** Reports disclosure changes when `open` is controlled by the host. */\n onOpenChange?: (open: boolean) => void;\n defaultOpen?: boolean;\n /** Set to false when the body is a peer list that should align with the activity row. */\n bodyInset?: boolean;\n anchorId?: string | number;\n children?: JSX.Element;\n /** Mount expensive details only while expanded. */\n renderBody?: () => JSX.Element;\n class?: string;\n};\n\nexport type ChatContextUsageProps = ChatContextUsageData & {\n action?: ChatAction;\n onActionError?: (error: unknown) => void;\n /** Host-owned number formatting. The default groups whole numbers in the inherited render locale. */\n formatNumber?: (value: number) => string;\n class?: string;\n};\n\nconst roleLabel = (role: ChatRole, messages: UiMessages): string => {\n if (role === \"assistant\") return messages.assistant;\n if (role === \"user\") return messages.user;\n if (role === \"tool\") return messages.tool;\n return messages.system;\n};\n\nconst statusLabel = (status: ChatMessageStatus | undefined, messages: UiMessages): string | null => {\n if (status === \"pending\") return messages.waiting;\n if (status === \"streaming\") return messages.generating;\n if (status === \"error\") return messages.failed;\n return null;\n};\n\nconst statusIcon = (status: ChatMessageStatus | undefined): string => {\n if (status === \"pending\") return \"ti ti-clock\";\n return \"ti ti-alert-circle\";\n};\n\nconst ChatProgressDots = () => (\n <span class=\"k2b-chat-progress-dots\" aria-hidden=\"true\">\n <span />\n <span />\n <span />\n </span>\n);\n\nconst attachmentIcon = (attachment: ChatAttachment): string =>\n attachment.icon ?? (attachment.kind === \"image\" ? \"ti ti-photo\" : attachment.kind === \"resource\" ? \"ti ti-link\" : \"ti ti-file\");\n\nconst finiteNonNegative = (value: number | undefined): number =>\n typeof value === \"number\" && Number.isFinite(value) ? Math.max(0, value) : 0;\n\nconst finiteUsageValue = (value: number | undefined): number | null =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : null;\n\nconst normalizedUsage = (usage: ChatContextUsageData[\"usage\"]) => {\n const input = finiteUsageValue(usage?.input);\n const output = finiteUsageValue(usage?.output);\n const explicitTotal = finiteUsageValue(usage?.total);\n const total = explicitTotal ?? (input !== null || output !== null ? (input ?? 0) + (output ?? 0) : null);\n return { input, output, total, reported: total !== null };\n};\n\n/** Whole numbers in the render locale, so a German page reads 128.000 and an English one 128,000. */\nconst formatLocaleInteger = (value: number, locale: string): string =>\n new Intl.NumberFormat(locale, { maximumFractionDigits: 0 }).format(Math.round(finiteNonNegative(value)));\n\nexport const formatChatTokens = (tokens: number): string => {\n const value = finiteNonNegative(tokens);\n if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (value >= 1_000) return `${(value / 1_000).toFixed(1)}k`;\n return String(Math.round(value));\n};\n\nconst dateTime = (value: string | Date | undefined): string | null => {\n if (!value) return null;\n const date = value instanceof Date ? value : new Date(value);\n return Number.isFinite(date.getTime()) ? date.toISOString() : null;\n};\n\nexport function ChatMessage(props: ChatMessageProps): JSX.Element {\n const messages = useUiMessages();\n const [busyActionId, setBusyActionId] = createSignal<string | null>(null);\n const [completedActionId, setCompletedActionId] = createSignal<string | null>(null);\n let completedTimer: ReturnType<typeof setTimeout> | undefined;\n const status = () => statusLabel(props.status, messages());\n const timestamp = () => dateTime(props.createdAt);\n // Locale and timezone are application policy. Requiring an explicit visible\n // label keeps SSR and hydration byte-stable while `createdAt` still supplies\n // the semantic machine-readable timestamp.\n const time = () => props.timeLabel ?? null;\n const actions = () => props.actions ?? [];\n const actionDisplay = () =>\n props.actionDisplay === \"auto\" || !props.actionDisplay ? (props.role === \"user\" ? \"menu\" : \"inline\") : props.actionDisplay;\n const hasMeta = () => props.status === \"streaming\" || status() !== null || Boolean(time()) || actions().length > 0;\n\n const runAction = async (action: ChatAction) => {\n if (action.disabled || busyActionId()) return;\n setBusyActionId(action.id);\n try {\n await executeChatAction(action);\n setCompletedActionId(action.id);\n if (completedTimer) clearTimeout(completedTimer);\n completedTimer = setTimeout(() => setCompletedActionId(null), 1400);\n } catch (error) {\n props.onActionError?.(error);\n } finally {\n setBusyActionId(null);\n }\n };\n\n const actionIcon = (action: ChatAction) =>\n busyActionId() === action.id\n ? \"ti ti-loader-2 k2b-spin\"\n : completedActionId() === action.id\n ? \"ti ti-check\"\n : (action.icon ?? \"ti ti-dots\");\n\n onCleanup(() => {\n if (completedTimer) clearTimeout(completedTimer);\n });\n\n const menuItems = (): readonly DropdownItem[] =>\n actions().map((action) => ({\n icon: actionIcon(action),\n label: action.label,\n variant: action.variant,\n disabled: action.disabled || Boolean(busyActionId()),\n action: () => void runAction(action),\n }));\n\n return (\n <article\n class={`k2b-chat-message ${props.class ?? \"\"}`}\n data-role={props.role}\n data-status={props.status ?? \"complete\"}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n aria-busy={props.status === \"pending\" || props.status === \"streaming\" ? \"true\" : undefined}\n >\n <span class=\"k2b-sr-only\">{props.label ?? roleLabel(props.role, messages())}: </span>\n <Show when={(props.attachments?.length ?? 0) > 0}>\n <div class=\"k2b-chat-message__attachments\" role=\"list\" aria-label={messages().attachments}>\n <For each={props.attachments}>\n {(attachment) => {\n // A preview that no longer loads, such as a deleted file, falls back to the attachment icon; a new URL tries again.\n const [failedPreviewUrl, setFailedPreviewUrl] = createSignal<string>();\n const content = () => (\n <>\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl && attachment.previewUrl !== failedPreviewUrl()}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img\n src={attachment.previewUrl}\n alt={attachment.alt ?? attachment.name}\n onError={() => setFailedPreviewUrl(attachment.previewUrl)}\n />\n </Show>\n <Show when={attachment.kind !== \"image\"}>\n <span>{attachment.name}</span>\n </Show>\n </>\n );\n return (\n <Show\n when={attachment.href}\n fallback={\n <div class=\"k2b-chat-message__attachment\" data-kind={attachment.kind} role=\"listitem\" title={attachment.name}>\n {content()}\n </div>\n }\n >\n {(href) => (\n <a\n class=\"k2b-chat-message__attachment\"\n data-kind={attachment.kind}\n role=\"listitem\"\n title={attachment.name}\n href={href()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={messages().openInNewTab({ name: attachment.name })}\n >\n {content()}\n </a>\n )}\n </Show>\n );\n }}\n </For>\n </div>\n </Show>\n\n <Show when={props.children !== undefined && props.children !== null && props.children !== \"\"}>\n <div class=\"k2b-chat-message__bubble\">\n <div class=\"k2b-chat-message__content\">{props.children}</div>\n </div>\n </Show>\n\n <Show when={hasMeta()}>\n <footer class=\"k2b-chat-message__meta\">\n <Show\n when={props.status === \"streaming\"}\n fallback={\n <Show when={status()}>\n {(label) => (\n <span class=\"k2b-chat-message__status\" role={props.status === \"error\" ? \"alert\" : \"status\"}>\n <i class={statusIcon(props.status)} aria-hidden=\"true\" />\n {label()}\n </span>\n )}\n </Show>\n }\n >\n <span class=\"k2b-chat-message__status k2b-chat-message__status--streaming\" role=\"status\" aria-label={messages().generating}>\n <ChatProgressDots />\n </span>\n </Show>\n <Show when={time()}>{(label) => <time dateTime={timestamp() ?? undefined}>{label()}</time>}</Show>\n <Show when={actions().length > 0 && actionDisplay() === \"inline\"}>\n <span class=\"k2b-chat-message__actions\" role=\"group\" aria-label={messages().messageActions}>\n <For each={actions()}>\n {(action) => (\n <Tooltip.Trigger\n type=\"button\"\n aria-label={action.label}\n aria-pressed={action.pressed}\n data-pressed-tone={action.pressedTone}\n content={action.label}\n data-danger={action.variant === \"danger\" ? \"true\" : undefined}\n disabled={action.disabled || Boolean(busyActionId())}\n onClick={() => void runAction(action)}\n >\n <i class={actionIcon(action)} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </For>\n </span>\n </Show>\n <Show when={actions().length > 0 && actionDisplay() === \"menu\"}>\n <Dropdown.Root position=\"bottom-left\" label={messages().messageActions} items={menuItems()}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-chat-message__menu\"\n label={messages().messageActions}\n title={messages().messageActions}\n >\n <i class=\"ti ti-dots\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </footer>\n </Show>\n </article>\n );\n}\n\nconst ActivityContent = (props: ChatActivityProps & { disclosure?: boolean }) => (\n <>\n <span class=\"k2b-chat-activity__leading\" aria-hidden=\"true\">\n <Show when={props.leading} fallback={<i class={props.icon ?? \"ti ti-sparkles\"} />}>\n {props.leading}\n </Show>\n </span>\n <span class=\"k2b-chat-activity__copy\">\n <strong>{props.label}</strong>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n <Show when={props.trailing}>\n <span class=\"k2b-chat-activity__trailing\">{props.trailing}</span>\n </Show>\n <Show when={props.disclosure}>\n <i class=\"ti ti-chevron-right k2b-chat-activity__chevron\" aria-hidden=\"true\" />\n </Show>\n </>\n);\n\nexport function ChatActivity(props: ChatActivityProps): JSX.Element {\n // The disclosure's real state. A controlled `open` sets it, and every toggle reports it, so the body renders whenever\n // the row is open, also when a host has not yet passed its new `open` back.\n const [expanded, setExpanded] = createSignal(props.open ?? props.defaultOpen ?? false);\n createRenderEffect(() => {\n const open = props.open;\n if (open !== undefined) setExpanded(open);\n });\n const open = expanded;\n const tone = () => props.tone ?? \"neutral\";\n const style = () => (props.accent ? { \"--k2b-chat-activity-accent\": props.accent } : undefined);\n return (\n <Show\n when={props.renderBody || props.children}\n fallback={\n <div\n class={`k2b-chat-activity ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-accent={props.accent ? \"true\" : undefined}\n data-busy={props.busy ? \"true\" : undefined}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n style={style()}\n aria-busy={props.busy ? \"true\" : undefined}\n >\n <div class=\"k2b-chat-activity__row\">\n <ActivityContent {...props} />\n </div>\n </div>\n }\n >\n <details\n class={`k2b-chat-activity ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-accent={props.accent ? \"true\" : undefined}\n data-busy={props.busy ? \"true\" : undefined}\n data-body-inset={props.bodyInset === false ? \"false\" : undefined}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n style={style()}\n open={open()}\n onToggle={(event) => {\n setExpanded(event.currentTarget.open);\n props.onOpenChange?.(event.currentTarget.open);\n }}\n aria-busy={props.busy ? \"true\" : undefined}\n >\n <summary class=\"k2b-chat-activity__row\" aria-label={props.ariaLabel}>\n <ActivityContent {...props} disclosure />\n </summary>\n <div class=\"k2b-chat-activity__body\">\n {props.renderBody ? <Show when={open() ? props.renderBody : undefined}>{(render) => render()()}</Show> : props.children}\n </div>\n </details>\n </Show>\n );\n}\n\nexport function ChatContextUsage(props: ChatContextUsageProps): JSX.Element {\n const [busy, setBusy] = createSignal(false);\n const run = async () => {\n const action = props.action;\n if (!action || action.disabled || busy()) return;\n setBusy(true);\n try {\n await executeChatAction(action);\n } catch (error) {\n props.onActionError?.(error);\n } finally {\n setBusy(false);\n }\n };\n const messages = useUiMessages();\n const locale = useLocale();\n const formatNumber = (value: number) => (props.formatNumber ? props.formatNumber(value) : formatLocaleInteger(value, locale()));\n const formattedUsageValue = (value: number | null): string => (value === null ? messages().unknown : formatNumber(value));\n const usage = () => normalizedUsage(props.usage);\n const loopUsage = () => normalizedUsage(props.loopUsage);\n const total = () => usage().total ?? 0;\n const windowSize = () => finiteNonNegative(props.contextWindow);\n const reported = () => usage().reported;\n const percent = () => (reported() && windowSize() > 0 ? Math.min(100, Math.round((total() / windowSize()) * 100)) : null);\n const remaining = () => (reported() && windowSize() > 0 ? Math.max(0, windowSize() - total()) : null);\n const accessibleLabel = () => {\n if (!reported()) {\n return windowSize() > 0\n ? messages().contextUsageUnavailableWithWindow({ window: formatNumber(windowSize()) })\n : messages().contextUsageUnavailable;\n }\n return percent() === null\n ? messages().tokensUsed({ total: formatNumber(total()) })\n : messages().tokensUsedPercent({ total: formatNumber(total()), percent: percent()! });\n };\n\n return (\n <ChatContextPopup\n content={\n <ChatContextPanel title={messages().lastRequestContext}>\n <Show when={percent() !== null}>\n <ProgressBar\n value={percent() ?? 0}\n size=\"xs\"\n tone={(percent() ?? 0) >= 85 ? \"danger\" : \"info\"}\n label={messages().contextWindowUsed}\n />\n </Show>\n <dl>\n <Show when={props.modelLabel}>\n {(model) => (\n <div>\n <dt>{messages().model}</dt>\n <dd>{model()}</dd>\n </div>\n )}\n </Show>\n <div>\n <dt>{messages().input}</dt>\n <dd>{formattedUsageValue(usage().input)}</dd>\n </div>\n <div>\n <dt>{messages().output}</dt>\n <dd>{formattedUsageValue(usage().output)}</dd>\n </div>\n <Show when={loopUsage().reported}>\n <div>\n <dt>{messages().loopTotal}</dt>\n <dd>{formattedUsageValue(loopUsage().total)}</dd>\n </div>\n </Show>\n <div>\n <dt>{messages().contextWindow}</dt>\n <dd>{windowSize() > 0 ? formatNumber(windowSize()) : messages().notConfigured}</dd>\n </div>\n <Show when={remaining() !== null}>\n <div>\n <dt>{messages().remaining}</dt>\n <dd>{remaining() === null ? messages().unknown : formatNumber(remaining()!)}</dd>\n </div>\n </Show>\n </dl>\n <Show when={props.action}>\n {(action) => (\n <Button size=\"xs\" variant=\"subtle\" disabled={action().disabled || busy()} onClick={() => void run()} aria-busy={busy()}>\n <i class={busy() ? \"ti ti-loader-2 k2b-spin\" : action().icon} aria-hidden=\"true\" />\n {action().label}\n </Button>\n )}\n </Show>\n </ChatContextPanel>\n }\n type=\"button\"\n class={`k2b-chat-context ${props.class ?? \"\"}`}\n data-warning={reported() && (percent() ?? 0) >= 85 ? \"true\" : undefined}\n aria-label={accessibleLabel()}\n >\n <i class=\"ti ti-brain\" aria-hidden=\"true\" />\n <span>{percent() === null ? \"–\" : `${percent()}%`}</span>\n </ChatContextPopup>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["chat/ChatPrimitives.tsx"],"sourcesContent":["import { createRenderEffect, createSignal, For, type JSX, onCleanup, Show } from \"solid-js\";\nimport { Button } from \"../actions/Button\";\nimport { Dropdown, type DropdownItem } from \"../actions/Dropdown\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { ProgressBar } from \"../surfaces/ProgressBar\";\nimport { ChatContextPanel, ChatContextPopup } from \"./ChatContextPopup\";\nimport { executeChatAction } from \"./chat-behavior\";\nimport { type ChatMessages, useChatMessages } from \"./chat-messages\";\nimport type { ChatAction, ChatActivityTone, ChatAttachment, ChatContextUsageData, ChatMessageStatus, ChatRole } from \"./types\";\n\nexport type ChatMessageProps = {\n role: ChatRole;\n children?: JSX.Element;\n label?: string;\n createdAt?: string | Date;\n timeLabel?: string;\n status?: ChatMessageStatus;\n attachments?: readonly ChatAttachment[];\n actions?: readonly ChatAction[];\n actionDisplay?: \"auto\" | \"inline\" | \"menu\";\n anchorId?: string | number;\n onActionError?: (error: unknown) => void;\n class?: string;\n};\n\nexport type ChatActivityProps = {\n label: string;\n /** Spelled-out name for an expandable row whose visible text abbreviates, such as durations. */\n ariaLabel?: string;\n description?: string;\n icon?: string;\n /** Optional host-owned leading visual rendered instead of the icon. */\n leading?: JSX.Element;\n /** Optional identity accent for the leading visual. Semantic tones still take precedence. */\n accent?: string;\n tone?: ChatActivityTone;\n /** Marks the activity as running with the shared accent sweep. */\n busy?: boolean;\n trailing?: JSX.Element;\n /** Controlled disclosure state. Omit to keep native details behavior. */\n open?: boolean;\n /** Reports disclosure changes when `open` is controlled by the host. */\n onOpenChange?: (open: boolean) => void;\n defaultOpen?: boolean;\n /** Set to false when the body is a peer list that should align with the activity row. */\n bodyInset?: boolean;\n anchorId?: string | number;\n children?: JSX.Element;\n /** Mount expensive details only while expanded. */\n renderBody?: () => JSX.Element;\n class?: string;\n};\n\nexport type ChatContextUsageProps = ChatContextUsageData & {\n action?: ChatAction;\n onActionError?: (error: unknown) => void;\n /** Host-owned number formatting. The default groups whole numbers in the inherited render locale. */\n formatNumber?: (value: number) => string;\n class?: string;\n};\n\nconst roleLabel = (role: ChatRole, messages: ChatMessages): string => {\n if (role === \"assistant\") return messages.assistant;\n if (role === \"user\") return messages.user;\n if (role === \"tool\") return messages.tool;\n return messages.system;\n};\n\nconst statusLabel = (status: ChatMessageStatus | undefined, messages: ChatMessages): string | null => {\n if (status === \"pending\") return messages.waiting;\n if (status === \"streaming\") return messages.generating;\n if (status === \"error\") return messages.failed;\n return null;\n};\n\nconst statusIcon = (status: ChatMessageStatus | undefined): string => {\n if (status === \"pending\") return \"ti ti-clock\";\n return \"ti ti-alert-circle\";\n};\n\nconst ChatProgressDots = () => (\n <span class=\"k2b-chat-progress-dots\" aria-hidden=\"true\">\n <span />\n <span />\n <span />\n </span>\n);\n\nconst attachmentIcon = (attachment: ChatAttachment): string =>\n attachment.icon ?? (attachment.kind === \"image\" ? \"ti ti-photo\" : attachment.kind === \"resource\" ? \"ti ti-link\" : \"ti ti-file\");\n\nconst finiteNonNegative = (value: number | undefined): number =>\n typeof value === \"number\" && Number.isFinite(value) ? Math.max(0, value) : 0;\n\nconst finiteUsageValue = (value: number | undefined): number | null =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : null;\n\nconst normalizedUsage = (usage: ChatContextUsageData[\"usage\"]) => {\n const input = finiteUsageValue(usage?.input);\n const output = finiteUsageValue(usage?.output);\n const explicitTotal = finiteUsageValue(usage?.total);\n const total = explicitTotal ?? (input !== null || output !== null ? (input ?? 0) + (output ?? 0) : null);\n return { input, output, total, reported: total !== null };\n};\n\n/** Whole numbers in the render locale, so a German page reads 128.000 and an English one 128,000. */\nconst formatLocaleInteger = (value: number, locale: string): string =>\n new Intl.NumberFormat(locale, { maximumFractionDigits: 0 }).format(Math.round(finiteNonNegative(value)));\n\nexport const formatChatTokens = (tokens: number): string => {\n const value = finiteNonNegative(tokens);\n if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (value >= 1_000) return `${(value / 1_000).toFixed(1)}k`;\n return String(Math.round(value));\n};\n\nconst dateTime = (value: string | Date | undefined): string | null => {\n if (!value) return null;\n const date = value instanceof Date ? value : new Date(value);\n return Number.isFinite(date.getTime()) ? date.toISOString() : null;\n};\n\nexport function ChatMessage(props: ChatMessageProps): JSX.Element {\n const chatMessages = useChatMessages();\n const [busyActionId, setBusyActionId] = createSignal<string | null>(null);\n const [completedActionId, setCompletedActionId] = createSignal<string | null>(null);\n let completedTimer: ReturnType<typeof setTimeout> | undefined;\n const status = () => statusLabel(props.status, chatMessages());\n const timestamp = () => dateTime(props.createdAt);\n // Locale and timezone are application policy. Requiring an explicit visible\n // label keeps SSR and hydration byte-stable while `createdAt` still supplies\n // the semantic machine-readable timestamp.\n const time = () => props.timeLabel ?? null;\n const actions = () => props.actions ?? [];\n const actionDisplay = () =>\n props.actionDisplay === \"auto\" || !props.actionDisplay ? (props.role === \"user\" ? \"menu\" : \"inline\") : props.actionDisplay;\n const hasMeta = () => props.status === \"streaming\" || status() !== null || Boolean(time()) || actions().length > 0;\n\n const runAction = async (action: ChatAction) => {\n if (action.disabled || busyActionId()) return;\n setBusyActionId(action.id);\n try {\n await executeChatAction(action);\n setCompletedActionId(action.id);\n if (completedTimer) clearTimeout(completedTimer);\n completedTimer = setTimeout(() => setCompletedActionId(null), 1400);\n } catch (error) {\n props.onActionError?.(error);\n } finally {\n setBusyActionId(null);\n }\n };\n\n const actionIcon = (action: ChatAction) =>\n busyActionId() === action.id\n ? \"ti ti-loader-2 k2b-spin\"\n : completedActionId() === action.id\n ? \"ti ti-check\"\n : (action.icon ?? \"ti ti-dots\");\n\n onCleanup(() => {\n if (completedTimer) clearTimeout(completedTimer);\n });\n\n const menuItems = (): readonly DropdownItem[] =>\n actions().map((action) => ({\n icon: actionIcon(action),\n label: action.label,\n variant: action.variant,\n disabled: action.disabled || Boolean(busyActionId()),\n action: () => void runAction(action),\n }));\n\n return (\n <article\n class={`k2b-chat-message ${props.class ?? \"\"}`}\n data-role={props.role}\n data-status={props.status ?? \"complete\"}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n aria-busy={props.status === \"pending\" || props.status === \"streaming\" ? \"true\" : undefined}\n >\n <span class=\"k2b-sr-only\">{props.label ?? roleLabel(props.role, chatMessages())}: </span>\n <Show when={(props.attachments?.length ?? 0) > 0}>\n <div class=\"k2b-chat-message__attachments\" role=\"list\" aria-label={chatMessages().attachments}>\n <For each={props.attachments}>\n {(attachment) => {\n // A preview that no longer loads, such as a deleted file, falls back to the attachment icon; a new URL tries again.\n const [failedPreviewUrl, setFailedPreviewUrl] = createSignal<string>();\n const content = () => (\n <>\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl && attachment.previewUrl !== failedPreviewUrl()}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img\n src={attachment.previewUrl}\n alt={attachment.alt ?? attachment.name}\n onError={() => setFailedPreviewUrl(attachment.previewUrl)}\n />\n </Show>\n <Show when={attachment.kind !== \"image\"}>\n <span>{attachment.name}</span>\n </Show>\n </>\n );\n return (\n <Show\n when={attachment.href}\n fallback={\n <div class=\"k2b-chat-message__attachment\" data-kind={attachment.kind} role=\"listitem\" title={attachment.name}>\n {content()}\n </div>\n }\n >\n {(href) => (\n <a\n class=\"k2b-chat-message__attachment\"\n data-kind={attachment.kind}\n role=\"listitem\"\n title={attachment.name}\n href={href()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={chatMessages().openInNewTab({ name: attachment.name })}\n >\n {content()}\n </a>\n )}\n </Show>\n );\n }}\n </For>\n </div>\n </Show>\n\n <Show when={props.children !== undefined && props.children !== null && props.children !== \"\"}>\n <div class=\"k2b-chat-message__bubble\">\n <div class=\"k2b-chat-message__content\">{props.children}</div>\n </div>\n </Show>\n\n <Show when={hasMeta()}>\n <footer class=\"k2b-chat-message__meta\">\n <Show\n when={props.status === \"streaming\"}\n fallback={\n <Show when={status()}>\n {(label) => (\n <span class=\"k2b-chat-message__status\" role={props.status === \"error\" ? \"alert\" : \"status\"}>\n <i class={statusIcon(props.status)} aria-hidden=\"true\" />\n {label()}\n </span>\n )}\n </Show>\n }\n >\n <span class=\"k2b-chat-message__status k2b-chat-message__status--streaming\" role=\"status\" aria-label={chatMessages().generating}>\n <ChatProgressDots />\n </span>\n </Show>\n <Show when={time()}>{(label) => <time dateTime={timestamp() ?? undefined}>{label()}</time>}</Show>\n <Show when={actions().length > 0 && actionDisplay() === \"inline\"}>\n <span class=\"k2b-chat-message__actions\" role=\"group\" aria-label={chatMessages().messageActions}>\n <For each={actions()}>\n {(action) => (\n <Tooltip.Trigger\n type=\"button\"\n aria-label={action.label}\n aria-pressed={action.pressed}\n data-pressed-tone={action.pressedTone}\n content={action.label}\n data-danger={action.variant === \"danger\" ? \"true\" : undefined}\n disabled={action.disabled || Boolean(busyActionId())}\n onClick={() => void runAction(action)}\n >\n <i class={actionIcon(action)} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </For>\n </span>\n </Show>\n <Show when={actions().length > 0 && actionDisplay() === \"menu\"}>\n <Dropdown.Root position=\"bottom-left\" label={chatMessages().messageActions} items={menuItems()}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-chat-message__menu\"\n label={chatMessages().messageActions}\n title={chatMessages().messageActions}\n >\n <i class=\"ti ti-dots\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </footer>\n </Show>\n </article>\n );\n}\n\nconst ActivityContent = (props: ChatActivityProps & { disclosure?: boolean }) => (\n <>\n <span class=\"k2b-chat-activity__leading\" aria-hidden=\"true\">\n <Show when={props.leading} fallback={<i class={props.icon ?? \"ti ti-sparkles\"} />}>\n {props.leading}\n </Show>\n </span>\n <span class=\"k2b-chat-activity__copy\">\n <strong>{props.label}</strong>\n <Show when={props.description}>{(description) => <small>{description()}</small>}</Show>\n </span>\n <Show when={props.trailing}>\n <span class=\"k2b-chat-activity__trailing\">{props.trailing}</span>\n </Show>\n <Show when={props.disclosure}>\n <i class=\"ti ti-chevron-right k2b-chat-activity__chevron\" aria-hidden=\"true\" />\n </Show>\n </>\n);\n\nexport function ChatActivity(props: ChatActivityProps): JSX.Element {\n // The disclosure's real state. A controlled `open` sets it, and every toggle reports it, so the body renders whenever\n // the row is open, also when a host has not yet passed its new `open` back.\n const [expanded, setExpanded] = createSignal(props.open ?? props.defaultOpen ?? false);\n createRenderEffect(() => {\n const open = props.open;\n if (open !== undefined) setExpanded(open);\n });\n const open = expanded;\n const tone = () => props.tone ?? \"neutral\";\n const style = () => (props.accent ? { \"--k2b-chat-activity-accent\": props.accent } : undefined);\n return (\n <Show\n when={props.renderBody || props.children}\n fallback={\n <div\n class={`k2b-chat-activity ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-accent={props.accent ? \"true\" : undefined}\n data-busy={props.busy ? \"true\" : undefined}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n style={style()}\n aria-busy={props.busy ? \"true\" : undefined}\n >\n <div class=\"k2b-chat-activity__row\">\n <ActivityContent {...props} />\n </div>\n </div>\n }\n >\n <details\n class={`k2b-chat-activity ${props.class ?? \"\"}`}\n data-tone={tone()}\n data-accent={props.accent ? \"true\" : undefined}\n data-busy={props.busy ? \"true\" : undefined}\n data-body-inset={props.bodyInset === false ? \"false\" : undefined}\n data-chat-anchor={props.anchorId !== undefined ? String(props.anchorId) : undefined}\n style={style()}\n open={open()}\n onToggle={(event) => {\n setExpanded(event.currentTarget.open);\n props.onOpenChange?.(event.currentTarget.open);\n }}\n aria-busy={props.busy ? \"true\" : undefined}\n >\n <summary class=\"k2b-chat-activity__row\" aria-label={props.ariaLabel}>\n <ActivityContent {...props} disclosure />\n </summary>\n <div class=\"k2b-chat-activity__body\">\n {props.renderBody ? <Show when={open() ? props.renderBody : undefined}>{(render) => render()()}</Show> : props.children}\n </div>\n </details>\n </Show>\n );\n}\n\nexport function ChatContextUsage(props: ChatContextUsageProps): JSX.Element {\n const [busy, setBusy] = createSignal(false);\n const run = async () => {\n const action = props.action;\n if (!action || action.disabled || busy()) return;\n setBusy(true);\n try {\n await executeChatAction(action);\n } catch (error) {\n props.onActionError?.(error);\n } finally {\n setBusy(false);\n }\n };\n const messages = useUiMessages();\n const chatMessages = useChatMessages();\n const locale = useLocale();\n const formatNumber = (value: number) => (props.formatNumber ? props.formatNumber(value) : formatLocaleInteger(value, locale()));\n const formattedUsageValue = (value: number | null): string => (value === null ? messages().unknown : formatNumber(value));\n const usage = () => normalizedUsage(props.usage);\n const loopUsage = () => normalizedUsage(props.loopUsage);\n const total = () => usage().total ?? 0;\n const windowSize = () => finiteNonNegative(props.contextWindow);\n const reported = () => usage().reported;\n const percent = () => (reported() && windowSize() > 0 ? Math.min(100, Math.round((total() / windowSize()) * 100)) : null);\n const remaining = () => (reported() && windowSize() > 0 ? Math.max(0, windowSize() - total()) : null);\n const accessibleLabel = () => {\n if (!reported()) {\n return windowSize() > 0\n ? chatMessages().contextUsageUnavailableWithWindow({ window: formatNumber(windowSize()) })\n : chatMessages().contextUsageUnavailable;\n }\n return percent() === null\n ? chatMessages().tokensUsed({ total: formatNumber(total()) })\n : chatMessages().tokensUsedPercent({ total: formatNumber(total()), percent: percent()! });\n };\n\n return (\n <ChatContextPopup\n content={\n <ChatContextPanel title={chatMessages().lastRequestContext}>\n <Show when={percent() !== null}>\n <ProgressBar\n value={percent() ?? 0}\n size=\"xs\"\n tone={(percent() ?? 0) >= 85 ? \"danger\" : \"info\"}\n label={chatMessages().contextWindowUsed}\n />\n </Show>\n <dl>\n <Show when={props.modelLabel}>\n {(model) => (\n <div>\n <dt>{chatMessages().model}</dt>\n <dd>{model()}</dd>\n </div>\n )}\n </Show>\n <div>\n <dt>{chatMessages().input}</dt>\n <dd>{formattedUsageValue(usage().input)}</dd>\n </div>\n <div>\n <dt>{chatMessages().output}</dt>\n <dd>{formattedUsageValue(usage().output)}</dd>\n </div>\n <Show when={loopUsage().reported}>\n <div>\n <dt>{chatMessages().loopTotal}</dt>\n <dd>{formattedUsageValue(loopUsage().total)}</dd>\n </div>\n </Show>\n <div>\n <dt>{chatMessages().contextWindow}</dt>\n <dd>{windowSize() > 0 ? formatNumber(windowSize()) : chatMessages().notConfigured}</dd>\n </div>\n <Show when={remaining() !== null}>\n <div>\n <dt>{chatMessages().remaining}</dt>\n <dd>{remaining() === null ? messages().unknown : formatNumber(remaining()!)}</dd>\n </div>\n </Show>\n </dl>\n <Show when={props.action}>\n {(action) => (\n <Button size=\"xs\" variant=\"subtle\" disabled={action().disabled || busy()} onClick={() => void run()} aria-busy={busy()}>\n <i class={busy() ? \"ti ti-loader-2 k2b-spin\" : action().icon} aria-hidden=\"true\" />\n {action().label}\n </Button>\n )}\n </Show>\n </ChatContextPanel>\n }\n type=\"button\"\n class={`k2b-chat-context ${props.class ?? \"\"}`}\n data-warning={reported() && (percent() ?? 0) >= 85 ? \"true\" : undefined}\n aria-label={accessibleLabel()}\n >\n <i class=\"ti ti-brain\" aria-hidden=\"true\" />\n <span>{percent() === null ? \"–\" : `${percent()}%`}</span>\n </ChatContextPopup>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -5,15 +5,15 @@ import { effect as _$effect } from "solid-js/web";
|
|
|
5
5
|
import { getNextElement as _$getNextElement } from "solid-js/web";
|
|
6
6
|
import { insert as _$insert } from "solid-js/web";
|
|
7
7
|
var _tmpl$ = /*#__PURE__*/_$template(`<section>`);
|
|
8
|
-
import {
|
|
8
|
+
import { useChatMessages } from "./chat-messages";
|
|
9
9
|
export function ChatRoot(props) {
|
|
10
|
-
const
|
|
10
|
+
const chatMessages = useChatMessages();
|
|
11
11
|
return (() => {
|
|
12
12
|
var _el$ = _$getNextElement(_tmpl$);
|
|
13
13
|
_$insert(_el$, () => props.children);
|
|
14
14
|
_$effect(_p$ => {
|
|
15
15
|
var _v$ = `k2b-chat ${props.class ?? ""}`,
|
|
16
|
-
_v$2 = props.label ??
|
|
16
|
+
_v$2 = props.label ?? chatMessages().chat;
|
|
17
17
|
_v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
|
|
18
18
|
_v$2 !== _p$.t && _$setAttribute(_el$, "aria-label", _p$.t = _v$2);
|
|
19
19
|
return _p$;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["chat/ChatRoot.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport {
|
|
1
|
+
{"version":3,"names":[],"sources":["chat/ChatRoot.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport { useChatMessages } from \"./chat-messages\";\n\nexport type ChatRootProps = {\n children: JSX.Element;\n class?: string;\n label?: string;\n};\n\nexport function ChatRoot(props: ChatRootProps): JSX.Element {\n const chatMessages = useChatMessages();\n return (\n <section class={`k2b-chat ${props.class ?? \"\"}`} aria-label={props.label ?? chatMessages().chat}>\n {props.children}\n </section>\n );\n}\n"],"mappings":";;;;;;;AACA,SAAS,eAAe,QAAQ,iBAAiB;AAQjD,OAAO,SAAS,QAAQ,CAAC,KAAoB,EAAe;EAC1D,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC;EACtC;IAAA;IAAA,qBAEK,KAAK,CAAC,QAAQ;IAAA;MAAA,UADD,YAAY,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE;QAAA,OAAc,KAAK,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI;MAAA;MAAA;MAAA;IAAA;MAAA;MAAA;IAAA;IAAA;EAAA;AAInG","ignoreList":[]}
|
|
@@ -18,13 +18,13 @@ var _tmpl$ = /*#__PURE__*/_$template(`<div class=k2b-chat-timeline__navigation a
|
|
|
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, createMemo, createSignal, For, onCleanup, onMount, Show, untrack } from "solid-js";
|
|
21
|
-
import { useUiMessages } from "../intl/messages";
|
|
22
21
|
import { createScrollFade } from "../layout/scroll-fade";
|
|
23
22
|
import Placeholder from "../surfaces/Placeholder";
|
|
24
23
|
import { ChatActivity, ChatMessage } from "./ChatPrimitives";
|
|
25
24
|
import { isChatNearBottom, restoredChatScrollTop } from "./chat-behavior";
|
|
25
|
+
import { useChatMessages } from "./chat-messages";
|
|
26
26
|
export function ChatTimeline(props) {
|
|
27
|
-
const
|
|
27
|
+
const chatMessages = useChatMessages();
|
|
28
28
|
const [pinned, setPinned] = createSignal(true);
|
|
29
29
|
const [loadingOlderInternally, setLoadingOlderInternally] = createSignal(false);
|
|
30
30
|
const [historyError, setHistoryError] = createSignal(null);
|
|
@@ -92,7 +92,7 @@ export function ChatTimeline(props) {
|
|
|
92
92
|
try {
|
|
93
93
|
prepended = (await props.onLoadOlder()) !== false;
|
|
94
94
|
} catch (error) {
|
|
95
|
-
setHistoryError(error instanceof Error ? error.message :
|
|
95
|
+
setHistoryError(error instanceof Error ? error.message : chatMessages().couldNotLoadOlderMessages);
|
|
96
96
|
} finally {
|
|
97
97
|
setLoadingOlderInternally(false);
|
|
98
98
|
}
|
|
@@ -239,7 +239,7 @@ export function ChatTimeline(props) {
|
|
|
239
239
|
_el$9 = _el$8.nextSibling,
|
|
240
240
|
[_el$0, _co$] = _$getNextMarker(_el$9.nextSibling);
|
|
241
241
|
_el$7.$$click = () => void loadOlder();
|
|
242
|
-
_$insert(_el$7, () =>
|
|
242
|
+
_$insert(_el$7, () => chatMessages().loadOlderMessages, _el$0, _co$);
|
|
243
243
|
_$runHydrationEvents();
|
|
244
244
|
return _el$7;
|
|
245
245
|
}
|
|
@@ -251,7 +251,7 @@ export function ChatTimeline(props) {
|
|
|
251
251
|
get children() {
|
|
252
252
|
return _$createComponent(ChatActivity, {
|
|
253
253
|
get label() {
|
|
254
|
-
return
|
|
254
|
+
return chatMessages().loadingOlderMessages;
|
|
255
255
|
},
|
|
256
256
|
icon: "ti ti-history",
|
|
257
257
|
get trailing() {
|
|
@@ -266,7 +266,7 @@ export function ChatTimeline(props) {
|
|
|
266
266
|
},
|
|
267
267
|
children: message => _$createComponent(ChatActivity, {
|
|
268
268
|
get label() {
|
|
269
|
-
return
|
|
269
|
+
return chatMessages().couldNotLoadOlderMessages;
|
|
270
270
|
},
|
|
271
271
|
get description() {
|
|
272
272
|
return message();
|
|
@@ -277,7 +277,7 @@ export function ChatTimeline(props) {
|
|
|
277
277
|
return (() => {
|
|
278
278
|
var _el$28 = _$getNextElement(_tmpl$7);
|
|
279
279
|
_el$28.$$click = () => void loadOlder();
|
|
280
|
-
_$effect(() => _$setAttribute(_el$28, "aria-label",
|
|
280
|
+
_$effect(() => _$setAttribute(_el$28, "aria-label", chatMessages().retryOlderMessages));
|
|
281
281
|
_$runHydrationEvents();
|
|
282
282
|
return _el$28;
|
|
283
283
|
})();
|
|
@@ -301,7 +301,7 @@ export function ChatTimeline(props) {
|
|
|
301
301
|
return props.loading ? undefined : "ti ti-sparkles";
|
|
302
302
|
},
|
|
303
303
|
get title() {
|
|
304
|
-
return _$memo(() => !!props.loading)() ?
|
|
304
|
+
return _$memo(() => !!props.loading)() ? chatMessages().loadingConversation : props.emptyTitle ?? chatMessages().startConversation;
|
|
305
305
|
},
|
|
306
306
|
get description() {
|
|
307
307
|
return _$memo(() => !!!props.loading)() ? props.emptyDescription : undefined;
|
|
@@ -430,17 +430,17 @@ export function ChatTimeline(props) {
|
|
|
430
430
|
_el$23 = _el$22.nextSibling,
|
|
431
431
|
[_el$24, _co$8] = _$getNextMarker(_el$23.nextSibling);
|
|
432
432
|
_el$21.$$click = scrollToLatest;
|
|
433
|
-
_$insert(_el$21, () =>
|
|
433
|
+
_$insert(_el$21, () => chatMessages().jumpToLatest, _el$24, _co$8);
|
|
434
434
|
_$runHydrationEvents();
|
|
435
435
|
return _el$21;
|
|
436
436
|
}
|
|
437
437
|
}), _el$26, _co$9);
|
|
438
438
|
_$effect(_p$ => {
|
|
439
439
|
var _v$ = `k2b-chat-timeline ${props.class ?? ""}`,
|
|
440
|
-
_v$2 = props.label ??
|
|
440
|
+
_v$2 = props.label ?? chatMessages().conversation,
|
|
441
441
|
_v$3 = props.scrollFade !== false ? "bottom" : undefined,
|
|
442
|
-
_v$4 =
|
|
443
|
-
label: props.label ??
|
|
442
|
+
_v$4 = chatMessages().conversationMessages({
|
|
443
|
+
label: props.label ?? chatMessages().conversation
|
|
444
444
|
}),
|
|
445
445
|
_v$5 = props.loading ? "true" : undefined;
|
|
446
446
|
_v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["chat/ChatTimeline.tsx"],"sourcesContent":["import { createEffect, createMemo, 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 /** Unique within the timeline. A record with a known id updates its row in place instead of replacing it. */\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 /** Unique within the timeline. A record with a known id updates its row in place instead of replacing it. */\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 /** Set while a row the reader toggled settles; the timeline does not follow the end meanwhile. */\n let disclosureHold = 0;\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 itemIds = createMemo(() => props.items.map((item) => item.id), undefined, {\n equals: (previous, next) => previous.length === next.length && previous.every((id, index) => id === next[index]),\n });\n const itemsById = createMemo(() => new Map(props.items.map((item) => [item.id, item])));\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() || disclosureHold !== 0 || 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 // A reader who opens or closes a row reads there. The row stays where it was instead of following the newest message,\n // which would move it away from the pointer; once it has settled, the timeline keeps following only from the end.\n const holdForDisclosure = (event: MouseEvent) => {\n if (!(event.target instanceof Element) || !event.target.closest(\"summary\")) return;\n cancelFollow();\n const hold = ++disclosureHold;\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n if (hold !== disclosureHold) return;\n disclosureHold = 0;\n if (viewportRef && !isChatNearBottom(viewportRef.scrollHeight, viewportRef.scrollTop, viewportRef.clientHeight, threshold()))\n setPinned(false);\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 // Keyboard activation of a row also arrives as a click.\n contentRef?.addEventListener(\"click\", holdForDisclosure);\n\n onCleanup(() => {\n cancelFollow();\n if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);\n resizeObserver?.disconnect();\n historyObserver?.disconnect();\n contentRef?.removeEventListener(\"click\", holdForDisclosure);\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={itemIds()}>\n {(id) => {\n // A row is keyed by its id, so an updated record with the same id keeps its DOM and component state.\n const item = () => itemsById().get(id);\n const message = () => {\n const value = item();\n return value?.kind === \"message\" ? value : undefined;\n };\n const activity = () => {\n const value = item();\n return value?.kind === \"activity\" ? value : undefined;\n };\n return (\n <Show\n when={message() !== undefined}\n fallback={\n <Show when={activity() !== undefined}>\n <ChatActivity\n label={activity()!.label}\n description={activity()!.description}\n icon={activity()!.icon}\n leading={activity()!.leading}\n accent={activity()!.accent}\n tone={activity()!.tone}\n busy={activity()!.busy}\n trailing={activity()!.trailing}\n defaultOpen={activity()!.defaultOpen}\n anchorId={activity()!.anchorId}\n class={activity()!.class}\n >\n {activity()!.content}\n </ChatActivity>\n </Show>\n }\n >\n <ChatMessage\n role={message()!.role}\n label={message()!.label}\n createdAt={message()!.createdAt}\n timeLabel={message()!.timeLabel}\n status={message()!.status}\n attachments={message()!.attachments}\n actions={message()!.actions}\n actionDisplay={message()!.actionDisplay}\n anchorId={message()!.anchorId}\n onActionError={props.onActionError}\n class={message()!.class}\n >\n {message()!.content}\n </ChatMessage>\n </Show>\n );\n }}\n </For>\n </Show>\n </div>\n </div>\n <Show when={!pinned() && hasContent()}>\n <button type=\"button\" class=\"k2b-chat-timeline__latest\" onClick={scrollToLatest}>\n <i class=\"ti ti-arrow-down\" aria-hidden=\"true\" />\n {messages().jumpToLatest}\n </button>\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["chat/ChatTimeline.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, For, type JSX, onCleanup, onMount, Show, untrack } from \"solid-js\";\nimport { createScrollFade } from \"../layout/scroll-fade\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport { ChatActivity, ChatMessage } from \"./ChatPrimitives\";\nimport { isChatNearBottom, restoredChatScrollTop } from \"./chat-behavior\";\nimport { useChatMessages } from \"./chat-messages\";\nimport type { ChatAction, ChatActivityTone, ChatAttachment, ChatMessageStatus, ChatRole } from \"./types\";\n\nexport type ChatMessageItem = {\n kind: \"message\";\n /** Unique within the timeline. A record with a known id updates its row in place instead of replacing it. */\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 /** Unique within the timeline. A record with a known id updates its row in place instead of replacing it. */\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 chatMessages = useChatMessages();\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 /** Set while a row the reader toggled settles; the timeline does not follow the end meanwhile. */\n let disclosureHold = 0;\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 itemIds = createMemo(() => props.items.map((item) => item.id), undefined, {\n equals: (previous, next) => previous.length === next.length && previous.every((id, index) => id === next[index]),\n });\n const itemsById = createMemo(() => new Map(props.items.map((item) => [item.id, item])));\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() || disclosureHold !== 0 || 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 : chatMessages().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 // A reader who opens or closes a row reads there. The row stays where it was instead of following the newest message,\n // which would move it away from the pointer; once it has settled, the timeline keeps following only from the end.\n const holdForDisclosure = (event: MouseEvent) => {\n if (!(event.target instanceof Element) || !event.target.closest(\"summary\")) return;\n cancelFollow();\n const hold = ++disclosureHold;\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n if (hold !== disclosureHold) return;\n disclosureHold = 0;\n if (viewportRef && !isChatNearBottom(viewportRef.scrollHeight, viewportRef.scrollTop, viewportRef.clientHeight, threshold()))\n setPinned(false);\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 // Keyboard activation of a row also arrives as a click.\n contentRef?.addEventListener(\"click\", holdForDisclosure);\n\n onCleanup(() => {\n cancelFollow();\n if (userScrollFrame !== undefined) cancelAnimationFrame(userScrollFrame);\n resizeObserver?.disconnect();\n historyObserver?.disconnect();\n contentRef?.removeEventListener(\"click\", holdForDisclosure);\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 ?? chatMessages().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={chatMessages().conversationMessages({ label: props.label ?? chatMessages().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 {chatMessages().loadOlderMessages}\n </button>\n </Show>\n <Show when={loadingOlder()}>\n <ChatActivity\n label={chatMessages().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={chatMessages().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={chatMessages().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 ? chatMessages().loadingConversation : (props.emptyTitle ?? chatMessages().startConversation)}\n description={!props.loading ? props.emptyDescription : undefined}\n />\n }\n >\n <For each={itemIds()}>\n {(id) => {\n // A row is keyed by its id, so an updated record with the same id keeps its DOM and component state.\n const item = () => itemsById().get(id);\n const message = () => {\n const value = item();\n return value?.kind === \"message\" ? value : undefined;\n };\n const activity = () => {\n const value = item();\n return value?.kind === \"activity\" ? value : undefined;\n };\n return (\n <Show\n when={message() !== undefined}\n fallback={\n <Show when={activity() !== undefined}>\n <ChatActivity\n label={activity()!.label}\n description={activity()!.description}\n icon={activity()!.icon}\n leading={activity()!.leading}\n accent={activity()!.accent}\n tone={activity()!.tone}\n busy={activity()!.busy}\n trailing={activity()!.trailing}\n defaultOpen={activity()!.defaultOpen}\n anchorId={activity()!.anchorId}\n class={activity()!.class}\n >\n {activity()!.content}\n </ChatActivity>\n </Show>\n }\n >\n <ChatMessage\n role={message()!.role}\n label={message()!.label}\n createdAt={message()!.createdAt}\n timeLabel={message()!.timeLabel}\n status={message()!.status}\n attachments={message()!.attachments}\n actions={message()!.actions}\n actionDisplay={message()!.actionDisplay}\n anchorId={message()!.anchorId}\n onActionError={props.onActionError}\n class={message()!.class}\n >\n {message()!.content}\n </ChatMessage>\n </Show>\n );\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 {chatMessages().jumpToLatest}\n </button>\n </Show>\n </section>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|