@k2b/ui 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/actions/Button.js +11 -2
- package/dist/browser/actions/Button.js.map +1 -1
- package/dist/browser/actions/Disclosure.js +11 -8
- package/dist/browser/actions/Disclosure.js.map +1 -1
- package/dist/browser/actions/Dropdown.js +4 -1
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/FilterChip.js +16 -2
- package/dist/browser/actions/FilterChip.js.map +1 -1
- package/dist/browser/actions/SplitButton.js +69 -22
- package/dist/browser/actions/SplitButton.js.map +1 -1
- package/dist/browser/actions/SpotlightSearch.js +3 -7
- package/dist/browser/actions/SpotlightSearch.js.map +1 -1
- package/dist/browser/actions/Tabs.js +132 -47
- package/dist/browser/actions/Tabs.js.map +1 -1
- package/dist/browser/actions/index.js +1 -1
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/chat/ChatComposer.js +751 -423
- package/dist/browser/chat/ChatComposer.js.map +1 -1
- package/dist/browser/chat/ChatContextPopup.js +123 -0
- package/dist/browser/chat/ChatContextPopup.js.map +1 -0
- package/dist/browser/chat/ChatPrimitives.js +141 -78
- package/dist/browser/chat/ChatPrimitives.js.map +1 -1
- package/dist/browser/chat/ChatTasks.js +112 -0
- package/dist/browser/chat/ChatTasks.js.map +1 -0
- package/dist/browser/chat/ChatTimeline.js +31 -14
- package/dist/browser/chat/ChatTimeline.js.map +1 -1
- package/dist/browser/chat/chat-behavior.js +0 -5
- package/dist/browser/chat/chat-behavior.js.map +1 -1
- package/dist/browser/chat/composer-document.js +55 -0
- package/dist/browser/chat/composer-document.js.map +1 -0
- package/dist/browser/chat/index.js +6 -1
- package/dist/browser/chat/index.js.map +1 -1
- package/dist/browser/chat/types.js.map +1 -1
- package/dist/browser/content/Chart.js +148 -239
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartExplorer.js +324 -0
- package/dist/browser/content/ChartExplorer.js.map +1 -0
- package/dist/browser/content/ChartExplorerControls.js +153 -0
- package/dist/browser/content/ChartExplorerControls.js.map +1 -0
- package/dist/browser/content/ChartFilterControls.js +200 -0
- package/dist/browser/content/ChartFilterControls.js.map +1 -0
- package/dist/browser/content/ChartSnapshotView.js +113 -0
- package/dist/browser/content/ChartSnapshotView.js.map +1 -0
- package/dist/browser/content/DataTable.js +48 -32
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/FileBrowser.js +3 -0
- package/dist/browser/content/FileBrowser.js.map +1 -1
- package/dist/browser/content/FileGrid.js +93 -0
- package/dist/browser/content/FileGrid.js.map +1 -0
- package/dist/browser/content/FileTree.js +2 -2
- package/dist/browser/content/FileTree.js.map +1 -1
- package/dist/browser/content/FileView.js +507 -162
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/MarkdownView.js +6 -0
- package/dist/browser/content/MarkdownView.js.map +1 -1
- package/dist/browser/content/PdfPreview.js +107 -90
- package/dist/browser/content/PdfPreview.js.map +1 -1
- package/dist/browser/content/chart-cursor.js +33 -0
- package/dist/browser/content/chart-cursor.js.map +1 -0
- package/dist/browser/content/chart-explorer.js +147 -0
- package/dist/browser/content/chart-explorer.js.map +1 -0
- package/dist/browser/content/chart-inspection.js +447 -0
- package/dist/browser/content/chart-inspection.js.map +1 -0
- package/dist/browser/content/chart-line-gaps.js +53 -0
- package/dist/browser/content/chart-line-gaps.js.map +1 -0
- package/dist/browser/content/chart-map-viewport.js +5 -1
- package/dist/browser/content/chart-map-viewport.js.map +1 -1
- package/dist/browser/content/chart-snapshot.js +63 -0
- package/dist/browser/content/chart-snapshot.js.map +1 -0
- package/dist/browser/content/chart-state-timeline.js +32 -4
- package/dist/browser/content/chart-state-timeline.js.map +1 -1
- package/dist/browser/content/chart-svg.js +54 -0
- package/dist/browser/content/chart-svg.js.map +1 -0
- package/dist/browser/content/collection-selection.js +109 -0
- package/dist/browser/content/collection-selection.js.map +1 -0
- package/dist/browser/content/delimited-preferences.js +21 -0
- package/dist/browser/content/delimited-preferences.js.map +1 -0
- package/dist/browser/content/file-tree.js.map +1 -1
- package/dist/browser/content/file-view-preview.js +11 -7
- package/dist/browser/content/file-view-preview.js.map +1 -1
- package/dist/browser/content/index.js +9 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/feedback/InlineGuidance.js +17 -3
- package/dist/browser/feedback/InlineGuidance.js.map +1 -1
- package/dist/browser/feedback/dialog-core.js +81 -7
- package/dist/browser/feedback/dialog-core.js.map +1 -1
- package/dist/browser/feedback/prompts.js +6 -0
- package/dist/browser/feedback/prompts.js.map +1 -1
- package/dist/browser/feedback/toast.js +29 -6
- package/dist/browser/feedback/toast.js.map +1 -1
- package/dist/browser/inputs/SelectChip.js +3 -2
- package/dist/browser/inputs/SelectChip.js.map +1 -1
- package/dist/browser/inputs/TextInput.js +7 -1
- package/dist/browser/inputs/TextInput.js.map +1 -1
- package/dist/browser/inputs/markdown/MarkdownEditor.js +61 -37
- package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/browser/intl/Format.js +89 -16
- package/dist/browser/intl/Format.js.map +1 -1
- package/dist/browser/intl/index.js.map +1 -1
- package/dist/browser/intl/messages.js +130 -2
- package/dist/browser/intl/messages.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +712 -624
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/BottomSheet.js +95 -0
- package/dist/browser/layout/BottomSheet.js.map +1 -0
- package/dist/browser/layout/DetailPanel.js +56 -44
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/Navigation.js +278 -0
- package/dist/browser/layout/Navigation.js.map +1 -0
- package/dist/browser/layout/PanelDialog.js +219 -71
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/ScrollArea.js +21 -1
- package/dist/browser/layout/ScrollArea.js.map +1 -1
- package/dist/browser/layout/Settings.js.map +1 -1
- package/dist/browser/layout/SidebarItemPreview.js +183 -0
- package/dist/browser/layout/SidebarItemPreview.js.map +1 -0
- package/dist/browser/layout/app-workspace-controller.js +3 -0
- package/dist/browser/layout/app-workspace-controller.js.map +1 -1
- package/dist/browser/layout/index.js +3 -0
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/layout/navigation-model.js +23 -0
- package/dist/browser/layout/navigation-model.js.map +1 -0
- package/dist/browser/layout/scroll-fade.js +100 -0
- package/dist/browser/layout/scroll-fade.js.map +1 -0
- package/dist/browser/surfaces/DescriptionList.js.map +1 -1
- package/dist/browser/surfaces/StatusBadge.js +2 -1
- package/dist/browser/surfaces/StatusBadge.js.map +1 -1
- package/dist/fonts/ibm-plex-mono-cyrillic-400-italic-4aded3f2f2a7d27d.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-cyrillic-400-normal-7635422bd10ddbbc.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-cyrillic-500-normal-1d89462e86cb8e87.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-cyrillic-600-normal-2b05a8695c7f9f4a.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-italic-a0b3b8cbe5a516e7.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-cyrillic-ext-400-normal-f8c22ec1804bd696.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-cyrillic-ext-500-normal-3febe5c7f22e4b07.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-cyrillic-ext-600-normal-83109cdd4f8665b4.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-400-italic-0840095faae86403.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-400-normal-08949f728dc52d52.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-500-normal-01d285447409c8a5.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-600-normal-0d1f0b8d0722224e.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-ext-400-italic-1b07eee6df7d26b3.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-ext-400-normal-6bc0f226a5b7884a.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-ext-500-normal-6bb06407c97584b0.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-latin-ext-600-normal-32057cf50dd14bdb.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-vietnamese-400-italic-a6bab38af4f9c761.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-vietnamese-400-normal-62632b6375305e70.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-vietnamese-500-normal-781633d95de88040.woff2 +0 -0
- package/dist/fonts/ibm-plex-mono-vietnamese-600-normal-51b74d53e106ba8a.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-400-italic-e8731a7e2b00fc4f.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-400-normal-69afad88a0740b6e.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-500-normal-200be3a2a6b1789f.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-600-normal-730becc6f005c18c.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-700-normal-40540598b4c9eb2c.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-italic-4ffb25726a7ce4cc.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-ext-400-normal-e2580ad78906551e.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-ext-500-normal-08578d906af6d986.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-ext-600-normal-d60d3d0b182753d5.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-cyrillic-ext-700-normal-d07dd53642480097.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-greek-400-italic-1bc10b01688ba9fa.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-greek-400-normal-02296067bc904d2a.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-greek-500-normal-8cb6e20b4dbbaa5f.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-greek-600-normal-0a9ebd9019415ee9.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-greek-700-normal-c949641d10a3bebc.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-400-italic-6de912e531b6c980.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-400-normal-3b646991d30055a9.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-500-normal-0717336fb31fcdcd.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-600-normal-8960851d691c054e.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-700-normal-42e7b0c143c19df9.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-ext-400-italic-c5c00e8a32022dfe.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-ext-400-normal-c93d2a12aaa280f6.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-ext-500-normal-2846035d85100f84.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-ext-600-normal-b25dfd4f979e442a.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-latin-ext-700-normal-92f0392bd74fa395.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-vietnamese-400-italic-675d4bace127bffb.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-vietnamese-400-normal-771538f7f26551bd.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-vietnamese-500-normal-85ba3d9c2488a813.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-vietnamese-600-normal-5d34b803637befe3.woff2 +0 -0
- package/dist/fonts/ibm-plex-sans-vietnamese-700-normal-b79d0c4b68b85007.woff2 +0 -0
- package/dist/plex.css +1 -1
- package/dist/ssr/actions/Button.js +11 -2
- package/dist/ssr/actions/Button.js.map +1 -1
- package/dist/ssr/actions/Disclosure.js +2 -2
- package/dist/ssr/actions/Disclosure.js.map +1 -1
- package/dist/ssr/actions/Dropdown.js +4 -1
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/FilterChip.js +16 -2
- package/dist/ssr/actions/FilterChip.js.map +1 -1
- package/dist/ssr/actions/SplitButton.js +69 -22
- package/dist/ssr/actions/SplitButton.js.map +1 -1
- package/dist/ssr/actions/SpotlightSearch.js +3 -7
- package/dist/ssr/actions/SpotlightSearch.js.map +1 -1
- package/dist/ssr/actions/Tabs.js +58 -11
- package/dist/ssr/actions/Tabs.js.map +1 -1
- package/dist/ssr/actions/index.js +1 -1
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/chat/ChatComposer.js +366 -134
- package/dist/ssr/chat/ChatComposer.js.map +1 -1
- package/dist/ssr/chat/ChatContextPopup.js +86 -0
- package/dist/ssr/chat/ChatContextPopup.js.map +1 -0
- package/dist/ssr/chat/ChatPrimitives.js +49 -11
- package/dist/ssr/chat/ChatPrimitives.js.map +1 -1
- package/dist/ssr/chat/ChatTasks.js +48 -0
- package/dist/ssr/chat/ChatTasks.js.map +1 -0
- package/dist/ssr/chat/ChatTimeline.js +14 -4
- package/dist/ssr/chat/ChatTimeline.js.map +1 -1
- package/dist/ssr/chat/chat-behavior.js +0 -5
- package/dist/ssr/chat/chat-behavior.js.map +1 -1
- package/dist/ssr/chat/composer-document.js +55 -0
- package/dist/ssr/chat/composer-document.js.map +1 -0
- package/dist/ssr/chat/index.js +6 -1
- package/dist/ssr/chat/index.js.map +1 -1
- package/dist/ssr/chat/types.js.map +1 -1
- package/dist/ssr/content/Chart.js +121 -219
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartExplorer.js +257 -0
- package/dist/ssr/content/ChartExplorer.js.map +1 -0
- package/dist/ssr/content/ChartExplorerControls.js +105 -0
- package/dist/ssr/content/ChartExplorerControls.js.map +1 -0
- package/dist/ssr/content/ChartFilterControls.js +139 -0
- package/dist/ssr/content/ChartFilterControls.js.map +1 -0
- package/dist/ssr/content/ChartSnapshotView.js +57 -0
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -0
- package/dist/ssr/content/DataTable.js +13 -9
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/FileBrowser.js +3 -0
- package/dist/ssr/content/FileBrowser.js.map +1 -1
- package/dist/ssr/content/FileGrid.js +38 -0
- package/dist/ssr/content/FileGrid.js.map +1 -0
- package/dist/ssr/content/FileTree.js +2 -2
- package/dist/ssr/content/FileTree.js.map +1 -1
- package/dist/ssr/content/FileView.js +352 -75
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/MarkdownView.js +6 -0
- package/dist/ssr/content/MarkdownView.js.map +1 -1
- package/dist/ssr/content/PdfPreview.js +37 -24
- package/dist/ssr/content/PdfPreview.js.map +1 -1
- package/dist/ssr/content/chart-cursor.js +33 -0
- package/dist/ssr/content/chart-cursor.js.map +1 -0
- package/dist/ssr/content/chart-explorer.js +147 -0
- package/dist/ssr/content/chart-explorer.js.map +1 -0
- package/dist/ssr/content/chart-inspection.js +447 -0
- package/dist/ssr/content/chart-inspection.js.map +1 -0
- package/dist/ssr/content/chart-line-gaps.js +53 -0
- package/dist/ssr/content/chart-line-gaps.js.map +1 -0
- package/dist/ssr/content/chart-map-viewport.js +5 -1
- package/dist/ssr/content/chart-map-viewport.js.map +1 -1
- package/dist/ssr/content/chart-snapshot.js +63 -0
- package/dist/ssr/content/chart-snapshot.js.map +1 -0
- package/dist/ssr/content/chart-state-timeline.js +32 -4
- package/dist/ssr/content/chart-state-timeline.js.map +1 -1
- package/dist/ssr/content/chart-svg.js +54 -0
- package/dist/ssr/content/chart-svg.js.map +1 -0
- package/dist/ssr/content/collection-selection.js +109 -0
- package/dist/ssr/content/collection-selection.js.map +1 -0
- package/dist/ssr/content/delimited-preferences.js +21 -0
- package/dist/ssr/content/delimited-preferences.js.map +1 -0
- package/dist/ssr/content/file-tree.js.map +1 -1
- package/dist/ssr/content/file-view-preview.js +11 -7
- package/dist/ssr/content/file-view-preview.js.map +1 -1
- package/dist/ssr/content/index.js +9 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/feedback/InlineGuidance.js +17 -3
- package/dist/ssr/feedback/InlineGuidance.js.map +1 -1
- package/dist/ssr/feedback/dialog-core.js +81 -7
- package/dist/ssr/feedback/dialog-core.js.map +1 -1
- package/dist/ssr/feedback/prompts.js +6 -0
- package/dist/ssr/feedback/prompts.js.map +1 -1
- package/dist/ssr/feedback/toast.js +29 -6
- package/dist/ssr/feedback/toast.js.map +1 -1
- package/dist/ssr/inputs/SelectChip.js +3 -3
- package/dist/ssr/inputs/SelectChip.js.map +1 -1
- package/dist/ssr/inputs/TextInput.js.map +1 -1
- package/dist/ssr/inputs/markdown/MarkdownEditor.js +19 -11
- package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/ssr/intl/Format.js +61 -0
- package/dist/ssr/intl/Format.js.map +1 -1
- package/dist/ssr/intl/index.js.map +1 -1
- package/dist/ssr/intl/messages.js +130 -2
- package/dist/ssr/intl/messages.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +368 -275
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/BottomSheet.js +43 -0
- package/dist/ssr/layout/BottomSheet.js.map +1 -0
- package/dist/ssr/layout/DetailPanel.js +11 -4
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/Navigation.js +181 -0
- package/dist/ssr/layout/Navigation.js.map +1 -0
- package/dist/ssr/layout/PanelDialog.js +111 -26
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/ScrollArea.js +16 -1
- package/dist/ssr/layout/ScrollArea.js.map +1 -1
- package/dist/ssr/layout/Settings.js.map +1 -1
- package/dist/ssr/layout/SidebarItemPreview.js +133 -0
- package/dist/ssr/layout/SidebarItemPreview.js.map +1 -0
- package/dist/ssr/layout/app-workspace-controller.js +3 -0
- package/dist/ssr/layout/app-workspace-controller.js.map +1 -1
- package/dist/ssr/layout/index.js +3 -0
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/layout/navigation-model.js +23 -0
- package/dist/ssr/layout/navigation-model.js.map +1 -0
- package/dist/ssr/layout/scroll-fade.js +100 -0
- package/dist/ssr/layout/scroll-fade.js.map +1 -0
- package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
- package/dist/ssr/surfaces/StatusBadge.js +2 -1
- package/dist/ssr/surfaces/StatusBadge.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tabler.css +1 -1
- package/dist/types/actions/Button.d.ts +4 -0
- package/dist/types/actions/Disclosure.d.ts +1 -0
- package/dist/types/actions/FilterChip.d.ts +4 -0
- package/dist/types/actions/SplitButton.d.ts +6 -0
- package/dist/types/actions/SpotlightSearch.d.ts +0 -4
- package/dist/types/actions/Tabs.d.ts +4 -0
- package/dist/types/actions/index.d.ts +1 -1
- package/dist/types/chat/ChatComposer.d.ts +20 -2
- package/dist/types/chat/ChatContextPopup.d.ts +6 -0
- package/dist/types/chat/ChatPrimitives.d.ts +4 -0
- package/dist/types/chat/ChatTasks.d.ts +15 -0
- package/dist/types/chat/ChatTimeline.d.ts +2 -0
- package/dist/types/chat/chat-behavior.d.ts +0 -3
- package/dist/types/chat/composer-document.d.ts +14 -0
- package/dist/types/chat/index.d.ts +8 -1
- package/dist/types/chat/types.d.ts +7 -0
- package/dist/types/content/Chart.d.ts +42 -23
- package/dist/types/content/ChartExplorer.d.ts +34 -0
- package/dist/types/content/ChartExplorerControls.d.ts +10 -0
- package/dist/types/content/ChartFilterControls.d.ts +21 -0
- package/dist/types/content/ChartSnapshotView.d.ts +11 -0
- package/dist/types/content/DataTable.d.ts +4 -0
- package/dist/types/content/FileBrowser.d.ts +1 -0
- package/dist/types/content/FileGrid.d.ts +21 -0
- package/dist/types/content/FileView.d.ts +20 -0
- package/dist/types/content/PdfPreview.d.ts +8 -1
- package/dist/types/content/chart-cursor.d.ts +15 -0
- package/dist/types/content/chart-explorer.d.ts +48 -0
- package/dist/types/content/chart-inspection.d.ts +40 -0
- package/dist/types/content/chart-line-gaps.d.ts +5 -0
- package/dist/types/content/chart-map-viewport.d.ts +1 -1
- package/dist/types/content/chart-snapshot.d.ts +26 -0
- package/dist/types/content/chart-svg.d.ts +21 -0
- package/dist/types/content/collection-selection.d.ts +24 -0
- package/dist/types/content/delimited-preferences.d.ts +11 -0
- package/dist/types/content/file-tree.d.ts +2 -0
- package/dist/types/content/file-view-preview.d.ts +4 -1
- package/dist/types/content/index.d.ts +15 -1
- package/dist/types/feedback/InlineGuidance.d.ts +1 -0
- package/dist/types/feedback/dialog-core.d.ts +11 -0
- package/dist/types/feedback/prompts.d.ts +2 -0
- package/dist/types/feedback/toast.d.ts +7 -1
- package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -1
- package/dist/types/intl/Format.d.ts +9 -0
- package/dist/types/intl/index.d.ts +1 -1
- package/dist/types/intl/messages.d.ts +31 -1
- package/dist/types/layout/AppWorkspace.d.ts +35 -18
- package/dist/types/layout/BottomSheet.d.ts +23 -0
- package/dist/types/layout/DetailPanel.d.ts +1 -0
- package/dist/types/layout/Navigation.d.ts +8 -0
- package/dist/types/layout/PanelDialog.d.ts +14 -1
- package/dist/types/layout/ScrollArea.d.ts +4 -0
- package/dist/types/layout/Settings.d.ts +1 -1
- package/dist/types/layout/SidebarItemPreview.d.ts +11 -0
- package/dist/types/layout/index.d.ts +4 -1
- package/dist/types/layout/navigation-model.d.ts +48 -0
- package/dist/types/layout/scroll-fade.d.ts +3 -0
- package/dist/types/surfaces/DescriptionList.d.ts +1 -1
- package/dist/types/surfaces/StatusBadge.d.ts +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { batch, createEffect, createSignal, onCleanup } from "solid-js";
|
|
2
|
+
/** One selection and focus model shared by alternate presentations of a collection. */
|
|
3
|
+
export function createCollectionSelection(options) {
|
|
4
|
+
const [selected, setSelected] = createSignal(new Set(options.initial ?? []));
|
|
5
|
+
const [focused, setFocused] = createSignal(options.initial?.[0] ?? null);
|
|
6
|
+
let anchor = options.initial?.[0] ?? null;
|
|
7
|
+
const elements = new Map();
|
|
8
|
+
const replace = ids => {
|
|
9
|
+
const allowed = new Set(options.ids());
|
|
10
|
+
const next = new Set(ids.filter(id => allowed.has(id)));
|
|
11
|
+
if (next.size === selected().size && [...next].every(id => selected().has(id))) return;
|
|
12
|
+
setSelected(next);
|
|
13
|
+
options.onChange?.([...next]);
|
|
14
|
+
};
|
|
15
|
+
createEffect(() => {
|
|
16
|
+
const ids = options.ids();
|
|
17
|
+
replace([...selected()]);
|
|
18
|
+
if (!focused() || !ids.includes(focused())) setFocused(ids[0] ?? null);
|
|
19
|
+
if (anchor && !ids.includes(anchor)) anchor = null;
|
|
20
|
+
});
|
|
21
|
+
const toggle = id => {
|
|
22
|
+
const next = new Set(selected());
|
|
23
|
+
next.has(id) ? next.delete(id) : next.add(id);
|
|
24
|
+
batch(() => {
|
|
25
|
+
setFocused(id);
|
|
26
|
+
replace([...next]);
|
|
27
|
+
});
|
|
28
|
+
anchor = id;
|
|
29
|
+
};
|
|
30
|
+
const select = (id, modifiers = {}) => {
|
|
31
|
+
if (!options.ids().includes(id)) return;
|
|
32
|
+
batch(() => {
|
|
33
|
+
setFocused(id);
|
|
34
|
+
if (modifiers.shiftKey && anchor) {
|
|
35
|
+
const ids = options.ids();
|
|
36
|
+
const from = ids.indexOf(anchor);
|
|
37
|
+
const to = ids.indexOf(id);
|
|
38
|
+
const range = ids.slice(Math.min(from, to), Math.max(from, to) + 1);
|
|
39
|
+
replace(modifiers.ctrlKey || modifiers.metaKey ? [...selected(), ...range] : range);
|
|
40
|
+
} else if (modifiers.ctrlKey || modifiers.metaKey) toggle(id);else {
|
|
41
|
+
anchor = id;
|
|
42
|
+
replace([id]);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
const focus = id => {
|
|
47
|
+
setFocused(id);
|
|
48
|
+
elements.get(id)?.focus({
|
|
49
|
+
preventScroll: true
|
|
50
|
+
});
|
|
51
|
+
elements.get(id)?.scrollIntoView?.({
|
|
52
|
+
block: "nearest",
|
|
53
|
+
inline: "nearest"
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
const keyDown = (event, id, columns = 1) => {
|
|
57
|
+
const ids = options.ids();
|
|
58
|
+
const index = ids.indexOf(id);
|
|
59
|
+
let next;
|
|
60
|
+
if (event.key === "ArrowDown") next = index + columns;
|
|
61
|
+
if (event.key === "ArrowUp") next = index - columns;
|
|
62
|
+
if (columns > 1 && event.key === "ArrowRight") next = index + 1;
|
|
63
|
+
if (columns > 1 && event.key === "ArrowLeft") next = index - 1;
|
|
64
|
+
if (event.key === "Home") next = 0;
|
|
65
|
+
if (event.key === "End") next = ids.length - 1;
|
|
66
|
+
if (next !== undefined && ids.length) {
|
|
67
|
+
event.preventDefault();
|
|
68
|
+
const target = ids[Math.max(0, Math.min(next, ids.length - 1))];
|
|
69
|
+
if (event.shiftKey || !event.ctrlKey && !event.metaKey) select(target, event);
|
|
70
|
+
focus(target);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
if (event.key === " ") {
|
|
74
|
+
event.preventDefault();
|
|
75
|
+
toggle(id);
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === "a") {
|
|
79
|
+
event.preventDefault();
|
|
80
|
+
replace(ids);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
if (event.key === "Escape") {
|
|
84
|
+
event.preventDefault();
|
|
85
|
+
replace([]);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
return false;
|
|
89
|
+
};
|
|
90
|
+
return {
|
|
91
|
+
selected,
|
|
92
|
+
focused,
|
|
93
|
+
select,
|
|
94
|
+
toggle,
|
|
95
|
+
replace,
|
|
96
|
+
focus,
|
|
97
|
+
keyDown,
|
|
98
|
+
clear: () => replace([]),
|
|
99
|
+
all: () => replace(options.ids()),
|
|
100
|
+
markFocused: id => setFocused(id),
|
|
101
|
+
register: (id, element) => {
|
|
102
|
+
elements.set(id, element);
|
|
103
|
+
onCleanup(() => {
|
|
104
|
+
if (elements.get(id) === element) elements.delete(id);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=collection-selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["batch","createEffect","createSignal","onCleanup","createCollectionSelection","options","selected","setSelected","Set","initial","focused","setFocused","anchor","elements","Map","replace","ids","allowed","next","filter","id","has","size","every","onChange","includes","toggle","delete","add","select","modifiers","shiftKey","from","indexOf","to","range","slice","Math","min","max","ctrlKey","metaKey","focus","get","preventScroll","scrollIntoView","block","inline","keyDown","event","columns","index","key","length","undefined","preventDefault","target","toLowerCase","clear","all","markFocused","register","element","set"],"sources":["content/collection-selection.ts"],"sourcesContent":["import { batch, createEffect, createSignal, onCleanup } from \"solid-js\";\n\nexport type SelectionModifiers = { shiftKey?: boolean; ctrlKey?: boolean; metaKey?: boolean };\nexport type CollectionSelection = ReturnType<typeof createCollectionSelection>;\n\n/** One selection and focus model shared by alternate presentations of a collection. */\nexport function createCollectionSelection(options: {\n ids: () => readonly string[];\n initial?: readonly string[];\n onChange?: (ids: readonly string[]) => void;\n}) {\n const [selected, setSelected] = createSignal<ReadonlySet<string>>(new Set(options.initial ?? []));\n const [focused, setFocused] = createSignal<string | null>(options.initial?.[0] ?? null);\n let anchor: string | null = options.initial?.[0] ?? null;\n const elements = new Map<string, HTMLElement>();\n const replace = (ids: readonly string[]) => {\n const allowed = new Set(options.ids());\n const next = new Set(ids.filter((id) => allowed.has(id)));\n if (next.size === selected().size && [...next].every((id) => selected().has(id))) return;\n setSelected(next);\n options.onChange?.([...next]);\n };\n createEffect(() => {\n const ids = options.ids();\n replace([...selected()]);\n if (!focused() || !ids.includes(focused()!)) setFocused(ids[0] ?? null);\n if (anchor && !ids.includes(anchor)) anchor = null;\n });\n const toggle = (id: string) => {\n const next = new Set(selected());\n next.has(id) ? next.delete(id) : next.add(id);\n batch(() => {\n setFocused(id);\n replace([...next]);\n });\n anchor = id;\n };\n const select = (id: string, modifiers: SelectionModifiers = {}) => {\n if (!options.ids().includes(id)) return;\n batch(() => {\n setFocused(id);\n if (modifiers.shiftKey && anchor) {\n const ids = options.ids();\n const from = ids.indexOf(anchor);\n const to = ids.indexOf(id);\n const range = ids.slice(Math.min(from, to), Math.max(from, to) + 1);\n replace(modifiers.ctrlKey || modifiers.metaKey ? [...selected(), ...range] : range);\n } else if (modifiers.ctrlKey || modifiers.metaKey) toggle(id);\n else {\n anchor = id;\n replace([id]);\n }\n });\n };\n const focus = (id: string) => {\n setFocused(id);\n elements.get(id)?.focus({ preventScroll: true });\n elements.get(id)?.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\" });\n };\n const keyDown = (event: KeyboardEvent, id: string, columns = 1) => {\n const ids = options.ids();\n const index = ids.indexOf(id);\n let next: number | undefined;\n if (event.key === \"ArrowDown\") next = index + columns;\n if (event.key === \"ArrowUp\") next = index - columns;\n if (columns > 1 && event.key === \"ArrowRight\") next = index + 1;\n if (columns > 1 && event.key === \"ArrowLeft\") next = index - 1;\n if (event.key === \"Home\") next = 0;\n if (event.key === \"End\") next = ids.length - 1;\n if (next !== undefined && ids.length) {\n event.preventDefault();\n const target = ids[Math.max(0, Math.min(next, ids.length - 1))]!;\n if (event.shiftKey || (!event.ctrlKey && !event.metaKey)) select(target, event);\n focus(target);\n return true;\n }\n if (event.key === \" \") {\n event.preventDefault();\n toggle(id);\n return true;\n }\n if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === \"a\") {\n event.preventDefault();\n replace(ids);\n return true;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n replace([]);\n return true;\n }\n return false;\n };\n return {\n selected,\n focused,\n select,\n toggle,\n replace,\n focus,\n keyDown,\n clear: () => replace([]),\n all: () => replace(options.ids()),\n markFocused: (id: string) => setFocused(id),\n register: (id: string, element: HTMLElement) => {\n elements.set(id, element);\n onCleanup(() => {\n if (elements.get(id) === element) elements.delete(id);\n });\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Persist presentation choices only, never file contents. Ignore stale or corrupt storage. */
|
|
2
|
+
export const readDelimitedPreferences = stored => {
|
|
3
|
+
const defaults = {
|
|
4
|
+
encoding: "utf-8",
|
|
5
|
+
delimiter: "auto",
|
|
6
|
+
view: "table"
|
|
7
|
+
};
|
|
8
|
+
try {
|
|
9
|
+
const value = JSON.parse(stored ?? "null");
|
|
10
|
+
if (!value || typeof value !== "object") return defaults;
|
|
11
|
+
return {
|
|
12
|
+
encoding: "encoding" in value && typeof value.encoding === "string" && ["utf-8", "windows-1252", "utf-16le", "utf-16be"].includes(value.encoding) ? value.encoding : defaults.encoding,
|
|
13
|
+
delimiter: "delimiter" in value && typeof value.delimiter === "string" && ["auto", ",", ";", "\t", "|"].includes(value.delimiter) ? value.delimiter : defaults.delimiter,
|
|
14
|
+
view: "view" in value && value.view === "raw" ? "raw" : "table"
|
|
15
|
+
};
|
|
16
|
+
} catch {
|
|
17
|
+
return defaults;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
export const decodeDelimitedContent = (content, encoding) => content.encoding === "utf8" ? content.content : new TextDecoder(encoding).decode(Uint8Array.from(atob(content.content), char => char.charCodeAt(0)));
|
|
21
|
+
//# sourceMappingURL=delimited-preferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["readDelimitedPreferences","stored","defaults","encoding","delimiter","view","value","JSON","parse","includes","decodeDelimitedContent","content","TextDecoder","decode","Uint8Array","from","atob","char","charCodeAt"],"sources":["content/delimited-preferences.ts"],"sourcesContent":["export type DelimitedPreferences = { encoding: string; delimiter: string; view: \"table\" | \"raw\" };\n\n/** Persist presentation choices only, never file contents. Ignore stale or corrupt storage. */\nexport const readDelimitedPreferences = (stored: string | null): DelimitedPreferences => {\n const defaults: DelimitedPreferences = { encoding: \"utf-8\", delimiter: \"auto\", view: \"table\" };\n try {\n const value: unknown = JSON.parse(stored ?? \"null\");\n if (!value || typeof value !== \"object\") return defaults;\n return {\n encoding:\n \"encoding\" in value &&\n typeof value.encoding === \"string\" &&\n [\"utf-8\", \"windows-1252\", \"utf-16le\", \"utf-16be\"].includes(value.encoding)\n ? value.encoding\n : defaults.encoding,\n delimiter:\n \"delimiter\" in value && typeof value.delimiter === \"string\" && [\"auto\", \",\", \";\", \"\\t\", \"|\"].includes(value.delimiter)\n ? value.delimiter\n : defaults.delimiter,\n view: \"view\" in value && value.view === \"raw\" ? \"raw\" : \"table\",\n };\n } catch {\n return defaults;\n }\n};\n\nexport const decodeDelimitedContent = (content: { encoding: \"utf8\" | \"base64\"; content: string }, encoding: string): string =>\n content.encoding === \"utf8\"\n ? content.content\n : new TextDecoder(encoding).decode(Uint8Array.from(atob(content.content), (char) => char.charCodeAt(0)));\n"],"mappings":"AAEA;AACA,OAAO,MAAMA,wBAAwB,GAAIC,MAAqB,IAA2B;EACvF,MAAMC,QAA8B,GAAG;IAAEC,QAAQ,EAAE,OAAO;IAAEC,SAAS,EAAE,MAAM;IAAEC,IAAI,EAAE;EAAQ,CAAC;EAC9F,IAAI;IACF,MAAMC,KAAc,GAAGC,IAAI,CAACC,KAAK,CAACP,MAAM,IAAI,MAAM,CAAC;IACnD,IAAI,CAACK,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAOJ,QAAQ;IACxD,OAAO;MACLC,QAAQ,EACN,UAAU,IAAIG,KAAK,IACnB,OAAOA,KAAK,CAACH,QAAQ,KAAK,QAAQ,IAClC,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC,CAACM,QAAQ,CAACH,KAAK,CAACH,QAAQ,CAAC,GACtEG,KAAK,CAACH,QAAQ,GACdD,QAAQ,CAACC,QAAQ;MACvBC,SAAS,EACP,WAAW,IAAIE,KAAK,IAAI,OAAOA,KAAK,CAACF,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAACK,QAAQ,CAACH,KAAK,CAACF,SAAS,CAAC,GAClHE,KAAK,CAACF,SAAS,GACfF,QAAQ,CAACE,SAAS;MACxBC,IAAI,EAAE,MAAM,IAAIC,KAAK,IAAIA,KAAK,CAACD,IAAI,KAAK,KAAK,GAAG,KAAK,GAAG;IAC1D,CAAC;EACH,CAAC,CAAC,MAAM;IACN,OAAOH,QAAQ;EACjB;AACF,CAAC;AAED,OAAO,MAAMQ,sBAAsB,GAAGA,CAACC,OAAyD,EAAER,QAAgB,KAChHQ,OAAO,CAACR,QAAQ,KAAK,MAAM,GACvBQ,OAAO,CAACA,OAAO,GACf,IAAIC,WAAW,CAACT,QAAQ,CAAC,CAACU,MAAM,CAACC,UAAU,CAACC,IAAI,CAACC,IAAI,CAACL,OAAO,CAACA,OAAO,CAAC,EAAGM,IAAI,IAAKA,IAAI,CAACC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["parentOf","path","index","lastIndexOf","slice","nameOf","nodesByPath","nodes","result","Map","visit","node","set","entry","child","children","buildTree","entries","previous","byPath","previousByPath","folders","Set","files","filter","kind","map","dir","has","Error","add","childrenByParent","keys","parent","get","push","nodeFor","depth","isFolder","old","name","childrenOf","sort","a","b","localeCompare","flattenVisible","expanded","flatMap","allFolderPaths"],"sources":["content/file-tree.ts"],"sourcesContent":["/**\n * Tree shaping for FileTree — flat paths in, sorted nodes out.\n *\n * Kept beside the component rather than inside it because it is pure: no JSX,\n * no reactivity, nothing that needs a DOM. That is also what makes it testable\n * — a test importing the .tsx pulls the whole component through Bun's JSX\n * transform, which resolves against the root tsconfig and lands on the React\n * runtime. Same reason `file-view-preview.ts` sits next to FileView.\n */\n\nexport type FileTreeEntry = {\n /** Canonical identity, e.g. \"/input/report.csv\". */\n path: string;\n /** Folders are usually implicit from paths — explicit entries model empty dirs. */\n kind?: \"file\" | \"folder\";\n size?: number;\n mediaType?: string;\n updatedAt?: string;\n /** Icon override (tabler class without \"ti \" prefix); default derives from the name. */\n icon?: string;\n /** Small trailing badge, e.g. \"ro\" on read-only mounts. */\n badge?: string;\n};\n\nexport type TreeNode = {\n entry: FileTreeEntry;\n name: string;\n depth: number;\n isFolder: boolean;\n children: TreeNode[];\n};\n\n/** Containing directory of a path; \"/\" for top-level entries. */\nexport const parentOf = (path: string): string => {\n const index = path.lastIndexOf(\"/\");\n return index <= 0 ? \"/\" : path.slice(0, index);\n};\n\nconst nameOf = (path: string): string => path.slice(path.lastIndexOf(\"/\") + 1) || path;\n\nconst nodesByPath = (nodes: TreeNode[]): Map<string, TreeNode> => {\n const result = new Map<string, TreeNode>();\n const visit = (node: TreeNode) => {\n result.set(node.entry.path, node);\n for (const child of node.children) visit(child);\n };\n for (const node of nodes) visit(node);\n return result;\n};\n\n/**\n * Flat paths → sorted tree (folders first, then files, both alphabetical).\n *\n * Passing the previous tree preserves object identity by path while updating\n * the cached node in place. Solid's keyed `<For>` can then keep rows, rename\n * inputs, and focus alive even when a refetch changes metadata.\n */\nexport const buildTree = (entries: FileTreeEntry[], previous: TreeNode[] = []): TreeNode[] => {\n const byPath = new Map<string, FileTreeEntry>();\n const previousByPath = nodesByPath(previous);\n const folders = new Set<string>();\n const files = new Set(entries.filter((entry) => entry.kind !== \"folder\").map((entry) => entry.path));\n for (const entry of entries) {\n for (let dir = parentOf(entry.path); dir !== \"/\"; dir = parentOf(dir)) {\n if (files.has(dir)) {\n throw new Error(`FileTree entry conflict: \"${dir}\" is a file and cannot contain \"${entry.path}\".`);\n }\n }\n }\n for (const entry of entries) {\n byPath.set(entry.path, entry);\n if (entry.kind === \"folder\") folders.add(entry.path);\n // Register all ancestor folders of every entry.\n for (let dir = parentOf(entry.path); dir !== \"/\"; dir = parentOf(dir)) folders.add(dir);\n }\n const childrenByParent = new Map<string, string[]>();\n for (const path of new Set([...byPath.keys(), ...folders])) {\n if (path === \"/\") continue;\n const parent = parentOf(path);\n const children = childrenByParent.get(parent);\n if (children) children.push(path);\n else childrenByParent.set(parent, [path]);\n }\n\n const nodeFor = (path: string, depth: number): TreeNode => {\n const entry = byPath.get(path) ?? { path, kind: \"folder\" as const };\n const isFolder = folders.has(path);\n const old = previousByPath.get(path);\n if (old) {\n old.entry = entry;\n old.name = nameOf(path);\n old.depth = depth;\n old.isFolder = isFolder;\n return old;\n }\n return { entry, name: nameOf(path), depth, isFolder, children: [] };\n };\n\n const childrenOf = (dir: string, depth: number): TreeNode[] => {\n const nodes = (childrenByParent.get(dir) ?? []).map((path) => {\n const node = nodeFor(path, depth);\n if (node.isFolder) node.children = childrenOf(node.entry.path, depth + 1);\n return node;\n });\n return nodes.sort((a, b) => (a.isFolder === b.isFolder ? a.name.localeCompare(b.name) : a.isFolder ? -1 : 1));\n };\n\n return childrenOf(\"/\", 0);\n};\n\nexport const flattenVisible = (nodes: TreeNode[], expanded: Set<string>): TreeNode[] =>\n nodes.flatMap((node) => [node, ...(node.isFolder && expanded.has(node.entry.path) ? flattenVisible(node.children, expanded) : [])]);\n\nexport const allFolderPaths = (nodes: TreeNode[]): string[] =>\n nodes.flatMap((node) => (node.isFolder ? [node.entry.path, ...allFolderPaths(node.children)] : []));\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;
|
|
1
|
+
{"version":3,"names":["parentOf","path","index","lastIndexOf","slice","nameOf","nodesByPath","nodes","result","Map","visit","node","set","entry","child","children","buildTree","entries","previous","byPath","previousByPath","folders","Set","files","filter","kind","map","dir","has","Error","add","childrenByParent","keys","parent","get","push","nodeFor","depth","isFolder","old","name","childrenOf","sort","a","b","localeCompare","flattenVisible","expanded","flatMap","allFolderPaths"],"sources":["content/file-tree.ts"],"sourcesContent":["/**\n * Tree shaping for FileTree — flat paths in, sorted nodes out.\n *\n * Kept beside the component rather than inside it because it is pure: no JSX,\n * no reactivity, nothing that needs a DOM. That is also what makes it testable\n * — a test importing the .tsx pulls the whole component through Bun's JSX\n * transform, which resolves against the root tsconfig and lands on the React\n * runtime. Same reason `file-view-preview.ts` sits next to FileView.\n */\n\nexport type FileTreeEntry = {\n /** Canonical identity, e.g. \"/input/report.csv\". */\n path: string;\n /** Optional presentation label; path remains the identity and rename target. */\n displayName?: string;\n /** Folders are usually implicit from paths — explicit entries model empty dirs. */\n kind?: \"file\" | \"folder\";\n size?: number;\n mediaType?: string;\n updatedAt?: string;\n /** Icon override (tabler class without \"ti \" prefix); default derives from the name. */\n icon?: string;\n /** Small trailing badge, e.g. \"ro\" on read-only mounts. */\n badge?: string;\n};\n\nexport type TreeNode = {\n entry: FileTreeEntry;\n name: string;\n depth: number;\n isFolder: boolean;\n children: TreeNode[];\n};\n\n/** Containing directory of a path; \"/\" for top-level entries. */\nexport const parentOf = (path: string): string => {\n const index = path.lastIndexOf(\"/\");\n return index <= 0 ? \"/\" : path.slice(0, index);\n};\n\nconst nameOf = (path: string): string => path.slice(path.lastIndexOf(\"/\") + 1) || path;\n\nconst nodesByPath = (nodes: TreeNode[]): Map<string, TreeNode> => {\n const result = new Map<string, TreeNode>();\n const visit = (node: TreeNode) => {\n result.set(node.entry.path, node);\n for (const child of node.children) visit(child);\n };\n for (const node of nodes) visit(node);\n return result;\n};\n\n/**\n * Flat paths → sorted tree (folders first, then files, both alphabetical).\n *\n * Passing the previous tree preserves object identity by path while updating\n * the cached node in place. Solid's keyed `<For>` can then keep rows, rename\n * inputs, and focus alive even when a refetch changes metadata.\n */\nexport const buildTree = (entries: FileTreeEntry[], previous: TreeNode[] = []): TreeNode[] => {\n const byPath = new Map<string, FileTreeEntry>();\n const previousByPath = nodesByPath(previous);\n const folders = new Set<string>();\n const files = new Set(entries.filter((entry) => entry.kind !== \"folder\").map((entry) => entry.path));\n for (const entry of entries) {\n for (let dir = parentOf(entry.path); dir !== \"/\"; dir = parentOf(dir)) {\n if (files.has(dir)) {\n throw new Error(`FileTree entry conflict: \"${dir}\" is a file and cannot contain \"${entry.path}\".`);\n }\n }\n }\n for (const entry of entries) {\n byPath.set(entry.path, entry);\n if (entry.kind === \"folder\") folders.add(entry.path);\n // Register all ancestor folders of every entry.\n for (let dir = parentOf(entry.path); dir !== \"/\"; dir = parentOf(dir)) folders.add(dir);\n }\n const childrenByParent = new Map<string, string[]>();\n for (const path of new Set([...byPath.keys(), ...folders])) {\n if (path === \"/\") continue;\n const parent = parentOf(path);\n const children = childrenByParent.get(parent);\n if (children) children.push(path);\n else childrenByParent.set(parent, [path]);\n }\n\n const nodeFor = (path: string, depth: number): TreeNode => {\n const entry = byPath.get(path) ?? { path, kind: \"folder\" as const };\n const isFolder = folders.has(path);\n const old = previousByPath.get(path);\n if (old) {\n old.entry = entry;\n old.name = nameOf(path);\n old.depth = depth;\n old.isFolder = isFolder;\n return old;\n }\n return { entry, name: nameOf(path), depth, isFolder, children: [] };\n };\n\n const childrenOf = (dir: string, depth: number): TreeNode[] => {\n const nodes = (childrenByParent.get(dir) ?? []).map((path) => {\n const node = nodeFor(path, depth);\n if (node.isFolder) node.children = childrenOf(node.entry.path, depth + 1);\n return node;\n });\n return nodes.sort((a, b) => (a.isFolder === b.isFolder ? a.name.localeCompare(b.name) : a.isFolder ? -1 : 1));\n };\n\n return childrenOf(\"/\", 0);\n};\n\nexport const flattenVisible = (nodes: TreeNode[], expanded: Set<string>): TreeNode[] =>\n nodes.flatMap((node) => [node, ...(node.isFolder && expanded.has(node.entry.path) ? flattenVisible(node.children, expanded) : [])]);\n\nexport const allFolderPaths = (nodes: TreeNode[]): string[] =>\n nodes.flatMap((node) => (node.isFolder ? [node.entry.path, ...allFolderPaths(node.children)] : []));\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -67,12 +67,18 @@ export const parseDelimitedText = (input, delimiter, limits = {}) => {
|
|
|
67
67
|
let field = "";
|
|
68
68
|
let quoted = false;
|
|
69
69
|
let truncated = false;
|
|
70
|
+
let totalRows = 0;
|
|
71
|
+
let columnsTruncated = false;
|
|
70
72
|
const pushField = () => {
|
|
71
|
-
if (row.length < maxColumns) row.push(field);else
|
|
73
|
+
if (row.length < maxColumns) row.push(field);else {
|
|
74
|
+
truncated = true;
|
|
75
|
+
columnsTruncated = true;
|
|
76
|
+
}
|
|
72
77
|
field = "";
|
|
73
78
|
};
|
|
74
79
|
const pushRow = () => {
|
|
75
|
-
if (rows.length < maxRows) rows.push(row);else truncated = true;
|
|
80
|
+
if (rows.length < maxRows && (totalRows === 0 || totalRows > (limits.offset ?? 0))) rows.push(row);else truncated = true;
|
|
81
|
+
totalRows++;
|
|
76
82
|
row = [];
|
|
77
83
|
};
|
|
78
84
|
for (let index = 0; index < input.length; index += 1) {
|
|
@@ -92,10 +98,6 @@ export const parseDelimitedText = (input, delimiter, limits = {}) => {
|
|
|
92
98
|
pushField();
|
|
93
99
|
pushRow();
|
|
94
100
|
if (character === "\r" && input[index + 1] === "\n") index += 1;
|
|
95
|
-
if (rows.length >= maxRows && index < input.length - 1) {
|
|
96
|
-
truncated = true;
|
|
97
|
-
break;
|
|
98
|
-
}
|
|
99
101
|
} else {
|
|
100
102
|
field += character;
|
|
101
103
|
}
|
|
@@ -106,7 +108,9 @@ export const parseDelimitedText = (input, delimiter, limits = {}) => {
|
|
|
106
108
|
}
|
|
107
109
|
return {
|
|
108
110
|
rows,
|
|
109
|
-
truncated
|
|
111
|
+
truncated,
|
|
112
|
+
totalRows,
|
|
113
|
+
columnsTruncated
|
|
110
114
|
};
|
|
111
115
|
};
|
|
112
116
|
//# sourceMappingURL=file-view-preview.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MEBIBYTE","maxPreviewBytes","markdown","image","pdf","json","audio","video","text","imageMediaTypes","Set","audioMediaTypes","videoMediaTypes","markdownExtensions","imageExtensions","audioExtensions","videoExtensions","textExtensions","fileViewExtension","path","cleanPath","split","name","slice","lastIndexOf","dot","toLowerCase","normalizedMediaType","mediaType","trim","previewKindByType","file","extension","has","endsWith","startsWith","getFileViewPreviewKind","kind","size","undefined","Number","isFinite","canPreviewFile","parseDelimitedText","input","delimiter","limits","maxRows","Math","max","rows","maxColumns","columns","row","field","quoted","truncated","pushField","length","push","pushRow","index","character"],"sources":["content/file-view-preview.ts"],"sourcesContent":["export type FileViewFile = {\n path: string;\n mediaType?: string;\n size?: number;\n};\n\nexport type FileViewPreviewKind = \"markdown\" | \"image\" | \"pdf\" | \"json\" | \"delimited-text\" | \"audio\" | \"video\" | \"text\";\n\nconst MEBIBYTE = 1024 * 1024;\n\nconst maxPreviewBytes: Record<FileViewPreviewKind, number> = {\n markdown: 2 * MEBIBYTE,\n image: 25 * MEBIBYTE,\n pdf: 50 * MEBIBYTE,\n json: 2 * MEBIBYTE,\n \"delimited-text\": 2 * MEBIBYTE,\n audio: 50 * MEBIBYTE,\n video: 50 * MEBIBYTE,\n text: 2 * MEBIBYTE,\n};\n\n// SVG remains inert because FileView renders every image through <img>; never inject its markup into the DOM.\nconst imageMediaTypes = new Set([\n \"image/avif\",\n \"image/bmp\",\n \"image/gif\",\n \"image/jpeg\",\n \"image/png\",\n \"image/svg+xml\",\n \"image/webp\",\n \"image/x-icon\",\n]);\nconst audioMediaTypes = new Set([\n \"audio/aac\",\n \"audio/flac\",\n \"audio/mp4\",\n \"audio/mpeg\",\n \"audio/ogg\",\n \"audio/wav\",\n \"audio/webm\",\n \"audio/x-wav\",\n]);\nconst videoMediaTypes = new Set([\"video/mp4\", \"video/ogg\", \"video/webm\"]);\n\nconst markdownExtensions = new Set([\"md\", \"markdown\"]);\nconst imageExtensions = new Set([\"avif\", \"bmp\", \"gif\", \"ico\", \"jpeg\", \"jpg\", \"png\", \"svg\", \"webp\"]);\nconst audioExtensions = new Set([\"aac\", \"flac\", \"m4a\", \"mp3\", \"oga\", \"ogg\", \"wav\", \"weba\"]);\nconst videoExtensions = new Set([\"m4v\", \"mp4\", \"ogv\", \"webm\"]);\nconst textExtensions = new Set([\n \"c\",\n \"conf\",\n \"cpp\",\n \"css\",\n \"env\",\n \"go\",\n \"h\",\n \"html\",\n \"ini\",\n \"java\",\n \"js\",\n \"jsx\",\n \"log\",\n \"mjs\",\n \"php\",\n \"py\",\n \"rb\",\n \"rs\",\n \"sh\",\n \"sql\",\n \"toml\",\n \"ts\",\n \"tsx\",\n \"txt\",\n \"xml\",\n \"yaml\",\n \"yml\",\n]);\n\nexport const fileViewExtension = (path: string): string => {\n const cleanPath = path.split(/[?#]/, 1)[0] ?? path;\n const name = cleanPath.slice(cleanPath.lastIndexOf(\"/\") + 1);\n const dot = name.lastIndexOf(\".\");\n return dot > 0 ? name.slice(dot + 1).toLowerCase() : \"\";\n};\n\nconst normalizedMediaType = (mediaType?: string): string => mediaType?.split(\";\", 1)[0]?.trim().toLowerCase() ?? \"\";\n\nconst previewKindByType = (file: FileViewFile): FileViewPreviewKind | null => {\n const extension = fileViewExtension(file.path);\n const mediaType = normalizedMediaType(file.mediaType);\n\n if (mediaType === \"text/markdown\" || markdownExtensions.has(extension)) return \"markdown\";\n if (mediaType === \"application/json\" || mediaType.endsWith(\"+json\") || extension === \"json\") return \"json\";\n if (mediaType === \"text/csv\" || mediaType === \"text/tab-separated-values\" || extension === \"csv\" || extension === \"tsv\") {\n return \"delimited-text\";\n }\n if (mediaType === \"application/pdf\" || extension === \"pdf\") return \"pdf\";\n if (imageMediaTypes.has(mediaType) || imageExtensions.has(extension)) return \"image\";\n if (audioMediaTypes.has(mediaType) || audioExtensions.has(extension)) return \"audio\";\n if (videoMediaTypes.has(mediaType) || videoExtensions.has(extension)) return \"video\";\n if (\n mediaType.startsWith(\"text/\") ||\n mediaType === \"application/javascript\" ||\n mediaType === \"application/sql\" ||\n mediaType === \"application/xml\" ||\n textExtensions.has(extension)\n ) {\n return \"text\";\n }\n return null;\n};\n\n/**\n * Returns the built-in preview kind when FileView can render the file within\n * its bounded client-side limits. Custom renderers remain registry-driven.\n */\nexport const getFileViewPreviewKind = (file: FileViewFile): FileViewPreviewKind | null => {\n const kind = previewKindByType(file);\n if (!kind) return null;\n if (file.size !== undefined && (!Number.isFinite(file.size) || file.size < 0 || file.size > maxPreviewBytes[kind])) {\n return null;\n }\n return kind;\n};\n\n/** Use this to expose preview actions only for files FileView can render. */\nexport const canPreviewFile = (file: FileViewFile): boolean => getFileViewPreviewKind(file) !== null;\n\nexport type DelimitedTextPreview = {\n rows: string[][];\n truncated: boolean;\n};\n\nexport const parseDelimitedText = (\n input: string,\n delimiter: \",\" | \"\\t\",\n limits: { rows?: number; columns?: number } = {},\n): DelimitedTextPreview => {\n const maxRows = Math.max(1, limits.rows ?? 201);\n const maxColumns = Math.max(1, limits.columns ?? 50);\n const rows: string[][] = [];\n let row: string[] = [];\n let field = \"\";\n let quoted = false;\n let truncated = false;\n\n const pushField = () => {\n if (row.length < maxColumns) row.push(field);\n else truncated = true;\n field = \"\";\n };\n const pushRow = () => {\n if (rows.length < maxRows) rows.push(row);\n else truncated = true;\n row = [];\n };\n\n for (let index = 0; index < input.length; index += 1) {\n const character = input[index]!;\n if (quoted) {\n if (character === '\"' && input[index + 1] === '\"') {\n field += '\"';\n index += 1;\n } else if (character === '\"') {\n quoted = false;\n } else {\n field += character;\n }\n continue;\n }\n\n if (character === '\"' && field.length === 0) quoted = true;\n else if (character === delimiter) pushField();\n else if (character === \"\\n\" || character === \"\\r\") {\n pushField();\n pushRow();\n if (character === \"\\r\" && input[index + 1] === \"\\n\") index += 1;\n if (rows.length >= maxRows && index < input.length - 1) {\n truncated = true;\n break;\n }\n } else {\n field += character;\n }\n }\n\n if (field.length > 0 || row.length > 0) {\n pushField();\n pushRow();\n }\n\n return { rows, truncated };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["MEBIBYTE","maxPreviewBytes","markdown","image","pdf","json","audio","video","text","imageMediaTypes","Set","audioMediaTypes","videoMediaTypes","markdownExtensions","imageExtensions","audioExtensions","videoExtensions","textExtensions","fileViewExtension","path","cleanPath","split","name","slice","lastIndexOf","dot","toLowerCase","normalizedMediaType","mediaType","trim","previewKindByType","file","extension","has","endsWith","startsWith","getFileViewPreviewKind","kind","size","undefined","Number","isFinite","canPreviewFile","parseDelimitedText","input","delimiter","limits","maxRows","Math","max","rows","maxColumns","columns","row","field","quoted","truncated","totalRows","columnsTruncated","pushField","length","push","pushRow","offset","index","character"],"sources":["content/file-view-preview.ts"],"sourcesContent":["export type FileViewFile = {\n path: string;\n mediaType?: string;\n size?: number;\n};\n\nexport type FileViewPreviewKind = \"markdown\" | \"image\" | \"pdf\" | \"json\" | \"delimited-text\" | \"audio\" | \"video\" | \"text\";\n\nconst MEBIBYTE = 1024 * 1024;\n\nconst maxPreviewBytes: Record<FileViewPreviewKind, number> = {\n markdown: 2 * MEBIBYTE,\n image: 25 * MEBIBYTE,\n pdf: 50 * MEBIBYTE,\n json: 2 * MEBIBYTE,\n \"delimited-text\": 2 * MEBIBYTE,\n audio: 50 * MEBIBYTE,\n video: 50 * MEBIBYTE,\n text: 2 * MEBIBYTE,\n};\n\n// SVG remains inert because FileView renders every image through <img>; never inject its markup into the DOM.\nconst imageMediaTypes = new Set([\n \"image/avif\",\n \"image/bmp\",\n \"image/gif\",\n \"image/jpeg\",\n \"image/png\",\n \"image/svg+xml\",\n \"image/webp\",\n \"image/x-icon\",\n]);\nconst audioMediaTypes = new Set([\n \"audio/aac\",\n \"audio/flac\",\n \"audio/mp4\",\n \"audio/mpeg\",\n \"audio/ogg\",\n \"audio/wav\",\n \"audio/webm\",\n \"audio/x-wav\",\n]);\nconst videoMediaTypes = new Set([\"video/mp4\", \"video/ogg\", \"video/webm\"]);\n\nconst markdownExtensions = new Set([\"md\", \"markdown\"]);\nconst imageExtensions = new Set([\"avif\", \"bmp\", \"gif\", \"ico\", \"jpeg\", \"jpg\", \"png\", \"svg\", \"webp\"]);\nconst audioExtensions = new Set([\"aac\", \"flac\", \"m4a\", \"mp3\", \"oga\", \"ogg\", \"wav\", \"weba\"]);\nconst videoExtensions = new Set([\"m4v\", \"mp4\", \"ogv\", \"webm\"]);\nconst textExtensions = new Set([\n \"c\",\n \"conf\",\n \"cpp\",\n \"css\",\n \"env\",\n \"go\",\n \"h\",\n \"html\",\n \"ini\",\n \"java\",\n \"js\",\n \"jsx\",\n \"log\",\n \"mjs\",\n \"php\",\n \"py\",\n \"rb\",\n \"rs\",\n \"sh\",\n \"sql\",\n \"toml\",\n \"ts\",\n \"tsx\",\n \"txt\",\n \"xml\",\n \"yaml\",\n \"yml\",\n]);\n\nexport const fileViewExtension = (path: string): string => {\n const cleanPath = path.split(/[?#]/, 1)[0] ?? path;\n const name = cleanPath.slice(cleanPath.lastIndexOf(\"/\") + 1);\n const dot = name.lastIndexOf(\".\");\n return dot > 0 ? name.slice(dot + 1).toLowerCase() : \"\";\n};\n\nconst normalizedMediaType = (mediaType?: string): string => mediaType?.split(\";\", 1)[0]?.trim().toLowerCase() ?? \"\";\n\nconst previewKindByType = (file: FileViewFile): FileViewPreviewKind | null => {\n const extension = fileViewExtension(file.path);\n const mediaType = normalizedMediaType(file.mediaType);\n\n if (mediaType === \"text/markdown\" || markdownExtensions.has(extension)) return \"markdown\";\n if (mediaType === \"application/json\" || mediaType.endsWith(\"+json\") || extension === \"json\") return \"json\";\n if (mediaType === \"text/csv\" || mediaType === \"text/tab-separated-values\" || extension === \"csv\" || extension === \"tsv\") {\n return \"delimited-text\";\n }\n if (mediaType === \"application/pdf\" || extension === \"pdf\") return \"pdf\";\n if (imageMediaTypes.has(mediaType) || imageExtensions.has(extension)) return \"image\";\n if (audioMediaTypes.has(mediaType) || audioExtensions.has(extension)) return \"audio\";\n if (videoMediaTypes.has(mediaType) || videoExtensions.has(extension)) return \"video\";\n if (\n mediaType.startsWith(\"text/\") ||\n mediaType === \"application/javascript\" ||\n mediaType === \"application/sql\" ||\n mediaType === \"application/xml\" ||\n textExtensions.has(extension)\n ) {\n return \"text\";\n }\n return null;\n};\n\n/**\n * Returns the built-in preview kind when FileView can render the file within\n * its bounded client-side limits. Custom renderers remain registry-driven.\n */\nexport const getFileViewPreviewKind = (file: FileViewFile): FileViewPreviewKind | null => {\n const kind = previewKindByType(file);\n if (!kind) return null;\n if (file.size !== undefined && (!Number.isFinite(file.size) || file.size < 0 || file.size > maxPreviewBytes[kind])) {\n return null;\n }\n return kind;\n};\n\n/** Use this to expose preview actions only for files FileView can render. */\nexport const canPreviewFile = (file: FileViewFile): boolean => getFileViewPreviewKind(file) !== null;\n\nexport type DelimitedTextPreview = {\n rows: string[][];\n truncated: boolean;\n totalRows: number;\n columnsTruncated: boolean;\n};\n\nexport const parseDelimitedText = (\n input: string,\n delimiter: string,\n limits: { rows?: number; columns?: number; offset?: number } = {},\n): DelimitedTextPreview => {\n const maxRows = Math.max(1, limits.rows ?? 201);\n const maxColumns = Math.max(1, limits.columns ?? 50);\n const rows: string[][] = [];\n let row: string[] = [];\n let field = \"\";\n let quoted = false;\n let truncated = false;\n let totalRows = 0;\n let columnsTruncated = false;\n\n const pushField = () => {\n if (row.length < maxColumns) row.push(field);\n else { truncated = true; columnsTruncated = true; }\n field = \"\";\n };\n const pushRow = () => {\n if (rows.length < maxRows && (totalRows === 0 || totalRows > (limits.offset ?? 0))) rows.push(row);\n else truncated = true;\n totalRows++;\n row = [];\n };\n\n for (let index = 0; index < input.length; index += 1) {\n const character = input[index]!;\n if (quoted) {\n if (character === '\"' && input[index + 1] === '\"') {\n field += '\"';\n index += 1;\n } else if (character === '\"') {\n quoted = false;\n } else {\n field += character;\n }\n continue;\n }\n\n if (character === '\"' && field.length === 0) quoted = true;\n else if (character === delimiter) pushField();\n else if (character === \"\\n\" || character === \"\\r\") {\n pushField();\n pushRow();\n if (character === \"\\r\" && input[index + 1] === \"\\n\") index += 1;\n } else {\n field += character;\n }\n }\n\n if (field.length > 0 || row.length > 0) {\n pushField();\n pushRow();\n }\n\n return { rows, truncated, totalRows, columnsTruncated };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -13,4 +13,13 @@ export { Pagination } from "./Pagination";
|
|
|
13
13
|
export { default as PdfPreview } from "./PdfPreview";
|
|
14
14
|
export { default as RangePicker } from "./RangePicker";
|
|
15
15
|
export { default as StructuredDataPreview, isStructuredDataValue } from "./StructuredDataPreview";
|
|
16
|
+
export { ChartExplorer } from "./ChartExplorer";
|
|
17
|
+
export { prepareChartSnapshot } from "./chart-snapshot";
|
|
18
|
+
export { createChartExplorer } from "./chart-explorer";
|
|
19
|
+
export { ChartExplorerControls } from "./ChartExplorerControls";
|
|
20
|
+
export { createChartCursor } from "./chart-cursor";
|
|
21
|
+
export { ChartSnapshotView } from "./ChartSnapshotView";
|
|
22
|
+
export { ChartFilterControls } from "./ChartFilterControls";
|
|
23
|
+
export { createCollectionSelection } from "./collection-selection";
|
|
24
|
+
export { FileGrid } from "./FileGrid";
|
|
16
25
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["default","Calendar","Chart","CodeDisplay","DataTable","DocCode","DocConceptGrid","DocInlineCode","DocLead","DocNote","DocPage","DocRows","DocSection","FileBrowserPanel","openFileBrowser","FileTree","canPreviewFile","FileView","formatFileViewSize","getFileViewPreviewKind","Lightbox","LogEntriesTable","MarkdownView","renderSafeMarkdown","Pagination","PdfPreview","RangePicker","StructuredDataPreview","isStructuredDataValue"],"sources":["content/index.ts"],"sourcesContent":["export type {\n CalendarAttendee,\n CalendarDayBadge,\n CalendarEvent,\n CalendarEventColor,\n CalendarEventRenderContext,\n CalendarEventTimeChange,\n CalendarLabels,\n CalendarProps,\n CalendarRecurrence,\n CalendarResource,\n CalendarView,\n} from \"./Calendar\";\nexport { default as Calendar } from \"./Calendar\";\n\nexport type { ChartKind, ChartLabels, ChartProps } from \"./Chart\";\nexport { default as Chart } from \"./Chart\";\nexport type { CodeDisplayLanguage, CodeDisplayProps } from \"./CodeDisplay\";\nexport { default as CodeDisplay } from \"./CodeDisplay\";\nexport type {\n StateTimelineChartOptions,\n StateTimelineDomain,\n StateTimelineInterval,\n StateTimelineRow,\n StateTimelineState,\n} from \"./chart-state-timeline\";\n\nexport type {\n DataTableColumn,\n DataTableControlsProps,\n DataTableFooter,\n DataTableHeaderProps,\n DataTablePanelFooterProps,\n DataTablePanelProps,\n DataTableProps,\n DataTableRenderCell,\n DataTableRenderHeader,\n DataTableSort,\n} from \"./DataTable\";\nexport { default as DataTable } from \"./DataTable\";\n\nexport type { DocCodeHighlighter, DocCodeProps, DocConcept, DocNoteVariant, DocRow } from \"./Docs\";\nexport { DocCode, DocConceptGrid, DocInlineCode, DocLead, DocNote, DocPage, DocRows, DocSection } from \"./Docs\";\n\nexport { FileBrowserPanel, type FileBrowserPanelProps, type FileSource, openFileBrowser } from \"./FileBrowser\";\nexport { default as FileTree, type FileTreeActions, type FileTreeEntry, type FileTreeProps } from \"./FileTree\";\nexport {\n canPreviewFile,\n default as FileView,\n type FileViewContent,\n type FileViewFile,\n type FileViewPreviewKind,\n type FileViewProps,\n type FileViewRenderer,\n type FileViewRendererProps,\n formatFileViewSize,\n getFileViewPreviewKind,\n} from \"./FileView\";\n\nexport type { LightboxImage } from \"./Lightbox\";\nexport { default as Lightbox } from \"./Lightbox\";\n\nexport type { LogTableEntry } from \"./LogEntriesTable\";\nexport { default as LogEntriesTable } from \"./LogEntriesTable\";\nexport { default as MarkdownView, renderSafeMarkdown, type MarkdownRenderOptions, type MarkdownViewProps } from \"./MarkdownView\";\n\nexport { Pagination, type PaginationProps } from \"./Pagination\";\nexport type { PdfPreviewProps, PdfPreviewRequest } from \"./PdfPreview\";\nexport { default as PdfPreview } from \"./PdfPreview\";\nexport type { RangeOption, RangePickerProps } from \"./RangePicker\";\nexport { default as RangePicker } from \"./RangePicker\";\nexport type { StructuredDataPreviewMode, StructuredDataPreviewProps, StructuredDataValue } from \"./StructuredDataPreview\";\nexport { default as StructuredDataPreview, isStructuredDataValue } from \"./StructuredDataPreview\";\n"],"mappings":"AAaA,SAASA,OAAO,IAAIC,QAAQ,QAAQ,YAAY;
|
|
1
|
+
{"version":3,"names":["default","Calendar","Chart","CodeDisplay","DataTable","DocCode","DocConceptGrid","DocInlineCode","DocLead","DocNote","DocPage","DocRows","DocSection","FileBrowserPanel","openFileBrowser","FileTree","canPreviewFile","FileView","formatFileViewSize","getFileViewPreviewKind","Lightbox","LogEntriesTable","MarkdownView","renderSafeMarkdown","Pagination","PdfPreview","RangePicker","StructuredDataPreview","isStructuredDataValue","ChartExplorer","prepareChartSnapshot","createChartExplorer","ChartExplorerControls","createChartCursor","ChartSnapshotView","ChartFilterControls","createCollectionSelection","FileGrid"],"sources":["content/index.ts"],"sourcesContent":["export type {\n CalendarAttendee,\n CalendarDayBadge,\n CalendarEvent,\n CalendarEventColor,\n CalendarEventRenderContext,\n CalendarEventTimeChange,\n CalendarLabels,\n CalendarProps,\n CalendarRecurrence,\n CalendarResource,\n CalendarView,\n} from \"./Calendar\";\nexport { default as Calendar } from \"./Calendar\";\n\nexport type { ChartKind, ChartLabels, ChartProps, ChartRenderOptions } from \"./Chart\";\nexport type { ChartDatumRef, ChartSelection, ChartTooltip, ChartTooltipFormatter } from \"./chart-inspection\";\nexport { default as Chart } from \"./Chart\";\nexport type { CodeDisplayLanguage, CodeDisplayProps } from \"./CodeDisplay\";\nexport { default as CodeDisplay } from \"./CodeDisplay\";\nexport type {\n StateTimelineChartOptions,\n StateTimelineDomain,\n StateTimelineInterval,\n StateTimelineRow,\n StateTimelineState,\n} from \"./chart-state-timeline\";\n\nexport type {\n DataTableColumn,\n DataTableControlsProps,\n DataTableFooter,\n DataTableHeaderProps,\n DataTablePanelFooterProps,\n DataTablePanelProps,\n DataTableProps,\n DataTableRenderCell,\n DataTableRenderHeader,\n DataTableSort,\n} from \"./DataTable\";\nexport { default as DataTable } from \"./DataTable\";\n\nexport type { DocCodeHighlighter, DocCodeProps, DocConcept, DocNoteVariant, DocRow } from \"./Docs\";\nexport { DocCode, DocConceptGrid, DocInlineCode, DocLead, DocNote, DocPage, DocRows, DocSection } from \"./Docs\";\n\nexport { FileBrowserPanel, type FileBrowserPanelProps, type FileSource, openFileBrowser } from \"./FileBrowser\";\nexport { default as FileTree, type FileTreeActions, type FileTreeEntry, type FileTreeProps } from \"./FileTree\";\nexport {\n canPreviewFile,\n default as FileView,\n type FileViewContent,\n type FileViewFile,\n type FileViewPreviewKind,\n type FileViewProps,\n type FileViewRenderer,\n type FileViewRendererProps,\n formatFileViewSize,\n getFileViewPreviewKind,\n} from \"./FileView\";\n\nexport type { LightboxImage } from \"./Lightbox\";\nexport { default as Lightbox } from \"./Lightbox\";\n\nexport type { LogTableEntry } from \"./LogEntriesTable\";\nexport { default as LogEntriesTable } from \"./LogEntriesTable\";\nexport { default as MarkdownView, renderSafeMarkdown, type MarkdownRenderOptions, type MarkdownViewProps } from \"./MarkdownView\";\n\nexport { Pagination, type PaginationProps } from \"./Pagination\";\nexport type { PdfPreviewProps, PdfPreviewRequest } from \"./PdfPreview\";\nexport { default as PdfPreview } from \"./PdfPreview\";\nexport type { RangeOption, RangePickerProps } from \"./RangePicker\";\nexport { default as RangePicker } from \"./RangePicker\";\nexport type { StructuredDataPreviewMode, StructuredDataPreviewProps, StructuredDataValue } from \"./StructuredDataPreview\";\nexport { default as StructuredDataPreview, isStructuredDataValue } from \"./StructuredDataPreview\";\n\nexport { ChartExplorer } from \"./ChartExplorer\";\nexport type { ChartExplorerProps, ChartExplorerColumn } from \"./ChartExplorer\";\nexport { prepareChartSnapshot } from \"./chart-snapshot\";\nexport type { ChartSnapshot } from \"./chart-snapshot\";\nexport { createChartExplorer } from \"./chart-explorer\";\nexport type {\n ChartExplorerRequest,\n ChartExplorerRow,\n ChartExplorerData,\n ChartExplorerCharts,\n ChartExplorerSnapshot,\n ChartExplorerOptions,\n ChartExplorerController,\n} from \"./chart-explorer\";\nexport { ChartExplorerControls } from \"./ChartExplorerControls\";\nexport type { ChartExplorerControlsProps } from \"./ChartExplorerControls\";\n\nexport { createChartCursor, type ChartCursor } from \"./chart-cursor\";\n\nexport { ChartSnapshotView } from \"./ChartSnapshotView\";\nexport { ChartFilterControls, type ChartFilterControlsProps } from \"./ChartFilterControls\";\n\nexport { type CollectionSelection, createCollectionSelection, type SelectionModifiers } from \"./collection-selection\";\nexport { FileGrid, type FileGridProps } from \"./FileGrid\";\n"],"mappings":"AAaA,SAASA,OAAO,IAAIC,QAAQ,QAAQ,YAAY;AAIhD,SAASD,OAAO,IAAIE,KAAK,QAAQ,SAAS;AAE1C,SAASF,OAAO,IAAIG,WAAW,QAAQ,eAAe;AAqBtD,SAASH,OAAO,IAAII,SAAS,QAAQ,aAAa;AAGlD,SAASC,OAAO,EAAEC,cAAc,EAAEC,aAAa,EAAEC,OAAO,EAAEC,OAAO,EAAEC,OAAO,EAAEC,OAAO,EAAEC,UAAU,QAAQ,QAAQ;AAE/G,SAASC,gBAAgB,EAA+CC,eAAe,QAAQ,eAAe;AAC9G,SAASd,OAAO,IAAIe,QAAQ,QAAsE,YAAY;AAC9G,SACEC,cAAc,EACdhB,OAAO,IAAIiB,QAAQ,EAOnBC,kBAAkB,EAClBC,sBAAsB,QACjB,YAAY;AAGnB,SAASnB,OAAO,IAAIoB,QAAQ,QAAQ,YAAY;AAGhD,SAASpB,OAAO,IAAIqB,eAAe,QAAQ,mBAAmB;AAC9D,SAASrB,OAAO,IAAIsB,YAAY,EAAEC,kBAAkB,QAA4D,gBAAgB;AAEhI,SAASC,UAAU,QAA8B,cAAc;AAE/D,SAASxB,OAAO,IAAIyB,UAAU,QAAQ,cAAc;AAEpD,SAASzB,OAAO,IAAI0B,WAAW,QAAQ,eAAe;AAEtD,SAAS1B,OAAO,IAAI2B,qBAAqB,EAAEC,qBAAqB,QAAQ,yBAAyB;AAEjG,SAASC,aAAa,QAAQ,iBAAiB;AAE/C,SAASC,oBAAoB,QAAQ,kBAAkB;AAEvD,SAASC,mBAAmB,QAAQ,kBAAkB;AAUtD,SAASC,qBAAqB,QAAQ,yBAAyB;AAG/D,SAASC,iBAAiB,QAA0B,gBAAgB;AAEpE,SAASC,iBAAiB,QAAQ,qBAAqB;AACvD,SAASC,mBAAmB,QAAuC,uBAAuB;AAE1F,SAAmCC,yBAAyB,QAAiC,wBAAwB;AACrH,SAASC,QAAQ,QAA4B,YAAY","ignoreList":[]}
|
|
@@ -7,17 +7,31 @@ var _tmpl$ = ["<div class=\"k2b-inline-guidance__content\">", "</div>"],
|
|
|
7
7
|
_tmpl$2 = ["<i class=\"", "\" aria-hidden=\"true\"></i>"];
|
|
8
8
|
import { Show, splitProps } from "solid-js";
|
|
9
9
|
export function InlineGuidance(props) {
|
|
10
|
-
const [local, rest] = splitProps(props, ["children", "tone", "icon", "class"]);
|
|
11
|
-
|
|
10
|
+
const [local, rest] = splitProps(props, ["children", "tone", "icon", "class", "loading"]);
|
|
11
|
+
const icon = () => local.icon ?? (local.loading ? "ti ti-loader-2" : undefined);
|
|
12
|
+
return _$ssrElement("div", _$mergeProps({
|
|
13
|
+
get role() {
|
|
14
|
+
return local.loading ? "status" : undefined;
|
|
15
|
+
},
|
|
16
|
+
get ["aria-live"]() {
|
|
17
|
+
return local.loading ? "polite" : undefined;
|
|
18
|
+
},
|
|
19
|
+
get ["aria-busy"]() {
|
|
20
|
+
return local.loading ? "true" : undefined;
|
|
21
|
+
}
|
|
22
|
+
}, rest, {
|
|
12
23
|
get ["class"]() {
|
|
13
24
|
return local.class ? `k2b-inline-guidance ${local.class}` : "k2b-inline-guidance";
|
|
14
25
|
},
|
|
15
26
|
get ["data-tone"]() {
|
|
16
27
|
return local.tone ?? "neutral";
|
|
28
|
+
},
|
|
29
|
+
get ["data-loading"]() {
|
|
30
|
+
return local.loading ? "true" : undefined;
|
|
17
31
|
}
|
|
18
32
|
}), [_$escape(_$createComponent(Show, {
|
|
19
33
|
get when() {
|
|
20
|
-
return
|
|
34
|
+
return icon();
|
|
21
35
|
},
|
|
22
36
|
children: icon => _$ssr(_tmpl$2, `${_$escape(icon(), true)} k2b-inline-guidance__icon`)
|
|
23
37
|
})), _$ssr(_tmpl$, _$escape(local.children))], false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Show","splitProps","InlineGuidance","props","local","rest","_$ssrElement","_$mergeProps","class","data-tone","tone","_$escape","_$createComponent","when","
|
|
1
|
+
{"version":3,"names":["Show","splitProps","InlineGuidance","props","local","rest","icon","loading","undefined","_$ssrElement","_$mergeProps","role","aria-live","aria-busy","class","data-tone","tone","data-loading","_$escape","_$createComponent","when","children","_$ssr","_tmpl$2","_tmpl$"],"sources":["feedback/InlineGuidance.tsx"],"sourcesContent":["import { type JSX, Show, splitProps } from \"solid-js\";\nimport type { IntentTone } from \"../semantics\";\n\nexport type InlineGuidanceProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, \"children\" | \"class\"> & {\n children: JSX.Element;\n tone?: IntentTone;\n loading?: boolean;\n icon?: string | false;\n class?: string;\n};\n\nexport function InlineGuidance(props: InlineGuidanceProps): JSX.Element {\n const [local, rest] = splitProps(props, [\"children\", \"tone\", \"icon\", \"class\", \"loading\"]);\n\n const icon = () => local.icon ?? (local.loading ? \"ti ti-loader-2\" : undefined);\n\n return (\n <div\n role={local.loading ? \"status\" : undefined}\n aria-live={local.loading ? \"polite\" : undefined}\n aria-busy={local.loading ? \"true\" : undefined}\n {...rest}\n class={local.class ? `k2b-inline-guidance ${local.class}` : \"k2b-inline-guidance\"}\n data-tone={local.tone ?? \"neutral\"}\n data-loading={local.loading ? \"true\" : undefined}\n >\n <Show when={icon()}>{(icon) => <i class={`${icon()} k2b-inline-guidance__icon`} aria-hidden=\"true\" />}</Show>\n <div class=\"k2b-inline-guidance__content\">{local.children}</div>\n </div>\n );\n}\n\nexport default InlineGuidance;\n"],"mappings":";;;;;;;AAAA,SAAmBA,IAAI,EAAEC,UAAU,QAAQ,UAAU;AAWrD,OAAO,SAASC,cAAcA,CAACC,KAA0B,EAAe;EACtE,MAAM,CAACC,KAAK,EAAEC,IAAI,CAAC,GAAGJ,UAAU,CAACE,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;EAEzF,MAAMG,IAAI,GAAGA,CAAA,KAAMF,KAAK,CAACE,IAAI,KAAKF,KAAK,CAACG,OAAO,GAAG,gBAAgB,GAAGC,SAAS,CAAC;EAE/E,OAAAC,YAAA,QAAAC,YAAA;IAAA,IAEIC,IAAIA,CAAA;MAAA,OAAEP,KAAK,CAACG,OAAO,GAAG,QAAQ,GAAGC,SAAS;IAAA;IAAA,iBAAAI,CAAA;MAAA,OAC/BR,KAAK,CAACG,OAAO,GAAG,QAAQ,GAAGC,SAAS;IAAA;IAAA,iBAAAK,CAAA;MAAA,OACpCT,KAAK,CAACG,OAAO,GAAG,MAAM,GAAGC,SAAS;IAAA;EAAA,GACzCH,IAAI;IAAA,aAAAS,CAAA;MAAA,OACDV,KAAK,CAACU,KAAK,GAAG,uBAAuBV,KAAK,CAACU,KAAK,EAAE,GAAG,qBAAqB;IAAA;IAAA,iBAAAC,CAAA;MAAA,OACtEX,KAAK,CAACY,IAAI,IAAI,SAAS;IAAA;IAAA,oBAAAC,CAAA;MAAA,OACpBb,KAAK,CAACG,OAAO,GAAG,MAAM,GAAGC,SAAS;IAAA;EAAA,KAAAU,QAAA,CAAAC,iBAAA,CAE/CnB,IAAI;IAAA,IAACoB,IAAIA,CAAA;MAAA,OAAEd,IAAI,CAAC,CAAC;IAAA;IAAAe,QAAA,EAAIf,IAAI,IAAAgB,KAAA,CAAAC,OAAA,EAAe,GAAAL,QAAA,CAAGZ,IAAI,CAAC,CAAC,mCAA4B;EAAuB,KAAAgB,KAAA,CAAAE,MAAA,EAAAN,QAAA,CAC1Dd,KAAK,CAACiB,QAAQ;AAG/D;AAEA,eAAenB,cAAc","ignoreList":[]}
|
|
@@ -10,7 +10,8 @@ const resolveInitialFocusTarget = (entry, dialog) => {
|
|
|
10
10
|
} = entry;
|
|
11
11
|
if (initialFocus === "none") return null;
|
|
12
12
|
if (typeof initialFocus === "function") return initialFocus(dialog);
|
|
13
|
-
|
|
13
|
+
const input = entry.container.querySelector("input:not([type='hidden']):not([disabled]), textarea:not([disabled]), select:not([disabled]), [role='combobox']:not([disabled]):not([aria-disabled='true'])");
|
|
14
|
+
return input ?? entry.container.querySelector("input:not([type='hidden']):not([disabled]), textarea:not([disabled]), select:not([disabled]), button:not([disabled]), a[href], [tabindex]:not([tabindex='-1'])");
|
|
14
15
|
};
|
|
15
16
|
const applyAccessibleName = (dialog, entry) => {
|
|
16
17
|
dialog.removeAttribute("aria-label");
|
|
@@ -41,6 +42,14 @@ export const createDialogCore = () => {
|
|
|
41
42
|
// into another `.k2b-ui` scope, orphaning the levels already on the stack.
|
|
42
43
|
if (state.element?.isConnected) return state.element;
|
|
43
44
|
const element = document.createElement("dialog");
|
|
45
|
+
element.onclose = () => {
|
|
46
|
+
// Repeated Escape can force a non-cancelable native close. A retained
|
|
47
|
+
// entry (ignore, an async guard, or a parent) still owns the modal.
|
|
48
|
+
const top = state.stack[state.stack.length - 1];
|
|
49
|
+
if (state.element !== element || element.open || !top) return;
|
|
50
|
+
if (top.modal) element.showModal();else element.show();
|
|
51
|
+
resolveInitialFocusTarget(top, element)?.focus();
|
|
52
|
+
};
|
|
44
53
|
getK2bPortalRoot().appendChild(element);
|
|
45
54
|
state.element = element;
|
|
46
55
|
return element;
|
|
@@ -61,7 +70,39 @@ export const createDialogCore = () => {
|
|
|
61
70
|
state.previousBodyOverflow = undefined;
|
|
62
71
|
state.previousHtmlOverflow = undefined;
|
|
63
72
|
};
|
|
73
|
+
const applyPresentation = entry => {
|
|
74
|
+
const dialog = state.element;
|
|
75
|
+
if (!dialog || state.stack[state.stack.length - 1] !== entry) return;
|
|
76
|
+
const position = entry.position;
|
|
77
|
+
dialog.style.position = position ? "fixed" : "";
|
|
78
|
+
dialog.style.inset = position ? `${position.y}px auto auto ${position.x}px` : "";
|
|
79
|
+
dialog.style.margin = position ? "0" : "";
|
|
80
|
+
dialog.style.transform = position ? "none" : "";
|
|
81
|
+
dialog.dataset.modeless = String(!entry.modal);
|
|
82
|
+
dialog.setAttribute("aria-modal", String(entry.modal));
|
|
83
|
+
if (dialog.open && state.modal !== entry.modal) {
|
|
84
|
+
const active = document.activeElement;
|
|
85
|
+
dialog.close();
|
|
86
|
+
if (entry.modal) dialog.showModal();else dialog.show();
|
|
87
|
+
if (active instanceof HTMLElement && active.isConnected && (!entry.modal || dialog.contains(active))) {
|
|
88
|
+
active.focus({
|
|
89
|
+
preventScroll: true
|
|
90
|
+
});
|
|
91
|
+
} else resolveInitialFocusTarget(entry, dialog)?.focus({
|
|
92
|
+
preventScroll: true
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
state.modal = entry.modal;
|
|
96
|
+
if (entry.modal) lockPageScroll();else unlockPageScroll();
|
|
97
|
+
};
|
|
98
|
+
const modelessEscape = event => {
|
|
99
|
+
const top = state.stack[state.stack.length - 1];
|
|
100
|
+
if (!top || top.modal || event.key !== "Escape" || event.defaultPrevented || event.isComposing) return;
|
|
101
|
+
event.preventDefault();
|
|
102
|
+
void requestDismiss(top);
|
|
103
|
+
};
|
|
64
104
|
const stopConnectionObserver = () => {
|
|
105
|
+
document.removeEventListener("keydown", modelessEscape);
|
|
65
106
|
state.connectionObserver?.disconnect();
|
|
66
107
|
state.connectionObserver = undefined;
|
|
67
108
|
};
|
|
@@ -80,7 +121,7 @@ export const createDialogCore = () => {
|
|
|
80
121
|
dialog.onclick = event => {
|
|
81
122
|
const realBackdropClick = state.mouseDownOnDialog === true;
|
|
82
123
|
state.mouseDownOnDialog = false;
|
|
83
|
-
if (event.target !== dialog) return;
|
|
124
|
+
if (event.target !== dialog || !state.modal) return;
|
|
84
125
|
if (!realBackdropClick) return;
|
|
85
126
|
if (behavior === "ignore") return;
|
|
86
127
|
if (isPointInsideToast(event.clientX, event.clientY)) return;
|
|
@@ -88,7 +129,7 @@ export const createDialogCore = () => {
|
|
|
88
129
|
};
|
|
89
130
|
};
|
|
90
131
|
const requestDismiss = async entry => {
|
|
91
|
-
if (state.stack[state.stack.length - 1] !== entry || entry.dismissPending) return;
|
|
132
|
+
if (state.stack[state.stack.length - 1] !== entry || entry.dismissPending || entry.cancelBehavior === "ignore") return;
|
|
92
133
|
if (!entry.dismissHandler) {
|
|
93
134
|
popTop(undefined);
|
|
94
135
|
return;
|
|
@@ -113,6 +154,7 @@ export const createDialogCore = () => {
|
|
|
113
154
|
if (previous && dialog) {
|
|
114
155
|
previous.container.style.display = "";
|
|
115
156
|
dialog.className = previous.panelClassName;
|
|
157
|
+
applyPresentation(previous);
|
|
116
158
|
applyAccessibleName(dialog, previous);
|
|
117
159
|
applyCancelBehavior(dialog, () => void requestDismiss(previous), previous.cancelBehavior);
|
|
118
160
|
schedule(() => {
|
|
@@ -152,6 +194,7 @@ export const createDialogCore = () => {
|
|
|
152
194
|
};
|
|
153
195
|
const observeConnection = () => {
|
|
154
196
|
if (state.connectionObserver || typeof MutationObserver === "undefined") return;
|
|
197
|
+
document.addEventListener("keydown", modelessEscape);
|
|
155
198
|
state.connectionObserver = new MutationObserver(resetDisconnectedDialog);
|
|
156
199
|
state.connectionObserver.observe(document.documentElement, {
|
|
157
200
|
childList: true,
|
|
@@ -159,6 +202,7 @@ export const createDialogCore = () => {
|
|
|
159
202
|
});
|
|
160
203
|
};
|
|
161
204
|
const open = (view, options = {}) => {
|
|
205
|
+
if (options.signal?.aborted) return Promise.resolve(undefined);
|
|
162
206
|
const dialog = ensureDialogElement();
|
|
163
207
|
const previousTop = state.stack[state.stack.length - 1];
|
|
164
208
|
if (previousTop) previousTop.container.style.display = "none";
|
|
@@ -176,10 +220,24 @@ export const createDialogCore = () => {
|
|
|
176
220
|
cancelBehavior,
|
|
177
221
|
initialFocus,
|
|
178
222
|
opener: activeElement instanceof HTMLElement ? activeElement : undefined,
|
|
179
|
-
ariaLabel: options.ariaLabel
|
|
223
|
+
ariaLabel: options.ariaLabel,
|
|
224
|
+
modal: true
|
|
180
225
|
};
|
|
181
226
|
return new Promise((resolve, reject) => {
|
|
182
|
-
|
|
227
|
+
const abort = () => {
|
|
228
|
+
const index = state.stack.indexOf(entry);
|
|
229
|
+
if (index < 0) return;
|
|
230
|
+
if (index === state.stack.length - 1) popTop(undefined);else {
|
|
231
|
+
state.stack.splice(index, 1);
|
|
232
|
+
entry.dispose?.();
|
|
233
|
+
entry.container.remove();
|
|
234
|
+
entry.resolve?.(undefined);
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
entry.resolve = value => {
|
|
238
|
+
options.signal?.removeEventListener("abort", abort);
|
|
239
|
+
resolve(value);
|
|
240
|
+
};
|
|
183
241
|
const closeTyped = result => {
|
|
184
242
|
if (state.stack[state.stack.length - 1] !== entry) return;
|
|
185
243
|
popTop(result);
|
|
@@ -188,17 +246,33 @@ export const createDialogCore = () => {
|
|
|
188
246
|
try {
|
|
189
247
|
entry.dispose = render(() => view(closeTyped, {
|
|
190
248
|
dialog,
|
|
249
|
+
setModal: modal => {
|
|
250
|
+
entry.modal = modal;
|
|
251
|
+
applyPresentation(entry);
|
|
252
|
+
},
|
|
253
|
+
setPosition: position => {
|
|
254
|
+
if (position && (!Number.isFinite(position.x) || !Number.isFinite(position.y))) return;
|
|
255
|
+
entry.position = position;
|
|
256
|
+
applyPresentation(entry);
|
|
257
|
+
},
|
|
258
|
+
requestDismiss: () => requestDismiss(entry),
|
|
191
259
|
setDismissHandler: handler => {
|
|
192
260
|
entry.dismissHandler = handler;
|
|
193
261
|
}
|
|
194
262
|
}), container);
|
|
263
|
+
applyPresentation(entry);
|
|
195
264
|
applyAccessibleName(dialog, entry);
|
|
196
265
|
applyCancelBehavior(dialog, () => void requestDismiss(entry), cancelBehavior);
|
|
197
266
|
if (state.stack.length === 1) {
|
|
198
|
-
if (typeof dialog.showModal === "function")
|
|
199
|
-
|
|
267
|
+
if (typeof dialog.showModal === "function") {
|
|
268
|
+
if (entry.modal) dialog.showModal();else dialog.show();
|
|
269
|
+
} else dialog.setAttribute("open", "");
|
|
200
270
|
observeConnection();
|
|
201
271
|
}
|
|
272
|
+
options.signal?.addEventListener("abort", abort, {
|
|
273
|
+
once: true
|
|
274
|
+
});
|
|
275
|
+
if (options.signal?.aborted) abort();
|
|
202
276
|
schedule(() => {
|
|
203
277
|
if (state.stack[state.stack.length - 1] === entry) resolveInitialFocusTarget(entry, dialog)?.focus();
|
|
204
278
|
});
|