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
|
@@ -30,6 +30,8 @@
|
|
|
30
30
|
* />
|
|
31
31
|
*/
|
|
32
32
|
import type { ReactNode } from 'react'
|
|
33
|
+
import type { BasaltProps } from '../common/props'
|
|
34
|
+
import { assertRequiredProps } from '../common/validate'
|
|
33
35
|
import type { EnumField, FieldHandle, StringField } from '../state'
|
|
34
36
|
import { EnumFilter } from './enum-filter'
|
|
35
37
|
|
|
@@ -45,7 +47,7 @@ export type FilterOption = {
|
|
|
45
47
|
readonly disabled?: boolean
|
|
46
48
|
}
|
|
47
49
|
|
|
48
|
-
type SelectFilterCommon = {
|
|
50
|
+
type SelectFilterCommon = BasaltProps & {
|
|
49
51
|
readonly label: string
|
|
50
52
|
readonly icon?: ReactNode
|
|
51
53
|
/** Adds a `Clear` action that writes the field back to its fallback. */
|
|
@@ -78,6 +80,14 @@ export type SelectFilterProps<T extends string> = SelectFilterEnumProps<T> | Sel
|
|
|
78
80
|
export function SelectFilter<T extends string>(props: SelectFilterEnumProps<T>): ReactNode
|
|
79
81
|
export function SelectFilter(props: SelectFilterStringProps): ReactNode
|
|
80
82
|
export function SelectFilter<T extends string>(props: SelectFilterProps<T>): ReactNode {
|
|
83
|
+
// F-ERR-1: without this, a `field` that never arrived surfaces as
|
|
84
|
+
// `undefined is not an object (evaluating 'field.use')` from inside `EnumFilter`, caught by
|
|
85
|
+
// `BasaltErrorBoundary` and rendered as a blank subtree. `field` is not optional in the type, so
|
|
86
|
+
// this only ever fires on untyped JS, a `props` object built at runtime, or a store key that
|
|
87
|
+
// resolved to nothing — all three of which the message now names.
|
|
88
|
+
assertRequiredProps('SelectFilter', props, ['field'], {
|
|
89
|
+
field: 'bind it to a store field (`store.field.<name>`), never a value/onChange pair.',
|
|
90
|
+
})
|
|
81
91
|
const { field, ...rest } = props
|
|
82
92
|
|
|
83
93
|
// Two arms, one body — and they are not the same code to the compiler. `field.kind` is a NESTED
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `SliderControl` — a `field.number` as an inspector row (`docs/ASIDE-SPEC.md` §1 "Inspector", G7).
|
|
3
|
+
* Bound like every other control on this subpath: it takes `field`, never `value`/`onChange`/`size`
|
|
4
|
+
* (C2/C5), and `min`/`max`/`step` come off the HANDLE rather than the call site, so the track's
|
|
5
|
+
* grain is the field's own declaration and not a second copy of it.
|
|
6
|
+
*
|
|
7
|
+
* **It is a ROW on every surface, and that is deliberate.** Unlike the filters it has no pill form:
|
|
8
|
+
* a chip whose label is a number, opening a popover holding a track, is two presses to change a
|
|
9
|
+
* value the row states and edits in place. So it renders {@link PanelRow} regardless of
|
|
10
|
+
* `useFilterSurface()`, and it is not a filter — it registers no `{ isActive, reset }` with a
|
|
11
|
+
* `FilterSet`, never counts toward `Filters (n)`, and never answers `Reset all`. Its home is an
|
|
12
|
+
* aside body or a section body, not a bar row.
|
|
13
|
+
*
|
|
14
|
+
* **The write lands on drag END, not on every frame.** A slider emits a value per pointer move; on
|
|
15
|
+
* the URL lane that is one navigation per pixel. The draft is local while dragging and commits
|
|
16
|
+
* once — the same law `NumberFilter`'s stepper states for keystrokes.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // piCycle: field.number({ fallback: 1, min: 0, max: 2, step: 0.05 })
|
|
20
|
+
* <SliderControl
|
|
21
|
+
* field={weights.field.piCycle}
|
|
22
|
+
* label="Pi Cycle Top"
|
|
23
|
+
* hint="The 111DMA / 350DMA×2 crossover."
|
|
24
|
+
* format={(v) => `${v.toFixed(2)}×`}
|
|
25
|
+
* />
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* // A COMPOSITION row: the readout states the metric's own reading beside the weight, and the
|
|
29
|
+
* // switch that governs the row rides the label line — neither is the field's value, so both are
|
|
30
|
+
* // overrides rather than a `format`.
|
|
31
|
+
* <SliderControl
|
|
32
|
+
* field={weights.field.piCycle}
|
|
33
|
+
* label="Pi Cycle Top"
|
|
34
|
+
* readout="0.35 · ×1.00"
|
|
35
|
+
* end={<Switch checked={on} onChange={toggle} aria-label="Include Pi Cycle Top" />}
|
|
36
|
+
* disabled={!on}
|
|
37
|
+
* />
|
|
38
|
+
*/
|
|
39
|
+
import { Slider } from '@mantine/core'
|
|
40
|
+
import { useEffect, useRef, useState } from 'react'
|
|
41
|
+
import type { ReactNode } from 'react'
|
|
42
|
+
import type { BasaltProps } from '../common/props'
|
|
43
|
+
import { assertRequiredProps } from '../common/validate'
|
|
44
|
+
import type { FieldHandle, NumberField } from '../state'
|
|
45
|
+
import { PanelRow } from './panel-row'
|
|
46
|
+
|
|
47
|
+
export type SliderControlProps = BasaltProps & {
|
|
48
|
+
readonly field: FieldHandle<NumberField>
|
|
49
|
+
/** The row's label, and the thumb's accessible name. */
|
|
50
|
+
readonly label: string
|
|
51
|
+
/** Info glyph + tooltip beside the label — see {@link PanelRow}. */
|
|
52
|
+
readonly hint?: string
|
|
53
|
+
/**
|
|
54
|
+
* The mono readout on the label line. The raw number when omitted, so a unit, a precision or a
|
|
55
|
+
* ratio is one function rather than a second row.
|
|
56
|
+
*
|
|
57
|
+
* @default String(v)
|
|
58
|
+
*/
|
|
59
|
+
readonly format?: (v: number) => string
|
|
60
|
+
/**
|
|
61
|
+
* Replaces the formatted value in the row's readout slot.
|
|
62
|
+
*
|
|
63
|
+
* `format` prints the FIELD; this prints whatever the row is actually about. The composition row
|
|
64
|
+
* that motivated it states a metric's reading beside its weight — `0.35 · ×1.00` — which is one
|
|
65
|
+
* mono string over two numbers, only one of which this control owns. Prefer `format` whenever the
|
|
66
|
+
* readout is the field's own value. A FUNCTION form receives the live drag value, so a composed
|
|
67
|
+
* readout tracks the thumb per frame instead of updating on drag end.
|
|
68
|
+
*/
|
|
69
|
+
readonly readout?: ReactNode | ((value: number) => ReactNode)
|
|
70
|
+
/**
|
|
71
|
+
* A control riding the LABEL line, forwarded to {@link PanelRow.end} — a `Switch` and, by design,
|
|
72
|
+
* almost nothing else. The composition row's use case is enabling the metric the slider weights:
|
|
73
|
+
* the toggle governs the row, so it cannot live inside the track it disables.
|
|
74
|
+
*/
|
|
75
|
+
readonly end?: ReactNode
|
|
76
|
+
readonly disabled?: boolean
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function SliderControl(props: SliderControlProps): ReactNode {
|
|
80
|
+
// F-ERR-1 — without this a missing `field` surfaces as `undefined is not an object
|
|
81
|
+
// (evaluating 'field.use')`, caught by `BasaltErrorBoundary`.
|
|
82
|
+
assertRequiredProps('SliderControl', props, ['field'], {
|
|
83
|
+
field: 'bind it to a store field (`store.field.<name>`), never a value/onChange pair.',
|
|
84
|
+
})
|
|
85
|
+
const { field, label, hint, format, readout, end, disabled, className, style } = props
|
|
86
|
+
const [value, setValue] = field.use()
|
|
87
|
+
const draft = useDraggedNumber(value, setValue)
|
|
88
|
+
|
|
89
|
+
return (
|
|
90
|
+
<PanelRow
|
|
91
|
+
label={label}
|
|
92
|
+
readout={
|
|
93
|
+
typeof readout === 'function'
|
|
94
|
+
? readout(draft.value)
|
|
95
|
+
: (readout ?? (format ?? String)(draft.value))
|
|
96
|
+
}
|
|
97
|
+
{...(hint !== undefined && { hint })}
|
|
98
|
+
{...(end !== undefined && { end })}
|
|
99
|
+
{...(disabled === true && { disabled: true })}
|
|
100
|
+
{...(className !== undefined && { className })}
|
|
101
|
+
{...(style !== undefined && { style })}
|
|
102
|
+
>
|
|
103
|
+
<Slider
|
|
104
|
+
// The tier, stated by the control the way every control on this subpath does
|
|
105
|
+
// (`docs/CONTROLS-SPEC.md` §3) — `Slider` is deliberately absent from `CTL_THEME`, see
|
|
106
|
+
// `theme/ctl-theme.tsx`'s note, so the row's slot cannot supply it.
|
|
107
|
+
size="ctl"
|
|
108
|
+
// The drag tooltip is off: the row already prints the value, in mono, in a fixed place —
|
|
109
|
+
// a bubble that follows the thumb states the same number twice and jumps while reading.
|
|
110
|
+
label={null}
|
|
111
|
+
thumbLabel={label}
|
|
112
|
+
// The FIELD's declaration, straight off the handle. An undeclared bound leaves Mantine's own
|
|
113
|
+
// default (0..100) rather than passing `undefined` through as a bound.
|
|
114
|
+
{...(field.min !== undefined && { min: field.min })}
|
|
115
|
+
{...(field.max !== undefined && { max: field.max })}
|
|
116
|
+
{...(field.step !== undefined && { step: field.step })}
|
|
117
|
+
{...(disabled === true && { disabled: true })}
|
|
118
|
+
value={draft.value}
|
|
119
|
+
onChange={draft.set}
|
|
120
|
+
onChangeEnd={draft.commit}
|
|
121
|
+
/>
|
|
122
|
+
</PanelRow>
|
|
123
|
+
)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* A local draft that follows the thumb and lands on the field once, on `onChangeEnd` — plus the
|
|
128
|
+
* usual outside-change backstop (`Reset all`, a deep link, a back navigation, the codec's clamp).
|
|
129
|
+
*
|
|
130
|
+
* `seen` is what separates the two directions, exactly as in `SearchFilter`'s debounce and
|
|
131
|
+
* `NumberFilter`'s commit: it holds the last value this hook itself committed, so an incoming change
|
|
132
|
+
* it did not cause is the only thing that overwrites the draft mid-drag.
|
|
133
|
+
*/
|
|
134
|
+
function useDraggedNumber(
|
|
135
|
+
value: number,
|
|
136
|
+
setValue: (next: number) => void,
|
|
137
|
+
): { value: number; set: (next: number) => void; commit: (next: number) => void } {
|
|
138
|
+
const [draft, setDraft] = useState(value)
|
|
139
|
+
const seen = useRef(value)
|
|
140
|
+
const commitRef = useRef(setValue)
|
|
141
|
+
commitRef.current = setValue
|
|
142
|
+
|
|
143
|
+
useEffect(() => {
|
|
144
|
+
if (seen.current === value) return
|
|
145
|
+
seen.current = value
|
|
146
|
+
setDraft(value)
|
|
147
|
+
}, [value])
|
|
148
|
+
|
|
149
|
+
return {
|
|
150
|
+
value: draft,
|
|
151
|
+
set: setDraft,
|
|
152
|
+
commit: (next) => {
|
|
153
|
+
setDraft(next)
|
|
154
|
+
if (next === value) return
|
|
155
|
+
seen.current = next
|
|
156
|
+
commitRef.current(next)
|
|
157
|
+
},
|
|
158
|
+
}
|
|
159
|
+
}
|
|
@@ -23,10 +23,12 @@
|
|
|
23
23
|
import { ActionIcon, Button, Tooltip } from '@mantine/core'
|
|
24
24
|
import { useEffect, useState } from 'react'
|
|
25
25
|
import type { ReactNode } from 'react'
|
|
26
|
+
import { cx } from '../common/props'
|
|
27
|
+
import type { BasaltProps } from '../common/props'
|
|
26
28
|
import { IconSlot } from '../theme/icon-slot'
|
|
27
29
|
import classes from './sync-button.module.css'
|
|
28
30
|
|
|
29
|
-
export type SyncButtonProps = {
|
|
31
|
+
export type SyncButtonProps = BasaltProps & {
|
|
30
32
|
syncing: boolean
|
|
31
33
|
/** Last successful completion. `undefined`/`null` renders no age at all. */
|
|
32
34
|
lastCompletedAt?: number | Date | null
|
|
@@ -134,6 +136,8 @@ export function SyncButton({
|
|
|
134
136
|
scope,
|
|
135
137
|
label = 'Sync',
|
|
136
138
|
error,
|
|
139
|
+
className,
|
|
140
|
+
style,
|
|
137
141
|
}: SyncButtonProps): ReactNode {
|
|
138
142
|
const age = useRelativeAge(lastCompletedAt)
|
|
139
143
|
// Wherever the label is not painted — every `global` mount, and a `page` mount below `sm` — the
|
|
@@ -172,7 +176,12 @@ export function SyncButton({
|
|
|
172
176
|
withArrow
|
|
173
177
|
>
|
|
174
178
|
{scope === 'global' ? (
|
|
175
|
-
<ActionIcon
|
|
179
|
+
<ActionIcon
|
|
180
|
+
variant="default"
|
|
181
|
+
{...control}
|
|
182
|
+
{...(className !== undefined && { className })}
|
|
183
|
+
{...(style !== undefined && { style })}
|
|
184
|
+
>
|
|
176
185
|
<IconSlot>
|
|
177
186
|
<RefreshGlyph spinning={syncing} />
|
|
178
187
|
</IconSlot>
|
|
@@ -180,7 +189,8 @@ export function SyncButton({
|
|
|
180
189
|
) : (
|
|
181
190
|
<Button
|
|
182
191
|
variant="default"
|
|
183
|
-
className={classes.pageButton}
|
|
192
|
+
className={cx(classes.pageButton, className)}
|
|
193
|
+
{...(style !== undefined && { style })}
|
|
184
194
|
leftSection={
|
|
185
195
|
<IconSlot>
|
|
186
196
|
<RefreshGlyph spinning={syncing} />
|
|
@@ -1,46 +1,64 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `ToggleFilter` — a boolean field as one pill (`docs/CONTROLS-SPEC.md` §3). The only filter whose
|
|
3
3
|
* pill has no popover: there is nothing to choose, so the pill IS the control and a press flips it.
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* The sheet form is the panel form (`docs/CONTROLS-SPEC.md` §3: "sheet = panel rows inside a
|
|
5
|
+
* Drawer") — a `PanelRow` whose control rides the label line, the ONE row every panel/sheet surface
|
|
6
|
+
* draws that way (`docs/ASIDE-SPEC.md` §3): a switch is atomic and needs no width, so the
|
|
7
|
+
* label-above law every other row follows would only cost it a second line.
|
|
6
8
|
*
|
|
7
9
|
* @example
|
|
8
10
|
* // errorsOnly: field.boolean(false)
|
|
9
11
|
* <ToggleFilter field={filters.field.errorsOnly} label="Errors only" />
|
|
10
12
|
*/
|
|
11
13
|
import { Switch } from '@mantine/core'
|
|
14
|
+
import { useId } from 'react'
|
|
12
15
|
import type { ReactNode } from 'react'
|
|
16
|
+
import type { BasaltProps } from '../common/props'
|
|
17
|
+
import { assertRequiredProps } from '../common/validate'
|
|
13
18
|
import type { BooleanField, FieldHandle } from '../state'
|
|
14
19
|
import { useFilterRegistration, useFilterSurface } from './filter-context'
|
|
15
20
|
import { FilterPill } from './filter-pill'
|
|
16
|
-
import {
|
|
21
|
+
import { PanelRow } from './panel-row'
|
|
17
22
|
|
|
18
|
-
export type ToggleFilterProps = {
|
|
23
|
+
export type ToggleFilterProps = BasaltProps & {
|
|
19
24
|
readonly field: FieldHandle<BooleanField>
|
|
20
25
|
readonly label: string
|
|
21
26
|
readonly icon?: ReactNode
|
|
22
27
|
}
|
|
23
28
|
|
|
24
|
-
export function ToggleFilter(
|
|
29
|
+
export function ToggleFilter(props: ToggleFilterProps): ReactNode {
|
|
30
|
+
// F-ERR-1 — without this a missing `field` surfaces as `undefined is not an object
|
|
31
|
+
// (evaluating 'field.use')`, caught by `BasaltErrorBoundary`.
|
|
32
|
+
assertRequiredProps('ToggleFilter', props, ['field'], {
|
|
33
|
+
field: 'bind it to a store field (`store.field.<name>`), never a value/onChange pair.',
|
|
34
|
+
})
|
|
35
|
+
const { field, label, icon, className, style } = props
|
|
25
36
|
const [value, setValue] = field.use()
|
|
26
37
|
const surface = useFilterSurface()
|
|
38
|
+
const id = useId()
|
|
27
39
|
useFilterRegistration(!field.isDefault(value), () => {
|
|
28
40
|
field.clear()
|
|
29
41
|
})
|
|
30
42
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// (C15). A wrapper div would put the height on a non-interactive box instead.
|
|
43
|
+
// The sheet form is the panel form (`docs/CONTROLS-SPEC.md` §3: "sheet = panel rows inside a
|
|
44
|
+
// Drawer") — the switch rides the label line on both surfaces, the one row whose control does.
|
|
45
|
+
if (surface === 'panel' || surface === 'sheet') {
|
|
35
46
|
return (
|
|
36
|
-
<
|
|
37
|
-
classNames={sheetRowClassNames}
|
|
38
|
-
checked={value}
|
|
47
|
+
<PanelRow
|
|
39
48
|
label={label}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
49
|
+
htmlFor={id}
|
|
50
|
+
end={
|
|
51
|
+
<Switch
|
|
52
|
+
id={id}
|
|
53
|
+
aria-label={label}
|
|
54
|
+
checked={value}
|
|
55
|
+
onChange={(event) => {
|
|
56
|
+
setValue(event.currentTarget.checked)
|
|
57
|
+
}}
|
|
58
|
+
/>
|
|
59
|
+
}
|
|
60
|
+
{...(className !== undefined && { className })}
|
|
61
|
+
{...(style !== undefined && { style })}
|
|
44
62
|
/>
|
|
45
63
|
)
|
|
46
64
|
}
|
|
@@ -55,6 +73,8 @@ export function ToggleFilter({ field, label, icon }: ToggleFilterProps): ReactNo
|
|
|
55
73
|
onClick={() => {
|
|
56
74
|
setValue(!value)
|
|
57
75
|
}}
|
|
76
|
+
{...(className !== undefined && { className })}
|
|
77
|
+
{...(style !== undefined && { style })}
|
|
58
78
|
/>
|
|
59
79
|
)
|
|
60
80
|
}
|
|
@@ -6,12 +6,17 @@
|
|
|
6
6
|
* The responsive swap lives HERE, not at the call site (C9), and it is CSS — `visibleFrom` /
|
|
7
7
|
* `hiddenFrom`, one mount each, never a JS media query (which renders differently on the server than
|
|
8
8
|
* on the first client paint). Below `sm` a set of three or fewer stays a full-width
|
|
9
|
-
* `SegmentedControl
|
|
9
|
+
* `SegmentedControl` — PROVIDED every label actually fits it (`panel-row.tsx`'s `useTrackFits`,
|
|
10
|
+
* shared with `PanelChoice` so the two width gates cannot drift); past either gate it becomes a
|
|
10
11
|
* `Select`.
|
|
11
12
|
*
|
|
12
13
|
* `only` is how a tab that exists on ONE viewport is declared instead of hand-rolling a second
|
|
13
14
|
* control: `'sm-up'` keeps it off the phone form, `'sm-down'` keeps it off the desktop form.
|
|
14
15
|
*
|
|
16
|
+
* Inside a `PageAside` it renders as a panel ROW — label above, a full-width track or a `Select`
|
|
17
|
+
* (`docs/ASIDE-SPEC.md` §3). A view switch in a panel is legal; the page bar's tab slot stays its
|
|
18
|
+
* default home, and `only` has no meaning there (the panel is one width).
|
|
19
|
+
*
|
|
15
20
|
* @example
|
|
16
21
|
* <ViewTabs
|
|
17
22
|
* field={strength.field.tab}
|
|
@@ -24,8 +29,14 @@
|
|
|
24
29
|
*/
|
|
25
30
|
import { SegmentedControl, Select } from '@mantine/core'
|
|
26
31
|
import type { ReactNode } from 'react'
|
|
32
|
+
import { cx } from '../common/props'
|
|
33
|
+
import type { BasaltProps } from '../common/props'
|
|
34
|
+
import { assertRequiredProps } from '../common/validate'
|
|
27
35
|
import type { EnumField, FieldHandle } from '../state'
|
|
28
36
|
import classes from './controls.module.css'
|
|
37
|
+
import { useFilterSurface } from './filter-context'
|
|
38
|
+
import { useControlName } from './filter-sheet'
|
|
39
|
+
import { PanelChoice, PanelRow, useTrackFits } from './panel-row'
|
|
29
40
|
|
|
30
41
|
/** Past three options the phone form is a `Select`, not a track. */
|
|
31
42
|
const PHONE_TRACK_MAX = 3
|
|
@@ -37,7 +48,7 @@ export type ViewTabsOption<T extends string> = {
|
|
|
37
48
|
readonly only?: 'sm-up' | 'sm-down'
|
|
38
49
|
}
|
|
39
50
|
|
|
40
|
-
export type ViewTabsProps<T extends string> = {
|
|
51
|
+
export type ViewTabsProps<T extends string> = BasaltProps & {
|
|
41
52
|
readonly field: FieldHandle<EnumField<T>>
|
|
42
53
|
/** Defaults to `field.options` (every declared value, labelled by `store.labels()`). */
|
|
43
54
|
readonly options?: readonly ViewTabsOption<T>[]
|
|
@@ -51,12 +62,17 @@ export type ViewTabsProps<T extends string> = {
|
|
|
51
62
|
readonly label?: string
|
|
52
63
|
}
|
|
53
64
|
|
|
54
|
-
export function ViewTabs<T extends string>({
|
|
55
|
-
field
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
65
|
+
export function ViewTabs<T extends string>(props: ViewTabsProps<T>): ReactNode {
|
|
66
|
+
// F-ERR-1 — without this a missing `field` surfaces as `undefined is not an object
|
|
67
|
+
// (evaluating 'field.use')`, caught by `BasaltErrorBoundary`.
|
|
68
|
+
assertRequiredProps('ViewTabs', props, ['field'], {
|
|
69
|
+
field: 'bind it to a store field (`store.field.<name>`), never a value/onChange pair.',
|
|
70
|
+
})
|
|
71
|
+
const { field, options, label = 'View', className, style } = props
|
|
59
72
|
const [value, setValue] = field.use()
|
|
73
|
+
const surface = useFilterSurface()
|
|
74
|
+
const inPanel = surface === 'panel'
|
|
75
|
+
const { labelId, nameProps } = useControlName(label, inPanel)
|
|
60
76
|
const all: readonly ViewTabsOption<T>[] =
|
|
61
77
|
options ?? field.options.map((option) => ({ value: option.value as T, label: option.label }))
|
|
62
78
|
|
|
@@ -68,6 +84,36 @@ export function ViewTabs<T extends string>({
|
|
|
68
84
|
setValue(next as T)
|
|
69
85
|
}
|
|
70
86
|
|
|
87
|
+
const phoneData = phone.map((option) => ({ value: option.value, label: option.label }))
|
|
88
|
+
const phoneCountFits = phone.length <= PHONE_TRACK_MAX
|
|
89
|
+
// Called UNCONDITIONALLY, even on the panel branch that never renders the phone form — a hook
|
|
90
|
+
// may not sit behind the `if (inPanel) return …` below (`react-hooks/rules-of-hooks`), and
|
|
91
|
+
// `useTrackFits` no-ops cheaply when `countFits` is false or its root never mounts. The same
|
|
92
|
+
// width gate `PanelChoice` runs (`panel-row.tsx`'s `useTrackFits` doc) — the count cap is the
|
|
93
|
+
// cheap first gate, a fit check underneath it is what actually decides.
|
|
94
|
+
const { rootRef: phoneRootRef, fits: phoneFits } = useTrackFits(
|
|
95
|
+
phoneCountFits,
|
|
96
|
+
phoneData.map((d) => d.value).join('|'),
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
// The panel form. `only` is dropped on purpose: it exists to declare a tab that belongs to ONE
|
|
100
|
+
// viewport, and a panel is not a viewport — every declared option is offered.
|
|
101
|
+
if (inPanel) {
|
|
102
|
+
return (
|
|
103
|
+
<PanelRow
|
|
104
|
+
label={label}
|
|
105
|
+
labelId={labelId}
|
|
106
|
+
{...(className !== undefined && { className })}
|
|
107
|
+
{...(style !== undefined && { style })}
|
|
108
|
+
>
|
|
109
|
+
<PanelChoice nameProps={nameProps} value={value} options={all} onChange={commit} />
|
|
110
|
+
</PanelRow>
|
|
111
|
+
)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// No single root: exactly one of the two forms below is visible at once (CSS `visibleFrom`/
|
|
115
|
+
// `hiddenFrom`, law C9), so `className`/`style` land on both — whichever one paints is the one a
|
|
116
|
+
// reader ever sees carrying them.
|
|
71
117
|
return (
|
|
72
118
|
<>
|
|
73
119
|
<SegmentedControl
|
|
@@ -77,16 +123,21 @@ export function ViewTabs<T extends string>({
|
|
|
77
123
|
value={value}
|
|
78
124
|
data={desktop.map((option) => ({ value: option.value, label: option.label }))}
|
|
79
125
|
onChange={commit}
|
|
126
|
+
{...(className !== undefined && { className })}
|
|
127
|
+
{...(style !== undefined && { style })}
|
|
80
128
|
/>
|
|
81
|
-
{
|
|
129
|
+
{phoneFits ? (
|
|
82
130
|
<SegmentedControl
|
|
131
|
+
ref={phoneRootRef}
|
|
83
132
|
aria-label={label}
|
|
84
133
|
hiddenFrom="sm"
|
|
85
134
|
size="ctl"
|
|
86
135
|
fullWidth
|
|
87
136
|
value={value}
|
|
88
|
-
data={
|
|
137
|
+
data={phoneData}
|
|
89
138
|
onChange={commit}
|
|
139
|
+
{...(className !== undefined && { className })}
|
|
140
|
+
{...(style !== undefined && { style })}
|
|
90
141
|
/>
|
|
91
142
|
) : (
|
|
92
143
|
<Select
|
|
@@ -96,10 +147,11 @@ export function ViewTabs<T extends string>({
|
|
|
96
147
|
// BOUNDED, not greedy — see `.phoneSelect`'s comment in `controls.module.css`. This is the
|
|
97
148
|
// control owning its own responsive form (law C9), which is also why it is not a `w` prop
|
|
98
149
|
// at the call site (C5, `basalt/control-size-literal`).
|
|
99
|
-
className={classes.phoneSelect}
|
|
150
|
+
className={cx(classes.phoneSelect, className)}
|
|
151
|
+
{...(style !== undefined && { style })}
|
|
100
152
|
value={value}
|
|
101
153
|
allowDeselect={false}
|
|
102
|
-
data={
|
|
154
|
+
data={phoneData}
|
|
103
155
|
onChange={(next) => {
|
|
104
156
|
if (next !== null) commit(next)
|
|
105
157
|
}}
|
|
@@ -24,9 +24,16 @@
|
|
|
24
24
|
*/
|
|
25
25
|
import { DatePicker } from '@mantine/dates'
|
|
26
26
|
import type { ReactNode } from 'react'
|
|
27
|
+
import { assertRequiredProps } from '../common/validate'
|
|
27
28
|
import type { RangeCustomPickerProps } from '../controls/range-filter'
|
|
28
29
|
|
|
29
|
-
export function DateRangePicker(
|
|
30
|
+
export function DateRangePicker(props: RangeCustomPickerProps): ReactNode {
|
|
31
|
+
// F-ERR-1 — without this a missing `value` surfaces as `undefined is not an object
|
|
32
|
+
// (evaluating 'value.from')`, caught by `BasaltErrorBoundary`.
|
|
33
|
+
assertRequiredProps('DateRangePicker', props, ['value'], {
|
|
34
|
+
value: "pass `{ from, to }` — usually injected by `RangeFilter`'s `customPicker`.",
|
|
35
|
+
})
|
|
36
|
+
const { value, onChange } = props
|
|
30
37
|
return (
|
|
31
38
|
<DatePicker
|
|
32
39
|
type="range"
|
|
@@ -2,5 +2,9 @@
|
|
|
2
2
|
* `DeltaBadge` moved to `src/widget-header/` (docs/CONTROLS-SPEC.md §2.2) so `WidgetHeader` can
|
|
3
3
|
* compose it Mantine-free. Re-exported here unchanged so this deep import path — and `StatCard`'s
|
|
4
4
|
* own `./delta-badge` import — keep working without a wave-3 edit.
|
|
5
|
+
*
|
|
6
|
+
* `basalt-ui/widget-header` is canonical — this alias exists only so `basalt-ui/dashboard`-style
|
|
7
|
+
* deep imports keep resolving; the root barrel (`src/index.ts`) sources `DeltaBadge` from
|
|
8
|
+
* `../widget-header`, not from here.
|
|
5
9
|
*/
|
|
6
|
-
export { DeltaBadge, type DeltaBadgeProps } from '../widget-header/delta-badge'
|
|
10
|
+
export { DeltaBadge, type DeltaBadgeProps, type DeltaPolarity } from '../widget-header/delta-badge'
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* EmptyState — a centered icon/title/description/action stack for empty data regions (no shipped
|
|
3
|
-
* illustration assets — `icon` is a plain, faint-rendered `ReactNode` slot). `
|
|
4
|
-
* generous vertical padding for a full-page empty state; `
|
|
5
|
-
* empty card/panel region.
|
|
3
|
+
* illustration assets — `icon` is a plain, faint-rendered `ReactNode` slot). `tier="page"` uses
|
|
4
|
+
* generous vertical padding for a full-page empty state; `tier="section"` is compact, for an
|
|
5
|
+
* empty card/panel region (`variant` is the deprecated spelling of the same prop — audit B #19).
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
8
|
* import { EmptyState } from 'basalt-ui'
|
|
@@ -12,48 +12,89 @@
|
|
|
12
12
|
* title="No results"
|
|
13
13
|
* description="Try adjusting your filters or search terms."
|
|
14
14
|
* action={<Button onClick={onReset}>Clear filters</Button>}
|
|
15
|
-
*
|
|
15
|
+
* tier="section"
|
|
16
16
|
* />
|
|
17
17
|
*/
|
|
18
18
|
import { Center, Stack } from '@mantine/core'
|
|
19
19
|
import type { ReactNode } from 'react'
|
|
20
20
|
import { VX } from '../tokens'
|
|
21
|
+
import { cx } from '../common/props'
|
|
22
|
+
import type { BasaltProps, SlotStylesProps } from '../common/props'
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
24
|
+
/** The five boxes `EmptyState` paints, and the whole styling seam it offers (`common/props.ts`). */
|
|
25
|
+
export type EmptyStateSlot = 'root' | 'icon' | 'title' | 'description' | 'action'
|
|
26
|
+
|
|
27
|
+
export type EmptyStateProps = BasaltProps &
|
|
28
|
+
SlotStylesProps<EmptyStateSlot> & {
|
|
29
|
+
/** Optional glyph slot, rendered faint at ~28-32px. No shipped illustration assets. */
|
|
30
|
+
icon?: ReactNode
|
|
31
|
+
/** Head-font title (18px, weight 550, ink). */
|
|
32
|
+
title: string
|
|
33
|
+
/**
|
|
34
|
+
* Muted 15px description, capped at ~360px so it reads as a short explanation. Optional: a
|
|
35
|
+
* compact panel ("No data yet") should not have to invent a second sentence, and five argo
|
|
36
|
+
* features wrapped this component solely to avoid doing so.
|
|
37
|
+
*/
|
|
38
|
+
description?: string
|
|
39
|
+
/** Optional call-to-action rendered below the description. */
|
|
40
|
+
action?: ReactNode
|
|
41
|
+
/** How loud this state is: `'page'` (default) = generous padding for a full-page state;
|
|
42
|
+
* `'section'` = compact. */
|
|
43
|
+
tier?: 'page' | 'section'
|
|
44
|
+
/** @deprecated Renamed to `tier` (audit B #19) — `tier` is the package's word for "how loud is
|
|
45
|
+
* this". Still honoured; `tier` wins when both are passed. */
|
|
46
|
+
variant?: 'page' | 'section'
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// The finest density-tracking rhythm step (`--vx-space-stack-xs`, 4px at level 0) scaled by an
|
|
50
|
+
// exact integer, so the padding renders at today's px value at level 0 and rides the same
|
|
51
|
+
// `1 + 0.1 * level` multiplier every other `--vx-space-*` token does at every other density level
|
|
52
|
+
// (`docs/STATUS.md`'s density pass) — `LoadingState`'s `'page'` variant shares `PAGE_PADDING_Y`,
|
|
53
|
+
// same concept: a page-level async/empty region's vertical padding.
|
|
54
|
+
const STACK_XS = 'var(--vx-space-stack-xs, 0.25rem)'
|
|
55
|
+
const PAGE_PADDING_Y = `calc(${STACK_XS} * 16)` // 64px at level 0
|
|
56
|
+
const PAGE_PADDING_X = `calc(${STACK_XS} * 6)` // 24px at level 0
|
|
57
|
+
const SECTION_PADDING_Y = `calc(${STACK_XS} * 8)` // 32px at level 0
|
|
58
|
+
const SECTION_PADDING_X = `calc(${STACK_XS} * 5)` // 20px at level 0
|
|
38
59
|
|
|
39
60
|
export function EmptyState({
|
|
40
61
|
icon,
|
|
41
62
|
title,
|
|
42
63
|
description,
|
|
43
64
|
action,
|
|
44
|
-
|
|
65
|
+
tier,
|
|
66
|
+
variant,
|
|
67
|
+
className,
|
|
68
|
+
style,
|
|
69
|
+
classNames,
|
|
45
70
|
}: EmptyStateProps) {
|
|
71
|
+
const resolved = tier ?? variant ?? 'page'
|
|
46
72
|
return (
|
|
47
73
|
<Stack
|
|
48
74
|
align="center"
|
|
49
75
|
gap="xs"
|
|
76
|
+
className={cx(classNames?.root, className)}
|
|
50
77
|
style={{
|
|
51
|
-
padding:
|
|
78
|
+
padding:
|
|
79
|
+
resolved === 'page'
|
|
80
|
+
? `${PAGE_PADDING_Y} ${PAGE_PADDING_X}`
|
|
81
|
+
: `${SECTION_PADDING_Y} ${SECTION_PADDING_X}`,
|
|
52
82
|
textAlign: 'center',
|
|
83
|
+
...style,
|
|
53
84
|
}}
|
|
54
85
|
>
|
|
55
|
-
{icon &&
|
|
86
|
+
{icon && (
|
|
87
|
+
// 32px is a fixed glyph-box size, not a density-tracking inset — no `--vx-icon-*` token
|
|
88
|
+
// exists for a generic (non-`WidgetHeader`-tiered) icon slot, so it stays a structural rem.
|
|
89
|
+
<Center
|
|
90
|
+
{...(classNames?.icon !== undefined && { className: classNames.icon })}
|
|
91
|
+
style={{ width: '2rem', height: '2rem', color: VX.faint }}
|
|
92
|
+
>
|
|
93
|
+
{icon}
|
|
94
|
+
</Center>
|
|
95
|
+
)}
|
|
56
96
|
<span
|
|
97
|
+
className={classNames?.title}
|
|
57
98
|
style={{
|
|
58
99
|
fontFamily: 'var(--basalt-font-head)',
|
|
59
100
|
fontStretch: '88%',
|
|
@@ -65,9 +106,15 @@ export function EmptyState({
|
|
|
65
106
|
{title}
|
|
66
107
|
</span>
|
|
67
108
|
{description !== undefined && (
|
|
68
|
-
|
|
109
|
+
// 360px (22.5rem) is a reading-width cap, not a density inset — kept structural.
|
|
110
|
+
<span
|
|
111
|
+
className={classNames?.description}
|
|
112
|
+
style={{ fontSize: VX.text.md, color: VX.muted, maxWidth: '22.5rem' }}
|
|
113
|
+
>
|
|
114
|
+
{description}
|
|
115
|
+
</span>
|
|
69
116
|
)}
|
|
70
|
-
{action}
|
|
117
|
+
{action !== undefined && <div className={classNames?.action}>{action}</div>}
|
|
71
118
|
</Stack>
|
|
72
119
|
)
|
|
73
120
|
}
|