@k2b/ui 0.49.0 → 0.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base.css +70 -1
- package/dist/browser/actions/Button.js.map +1 -1
- package/dist/browser/actions/CommandList.js +861 -0
- package/dist/browser/actions/CommandList.js.map +1 -0
- package/dist/browser/actions/CommandMenu.js +237 -0
- package/dist/browser/actions/CommandMenu.js.map +1 -0
- package/dist/browser/actions/ContextMenu.js +3 -0
- package/dist/browser/actions/ContextMenu.js.map +1 -1
- package/dist/browser/actions/Dropdown.js +43 -10
- package/dist/browser/actions/Dropdown.js.map +1 -1
- package/dist/browser/actions/command-dock.js +47 -0
- package/dist/browser/actions/command-dock.js.map +1 -0
- package/dist/browser/actions/command-items.js +84 -0
- package/dist/browser/actions/command-items.js.map +1 -0
- package/dist/browser/actions/command-messages.js +42 -0
- package/dist/browser/actions/command-messages.js.map +1 -0
- package/dist/browser/actions/index.js +1 -0
- package/dist/browser/actions/index.js.map +1 -1
- package/dist/browser/charts/core/area.js +188 -0
- package/dist/browser/charts/core/area.js.map +1 -0
- package/dist/browser/charts/core/calendar.js +186 -0
- package/dist/browser/charts/core/calendar.js.map +1 -0
- package/dist/browser/charts/core/chart-map-data.js +9 -0
- package/dist/browser/charts/core/chart-map-data.js.map +1 -0
- package/dist/browser/charts/core/chart-messages.js +17 -0
- package/dist/browser/charts/core/chart-messages.js.map +1 -0
- package/dist/browser/charts/core/hbar-layout.js +118 -0
- package/dist/browser/charts/core/hbar-layout.js.map +1 -0
- package/dist/browser/charts/core/hbar.js +39 -0
- package/dist/browser/charts/core/hbar.js.map +1 -0
- package/dist/browser/charts/core/index.js +17 -0
- package/dist/browser/charts/core/index.js.map +1 -0
- package/dist/browser/charts/core/inspection.js +9 -0
- package/dist/browser/charts/core/inspection.js.map +1 -0
- package/dist/browser/charts/core/map.js +116 -0
- package/dist/browser/charts/core/map.js.map +1 -0
- package/dist/browser/charts/core/registry.js +35 -0
- package/dist/browser/charts/core/registry.js.map +1 -0
- package/dist/browser/charts/core/render-size.js +13 -0
- package/dist/browser/charts/core/render-size.js.map +1 -0
- package/dist/browser/charts/core/render.js +113 -0
- package/dist/browser/charts/core/render.js.map +1 -0
- package/dist/browser/charts/core/snapshot.js +65 -0
- package/dist/browser/charts/core/snapshot.js.map +1 -0
- package/dist/browser/charts/core/svg-renderers.js +2406 -0
- package/dist/browser/charts/core/svg-renderers.js.map +1 -0
- package/dist/browser/charts/core/svg.js +21 -0
- package/dist/browser/charts/core/svg.js.map +1 -0
- package/dist/browser/charts/core/termination.test-fixture.js +162 -0
- package/dist/browser/charts/core/termination.test-fixture.js.map +1 -0
- package/dist/browser/charts/core/text.js +13 -0
- package/dist/browser/charts/core/text.js.map +1 -0
- package/dist/browser/charts/core/types.js +6 -0
- package/dist/browser/charts/core/types.js.map +1 -0
- package/dist/browser/charts/core/waterfall.js +162 -0
- package/dist/browser/charts/core/waterfall.js.map +1 -0
- package/dist/browser/charts/description.js +2 -0
- package/dist/browser/charts/description.js.map +1 -0
- package/dist/browser/charts.js +4 -2
- package/dist/browser/charts.js.map +1 -1
- package/dist/browser/content/BalanceSummary.js +106 -0
- package/dist/browser/content/BalanceSummary.js.map +1 -0
- package/dist/browser/content/Chart.js +21 -616
- package/dist/browser/content/Chart.js.map +1 -1
- package/dist/browser/content/ChartExplorer.js +366 -122
- package/dist/browser/content/ChartExplorer.js.map +1 -1
- package/dist/browser/content/ChartRoot.js +632 -0
- package/dist/browser/content/ChartRoot.js.map +1 -0
- package/dist/browser/content/ChartSnapshotView.js +16 -9
- package/dist/browser/content/ChartSnapshotView.js.map +1 -1
- package/dist/browser/content/ChartSparkline.js +24 -0
- package/dist/browser/content/ChartSparkline.js.map +1 -0
- package/dist/browser/content/DataTable.js +676 -293
- package/dist/browser/content/DataTable.js.map +1 -1
- package/dist/browser/content/DataTableTools.js +119 -0
- package/dist/browser/content/DataTableTools.js.map +1 -0
- package/dist/browser/content/FileView.js +111 -61
- package/dist/browser/content/FileView.js.map +1 -1
- package/dist/browser/content/FlowAmount.js +82 -0
- package/dist/browser/content/FlowAmount.js.map +1 -0
- package/dist/browser/content/Lightbox.js +8 -8
- package/dist/browser/content/Lightbox.js.map +1 -1
- package/dist/browser/content/MapView.js +30 -28
- package/dist/browser/content/MapView.js.map +1 -1
- package/dist/browser/content/PdfPreview.js +84 -52
- package/dist/browser/content/PdfPreview.js.map +1 -1
- package/dist/browser/content/PdfViewer.js +588 -0
- package/dist/browser/content/PdfViewer.js.map +1 -0
- package/dist/browser/content/balance-summary-messages.js +26 -0
- package/dist/browser/content/balance-summary-messages.js.map +1 -0
- package/dist/browser/content/chart-bar.js +251 -21
- package/dist/browser/content/chart-bar.js.map +1 -1
- package/dist/browser/content/chart-calendar.js +43 -0
- package/dist/browser/content/chart-calendar.js.map +1 -0
- package/dist/browser/content/chart-inspection-core.js +178 -50
- package/dist/browser/content/chart-inspection-core.js.map +1 -1
- package/dist/browser/content/chart-inspection.js.map +1 -1
- package/dist/browser/content/chart-line-gaps.js +2 -2
- package/dist/browser/content/chart-line-gaps.js.map +1 -1
- package/dist/browser/content/chart-map-viewport.js.map +1 -1
- package/dist/browser/content/chart-message-catalog.js +174 -0
- package/dist/browser/content/chart-message-catalog.js.map +1 -0
- package/dist/browser/content/chart-messages.js +2 -138
- package/dist/browser/content/chart-messages.js.map +1 -1
- package/dist/browser/content/chart-snapshot.js +1 -62
- package/dist/browser/content/chart-snapshot.js.map +1 -1
- package/dist/browser/content/chart-state-timeline.js +1 -1
- package/dist/browser/content/chart-state-timeline.js.map +1 -1
- package/dist/browser/content/chart-svg.js +4 -2
- package/dist/browser/content/chart-svg.js.map +1 -1
- package/dist/browser/content/chart-time-axis.js +139 -0
- package/dist/browser/content/chart-time-axis.js.map +1 -0
- package/dist/browser/content/data-table-columns.js +160 -0
- package/dist/browser/content/data-table-columns.js.map +1 -0
- package/dist/browser/content/data-table-messages.js +38 -2
- package/dist/browser/content/data-table-messages.js.map +1 -1
- package/dist/browser/content/flow-amount-messages.js +26 -0
- package/dist/browser/content/flow-amount-messages.js.map +1 -0
- package/dist/browser/content/index.js +5 -0
- package/dist/browser/content/index.js.map +1 -1
- package/dist/browser/content/pdf-document.js +29 -0
- package/dist/browser/content/pdf-document.js.map +1 -0
- package/dist/browser/content/pdf-limits.js +31 -0
- package/dist/browser/content/pdf-limits.js.map +1 -0
- package/dist/browser/content/pdf-messages.js +34 -2
- package/dist/browser/content/pdf-messages.js.map +1 -1
- package/dist/browser/content/pdf-viewer-engine.js +57 -0
- package/dist/browser/content/pdf-viewer-worker.js +28 -0
- package/dist/browser/inputs/ChoiceInputs.js +94 -51
- package/dist/browser/inputs/ChoiceInputs.js.map +1 -1
- package/dist/browser/inputs/ChoiceSlider.js +75 -58
- package/dist/browser/inputs/ChoiceSlider.js.map +1 -1
- package/dist/browser/inputs/DatePicker.js +118 -102
- package/dist/browser/inputs/DatePicker.js.map +1 -1
- package/dist/browser/inputs/PeriodPicker.js +874 -0
- package/dist/browser/inputs/PeriodPicker.js.map +1 -0
- package/dist/browser/inputs/SelectChip.js +50 -17
- package/dist/browser/inputs/SelectChip.js.map +1 -1
- package/dist/browser/inputs/date-picker.js +13 -0
- package/dist/browser/inputs/date-picker.js.map +1 -1
- package/dist/browser/inputs/index.js +4 -1
- package/dist/browser/inputs/index.js.map +1 -1
- package/dist/browser/inputs/input-messages.js +8 -2
- package/dist/browser/inputs/input-messages.js.map +1 -1
- package/dist/browser/inputs/markdown/MarkdownEditor.js +14 -10
- package/dist/browser/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/browser/inputs/markdown/SlashCommands.js +402 -0
- package/dist/browser/inputs/markdown/SlashCommands.js.map +1 -0
- package/dist/browser/inputs/period-picker-messages.js +71 -0
- package/dist/browser/inputs/period-picker-messages.js.map +1 -0
- package/dist/browser/inputs/period.js +263 -0
- package/dist/browser/inputs/period.js.map +1 -0
- package/dist/browser/intl/Format.js +31 -8
- package/dist/browser/intl/Format.js.map +1 -1
- package/dist/browser/layout/AppWorkspace.js +7 -1
- package/dist/browser/layout/AppWorkspace.js.map +1 -1
- package/dist/browser/layout/DetailPanel.js +147 -120
- package/dist/browser/layout/DetailPanel.js.map +1 -1
- package/dist/browser/layout/Discussion.js +101 -108
- package/dist/browser/layout/Discussion.js.map +1 -1
- package/dist/browser/layout/index.js.map +1 -1
- package/dist/browser/surfaces/BudgetList.js +281 -0
- package/dist/browser/surfaces/BudgetList.js.map +1 -0
- package/dist/browser/surfaces/DescriptionList.js +5 -2
- package/dist/browser/surfaces/DescriptionList.js.map +1 -1
- package/dist/browser/surfaces/ProgressBar.js +134 -21
- package/dist/browser/surfaces/ProgressBar.js.map +1 -1
- package/dist/browser/surfaces/StatCell.js +327 -146
- package/dist/browser/surfaces/StatCell.js.map +1 -1
- package/dist/browser/surfaces/StatGrid.js +75 -57
- package/dist/browser/surfaces/StatGrid.js.map +1 -1
- package/dist/browser/surfaces/budget-messages.js +64 -0
- package/dist/browser/surfaces/budget-messages.js.map +1 -0
- package/dist/browser/surfaces/delta-badge.js +79 -0
- package/dist/browser/surfaces/delta-badge.js.map +1 -0
- package/dist/browser/surfaces/index.js +2 -1
- package/dist/browser/surfaces/index.js.map +1 -1
- package/dist/browser/surfaces/person-color.js +2 -2
- package/dist/browser/surfaces/person-color.js.map +1 -1
- package/dist/browser/surfaces/stat-cell-messages.js +41 -0
- package/dist/browser/surfaces/stat-cell-messages.js.map +1 -0
- package/dist/browser/widgets/Dashboard.js +137 -0
- package/dist/browser/widgets/Dashboard.js.map +1 -0
- package/dist/browser/widgets/DashboardFrame.js +310 -0
- package/dist/browser/widgets/DashboardFrame.js.map +1 -0
- package/dist/browser/widgets/index.js +2 -0
- package/dist/browser/widgets/index.js.map +1 -1
- package/dist/licenses/pdfjs-dist.txt +177 -0
- package/dist/ssr/actions/Button.js.map +1 -1
- package/dist/ssr/actions/CommandList.js +638 -0
- package/dist/ssr/actions/CommandList.js.map +1 -0
- package/dist/ssr/actions/CommandMenu.js +197 -0
- package/dist/ssr/actions/CommandMenu.js.map +1 -0
- package/dist/ssr/actions/ContextMenu.js +3 -0
- package/dist/ssr/actions/ContextMenu.js.map +1 -1
- package/dist/ssr/actions/Dropdown.js +43 -10
- package/dist/ssr/actions/Dropdown.js.map +1 -1
- package/dist/ssr/actions/command-dock.js +47 -0
- package/dist/ssr/actions/command-dock.js.map +1 -0
- package/dist/ssr/actions/command-items.js +84 -0
- package/dist/ssr/actions/command-items.js.map +1 -0
- package/dist/ssr/actions/command-messages.js +42 -0
- package/dist/ssr/actions/command-messages.js.map +1 -0
- package/dist/ssr/actions/index.js +1 -0
- package/dist/ssr/actions/index.js.map +1 -1
- package/dist/ssr/charts/core/area.js +188 -0
- package/dist/ssr/charts/core/area.js.map +1 -0
- package/dist/ssr/charts/core/calendar.js +186 -0
- package/dist/ssr/charts/core/calendar.js.map +1 -0
- package/dist/ssr/charts/core/chart-map-data.js +9 -0
- package/dist/ssr/charts/core/chart-map-data.js.map +1 -0
- package/dist/ssr/charts/core/chart-messages.js +17 -0
- package/dist/ssr/charts/core/chart-messages.js.map +1 -0
- package/dist/ssr/charts/core/hbar-layout.js +118 -0
- package/dist/ssr/charts/core/hbar-layout.js.map +1 -0
- package/dist/ssr/charts/core/hbar.js +39 -0
- package/dist/ssr/charts/core/hbar.js.map +1 -0
- package/dist/ssr/charts/core/index.js +17 -0
- package/dist/ssr/charts/core/index.js.map +1 -0
- package/dist/ssr/charts/core/inspection.js +9 -0
- package/dist/ssr/charts/core/inspection.js.map +1 -0
- package/dist/ssr/charts/core/map.js +116 -0
- package/dist/ssr/charts/core/map.js.map +1 -0
- package/dist/ssr/charts/core/registry.js +35 -0
- package/dist/ssr/charts/core/registry.js.map +1 -0
- package/dist/ssr/charts/core/render-size.js +13 -0
- package/dist/ssr/charts/core/render-size.js.map +1 -0
- package/dist/ssr/charts/core/render.js +113 -0
- package/dist/ssr/charts/core/render.js.map +1 -0
- package/dist/ssr/charts/core/snapshot.js +65 -0
- package/dist/ssr/charts/core/snapshot.js.map +1 -0
- package/dist/ssr/charts/core/svg-renderers.js +2406 -0
- package/dist/ssr/charts/core/svg-renderers.js.map +1 -0
- package/dist/ssr/charts/core/svg.js +21 -0
- package/dist/ssr/charts/core/svg.js.map +1 -0
- package/dist/ssr/charts/core/termination.test-fixture.js +162 -0
- package/dist/ssr/charts/core/termination.test-fixture.js.map +1 -0
- package/dist/ssr/charts/core/text.js +13 -0
- package/dist/ssr/charts/core/text.js.map +1 -0
- package/dist/ssr/charts/core/types.js +6 -0
- package/dist/ssr/charts/core/types.js.map +1 -0
- package/dist/ssr/charts/core/waterfall.js +162 -0
- package/dist/ssr/charts/core/waterfall.js.map +1 -0
- package/dist/ssr/charts/description.js +2 -0
- package/dist/ssr/charts/description.js.map +1 -0
- package/dist/ssr/charts.js +4 -2
- package/dist/ssr/charts.js.map +1 -1
- package/dist/ssr/content/BalanceSummary.js +75 -0
- package/dist/ssr/content/BalanceSummary.js.map +1 -0
- package/dist/ssr/content/Chart.js +21 -483
- package/dist/ssr/content/Chart.js.map +1 -1
- package/dist/ssr/content/ChartExplorer.js +190 -46
- package/dist/ssr/content/ChartExplorer.js.map +1 -1
- package/dist/ssr/content/ChartRoot.js +475 -0
- package/dist/ssr/content/ChartRoot.js.map +1 -0
- package/dist/ssr/content/ChartSnapshotView.js +5 -1
- package/dist/ssr/content/ChartSnapshotView.js.map +1 -1
- package/dist/ssr/content/ChartSparkline.js +24 -0
- package/dist/ssr/content/ChartSparkline.js.map +1 -0
- package/dist/ssr/content/DataTable.js +287 -78
- package/dist/ssr/content/DataTable.js.map +1 -1
- package/dist/ssr/content/DataTableTools.js +106 -0
- package/dist/ssr/content/DataTableTools.js.map +1 -0
- package/dist/ssr/content/FileView.js +56 -7
- package/dist/ssr/content/FileView.js.map +1 -1
- package/dist/ssr/content/FlowAmount.js +58 -0
- package/dist/ssr/content/FlowAmount.js.map +1 -0
- package/dist/ssr/content/Lightbox.js +8 -8
- package/dist/ssr/content/Lightbox.js.map +1 -1
- package/dist/ssr/content/MapView.js +9 -9
- package/dist/ssr/content/MapView.js.map +1 -1
- package/dist/ssr/content/PdfPreview.js +49 -20
- package/dist/ssr/content/PdfPreview.js.map +1 -1
- package/dist/ssr/content/PdfViewer.js +484 -0
- package/dist/ssr/content/PdfViewer.js.map +1 -0
- package/dist/ssr/content/balance-summary-messages.js +26 -0
- package/dist/ssr/content/balance-summary-messages.js.map +1 -0
- package/dist/ssr/content/chart-bar.js +251 -21
- package/dist/ssr/content/chart-bar.js.map +1 -1
- package/dist/ssr/content/chart-calendar.js +43 -0
- package/dist/ssr/content/chart-calendar.js.map +1 -0
- package/dist/ssr/content/chart-inspection-core.js +178 -50
- package/dist/ssr/content/chart-inspection-core.js.map +1 -1
- package/dist/ssr/content/chart-inspection.js.map +1 -1
- package/dist/ssr/content/chart-line-gaps.js +2 -2
- package/dist/ssr/content/chart-line-gaps.js.map +1 -1
- package/dist/ssr/content/chart-map-viewport.js.map +1 -1
- package/dist/ssr/content/chart-message-catalog.js +174 -0
- package/dist/ssr/content/chart-message-catalog.js.map +1 -0
- package/dist/ssr/content/chart-messages.js +2 -138
- package/dist/ssr/content/chart-messages.js.map +1 -1
- package/dist/ssr/content/chart-snapshot.js +1 -62
- package/dist/ssr/content/chart-snapshot.js.map +1 -1
- package/dist/ssr/content/chart-state-timeline.js +1 -1
- package/dist/ssr/content/chart-state-timeline.js.map +1 -1
- package/dist/ssr/content/chart-svg.js +4 -2
- package/dist/ssr/content/chart-svg.js.map +1 -1
- package/dist/ssr/content/chart-time-axis.js +139 -0
- package/dist/ssr/content/chart-time-axis.js.map +1 -0
- package/dist/ssr/content/data-table-columns.js +160 -0
- package/dist/ssr/content/data-table-columns.js.map +1 -0
- package/dist/ssr/content/data-table-messages.js +38 -2
- package/dist/ssr/content/data-table-messages.js.map +1 -1
- package/dist/ssr/content/flow-amount-messages.js +26 -0
- package/dist/ssr/content/flow-amount-messages.js.map +1 -0
- package/dist/ssr/content/index.js +5 -0
- package/dist/ssr/content/index.js.map +1 -1
- package/dist/ssr/content/pdf-document.js +29 -0
- package/dist/ssr/content/pdf-document.js.map +1 -0
- package/dist/ssr/content/pdf-limits.js +31 -0
- package/dist/ssr/content/pdf-limits.js.map +1 -0
- package/dist/ssr/content/pdf-messages.js +34 -2
- package/dist/ssr/content/pdf-messages.js.map +1 -1
- package/dist/ssr/inputs/ChoiceInputs.js +49 -12
- package/dist/ssr/inputs/ChoiceInputs.js.map +1 -1
- package/dist/ssr/inputs/ChoiceSlider.js +17 -12
- package/dist/ssr/inputs/ChoiceSlider.js.map +1 -1
- package/dist/ssr/inputs/DatePicker.js +19 -13
- package/dist/ssr/inputs/DatePicker.js.map +1 -1
- package/dist/ssr/inputs/PeriodPicker.js +598 -0
- package/dist/ssr/inputs/PeriodPicker.js.map +1 -0
- package/dist/ssr/inputs/SelectChip.js +26 -9
- package/dist/ssr/inputs/SelectChip.js.map +1 -1
- package/dist/ssr/inputs/date-picker.js +13 -0
- package/dist/ssr/inputs/date-picker.js.map +1 -1
- package/dist/ssr/inputs/index.js +4 -1
- package/dist/ssr/inputs/index.js.map +1 -1
- package/dist/ssr/inputs/input-messages.js +8 -2
- package/dist/ssr/inputs/input-messages.js.map +1 -1
- package/dist/ssr/inputs/markdown/MarkdownEditor.js +3 -2
- package/dist/ssr/inputs/markdown/MarkdownEditor.js.map +1 -1
- package/dist/ssr/inputs/markdown/SlashCommands.js +339 -0
- package/dist/ssr/inputs/markdown/SlashCommands.js.map +1 -0
- package/dist/ssr/inputs/period-picker-messages.js +71 -0
- package/dist/ssr/inputs/period-picker-messages.js.map +1 -0
- package/dist/ssr/inputs/period.js +263 -0
- package/dist/ssr/inputs/period.js.map +1 -0
- package/dist/ssr/intl/Format.js +22 -2
- package/dist/ssr/intl/Format.js.map +1 -1
- package/dist/ssr/layout/AppWorkspace.js +7 -1
- package/dist/ssr/layout/AppWorkspace.js.map +1 -1
- package/dist/ssr/layout/DetailPanel.js +27 -4
- package/dist/ssr/layout/DetailPanel.js.map +1 -1
- package/dist/ssr/layout/Discussion.js +16 -2
- package/dist/ssr/layout/Discussion.js.map +1 -1
- package/dist/ssr/layout/index.js.map +1 -1
- package/dist/ssr/surfaces/BudgetList.js +170 -0
- package/dist/ssr/surfaces/BudgetList.js.map +1 -0
- package/dist/ssr/surfaces/DescriptionList.js +1 -1
- package/dist/ssr/surfaces/DescriptionList.js.map +1 -1
- package/dist/ssr/surfaces/ProgressBar.js +96 -5
- package/dist/ssr/surfaces/ProgressBar.js.map +1 -1
- package/dist/ssr/surfaces/StatCell.js +157 -52
- package/dist/ssr/surfaces/StatCell.js.map +1 -1
- package/dist/ssr/surfaces/StatGrid.js +24 -35
- package/dist/ssr/surfaces/StatGrid.js.map +1 -1
- package/dist/ssr/surfaces/budget-messages.js +64 -0
- package/dist/ssr/surfaces/budget-messages.js.map +1 -0
- package/dist/ssr/surfaces/delta-badge.js +55 -0
- package/dist/ssr/surfaces/delta-badge.js.map +1 -0
- package/dist/ssr/surfaces/index.js +2 -1
- package/dist/ssr/surfaces/index.js.map +1 -1
- package/dist/ssr/surfaces/person-color.js +2 -2
- package/dist/ssr/surfaces/person-color.js.map +1 -1
- package/dist/ssr/surfaces/stat-cell-messages.js +41 -0
- package/dist/ssr/surfaces/stat-cell-messages.js.map +1 -0
- package/dist/ssr/widgets/Dashboard.js +84 -0
- package/dist/ssr/widgets/Dashboard.js.map +1 -0
- package/dist/ssr/widgets/DashboardFrame.js +200 -0
- package/dist/ssr/widgets/DashboardFrame.js.map +1 -0
- package/dist/ssr/widgets/index.js +2 -0
- package/dist/ssr/widgets/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/types/actions/Button.d.ts +1 -1
- package/dist/types/actions/CommandList.d.ts +120 -0
- package/dist/types/actions/CommandMenu.d.ts +39 -0
- package/dist/types/actions/Dropdown.d.ts +17 -0
- package/dist/types/actions/command-dock.d.ts +8 -0
- package/dist/types/actions/command-items.d.ts +134 -0
- package/dist/types/actions/command-messages.d.ts +19 -0
- package/dist/types/actions/index.d.ts +3 -0
- package/dist/types/charts/core/area.d.ts +62 -0
- package/dist/types/charts/core/calendar.d.ts +57 -0
- package/dist/types/charts/core/chart-map-data.d.ts +3 -0
- package/dist/types/charts/core/chart-messages.d.ts +5 -0
- package/dist/types/charts/core/hbar-layout.d.ts +74 -0
- package/dist/types/charts/core/hbar.d.ts +13 -0
- package/dist/types/charts/core/index.d.ts +16 -0
- package/dist/types/charts/core/inspection.d.ts +16 -0
- package/dist/types/charts/core/map.d.ts +3 -0
- package/dist/types/charts/core/registry.d.ts +33 -0
- package/dist/types/charts/core/render-size.d.ts +7 -0
- package/dist/types/charts/core/render.d.ts +37 -0
- package/dist/types/charts/core/snapshot.d.ts +27 -0
- package/dist/types/charts/core/svg-renderers.d.ts +722 -0
- package/dist/types/charts/core/svg.d.ts +20 -0
- package/dist/types/charts/core/termination.test-fixture.d.ts +1 -0
- package/dist/types/charts/core/text.d.ts +5 -0
- package/dist/types/charts/core/types.d.ts +20 -0
- package/dist/types/charts/core/waterfall.d.ts +68 -0
- package/dist/types/charts/description.d.ts +226 -0
- package/dist/types/charts.d.ts +5 -2
- package/dist/types/content/BalanceSummary.d.ts +29 -0
- package/dist/types/content/Chart.d.ts +19 -117
- package/dist/types/content/ChartExplorer.d.ts +43 -2
- package/dist/types/content/ChartRoot.d.ts +92 -0
- package/dist/types/content/ChartSnapshotView.d.ts +1 -0
- package/dist/types/content/ChartSparkline.d.ts +5 -0
- package/dist/types/content/DataTable.d.ts +28 -0
- package/dist/types/content/DataTableTools.d.ts +44 -0
- package/dist/types/content/FlowAmount.d.ts +28 -0
- package/dist/types/content/PdfViewer.d.ts +32 -0
- package/dist/types/content/balance-summary-messages.d.ts +11 -0
- package/dist/types/content/chart-bar.d.ts +95 -2
- package/dist/types/content/chart-calendar.d.ts +4 -0
- package/dist/types/content/chart-inspection-core.d.ts +21 -16
- package/dist/types/content/chart-inspection.d.ts +5 -1
- package/dist/types/content/chart-map-viewport.d.ts +1 -1
- package/dist/types/content/chart-message-catalog.d.ts +84 -0
- package/dist/types/content/chart-messages.d.ts +2 -33
- package/dist/types/content/chart-snapshot.d.ts +1 -26
- package/dist/types/content/chart-svg.d.ts +1 -1
- package/dist/types/content/chart-time-axis.d.ts +26 -0
- package/dist/types/content/data-table-columns.d.ts +72 -0
- package/dist/types/content/data-table-messages.d.ts +18 -0
- package/dist/types/content/flow-amount-messages.d.ts +11 -0
- package/dist/types/content/index.d.ts +12 -2
- package/dist/types/content/pdf-document.d.ts +5 -0
- package/dist/types/content/pdf-engine.d.ts +9 -0
- package/dist/types/content/pdf-limits.d.ts +43 -0
- package/dist/types/content/pdf-messages.d.ts +16 -0
- package/dist/types/inputs/ChoiceInputs.d.ts +4 -0
- package/dist/types/inputs/ChoiceSlider.d.ts +12 -0
- package/dist/types/inputs/DatePicker.d.ts +22 -0
- package/dist/types/inputs/PeriodPicker.d.ts +24 -0
- package/dist/types/inputs/SelectChip.d.ts +2 -0
- package/dist/types/inputs/date-picker.d.ts +6 -0
- package/dist/types/inputs/index.d.ts +8 -2
- package/dist/types/inputs/input-messages.d.ts +3 -0
- package/dist/types/inputs/markdown/MarkdownEditor.d.ts +5 -0
- package/dist/types/inputs/markdown/SlashCommands.d.ts +20 -0
- package/dist/types/inputs/period-picker-messages.d.ts +34 -0
- package/dist/types/inputs/period.d.ts +134 -0
- package/dist/types/intl/Format.d.ts +5 -0
- package/dist/types/layout/AppWorkspace.d.ts +5 -0
- package/dist/types/layout/DetailPanel.d.ts +12 -0
- package/dist/types/layout/index.d.ts +1 -1
- package/dist/types/surfaces/BudgetList.d.ts +42 -0
- package/dist/types/surfaces/DescriptionList.d.ts +5 -0
- package/dist/types/surfaces/ProgressBar.d.ts +38 -2
- package/dist/types/surfaces/StatCell.d.ts +40 -2
- package/dist/types/surfaces/StatGrid.d.ts +3 -1
- package/dist/types/surfaces/budget-messages.d.ts +30 -0
- package/dist/types/surfaces/delta-badge.d.ts +10 -0
- package/dist/types/surfaces/index.d.ts +4 -3
- package/dist/types/surfaces/person-color.d.ts +2 -2
- package/dist/types/surfaces/stat-cell-messages.d.ts +19 -0
- package/dist/types/widgets/Dashboard.d.ts +42 -0
- package/dist/types/widgets/DashboardFrame.d.ts +58 -0
- package/dist/types/widgets/index.d.ts +2 -0
- package/package.json +8 -1
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// Draws every axis kind with values that the float spacing or the tick budget used to keep counting forever.
|
|
2
|
+
// termination.test.ts runs this file in a child process with a deadline, so a regression fails instead of hanging.
|
|
3
|
+
import { chartTimeStep, chartTimeTicks } from "../../content/chart-time-axis";
|
|
4
|
+
import { renderChartSvg } from "./render";
|
|
5
|
+
import { extendDomainToNice, stateTimeline } from "./svg";
|
|
6
|
+
|
|
7
|
+
// One value at 1e17 has a float spacing of 16, so its ±1 padding collapses to a zero range.
|
|
8
|
+
const big = 1e17;
|
|
9
|
+
const pair = (x, y) => [{
|
|
10
|
+
x,
|
|
11
|
+
y
|
|
12
|
+
}];
|
|
13
|
+
const cases = {
|
|
14
|
+
"line, auto y": () => renderChartSvg({
|
|
15
|
+
kind: "line",
|
|
16
|
+
series: [{
|
|
17
|
+
label: "A",
|
|
18
|
+
data: [...pair(0, big), ...pair(1, big)]
|
|
19
|
+
}]
|
|
20
|
+
}, 480, 280),
|
|
21
|
+
"line, nearly equal y": () => renderChartSvg({
|
|
22
|
+
kind: "line",
|
|
23
|
+
series: [{
|
|
24
|
+
label: "A",
|
|
25
|
+
data: [...pair(0, big), ...pair(1, big + 16)]
|
|
26
|
+
}]
|
|
27
|
+
}, 480, 280),
|
|
28
|
+
"line, auto x": () => renderChartSvg({
|
|
29
|
+
kind: "line",
|
|
30
|
+
series: [{
|
|
31
|
+
label: "A",
|
|
32
|
+
data: [...pair(big, 1), ...pair(big, 2)]
|
|
33
|
+
}]
|
|
34
|
+
}, 480, 280),
|
|
35
|
+
"line, fixed y with a tick target past the budget": () => renderChartSvg({
|
|
36
|
+
kind: "line",
|
|
37
|
+
series: [{
|
|
38
|
+
label: "A",
|
|
39
|
+
data: pair(0, 0.5)
|
|
40
|
+
}],
|
|
41
|
+
yAxis: {
|
|
42
|
+
domain: [0, 1],
|
|
43
|
+
ticks: 1e9
|
|
44
|
+
}
|
|
45
|
+
}, 480, 280),
|
|
46
|
+
"line, time x": () => renderChartSvg({
|
|
47
|
+
kind: "line",
|
|
48
|
+
series: [{
|
|
49
|
+
label: "A",
|
|
50
|
+
data: pair(big, 1)
|
|
51
|
+
}],
|
|
52
|
+
timeAxis: {
|
|
53
|
+
timeZone: "UTC"
|
|
54
|
+
}
|
|
55
|
+
}, 480, 280),
|
|
56
|
+
"scatter, auto x and y": () => renderChartSvg({
|
|
57
|
+
kind: "scatter",
|
|
58
|
+
series: [{
|
|
59
|
+
label: "A",
|
|
60
|
+
data: pair(big, big)
|
|
61
|
+
}]
|
|
62
|
+
}, 480, 280),
|
|
63
|
+
"histogram, auto x": () => renderChartSvg({
|
|
64
|
+
kind: "histogram",
|
|
65
|
+
data: [big, big, big]
|
|
66
|
+
}, 480, 280),
|
|
67
|
+
"boxplot, auto y": () => renderChartSvg({
|
|
68
|
+
kind: "boxplot",
|
|
69
|
+
groups: [{
|
|
70
|
+
label: "A",
|
|
71
|
+
values: [big, big, big]
|
|
72
|
+
}]
|
|
73
|
+
}, 480, 280),
|
|
74
|
+
"bar, auto y": () => renderChartSvg({
|
|
75
|
+
kind: "bar",
|
|
76
|
+
data: [{
|
|
77
|
+
label: "A",
|
|
78
|
+
value: -big
|
|
79
|
+
}]
|
|
80
|
+
}, 480, 280),
|
|
81
|
+
"bar, fixed y with a tick target past the budget": () => renderChartSvg({
|
|
82
|
+
kind: "bar",
|
|
83
|
+
data: [{
|
|
84
|
+
label: "A",
|
|
85
|
+
value: 0.5
|
|
86
|
+
}],
|
|
87
|
+
yAxis: {
|
|
88
|
+
domain: [0, 1],
|
|
89
|
+
ticks: 1e9
|
|
90
|
+
}
|
|
91
|
+
}, 480, 280),
|
|
92
|
+
"state timeline, time x": () => renderChartSvg({
|
|
93
|
+
kind: "stateTimeline",
|
|
94
|
+
rows: [{
|
|
95
|
+
label: "A",
|
|
96
|
+
intervals: [{
|
|
97
|
+
from: big,
|
|
98
|
+
to: big,
|
|
99
|
+
state: "on"
|
|
100
|
+
}]
|
|
101
|
+
}]
|
|
102
|
+
}, 480, 280),
|
|
103
|
+
"core state timeline, time x": () => stateTimeline({
|
|
104
|
+
width: 480,
|
|
105
|
+
height: 280,
|
|
106
|
+
rows: [{
|
|
107
|
+
label: "A",
|
|
108
|
+
intervals: [{
|
|
109
|
+
from: big,
|
|
110
|
+
to: big,
|
|
111
|
+
state: "on"
|
|
112
|
+
}]
|
|
113
|
+
}]
|
|
114
|
+
}),
|
|
115
|
+
"log y": () => renderChartSvg({
|
|
116
|
+
kind: "line",
|
|
117
|
+
series: [{
|
|
118
|
+
label: "A",
|
|
119
|
+
data: pair(0, 1)
|
|
120
|
+
}],
|
|
121
|
+
yAxis: {
|
|
122
|
+
scale: "log",
|
|
123
|
+
domain: [1e-300, 1e300]
|
|
124
|
+
}
|
|
125
|
+
}, 480, 280),
|
|
126
|
+
"nice ticks, step below the float spacing": () => extendDomainToNice(big, big, 1).ticks,
|
|
127
|
+
"nice ticks, step past the budget": () => extendDomainToNice(0, 1, 1e-9).ticks,
|
|
128
|
+
"nice ticks, negative step": () => extendDomainToNice(0, 10, -1).ticks,
|
|
129
|
+
"time ticks, instants past the Date range": () => chartTimeTicks([big, big + 86_400_000], "UTC", chartTimeStep(86_400_000, 5)),
|
|
130
|
+
"time ticks, a step below the float spacing": () => chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2026, 0, 2)], "UTC", {
|
|
131
|
+
unit: "hour",
|
|
132
|
+
size: 1e-20
|
|
133
|
+
}),
|
|
134
|
+
"time ticks, a step that repeats one minute": () => chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2026, 0, 2)], "UTC", {
|
|
135
|
+
unit: "hour",
|
|
136
|
+
size: 1e-9
|
|
137
|
+
}),
|
|
138
|
+
"time ticks, a zero year step": () => chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2036, 0, 1)], "UTC", {
|
|
139
|
+
unit: "year",
|
|
140
|
+
size: 0
|
|
141
|
+
}),
|
|
142
|
+
"time ticks, a negative step": () => chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2026, 0, 2)], "UTC", {
|
|
143
|
+
unit: "hour",
|
|
144
|
+
size: -1
|
|
145
|
+
})
|
|
146
|
+
};
|
|
147
|
+
for (const [name, draw] of Object.entries(cases)) {
|
|
148
|
+
const result = draw();
|
|
149
|
+
console.log(JSON.stringify({
|
|
150
|
+
name,
|
|
151
|
+
...(typeof result === "string" ? {
|
|
152
|
+
svg: result.length,
|
|
153
|
+
nan: /NaN/.test(result)
|
|
154
|
+
} : {
|
|
155
|
+
ticks: result
|
|
156
|
+
})
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
console.log(JSON.stringify({
|
|
160
|
+
done: Object.keys(cases).length
|
|
161
|
+
}));
|
|
162
|
+
//# sourceMappingURL=termination.test-fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["line, auto y","line, nearly equal y","line, auto x","line, fixed y with a tick target past the budget","line, time x","scatter, auto x and y","histogram, auto x","boxplot, auto y","bar, auto y","bar, fixed y with a tick target past the budget","state timeline, time x","core state timeline, time x","log y","nice ticks, step below the float spacing","nice ticks, step past the budget","nice ticks, negative step","time ticks, instants past the Date range","time ticks, a step below the float spacing","time ticks, a step that repeats one minute","time ticks, a zero year step","time ticks, a negative step"],"sources":["charts/core/termination.test-fixture.ts"],"sourcesContent":["// Draws every axis kind with values that the float spacing or the tick budget used to keep counting forever.\n// termination.test.ts runs this file in a child process with a deadline, so a regression fails instead of hanging.\nimport { chartTimeStep, chartTimeTicks } from \"../../content/chart-time-axis\";\nimport { renderChartSvg } from \"./render\";\nimport { extendDomainToNice, stateTimeline } from \"./svg\";\n\n// One value at 1e17 has a float spacing of 16, so its ±1 padding collapses to a zero range.\nconst big = 1e17;\nconst pair = (x: number, y: number) => [{ x, y }];\nconst cases: Record<string, () => string | number[]> = {\n \"line, auto y\": () => renderChartSvg({ kind: \"line\", series: [{ label: \"A\", data: [...pair(0, big), ...pair(1, big)] }] }, 480, 280),\n \"line, nearly equal y\": () =>\n renderChartSvg({ kind: \"line\", series: [{ label: \"A\", data: [...pair(0, big), ...pair(1, big + 16)] }] }, 480, 280),\n \"line, auto x\": () => renderChartSvg({ kind: \"line\", series: [{ label: \"A\", data: [...pair(big, 1), ...pair(big, 2)] }] }, 480, 280),\n \"line, fixed y with a tick target past the budget\": () =>\n renderChartSvg({ kind: \"line\", series: [{ label: \"A\", data: pair(0, 0.5) }], yAxis: { domain: [0, 1], ticks: 1e9 } }, 480, 280),\n \"line, time x\": () =>\n renderChartSvg({ kind: \"line\", series: [{ label: \"A\", data: pair(big, 1) }], timeAxis: { timeZone: \"UTC\" } }, 480, 280),\n \"scatter, auto x and y\": () => renderChartSvg({ kind: \"scatter\", series: [{ label: \"A\", data: pair(big, big) }] }, 480, 280),\n \"histogram, auto x\": () => renderChartSvg({ kind: \"histogram\", data: [big, big, big] }, 480, 280),\n \"boxplot, auto y\": () => renderChartSvg({ kind: \"boxplot\", groups: [{ label: \"A\", values: [big, big, big] }] }, 480, 280),\n \"bar, auto y\": () => renderChartSvg({ kind: \"bar\", data: [{ label: \"A\", value: -big }] }, 480, 280),\n \"bar, fixed y with a tick target past the budget\": () =>\n renderChartSvg({ kind: \"bar\", data: [{ label: \"A\", value: 0.5 }], yAxis: { domain: [0, 1], ticks: 1e9 } }, 480, 280),\n \"state timeline, time x\": () =>\n renderChartSvg({ kind: \"stateTimeline\", rows: [{ label: \"A\", intervals: [{ from: big, to: big, state: \"on\" }] }] }, 480, 280),\n \"core state timeline, time x\": () =>\n stateTimeline({ width: 480, height: 280, rows: [{ label: \"A\", intervals: [{ from: big, to: big, state: \"on\" }] }] }),\n \"log y\": () =>\n renderChartSvg(\n { kind: \"line\", series: [{ label: \"A\", data: pair(0, 1) }], yAxis: { scale: \"log\", domain: [1e-300, 1e300] } },\n 480,\n 280,\n ),\n \"nice ticks, step below the float spacing\": () => extendDomainToNice(big, big, 1).ticks,\n \"nice ticks, step past the budget\": () => extendDomainToNice(0, 1, 1e-9).ticks,\n \"nice ticks, negative step\": () => extendDomainToNice(0, 10, -1).ticks,\n \"time ticks, instants past the Date range\": () => chartTimeTicks([big, big + 86_400_000], \"UTC\", chartTimeStep(86_400_000, 5)),\n \"time ticks, a step below the float spacing\": () =>\n chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2026, 0, 2)], \"UTC\", { unit: \"hour\", size: 1e-20 }),\n \"time ticks, a step that repeats one minute\": () =>\n chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2026, 0, 2)], \"UTC\", { unit: \"hour\", size: 1e-9 }),\n \"time ticks, a zero year step\": () => chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2036, 0, 1)], \"UTC\", { unit: \"year\", size: 0 }),\n \"time ticks, a negative step\": () => chartTimeTicks([Date.UTC(2026, 0, 1), Date.UTC(2026, 0, 2)], \"UTC\", { unit: \"hour\", size: -1 }),\n};\n\nfor (const [name, draw] of Object.entries(cases)) {\n const result = draw();\n console.log(\n JSON.stringify({ name, ...(typeof result === \"string\" ? { svg: result.length, nan: /NaN/.test(result) } : { ticks: result }) }),\n );\n}\nconsole.log(JSON.stringify({ done: Object.keys(cases).length }));\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Conservative proportional-font advances in em, shared by DOM-free SVG label layout.
|
|
2
|
+
* Wide glyphs retain their natural shape; fitting removes whole code points instead of stretching text.
|
|
3
|
+
*/
|
|
4
|
+
export function chartTextWidth(text, size) {
|
|
5
|
+
return Array.from(text).reduce((width, glyph) => width + (/\s/.test(glyph) ? 0.34 : /[ilI.,:;!|'`]/.test(glyph) ? 0.32 : /[MW@%&]/.test(glyph) ? 1 : /[A-Z0-9]/.test(glyph) ? 0.74 : /[a-zäöüßéèáàóúñç()-]/i.test(glyph) ? 0.64 : 1), 0) * size;
|
|
6
|
+
}
|
|
7
|
+
export function fitChartText(text, width, size) {
|
|
8
|
+
if (chartTextWidth(text, size) <= width) return text;
|
|
9
|
+
const glyphs = Array.from(text);
|
|
10
|
+
while (glyphs.length && chartTextWidth(glyphs.join("") + "…", size) > width) glyphs.pop();
|
|
11
|
+
return chartTextWidth("…", size) <= width ? glyphs.join("") + "…" : "";
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/text.ts"],"sourcesContent":["/** Conservative proportional-font advances in em, shared by DOM-free SVG label layout.\n * Wide glyphs retain their natural shape; fitting removes whole code points instead of stretching text.\n */\nexport function chartTextWidth(text: string, size: number): number {\n return (\n Array.from(text).reduce(\n (width, glyph) =>\n width +\n (/\\s/.test(glyph)\n ? 0.34\n : /[ilI.,:;!|'`]/.test(glyph)\n ? 0.32\n : /[MW@%&]/.test(glyph)\n ? 1\n : /[A-Z0-9]/.test(glyph)\n ? 0.74\n : /[a-zäöüßéèáàóúñç()-]/i.test(glyph)\n ? 0.64\n : 1),\n 0,\n ) * size\n );\n}\n\nexport function fitChartText(text: string, width: number, size: number): string {\n if (chartTextWidth(text, size) <= width) return text;\n const glyphs = Array.from(text);\n while (glyphs.length && chartTextWidth(glyphs.join(\"\") + \"…\", size) > width) glyphs.pop();\n return chartTextWidth(\"…\", size) <= width ? glyphs.join(\"\") + \"…\" : \"\";\n}\n"],"mappings":"AAAA;AACA;AACA;AACA,OAAO,SAAS,cAAc,CAAC,IAAY,EAAE,IAAY,EAAU;EACjE,OACE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CACrB,CAAC,KAAK,EAAE,KAAK,KACX,KAAK,IACJ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GACb,IAAI,GACJ,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GACzB,IAAI,GACJ,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GACnB,CAAC,GACD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GACpB,IAAI,GACJ,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,GACjC,IAAI,GACJ,CAAC,CAAC,EAChB,CACF,CAAC,GAAG,IAAI;AAEZ;AAEA,OAAO,SAAS,YAAY,CAAC,IAAY,EAAE,KAAa,EAAE,IAAY,EAAU;EAC9E,IAAI,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,OAAO,IAAI;EACpD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;EAC/B,OAAO,MAAM,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;EACzF,OAAO,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE;AACxE","ignoreList":[]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** UI-owned kind union, derived from the renderer registry. */
|
|
2
|
+
|
|
3
|
+
export const chartDatumRoles = ["point", "item", "bin", "box", "outlier", "value", "cell", "interval"];
|
|
4
|
+
|
|
5
|
+
/** Renderer metadata. Anchors use the containing SVG's coordinate space. */
|
|
6
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/types.ts"],"sourcesContent":["import type { chartRenderers } from \"./registry\";\n\n/** UI-owned kind union, derived from the renderer registry. */\nexport type ChartKind = keyof typeof chartRenderers;\nexport const chartDatumRoles = [\"point\", \"item\", \"bin\", \"box\", \"outlier\", \"value\", \"cell\", \"interval\"] as const;\nexport type ChartDatumRole = (typeof chartDatumRoles)[number];\n\n/** Renderer metadata. Anchors use the containing SVG's coordinate space. */\nexport type ChartDatum = {\n index: number;\n seriesIndex?: number;\n role: ChartDatumRole;\n label?: string;\n anchor: [number, number];\n grid?: [number, number];\n values: { key: string; value: string | number; formatted?: string }[];\n};\n\nexport type { ChartDateFormat, ChartFormat, ChartNumberFormat } from \"../description\";\n"],"mappings":"AAEA;;AAEA,OAAO,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAU;;AAG/G","ignoreList":[]}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { chartDatumSvg, escapeXml, niceStep } from "./svg-renderers";
|
|
2
|
+
/** Totals rest on zero; each change starts at the previous running balance. */
|
|
3
|
+
export function waterfallLayout(spec, size) {
|
|
4
|
+
if (![size.width, size.height].every(value => Number.isFinite(value) && value > 0)) throw new RangeError("Invalid waterfall size");
|
|
5
|
+
let balance = spec.start.value;
|
|
6
|
+
if (!Number.isFinite(balance)) throw new RangeError("Waterfall values must be finite");
|
|
7
|
+
const bars = [{
|
|
8
|
+
...spec.start,
|
|
9
|
+
from: 0,
|
|
10
|
+
to: balance,
|
|
11
|
+
total: true
|
|
12
|
+
}];
|
|
13
|
+
for (const step of spec.steps) {
|
|
14
|
+
const from = balance;
|
|
15
|
+
balance += step.value;
|
|
16
|
+
if (!Number.isFinite(step.value) || !Number.isFinite(balance)) throw new RangeError("Waterfall balances must be finite");
|
|
17
|
+
bars.push({
|
|
18
|
+
...step,
|
|
19
|
+
from,
|
|
20
|
+
to: balance,
|
|
21
|
+
total: false
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
bars.push({
|
|
25
|
+
...spec.end,
|
|
26
|
+
value: balance,
|
|
27
|
+
from: 0,
|
|
28
|
+
to: balance,
|
|
29
|
+
total: true
|
|
30
|
+
});
|
|
31
|
+
let lo = 0,
|
|
32
|
+
hi = 0;
|
|
33
|
+
for (const bar of bars) {
|
|
34
|
+
lo = Math.min(lo, bar.from, bar.to);
|
|
35
|
+
hi = Math.max(hi, bar.from, bar.to);
|
|
36
|
+
}
|
|
37
|
+
if (!Number.isFinite(hi - lo)) throw new RangeError("Waterfall range must be finite");
|
|
38
|
+
if (lo === hi) hi = lo + 1;
|
|
39
|
+
const step = niceStep(hi - lo, 5);
|
|
40
|
+
const lower = Math.floor(lo / step) * step;
|
|
41
|
+
const upper = Math.ceil(hi / step) * step;
|
|
42
|
+
if (!(step > 0) || ![step, lower, upper, upper - lower].every(Number.isFinite) || lower >= upper) throw new RangeError("Waterfall values cannot form a finite axis; rescale them first");
|
|
43
|
+
// Integer tick indices cannot stall when adjacent floats are large. The five-interval nice step bounds their count.
|
|
44
|
+
const scale = {
|
|
45
|
+
domain: [lower, upper],
|
|
46
|
+
ticks: Array.from({
|
|
47
|
+
length: Math.round((upper - lower) / step) + 1
|
|
48
|
+
}, (_, i) => lower + i * step)
|
|
49
|
+
};
|
|
50
|
+
const format = spec.format ?? new Intl.NumberFormat(spec.locale ?? "en", {
|
|
51
|
+
maximumFractionDigits: 2
|
|
52
|
+
}).format;
|
|
53
|
+
const displayWidth = spec.displayWidth ?? size.width;
|
|
54
|
+
if (!Number.isFinite(displayWidth) || displayWidth <= 0) throw new RangeError("Invalid waterfall display width");
|
|
55
|
+
const ratio = size.width / displayWidth;
|
|
56
|
+
const left = Math.min(size.width * 0.6, Math.max(48, ...scale.ticks.map(v => format(v).length * 7 + 12)) * ratio);
|
|
57
|
+
const top = spec.title || spec.subtitle ? 58 : 24;
|
|
58
|
+
const bottom = Math.max(top + 1, size.height - 30);
|
|
59
|
+
const right = size.width - 10;
|
|
60
|
+
const slot = (right - left) / bars.length;
|
|
61
|
+
const project = value => bottom - (value - scale.domain[0]) / (scale.domain[1] - scale.domain[0]) * (bottom - top);
|
|
62
|
+
const amount = bar => `${bar.total ? "" : bar.value > 0 ? "↙ " : bar.value < 0 ? "↗ " : "= "}${format(bar.total ? bar.value : Math.abs(bar.value))}`;
|
|
63
|
+
const datum = (bar, index, center, formattedAmount) => ({
|
|
64
|
+
role: "item",
|
|
65
|
+
index,
|
|
66
|
+
label: bar.label,
|
|
67
|
+
anchor: [center, top],
|
|
68
|
+
values: bar.total ? [{
|
|
69
|
+
key: "balance",
|
|
70
|
+
value: bar.to,
|
|
71
|
+
formatted: format(bar.to)
|
|
72
|
+
}] : [{
|
|
73
|
+
key: "before",
|
|
74
|
+
value: bar.from,
|
|
75
|
+
formatted: format(bar.from)
|
|
76
|
+
}, {
|
|
77
|
+
key: bar.value > 0 ? "inflow" : bar.value < 0 ? "outflow" : "change",
|
|
78
|
+
value: bar.value,
|
|
79
|
+
formatted: formattedAmount
|
|
80
|
+
}, {
|
|
81
|
+
key: "after",
|
|
82
|
+
value: bar.to,
|
|
83
|
+
formatted: format(bar.to)
|
|
84
|
+
}]
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
bars,
|
|
88
|
+
balance,
|
|
89
|
+
scale,
|
|
90
|
+
left,
|
|
91
|
+
right,
|
|
92
|
+
top,
|
|
93
|
+
bottom,
|
|
94
|
+
slot,
|
|
95
|
+
ratio,
|
|
96
|
+
project,
|
|
97
|
+
format,
|
|
98
|
+
amount,
|
|
99
|
+
datum
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const f = value => String(Math.round(value * 100) / 100);
|
|
103
|
+
const text = (x, y, value, anchor = "middle", extra = "") => `<text x="${f(x)}" y="${f(y)}" text-anchor="${anchor}" fill="currentColor" stroke="none" font-family="var(--k2b-font-sans, sans-serif)" font-size="11" ${extra}>${escapeXml(value)}</text>`;
|
|
104
|
+
|
|
105
|
+
/** Pure SVG, including presentation attributes for PDF and hosts outside .k2b-ui. */
|
|
106
|
+
export function renderWaterfallSvg(spec, responsive = false) {
|
|
107
|
+
return renderWaterfallLayoutSvg(spec, waterfallLayout(spec, spec), responsive);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Draw the geometry already reserved by a host before its drawing module loads. */
|
|
111
|
+
export function renderWaterfallLayoutSvg(spec, g, responsive = false) {
|
|
112
|
+
const parts = [];
|
|
113
|
+
// The Solid host stretches a stable viewBox. Container queries use its drawn CSS width on the first frame,
|
|
114
|
+
// rather than freezing the labels to the phone fallback or measuring and redrawing after hydration.
|
|
115
|
+
const visibility = minimumWidth => {
|
|
116
|
+
if (!responsive || minimumWidth <= 0) return "";
|
|
117
|
+
const threshold = f(minimumWidth);
|
|
118
|
+
parts.push(`<style>@container (max-width: ${f(minimumWidth - 0.01)}px) { .k2b-waterfall [data-waterfall-min-width="${threshold}"] { display: none; } }</style>`);
|
|
119
|
+
return ` data-waterfall-min-width="${threshold}"`;
|
|
120
|
+
};
|
|
121
|
+
if (spec.title) parts.push(text(spec.width / 2, 16, spec.title));
|
|
122
|
+
if (spec.subtitle) parts.push(text(spec.width / 2, spec.title ? 34 : 16, spec.subtitle));
|
|
123
|
+
parts.push(`<line class="stdlib-chart-axis" x1="${f(g.left)}" x2="${f(g.right)}" y1="${f(g.bottom)}" y2="${f(g.bottom)}" stroke="currentColor" stroke-opacity="0.2"/>`);
|
|
124
|
+
parts.push(`<line class="stdlib-chart-axis" x1="${f(g.left)}" x2="${f(g.left)}" y1="${f(g.top)}" y2="${f(g.bottom)}" stroke="none"/>`);
|
|
125
|
+
for (const tick of g.scale.ticks) {
|
|
126
|
+
const y = g.project(tick);
|
|
127
|
+
parts.push(`<line x1="${f(g.left)}" x2="${f(g.right)}" y1="${f(y)}" y2="${f(y)}" stroke="currentColor" stroke-opacity="${tick === 0 ? ".25" : ".09"}"/>`);
|
|
128
|
+
parts.push(text(g.left - 8, y + 4, g.format(tick), "end", 'class="stdlib-chart-tick-label"'));
|
|
129
|
+
}
|
|
130
|
+
const cssSlot = g.slot / g.ratio;
|
|
131
|
+
const longest = Math.max(1, ...g.bars.map(b => Math.min(18, b.label.length))) * 6;
|
|
132
|
+
const stride = Math.max(1, Math.ceil((longest + 8) / Math.max(1, cssSlot)));
|
|
133
|
+
const endLimit = Math.max(1, Math.min(18, Math.floor((g.right - g.left) / g.ratio / 12) - 1));
|
|
134
|
+
const endLength = Math.min(endLimit, spec.end.label.length);
|
|
135
|
+
g.bars.forEach((bar, index) => {
|
|
136
|
+
const center = g.left + (index + 0.5) * g.slot;
|
|
137
|
+
const width = Math.min(56, g.slot * 0.62);
|
|
138
|
+
const top = Math.min(g.project(bar.from), g.project(bar.to));
|
|
139
|
+
const height = Math.abs(g.project(bar.from) - g.project(bar.to));
|
|
140
|
+
const color = bar.total ? "color-mix(in srgb, var(--k2b-text-muted, #8b8b93) 55%, transparent)" : bar.value > 0 ? "var(--k2b-flow-in-mark, #0891b2)" : bar.value < 0 ? "var(--k2b-flow-out-mark, #8b5cf6)" : "color-mix(in srgb, var(--k2b-text-muted, #8b8b93) 55%, transparent)";
|
|
141
|
+
const amount = g.amount(bar);
|
|
142
|
+
const band = `<rect class="k2b-chart-category-band" x="${f(center - g.slot / 2)}" y="${f(g.top)}" width="${f(g.slot)}" height="${f(g.bottom - g.top)}" fill="currentColor" fill-opacity="0" stroke="none"/>`;
|
|
143
|
+
const mark = `<rect class="k2b-waterfall-bar" x="${f(center - width / 2)}" y="${f(top)}" width="${f(width)}" height="${f(Math.max(height, 1))}" rx="3" fill="${color}" stroke="none"/>`;
|
|
144
|
+
const valueWidth = Math.max(46 * spec.width / width, (amount.length * 6 + 8) * spec.width / g.slot);
|
|
145
|
+
const value = responsive || width / g.ratio >= 46 && amount.length * 6 + 8 <= cssSlot ? text(center, Math.max(g.top - 8, top - 6), amount, "middle", `class="k2b-waterfall-value" font-weight="600"${visibility(valueWidth)}`).replace('fill="currentColor"', 'fill="var(--k2b-text-secondary, #52525b)"') : "";
|
|
146
|
+
parts.push(chartDatumSvg(band + mark + value, g.datum(bar, index, center, amount), spec.inspect ?? false));
|
|
147
|
+
if (index < g.bars.length - 1) parts.push(`<line class="k2b-waterfall-connector" x1="${f(center + width / 2)}" x2="${f(center + g.slot - width / 2)}" y1="${f(g.project(bar.to))}" y2="${f(g.project(bar.to))}" stroke="currentColor" stroke-opacity=".3" stroke-dasharray="3 3"/>`);
|
|
148
|
+
const ending = index === g.bars.length - 1;
|
|
149
|
+
const endClearance = (Math.min(18, bar.label.length) * 3 + endLength * 6 + 8) / Math.max(1, g.right - center);
|
|
150
|
+
if (ending || responsive || index % stride === 0 && (index === 0 || endClearance * g.ratio <= 1)) {
|
|
151
|
+
// Power-of-two subsets keep adjacent labels at least one visible slot apart at every container width.
|
|
152
|
+
let spacing = 1;
|
|
153
|
+
if (index > 0) while (index % (spacing * 2) === 0) spacing *= 2;
|
|
154
|
+
const minimumWidth = index === 0 || ending ? 0 : Math.max((longest + 8) * spec.width / (g.slot * spacing), endClearance * spec.width);
|
|
155
|
+
const limit = ending ? endLimit : responsive ? 18 : Math.max(1, Math.floor(Math.min(cssSlot * stride - 8, 2 * Math.min(center, spec.width - center) / g.ratio) / 6) - 1);
|
|
156
|
+
const label = bar.label.length > limit ? `${bar.label.slice(0, Math.max(0, limit - 1))}…` : bar.label;
|
|
157
|
+
parts.push(text(ending ? g.right : center, g.bottom + 20, label, ending ? "end" : "middle", `class="stdlib-chart-tick-label stdlib-chart-category-label "${visibility(minimumWidth)}`));
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" class="stdlib-chart k2b-waterfall ${escapeXml(spec.className ?? "")}" width="${spec.width}" height="${spec.height}" viewBox="0 0 ${spec.width} ${spec.height}" aria-hidden="true" focusable="false">${parts.join("")}</svg>`;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=waterfall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/core/waterfall.ts"],"sourcesContent":["import { chartDatumSvg, escapeXml, niceStep } from \"./svg-renderers\";\nimport type { ChartDatum } from \"./types\";\n\nexport type WaterfallOptions = {\n start: { label: string; value: number };\n steps: { label: string; value: number }[];\n end: { label: string };\n title?: string;\n subtitle?: string;\n className?: string;\n /** Formats balances and absolute changes. */\n format?: (value: number) => string;\n locale?: string;\n /** Displayed width in CSS pixels; defaults to the SVG width. Stretching hosts pass their layout width. */\n displayWidth?: number;\n};\n\nexport type WaterfallBar = { label: string; value: number; from: number; to: number; total: boolean };\n\n/** Totals rest on zero; each change starts at the previous running balance. */\nexport function waterfallLayout(spec: WaterfallOptions, size: { width: number; height: number }) {\n if (![size.width, size.height].every((value) => Number.isFinite(value) && value > 0)) throw new RangeError(\"Invalid waterfall size\");\n let balance = spec.start.value;\n if (!Number.isFinite(balance)) throw new RangeError(\"Waterfall values must be finite\");\n const bars: WaterfallBar[] = [{ ...spec.start, from: 0, to: balance, total: true }];\n for (const step of spec.steps) {\n const from = balance;\n balance += step.value;\n if (!Number.isFinite(step.value) || !Number.isFinite(balance)) throw new RangeError(\"Waterfall balances must be finite\");\n bars.push({ ...step, from, to: balance, total: false });\n }\n bars.push({ ...spec.end, value: balance, from: 0, to: balance, total: true });\n let lo = 0,\n hi = 0;\n for (const bar of bars) {\n lo = Math.min(lo, bar.from, bar.to);\n hi = Math.max(hi, bar.from, bar.to);\n }\n if (!Number.isFinite(hi - lo)) throw new RangeError(\"Waterfall range must be finite\");\n if (lo === hi) hi = lo + 1;\n const step = niceStep(hi - lo, 5);\n const lower = Math.floor(lo / step) * step;\n const upper = Math.ceil(hi / step) * step;\n if (!(step > 0) || ![step, lower, upper, upper - lower].every(Number.isFinite) || lower >= upper)\n throw new RangeError(\"Waterfall values cannot form a finite axis; rescale them first\");\n // Integer tick indices cannot stall when adjacent floats are large. The five-interval nice step bounds their count.\n const scale = {\n domain: [lower, upper] as [number, number],\n ticks: Array.from({ length: Math.round((upper - lower) / step) + 1 }, (_, i) => lower + i * step),\n };\n const format = spec.format ?? new Intl.NumberFormat(spec.locale ?? \"en\", { maximumFractionDigits: 2 }).format;\n const displayWidth = spec.displayWidth ?? size.width;\n if (!Number.isFinite(displayWidth) || displayWidth <= 0) throw new RangeError(\"Invalid waterfall display width\");\n const ratio = size.width / displayWidth;\n const left = Math.min(size.width * 0.6, Math.max(48, ...scale.ticks.map((v) => format(v).length * 7 + 12)) * ratio);\n const top = spec.title || spec.subtitle ? 58 : 24;\n const bottom = Math.max(top + 1, size.height - 30);\n const right = size.width - 10;\n const slot = (right - left) / bars.length;\n const project = (value: number) => bottom - ((value - scale.domain[0]) / (scale.domain[1] - scale.domain[0])) * (bottom - top);\n const amount = (bar: WaterfallBar) =>\n `${bar.total ? \"\" : bar.value > 0 ? \"↙ \" : bar.value < 0 ? \"↗ \" : \"= \"}${format(bar.total ? bar.value : Math.abs(bar.value))}`;\n const datum = (bar: WaterfallBar, index: number, center: number, formattedAmount: string): ChartDatum => ({\n role: \"item\",\n index,\n label: bar.label,\n anchor: [center, top],\n values: bar.total\n ? [{ key: \"balance\", value: bar.to, formatted: format(bar.to) }]\n : [\n { key: \"before\", value: bar.from, formatted: format(bar.from) },\n { key: bar.value > 0 ? \"inflow\" : bar.value < 0 ? \"outflow\" : \"change\", value: bar.value, formatted: formattedAmount },\n { key: \"after\", value: bar.to, formatted: format(bar.to) },\n ],\n });\n return { bars, balance, scale, left, right, top, bottom, slot, ratio, project, format, amount, datum };\n}\n\nexport type WaterfallLayout = ReturnType<typeof waterfallLayout>;\n\nconst f = (value: number) => String(Math.round(value * 100) / 100);\nconst text = (x: number, y: number, value: string, anchor = \"middle\", extra = \"\") =>\n `<text x=\"${f(x)}\" y=\"${f(y)}\" text-anchor=\"${anchor}\" fill=\"currentColor\" stroke=\"none\" font-family=\"var(--k2b-font-sans, sans-serif)\" font-size=\"11\" ${extra}>${escapeXml(value)}</text>`;\n\n/** Pure SVG, including presentation attributes for PDF and hosts outside .k2b-ui. */\nexport function renderWaterfallSvg(\n spec: WaterfallOptions & { width: number; height: number; inspect?: boolean },\n responsive = false,\n): string {\n return renderWaterfallLayoutSvg(spec, waterfallLayout(spec, spec), responsive);\n}\n\n/** Draw the geometry already reserved by a host before its drawing module loads. */\nexport function renderWaterfallLayoutSvg(\n spec: WaterfallOptions & { width: number; height: number; inspect?: boolean },\n g: WaterfallLayout,\n responsive = false,\n): string {\n const parts: string[] = [];\n // The Solid host stretches a stable viewBox. Container queries use its drawn CSS width on the first frame,\n // rather than freezing the labels to the phone fallback or measuring and redrawing after hydration.\n const visibility = (minimumWidth: number) => {\n if (!responsive || minimumWidth <= 0) return \"\";\n const threshold = f(minimumWidth);\n parts.push(\n `<style>@container (max-width: ${f(minimumWidth - 0.01)}px) { .k2b-waterfall [data-waterfall-min-width=\"${threshold}\"] { display: none; } }</style>`,\n );\n return ` data-waterfall-min-width=\"${threshold}\"`;\n };\n if (spec.title) parts.push(text(spec.width / 2, 16, spec.title));\n if (spec.subtitle) parts.push(text(spec.width / 2, spec.title ? 34 : 16, spec.subtitle));\n parts.push(\n `<line class=\"stdlib-chart-axis\" x1=\"${f(g.left)}\" x2=\"${f(g.right)}\" y1=\"${f(g.bottom)}\" y2=\"${f(g.bottom)}\" stroke=\"currentColor\" stroke-opacity=\"0.2\"/>`,\n );\n parts.push(`<line class=\"stdlib-chart-axis\" x1=\"${f(g.left)}\" x2=\"${f(g.left)}\" y1=\"${f(g.top)}\" y2=\"${f(g.bottom)}\" stroke=\"none\"/>`);\n for (const tick of g.scale.ticks) {\n const y = g.project(tick);\n parts.push(\n `<line x1=\"${f(g.left)}\" x2=\"${f(g.right)}\" y1=\"${f(y)}\" y2=\"${f(y)}\" stroke=\"currentColor\" stroke-opacity=\"${tick === 0 ? \".25\" : \".09\"}\"/>`,\n );\n parts.push(text(g.left - 8, y + 4, g.format(tick), \"end\", 'class=\"stdlib-chart-tick-label\"'));\n }\n const cssSlot = g.slot / g.ratio;\n const longest = Math.max(1, ...g.bars.map((b) => Math.min(18, b.label.length))) * 6;\n const stride = Math.max(1, Math.ceil((longest + 8) / Math.max(1, cssSlot)));\n const endLimit = Math.max(1, Math.min(18, Math.floor((g.right - g.left) / g.ratio / 12) - 1));\n const endLength = Math.min(endLimit, spec.end.label.length);\n g.bars.forEach((bar, index) => {\n const center = g.left + (index + 0.5) * g.slot;\n const width = Math.min(56, g.slot * 0.62);\n const top = Math.min(g.project(bar.from), g.project(bar.to));\n const height = Math.abs(g.project(bar.from) - g.project(bar.to));\n const color = bar.total\n ? \"color-mix(in srgb, var(--k2b-text-muted, #8b8b93) 55%, transparent)\"\n : bar.value > 0\n ? \"var(--k2b-flow-in-mark, #0891b2)\"\n : bar.value < 0\n ? \"var(--k2b-flow-out-mark, #8b5cf6)\"\n : \"color-mix(in srgb, var(--k2b-text-muted, #8b8b93) 55%, transparent)\";\n const amount = g.amount(bar);\n const band = `<rect class=\"k2b-chart-category-band\" x=\"${f(center - g.slot / 2)}\" y=\"${f(g.top)}\" width=\"${f(g.slot)}\" height=\"${f(g.bottom - g.top)}\" fill=\"currentColor\" fill-opacity=\"0\" stroke=\"none\"/>`;\n const mark = `<rect class=\"k2b-waterfall-bar\" x=\"${f(center - width / 2)}\" y=\"${f(top)}\" width=\"${f(width)}\" height=\"${f(Math.max(height, 1))}\" rx=\"3\" fill=\"${color}\" stroke=\"none\"/>`;\n const valueWidth = Math.max((46 * spec.width) / width, ((amount.length * 6 + 8) * spec.width) / g.slot);\n const value =\n responsive || (width / g.ratio >= 46 && amount.length * 6 + 8 <= cssSlot)\n ? text(\n center,\n Math.max(g.top - 8, top - 6),\n amount,\n \"middle\",\n `class=\"k2b-waterfall-value\" font-weight=\"600\"${visibility(valueWidth)}`,\n ).replace('fill=\"currentColor\"', 'fill=\"var(--k2b-text-secondary, #52525b)\"')\n : \"\";\n parts.push(chartDatumSvg(band + mark + value, g.datum(bar, index, center, amount), spec.inspect ?? false));\n if (index < g.bars.length - 1)\n parts.push(\n `<line class=\"k2b-waterfall-connector\" x1=\"${f(center + width / 2)}\" x2=\"${f(center + g.slot - width / 2)}\" y1=\"${f(g.project(bar.to))}\" y2=\"${f(g.project(bar.to))}\" stroke=\"currentColor\" stroke-opacity=\".3\" stroke-dasharray=\"3 3\"/>`,\n );\n const ending = index === g.bars.length - 1;\n const endClearance = (Math.min(18, bar.label.length) * 3 + endLength * 6 + 8) / Math.max(1, g.right - center);\n if (ending || responsive || (index % stride === 0 && (index === 0 || endClearance * g.ratio <= 1))) {\n // Power-of-two subsets keep adjacent labels at least one visible slot apart at every container width.\n let spacing = 1;\n if (index > 0) while (index % (spacing * 2) === 0) spacing *= 2;\n const minimumWidth =\n index === 0 || ending ? 0 : Math.max(((longest + 8) * spec.width) / (g.slot * spacing), endClearance * spec.width);\n const limit = ending\n ? endLimit\n : responsive\n ? 18\n : Math.max(1, Math.floor(Math.min(cssSlot * stride - 8, (2 * Math.min(center, spec.width - center)) / g.ratio) / 6) - 1);\n const label = bar.label.length > limit ? `${bar.label.slice(0, Math.max(0, limit - 1))}…` : bar.label;\n parts.push(\n text(\n ending ? g.right : center,\n g.bottom + 20,\n label,\n ending ? \"end\" : \"middle\",\n `class=\"stdlib-chart-tick-label stdlib-chart-category-label \"${visibility(minimumWidth)}`,\n ),\n );\n }\n });\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" class=\"stdlib-chart k2b-waterfall ${escapeXml(spec.className ?? \"\")}\" width=\"${spec.width}\" height=\"${spec.height}\" viewBox=\"0 0 ${spec.width} ${spec.height}\" aria-hidden=\"true\" focusable=\"false\">${parts.join(\"\")}</svg>`;\n}\n"],"mappings":"AAAA,SAAS,aAAa,EAAE,SAAS,EAAE,QAAQ,QAAQ,iBAAiB;AAmBpE;AACA,OAAO,SAAS,eAAe,CAAC,IAAsB,EAAE,IAAuC,EAAE;EAC/F,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAE,KAAK,IAAK,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,UAAU,CAAC,wBAAwB,CAAC;EACpI,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;EAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,UAAU,CAAC,iCAAiC,CAAC;EACtF,MAAM,IAAoB,GAAG,CAAC;IAAE,GAAG,IAAI,CAAC,KAAK;IAAE,IAAI,EAAE,CAAC;IAAE,EAAE,EAAE,OAAO;IAAE,KAAK,EAAE;EAAK,CAAC,CAAC;EACnF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;IAC7B,MAAM,IAAI,GAAG,OAAO;IACpB,OAAO,IAAI,IAAI,CAAC,KAAK;IACrB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,UAAU,CAAC,mCAAmC,CAAC;IACxH,IAAI,CAAC,IAAI,CAAC;MAAE,GAAG,IAAI;MAAE,IAAI;MAAE,EAAE,EAAE,OAAO;MAAE,KAAK,EAAE;IAAM,CAAC,CAAC;EACzD;EACA,IAAI,CAAC,IAAI,CAAC;IAAE,GAAG,IAAI,CAAC,GAAG;IAAE,KAAK,EAAE,OAAO;IAAE,IAAI,EAAE,CAAC;IAAE,EAAE,EAAE,OAAO;IAAE,KAAK,EAAE;EAAK,CAAC,CAAC;EAC7E,IAAI,EAAE,GAAG,CAAC;IACR,EAAE,GAAG,CAAC;EACR,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;IACtB,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;IACnC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;EACrC;EACA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,IAAI,UAAU,CAAC,gCAAgC,CAAC;EACrF,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC;EAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;EACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI;EAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI;EACzC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,KAAK,EAC9F,MAAM,IAAI,UAAU,CAAC,gEAAgE,CAAC;EACxF;EACA,MAAM,KAAK,GAAG;IACZ,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,CAAqB;IAC1C,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;MAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG;IAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,GAAG,IAAI;EAClG,CAAC;EACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;IAAE,qBAAqB,EAAE;EAAE,CAAC,CAAC,CAAC,MAAM;EAC7G,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK;EACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,MAAM,IAAI,UAAU,CAAC,iCAAiC,CAAC;EAChH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,YAAY;EACvC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,CAAC,IAAK,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC;EACnH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,EAAE;EACjD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;EAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE;EAC7B,MAAM,IAAI,GAAG,CAAC,KAAK,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM;EACzC,MAAM,OAAO,GAAI,KAAa,IAAK,MAAM,GAAI,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAK,MAAM,GAAG,GAAG,CAAC;EAC9H,MAAM,MAAM,GAAI,GAAiB,IAC/B,GAAG,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;EAChI,MAAM,KAAK,GAAG,CAAC,GAAiB,EAAE,KAAa,EAAE,MAAc,EAAE,eAAuB,MAAkB;IACxG,IAAI,EAAE,MAAM;IACZ,KAAK;IACL,KAAK,EAAE,GAAG,CAAC,KAAK;IAChB,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC,KAAK,GACb,CAAC;MAAE,GAAG,EAAE,SAAS;MAAE,KAAK,EAAE,GAAG,CAAC,EAAE;MAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;IAAE,CAAC,CAAC,GAC9D,CACE;MAAE,GAAG,EAAE,QAAQ;MAAE,KAAK,EAAE,GAAG,CAAC,IAAI;MAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI;IAAE,CAAC,EAC/D;MAAE,GAAG,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,QAAQ,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,SAAS,GAAG,QAAQ;MAAE,KAAK,EAAE,GAAG,CAAC,KAAK;MAAE,SAAS,EAAE;IAAgB,CAAC,EACtH;MAAE,GAAG,EAAE,OAAO;MAAE,KAAK,EAAE,GAAG,CAAC,EAAE;MAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE;IAAE,CAAC;EAElE,CAAC,CAAC;EACF,OAAO;IAAE,IAAI;IAAE,OAAO;IAAE,KAAK;IAAE,IAAI;IAAE,KAAK;IAAE,GAAG;IAAE,MAAM;IAAE,IAAI;IAAE,KAAK;IAAE,OAAO;IAAE,MAAM;IAAE,MAAM;IAAE;EAAM,CAAC;AACxG;AAIA,MAAM,CAAC,GAAI,KAAa,IAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAClE,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,KAAa,EAAE,MAAM,GAAG,QAAQ,EAAE,KAAK,GAAG,EAAE,KAC9E,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,MAAM,qGAAqG,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS;;AAE7L;AACA,OAAO,SAAS,kBAAkB,CAChC,IAA6E,EAC7E,UAAU,GAAG,KAAK,EACV;EACR,OAAO,wBAAwB,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,UAAU,CAAC;AAChF;;AAEA;AACA,OAAO,SAAS,wBAAwB,CACtC,IAA6E,EAC7E,CAAkB,EAClB,UAAU,GAAG,KAAK,EACV;EACR,MAAM,KAAe,GAAG,EAAE;EAC1B;EACA;EACA,MAAM,UAAU,GAAI,YAAoB,IAAK;IAC3C,IAAI,CAAC,UAAU,IAAI,YAAY,IAAI,CAAC,EAAE,OAAO,EAAE;IAC/C,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC;IACjC,KAAK,CAAC,IAAI,CACR,iCAAiC,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,mDAAmD,SAAS,iCACrH,CAAC;IACD,OAAO,8BAA8B,SAAS,GAAG;EACnD,CAAC;EACD,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;EAChE,IAAI,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;EACxF,KAAK,CAAC,IAAI,CACR,uCAAuC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,gDAC7G,CAAC;EACD,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC;EACtI,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE;IAChC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACzB,KAAK,CAAC,IAAI,CACR,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,2CAA2C,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,KAC1I,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iCAAiC,CAAC,CAAC;EAC/F;EACA,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK;EAChC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAE,CAAC,IAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;EACnF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;EAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;EAC7F,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;EAC3D,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK;IAC7B,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,GACnB,qEAAqE,GACrE,GAAG,CAAC,KAAK,GAAG,CAAC,GACX,kCAAkC,GAClC,GAAG,CAAC,KAAK,GAAG,CAAC,GACX,mCAAmC,GACnC,qEAAqE;IAC7E,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;IAC5B,MAAM,IAAI,GAAG,4CAA4C,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,wDAAwD;IAC5M,MAAM,IAAI,GAAG,sCAAsC,CAAC,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,kBAAkB,KAAK,mBAAmB;IACvL,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAE,EAAE,GAAG,IAAI,CAAC,KAAK,GAAI,KAAK,EAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,GAAI,CAAC,CAAC,IAAI,CAAC;IACvG,MAAM,KAAK,GACT,UAAU,IAAK,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,OAAQ,GACrE,IAAI,CACF,MAAM,EACN,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,EAC5B,MAAM,EACN,QAAQ,EACR,gDAAgD,UAAU,CAAC,UAAU,CAAC,EACxE,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,2CAA2C,CAAC,GAC7E,EAAE;IACR,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAC1G,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAC3B,KAAK,CAAC,IAAI,CACR,6CAA6C,CAAC,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,sEACrK,CAAC;IACH,MAAM,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;IAC1C,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC;IAC7G,IAAI,MAAM,IAAI,UAAU,IAAK,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAE,EAAE;MAClG;MACA,IAAI,OAAO,GAAG,CAAC;MACf,IAAI,KAAK,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC;MAC/D,MAAM,YAAY,GAChB,KAAK,KAAK,CAAC,IAAI,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAE,CAAC,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,IAAK,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC;MACpH,MAAM,KAAK,GAAG,MAAM,GAChB,QAAQ,GACR,UAAU,GACR,EAAE,GACF,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,GAAG,CAAC,EAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;MAC5H,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK;MACrG,KAAK,CAAC,IAAI,CACR,IAAI,CACF,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,MAAM,EACzB,CAAC,CAAC,MAAM,GAAG,EAAE,EACb,KAAK,EACL,MAAM,GAAG,KAAK,GAAG,QAAQ,EACzB,+DAA+D,UAAU,CAAC,YAAY,CAAC,EACzF,CACF,CAAC;IACH;EACF,CAAC,CAAC;EACF,OAAO,6EAA6E,SAAS,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,YAAY,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,MAAM,kBAAkB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,0CAA0C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ;AAC9Q","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["charts/description.ts"],"sourcesContent":["/** JSON number formatting. Functions belong to the rendering host, never the saved description. */\nexport type ChartNumberFormat = {\n style?: \"number\" | \"percent\" | \"currency\";\n currency?: string;\n unit?: string;\n decimals?: number;\n compact?: boolean;\n};\nexport type ChartDateFormat = { date: \"day\" | \"minute\" | \"second\" };\nexport type ChartFormat = ChartNumberFormat | ChartDateFormat;\nexport type ChartLimits = { maxSeries: number; maxValues: number; maxMarks: number };\nexport type ChartDescriptionAxis = {\n label?: string;\n domain?: number[];\n ticks?: number;\n scale?: \"linear\" | \"log\";\n format?: ChartFormat;\n};\ntype Reference = {\n value: number | string;\n axis?: \"x\" | \"y\";\n label?: string;\n style?: \"solid\" | \"dashed\" | \"dotted\";\n tone?: \"neutral\" | \"info\" | \"success\" | \"warning\" | \"danger\";\n};\ntype Threshold = { value: number; label?: string };\ntype Series<N> = { label?: string; data: { x: N | string; y: N }[]; role?: \"reference\" };\ntype Common = { title: string; subtitle?: string; tooltip?: { label?: string; format?: ChartNumberFormat } };\ntype Variants<N> =\n | {\n kind: \"waterfall\";\n start: { label: string; value: number };\n steps: { label: string; value: number }[];\n end: { label: string };\n format?: ChartNumberFormat;\n }\n | {\n kind: \"area\";\n layout: \"stacked\";\n normalize?: boolean;\n x: (number | string)[];\n series: { label: string; data: (number | null)[] }[];\n legend?: boolean;\n format?: ChartNumberFormat;\n }\n | {\n kind: \"bar\";\n data: { label: string; value: N }[];\n x?: string[];\n series?: { label: string; data: (number | null)[] }[];\n layout?: \"columns\" | \"rows\" | \"grouped\" | \"stacked\";\n normalize?: boolean;\n compare?: { label: string; data: (number | null)[] };\n xAxis?: Pick<ChartDescriptionAxis, \"label\"> & { ordered?: boolean };\n yAxis?: ChartDescriptionAxis;\n colorByBar?: boolean;\n showValues?: boolean;\n legend?: boolean;\n references?: Reference[];\n }\n | {\n kind: \"hbar\";\n series: string[];\n rows: { group?: string; label: string; values: (number | null)[] }[];\n legend?: boolean;\n format?: ChartNumberFormat;\n }\n | {\n kind: \"line\";\n series: (Series<N> & { style?: \"solid\" | \"dashed\" | \"dotted\" })[];\n xAxis?: ChartDescriptionAxis;\n yAxis?: ChartDescriptionAxis;\n legend?: boolean;\n area?: boolean;\n smooth?: boolean;\n references?: Reference[];\n }\n | {\n kind: \"scatter\";\n series: Series<N>[];\n xAxis?: ChartDescriptionAxis;\n yAxis?: ChartDescriptionAxis;\n legend?: boolean;\n references?: Reference[];\n }\n | { kind: \"pie\" | \"donut\"; data: { label: string; value: N }[]; legend?: boolean; showLabels?: boolean; format?: ChartNumberFormat }\n | { kind: \"histogram\"; data: N[]; bins?: number | number[]; references?: Reference[] }\n | {\n kind: \"gauge\";\n value: N;\n min?: number;\n max?: number;\n label?: string;\n unit?: string;\n format?: ChartNumberFormat;\n thresholds?: Threshold[];\n }\n | { kind: \"sparkline\"; data: N[]; area?: boolean }\n | { kind: \"boxplot\"; data: { label: string; values: N[] }[]; yAxis?: ChartDescriptionAxis; references?: Reference[] }\n | {\n kind: \"heatmap\";\n layout: \"calendar\";\n data: [string, N | null][];\n scale: \"sequential\" | \"diverging\";\n label?: string;\n format?: ChartNumberFormat;\n locale?: string;\n }\n | {\n kind: \"heatmap\";\n layout?: undefined;\n data: { x: string; y: string; value: N }[];\n format?: ChartNumberFormat;\n showValues?: boolean;\n min?: number;\n max?: number;\n }\n | {\n kind: \"barGauge\";\n data: { label: string; value: N; min?: number; max?: number }[];\n min?: number;\n max?: number;\n unit?: string;\n format?: ChartNumberFormat;\n thresholds?: Threshold[];\n }\n | { kind: \"stat\"; value: N; format?: ChartNumberFormat; unit?: string; delta?: N; better?: \"up\" | \"down\"; sparkline?: N[] };\n\n/** Portable chart node. Dates are ISO text and missing observations are null, never zero. */\nexport type ChartDescription = Common &\n (\n | Exclude<Variants<number | null>, { kind: \"bar\" }>\n // Aligned series omit flat data; the validator supplies an empty array.\n | (Omit<Extract<Variants<number | null>, { kind: \"bar\" }>, \"data\"> & { data?: { label: string; value: number | null }[] })\n );\n/** Validated renderer input. The portable validator normalizes null gaps to non-finite numbers for drawing. */\nexport type ChartInput = Common &\n (\n | Exclude<Variants<number>, { kind: \"stat\" }>\n | (Omit<Extract<Variants<number>, { kind: \"stat\" }>, \"delta\"> & { delta: number | undefined })\n );\n"],"mappings":"","ignoreList":[]}
|
package/dist/ssr/charts.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* SVG themselves, such as server previews and app frames.
|
|
2
|
+
* Drawing helpers and portable chart contracts. Import the Solid Chart component from `@k2b/ui`.
|
|
4
3
|
*/
|
|
4
|
+
|
|
5
|
+
export * from "./charts/core";
|
|
5
6
|
export { barChartLayout, renderBarChartSvg } from "./content/chart-bar";
|
|
7
|
+
export { calendarInspectionNavigation, mountCalendarScroll } from "./content/chart-calendar";
|
|
6
8
|
//# sourceMappingURL=charts.js.map
|
package/dist/ssr/charts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["charts.ts"],"sourcesContent":["/**\n *
|
|
1
|
+
{"version":3,"names":[],"sources":["charts.ts"],"sourcesContent":["/**\n * Drawing helpers and portable chart contracts. Import the Solid Chart component from `@k2b/ui`.\n */\n\nexport * from \"./charts/core\";\nexport type * from \"./charts/description\";\nexport type { ChartKindProps, ChartLabels, ChartProps, ChartRenderOptions } from \"./content/Chart\";\nexport { type BarChartLayout, type BarChartOptions, barChartLayout, renderBarChartSvg } from \"./content/chart-bar\";\n\nexport { calendarInspectionNavigation, mountCalendarScroll } from \"./content/chart-calendar\";\n"],"mappings":"AAAA;AACA;AACA;;AAEA,cAAc,eAAe;AAG7B,SAAoD,cAAc,EAAE,iBAAiB,QAAQ,qBAAqB;AAElH,SAAS,4BAA4B,EAAE,mBAAmB,QAAQ,0BAA0B","ignoreList":[]}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { ssr as _$ssr } from "solid-js/web";
|
|
2
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
3
|
+
import { ssrAttribute as _$ssrAttribute } from "solid-js/web";
|
|
4
|
+
import { escape as _$escape } from "solid-js/web";
|
|
5
|
+
var _tmpl$ = ["<p", "><span class=\"k2b-balance__part\">", " <b>", "</b></span><span class=\"k2b-balance__op\" aria-hidden=\"true\">+</span>", "<span class=\"k2b-balance__op\" aria-hidden=\"true\">−</span>", "<span class=\"k2b-balance__op\" aria-hidden=\"true\">=</span><span class=\"k2b-balance__part\">", " <b>", "</b></span></p>"];
|
|
6
|
+
import { useLocale } from "../intl/locale";
|
|
7
|
+
import { useBalanceSummaryMessages } from "./balance-summary-messages";
|
|
8
|
+
import { FlowAmount } from "./FlowAmount";
|
|
9
|
+
/** A movement as an amount; a broken value stays broken, so it shows "—" and never a believable zero. */
|
|
10
|
+
const amount = value => Number.isFinite(value) ? Math.abs(value) : Number.NaN;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* One line from the start of a period to its end: "Start 18,800 € + ↙ 29,260 € − ↗ 29,520 € = End 18,540 €". In and
|
|
14
|
+
* out show their direction with `FlowAmount`; start and end are balances and keep their sign.
|
|
15
|
+
*/
|
|
16
|
+
export function BalanceSummary(props) {
|
|
17
|
+
const locale = useLocale();
|
|
18
|
+
const t = useBalanceSummaryMessages(() => props.locale);
|
|
19
|
+
const lang = () => props.locale ?? locale();
|
|
20
|
+
const start = () => props.start;
|
|
21
|
+
const end = () => start() + amount(props.in) - amount(props.out);
|
|
22
|
+
// Whole amounts read best, but the line is an equation: when the rounded parts would not add up, show cents.
|
|
23
|
+
const decimals = () => {
|
|
24
|
+
if (props.decimals !== undefined) return props.decimals;
|
|
25
|
+
const whole = value => Math.round(value);
|
|
26
|
+
const parts = [start(), amount(props.in), amount(props.out)];
|
|
27
|
+
if (!parts.every(Number.isFinite)) return 0;
|
|
28
|
+
return whole(start()) + whole(amount(props.in)) - whole(amount(props.out)) === whole(end()) ? 0 : 2;
|
|
29
|
+
};
|
|
30
|
+
const balance = value => !Number.isFinite(value) ? "—" : new Intl.NumberFormat(lang(), {
|
|
31
|
+
style: "currency",
|
|
32
|
+
currency: props.currency,
|
|
33
|
+
minimumFractionDigits: decimals(),
|
|
34
|
+
maximumFractionDigits: decimals()
|
|
35
|
+
}).format(value === 0 ? 0 : value);
|
|
36
|
+
return _$ssr(_tmpl$, _$ssrAttribute("class", props.class ? `k2b-balance ${_$escape(props.class, true)}` : "k2b-balance", false), _$escape(props.labels?.start ?? t().start), _$escape(balance(start())), _$escape(_$createComponent(FlowAmount, {
|
|
37
|
+
get value() {
|
|
38
|
+
return amount(props.in);
|
|
39
|
+
},
|
|
40
|
+
get currency() {
|
|
41
|
+
return props.currency;
|
|
42
|
+
},
|
|
43
|
+
get locale() {
|
|
44
|
+
return lang();
|
|
45
|
+
},
|
|
46
|
+
get decimals() {
|
|
47
|
+
return decimals();
|
|
48
|
+
},
|
|
49
|
+
get labels() {
|
|
50
|
+
return {
|
|
51
|
+
in: props.labels?.in ?? t().in
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
})), _$escape(_$createComponent(FlowAmount, {
|
|
55
|
+
get value() {
|
|
56
|
+
return -amount(props.out);
|
|
57
|
+
},
|
|
58
|
+
get currency() {
|
|
59
|
+
return props.currency;
|
|
60
|
+
},
|
|
61
|
+
get locale() {
|
|
62
|
+
return lang();
|
|
63
|
+
},
|
|
64
|
+
get decimals() {
|
|
65
|
+
return decimals();
|
|
66
|
+
},
|
|
67
|
+
get labels() {
|
|
68
|
+
return {
|
|
69
|
+
out: props.labels?.out ?? t().out
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
})), _$escape(props.labels?.end ?? t().end), _$escape(balance(end())));
|
|
73
|
+
}
|
|
74
|
+
export default BalanceSummary;
|
|
75
|
+
//# sourceMappingURL=BalanceSummary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["content/BalanceSummary.tsx"],"sourcesContent":["import type { JSX } from \"solid-js\";\nimport { useLocale } from \"../intl/locale\";\nimport { useBalanceSummaryMessages } from \"./balance-summary-messages\";\nimport { FlowAmount } from \"./FlowAmount\";\n\nexport type BalanceSummaryProps = {\n /** The balance at the start of the period. */\n start: number;\n /** Money that came in during the period, as an amount (the sign is ignored). */\n in: number;\n /** Money that went out during the period, as an amount (the sign is ignored). */\n out: number;\n /** ISO 4217 currency code, e.g. `\"EUR\"`. */\n currency: string;\n /** Explicit locale override; defaults to the inherited render locale. */\n locale?: string;\n /** Fixed fraction digits. Defaults to whole amounts, or cents when whole amounts would not add up. */\n decimals?: number;\n /** Replaces the words \"Start\", \"End\", \"in\" and \"out\". */\n labels?: { start?: string; end?: string; in?: string; out?: string };\n class?: string;\n};\n\n/** A movement as an amount; a broken value stays broken, so it shows \"—\" and never a believable zero. */\nconst amount = (value: number) => (Number.isFinite(value) ? Math.abs(value) : Number.NaN);\n\n/**\n * One line from the start of a period to its end: \"Start 18,800 € + ↙ 29,260 € − ↗ 29,520 € = End 18,540 €\". In and\n * out show their direction with `FlowAmount`; start and end are balances and keep their sign.\n */\nexport function BalanceSummary(props: BalanceSummaryProps): JSX.Element {\n const locale = useLocale();\n const t = useBalanceSummaryMessages(() => props.locale);\n const lang = () => props.locale ?? locale();\n const start = () => props.start;\n const end = () => start() + amount(props.in) - amount(props.out);\n // Whole amounts read best, but the line is an equation: when the rounded parts would not add up, show cents.\n const decimals = () => {\n if (props.decimals !== undefined) return props.decimals;\n const whole = (value: number) => Math.round(value);\n const parts = [start(), amount(props.in), amount(props.out)];\n if (!parts.every(Number.isFinite)) return 0;\n return whole(start()) + whole(amount(props.in)) - whole(amount(props.out)) === whole(end()) ? 0 : 2;\n };\n const balance = (value: number) =>\n !Number.isFinite(value)\n ? \"—\"\n : new Intl.NumberFormat(lang(), {\n style: \"currency\",\n currency: props.currency,\n minimumFractionDigits: decimals(),\n maximumFractionDigits: decimals(),\n }).format(value === 0 ? 0 : value);\n return (\n <p class={props.class ? `k2b-balance ${props.class}` : \"k2b-balance\"}>\n <span class=\"k2b-balance__part\">\n {props.labels?.start ?? t().start} <b>{balance(start())}</b>\n </span>\n <span class=\"k2b-balance__op\" aria-hidden=\"true\">\n +\n </span>\n <FlowAmount\n value={amount(props.in)}\n currency={props.currency}\n locale={lang()}\n decimals={decimals()}\n labels={{ in: props.labels?.in ?? t().in }}\n />\n <span class=\"k2b-balance__op\" aria-hidden=\"true\">\n −\n </span>\n <FlowAmount\n value={-amount(props.out)}\n currency={props.currency}\n locale={lang()}\n decimals={decimals()}\n labels={{ out: props.labels?.out ?? t().out }}\n />\n <span class=\"k2b-balance__op\" aria-hidden=\"true\">\n =\n </span>\n <span class=\"k2b-balance__part\">\n {props.labels?.end ?? t().end} <b>{balance(end())}</b>\n </span>\n </p>\n );\n}\n\nexport default BalanceSummary;\n"],"mappings":"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","ignoreList":[]}
|