@k2b/ui 0.21.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/actions/ContextMenu.js +3 -1
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/FilterChip.js +3 -1
- package/dist/browser/actions/FilterChip.js.map +1 -1
- package/dist/browser/actions/SpotlightSearch.js +3 -1
- package/dist/browser/actions/SpotlightSearch.js.map +1 -1
- package/dist/browser/actions/filter-messages.js +20 -0
- package/dist/browser/actions/filter-messages.js.map +1 -0
- package/dist/browser/actions/spotlight-messages.js +16 -0
- package/dist/browser/actions/spotlight-messages.js.map +1 -0
- package/dist/browser/chat/ChatComposer.js +47 -41
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatPrimitives.js +25 -23
- package/dist/browser/chat/ChatPrimitives.js.map +1 -1
- package/dist/browser/chat/ChatRoot.js +3 -3
- package/dist/browser/chat/ChatRoot.js.map +1 -1
- package/dist/browser/chat/ChatTimeline.js +12 -12
- package/dist/browser/chat/ChatTimeline.js.map +1 -1
- package/dist/browser/chat/chat-messages.js +236 -0
- package/dist/browser/chat/chat-messages.js.map +1 -0
- package/dist/browser/content/Calendar.js +18 -19
- package/dist/browser/content/Calendar.js.map +1 -1
- package/dist/browser/content/Chart.js +15 -8
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartExplorer.js +20 -12
- package/dist/browser/content/ChartExplorer.js.map +1 -1
- package/dist/browser/content/ChartExplorerControls.js +9 -7
- package/dist/browser/content/ChartExplorerControls.js.map +1 -1
- package/dist/browser/content/ChartFilterControls.js +4 -2
- package/dist/browser/content/ChartFilterControls.js.map +1 -1
- package/dist/browser/content/ChartSnapshotView.js +3 -3
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/DataTable.js +68 -59
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/Docs.js +3 -1
- package/dist/browser/content/Docs.js.map +1 -1
- package/dist/browser/content/FileBrowser.js +30 -26
- package/dist/browser/content/FileBrowser.js.map +1 -1
- package/dist/browser/content/FileTree.js +9 -7
- package/dist/browser/content/FileTree.js.map +1 -1
- package/dist/browser/content/FileView.js +37 -28
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/Lightbox.js +9 -7
- package/dist/browser/content/Lightbox.js.map +1 -1
- package/dist/browser/content/LogEntriesTable.js +3 -3
- package/dist/browser/content/LogEntriesTable.js.map +1 -1
- package/dist/browser/content/MessageRow.js +24 -22
- package/dist/browser/content/MessageRow.js.map +1 -1
- package/dist/browser/content/Pagination.js +7 -7
- package/dist/browser/content/Pagination.js.map +1 -1
- package/dist/browser/content/PdfPreview.js +15 -13
- package/dist/browser/content/PdfPreview.js.map +1 -1
- package/dist/browser/content/RangePicker.js +3 -1
- package/dist/browser/content/RangePicker.js.map +1 -1
- package/dist/browser/content/StructuredDataPreview.js +3 -1
- package/dist/browser/content/StructuredDataPreview.js.map +1 -1
- package/dist/browser/content/Timeline.js +13 -11
- package/dist/browser/content/Timeline.js.map +1 -1
- package/dist/browser/content/VideoPlayer.js +5 -5
- package/dist/browser/content/VideoPlayer.js.map +1 -1
- package/dist/browser/content/VirtualFeed.js +6 -4
- package/dist/browser/content/VirtualFeed.js.map +1 -1
- package/dist/browser/content/ZoomPanViewport.js +10 -7
- package/dist/browser/content/ZoomPanViewport.js.map +1 -1
- package/dist/browser/content/calendar-messages.js +39 -1
- package/dist/browser/content/calendar-messages.js.map +1 -1
- package/dist/browser/content/calendar-pointer.js +4 -3
- package/dist/browser/content/calendar-pointer.js.map +1 -1
- package/dist/browser/content/chart-messages.js +136 -0
- package/dist/browser/content/chart-messages.js.map +1 -0
- package/dist/browser/content/collection-selection.js +2 -0
- package/dist/browser/content/collection-selection.js.map +1 -1
- package/dist/browser/content/data-table-messages.js +24 -0
- package/dist/browser/content/data-table-messages.js.map +1 -0
- package/dist/browser/content/docs-messages.js +24 -0
- package/dist/browser/content/docs-messages.js.map +1 -0
- package/dist/browser/content/feed-messages.js +34 -0
- package/dist/browser/content/feed-messages.js.map +1 -0
- package/dist/browser/content/file-browser-messages.js +69 -0
- package/dist/browser/content/file-browser-messages.js.map +1 -0
- package/dist/browser/content/file-view-messages.js +64 -0
- package/dist/browser/content/file-view-messages.js.map +1 -0
- package/dist/browser/content/lightbox-messages.js +36 -0
- package/dist/browser/content/lightbox-messages.js.map +1 -0
- package/dist/browser/content/log-entries-messages.js +20 -0
- package/dist/browser/content/log-entries-messages.js.map +1 -0
- package/dist/browser/content/markdown-info-block-messages.js +24 -0
- package/dist/browser/content/markdown-info-block-messages.js.map +1 -0
- package/dist/browser/content/markdown-info-blocks.js +3 -3
- package/dist/browser/content/markdown-info-blocks.js.map +1 -1
- package/dist/browser/content/markdown-links.js +2 -2
- package/dist/browser/content/markdown-links.js.map +1 -1
- package/dist/browser/content/markdown-reference-messages.js +30 -0
- package/dist/browser/content/markdown-reference-messages.js.map +1 -0
- package/dist/browser/content/pagination-messages.js +38 -0
- package/dist/browser/content/pagination-messages.js.map +1 -0
- package/dist/browser/content/pdf-messages.js +43 -0
- package/dist/browser/content/pdf-messages.js.map +1 -0
- package/dist/browser/content/range-picker-messages.js +20 -0
- package/dist/browser/content/range-picker-messages.js.map +1 -0
- package/dist/browser/content/structured-data-messages.js +22 -0
- package/dist/browser/content/structured-data-messages.js.map +1 -0
- package/dist/browser/content/timeline-messages.js +62 -0
- package/dist/browser/content/timeline-messages.js.map +1 -0
- package/dist/browser/content/video-messages.js +24 -0
- package/dist/browser/content/video-messages.js.map +1 -0
- package/dist/browser/content/viewport-messages.js +28 -0
- package/dist/browser/content/viewport-messages.js.map +1 -0
- package/dist/browser/feedback/HoverPreview.js +34 -6
- package/dist/browser/feedback/HoverPreview.js.map +1 -1
- package/dist/browser/feedback/InstallGuide.js +18 -18
- package/dist/browser/feedback/InstallGuide.js.map +1 -1
- package/dist/browser/feedback/install-messages.js +104 -0
- package/dist/browser/feedback/install-messages.js.map +1 -0
- package/dist/browser/feedback/prompt-messages.js +65 -0
- package/dist/browser/feedback/prompt-messages.js.map +1 -0
- package/dist/browser/feedback/prompts.js +14 -11
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/feedback/toast-messages.js +18 -0
- package/dist/browser/feedback/toast-messages.js.map +1 -0
- package/dist/browser/feedback/toast.js +4 -3
- package/dist/browser/feedback/toast.js.map +1 -1
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/inputs/AutocompleteEditor.js +6 -4
- package/dist/browser/inputs/AutocompleteEditor.js.map +1 -1
- package/dist/browser/inputs/AutocompleteSelect.js +10 -8
- package/dist/browser/inputs/AutocompleteSelect.js.map +1 -1
- package/dist/browser/inputs/ChoiceGroups.js +4 -0
- package/dist/browser/inputs/ChoiceGroups.js.map +1 -1
- package/dist/browser/inputs/ChoiceInputs.js +5 -5
- package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
- package/dist/browser/inputs/Combobox.js +3 -1
- package/dist/browser/inputs/Combobox.js.map +1 -1
- package/dist/browser/inputs/FileDropTarget.js +6 -6
- package/dist/browser/inputs/FileDropTarget.js.map +1 -1
- package/dist/browser/inputs/FileInputs.js +30 -21
- package/dist/browser/inputs/FileInputs.js.map +1 -1
- package/dist/browser/inputs/MultiSelectInput.js +7 -5
- package/dist/browser/inputs/MultiSelectInput.js.map +1 -1
- package/dist/browser/inputs/NumberInput.js +4 -2
- package/dist/browser/inputs/NumberInput.js.map +1 -1
- package/dist/browser/inputs/QrScanner.js +5 -5
- package/dist/browser/inputs/QrScanner.js.map +1 -1
- package/dist/browser/inputs/Select.js +7 -5
- package/dist/browser/inputs/Select.js.map +1 -1
- package/dist/browser/inputs/SelectChip.js +3 -3
- package/dist/browser/inputs/SelectChip.js.map +1 -1
- package/dist/browser/inputs/SignatureInput.js +9 -3
- package/dist/browser/inputs/SignatureInput.js.map +1 -1
- package/dist/browser/inputs/SpecialInputs.js +4 -2
- package/dist/browser/inputs/SpecialInputs.js.map +1 -1
- package/dist/browser/inputs/TagEditor.js +8 -6
- package/dist/browser/inputs/TagEditor.js.map +1 -1
- package/dist/browser/inputs/TagsInput.js +5 -5
- package/dist/browser/inputs/TagsInput.js.map +1 -1
- package/dist/browser/inputs/TemplateEditor.js +5 -5
- package/dist/browser/inputs/TemplateEditor.js.map +1 -1
- package/dist/browser/inputs/TextInput.js +3 -1
- package/dist/browser/inputs/TextInput.js.map +1 -1
- package/dist/browser/inputs/completion-messages.js +24 -0
- package/dist/browser/inputs/completion-messages.js.map +1 -0
- package/dist/browser/inputs/file-drop-messages.js +63 -0
- package/dist/browser/inputs/file-drop-messages.js.map +1 -0
- package/dist/browser/inputs/file-drop.js.map +1 -1
- package/dist/browser/inputs/file-input-messages.js +60 -0
- package/dist/browser/inputs/file-input-messages.js.map +1 -0
- package/dist/browser/inputs/icon-messages.js +22 -0
- package/dist/browser/inputs/icon-messages.js.map +1 -0
- package/dist/browser/inputs/input-messages.js +38 -0
- package/dist/browser/inputs/input-messages.js.map +1 -0
- package/dist/browser/inputs/markdown/MarkdownEditor.js +10 -6
- package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/browser/inputs/markdown/Toolbar.js +13 -13
- package/dist/browser/inputs/markdown/Toolbar.js.map +1 -1
- package/dist/browser/inputs/markdown/editor-messages.js +43 -0
- package/dist/browser/inputs/markdown/editor-messages.js.map +1 -0
- package/dist/browser/inputs/markdown/toolbar-messages.js +40 -0
- package/dist/browser/inputs/markdown/toolbar-messages.js.map +1 -0
- package/dist/browser/inputs/qr-messages.js +26 -0
- package/dist/browser/inputs/qr-messages.js.map +1 -0
- package/dist/browser/inputs/select-messages.js +63 -0
- package/dist/browser/inputs/select-messages.js.map +1 -0
- package/dist/browser/inputs/tag-messages.js +44 -0
- package/dist/browser/inputs/tag-messages.js.map +1 -0
- package/dist/browser/inputs/template-messages.js +22 -0
- package/dist/browser/inputs/template-messages.js.map +1 -0
- package/dist/browser/internal/render-error-messages.js +20 -0
- package/dist/browser/internal/render-error-messages.js.map +1 -0
- package/dist/browser/internal/render-error.js +3 -1
- package/dist/browser/internal/render-error.js.map +1 -1
- package/dist/browser/internal/text-selection.js +101 -0
- package/dist/browser/internal/text-selection.js.map +1 -0
- package/dist/browser/intl/messages.js +6 -1155
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +561 -418
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/BottomSheet.js +6 -1
- package/dist/browser/layout/BottomSheet.js.map +1 -1
- package/dist/browser/layout/Discussion.js +8 -5
- package/dist/browser/layout/Discussion.js.map +1 -1
- package/dist/browser/layout/FloatingWindow.js +8 -5
- package/dist/browser/layout/FloatingWindow.js.map +1 -1
- package/dist/browser/layout/Navigation.js +7 -6
- package/dist/browser/layout/Navigation.js.map +1 -1
- package/dist/browser/layout/PageTitle.js +370 -0
- package/dist/browser/layout/PageTitle.js.map +1 -0
- package/dist/browser/layout/PanelDialog.js +8 -6
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/Panes.js +23 -15
- package/dist/browser/layout/Panes.js.map +1 -1
- package/dist/browser/layout/PullToRefresh.js +13 -4
- package/dist/browser/layout/PullToRefresh.js.map +1 -1
- package/dist/browser/layout/Settings.js +14 -12
- package/dist/browser/layout/Settings.js.map +1 -1
- package/dist/browser/layout/SettingsCollection.js +6 -5
- package/dist/browser/layout/SettingsCollection.js.map +1 -1
- package/dist/browser/layout/SettingsModal.js +3 -1
- package/dist/browser/layout/SettingsModal.js.map +1 -1
- package/dist/browser/layout/app-workspace-controller.js +743 -12
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/app-workspace-state.js +3 -2
- package/dist/browser/layout/app-workspace-state.js.map +1 -1
- package/dist/browser/layout/floating-window-messages.js +28 -0
- package/dist/browser/layout/floating-window-messages.js.map +1 -0
- package/dist/browser/layout/index.js +2 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/navigation-model.js.map +1 -1
- package/dist/browser/layout/page-title-controller.js +169 -0
- package/dist/browser/layout/page-title-controller.js.map +1 -0
- package/dist/browser/layout/panel-dialog-messages.js +20 -0
- package/dist/browser/layout/panel-dialog-messages.js.map +1 -0
- package/dist/browser/layout/panes-messages.js +48 -0
- package/dist/browser/layout/panes-messages.js.map +1 -0
- package/dist/browser/layout/refresh-messages.js +20 -0
- package/dist/browser/layout/refresh-messages.js.map +1 -0
- package/dist/browser/layout/settings-messages.js +54 -0
- package/dist/browser/layout/settings-messages.js.map +1 -0
- package/dist/browser/layout/workspace-messages.js +56 -0
- package/dist/browser/layout/workspace-messages.js.map +1 -0
- package/dist/browser/surfaces/Avatar.js +5 -5
- package/dist/browser/surfaces/Avatar.js.map +1 -1
- package/dist/browser/surfaces/ResourceCard.js +4 -2
- package/dist/browser/surfaces/ResourceCard.js.map +1 -1
- package/dist/browser/surfaces/Tag.js +3 -3
- package/dist/browser/surfaces/Tag.js.map +1 -1
- package/dist/browser/surfaces/avatar-messages.js +26 -0
- package/dist/browser/surfaces/avatar-messages.js.map +1 -0
- package/dist/browser/surfaces/resource-messages.js +26 -0
- package/dist/browser/surfaces/resource-messages.js.map +1 -0
- package/dist/browser/widgets/Widget.js +6 -0
- package/dist/browser/widgets/Widget.js.map +1 -1
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/FilterChip.js +3 -1
- package/dist/ssr/actions/FilterChip.js.map +1 -1
- package/dist/ssr/actions/SpotlightSearch.js +3 -1
- package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
- package/dist/ssr/actions/filter-messages.js +20 -0
- package/dist/ssr/actions/filter-messages.js.map +1 -0
- package/dist/ssr/actions/spotlight-messages.js +16 -0
- package/dist/ssr/actions/spotlight-messages.js.map +1 -0
- package/dist/ssr/chat/ChatComposer.js +47 -41
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatPrimitives.js +23 -21
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
- package/dist/ssr/chat/ChatRoot.js +3 -3
- package/dist/ssr/chat/ChatRoot.js.map +1 -1
- package/dist/ssr/chat/ChatTimeline.js +11 -11
- package/dist/ssr/chat/ChatTimeline.js.map +1 -1
- package/dist/ssr/chat/chat-messages.js +236 -0
- package/dist/ssr/chat/chat-messages.js.map +1 -0
- package/dist/ssr/content/Calendar.js +18 -19
- package/dist/ssr/content/Calendar.js.map +1 -1
- package/dist/ssr/content/Chart.js +12 -5
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartExplorer.js +10 -8
- package/dist/ssr/content/ChartExplorer.js.map +1 -1
- package/dist/ssr/content/ChartExplorerControls.js +9 -7
- package/dist/ssr/content/ChartExplorerControls.js.map +1 -1
- package/dist/ssr/content/ChartFilterControls.js +4 -2
- package/dist/ssr/content/ChartFilterControls.js.map +1 -1
- package/dist/ssr/content/ChartSnapshotView.js +3 -3
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/DataTable.js +10 -4
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/Docs.js +3 -1
- package/dist/ssr/content/Docs.js.map +1 -1
- package/dist/ssr/content/FileBrowser.js +30 -26
- package/dist/ssr/content/FileBrowser.js.map +1 -1
- package/dist/ssr/content/FileTree.js +9 -7
- package/dist/ssr/content/FileTree.js.map +1 -1
- package/dist/ssr/content/FileView.js +37 -28
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/Lightbox.js +8 -6
- package/dist/ssr/content/Lightbox.js.map +1 -1
- package/dist/ssr/content/LogEntriesTable.js +3 -3
- package/dist/ssr/content/LogEntriesTable.js.map +1 -1
- package/dist/ssr/content/MessageRow.js +24 -22
- package/dist/ssr/content/MessageRow.js.map +1 -1
- package/dist/ssr/content/Pagination.js +6 -6
- package/dist/ssr/content/Pagination.js.map +1 -1
- package/dist/ssr/content/PdfPreview.js +15 -13
- package/dist/ssr/content/PdfPreview.js.map +1 -1
- package/dist/ssr/content/RangePicker.js +3 -1
- package/dist/ssr/content/RangePicker.js.map +1 -1
- package/dist/ssr/content/StructuredDataPreview.js +3 -1
- package/dist/ssr/content/StructuredDataPreview.js.map +1 -1
- package/dist/ssr/content/Timeline.js +13 -11
- package/dist/ssr/content/Timeline.js.map +1 -1
- package/dist/ssr/content/VideoPlayer.js +5 -5
- package/dist/ssr/content/VideoPlayer.js.map +1 -1
- package/dist/ssr/content/VirtualFeed.js +6 -4
- package/dist/ssr/content/VirtualFeed.js.map +1 -1
- package/dist/ssr/content/ZoomPanViewport.js +7 -4
- package/dist/ssr/content/ZoomPanViewport.js.map +1 -1
- package/dist/ssr/content/calendar-messages.js +39 -1
- package/dist/ssr/content/calendar-messages.js.map +1 -1
- package/dist/ssr/content/calendar-pointer.js +4 -3
- package/dist/ssr/content/calendar-pointer.js.map +1 -1
- package/dist/ssr/content/chart-messages.js +136 -0
- package/dist/ssr/content/chart-messages.js.map +1 -0
- package/dist/ssr/content/collection-selection.js +2 -0
- package/dist/ssr/content/collection-selection.js.map +1 -1
- package/dist/ssr/content/data-table-messages.js +24 -0
- package/dist/ssr/content/data-table-messages.js.map +1 -0
- package/dist/ssr/content/docs-messages.js +24 -0
- package/dist/ssr/content/docs-messages.js.map +1 -0
- package/dist/ssr/content/feed-messages.js +34 -0
- package/dist/ssr/content/feed-messages.js.map +1 -0
- package/dist/ssr/content/file-browser-messages.js +69 -0
- package/dist/ssr/content/file-browser-messages.js.map +1 -0
- package/dist/ssr/content/file-view-messages.js +64 -0
- package/dist/ssr/content/file-view-messages.js.map +1 -0
- package/dist/ssr/content/lightbox-messages.js +36 -0
- package/dist/ssr/content/lightbox-messages.js.map +1 -0
- package/dist/ssr/content/log-entries-messages.js +20 -0
- package/dist/ssr/content/log-entries-messages.js.map +1 -0
- package/dist/ssr/content/markdown-info-block-messages.js +24 -0
- package/dist/ssr/content/markdown-info-block-messages.js.map +1 -0
- package/dist/ssr/content/markdown-info-blocks.js +3 -3
- package/dist/ssr/content/markdown-info-blocks.js.map +1 -1
- package/dist/ssr/content/markdown-links.js +2 -2
- package/dist/ssr/content/markdown-links.js.map +1 -1
- package/dist/ssr/content/markdown-reference-messages.js +30 -0
- package/dist/ssr/content/markdown-reference-messages.js.map +1 -0
- package/dist/ssr/content/pagination-messages.js +38 -0
- package/dist/ssr/content/pagination-messages.js.map +1 -0
- package/dist/ssr/content/pdf-messages.js +43 -0
- package/dist/ssr/content/pdf-messages.js.map +1 -0
- package/dist/ssr/content/range-picker-messages.js +20 -0
- package/dist/ssr/content/range-picker-messages.js.map +1 -0
- package/dist/ssr/content/structured-data-messages.js +22 -0
- package/dist/ssr/content/structured-data-messages.js.map +1 -0
- package/dist/ssr/content/timeline-messages.js +62 -0
- package/dist/ssr/content/timeline-messages.js.map +1 -0
- package/dist/ssr/content/video-messages.js +24 -0
- package/dist/ssr/content/video-messages.js.map +1 -0
- package/dist/ssr/content/viewport-messages.js +28 -0
- package/dist/ssr/content/viewport-messages.js.map +1 -0
- package/dist/ssr/feedback/HoverPreview.js +34 -6
- package/dist/ssr/feedback/HoverPreview.js.map +1 -1
- package/dist/ssr/feedback/InstallGuide.js +18 -18
- package/dist/ssr/feedback/InstallGuide.js.map +1 -1
- package/dist/ssr/feedback/install-messages.js +104 -0
- package/dist/ssr/feedback/install-messages.js.map +1 -0
- package/dist/ssr/feedback/prompt-messages.js +65 -0
- package/dist/ssr/feedback/prompt-messages.js.map +1 -0
- package/dist/ssr/feedback/prompts.js +14 -11
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/feedback/toast-messages.js +18 -0
- package/dist/ssr/feedback/toast-messages.js.map +1 -0
- package/dist/ssr/feedback/toast.js +4 -3
- package/dist/ssr/feedback/toast.js.map +1 -1
- package/dist/ssr/index.js +1 -1
- package/dist/ssr/index.js.map +1 -1
- package/dist/ssr/inputs/AutocompleteEditor.js +5 -3
- package/dist/ssr/inputs/AutocompleteEditor.js.map +1 -1
- package/dist/ssr/inputs/AutocompleteSelect.js +10 -8
- package/dist/ssr/inputs/AutocompleteSelect.js.map +1 -1
- package/dist/ssr/inputs/ChoiceGroups.js +4 -0
- package/dist/ssr/inputs/ChoiceGroups.js.map +1 -1
- package/dist/ssr/inputs/ChoiceInputs.js +5 -5
- package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
- package/dist/ssr/inputs/Combobox.js +3 -1
- package/dist/ssr/inputs/Combobox.js.map +1 -1
- package/dist/ssr/inputs/FileDropTarget.js +6 -6
- package/dist/ssr/inputs/FileDropTarget.js.map +1 -1
- package/dist/ssr/inputs/FileInputs.js +29 -20
- package/dist/ssr/inputs/FileInputs.js.map +1 -1
- package/dist/ssr/inputs/MultiSelectInput.js +7 -5
- package/dist/ssr/inputs/MultiSelectInput.js.map +1 -1
- package/dist/ssr/inputs/NumberInput.js +4 -2
- package/dist/ssr/inputs/NumberInput.js.map +1 -1
- package/dist/ssr/inputs/QrScanner.js +4 -4
- package/dist/ssr/inputs/QrScanner.js.map +1 -1
- package/dist/ssr/inputs/Select.js +7 -5
- package/dist/ssr/inputs/Select.js.map +1 -1
- package/dist/ssr/inputs/SelectChip.js +3 -3
- package/dist/ssr/inputs/SelectChip.js.map +1 -1
- package/dist/ssr/inputs/SignatureInput.js +9 -3
- package/dist/ssr/inputs/SignatureInput.js.map +1 -1
- package/dist/ssr/inputs/SpecialInputs.js +4 -2
- package/dist/ssr/inputs/SpecialInputs.js.map +1 -1
- package/dist/ssr/inputs/TagEditor.js +8 -6
- package/dist/ssr/inputs/TagEditor.js.map +1 -1
- package/dist/ssr/inputs/TagsInput.js +5 -5
- package/dist/ssr/inputs/TagsInput.js.map +1 -1
- package/dist/ssr/inputs/TemplateEditor.js +5 -5
- package/dist/ssr/inputs/TemplateEditor.js.map +1 -1
- package/dist/ssr/inputs/TextInput.js +3 -1
- package/dist/ssr/inputs/TextInput.js.map +1 -1
- package/dist/ssr/inputs/completion-messages.js +24 -0
- package/dist/ssr/inputs/completion-messages.js.map +1 -0
- package/dist/ssr/inputs/file-drop-messages.js +63 -0
- package/dist/ssr/inputs/file-drop-messages.js.map +1 -0
- package/dist/ssr/inputs/file-drop.js.map +1 -1
- package/dist/ssr/inputs/file-input-messages.js +60 -0
- package/dist/ssr/inputs/file-input-messages.js.map +1 -0
- package/dist/ssr/inputs/icon-messages.js +22 -0
- package/dist/ssr/inputs/icon-messages.js.map +1 -0
- package/dist/ssr/inputs/input-messages.js +38 -0
- package/dist/ssr/inputs/input-messages.js.map +1 -0
- package/dist/ssr/inputs/markdown/MarkdownEditor.js +9 -5
- package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/ssr/inputs/markdown/Toolbar.js +13 -13
- package/dist/ssr/inputs/markdown/Toolbar.js.map +1 -1
- package/dist/ssr/inputs/markdown/editor-messages.js +43 -0
- package/dist/ssr/inputs/markdown/editor-messages.js.map +1 -0
- package/dist/ssr/inputs/markdown/toolbar-messages.js +40 -0
- package/dist/ssr/inputs/markdown/toolbar-messages.js.map +1 -0
- package/dist/ssr/inputs/qr-messages.js +26 -0
- package/dist/ssr/inputs/qr-messages.js.map +1 -0
- package/dist/ssr/inputs/select-messages.js +63 -0
- package/dist/ssr/inputs/select-messages.js.map +1 -0
- package/dist/ssr/inputs/tag-messages.js +44 -0
- package/dist/ssr/inputs/tag-messages.js.map +1 -0
- package/dist/ssr/inputs/template-messages.js +22 -0
- package/dist/ssr/inputs/template-messages.js.map +1 -0
- package/dist/ssr/internal/render-error-messages.js +20 -0
- package/dist/ssr/internal/render-error-messages.js.map +1 -0
- package/dist/ssr/internal/render-error.js +3 -1
- package/dist/ssr/internal/render-error.js.map +1 -1
- package/dist/ssr/internal/text-selection.js +101 -0
- package/dist/ssr/internal/text-selection.js.map +1 -0
- package/dist/ssr/intl/messages.js +6 -1155
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +203 -96
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/BottomSheet.js +1 -0
- package/dist/ssr/layout/BottomSheet.js.map +1 -1
- package/dist/ssr/layout/Discussion.js +8 -5
- package/dist/ssr/layout/Discussion.js.map +1 -1
- package/dist/ssr/layout/FloatingWindow.js +8 -5
- package/dist/ssr/layout/FloatingWindow.js.map +1 -1
- package/dist/ssr/layout/Navigation.js +6 -5
- package/dist/ssr/layout/Navigation.js.map +1 -1
- package/dist/ssr/layout/PageTitle.js +253 -0
- package/dist/ssr/layout/PageTitle.js.map +1 -0
- package/dist/ssr/layout/PanelDialog.js +8 -6
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/Panes.js +22 -14
- package/dist/ssr/layout/Panes.js.map +1 -1
- package/dist/ssr/layout/PullToRefresh.js +13 -4
- package/dist/ssr/layout/PullToRefresh.js.map +1 -1
- package/dist/ssr/layout/Settings.js +14 -12
- package/dist/ssr/layout/Settings.js.map +1 -1
- package/dist/ssr/layout/SettingsCollection.js +6 -5
- package/dist/ssr/layout/SettingsCollection.js.map +1 -1
- package/dist/ssr/layout/SettingsModal.js +3 -1
- package/dist/ssr/layout/SettingsModal.js.map +1 -1
- package/dist/ssr/layout/app-workspace-controller.js +743 -12
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/app-workspace-state.js +3 -2
- package/dist/ssr/layout/app-workspace-state.js.map +1 -1
- package/dist/ssr/layout/floating-window-messages.js +28 -0
- package/dist/ssr/layout/floating-window-messages.js.map +1 -0
- package/dist/ssr/layout/index.js +2 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/navigation-model.js.map +1 -1
- package/dist/ssr/layout/page-title-controller.js +169 -0
- package/dist/ssr/layout/page-title-controller.js.map +1 -0
- package/dist/ssr/layout/panel-dialog-messages.js +20 -0
- package/dist/ssr/layout/panel-dialog-messages.js.map +1 -0
- package/dist/ssr/layout/panes-messages.js +48 -0
- package/dist/ssr/layout/panes-messages.js.map +1 -0
- package/dist/ssr/layout/refresh-messages.js +20 -0
- package/dist/ssr/layout/refresh-messages.js.map +1 -0
- package/dist/ssr/layout/settings-messages.js +54 -0
- package/dist/ssr/layout/settings-messages.js.map +1 -0
- package/dist/ssr/layout/workspace-messages.js +56 -0
- package/dist/ssr/layout/workspace-messages.js.map +1 -0
- package/dist/ssr/surfaces/Avatar.js +5 -5
- package/dist/ssr/surfaces/Avatar.js.map +1 -1
- package/dist/ssr/surfaces/ResourceCard.js +4 -2
- package/dist/ssr/surfaces/ResourceCard.js.map +1 -1
- package/dist/ssr/surfaces/Tag.js +3 -3
- package/dist/ssr/surfaces/Tag.js.map +1 -1
- package/dist/ssr/surfaces/avatar-messages.js +26 -0
- package/dist/ssr/surfaces/avatar-messages.js.map +1 -0
- package/dist/ssr/surfaces/resource-messages.js +26 -0
- package/dist/ssr/surfaces/resource-messages.js.map +1 -0
- package/dist/ssr/widgets/Widget.js +6 -0
- package/dist/ssr/widgets/Widget.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/filter-messages.d.ts +8 -0
- package/dist/types/actions/spotlight-messages.d.ts +8 -0
- package/dist/types/chat/chat-messages.d.ts +116 -0
- package/dist/types/content/DataTable.d.ts +2 -0
- package/dist/types/content/FileView.d.ts +0 -10
- package/dist/types/content/calendar-messages.d.ts +20 -1
- package/dist/types/content/chart-messages.d.ts +32 -0
- package/dist/types/content/data-table-messages.d.ts +10 -0
- package/dist/types/content/docs-messages.d.ts +10 -0
- package/dist/types/content/feed-messages.d.ts +15 -0
- package/dist/types/content/file-browser-messages.d.ts +33 -0
- package/dist/types/content/file-view-messages.d.ts +30 -0
- package/dist/types/content/lightbox-messages.d.ts +16 -0
- package/dist/types/content/log-entries-messages.d.ts +8 -0
- package/dist/types/content/markdown-info-block-messages.d.ts +12 -0
- package/dist/types/content/markdown-reference-messages.d.ts +15 -0
- package/dist/types/content/pagination-messages.d.ts +17 -0
- package/dist/types/content/pdf-messages.d.ts +20 -0
- package/dist/types/content/range-picker-messages.d.ts +8 -0
- package/dist/types/content/structured-data-messages.d.ts +9 -0
- package/dist/types/content/timeline-messages.d.ts +29 -0
- package/dist/types/content/video-messages.d.ts +10 -0
- package/dist/types/content/viewport-messages.d.ts +12 -0
- package/dist/types/feedback/install-messages.d.ts +50 -0
- package/dist/types/feedback/prompt-messages.d.ts +31 -0
- package/dist/types/feedback/toast-messages.d.ts +9 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/inputs/completion-messages.d.ts +10 -0
- package/dist/types/inputs/file-drop-messages.d.ts +30 -0
- package/dist/types/inputs/file-drop.d.ts +3 -3
- package/dist/types/inputs/file-input-messages.d.ts +28 -0
- package/dist/types/inputs/icon-messages.d.ts +9 -0
- package/dist/types/inputs/input-messages.d.ts +17 -0
- package/dist/types/inputs/markdown/editor-messages.d.ts +20 -0
- package/dist/types/inputs/markdown/toolbar-messages.d.ts +18 -0
- package/dist/types/inputs/qr-messages.d.ts +11 -0
- package/dist/types/inputs/select-messages.d.ts +30 -0
- package/dist/types/inputs/tag-messages.d.ts +20 -0
- package/dist/types/inputs/template-messages.d.ts +9 -0
- package/dist/types/internal/render-error-messages.d.ts +8 -0
- package/dist/types/internal/text-selection.d.ts +18 -0
- package/dist/types/intl/messages.d.ts +3 -544
- package/dist/types/layout/AppWorkspace.d.ts +19 -4
- package/dist/types/layout/PageTitle.d.ts +64 -0
- package/dist/types/layout/app-workspace-controller.d.ts +4 -0
- package/dist/types/layout/app-workspace-state.d.ts +3 -2
- package/dist/types/layout/floating-window-messages.d.ts +12 -0
- package/dist/types/layout/index.d.ts +3 -0
- package/dist/types/layout/navigation-model.d.ts +7 -0
- package/dist/types/layout/page-title-controller.d.ts +13 -0
- package/dist/types/layout/panel-dialog-messages.d.ts +8 -0
- package/dist/types/layout/panes-messages.d.ts +22 -0
- package/dist/types/layout/refresh-messages.d.ts +8 -0
- package/dist/types/layout/settings-messages.d.ts +25 -0
- package/dist/types/layout/workspace-messages.d.ts +26 -0
- package/dist/types/surfaces/avatar-messages.d.ts +11 -0
- package/dist/types/surfaces/resource-messages.d.ts +11 -0
- package/dist/types/widgets/Widget.d.ts +5 -1
- package/package.json +1 -1
|
@@ -27,8 +27,10 @@ var _tmpl$ = /*#__PURE__*/_$template(`<div data-k2b-panes role=group>`),
|
|
|
27
27
|
import { dnd } from "@k2b/stdlib/solid";
|
|
28
28
|
import { createEffect, createMemo, createSignal, createUniqueId, For, onCleanup, onMount, Show } from "solid-js";
|
|
29
29
|
import { Tooltip } from "../feedback/Tooltip";
|
|
30
|
+
import { suppressTextSelection } from "../internal/text-selection";
|
|
30
31
|
import { useUiMessages } from "../intl/messages";
|
|
31
32
|
import { activatePanesItem, applyPanesIntent, getPanesDropTargets, PANES_MAX_ID_LENGTH, PANES_MIN_RATIO, parsePanesLayout, resizePanesSplit, samePanesIntent } from "./panes-layout";
|
|
33
|
+
import { usePanesMessages } from "./panes-messages";
|
|
32
34
|
import { assertUniqueStableUiIds } from "./stable-id";
|
|
33
35
|
const PANES_RESIZE_SNAP_DISTANCE = 8;
|
|
34
36
|
const PANES_RESIZE_UNSNAP_DISTANCE = 12;
|
|
@@ -126,7 +128,7 @@ const requireItem = (items, id) => {
|
|
|
126
128
|
return item;
|
|
127
129
|
};
|
|
128
130
|
export default function Panes(props) {
|
|
129
|
-
const
|
|
131
|
+
const panesMessages = usePanesMessages();
|
|
130
132
|
const instanceId = `k2b-panes-${createUniqueId()}`;
|
|
131
133
|
const items = createMemo(() => createItemMap(props.items));
|
|
132
134
|
const layout = createMemo(() => {
|
|
@@ -208,8 +210,8 @@ export default function Panes(props) {
|
|
|
208
210
|
_el$4 = _el$3.firstChild,
|
|
209
211
|
_el$5 = _el$4.nextSibling;
|
|
210
212
|
_el$3.$$click = () => requestAdd(null);
|
|
211
|
-
_$insert(_el$5, () =>
|
|
212
|
-
_$effect(() => _$setAttribute(_el$3, "aria-label",
|
|
213
|
+
_$insert(_el$5, () => panesMessages().addPane);
|
|
214
|
+
_$effect(() => _$setAttribute(_el$3, "aria-label", panesMessages().addPane));
|
|
213
215
|
_$runHydrationEvents();
|
|
214
216
|
return _el$3;
|
|
215
217
|
}
|
|
@@ -237,7 +239,7 @@ export default function Panes(props) {
|
|
|
237
239
|
}));
|
|
238
240
|
_$effect(_p$ => {
|
|
239
241
|
var _v$ = `k2b-panes ${props.class ?? ""}`,
|
|
240
|
-
_v$2 = props.ariaLabel ??
|
|
242
|
+
_v$2 = props.ariaLabel ?? panesMessages().paneWorkspace;
|
|
241
243
|
_v$ !== _p$.e && _$className(_el$, _p$.e = _v$);
|
|
242
244
|
_v$2 !== _p$.t && _$setAttribute(_el$, "aria-label", _p$.t = _v$2);
|
|
243
245
|
return _p$;
|
|
@@ -274,7 +276,7 @@ function PanesNodeRenderer(props) {
|
|
|
274
276
|
})];
|
|
275
277
|
}
|
|
276
278
|
function PanesSplitRenderer(props) {
|
|
277
|
-
const
|
|
279
|
+
const panesMessages = usePanesMessages();
|
|
278
280
|
let container;
|
|
279
281
|
let separatorElement;
|
|
280
282
|
let stopResize;
|
|
@@ -324,7 +326,7 @@ function PanesSplitRenderer(props) {
|
|
|
324
326
|
};
|
|
325
327
|
};
|
|
326
328
|
const startResize = event => {
|
|
327
|
-
if (!props.canResize()) return;
|
|
329
|
+
if (!props.canResize() || event.button !== 0) return;
|
|
328
330
|
event.preventDefault();
|
|
329
331
|
stopActiveResize();
|
|
330
332
|
const pointerId = event.pointerId;
|
|
@@ -364,7 +366,9 @@ function PanesSplitRenderer(props) {
|
|
|
364
366
|
const onEnd = end => {
|
|
365
367
|
if (end.pointerId === pointerId) finishActiveResize();
|
|
366
368
|
};
|
|
369
|
+
const releaseTextSelection = suppressTextSelection(pointerId);
|
|
367
370
|
stopResize = () => {
|
|
371
|
+
releaseTextSelection();
|
|
368
372
|
if (frame !== undefined) cancelAnimationFrame(frame);
|
|
369
373
|
frame = undefined;
|
|
370
374
|
pendingRatio = undefined;
|
|
@@ -438,7 +442,7 @@ function PanesSplitRenderer(props) {
|
|
|
438
442
|
_v$9 = !props.canResize(),
|
|
439
443
|
_v$0 = props.canResize() ? 0 : -1,
|
|
440
444
|
_v$1 = props.node().direction,
|
|
441
|
-
_v$10 =
|
|
445
|
+
_v$10 = panesMessages().resizePanes,
|
|
442
446
|
_v$11 = `${1 - props.node().ratio} 1 0`;
|
|
443
447
|
_v$3 !== _p$.e && _$setAttribute(_el$6, "data-direction", _p$.e = _v$3);
|
|
444
448
|
_v$4 !== _p$.t && _$setStyleProperty(_el$7, "flex", _p$.t = _v$4);
|
|
@@ -474,6 +478,7 @@ function ActivePane(props) {
|
|
|
474
478
|
}
|
|
475
479
|
function PanesGroupRenderer(props) {
|
|
476
480
|
const messages = useUiMessages();
|
|
481
|
+
const panesMessages = usePanesMessages();
|
|
477
482
|
let tabsElement;
|
|
478
483
|
let scrollbarDragOffset = 0;
|
|
479
484
|
let stopTabPress;
|
|
@@ -572,11 +577,14 @@ function PanesGroupRenderer(props) {
|
|
|
572
577
|
syncScrollbar();
|
|
573
578
|
};
|
|
574
579
|
const startScrollbarDrag = event => {
|
|
580
|
+
if (event.button !== 0) return;
|
|
575
581
|
event.preventDefault();
|
|
576
582
|
const track = event.currentTarget;
|
|
577
583
|
const current = scrollbar();
|
|
578
584
|
scrollbarDragOffset = event.target === track ? current.width / 2 : Math.min(current.width, Math.max(0, event.clientX - track.getBoundingClientRect().left - current.left));
|
|
579
585
|
track.setPointerCapture(event.pointerId);
|
|
586
|
+
// The track's own pointerup or pointercancel ends the hold.
|
|
587
|
+
suppressTextSelection(event.pointerId);
|
|
580
588
|
scrollFromPointer(event);
|
|
581
589
|
};
|
|
582
590
|
onMount(() => {
|
|
@@ -620,19 +628,19 @@ function PanesGroupRenderer(props) {
|
|
|
620
628
|
};
|
|
621
629
|
const targetLabel = target => {
|
|
622
630
|
const targetItem = requireItem(props.itemById(), target.targetItemId);
|
|
623
|
-
if (target.kind === "group") return
|
|
631
|
+
if (target.kind === "group") return panesMessages().addToNamed({
|
|
624
632
|
name: targetItem.title
|
|
625
633
|
});
|
|
626
634
|
if (target.kind === "tab") {
|
|
627
635
|
const before = target.beforeItemId ? requireItem(props.itemById(), target.beforeItemId) : null;
|
|
628
|
-
return before ?
|
|
636
|
+
return before ? panesMessages().insertBeforeNamed({
|
|
629
637
|
name: before.title
|
|
630
|
-
}) :
|
|
638
|
+
}) : panesMessages().insertAtEnd;
|
|
631
639
|
}
|
|
632
|
-
return target.side ?
|
|
640
|
+
return target.side ? panesMessages().addPaneSide({
|
|
633
641
|
side: target.side,
|
|
634
642
|
name: targetItem.title
|
|
635
|
-
}) :
|
|
643
|
+
}) : panesMessages().addToNamed({
|
|
636
644
|
name: targetItem.title
|
|
637
645
|
});
|
|
638
646
|
};
|
|
@@ -819,10 +827,10 @@ function PanesGroupRenderer(props) {
|
|
|
819
827
|
type: "button",
|
|
820
828
|
"class": "k2b-panes__add k2b-panes__add--tab",
|
|
821
829
|
get ["aria-label"]() {
|
|
822
|
-
return
|
|
830
|
+
return panesMessages().addPane;
|
|
823
831
|
},
|
|
824
832
|
get content() {
|
|
825
|
-
return
|
|
833
|
+
return panesMessages().addPane;
|
|
826
834
|
},
|
|
827
835
|
onClick: () => props.addItem(props.node().active),
|
|
828
836
|
get children() {
|
|
@@ -895,7 +903,7 @@ function PanesGroupRenderer(props) {
|
|
|
895
903
|
}
|
|
896
904
|
}), _el$25, _co$5);
|
|
897
905
|
_$effect(_p$ => {
|
|
898
|
-
var _v$14 =
|
|
906
|
+
var _v$14 = panesMessages().paneTabs,
|
|
899
907
|
_v$15 = panelId(props.node().active),
|
|
900
908
|
_v$16 = tabId(props.node().active);
|
|
901
909
|
_v$14 !== _p$.e && _$setAttribute(_el$1, "aria-label", _p$.e = _v$14);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["layout/Panes.tsx"],"sourcesContent":["import { type DndCollisionContext, type DndController, type DndDroppableSnapshot, dnd } from \"@k2b/stdlib/solid\";\nimport { createEffect, createMemo, createSignal, createUniqueId, For, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { useUiMessages } from \"../intl/messages\";\nimport {\n activatePanesItem,\n applyPanesIntent,\n getPanesDropTargets,\n PANES_MAX_ID_LENGTH,\n PANES_MIN_RATIO,\n type PanesDropTarget,\n type PanesGroup,\n type PanesIntent,\n type PanesLayout,\n type PanesNode,\n type PanesPath,\n type PanesSplit,\n parsePanesLayout,\n resizePanesSplit,\n samePanesIntent,\n} from \"./panes-layout\";\nimport { assertUniqueStableUiIds } from \"./stable-id\";\n\nexport type PanesItem = {\n id: string;\n title: string;\n icon?: string;\n render: () => JSX.Element;\n onClose?: () => void;\n};\n\nexport type PanesProps = {\n layout: PanesLayout;\n onLayoutChange: (layout: PanesLayout) => void;\n items: readonly PanesItem[];\n movable?: boolean;\n resizable?: boolean;\n split?: false | \"horizontal\" | \"vertical\" | \"both\";\n onAddItem?: (targetItemId: string | null) => void;\n ariaLabel?: string;\n class?: string;\n};\n\ntype DragMeta = { itemId: string; label: string };\ntype DropMeta = { target: PanesDropTarget; label: string };\ntype PaneDnd = DndController<DragMeta, DropMeta, PanesIntent>;\n\ntype IndexedPanesDropTargets = {\n tabs: ReadonlyMap<string | null, PanesDropTarget>;\n body: readonly PanesDropTarget[];\n};\n\ntype PanesSeparatorGeometry = {\n coordinate: number;\n crossStart: number;\n crossEnd: number;\n};\n\nconst PANES_RESIZE_SNAP_DISTANCE = 8;\nconst PANES_RESIZE_UNSNAP_DISTANCE = 12;\nconst PANES_RESIZE_NEIGHBOR_GAP = 16;\n\nconst intervalGap = (left: PanesSeparatorGeometry, right: PanesSeparatorGeometry): number =>\n left.crossEnd < right.crossStart\n ? right.crossStart - left.crossEnd\n : right.crossEnd < left.crossStart\n ? left.crossStart - right.crossEnd\n : 0;\n\nexport const resolvePanesResizeSnap = (\n coordinate: number,\n source: PanesSeparatorGeometry,\n candidates: readonly PanesSeparatorGeometry[],\n options: { activeCoordinate?: number | null; previousCoordinate?: number } = {},\n): { coordinate: number; snappedTo: number | null } => {\n const neighbors = candidates.filter((candidate) => {\n const gap = intervalGap(source, candidate);\n return gap > 0 && gap <= PANES_RESIZE_NEIGHBOR_GAP;\n });\n const activeCoordinate = options.activeCoordinate;\n const active =\n activeCoordinate === null || activeCoordinate === undefined\n ? null\n : neighbors.find((candidate) => Math.abs(candidate.coordinate - activeCoordinate) < 0.5);\n if (active && Math.abs(coordinate - active.coordinate) <= PANES_RESIZE_UNSNAP_DISTANCE) {\n return { coordinate: active.coordinate, snappedTo: active.coordinate };\n }\n\n const previous = options.previousCoordinate;\n let winner: PanesSeparatorGeometry | null = null;\n let winnerDistance = Number.POSITIVE_INFINITY;\n for (const candidate of neighbors) {\n if (previous !== undefined && Math.abs(candidate.coordinate - previous) < 0.5) continue;\n const distanceToRange =\n previous === undefined ||\n candidate.coordinate < Math.min(previous, coordinate) ||\n candidate.coordinate > Math.max(previous, coordinate)\n ? Math.abs(candidate.coordinate - coordinate)\n : 0;\n const distanceToCoordinate = Math.abs(candidate.coordinate - coordinate);\n if (distanceToRange <= PANES_RESIZE_SNAP_DISTANCE && distanceToCoordinate < winnerDistance) {\n winner = candidate;\n winnerDistance = distanceToCoordinate;\n }\n }\n return winner ? { coordinate: winner.coordinate, snappedTo: winner.coordinate } : { coordinate, snappedTo: null };\n};\n\nexport const indexPanesDropTargets = (targets: readonly PanesDropTarget[]): ReadonlyMap<string, IndexedPanesDropTargets> => {\n const mutable = new Map<string, { tabs: Map<string | null, PanesDropTarget>; body: PanesDropTarget[] }>();\n for (const target of targets) {\n let indexed = mutable.get(target.targetItemId);\n if (!indexed) {\n indexed = { tabs: new Map(), body: [] };\n mutable.set(target.targetItemId, indexed);\n }\n if (target.kind === \"tab\") indexed.tabs.set(target.beforeItemId ?? null, target);\n else indexed.body.push(target);\n }\n return mutable;\n};\n\nconst iconClass = (icon: string | undefined): string => {\n const value = icon?.trim() || \"ti-layout-sidebar-right\";\n return value.startsWith(\"ti \") ? value : `ti ${value}`;\n};\n\nconst collectLayoutItemIds = (node: PanesNode | null, ids: string[] = []): string[] => {\n if (!node) return ids;\n if (node.type === \"group\") ids.push(...node.items);\n else {\n collectLayoutItemIds(node.first, ids);\n collectLayoutItemIds(node.second, ids);\n }\n return ids;\n};\n\nconst nearestDroppable = (entries: DndDroppableSnapshot<DropMeta>[]): DndDroppableSnapshot<DropMeta> | null =>\n entries.reduce<DndDroppableSnapshot<DropMeta> | null>(\n (winner, entry) => (!winner || entry.distance < winner.distance ? entry : winner),\n null,\n );\n\nexport const pointerHitsPanesDropTarget = (\n entry: Pick<DndDroppableSnapshot<DropMeta>, \"containsPointer\" | \"meta\" | \"rect\"> &\n Partial<Pick<DndDroppableSnapshot<DropMeta>, \"element\">>,\n pointer: { x: number; y: number },\n hitElement?: Element | null,\n): boolean => {\n if (hitElement !== undefined && !entry.element?.contains(hitElement)) return false;\n const side = entry.meta.target.side;\n if (entry.meta.target.kind !== \"split\" || !side) return entry.containsPointer;\n if (!entry.containsPointer) return false;\n const x = pointer.x - entry.rect.left;\n const y = pointer.y - entry.rect.top;\n if (side === \"top\") return x >= y && x <= entry.rect.width - y;\n if (side === \"bottom\") {\n const corner = entry.rect.height - y;\n return x >= corner && x <= entry.rect.width - corner;\n }\n if (side === \"left\") return y >= x && y <= entry.rect.height - x;\n const corner = entry.rect.width - x;\n return y >= corner && y <= entry.rect.height - corner;\n};\n\nconst panesCollisionDetector = (\n context: DndCollisionContext<DragMeta, DropMeta, PanesIntent>,\n mode: \"pointer\" | \"keyboard\" | null,\n): string | null => {\n const document = mode === \"pointer\" ? context.droppables[0]?.element.ownerDocument : undefined;\n const hitElement = document?.elementFromPoint(context.pointer.x, context.pointer.y) ?? undefined;\n return nearestDroppable(context.droppables.filter((entry) => pointerHitsPanesDropTarget(entry, context.pointer, hitElement)))?.id ?? null;\n};\n\nconst createItemMap = (items: readonly PanesItem[]): Map<string, PanesItem> => {\n assertUniqueStableUiIds(\n items.map((item) => item.id),\n \"Panes item id\",\n PANES_MAX_ID_LENGTH,\n );\n return new Map(items.map((item) => [item.id, item]));\n};\n\nconst requireItem = (items: Map<string, PanesItem>, id: string): PanesItem => {\n const item = items.get(id);\n if (!item) throw new Error(`Panes layout references missing item \"${id}\".`);\n return item;\n};\n\nexport default function Panes(props: PanesProps): JSX.Element {\n const messages = useUiMessages();\n const instanceId = `k2b-panes-${createUniqueId()}`;\n const items = createMemo(() => createItemMap(props.items));\n const layout = createMemo(() => {\n if (!parsePanesLayout(props.layout)) throw new Error(\"Panes layout must be a valid version 2 layout.\");\n for (const id of collectLayoutItemIds(props.layout.root)) requireItem(items(), id);\n return props.layout;\n });\n const canMove = () => props.movable ?? true;\n const canResize = () => props.resizable ?? true;\n const split = () => props.split ?? \"both\";\n const [draggedItemId, setDraggedItemId] = createSignal<string | null>(null);\n const [dragMode, setDragMode] = createSignal<\"pointer\" | \"keyboard\" | null>(null);\n const dropTargets = createMemo(() => {\n const itemId = draggedItemId();\n return itemId ? getPanesDropTargets(layout(), itemId, { movable: canMove(), split: split() }) : [];\n });\n const dropTargetIndex = createMemo(() => indexPanesDropTargets(dropTargets()));\n const paneDnd = dnd.create<DragMeta, DropMeta, PanesIntent>({\n collisionDetector: (context) => panesCollisionDetector(context, dragMode()),\n buildIntent: ({ over }) => over?.meta.target.intent ?? null,\n isSameIntent: samePanesIntent,\n onDragStart: ({ active, mode }) => {\n setDragMode(mode);\n setDraggedItemId(active.meta.itemId);\n },\n announcements: {\n dragStart: (active) => `Picked up ${active.meta.label}.`,\n dragOver: (active, over) => (over ? `Move ${active.meta.label} to ${over.meta.label}.` : `${active.meta.label} is not over a pane.`),\n drop: (active, over) => (over ? `Moved ${active.meta.label} to ${over.meta.label}.` : `Did not move ${active.meta.label}.`),\n cancel: (active) => `Cancelled moving ${active.meta.label}.`,\n },\n onDrop: ({ intent, mode }) => {\n setDragMode(null);\n setDraggedItemId(null);\n if (!intent) return;\n const current = layout();\n const next = applyPanesIntent(current, intent);\n if (next === current) return;\n props.onLayoutChange(next);\n if (mode === \"keyboard\") queueMicrotask(() => document.getElementById(`${instanceId}-${intent.itemId}-tab`)?.focus());\n },\n onCancel: () => {\n setDragMode(null);\n setDraggedItemId(null);\n },\n });\n const activate = (itemId: string) => {\n const current = layout();\n const next = activatePanesItem(current, itemId);\n if (next !== current) props.onLayoutChange(next);\n };\n const requestAdd = (targetItemId: string | null) => props.onAddItem?.(targetItemId);\n\n return (\n <div class={`k2b-panes ${props.class ?? \"\"}`} data-k2b-panes role=\"group\" aria-label={props.ariaLabel ?? messages().paneWorkspace}>\n <Show\n when={layout().root}\n fallback={\n <div class=\"k2b-panes__empty\">\n <Show when={props.onAddItem !== undefined}>\n <button type=\"button\" class=\"k2b-panes__add\" onClick={() => requestAdd(null)} aria-label={messages().addPane}>\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n <span>{messages().addPane}</span>\n </button>\n </Show>\n </div>\n }\n >\n {(root) => (\n <PanesNodeRenderer\n node={root}\n path={[]}\n layout={layout}\n itemById={items}\n dnd={paneDnd}\n dropTargetIndex={dropTargetIndex}\n instanceId={instanceId}\n canMove={canMove}\n canResize={canResize}\n addItem={requestAdd}\n canAdd={() => props.onAddItem !== undefined}\n onActivate={activate}\n onLayoutChange={props.onLayoutChange}\n />\n )}\n </Show>\n </div>\n );\n}\n\ntype RendererProps = {\n node: () => PanesNode;\n path: PanesPath;\n layout: () => PanesLayout;\n itemById: () => Map<string, PanesItem>;\n dnd: PaneDnd;\n dropTargetIndex: () => ReadonlyMap<string, IndexedPanesDropTargets>;\n instanceId: string;\n canMove: () => boolean;\n canResize: () => boolean;\n addItem: (targetItemId: string | null) => void;\n canAdd: () => boolean;\n onActivate: (itemId: string) => void;\n onLayoutChange: (layout: PanesLayout) => void;\n};\n\nfunction PanesNodeRenderer(props: RendererProps): JSX.Element {\n const split = createMemo(() => {\n const node = props.node();\n return node.type === \"split\" ? node : null;\n });\n const group = createMemo(() => {\n const node = props.node();\n return node.type === \"group\" ? node : null;\n });\n return (\n <>\n <Show when={split()}>{(node) => <PanesSplitRenderer {...props} node={node} />}</Show>\n <Show when={group()}>{(node) => <PanesGroupRenderer {...props} node={node} />}</Show>\n </>\n );\n}\n\nfunction PanesSplitRenderer(props: Omit<RendererProps, \"node\"> & { node: () => PanesSplit }): JSX.Element {\n const messages = useUiMessages();\n let container: HTMLDivElement | undefined;\n let separatorElement: HTMLButtonElement | undefined;\n let stopResize: (() => void) | undefined;\n let finishResize: (() => void) | undefined;\n const stopActiveResize = () => {\n stopResize?.();\n stopResize = undefined;\n finishResize = undefined;\n };\n const finishActiveResize = () => {\n finishResize?.();\n stopResize = undefined;\n finishResize = undefined;\n };\n onCleanup(stopActiveResize);\n const commitRatio = (ratio: number) => {\n const current = props.layout();\n const next = resizePanesSplit(current, props.path, ratio);\n if (next !== current) props.onLayoutChange(next);\n };\n const resizeGeometry = (separator: HTMLElement | undefined) => {\n if (!separator) return null;\n const direction = props.node().direction;\n const containerRect = container?.getBoundingClientRect();\n const separatorRect = separator.getBoundingClientRect();\n const extent = direction === \"horizontal\" ? (containerRect?.width ?? 0) : (containerRect?.height ?? 0);\n const separatorExtent = direction === \"horizontal\" ? separatorRect.width : separatorRect.height;\n const availableExtent = extent - separatorExtent;\n if (!containerRect || availableExtent <= 0 || separatorRect.width <= 0 || separatorRect.height <= 0) return null;\n const geometry = (rect: DOMRect): PanesSeparatorGeometry =>\n direction === \"horizontal\"\n ? { coordinate: rect.left + rect.width / 2, crossStart: rect.top, crossEnd: rect.bottom }\n : { coordinate: rect.top + rect.height / 2, crossStart: rect.left, crossEnd: rect.right };\n const panes = separator.closest<HTMLElement>(\"[data-k2b-panes]\");\n const candidates = panes\n ? Array.from(panes.querySelectorAll<HTMLElement>(`.k2b-panes__separator[data-direction=\"${direction}\"]`))\n .filter((candidate) => candidate !== separator && candidate.closest(\"[data-k2b-panes]\") === panes)\n .map((candidate) => candidate.getBoundingClientRect())\n .filter((rect) => rect.width > 0 && rect.height > 0)\n .map(geometry)\n : [];\n const origin = direction === \"horizontal\" ? containerRect.left + separatorExtent / 2 : containerRect.top + separatorExtent / 2;\n return {\n source: geometry(separatorRect),\n candidates,\n coordinateForRatio: (ratio: number) => origin + availableExtent * ratio,\n ratioForCoordinate: (coordinate: number) => (coordinate - origin) / availableExtent,\n };\n };\n const startResize = (event: PointerEvent) => {\n if (!props.canResize()) return;\n event.preventDefault();\n stopActiveResize();\n const pointerId = event.pointerId;\n const captureTarget = (event.currentTarget as HTMLElement | null) ?? separatorElement;\n if (!captureTarget) return;\n const start = props.node().direction === \"horizontal\" ? event.clientX : event.clientY;\n const geometry = resizeGeometry(captureTarget);\n const startRatio = props.node().ratio;\n const startCoordinate = geometry?.source.coordinate;\n const rect = container?.getBoundingClientRect();\n const extent = Math.max(1, props.node().direction === \"horizontal\" ? (rect?.width ?? 1) : (rect?.height ?? 1));\n let snappedTo: number | null = null;\n let frame: number | undefined;\n let pendingRatio: number | undefined;\n const flush = () => {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n if (pendingRatio === undefined) return;\n const ratio = pendingRatio;\n pendingRatio = undefined;\n commitRatio(ratio);\n };\n const onMove = (move: PointerEvent) => {\n if (move.pointerId !== pointerId) return;\n const current = props.node().direction === \"horizontal\" ? move.clientX : move.clientY;\n if (geometry && startCoordinate !== undefined) {\n const snapped = resolvePanesResizeSnap(startCoordinate + current - start, geometry.source, geometry.candidates, {\n activeCoordinate: snappedTo,\n });\n snappedTo = snapped.snappedTo;\n pendingRatio = geometry.ratioForCoordinate(snapped.coordinate);\n } else {\n pendingRatio = startRatio + (current - start) / extent;\n }\n if (frame === undefined) frame = requestAnimationFrame(flush);\n };\n const onEnd = (end: PointerEvent) => {\n if (end.pointerId === pointerId) finishActiveResize();\n };\n stopResize = () => {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n pendingRatio = undefined;\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onEnd);\n window.removeEventListener(\"pointercancel\", onEnd);\n window.removeEventListener(\"blur\", finishActiveResize);\n if (captureTarget.hasPointerCapture?.(pointerId)) captureTarget.releasePointerCapture(pointerId);\n };\n finishResize = () => {\n flush();\n stopResize?.();\n };\n captureTarget.setPointerCapture?.(pointerId);\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onEnd);\n window.addEventListener(\"pointercancel\", onEnd);\n window.addEventListener(\"blur\", finishActiveResize);\n };\n const onResizeKeyDown = (event: KeyboardEvent) => {\n if (!props.canResize()) return;\n const step = event.shiftKey ? 0.08 : 0.02;\n let ratio: number | null = null;\n if (event.key === \"Home\") ratio = PANES_MIN_RATIO;\n if (event.key === \"End\") ratio = 1 - PANES_MIN_RATIO;\n if (props.node().direction === \"horizontal\" && event.key === \"ArrowLeft\") ratio = props.node().ratio - step;\n if (props.node().direction === \"horizontal\" && event.key === \"ArrowRight\") ratio = props.node().ratio + step;\n if (props.node().direction === \"vertical\" && event.key === \"ArrowUp\") ratio = props.node().ratio - step;\n if (props.node().direction === \"vertical\" && event.key === \"ArrowDown\") ratio = props.node().ratio + step;\n if (ratio === null) return;\n event.preventDefault();\n const geometry = resizeGeometry((event.currentTarget as HTMLElement | null) ?? separatorElement);\n if (geometry) {\n const snapped = resolvePanesResizeSnap(geometry.coordinateForRatio(ratio), geometry.source, geometry.candidates, {\n previousCoordinate: geometry.source.coordinate,\n });\n ratio = geometry.ratioForCoordinate(snapped.coordinate);\n }\n commitRatio(ratio);\n };\n return (\n <div ref={container} class=\"k2b-panes__split\" data-direction={props.node().direction}>\n <div class=\"k2b-panes__split-child\" style={{ flex: `${props.node().ratio} 1 0` }}>\n <PanesNodeRenderer {...props} node={() => props.node().first} path={[...props.path, \"first\"]} />\n </div>\n <button\n ref={separatorElement}\n type=\"button\"\n role=\"separator\"\n aria-orientation={props.node().direction === \"horizontal\" ? \"vertical\" : \"horizontal\"}\n aria-valuemin={Math.round(PANES_MIN_RATIO * 100)}\n aria-valuemax={Math.round((1 - PANES_MIN_RATIO) * 100)}\n aria-valuenow={Math.round(props.node().ratio * 100)}\n aria-disabled={!props.canResize()}\n tabIndex={props.canResize() ? 0 : -1}\n class=\"k2b-panes__separator\"\n data-direction={props.node().direction}\n aria-label={messages().resizePanes}\n onPointerDown={startResize}\n onKeyDown={onResizeKeyDown}\n >\n <span aria-hidden=\"true\" />\n </button>\n <div class=\"k2b-panes__split-child\" style={{ flex: `${1 - props.node().ratio} 1 0` }}>\n <PanesNodeRenderer {...props} node={() => props.node().second} path={[...props.path, \"second\"]} />\n </div>\n </div>\n );\n}\n\nfunction ActivePane(props: { itemId: string; itemById: () => Map<string, PanesItem> }): JSX.Element {\n return requireItem(props.itemById(), props.itemId).render();\n}\n\nfunction PanesGroupRenderer(props: Omit<RendererProps, \"node\"> & { node: () => PanesGroup }): JSX.Element {\n const messages = useUiMessages();\n let tabsElement: HTMLDivElement | undefined;\n let scrollbarDragOffset = 0;\n let stopTabPress: (() => void) | undefined;\n let suppressedPointerClick: string | null = null;\n let clearSuppressedPointerClick: number | undefined;\n const dndInstanceId = createUniqueId();\n const draggableId = (id: string) => `panes-item:${dndInstanceId}:${id}`;\n const itemIds = createMemo(() => props.node().items);\n const groupTargets = createMemo<IndexedPanesDropTargets | null>(() => {\n const index = props.dropTargetIndex();\n for (const itemId of itemIds()) {\n const indexed = index.get(itemId);\n if (indexed) return indexed;\n }\n return null;\n });\n const targetBefore = (itemId: string) => groupTargets()?.tabs.get(itemId);\n const targetAtEnd = () => groupTargets()?.tabs.get(null);\n const bodyTargets = () => groupTargets()?.body ?? [];\n const startTabPress = (event: PointerEvent & { currentTarget: HTMLButtonElement }, itemId: string) => {\n if (event.button !== 0 || event.isPrimary === false) return;\n stopTabPress?.();\n const pointerId = event.pointerId;\n const button = event.currentTarget;\n const ownerWindow = window;\n const stop = () => {\n ownerWindow.removeEventListener(\"pointerup\", onPointerUp, true);\n ownerWindow.removeEventListener(\"pointercancel\", onPointerCancel, true);\n if (stopTabPress === stop) stopTabPress = undefined;\n };\n const onPointerUp = (up: PointerEvent) => {\n if (up.pointerId !== pointerId) return;\n const rect = button.getBoundingClientRect();\n const releasedInside = up.clientX >= rect.left && up.clientX <= rect.right && up.clientY >= rect.top && up.clientY <= rect.bottom;\n const shouldActivate = releasedInside && !props.dnd.isDragging();\n stop();\n if (!shouldActivate) return;\n suppressedPointerClick = itemId;\n if (clearSuppressedPointerClick !== undefined) ownerWindow.clearTimeout(clearSuppressedPointerClick);\n clearSuppressedPointerClick = ownerWindow.setTimeout(() => {\n if (suppressedPointerClick === itemId) suppressedPointerClick = null;\n clearSuppressedPointerClick = undefined;\n }, 0);\n props.onActivate(itemId);\n };\n const onPointerCancel = (cancel: PointerEvent) => {\n if (cancel.pointerId === pointerId) stop();\n };\n stopTabPress = stop;\n ownerWindow.addEventListener(\"pointerup\", onPointerUp, true);\n ownerWindow.addEventListener(\"pointercancel\", onPointerCancel, true);\n };\n onCleanup(() => {\n stopTabPress?.();\n if (clearSuppressedPointerClick !== undefined) window.clearTimeout(clearSuppressedPointerClick);\n });\n const [scrollbar, setScrollbar] = createSignal({ overflow: false, left: 0, width: 0 });\n const syncScrollbar = () => {\n if (!tabsElement) return;\n const { clientWidth, scrollLeft, scrollWidth } = tabsElement;\n if (scrollWidth <= clientWidth || clientWidth <= 0) {\n setScrollbar({ overflow: false, left: 0, width: 0 });\n return;\n }\n const width = Math.min(clientWidth, Math.max(24, (clientWidth * clientWidth) / scrollWidth));\n const left = (scrollLeft / (scrollWidth - clientWidth)) * (clientWidth - width);\n setScrollbar({ overflow: true, left, width });\n };\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n if (!tabsElement) return;\n const track = event.currentTarget;\n const { left, width } = scrollbar();\n const rect = track.getBoundingClientRect();\n const available = Math.max(1, rect.width - width);\n const thumbLeft = Math.min(available, Math.max(0, event.clientX - rect.left - scrollbarDragOffset));\n tabsElement.scrollLeft = (thumbLeft / available) * (tabsElement.scrollWidth - tabsElement.clientWidth);\n syncScrollbar();\n };\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n event.preventDefault();\n const track = event.currentTarget;\n const current = scrollbar();\n scrollbarDragOffset =\n event.target === track\n ? current.width / 2\n : Math.min(current.width, Math.max(0, event.clientX - track.getBoundingClientRect().left - current.left));\n track.setPointerCapture(event.pointerId);\n scrollFromPointer(event);\n };\n onMount(() => {\n syncScrollbar();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbar);\n if (tabsElement) observer?.observe(tabsElement);\n onCleanup(() => observer?.disconnect());\n });\n createEffect(() => {\n itemIds().length;\n props.itemById();\n groupTargets();\n props.canAdd();\n queueMicrotask(syncScrollbar);\n });\n const tabId = (itemId: string) => `${props.instanceId}-${itemId}-tab`;\n const panelId = (itemId: string) => `${props.instanceId}-${itemId}-panel`;\n const focusTab = (index: number) => {\n const itemId = itemIds()[index];\n if (!itemId) return;\n props.onActivate(itemId);\n queueMicrotask(() => document.getElementById(tabId(itemId))?.focus());\n };\n const onTabKeyDown = (event: KeyboardEvent, index: number, itemId: string) => {\n if (props.dnd.activeId() === draggableId(itemId)) return;\n const item = requireItem(props.itemById(), itemId);\n if ((event.key === \"Delete\" || event.key === \"Backspace\") && item.onClose) {\n event.preventDefault();\n item.onClose();\n return;\n }\n const count = itemIds().length;\n let next: number | null = null;\n if (event.key === \"ArrowLeft\") next = (index - 1 + count) % count;\n if (event.key === \"ArrowRight\") next = (index + 1) % count;\n if (event.key === \"Home\") next = 0;\n if (event.key === \"End\") next = count - 1;\n if (next === null) return;\n event.preventDefault();\n focusTab(next);\n };\n const targetLabel = (target: PanesDropTarget): string => {\n const targetItem = requireItem(props.itemById(), target.targetItemId);\n if (target.kind === \"group\") return messages().addToNamed({ name: targetItem.title });\n if (target.kind === \"tab\") {\n const before = target.beforeItemId ? requireItem(props.itemById(), target.beforeItemId) : null;\n return before ? messages().insertBeforeNamed({ name: before.title }) : messages().insertAtEnd;\n }\n return target.side\n ? messages().addPaneSide({ side: target.side, name: targetItem.title })\n : messages().addToNamed({ name: targetItem.title });\n };\n return (\n <section class=\"k2b-panes__group\">\n <div\n ref={tabsElement}\n class=\"k2b-panes__tabs\"\n role=\"tablist\"\n aria-label={messages().paneTabs}\n aria-orientation=\"horizontal\"\n onScroll={syncScrollbar}\n >\n <For each={itemIds()}>\n {(itemId, index) => {\n const item = () => requireItem(props.itemById(), itemId);\n const active = () => props.node().active === itemId;\n return (\n <div\n ref={(surface) =>\n props.dnd.draggable(surface, () => ({\n id: draggableId(itemId),\n meta: { itemId, label: item().title },\n disabled: !props.canMove(),\n focusable: false,\n keyboard: true,\n handleSelector: \".k2b-panes__tab-button\",\n }))\n }\n class=\"k2b-panes__tab\"\n data-active={active() ? \"true\" : undefined}\n data-closable={item().onClose !== undefined ? \"true\" : undefined}\n data-movable={props.canMove() ? \"true\" : undefined}\n data-dnd-active={props.dnd.activeId() === draggableId(itemId) ? \"true\" : undefined}\n >\n <Show when={targetBefore(itemId)}>\n {(target) => <PanesDropTargetView target={target()} label={targetLabel(target())} dnd={props.dnd} placement=\"tab\" />}\n </Show>\n <button\n id={tabId(itemId)}\n type=\"button\"\n class=\"k2b-panes__tab-button\"\n role=\"tab\"\n aria-label={item().title}\n aria-selected={active()}\n aria-controls={active() ? panelId(itemId) : undefined}\n aria-posinset={index() + 1}\n aria-setsize={itemIds().length}\n aria-keyshortcuts={item().onClose ? \"Delete Backspace\" : undefined}\n tabIndex={active() ? 0 : -1}\n title={item().title}\n onPointerDown={(event) => startTabPress(event, itemId)}\n onClick={(event) => {\n if (event?.detail > 0 && suppressedPointerClick === itemId) {\n suppressedPointerClick = null;\n if (clearSuppressedPointerClick !== undefined) {\n window.clearTimeout(clearSuppressedPointerClick);\n clearSuppressedPointerClick = undefined;\n }\n return;\n }\n props.onActivate(itemId);\n }}\n onKeyDown={(event) => onTabKeyDown(event, index(), itemId)}\n >\n <span class=\"k2b-ui k2b-panes__drag-surface k2b-panes__drag-preview\" data-dnd-preview>\n <i class={`${iconClass(item().icon)} k2b-panes__icon`} aria-hidden=\"true\" />\n <span>{item().title}</span>\n </span>\n </button>\n <Show when={item().onClose !== undefined}>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-panes__close\"\n content={messages().closeNamed({ name: item().title })}\n aria-label={messages().closeNamed({ name: item().title })}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n item().onClose?.();\n }}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n </div>\n );\n }}\n </For>\n <Show when={targetAtEnd()}>\n {(target) => <PanesDropTargetView target={target()} label={targetLabel(target())} dnd={props.dnd} placement=\"tab-end\" />}\n </Show>\n <Show when={props.canAdd()}>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-panes__add k2b-panes__add--tab\"\n aria-label={messages().addPane}\n content={messages().addPane}\n onClick={() => props.addItem(props.node().active)}\n >\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n </div>\n <Show when={scrollbar().overflow}>\n <div\n class=\"k2b-panes__tabs-scrollbar\"\n aria-hidden=\"true\"\n onPointerDown={startScrollbarDrag}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-panes-scroll-left\": `${scrollbar().left}px`,\n \"--k2b-panes-scroll-width\": `${scrollbar().width}px`,\n }}\n />\n </div>\n </Show>\n <div class=\"k2b-panes__body\">\n <div id={panelId(props.node().active)} class=\"k2b-panes__panel\" role=\"tabpanel\" aria-labelledby={tabId(props.node().active)}>\n <Show when={props.node().active} keyed>\n {(itemId) => <ActivePane itemId={itemId} itemById={props.itemById} />}\n </Show>\n </div>\n </div>\n <Show when={bodyTargets().length > 0}>\n <div class=\"k2b-panes__drop-targets\" aria-hidden=\"true\">\n <For each={bodyTargets()}>\n {(target) => <PanesDropTargetView target={target} label={targetLabel(target)} dnd={props.dnd} placement=\"body\" />}\n </For>\n </div>\n </Show>\n </section>\n );\n}\n\nfunction PanesDropTargetView(props: {\n target: PanesDropTarget;\n label: string;\n dnd: PaneDnd;\n placement: \"tab\" | \"tab-end\" | \"body\";\n}): JSX.Element {\n const icon = () => {\n if (props.target.kind === \"group\") return \"ti ti-plus\";\n if (props.target.kind === \"tab\") return props.placement === \"tab\" ? \"ti ti-spacing-horizontal\" : null;\n if (props.target.side === \"top\") return \"ti ti-row-insert-top\";\n if (props.target.side === \"bottom\") return \"ti ti-row-insert-bottom\";\n if (props.target.side === \"left\") return \"ti ti-column-insert-left\";\n return \"ti ti-column-insert-right\";\n };\n return (\n <div\n ref={(element) =>\n props.dnd.droppable(element, () => ({\n id: `panes-target:${props.target.id}`,\n meta: { target: props.target, label: props.label },\n }))\n }\n class=\"k2b-panes__drop-target\"\n data-kind={props.target.kind}\n data-placement={props.placement}\n data-zone={props.target.side}\n data-active={props.dnd.overId() === `panes-target:${props.target.id}` ? \"true\" : undefined}\n title={props.label}\n aria-hidden=\"true\"\n >\n <Show when={icon()} keyed>\n {(iconClass) => <i class={iconClass} aria-hidden=\"true\" />}\n </Show>\n <Show when={props.target.kind === \"split\"}>\n <span>{props.label}</span>\n </Show>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["layout/Panes.tsx"],"sourcesContent":["import { type DndCollisionContext, type DndController, type DndDroppableSnapshot, dnd } from \"@k2b/stdlib/solid\";\nimport { createEffect, createMemo, createSignal, createUniqueId, For, type JSX, onCleanup, onMount, Show } from \"solid-js\";\nimport { Tooltip } from \"../feedback/Tooltip\";\nimport { suppressTextSelection } from \"../internal/text-selection\";\nimport { useUiMessages } from \"../intl/messages\";\nimport {\n activatePanesItem,\n applyPanesIntent,\n getPanesDropTargets,\n PANES_MAX_ID_LENGTH,\n PANES_MIN_RATIO,\n type PanesDropTarget,\n type PanesGroup,\n type PanesIntent,\n type PanesLayout,\n type PanesNode,\n type PanesPath,\n type PanesSplit,\n parsePanesLayout,\n resizePanesSplit,\n samePanesIntent,\n} from \"./panes-layout\";\nimport { usePanesMessages } from \"./panes-messages\";\nimport { assertUniqueStableUiIds } from \"./stable-id\";\n\nexport type PanesItem = {\n id: string;\n title: string;\n icon?: string;\n render: () => JSX.Element;\n onClose?: () => void;\n};\n\nexport type PanesProps = {\n layout: PanesLayout;\n onLayoutChange: (layout: PanesLayout) => void;\n items: readonly PanesItem[];\n movable?: boolean;\n resizable?: boolean;\n split?: false | \"horizontal\" | \"vertical\" | \"both\";\n onAddItem?: (targetItemId: string | null) => void;\n ariaLabel?: string;\n class?: string;\n};\n\ntype DragMeta = { itemId: string; label: string };\ntype DropMeta = { target: PanesDropTarget; label: string };\ntype PaneDnd = DndController<DragMeta, DropMeta, PanesIntent>;\n\ntype IndexedPanesDropTargets = {\n tabs: ReadonlyMap<string | null, PanesDropTarget>;\n body: readonly PanesDropTarget[];\n};\n\ntype PanesSeparatorGeometry = {\n coordinate: number;\n crossStart: number;\n crossEnd: number;\n};\n\nconst PANES_RESIZE_SNAP_DISTANCE = 8;\nconst PANES_RESIZE_UNSNAP_DISTANCE = 12;\nconst PANES_RESIZE_NEIGHBOR_GAP = 16;\n\nconst intervalGap = (left: PanesSeparatorGeometry, right: PanesSeparatorGeometry): number =>\n left.crossEnd < right.crossStart\n ? right.crossStart - left.crossEnd\n : right.crossEnd < left.crossStart\n ? left.crossStart - right.crossEnd\n : 0;\n\nexport const resolvePanesResizeSnap = (\n coordinate: number,\n source: PanesSeparatorGeometry,\n candidates: readonly PanesSeparatorGeometry[],\n options: { activeCoordinate?: number | null; previousCoordinate?: number } = {},\n): { coordinate: number; snappedTo: number | null } => {\n const neighbors = candidates.filter((candidate) => {\n const gap = intervalGap(source, candidate);\n return gap > 0 && gap <= PANES_RESIZE_NEIGHBOR_GAP;\n });\n const activeCoordinate = options.activeCoordinate;\n const active =\n activeCoordinate === null || activeCoordinate === undefined\n ? null\n : neighbors.find((candidate) => Math.abs(candidate.coordinate - activeCoordinate) < 0.5);\n if (active && Math.abs(coordinate - active.coordinate) <= PANES_RESIZE_UNSNAP_DISTANCE) {\n return { coordinate: active.coordinate, snappedTo: active.coordinate };\n }\n\n const previous = options.previousCoordinate;\n let winner: PanesSeparatorGeometry | null = null;\n let winnerDistance = Number.POSITIVE_INFINITY;\n for (const candidate of neighbors) {\n if (previous !== undefined && Math.abs(candidate.coordinate - previous) < 0.5) continue;\n const distanceToRange =\n previous === undefined ||\n candidate.coordinate < Math.min(previous, coordinate) ||\n candidate.coordinate > Math.max(previous, coordinate)\n ? Math.abs(candidate.coordinate - coordinate)\n : 0;\n const distanceToCoordinate = Math.abs(candidate.coordinate - coordinate);\n if (distanceToRange <= PANES_RESIZE_SNAP_DISTANCE && distanceToCoordinate < winnerDistance) {\n winner = candidate;\n winnerDistance = distanceToCoordinate;\n }\n }\n return winner ? { coordinate: winner.coordinate, snappedTo: winner.coordinate } : { coordinate, snappedTo: null };\n};\n\nexport const indexPanesDropTargets = (targets: readonly PanesDropTarget[]): ReadonlyMap<string, IndexedPanesDropTargets> => {\n const mutable = new Map<string, { tabs: Map<string | null, PanesDropTarget>; body: PanesDropTarget[] }>();\n for (const target of targets) {\n let indexed = mutable.get(target.targetItemId);\n if (!indexed) {\n indexed = { tabs: new Map(), body: [] };\n mutable.set(target.targetItemId, indexed);\n }\n if (target.kind === \"tab\") indexed.tabs.set(target.beforeItemId ?? null, target);\n else indexed.body.push(target);\n }\n return mutable;\n};\n\nconst iconClass = (icon: string | undefined): string => {\n const value = icon?.trim() || \"ti-layout-sidebar-right\";\n return value.startsWith(\"ti \") ? value : `ti ${value}`;\n};\n\nconst collectLayoutItemIds = (node: PanesNode | null, ids: string[] = []): string[] => {\n if (!node) return ids;\n if (node.type === \"group\") ids.push(...node.items);\n else {\n collectLayoutItemIds(node.first, ids);\n collectLayoutItemIds(node.second, ids);\n }\n return ids;\n};\n\nconst nearestDroppable = (entries: DndDroppableSnapshot<DropMeta>[]): DndDroppableSnapshot<DropMeta> | null =>\n entries.reduce<DndDroppableSnapshot<DropMeta> | null>(\n (winner, entry) => (!winner || entry.distance < winner.distance ? entry : winner),\n null,\n );\n\nexport const pointerHitsPanesDropTarget = (\n entry: Pick<DndDroppableSnapshot<DropMeta>, \"containsPointer\" | \"meta\" | \"rect\"> &\n Partial<Pick<DndDroppableSnapshot<DropMeta>, \"element\">>,\n pointer: { x: number; y: number },\n hitElement?: Element | null,\n): boolean => {\n if (hitElement !== undefined && !entry.element?.contains(hitElement)) return false;\n const side = entry.meta.target.side;\n if (entry.meta.target.kind !== \"split\" || !side) return entry.containsPointer;\n if (!entry.containsPointer) return false;\n const x = pointer.x - entry.rect.left;\n const y = pointer.y - entry.rect.top;\n if (side === \"top\") return x >= y && x <= entry.rect.width - y;\n if (side === \"bottom\") {\n const corner = entry.rect.height - y;\n return x >= corner && x <= entry.rect.width - corner;\n }\n if (side === \"left\") return y >= x && y <= entry.rect.height - x;\n const corner = entry.rect.width - x;\n return y >= corner && y <= entry.rect.height - corner;\n};\n\nconst panesCollisionDetector = (\n context: DndCollisionContext<DragMeta, DropMeta, PanesIntent>,\n mode: \"pointer\" | \"keyboard\" | null,\n): string | null => {\n const document = mode === \"pointer\" ? context.droppables[0]?.element.ownerDocument : undefined;\n const hitElement = document?.elementFromPoint(context.pointer.x, context.pointer.y) ?? undefined;\n return nearestDroppable(context.droppables.filter((entry) => pointerHitsPanesDropTarget(entry, context.pointer, hitElement)))?.id ?? null;\n};\n\nconst createItemMap = (items: readonly PanesItem[]): Map<string, PanesItem> => {\n assertUniqueStableUiIds(\n items.map((item) => item.id),\n \"Panes item id\",\n PANES_MAX_ID_LENGTH,\n );\n return new Map(items.map((item) => [item.id, item]));\n};\n\nconst requireItem = (items: Map<string, PanesItem>, id: string): PanesItem => {\n const item = items.get(id);\n if (!item) throw new Error(`Panes layout references missing item \"${id}\".`);\n return item;\n};\n\nexport default function Panes(props: PanesProps): JSX.Element {\n const panesMessages = usePanesMessages();\n const instanceId = `k2b-panes-${createUniqueId()}`;\n const items = createMemo(() => createItemMap(props.items));\n const layout = createMemo(() => {\n if (!parsePanesLayout(props.layout)) throw new Error(\"Panes layout must be a valid version 2 layout.\");\n for (const id of collectLayoutItemIds(props.layout.root)) requireItem(items(), id);\n return props.layout;\n });\n const canMove = () => props.movable ?? true;\n const canResize = () => props.resizable ?? true;\n const split = () => props.split ?? \"both\";\n const [draggedItemId, setDraggedItemId] = createSignal<string | null>(null);\n const [dragMode, setDragMode] = createSignal<\"pointer\" | \"keyboard\" | null>(null);\n const dropTargets = createMemo(() => {\n const itemId = draggedItemId();\n return itemId ? getPanesDropTargets(layout(), itemId, { movable: canMove(), split: split() }) : [];\n });\n const dropTargetIndex = createMemo(() => indexPanesDropTargets(dropTargets()));\n const paneDnd = dnd.create<DragMeta, DropMeta, PanesIntent>({\n collisionDetector: (context) => panesCollisionDetector(context, dragMode()),\n buildIntent: ({ over }) => over?.meta.target.intent ?? null,\n isSameIntent: samePanesIntent,\n onDragStart: ({ active, mode }) => {\n setDragMode(mode);\n setDraggedItemId(active.meta.itemId);\n },\n announcements: {\n dragStart: (active) => `Picked up ${active.meta.label}.`,\n dragOver: (active, over) => (over ? `Move ${active.meta.label} to ${over.meta.label}.` : `${active.meta.label} is not over a pane.`),\n drop: (active, over) => (over ? `Moved ${active.meta.label} to ${over.meta.label}.` : `Did not move ${active.meta.label}.`),\n cancel: (active) => `Cancelled moving ${active.meta.label}.`,\n },\n onDrop: ({ intent, mode }) => {\n setDragMode(null);\n setDraggedItemId(null);\n if (!intent) return;\n const current = layout();\n const next = applyPanesIntent(current, intent);\n if (next === current) return;\n props.onLayoutChange(next);\n if (mode === \"keyboard\") queueMicrotask(() => document.getElementById(`${instanceId}-${intent.itemId}-tab`)?.focus());\n },\n onCancel: () => {\n setDragMode(null);\n setDraggedItemId(null);\n },\n });\n const activate = (itemId: string) => {\n const current = layout();\n const next = activatePanesItem(current, itemId);\n if (next !== current) props.onLayoutChange(next);\n };\n const requestAdd = (targetItemId: string | null) => props.onAddItem?.(targetItemId);\n\n return (\n <div class={`k2b-panes ${props.class ?? \"\"}`} data-k2b-panes role=\"group\" aria-label={props.ariaLabel ?? panesMessages().paneWorkspace}>\n <Show\n when={layout().root}\n fallback={\n <div class=\"k2b-panes__empty\">\n <Show when={props.onAddItem !== undefined}>\n <button type=\"button\" class=\"k2b-panes__add\" onClick={() => requestAdd(null)} aria-label={panesMessages().addPane}>\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n <span>{panesMessages().addPane}</span>\n </button>\n </Show>\n </div>\n }\n >\n {(root) => (\n <PanesNodeRenderer\n node={root}\n path={[]}\n layout={layout}\n itemById={items}\n dnd={paneDnd}\n dropTargetIndex={dropTargetIndex}\n instanceId={instanceId}\n canMove={canMove}\n canResize={canResize}\n addItem={requestAdd}\n canAdd={() => props.onAddItem !== undefined}\n onActivate={activate}\n onLayoutChange={props.onLayoutChange}\n />\n )}\n </Show>\n </div>\n );\n}\n\ntype RendererProps = {\n node: () => PanesNode;\n path: PanesPath;\n layout: () => PanesLayout;\n itemById: () => Map<string, PanesItem>;\n dnd: PaneDnd;\n dropTargetIndex: () => ReadonlyMap<string, IndexedPanesDropTargets>;\n instanceId: string;\n canMove: () => boolean;\n canResize: () => boolean;\n addItem: (targetItemId: string | null) => void;\n canAdd: () => boolean;\n onActivate: (itemId: string) => void;\n onLayoutChange: (layout: PanesLayout) => void;\n};\n\nfunction PanesNodeRenderer(props: RendererProps): JSX.Element {\n const split = createMemo(() => {\n const node = props.node();\n return node.type === \"split\" ? node : null;\n });\n const group = createMemo(() => {\n const node = props.node();\n return node.type === \"group\" ? node : null;\n });\n return (\n <>\n <Show when={split()}>{(node) => <PanesSplitRenderer {...props} node={node} />}</Show>\n <Show when={group()}>{(node) => <PanesGroupRenderer {...props} node={node} />}</Show>\n </>\n );\n}\n\nfunction PanesSplitRenderer(props: Omit<RendererProps, \"node\"> & { node: () => PanesSplit }): JSX.Element {\n const panesMessages = usePanesMessages();\n let container: HTMLDivElement | undefined;\n let separatorElement: HTMLButtonElement | undefined;\n let stopResize: (() => void) | undefined;\n let finishResize: (() => void) | undefined;\n const stopActiveResize = () => {\n stopResize?.();\n stopResize = undefined;\n finishResize = undefined;\n };\n const finishActiveResize = () => {\n finishResize?.();\n stopResize = undefined;\n finishResize = undefined;\n };\n onCleanup(stopActiveResize);\n const commitRatio = (ratio: number) => {\n const current = props.layout();\n const next = resizePanesSplit(current, props.path, ratio);\n if (next !== current) props.onLayoutChange(next);\n };\n const resizeGeometry = (separator: HTMLElement | undefined) => {\n if (!separator) return null;\n const direction = props.node().direction;\n const containerRect = container?.getBoundingClientRect();\n const separatorRect = separator.getBoundingClientRect();\n const extent = direction === \"horizontal\" ? (containerRect?.width ?? 0) : (containerRect?.height ?? 0);\n const separatorExtent = direction === \"horizontal\" ? separatorRect.width : separatorRect.height;\n const availableExtent = extent - separatorExtent;\n if (!containerRect || availableExtent <= 0 || separatorRect.width <= 0 || separatorRect.height <= 0) return null;\n const geometry = (rect: DOMRect): PanesSeparatorGeometry =>\n direction === \"horizontal\"\n ? { coordinate: rect.left + rect.width / 2, crossStart: rect.top, crossEnd: rect.bottom }\n : { coordinate: rect.top + rect.height / 2, crossStart: rect.left, crossEnd: rect.right };\n const panes = separator.closest<HTMLElement>(\"[data-k2b-panes]\");\n const candidates = panes\n ? Array.from(panes.querySelectorAll<HTMLElement>(`.k2b-panes__separator[data-direction=\"${direction}\"]`))\n .filter((candidate) => candidate !== separator && candidate.closest(\"[data-k2b-panes]\") === panes)\n .map((candidate) => candidate.getBoundingClientRect())\n .filter((rect) => rect.width > 0 && rect.height > 0)\n .map(geometry)\n : [];\n const origin = direction === \"horizontal\" ? containerRect.left + separatorExtent / 2 : containerRect.top + separatorExtent / 2;\n return {\n source: geometry(separatorRect),\n candidates,\n coordinateForRatio: (ratio: number) => origin + availableExtent * ratio,\n ratioForCoordinate: (coordinate: number) => (coordinate - origin) / availableExtent,\n };\n };\n const startResize = (event: PointerEvent) => {\n if (!props.canResize() || event.button !== 0) return;\n event.preventDefault();\n stopActiveResize();\n const pointerId = event.pointerId;\n const captureTarget = (event.currentTarget as HTMLElement | null) ?? separatorElement;\n if (!captureTarget) return;\n const start = props.node().direction === \"horizontal\" ? event.clientX : event.clientY;\n const geometry = resizeGeometry(captureTarget);\n const startRatio = props.node().ratio;\n const startCoordinate = geometry?.source.coordinate;\n const rect = container?.getBoundingClientRect();\n const extent = Math.max(1, props.node().direction === \"horizontal\" ? (rect?.width ?? 1) : (rect?.height ?? 1));\n let snappedTo: number | null = null;\n let frame: number | undefined;\n let pendingRatio: number | undefined;\n const flush = () => {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n if (pendingRatio === undefined) return;\n const ratio = pendingRatio;\n pendingRatio = undefined;\n commitRatio(ratio);\n };\n const onMove = (move: PointerEvent) => {\n if (move.pointerId !== pointerId) return;\n const current = props.node().direction === \"horizontal\" ? move.clientX : move.clientY;\n if (geometry && startCoordinate !== undefined) {\n const snapped = resolvePanesResizeSnap(startCoordinate + current - start, geometry.source, geometry.candidates, {\n activeCoordinate: snappedTo,\n });\n snappedTo = snapped.snappedTo;\n pendingRatio = geometry.ratioForCoordinate(snapped.coordinate);\n } else {\n pendingRatio = startRatio + (current - start) / extent;\n }\n if (frame === undefined) frame = requestAnimationFrame(flush);\n };\n const onEnd = (end: PointerEvent) => {\n if (end.pointerId === pointerId) finishActiveResize();\n };\n const releaseTextSelection = suppressTextSelection(pointerId);\n stopResize = () => {\n releaseTextSelection();\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n pendingRatio = undefined;\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onEnd);\n window.removeEventListener(\"pointercancel\", onEnd);\n window.removeEventListener(\"blur\", finishActiveResize);\n if (captureTarget.hasPointerCapture?.(pointerId)) captureTarget.releasePointerCapture(pointerId);\n };\n finishResize = () => {\n flush();\n stopResize?.();\n };\n captureTarget.setPointerCapture?.(pointerId);\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onEnd);\n window.addEventListener(\"pointercancel\", onEnd);\n window.addEventListener(\"blur\", finishActiveResize);\n };\n const onResizeKeyDown = (event: KeyboardEvent) => {\n if (!props.canResize()) return;\n const step = event.shiftKey ? 0.08 : 0.02;\n let ratio: number | null = null;\n if (event.key === \"Home\") ratio = PANES_MIN_RATIO;\n if (event.key === \"End\") ratio = 1 - PANES_MIN_RATIO;\n if (props.node().direction === \"horizontal\" && event.key === \"ArrowLeft\") ratio = props.node().ratio - step;\n if (props.node().direction === \"horizontal\" && event.key === \"ArrowRight\") ratio = props.node().ratio + step;\n if (props.node().direction === \"vertical\" && event.key === \"ArrowUp\") ratio = props.node().ratio - step;\n if (props.node().direction === \"vertical\" && event.key === \"ArrowDown\") ratio = props.node().ratio + step;\n if (ratio === null) return;\n event.preventDefault();\n const geometry = resizeGeometry((event.currentTarget as HTMLElement | null) ?? separatorElement);\n if (geometry) {\n const snapped = resolvePanesResizeSnap(geometry.coordinateForRatio(ratio), geometry.source, geometry.candidates, {\n previousCoordinate: geometry.source.coordinate,\n });\n ratio = geometry.ratioForCoordinate(snapped.coordinate);\n }\n commitRatio(ratio);\n };\n return (\n <div ref={container} class=\"k2b-panes__split\" data-direction={props.node().direction}>\n <div class=\"k2b-panes__split-child\" style={{ flex: `${props.node().ratio} 1 0` }}>\n <PanesNodeRenderer {...props} node={() => props.node().first} path={[...props.path, \"first\"]} />\n </div>\n <button\n ref={separatorElement}\n type=\"button\"\n role=\"separator\"\n aria-orientation={props.node().direction === \"horizontal\" ? \"vertical\" : \"horizontal\"}\n aria-valuemin={Math.round(PANES_MIN_RATIO * 100)}\n aria-valuemax={Math.round((1 - PANES_MIN_RATIO) * 100)}\n aria-valuenow={Math.round(props.node().ratio * 100)}\n aria-disabled={!props.canResize()}\n tabIndex={props.canResize() ? 0 : -1}\n class=\"k2b-panes__separator\"\n data-direction={props.node().direction}\n aria-label={panesMessages().resizePanes}\n onPointerDown={startResize}\n onKeyDown={onResizeKeyDown}\n >\n <span aria-hidden=\"true\" />\n </button>\n <div class=\"k2b-panes__split-child\" style={{ flex: `${1 - props.node().ratio} 1 0` }}>\n <PanesNodeRenderer {...props} node={() => props.node().second} path={[...props.path, \"second\"]} />\n </div>\n </div>\n );\n}\n\nfunction ActivePane(props: { itemId: string; itemById: () => Map<string, PanesItem> }): JSX.Element {\n return requireItem(props.itemById(), props.itemId).render();\n}\n\nfunction PanesGroupRenderer(props: Omit<RendererProps, \"node\"> & { node: () => PanesGroup }): JSX.Element {\n const messages = useUiMessages();\n const panesMessages = usePanesMessages();\n let tabsElement: HTMLDivElement | undefined;\n let scrollbarDragOffset = 0;\n let stopTabPress: (() => void) | undefined;\n let suppressedPointerClick: string | null = null;\n let clearSuppressedPointerClick: number | undefined;\n const dndInstanceId = createUniqueId();\n const draggableId = (id: string) => `panes-item:${dndInstanceId}:${id}`;\n const itemIds = createMemo(() => props.node().items);\n const groupTargets = createMemo<IndexedPanesDropTargets | null>(() => {\n const index = props.dropTargetIndex();\n for (const itemId of itemIds()) {\n const indexed = index.get(itemId);\n if (indexed) return indexed;\n }\n return null;\n });\n const targetBefore = (itemId: string) => groupTargets()?.tabs.get(itemId);\n const targetAtEnd = () => groupTargets()?.tabs.get(null);\n const bodyTargets = () => groupTargets()?.body ?? [];\n const startTabPress = (event: PointerEvent & { currentTarget: HTMLButtonElement }, itemId: string) => {\n if (event.button !== 0 || event.isPrimary === false) return;\n stopTabPress?.();\n const pointerId = event.pointerId;\n const button = event.currentTarget;\n const ownerWindow = window;\n const stop = () => {\n ownerWindow.removeEventListener(\"pointerup\", onPointerUp, true);\n ownerWindow.removeEventListener(\"pointercancel\", onPointerCancel, true);\n if (stopTabPress === stop) stopTabPress = undefined;\n };\n const onPointerUp = (up: PointerEvent) => {\n if (up.pointerId !== pointerId) return;\n const rect = button.getBoundingClientRect();\n const releasedInside = up.clientX >= rect.left && up.clientX <= rect.right && up.clientY >= rect.top && up.clientY <= rect.bottom;\n const shouldActivate = releasedInside && !props.dnd.isDragging();\n stop();\n if (!shouldActivate) return;\n suppressedPointerClick = itemId;\n if (clearSuppressedPointerClick !== undefined) ownerWindow.clearTimeout(clearSuppressedPointerClick);\n clearSuppressedPointerClick = ownerWindow.setTimeout(() => {\n if (suppressedPointerClick === itemId) suppressedPointerClick = null;\n clearSuppressedPointerClick = undefined;\n }, 0);\n props.onActivate(itemId);\n };\n const onPointerCancel = (cancel: PointerEvent) => {\n if (cancel.pointerId === pointerId) stop();\n };\n stopTabPress = stop;\n ownerWindow.addEventListener(\"pointerup\", onPointerUp, true);\n ownerWindow.addEventListener(\"pointercancel\", onPointerCancel, true);\n };\n onCleanup(() => {\n stopTabPress?.();\n if (clearSuppressedPointerClick !== undefined) window.clearTimeout(clearSuppressedPointerClick);\n });\n const [scrollbar, setScrollbar] = createSignal({ overflow: false, left: 0, width: 0 });\n const syncScrollbar = () => {\n if (!tabsElement) return;\n const { clientWidth, scrollLeft, scrollWidth } = tabsElement;\n if (scrollWidth <= clientWidth || clientWidth <= 0) {\n setScrollbar({ overflow: false, left: 0, width: 0 });\n return;\n }\n const width = Math.min(clientWidth, Math.max(24, (clientWidth * clientWidth) / scrollWidth));\n const left = (scrollLeft / (scrollWidth - clientWidth)) * (clientWidth - width);\n setScrollbar({ overflow: true, left, width });\n };\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n if (!tabsElement) return;\n const track = event.currentTarget;\n const { left, width } = scrollbar();\n const rect = track.getBoundingClientRect();\n const available = Math.max(1, rect.width - width);\n const thumbLeft = Math.min(available, Math.max(0, event.clientX - rect.left - scrollbarDragOffset));\n tabsElement.scrollLeft = (thumbLeft / available) * (tabsElement.scrollWidth - tabsElement.clientWidth);\n syncScrollbar();\n };\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }) => {\n if (event.button !== 0) return;\n event.preventDefault();\n const track = event.currentTarget;\n const current = scrollbar();\n scrollbarDragOffset =\n event.target === track\n ? current.width / 2\n : Math.min(current.width, Math.max(0, event.clientX - track.getBoundingClientRect().left - current.left));\n track.setPointerCapture(event.pointerId);\n // The track's own pointerup or pointercancel ends the hold.\n suppressTextSelection(event.pointerId);\n scrollFromPointer(event);\n };\n onMount(() => {\n syncScrollbar();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbar);\n if (tabsElement) observer?.observe(tabsElement);\n onCleanup(() => observer?.disconnect());\n });\n createEffect(() => {\n itemIds().length;\n props.itemById();\n groupTargets();\n props.canAdd();\n queueMicrotask(syncScrollbar);\n });\n const tabId = (itemId: string) => `${props.instanceId}-${itemId}-tab`;\n const panelId = (itemId: string) => `${props.instanceId}-${itemId}-panel`;\n const focusTab = (index: number) => {\n const itemId = itemIds()[index];\n if (!itemId) return;\n props.onActivate(itemId);\n queueMicrotask(() => document.getElementById(tabId(itemId))?.focus());\n };\n const onTabKeyDown = (event: KeyboardEvent, index: number, itemId: string) => {\n if (props.dnd.activeId() === draggableId(itemId)) return;\n const item = requireItem(props.itemById(), itemId);\n if ((event.key === \"Delete\" || event.key === \"Backspace\") && item.onClose) {\n event.preventDefault();\n item.onClose();\n return;\n }\n const count = itemIds().length;\n let next: number | null = null;\n if (event.key === \"ArrowLeft\") next = (index - 1 + count) % count;\n if (event.key === \"ArrowRight\") next = (index + 1) % count;\n if (event.key === \"Home\") next = 0;\n if (event.key === \"End\") next = count - 1;\n if (next === null) return;\n event.preventDefault();\n focusTab(next);\n };\n const targetLabel = (target: PanesDropTarget): string => {\n const targetItem = requireItem(props.itemById(), target.targetItemId);\n if (target.kind === \"group\") return panesMessages().addToNamed({ name: targetItem.title });\n if (target.kind === \"tab\") {\n const before = target.beforeItemId ? requireItem(props.itemById(), target.beforeItemId) : null;\n return before ? panesMessages().insertBeforeNamed({ name: before.title }) : panesMessages().insertAtEnd;\n }\n return target.side\n ? panesMessages().addPaneSide({ side: target.side, name: targetItem.title })\n : panesMessages().addToNamed({ name: targetItem.title });\n };\n return (\n <section class=\"k2b-panes__group\">\n <div\n ref={tabsElement}\n class=\"k2b-panes__tabs\"\n role=\"tablist\"\n aria-label={panesMessages().paneTabs}\n aria-orientation=\"horizontal\"\n onScroll={syncScrollbar}\n >\n <For each={itemIds()}>\n {(itemId, index) => {\n const item = () => requireItem(props.itemById(), itemId);\n const active = () => props.node().active === itemId;\n return (\n <div\n ref={(surface) =>\n props.dnd.draggable(surface, () => ({\n id: draggableId(itemId),\n meta: { itemId, label: item().title },\n disabled: !props.canMove(),\n focusable: false,\n keyboard: true,\n handleSelector: \".k2b-panes__tab-button\",\n }))\n }\n class=\"k2b-panes__tab\"\n data-active={active() ? \"true\" : undefined}\n data-closable={item().onClose !== undefined ? \"true\" : undefined}\n data-movable={props.canMove() ? \"true\" : undefined}\n data-dnd-active={props.dnd.activeId() === draggableId(itemId) ? \"true\" : undefined}\n >\n <Show when={targetBefore(itemId)}>\n {(target) => <PanesDropTargetView target={target()} label={targetLabel(target())} dnd={props.dnd} placement=\"tab\" />}\n </Show>\n <button\n id={tabId(itemId)}\n type=\"button\"\n class=\"k2b-panes__tab-button\"\n role=\"tab\"\n aria-label={item().title}\n aria-selected={active()}\n aria-controls={active() ? panelId(itemId) : undefined}\n aria-posinset={index() + 1}\n aria-setsize={itemIds().length}\n aria-keyshortcuts={item().onClose ? \"Delete Backspace\" : undefined}\n tabIndex={active() ? 0 : -1}\n title={item().title}\n onPointerDown={(event) => startTabPress(event, itemId)}\n onClick={(event) => {\n if (event?.detail > 0 && suppressedPointerClick === itemId) {\n suppressedPointerClick = null;\n if (clearSuppressedPointerClick !== undefined) {\n window.clearTimeout(clearSuppressedPointerClick);\n clearSuppressedPointerClick = undefined;\n }\n return;\n }\n props.onActivate(itemId);\n }}\n onKeyDown={(event) => onTabKeyDown(event, index(), itemId)}\n >\n <span class=\"k2b-ui k2b-panes__drag-surface k2b-panes__drag-preview\" data-dnd-preview>\n <i class={`${iconClass(item().icon)} k2b-panes__icon`} aria-hidden=\"true\" />\n <span>{item().title}</span>\n </span>\n </button>\n <Show when={item().onClose !== undefined}>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-panes__close\"\n content={messages().closeNamed({ name: item().title })}\n aria-label={messages().closeNamed({ name: item().title })}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n event.stopPropagation();\n item().onClose?.();\n }}\n >\n <i class=\"ti ti-x\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n </div>\n );\n }}\n </For>\n <Show when={targetAtEnd()}>\n {(target) => <PanesDropTargetView target={target()} label={targetLabel(target())} dnd={props.dnd} placement=\"tab-end\" />}\n </Show>\n <Show when={props.canAdd()}>\n <Tooltip.Trigger\n type=\"button\"\n class=\"k2b-panes__add k2b-panes__add--tab\"\n aria-label={panesMessages().addPane}\n content={panesMessages().addPane}\n onClick={() => props.addItem(props.node().active)}\n >\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n </Tooltip.Trigger>\n </Show>\n </div>\n <Show when={scrollbar().overflow}>\n <div\n class=\"k2b-panes__tabs-scrollbar\"\n aria-hidden=\"true\"\n onPointerDown={startScrollbarDrag}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-panes-scroll-left\": `${scrollbar().left}px`,\n \"--k2b-panes-scroll-width\": `${scrollbar().width}px`,\n }}\n />\n </div>\n </Show>\n <div class=\"k2b-panes__body\">\n <div id={panelId(props.node().active)} class=\"k2b-panes__panel\" role=\"tabpanel\" aria-labelledby={tabId(props.node().active)}>\n <Show when={props.node().active} keyed>\n {(itemId) => <ActivePane itemId={itemId} itemById={props.itemById} />}\n </Show>\n </div>\n </div>\n <Show when={bodyTargets().length > 0}>\n <div class=\"k2b-panes__drop-targets\" aria-hidden=\"true\">\n <For each={bodyTargets()}>\n {(target) => <PanesDropTargetView target={target} label={targetLabel(target)} dnd={props.dnd} placement=\"body\" />}\n </For>\n </div>\n </Show>\n </section>\n );\n}\n\nfunction PanesDropTargetView(props: {\n target: PanesDropTarget;\n label: string;\n dnd: PaneDnd;\n placement: \"tab\" | \"tab-end\" | \"body\";\n}): JSX.Element {\n const icon = () => {\n if (props.target.kind === \"group\") return \"ti ti-plus\";\n if (props.target.kind === \"tab\") return props.placement === \"tab\" ? \"ti ti-spacing-horizontal\" : null;\n if (props.target.side === \"top\") return \"ti ti-row-insert-top\";\n if (props.target.side === \"bottom\") return \"ti ti-row-insert-bottom\";\n if (props.target.side === \"left\") return \"ti ti-column-insert-left\";\n return \"ti ti-column-insert-right\";\n };\n return (\n <div\n ref={(element) =>\n props.dnd.droppable(element, () => ({\n id: `panes-target:${props.target.id}`,\n meta: { target: props.target, label: props.label },\n }))\n }\n class=\"k2b-panes__drop-target\"\n data-kind={props.target.kind}\n data-placement={props.placement}\n data-zone={props.target.side}\n data-active={props.dnd.overId() === `panes-target:${props.target.id}` ? \"true\" : undefined}\n title={props.label}\n aria-hidden=\"true\"\n >\n <Show when={icon()} keyed>\n {(iconClass) => <i class={iconClass} aria-hidden=\"true\" />}\n </Show>\n <Show when={props.target.kind === \"split\"}>\n <span>{props.label}</span>\n </Show>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -10,7 +10,8 @@ import { memo as _$memo } from "solid-js/web";
|
|
|
10
10
|
import { use as _$use } from "solid-js/web";
|
|
11
11
|
var _tmpl$ = /*#__PURE__*/_$template(`<div><div class=k2b-pull-to-refresh__indicator role=status aria-live=polite><span class=k2b-pull-to-refresh__icon aria-hidden=true><i></i></span><span class=k2b-sr-only></span></div><!$><!/>`);
|
|
12
12
|
import { createSignal, onCleanup, onMount } from "solid-js";
|
|
13
|
-
import {
|
|
13
|
+
import { suppressTextSelection } from "../internal/text-selection";
|
|
14
|
+
import { useRefreshMessages } from "./refresh-messages";
|
|
14
15
|
|
|
15
16
|
/** Android's SwipeRefreshLayout triggers at 64dp; the pull is damped to half the input travel. */
|
|
16
17
|
const THRESHOLD = 64;
|
|
@@ -29,7 +30,7 @@ const INTERACTIVE = "a, button, input, textarea, select, [contenteditable], [rol
|
|
|
29
30
|
* reload) next to it.
|
|
30
31
|
*/
|
|
31
32
|
export function PullToRefresh(props) {
|
|
32
|
-
const
|
|
33
|
+
const refreshMessages = useRefreshMessages();
|
|
33
34
|
const [state, setState] = createSignal("idle");
|
|
34
35
|
const [distance, setDistance] = createSignal(0);
|
|
35
36
|
let root;
|
|
@@ -99,19 +100,27 @@ export function PullToRefresh(props) {
|
|
|
99
100
|
};
|
|
100
101
|
const onPointerMove = event => {
|
|
101
102
|
if (!pointer || event.pointerId !== pointer.id) return;
|
|
103
|
+
// Before the pull captures the pointer, a release outside the wrapper never
|
|
104
|
+
// reaches it; a move without the pressed button shows that press is over.
|
|
105
|
+
if ((event.buttons & 1) === 0) return onPointerCancel(event);
|
|
102
106
|
const travel = event.clientY - pointer.startY;
|
|
103
107
|
if (travel <= 0 && state() === "idle") return;
|
|
104
|
-
if (state() === "idle")
|
|
108
|
+
if (state() === "idle") {
|
|
109
|
+
capture(pointer.id);
|
|
110
|
+
pointer.releaseTextSelection ??= suppressTextSelection(pointer.id);
|
|
111
|
+
}
|
|
105
112
|
pull(travel);
|
|
106
113
|
if (state() !== "idle") event.preventDefault();
|
|
107
114
|
};
|
|
108
115
|
const onPointerUp = event => {
|
|
109
116
|
if (!pointer || event.pointerId !== pointer.id) return;
|
|
117
|
+
pointer.releaseTextSelection?.();
|
|
110
118
|
pointer = null;
|
|
111
119
|
release();
|
|
112
120
|
};
|
|
113
121
|
const onPointerCancel = event => {
|
|
114
122
|
if (!pointer || event.pointerId !== pointer.id) return;
|
|
123
|
+
pointer.releaseTextSelection?.();
|
|
115
124
|
pointer = null;
|
|
116
125
|
abort();
|
|
117
126
|
};
|
|
@@ -189,7 +198,7 @@ export function PullToRefresh(props) {
|
|
|
189
198
|
typeof _ref$ === "function" ? _$use(_ref$, _el$) : root = _el$;
|
|
190
199
|
_$insert(_el$5, (() => {
|
|
191
200
|
var _c$ = _$memo(() => state() === "refreshing");
|
|
192
|
-
return () => _c$() ? props.label ??
|
|
201
|
+
return () => _c$() ? props.label ?? refreshMessages().refreshing : "";
|
|
193
202
|
})());
|
|
194
203
|
_$insert(_el$, () => props.children, _el$7, _co$);
|
|
195
204
|
_$effect(_p$ => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["layout/PullToRefresh.tsx"],"sourcesContent":["import { createSignal, type JSX, onCleanup, onMount } from \"solid-js\";\nimport { useUiMessages } from \"../intl/messages\";\n\n/** Android's SwipeRefreshLayout triggers at 64dp; the pull is damped to half the input travel. */\nconst THRESHOLD = 64;\nconst MAX_DISTANCE = 96;\nconst RESISTANCE = 0.5;\n/** A trackpad has no release event, so an idle gap ends the wheel gesture. */\nconst WHEEL_IDLE_MS = 300;\nconst LINE_HEIGHT = 16;\n\nexport type PullToRefreshState = \"idle\" | \"pulling\" | \"ready\" | \"refreshing\";\n\nexport type PullToRefreshProps = {\n /** Reloads the wrapped content. The indicator stays busy until the promise settles. */\n onRefresh: () => Promise<void>;\n disabled?: boolean;\n /** Status text announced while refreshing. Defaults to the shared \"Refreshing\" message. */\n label?: string;\n class?: string;\n /** Exactly one scroll container; the gesture only starts while it is scrolled to the top. */\n children: JSX.Element;\n};\n\nconst INTERACTIVE = \"a, button, input, textarea, select, [contenteditable], [role='button']\";\n\n/**\n * Turns a downward pull on a scroll container that is already at its top into\n * one `onRefresh` call. Touch pulls, mouse or pen drags on non-interactive\n * space, and trackpad or wheel overscroll share one gesture model. The gesture\n * is an enhancement: keep a keyboard-reachable refresh (a button or the page\n * reload) next to it.\n */\nexport function PullToRefresh(props: PullToRefreshProps): JSX.Element {\n const messages = useUiMessages();\n const [state, setState] = createSignal<PullToRefreshState>(\"idle\");\n const [distance, setDistance] = createSignal(0);\n let root!: HTMLDivElement;\n\n const active = () => !props.disabled && state() !== \"refreshing\";\n const atTop = (target: EventTarget | null) => {\n for (let node = target instanceof Element ? target : null; node && node !== root; node = node.parentElement)\n if (node.scrollTop > 0) return false;\n return true;\n };\n const interactive = (target: EventTarget | null) => target instanceof Element && target.closest(INTERACTIVE) !== null;\n /** Keeps the drag alive when the pointer leaves the wrapper; a pointer that is already gone must not end the gesture. */\n const capture = (id: number) => {\n try {\n root.setPointerCapture(id);\n } catch {}\n };\n\n const reset = () => {\n setDistance(0);\n setState(\"idle\");\n };\n const pull = (travel: number) => {\n const next = Math.min(MAX_DISTANCE, Math.max(0, travel * RESISTANCE));\n setDistance(next);\n setState(next >= THRESHOLD ? \"ready\" : next > 0 ? \"pulling\" : \"idle\");\n };\n const refresh = async () => {\n if (state() === \"refreshing\") return;\n setState(\"refreshing\");\n setDistance(THRESHOLD);\n try {\n await props.onRefresh();\n } finally {\n reset();\n }\n };\n const release = () => {\n if (state() === \"ready\") void refresh();\n else if (state() !== \"refreshing\") reset();\n };\n const abort = () => {\n if (state() !== \"refreshing\") reset();\n };\n\n let wheelTravel = 0;\n let wheelTimer: ReturnType<typeof setTimeout> | undefined;\n const endWheel = () => {\n wheelTravel = 0;\n abort();\n };\n const onWheel = (event: WheelEvent) => {\n if (!active()) return;\n clearTimeout(wheelTimer);\n wheelTimer = setTimeout(endWheel, WHEEL_IDLE_MS);\n if (event.deltaY >= 0 || !atTop(event.target)) return endWheel();\n const scale = event.deltaMode === 1 ? LINE_HEIGHT : event.deltaMode === 2 ? root.clientHeight : 1;\n wheelTravel -= event.deltaY * scale;\n pull(wheelTravel);\n if (state() === \"ready\") {\n wheelTravel = 0;\n void refresh();\n }\n };\n\n let pointer: { id: number; startY: number } | null = null;\n const onPointerDown = (event: PointerEvent) => {\n if (event.pointerType === \"touch\" || event.button !== 0 || !active() || interactive(event.target) || !atTop(event.target)) return;\n pointer = { id: event.pointerId, startY: event.clientY };\n };\n const onPointerMove = (event: PointerEvent) => {\n if (!pointer || event.pointerId !== pointer.id) return;\n const travel = event.clientY - pointer.startY;\n if (travel <= 0 && state() === \"idle\") return;\n if (state() === \"idle\") capture(pointer.id);\n pull(travel);\n if (state() !== \"idle\") event.preventDefault();\n };\n const onPointerUp = (event: PointerEvent) => {\n if (!pointer || event.pointerId !== pointer.id) return;\n pointer = null;\n release();\n };\n const onPointerCancel = (event: PointerEvent) => {\n if (!pointer || event.pointerId !== pointer.id) return;\n pointer = null;\n abort();\n };\n\n let touch: { id: number; startY: number } | null = null;\n const onTouchStart = (event: TouchEvent) => {\n const first = event.touches[0];\n if (!first || event.touches.length !== 1 || !active() || !atTop(event.target)) return;\n touch = { id: first.identifier, startY: first.clientY };\n };\n const onTouchMove = (event: TouchEvent) => {\n if (!touch) return;\n const current = Array.from(event.touches).find((item) => item.identifier === touch?.id);\n if (!current) return;\n const travel = current.clientY - touch.startY;\n if (travel <= 0 && state() === \"idle\") {\n touch = null;\n return;\n }\n pull(travel);\n if (state() !== \"idle\" && event.cancelable) event.preventDefault();\n };\n const onTouchEnd = () => {\n if (!touch) return;\n touch = null;\n release();\n };\n const onTouchCancel = () => {\n if (!touch) return;\n touch = null;\n abort();\n };\n\n onMount(() => {\n root.addEventListener(\"wheel\", onWheel, { passive: true });\n root.addEventListener(\"pointerdown\", onPointerDown);\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerup\", onPointerUp);\n root.addEventListener(\"pointercancel\", onPointerCancel);\n root.addEventListener(\"touchstart\", onTouchStart, { passive: true });\n root.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n root.addEventListener(\"touchend\", onTouchEnd);\n root.addEventListener(\"touchcancel\", onTouchCancel);\n onCleanup(() => {\n clearTimeout(wheelTimer);\n root.removeEventListener(\"wheel\", onWheel);\n root.removeEventListener(\"pointerdown\", onPointerDown);\n root.removeEventListener(\"pointermove\", onPointerMove);\n root.removeEventListener(\"pointerup\", onPointerUp);\n root.removeEventListener(\"pointercancel\", onPointerCancel);\n root.removeEventListener(\"touchstart\", onTouchStart);\n root.removeEventListener(\"touchmove\", onTouchMove);\n root.removeEventListener(\"touchend\", onTouchEnd);\n root.removeEventListener(\"touchcancel\", onTouchCancel);\n });\n });\n\n const className = () => (props.class?.trim() ? `k2b-pull-to-refresh ${props.class.trim()}` : \"k2b-pull-to-refresh\");\n const progress = () => Math.min(1, distance() / THRESHOLD);\n\n return (\n <div\n ref={root}\n class={className()}\n data-state={state()}\n style={{ \"--k2b-pull-to-refresh-distance\": `${distance()}px`, \"--k2b-pull-to-refresh-progress\": String(progress()) }}\n >\n <div class=\"k2b-pull-to-refresh__indicator\" role=\"status\" aria-live=\"polite\">\n <span class=\"k2b-pull-to-refresh__icon\" aria-hidden=\"true\">\n <i class={state() === \"refreshing\" ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-refresh\"} />\n </span>\n <span class=\"k2b-sr-only\">{state() === \"refreshing\" ? (props.label ?? messages().refreshing) : \"\"}</span>\n </div>\n {props.children}\n </div>\n );\n}\n\nexport default PullToRefresh;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["layout/PullToRefresh.tsx"],"sourcesContent":["import { createSignal, type JSX, onCleanup, onMount } from \"solid-js\";\nimport { suppressTextSelection } from \"../internal/text-selection\";\nimport { useRefreshMessages } from \"./refresh-messages\";\n\n/** Android's SwipeRefreshLayout triggers at 64dp; the pull is damped to half the input travel. */\nconst THRESHOLD = 64;\nconst MAX_DISTANCE = 96;\nconst RESISTANCE = 0.5;\n/** A trackpad has no release event, so an idle gap ends the wheel gesture. */\nconst WHEEL_IDLE_MS = 300;\nconst LINE_HEIGHT = 16;\n\nexport type PullToRefreshState = \"idle\" | \"pulling\" | \"ready\" | \"refreshing\";\n\nexport type PullToRefreshProps = {\n /** Reloads the wrapped content. The indicator stays busy until the promise settles. */\n onRefresh: () => Promise<void>;\n disabled?: boolean;\n /** Status text announced while refreshing. Defaults to the shared \"Refreshing\" message. */\n label?: string;\n class?: string;\n /** Exactly one scroll container; the gesture only starts while it is scrolled to the top. */\n children: JSX.Element;\n};\n\nconst INTERACTIVE = \"a, button, input, textarea, select, [contenteditable], [role='button']\";\n\n/**\n * Turns a downward pull on a scroll container that is already at its top into\n * one `onRefresh` call. Touch pulls, mouse or pen drags on non-interactive\n * space, and trackpad or wheel overscroll share one gesture model. The gesture\n * is an enhancement: keep a keyboard-reachable refresh (a button or the page\n * reload) next to it.\n */\nexport function PullToRefresh(props: PullToRefreshProps): JSX.Element {\n const refreshMessages = useRefreshMessages();\n const [state, setState] = createSignal<PullToRefreshState>(\"idle\");\n const [distance, setDistance] = createSignal(0);\n let root!: HTMLDivElement;\n\n const active = () => !props.disabled && state() !== \"refreshing\";\n const atTop = (target: EventTarget | null) => {\n for (let node = target instanceof Element ? target : null; node && node !== root; node = node.parentElement)\n if (node.scrollTop > 0) return false;\n return true;\n };\n const interactive = (target: EventTarget | null) => target instanceof Element && target.closest(INTERACTIVE) !== null;\n /** Keeps the drag alive when the pointer leaves the wrapper; a pointer that is already gone must not end the gesture. */\n const capture = (id: number) => {\n try {\n root.setPointerCapture(id);\n } catch {}\n };\n\n const reset = () => {\n setDistance(0);\n setState(\"idle\");\n };\n const pull = (travel: number) => {\n const next = Math.min(MAX_DISTANCE, Math.max(0, travel * RESISTANCE));\n setDistance(next);\n setState(next >= THRESHOLD ? \"ready\" : next > 0 ? \"pulling\" : \"idle\");\n };\n const refresh = async () => {\n if (state() === \"refreshing\") return;\n setState(\"refreshing\");\n setDistance(THRESHOLD);\n try {\n await props.onRefresh();\n } finally {\n reset();\n }\n };\n const release = () => {\n if (state() === \"ready\") void refresh();\n else if (state() !== \"refreshing\") reset();\n };\n const abort = () => {\n if (state() !== \"refreshing\") reset();\n };\n\n let wheelTravel = 0;\n let wheelTimer: ReturnType<typeof setTimeout> | undefined;\n const endWheel = () => {\n wheelTravel = 0;\n abort();\n };\n const onWheel = (event: WheelEvent) => {\n if (!active()) return;\n clearTimeout(wheelTimer);\n wheelTimer = setTimeout(endWheel, WHEEL_IDLE_MS);\n if (event.deltaY >= 0 || !atTop(event.target)) return endWheel();\n const scale = event.deltaMode === 1 ? LINE_HEIGHT : event.deltaMode === 2 ? root.clientHeight : 1;\n wheelTravel -= event.deltaY * scale;\n pull(wheelTravel);\n if (state() === \"ready\") {\n wheelTravel = 0;\n void refresh();\n }\n };\n\n let pointer: { id: number; startY: number; releaseTextSelection?: () => void } | null = null;\n const onPointerDown = (event: PointerEvent) => {\n if (event.pointerType === \"touch\" || event.button !== 0 || !active() || interactive(event.target) || !atTop(event.target)) return;\n pointer = { id: event.pointerId, startY: event.clientY };\n };\n const onPointerMove = (event: PointerEvent) => {\n if (!pointer || event.pointerId !== pointer.id) return;\n // Before the pull captures the pointer, a release outside the wrapper never\n // reaches it; a move without the pressed button shows that press is over.\n if ((event.buttons & 1) === 0) return onPointerCancel(event);\n const travel = event.clientY - pointer.startY;\n if (travel <= 0 && state() === \"idle\") return;\n if (state() === \"idle\") {\n capture(pointer.id);\n pointer.releaseTextSelection ??= suppressTextSelection(pointer.id);\n }\n pull(travel);\n if (state() !== \"idle\") event.preventDefault();\n };\n const onPointerUp = (event: PointerEvent) => {\n if (!pointer || event.pointerId !== pointer.id) return;\n pointer.releaseTextSelection?.();\n pointer = null;\n release();\n };\n const onPointerCancel = (event: PointerEvent) => {\n if (!pointer || event.pointerId !== pointer.id) return;\n pointer.releaseTextSelection?.();\n pointer = null;\n abort();\n };\n\n let touch: { id: number; startY: number } | null = null;\n const onTouchStart = (event: TouchEvent) => {\n const first = event.touches[0];\n if (!first || event.touches.length !== 1 || !active() || !atTop(event.target)) return;\n touch = { id: first.identifier, startY: first.clientY };\n };\n const onTouchMove = (event: TouchEvent) => {\n if (!touch) return;\n const current = Array.from(event.touches).find((item) => item.identifier === touch?.id);\n if (!current) return;\n const travel = current.clientY - touch.startY;\n if (travel <= 0 && state() === \"idle\") {\n touch = null;\n return;\n }\n pull(travel);\n if (state() !== \"idle\" && event.cancelable) event.preventDefault();\n };\n const onTouchEnd = () => {\n if (!touch) return;\n touch = null;\n release();\n };\n const onTouchCancel = () => {\n if (!touch) return;\n touch = null;\n abort();\n };\n\n onMount(() => {\n root.addEventListener(\"wheel\", onWheel, { passive: true });\n root.addEventListener(\"pointerdown\", onPointerDown);\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerup\", onPointerUp);\n root.addEventListener(\"pointercancel\", onPointerCancel);\n root.addEventListener(\"touchstart\", onTouchStart, { passive: true });\n root.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n root.addEventListener(\"touchend\", onTouchEnd);\n root.addEventListener(\"touchcancel\", onTouchCancel);\n onCleanup(() => {\n clearTimeout(wheelTimer);\n root.removeEventListener(\"wheel\", onWheel);\n root.removeEventListener(\"pointerdown\", onPointerDown);\n root.removeEventListener(\"pointermove\", onPointerMove);\n root.removeEventListener(\"pointerup\", onPointerUp);\n root.removeEventListener(\"pointercancel\", onPointerCancel);\n root.removeEventListener(\"touchstart\", onTouchStart);\n root.removeEventListener(\"touchmove\", onTouchMove);\n root.removeEventListener(\"touchend\", onTouchEnd);\n root.removeEventListener(\"touchcancel\", onTouchCancel);\n });\n });\n\n const className = () => (props.class?.trim() ? `k2b-pull-to-refresh ${props.class.trim()}` : \"k2b-pull-to-refresh\");\n const progress = () => Math.min(1, distance() / THRESHOLD);\n\n return (\n <div\n ref={root}\n class={className()}\n data-state={state()}\n style={{ \"--k2b-pull-to-refresh-distance\": `${distance()}px`, \"--k2b-pull-to-refresh-progress\": String(progress()) }}\n >\n <div class=\"k2b-pull-to-refresh__indicator\" role=\"status\" aria-live=\"polite\">\n <span class=\"k2b-pull-to-refresh__icon\" aria-hidden=\"true\">\n <i class={state() === \"refreshing\" ? \"ti ti-loader-2 k2b-spin\" : \"ti ti-refresh\"} />\n </span>\n <span class=\"k2b-sr-only\">{state() === \"refreshing\" ? (props.label ?? refreshMessages().refreshing) : \"\"}</span>\n </div>\n {props.children}\n </div>\n );\n}\n\nexport default PullToRefresh;\n"],"mappings":"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","ignoreList":[]}
|