basalt-ui 1.27.0 → 1.29.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 +28 -35
- package/CHANGELOG.md +72 -0
- package/MIGRATING.md +759 -22
- package/README.md +56 -69
- package/agent/rules/basalt-batteries.md +60 -168
- package/agent/rules/basalt-charts.md +56 -75
- package/agent/rules/basalt-controls.md +81 -87
- package/agent/rules/basalt-mantine.md +64 -98
- package/agent/rules/basalt-state.md +42 -60
- package/agent/rules/basalt-tokens.md +46 -67
- package/agent/skills/basalt-app/SKILL.md +2 -0
- package/agent/templates/CLAUDE-block.md.tpl +14 -14
- package/configs/oxlint-plugin.js +964 -33
- package/configs/oxlint-plugin.test.ts +902 -2
- package/configs/oxlint.json +6 -0
- package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
- package/dist/agent/ai-sdk-transport.js +7 -4
- 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/transport.d.ts +13 -2
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.d.ts +12 -1
- package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
- package/dist/agent/use-agent-thread-runs.js +20 -6
- 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/index.d.ts +1 -1
- package/dist/agent-chat/index.d.ts.map +1 -1
- 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 +9 -6
- package/dist/agent-chat/thread-feed-row.d.ts +32 -6
- package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed-row.js +61 -26
- package/dist/agent-chat/thread-feed.d.ts +13 -2
- package/dist/agent-chat/thread-feed.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed.js +16 -7
- 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/agent-chat/virtualize.d.ts +39 -0
- package/dist/agent-chat/virtualize.d.ts.map +1 -1
- package/dist/agent-chat/virtualize.js +15 -0
- package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
- package/dist/charts/hooks/useBandPlot.js +15 -8
- package/dist/charts/index.d.ts +11 -10
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +53 -9
- 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 +13 -9
- 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 +9 -6
- package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
- package/dist/charts/kinds/DualPanel.js +37 -9
- 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 +13 -11
- 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 +32 -4
- package/dist/charts/primitives/Axes.d.ts.map +1 -1
- package/dist/charts/primitives/Axes.js +49 -7
- 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 +45 -4
- package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
- package/dist/charts/primitives/ChartCard.js +70 -21
- 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 +52 -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 +85 -6
- 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 +7 -4
- package/dist/charts/utils/format.d.ts.map +1 -1
- package/dist/charts/utils/format.js +17 -24
- 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/audit-allows.d.ts +24 -0
- package/dist/cli/audit-allows.d.ts.map +1 -0
- package/dist/cli/audit-allows.js +240 -0
- package/dist/cli/check-theme.d.ts +10 -0
- package/dist/cli/check-theme.d.ts.map +1 -0
- package/dist/cli/check-theme.js +139 -0
- package/dist/cli/doctor.d.ts +47 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +197 -0
- package/dist/cli/guard-hook.d.ts +9 -0
- package/dist/cli/guard-hook.d.ts.map +1 -0
- package/dist/cli/guard-hook.js +93 -0
- package/dist/cli/help.d.ts +9 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +53 -0
- package/dist/cli/index.d.ts +360 -270
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +85 -1901
- package/dist/cli/init.d.ts +4 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +165 -0
- package/dist/cli/sync.d.ts +43 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +206 -0
- package/dist/cli/tokens-css.d.ts +51 -0
- package/dist/cli/tokens-css.d.ts.map +1 -0
- package/dist/cli/tokens-css.js +165 -0
- 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 +12 -2
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +9 -1
- package/dist/commands/overlays-mount.d.ts +16 -11
- package/dist/commands/overlays-mount.d.ts.map +1 -1
- package/dist/commands/overlays-mount.js +23 -14
- package/dist/commands/shell-bridge.d.ts +57 -0
- package/dist/commands/shell-bridge.d.ts.map +1 -0
- package/dist/commands/shell-bridge.js +32 -0
- package/dist/common/errors.d.ts +69 -0
- package/dist/common/errors.d.ts.map +1 -0
- package/dist/common/errors.js +64 -0
- package/dist/common/index.d.ts +17 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +35 -0
- package/dist/common/is-dev.d.ts +3 -0
- package/dist/common/is-dev.d.ts.map +1 -0
- package/dist/common/is-dev.js +6 -0
- package/dist/{motion/index.d.ts → common/motion.d.ts} +1 -1
- package/dist/common/motion.d.ts.map +1 -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/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 +3 -4
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +3 -4
- 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 +50 -7
- 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 +18 -6
- package/dist/dashboard/delta-badge.d.ts.map +1 -1
- package/dist/dashboard/delta-badge.js +33 -1
- package/dist/dashboard/empty-state.d.ts +8 -4
- package/dist/dashboard/empty-state.d.ts.map +1 -1
- package/dist/dashboard/empty-state.js +36 -6
- package/dist/dashboard/index.d.ts +9 -5
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +13 -1
- package/dist/dashboard/query-state.d.ts +39 -27
- package/dist/dashboard/query-state.d.ts.map +1 -1
- package/dist/dashboard/query-state.js +109 -58
- package/dist/dashboard/section.d.ts +58 -0
- package/dist/dashboard/section.d.ts.map +1 -0
- package/dist/dashboard/section.js +118 -0
- package/dist/{section → dashboard}/section.module.css +11 -0
- 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 +75 -26
- 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 +56 -43
- 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/dashboard/widget-header.d.ts +132 -0
- package/dist/dashboard/widget-header.d.ts.map +1 -0
- package/dist/{widget-header → dashboard}/widget-header.js +42 -27
- package/dist/{widget-header → dashboard}/widget-header.module.css +72 -7
- 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 +385 -139
- package/dist/data/data-table.module.css +64 -0
- package/dist/data/data-table.module.css.d.ts +11 -0
- 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/table.js +2 -16
- 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 +4 -4
- package/dist/data/virtual.d.ts.map +1 -1
- package/dist/dev-dock.d.ts +28 -0
- package/dist/dev-dock.d.ts.map +1 -0
- package/dist/dev-dock.js +85 -0
- package/dist/format/date.d.ts +62 -0
- package/dist/format/date.d.ts.map +1 -0
- package/dist/format/date.js +106 -0
- package/dist/format/index.d.ts +39 -0
- package/dist/format/index.d.ts.map +1 -0
- package/dist/format/index.js +54 -0
- package/dist/format/measure.d.ts +15 -0
- package/dist/format/measure.d.ts.map +1 -0
- package/dist/format/measure.js +16 -0
- package/dist/format/number.d.ts +69 -0
- package/dist/format/number.d.ts.map +1 -0
- package/dist/format/number.js +62 -0
- package/dist/format/shared.d.ts +27 -0
- package/dist/format/shared.d.ts.map +1 -0
- package/dist/format/shared.js +29 -0
- 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 +33 -9
- package/dist/forms/field.d.ts.map +1 -1
- package/dist/forms/field.js +7 -6
- 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 -4
- 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 +2 -9
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +38 -28
- package/dist/guard/types.d.ts +8 -10
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +21 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -6
- 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 +11 -7
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +5 -3
- 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/store.d.ts +7 -0
- package/dist/notifications/store.d.ts.map +1 -1
- package/dist/provider/connectivity-indicator.d.ts +13 -0
- package/dist/provider/connectivity-indicator.d.ts.map +1 -0
- package/dist/{connectivity → provider}/connectivity-indicator.js +3 -1
- package/dist/{connectivity → provider}/connectivity-provider.d.ts +1 -1
- package/dist/provider/connectivity-provider.d.ts.map +1 -0
- package/dist/{connectivity → provider}/connectivity-provider.js +4 -1
- package/dist/{connectivity/types.d.ts → provider/connectivity-types.d.ts} +3 -3
- package/dist/provider/connectivity-types.d.ts.map +1 -0
- package/dist/provider/error-fallback.module.css +21 -0
- package/dist/provider/error-fallback.module.css.d.ts +9 -0
- package/dist/provider/index.d.ts +29 -13
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +82 -34
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/lab-theme.js +2 -1
- package/dist/provider/use-connectivity.d.ts +3 -0
- package/dist/provider/use-connectivity.d.ts.map +1 -0
- package/dist/query-client.d.ts +63 -0
- package/dist/query-client.d.ts.map +1 -0
- package/dist/query-client.js +33 -0
- package/dist/{query/devtools.d.ts → query-devtools.d.ts} +2 -2
- package/dist/query-devtools.d.ts.map +1 -0
- package/dist/{query/devtools.js → query-devtools.js} +1 -0
- package/dist/register.d.ts +17 -3
- package/dist/register.d.ts.map +1 -1
- package/dist/router-tanstack/index.d.ts +4 -7
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/index.js +1 -9
- package/dist/router-tanstack/nav.d.ts +1 -1
- package/dist/router-tanstack/nav.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.d.ts +3 -6
- 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 +1 -1
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +1 -1
- 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 +5 -3
- 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 +118 -0
- package/dist/shell/app-main.module.css.d.ts +11 -0
- package/dist/shell/app-mobile-nav.d.ts +4 -3
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-mobile-nav.js +53 -17
- 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 +10 -4
- package/dist/shell/app-sidebar.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +78 -103
- package/dist/shell/app-sidebar.module.css +63 -96
- package/dist/shell/app-sidebar.module.css.d.ts +0 -5
- package/dist/shell/index.d.ts +24 -10
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +60 -29
- 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 +1 -1
- 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/{nav/types.d.ts → shell/nav-types.d.ts} +16 -7
- package/dist/shell/nav-types.d.ts.map +1 -0
- 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 +175 -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/page-title.d.ts +14 -0
- package/dist/shell/page-title.d.ts.map +1 -0
- package/dist/shell/page-title.js +25 -0
- package/dist/shell/page-title.module.css +33 -0
- package/dist/shell/page-title.module.css.d.ts +11 -0
- package/dist/shell/sidebar-block-model.d.ts +1 -1
- package/dist/shell/sidebar-block-model.d.ts.map +1 -1
- package/dist/shell/sidebar-blocks.d.ts +1 -1
- package/dist/shell/sidebar-blocks.d.ts.map +1 -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/shell/use-breakpoint.d.ts +11 -0
- package/dist/shell/use-breakpoint.d.ts.map +1 -0
- package/dist/shell/use-breakpoint.js +33 -0
- package/dist/state/fields.d.ts +26 -22
- package/dist/state/fields.d.ts.map +1 -1
- package/dist/state/fields.js +19 -18
- 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/styles.css +36 -0
- package/dist/surfaces.d.ts +25 -47
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +72 -55
- 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/theme-toggle.d.ts +9 -0
- package/dist/theme/theme-toggle.d.ts.map +1 -0
- package/dist/{theme-toggle/index.js → theme/theme-toggle.js} +9 -3
- 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/tokens/index.d.ts +43 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +45 -6
- package/dist/tokens/palette.d.ts +57 -25
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +44 -15
- package/dist/tokens.css +5 -5
- package/llms.txt +11 -26
- package/package.json +54 -34
- package/src/agent/ai-sdk-transport.ts +11 -4
- 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/transport.ts +15 -2
- package/src/agent/use-agent-thread-runs.ts +65 -15
- package/src/agent-chat/composer.tsx +124 -103
- package/src/agent-chat/index.ts +6 -4
- package/src/agent-chat/relative-time.ts +2 -1
- package/src/agent-chat/thread-detail-panel.tsx +10 -6
- package/src/agent-chat/thread-feed-row.tsx +117 -34
- package/src/agent-chat/thread-feed.tsx +59 -27
- 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/agent-chat/virtualize.ts +48 -0
- package/src/charts/hooks/useBandPlot.ts +26 -8
- package/src/charts/index.ts +46 -14
- package/src/charts/kinds/BandStrip.tsx +36 -14
- package/src/charts/kinds/Bars.tsx +68 -20
- package/src/charts/kinds/Donut.tsx +30 -3
- package/src/charts/kinds/DualPanel.tsx +60 -13
- 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 +72 -35
- package/src/charts/layout/auto-margin.ts +134 -21
- package/src/charts/layout/log-ticks.ts +90 -0
- package/src/charts/primitives/Axes.tsx +82 -5
- package/src/charts/primitives/CartesianChart.tsx +194 -41
- package/src/charts/primitives/ChartCard.tsx +111 -27
- package/src/charts/primitives/ChartFrame.tsx +111 -26
- package/src/charts/primitives/ChartLegend.tsx +43 -13
- package/src/charts/primitives/ChartPending.tsx +194 -10
- 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 +19 -27
- package/src/charts/utils/ticks.ts +149 -4
- package/src/cli/audit-allows.ts +371 -0
- package/src/cli/check-theme.ts +197 -0
- package/src/cli/doctor.ts +331 -0
- package/src/cli/guard-hook.ts +115 -0
- package/src/cli/help.ts +101 -0
- package/src/cli/index.ts +269 -3434
- package/src/cli/init.ts +247 -0
- package/src/cli/sync.ts +324 -0
- package/src/cli/tokens-css.ts +252 -0
- 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 +22 -1
- package/src/commands/overlays-mount.tsx +63 -31
- package/src/commands/shell-bridge.ts +86 -0
- package/src/common/errors.ts +143 -0
- package/src/common/index.ts +23 -0
- package/src/common/is-dev.ts +4 -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/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 +6 -8
- 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 +90 -10
- 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 +75 -4
- package/src/dashboard/empty-state.tsx +67 -24
- package/src/dashboard/index.ts +24 -3
- package/src/dashboard/query-state.tsx +142 -85
- package/src/{section → dashboard}/section.module.css +11 -0
- package/src/dashboard/section.tsx +287 -0
- package/src/dashboard/settings-section.tsx +88 -32
- 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 +186 -128
- 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/{widget-header → dashboard}/widget-header.module.css +72 -7
- package/src/dashboard/widget-header.tsx +292 -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 +921 -348
- package/src/data/query-branch.ts +53 -0
- package/src/data/table.ts +9 -23
- package/src/data/virtual-list.tsx +190 -56
- package/src/data/virtual.ts +8 -4
- package/src/dev-dock.tsx +159 -0
- package/src/format/date.ts +184 -0
- package/src/format/index.ts +69 -0
- package/src/format/measure.ts +31 -0
- package/src/format/number.ts +129 -0
- package/src/format/shared.ts +63 -0
- package/src/forms/FormErrorSummary.tsx +13 -6
- package/src/forms/create-form.ts +2 -2
- package/src/forms/field.ts +42 -13
- 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 +37 -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 +99 -70
- package/src/guard/types.ts +7 -10
- package/src/index.ts +92 -19
- 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 +17 -8
- package/src/notifications/mount-guard.ts +39 -0
- package/src/notifications/notify.tsx +122 -3
- package/src/notifications/store.ts +7 -0
- package/src/{connectivity → provider}/connectivity-indicator.tsx +7 -2
- package/src/{connectivity → provider}/connectivity-provider.tsx +5 -2
- package/src/{connectivity/types.ts → provider/connectivity-types.ts} +5 -2
- package/src/provider/error-fallback.module.css +21 -0
- package/src/provider/error-fallback.module.css.d.ts +9 -0
- package/src/provider/index.tsx +116 -28
- package/src/provider/lab-theme.ts +2 -1
- package/src/{connectivity → provider}/use-connectivity.ts +4 -3
- package/src/query-client.ts +100 -0
- package/src/{query/devtools.tsx → query-devtools.tsx} +6 -4
- package/src/register.ts +20 -4
- package/src/router-tanstack/index.ts +4 -15
- package/src/router-tanstack/nav.ts +1 -1
- package/src/router-tanstack/search-store.ts +6 -14
- package/src/router-tanstack/use-nav.ts +19 -14
- 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 +20 -10
- package/src/shell/app-header.module.css +10 -5
- package/src/shell/app-main.module.css +118 -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 +71 -12
- package/src/shell/app-sidebar-account.tsx +29 -6
- package/src/shell/app-sidebar.module.css +63 -96
- package/src/shell/app-sidebar.module.css.d.ts +0 -5
- package/src/shell/app-sidebar.tsx +61 -105
- package/src/shell/index.tsx +179 -93
- package/src/shell/isomorphic-layout-effect.ts +14 -0
- package/src/shell/mobile-nav-model.ts +67 -11
- package/src/shell/nav-count-badge.tsx +6 -1
- package/src/{nav/types.ts → shell/nav-types.ts} +15 -6
- 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 +327 -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/page-title.module.css +33 -0
- package/src/shell/page-title.module.css.d.ts +11 -0
- package/src/shell/page-title.tsx +57 -0
- package/src/shell/sidebar-block-model.ts +1 -1
- package/src/shell/sidebar-blocks.tsx +1 -1
- package/src/shell/sidebar-search.module.css +1 -1
- package/src/shell/sidebar-search.tsx +13 -4
- package/src/shell/use-breakpoint.ts +73 -0
- package/src/state/fields.ts +50 -53
- package/src/state/persisted-or-local.ts +50 -0
- package/src/state.ts +0 -9
- package/src/styles.css +36 -0
- package/src/surfaces.ts +72 -57
- package/src/theme/ctl-theme.tsx +10 -0
- package/src/theme/index.ts +136 -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-toggle/index.tsx → theme/theme-toggle.tsx} +11 -4
- package/src/theme-lab/boot.ts +140 -0
- package/src/theme-lab/index.tsx +21 -112
- package/src/tokens/index.ts +60 -6
- package/src/tokens/palette.ts +70 -30
- 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/connectivity/connectivity-indicator.d.ts +0 -11
- package/dist/connectivity/connectivity-indicator.d.ts.map +0 -1
- package/dist/connectivity/connectivity-provider.d.ts.map +0 -1
- package/dist/connectivity/index.d.ts +0 -13
- package/dist/connectivity/index.d.ts.map +0 -1
- package/dist/connectivity/index.js +0 -8
- package/dist/connectivity/types.d.ts.map +0 -1
- package/dist/connectivity/use-connectivity.d.ts +0 -3
- package/dist/connectivity/use-connectivity.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/data/index.d.ts +0 -38
- package/dist/data/index.d.ts.map +0 -1
- package/dist/data/index.js +0 -2
- 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/motion/index.d.ts.map +0 -1
- package/dist/nav/types.d.ts.map +0 -1
- package/dist/notifications/overlay.d.ts +0 -20
- package/dist/notifications/overlay.d.ts.map +0 -1
- package/dist/notifications/overlay.js +0 -12
- 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/devtools.d.ts.map +0 -1
- package/dist/query/error-message.d.ts +0 -41
- package/dist/query/error-message.d.ts.map +0 -1
- package/dist/query/error-message.js +0 -30
- package/dist/query/error-message.test.d.ts +0 -2
- package/dist/query/error-message.test.d.ts.map +0 -1
- package/dist/query/index.d.ts +0 -47
- package/dist/query/index.d.ts.map +0 -1
- package/dist/query/index.js +0 -56
- package/dist/router-tanstack/field.d.ts +0 -14
- package/dist/router-tanstack/field.d.ts.map +0 -1
- package/dist/router-tanstack/field.js +0 -4
- package/dist/router-tanstack/multi-search-param-store.d.ts +0 -43
- package/dist/router-tanstack/multi-search-param-store.d.ts.map +0 -1
- package/dist/router-tanstack/multi-search-param-store.js +0 -30
- 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.d.ts +0 -42
- package/dist/router-tanstack/search-param-store.d.ts.map +0 -1
- package/dist/router-tanstack/search-param-store.js +0 -25
- 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/index.d.ts +0 -2
- package/dist/section/index.d.ts.map +0 -1
- package/dist/section/index.js +0 -4
- package/dist/section/section.d.ts +0 -24
- package/dist/section/section.d.ts.map +0 -1
- package/dist/section/section.js +0 -126
- 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/theme-toggle/index.d.ts +0 -8
- package/dist/theme-toggle/index.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.d.ts +0 -13
- package/dist/widget-header/delta-badge.d.ts.map +0 -1
- package/dist/widget-header/delta-badge.js +0 -29
- 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/index.d.ts +0 -3
- package/dist/widget-header/index.d.ts.map +0 -1
- package/dist/widget-header/index.js +0 -6
- 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.d.ts +0 -67
- package/dist/widget-header/widget-header.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/connectivity/index.ts +0 -18
- 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/data/index.ts +0 -41
- 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/notifications/overlay.tsx +0 -64
- 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/query/error-message.ts +0 -70
- package/src/query/index.ts +0 -97
- package/src/router-tanstack/field.ts +0 -35
- package/src/router-tanstack/multi-search-param-store.test.ts +0 -124
- package/src/router-tanstack/multi-search-param-store.ts +0 -106
- 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-param-store.ts +0 -100
- 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/index.ts +0 -1
- package/src/section/section.test.tsx +0 -204
- package/src/section/section.tsx +0 -220
- 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/delta-badge.tsx +0 -57
- package/src/widget-header/index.ts +0 -2
- package/src/widget-header/no-mantine.test.ts +0 -33
- package/src/widget-header/widget-header.test.tsx +0 -187
- package/src/widget-header/widget-header.tsx +0 -213
- /package/dist/{motion/index.js → common/motion.js} +0 -0
- /package/dist/{section → dashboard}/section.module.css.d.ts +0 -0
- /package/dist/{widget-header → dashboard}/widget-header.module.css.d.ts +0 -0
- /package/dist/{connectivity/types.js → provider/connectivity-types.js} +0 -0
- /package/dist/{connectivity → provider}/use-connectivity.js +0 -0
- /package/dist/{nav/types.js → shell/nav-types.js} +0 -0
- /package/src/{motion/index.ts → common/motion.ts} +0 -0
- /package/src/{section → dashboard}/section.module.css.d.ts +0 -0
- /package/src/{widget-header → dashboard}/widget-header.module.css.d.ts +0 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WidgetGrid — the dashboard's column law, owned once (audit B #6/#7).
|
|
3
|
+
*
|
|
4
|
+
* Every consumer hand-wrote it: `SimpleGrid cols={{ base: 1, md: 3 }}` on one page,
|
|
5
|
+
* `cols={{ base: 1, sm: 2, lg: 3 }}` on the next, `Grid.Col span={{ base: 12, md: 8 }}` on a third
|
|
6
|
+
* — three different breakpoint sets for the same shape, in one app. That is not a styling
|
|
7
|
+
* preference, it is a layout law nobody owned, and the cost is that a card is 2-up on one route and
|
|
8
|
+
* 3-up on another at the same viewport.
|
|
9
|
+
*
|
|
10
|
+
* **`cols` is the DESKTOP count, and it is the only number a consumer states.** The law is
|
|
11
|
+
* `base 1 → sm min(cols, 2) → lg cols`: a phone gets one column because a dashboard card holds a
|
|
12
|
+
* chart; a tablet gets at most two because a third makes every chart narrower than
|
|
13
|
+
* `VX.phoneChartWidth`; the full count lands at `lg`. Mantine's `cols={{ … }}` object is
|
|
14
|
+
* deliberately NOT forwarded — a responsive object on the public prop is exactly the seam that let
|
|
15
|
+
* five call sites disagree.
|
|
16
|
+
*
|
|
17
|
+
* **This is the sanctioned place `lg` enters the package.** `sm` is still the only breakpoint a
|
|
18
|
+
* consumer writes (`docs/CONTROLS-SPEC.md` §2); `WidgetGrid` and `StatGroup` own `lg` internally so
|
|
19
|
+
* nobody else has to.
|
|
20
|
+
*
|
|
21
|
+
* `WidgetGrid.Item` is for the one card that is wider than the rest — a hero chart beside two
|
|
22
|
+
* stacked panels. `span` is likewise the DESKTOP span and is CLAMPED to the live column count at
|
|
23
|
+
* each breakpoint, so a `span={3}` in a 2-up `sm` row cannot spill into an implicit third track.
|
|
24
|
+
* A child rendered WITHOUT an `Item` simply occupies one column; the wrapper is not required.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* import { WidgetGrid } from 'basalt-ui'
|
|
28
|
+
*
|
|
29
|
+
* <WidgetGrid cols={3}>
|
|
30
|
+
* <ChartCard title="Revenue">…</ChartCard>
|
|
31
|
+
* <ChartCard title="Sessions">…</ChartCard>
|
|
32
|
+
* <ChartCard title="Errors">…</ChartCard>
|
|
33
|
+
* </WidgetGrid>
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* // The 8/4 split every dashboard has, without a 12-column vocabulary.
|
|
37
|
+
* <WidgetGrid cols={3}>
|
|
38
|
+
* <WidgetGrid.Item span={2}>
|
|
39
|
+
* <ChartCard title="Total sales over time">…</ChartCard>
|
|
40
|
+
* </WidgetGrid.Item>
|
|
41
|
+
* <Section title="Top channels">…</Section>
|
|
42
|
+
* </WidgetGrid>
|
|
43
|
+
*/
|
|
44
|
+
import { createContext, useContext, useMemo } from 'react'
|
|
45
|
+
import type { CSSProperties, ReactNode } from 'react'
|
|
46
|
+
import { cx } from '../common/props'
|
|
47
|
+
import type { BasaltProps } from '../common/props'
|
|
48
|
+
import classes from './widget-grid.module.css'
|
|
49
|
+
|
|
50
|
+
/** The desktop column count. Four is the ceiling: a fifth widget column is a KPI row — `StatGroup`. */
|
|
51
|
+
export type WidgetGridCols = 1 | 2 | 3 | 4
|
|
52
|
+
|
|
53
|
+
/** The resolved counts at the two breakpoints the law names. Base is always 1 and needs no member. */
|
|
54
|
+
type ResolvedCols = { readonly sm: number; readonly lg: number }
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The live column count, published so `WidgetGrid.Item` can CLAMP its span against it. A context
|
|
58
|
+
* rather than a CSS `min()` because `grid-column: span <n>` takes an integer, not a calculation —
|
|
59
|
+
* and an unclamped span is the failure that looks like a bug: a `span={3}` inside a 2-up row opens
|
|
60
|
+
* a third, empty implicit track and every sibling below it goes out of alignment.
|
|
61
|
+
*
|
|
62
|
+
* The default is the component's own `cols` default, so an `Item` rendered outside a grid (a
|
|
63
|
+
* consumer's own wrapper, a test) behaves like one inside a default grid instead of throwing.
|
|
64
|
+
*/
|
|
65
|
+
const WidgetGridColsContext = createContext<ResolvedCols>({ sm: 2, lg: 2 })
|
|
66
|
+
|
|
67
|
+
export type WidgetGridProps = BasaltProps & {
|
|
68
|
+
/** The DESKTOP column count (`lg` and up). Default `2`. Below that the law resolves it: `sm` gets
|
|
69
|
+
* `min(cols, 2)`, a phone gets 1. Never a responsive object — see the module docblock. */
|
|
70
|
+
cols?: WidgetGridCols
|
|
71
|
+
/** The widgets. A plain child takes one column; wrap it in `WidgetGrid.Item` to span more. */
|
|
72
|
+
children: ReactNode
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function WidgetGrid({ cols = 2, children, className, style }: WidgetGridProps) {
|
|
76
|
+
const resolved = useMemo<ResolvedCols>(() => ({ sm: Math.min(cols, 2), lg: cols }), [cols])
|
|
77
|
+
|
|
78
|
+
return (
|
|
79
|
+
<WidgetGridColsContext.Provider value={resolved}>
|
|
80
|
+
<div
|
|
81
|
+
className={cx(classes.root, className)}
|
|
82
|
+
data-cols={cols}
|
|
83
|
+
style={
|
|
84
|
+
{
|
|
85
|
+
'--basalt-widget-grid-cols-sm': resolved.sm,
|
|
86
|
+
'--basalt-widget-grid-cols-lg': resolved.lg,
|
|
87
|
+
...style,
|
|
88
|
+
} as CSSProperties
|
|
89
|
+
}
|
|
90
|
+
>
|
|
91
|
+
{children}
|
|
92
|
+
</div>
|
|
93
|
+
</WidgetGridColsContext.Provider>
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export type WidgetGridItemProps = BasaltProps & {
|
|
98
|
+
/** The DESKTOP span, clamped to the live column count at every narrower breakpoint. Default `1`. */
|
|
99
|
+
span?: WidgetGridCols
|
|
100
|
+
/** The one widget this cell holds. */
|
|
101
|
+
children: ReactNode
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* One cell of a {@link WidgetGrid}, spanning more than one column. Reached as `WidgetGrid.Item`.
|
|
106
|
+
*/
|
|
107
|
+
function WidgetGridItem({ span = 1, children, className, style }: WidgetGridItemProps) {
|
|
108
|
+
const cols = useContext(WidgetGridColsContext)
|
|
109
|
+
|
|
110
|
+
return (
|
|
111
|
+
<div
|
|
112
|
+
className={cx(classes.item, className)}
|
|
113
|
+
data-span={span}
|
|
114
|
+
style={
|
|
115
|
+
{
|
|
116
|
+
'--basalt-widget-grid-span-sm': Math.min(span, cols.sm),
|
|
117
|
+
'--basalt-widget-grid-span-lg': Math.min(span, cols.lg),
|
|
118
|
+
...style,
|
|
119
|
+
} as CSSProperties
|
|
120
|
+
}
|
|
121
|
+
>
|
|
122
|
+
{children}
|
|
123
|
+
</div>
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
WidgetGrid.Item = WidgetGridItem
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* `--mantine-spacing-*` fallbacks.
|
|
11
11
|
*
|
|
12
12
|
* Layout: the title row holds title/icon/info/count/actions only. `value` + `delta` render on
|
|
13
|
-
* their own hero-metric row directly beneath it — for
|
|
13
|
+
* their own hero-metric row directly beneath it — for every tier, never inline with the title.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
.root {
|
|
@@ -40,24 +40,75 @@
|
|
|
40
40
|
flex-wrap: wrap;
|
|
41
41
|
row-gap: var(--vx-space-stack-sm);
|
|
42
42
|
}
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
* WRAP ONLY WHEN IT DOES NOT FIT (M4 follow-up) — `flex: 1 1 100%` forced EVERY actions slot onto
|
|
46
|
+
* its own row, even a single 24px icon that fit beside the title fine (a KPI card's lone `···`
|
|
47
|
+
* menu dropped under the title and pushed the value down with it). `flex: 0 1 auto` restores
|
|
48
|
+
* ordinary flex sizing: no grow, so a short slot stays put beside the title on the shared row;
|
|
49
|
+
* `min-width: 0` plus `flex-shrink: 1` (part of the same shorthand, overriding the base rule's
|
|
50
|
+
* `flex-shrink: 0`) let it shrink and, once `.titleRow`'s own `flex-wrap: wrap` decides it truly
|
|
51
|
+
* does not fit, drop to its own line. `max-width: 100%` is the cap once it IS alone on that line —
|
|
52
|
+
* without it a `.actions` still carrying unshrinkable content (the `visibleFrom="sm"` control plus
|
|
53
|
+
* a nowrap switch `Group`, see below) can overflow the card rather than shrink into it. The base
|
|
54
|
+
* rule's `margin-inline-start: auto` still applies in both states — right-aligned beside the title
|
|
55
|
+
* when it fits, right-aligned as the lone item on its own wrapped line when it does not.
|
|
56
|
+
*
|
|
57
|
+
* `.actions` keeps its OWN `flex-wrap: wrap` from the prior fix: `Section` can hand it a `tabs`
|
|
58
|
+
* control (`CtlSlot`-wrapped) AND an `actions` control (another `CtlSlot`) in the same slot, and
|
|
59
|
+
* without this a nowrap `Group` of switches beside a view-switch control gets squeezed into one
|
|
60
|
+
* shared line and overflows below its own min-content width — the exact regression this rule
|
|
61
|
+
* once fixed. It is orthogonal to the row-level "wrap only when it does not fit" law above: with
|
|
62
|
+
* one child, wrapping has nothing to do, so a lone `···` menu still stays on the title line.
|
|
63
|
+
*
|
|
64
|
+
* The real flex items get `flex: 1 1 auto; min-width: 0` so they can shrink or (via the `> * > *`
|
|
65
|
+
* twin) stack within whatever width `.actions` itself resolves to — a full-width phone `Select`
|
|
66
|
+
* still reads as its own full-width line because the CONTROL sets that itself (`ViewTabs`'
|
|
67
|
+
* `fullWidth`/`.phoneSelect`), not because `.actions` forces it.
|
|
68
|
+
*
|
|
69
|
+
* The `> * > *` twin exists because `CtlSlot` (`theme/ctl-theme.tsx`) wraps a home's actions in a
|
|
70
|
+
* `display: contents` box — invisible to the flex box tree, so its OWN children (not it) are the
|
|
71
|
+
* real flex items. `display: contents` elements still match `.actions > *` by DOM structure but
|
|
72
|
+
* carry no box to apply `flex`/`min-width` to, hence styling one level deeper as well; a call site
|
|
73
|
+
* that skips `CtlSlot` and hands `actions` a real element directly gets the same rule from the
|
|
74
|
+
* first selector.
|
|
75
|
+
*/
|
|
76
|
+
.actions {
|
|
77
|
+
flex: 0 1 auto;
|
|
78
|
+
flex-wrap: wrap;
|
|
79
|
+
min-width: 0;
|
|
80
|
+
max-width: 100%;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.actions > *,
|
|
84
|
+
.actions > * > * {
|
|
85
|
+
flex: 1 1 auto;
|
|
86
|
+
min-width: 0;
|
|
87
|
+
}
|
|
43
88
|
}
|
|
44
89
|
|
|
45
90
|
.root[data-tier='section'] .titleRow {
|
|
46
91
|
min-height: var(--vx-space-section-header-height, 2.25rem);
|
|
47
92
|
}
|
|
48
93
|
|
|
49
|
-
|
|
94
|
+
/* `group` shares the `widget` tier's row height — an inspector/aside group label carries no more
|
|
95
|
+
* vertical weight than a card's own title. */
|
|
96
|
+
.root[data-tier='widget'] .titleRow,
|
|
97
|
+
.root[data-tier='group'] .titleRow {
|
|
50
98
|
min-height: var(--vx-space-widget-header-height, 1.75rem);
|
|
51
99
|
}
|
|
52
100
|
|
|
53
101
|
/*
|
|
54
|
-
* Section → h2, widget → h3, and the
|
|
55
|
-
* that is what flattened the page.
|
|
102
|
+
* Section → h2, widget → h3, group → h3, and the three tiers now read DIFFERENTLY on purpose — they
|
|
103
|
+
* did not, and that is what flattened the page.
|
|
56
104
|
*
|
|
57
105
|
* A `section` heading names a region of the page: 15px, weight 600, INK. A `widget` heading labels a
|
|
58
106
|
* number that is itself the thing being read (a KPI card's hero value, a chart card's total), so it
|
|
59
107
|
* is the quieter of the pair — one step down and MUTED, which is what lets the 24px mono value under
|
|
60
|
-
* it carry the card.
|
|
108
|
+
* it carry the card. A `group` heading is quieter still: the sidebar's own micro-label recipe (mono,
|
|
109
|
+
* uppercase, faint), because an inspector/aside group ("Presets", "Composition") must never outrank
|
|
110
|
+
* a canvas card's title. All three keep the shared head-font 88% stretch as their base, though
|
|
111
|
+
* `group` overrides every visual property of it (see below).
|
|
61
112
|
*
|
|
62
113
|
* Rendered identically (15px ink both) the hero value competed with its own label, four cards in a
|
|
63
114
|
* row read as four headings, and the section that grouped them read as one more of the same.
|
|
@@ -84,6 +135,18 @@
|
|
|
84
135
|
color: var(--vx-muted);
|
|
85
136
|
}
|
|
86
137
|
|
|
138
|
+
/* The `group` tier's heading — the sidebar `.sectionLabel` recipe (`shell/app-sidebar.module.css`),
|
|
139
|
+
* the quietest heading rank on the page. An inspector/aside group label, not a title. */
|
|
140
|
+
.root[data-tier='group'] .heading {
|
|
141
|
+
font-family: var(--basalt-font-mono);
|
|
142
|
+
font-stretch: normal;
|
|
143
|
+
font-size: var(--vx-text-micro);
|
|
144
|
+
font-weight: 500;
|
|
145
|
+
text-transform: uppercase;
|
|
146
|
+
letter-spacing: 0.08em;
|
|
147
|
+
color: var(--vx-faint);
|
|
148
|
+
}
|
|
149
|
+
|
|
87
150
|
.titleText {
|
|
88
151
|
overflow: hidden;
|
|
89
152
|
text-overflow: ellipsis;
|
|
@@ -106,7 +169,8 @@
|
|
|
106
169
|
color: var(--vx-faint);
|
|
107
170
|
}
|
|
108
171
|
|
|
109
|
-
.root[data-tier='widget'] .icon
|
|
172
|
+
.root[data-tier='widget'] .icon,
|
|
173
|
+
.root[data-tier='group'] .icon {
|
|
110
174
|
--vx-space-icon-size: 0.875rem;
|
|
111
175
|
}
|
|
112
176
|
|
|
@@ -139,7 +203,7 @@
|
|
|
139
203
|
}
|
|
140
204
|
|
|
141
205
|
/*
|
|
142
|
-
* The hero-metric row — value + delta, directly under the title row, for
|
|
206
|
+
* The hero-metric row — value + delta, directly under the title row, for every tier. The delta rides
|
|
143
207
|
* 4px off the value, not 8: it is a suffix ON the number (`$168,920 +47%`), and at 8px it read as a
|
|
144
208
|
* second, unrelated chip in the row. `baseline` alignment is what keeps the mono numeral and the
|
|
145
209
|
* badge's own smaller mono text sitting on one line.
|
|
@@ -221,6 +285,7 @@
|
|
|
221
285
|
align-items: center;
|
|
222
286
|
gap: var(--vx-space-control-gap, 0.375rem);
|
|
223
287
|
margin-inline-start: auto;
|
|
288
|
+
min-width: 0;
|
|
224
289
|
}
|
|
225
290
|
|
|
226
291
|
/* Directly under the title row, 4px off it — 1px put it inside the title's own line box, so a
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WidgetHeader — the one heading primitive behind every section, card and table title
|
|
3
|
+
* (docs/CONTROLS-SPEC.md §2.2, law C8). Plain elements + one CSS module, no `@mantine/*` import
|
|
4
|
+
* anywhere in this folder, so it can be composed from inside `charts/` without tripping
|
|
5
|
+
* `basalt/token-layer-boundary` or `check-dist-layering.mjs`.
|
|
6
|
+
*
|
|
7
|
+
* `tier: 'section'` renders an `<h2>` at the taller section-header height; `tier: 'widget'`
|
|
8
|
+
* renders an `<h3>` at the tighter, display-only icon-tier height — both share the same head-font
|
|
9
|
+
* 88%/550 title treatment. `tier: 'group'` also renders an `<h3>`, but at the quietest rank on the
|
|
10
|
+
* page: a mono, uppercase, faint micro-label — an inspector/aside group heading, one step below a
|
|
11
|
+
* `widget` tier and resolved automatically by `Section` when it renders on the `PageAside` panel
|
|
12
|
+
* surface (never a call-site prop). The title row holds title/icon/info/count/actions only; `value`
|
|
13
|
+
* + `delta` render on their own hero-metric row directly beneath it, for every tier — never inline
|
|
14
|
+
* with the title. `StatCard`, `ChartCard`, `Section`, `SettingsSection`/`DangerZone` and
|
|
15
|
+
* `BasaltDataTable` each compose this and render nothing else above their body (wave 3,
|
|
16
|
+
* docs/CONTROLS-SPEC.md §2.2's composer table).
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* import { WidgetHeader } from 'basalt-ui'
|
|
20
|
+
*
|
|
21
|
+
* <WidgetHeader
|
|
22
|
+
* tier="widget"
|
|
23
|
+
* title="Active Users"
|
|
24
|
+
* value="12,483"
|
|
25
|
+
* delta={4.2}
|
|
26
|
+
* deltaPeriod="MoM"
|
|
27
|
+
* actions={<ActionIcon variant="subtle"><IconDots /></ActionIcon>}
|
|
28
|
+
* />
|
|
29
|
+
*/
|
|
30
|
+
import { useEffect, useId, useRef, useState } from 'react'
|
|
31
|
+
import type { ReactNode } from 'react'
|
|
32
|
+
import { cx } from '../common/props'
|
|
33
|
+
import type { BasaltProps, SlotStylesProps } from '../common/props'
|
|
34
|
+
import { IconSlot } from '../theme/icon-slot'
|
|
35
|
+
import { DeltaBadge } from './delta-badge'
|
|
36
|
+
import type { DeltaPolarity } from './delta-badge'
|
|
37
|
+
import classes from './widget-header.module.css'
|
|
38
|
+
|
|
39
|
+
export type WidgetHeaderTier = 'section' | 'widget' | 'group'
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The four boxes a consumer can reach (`common/props.ts`): `root` is the header stack, `title` is
|
|
43
|
+
* the heading ELEMENT (`<h2>`/`<h3>`) rather than its row, `metric` is the hero `value`/`unit`/
|
|
44
|
+
* `delta` row, `icon` is the leading `IconSlot`.
|
|
45
|
+
*
|
|
46
|
+
* The other boxes this paints — the title row, the count tag, the actions span, the subtitle, the
|
|
47
|
+
* sparkline, the info bubble — are deliberately absent. Each is a one-shot readout basalt positions,
|
|
48
|
+
* not a layout box a consumer places, and `actions`/`sparkline` already take a `ReactNode` the
|
|
49
|
+
* caller can class itself.
|
|
50
|
+
*/
|
|
51
|
+
export type WidgetHeaderSlot = 'root' | 'title' | 'metric' | 'icon'
|
|
52
|
+
|
|
53
|
+
export type WidgetHeaderProps = BasaltProps &
|
|
54
|
+
SlotStylesProps<WidgetHeaderSlot> & {
|
|
55
|
+
/** `section` renders an `<h2>` at the section-header height; `widget` renders an `<h3>` at the
|
|
56
|
+
* tighter icon-tier height, display-only; `group` also renders an `<h3>` but as the quietest
|
|
57
|
+
* heading rank on the page — mono micro uppercase faint, one step below `widget` — for an
|
|
58
|
+
* inspector/aside group label. `Section` resolves `group` automatically from the enclosing filter
|
|
59
|
+
* surface; it is never a call-site prop. */
|
|
60
|
+
tier: WidgetHeaderTier
|
|
61
|
+
/** Head-font title (88% stretch, weight 550). */
|
|
62
|
+
title: string
|
|
63
|
+
/** Optional leading icon, rendered before the title. Decorative — hidden from assistive tech. */
|
|
64
|
+
icon?: ReactNode
|
|
65
|
+
/** Optional muted line rendered below the title row. */
|
|
66
|
+
subtitle?: string
|
|
67
|
+
/**
|
|
68
|
+
* Renders an info glyph BESIDE the heading (never inside it — this text would otherwise become
|
|
69
|
+
* part of the heading's accessible name, and an `info` paragraph read out in every headings list
|
|
70
|
+
* is what that cost). The glyph is named `More information`; the text itself reaches assistive
|
|
71
|
+
* tech through `aria-describedby` on a `role="tooltip"` bubble that opens on hover, focus and
|
|
72
|
+
* click — so a keyboard user gets it too. Mantine-free: a plain state bubble, not a Tooltip.
|
|
73
|
+
*/
|
|
74
|
+
info?: string
|
|
75
|
+
/** Pre-formatted metric value (mono, hero size). Renders on its own row with `delta`, directly
|
|
76
|
+
* under the title row — never inline with the title. */
|
|
77
|
+
value?: string
|
|
78
|
+
/**
|
|
79
|
+
* The value's unit, rendered immediately after it on the hero row: muted, mono, `--vx-text-sm`.
|
|
80
|
+
*
|
|
81
|
+
* It exists because `value` is a pre-formatted `string` and a KPI's unit is not part of the
|
|
82
|
+
* number: `412` and `TSS` are two facts at two weights, and jamming them into one string paints
|
|
83
|
+
* the unit at the hero's 24px — which reads as a second numeral. `subtitle` was the only place a
|
|
84
|
+
* unit could go before this, and a unit on its own line under the value is a different claim (the
|
|
85
|
+
* BASIS: `7-day rolling`), so cards using both had to pick one.
|
|
86
|
+
*
|
|
87
|
+
* Never a substitute for the number's own formatting: a thousands separator, a currency symbol or
|
|
88
|
+
* a `%` belong in `value`, where they are part of how the numeral reads.
|
|
89
|
+
*/
|
|
90
|
+
unit?: string
|
|
91
|
+
/** Signed delta rendered via `DeltaBadge`, on the same hero-metric row as `value`. */
|
|
92
|
+
delta?: number
|
|
93
|
+
/** Comparison timeframe forwarded to `DeltaBadge` (e.g. `MoM`). */
|
|
94
|
+
deltaPeriod?: string
|
|
95
|
+
/** Which sign reads as the good verdict — forwarded to `DeltaBadge`'s `polarity`. Defaults to
|
|
96
|
+
* `'up-good'` (today's behaviour). See {@link DeltaPolarity}. */
|
|
97
|
+
deltaPolarity?: DeltaPolarity
|
|
98
|
+
/**
|
|
99
|
+
* Formats `delta` into the chip's label — forwarded to `DeltaBadge`'s `format`. Defaults to
|
|
100
|
+
* `${Math.abs(delta).toFixed(1)}%`.
|
|
101
|
+
*
|
|
102
|
+
* It exists because not every delta is a percentage: a pace card's trend is `0:12 /km` and a
|
|
103
|
+
* throughput card's is `0.3 km/h`, and the default printed both as a percent — a wrong unit on a
|
|
104
|
+
* KPI, which is worse than no chip. A FUNCTION rather than a label string, so the number stays the
|
|
105
|
+
* number: `delta` still drives the tone and the glyph, and there is exactly one place the sign is
|
|
106
|
+
* decided.
|
|
107
|
+
*
|
|
108
|
+
* The value arrives SIGNED, so a formatter that wants to print the sign itself (`−0:12 /km`) can —
|
|
109
|
+
* pair it with `deltaGlyph={false}` so the ▼ does not say the same thing twice.
|
|
110
|
+
*/
|
|
111
|
+
deltaFormat?: (delta: number) => string
|
|
112
|
+
/** Render `DeltaBadge`'s ▲/▼ glyph. Defaults to `true`; a zero delta never shows one. Pass
|
|
113
|
+
* `false` when `deltaFormat` prints the sign itself. */
|
|
114
|
+
deltaGlyph?: boolean
|
|
115
|
+
/** Trend visual slot, rendered below the metric row. Carries `data-placement="right"` so a
|
|
116
|
+
* wave-3 composer's `bleed` layout can select it. */
|
|
117
|
+
sparkline?: ReactNode
|
|
118
|
+
/** Mono count tag rendered after the title (C11 — every table/list states its count). `0` is a
|
|
119
|
+
* real count and renders, distinct from omitting the prop entirely. */
|
|
120
|
+
count?: number
|
|
121
|
+
/** Right-aligned slot (`margin-inline-start: auto`) — the C1/C5 home for header actions. */
|
|
122
|
+
actions?: ReactNode
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* The named slices of {@link WidgetHeaderProps} its composers share, and the answer to audit B #2:
|
|
127
|
+
* four composers exposed four DIFFERENT subsets of the same base through four ad-hoc `Omit`s, so a
|
|
128
|
+
* consumer moving a KPI from `StatCard` → `ChartCard` → `Section` lost `unit`, `count`,
|
|
129
|
+
* `deltaFormat` or `deltaGlyph` with no compiler word about it. A slice is a `Pick` with a NAME:
|
|
130
|
+
* a composer states which slices it re-publishes, and an omission becomes a deliberate, readable
|
|
131
|
+
* line rather than an accident of whichever props the author happened to remember.
|
|
132
|
+
*
|
|
133
|
+
* The three are cut along the three ROWS `WidgetHeader` actually paints — the title row, the hero
|
|
134
|
+
* metric, and the delta chip on it — so "which slice does this composer take" and "which boxes does
|
|
135
|
+
* it draw" are the same question.
|
|
136
|
+
*
|
|
137
|
+
* Adopted by `StatCard` and `SettingsSection`. `Section` and `ChartCard` still cut their own
|
|
138
|
+
* subsets; both should compose these instead — the composer table in `docs/CONTROLS-SPEC.md` §2.2
|
|
139
|
+
* is the ledger of which one takes which.
|
|
140
|
+
*
|
|
141
|
+
* The title row: what every composer without exception publishes.
|
|
142
|
+
*/
|
|
143
|
+
export type WidgetHeaderTitleProps = Pick<WidgetHeaderProps, 'title' | 'icon' | 'subtitle' | 'info'>
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* The hero metric row's value half. `value` is OPTIONAL here because it is on `WidgetHeader`; a
|
|
147
|
+
* composer whose whole reason to exist is the number (`StatCard`) redeclares it as required.
|
|
148
|
+
*/
|
|
149
|
+
export type WidgetHeaderMetricProps = Pick<WidgetHeaderProps, 'value' | 'unit'>
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* The delta chip that rides the hero metric row — all five props together, never a subset. Splitting
|
|
153
|
+
* them is how `deltaFormat` came to type-check on `Section` and render nothing: a composer that
|
|
154
|
+
* publishes `delta` and not its formatter prints a percent sign over a pace.
|
|
155
|
+
*/
|
|
156
|
+
export type WidgetHeaderDeltaProps = Pick<
|
|
157
|
+
WidgetHeaderProps,
|
|
158
|
+
'delta' | 'deltaPeriod' | 'deltaPolarity' | 'deltaFormat' | 'deltaGlyph'
|
|
159
|
+
>
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* The info affordance. A `title` attribute alone was never enough — it renders on hover only, so a
|
|
163
|
+
* keyboard user focusing the glyph saw nothing at all. This is the bubble `ChartCard` used to own
|
|
164
|
+
* before it composed `WidgetHeader`, moved down here so every tier gets the same behaviour:
|
|
165
|
+
* opens on hover/focus/click, closes on leave/blur/Escape/outside pointer-down, and is wired to the
|
|
166
|
+
* trigger with `aria-describedby` only while open.
|
|
167
|
+
*
|
|
168
|
+
* Exported from the MODULE but deliberately not from `src/widget-header/index.ts`: it is not a
|
|
169
|
+
* public primitive, it is the one info affordance basalt draws, and `controls/panel-row.tsx`
|
|
170
|
+
* composes it so an inspector row's `hint` is the same glyph, bubble and keyboard behaviour a
|
|
171
|
+
* `WidgetHeader`'s `info` is — not a second one that drifts.
|
|
172
|
+
*/
|
|
173
|
+
export function InfoGlyph({ text }: { text: string }) {
|
|
174
|
+
const [open, setOpen] = useState(false)
|
|
175
|
+
const tipId = useId()
|
|
176
|
+
const triggerRef = useRef<HTMLButtonElement>(null)
|
|
177
|
+
|
|
178
|
+
useEffect(() => {
|
|
179
|
+
if (!open) return
|
|
180
|
+
const handlePointerDown = (event: PointerEvent) => {
|
|
181
|
+
if (triggerRef.current?.contains(event.target as Node)) return
|
|
182
|
+
setOpen(false)
|
|
183
|
+
}
|
|
184
|
+
document.addEventListener('pointerdown', handlePointerDown)
|
|
185
|
+
return () => document.removeEventListener('pointerdown', handlePointerDown)
|
|
186
|
+
}, [open])
|
|
187
|
+
|
|
188
|
+
return (
|
|
189
|
+
<span className={classes.info}>
|
|
190
|
+
<button
|
|
191
|
+
ref={triggerRef}
|
|
192
|
+
type="button"
|
|
193
|
+
className={classes.infoTrigger}
|
|
194
|
+
// The GLYPH is named, not the text — `text` reaches AT through `aria-describedby` below, so
|
|
195
|
+
// it never lands in the heading's or the button's accessible name.
|
|
196
|
+
aria-label="More information"
|
|
197
|
+
aria-describedby={open ? tipId : undefined}
|
|
198
|
+
data-open={open}
|
|
199
|
+
onMouseEnter={() => setOpen(true)}
|
|
200
|
+
onMouseLeave={() => setOpen(false)}
|
|
201
|
+
onFocus={() => setOpen(true)}
|
|
202
|
+
onBlur={() => setOpen(false)}
|
|
203
|
+
onClick={() => setOpen(true)}
|
|
204
|
+
onKeyDown={(event) => {
|
|
205
|
+
if (event.key === 'Escape') setOpen(false)
|
|
206
|
+
}}
|
|
207
|
+
>
|
|
208
|
+
<svg width={11} height={11} viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
|
|
209
|
+
<path d="M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0zm0 4a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zm0 5a1 1 0 0 1 1 1v7a1 1 0 1 1-2 0v-7a1 1 0 0 1 1-1z" />
|
|
210
|
+
</svg>
|
|
211
|
+
</button>
|
|
212
|
+
{open && (
|
|
213
|
+
<span id={tipId} role="tooltip" className={classes.infoBubble}>
|
|
214
|
+
{text}
|
|
215
|
+
</span>
|
|
216
|
+
)}
|
|
217
|
+
</span>
|
|
218
|
+
)
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export function WidgetHeader({
|
|
222
|
+
tier,
|
|
223
|
+
title,
|
|
224
|
+
icon,
|
|
225
|
+
subtitle,
|
|
226
|
+
info,
|
|
227
|
+
value,
|
|
228
|
+
unit,
|
|
229
|
+
delta,
|
|
230
|
+
deltaPeriod,
|
|
231
|
+
deltaPolarity,
|
|
232
|
+
deltaFormat,
|
|
233
|
+
deltaGlyph,
|
|
234
|
+
sparkline,
|
|
235
|
+
count,
|
|
236
|
+
actions,
|
|
237
|
+
className,
|
|
238
|
+
style,
|
|
239
|
+
classNames,
|
|
240
|
+
}: WidgetHeaderProps) {
|
|
241
|
+
const Heading = tier === 'section' ? 'h2' : 'h3'
|
|
242
|
+
|
|
243
|
+
return (
|
|
244
|
+
<div
|
|
245
|
+
className={cx(classes.root, classNames?.root, className)}
|
|
246
|
+
data-tier={tier}
|
|
247
|
+
{...(style !== undefined && { style })}
|
|
248
|
+
>
|
|
249
|
+
<div className={classes.titleRow}>
|
|
250
|
+
<Heading className={cx(classes.heading, classNames?.title)}>
|
|
251
|
+
{/* `IconSlot` owns the box; the TIER owns its size, through the
|
|
252
|
+
`--vx-space-icon-size` this module sets per `data-tier`. So a `tier="widget"`
|
|
253
|
+
heading draws 14px and a `tier="section"` heading 16px with no prop and no
|
|
254
|
+
per-component `> svg` rule — see `theme/icon-slot.tsx`. */}
|
|
255
|
+
{icon !== undefined && (
|
|
256
|
+
<IconSlot className={cx(classes.icon, classNames?.icon)}>{icon}</IconSlot>
|
|
257
|
+
)}
|
|
258
|
+
<span className={classes.titleText}>{title}</span>
|
|
259
|
+
</Heading>
|
|
260
|
+
{/* OUTSIDE the heading on purpose — see `info`'s own doc. */}
|
|
261
|
+
{info !== undefined && <InfoGlyph text={info} />}
|
|
262
|
+
{count !== undefined && <span className={classes.count}>{count}</span>}
|
|
263
|
+
{actions !== undefined && <span className={classes.actions}>{actions}</span>}
|
|
264
|
+
</div>
|
|
265
|
+
{(value !== undefined || delta !== undefined) && (
|
|
266
|
+
<div className={cx(classes.metrics, classNames?.metric)}>
|
|
267
|
+
{value !== undefined && <span className={classes.value}>{value}</span>}
|
|
268
|
+
{/* Gated on `value`, not on itself: a unit with nothing to qualify is a stray word, and a
|
|
269
|
+
card that lost its number must not keep printing `TSS` beside the empty space. */}
|
|
270
|
+
{value !== undefined && unit !== undefined && (
|
|
271
|
+
<span className={classes.unit}>{unit}</span>
|
|
272
|
+
)}
|
|
273
|
+
{delta !== undefined && (
|
|
274
|
+
<DeltaBadge
|
|
275
|
+
value={delta}
|
|
276
|
+
period={deltaPeriod}
|
|
277
|
+
{...(deltaPolarity !== undefined && { polarity: deltaPolarity })}
|
|
278
|
+
{...(deltaFormat !== undefined && { format: deltaFormat })}
|
|
279
|
+
{...(deltaGlyph !== undefined && { withGlyph: deltaGlyph })}
|
|
280
|
+
/>
|
|
281
|
+
)}
|
|
282
|
+
</div>
|
|
283
|
+
)}
|
|
284
|
+
{subtitle !== undefined && <span className={classes.subtitle}>{subtitle}</span>}
|
|
285
|
+
{sparkline !== undefined && (
|
|
286
|
+
<div className={classes.sparkline} data-placement="right">
|
|
287
|
+
{sparkline}
|
|
288
|
+
</div>
|
|
289
|
+
)}
|
|
290
|
+
</div>
|
|
291
|
+
)
|
|
292
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* BasaltDataTable — the two boxes the base Mantine `Table` cannot paint from a prop: an activatable
|
|
3
|
+
* row, and the bulk-action bar a selection raises.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/*
|
|
7
|
+
* `onRowActivate` — the row → detail hook that pairs with `PageAside`. The row keeps its native
|
|
8
|
+
* `<tr>` semantics and takes `tabIndex=0` + `data-activatable` rather than `role="button"`: a role
|
|
9
|
+
* swap would take the row OUT of the table's own row/cell semantics, so a screen reader would stop
|
|
10
|
+
* announcing the column headers with each cell — which is the whole reason the data is in a table.
|
|
11
|
+
* The affordance is therefore the cursor and the focus ring, not a role.
|
|
12
|
+
*/
|
|
13
|
+
.activatable {
|
|
14
|
+
cursor: pointer;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.activatable:focus-visible {
|
|
18
|
+
outline: 2px solid var(--vx-accent);
|
|
19
|
+
outline-offset: -2px;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/*
|
|
23
|
+
* The bulk bar. It sits between the header row and the table, and it is a SURFACE rather than a
|
|
24
|
+
* bare row: it appears and disappears with the selection, so without a background it reads as the
|
|
25
|
+
* table jumping. `--vx-surface-subtle` is the same one-step-up fill the sheet rows and the sidebar
|
|
26
|
+
* use, so nothing new is introduced to the page's surface ladder.
|
|
27
|
+
*/
|
|
28
|
+
.bulkBar {
|
|
29
|
+
padding: var(--vx-space-row-inset-y, 0.375rem) var(--vx-space-row-inset-x, 0.5rem);
|
|
30
|
+
border: 1px solid var(--vx-surface-hairline);
|
|
31
|
+
border-radius: var(--vx-radius-ctrl);
|
|
32
|
+
background: var(--vx-surface-subtle);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/*
|
|
36
|
+
* The count. Mono/micro, the same numeric readout idiom the pagination bar's range label uses
|
|
37
|
+
* (`docs/DESIGN-SPEC.md` §3) — a selection count is a figure, and reading it in the proportional
|
|
38
|
+
* body font beside proportional button labels made the bar read as a sentence.
|
|
39
|
+
*/
|
|
40
|
+
.bulkCount {
|
|
41
|
+
font-family: var(--mantine-font-family-monospace);
|
|
42
|
+
font-size: var(--vx-text-xs);
|
|
43
|
+
font-variant-numeric: tabular-nums;
|
|
44
|
+
color: var(--vx-muted);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/*
|
|
48
|
+
* The measured containment wrapper — `stickyHeader` with neither `maxHeight` nor `minWidth`, the
|
|
49
|
+
* one shape whose overflow mode cannot be decided statically. `useMeasuredContainment`
|
|
50
|
+
* (`data-table.tsx`) writes `data-contained`; the two states are declared here rather than as an
|
|
51
|
+
* inline style so the flip is a single attribute write and a reader can see both at once.
|
|
52
|
+
*
|
|
53
|
+
* `[data-contained='false']` is deliberately NOT `overflow: visible` — it is the absence of any
|
|
54
|
+
* overflow declaration, because `overflow-x: visible` beside a computed `overflow-y` is exactly
|
|
55
|
+
* the pairing the browser rewrites to `auto`. `min-width: 0` is the flex/grid floor every
|
|
56
|
+
* containing chain in this library needs and none of them get by default.
|
|
57
|
+
*/
|
|
58
|
+
.containment {
|
|
59
|
+
min-width: 0;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.containment[data-contained='true'] {
|
|
63
|
+
overflow-x: auto;
|
|
64
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed CSS-module declaration (the S4 CSS-modules path). Named string props — not an index
|
|
3
|
+
* signature — so dot access stays verbatim under the package's strict flags.
|
|
4
|
+
*/
|
|
5
|
+
declare const classes: {
|
|
6
|
+
readonly activatable: string
|
|
7
|
+
readonly bulkBar: string
|
|
8
|
+
readonly bulkCount: string
|
|
9
|
+
readonly containment: string
|
|
10
|
+
}
|
|
11
|
+
export default classes
|