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,6 +1,8 @@
|
|
|
1
1
|
import { Group } from '@visx/group'
|
|
2
2
|
import { memo, useMemo } from 'react'
|
|
3
3
|
import type { ReactNode } from 'react'
|
|
4
|
+
import { assertRequiredProps } from '../../common/validate'
|
|
5
|
+
import type { BasaltProps } from '../../common/props'
|
|
4
6
|
import { VX, alpha } from '../../tokens'
|
|
5
7
|
import type { ChartMargin } from '../../tokens'
|
|
6
8
|
import type { CursorResolution } from '../cursor/resolve'
|
|
@@ -17,8 +19,10 @@ import {
|
|
|
17
19
|
import { Crosshair } from '../primitives/Crosshair'
|
|
18
20
|
import { HatchPattern, hatchFill, hatchSizeFor } from '../primitives/HatchPattern'
|
|
19
21
|
import { HoverOverlay } from '../primitives/HoverOverlay'
|
|
22
|
+
import type { ChartState } from '../primitives/ChartPending'
|
|
20
23
|
import type { ChartLegendConfig, SeriesStyle } from '../series'
|
|
21
24
|
import { fmtAxisDate } from '../utils/format'
|
|
25
|
+
import { isDev } from '../../utils/is-dev'
|
|
22
26
|
|
|
23
27
|
/**
|
|
24
28
|
* A state a strip can draw. Extends `SeriesStyle` rather than `ChartSeries` because a band has no
|
|
@@ -78,7 +82,7 @@ export type BandSpan = {
|
|
|
78
82
|
}
|
|
79
83
|
}
|
|
80
84
|
|
|
81
|
-
export type BandStripProps<T> = {
|
|
85
|
+
export type BandStripProps<T> = BasaltProps & {
|
|
82
86
|
data: readonly T[]
|
|
83
87
|
/** Stable id — identifies this chart as the cursor's source. */
|
|
84
88
|
chartId: string
|
|
@@ -110,8 +114,10 @@ export type BandStripProps<T> = {
|
|
|
110
114
|
cursorResolution?: CursorResolution
|
|
111
115
|
tooltip?: BandTooltipConfig<T> | false
|
|
112
116
|
legend?: ChartLegendConfig | false
|
|
113
|
-
/** Colour of the absence hatch. Names a `series` entry, so absence
|
|
114
|
-
* state — a hatched band is the one mark a reader cannot decode from
|
|
117
|
+
/** Colour of the absence hatch, AND the state that is absent. Names a `series` entry, so absence
|
|
118
|
+
* is legended like any other state — a hatched band is the one mark a reader cannot decode from
|
|
119
|
+
* an axis. A slot in this state hatches across its whole width unless its own `absentFraction`
|
|
120
|
+
* says otherwise; a slot in any other state hatches only its `absentFraction`. Default
|
|
115
121
|
* `VX.neutral`, unnamed. A key naming no `series` entry throws (a PROP, so a typo can only be a
|
|
116
122
|
* wiring error) rather than falling back to the unnamed default. */
|
|
117
123
|
absentState?: string
|
|
@@ -122,6 +128,9 @@ export type BandStripProps<T> = {
|
|
|
122
128
|
ariaLabel?: string
|
|
123
129
|
/** Forwarded to `ChartFrame` — see `ChartPending`'s JSDoc. */
|
|
124
130
|
isPending?: boolean
|
|
131
|
+
/** The three "nothing to draw" states in one prop — pending → error → empty. See
|
|
132
|
+
* `ChartState`; `isPending` stays a supported alias for `state={{ pending: true }}`. */
|
|
133
|
+
state?: ChartState
|
|
125
134
|
}
|
|
126
135
|
|
|
127
136
|
const DEFAULT_MARKER_INSET = 6
|
|
@@ -142,13 +151,6 @@ const UNKNOWN_MARK = {
|
|
|
142
151
|
strokeDasharray: '3 2',
|
|
143
152
|
} as const
|
|
144
153
|
|
|
145
|
-
/** The house dev gate (`src/provider`, `src/agent-chat` use the same expression): `basaltViteConfig`
|
|
146
|
-
* defines `process.env.NODE_ENV`, so a production bundle constant-folds this to `false` and drops
|
|
147
|
-
* the throw. Read per call, never hoisted to a module const, so a test can flip it. */
|
|
148
|
-
function isDev(): boolean {
|
|
149
|
-
return process.env['NODE_ENV'] !== 'production'
|
|
150
|
-
}
|
|
151
|
-
|
|
152
154
|
/**
|
|
153
155
|
* A `state` (or `marker.state`) naming no `series` entry.
|
|
154
156
|
*
|
|
@@ -187,7 +189,12 @@ function formatBandValue<T>(style: BandStripSeries<T>, datum: T): string {
|
|
|
187
189
|
* nothing measured, and a fact that must not be read off the ramp.
|
|
188
190
|
*/
|
|
189
191
|
function BandStripInner<T>(props: BandStripProps<T>) {
|
|
190
|
-
|
|
192
|
+
// F-ERR-1: name the component and the prop. Without this a missing accessor surfaces
|
|
193
|
+
// from inside visx as `undefined is not a function`, which `BasaltErrorBoundary`
|
|
194
|
+
// swallows into a blank subtree that names nothing.
|
|
195
|
+
assertRequiredProps('BandStrip', props, ['data', 'getX', 'series', 'getBand'])
|
|
196
|
+
const { series, chartId, height, fill, legend, ariaLabel, isPending, state, className, style } =
|
|
197
|
+
props
|
|
191
198
|
|
|
192
199
|
return (
|
|
193
200
|
<ChartFrame
|
|
@@ -197,6 +204,9 @@ function BandStripInner<T>(props: BandStripProps<T>) {
|
|
|
197
204
|
{...(fill !== undefined && { fill })}
|
|
198
205
|
{...(ariaLabel !== undefined && { ariaLabel })}
|
|
199
206
|
{...(isPending !== undefined && { isPending })}
|
|
207
|
+
{...(state !== undefined && { state })}
|
|
208
|
+
{...(className !== undefined && { className })}
|
|
209
|
+
{...(style !== undefined && { style })}
|
|
200
210
|
legend={resolveLegend(legend)}
|
|
201
211
|
>
|
|
202
212
|
{(plot) => <BandStripPlot {...props} plot={plot} />}
|
|
@@ -279,7 +289,15 @@ function BandStripPlot<T>(props: BandStripPlotProps<T>) {
|
|
|
279
289
|
// Clamped AND finite-checked. `foldedFrom` is carried by the consumer's datum, so a
|
|
280
290
|
// 0/0 on an un-folded slot arrives here as NaN — which `Math.min`/`Math.max` propagate
|
|
281
291
|
// straight into `width="NaN"`, a band that silently fails to paint.
|
|
282
|
-
|
|
292
|
+
// A slot whose STATE is the absent one is absent in whole — `absentState` and
|
|
293
|
+
// `absentFraction` are two ways of saying the same thing, and gating the hatch on the
|
|
294
|
+
// fraction alone meant a strip declaring `absentState` painted a flat fill while the docs,
|
|
295
|
+
// the demo and its own `<pattern>` all promised hatching. An explicit `absentFraction` still
|
|
296
|
+
// wins: a partially-covered slot in the absent state says so itself.
|
|
297
|
+
const absent =
|
|
298
|
+
span.state === absentState
|
|
299
|
+
? clampFraction(span.absentFraction ?? 1)
|
|
300
|
+
: clampFraction(span.absentFraction)
|
|
283
301
|
const measuredWidth = bandWidth * (1 - absent)
|
|
284
302
|
const hatchWidth = bandWidth - measuredWidth
|
|
285
303
|
const markerKey = span.marker?.state ?? span.state
|
|
@@ -327,7 +345,7 @@ function BandStripPlot<T>(props: BandStripPlotProps<T>) {
|
|
|
327
345
|
)
|
|
328
346
|
})
|
|
329
347
|
return out
|
|
330
|
-
}, [bands, getBand, getX, styleByKey, hidden, bandWidth, step, stripHeight, hatchId])
|
|
348
|
+
}, [bands, getBand, getX, styleByKey, hidden, bandWidth, step, stripHeight, hatchId, absentState])
|
|
331
349
|
|
|
332
350
|
if (plotWidth <= 0 || bands.length === 0) return null
|
|
333
351
|
|
|
@@ -454,4 +472,8 @@ function deriveBandRow<T>(
|
|
|
454
472
|
* Hand-memoized: React Compiler does not process the shipped dist, so the hot kind is wrapped in
|
|
455
473
|
* `React.memo` to retain the auto-memoization it had as source (parity with `DualPanel`).
|
|
456
474
|
*/
|
|
457
|
-
|
|
475
|
+
const BandStripMemo = memo(BandStripInner)
|
|
476
|
+
// Without it every kind reads as `Memo` in React DevTools (audit A16) — a profiler flame
|
|
477
|
+
// graph of nine identically-named nodes names nothing.
|
|
478
|
+
BandStripMemo.displayName = 'BandStrip'
|
|
479
|
+
export const BandStrip = BandStripMemo as typeof BandStripInner
|
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
import { curveMonotoneX } from '@visx/curve'
|
|
2
1
|
import { LinePath } from '@visx/shape'
|
|
3
2
|
import { memo, useMemo } from 'react'
|
|
3
|
+
import { assertRequiredProps } from '../../common/validate'
|
|
4
|
+
import type { BasaltProps } from '../../common/props'
|
|
4
5
|
import type { CursorResolution } from '../cursor/resolve'
|
|
5
6
|
import { VX } from '../../tokens'
|
|
6
7
|
import type { ChartMargin } from '../../tokens'
|
|
7
8
|
import { CartesianChart } from '../primitives/CartesianChart'
|
|
8
9
|
import type { AxisConfig, CartesianTooltipConfig, PlotContext } from '../primitives/CartesianChart'
|
|
9
10
|
import type { ZoneSpec } from '../primitives/ZoneRects'
|
|
10
|
-
import {
|
|
11
|
-
import
|
|
11
|
+
import type { ChartState } from '../primitives/ChartPending'
|
|
12
|
+
import { curveFor, LINE_OVERLAY_STROKE_WIDTH } from '../series'
|
|
13
|
+
import type { ChartLegendConfig, ChartSeries, SeriesCurve } from '../series'
|
|
12
14
|
import { padAutoLower } from '../utils/domain'
|
|
15
|
+
import { isDev } from '../../utils/is-dev'
|
|
13
16
|
|
|
14
17
|
/**
|
|
15
18
|
* `T = unknown` is load-bearing, not a shortcut: it keeps a consumer's existing
|
|
@@ -48,6 +51,8 @@ export type BarsLine<T = unknown> = {
|
|
|
48
51
|
tooltip?: boolean
|
|
49
52
|
/** Dims the plotted stroke AND the legend swatch, never the tooltip row (`SeriesStyle.strokeOpacity`). */
|
|
50
53
|
strokeOpacity?: number
|
|
54
|
+
/** Interpolation for this overlay. Default `'monotone'` — see `SeriesCurve`. */
|
|
55
|
+
curve?: SeriesCurve
|
|
51
56
|
}
|
|
52
57
|
|
|
53
58
|
/** @deprecated Use ZoneSpec from primitives/ZoneRects. Kept as an alias. */
|
|
@@ -61,7 +66,7 @@ export type BarsRefLine = {
|
|
|
61
66
|
axisSide?: 'left' | 'right'
|
|
62
67
|
}
|
|
63
68
|
|
|
64
|
-
export type BarsProps<T> = {
|
|
69
|
+
export type BarsProps<T> = BasaltProps & {
|
|
65
70
|
data: T[]
|
|
66
71
|
/** Fixed height in pixels, forwarded to `CartesianChart`. Default 240. */
|
|
67
72
|
height?: number
|
|
@@ -115,6 +120,9 @@ export type BarsProps<T> = {
|
|
|
115
120
|
xTickValues?: (keys: readonly string[], xMax: number) => readonly string[]
|
|
116
121
|
/** X tick label formatter. Default `fmtAxisDate` (DD.MM). */
|
|
117
122
|
formatX?: (key: string) => string
|
|
123
|
+
/** Tilt the x tick labels 45° or 90°, or `0` to opt out of the phone tier's auto-rotation —
|
|
124
|
+
* see `CartesianChartProps.xLabelRotate`. */
|
|
125
|
+
xLabelRotate?: 0 | 45 | 90
|
|
118
126
|
/**
|
|
119
127
|
* How a sibling chart's broadcast cursor key resolves against this chart's points. Default
|
|
120
128
|
* `'nearest'`. Pass `'leading'` when `getX` returns a bucket's leading edge (a weekly series
|
|
@@ -133,6 +141,9 @@ export type BarsProps<T> = {
|
|
|
133
141
|
ariaLabel?: string
|
|
134
142
|
/** Forwarded to `CartesianChart` — see `ChartPending`'s JSDoc for the three-state rationale. */
|
|
135
143
|
isPending?: boolean
|
|
144
|
+
/** The three "nothing to draw" states in one prop — pending → error → empty. See
|
|
145
|
+
* `ChartState`; `isPending` stays a supported alias for `state={{ pending: true }}`. */
|
|
146
|
+
state?: ChartState
|
|
136
147
|
}
|
|
137
148
|
|
|
138
149
|
/**
|
|
@@ -148,6 +159,10 @@ export type BarsProps<T> = {
|
|
|
148
159
|
* with per-bar nulls (nulls become visual gaps, not domain holes).
|
|
149
160
|
*/
|
|
150
161
|
function BarsInner<T>(props: BarsProps<T>) {
|
|
162
|
+
// F-ERR-1: name the component and the prop. Without this a missing accessor surfaces
|
|
163
|
+
// from inside visx as `undefined is not a function`, which `BasaltErrorBoundary`
|
|
164
|
+
// swallows into a blank subtree that names nothing.
|
|
165
|
+
assertRequiredProps('Bars', props, ['data', 'getX', 'getValue', 'positiveBars'])
|
|
151
166
|
const {
|
|
152
167
|
data,
|
|
153
168
|
height,
|
|
@@ -167,14 +182,28 @@ function BarsInner<T>(props: BarsProps<T>) {
|
|
|
167
182
|
xTicks,
|
|
168
183
|
xTickValues,
|
|
169
184
|
formatX,
|
|
185
|
+
xLabelRotate,
|
|
170
186
|
cursorResolution,
|
|
171
187
|
tooltip,
|
|
172
188
|
margin,
|
|
173
189
|
legend,
|
|
174
190
|
ariaLabel,
|
|
175
191
|
isPending,
|
|
192
|
+
state,
|
|
193
|
+
className,
|
|
194
|
+
style,
|
|
176
195
|
} = props
|
|
177
196
|
|
|
197
|
+
// Stacking sums bar heights via `posOffset`/`negOffset` in yScale units directly — a log axis
|
|
198
|
+
// has no additive zero, so a stacked total is meaningless on it (`docs/CHARTS-SPEC.md`'s null-gap
|
|
199
|
+
// + log contract). `grouped` bars only ever read one bar's own scaled value, so they're unaffected.
|
|
200
|
+
if (isDev() && barLayout === 'stacked' && y?.scale === 'log') {
|
|
201
|
+
throw new Error(
|
|
202
|
+
'Bars: stacked bars cannot use a log axis (y.scale: "log") — the stack sums bar heights, ' +
|
|
203
|
+
"and a log axis has no additive zero to sum from. Use barLayout: 'grouped' instead.",
|
|
204
|
+
)
|
|
205
|
+
}
|
|
206
|
+
|
|
178
207
|
const barSeries = useMemo<ChartSeries<T>[]>(
|
|
179
208
|
() =>
|
|
180
209
|
[...positiveBars, ...negativeBars].map((b) => ({
|
|
@@ -287,6 +316,7 @@ function BarsInner<T>(props: BarsProps<T>) {
|
|
|
287
316
|
{...(xTicks !== undefined && { xTicks })}
|
|
288
317
|
{...(xTickValues !== undefined && { xTickValues })}
|
|
289
318
|
{...(formatX !== undefined && { formatX })}
|
|
319
|
+
{...(xLabelRotate !== undefined && { xLabelRotate })}
|
|
290
320
|
{...(cursorResolution !== undefined && { cursorResolution })}
|
|
291
321
|
{...(zones !== undefined && { zones })}
|
|
292
322
|
{...(mappedRefLines !== undefined && { refLines: mappedRefLines })}
|
|
@@ -296,6 +326,9 @@ function BarsInner<T>(props: BarsProps<T>) {
|
|
|
296
326
|
{...(margin !== undefined && { margin })}
|
|
297
327
|
{...(ariaLabel !== undefined && { ariaLabel })}
|
|
298
328
|
{...(isPending !== undefined && { isPending })}
|
|
329
|
+
{...(state !== undefined && { state })}
|
|
330
|
+
{...(className !== undefined && { className })}
|
|
331
|
+
{...(style !== undefined && { style })}
|
|
299
332
|
>
|
|
300
333
|
{(ctx) => (
|
|
301
334
|
<BarsMarks
|
|
@@ -368,14 +401,27 @@ function BarsMarks<T>({
|
|
|
368
401
|
const scaleForSide = (side: 'left' | 'right' | undefined) =>
|
|
369
402
|
side === 'right' && y2Scale ? y2Scale : yScale
|
|
370
403
|
const dim = (key: string) => (highlighted === null || highlighted === key ? 1 : 0.15)
|
|
404
|
+
// The y a bar grows FROM. `scale(0)` is `-Infinity` on a log axis — which has no zero — so
|
|
405
|
+
// every grouped bar's height came out NaN and the bars silently vanished; the fallback is the
|
|
406
|
+
// axis' own domain floor, which the log-domain law keeps positive. On a linear axis the same
|
|
407
|
+
// expression still resolves to `scale(0)` for any domain reaching zero, and pins the bar to
|
|
408
|
+
// the visible floor rather than to a zero drawn off the bottom of the plot when it does not.
|
|
409
|
+
const baselineFor = (scale: typeof yScale) => {
|
|
410
|
+
const floor = scale.domain()[0] ?? 0
|
|
411
|
+
const at = scale(Math.max(floor, 0))
|
|
412
|
+
return Number.isFinite(at) ? at : scale(floor)
|
|
413
|
+
}
|
|
371
414
|
|
|
372
415
|
const groupWidth = Math.max((xMax / Math.max(rows.length, 1)) * barWidthRatio, 2)
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
416
|
+
// Tiled across the bars that are actually DRAWN. Derived from the full `positiveBars` instead,
|
|
417
|
+
// a legend toggle left a hole in the slot where the hidden bar used to sit and never re-tiled
|
|
418
|
+
// the survivors across the same width.
|
|
419
|
+
const groupedBars =
|
|
420
|
+
barLayout === 'grouped' ? positiveBars.filter((b) => !hidden.has(b.key)) : []
|
|
421
|
+
const totalWeight = groupedBars.reduce((s, b) => s + (b.weight ?? 1), 0) || 1
|
|
422
|
+
const groupedBarWidths = groupedBars.map((b) =>
|
|
423
|
+
Math.max(groupWidth * ((b.weight ?? 1) / totalWeight), 1),
|
|
424
|
+
)
|
|
379
425
|
const groupedBarOffsets: number[] = []
|
|
380
426
|
let cursor = 0
|
|
381
427
|
for (const w of groupedBarWidths) {
|
|
@@ -428,19 +474,20 @@ function BarsMarks<T>({
|
|
|
428
474
|
negOffset = top
|
|
429
475
|
}
|
|
430
476
|
} else {
|
|
431
|
-
|
|
432
|
-
if (hidden.has(b.key)) return
|
|
477
|
+
groupedBars.forEach((b, i) => {
|
|
433
478
|
const v = getValue(d, b.key)
|
|
434
479
|
if (v === null || Number.isNaN(v) || v <= 0) return
|
|
435
480
|
const scale = scaleForSide(b.axisSide)
|
|
436
481
|
const yTop = scale(v)
|
|
437
|
-
const yBottom = scale
|
|
482
|
+
const yBottom = baselineFor(scale)
|
|
438
483
|
rects.push({
|
|
439
484
|
key: `${getX(d)}-${b.key}`,
|
|
440
485
|
x: groupLeft + (groupedBarOffsets[i] ?? 0),
|
|
441
486
|
y: yTop,
|
|
442
487
|
width: groupedBarWidths[i] ?? 0,
|
|
443
|
-
|
|
488
|
+
// A value below a caller-pinned domain floor sits under the baseline; SVG rejects a
|
|
489
|
+
// negative height outright, so it clamps to nothing drawn.
|
|
490
|
+
height: Math.max(yBottom - yTop, 0),
|
|
444
491
|
fill: b.color,
|
|
445
492
|
fillOpacity: (barOpacity?.(d, b.key) ?? 0.85) * dim(b.key),
|
|
446
493
|
})
|
|
@@ -521,7 +568,7 @@ function BarsMarks<T>({
|
|
|
521
568
|
strokeWidth={ln.strokeWidth ?? LINE_OVERLAY_STROKE_WIDTH}
|
|
522
569
|
strokeDasharray={ln.dashed ? VX.dashArray : undefined}
|
|
523
570
|
strokeOpacity={dim(ln.key) * (ln.strokeOpacity ?? 1)}
|
|
524
|
-
curve={
|
|
571
|
+
curve={curveFor(ln.curve)}
|
|
525
572
|
/>
|
|
526
573
|
)
|
|
527
574
|
})}
|
|
@@ -537,4 +584,8 @@ function BarsMarks<T>({
|
|
|
537
584
|
* Hand-memoized: React Compiler does not process the shipped dist, so we wrap the
|
|
538
585
|
* hot bars kind in `React.memo` to retain the auto-memoization it had as source.
|
|
539
586
|
*/
|
|
540
|
-
|
|
587
|
+
const BarsMemo = memo(BarsInner)
|
|
588
|
+
// Without it every kind reads as `Memo` in React DevTools (audit A16) — a profiler flame
|
|
589
|
+
// graph of nine identically-named nodes names nothing.
|
|
590
|
+
BarsMemo.displayName = 'Bars'
|
|
591
|
+
export const Bars = BarsMemo as typeof BarsInner
|
|
@@ -2,8 +2,11 @@ import { Group } from '@visx/group'
|
|
|
2
2
|
import { Pie } from '@visx/shape'
|
|
3
3
|
import { memo, useMemo, useState } from 'react'
|
|
4
4
|
import type { PointerEvent, ReactNode } from 'react'
|
|
5
|
+
import { assertRequiredProps } from '../../common/validate'
|
|
6
|
+
import type { BasaltProps } from '../../common/props'
|
|
5
7
|
import { ChartTooltipFloat, TooltipBody, TooltipRow } from '../primitives/ChartTooltip'
|
|
6
8
|
import { ChartFrame } from '../primitives/ChartFrame'
|
|
9
|
+
import type { ChartState } from '../primitives/ChartPending'
|
|
7
10
|
import { VX } from '../../tokens'
|
|
8
11
|
import type { SeriesStyle } from '../series'
|
|
9
12
|
import type { SeriesKey } from '../../register'
|
|
@@ -15,7 +18,7 @@ import type { SeriesKey } from '../../register'
|
|
|
15
18
|
*/
|
|
16
19
|
export type DonutDatum<K extends string = SeriesKey> = { key: K; value: number }
|
|
17
20
|
|
|
18
|
-
export type DonutProps<K extends string = SeriesKey> = {
|
|
21
|
+
export type DonutProps<K extends string = SeriesKey> = BasaltProps & {
|
|
19
22
|
data: DonutDatum<K>[]
|
|
20
23
|
/** Fixed height in pixels, forwarded to the internal `ChartFrame`. Default 240. */
|
|
21
24
|
height?: number
|
|
@@ -54,6 +57,9 @@ export type DonutProps<K extends string = SeriesKey> = {
|
|
|
54
57
|
ariaLabel?: string
|
|
55
58
|
/** Forwarded to `ChartFrame` — see `ChartPending`'s JSDoc for the three-state rationale. */
|
|
56
59
|
isPending?: boolean
|
|
60
|
+
/** The three "nothing to draw" states in one prop — pending → error → empty. See
|
|
61
|
+
* `ChartState`; `isPending` stays a supported alias for `state={{ pending: true }}`. */
|
|
62
|
+
state?: ChartState
|
|
57
63
|
}
|
|
58
64
|
|
|
59
65
|
/**
|
|
@@ -66,7 +72,21 @@ export type DonutProps<K extends string = SeriesKey> = {
|
|
|
66
72
|
* category sync (donut ↔ bar, via a generalized key) is a distinct, deliberately deferred feature.
|
|
67
73
|
*/
|
|
68
74
|
function DonutInner<K extends string = SeriesKey>(props: DonutProps<K>) {
|
|
69
|
-
|
|
75
|
+
// F-ERR-1: name the component and the prop. Without this a missing accessor surfaces
|
|
76
|
+
// from inside visx as `undefined is not a function`, which `BasaltErrorBoundary`
|
|
77
|
+
// swallows into a blank subtree that names nothing.
|
|
78
|
+
assertRequiredProps('Donut', props, ['data', 'colorForKey'])
|
|
79
|
+
const {
|
|
80
|
+
data,
|
|
81
|
+
height,
|
|
82
|
+
colorForKey,
|
|
83
|
+
seriesLabel = (k) => k,
|
|
84
|
+
ariaLabel,
|
|
85
|
+
isPending,
|
|
86
|
+
state,
|
|
87
|
+
className,
|
|
88
|
+
style,
|
|
89
|
+
} = props
|
|
70
90
|
|
|
71
91
|
const series: SeriesStyle[] = data.map((d) => ({
|
|
72
92
|
key: d.key,
|
|
@@ -81,6 +101,9 @@ function DonutInner<K extends string = SeriesKey>(props: DonutProps<K>) {
|
|
|
81
101
|
{...(height !== undefined && { height })}
|
|
82
102
|
{...(ariaLabel !== undefined && { ariaLabel })}
|
|
83
103
|
{...(isPending !== undefined && { isPending })}
|
|
104
|
+
{...(state !== undefined && { state })}
|
|
105
|
+
{...(className !== undefined && { className })}
|
|
106
|
+
{...(style !== undefined && { style })}
|
|
84
107
|
>
|
|
85
108
|
{(plot) => <DonutPlot {...props} plot={plot} />}
|
|
86
109
|
</ChartFrame>
|
|
@@ -245,4 +268,8 @@ function DonutPlot<K extends string = SeriesKey>(props: DonutPlotProps<K>) {
|
|
|
245
268
|
* Hand-memoized: React Compiler does not process the shipped dist, so we wrap the
|
|
246
269
|
* hot donut kind in `React.memo` to retain the auto-memoization it had as source.
|
|
247
270
|
*/
|
|
248
|
-
|
|
271
|
+
const DonutMemo = memo(DonutInner)
|
|
272
|
+
// Without it every kind reads as `Memo` in React DevTools (audit A16) — a profiler flame
|
|
273
|
+
// graph of nine identically-named nodes names nothing.
|
|
274
|
+
DonutMemo.displayName = 'Donut'
|
|
275
|
+
export const Donut = DonutMemo as typeof DonutInner
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { curveMonotoneX } from '@visx/curve'
|
|
2
1
|
import { GridRows } from '@visx/grid'
|
|
3
2
|
import { Group } from '@visx/group'
|
|
4
3
|
import { scaleLinear, scalePoint } from '@visx/scale'
|
|
@@ -6,6 +5,8 @@ import { Bar, LinePath } from '@visx/shape'
|
|
|
6
5
|
import { Threshold } from '@visx/threshold'
|
|
7
6
|
import { memo, useMemo, useRef } from 'react'
|
|
8
7
|
import type { ReactNode } from 'react'
|
|
8
|
+
import { assertRequiredProps } from '../../common/validate'
|
|
9
|
+
import type { BasaltProps } from '../../common/props'
|
|
9
10
|
import { AxisBottomDate, AxisLeftNumeric } from '../primitives/Axes'
|
|
10
11
|
import {
|
|
11
12
|
ChartTooltipFloat,
|
|
@@ -18,16 +19,17 @@ import { Crosshair, SeriesDot } from '../primitives/Crosshair'
|
|
|
18
19
|
import { HoverOverlay } from '../primitives/HoverOverlay'
|
|
19
20
|
import { ZoneRects } from '../primitives/ZoneRects'
|
|
20
21
|
import type { ZoneSpec } from '../primitives/ZoneRects'
|
|
22
|
+
import type { ChartState } from '../primitives/ChartPending'
|
|
21
23
|
import type { CursorResolution } from '../cursor/resolve'
|
|
22
24
|
import { useChartCursor } from '../hooks/useChartCursor'
|
|
23
25
|
import { autoMargin, probeAxisLabels } from '../layout/auto-margin'
|
|
24
|
-
import { deriveTooltipRows, LINE_OVERLAY_STROKE_WIDTH } from '../series'
|
|
26
|
+
import { curveFor, deriveTooltipRows, LINE_OVERLAY_STROKE_WIDTH } from '../series'
|
|
25
27
|
import type { ChartLegendConfig, ChartSeries, SeriesStyle } from '../series'
|
|
26
28
|
import { VX } from '../../tokens'
|
|
27
29
|
import { fmtAxisDate } from '../utils/format'
|
|
28
|
-
import { smartTicks } from '../utils/ticks'
|
|
30
|
+
import { smartTicks, xLabelPxFor } from '../utils/ticks'
|
|
29
31
|
|
|
30
|
-
export type DualPanelProps<T> = {
|
|
32
|
+
export type DualPanelProps<T> = BasaltProps & {
|
|
31
33
|
data: T[]
|
|
32
34
|
/** Fixed height in pixels, forwarded to the internal `ChartFrame`. Default 240. */
|
|
33
35
|
height?: number
|
|
@@ -98,6 +100,9 @@ export type DualPanelProps<T> = {
|
|
|
98
100
|
ariaLabel?: string
|
|
99
101
|
/** Forwarded to `ChartFrame` — see `ChartPending`'s JSDoc for the three-state rationale. */
|
|
100
102
|
isPending?: boolean
|
|
103
|
+
/** The three "nothing to draw" states in one prop — pending → error → empty. See
|
|
104
|
+
* `ChartState`; `isPending` stays a supported alias for `state={{ pending: true }}`. */
|
|
105
|
+
state?: ChartState
|
|
101
106
|
}
|
|
102
107
|
|
|
103
108
|
const PANE_GAP = 12
|
|
@@ -115,8 +120,23 @@ const PANE_GAP = 12
|
|
|
115
120
|
* when a series has nulls; lines/bars skip null points (visual gaps).
|
|
116
121
|
*/
|
|
117
122
|
function DualPanelInner<T>(props: DualPanelProps<T>) {
|
|
118
|
-
|
|
119
|
-
|
|
123
|
+
// F-ERR-1: name the component and the prop. Without this a missing accessor surfaces
|
|
124
|
+
// from inside visx as `undefined is not a function`, which `BasaltErrorBoundary`
|
|
125
|
+
// swallows into a blank subtree that names nothing.
|
|
126
|
+
assertRequiredProps('DualPanel', props, ['data', 'getX', 'series', 'getBar'])
|
|
127
|
+
const {
|
|
128
|
+
series,
|
|
129
|
+
chartId,
|
|
130
|
+
height,
|
|
131
|
+
barLabel,
|
|
132
|
+
barColorPositive,
|
|
133
|
+
legend,
|
|
134
|
+
ariaLabel,
|
|
135
|
+
isPending,
|
|
136
|
+
state,
|
|
137
|
+
className,
|
|
138
|
+
style,
|
|
139
|
+
} = props
|
|
120
140
|
|
|
121
141
|
// Default the top-pane line overlays to the redesign's 1.9px stroke (docs/DESIGN-SPEC.md §5) —
|
|
122
142
|
// applied once here so the plotted line, the derived legend swatch, and the derived tooltip row
|
|
@@ -144,6 +164,9 @@ function DualPanelInner<T>(props: DualPanelProps<T>) {
|
|
|
144
164
|
{...(height !== undefined && { height })}
|
|
145
165
|
{...(ariaLabel !== undefined && { ariaLabel })}
|
|
146
166
|
{...(isPending !== undefined && { isPending })}
|
|
167
|
+
{...(state !== undefined && { state })}
|
|
168
|
+
{...(className !== undefined && { className })}
|
|
169
|
+
{...(style !== undefined && { style })}
|
|
147
170
|
legend={resolveLegend(legend)}
|
|
148
171
|
>
|
|
149
172
|
{(plot) => <DualPanelPlot {...props} series={styledSeries} plot={plot} />}
|
|
@@ -319,7 +342,15 @@ function DualPanelPlot<T>(props: DualPanelPlotProps<T>) {
|
|
|
319
342
|
...(cursorResolution !== undefined && { resolution: cursorResolution }),
|
|
320
343
|
})
|
|
321
344
|
|
|
322
|
-
|
|
345
|
+
// The horizontal room one x tick label needs, from the SAME formatted set `xLabelsAll` measured
|
|
346
|
+
// for the bottom gutter — same measured-spacing law `CartesianChart` applies
|
|
347
|
+
// (`docs/CHARTS-SPEC.md` §1).
|
|
348
|
+
const xLabelPx = useMemo(() => xLabelPxFor(xLabelsAll), [xLabelsAll])
|
|
349
|
+
|
|
350
|
+
const tickValues = useMemo(
|
|
351
|
+
() => smartTicks(data.map(getX), xMax, xLabelPx),
|
|
352
|
+
[data, xMax, getX, xLabelPx],
|
|
353
|
+
)
|
|
323
354
|
|
|
324
355
|
const barWidth = data.length > 0 ? Math.max((xMax / data.length) * 0.6, 2) : 2
|
|
325
356
|
|
|
@@ -383,6 +414,17 @@ function DualPanelPlot<T>(props: DualPanelPlotProps<T>) {
|
|
|
383
414
|
return out
|
|
384
415
|
}, [data, fillBetween, visibleSeries])
|
|
385
416
|
|
|
417
|
+
// The fill reads the FROM line's curve — same law as ZonedLine's "one curve for all shapes
|
|
418
|
+
// drawn from one series", extended to the two lines a fill spans: the band takes its shape from
|
|
419
|
+
// the line it hugs on the low side.
|
|
420
|
+
const fillCurve = useMemo(
|
|
421
|
+
() =>
|
|
422
|
+
curveFor(
|
|
423
|
+
fillBetween ? visibleSeries.find((s) => s.key === fillBetween.from)?.curve : undefined,
|
|
424
|
+
),
|
|
425
|
+
[fillBetween, visibleSeries],
|
|
426
|
+
)
|
|
427
|
+
|
|
386
428
|
type LinePt = { __d: T; __y: number }
|
|
387
429
|
// Per-line valid points, computed once per (data, visibleSeries) — not re-walked inside the
|
|
388
430
|
// render map every paint (parity with MultiLine's seriesPts).
|
|
@@ -468,7 +510,7 @@ function DualPanelPlot<T>(props: DualPanelPlotProps<T>) {
|
|
|
468
510
|
y1={(p) => topYScale(p.__to)}
|
|
469
511
|
clipAboveTo={0}
|
|
470
512
|
clipBelowTo={topH}
|
|
471
|
-
curve={
|
|
513
|
+
curve={fillCurve}
|
|
472
514
|
belowAreaProps={{ fill: fillBetween.fill }}
|
|
473
515
|
aboveAreaProps={{ fill: fillBetween.fill }}
|
|
474
516
|
/>
|
|
@@ -499,7 +541,7 @@ function DualPanelPlot<T>(props: DualPanelPlotProps<T>) {
|
|
|
499
541
|
strokeWidth={s.strokeWidth ?? VX.lineWidth}
|
|
500
542
|
strokeDasharray={s.dash === 'dashed' ? VX.dashArray : undefined}
|
|
501
543
|
strokeOpacity={s.strokeOpacity ?? 1}
|
|
502
|
-
curve={
|
|
544
|
+
curve={curveFor(s.curve)}
|
|
503
545
|
/>
|
|
504
546
|
)
|
|
505
547
|
})}
|
|
@@ -665,4 +707,8 @@ function DualPanelPlot<T>(props: DualPanelPlotProps<T>) {
|
|
|
665
707
|
* Hand-memoized: React Compiler does not process the shipped dist, so the hot DualPanel kind is
|
|
666
708
|
* wrapped in `React.memo` to retain the auto-memoization it had as source (parity with ZonedLine).
|
|
667
709
|
*/
|
|
668
|
-
|
|
710
|
+
const DualPanelMemo = memo(DualPanelInner)
|
|
711
|
+
// Without it every kind reads as `Memo` in React DevTools (audit A16) — a profiler flame
|
|
712
|
+
// graph of nine identically-named nodes names nothing.
|
|
713
|
+
DualPanelMemo.displayName = 'DualPanel'
|
|
714
|
+
export const DualPanel = DualPanelMemo as typeof DualPanelInner
|