@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,638 @@
|
|
|
1
|
+
import { arcPathD, chartDatumSvg, clamp, collectAxisValues, collectSeriesLegend, computeAxisScale, computeDomain, computePlotArea, DEFAULT_HEIGHT, DEFAULT_LINE_STYLES, DEFAULT_WIDTH, emptyChart, escapeXml, extendDomainToNice, fmt, formatNumberValue, inspectionPoint, isOnAxis, itemColorIndex, LINE_DASH_PATTERNS, linePathD, mapRange, measureLegendHeight, niceStep, normalizePadding, pickMapper, pointValues, renderErrorBars, renderHeader, renderLegend, renderReferenceLines, renderXAxisCategorical, renderXAxisNumeric, renderYAxis, resolveErrorY, smoothPathD, stepPathD, svgRoot, thresholdFillAttr } from "./svg-common";
|
|
2
|
+
export { barGauge } from "./svg-barGauge";
|
|
3
|
+
export { boxplot } from "./svg-boxplot";
|
|
4
|
+
export * from "./svg-common";
|
|
5
|
+
export { gauge } from "./svg-gauge";
|
|
6
|
+
export { heatmap } from "./svg-heatmap";
|
|
7
|
+
export { histogram } from "./svg-histogram";
|
|
8
|
+
// Preserve the portable exports while allowing bundlers to load each renderer independently.
|
|
9
|
+
export { scatter } from "./svg-scatter";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Render a line chart. Each series becomes a `<path class="stdlib-chart-line">`
|
|
13
|
+
* connecting its points (sorted by `x`). Multi-series charts get distinct
|
|
14
|
+
* `stdlib-chart-series-N` classes.
|
|
15
|
+
*
|
|
16
|
+
* Non-finite points are filtered. A series with fewer than 2 finite points
|
|
17
|
+
* is skipped (no path can be drawn). An empty/all-non-finite chart renders
|
|
18
|
+
* an empty-state SVG.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* charts.line({ series: [{ data: [{x:1,y:10},{x:2,y:25},{x:3,y:18}] }] });
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* charts.line({
|
|
25
|
+
* series: [
|
|
26
|
+
* { label: "Revenue", data: [...] },
|
|
27
|
+
* { label: "Costs", data: [...] },
|
|
28
|
+
* ],
|
|
29
|
+
* yAxis: { format: v => `$${v}k` },
|
|
30
|
+
* });
|
|
31
|
+
*/
|
|
32
|
+
export const line = opts => {
|
|
33
|
+
const width = opts.width ?? DEFAULT_WIDTH;
|
|
34
|
+
const height = opts.height ?? DEFAULT_HEIGHT;
|
|
35
|
+
const padding = normalizePadding(opts.padding);
|
|
36
|
+
const header = renderHeader(width, opts.title, opts.subtitle);
|
|
37
|
+
const legendItems = collectSeriesLegend(opts);
|
|
38
|
+
const legendHeight = legendItems.length > 0 ? 20 : 0;
|
|
39
|
+
const finitePoints = opts.series.flatMap(s => s.data).filter(p => Number.isFinite(p.x) && Number.isFinite(p.y));
|
|
40
|
+
if (finitePoints.length === 0) return emptyChart(width, height, opts.className);
|
|
41
|
+
const area = computePlotArea(width, height, padding, !!opts.xAxis?.label, !!opts.yAxis?.label, header.height, legendHeight);
|
|
42
|
+
const xAxis = computeAxisScale(collectAxisValues(opts.series, "x"), opts.xAxis);
|
|
43
|
+
const yAxis = computeAxisScale(collectAxisValues(opts.series, "y"), opts.yAxis);
|
|
44
|
+
const xMap = pickMapper(xAxis.scale);
|
|
45
|
+
const yMap = pickMapper(yAxis.scale);
|
|
46
|
+
const body = [];
|
|
47
|
+
body.push(renderYAxis(yAxis, area, opts.yAxis));
|
|
48
|
+
body.push(renderXAxisNumeric(xAxis, area, height - legendHeight, opts.xAxis));
|
|
49
|
+
|
|
50
|
+
// Compute the area baseline (zero if it's in the y-domain, otherwise the
|
|
51
|
+
// bottom of the plot area). Log axes always start at the bottom.
|
|
52
|
+
const baselineY = yAxis.scale === "linear" && yAxis.domain[0] <= 0 && yAxis.domain[1] >= 0 ? yMap(0, yAxis.domain, [area.y1, area.y0]) : area.y1;
|
|
53
|
+
|
|
54
|
+
// Step plot takes precedence over smooth (treppe with curves doesn't make
|
|
55
|
+
// sense). Otherwise smooth is the default; explicit `smooth: false` opts out.
|
|
56
|
+
const pathFn = opts.step ? pts => stepPathD(pts, opts.step) : opts.smooth === false ? linePathD : smoothPathD;
|
|
57
|
+
opts.series.forEach((s, i) => {
|
|
58
|
+
const finite = s.data.filter(p => isOnAxis(xAxis, p.x) && isOnAxis(yAxis, p.y));
|
|
59
|
+
if (opts.inspect) s.data.forEach((p, index) => {
|
|
60
|
+
if (!isOnAxis(xAxis, p.x) || !isOnAxis(yAxis, p.y)) return;
|
|
61
|
+
body.push(inspectionPoint({
|
|
62
|
+
index,
|
|
63
|
+
seriesIndex: i,
|
|
64
|
+
role: "point",
|
|
65
|
+
label: s.label,
|
|
66
|
+
anchor: [xMap(p.x, xAxis.domain, [area.x0, area.x1]), yMap(p.y, yAxis.domain, [area.y1, area.y0])],
|
|
67
|
+
values: pointValues(p, opts.xAxis, opts.yAxis)
|
|
68
|
+
}, opts.inspect));
|
|
69
|
+
});
|
|
70
|
+
if (finite.length < 2) return;
|
|
71
|
+
const sorted = [...finite].sort((a, b) => a.x - b.x);
|
|
72
|
+
const mapped = sorted.map(p => ({
|
|
73
|
+
x: xMap(p.x, xAxis.domain, [area.x0, area.x1]),
|
|
74
|
+
y: yMap(p.y, yAxis.domain, [area.y1, area.y0])
|
|
75
|
+
}));
|
|
76
|
+
const linePath = pathFn(mapped);
|
|
77
|
+
|
|
78
|
+
// Error band: filled translucent area between errYHigh and errYLow.
|
|
79
|
+
if (opts.errorBand) {
|
|
80
|
+
const upper = [];
|
|
81
|
+
const lower = [];
|
|
82
|
+
for (const p of sorted) {
|
|
83
|
+
const err = resolveErrorY(p);
|
|
84
|
+
if (!err) continue;
|
|
85
|
+
const [low, high] = err;
|
|
86
|
+
upper.push({
|
|
87
|
+
x: xMap(p.x, xAxis.domain, [area.x0, area.x1]),
|
|
88
|
+
y: yMap(p.y + high, yAxis.domain, [area.y1, area.y0])
|
|
89
|
+
});
|
|
90
|
+
lower.push({
|
|
91
|
+
x: xMap(p.x, xAxis.domain, [area.x0, area.x1]),
|
|
92
|
+
y: yMap(p.y - low, yAxis.domain, [area.y1, area.y0])
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
if (upper.length >= 2) {
|
|
96
|
+
const upperPath = pathFn(upper);
|
|
97
|
+
const lowerReversed = lower.slice().reverse();
|
|
98
|
+
const lowerSegments = lowerReversed.map(pt => ` L ${fmt(pt.x)} ${fmt(pt.y)}`).join("");
|
|
99
|
+
const bandPath = `${upperPath}${lowerSegments} Z`;
|
|
100
|
+
body.push(`<path class="stdlib-chart-error-band stdlib-chart-series-${i % 8}" d="${bandPath}"/>`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (opts.area) {
|
|
104
|
+
const last = mapped[mapped.length - 1];
|
|
105
|
+
const first = mapped[0];
|
|
106
|
+
const areaPath = `${linePath} L ${fmt(last.x)} ${fmt(baselineY)} L ${fmt(first.x)} ${fmt(baselineY)} Z`;
|
|
107
|
+
body.push(`<path class="stdlib-chart-area stdlib-chart-series-${i % 8}" d="${areaPath}"/>`);
|
|
108
|
+
}
|
|
109
|
+
const dashStyle = s.lineStyle ?? (opts.autoVariant ? DEFAULT_LINE_STYLES[i % DEFAULT_LINE_STYLES.length] : "solid");
|
|
110
|
+
const dashAttr = LINE_DASH_PATTERNS[dashStyle];
|
|
111
|
+
const cls = `stdlib-chart-line stdlib-chart-series-${i % 8}`;
|
|
112
|
+
const dashAttrStr = dashAttr ? ` stroke-dasharray="${dashAttr}"` : "";
|
|
113
|
+
body.push(`<path class="${cls}" d="${linePath}"${dashAttrStr}/>`);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// Error bars render after lines so caps don't disappear behind the stroke.
|
|
117
|
+
body.push(renderErrorBars(opts.series, xAxis, yAxis, area));
|
|
118
|
+
|
|
119
|
+
// References render AFTER data so labels stay on top.
|
|
120
|
+
if (opts.references && opts.references.length > 0) {
|
|
121
|
+
body.push(renderReferenceLines(opts.references, xAxis, yAxis, area));
|
|
122
|
+
}
|
|
123
|
+
const legend = renderLegend(legendItems, width, height - legendHeight);
|
|
124
|
+
return svgRoot({
|
|
125
|
+
width,
|
|
126
|
+
height,
|
|
127
|
+
className: opts.className
|
|
128
|
+
}, header.svg + body.join("") + legend.svg);
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Render a categorical bar chart. The y-domain always includes zero so bars
|
|
133
|
+
* rest on a visible baseline. Negative values produce bars below the zero
|
|
134
|
+
* line; mixed positive/negative inputs render the zero line as the X axis.
|
|
135
|
+
*
|
|
136
|
+
* Bars use class `stdlib-chart-bar stdlib-chart-series-0` (single-series
|
|
137
|
+
* only in v1 — grouped/stacked bars are out of scope).
|
|
138
|
+
*
|
|
139
|
+
* Non-finite values are filtered. Empty input renders an empty-state SVG.
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* charts.bar({ data: [{label:"Q1",value:120},{label:"Q2",value:180}] });
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* charts.bar({
|
|
146
|
+
* data: [{label:"Profit",value:50},{label:"Loss",value:-20}],
|
|
147
|
+
* yAxis: { format: v => `${v}k` },
|
|
148
|
+
* });
|
|
149
|
+
*/
|
|
150
|
+
export const bar = opts => {
|
|
151
|
+
const width = opts.width ?? DEFAULT_WIDTH;
|
|
152
|
+
const height = opts.height ?? DEFAULT_HEIGHT;
|
|
153
|
+
const padding = normalizePadding(opts.padding);
|
|
154
|
+
const header = renderHeader(width, opts.title, opts.subtitle);
|
|
155
|
+
const sourceIndices = opts.data.flatMap((d, index) => Number.isFinite(d.value) ? [index] : []);
|
|
156
|
+
const finite = opts.data.filter(d => Number.isFinite(d.value));
|
|
157
|
+
if (finite.length === 0) return emptyChart(width, height, opts.className);
|
|
158
|
+
|
|
159
|
+
// Legend only useful when bars have distinct colors. Otherwise it's a
|
|
160
|
+
// redundant single-entry box, so silently drop it.
|
|
161
|
+
const legendItems = opts.legend && opts.colorByBar ? finite.map((d, i) => ({
|
|
162
|
+
label: d.label,
|
|
163
|
+
seriesIndex: itemColorIndex(d, i)
|
|
164
|
+
})) : [];
|
|
165
|
+
const legendHeight = legendItems.length > 0 ? 20 : 0;
|
|
166
|
+
const area = computePlotArea(width, height, padding, false, !!opts.yAxis?.label, header.height, legendHeight);
|
|
167
|
+
const values = finite.map(d => d.value);
|
|
168
|
+
|
|
169
|
+
// For linear scale: include zero so bars rest on a baseline.
|
|
170
|
+
// For log scale: zero isn't representable; just use the data extent.
|
|
171
|
+
const yScale = opts.yAxis?.scale === "log" ? "log" : "linear";
|
|
172
|
+
const valuesForDomain = yScale === "log" ? values : [...values, 0];
|
|
173
|
+
const yAxis = computeAxisScale(valuesForDomain, opts.yAxis);
|
|
174
|
+
const yMap = pickMapper(yAxis.scale);
|
|
175
|
+
const body = [];
|
|
176
|
+
body.push(renderYAxis(yAxis, area, opts.yAxis));
|
|
177
|
+
body.push(renderXAxisCategorical(finite.map(d => d.label), area, height - legendHeight, undefined));
|
|
178
|
+
|
|
179
|
+
// If domain spans negative and positive (linear only), draw the zero
|
|
180
|
+
// baseline as a dedicated line on top of the gridlines.
|
|
181
|
+
if (yAxis.scale === "linear" && yAxis.domain[0] < 0 && yAxis.domain[1] > 0) {
|
|
182
|
+
const zeroY = yMap(0, yAxis.domain, [area.y1, area.y0]);
|
|
183
|
+
body.push(`<line class="stdlib-chart-axis" x1="${fmt(area.x0)}" y1="${fmt(zeroY)}" x2="${fmt(area.x1)}" y2="${fmt(zeroY)}"/>`);
|
|
184
|
+
}
|
|
185
|
+
const slot = (area.x1 - area.x0) / finite.length;
|
|
186
|
+
const barWidth = slot * 0.8;
|
|
187
|
+
const barOffset = slot * 0.1;
|
|
188
|
+
// Bar baseline: zero on linear scale, bottom of plot for log scale (since
|
|
189
|
+
// log can't represent zero).
|
|
190
|
+
const zeroPx = yAxis.scale === "log" ? area.y1 : yMap(0, yAxis.domain, [area.y1, area.y0]);
|
|
191
|
+
const fmtValue = opts.yAxis?.format ?? (v => String(v));
|
|
192
|
+
for (let i = 0; i < finite.length; i++) {
|
|
193
|
+
const d = finite[i];
|
|
194
|
+
const x = area.x0 + slot * i + barOffset;
|
|
195
|
+
if (yAxis.scale === "log" && d.value <= 0) continue; // log can't render
|
|
196
|
+
const valuePx = yMap(d.value, yAxis.domain, [area.y1, area.y0]);
|
|
197
|
+
const top = Math.min(valuePx, zeroPx);
|
|
198
|
+
const h = Math.abs(valuePx - zeroPx);
|
|
199
|
+
const seriesIdx = opts.colorByBar ? itemColorIndex(d, i) : 0;
|
|
200
|
+
body.push(chartDatumSvg(`<rect class="stdlib-chart-bar stdlib-chart-series-${seriesIdx}" x="${fmt(x)}" y="${fmt(top)}" width="${fmt(barWidth)}" height="${fmt(h)}"/>`, {
|
|
201
|
+
index: sourceIndices[i],
|
|
202
|
+
role: "item",
|
|
203
|
+
label: d.label,
|
|
204
|
+
anchor: [x + barWidth / 2, top + h / 2],
|
|
205
|
+
values: [{
|
|
206
|
+
key: "value",
|
|
207
|
+
value: d.value,
|
|
208
|
+
formatted: fmtValue(d.value)
|
|
209
|
+
}]
|
|
210
|
+
}, opts.inspect));
|
|
211
|
+
if (opts.showValues) {
|
|
212
|
+
const labelY = d.value < 0 ? top + h + 12 : top - 4;
|
|
213
|
+
const labelX = x + barWidth / 2;
|
|
214
|
+
body.push(`<text class="stdlib-chart-bar-value" x="${fmt(labelX)}" y="${fmt(labelY)}" text-anchor="middle">${escapeXml(fmtValue(d.value))}</text>`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// y-axis references render AFTER bars so labels stay on top.
|
|
219
|
+
// x-axis refs are ignored on bar (the x-axis is categorical).
|
|
220
|
+
if (opts.references && opts.references.length > 0) {
|
|
221
|
+
const yRefs = opts.references.filter(r => (r.axis ?? "y") === "y");
|
|
222
|
+
if (yRefs.length > 0) {
|
|
223
|
+
body.push(renderReferenceLines(yRefs, {
|
|
224
|
+
domain: [0, 1],
|
|
225
|
+
scale: "linear"
|
|
226
|
+
}, yAxis, area));
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
const legend = renderLegend(legendItems, width, height - legendHeight);
|
|
230
|
+
return svgRoot({
|
|
231
|
+
width,
|
|
232
|
+
height,
|
|
233
|
+
className: opts.className
|
|
234
|
+
}, header.svg + body.join("") + legend.svg);
|
|
235
|
+
};
|
|
236
|
+
const renderPie = (opts, defaultInnerRadius) => {
|
|
237
|
+
const width = opts.width ?? DEFAULT_WIDTH;
|
|
238
|
+
const height = opts.height ?? DEFAULT_HEIGHT;
|
|
239
|
+
const header = renderHeader(width, opts.title, opts.subtitle);
|
|
240
|
+
const sourceIndices = opts.data.flatMap((d, index) => Number.isFinite(d.value) && d.value > 0 ? [index] : []);
|
|
241
|
+
const finite = opts.data.filter(d => Number.isFinite(d.value) && d.value > 0);
|
|
242
|
+
const total = finite.reduce((sum, d) => sum + d.value, 0);
|
|
243
|
+
if (finite.length === 0 || total <= 0) {
|
|
244
|
+
return emptyChart(width, height, opts.className);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Build legend items up-front (need to measure height before laying out pie).
|
|
248
|
+
const legendItems = opts.legend ? finite.map((d, i) => {
|
|
249
|
+
const ratio = d.value / total;
|
|
250
|
+
const pct = (ratio * 100).toFixed(ratio < 0.1 ? 1 : 0);
|
|
251
|
+
return {
|
|
252
|
+
label: `${d.label} (${pct}%)`,
|
|
253
|
+
seriesIndex: itemColorIndex(d, i)
|
|
254
|
+
};
|
|
255
|
+
}) : [];
|
|
256
|
+
const legendHeight = measureLegendHeight(legendItems, width);
|
|
257
|
+
const LEGEND_GAP = legendHeight > 0 ? 8 : 0;
|
|
258
|
+
const innerRatio = Math.max(0, Math.min(0.95, opts.innerRadius ?? defaultInnerRadius));
|
|
259
|
+
// Reserve outer margin for labels if requested.
|
|
260
|
+
const baseMargin = 8;
|
|
261
|
+
const labelMargin = opts.showLabels ? 60 : 0;
|
|
262
|
+
const margin = baseMargin + labelMargin;
|
|
263
|
+
// Center vertically in the space below the header, above the legend.
|
|
264
|
+
const availableHeight = height - header.height - legendHeight - LEGEND_GAP;
|
|
265
|
+
const cx = width / 2;
|
|
266
|
+
const cy = header.height + availableHeight / 2;
|
|
267
|
+
const r = Math.max(0, Math.min(width, availableHeight) / 2 - margin);
|
|
268
|
+
const innerR = r * innerRatio;
|
|
269
|
+
const body = [];
|
|
270
|
+
// Slices clockwise from 12 o'clock (-π/2).
|
|
271
|
+
let a = -Math.PI / 2;
|
|
272
|
+
finite.forEach((d, i) => {
|
|
273
|
+
const sweep = d.value / total * Math.PI * 2;
|
|
274
|
+
const a1 = a + sweep;
|
|
275
|
+
const cls = `stdlib-chart-slice stdlib-chart-series-${itemColorIndex(d, i)}`;
|
|
276
|
+
body.push(chartDatumSvg(`<path class="${cls}" d="${arcPathD(cx, cy, r, a, a1, innerR)}"/>`, {
|
|
277
|
+
index: sourceIndices[i],
|
|
278
|
+
role: "item",
|
|
279
|
+
label: d.label,
|
|
280
|
+
anchor: [cx + (r + innerR) / 2 * Math.cos(a + sweep / 2), cy + (r + innerR) / 2 * Math.sin(a + sweep / 2)],
|
|
281
|
+
values: [{
|
|
282
|
+
key: "value",
|
|
283
|
+
value: d.value
|
|
284
|
+
}, {
|
|
285
|
+
key: "percent",
|
|
286
|
+
value: d.value / total * 100
|
|
287
|
+
}, {
|
|
288
|
+
key: "total",
|
|
289
|
+
value: total
|
|
290
|
+
}]
|
|
291
|
+
}, opts.inspect));
|
|
292
|
+
if (opts.showLabels) {
|
|
293
|
+
const mid = a + sweep / 2;
|
|
294
|
+
// Place label slightly outside the outer radius.
|
|
295
|
+
const lr = r + 14;
|
|
296
|
+
const lx = cx + lr * Math.cos(mid);
|
|
297
|
+
const ly = cy + lr * Math.sin(mid);
|
|
298
|
+
const pct = (d.value / total * 100).toFixed(d.value / total < 0.1 ? 1 : 0);
|
|
299
|
+
const anchor = Math.cos(mid) > 0.2 ? "start" : Math.cos(mid) < -0.2 ? "end" : "middle";
|
|
300
|
+
body.push(`<text class="stdlib-chart-label" x="${fmt(lx)}" y="${fmt(ly + 3)}" text-anchor="${anchor}">${escapeXml(d.label)} (${pct}%)</text>`);
|
|
301
|
+
}
|
|
302
|
+
a = a1;
|
|
303
|
+
});
|
|
304
|
+
const legend = renderLegend(legendItems, width, height - legendHeight);
|
|
305
|
+
return svgRoot({
|
|
306
|
+
width,
|
|
307
|
+
height,
|
|
308
|
+
className: opts.className
|
|
309
|
+
}, header.svg + body.join("") + legend.svg);
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Render a pie chart. Slices are drawn clockwise starting at 12 o'clock,
|
|
314
|
+
* proportional to each item's `value`. Pass `showLabels: true` to render
|
|
315
|
+
* `Label (XX%)` outside each slice, or `legend: true` to render a wrapping
|
|
316
|
+
* legend below the chart.
|
|
317
|
+
*
|
|
318
|
+
* Use `legend` (not `showLabels`) when slices are many or one slice dominates —
|
|
319
|
+
* outside labels collide in those cases.
|
|
320
|
+
*
|
|
321
|
+
* Non-positive and non-finite values are filtered. A 100%-single-slice draws
|
|
322
|
+
* a complete circle. Empty/all-zero input renders an empty-state SVG.
|
|
323
|
+
*
|
|
324
|
+
* @example
|
|
325
|
+
* charts.pie({ data: [{label:"A",value:30},{label:"B",value:50},{label:"C",value:20}] });
|
|
326
|
+
*
|
|
327
|
+
* @example
|
|
328
|
+
* charts.pie({ data: [...], showLabels: true });
|
|
329
|
+
*
|
|
330
|
+
* @example
|
|
331
|
+
* charts.pie({ data: [...], legend: true }); // recommended for many small slices
|
|
332
|
+
*/
|
|
333
|
+
export const pie = opts => renderPie(opts, 0);
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Render a donut chart. Identical to {@link pie} but with a hollow center
|
|
337
|
+
* (default `innerRadius: 0.6`). Override `innerRadius` for a thicker or
|
|
338
|
+
* thinner ring.
|
|
339
|
+
*
|
|
340
|
+
* @example
|
|
341
|
+
* charts.donut({ data: [{label:"Used",value:67},{label:"Free",value:33}] });
|
|
342
|
+
*
|
|
343
|
+
* @example
|
|
344
|
+
* charts.donut({ data: [...], innerRadius: 0.4, showLabels: true });
|
|
345
|
+
*
|
|
346
|
+
* @example
|
|
347
|
+
* charts.donut({ data: [...], legend: true }); // wrapping legend below the ring
|
|
348
|
+
*/
|
|
349
|
+
export const donut = opts => renderPie(opts, 0.6);
|
|
350
|
+
const renderInlineSparkline = (values, x, y, width, height, inspect) => {
|
|
351
|
+
if (!values || values.length < 2) return "";
|
|
352
|
+
const entries = sparklineEntries(values);
|
|
353
|
+
const points = entries.map(entry => entry.point);
|
|
354
|
+
if (points.length < 2) return "";
|
|
355
|
+
const xs = points.map(p => p.x);
|
|
356
|
+
const ys = points.map(p => p.y);
|
|
357
|
+
const xDomain = computeDomain(xs);
|
|
358
|
+
const yDomain = computeDomain(ys);
|
|
359
|
+
const mapped = [...points].sort((a, b) => a.x - b.x).map(p => ({
|
|
360
|
+
x: mapRange(p.x, xDomain, [x, x + width]),
|
|
361
|
+
y: mapRange(p.y, yDomain, [y + height, y])
|
|
362
|
+
}));
|
|
363
|
+
const linePath = smoothPathD(mapped);
|
|
364
|
+
const first = mapped[0];
|
|
365
|
+
const last = mapped[mapped.length - 1];
|
|
366
|
+
const areaPath = `${linePath} L ${fmt(last.x)} ${fmt(y + height)} L ${fmt(first.x)} ${fmt(y + height)} Z`;
|
|
367
|
+
return `<path class="stdlib-chart-stat-sparkline-area" d="${areaPath}"/>` + `<path class="stdlib-chart-stat-sparkline" d="${linePath}"/>` + (inspect ? [...points].sort((a, b) => a.x - b.x).map((p, index) => inspectionPoint({
|
|
368
|
+
index: entries[index].index,
|
|
369
|
+
role: "point",
|
|
370
|
+
anchor: [mapped[index].x, mapped[index].y],
|
|
371
|
+
values: pointValues(p)
|
|
372
|
+
}, inspect)).join("") : "");
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
/** Render a large value panel with optional delta and inline sparkline. */
|
|
376
|
+
export const stat = opts => {
|
|
377
|
+
const width = opts.width ?? 260;
|
|
378
|
+
const height = opts.height ?? 150;
|
|
379
|
+
const value = typeof opts.value === "number" ? formatNumberValue(opts.value, opts.format, opts.unit) : `${opts.value}${opts.unit ?? ""}`;
|
|
380
|
+
const trend = opts.trend ?? (typeof opts.delta === "number" ? opts.delta > 0 ? "up" : opts.delta < 0 ? "down" : "neutral" : "neutral");
|
|
381
|
+
const deltaText = typeof opts.delta === "number" ? `${opts.delta > 0 ? "+" : ""}${opts.deltaFormat ? opts.deltaFormat(opts.delta) : fmt(opts.delta)}` : opts.delta;
|
|
382
|
+
const deltaClass = trend === "up" ? " stdlib-chart-stat-delta-up" : trend === "down" ? " stdlib-chart-stat-delta-down" : "";
|
|
383
|
+
const body = [];
|
|
384
|
+
body.push(`<text class="stdlib-chart-stat-label" x="16" y="24">${escapeXml(opts.label)}</text>`);
|
|
385
|
+
body.push(`<text class="stdlib-chart-stat-value" x="16" y="70">${escapeXml(value)}</text>`);
|
|
386
|
+
if (deltaText !== undefined) {
|
|
387
|
+
body.push(`<text class="stdlib-chart-stat-delta${deltaClass}" x="${fmt(width - 16)}" y="70" text-anchor="end">${escapeXml(String(deltaText))}</text>`);
|
|
388
|
+
}
|
|
389
|
+
const summary = chartDatumSvg((opts.inspect ? `<rect x="0" y="0" width="${fmt(width)}" height="${fmt(Math.max(80, height - 48))}" fill="transparent" stroke="none"/>` : "") + body.join(""), {
|
|
390
|
+
index: 0,
|
|
391
|
+
role: "value",
|
|
392
|
+
label: opts.label,
|
|
393
|
+
anchor: [width / 2, 50],
|
|
394
|
+
values: [{
|
|
395
|
+
key: "value",
|
|
396
|
+
value: opts.value,
|
|
397
|
+
formatted: value
|
|
398
|
+
}, ...(opts.delta !== undefined ? [{
|
|
399
|
+
key: "delta",
|
|
400
|
+
value: opts.delta,
|
|
401
|
+
formatted: deltaText
|
|
402
|
+
}] : [])]
|
|
403
|
+
}, opts.inspect);
|
|
404
|
+
return svgRoot({
|
|
405
|
+
width,
|
|
406
|
+
height,
|
|
407
|
+
className: opts.className
|
|
408
|
+
}, summary + renderInlineSparkline(opts.sparkline, 16, height - 42, width - 32, 26, opts.inspect));
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
// ==========================
|
|
412
|
+
// STATE TIMELINE
|
|
413
|
+
// ==========================
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Render state regions over a numeric timeline for services, jobs, deploys, or
|
|
417
|
+
* health checks.
|
|
418
|
+
*/
|
|
419
|
+
export const stateTimeline = opts => {
|
|
420
|
+
const width = opts.width ?? 560;
|
|
421
|
+
const rowHeight = 24;
|
|
422
|
+
const legendItems = opts.legend === false ? [] : (opts.states ?? []).map((s, i) => ({
|
|
423
|
+
label: s.label ?? s.state,
|
|
424
|
+
seriesIndex: i
|
|
425
|
+
}));
|
|
426
|
+
const legendHeight = measureLegendHeight(legendItems, width);
|
|
427
|
+
const height = opts.height ?? Math.max(120, 56 + opts.rows.length * rowHeight + legendHeight);
|
|
428
|
+
const padding = normalizePadding(opts.padding ?? {
|
|
429
|
+
top: 36,
|
|
430
|
+
right: 16,
|
|
431
|
+
bottom: 28,
|
|
432
|
+
left: 74
|
|
433
|
+
});
|
|
434
|
+
const header = renderHeader(width, opts.title, opts.subtitle);
|
|
435
|
+
const allIntervals = opts.rows.flatMap(r => r.intervals);
|
|
436
|
+
const timeValues = allIntervals.flatMap(i => [i.from, i.to]).filter(Number.isFinite);
|
|
437
|
+
if (opts.rows.length === 0 || timeValues.length === 0) {
|
|
438
|
+
return svgRoot({
|
|
439
|
+
width,
|
|
440
|
+
height,
|
|
441
|
+
className: opts.className
|
|
442
|
+
}, header.svg + `<text class="stdlib-chart-empty-text" x="${fmt(width / 2)}" y="${fmt(height / 2)}" text-anchor="middle">No data</text>`);
|
|
443
|
+
}
|
|
444
|
+
const [minT, maxT] = computeDomain(timeValues);
|
|
445
|
+
const area = computePlotArea(width, height, padding, !!opts.xAxis?.label, false, header.height, legendHeight);
|
|
446
|
+
const stateKeys = opts.states?.map(s => s.state) ?? [...new Set(allIntervals.map(i => i.state))];
|
|
447
|
+
const stateStyles = new Map((opts.states ?? []).map((s, i) => [s.state, {
|
|
448
|
+
...s,
|
|
449
|
+
index: i
|
|
450
|
+
}]));
|
|
451
|
+
const stateIndex = state => {
|
|
452
|
+
const explicit = stateStyles.get(state)?.index;
|
|
453
|
+
if (explicit !== undefined) return explicit;
|
|
454
|
+
const idx = stateKeys.indexOf(state);
|
|
455
|
+
return idx >= 0 ? idx : 0;
|
|
456
|
+
};
|
|
457
|
+
const body = [header.svg];
|
|
458
|
+
const format = opts.xAxis?.format ?? (v => fmt(v));
|
|
459
|
+
const ticks = extendDomainToNice(minT, maxT, niceStep(maxT - minT, 4)).ticks.slice(0, 6);
|
|
460
|
+
opts.rows.forEach((row, rowIdx) => {
|
|
461
|
+
const y = area.y0 + rowIdx * rowHeight;
|
|
462
|
+
body.push(`<text class="stdlib-chart-state-label" x="${fmt(area.x0 - 8)}" y="${fmt(y + rowHeight / 2)}" text-anchor="end" dominant-baseline="middle">${escapeXml(row.label)}</text>`);
|
|
463
|
+
for (const [index, interval] of row.intervals.entries()) {
|
|
464
|
+
if (!Number.isFinite(interval.from) || !Number.isFinite(interval.to)) continue;
|
|
465
|
+
const from = clamp(Math.min(interval.from, interval.to), minT, maxT);
|
|
466
|
+
const to = clamp(Math.max(interval.from, interval.to), minT, maxT);
|
|
467
|
+
const x = mapRange(from, [minT, maxT], [area.x0, area.x1]);
|
|
468
|
+
const x2 = mapRange(to, [minT, maxT], [area.x0, area.x1]);
|
|
469
|
+
const idx = stateIndex(interval.state);
|
|
470
|
+
const color = stateStyles.get(interval.state)?.color;
|
|
471
|
+
body.push(chartDatumSvg(`<rect class="stdlib-chart-state-region stdlib-chart-series-${idx % 8}"${thresholdFillAttr(color)} x="${fmt(x)}" y="${fmt(y + 3)}" width="${fmt(Math.max(1, x2 - x))}" height="${fmt(rowHeight - 6)}" rx="2"/>`, {
|
|
472
|
+
index,
|
|
473
|
+
seriesIndex: rowIdx,
|
|
474
|
+
role: "interval",
|
|
475
|
+
label: row.label,
|
|
476
|
+
anchor: [(x + x2) / 2, y + rowHeight / 2],
|
|
477
|
+
grid: [index, rowIdx],
|
|
478
|
+
values: [{
|
|
479
|
+
key: "state",
|
|
480
|
+
value: interval.state,
|
|
481
|
+
formatted: stateStyles.get(interval.state)?.label
|
|
482
|
+
}, {
|
|
483
|
+
key: "from",
|
|
484
|
+
value: from,
|
|
485
|
+
formatted: format(from)
|
|
486
|
+
}, {
|
|
487
|
+
key: "to",
|
|
488
|
+
value: to,
|
|
489
|
+
formatted: format(to)
|
|
490
|
+
}, {
|
|
491
|
+
key: "duration",
|
|
492
|
+
value: to - from
|
|
493
|
+
}]
|
|
494
|
+
}, opts.inspect));
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
for (const tick of ticks) {
|
|
498
|
+
if (tick < minT || tick > maxT) continue;
|
|
499
|
+
const x = mapRange(tick, [minT, maxT], [area.x0, area.x1]);
|
|
500
|
+
body.push(`<text class="stdlib-chart-heatmap-label" x="${fmt(x)}" y="${fmt(area.y1 + 15)}" text-anchor="middle">${escapeXml(format(tick))}</text>`);
|
|
501
|
+
}
|
|
502
|
+
if (opts.xAxis?.label) {
|
|
503
|
+
body.push(`<text class="stdlib-chart-axis-label" x="${fmt((area.x0 + area.x1) / 2)}" y="${fmt(height - legendHeight - 4)}" text-anchor="middle">${escapeXml(opts.xAxis.label)}</text>`);
|
|
504
|
+
}
|
|
505
|
+
if (legendItems.length > 0) {
|
|
506
|
+
body.push(renderLegend(legendItems, width, height - legendHeight).svg);
|
|
507
|
+
}
|
|
508
|
+
return svgRoot({
|
|
509
|
+
width,
|
|
510
|
+
height,
|
|
511
|
+
className: opts.className
|
|
512
|
+
}, body.join(""));
|
|
513
|
+
};
|
|
514
|
+
|
|
515
|
+
// Monotonically incrementing counter for per-instance gradient IDs. Using a
|
|
516
|
+
// module-level counter (vs. random) keeps output stable enough that repeated
|
|
517
|
+
// renders of the same input in a process produce predictable IDs in sequence,
|
|
518
|
+
// while still being unique within a document.
|
|
519
|
+
let sparklineGradientCounter = 0;
|
|
520
|
+
const sparklineEntries = data => data.map((value, index) => ({
|
|
521
|
+
point: typeof value === "number" ? {
|
|
522
|
+
x: index,
|
|
523
|
+
y: value
|
|
524
|
+
} : value,
|
|
525
|
+
index
|
|
526
|
+
})).filter(({
|
|
527
|
+
point
|
|
528
|
+
}) => Number.isFinite(point.x) && Number.isFinite(point.y)).sort((a, b) => a.point.x - b.point.x);
|
|
529
|
+
|
|
530
|
+
/**
|
|
531
|
+
* Render a minimalist sparkline — a tiny inline chart with no axes, no
|
|
532
|
+
* labels, and minimal padding. Designed to fit alongside text or in dense
|
|
533
|
+
* tables.
|
|
534
|
+
*
|
|
535
|
+
* Stroke uses `currentColor` by default, so it adopts the surrounding text
|
|
536
|
+
* color. Pass `className` to scope a different color.
|
|
537
|
+
*
|
|
538
|
+
* @example
|
|
539
|
+
* charts.sparkline({ data: [3, 7, 5, 9, 12, 10, 14] });
|
|
540
|
+
*
|
|
541
|
+
* @example
|
|
542
|
+
* charts.sparkline({
|
|
543
|
+
* data: [3, 7, 5, 9, 12, 10, 14],
|
|
544
|
+
* smooth: true,
|
|
545
|
+
* showLast: true,
|
|
546
|
+
* width: 120,
|
|
547
|
+
* });
|
|
548
|
+
*
|
|
549
|
+
* @example
|
|
550
|
+
* // Dashboard-tile look: stroke + soft gradient fill fading to transparent.
|
|
551
|
+
* charts.sparkline({ data: [3, 7, 5, 9, 12, 10, 14], area: true });
|
|
552
|
+
*/
|
|
553
|
+
export const sparkline = opts => {
|
|
554
|
+
const width = opts.width ?? 80;
|
|
555
|
+
const height = opts.height ?? 20;
|
|
556
|
+
const entries = sparklineEntries(opts.data);
|
|
557
|
+
const points = entries.map(entry => entry.point);
|
|
558
|
+
if (points.length < 2) {
|
|
559
|
+
// Empty spark — return a same-sized invisible svg so layout stays stable.
|
|
560
|
+
return svgRoot({
|
|
561
|
+
width,
|
|
562
|
+
height,
|
|
563
|
+
className: opts.className
|
|
564
|
+
}, "");
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// Inset reserves space so the stroke and any dots sit fully inside the
|
|
568
|
+
// viewBox. Dots have r=2; without dots the line stroke (1.5px wide) only
|
|
569
|
+
// needs ~0.75px of breathing room.
|
|
570
|
+
const DOT_R = 2;
|
|
571
|
+
const hasDots = !!(opts.showLast || opts.showMinMax);
|
|
572
|
+
const inset = hasDots ? DOT_R + 0.75 : 1.5;
|
|
573
|
+
const xs = points.map(p => p.x);
|
|
574
|
+
const ys = points.map(p => p.y);
|
|
575
|
+
const xDomain = computeDomain(xs);
|
|
576
|
+
const yDomain = computeDomain(ys);
|
|
577
|
+
const sorted = [...points].sort((a, b) => a.x - b.x);
|
|
578
|
+
const mapped = sorted.map(p => ({
|
|
579
|
+
x: mapRange(p.x, xDomain, [inset, width - inset]),
|
|
580
|
+
y: mapRange(p.y, yDomain, [height - inset, inset])
|
|
581
|
+
}));
|
|
582
|
+
const pathFn = opts.smooth === false ? linePathD : smoothPathD;
|
|
583
|
+
const linePath = pathFn(mapped);
|
|
584
|
+
const body = [];
|
|
585
|
+
if (opts.area) {
|
|
586
|
+
// Gradient-fill area UNDER the stroke line: fades from a translucent
|
|
587
|
+
// currentColor at the top to fully transparent at the bottom. The fill
|
|
588
|
+
// path extends all the way down to the bottom of the viewBox; the
|
|
589
|
+
// gradient handles the visual fade-out — no need for special bottom
|
|
590
|
+
// padding. Stroke renders on top via the regular `.sparkline` path below.
|
|
591
|
+
const gradId = `stdlib-spark-grad-${++sparklineGradientCounter}`;
|
|
592
|
+
const first = mapped[0];
|
|
593
|
+
const last = mapped[mapped.length - 1];
|
|
594
|
+
const areaPath = `${linePath} L ${fmt(last.x)} ${fmt(height)} L ${fmt(first.x)} ${fmt(height)} Z`;
|
|
595
|
+
body.push(`<defs><linearGradient id="${gradId}" x1="0" y1="0" x2="0" y2="1">` + `<stop offset="0%" stop-color="currentColor" stop-opacity="0.28"/>` + `<stop offset="100%" stop-color="currentColor" stop-opacity="0"/>` + `</linearGradient></defs>`);
|
|
596
|
+
body.push(`<path class="stdlib-chart-sparkline-area" fill="url(#${gradId})" d="${areaPath}"/>`);
|
|
597
|
+
}
|
|
598
|
+
body.push(`<path class="stdlib-chart-sparkline" d="${linePath}"/>`);
|
|
599
|
+
if (opts.showMinMax) {
|
|
600
|
+
let minIdx = 0;
|
|
601
|
+
let maxIdx = 0;
|
|
602
|
+
let minV = Number.POSITIVE_INFINITY;
|
|
603
|
+
let maxV = Number.NEGATIVE_INFINITY;
|
|
604
|
+
for (let i = 0; i < sorted.length; i++) {
|
|
605
|
+
const v = sorted[i].y;
|
|
606
|
+
if (v < minV) {
|
|
607
|
+
minV = v;
|
|
608
|
+
minIdx = i;
|
|
609
|
+
}
|
|
610
|
+
if (v > maxV) {
|
|
611
|
+
maxV = v;
|
|
612
|
+
maxIdx = i;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
if (minV < maxV) {
|
|
616
|
+
const max = mapped[maxIdx];
|
|
617
|
+
const min = mapped[minIdx];
|
|
618
|
+
body.push(`<circle class="stdlib-chart-sparkline-max" cx="${fmt(max.x)}" cy="${fmt(max.y)}" r="2"/>`);
|
|
619
|
+
body.push(`<circle class="stdlib-chart-sparkline-min" cx="${fmt(min.x)}" cy="${fmt(min.y)}" r="2"/>`);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
if (opts.showLast && mapped.length > 0) {
|
|
623
|
+
const last = mapped[mapped.length - 1];
|
|
624
|
+
body.push(`<circle class="stdlib-chart-sparkline-last" cx="${fmt(last.x)}" cy="${fmt(last.y)}" r="2"/>`);
|
|
625
|
+
}
|
|
626
|
+
if (opts.inspect) sorted.forEach((p, index) => body.push(inspectionPoint({
|
|
627
|
+
index: entries[index].index,
|
|
628
|
+
role: "point",
|
|
629
|
+
anchor: [mapped[index].x, mapped[index].y],
|
|
630
|
+
values: pointValues(p)
|
|
631
|
+
}, opts.inspect)));
|
|
632
|
+
return svgRoot({
|
|
633
|
+
width,
|
|
634
|
+
height,
|
|
635
|
+
className: opts.className
|
|
636
|
+
}, body.join(""));
|
|
637
|
+
};
|
|
638
|
+
//# sourceMappingURL=svg-renderers.js.map
|