@k2b/ui 0.49.0 → 0.51.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/base.css +70 -1
- package/dist/browser/actions/Button.js.map +1 -1
- package/dist/browser/actions/CommandList.js +861 -0
- package/dist/browser/actions/CommandList.js.map +1 -0
- package/dist/browser/actions/CommandMenu.js +237 -0
- package/dist/browser/actions/CommandMenu.js.map +1 -0
- package/dist/browser/actions/ContextMenu.js +3 -0
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/Dropdown.js +43 -10
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/command-dock.js +47 -0
- package/dist/browser/actions/command-dock.js.map +1 -0
- package/dist/browser/actions/command-items.js +84 -0
- package/dist/browser/actions/command-items.js.map +1 -0
- package/dist/browser/actions/command-messages.js +42 -0
- package/dist/browser/actions/command-messages.js.map +1 -0
- package/dist/browser/actions/index.js +1 -0
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/charts/core/area.js +188 -0
- package/dist/browser/charts/core/area.js.map +1 -0
- package/dist/browser/charts/core/calendar.js +186 -0
- package/dist/browser/charts/core/calendar.js.map +1 -0
- package/dist/browser/charts/core/chart-map-data.js +9 -0
- package/dist/browser/charts/core/chart-map-data.js.map +1 -0
- package/dist/browser/charts/core/chart-messages.js +17 -0
- package/dist/browser/charts/core/chart-messages.js.map +1 -0
- package/dist/browser/charts/core/hbar-layout.js +118 -0
- package/dist/browser/charts/core/hbar-layout.js.map +1 -0
- package/dist/browser/charts/core/hbar.js +39 -0
- package/dist/browser/charts/core/hbar.js.map +1 -0
- package/dist/browser/charts/core/index.js +17 -0
- package/dist/browser/charts/core/index.js.map +1 -0
- package/dist/browser/charts/core/inspection.js +9 -0
- package/dist/browser/charts/core/inspection.js.map +1 -0
- package/dist/browser/charts/core/map.js +116 -0
- package/dist/browser/charts/core/map.js.map +1 -0
- package/dist/browser/charts/core/registry.js +35 -0
- package/dist/browser/charts/core/registry.js.map +1 -0
- package/dist/browser/charts/core/render-size.js +13 -0
- package/dist/browser/charts/core/render-size.js.map +1 -0
- package/dist/browser/charts/core/render.js +113 -0
- package/dist/browser/charts/core/render.js.map +1 -0
- package/dist/browser/charts/core/snapshot.js +65 -0
- package/dist/browser/charts/core/snapshot.js.map +1 -0
- package/dist/browser/charts/core/svg-renderers.js +2406 -0
- package/dist/browser/charts/core/svg-renderers.js.map +1 -0
- package/dist/browser/charts/core/svg.js +21 -0
- package/dist/browser/charts/core/svg.js.map +1 -0
- package/dist/browser/charts/core/termination.test-fixture.js +162 -0
- package/dist/browser/charts/core/termination.test-fixture.js.map +1 -0
- package/dist/browser/charts/core/text.js +13 -0
- package/dist/browser/charts/core/text.js.map +1 -0
- package/dist/browser/charts/core/types.js +6 -0
- package/dist/browser/charts/core/types.js.map +1 -0
- package/dist/browser/charts/core/waterfall.js +162 -0
- package/dist/browser/charts/core/waterfall.js.map +1 -0
- package/dist/browser/charts/description.js +2 -0
- package/dist/browser/charts/description.js.map +1 -0
- package/dist/browser/charts.js +4 -2
- package/dist/browser/charts.js.map +1 -1
- package/dist/browser/content/BalanceSummary.js +106 -0
- package/dist/browser/content/BalanceSummary.js.map +1 -0
- package/dist/browser/content/Chart.js +21 -616
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartExplorer.js +366 -122
- package/dist/browser/content/ChartExplorer.js.map +1 -1
- package/dist/browser/content/ChartRoot.js +632 -0
- package/dist/browser/content/ChartRoot.js.map +1 -0
- package/dist/browser/content/ChartSnapshotView.js +16 -9
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/ChartSparkline.js +24 -0
- package/dist/browser/content/ChartSparkline.js.map +1 -0
- package/dist/browser/content/DataTable.js +676 -293
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/DataTableTools.js +119 -0
- package/dist/browser/content/DataTableTools.js.map +1 -0
- package/dist/browser/content/FileView.js +111 -61
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/FlowAmount.js +82 -0
- package/dist/browser/content/FlowAmount.js.map +1 -0
- package/dist/browser/content/Lightbox.js +8 -8
- package/dist/browser/content/Lightbox.js.map +1 -1
- package/dist/browser/content/MapView.js +30 -28
- package/dist/browser/content/MapView.js.map +1 -1
- package/dist/browser/content/PdfPreview.js +84 -52
- package/dist/browser/content/PdfPreview.js.map +1 -1
- package/dist/browser/content/PdfViewer.js +588 -0
- package/dist/browser/content/PdfViewer.js.map +1 -0
- package/dist/browser/content/balance-summary-messages.js +26 -0
- package/dist/browser/content/balance-summary-messages.js.map +1 -0
- package/dist/browser/content/chart-bar.js +251 -21
- package/dist/browser/content/chart-bar.js.map +1 -1
- package/dist/browser/content/chart-calendar.js +43 -0
- package/dist/browser/content/chart-calendar.js.map +1 -0
- package/dist/browser/content/chart-inspection-core.js +178 -50
- package/dist/browser/content/chart-inspection-core.js.map +1 -1
- package/dist/browser/content/chart-inspection.js.map +1 -1
- package/dist/browser/content/chart-line-gaps.js +2 -2
- package/dist/browser/content/chart-line-gaps.js.map +1 -1
- package/dist/browser/content/chart-map-viewport.js.map +1 -1
- package/dist/browser/content/chart-message-catalog.js +174 -0
- package/dist/browser/content/chart-message-catalog.js.map +1 -0
- package/dist/browser/content/chart-messages.js +2 -138
- package/dist/browser/content/chart-messages.js.map +1 -1
- package/dist/browser/content/chart-snapshot.js +1 -62
- package/dist/browser/content/chart-snapshot.js.map +1 -1
- package/dist/browser/content/chart-state-timeline.js +1 -1
- package/dist/browser/content/chart-state-timeline.js.map +1 -1
- package/dist/browser/content/chart-svg.js +4 -2
- package/dist/browser/content/chart-svg.js.map +1 -1
- package/dist/browser/content/chart-time-axis.js +139 -0
- package/dist/browser/content/chart-time-axis.js.map +1 -0
- package/dist/browser/content/data-table-columns.js +160 -0
- package/dist/browser/content/data-table-columns.js.map +1 -0
- package/dist/browser/content/data-table-messages.js +38 -2
- package/dist/browser/content/data-table-messages.js.map +1 -1
- package/dist/browser/content/flow-amount-messages.js +26 -0
- package/dist/browser/content/flow-amount-messages.js.map +1 -0
- package/dist/browser/content/index.js +5 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/content/pdf-document.js +29 -0
- package/dist/browser/content/pdf-document.js.map +1 -0
- package/dist/browser/content/pdf-limits.js +31 -0
- package/dist/browser/content/pdf-limits.js.map +1 -0
- package/dist/browser/content/pdf-messages.js +34 -2
- package/dist/browser/content/pdf-messages.js.map +1 -1
- package/dist/browser/content/pdf-viewer-engine.js +57 -0
- package/dist/browser/content/pdf-viewer-worker.js +28 -0
- package/dist/browser/inputs/ChoiceInputs.js +94 -51
- package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
- package/dist/browser/inputs/ChoiceSlider.js +75 -58
- package/dist/browser/inputs/ChoiceSlider.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +118 -102
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/PeriodPicker.js +874 -0
- package/dist/browser/inputs/PeriodPicker.js.map +1 -0
- package/dist/browser/inputs/SelectChip.js +50 -17
- package/dist/browser/inputs/SelectChip.js.map +1 -1
- package/dist/browser/inputs/date-picker.js +13 -0
- package/dist/browser/inputs/date-picker.js.map +1 -1
- package/dist/browser/inputs/index.js +4 -1
- package/dist/browser/inputs/index.js.map +1 -1
- package/dist/browser/inputs/input-messages.js +8 -2
- package/dist/browser/inputs/input-messages.js.map +1 -1
- package/dist/browser/inputs/markdown/MarkdownEditor.js +14 -10
- package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/browser/inputs/markdown/SlashCommands.js +402 -0
- package/dist/browser/inputs/markdown/SlashCommands.js.map +1 -0
- package/dist/browser/inputs/period-picker-messages.js +71 -0
- package/dist/browser/inputs/period-picker-messages.js.map +1 -0
- package/dist/browser/inputs/period.js +263 -0
- package/dist/browser/inputs/period.js.map +1 -0
- package/dist/browser/intl/Format.js +31 -8
- package/dist/browser/intl/Format.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +7 -1
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/DetailPanel.js +147 -120
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/Discussion.js +101 -108
- package/dist/browser/layout/Discussion.js.map +1 -1
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/surfaces/BudgetList.js +281 -0
- package/dist/browser/surfaces/BudgetList.js.map +1 -0
- package/dist/browser/surfaces/DescriptionList.js +5 -2
- package/dist/browser/surfaces/DescriptionList.js.map +1 -1
- package/dist/browser/surfaces/ProgressBar.js +134 -21
- package/dist/browser/surfaces/ProgressBar.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +327 -146
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/browser/surfaces/StatGrid.js +75 -57
- package/dist/browser/surfaces/StatGrid.js.map +1 -1
- package/dist/browser/surfaces/budget-messages.js +64 -0
- package/dist/browser/surfaces/budget-messages.js.map +1 -0
- package/dist/browser/surfaces/delta-badge.js +79 -0
- package/dist/browser/surfaces/delta-badge.js.map +1 -0
- package/dist/browser/surfaces/index.js +2 -1
- package/dist/browser/surfaces/index.js.map +1 -1
- package/dist/browser/surfaces/person-color.js +2 -2
- package/dist/browser/surfaces/person-color.js.map +1 -1
- package/dist/browser/surfaces/stat-cell-messages.js +41 -0
- package/dist/browser/surfaces/stat-cell-messages.js.map +1 -0
- package/dist/browser/widgets/Dashboard.js +137 -0
- package/dist/browser/widgets/Dashboard.js.map +1 -0
- package/dist/browser/widgets/DashboardFrame.js +310 -0
- package/dist/browser/widgets/DashboardFrame.js.map +1 -0
- package/dist/browser/widgets/index.js +2 -0
- package/dist/browser/widgets/index.js.map +1 -1
- package/dist/licenses/pdfjs-dist.txt +177 -0
- package/dist/ssr/actions/Button.js.map +1 -1
- package/dist/ssr/actions/CommandList.js +638 -0
- package/dist/ssr/actions/CommandList.js.map +1 -0
- package/dist/ssr/actions/CommandMenu.js +197 -0
- package/dist/ssr/actions/CommandMenu.js.map +1 -0
- package/dist/ssr/actions/ContextMenu.js +3 -0
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/Dropdown.js +43 -10
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/command-dock.js +47 -0
- package/dist/ssr/actions/command-dock.js.map +1 -0
- package/dist/ssr/actions/command-items.js +84 -0
- package/dist/ssr/actions/command-items.js.map +1 -0
- package/dist/ssr/actions/command-messages.js +42 -0
- package/dist/ssr/actions/command-messages.js.map +1 -0
- package/dist/ssr/actions/index.js +1 -0
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/charts/core/area.js +188 -0
- package/dist/ssr/charts/core/area.js.map +1 -0
- package/dist/ssr/charts/core/calendar.js +186 -0
- package/dist/ssr/charts/core/calendar.js.map +1 -0
- package/dist/ssr/charts/core/chart-map-data.js +9 -0
- package/dist/ssr/charts/core/chart-map-data.js.map +1 -0
- package/dist/ssr/charts/core/chart-messages.js +17 -0
- package/dist/ssr/charts/core/chart-messages.js.map +1 -0
- package/dist/ssr/charts/core/hbar-layout.js +118 -0
- package/dist/ssr/charts/core/hbar-layout.js.map +1 -0
- package/dist/ssr/charts/core/hbar.js +39 -0
- package/dist/ssr/charts/core/hbar.js.map +1 -0
- package/dist/ssr/charts/core/index.js +17 -0
- package/dist/ssr/charts/core/index.js.map +1 -0
- package/dist/ssr/charts/core/inspection.js +9 -0
- package/dist/ssr/charts/core/inspection.js.map +1 -0
- package/dist/ssr/charts/core/map.js +116 -0
- package/dist/ssr/charts/core/map.js.map +1 -0
- package/dist/ssr/charts/core/registry.js +35 -0
- package/dist/ssr/charts/core/registry.js.map +1 -0
- package/dist/ssr/charts/core/render-size.js +13 -0
- package/dist/ssr/charts/core/render-size.js.map +1 -0
- package/dist/ssr/charts/core/render.js +113 -0
- package/dist/ssr/charts/core/render.js.map +1 -0
- package/dist/ssr/charts/core/snapshot.js +65 -0
- package/dist/ssr/charts/core/snapshot.js.map +1 -0
- package/dist/ssr/charts/core/svg-renderers.js +2406 -0
- package/dist/ssr/charts/core/svg-renderers.js.map +1 -0
- package/dist/ssr/charts/core/svg.js +21 -0
- package/dist/ssr/charts/core/svg.js.map +1 -0
- package/dist/ssr/charts/core/termination.test-fixture.js +162 -0
- package/dist/ssr/charts/core/termination.test-fixture.js.map +1 -0
- package/dist/ssr/charts/core/text.js +13 -0
- package/dist/ssr/charts/core/text.js.map +1 -0
- package/dist/ssr/charts/core/types.js +6 -0
- package/dist/ssr/charts/core/types.js.map +1 -0
- package/dist/ssr/charts/core/waterfall.js +162 -0
- package/dist/ssr/charts/core/waterfall.js.map +1 -0
- package/dist/ssr/charts/description.js +2 -0
- package/dist/ssr/charts/description.js.map +1 -0
- package/dist/ssr/charts.js +4 -2
- package/dist/ssr/charts.js.map +1 -1
- package/dist/ssr/content/BalanceSummary.js +75 -0
- package/dist/ssr/content/BalanceSummary.js.map +1 -0
- package/dist/ssr/content/Chart.js +21 -483
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartExplorer.js +190 -46
- package/dist/ssr/content/ChartExplorer.js.map +1 -1
- package/dist/ssr/content/ChartRoot.js +475 -0
- package/dist/ssr/content/ChartRoot.js.map +1 -0
- package/dist/ssr/content/ChartSnapshotView.js +5 -1
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/ChartSparkline.js +24 -0
- package/dist/ssr/content/ChartSparkline.js.map +1 -0
- package/dist/ssr/content/DataTable.js +287 -78
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/DataTableTools.js +106 -0
- package/dist/ssr/content/DataTableTools.js.map +1 -0
- package/dist/ssr/content/FileView.js +56 -7
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/FlowAmount.js +58 -0
- package/dist/ssr/content/FlowAmount.js.map +1 -0
- package/dist/ssr/content/Lightbox.js +8 -8
- package/dist/ssr/content/Lightbox.js.map +1 -1
- package/dist/ssr/content/MapView.js +9 -9
- package/dist/ssr/content/MapView.js.map +1 -1
- package/dist/ssr/content/PdfPreview.js +49 -20
- package/dist/ssr/content/PdfPreview.js.map +1 -1
- package/dist/ssr/content/PdfViewer.js +484 -0
- package/dist/ssr/content/PdfViewer.js.map +1 -0
- package/dist/ssr/content/balance-summary-messages.js +26 -0
- package/dist/ssr/content/balance-summary-messages.js.map +1 -0
- package/dist/ssr/content/chart-bar.js +251 -21
- package/dist/ssr/content/chart-bar.js.map +1 -1
- package/dist/ssr/content/chart-calendar.js +43 -0
- package/dist/ssr/content/chart-calendar.js.map +1 -0
- package/dist/ssr/content/chart-inspection-core.js +178 -50
- package/dist/ssr/content/chart-inspection-core.js.map +1 -1
- package/dist/ssr/content/chart-inspection.js.map +1 -1
- package/dist/ssr/content/chart-line-gaps.js +2 -2
- package/dist/ssr/content/chart-line-gaps.js.map +1 -1
- package/dist/ssr/content/chart-map-viewport.js.map +1 -1
- package/dist/ssr/content/chart-message-catalog.js +174 -0
- package/dist/ssr/content/chart-message-catalog.js.map +1 -0
- package/dist/ssr/content/chart-messages.js +2 -138
- package/dist/ssr/content/chart-messages.js.map +1 -1
- package/dist/ssr/content/chart-snapshot.js +1 -62
- package/dist/ssr/content/chart-snapshot.js.map +1 -1
- package/dist/ssr/content/chart-state-timeline.js +1 -1
- package/dist/ssr/content/chart-state-timeline.js.map +1 -1
- package/dist/ssr/content/chart-svg.js +4 -2
- package/dist/ssr/content/chart-svg.js.map +1 -1
- package/dist/ssr/content/chart-time-axis.js +139 -0
- package/dist/ssr/content/chart-time-axis.js.map +1 -0
- package/dist/ssr/content/data-table-columns.js +160 -0
- package/dist/ssr/content/data-table-columns.js.map +1 -0
- package/dist/ssr/content/data-table-messages.js +38 -2
- package/dist/ssr/content/data-table-messages.js.map +1 -1
- package/dist/ssr/content/flow-amount-messages.js +26 -0
- package/dist/ssr/content/flow-amount-messages.js.map +1 -0
- package/dist/ssr/content/index.js +5 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/content/pdf-document.js +29 -0
- package/dist/ssr/content/pdf-document.js.map +1 -0
- package/dist/ssr/content/pdf-limits.js +31 -0
- package/dist/ssr/content/pdf-limits.js.map +1 -0
- package/dist/ssr/content/pdf-messages.js +34 -2
- package/dist/ssr/content/pdf-messages.js.map +1 -1
- package/dist/ssr/inputs/ChoiceInputs.js +49 -12
- package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
- package/dist/ssr/inputs/ChoiceSlider.js +17 -12
- package/dist/ssr/inputs/ChoiceSlider.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +19 -13
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/PeriodPicker.js +598 -0
- package/dist/ssr/inputs/PeriodPicker.js.map +1 -0
- package/dist/ssr/inputs/SelectChip.js +26 -9
- package/dist/ssr/inputs/SelectChip.js.map +1 -1
- package/dist/ssr/inputs/date-picker.js +13 -0
- package/dist/ssr/inputs/date-picker.js.map +1 -1
- package/dist/ssr/inputs/index.js +4 -1
- package/dist/ssr/inputs/index.js.map +1 -1
- package/dist/ssr/inputs/input-messages.js +8 -2
- package/dist/ssr/inputs/input-messages.js.map +1 -1
- package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
- package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/ssr/inputs/markdown/SlashCommands.js +339 -0
- package/dist/ssr/inputs/markdown/SlashCommands.js.map +1 -0
- package/dist/ssr/inputs/period-picker-messages.js +71 -0
- package/dist/ssr/inputs/period-picker-messages.js.map +1 -0
- package/dist/ssr/inputs/period.js +263 -0
- package/dist/ssr/inputs/period.js.map +1 -0
- package/dist/ssr/intl/Format.js +22 -2
- package/dist/ssr/intl/Format.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +7 -1
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/DetailPanel.js +27 -4
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/Discussion.js +16 -2
- package/dist/ssr/layout/Discussion.js.map +1 -1
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/surfaces/BudgetList.js +170 -0
- package/dist/ssr/surfaces/BudgetList.js.map +1 -0
- package/dist/ssr/surfaces/DescriptionList.js +1 -1
- package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
- package/dist/ssr/surfaces/ProgressBar.js +96 -5
- package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +157 -52
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/surfaces/StatGrid.js +24 -35
- package/dist/ssr/surfaces/StatGrid.js.map +1 -1
- package/dist/ssr/surfaces/budget-messages.js +64 -0
- package/dist/ssr/surfaces/budget-messages.js.map +1 -0
- package/dist/ssr/surfaces/delta-badge.js +55 -0
- package/dist/ssr/surfaces/delta-badge.js.map +1 -0
- package/dist/ssr/surfaces/index.js +2 -1
- package/dist/ssr/surfaces/index.js.map +1 -1
- package/dist/ssr/surfaces/person-color.js +2 -2
- package/dist/ssr/surfaces/person-color.js.map +1 -1
- package/dist/ssr/surfaces/stat-cell-messages.js +41 -0
- package/dist/ssr/surfaces/stat-cell-messages.js.map +1 -0
- package/dist/ssr/widgets/Dashboard.js +84 -0
- package/dist/ssr/widgets/Dashboard.js.map +1 -0
- package/dist/ssr/widgets/DashboardFrame.js +200 -0
- package/dist/ssr/widgets/DashboardFrame.js.map +1 -0
- package/dist/ssr/widgets/index.js +2 -0
- package/dist/ssr/widgets/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/Button.d.ts +1 -1
- package/dist/types/actions/CommandList.d.ts +120 -0
- package/dist/types/actions/CommandMenu.d.ts +39 -0
- package/dist/types/actions/Dropdown.d.ts +17 -0
- package/dist/types/actions/command-dock.d.ts +8 -0
- package/dist/types/actions/command-items.d.ts +134 -0
- package/dist/types/actions/command-messages.d.ts +19 -0
- package/dist/types/actions/index.d.ts +3 -0
- package/dist/types/charts/core/area.d.ts +62 -0
- package/dist/types/charts/core/calendar.d.ts +57 -0
- package/dist/types/charts/core/chart-map-data.d.ts +3 -0
- package/dist/types/charts/core/chart-messages.d.ts +5 -0
- package/dist/types/charts/core/hbar-layout.d.ts +74 -0
- package/dist/types/charts/core/hbar.d.ts +13 -0
- package/dist/types/charts/core/index.d.ts +16 -0
- package/dist/types/charts/core/inspection.d.ts +16 -0
- package/dist/types/charts/core/map.d.ts +3 -0
- package/dist/types/charts/core/registry.d.ts +33 -0
- package/dist/types/charts/core/render-size.d.ts +7 -0
- package/dist/types/charts/core/render.d.ts +37 -0
- package/dist/types/charts/core/snapshot.d.ts +27 -0
- package/dist/types/charts/core/svg-renderers.d.ts +722 -0
- package/dist/types/charts/core/svg.d.ts +20 -0
- package/dist/types/charts/core/termination.test-fixture.d.ts +1 -0
- package/dist/types/charts/core/text.d.ts +5 -0
- package/dist/types/charts/core/types.d.ts +20 -0
- package/dist/types/charts/core/waterfall.d.ts +68 -0
- package/dist/types/charts/description.d.ts +226 -0
- package/dist/types/charts.d.ts +5 -2
- package/dist/types/content/BalanceSummary.d.ts +29 -0
- package/dist/types/content/Chart.d.ts +19 -117
- package/dist/types/content/ChartExplorer.d.ts +43 -2
- package/dist/types/content/ChartRoot.d.ts +92 -0
- package/dist/types/content/ChartSnapshotView.d.ts +1 -0
- package/dist/types/content/ChartSparkline.d.ts +5 -0
- package/dist/types/content/DataTable.d.ts +28 -0
- package/dist/types/content/DataTableTools.d.ts +44 -0
- package/dist/types/content/FlowAmount.d.ts +28 -0
- package/dist/types/content/PdfViewer.d.ts +32 -0
- package/dist/types/content/balance-summary-messages.d.ts +11 -0
- package/dist/types/content/chart-bar.d.ts +95 -2
- package/dist/types/content/chart-calendar.d.ts +4 -0
- package/dist/types/content/chart-inspection-core.d.ts +21 -16
- package/dist/types/content/chart-inspection.d.ts +5 -1
- package/dist/types/content/chart-map-viewport.d.ts +1 -1
- package/dist/types/content/chart-message-catalog.d.ts +84 -0
- package/dist/types/content/chart-messages.d.ts +2 -33
- package/dist/types/content/chart-snapshot.d.ts +1 -26
- package/dist/types/content/chart-svg.d.ts +1 -1
- package/dist/types/content/chart-time-axis.d.ts +26 -0
- package/dist/types/content/data-table-columns.d.ts +72 -0
- package/dist/types/content/data-table-messages.d.ts +18 -0
- package/dist/types/content/flow-amount-messages.d.ts +11 -0
- package/dist/types/content/index.d.ts +12 -2
- package/dist/types/content/pdf-document.d.ts +5 -0
- package/dist/types/content/pdf-engine.d.ts +9 -0
- package/dist/types/content/pdf-limits.d.ts +43 -0
- package/dist/types/content/pdf-messages.d.ts +16 -0
- package/dist/types/inputs/ChoiceInputs.d.ts +4 -0
- package/dist/types/inputs/ChoiceSlider.d.ts +12 -0
- package/dist/types/inputs/DatePicker.d.ts +22 -0
- package/dist/types/inputs/PeriodPicker.d.ts +24 -0
- package/dist/types/inputs/SelectChip.d.ts +2 -0
- package/dist/types/inputs/date-picker.d.ts +6 -0
- package/dist/types/inputs/index.d.ts +8 -2
- package/dist/types/inputs/input-messages.d.ts +3 -0
- package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -0
- package/dist/types/inputs/markdown/SlashCommands.d.ts +20 -0
- package/dist/types/inputs/period-picker-messages.d.ts +34 -0
- package/dist/types/inputs/period.d.ts +134 -0
- package/dist/types/intl/Format.d.ts +5 -0
- package/dist/types/layout/AppWorkspace.d.ts +5 -0
- package/dist/types/layout/DetailPanel.d.ts +12 -0
- package/dist/types/layout/index.d.ts +1 -1
- package/dist/types/surfaces/BudgetList.d.ts +42 -0
- package/dist/types/surfaces/DescriptionList.d.ts +5 -0
- package/dist/types/surfaces/ProgressBar.d.ts +38 -2
- package/dist/types/surfaces/StatCell.d.ts +40 -2
- package/dist/types/surfaces/StatGrid.d.ts +3 -1
- package/dist/types/surfaces/budget-messages.d.ts +30 -0
- package/dist/types/surfaces/delta-badge.d.ts +10 -0
- package/dist/types/surfaces/index.d.ts +4 -3
- package/dist/types/surfaces/person-color.d.ts +2 -2
- package/dist/types/surfaces/stat-cell-messages.d.ts +19 -0
- package/dist/types/widgets/Dashboard.d.ts +42 -0
- package/dist/types/widgets/DashboardFrame.d.ts +58 -0
- package/dist/types/widgets/index.d.ts +2 -0
- package/package.json +8 -1
|
@@ -1,142 +1,6 @@
|
|
|
1
|
-
import { i18n } from "@k2b/stdlib";
|
|
2
1
|
import { useLocale } from "../intl/locale";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
messages: {
|
|
6
|
-
en: {
|
|
7
|
-
chartView: "Chart view",
|
|
8
|
-
chartDiagram: "Diagram",
|
|
9
|
-
chartData: "Table",
|
|
10
|
-
chartSeries: "Series visibility",
|
|
11
|
-
chartOnly: "Only",
|
|
12
|
-
chartShowAll: "Show all",
|
|
13
|
-
chartShowing: "Showing",
|
|
14
|
-
chartSelectedDatum: "Selected data point",
|
|
15
|
-
chartReference: "Reference",
|
|
16
|
-
chartCurrent: "Current",
|
|
17
|
-
chartPinReference: "Pin as reference",
|
|
18
|
-
chartRemoveComparison: "Remove comparison",
|
|
19
|
-
chartPreviousData: "The chart and table still show the last loaded filters",
|
|
20
|
-
chartCopyData: "Copy data",
|
|
21
|
-
chartCopyFailed: "Could not copy data",
|
|
22
|
-
chartLegend: "Legend",
|
|
23
|
-
chartRowsShown: ({
|
|
24
|
-
shown,
|
|
25
|
-
total
|
|
26
|
-
}) => `Showing ${shown} of ${total} rows. Sort to see others; Copy data copies all of them.`,
|
|
27
|
-
interactiveLineChart: "Interactive line chart",
|
|
28
|
-
interactiveChart: "Interactive chart. Use arrow keys to inspect, Enter to select, Escape to dismiss. On maps and timelines use Alt with arrow keys to inspect.",
|
|
29
|
-
chartFields: ({
|
|
30
|
-
key
|
|
31
|
-
}) => {
|
|
32
|
-
const labels = {
|
|
33
|
-
x: "X",
|
|
34
|
-
y: "Y",
|
|
35
|
-
value: "Value",
|
|
36
|
-
percent: "Share",
|
|
37
|
-
total: "Total",
|
|
38
|
-
from: "From",
|
|
39
|
-
to: "To",
|
|
40
|
-
upperInclusive: "Includes upper bound",
|
|
41
|
-
count: "Count",
|
|
42
|
-
q1: "Lower quartile",
|
|
43
|
-
q2: "Median",
|
|
44
|
-
q3: "Upper quartile",
|
|
45
|
-
whiskerLow: "Lower whisker",
|
|
46
|
-
whiskerHigh: "Upper whisker",
|
|
47
|
-
min: "Minimum",
|
|
48
|
-
max: "Maximum",
|
|
49
|
-
threshold: "Threshold",
|
|
50
|
-
delta: "Change",
|
|
51
|
-
latitude: "Latitude",
|
|
52
|
-
longitude: "Longitude",
|
|
53
|
-
size: "Size",
|
|
54
|
-
state: "State",
|
|
55
|
-
duration: "Duration",
|
|
56
|
-
detail: "Detail",
|
|
57
|
-
errY: "Y error",
|
|
58
|
-
errYHigh: "Upper Y error",
|
|
59
|
-
errYLow: "Lower Y error",
|
|
60
|
-
errX: "X error",
|
|
61
|
-
errXHigh: "Upper X error",
|
|
62
|
-
errXLow: "Lower X error"
|
|
63
|
-
};
|
|
64
|
-
return labels[key] ?? key;
|
|
65
|
-
},
|
|
66
|
-
interactiveMap: "Interactive map",
|
|
67
|
-
interactiveTimeline: "Interactive timeline",
|
|
68
|
-
series: "Series",
|
|
69
|
-
resetMapView: "Reset map view",
|
|
70
|
-
resetTimelineView: "Reset timeline view"
|
|
71
|
-
},
|
|
72
|
-
de: {
|
|
73
|
-
chartView: "Diagrammansicht",
|
|
74
|
-
chartDiagram: "Diagramm",
|
|
75
|
-
chartData: "Tabelle",
|
|
76
|
-
chartSeries: "Sichtbare Datenreihen",
|
|
77
|
-
chartOnly: "Nur diese",
|
|
78
|
-
chartShowAll: "Alle anzeigen",
|
|
79
|
-
chartShowing: "Angezeigt",
|
|
80
|
-
chartSelectedDatum: "Ausgewählter Datenpunkt",
|
|
81
|
-
chartReference: "Vergleich",
|
|
82
|
-
chartCurrent: "Aktuell",
|
|
83
|
-
chartPinReference: "Als Vergleich merken",
|
|
84
|
-
chartRemoveComparison: "Vergleich entfernen",
|
|
85
|
-
chartPreviousData: "Diagramm und Tabelle zeigen weiterhin die zuletzt geladenen Filter",
|
|
86
|
-
chartCopyData: "Daten kopieren",
|
|
87
|
-
chartCopyFailed: "Daten konnten nicht kopiert werden",
|
|
88
|
-
chartLegend: "Legende",
|
|
89
|
-
chartRowsShown: ({
|
|
90
|
-
shown,
|
|
91
|
-
total
|
|
92
|
-
}) => `${shown} von ${total} Zeilen werden angezeigt. Sortiere, um andere zu sehen; „Daten kopieren“ kopiert alle.`,
|
|
93
|
-
interactiveLineChart: "Interaktives Liniendiagramm",
|
|
94
|
-
interactiveChart: "Interaktives Diagramm. Pfeiltasten zum Erkunden, Enter zum Auswählen, Escape zum Schließen. In Karten und Zeitleisten Alt mit Pfeiltasten zum Erkunden.",
|
|
95
|
-
chartFields: ({
|
|
96
|
-
key
|
|
97
|
-
}) => {
|
|
98
|
-
const labels = {
|
|
99
|
-
x: "X",
|
|
100
|
-
y: "Y",
|
|
101
|
-
value: "Wert",
|
|
102
|
-
percent: "Anteil",
|
|
103
|
-
total: "Gesamt",
|
|
104
|
-
from: "Von",
|
|
105
|
-
to: "Bis",
|
|
106
|
-
upperInclusive: "Obergrenze enthalten",
|
|
107
|
-
count: "Anzahl",
|
|
108
|
-
q1: "Unteres Quartil",
|
|
109
|
-
q2: "Median",
|
|
110
|
-
q3: "Oberes Quartil",
|
|
111
|
-
whiskerLow: "Unterer Whisker",
|
|
112
|
-
whiskerHigh: "Oberer Whisker",
|
|
113
|
-
min: "Minimum",
|
|
114
|
-
max: "Maximum",
|
|
115
|
-
threshold: "Schwellenwert",
|
|
116
|
-
delta: "Änderung",
|
|
117
|
-
latitude: "Breitengrad",
|
|
118
|
-
longitude: "Längengrad",
|
|
119
|
-
size: "Größe",
|
|
120
|
-
state: "Zustand",
|
|
121
|
-
duration: "Dauer",
|
|
122
|
-
detail: "Details",
|
|
123
|
-
errY: "Y-Fehler",
|
|
124
|
-
errYHigh: "Oberer Y-Fehler",
|
|
125
|
-
errYLow: "Unterer Y-Fehler",
|
|
126
|
-
errX: "X-Fehler",
|
|
127
|
-
errXHigh: "Oberer X-Fehler",
|
|
128
|
-
errXLow: "Unterer X-Fehler"
|
|
129
|
-
};
|
|
130
|
-
return labels[key] ?? key;
|
|
131
|
-
},
|
|
132
|
-
interactiveMap: "Interaktive Karte",
|
|
133
|
-
interactiveTimeline: "Interaktive Zeitachse",
|
|
134
|
-
series: "Datenreihe",
|
|
135
|
-
resetMapView: "Kartenansicht zurücksetzen",
|
|
136
|
-
resetTimelineView: "Zeitachsenansicht zurücksetzen"
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
});
|
|
2
|
+
import { chartMessages } from "./chart-message-catalog";
|
|
3
|
+
export { chartMessages, resolveChartMessages } from "./chart-message-catalog";
|
|
140
4
|
/** Resolved from the inherited render locale. */
|
|
141
5
|
export const useChartMessages = () => {
|
|
142
6
|
const locale = useLocale();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/chart-messages.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"names":[],"sources":["content/chart-messages.ts"],"sourcesContent":["import { useLocale } from \"../intl/locale\";\nimport { chartMessages } from \"./chart-message-catalog\";\n\nexport { chartMessages, resolveChartMessages } from \"./chart-message-catalog\";\n\nexport type ChartMessages = ReturnType<(typeof chartMessages)[\"resolve\"]>[\"t\"];\n\n/** Resolved from the inherited render locale. */\nexport const useChartMessages = (): (() => ChartMessages) => {\n const locale = useLocale();\n return () => chartMessages.resolve([locale()]).t;\n};\n\nexport const checkChartMessages = () => chartMessages.check();\n"],"mappings":"AAAA,SAAS,SAAS,QAAQ,gBAAgB;AAC1C,SAAS,aAAa,QAAQ,yBAAyB;AAEvD,SAAS,aAAa,EAAE,oBAAoB,QAAQ,yBAAyB;AAI7E;AACA,OAAO,MAAM,gBAAgB,GAAG,MAA6B;EAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;EAC1B,OAAO,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,OAAO,MAAM,kBAAkB,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1,63 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import { chartRenderHeight, renderChartSvg } from "./Chart";
|
|
3
|
-
import { isChartDatum } from "./chart-inspection-core";
|
|
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
|
-
}
|
|
1
|
+
export { prepareChartSnapshot } from "../charts/core/snapshot";
|
|
63
2
|
//# sourceMappingURL=chart-snapshot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/chart-snapshot.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"names":[],"sources":["content/chart-snapshot.ts"],"sourcesContent":["export { type ChartSnapshot, prepareChartSnapshot } from \"../charts/core/snapshot\";\n"],"mappings":"AAAA,SAA6B,oBAAoB,QAAQ,yBAAyB","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { chartDatumSvg, computeDomain, escapeXml, extendDomainToNice, mapRange, niceStep, svgRoot } from "
|
|
1
|
+
import { chartDatumSvg, computeDomain, escapeXml, extendDomainToNice, mapRange, niceStep, svgRoot } from "../charts/core/svg-renderers";
|
|
2
2
|
const ROW_HEIGHT = 24;
|
|
3
3
|
const TOP = 38;
|
|
4
4
|
const AXIS_HEIGHT = 28;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"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":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["content/chart-state-timeline.ts"],"sourcesContent":["import { chartDatumSvg, computeDomain, escapeXml, extendDomainToNice, mapRange, niceStep, svgRoot } from \"../charts/core/svg-renderers\";\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":[]}
|
|
@@ -30,7 +30,8 @@ export function responsiveChartSvg(svg) {
|
|
|
30
30
|
const rotation = tag.match(/\btransform="rotate\((-?[\d.]+) [^\"]+\)"/)?.[1];
|
|
31
31
|
// Individual CSS scale precedes rotation. Use the same text anchor as
|
|
32
32
|
// transform-origin, and avoid applying the SVG rotation pivot twice.
|
|
33
|
-
|
|
33
|
+
const origin = `transform-origin:${x}px ${y}px${rotation ? `;transform:rotate(${rotation}deg)` : ""}`;
|
|
34
|
+
return tag.includes('style="') ? tag.replace(/style="([^"]*)"/, (_match, style) => `style="${style};${origin}"`) : tag.replace(/>$/, ` style="${origin}">`);
|
|
34
35
|
});
|
|
35
36
|
}
|
|
36
37
|
|
|
@@ -46,7 +47,8 @@ export function selectedChartSvg(svg, selected) {
|
|
|
46
47
|
if (!matches) return attribute;
|
|
47
48
|
const children = svg.slice(offset, svg.indexOf("</g>", offset));
|
|
48
49
|
const palette = Number(children.match(/stdlib-chart-series-(\d+)/)?.[1] ?? matches.seriesIndex ?? 0) % 8 + 1;
|
|
49
|
-
const
|
|
50
|
+
const markPaint = children.match(/class="k2b-waterfall-bar"[^>]* fill="([^"]+)"/)?.[1] ?? `var(--stdlib-chart-c${palette})`;
|
|
51
|
+
const paint = `--k2b-chart-selection-color:color-mix(in srgb,${markPaint} 72%,var(--k2b-chart-highlight-mix))`;
|
|
50
52
|
const opening = attribute.includes('style="') ? attribute.replace(/style="([^"]*)"/, (_match, style) => `style="${style};${paint}"`) : attribute.replace(">", ` style="${paint}">`);
|
|
51
53
|
return opening.replace(">", " data-selected>");
|
|
52
54
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["content/chart-svg.ts"],"sourcesContent":["import type { MapViewport } from \"
|
|
1
|
+
{"version":3,"names":[],"sources":["content/chart-svg.ts"],"sourcesContent":["import type { MapViewport } from \"../charts/core/svg\";\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 const origin = `transform-origin:${x}px ${y}px${rotation ? `;transform:rotate(${rotation}deg)` : \"\"}`;\n return tag.includes('style=\"')\n ? tag.replace(/style=\"([^\"]*)\"/, (_match, style: string) => `style=\"${style};${origin}\"`)\n : tag.replace(/>$/, ` style=\"${origin}\">`);\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 markPaint = children.match(/class=\"k2b-waterfall-bar\"[^>]* fill=\"([^\"]+)\"/)?.[1] ?? `var(--stdlib-chart-c${palette})`;\n const paint = `--k2b-chart-selection-color:color-mix(in srgb,${markPaint} 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":[]}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { dates } from "@k2b/stdlib";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A line chart whose X values are instants (Unix milliseconds). Its axis ticks land on round times in `timeZone`:
|
|
5
|
+
* minutes, hours, days, weeks, months, or years, whichever step keeps the requested number of ticks.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const STEPS = [...[1, 2, 5, 10, 15, 30].map(size => ({
|
|
9
|
+
unit: "minute",
|
|
10
|
+
size
|
|
11
|
+
})), ...[1, 2, 3, 6, 12].map(size => ({
|
|
12
|
+
unit: "hour",
|
|
13
|
+
size
|
|
14
|
+
})), ...[1, 2].map(size => ({
|
|
15
|
+
unit: "day",
|
|
16
|
+
size
|
|
17
|
+
})), {
|
|
18
|
+
unit: "week",
|
|
19
|
+
size: 1
|
|
20
|
+
}, ...[1, 3, 6].map(size => ({
|
|
21
|
+
unit: "month",
|
|
22
|
+
size
|
|
23
|
+
})), {
|
|
24
|
+
unit: "year",
|
|
25
|
+
size: 1
|
|
26
|
+
}];
|
|
27
|
+
const UNIT_MS = {
|
|
28
|
+
minute: 60_000,
|
|
29
|
+
hour: 3_600_000,
|
|
30
|
+
day: 86_400_000,
|
|
31
|
+
week: 604_800_000,
|
|
32
|
+
month: 2_629_746_000,
|
|
33
|
+
year: 31_556_952_000
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// Wall-clock arithmetic runs on a zone-free calendar: the wall time read as if it were UTC.
|
|
37
|
+
const wallOf = (instant, timeZone) => Date.parse(`${dates.instantToZonedInput(new Date(instant), timeZone)}:00Z`);
|
|
38
|
+
const instantOf = (wall, timeZone) => Date.parse(dates.zonedDateTimeToInstant(new Date(wall).toISOString().slice(0, 16), timeZone, {
|
|
39
|
+
disambiguation: "compatible"
|
|
40
|
+
}));
|
|
41
|
+
const floorWall = (wall, step) => {
|
|
42
|
+
const date = new Date(wall);
|
|
43
|
+
const y = date.getUTCFullYear(),
|
|
44
|
+
m = date.getUTCMonth(),
|
|
45
|
+
d = date.getUTCDate();
|
|
46
|
+
if (step.unit === "minute") {
|
|
47
|
+
const minutes = Math.floor(date.getUTCMinutes() / step.size) * step.size;
|
|
48
|
+
return Date.UTC(y, m, d, date.getUTCHours(), minutes);
|
|
49
|
+
}
|
|
50
|
+
if (step.unit === "hour") return Date.UTC(y, m, d, Math.floor(date.getUTCHours() / step.size) * step.size);
|
|
51
|
+
if (step.unit === "day") {
|
|
52
|
+
const day = Date.UTC(y, m, d);
|
|
53
|
+
return day - Math.floor(day / UNIT_MS.day) % step.size * UNIT_MS.day;
|
|
54
|
+
}
|
|
55
|
+
// Weeks start on Monday, as Cloud's calendars default to.
|
|
56
|
+
if (step.unit === "week") return Date.UTC(y, m, d) - (date.getUTCDay() + 6) % 7 * UNIT_MS.day;
|
|
57
|
+
if (step.unit === "month") return Date.UTC(y, Math.floor(m / step.size) * step.size, 1);
|
|
58
|
+
return Date.UTC(y, 0, 1);
|
|
59
|
+
};
|
|
60
|
+
const nextWall = (wall, step) => {
|
|
61
|
+
const date = new Date(wall);
|
|
62
|
+
if (step.unit === "month") return Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + step.size, 1);
|
|
63
|
+
if (step.unit === "year") return Date.UTC(date.getUTCFullYear() + step.size, 0, 1);
|
|
64
|
+
return wall + step.size * UNIT_MS[step.unit];
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/** The round step for a time span: the finest one that keeps at most `maxTicks` ticks. */
|
|
68
|
+
export const chartTimeStep = (span, maxTicks) => STEPS.find(step => span / (step.size * UNIT_MS[step.unit]) <= maxTicks) ?? STEPS.at(-1);
|
|
69
|
+
|
|
70
|
+
/** Tick instants inside `domain` that fall on round wall times of `step` in `timeZone`. */
|
|
71
|
+
export const chartTimeTicks = (domain, timeZone, step) => {
|
|
72
|
+
const [lo, hi] = domain;
|
|
73
|
+
const ticks = [];
|
|
74
|
+
// Instants outside the Date range have no wall time; Bun reads their "NaN-NaN-…" wall as 2000 and counts from there.
|
|
75
|
+
if ([lo, hi].some(instant => Number.isNaN(new Date(instant).getTime()))) return ticks;
|
|
76
|
+
// A day that a DST change shortens maps a missing wall time onto the next one; it shows once. The budget counts
|
|
77
|
+
// steps, not ticks, so a step that repeats a tick or does not advance ends too.
|
|
78
|
+
for (let wall = floorWall(wallOf(lo, timeZone), step), steps = 0; steps <= 1_000; steps++) {
|
|
79
|
+
const instant = instantOf(wall, timeZone);
|
|
80
|
+
if (instant > hi) break;
|
|
81
|
+
if (instant >= lo && instant !== ticks.at(-1)) ticks.push(instant);
|
|
82
|
+
const next = nextWall(wall, step);
|
|
83
|
+
if (!(next > wall)) break;
|
|
84
|
+
wall = next;
|
|
85
|
+
}
|
|
86
|
+
return ticks;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/** Default label of a tick: the clock time, the day at local midnight, the month or the year. */
|
|
90
|
+
export const chartTimeLabel = (tick, step, axis) => {
|
|
91
|
+
const locale = axis.locale ?? "en";
|
|
92
|
+
const midnight = dates.instantToZonedInput(new Date(tick), axis.timeZone).endsWith("T00:00");
|
|
93
|
+
const options = (step.unit === "minute" || step.unit === "hour") && !midnight ? {
|
|
94
|
+
hour: "2-digit",
|
|
95
|
+
minute: "2-digit",
|
|
96
|
+
hourCycle: "h23"
|
|
97
|
+
} : step.unit === "month" ? {
|
|
98
|
+
month: "short",
|
|
99
|
+
year: "numeric"
|
|
100
|
+
} : step.unit === "year" ? {
|
|
101
|
+
year: "numeric"
|
|
102
|
+
} : {
|
|
103
|
+
day: "numeric",
|
|
104
|
+
month: "short"
|
|
105
|
+
};
|
|
106
|
+
return new Intl.DateTimeFormat(locale, {
|
|
107
|
+
...options,
|
|
108
|
+
timeZone: axis.timeZone
|
|
109
|
+
}).format(tick);
|
|
110
|
+
};
|
|
111
|
+
const escapeText = value => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">");
|
|
112
|
+
const xTickLabel = /<text class="stdlib-chart-tick-label" x="(-?[\d.]+)" y="(-?[\d.]+)" text-anchor="middle">[^<]*<\/text>/g;
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Replaces the renderer's X tick labels, which sit on decimal millisecond steps, with labels on round times. The
|
|
116
|
+
* renderer drew the X axis over the explicit `domain`, so its horizontal axis line gives the pixel scale.
|
|
117
|
+
*/
|
|
118
|
+
export function timeAxisSvg(svg, domain, axis, maxTicks, format) {
|
|
119
|
+
const axisLine = [...svg.matchAll(/<line class="stdlib-chart-axis" x1="(-?[\d.]+)" y1="(-?[\d.]+)" x2="(-?[\d.]+)" y2="(-?[\d.]+)"\/>/g)].find(match => match[2] === match[4]);
|
|
120
|
+
const first = xTickLabel.exec(svg);
|
|
121
|
+
xTickLabel.lastIndex = 0;
|
|
122
|
+
if (!axisLine || !first || !(domain[1] > domain[0])) return svg;
|
|
123
|
+
const x0 = Number(axisLine[1]),
|
|
124
|
+
x1 = Number(axisLine[3]),
|
|
125
|
+
y = first[2];
|
|
126
|
+
const step = chartTimeStep(domain[1] - domain[0], maxTicks);
|
|
127
|
+
const labels = chartTimeTicks(domain, axis.timeZone, step).map(tick => {
|
|
128
|
+
const x = x0 + (tick - domain[0]) / (domain[1] - domain[0]) * (x1 - x0);
|
|
129
|
+
const label = format ? format(tick) : chartTimeLabel(tick, step, axis);
|
|
130
|
+
return `<text class="stdlib-chart-tick-label" x="${Math.round(x * 100) / 100}" y="${y}" text-anchor="middle">${escapeText(label)}</text>`;
|
|
131
|
+
}).join("");
|
|
132
|
+
let inserted = false;
|
|
133
|
+
return svg.replace(xTickLabel, () => {
|
|
134
|
+
if (inserted) return "";
|
|
135
|
+
inserted = true;
|
|
136
|
+
return labels;
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=chart-time-axis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/chart-time-axis.ts"],"sourcesContent":["import { dates } from \"@k2b/stdlib\";\n\n/**\n * A line chart whose X values are instants (Unix milliseconds). Its axis ticks land on round times in `timeZone`:\n * minutes, hours, days, weeks, months, or years, whichever step keeps the requested number of ticks.\n */\nexport type ChartTimeAxis = {\n /** IANA zone whose wall clock the ticks follow, such as the zone the data's buckets use. */\n timeZone: string;\n /** Locale of the default tick labels; `xAxis.format` replaces them. Defaults to `en`. */\n locale?: string;\n};\n\nexport type ChartTimeUnit = \"minute\" | \"hour\" | \"day\" | \"week\" | \"month\" | \"year\";\nexport type ChartTimeStep = { unit: ChartTimeUnit; size: number };\n\nconst STEPS: readonly ChartTimeStep[] = [\n ...[1, 2, 5, 10, 15, 30].map((size) => ({ unit: \"minute\" as const, size })),\n ...[1, 2, 3, 6, 12].map((size) => ({ unit: \"hour\" as const, size })),\n ...[1, 2].map((size) => ({ unit: \"day\" as const, size })),\n { unit: \"week\", size: 1 },\n ...[1, 3, 6].map((size) => ({ unit: \"month\" as const, size })),\n { unit: \"year\", size: 1 },\n];\nconst UNIT_MS: Record<ChartTimeUnit, number> = {\n minute: 60_000,\n hour: 3_600_000,\n day: 86_400_000,\n week: 604_800_000,\n month: 2_629_746_000,\n year: 31_556_952_000,\n};\n\n// Wall-clock arithmetic runs on a zone-free calendar: the wall time read as if it were UTC.\nconst wallOf = (instant: number, timeZone: string) => Date.parse(`${dates.instantToZonedInput(new Date(instant), timeZone)}:00Z`);\nconst instantOf = (wall: number, timeZone: string) =>\n Date.parse(dates.zonedDateTimeToInstant(new Date(wall).toISOString().slice(0, 16), timeZone, { disambiguation: \"compatible\" }));\n\nconst floorWall = (wall: number, step: ChartTimeStep): number => {\n const date = new Date(wall);\n const y = date.getUTCFullYear(),\n m = date.getUTCMonth(),\n d = date.getUTCDate();\n if (step.unit === \"minute\") {\n const minutes = Math.floor(date.getUTCMinutes() / step.size) * step.size;\n return Date.UTC(y, m, d, date.getUTCHours(), minutes);\n }\n if (step.unit === \"hour\") return Date.UTC(y, m, d, Math.floor(date.getUTCHours() / step.size) * step.size);\n if (step.unit === \"day\") {\n const day = Date.UTC(y, m, d);\n return day - (Math.floor(day / UNIT_MS.day) % step.size) * UNIT_MS.day;\n }\n // Weeks start on Monday, as Cloud's calendars default to.\n if (step.unit === \"week\") return Date.UTC(y, m, d) - ((date.getUTCDay() + 6) % 7) * UNIT_MS.day;\n if (step.unit === \"month\") return Date.UTC(y, Math.floor(m / step.size) * step.size, 1);\n return Date.UTC(y, 0, 1);\n};\n\nconst nextWall = (wall: number, step: ChartTimeStep): number => {\n const date = new Date(wall);\n if (step.unit === \"month\") return Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + step.size, 1);\n if (step.unit === \"year\") return Date.UTC(date.getUTCFullYear() + step.size, 0, 1);\n return wall + step.size * UNIT_MS[step.unit];\n};\n\n/** The round step for a time span: the finest one that keeps at most `maxTicks` ticks. */\nexport const chartTimeStep = (span: number, maxTicks: number): ChartTimeStep =>\n STEPS.find((step) => span / (step.size * UNIT_MS[step.unit]) <= maxTicks) ?? STEPS.at(-1)!;\n\n/** Tick instants inside `domain` that fall on round wall times of `step` in `timeZone`. */\nexport const chartTimeTicks = (domain: readonly [number, number], timeZone: string, step: ChartTimeStep): number[] => {\n const [lo, hi] = domain;\n const ticks: number[] = [];\n // Instants outside the Date range have no wall time; Bun reads their \"NaN-NaN-…\" wall as 2000 and counts from there.\n if ([lo, hi].some((instant) => Number.isNaN(new Date(instant).getTime()))) return ticks;\n // A day that a DST change shortens maps a missing wall time onto the next one; it shows once. The budget counts\n // steps, not ticks, so a step that repeats a tick or does not advance ends too.\n for (let wall = floorWall(wallOf(lo, timeZone), step), steps = 0; steps <= 1_000; steps++) {\n const instant = instantOf(wall, timeZone);\n if (instant > hi) break;\n if (instant >= lo && instant !== ticks.at(-1)) ticks.push(instant);\n const next = nextWall(wall, step);\n if (!(next > wall)) break;\n wall = next;\n }\n return ticks;\n};\n\n/** Default label of a tick: the clock time, the day at local midnight, the month or the year. */\nexport const chartTimeLabel = (tick: number, step: ChartTimeStep, axis: ChartTimeAxis): string => {\n const locale = axis.locale ?? \"en\";\n const midnight = dates.instantToZonedInput(new Date(tick), axis.timeZone).endsWith(\"T00:00\");\n const options: Intl.DateTimeFormatOptions =\n (step.unit === \"minute\" || step.unit === \"hour\") && !midnight\n ? { hour: \"2-digit\", minute: \"2-digit\", hourCycle: \"h23\" }\n : step.unit === \"month\"\n ? { month: \"short\", year: \"numeric\" }\n : step.unit === \"year\"\n ? { year: \"numeric\" }\n : { day: \"numeric\", month: \"short\" };\n return new Intl.DateTimeFormat(locale, { ...options, timeZone: axis.timeZone }).format(tick);\n};\n\nconst escapeText = (value: string) => value.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\nconst xTickLabel = /<text class=\"stdlib-chart-tick-label\" x=\"(-?[\\d.]+)\" y=\"(-?[\\d.]+)\" text-anchor=\"middle\">[^<]*<\\/text>/g;\n\n/**\n * Replaces the renderer's X tick labels, which sit on decimal millisecond steps, with labels on round times. The\n * renderer drew the X axis over the explicit `domain`, so its horizontal axis line gives the pixel scale.\n */\nexport function timeAxisSvg(\n svg: string,\n domain: readonly [number, number],\n axis: ChartTimeAxis,\n maxTicks: number,\n format?: (value: number) => string,\n): string {\n const axisLine = [\n ...svg.matchAll(/<line class=\"stdlib-chart-axis\" x1=\"(-?[\\d.]+)\" y1=\"(-?[\\d.]+)\" x2=\"(-?[\\d.]+)\" y2=\"(-?[\\d.]+)\"\\/>/g),\n ].find((match) => match[2] === match[4]);\n const first = xTickLabel.exec(svg);\n xTickLabel.lastIndex = 0;\n if (!axisLine || !first || !(domain[1] > domain[0])) return svg;\n const x0 = Number(axisLine[1]),\n x1 = Number(axisLine[3]),\n y = first[2];\n const step = chartTimeStep(domain[1] - domain[0], maxTicks);\n const labels = chartTimeTicks(domain, axis.timeZone, step)\n .map((tick) => {\n const x = x0 + ((tick - domain[0]) / (domain[1] - domain[0])) * (x1 - x0);\n const label = format ? format(tick) : chartTimeLabel(tick, step, axis);\n return `<text class=\"stdlib-chart-tick-label\" x=\"${Math.round(x * 100) / 100}\" y=\"${y}\" text-anchor=\"middle\">${escapeText(label)}</text>`;\n })\n .join(\"\");\n let inserted = false;\n return svg.replace(xTickLabel, () => {\n if (inserted) return \"\";\n inserted = true;\n return labels;\n });\n}\n"],"mappings":"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","ignoreList":[]}
|