basalt-ui 1.27.0 → 1.28.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/AGENTS.md +23 -23
- package/CHANGELOG.md +59 -0
- package/MIGRATING.md +613 -20
- package/README.md +33 -3
- package/agent/rules/basalt-batteries.md +25 -10
- package/agent/rules/basalt-controls.md +56 -31
- package/agent/rules/basalt-mantine.md +17 -6
- package/agent/rules/basalt-tokens.md +1 -1
- package/configs/oxlint-plugin.js +1056 -28
- package/configs/oxlint-plugin.test.ts +1066 -0
- package/configs/oxlint.json +7 -0
- package/dist/agent/coalesce.d.ts.map +1 -1
- package/dist/agent/coalesce.js +2 -1
- package/dist/agent/merge.d.ts.map +1 -1
- package/dist/agent/merge.js +2 -1
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/part-list.js +2 -0
- package/dist/agent/stick-to-bottom.d.ts +3 -6
- package/dist/agent/stick-to-bottom.d.ts.map +1 -1
- package/dist/agent/stick-to-bottom.js +6 -3
- package/dist/agent-chat/composer.d.ts +6 -2
- package/dist/agent-chat/composer.d.ts.map +1 -1
- package/dist/agent-chat/composer.js +49 -33
- package/dist/agent-chat/relative-time.d.ts +0 -9
- package/dist/agent-chat/relative-time.d.ts.map +1 -1
- package/dist/agent-chat/relative-time.js +2 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +3 -2
- package/dist/agent-chat/thread-detail-panel.d.ts.map +1 -1
- package/dist/agent-chat/thread-detail-panel.js +8 -5
- package/dist/agent-chat/thread-feed-row.d.ts +2 -1
- package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed-row.js +92 -92
- package/dist/agent-chat/thread-feed.d.ts +3 -2
- package/dist/agent-chat/thread-feed.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed.js +8 -3
- package/dist/agent-chat/thread-message.d.ts +4 -3
- package/dist/agent-chat/thread-message.d.ts.map +1 -1
- package/dist/agent-chat/thread-message.js +70 -31
- package/dist/agent-chat/thread-outcome-card.d.ts +3 -2
- package/dist/agent-chat/thread-outcome-card.d.ts.map +1 -1
- package/dist/agent-chat/thread-outcome-card.js +9 -2
- package/dist/agent-chat/thread-workspace.d.ts +7 -2
- package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
- package/dist/agent-chat/thread-workspace.js +62 -29
- package/dist/agent-chat/tool-chip.d.ts +3 -2
- package/dist/agent-chat/tool-chip.d.ts.map +1 -1
- package/dist/agent-chat/tool-chip.js +7 -2
- package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
- package/dist/charts/hooks/useBandPlot.js +15 -8
- package/dist/charts/index.d.ts +8 -7
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +45 -5
- package/dist/charts/kinds/BandStrip.d.ts +10 -7
- package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
- package/dist/charts/kinds/BandStrip.js +12 -7
- package/dist/charts/kinds/Bars.d.ts +12 -6
- package/dist/charts/kinds/Bars.d.ts.map +1 -1
- package/dist/charts/kinds/Bars.js +37 -11
- package/dist/charts/kinds/Donut.d.ts +6 -5
- package/dist/charts/kinds/Donut.d.ts.map +1 -1
- package/dist/charts/kinds/Donut.js +19 -2
- package/dist/charts/kinds/DualPanel.d.ts +6 -5
- package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
- package/dist/charts/kinds/DualPanel.js +36 -8
- package/dist/charts/kinds/Heatmap.d.ts +10 -6
- package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
- package/dist/charts/kinds/Heatmap.js +58 -31
- package/dist/charts/kinds/MirroredBars.d.ts +6 -5
- package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
- package/dist/charts/kinds/MirroredBars.js +9 -2
- package/dist/charts/kinds/MultiLine.d.ts +11 -6
- package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
- package/dist/charts/kinds/MultiLine.js +24 -15
- package/dist/charts/kinds/StackedArea.d.ts +18 -8
- package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
- package/dist/charts/kinds/StackedArea.js +29 -4
- package/dist/charts/kinds/ZonedLine.d.ts +12 -8
- package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
- package/dist/charts/kinds/ZonedLine.js +33 -23
- package/dist/charts/layout/auto-margin.d.ts +65 -8
- package/dist/charts/layout/auto-margin.d.ts.map +1 -1
- package/dist/charts/layout/auto-margin.js +45 -10
- package/dist/charts/layout/log-ticks.d.ts +27 -0
- package/dist/charts/layout/log-ticks.d.ts.map +1 -0
- package/dist/charts/layout/log-ticks.js +42 -0
- package/dist/charts/primitives/Axes.d.ts +11 -2
- package/dist/charts/primitives/Axes.d.ts.map +1 -1
- package/dist/charts/primitives/Axes.js +15 -5
- package/dist/charts/primitives/CartesianChart.d.ts +45 -7
- package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
- package/dist/charts/primitives/CartesianChart.js +86 -28
- package/dist/charts/primitives/ChartCard.d.ts +27 -2
- package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
- package/dist/charts/primitives/ChartCard.js +37 -17
- package/dist/charts/primitives/ChartFrame.d.ts +30 -4
- package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
- package/dist/charts/primitives/ChartFrame.js +45 -15
- package/dist/charts/primitives/ChartLegend.d.ts +13 -2
- package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
- package/dist/charts/primitives/ChartLegend.js +33 -13
- package/dist/charts/primitives/ChartPending.d.ts +77 -4
- package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
- package/dist/charts/primitives/ChartPending.js +100 -6
- package/dist/charts/primitives/ChartTooltip.d.ts +7 -0
- package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
- package/dist/charts/primitives/ChartTooltip.js +18 -5
- package/dist/charts/primitives/Crosshair.d.ts +3 -0
- package/dist/charts/primitives/Crosshair.d.ts.map +1 -1
- package/dist/charts/primitives/Crosshair.js +3 -1
- package/dist/charts/primitives/chart-frame-layout.d.ts +95 -0
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -0
- package/dist/charts/primitives/chart-frame-layout.js +89 -0
- package/dist/charts/primitives/chart-tier.d.ts +16 -0
- package/dist/charts/primitives/chart-tier.d.ts.map +1 -0
- package/dist/charts/primitives/chart-tier.js +20 -0
- package/dist/charts/series.d.ts +55 -1
- package/dist/charts/series.d.ts.map +1 -1
- package/dist/charts/series.js +27 -1
- package/dist/charts/sparklines/BarSparkline.d.ts +3 -3
- package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/BarSparkline.js +9 -3
- package/dist/charts/sparklines/LineSparkline.d.ts +3 -3
- package/dist/charts/sparklines/LineSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/LineSparkline.js +15 -3
- package/dist/charts/sparklines/index.d.ts +2 -2
- package/dist/charts/sparklines/index.d.ts.map +1 -1
- package/dist/charts/utils/format.d.ts +92 -2
- package/dist/charts/utils/format.d.ts.map +1 -1
- package/dist/charts/utils/format.js +64 -1
- package/dist/charts/utils/ticks.d.ts +81 -2
- package/dist/charts/utils/ticks.d.ts.map +1 -1
- package/dist/charts/utils/ticks.js +54 -4
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/commands/ShortcutsHelp.d.ts +3 -2
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +8 -2
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +2 -2
- package/dist/commands/define-overlays.d.ts +102 -0
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +102 -2
- package/dist/commands/index.d.ts +10 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +3 -1
- package/dist/commands/overlays-mount.d.ts +13 -6
- package/dist/commands/overlays-mount.d.ts.map +1 -1
- package/dist/commands/overlays-mount.js +23 -14
- package/dist/common/errors.d.ts +34 -0
- package/dist/common/errors.d.ts.map +1 -0
- package/dist/common/errors.js +36 -0
- package/dist/common/index.d.ts +15 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +29 -0
- package/dist/common/props.d.ts +63 -0
- package/dist/common/props.d.ts.map +1 -0
- package/dist/common/props.js +6 -0
- package/dist/common/query-state-like.d.ts +43 -0
- package/dist/common/query-state-like.d.ts.map +1 -0
- package/dist/common/query-state-like.js +20 -0
- package/dist/common/refs.d.ts +29 -0
- package/dist/common/refs.d.ts.map +1 -0
- package/dist/common/refs.js +29 -0
- package/dist/common/scroll-parent.d.ts +23 -0
- package/dist/common/scroll-parent.d.ts.map +1 -0
- package/dist/common/scroll-parent.js +21 -0
- package/dist/common/validate.d.ts +38 -0
- package/dist/common/validate.d.ts.map +1 -0
- package/dist/common/validate.js +36 -0
- package/dist/connectivity/connectivity-indicator.d.ts +3 -1
- package/dist/connectivity/connectivity-indicator.d.ts.map +1 -1
- package/dist/connectivity/connectivity-indicator.js +3 -1
- package/dist/connectivity/connectivity-provider.d.ts.map +1 -1
- package/dist/connectivity/connectivity-provider.js +4 -1
- package/dist/connectivity/index.d.ts +1 -0
- package/dist/connectivity/index.d.ts.map +1 -1
- package/dist/connectivity/types.d.ts +2 -2
- package/dist/connectivity/types.d.ts.map +1 -1
- package/dist/connectivity/use-connectivity.d.ts.map +1 -1
- package/dist/content/article-layout.module.css +11 -4
- package/dist/content/callout.d.ts +8 -4
- package/dist/content/callout.d.ts.map +1 -1
- package/dist/content/callout.js +15 -8
- package/dist/content/guide.d.ts +5 -4
- package/dist/content/guide.d.ts.map +1 -1
- package/dist/content/guide.js +13 -4
- package/dist/content/heading-anchor.d.ts +24 -2
- package/dist/content/heading-anchor.d.ts.map +1 -1
- package/dist/content/heading-anchor.js +23 -9
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +2 -0
- package/dist/content/prose.module.css +9 -7
- package/dist/content/reading-progress.d.ts +10 -4
- package/dist/content/reading-progress.d.ts.map +1 -1
- package/dist/content/reading-progress.js +26 -10
- package/dist/content/slug.d.ts +4 -0
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/toc.d.ts +11 -0
- package/dist/content/toc.d.ts.map +1 -1
- package/dist/content/toc.js +23 -10
- package/dist/controls/actions.d.ts +49 -6
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/actions.js +39 -8
- package/dist/controls/compare-filter.d.ts +3 -2
- package/dist/controls/compare-filter.d.ts.map +1 -1
- package/dist/controls/compare-filter.js +17 -2
- package/dist/controls/control-group.d.ts +3 -3
- package/dist/controls/control-group.d.ts.map +1 -1
- package/dist/controls/control-group.js +9 -2
- package/dist/controls/controls.module.css +169 -186
- package/dist/controls/controls.module.css.d.ts +9 -11
- package/dist/controls/enum-filter.d.ts +3 -2
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/enum-filter.js +28 -13
- package/dist/controls/filter-context.d.ts +8 -4
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-pill.d.ts +3 -3
- package/dist/controls/filter-pill.d.ts.map +1 -1
- package/dist/controls/filter-pill.js +4 -1
- package/dist/controls/filter-set.d.ts +3 -2
- package/dist/controls/filter-set.d.ts.map +1 -1
- package/dist/controls/filter-set.js +66 -41
- package/dist/controls/filter-sheet.d.ts +20 -80
- package/dist/controls/filter-sheet.d.ts.map +1 -1
- package/dist/controls/filter-sheet.js +9 -95
- package/dist/controls/index.d.ts +2 -0
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +4 -0
- package/dist/controls/multi-select-filter.d.ts +18 -2
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/multi-select-filter.js +122 -20
- package/dist/controls/number-filter.d.ts +7 -5
- package/dist/controls/number-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.js +40 -11
- package/dist/controls/panel-row.d.ts +132 -0
- package/dist/controls/panel-row.d.ts.map +1 -0
- package/dist/controls/panel-row.js +173 -0
- package/dist/controls/panel-row.module.css +86 -0
- package/dist/controls/panel-row.module.css.d.ts +13 -0
- package/dist/controls/range-filter.d.ts +2 -1
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/range-filter.js +57 -35
- package/dist/controls/search-filter.d.ts +3 -2
- package/dist/controls/search-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.js +25 -10
- package/dist/controls/select-filter.d.ts +2 -1
- package/dist/controls/select-filter.d.ts.map +1 -1
- package/dist/controls/select-filter.js +4 -0
- package/dist/controls/slider-control.d.ts +36 -0
- package/dist/controls/slider-control.d.ts.map +1 -0
- package/dist/controls/slider-control.js +64 -0
- package/dist/controls/sync-button.d.ts +3 -2
- package/dist/controls/sync-button.d.ts.map +1 -1
- package/dist/controls/sync-button.js +16 -3
- package/dist/controls/toggle-filter.d.ts +3 -2
- package/dist/controls/toggle-filter.d.ts.map +1 -1
- package/dist/controls/toggle-filter.js +28 -11
- package/dist/controls/view-tabs.d.ts +3 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls/view-tabs.js +43 -11
- package/dist/controls-dates/date-range-picker.d.ts +1 -1
- package/dist/controls-dates/date-range-picker.d.ts.map +1 -1
- package/dist/controls-dates/date-range-picker.js +6 -1
- package/dist/dashboard/delta-badge.d.ts +5 -1
- package/dist/dashboard/delta-badge.d.ts.map +1 -1
- package/dist/dashboard/empty-state.d.ts +10 -3
- package/dist/dashboard/empty-state.d.ts.map +1 -1
- package/dist/dashboard/empty-state.js +37 -6
- package/dist/dashboard/index.d.ts +6 -4
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +7 -1
- package/dist/dashboard/query-state.d.ts +48 -27
- package/dist/dashboard/query-state.d.ts.map +1 -1
- package/dist/dashboard/query-state.js +111 -57
- package/dist/dashboard/settings-section.d.ts +19 -9
- package/dist/dashboard/settings-section.d.ts.map +1 -1
- package/dist/dashboard/settings-section.js +74 -25
- package/dist/dashboard/stat-card.d.ts +44 -38
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +55 -42
- package/dist/dashboard/stat-card.module.css +46 -31
- package/dist/dashboard/stat-card.module.css.d.ts +1 -0
- package/dist/dashboard/stat-group.d.ts +41 -0
- package/dist/dashboard/stat-group.d.ts.map +1 -0
- package/dist/dashboard/stat-group.js +30 -0
- package/dist/dashboard/stat-group.module.css +66 -0
- package/dist/dashboard/stat-group.module.css.d.ts +8 -0
- package/dist/dashboard/widget-grid.d.ts +27 -0
- package/dist/dashboard/widget-grid.d.ts.map +1 -0
- package/dist/dashboard/widget-grid.js +41 -0
- package/dist/dashboard/widget-grid.module.css +53 -0
- package/dist/dashboard/widget-grid.module.css.d.ts +9 -0
- package/dist/data/data-table.d.ts +151 -12
- package/dist/data/data-table.d.ts.map +1 -1
- package/dist/data/data-table.js +384 -138
- package/dist/data/data-table.module.css +64 -0
- package/dist/data/data-table.module.css.d.ts +11 -0
- package/dist/data/index.d.ts +2 -2
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +24 -2
- package/dist/data/query-branch.d.ts +28 -0
- package/dist/data/query-branch.d.ts.map +1 -0
- package/dist/data/query-branch.js +10 -0
- package/dist/data/table.d.ts +2 -2
- package/dist/data/table.d.ts.map +1 -1
- package/dist/data/virtual-list.d.ts +65 -6
- package/dist/data/virtual-list.d.ts.map +1 -1
- package/dist/data/virtual-list.js +89 -38
- package/dist/data/virtual.d.ts +1 -1
- package/dist/data/virtual.d.ts.map +1 -1
- package/dist/forms/FormErrorSummary.d.ts +4 -3
- package/dist/forms/FormErrorSummary.d.ts.map +1 -1
- package/dist/forms/FormErrorSummary.js +6 -4
- package/dist/forms/create-form.d.ts +2 -2
- package/dist/forms/field.d.ts +46 -6
- package/dist/forms/field.d.ts.map +1 -1
- package/dist/forms/field.js +10 -5
- package/dist/forms/form-layout.d.ts +142 -0
- package/dist/forms/form-layout.d.ts.map +1 -0
- package/dist/forms/form-layout.js +110 -0
- package/dist/forms/form-layout.module.css +145 -0
- package/dist/forms/form-layout.module.css.d.ts +20 -0
- package/dist/forms/form-state.d.ts +42 -0
- package/dist/forms/form-state.d.ts.map +1 -0
- package/dist/forms/form-state.js +26 -0
- package/dist/forms/index.d.ts +22 -6
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +19 -3
- package/dist/forms/use-field-array.d.ts +60 -0
- package/dist/forms/use-field-array.d.ts.map +1 -0
- package/dist/forms/use-field-array.js +20 -0
- package/dist/forms/use-form-draft.d.ts +25 -10
- package/dist/forms/use-form-draft.d.ts.map +1 -1
- package/dist/forms/use-form-draft.js +55 -18
- package/dist/forms/use-form-submit.d.ts +88 -0
- package/dist/forms/use-form-submit.d.ts.map +1 -0
- package/dist/forms/use-form-submit.js +63 -0
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +26 -6
- package/dist/index.d.ts +10 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -4
- package/dist/nav/types.d.ts +15 -6
- package/dist/nav/types.d.ts.map +1 -1
- package/dist/notifications/bell.d.ts +3 -2
- package/dist/notifications/bell.d.ts.map +1 -1
- package/dist/notifications/bell.js +73 -56
- package/dist/notifications/center.d.ts +15 -4
- package/dist/notifications/center.d.ts.map +1 -1
- package/dist/notifications/center.js +5 -2
- package/dist/notifications/define-notifications.d.ts +56 -14
- package/dist/notifications/define-notifications.d.ts.map +1 -1
- package/dist/notifications/define-notifications.js +2 -1
- package/dist/notifications/index.d.ts +6 -2
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +5 -1
- package/dist/notifications/mount-guard.d.ts +8 -0
- package/dist/notifications/mount-guard.d.ts.map +1 -0
- package/dist/notifications/mount-guard.js +19 -0
- package/dist/notifications/notify.d.ts +58 -1
- package/dist/notifications/notify.d.ts.map +1 -1
- package/dist/notifications/notify.js +46 -2
- package/dist/notifications/overlay.d.ts.map +1 -1
- package/dist/notifications/overlay.js +2 -0
- package/dist/notifications/store.d.ts +7 -0
- package/dist/notifications/store.d.ts.map +1 -1
- package/dist/provider/index.d.ts +37 -5
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +66 -28
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/lab-theme.js +2 -1
- package/dist/query/devtools.d.ts.map +1 -1
- package/dist/query/devtools.js +1 -0
- package/dist/router-tanstack/field.d.ts +1 -1
- package/dist/router-tanstack/field.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.js +1 -1
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +1 -1
- package/dist/section/index.d.ts +1 -1
- package/dist/section/index.d.ts.map +1 -1
- package/dist/section/section.d.ts +36 -2
- package/dist/section/section.d.ts.map +1 -1
- package/dist/section/section.js +49 -57
- package/dist/section/section.module.css +11 -0
- package/dist/shell/account-types.d.ts +5 -2
- package/dist/shell/account-types.d.ts.map +1 -1
- package/dist/shell/app-brand.d.ts +13 -0
- package/dist/shell/app-brand.d.ts.map +1 -0
- package/dist/shell/app-brand.js +94 -0
- package/dist/shell/app-brand.module.css +109 -0
- package/dist/shell/app-brand.module.css.d.ts +14 -0
- package/dist/shell/app-breadcrumbs.d.ts +4 -2
- package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
- package/dist/shell/app-breadcrumbs.js +33 -22
- package/dist/shell/app-header.module.css +10 -5
- package/dist/shell/app-main.module.css +107 -0
- package/dist/shell/app-main.module.css.d.ts +11 -0
- package/dist/shell/app-mobile-nav.d.ts +3 -2
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-mobile-nav.js +29 -15
- package/dist/shell/app-mobile-nav.module.css +48 -27
- package/dist/shell/app-mobile-nav.module.css.d.ts +0 -1
- package/dist/shell/app-sidebar-account.d.ts +2 -1
- package/dist/shell/app-sidebar-account.d.ts.map +1 -1
- package/dist/shell/app-sidebar-account.js +57 -22
- package/dist/shell/app-sidebar.d.ts +9 -3
- package/dist/shell/app-sidebar.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +55 -109
- package/dist/shell/app-sidebar.module.css +53 -96
- package/dist/shell/app-sidebar.module.css.d.ts +0 -5
- package/dist/shell/index.d.ts +14 -6
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +47 -12
- package/dist/shell/isomorphic-layout-effect.d.ts +14 -0
- package/dist/shell/isomorphic-layout-effect.d.ts.map +1 -0
- package/dist/shell/isomorphic-layout-effect.js +5 -0
- package/dist/shell/mobile-nav-model.d.ts.map +1 -1
- package/dist/shell/mobile-nav-model.js +27 -6
- package/dist/shell/nav-count-badge.d.ts +5 -3
- package/dist/shell/nav-count-badge.d.ts.map +1 -1
- package/dist/shell/nav-count-badge.js +3 -1
- package/dist/shell/page-aside.d.ts +43 -0
- package/dist/shell/page-aside.d.ts.map +1 -0
- package/dist/shell/page-aside.js +202 -0
- package/dist/shell/page-aside.module.css +174 -0
- package/dist/shell/page-aside.module.css.d.ts +14 -0
- package/dist/shell/page-bar.d.ts +55 -15
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +130 -41
- package/dist/shell/page-bar.module.css +107 -13
- package/dist/shell/page-bar.module.css.d.ts +4 -1
- package/dist/shell/sidebar-search.d.ts +4 -2
- package/dist/shell/sidebar-search.d.ts.map +1 -1
- package/dist/shell/sidebar-search.js +9 -4
- package/dist/shell/sidebar-search.module.css +1 -1
- package/dist/state/fields.d.ts +23 -3
- package/dist/state/fields.d.ts.map +1 -1
- package/dist/state/fields.js +13 -2
- package/dist/state/persisted-or-local.d.ts +9 -0
- package/dist/state/persisted-or-local.d.ts.map +1 -0
- package/dist/state/persisted-or-local.js +24 -0
- package/dist/state.d.ts +1 -1
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +2 -6
- package/dist/surfaces.d.ts +12 -11
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +42 -12
- package/dist/theme/ctl-theme.d.ts.map +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +102 -17
- package/dist/theme/nav-link.module.css +37 -26
- package/dist/theme/segmented-control.module.css +22 -0
- package/dist/theme/segmented-control.module.css.d.ts +1 -0
- package/dist/theme-lab/boot.d.ts +66 -0
- package/dist/theme-lab/boot.d.ts.map +1 -0
- package/dist/theme-lab/boot.js +82 -0
- package/dist/theme-lab/index.d.ts +4 -43
- package/dist/theme-lab/index.d.ts.map +1 -1
- package/dist/theme-lab/index.js +9 -69
- package/dist/theme-toggle/index.d.ts +3 -2
- package/dist/theme-toggle/index.d.ts.map +1 -1
- package/dist/theme-toggle/index.js +8 -2
- package/dist/tokens/index.d.ts +42 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +35 -6
- package/dist/tokens/palette.d.ts +45 -25
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +31 -14
- package/dist/tokens.css +4 -5
- package/dist/utils/is-dev.d.ts +3 -0
- package/dist/utils/is-dev.d.ts.map +1 -0
- package/dist/utils/is-dev.js +6 -0
- package/dist/widget-header/delta-badge.d.ts +7 -1
- package/dist/widget-header/delta-badge.d.ts.map +1 -1
- package/dist/widget-header/delta-badge.js +8 -1
- package/dist/widget-header/index.d.ts +2 -2
- package/dist/widget-header/index.d.ts.map +1 -1
- package/dist/widget-header/index.js +3 -1
- package/dist/widget-header/widget-header.d.ts +69 -4
- package/dist/widget-header/widget-header.d.ts.map +1 -1
- package/dist/widget-header/widget-header.js +42 -27
- package/dist/widget-header/widget-header.module.css +72 -7
- package/llms.txt +6 -6
- package/package.json +49 -25
- package/src/agent/coalesce.ts +2 -1
- package/src/agent/merge.ts +2 -1
- package/src/agent/part-list.tsx +2 -0
- package/src/agent/stick-to-bottom.tsx +9 -11
- package/src/agent-chat/composer.tsx +124 -103
- package/src/agent-chat/relative-time.ts +2 -1
- package/src/agent-chat/thread-detail-panel.tsx +9 -5
- package/src/agent-chat/thread-feed-row.tsx +17 -9
- package/src/agent-chat/thread-feed.tsx +9 -3
- package/src/agent-chat/thread-message.tsx +48 -13
- package/src/agent-chat/thread-outcome-card.tsx +9 -1
- package/src/agent-chat/thread-workspace.tsx +72 -33
- package/src/agent-chat/tool-chip.tsx +8 -2
- package/src/charts/hooks/useBandPlot.ts +26 -8
- package/src/charts/index.ts +39 -4
- package/src/charts/kinds/BandStrip.tsx +36 -14
- package/src/charts/kinds/Bars.tsx +67 -16
- package/src/charts/kinds/Donut.tsx +30 -3
- package/src/charts/kinds/DualPanel.tsx +56 -10
- package/src/charts/kinds/Heatmap.tsx +90 -33
- package/src/charts/kinds/MirroredBars.tsx +21 -3
- package/src/charts/kinds/MultiLine.tsx +61 -18
- package/src/charts/kinds/StackedArea.tsx +77 -6
- package/src/charts/kinds/ZonedLine.tsx +71 -31
- package/src/charts/layout/auto-margin.ts +134 -21
- package/src/charts/layout/log-ticks.ts +90 -0
- package/src/charts/primitives/Axes.tsx +33 -5
- package/src/charts/primitives/CartesianChart.tsx +194 -41
- package/src/charts/primitives/ChartCard.tsx +66 -25
- package/src/charts/primitives/ChartFrame.tsx +107 -26
- package/src/charts/primitives/ChartLegend.tsx +43 -13
- package/src/charts/primitives/ChartPending.tsx +185 -7
- package/src/charts/primitives/ChartTooltip.tsx +37 -5
- package/src/charts/primitives/Crosshair.tsx +6 -3
- package/src/charts/primitives/chart-frame-layout.ts +212 -0
- package/src/charts/primitives/chart-tier.tsx +37 -0
- package/src/charts/series.ts +77 -1
- package/src/charts/sparklines/BarSparkline.tsx +11 -3
- package/src/charts/sparklines/LineSparkline.tsx +18 -4
- package/src/charts/sparklines/index.ts +2 -2
- package/src/charts/utils/format.ts +163 -2
- package/src/charts/utils/ticks.ts +149 -4
- package/src/cli/index.ts +8 -3
- package/src/commands/ShortcutsHelp.tsx +10 -3
- package/src/commands/define-commands.ts +2 -2
- package/src/commands/define-overlays.ts +216 -1
- package/src/commands/index.ts +12 -0
- package/src/commands/overlays-mount.tsx +60 -26
- package/src/common/errors.ts +73 -0
- package/src/common/index.ts +21 -0
- package/src/common/props.ts +71 -0
- package/src/common/query-state-like.ts +64 -0
- package/src/common/refs.ts +58 -0
- package/src/common/scroll-parent.ts +42 -0
- package/src/common/validate.ts +94 -0
- package/src/connectivity/connectivity-indicator.tsx +6 -1
- package/src/connectivity/connectivity-provider.tsx +4 -1
- package/src/connectivity/index.ts +1 -0
- package/src/connectivity/types.ts +5 -2
- package/src/connectivity/use-connectivity.ts +3 -2
- package/src/content/article-layout.module.css +11 -4
- package/src/content/callout.tsx +13 -7
- package/src/content/guide.tsx +14 -4
- package/src/content/heading-anchor.tsx +14 -3
- package/src/content/index.ts +2 -0
- package/src/content/markdown.tsx +2 -0
- package/src/content/prose.module.css +9 -7
- package/src/content/reading-progress.tsx +40 -15
- package/src/content/slug.ts +4 -0
- package/src/content/toc.tsx +47 -10
- package/src/controls/actions.tsx +89 -9
- package/src/controls/compare-filter.tsx +20 -3
- package/src/controls/control-group.tsx +11 -4
- package/src/controls/controls.module.css +169 -186
- package/src/controls/controls.module.css.d.ts +9 -11
- package/src/controls/enum-filter.tsx +32 -16
- package/src/controls/filter-context.tsx +14 -6
- package/src/controls/filter-pill.tsx +6 -3
- package/src/controls/filter-set.tsx +32 -13
- package/src/controls/filter-sheet.tsx +44 -194
- package/src/controls/index.ts +7 -0
- package/src/controls/multi-select-filter.tsx +177 -27
- package/src/controls/number-filter.tsx +61 -23
- package/src/controls/panel-row.module.css +86 -0
- package/src/controls/panel-row.module.css.d.ts +13 -0
- package/src/controls/panel-row.tsx +392 -0
- package/src/controls/range-filter.tsx +76 -39
- package/src/controls/search-filter.tsx +30 -12
- package/src/controls/select-filter.tsx +11 -1
- package/src/controls/slider-control.tsx +159 -0
- package/src/controls/sync-button.tsx +13 -3
- package/src/controls/toggle-filter.tsx +36 -16
- package/src/controls/view-tabs.tsx +63 -11
- package/src/controls-dates/date-range-picker.tsx +8 -1
- package/src/dashboard/delta-badge.tsx +5 -1
- package/src/dashboard/empty-state.tsx +72 -25
- package/src/dashboard/index.ts +13 -1
- package/src/dashboard/query-state.tsx +154 -84
- package/src/dashboard/settings-section.tsx +87 -31
- package/src/dashboard/stat-card.module.css +46 -31
- package/src/dashboard/stat-card.module.css.d.ts +1 -0
- package/src/dashboard/stat-card.tsx +185 -127
- package/src/dashboard/stat-group.module.css +66 -0
- package/src/dashboard/stat-group.module.css.d.ts +8 -0
- package/src/dashboard/stat-group.tsx +74 -0
- package/src/dashboard/widget-grid.module.css +53 -0
- package/src/dashboard/widget-grid.module.css.d.ts +9 -0
- package/src/dashboard/widget-grid.tsx +127 -0
- package/src/data/data-table.module.css +64 -0
- package/src/data/data-table.module.css.d.ts +11 -0
- package/src/data/data-table.tsx +919 -346
- package/src/data/index.ts +30 -2
- package/src/data/query-branch.ts +53 -0
- package/src/data/table.ts +5 -0
- package/src/data/virtual-list.tsx +189 -55
- package/src/data/virtual.ts +5 -1
- package/src/forms/FormErrorSummary.tsx +13 -6
- package/src/forms/create-form.ts +2 -2
- package/src/forms/field.ts +60 -11
- package/src/forms/form-layout.module.css +145 -0
- package/src/forms/form-layout.module.css.d.ts +20 -0
- package/src/forms/form-layout.tsx +305 -0
- package/src/forms/form-state.tsx +94 -0
- package/src/forms/index.ts +38 -7
- package/src/forms/use-field-array.ts +94 -0
- package/src/forms/use-form-draft.ts +145 -53
- package/src/forms/use-form-submit.ts +199 -0
- package/src/guard/index.ts +73 -18
- package/src/index.ts +74 -10
- package/src/nav/types.ts +15 -6
- package/src/notifications/bell.tsx +18 -4
- package/src/notifications/center.tsx +18 -5
- package/src/notifications/define-notifications.ts +64 -18
- package/src/notifications/index.ts +12 -1
- package/src/notifications/mount-guard.ts +41 -0
- package/src/notifications/notify.tsx +122 -3
- package/src/notifications/overlay.tsx +2 -0
- package/src/notifications/store.ts +7 -0
- package/src/provider/index.tsx +101 -13
- package/src/provider/lab-theme.ts +2 -1
- package/src/query/devtools.tsx +1 -0
- package/src/router-tanstack/field.ts +1 -0
- package/src/router-tanstack/search-store.ts +3 -10
- package/src/router-tanstack/use-nav.ts +18 -13
- package/src/section/index.ts +1 -1
- package/src/section/section.module.css +11 -0
- package/src/section/section.tsx +163 -96
- package/src/shell/account-types.ts +5 -2
- package/src/shell/app-brand.module.css +109 -0
- package/src/shell/app-brand.module.css.d.ts +14 -0
- package/src/shell/app-brand.tsx +140 -0
- package/src/shell/app-breadcrumbs.tsx +19 -9
- package/src/shell/app-header.module.css +10 -5
- package/src/shell/app-main.module.css +107 -0
- package/src/shell/app-main.module.css.d.ts +11 -0
- package/src/shell/app-mobile-nav.module.css +48 -27
- package/src/shell/app-mobile-nav.module.css.d.ts +0 -1
- package/src/shell/app-mobile-nav.tsx +43 -11
- package/src/shell/app-sidebar-account.tsx +29 -6
- package/src/shell/app-sidebar.module.css +53 -96
- package/src/shell/app-sidebar.module.css.d.ts +0 -5
- package/src/shell/app-sidebar.tsx +40 -113
- package/src/shell/index.tsx +156 -65
- package/src/shell/isomorphic-layout-effect.ts +14 -0
- package/src/shell/mobile-nav-model.ts +66 -10
- package/src/shell/nav-count-badge.tsx +6 -1
- package/src/shell/page-aside.module.css +174 -0
- package/src/shell/page-aside.module.css.d.ts +14 -0
- package/src/shell/page-aside.tsx +377 -0
- package/src/shell/page-bar.module.css +107 -13
- package/src/shell/page-bar.module.css.d.ts +4 -1
- package/src/shell/page-bar.tsx +294 -94
- package/src/shell/sidebar-search.module.css +1 -1
- package/src/shell/sidebar-search.tsx +13 -4
- package/src/state/fields.ts +43 -10
- package/src/state/persisted-or-local.ts +50 -0
- package/src/state.ts +0 -9
- package/src/surfaces.ts +42 -12
- package/src/theme/ctl-theme.tsx +10 -0
- package/src/theme/index.ts +129 -16
- package/src/theme/nav-link.module.css +37 -26
- package/src/theme/segmented-control.module.css +22 -0
- package/src/theme/segmented-control.module.css.d.ts +1 -0
- package/src/theme-lab/boot.ts +140 -0
- package/src/theme-lab/index.tsx +21 -112
- package/src/theme-toggle/index.tsx +10 -3
- package/src/tokens/index.ts +50 -6
- package/src/tokens/palette.ts +58 -30
- package/src/utils/is-dev.ts +4 -0
- package/src/widget-header/delta-badge.tsx +25 -5
- package/src/widget-header/index.ts +10 -2
- package/src/widget-header/widget-header.module.css +72 -7
- package/src/widget-header/widget-header.tsx +150 -71
- package/dist/agent/adapter.test.d.ts +0 -2
- package/dist/agent/adapter.test.d.ts.map +0 -1
- package/dist/agent/ai-sdk-transport.test.d.ts +0 -2
- package/dist/agent/ai-sdk-transport.test.d.ts.map +0 -1
- package/dist/agent/coalesce.test.d.ts +0 -2
- package/dist/agent/coalesce.test.d.ts.map +0 -1
- package/dist/agent/foreign.test.d.ts +0 -2
- package/dist/agent/foreign.test.d.ts.map +0 -1
- package/dist/agent/id.test.d.ts +0 -2
- package/dist/agent/id.test.d.ts.map +0 -1
- package/dist/agent/merge.test.d.ts +0 -2
- package/dist/agent/merge.test.d.ts.map +0 -1
- package/dist/agent/part-list.test.d.ts +0 -2
- package/dist/agent/part-list.test.d.ts.map +0 -1
- package/dist/agent/parts.test.d.ts +0 -2
- package/dist/agent/parts.test.d.ts.map +0 -1
- package/dist/agent/thread.test.d.ts +0 -2
- package/dist/agent/thread.test.d.ts.map +0 -1
- package/dist/agent/transport.test.d.ts +0 -2
- package/dist/agent/transport.test.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.test.d.ts +0 -2
- package/dist/agent/use-agent-stream.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts.map +0 -1
- package/dist/agent-chat/composer.test.d.ts +0 -2
- package/dist/agent-chat/composer.test.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.test.d.ts +0 -2
- package/dist/agent-chat/relative-time.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed-row.test.d.ts +0 -2
- package/dist/agent-chat/thread-feed-row.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.test.d.ts +0 -2
- package/dist/agent-chat/thread-feed.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.test.d.ts +0 -2
- package/dist/agent-chat/thread-message.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.test.d.ts +0 -2
- package/dist/agent-chat/thread-workspace.test.d.ts.map +0 -1
- package/dist/agent-chat/tool-chip.test.d.ts +0 -2
- package/dist/agent-chat/tool-chip.test.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.type-guard.test.d.ts +0 -2
- package/dist/agent-chat/virtualize.type-guard.test.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.test.d.ts +0 -2
- package/dist/charts/cursor/resolve.test.d.ts.map +0 -1
- package/dist/charts/cursor/store.test.d.ts +0 -2
- package/dist/charts/cursor/store.test.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.test.d.ts +0 -2
- package/dist/charts/kinds/BandStrip.test.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.test.d.ts +0 -2
- package/dist/charts/kinds/Bars.test.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.test.d.ts +0 -2
- package/dist/charts/kinds/DualPanel.test.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.test.d.ts +0 -2
- package/dist/charts/kinds/MirroredBars.test.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.test.d.ts +0 -2
- package/dist/charts/kinds/MultiLine.test.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.test.d.ts +0 -2
- package/dist/charts/kinds/StackedArea.test.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.test.d.ts +0 -2
- package/dist/charts/kinds/ZonedLine.test.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.test.d.ts +0 -2
- package/dist/charts/layout/auto-margin.test.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.test.d.ts +0 -2
- package/dist/charts/primitives/CartesianChart.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.test.d.ts +0 -2
- package/dist/charts/primitives/ChartCard.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.test.d.ts +0 -2
- package/dist/charts/primitives/ChartFrame.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.test.d.ts +0 -2
- package/dist/charts/primitives/ChartLegend.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.test.d.ts +0 -2
- package/dist/charts/primitives/ChartTooltip.test.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.test.d.ts +0 -2
- package/dist/charts/primitives/XZoneRects.test.d.ts.map +0 -1
- package/dist/charts/series.test.d.ts +0 -2
- package/dist/charts/series.test.d.ts.map +0 -1
- package/dist/charts/utils/domain.test.d.ts +0 -2
- package/dist/charts/utils/domain.test.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.test.d.ts +0 -2
- package/dist/charts/utils/measure-text.test.d.ts.map +0 -1
- package/dist/cli/check-coverage.test.d.ts +0 -2
- package/dist/cli/check-coverage.test.d.ts.map +0 -1
- package/dist/cli/check-theme.test.d.ts +0 -2
- package/dist/cli/check-theme.test.d.ts.map +0 -1
- package/dist/cli/help.test.d.ts +0 -2
- package/dist/cli/help.test.d.ts.map +0 -1
- package/dist/cli/init-sync.test.d.ts +0 -2
- package/dist/cli/init-sync.test.d.ts.map +0 -1
- package/dist/cli/placement-engine.test.d.ts +0 -2
- package/dist/cli/placement-engine.test.d.ts.map +0 -1
- package/dist/cli/shipped-versions.test.d.ts +0 -2
- package/dist/cli/shipped-versions.test.d.ts.map +0 -1
- package/dist/cli/tarball-parity.test.d.ts +0 -2
- package/dist/cli/tarball-parity.test.d.ts.map +0 -1
- package/dist/cli/template-format.test.d.ts +0 -2
- package/dist/cli/template-format.test.d.ts.map +0 -1
- package/dist/cli/template-ledger.test.d.ts +0 -2
- package/dist/cli/template-ledger.test.d.ts.map +0 -1
- package/dist/cli/tokens-css.test.d.ts +0 -2
- package/dist/cli/tokens-css.test.d.ts.map +0 -1
- package/dist/cli/toolchain-wiring.test.d.ts +0 -2
- package/dist/cli/toolchain-wiring.test.d.ts.map +0 -1
- package/dist/cli/waiver-audit.test.d.ts +0 -2
- package/dist/cli/waiver-audit.test.d.ts.map +0 -1
- package/dist/content/article-actions.test.d.ts +0 -2
- package/dist/content/article-actions.test.d.ts.map +0 -1
- package/dist/content/article-model.test.d.ts +0 -2
- package/dist/content/article-model.test.d.ts.map +0 -1
- package/dist/content/block-split.test.d.ts +0 -2
- package/dist/content/block-split.test.d.ts.map +0 -1
- package/dist/content/heading-components.test.d.ts +0 -2
- package/dist/content/heading-components.test.d.ts.map +0 -1
- package/dist/content/markdown.test.d.ts +0 -2
- package/dist/content/markdown.test.d.ts.map +0 -1
- package/dist/content/prose.module.css.test.d.ts +0 -2
- package/dist/content/prose.module.css.test.d.ts.map +0 -1
- package/dist/content/sanitize.test.d.ts +0 -2
- package/dist/content/sanitize.test.d.ts.map +0 -1
- package/dist/content/slug.test.d.ts +0 -2
- package/dist/content/slug.test.d.ts.map +0 -1
- package/dist/controls/actions.test.d.ts +0 -2
- package/dist/controls/actions.test.d.ts.map +0 -1
- package/dist/controls/actions.type-guard.test.d.ts +0 -2
- package/dist/controls/actions.type-guard.test.d.ts.map +0 -1
- package/dist/controls/control-group.test.d.ts +0 -2
- package/dist/controls/control-group.test.d.ts.map +0 -1
- package/dist/controls/controls.router.test.d.ts +0 -2
- package/dist/controls/controls.router.test.d.ts.map +0 -1
- package/dist/controls/filter-set.test.d.ts +0 -2
- package/dist/controls/filter-set.test.d.ts.map +0 -1
- package/dist/controls/peer-boundary.test.d.ts +0 -2
- package/dist/controls/peer-boundary.test.d.ts.map +0 -1
- package/dist/controls/props-contract.test.d.ts +0 -2
- package/dist/controls/props-contract.test.d.ts.map +0 -1
- package/dist/controls/range-filter.type-guard.test.d.ts +0 -2
- package/dist/controls/range-filter.type-guard.test.d.ts.map +0 -1
- package/dist/controls/sync-button.test.d.ts +0 -2
- package/dist/controls/sync-button.test.d.ts.map +0 -1
- package/dist/dashboard/query-state.test.d.ts +0 -2
- package/dist/dashboard/query-state.test.d.ts.map +0 -1
- package/dist/dashboard/settings-section.test.d.ts +0 -2
- package/dist/dashboard/settings-section.test.d.ts.map +0 -1
- package/dist/dashboard/stat-card.test.d.ts +0 -2
- package/dist/dashboard/stat-card.test.d.ts.map +0 -1
- package/dist/data/data-table.test.d.ts +0 -2
- package/dist/data/data-table.test.d.ts.map +0 -1
- package/dist/guard/check-source.test.d.ts +0 -2
- package/dist/guard/check-source.test.d.ts.map +0 -1
- package/dist/guard/grace.test.d.ts +0 -20
- package/dist/guard/grace.test.d.ts.map +0 -1
- package/dist/guard/guard-hook.test.d.ts +0 -2
- package/dist/guard/guard-hook.test.d.ts.map +0 -1
- package/dist/provider/index.test.d.ts +0 -2
- package/dist/provider/index.test.d.ts.map +0 -1
- package/dist/provider/lab-theme.test.d.ts +0 -2
- package/dist/provider/lab-theme.test.d.ts.map +0 -1
- package/dist/query/error-message.test.d.ts +0 -2
- package/dist/query/error-message.test.d.ts.map +0 -1
- package/dist/router-tanstack/multi-search-param-store.test.d.ts +0 -2
- package/dist/router-tanstack/multi-search-param-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/nav.test.d.ts +0 -2
- package/dist/router-tanstack/nav.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-param-store.test.d.ts +0 -2
- package/dist/router-tanstack/search-param-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-store.router.test.d.ts +0 -2
- package/dist/router-tanstack/search-store.router.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-store.test.d.ts +0 -2
- package/dist/router-tanstack/search-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/use-nav.test.d.ts +0 -2
- package/dist/router-tanstack/use-nav.test.d.ts.map +0 -1
- package/dist/section/section.test.d.ts +0 -2
- package/dist/section/section.test.d.ts.map +0 -1
- package/dist/shell/app-mobile-nav.test.d.ts +0 -2
- package/dist/shell/app-mobile-nav.test.d.ts.map +0 -1
- package/dist/shell/app-sidebar.test.d.ts +0 -2
- package/dist/shell/app-sidebar.test.d.ts.map +0 -1
- package/dist/shell/index.test.d.ts +0 -2
- package/dist/shell/index.test.d.ts.map +0 -1
- package/dist/shell/mobile-nav-model.test.d.ts +0 -2
- package/dist/shell/mobile-nav-model.test.d.ts.map +0 -1
- package/dist/shell/page-bar.test.d.ts +0 -2
- package/dist/shell/page-bar.test.d.ts.map +0 -1
- package/dist/state/fields.test.d.ts +0 -2
- package/dist/state/fields.test.d.ts.map +0 -1
- package/dist/state/persisted.test.d.ts +0 -2
- package/dist/state/persisted.test.d.ts.map +0 -1
- package/dist/styles.floor.test.d.ts +0 -2
- package/dist/styles.floor.test.d.ts.map +0 -1
- package/dist/theme/border-coverage.test.d.ts +0 -18
- package/dist/theme/border-coverage.test.d.ts.map +0 -1
- package/dist/theme/contrast.test.d.ts +0 -2
- package/dist/theme/contrast.test.d.ts.map +0 -1
- package/dist/theme/ctl-theme.test.d.ts +0 -2
- package/dist/theme/ctl-theme.test.d.ts.map +0 -1
- package/dist/theme/ctl-tier-coverage.test.d.ts +0 -2
- package/dist/theme/ctl-tier-coverage.test.d.ts.map +0 -1
- package/dist/theme/density-option.test.d.ts +0 -2
- package/dist/theme/density-option.test.d.ts.map +0 -1
- package/dist/theme/density-relations.test.d.ts +0 -2
- package/dist/theme/density-relations.test.d.ts.map +0 -1
- package/dist/theme/derive-theme.test.d.ts +0 -2
- package/dist/theme/derive-theme.test.d.ts.map +0 -1
- package/dist/theme/divider-law.test.d.ts +0 -2
- package/dist/theme/divider-law.test.d.ts.map +0 -1
- package/dist/theme/fonts-option.test.d.ts +0 -2
- package/dist/theme/fonts-option.test.d.ts.map +0 -1
- package/dist/theme/icon-slot.test.d.ts +0 -2
- package/dist/theme/icon-slot.test.d.ts.map +0 -1
- package/dist/theme/layout-rhythm-css.test.d.ts +0 -2
- package/dist/theme/layout-rhythm-css.test.d.ts.map +0 -1
- package/dist/theme/radius-option.test.d.ts +0 -2
- package/dist/theme/radius-option.test.d.ts.map +0 -1
- package/dist/theme/radius.test.d.ts +0 -2
- package/dist/theme/radius.test.d.ts.map +0 -1
- package/dist/theme/shadow-surfaces.test.d.ts +0 -26
- package/dist/theme/shadow-surfaces.test.d.ts.map +0 -1
- package/dist/theme/spacing.test.d.ts +0 -2
- package/dist/theme/spacing.test.d.ts.map +0 -1
- package/dist/theme/use-basalt-spacing.test.d.ts +0 -2
- package/dist/theme/use-basalt-spacing.test.d.ts.map +0 -1
- package/dist/theme-lab/derive-controls.test.d.ts +0 -2
- package/dist/theme-lab/derive-controls.test.d.ts.map +0 -1
- package/dist/theme-lab/derive-state.test.d.ts +0 -2
- package/dist/theme-lab/derive-state.test.d.ts.map +0 -1
- package/dist/theme-lab/theme-lab.test.d.ts +0 -2
- package/dist/theme-lab/theme-lab.test.d.ts.map +0 -1
- package/dist/tokens/build-fonts-css.test.d.ts +0 -2
- package/dist/tokens/build-fonts-css.test.d.ts.map +0 -1
- package/dist/tokens/build-radius-css.test.d.ts +0 -2
- package/dist/tokens/build-radius-css.test.d.ts.map +0 -1
- package/dist/tokens/chart-margin.test.d.ts +0 -2
- package/dist/tokens/chart-margin.test.d.ts.map +0 -1
- package/dist/tokens/density.test.d.ts +0 -2
- package/dist/tokens/density.test.d.ts.map +0 -1
- package/dist/tokens/derive-radius.test.d.ts +0 -2
- package/dist/tokens/derive-radius.test.d.ts.map +0 -1
- package/dist/tokens/derive.test.d.ts +0 -2
- package/dist/tokens/derive.test.d.ts.map +0 -1
- package/dist/tokens/palette.test.d.ts +0 -2
- package/dist/tokens/palette.test.d.ts.map +0 -1
- package/dist/tokens/text-scale.test.d.ts +0 -2
- package/dist/tokens/text-scale.test.d.ts.map +0 -1
- package/dist/vite-color-mix.test.d.ts +0 -2
- package/dist/vite-color-mix.test.d.ts.map +0 -1
- package/dist/vite.test.d.ts +0 -2
- package/dist/vite.test.d.ts.map +0 -1
- package/dist/widget-header/delta-badge.test.d.ts +0 -2
- package/dist/widget-header/delta-badge.test.d.ts.map +0 -1
- package/dist/widget-header/no-mantine.test.d.ts +0 -2
- package/dist/widget-header/no-mantine.test.d.ts.map +0 -1
- package/dist/widget-header/widget-header.test.d.ts +0 -2
- package/dist/widget-header/widget-header.test.d.ts.map +0 -1
- package/src/agent/adapter.test.ts +0 -1640
- package/src/agent/ai-sdk-transport.test.ts +0 -658
- package/src/agent/coalesce.test.ts +0 -387
- package/src/agent/foreign.test.ts +0 -51
- package/src/agent/id.test.ts +0 -169
- package/src/agent/merge.test.ts +0 -206
- package/src/agent/part-list.test.tsx +0 -112
- package/src/agent/parts.test.ts +0 -720
- package/src/agent/thread.test.ts +0 -220
- package/src/agent/transport.test.ts +0 -70
- package/src/agent/use-agent-stream.test.tsx +0 -287
- package/src/agent/use-agent-thread-runs.foreign.test.tsx +0 -138
- package/src/agent/use-agent-thread-runs.resume.test.tsx +0 -294
- package/src/agent/use-agent-thread-runs.test.tsx +0 -1120
- package/src/agent/use-agent-thread-runs.wedge.test.tsx +0 -387
- package/src/agent-chat/composer.test.tsx +0 -924
- package/src/agent-chat/relative-time.test.ts +0 -95
- package/src/agent-chat/thread-feed-row.test.tsx +0 -510
- package/src/agent-chat/thread-feed.test.tsx +0 -241
- package/src/agent-chat/thread-message.test.tsx +0 -1285
- package/src/agent-chat/thread-workspace.test.tsx +0 -169
- package/src/agent-chat/tool-chip.test.tsx +0 -139
- package/src/agent-chat/virtualize.type-guard.test.ts +0 -49
- package/src/charts/cursor/resolve.test.ts +0 -151
- package/src/charts/cursor/store.test.ts +0 -64
- package/src/charts/kinds/BandStrip.test.tsx +0 -282
- package/src/charts/kinds/Bars.test.tsx +0 -183
- package/src/charts/kinds/DualPanel.test.tsx +0 -527
- package/src/charts/kinds/MirroredBars.test.tsx +0 -232
- package/src/charts/kinds/MultiLine.test.tsx +0 -218
- package/src/charts/kinds/StackedArea.test.tsx +0 -114
- package/src/charts/kinds/ZonedLine.test.tsx +0 -147
- package/src/charts/layout/auto-margin.test.ts +0 -42
- package/src/charts/primitives/CartesianChart.test.tsx +0 -647
- package/src/charts/primitives/ChartCard.test.tsx +0 -66
- package/src/charts/primitives/ChartFrame.test.tsx +0 -142
- package/src/charts/primitives/ChartLegend.test.tsx +0 -78
- package/src/charts/primitives/ChartTooltip.test.tsx +0 -44
- package/src/charts/primitives/XZoneRects.test.tsx +0 -123
- package/src/charts/series.test.ts +0 -112
- package/src/charts/utils/domain.test.ts +0 -54
- package/src/charts/utils/measure-text.test.ts +0 -36
- package/src/cli/check-coverage.test.ts +0 -297
- package/src/cli/check-theme.test.ts +0 -837
- package/src/cli/help.test.ts +0 -170
- package/src/cli/init-sync.test.ts +0 -343
- package/src/cli/placement-engine.test.ts +0 -298
- package/src/cli/shipped-versions.test.ts +0 -83
- package/src/cli/tarball-parity.test.ts +0 -44
- package/src/cli/template-format.test.ts +0 -64
- package/src/cli/template-ledger.test.ts +0 -219
- package/src/cli/tokens-css.test.ts +0 -249
- package/src/cli/toolchain-wiring.test.ts +0 -1358
- package/src/cli/waiver-audit.test.ts +0 -215
- package/src/content/article-actions.test.ts +0 -78
- package/src/content/article-model.test.ts +0 -119
- package/src/content/block-split.test.ts +0 -75
- package/src/content/heading-components.test.tsx +0 -65
- package/src/content/markdown.test.tsx +0 -603
- package/src/content/prose.module.css.test.ts +0 -39
- package/src/content/sanitize.test.ts +0 -659
- package/src/content/slug.test.ts +0 -62
- package/src/controls/actions.test.tsx +0 -252
- package/src/controls/actions.type-guard.test.ts +0 -63
- package/src/controls/control-group.test.tsx +0 -229
- package/src/controls/controls.router.test.tsx +0 -1053
- package/src/controls/filter-set.test.tsx +0 -472
- package/src/controls/peer-boundary.test.ts +0 -85
- package/src/controls/props-contract.test.tsx +0 -137
- package/src/controls/range-filter.type-guard.test.tsx +0 -122
- package/src/controls/sync-button.test.tsx +0 -183
- package/src/dashboard/query-state.test.tsx +0 -152
- package/src/dashboard/settings-section.test.tsx +0 -56
- package/src/dashboard/stat-card.test.tsx +0 -385
- package/src/data/data-table.test.tsx +0 -434
- package/src/guard/check-source.test.ts +0 -3388
- package/src/guard/grace.test.ts +0 -158
- package/src/guard/guard-hook.test.ts +0 -203
- package/src/provider/index.test.tsx +0 -101
- package/src/provider/lab-theme.test.ts +0 -147
- package/src/query/error-message.test.ts +0 -67
- package/src/router-tanstack/multi-search-param-store.test.ts +0 -124
- package/src/router-tanstack/nav.test.ts +0 -111
- package/src/router-tanstack/search-param-store.test.ts +0 -135
- package/src/router-tanstack/search-store.router.test.tsx +0 -882
- package/src/router-tanstack/search-store.test.ts +0 -578
- package/src/router-tanstack/use-nav.test.tsx +0 -187
- package/src/section/section.test.tsx +0 -204
- package/src/shell/app-mobile-nav.test.tsx +0 -403
- package/src/shell/app-sidebar.test.tsx +0 -509
- package/src/shell/index.test.tsx +0 -428
- package/src/shell/mobile-nav-model.test.ts +0 -517
- package/src/shell/page-bar.test.tsx +0 -316
- package/src/state/fields.test.tsx +0 -512
- package/src/state/persisted.test.ts +0 -91
- package/src/styles.floor.test.ts +0 -36
- package/src/theme/border-coverage.test.ts +0 -272
- package/src/theme/contrast.test.ts +0 -354
- package/src/theme/ctl-theme.test.tsx +0 -275
- package/src/theme/ctl-tier-coverage.test.ts +0 -170
- package/src/theme/density-option.test.ts +0 -96
- package/src/theme/density-relations.test.ts +0 -506
- package/src/theme/derive-theme.test.ts +0 -101
- package/src/theme/divider-law.test.ts +0 -259
- package/src/theme/fonts-option.test.ts +0 -75
- package/src/theme/icon-slot.test.tsx +0 -275
- package/src/theme/layout-rhythm-css.test.ts +0 -72
- package/src/theme/radius-option.test.ts +0 -86
- package/src/theme/radius.test.ts +0 -142
- package/src/theme/shadow-surfaces.test.ts +0 -488
- package/src/theme/spacing.test.ts +0 -495
- package/src/theme/use-basalt-spacing.test.tsx +0 -55
- package/src/theme-lab/derive-controls.test.ts +0 -94
- package/src/theme-lab/derive-state.test.ts +0 -71
- package/src/theme-lab/theme-lab.test.ts +0 -46
- package/src/tokens/build-fonts-css.test.ts +0 -52
- package/src/tokens/build-radius-css.test.ts +0 -25
- package/src/tokens/chart-margin.test.ts +0 -39
- package/src/tokens/density.test.ts +0 -259
- package/src/tokens/derive-radius.test.ts +0 -62
- package/src/tokens/derive.test.ts +0 -30
- package/src/tokens/palette.test.ts +0 -114
- package/src/tokens/text-scale.test.ts +0 -51
- package/src/vite-color-mix.test.ts +0 -46
- package/src/vite.test.ts +0 -423
- package/src/widget-header/delta-badge.test.tsx +0 -60
- package/src/widget-header/no-mantine.test.ts +0 -33
- package/src/widget-header/widget-header.test.tsx +0 -187
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import type { BasaltProps } from '../../common/props.js';
|
|
1
2
|
import type { CursorResolution } from '../cursor/resolve.js';
|
|
2
3
|
import type { AxisConfig } from '../primitives/CartesianChart.js';
|
|
4
|
+
import type { ChartState } from '../primitives/ChartPending.js';
|
|
3
5
|
import type { ChartLegendConfig, ChartSeries } from '../series.js';
|
|
4
|
-
export type StackedAreaProps<T> = {
|
|
6
|
+
export type StackedAreaProps<T> = BasaltProps & {
|
|
5
7
|
data: T[];
|
|
6
8
|
/** Fixed height in pixels, forwarded to `CartesianChart`. Default 240. */
|
|
7
9
|
height?: number;
|
|
@@ -13,8 +15,9 @@ export type StackedAreaProps<T> = {
|
|
|
13
15
|
/** Axis config for ticks/format/grid. `domain` defaults to the summed per-point stack total
|
|
14
16
|
* (padded ×1.1, or `autoMaxFloor` if higher) rather than a per-series max — the seam a stacked
|
|
15
17
|
* chart needs, since the plotted quantity is the cumulative band top, not any one series' own
|
|
16
|
-
* value. Pass a fixed tuple or your own function to override.
|
|
17
|
-
|
|
18
|
+
* value. Pass a fixed tuple or your own function to override. No `scale` — stacking sums bar
|
|
19
|
+
* heights directly and a log axis has no additive zero to sum from. */
|
|
20
|
+
y?: Omit<AxisConfig<T>, 'scale'>;
|
|
18
21
|
/** Exact number of x ticks. Default: as many as fit. Ignored when `xTickValues` is set. */
|
|
19
22
|
xTicks?: number;
|
|
20
23
|
/** Which domain keys get a tick, from the full key list and the resolved plot width. Takes
|
|
@@ -23,6 +26,9 @@ export type StackedAreaProps<T> = {
|
|
|
23
26
|
xTickValues?: (keys: readonly string[], xMax: number) => readonly string[];
|
|
24
27
|
/** X tick label formatter. Default `fmtAxisDate` (DD.MM). */
|
|
25
28
|
formatX?: (key: string) => string;
|
|
29
|
+
/** Tilt the x tick labels 45° or 90°, or `0` to opt out of the phone tier's auto-rotation —
|
|
30
|
+
* see `CartesianChartProps.xLabelRotate`. */
|
|
31
|
+
xLabelRotate?: 0 | 45 | 90;
|
|
26
32
|
/**
|
|
27
33
|
* How a sibling chart's broadcast cursor key resolves against this chart's points. Default
|
|
28
34
|
* `'nearest'`. Pass `'leading'` when `getX` returns a bucket's leading edge (a weekly series
|
|
@@ -36,11 +42,20 @@ export type StackedAreaProps<T> = {
|
|
|
36
42
|
ariaLabel?: string;
|
|
37
43
|
/** Forwarded to `CartesianChart` — see `ChartPending`'s JSDoc for the three-state rationale. */
|
|
38
44
|
isPending?: boolean;
|
|
45
|
+
/** The three "nothing to draw" states in one prop — pending → error → empty. See
|
|
46
|
+
* `ChartState`; `isPending` stays a supported alias for `state={{ pending: true }}`. */
|
|
47
|
+
state?: ChartState;
|
|
39
48
|
};
|
|
40
49
|
/**
|
|
41
50
|
* Multi-series stacked-area chart with an optional derived legend (default on) and legend-hover
|
|
42
51
|
* dimming. Each band's fillOpacity is dimmed when a different key is highlighted via the legend.
|
|
43
52
|
*
|
|
53
|
+
* **A stack is only as dense as its sparsest series.** A row where any VISIBLE band is null is
|
|
54
|
+
* dropped from the stack entirely — the bands break across that x, the crosshair reports no
|
|
55
|
+
* cumulative value there, and the axis domain ignores it. Toggling the sparse band off in the
|
|
56
|
+
* legend closes the gap, because density is measured against the visible set. A chart that needs
|
|
57
|
+
* a null band to read as zero must say so in its own `getValue`.
|
|
58
|
+
*
|
|
44
59
|
* Composes `CartesianChart` (`docs/CHARTS-SPEC.md` §2) — margin, scale, grid, axes, cursor, and
|
|
45
60
|
* tooltip are the primitive's job. This file draws only the `AreaStack` bands.
|
|
46
61
|
*
|
|
@@ -51,11 +66,6 @@ export type StackedAreaProps<T> = {
|
|
|
51
66
|
* to restore the original bottom-to-top stacking order for `AreaStack`'s `keys`.
|
|
52
67
|
*/
|
|
53
68
|
declare function StackedAreaInner<T>(props: StackedAreaProps<T>): import("react").JSX.Element;
|
|
54
|
-
/**
|
|
55
|
-
* Hand-memoized: React Compiler does not process the shipped dist, so we wrap the
|
|
56
|
-
* hot stacked-area kind in `React.memo` to retain the auto-memoization it had as source
|
|
57
|
-
* (parity with ZonedLine / Bars / MultiLine).
|
|
58
|
-
*/
|
|
59
69
|
export declare const StackedArea: typeof StackedAreaInner;
|
|
60
70
|
export {};
|
|
61
71
|
//# sourceMappingURL=StackedArea.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StackedArea.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/StackedArea.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,8BAA8B,CAAA;AAC3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"StackedArea.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/StackedArea.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAe,MAAM,8BAA8B,CAAA;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAE5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAG/D,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,WAAW,GAAG;IAC9C,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;IACtB;4FACwF;IACxF,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAA;IACxB;;;;2EAIuE;IACvE,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;IAChC,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;wBAEoB;IACpB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,CAAA;IAC1E,6DAA6D;IAC7D,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IACjC;iDAC6C;IAC7C,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAA;IAC1B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC;4CACwC;IACxC,MAAM,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAAA;IAClC,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gGAAgG;IAChG,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;4FACwF;IACxF,KAAK,CAAC,EAAE,UAAU,CAAA;CACnB,CAAA;AAaD;;;;;;;;;;;;;;;;;;GAkBG;AACH,iBAAS,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,+BA4GtD;AAoED,eAAO,MAAM,WAAW,EAAsB,OAAO,gBAAgB,CAAA"}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
|
-
import { curveMonotoneX } from "@visx/curve";
|
|
3
2
|
import { AreaStack } from "@visx/shape";
|
|
4
3
|
import { memo, useCallback, useMemo } from "react";
|
|
4
|
+
import { assertRequiredProps } from "../../common/validate.js";
|
|
5
5
|
import { CartesianChart } from "../primitives/CartesianChart.js";
|
|
6
|
+
import { curveFor } from "../series.js";
|
|
7
|
+
import { isDev } from "../../utils/is-dev.js";
|
|
8
|
+
function rowIsDense(d, bands) {
|
|
9
|
+
return bands.every((s) => s.getValue(d) !== null);
|
|
10
|
+
}
|
|
6
11
|
function StackedAreaInner(props) {
|
|
12
|
+
assertRequiredProps("StackedArea", props, ["data", "getX", "series"]);
|
|
7
13
|
const {
|
|
8
14
|
data,
|
|
9
15
|
chartId,
|
|
@@ -13,12 +19,21 @@ function StackedAreaInner(props) {
|
|
|
13
19
|
xTicks,
|
|
14
20
|
xTickValues,
|
|
15
21
|
formatX,
|
|
22
|
+
xLabelRotate,
|
|
16
23
|
cursorResolution,
|
|
17
24
|
height,
|
|
18
25
|
legend,
|
|
19
26
|
ariaLabel,
|
|
20
|
-
isPending
|
|
27
|
+
isPending,
|
|
28
|
+
state,
|
|
29
|
+
className,
|
|
30
|
+
style
|
|
21
31
|
} = props;
|
|
32
|
+
if (isDev() && y?.scale === "log") {
|
|
33
|
+
throw new Error(
|
|
34
|
+
'StackedArea: cannot use a log axis (y.scale: "log") \u2014 the stack sums band heights, and a log axis has no additive zero to sum from.'
|
|
35
|
+
);
|
|
36
|
+
}
|
|
22
37
|
const yConfig = useMemo(() => {
|
|
23
38
|
const base = y ?? {};
|
|
24
39
|
if (base.domain !== void 0 && base.domain !== "auto") return base;
|
|
@@ -30,6 +45,7 @@ function StackedAreaInner(props) {
|
|
|
30
45
|
domain: (rows, visible) => {
|
|
31
46
|
let maxTotal = 0;
|
|
32
47
|
for (const d of rows) {
|
|
48
|
+
if (!rowIsDense(d, visible)) continue;
|
|
33
49
|
let total = 0;
|
|
34
50
|
for (const s of visible) total += s.getValue(d) ?? 0;
|
|
35
51
|
if (total > maxTotal) maxTotal = total;
|
|
@@ -40,6 +56,7 @@ function StackedAreaInner(props) {
|
|
|
40
56
|
}, [y]);
|
|
41
57
|
const stackedCursorValue = useCallback(
|
|
42
58
|
(d, s, visible) => {
|
|
59
|
+
if (!rowIsDense(d, visible)) return null;
|
|
43
60
|
let total = 0;
|
|
44
61
|
for (let i = visible.length - 1; i >= 0; i--) {
|
|
45
62
|
const band = visible[i];
|
|
@@ -63,11 +80,15 @@ function StackedAreaInner(props) {
|
|
|
63
80
|
...xTicks !== void 0 && { xTicks },
|
|
64
81
|
...xTickValues !== void 0 && { xTickValues },
|
|
65
82
|
...formatX !== void 0 && { formatX },
|
|
83
|
+
...xLabelRotate !== void 0 && { xLabelRotate },
|
|
66
84
|
...cursorResolution !== void 0 && { cursorResolution },
|
|
67
85
|
...height !== void 0 && { height },
|
|
68
86
|
...legend !== void 0 && { legend },
|
|
69
87
|
...ariaLabel !== void 0 && { ariaLabel },
|
|
70
88
|
...isPending !== void 0 && { isPending },
|
|
89
|
+
...state !== void 0 && { state },
|
|
90
|
+
...className !== void 0 && { className },
|
|
91
|
+
...style !== void 0 && { style },
|
|
71
92
|
children: (ctx) => /* @__PURE__ */ jsx(StackedAreaMarks, { getX, ctx })
|
|
72
93
|
}
|
|
73
94
|
);
|
|
@@ -82,6 +103,7 @@ function StackedAreaMarks({ getX, ctx }) {
|
|
|
82
103
|
};
|
|
83
104
|
}, [visible]);
|
|
84
105
|
const rows = useMemo(() => [...ctx.data], [ctx.data]);
|
|
106
|
+
const curve = curveFor(visible.find((s) => s.curve !== void 0)?.curve);
|
|
85
107
|
return /* @__PURE__ */ jsx(
|
|
86
108
|
AreaStack,
|
|
87
109
|
{
|
|
@@ -91,7 +113,8 @@ function StackedAreaMarks({ getX, ctx }) {
|
|
|
91
113
|
y0: (d) => yScale(d[0]) ?? 0,
|
|
92
114
|
y1: (d) => yScale(d[1]) ?? 0,
|
|
93
115
|
value: (d, key) => seriesByKey.get(key)?.getValue(d) ?? 0,
|
|
94
|
-
|
|
116
|
+
defined: (d) => rowIsDense(d.data, visible),
|
|
117
|
+
curve,
|
|
95
118
|
children: ({ stacks, path }) => stacks.map((stack) => /* @__PURE__ */ jsx(
|
|
96
119
|
"path",
|
|
97
120
|
{
|
|
@@ -105,7 +128,9 @@ function StackedAreaMarks({ getX, ctx }) {
|
|
|
105
128
|
}
|
|
106
129
|
);
|
|
107
130
|
}
|
|
108
|
-
const
|
|
131
|
+
const StackedAreaMemo = memo(StackedAreaInner);
|
|
132
|
+
StackedAreaMemo.displayName = "StackedArea";
|
|
133
|
+
const StackedArea = StackedAreaMemo;
|
|
109
134
|
export {
|
|
110
135
|
StackedArea
|
|
111
136
|
};
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import type { BasaltProps } from '../../common/props.js';
|
|
1
2
|
import type { CursorResolution } from '../cursor/resolve.js';
|
|
2
3
|
import type { CartesianTooltipConfig, AxisConfig } from '../primitives/CartesianChart.js';
|
|
3
4
|
import type { XZoneSpec } from '../primitives/XZoneRects.js';
|
|
4
5
|
import type { ZoneSpec } from '../primitives/ZoneRects.js';
|
|
6
|
+
import type { ChartState } from '../primitives/ChartPending.js';
|
|
5
7
|
import type { ChartLegendConfig, ChartSeries } from '../series.js';
|
|
6
8
|
/** @deprecated Use ZoneSpec from primitives/ZoneRects. Kept as an alias for back-compat. */
|
|
7
9
|
export type ZonedLineZone = ZoneSpec;
|
|
@@ -18,7 +20,7 @@ export type ZonedLineRefLine = {
|
|
|
18
20
|
/** Solid by default; set true for a dashed line. */
|
|
19
21
|
dashed?: boolean;
|
|
20
22
|
};
|
|
21
|
-
export type ZonedLineProps<T> = {
|
|
23
|
+
export type ZonedLineProps<T> = BasaltProps & {
|
|
22
24
|
data: T[];
|
|
23
25
|
/** Fixed height in pixels, forwarded to `CartesianChart`. Default 240. */
|
|
24
26
|
height?: number;
|
|
@@ -46,6 +48,9 @@ export type ZonedLineProps<T> = {
|
|
|
46
48
|
xTickValues?: (keys: readonly string[], xMax: number) => readonly string[];
|
|
47
49
|
/** X tick label formatter. Default `fmtAxisDate` (DD.MM). */
|
|
48
50
|
formatX?: (key: string) => string;
|
|
51
|
+
/** Tilt the x tick labels 45° or 90°, or `0` to opt out of the phone tier's auto-rotation —
|
|
52
|
+
* see `CartesianChartProps.xLabelRotate`. */
|
|
53
|
+
xLabelRotate?: 0 | 45 | 90;
|
|
49
54
|
/**
|
|
50
55
|
* How a sibling chart's broadcast cursor key resolves against this chart's points. Default
|
|
51
56
|
* `'nearest'`. Pass `'leading'` when `getX` returns a bucket's leading edge (a weekly series
|
|
@@ -69,6 +74,9 @@ export type ZonedLineProps<T> = {
|
|
|
69
74
|
ariaLabel?: string;
|
|
70
75
|
/** Forwarded to `CartesianChart` — see `ChartPending`'s JSDoc for the three-state rationale. */
|
|
71
76
|
isPending?: boolean;
|
|
77
|
+
/** The three "nothing to draw" states in one prop — pending → error → empty. See
|
|
78
|
+
* `ChartState`; `isPending` stays a supported alias for `state={{ pending: true }}`. */
|
|
79
|
+
state?: ChartState;
|
|
72
80
|
};
|
|
73
81
|
/**
|
|
74
82
|
* Single-series line chart with zone backgrounds, threshold fills, an optional area gradient,
|
|
@@ -79,15 +87,11 @@ export type ZonedLineProps<T> = {
|
|
|
79
87
|
* and the derived tooltip — this kind draws ONLY the marks (thresholds, area fill, and the line).
|
|
80
88
|
* Single-series, so the legend is optional in practice but present by default.
|
|
81
89
|
*
|
|
82
|
-
* X-axis is built from the full `data` array so the calendar is preserved even
|
|
83
|
-
*
|
|
84
|
-
*
|
|
90
|
+
* X-axis is built from the full `data` array so the calendar is preserved even when the series has
|
|
91
|
+
* nulls; the line, the area fill and the threshold fills all BREAK at a null point, leaving a real
|
|
92
|
+
* gap rather than interpolating across it.
|
|
85
93
|
*/
|
|
86
94
|
declare function ZonedLineInner<T>(props: ZonedLineProps<T>): import("react").JSX.Element;
|
|
87
|
-
/**
|
|
88
|
-
* Hand-memoized: React Compiler does not process the shipped dist, so the hot ZonedLine kind is
|
|
89
|
-
* wrapped in `React.memo` to retain the auto-memoization it had as source (parity with Bars).
|
|
90
|
-
*/
|
|
91
95
|
export declare const ZonedLine: typeof ZonedLineInner;
|
|
92
96
|
export {};
|
|
93
97
|
//# sourceMappingURL=ZonedLine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ZonedLine.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/ZonedLine.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAe,MAAM,8BAA8B,CAAA;AAEnG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"ZonedLine.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/ZonedLine.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAe,MAAM,8BAA8B,CAAA;AAEnG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAE5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAG/D,4FAA4F;AAC5F,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAA;AAEpC,mFAAmF;AACnF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,GAAG,OAAO,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,0EAA0E;AAC1E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,oDAAoD;IACpD,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,WAAW,GAAG;IAC5C,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,oEAAoE;IACpE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;IACtB;;wEAEoE;IACpE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAA;IACxB;gEAC4D;IAC5D,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;IACjB,KAAK,CAAC,EAAE,aAAa,EAAE,CAAA;IACvB;sBACkB;IAClB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAA;IACpB,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAA;IACjC,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC7B,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;wBAEoB;IACpB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,CAAA;IAC1E,6DAA6D;IAC7D,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IACjC;iDAC6C;IAC7C,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAA;IAC1B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC;qGACiG;IACjG,OAAO,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;IAC3C;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IAC3B;4CACwC;IACxC,MAAM,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAAA;IAClC,qGAAqG;IACrG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gGAAgG;IAChG,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;4FACwF;IACxF,KAAK,CAAC,EAAE,UAAU,CAAA;CACnB,CAAA;AAeD;;;;;;;;;;;;GAYG;AACH,iBAAS,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,+BA6ElD;AAyGD,eAAO,MAAM,SAAS,EAAoB,OAAO,cAAc,CAAA"}
|
|
@@ -1,24 +1,18 @@
|
|
|
1
1
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { curveMonotoneX } from "@visx/curve";
|
|
3
2
|
import { AreaClosed, LinePath } from "@visx/shape";
|
|
4
3
|
import { Threshold } from "@visx/threshold";
|
|
5
4
|
import { memo, useMemo } from "react";
|
|
5
|
+
import { assertRequiredProps } from "../../common/validate.js";
|
|
6
6
|
import { AreaGradient, areaFillUrl } from "../primitives/AreaGradient.js";
|
|
7
7
|
import { CartesianChart } from "../primitives/CartesianChart.js";
|
|
8
|
-
import { LINE_OVERLAY_STROKE_WIDTH } from "../series.js";
|
|
8
|
+
import { curveFor, definedOn, LINE_OVERLAY_STROKE_WIDTH, toPlotPoint } from "../series.js";
|
|
9
9
|
import { VX } from "../../tokens/index.js";
|
|
10
|
-
function
|
|
10
|
+
function linePoints(series, data) {
|
|
11
11
|
if (!series) return [];
|
|
12
|
-
|
|
13
|
-
for (const d of data) {
|
|
14
|
-
const y = series.getValue(d);
|
|
15
|
-
if (y !== null && y !== void 0 && !Number.isNaN(y)) {
|
|
16
|
-
out.push(Object.assign({}, d, { __y: y }));
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return out;
|
|
12
|
+
return data.map((d) => Object.assign({}, d, { __y: toPlotPoint(series.getValue(d)) }));
|
|
20
13
|
}
|
|
21
14
|
function ZonedLineInner(props) {
|
|
15
|
+
assertRequiredProps("ZonedLine", props, ["data", "getX", "series"]);
|
|
22
16
|
const {
|
|
23
17
|
data,
|
|
24
18
|
chartId,
|
|
@@ -32,13 +26,17 @@ function ZonedLineInner(props) {
|
|
|
32
26
|
xTicks,
|
|
33
27
|
xTickValues,
|
|
34
28
|
formatX,
|
|
29
|
+
xLabelRotate,
|
|
35
30
|
cursorResolution,
|
|
36
31
|
tooltip,
|
|
37
32
|
areaFill,
|
|
38
33
|
height,
|
|
39
34
|
legend,
|
|
40
35
|
ariaLabel,
|
|
41
|
-
isPending
|
|
36
|
+
isPending,
|
|
37
|
+
state,
|
|
38
|
+
className,
|
|
39
|
+
style
|
|
42
40
|
} = props;
|
|
43
41
|
const styledSeries = useMemo(
|
|
44
42
|
() => series.map((s) => ({
|
|
@@ -61,12 +59,16 @@ function ZonedLineInner(props) {
|
|
|
61
59
|
...xTicks !== void 0 && { xTicks },
|
|
62
60
|
...xTickValues !== void 0 && { xTickValues },
|
|
63
61
|
...formatX !== void 0 && { formatX },
|
|
62
|
+
...xLabelRotate !== void 0 && { xLabelRotate },
|
|
64
63
|
...cursorResolution !== void 0 && { cursorResolution },
|
|
65
64
|
...tooltip !== void 0 && { tooltip },
|
|
66
65
|
...height !== void 0 && { height },
|
|
67
66
|
...legend !== void 0 && { legend },
|
|
68
67
|
...ariaLabel !== void 0 && { ariaLabel },
|
|
69
68
|
...isPending !== void 0 && { isPending },
|
|
69
|
+
...state !== void 0 && { state },
|
|
70
|
+
...className !== void 0 && { className },
|
|
71
|
+
...style !== void 0 && { style },
|
|
70
72
|
children: (ctx) => /* @__PURE__ */ jsx(
|
|
71
73
|
ZonedLineMarks,
|
|
72
74
|
{
|
|
@@ -89,7 +91,10 @@ function ZonedLineMarks({
|
|
|
89
91
|
}) {
|
|
90
92
|
const { data, visible, xScale, yScale, yMax } = ctx;
|
|
91
93
|
const primary = visible[0];
|
|
92
|
-
const
|
|
94
|
+
const pts = useMemo(() => linePoints(primary, data), [primary, data]);
|
|
95
|
+
const defined = definedOn(yScale);
|
|
96
|
+
const curve = curveFor(primary?.curve);
|
|
97
|
+
const yOf = (d) => yScale(d.__y ?? NaN);
|
|
93
98
|
const showArea = areaFill !== void 0 && areaFill !== false;
|
|
94
99
|
const areaColor = typeof areaFill === "string" ? areaFill : primary?.color;
|
|
95
100
|
const areaId = `${chartId}-area`;
|
|
@@ -98,13 +103,14 @@ function ZonedLineMarks({
|
|
|
98
103
|
Threshold,
|
|
99
104
|
{
|
|
100
105
|
id: `${chartId}-thr-${i}`,
|
|
101
|
-
data:
|
|
106
|
+
data: pts,
|
|
107
|
+
defined,
|
|
102
108
|
x: (d) => xScale(getX(d)) ?? 0,
|
|
103
109
|
y0: () => yScale(t.value),
|
|
104
|
-
y1:
|
|
110
|
+
y1: yOf,
|
|
105
111
|
clipAboveTo: 0,
|
|
106
112
|
clipBelowTo: yMax,
|
|
107
|
-
curve
|
|
113
|
+
curve,
|
|
108
114
|
belowAreaProps: { fill: t.side === "above" ? t.fill : "transparent" },
|
|
109
115
|
aboveAreaProps: { fill: t.side === "below" ? t.fill : "transparent" }
|
|
110
116
|
},
|
|
@@ -115,11 +121,12 @@ function ZonedLineMarks({
|
|
|
115
121
|
/* @__PURE__ */ jsx(
|
|
116
122
|
AreaClosed,
|
|
117
123
|
{
|
|
118
|
-
data:
|
|
124
|
+
data: pts,
|
|
125
|
+
defined,
|
|
119
126
|
x: (d) => xScale(getX(d)) ?? 0,
|
|
120
|
-
y:
|
|
127
|
+
y: yOf,
|
|
121
128
|
yScale,
|
|
122
|
-
curve
|
|
129
|
+
curve,
|
|
123
130
|
fill: areaFillUrl(areaId)
|
|
124
131
|
}
|
|
125
132
|
)
|
|
@@ -127,19 +134,22 @@ function ZonedLineMarks({
|
|
|
127
134
|
primary && /* @__PURE__ */ jsx(
|
|
128
135
|
LinePath,
|
|
129
136
|
{
|
|
130
|
-
data:
|
|
137
|
+
data: pts,
|
|
138
|
+
defined,
|
|
131
139
|
x: (d) => xScale(getX(d)) ?? 0,
|
|
132
|
-
y:
|
|
140
|
+
y: yOf,
|
|
133
141
|
stroke: primary.color,
|
|
134
142
|
strokeWidth: primary.strokeWidth ?? LINE_OVERLAY_STROKE_WIDTH,
|
|
135
143
|
strokeDasharray: primary.dash === "dashed" ? VX.dashArray : void 0,
|
|
136
144
|
strokeOpacity: primary.strokeOpacity ?? 1,
|
|
137
|
-
curve
|
|
145
|
+
curve
|
|
138
146
|
}
|
|
139
147
|
)
|
|
140
148
|
] });
|
|
141
149
|
}
|
|
142
|
-
const
|
|
150
|
+
const ZonedLineMemo = memo(ZonedLineInner);
|
|
151
|
+
ZonedLineMemo.displayName = "ZonedLine";
|
|
152
|
+
const ZonedLine = ZonedLineMemo;
|
|
143
153
|
export {
|
|
144
154
|
ZonedLine
|
|
145
155
|
};
|
|
@@ -9,6 +9,46 @@
|
|
|
9
9
|
* See `docs/CHARTS-SPEC.md` §1.
|
|
10
10
|
*/
|
|
11
11
|
import type { ChartMargin } from '../../tokens/index.js';
|
|
12
|
+
/**
|
|
13
|
+
* The `dx`/`dy` nudge `primitives/Axes.tsx` paints a rotated tick label through — the d3 idiom
|
|
14
|
+
* that puts a 45° label under its tick's lower-left and centres a 90° one on its vertical line.
|
|
15
|
+
*
|
|
16
|
+
* It lives HERE, and the axis imports it, because it is the one number that must be in both
|
|
17
|
+
* places: the nudge was applied at paint and absent from the measure, so §1's measured-equals-
|
|
18
|
+
* painted law broke in exactly the rotated case §8 introduced (the first label crossed the SVG's
|
|
19
|
+
* left edge by 3.2px at 390 and 5.7px at 320, and every rotated label's descender row sat on the
|
|
20
|
+
* bottom clip line). Move a value here and the gutter moves with it.
|
|
21
|
+
*/
|
|
22
|
+
export declare const ROTATED_LABEL_OFFSET: Record<45 | 90, {
|
|
23
|
+
dx: number;
|
|
24
|
+
dy: number;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* How far a rotated x label reaches LEFT of the plot's left edge, and how far BELOW the axis line —
|
|
28
|
+
* measured from the baseline point the axis anchors it at, through the same `dx`/`dy` the axis
|
|
29
|
+
* paints it with.
|
|
30
|
+
*
|
|
31
|
+
* `AxisBottomDate` anchors a rotated label at its right edge (`textAnchor: 'end'`) and rotates it
|
|
32
|
+
* counter-clockwise about that point, so the string runs down-and-to-the-LEFT from the tick it
|
|
33
|
+
* belongs to. The FIRST tick sits at the plot's left edge, so its label hangs into the left gutter;
|
|
34
|
+
* the LAST row of glyphs hangs below the axis. Rotating the label's box about its anchor gives both
|
|
35
|
+
* extents exactly:
|
|
36
|
+
*
|
|
37
|
+
* - left = `cos θ · (width + ascent) − dx` — zero at 90°, where the string runs straight down.
|
|
38
|
+
* - below = `tickLength + max(10, fontPx) + dy + sin θ · width + cos θ · descent`.
|
|
39
|
+
*
|
|
40
|
+
* Both carry {@link ROTATED_CLEARANCE} so the painted box clears the SVG's clip rather than
|
|
41
|
+
* touching it.
|
|
42
|
+
*/
|
|
43
|
+
export declare function rotatedLabelExtents(input: {
|
|
44
|
+
/** Width of the widest x tick label, already measured at the painted font. */
|
|
45
|
+
labelWidth: number;
|
|
46
|
+
fontPx: number;
|
|
47
|
+
rotate: number;
|
|
48
|
+
}): {
|
|
49
|
+
left: number;
|
|
50
|
+
below: number;
|
|
51
|
+
};
|
|
12
52
|
export type AutoMarginInput = {
|
|
13
53
|
/** Left-axis tick labels, already formatted. */
|
|
14
54
|
left?: readonly string[];
|
|
@@ -18,21 +58,34 @@ export type AutoMarginInput = {
|
|
|
18
58
|
bottom?: readonly string[];
|
|
19
59
|
/** Degrees of counter-clockwise rotation applied to the x tick labels. Default 0. */
|
|
20
60
|
rotate?: number;
|
|
21
|
-
/** Tick-label font size. Default `VX.axisFont`.
|
|
61
|
+
/** Tick-label font size. Default `VX.axisFont`. A phone-tier chart passes its own smaller size
|
|
62
|
+
* (`chartTierMetrics().axisFont`) — the measured label must be the painted label. */
|
|
22
63
|
fontPx?: number;
|
|
64
|
+
/**
|
|
65
|
+
* Per-side FLOORS. Default `VX.margin`. The phone tier passes its tightened set
|
|
66
|
+
* (`chartTierMetrics().margin`) so a static 44px left gutter does not spend an eighth of a 360px
|
|
67
|
+
* chart on a three-character label. The law itself does not move: a side may still only ever
|
|
68
|
+
* grow past its floor.
|
|
69
|
+
*/
|
|
70
|
+
floor?: ChartMargin;
|
|
23
71
|
/** Explicit per-side overrides — applied LAST, so an escape hatch always wins. */
|
|
24
72
|
override?: Partial<ChartMargin>;
|
|
25
73
|
};
|
|
26
74
|
/**
|
|
27
75
|
* Resolve the four margins from measured labels.
|
|
28
76
|
*
|
|
29
|
-
* Law, per side:
|
|
30
|
-
* - `left` — widest left label + gap, floored at `VX.margin.left`.
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
77
|
+
* Law, per side (the floors are `VX.margin` by default; a tier may tighten them via `floor`):
|
|
78
|
+
* - `left` — widest left label + gap, floored at `VX.margin.left`. When the x labels are ROTATED
|
|
79
|
+
* they also reach into this gutter, so the left side additionally clears their leftward
|
|
80
|
+
* extent — see {@link rotatedLabelExtents}.
|
|
81
|
+
* - `right` — with a right axis: widest right label + gap. Without one, and the x labels are NOT
|
|
82
|
+
* rotated: half the widest x label, so the LAST x tick (centered on the plot's right edge)
|
|
83
|
+
* cannot clip. Without one AND rotated: nothing — a rotated label is anchored at its right edge
|
|
84
|
+
* (`textAnchor: 'end'`, same as {@link rotatedLabelExtents}), so it hangs left of its tick, not
|
|
85
|
+
* right, and reserving half its width would pad a side nothing paints into. Every case is
|
|
86
|
+
* floored at `VX.margin.right`.
|
|
87
|
+
* - `bottom` — one label line + gap; when ROTATED, the label's measured drop below the axis line
|
|
88
|
+
* ({@link rotatedLabelExtents}) instead. Floored at `VX.margin.bottom`.
|
|
36
89
|
* - `top` — `VX.margin.top`. Nothing measures into it; a chart that draws into the top gutter
|
|
37
90
|
* passes an override.
|
|
38
91
|
*/
|
|
@@ -53,6 +106,10 @@ export declare function probeAxisLabels(opts: {
|
|
|
53
106
|
format?: (v: number) => string;
|
|
54
107
|
/** Must match the real scale's `nice` — niceing changes which ticks exist. */
|
|
55
108
|
nice?: boolean;
|
|
109
|
+
/** `'log'` measures through {@link logTickValues} instead of a linear probe scale — the same
|
|
110
|
+
* helper the axis paints from (CHARTS-SPEC §1: measured labels == painted labels). Default
|
|
111
|
+
* `'linear'`. */
|
|
112
|
+
scale?: 'linear' | 'log';
|
|
56
113
|
}): {
|
|
57
114
|
labels: string[];
|
|
58
115
|
format: (v: number) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-margin.d.ts","sourceRoot":"","sources":["../../../src/charts/layout/auto-margin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"auto-margin.d.ts","sourceRoot":"","sources":["../../../src/charts/layout/auto-margin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAgC/C;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAG5E,CAAA;AASD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAiBlC;AAUD,MAAM,MAAM,eAAe,GAAG;IAC5B,gDAAgD;IAChD,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxB,+FAA+F;IAC/F,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACzB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1B,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;yFACqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;;OAKG;IACH,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;CAChC,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,KAAK,GAAE,eAAoB,GAAG,WAAW,CA8BnE;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACpC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,sCAAsC;IACtC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9B,8EAA8E;IAC9E,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;qBAEiB;IACjB,KAAK,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CACzB,GAAG;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,CAatD"}
|
|
@@ -1,28 +1,61 @@
|
|
|
1
1
|
import { scaleLinear } from "@visx/scale";
|
|
2
2
|
import { VX } from "../../tokens/index.js";
|
|
3
3
|
import { maxTextWidth } from "../utils/measure-text.js";
|
|
4
|
+
import { logTickValues, niceLogDomain } from "./log-ticks.js";
|
|
4
5
|
const AXIS_TICK_GAP = 12;
|
|
5
6
|
const lineHeight = (fontPx) => Math.ceil(fontPx * 1.35);
|
|
7
|
+
const DESCENT_RATIO = 0.3;
|
|
8
|
+
const descent = (fontPx) => fontPx * DESCENT_RATIO;
|
|
9
|
+
const ascent = (fontPx) => lineHeight(fontPx) - descent(fontPx);
|
|
10
|
+
const AXIS_TICK_LENGTH = 8;
|
|
11
|
+
const VISX_MIN_LABEL_FONT = 10;
|
|
12
|
+
const ROTATED_LABEL_OFFSET = {
|
|
13
|
+
45: { dx: -6, dy: 2 },
|
|
14
|
+
90: { dx: -4, dy: 4 }
|
|
15
|
+
};
|
|
16
|
+
const ROTATED_CLEARANCE = 2;
|
|
17
|
+
const rotatedOffset = (rotate) => ROTATED_LABEL_OFFSET[rotate] ?? { dx: 0, dy: 0 };
|
|
18
|
+
function rotatedLabelExtents(input) {
|
|
19
|
+
const { labelWidth, fontPx, rotate } = input;
|
|
20
|
+
if (rotate === 0) return { left: 0, below: 0 };
|
|
21
|
+
const radians = rotate * Math.PI / 180;
|
|
22
|
+
const cos = Math.abs(Math.cos(radians));
|
|
23
|
+
const sin = Math.abs(Math.sin(radians));
|
|
24
|
+
const { dx, dy } = rotatedOffset(rotate);
|
|
25
|
+
return {
|
|
26
|
+
left: cos * (labelWidth + ascent(fontPx)) - dx + ROTATED_CLEARANCE,
|
|
27
|
+
below: AXIS_TICK_LENGTH + Math.max(VISX_MIN_LABEL_FONT, fontPx) + dy + sin * labelWidth + cos * descent(fontPx) + ROTATED_CLEARANCE
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const LOG_TICK_FORMAT = new Intl.NumberFormat("en-US", { maximumFractionDigits: 20 });
|
|
6
31
|
function autoMargin(input = {}) {
|
|
7
32
|
const fontPx = input.fontPx ?? VX.axisFont;
|
|
8
|
-
const { left = [], right = [], bottom = [], rotate = 0, override } = input;
|
|
33
|
+
const { left = [], right = [], bottom = [], rotate = 0, floor = VX.margin, override } = input;
|
|
9
34
|
const leftWidth = maxTextWidth(left, fontPx);
|
|
10
35
|
const rightWidth = maxTextWidth(right, fontPx);
|
|
11
36
|
const bottomWidth = maxTextWidth(bottom, fontPx);
|
|
12
|
-
const
|
|
13
|
-
const bottomExtent = rotate === 0 ? lineHeight(fontPx) :
|
|
14
|
-
Math.abs(bottomWidth * Math.sin(radians)) + Math.abs(lineHeight(fontPx) * Math.cos(radians))
|
|
15
|
-
);
|
|
37
|
+
const rotated = rotatedLabelExtents({ labelWidth: bottomWidth, fontPx, rotate });
|
|
38
|
+
const bottomExtent = rotate === 0 ? lineHeight(fontPx) + AXIS_TICK_GAP : rotated.below;
|
|
16
39
|
return {
|
|
17
|
-
top: override?.top ??
|
|
40
|
+
top: override?.top ?? floor.top,
|
|
18
41
|
right: override?.right ?? Math.ceil(
|
|
19
|
-
Math.max(
|
|
42
|
+
Math.max(
|
|
43
|
+
floor.right,
|
|
44
|
+
right.length > 0 ? rightWidth + AXIS_TICK_GAP : rotate === 0 ? bottomWidth / 2 : 0
|
|
45
|
+
)
|
|
20
46
|
),
|
|
21
|
-
bottom: override?.bottom ?? Math.ceil(Math.max(
|
|
22
|
-
left: override?.left ?? Math.ceil(
|
|
47
|
+
bottom: override?.bottom ?? Math.ceil(Math.max(floor.bottom, bottomExtent)),
|
|
48
|
+
left: override?.left ?? Math.ceil(
|
|
49
|
+
Math.max(floor.left, left.length > 0 ? leftWidth + AXIS_TICK_GAP : 0, rotated.left)
|
|
50
|
+
)
|
|
23
51
|
};
|
|
24
52
|
}
|
|
25
53
|
function probeAxisLabels(opts) {
|
|
54
|
+
if (opts.scale === "log") {
|
|
55
|
+
const domain = opts.nice === true ? niceLogDomain(opts.domain) : opts.domain;
|
|
56
|
+
const format2 = opts.format ?? ((v) => LOG_TICK_FORMAT.format(v));
|
|
57
|
+
return { labels: logTickValues(domain, opts.ticks).map(format2), format: format2 };
|
|
58
|
+
}
|
|
26
59
|
const probe = scaleLinear({
|
|
27
60
|
domain: opts.domain,
|
|
28
61
|
range: [1, 0],
|
|
@@ -32,6 +65,8 @@ function probeAxisLabels(opts) {
|
|
|
32
65
|
return { labels: probe.ticks(opts.ticks).map(format), format };
|
|
33
66
|
}
|
|
34
67
|
export {
|
|
68
|
+
ROTATED_LABEL_OFFSET,
|
|
35
69
|
autoMargin,
|
|
36
|
-
probeAxisLabels
|
|
70
|
+
probeAxisLabels,
|
|
71
|
+
rotatedLabelExtents
|
|
37
72
|
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 1-2-5 mantissa tick law for a log axis (`docs/CHARTS-SPEC.md` §2).
|
|
3
|
+
*
|
|
4
|
+
* d3's own `scaleLog().ticks()` multiplies the mantissa density by the number of decades the
|
|
5
|
+
* domain spans, so a wide financial range (e.g. $10k–$300k) reads `$316,228 / $100,000 / $31,623 /
|
|
6
|
+
* $10,000` — every finance reference instead ticks a log price axis at `{1, 2, 5} × 10^n`
|
|
7
|
+
* (`$10,000 · $20,000 · $50,000 · $100,000`). Pure, no visx dependency, so both the measured
|
|
8
|
+
* (`probeAxisLabels`) and painted (`CartesianChart`) sides can share the exact same tick list.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Every `{1, 2, 5} × 10^k` value for every decade touching `[min, max]`, filtered to the domain —
|
|
12
|
+
* escalating through {@link MANTISSA_SETS} while a set leaves fewer than {@link DENSIFY_BELOW}
|
|
13
|
+
* candidates (a short span collapses the strict law to one tick). The exact same list is what
|
|
14
|
+
* `probeAxisLabels` measures and what `CartesianChart` paints, so the two can never disagree.
|
|
15
|
+
* An over-budget result collapses to whole decades only when the decades ALONE form a readable
|
|
16
|
+
* axis ({@link DENSIFY_BELOW}+ in-domain); otherwise it is thinned by a budget-derived stride
|
|
17
|
+
* (may exceed `ticks` by one — see {@link thinToBudget}). Collapsing to decades unconditionally
|
|
18
|
+
* is the bug this ordering exists to prevent: a 4-year BTC window ($15.5k–$139k) holds ONE whole
|
|
19
|
+
* decade, so the collapse produced a single-tick axis. Never returns a non-positive value; a
|
|
20
|
+
* non-positive or inverted domain (a log axis has no zero and no reversed extent) returns `[]`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function logTickValues([min, max]: readonly [number, number], ticks: number): number[];
|
|
23
|
+
/** Round a domain outward to the nearest enclosing power-of-10 bounds — the log analog of
|
|
24
|
+
* `scale.nice()`, used to keep `probeAxisLabels` (measurement) and the real niced scale
|
|
25
|
+
* (rendering) computing ticks from the same rounded domain. */
|
|
26
|
+
export declare function niceLogDomain([min, max]: readonly [number, number]): [number, number];
|
|
27
|
+
//# sourceMappingURL=log-ticks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-ticks.d.ts","sourceRoot":"","sources":["../../../src/charts/layout/log-ticks.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA0CH;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAoB5F;AAED;;+DAE+D;AAC/D,wBAAgB,aAAa,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAErF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const MANTISSA_SETS = [
|
|
2
|
+
[1, 2, 5],
|
|
3
|
+
[1, 1.5, 2, 3, 4, 5, 7],
|
|
4
|
+
[1, 1.5, 2, 2.5, 3, 4, 5, 6, 7, 8, 9]
|
|
5
|
+
];
|
|
6
|
+
const DENSIFY_BELOW = 4;
|
|
7
|
+
function decadeExponents(min, max) {
|
|
8
|
+
const lo = Math.floor(Math.log10(min));
|
|
9
|
+
const hi = Math.ceil(Math.log10(max));
|
|
10
|
+
const exponents = [];
|
|
11
|
+
for (let k = lo; k <= hi; k++) exponents.push(k);
|
|
12
|
+
return exponents;
|
|
13
|
+
}
|
|
14
|
+
function thinToBudget(values, ticks) {
|
|
15
|
+
if (values.length <= ticks) return values;
|
|
16
|
+
const stride = Math.ceil(values.length / ticks);
|
|
17
|
+
const thinned = values.filter((_, i) => i % stride === 0);
|
|
18
|
+
const last = values[values.length - 1];
|
|
19
|
+
return thinned[thinned.length - 1] === last ? thinned : [...thinned, last];
|
|
20
|
+
}
|
|
21
|
+
function logTickValues([min, max], ticks) {
|
|
22
|
+
if (min <= 0 || max <= 0 || min >= max) return [];
|
|
23
|
+
const exponents = decadeExponents(min, max);
|
|
24
|
+
const inDomain = (v) => v >= min && v <= max;
|
|
25
|
+
const collect = (mantissas) => exponents.flatMap((k) => mantissas.map((m) => m * 10 ** k)).filter(inDomain);
|
|
26
|
+
let resolved = [];
|
|
27
|
+
for (const mantissas of MANTISSA_SETS) {
|
|
28
|
+
resolved = collect(mantissas);
|
|
29
|
+
if (resolved.length >= DENSIFY_BELOW) break;
|
|
30
|
+
}
|
|
31
|
+
if (resolved.length <= ticks) return resolved;
|
|
32
|
+
const decades = exponents.map((k) => 10 ** k).filter(inDomain);
|
|
33
|
+
if (decades.length >= DENSIFY_BELOW) return thinToBudget(decades, ticks);
|
|
34
|
+
return thinToBudget(resolved, ticks);
|
|
35
|
+
}
|
|
36
|
+
function niceLogDomain([min, max]) {
|
|
37
|
+
return [10 ** Math.floor(Math.log10(min)), 10 ** Math.ceil(Math.log10(max))];
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
logTickValues,
|
|
41
|
+
niceLogDomain
|
|
42
|
+
};
|