@k2b/ui 0.50.0 → 0.52.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 +35 -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/Dropdown.js +43 -10
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/Toolbar.js +8 -2
- package/dist/browser/actions/Toolbar.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 +3 -5
- package/dist/browser/charts/core/area.js.map +1 -1
- package/dist/browser/charts/core/bar-labels.js +5 -0
- package/dist/browser/charts/core/bar-labels.js.map +1 -0
- package/dist/browser/charts/core/bubble.js +166 -0
- package/dist/browser/charts/core/bubble.js.map +1 -0
- package/dist/browser/charts/core/calendar.js +1 -1
- package/dist/browser/charts/core/calendar.js.map +1 -1
- 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/default-styles.js +83 -0
- package/dist/browser/charts/core/default-styles.js.map +1 -0
- package/dist/browser/charts/core/funnel-layout.js +79 -0
- package/dist/browser/charts/core/funnel-layout.js.map +1 -0
- package/dist/browser/charts/core/funnel.js +27 -0
- package/dist/browser/charts/core/funnel.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 +12 -2
- package/dist/browser/charts/core/index.js.map +1 -1
- package/dist/browser/charts/core/map.js +116 -0
- package/dist/browser/charts/core/map.js.map +1 -0
- package/dist/browser/charts/core/pareto.js +120 -0
- package/dist/browser/charts/core/pareto.js.map +1 -0
- package/dist/browser/charts/core/radar.js +101 -0
- package/dist/browser/charts/core/radar.js.map +1 -0
- package/dist/browser/charts/core/registry.js +33 -16
- package/dist/browser/charts/core/registry.js.map +1 -1
- package/dist/browser/charts/core/render-size.js +15 -0
- package/dist/browser/charts/core/render-size.js.map +1 -0
- package/dist/browser/charts/core/render.js +39 -10
- package/dist/browser/charts/core/render.js.map +1 -1
- package/dist/browser/charts/core/snapshot.js +4 -4
- package/dist/browser/charts/core/snapshot.js.map +1 -1
- package/dist/browser/charts/core/svg-barGauge.js +67 -0
- package/dist/browser/charts/core/svg-barGauge.js.map +1 -0
- package/dist/browser/charts/core/svg-boxplot.js +127 -0
- package/dist/browser/charts/core/svg-boxplot.js.map +1 -0
- package/dist/browser/charts/core/svg-common.js +1065 -0
- package/dist/browser/charts/core/svg-common.js.map +1 -0
- package/dist/browser/charts/core/svg-gauge.js +185 -0
- package/dist/browser/charts/core/svg-gauge.js.map +1 -0
- package/dist/browser/charts/core/svg-heatmap.js +80 -0
- package/dist/browser/charts/core/svg-heatmap.js.map +1 -0
- package/dist/browser/charts/core/svg-histogram.js +73 -0
- package/dist/browser/charts/core/svg-histogram.js.map +1 -0
- package/dist/browser/charts/core/svg-renderers.js +638 -0
- package/dist/browser/charts/core/svg-renderers.js.map +1 -0
- package/dist/browser/charts/core/svg-scatter.js +114 -0
- package/dist/browser/charts/core/svg-scatter.js.map +1 -0
- package/dist/browser/charts/core/svg.js +4 -2525
- package/dist/browser/charts/core/svg.js.map +1 -1
- package/dist/browser/charts/core/treemap.js +138 -0
- package/dist/browser/charts/core/treemap.js.map +1 -0
- package/dist/browser/charts/core/types.js +0 -2
- package/dist/browser/charts/core/types.js.map +1 -1
- 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.map +1 -1
- package/dist/browser/content/Chart.js +14 -628
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartRoot.js +646 -0
- package/dist/browser/content/ChartRoot.js.map +1 -0
- package/dist/browser/content/ChartSnapshotView.js +4 -1
- 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 +186 -193
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/FileView.js +111 -61
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/Lightbox.js +62 -30
- 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/ThumbnailStrip.js +174 -0
- package/dist/browser/content/ThumbnailStrip.js.map +1 -0
- package/dist/browser/content/chart-bar.js +344 -16
- package/dist/browser/content/chart-bar.js.map +1 -1
- package/dist/browser/content/chart-inspection-core.js +50 -29
- package/dist/browser/content/chart-inspection-core.js.map +1 -1
- package/dist/browser/content/chart-line-gaps.js +1 -1
- package/dist/browser/content/chart-line-gaps.js.map +1 -1
- package/dist/browser/content/chart-message-catalog.js +28 -0
- package/dist/browser/content/chart-message-catalog.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 +2 -1
- package/dist/browser/content/chart-svg.js.map +1 -1
- package/dist/browser/content/index.js +2 -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/content/thumbnail-strip-messages.js +24 -0
- package/dist/browser/content/thumbnail-strip-messages.js.map +1 -0
- package/dist/browser/inputs/ChoiceInputs.js +150 -76
- 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 +113 -98
- 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/index.js +5 -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/MarkdownSelectionToolbar.js +330 -0
- package/dist/browser/inputs/markdown/MarkdownSelectionToolbar.js.map +1 -0
- 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/internal/field.js +96 -77
- package/dist/browser/internal/field.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +7 -5
- 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/PanelDialog.js +92 -68
- package/dist/browser/layout/PanelDialog.js.map +1 -1
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/surfaces/DescriptionList.js +5 -2
- package/dist/browser/surfaces/DescriptionList.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +95 -78
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/browser/surfaces/delta-badge.js +16 -2
- package/dist/browser/surfaces/delta-badge.js.map +1 -1
- package/dist/browser/surfaces/stat-cell-messages.js +4 -2
- package/dist/browser/surfaces/stat-cell-messages.js.map +1 -1
- package/dist/browser/widgets/DashboardFrame.js +315 -0
- package/dist/browser/widgets/DashboardFrame.js.map +1 -0
- package/dist/browser/widgets/index.js +1 -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/Dropdown.js +43 -10
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/Toolbar.js +8 -2
- package/dist/ssr/actions/Toolbar.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 +3 -5
- package/dist/ssr/charts/core/area.js.map +1 -1
- package/dist/ssr/charts/core/bar-labels.js +5 -0
- package/dist/ssr/charts/core/bar-labels.js.map +1 -0
- package/dist/ssr/charts/core/bubble.js +166 -0
- package/dist/ssr/charts/core/bubble.js.map +1 -0
- package/dist/ssr/charts/core/calendar.js +1 -1
- package/dist/ssr/charts/core/calendar.js.map +1 -1
- 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/default-styles.js +83 -0
- package/dist/ssr/charts/core/default-styles.js.map +1 -0
- package/dist/ssr/charts/core/funnel-layout.js +79 -0
- package/dist/ssr/charts/core/funnel-layout.js.map +1 -0
- package/dist/ssr/charts/core/funnel.js +27 -0
- package/dist/ssr/charts/core/funnel.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 +12 -2
- package/dist/ssr/charts/core/index.js.map +1 -1
- package/dist/ssr/charts/core/map.js +116 -0
- package/dist/ssr/charts/core/map.js.map +1 -0
- package/dist/ssr/charts/core/pareto.js +120 -0
- package/dist/ssr/charts/core/pareto.js.map +1 -0
- package/dist/ssr/charts/core/radar.js +101 -0
- package/dist/ssr/charts/core/radar.js.map +1 -0
- package/dist/ssr/charts/core/registry.js +33 -16
- package/dist/ssr/charts/core/registry.js.map +1 -1
- package/dist/ssr/charts/core/render-size.js +15 -0
- package/dist/ssr/charts/core/render-size.js.map +1 -0
- package/dist/ssr/charts/core/render.js +39 -10
- package/dist/ssr/charts/core/render.js.map +1 -1
- package/dist/ssr/charts/core/snapshot.js +4 -4
- package/dist/ssr/charts/core/snapshot.js.map +1 -1
- package/dist/ssr/charts/core/svg-barGauge.js +67 -0
- package/dist/ssr/charts/core/svg-barGauge.js.map +1 -0
- package/dist/ssr/charts/core/svg-boxplot.js +127 -0
- package/dist/ssr/charts/core/svg-boxplot.js.map +1 -0
- package/dist/ssr/charts/core/svg-common.js +1065 -0
- package/dist/ssr/charts/core/svg-common.js.map +1 -0
- package/dist/ssr/charts/core/svg-gauge.js +185 -0
- package/dist/ssr/charts/core/svg-gauge.js.map +1 -0
- package/dist/ssr/charts/core/svg-heatmap.js +80 -0
- package/dist/ssr/charts/core/svg-heatmap.js.map +1 -0
- package/dist/ssr/charts/core/svg-histogram.js +73 -0
- package/dist/ssr/charts/core/svg-histogram.js.map +1 -0
- package/dist/ssr/charts/core/svg-renderers.js +638 -0
- package/dist/ssr/charts/core/svg-renderers.js.map +1 -0
- package/dist/ssr/charts/core/svg-scatter.js +114 -0
- package/dist/ssr/charts/core/svg-scatter.js.map +1 -0
- package/dist/ssr/charts/core/svg.js +4 -2525
- package/dist/ssr/charts/core/svg.js.map +1 -1
- package/dist/ssr/charts/core/treemap.js +138 -0
- package/dist/ssr/charts/core/treemap.js.map +1 -0
- package/dist/ssr/charts/core/types.js +0 -2
- package/dist/ssr/charts/core/types.js.map +1 -1
- 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.map +1 -1
- package/dist/ssr/content/Chart.js +14 -471
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartRoot.js +489 -0
- package/dist/ssr/content/ChartRoot.js.map +1 -0
- package/dist/ssr/content/ChartSnapshotView.js +1 -0
- 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 +12 -16
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/FileView.js +56 -7
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/Lightbox.js +39 -10
- 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/ThumbnailStrip.js +103 -0
- package/dist/ssr/content/ThumbnailStrip.js.map +1 -0
- package/dist/ssr/content/chart-bar.js +344 -16
- package/dist/ssr/content/chart-bar.js.map +1 -1
- package/dist/ssr/content/chart-inspection-core.js +50 -29
- package/dist/ssr/content/chart-inspection-core.js.map +1 -1
- package/dist/ssr/content/chart-line-gaps.js +1 -1
- package/dist/ssr/content/chart-line-gaps.js.map +1 -1
- package/dist/ssr/content/chart-message-catalog.js +28 -0
- package/dist/ssr/content/chart-message-catalog.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 +2 -1
- package/dist/ssr/content/chart-svg.js.map +1 -1
- package/dist/ssr/content/index.js +2 -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/content/thumbnail-strip-messages.js +24 -0
- package/dist/ssr/content/thumbnail-strip-messages.js.map +1 -0
- package/dist/ssr/inputs/ChoiceInputs.js +69 -17
- 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 +14 -9
- 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/index.js +5 -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/MarkdownSelectionToolbar.js +293 -0
- package/dist/ssr/inputs/markdown/MarkdownSelectionToolbar.js.map +1 -0
- 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/internal/field.js +36 -24
- package/dist/ssr/internal/field.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +5 -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/PanelDialog.js +40 -26
- package/dist/ssr/layout/PanelDialog.js.map +1 -1
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/surfaces/DescriptionList.js +1 -1
- package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +31 -21
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/surfaces/delta-badge.js +16 -2
- package/dist/ssr/surfaces/delta-badge.js.map +1 -1
- package/dist/ssr/surfaces/stat-cell-messages.js +4 -2
- package/dist/ssr/surfaces/stat-cell-messages.js.map +1 -1
- package/dist/ssr/widgets/DashboardFrame.js +195 -0
- package/dist/ssr/widgets/DashboardFrame.js.map +1 -0
- package/dist/ssr/widgets/index.js +1 -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/Toolbar.d.ts +2 -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/bar-labels.d.ts +1 -0
- package/dist/types/charts/core/bubble.d.ts +66 -0
- package/dist/types/charts/core/calendar.d.ts +1 -1
- package/dist/types/charts/core/chart-messages.d.ts +5 -0
- package/dist/types/charts/core/default-styles.d.ts +1 -0
- package/dist/types/charts/core/funnel-layout.d.ts +43 -0
- package/dist/types/charts/core/funnel.d.ts +13 -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 +12 -2
- package/dist/types/charts/core/map.d.ts +3 -0
- package/dist/types/charts/core/pareto.d.ts +40 -0
- package/dist/types/charts/core/radar.d.ts +47 -0
- package/dist/types/charts/core/registry.d.ts +27 -11
- package/dist/types/charts/core/render-size.d.ts +7 -0
- package/dist/types/charts/core/render.d.ts +1 -4
- package/dist/types/charts/core/snapshot.d.ts +2 -2
- package/dist/types/charts/core/svg-barGauge.d.ts +3 -0
- package/dist/types/charts/core/svg-boxplot.d.ts +18 -0
- package/dist/types/charts/core/svg-common.d.ts +612 -0
- package/dist/types/charts/core/svg-gauge.d.ts +6 -0
- package/dist/types/charts/core/svg-heatmap.d.ts +6 -0
- package/dist/types/charts/core/svg-histogram.d.ts +16 -0
- package/dist/types/charts/core/svg-renderers.d.ts +118 -0
- package/dist/types/charts/core/svg-scatter.d.ts +23 -0
- package/dist/types/charts/core/svg.d.ts +4 -698
- package/dist/types/charts/core/treemap.d.ts +45 -0
- package/dist/types/charts/core/types.d.ts +1 -12
- package/dist/types/charts/core/waterfall.d.ts +68 -0
- package/dist/types/charts/description.d.ts +289 -0
- package/dist/types/charts.d.ts +1 -0
- package/dist/types/content/Chart.d.ts +3 -91
- package/dist/types/content/ChartRoot.d.ts +92 -0
- package/dist/types/content/ChartSparkline.d.ts +5 -0
- package/dist/types/content/Lightbox.d.ts +2 -0
- package/dist/types/content/PdfViewer.d.ts +32 -0
- package/dist/types/content/ThumbnailStrip.d.ts +29 -0
- package/dist/types/content/chart-bar.d.ts +131 -2
- package/dist/types/content/chart-inspection-core.d.ts +7 -0
- package/dist/types/content/chart-inspection.d.ts +1 -0
- package/dist/types/content/chart-message-catalog.d.ts +8 -0
- package/dist/types/content/index.d.ts +3 -0
- 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/content/thumbnail-strip-messages.d.ts +10 -0
- package/dist/types/inputs/ChoiceInputs.d.ts +6 -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/index.d.ts +10 -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/MarkdownSelectionToolbar.d.ts +19 -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/internal/field.d.ts +2 -0
- package/dist/types/layout/DetailPanel.d.ts +12 -0
- package/dist/types/layout/PanelDialog.d.ts +5 -0
- package/dist/types/layout/index.d.ts +1 -1
- package/dist/types/surfaces/DescriptionList.d.ts +5 -0
- package/dist/types/surfaces/StatCell.d.ts +6 -1
- package/dist/types/surfaces/stat-cell-messages.d.ts +1 -0
- package/dist/types/widgets/DashboardFrame.d.ts +61 -0
- package/dist/types/widgets/index.d.ts +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { chartDatumSvg, escapeXml, renderHeader, svgRoot } from "./svg";
|
|
2
|
+
export function treemapLayout(spec, size = {
|
|
3
|
+
width: spec.width ?? 480,
|
|
4
|
+
height: spec.height ?? 280
|
|
5
|
+
}) {
|
|
6
|
+
const width = spec.displayWidth ?? size.width,
|
|
7
|
+
height = size.height;
|
|
8
|
+
const data = spec.data.map((d, index) => {
|
|
9
|
+
if (!Number.isFinite(d.value) || d.value < 0) throw new RangeError("Treemap values must be finite and nonnegative.");
|
|
10
|
+
if (!spec.groups.includes(d.group)) throw new RangeError("Treemap groups must contain every item group.");
|
|
11
|
+
return {
|
|
12
|
+
...d,
|
|
13
|
+
index
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
const total = data.reduce((s, d) => s + d.value, 0);
|
|
17
|
+
if (!Number.isFinite(total)) throw new RangeError("Treemap total must be finite.");
|
|
18
|
+
const header = renderHeader(width, spec.title, spec.subtitle);
|
|
19
|
+
const legend = [];
|
|
20
|
+
let lx = 0,
|
|
21
|
+
lr = 0;
|
|
22
|
+
if (spec.legend !== false) spec.groups.forEach((label, index) => {
|
|
23
|
+
const itemWidth = Math.min(width, label.length * 12 + 28);
|
|
24
|
+
if (lx && lx + itemWidth > width) {
|
|
25
|
+
lx = 0;
|
|
26
|
+
lr++;
|
|
27
|
+
}
|
|
28
|
+
legend.push({
|
|
29
|
+
label,
|
|
30
|
+
index,
|
|
31
|
+
x: lx,
|
|
32
|
+
row: lr
|
|
33
|
+
});
|
|
34
|
+
lx += itemWidth;
|
|
35
|
+
});
|
|
36
|
+
const legendHeight = legend.length ? (lr + 1) * 20 + 4 : 0,
|
|
37
|
+
plotHeight = Math.max(0, height - header.height - legendHeight);
|
|
38
|
+
const entries = data.filter(d => d.value > 0).sort((a, b) => b.value - a.value).map(d => ({
|
|
39
|
+
...d,
|
|
40
|
+
area: d.value / (total || 1) * width * plotHeight
|
|
41
|
+
})).filter(d => d.area > 0);
|
|
42
|
+
const cells = [];
|
|
43
|
+
let x = 0,
|
|
44
|
+
y = header.height,
|
|
45
|
+
w = width,
|
|
46
|
+
h = plotHeight;
|
|
47
|
+
const worst = (areas, side) => {
|
|
48
|
+
if (!areas.length || side <= 0) return Infinity;
|
|
49
|
+
const sum = areas.reduce((s, a) => s + a, 0),
|
|
50
|
+
lo = Math.min(...areas),
|
|
51
|
+
hi = Math.max(...areas);
|
|
52
|
+
return Math.max(side * side * hi / (sum * sum), sum * sum / (side * side * lo));
|
|
53
|
+
};
|
|
54
|
+
let offset = 0;
|
|
55
|
+
while (offset < entries.length) {
|
|
56
|
+
if (w <= 0 || h <= 0) break;
|
|
57
|
+
const row = [entries[offset++]];
|
|
58
|
+
const side = Math.min(w, h);
|
|
59
|
+
while (offset < entries.length && worst(row.map(c => c.area), side) >= worst([...row.map(c => c.area), entries[offset].area], side)) row.push(entries[offset++]);
|
|
60
|
+
const sum = row.reduce((s, c) => s + c.area, 0);
|
|
61
|
+
const vertical = w >= h;
|
|
62
|
+
const thickness = Math.min(vertical ? w : h, sum / (vertical ? h : w));
|
|
63
|
+
let pos = vertical ? y : x;
|
|
64
|
+
for (const d of row) {
|
|
65
|
+
const length = d.area / thickness;
|
|
66
|
+
cells.push({
|
|
67
|
+
...d,
|
|
68
|
+
x: vertical ? x : pos,
|
|
69
|
+
y: vertical ? pos : y,
|
|
70
|
+
width: vertical ? thickness : length,
|
|
71
|
+
height: vertical ? length : thickness
|
|
72
|
+
});
|
|
73
|
+
pos += length;
|
|
74
|
+
}
|
|
75
|
+
if (vertical) {
|
|
76
|
+
x += thickness;
|
|
77
|
+
w = Math.max(0, w - thickness);
|
|
78
|
+
} else {
|
|
79
|
+
y += thickness;
|
|
80
|
+
h = Math.max(0, h - thickness);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
for (const d of data.filter(d => !cells.some(c => c.index === d.index))) cells.push({
|
|
84
|
+
...d,
|
|
85
|
+
x: 0,
|
|
86
|
+
y: 0,
|
|
87
|
+
width: 0,
|
|
88
|
+
height: 0
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
width,
|
|
92
|
+
height,
|
|
93
|
+
total,
|
|
94
|
+
cells,
|
|
95
|
+
header,
|
|
96
|
+
legend,
|
|
97
|
+
legendTop: height - legendHeight,
|
|
98
|
+
plotHeight
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export function renderTreemapSvg(spec) {
|
|
102
|
+
const scene = treemapLayout(spec);
|
|
103
|
+
const number = spec.format ?? new Intl.NumberFormat(spec.locale ?? "en", {
|
|
104
|
+
maximumSignificantDigits: 15
|
|
105
|
+
}).format;
|
|
106
|
+
const percent = new Intl.NumberFormat(spec.locale ?? "en", {
|
|
107
|
+
style: "percent",
|
|
108
|
+
maximumFractionDigits: 1
|
|
109
|
+
});
|
|
110
|
+
const body = scene.header.svg.replace(/<text class="stdlib-chart-title"/g, '<text fill="var(--k2b-text,#27272a)" font-size="14" class="stdlib-chart-title"').replace(/<text class="stdlib-chart-subtitle"/g, '<text fill="var(--k2b-text-muted,#45454e)" font-size="11" class="stdlib-chart-subtitle"') + scene.cells.map(c => {
|
|
111
|
+
const group = spec.groups.indexOf(c.group) % 8 + 1;
|
|
112
|
+
const color = `var(--stdlib-chart-c${group},${["#3b82f6", "#10b981", "#f59e0b", "#8b5cf6", "#ec4899", "#06b6d4", "#84cc16", "#f97316"][group - 1]})`;
|
|
113
|
+
const text = c.width * (spec.displayWidth ?? 296) / scene.width > Math.max(56, Math.max(c.label.length * 12, number(c.value).length * 11) + 16) && c.height * Math.min(1, 180 / scene.height) > 48 ? `<text data-treemap-name="true" style="translate:0 calc((var(--k2b-chart-inverse-y,1) - 1) * 18px)" x="${c.x + 8}" y="${c.y + 18}" font-size="12" font-weight="600" fill="var(--k2b-text,#27272a)">${escapeXml(c.label)}</text><text data-treemap-value="true" style="translate:0 calc((var(--k2b-chart-inverse-y,1) - 1) * 38px)" x="${c.x + 8}" y="${c.y + 38}" font-size="11" font-weight="400" fill="var(--k2b-text-muted,#45454e)">${escapeXml(number(c.value))}</text>` : "";
|
|
114
|
+
return chartDatumSvg(`<rect class="k2b-chart-treemap-cell" x="${c.x + 1}" y="${c.y + 1}" width="${Math.max(0, c.width - 2)}" height="${Math.max(0, c.height - 2)}" rx="4" fill="color-mix(in srgb,${color} 55%,var(--k2b-surface,#fff))" stroke="none"/>${text}`, {
|
|
115
|
+
role: "item",
|
|
116
|
+
index: c.index,
|
|
117
|
+
label: c.label,
|
|
118
|
+
anchor: [c.x + c.width / 2, c.y + c.height / 2],
|
|
119
|
+
values: [{
|
|
120
|
+
key: "group",
|
|
121
|
+
value: c.group
|
|
122
|
+
}, {
|
|
123
|
+
key: "value",
|
|
124
|
+
value: c.value,
|
|
125
|
+
formatted: number(c.value)
|
|
126
|
+
}, {
|
|
127
|
+
key: "percent",
|
|
128
|
+
value: scene.total ? c.value / scene.total * 100 : 0,
|
|
129
|
+
formatted: scene.total ? percent.format(c.value / scene.total) : "–"
|
|
130
|
+
}]
|
|
131
|
+
}, spec.inspect);
|
|
132
|
+
}).join("") + scene.legend.map(item => `<rect x="${item.x}" y="${scene.legendTop + item.row * 20 + 6}" width="8" height="8" rx="2" fill="var(--stdlib-chart-c${item.index % 8 + 1},${["#3b82f6", "#10b981", "#f59e0b", "#8b5cf6", "#ec4899", "#06b6d4", "#84cc16", "#f97316"][item.index % 8]})"/><text x="${item.x + 13}" y="${scene.legendTop + item.row * 20 + 14}" font-size="11" fill="var(--k2b-text-muted,#45454e)">${escapeXml(item.label.slice(0, Math.floor((scene.width - 28) / 12)))}</text>`).join("");
|
|
133
|
+
return svgRoot({
|
|
134
|
+
...scene,
|
|
135
|
+
className: spec.className
|
|
136
|
+
}, body);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=treemap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/treemap.ts"],"sourcesContent":["import { type ChartOptions, chartDatumSvg, escapeXml, renderHeader, svgRoot } from \"./svg\";\nexport type TreemapOptions = ChartOptions & {\n groups: string[];\n legend?: boolean;\n data: { label: string; group: string; value: number }[];\n locale?: string;\n format?: (value: number) => string;\n displayWidth?: number;\n};\nexport function treemapLayout(spec: TreemapOptions, size = { width: spec.width ?? 480, height: spec.height ?? 280 }) {\n const width = spec.displayWidth ?? size.width,\n height = size.height;\n const data = spec.data.map((d, index) => {\n if (!Number.isFinite(d.value) || d.value < 0) throw new RangeError(\"Treemap values must be finite and nonnegative.\");\n if (!spec.groups.includes(d.group)) throw new RangeError(\"Treemap groups must contain every item group.\");\n return { ...d, index };\n });\n const total = data.reduce((s, d) => s + d.value, 0);\n if (!Number.isFinite(total)) throw new RangeError(\"Treemap total must be finite.\");\n const header = renderHeader(width, spec.title, spec.subtitle);\n const legend: { label: string; x: number; row: number; index: number }[] = [];\n let lx = 0,\n lr = 0;\n if (spec.legend !== false)\n spec.groups.forEach((label, index) => {\n const itemWidth = Math.min(width, label.length * 12 + 28);\n if (lx && lx + itemWidth > width) {\n lx = 0;\n lr++;\n }\n legend.push({ label, index, x: lx, row: lr });\n lx += itemWidth;\n });\n const legendHeight = legend.length ? (lr + 1) * 20 + 4 : 0,\n plotHeight = Math.max(0, height - header.height - legendHeight);\n const entries = data\n .filter((d) => d.value > 0)\n .sort((a, b) => b.value - a.value)\n .map((d) => ({ ...d, area: (d.value / (total || 1)) * width * plotHeight }))\n .filter((d) => d.area > 0);\n const cells: ((typeof data)[number] & { x: number; y: number; width: number; height: number })[] = [];\n let x = 0,\n y = header.height,\n w = width,\n h = plotHeight;\n const worst = (areas: number[], side: number) => {\n if (!areas.length || side <= 0) return Infinity;\n const sum = areas.reduce((s, a) => s + a, 0),\n lo = Math.min(...areas),\n hi = Math.max(...areas);\n return Math.max((side * side * hi) / (sum * sum), (sum * sum) / (side * side * lo));\n };\n let offset = 0;\n while (offset < entries.length) {\n if (w <= 0 || h <= 0) break;\n const row = [entries[offset++]!];\n const side = Math.min(w, h);\n while (\n offset < entries.length &&\n worst(\n row.map((c) => c.area),\n side,\n ) >= worst([...row.map((c) => c.area), entries[offset]!.area], side)\n )\n row.push(entries[offset++]!);\n const sum = row.reduce((s, c) => s + c.area, 0);\n const vertical = w >= h;\n const thickness = Math.min(vertical ? w : h, sum / (vertical ? h : w));\n let pos = vertical ? y : x;\n for (const d of row) {\n const length = d.area / thickness;\n cells.push({\n ...d,\n x: vertical ? x : pos,\n y: vertical ? pos : y,\n width: vertical ? thickness : length,\n height: vertical ? length : thickness,\n });\n pos += length;\n }\n if (vertical) {\n x += thickness;\n w = Math.max(0, w - thickness);\n } else {\n y += thickness;\n h = Math.max(0, h - thickness);\n }\n }\n for (const d of data.filter((d) => !cells.some((c) => c.index === d.index))) cells.push({ ...d, x: 0, y: 0, width: 0, height: 0 });\n return { width, height, total, cells, header, legend, legendTop: height - legendHeight, plotHeight };\n}\nexport function renderTreemapSvg(spec: TreemapOptions): string {\n const scene = treemapLayout(spec);\n const number = spec.format ?? new Intl.NumberFormat(spec.locale ?? \"en\", { maximumSignificantDigits: 15 }).format;\n const percent = new Intl.NumberFormat(spec.locale ?? \"en\", { style: \"percent\", maximumFractionDigits: 1 });\n const body =\n scene.header.svg\n .replace(/<text class=\"stdlib-chart-title\"/g, '<text fill=\"var(--k2b-text,#27272a)\" font-size=\"14\" class=\"stdlib-chart-title\"')\n .replace(\n /<text class=\"stdlib-chart-subtitle\"/g,\n '<text fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\" class=\"stdlib-chart-subtitle\"',\n ) +\n scene.cells\n .map((c) => {\n const group = (spec.groups.indexOf(c.group) % 8) + 1;\n const color = `var(--stdlib-chart-c${group},${[\"#3b82f6\", \"#10b981\", \"#f59e0b\", \"#8b5cf6\", \"#ec4899\", \"#06b6d4\", \"#84cc16\", \"#f97316\"][group - 1]})`;\n const text =\n (c.width * (spec.displayWidth ?? 296)) / scene.width >\n Math.max(56, Math.max(c.label.length * 12, number(c.value).length * 11) + 16) && c.height * Math.min(1, 180 / scene.height) > 48\n ? `<text data-treemap-name=\"true\" style=\"translate:0 calc((var(--k2b-chart-inverse-y,1) - 1) * 18px)\" x=\"${c.x + 8}\" y=\"${c.y + 18}\" font-size=\"12\" font-weight=\"600\" fill=\"var(--k2b-text,#27272a)\">${escapeXml(c.label)}</text><text data-treemap-value=\"true\" style=\"translate:0 calc((var(--k2b-chart-inverse-y,1) - 1) * 38px)\" x=\"${c.x + 8}\" y=\"${c.y + 38}\" font-size=\"11\" font-weight=\"400\" fill=\"var(--k2b-text-muted,#45454e)\">${escapeXml(number(c.value))}</text>`\n : \"\";\n return chartDatumSvg(\n `<rect class=\"k2b-chart-treemap-cell\" x=\"${c.x + 1}\" y=\"${c.y + 1}\" width=\"${Math.max(0, c.width - 2)}\" height=\"${Math.max(0, c.height - 2)}\" rx=\"4\" fill=\"color-mix(in srgb,${color} 55%,var(--k2b-surface,#fff))\" stroke=\"none\"/>${text}`,\n {\n role: \"item\",\n index: c.index,\n label: c.label,\n anchor: [c.x + c.width / 2, c.y + c.height / 2],\n values: [\n { key: \"group\", value: c.group },\n { key: \"value\", value: c.value, formatted: number(c.value) },\n {\n key: \"percent\",\n value: scene.total ? (c.value / scene.total) * 100 : 0,\n formatted: scene.total ? percent.format(c.value / scene.total) : \"–\",\n },\n ],\n },\n spec.inspect,\n );\n })\n .join(\"\") +\n scene.legend\n .map(\n (item) =>\n `<rect x=\"${item.x}\" y=\"${scene.legendTop + item.row * 20 + 6}\" width=\"8\" height=\"8\" rx=\"2\" fill=\"var(--stdlib-chart-c${(item.index % 8) + 1},${[\"#3b82f6\", \"#10b981\", \"#f59e0b\", \"#8b5cf6\", \"#ec4899\", \"#06b6d4\", \"#84cc16\", \"#f97316\"][item.index % 8]})\"/><text x=\"${item.x + 13}\" y=\"${scene.legendTop + item.row * 20 + 14}\" font-size=\"11\" fill=\"var(--k2b-text-muted,#45454e)\">${escapeXml(item.label.slice(0, Math.floor((scene.width - 28) / 12)))}</text>`,\n )\n .join(\"\");\n return svgRoot({ ...scene, className: spec.className }, body);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,6 +3,4 @@
|
|
|
3
3
|
export const chartDatumRoles = ["point", "item", "bin", "box", "outlier", "value", "cell", "interval"];
|
|
4
4
|
|
|
5
5
|
/** Renderer metadata. Anchors use the containing SVG's coordinate space. */
|
|
6
|
-
|
|
7
|
-
/** Serializable number presentation, compatible with the editor's NumberFormat contract. */
|
|
8
6
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["charts/core/types.ts"],"sourcesContent":["import type { chartRenderers } from \"./registry\";\n\n/** UI-owned kind union, derived from the renderer registry. */\nexport type ChartKind = keyof typeof chartRenderers;\nexport const chartDatumRoles = [\"point\", \"item\", \"bin\", \"box\", \"outlier\", \"value\", \"cell\", \"interval\"] as const;\nexport type ChartDatumRole = (typeof chartDatumRoles)[number];\n\n/** Renderer metadata. Anchors use the containing SVG's coordinate space. */\nexport type ChartDatum = {\n index: number;\n seriesIndex?: number;\n role: ChartDatumRole;\n label?: string;\n anchor: [number, number];\n grid?: [number, number];\n values: { key: string; value: string | number; formatted?: string }[];\n};\n\
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/types.ts"],"sourcesContent":["import type { chartRenderers } from \"./registry\";\n\n/** UI-owned kind union, derived from the renderer registry. */\nexport type ChartKind = keyof typeof chartRenderers;\nexport const chartDatumRoles = [\"point\", \"item\", \"bin\", \"box\", \"outlier\", \"value\", \"cell\", \"interval\"] as const;\nexport type ChartDatumRole = (typeof chartDatumRoles)[number];\n\n/** Renderer metadata. Anchors use the containing SVG's coordinate space. */\nexport type ChartDatum = {\n index: number;\n seriesIndex?: number;\n role: ChartDatumRole;\n label?: string;\n anchor: [number, number];\n grid?: [number, number];\n values: { key: string; value: string | number; formatted?: string }[];\n};\n\nexport type { ChartDateFormat, ChartFormat, ChartNumberFormat } from \"../description\";\n"],"mappings":"AAEA;;AAEA,OAAO,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAU;;AAG/G","ignoreList":[]}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { chartDatumSvg, escapeXml, niceStep } from "./svg-renderers";
|
|
2
|
+
/** Totals rest on zero; each change starts at the previous running balance. */
|
|
3
|
+
export function waterfallLayout(spec, size) {
|
|
4
|
+
if (![size.width, size.height].every(value => Number.isFinite(value) && value > 0)) throw new RangeError("Invalid waterfall size");
|
|
5
|
+
let balance = spec.start.value;
|
|
6
|
+
if (!Number.isFinite(balance)) throw new RangeError("Waterfall values must be finite");
|
|
7
|
+
const bars = [{
|
|
8
|
+
...spec.start,
|
|
9
|
+
from: 0,
|
|
10
|
+
to: balance,
|
|
11
|
+
total: true
|
|
12
|
+
}];
|
|
13
|
+
for (const step of spec.steps) {
|
|
14
|
+
const from = balance;
|
|
15
|
+
balance += step.value;
|
|
16
|
+
if (!Number.isFinite(step.value) || !Number.isFinite(balance)) throw new RangeError("Waterfall balances must be finite");
|
|
17
|
+
bars.push({
|
|
18
|
+
...step,
|
|
19
|
+
from,
|
|
20
|
+
to: balance,
|
|
21
|
+
total: false
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
bars.push({
|
|
25
|
+
...spec.end,
|
|
26
|
+
value: balance,
|
|
27
|
+
from: 0,
|
|
28
|
+
to: balance,
|
|
29
|
+
total: true
|
|
30
|
+
});
|
|
31
|
+
let lo = 0,
|
|
32
|
+
hi = 0;
|
|
33
|
+
for (const bar of bars) {
|
|
34
|
+
lo = Math.min(lo, bar.from, bar.to);
|
|
35
|
+
hi = Math.max(hi, bar.from, bar.to);
|
|
36
|
+
}
|
|
37
|
+
if (!Number.isFinite(hi - lo)) throw new RangeError("Waterfall range must be finite");
|
|
38
|
+
if (lo === hi) hi = lo + 1;
|
|
39
|
+
const step = niceStep(hi - lo, 5);
|
|
40
|
+
const lower = Math.floor(lo / step) * step;
|
|
41
|
+
const upper = Math.ceil(hi / step) * step;
|
|
42
|
+
if (!(step > 0) || ![step, lower, upper, upper - lower].every(Number.isFinite) || lower >= upper) throw new RangeError("Waterfall values cannot form a finite axis; rescale them first");
|
|
43
|
+
// Integer tick indices cannot stall when adjacent floats are large. The five-interval nice step bounds their count.
|
|
44
|
+
const scale = {
|
|
45
|
+
domain: [lower, upper],
|
|
46
|
+
ticks: Array.from({
|
|
47
|
+
length: Math.round((upper - lower) / step) + 1
|
|
48
|
+
}, (_, i) => lower + i * step)
|
|
49
|
+
};
|
|
50
|
+
const format = spec.format ?? new Intl.NumberFormat(spec.locale ?? "en", {
|
|
51
|
+
maximumFractionDigits: 2
|
|
52
|
+
}).format;
|
|
53
|
+
const displayWidth = spec.displayWidth ?? size.width;
|
|
54
|
+
if (!Number.isFinite(displayWidth) || displayWidth <= 0) throw new RangeError("Invalid waterfall display width");
|
|
55
|
+
const ratio = size.width / displayWidth;
|
|
56
|
+
const left = Math.min(size.width * 0.6, Math.max(48, ...scale.ticks.map(v => format(v).length * 7 + 12)) * ratio);
|
|
57
|
+
const top = spec.title || spec.subtitle ? 58 : 24;
|
|
58
|
+
const bottom = Math.max(top + 1, size.height - 30);
|
|
59
|
+
const right = size.width - 10;
|
|
60
|
+
const slot = (right - left) / bars.length;
|
|
61
|
+
const project = value => bottom - (value - scale.domain[0]) / (scale.domain[1] - scale.domain[0]) * (bottom - top);
|
|
62
|
+
const amount = bar => `${bar.total ? "" : bar.value > 0 ? "↙ " : bar.value < 0 ? "↗ " : "= "}${format(bar.total ? bar.value : Math.abs(bar.value))}`;
|
|
63
|
+
const datum = (bar, index, center, formattedAmount) => ({
|
|
64
|
+
role: "item",
|
|
65
|
+
index,
|
|
66
|
+
label: bar.label,
|
|
67
|
+
anchor: [center, top],
|
|
68
|
+
values: bar.total ? [{
|
|
69
|
+
key: "balance",
|
|
70
|
+
value: bar.to,
|
|
71
|
+
formatted: format(bar.to)
|
|
72
|
+
}] : [{
|
|
73
|
+
key: "before",
|
|
74
|
+
value: bar.from,
|
|
75
|
+
formatted: format(bar.from)
|
|
76
|
+
}, {
|
|
77
|
+
key: bar.value > 0 ? "inflow" : bar.value < 0 ? "outflow" : "change",
|
|
78
|
+
value: bar.value,
|
|
79
|
+
formatted: formattedAmount
|
|
80
|
+
}, {
|
|
81
|
+
key: "after",
|
|
82
|
+
value: bar.to,
|
|
83
|
+
formatted: format(bar.to)
|
|
84
|
+
}]
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
bars,
|
|
88
|
+
balance,
|
|
89
|
+
scale,
|
|
90
|
+
left,
|
|
91
|
+
right,
|
|
92
|
+
top,
|
|
93
|
+
bottom,
|
|
94
|
+
slot,
|
|
95
|
+
ratio,
|
|
96
|
+
project,
|
|
97
|
+
format,
|
|
98
|
+
amount,
|
|
99
|
+
datum
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const f = value => String(Math.round(value * 100) / 100);
|
|
103
|
+
const text = (x, y, value, anchor = "middle", extra = "") => `<text x="${f(x)}" y="${f(y)}" text-anchor="${anchor}" fill="currentColor" stroke="none" font-family="var(--k2b-font-sans, sans-serif)" font-size="11" ${extra}>${escapeXml(value)}</text>`;
|
|
104
|
+
|
|
105
|
+
/** Pure SVG, including presentation attributes for PDF and hosts outside .k2b-ui. */
|
|
106
|
+
export function renderWaterfallSvg(spec, responsive = false) {
|
|
107
|
+
return renderWaterfallLayoutSvg(spec, waterfallLayout(spec, spec), responsive);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Draw the geometry already reserved by a host before its drawing module loads. */
|
|
111
|
+
export function renderWaterfallLayoutSvg(spec, g, responsive = false) {
|
|
112
|
+
const parts = [];
|
|
113
|
+
// The Solid host stretches a stable viewBox. Container queries use its drawn CSS width on the first frame,
|
|
114
|
+
// rather than freezing the labels to the phone fallback or measuring and redrawing after hydration.
|
|
115
|
+
const visibility = minimumWidth => {
|
|
116
|
+
if (!responsive || minimumWidth <= 0) return "";
|
|
117
|
+
const threshold = f(minimumWidth);
|
|
118
|
+
parts.push(`<style>@container (max-width: ${f(minimumWidth - 0.01)}px) { .k2b-waterfall [data-waterfall-min-width="${threshold}"] { display: none; } }</style>`);
|
|
119
|
+
return ` data-waterfall-min-width="${threshold}"`;
|
|
120
|
+
};
|
|
121
|
+
if (spec.title) parts.push(text(spec.width / 2, 16, spec.title));
|
|
122
|
+
if (spec.subtitle) parts.push(text(spec.width / 2, spec.title ? 34 : 16, spec.subtitle));
|
|
123
|
+
parts.push(`<line class="stdlib-chart-axis" x1="${f(g.left)}" x2="${f(g.right)}" y1="${f(g.bottom)}" y2="${f(g.bottom)}" stroke="currentColor" stroke-opacity="0.2"/>`);
|
|
124
|
+
parts.push(`<line class="stdlib-chart-axis" x1="${f(g.left)}" x2="${f(g.left)}" y1="${f(g.top)}" y2="${f(g.bottom)}" stroke="none"/>`);
|
|
125
|
+
for (const tick of g.scale.ticks) {
|
|
126
|
+
const y = g.project(tick);
|
|
127
|
+
parts.push(`<line x1="${f(g.left)}" x2="${f(g.right)}" y1="${f(y)}" y2="${f(y)}" stroke="currentColor" stroke-opacity="${tick === 0 ? ".25" : ".09"}"/>`);
|
|
128
|
+
parts.push(text(g.left - 8, y + 4, g.format(tick), "end", 'class="stdlib-chart-tick-label"'));
|
|
129
|
+
}
|
|
130
|
+
const cssSlot = g.slot / g.ratio;
|
|
131
|
+
const longest = Math.max(1, ...g.bars.map(b => Math.min(18, b.label.length))) * 6;
|
|
132
|
+
const stride = Math.max(1, Math.ceil((longest + 8) / Math.max(1, cssSlot)));
|
|
133
|
+
const endLimit = Math.max(1, Math.min(18, Math.floor((g.right - g.left) / g.ratio / 12) - 1));
|
|
134
|
+
const endLength = Math.min(endLimit, spec.end.label.length);
|
|
135
|
+
g.bars.forEach((bar, index) => {
|
|
136
|
+
const center = g.left + (index + 0.5) * g.slot;
|
|
137
|
+
const width = Math.min(56, g.slot * 0.62);
|
|
138
|
+
const top = Math.min(g.project(bar.from), g.project(bar.to));
|
|
139
|
+
const height = Math.abs(g.project(bar.from) - g.project(bar.to));
|
|
140
|
+
const color = bar.total ? "color-mix(in srgb, var(--k2b-text-muted, #8b8b93) 55%, transparent)" : bar.value > 0 ? "var(--k2b-flow-in-mark, #0891b2)" : bar.value < 0 ? "var(--k2b-flow-out-mark, #8b5cf6)" : "color-mix(in srgb, var(--k2b-text-muted, #8b8b93) 55%, transparent)";
|
|
141
|
+
const amount = g.amount(bar);
|
|
142
|
+
const band = `<rect class="k2b-chart-category-band" x="${f(center - g.slot / 2)}" y="${f(g.top)}" width="${f(g.slot)}" height="${f(g.bottom - g.top)}" fill="currentColor" fill-opacity="0" stroke="none"/>`;
|
|
143
|
+
const mark = `<rect class="k2b-waterfall-bar" x="${f(center - width / 2)}" y="${f(top)}" width="${f(width)}" height="${f(Math.max(height, 1))}" rx="3" fill="${color}" stroke="none"/>`;
|
|
144
|
+
const valueWidth = Math.max(46 * spec.width / width, (amount.length * 6 + 8) * spec.width / g.slot);
|
|
145
|
+
const value = responsive || width / g.ratio >= 46 && amount.length * 6 + 8 <= cssSlot ? text(center, Math.max(g.top - 8, top - 6), amount, "middle", `class="k2b-waterfall-value" font-weight="600"${visibility(valueWidth)}`).replace('fill="currentColor"', 'fill="var(--k2b-text-secondary, #52525b)"') : "";
|
|
146
|
+
parts.push(chartDatumSvg(band + mark + value, g.datum(bar, index, center, amount), spec.inspect ?? false));
|
|
147
|
+
if (index < g.bars.length - 1) parts.push(`<line class="k2b-waterfall-connector" x1="${f(center + width / 2)}" x2="${f(center + g.slot - width / 2)}" y1="${f(g.project(bar.to))}" y2="${f(g.project(bar.to))}" stroke="currentColor" stroke-opacity=".3" stroke-dasharray="3 3"/>`);
|
|
148
|
+
const ending = index === g.bars.length - 1;
|
|
149
|
+
const endClearance = (Math.min(18, bar.label.length) * 3 + endLength * 6 + 8) / Math.max(1, g.right - center);
|
|
150
|
+
if (ending || responsive || index % stride === 0 && (index === 0 || endClearance * g.ratio <= 1)) {
|
|
151
|
+
// Power-of-two subsets keep adjacent labels at least one visible slot apart at every container width.
|
|
152
|
+
let spacing = 1;
|
|
153
|
+
if (index > 0) while (index % (spacing * 2) === 0) spacing *= 2;
|
|
154
|
+
const minimumWidth = index === 0 || ending ? 0 : Math.max((longest + 8) * spec.width / (g.slot * spacing), endClearance * spec.width);
|
|
155
|
+
const limit = ending ? endLimit : responsive ? 18 : Math.max(1, Math.floor(Math.min(cssSlot * stride - 8, 2 * Math.min(center, spec.width - center) / g.ratio) / 6) - 1);
|
|
156
|
+
const label = bar.label.length > limit ? `${bar.label.slice(0, Math.max(0, limit - 1))}…` : bar.label;
|
|
157
|
+
parts.push(text(ending ? g.right : center, g.bottom + 20, label, ending ? "end" : "middle", `class="stdlib-chart-tick-label stdlib-chart-category-label "${visibility(minimumWidth)}`));
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" class="stdlib-chart k2b-waterfall ${escapeXml(spec.className ?? "")}" width="${spec.width}" height="${spec.height}" viewBox="0 0 ${spec.width} ${spec.height}" aria-hidden="true" focusable="false">${parts.join("")}</svg>`;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=waterfall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/waterfall.ts"],"sourcesContent":["import { chartDatumSvg, escapeXml, niceStep } from \"./svg-renderers\";\nimport type { ChartDatum } from \"./types\";\n\nexport type WaterfallOptions = {\n start: { label: string; value: number };\n steps: { label: string; value: number }[];\n end: { label: string };\n title?: string;\n subtitle?: string;\n className?: string;\n /** Formats balances and absolute changes. */\n format?: (value: number) => string;\n locale?: string;\n /** Displayed width in CSS pixels; defaults to the SVG width. Stretching hosts pass their layout width. */\n displayWidth?: number;\n};\n\nexport type WaterfallBar = { label: string; value: number; from: number; to: number; total: boolean };\n\n/** Totals rest on zero; each change starts at the previous running balance. */\nexport function waterfallLayout(spec: WaterfallOptions, size: { width: number; height: number }) {\n if (![size.width, size.height].every((value) => Number.isFinite(value) && value > 0)) throw new RangeError(\"Invalid waterfall size\");\n let balance = spec.start.value;\n if (!Number.isFinite(balance)) throw new RangeError(\"Waterfall values must be finite\");\n const bars: WaterfallBar[] = [{ ...spec.start, from: 0, to: balance, total: true }];\n for (const step of spec.steps) {\n const from = balance;\n balance += step.value;\n if (!Number.isFinite(step.value) || !Number.isFinite(balance)) throw new RangeError(\"Waterfall balances must be finite\");\n bars.push({ ...step, from, to: balance, total: false });\n }\n bars.push({ ...spec.end, value: balance, from: 0, to: balance, total: true });\n let lo = 0,\n hi = 0;\n for (const bar of bars) {\n lo = Math.min(lo, bar.from, bar.to);\n hi = Math.max(hi, bar.from, bar.to);\n }\n if (!Number.isFinite(hi - lo)) throw new RangeError(\"Waterfall range must be finite\");\n if (lo === hi) hi = lo + 1;\n const step = niceStep(hi - lo, 5);\n const lower = Math.floor(lo / step) * step;\n const upper = Math.ceil(hi / step) * step;\n if (!(step > 0) || ![step, lower, upper, upper - lower].every(Number.isFinite) || lower >= upper)\n throw new RangeError(\"Waterfall values cannot form a finite axis; rescale them first\");\n // Integer tick indices cannot stall when adjacent floats are large. The five-interval nice step bounds their count.\n const scale = {\n domain: [lower, upper] as [number, number],\n ticks: Array.from({ length: Math.round((upper - lower) / step) + 1 }, (_, i) => lower + i * step),\n };\n const format = spec.format ?? new Intl.NumberFormat(spec.locale ?? \"en\", { maximumFractionDigits: 2 }).format;\n const displayWidth = spec.displayWidth ?? size.width;\n if (!Number.isFinite(displayWidth) || displayWidth <= 0) throw new RangeError(\"Invalid waterfall display width\");\n const ratio = size.width / displayWidth;\n const left = Math.min(size.width * 0.6, Math.max(48, ...scale.ticks.map((v) => format(v).length * 7 + 12)) * ratio);\n const top = spec.title || spec.subtitle ? 58 : 24;\n const bottom = Math.max(top + 1, size.height - 30);\n const right = size.width - 10;\n const slot = (right - left) / bars.length;\n const project = (value: number) => bottom - ((value - scale.domain[0]) / (scale.domain[1] - scale.domain[0])) * (bottom - top);\n const amount = (bar: WaterfallBar) =>\n `${bar.total ? \"\" : bar.value > 0 ? \"↙ \" : bar.value < 0 ? \"↗ \" : \"= \"}${format(bar.total ? bar.value : Math.abs(bar.value))}`;\n const datum = (bar: WaterfallBar, index: number, center: number, formattedAmount: string): ChartDatum => ({\n role: \"item\",\n index,\n label: bar.label,\n anchor: [center, top],\n values: bar.total\n ? [{ key: \"balance\", value: bar.to, formatted: format(bar.to) }]\n : [\n { key: \"before\", value: bar.from, formatted: format(bar.from) },\n { key: bar.value > 0 ? \"inflow\" : bar.value < 0 ? \"outflow\" : \"change\", value: bar.value, formatted: formattedAmount },\n { key: \"after\", value: bar.to, formatted: format(bar.to) },\n ],\n });\n return { bars, balance, scale, left, right, top, bottom, slot, ratio, project, format, amount, datum };\n}\n\nexport type WaterfallLayout = ReturnType<typeof waterfallLayout>;\n\nconst f = (value: number) => String(Math.round(value * 100) / 100);\nconst text = (x: number, y: number, value: string, anchor = \"middle\", extra = \"\") =>\n `<text x=\"${f(x)}\" y=\"${f(y)}\" text-anchor=\"${anchor}\" fill=\"currentColor\" stroke=\"none\" font-family=\"var(--k2b-font-sans, sans-serif)\" font-size=\"11\" ${extra}>${escapeXml(value)}</text>`;\n\n/** Pure SVG, including presentation attributes for PDF and hosts outside .k2b-ui. */\nexport function renderWaterfallSvg(\n spec: WaterfallOptions & { width: number; height: number; inspect?: boolean },\n responsive = false,\n): string {\n return renderWaterfallLayoutSvg(spec, waterfallLayout(spec, spec), responsive);\n}\n\n/** Draw the geometry already reserved by a host before its drawing module loads. */\nexport function renderWaterfallLayoutSvg(\n spec: WaterfallOptions & { width: number; height: number; inspect?: boolean },\n g: WaterfallLayout,\n responsive = false,\n): string {\n const parts: string[] = [];\n // The Solid host stretches a stable viewBox. Container queries use its drawn CSS width on the first frame,\n // rather than freezing the labels to the phone fallback or measuring and redrawing after hydration.\n const visibility = (minimumWidth: number) => {\n if (!responsive || minimumWidth <= 0) return \"\";\n const threshold = f(minimumWidth);\n parts.push(\n `<style>@container (max-width: ${f(minimumWidth - 0.01)}px) { .k2b-waterfall [data-waterfall-min-width=\"${threshold}\"] { display: none; } }</style>`,\n );\n return ` data-waterfall-min-width=\"${threshold}\"`;\n };\n if (spec.title) parts.push(text(spec.width / 2, 16, spec.title));\n if (spec.subtitle) parts.push(text(spec.width / 2, spec.title ? 34 : 16, spec.subtitle));\n parts.push(\n `<line class=\"stdlib-chart-axis\" x1=\"${f(g.left)}\" x2=\"${f(g.right)}\" y1=\"${f(g.bottom)}\" y2=\"${f(g.bottom)}\" stroke=\"currentColor\" stroke-opacity=\"0.2\"/>`,\n );\n parts.push(`<line class=\"stdlib-chart-axis\" x1=\"${f(g.left)}\" x2=\"${f(g.left)}\" y1=\"${f(g.top)}\" y2=\"${f(g.bottom)}\" stroke=\"none\"/>`);\n for (const tick of g.scale.ticks) {\n const y = g.project(tick);\n parts.push(\n `<line x1=\"${f(g.left)}\" x2=\"${f(g.right)}\" y1=\"${f(y)}\" y2=\"${f(y)}\" stroke=\"currentColor\" stroke-opacity=\"${tick === 0 ? \".25\" : \".09\"}\"/>`,\n );\n parts.push(text(g.left - 8, y + 4, g.format(tick), \"end\", 'class=\"stdlib-chart-tick-label\"'));\n }\n const cssSlot = g.slot / g.ratio;\n const longest = Math.max(1, ...g.bars.map((b) => Math.min(18, b.label.length))) * 6;\n const stride = Math.max(1, Math.ceil((longest + 8) / Math.max(1, cssSlot)));\n const endLimit = Math.max(1, Math.min(18, Math.floor((g.right - g.left) / g.ratio / 12) - 1));\n const endLength = Math.min(endLimit, spec.end.label.length);\n g.bars.forEach((bar, index) => {\n const center = g.left + (index + 0.5) * g.slot;\n const width = Math.min(56, g.slot * 0.62);\n const top = Math.min(g.project(bar.from), g.project(bar.to));\n const height = Math.abs(g.project(bar.from) - g.project(bar.to));\n const color = bar.total\n ? \"color-mix(in srgb, var(--k2b-text-muted, #8b8b93) 55%, transparent)\"\n : bar.value > 0\n ? \"var(--k2b-flow-in-mark, #0891b2)\"\n : bar.value < 0\n ? \"var(--k2b-flow-out-mark, #8b5cf6)\"\n : \"color-mix(in srgb, var(--k2b-text-muted, #8b8b93) 55%, transparent)\";\n const amount = g.amount(bar);\n const band = `<rect class=\"k2b-chart-category-band\" x=\"${f(center - g.slot / 2)}\" y=\"${f(g.top)}\" width=\"${f(g.slot)}\" height=\"${f(g.bottom - g.top)}\" fill=\"currentColor\" fill-opacity=\"0\" stroke=\"none\"/>`;\n const mark = `<rect class=\"k2b-waterfall-bar\" x=\"${f(center - width / 2)}\" y=\"${f(top)}\" width=\"${f(width)}\" height=\"${f(Math.max(height, 1))}\" rx=\"3\" fill=\"${color}\" stroke=\"none\"/>`;\n const valueWidth = Math.max((46 * spec.width) / width, ((amount.length * 6 + 8) * spec.width) / g.slot);\n const value =\n responsive || (width / g.ratio >= 46 && amount.length * 6 + 8 <= cssSlot)\n ? text(\n center,\n Math.max(g.top - 8, top - 6),\n amount,\n \"middle\",\n `class=\"k2b-waterfall-value\" font-weight=\"600\"${visibility(valueWidth)}`,\n ).replace('fill=\"currentColor\"', 'fill=\"var(--k2b-text-secondary, #52525b)\"')\n : \"\";\n parts.push(chartDatumSvg(band + mark + value, g.datum(bar, index, center, amount), spec.inspect ?? false));\n if (index < g.bars.length - 1)\n parts.push(\n `<line class=\"k2b-waterfall-connector\" x1=\"${f(center + width / 2)}\" x2=\"${f(center + g.slot - width / 2)}\" y1=\"${f(g.project(bar.to))}\" y2=\"${f(g.project(bar.to))}\" stroke=\"currentColor\" stroke-opacity=\".3\" stroke-dasharray=\"3 3\"/>`,\n );\n const ending = index === g.bars.length - 1;\n const endClearance = (Math.min(18, bar.label.length) * 3 + endLength * 6 + 8) / Math.max(1, g.right - center);\n if (ending || responsive || (index % stride === 0 && (index === 0 || endClearance * g.ratio <= 1))) {\n // Power-of-two subsets keep adjacent labels at least one visible slot apart at every container width.\n let spacing = 1;\n if (index > 0) while (index % (spacing * 2) === 0) spacing *= 2;\n const minimumWidth =\n index === 0 || ending ? 0 : Math.max(((longest + 8) * spec.width) / (g.slot * spacing), endClearance * spec.width);\n const limit = ending\n ? endLimit\n : responsive\n ? 18\n : Math.max(1, Math.floor(Math.min(cssSlot * stride - 8, (2 * Math.min(center, spec.width - center)) / g.ratio) / 6) - 1);\n const label = bar.label.length > limit ? `${bar.label.slice(0, Math.max(0, limit - 1))}…` : bar.label;\n parts.push(\n text(\n ending ? g.right : center,\n g.bottom + 20,\n label,\n ending ? \"end\" : \"middle\",\n `class=\"stdlib-chart-tick-label stdlib-chart-category-label \"${visibility(minimumWidth)}`,\n ),\n );\n }\n });\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"stdlib-chart k2b-waterfall ${escapeXml(spec.className ?? \"\")}\" width=\"${spec.width}\" height=\"${spec.height}\" viewBox=\"0 0 ${spec.width} ${spec.height}\" aria-hidden=\"true\" focusable=\"false\">${parts.join(\"\")}</svg>`;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/description.ts"],"sourcesContent":["/** JSON number formatting. Functions belong to the rendering host, never the saved description. */\nexport type ChartNumberFormat = {\n style?: \"number\" | \"percent\" | \"currency\";\n currency?: string;\n unit?: string;\n decimals?: number;\n compact?: boolean;\n};\nexport type ChartDateFormat = { date: \"day\" | \"minute\" | \"second\" };\nexport type ChartFormat = ChartNumberFormat | ChartDateFormat;\nexport type ChartLimits = { maxSeries: number; maxValues: number; maxMarks: number };\nexport type ChartDescriptionAxis = {\n label?: string;\n domain?: number[];\n ticks?: number;\n scale?: \"linear\" | \"log\";\n format?: ChartFormat;\n};\ntype Reference = {\n value: number | string;\n axis?: \"x\" | \"y\";\n label?: string;\n style?: \"solid\" | \"dashed\" | \"dotted\";\n tone?: \"neutral\" | \"info\" | \"success\" | \"warning\" | \"danger\";\n};\ntype Threshold = { value: number; label?: string };\ntype Series<N> = { label?: string; data: { x: N | string; y: N }[]; role?: \"reference\" };\ntype Common = { title: string; subtitle?: string; tooltip?: { label?: string; format?: ChartNumberFormat } };\ntype Variants<N> =\n | {\n kind: \"waterfall\";\n start: { label: string; value: number };\n steps: { label: string; value: number }[];\n end: { label: string };\n format?: ChartNumberFormat;\n }\n | {\n kind: \"area\";\n layout: \"stacked\";\n normalize?: boolean;\n x: (number | string)[];\n series: { label: string; data: (number | null)[] }[];\n legend?: boolean;\n format?: ChartNumberFormat;\n }\n | {\n kind: \"bar\";\n data: { label: string; value: N }[];\n x?: string[];\n series?: { label: string; data: (number | null)[] }[];\n layout?: \"columns\" | \"rows\" | \"grouped\" | \"stacked\";\n normalize?: boolean;\n share?: boolean;\n limit?: number;\n tone?: \"in\" | \"out\";\n format?: ChartNumberFormat;\n compare?: { label: string; data: (number | null)[] };\n xAxis?: Pick<ChartDescriptionAxis, \"label\"> & { ordered?: boolean };\n yAxis?: ChartDescriptionAxis;\n colorByBar?: boolean;\n showValues?: boolean;\n legend?: boolean;\n references?: Reference[];\n }\n | { kind: \"funnel\"; data: { label: string; value: number | null }[]; format?: ChartNumberFormat }\n | {\n kind: \"hbar\";\n series: string[];\n rows: { group?: string; label: string; values: (number | null)[] }[];\n legend?: boolean;\n format?: ChartNumberFormat;\n }\n | {\n kind: \"line\";\n series: (Series<N> & { style?: \"solid\" | \"dashed\" | \"dotted\" })[];\n xAxis?: ChartDescriptionAxis;\n yAxis?: ChartDescriptionAxis;\n legend?: boolean;\n area?: boolean;\n smooth?: boolean;\n references?: Reference[];\n }\n | {\n kind: \"scatter\";\n series: Series<N>[];\n xAxis?: ChartDescriptionAxis;\n yAxis?: ChartDescriptionAxis;\n legend?: boolean;\n references?: Reference[];\n }\n | { kind: \"pie\" | \"donut\"; data: { label: string; value: N }[]; legend?: boolean; showLabels?: boolean; format?: ChartNumberFormat }\n | { kind: \"histogram\"; data: N[]; bins?: number | number[]; references?: Reference[] }\n | {\n kind: \"gauge\";\n value: N;\n min?: number;\n max?: number;\n label?: string;\n unit?: string;\n format?: ChartNumberFormat;\n thresholds?: Threshold[];\n }\n | { kind: \"sparkline\"; data: N[]; area?: boolean }\n | { kind: \"boxplot\"; data: { label: string; values: N[] }[]; yAxis?: ChartDescriptionAxis; references?: Reference[] }\n | {\n kind: \"heatmap\";\n layout: \"calendar\";\n data: [string, N | null][];\n scale: \"sequential\" | \"diverging\";\n label?: string;\n format?: ChartNumberFormat;\n locale?: string;\n }\n | {\n kind: \"heatmap\";\n layout?: undefined;\n data: { x: string; y: string; value: N }[];\n format?: ChartNumberFormat;\n showValues?: boolean;\n min?: number;\n max?: number;\n }\n | {\n kind: \"barGauge\";\n data: { label: string; value: N; min?: number; max?: number }[];\n min?: number;\n max?: number;\n unit?: string;\n format?: ChartNumberFormat;\n thresholds?: Threshold[];\n }\n | { kind: \"stat\"; value: N; format?: ChartNumberFormat; unit?: string; delta?: N; better?: \"up\" | \"down\"; sparkline?: N[] }\n | {\n kind: \"treemap\";\n groups: string[];\n data: { label: string; group: string; value: number }[];\n legend?: boolean;\n format?: ChartNumberFormat;\n locale?: string;\n }\n | {\n kind: \"pareto\";\n labels: [string, string];\n data: { label: string; value: number; prev: number }[];\n format?: ChartNumberFormat;\n locale?: string;\n }\n | {\n kind: \"bubble\";\n groups: string[];\n data: { label: string; group: string; x: number; y: number; size?: number }[];\n xLabel: string;\n yLabel: string;\n sizeLabel?: string;\n averages?: boolean;\n legend?: boolean;\n xFormat?: ChartNumberFormat;\n yFormat?: ChartNumberFormat;\n format?: ChartNumberFormat;\n locale?: string;\n }\n | {\n kind: \"radar\";\n axes: string[];\n max: number;\n unit?: string;\n series: { label: string; data: number[] }[];\n format?: ChartNumberFormat;\n legend?: boolean;\n locale?: string;\n };\n\n/** Portable chart node. Dates are ISO text and missing observations are null, never zero. */\nexport type ChartDescription = Common &\n (\n | Exclude<Variants<number | null>, { kind: \"bar\" }>\n // Aligned series omit flat data; the validator supplies an empty array.\n | (Omit<Extract<Variants<number | null>, { kind: \"bar\" }>, \"data\"> & { data?: { label: string; value: number | null }[] })\n );\n/** Validated renderer input. The portable validator normalizes null gaps to non-finite numbers for drawing. */\nexport type ChartInput = Common &\n (\n | Exclude<Variants<number>, { kind: \"stat\" }>\n | (Omit<Extract<Variants<number>, { kind: \"stat\" }>, \"delta\"> & { delta: number | undefined })\n );\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["charts.ts"],"sourcesContent":["/**\n * Drawing helpers and portable chart contracts. Import the Solid Chart component from `@k2b/ui`.\n */\n\nexport * from \"./charts/core\";\nexport type { ChartKindProps, ChartLabels, ChartProps, ChartRenderOptions } from \"./content/Chart\";\nexport { type BarChartLayout, type BarChartOptions, barChartLayout, renderBarChartSvg } from \"./content/chart-bar\";\n\nexport { calendarInspectionNavigation, mountCalendarScroll } from \"./content/chart-calendar\";\n"],"mappings":"AAAA;AACA;AACA;;AAEA,cAAc,eAAe;
|
|
1
|
+
{"version":3,"names":[],"sources":["charts.ts"],"sourcesContent":["/**\n * Drawing helpers and portable chart contracts. Import the Solid Chart component from `@k2b/ui`.\n */\n\nexport * from \"./charts/core\";\nexport type * from \"./charts/description\";\nexport type { ChartKindProps, ChartLabels, ChartProps, ChartRenderOptions } from \"./content/Chart\";\nexport { type BarChartLayout, type BarChartOptions, barChartLayout, renderBarChartSvg } from \"./content/chart-bar\";\n\nexport { calendarInspectionNavigation, mountCalendarScroll } from \"./content/chart-calendar\";\n"],"mappings":"AAAA;AACA;AACA;;AAEA,cAAc,eAAe;AAG7B,SAAoD,cAAc,EAAE,iBAAiB,QAAQ,qBAAqB;AAElH,SAAS,4BAA4B,EAAE,mBAAmB,QAAQ,0BAA0B","ignoreList":[]}
|