@k2b/ui 0.2.0 → 0.4.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 +2 -2
- 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 +114 -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 +511 -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/Pagination.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/ChoiceGroups.js.map +1 -1
- package/dist/browser/inputs/Select.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/inputs/markdown/behaviors.js +1 -1
- package/dist/browser/inputs/markdown/behaviors.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/app-workspace-state.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 +2 -2
- 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 +58 -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 +356 -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/Pagination.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/ChoiceGroups.js.map +1 -1
- package/dist/ssr/inputs/Select.js.map +1 -1
- package/dist/ssr/inputs/SelectChip.js +3 -3
- package/dist/ssr/inputs/SelectChip.js.map +1 -1
- package/dist/ssr/inputs/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/inputs/markdown/behaviors.js +1 -1
- package/dist/ssr/inputs/markdown/behaviors.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/app-workspace-state.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 +4 -4
- 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 +16 -2
- 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 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createEffect","onCleanup","positionTooltipSurface","sameChartDatum","a","b","role","index","seriesIndex","object","value","pair","Array","isArray","length","every","n","Number","isFinite","roles","Set","isChartDatum","isInteger","undefined","has","anchor","grid","label","values","field","key","formatted","createChartInspection","options","source","Symbol","entries","sortedPoints","byElement","Map","active","highlighted","pinned","pointerStart","moved","pending","frame","records","element","isConnected","clear","from","container","querySelectorAll","JSON","parse","getAttribute","entry","datum","push","set","filter","sort","highlightColor","item","point","querySelector","kind","paint","ownerDocument","defaultView","getComputedStyle","color","hasAttribute","stroke","fill","selectData","selected","matches","some","style","setProperty","removeProperty","toggleAttribute","screenPoint","matrix","getScreenCTM","x","y","c","e","d","f","rect","getBoundingClientRect","width","height","visibleRecords","nodes","viewport","root","ownerSVGElement","baseVal","left","top","clip","right","bottom","rawX","find","seriesChart","clearHighlight","removeAttribute","close","broadcast","cancelPending","state","cursor","read","tooltip","hidePopover","cancelAnimationFrame","invalidate","receive","show","move","enabled","candidate","setAttribute","document","contents","map","content","format","missing","present","add","replaceChildren","sharedTitle","formatX","commonTitle","title","createElement","className","textContent","append","row","rows","line","swatch","series","background","updatePlotBounds","id","showPopover","axes","axis","Math","min","max","name","Object","unsubscribe","subscribe","nearest","target","closest","plot","direct","hit","get","includes","points","determinant","targetX","low","high","mid","floor","previous","abs","matrices","best","distance","Infinity","svg","ax","ay","dx","dy","next","hypot","event","Node","contains","clientX","clientY","pointerType","buttons","Element","requestAnimationFrame","sample","down","click","select","focus","first","at","preventDefault","link","dispatchEvent","MouseEvent","bubbles","cancelable","navigationChart","altKey","seen","findIndex","indexOf","selectDatum","leave"],"sources":["content/chart-inspection.ts"],"sourcesContent":["import type { ChartDatum } from \"@k2b/stdlib\";\nimport { createEffect, onCleanup } from \"solid-js\";\nimport { positionTooltipSurface } from \"../feedback/tooltip-position\";\nimport type { ChartKind } from \"./Chart\";\nimport type { ChartCursor, ChartCursorState } from \"./chart-cursor\";\n\nexport type ChartDatumRef = Pick<ChartDatum, \"role\" | \"index\" | \"seriesIndex\">;\nexport const sameChartDatum = (a: ChartDatumRef, b: ChartDatumRef) =>\n a.role === b.role && a.index === b.index && a.seriesIndex === b.seriesIndex;\n\nexport type ChartSelection = { kind: ChartKind; datum: ChartDatum };\nexport type ChartTooltip = { title?: string; rows: readonly { label: string; value: string }[] };\nexport type ChartTooltipFormatter = (selection: ChartSelection) => ChartTooltip;\n\ntype Entry = { element: SVGGraphicsElement; datum: ChartDatum };\nconst object = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null;\nconst pair = (value: unknown): value is [number, number] =>\n Array.isArray(value) && value.length === 2 && value.every((n) => typeof n === \"number\" && Number.isFinite(n));\nconst roles = new Set([\"point\", \"item\", \"bin\", \"box\", \"outlier\", \"value\", \"cell\", \"interval\"]);\nexport function isChartDatum(value: unknown): value is ChartDatum {\n return (\n object(value) &&\n Number.isInteger(value.index) &&\n typeof value.index === \"number\" &&\n value.index >= 0 &&\n (value.seriesIndex === undefined ||\n (typeof value.seriesIndex === \"number\" && Number.isInteger(value.seriesIndex) && value.seriesIndex >= 0)) &&\n typeof value.role === \"string\" &&\n roles.has(value.role) &&\n pair(value.anchor) &&\n (value.grid === undefined || pair(value.grid)) &&\n (value.label === undefined || typeof value.label === \"string\") &&\n Array.isArray(value.values) &&\n value.values.every(\n (field) =>\n object(field) &&\n typeof field.key === \"string\" &&\n (typeof field.value === \"string\" || (typeof field.value === \"number\" && Number.isFinite(field.value))) &&\n (field.formatted === undefined || typeof field.formatted === \"string\"),\n )\n );\n}\n\n/** Enhances existing SVG nodes. Pointer/focus changes never rebuild the chart. */\nexport function createChartInspection(options: {\n container: () => HTMLDivElement | undefined;\n cursor?: () => ChartCursor | undefined;\n tooltip: () => HTMLSpanElement | undefined;\n anchor: () => HTMLSpanElement | undefined;\n kind: () => ChartKind;\n enabled: () => boolean;\n format: ChartTooltipFormatter;\n select: (selection: ChartSelection) => void;\n}) {\n const source = Symbol(\"chart cursor\");\n let entries: Entry[] | undefined;\n let sortedPoints: Entry[] = [];\n const byElement = new Map<Element, Entry>();\n let active: Entry | undefined;\n let highlighted: Entry[] = [];\n let pinned = false;\n let pointerStart: { x: number; y: number } | undefined;\n let moved = false;\n let pending: { x: number; y: number; target: Element | null } | undefined;\n let frame: number | undefined;\n\n const records = () => {\n if (!entries || (entries.length > 0 && !entries[0]!.element.isConnected)) {\n entries = [];\n byElement.clear();\n sortedPoints = [];\n for (const element of Array.from(options.container()?.querySelectorAll<SVGGraphicsElement>(\"[data-chart-datum]\") ?? [])) {\n try {\n const value: unknown = JSON.parse(element.getAttribute(\"data-chart-datum\") ?? \"null\");\n if (isChartDatum(value)) {\n const entry = { element, datum: value };\n entries.push(entry);\n byElement.set(element, entry);\n }\n } catch {\n /* Only valid renderer metadata participates in inspection. */\n }\n }\n sortedPoints = entries.filter((entry) => entry.datum.role === \"point\").sort((a, b) => a.datum.anchor[0] - b.datum.anchor[0]);\n }\n return entries;\n };\n const highlightColor = (item: Entry): string => {\n // Read the actual paint before applying inspection styles, including\n // custom series and threshold colors. Invisible points use their line.\n const point = item.element.querySelector(\".stdlib-chart-inspection-point\");\n const source = point\n ? options\n .container()\n ?.querySelector(\n options.kind() === \"line\"\n ? `.stdlib-chart-line.stdlib-chart-series-${(item.datum.seriesIndex ?? 0) % 8}`\n : \".stdlib-chart-sparkline, .stdlib-chart-stat-sparkline\",\n )\n : (item.element.querySelector(\".stdlib-chart-bar-gauge-fill, .stdlib-chart-gauge-fill, .stdlib-chart-stat-value\") ??\n item.element.querySelector(\"rect, path, circle\"));\n const paint = source ? source.ownerDocument.defaultView?.getComputedStyle(source) : undefined;\n const color =\n (point || item.element.hasAttribute(\"data-chart-reference\") ? paint?.stroke : paint?.fill) ||\n `var(--stdlib-chart-c${((item.datum.seriesIndex ?? 0) % 8) + 1})`;\n return `color-mix(in srgb, ${color} 72%, var(--k2b-chart-highlight-mix))`;\n };\n const selectData = (selected: readonly ChartDatumRef[]) => {\n for (const entry of records()) {\n const matches = selected.some((datum) => sameChartDatum(datum, entry.datum));\n if (matches) entry.element.style.setProperty(\"--k2b-chart-selection-color\", highlightColor(entry));\n else entry.element.style.removeProperty(\"--k2b-chart-selection-color\");\n entry.element.toggleAttribute(\"data-selected\", matches);\n }\n };\n const screenPoint = (entry: Entry) => {\n const matrix = entry.element.getScreenCTM?.();\n const [x, y] = entry.datum.anchor;\n if (matrix) return { x: matrix.a * x + matrix.c * y + matrix.e, y: matrix.b * x + matrix.d * y + matrix.f };\n const rect = entry.element.getBoundingClientRect();\n return { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 };\n };\n const visibleRecords = () => {\n const nodes = records();\n if (options.kind() !== \"map\") return nodes;\n const viewport = options.container()?.querySelector<SVGSVGElement>(\".stdlib-chart-map-viewport\");\n if (!viewport?.getScreenCTM?.()) return nodes;\n const root = viewport.ownerSVGElement?.getBoundingClientRect();\n if (!root?.width || !root.height) return nodes;\n const width = viewport?.width?.baseVal.value;\n const height = viewport?.height?.baseVal.value;\n if (!width || !height) return nodes;\n const left = root.left + viewport.x.baseVal.value;\n const top = root.top + viewport.y.baseVal.value;\n const clip = { left, top, right: left + width, bottom: top + height };\n return nodes.filter((entry) => {\n const point = screenPoint(entry);\n return point.x >= clip.left && point.x <= clip.right && point.y >= clip.top && point.y <= clip.bottom;\n });\n };\n const rawX = (entry: Entry) => entry.datum.values.find((field) => field.key === \"x\")?.value;\n const seriesChart = () => options.kind() === \"line\" || options.kind() === \"sparkline\";\n const clearHighlight = () => {\n for (const entry of highlighted) {\n entry.element.removeAttribute(\"data-inspected\");\n entry.element.style.removeProperty(\"--k2b-chart-inspection-color\");\n if (!entry.element.getAttribute(\"style\")) entry.element.removeAttribute(\"style\");\n }\n highlighted = [];\n };\n const close = (broadcast = true, cancelPending = true) => {\n const state = options.cursor?.()?.read();\n if (broadcast && state && state.source !== source) return;\n if (broadcast) options.cursor?.()?.clear(source);\n options.container()?.removeAttribute(\"data-cursor-source\");\n pinned = false;\n active = undefined;\n clearHighlight();\n options.container()?.removeAttribute(\"aria-describedby\");\n options.container()?.removeAttribute(\"data-inspecting\");\n const tooltip = options.tooltip();\n if (tooltip) {\n try {\n if (tooltip.matches(\":popover-open\")) tooltip.hidePopover();\n } catch {\n /* Detached during navigation. */\n }\n }\n if (cancelPending) {\n if (frame !== undefined) cancelAnimationFrame(frame);\n frame = undefined;\n pending = undefined;\n }\n };\n const invalidate = () => {\n options.cursor?.()?.clear(source);\n close(false);\n entries = undefined;\n sortedPoints = [];\n byElement.clear();\n receive(options.cursor?.()?.read() ?? null);\n };\n const show = (entry: Entry, broadcast = true) => {\n const x = rawX(entry);\n if (broadcast && options.kind() === \"line\" && typeof x === \"number\") options.cursor?.()?.move(source, x);\n const tooltip = options.tooltip(),\n anchor = options.anchor(),\n container = options.container();\n if (!tooltip || !anchor || !container || !options.enabled()) return;\n if (active === entry && tooltip.matches(\":popover-open\")) return;\n clearHighlight();\n active = entry;\n highlighted = options.kind() === \"line\" ? records().filter((candidate) => rawX(candidate) === rawX(entry)) : [entry];\n for (const item of highlighted) {\n item.element.style.setProperty(\"--k2b-chart-inspection-color\", highlightColor(item));\n item.element.setAttribute(\"data-inspected\", \"true\");\n }\n const document = tooltip.ownerDocument;\n const contents = highlighted.map((item) => ({\n item,\n content: options.format({ kind: options.kind(), datum: item.datum }),\n missing: false,\n }));\n if (options.cursor?.() && options.kind() === \"line\") {\n const present = new Set(highlighted.map((item) => item.datum.seriesIndex));\n for (const item of records()) {\n if (present.has(item.datum.seriesIndex)) continue;\n present.add(item.datum.seriesIndex);\n contents.push({ item, content: options.format({ kind: options.kind(), datum: item.datum }), missing: true });\n }\n contents.sort((a, b) => (a.item.datum.seriesIndex ?? 0) - (b.item.datum.seriesIndex ?? 0));\n }\n tooltip.replaceChildren();\n const sharedTitle = typeof x === \"number\" ? options.cursor?.()?.formatX?.(x) : undefined;\n const commonTitle =\n sharedTitle ??\n (contents.every(({ content }) => content.title === contents[0]?.content.title) ? contents[0]?.content.title : undefined);\n if (commonTitle) {\n const title = document.createElement(\"strong\");\n title.className = \"k2b-chart__tooltip-title\";\n title.textContent = commonTitle;\n tooltip.append(title);\n }\n for (const { item, content, missing } of contents) {\n if (content.title && !commonTitle) {\n const title = document.createElement(\"strong\");\n title.className = \"k2b-chart__tooltip-title\";\n title.textContent = content.title;\n tooltip.append(title);\n }\n for (const row of content.rows) {\n const line = document.createElement(\"span\");\n line.className = \"k2b-chart__tooltip-row\";\n if (options.kind() === \"line\") {\n const swatch = document.createElement(\"i\");\n swatch.setAttribute(\"aria-hidden\", \"true\");\n const series = container.querySelector(`.stdlib-chart-line.stdlib-chart-series-${(item.datum.seriesIndex ?? 0) % 8}`);\n swatch.style.background = series\n ? getComputedStyle(series).stroke\n : `var(--stdlib-chart-c${((item.datum.seriesIndex ?? 0) % 8) + 1})`;\n line.append(swatch);\n }\n const label = document.createElement(\"span\");\n label.textContent = `${row.label}: `;\n const value = document.createElement(\"b\");\n value.textContent = missing ? \"—\" : row.value;\n line.append(label, value);\n tooltip.append(line);\n }\n }\n const rect = container.getBoundingClientRect(),\n point = screenPoint(entry);\n anchor.style.left = `${point.x - rect.left}px`;\n anchor.style.top = `${point.y - rect.top}px`;\n updatePlotBounds();\n container.style.setProperty(\"--k2b-chart-inspection-x\", `${point.x - rect.left}px`);\n container.setAttribute(\"data-inspecting\", seriesChart() ? \"series\" : \"datum\");\n container.setAttribute(\"aria-describedby\", tooltip.id);\n try {\n if (!tooltip.matches(\":popover-open\")) tooltip.showPopover();\n positionTooltipSurface(tooltip, anchor);\n } catch {\n /* SVG titles remain available without the Popover API. */\n }\n };\n const updatePlotBounds = () => {\n const container = options.container();\n if (!container) return;\n const axes = Array.from(container.querySelectorAll(\".stdlib-chart-axis\")).map((axis) => axis.getBoundingClientRect());\n if (axes.length < 2) return;\n const left = Math.min(...axes.map((a) => a.left)),\n right = Math.max(...axes.map((a) => a.right));\n const top = Math.min(...axes.map((a) => a.top)),\n bottom = Math.max(...axes.map((a) => a.bottom));\n if (right <= left || bottom <= top) return;\n const rect = container.getBoundingClientRect();\n for (const [name, value] of Object.entries({\n left: left - rect.left,\n right: rect.right - right,\n top: top - rect.top,\n bottom: rect.bottom - bottom,\n }))\n container.style.setProperty(`--k2b-chart-plot-${name}`, `${value}px`);\n return { left, right, top, bottom };\n };\n const receive = (state: ChartCursorState) => {\n if (state?.source === source) return;\n close(false, false);\n if (!state || options.kind() !== \"line\") return;\n const entry = records().find((item) => rawX(item) === state.x);\n if (entry) show(entry, false);\n };\n createEffect(() => {\n const cursor = options.cursor?.();\n const unsubscribe = cursor?.subscribe(receive);\n onCleanup(() => {\n unsubscribe?.();\n cursor?.clear(source);\n });\n });\n onCleanup(() => close(false));\n const nearest = (x: number, y: number, target: Element | null): Entry | undefined => {\n if (target?.closest(\"button,a\") && !target.closest(\"[data-chart-datum]\")) return;\n if (seriesChart()) {\n const plot = updatePlotBounds();\n if (plot && (x < plot.left || x > plot.right || y < plot.top || y > plot.bottom)) return;\n }\n const nodes = visibleRecords();\n const direct = target?.closest(\"[data-chart-datum]\");\n const hit = direct ? byElement.get(direct) : undefined;\n if (hit && nodes.includes(hit)) return hit;\n // Exact shapes win. A small physical hit radius also reaches tiny or\n // zero-sized marks; distant whitespace leaves the chart unselected.\n const points = seriesChart() ? sortedPoints : nodes;\n if (seriesChart() && points.length) {\n const matrix = points[0]!.element.getScreenCTM?.();\n if (matrix) {\n const determinant = matrix.a * matrix.d - matrix.b * matrix.c;\n if (!determinant) return;\n const targetX = ((x - matrix.e) * matrix.d - (y - matrix.f) * matrix.c) / determinant;\n let low = 0,\n high = points.length - 1;\n while (low < high) {\n const mid = Math.floor((low + high) / 2);\n if (points[mid]!.datum.anchor[0] < targetX) low = mid + 1;\n else high = mid;\n }\n const previous = Math.max(0, low - 1);\n return Math.abs(points[previous]!.datum.anchor[0] - targetX) <= Math.abs(points[low]!.datum.anchor[0] - targetX)\n ? points[previous]\n : points[low];\n }\n }\n const matrices = new Map<SVGSVGElement, DOMMatrix | null>();\n let best: Entry | undefined,\n distance = Infinity;\n for (const entry of points) {\n const svg = entry.element.ownerSVGElement;\n if (svg && !matrices.has(svg)) matrices.set(svg, svg.getScreenCTM?.() ?? null);\n const matrix = svg ? matrices.get(svg) : null;\n const [ax, ay] = entry.datum.anchor;\n const point = matrix\n ? { x: matrix.a * ax + matrix.c * ay + matrix.e, y: matrix.b * ax + matrix.d * ay + matrix.f }\n : screenPoint(entry);\n const dx = point.x - x,\n dy = point.y - y;\n const next = seriesChart() ? Math.abs(dx) : Math.hypot(dx, dy);\n if (next < distance) {\n distance = next;\n best = entry;\n }\n }\n return seriesChart() || distance <= 24 ? best : undefined;\n };\n const move = (event: PointerEvent) => {\n if (event.target instanceof Node && options.tooltip()?.contains(event.target)) return;\n if (pointerStart && Math.hypot(event.clientX - pointerStart.x, event.clientY - pointerStart.y) > 6) moved = true;\n if (!options.enabled() || pinned || event.pointerType === \"touch\" || event.buttons) return;\n pending = { x: event.clientX, y: event.clientY, target: event.target instanceof Element ? event.target : null };\n if (frame !== undefined) return;\n frame = requestAnimationFrame(() => {\n frame = undefined;\n const sample = pending;\n pending = undefined;\n if (!sample) return;\n const entry = nearest(sample.x, sample.y, sample.target);\n if (entry) {\n show(entry);\n if (seriesChart()) {\n const container = options.container();\n container?.setAttribute(\"data-cursor-source\", \"true\");\n container?.style.setProperty(\"--k2b-chart-inspection-y\", `${sample.y - container.getBoundingClientRect().top}px`);\n }\n } else close();\n });\n };\n const down = (event: PointerEvent) => {\n pointerStart = { x: event.clientX, y: event.clientY };\n moved = false;\n };\n const click = (event: MouseEvent) => {\n if (!options.enabled() || moved || (event.target instanceof Element && event.target.closest(\"button,a\"))) return;\n const entry = nearest(event.clientX, event.clientY, event.target instanceof Element ? event.target : null);\n if (!entry) {\n close();\n return;\n }\n pinned = true;\n show(entry);\n options.select({ kind: options.kind(), datum: entry.datum });\n };\n const focus = (event: FocusEvent) => {\n if (event.target !== options.container() || !options.enabled()) return;\n const nodes = visibleRecords();\n const first = options.kind() === \"line\" ? sortedPoints.at(-1) : nodes[0];\n if (first) show(first);\n };\n const key = (event: KeyboardEvent): boolean => {\n if (!options.enabled() || event.target !== options.container()) return false;\n if (event.key === \"Escape\") {\n close();\n return true;\n }\n if (event.key === \"Enter\" && active) {\n if (options.kind() === \"map\" && !visibleRecords().includes(active)) {\n close();\n return true;\n }\n event.preventDefault();\n pinned = true;\n const link = active.element.closest(\"a\");\n if (link) link.dispatchEvent(new MouseEvent(\"click\", { bubbles: true, cancelable: true }));\n else options.select({ kind: options.kind(), datum: active.datum });\n return true;\n }\n const navigationChart = options.kind() === \"map\" || options.kind() === \"stateTimeline\";\n if (navigationChart && !event.altKey) return false;\n if (![\"Home\", \"End\", \"ArrowLeft\", \"ArrowRight\", \"ArrowUp\", \"ArrowDown\"].includes(event.key)) return false;\n let nodes = visibleRecords();\n if (seriesChart()) nodes = [...nodes].sort((a, b) => a.datum.anchor[0] - b.datum.anchor[0]);\n if (options.kind() === \"line\") {\n const seen = new Set<string | number | undefined>();\n nodes = nodes.filter((entry) => {\n const x = rawX(entry);\n if (seen.has(x)) return false;\n seen.add(x);\n return true;\n });\n }\n if (!nodes.length) return false;\n event.preventDefault();\n pinned = false;\n let index = active\n ? options.kind() === \"line\"\n ? nodes.findIndex((entry) => rawX(entry) === rawX(active!))\n : nodes.indexOf(active)\n : -1;\n if (event.key === \"Home\") index = 0;\n else if (event.key === \"End\") index = nodes.length - 1;\n else if (active?.datum.grid && [\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(event.key)) {\n const [x, y] = active.datum.grid;\n const dx = event.key === \"ArrowLeft\" ? -1 : event.key === \"ArrowRight\" ? 1 : 0;\n const dy = event.key === \"ArrowUp\" ? -1 : event.key === \"ArrowDown\" ? 1 : 0;\n const next = nodes\n .filter(\n (entry) =>\n entry.datum.grid &&\n (dx\n ? entry.datum.grid[1] === y && (entry.datum.grid[0] - x) * dx > 0\n : entry.datum.grid[0] === x && (entry.datum.grid[1] - y) * dy > 0),\n )\n .sort(\n (a, b) =>\n Math.abs(a.datum.grid![0] - x) +\n Math.abs(a.datum.grid![1] - y) -\n Math.abs(b.datum.grid![0] - x) -\n Math.abs(b.datum.grid![1] - y),\n )[0];\n if (next) index = nodes.indexOf(next);\n } else index += event.key === \"ArrowLeft\" || event.key === \"ArrowUp\" ? -1 : 1;\n show(nodes[Math.max(0, Math.min(nodes.length - 1, index))]!);\n return true;\n };\n return {\n selectDatum: (selected: ChartDatumRef | null | undefined) => selectData(selected ? [selected] : []),\n selectData,\n move,\n down,\n click,\n focus,\n key,\n close: () => close(),\n invalidate,\n leave: () => {\n if (!pinned) close();\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { linePathD, smoothPathD, stepPathD } from "@k2b/stdlib";
|
|
2
|
+
import { isChartDatum } from "./chart-inspection";
|
|
3
|
+
|
|
4
|
+
/** Adapt trusted stdlib line geometry without changing series, indices or inspection. */
|
|
5
|
+
export function lineGapsSvg(svg, maxGap, options) {
|
|
6
|
+
if (!Number.isFinite(maxGap) || maxGap <= 0) throw new RangeError("Chart maxGap must be finite and positive");
|
|
7
|
+
const decode = value => value.replace(/"/g, '"').replace(/'|'/g, "'").replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&");
|
|
8
|
+
const series = new Map();
|
|
9
|
+
const records = [];
|
|
10
|
+
for (const match of svg.matchAll(/data-chart-datum="([^"]*)"/g)) {
|
|
11
|
+
const datum = JSON.parse(decode(match[1]));
|
|
12
|
+
if (!isChartDatum(datum) || datum.role !== "point") continue;
|
|
13
|
+
records.push(datum);
|
|
14
|
+
const index = datum.seriesIndex ?? 0;
|
|
15
|
+
const rows = series.get(index) ?? [];
|
|
16
|
+
rows.push(datum);
|
|
17
|
+
series.set(index, rows);
|
|
18
|
+
}
|
|
19
|
+
const x = point => Number(point.values.find(value => value.key === "x").value);
|
|
20
|
+
const paths = new Map();
|
|
21
|
+
const isolated = new Set();
|
|
22
|
+
for (const [index, points] of series) {
|
|
23
|
+
const runs = [];
|
|
24
|
+
for (const point of [...points].sort((a, b) => x(a) - x(b))) {
|
|
25
|
+
const run = runs.at(-1);
|
|
26
|
+
if (!run || x(point) - x(run.at(-1)) > maxGap) runs.push([point]);else run.push(point);
|
|
27
|
+
}
|
|
28
|
+
paths.set(index, runs.map(run => {
|
|
29
|
+
if (run.length === 1) {
|
|
30
|
+
isolated.add(run[0]);
|
|
31
|
+
return "";
|
|
32
|
+
}
|
|
33
|
+
const points = run.map(point => ({
|
|
34
|
+
x: point.anchor[0],
|
|
35
|
+
y: point.anchor[1]
|
|
36
|
+
}));
|
|
37
|
+
return options.step ? stepPathD(points, options.step) : options.smooth === false ? linePathD(points) : smoothPathD(points);
|
|
38
|
+
}).join(" "));
|
|
39
|
+
}
|
|
40
|
+
// Metadata precedes each series' path in the renderer. Keeping the source
|
|
41
|
+
// series index also preserves palettes when there are more than eight series.
|
|
42
|
+
let currentSeries = 0;
|
|
43
|
+
let pointIndex = 0;
|
|
44
|
+
return svg.replace(/<g data-chart-role="point" data-chart-datum="[^"]*">[\s\S]*?<\/g>|<path class="stdlib-chart-line [^"]*"[^>]*\/>/g, element => {
|
|
45
|
+
if (element.startsWith("<g")) {
|
|
46
|
+
const datum = records[pointIndex++];
|
|
47
|
+
currentSeries = datum.seriesIndex ?? 0;
|
|
48
|
+
return isolated.has(datum) ? element.replace('fill="transparent"', `fill="var(--stdlib-chart-c${currentSeries % 8 + 1})"`) : element;
|
|
49
|
+
}
|
|
50
|
+
return element.replace(/ d="[^"]*"/, ` d="${paths.get(currentSeries) ?? ""}"`);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=chart-line-gaps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["linePathD","smoothPathD","stepPathD","isChartDatum","lineGapsSvg","svg","maxGap","options","Number","isFinite","RangeError","decode","value","replace","series","Map","records","match","matchAll","datum","JSON","parse","role","push","index","seriesIndex","rows","get","set","x","point","values","find","key","paths","isolated","Set","points","runs","sort","a","b","run","at","map","length","add","anchor","y","step","smooth","join","currentSeries","pointIndex","element","startsWith","has"],"sources":["content/chart-line-gaps.ts"],"sourcesContent":["import { type ChartDatum, linePathD, smoothPathD, stepPathD } from \"@k2b/stdlib\";\nimport { isChartDatum } from \"./chart-inspection\";\n\n/** Adapt trusted stdlib line geometry without changing series, indices or inspection. */\nexport function lineGapsSvg(svg: string, maxGap: number, options: { smooth?: boolean; step?: \"before\" | \"after\" | \"middle\" }): string {\n if (!Number.isFinite(maxGap) || maxGap <= 0) throw new RangeError(\"Chart maxGap must be finite and positive\");\n const decode = (value: string) =>\n value\n .replace(/"/g, '\"')\n .replace(/'|'/g, \"'\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\");\n const series = new Map<number, ChartDatum[]>();\n const records: ChartDatum[] = [];\n for (const match of svg.matchAll(/data-chart-datum=\"([^\"]*)\"/g)) {\n const datum: unknown = JSON.parse(decode(match[1]!));\n if (!isChartDatum(datum) || datum.role !== \"point\") continue;\n records.push(datum);\n const index = datum.seriesIndex ?? 0;\n const rows = series.get(index) ?? [];\n rows.push(datum);\n series.set(index, rows);\n }\n const x = (point: ChartDatum) => Number(point.values.find((value) => value.key === \"x\")!.value);\n const paths = new Map<number, string>();\n const isolated = new Set<ChartDatum>();\n for (const [index, points] of series) {\n const runs: ChartDatum[][] = [];\n for (const point of [...points].sort((a, b) => x(a) - x(b))) {\n const run = runs.at(-1);\n if (!run || x(point) - x(run.at(-1)!) > maxGap) runs.push([point]);\n else run.push(point);\n }\n paths.set(\n index,\n runs\n .map((run) => {\n if (run.length === 1) {\n isolated.add(run[0]!);\n return \"\";\n }\n const points = run.map((point) => ({ x: point.anchor[0], y: point.anchor[1] }));\n return options.step ? stepPathD(points, options.step) : options.smooth === false ? linePathD(points) : smoothPathD(points);\n })\n .join(\" \"),\n );\n }\n // Metadata precedes each series' path in the renderer. Keeping the source\n // series index also preserves palettes when there are more than eight series.\n let currentSeries = 0;\n let pointIndex = 0;\n return svg.replace(\n /<g data-chart-role=\"point\" data-chart-datum=\"[^\"]*\">[\\s\\S]*?<\\/g>|<path class=\"stdlib-chart-line [^\"]*\"[^>]*\\/>/g,\n (element) => {\n if (element.startsWith(\"<g\")) {\n const datum = records[pointIndex++]!;\n currentSeries = datum.seriesIndex ?? 0;\n\n return isolated.has(datum)\n ? element.replace('fill=\"transparent\"', `fill=\"var(--stdlib-chart-c${(currentSeries % 8) + 1})\"`)\n : element;\n }\n return element.replace(/ d=\"[^\"]*\"/, ` d=\"${paths.get(currentSeries) ?? \"\"}\"`);\n },\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -17,8 +17,12 @@ export const normalizeMapViewport = viewport => {
|
|
|
17
17
|
zoom
|
|
18
18
|
};
|
|
19
19
|
};
|
|
20
|
-
export const zoomMapViewport = (viewport, delta
|
|
20
|
+
export const zoomMapViewport = (viewport, delta, focus = {
|
|
21
|
+
latitude: 50,
|
|
22
|
+
longitude: 10
|
|
23
|
+
}) => normalizeMapViewport({
|
|
21
24
|
...viewport,
|
|
25
|
+
...(viewport.zoom === 0 && delta > 0 ? focus : {}),
|
|
22
26
|
zoom: viewport.zoom + delta
|
|
23
27
|
});
|
|
24
28
|
export const panMapViewport = (viewport, deltaX, deltaY, width, height) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DEFAULT_MAP_VIEWPORT","latitude","longitude","zoom","MIN_ZOOM","MAX_ZOOM","clamp","value","min","max","Math","normalizeMapViewport","viewport","Number","isFinite","scale","latitudeLimit","longitudeLimit","zoomMapViewport","delta","panMapViewport","deltaX","deltaY","width","height"],"sources":["content/chart-map-viewport.ts"],"sourcesContent":["import type { MapViewport } from \"@k2b/stdlib\";\n\nexport const DEFAULT_MAP_VIEWPORT: MapViewport = {\n latitude: 0,\n longitude: 0,\n zoom: 0,\n};\n\nconst MIN_ZOOM = 0;\nconst MAX_ZOOM = 5;\n\nconst clamp = (value: number, min: number, max: number): number => Math.min(max, Math.max(min, value));\n\nexport const normalizeMapViewport = (viewport: MapViewport | undefined): MapViewport => {\n const zoom = clamp(viewport && Number.isFinite(viewport.zoom) ? viewport.zoom : MIN_ZOOM, MIN_ZOOM, MAX_ZOOM);\n const scale = 2 ** zoom;\n const latitudeLimit = 90 - 90 / scale;\n const longitudeLimit = 180 - 180 / scale;\n\n return {\n latitude: clamp(viewport && Number.isFinite(viewport.latitude) ? viewport.latitude : 0, -latitudeLimit, latitudeLimit),\n longitude: clamp(viewport && Number.isFinite(viewport.longitude) ? viewport.longitude : 0, -longitudeLimit, longitudeLimit),\n zoom,\n };\n};\n\nexport const zoomMapViewport = (viewport: MapViewport,
|
|
1
|
+
{"version":3,"names":["DEFAULT_MAP_VIEWPORT","latitude","longitude","zoom","MIN_ZOOM","MAX_ZOOM","clamp","value","min","max","Math","normalizeMapViewport","viewport","Number","isFinite","scale","latitudeLimit","longitudeLimit","zoomMapViewport","delta","focus","panMapViewport","deltaX","deltaY","width","height"],"sources":["content/chart-map-viewport.ts"],"sourcesContent":["import type { MapViewport } from \"@k2b/stdlib\";\n\nexport const DEFAULT_MAP_VIEWPORT: MapViewport = {\n latitude: 0,\n longitude: 0,\n zoom: 0,\n};\n\nconst MIN_ZOOM = 0;\nconst MAX_ZOOM = 5;\n\nconst clamp = (value: number, min: number, max: number): number => Math.min(max, Math.max(min, value));\n\nexport const normalizeMapViewport = (viewport: MapViewport | undefined): MapViewport => {\n const zoom = clamp(viewport && Number.isFinite(viewport.zoom) ? viewport.zoom : MIN_ZOOM, MIN_ZOOM, MAX_ZOOM);\n const scale = 2 ** zoom;\n const latitudeLimit = 90 - 90 / scale;\n const longitudeLimit = 180 - 180 / scale;\n\n return {\n latitude: clamp(viewport && Number.isFinite(viewport.latitude) ? viewport.latitude : 0, -latitudeLimit, latitudeLimit),\n longitude: clamp(viewport && Number.isFinite(viewport.longitude) ? viewport.longitude : 0, -longitudeLimit, longitudeLimit),\n zoom,\n };\n};\n\nexport const zoomMapViewport = (\n viewport: MapViewport,\n delta: number,\n focus: Pick<MapViewport, \"latitude\" | \"longitude\"> = { latitude: 50, longitude: 10 },\n): MapViewport =>\n normalizeMapViewport({\n ...viewport,\n ...(viewport.zoom === 0 && delta > 0 ? focus : {}),\n zoom: viewport.zoom + delta,\n });\n\nexport const panMapViewport = (viewport: MapViewport, deltaX: number, deltaY: number, width: number, height: number): MapViewport => {\n if (width <= 0 || height <= 0) return normalizeMapViewport(viewport);\n\n const scale = 2 ** viewport.zoom;\n return normalizeMapViewport({\n latitude: viewport.latitude + (deltaY / height) * (180 / scale),\n longitude: viewport.longitude - (deltaX / width) * (360 / scale),\n zoom: viewport.zoom,\n });\n};\n"],"mappings":"AAEA,OAAO,MAAMA,oBAAiC,GAAG;EAC/CC,QAAQ,EAAE,CAAC;EACXC,SAAS,EAAE,CAAC;EACZC,IAAI,EAAE;AACR,CAAC;AAED,MAAMC,QAAQ,GAAG,CAAC;AAClB,MAAMC,QAAQ,GAAG,CAAC;AAElB,MAAMC,KAAK,GAAGA,CAACC,KAAa,EAAEC,GAAW,EAAEC,GAAW,KAAaC,IAAI,CAACF,GAAG,CAACC,GAAG,EAAEC,IAAI,CAACD,GAAG,CAACD,GAAG,EAAED,KAAK,CAAC,CAAC;AAEtG,OAAO,MAAMI,oBAAoB,GAAIC,QAAiC,IAAkB;EACtF,MAAMT,IAAI,GAAGG,KAAK,CAACM,QAAQ,IAAIC,MAAM,CAACC,QAAQ,CAACF,QAAQ,CAACT,IAAI,CAAC,GAAGS,QAAQ,CAACT,IAAI,GAAGC,QAAQ,EAAEA,QAAQ,EAAEC,QAAQ,CAAC;EAC7G,MAAMU,KAAK,GAAG,CAAC,IAAIZ,IAAI;EACvB,MAAMa,aAAa,GAAG,EAAE,GAAG,EAAE,GAAGD,KAAK;EACrC,MAAME,cAAc,GAAG,GAAG,GAAG,GAAG,GAAGF,KAAK;EAExC,OAAO;IACLd,QAAQ,EAAEK,KAAK,CAACM,QAAQ,IAAIC,MAAM,CAACC,QAAQ,CAACF,QAAQ,CAACX,QAAQ,CAAC,GAAGW,QAAQ,CAACX,QAAQ,GAAG,CAAC,EAAE,CAACe,aAAa,EAAEA,aAAa,CAAC;IACtHd,SAAS,EAAEI,KAAK,CAACM,QAAQ,IAAIC,MAAM,CAACC,QAAQ,CAACF,QAAQ,CAACV,SAAS,CAAC,GAAGU,QAAQ,CAACV,SAAS,GAAG,CAAC,EAAE,CAACe,cAAc,EAAEA,cAAc,CAAC;IAC3Hd;EACF,CAAC;AACH,CAAC;AAED,OAAO,MAAMe,eAAe,GAAGA,CAC7BN,QAAqB,EACrBO,KAAa,EACbC,KAAkD,GAAG;EAAEnB,QAAQ,EAAE,EAAE;EAAEC,SAAS,EAAE;AAAG,CAAC,KAEpFS,oBAAoB,CAAC;EACnB,GAAGC,QAAQ;EACX,IAAIA,QAAQ,CAACT,IAAI,KAAK,CAAC,IAAIgB,KAAK,GAAG,CAAC,GAAGC,KAAK,GAAG,CAAC,CAAC,CAAC;EAClDjB,IAAI,EAAES,QAAQ,CAACT,IAAI,GAAGgB;AACxB,CAAC,CAAC;AAEJ,OAAO,MAAME,cAAc,GAAGA,CAACT,QAAqB,EAAEU,MAAc,EAAEC,MAAc,EAAEC,KAAa,EAAEC,MAAc,KAAkB;EACnI,IAAID,KAAK,IAAI,CAAC,IAAIC,MAAM,IAAI,CAAC,EAAE,OAAOd,oBAAoB,CAACC,QAAQ,CAAC;EAEpE,MAAMG,KAAK,GAAG,CAAC,IAAIH,QAAQ,CAACT,IAAI;EAChC,OAAOQ,oBAAoB,CAAC;IAC1BV,QAAQ,EAAEW,QAAQ,CAACX,QAAQ,GAAIsB,MAAM,GAAGE,MAAM,IAAK,GAAG,GAAGV,KAAK,CAAC;IAC/Db,SAAS,EAAEU,QAAQ,CAACV,SAAS,GAAIoB,MAAM,GAAGE,KAAK,IAAK,GAAG,GAAGT,KAAK,CAAC;IAChEZ,IAAI,EAAES,QAAQ,CAACT;EACjB,CAAC,CAAC;AACJ,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { escapeXml } from "@k2b/stdlib";
|
|
2
|
+
import { chartRenderHeight, renderChartSvg } from "./Chart";
|
|
3
|
+
import { isChartDatum } from "./chart-inspection";
|
|
4
|
+
|
|
5
|
+
/** Trusted output of prepareChartSnapshot; never accept arbitrary user SVG. */
|
|
6
|
+
|
|
7
|
+
// Matches metadata emitted by our SVG renderer, not arbitrary XML.
|
|
8
|
+
const decodeAttribute = value => value.replace(/"/g, '"').replace(/'|'/g, "'").replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&");
|
|
9
|
+
|
|
10
|
+
/** Pure SVG preparation for server or browser. Transfer only this output across SSR boundaries. */
|
|
11
|
+
export function prepareChartSnapshot(options, inspection) {
|
|
12
|
+
const width = 480;
|
|
13
|
+
const height = chartRenderHeight(options);
|
|
14
|
+
const svg = renderChartSvg({
|
|
15
|
+
...options,
|
|
16
|
+
interactive: true
|
|
17
|
+
}, width, height);
|
|
18
|
+
const marks = [];
|
|
19
|
+
const keys = new Set();
|
|
20
|
+
for (const match of svg.matchAll(/data-chart-datum="([^"]*)"/g)) {
|
|
21
|
+
const datum = JSON.parse(decodeAttribute(match[1]));
|
|
22
|
+
if (!isChartDatum(datum)) throw new Error("Invalid renderer chart metadata");
|
|
23
|
+
const selection = {
|
|
24
|
+
kind: options.kind,
|
|
25
|
+
datum
|
|
26
|
+
};
|
|
27
|
+
const key = inspection.key(selection);
|
|
28
|
+
if (!key || keys.has(key)) throw new Error("Chart snapshot requires a unique nonempty key for every mark");
|
|
29
|
+
keys.add(key);
|
|
30
|
+
const rowKey = inspection.rowKey?.(selection) ?? key;
|
|
31
|
+
if (!rowKey) throw new Error("Chart marks require a nonempty rowKey");
|
|
32
|
+
marks.push({
|
|
33
|
+
key,
|
|
34
|
+
rowKey,
|
|
35
|
+
datum,
|
|
36
|
+
tooltip: inspection.tooltip(selection),
|
|
37
|
+
...(inspection.reference?.(selection) ? {
|
|
38
|
+
reference: true
|
|
39
|
+
} : {})
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
let markIndex = 0;
|
|
43
|
+
const formattedSvg = svg.replace(/(<g data-chart-role="[^"]*" data-chart-datum="[^"]*"><title>)[\s\S]*?<\/title>/g, (_match, opening, offset) => {
|
|
44
|
+
const mark = marks[markIndex++];
|
|
45
|
+
const tooltip = mark.tooltip;
|
|
46
|
+
const text = [tooltip.title, ...tooltip.rows.map(row => `${row.label}: ${row.value}`)].filter(Boolean).join(" · ");
|
|
47
|
+
if (mark.reference) {
|
|
48
|
+
const children = svg.slice(offset, svg.indexOf("</g>", offset));
|
|
49
|
+
const palette = Number(children.match(/stdlib-chart-series-(\d+)/)?.[1] ?? mark.datum.seriesIndex ?? 0) % 8 + 1;
|
|
50
|
+
opening = opening.replace("<g ", `<g data-chart-reference="true" style="--k2b-chart-reference-color:var(--stdlib-chart-c${palette})" `);
|
|
51
|
+
}
|
|
52
|
+
return `${opening}${escapeXml(text)}</title>`;
|
|
53
|
+
});
|
|
54
|
+
return {
|
|
55
|
+
kind: options.kind,
|
|
56
|
+
svg: formattedSvg,
|
|
57
|
+
width,
|
|
58
|
+
height,
|
|
59
|
+
stretch: !["map", "pie", "donut", "gauge"].includes(options.kind),
|
|
60
|
+
marks
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=chart-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["escapeXml","chartRenderHeight","renderChartSvg","isChartDatum","decodeAttribute","value","replace","prepareChartSnapshot","options","inspection","width","height","svg","interactive","marks","keys","Set","match","matchAll","datum","JSON","parse","Error","selection","kind","key","has","add","rowKey","push","tooltip","reference","markIndex","formattedSvg","_match","opening","offset","mark","text","title","rows","map","row","label","filter","Boolean","join","children","slice","indexOf","palette","Number","seriesIndex","stretch","includes"],"sources":["content/chart-snapshot.ts"],"sourcesContent":["import { type ChartDatum, escapeXml } from \"@k2b/stdlib\";\nimport { type ChartKind, type ChartRenderOptions, chartRenderHeight, renderChartSvg } from \"./Chart\";\nimport { type ChartSelection, type ChartTooltip, type ChartTooltipFormatter, isChartDatum } from \"./chart-inspection\";\n\n/** Trusted output of prepareChartSnapshot; never accept arbitrary user SVG. */\nexport type ChartSnapshot = {\n kind: ChartKind;\n svg: string;\n width: number;\n height: number;\n stretch: boolean;\n marks: readonly { key: string; rowKey: string; datum: ChartDatum; tooltip: ChartTooltip; reference?: boolean }[];\n};\n\n// Matches metadata emitted by our SVG renderer, not arbitrary XML.\nconst decodeAttribute = (value: string) =>\n value\n .replace(/"/g, '\"')\n .replace(/'|'/g, \"'\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\");\n\n/** Pure SVG preparation for server or browser. Transfer only this output across SSR boundaries. */\nexport function prepareChartSnapshot(\n options: ChartRenderOptions,\n inspection: {\n key: (selection: ChartSelection) => string;\n /** Defaults to the mark key for one-to-one charts. */\n rowKey?: (selection: ChartSelection) => string;\n tooltip: ChartTooltipFormatter;\n reference?: (selection: ChartSelection) => boolean;\n },\n): ChartSnapshot {\n const width = 480;\n const height = chartRenderHeight(options);\n const svg = renderChartSvg({ ...options, interactive: true }, width, height);\n const marks: ChartSnapshot[\"marks\"][number][] = [];\n const keys = new Set<string>();\n for (const match of svg.matchAll(/data-chart-datum=\"([^\"]*)\"/g)) {\n const datum: unknown = JSON.parse(decodeAttribute(match[1]!));\n if (!isChartDatum(datum)) throw new Error(\"Invalid renderer chart metadata\");\n const selection = { kind: options.kind, datum };\n const key = inspection.key(selection);\n if (!key || keys.has(key)) throw new Error(\"Chart snapshot requires a unique nonempty key for every mark\");\n keys.add(key);\n const rowKey = inspection.rowKey?.(selection) ?? key;\n if (!rowKey) throw new Error(\"Chart marks require a nonempty rowKey\");\n marks.push({\n key,\n rowKey,\n datum,\n tooltip: inspection.tooltip(selection),\n ...(inspection.reference?.(selection) ? { reference: true } : {}),\n });\n }\n let markIndex = 0;\n const formattedSvg = svg.replace(\n /(<g data-chart-role=\"[^\"]*\" data-chart-datum=\"[^\"]*\"><title>)[\\s\\S]*?<\\/title>/g,\n (_match, opening: string, offset: number) => {\n const mark = marks[markIndex++]!;\n const tooltip = mark.tooltip;\n const text = [tooltip.title, ...tooltip.rows.map((row) => `${row.label}: ${row.value}`)].filter(Boolean).join(\" · \");\n if (mark.reference) {\n const children = svg.slice(offset, svg.indexOf(\"</g>\", offset));\n const palette = (Number(children.match(/stdlib-chart-series-(\\d+)/)?.[1] ?? mark.datum.seriesIndex ?? 0) % 8) + 1;\n opening = opening.replace(\n \"<g \",\n `<g data-chart-reference=\"true\" style=\"--k2b-chart-reference-color:var(--stdlib-chart-c${palette})\" `,\n );\n }\n return `${opening}${escapeXml(text)}</title>`;\n },\n );\n return { kind: options.kind, svg: formattedSvg, width, height, stretch: ![\"map\", \"pie\", \"donut\", \"gauge\"].includes(options.kind), marks };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { computeDomain, escapeXml, extendDomainToNice, mapRange, niceStep, svgRoot } from "@k2b/stdlib";
|
|
1
|
+
import { chartDatumSvg, computeDomain, escapeXml, extendDomainToNice, mapRange, niceStep, svgRoot } from "@k2b/stdlib";
|
|
2
2
|
const ROW_HEIGHT = 24;
|
|
3
3
|
const TOP = 38;
|
|
4
4
|
const AXIS_HEIGHT = 28;
|
|
@@ -45,7 +45,7 @@ const interactiveGroup = (body, href, tooltip, ariaLabel) => {
|
|
|
45
45
|
const safe = safeHref(href);
|
|
46
46
|
const attrs = [`aria-label="${escapeXml(ariaLabel)}"`, tooltip ? `data-chart-tooltip="${escapeXml(tooltip)}"` : ""].filter(Boolean).join(" ");
|
|
47
47
|
const title = tooltip ? `<title>${escapeXml(tooltip)}</title>` : "";
|
|
48
|
-
return safe ? `<a href="${escapeXml(safe)}" ${attrs}>${title}${body}</a>` : `<g ${attrs}${tooltip ? '
|
|
48
|
+
return safe ? `<a href="${escapeXml(safe)}" ${attrs}>${title}${body}</a>` : `<g ${attrs}${tooltip ? ' role="img"' : ""}>${title}${body}</g>`;
|
|
49
49
|
};
|
|
50
50
|
export const renderStateTimelineSvg = opts => {
|
|
51
51
|
const {
|
|
@@ -77,7 +77,7 @@ export const renderStateTimelineSvg = opts => {
|
|
|
77
77
|
const label = truncate(row.label, maxLabelChars);
|
|
78
78
|
const labelBody = `<text class="stdlib-chart-state-label" x="${fmt(plotLeft - 8)}" y="${fmt(y + ROW_HEIGHT / 2)}" text-anchor="end" dominant-baseline="middle">${escapeXml(label)}</text>`;
|
|
79
79
|
body.push(interactiveGroup(labelBody, row.href, row.tooltip ?? row.label, row.label));
|
|
80
|
-
for (const interval of row.intervals) {
|
|
80
|
+
for (const [index, interval] of row.intervals.entries()) {
|
|
81
81
|
if (!Number.isFinite(interval.from) || !Number.isFinite(interval.to)) continue;
|
|
82
82
|
const intervalFrom = Math.min(interval.from, interval.to);
|
|
83
83
|
const intervalTo = Math.max(interval.from, interval.to);
|
|
@@ -91,7 +91,33 @@ export const renderStateTimelineSvg = opts => {
|
|
|
91
91
|
const color = style?.color ? ` fill="${escapeXml(style.color)}"` : "";
|
|
92
92
|
const rect = `<rect class="stdlib-chart-state-region stdlib-chart-series-${stateIndex % 8}"${color} x="${fmt(x)}" y="${fmt(y + 3)}" width="${fmt(Math.max(2, x2 - x))}" height="${ROW_HEIGHT - 6}" rx="3"/>`;
|
|
93
93
|
const stateLabel = style?.label ?? interval.state;
|
|
94
|
-
body.push(interactiveGroup(rect,
|
|
94
|
+
body.push(interactiveGroup(chartDatumSvg(rect, {
|
|
95
|
+
index,
|
|
96
|
+
seriesIndex: rowIndex,
|
|
97
|
+
role: "interval",
|
|
98
|
+
label: row.label,
|
|
99
|
+
anchor: [(x + x2) / 2, y + ROW_HEIGHT / 2],
|
|
100
|
+
grid: [index, rowIndex],
|
|
101
|
+
values: [{
|
|
102
|
+
key: "state",
|
|
103
|
+
value: interval.state,
|
|
104
|
+
formatted: stateLabel
|
|
105
|
+
}, {
|
|
106
|
+
key: "from",
|
|
107
|
+
value: intervalFrom,
|
|
108
|
+
formatted: opts.xAxis?.format?.(intervalFrom)
|
|
109
|
+
}, {
|
|
110
|
+
key: "to",
|
|
111
|
+
value: intervalTo,
|
|
112
|
+
formatted: opts.xAxis?.format?.(intervalTo)
|
|
113
|
+
}, {
|
|
114
|
+
key: "duration",
|
|
115
|
+
value: intervalTo - intervalFrom
|
|
116
|
+
}, ...(interval.tooltip ?? interval.label ? [{
|
|
117
|
+
key: "detail",
|
|
118
|
+
value: interval.tooltip ?? interval.label ?? ""
|
|
119
|
+
}] : [])]
|
|
120
|
+
}, opts.interactive), interval.href, interval.tooltip ?? interval.label, [row.label, interval.label, stateLabel].filter(Boolean).join(", ")));
|
|
95
121
|
}
|
|
96
122
|
});
|
|
97
123
|
const tickTarget = Math.max(2, Math.min(8, Math.floor((plotRight - plotLeft) / 110)));
|
|
@@ -106,6 +132,7 @@ export const renderStateTimelineSvg = opts => {
|
|
|
106
132
|
body.push(`<text class="stdlib-chart-axis-label" x="${fmt((plotLeft + plotRight) / 2)}" y="${fmt(rowsBottom + AXIS_HEIGHT - 2)}" text-anchor="middle">${escapeXml(opts.xAxis.label)}</text>`);
|
|
107
133
|
}
|
|
108
134
|
if (showLegend) {
|
|
135
|
+
body.push('<g class="stdlib-chart-legend">');
|
|
109
136
|
let x = plotLeft;
|
|
110
137
|
const y = height - 9;
|
|
111
138
|
for (const [index, state] of (opts.states ?? []).entries()) {
|
|
@@ -114,6 +141,7 @@ export const renderStateTimelineSvg = opts => {
|
|
|
114
141
|
body.push(`<rect class="stdlib-chart-series-${index % 8}"${color} x="${fmt(x)}" y="${y - 8}" width="8" height="8" rx="2"/>`, `<text class="stdlib-chart-heatmap-label" x="${fmt(x + 12)}" y="${y}" text-anchor="start">${escapeXml(label)}</text>`);
|
|
115
142
|
x += 20 + label.length * 6.2;
|
|
116
143
|
}
|
|
144
|
+
body.push("</g>");
|
|
117
145
|
}
|
|
118
146
|
return svgRoot({
|
|
119
147
|
width,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["computeDomain","escapeXml","extendDomainToNice","mapRange","niceStep","svgRoot","ROW_HEIGHT","TOP","AXIS_HEIGHT","LEGEND_HEIGHT","MIN_VIEW_FRACTION","finiteDomain","domain","Number","isFinite","stateTimelineDomain","rows","explicit","flatMap","row","intervals","interval","from","to","normalizeStateTimelineViewport","viewport","fullDomain","full","candidate","span","Math","min","max","zoomStateTimelineViewport","delta","anchor","current","fullSpan","minSpan","factor","nextSpan","safeAnchor","anchorValue","panStateTimelineViewport","pixelDelta","plotWidth","timeDelta","stateTimelineHeight","legend","fmt","value","isInteger","String","toFixed","safeHref","href","startsWith","truncate","maxChars","length","slice","interactiveGroup","body","tooltip","ariaLabel","safe","attrs","filter","Boolean","join","title","renderStateTimelineSvg","opts","width","height","showLegend","states","legendHeight","labels","map","label","idealGutter","gutter","plotLeft","plotRight","rowsBottom","stateStyles","Map","state","index","stateKeys","Set","i","stateIndexes","maxLabelChars","floor","forEach","rowIndex","y","labelBody","push","intervalFrom","intervalTo","x","x2","style","get","stateIndex","color","rect","stateLabel","tickTarget","ticks","format","xAxis","tick","entries","className"],"sources":["content/chart-state-timeline.ts"],"sourcesContent":["import { computeDomain, escapeXml, extendDomainToNice, mapRange, niceStep, svgRoot } from \"@k2b/stdlib\";\n\nexport type StateTimelineDomain = readonly [number, number];\n\nexport type StateTimelineInterval = {\n from: number;\n to: number;\n state: string;\n label?: string;\n href?: string;\n tooltip?: string;\n};\n\nexport type StateTimelineRow = {\n label: string;\n href?: string;\n tooltip?: string;\n intervals: StateTimelineInterval[];\n};\n\nexport type StateTimelineState = {\n state: string;\n label?: string;\n color?: string;\n};\n\nexport type StateTimelineChartOptions = {\n rows: StateTimelineRow[];\n states?: StateTimelineState[];\n domain?: StateTimelineDomain;\n xAxis?: { format?: (value: number) => string; label?: string };\n legend?: boolean;\n interactive?: boolean;\n};\n\nconst ROW_HEIGHT = 24;\nconst TOP = 38;\nconst AXIS_HEIGHT = 28;\nconst LEGEND_HEIGHT = 24;\nconst MIN_VIEW_FRACTION = 1 / 64;\n\nconst finiteDomain = (domain: StateTimelineDomain): StateTimelineDomain | null => {\n if (!Number.isFinite(domain[0]) || !Number.isFinite(domain[1]) || domain[0] === domain[1]) return null;\n return domain[0] < domain[1] ? domain : [domain[1], domain[0]];\n};\n\nexport const stateTimelineDomain = (rows: readonly StateTimelineRow[], domain?: StateTimelineDomain): StateTimelineDomain => {\n const explicit = domain ? finiteDomain(domain) : null;\n if (explicit) return explicit;\n return computeDomain(rows.flatMap((row) => row.intervals.flatMap((interval) => [interval.from, interval.to])));\n};\n\nexport const normalizeStateTimelineViewport = (\n viewport: StateTimelineDomain | undefined,\n fullDomain: StateTimelineDomain,\n): StateTimelineDomain => {\n const full = finiteDomain(fullDomain) ?? [0, 1];\n const candidate = viewport ? finiteDomain(viewport) : null;\n if (!candidate) return full;\n const span = Math.min(candidate[1] - candidate[0], full[1] - full[0]);\n const from = Math.max(full[0], Math.min(candidate[0], full[1] - span));\n return [from, from + span];\n};\n\nexport const zoomStateTimelineViewport = (\n viewport: StateTimelineDomain,\n fullDomain: StateTimelineDomain,\n delta: number,\n anchor = 0.5,\n): StateTimelineDomain => {\n const current = normalizeStateTimelineViewport(viewport, fullDomain);\n const fullSpan = fullDomain[1] - fullDomain[0];\n const minSpan = Math.max(1, fullSpan * MIN_VIEW_FRACTION);\n const factor = delta > 0 ? 0.7 : 1 / 0.7;\n const nextSpan = Math.max(minSpan, Math.min(fullSpan, (current[1] - current[0]) * factor));\n const safeAnchor = Math.max(0, Math.min(1, anchor));\n const anchorValue = current[0] + (current[1] - current[0]) * safeAnchor;\n return normalizeStateTimelineViewport([anchorValue - nextSpan * safeAnchor, anchorValue + nextSpan * (1 - safeAnchor)], fullDomain);\n};\n\nexport const panStateTimelineViewport = (\n viewport: StateTimelineDomain,\n fullDomain: StateTimelineDomain,\n pixelDelta: number,\n plotWidth: number,\n): StateTimelineDomain => {\n if (plotWidth <= 0) return normalizeStateTimelineViewport(viewport, fullDomain);\n const current = normalizeStateTimelineViewport(viewport, fullDomain);\n const timeDelta = (-pixelDelta / plotWidth) * (current[1] - current[0]);\n return normalizeStateTimelineViewport([current[0] + timeDelta, current[1] + timeDelta], fullDomain);\n};\n\nexport const stateTimelineHeight = (rows: number, legend = true): number =>\n Math.max(160, TOP + rows * ROW_HEIGHT + AXIS_HEIGHT + (legend ? LEGEND_HEIGHT : 0));\n\nconst fmt = (value: number): string => (Number.isInteger(value) ? String(value) : value.toFixed(2));\n\nconst safeHref = (href: string | undefined): string | null => (href && href.startsWith(\"/\") && !href.startsWith(\"//\") ? href : null);\n\nconst truncate = (value: string, maxChars: number): string =>\n value.length <= maxChars ? value : `${value.slice(0, Math.max(1, maxChars - 1))}…`;\n\nconst interactiveGroup = (body: string, href: string | undefined, tooltip: string | undefined, ariaLabel: string): string => {\n const safe = safeHref(href);\n const attrs = [`aria-label=\"${escapeXml(ariaLabel)}\"`, tooltip ? `data-chart-tooltip=\"${escapeXml(tooltip)}\"` : \"\"]\n .filter(Boolean)\n .join(\" \");\n const title = tooltip ? `<title>${escapeXml(tooltip)}</title>` : \"\";\n return safe\n ? `<a href=\"${escapeXml(safe)}\" ${attrs}>${title}${body}</a>`\n : `<g ${attrs}${tooltip ? ' tabindex=\"0\" role=\"img\"' : \"\"}>${title}${body}</g>`;\n};\n\nexport const renderStateTimelineSvg = (\n opts: StateTimelineChartOptions & {\n width: number;\n height: number;\n viewport?: StateTimelineDomain;\n className?: string;\n },\n): string => {\n const { width, height, rows } = opts;\n const fullDomain = stateTimelineDomain(rows, opts.domain);\n const viewport = normalizeStateTimelineViewport(opts.viewport, fullDomain);\n const showLegend = opts.legend !== false && (opts.states?.length ?? 0) > 0;\n const legendHeight = showLegend ? LEGEND_HEIGHT : 0;\n const labels = rows.map((row) => row.label);\n const idealGutter = Math.max(72, ...labels.map((label) => label.length * 6.3 + 20));\n const gutter = Math.min(240, width * 0.35, idealGutter);\n const plotLeft = gutter;\n const plotRight = Math.max(plotLeft + 1, width - 16);\n const rowsBottom = Math.min(height - AXIS_HEIGHT - legendHeight, TOP + rows.length * ROW_HEIGHT);\n const stateStyles = new Map((opts.states ?? []).map((state, index) => [state.state, { ...state, index }]));\n const stateKeys = opts.states?.map((state) => state.state) ?? [...new Set(rows.flatMap((row) => row.intervals.map((i) => i.state)))];\n const stateIndexes = new Map(stateKeys.map((state, index) => [state, index]));\n const body: string[] = [];\n const maxLabelChars = Math.max(4, Math.floor((gutter - 18) / 6.3));\n\n rows.forEach((row, rowIndex) => {\n const y = TOP + rowIndex * ROW_HEIGHT;\n if (y + ROW_HEIGHT > rowsBottom + 1) return;\n const label = truncate(row.label, maxLabelChars);\n const labelBody = `<text class=\"stdlib-chart-state-label\" x=\"${fmt(plotLeft - 8)}\" y=\"${fmt(\n y + ROW_HEIGHT / 2,\n )}\" text-anchor=\"end\" dominant-baseline=\"middle\">${escapeXml(label)}</text>`;\n body.push(interactiveGroup(labelBody, row.href, row.tooltip ?? row.label, row.label));\n\n for (const interval of row.intervals) {\n if (!Number.isFinite(interval.from) || !Number.isFinite(interval.to)) continue;\n const intervalFrom = Math.min(interval.from, interval.to);\n const intervalTo = Math.max(interval.from, interval.to);\n if (intervalTo < viewport[0] || intervalFrom > viewport[1]) continue;\n const from = Math.max(viewport[0], intervalFrom);\n const to = Math.min(viewport[1], intervalTo);\n const x = mapRange(from, viewport, [plotLeft, plotRight]);\n const x2 = mapRange(to, viewport, [plotLeft, plotRight]);\n const style = stateStyles.get(interval.state);\n const stateIndex = style?.index ?? stateIndexes.get(interval.state) ?? 0;\n const color = style?.color ? ` fill=\"${escapeXml(style.color)}\"` : \"\";\n const rect = `<rect class=\"stdlib-chart-state-region stdlib-chart-series-${stateIndex % 8}\"${color} x=\"${fmt(\n x,\n )}\" y=\"${fmt(y + 3)}\" width=\"${fmt(Math.max(2, x2 - x))}\" height=\"${ROW_HEIGHT - 6}\" rx=\"3\"/>`;\n const stateLabel = style?.label ?? interval.state;\n body.push(\n interactiveGroup(\n rect,\n interval.href,\n interval.tooltip ?? interval.label,\n [row.label, interval.label, stateLabel].filter(Boolean).join(\", \"),\n ),\n );\n }\n });\n\n const tickTarget = Math.max(2, Math.min(8, Math.floor((plotRight - plotLeft) / 110)));\n const ticks = extendDomainToNice(viewport[0], viewport[1], niceStep(viewport[1] - viewport[0], tickTarget)).ticks;\n const format = opts.xAxis?.format ?? ((value: number) => fmt(value));\n for (const tick of ticks) {\n if (tick < viewport[0] || tick > viewport[1]) continue;\n const x = mapRange(tick, viewport, [plotLeft, plotRight]);\n body.push(\n `<line x1=\"${fmt(x)}\" x2=\"${fmt(x)}\" y1=\"${TOP}\" y2=\"${fmt(rowsBottom)}\" stroke=\"currentColor\" opacity=\"0.08\"/>`,\n `<text class=\"stdlib-chart-heatmap-label\" x=\"${fmt(x)}\" y=\"${fmt(rowsBottom + 17)}\" text-anchor=\"middle\">${escapeXml(\n format(tick),\n )}</text>`,\n );\n }\n\n if (opts.xAxis?.label) {\n body.push(\n `<text class=\"stdlib-chart-axis-label\" x=\"${fmt((plotLeft + plotRight) / 2)}\" y=\"${fmt(\n rowsBottom + AXIS_HEIGHT - 2,\n )}\" text-anchor=\"middle\">${escapeXml(opts.xAxis.label)}</text>`,\n );\n }\n\n if (showLegend) {\n let x = plotLeft;\n const y = height - 9;\n for (const [index, state] of (opts.states ?? []).entries()) {\n const color = state.color ? ` fill=\"${escapeXml(state.color)}\"` : \"\";\n const label = state.label ?? state.state;\n body.push(\n `<rect class=\"stdlib-chart-series-${index % 8}\"${color} x=\"${fmt(x)}\" y=\"${y - 8}\" width=\"8\" height=\"8\" rx=\"2\"/>`,\n `<text class=\"stdlib-chart-heatmap-label\" x=\"${fmt(x + 12)}\" y=\"${y}\" text-anchor=\"start\">${escapeXml(label)}</text>`,\n );\n x += 20 + label.length * 6.2;\n }\n }\n\n return svgRoot({ width, height, className: opts.className }, body.join(\"\"));\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["chartDatumSvg","computeDomain","escapeXml","extendDomainToNice","mapRange","niceStep","svgRoot","ROW_HEIGHT","TOP","AXIS_HEIGHT","LEGEND_HEIGHT","MIN_VIEW_FRACTION","finiteDomain","domain","Number","isFinite","stateTimelineDomain","rows","explicit","flatMap","row","intervals","interval","from","to","normalizeStateTimelineViewport","viewport","fullDomain","full","candidate","span","Math","min","max","zoomStateTimelineViewport","delta","anchor","current","fullSpan","minSpan","factor","nextSpan","safeAnchor","anchorValue","panStateTimelineViewport","pixelDelta","plotWidth","timeDelta","stateTimelineHeight","legend","fmt","value","isInteger","String","toFixed","safeHref","href","startsWith","truncate","maxChars","length","slice","interactiveGroup","body","tooltip","ariaLabel","safe","attrs","filter","Boolean","join","title","renderStateTimelineSvg","opts","width","height","showLegend","states","legendHeight","labels","map","label","idealGutter","gutter","plotLeft","plotRight","rowsBottom","stateStyles","Map","state","index","stateKeys","Set","i","stateIndexes","maxLabelChars","floor","forEach","rowIndex","y","labelBody","push","entries","intervalFrom","intervalTo","x","x2","style","get","stateIndex","color","rect","stateLabel","seriesIndex","role","grid","values","key","formatted","xAxis","format","interactive","tickTarget","ticks","tick","className"],"sources":["content/chart-state-timeline.ts"],"sourcesContent":["import { chartDatumSvg, computeDomain, escapeXml, extendDomainToNice, mapRange, niceStep, svgRoot } from \"@k2b/stdlib\";\n\nexport type StateTimelineDomain = readonly [number, number];\n\nexport type StateTimelineInterval = {\n from: number;\n to: number;\n state: string;\n label?: string;\n href?: string;\n tooltip?: string;\n};\n\nexport type StateTimelineRow = {\n label: string;\n href?: string;\n tooltip?: string;\n intervals: StateTimelineInterval[];\n};\n\nexport type StateTimelineState = {\n state: string;\n label?: string;\n color?: string;\n};\n\nexport type StateTimelineChartOptions = {\n rows: StateTimelineRow[];\n states?: StateTimelineState[];\n domain?: StateTimelineDomain;\n xAxis?: { format?: (value: number) => string; label?: string };\n legend?: boolean;\n interactive?: boolean;\n};\n\nconst ROW_HEIGHT = 24;\nconst TOP = 38;\nconst AXIS_HEIGHT = 28;\nconst LEGEND_HEIGHT = 24;\nconst MIN_VIEW_FRACTION = 1 / 64;\n\nconst finiteDomain = (domain: StateTimelineDomain): StateTimelineDomain | null => {\n if (!Number.isFinite(domain[0]) || !Number.isFinite(domain[1]) || domain[0] === domain[1]) return null;\n return domain[0] < domain[1] ? domain : [domain[1], domain[0]];\n};\n\nexport const stateTimelineDomain = (rows: readonly StateTimelineRow[], domain?: StateTimelineDomain): StateTimelineDomain => {\n const explicit = domain ? finiteDomain(domain) : null;\n if (explicit) return explicit;\n return computeDomain(rows.flatMap((row) => row.intervals.flatMap((interval) => [interval.from, interval.to])));\n};\n\nexport const normalizeStateTimelineViewport = (\n viewport: StateTimelineDomain | undefined,\n fullDomain: StateTimelineDomain,\n): StateTimelineDomain => {\n const full = finiteDomain(fullDomain) ?? [0, 1];\n const candidate = viewport ? finiteDomain(viewport) : null;\n if (!candidate) return full;\n const span = Math.min(candidate[1] - candidate[0], full[1] - full[0]);\n const from = Math.max(full[0], Math.min(candidate[0], full[1] - span));\n return [from, from + span];\n};\n\nexport const zoomStateTimelineViewport = (\n viewport: StateTimelineDomain,\n fullDomain: StateTimelineDomain,\n delta: number,\n anchor = 0.5,\n): StateTimelineDomain => {\n const current = normalizeStateTimelineViewport(viewport, fullDomain);\n const fullSpan = fullDomain[1] - fullDomain[0];\n const minSpan = Math.max(1, fullSpan * MIN_VIEW_FRACTION);\n const factor = delta > 0 ? 0.7 : 1 / 0.7;\n const nextSpan = Math.max(minSpan, Math.min(fullSpan, (current[1] - current[0]) * factor));\n const safeAnchor = Math.max(0, Math.min(1, anchor));\n const anchorValue = current[0] + (current[1] - current[0]) * safeAnchor;\n return normalizeStateTimelineViewport([anchorValue - nextSpan * safeAnchor, anchorValue + nextSpan * (1 - safeAnchor)], fullDomain);\n};\n\nexport const panStateTimelineViewport = (\n viewport: StateTimelineDomain,\n fullDomain: StateTimelineDomain,\n pixelDelta: number,\n plotWidth: number,\n): StateTimelineDomain => {\n if (plotWidth <= 0) return normalizeStateTimelineViewport(viewport, fullDomain);\n const current = normalizeStateTimelineViewport(viewport, fullDomain);\n const timeDelta = (-pixelDelta / plotWidth) * (current[1] - current[0]);\n return normalizeStateTimelineViewport([current[0] + timeDelta, current[1] + timeDelta], fullDomain);\n};\n\nexport const stateTimelineHeight = (rows: number, legend = true): number =>\n Math.max(160, TOP + rows * ROW_HEIGHT + AXIS_HEIGHT + (legend ? LEGEND_HEIGHT : 0));\n\nconst fmt = (value: number): string => (Number.isInteger(value) ? String(value) : value.toFixed(2));\n\nconst safeHref = (href: string | undefined): string | null => (href && href.startsWith(\"/\") && !href.startsWith(\"//\") ? href : null);\n\nconst truncate = (value: string, maxChars: number): string =>\n value.length <= maxChars ? value : `${value.slice(0, Math.max(1, maxChars - 1))}…`;\n\nconst interactiveGroup = (body: string, href: string | undefined, tooltip: string | undefined, ariaLabel: string): string => {\n const safe = safeHref(href);\n const attrs = [`aria-label=\"${escapeXml(ariaLabel)}\"`, tooltip ? `data-chart-tooltip=\"${escapeXml(tooltip)}\"` : \"\"]\n .filter(Boolean)\n .join(\" \");\n const title = tooltip ? `<title>${escapeXml(tooltip)}</title>` : \"\";\n return safe\n ? `<a href=\"${escapeXml(safe)}\" ${attrs}>${title}${body}</a>`\n : `<g ${attrs}${tooltip ? ' role=\"img\"' : \"\"}>${title}${body}</g>`;\n};\n\nexport const renderStateTimelineSvg = (\n opts: StateTimelineChartOptions & {\n width: number;\n height: number;\n viewport?: StateTimelineDomain;\n className?: string;\n },\n): string => {\n const { width, height, rows } = opts;\n const fullDomain = stateTimelineDomain(rows, opts.domain);\n const viewport = normalizeStateTimelineViewport(opts.viewport, fullDomain);\n const showLegend = opts.legend !== false && (opts.states?.length ?? 0) > 0;\n const legendHeight = showLegend ? LEGEND_HEIGHT : 0;\n const labels = rows.map((row) => row.label);\n const idealGutter = Math.max(72, ...labels.map((label) => label.length * 6.3 + 20));\n const gutter = Math.min(240, width * 0.35, idealGutter);\n const plotLeft = gutter;\n const plotRight = Math.max(plotLeft + 1, width - 16);\n const rowsBottom = Math.min(height - AXIS_HEIGHT - legendHeight, TOP + rows.length * ROW_HEIGHT);\n const stateStyles = new Map((opts.states ?? []).map((state, index) => [state.state, { ...state, index }]));\n const stateKeys = opts.states?.map((state) => state.state) ?? [...new Set(rows.flatMap((row) => row.intervals.map((i) => i.state)))];\n const stateIndexes = new Map(stateKeys.map((state, index) => [state, index]));\n const body: string[] = [];\n const maxLabelChars = Math.max(4, Math.floor((gutter - 18) / 6.3));\n\n rows.forEach((row, rowIndex) => {\n const y = TOP + rowIndex * ROW_HEIGHT;\n if (y + ROW_HEIGHT > rowsBottom + 1) return;\n const label = truncate(row.label, maxLabelChars);\n const labelBody = `<text class=\"stdlib-chart-state-label\" x=\"${fmt(plotLeft - 8)}\" y=\"${fmt(\n y + ROW_HEIGHT / 2,\n )}\" text-anchor=\"end\" dominant-baseline=\"middle\">${escapeXml(label)}</text>`;\n body.push(interactiveGroup(labelBody, row.href, row.tooltip ?? row.label, row.label));\n\n for (const [index, interval] of row.intervals.entries()) {\n if (!Number.isFinite(interval.from) || !Number.isFinite(interval.to)) continue;\n const intervalFrom = Math.min(interval.from, interval.to);\n const intervalTo = Math.max(interval.from, interval.to);\n if (intervalTo < viewport[0] || intervalFrom > viewport[1]) continue;\n const from = Math.max(viewport[0], intervalFrom);\n const to = Math.min(viewport[1], intervalTo);\n const x = mapRange(from, viewport, [plotLeft, plotRight]);\n const x2 = mapRange(to, viewport, [plotLeft, plotRight]);\n const style = stateStyles.get(interval.state);\n const stateIndex = style?.index ?? stateIndexes.get(interval.state) ?? 0;\n const color = style?.color ? ` fill=\"${escapeXml(style.color)}\"` : \"\";\n const rect = `<rect class=\"stdlib-chart-state-region stdlib-chart-series-${stateIndex % 8}\"${color} x=\"${fmt(\n x,\n )}\" y=\"${fmt(y + 3)}\" width=\"${fmt(Math.max(2, x2 - x))}\" height=\"${ROW_HEIGHT - 6}\" rx=\"3\"/>`;\n const stateLabel = style?.label ?? interval.state;\n body.push(\n interactiveGroup(\n chartDatumSvg(\n rect,\n {\n index,\n seriesIndex: rowIndex,\n role: \"interval\",\n label: row.label,\n anchor: [(x + x2) / 2, y + ROW_HEIGHT / 2],\n grid: [index, rowIndex],\n values: [\n { key: \"state\", value: interval.state, formatted: stateLabel },\n { key: \"from\", value: intervalFrom, formatted: opts.xAxis?.format?.(intervalFrom) },\n { key: \"to\", value: intervalTo, formatted: opts.xAxis?.format?.(intervalTo) },\n { key: \"duration\", value: intervalTo - intervalFrom },\n ...((interval.tooltip ?? interval.label) ? [{ key: \"detail\", value: interval.tooltip ?? interval.label ?? \"\" }] : []),\n ],\n },\n opts.interactive,\n ),\n interval.href,\n interval.tooltip ?? interval.label,\n [row.label, interval.label, stateLabel].filter(Boolean).join(\", \"),\n ),\n );\n }\n });\n\n const tickTarget = Math.max(2, Math.min(8, Math.floor((plotRight - plotLeft) / 110)));\n const ticks = extendDomainToNice(viewport[0], viewport[1], niceStep(viewport[1] - viewport[0], tickTarget)).ticks;\n const format = opts.xAxis?.format ?? ((value: number) => fmt(value));\n for (const tick of ticks) {\n if (tick < viewport[0] || tick > viewport[1]) continue;\n const x = mapRange(tick, viewport, [plotLeft, plotRight]);\n body.push(\n `<line x1=\"${fmt(x)}\" x2=\"${fmt(x)}\" y1=\"${TOP}\" y2=\"${fmt(rowsBottom)}\" stroke=\"currentColor\" opacity=\"0.08\"/>`,\n `<text class=\"stdlib-chart-heatmap-label\" x=\"${fmt(x)}\" y=\"${fmt(rowsBottom + 17)}\" text-anchor=\"middle\">${escapeXml(\n format(tick),\n )}</text>`,\n );\n }\n\n if (opts.xAxis?.label) {\n body.push(\n `<text class=\"stdlib-chart-axis-label\" x=\"${fmt((plotLeft + plotRight) / 2)}\" y=\"${fmt(\n rowsBottom + AXIS_HEIGHT - 2,\n )}\" text-anchor=\"middle\">${escapeXml(opts.xAxis.label)}</text>`,\n );\n }\n\n if (showLegend) {\n body.push('<g class=\"stdlib-chart-legend\">');\n let x = plotLeft;\n const y = height - 9;\n for (const [index, state] of (opts.states ?? []).entries()) {\n const color = state.color ? ` fill=\"${escapeXml(state.color)}\"` : \"\";\n const label = state.label ?? state.state;\n body.push(\n `<rect class=\"stdlib-chart-series-${index % 8}\"${color} x=\"${fmt(x)}\" y=\"${y - 8}\" width=\"8\" height=\"8\" rx=\"2\"/>`,\n `<text class=\"stdlib-chart-heatmap-label\" x=\"${fmt(x + 12)}\" y=\"${y}\" text-anchor=\"start\">${escapeXml(label)}</text>`,\n );\n x += 20 + label.length * 6.2;\n }\n body.push(\"</g>\");\n }\n\n return svgRoot({ width, height, className: opts.className }, body.join(\"\"));\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/** Give maps a CSS-sized viewport while retaining the renderer's projection.
|
|
2
|
+
* The outer SVG uses pixels for headers/legend; the nested geographic viewport
|
|
3
|
+
* keeps one fitted scale across zoom levels and clips only at the plot edges.
|
|
4
|
+
*/
|
|
5
|
+
export function responsiveMapSvg(svg, width, height, viewport) {
|
|
6
|
+
if (!svg.includes('class="stdlib-chart-map-viewport"')) return svg;
|
|
7
|
+
const zoomScale = 2 ** viewport.zoom;
|
|
8
|
+
return svg.replace(/<text class="stdlib-chart-(title|subtitle|map-empty)"[^>]*>/g, tag => {
|
|
9
|
+
const centered = tag.replace(/x="[^"]*"/, 'x="50%"');
|
|
10
|
+
return tag.includes("map-empty") ? centered.replace(/y="[^"]*"/, 'y="50%"') : centered;
|
|
11
|
+
}).replace(/^(<svg\b[^>]*?) viewBox="[^"]*"/, "$1").replace(/<svg class="stdlib-chart-map-viewport"[^>]*>/, tag => {
|
|
12
|
+
const mapWidth = Number(tag.match(/\bwidth="([^"]+)"/)?.[1]);
|
|
13
|
+
const mapHeight = Number(tag.match(/\bheight="([^"]+)"/)?.[1]);
|
|
14
|
+
const inverse = `calc(max(tan(atan2(${mapWidth}px, ${mapWidth / width * 100}cqw)), tan(atan2(${mapHeight}px, ${mapHeight / height * 100}cqh))) / ${zoomScale})`;
|
|
15
|
+
const translateX = mapWidth / 2 - (viewport.longitude + 180) / 360 * mapWidth * zoomScale;
|
|
16
|
+
const translateY = mapHeight / 2 - (90 - viewport.latitude) / 180 * mapHeight * zoomScale;
|
|
17
|
+
return tag.replace(/\b(x|y|width|height)="([\d.]+)"/g, (_match, name, value) => `${name}="${Number(value) / (name === "x" || name === "width" ? width : height) * 100}%"`).replace(">", ` preserveAspectRatio="xMidYMid meet" style="--k2b-map-inverse-scale:${inverse}"><g class="k2b-chart-map-camera" transform="translate(${translateX} ${translateY}) scale(${zoomScale})">`);
|
|
18
|
+
}).replace("</svg>", "</g></svg>");
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Adapt our generated SVGs to a CSS-sized box without rebuilding their geometry.
|
|
22
|
+
* Only stdlib and the local timeline renderer supply this markup; this is not a
|
|
23
|
+
* parser for arbitrary SVG. The viewBox remains the interaction coordinate space.
|
|
24
|
+
*/
|
|
25
|
+
export function responsiveChartSvg(svg) {
|
|
26
|
+
return svg.replace("<svg ", '<svg preserveAspectRatio="none" ').replace(/<text\b[^>]*>/g, tag => {
|
|
27
|
+
const x = tag.match(/\bx="(-?[\d.]+)"/)?.[1];
|
|
28
|
+
const y = tag.match(/\by="(-?[\d.]+)"/)?.[1];
|
|
29
|
+
if (x === undefined || y === undefined) return tag;
|
|
30
|
+
const rotation = tag.match(/\btransform="rotate\((-?[\d.]+) [^\"]+\)"/)?.[1];
|
|
31
|
+
// Individual CSS scale precedes rotation. Use the same text anchor as
|
|
32
|
+
// transform-origin, and avoid applying the SVG rotation pivot twice.
|
|
33
|
+
return tag.replace(">", ` style="transform-origin:${x}px ${y}px${rotation ? `;transform:rotate(${rotation}deg)` : ""}">`);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Add initial controlled selection to our own renderer metadata during SSR. */
|
|
38
|
+
export function selectedChartSvg(svg, selected) {
|
|
39
|
+
if (!selected) return svg;
|
|
40
|
+
const targets = "role" in selected ? [selected] : selected;
|
|
41
|
+
return svg.replace(/<g\b[^>]*\bdata-chart-datum="([^"]*)"[^>]*>/g, (attribute, encoded, offset) => {
|
|
42
|
+
const raw = encoded.replace(/"/g, '"').replace(/'|'/g, "'").replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&");
|
|
43
|
+
const value = JSON.parse(raw);
|
|
44
|
+
if (typeof value !== "object" || value === null || !("role" in value) || !("index" in value)) return attribute;
|
|
45
|
+
const matches = targets.find(target => value.role === target.role && value.index === target.index && ("seriesIndex" in value ? value.seriesIndex : undefined) === target.seriesIndex);
|
|
46
|
+
if (!matches) return attribute;
|
|
47
|
+
const children = svg.slice(offset, svg.indexOf("</g>", offset));
|
|
48
|
+
const palette = Number(children.match(/stdlib-chart-series-(\d+)/)?.[1] ?? matches.seriesIndex ?? 0) % 8 + 1;
|
|
49
|
+
const paint = `--k2b-chart-selection-color:color-mix(in srgb,var(--stdlib-chart-c${palette}) 72%,var(--k2b-chart-highlight-mix))`;
|
|
50
|
+
const opening = attribute.includes('style="') ? attribute.replace(/style="([^"]*)"/, (_match, style) => `style="${style};${paint}"`) : attribute.replace(">", ` style="${paint}">`);
|
|
51
|
+
return opening.replace(">", " data-selected>");
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=chart-svg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["responsiveMapSvg","svg","width","height","viewport","includes","zoomScale","zoom","replace","tag","centered","mapWidth","Number","match","mapHeight","inverse","translateX","longitude","translateY","latitude","_match","name","value","responsiveChartSvg","x","y","undefined","rotation","selectedChartSvg","selected","targets","attribute","encoded","offset","raw","JSON","parse","matches","find","target","role","index","seriesIndex","children","slice","indexOf","palette","paint","opening","style"],"sources":["content/chart-svg.ts"],"sourcesContent":["import type { MapViewport } from \"@k2b/stdlib\";\n\n/** Give maps a CSS-sized viewport while retaining the renderer's projection.\n * The outer SVG uses pixels for headers/legend; the nested geographic viewport\n * keeps one fitted scale across zoom levels and clips only at the plot edges.\n */\nexport function responsiveMapSvg(svg: string, width: number, height: number, viewport: MapViewport): string {\n if (!svg.includes('class=\"stdlib-chart-map-viewport\"')) return svg;\n const zoomScale = 2 ** viewport.zoom;\n return svg\n .replace(/<text class=\"stdlib-chart-(title|subtitle|map-empty)\"[^>]*>/g, (tag) => {\n const centered = tag.replace(/x=\"[^\"]*\"/, 'x=\"50%\"');\n return tag.includes(\"map-empty\") ? centered.replace(/y=\"[^\"]*\"/, 'y=\"50%\"') : centered;\n })\n .replace(/^(<svg\\b[^>]*?) viewBox=\"[^\"]*\"/, \"$1\")\n .replace(/<svg class=\"stdlib-chart-map-viewport\"[^>]*>/, (tag) => {\n const mapWidth = Number(tag.match(/\\bwidth=\"([^\"]+)\"/)?.[1]);\n const mapHeight = Number(tag.match(/\\bheight=\"([^\"]+)\"/)?.[1]);\n const inverse = `calc(max(tan(atan2(${mapWidth}px, ${(mapWidth / width) * 100}cqw)), tan(atan2(${mapHeight}px, ${(mapHeight / height) * 100}cqh))) / ${zoomScale})`;\n const translateX = mapWidth / 2 - ((viewport.longitude + 180) / 360) * mapWidth * zoomScale;\n const translateY = mapHeight / 2 - ((90 - viewport.latitude) / 180) * mapHeight * zoomScale;\n return tag\n .replace(\n /\\b(x|y|width|height)=\"([\\d.]+)\"/g,\n (_match, name: string, value: string) =>\n `${name}=\"${(Number(value) / (name === \"x\" || name === \"width\" ? width : height)) * 100}%\"`,\n )\n .replace(\n \">\",\n ` preserveAspectRatio=\"xMidYMid meet\" style=\"--k2b-map-inverse-scale:${inverse}\"><g class=\"k2b-chart-map-camera\" transform=\"translate(${translateX} ${translateY}) scale(${zoomScale})\">`,\n );\n })\n .replace(\"</svg>\", \"</g></svg>\");\n}\n\n/** Adapt our generated SVGs to a CSS-sized box without rebuilding their geometry.\n * Only stdlib and the local timeline renderer supply this markup; this is not a\n * parser for arbitrary SVG. The viewBox remains the interaction coordinate space.\n */\nexport function responsiveChartSvg(svg: string): string {\n return svg.replace(\"<svg \", '<svg preserveAspectRatio=\"none\" ').replace(/<text\\b[^>]*>/g, (tag) => {\n const x = tag.match(/\\bx=\"(-?[\\d.]+)\"/)?.[1];\n const y = tag.match(/\\by=\"(-?[\\d.]+)\"/)?.[1];\n if (x === undefined || y === undefined) return tag;\n const rotation = tag.match(/\\btransform=\"rotate\\((-?[\\d.]+) [^\\\"]+\\)\"/)?.[1];\n // Individual CSS scale precedes rotation. Use the same text anchor as\n // transform-origin, and avoid applying the SVG rotation pivot twice.\n return tag.replace(\">\", ` style=\"transform-origin:${x}px ${y}px${rotation ? `;transform:rotate(${rotation}deg)` : \"\"}\">`);\n });\n}\n\n/** Add initial controlled selection to our own renderer metadata during SSR. */\nexport function selectedChartSvg(\n svg: string,\n selected:\n | { role: string; index: number; seriesIndex?: number }\n | readonly { role: string; index: number; seriesIndex?: number }[]\n | null\n | undefined,\n): string {\n if (!selected) return svg;\n const targets = \"role\" in selected ? [selected] : selected;\n return svg.replace(/<g\\b[^>]*\\bdata-chart-datum=\"([^\"]*)\"[^>]*>/g, (attribute, encoded: string, offset: number) => {\n const raw = encoded\n .replace(/"/g, '\"')\n .replace(/'|'/g, \"'\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\");\n const value: unknown = JSON.parse(raw);\n if (typeof value !== \"object\" || value === null || !(\"role\" in value) || !(\"index\" in value)) return attribute;\n const matches = targets.find(\n (target) =>\n value.role === target.role &&\n value.index === target.index &&\n (\"seriesIndex\" in value ? value.seriesIndex : undefined) === target.seriesIndex,\n );\n if (!matches) return attribute;\n const children = svg.slice(offset, svg.indexOf(\"</g>\", offset));\n const palette = (Number(children.match(/stdlib-chart-series-(\\d+)/)?.[1] ?? matches.seriesIndex ?? 0) % 8) + 1;\n const paint = `--k2b-chart-selection-color:color-mix(in srgb,var(--stdlib-chart-c${palette}) 72%,var(--k2b-chart-highlight-mix))`;\n const opening = attribute.includes('style=\"')\n ? attribute.replace(/style=\"([^\"]*)\"/, (_match: string, style: string) => `style=\"${style};${paint}\"`)\n : attribute.replace(\">\", ` style=\"${paint}\">`);\n return opening.replace(\">\", \" data-selected>\");\n });\n}\n"],"mappings":"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","ignoreList":[]}
|