@k2b/ui 0.21.0 → 0.22.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 +18 -19
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/Chart.js +15 -8
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartExplorer.js +20 -12
- 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 +4 -2
- 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 +68 -59
- 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-messages.js +39 -1
- package/dist/browser/content/calendar-messages.js.map +1 -1
- package/dist/browser/content/calendar-pointer.js +4 -3
- package/dist/browser/content/calendar-pointer.js.map +1 -1
- package/dist/browser/content/chart-messages.js +136 -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/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 -1
- 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 +561 -418
- 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 +370 -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 +743 -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/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 +18 -19
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/Chart.js +12 -5
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartExplorer.js +10 -8
- 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 +4 -2
- 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 +10 -4
- 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-messages.js +39 -1
- package/dist/ssr/content/calendar-messages.js.map +1 -1
- package/dist/ssr/content/calendar-pointer.js +4 -3
- package/dist/ssr/content/calendar-pointer.js.map +1 -1
- package/dist/ssr/content/chart-messages.js +136 -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/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 +203 -96
- 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 +253 -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 +743 -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/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/DataTable.d.ts +2 -0
- package/dist/types/content/FileView.d.ts +0 -10
- package/dist/types/content/calendar-messages.d.ts +20 -1
- package/dist/types/content/chart-messages.d.ts +32 -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/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 +19 -4
- package/dist/types/layout/PageTitle.d.ts +64 -0
- package/dist/types/layout/app-workspace-controller.d.ts +4 -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/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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["chat/ChatComposer.tsx"],"sourcesContent":["import {\n children,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n onCleanup,\n onMount,\n Show,\n untrack,\n} from \"solid-js\";\nimport { Dropdown, type DropdownItem as DropdownItemData } from \"../actions/Dropdown\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { replaceTextareaRange } from \"../inputs/editor-dom\";\nimport {\n completedEmojiShortcode,\n type EmojiIndex,\n emojiInTone,\n emojiName,\n emojiShortcodeQuery,\n loadEmojiIndex,\n suggestEmoji,\n} from \"../inputs/emoji/emoji-index\";\nimport { FileDropTarget } from \"../inputs/FileDropTarget\";\nimport { toggleBulletList, toggleInlineMarker } from \"../inputs/markdown/actions\";\nimport { openCodeFence } from \"../inputs/markdown/code-zone\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useLocale } from \"../intl/locale\";\nimport { type UiMessages, useUiMessages } from \"../intl/messages\";\nimport { ChatContextUsage as ContextUsage } from \"./ChatPrimitives\";\nimport { conversationEnterAction, executeChatAction, nextChatCommandIndex, reportChatFailure, runChatSubmission } from \"./chat-behavior\";\nimport { chatCommandQuery, chatMentionSegments, reconcileChatMentions } from \"./composer-document\";\nimport type {\n ChatAction,\n ChatAttachment,\n ChatComposerEmoji,\n ChatComposerMicrophone,\n ChatComposerState,\n ChatContextUsageData,\n ChatMention,\n ChatModelOption,\n ChatSubmitInput,\n} from \"./types\";\n\nconst composerMaxInputHeight = 309;\n/** Emoji suggestions for a `:shortcode`, as many as fit the list without scrolling on a phone. */\nconst emojiSuggestionLimit = 8;\n// Keep editor undo text within approximately 2 MiB, plus the current edit.\nconst composerUndoBudgetChars = 1_000_000;\n\nexport type ChatCommandContext = {\n setValue: (value: string) => void;\n submit: () => void;\n focus: () => void;\n};\n\nexport type ChatCommand = {\n name: string;\n description: string;\n icon?: string;\n action?: (context: ChatCommandContext) => void | Promise<void>;\n /** Selecting a reference inserts its display name and retains its opaque payload. */\n mention?: ChatAttachment;\n label?: string;\n disabled?: boolean;\n};\n\nexport type ChatFileSelection = {\n onSelect: (files: readonly File[]) => void | Promise<void>;\n /**\n * Chooses files for \"Attach files\" instead of the device's file dialog, for example to offer other sources as well.\n * Called within the menu activation, so it may still open the device's dialog; resolve `[]` when the user cancels.\n * `multiple: false` keeps the first chosen file, and a rejection reaches `onError`.\n */\n choose?: () => Promise<readonly File[]>;\n onError?: (error: unknown) => void;\n accept?: string;\n multiple?: boolean;\n disabled?: boolean;\n label?: string;\n};\n\nexport type ChatPasteHandler = (event: ClipboardEvent & { currentTarget: HTMLTextAreaElement; target: Element }) => void;\n\nexport type ChatComposerProps = {\n value: string;\n onValueChange: (value: string) => void;\n onSubmit: (input: ChatSubmitInput) => boolean | void | Promise<boolean | void>;\n /** Submit intent used for drafts entered while a response is running. Defaults to `steer`. */\n runningSubmitIntent?: \"steer\" | \"queue\";\n onStop?: () => void | Promise<void>;\n onError?: (error: unknown) => void;\n state?: ChatComposerState;\n attachments?: readonly ChatAttachment[];\n onAttachmentsChange?: (attachments: readonly ChatAttachment[]) => void;\n fileSelection?: ChatFileSelection;\n /** Handle non-file clipboard content. Pasted files already use `fileSelection`. */\n onPaste?: ChatPasteHandler;\n menuActions?: readonly ChatAction[];\n models?: readonly ChatModelOption[];\n selectedModelId?: string | null;\n onModelChange?: (modelId: string) => void;\n /** Compact application-owned details immediately after the model selector. */\n modelDetails?: JSX.Element;\n commands?: readonly ChatCommand[];\n searchCommands?: (query: string, signal: AbortSignal) => Promise<readonly ChatCommand[]>;\n mentions?: readonly ChatMention[];\n onMentionsChange?: (mentions: readonly ChatMention[]) => void;\n /** Shared surface above the editor; suggestions temporarily replace this content. */\n accessory?: JSX.Element;\n contextUsage?: ChatContextUsageData;\n contextActions?: readonly ChatAction[];\n /** Optional action inside the context details popup. */\n contextPopupAction?: ChatAction;\n /** Additional compact controls rendered with the add/model controls. */\n footerTools?: JSX.Element;\n /** Compact application controls immediately before the send/stop button. */\n submitTools?: JSX.Element;\n /** Replaces footer controls during an application-owned interaction, preserving the editor. */\n footerContent?: JSX.Element;\n placeholder?: string;\n label?: string;\n inputLabel?: string;\n disabled?: boolean;\n error?: string;\n focusToken?: unknown;\n draftKey?: unknown;\n class?: string;\n /**\n * `\"conversation\"` is the composer for messages between people: one row with attach, a pill-shaped field and Send,\n * without the assistant prompt's footer. The field starts with one line and grows to a third of its nearest size\n * container, a hint line of fixed height sits above it, its buttons keep it focused, and Enter breaks the line\n * inside an open code block and on touch-only devices. The default is the assistant prompt.\n */\n variant?: \"default\" | \"conversation\";\n /** `\"enter\"` (default): Enter sends and Shift+Enter breaks the line. `\"mod-enter\"`: Enter breaks the line. Ctrl/⌘+Enter always sends. */\n sendKey?: \"enter\" | \"mod-enter\";\n /**\n * Adds \"Aa\", which opens one row above the field with Bold, Italic and Bullet list (Ctrl/⌘+B, Ctrl/⌘+I, Ctrl/⌘+Shift+8);\n * the field and its controls stay put. Other Markdown is typed by hand.\n */\n formatting?: boolean;\n /** An emoji button at a fixed place. Touch-only devices hide it; their keyboard has emoji. */\n emoji?: ChatComposerEmoji;\n /** A microphone at a fixed place: a tap dictates, holding it or its menu asks for a voice message. */\n microphone?: ChatComposerMicrophone;\n /** One line above the field. The conversation variant always keeps its height; the default shows it only with content. */\n hint?: JSX.Element;\n};\n\ntype FormatTool = {\n id: string;\n icon: string;\n label: (messages: UiMessages) => string;\n run: (textarea: HTMLTextAreaElement) => void;\n /** Ctrl/⌘ plus this `event.key`. */\n key?: string;\n /** Ctrl/⌘+Shift plus this `event.code`, the physical key, so every keyboard layout agrees. */\n shiftCode?: string;\n};\n\n/** The row stays short: what a chat message needs. Other Markdown, typed by hand, keeps working. */\nconst formatTools: readonly FormatTool[] = [\n { id: \"bold\", icon: \"ti ti-bold\", label: (m) => m.boldShortcut, run: (textarea) => toggleInlineMarker(textarea, \"**\"), key: \"b\" },\n { id: \"italic\", icon: \"ti ti-italic\", label: (m) => m.italicShortcut, run: (textarea) => toggleInlineMarker(textarea, \"*\"), key: \"i\" },\n { id: \"bullet-list\", icon: \"ti ti-list\", label: (m) => m.bulletListShortcut, run: toggleBulletList, shiftCode: \"Digit8\" },\n];\n\nconst formatShortcut = (event: KeyboardEvent): FormatTool | undefined => {\n if (event.altKey || !(event.ctrlKey || event.metaKey)) return undefined;\n return formatTools.find((tool) => (event.shiftKey ? tool.shiftCode === event.code : tool.key === event.key.toLowerCase()));\n};\n\nconst touchOnlyQuery = \"(any-pointer: coarse) and (not (any-pointer: fine))\";\nconst isTouchOnly = () => typeof matchMedia === \"function\" && matchMedia(touchOnlyQuery).matches;\n/** How long a press on the microphone lasts before it asks for a voice message instead of dictation. */\nconst microphoneHoldMs = 500;\n/** Keeps the field focused (and a phone's keyboard open) when a composer button is pressed with a mouse or finger. */\nconst keepFieldFocus = (event: MouseEvent) => event.preventDefault();\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 hasContent = (items: unknown[]) => items.some((item) => item != null && typeof item !== \"boolean\" && item !== \"\");\n\nexport function ChatComposer(props: ChatComposerProps): JSX.Element {\n const accessory = children(() => props.accessory);\n const hasAccessory = () => hasContent(accessory.toArray());\n const hint = children(() => props.hint);\n const messages = useUiMessages();\n const commandListId = `k2b-chat-commands-${createUniqueId().replace(/[^A-Za-z0-9_-]/g, \"-\")}`;\n const formatGroupId = `${commandListId}-format`;\n const [selectedCommandIndex, setSelectedCommandIndex] = createSignal(0);\n const [addingFiles, setAddingFiles] = createSignal(false);\n const [submitting, setSubmitting] = createSignal(false);\n let composerRef: HTMLElement | undefined;\n let textareaRef: HTMLTextAreaElement | undefined;\n let fileInputRef: HTMLInputElement | undefined;\n let measureRef: HTMLTextAreaElement | undefined;\n let microphoneRef: HTMLDivElement | undefined;\n let sawRunning = props.state === \"running\";\n const conversation = () => props.variant === \"conversation\";\n const [formattingOpen, setFormattingOpen] = createSignal(false);\n const [microphoneMenuOpen, setMicrophoneMenuOpen] = createSignal(false);\n const dictation = () => props.microphone?.dictation ?? null;\n const showHint = () => conversation() || dictation() !== null || hasContent(hint.toArray());\n\n const state = () => props.state ?? \"idle\";\n const running = () => state() === \"running\";\n const stopping = () => state() === \"stopping\";\n const runningSubmitIntent = () => props.runningSubmitIntent ?? \"steer\";\n const attachments = () => props.attachments ?? [];\n const [caret, setCaret] = createSignal(0);\n const [selectionEnd, setSelectionEnd] = createSignal(0);\n const [dismissed, setDismissed] = createSignal(false);\n const [composing, setComposing] = createSignal(false);\n const [searchResults, setSearchResults] = createSignal<readonly ChatCommand[]>([]);\n const [searching, setSearching] = createSignal(false);\n const [searchError, setSearchError] = createSignal(false);\n const [executing, setExecuting] = createSignal(false);\n let highlightRef: HTMLDivElement | undefined;\n let commandListRef: HTMLDivElement | undefined;\n const mentions = () => props.mentions ?? [];\n const locale = useLocale();\n const [emojiIndex, setEmojiIndex] = createSignal<EmojiIndex>();\n const emojiQuery = createMemo(() =>\n !props.emoji || dismissed() || composing() ? null : emojiShortcodeQuery(props.value, caret(), selectionEnd()),\n );\n // The emoji data loads with the first `:shortcode`; a failed load only means no suggestions.\n createEffect(() => {\n if (emojiQuery() && !emojiIndex()) loadEmojiIndex().then(setEmojiIndex, () => undefined);\n });\n const emojiMatches = createMemo(() => {\n const token = emojiQuery();\n const index = emojiIndex();\n return token && index ? suggestEmoji(index, token.query, emojiSuggestionLimit) : [];\n });\n const emojiOpen = () => emojiMatches().length > 0;\n const commandQuery = createMemo(() => (dismissed() || composing() ? null : chatCommandQuery(props.value, caret(), selectionEnd())));\n const commandMatches = createMemo(() => {\n const token = commandQuery();\n if (!token) return [];\n return [\n ...(props.commands ?? []).filter((command) => command.name.toLowerCase().includes(token.query.toLowerCase())),\n ...searchResults(),\n ];\n });\n const commandsOpen = () => Boolean(!emojiOpen() && commandQuery() && (props.commands?.length || props.searchCommands));\n const suggestionsOpen = () => commandsOpen() || emojiOpen();\n createEffect(() => {\n if (!suggestionsOpen()) return;\n let disposed = false;\n const measure = () => {\n if (disposed || !commandListRef) return;\n let top = window.visualViewport?.offsetTop ?? 0;\n for (let parent = commandListRef.parentElement; parent; parent = parent.parentElement) {\n if (/(auto|scroll|hidden|clip)/.test(window.getComputedStyle(parent).overflowY)) {\n top = Math.max(top, parent.getBoundingClientRect().top);\n }\n }\n const bottom = commandListRef.parentElement!.getBoundingClientRect().bottom;\n commandListRef.style.setProperty(\"--k2b-chat-command-space\", `${Math.max(40, bottom - top - 8)}px`);\n };\n queueMicrotask(measure);\n window.addEventListener(\"resize\", measure);\n window.addEventListener(\"scroll\", measure, true);\n window.visualViewport?.addEventListener(\"resize\", measure);\n onCleanup(() => {\n disposed = true;\n window.removeEventListener(\"resize\", measure);\n window.removeEventListener(\"scroll\", measure, true);\n window.visualViewport?.removeEventListener(\"resize\", measure);\n });\n });\n createEffect(() => {\n const token = commandQuery();\n setSearchResults([]);\n setSearchError(false);\n if (!token || !props.searchCommands) {\n setSearching(false);\n return;\n }\n const abort = new AbortController();\n setSearching(true);\n const timer = setTimeout(() => {\n Promise.resolve(props.searchCommands!(token.query, abort.signal))\n .then((results) => {\n if (!abort.signal.aborted) setSearchResults(results);\n })\n .catch(() => {\n if (!abort.signal.aborted) setSearchError(true);\n })\n .finally(() => {\n if (!abort.signal.aborted) setSearching(false);\n });\n }, 120);\n onCleanup(() => {\n clearTimeout(timer);\n abort.abort();\n });\n });\n const history: { value: string; mentions: readonly ChatMention[]; caret: number }[] = [];\n let historyIndex = -1;\n createEffect(() => {\n props.draftKey;\n untrack(() => {\n history.length = 0;\n historyIndex = -1;\n setDismissed(true);\n });\n });\n const snapshot = () => ({ value: props.value, mentions: [...mentions()], caret: textareaRef?.selectionStart ?? 0 });\n const sameMentions = (a: readonly ChatMention[], b: readonly ChatMention[]) =>\n a.length === b.length &&\n a.every((item, index) => item.start === b[index]?.start && item.end === b[index]?.end && item.attachment === b[index]?.attachment);\n const record = () => {\n if (history[historyIndex]?.value !== props.value || !sameMentions(history[historyIndex]?.mentions ?? [], mentions())) {\n history.splice(historyIndex + 1);\n history.push(snapshot());\n let size = history.reduce((total, entry) => total + entry.value.length, 0);\n while (history.length > 2 && size > composerUndoBudgetChars) size -= history.shift()!.value.length;\n historyIndex = history.length - 1;\n }\n };\n const edit = (value: string, nextMentions = reconcileChatMentions(props.value, value, mentions())) => {\n record();\n props.onValueChange(value);\n props.onMentionsChange?.(nextMentions);\n record();\n setDismissed(false);\n };\n const restoreHistory = (direction: -1 | 1) => {\n record();\n const next = history[historyIndex + direction];\n if (!next) return;\n historyIndex += direction;\n props.onValueChange(next.value);\n props.onMentionsChange?.(next.mentions);\n queueMicrotask(() => {\n textareaRef?.setSelectionRange(next.caret, next.caret);\n syncCaret();\n });\n };\n const syncCaret = () => {\n setCaret(textareaRef?.selectionStart ?? props.value.length);\n setSelectionEnd(textareaRef?.selectionEnd ?? props.value.length);\n };\n const selectedCommand = () => commandMatches()[selectedCommandIndex()];\n const busy = () => Boolean(props.disabled || stopping() || state() === \"submitting\" || executing() || addingFiles());\n const blocked = () => busy() || submitting();\n /** The conversation field stays editable while a message is sent, so it keeps the focus and a phone its keyboard. */\n const editBlocked = () => (conversation() ? busy() : blocked());\n const hasDraft = () => Boolean(props.value.trim() || (!running() && attachments().length > 0));\n const canSubmit = () => !blocked() && hasDraft() && !(running() && runningSubmitIntent() === \"steer\" && mentions().length);\n const canSelectFiles = () => Boolean(props.fileSelection && !props.fileSelection.disabled && !running() && !blocked());\n const hasAddMenu = () => Boolean(props.fileSelection || props.menuActions?.length);\n const hasContextUsage = () => {\n if (props.contextPopupAction) return true;\n const context = props.contextUsage;\n if (!context || typeof context.contextWindow !== \"number\" || !Number.isFinite(context.contextWindow) || context.contextWindow <= 0) {\n return false;\n }\n return [context.usage?.total, context.usage?.input, context.usage?.output].some(\n (value) => typeof value === \"number\" && Number.isFinite(value) && value >= 0,\n );\n };\n\n const menuItems = (): readonly DropdownItemData[] => {\n const items: DropdownItemData[] = [];\n if (props.fileSelection) {\n items.push({\n icon: addingFiles() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-paperclip\",\n label: props.fileSelection.label ?? messages().attachFiles,\n disabled: !canSelectFiles(),\n action: () => chooseFiles(),\n });\n }\n for (const action of props.menuActions ?? []) {\n items.push({\n icon: action.icon,\n label: action.label,\n variant: action.variant,\n disabled: action.disabled,\n action: () => reportChatFailure(() => executeChatAction(action), props.onError),\n });\n }\n return items;\n };\n\n const autoResize = () => {\n if (!textareaRef) return;\n if (conversation()) {\n // A hidden copy measures the text. Collapsing the field itself would shrink the composer for a frame, and\n // WebKit then clamps the scroll position of the conversation above it. CSS caps the height.\n if (!measureRef) return;\n measureRef.value = textareaRef.value;\n textareaRef.style.height = `${measureRef.scrollHeight}px`;\n return;\n }\n textareaRef.style.height = \"auto\";\n textareaRef.style.height = `${Math.min(textareaRef.scrollHeight, composerMaxInputHeight)}px`;\n };\n\n const focus = () => textareaRef?.focus();\n\n onMount(() => {\n autoResize();\n if (props.focusToken !== undefined) focus();\n // The copy follows the field's width, so a narrower composer measures more lines.\n if (measureRef && typeof ResizeObserver === \"function\") {\n const observer = new ResizeObserver(() => autoResize());\n observer.observe(measureRef);\n onCleanup(() => observer.disconnect());\n }\n });\n\n createEffect(() => {\n commandMatches();\n emojiMatches();\n setSelectedCommandIndex(0);\n });\n\n createEffect(() => {\n const index = selectedCommandIndex();\n commandMatches();\n emojiMatches();\n queueMicrotask(() => {\n const list = commandListRef;\n const item = list?.querySelector<HTMLElement>(`[id=\"${commandListId}-${index}\"]`);\n if (!list || !item?.isConnected) return;\n if (item.offsetTop < list.scrollTop) list.scrollTop = item.offsetTop;\n else if (item.offsetTop + item.offsetHeight > list.scrollTop + list.clientHeight) {\n list.scrollTop = item.offsetTop + item.offsetHeight - list.clientHeight;\n }\n });\n });\n\n createEffect(() => {\n props.value;\n queueMicrotask(autoResize);\n });\n\n createEffect(() => {\n props.focusToken;\n if (props.focusToken !== undefined) queueMicrotask(focus);\n });\n\n createEffect(() => {\n const active = running();\n if (sawRunning && !active && !props.disabled && typeof document !== \"undefined\") {\n const focused = document.activeElement as HTMLElement | null;\n const insideComposer = Boolean(focused && composerRef?.contains(focused));\n const editingElsewhere = Boolean(\n focused &&\n focused !== document.body &&\n !insideComposer &&\n (focused.matches(\"input, textarea, select\") || focused.isContentEditable || focused.closest(\"[role='dialog'], [popover]\")),\n );\n if (!editingElsewhere) queueMicrotask(focus);\n }\n sawRunning = active;\n });\n\n const setAttachments = (next: readonly ChatAttachment[]) => props.onAttachmentsChange?.(next);\n\n const renderAttachmentCopy = (attachment: ChatAttachment) => (\n <span>\n <strong title={attachment.name}>{attachment.name}</strong>\n </span>\n );\n\n const chooseFiles = () => {\n const selection = props.fileSelection;\n if (!selection?.choose) return fileInputRef?.click();\n selection.choose().then(\n // A single-file composer keeps the first chosen file, as its file dialog and drops do.\n (files) => void runFiles(selection.multiple === false ? files.slice(0, 1) : files),\n (error: unknown) => (props.fileSelection?.onError ?? props.onError)?.(error),\n );\n };\n\n const runFiles = async (files: FileList | readonly File[]) => {\n if (!canSelectFiles()) return;\n const selected = Array.from(files);\n if (selected.length === 0) return;\n setAddingFiles(true);\n try {\n await props.fileSelection?.onSelect(selected);\n } catch (error) {\n (props.fileSelection?.onError ?? props.onError)?.(error);\n } finally {\n setAddingFiles(false);\n if (fileInputRef) fileInputRef.value = \"\";\n queueMicrotask(focus);\n }\n };\n\n const submit = async () => {\n if (!canSubmit()) return;\n const intent = running() ? runningSubmitIntent() : \"send\";\n const previousValue = props.value;\n const previousAttachments = attachments();\n const previousMentions = mentions();\n const input: ChatSubmitInput = {\n intent,\n text: previousValue,\n mentions: previousMentions,\n attachments: intent !== \"steer\" ? previousAttachments : [],\n };\n\n setSubmitting(true);\n try {\n await runChatSubmission({\n clear: () => {\n props.onValueChange(\"\");\n props.onMentionsChange?.([]);\n if (intent !== \"steer\") setAttachments([]);\n },\n perform: () => props.onSubmit(input),\n restore: () => {\n // Text typed while the submission ran stays, after the returned draft. Its mentions are read first, because\n // an application may already move them when the text changes.\n const typed = props.value;\n const typedMentions = mentions();\n const shift = previousValue.length + 1;\n props.onValueChange(typed ? `${previousValue}\\n${typed}` : previousValue);\n props.onMentionsChange?.(\n typed\n ? [\n ...previousMentions,\n ...typedMentions.map((mention) => ({ ...mention, start: mention.start + shift, end: mention.end + shift })),\n ]\n : previousMentions,\n );\n if (intent !== \"steer\") setAttachments(previousAttachments);\n },\n onError: props.onError,\n });\n } finally {\n setSubmitting(false);\n queueMicrotask(() => {\n autoResize();\n focus();\n });\n }\n };\n\n const executeCommand = async (command: ChatCommand) => {\n const token = commandQuery();\n if (!token || command.disabled || blocked()) return;\n const previous = snapshot();\n const key = props.draftKey;\n const replacement = command.mention ? command.mention.name + \" \" : \"\";\n const nextValue = props.value.slice(0, token.start) + replacement + props.value.slice(token.end);\n const nextMentions = reconcileChatMentions(props.value, nextValue, mentions());\n if (command.mention)\n nextMentions.push({ start: token.start, end: token.start + command.mention.name.length, attachment: command.mention });\n edit(nextValue, nextMentions);\n setDismissed(true);\n setExecuting(true);\n let submitRequested = false;\n try {\n await command.action?.({\n setValue: (value) => edit(value),\n submit: () => {\n submitRequested = true;\n },\n focus,\n });\n } catch (error) {\n submitRequested = false;\n if (props.draftKey === key && props.value === nextValue) {\n props.onValueChange(previous.value);\n props.onMentionsChange?.(previous.mentions);\n }\n props.onError?.(error);\n } finally {\n setExecuting(false);\n }\n if (submitRequested && props.draftKey === key) await submit();\n queueMicrotask(() => {\n if (props.draftKey !== key) return;\n textareaRef?.setSelectionRange(token.start + replacement.length, token.start + replacement.length);\n syncCaret();\n autoResize();\n focus();\n });\n };\n\n /** Replaces `start`–`end` with the emoji through the editing path, so the browser's undo restores the shortcode. */\n const insertEmoji = (start: number, end: number, emoji: string) => {\n if (!textareaRef || editBlocked()) return;\n replaceTextareaRange(textareaRef, start, end, emoji);\n syncCaret();\n reportChatFailure(() => props.emoji?.onPick?.(emoji), props.onError);\n };\n const pickEmojiSuggestion = (position: number) => {\n const token = emojiQuery();\n const entry = emojiMatches()[position];\n if (!token || !entry) return;\n insertEmoji(token.start, token.end, emojiInTone(entry, props.emoji?.skinTone ?? 0));\n };\n /**\n * A typed colon loads the emoji data, and the closing colon of a known `:shortcode:` turns it into its emoji. A\n * shortcode closed before the data arrived turns when it arrives, as long as nothing changed in the meantime.\n */\n const completeShortcode = () => {\n const textarea = textareaRef;\n if (!props.emoji || !textarea) return;\n const { value, selectionStart: caret } = textarea;\n const completed = completedEmojiShortcode(value, caret);\n const convert = (index: EmojiIndex) => {\n const entry = completed && index.byShortcode.get(completed.shortcode.toLowerCase());\n if (completed && entry) insertEmoji(completed.start, completed.end, emojiInTone(entry, props.emoji?.skinTone ?? 0));\n };\n const index = emojiIndex();\n if (index) {\n convert(index);\n return;\n }\n loadEmojiIndex().then(\n (loaded) => {\n setEmojiIndex(loaded);\n const untouched = textarea.value === value && textarea.selectionStart === caret && textarea.selectionEnd === caret;\n if (untouched && textarea.matches(\":focus\")) convert(loaded);\n },\n () => undefined,\n );\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n // WebKit ends the composition before the keydown of the Enter that confirms it; that keydown keeps keyCode 229.\n if (event.isComposing || event.keyCode === 229 || composing()) return;\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === \"z\") {\n event.preventDefault();\n restoreHistory(event.shiftKey ? 1 : -1);\n return;\n }\n if (emojiOpen()) {\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n setSelectedCommandIndex((index) => nextChatCommandIndex(index, emojiMatches().length, event.key === \"ArrowUp\" ? -1 : 1));\n return;\n }\n // Only a plain Enter or Tab picks: Shift+Enter still breaks the line, Shift+Tab still moves the focus back.\n const plain = !event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey;\n if (plain && (event.key === \"Enter\" || event.key === \"Tab\")) {\n event.preventDefault();\n pickEmojiSuggestion(selectedCommandIndex());\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n setDismissed(true);\n return;\n }\n }\n const matches = commandMatches();\n if (commandsOpen()) {\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n setSelectedCommandIndex((index) => nextChatCommandIndex(index, matches.length, event.key === \"ArrowUp\" ? -1 : 1));\n return;\n }\n // Ctrl/⌘+Enter sends, also while suggestions are open.\n if ((event.key === \"Tab\" || (event.key === \"Enter\" && !event.ctrlKey && !event.metaKey)) && matches.length > 0) {\n event.preventDefault();\n const command = selectedCommand();\n if (command) void executeCommand(command);\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n setDismissed(true);\n return;\n }\n }\n const format = props.formatting && textareaRef ? formatShortcut(event) : undefined;\n if (format && textareaRef) {\n event.preventDefault();\n format.run(textareaRef);\n return;\n }\n if (event.key !== \"Enter\") return;\n if (conversation()) {\n const action = conversationEnterAction(event, {\n sendKey: props.sendKey ?? \"enter\",\n touchOnly: isTouchOnly(),\n inCodeBlock: openCodeFence(props.value, textareaRef?.selectionStart ?? props.value.length) !== null,\n });\n if (action === \"send\") {\n event.preventDefault();\n void submit();\n }\n return;\n }\n const send = props.sendKey === \"mod-enter\" ? event.ctrlKey || event.metaKey : !event.shiftKey;\n if (send && !event.isComposing) {\n event.preventDefault();\n void submit();\n }\n };\n\n const insertText = (text: string) => {\n if (!textareaRef || editBlocked()) return;\n replaceTextareaRange(textareaRef, textareaRef.selectionStart, textareaRef.selectionEnd, text);\n };\n\n let holdTimer: ReturnType<typeof setTimeout> | undefined;\n let held = false;\n const releaseHold = () => {\n clearTimeout(holdTimer);\n holdTimer = undefined;\n };\n onCleanup(releaseHold);\n const microphoneDisabled = () => Boolean(props.microphone?.disabled || blocked() || dictation() === \"refining\");\n const microphoneItems = (): readonly DropdownItemData[] => {\n const microphone = props.microphone;\n const items: DropdownItemData[] = [];\n if (microphone?.onDictate) {\n const dictate = microphone.onDictate;\n items.push({ icon: \"ti ti-microphone\", label: messages().dictate, action: () => reportChatFailure(dictate, props.onError) });\n }\n if (microphone?.onVoiceMessage) {\n const record = microphone.onVoiceMessage;\n items.push({\n icon: \"ti ti-player-record\",\n label: messages().recordVoiceMessage,\n action: () => reportChatFailure(record, props.onError),\n });\n }\n return items;\n };\n const dictationStatus = (): { icon: string; text: string } | null => {\n switch (dictation()) {\n case \"listening\":\n return { icon: \"ti ti-microphone\", text: messages().dictationListening };\n case \"refining\":\n return { icon: \"ti ti-loader-2 k2b-spin\", text: messages().dictationRefining };\n case \"refined\":\n return { icon: \"ti ti-sparkles\", text: messages().dictationRefined };\n case \"unrefined\":\n return { icon: \"ti ti-microphone\", text: messages().dictationUnrefined };\n case \"interrupted\":\n return { icon: \"ti ti-alert-triangle\", text: messages().dictationInterrupted };\n default:\n return null;\n }\n };\n\n const fileInput = () => (\n <Show when={props.fileSelection}>\n <input\n ref={fileInputRef}\n class=\"k2b-sr-only\"\n type=\"file\"\n tabIndex={-1}\n aria-hidden=\"true\"\n accept={props.fileSelection?.accept}\n multiple={props.fileSelection?.multiple ?? true}\n onChange={(event) => {\n if (event.currentTarget.files?.length) void runFiles(event.currentTarget.files);\n }}\n />\n </Show>\n );\n\n const addMenu = (icon: string, extraClass = \"\") => (\n <Dropdown.Root position=\"top-right\" label={messages().addToChat} items={menuItems()} disabled={blocked()}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class={`k2b-chat-composer__icon-action${extraClass}`}\n label={messages().addToChat}\n tooltip={messages().addToChat}\n >\n <i class={icon} aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n );\n\n /** The conversation's attach button opens the file choice directly; other actions turn it into the add menu. */\n const attachControl = () => (\n <Show\n when={props.menuActions?.length}\n fallback={\n <Show when={props.fileSelection}>\n {(selection) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__attach\"\n aria-label={selection().label ?? messages().attachFiles}\n content={selection().label ?? messages().attachFiles}\n disabled={!canSelectFiles()}\n onClick={chooseFiles}\n >\n <i class={addingFiles() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-plus\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </Show>\n }\n >\n {addMenu(\"ti ti-plus\", \" k2b-chat-composer__attach\")}\n </Show>\n );\n\n const formatToggle = () => (\n <Show when={props.formatting}>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__format-toggle\"\n aria-label={messages().composerFormatting}\n aria-pressed={formattingOpen()}\n aria-controls={formattingOpen() ? formatGroupId : undefined}\n content={messages().composerFormatting}\n onMouseDown={keepFieldFocus}\n onClick={() => setFormattingOpen((open) => !open)}\n >\n <i class=\"ti ti-letter-case\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n );\n\n /** One row of fixed height. It shows every button at once, also on a phone, so nothing hides behind a scroll. */\n const formatRow = () => (\n <Show when={props.formatting && formattingOpen()}>\n <div id={formatGroupId} class=\"k2b-chat-composer__format\" role=\"group\" aria-label={messages().composerFormatting}>\n <For each={formatTools}>\n {(tool) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action\"\n aria-label={tool.label(messages())}\n content={tool.label(messages())}\n disabled={editBlocked()}\n onMouseDown={keepFieldFocus}\n onClick={() => {\n if (textareaRef) tool.run(textareaRef);\n }}\n >\n <i class={tool.icon} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </For>\n </div>\n </Show>\n );\n\n const emojiButton = () => (\n <Show when={props.emoji}>\n {(emoji) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__emoji\"\n aria-label={messages().insertEmoji}\n content={messages().insertEmoji}\n disabled={editBlocked()}\n onMouseDown={keepFieldFocus}\n onClick={(event) => {\n const anchor = event.currentTarget;\n reportChatFailure(() => emoji().onOpen({ anchor, insert: insertText }), props.onError);\n }}\n >\n <i class=\"ti ti-mood-smile\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </Show>\n );\n\n const microphoneControl = () => (\n <Show when={props.microphone?.onDictate || props.microphone?.onVoiceMessage ? props.microphone : undefined}>\n {(microphone) => (\n <div ref={microphoneRef} class=\"k2b-chat-composer__microphone\">\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__microphone-button\"\n data-state={dictation() ?? undefined}\n disabled={microphoneDisabled()}\n aria-pressed={microphone().onDictate ? dictation() === \"listening\" : undefined}\n aria-haspopup={microphone().onDictate ? undefined : \"menu\"}\n aria-expanded={microphone().onDictate ? undefined : microphoneMenuOpen()}\n // A toggle keeps its name; the pressed state says that dictation runs.\n aria-label={microphone().onDictate ? messages().dictate : messages().recordVoiceMessage}\n content={\n dictation() === \"listening\"\n ? messages().stopDictation\n : microphone().onDictate\n ? microphone().onVoiceMessage\n ? messages().dictateOrHold\n : messages().dictate\n : messages().recordVoiceMessage\n }\n onMouseDown={keepFieldFocus}\n onContextMenu={(event) => event.preventDefault()}\n onPointerDown={(event) => {\n held = false;\n releaseHold();\n const record = microphone().onVoiceMessage;\n if (event.button !== 0 || !record || dictation() === \"listening\") return;\n holdTimer = setTimeout(() => {\n // The composer may have become blocked, or recording withdrawn, during the press.\n const current = props.microphone?.onVoiceMessage;\n if (!current || microphoneDisabled()) return;\n held = true;\n reportChatFailure(current, props.onError);\n }, microphoneHoldMs);\n }}\n onPointerUp={releaseHold}\n onPointerCancel={releaseHold}\n onPointerLeave={releaseHold}\n onClick={(event) => {\n // A press that already asked for a voice message ends here; a key press never holds.\n if (held) {\n held = false;\n if (event.detail > 0) return;\n }\n const dictate = microphone().onDictate;\n if (dictate) {\n reportChatFailure(dictate, props.onError);\n return;\n }\n setMicrophoneMenuOpen(true);\n // From the keyboard it opens the menu like a menu button: the focus moves to the first item.\n if (event.detail === 0) {\n queueMicrotask(() => microphoneRef?.querySelector<HTMLElement>('[role=\"menuitem\"]:not(:disabled)')?.focus());\n }\n }}\n >\n <i\n class={\n dictation() === \"listening\"\n ? \"ti ti-player-stop\"\n : dictation() === \"refining\"\n ? \"ti ti-loader-2 k2b-spin\"\n : \"ti ti-microphone\"\n }\n aria-hidden=\"true\"\n />\n </Tooltip.Trigger>\n <Show when={microphone().onVoiceMessage}>\n <Dropdown.Root\n position=\"top-left\"\n label={messages().microphoneOptions}\n items={microphoneItems()}\n disabled={microphoneDisabled()}\n open={microphoneMenuOpen()}\n onOpenChange={setMicrophoneMenuOpen}\n >\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__microphone-menu\"\n label={messages().microphoneOptions}\n tooltip={messages().microphoneOptions}\n >\n <i class=\"ti ti-chevron-up\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </div>\n )}\n </Show>\n );\n\n const sendControl = () => (\n <Show\n when={running() && !hasDraft() && props.onStop}\n fallback={\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__send\"\n disabled={!canSubmit()}\n onMouseDown={(event) => {\n if (conversation()) keepFieldFocus(event);\n }}\n aria-label={\n submitting()\n ? running()\n ? runningSubmitIntent() === \"queue\"\n ? messages().queueing\n : messages().steering\n : messages().sending\n : running()\n ? runningSubmitIntent() === \"queue\"\n ? messages().queueMessage\n : messages().steerResponse\n : messages().sendMessage\n }\n content={\n running() ? (runningSubmitIntent() === \"queue\" ? messages().queueMessage : messages().steerResponse) : messages().sendMessage\n }\n onClick={() => void submit()}\n >\n <i class={submitting() ? \"ti ti-loader-2 k2b-spin\" : conversation() ? \"ti ti-send\" : \"ti ti-arrow-up\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n }\n >\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__stop\"\n disabled={stopping()}\n aria-label={stopping() ? messages().stopping : messages().stopResponse}\n content={messages().stopResponse}\n onClick={() => reportChatFailure(() => props.onStop?.(), props.onError)}\n >\n <i class={stopping() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-player-stop\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n );\n\n const field = () => (\n <div class=\"k2b-chat-composer__input\" role=\"group\" aria-label={messages().messageInput}>\n <Show when={mentions().length > 0}>\n <div ref={highlightRef} class=\"k2b-chat-composer__highlight\" aria-hidden=\"true\">\n <For each={chatMentionSegments(props.value, mentions())}>\n {(part) => <span classList={{ \"k2b-chat-composer__mention\": Boolean(part.mention) }}>{part.text}</span>}\n </For>\n {\"\\n\"}\n </div>\n </Show>\n {/* biome-ignore lint/a11y/useAriaPropsSupportedByRole: popup attributes are conditional with the combobox role */}\n <textarea\n ref={textareaRef}\n classList={{ \"k2b-chat-composer__textarea--highlighted\": mentions().length > 0 }}\n rows={1}\n value={props.value}\n disabled={editBlocked()}\n enterkeyhint={conversation() ? \"enter\" : undefined}\n placeholder={\n props.placeholder ??\n (running() ? messages().addGuidance : conversation() ? messages().writeConversationMessage : messages().writeMessage)\n }\n aria-label={props.inputLabel ?? messages().message}\n role={suggestionsOpen() ? \"combobox\" : undefined}\n aria-autocomplete={suggestionsOpen() ? \"list\" : undefined}\n aria-controls={suggestionsOpen() ? commandListId : undefined}\n aria-expanded={suggestionsOpen() ? \"true\" : undefined}\n aria-activedescendant={\n (emojiOpen() ? emojiMatches()[selectedCommandIndex()] : selectedCommand())\n ? `${commandListId}-${selectedCommandIndex()}`\n : undefined\n }\n onInput={(event) => {\n edit(event.currentTarget.value);\n syncCaret();\n autoResize();\n const input = event as InputEvent;\n if (input.inputType === \"insertText\" && input.data === \":\") queueMicrotask(completeShortcode);\n }}\n onPaste={(event) => {\n const clipboardData = event.clipboardData;\n if (canSelectFiles() && clipboardData?.files.length) {\n event.preventDefault();\n void runFiles(clipboardData.files);\n return;\n }\n props.onPaste?.(event);\n }}\n onSelect={syncCaret}\n onBlur={() => setDismissed(true)}\n onClick={() => {\n setDismissed(false);\n syncCaret();\n }}\n onKeyUp={syncCaret}\n onCompositionStart={() => setComposing(true)}\n onCompositionEnd={() => {\n setComposing(false);\n syncCaret();\n }}\n onScroll={() => {\n if (highlightRef && textareaRef) highlightRef.scrollTop = textareaRef.scrollTop;\n }}\n onBeforeInput={(event) => {\n if (event.inputType === \"historyUndo\" || event.inputType === \"historyRedo\") {\n event.preventDefault();\n restoreHistory(event.inputType === \"historyUndo\" ? -1 : 1);\n }\n }}\n onKeyDown={onKeyDown}\n />\n <Show when={conversation()}>\n <textarea ref={measureRef} class=\"k2b-chat-composer__measure\" rows={1} tabIndex={-1} aria-hidden=\"true\" readOnly />\n </Show>\n </div>\n );\n\n return (\n <div class=\"k2b-chat-composer-shell\">\n <Show when={suggestionsOpen() || hasAccessory()}>\n {/* Suggestions alone float above the composer; a row of the shell's grid would add its gap and move the composer. */}\n <div class=\"k2b-chat-composer-slot\" data-overlay={hasAccessory() ? undefined : \"true\"}>\n <div style={{ visibility: suggestionsOpen() ? \"hidden\" : undefined }} inert={suggestionsOpen()}>\n {accessory()}\n </div>\n <Show when={emojiOpen()}>\n <div class=\"k2b-chat-composer-accessory\">\n <div\n ref={commandListRef}\n id={commandListId}\n class=\"k2b-chat-composer__commands\"\n role=\"listbox\"\n aria-label={messages().emojiSuggestions}\n >\n <For each={emojiMatches()}>\n {(entry, index) => (\n <button\n id={`${commandListId}-${index()}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={index() === selectedCommandIndex()}\n aria-label={emojiName(entry, locale())}\n data-active={index() === selectedCommandIndex() ? \"true\" : undefined}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => pickEmojiSuggestion(index())}\n >\n <span class=\"k2b-chat-composer__emoji-glyph\" aria-hidden=\"true\">\n {emojiInTone(entry, props.emoji?.skinTone ?? 0)}\n </span>\n <strong>{emojiName(entry, locale())}</strong>\n <Show when={entry.shortcodes[0]}>{(code) => <small>:{code()}:</small>}</Show>\n </button>\n )}\n </For>\n </div>\n </div>\n </Show>\n <Show when={commandsOpen()}>\n <div class=\"k2b-chat-composer-accessory\">\n <div\n ref={commandListRef}\n id={commandListId}\n class=\"k2b-chat-composer__commands\"\n role=\"listbox\"\n aria-label={messages().commands}\n >\n <For each={commandMatches()}>\n {(command, index) => (\n <button\n id={`${commandListId}-${index()}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={index() === selectedCommandIndex()}\n aria-disabled={command.disabled}\n data-active={index() === selectedCommandIndex() ? \"true\" : undefined}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => void executeCommand(command)}\n >\n <i class={command.icon ?? \"ti ti-slash\"} aria-hidden=\"true\" />\n <strong>{command.label ?? `/${command.name}`}</strong>\n <small>{command.description}</small>\n </button>\n )}\n </For>\n <Show when={searching()}>\n <div role=\"status\" class=\"k2b-chat-composer__loading\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n <strong>{messages().loading}</strong>\n </div>\n </Show>\n <Show when={searchError()}>\n <div role=\"status\">\n <i class=\"ti ti-alert-circle\" /> {messages().error}\n </div>\n </Show>\n <Show when={!searching() && !searchError() && commandMatches().length === 0}>\n <div role=\"status\">{messages().noResults}</div>\n </Show>\n </div>\n </div>\n </Show>\n </div>\n </Show>\n <section\n ref={composerRef}\n class={`k2b-chat-composer ${props.class ?? \"\"}`}\n data-running={running() ? \"true\" : undefined}\n data-variant={conversation() ? \"conversation\" : undefined}\n role=\"group\"\n aria-label={props.label ?? messages().messageComposer}\n >\n <Show when={showHint()}>\n <div class=\"k2b-chat-composer__hint\" aria-live=\"polite\">\n <Show when={dictationStatus()} fallback={<span class=\"k2b-chat-composer__hint-text\">{hint()}</span>}>\n {(status) => (\n <>\n <span class=\"k2b-chat-composer__dictation\" data-state={dictation() ?? undefined}>\n <i class={status().icon} aria-hidden=\"true\" />\n <span>{status().text}</span>\n </span>\n <Show when={dictation() === \"refined\" ? props.microphone?.onRestoreOriginal : undefined}>\n {(restore) => (\n <button\n type=\"button\"\n class=\"k2b-chat-composer__hint-action\"\n disabled={microphoneDisabled()}\n onMouseDown={keepFieldFocus}\n onClick={() => reportChatFailure(restore(), props.onError)}\n >\n {messages().restoreOriginal}\n </button>\n )}\n </Show>\n </>\n )}\n </Show>\n </div>\n </Show>\n <Show when={attachments().length > 0}>\n <div class=\"k2b-chat-composer__attachments\" role=\"list\" aria-label={messages().attachments} tabIndex={0}>\n <For each={attachments()}>\n {(attachment) => (\n <div class=\"k2b-chat-composer__attachment\" role=\"listitem\">\n <div\n class=\"k2b-chat-composer__attachment-content\"\n classList={{ \"k2b-chat-composer__attachment-content--action\": Boolean(attachment.action) }}\n >\n <Show\n when={attachment.href}\n fallback={\n <div class=\"k2b-chat-composer__attachment-identity\">\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img src={attachment.previewUrl} alt={attachment.alt ?? \"\"} />\n </Show>\n {renderAttachmentCopy(attachment)}\n </div>\n }\n >\n {(href) => (\n <a\n class=\"k2b-chat-composer__attachment-link\"\n href={href()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={messages().openInNewTab({ name: attachment.name })}\n >\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img src={attachment.previewUrl} alt={attachment.alt ?? \"\"} />\n </Show>\n {renderAttachmentCopy(attachment)}\n </a>\n )}\n </Show>\n <Show when={attachment.action}>\n {(action) => (\n <button\n type=\"button\"\n class=\"k2b-chat-composer__attachment-action\"\n disabled={blocked() || action().disabled}\n onClick={() => reportChatFailure(() => executeChatAction(action()), props.onError)}\n >\n <Show when={action().icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n {action().label}\n </button>\n )}\n </Show>\n </div>\n <Show when={props.onAttachmentsChange}>\n <button\n type=\"button\"\n class=\"k2b-chat-composer__attachment-remove\"\n aria-label={messages().removeNamed({ name: attachment.name })}\n disabled={blocked()}\n onClick={() => setAttachments(attachments().filter((candidate) => candidate.id !== attachment.id))}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n )}\n </For>\n </div>\n </Show>\n\n <Show\n when={conversation()}\n fallback={\n <>\n {field()}\n\n <Show when={props.error}>\n <div class=\"k2b-chat-composer__error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n {props.error}\n </div>\n </Show>\n\n {formatRow()}\n\n <footer class=\"k2b-chat-composer__footer\">\n <Show\n when={props.footerContent}\n fallback={\n <>\n <div class=\"k2b-chat-composer__tools\">\n {props.footerTools}\n <Show when={hasAddMenu()}>{addMenu(\"ti ti-plus\")}</Show>\n {fileInput()}\n {formatToggle()}\n {emojiButton()}\n <Show when={(props.models?.length ?? 0) > 0}>\n <SelectChip\n aria-label={messages().chooseModel}\n position=\"top-right\"\n class=\"k2b-chat-composer__model\"\n menuWidth=\"15rem\"\n placeholder={messages().model}\n value={() => props.selectedModelId ?? \"\"}\n options={(props.models ?? []).map((model) => ({\n value: model.id,\n label: model.label,\n description: model.description,\n icon: model.icon,\n image: model.image,\n }))}\n disabled={blocked() || running() || !props.onModelChange}\n onValueChange={(modelId) => {\n props.onModelChange?.(modelId);\n queueMicrotask(focus);\n }}\n />\n </Show>\n {props.modelDetails}\n </div>\n\n <div class=\"k2b-chat-composer__submit\">\n <For each={props.contextActions}>\n {(action) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action\"\n data-tone={action.variant === \"danger\" ? \"danger\" : undefined}\n disabled={action.disabled}\n aria-pressed={action.pressed}\n aria-label={action.label}\n content={action.label}\n onClick={() => reportChatFailure(() => executeChatAction(action), props.onError)}\n >\n <i class={action.icon ?? \"ti ti-dots\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </For>\n <Show when={hasContextUsage() ? (props.contextUsage ?? {}) : undefined}>\n {(usage) => <ContextUsage {...usage()} action={props.contextPopupAction} onActionError={props.onError} />}\n </Show>\n {props.submitTools}\n {microphoneControl()}\n {sendControl()}\n </div>\n </>\n }\n >\n {(content) => content()}\n </Show>\n </footer>\n </>\n }\n >\n <Show when={props.error}>\n <div class=\"k2b-chat-composer__error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n {props.error}\n </div>\n </Show>\n {formatRow()}\n {/* One row: attach, the field with its tools, and Send. */}\n <div class=\"k2b-chat-composer__row\">\n {attachControl()}\n {fileInput()}\n <div class=\"k2b-chat-composer__field\">\n {field()}\n <div class=\"k2b-chat-composer__field-tools\">\n {formatToggle()}\n {emojiButton()}\n {microphoneControl()}\n </div>\n </div>\n {sendControl()}\n </div>\n </Show>\n {/* Files dropped anywhere in the surrounding workspace area attach to the message. */}\n <Show when={props.fileSelection}>\n {(selection) => (\n <FileDropTarget\n label={messages().dropFilesToAttach}\n accept={selection().accept}\n multiple={selection().multiple}\n disabled={!canSelectFiles()}\n onDrop={(files) => void runFiles(files)}\n />\n )}\n </Show>\n </section>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["chat/ChatComposer.tsx"],"sourcesContent":["import {\n children,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n onCleanup,\n onMount,\n Show,\n untrack,\n} from \"solid-js\";\nimport { Dropdown, type DropdownItem as DropdownItemData } from \"../actions/Dropdown\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { replaceTextareaRange } from \"../inputs/editor-dom\";\nimport {\n completedEmojiShortcode,\n type EmojiIndex,\n emojiInTone,\n emojiName,\n emojiShortcodeQuery,\n loadEmojiIndex,\n suggestEmoji,\n} from \"../inputs/emoji/emoji-index\";\nimport { FileDropTarget } from \"../inputs/FileDropTarget\";\nimport { toggleBulletList, toggleInlineMarker } from \"../inputs/markdown/actions\";\nimport { openCodeFence } from \"../inputs/markdown/code-zone\";\nimport { type MarkdownToolbarMessages, useMarkdownToolbarMessages } from \"../inputs/markdown/toolbar-messages\";\nimport { SelectChip } from \"../inputs/SelectChip\";\nimport { useSelectMessages } from \"../inputs/select-messages\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { ChatContextUsage as ContextUsage } from \"./ChatPrimitives\";\nimport { conversationEnterAction, executeChatAction, nextChatCommandIndex, reportChatFailure, runChatSubmission } from \"./chat-behavior\";\nimport { useChatMessages } from \"./chat-messages\";\nimport { chatCommandQuery, chatMentionSegments, reconcileChatMentions } from \"./composer-document\";\nimport type {\n ChatAction,\n ChatAttachment,\n ChatComposerEmoji,\n ChatComposerMicrophone,\n ChatComposerState,\n ChatContextUsageData,\n ChatMention,\n ChatModelOption,\n ChatSubmitInput,\n} from \"./types\";\n\nconst composerMaxInputHeight = 309;\n/** Emoji suggestions for a `:shortcode`, as many as fit the list without scrolling on a phone. */\nconst emojiSuggestionLimit = 8;\n// Keep editor undo text within approximately 2 MiB, plus the current edit.\nconst composerUndoBudgetChars = 1_000_000;\n\nexport type ChatCommandContext = {\n setValue: (value: string) => void;\n submit: () => void;\n focus: () => void;\n};\n\nexport type ChatCommand = {\n name: string;\n description: string;\n icon?: string;\n action?: (context: ChatCommandContext) => void | Promise<void>;\n /** Selecting a reference inserts its display name and retains its opaque payload. */\n mention?: ChatAttachment;\n label?: string;\n disabled?: boolean;\n};\n\nexport type ChatFileSelection = {\n onSelect: (files: readonly File[]) => void | Promise<void>;\n /**\n * Chooses files for \"Attach files\" instead of the device's file dialog, for example to offer other sources as well.\n * Called within the menu activation, so it may still open the device's dialog; resolve `[]` when the user cancels.\n * `multiple: false` keeps the first chosen file, and a rejection reaches `onError`.\n */\n choose?: () => Promise<readonly File[]>;\n onError?: (error: unknown) => void;\n accept?: string;\n multiple?: boolean;\n disabled?: boolean;\n label?: string;\n};\n\nexport type ChatPasteHandler = (event: ClipboardEvent & { currentTarget: HTMLTextAreaElement; target: Element }) => void;\n\nexport type ChatComposerProps = {\n value: string;\n onValueChange: (value: string) => void;\n onSubmit: (input: ChatSubmitInput) => boolean | void | Promise<boolean | void>;\n /** Submit intent used for drafts entered while a response is running. Defaults to `steer`. */\n runningSubmitIntent?: \"steer\" | \"queue\";\n onStop?: () => void | Promise<void>;\n onError?: (error: unknown) => void;\n state?: ChatComposerState;\n attachments?: readonly ChatAttachment[];\n onAttachmentsChange?: (attachments: readonly ChatAttachment[]) => void;\n fileSelection?: ChatFileSelection;\n /** Handle non-file clipboard content. Pasted files already use `fileSelection`. */\n onPaste?: ChatPasteHandler;\n menuActions?: readonly ChatAction[];\n models?: readonly ChatModelOption[];\n selectedModelId?: string | null;\n onModelChange?: (modelId: string) => void;\n /** Compact application-owned details immediately after the model selector. */\n modelDetails?: JSX.Element;\n commands?: readonly ChatCommand[];\n searchCommands?: (query: string, signal: AbortSignal) => Promise<readonly ChatCommand[]>;\n mentions?: readonly ChatMention[];\n onMentionsChange?: (mentions: readonly ChatMention[]) => void;\n /** Shared surface above the editor; suggestions temporarily replace this content. */\n accessory?: JSX.Element;\n contextUsage?: ChatContextUsageData;\n contextActions?: readonly ChatAction[];\n /** Optional action inside the context details popup. */\n contextPopupAction?: ChatAction;\n /** Additional compact controls rendered with the add/model controls. */\n footerTools?: JSX.Element;\n /** Compact application controls immediately before the send/stop button. */\n submitTools?: JSX.Element;\n /** Replaces footer controls during an application-owned interaction, preserving the editor. */\n footerContent?: JSX.Element;\n placeholder?: string;\n label?: string;\n inputLabel?: string;\n disabled?: boolean;\n error?: string;\n focusToken?: unknown;\n draftKey?: unknown;\n class?: string;\n /**\n * `\"conversation\"` is the composer for messages between people: one row with attach, a pill-shaped field and Send,\n * without the assistant prompt's footer. The field starts with one line and grows to a third of its nearest size\n * container, a hint line of fixed height sits above it, its buttons keep it focused, and Enter breaks the line\n * inside an open code block and on touch-only devices. The default is the assistant prompt.\n */\n variant?: \"default\" | \"conversation\";\n /** `\"enter\"` (default): Enter sends and Shift+Enter breaks the line. `\"mod-enter\"`: Enter breaks the line. Ctrl/⌘+Enter always sends. */\n sendKey?: \"enter\" | \"mod-enter\";\n /**\n * Adds \"Aa\", which opens one row above the field with Bold, Italic and Bullet list (Ctrl/⌘+B, Ctrl/⌘+I, Ctrl/⌘+Shift+8);\n * the field and its controls stay put. Other Markdown is typed by hand.\n */\n formatting?: boolean;\n /** An emoji button at a fixed place. Touch-only devices hide it; their keyboard has emoji. */\n emoji?: ChatComposerEmoji;\n /** A microphone at a fixed place: a tap dictates, holding it or its menu asks for a voice message. */\n microphone?: ChatComposerMicrophone;\n /** One line above the field. The conversation variant always keeps its height; the default shows it only with content. */\n hint?: JSX.Element;\n};\n\ntype FormatTool = {\n id: string;\n icon: string;\n label: (messages: MarkdownToolbarMessages) => string;\n run: (textarea: HTMLTextAreaElement) => void;\n /** Ctrl/⌘ plus this `event.key`. */\n key?: string;\n /** Ctrl/⌘+Shift plus this `event.code`, the physical key, so every keyboard layout agrees. */\n shiftCode?: string;\n};\n\n/** The row stays short: what a chat message needs. Other Markdown, typed by hand, keeps working. */\nconst formatTools: readonly FormatTool[] = [\n { id: \"bold\", icon: \"ti ti-bold\", label: (m) => m.boldShortcut, run: (textarea) => toggleInlineMarker(textarea, \"**\"), key: \"b\" },\n { id: \"italic\", icon: \"ti ti-italic\", label: (m) => m.italicShortcut, run: (textarea) => toggleInlineMarker(textarea, \"*\"), key: \"i\" },\n { id: \"bullet-list\", icon: \"ti ti-list\", label: (m) => m.bulletListShortcut, run: toggleBulletList, shiftCode: \"Digit8\" },\n];\n\nconst formatShortcut = (event: KeyboardEvent): FormatTool | undefined => {\n if (event.altKey || !(event.ctrlKey || event.metaKey)) return undefined;\n return formatTools.find((tool) => (event.shiftKey ? tool.shiftCode === event.code : tool.key === event.key.toLowerCase()));\n};\n\nconst touchOnlyQuery = \"(any-pointer: coarse) and (not (any-pointer: fine))\";\nconst isTouchOnly = () => typeof matchMedia === \"function\" && matchMedia(touchOnlyQuery).matches;\n/** How long a press on the microphone lasts before it asks for a voice message instead of dictation. */\nconst microphoneHoldMs = 500;\n/** Keeps the field focused (and a phone's keyboard open) when a composer button is pressed with a mouse or finger. */\nconst keepFieldFocus = (event: MouseEvent) => event.preventDefault();\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 hasContent = (items: unknown[]) => items.some((item) => item != null && typeof item !== \"boolean\" && item !== \"\");\n\nexport function ChatComposer(props: ChatComposerProps): JSX.Element {\n const accessory = children(() => props.accessory);\n const hasAccessory = () => hasContent(accessory.toArray());\n const hint = children(() => props.hint);\n const messages = useUiMessages();\n const markdownToolbarMessages = useMarkdownToolbarMessages();\n const chatMessages = useChatMessages();\n const selectMessages = useSelectMessages();\n const commandListId = `k2b-chat-commands-${createUniqueId().replace(/[^A-Za-z0-9_-]/g, \"-\")}`;\n const formatGroupId = `${commandListId}-format`;\n const [selectedCommandIndex, setSelectedCommandIndex] = createSignal(0);\n const [addingFiles, setAddingFiles] = createSignal(false);\n const [submitting, setSubmitting] = createSignal(false);\n let composerRef: HTMLElement | undefined;\n let textareaRef: HTMLTextAreaElement | undefined;\n let fileInputRef: HTMLInputElement | undefined;\n let measureRef: HTMLTextAreaElement | undefined;\n let microphoneRef: HTMLDivElement | undefined;\n let sawRunning = props.state === \"running\";\n const conversation = () => props.variant === \"conversation\";\n const [formattingOpen, setFormattingOpen] = createSignal(false);\n const [microphoneMenuOpen, setMicrophoneMenuOpen] = createSignal(false);\n const dictation = () => props.microphone?.dictation ?? null;\n const showHint = () => conversation() || dictation() !== null || hasContent(hint.toArray());\n\n const state = () => props.state ?? \"idle\";\n const running = () => state() === \"running\";\n const stopping = () => state() === \"stopping\";\n const runningSubmitIntent = () => props.runningSubmitIntent ?? \"steer\";\n const attachments = () => props.attachments ?? [];\n const [caret, setCaret] = createSignal(0);\n const [selectionEnd, setSelectionEnd] = createSignal(0);\n const [dismissed, setDismissed] = createSignal(false);\n const [composing, setComposing] = createSignal(false);\n const [searchResults, setSearchResults] = createSignal<readonly ChatCommand[]>([]);\n const [searching, setSearching] = createSignal(false);\n const [searchError, setSearchError] = createSignal(false);\n const [executing, setExecuting] = createSignal(false);\n let highlightRef: HTMLDivElement | undefined;\n let commandListRef: HTMLDivElement | undefined;\n const mentions = () => props.mentions ?? [];\n const locale = useLocale();\n const [emojiIndex, setEmojiIndex] = createSignal<EmojiIndex>();\n const emojiQuery = createMemo(() =>\n !props.emoji || dismissed() || composing() ? null : emojiShortcodeQuery(props.value, caret(), selectionEnd()),\n );\n // The emoji data loads with the first `:shortcode`; a failed load only means no suggestions.\n createEffect(() => {\n if (emojiQuery() && !emojiIndex()) loadEmojiIndex().then(setEmojiIndex, () => undefined);\n });\n const emojiMatches = createMemo(() => {\n const token = emojiQuery();\n const index = emojiIndex();\n return token && index ? suggestEmoji(index, token.query, emojiSuggestionLimit) : [];\n });\n const emojiOpen = () => emojiMatches().length > 0;\n const commandQuery = createMemo(() => (dismissed() || composing() ? null : chatCommandQuery(props.value, caret(), selectionEnd())));\n const commandMatches = createMemo(() => {\n const token = commandQuery();\n if (!token) return [];\n return [\n ...(props.commands ?? []).filter((command) => command.name.toLowerCase().includes(token.query.toLowerCase())),\n ...searchResults(),\n ];\n });\n const commandsOpen = () => Boolean(!emojiOpen() && commandQuery() && (props.commands?.length || props.searchCommands));\n const suggestionsOpen = () => commandsOpen() || emojiOpen();\n createEffect(() => {\n if (!suggestionsOpen()) return;\n let disposed = false;\n const measure = () => {\n if (disposed || !commandListRef) return;\n let top = window.visualViewport?.offsetTop ?? 0;\n for (let parent = commandListRef.parentElement; parent; parent = parent.parentElement) {\n if (/(auto|scroll|hidden|clip)/.test(window.getComputedStyle(parent).overflowY)) {\n top = Math.max(top, parent.getBoundingClientRect().top);\n }\n }\n const bottom = commandListRef.parentElement!.getBoundingClientRect().bottom;\n commandListRef.style.setProperty(\"--k2b-chat-command-space\", `${Math.max(40, bottom - top - 8)}px`);\n };\n queueMicrotask(measure);\n window.addEventListener(\"resize\", measure);\n window.addEventListener(\"scroll\", measure, true);\n window.visualViewport?.addEventListener(\"resize\", measure);\n onCleanup(() => {\n disposed = true;\n window.removeEventListener(\"resize\", measure);\n window.removeEventListener(\"scroll\", measure, true);\n window.visualViewport?.removeEventListener(\"resize\", measure);\n });\n });\n createEffect(() => {\n const token = commandQuery();\n setSearchResults([]);\n setSearchError(false);\n if (!token || !props.searchCommands) {\n setSearching(false);\n return;\n }\n const abort = new AbortController();\n setSearching(true);\n const timer = setTimeout(() => {\n Promise.resolve(props.searchCommands!(token.query, abort.signal))\n .then((results) => {\n if (!abort.signal.aborted) setSearchResults(results);\n })\n .catch(() => {\n if (!abort.signal.aborted) setSearchError(true);\n })\n .finally(() => {\n if (!abort.signal.aborted) setSearching(false);\n });\n }, 120);\n onCleanup(() => {\n clearTimeout(timer);\n abort.abort();\n });\n });\n const history: { value: string; mentions: readonly ChatMention[]; caret: number }[] = [];\n let historyIndex = -1;\n createEffect(() => {\n props.draftKey;\n untrack(() => {\n history.length = 0;\n historyIndex = -1;\n setDismissed(true);\n });\n });\n const snapshot = () => ({ value: props.value, mentions: [...mentions()], caret: textareaRef?.selectionStart ?? 0 });\n const sameMentions = (a: readonly ChatMention[], b: readonly ChatMention[]) =>\n a.length === b.length &&\n a.every((item, index) => item.start === b[index]?.start && item.end === b[index]?.end && item.attachment === b[index]?.attachment);\n const record = () => {\n if (history[historyIndex]?.value !== props.value || !sameMentions(history[historyIndex]?.mentions ?? [], mentions())) {\n history.splice(historyIndex + 1);\n history.push(snapshot());\n let size = history.reduce((total, entry) => total + entry.value.length, 0);\n while (history.length > 2 && size > composerUndoBudgetChars) size -= history.shift()!.value.length;\n historyIndex = history.length - 1;\n }\n };\n const edit = (value: string, nextMentions = reconcileChatMentions(props.value, value, mentions())) => {\n record();\n props.onValueChange(value);\n props.onMentionsChange?.(nextMentions);\n record();\n setDismissed(false);\n };\n const restoreHistory = (direction: -1 | 1) => {\n record();\n const next = history[historyIndex + direction];\n if (!next) return;\n historyIndex += direction;\n props.onValueChange(next.value);\n props.onMentionsChange?.(next.mentions);\n queueMicrotask(() => {\n textareaRef?.setSelectionRange(next.caret, next.caret);\n syncCaret();\n });\n };\n const syncCaret = () => {\n setCaret(textareaRef?.selectionStart ?? props.value.length);\n setSelectionEnd(textareaRef?.selectionEnd ?? props.value.length);\n };\n const selectedCommand = () => commandMatches()[selectedCommandIndex()];\n const busy = () => Boolean(props.disabled || stopping() || state() === \"submitting\" || executing() || addingFiles());\n const blocked = () => busy() || submitting();\n /** The conversation field stays editable while a message is sent, so it keeps the focus and a phone its keyboard. */\n const editBlocked = () => (conversation() ? busy() : blocked());\n const hasDraft = () => Boolean(props.value.trim() || (!running() && attachments().length > 0));\n const canSubmit = () => !blocked() && hasDraft() && !(running() && runningSubmitIntent() === \"steer\" && mentions().length);\n const canSelectFiles = () => Boolean(props.fileSelection && !props.fileSelection.disabled && !running() && !blocked());\n const hasAddMenu = () => Boolean(props.fileSelection || props.menuActions?.length);\n const hasContextUsage = () => {\n if (props.contextPopupAction) return true;\n const context = props.contextUsage;\n if (!context || typeof context.contextWindow !== \"number\" || !Number.isFinite(context.contextWindow) || context.contextWindow <= 0) {\n return false;\n }\n return [context.usage?.total, context.usage?.input, context.usage?.output].some(\n (value) => typeof value === \"number\" && Number.isFinite(value) && value >= 0,\n );\n };\n\n const menuItems = (): readonly DropdownItemData[] => {\n const items: DropdownItemData[] = [];\n if (props.fileSelection) {\n items.push({\n icon: addingFiles() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-paperclip\",\n label: props.fileSelection.label ?? chatMessages().attachFiles,\n disabled: !canSelectFiles(),\n action: () => chooseFiles(),\n });\n }\n for (const action of props.menuActions ?? []) {\n items.push({\n icon: action.icon,\n label: action.label,\n variant: action.variant,\n disabled: action.disabled,\n action: () => reportChatFailure(() => executeChatAction(action), props.onError),\n });\n }\n return items;\n };\n\n const autoResize = () => {\n if (!textareaRef) return;\n if (conversation()) {\n // A hidden copy measures the text. Collapsing the field itself would shrink the composer for a frame, and\n // WebKit then clamps the scroll position of the conversation above it. CSS caps the height.\n if (!measureRef) return;\n measureRef.value = textareaRef.value;\n textareaRef.style.height = `${measureRef.scrollHeight}px`;\n return;\n }\n textareaRef.style.height = \"auto\";\n textareaRef.style.height = `${Math.min(textareaRef.scrollHeight, composerMaxInputHeight)}px`;\n };\n\n const focus = () => textareaRef?.focus();\n\n onMount(() => {\n autoResize();\n if (props.focusToken !== undefined) focus();\n // The copy follows the field's width, so a narrower composer measures more lines.\n if (measureRef && typeof ResizeObserver === \"function\") {\n const observer = new ResizeObserver(() => autoResize());\n observer.observe(measureRef);\n onCleanup(() => observer.disconnect());\n }\n });\n\n createEffect(() => {\n commandMatches();\n emojiMatches();\n setSelectedCommandIndex(0);\n });\n\n createEffect(() => {\n const index = selectedCommandIndex();\n commandMatches();\n emojiMatches();\n queueMicrotask(() => {\n const list = commandListRef;\n const item = list?.querySelector<HTMLElement>(`[id=\"${commandListId}-${index}\"]`);\n if (!list || !item?.isConnected) return;\n if (item.offsetTop < list.scrollTop) list.scrollTop = item.offsetTop;\n else if (item.offsetTop + item.offsetHeight > list.scrollTop + list.clientHeight) {\n list.scrollTop = item.offsetTop + item.offsetHeight - list.clientHeight;\n }\n });\n });\n\n createEffect(() => {\n props.value;\n queueMicrotask(autoResize);\n });\n\n createEffect(() => {\n props.focusToken;\n if (props.focusToken !== undefined) queueMicrotask(focus);\n });\n\n createEffect(() => {\n const active = running();\n if (sawRunning && !active && !props.disabled && typeof document !== \"undefined\") {\n const focused = document.activeElement as HTMLElement | null;\n const insideComposer = Boolean(focused && composerRef?.contains(focused));\n const editingElsewhere = Boolean(\n focused &&\n focused !== document.body &&\n !insideComposer &&\n (focused.matches(\"input, textarea, select\") || focused.isContentEditable || focused.closest(\"[role='dialog'], [popover]\")),\n );\n if (!editingElsewhere) queueMicrotask(focus);\n }\n sawRunning = active;\n });\n\n const setAttachments = (next: readonly ChatAttachment[]) => props.onAttachmentsChange?.(next);\n\n const renderAttachmentCopy = (attachment: ChatAttachment) => (\n <span>\n <strong title={attachment.name}>{attachment.name}</strong>\n </span>\n );\n\n const chooseFiles = () => {\n const selection = props.fileSelection;\n if (!selection?.choose) return fileInputRef?.click();\n selection.choose().then(\n // A single-file composer keeps the first chosen file, as its file dialog and drops do.\n (files) => void runFiles(selection.multiple === false ? files.slice(0, 1) : files),\n (error: unknown) => (props.fileSelection?.onError ?? props.onError)?.(error),\n );\n };\n\n const runFiles = async (files: FileList | readonly File[]) => {\n if (!canSelectFiles()) return;\n const selected = Array.from(files);\n if (selected.length === 0) return;\n setAddingFiles(true);\n try {\n await props.fileSelection?.onSelect(selected);\n } catch (error) {\n (props.fileSelection?.onError ?? props.onError)?.(error);\n } finally {\n setAddingFiles(false);\n if (fileInputRef) fileInputRef.value = \"\";\n queueMicrotask(focus);\n }\n };\n\n const submit = async () => {\n if (!canSubmit()) return;\n const intent = running() ? runningSubmitIntent() : \"send\";\n const previousValue = props.value;\n const previousAttachments = attachments();\n const previousMentions = mentions();\n const input: ChatSubmitInput = {\n intent,\n text: previousValue,\n mentions: previousMentions,\n attachments: intent !== \"steer\" ? previousAttachments : [],\n };\n\n setSubmitting(true);\n try {\n await runChatSubmission({\n clear: () => {\n props.onValueChange(\"\");\n props.onMentionsChange?.([]);\n if (intent !== \"steer\") setAttachments([]);\n },\n perform: () => props.onSubmit(input),\n restore: () => {\n // Text typed while the submission ran stays, after the returned draft. Its mentions are read first, because\n // an application may already move them when the text changes.\n const typed = props.value;\n const typedMentions = mentions();\n const shift = previousValue.length + 1;\n props.onValueChange(typed ? `${previousValue}\\n${typed}` : previousValue);\n props.onMentionsChange?.(\n typed\n ? [\n ...previousMentions,\n ...typedMentions.map((mention) => ({ ...mention, start: mention.start + shift, end: mention.end + shift })),\n ]\n : previousMentions,\n );\n if (intent !== \"steer\") setAttachments(previousAttachments);\n },\n onError: props.onError,\n });\n } finally {\n setSubmitting(false);\n queueMicrotask(() => {\n autoResize();\n focus();\n });\n }\n };\n\n const executeCommand = async (command: ChatCommand) => {\n const token = commandQuery();\n if (!token || command.disabled || blocked()) return;\n const previous = snapshot();\n const key = props.draftKey;\n const replacement = command.mention ? command.mention.name + \" \" : \"\";\n const nextValue = props.value.slice(0, token.start) + replacement + props.value.slice(token.end);\n const nextMentions = reconcileChatMentions(props.value, nextValue, mentions());\n if (command.mention)\n nextMentions.push({ start: token.start, end: token.start + command.mention.name.length, attachment: command.mention });\n edit(nextValue, nextMentions);\n setDismissed(true);\n setExecuting(true);\n let submitRequested = false;\n try {\n await command.action?.({\n setValue: (value) => edit(value),\n submit: () => {\n submitRequested = true;\n },\n focus,\n });\n } catch (error) {\n submitRequested = false;\n if (props.draftKey === key && props.value === nextValue) {\n props.onValueChange(previous.value);\n props.onMentionsChange?.(previous.mentions);\n }\n props.onError?.(error);\n } finally {\n setExecuting(false);\n }\n if (submitRequested && props.draftKey === key) await submit();\n queueMicrotask(() => {\n if (props.draftKey !== key) return;\n textareaRef?.setSelectionRange(token.start + replacement.length, token.start + replacement.length);\n syncCaret();\n autoResize();\n focus();\n });\n };\n\n /** Replaces `start`–`end` with the emoji through the editing path, so the browser's undo restores the shortcode. */\n const insertEmoji = (start: number, end: number, emoji: string) => {\n if (!textareaRef || editBlocked()) return;\n replaceTextareaRange(textareaRef, start, end, emoji);\n syncCaret();\n reportChatFailure(() => props.emoji?.onPick?.(emoji), props.onError);\n };\n const pickEmojiSuggestion = (position: number) => {\n const token = emojiQuery();\n const entry = emojiMatches()[position];\n if (!token || !entry) return;\n insertEmoji(token.start, token.end, emojiInTone(entry, props.emoji?.skinTone ?? 0));\n };\n /**\n * A typed colon loads the emoji data, and the closing colon of a known `:shortcode:` turns it into its emoji. A\n * shortcode closed before the data arrived turns when it arrives, as long as nothing changed in the meantime.\n */\n const completeShortcode = () => {\n const textarea = textareaRef;\n if (!props.emoji || !textarea) return;\n const { value, selectionStart: caret } = textarea;\n const completed = completedEmojiShortcode(value, caret);\n const convert = (index: EmojiIndex) => {\n const entry = completed && index.byShortcode.get(completed.shortcode.toLowerCase());\n if (completed && entry) insertEmoji(completed.start, completed.end, emojiInTone(entry, props.emoji?.skinTone ?? 0));\n };\n const index = emojiIndex();\n if (index) {\n convert(index);\n return;\n }\n loadEmojiIndex().then(\n (loaded) => {\n setEmojiIndex(loaded);\n const untouched = textarea.value === value && textarea.selectionStart === caret && textarea.selectionEnd === caret;\n if (untouched && textarea.matches(\":focus\")) convert(loaded);\n },\n () => undefined,\n );\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n // WebKit ends the composition before the keydown of the Enter that confirms it; that keydown keeps keyCode 229.\n if (event.isComposing || event.keyCode === 229 || composing()) return;\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === \"z\") {\n event.preventDefault();\n restoreHistory(event.shiftKey ? 1 : -1);\n return;\n }\n if (emojiOpen()) {\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n setSelectedCommandIndex((index) => nextChatCommandIndex(index, emojiMatches().length, event.key === \"ArrowUp\" ? -1 : 1));\n return;\n }\n // Only a plain Enter or Tab picks: Shift+Enter still breaks the line, Shift+Tab still moves the focus back.\n const plain = !event.shiftKey && !event.altKey && !event.ctrlKey && !event.metaKey;\n if (plain && (event.key === \"Enter\" || event.key === \"Tab\")) {\n event.preventDefault();\n pickEmojiSuggestion(selectedCommandIndex());\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n setDismissed(true);\n return;\n }\n }\n const matches = commandMatches();\n if (commandsOpen()) {\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n setSelectedCommandIndex((index) => nextChatCommandIndex(index, matches.length, event.key === \"ArrowUp\" ? -1 : 1));\n return;\n }\n // Ctrl/⌘+Enter sends, also while suggestions are open.\n if ((event.key === \"Tab\" || (event.key === \"Enter\" && !event.ctrlKey && !event.metaKey)) && matches.length > 0) {\n event.preventDefault();\n const command = selectedCommand();\n if (command) void executeCommand(command);\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n setDismissed(true);\n return;\n }\n }\n const format = props.formatting && textareaRef ? formatShortcut(event) : undefined;\n if (format && textareaRef) {\n event.preventDefault();\n format.run(textareaRef);\n return;\n }\n if (event.key !== \"Enter\") return;\n if (conversation()) {\n const action = conversationEnterAction(event, {\n sendKey: props.sendKey ?? \"enter\",\n touchOnly: isTouchOnly(),\n inCodeBlock: openCodeFence(props.value, textareaRef?.selectionStart ?? props.value.length) !== null,\n });\n if (action === \"send\") {\n event.preventDefault();\n void submit();\n }\n return;\n }\n const send = props.sendKey === \"mod-enter\" ? event.ctrlKey || event.metaKey : !event.shiftKey;\n if (send && !event.isComposing) {\n event.preventDefault();\n void submit();\n }\n };\n\n const insertText = (text: string) => {\n if (!textareaRef || editBlocked()) return;\n replaceTextareaRange(textareaRef, textareaRef.selectionStart, textareaRef.selectionEnd, text);\n };\n\n let holdTimer: ReturnType<typeof setTimeout> | undefined;\n let held = false;\n const releaseHold = () => {\n clearTimeout(holdTimer);\n holdTimer = undefined;\n };\n onCleanup(releaseHold);\n const microphoneDisabled = () => Boolean(props.microphone?.disabled || blocked() || dictation() === \"refining\");\n const microphoneItems = (): readonly DropdownItemData[] => {\n const microphone = props.microphone;\n const items: DropdownItemData[] = [];\n if (microphone?.onDictate) {\n const dictate = microphone.onDictate;\n items.push({ icon: \"ti ti-microphone\", label: chatMessages().dictate, action: () => reportChatFailure(dictate, props.onError) });\n }\n if (microphone?.onVoiceMessage) {\n const record = microphone.onVoiceMessage;\n items.push({\n icon: \"ti ti-player-record\",\n label: chatMessages().recordVoiceMessage,\n action: () => reportChatFailure(record, props.onError),\n });\n }\n return items;\n };\n const dictationStatus = (): { icon: string; text: string } | null => {\n switch (dictation()) {\n case \"listening\":\n return { icon: \"ti ti-microphone\", text: chatMessages().dictationListening };\n case \"refining\":\n return { icon: \"ti ti-loader-2 k2b-spin\", text: chatMessages().dictationRefining };\n case \"refined\":\n return { icon: \"ti ti-sparkles\", text: chatMessages().dictationRefined };\n case \"unrefined\":\n return { icon: \"ti ti-microphone\", text: chatMessages().dictationUnrefined };\n case \"interrupted\":\n return { icon: \"ti ti-alert-triangle\", text: chatMessages().dictationInterrupted };\n default:\n return null;\n }\n };\n\n const fileInput = () => (\n <Show when={props.fileSelection}>\n <input\n ref={fileInputRef}\n class=\"k2b-sr-only\"\n type=\"file\"\n tabIndex={-1}\n aria-hidden=\"true\"\n accept={props.fileSelection?.accept}\n multiple={props.fileSelection?.multiple ?? true}\n onChange={(event) => {\n if (event.currentTarget.files?.length) void runFiles(event.currentTarget.files);\n }}\n />\n </Show>\n );\n\n const addMenu = (icon: string, extraClass = \"\") => (\n <Dropdown.Root position=\"top-right\" label={chatMessages().addToChat} items={menuItems()} disabled={blocked()}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class={`k2b-chat-composer__icon-action${extraClass}`}\n label={chatMessages().addToChat}\n tooltip={chatMessages().addToChat}\n >\n <i class={icon} aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n );\n\n /** The conversation's attach button opens the file choice directly; other actions turn it into the add menu. */\n const attachControl = () => (\n <Show\n when={props.menuActions?.length}\n fallback={\n <Show when={props.fileSelection}>\n {(selection) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__attach\"\n aria-label={selection().label ?? chatMessages().attachFiles}\n content={selection().label ?? chatMessages().attachFiles}\n disabled={!canSelectFiles()}\n onClick={chooseFiles}\n >\n <i class={addingFiles() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-plus\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </Show>\n }\n >\n {addMenu(\"ti ti-plus\", \" k2b-chat-composer__attach\")}\n </Show>\n );\n\n const formatToggle = () => (\n <Show when={props.formatting}>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__format-toggle\"\n aria-label={chatMessages().composerFormatting}\n aria-pressed={formattingOpen()}\n aria-controls={formattingOpen() ? formatGroupId : undefined}\n content={chatMessages().composerFormatting}\n onMouseDown={keepFieldFocus}\n onClick={() => setFormattingOpen((open) => !open)}\n >\n <i class=\"ti ti-letter-case\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n );\n\n /** One row of fixed height. It shows every button at once, also on a phone, so nothing hides behind a scroll. */\n const formatRow = () => (\n <Show when={props.formatting && formattingOpen()}>\n <div id={formatGroupId} class=\"k2b-chat-composer__format\" role=\"group\" aria-label={chatMessages().composerFormatting}>\n <For each={formatTools}>\n {(tool) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action\"\n aria-label={tool.label(markdownToolbarMessages())}\n content={tool.label(markdownToolbarMessages())}\n disabled={editBlocked()}\n onMouseDown={keepFieldFocus}\n onClick={() => {\n if (textareaRef) tool.run(textareaRef);\n }}\n >\n <i class={tool.icon} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </For>\n </div>\n </Show>\n );\n\n const emojiButton = () => (\n <Show when={props.emoji}>\n {(emoji) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__emoji\"\n aria-label={chatMessages().insertEmoji}\n content={chatMessages().insertEmoji}\n disabled={editBlocked()}\n onMouseDown={keepFieldFocus}\n onClick={(event) => {\n const anchor = event.currentTarget;\n reportChatFailure(() => emoji().onOpen({ anchor, insert: insertText }), props.onError);\n }}\n >\n <i class=\"ti ti-mood-smile\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </Show>\n );\n\n const microphoneControl = () => (\n <Show when={props.microphone?.onDictate || props.microphone?.onVoiceMessage ? props.microphone : undefined}>\n {(microphone) => (\n <div ref={microphoneRef} class=\"k2b-chat-composer__microphone\">\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__microphone-button\"\n data-state={dictation() ?? undefined}\n disabled={microphoneDisabled()}\n aria-pressed={microphone().onDictate ? dictation() === \"listening\" : undefined}\n aria-haspopup={microphone().onDictate ? undefined : \"menu\"}\n aria-expanded={microphone().onDictate ? undefined : microphoneMenuOpen()}\n // A toggle keeps its name; the pressed state says that dictation runs.\n aria-label={microphone().onDictate ? chatMessages().dictate : chatMessages().recordVoiceMessage}\n content={\n dictation() === \"listening\"\n ? chatMessages().stopDictation\n : microphone().onDictate\n ? microphone().onVoiceMessage\n ? chatMessages().dictateOrHold\n : chatMessages().dictate\n : chatMessages().recordVoiceMessage\n }\n onMouseDown={keepFieldFocus}\n onContextMenu={(event) => event.preventDefault()}\n onPointerDown={(event) => {\n held = false;\n releaseHold();\n const record = microphone().onVoiceMessage;\n if (event.button !== 0 || !record || dictation() === \"listening\") return;\n holdTimer = setTimeout(() => {\n // The composer may have become blocked, or recording withdrawn, during the press.\n const current = props.microphone?.onVoiceMessage;\n if (!current || microphoneDisabled()) return;\n held = true;\n reportChatFailure(current, props.onError);\n }, microphoneHoldMs);\n }}\n onPointerUp={releaseHold}\n onPointerCancel={releaseHold}\n onPointerLeave={releaseHold}\n onClick={(event) => {\n // A press that already asked for a voice message ends here; a key press never holds.\n if (held) {\n held = false;\n if (event.detail > 0) return;\n }\n const dictate = microphone().onDictate;\n if (dictate) {\n reportChatFailure(dictate, props.onError);\n return;\n }\n setMicrophoneMenuOpen(true);\n // From the keyboard it opens the menu like a menu button: the focus moves to the first item.\n if (event.detail === 0) {\n queueMicrotask(() => microphoneRef?.querySelector<HTMLElement>('[role=\"menuitem\"]:not(:disabled)')?.focus());\n }\n }}\n >\n <i\n class={\n dictation() === \"listening\"\n ? \"ti ti-player-stop\"\n : dictation() === \"refining\"\n ? \"ti ti-loader-2 k2b-spin\"\n : \"ti ti-microphone\"\n }\n aria-hidden=\"true\"\n />\n </Tooltip.Trigger>\n <Show when={microphone().onVoiceMessage}>\n <Dropdown.Root\n position=\"top-left\"\n label={chatMessages().microphoneOptions}\n items={microphoneItems()}\n disabled={microphoneDisabled()}\n open={microphoneMenuOpen()}\n onOpenChange={setMicrophoneMenuOpen}\n >\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-chat-composer__icon-action k2b-chat-composer__microphone-menu\"\n label={chatMessages().microphoneOptions}\n tooltip={chatMessages().microphoneOptions}\n >\n <i class=\"ti ti-chevron-up\" aria-hidden=\"true\" />\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </div>\n )}\n </Show>\n );\n\n const sendControl = () => (\n <Show\n when={running() && !hasDraft() && props.onStop}\n fallback={\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__send\"\n disabled={!canSubmit()}\n onMouseDown={(event) => {\n if (conversation()) keepFieldFocus(event);\n }}\n aria-label={\n submitting()\n ? running()\n ? runningSubmitIntent() === \"queue\"\n ? chatMessages().queueing\n : chatMessages().steering\n : chatMessages().sending\n : running()\n ? runningSubmitIntent() === \"queue\"\n ? chatMessages().queueMessage\n : chatMessages().steerResponse\n : chatMessages().sendMessage\n }\n content={\n running()\n ? runningSubmitIntent() === \"queue\"\n ? chatMessages().queueMessage\n : chatMessages().steerResponse\n : chatMessages().sendMessage\n }\n onClick={() => void submit()}\n >\n <i class={submitting() ? \"ti ti-loader-2 k2b-spin\" : conversation() ? \"ti ti-send\" : \"ti ti-arrow-up\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n }\n >\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__stop\"\n disabled={stopping()}\n aria-label={stopping() ? chatMessages().stopping : chatMessages().stopResponse}\n content={chatMessages().stopResponse}\n onClick={() => reportChatFailure(() => props.onStop?.(), props.onError)}\n >\n <i class={stopping() ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-player-stop\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n );\n\n const field = () => (\n <div class=\"k2b-chat-composer__input\" role=\"group\" aria-label={chatMessages().messageInput}>\n <Show when={mentions().length > 0}>\n <div ref={highlightRef} class=\"k2b-chat-composer__highlight\" aria-hidden=\"true\">\n <For each={chatMentionSegments(props.value, mentions())}>\n {(part) => <span classList={{ \"k2b-chat-composer__mention\": Boolean(part.mention) }}>{part.text}</span>}\n </For>\n {\"\\n\"}\n </div>\n </Show>\n {/* biome-ignore lint/a11y/useAriaPropsSupportedByRole: popup attributes are conditional with the combobox role */}\n <textarea\n ref={textareaRef}\n classList={{ \"k2b-chat-composer__textarea--highlighted\": mentions().length > 0 }}\n rows={1}\n value={props.value}\n disabled={editBlocked()}\n enterkeyhint={conversation() ? \"enter\" : undefined}\n placeholder={\n props.placeholder ??\n (running() ? chatMessages().addGuidance : conversation() ? chatMessages().writeConversationMessage : chatMessages().writeMessage)\n }\n aria-label={props.inputLabel ?? messages().message}\n role={suggestionsOpen() ? \"combobox\" : undefined}\n aria-autocomplete={suggestionsOpen() ? \"list\" : undefined}\n aria-controls={suggestionsOpen() ? commandListId : undefined}\n aria-expanded={suggestionsOpen() ? \"true\" : undefined}\n aria-activedescendant={\n (emojiOpen() ? emojiMatches()[selectedCommandIndex()] : selectedCommand())\n ? `${commandListId}-${selectedCommandIndex()}`\n : undefined\n }\n onInput={(event) => {\n edit(event.currentTarget.value);\n syncCaret();\n autoResize();\n const input = event as InputEvent;\n if (input.inputType === \"insertText\" && input.data === \":\") queueMicrotask(completeShortcode);\n }}\n onPaste={(event) => {\n const clipboardData = event.clipboardData;\n if (canSelectFiles() && clipboardData?.files.length) {\n event.preventDefault();\n void runFiles(clipboardData.files);\n return;\n }\n props.onPaste?.(event);\n }}\n onSelect={syncCaret}\n onBlur={() => setDismissed(true)}\n onClick={() => {\n setDismissed(false);\n syncCaret();\n }}\n onKeyUp={syncCaret}\n onCompositionStart={() => setComposing(true)}\n onCompositionEnd={() => {\n setComposing(false);\n syncCaret();\n }}\n onScroll={() => {\n if (highlightRef && textareaRef) highlightRef.scrollTop = textareaRef.scrollTop;\n }}\n onBeforeInput={(event) => {\n if (event.inputType === \"historyUndo\" || event.inputType === \"historyRedo\") {\n event.preventDefault();\n restoreHistory(event.inputType === \"historyUndo\" ? -1 : 1);\n }\n }}\n onKeyDown={onKeyDown}\n />\n <Show when={conversation()}>\n <textarea ref={measureRef} class=\"k2b-chat-composer__measure\" rows={1} tabIndex={-1} aria-hidden=\"true\" readOnly />\n </Show>\n </div>\n );\n\n return (\n <div class=\"k2b-chat-composer-shell\">\n <Show when={suggestionsOpen() || hasAccessory()}>\n {/* Suggestions alone float above the composer; a row of the shell's grid would add its gap and move the composer. */}\n <div class=\"k2b-chat-composer-slot\" data-overlay={hasAccessory() ? undefined : \"true\"}>\n <div style={{ visibility: suggestionsOpen() ? \"hidden\" : undefined }} inert={suggestionsOpen()}>\n {accessory()}\n </div>\n <Show when={emojiOpen()}>\n <div class=\"k2b-chat-composer-accessory\">\n <div\n ref={commandListRef}\n id={commandListId}\n class=\"k2b-chat-composer__commands\"\n role=\"listbox\"\n aria-label={chatMessages().emojiSuggestions}\n >\n <For each={emojiMatches()}>\n {(entry, index) => (\n <button\n id={`${commandListId}-${index()}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={index() === selectedCommandIndex()}\n aria-label={emojiName(entry, locale())}\n data-active={index() === selectedCommandIndex() ? \"true\" : undefined}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => pickEmojiSuggestion(index())}\n >\n <span class=\"k2b-chat-composer__emoji-glyph\" aria-hidden=\"true\">\n {emojiInTone(entry, props.emoji?.skinTone ?? 0)}\n </span>\n <strong>{emojiName(entry, locale())}</strong>\n <Show when={entry.shortcodes[0]}>{(code) => <small>:{code()}:</small>}</Show>\n </button>\n )}\n </For>\n </div>\n </div>\n </Show>\n <Show when={commandsOpen()}>\n <div class=\"k2b-chat-composer-accessory\">\n <div\n ref={commandListRef}\n id={commandListId}\n class=\"k2b-chat-composer__commands\"\n role=\"listbox\"\n aria-label={chatMessages().commands}\n >\n <For each={commandMatches()}>\n {(command, index) => (\n <button\n id={`${commandListId}-${index()}`}\n type=\"button\"\n role=\"option\"\n tabIndex={-1}\n aria-selected={index() === selectedCommandIndex()}\n aria-disabled={command.disabled}\n data-active={index() === selectedCommandIndex() ? \"true\" : undefined}\n onPointerDown={(event) => event.preventDefault()}\n onClick={() => void executeCommand(command)}\n >\n <i class={command.icon ?? \"ti ti-slash\"} aria-hidden=\"true\" />\n <strong>{command.label ?? `/${command.name}`}</strong>\n <small>{command.description}</small>\n </button>\n )}\n </For>\n <Show when={searching()}>\n <div role=\"status\" class=\"k2b-chat-composer__loading\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n <strong>{messages().loading}</strong>\n </div>\n </Show>\n <Show when={searchError()}>\n <div role=\"status\">\n <i class=\"ti ti-alert-circle\" /> {messages().error}\n </div>\n </Show>\n <Show when={!searching() && !searchError() && commandMatches().length === 0}>\n <div role=\"status\">{messages().noResults}</div>\n </Show>\n </div>\n </div>\n </Show>\n </div>\n </Show>\n <section\n ref={composerRef}\n class={`k2b-chat-composer ${props.class ?? \"\"}`}\n data-running={running() ? \"true\" : undefined}\n data-variant={conversation() ? \"conversation\" : undefined}\n role=\"group\"\n aria-label={props.label ?? chatMessages().messageComposer}\n >\n <Show when={showHint()}>\n <div class=\"k2b-chat-composer__hint\" aria-live=\"polite\">\n <Show when={dictationStatus()} fallback={<span class=\"k2b-chat-composer__hint-text\">{hint()}</span>}>\n {(status) => (\n <>\n <span class=\"k2b-chat-composer__dictation\" data-state={dictation() ?? undefined}>\n <i class={status().icon} aria-hidden=\"true\" />\n <span>{status().text}</span>\n </span>\n <Show when={dictation() === \"refined\" ? props.microphone?.onRestoreOriginal : undefined}>\n {(restore) => (\n <button\n type=\"button\"\n class=\"k2b-chat-composer__hint-action\"\n disabled={microphoneDisabled()}\n onMouseDown={keepFieldFocus}\n onClick={() => reportChatFailure(restore(), props.onError)}\n >\n {chatMessages().restoreOriginal}\n </button>\n )}\n </Show>\n </>\n )}\n </Show>\n </div>\n </Show>\n <Show when={attachments().length > 0}>\n <div class=\"k2b-chat-composer__attachments\" role=\"list\" aria-label={chatMessages().attachments} tabIndex={0}>\n <For each={attachments()}>\n {(attachment) => (\n <div class=\"k2b-chat-composer__attachment\" role=\"listitem\">\n <div\n class=\"k2b-chat-composer__attachment-content\"\n classList={{ \"k2b-chat-composer__attachment-content--action\": Boolean(attachment.action) }}\n >\n <Show\n when={attachment.href}\n fallback={\n <div class=\"k2b-chat-composer__attachment-identity\">\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img src={attachment.previewUrl} alt={attachment.alt ?? \"\"} />\n </Show>\n {renderAttachmentCopy(attachment)}\n </div>\n }\n >\n {(href) => (\n <a\n class=\"k2b-chat-composer__attachment-link\"\n href={href()}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={chatMessages().openInNewTab({ name: attachment.name })}\n >\n <Show\n when={attachment.kind === \"image\" && attachment.previewUrl}\n fallback={<i class={attachmentIcon(attachment)} aria-hidden=\"true\" />}\n >\n <img src={attachment.previewUrl} alt={attachment.alt ?? \"\"} />\n </Show>\n {renderAttachmentCopy(attachment)}\n </a>\n )}\n </Show>\n <Show when={attachment.action}>\n {(action) => (\n <button\n type=\"button\"\n class=\"k2b-chat-composer__attachment-action\"\n disabled={blocked() || action().disabled}\n onClick={() => reportChatFailure(() => executeChatAction(action()), props.onError)}\n >\n <Show when={action().icon}>{(icon) => <i class={icon()} aria-hidden=\"true\" />}</Show>\n {action().label}\n </button>\n )}\n </Show>\n </div>\n <Show when={props.onAttachmentsChange}>\n <button\n type=\"button\"\n class=\"k2b-chat-composer__attachment-remove\"\n aria-label={selectMessages().removeNamed({ name: attachment.name })}\n disabled={blocked()}\n onClick={() => setAttachments(attachments().filter((candidate) => candidate.id !== attachment.id))}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </button>\n </Show>\n </div>\n )}\n </For>\n </div>\n </Show>\n\n <Show\n when={conversation()}\n fallback={\n <>\n {field()}\n\n <Show when={props.error}>\n <div class=\"k2b-chat-composer__error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n {props.error}\n </div>\n </Show>\n\n {formatRow()}\n\n <footer class=\"k2b-chat-composer__footer\">\n <Show\n when={props.footerContent}\n fallback={\n <>\n <div class=\"k2b-chat-composer__tools\">\n {props.footerTools}\n <Show when={hasAddMenu()}>{addMenu(\"ti ti-plus\")}</Show>\n {fileInput()}\n {formatToggle()}\n {emojiButton()}\n <Show when={(props.models?.length ?? 0) > 0}>\n <SelectChip\n aria-label={chatMessages().chooseModel}\n position=\"top-right\"\n class=\"k2b-chat-composer__model\"\n menuWidth=\"15rem\"\n placeholder={chatMessages().model}\n value={() => props.selectedModelId ?? \"\"}\n options={(props.models ?? []).map((model) => ({\n value: model.id,\n label: model.label,\n description: model.description,\n icon: model.icon,\n image: model.image,\n }))}\n disabled={blocked() || running() || !props.onModelChange}\n onValueChange={(modelId) => {\n props.onModelChange?.(modelId);\n queueMicrotask(focus);\n }}\n />\n </Show>\n {props.modelDetails}\n </div>\n\n <div class=\"k2b-chat-composer__submit\">\n <For each={props.contextActions}>\n {(action) => (\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-chat-composer__icon-action\"\n data-tone={action.variant === \"danger\" ? \"danger\" : undefined}\n disabled={action.disabled}\n aria-pressed={action.pressed}\n aria-label={action.label}\n content={action.label}\n onClick={() => reportChatFailure(() => executeChatAction(action), props.onError)}\n >\n <i class={action.icon ?? \"ti ti-dots\"} aria-hidden=\"true\" />\n </Tooltip.Trigger>\n )}\n </For>\n <Show when={hasContextUsage() ? (props.contextUsage ?? {}) : undefined}>\n {(usage) => <ContextUsage {...usage()} action={props.contextPopupAction} onActionError={props.onError} />}\n </Show>\n {props.submitTools}\n {microphoneControl()}\n {sendControl()}\n </div>\n </>\n }\n >\n {(content) => content()}\n </Show>\n </footer>\n </>\n }\n >\n <Show when={props.error}>\n <div class=\"k2b-chat-composer__error\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n {props.error}\n </div>\n </Show>\n {formatRow()}\n {/* One row: attach, the field with its tools, and Send. */}\n <div class=\"k2b-chat-composer__row\">\n {attachControl()}\n {fileInput()}\n <div class=\"k2b-chat-composer__field\">\n {field()}\n <div class=\"k2b-chat-composer__field-tools\">\n {formatToggle()}\n {emojiButton()}\n {microphoneControl()}\n </div>\n </div>\n {sendControl()}\n </div>\n </Show>\n {/* Files dropped anywhere in the surrounding workspace area attach to the message. */}\n <Show when={props.fileSelection}>\n {(selection) => (\n <FileDropTarget\n label={chatMessages().dropFilesToAttach}\n accept={selection().accept}\n multiple={selection().multiple}\n disabled={!canSelectFiles()}\n onDrop={(files) => void runFiles(files)}\n />\n )}\n </Show>\n </section>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|