@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["charts/core/calendar.ts"],"sourcesContent":["import { type ChartOptions, chartDatumSvg, escapeXml, type HeatmapOptions, heatmap, renderHeader, svgRoot } from \"./svg\";\nimport { chartTextWidth } from \"./text\";\nexport type CalendarHeatmapOptions = ChartOptions & {\n layout: \"calendar\";\n data: [string, number | null][];\n scale: \"sequential\" | \"diverging\";\n /** Unit shown beside each tooltip value. */\n label?: string;\n locale?: string;\n format?: (value: number) => string;\n displayWidth?: number;\n};\nexport type HeatmapChartOptions = (HeatmapOptions & { layout?: undefined }) | CalendarHeatmapOptions;\nconst DAY = 86400000;\n/** Bound sparse inputs too: three leap years of daily observations. */\nexport const CALENDAR_MAX_DAYS = 1098;\nexport function calendarDay(value: string): number {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) throw new RangeError(\"Calendar dates must be YYYY-MM-DD.\");\n const date = new Date(`${value}T00:00:00Z`);\n if (!Number.isFinite(date.getTime()) || date.toISOString().slice(0, 10) !== value) throw new RangeError(\"Invalid calendar date.\");\n return date.getTime();\n}\n/** Intl uses 1..7, JS dates use 0..6. Old engines use an explicit locale fallback. */\nexport function calendarWeekStart(locale = \"en\"): number {\n const info: Intl.Locale & { weekInfo?: { firstDay: number }; getWeekInfo?: () => { firstDay: number } } = new Intl.Locale(locale);\n const fallback: Record<string, number> = { \"en-US\": 0 };\n const key = `${info.language}-${info.region ?? info.maximize().region}`;\n return (info.getWeekInfo?.().firstDay ?? info.weekInfo?.firstDay ?? fallback[key] ?? 1) % 7;\n}\nexport const calendarWords = (locale = \"en\") =>\n locale.split(\"-\")[0] === \"de\"\n ? { day: \"Tag\", less: \"weniger\", more: \"mehr\", moreIn: \"mehr rein\", moreOut: \"mehr raus\" }\n : { day: \"Day\", less: \"less\", more: \"more\", moreIn: \"more in\", moreOut: \"more out\" };\n/** Explicit fields avoid the engine-dependent dateStyle pattern. */\nconst calendarDateParts = (locale: string) => {\n const formatter = new Intl.DateTimeFormat(locale, { weekday: \"long\", month: \"long\", day: \"numeric\", year: \"numeric\", timeZone: \"UTC\" });\n return (time: number) => Object.fromEntries(formatter.formatToParts(time).map((part) => [part.type, part.value]));\n};\nexport function calendarLayout(spec: CalendarHeatmapOptions, size = { width: spec.width ?? 480, height: spec.height ?? 280 }) {\n const seen = new Set<string>();\n const dates = spec.data\n .map(([date, value], index) => {\n if (seen.has(date)) throw new RangeError(\"Calendar dates must be unique.\");\n seen.add(date);\n const time = calendarDay(date);\n if (value !== null && !Number.isNaN(value) && !Number.isFinite(value)) throw new RangeError(\"Calendar values must be finite.\");\n return { date, value, index, time };\n })\n .sort((a, b) => a.time - b.time);\n if (dates.length && (dates.at(-1)!.time - dates[0]!.time) / DAY >= CALENDAR_MAX_DAYS)\n throw new RangeError(\"Calendar span must not exceed three years.\");\n const points = dates.filter((p): p is typeof p & { value: number } => p.value !== null && Number.isFinite(p.value));\n const weekStart = calendarWeekStart(spec.locale);\n const first = dates[0]?.time ?? 0;\n const monday = first - ((new Date(first).getUTCDay() - weekStart + 7) % 7) * DAY;\n const weeks = dates.length ? Math.floor((dates.at(-1)!.time - monday) / DAY / 7) + 1 : 0;\n const headerHeight = renderHeader(size.width, spec.title, spec.subtitle).height;\n // Seven square rows use the available panel height. Wider calendars scroll rather than flattening their cells.\n const cell = Math.max(14, Math.floor((size.height - headerHeight - 32 - 20 - 18) / 7)),\n gap = 3,\n left = 32;\n const width = Math.max(spec.displayWidth ?? size.width, left + weeks * (cell + gap) + 4);\n const top = 32 + renderHeader(width, spec.title, spec.subtitle).height;\n const min = Math.min(...points.map((p) => p.value), 0),\n max = Math.max(...points.map((p) => p.value), 0);\n const absMax = Math.max(-min, max);\n return {\n width,\n height: size.height,\n minWidth: width,\n firstMonday: monday,\n weekStart,\n weeks,\n min,\n max,\n absMax,\n cell,\n cellWidth: cell,\n top,\n cells: points.map((p) => {\n const day = Math.round((p.time - monday) / DAY),\n week = Math.floor(day / 7),\n weekday = day % 7;\n const intensity = spec.scale === \"diverging\" ? Math.abs(p.value) / (absMax || 1) : (p.value - min) / (max - min || 1);\n const color =\n spec.scale === \"diverging\"\n ? p.value < 0\n ? \"var(--k2b-flow-out-mark,#8b5cf6)\"\n : \"var(--k2b-flow-in-mark,#0891b2)\"\n : \"var(--stdlib-chart-c1,#3b82f6)\";\n return { ...p, week, weekday, x: left + week * (cell + gap), y: top + weekday * (cell + gap), intensity, color };\n }),\n };\n}\nconst paint = (color: string, intensity: number) =>\n `color-mix(in srgb,${color} ${12 + 88 * Math.sqrt(intensity)}%,var(--k2b-surface-muted,#f4f4f5))`;\nexport function renderCalendarSvg(spec: CalendarHeatmapOptions): string {\n const s = calendarLayout(spec),\n locale = spec.locale ?? \"en\",\n words = calendarWords(locale);\n const number = spec.format ?? new Intl.NumberFormat(locale, { maximumSignificantDigits: 15 }).format;\n const parts = calendarDateParts(locale);\n const weekday = new Intl.DateTimeFormat(locale, { weekday: \"short\", timeZone: \"UTC\" });\n const month = new Intl.DateTimeFormat(locale, { month: \"short\", timeZone: \"UTC\" });\n // Left aligned direct-core header; interactive hosts keep it at the visible scroll edge.\n const header = renderHeader(s.width, spec.title, spec.subtitle)\n .svg.replace(/x=\"[^\"]*\"/g, 'x=\"0\"')\n .replace(/text-anchor=\"middle\"/g, 'text-anchor=\"start\"')\n .replace(/<text /g, '<text fill=\"var(--k2b-text,#27272a)\" font-size=\"12\" ');\n const body: string[] = [`<g style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\">${header}</g>`];\n const days: string[] = [\n `<g data-calendar-weekdays=\"true\" pointer-events=\"none\" style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\"><rect x=\"-1\" y=\"${s.top - 18}\" width=\"33\" height=\"${7 * (s.cell + 3) + 18}\" fill=\"var(--k2b-surface,#fff)\"/>`,\n ];\n for (const day of [0, 2, 4])\n days.push(\n `<text x=\"0\" y=\"${s.top + day * (s.cell + 3) + s.cell - 2}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(weekday.format(Date.UTC(2026, 0, 4 + s.weekStart + day)))}</text>`,\n );\n let lastRight = -Infinity,\n lastMonth = \"\";\n for (let week = 0; week < s.weeks; week++) {\n const time = s.firstMonday + week * 7 * DAY,\n next = time + 6 * DAY;\n const nextDate = new Date(next),\n ym = nextDate.toISOString().slice(0, 7);\n if (ym === lastMonth) continue;\n lastMonth = ym;\n const text = month.format(next);\n const textWidth = chartTextWidth(text, 11);\n const x = Math.min(s.width - textWidth - 2, Math.max(32 + week * (s.cell + 3), lastRight + 3));\n const visibility = `visibility:var(--k2b-calendar-month-${week},visible)`;\n // The year has its own row, so a partial first month cannot suppress the following month.\n if (week === 0 || nextDate.getUTCMonth() === 0)\n body.push(\n `<g style=\"${visibility}\"><text x=\"${x}\" y=\"${s.top - 24}\" font-size=\"10\" fill=\"var(--k2b-text-muted,#45454e)\">${nextDate.getUTCFullYear()}</text></g>`,\n );\n body.push(\n `<text data-calendar-month=\"${week}\" style=\"${visibility}\" x=\"${x}\" y=\"${s.top - 10}\" font-size=\"11\" fill=\"var(--k2b-text-muted,#45454e)\">${escapeXml(text)}</text>`,\n );\n lastRight = x + textWidth;\n }\n for (const c of s.cells) {\n const d = parts(c.time);\n const date = locale.startsWith(\"de\")\n ? `${d.day}. ${d.month} ${d.year}`\n : /^en(?:-US)?$/.test(locale)\n ? `${d.month} ${d.day}, ${d.year}`\n : `${d.day} ${d.month} ${d.year}`;\n const fill = spec.scale === \"diverging\" && c.value === 0 ? \"var(--k2b-surface-muted,#f4f4f5)\" : paint(c.color, c.intensity);\n const value =\n spec.scale === \"diverging\" && c.value !== 0\n ? `${number(Math.abs(c.value))} ${c.value < 0 ? words.moreOut : words.moreIn}`\n : number(c.value);\n body.push(\n chartDatumSvg(\n `<rect x=\"${c.x}\" y=\"${c.y}\" width=\"${s.cell}\" height=\"${s.cell}\" rx=\"2\" fill=\"${fill}\" stroke=\"none\"/>`,\n {\n role: \"cell\",\n index: c.index,\n label: `${d.weekday}, ${date}`,\n anchor: [c.x + s.cell / 2, c.y + s.cell / 2],\n grid: [c.week, c.weekday],\n values: [{ key: \"value\", value: c.value, formatted: value }],\n },\n spec.inspect,\n ),\n );\n }\n days.push(\"</g>\");\n body.push(days.join(\"\"));\n const legendY = s.top + 7 * (s.cell + 3) + 12;\n const start = spec.scale === \"diverging\" ? words.moreOut : words.less,\n end = spec.scale === \"diverging\" ? words.moreIn : words.more;\n const swatches = spec.scale === \"diverging\" ? [-1, -0.5, 0, 0.5, 1] : [0, 0.25, 0.5, 0.75, 1];\n const offset = 32 + start.length * 6 + 8;\n body.push(\n `<g data-calendar-legend=\"true\" style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\"><text x=\"32\" y=\"${legendY}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(start)}</text>`,\n );\n swatches.forEach((v, i) => {\n const color =\n spec.scale === \"diverging\"\n ? v < 0\n ? \"var(--k2b-flow-out-mark,#8b5cf6)\"\n : \"var(--k2b-flow-in-mark,#0891b2)\"\n : \"var(--stdlib-chart-c1,#3b82f6)\";\n body.push(\n `<rect x=\"${offset + i * 14}\" y=\"${legendY - 10}\" width=\"11\" height=\"11\" rx=\"2\" fill=\"${spec.scale === \"diverging\" && v === 0 ? \"var(--k2b-surface-muted,#f4f4f5)\" : paint(color, Math.abs(v))}\"/>`,\n );\n });\n body.push(\n `<text x=\"${offset + swatches.length * 14 + 4}\" y=\"${legendY}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(end)}</text></g>`,\n );\n return svgRoot({ ...s, className: spec.className }, body.join(\"\")).replace(\n \"<svg \",\n `<svg data-calendar=\"true\" data-chart-min-width=\"${s.minWidth}\" `,\n );\n}\nexport const renderHeatmapSvg = (spec: HeatmapChartOptions): string =>\n spec.layout === \"calendar\" ? renderCalendarSvg(spec) : heatmap(spec);\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/calendar.ts"],"sourcesContent":["import { type ChartOptions, chartDatumSvg, escapeXml, type HeatmapOptions, heatmap, renderHeader, svgRoot } from \"./svg-renderers\";\nimport { chartTextWidth } from \"./text\";\nexport type CalendarHeatmapOptions = ChartOptions & {\n layout: \"calendar\";\n data: [string, number | null][];\n scale: \"sequential\" | \"diverging\";\n /** Unit shown beside each tooltip value. */\n label?: string;\n locale?: string;\n format?: (value: number) => string;\n displayWidth?: number;\n};\nexport type HeatmapChartOptions = (HeatmapOptions & { layout?: undefined }) | CalendarHeatmapOptions;\nconst DAY = 86400000;\n/** Bound sparse inputs too: three leap years of daily observations. */\nexport const CALENDAR_MAX_DAYS = 1098;\nexport function calendarDay(value: string): number {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) throw new RangeError(\"Calendar dates must be YYYY-MM-DD.\");\n const date = new Date(`${value}T00:00:00Z`);\n if (!Number.isFinite(date.getTime()) || date.toISOString().slice(0, 10) !== value) throw new RangeError(\"Invalid calendar date.\");\n return date.getTime();\n}\n/** Intl uses 1..7, JS dates use 0..6. Old engines use an explicit locale fallback. */\nexport function calendarWeekStart(locale = \"en\"): number {\n const info: Intl.Locale & { weekInfo?: { firstDay: number }; getWeekInfo?: () => { firstDay: number } } = new Intl.Locale(locale);\n const fallback: Record<string, number> = { \"en-US\": 0 };\n const key = `${info.language}-${info.region ?? info.maximize().region}`;\n return (info.getWeekInfo?.().firstDay ?? info.weekInfo?.firstDay ?? fallback[key] ?? 1) % 7;\n}\nexport const calendarWords = (locale = \"en\") =>\n locale.split(\"-\")[0] === \"de\"\n ? { day: \"Tag\", less: \"weniger\", more: \"mehr\", moreIn: \"mehr rein\", moreOut: \"mehr raus\" }\n : { day: \"Day\", less: \"less\", more: \"more\", moreIn: \"more in\", moreOut: \"more out\" };\n/** Explicit fields avoid the engine-dependent dateStyle pattern. */\nconst calendarDateParts = (locale: string) => {\n const formatter = new Intl.DateTimeFormat(locale, { weekday: \"long\", month: \"long\", day: \"numeric\", year: \"numeric\", timeZone: \"UTC\" });\n return (time: number) => Object.fromEntries(formatter.formatToParts(time).map((part) => [part.type, part.value]));\n};\nexport function calendarLayout(spec: CalendarHeatmapOptions, size = { width: spec.width ?? 480, height: spec.height ?? 280 }) {\n const seen = new Set<string>();\n const dates = spec.data\n .map(([date, value], index) => {\n if (seen.has(date)) throw new RangeError(\"Calendar dates must be unique.\");\n seen.add(date);\n const time = calendarDay(date);\n if (value !== null && !Number.isNaN(value) && !Number.isFinite(value)) throw new RangeError(\"Calendar values must be finite.\");\n return { date, value, index, time };\n })\n .sort((a, b) => a.time - b.time);\n if (dates.length && (dates.at(-1)!.time - dates[0]!.time) / DAY >= CALENDAR_MAX_DAYS)\n throw new RangeError(\"Calendar span must not exceed three years.\");\n const points = dates.filter((p): p is typeof p & { value: number } => p.value !== null && Number.isFinite(p.value));\n const weekStart = calendarWeekStart(spec.locale);\n const first = dates[0]?.time ?? 0;\n const monday = first - ((new Date(first).getUTCDay() - weekStart + 7) % 7) * DAY;\n const weeks = dates.length ? Math.floor((dates.at(-1)!.time - monday) / DAY / 7) + 1 : 0;\n const headerHeight = renderHeader(size.width, spec.title, spec.subtitle).height;\n // Seven square rows use the available panel height. Wider calendars scroll rather than flattening their cells.\n const cell = Math.max(14, Math.floor((size.height - headerHeight - 32 - 20 - 18) / 7)),\n gap = 3,\n left = 32;\n const width = Math.max(spec.displayWidth ?? size.width, left + weeks * (cell + gap) + 4);\n const top = 32 + renderHeader(width, spec.title, spec.subtitle).height;\n const min = Math.min(...points.map((p) => p.value), 0),\n max = Math.max(...points.map((p) => p.value), 0);\n const absMax = Math.max(-min, max);\n return {\n width,\n height: size.height,\n minWidth: width,\n firstMonday: monday,\n weekStart,\n weeks,\n min,\n max,\n absMax,\n cell,\n cellWidth: cell,\n top,\n cells: points.map((p) => {\n const day = Math.round((p.time - monday) / DAY),\n week = Math.floor(day / 7),\n weekday = day % 7;\n const intensity = spec.scale === \"diverging\" ? Math.abs(p.value) / (absMax || 1) : (p.value - min) / (max - min || 1);\n const color =\n spec.scale === \"diverging\"\n ? p.value < 0\n ? \"var(--k2b-flow-out-mark,#8b5cf6)\"\n : \"var(--k2b-flow-in-mark,#0891b2)\"\n : \"var(--stdlib-chart-c1,#3b82f6)\";\n return { ...p, week, weekday, x: left + week * (cell + gap), y: top + weekday * (cell + gap), intensity, color };\n }),\n };\n}\nconst paint = (color: string, intensity: number) =>\n `color-mix(in srgb,${color} ${12 + 88 * Math.sqrt(intensity)}%,var(--k2b-surface-muted,#f4f4f5))`;\nexport function renderCalendarSvg(spec: CalendarHeatmapOptions): string {\n const s = calendarLayout(spec),\n locale = spec.locale ?? \"en\",\n words = calendarWords(locale);\n const number = spec.format ?? new Intl.NumberFormat(locale, { maximumSignificantDigits: 15 }).format;\n const parts = calendarDateParts(locale);\n const weekday = new Intl.DateTimeFormat(locale, { weekday: \"short\", timeZone: \"UTC\" });\n const month = new Intl.DateTimeFormat(locale, { month: \"short\", timeZone: \"UTC\" });\n // Left aligned direct-core header; interactive hosts keep it at the visible scroll edge.\n const header = renderHeader(s.width, spec.title, spec.subtitle)\n .svg.replace(/x=\"[^\"]*\"/g, 'x=\"0\"')\n .replace(/text-anchor=\"middle\"/g, 'text-anchor=\"start\"')\n .replace(/<text /g, '<text fill=\"var(--k2b-text,#27272a)\" font-size=\"12\" ');\n const body: string[] = [`<g style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\">${header}</g>`];\n const days: string[] = [\n `<g data-calendar-weekdays=\"true\" pointer-events=\"none\" style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\"><rect x=\"-1\" y=\"${s.top - 18}\" width=\"33\" height=\"${7 * (s.cell + 3) + 18}\" fill=\"var(--k2b-surface,#fff)\"/>`,\n ];\n for (const day of [0, 2, 4])\n days.push(\n `<text x=\"0\" y=\"${s.top + day * (s.cell + 3) + s.cell - 2}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(weekday.format(Date.UTC(2026, 0, 4 + s.weekStart + day)))}</text>`,\n );\n let lastRight = -Infinity,\n lastMonth = \"\";\n for (let week = 0; week < s.weeks; week++) {\n const time = s.firstMonday + week * 7 * DAY,\n next = time + 6 * DAY;\n const nextDate = new Date(next),\n ym = nextDate.toISOString().slice(0, 7);\n if (ym === lastMonth) continue;\n lastMonth = ym;\n const text = month.format(next);\n const textWidth = chartTextWidth(text, 11);\n const x = Math.min(s.width - textWidth - 2, Math.max(32 + week * (s.cell + 3), lastRight + 3));\n const visibility = `visibility:var(--k2b-calendar-month-${week},visible)`;\n // The year has its own row, so a partial first month cannot suppress the following month.\n if (week === 0 || nextDate.getUTCMonth() === 0)\n body.push(\n `<g style=\"${visibility}\"><text x=\"${x}\" y=\"${s.top - 24}\" font-size=\"10\" fill=\"var(--k2b-text-muted,#45454e)\">${nextDate.getUTCFullYear()}</text></g>`,\n );\n body.push(\n `<text data-calendar-month=\"${week}\" style=\"${visibility}\" x=\"${x}\" y=\"${s.top - 10}\" font-size=\"11\" fill=\"var(--k2b-text-muted,#45454e)\">${escapeXml(text)}</text>`,\n );\n lastRight = x + textWidth;\n }\n for (const c of s.cells) {\n const d = parts(c.time);\n const date = locale.startsWith(\"de\")\n ? `${d.day}. ${d.month} ${d.year}`\n : /^en(?:-US)?$/.test(locale)\n ? `${d.month} ${d.day}, ${d.year}`\n : `${d.day} ${d.month} ${d.year}`;\n const fill = spec.scale === \"diverging\" && c.value === 0 ? \"var(--k2b-surface-muted,#f4f4f5)\" : paint(c.color, c.intensity);\n const value =\n spec.scale === \"diverging\" && c.value !== 0\n ? `${number(Math.abs(c.value))} ${c.value < 0 ? words.moreOut : words.moreIn}`\n : number(c.value);\n body.push(\n chartDatumSvg(\n `<rect x=\"${c.x}\" y=\"${c.y}\" width=\"${s.cell}\" height=\"${s.cell}\" rx=\"2\" fill=\"${fill}\" stroke=\"none\"/>`,\n {\n role: \"cell\",\n index: c.index,\n label: `${d.weekday}, ${date}`,\n anchor: [c.x + s.cell / 2, c.y + s.cell / 2],\n grid: [c.week, c.weekday],\n values: [{ key: \"value\", value: c.value, formatted: value }],\n },\n spec.inspect,\n ),\n );\n }\n days.push(\"</g>\");\n body.push(days.join(\"\"));\n const legendY = s.top + 7 * (s.cell + 3) + 12;\n const start = spec.scale === \"diverging\" ? words.moreOut : words.less,\n end = spec.scale === \"diverging\" ? words.moreIn : words.more;\n const swatches = spec.scale === \"diverging\" ? [-1, -0.5, 0, 0.5, 1] : [0, 0.25, 0.5, 0.75, 1];\n const offset = 32 + start.length * 6 + 8;\n body.push(\n `<g data-calendar-legend=\"true\" style=\"transform:translateX(var(--k2b-calendar-header-x,0px))\"><text x=\"32\" y=\"${legendY}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(start)}</text>`,\n );\n swatches.forEach((v, i) => {\n const color =\n spec.scale === \"diverging\"\n ? v < 0\n ? \"var(--k2b-flow-out-mark,#8b5cf6)\"\n : \"var(--k2b-flow-in-mark,#0891b2)\"\n : \"var(--stdlib-chart-c1,#3b82f6)\";\n body.push(\n `<rect x=\"${offset + i * 14}\" y=\"${legendY - 10}\" width=\"11\" height=\"11\" rx=\"2\" fill=\"${spec.scale === \"diverging\" && v === 0 ? \"var(--k2b-surface-muted,#f4f4f5)\" : paint(color, Math.abs(v))}\"/>`,\n );\n });\n body.push(\n `<text x=\"${offset + swatches.length * 14 + 4}\" y=\"${legendY}\" fill=\"var(--k2b-text-muted,#45454e)\" font-size=\"11\">${escapeXml(end)}</text></g>`,\n );\n return svgRoot({ ...s, className: spec.className }, body.join(\"\")).replace(\n \"<svg \",\n `<svg data-calendar=\"true\" data-chart-min-width=\"${s.minWidth}\" `,\n );\n}\nexport const renderHeatmapSvg = (spec: HeatmapChartOptions): string =>\n spec.layout === \"calendar\" ? renderCalendarSvg(spec) : heatmap(spec);\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { i18n } from "@k2b/stdlib";
|
|
2
|
+
|
|
3
|
+
/** Labels needed by pure SVG renderers; UI inspection messages stay with the UI host. */
|
|
4
|
+
export const coreChartMessages = i18n.define({
|
|
5
|
+
baseLocale: "en",
|
|
6
|
+
messages: {
|
|
7
|
+
en: {
|
|
8
|
+
series: "Series",
|
|
9
|
+
areaTotal: "Total"
|
|
10
|
+
},
|
|
11
|
+
de: {
|
|
12
|
+
series: "Datenreihe",
|
|
13
|
+
areaTotal: "Zusammen"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=chart-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/chart-messages.ts"],"sourcesContent":["import { i18n } from \"@k2b/stdlib\";\n\n/** Labels needed by pure SVG renderers; UI inspection messages stay with the UI host. */\nexport const coreChartMessages = i18n.define({\n baseLocale: \"en\",\n messages: {\n en: { series: \"Series\", areaTotal: \"Total\" },\n de: { series: \"Datenreihe\", areaTotal: \"Zusammen\" },\n },\n});\n"],"mappings":"AAAA,SAAS,IAAI,QAAQ,aAAa;;AAElC;AACA,OAAO,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;EAC3C,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE;IACR,EAAE,EAAE;MAAE,MAAM,EAAE,QAAQ;MAAE,SAAS,EAAE;IAAQ,CAAC;IAC5C,EAAE,EAAE;MAAE,MAAM,EAAE,YAAY;MAAE,SAAS,EAAE;IAAW;EACpD;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// CSS rule order is significant. Series-N rules emit first so shape-specific
|
|
2
|
+
// rules below can override (e.g. line's `fill: none` beats series fill, and
|
|
3
|
+
// slice/point's `stroke: white` beats series stroke).
|
|
4
|
+
export const DEFAULT_STYLES = `
|
|
5
|
+
/* font-family is intentionally not set here so the chart inherits the app's
|
|
6
|
+
font from its surrounding HTML context. For standalone SVG usage, set
|
|
7
|
+
font-family on a wrapping element or override .stdlib-chart in your CSS. */
|
|
8
|
+
.stdlib-chart {
|
|
9
|
+
color: #1f2937;
|
|
10
|
+
--stdlib-chart-c1: #3b82f6; --stdlib-chart-c2: #10b981;
|
|
11
|
+
--stdlib-chart-c3: #f59e0b; --stdlib-chart-c4: #ef4444;
|
|
12
|
+
--stdlib-chart-c5: #8b5cf6; --stdlib-chart-c6: #ec4899;
|
|
13
|
+
--stdlib-chart-c7: #14b8a6; --stdlib-chart-c8: #f97316;
|
|
14
|
+
}
|
|
15
|
+
.stdlib-chart-series-0 { fill: var(--stdlib-chart-c1); stroke: var(--stdlib-chart-c1); }
|
|
16
|
+
.stdlib-chart-series-1 { fill: var(--stdlib-chart-c2); stroke: var(--stdlib-chart-c2); }
|
|
17
|
+
.stdlib-chart-series-2 { fill: var(--stdlib-chart-c3); stroke: var(--stdlib-chart-c3); }
|
|
18
|
+
.stdlib-chart-series-3 { fill: var(--stdlib-chart-c4); stroke: var(--stdlib-chart-c4); }
|
|
19
|
+
.stdlib-chart-series-4 { fill: var(--stdlib-chart-c5); stroke: var(--stdlib-chart-c5); }
|
|
20
|
+
.stdlib-chart-series-5 { fill: var(--stdlib-chart-c6); stroke: var(--stdlib-chart-c6); }
|
|
21
|
+
.stdlib-chart-series-6 { fill: var(--stdlib-chart-c7); stroke: var(--stdlib-chart-c7); }
|
|
22
|
+
.stdlib-chart-series-7 { fill: var(--stdlib-chart-c8); stroke: var(--stdlib-chart-c8); }
|
|
23
|
+
.stdlib-chart-axis { stroke: currentColor; opacity: 0.4; fill: none; }
|
|
24
|
+
.stdlib-chart-tick-label { font-size: 10px; fill: currentColor; opacity: 0.6; }
|
|
25
|
+
.stdlib-chart-axis-label { font-size: 11px; fill: currentColor; opacity: 0.85; }
|
|
26
|
+
.stdlib-chart-grid { stroke: currentColor; opacity: 0.08; stroke-dasharray: 2 2; fill: none; }
|
|
27
|
+
.stdlib-chart-title { font-size: 14px; font-weight: 600; fill: currentColor; }
|
|
28
|
+
.stdlib-chart-subtitle { font-size: 11px; fill: currentColor; opacity: 0.7; }
|
|
29
|
+
.stdlib-chart-reference { stroke: currentColor; opacity: 0.5; stroke-dasharray: 4 4; fill: none; }
|
|
30
|
+
.stdlib-chart-reference-label { font-size: 10px; fill: currentColor; opacity: 0.7; }
|
|
31
|
+
.stdlib-chart-line { fill: none; stroke-width: 2; }
|
|
32
|
+
.stdlib-chart-area { fill-opacity: 0.18; stroke: none; }
|
|
33
|
+
.stdlib-chart-sparkline { fill: none; stroke-width: 1.5; stroke: currentColor; }
|
|
34
|
+
.stdlib-chart-sparkline-area { stroke: none; }
|
|
35
|
+
.stdlib-chart-sparkline-last { fill: currentColor; stroke: none; }
|
|
36
|
+
.stdlib-chart-sparkline-max { fill: #10b981; stroke: none; }
|
|
37
|
+
.stdlib-chart-sparkline-min { fill: #ef4444; stroke: none; }
|
|
38
|
+
.stdlib-chart-point { stroke: white; stroke-width: 1.5; }
|
|
39
|
+
.stdlib-chart-slice { stroke: white; stroke-width: 2; stroke-linejoin: round; }
|
|
40
|
+
.stdlib-chart-label { font-size: 11px; fill: currentColor; }
|
|
41
|
+
.stdlib-chart-bar-value { font-size: 10px; fill: currentColor; opacity: 0.8; }
|
|
42
|
+
.stdlib-chart-errorbar { stroke: currentColor; opacity: 0.55; fill: none; stroke-width: 1; }
|
|
43
|
+
.stdlib-chart-error-band { fill-opacity: 0.15; stroke: none; }
|
|
44
|
+
.stdlib-chart-trendline { stroke: currentColor; opacity: 0.55; stroke-width: 1.5; fill: none; stroke-dasharray: 5 4; }
|
|
45
|
+
.stdlib-chart-minor-tick { stroke: currentColor; opacity: 0.25; }
|
|
46
|
+
.stdlib-chart-box { fill-opacity: 0.4; stroke-width: 1; }
|
|
47
|
+
.stdlib-chart-box-median { stroke: currentColor; stroke-width: 1.5; fill: none; }
|
|
48
|
+
.stdlib-chart-box-whisker { stroke: currentColor; opacity: 0.6; fill: none; }
|
|
49
|
+
.stdlib-chart-box-cap { stroke: currentColor; opacity: 0.6; fill: none; }
|
|
50
|
+
.stdlib-chart-box-outlier { fill: currentColor; opacity: 0.5; stroke: white; stroke-width: 1; }
|
|
51
|
+
.stdlib-chart-legend-swatch { stroke: none; }
|
|
52
|
+
.stdlib-chart-legend-label { font-size: 11px; font-weight: 400; fill: currentColor; stroke: none; }
|
|
53
|
+
.stdlib-chart-empty-text { font-size: 11px; fill: currentColor; opacity: 0.5; }
|
|
54
|
+
.stdlib-chart-gauge-track { stroke: currentColor; stroke-width: 10; opacity: 0.12; fill: none; stroke-linecap: round; }
|
|
55
|
+
.stdlib-chart-gauge-fill { stroke-width: 10; fill: none; stroke-linecap: round; }
|
|
56
|
+
.stdlib-chart-gauge-gradient-segment { stroke-width: 10; fill: none; stroke-linecap: butt; }
|
|
57
|
+
.stdlib-chart-gauge-gradient-scale { opacity: 0.22; }
|
|
58
|
+
.stdlib-chart-gauge-needle { stroke-width: 2; fill: none; stroke-linecap: round; }
|
|
59
|
+
.stdlib-chart-gauge-hub { fill: currentColor; stroke: none; }
|
|
60
|
+
.stdlib-chart-gauge-value { font-size: 28px; font-weight: 700; fill: currentColor; }
|
|
61
|
+
.stdlib-chart-gauge-label { font-size: 12px; fill: currentColor; opacity: 0.72; }
|
|
62
|
+
.stdlib-chart-gauge-unit { font-size: 11px; fill: currentColor; opacity: 0.6; }
|
|
63
|
+
.stdlib-chart-bar-gauge-track { fill: currentColor; opacity: 0.1; }
|
|
64
|
+
.stdlib-chart-bar-gauge-fill { stroke: none; }
|
|
65
|
+
.stdlib-chart-bar-gauge-label { font-size: 11px; fill: currentColor; opacity: 0.75; }
|
|
66
|
+
.stdlib-chart-bar-gauge-value { font-size: 11px; font-weight: 600; fill: currentColor; }
|
|
67
|
+
.stdlib-chart-stat-label { font-size: 12px; fill: currentColor; opacity: 0.72; }
|
|
68
|
+
.stdlib-chart-stat-value { font-size: 30px; font-weight: 700; fill: currentColor; }
|
|
69
|
+
.stdlib-chart-stat-unit { font-size: 14px; font-weight: 600; fill: currentColor; opacity: 0.72; }
|
|
70
|
+
.stdlib-chart-stat-delta { font-size: 12px; font-weight: 600; fill: currentColor; opacity: 0.72; }
|
|
71
|
+
.stdlib-chart-stat-delta-up { fill: #10b981; opacity: 1; }
|
|
72
|
+
.stdlib-chart-stat-delta-down { fill: #ef4444; opacity: 1; }
|
|
73
|
+
.stdlib-chart-stat-sparkline { fill: none; stroke: currentColor; stroke-width: 1.6; opacity: 0.86; }
|
|
74
|
+
.stdlib-chart-stat-sparkline-area { stroke: none; opacity: 0.18; }
|
|
75
|
+
.stdlib-chart-heatmap-cell { stroke: white; stroke-width: 1; }
|
|
76
|
+
.stdlib-chart-heatmap-label { font-size: 10px; fill: currentColor; opacity: 0.68; }
|
|
77
|
+
.stdlib-chart-map-land { fill: currentColor; opacity: var(--stdlib-chart-map-land-opacity, 0.12); stroke: currentColor; stroke-width: 0.5; stroke-linejoin: round; }
|
|
78
|
+
.stdlib-chart-map-point { stroke: var(--stdlib-chart-map-point-stroke, white); stroke-width: 1.5; }
|
|
79
|
+
.stdlib-chart-map-empty { font-size: 11px; fill: currentColor; opacity: 0.55; }
|
|
80
|
+
.stdlib-chart-state-region { stroke: white; stroke-width: 1; }
|
|
81
|
+
.stdlib-chart-state-label { font-size: 11px; fill: currentColor; opacity: 0.75; }
|
|
82
|
+
`.trim();
|
|
83
|
+
//# sourceMappingURL=default-styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/default-styles.ts"],"sourcesContent":["// CSS rule order is significant. Series-N rules emit first so shape-specific\n// rules below can override (e.g. line's `fill: none` beats series fill, and\n// slice/point's `stroke: white` beats series stroke).\nexport const DEFAULT_STYLES = `\n/* font-family is intentionally not set here so the chart inherits the app's\n font from its surrounding HTML context. For standalone SVG usage, set\n font-family on a wrapping element or override .stdlib-chart in your CSS. */\n.stdlib-chart {\n color: #1f2937;\n --stdlib-chart-c1: #3b82f6; --stdlib-chart-c2: #10b981;\n --stdlib-chart-c3: #f59e0b; --stdlib-chart-c4: #ef4444;\n --stdlib-chart-c5: #8b5cf6; --stdlib-chart-c6: #ec4899;\n --stdlib-chart-c7: #14b8a6; --stdlib-chart-c8: #f97316;\n}\n.stdlib-chart-series-0 { fill: var(--stdlib-chart-c1); stroke: var(--stdlib-chart-c1); }\n.stdlib-chart-series-1 { fill: var(--stdlib-chart-c2); stroke: var(--stdlib-chart-c2); }\n.stdlib-chart-series-2 { fill: var(--stdlib-chart-c3); stroke: var(--stdlib-chart-c3); }\n.stdlib-chart-series-3 { fill: var(--stdlib-chart-c4); stroke: var(--stdlib-chart-c4); }\n.stdlib-chart-series-4 { fill: var(--stdlib-chart-c5); stroke: var(--stdlib-chart-c5); }\n.stdlib-chart-series-5 { fill: var(--stdlib-chart-c6); stroke: var(--stdlib-chart-c6); }\n.stdlib-chart-series-6 { fill: var(--stdlib-chart-c7); stroke: var(--stdlib-chart-c7); }\n.stdlib-chart-series-7 { fill: var(--stdlib-chart-c8); stroke: var(--stdlib-chart-c8); }\n.stdlib-chart-axis { stroke: currentColor; opacity: 0.4; fill: none; }\n.stdlib-chart-tick-label { font-size: 10px; fill: currentColor; opacity: 0.6; }\n.stdlib-chart-axis-label { font-size: 11px; fill: currentColor; opacity: 0.85; }\n.stdlib-chart-grid { stroke: currentColor; opacity: 0.08; stroke-dasharray: 2 2; fill: none; }\n.stdlib-chart-title { font-size: 14px; font-weight: 600; fill: currentColor; }\n.stdlib-chart-subtitle { font-size: 11px; fill: currentColor; opacity: 0.7; }\n.stdlib-chart-reference { stroke: currentColor; opacity: 0.5; stroke-dasharray: 4 4; fill: none; }\n.stdlib-chart-reference-label { font-size: 10px; fill: currentColor; opacity: 0.7; }\n.stdlib-chart-line { fill: none; stroke-width: 2; }\n.stdlib-chart-area { fill-opacity: 0.18; stroke: none; }\n.stdlib-chart-sparkline { fill: none; stroke-width: 1.5; stroke: currentColor; }\n.stdlib-chart-sparkline-area { stroke: none; }\n.stdlib-chart-sparkline-last { fill: currentColor; stroke: none; }\n.stdlib-chart-sparkline-max { fill: #10b981; stroke: none; }\n.stdlib-chart-sparkline-min { fill: #ef4444; stroke: none; }\n.stdlib-chart-point { stroke: white; stroke-width: 1.5; }\n.stdlib-chart-slice { stroke: white; stroke-width: 2; stroke-linejoin: round; }\n.stdlib-chart-label { font-size: 11px; fill: currentColor; }\n.stdlib-chart-bar-value { font-size: 10px; fill: currentColor; opacity: 0.8; }\n.stdlib-chart-errorbar { stroke: currentColor; opacity: 0.55; fill: none; stroke-width: 1; }\n.stdlib-chart-error-band { fill-opacity: 0.15; stroke: none; }\n.stdlib-chart-trendline { stroke: currentColor; opacity: 0.55; stroke-width: 1.5; fill: none; stroke-dasharray: 5 4; }\n.stdlib-chart-minor-tick { stroke: currentColor; opacity: 0.25; }\n.stdlib-chart-box { fill-opacity: 0.4; stroke-width: 1; }\n.stdlib-chart-box-median { stroke: currentColor; stroke-width: 1.5; fill: none; }\n.stdlib-chart-box-whisker { stroke: currentColor; opacity: 0.6; fill: none; }\n.stdlib-chart-box-cap { stroke: currentColor; opacity: 0.6; fill: none; }\n.stdlib-chart-box-outlier { fill: currentColor; opacity: 0.5; stroke: white; stroke-width: 1; }\n.stdlib-chart-legend-swatch { stroke: none; }\n.stdlib-chart-legend-label { font-size: 11px; font-weight: 400; fill: currentColor; stroke: none; }\n.stdlib-chart-empty-text { font-size: 11px; fill: currentColor; opacity: 0.5; }\n.stdlib-chart-gauge-track { stroke: currentColor; stroke-width: 10; opacity: 0.12; fill: none; stroke-linecap: round; }\n.stdlib-chart-gauge-fill { stroke-width: 10; fill: none; stroke-linecap: round; }\n.stdlib-chart-gauge-gradient-segment { stroke-width: 10; fill: none; stroke-linecap: butt; }\n.stdlib-chart-gauge-gradient-scale { opacity: 0.22; }\n.stdlib-chart-gauge-needle { stroke-width: 2; fill: none; stroke-linecap: round; }\n.stdlib-chart-gauge-hub { fill: currentColor; stroke: none; }\n.stdlib-chart-gauge-value { font-size: 28px; font-weight: 700; fill: currentColor; }\n.stdlib-chart-gauge-label { font-size: 12px; fill: currentColor; opacity: 0.72; }\n.stdlib-chart-gauge-unit { font-size: 11px; fill: currentColor; opacity: 0.6; }\n.stdlib-chart-bar-gauge-track { fill: currentColor; opacity: 0.1; }\n.stdlib-chart-bar-gauge-fill { stroke: none; }\n.stdlib-chart-bar-gauge-label { font-size: 11px; fill: currentColor; opacity: 0.75; }\n.stdlib-chart-bar-gauge-value { font-size: 11px; font-weight: 600; fill: currentColor; }\n.stdlib-chart-stat-label { font-size: 12px; fill: currentColor; opacity: 0.72; }\n.stdlib-chart-stat-value { font-size: 30px; font-weight: 700; fill: currentColor; }\n.stdlib-chart-stat-unit { font-size: 14px; font-weight: 600; fill: currentColor; opacity: 0.72; }\n.stdlib-chart-stat-delta { font-size: 12px; font-weight: 600; fill: currentColor; opacity: 0.72; }\n.stdlib-chart-stat-delta-up { fill: #10b981; opacity: 1; }\n.stdlib-chart-stat-delta-down { fill: #ef4444; opacity: 1; }\n.stdlib-chart-stat-sparkline { fill: none; stroke: currentColor; stroke-width: 1.6; opacity: 0.86; }\n.stdlib-chart-stat-sparkline-area { stroke: none; opacity: 0.18; }\n.stdlib-chart-heatmap-cell { stroke: white; stroke-width: 1; }\n.stdlib-chart-heatmap-label { font-size: 10px; fill: currentColor; opacity: 0.68; }\n.stdlib-chart-map-land { fill: currentColor; opacity: var(--stdlib-chart-map-land-opacity, 0.12); stroke: currentColor; stroke-width: 0.5; stroke-linejoin: round; }\n.stdlib-chart-map-point { stroke: var(--stdlib-chart-map-point-stroke, white); stroke-width: 1.5; }\n.stdlib-chart-map-empty { font-size: 11px; fill: currentColor; opacity: 0.55; }\n.stdlib-chart-state-region { stroke: white; stroke-width: 1; }\n.stdlib-chart-state-label { font-size: 11px; fill: currentColor; opacity: 0.75; }\n`.trim();\n"],"mappings":"AAAA;AACA;AACA;AACA,OAAO,MAAM,cAAc,GAAG;AAC9B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC,IAAI,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { chartTextWidth, headerHeight, wrapLabel } from "../../content/chart-bar";
|
|
2
|
+
import { chartMessages } from "../../content/chart-message-catalog";
|
|
3
|
+
import { barPercent } from "./bar-labels";
|
|
4
|
+
/** Ratios use the original start/previous observation. Geometry fits the largest observed step, including rises. */
|
|
5
|
+
export function funnelLayout(spec, size = {
|
|
6
|
+
width: 480,
|
|
7
|
+
height: 280
|
|
8
|
+
}) {
|
|
9
|
+
if (spec.data.some(d => d.value !== null && (!Number.isFinite(d.value) || d.value < 0))) throw new RangeError("Funnel values must be finite and nonnegative, or null");
|
|
10
|
+
const unit = size.width / 296;
|
|
11
|
+
const numbers = new Intl.NumberFormat(spec.locale ?? "en");
|
|
12
|
+
const format = spec.valueFormat ?? (v => numbers.format(v));
|
|
13
|
+
const labels = chartMessages.resolve([spec.locale ?? "en"]).t;
|
|
14
|
+
const percent = barPercent(spec.locale);
|
|
15
|
+
const share = (value, denominator) => value === null || denominator == null || denominator === 0 ? null : value / denominator;
|
|
16
|
+
const left = Math.min(96 * unit, size.width * 0.3);
|
|
17
|
+
const right = Math.max(104 * unit, ...spec.data.map(d => d.value === null ? 0 : (chartTextWidth(format(d.value)) + 8) * unit));
|
|
18
|
+
const plot = Math.max(0, size.width - left - right - 8);
|
|
19
|
+
const center = left + plot / 2;
|
|
20
|
+
const top = headerHeight(spec);
|
|
21
|
+
const pitch = (size.height - top) / Math.max(1, spec.data.length);
|
|
22
|
+
const height = Math.min(pitch * 0.6, 34);
|
|
23
|
+
const max = Math.max(0, ...spec.data.map(d => d.value ?? 0));
|
|
24
|
+
const steps = spec.data.map((d, index) => {
|
|
25
|
+
const startShare = share(d.value, spec.data[0]?.value);
|
|
26
|
+
const previousShare = index ? share(d.value, spec.data[index - 1]?.value) : null;
|
|
27
|
+
const y = top + index * pitch + (pitch - height) / 2;
|
|
28
|
+
const fields = [{
|
|
29
|
+
key: "value",
|
|
30
|
+
value: d.value ?? "–",
|
|
31
|
+
formatted: d.value === null ? "–" : format(d.value)
|
|
32
|
+
}, {
|
|
33
|
+
key: "startPercent",
|
|
34
|
+
value: startShare === null ? "–" : startShare * 100,
|
|
35
|
+
formatted: startShare === null ? "–" : percent.format(startShare)
|
|
36
|
+
}, ...(index ? [{
|
|
37
|
+
key: "previousPercent",
|
|
38
|
+
value: previousShare === null ? "–" : previousShare * 100,
|
|
39
|
+
formatted: previousShare === null ? "–" : percent.format(previousShare)
|
|
40
|
+
}] : [])];
|
|
41
|
+
const datum = {
|
|
42
|
+
role: "item",
|
|
43
|
+
index,
|
|
44
|
+
label: d.label,
|
|
45
|
+
anchor: [center, y],
|
|
46
|
+
values: fields
|
|
47
|
+
};
|
|
48
|
+
return {
|
|
49
|
+
...d,
|
|
50
|
+
index,
|
|
51
|
+
center,
|
|
52
|
+
y,
|
|
53
|
+
width: d.value === null || max === 0 ? 0 : d.value / max * plot,
|
|
54
|
+
startShare,
|
|
55
|
+
previousShare,
|
|
56
|
+
datum,
|
|
57
|
+
labelLines: wrapLabel(d.label, (left / unit - 8) * 11 / 12.5, 2).lines,
|
|
58
|
+
valueText: fields[0].formatted,
|
|
59
|
+
shareText: `${fields[1].formatted} ${labels.chartBarStart}`,
|
|
60
|
+
title: `${d.label} · ${fields[0].formatted} · ${labels.chartFields({
|
|
61
|
+
key: "startPercent"
|
|
62
|
+
})}: ${fields[1].formatted}${index ? ` · ${labels.chartFields({
|
|
63
|
+
key: "previousPercent"
|
|
64
|
+
})}: ${fields[2].formatted}` : ""}`
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
return {
|
|
68
|
+
...size,
|
|
69
|
+
unit,
|
|
70
|
+
left,
|
|
71
|
+
right,
|
|
72
|
+
center,
|
|
73
|
+
top,
|
|
74
|
+
pitch,
|
|
75
|
+
barHeight: height,
|
|
76
|
+
steps
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=funnel-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/funnel-layout.ts"],"sourcesContent":["import { chartTextWidth, headerHeight, wrapLabel } from \"../../content/chart-bar\";\nimport { chartMessages } from \"../../content/chart-message-catalog\";\nimport { barPercent } from \"./bar-labels\";\nimport type { ChartDatum } from \"./types\";\n\nexport type FunnelOptions = {\n data: { label: string; value: number | null }[];\n valueFormat?: (value: number) => string;\n locale?: string;\n title?: string;\n subtitle?: string;\n className?: string;\n};\n\n/** Ratios use the original start/previous observation. Geometry fits the largest observed step, including rises. */\nexport function funnelLayout(spec: FunnelOptions, size = { width: 480, height: 280 }) {\n if (spec.data.some((d) => d.value !== null && (!Number.isFinite(d.value) || d.value < 0)))\n throw new RangeError(\"Funnel values must be finite and nonnegative, or null\");\n const unit = size.width / 296;\n const numbers = new Intl.NumberFormat(spec.locale ?? \"en\");\n const format = spec.valueFormat ?? ((v: number) => numbers.format(v));\n const labels = chartMessages.resolve([spec.locale ?? \"en\"]).t;\n const percent = barPercent(spec.locale);\n const share = (value: number | null, denominator: number | null | undefined) =>\n value === null || denominator == null || denominator === 0 ? null : value / denominator;\n const left = Math.min(96 * unit, size.width * 0.3);\n const right = Math.max(104 * unit, ...spec.data.map((d) => (d.value === null ? 0 : (chartTextWidth(format(d.value)) + 8) * unit)));\n const plot = Math.max(0, size.width - left - right - 8);\n const center = left + plot / 2;\n const top = headerHeight(spec);\n const pitch = (size.height - top) / Math.max(1, spec.data.length);\n const height = Math.min(pitch * 0.6, 34);\n const max = Math.max(0, ...spec.data.map((d) => d.value ?? 0));\n const steps = spec.data.map((d, index) => {\n const startShare = share(d.value, spec.data[0]?.value);\n const previousShare = index ? share(d.value, spec.data[index - 1]?.value) : null;\n const y = top + index * pitch + (pitch - height) / 2;\n const fields = [\n { key: \"value\", value: d.value ?? \"–\", formatted: d.value === null ? \"–\" : format(d.value) },\n {\n key: \"startPercent\",\n value: startShare === null ? \"–\" : startShare * 100,\n formatted: startShare === null ? \"–\" : percent.format(startShare),\n },\n ...(index\n ? [\n {\n key: \"previousPercent\",\n value: previousShare === null ? \"–\" : previousShare * 100,\n formatted: previousShare === null ? \"–\" : percent.format(previousShare),\n },\n ]\n : []),\n ];\n const datum: ChartDatum = { role: \"item\", index, label: d.label, anchor: [center, y], values: fields };\n return {\n ...d,\n index,\n center,\n y,\n width: d.value === null || max === 0 ? 0 : (d.value / max) * plot,\n startShare,\n previousShare,\n datum,\n labelLines: wrapLabel(d.label, ((left / unit - 8) * 11) / 12.5, 2).lines,\n valueText: fields[0]!.formatted,\n shareText: `${fields[1]!.formatted} ${labels.chartBarStart}`,\n title: `${d.label} · ${fields[0]!.formatted} · ${labels.chartFields({ key: \"startPercent\" })}: ${fields[1]!.formatted}${index ? ` · ${labels.chartFields({ key: \"previousPercent\" })}: ${fields[2]!.formatted}` : \"\"}`,\n };\n });\n return { ...size, unit, left, right, center, top, pitch, barHeight: height, steps };\n}\n\nexport type FunnelLayout = ReturnType<typeof funnelLayout>;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { funnelLayout } from "./funnel-layout";
|
|
2
|
+
import { chartDatumSvg, escapeXml, renderHeader, svgRoot } from "./svg-renderers";
|
|
3
|
+
export { funnelLayout } from "./funnel-layout";
|
|
4
|
+
export function renderFunnelSvg(spec) {
|
|
5
|
+
return renderFunnelLayoutSvg(spec, funnelLayout(spec, spec));
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/** Draw the same geometry reserved before a lazy host loads its renderer. */
|
|
9
|
+
export function renderFunnelLayoutSvg(spec, g) {
|
|
10
|
+
const text = (x, y, value, anchor = "start", cls = "stdlib-chart-tick-label") => `<text class="${cls}" x="${x}" y="${y}" text-anchor="${anchor}">${escapeXml(value)}</text>`;
|
|
11
|
+
const parts = [renderHeader(spec.width, spec.title, spec.subtitle).svg];
|
|
12
|
+
for (const step of g.steps) {
|
|
13
|
+
const next = g.steps[step.index + 1];
|
|
14
|
+
if (next && step.value !== null && next.value !== null) parts.push(`<polygon points="${g.center - step.width / 2},${step.y + g.barHeight} ${g.center + step.width / 2},${step.y + g.barHeight} ${g.center + next.width / 2},${next.y} ${g.center - next.width / 2},${next.y}" style="fill:var(--stdlib-chart-c1,#3b82f6);fill-opacity:.09"/>`);
|
|
15
|
+
const marks = `<rect class="k2b-chart-category-band" fill="none" pointer-events="all" x="0" y="${g.top + step.index * g.pitch}" width="${g.width}" height="${g.pitch}" rx="6"/>${step.value === null ? "" : `<rect class="stdlib-chart-bar" x="${g.center - step.width / 2}" y="${step.y}" width="${step.width}" height="${g.barHeight}" rx="3" style="fill:var(--stdlib-chart-c1,#3b82f6);fill-opacity:${Math.max(0.3, 1 - step.index * 0.14)}" stroke="none" stroke-width="0"/>`}`;
|
|
16
|
+
parts.push(chartDatumSvg(marks, step.datum, spec.inspect ?? false, step.title));
|
|
17
|
+
const lines = step.labelLines;
|
|
18
|
+
lines.forEach((line, i) => parts.push(text(0, step.y + g.barHeight / 2 + 4 + (lines.length > 1 ? i === 0 ? -6.5 : 6.5 : 0), line)));
|
|
19
|
+
parts.push(text(g.width, step.y + g.barHeight / 2 + (step.index ? -2 : 4), step.valueText, "end", "stdlib-chart-bar-value"));
|
|
20
|
+
if (step.index) parts.push(text(g.width, step.y + g.barHeight / 2 + 12, step.shareText, "end"));
|
|
21
|
+
}
|
|
22
|
+
return svgRoot({
|
|
23
|
+
...spec,
|
|
24
|
+
className: [spec.className, "k2b-chart-funnel"].filter(Boolean).join(" ")
|
|
25
|
+
}, parts.join("")).replace("</style>", ".k2b-chart-funnel :is(.stdlib-chart-tick-label,.stdlib-chart-bar-value){font-size:12.5px}</style>").replace("<svg ", '<svg data-bar-layout="rows" ');
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=funnel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/funnel.ts"],"sourcesContent":["import { type FunnelLayout, type FunnelOptions, funnelLayout } from \"./funnel-layout\";\nimport { chartDatumSvg, escapeXml, renderHeader, svgRoot } from \"./svg-renderers\";\n\nexport { type FunnelLayout, type FunnelOptions, funnelLayout } from \"./funnel-layout\";\n\nexport function renderFunnelSvg(spec: FunnelOptions & { width: number; height: number; inspect?: boolean }) {\n return renderFunnelLayoutSvg(spec, funnelLayout(spec, spec));\n}\n\n/** Draw the same geometry reserved before a lazy host loads its renderer. */\nexport function renderFunnelLayoutSvg(spec: FunnelOptions & { width: number; height: number; inspect?: boolean }, g: FunnelLayout) {\n const text = (x: number, y: number, value: string, anchor = \"start\", cls = \"stdlib-chart-tick-label\") =>\n `<text class=\"${cls}\" x=\"${x}\" y=\"${y}\" text-anchor=\"${anchor}\">${escapeXml(value)}</text>`;\n const parts: string[] = [renderHeader(spec.width, spec.title, spec.subtitle).svg];\n for (const step of g.steps) {\n const next = g.steps[step.index + 1];\n if (next && step.value !== null && next.value !== null)\n parts.push(\n `<polygon points=\"${g.center - step.width / 2},${step.y + g.barHeight} ${g.center + step.width / 2},${step.y + g.barHeight} ${g.center + next.width / 2},${next.y} ${g.center - next.width / 2},${next.y}\" style=\"fill:var(--stdlib-chart-c1,#3b82f6);fill-opacity:.09\"/>`,\n );\n const marks = `<rect class=\"k2b-chart-category-band\" fill=\"none\" pointer-events=\"all\" x=\"0\" y=\"${g.top + step.index * g.pitch}\" width=\"${g.width}\" height=\"${g.pitch}\" rx=\"6\"/>${step.value === null ? \"\" : `<rect class=\"stdlib-chart-bar\" x=\"${g.center - step.width / 2}\" y=\"${step.y}\" width=\"${step.width}\" height=\"${g.barHeight}\" rx=\"3\" style=\"fill:var(--stdlib-chart-c1,#3b82f6);fill-opacity:${Math.max(0.3, 1 - step.index * 0.14)}\" stroke=\"none\" stroke-width=\"0\"/>`}`;\n parts.push(chartDatumSvg(marks, step.datum, spec.inspect ?? false, step.title));\n const lines = step.labelLines;\n lines.forEach((line, i) => parts.push(text(0, step.y + g.barHeight / 2 + 4 + (lines.length > 1 ? (i === 0 ? -6.5 : 6.5) : 0), line)));\n parts.push(text(g.width, step.y + g.barHeight / 2 + (step.index ? -2 : 4), step.valueText, \"end\", \"stdlib-chart-bar-value\"));\n if (step.index) parts.push(text(g.width, step.y + g.barHeight / 2 + 12, step.shareText, \"end\"));\n }\n return svgRoot({ ...spec, className: [spec.className, \"k2b-chart-funnel\"].filter(Boolean).join(\" \") }, parts.join(\"\"))\n .replace(\"</style>\", \".k2b-chart-funnel :is(.stdlib-chart-tick-label,.stdlib-chart-bar-value){font-size:12.5px}</style>\")\n .replace(\"<svg \", '<svg data-bar-layout=\"rows\" ');\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { barSeriesLegend, chartTextWidth, headerHeight, wrapLabel } from "../../content/chart-bar";
|
|
2
|
+
import { chartMessages } from "../../content/chart-message-catalog";
|
|
3
|
+
import { extendDomainToNice, niceStep } from "./svg-renderers";
|
|
4
|
+
/** Stacks start at zero, group headings keep their first-appearance order. */
|
|
5
|
+
export function hbarLayout(spec, size = {
|
|
6
|
+
width: 480,
|
|
7
|
+
height: 280
|
|
8
|
+
}) {
|
|
9
|
+
if (spec.rows.some(row => row.values.length !== spec.series.length || row.values.some(v => v !== null && (!Number.isFinite(v) || v < 0)))) throw new RangeError("Horizontal bars require aligned nonnegative segment values");
|
|
10
|
+
const format = spec.valueFormat ?? String;
|
|
11
|
+
const labels = chartMessages.resolve([spec.locale ?? "en"]).t;
|
|
12
|
+
const groups = [...new Set(spec.rows.map(r => r.group))];
|
|
13
|
+
const totals = spec.rows.map(r => r.values.some(v => v !== null) ? r.values.reduce((sum, v) => sum + (v ?? 0), 0) : null);
|
|
14
|
+
const max = Math.max(0, ...totals.filter(v => v !== null));
|
|
15
|
+
const scale = extendDomainToNice(0, max || 1, niceStep(max || 1, 4));
|
|
16
|
+
const unit = size.width / 296;
|
|
17
|
+
const left = Math.min(104 * unit, size.width * 0.26);
|
|
18
|
+
const right = size.width - Math.max(52 * unit, ...totals.map(v => (chartTextWidth(v === null ? "–" : format(v)) + 8) * unit));
|
|
19
|
+
const legendLayout = barSeriesLegend(spec.series.map((label, i) => ({
|
|
20
|
+
label,
|
|
21
|
+
data: spec.rows.map(r => r.values[i] ?? null)
|
|
22
|
+
})), format, size.width, 296, 70 // One legend budget even when rows grow the initial 280-unit drawing.
|
|
23
|
+
);
|
|
24
|
+
const legend = {
|
|
25
|
+
...legendLayout,
|
|
26
|
+
items: legendLayout.items.map(entry => ({
|
|
27
|
+
...entry,
|
|
28
|
+
valueText: entry.total === null ? "–" : format(entry.total),
|
|
29
|
+
text: wrapLabel(entry.label, entry.labelWidth, 1).lines[0] ?? entry.label
|
|
30
|
+
}))
|
|
31
|
+
};
|
|
32
|
+
const header = headerHeight({
|
|
33
|
+
title: spec.title,
|
|
34
|
+
subtitle: spec.subtitle
|
|
35
|
+
});
|
|
36
|
+
const top = header + (spec.legend === false ? 0 : legend.height);
|
|
37
|
+
const groupHeight = 20;
|
|
38
|
+
const pitch = Math.max(32, (size.height - top - 24 - groups.filter(g => g !== undefined).length * groupHeight) / Math.max(1, spec.rows.length));
|
|
39
|
+
const x = v => left + v / scale.domain[1] * (right - left);
|
|
40
|
+
let y = top;
|
|
41
|
+
const rows = groups.flatMap(group => {
|
|
42
|
+
if (group !== undefined) y += groupHeight;
|
|
43
|
+
let first = true;
|
|
44
|
+
return spec.rows.flatMap((row, index) => {
|
|
45
|
+
if (row.group !== group) return [];
|
|
46
|
+
const groupHeading = first ? group : undefined;
|
|
47
|
+
first = false;
|
|
48
|
+
const center = y + pitch / 2;
|
|
49
|
+
y += pitch;
|
|
50
|
+
let acc = 0;
|
|
51
|
+
const segments = row.values.map((value, seriesIndex) => {
|
|
52
|
+
const start = acc;
|
|
53
|
+
acc += value ?? 0;
|
|
54
|
+
const width = x(acc) - x(start);
|
|
55
|
+
const label = value === null ? "–" : format(value);
|
|
56
|
+
return {
|
|
57
|
+
value,
|
|
58
|
+
seriesIndex,
|
|
59
|
+
x: x(start),
|
|
60
|
+
width,
|
|
61
|
+
label,
|
|
62
|
+
showLabel: width / unit > chartTextWidth(label) + 10
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
const labelLines = wrapLabel(row.label, Math.max(8, left / unit - 8), 2).lines;
|
|
66
|
+
const total = totals[index];
|
|
67
|
+
const valueText = total === null ? "–" : format(total);
|
|
68
|
+
const datum = {
|
|
69
|
+
role: "item",
|
|
70
|
+
index,
|
|
71
|
+
label: [row.label, row.group].filter(Boolean).join(" · "),
|
|
72
|
+
anchor: [x(total ?? 0) + 4, center],
|
|
73
|
+
values: [...row.values.map((v, i) => ({
|
|
74
|
+
key: `series:${i}`,
|
|
75
|
+
value: v ?? "–",
|
|
76
|
+
formatted: v === null ? "–" : format(v)
|
|
77
|
+
})), {
|
|
78
|
+
key: "total",
|
|
79
|
+
value: total ?? "–",
|
|
80
|
+
formatted: valueText
|
|
81
|
+
}]
|
|
82
|
+
};
|
|
83
|
+
const title = [row.label, row.group, ...row.values.map((v, i) => `${spec.series[i]}: ${v === null ? "–" : format(v)}`), `${labels.chartFields({
|
|
84
|
+
key: "total"
|
|
85
|
+
})}: ${valueText}`].filter(Boolean).join(" · ");
|
|
86
|
+
return [{
|
|
87
|
+
...row,
|
|
88
|
+
labelLines,
|
|
89
|
+
groupHeading,
|
|
90
|
+
index,
|
|
91
|
+
center,
|
|
92
|
+
segments,
|
|
93
|
+
total,
|
|
94
|
+
valueText,
|
|
95
|
+
datum,
|
|
96
|
+
title,
|
|
97
|
+
groupY: center - pitch / 2 - groupHeight
|
|
98
|
+
}];
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
return {
|
|
102
|
+
...size,
|
|
103
|
+
header,
|
|
104
|
+
height: Math.max(size.height, y + 24),
|
|
105
|
+
top,
|
|
106
|
+
left,
|
|
107
|
+
right,
|
|
108
|
+
rows,
|
|
109
|
+
groups,
|
|
110
|
+
pitch,
|
|
111
|
+
x,
|
|
112
|
+
scale,
|
|
113
|
+
format,
|
|
114
|
+
unit,
|
|
115
|
+
legend
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=hbar-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/hbar-layout.ts"],"sourcesContent":["import { barSeriesLegend, chartTextWidth, headerHeight, wrapLabel } from \"../../content/chart-bar\";\nimport { chartMessages } from \"../../content/chart-message-catalog\";\nimport { extendDomainToNice, niceStep } from \"./svg-renderers\";\nimport type { ChartDatum } from \"./types\";\n\nexport type HorizontalBarOptions = {\n series: string[];\n rows: { group?: string; label: string; values: (number | null)[] }[];\n valueFormat?: (value: number) => string;\n legend?: boolean;\n title?: string;\n subtitle?: string;\n locale?: string;\n className?: string;\n};\n\n/** Stacks start at zero, group headings keep their first-appearance order. */\nexport function hbarLayout(spec: HorizontalBarOptions, size = { width: 480, height: 280 }) {\n if (\n spec.rows.some(\n (row) => row.values.length !== spec.series.length || row.values.some((v) => v !== null && (!Number.isFinite(v) || v < 0)),\n )\n )\n throw new RangeError(\"Horizontal bars require aligned nonnegative segment values\");\n const format = spec.valueFormat ?? String;\n const labels = chartMessages.resolve([spec.locale ?? \"en\"]).t;\n const groups = [...new Set(spec.rows.map((r) => r.group))];\n const totals = spec.rows.map((r) => (r.values.some((v) => v !== null) ? r.values.reduce<number>((sum, v) => sum + (v ?? 0), 0) : null));\n const max = Math.max(0, ...totals.filter((v): v is number => v !== null));\n const scale = extendDomainToNice(0, max || 1, niceStep(max || 1, 4));\n const unit = size.width / 296;\n const left = Math.min(104 * unit, size.width * 0.26);\n const right = size.width - Math.max(52 * unit, ...totals.map((v) => (chartTextWidth(v === null ? \"–\" : format(v)) + 8) * unit));\n const legendLayout = barSeriesLegend(\n spec.series.map((label, i) => ({ label, data: spec.rows.map((r) => r.values[i] ?? null) })),\n format,\n size.width,\n 296,\n 70, // One legend budget even when rows grow the initial 280-unit drawing.\n );\n const legend = {\n ...legendLayout,\n items: legendLayout.items.map((entry) => ({\n ...entry,\n valueText: entry.total === null ? \"–\" : format(entry.total),\n text: wrapLabel(entry.label, entry.labelWidth, 1).lines[0] ?? entry.label,\n })),\n };\n const header = headerHeight({ title: spec.title, subtitle: spec.subtitle });\n const top = header + (spec.legend === false ? 0 : legend.height);\n const groupHeight = 20;\n const pitch = Math.max(\n 32,\n (size.height - top - 24 - groups.filter((g) => g !== undefined).length * groupHeight) / Math.max(1, spec.rows.length),\n );\n const x = (v: number) => left + (v / scale.domain[1]) * (right - left);\n let y = top;\n const rows = groups.flatMap((group) => {\n if (group !== undefined) y += groupHeight;\n let first = true;\n return spec.rows.flatMap((row, index) => {\n if (row.group !== group) return [];\n const groupHeading = first ? group : undefined;\n first = false;\n const center = y + pitch / 2;\n y += pitch;\n let acc = 0;\n const segments = row.values.map((value, seriesIndex) => {\n const start = acc;\n acc += value ?? 0;\n const width = x(acc) - x(start);\n const label = value === null ? \"–\" : format(value);\n return { value, seriesIndex, x: x(start), width, label, showLabel: width / unit > chartTextWidth(label) + 10 };\n });\n const labelLines = wrapLabel(row.label, Math.max(8, left / unit - 8), 2).lines;\n const total = totals[index]!;\n const valueText = total === null ? \"–\" : format(total);\n const datum: ChartDatum = {\n role: \"item\",\n index,\n label: [row.label, row.group].filter(Boolean).join(\" · \"),\n anchor: [x(total ?? 0) + 4, center],\n values: [\n ...row.values.map((v, i) => ({ key: `series:${i}`, value: v ?? \"–\", formatted: v === null ? \"–\" : format(v) })),\n { key: \"total\", value: total ?? \"–\", formatted: valueText },\n ],\n };\n const title = [\n row.label,\n row.group,\n ...row.values.map((v, i) => `${spec.series[i]}: ${v === null ? \"–\" : format(v)}`),\n `${labels.chartFields({ key: \"total\" })}: ${valueText}`,\n ]\n .filter(Boolean)\n .join(\" · \");\n return [\n {\n ...row,\n labelLines,\n groupHeading,\n index,\n center,\n segments,\n total,\n valueText,\n datum,\n title,\n groupY: center - pitch / 2 - groupHeight,\n },\n ];\n });\n });\n return { ...size, header, height: Math.max(size.height, y + 24), top, left, right, rows, groups, pitch, x, scale, format, unit, legend };\n}\n\nexport type HorizontalBarLayout = ReturnType<typeof hbarLayout>;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { hbarLayout } from "./hbar-layout";
|
|
2
|
+
import { chartDatumSvg, escapeXml, renderHeader, svgRoot } from "./svg-renderers";
|
|
3
|
+
export { hbarLayout } from "./hbar-layout";
|
|
4
|
+
export function renderHbarSvg(spec) {
|
|
5
|
+
return renderHbarLayoutSvg(spec, hbarLayout(spec, spec));
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/** Draw an already prepared layout; lazy hosts reuse the geometry reserved before loading. */
|
|
9
|
+
export function renderHbarLayoutSvg(spec, g) {
|
|
10
|
+
const text = (x, y, value, anchor = "start", extra = "", attrs = 'class="stdlib-chart-tick-label"') => `<text ${attrs} x="${x}" y="${y}" text-anchor="${anchor}" ${extra}>${escapeXml(value)}</text>`;
|
|
11
|
+
const parts = [renderHeader(spec.width, spec.title, spec.subtitle).svg];
|
|
12
|
+
const header = g.header;
|
|
13
|
+
if (spec.legend !== false) g.legend.items.forEach((entry, i) => {
|
|
14
|
+
const y = header + entry.y;
|
|
15
|
+
parts.push(`<rect class="stdlib-chart-series-${i % 8}" x="${entry.x}" y="${y - 8}" width="${8 * g.unit}" height="8"/>`, text(entry.x + 14 * g.unit, y, entry.text), text(entry.valueX, y, entry.valueText, "end", `data-chart-legend-value data-field="series:${i}" data-default="${escapeXml(entry.valueText)}"`));
|
|
16
|
+
});
|
|
17
|
+
if (spec.legend !== false && g.legend.hidden) parts.push(text(0, header + g.legend.height - 8, `+${g.legend.hidden}`));
|
|
18
|
+
for (const tick of g.scale.ticks) parts.push(`<line class="stdlib-chart-grid" x1="${g.x(tick)}" x2="${g.x(tick)}" y1="${g.top}" y2="${g.height - 24}"/>`, text(g.x(tick), g.height - 5, g.format(tick), "middle"));
|
|
19
|
+
for (const row of g.rows) {
|
|
20
|
+
if (row.groupHeading !== undefined) {
|
|
21
|
+
parts.push(text(0, row.groupY + 14, row.groupHeading, "start", "", 'class="k2b-chart-group-heading" font-size="11.5" font-weight="600" fill="currentColor"'));
|
|
22
|
+
}
|
|
23
|
+
const height = Math.min(26, g.pitch * 0.74);
|
|
24
|
+
const marks = [`<rect class="k2b-chart-category-band" fill="none" pointer-events="all" x="0" y="${row.center - g.pitch / 2}" width="${spec.width}" height="${g.pitch}" rx="6"/>`];
|
|
25
|
+
for (const segment of row.segments) {
|
|
26
|
+
if (segment.value === null) continue;
|
|
27
|
+
marks.push(`<rect class="stdlib-chart-bar stdlib-chart-series-${segment.seriesIndex % 8}" x="${segment.x}" y="${row.center - height / 2}" width="${Math.max(segment.width / 2, segment.width - 1.5)}" height="${height}" rx="3" stroke="none" stroke-width="0" style="fill:var(--stdlib-chart-c${segment.seriesIndex % 8 + 1},#3b82f6);fill-opacity:.18"/>`);
|
|
28
|
+
if (segment.showLabel) marks.push(text(segment.x + segment.width / 2, row.center + 4, segment.label, "middle", "", 'class="k2b-chart-segment-value" font-size="11" font-weight="500" fill="currentColor"'));
|
|
29
|
+
}
|
|
30
|
+
parts.push(chartDatumSvg(marks.join(""), row.datum, spec.inspect ?? false, row.title));
|
|
31
|
+
row.labelLines.forEach((line, i) => parts.push(text(g.left - 8 * g.unit, row.center + 4 + (row.labelLines.length > 1 ? i === 0 ? -6.5 : 6.5 : 0), line, "end")));
|
|
32
|
+
parts.push(text(g.x(row.total ?? 0) + 6 * g.unit, row.center + 4, row.valueText));
|
|
33
|
+
}
|
|
34
|
+
return svgRoot({
|
|
35
|
+
...spec,
|
|
36
|
+
height: g.height
|
|
37
|
+
}, parts.join("")).replace("<svg ", '<svg data-bar-layout="rows" ');
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=hbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/hbar.ts"],"sourcesContent":["import { type HorizontalBarLayout, type HorizontalBarOptions, hbarLayout } from \"./hbar-layout\";\nimport { chartDatumSvg, escapeXml, renderHeader, svgRoot } from \"./svg-renderers\";\n\nexport { type HorizontalBarLayout, type HorizontalBarOptions, hbarLayout } from \"./hbar-layout\";\n\nexport function renderHbarSvg(spec: HorizontalBarOptions & { width: number; height: number; inspect?: boolean }) {\n return renderHbarLayoutSvg(spec, hbarLayout(spec, spec));\n}\n\n/** Draw an already prepared layout; lazy hosts reuse the geometry reserved before loading. */\nexport function renderHbarLayoutSvg(\n spec: HorizontalBarOptions & { width: number; height: number; inspect?: boolean },\n g: HorizontalBarLayout,\n) {\n const text = (x: number, y: number, value: string, anchor = \"start\", extra = \"\", attrs = 'class=\"stdlib-chart-tick-label\"') =>\n `<text ${attrs} x=\"${x}\" y=\"${y}\" text-anchor=\"${anchor}\" ${extra}>${escapeXml(value)}</text>`;\n const parts: string[] = [renderHeader(spec.width, spec.title, spec.subtitle).svg];\n const header = g.header;\n if (spec.legend !== false)\n g.legend.items.forEach((entry, i) => {\n const y = header + entry.y;\n parts.push(\n `<rect class=\"stdlib-chart-series-${i % 8}\" x=\"${entry.x}\" y=\"${y - 8}\" width=\"${8 * g.unit}\" height=\"8\"/>`,\n text(entry.x + 14 * g.unit, y, entry.text),\n text(\n entry.valueX,\n y,\n entry.valueText,\n \"end\",\n `data-chart-legend-value data-field=\"series:${i}\" data-default=\"${escapeXml(entry.valueText)}\"`,\n ),\n );\n });\n if (spec.legend !== false && g.legend.hidden) parts.push(text(0, header + g.legend.height - 8, `+${g.legend.hidden}`));\n for (const tick of g.scale.ticks)\n parts.push(\n `<line class=\"stdlib-chart-grid\" x1=\"${g.x(tick)}\" x2=\"${g.x(tick)}\" y1=\"${g.top}\" y2=\"${g.height - 24}\"/>`,\n text(g.x(tick), g.height - 5, g.format(tick), \"middle\"),\n );\n for (const row of g.rows) {\n if (row.groupHeading !== undefined) {\n parts.push(\n text(\n 0,\n row.groupY + 14,\n row.groupHeading,\n \"start\",\n \"\",\n 'class=\"k2b-chart-group-heading\" font-size=\"11.5\" font-weight=\"600\" fill=\"currentColor\"',\n ),\n );\n }\n const height = Math.min(26, g.pitch * 0.74);\n const marks = [\n `<rect class=\"k2b-chart-category-band\" fill=\"none\" pointer-events=\"all\" x=\"0\" y=\"${row.center - g.pitch / 2}\" width=\"${spec.width}\" height=\"${g.pitch}\" rx=\"6\"/>`,\n ];\n for (const segment of row.segments) {\n if (segment.value === null) continue;\n marks.push(\n `<rect class=\"stdlib-chart-bar stdlib-chart-series-${segment.seriesIndex % 8}\" x=\"${segment.x}\" y=\"${row.center - height / 2}\" width=\"${Math.max(segment.width / 2, segment.width - 1.5)}\" height=\"${height}\" rx=\"3\" stroke=\"none\" stroke-width=\"0\" style=\"fill:var(--stdlib-chart-c${(segment.seriesIndex % 8) + 1},#3b82f6);fill-opacity:.18\"/>`,\n );\n if (segment.showLabel)\n marks.push(\n text(\n segment.x + segment.width / 2,\n row.center + 4,\n segment.label,\n \"middle\",\n \"\",\n 'class=\"k2b-chart-segment-value\" font-size=\"11\" font-weight=\"500\" fill=\"currentColor\"',\n ),\n );\n }\n parts.push(chartDatumSvg(marks.join(\"\"), row.datum, spec.inspect ?? false, row.title));\n row.labelLines.forEach((line, i) =>\n parts.push(text(g.left - 8 * g.unit, row.center + 4 + (row.labelLines.length > 1 ? (i === 0 ? -6.5 : 6.5) : 0), line, \"end\")),\n );\n parts.push(text(g.x(row.total ?? 0) + 6 * g.unit, row.center + 4, row.valueText));\n }\n return svgRoot({ ...spec, height: g.height }, parts.join(\"\")).replace(\"<svg \", '<svg data-bar-layout=\"rows\" ');\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
/** Portable chart contracts. This entry never imports Solid or browser APIs. */
|
|
2
2
|
|
|
3
|
-
export { barChartLayout, renderBarChartSvg } from "../../content/chart-bar";
|
|
3
|
+
export { barChartLayout, rankedBarLayout, renderBarChartSvg, seriesBarLayout } from "../../content/chart-bar";
|
|
4
4
|
export { renderStateTimelineSvg, stateTimelineDomain, stateTimelineHeight } from "../../content/chart-state-timeline";
|
|
5
5
|
export { areaLayout, renderAreaSvg } from "./area";
|
|
6
|
+
export * from "./bubble";
|
|
6
7
|
export * from "./calendar";
|
|
8
|
+
export { funnelLayout, renderFunnelLayoutSvg, renderFunnelSvg } from "./funnel";
|
|
9
|
+
export { hbarLayout, renderHbarLayoutSvg, renderHbarSvg } from "./hbar";
|
|
7
10
|
export * from "./inspection";
|
|
11
|
+
export { map } from "./map";
|
|
12
|
+
export * from "./pareto";
|
|
13
|
+
export * from "./radar";
|
|
8
14
|
export * from "./render";
|
|
15
|
+
export { chartRenderHeight, preservesAspectRatio } from "./render-size";
|
|
9
16
|
export * from "./snapshot";
|
|
10
|
-
export {
|
|
17
|
+
export { charts } from "./svg";
|
|
18
|
+
export { arcPathD, autoBin, bar, barGauge, boxplot, chartDatumSvg, computeBoxStats, computeDomain, donut, escapeXml, extendDomainToNice, gauge, heatmap, histogram, line, linearRegression, linePathD, mapLog, mapRange, markerPath, niceLogTicks, niceStep, normalizePadding, pie, scatter, smoothPathD, sparkline, stat, stateTimeline, stepPathD, svgRoot } from "./svg-renderers";
|
|
19
|
+
export * from "./treemap";
|
|
11
20
|
export { chartDatumRoles } from "./types";
|
|
21
|
+
export { renderWaterfallLayoutSvg, renderWaterfallSvg, waterfallLayout } from "./waterfall";
|
|
12
22
|
//# sourceMappingURL=index.js.map
|