@k2b/ui 0.20.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/Button.js +20 -31
- package/dist/browser/actions/Button.js.map +1 -1
- package/dist/browser/actions/ContextMenu.js +10 -4
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/CopyButton.js +10 -8
- package/dist/browser/actions/CopyButton.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/GestureMenu.js +4 -0
- package/dist/browser/actions/GestureMenu.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 +1960 -575
- 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 +121 -0
- package/dist/browser/content/calendar-messages.js.map +1 -0
- package/dist/browser/content/calendar-month-layout.js +108 -0
- package/dist/browser/content/calendar-month-layout.js.map +1 -0
- 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/index.js.map +1 -1
- package/dist/browser/content/lightbox-messages.js +36 -0
- package/dist/browser/content/lightbox-messages.js.map +1 -0
- package/dist/browser/content/log-entries-messages.js +20 -0
- package/dist/browser/content/log-entries-messages.js.map +1 -0
- package/dist/browser/content/markdown-info-block-messages.js +24 -0
- package/dist/browser/content/markdown-info-block-messages.js.map +1 -0
- package/dist/browser/content/markdown-info-blocks.js +3 -3
- package/dist/browser/content/markdown-info-blocks.js.map +1 -1
- package/dist/browser/content/markdown-links.js +2 -2
- package/dist/browser/content/markdown-links.js.map +1 -1
- package/dist/browser/content/markdown-reference-messages.js +30 -0
- package/dist/browser/content/markdown-reference-messages.js.map +1 -0
- package/dist/browser/content/pagination-messages.js +38 -0
- package/dist/browser/content/pagination-messages.js.map +1 -0
- package/dist/browser/content/pdf-messages.js +43 -0
- package/dist/browser/content/pdf-messages.js.map +1 -0
- package/dist/browser/content/range-picker-messages.js +20 -0
- package/dist/browser/content/range-picker-messages.js.map +1 -0
- package/dist/browser/content/structured-data-messages.js +22 -0
- package/dist/browser/content/structured-data-messages.js.map +1 -0
- package/dist/browser/content/timeline-messages.js +62 -0
- package/dist/browser/content/timeline-messages.js.map +1 -0
- package/dist/browser/content/video-messages.js +24 -0
- package/dist/browser/content/video-messages.js.map +1 -0
- package/dist/browser/content/viewport-messages.js +28 -0
- package/dist/browser/content/viewport-messages.js.map +1 -0
- package/dist/browser/feedback/HoverPreview.js +34 -6
- package/dist/browser/feedback/HoverPreview.js.map +1 -1
- package/dist/browser/feedback/InstallGuide.js +18 -18
- package/dist/browser/feedback/InstallGuide.js.map +1 -1
- package/dist/browser/feedback/install-messages.js +104 -0
- package/dist/browser/feedback/install-messages.js.map +1 -0
- package/dist/browser/feedback/prompt-messages.js +65 -0
- package/dist/browser/feedback/prompt-messages.js.map +1 -0
- package/dist/browser/feedback/prompts.js +14 -11
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/feedback/toast-messages.js +18 -0
- package/dist/browser/feedback/toast-messages.js.map +1 -0
- package/dist/browser/feedback/toast.js +4 -3
- package/dist/browser/feedback/toast.js.map +1 -1
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/inputs/AutocompleteEditor.js +6 -4
- package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
- package/dist/browser/inputs/AutocompleteSelect.js +10 -8
- package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
- package/dist/browser/inputs/ChoiceGroups.js +4 -0
- package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
- package/dist/browser/inputs/ChoiceInputs.js +5 -5
- package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
- package/dist/browser/inputs/Combobox.js +3 -1
- package/dist/browser/inputs/Combobox.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +46 -10
- package/dist/browser/inputs/DatePicker.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/date-picker.js +24 -0
- package/dist/browser/inputs/date-picker.js.map +1 -1
- 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 +12 -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/Button.js +21 -32
- package/dist/ssr/actions/Button.js.map +1 -1
- package/dist/ssr/actions/ContextMenu.js +7 -3
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/CopyButton.js +9 -7
- package/dist/ssr/actions/CopyButton.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/GestureMenu.js +4 -0
- package/dist/ssr/actions/GestureMenu.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 +1232 -115
- 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 +121 -0
- package/dist/ssr/content/calendar-messages.js.map +1 -0
- package/dist/ssr/content/calendar-month-layout.js +108 -0
- package/dist/ssr/content/calendar-month-layout.js.map +1 -0
- 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/index.js.map +1 -1
- package/dist/ssr/content/lightbox-messages.js +36 -0
- package/dist/ssr/content/lightbox-messages.js.map +1 -0
- package/dist/ssr/content/log-entries-messages.js +20 -0
- package/dist/ssr/content/log-entries-messages.js.map +1 -0
- package/dist/ssr/content/markdown-info-block-messages.js +24 -0
- package/dist/ssr/content/markdown-info-block-messages.js.map +1 -0
- package/dist/ssr/content/markdown-info-blocks.js +3 -3
- package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
- package/dist/ssr/content/markdown-links.js +2 -2
- package/dist/ssr/content/markdown-links.js.map +1 -1
- package/dist/ssr/content/markdown-reference-messages.js +30 -0
- package/dist/ssr/content/markdown-reference-messages.js.map +1 -0
- package/dist/ssr/content/pagination-messages.js +38 -0
- package/dist/ssr/content/pagination-messages.js.map +1 -0
- package/dist/ssr/content/pdf-messages.js +43 -0
- package/dist/ssr/content/pdf-messages.js.map +1 -0
- package/dist/ssr/content/range-picker-messages.js +20 -0
- package/dist/ssr/content/range-picker-messages.js.map +1 -0
- package/dist/ssr/content/structured-data-messages.js +22 -0
- package/dist/ssr/content/structured-data-messages.js.map +1 -0
- package/dist/ssr/content/timeline-messages.js +62 -0
- package/dist/ssr/content/timeline-messages.js.map +1 -0
- package/dist/ssr/content/video-messages.js +24 -0
- package/dist/ssr/content/video-messages.js.map +1 -0
- package/dist/ssr/content/viewport-messages.js +28 -0
- package/dist/ssr/content/viewport-messages.js.map +1 -0
- package/dist/ssr/feedback/HoverPreview.js +34 -6
- package/dist/ssr/feedback/HoverPreview.js.map +1 -1
- package/dist/ssr/feedback/InstallGuide.js +18 -18
- package/dist/ssr/feedback/InstallGuide.js.map +1 -1
- package/dist/ssr/feedback/install-messages.js +104 -0
- package/dist/ssr/feedback/install-messages.js.map +1 -0
- package/dist/ssr/feedback/prompt-messages.js +65 -0
- package/dist/ssr/feedback/prompt-messages.js.map +1 -0
- package/dist/ssr/feedback/prompts.js +14 -11
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/feedback/toast-messages.js +18 -0
- package/dist/ssr/feedback/toast-messages.js.map +1 -0
- package/dist/ssr/feedback/toast.js +4 -3
- package/dist/ssr/feedback/toast.js.map +1 -1
- package/dist/ssr/index.js +1 -1
- package/dist/ssr/index.js.map +1 -1
- package/dist/ssr/inputs/AutocompleteEditor.js +5 -3
- package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
- package/dist/ssr/inputs/AutocompleteSelect.js +10 -8
- package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
- package/dist/ssr/inputs/ChoiceGroups.js +4 -0
- package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
- package/dist/ssr/inputs/ChoiceInputs.js +5 -5
- package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
- package/dist/ssr/inputs/Combobox.js +3 -1
- package/dist/ssr/inputs/Combobox.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +34 -4
- package/dist/ssr/inputs/DatePicker.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/date-picker.js +24 -0
- package/dist/ssr/inputs/date-picker.js.map +1 -1
- 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 +12 -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/GestureMenu.d.ts +2 -0
- package/dist/types/actions/filter-messages.d.ts +8 -0
- package/dist/types/actions/spotlight-messages.d.ts +8 -0
- package/dist/types/chat/chat-messages.d.ts +116 -0
- package/dist/types/content/Calendar.d.ts +32 -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 +60 -0
- package/dist/types/content/calendar-month-layout.d.ts +52 -0
- 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/index.d.ts +1 -1
- 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/date-picker.d.ts +7 -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 +6 -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":["feedback/toast.ts"],"sourcesContent":["import { getK2bPortalRoot } from \"../internal/portal\";\nimport { resolveUiMessages } from \"../intl/messages\";\nimport { announce, ensureLiveRegions } from \"./announce\";\n\nexport type ToastVariant = \"default\" | \"success\" | \"error\";\n\nexport type ToastAction = {\n label: string;\n} & ({ href: string } | { onClick: () => void });\n\nexport type ToastOptions = {\n variant?: ToastVariant;\n /** Milliseconds until the toast closes; `0` keeps it until it is closed. Omit it for the default by variant, length, and action. */\n duration?: number;\n iconClass?: string;\n /** A short line of context above the message. There is no default title. */\n title?: string;\n action?: ToastAction | null;\n /** Fraction from 0 to 1, or an indeterminate activity indicator. null removes it. */\n progress?: number | \"indeterminate\" | null;\n dismissLabel?: string;\n};\n\nexport type ToastHandle = {\n dismiss: () => void;\n update: (description: string, options?: ToastOptions) => void;\n};\n\nexport type ToastSlot = {\n dismiss: () => void;\n};\n\nexport interface ToastFn {\n (description: string, options?: ToastOptions): ToastHandle;\n success: (description: string, options?: Omit<ToastOptions, \"variant\">) => ToastHandle;\n error: (description: string, options?: Omit<ToastOptions, \"variant\">) => ToastHandle;\n /** Places an application-owned element in the toast rail, in toast chrome; the caller owns its content and lifetime. */\n custom: (content: HTMLElement) => ToastSlot;\n dismissAll: () => void;\n}\n\n/** Visible toasts on a wide viewport; the rail's narrow layout shows fewer. */\nconst MAX_VISIBLE_TOASTS = 3;\nconst MAX_VISIBLE_TOASTS_NARROW = 2;\n/** The same media query that moves the rail to the top edge in the stylesheet. */\nconst NARROW_RAIL_QUERY = \"(max-width: 47.999rem), (max-height: 29.999rem)\";\nconst ANIMATION_MS = 200;\n/** Reading time: a short message stays 4 s, longer text about 1 s more per 30 characters, up to 12 s. */\nconst READ_BASE_MS = 4_000;\nconst READ_FREE_CHARACTERS = 40;\nconst READ_MS_PER_CHARACTER = 35;\nconst READ_MAX_MS = 12_000;\n/** Errors and toasts with an action stay long enough to reach them with a keyboard or a screen magnifier. */\nconst REACHABLE_MS = 8_000;\n/** An error longer than this stays until it is closed, so it can be read and copied. */\nconst STICKY_ERROR_CHARACTERS = 120;\nexport const K2B_TOAST_CONTAINER_ID = \"k2b-ui-toast-container\";\nconst CONTAINER_ATTRIBUTE = \"data-k2b-toast-container\";\n\ntype VariantStyle = {\n tone: \"info\" | \"success\" | \"danger\";\n iconClass: string;\n};\n\nconst VARIANT_STYLES: Record<ToastVariant, VariantStyle> = {\n default: { tone: \"info\", iconClass: \"ti-info-circle\" },\n success: { tone: \"success\", iconClass: \"ti-circle-check\" },\n error: { tone: \"danger\", iconClass: \"ti-alert-circle\" },\n};\n\n/** How long a toast stays when the caller passes no duration. */\nconst defaultDuration = (variant: ToastVariant, text: string, hasAction: boolean): number => {\n if (variant === \"error\" && text.length > STICKY_ERROR_CHARACTERS) return 0;\n const reading = Math.min(READ_MAX_MS, READ_BASE_MS + Math.max(0, text.length - READ_FREE_CHARACTERS) * READ_MS_PER_CHARACTER);\n return variant === \"error\" || hasAction ? Math.max(REACHABLE_MS, reading) : reading;\n};\n\nconst normalizedIconClass = (iconClass: string): string => {\n const tokens = iconClass\n .split(/\\s+/)\n .filter(Boolean)\n .filter((token) => token !== \"ti\");\n return [\"ti\", ...tokens].join(\" \");\n};\n\nconst applyIconClass = (icon: HTMLElement, iconClass: string): void => {\n icon.className = normalizedIconClass(iconClass);\n};\n\ntype LiveToast = {\n dismiss: () => void;\n /** Errors, sticky toasts, and running progress stay when the rail is full; older timed confirmations leave first. */\n keep: () => boolean;\n progress: () => boolean;\n /** Under the pointer or holding keyboard focus: the rail limit never removes it. */\n held: () => boolean;\n pause: () => void;\n resume: () => void;\n};\n\nconst liveToasts = new Set<LiveToast>();\n\n/**\n * Cards under the pointer or holding keyboard focus. While the rail holds any, no toast times out, so nothing moves\n * under the pointer or out from under focus because a neighbour expired.\n */\nconst pointerHolds = new Set<HTMLElement>();\nconst focusHolds = new Set<HTMLElement>();\nconst railHeld = (): boolean => pointerHolds.size + focusHolds.size > 0;\n\n/**\n * Firefox and WebKit fire no focusout when a focused element leaves the document, and WebKit no pointerleave when\n * the hovered element inside a card is removed, as when custom content replaces a button or the rail's scope\n * unmounts. While anything holds the rail, a change to the document or the pointer moving onto something else\n * drops the holds that no longer apply, so one stale hold never freezes the rail.\n */\nconst releaseStaleHolds = (pointerTarget?: Node | null): void => {\n for (const card of Array.from(pointerHolds))\n if (!card.isConnected || (pointerTarget !== undefined && !card.contains(pointerTarget))) setHold(pointerHolds, card, false);\n for (const card of Array.from(focusHolds))\n if (!card.isConnected || !card.contains(card.ownerDocument.activeElement)) setHold(focusHolds, card, false);\n};\n\nconst watchStaleHolds = (doc: Document): (() => void) => {\n const observer = new MutationObserver(() => releaseStaleHolds());\n observer.observe(doc, { childList: true, subtree: true });\n const onPointerOver = (event: Event) => releaseStaleHolds(event.target instanceof Node ? event.target : null);\n doc.addEventListener(\"pointerover\", onPointerOver, true);\n return () => {\n observer.disconnect();\n doc.removeEventListener(\"pointerover\", onPointerOver, true);\n };\n};\nlet unwatchStaleHolds: (() => void) | null = null;\n\nfunction setHold(holds: Set<HTMLElement>, card: HTMLElement, held: boolean): void {\n const wasHeld = railHeld();\n if (held) holds.add(card);\n else holds.delete(card);\n if (railHeld() !== wasHeld) {\n for (const item of Array.from(liveToasts)) (wasHeld ? item.resume : item.pause)();\n unwatchStaleHolds?.();\n unwatchStaleHolds = wasHeld ? null : watchStaleHolds(card.ownerDocument);\n }\n // A released card may be the one the rail limit had to wait for.\n if (!held) enforceCap();\n}\n\nconst ensureContainer = (): HTMLElement | null => {\n if (typeof document === \"undefined\") return null;\n // The shared live regions exist before the first toast's text arrives.\n ensureLiveRegions(document);\n const root = getK2bPortalRoot();\n let container = root.querySelector<HTMLElement>(`[${CONTAINER_ATTRIBUTE}]`);\n if (container) return container;\n\n container = document.createElement(\"div\");\n container.id = K2B_TOAST_CONTAINER_ID;\n container.setAttribute(CONTAINER_ATTRIBUTE, \"\");\n container.setAttribute(\"popover\", \"manual\");\n container.setAttribute(\"role\", \"region\");\n container.setAttribute(\"aria-label\", resolveUiMessages().notifications);\n // Keep the source rail geometry inline: it must defeat UA popover defaults\n // even when a consumer has not loaded the optional package stylesheet yet.\n // The stylesheet only moves the rail to the top edge, and to the full width\n // of a phone, through the rail variables.\n container.style.cssText =\n \"position:fixed;left:var(--k2b-toast-rail-left,auto);right:env(safe-area-inset-right,0px);\" +\n \"top:var(--k2b-toast-rail-top,auto);bottom:var(--k2b-toast-rail-bottom,env(safe-area-inset-bottom,0px));\" +\n \"z-index:50;box-sizing:border-box;display:flex;flex-direction:var(--k2b-toast-rail-direction,column);\" +\n \"width:var(--k2b-toast-rail-width,min(24rem,calc(100vw - env(safe-area-inset-left,0px) - env(safe-area-inset-right,0px))));\" +\n \"height:auto;max-width:100vw;\" +\n \"max-height:calc(100dvh - env(safe-area-inset-top,0px) - var(--k2b-toast-offset-top,0px) - env(safe-area-inset-bottom,0px));\" +\n \"margin:0;padding:var(--k2b-toast-rail-padding,0.75rem 1rem);border:0;background:transparent;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;\" +\n \"pointer-events:none;\";\n root.appendChild(container);\n return container;\n};\n\n/** Moving nodes resets their scroll offsets and drops focus; a custom slot can hold a scrolled list or a focused control. */\nconst captureViewState = (container: HTMLElement) => {\n const focused =\n document.activeElement instanceof HTMLElement && container.contains(document.activeElement) ? document.activeElement : null;\n const scrolled = Array.from(container.querySelectorAll<HTMLElement>(\"*\"))\n .filter((element) => element.scrollTop || element.scrollLeft)\n .map((element) => [element, element.scrollTop, element.scrollLeft] as const);\n const railTop = container.scrollTop;\n return (rail: HTMLElement) => {\n rail.scrollTop = railTop;\n for (const [element, top, left] of scrolled) {\n element.scrollTop = top;\n element.scrollLeft = left;\n }\n if (focused?.isConnected && rail.contains(focused)) focused.focus({ preventScroll: true });\n };\n};\n\nconst promoteToTopLayer = (container: HTMLElement): HTMLElement => {\n if (typeof container.showPopover !== \"function\" || !container.isConnected) return container;\n let active = container;\n let restore: ((rail: HTMLElement) => void) | null = null;\n try {\n if (container.matches(\":popover-open\") || document.querySelector(\"dialog:modal\")) {\n restore = captureViewState(container);\n const next = container.cloneNode(false) as HTMLElement;\n while (container.firstChild) next.appendChild(container.firstChild);\n const root = container.parentElement ?? getK2bPortalRoot();\n container.remove();\n root.appendChild(next);\n active = next;\n }\n if (!active.matches(\":popover-open\")) active.showPopover();\n } catch {\n active.removeAttribute(\"popover\");\n }\n // Offsets apply only once the rail is rendered again, so after it is shown.\n restore?.(active);\n return active;\n};\n\n/** Close every empty rail so an emptied container does not linger in the top\n * layer. Rails are resolved at call time on purpose: `promoteToTopLayer`\n * swaps the element for a fresh clone, so a container captured when the toast\n * was created can already be detached by the time the toast is dismissed. */\nconst hideEmptyContainers = (): void => {\n if (typeof document === \"undefined\") return;\n for (const container of Array.from(document.querySelectorAll<HTMLElement>(`[${CONTAINER_ATTRIBUTE}]`))) {\n if (container.childElementCount > 0 || typeof container.hidePopover !== \"function\") continue;\n try {\n if (container.matches(\":popover-open\")) container.hidePopover();\n } catch {\n // Already hidden or disconnected.\n }\n }\n};\n\n/**\n * Every toast and custom slot sits in a slot that grows from and collapses to zero height, so its neighbours glide\n * instead of jumping when it arrives or leaves. The card carries the chrome and `data-open` / `data-closing`.\n */\ntype RailItem = {\n slot: HTMLElement;\n open: () => void;\n close: (onRemoved?: () => void) => void;\n};\n\nconst railItem = (card: HTMLElement): RailItem => {\n card.addEventListener(\"pointerenter\", () => setHold(pointerHolds, card, true));\n card.addEventListener(\"pointerleave\", () => setHold(pointerHolds, card, false));\n card.addEventListener(\"focusin\", () => setHold(focusHolds, card, true));\n card.addEventListener(\"focusout\", (event) => {\n if (!card.contains(event.relatedTarget as Node | null)) setHold(focusHolds, card, false);\n });\n const slot = document.createElement(\"div\");\n slot.className = \"k2b-toast-slot\";\n slot.dataset.state = \"entering\";\n const clip = document.createElement(\"div\");\n clip.className = \"k2b-toast-slot__clip\";\n clip.appendChild(card);\n slot.appendChild(clip);\n return {\n slot,\n open: () => {\n // The entering state must be laid out once before it changes, or nothing transitions.\n slot.getBoundingClientRect();\n requestAnimationFrame(() => {\n if (card.dataset.closing) return;\n slot.dataset.state = \"open\";\n card.dataset.open = \"true\";\n });\n },\n close: (onRemoved) => {\n slot.dataset.state = \"closing\";\n card.dataset.closing = \"true\";\n // A card that leaves under the pointer or with focus no longer holds the rail.\n if (pointerHolds.has(card)) setHold(pointerHolds, card, false);\n if (focusHolds.has(card)) setHold(focusHolds, card, false);\n setTimeout(() => {\n slot.remove();\n hideEmptyContainers();\n onRemoved?.();\n }, ANIMATION_MS);\n },\n };\n};\n\n/**\n * The rail is full: older timed confirmations leave first, then older errors and sticky toasts. Running progress, the\n * newest toast, and a toast under the pointer or with focus stay; the rail waits until they are released.\n */\nfunction enforceCap(): void {\n const narrow = typeof matchMedia === \"function\" && matchMedia(NARROW_RAIL_QUERY).matches;\n const cap = narrow ? MAX_VISIBLE_TOASTS_NARROW : MAX_VISIBLE_TOASTS;\n while (liveToasts.size > cap) {\n const older = Array.from(liveToasts)\n .slice(0, -1)\n .filter((item) => !item.held());\n const victim = older.find((item) => !item.keep()) ?? older.find((item) => !item.progress());\n if (!victim) return;\n victim.dismiss();\n }\n}\n\nconst showToast = (description: string, options?: ToastOptions): ToastHandle => {\n const initialContainer = ensureContainer();\n if (!initialContainer) {\n const noop = () => {};\n return { dismiss: noop, update: noop };\n }\n const messages = resolveUiMessages();\n const doc = initialContainer.ownerDocument;\n // Focus returns here when a focused toast closes and no other toast can take it.\n const opener =\n doc.activeElement instanceof HTMLElement && !doc.activeElement.closest(`[${CONTAINER_ATTRIBUTE}]`) ? doc.activeElement : null;\n\n let dismissed = false;\n let dismissTimer: ReturnType<typeof setTimeout> | null = null;\n let currentVariant: ToastVariant = options?.variant ?? \"default\";\n let currentProgress = options?.progress ?? null;\n let currentAction = options?.action ?? null;\n let explicitDuration = options?.duration;\n let remainingDuration = 0;\n let timerStartedAt = 0;\n let lastAnnouncement = \"\";\n\n const toastElement = doc.createElement(\"div\");\n toastElement.className = \"k2b-toast\";\n toastElement.dataset.tone = VARIANT_STYLES[currentVariant].tone;\n toastElement.dataset.k2bToast = \"\";\n\n const leadElement = doc.createElement(\"div\");\n leadElement.className = \"k2b-toast__icon\";\n leadElement.setAttribute(\"aria-hidden\", \"true\");\n const leadIconElement = doc.createElement(\"i\");\n leadElement.appendChild(leadIconElement);\n const renderLead = (iconClassOverride?: string) => {\n leadElement.dataset.tone = VARIANT_STYLES[currentVariant].tone;\n applyIconClass(leadIconElement, iconClassOverride ?? VARIANT_STYLES[currentVariant].iconClass);\n };\n renderLead(options?.iconClass);\n\n const contentElement = doc.createElement(\"div\");\n contentElement.className = \"k2b-toast__content\";\n const titleElement = doc.createElement(\"div\");\n titleElement.className = \"k2b-toast__title\";\n const renderTitle = (title: string | undefined) => {\n titleElement.textContent = title ?? \"\";\n titleElement.hidden = !title;\n };\n renderTitle(options?.title);\n const descriptionElement = doc.createElement(\"div\");\n descriptionElement.className = \"k2b-toast__description\";\n descriptionElement.textContent = description;\n contentElement.append(titleElement, descriptionElement);\n\n const closeButton = doc.createElement(\"button\");\n closeButton.type = \"button\";\n closeButton.className = \"k2b-toast__close\";\n closeButton.setAttribute(\"aria-label\", options?.dismissLabel ?? messages.dismissNotification);\n const closeIcon = doc.createElement(\"i\");\n closeIcon.className = \"ti ti-x\";\n closeIcon.setAttribute(\"aria-hidden\", \"true\");\n closeButton.appendChild(closeIcon);\n\n // Inside the content, so a titled progress toast can place the bar between its title and its summary line.\n const progressElement = doc.createElement(\"progress\");\n progressElement.className = \"k2b-toast__progress\";\n progressElement.max = 1;\n contentElement.appendChild(progressElement);\n\n toastElement.append(leadElement, contentElement, closeButton);\n const item = railItem(toastElement);\n\n const text = () => [titleElement.textContent, descriptionElement.textContent].filter(Boolean).join(\". \");\n const effectiveDuration = () => explicitDuration ?? defaultDuration(currentVariant, text(), currentAction !== null);\n /** The error word is read before the message; the action is left out. */\n const spoken = () => (currentVariant === \"error\" ? `${resolveUiMessages().error}: ${text()}` : text());\n const say = () => {\n lastAnnouncement = spoken();\n announce(lastAnnouncement, { politeness: currentVariant === \"error\" ? \"assertive\" : \"polite\" });\n };\n\n const clearDismissTimer = () => {\n if (dismissTimer === null) return;\n clearTimeout(dismissTimer);\n dismissTimer = null;\n };\n\n const pauseDismissTimer = () => {\n if (dismissTimer === null) return;\n remainingDuration = Math.max(0, remainingDuration - (Date.now() - timerStartedAt));\n clearDismissTimer();\n };\n\n const resumeDismissTimer = () => {\n if (dismissed || currentProgress !== null || remainingDuration <= 0 || railHeld() || doc.hidden) return;\n clearDismissTimer();\n timerStartedAt = Date.now();\n dismissTimer = setTimeout(() => dismiss(), remainingDuration);\n };\n\n const resetDismissTimer = () => {\n clearDismissTimer();\n remainingDuration = effectiveDuration();\n // A toast that stays until it is closed or its progress ends; a phone shell keeps the end of its content clear of it.\n if (remainingDuration === 0 || currentProgress !== null) toastElement.dataset.persistent = \"true\";\n else delete toastElement.dataset.persistent;\n resumeDismissTimer();\n };\n\n const onVisibilityChange = () => (doc.hidden ? pauseDismissTimer() : resumeDismissTimer());\n\n /** The close button of the nearest open toast in one direction, past neighbours that are still closing. */\n const nearestOpenClose = (step: (slot: Element) => Element | null): HTMLElement | null => {\n for (let slot = step(item.slot); slot; slot = step(slot)) {\n const button = slot.querySelector<HTMLElement>(\".k2b-toast:not([data-closing]) .k2b-toast__close\");\n if (button) return button;\n }\n return null;\n };\n\n /** A focused toast hands focus to its neighbour, or back to where the user was, instead of dropping it on the page. */\n const moveFocusAway = () => {\n if (!toastElement.contains(doc.activeElement)) return;\n const next = nearestOpenClose((slot) => slot.nextElementSibling) ?? nearestOpenClose((slot) => slot.previousElementSibling);\n const target = next ?? (opener?.isConnected ? opener : null);\n if (target) target.focus({ preventScroll: true });\n else (doc.activeElement as HTMLElement | null)?.blur();\n };\n\n const dismiss = () => {\n if (dismissed) return;\n dismissed = true;\n clearDismissTimer();\n liveToasts.delete(live);\n doc.removeEventListener(\"visibilitychange\", onVisibilityChange);\n moveFocusAway();\n item.close();\n };\n\n const renderProgress = () => {\n progressElement.hidden = currentProgress === null;\n toastElement.dataset.progress = String(currentProgress !== null);\n const title = titleElement.textContent;\n const summary = descriptionElement.textContent ?? \"\";\n progressElement.setAttribute(\"aria-label\", title || summary);\n // With a title, the message is the summary line under the bar (\"6 of 12 files\"), read instead of a bare percentage.\n if (typeof currentProgress === \"number\" && title && summary) progressElement.setAttribute(\"aria-valuetext\", summary);\n else progressElement.removeAttribute(\"aria-valuetext\");\n if (typeof currentProgress === \"number\")\n progressElement.value = Number.isFinite(currentProgress) ? Math.max(0, Math.min(1, currentProgress)) : 0;\n else progressElement.removeAttribute(\"value\");\n };\n renderProgress();\n\n let actionElement: HTMLAnchorElement | HTMLButtonElement | null = null;\n const createAction = (action: ToastAction): HTMLAnchorElement | HTMLButtonElement => {\n let element: HTMLAnchorElement | HTMLButtonElement;\n if (\"href\" in action) {\n element = doc.createElement(\"a\");\n element.href = action.href;\n } else {\n element = doc.createElement(\"button\");\n element.type = \"button\";\n }\n element.className = \"k2b-toast__action\";\n element.textContent = action.label;\n element.addEventListener(\"click\", () => {\n if (\"onClick\" in action) action.onClick();\n else dismiss();\n });\n return element;\n };\n const renderAction = (action: ToastAction | null | undefined) => {\n const previous = actionElement;\n currentAction = action ?? null;\n actionElement = action ? createAction(action) : null;\n if (actionElement) contentElement.appendChild(actionElement);\n // The keyboard stays in the toast, on the new action or the close button, instead of falling to the page.\n if (previous?.contains(doc.activeElement)) (actionElement ?? closeButton).focus({ preventScroll: true });\n previous?.remove();\n };\n renderAction(options?.action);\n\n const update = (nextDescription: string, nextOptions?: ToastOptions) => {\n if (dismissed) return;\n const has = (key: keyof ToastOptions) => nextOptions !== undefined && Object.prototype.hasOwnProperty.call(nextOptions, key);\n const previousProgress = currentProgress;\n descriptionElement.textContent = nextDescription;\n\n const variantChanged = nextOptions?.variant !== undefined && nextOptions.variant !== currentVariant;\n if (variantChanged) {\n currentVariant = nextOptions.variant!;\n toastElement.dataset.tone = VARIANT_STYLES[currentVariant].tone;\n renderLead(nextOptions.iconClass);\n } else if (nextOptions?.iconClass !== undefined) {\n applyIconClass(leadIconElement, nextOptions.iconClass);\n }\n\n if (has(\"title\")) renderTitle(nextOptions!.title);\n if (has(\"action\")) renderAction(nextOptions!.action);\n if (has(\"duration\")) explicitDuration = nextOptions!.duration;\n if (has(\"progress\")) currentProgress = nextOptions!.progress ?? null;\n if (nextOptions?.dismissLabel) closeButton.setAttribute(\"aria-label\", nextOptions.dismissLabel);\n renderProgress();\n resetDismissTimer();\n\n // Progress is announced at its start, half way, and its end, never at every step, and only with something new to say.\n // The comparison includes the error word, so a change to an error with the same text is still announced.\n const ticking = previousProgress !== null && currentProgress !== null;\n const halfway =\n typeof currentProgress === \"number\" && currentProgress >= 0.5 && !(typeof previousProgress === \"number\" && previousProgress >= 0.5);\n if ((!ticking || halfway || variantChanged) && spoken() !== lastAnnouncement) say();\n // Finished progress or a new duration can make this toast one the rail limit removes.\n enforceCap();\n };\n\n closeButton.addEventListener(\"click\", () => dismiss());\n toastElement.addEventListener(\"keydown\", (event) => {\n if (event.key !== \"Escape\" || event.defaultPrevented) return;\n event.preventDefault();\n event.stopPropagation();\n dismiss();\n });\n doc.addEventListener(\"visibilitychange\", onVisibilityChange);\n\n const handle: ToastHandle = { dismiss, update };\n const live: LiveToast = {\n dismiss,\n keep: () => currentVariant === \"error\" || currentProgress !== null || effectiveDuration() === 0,\n progress: () => currentProgress !== null,\n held: () => pointerHolds.has(toastElement) || focusHolds.has(toastElement),\n pause: pauseDismissTimer,\n resume: resumeDismissTimer,\n };\n liveToasts.add(live);\n promoteToTopLayer(initialContainer).appendChild(item.slot);\n item.open();\n say();\n enforceCap();\n resetDismissTimer();\n return handle;\n};\n\n/*\n * A custom slot shares the rail, chrome, and enter/leave motion with toasts, so it stacks beside them in the same\n * corner instead of covering them. It has no timer, close button, or live region of its own, and neither the\n * toast limit nor `dismissAll` removes it: the application that placed it decides when it goes.\n */\nconst showCustom = (content: HTMLElement): ToastSlot => {\n const initialContainer = ensureContainer();\n if (!initialContainer) return { dismiss: () => {} };\n let dismissed = false;\n const slotElement = document.createElement(\"div\");\n slotElement.className = \"k2b-toast\";\n slotElement.dataset.k2bToast = \"\";\n slotElement.dataset.custom = \"true\";\n // It stays until the application removes it, like a toast without a timer.\n slotElement.dataset.persistent = \"true\";\n slotElement.append(content);\n const item = railItem(slotElement);\n const dismiss = () => {\n if (dismissed) return;\n dismissed = true;\n item.close();\n };\n promoteToTopLayer(initialContainer).appendChild(item.slot);\n item.open();\n return { dismiss };\n};\n\nexport const isPointInsideToast = (x: number, y: number): boolean => {\n if (typeof document === \"undefined\") return false;\n for (const card of Array.from(document.querySelectorAll<HTMLElement>(`[${CONTAINER_ATTRIBUTE}] [data-k2b-toast]`))) {\n const rect = card.getBoundingClientRect();\n if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) return true;\n }\n return false;\n};\n\nconst toastFn = ((description: string, options?: ToastOptions) => showToast(description, options)) as ToastFn;\ntoastFn.success = (description, options) => showToast(description, { ...options, variant: \"success\" });\ntoastFn.error = (description, options) => showToast(description, { ...options, variant: \"error\" });\ntoastFn.custom = showCustom;\ntoastFn.dismissAll = () => {\n for (const item of Array.from(liveToasts)) item.dismiss();\n};\n\nexport const toast: ToastFn = toastFn;\n"],"mappings":"AAAA,SAAS,gBAAgB,QAAQ,oBAAoB;AACrD,SAAS,iBAAiB,QAAQ,kBAAkB;AACpD,SAAS,QAAQ,EAAE,iBAAiB,QAAQ,YAAY;AAuCxD;AACA,MAAM,kBAAkB,GAAG,CAAC;AAC5B,MAAM,yBAAyB,GAAG,CAAC;AACnC;AACA,MAAM,iBAAiB,GAAG,iDAAiD;AAC3E,MAAM,YAAY,GAAG,GAAG;AACxB;AACA,MAAM,YAAY,GAAG,KAAK;AAC1B,MAAM,oBAAoB,GAAG,EAAE;AAC/B,MAAM,qBAAqB,GAAG,EAAE;AAChC,MAAM,WAAW,GAAG,MAAM;AAC1B;AACA,MAAM,YAAY,GAAG,KAAK;AAC1B;AACA,MAAM,uBAAuB,GAAG,GAAG;AACnC,OAAO,MAAM,sBAAsB,GAAG,wBAAwB;AAC9D,MAAM,mBAAmB,GAAG,0BAA0B;AAOtD,MAAM,cAAkD,GAAG;EACzD,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM;IAAE,SAAS,EAAE;EAAiB,CAAC;EACtD,OAAO,EAAE;IAAE,IAAI,EAAE,SAAS;IAAE,SAAS,EAAE;EAAkB,CAAC;EAC1D,KAAK,EAAE;IAAE,IAAI,EAAE,QAAQ;IAAE,SAAS,EAAE;EAAkB;AACxD,CAAC;;AAED;AACA,MAAM,eAAe,GAAG,CAAC,OAAqB,EAAE,IAAY,EAAE,SAAkB,KAAa;EAC3F,IAAI,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,GAAG,uBAAuB,EAAE,OAAO,CAAC;EAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,oBAAoB,CAAC,GAAG,qBAAqB,CAAC;EAC7H,OAAO,OAAO,KAAK,OAAO,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,OAAO;AACrF,CAAC;AAED,MAAM,mBAAmB,GAAI,SAAiB,IAAa;EACzD,MAAM,MAAM,GAAG,SAAS,CACrB,KAAK,CAAC,KAAK,CAAC,CACZ,MAAM,CAAC,OAAO,CAAC,CACf,MAAM,CAAE,KAAK,IAAK,KAAK,KAAK,IAAI,CAAC;EACpC,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACpC,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,IAAiB,EAAE,SAAiB,KAAW;EACrE,IAAI,CAAC,SAAS,GAAG,mBAAmB,CAAC,SAAS,CAAC;AACjD,CAAC;AAaD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAY,CAAC;;AAEvC;AACA;AACA;AACA;AACA,MAAM,YAAY,GAAG,IAAI,GAAG,CAAc,CAAC;AAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAc,CAAC;AACzC,MAAM,QAAQ,GAAG,MAAe,YAAY,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,GAAG,CAAC;;AAEvE;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,iBAAiB,GAAI,aAA2B,IAAW;EAC/D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EACzC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAK,aAAa,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAE,EAAE,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC;EAC7H,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EACvC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC;AAC/G,CAAC;AAED,MAAM,eAAe,GAAI,GAAa,IAAmB;EACvD,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAM,iBAAiB,CAAC,CAAC,CAAC;EAChE,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE;IAAE,SAAS,EAAE,IAAI;IAAE,OAAO,EAAE;EAAK,CAAC,CAAC;EACzD,MAAM,aAAa,GAAI,KAAY,IAAK,iBAAiB,CAAC,KAAK,CAAC,MAAM,YAAY,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;EAC7G,GAAG,CAAC,gBAAgB,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;EACxD,OAAO,MAAM;IACX,QAAQ,CAAC,UAAU,CAAC,CAAC;IACrB,GAAG,CAAC,mBAAmB,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;EAC7D,CAAC;AACH,CAAC;AACD,IAAI,iBAAsC,GAAG,IAAI;AAEjD,SAAS,OAAO,CAAC,KAAuB,EAAE,IAAiB,EAAE,IAAa,EAAQ;EAChF,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC;EAC1B,IAAI,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KACrB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;EACvB,IAAI,QAAQ,CAAC,CAAC,KAAK,OAAO,EAAE;IAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IACjF,iBAAiB,GAAG,CAAC;IACrB,iBAAiB,GAAG,OAAO,GAAG,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC;EAC1E;EACA;EACA,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACzB;AAEA,MAAM,eAAe,GAAG,MAA0B;EAChD,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,OAAO,IAAI;EAChD;EACA,iBAAiB,CAAC,QAAQ,CAAC;EAC3B,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC;EAC/B,IAAI,SAAS,GAAG,IAAI,CAAC,aAAa,CAAc,IAAI,mBAAmB,GAAG,CAAC;EAC3E,IAAI,SAAS,EAAE,OAAO,SAAS;EAE/B,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;EACzC,SAAS,CAAC,EAAE,GAAG,sBAAsB;EACrC,SAAS,CAAC,YAAY,CAAC,mBAAmB,EAAE,EAAE,CAAC;EAC/C,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC;EAC3C,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;EACxC,SAAS,CAAC,YAAY,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC;EACvE;EACA;EACA;EACA;EACA,SAAS,CAAC,KAAK,CAAC,OAAO,GACrB,2FAA2F,GAC3F,yGAAyG,GACzG,sGAAsG,GACtG,4HAA4H,GAC5H,8BAA8B,GAC9B,6HAA6H,GAC7H,4JAA4J,GAC5J,sBAAsB;EACxB,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;EAC3B,OAAO,SAAS;AAClB,CAAC;;AAED;AACA,MAAM,gBAAgB,GAAI,SAAsB,IAAK;EACnD,MAAM,OAAO,GACX,QAAQ,CAAC,aAAa,YAAY,WAAW,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC,aAAa,GAAG,IAAI;EAC7H,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAc,GAAG,CAAC,CAAC,CACtE,MAAM,CAAE,OAAO,IAAK,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAC5D,GAAG,CAAE,OAAO,IAAK,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAU,CAAC;EAC9E,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS;EACnC,OAAQ,IAAiB,IAAK;IAC5B,IAAI,CAAC,SAAS,GAAG,OAAO;IACxB,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE;MAC3C,OAAO,CAAC,SAAS,GAAG,GAAG;MACvB,OAAO,CAAC,UAAU,GAAG,IAAI;IAC3B;IACA,IAAI,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC;MAAE,aAAa,EAAE;IAAK,CAAC,CAAC;EAC5F,CAAC;AACH,CAAC;AAED,MAAM,iBAAiB,GAAI,SAAsB,IAAkB;EACjE,IAAI,OAAO,SAAS,CAAC,WAAW,KAAK,UAAU,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,SAAS;EAC3F,IAAI,MAAM,GAAG,SAAS;EACtB,IAAI,OAA6C,GAAG,IAAI;EACxD,IAAI;IACF,IAAI,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE;MAChF,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC;MACrC,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,CAAgB;MACtD,OAAO,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC;MACnE,MAAM,IAAI,GAAG,SAAS,CAAC,aAAa,IAAI,gBAAgB,CAAC,CAAC;MAC1D,SAAS,CAAC,MAAM,CAAC,CAAC;MAClB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;MACtB,MAAM,GAAG,IAAI;IACf;IACA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;EAC5D,CAAC,CAAC,MAAM;IACN,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC;EACnC;EACA;EACA,OAAO,GAAG,MAAM,CAAC;EACjB,OAAO,MAAM;AACf,CAAC;;AAED;AACA;AACA;AACA;AACA,MAAM,mBAAmB,GAAG,MAAY;EACtC,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;EACrC,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAc,IAAI,mBAAmB,GAAG,CAAC,CAAC,EAAE;IACtG,IAAI,SAAS,CAAC,iBAAiB,GAAG,CAAC,IAAI,OAAO,SAAS,CAAC,WAAW,KAAK,UAAU,EAAE;IACpF,IAAI;MACF,IAAI,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IACjE,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;AACF,CAAC;;AAED;AACA;AACA;AACA;;AAOA,MAAM,QAAQ,GAAI,IAAiB,IAAe;EAChD,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;EAC9E,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;EAC/E,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;EACvE,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAG,KAAK,IAAK;IAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,aAA4B,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC;EAC1F,CAAC,CAAC;EACF,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;EAC1C,IAAI,CAAC,SAAS,GAAG,gBAAgB;EACjC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,UAAU;EAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;EAC1C,IAAI,CAAC,SAAS,GAAG,sBAAsB;EACvC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;EACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;EACtB,OAAO;IACL,IAAI;IACJ,IAAI,EAAE,MAAM;MACV;MACA,IAAI,CAAC,qBAAqB,CAAC,CAAC;MAC5B,qBAAqB,CAAC,MAAM;QAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;QAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,MAAM;QAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,MAAM;MAC5B,CAAC,CAAC;IACJ,CAAC;IACD,KAAK,EAAG,SAAS,IAAK;MACpB,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,SAAS;MAC9B,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,MAAM;MAC7B;MACA,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC;MAC9D,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC;MAC1D,UAAU,CAAC,MAAM;QACf,IAAI,CAAC,MAAM,CAAC,CAAC;QACb,mBAAmB,CAAC,CAAC;QACrB,SAAS,GAAG,CAAC;MACf,CAAC,EAAE,YAAY,CAAC;IAClB;EACF,CAAC;AACH,CAAC;;AAED;AACA;AACA;AACA;AACA,SAAS,UAAU,GAAS;EAC1B,MAAM,MAAM,GAAG,OAAO,UAAU,KAAK,UAAU,IAAI,UAAU,CAAC,iBAAiB,CAAC,CAAC,OAAO;EACxF,MAAM,GAAG,GAAG,MAAM,GAAG,yBAAyB,GAAG,kBAAkB;EACnE,OAAO,UAAU,CAAC,IAAI,GAAG,GAAG,EAAE;IAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CACjC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CACZ,MAAM,CAAE,IAAI,IAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAE,IAAI,IAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAE,IAAI,IAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3F,IAAI,CAAC,MAAM,EAAE;IACb,MAAM,CAAC,OAAO,CAAC,CAAC;EAClB;AACF;AAEA,MAAM,SAAS,GAAG,CAAC,WAAmB,EAAE,OAAsB,KAAkB;EAC9E,MAAM,gBAAgB,GAAG,eAAe,CAAC,CAAC;EAC1C,IAAI,CAAC,gBAAgB,EAAE;IACrB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC;IACrB,OAAO;MAAE,OAAO,EAAE,IAAI;MAAE,MAAM,EAAE;IAAK,CAAC;EACxC;EACA,MAAM,QAAQ,GAAG,iBAAiB,CAAC,CAAC;EACpC,MAAM,GAAG,GAAG,gBAAgB,CAAC,aAAa;EAC1C;EACA,MAAM,MAAM,GACV,GAAG,CAAC,aAAa,YAAY,WAAW,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,mBAAmB,GAAG,CAAC,GAAG,GAAG,CAAC,aAAa,GAAG,IAAI;EAE/H,IAAI,SAAS,GAAG,KAAK;EACrB,IAAI,YAAkD,GAAG,IAAI;EAC7D,IAAI,cAA4B,GAAG,OAAO,EAAE,OAAO,IAAI,SAAS;EAChE,IAAI,eAAe,GAAG,OAAO,EAAE,QAAQ,IAAI,IAAI;EAC/C,IAAI,aAAa,GAAG,OAAO,EAAE,MAAM,IAAI,IAAI;EAC3C,IAAI,gBAAgB,GAAG,OAAO,EAAE,QAAQ;EACxC,IAAI,iBAAiB,GAAG,CAAC;EACzB,IAAI,cAAc,GAAG,CAAC;EACtB,IAAI,gBAAgB,GAAG,EAAE;EAEzB,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC;EAC7C,YAAY,CAAC,SAAS,GAAG,WAAW;EACpC,YAAY,CAAC,OAAO,CAAC,IAAI,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC,IAAI;EAC/D,YAAY,CAAC,OAAO,CAAC,QAAQ,GAAG,EAAE;EAElC,MAAM,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC;EAC5C,WAAW,CAAC,SAAS,GAAG,iBAAiB;EACzC,WAAW,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;EAC/C,MAAM,eAAe,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC;EAC9C,WAAW,CAAC,WAAW,CAAC,eAAe,CAAC;EACxC,MAAM,UAAU,GAAI,iBAA0B,IAAK;IACjD,WAAW,CAAC,OAAO,CAAC,IAAI,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC,IAAI;IAC9D,cAAc,CAAC,eAAe,EAAE,iBAAiB,IAAI,cAAc,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC;EAChG,CAAC;EACD,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC;EAE9B,MAAM,cAAc,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC;EAC/C,cAAc,CAAC,SAAS,GAAG,oBAAoB;EAC/C,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC;EAC7C,YAAY,CAAC,SAAS,GAAG,kBAAkB;EAC3C,MAAM,WAAW,GAAI,KAAyB,IAAK;IACjD,YAAY,CAAC,WAAW,GAAG,KAAK,IAAI,EAAE;IACtC,YAAY,CAAC,MAAM,GAAG,CAAC,KAAK;EAC9B,CAAC;EACD,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC;EAC3B,MAAM,kBAAkB,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC;EACnD,kBAAkB,CAAC,SAAS,GAAG,wBAAwB;EACvD,kBAAkB,CAAC,WAAW,GAAG,WAAW;EAC5C,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,kBAAkB,CAAC;EAEvD,MAAM,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC;EAC/C,WAAW,CAAC,IAAI,GAAG,QAAQ;EAC3B,WAAW,CAAC,SAAS,GAAG,kBAAkB;EAC1C,WAAW,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,QAAQ,CAAC,mBAAmB,CAAC;EAC7F,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC;EACxC,SAAS,CAAC,SAAS,GAAG,SAAS;EAC/B,SAAS,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;EAC7C,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC;;EAElC;EACA,MAAM,eAAe,GAAG,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC;EACrD,eAAe,CAAC,SAAS,GAAG,qBAAqB;EACjD,eAAe,CAAC,GAAG,GAAG,CAAC;EACvB,cAAc,CAAC,WAAW,CAAC,eAAe,CAAC;EAE3C,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,CAAC;EAC7D,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC;EAEnC,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;EACxG,MAAM,iBAAiB,GAAG,MAAM,gBAAgB,IAAI,eAAe,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;EACnH;EACA,MAAM,MAAM,GAAG,MAAO,cAAc,KAAK,OAAO,GAAG,GAAG,iBAAiB,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAE;EACtG,MAAM,GAAG,GAAG,MAAM;IAChB,gBAAgB,GAAG,MAAM,CAAC,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE;MAAE,UAAU,EAAE,cAAc,KAAK,OAAO,GAAG,WAAW,GAAG;IAAS,CAAC,CAAC;EACjG,CAAC;EAED,MAAM,iBAAiB,GAAG,MAAM;IAC9B,IAAI,YAAY,KAAK,IAAI,EAAE;IAC3B,YAAY,CAAC,YAAY,CAAC;IAC1B,YAAY,GAAG,IAAI;EACrB,CAAC;EAED,MAAM,iBAAiB,GAAG,MAAM;IAC9B,IAAI,YAAY,KAAK,IAAI,EAAE;IAC3B,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC;IAClF,iBAAiB,CAAC,CAAC;EACrB,CAAC;EAED,MAAM,kBAAkB,GAAG,MAAM;IAC/B,IAAI,SAAS,IAAI,eAAe,KAAK,IAAI,IAAI,iBAAiB,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE;IACjG,iBAAiB,CAAC,CAAC;IACnB,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,YAAY,GAAG,UAAU,CAAC,MAAM,OAAO,CAAC,CAAC,EAAE,iBAAiB,CAAC;EAC/D,CAAC;EAED,MAAM,iBAAiB,GAAG,MAAM;IAC9B,iBAAiB,CAAC,CAAC;IACnB,iBAAiB,GAAG,iBAAiB,CAAC,CAAC;IACvC;IACA,IAAI,iBAAiB,KAAK,CAAC,IAAI,eAAe,KAAK,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,KAC7F,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU;IAC3C,kBAAkB,CAAC,CAAC;EACtB,CAAC;EAED,MAAM,kBAAkB,GAAG,MAAO,GAAG,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAE;;EAE1F;EACA,MAAM,gBAAgB,GAAI,IAAuC,IAAyB;IACxF,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE;MACxD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAc,kDAAkD,CAAC;MAClG,IAAI,MAAM,EAAE,OAAO,MAAM;IAC3B;IACA,OAAO,IAAI;EACb,CAAC;;EAED;EACA,MAAM,aAAa,GAAG,MAAM;IAC1B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;IAC/C,MAAM,IAAI,GAAG,gBAAgB,CAAE,IAAI,IAAK,IAAI,CAAC,kBAAkB,CAAC,IAAI,gBAAgB,CAAE,IAAI,IAAK,IAAI,CAAC,sBAAsB,CAAC;IAC3H,MAAM,MAAM,GAAG,IAAI,KAAK,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5D,IAAI,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;MAAE,aAAa,EAAE;IAAK,CAAC,CAAC,CAAC,KAC5C,GAAG,CAAC,aAAa,EAAyB,IAAI,CAAC,CAAC;EACxD,CAAC;EAED,MAAM,OAAO,GAAG,MAAM;IACpB,IAAI,SAAS,EAAE;IACf,SAAS,GAAG,IAAI;IAChB,iBAAiB,CAAC,CAAC;IACnB,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;IACvB,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAC/D,aAAa,CAAC,CAAC;IACf,IAAI,CAAC,KAAK,CAAC,CAAC;EACd,CAAC;EAED,MAAM,cAAc,GAAG,MAAM;IAC3B,eAAe,CAAC,MAAM,GAAG,eAAe,KAAK,IAAI;IACjD,YAAY,CAAC,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,eAAe,KAAK,IAAI,CAAC;IAChE,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW;IACtC,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,IAAI,EAAE;IACpD,eAAe,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,IAAI,OAAO,CAAC;IAC5D;IACA,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,KAAK,IAAI,OAAO,EAAE,eAAe,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,KAChH,eAAe,CAAC,eAAe,CAAC,gBAAgB,CAAC;IACtD,IAAI,OAAO,eAAe,KAAK,QAAQ,EACrC,eAAe,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,KACtG,eAAe,CAAC,eAAe,CAAC,OAAO,CAAC;EAC/C,CAAC;EACD,cAAc,CAAC,CAAC;EAEhB,IAAI,aAA2D,GAAG,IAAI;EACtE,MAAM,YAAY,GAAI,MAAmB,IAA4C;IACnF,IAAI,OAA8C;IAClD,IAAI,MAAM,IAAI,MAAM,EAAE;MACpB,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC;MAChC,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;IAC5B,CAAC,MAAM;MACL,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC;MACrC,OAAO,CAAC,IAAI,GAAG,QAAQ;IACzB;IACA,OAAO,CAAC,SAAS,GAAG,mBAAmB;IACvC,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK;IAClC,OAAO,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM;MACtC,IAAI,SAAS,IAAI,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KACrC,OAAO,CAAC,CAAC;IAChB,CAAC,CAAC;IACF,OAAO,OAAO;EAChB,CAAC;EACD,MAAM,YAAY,GAAI,MAAsC,IAAK;IAC/D,MAAM,QAAQ,GAAG,aAAa;IAC9B,aAAa,GAAG,MAAM,IAAI,IAAI;IAC9B,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,IAAI;IACpD,IAAI,aAAa,EAAE,cAAc,CAAC,WAAW,CAAC,aAAa,CAAC;IAC5D;IACA,IAAI,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,aAAa,IAAI,WAAW,EAAE,KAAK,CAAC;MAAE,aAAa,EAAE;IAAK,CAAC,CAAC;IACxG,QAAQ,EAAE,MAAM,CAAC,CAAC;EACpB,CAAC;EACD,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC;EAE7B,MAAM,MAAM,GAAG,CAAC,eAAuB,EAAE,WAA0B,KAAK;IACtE,IAAI,SAAS,EAAE;IACf,MAAM,GAAG,GAAI,GAAuB,IAAK,WAAW,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC;IAC5H,MAAM,gBAAgB,GAAG,eAAe;IACxC,kBAAkB,CAAC,WAAW,GAAG,eAAe;IAEhD,MAAM,cAAc,GAAG,WAAW,EAAE,OAAO,KAAK,SAAS,IAAI,WAAW,CAAC,OAAO,KAAK,cAAc;IACnG,IAAI,cAAc,EAAE;MAClB,cAAc,GAAG,WAAW,CAAC,OAAQ;MACrC,YAAY,CAAC,OAAO,CAAC,IAAI,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC,IAAI;MAC/D,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC;IACnC,CAAC,MAAM,IAAI,WAAW,EAAE,SAAS,KAAK,SAAS,EAAE;MAC/C,cAAc,CAAC,eAAe,EAAE,WAAW,CAAC,SAAS,CAAC;IACxD;IAEA,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,WAAW,CAAE,KAAK,CAAC;IACjD,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,WAAW,CAAE,MAAM,CAAC;IACpD,IAAI,GAAG,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,WAAW,CAAE,QAAQ;IAC7D,IAAI,GAAG,CAAC,UAAU,CAAC,EAAE,eAAe,GAAG,WAAW,CAAE,QAAQ,IAAI,IAAI;IACpE,IAAI,WAAW,EAAE,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC;IAC/F,cAAc,CAAC,CAAC;IAChB,iBAAiB,CAAC,CAAC;;IAEnB;IACA;IACA,MAAM,OAAO,GAAG,gBAAgB,KAAK,IAAI,IAAI,eAAe,KAAK,IAAI;IACrE,MAAM,OAAO,GACX,OAAO,eAAe,KAAK,QAAQ,IAAI,eAAe,IAAI,GAAG,IAAI,EAAE,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,IAAI,GAAG,CAAC;IACrI,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,IAAI,cAAc,KAAK,MAAM,CAAC,CAAC,KAAK,gBAAgB,EAAE,GAAG,CAAC,CAAC;IACnF;IACA,UAAU,CAAC,CAAC;EACd,CAAC;EAED,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC;EACtD,YAAY,CAAC,gBAAgB,CAAC,SAAS,EAAG,KAAK,IAAK;IAClD,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,gBAAgB,EAAE;IACtD,KAAK,CAAC,cAAc,CAAC,CAAC;IACtB,KAAK,CAAC,eAAe,CAAC,CAAC;IACvB,OAAO,CAAC,CAAC;EACX,CAAC,CAAC;EACF,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;EAE5D,MAAM,MAAmB,GAAG;IAAE,OAAO;IAAE;EAAO,CAAC;EAC/C,MAAM,IAAe,GAAG;IACtB,OAAO;IACP,IAAI,EAAE,MAAM,cAAc,KAAK,OAAO,IAAI,eAAe,KAAK,IAAI,IAAI,iBAAiB,CAAC,CAAC,KAAK,CAAC;IAC/F,QAAQ,EAAE,MAAM,eAAe,KAAK,IAAI;IACxC,IAAI,EAAE,MAAM,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC;IAC1E,KAAK,EAAE,iBAAiB;IACxB,MAAM,EAAE;EACV,CAAC;EACD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;EACpB,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;EAC1D,IAAI,CAAC,IAAI,CAAC,CAAC;EACX,GAAG,CAAC,CAAC;EACL,UAAU,CAAC,CAAC;EACZ,iBAAiB,CAAC,CAAC;EACnB,OAAO,MAAM;AACf,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA,MAAM,UAAU,GAAI,OAAoB,IAAgB;EACtD,MAAM,gBAAgB,GAAG,eAAe,CAAC,CAAC;EAC1C,IAAI,CAAC,gBAAgB,EAAE,OAAO;IAAE,OAAO,EAAE,MAAM,CAAC;EAAE,CAAC;EACnD,IAAI,SAAS,GAAG,KAAK;EACrB,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;EACjD,WAAW,CAAC,SAAS,GAAG,WAAW;EACnC,WAAW,CAAC,OAAO,CAAC,QAAQ,GAAG,EAAE;EACjC,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM;EACnC;EACA,WAAW,CAAC,OAAO,CAAC,UAAU,GAAG,MAAM;EACvC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;EAC3B,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,CAAC;EAClC,MAAM,OAAO,GAAG,MAAM;IACpB,IAAI,SAAS,EAAE;IACf,SAAS,GAAG,IAAI;IAChB,IAAI,CAAC,KAAK,CAAC,CAAC;EACd,CAAC;EACD,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;EAC1D,IAAI,CAAC,IAAI,CAAC,CAAC;EACX,OAAO;IAAE;EAAQ,CAAC;AACpB,CAAC;AAED,OAAO,MAAM,kBAAkB,GAAG,CAAC,CAAS,EAAE,CAAS,KAAc;EACnE,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,OAAO,KAAK;EACjD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAc,IAAI,mBAAmB,oBAAoB,CAAC,CAAC,EAAE;IAClH,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI;EACzF;EACA,OAAO,KAAK;AACd,CAAC;AAED,MAAM,OAAO,GAAI,CAAC,WAAmB,EAAE,OAAsB,KAAK,SAAS,CAAC,WAAW,EAAE,OAAO,CAAa;AAC7G,OAAO,CAAC,OAAO,GAAG,CAAC,WAAW,EAAE,OAAO,KAAK,SAAS,CAAC,WAAW,EAAE;EAAE,GAAG,OAAO;EAAE,OAAO,EAAE;AAAU,CAAC,CAAC;AACtG,OAAO,CAAC,KAAK,GAAG,CAAC,WAAW,EAAE,OAAO,KAAK,SAAS,CAAC,WAAW,EAAE;EAAE,GAAG,OAAO;EAAE,OAAO,EAAE;AAAQ,CAAC,CAAC;AAClG,OAAO,CAAC,MAAM,GAAG,UAAU;AAC3B,OAAO,CAAC,UAAU,GAAG,MAAM;EACzB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,OAAO,MAAM,KAAc,GAAG,OAAO","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["feedback/toast.ts"],"sourcesContent":["import { getK2bPortalRoot } from \"../internal/portal\";\nimport { resolveUiMessages } from \"../intl/messages\";\nimport { announce, ensureLiveRegions } from \"./announce\";\nimport { resolveToastMessages } from \"./toast-messages\";\n\nexport type ToastVariant = \"default\" | \"success\" | \"error\";\n\nexport type ToastAction = {\n label: string;\n} & ({ href: string } | { onClick: () => void });\n\nexport type ToastOptions = {\n variant?: ToastVariant;\n /** Milliseconds until the toast closes; `0` keeps it until it is closed. Omit it for the default by variant, length, and action. */\n duration?: number;\n iconClass?: string;\n /** A short line of context above the message. There is no default title. */\n title?: string;\n action?: ToastAction | null;\n /** Fraction from 0 to 1, or an indeterminate activity indicator. null removes it. */\n progress?: number | \"indeterminate\" | null;\n dismissLabel?: string;\n};\n\nexport type ToastHandle = {\n dismiss: () => void;\n update: (description: string, options?: ToastOptions) => void;\n};\n\nexport type ToastSlot = {\n dismiss: () => void;\n};\n\nexport interface ToastFn {\n (description: string, options?: ToastOptions): ToastHandle;\n success: (description: string, options?: Omit<ToastOptions, \"variant\">) => ToastHandle;\n error: (description: string, options?: Omit<ToastOptions, \"variant\">) => ToastHandle;\n /** Places an application-owned element in the toast rail, in toast chrome; the caller owns its content and lifetime. */\n custom: (content: HTMLElement) => ToastSlot;\n dismissAll: () => void;\n}\n\n/** Visible toasts on a wide viewport; the rail's narrow layout shows fewer. */\nconst MAX_VISIBLE_TOASTS = 3;\nconst MAX_VISIBLE_TOASTS_NARROW = 2;\n/** The same media query that moves the rail to the top edge in the stylesheet. */\nconst NARROW_RAIL_QUERY = \"(max-width: 47.999rem), (max-height: 29.999rem)\";\nconst ANIMATION_MS = 200;\n/** Reading time: a short message stays 4 s, longer text about 1 s more per 30 characters, up to 12 s. */\nconst READ_BASE_MS = 4_000;\nconst READ_FREE_CHARACTERS = 40;\nconst READ_MS_PER_CHARACTER = 35;\nconst READ_MAX_MS = 12_000;\n/** Errors and toasts with an action stay long enough to reach them with a keyboard or a screen magnifier. */\nconst REACHABLE_MS = 8_000;\n/** An error longer than this stays until it is closed, so it can be read and copied. */\nconst STICKY_ERROR_CHARACTERS = 120;\nexport const K2B_TOAST_CONTAINER_ID = \"k2b-ui-toast-container\";\nconst CONTAINER_ATTRIBUTE = \"data-k2b-toast-container\";\n\ntype VariantStyle = {\n tone: \"info\" | \"success\" | \"danger\";\n iconClass: string;\n};\n\nconst VARIANT_STYLES: Record<ToastVariant, VariantStyle> = {\n default: { tone: \"info\", iconClass: \"ti-info-circle\" },\n success: { tone: \"success\", iconClass: \"ti-circle-check\" },\n error: { tone: \"danger\", iconClass: \"ti-alert-circle\" },\n};\n\n/** How long a toast stays when the caller passes no duration. */\nconst defaultDuration = (variant: ToastVariant, text: string, hasAction: boolean): number => {\n if (variant === \"error\" && text.length > STICKY_ERROR_CHARACTERS) return 0;\n const reading = Math.min(READ_MAX_MS, READ_BASE_MS + Math.max(0, text.length - READ_FREE_CHARACTERS) * READ_MS_PER_CHARACTER);\n return variant === \"error\" || hasAction ? Math.max(REACHABLE_MS, reading) : reading;\n};\n\nconst normalizedIconClass = (iconClass: string): string => {\n const tokens = iconClass\n .split(/\\s+/)\n .filter(Boolean)\n .filter((token) => token !== \"ti\");\n return [\"ti\", ...tokens].join(\" \");\n};\n\nconst applyIconClass = (icon: HTMLElement, iconClass: string): void => {\n icon.className = normalizedIconClass(iconClass);\n};\n\ntype LiveToast = {\n dismiss: () => void;\n /** Errors, sticky toasts, and running progress stay when the rail is full; older timed confirmations leave first. */\n keep: () => boolean;\n progress: () => boolean;\n /** Under the pointer or holding keyboard focus: the rail limit never removes it. */\n held: () => boolean;\n pause: () => void;\n resume: () => void;\n};\n\nconst liveToasts = new Set<LiveToast>();\n\n/**\n * Cards under the pointer or holding keyboard focus. While the rail holds any, no toast times out, so nothing moves\n * under the pointer or out from under focus because a neighbour expired.\n */\nconst pointerHolds = new Set<HTMLElement>();\nconst focusHolds = new Set<HTMLElement>();\nconst railHeld = (): boolean => pointerHolds.size + focusHolds.size > 0;\n\n/**\n * Firefox and WebKit fire no focusout when a focused element leaves the document, and WebKit no pointerleave when\n * the hovered element inside a card is removed, as when custom content replaces a button or the rail's scope\n * unmounts. While anything holds the rail, a change to the document or the pointer moving onto something else\n * drops the holds that no longer apply, so one stale hold never freezes the rail.\n */\nconst releaseStaleHolds = (pointerTarget?: Node | null): void => {\n for (const card of Array.from(pointerHolds))\n if (!card.isConnected || (pointerTarget !== undefined && !card.contains(pointerTarget))) setHold(pointerHolds, card, false);\n for (const card of Array.from(focusHolds))\n if (!card.isConnected || !card.contains(card.ownerDocument.activeElement)) setHold(focusHolds, card, false);\n};\n\nconst watchStaleHolds = (doc: Document): (() => void) => {\n const observer = new MutationObserver(() => releaseStaleHolds());\n observer.observe(doc, { childList: true, subtree: true });\n const onPointerOver = (event: Event) => releaseStaleHolds(event.target instanceof Node ? event.target : null);\n doc.addEventListener(\"pointerover\", onPointerOver, true);\n return () => {\n observer.disconnect();\n doc.removeEventListener(\"pointerover\", onPointerOver, true);\n };\n};\nlet unwatchStaleHolds: (() => void) | null = null;\n\nfunction setHold(holds: Set<HTMLElement>, card: HTMLElement, held: boolean): void {\n const wasHeld = railHeld();\n if (held) holds.add(card);\n else holds.delete(card);\n if (railHeld() !== wasHeld) {\n for (const item of Array.from(liveToasts)) (wasHeld ? item.resume : item.pause)();\n unwatchStaleHolds?.();\n unwatchStaleHolds = wasHeld ? null : watchStaleHolds(card.ownerDocument);\n }\n // A released card may be the one the rail limit had to wait for.\n if (!held) enforceCap();\n}\n\nconst ensureContainer = (): HTMLElement | null => {\n if (typeof document === \"undefined\") return null;\n // The shared live regions exist before the first toast's text arrives.\n ensureLiveRegions(document);\n const root = getK2bPortalRoot();\n let container = root.querySelector<HTMLElement>(`[${CONTAINER_ATTRIBUTE}]`);\n if (container) return container;\n\n container = document.createElement(\"div\");\n container.id = K2B_TOAST_CONTAINER_ID;\n container.setAttribute(CONTAINER_ATTRIBUTE, \"\");\n container.setAttribute(\"popover\", \"manual\");\n container.setAttribute(\"role\", \"region\");\n container.setAttribute(\"aria-label\", resolveToastMessages().notifications);\n // Keep the source rail geometry inline: it must defeat UA popover defaults\n // even when a consumer has not loaded the optional package stylesheet yet.\n // The stylesheet only moves the rail to the top edge, and to the full width\n // of a phone, through the rail variables.\n container.style.cssText =\n \"position:fixed;left:var(--k2b-toast-rail-left,auto);right:env(safe-area-inset-right,0px);\" +\n \"top:var(--k2b-toast-rail-top,auto);bottom:var(--k2b-toast-rail-bottom,env(safe-area-inset-bottom,0px));\" +\n \"z-index:50;box-sizing:border-box;display:flex;flex-direction:var(--k2b-toast-rail-direction,column);\" +\n \"width:var(--k2b-toast-rail-width,min(24rem,calc(100vw - env(safe-area-inset-left,0px) - env(safe-area-inset-right,0px))));\" +\n \"height:auto;max-width:100vw;\" +\n \"max-height:calc(100dvh - env(safe-area-inset-top,0px) - var(--k2b-toast-offset-top,0px) - env(safe-area-inset-bottom,0px));\" +\n \"margin:0;padding:var(--k2b-toast-rail-padding,0.75rem 1rem);border:0;background:transparent;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;\" +\n \"pointer-events:none;\";\n root.appendChild(container);\n return container;\n};\n\n/** Moving nodes resets their scroll offsets and drops focus; a custom slot can hold a scrolled list or a focused control. */\nconst captureViewState = (container: HTMLElement) => {\n const focused =\n document.activeElement instanceof HTMLElement && container.contains(document.activeElement) ? document.activeElement : null;\n const scrolled = Array.from(container.querySelectorAll<HTMLElement>(\"*\"))\n .filter((element) => element.scrollTop || element.scrollLeft)\n .map((element) => [element, element.scrollTop, element.scrollLeft] as const);\n const railTop = container.scrollTop;\n return (rail: HTMLElement) => {\n rail.scrollTop = railTop;\n for (const [element, top, left] of scrolled) {\n element.scrollTop = top;\n element.scrollLeft = left;\n }\n if (focused?.isConnected && rail.contains(focused)) focused.focus({ preventScroll: true });\n };\n};\n\nconst promoteToTopLayer = (container: HTMLElement): HTMLElement => {\n if (typeof container.showPopover !== \"function\" || !container.isConnected) return container;\n let active = container;\n let restore: ((rail: HTMLElement) => void) | null = null;\n try {\n if (container.matches(\":popover-open\") || document.querySelector(\"dialog:modal\")) {\n restore = captureViewState(container);\n const next = container.cloneNode(false) as HTMLElement;\n while (container.firstChild) next.appendChild(container.firstChild);\n const root = container.parentElement ?? getK2bPortalRoot();\n container.remove();\n root.appendChild(next);\n active = next;\n }\n if (!active.matches(\":popover-open\")) active.showPopover();\n } catch {\n active.removeAttribute(\"popover\");\n }\n // Offsets apply only once the rail is rendered again, so after it is shown.\n restore?.(active);\n return active;\n};\n\n/** Close every empty rail so an emptied container does not linger in the top\n * layer. Rails are resolved at call time on purpose: `promoteToTopLayer`\n * swaps the element for a fresh clone, so a container captured when the toast\n * was created can already be detached by the time the toast is dismissed. */\nconst hideEmptyContainers = (): void => {\n if (typeof document === \"undefined\") return;\n for (const container of Array.from(document.querySelectorAll<HTMLElement>(`[${CONTAINER_ATTRIBUTE}]`))) {\n if (container.childElementCount > 0 || typeof container.hidePopover !== \"function\") continue;\n try {\n if (container.matches(\":popover-open\")) container.hidePopover();\n } catch {\n // Already hidden or disconnected.\n }\n }\n};\n\n/**\n * Every toast and custom slot sits in a slot that grows from and collapses to zero height, so its neighbours glide\n * instead of jumping when it arrives or leaves. The card carries the chrome and `data-open` / `data-closing`.\n */\ntype RailItem = {\n slot: HTMLElement;\n open: () => void;\n close: (onRemoved?: () => void) => void;\n};\n\nconst railItem = (card: HTMLElement): RailItem => {\n card.addEventListener(\"pointerenter\", () => setHold(pointerHolds, card, true));\n card.addEventListener(\"pointerleave\", () => setHold(pointerHolds, card, false));\n card.addEventListener(\"focusin\", () => setHold(focusHolds, card, true));\n card.addEventListener(\"focusout\", (event) => {\n if (!card.contains(event.relatedTarget as Node | null)) setHold(focusHolds, card, false);\n });\n const slot = document.createElement(\"div\");\n slot.className = \"k2b-toast-slot\";\n slot.dataset.state = \"entering\";\n const clip = document.createElement(\"div\");\n clip.className = \"k2b-toast-slot__clip\";\n clip.appendChild(card);\n slot.appendChild(clip);\n return {\n slot,\n open: () => {\n // The entering state must be laid out once before it changes, or nothing transitions.\n slot.getBoundingClientRect();\n requestAnimationFrame(() => {\n if (card.dataset.closing) return;\n slot.dataset.state = \"open\";\n card.dataset.open = \"true\";\n });\n },\n close: (onRemoved) => {\n slot.dataset.state = \"closing\";\n card.dataset.closing = \"true\";\n // A card that leaves under the pointer or with focus no longer holds the rail.\n if (pointerHolds.has(card)) setHold(pointerHolds, card, false);\n if (focusHolds.has(card)) setHold(focusHolds, card, false);\n setTimeout(() => {\n slot.remove();\n hideEmptyContainers();\n onRemoved?.();\n }, ANIMATION_MS);\n },\n };\n};\n\n/**\n * The rail is full: older timed confirmations leave first, then older errors and sticky toasts. Running progress, the\n * newest toast, and a toast under the pointer or with focus stay; the rail waits until they are released.\n */\nfunction enforceCap(): void {\n const narrow = typeof matchMedia === \"function\" && matchMedia(NARROW_RAIL_QUERY).matches;\n const cap = narrow ? MAX_VISIBLE_TOASTS_NARROW : MAX_VISIBLE_TOASTS;\n while (liveToasts.size > cap) {\n const older = Array.from(liveToasts)\n .slice(0, -1)\n .filter((item) => !item.held());\n const victim = older.find((item) => !item.keep()) ?? older.find((item) => !item.progress());\n if (!victim) return;\n victim.dismiss();\n }\n}\n\nconst showToast = (description: string, options?: ToastOptions): ToastHandle => {\n const initialContainer = ensureContainer();\n if (!initialContainer) {\n const noop = () => {};\n return { dismiss: noop, update: noop };\n }\n const toastMessages = resolveToastMessages();\n const doc = initialContainer.ownerDocument;\n // Focus returns here when a focused toast closes and no other toast can take it.\n const opener =\n doc.activeElement instanceof HTMLElement && !doc.activeElement.closest(`[${CONTAINER_ATTRIBUTE}]`) ? doc.activeElement : null;\n\n let dismissed = false;\n let dismissTimer: ReturnType<typeof setTimeout> | null = null;\n let currentVariant: ToastVariant = options?.variant ?? \"default\";\n let currentProgress = options?.progress ?? null;\n let currentAction = options?.action ?? null;\n let explicitDuration = options?.duration;\n let remainingDuration = 0;\n let timerStartedAt = 0;\n let lastAnnouncement = \"\";\n\n const toastElement = doc.createElement(\"div\");\n toastElement.className = \"k2b-toast\";\n toastElement.dataset.tone = VARIANT_STYLES[currentVariant].tone;\n toastElement.dataset.k2bToast = \"\";\n\n const leadElement = doc.createElement(\"div\");\n leadElement.className = \"k2b-toast__icon\";\n leadElement.setAttribute(\"aria-hidden\", \"true\");\n const leadIconElement = doc.createElement(\"i\");\n leadElement.appendChild(leadIconElement);\n const renderLead = (iconClassOverride?: string) => {\n leadElement.dataset.tone = VARIANT_STYLES[currentVariant].tone;\n applyIconClass(leadIconElement, iconClassOverride ?? VARIANT_STYLES[currentVariant].iconClass);\n };\n renderLead(options?.iconClass);\n\n const contentElement = doc.createElement(\"div\");\n contentElement.className = \"k2b-toast__content\";\n const titleElement = doc.createElement(\"div\");\n titleElement.className = \"k2b-toast__title\";\n const renderTitle = (title: string | undefined) => {\n titleElement.textContent = title ?? \"\";\n titleElement.hidden = !title;\n };\n renderTitle(options?.title);\n const descriptionElement = doc.createElement(\"div\");\n descriptionElement.className = \"k2b-toast__description\";\n descriptionElement.textContent = description;\n contentElement.append(titleElement, descriptionElement);\n\n const closeButton = doc.createElement(\"button\");\n closeButton.type = \"button\";\n closeButton.className = \"k2b-toast__close\";\n closeButton.setAttribute(\"aria-label\", options?.dismissLabel ?? toastMessages.dismissNotification);\n const closeIcon = doc.createElement(\"i\");\n closeIcon.className = \"ti ti-x\";\n closeIcon.setAttribute(\"aria-hidden\", \"true\");\n closeButton.appendChild(closeIcon);\n\n // Inside the content, so a titled progress toast can place the bar between its title and its summary line.\n const progressElement = doc.createElement(\"progress\");\n progressElement.className = \"k2b-toast__progress\";\n progressElement.max = 1;\n contentElement.appendChild(progressElement);\n\n toastElement.append(leadElement, contentElement, closeButton);\n const item = railItem(toastElement);\n\n const text = () => [titleElement.textContent, descriptionElement.textContent].filter(Boolean).join(\". \");\n const effectiveDuration = () => explicitDuration ?? defaultDuration(currentVariant, text(), currentAction !== null);\n /** The error word is read before the message; the action is left out. */\n const spoken = () => (currentVariant === \"error\" ? `${resolveUiMessages().error}: ${text()}` : text());\n const say = () => {\n lastAnnouncement = spoken();\n announce(lastAnnouncement, { politeness: currentVariant === \"error\" ? \"assertive\" : \"polite\" });\n };\n\n const clearDismissTimer = () => {\n if (dismissTimer === null) return;\n clearTimeout(dismissTimer);\n dismissTimer = null;\n };\n\n const pauseDismissTimer = () => {\n if (dismissTimer === null) return;\n remainingDuration = Math.max(0, remainingDuration - (Date.now() - timerStartedAt));\n clearDismissTimer();\n };\n\n const resumeDismissTimer = () => {\n if (dismissed || currentProgress !== null || remainingDuration <= 0 || railHeld() || doc.hidden) return;\n clearDismissTimer();\n timerStartedAt = Date.now();\n dismissTimer = setTimeout(() => dismiss(), remainingDuration);\n };\n\n const resetDismissTimer = () => {\n clearDismissTimer();\n remainingDuration = effectiveDuration();\n // A toast that stays until it is closed or its progress ends; a phone shell keeps the end of its content clear of it.\n if (remainingDuration === 0 || currentProgress !== null) toastElement.dataset.persistent = \"true\";\n else delete toastElement.dataset.persistent;\n resumeDismissTimer();\n };\n\n const onVisibilityChange = () => (doc.hidden ? pauseDismissTimer() : resumeDismissTimer());\n\n /** The close button of the nearest open toast in one direction, past neighbours that are still closing. */\n const nearestOpenClose = (step: (slot: Element) => Element | null): HTMLElement | null => {\n for (let slot = step(item.slot); slot; slot = step(slot)) {\n const button = slot.querySelector<HTMLElement>(\".k2b-toast:not([data-closing]) .k2b-toast__close\");\n if (button) return button;\n }\n return null;\n };\n\n /** A focused toast hands focus to its neighbour, or back to where the user was, instead of dropping it on the page. */\n const moveFocusAway = () => {\n if (!toastElement.contains(doc.activeElement)) return;\n const next = nearestOpenClose((slot) => slot.nextElementSibling) ?? nearestOpenClose((slot) => slot.previousElementSibling);\n const target = next ?? (opener?.isConnected ? opener : null);\n if (target) target.focus({ preventScroll: true });\n else (doc.activeElement as HTMLElement | null)?.blur();\n };\n\n const dismiss = () => {\n if (dismissed) return;\n dismissed = true;\n clearDismissTimer();\n liveToasts.delete(live);\n doc.removeEventListener(\"visibilitychange\", onVisibilityChange);\n moveFocusAway();\n item.close();\n };\n\n const renderProgress = () => {\n progressElement.hidden = currentProgress === null;\n toastElement.dataset.progress = String(currentProgress !== null);\n const title = titleElement.textContent;\n const summary = descriptionElement.textContent ?? \"\";\n progressElement.setAttribute(\"aria-label\", title || summary);\n // With a title, the message is the summary line under the bar (\"6 of 12 files\"), read instead of a bare percentage.\n if (typeof currentProgress === \"number\" && title && summary) progressElement.setAttribute(\"aria-valuetext\", summary);\n else progressElement.removeAttribute(\"aria-valuetext\");\n if (typeof currentProgress === \"number\")\n progressElement.value = Number.isFinite(currentProgress) ? Math.max(0, Math.min(1, currentProgress)) : 0;\n else progressElement.removeAttribute(\"value\");\n };\n renderProgress();\n\n let actionElement: HTMLAnchorElement | HTMLButtonElement | null = null;\n const createAction = (action: ToastAction): HTMLAnchorElement | HTMLButtonElement => {\n let element: HTMLAnchorElement | HTMLButtonElement;\n if (\"href\" in action) {\n element = doc.createElement(\"a\");\n element.href = action.href;\n } else {\n element = doc.createElement(\"button\");\n element.type = \"button\";\n }\n element.className = \"k2b-toast__action\";\n element.textContent = action.label;\n element.addEventListener(\"click\", () => {\n if (\"onClick\" in action) action.onClick();\n else dismiss();\n });\n return element;\n };\n const renderAction = (action: ToastAction | null | undefined) => {\n const previous = actionElement;\n currentAction = action ?? null;\n actionElement = action ? createAction(action) : null;\n if (actionElement) contentElement.appendChild(actionElement);\n // The keyboard stays in the toast, on the new action or the close button, instead of falling to the page.\n if (previous?.contains(doc.activeElement)) (actionElement ?? closeButton).focus({ preventScroll: true });\n previous?.remove();\n };\n renderAction(options?.action);\n\n const update = (nextDescription: string, nextOptions?: ToastOptions) => {\n if (dismissed) return;\n const has = (key: keyof ToastOptions) => nextOptions !== undefined && Object.prototype.hasOwnProperty.call(nextOptions, key);\n const previousProgress = currentProgress;\n descriptionElement.textContent = nextDescription;\n\n const variantChanged = nextOptions?.variant !== undefined && nextOptions.variant !== currentVariant;\n if (variantChanged) {\n currentVariant = nextOptions.variant!;\n toastElement.dataset.tone = VARIANT_STYLES[currentVariant].tone;\n renderLead(nextOptions.iconClass);\n } else if (nextOptions?.iconClass !== undefined) {\n applyIconClass(leadIconElement, nextOptions.iconClass);\n }\n\n if (has(\"title\")) renderTitle(nextOptions!.title);\n if (has(\"action\")) renderAction(nextOptions!.action);\n if (has(\"duration\")) explicitDuration = nextOptions!.duration;\n if (has(\"progress\")) currentProgress = nextOptions!.progress ?? null;\n if (nextOptions?.dismissLabel) closeButton.setAttribute(\"aria-label\", nextOptions.dismissLabel);\n renderProgress();\n resetDismissTimer();\n\n // Progress is announced at its start, half way, and its end, never at every step, and only with something new to say.\n // The comparison includes the error word, so a change to an error with the same text is still announced.\n const ticking = previousProgress !== null && currentProgress !== null;\n const halfway =\n typeof currentProgress === \"number\" && currentProgress >= 0.5 && !(typeof previousProgress === \"number\" && previousProgress >= 0.5);\n if ((!ticking || halfway || variantChanged) && spoken() !== lastAnnouncement) say();\n // Finished progress or a new duration can make this toast one the rail limit removes.\n enforceCap();\n };\n\n closeButton.addEventListener(\"click\", () => dismiss());\n toastElement.addEventListener(\"keydown\", (event) => {\n if (event.key !== \"Escape\" || event.defaultPrevented) return;\n event.preventDefault();\n event.stopPropagation();\n dismiss();\n });\n doc.addEventListener(\"visibilitychange\", onVisibilityChange);\n\n const handle: ToastHandle = { dismiss, update };\n const live: LiveToast = {\n dismiss,\n keep: () => currentVariant === \"error\" || currentProgress !== null || effectiveDuration() === 0,\n progress: () => currentProgress !== null,\n held: () => pointerHolds.has(toastElement) || focusHolds.has(toastElement),\n pause: pauseDismissTimer,\n resume: resumeDismissTimer,\n };\n liveToasts.add(live);\n promoteToTopLayer(initialContainer).appendChild(item.slot);\n item.open();\n say();\n enforceCap();\n resetDismissTimer();\n return handle;\n};\n\n/*\n * A custom slot shares the rail, chrome, and enter/leave motion with toasts, so it stacks beside them in the same\n * corner instead of covering them. It has no timer, close button, or live region of its own, and neither the\n * toast limit nor `dismissAll` removes it: the application that placed it decides when it goes.\n */\nconst showCustom = (content: HTMLElement): ToastSlot => {\n const initialContainer = ensureContainer();\n if (!initialContainer) return { dismiss: () => {} };\n let dismissed = false;\n const slotElement = document.createElement(\"div\");\n slotElement.className = \"k2b-toast\";\n slotElement.dataset.k2bToast = \"\";\n slotElement.dataset.custom = \"true\";\n // It stays until the application removes it, like a toast without a timer.\n slotElement.dataset.persistent = \"true\";\n slotElement.append(content);\n const item = railItem(slotElement);\n const dismiss = () => {\n if (dismissed) return;\n dismissed = true;\n item.close();\n };\n promoteToTopLayer(initialContainer).appendChild(item.slot);\n item.open();\n return { dismiss };\n};\n\nexport const isPointInsideToast = (x: number, y: number): boolean => {\n if (typeof document === \"undefined\") return false;\n for (const card of Array.from(document.querySelectorAll<HTMLElement>(`[${CONTAINER_ATTRIBUTE}] [data-k2b-toast]`))) {\n const rect = card.getBoundingClientRect();\n if (x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom) return true;\n }\n return false;\n};\n\nconst toastFn = ((description: string, options?: ToastOptions) => showToast(description, options)) as ToastFn;\ntoastFn.success = (description, options) => showToast(description, { ...options, variant: \"success\" });\ntoastFn.error = (description, options) => showToast(description, { ...options, variant: \"error\" });\ntoastFn.custom = showCustom;\ntoastFn.dismissAll = () => {\n for (const item of Array.from(liveToasts)) item.dismiss();\n};\n\nexport const toast: ToastFn = toastFn;\n"],"mappings":"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","ignoreList":[]}
|
package/dist/browser/index.js
CHANGED
|
@@ -3,9 +3,9 @@ export * from "./chat";
|
|
|
3
3
|
export * from "./content";
|
|
4
4
|
export * from "./feedback";
|
|
5
5
|
export * from "./inputs";
|
|
6
|
+
export { suppressTextSelection } from "./internal/text-selection";
|
|
6
7
|
export * from "./intl";
|
|
7
8
|
export * from "./layout";
|
|
8
9
|
export * from "./surfaces";
|
|
9
10
|
export * from "./widgets";
|
|
10
|
-
export {};
|
|
11
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./actions\";\nexport * from \"./chat\";\nexport * from \"./content\";\nexport * from \"./feedback\";\nexport * from \"./inputs\";\nexport * from \"./intl\";\nexport * from \"./layout\";\nexport type { AccentColor, IntentTone } from \"./semantics\";\nexport * from \"./surfaces\";\nexport * from \"./widgets\";\n"],"mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,QAAQ;AACtB,cAAc,WAAW;AACzB,cAAc,YAAY;AAC1B,cAAc,UAAU;AACxB,cAAc,QAAQ;AACtB,cAAc,UAAU;AAExB,cAAc,YAAY;AAC1B,cAAc,WAAW
|
|
1
|
+
{"version":3,"names":[],"sources":["index.ts"],"sourcesContent":["export * from \"./actions\";\nexport * from \"./chat\";\nexport * from \"./content\";\nexport * from \"./feedback\";\nexport * from \"./inputs\";\nexport { suppressTextSelection } from \"./internal/text-selection\";\nexport * from \"./intl\";\nexport * from \"./layout\";\nexport type { AccentColor, IntentTone } from \"./semantics\";\nexport * from \"./surfaces\";\nexport * from \"./widgets\";\n"],"mappings":"AAAA,cAAc,WAAW;AACzB,cAAc,QAAQ;AACtB,cAAc,WAAW;AACzB,cAAc,YAAY;AAC1B,cAAc,UAAU;AACxB,SAAS,qBAAqB,QAAQ,2BAA2B;AACjE,cAAc,QAAQ;AACtB,cAAc,UAAU;AAExB,cAAc,YAAY;AAC1B,cAAc,WAAW","ignoreList":[]}
|
|
@@ -23,9 +23,11 @@ import { createEffect, createMemo, createSignal, createUniqueId, For, onCleanup,
|
|
|
23
23
|
import { createFieldMeta, Field, fieldControlAria } from "../internal/field";
|
|
24
24
|
import { useUiMessages } from "../intl/messages";
|
|
25
25
|
import { buildSuggestContext, createCompletionBehaviorState, detectQuery, displayLabel, plainTextHighlight, renderWithOverlay, resolveSuggestions } from "./completion";
|
|
26
|
+
import { useCompletionMessages } from "./completion-messages";
|
|
26
27
|
import { resolveMaybeAccessor } from "./field-contract";
|
|
27
28
|
export function AutocompleteEditor(props) {
|
|
28
29
|
const messages = useUiMessages();
|
|
30
|
+
const completionMessages = useCompletionMessages();
|
|
29
31
|
const meta = createFieldMeta(props.id);
|
|
30
32
|
let textarea;
|
|
31
33
|
let preview;
|
|
@@ -200,7 +202,7 @@ export function AutocompleteEditor(props) {
|
|
|
200
202
|
} catch (error) {
|
|
201
203
|
if (signal.aborted || isAbortError(error)) return;
|
|
202
204
|
setLoading(false);
|
|
203
|
-
setCompletionError(error instanceof Error ? error.message :
|
|
205
|
+
setCompletionError(error instanceof Error ? error.message : completionMessages().suggestionsCouldNotLoad);
|
|
204
206
|
setDropdownOpen(true);
|
|
205
207
|
queueMicrotask(positionDropdown);
|
|
206
208
|
}
|
|
@@ -222,7 +224,7 @@ export function AutocompleteEditor(props) {
|
|
|
222
224
|
} catch (error) {
|
|
223
225
|
if (signal.aborted || isAbortError(error)) return;
|
|
224
226
|
setLoading(false);
|
|
225
|
-
setCompletionError(error instanceof Error ? error.message :
|
|
227
|
+
setCompletionError(error instanceof Error ? error.message : completionMessages().suggestionsCouldNotLoad);
|
|
226
228
|
setDropdownOpen(true);
|
|
227
229
|
queueMicrotask(positionDropdown);
|
|
228
230
|
}
|
|
@@ -564,8 +566,8 @@ export function AutocompleteEditor(props) {
|
|
|
564
566
|
})()
|
|
565
567
|
}), _el$14, _co$4);
|
|
566
568
|
_$effect(_p$ => {
|
|
567
|
-
var _v$ =
|
|
568
|
-
_v$2 =
|
|
569
|
+
var _v$ = completionMessages().completionSuggestions,
|
|
570
|
+
_v$2 = completionMessages().suggestions;
|
|
569
571
|
_v$ !== _p$.e && _$setAttribute(_el$8, "aria-label", _p$.e = _v$);
|
|
570
572
|
_v$2 !== _p$.t && _$setAttribute(_el$9, "aria-label", _p$.t = _v$2);
|
|
571
573
|
return _p$;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["inputs/AutocompleteEditor.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, createUniqueId, For, type JSX, onCleanup, onMount, Show, untrack } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport {\n buildSuggestContext,\n type Completion,\n createCompletionBehaviorState,\n detectQuery,\n displayLabel,\n plainTextHighlight,\n type QueryContext,\n renderWithOverlay,\n resolveSuggestions,\n type Suggestion,\n} from \"./completion\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\n\nexport type AutocompleteEditorProps = ValueFieldProps<string> & {\n onSubmit?: () => void;\n completions?: readonly Completion[];\n restoreExpansionOnBackspace?: boolean;\n highlight?: (text: string) => string;\n singleLine?: boolean;\n lines?: number;\n fill?: boolean;\n placeholder?: string;\n spellcheck?: boolean;\n name?: string;\n maxLength?: number;\n textareaRef?: (element: HTMLTextAreaElement) => void;\n variant?: \"default\" | \"paper\";\n};\n\ntype CompletionState = {\n context: QueryContext;\n suggestions: readonly Suggestion[];\n selectedIndex: number;\n};\n\nexport function AutocompleteEditor(props: AutocompleteEditorProps): JSX.Element {\n const messages = useUiMessages();\n const meta = createFieldMeta(props.id);\n let textarea: HTMLTextAreaElement | undefined;\n let preview: HTMLDivElement | undefined;\n let dropdown: HTMLDivElement | undefined;\n let currentAbort: AbortController | null = null;\n let currentTimer: ReturnType<typeof setTimeout> | null = null;\n let overlayFrame: number | undefined;\n let overlayInitialized = false;\n let renderPendingOverlay: (() => void) | undefined;\n const completionBehavior = createCompletionBehaviorState();\n\n const [composing, setComposing] = createSignal(false);\n const [localValue, setLocalValue] = createSignal(resolveMaybeAccessor(props.value) ?? \"\");\n const error = () => resolveMaybeAccessor(props.error);\n const [state, setState] = createSignal<CompletionState | null>(null);\n const [loading, setLoading] = createSignal(false);\n const [completionError, setCompletionError] = createSignal<string | null>(null);\n const [dropdownOpen, setDropdownOpen] = createSignal(false);\n const completionId = createUniqueId();\n const listboxId = `${meta.controlId}-${completionId}-suggestions`;\n const optionId = (index: number): string => `${listboxId}-${index}`;\n const useOverlay = createMemo(() => Boolean(props.highlight));\n const activeSuggestion = (): Suggestion | null => {\n const current = state();\n return current?.suggestions[current.selectedIndex] ?? null;\n };\n\n createEffect(() => {\n const incoming = resolveMaybeAccessor(props.value);\n if (incoming !== undefined && incoming !== null && incoming !== untrack(localValue)) {\n setLocalValue(incoming);\n }\n });\n\n createEffect(() => {\n const target = localValue();\n if (!composing() && textarea && textarea.value !== target) {\n textarea.value = target;\n }\n });\n\n const suggestionGhost = (current: CompletionState, suggestion: Suggestion): { at: number; text: string } | undefined => {\n const edit = suggestion.textEdit;\n if (!edit) {\n return {\n at: current.context.end,\n text: suggestion.text.slice(current.context.text.length),\n };\n }\n if (edit.end !== current.context.end) return undefined;\n const replacing = localValue().slice(edit.start, edit.end);\n if (!edit.text.toLowerCase().startsWith(replacing.toLowerCase())) {\n return undefined;\n }\n return { at: edit.end, text: edit.text.slice(replacing.length) };\n };\n\n createEffect(() => {\n if (!preview) {\n if (overlayFrame !== undefined) cancelAnimationFrame(overlayFrame);\n overlayFrame = undefined;\n renderPendingOverlay = undefined;\n overlayInitialized = false;\n return;\n }\n const value = localValue();\n const highlighter = props.highlight ?? plainTextHighlight;\n const current = state();\n const active = activeSuggestion();\n const ghost = current && active ? suggestionGhost(current, active) : undefined;\n const anchor = current ? { at: current.context.start } : undefined;\n renderPendingOverlay = () => {\n if (!preview) return;\n preview.innerHTML = renderWithOverlay(value, highlighter, { ghost, anchor });\n if (textarea) {\n preview.scrollTop = textarea.scrollTop;\n preview.scrollLeft = textarea.scrollLeft;\n }\n if (dropdown?.matches(\":popover-open\")) positionDropdown();\n };\n if (!overlayInitialized) {\n overlayInitialized = true;\n renderPendingOverlay();\n renderPendingOverlay = undefined;\n return;\n }\n if (overlayFrame !== undefined) return;\n overlayFrame = requestAnimationFrame(() => {\n overlayFrame = undefined;\n const render = renderPendingOverlay;\n renderPendingOverlay = undefined;\n render?.();\n });\n });\n\n const closeDropdown = (): void => {\n if (dropdown?.matches(\":popover-open\")) dropdown.hidePopover();\n setDropdownOpen(false);\n };\n\n const clearCompletion = (): void => {\n currentAbort?.abort();\n currentAbort = null;\n if (currentTimer) clearTimeout(currentTimer);\n currentTimer = null;\n setState(null);\n setLoading(false);\n setCompletionError(null);\n closeDropdown();\n };\n\n const positionDropdown = (): void => {\n if (!dropdown?.isConnected || !textarea?.isConnected) return;\n const anchor = preview?.querySelector<HTMLElement>(\"[data-completion-anchor]\");\n const rect = anchor?.getBoundingClientRect() ?? textarea.getBoundingClientRect();\n const maxHeight = 260;\n const spaceBelow = window.innerHeight - rect.bottom;\n const openAbove = spaceBelow < maxHeight && rect.top > spaceBelow;\n if (openAbove) {\n dropdown.style.setProperty(\"top\", \"auto\", \"important\");\n dropdown.style.setProperty(\"bottom\", `${window.innerHeight - rect.top + 4}px`, \"important\");\n } else {\n dropdown.style.setProperty(\"top\", `${rect.bottom + 4}px`, \"important\");\n dropdown.style.setProperty(\"bottom\", \"auto\", \"important\");\n }\n if (!dropdown.matches(\":popover-open\")) dropdown.showPopover();\n // The list sizes to its suggestions in CSS; measured once shown, it is\n // clamped into the viewport before the next paint.\n const width = dropdown.getBoundingClientRect().width;\n const left = Math.min(rect.left, window.innerWidth - width - 8);\n dropdown.style.setProperty(\"left\", `${Math.max(8, left)}px`, \"important\");\n };\n\n const isAbortError = (error: unknown): boolean =>\n error instanceof DOMException\n ? error.name === \"AbortError\"\n : Boolean(error && typeof error === \"object\" && \"name\" in error && (error as { name: string }).name === \"AbortError\");\n\n const applySuggestionList = (context: QueryContext, suggestions: readonly Suggestion[]): void => {\n const currentText = localValue();\n const normalized = context.text.toLowerCase();\n const usable = suggestions.filter((suggestion) => {\n if (suggestion.textEdit) {\n const { start, end, text } = suggestion.textEdit;\n return (\n Number.isInteger(start) &&\n Number.isInteger(end) &&\n start >= 0 &&\n end >= start &&\n end <= currentText.length &&\n currentText.slice(start, end) !== text\n );\n }\n return suggestion.text.toLowerCase().startsWith(normalized) && suggestion.text.length > context.text.length;\n });\n if (usable.length === 0) {\n clearCompletion();\n return;\n }\n const previous = activeSuggestion()?.text;\n const retained = previous ? usable.findIndex((suggestion) => suggestion.text === previous) : -1;\n setState({\n context,\n suggestions: usable,\n selectedIndex: retained >= 0 ? retained : 0,\n });\n if (context.completion.dropdown) {\n setDropdownOpen(true);\n queueMicrotask(positionDropdown);\n } else {\n closeDropdown();\n }\n };\n\n const runAsync = async (context: QueryContext, promise: Promise<readonly Suggestion[]>, signal: AbortSignal): Promise<void> => {\n try {\n const suggestions = await promise;\n if (signal.aborted) return;\n setLoading(false);\n applySuggestionList(context, suggestions);\n } catch (error) {\n if (signal.aborted || isAbortError(error)) return;\n setLoading(false);\n setCompletionError(error instanceof Error ? error.message : messages().suggestionsCouldNotLoad);\n setDropdownOpen(true);\n queueMicrotask(positionDropdown);\n }\n };\n\n const startResolution = (context: QueryContext, signal: AbortSignal): void => {\n if (signal.aborted || !textarea) return;\n setCompletionError(null);\n setLoading(true);\n setDropdownOpen(true);\n queueMicrotask(positionDropdown);\n try {\n const result = resolveSuggestions(context.completion, context.query, buildSuggestContext(textarea, context), signal);\n if (result.kind === \"sync\") {\n setLoading(false);\n applySuggestionList(context, result.data);\n } else {\n void runAsync(context, result.promise, signal);\n }\n } catch (error) {\n if (signal.aborted || isAbortError(error)) return;\n setLoading(false);\n setCompletionError(error instanceof Error ? error.message : messages().suggestionsCouldNotLoad);\n setDropdownOpen(true);\n queueMicrotask(positionDropdown);\n }\n };\n\n const recomputeCompletion = (): void => {\n if (!textarea) return;\n const context = detectQuery(textarea, props.completions);\n if (!context) {\n clearCompletion();\n return;\n }\n currentAbort?.abort();\n if (currentTimer) clearTimeout(currentTimer);\n currentTimer = null;\n currentAbort = new AbortController();\n const current = state();\n if (\n current &&\n (current.context.start !== context.start ||\n current.context.end !== context.end ||\n current.context.text !== context.text ||\n current.context.completion !== context.completion)\n ) {\n setState(null);\n closeDropdown();\n }\n setCompletionError(null);\n const delay = Math.max(0, context.completion.debounceMs ?? 0);\n if (delay === 0) {\n startResolution(context, currentAbort.signal);\n } else {\n setLoading(false);\n if (!state()) closeDropdown();\n const signal = currentAbort.signal;\n currentTimer = setTimeout(() => {\n currentTimer = null;\n startResolution(context, signal);\n }, delay);\n }\n };\n\n const retryCompletion = (): void => {\n if (!textarea) return;\n const context = detectQuery(textarea, props.completions);\n if (!context) return clearCompletion();\n currentAbort?.abort();\n if (currentTimer) clearTimeout(currentTimer);\n currentTimer = null;\n currentAbort = new AbortController();\n startResolution(context, currentAbort.signal);\n };\n\n const activateSuggestion = (index = state()?.selectedIndex ?? -1): boolean => {\n const current = state();\n const active = current?.suggestions[index];\n if (!textarea || !current || !active) return false;\n if (!active.textEdit && active.text === current.context.text) {\n clearCompletion();\n return false;\n }\n const applied = completionBehavior.applySuggestion(textarea, current.context, active, {\n trackExpansion: props.restoreExpansionOnBackspace ?? true,\n });\n clearCompletion();\n if (applied) queueMicrotask(recomputeCompletion);\n return applied;\n };\n\n const moveSelection = (direction: 1 | -1): void => {\n const current = state();\n if (!current || current.suggestions.length === 0) return;\n setState({\n ...current,\n selectedIndex: (current.selectedIndex + direction + current.suggestions.length) % current.suggestions.length,\n });\n };\n\n onMount(() => {\n const selectionChange = (): void => {\n if (document.activeElement === textarea) recomputeCompletion();\n };\n // Reposition an OPEN popover only. Calling `positionDropdown` blindly\n // would `showPopover()` a dropdown that is deliberately closed (a\n // ghost-only completion keeps state without a dropdown).\n const reposition = (): void => {\n if (dropdown?.matches(\":popover-open\")) positionDropdown();\n };\n document.addEventListener(\"selectionchange\", selectionChange);\n window.addEventListener(\"resize\", reposition);\n onCleanup(() => {\n document.removeEventListener(\"selectionchange\", selectionChange);\n window.removeEventListener(\"resize\", reposition);\n if (dropdown?.matches(\":popover-open\")) dropdown.hidePopover();\n currentAbort?.abort();\n if (currentTimer) clearTimeout(currentTimer);\n if (overlayFrame !== undefined) cancelAnimationFrame(overlayFrame);\n overlayFrame = undefined;\n renderPendingOverlay = undefined;\n completionBehavior.reset();\n });\n });\n\n const onInput = (event: InputEvent & { currentTarget: HTMLTextAreaElement }): void => {\n if (event.inputType.startsWith(\"insert\") && completionBehavior.tryExpand(event.currentTarget, props.completions)) {\n return;\n }\n setLocalValue(event.currentTarget.value);\n props.onValueChange?.(event.currentTarget.value);\n recomputeCompletion();\n };\n\n const onKeyDown = (event: KeyboardEvent): void => {\n if (!textarea || event.isComposing) return;\n if (\n (props.restoreExpansionOnBackspace ?? true) &&\n event.key === \"Backspace\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.altKey &&\n !event.shiftKey &&\n completionBehavior.tryRestore(textarea)\n ) {\n event.preventDefault();\n return;\n }\n const current = state();\n const dropdownCompletion = current?.context.completion.dropdown === true;\n if (current && dropdownCompletion && (event.key === \"ArrowDown\" || event.key === \"ArrowUp\")) {\n event.preventDefault();\n moveSelection(event.key === \"ArrowDown\" ? 1 : -1);\n return;\n }\n if (event.key === \"Enter\" && !event.shiftKey && !event.metaKey && !event.ctrlKey && !event.altKey) {\n if (current && dropdownCompletion && dropdownOpen()) {\n event.preventDefault();\n activateSuggestion();\n return;\n }\n if (props.singleLine) {\n event.preventDefault();\n props.onSubmit?.();\n return;\n }\n }\n if (event.key === \"Enter\" && (event.metaKey || event.ctrlKey) && !props.singleLine && props.onSubmit) {\n event.preventDefault();\n props.onSubmit();\n return;\n }\n if (event.key === \"Tab\" && !event.shiftKey && !event.metaKey && !event.ctrlKey && !event.altKey && current) {\n event.preventDefault();\n activateSuggestion();\n return;\n }\n if (event.key === \"Escape\") {\n if (current) {\n event.preventDefault();\n clearCompletion();\n } else if ((props.completions?.length ?? 0) > 0) {\n event.preventDefault();\n textarea.blur();\n }\n }\n };\n\n const surfaceStyle = (): JSX.CSSProperties => ({\n \"--k2b-editor-lines\": String(props.lines ?? 3),\n });\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={props.error}\n fill={props.fill && !props.singleLine}\n meta={meta}\n required={props.required}\n disabled={props.disabled}\n >\n <div\n class=\"k2b-autocomplete\"\n data-overlay={useOverlay() ? \"true\" : undefined}\n data-single-line={props.singleLine ? \"true\" : undefined}\n data-fill={props.fill && !props.singleLine ? \"true\" : undefined}\n data-disabled={props.disabled ? \"true\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n data-variant={props.variant === \"paper\" ? \"paper\" : undefined}\n style={surfaceStyle()}\n >\n <div class=\"k2b-autocomplete__surface\">\n <Show when={!localValue() && props.placeholder}>\n <div class=\"k2b-autocomplete__placeholder\" aria-hidden=\"true\">\n {props.placeholder}\n </div>\n </Show>\n <div ref={preview} class=\"k2b-autocomplete__preview\" aria-hidden=\"true\" />\n <textarea\n ref={(element) => {\n textarea = element;\n props.textareaRef?.(element);\n }}\n id={meta.controlId}\n name={props.name}\n class=\"k2b-autocomplete__input\"\n onInput={onInput}\n onChange={(event) => props.onValueCommit?.(event.currentTarget.value)}\n onKeyDown={onKeyDown}\n onScroll={(event) => {\n if (preview) {\n preview.scrollTop = event.currentTarget.scrollTop;\n preview.scrollLeft = event.currentTarget.scrollLeft;\n }\n if (dropdown?.matches(\":popover-open\")) positionDropdown();\n }}\n onCompositionStart={() => setComposing(true)}\n onCompositionEnd={() => setComposing(false)}\n onBlur={(event) => {\n const next = event.relatedTarget as HTMLElement | null;\n if (next && dropdown?.contains(next)) return;\n completionBehavior.reset();\n clearCompletion();\n }}\n disabled={props.disabled}\n required={props.required}\n spellcheck={props.spellcheck ?? false}\n maxLength={props.maxLength}\n rows={props.singleLine ? 1 : (props.lines ?? 3)}\n {...fieldControlAria(meta, props)}\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n aria-controls={dropdownOpen() ? listboxId : undefined}\n aria-activedescendant={dropdownOpen() && state() ? optionId(state()!.selectedIndex) : undefined}\n />\n </div>\n <Show when={state() || loading() || completionError()}>\n <div\n ref={dropdown}\n popover=\"manual\"\n class=\"k2b-autocomplete__options\"\n role=\"presentation\"\n aria-label={messages().completionSuggestions}\n >\n <div id={listboxId} class=\"k2b-autocomplete__listbox\" role=\"listbox\" aria-label={messages().suggestions}>\n <Show when={loading()}>\n <div class=\"k2b-autocomplete__status\" role=\"status\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n Loading suggestions\n </div>\n </Show>\n <Show when={completionError()}>\n {(message) => (\n <div class=\"k2b-autocomplete__status\" data-error=\"true\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n <span>{message()}</span>\n <button type=\"button\" onMouseDown={(event) => event.preventDefault()} onClick={retryCompletion}>\n {messages().retry}\n </button>\n </div>\n )}\n </Show>\n <For each={state()?.suggestions ?? []}>\n {(suggestion, index) => (\n // biome-ignore lint/a11y/useKeyWithClickEvents: the owning textarea handles keyboard activation through aria-activedescendant.\n <div\n id={optionId(index())}\n class=\"k2b-autocomplete__option\"\n role=\"option\"\n aria-selected={index() === state()?.selectedIndex}\n data-loading={loading() ? \"true\" : undefined}\n onMouseEnter={() => {\n const current = state();\n if (current) {\n setState({ ...current, selectedIndex: index() });\n }\n }}\n onMouseDown={(event) => {\n event.preventDefault();\n }}\n onClick={() => {\n activateSuggestion(index());\n textarea?.focus();\n }}\n >\n <span>{displayLabel(suggestion, state()!.context.completion)}</span>\n <Show when={suggestion.hint}>{(hint) => <small>{hint()}</small>}</Show>\n </div>\n )}\n </For>\n </div>\n </div>\n </Show>\n </div>\n </Field>\n );\n}\n\nexport type { Completion, SuggestContext, Suggestion } from \"./completion\";\nexport { abbreviations } from \"./completion\";\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["inputs/AutocompleteEditor.tsx"],"sourcesContent":["import { createEffect, createMemo, createSignal, createUniqueId, For, type JSX, onCleanup, onMount, Show, untrack } from \"solid-js\";\nimport { createFieldMeta, Field, fieldControlAria } from \"../internal/field\";\nimport { useUiMessages } from \"../intl/messages\";\nimport {\n buildSuggestContext,\n type Completion,\n createCompletionBehaviorState,\n detectQuery,\n displayLabel,\n plainTextHighlight,\n type QueryContext,\n renderWithOverlay,\n resolveSuggestions,\n type Suggestion,\n} from \"./completion\";\nimport { useCompletionMessages } from \"./completion-messages\";\nimport type { ValueFieldProps } from \"./field-contract\";\nimport { resolveMaybeAccessor } from \"./field-contract\";\n\nexport type AutocompleteEditorProps = ValueFieldProps<string> & {\n onSubmit?: () => void;\n completions?: readonly Completion[];\n restoreExpansionOnBackspace?: boolean;\n highlight?: (text: string) => string;\n singleLine?: boolean;\n lines?: number;\n fill?: boolean;\n placeholder?: string;\n spellcheck?: boolean;\n name?: string;\n maxLength?: number;\n textareaRef?: (element: HTMLTextAreaElement) => void;\n variant?: \"default\" | \"paper\";\n};\n\ntype CompletionState = {\n context: QueryContext;\n suggestions: readonly Suggestion[];\n selectedIndex: number;\n};\n\nexport function AutocompleteEditor(props: AutocompleteEditorProps): JSX.Element {\n const messages = useUiMessages();\n const completionMessages = useCompletionMessages();\n const meta = createFieldMeta(props.id);\n let textarea: HTMLTextAreaElement | undefined;\n let preview: HTMLDivElement | undefined;\n let dropdown: HTMLDivElement | undefined;\n let currentAbort: AbortController | null = null;\n let currentTimer: ReturnType<typeof setTimeout> | null = null;\n let overlayFrame: number | undefined;\n let overlayInitialized = false;\n let renderPendingOverlay: (() => void) | undefined;\n const completionBehavior = createCompletionBehaviorState();\n\n const [composing, setComposing] = createSignal(false);\n const [localValue, setLocalValue] = createSignal(resolveMaybeAccessor(props.value) ?? \"\");\n const error = () => resolveMaybeAccessor(props.error);\n const [state, setState] = createSignal<CompletionState | null>(null);\n const [loading, setLoading] = createSignal(false);\n const [completionError, setCompletionError] = createSignal<string | null>(null);\n const [dropdownOpen, setDropdownOpen] = createSignal(false);\n const completionId = createUniqueId();\n const listboxId = `${meta.controlId}-${completionId}-suggestions`;\n const optionId = (index: number): string => `${listboxId}-${index}`;\n const useOverlay = createMemo(() => Boolean(props.highlight));\n const activeSuggestion = (): Suggestion | null => {\n const current = state();\n return current?.suggestions[current.selectedIndex] ?? null;\n };\n\n createEffect(() => {\n const incoming = resolveMaybeAccessor(props.value);\n if (incoming !== undefined && incoming !== null && incoming !== untrack(localValue)) {\n setLocalValue(incoming);\n }\n });\n\n createEffect(() => {\n const target = localValue();\n if (!composing() && textarea && textarea.value !== target) {\n textarea.value = target;\n }\n });\n\n const suggestionGhost = (current: CompletionState, suggestion: Suggestion): { at: number; text: string } | undefined => {\n const edit = suggestion.textEdit;\n if (!edit) {\n return {\n at: current.context.end,\n text: suggestion.text.slice(current.context.text.length),\n };\n }\n if (edit.end !== current.context.end) return undefined;\n const replacing = localValue().slice(edit.start, edit.end);\n if (!edit.text.toLowerCase().startsWith(replacing.toLowerCase())) {\n return undefined;\n }\n return { at: edit.end, text: edit.text.slice(replacing.length) };\n };\n\n createEffect(() => {\n if (!preview) {\n if (overlayFrame !== undefined) cancelAnimationFrame(overlayFrame);\n overlayFrame = undefined;\n renderPendingOverlay = undefined;\n overlayInitialized = false;\n return;\n }\n const value = localValue();\n const highlighter = props.highlight ?? plainTextHighlight;\n const current = state();\n const active = activeSuggestion();\n const ghost = current && active ? suggestionGhost(current, active) : undefined;\n const anchor = current ? { at: current.context.start } : undefined;\n renderPendingOverlay = () => {\n if (!preview) return;\n preview.innerHTML = renderWithOverlay(value, highlighter, { ghost, anchor });\n if (textarea) {\n preview.scrollTop = textarea.scrollTop;\n preview.scrollLeft = textarea.scrollLeft;\n }\n if (dropdown?.matches(\":popover-open\")) positionDropdown();\n };\n if (!overlayInitialized) {\n overlayInitialized = true;\n renderPendingOverlay();\n renderPendingOverlay = undefined;\n return;\n }\n if (overlayFrame !== undefined) return;\n overlayFrame = requestAnimationFrame(() => {\n overlayFrame = undefined;\n const render = renderPendingOverlay;\n renderPendingOverlay = undefined;\n render?.();\n });\n });\n\n const closeDropdown = (): void => {\n if (dropdown?.matches(\":popover-open\")) dropdown.hidePopover();\n setDropdownOpen(false);\n };\n\n const clearCompletion = (): void => {\n currentAbort?.abort();\n currentAbort = null;\n if (currentTimer) clearTimeout(currentTimer);\n currentTimer = null;\n setState(null);\n setLoading(false);\n setCompletionError(null);\n closeDropdown();\n };\n\n const positionDropdown = (): void => {\n if (!dropdown?.isConnected || !textarea?.isConnected) return;\n const anchor = preview?.querySelector<HTMLElement>(\"[data-completion-anchor]\");\n const rect = anchor?.getBoundingClientRect() ?? textarea.getBoundingClientRect();\n const maxHeight = 260;\n const spaceBelow = window.innerHeight - rect.bottom;\n const openAbove = spaceBelow < maxHeight && rect.top > spaceBelow;\n if (openAbove) {\n dropdown.style.setProperty(\"top\", \"auto\", \"important\");\n dropdown.style.setProperty(\"bottom\", `${window.innerHeight - rect.top + 4}px`, \"important\");\n } else {\n dropdown.style.setProperty(\"top\", `${rect.bottom + 4}px`, \"important\");\n dropdown.style.setProperty(\"bottom\", \"auto\", \"important\");\n }\n if (!dropdown.matches(\":popover-open\")) dropdown.showPopover();\n // The list sizes to its suggestions in CSS; measured once shown, it is\n // clamped into the viewport before the next paint.\n const width = dropdown.getBoundingClientRect().width;\n const left = Math.min(rect.left, window.innerWidth - width - 8);\n dropdown.style.setProperty(\"left\", `${Math.max(8, left)}px`, \"important\");\n };\n\n const isAbortError = (error: unknown): boolean =>\n error instanceof DOMException\n ? error.name === \"AbortError\"\n : Boolean(error && typeof error === \"object\" && \"name\" in error && (error as { name: string }).name === \"AbortError\");\n\n const applySuggestionList = (context: QueryContext, suggestions: readonly Suggestion[]): void => {\n const currentText = localValue();\n const normalized = context.text.toLowerCase();\n const usable = suggestions.filter((suggestion) => {\n if (suggestion.textEdit) {\n const { start, end, text } = suggestion.textEdit;\n return (\n Number.isInteger(start) &&\n Number.isInteger(end) &&\n start >= 0 &&\n end >= start &&\n end <= currentText.length &&\n currentText.slice(start, end) !== text\n );\n }\n return suggestion.text.toLowerCase().startsWith(normalized) && suggestion.text.length > context.text.length;\n });\n if (usable.length === 0) {\n clearCompletion();\n return;\n }\n const previous = activeSuggestion()?.text;\n const retained = previous ? usable.findIndex((suggestion) => suggestion.text === previous) : -1;\n setState({\n context,\n suggestions: usable,\n selectedIndex: retained >= 0 ? retained : 0,\n });\n if (context.completion.dropdown) {\n setDropdownOpen(true);\n queueMicrotask(positionDropdown);\n } else {\n closeDropdown();\n }\n };\n\n const runAsync = async (context: QueryContext, promise: Promise<readonly Suggestion[]>, signal: AbortSignal): Promise<void> => {\n try {\n const suggestions = await promise;\n if (signal.aborted) return;\n setLoading(false);\n applySuggestionList(context, suggestions);\n } catch (error) {\n if (signal.aborted || isAbortError(error)) return;\n setLoading(false);\n setCompletionError(error instanceof Error ? error.message : completionMessages().suggestionsCouldNotLoad);\n setDropdownOpen(true);\n queueMicrotask(positionDropdown);\n }\n };\n\n const startResolution = (context: QueryContext, signal: AbortSignal): void => {\n if (signal.aborted || !textarea) return;\n setCompletionError(null);\n setLoading(true);\n setDropdownOpen(true);\n queueMicrotask(positionDropdown);\n try {\n const result = resolveSuggestions(context.completion, context.query, buildSuggestContext(textarea, context), signal);\n if (result.kind === \"sync\") {\n setLoading(false);\n applySuggestionList(context, result.data);\n } else {\n void runAsync(context, result.promise, signal);\n }\n } catch (error) {\n if (signal.aborted || isAbortError(error)) return;\n setLoading(false);\n setCompletionError(error instanceof Error ? error.message : completionMessages().suggestionsCouldNotLoad);\n setDropdownOpen(true);\n queueMicrotask(positionDropdown);\n }\n };\n\n const recomputeCompletion = (): void => {\n if (!textarea) return;\n const context = detectQuery(textarea, props.completions);\n if (!context) {\n clearCompletion();\n return;\n }\n currentAbort?.abort();\n if (currentTimer) clearTimeout(currentTimer);\n currentTimer = null;\n currentAbort = new AbortController();\n const current = state();\n if (\n current &&\n (current.context.start !== context.start ||\n current.context.end !== context.end ||\n current.context.text !== context.text ||\n current.context.completion !== context.completion)\n ) {\n setState(null);\n closeDropdown();\n }\n setCompletionError(null);\n const delay = Math.max(0, context.completion.debounceMs ?? 0);\n if (delay === 0) {\n startResolution(context, currentAbort.signal);\n } else {\n setLoading(false);\n if (!state()) closeDropdown();\n const signal = currentAbort.signal;\n currentTimer = setTimeout(() => {\n currentTimer = null;\n startResolution(context, signal);\n }, delay);\n }\n };\n\n const retryCompletion = (): void => {\n if (!textarea) return;\n const context = detectQuery(textarea, props.completions);\n if (!context) return clearCompletion();\n currentAbort?.abort();\n if (currentTimer) clearTimeout(currentTimer);\n currentTimer = null;\n currentAbort = new AbortController();\n startResolution(context, currentAbort.signal);\n };\n\n const activateSuggestion = (index = state()?.selectedIndex ?? -1): boolean => {\n const current = state();\n const active = current?.suggestions[index];\n if (!textarea || !current || !active) return false;\n if (!active.textEdit && active.text === current.context.text) {\n clearCompletion();\n return false;\n }\n const applied = completionBehavior.applySuggestion(textarea, current.context, active, {\n trackExpansion: props.restoreExpansionOnBackspace ?? true,\n });\n clearCompletion();\n if (applied) queueMicrotask(recomputeCompletion);\n return applied;\n };\n\n const moveSelection = (direction: 1 | -1): void => {\n const current = state();\n if (!current || current.suggestions.length === 0) return;\n setState({\n ...current,\n selectedIndex: (current.selectedIndex + direction + current.suggestions.length) % current.suggestions.length,\n });\n };\n\n onMount(() => {\n const selectionChange = (): void => {\n if (document.activeElement === textarea) recomputeCompletion();\n };\n // Reposition an OPEN popover only. Calling `positionDropdown` blindly\n // would `showPopover()` a dropdown that is deliberately closed (a\n // ghost-only completion keeps state without a dropdown).\n const reposition = (): void => {\n if (dropdown?.matches(\":popover-open\")) positionDropdown();\n };\n document.addEventListener(\"selectionchange\", selectionChange);\n window.addEventListener(\"resize\", reposition);\n onCleanup(() => {\n document.removeEventListener(\"selectionchange\", selectionChange);\n window.removeEventListener(\"resize\", reposition);\n if (dropdown?.matches(\":popover-open\")) dropdown.hidePopover();\n currentAbort?.abort();\n if (currentTimer) clearTimeout(currentTimer);\n if (overlayFrame !== undefined) cancelAnimationFrame(overlayFrame);\n overlayFrame = undefined;\n renderPendingOverlay = undefined;\n completionBehavior.reset();\n });\n });\n\n const onInput = (event: InputEvent & { currentTarget: HTMLTextAreaElement }): void => {\n if (event.inputType.startsWith(\"insert\") && completionBehavior.tryExpand(event.currentTarget, props.completions)) {\n return;\n }\n setLocalValue(event.currentTarget.value);\n props.onValueChange?.(event.currentTarget.value);\n recomputeCompletion();\n };\n\n const onKeyDown = (event: KeyboardEvent): void => {\n if (!textarea || event.isComposing) return;\n if (\n (props.restoreExpansionOnBackspace ?? true) &&\n event.key === \"Backspace\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.altKey &&\n !event.shiftKey &&\n completionBehavior.tryRestore(textarea)\n ) {\n event.preventDefault();\n return;\n }\n const current = state();\n const dropdownCompletion = current?.context.completion.dropdown === true;\n if (current && dropdownCompletion && (event.key === \"ArrowDown\" || event.key === \"ArrowUp\")) {\n event.preventDefault();\n moveSelection(event.key === \"ArrowDown\" ? 1 : -1);\n return;\n }\n if (event.key === \"Enter\" && !event.shiftKey && !event.metaKey && !event.ctrlKey && !event.altKey) {\n if (current && dropdownCompletion && dropdownOpen()) {\n event.preventDefault();\n activateSuggestion();\n return;\n }\n if (props.singleLine) {\n event.preventDefault();\n props.onSubmit?.();\n return;\n }\n }\n if (event.key === \"Enter\" && (event.metaKey || event.ctrlKey) && !props.singleLine && props.onSubmit) {\n event.preventDefault();\n props.onSubmit();\n return;\n }\n if (event.key === \"Tab\" && !event.shiftKey && !event.metaKey && !event.ctrlKey && !event.altKey && current) {\n event.preventDefault();\n activateSuggestion();\n return;\n }\n if (event.key === \"Escape\") {\n if (current) {\n event.preventDefault();\n clearCompletion();\n } else if ((props.completions?.length ?? 0) > 0) {\n event.preventDefault();\n textarea.blur();\n }\n }\n };\n\n const surfaceStyle = (): JSX.CSSProperties => ({\n \"--k2b-editor-lines\": String(props.lines ?? 3),\n });\n\n return (\n <Field\n class={props.class}\n label={props.label}\n description={props.description}\n error={props.error}\n fill={props.fill && !props.singleLine}\n meta={meta}\n required={props.required}\n disabled={props.disabled}\n >\n <div\n class=\"k2b-autocomplete\"\n data-overlay={useOverlay() ? \"true\" : undefined}\n data-single-line={props.singleLine ? \"true\" : undefined}\n data-fill={props.fill && !props.singleLine ? \"true\" : undefined}\n data-disabled={props.disabled ? \"true\" : undefined}\n data-invalid={error() ? \"true\" : undefined}\n data-variant={props.variant === \"paper\" ? \"paper\" : undefined}\n style={surfaceStyle()}\n >\n <div class=\"k2b-autocomplete__surface\">\n <Show when={!localValue() && props.placeholder}>\n <div class=\"k2b-autocomplete__placeholder\" aria-hidden=\"true\">\n {props.placeholder}\n </div>\n </Show>\n <div ref={preview} class=\"k2b-autocomplete__preview\" aria-hidden=\"true\" />\n <textarea\n ref={(element) => {\n textarea = element;\n props.textareaRef?.(element);\n }}\n id={meta.controlId}\n name={props.name}\n class=\"k2b-autocomplete__input\"\n onInput={onInput}\n onChange={(event) => props.onValueCommit?.(event.currentTarget.value)}\n onKeyDown={onKeyDown}\n onScroll={(event) => {\n if (preview) {\n preview.scrollTop = event.currentTarget.scrollTop;\n preview.scrollLeft = event.currentTarget.scrollLeft;\n }\n if (dropdown?.matches(\":popover-open\")) positionDropdown();\n }}\n onCompositionStart={() => setComposing(true)}\n onCompositionEnd={() => setComposing(false)}\n onBlur={(event) => {\n const next = event.relatedTarget as HTMLElement | null;\n if (next && dropdown?.contains(next)) return;\n completionBehavior.reset();\n clearCompletion();\n }}\n disabled={props.disabled}\n required={props.required}\n spellcheck={props.spellcheck ?? false}\n maxLength={props.maxLength}\n rows={props.singleLine ? 1 : (props.lines ?? 3)}\n {...fieldControlAria(meta, props)}\n aria-haspopup=\"listbox\"\n aria-autocomplete=\"list\"\n aria-controls={dropdownOpen() ? listboxId : undefined}\n aria-activedescendant={dropdownOpen() && state() ? optionId(state()!.selectedIndex) : undefined}\n />\n </div>\n <Show when={state() || loading() || completionError()}>\n <div\n ref={dropdown}\n popover=\"manual\"\n class=\"k2b-autocomplete__options\"\n role=\"presentation\"\n aria-label={completionMessages().completionSuggestions}\n >\n <div id={listboxId} class=\"k2b-autocomplete__listbox\" role=\"listbox\" aria-label={completionMessages().suggestions}>\n <Show when={loading()}>\n <div class=\"k2b-autocomplete__status\" role=\"status\">\n <i class=\"ti ti-loader-2 k2b-spin\" aria-hidden=\"true\" />\n Loading suggestions\n </div>\n </Show>\n <Show when={completionError()}>\n {(message) => (\n <div class=\"k2b-autocomplete__status\" data-error=\"true\" role=\"alert\">\n <i class=\"ti ti-alert-circle\" aria-hidden=\"true\" />\n <span>{message()}</span>\n <button type=\"button\" onMouseDown={(event) => event.preventDefault()} onClick={retryCompletion}>\n {messages().retry}\n </button>\n </div>\n )}\n </Show>\n <For each={state()?.suggestions ?? []}>\n {(suggestion, index) => (\n // biome-ignore lint/a11y/useKeyWithClickEvents: the owning textarea handles keyboard activation through aria-activedescendant.\n <div\n id={optionId(index())}\n class=\"k2b-autocomplete__option\"\n role=\"option\"\n aria-selected={index() === state()?.selectedIndex}\n data-loading={loading() ? \"true\" : undefined}\n onMouseEnter={() => {\n const current = state();\n if (current) {\n setState({ ...current, selectedIndex: index() });\n }\n }}\n onMouseDown={(event) => {\n event.preventDefault();\n }}\n onClick={() => {\n activateSuggestion(index());\n textarea?.focus();\n }}\n >\n <span>{displayLabel(suggestion, state()!.context.completion)}</span>\n <Show when={suggestion.hint}>{(hint) => <small>{hint()}</small>}</Show>\n </div>\n )}\n </For>\n </div>\n </div>\n </Show>\n </div>\n </Field>\n );\n}\n\nexport type { Completion, SuggestContext, Suggestion } from \"./completion\";\nexport { abbreviations } from \"./completion\";\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -34,9 +34,11 @@ import { useUiMessages } from "../intl/messages";
|
|
|
34
34
|
import { ChoiceGroups } from "./ChoiceGroups";
|
|
35
35
|
import { createChoiceLoader, createChoicePopover, nextEnabledChoiceIndex } from "./choice";
|
|
36
36
|
import { commitFieldValue, resolveMaybeAccessor } from "./field-contract";
|
|
37
|
+
import { useSelectMessages } from "./select-messages";
|
|
37
38
|
const errorMessage = (error, fallback) => error instanceof Error ? error.message : fallback;
|
|
38
39
|
export function AutocompleteSelect(props) {
|
|
39
40
|
const messages = useUiMessages();
|
|
41
|
+
const selectMessages = useSelectMessages();
|
|
40
42
|
const meta = createFieldMeta(props.id);
|
|
41
43
|
const listboxId = `${meta.controlId}-listbox`;
|
|
42
44
|
const [cache, setCache] = createSignal({});
|
|
@@ -123,7 +125,7 @@ export function AutocompleteSelect(props) {
|
|
|
123
125
|
commitFieldValue(props, option.value);
|
|
124
126
|
setEditing(false);
|
|
125
127
|
};
|
|
126
|
-
const invalidate = (message = props.noMatchText ??
|
|
128
|
+
const invalidate = (message = props.noMatchText ?? selectMessages().noMatchingOption) => {
|
|
127
129
|
pendingCommitQuery = undefined;
|
|
128
130
|
setInternalError(message);
|
|
129
131
|
popover.hide();
|
|
@@ -135,7 +137,7 @@ export function AutocompleteSelect(props) {
|
|
|
135
137
|
} catch (reason) {
|
|
136
138
|
if (!signal.aborted) {
|
|
137
139
|
setResolvedQuery(typed);
|
|
138
|
-
if (pendingCommitQuery === typed) invalidate(errorMessage(reason,
|
|
140
|
+
if (pendingCommitQuery === typed) invalidate(errorMessage(reason, selectMessages().optionsCouldNotLoad));
|
|
139
141
|
}
|
|
140
142
|
throw reason;
|
|
141
143
|
}
|
|
@@ -244,7 +246,7 @@ export function AutocompleteSelect(props) {
|
|
|
244
246
|
createEffect(() => {
|
|
245
247
|
if (!inputRef) return;
|
|
246
248
|
const message = internalError();
|
|
247
|
-
inputRef.setCustomValidity(message ?? (editing() ?
|
|
249
|
+
inputRef.setCustomValidity(message ?? (editing() ? selectMessages().selectMatchingOption : ""));
|
|
248
250
|
});
|
|
249
251
|
const onKeyDown = event => {
|
|
250
252
|
if (event.isComposing) return;
|
|
@@ -327,7 +329,7 @@ export function AutocompleteSelect(props) {
|
|
|
327
329
|
return display();
|
|
328
330
|
},
|
|
329
331
|
get placeholder() {
|
|
330
|
-
return props.placeholder ??
|
|
332
|
+
return props.placeholder ?? selectMessages().typeToSearch;
|
|
331
333
|
},
|
|
332
334
|
get disabled() {
|
|
333
335
|
return props.disabled;
|
|
@@ -449,7 +451,7 @@ export function AutocompleteSelect(props) {
|
|
|
449
451
|
}), _el$25, _co$7);
|
|
450
452
|
_$insert(_el$1, (() => {
|
|
451
453
|
var _c$ = _$memo(() => !!loader.loading());
|
|
452
|
-
return () => _c$() ? props.checkingText ??
|
|
454
|
+
return () => _c$() ? props.checkingText ?? selectMessages().checkingOptions : _$memo(() => !!match())() ? `Match: ${formatValue(match())}` : internalError() ?? "";
|
|
453
455
|
})());
|
|
454
456
|
_el$10.$$keydown = event => {
|
|
455
457
|
if (event.key !== "Escape") return;
|
|
@@ -483,7 +485,7 @@ export function AutocompleteSelect(props) {
|
|
|
483
485
|
},
|
|
484
486
|
onValueChange: chooseGroup,
|
|
485
487
|
get ariaLabel() {
|
|
486
|
-
return props.groupsAriaLabel ??
|
|
488
|
+
return props.groupsAriaLabel ?? selectMessages().filterOptions;
|
|
487
489
|
},
|
|
488
490
|
controls: listboxId
|
|
489
491
|
}));
|
|
@@ -517,7 +519,7 @@ export function AutocompleteSelect(props) {
|
|
|
517
519
|
var _el$13 = _$getNextElement(_tmpl$4),
|
|
518
520
|
_el$14 = _el$13.firstChild,
|
|
519
521
|
_el$15 = _el$14.nextSibling;
|
|
520
|
-
_$insert(_el$15, () => props.checkingText ??
|
|
522
|
+
_$insert(_el$15, () => props.checkingText ?? selectMessages().checkingOptionsLoading);
|
|
521
523
|
return _el$13;
|
|
522
524
|
}
|
|
523
525
|
}), _el$19, _co$4);
|
|
@@ -532,7 +534,7 @@ export function AutocompleteSelect(props) {
|
|
|
532
534
|
},
|
|
533
535
|
get children() {
|
|
534
536
|
var _el$32 = _$getNextElement(_tmpl$0);
|
|
535
|
-
_$insert(_el$32, () => props.noOptionsText ??
|
|
537
|
+
_$insert(_el$32, () => props.noOptionsText ?? selectMessages().noOptionsFound);
|
|
536
538
|
return _el$32;
|
|
537
539
|
}
|
|
538
540
|
});
|