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
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The divider law — a mechanical inventory of every HORIZONTAL hairline basalt draws
|
|
3
|
-
* (`docs/DESIGN-SPEC.md` §8: depth is a shadow, and a border-as-border is reserved for a layout
|
|
4
|
-
* divider).
|
|
5
|
-
*
|
|
6
|
-
* The bug this file exists to prevent, measured on the playground's `Controls (mobile)` page at
|
|
7
|
-
* 390px: the page carried five rules in its first 320px — a table box whose top edge sat directly
|
|
8
|
-
* under the table's own `WidgetHeader`, its bottom edge on the last row's own hairline, and a
|
|
9
|
-
* section rule 8px from the next one. None of them divided anything. Two rules stack into a band,
|
|
10
|
-
* and a band under a heading says "the heading is not part of what follows", which is the opposite
|
|
11
|
-
* of what a section header is for.
|
|
12
|
-
*
|
|
13
|
-
* So the law has two halves and this file pins both:
|
|
14
|
-
*
|
|
15
|
-
* 1. **A header never draws a rule under itself** — in the CHROME lane (shell, controls, dashboard,
|
|
16
|
-
* data, widget-header, theme). The reader already has the heading's type scale, its weight and
|
|
17
|
-
* the space below it; a line adds a fourth channel saying the same thing and costs a band.
|
|
18
|
-
* 2. **A between-rows family always drops its LAST rule** — the line after the final row is an
|
|
19
|
-
* outer border pretending to be a separator, and it is the line that lands on top of whatever
|
|
20
|
-
* frame the container already has.
|
|
21
|
-
*
|
|
22
|
-
* The guard is an INVENTORY, not a pattern match: every horizontal hairline in every CSS module has
|
|
23
|
-
* to be listed below with a `kind` and a reason, so a seventh one added next month fails here and
|
|
24
|
-
* gets classified rather than shipping unexamined. That is the same idiom `theme/border-coverage.test.ts`
|
|
25
|
-
* uses for Mantine's stock borders, applied to the ones basalt writes itself.
|
|
26
|
-
*
|
|
27
|
-
* Not in scope, deliberately: the `border` SHORTHAND (a box around a control or a card — that is an
|
|
28
|
-
* edge, not a rule, and `border-coverage.test.ts` owns it), vertical hairlines (a column rule
|
|
29
|
-
* divides two regions by construction), and Mantine's own `inset 0 -1px 0` redraw of a STICKY table
|
|
30
|
-
* head's `border-bottom`, which is a row line drawn as a shadow because `border-collapse: collapse`
|
|
31
|
-
* drops borders on sticky cells — it appears and disappears with `withRowBorders`, so it is the same
|
|
32
|
-
* line every other row gets and not a header rule.
|
|
33
|
-
*/
|
|
34
|
-
import { describe, expect, test } from 'bun:test'
|
|
35
|
-
import { Glob } from 'bun'
|
|
36
|
-
import { readFileSync } from 'node:fs'
|
|
37
|
-
import { join } from 'node:path'
|
|
38
|
-
|
|
39
|
-
const SRC = join(import.meta.dir, '..')
|
|
40
|
-
|
|
41
|
-
type Hairline = { readonly file: string; readonly selector: string; readonly decl: string }
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Every `border-{top,bottom,block-start,block-end}` and every 1px inset `box-shadow` in a CSS
|
|
45
|
-
* module, with the selector it sits under. A hand-rolled scanner rather than a regex per file: the
|
|
46
|
-
* SELECTOR is half the classification (`.header` vs `.rows > *:not(:last-child)` are the two
|
|
47
|
-
* opposite verdicts), and a regex over declarations alone cannot see it.
|
|
48
|
-
*/
|
|
49
|
-
function scanHairlines(): { rules: Hairline[]; drops: Hairline[] } {
|
|
50
|
-
const rules: Hairline[] = []
|
|
51
|
-
const drops: Hairline[] = []
|
|
52
|
-
const files = [...new Glob('**/*.module.css').scanSync({ cwd: SRC })].sort()
|
|
53
|
-
for (const file of files) {
|
|
54
|
-
const css = readFileSync(join(SRC, file), 'utf8').replace(/\/\*[\s\S]*?\*\//g, '')
|
|
55
|
-
const stack: string[] = []
|
|
56
|
-
let buf = ''
|
|
57
|
-
for (const ch of css) {
|
|
58
|
-
if (ch === '{') {
|
|
59
|
-
stack.push(buf.trim().replace(/\s+/g, ' '))
|
|
60
|
-
buf = ''
|
|
61
|
-
continue
|
|
62
|
-
}
|
|
63
|
-
if (ch === '}') {
|
|
64
|
-
stack.pop()
|
|
65
|
-
buf = ''
|
|
66
|
-
continue
|
|
67
|
-
}
|
|
68
|
-
if (ch !== ';') {
|
|
69
|
-
buf += ch
|
|
70
|
-
continue
|
|
71
|
-
}
|
|
72
|
-
const decl = buf.trim().replace(/\s+/g, ' ')
|
|
73
|
-
buf = ''
|
|
74
|
-
const border = /^border-(?:top|bottom|block-start|block-end):\s*(.+)$/.exec(decl)
|
|
75
|
-
const selector = stack.join(' >> ')
|
|
76
|
-
if (border !== null) {
|
|
77
|
-
;(border[1] === 'none' ? drops : rules).push({ file, selector, decl })
|
|
78
|
-
continue
|
|
79
|
-
}
|
|
80
|
-
if (decl.startsWith('box-shadow:') && decl.includes('inset') && /\b-?1px\b/.test(decl)) {
|
|
81
|
-
rules.push({ file, selector, decl })
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return { rules, drops }
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* `between-rows` — the line sits BETWEEN two members of a list and the family drops its last one.
|
|
90
|
-
* `region-boundary` — it separates two layout regions that are not a header and its content (the
|
|
91
|
-
* mobile bar and the page it floats over, an article's body and its footer).
|
|
92
|
-
* `prose-typography` — an AUTHORED document, not app chrome: an `<hr>` the author wrote, the rule
|
|
93
|
-
* under an article's `h2`, a code block's filename bar. A document's conventions are the reader's
|
|
94
|
-
* expectations there (`docs/CONTENT-SPEC.md`), and `content/**` is out of the chrome lane for
|
|
95
|
-
* exactly that reason. Nothing in this kind may appear outside `content/`.
|
|
96
|
-
*/
|
|
97
|
-
type Kind = 'between-rows' | 'region-boundary' | 'prose-typography'
|
|
98
|
-
|
|
99
|
-
const LEDGER: readonly { file: string; selector: string; kind: Kind; why: string }[] = [
|
|
100
|
-
{
|
|
101
|
-
file: 'shell/app-mobile-nav.module.css',
|
|
102
|
-
selector: '.bar',
|
|
103
|
-
kind: 'region-boundary',
|
|
104
|
-
why: 'The mobile bar is a fixed region floating over a scrolling page — the rule is the only thing that says the page ends there, and it is the boundary between two regions, not a header and its content.',
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
file: 'controls/controls.module.css',
|
|
108
|
-
selector:
|
|
109
|
-
'.sheetOption + .sheetOption, .sheetDisclosureBody + .sheetOption, .sheetOption + .sheetDisclosureBody',
|
|
110
|
-
kind: 'between-rows',
|
|
111
|
-
why: "The filter sheet's option rows. Written as an adjacent-sibling rule so the FIRST row has no top line — the group label above it is a header and gets no rule (C15).",
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
file: 'controls/controls.module.css',
|
|
115
|
-
selector: '.sheetRow',
|
|
116
|
-
kind: 'between-rows',
|
|
117
|
-
why: 'A 44px sheet row. Paired with `.sheetRow:last-child { border-bottom: none }` below, which the last-rule assertion checks.',
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
file: 'dashboard/settings-section.module.css',
|
|
121
|
-
selector: '.rows > *:not(:last-child)',
|
|
122
|
-
kind: 'between-rows',
|
|
123
|
-
why: 'A settings list. The `:not(:last-child)` IS the last-rule drop, written into the selector rather than as a second rule.',
|
|
124
|
-
},
|
|
125
|
-
{
|
|
126
|
-
file: 'content/article-layout.module.css',
|
|
127
|
-
selector: '.header',
|
|
128
|
-
kind: 'prose-typography',
|
|
129
|
-
why: "An article's masthead rule — the title-block convention of a printed document, and the one place a reader expects a line under a heading.",
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
file: 'content/article-layout.module.css',
|
|
133
|
-
selector: '.footer',
|
|
134
|
-
kind: 'region-boundary',
|
|
135
|
-
why: 'Prev/next navigation below the article body — two regions, and the rule is above the footer rather than under a heading.',
|
|
136
|
-
},
|
|
137
|
-
{
|
|
138
|
-
file: 'content/guide.module.css',
|
|
139
|
-
selector: '.footer',
|
|
140
|
-
kind: 'region-boundary',
|
|
141
|
-
why: 'Same shape as the article footer: the boundary between a document and the navigation after it.',
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
file: 'content/prose.module.css',
|
|
145
|
-
selector: '.root hr',
|
|
146
|
-
kind: 'prose-typography',
|
|
147
|
-
why: 'An `<hr>` the AUTHOR wrote in their markdown. basalt does not get to drop a divider the document asked for.',
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
file: 'content/prose.module.css',
|
|
151
|
-
selector: '.root.article h2',
|
|
152
|
-
kind: 'prose-typography',
|
|
153
|
-
why: "The `article` prose variant's section rule — a long-form document convention, scoped to that variant and never applied to app chrome.",
|
|
154
|
-
},
|
|
155
|
-
{
|
|
156
|
-
file: 'content/code-block.module.css',
|
|
157
|
-
selector: '.header',
|
|
158
|
-
kind: 'prose-typography',
|
|
159
|
-
why: "A code block's filename/language bar. The block is a quoted artifact inside a document, and the bar is its frame's top row rather than a section heading.",
|
|
160
|
-
},
|
|
161
|
-
]
|
|
162
|
-
|
|
163
|
-
const CHROME_LANES = ['shell/', 'controls/', 'dashboard/', 'data/', 'widget-header/', 'theme/']
|
|
164
|
-
|
|
165
|
-
function isChrome(file: string): boolean {
|
|
166
|
-
return CHROME_LANES.some((lane) => file.startsWith(lane))
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
const { rules, drops } = scanHairlines()
|
|
170
|
-
|
|
171
|
-
describe('every horizontal hairline is inventoried and classified', () => {
|
|
172
|
-
test('no hairline exists that the ledger does not name', () => {
|
|
173
|
-
const listed = new Set(LEDGER.map((e) => `${e.file}|${e.selector}`))
|
|
174
|
-
const unlisted = rules
|
|
175
|
-
.filter((r) => !listed.has(`${r.file}|${r.selector}`))
|
|
176
|
-
.map((r) => `${r.file} → ${r.selector} { ${r.decl} }`)
|
|
177
|
-
// Do NOT silence this by adding an entry with a hand-wave. Decide which `kind` the line is: a
|
|
178
|
-
// `between-rows` family (then add the last-rule drop too), a `region-boundary`, or — only inside
|
|
179
|
-
// `content/**` — `prose-typography`. A rule under a heading in the chrome lane is none of the
|
|
180
|
-
// three, and the fix is to delete it and let the type scale and the space do the work.
|
|
181
|
-
expect(unlisted).toEqual([])
|
|
182
|
-
})
|
|
183
|
-
|
|
184
|
-
test('the ledger names nothing that no longer exists', () => {
|
|
185
|
-
const found = new Set(rules.map((r) => `${r.file}|${r.selector}`))
|
|
186
|
-
expect(LEDGER.filter((e) => !found.has(`${e.file}|${e.selector}`)).map((e) => e.file)).toEqual(
|
|
187
|
-
[],
|
|
188
|
-
)
|
|
189
|
-
})
|
|
190
|
-
|
|
191
|
-
test('`prose-typography` is confined to content/ — app chrome has no authored-document lane', () => {
|
|
192
|
-
expect(
|
|
193
|
-
LEDGER.filter((e) => e.kind === 'prose-typography' && !e.file.startsWith('content/')).map(
|
|
194
|
-
(e) => `${e.file} → ${e.selector}`,
|
|
195
|
-
),
|
|
196
|
-
).toEqual([])
|
|
197
|
-
})
|
|
198
|
-
|
|
199
|
-
test('every ledger entry carries a real reason', () => {
|
|
200
|
-
expect(LEDGER.filter((e) => e.why.length < 40).map((e) => e.selector)).toEqual([])
|
|
201
|
-
})
|
|
202
|
-
})
|
|
203
|
-
|
|
204
|
-
describe('a header never draws a rule under itself in the chrome lane', () => {
|
|
205
|
-
// The five class names the chrome lane uses for "the heading row of a thing" — `WidgetHeader`'s
|
|
206
|
-
// root/titleRow/subtitle, `Section`'s, the filter sheet's, the table toolbar's. A `border-bottom`
|
|
207
|
-
// on any of them is the exact regression this describe block exists for.
|
|
208
|
-
const HEADER_SELECTOR =
|
|
209
|
-
/^\.(?:root|header|titleRow|title|subtitle|sheetHeader|sheetTitle|toolbar|thead|head)\b/
|
|
210
|
-
|
|
211
|
-
test('no chrome-lane hairline sits under a header-shaped selector', () => {
|
|
212
|
-
const offenders = rules
|
|
213
|
-
.filter((r) => isChrome(r.file) && HEADER_SELECTOR.test(r.selector))
|
|
214
|
-
.map((r) => `${r.file} → ${r.selector} { ${r.decl} }`)
|
|
215
|
-
expect(offenders).toEqual([])
|
|
216
|
-
})
|
|
217
|
-
|
|
218
|
-
test('the chrome lane holds ONLY between-rows and region-boundary lines', () => {
|
|
219
|
-
const kinds = LEDGER.filter((e) => isChrome(e.file)).map((e) => e.kind)
|
|
220
|
-
expect([...new Set(kinds)].sort()).toEqual(['between-rows', 'region-boundary'])
|
|
221
|
-
})
|
|
222
|
-
})
|
|
223
|
-
|
|
224
|
-
describe('a between-rows family drops its last rule', () => {
|
|
225
|
-
for (const entry of LEDGER.filter((e) => e.kind === 'between-rows')) {
|
|
226
|
-
test(`${entry.file} → ${entry.selector}`, () => {
|
|
227
|
-
// Either the selector itself excludes the last member (`:not(:last-child)`, or an
|
|
228
|
-
// adjacent-sibling combinator, which draws the line as the SECOND row's top edge and so has no
|
|
229
|
-
// trailing rule by construction), or the module carries an explicit `border: none` drop.
|
|
230
|
-
const selfLimiting = /:not\(:last-child\)|\+/.test(entry.selector)
|
|
231
|
-
const dropped = drops.some(
|
|
232
|
-
(d) => d.file === entry.file && d.selector.startsWith(`${entry.selector}:last`),
|
|
233
|
-
)
|
|
234
|
-
expect(selfLimiting || dropped).toBe(true)
|
|
235
|
-
})
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
test('the themed Table drops its last body row — the rule that used to land on the outer box', () => {
|
|
239
|
-
// `BasaltDataTable`'s `withTableBorder` went to `false` by default in the same minor (see
|
|
240
|
-
// `data/data-table.test.tsx`); while both shipped, the two lines sat on top of each other and the
|
|
241
|
-
// doubling hid which of them was drawing it. `tbody` scoped so a `tfoot` totals row keeps the
|
|
242
|
-
// BETWEEN rule above it.
|
|
243
|
-
const css = readFileSync(join(SRC, 'theme/controls.module.css'), 'utf8')
|
|
244
|
-
expect(css).toContain('html .tableRoot tbody tr:last-of-type')
|
|
245
|
-
expect(drops).toContainEqual({
|
|
246
|
-
file: 'theme/controls.module.css',
|
|
247
|
-
selector: 'html .tableRoot tbody tr:last-of-type',
|
|
248
|
-
decl: 'border-bottom: none',
|
|
249
|
-
})
|
|
250
|
-
})
|
|
251
|
-
|
|
252
|
-
test('the themed Accordion drops its last item — the same law, already shipped', () => {
|
|
253
|
-
expect(drops).toContainEqual({
|
|
254
|
-
file: 'theme/controls.module.css',
|
|
255
|
-
selector: '.accordionItem:last-of-type',
|
|
256
|
-
decl: 'border-bottom: none',
|
|
257
|
-
})
|
|
258
|
-
})
|
|
259
|
-
})
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `createBasaltTheme`'s `{ fonts }` option — a pure pass-through onto `theme.other.basaltFonts`
|
|
3
|
-
* (no derivation math, unlike `{ derive }`). See `derive-theme.test.ts` for the derive-config
|
|
4
|
-
* equivalent this mirrors.
|
|
5
|
-
*/
|
|
6
|
-
import { describe, expect, test } from 'bun:test'
|
|
7
|
-
import { baseTheme, createBasaltTheme } from './index'
|
|
8
|
-
import type { BasaltFontsConfig } from './index'
|
|
9
|
-
|
|
10
|
-
describe('the default path carries no theme.other.basaltFonts', () => {
|
|
11
|
-
test('createBasaltTheme() carries no basaltFonts', () => {
|
|
12
|
-
expect(createBasaltTheme().other?.['basaltFonts']).toBeUndefined()
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
test('createBasaltTheme(undefined, {}) carries no basaltFonts', () => {
|
|
16
|
-
expect(createBasaltTheme(undefined, {}).other?.['basaltFonts']).toBeUndefined()
|
|
17
|
-
})
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
describe('an empty fonts object is treated as absent — stays on the static baseTheme fast path', () => {
|
|
21
|
-
test('createBasaltTheme(undefined, { fonts: {} }) returns the identical baseTheme reference', () => {
|
|
22
|
-
expect(createBasaltTheme(undefined, { fonts: {} })).toBe(baseTheme)
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
test('carries no theme.other.basaltFonts', () => {
|
|
26
|
-
expect(createBasaltTheme(undefined, { fonts: {} }).other?.['basaltFonts']).toBeUndefined()
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
test('an all-undefined-keys fonts object is also treated as absent', () => {
|
|
30
|
-
// Deliberately constructs a key explicitly set to undefined — exactOptionalPropertyTypes
|
|
31
|
-
// correctly forbids this as a static shape, but the whole point of the test is verifying
|
|
32
|
-
// createBasaltTheme's RUNTIME handling of that wire shape (a caller spreading in an
|
|
33
|
-
// undefined value), hence the cast.
|
|
34
|
-
const fonts = { sans: undefined } as unknown as BasaltFontsConfig
|
|
35
|
-
const theme = createBasaltTheme(undefined, { fonts })
|
|
36
|
-
expect(theme).toBe(baseTheme)
|
|
37
|
-
expect(theme.other?.['basaltFonts']).toBeUndefined()
|
|
38
|
-
})
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
describe('a fonts option graduates onto the theme', () => {
|
|
42
|
-
test('exposes the exact fonts object on theme.other.basaltFonts', () => {
|
|
43
|
-
const theme = createBasaltTheme(undefined, { fonts: { sans: 'Inter, sans-serif' } })
|
|
44
|
-
expect(theme.other?.['basaltFonts']).toEqual({ sans: 'Inter, sans-serif' })
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
test('accepts all three slots', () => {
|
|
48
|
-
const fonts = {
|
|
49
|
-
sans: 'Inter, sans-serif',
|
|
50
|
-
head: 'Poppins, sans-serif',
|
|
51
|
-
mono: 'Fira Code, monospace',
|
|
52
|
-
}
|
|
53
|
-
const theme = createBasaltTheme(undefined, { fonts })
|
|
54
|
-
expect(theme.other?.['basaltFonts']).toEqual(fonts)
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
test('combines with a non-default derive config without dropping either', () => {
|
|
58
|
-
const theme = createBasaltTheme(undefined, {
|
|
59
|
-
derive: { accent: '#16a34a' },
|
|
60
|
-
fonts: { sans: 'Inter, sans-serif' },
|
|
61
|
-
})
|
|
62
|
-
expect(theme.other?.['basaltFonts']).toEqual({ sans: 'Inter, sans-serif' })
|
|
63
|
-
expect(theme.other?.['basaltDerive']).toBeDefined()
|
|
64
|
-
})
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
describe('consumer overrides still win on top of a fonts option', () => {
|
|
68
|
-
test('an explicit other.basaltFonts override replaces it', () => {
|
|
69
|
-
const theme = createBasaltTheme(
|
|
70
|
-
{ other: { basaltFonts: { sans: 'Georgia, serif' } } },
|
|
71
|
-
{ fonts: { sans: 'Inter, sans-serif' } },
|
|
72
|
-
)
|
|
73
|
-
expect(theme.other?.['basaltFonts']).toEqual({ sans: 'Georgia, serif' })
|
|
74
|
-
})
|
|
75
|
-
})
|
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `IconSlot` — the one icon box (`docs/CONTROLS-SPEC.md` §3).
|
|
3
|
-
*
|
|
4
|
-
* The bug this file exists to prevent: a consumer's inline `<svg width="24" height="24">` handed to
|
|
5
|
-
* a basalt control's `icon` prop landed in Mantine's `leftSection`, which is a bare `flex` box with
|
|
6
|
-
* no size of its own. The glyph painted at 24px inside a 30px `ctl` button, sat on the parent's text
|
|
7
|
-
* baseline (so it hung low of the optical centre by the line box's descender), and set the row's
|
|
8
|
-
* height. Measured in Chrome on the playground's header: the `Accounts` secondary read visibly low
|
|
9
|
-
* and left of centre.
|
|
10
|
-
*
|
|
11
|
-
* Two halves, because neither alone would hold. The CSS-TEXT half pins the mechanism (a fixed square
|
|
12
|
-
* box, `100%` on the glyph, `display: block`) — CSS-module class hashes are unavailable under
|
|
13
|
-
* `bun test`, so the declarations themselves are read from the file, the same idiom
|
|
14
|
-
* `controls/filter-set.test.tsx` and `theme/layout-rhythm-css.test.ts` use. The RENDER half pins that
|
|
15
|
-
* every home named by the spec actually routes its `icon` through the slot, found by the
|
|
16
|
-
* `data-basalt-icon` marker attribute rather than by a class.
|
|
17
|
-
*/
|
|
18
|
-
import { MantineProvider } from '@mantine/core'
|
|
19
|
-
import { render } from '@testing-library/react'
|
|
20
|
-
import { describe, expect, test } from 'bun:test'
|
|
21
|
-
import { readFileSync } from 'node:fs'
|
|
22
|
-
import { join } from 'node:path'
|
|
23
|
-
import type { ReactNode } from 'react'
|
|
24
|
-
import { ActionGroup } from '../controls/actions'
|
|
25
|
-
import { FilterPill } from '../controls/filter-pill'
|
|
26
|
-
import { SyncButton } from '../controls/sync-button'
|
|
27
|
-
import { WidgetHeader } from '../widget-header/widget-header'
|
|
28
|
-
import { IconSlot } from './icon-slot'
|
|
29
|
-
|
|
30
|
-
const ICON_SLOT_CSS = readFileSync(join(import.meta.dir, 'icon-slot.module.css'), 'utf8')
|
|
31
|
-
const CONTROLS_CSS = readFileSync(join(import.meta.dir, '../controls/controls.module.css'), 'utf8')
|
|
32
|
-
const WIDGET_HEADER_CSS = readFileSync(
|
|
33
|
-
join(import.meta.dir, '../widget-header/widget-header.module.css'),
|
|
34
|
-
'utf8',
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
/** A consumer glyph that declares its OWN geometry — the exact shape that used to leak through. */
|
|
38
|
-
function OversizedGlyph(): ReactNode {
|
|
39
|
-
return (
|
|
40
|
-
<svg width={24} height={24} viewBox="0 0 24 24" data-testid="glyph">
|
|
41
|
-
<circle cx={12} cy={12} r={10} />
|
|
42
|
-
</svg>
|
|
43
|
-
)
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/** A consumer glyph with no `width`/`height` and no `viewBox` — paints 300×150 unstyled. */
|
|
47
|
-
function UnsizedGlyph(): ReactNode {
|
|
48
|
-
return (
|
|
49
|
-
<svg data-testid="glyph">
|
|
50
|
-
<circle cx={8} cy={8} r={8} />
|
|
51
|
-
</svg>
|
|
52
|
-
)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function slots(container: HTMLElement): HTMLElement[] {
|
|
56
|
-
return [...container.querySelectorAll<HTMLElement>('[data-basalt-icon]')]
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/** The slot wrapping the marked glyph — asserts the glyph is a DIRECT child, which the `> svg`
|
|
60
|
-
* selector requires to bite. */
|
|
61
|
-
function slotAround(container: HTMLElement): HTMLElement | null {
|
|
62
|
-
const glyph = container.querySelector('[data-testid="glyph"]')
|
|
63
|
-
const parent = glyph?.parentElement ?? null
|
|
64
|
-
return parent !== null && parent.hasAttribute('data-basalt-icon') ? parent : null
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
describe('the box is declared once, in CSS, and cannot be set at a call site', () => {
|
|
68
|
-
test('the slot is a fixed square off --vx-space-icon-size with a 16px fallback', () => {
|
|
69
|
-
expect(ICON_SLOT_CSS).toContain('width: var(--vx-space-icon-size, 1rem)')
|
|
70
|
-
expect(ICON_SLOT_CSS).toContain('height: var(--vx-space-icon-size, 1rem)')
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
test('the slot never participates in its row’s flex sizing', () => {
|
|
74
|
-
expect(ICON_SLOT_CSS).toContain('flex: none')
|
|
75
|
-
expect(ICON_SLOT_CSS).toContain('display: inline-flex')
|
|
76
|
-
expect(ICON_SLOT_CSS).toContain('align-items: center')
|
|
77
|
-
expect(ICON_SLOT_CSS).toContain('justify-content: center')
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
test('the glyph is restated at 100% and taken off the baseline — the two halves of "centred"', () => {
|
|
81
|
-
const rule = ICON_SLOT_CSS.slice(ICON_SLOT_CSS.indexOf('.slot > svg'))
|
|
82
|
-
expect(rule).toContain('width: 100%')
|
|
83
|
-
expect(rule).toContain('height: 100%')
|
|
84
|
-
expect(rule).toContain('display: block')
|
|
85
|
-
// Presentation attributes lose to CSS, which is the whole mechanism — a 24px, a 14px and an
|
|
86
|
-
// attribute-less SVG all resolve to the box.
|
|
87
|
-
expect(rule).toContain('object-fit: contain')
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
test('`img` and `picture` icons get the same box — an icon set is as likely to be a sprite', () => {
|
|
91
|
-
expect(ICON_SLOT_CSS).toContain('.slot > img')
|
|
92
|
-
expect(ICON_SLOT_CSS).toContain('.slot > picture')
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
test('IconSlot has no size prop — a call site cannot pick a geometry', () => {
|
|
96
|
-
const source = readFileSync(join(import.meta.dir, 'icon-slot.tsx'), 'utf8')
|
|
97
|
-
const props = source.slice(
|
|
98
|
-
source.indexOf('export type IconSlotProps'),
|
|
99
|
-
source.indexOf('export function IconSlot'),
|
|
100
|
-
)
|
|
101
|
-
expect(props).not.toContain('size')
|
|
102
|
-
// `children` + `className` and nothing else.
|
|
103
|
-
expect(props.match(/readonly \w+\??:/g)).toEqual(['readonly children:', 'readonly className?:'])
|
|
104
|
-
})
|
|
105
|
-
|
|
106
|
-
test('a home sizes the slot by overriding the box VAR, never by sizing the glyph', () => {
|
|
107
|
-
// The trailing pill affordance is 14px and the widget-tier heading icon is 14px. Both get there
|
|
108
|
-
// through `--vx-space-icon-size`; neither may reintroduce a per-component `> svg` size rule,
|
|
109
|
-
// which is the duplication that let `BarAction` ship with no box at all.
|
|
110
|
-
expect(CONTROLS_CSS).toContain('--vx-space-icon-size: 0.875rem')
|
|
111
|
-
expect(WIDGET_HEADER_CSS).toContain('--vx-space-icon-size: 0.875rem')
|
|
112
|
-
expect(WIDGET_HEADER_CSS).toContain('--vx-space-icon-size: 1rem')
|
|
113
|
-
expect(CONTROLS_CSS).not.toMatch(/\.pillIcon\s*>\s*svg/)
|
|
114
|
-
expect(WIDGET_HEADER_CSS).not.toMatch(/\.icon\s*>\s*svg/)
|
|
115
|
-
})
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
describe('every home named by the spec routes `icon` through the slot', () => {
|
|
119
|
-
test('a BarAction secondary — an oversized consumer SVG lands inside the slot', () => {
|
|
120
|
-
const { container } = render(
|
|
121
|
-
<MantineProvider>
|
|
122
|
-
<ActionGroup
|
|
123
|
-
secondary={[{ key: 'accounts', label: 'Accounts', icon: <OversizedGlyph /> }]}
|
|
124
|
-
/>
|
|
125
|
-
</MantineProvider>,
|
|
126
|
-
)
|
|
127
|
-
// Both viewport variants mount (law C9), so the glyph appears twice; every occurrence is slotted.
|
|
128
|
-
const glyphs = [...container.querySelectorAll('[data-testid="glyph"]')]
|
|
129
|
-
expect(glyphs.length).toBeGreaterThan(0)
|
|
130
|
-
for (const glyph of glyphs) {
|
|
131
|
-
expect(glyph.parentElement?.hasAttribute('data-basalt-icon')).toBe(true)
|
|
132
|
-
}
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
test('a BarAction PRIMARY too — the mobile icon-only form is the same box', () => {
|
|
136
|
-
const { container } = render(
|
|
137
|
-
<MantineProvider>
|
|
138
|
-
<ActionGroup primary={{ key: 'save', label: 'Save as report', icon: <UnsizedGlyph /> }} />
|
|
139
|
-
</MantineProvider>,
|
|
140
|
-
)
|
|
141
|
-
const glyphs = [...container.querySelectorAll('[data-testid="glyph"]')]
|
|
142
|
-
expect(glyphs.length).toBeGreaterThan(0)
|
|
143
|
-
for (const glyph of glyphs) {
|
|
144
|
-
expect(glyph.parentElement?.hasAttribute('data-basalt-icon')).toBe(true)
|
|
145
|
-
}
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
test('an OverflowMenu row — the fold is a home too', () => {
|
|
149
|
-
const { container } = render(
|
|
150
|
-
<MantineProvider>
|
|
151
|
-
<ActionGroup
|
|
152
|
-
secondary={[
|
|
153
|
-
{ key: 'a', label: 'A' },
|
|
154
|
-
{ key: 'b', label: 'B' },
|
|
155
|
-
{ key: 'c', label: 'C' },
|
|
156
|
-
{ key: 'd', label: 'D', icon: <OversizedGlyph /> },
|
|
157
|
-
]}
|
|
158
|
-
/>
|
|
159
|
-
</MantineProvider>,
|
|
160
|
-
)
|
|
161
|
-
// The `More` dropdown mounts lazily, so assert the fold exists and its trigger is present; the
|
|
162
|
-
// ROW's slotting is covered by the source guard below, which reads the same code path.
|
|
163
|
-
expect(container.textContent).toContain('More')
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
test('a FilterPill — the leading glyph is slotted (every enum filter renders through it)', () => {
|
|
167
|
-
const { container } = render(
|
|
168
|
-
<MantineProvider>
|
|
169
|
-
<FilterPill label="EUR" icon={<OversizedGlyph />} />
|
|
170
|
-
</MantineProvider>,
|
|
171
|
-
)
|
|
172
|
-
expect(slotAround(container)).not.toBeNull()
|
|
173
|
-
})
|
|
174
|
-
|
|
175
|
-
test('a FilterPill’s trailing affordance is slotted too, at the 14px box', () => {
|
|
176
|
-
const { container } = render(
|
|
177
|
-
<MantineProvider>
|
|
178
|
-
<FilterPill label="EUR" />
|
|
179
|
-
</MantineProvider>,
|
|
180
|
-
)
|
|
181
|
-
// The `⇅` affordance is basalt's own glyph and still goes through the slot — the box is the
|
|
182
|
-
// slot's on every icon in the tier, framework-drawn or consumer-passed.
|
|
183
|
-
expect(slots(container).length).toBe(1)
|
|
184
|
-
})
|
|
185
|
-
|
|
186
|
-
test('a WidgetHeader — tier="widget"', () => {
|
|
187
|
-
const { container } = render(
|
|
188
|
-
<WidgetHeader tier="widget" title="Active users" icon={<OversizedGlyph />} />,
|
|
189
|
-
)
|
|
190
|
-
expect(slotAround(container)).not.toBeNull()
|
|
191
|
-
})
|
|
192
|
-
|
|
193
|
-
test('a WidgetHeader — tier="section" (and StatCard, which forwards `icon` to it)', () => {
|
|
194
|
-
const { container } = render(
|
|
195
|
-
<WidgetHeader tier="section" title="Funnel & retention" icon={<UnsizedGlyph />} />,
|
|
196
|
-
)
|
|
197
|
-
expect(slotAround(container)).not.toBeNull()
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
test('a SyncButton — basalt’s own glyph obeys the same box', () => {
|
|
201
|
-
const { container } = render(
|
|
202
|
-
<MantineProvider>
|
|
203
|
-
<SyncButton scope="page" syncing={false} onSync={() => {}} />
|
|
204
|
-
</MantineProvider>,
|
|
205
|
-
)
|
|
206
|
-
expect(slots(container).length).toBeGreaterThan(0)
|
|
207
|
-
})
|
|
208
|
-
})
|
|
209
|
-
|
|
210
|
-
describe('the slot is decorative and queryable, by construction', () => {
|
|
211
|
-
test('aria-hidden is unconditional — the control carries the name, never the icon', () => {
|
|
212
|
-
const { container } = render(
|
|
213
|
-
<IconSlot>
|
|
214
|
-
<OversizedGlyph />
|
|
215
|
-
</IconSlot>,
|
|
216
|
-
)
|
|
217
|
-
expect(container.querySelector('[data-basalt-icon]')?.getAttribute('aria-hidden')).toBe('true')
|
|
218
|
-
})
|
|
219
|
-
|
|
220
|
-
test('a home’s className is composed ONTO the slot, never in place of it', () => {
|
|
221
|
-
const { container } = render(
|
|
222
|
-
<IconSlot className="home-colour">
|
|
223
|
-
<OversizedGlyph />
|
|
224
|
-
</IconSlot>,
|
|
225
|
-
)
|
|
226
|
-
// The module hash is '' under `bun test`, so the assertion is that the home's class survived
|
|
227
|
-
// alongside whatever the module resolves to — i.e. it is appended, not substituted.
|
|
228
|
-
expect(container.querySelector('[data-basalt-icon]')?.className).toContain('home-colour')
|
|
229
|
-
})
|
|
230
|
-
})
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* The recurrence guard. Every `leftSection`/`rightSection` in the control tier that carries a
|
|
234
|
-
* CALLER-supplied icon must route it through `IconSlot` — this is what makes a seventh control
|
|
235
|
-
* added next month fail here instead of shipping an un-boxed glyph, which is exactly how
|
|
236
|
-
* `BarAction` shipped.
|
|
237
|
-
*
|
|
238
|
-
* Scoped to the files that own an `icon` prop in the tier the spec governs. `src/shell/app-sidebar.tsx`
|
|
239
|
-
* and `src/shell/app-mobile-nav.tsx` are deliberately out of scope: a nav row's icon column is sized
|
|
240
|
-
* by the sidebar's own rhythm rules, not by the control tier, and folding them in is a separate
|
|
241
|
-
* change with its own visual budget.
|
|
242
|
-
*/
|
|
243
|
-
describe('no control in the tier may hand a caller’s icon straight to a section slot', () => {
|
|
244
|
-
const TIER_FILES = [
|
|
245
|
-
'../controls/actions.tsx',
|
|
246
|
-
'../controls/filter-pill.tsx',
|
|
247
|
-
'../controls/sync-button.tsx',
|
|
248
|
-
'../shell/sidebar-blocks.tsx',
|
|
249
|
-
] as const
|
|
250
|
-
|
|
251
|
-
for (const rel of TIER_FILES) {
|
|
252
|
-
test(`${rel} routes every icon-bearing section through IconSlot`, () => {
|
|
253
|
-
const source = readFileSync(join(import.meta.dir, rel), 'utf8')
|
|
254
|
-
const offenders: string[] = []
|
|
255
|
-
for (const match of source.matchAll(/(left|right)Section[:=]\s*([^,\n]*)/g)) {
|
|
256
|
-
const raw = match[2] ?? ''
|
|
257
|
-
// A bare identifier (`leftSection: lead`) is resolved one level to its `const` initialiser,
|
|
258
|
-
// so a slot built a line above still counts. One level only — anything deeper than that is
|
|
259
|
-
// indirection a reader could not follow either.
|
|
260
|
-
const bare = /^([A-Za-z_$][\w$]*)\s*\}?\)?,?$/.exec(raw.trim())
|
|
261
|
-
const declared =
|
|
262
|
-
bare === null
|
|
263
|
-
? undefined
|
|
264
|
-
: new RegExp(`\\bconst ${bare[1]}\\b[^\\n]*(?:\\n[^\\n]*){0,3}`).exec(source)?.[0]
|
|
265
|
-
const value = declared ?? raw
|
|
266
|
-
// Only the icon-bearing sites are in scope — a `rightSection` holding a count badge or a
|
|
267
|
-
// `<Text>` meta string is not an icon and has no box to pin.
|
|
268
|
-
if (!/icon|glyph|lead/i.test(value)) continue
|
|
269
|
-
if (value.includes('IconSlot')) continue
|
|
270
|
-
offenders.push(match[0].trim())
|
|
271
|
-
}
|
|
272
|
-
expect(offenders).toEqual([])
|
|
273
|
-
})
|
|
274
|
-
}
|
|
275
|
-
})
|