@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createContext","createEffect","createMemo","createSignal","createUniqueId","For","onCleanup","onMount","Show","useContext","Dynamic","useUiMessages","useLocale","PanelHeader","Paper","Placeholder","DataTablePanelContext","defaultRender","value","locale","messages","undefined","Date","toLocaleString","yes","no","String","JSON","stringify","renderColumnPart","part","col","rowInteractiveSelector","join","isNestedRowControl","event","target","Element","closest","currentTarget","scrollbarMetrics","viewportSize","contentSize","scrollOffset","overflow","offset","size","Math","min","max","DataTableRoot","props","hoveredColumn","setHoveredColumn","scrollbars","setScrollbars","x","y","scrollbarEnhanced","setScrollbarEnhanced","scrolling","setScrolling","panel","tableRef","scrollRef","loadMoreRef","scrollingTimeout","scrollbarDragOffset","hasMore","loadingMore","onLoadMore","loadMoreRequested","previousRowsLength","rows","length","previousLoadingMore","previousHasMore","rowId","row","getRowId","isInteractive","onRowClick","onRowDoubleClick","shouldHoverRows","hoverRows","shouldRenderLoadMoreSentinel","labelledBy","ariaLabelledBy","hasHeading","headingId","surface","class","cellContentClass","tableClass","trim","columnHighlighted","index","highlightColumns","setHoveredColumnIfEnabled","isNearBottom","scrollTop","clientHeight","scrollHeight","maybeLoadMore","error","syncScrollbars","clientWidth","scrollWidth","scrollLeft","revealScrollbars","clearTimeout","setTimeout","onScroll","scrollFromPointer","axis","track","metrics","rect","getBoundingClientRect","trackSize","height","width","pointerOffset","clientY","top","clientX","left","available","thumbOffset","maxScroll","startScrollbarDrag","preventDefault","setPointerCapture","pointerId","valueOf","columnAlignments","alignments","Map","columns","align","set","id","alignAttr","get","sortKeyOf","sortable","sortLinkFor","key","sortHref","active","sort","direction","href","ariaSortFor","renderHeaderDefault","title","_$ssr","_tmpl$","_$escape","header","_$createComponent","when","subtitle","children","_tmpl$2","_tmpl$3","_$ssrAttribute","_tmpl$4","renderValueDefault","renderCellDefault","onRowKeyDown","rowClass","IntersectionObserver","observer","entries","some","entry","isIntersecting","root","rootMargin","observe","disconnect","ResizeObserver","rowsLength","nextHasMore","nextLoadingMore","queueMicrotask","fallback","description","noColumns","component","data-surface","data-has-footer","footer","data-overflow-x","data-overflow-y","data-scrollbar-enhanced","data-scrolling","onMouseLeave","_tmpl$7","ariaLabel","dataTable","density","scrollPreserveKey","fillHeight","stickyHeader","each","_tmpl$8","headerClass","renderHeader","render","_tmpl$9","empty","noRecords","isSelected","selectedRowId","_tmpl$0","_tmpl$1","cellClass","verticalAlign","renderCell","v","_tmpl$5","_tmpl$10","values","_tmpl$11","_tmpl$6","_tmpl$12","_$ssrStyleProperty","DataTablePanel","setHasHeading","context","registerHeading","Provider","as","DataTableHeader","_tmpl$13","_tmpl$14","actions","DataTableControls","DataTablePanelFooter","_tmpl$15","DataTable","Panel","Header","Controls","Footer"],"sources":["content/DataTable.tsx"],"sourcesContent":["import {\n type Accessor,\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n onCleanup,\n onMount,\n Show,\n useContext,\n} from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { useLocale } from \"../intl/locale\";\nimport { PanelHeader } from \"../layout/PanelHeader\";\nimport { Paper } from \"../surfaces/Paper\";\nimport Placeholder from \"../surfaces/Placeholder\";\n\nexport type DataTableColumn<T> = {\n id: string;\n header: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n subtitle?: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n value?: keyof T | ((row: T) => unknown);\n class?: string;\n headerClass?: string;\n cellClass?: string;\n /** Defaults to right for numeric values and left for everything else. */\n align?: \"left\" | \"center\" | \"right\";\n /**\n * Marks the column sortable. Pass a string when the server's sort key\n * differs from the column id — they often do, because one column can show a\n * rate while another sorts by the absolute count behind it.\n */\n sortable?: boolean | string;\n};\n\nexport type DataTableSort = { key: string; direction: \"asc\" | \"desc\" };\n\nexport type DataTableRenderCell<T> = (ctx: {\n row: T;\n col: DataTableColumn<T>;\n value: unknown;\n render: (value: unknown) => JSX.Element;\n}) => JSX.Element;\n\nexport type DataTableRenderHeader<T> = (ctx: { col: DataTableColumn<T>; render: () => JSX.Element }) => JSX.Element;\n\nexport type DataTableFooter<T> = {\n values?: Record<string, unknown>;\n renderCell?: (ctx: { col: DataTableColumn<T>; value: unknown; render: (value: unknown) => JSX.Element }) => JSX.Element;\n};\n\nexport type DataTableProps<T> = {\n rows: readonly T[];\n columns: readonly DataTableColumn<T>[];\n /** Accessible name for a standalone table region. Defaults to \"Data table\". */\n ariaLabel?: string;\n /** ID of a visible heading that labels the table region. Takes precedence over ariaLabel. */\n ariaLabelledBy?: string;\n getRowId?: (row: T) => string;\n /** Current server-side ordering, or null when the default applies. */\n sort?: DataTableSort | null;\n /**\n * Link target for a sortable header. Link-based because every admin table is\n * server-rendered: sorting is a query change, not client state.\n */\n sortHref?: (next: DataTableSort) => string;\n selectedRowId?: string | null;\n rowClass?: string | ((row: T) => string | undefined);\n hoverRows?: boolean;\n onRowClick?: (row: T) => void;\n onRowDoubleClick?: (row: T) => void;\n renderCell?: DataTableRenderCell<T>;\n renderHeader?: DataTableRenderHeader<T>;\n footer?: DataTableFooter<T>;\n hasMore?: boolean;\n loadingMore?: boolean;\n onLoadMore?: () => void;\n empty?: JSX.Element;\n density?: \"compact\" | \"normal\";\n stickyHeader?: boolean;\n highlightColumns?: boolean;\n verticalAlign?: \"top\" | \"middle\" | \"bottom\";\n cellContentClass?: string;\n fillHeight?: boolean;\n /** Visual frame for a standalone table. Defaults preserve the legacy class-based behavior. */\n surface?: \"paper\" | \"plain\";\n class?: string;\n /** Additional classes for the table element. Core table geometry is always retained. */\n tableClass?: string;\n scrollPreserveKey?: string | false;\n};\n\nexport type DataTablePanelProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTableHeaderProps = {\n title: string;\n subtitle?: string;\n children?: JSX.Element;\n as?: \"h1\" | \"h2\" | \"h3\";\n size?: \"sm\" | \"md\";\n class?: string;\n};\n\nexport type DataTableControlsProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTablePanelFooterProps = {\n children: JSX.Element;\n class?: string;\n};\n\ntype DataTablePanelContextValue = {\n headingId: string;\n hasHeading: Accessor<boolean>;\n registerHeading: () => void;\n};\n\nconst DataTablePanelContext = createContext<DataTablePanelContextValue>();\n\nconst defaultRender = (value: unknown, locale: string, messages: ReturnType<ReturnType<typeof useUiMessages>>): JSX.Element => {\n if (value === null || value === undefined || value === \"\") return \"—\";\n if (value instanceof Date) return value.toLocaleString(locale);\n if (typeof value === \"boolean\") return value ? messages.yes : messages.no;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n if (typeof value === \"string\") return value;\n return JSON.stringify(value);\n};\n\nconst renderColumnPart = <T,>(\n part: DataTableColumn<T>[\"header\"] | DataTableColumn<T>[\"subtitle\"],\n col: DataTableColumn<T>,\n): JSX.Element => {\n if (typeof part === \"function\") return part({ col });\n return part;\n};\n\nconst rowInteractiveSelector = [\n \"a[href]\",\n \"button\",\n \"input\",\n \"select\",\n \"textarea\",\n \"summary\",\n \"[contenteditable]\",\n \"[role='button']\",\n \"[role='checkbox']\",\n \"[role='link']\",\n \"[role='menuitem']\",\n \"[role='option']\",\n \"[role='radio']\",\n \"[role='switch']\",\n \"[role='tab']\",\n \"[tabindex]\",\n].join(\",\");\n\nconst isNestedRowControl = (event: Event): boolean =>\n event.target instanceof Element && event.target.closest(rowInteractiveSelector) !== event.currentTarget;\n\ntype DataTableScrollbarAxis = \"x\" | \"y\";\ntype DataTableScrollbarMetrics = { overflow: boolean; offset: number; size: number };\n\nconst scrollbarMetrics = (viewportSize: number, contentSize: number, scrollOffset: number): DataTableScrollbarMetrics => {\n if (viewportSize <= 0 || contentSize <= viewportSize + 1) return { overflow: false, offset: 0, size: 0 };\n const size = Math.min(viewportSize, Math.max(24, (viewportSize * viewportSize) / contentSize));\n const offset = (scrollOffset / (contentSize - viewportSize)) * (viewportSize - size);\n return { overflow: true, offset, size };\n};\n\nfunction DataTableRoot<T>(props: DataTableProps<T>) {\n const messages = useUiMessages();\n const locale = useLocale();\n const [hoveredColumn, setHoveredColumn] = createSignal<number | null>(null);\n const [scrollbars, setScrollbars] = createSignal<Record<DataTableScrollbarAxis, DataTableScrollbarMetrics>>({\n x: { overflow: false, offset: 0, size: 0 },\n y: { overflow: false, offset: 0, size: 0 },\n });\n const [scrollbarEnhanced, setScrollbarEnhanced] = createSignal(false);\n const [scrolling, setScrolling] = createSignal(false);\n const panel = useContext(DataTablePanelContext);\n let tableRef: HTMLTableElement | undefined;\n let scrollRef: HTMLDivElement | undefined;\n let loadMoreRef: HTMLDivElement | undefined;\n let scrollingTimeout: ReturnType<typeof setTimeout> | undefined;\n let scrollbarDragOffset = 0;\n let hasMore = false;\n let loadingMore = false;\n let onLoadMore: (() => void) | undefined;\n let loadMoreRequested = false;\n let previousRowsLength = props.rows.length;\n let previousLoadingMore = !!props.loadingMore;\n let previousHasMore = !!props.hasMore;\n const rowId = (row: T) => props.getRowId?.(row);\n const isInteractive = () => !!props.onRowClick || !!props.onRowDoubleClick;\n const shouldHoverRows = () => props.hoverRows ?? isInteractive();\n const shouldRenderLoadMoreSentinel = () => !!props.onLoadMore;\n const labelledBy = () => props.ariaLabelledBy ?? (panel?.hasHeading() ? panel.headingId : undefined);\n const surface = () => props.surface ?? (props.class ? \"plain\" : \"paper\");\n const cellContentClass = () => props.cellContentClass ?? \"k2b-data-table__cell-text\";\n const tableClass = () => `k2b-data-table ${props.tableClass ?? \"\"}`.trim();\n const columnHighlighted = (index: number) =>\n props.highlightColumns !== false && shouldHoverRows() && hoveredColumn() === index ? \"true\" : undefined;\n const setHoveredColumnIfEnabled = (index: number) => {\n if (shouldHoverRows()) setHoveredColumn(index);\n };\n\n const isNearBottom = () => {\n if (!scrollRef) return false;\n return scrollRef.scrollTop + scrollRef.clientHeight >= scrollRef.scrollHeight - 240;\n };\n\n const maybeLoadMore = () => {\n if (!hasMore || loadingMore || loadMoreRequested || !onLoadMore) return;\n if (!isNearBottom()) return;\n loadMoreRequested = true;\n try {\n onLoadMore();\n } catch (error) {\n loadMoreRequested = false;\n throw error;\n }\n };\n\n const syncScrollbars = () => {\n if (!scrollRef) return;\n setScrollbars({\n x: scrollbarMetrics(scrollRef.clientWidth, scrollRef.scrollWidth, scrollRef.scrollLeft),\n y: scrollbarMetrics(scrollRef.clientHeight, scrollRef.scrollHeight, scrollRef.scrollTop),\n });\n };\n\n const revealScrollbars = () => {\n setScrolling(true);\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n scrollingTimeout = setTimeout(() => {\n setScrolling(false);\n scrollingTimeout = undefined;\n }, 700);\n };\n\n const onScroll = () => {\n syncScrollbars();\n revealScrollbars();\n maybeLoadMore();\n };\n\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n if (!scrollRef) return;\n const track = event.currentTarget;\n const metrics = scrollbars()[axis];\n const rect = track.getBoundingClientRect();\n const trackSize = axis === \"y\" ? rect.height : rect.width;\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n const available = Math.max(1, trackSize - metrics.size);\n const thumbOffset = Math.min(available, Math.max(0, pointerOffset - scrollbarDragOffset));\n const maxScroll = axis === \"y\" ? scrollRef.scrollHeight - scrollRef.clientHeight : scrollRef.scrollWidth - scrollRef.clientWidth;\n if (axis === \"y\") scrollRef.scrollTop = (thumbOffset / available) * maxScroll;\n else scrollRef.scrollLeft = (thumbOffset / available) * maxScroll;\n syncScrollbars();\n revealScrollbars();\n };\n\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n event.preventDefault();\n const metrics = scrollbars()[axis];\n const rect = event.currentTarget.getBoundingClientRect();\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n scrollbarDragOffset =\n event.target === event.currentTarget ? metrics.size / 2 : Math.min(metrics.size, Math.max(0, pointerOffset - metrics.offset));\n event.currentTarget.setPointerCapture(event.pointerId);\n scrollFromPointer(event, axis);\n };\n\n const valueOf = (row: T, col: DataTableColumn<T>) => {\n if (typeof col.value === \"function\") return col.value(row);\n if (col.value) return row[col.value];\n return undefined;\n };\n\n const columnAlignments = createMemo(() => {\n const alignments = new Map<string, NonNullable<DataTableColumn<T>[\"align\"]>>();\n for (const col of props.columns) {\n if (col.align) {\n alignments.set(col.id, col.align);\n continue;\n }\n let align: NonNullable<DataTableColumn<T>[\"align\"]> = \"left\";\n for (const row of props.rows) {\n const value = valueOf(row, col);\n if (value === null || value === undefined || value === \"\") continue;\n align = typeof value === \"number\" || typeof value === \"bigint\" ? \"right\" : \"left\";\n break;\n }\n alignments.set(col.id, align);\n }\n return alignments;\n });\n\n /** `data-align` mirrors Cloud's `text-left/center/right` on the same cell. */\n const alignAttr = (col: DataTableColumn<T>) => {\n const align = columnAlignments().get(col.id) ?? \"left\";\n return align === \"left\" ? undefined : align;\n };\n\n const sortKeyOf = (col: DataTableColumn<T>): string | null =>\n col.sortable === true ? col.id : typeof col.sortable === \"string\" ? col.sortable : null;\n\n /**\n * Sorting is a link, not a handler: these tables are server-rendered, so the\n * order belongs in the URL. Clicking the active column flips its direction.\n */\n const sortLinkFor = (col: DataTableColumn<T>): { href: string; active: boolean; direction: \"asc\" | \"desc\" } | null => {\n const key = sortKeyOf(col);\n if (!key || !props.sortHref) return null;\n const active = props.sort?.key === key;\n const direction: \"asc\" | \"desc\" = active && props.sort?.direction === \"desc\" ? \"asc\" : \"desc\";\n return { href: props.sortHref({ key, direction }), active, direction };\n };\n\n /** Only a sortable column carries a sort state; the rest carry none at all. */\n const ariaSortFor = (col: DataTableColumn<T>): \"ascending\" | \"descending\" | \"none\" | undefined => {\n const sort = sortLinkFor(col);\n if (!sort) return undefined;\n if (!sort.active) return \"none\";\n return props.sort?.direction === \"asc\" ? \"ascending\" : \"descending\";\n };\n\n const renderHeaderDefault = (col: DataTableColumn<T>): JSX.Element => {\n const sort = sortLinkFor(col);\n const title = (\n <>\n <span class=\"k2b-data-table__header-title\">{renderColumnPart(col.header, col)}</span>\n <Show when={col.subtitle !== undefined}>\n <span class=\"k2b-data-table__header-subtitle\">{renderColumnPart(col.subtitle, col)}</span>\n </Show>\n </>\n );\n\n if (!sort)\n return (\n <div class=\"k2b-data-table__header-content\" data-align={alignAttr(col)}>\n {title}\n </div>\n );\n\n return (\n <a href={sort.href} class=\"k2b-data-table__header-content k2b-data-table__sort\" data-align={alignAttr(col)}>\n <span class=\"k2b-data-table__header-line\">\n {title}\n {/* Inactive columns keep a dimmed marker so the row reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${props.sort?.direction === \"asc\" && sort.active ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={sort.active ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </span>\n </a>\n );\n };\n\n const renderValueDefault = (value: unknown) => defaultRender(value, locale(), messages());\n const renderCellDefault = (row: T, col: DataTableColumn<T>) => renderValueDefault(valueOf(row, col));\n\n const onRowKeyDown = (event: KeyboardEvent, row: T) => {\n if (!isInteractive()) return;\n if (isNestedRowControl(event)) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n (props.onRowClick ?? props.onRowDoubleClick)?.(row);\n };\n\n const onRowClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n props.onRowClick?.(row);\n };\n\n const onRowDoubleClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n props.onRowDoubleClick?.(row);\n };\n\n const rowClass = (row: T) => {\n if (typeof props.rowClass === \"function\") return props.rowClass(row) ?? \"\";\n return props.rowClass ?? \"\";\n };\n\n onMount(() => {\n if (typeof IntersectionObserver === \"undefined\" || !scrollRef || !loadMoreRef) return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) maybeLoadMore();\n },\n { root: scrollRef, rootMargin: \"240px\" },\n );\n observer.observe(loadMoreRef);\n onCleanup(() => observer.disconnect());\n });\n\n onMount(() => {\n setScrollbarEnhanced(true);\n syncScrollbars();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbars);\n if (scrollRef) observer?.observe(scrollRef);\n if (tableRef) observer?.observe(tableRef);\n onCleanup(() => {\n observer?.disconnect();\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n });\n });\n\n createEffect(() => {\n const rowsLength = props.rows.length;\n const nextHasMore = !!props.hasMore;\n const nextLoadingMore = !!props.loadingMore;\n if (rowsLength !== previousRowsLength || (previousLoadingMore && !nextLoadingMore) || (!previousHasMore && nextHasMore)) {\n loadMoreRequested = false;\n }\n previousRowsLength = rowsLength;\n previousLoadingMore = nextLoadingMore;\n previousHasMore = nextHasMore;\n hasMore = nextHasMore;\n loadingMore = nextLoadingMore;\n onLoadMore = props.onLoadMore;\n maybeLoadMore();\n queueMicrotask(syncScrollbars);\n });\n\n return (\n <Show when={props.columns.length > 0} fallback={<Placeholder surface=\"paper\" description={<>{messages().noColumns}</>} />}>\n <Dynamic\n component={surface() === \"paper\" ? Paper : \"div\"}\n class={`k2b-table-shell ${props.class ?? \"\"}`}\n data-surface={surface()}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-overflow-x={scrollbars().x.overflow ? \"true\" : undefined}\n data-overflow-y={scrollbars().y.overflow ? \"true\" : undefined}\n data-scrollbar-enhanced={scrollbarEnhanced() ? \"true\" : undefined}\n data-scrolling={scrolling() ? \"true\" : undefined}\n onMouseLeave={() => setHoveredColumn(null)}\n >\n <div\n ref={scrollRef}\n role=\"region\"\n aria-label={labelledBy() ? undefined : (props.ariaLabel ?? messages().dataTable)}\n aria-labelledby={labelledBy()}\n tabIndex={0}\n class=\"k2b-table-wrap\"\n data-density={props.density === \"compact\" ? \"compact\" : undefined}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-surface={surface()}\n data-scroll-preserve={props.scrollPreserveKey || undefined}\n onScroll={onScroll}\n >\n <table ref={tableRef} class={tableClass()} data-fill={props.fillHeight ? \"true\" : undefined}>\n <thead class=\"k2b-data-table__head\" data-sticky={props.stickyHeader === false ? undefined : \"true\"}>\n <tr class=\"k2b-data-table__head-row\">\n <For each={props.columns}>\n {(col, index) => (\n <th\n scope=\"col\"\n class={`${col.headerClass ?? \"\"} ${col.class ?? \"\"}`}\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n aria-sort={ariaSortFor(col)}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {props.renderHeader ? props.renderHeader({ col, render: () => renderHeaderDefault(col) }) : renderHeaderDefault(col)}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <Show\n when={props.rows.length > 0}\n fallback={\n <tr>\n <td class=\"k2b-data-table__empty\" colspan={props.columns.length}>\n <Placeholder description={<>{props.empty ?? messages().noRecords}</>} />\n </td>\n </tr>\n }\n >\n <For each={props.rows}>\n {(row) => {\n const id = () => rowId(row);\n const isSelected = () => props.selectedRowId && id() === props.selectedRowId;\n return (\n <tr\n class={`k2b-data-table__row ${rowClass(row)}`}\n data-hover={shouldHoverRows() ? \"true\" : undefined}\n data-clickable={shouldHoverRows() && isInteractive() ? \"true\" : undefined}\n data-selected={isSelected() ? \"true\" : undefined}\n tabIndex={isInteractive() ? 0 : undefined}\n onClick={(event) => onRowClick(event, row)}\n onDblClick={(event) => onRowDoubleClick(event, row)}\n onKeyDown={(e) => onRowKeyDown(e, row)}\n >\n <For each={props.columns}>\n {(col, index) => {\n const value = () => valueOf(row, col);\n return (\n <td\n class={`${col.cellClass ?? \"\"} ${col.class ?? \"\"}`}\n data-align={alignAttr(col)}\n data-valign={props.verticalAlign && props.verticalAlign !== \"middle\" ? props.verticalAlign : undefined}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n <div class={cellContentClass()}>\n {props.renderCell\n ? props.renderCell({\n row,\n col,\n value: value(),\n render: (v) => renderCellDefault(row, { ...col, value: () => v }),\n })\n : renderValueDefault(value())}\n </div>\n </td>\n );\n }}\n </For>\n </tr>\n );\n }}\n </For>\n <Show when={props.fillHeight}>\n <tr aria-hidden=\"true\">\n <td class=\"k2b-data-table__fill\" colspan={props.columns.length} />\n </tr>\n </Show>\n </Show>\n </tbody>\n <Show when={props.footer}>\n {(footer) => (\n <tfoot class=\"k2b-data-table__foot\" data-sticky=\"true\">\n <tr class=\"k2b-data-table__foot-row\">\n <For each={props.columns}>\n {(col, index) => {\n const value = () => footer().values?.[col.id];\n return (\n <td\n class=\"k2b-data-table__footer-cell\"\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {footer().renderCell\n ? footer().renderCell!({ col, value: value(), render: renderValueDefault })\n : renderValueDefault(value())}\n </td>\n );\n }}\n </For>\n </tr>\n </tfoot>\n )}\n </Show>\n </table>\n <Show when={shouldRenderLoadMoreSentinel()}>\n <div ref={loadMoreRef} class=\"k2b-data-table__sentinel\" aria-hidden=\"true\" />\n </Show>\n </div>\n <For each={[\"y\", \"x\"] as const}>\n {(axis) => (\n <div\n class=\"k2b-data-table__scrollbar\"\n data-axis={axis}\n data-overflow={scrollbars()[axis].overflow ? \"true\" : undefined}\n aria-hidden=\"true\"\n onPointerDown={(event) => startScrollbarDrag(event, axis)}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event, axis);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-data-table-scroll-offset\": `${scrollbars()[axis].offset}px`,\n \"--k2b-data-table-scroll-size\": `${scrollbars()[axis].size}px`,\n }}\n />\n </div>\n )}\n </For>\n </Dynamic>\n </Show>\n );\n}\n\nconst DataTablePanel = (props: DataTablePanelProps): JSX.Element => {\n const headingId = `k2b-data-table-${createUniqueId()}-heading`;\n const [hasHeading, setHasHeading] = createSignal(false);\n const context: DataTablePanelContextValue = {\n headingId,\n hasHeading,\n registerHeading: () => setHasHeading(true),\n };\n\n return (\n <DataTablePanelContext.Provider value={context}>\n <Paper as=\"section\" class={`k2b-data-panel ${props.class ?? \"\"}`}>\n {props.children}\n </Paper>\n </DataTablePanelContext.Provider>\n );\n};\n\nconst DataTableHeader = (props: DataTableHeaderProps): JSX.Element => {\n const panel = useContext(DataTablePanelContext);\n panel?.registerHeading();\n\n return (\n <div class={`k2b-data-panel__header ${props.class ?? \"\"}`}>\n <PanelHeader\n title={<span id={panel?.headingId}>{props.title}</span>}\n subtitle={props.subtitle}\n actions={props.children}\n as={props.as}\n size={props.size}\n />\n </div>\n );\n};\n\nconst DataTableControls = (props: DataTableControlsProps): JSX.Element => (\n <div class={`k2b-data-panel__controls ${props.class ?? \"\"}`}>{props.children}</div>\n);\n\nconst DataTablePanelFooter = (props: DataTablePanelFooterProps): JSX.Element => (\n <footer class={`k2b-data-panel__footer ${props.class ?? \"\"}`}>{props.children}</footer>\n);\n\ntype DataTableComponent = {\n <T>(props: DataTableProps<T>): JSX.Element;\n Panel: (props: DataTablePanelProps) => JSX.Element;\n Header: (props: DataTableHeaderProps) => JSX.Element;\n Controls: (props: DataTableControlsProps) => JSX.Element;\n Footer: (props: DataTablePanelFooterProps) => JSX.Element;\n};\n\nconst DataTable = DataTableRoot as DataTableComponent;\nDataTable.Panel = DataTablePanel;\nDataTable.Header = DataTableHeader;\nDataTable.Controls = DataTableControls;\nDataTable.Footer = DataTablePanelFooter;\n\nexport default DataTable;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["createContext","createEffect","createMemo","createSignal","createUniqueId","For","onCleanup","onMount","Show","useContext","Dynamic","useLocale","useUiMessages","PanelHeader","Paper","Placeholder","DataTablePanelContext","defaultRender","value","locale","messages","undefined","Date","toLocaleString","yes","no","String","JSON","stringify","renderColumnPart","part","col","rowInteractiveSelector","join","isNestedRowControl","event","target","Element","closest","currentTarget","scrollbarMetrics","viewportSize","contentSize","scrollOffset","overflow","offset","size","Math","min","max","DataTableRoot","props","hoveredColumn","setHoveredColumn","scrollbars","setScrollbars","x","y","scrollbarEnhanced","setScrollbarEnhanced","scrolling","setScrolling","panel","tableRef","scrollRef","loadMoreRef","scrollingTimeout","scrollbarDragOffset","hasMore","loadingMore","onLoadMore","loadMoreRequested","previousRowsLength","rows","length","previousLoadingMore","previousHasMore","rowId","row","getRowId","isInteractive","selection","onRowClick","onRowDoubleClick","shouldHoverRows","hoverRows","shouldRenderLoadMoreSentinel","labelledBy","ariaLabelledBy","hasHeading","headingId","surface","class","cellContentClass","tableClass","trim","columnHighlighted","index","highlightColumns","setHoveredColumnIfEnabled","isNearBottom","scrollTop","clientHeight","scrollHeight","maybeLoadMore","error","syncScrollbars","clientWidth","scrollWidth","scrollLeft","revealScrollbars","clearTimeout","setTimeout","onScroll","scrollFromPointer","axis","track","metrics","rect","getBoundingClientRect","trackSize","height","width","pointerOffset","clientY","top","clientX","left","available","thumbOffset","maxScroll","startScrollbarDrag","preventDefault","setPointerCapture","pointerId","valueOf","columnAlignments","alignments","Map","columns","align","set","id","alignAttr","get","sortKeyOf","sortable","sortLinkFor","key","sortHref","active","sort","direction","href","ariaSortFor","renderHeader","renderHeaderDefault","title","_$ssr","_tmpl$","_$escape","header","_$createComponent","when","subtitle","children","_tmpl$2","_tmpl$3","_$ssrAttribute","_tmpl$4","renderValueDefault","renderCellDefault","onRowKeyDown","keyDown","select","rowClass","IntersectionObserver","observer","entries","some","entry","isIntersecting","root","rootMargin","observe","disconnect","ResizeObserver","rowsLength","nextHasMore","nextLoadingMore","queueMicrotask","fallback","description","noColumns","component","data-surface","data-has-footer","footer","data-overflow-x","data-overflow-y","data-scrollbar-enhanced","data-scrolling","onMouseLeave","_tmpl$7","ariaLabel","dataTable","density","scrollPreserveKey","fillHeight","stickyHeader","each","_tmpl$8","headerClass","render","_tmpl$9","empty","noRecords","isSelected","selected","has","selectedRowId","_tmpl$0","focused","_tmpl$1","cellClass","verticalAlign","renderCell","v","_tmpl$5","_tmpl$10","values","_tmpl$11","_tmpl$6","_tmpl$12","_$ssrStyleProperty","DataTablePanel","setHasHeading","context","registerHeading","Provider","as","DataTableHeader","_tmpl$13","_tmpl$14","actions","DataTableControls","DataTablePanelFooter","_tmpl$15","DataTable","Panel","Header","Controls","Footer"],"sources":["content/DataTable.tsx"],"sourcesContent":["import {\n type Accessor,\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n For,\n type JSX,\n onCleanup,\n onMount,\n Show,\n useContext,\n} from \"solid-js\";\nimport { Dynamic } from \"solid-js/web\";\nimport { useLocale } from \"../intl/locale\";\nimport { useUiMessages } from \"../intl/messages\";\nimport { PanelHeader } from \"../layout/PanelHeader\";\nimport { Paper } from \"../surfaces/Paper\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport type { CollectionSelection } from \"./collection-selection\";\n\nexport type DataTableColumn<T> = {\n id: string;\n header: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n subtitle?: JSX.Element | ((ctx: { col: DataTableColumn<T> }) => JSX.Element);\n value?: keyof T | ((row: T) => unknown);\n class?: string;\n headerClass?: string;\n cellClass?: string;\n /** Defaults to right for numeric values and left for everything else. */\n align?: \"left\" | \"center\" | \"right\";\n /**\n * Marks the column sortable. Pass a string when the server's sort key\n * differs from the column id — they often do, because one column can show a\n * rate while another sorts by the absolute count behind it.\n */\n sortable?: boolean | string;\n};\n\nexport type DataTableSort = { key: string; direction: \"asc\" | \"desc\" };\n\nexport type DataTableRenderCell<T> = (ctx: {\n row: T;\n col: DataTableColumn<T>;\n value: unknown;\n render: (value: unknown) => JSX.Element;\n}) => JSX.Element;\n\nexport type DataTableRenderHeader<T> = (ctx: { col: DataTableColumn<T>; render: () => JSX.Element }) => JSX.Element;\n\nexport type DataTableFooter<T> = {\n values?: Record<string, unknown>;\n renderCell?: (ctx: { col: DataTableColumn<T>; value: unknown; render: (value: unknown) => JSX.Element }) => JSX.Element;\n};\n\nexport type DataTableProps<T> = {\n rows: readonly T[];\n columns: readonly DataTableColumn<T>[];\n /** Accessible name for a standalone table region. Defaults to \"Data table\". */\n ariaLabel?: string;\n /** ID of a visible heading that labels the table region. Takes precedence over ariaLabel. */\n ariaLabelledBy?: string;\n getRowId?: (row: T) => string;\n /** Current server-side ordering, or null when the default applies. */\n sort?: DataTableSort | null;\n /**\n * Link target for a sortable header. Link-based because every admin table is\n * server-rendered: sorting is a query change, not client state.\n */\n sortHref?: (next: DataTableSort) => string;\n selectedRowId?: string | null;\n /** Optional multi-selection shared with another collection view. Requires getRowId. */\n selection?: CollectionSelection;\n rowClass?: string | ((row: T) => string | undefined);\n hoverRows?: boolean;\n onRowClick?: (row: T) => void;\n onRowDoubleClick?: (row: T) => void;\n onRowContextMenu?: (row: T) => void;\n renderCell?: DataTableRenderCell<T>;\n renderHeader?: DataTableRenderHeader<T>;\n footer?: DataTableFooter<T>;\n hasMore?: boolean;\n loadingMore?: boolean;\n onLoadMore?: () => void;\n empty?: JSX.Element;\n density?: \"compact\" | \"normal\";\n stickyHeader?: boolean;\n highlightColumns?: boolean;\n verticalAlign?: \"top\" | \"middle\" | \"bottom\";\n cellContentClass?: string;\n fillHeight?: boolean;\n /** Visual frame for a standalone table. Defaults preserve the legacy class-based behavior. */\n surface?: \"paper\" | \"plain\";\n class?: string;\n /** Additional classes for the table element. Core table geometry is always retained. */\n tableClass?: string;\n scrollPreserveKey?: string | false;\n};\n\nexport type DataTablePanelProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTableHeaderProps = {\n title: string;\n subtitle?: string;\n children?: JSX.Element;\n as?: \"h1\" | \"h2\" | \"h3\";\n size?: \"sm\" | \"md\";\n class?: string;\n};\n\nexport type DataTableControlsProps = {\n children: JSX.Element;\n class?: string;\n};\n\nexport type DataTablePanelFooterProps = {\n children: JSX.Element;\n class?: string;\n};\n\ntype DataTablePanelContextValue = {\n headingId: string;\n hasHeading: Accessor<boolean>;\n registerHeading: () => void;\n};\n\nconst DataTablePanelContext = createContext<DataTablePanelContextValue>();\n\nconst defaultRender = (value: unknown, locale: string, messages: ReturnType<ReturnType<typeof useUiMessages>>): JSX.Element => {\n if (value === null || value === undefined || value === \"\") return \"—\";\n if (value instanceof Date) return value.toLocaleString(locale);\n if (typeof value === \"boolean\") return value ? messages.yes : messages.no;\n if (typeof value === \"number\" || typeof value === \"bigint\") return String(value);\n if (typeof value === \"string\") return value;\n return JSON.stringify(value);\n};\n\nconst renderColumnPart = <T,>(\n part: DataTableColumn<T>[\"header\"] | DataTableColumn<T>[\"subtitle\"],\n col: DataTableColumn<T>,\n): JSX.Element => {\n if (typeof part === \"function\") return part({ col });\n return part;\n};\n\nconst rowInteractiveSelector = [\n \"a[href]\",\n \"button\",\n \"input\",\n \"label\",\n \"select\",\n \"textarea\",\n \"summary\",\n \"[contenteditable]\",\n \"[role='button']\",\n \"[role='checkbox']\",\n \"[role='link']\",\n \"[role='menuitem']\",\n \"[role='option']\",\n \"[role='radio']\",\n \"[role='switch']\",\n \"[role='tab']\",\n \"[tabindex]\",\n].join(\",\");\n\nconst isNestedRowControl = (event: Event): boolean =>\n event.target instanceof Element && event.target.closest(rowInteractiveSelector) !== event.currentTarget;\n\ntype DataTableScrollbarAxis = \"x\" | \"y\";\ntype DataTableScrollbarMetrics = { overflow: boolean; offset: number; size: number };\n\nconst scrollbarMetrics = (viewportSize: number, contentSize: number, scrollOffset: number): DataTableScrollbarMetrics => {\n if (viewportSize <= 0 || contentSize <= viewportSize + 1) return { overflow: false, offset: 0, size: 0 };\n const size = Math.min(viewportSize, Math.max(24, (viewportSize * viewportSize) / contentSize));\n const offset = (scrollOffset / (contentSize - viewportSize)) * (viewportSize - size);\n return { overflow: true, offset, size };\n};\n\nfunction DataTableRoot<T>(props: DataTableProps<T>) {\n const messages = useUiMessages();\n const locale = useLocale();\n const [hoveredColumn, setHoveredColumn] = createSignal<number | null>(null);\n const [scrollbars, setScrollbars] = createSignal<Record<DataTableScrollbarAxis, DataTableScrollbarMetrics>>({\n x: { overflow: false, offset: 0, size: 0 },\n y: { overflow: false, offset: 0, size: 0 },\n });\n const [scrollbarEnhanced, setScrollbarEnhanced] = createSignal(false);\n const [scrolling, setScrolling] = createSignal(false);\n const panel = useContext(DataTablePanelContext);\n let tableRef: HTMLTableElement | undefined;\n let scrollRef: HTMLDivElement | undefined;\n let loadMoreRef: HTMLDivElement | undefined;\n let scrollingTimeout: ReturnType<typeof setTimeout> | undefined;\n let scrollbarDragOffset = 0;\n let hasMore = false;\n let loadingMore = false;\n let onLoadMore: (() => void) | undefined;\n let loadMoreRequested = false;\n let previousRowsLength = props.rows.length;\n let previousLoadingMore = !!props.loadingMore;\n let previousHasMore = !!props.hasMore;\n const rowId = (row: T) => props.getRowId?.(row);\n const isInteractive = () => !!props.selection || !!props.onRowClick || !!props.onRowDoubleClick;\n const shouldHoverRows = () => props.hoverRows ?? isInteractive();\n const shouldRenderLoadMoreSentinel = () => !!props.onLoadMore;\n const labelledBy = () => props.ariaLabelledBy ?? (panel?.hasHeading() ? panel.headingId : undefined);\n const surface = () => props.surface ?? (props.class ? \"plain\" : \"paper\");\n const cellContentClass = () => props.cellContentClass ?? \"k2b-data-table__cell-text\";\n const tableClass = () => `k2b-data-table ${props.tableClass ?? \"\"}`.trim();\n const columnHighlighted = (index: number) =>\n props.highlightColumns !== false && shouldHoverRows() && hoveredColumn() === index ? \"true\" : undefined;\n const setHoveredColumnIfEnabled = (index: number) => {\n if (shouldHoverRows()) setHoveredColumn(index);\n };\n\n const isNearBottom = () => {\n if (!scrollRef) return false;\n return scrollRef.scrollTop + scrollRef.clientHeight >= scrollRef.scrollHeight - 240;\n };\n\n const maybeLoadMore = () => {\n if (!hasMore || loadingMore || loadMoreRequested || !onLoadMore) return;\n if (!isNearBottom()) return;\n loadMoreRequested = true;\n try {\n onLoadMore();\n } catch (error) {\n loadMoreRequested = false;\n throw error;\n }\n };\n\n const syncScrollbars = () => {\n if (!scrollRef) return;\n setScrollbars({\n x: scrollbarMetrics(scrollRef.clientWidth, scrollRef.scrollWidth, scrollRef.scrollLeft),\n y: scrollbarMetrics(scrollRef.clientHeight, scrollRef.scrollHeight, scrollRef.scrollTop),\n });\n };\n\n const revealScrollbars = () => {\n setScrolling(true);\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n scrollingTimeout = setTimeout(() => {\n setScrolling(false);\n scrollingTimeout = undefined;\n }, 700);\n };\n\n const onScroll = () => {\n syncScrollbars();\n revealScrollbars();\n maybeLoadMore();\n };\n\n const scrollFromPointer = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n if (!scrollRef) return;\n const track = event.currentTarget;\n const metrics = scrollbars()[axis];\n const rect = track.getBoundingClientRect();\n const trackSize = axis === \"y\" ? rect.height : rect.width;\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n const available = Math.max(1, trackSize - metrics.size);\n const thumbOffset = Math.min(available, Math.max(0, pointerOffset - scrollbarDragOffset));\n const maxScroll = axis === \"y\" ? scrollRef.scrollHeight - scrollRef.clientHeight : scrollRef.scrollWidth - scrollRef.clientWidth;\n if (axis === \"y\") scrollRef.scrollTop = (thumbOffset / available) * maxScroll;\n else scrollRef.scrollLeft = (thumbOffset / available) * maxScroll;\n syncScrollbars();\n revealScrollbars();\n };\n\n const startScrollbarDrag = (event: PointerEvent & { currentTarget: HTMLDivElement }, axis: DataTableScrollbarAxis) => {\n event.preventDefault();\n const metrics = scrollbars()[axis];\n const rect = event.currentTarget.getBoundingClientRect();\n const pointerOffset = axis === \"y\" ? event.clientY - rect.top : event.clientX - rect.left;\n scrollbarDragOffset =\n event.target === event.currentTarget ? metrics.size / 2 : Math.min(metrics.size, Math.max(0, pointerOffset - metrics.offset));\n event.currentTarget.setPointerCapture(event.pointerId);\n scrollFromPointer(event, axis);\n };\n\n const valueOf = (row: T, col: DataTableColumn<T>) => {\n if (typeof col.value === \"function\") return col.value(row);\n if (col.value) return row[col.value];\n return undefined;\n };\n\n const columnAlignments = createMemo(() => {\n const alignments = new Map<string, NonNullable<DataTableColumn<T>[\"align\"]>>();\n for (const col of props.columns) {\n if (col.align) {\n alignments.set(col.id, col.align);\n continue;\n }\n let align: NonNullable<DataTableColumn<T>[\"align\"]> = \"left\";\n for (const row of props.rows) {\n const value = valueOf(row, col);\n if (value === null || value === undefined || value === \"\") continue;\n align = typeof value === \"number\" || typeof value === \"bigint\" ? \"right\" : \"left\";\n break;\n }\n alignments.set(col.id, align);\n }\n return alignments;\n });\n\n /** `data-align` mirrors Cloud's `text-left/center/right` on the same cell. */\n const alignAttr = (col: DataTableColumn<T>) => {\n const align = columnAlignments().get(col.id) ?? \"left\";\n return align === \"left\" ? undefined : align;\n };\n\n const sortKeyOf = (col: DataTableColumn<T>): string | null =>\n col.sortable === true ? col.id : typeof col.sortable === \"string\" ? col.sortable : null;\n\n /**\n * Sorting is a link, not a handler: these tables are server-rendered, so the\n * order belongs in the URL. Clicking the active column flips its direction.\n */\n const sortLinkFor = (col: DataTableColumn<T>): { href: string; active: boolean; direction: \"asc\" | \"desc\" } | null => {\n const key = sortKeyOf(col);\n if (!key || !props.sortHref) return null;\n const active = props.sort?.key === key;\n const direction: \"asc\" | \"desc\" = active && props.sort?.direction === \"desc\" ? \"asc\" : \"desc\";\n return { href: props.sortHref({ key, direction }), active, direction };\n };\n\n /** Only a sortable column carries a sort state; the rest carry none at all. */\n const ariaSortFor = (col: DataTableColumn<T>): \"ascending\" | \"descending\" | \"none\" | undefined => {\n const key = sortKeyOf(col);\n if (!key || (!props.sortHref && !props.renderHeader)) return undefined;\n if (props.sort?.key !== key) return \"none\";\n return props.sort?.direction === \"asc\" ? \"ascending\" : \"descending\";\n };\n\n const renderHeaderDefault = (col: DataTableColumn<T>): JSX.Element => {\n const sort = sortLinkFor(col);\n const title = (\n <>\n <span class=\"k2b-data-table__header-title\">{renderColumnPart(col.header, col)}</span>\n <Show when={col.subtitle !== undefined}>\n <span class=\"k2b-data-table__header-subtitle\">{renderColumnPart(col.subtitle, col)}</span>\n </Show>\n </>\n );\n\n if (!sort)\n return (\n <div class=\"k2b-data-table__header-content\" data-align={alignAttr(col)}>\n {title}\n </div>\n );\n\n return (\n <a href={sort.href} class=\"k2b-data-table__header-content k2b-data-table__sort\" data-align={alignAttr(col)}>\n <span class=\"k2b-data-table__header-line\">\n {title}\n {/* Inactive columns keep a dimmed marker so the row reads as sortable. */}\n <i\n class={`k2b-data-table__sort-icon ti ${props.sort?.direction === \"asc\" && sort.active ? \"ti-arrow-up\" : \"ti-arrow-down\"}`}\n data-active={sort.active ? \"true\" : undefined}\n aria-hidden=\"true\"\n />\n </span>\n </a>\n );\n };\n\n const renderValueDefault = (value: unknown) => defaultRender(value, locale(), messages());\n const renderCellDefault = (row: T, col: DataTableColumn<T>) => renderValueDefault(valueOf(row, col));\n\n const onRowKeyDown = (event: KeyboardEvent, row: T) => {\n if (!isInteractive()) return;\n if (isNestedRowControl(event)) return;\n const id = rowId(row);\n if (id !== undefined && props.selection?.keyDown(event, id)) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n (props.selection ? props.onRowDoubleClick : (props.onRowClick ?? props.onRowDoubleClick))?.(row);\n };\n\n const onRowClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n const id = rowId(row);\n if (id !== undefined) props.selection?.select(id, event);\n props.onRowClick?.(row);\n };\n\n const onRowDoubleClick = (event: MouseEvent, row: T) => {\n if (isNestedRowControl(event)) return;\n props.onRowDoubleClick?.(row);\n };\n\n const rowClass = (row: T) => {\n if (typeof props.rowClass === \"function\") return props.rowClass(row) ?? \"\";\n return props.rowClass ?? \"\";\n };\n\n onMount(() => {\n if (typeof IntersectionObserver === \"undefined\" || !scrollRef || !loadMoreRef) return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) maybeLoadMore();\n },\n { root: scrollRef, rootMargin: \"240px\" },\n );\n observer.observe(loadMoreRef);\n onCleanup(() => observer.disconnect());\n });\n\n onMount(() => {\n setScrollbarEnhanced(true);\n syncScrollbars();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(syncScrollbars);\n if (scrollRef) observer?.observe(scrollRef);\n if (tableRef) observer?.observe(tableRef);\n onCleanup(() => {\n observer?.disconnect();\n if (scrollingTimeout !== undefined) clearTimeout(scrollingTimeout);\n });\n });\n\n createEffect(() => {\n const rowsLength = props.rows.length;\n const nextHasMore = !!props.hasMore;\n const nextLoadingMore = !!props.loadingMore;\n if (rowsLength !== previousRowsLength || (previousLoadingMore && !nextLoadingMore) || (!previousHasMore && nextHasMore)) {\n loadMoreRequested = false;\n }\n previousRowsLength = rowsLength;\n previousLoadingMore = nextLoadingMore;\n previousHasMore = nextHasMore;\n hasMore = nextHasMore;\n loadingMore = nextLoadingMore;\n onLoadMore = props.onLoadMore;\n maybeLoadMore();\n queueMicrotask(syncScrollbars);\n });\n\n return (\n <Show when={props.columns.length > 0} fallback={<Placeholder surface=\"paper\" description={<>{messages().noColumns}</>} />}>\n <Dynamic\n component={surface() === \"paper\" ? Paper : \"div\"}\n class={`k2b-table-shell ${props.class ?? \"\"}`}\n data-surface={surface()}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-overflow-x={scrollbars().x.overflow ? \"true\" : undefined}\n data-overflow-y={scrollbars().y.overflow ? \"true\" : undefined}\n data-scrollbar-enhanced={scrollbarEnhanced() ? \"true\" : undefined}\n data-scrolling={scrolling() ? \"true\" : undefined}\n onMouseLeave={() => setHoveredColumn(null)}\n >\n <div\n ref={scrollRef}\n role=\"region\"\n aria-label={labelledBy() ? undefined : (props.ariaLabel ?? messages().dataTable)}\n aria-labelledby={labelledBy()}\n tabIndex={0}\n class=\"k2b-table-wrap\"\n data-density={props.density === \"compact\" ? \"compact\" : undefined}\n data-has-footer={props.footer ? \"true\" : undefined}\n data-surface={surface()}\n data-scroll-preserve={props.scrollPreserveKey || undefined}\n onScroll={onScroll}\n >\n <table ref={tableRef} class={tableClass()} data-fill={props.fillHeight ? \"true\" : undefined}>\n <thead class=\"k2b-data-table__head\" data-sticky={props.stickyHeader === false ? undefined : \"true\"}>\n <tr class=\"k2b-data-table__head-row\">\n <For each={props.columns}>\n {(col, index) => (\n <th\n scope=\"col\"\n class={`${col.headerClass ?? \"\"} ${col.class ?? \"\"}`}\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n aria-sort={ariaSortFor(col)}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {props.renderHeader ? props.renderHeader({ col, render: () => renderHeaderDefault(col) }) : renderHeaderDefault(col)}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <Show\n when={props.rows.length > 0}\n fallback={\n <tr>\n <td class=\"k2b-data-table__empty\" colspan={props.columns.length}>\n <Placeholder description={<>{props.empty ?? messages().noRecords}</>} />\n </td>\n </tr>\n }\n >\n <For each={props.rows}>\n {(row) => {\n const id = () => rowId(row);\n const isSelected = () =>\n props.selection ? props.selection.selected().has(id() ?? \"\") : props.selectedRowId && id() === props.selectedRowId;\n return (\n <tr\n ref={(element) => {\n const key = id();\n if (key !== undefined) props.selection?.register(key, element);\n }}\n class={`k2b-data-table__row ${rowClass(row)}`}\n data-hover={shouldHoverRows() ? \"true\" : undefined}\n data-clickable={shouldHoverRows() && isInteractive() ? \"true\" : undefined}\n data-selected={isSelected() ? \"true\" : undefined}\n aria-selected={props.selection ? !!isSelected() : undefined}\n tabIndex={props.selection ? (props.selection.focused() === id() ? 0 : -1) : isInteractive() ? 0 : undefined}\n onFocus={() => {\n const key = id();\n if (key !== undefined) props.selection?.markFocused(key);\n }}\n onClick={(event) => onRowClick(event, row)}\n onDblClick={(event) => onRowDoubleClick(event, row)}\n onContextMenu={() => props.onRowContextMenu?.(row)}\n onKeyDown={(e) => onRowKeyDown(e, row)}\n >\n <For each={props.columns}>\n {(col, index) => {\n const value = () => valueOf(row, col);\n return (\n <td\n class={`${col.cellClass ?? \"\"} ${col.class ?? \"\"}`}\n data-align={alignAttr(col)}\n data-valign={props.verticalAlign && props.verticalAlign !== \"middle\" ? props.verticalAlign : undefined}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n <div class={cellContentClass()}>\n {props.renderCell\n ? props.renderCell({\n row,\n col,\n value: value(),\n render: (v) => renderCellDefault(row, { ...col, value: () => v }),\n })\n : renderValueDefault(value())}\n </div>\n </td>\n );\n }}\n </For>\n </tr>\n );\n }}\n </For>\n <Show when={props.fillHeight}>\n <tr aria-hidden=\"true\">\n <td class=\"k2b-data-table__fill\" colspan={props.columns.length} />\n </tr>\n </Show>\n </Show>\n </tbody>\n <Show when={props.footer}>\n {(footer) => (\n <tfoot class=\"k2b-data-table__foot\" data-sticky=\"true\">\n <tr class=\"k2b-data-table__foot-row\">\n <For each={props.columns}>\n {(col, index) => {\n const value = () => footer().values?.[col.id];\n return (\n <td\n class=\"k2b-data-table__footer-cell\"\n data-align={alignAttr(col)}\n data-highlighted={columnHighlighted(index())}\n onMouseEnter={() => setHoveredColumnIfEnabled(index())}\n >\n {footer().renderCell\n ? footer().renderCell!({ col, value: value(), render: renderValueDefault })\n : renderValueDefault(value())}\n </td>\n );\n }}\n </For>\n </tr>\n </tfoot>\n )}\n </Show>\n </table>\n <Show when={shouldRenderLoadMoreSentinel()}>\n <div ref={loadMoreRef} class=\"k2b-data-table__sentinel\" aria-hidden=\"true\" />\n </Show>\n </div>\n <For each={[\"y\", \"x\"] as const}>\n {(axis) => (\n <div\n class=\"k2b-data-table__scrollbar\"\n data-axis={axis}\n data-overflow={scrollbars()[axis].overflow ? \"true\" : undefined}\n aria-hidden=\"true\"\n onPointerDown={(event) => startScrollbarDrag(event, axis)}\n onPointerMove={(event) => {\n if (event.currentTarget.hasPointerCapture(event.pointerId)) scrollFromPointer(event, axis);\n }}\n onPointerUp={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n onPointerCancel={(event) => event.currentTarget.releasePointerCapture(event.pointerId)}\n >\n <span\n style={{\n \"--k2b-data-table-scroll-offset\": `${scrollbars()[axis].offset}px`,\n \"--k2b-data-table-scroll-size\": `${scrollbars()[axis].size}px`,\n }}\n />\n </div>\n )}\n </For>\n </Dynamic>\n </Show>\n );\n}\n\nconst DataTablePanel = (props: DataTablePanelProps): JSX.Element => {\n const headingId = `k2b-data-table-${createUniqueId()}-heading`;\n const [hasHeading, setHasHeading] = createSignal(false);\n const context: DataTablePanelContextValue = {\n headingId,\n hasHeading,\n registerHeading: () => setHasHeading(true),\n };\n\n return (\n <DataTablePanelContext.Provider value={context}>\n <Paper as=\"section\" class={`k2b-data-panel ${props.class ?? \"\"}`}>\n {props.children}\n </Paper>\n </DataTablePanelContext.Provider>\n );\n};\n\nconst DataTableHeader = (props: DataTableHeaderProps): JSX.Element => {\n const panel = useContext(DataTablePanelContext);\n panel?.registerHeading();\n\n return (\n <div class={`k2b-data-panel__header ${props.class ?? \"\"}`}>\n <PanelHeader\n title={<span id={panel?.headingId}>{props.title}</span>}\n subtitle={props.subtitle}\n actions={props.children}\n as={props.as}\n size={props.size}\n />\n </div>\n );\n};\n\nconst DataTableControls = (props: DataTableControlsProps): JSX.Element => (\n <div class={`k2b-data-panel__controls ${props.class ?? \"\"}`}>{props.children}</div>\n);\n\nconst DataTablePanelFooter = (props: DataTablePanelFooterProps): JSX.Element => (\n <footer class={`k2b-data-panel__footer ${props.class ?? \"\"}`}>{props.children}</footer>\n);\n\ntype DataTableComponent = {\n <T>(props: DataTableProps<T>): JSX.Element;\n Panel: (props: DataTablePanelProps) => JSX.Element;\n Header: (props: DataTableHeaderProps) => JSX.Element;\n Controls: (props: DataTableControlsProps) => JSX.Element;\n Footer: (props: DataTablePanelFooterProps) => JSX.Element;\n};\n\nconst DataTable = DataTableRoot as DataTableComponent;\nDataTable.Panel = DataTablePanel;\nDataTable.Header = DataTableHeader;\nDataTable.Controls = DataTableControls;\nDataTable.Footer = DataTablePanelFooter;\n\nexport default DataTable;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -355,6 +355,9 @@ export function FileBrowserPanel(props) {
|
|
|
355
355
|
return selectedEntry();
|
|
356
356
|
},
|
|
357
357
|
children: entry => _$createComponent(FileView, {
|
|
358
|
+
get previewPreferencesKey() {
|
|
359
|
+
return props.source.previewPreferencesKey;
|
|
360
|
+
},
|
|
358
361
|
get file() {
|
|
359
362
|
return {
|
|
360
363
|
path: entry().path,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createZip","downloadFileFromContent","mutation","createEffect","createMemo","createResource","createSignal","Match","onCleanup","Show","Switch","untrack","Dropdown","dialogCore","prompts","resolveUiMessages","useUiMessages","PanelDialog","panelDialogOptions","Placeholder","FileTree","FileView","parentOf","path","index","lastIndexOf","slice","FileBrowserPanel","props","messages","entries","refetch","source","list","selectedPath","setSelectedPath","initialPath","selectedDirty","setSelectedDirty","pendingFolders","setPendingFolders","uploadInputRef","uploadDir","previousRefreshKey","refreshKey","refreshPreview","undefined","registerRefresh","unregister","Promise","all","next","onSelectedPathChange","Object","is","allEntries","loaded","real","Set","map","entry","filter","has","kind","selectedEntry","find","fileMutation","create","work","onSuccess","onError","error","message","pathMutable","loading","readOnly","isReadOnly","pathWritable","Boolean","write","run","mutate","canLeaveCurrent","nextPath","current","confirmed","confirmDiscard","confirm","discardUnsavedFile","title","discardChanges","variant","selectPath","removeFile","remove","folders","candidate","startsWith","selected","renameFile","nextName","target","rename","createFile","dirPath","name","prompt","newFileName","newFile","trim","includes","createFolder","newFolderName","newFolder","pickUpload","click","onUploadPicked","input","files","Array","from","value","length","upload","baseName","filesBehind","some","prefix","moveEntry","targetDir","destBase","file","contentBytes","content","read","encoding","TextEncoder","encode","Uint8Array","atob","char","charCodeAt","downloadEntry","isFolder","href","downloadHref","anchor","document","createElement","download","mediaType","Error","folderEmpty","zipEntries","filename","downloadFailed","treeActions","dir","move","addMenuItems","icon","label","action","uploadFiles","_$ssr","_tmpl$3","_$escape","class","_$ssrAttribute","_$createComponent","when","children","Root","position","items","addFileFolderUpload","Trigger","appearance","add","_tmpl$","_tmpl$2","loadingFiles","failedLoadFiles","description","String","onSelect","actions","noFiles","spaceEmpty","fallback","selectFile","pickFileFromTree","folderSelected","chooseFileToPreview","size","load","revision","refresh","renderers","onDirtyChange","save","openFileBrowser","options","open","close","Header","subtitle","Body"],"sources":["content/FileBrowser.tsx"],"sourcesContent":["/**\n * FileBrowser — FileTree + FileView over a FileSource adapter. One dialog\n * serves every file surface (conversation VFS, skills, later the Files app):\n * the source decides the capabilities, optional methods enable the matching\n * UI (write → edit/save, remove → delete, rename → rename, upload → upload).\n * Fixed-height IDE-style layout: both panes scroll, the shell never jumps.\n */\nimport { createZip, downloadFileFromContent } from \"@k2b/stdlib/browser\";\nimport { mutation } from \"@k2b/stdlib/solid\";\nimport { createEffect, createMemo, createResource, createSignal, Match, onCleanup, Show, Switch, untrack } from \"solid-js\";\nimport Dropdown from \"../actions/Dropdown\";\nimport { dialogCore } from \"../feedback/dialog-core\";\nimport { prompts } from \"../feedback/prompts\";\nimport { resolveUiMessages, useUiMessages } from \"../intl/messages\";\nimport PanelDialog, { panelDialogOptions } from \"../layout/PanelDialog\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport FileTree, { type FileTreeEntry } from \"./FileTree\";\nimport FileView, { type FileViewContent, type FileViewRenderer } from \"./FileView\";\n\nexport type FileSource = {\n list(): Promise<FileTreeEntry[]>;\n read(path: string): Promise<FileViewContent>;\n write?(path: string, content: string, encoding?: \"utf8\" | \"base64\"): Promise<void>;\n remove?(path: string): Promise<void>;\n rename?(from: string, to: string): Promise<void>;\n upload?(dirPath: string, files: File[]): Promise<void>;\n downloadHref?(path: string): string | null;\n /** Paths matching this predicate stay read-only even when the source can write (e.g. /input). */\n isReadOnly?(path: string): boolean;\n};\n\nexport type FileBrowserPanelProps = {\n source: FileSource;\n /** Hide every mutating affordance while retaining file selection and downloads. */\n readOnly?: boolean;\n /** Refetch entries when this host-controlled value changes. */\n refreshKey?: unknown;\n /** Preselect a file once entries are loaded. */\n initialPath?: string;\n /** Mirrors file selection into route state when the host needs durable navigation. */\n onSelectedPathChange?: (path: string | null) => void;\n /** Per-instance preview extensions forwarded to FileView. */\n renderers?: readonly FileViewRenderer[];\n /** Optional host copy/policy for leaving an unsaved file. */\n confirmDiscard?: (path: string, nextPath: string | null) => boolean | Promise<boolean>;\n /** Fixed shell height — the panes scroll inside it. */\n class?: string;\n /** Optional imperative refresh used by realtime owners that must await the visible update. */\n registerRefresh?: (refresh: () => Promise<void>) => void | (() => void);\n};\n\nconst parentOf = (path: string): string => {\n const index = path.lastIndexOf(\"/\");\n return index <= 0 ? \"/\" : path.slice(0, index);\n};\n\nexport function FileBrowserPanel(props: FileBrowserPanelProps) {\n const messages = useUiMessages();\n // FileSource is an imperative adapter. Its methods may read host signals,\n // but refreshes stay owned by this component (`refetch` / `refreshKey`);\n // tracking those implementation details can otherwise feed a write back\n // into its own list request indefinitely.\n const [entries, { refetch }] = createResource(async () => untrack(() => props.source.list()));\n const [selectedPath, setSelectedPath] = createSignal<string | null>(props.initialPath ?? null);\n const [selectedDirty, setSelectedDirty] = createSignal(false);\n // Folders exist implicitly through file paths — freshly created (still empty)\n // ones live here until their first file makes them real.\n const [pendingFolders, setPendingFolders] = createSignal<string[]>([]);\n let uploadInputRef: HTMLInputElement | undefined;\n let uploadDir = \"/\";\n let previousRefreshKey = props.refreshKey;\n let refreshPreview = async (): Promise<void> => undefined;\n\n createEffect(() => {\n if (!props.registerRefresh) return;\n const unregister = props.registerRefresh(async () => {\n await Promise.all([refetch(), refreshPreview()]);\n });\n if (unregister) onCleanup(unregister);\n });\n\n createEffect(() => {\n const next = props.initialPath ?? null;\n if (!selectedDirty() && next !== selectedPath()) setSelectedPath(next);\n });\n createEffect(() => props.onSelectedPathChange?.(selectedPath()));\n createEffect(() => {\n const refreshKey = props.refreshKey;\n if (Object.is(refreshKey, previousRefreshKey)) return;\n previousRefreshKey = refreshKey;\n void refetch();\n });\n\n const allEntries = createMemo<FileTreeEntry[]>(() => {\n const loaded = entries() ?? [];\n const real = new Set(loaded.map((entry) => entry.path));\n return [\n ...loaded,\n ...pendingFolders()\n .filter((path) => !real.has(path))\n .map((path) => ({ path, kind: \"folder\" as const })),\n ];\n });\n const selectedEntry = createMemo(() => allEntries().find((entry) => entry.path === selectedPath()) ?? null);\n const fileMutation = mutation.create<void, () => Promise<void>>({\n mutation: (work) => work(),\n onSuccess: () => void refetch(),\n onError: (error) => void prompts.error(error.message),\n });\n const pathMutable = (path: string) => !fileMutation.loading() && !props.readOnly && !props.source.isReadOnly?.(path);\n const pathWritable = (path: string) => pathMutable(path) && Boolean(props.source.write);\n const run = (work: () => Promise<void>) => void fileMutation.mutate(work);\n const canLeaveCurrent = async (nextPath: string | null): Promise<boolean> => {\n const current = selectedPath();\n if (nextPath === current || !selectedDirty() || !current) return true;\n if (selectedDirty() && current) {\n const confirmed = props.confirmDiscard\n ? await props.confirmDiscard(current, nextPath)\n : await prompts.confirm(messages().discardUnsavedFile, {\n title: messages().discardChanges,\n variant: \"danger\",\n });\n if (!confirmed) return false;\n }\n return true;\n };\n const selectPath = async (nextPath: string | null) => {\n if (!(await canLeaveCurrent(nextPath))) return;\n setSelectedDirty(false);\n setSelectedPath(nextPath);\n };\n\n const removeFile = (path: string) =>\n run(async () => {\n const confirmed = await prompts.confirm(`Delete ${path}?`, { title: \"Delete file\", variant: \"danger\" });\n if (!confirmed) return;\n await props.source.remove!(path);\n setPendingFolders((folders) => folders.filter((candidate) => candidate !== path && !candidate.startsWith(`${path}/`)));\n const selected = selectedPath();\n if (selected === path || selected?.startsWith(`${path}/`)) setSelectedPath(null);\n });\n\n const renameFile = (path: string, nextName: string) =>\n run(async () => {\n const target = `${parentOf(path) === \"/\" ? \"\" : parentOf(path)}/${nextName}`;\n await props.source.rename!(path, target);\n if (selectedPath() === path) setSelectedPath(target);\n });\n\n const createFile = (dirPath: string) =>\n run(async () => {\n const name = await prompts.prompt(messages().newFileName, \"\", { title: messages().newFile });\n if (!name || typeof name !== \"string\" || !name.trim() || name.includes(\"/\")) return;\n const path = `${dirPath === \"/\" ? \"\" : dirPath}/${name.trim()}`;\n if (!(await canLeaveCurrent(path))) return;\n await props.source.write!(path, \"\");\n setSelectedDirty(false);\n setSelectedPath(path);\n });\n\n const createFolder = (dirPath: string) =>\n void (async () => {\n const name = await prompts.prompt(messages().newFolderName, \"\", { title: messages().newFolder });\n if (!name || typeof name !== \"string\" || !name.trim() || name.includes(\"/\")) return;\n const path = `${dirPath === \"/\" ? \"\" : dirPath}/${name.trim()}`;\n setPendingFolders((folders) => [...folders, path]);\n })();\n\n const pickUpload = (dirPath: string) => {\n uploadDir = dirPath;\n uploadInputRef?.click();\n };\n\n const onUploadPicked = (input: HTMLInputElement) => {\n const files = Array.from(input.files ?? []);\n input.value = \"\";\n if (files.length > 0) run(() => props.source.upload!(uploadDir, files));\n };\n\n const baseName = (path: string) => path.slice(path.lastIndexOf(\"/\") + 1);\n\n /** Concrete file paths behind an entry: the file itself, or everything under a folder. */\n const filesBehind = (path: string): string[] => {\n const list = entries() ?? [];\n if (list.some((entry) => entry.path === path && entry.kind !== \"folder\")) return [path];\n const prefix = `${path}/`;\n return list.filter((entry) => entry.path.startsWith(prefix) && entry.kind !== \"folder\").map((entry) => entry.path);\n };\n\n /** Move a file OR a whole folder subtree (per-file renames preserve the structure). */\n const moveEntry = (path: string, targetDir: string) =>\n run(async () => {\n const destBase = `${targetDir === \"/\" ? \"\" : targetDir}/${baseName(path)}`;\n const files = filesBehind(path);\n if (files.length === 0) {\n // Still-empty pending folder — relocating it is a purely local affair.\n setPendingFolders((folders) => folders.map((candidate) => (candidate === path ? destBase : candidate)));\n return;\n }\n for (const file of files) {\n await props.source.rename!(file, `${destBase}${file.slice(path.length)}`);\n }\n const selected = selectedPath();\n if (selected && (selected === path || selected.startsWith(`${path}/`))) {\n setSelectedPath(`${destBase}${selected.slice(path.length)}`);\n }\n });\n\n const contentBytes = async (path: string): Promise<Uint8Array> => {\n const content = await props.source.read(path);\n return content.encoding === \"utf8\"\n ? new TextEncoder().encode(content.content)\n : Uint8Array.from(atob(content.content), (char) => char.charCodeAt(0));\n };\n\n const downloadEntry = (path: string, isFolder: boolean) =>\n void (async () => {\n try {\n if (!isFolder) {\n const href = props.source.downloadHref?.(path);\n if (href) {\n const anchor = document.createElement(\"a\");\n anchor.href = href;\n anchor.download = baseName(path);\n anchor.click();\n return;\n }\n const content = await props.source.read(path);\n downloadFileFromContent(await contentBytes(path), baseName(path), content.mediaType || \"application/octet-stream\");\n return;\n }\n const files = filesBehind(path);\n if (files.length === 0) throw new Error(messages().folderEmpty);\n const zipEntries = await Promise.all(\n files.map(async (file) => ({ filename: file.slice(path.length + 1), source: await contentBytes(file) })),\n );\n downloadFileFromContent(await createZip(zipEntries), `${baseName(path) || \"files\"}.zip`, \"application/zip\");\n } catch (error) {\n void prompts.error(error instanceof Error ? error.message : messages().downloadFailed);\n }\n })();\n\n const treeActions = () => ({\n ...(!props.readOnly && props.source.rename\n ? { rename: (path: string, next: string) => (pathMutable(path) ? renameFile(path, next) : undefined) }\n : {}),\n ...(!props.readOnly && props.source.remove ? { remove: (path: string) => (pathMutable(path) ? removeFile(path) : undefined) } : {}),\n ...(!props.readOnly && props.source.write ? { createFile: (dir: string) => (pathWritable(dir) ? createFile(dir) : undefined) } : {}),\n ...(!props.readOnly && props.source.write\n ? { createFolder: (dir: string) => (pathWritable(dir) ? createFolder(dir) : undefined) }\n : {}),\n ...(!props.readOnly && props.source.rename\n ? { move: (path: string, dir: string) => (pathMutable(path) && pathMutable(dir) ? moveEntry(path, dir) : undefined) }\n : {}),\n download: (path: string, isFolder: boolean) => downloadEntry(path, isFolder),\n });\n\n const addMenuItems = () => [\n ...(pathWritable(\"/\") ? [{ icon: \"ti ti-file-plus\", label: messages().newFile, action: () => createFile(\"/\") }] : []),\n ...(pathWritable(\"/\") ? [{ icon: \"ti ti-folder-plus\", label: messages().newFolder, action: () => createFolder(\"/\") }] : []),\n ...(pathMutable(\"/\") && props.source.upload\n ? [{ icon: \"ti ti-upload\", label: messages().uploadFiles, action: () => pickUpload(\"/\") }]\n : []),\n ];\n\n return (\n <div class={`k2b-content-file-browser ${props.class ?? \"\"}`} data-default-height={props.class ? undefined : \"true\"}>\n <div class=\"k2b-content-file-browser__sidebar\">\n <div class=\"k2b-content-file-browser__header\">\n <p class=\"k2b-content-file-browser__title\">{messages().files}</p>\n <Show when={addMenuItems().length > 0}>\n <Dropdown.Root position=\"bottom-left\" items={addMenuItems()} label={messages().addFileFolderUpload}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-content-file-browser__add\"\n label={messages().addFileFolderUpload}\n title={messages().add}\n >\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{messages().addFileFolderUpload}</span>\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </div>\n <Switch>\n <Match when={entries.loading && entries() === undefined}>\n <Placeholder icon=\"ti ti-loader-2\" title={messages().loadingFiles} />\n </Match>\n <Match when={entries.error}>\n <Placeholder\n icon=\"ti ti-alert-circle\"\n title={messages().failedLoadFiles}\n description={String(entries.error?.message ?? entries.error ?? \"\")}\n />\n </Match>\n <Match when={allEntries().length > 0}>\n <FileTree\n class=\"k2b-content-file-browser__tree\"\n entries={allEntries()}\n selectedPath={selectedPath()}\n onSelect={(entry) => void selectPath(entry.path)}\n actions={treeActions()}\n />\n </Match>\n <Match when={true}>\n <Placeholder icon=\"ti ti-folder-open\" title={messages().noFiles} description={messages().spaceEmpty} />\n </Match>\n </Switch>\n <input\n ref={uploadInputRef}\n type=\"file\"\n multiple\n class=\"k2b-content-file-browser__upload\"\n onChange={(event) => onUploadPicked(event.currentTarget)}\n />\n </div>\n\n <Switch fallback={<Placeholder icon=\"ti ti-file\" title={messages().selectFile} description={messages().pickFileFromTree} />}>\n <Match when={selectedEntry()?.kind === \"folder\"}>\n <Placeholder icon=\"ti ti-folder\" title={messages().folderSelected} description={messages().chooseFileToPreview} />\n </Match>\n <Match when={selectedEntry()}>\n {(entry) => (\n <FileView\n file={{ path: entry().path, mediaType: entry().mediaType, size: entry().size }}\n load={() => props.source.read(entry().path)}\n revision={props.refreshKey}\n registerRefresh={(refresh) => {\n refreshPreview = refresh;\n return () => {\n refreshPreview = async () => undefined;\n };\n }}\n renderers={props.renderers}\n onDirtyChange={setSelectedDirty}\n save={\n pathWritable(entry().path)\n ? async (content) => {\n await props.source.write!(entry().path, content);\n await refetch();\n }\n : undefined\n }\n downloadHref={props.source.downloadHref?.(entry().path) ?? null}\n />\n )}\n </Match>\n </Switch>\n </div>\n );\n}\n\n/** Open the file browser as a dialog. Returns when the dialog closes. */\nexport const openFileBrowser = (options: { source: FileSource; title?: string; subtitle?: string; icon?: string }): Promise<void> => {\n const messages = resolveUiMessages();\n return dialogCore.open<void>(\n (close) => (\n <PanelDialog>\n <PanelDialog.Header\n title={options.title ?? messages.files}\n subtitle={options.subtitle}\n icon={options.icon ?? \"ti ti-folder\"}\n close={() => close()}\n />\n <PanelDialog.Body>\n <FileBrowserPanel source={options.source} />\n </PanelDialog.Body>\n </PanelDialog>\n ),\n panelDialogOptions,\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["createZip","downloadFileFromContent","mutation","createEffect","createMemo","createResource","createSignal","Match","onCleanup","Show","Switch","untrack","Dropdown","dialogCore","prompts","resolveUiMessages","useUiMessages","PanelDialog","panelDialogOptions","Placeholder","FileTree","FileView","parentOf","path","index","lastIndexOf","slice","FileBrowserPanel","props","messages","entries","refetch","source","list","selectedPath","setSelectedPath","initialPath","selectedDirty","setSelectedDirty","pendingFolders","setPendingFolders","uploadInputRef","uploadDir","previousRefreshKey","refreshKey","refreshPreview","undefined","registerRefresh","unregister","Promise","all","next","onSelectedPathChange","Object","is","allEntries","loaded","real","Set","map","entry","filter","has","kind","selectedEntry","find","fileMutation","create","work","onSuccess","onError","error","message","pathMutable","loading","readOnly","isReadOnly","pathWritable","Boolean","write","run","mutate","canLeaveCurrent","nextPath","current","confirmed","confirmDiscard","confirm","discardUnsavedFile","title","discardChanges","variant","selectPath","removeFile","remove","folders","candidate","startsWith","selected","renameFile","nextName","target","rename","createFile","dirPath","name","prompt","newFileName","newFile","trim","includes","createFolder","newFolderName","newFolder","pickUpload","click","onUploadPicked","input","files","Array","from","value","length","upload","baseName","filesBehind","some","prefix","moveEntry","targetDir","destBase","file","contentBytes","content","read","encoding","TextEncoder","encode","Uint8Array","atob","char","charCodeAt","downloadEntry","isFolder","href","downloadHref","anchor","document","createElement","download","mediaType","Error","folderEmpty","zipEntries","filename","downloadFailed","treeActions","dir","move","addMenuItems","icon","label","action","uploadFiles","_$ssr","_tmpl$3","_$escape","class","_$ssrAttribute","_$createComponent","when","children","Root","position","items","addFileFolderUpload","Trigger","appearance","add","_tmpl$","_tmpl$2","loadingFiles","failedLoadFiles","description","String","onSelect","actions","noFiles","spaceEmpty","fallback","selectFile","pickFileFromTree","folderSelected","chooseFileToPreview","previewPreferencesKey","size","load","revision","refresh","renderers","onDirtyChange","save","openFileBrowser","options","open","close","Header","subtitle","Body"],"sources":["content/FileBrowser.tsx"],"sourcesContent":["/**\n * FileBrowser — FileTree + FileView over a FileSource adapter. One dialog\n * serves every file surface (conversation VFS, skills, later the Files app):\n * the source decides the capabilities, optional methods enable the matching\n * UI (write → edit/save, remove → delete, rename → rename, upload → upload).\n * Fixed-height IDE-style layout: both panes scroll, the shell never jumps.\n */\nimport { createZip, downloadFileFromContent } from \"@k2b/stdlib/browser\";\nimport { mutation } from \"@k2b/stdlib/solid\";\nimport { createEffect, createMemo, createResource, createSignal, Match, onCleanup, Show, Switch, untrack } from \"solid-js\";\nimport Dropdown from \"../actions/Dropdown\";\nimport { dialogCore } from \"../feedback/dialog-core\";\nimport { prompts } from \"../feedback/prompts\";\nimport { resolveUiMessages, useUiMessages } from \"../intl/messages\";\nimport PanelDialog, { panelDialogOptions } from \"../layout/PanelDialog\";\nimport Placeholder from \"../surfaces/Placeholder\";\nimport FileTree, { type FileTreeEntry } from \"./FileTree\";\nimport FileView, { type FileViewContent, type FileViewRenderer } from \"./FileView\";\n\nexport type FileSource = {\n previewPreferencesKey?: string;\n list(): Promise<FileTreeEntry[]>;\n read(path: string): Promise<FileViewContent>;\n write?(path: string, content: string, encoding?: \"utf8\" | \"base64\"): Promise<void>;\n remove?(path: string): Promise<void>;\n rename?(from: string, to: string): Promise<void>;\n upload?(dirPath: string, files: File[]): Promise<void>;\n downloadHref?(path: string): string | null;\n /** Paths matching this predicate stay read-only even when the source can write (e.g. /input). */\n isReadOnly?(path: string): boolean;\n};\n\nexport type FileBrowserPanelProps = {\n source: FileSource;\n /** Hide every mutating affordance while retaining file selection and downloads. */\n readOnly?: boolean;\n /** Refetch entries when this host-controlled value changes. */\n refreshKey?: unknown;\n /** Preselect a file once entries are loaded. */\n initialPath?: string;\n /** Mirrors file selection into route state when the host needs durable navigation. */\n onSelectedPathChange?: (path: string | null) => void;\n /** Per-instance preview extensions forwarded to FileView. */\n renderers?: readonly FileViewRenderer[];\n /** Optional host copy/policy for leaving an unsaved file. */\n confirmDiscard?: (path: string, nextPath: string | null) => boolean | Promise<boolean>;\n /** Fixed shell height — the panes scroll inside it. */\n class?: string;\n /** Optional imperative refresh used by realtime owners that must await the visible update. */\n registerRefresh?: (refresh: () => Promise<void>) => void | (() => void);\n};\n\nconst parentOf = (path: string): string => {\n const index = path.lastIndexOf(\"/\");\n return index <= 0 ? \"/\" : path.slice(0, index);\n};\n\nexport function FileBrowserPanel(props: FileBrowserPanelProps) {\n const messages = useUiMessages();\n // FileSource is an imperative adapter. Its methods may read host signals,\n // but refreshes stay owned by this component (`refetch` / `refreshKey`);\n // tracking those implementation details can otherwise feed a write back\n // into its own list request indefinitely.\n const [entries, { refetch }] = createResource(async () => untrack(() => props.source.list()));\n const [selectedPath, setSelectedPath] = createSignal<string | null>(props.initialPath ?? null);\n const [selectedDirty, setSelectedDirty] = createSignal(false);\n // Folders exist implicitly through file paths — freshly created (still empty)\n // ones live here until their first file makes them real.\n const [pendingFolders, setPendingFolders] = createSignal<string[]>([]);\n let uploadInputRef: HTMLInputElement | undefined;\n let uploadDir = \"/\";\n let previousRefreshKey = props.refreshKey;\n let refreshPreview = async (): Promise<void> => undefined;\n\n createEffect(() => {\n if (!props.registerRefresh) return;\n const unregister = props.registerRefresh(async () => {\n await Promise.all([refetch(), refreshPreview()]);\n });\n if (unregister) onCleanup(unregister);\n });\n\n createEffect(() => {\n const next = props.initialPath ?? null;\n if (!selectedDirty() && next !== selectedPath()) setSelectedPath(next);\n });\n createEffect(() => props.onSelectedPathChange?.(selectedPath()));\n createEffect(() => {\n const refreshKey = props.refreshKey;\n if (Object.is(refreshKey, previousRefreshKey)) return;\n previousRefreshKey = refreshKey;\n void refetch();\n });\n\n const allEntries = createMemo<FileTreeEntry[]>(() => {\n const loaded = entries() ?? [];\n const real = new Set(loaded.map((entry) => entry.path));\n return [\n ...loaded,\n ...pendingFolders()\n .filter((path) => !real.has(path))\n .map((path) => ({ path, kind: \"folder\" as const })),\n ];\n });\n const selectedEntry = createMemo(() => allEntries().find((entry) => entry.path === selectedPath()) ?? null);\n const fileMutation = mutation.create<void, () => Promise<void>>({\n mutation: (work) => work(),\n onSuccess: () => void refetch(),\n onError: (error) => void prompts.error(error.message),\n });\n const pathMutable = (path: string) => !fileMutation.loading() && !props.readOnly && !props.source.isReadOnly?.(path);\n const pathWritable = (path: string) => pathMutable(path) && Boolean(props.source.write);\n const run = (work: () => Promise<void>) => void fileMutation.mutate(work);\n const canLeaveCurrent = async (nextPath: string | null): Promise<boolean> => {\n const current = selectedPath();\n if (nextPath === current || !selectedDirty() || !current) return true;\n if (selectedDirty() && current) {\n const confirmed = props.confirmDiscard\n ? await props.confirmDiscard(current, nextPath)\n : await prompts.confirm(messages().discardUnsavedFile, {\n title: messages().discardChanges,\n variant: \"danger\",\n });\n if (!confirmed) return false;\n }\n return true;\n };\n const selectPath = async (nextPath: string | null) => {\n if (!(await canLeaveCurrent(nextPath))) return;\n setSelectedDirty(false);\n setSelectedPath(nextPath);\n };\n\n const removeFile = (path: string) =>\n run(async () => {\n const confirmed = await prompts.confirm(`Delete ${path}?`, { title: \"Delete file\", variant: \"danger\" });\n if (!confirmed) return;\n await props.source.remove!(path);\n setPendingFolders((folders) => folders.filter((candidate) => candidate !== path && !candidate.startsWith(`${path}/`)));\n const selected = selectedPath();\n if (selected === path || selected?.startsWith(`${path}/`)) setSelectedPath(null);\n });\n\n const renameFile = (path: string, nextName: string) =>\n run(async () => {\n const target = `${parentOf(path) === \"/\" ? \"\" : parentOf(path)}/${nextName}`;\n await props.source.rename!(path, target);\n if (selectedPath() === path) setSelectedPath(target);\n });\n\n const createFile = (dirPath: string) =>\n run(async () => {\n const name = await prompts.prompt(messages().newFileName, \"\", { title: messages().newFile });\n if (!name || typeof name !== \"string\" || !name.trim() || name.includes(\"/\")) return;\n const path = `${dirPath === \"/\" ? \"\" : dirPath}/${name.trim()}`;\n if (!(await canLeaveCurrent(path))) return;\n await props.source.write!(path, \"\");\n setSelectedDirty(false);\n setSelectedPath(path);\n });\n\n const createFolder = (dirPath: string) =>\n void (async () => {\n const name = await prompts.prompt(messages().newFolderName, \"\", { title: messages().newFolder });\n if (!name || typeof name !== \"string\" || !name.trim() || name.includes(\"/\")) return;\n const path = `${dirPath === \"/\" ? \"\" : dirPath}/${name.trim()}`;\n setPendingFolders((folders) => [...folders, path]);\n })();\n\n const pickUpload = (dirPath: string) => {\n uploadDir = dirPath;\n uploadInputRef?.click();\n };\n\n const onUploadPicked = (input: HTMLInputElement) => {\n const files = Array.from(input.files ?? []);\n input.value = \"\";\n if (files.length > 0) run(() => props.source.upload!(uploadDir, files));\n };\n\n const baseName = (path: string) => path.slice(path.lastIndexOf(\"/\") + 1);\n\n /** Concrete file paths behind an entry: the file itself, or everything under a folder. */\n const filesBehind = (path: string): string[] => {\n const list = entries() ?? [];\n if (list.some((entry) => entry.path === path && entry.kind !== \"folder\")) return [path];\n const prefix = `${path}/`;\n return list.filter((entry) => entry.path.startsWith(prefix) && entry.kind !== \"folder\").map((entry) => entry.path);\n };\n\n /** Move a file OR a whole folder subtree (per-file renames preserve the structure). */\n const moveEntry = (path: string, targetDir: string) =>\n run(async () => {\n const destBase = `${targetDir === \"/\" ? \"\" : targetDir}/${baseName(path)}`;\n const files = filesBehind(path);\n if (files.length === 0) {\n // Still-empty pending folder — relocating it is a purely local affair.\n setPendingFolders((folders) => folders.map((candidate) => (candidate === path ? destBase : candidate)));\n return;\n }\n for (const file of files) {\n await props.source.rename!(file, `${destBase}${file.slice(path.length)}`);\n }\n const selected = selectedPath();\n if (selected && (selected === path || selected.startsWith(`${path}/`))) {\n setSelectedPath(`${destBase}${selected.slice(path.length)}`);\n }\n });\n\n const contentBytes = async (path: string): Promise<Uint8Array> => {\n const content = await props.source.read(path);\n return content.encoding === \"utf8\"\n ? new TextEncoder().encode(content.content)\n : Uint8Array.from(atob(content.content), (char) => char.charCodeAt(0));\n };\n\n const downloadEntry = (path: string, isFolder: boolean) =>\n void (async () => {\n try {\n if (!isFolder) {\n const href = props.source.downloadHref?.(path);\n if (href) {\n const anchor = document.createElement(\"a\");\n anchor.href = href;\n anchor.download = baseName(path);\n anchor.click();\n return;\n }\n const content = await props.source.read(path);\n downloadFileFromContent(await contentBytes(path), baseName(path), content.mediaType || \"application/octet-stream\");\n return;\n }\n const files = filesBehind(path);\n if (files.length === 0) throw new Error(messages().folderEmpty);\n const zipEntries = await Promise.all(\n files.map(async (file) => ({ filename: file.slice(path.length + 1), source: await contentBytes(file) })),\n );\n downloadFileFromContent(await createZip(zipEntries), `${baseName(path) || \"files\"}.zip`, \"application/zip\");\n } catch (error) {\n void prompts.error(error instanceof Error ? error.message : messages().downloadFailed);\n }\n })();\n\n const treeActions = () => ({\n ...(!props.readOnly && props.source.rename\n ? { rename: (path: string, next: string) => (pathMutable(path) ? renameFile(path, next) : undefined) }\n : {}),\n ...(!props.readOnly && props.source.remove ? { remove: (path: string) => (pathMutable(path) ? removeFile(path) : undefined) } : {}),\n ...(!props.readOnly && props.source.write ? { createFile: (dir: string) => (pathWritable(dir) ? createFile(dir) : undefined) } : {}),\n ...(!props.readOnly && props.source.write\n ? { createFolder: (dir: string) => (pathWritable(dir) ? createFolder(dir) : undefined) }\n : {}),\n ...(!props.readOnly && props.source.rename\n ? { move: (path: string, dir: string) => (pathMutable(path) && pathMutable(dir) ? moveEntry(path, dir) : undefined) }\n : {}),\n download: (path: string, isFolder: boolean) => downloadEntry(path, isFolder),\n });\n\n const addMenuItems = () => [\n ...(pathWritable(\"/\") ? [{ icon: \"ti ti-file-plus\", label: messages().newFile, action: () => createFile(\"/\") }] : []),\n ...(pathWritable(\"/\") ? [{ icon: \"ti ti-folder-plus\", label: messages().newFolder, action: () => createFolder(\"/\") }] : []),\n ...(pathMutable(\"/\") && props.source.upload\n ? [{ icon: \"ti ti-upload\", label: messages().uploadFiles, action: () => pickUpload(\"/\") }]\n : []),\n ];\n\n return (\n <div class={`k2b-content-file-browser ${props.class ?? \"\"}`} data-default-height={props.class ? undefined : \"true\"}>\n <div class=\"k2b-content-file-browser__sidebar\">\n <div class=\"k2b-content-file-browser__header\">\n <p class=\"k2b-content-file-browser__title\">{messages().files}</p>\n <Show when={addMenuItems().length > 0}>\n <Dropdown.Root position=\"bottom-left\" items={addMenuItems()} label={messages().addFileFolderUpload}>\n <Dropdown.Trigger\n appearance=\"plain\"\n class=\"k2b-content-file-browser__add\"\n label={messages().addFileFolderUpload}\n title={messages().add}\n >\n <i class=\"ti ti-plus\" aria-hidden=\"true\" />\n <span class=\"k2b-sr-only\">{messages().addFileFolderUpload}</span>\n </Dropdown.Trigger>\n </Dropdown.Root>\n </Show>\n </div>\n <Switch>\n <Match when={entries.loading && entries() === undefined}>\n <Placeholder icon=\"ti ti-loader-2\" title={messages().loadingFiles} />\n </Match>\n <Match when={entries.error}>\n <Placeholder\n icon=\"ti ti-alert-circle\"\n title={messages().failedLoadFiles}\n description={String(entries.error?.message ?? entries.error ?? \"\")}\n />\n </Match>\n <Match when={allEntries().length > 0}>\n <FileTree\n class=\"k2b-content-file-browser__tree\"\n entries={allEntries()}\n selectedPath={selectedPath()}\n onSelect={(entry) => void selectPath(entry.path)}\n actions={treeActions()}\n />\n </Match>\n <Match when={true}>\n <Placeholder icon=\"ti ti-folder-open\" title={messages().noFiles} description={messages().spaceEmpty} />\n </Match>\n </Switch>\n <input\n ref={uploadInputRef}\n type=\"file\"\n multiple\n class=\"k2b-content-file-browser__upload\"\n onChange={(event) => onUploadPicked(event.currentTarget)}\n />\n </div>\n\n <Switch fallback={<Placeholder icon=\"ti ti-file\" title={messages().selectFile} description={messages().pickFileFromTree} />}>\n <Match when={selectedEntry()?.kind === \"folder\"}>\n <Placeholder icon=\"ti ti-folder\" title={messages().folderSelected} description={messages().chooseFileToPreview} />\n </Match>\n <Match when={selectedEntry()}>\n {(entry) => (\n <FileView\n previewPreferencesKey={props.source.previewPreferencesKey}\n file={{ path: entry().path, mediaType: entry().mediaType, size: entry().size }}\n load={() => props.source.read(entry().path)}\n revision={props.refreshKey}\n registerRefresh={(refresh) => {\n refreshPreview = refresh;\n return () => {\n refreshPreview = async () => undefined;\n };\n }}\n renderers={props.renderers}\n onDirtyChange={setSelectedDirty}\n save={\n pathWritable(entry().path)\n ? async (content) => {\n await props.source.write!(entry().path, content);\n await refetch();\n }\n : undefined\n }\n downloadHref={props.source.downloadHref?.(entry().path) ?? null}\n />\n )}\n </Match>\n </Switch>\n </div>\n );\n}\n\n/** Open the file browser as a dialog. Returns when the dialog closes. */\nexport const openFileBrowser = (options: { source: FileSource; title?: string; subtitle?: string; icon?: string }): Promise<void> => {\n const messages = resolveUiMessages();\n return dialogCore.open<void>(\n (close) => (\n <PanelDialog>\n <PanelDialog.Header\n title={options.title ?? messages.files}\n subtitle={options.subtitle}\n icon={options.icon ?? \"ti ti-folder\"}\n close={() => close()}\n />\n <PanelDialog.Body>\n <FileBrowserPanel source={options.source} />\n </PanelDialog.Body>\n </PanelDialog>\n ),\n panelDialogOptions,\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ssrElement as _$ssrElement } from "solid-js/web";
|
|
2
|
+
import { mergeProps as _$mergeProps } from "solid-js/web";
|
|
3
|
+
import { ssr as _$ssr } from "solid-js/web";
|
|
4
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
5
|
+
import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
|
|
6
|
+
import { escape as _$escape } from "solid-js/web";
|
|
7
|
+
var _tmpl$ = ["<div class=\"", "\"", " role=\"grid\"", " aria-multiselectable=\"true\">", "</div>"],
|
|
8
|
+
_tmpl$2 = ["<div class=\"k2b-file-grid__preview\">", "</div>"],
|
|
9
|
+
_tmpl$3 = ["<div class=\"k2b-file-grid__name\">", "</div>"],
|
|
10
|
+
_tmpl$4 = ["<div class=\"k2b-file-grid__meta\">", "</div>"],
|
|
11
|
+
_tmpl$5 = ["<div class=\"k2b-file-grid__actions\">", "</div>"],
|
|
12
|
+
_tmpl$6 = ["<div role=\"row\" class=\"k2b-file-grid__row\">", "</div>"];
|
|
13
|
+
import { For } from "solid-js";
|
|
14
|
+
/** File presentation only; the host owns data, menus, leases and permissions. */
|
|
15
|
+
export function FileGrid(props) {
|
|
16
|
+
let grid;
|
|
17
|
+
const columns = () => grid ? Math.max(1, getComputedStyle(grid).gridTemplateColumns.split(" ").length) : 1;
|
|
18
|
+
const nested = event => event.target instanceof Element && !!event.target.closest("button,a,input,label,select,textarea,summary,[contenteditable],[role=button],[role=menu]");
|
|
19
|
+
return _$ssr(_tmpl$, `k2b-file-grid ${_$escape(props.class ?? "", true)}`, _$ssrAttribute("data-size", _$escape(props.size ?? "md", true), false), _$ssrAttribute("aria-label", _$escape(props.label, true), false), _$escape(_$createComponent(For, {
|
|
20
|
+
get each() {
|
|
21
|
+
return props.rows;
|
|
22
|
+
},
|
|
23
|
+
children: row => {
|
|
24
|
+
const id = () => props.getRowId(row);
|
|
25
|
+
return _$ssr(_tmpl$6, _$ssrElement("div", _$mergeProps(() => props.itemProps?.(row), {
|
|
26
|
+
role: "gridcell",
|
|
27
|
+
"class": "k2b-file-grid__item",
|
|
28
|
+
get ["aria-selected"]() {
|
|
29
|
+
return props.selection.selected().has(id());
|
|
30
|
+
},
|
|
31
|
+
get tabIndex() {
|
|
32
|
+
return props.selection.focused() === id() ? 0 : -1;
|
|
33
|
+
}
|
|
34
|
+
}), [_$ssr(_tmpl$2, _$escape(props.renderPreview(row))), _$ssr(_tmpl$3, _$escape(props.renderLabel(row))), _$ssr(_tmpl$4, _$escape(props.renderMeta?.(row))), _$ssr(_tmpl$5, _$escape(props.renderActions?.(row)))], false));
|
|
35
|
+
}
|
|
36
|
+
})));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=FileGrid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["For","FileGrid","props","grid","columns","Math","max","getComputedStyle","gridTemplateColumns","split","length","nested","event","target","Element","closest","_$ssr","_tmpl$","_$escape","class","_$ssrAttribute","size","label","_$createComponent","each","rows","children","row","id","getRowId","_tmpl$6","_$ssrElement","_$mergeProps","itemProps","role","aria-selected","selection","selected","has","tabIndex","focused","_tmpl$2","renderPreview","_tmpl$3","renderLabel","_tmpl$4","renderMeta","_tmpl$5","renderActions"],"sources":["content/FileGrid.tsx"],"sourcesContent":["import { For, type JSX } from \"solid-js\";\nimport type { CollectionSelection } from \"./collection-selection\";\n\nexport type FileGridProps<T> = {\n rows: readonly T[];\n getRowId: (row: T) => string;\n selection: CollectionSelection;\n label: string;\n size?: \"sm\" | \"md\" | \"lg\";\n renderPreview: (row: T) => JSX.Element;\n renderLabel: (row: T) => JSX.Element;\n renderMeta?: (row: T) => JSX.Element;\n renderActions?: (row: T) => JSX.Element;\n onRowClick?: (row: T) => void;\n onOpen: (row: T) => void;\n onContextMenu?: (row: T) => void;\n /** Extra attributes for one tile, for example drag-and-drop handlers or data attributes the host styles. */\n itemProps?: (row: T) => JSX.HTMLAttributes<HTMLDivElement>;\n class?: string;\n};\n\n/** File presentation only; the host owns data, menus, leases and permissions. */\nexport function FileGrid<T>(props: FileGridProps<T>) {\n let grid: HTMLDivElement | undefined;\n const columns = () => (grid ? Math.max(1, getComputedStyle(grid).gridTemplateColumns.split(\" \").length) : 1);\n const nested = (event: Event) =>\n event.target instanceof Element &&\n !!event.target.closest(\"button,a,input,label,select,textarea,summary,[contenteditable],[role=button],[role=menu]\");\n return (\n <div\n ref={grid}\n class={`k2b-file-grid ${props.class ?? \"\"}`}\n data-size={props.size ?? \"md\"}\n role=\"grid\"\n aria-label={props.label}\n aria-multiselectable=\"true\"\n >\n <For each={props.rows}>\n {(row) => {\n const id = () => props.getRowId(row);\n return (\n <div role=\"row\" class=\"k2b-file-grid__row\">\n <div\n {...props.itemProps?.(row)}\n role=\"gridcell\"\n class=\"k2b-file-grid__item\"\n aria-selected={props.selection.selected().has(id())}\n ref={(element) => props.selection.register(id(), element)}\n tabIndex={props.selection.focused() === id() ? 0 : -1}\n onFocus={() => props.selection.markFocused(id())}\n onClick={(event) => {\n if (!nested(event)) {\n props.selection.select(id(), event);\n props.onRowClick?.(row);\n }\n }}\n onDblClick={(event) => {\n if (!nested(event)) props.onOpen(row);\n }}\n onContextMenu={() => props.onContextMenu?.(row)}\n onKeyDown={(event) => {\n if (nested(event)) return;\n if (props.selection.keyDown(event, id(), columns())) return;\n if (event.key === \"Enter\") {\n event.preventDefault();\n props.onOpen(row);\n }\n }}\n >\n <div class=\"k2b-file-grid__preview\">{props.renderPreview(row)}</div>\n <div class=\"k2b-file-grid__name\">{props.renderLabel(row)}</div>\n <div class=\"k2b-file-grid__meta\">{props.renderMeta?.(row)}</div>\n <div class=\"k2b-file-grid__actions\">{props.renderActions?.(row)}</div>\n </div>\n </div>\n );\n }}\n </For>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAAA,SAASA,GAAG,QAAkB,UAAU;AAqBxC;AACA,OAAO,SAASC,QAAQA,CAAIC,KAAuB,EAAE;EACnD,IAAIC,IAAgC;EACpC,MAAMC,OAAO,GAAGA,CAAA,KAAOD,IAAI,GAAGE,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEC,gBAAgB,CAACJ,IAAI,CAAC,CAACK,mBAAmB,CAACC,KAAK,CAAC,GAAG,CAAC,CAACC,MAAM,CAAC,GAAG,CAAE;EAC5G,MAAMC,MAAM,GAAIC,KAAY,IAC1BA,KAAK,CAACC,MAAM,YAAYC,OAAO,IAC/B,CAAC,CAACF,KAAK,CAACC,MAAM,CAACE,OAAO,CAAC,0FAA0F,CAAC;EACpH,OAAAC,KAAA,CAAAC,MAAA,EAGW,iBAAAC,QAAA,CAAiBhB,KAAK,CAACiB,KAAK,IAAI,EAAE,SAAE,EAAAC,cAAA,cAAAF,QAAA,CAChChB,KAAK,CAACmB,IAAI,IAAI,IAAI,iBAAAD,cAAA,eAAAF,QAAA,CAEjBhB,KAAK,CAACoB,KAAK,iBAAAJ,QAAA,CAAAK,iBAAA,CAGtBvB,GAAG;IAAA,IAACwB,IAAIA,CAAA;MAAA,OAAEtB,KAAK,CAACuB,IAAI;IAAA;IAAAC,QAAA,EACjBC,GAAG,IAAK;MACR,MAAMC,EAAE,GAAGA,CAAA,KAAM1B,KAAK,CAAC2B,QAAQ,CAACF,GAAG,CAAC;MACpC,OAAAX,KAAA,CAAAc,OAAA,EAAAC,YAAA,QAAAC,YAAA,OAGU9B,KAAK,CAAC+B,SAAS,GAAGN,GAAG,CAAC;QAC1BO,IAAI,EAAC,UAAU;QAAA,SACT,qBAAqB;QAAA,qBAAAC,CAAA;UAAA,OACZjC,KAAK,CAACkC,SAAS,CAACC,QAAQ,CAAC,CAAC,CAACC,GAAG,CAACV,EAAE,CAAC,CAAC,CAAC;QAAA;QAAA,IAEnDW,QAAQA,CAAA;UAAA,OAAErC,KAAK,CAACkC,SAAS,CAACI,OAAO,CAAC,CAAC,KAAKZ,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAAA;MAAA,KAAAZ,KAAA,CAAAyB,OAAA,EAAAvB,QAAA,CAqBhBhB,KAAK,CAACwC,aAAa,CAACf,GAAG,CAAC,IAAAX,KAAA,CAAA2B,OAAA,EAAAzB,QAAA,CAC3BhB,KAAK,CAAC0C,WAAW,CAACjB,GAAG,CAAC,IAAAX,KAAA,CAAA6B,OAAA,EAAA3B,QAAA,CACtBhB,KAAK,CAAC4C,UAAU,GAAGnB,GAAG,CAAC,IAAAX,KAAA,CAAA+B,OAAA,EAAA7B,QAAA,CACpBhB,KAAK,CAAC8C,aAAa,GAAGrB,GAAG,CAAC;IAIvE;EAAC;AAIT","ignoreList":[]}
|
|
@@ -242,12 +242,12 @@ export default function FileTree(props) {
|
|
|
242
242
|
mimeType: currentNode().entry.mediaType ?? "text/plain"
|
|
243
243
|
}));
|
|
244
244
|
const hasItems = () => menuItems(node).length > 0;
|
|
245
|
-
return _$ssr(_tmpl$3, _$ssrAttribute("tabindex", renamingPath() === node.entry.path ? -1 : focusedPath() === node.entry.path ? 0 : -1, false) + _$ssrAttribute("aria-label", _$escape(currentNode().name, true), false) + _$ssrAttribute("aria-level", _$escape(currentNode().depth, true) + 1, false) + _$ssrAttribute("aria-selected", _$escape(isSelected(), true), false) + _$ssrAttribute("aria-expanded", currentNode().isFolder ? _$escape(expanded().has(currentNode().entry.path), true) : _$escape(undefined, true), false) + _$ssrAttribute("aria-haspopup", hasItems() ? "menu" : _$escape(undefined, true), false) + _$ssrAttribute("data-context-open", contextMenuOpen() && contextPath() === node.entry.path ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
|
|
245
|
+
return _$ssr(_tmpl$3, _$ssrAttribute("tabindex", renamingPath() === node.entry.path ? -1 : focusedPath() === node.entry.path ? 0 : -1, false) + _$ssrAttribute("aria-label", _$escape(currentNode().entry.displayName ?? currentNode().name, true), false) + _$ssrAttribute("aria-level", _$escape(currentNode().depth, true) + 1, false) + _$ssrAttribute("aria-selected", _$escape(isSelected(), true), false) + _$ssrAttribute("aria-expanded", currentNode().isFolder ? _$escape(expanded().has(currentNode().entry.path), true) : _$escape(undefined, true), false) + _$ssrAttribute("aria-haspopup", hasItems() ? "menu" : _$escape(undefined, true), false) + _$ssrAttribute("data-context-open", contextMenuOpen() && contextPath() === node.entry.path ? "true" : _$escape(undefined, true), false), _$escape(_$createComponent(Show, {
|
|
246
246
|
get when() {
|
|
247
247
|
return renamingPath() === node.entry.path;
|
|
248
248
|
},
|
|
249
249
|
get fallback() {
|
|
250
|
-
return _$ssr(_tmpl$7, _$ssrAttribute("data-state", isSelected() ? "selected" : isDropTarget() ? "drop-target" : "idle", false), _$ssrStyleProperty("padding-left:", `${6 + _$escape(currentNode().depth, true) * 14}px`), _$ssrAttribute("title", _$escape(currentNode().entry.path, true), false) + _$ssrAttribute("draggable", _$escape(Boolean(props.actions?.move), true), false), `ti ${_$escape(icon(), true)} k2b-content-file-tree__icon`, _$escape(currentNode().name), _$escape(_$createComponent(Show, {
|
|
250
|
+
return _$ssr(_tmpl$7, _$ssrAttribute("data-state", isSelected() ? "selected" : isDropTarget() ? "drop-target" : "idle", false), _$ssrStyleProperty("padding-left:", `${6 + _$escape(currentNode().depth, true) * 14}px`), _$ssrAttribute("title", _$escape(currentNode().entry.path, true), false) + _$ssrAttribute("draggable", _$escape(Boolean(props.actions?.move), true), false), `ti ${_$escape(icon(), true)} k2b-content-file-tree__icon`, _$escape(currentNode().entry.displayName ?? currentNode().name), _$escape(_$createComponent(Show, {
|
|
251
251
|
get when() {
|
|
252
252
|
return currentNode().entry.badge;
|
|
253
253
|
},
|