basalt-ui 1.26.0 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +23 -23
- package/CHANGELOG.md +67 -0
- package/MIGRATING.md +896 -37
- package/README.md +33 -3
- package/agent/rules/basalt-batteries.md +25 -10
- package/agent/rules/basalt-controls.md +73 -43
- package/agent/rules/basalt-mantine.md +17 -6
- package/agent/rules/basalt-state.md +5 -0
- package/agent/rules/basalt-tokens.md +1 -1
- package/configs/oxlint-plugin.js +1286 -73
- package/configs/oxlint-plugin.test.ts +1338 -29
- package/configs/oxlint.json +12 -5
- package/dist/agent/coalesce.d.ts.map +1 -1
- package/dist/agent/coalesce.js +2 -1
- package/dist/agent/merge.d.ts.map +1 -1
- package/dist/agent/merge.js +2 -1
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/part-list.js +2 -0
- package/dist/agent/stick-to-bottom.d.ts +3 -6
- package/dist/agent/stick-to-bottom.d.ts.map +1 -1
- package/dist/agent/stick-to-bottom.js +6 -3
- package/dist/agent-chat/composer.d.ts +6 -2
- package/dist/agent-chat/composer.d.ts.map +1 -1
- package/dist/agent-chat/composer.js +49 -33
- package/dist/agent-chat/relative-time.d.ts +0 -9
- package/dist/agent-chat/relative-time.d.ts.map +1 -1
- package/dist/agent-chat/relative-time.js +2 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +3 -2
- package/dist/agent-chat/thread-detail-panel.d.ts.map +1 -1
- package/dist/agent-chat/thread-detail-panel.js +8 -5
- package/dist/agent-chat/thread-feed-row.d.ts +2 -1
- package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed-row.js +92 -92
- package/dist/agent-chat/thread-feed.d.ts +3 -2
- package/dist/agent-chat/thread-feed.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed.js +8 -3
- package/dist/agent-chat/thread-message.d.ts +4 -3
- package/dist/agent-chat/thread-message.d.ts.map +1 -1
- package/dist/agent-chat/thread-message.js +70 -31
- package/dist/agent-chat/thread-outcome-card.d.ts +3 -2
- package/dist/agent-chat/thread-outcome-card.d.ts.map +1 -1
- package/dist/agent-chat/thread-outcome-card.js +9 -2
- package/dist/agent-chat/thread-workspace.d.ts +7 -2
- package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
- package/dist/agent-chat/thread-workspace.js +62 -29
- package/dist/agent-chat/tool-chip.d.ts +3 -2
- package/dist/agent-chat/tool-chip.d.ts.map +1 -1
- package/dist/agent-chat/tool-chip.js +7 -2
- package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
- package/dist/charts/hooks/useBandPlot.js +15 -8
- package/dist/charts/index.d.ts +8 -7
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +45 -5
- package/dist/charts/kinds/BandStrip.d.ts +10 -7
- package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
- package/dist/charts/kinds/BandStrip.js +12 -7
- package/dist/charts/kinds/Bars.d.ts +12 -6
- package/dist/charts/kinds/Bars.d.ts.map +1 -1
- package/dist/charts/kinds/Bars.js +37 -11
- package/dist/charts/kinds/Donut.d.ts +6 -5
- package/dist/charts/kinds/Donut.d.ts.map +1 -1
- package/dist/charts/kinds/Donut.js +19 -2
- package/dist/charts/kinds/DualPanel.d.ts +6 -5
- package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
- package/dist/charts/kinds/DualPanel.js +36 -8
- package/dist/charts/kinds/Heatmap.d.ts +10 -6
- package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
- package/dist/charts/kinds/Heatmap.js +58 -31
- package/dist/charts/kinds/MirroredBars.d.ts +6 -5
- package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
- package/dist/charts/kinds/MirroredBars.js +9 -2
- package/dist/charts/kinds/MultiLine.d.ts +11 -6
- package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
- package/dist/charts/kinds/MultiLine.js +24 -15
- package/dist/charts/kinds/StackedArea.d.ts +18 -8
- package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
- package/dist/charts/kinds/StackedArea.js +29 -4
- package/dist/charts/kinds/ZonedLine.d.ts +12 -8
- package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
- package/dist/charts/kinds/ZonedLine.js +33 -23
- package/dist/charts/layout/auto-margin.d.ts +65 -8
- package/dist/charts/layout/auto-margin.d.ts.map +1 -1
- package/dist/charts/layout/auto-margin.js +45 -10
- package/dist/charts/layout/log-ticks.d.ts +27 -0
- package/dist/charts/layout/log-ticks.d.ts.map +1 -0
- package/dist/charts/layout/log-ticks.js +42 -0
- package/dist/charts/primitives/Axes.d.ts +11 -2
- package/dist/charts/primitives/Axes.d.ts.map +1 -1
- package/dist/charts/primitives/Axes.js +15 -5
- package/dist/charts/primitives/CartesianChart.d.ts +45 -7
- package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
- package/dist/charts/primitives/CartesianChart.js +86 -28
- package/dist/charts/primitives/ChartCard.d.ts +27 -2
- package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
- package/dist/charts/primitives/ChartCard.js +37 -17
- package/dist/charts/primitives/ChartFrame.d.ts +30 -4
- package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
- package/dist/charts/primitives/ChartFrame.js +45 -15
- package/dist/charts/primitives/ChartLegend.d.ts +13 -2
- package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
- package/dist/charts/primitives/ChartLegend.js +33 -13
- package/dist/charts/primitives/ChartPending.d.ts +77 -4
- package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
- package/dist/charts/primitives/ChartPending.js +100 -6
- package/dist/charts/primitives/ChartTooltip.d.ts +7 -0
- package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
- package/dist/charts/primitives/ChartTooltip.js +18 -5
- package/dist/charts/primitives/Crosshair.d.ts +3 -0
- package/dist/charts/primitives/Crosshair.d.ts.map +1 -1
- package/dist/charts/primitives/Crosshair.js +3 -1
- package/dist/charts/primitives/chart-frame-layout.d.ts +95 -0
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -0
- package/dist/charts/primitives/chart-frame-layout.js +89 -0
- package/dist/charts/primitives/chart-tier.d.ts +16 -0
- package/dist/charts/primitives/chart-tier.d.ts.map +1 -0
- package/dist/charts/primitives/chart-tier.js +20 -0
- package/dist/charts/series.d.ts +55 -1
- package/dist/charts/series.d.ts.map +1 -1
- package/dist/charts/series.js +27 -1
- package/dist/charts/sparklines/BarSparkline.d.ts +3 -3
- package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/BarSparkline.js +9 -3
- package/dist/charts/sparklines/LineSparkline.d.ts +3 -3
- package/dist/charts/sparklines/LineSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/LineSparkline.js +15 -3
- package/dist/charts/sparklines/index.d.ts +2 -2
- package/dist/charts/sparklines/index.d.ts.map +1 -1
- package/dist/charts/utils/format.d.ts +92 -2
- package/dist/charts/utils/format.d.ts.map +1 -1
- package/dist/charts/utils/format.js +64 -1
- package/dist/charts/utils/ticks.d.ts +81 -2
- package/dist/charts/utils/ticks.d.ts.map +1 -1
- package/dist/charts/utils/ticks.js +54 -4
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/commands/ShortcutsHelp.d.ts +3 -2
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +8 -2
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +2 -2
- package/dist/commands/define-overlays.d.ts +102 -0
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +102 -2
- package/dist/commands/index.d.ts +10 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +3 -1
- package/dist/commands/overlays-mount.d.ts +13 -6
- package/dist/commands/overlays-mount.d.ts.map +1 -1
- package/dist/commands/overlays-mount.js +23 -14
- package/dist/common/errors.d.ts +34 -0
- package/dist/common/errors.d.ts.map +1 -0
- package/dist/common/errors.js +36 -0
- package/dist/common/index.d.ts +15 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +29 -0
- package/dist/common/props.d.ts +63 -0
- package/dist/common/props.d.ts.map +1 -0
- package/dist/common/props.js +6 -0
- package/dist/common/query-state-like.d.ts +43 -0
- package/dist/common/query-state-like.d.ts.map +1 -0
- package/dist/common/query-state-like.js +20 -0
- package/dist/common/refs.d.ts +29 -0
- package/dist/common/refs.d.ts.map +1 -0
- package/dist/common/refs.js +29 -0
- package/dist/common/scroll-parent.d.ts +23 -0
- package/dist/common/scroll-parent.d.ts.map +1 -0
- package/dist/common/scroll-parent.js +21 -0
- package/dist/common/validate.d.ts +38 -0
- package/dist/common/validate.d.ts.map +1 -0
- package/dist/common/validate.js +36 -0
- package/dist/connectivity/connectivity-indicator.d.ts +3 -1
- package/dist/connectivity/connectivity-indicator.d.ts.map +1 -1
- package/dist/connectivity/connectivity-indicator.js +3 -1
- package/dist/connectivity/connectivity-provider.d.ts.map +1 -1
- package/dist/connectivity/connectivity-provider.js +4 -1
- package/dist/connectivity/index.d.ts +1 -0
- package/dist/connectivity/index.d.ts.map +1 -1
- package/dist/connectivity/types.d.ts +2 -2
- package/dist/connectivity/types.d.ts.map +1 -1
- package/dist/connectivity/use-connectivity.d.ts.map +1 -1
- package/dist/content/article-layout.module.css +11 -4
- package/dist/content/callout.d.ts +8 -4
- package/dist/content/callout.d.ts.map +1 -1
- package/dist/content/callout.js +15 -8
- package/dist/content/guide.d.ts +5 -4
- package/dist/content/guide.d.ts.map +1 -1
- package/dist/content/guide.js +13 -4
- package/dist/content/heading-anchor.d.ts +24 -2
- package/dist/content/heading-anchor.d.ts.map +1 -1
- package/dist/content/heading-anchor.js +23 -9
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +2 -0
- package/dist/content/prose.module.css +9 -7
- package/dist/content/reading-progress.d.ts +10 -4
- package/dist/content/reading-progress.d.ts.map +1 -1
- package/dist/content/reading-progress.js +26 -10
- package/dist/content/slug.d.ts +4 -0
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/toc.d.ts +11 -0
- package/dist/content/toc.d.ts.map +1 -1
- package/dist/content/toc.js +23 -10
- package/dist/controls/actions.d.ts +49 -6
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/actions.js +39 -8
- package/dist/controls/compare-filter.d.ts +3 -2
- package/dist/controls/compare-filter.d.ts.map +1 -1
- package/dist/controls/compare-filter.js +17 -2
- package/dist/controls/control-group.d.ts +3 -3
- package/dist/controls/control-group.d.ts.map +1 -1
- package/dist/controls/control-group.js +9 -2
- package/dist/controls/controls.module.css +169 -186
- package/dist/controls/controls.module.css.d.ts +9 -11
- package/dist/controls/enum-filter.d.ts +13 -3
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/enum-filter.js +32 -15
- package/dist/controls/filter-context.d.ts +15 -6
- 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 +3 -0
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +6 -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 +124 -22
- package/dist/controls/number-filter.d.ts +28 -0
- package/dist/controls/number-filter.d.ts.map +1 -0
- package/dist/controls/number-filter.js +172 -0
- 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 +20 -5
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/range-filter.js +75 -38
- 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 +26 -11
- 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 +29 -12
- package/dist/controls/view-tabs.d.ts +3 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls/view-tabs.js +43 -11
- package/dist/controls-dates/date-range-picker.d.ts +1 -1
- package/dist/controls-dates/date-range-picker.d.ts.map +1 -1
- package/dist/controls-dates/date-range-picker.js +6 -1
- package/dist/dashboard/delta-badge.d.ts +5 -1
- package/dist/dashboard/delta-badge.d.ts.map +1 -1
- package/dist/dashboard/empty-state.d.ts +10 -3
- package/dist/dashboard/empty-state.d.ts.map +1 -1
- package/dist/dashboard/empty-state.js +37 -6
- package/dist/dashboard/index.d.ts +6 -4
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +10 -2
- package/dist/dashboard/query-state.d.ts +48 -27
- package/dist/dashboard/query-state.d.ts.map +1 -1
- package/dist/dashboard/query-state.js +111 -57
- package/dist/dashboard/settings-section.d.ts +19 -9
- package/dist/dashboard/settings-section.d.ts.map +1 -1
- package/dist/dashboard/settings-section.js +74 -25
- package/dist/dashboard/stat-card.d.ts +76 -19
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +78 -38
- package/dist/dashboard/stat-card.module.css +112 -26
- package/dist/dashboard/stat-card.module.css.d.ts +5 -0
- package/dist/dashboard/stat-group.d.ts +41 -0
- package/dist/dashboard/stat-group.d.ts.map +1 -0
- package/dist/dashboard/stat-group.js +30 -0
- package/dist/dashboard/stat-group.module.css +66 -0
- package/dist/dashboard/stat-group.module.css.d.ts +8 -0
- package/dist/dashboard/widget-grid.d.ts +27 -0
- package/dist/dashboard/widget-grid.d.ts.map +1 -0
- package/dist/dashboard/widget-grid.js +41 -0
- package/dist/dashboard/widget-grid.module.css +53 -0
- package/dist/dashboard/widget-grid.module.css.d.ts +9 -0
- package/dist/data/data-table.d.ts +151 -12
- package/dist/data/data-table.d.ts.map +1 -1
- package/dist/data/data-table.js +392 -138
- package/dist/data/data-table.module.css +64 -0
- package/dist/data/data-table.module.css.d.ts +11 -0
- package/dist/data/index.d.ts +2 -2
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +24 -2
- package/dist/data/query-branch.d.ts +28 -0
- package/dist/data/query-branch.d.ts.map +1 -0
- package/dist/data/query-branch.js +10 -0
- package/dist/data/table.d.ts +2 -2
- package/dist/data/table.d.ts.map +1 -1
- package/dist/data/virtual-list.d.ts +65 -6
- package/dist/data/virtual-list.d.ts.map +1 -1
- package/dist/data/virtual-list.js +89 -38
- package/dist/data/virtual.d.ts +1 -1
- package/dist/data/virtual.d.ts.map +1 -1
- package/dist/forms/FormErrorSummary.d.ts +4 -3
- package/dist/forms/FormErrorSummary.d.ts.map +1 -1
- package/dist/forms/FormErrorSummary.js +6 -4
- package/dist/forms/create-form.d.ts +2 -2
- package/dist/forms/field.d.ts +46 -6
- package/dist/forms/field.d.ts.map +1 -1
- package/dist/forms/field.js +10 -5
- package/dist/forms/form-layout.d.ts +142 -0
- package/dist/forms/form-layout.d.ts.map +1 -0
- package/dist/forms/form-layout.js +110 -0
- package/dist/forms/form-layout.module.css +145 -0
- package/dist/forms/form-layout.module.css.d.ts +20 -0
- package/dist/forms/form-state.d.ts +42 -0
- package/dist/forms/form-state.d.ts.map +1 -0
- package/dist/forms/form-state.js +26 -0
- package/dist/forms/index.d.ts +22 -6
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +19 -3
- package/dist/forms/use-field-array.d.ts +60 -0
- package/dist/forms/use-field-array.d.ts.map +1 -0
- package/dist/forms/use-field-array.js +20 -0
- package/dist/forms/use-form-draft.d.ts +25 -10
- package/dist/forms/use-form-draft.d.ts.map +1 -1
- package/dist/forms/use-form-draft.js +55 -18
- package/dist/forms/use-form-submit.d.ts +88 -0
- package/dist/forms/use-form-submit.d.ts.map +1 -0
- package/dist/forms/use-form-submit.js +63 -0
- package/dist/guard/index.d.ts +1 -1
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +27 -11
- package/dist/index.d.ts +10 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -4
- package/dist/nav/types.d.ts +15 -6
- package/dist/nav/types.d.ts.map +1 -1
- package/dist/notifications/bell.d.ts +3 -2
- package/dist/notifications/bell.d.ts.map +1 -1
- package/dist/notifications/bell.js +73 -56
- package/dist/notifications/center.d.ts +15 -4
- package/dist/notifications/center.d.ts.map +1 -1
- package/dist/notifications/center.js +5 -2
- package/dist/notifications/define-notifications.d.ts +56 -14
- package/dist/notifications/define-notifications.d.ts.map +1 -1
- package/dist/notifications/define-notifications.js +2 -1
- package/dist/notifications/index.d.ts +6 -2
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +5 -1
- package/dist/notifications/mount-guard.d.ts +8 -0
- package/dist/notifications/mount-guard.d.ts.map +1 -0
- package/dist/notifications/mount-guard.js +19 -0
- package/dist/notifications/notify.d.ts +58 -1
- package/dist/notifications/notify.d.ts.map +1 -1
- package/dist/notifications/notify.js +46 -2
- package/dist/notifications/overlay.d.ts.map +1 -1
- package/dist/notifications/overlay.js +2 -0
- package/dist/notifications/store.d.ts +7 -0
- package/dist/notifications/store.d.ts.map +1 -1
- package/dist/provider/index.d.ts +37 -5
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +66 -28
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/lab-theme.js +2 -1
- package/dist/query/devtools.d.ts.map +1 -1
- package/dist/query/devtools.js +1 -0
- package/dist/router-tanstack/field.d.ts +1 -1
- package/dist/router-tanstack/field.d.ts.map +1 -1
- package/dist/router-tanstack/index.d.ts +1 -1
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.d.ts +4 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.js +92 -8
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +1 -1
- package/dist/section/index.d.ts +1 -1
- package/dist/section/index.d.ts.map +1 -1
- package/dist/section/section.d.ts +36 -2
- package/dist/section/section.d.ts.map +1 -1
- package/dist/section/section.js +49 -57
- package/dist/section/section.module.css +11 -0
- package/dist/shell/account-types.d.ts +5 -2
- package/dist/shell/account-types.d.ts.map +1 -1
- package/dist/shell/app-brand.d.ts +13 -0
- package/dist/shell/app-brand.d.ts.map +1 -0
- package/dist/shell/app-brand.js +94 -0
- package/dist/shell/app-brand.module.css +109 -0
- package/dist/shell/app-brand.module.css.d.ts +14 -0
- package/dist/shell/app-breadcrumbs.d.ts +4 -2
- package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
- package/dist/shell/app-breadcrumbs.js +33 -22
- package/dist/shell/app-header.module.css +10 -5
- package/dist/shell/app-main.module.css +107 -0
- package/dist/shell/app-main.module.css.d.ts +11 -0
- package/dist/shell/app-mobile-nav.d.ts +3 -2
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-mobile-nav.js +29 -15
- package/dist/shell/app-mobile-nav.module.css +48 -27
- package/dist/shell/app-mobile-nav.module.css.d.ts +0 -1
- package/dist/shell/app-sidebar-account.d.ts +2 -1
- package/dist/shell/app-sidebar-account.d.ts.map +1 -1
- package/dist/shell/app-sidebar-account.js +57 -22
- package/dist/shell/app-sidebar.d.ts +9 -3
- package/dist/shell/app-sidebar.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +55 -109
- package/dist/shell/app-sidebar.module.css +53 -96
- package/dist/shell/app-sidebar.module.css.d.ts +0 -5
- package/dist/shell/index.d.ts +14 -6
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +47 -12
- package/dist/shell/isomorphic-layout-effect.d.ts +14 -0
- package/dist/shell/isomorphic-layout-effect.d.ts.map +1 -0
- package/dist/shell/isomorphic-layout-effect.js +5 -0
- package/dist/shell/mobile-nav-model.d.ts.map +1 -1
- package/dist/shell/mobile-nav-model.js +27 -6
- package/dist/shell/nav-count-badge.d.ts +5 -3
- package/dist/shell/nav-count-badge.d.ts.map +1 -1
- package/dist/shell/nav-count-badge.js +3 -1
- package/dist/shell/page-aside.d.ts +43 -0
- package/dist/shell/page-aside.d.ts.map +1 -0
- package/dist/shell/page-aside.js +202 -0
- package/dist/shell/page-aside.module.css +174 -0
- package/dist/shell/page-aside.module.css.d.ts +14 -0
- package/dist/shell/page-bar.d.ts +55 -15
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +130 -41
- package/dist/shell/page-bar.module.css +107 -13
- package/dist/shell/page-bar.module.css.d.ts +4 -1
- package/dist/shell/sidebar-search.d.ts +4 -2
- package/dist/shell/sidebar-search.d.ts.map +1 -1
- package/dist/shell/sidebar-search.js +9 -4
- package/dist/shell/sidebar-search.module.css +1 -1
- package/dist/state/fields.d.ts +227 -34
- package/dist/state/fields.d.ts.map +1 -1
- package/dist/state/fields.js +77 -30
- 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/persisted.d.ts +12 -0
- package/dist/state/persisted.d.ts.map +1 -1
- package/dist/state/persisted.js +36 -18
- package/dist/state.d.ts +1 -1
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +2 -6
- package/dist/surfaces.d.ts +12 -11
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +43 -12
- package/dist/theme/ctl-theme.d.ts.map +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +102 -17
- package/dist/theme/nav-link.module.css +37 -26
- package/dist/theme/segmented-control.module.css +22 -0
- package/dist/theme/segmented-control.module.css.d.ts +1 -0
- package/dist/theme-lab/boot.d.ts +66 -0
- package/dist/theme-lab/boot.d.ts.map +1 -0
- package/dist/theme-lab/boot.js +82 -0
- package/dist/theme-lab/index.d.ts +4 -43
- package/dist/theme-lab/index.d.ts.map +1 -1
- package/dist/theme-lab/index.js +9 -69
- package/dist/theme-toggle/index.d.ts +3 -2
- package/dist/theme-toggle/index.d.ts.map +1 -1
- package/dist/theme-toggle/index.js +8 -2
- package/dist/tokens/index.d.ts +42 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +35 -6
- package/dist/tokens/palette.d.ts +45 -25
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +31 -14
- package/dist/tokens.css +4 -5
- package/dist/utils/is-dev.d.ts +3 -0
- package/dist/utils/is-dev.d.ts.map +1 -0
- package/dist/utils/is-dev.js +6 -0
- package/dist/widget-header/delta-badge.d.ts +7 -1
- package/dist/widget-header/delta-badge.d.ts.map +1 -1
- package/dist/widget-header/delta-badge.js +8 -1
- package/dist/widget-header/index.d.ts +2 -2
- package/dist/widget-header/index.d.ts.map +1 -1
- package/dist/widget-header/index.js +3 -1
- package/dist/widget-header/widget-header.d.ts +99 -4
- package/dist/widget-header/widget-header.d.ts.map +1 -1
- package/dist/widget-header/widget-header.js +45 -18
- package/dist/widget-header/widget-header.module.css +87 -7
- package/dist/widget-header/widget-header.module.css.d.ts +1 -0
- package/llms.txt +6 -6
- package/package.json +49 -25
- package/src/agent/coalesce.ts +2 -1
- package/src/agent/merge.ts +2 -1
- package/src/agent/part-list.tsx +2 -0
- package/src/agent/stick-to-bottom.tsx +9 -11
- package/src/agent-chat/composer.tsx +124 -103
- package/src/agent-chat/relative-time.ts +2 -1
- package/src/agent-chat/thread-detail-panel.tsx +9 -5
- package/src/agent-chat/thread-feed-row.tsx +17 -9
- package/src/agent-chat/thread-feed.tsx +9 -3
- package/src/agent-chat/thread-message.tsx +48 -13
- package/src/agent-chat/thread-outcome-card.tsx +9 -1
- package/src/agent-chat/thread-workspace.tsx +72 -33
- package/src/agent-chat/tool-chip.tsx +8 -2
- package/src/charts/hooks/useBandPlot.ts +26 -8
- package/src/charts/index.ts +39 -4
- package/src/charts/kinds/BandStrip.tsx +36 -14
- package/src/charts/kinds/Bars.tsx +67 -16
- package/src/charts/kinds/Donut.tsx +30 -3
- package/src/charts/kinds/DualPanel.tsx +56 -10
- package/src/charts/kinds/Heatmap.tsx +90 -33
- package/src/charts/kinds/MirroredBars.tsx +21 -3
- package/src/charts/kinds/MultiLine.tsx +61 -18
- package/src/charts/kinds/StackedArea.tsx +77 -6
- package/src/charts/kinds/ZonedLine.tsx +71 -31
- package/src/charts/layout/auto-margin.ts +134 -21
- package/src/charts/layout/log-ticks.ts +90 -0
- package/src/charts/primitives/Axes.tsx +33 -5
- package/src/charts/primitives/CartesianChart.tsx +194 -41
- package/src/charts/primitives/ChartCard.tsx +66 -25
- package/src/charts/primitives/ChartFrame.tsx +107 -26
- package/src/charts/primitives/ChartLegend.tsx +43 -13
- package/src/charts/primitives/ChartPending.tsx +185 -7
- package/src/charts/primitives/ChartTooltip.tsx +37 -5
- package/src/charts/primitives/Crosshair.tsx +6 -3
- package/src/charts/primitives/chart-frame-layout.ts +212 -0
- package/src/charts/primitives/chart-tier.tsx +37 -0
- package/src/charts/series.ts +77 -1
- package/src/charts/sparklines/BarSparkline.tsx +11 -3
- package/src/charts/sparklines/LineSparkline.tsx +18 -4
- package/src/charts/sparklines/index.ts +2 -2
- package/src/charts/utils/format.ts +163 -2
- package/src/charts/utils/ticks.ts +149 -4
- package/src/cli/index.ts +8 -3
- package/src/commands/ShortcutsHelp.tsx +10 -3
- package/src/commands/define-commands.ts +2 -2
- package/src/commands/define-overlays.ts +216 -1
- package/src/commands/index.ts +12 -0
- package/src/commands/overlays-mount.tsx +60 -26
- package/src/common/errors.ts +73 -0
- package/src/common/index.ts +21 -0
- package/src/common/props.ts +71 -0
- package/src/common/query-state-like.ts +64 -0
- package/src/common/refs.ts +58 -0
- package/src/common/scroll-parent.ts +42 -0
- package/src/common/validate.ts +94 -0
- package/src/connectivity/connectivity-indicator.tsx +6 -1
- package/src/connectivity/connectivity-provider.tsx +4 -1
- package/src/connectivity/index.ts +1 -0
- package/src/connectivity/types.ts +5 -2
- package/src/connectivity/use-connectivity.ts +3 -2
- package/src/content/article-layout.module.css +11 -4
- package/src/content/callout.tsx +13 -7
- package/src/content/guide.tsx +14 -4
- package/src/content/heading-anchor.tsx +14 -3
- package/src/content/index.ts +2 -0
- package/src/content/markdown.tsx +2 -0
- package/src/content/prose.module.css +9 -7
- package/src/content/reading-progress.tsx +40 -15
- package/src/content/slug.ts +4 -0
- package/src/content/toc.tsx +47 -10
- package/src/controls/actions.tsx +89 -9
- package/src/controls/compare-filter.tsx +20 -3
- package/src/controls/control-group.tsx +11 -4
- package/src/controls/controls.module.css +169 -186
- package/src/controls/controls.module.css.d.ts +9 -11
- package/src/controls/enum-filter.tsx +46 -19
- package/src/controls/filter-context.tsx +21 -8
- 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 +8 -0
- package/src/controls/multi-select-filter.tsx +179 -29
- package/src/controls/number-filter.tsx +329 -0
- 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 +133 -43
- package/src/controls/search-filter.tsx +31 -13
- 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 +37 -17
- package/src/controls/view-tabs.tsx +63 -11
- package/src/controls-dates/date-range-picker.tsx +8 -1
- package/src/dashboard/delta-badge.tsx +5 -1
- package/src/dashboard/empty-state.tsx +72 -25
- package/src/dashboard/index.ts +19 -2
- package/src/dashboard/query-state.tsx +154 -84
- package/src/dashboard/settings-section.tsx +87 -31
- package/src/dashboard/stat-card.module.css +112 -26
- package/src/dashboard/stat-card.module.css.d.ts +5 -0
- package/src/dashboard/stat-card.tsx +207 -68
- package/src/dashboard/stat-group.module.css +66 -0
- package/src/dashboard/stat-group.module.css.d.ts +8 -0
- package/src/dashboard/stat-group.tsx +74 -0
- package/src/dashboard/widget-grid.module.css +53 -0
- package/src/dashboard/widget-grid.module.css.d.ts +9 -0
- package/src/dashboard/widget-grid.tsx +127 -0
- package/src/data/data-table.module.css +64 -0
- package/src/data/data-table.module.css.d.ts +11 -0
- package/src/data/data-table.tsx +927 -346
- package/src/data/index.ts +30 -2
- package/src/data/query-branch.ts +53 -0
- package/src/data/table.ts +5 -0
- package/src/data/virtual-list.tsx +189 -55
- package/src/data/virtual.ts +5 -1
- package/src/forms/FormErrorSummary.tsx +13 -6
- package/src/forms/create-form.ts +2 -2
- package/src/forms/field.ts +60 -11
- package/src/forms/form-layout.module.css +145 -0
- package/src/forms/form-layout.module.css.d.ts +20 -0
- package/src/forms/form-layout.tsx +305 -0
- package/src/forms/form-state.tsx +94 -0
- package/src/forms/index.ts +38 -7
- package/src/forms/use-field-array.ts +94 -0
- package/src/forms/use-form-draft.ts +145 -53
- package/src/forms/use-form-submit.ts +199 -0
- package/src/guard/index.ts +91 -23
- package/src/index.ts +79 -10
- package/src/nav/types.ts +15 -6
- package/src/notifications/bell.tsx +18 -4
- package/src/notifications/center.tsx +18 -5
- package/src/notifications/define-notifications.ts +64 -18
- package/src/notifications/index.ts +12 -1
- package/src/notifications/mount-guard.ts +41 -0
- package/src/notifications/notify.tsx +122 -3
- package/src/notifications/overlay.tsx +2 -0
- package/src/notifications/store.ts +7 -0
- package/src/provider/index.tsx +101 -13
- package/src/provider/lab-theme.ts +2 -1
- package/src/query/devtools.tsx +1 -0
- package/src/router-tanstack/field.ts +5 -0
- package/src/router-tanstack/index.ts +4 -0
- package/src/router-tanstack/search-store.ts +171 -12
- package/src/router-tanstack/use-nav.ts +18 -13
- package/src/section/index.ts +1 -1
- package/src/section/section.module.css +11 -0
- package/src/section/section.tsx +163 -96
- package/src/shell/account-types.ts +5 -2
- package/src/shell/app-brand.module.css +109 -0
- package/src/shell/app-brand.module.css.d.ts +14 -0
- package/src/shell/app-brand.tsx +140 -0
- package/src/shell/app-breadcrumbs.tsx +19 -9
- package/src/shell/app-header.module.css +10 -5
- package/src/shell/app-main.module.css +107 -0
- package/src/shell/app-main.module.css.d.ts +11 -0
- package/src/shell/app-mobile-nav.module.css +48 -27
- package/src/shell/app-mobile-nav.module.css.d.ts +0 -1
- package/src/shell/app-mobile-nav.tsx +43 -11
- package/src/shell/app-sidebar-account.tsx +29 -6
- package/src/shell/app-sidebar.module.css +53 -96
- package/src/shell/app-sidebar.module.css.d.ts +0 -5
- package/src/shell/app-sidebar.tsx +40 -113
- package/src/shell/index.tsx +156 -65
- package/src/shell/isomorphic-layout-effect.ts +14 -0
- package/src/shell/mobile-nav-model.ts +66 -10
- package/src/shell/nav-count-badge.tsx +6 -1
- package/src/shell/page-aside.module.css +174 -0
- package/src/shell/page-aside.module.css.d.ts +14 -0
- package/src/shell/page-aside.tsx +377 -0
- package/src/shell/page-bar.module.css +107 -13
- package/src/shell/page-bar.module.css.d.ts +4 -1
- package/src/shell/page-bar.tsx +294 -94
- package/src/shell/sidebar-search.module.css +1 -1
- package/src/shell/sidebar-search.tsx +13 -4
- package/src/state/fields.ts +360 -69
- package/src/state/persisted-or-local.ts +50 -0
- package/src/state/persisted.ts +76 -26
- package/src/state.ts +4 -7
- package/src/surfaces.ts +43 -12
- package/src/theme/ctl-theme.tsx +10 -0
- package/src/theme/index.ts +129 -16
- package/src/theme/nav-link.module.css +37 -26
- package/src/theme/segmented-control.module.css +22 -0
- package/src/theme/segmented-control.module.css.d.ts +1 -0
- package/src/theme-lab/boot.ts +140 -0
- package/src/theme-lab/index.tsx +21 -112
- package/src/theme-toggle/index.tsx +10 -3
- package/src/tokens/index.ts +50 -6
- package/src/tokens/palette.ts +58 -30
- package/src/utils/is-dev.ts +4 -0
- package/src/widget-header/delta-badge.tsx +25 -5
- package/src/widget-header/index.ts +10 -2
- package/src/widget-header/widget-header.module.css +87 -7
- package/src/widget-header/widget-header.module.css.d.ts +1 -0
- package/src/widget-header/widget-header.tsx +166 -42
- package/dist/agent/adapter.test.d.ts +0 -2
- package/dist/agent/adapter.test.d.ts.map +0 -1
- package/dist/agent/ai-sdk-transport.test.d.ts +0 -2
- package/dist/agent/ai-sdk-transport.test.d.ts.map +0 -1
- package/dist/agent/coalesce.test.d.ts +0 -2
- package/dist/agent/coalesce.test.d.ts.map +0 -1
- package/dist/agent/foreign.test.d.ts +0 -2
- package/dist/agent/foreign.test.d.ts.map +0 -1
- package/dist/agent/id.test.d.ts +0 -2
- package/dist/agent/id.test.d.ts.map +0 -1
- package/dist/agent/merge.test.d.ts +0 -2
- package/dist/agent/merge.test.d.ts.map +0 -1
- package/dist/agent/part-list.test.d.ts +0 -2
- package/dist/agent/part-list.test.d.ts.map +0 -1
- package/dist/agent/parts.test.d.ts +0 -2
- package/dist/agent/parts.test.d.ts.map +0 -1
- package/dist/agent/thread.test.d.ts +0 -2
- package/dist/agent/thread.test.d.ts.map +0 -1
- package/dist/agent/transport.test.d.ts +0 -2
- package/dist/agent/transport.test.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.test.d.ts +0 -2
- package/dist/agent/use-agent-stream.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts.map +0 -1
- package/dist/agent-chat/composer.test.d.ts +0 -2
- package/dist/agent-chat/composer.test.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.test.d.ts +0 -2
- package/dist/agent-chat/relative-time.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed-row.test.d.ts +0 -2
- package/dist/agent-chat/thread-feed-row.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.test.d.ts +0 -2
- package/dist/agent-chat/thread-feed.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.test.d.ts +0 -2
- package/dist/agent-chat/thread-message.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.test.d.ts +0 -2
- package/dist/agent-chat/thread-workspace.test.d.ts.map +0 -1
- package/dist/agent-chat/tool-chip.test.d.ts +0 -2
- package/dist/agent-chat/tool-chip.test.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.type-guard.test.d.ts +0 -2
- package/dist/agent-chat/virtualize.type-guard.test.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.test.d.ts +0 -2
- package/dist/charts/cursor/resolve.test.d.ts.map +0 -1
- package/dist/charts/cursor/store.test.d.ts +0 -2
- package/dist/charts/cursor/store.test.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.test.d.ts +0 -2
- package/dist/charts/kinds/BandStrip.test.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.test.d.ts +0 -2
- package/dist/charts/kinds/Bars.test.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.test.d.ts +0 -2
- package/dist/charts/kinds/DualPanel.test.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.test.d.ts +0 -2
- package/dist/charts/kinds/MirroredBars.test.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.test.d.ts +0 -2
- package/dist/charts/kinds/MultiLine.test.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.test.d.ts +0 -2
- package/dist/charts/kinds/StackedArea.test.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.test.d.ts +0 -2
- package/dist/charts/kinds/ZonedLine.test.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.test.d.ts +0 -2
- package/dist/charts/layout/auto-margin.test.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.test.d.ts +0 -2
- package/dist/charts/primitives/CartesianChart.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.test.d.ts +0 -2
- package/dist/charts/primitives/ChartCard.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.test.d.ts +0 -2
- package/dist/charts/primitives/ChartFrame.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.test.d.ts +0 -2
- package/dist/charts/primitives/ChartLegend.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.test.d.ts +0 -2
- package/dist/charts/primitives/ChartTooltip.test.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.test.d.ts +0 -2
- package/dist/charts/primitives/XZoneRects.test.d.ts.map +0 -1
- package/dist/charts/series.test.d.ts +0 -2
- package/dist/charts/series.test.d.ts.map +0 -1
- package/dist/charts/utils/domain.test.d.ts +0 -2
- package/dist/charts/utils/domain.test.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.test.d.ts +0 -2
- package/dist/charts/utils/measure-text.test.d.ts.map +0 -1
- package/dist/cli/check-coverage.test.d.ts +0 -2
- package/dist/cli/check-coverage.test.d.ts.map +0 -1
- package/dist/cli/check-theme.test.d.ts +0 -2
- package/dist/cli/check-theme.test.d.ts.map +0 -1
- package/dist/cli/help.test.d.ts +0 -2
- package/dist/cli/help.test.d.ts.map +0 -1
- package/dist/cli/init-sync.test.d.ts +0 -2
- package/dist/cli/init-sync.test.d.ts.map +0 -1
- package/dist/cli/placement-engine.test.d.ts +0 -2
- package/dist/cli/placement-engine.test.d.ts.map +0 -1
- package/dist/cli/shipped-versions.test.d.ts +0 -2
- package/dist/cli/shipped-versions.test.d.ts.map +0 -1
- package/dist/cli/tarball-parity.test.d.ts +0 -2
- package/dist/cli/tarball-parity.test.d.ts.map +0 -1
- package/dist/cli/template-format.test.d.ts +0 -2
- package/dist/cli/template-format.test.d.ts.map +0 -1
- package/dist/cli/template-ledger.test.d.ts +0 -2
- package/dist/cli/template-ledger.test.d.ts.map +0 -1
- package/dist/cli/tokens-css.test.d.ts +0 -2
- package/dist/cli/tokens-css.test.d.ts.map +0 -1
- package/dist/cli/toolchain-wiring.test.d.ts +0 -2
- package/dist/cli/toolchain-wiring.test.d.ts.map +0 -1
- package/dist/cli/waiver-audit.test.d.ts +0 -2
- package/dist/cli/waiver-audit.test.d.ts.map +0 -1
- package/dist/content/article-actions.test.d.ts +0 -2
- package/dist/content/article-actions.test.d.ts.map +0 -1
- package/dist/content/article-model.test.d.ts +0 -2
- package/dist/content/article-model.test.d.ts.map +0 -1
- package/dist/content/block-split.test.d.ts +0 -2
- package/dist/content/block-split.test.d.ts.map +0 -1
- package/dist/content/heading-components.test.d.ts +0 -2
- package/dist/content/heading-components.test.d.ts.map +0 -1
- package/dist/content/markdown.test.d.ts +0 -2
- package/dist/content/markdown.test.d.ts.map +0 -1
- package/dist/content/prose.module.css.test.d.ts +0 -2
- package/dist/content/prose.module.css.test.d.ts.map +0 -1
- package/dist/content/sanitize.test.d.ts +0 -2
- package/dist/content/sanitize.test.d.ts.map +0 -1
- package/dist/content/slug.test.d.ts +0 -2
- package/dist/content/slug.test.d.ts.map +0 -1
- package/dist/controls/actions.test.d.ts +0 -2
- package/dist/controls/actions.test.d.ts.map +0 -1
- package/dist/controls/actions.type-guard.test.d.ts +0 -2
- package/dist/controls/actions.type-guard.test.d.ts.map +0 -1
- package/dist/controls/control-group.test.d.ts +0 -2
- package/dist/controls/control-group.test.d.ts.map +0 -1
- package/dist/controls/controls.router.test.d.ts +0 -2
- package/dist/controls/controls.router.test.d.ts.map +0 -1
- package/dist/controls/filter-set.test.d.ts +0 -2
- package/dist/controls/filter-set.test.d.ts.map +0 -1
- package/dist/controls/peer-boundary.test.d.ts +0 -2
- package/dist/controls/peer-boundary.test.d.ts.map +0 -1
- package/dist/controls/props-contract.test.d.ts +0 -2
- package/dist/controls/props-contract.test.d.ts.map +0 -1
- package/dist/controls/sync-button.test.d.ts +0 -2
- package/dist/controls/sync-button.test.d.ts.map +0 -1
- package/dist/dashboard/query-state.test.d.ts +0 -2
- package/dist/dashboard/query-state.test.d.ts.map +0 -1
- package/dist/dashboard/settings-section.test.d.ts +0 -2
- package/dist/dashboard/settings-section.test.d.ts.map +0 -1
- package/dist/dashboard/stat-card.test.d.ts +0 -2
- package/dist/dashboard/stat-card.test.d.ts.map +0 -1
- package/dist/data/data-table.test.d.ts +0 -2
- package/dist/data/data-table.test.d.ts.map +0 -1
- package/dist/guard/check-source.test.d.ts +0 -2
- package/dist/guard/check-source.test.d.ts.map +0 -1
- package/dist/guard/grace.test.d.ts +0 -20
- package/dist/guard/grace.test.d.ts.map +0 -1
- package/dist/guard/guard-hook.test.d.ts +0 -2
- package/dist/guard/guard-hook.test.d.ts.map +0 -1
- package/dist/provider/index.test.d.ts +0 -2
- package/dist/provider/index.test.d.ts.map +0 -1
- package/dist/provider/lab-theme.test.d.ts +0 -2
- package/dist/provider/lab-theme.test.d.ts.map +0 -1
- package/dist/query/error-message.test.d.ts +0 -2
- package/dist/query/error-message.test.d.ts.map +0 -1
- package/dist/router-tanstack/multi-search-param-store.test.d.ts +0 -2
- package/dist/router-tanstack/multi-search-param-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/nav.test.d.ts +0 -2
- package/dist/router-tanstack/nav.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-param-store.test.d.ts +0 -2
- package/dist/router-tanstack/search-param-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-store.router.test.d.ts +0 -2
- package/dist/router-tanstack/search-store.router.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-store.test.d.ts +0 -2
- package/dist/router-tanstack/search-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/use-nav.test.d.ts +0 -2
- package/dist/router-tanstack/use-nav.test.d.ts.map +0 -1
- package/dist/section/section.test.d.ts +0 -2
- package/dist/section/section.test.d.ts.map +0 -1
- package/dist/shell/app-mobile-nav.test.d.ts +0 -2
- package/dist/shell/app-mobile-nav.test.d.ts.map +0 -1
- package/dist/shell/app-sidebar.test.d.ts +0 -2
- package/dist/shell/app-sidebar.test.d.ts.map +0 -1
- package/dist/shell/index.test.d.ts +0 -2
- package/dist/shell/index.test.d.ts.map +0 -1
- package/dist/shell/mobile-nav-model.test.d.ts +0 -2
- package/dist/shell/mobile-nav-model.test.d.ts.map +0 -1
- package/dist/shell/page-bar.test.d.ts +0 -2
- package/dist/shell/page-bar.test.d.ts.map +0 -1
- package/dist/state/fields.test.d.ts +0 -2
- package/dist/state/fields.test.d.ts.map +0 -1
- package/dist/styles.floor.test.d.ts +0 -2
- package/dist/styles.floor.test.d.ts.map +0 -1
- package/dist/theme/border-coverage.test.d.ts +0 -18
- package/dist/theme/border-coverage.test.d.ts.map +0 -1
- package/dist/theme/contrast.test.d.ts +0 -2
- package/dist/theme/contrast.test.d.ts.map +0 -1
- package/dist/theme/ctl-theme.test.d.ts +0 -2
- package/dist/theme/ctl-theme.test.d.ts.map +0 -1
- package/dist/theme/ctl-tier-coverage.test.d.ts +0 -2
- package/dist/theme/ctl-tier-coverage.test.d.ts.map +0 -1
- package/dist/theme/density-option.test.d.ts +0 -2
- package/dist/theme/density-option.test.d.ts.map +0 -1
- package/dist/theme/density-relations.test.d.ts +0 -2
- package/dist/theme/density-relations.test.d.ts.map +0 -1
- package/dist/theme/derive-theme.test.d.ts +0 -2
- package/dist/theme/derive-theme.test.d.ts.map +0 -1
- package/dist/theme/divider-law.test.d.ts +0 -2
- package/dist/theme/divider-law.test.d.ts.map +0 -1
- package/dist/theme/fonts-option.test.d.ts +0 -2
- package/dist/theme/fonts-option.test.d.ts.map +0 -1
- package/dist/theme/icon-slot.test.d.ts +0 -2
- package/dist/theme/icon-slot.test.d.ts.map +0 -1
- package/dist/theme/layout-rhythm-css.test.d.ts +0 -2
- package/dist/theme/layout-rhythm-css.test.d.ts.map +0 -1
- package/dist/theme/radius-option.test.d.ts +0 -2
- package/dist/theme/radius-option.test.d.ts.map +0 -1
- package/dist/theme/radius.test.d.ts +0 -2
- package/dist/theme/radius.test.d.ts.map +0 -1
- package/dist/theme/shadow-surfaces.test.d.ts +0 -26
- package/dist/theme/shadow-surfaces.test.d.ts.map +0 -1
- package/dist/theme/spacing.test.d.ts +0 -2
- package/dist/theme/spacing.test.d.ts.map +0 -1
- package/dist/theme/use-basalt-spacing.test.d.ts +0 -2
- package/dist/theme/use-basalt-spacing.test.d.ts.map +0 -1
- package/dist/theme-lab/derive-controls.test.d.ts +0 -2
- package/dist/theme-lab/derive-controls.test.d.ts.map +0 -1
- package/dist/theme-lab/derive-state.test.d.ts +0 -2
- package/dist/theme-lab/derive-state.test.d.ts.map +0 -1
- package/dist/theme-lab/theme-lab.test.d.ts +0 -2
- package/dist/theme-lab/theme-lab.test.d.ts.map +0 -1
- package/dist/tokens/build-fonts-css.test.d.ts +0 -2
- package/dist/tokens/build-fonts-css.test.d.ts.map +0 -1
- package/dist/tokens/build-radius-css.test.d.ts +0 -2
- package/dist/tokens/build-radius-css.test.d.ts.map +0 -1
- package/dist/tokens/chart-margin.test.d.ts +0 -2
- package/dist/tokens/chart-margin.test.d.ts.map +0 -1
- package/dist/tokens/density.test.d.ts +0 -2
- package/dist/tokens/density.test.d.ts.map +0 -1
- package/dist/tokens/derive-radius.test.d.ts +0 -2
- package/dist/tokens/derive-radius.test.d.ts.map +0 -1
- package/dist/tokens/derive.test.d.ts +0 -2
- package/dist/tokens/derive.test.d.ts.map +0 -1
- package/dist/tokens/palette.test.d.ts +0 -2
- package/dist/tokens/palette.test.d.ts.map +0 -1
- package/dist/tokens/text-scale.test.d.ts +0 -2
- package/dist/tokens/text-scale.test.d.ts.map +0 -1
- package/dist/vite-color-mix.test.d.ts +0 -2
- package/dist/vite-color-mix.test.d.ts.map +0 -1
- package/dist/vite.test.d.ts +0 -2
- package/dist/vite.test.d.ts.map +0 -1
- package/dist/widget-header/delta-badge.test.d.ts +0 -2
- package/dist/widget-header/delta-badge.test.d.ts.map +0 -1
- package/dist/widget-header/no-mantine.test.d.ts +0 -2
- package/dist/widget-header/no-mantine.test.d.ts.map +0 -1
- package/dist/widget-header/widget-header.test.d.ts +0 -2
- package/dist/widget-header/widget-header.test.d.ts.map +0 -1
- package/src/agent/adapter.test.ts +0 -1640
- package/src/agent/ai-sdk-transport.test.ts +0 -658
- package/src/agent/coalesce.test.ts +0 -387
- package/src/agent/foreign.test.ts +0 -51
- package/src/agent/id.test.ts +0 -169
- package/src/agent/merge.test.ts +0 -206
- package/src/agent/part-list.test.tsx +0 -112
- package/src/agent/parts.test.ts +0 -720
- package/src/agent/thread.test.ts +0 -220
- package/src/agent/transport.test.ts +0 -70
- package/src/agent/use-agent-stream.test.tsx +0 -287
- package/src/agent/use-agent-thread-runs.foreign.test.tsx +0 -138
- package/src/agent/use-agent-thread-runs.resume.test.tsx +0 -294
- package/src/agent/use-agent-thread-runs.test.tsx +0 -1120
- package/src/agent/use-agent-thread-runs.wedge.test.tsx +0 -387
- package/src/agent-chat/composer.test.tsx +0 -924
- package/src/agent-chat/relative-time.test.ts +0 -95
- package/src/agent-chat/thread-feed-row.test.tsx +0 -510
- package/src/agent-chat/thread-feed.test.tsx +0 -241
- package/src/agent-chat/thread-message.test.tsx +0 -1285
- package/src/agent-chat/thread-workspace.test.tsx +0 -169
- package/src/agent-chat/tool-chip.test.tsx +0 -139
- package/src/agent-chat/virtualize.type-guard.test.ts +0 -49
- package/src/charts/cursor/resolve.test.ts +0 -151
- package/src/charts/cursor/store.test.ts +0 -64
- package/src/charts/kinds/BandStrip.test.tsx +0 -282
- package/src/charts/kinds/Bars.test.tsx +0 -183
- package/src/charts/kinds/DualPanel.test.tsx +0 -527
- package/src/charts/kinds/MirroredBars.test.tsx +0 -232
- package/src/charts/kinds/MultiLine.test.tsx +0 -218
- package/src/charts/kinds/StackedArea.test.tsx +0 -114
- package/src/charts/kinds/ZonedLine.test.tsx +0 -147
- package/src/charts/layout/auto-margin.test.ts +0 -42
- package/src/charts/primitives/CartesianChart.test.tsx +0 -647
- package/src/charts/primitives/ChartCard.test.tsx +0 -66
- package/src/charts/primitives/ChartFrame.test.tsx +0 -142
- package/src/charts/primitives/ChartLegend.test.tsx +0 -78
- package/src/charts/primitives/ChartTooltip.test.tsx +0 -44
- package/src/charts/primitives/XZoneRects.test.tsx +0 -123
- package/src/charts/series.test.ts +0 -112
- package/src/charts/utils/domain.test.ts +0 -54
- package/src/charts/utils/measure-text.test.ts +0 -36
- package/src/cli/check-coverage.test.ts +0 -297
- package/src/cli/check-theme.test.ts +0 -837
- package/src/cli/help.test.ts +0 -170
- package/src/cli/init-sync.test.ts +0 -343
- package/src/cli/placement-engine.test.ts +0 -298
- package/src/cli/shipped-versions.test.ts +0 -83
- package/src/cli/tarball-parity.test.ts +0 -44
- package/src/cli/template-format.test.ts +0 -64
- package/src/cli/template-ledger.test.ts +0 -219
- package/src/cli/tokens-css.test.ts +0 -249
- package/src/cli/toolchain-wiring.test.ts +0 -1358
- package/src/cli/waiver-audit.test.ts +0 -215
- package/src/content/article-actions.test.ts +0 -78
- package/src/content/article-model.test.ts +0 -119
- package/src/content/block-split.test.ts +0 -75
- package/src/content/heading-components.test.tsx +0 -65
- package/src/content/markdown.test.tsx +0 -603
- package/src/content/prose.module.css.test.ts +0 -39
- package/src/content/sanitize.test.ts +0 -659
- package/src/content/slug.test.ts +0 -62
- package/src/controls/actions.test.tsx +0 -252
- package/src/controls/actions.type-guard.test.ts +0 -63
- package/src/controls/control-group.test.tsx +0 -229
- package/src/controls/controls.router.test.tsx +0 -637
- 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 -106
- 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 -154
- package/src/data/data-table.test.tsx +0 -434
- package/src/guard/check-source.test.ts +0 -3355
- package/src/guard/grace.test.ts +0 -149
- package/src/guard/guard-hook.test.ts +0 -203
- package/src/provider/index.test.tsx +0 -101
- package/src/provider/lab-theme.test.ts +0 -147
- package/src/query/error-message.test.ts +0 -67
- package/src/router-tanstack/multi-search-param-store.test.ts +0 -124
- package/src/router-tanstack/nav.test.ts +0 -111
- package/src/router-tanstack/search-param-store.test.ts +0 -135
- package/src/router-tanstack/search-store.router.test.tsx +0 -661
- package/src/router-tanstack/search-store.test.ts +0 -418
- package/src/router-tanstack/use-nav.test.tsx +0 -187
- package/src/section/section.test.tsx +0 -204
- package/src/shell/app-mobile-nav.test.tsx +0 -403
- package/src/shell/app-sidebar.test.tsx +0 -509
- package/src/shell/index.test.tsx +0 -428
- package/src/shell/mobile-nav-model.test.ts +0 -517
- package/src/shell/page-bar.test.tsx +0 -316
- package/src/state/fields.test.tsx +0 -258
- package/src/styles.floor.test.ts +0 -36
- package/src/theme/border-coverage.test.ts +0 -272
- package/src/theme/contrast.test.ts +0 -354
- package/src/theme/ctl-theme.test.tsx +0 -275
- package/src/theme/ctl-tier-coverage.test.ts +0 -170
- package/src/theme/density-option.test.ts +0 -96
- package/src/theme/density-relations.test.ts +0 -506
- package/src/theme/derive-theme.test.ts +0 -101
- package/src/theme/divider-law.test.ts +0 -259
- package/src/theme/fonts-option.test.ts +0 -75
- package/src/theme/icon-slot.test.tsx +0 -275
- package/src/theme/layout-rhythm-css.test.ts +0 -72
- package/src/theme/radius-option.test.ts +0 -86
- package/src/theme/radius.test.ts +0 -142
- package/src/theme/shadow-surfaces.test.ts +0 -488
- package/src/theme/spacing.test.ts +0 -495
- package/src/theme/use-basalt-spacing.test.tsx +0 -55
- package/src/theme-lab/derive-controls.test.ts +0 -94
- package/src/theme-lab/derive-state.test.ts +0 -71
- package/src/theme-lab/theme-lab.test.ts +0 -46
- package/src/tokens/build-fonts-css.test.ts +0 -52
- package/src/tokens/build-radius-css.test.ts +0 -25
- package/src/tokens/chart-margin.test.ts +0 -39
- package/src/tokens/density.test.ts +0 -259
- package/src/tokens/derive-radius.test.ts +0 -62
- package/src/tokens/derive.test.ts +0 -30
- package/src/tokens/palette.test.ts +0 -114
- package/src/tokens/text-scale.test.ts +0 -51
- package/src/vite-color-mix.test.ts +0 -46
- package/src/vite.test.ts +0 -423
- package/src/widget-header/delta-badge.test.tsx +0 -60
- package/src/widget-header/no-mantine.test.ts +0 -33
- package/src/widget-header/widget-header.test.tsx +0 -187
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `toDeriveOverride` — the store-to-override projection BOTH halves of the theme lab go through (the
|
|
3
|
-
* `<style>` injection in `derive-controls.tsx` and the theme rebuild in `../provider/lab-theme.ts`).
|
|
4
|
-
*
|
|
5
|
-
* Worth its own file because `lab-theme.test.ts` builds a `DeriveOverride` by hand (its `at()`
|
|
6
|
-
* helper) and never calls this function, so nothing there would catch either of its two jobs
|
|
7
|
-
* regressing:
|
|
8
|
-
*
|
|
9
|
-
* 1. `applied: false` → `null`. This is the gate the whole "production path is untouched" claim rests
|
|
10
|
-
* on — every app that never mounts the panel reads `DEFAULT_STATE`, whose `applied` is false.
|
|
11
|
-
* 2. The config carries EXACTLY the six color knobs. `resolveDeriveConfig` is a plain spread, so the
|
|
12
|
-
* obvious simplification — handing it the whole persisted state — would silently carry
|
|
13
|
-
* `applied`/`radius`/`density` into the config, and from there onto `theme.other.basaltDerive`
|
|
14
|
-
* (read by `BasaltBridge`) and into `buildPaletteData`'s memo key. It would not throw and nothing
|
|
15
|
-
* else in the suite would notice.
|
|
16
|
-
*
|
|
17
|
-
* The persisted-envelope validator is tested separately, in `derive-controls.test.ts`.
|
|
18
|
-
*/
|
|
19
|
-
import { describe, expect, test } from 'bun:test'
|
|
20
|
-
import { DEFAULT_STATE, toDeriveOverride } from './derive-state'
|
|
21
|
-
import { DEFAULT_DERIVE_CONFIG } from '../tokens/derive'
|
|
22
|
-
|
|
23
|
-
describe('the applied gate', () => {
|
|
24
|
-
test('DEFAULT_STATE (applied: false) yields no override — the production path', () => {
|
|
25
|
-
expect(toDeriveOverride(DEFAULT_STATE)).toBeNull()
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
test('a fully tuned state with applied: false still yields no override', () => {
|
|
29
|
-
const tuned = { ...DEFAULT_STATE, accent: '#ff0000', radius: -3, density: 2, applied: false }
|
|
30
|
-
expect(toDeriveOverride(tuned)).toBeNull()
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
test('applied: true yields an override carrying both levels verbatim', () => {
|
|
34
|
-
const override = toDeriveOverride({ ...DEFAULT_STATE, applied: true, radius: -2, density: 3 })
|
|
35
|
-
expect(override).not.toBeNull()
|
|
36
|
-
expect(override?.radiusLevel).toBe(-2)
|
|
37
|
-
expect(override?.densityLevel).toBe(3)
|
|
38
|
-
})
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
describe('the resolved config carries exactly the six derive knobs', () => {
|
|
42
|
-
const override = toDeriveOverride({
|
|
43
|
-
...DEFAULT_STATE,
|
|
44
|
-
applied: true,
|
|
45
|
-
accent: '#ff0000',
|
|
46
|
-
neutral: 'stone',
|
|
47
|
-
radius: -2,
|
|
48
|
-
density: 1,
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
test('no state-only key leaks into the config', () => {
|
|
52
|
-
// Keyed off `DEFAULT_DERIVE_CONFIG` rather than an exported key list: adding a seventh knob to
|
|
53
|
-
// the config should extend this assertion automatically, not silently pass a stale list.
|
|
54
|
-
expect(Object.keys(override?.config ?? {}).sort()).toEqual(
|
|
55
|
-
Object.keys(DEFAULT_DERIVE_CONFIG).sort(),
|
|
56
|
-
)
|
|
57
|
-
expect(override?.config).not.toHaveProperty('applied')
|
|
58
|
-
expect(override?.config).not.toHaveProperty('radius')
|
|
59
|
-
expect(override?.config).not.toHaveProperty('density')
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
test('the tuned knobs are carried through', () => {
|
|
63
|
-
expect(override?.config.accent).toBe('#ff0000')
|
|
64
|
-
expect(override?.config.neutral).toBe('stone')
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
test('untouched knobs fall back to the shipped default per-knob', () => {
|
|
68
|
-
expect(override?.config.lightLevel).toBe(DEFAULT_DERIVE_CONFIG.lightLevel)
|
|
69
|
-
expect(override?.config.vibrancy).toBe(DEFAULT_DERIVE_CONFIG.vibrancy)
|
|
70
|
-
})
|
|
71
|
-
})
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The theme-lab wiring gate.
|
|
3
|
-
*
|
|
4
|
-
* The lab is a list of `--vx-*` var names it writes onto `<html>`. Nothing structurally connects
|
|
5
|
-
* that list to the vars the palette actually EMITS, or to the chrome that reads them — so it can
|
|
6
|
-
* drift silently into tuning dead variables, or into tuning live ones that no component consumes.
|
|
7
|
-
* Both failure modes look identical to the user: "the theme lab does nothing".
|
|
8
|
-
*
|
|
9
|
-
* `COLOR_GROUPS` is now a structural-token inspector ONLY (identity/color tuning moved to
|
|
10
|
-
* `DeriveControls`) — this test ties the remaining vars to `buildPaletteCss`'s actual output, so a
|
|
11
|
-
* var in `COLOR_GROUPS` that is secretly DERIVED (and would drift the moment the derive config
|
|
12
|
-
* changes) never sneaks back in undetected.
|
|
13
|
-
*/
|
|
14
|
-
import { describe, expect, test } from 'bun:test'
|
|
15
|
-
import { buildPaletteCss } from '../tokens'
|
|
16
|
-
import { AREA_BOTTOM_VAR, AREA_TOP_VAR, COLOR_GROUPS } from './index'
|
|
17
|
-
|
|
18
|
-
const css = buildPaletteCss()
|
|
19
|
-
const TUNABLES = COLOR_GROUPS.flatMap((g) => g.items.map((i) => i.var))
|
|
20
|
-
|
|
21
|
-
describe('every tunable var is really emitted by the palette', () => {
|
|
22
|
-
// A var in COLOR_GROUPS that buildPaletteCss never declares is a dead knob: the ColorInput shows
|
|
23
|
-
// an empty swatch and writing it changes nothing.
|
|
24
|
-
for (const name of [...TUNABLES, AREA_TOP_VAR, AREA_BOTTOM_VAR]) {
|
|
25
|
-
test(name, () => {
|
|
26
|
-
expect(css).toContain(`${name}:`)
|
|
27
|
-
})
|
|
28
|
-
}
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
describe('tunables are OPAQUE — ColorInput (format="hex") has no alpha channel', () => {
|
|
32
|
-
// A translucent token (`--vx-divider`, `--vx-grid`, `--vx-good`: `color-mix(… , transparent)`)
|
|
33
|
-
// would be silently flattened to a solid color on first edit. Opaque `color-mix()`es are fine —
|
|
34
|
-
// `readVar` resolves them through a probe element, so they display and edit correctly.
|
|
35
|
-
for (const name of TUNABLES) {
|
|
36
|
-
test(name, () => {
|
|
37
|
-
const declaration = css.match(new RegExp(`${name}:\\s*([^;]+);`))?.[1]?.trim() ?? ''
|
|
38
|
-
expect(declaration).not.toContain('transparent')
|
|
39
|
-
expect(declaration).not.toMatch(/^rgba\(/)
|
|
40
|
-
})
|
|
41
|
-
}
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
test('no duplicate tunables across groups', () => {
|
|
45
|
-
expect(new Set(TUNABLES).size).toBe(TUNABLES.length)
|
|
46
|
-
})
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `buildFontsCss` — the pure CSS-building half of the `{ fonts }` option (see
|
|
3
|
-
* `../theme/fonts-option.test.ts` for the `theme.other.basaltFonts` round-trip this consumes).
|
|
4
|
-
* `BasaltBridge` calls this directly to append `--basalt-font-*` declarations to the same injected
|
|
5
|
-
* `<style>` as the palette CSS. A DOM harness now exists (`tests/setup/dom.ts`, preloaded via the
|
|
6
|
-
* root `bunfig.toml`), but this pure function needs no render at all — it's the testable seam on
|
|
7
|
-
* its own, so this suite calls it directly rather than mounting anything.
|
|
8
|
-
*/
|
|
9
|
-
import { describe, expect, test } from 'bun:test'
|
|
10
|
-
import { buildFontsCss } from './index'
|
|
11
|
-
|
|
12
|
-
describe('buildFontsCss', () => {
|
|
13
|
-
test('returns empty string when fonts is undefined', () => {
|
|
14
|
-
expect(buildFontsCss(undefined)).toBe('')
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
test('returns empty string when fonts is an empty object', () => {
|
|
18
|
-
expect(buildFontsCss({})).toBe('')
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
test('emits a --basalt-font-sans declaration for a provided sans value', () => {
|
|
22
|
-
const css = buildFontsCss({ sans: 'Inter, sans-serif' })
|
|
23
|
-
expect(css).toContain('--basalt-font-sans: Inter, sans-serif;')
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
test('emits declarations only for the provided keys, omitting the rest', () => {
|
|
27
|
-
const css = buildFontsCss({ sans: 'Inter, sans-serif' })
|
|
28
|
-
expect(css).not.toContain('--basalt-font-head')
|
|
29
|
-
expect(css).not.toContain('--basalt-font-mono')
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
test('emits all three declarations under one :root block when all three are provided', () => {
|
|
33
|
-
const css = buildFontsCss({
|
|
34
|
-
sans: 'Inter, sans-serif',
|
|
35
|
-
head: 'Poppins, sans-serif',
|
|
36
|
-
mono: 'Fira Code, monospace',
|
|
37
|
-
})
|
|
38
|
-
expect(css).toContain(':root {')
|
|
39
|
-
expect(css).toContain('--basalt-font-sans: Inter, sans-serif;')
|
|
40
|
-
expect(css).toContain('--basalt-font-head: Poppins, sans-serif;')
|
|
41
|
-
expect(css).toContain('--basalt-font-mono: Fira Code, monospace;')
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
test('throws on values that could break out of the emitted declaration', () => {
|
|
45
|
-
expect(() => buildFontsCss({ sans: 'Inter; } body { color: red' })).toThrow(
|
|
46
|
-
/Invalid fonts.sans/,
|
|
47
|
-
)
|
|
48
|
-
expect(() => buildFontsCss({ head: 'Poppins }' })).toThrow(/Invalid fonts.head/)
|
|
49
|
-
expect(() => buildFontsCss({ mono: 'Fira /* x */ Code' })).toThrow(/Invalid fonts.mono/)
|
|
50
|
-
expect(() => buildFontsCss({ sans: "'Segoe UI', system-ui, sans-serif" })).not.toThrow()
|
|
51
|
-
})
|
|
52
|
-
})
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `buildRadiusCss` — the pure CSS-building half of the `{ radius }` option (see
|
|
3
|
-
* `../theme/radius-option.test.ts` for the `theme.other.basaltRadius` round-trip this consumes).
|
|
4
|
-
* `BasaltBridge` calls this directly to append overriding `--vx-radius-*` declarations to the same
|
|
5
|
-
* injected `<style>` as the palette CSS; mirrors `build-fonts-css.test.ts`.
|
|
6
|
-
*/
|
|
7
|
-
import { describe, expect, test } from 'bun:test'
|
|
8
|
-
import { deriveRadius } from './palette'
|
|
9
|
-
import { buildRadiusCss } from './index'
|
|
10
|
-
|
|
11
|
-
describe('buildRadiusCss', () => {
|
|
12
|
-
test('returns empty string when radius is undefined', () => {
|
|
13
|
-
expect(buildRadiusCss(undefined)).toBe('')
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
test('emits all five overriding declarations under one :root block', () => {
|
|
17
|
-
const css = buildRadiusCss(deriveRadius(2))
|
|
18
|
-
expect(css).toContain(':root {')
|
|
19
|
-
expect(css).toContain('--vx-radius-card: 9px;')
|
|
20
|
-
expect(css).toContain('--vx-radius-ctrl: 8px;')
|
|
21
|
-
expect(css).toContain('--vx-radius-tight: 7px;')
|
|
22
|
-
expect(css).toContain('--vx-radius-fine: 6px;')
|
|
23
|
-
expect(css).toContain('--vx-radius-floating: 10px;')
|
|
24
|
-
})
|
|
25
|
-
})
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from 'bun:test'
|
|
2
|
-
import { chartMargin, VX } from './index'
|
|
3
|
-
|
|
4
|
-
describe('chartMargin', () => {
|
|
5
|
-
test('a bare call deep-equals VX.margin', () => {
|
|
6
|
-
expect(chartMargin()).toEqual(VX.margin)
|
|
7
|
-
})
|
|
8
|
-
|
|
9
|
-
test('{ rightAxis: true } widens right to the right-axis minimum', () => {
|
|
10
|
-
expect(chartMargin({ rightAxis: true })).toEqual({
|
|
11
|
-
...VX.margin,
|
|
12
|
-
right: 40,
|
|
13
|
-
})
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
test('{ rightAxis: false } (or omitted) leaves right at VX.margin.right', () => {
|
|
17
|
-
expect(chartMargin({ rightAxis: false })).toEqual(VX.margin)
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
test('an explicit right overrides the rightAxis-widened value', () => {
|
|
21
|
-
expect(chartMargin({ rightAxis: true, right: 12 })).toEqual({
|
|
22
|
-
...VX.margin,
|
|
23
|
-
right: 12,
|
|
24
|
-
})
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
test('explicit sides override their VX.margin defaults independently', () => {
|
|
28
|
-
expect(chartMargin({ top: 1, left: 2 })).toEqual({
|
|
29
|
-
top: 1,
|
|
30
|
-
right: VX.margin.right,
|
|
31
|
-
bottom: VX.margin.bottom,
|
|
32
|
-
left: 2,
|
|
33
|
-
})
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
test('returns a new object each call', () => {
|
|
37
|
-
expect(chartMargin()).not.toBe(chartMargin())
|
|
38
|
-
})
|
|
39
|
-
})
|
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `deriveSpacing` — the spacing analog of `deriveRadius`. Locks the law (a `1 + 0.1 * level`
|
|
3
|
-
* multiplier, over a narrower `[-3, 3]` range than `deriveRadius`'s `[-5, 5]` — see `deriveSpacing`'s
|
|
4
|
-
* own JSDoc in `palette.ts` for why — applied to every density-tracking anchor/scale-stop/one-off,
|
|
5
|
-
* rounded and floored at 1, plus the row line-height's own additive law) at a handful of levels,
|
|
6
|
-
* plus the throw-and-propagate
|
|
7
|
-
* validation and `buildDensityCss`'s CSS output. `theme/spacing.test.ts` separately locks that
|
|
8
|
-
* `SPACE`/`SPACE_SCALE`/`SPACE_STEP`/`ROW_LINE_HEIGHT` equal `deriveSpacing(0)`'s output
|
|
9
|
-
* byte-for-byte — this file is the law itself (and the CSS builder), not the shipped-identity
|
|
10
|
-
* snapshot. Lives in `tokens/` (a sibling to `derive-radius.test.ts`/`build-radius-css.test.ts`,
|
|
11
|
-
* merged into one file here) rather than extending `theme/spacing.test.ts`: that file's own doc
|
|
12
|
-
* comment scopes it strictly to "the rendered output must stay byte-identical to the numbers
|
|
13
|
-
* shipped" — the LAW at non-zero levels is a different concern, same split radius already made.
|
|
14
|
-
*/
|
|
15
|
-
import { describe, expect, test } from 'bun:test'
|
|
16
|
-
import { buildDensityCss, VX } from './index'
|
|
17
|
-
import { deriveSpacing, scaleSpace } from './palette'
|
|
18
|
-
|
|
19
|
-
// The "deriveSpacing(0) matches SPACE/SPACE_SCALE/SPACE_STEP/ROW_LINE_HEIGHT byte-for-byte" check
|
|
20
|
-
// used to live here as its own test — deleted, not merely renamed: `SPACE`/`SPACE_SCALE`/
|
|
21
|
-
// `SPACE_STEP`/`ROW_LINE_HEIGHT` (`palette.ts`) are DEFINED as `DEFAULT_SPACE_VALUES = deriveSpacing(0)`
|
|
22
|
-
// and its destructured fields, so `expect(deriveSpacing(0)).toEqual({ anchors: SPACE, ... })` compared
|
|
23
|
-
// `deriveSpacing(0)` against itself — no source-level change could ever fail it. The real level-0
|
|
24
|
-
// acceptance gate (a hardcoded literal table, not a derived comparison) lives in
|
|
25
|
-
// `theme/spacing.test.ts`.
|
|
26
|
-
describe('deriveSpacing(0) reproduces the shipped identity exactly', () => {
|
|
27
|
-
test('a non-integer base (proseInlineCodeInsetY: 1.5) survives untouched at level 0', () => {
|
|
28
|
-
// The naive `Math.round(1.5 * 1)` rounds half-up to 2 — `deriveSpacing` must special-case
|
|
29
|
-
// level 0 to skip rounding entirely, or this silently regresses the byte-identical gate.
|
|
30
|
-
expect(deriveSpacing(0).step.proseInlineCodeInsetY).toBe(1.5)
|
|
31
|
-
})
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
describe('VX chart geometry at level 0 (single-sourced from SPACE_STEP)', () => {
|
|
35
|
-
// Locks the shipped identity so a future SPACE_STEP edit can't silently move chart geometry —
|
|
36
|
-
// `VX.dotR`/`VX.legendGap`/`VX.margin` (`tokens/index.ts`) read straight off `SPACE_STEP`, which
|
|
37
|
-
// is itself `deriveSpacing(0).step` (see the top describe block above).
|
|
38
|
-
test('dotR is 5', () => expect(VX.dotR).toBe(5))
|
|
39
|
-
test('legendGap is 22', () => expect(VX.legendGap).toBe(22))
|
|
40
|
-
test('margin is { top: 12, right: 16, bottom: 30, left: 44 }', () => {
|
|
41
|
-
expect(VX.margin).toEqual({ top: 12, right: 16, bottom: 30, left: 44 })
|
|
42
|
-
})
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
describe('a positive level scales anchors/scale/step by the multiplier, rounded', () => {
|
|
46
|
-
test('level +2: a 10px anchor -> 12, a 6px anchor -> 7', () => {
|
|
47
|
-
const result = deriveSpacing(2)
|
|
48
|
-
expect(result.anchors.rowInsetX).toBe(12)
|
|
49
|
-
expect(result.anchors.rowInsetY).toBe(7)
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
test('level +3 (the new endpoint — reproduces the old ±5 envelope, 0.1 * 3 === 0.06 * 5): the same two land at 13 / 8, and a 2px one-off lands at 3', () => {
|
|
53
|
-
const result = deriveSpacing(3)
|
|
54
|
-
expect(result.anchors.rowInsetX).toBe(13)
|
|
55
|
-
expect(result.anchors.rowInsetY).toBe(8)
|
|
56
|
-
expect(result.step.proseQuoteInsetY).toBe(3)
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
test('a scale stop moves independently of the anchor stack rhythm', () => {
|
|
60
|
-
const result = deriveSpacing(3)
|
|
61
|
-
expect(result.scale.xs).toBe(14)
|
|
62
|
-
expect(result.scale.md).toBe(23)
|
|
63
|
-
// scale.md (23) diverges from anchors.stackLg (20, rebuilt from the shared stack unit) — the two
|
|
64
|
-
// groups scale by different laws (independently-rounded stops vs one shared unit) and, since the
|
|
65
|
-
// component-roominess retune moved the scale off the stack rhythm, no longer even coincide at
|
|
66
|
-
// level 0. That the two can be read apart at all is the point this locks.
|
|
67
|
-
expect(result.anchors.stackLg).toBe(20)
|
|
68
|
-
})
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
describe('a negative level scales down, floored at 1 for any base >= 1', () => {
|
|
72
|
-
test('level -3 (the new endpoint): a 10px anchor -> 7, a 6px anchor -> 4', () => {
|
|
73
|
-
const result = deriveSpacing(-3)
|
|
74
|
-
expect(result.anchors.rowInsetX).toBe(7)
|
|
75
|
-
expect(result.anchors.rowInsetY).toBe(4)
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
test('level -3: a 2px one-off lands at 1, not 0 (the floor)', () => {
|
|
79
|
-
expect(deriveSpacing(-3).step.proseQuoteInsetY).toBe(1)
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
test("scaleSpace's unconditional floor actually engages for a sub-1 base — the property `deriveSpacing`'s own [-3, 3] range/bases can never exercise", () => {
|
|
83
|
-
// Every real `SPACE_ANCHORS_BASE`/`SPACE_SCALE_BASE`/`SPACE_STEP_BASE` value is an integer >= 1,
|
|
84
|
-
// and the shallowest multiplier `deriveSpacing` ever passes (0.7, at level -3) still keeps
|
|
85
|
-
// `round(v * 0.7) >= 1` for any `v >= 1` — so looping `deriveSpacing(-3)`'s own output (the old
|
|
86
|
-
// form of this test) can NEVER fail regardless of whether the floor exists at all. Drive
|
|
87
|
-
// `scaleSpace` directly with a sub-1 base instead (as its own JSDoc names this test for) to
|
|
88
|
-
// exercise the actual clamp: without it, `round(0.5 * 0.7) = round(0.35) = 0`.
|
|
89
|
-
expect(scaleSpace(0.5, -3, 0.7)).toBe(1)
|
|
90
|
-
// A future base as small as `0.1` collapses even further without the floor — confirms the clamp
|
|
91
|
-
// holds regardless of how far below 1 a hypothetical base sits, not just at the one boundary case.
|
|
92
|
-
expect(scaleSpace(0.1, -3, 0.7)).toBe(1)
|
|
93
|
-
})
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
describe('the input-height anchor scales with density', () => {
|
|
97
|
-
test('level -3/0/+3: 29 / 42 / 55', () => {
|
|
98
|
-
expect(deriveSpacing(-3).anchors.inputHeight).toBe(29)
|
|
99
|
-
expect(deriveSpacing(0).anchors.inputHeight).toBe(42)
|
|
100
|
-
expect(deriveSpacing(3).anchors.inputHeight).toBe(55)
|
|
101
|
-
})
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
// The "controlHeight tracks inputHeight at every level" cross-level check used to live here as its
|
|
105
|
-
// own describe block — deleted, not merely renamed: both keys read the literal same
|
|
106
|
-
// `CONTROL_HEIGHT_BASE` and are scaled by the SAME deterministic `scaleSpace` call, so
|
|
107
|
-
// `controlHeight === inputHeight` is true BY CONSTRUCTION and can never fail regardless of what the
|
|
108
|
-
// multiplier law actually computes. `theme/density-relations.test.ts`'s "Fix 1" describe block
|
|
109
|
-
// replaced this exact form with one that asserts each key against its own hardcoded expected value
|
|
110
|
-
// (29 / 34 / 38 / 42 / 46 / 50 / 55 across the full level range) — that version bites on a change to
|
|
111
|
-
// `CONTROL_HEIGHT_BASE`, the multiplier law, OR a divergence between the two keys, none of which the
|
|
112
|
-
// by-construction equality could catch. Not re-duplicated.
|
|
113
|
-
|
|
114
|
-
// The 4px-stack-rhythm cross-level relation (2:1 pairs, exact multiples of stackXs) is covered by
|
|
115
|
-
// `theme/density-relations.test.ts`'s "Fix 2" describe block — that version asserts the DOCUMENTED
|
|
116
|
-
// exact multiples (2x/3x/4x/6x of stackXs), which subsumes and is strictly stronger than the
|
|
117
|
-
// `% === 0` divisibility form this file used to duplicate here (any value that IS `stackXs * N`
|
|
118
|
-
// trivially divides `stackXs`, so the weaker form added no independent coverage). Not re-duplicated.
|
|
119
|
-
|
|
120
|
-
describe('rowLineHeight follows its own additive law, not the multiplier', () => {
|
|
121
|
-
test('level -3/0/+3: 1.25 / 1.35 / 1.45', () => {
|
|
122
|
-
expect(deriveSpacing(-3).rowLineHeight).toBe(1.25)
|
|
123
|
-
expect(deriveSpacing(0).rowLineHeight).toBe(1.35)
|
|
124
|
-
expect(deriveSpacing(3).rowLineHeight).toBe(1.45)
|
|
125
|
-
})
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
describe('stickyHeaderClearance derives from the AppShell header, not an independent base', () => {
|
|
129
|
-
test('level -3/0/+3: 43 / 60 / 77 — appShellHeaderHeight + anchors.stackMd at each level', () => {
|
|
130
|
-
const low = deriveSpacing(-3)
|
|
131
|
-
const zero = deriveSpacing(0)
|
|
132
|
-
const high = deriveSpacing(3)
|
|
133
|
-
expect(low.step.stickyHeaderClearance).toBe(43)
|
|
134
|
-
expect(low.step.stickyHeaderClearance).toBe(low.step.appShellHeaderHeight + low.anchors.stackMd)
|
|
135
|
-
expect(zero.step.stickyHeaderClearance).toBe(60)
|
|
136
|
-
expect(high.step.stickyHeaderClearance).toBe(77)
|
|
137
|
-
expect(high.step.stickyHeaderClearance).toBe(
|
|
138
|
-
high.step.appShellHeaderHeight + high.anchors.stackMd,
|
|
139
|
-
)
|
|
140
|
-
})
|
|
141
|
-
|
|
142
|
-
test('every level: the clearance exceeds the header it exists to clear, exactly by anchors.stackMd', () => {
|
|
143
|
-
for (let level = -3; level <= 3; level++) {
|
|
144
|
-
const { step, anchors } = deriveSpacing(level)
|
|
145
|
-
expect(step.stickyHeaderClearance - step.appShellHeaderHeight).toBe(anchors.stackMd)
|
|
146
|
-
}
|
|
147
|
-
})
|
|
148
|
-
})
|
|
149
|
-
|
|
150
|
-
describe('deriveSpacing rejects a malformed level', () => {
|
|
151
|
-
test('a non-integer throws', () => {
|
|
152
|
-
expect(() => deriveSpacing(1.5)).toThrow()
|
|
153
|
-
})
|
|
154
|
-
|
|
155
|
-
test('below -3 throws', () => {
|
|
156
|
-
expect(() => deriveSpacing(-4)).toThrow()
|
|
157
|
-
})
|
|
158
|
-
|
|
159
|
-
test('above 3 throws', () => {
|
|
160
|
-
expect(() => deriveSpacing(4)).toThrow()
|
|
161
|
-
})
|
|
162
|
-
|
|
163
|
-
test('the old ±5 endpoints are now out of range too', () => {
|
|
164
|
-
expect(() => deriveSpacing(-5)).toThrow()
|
|
165
|
-
expect(() => deriveSpacing(5)).toThrow()
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
test('NaN throws', () => {
|
|
169
|
-
expect(() => deriveSpacing(Number.NaN)).toThrow()
|
|
170
|
-
})
|
|
171
|
-
})
|
|
172
|
-
|
|
173
|
-
/** `SpaceValues` key → the `--vx-` suffix `spaceDecls` emits for it (`rowInsetX` → `space-row-inset-x`). */
|
|
174
|
-
const kebab = (key: string): string =>
|
|
175
|
-
`space-${key.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()}`
|
|
176
|
-
|
|
177
|
-
describe('buildDensityCss', () => {
|
|
178
|
-
test('returns empty string when space is undefined', () => {
|
|
179
|
-
expect(buildDensityCss(undefined)).toBe('')
|
|
180
|
-
})
|
|
181
|
-
|
|
182
|
-
test('emits every anchor/one-off declaration under one :root block, at the retuned level', () => {
|
|
183
|
-
const css = buildDensityCss(deriveSpacing(3))
|
|
184
|
-
expect(css).toContain(':root {')
|
|
185
|
-
expect(css).toContain('--vx-space-row-inset-x: 13px;')
|
|
186
|
-
expect(css).toContain('--vx-space-row-inset-y: 8px;')
|
|
187
|
-
expect(css).toContain('--vx-space-row-line-height: 1.45;')
|
|
188
|
-
// REM, not px — see the input-height describe block below for why.
|
|
189
|
-
expect(css).toContain('--vx-space-input-height: 3.4375rem;')
|
|
190
|
-
expect(css).toContain('--vx-space-control-height: 3.4375rem;')
|
|
191
|
-
// 77, not the anchor/scale/step multiplier result for an 84px base — it is DERIVED (the header
|
|
192
|
-
// plus anchors.stackMd), see the dedicated describe block above.
|
|
193
|
-
expect(css).toContain('--vx-space-sticky-header-clearance: 77px;')
|
|
194
|
-
// JS-number-only constants (Timeline's bulletSize, VX chart geometry, Progress's size) have no
|
|
195
|
-
// CSS var to override — see `spaceDecls`'s doc in `tokens/index.ts`.
|
|
196
|
-
expect(css).not.toContain('--vx-space-timeline-bullet')
|
|
197
|
-
expect(css).not.toContain('--vx-space-chart-legend-gap')
|
|
198
|
-
expect(css).not.toContain('--vx-space-progress-bar-size')
|
|
199
|
-
})
|
|
200
|
-
|
|
201
|
-
// The spot-checks above lock VALUES; this locks the declaration SET. Without it, `spaceDecls`
|
|
202
|
-
// could silently drop a var the migrated CSS modules consume — density would stop applying there
|
|
203
|
-
// and every value-assertion above would still pass. Derived from the `SpaceValues` keys rather
|
|
204
|
-
// than a hand-listed 104-name snapshot, so a newly added anchor/one-off has to be either emitted
|
|
205
|
-
// or explicitly declared JS-number-only here.
|
|
206
|
-
test('emits exactly one var per SpaceValues key, minus the documented JS-number-only reads', () => {
|
|
207
|
-
const space = deriveSpacing(0)
|
|
208
|
-
const emitted = new Set(
|
|
209
|
-
[...buildDensityCss(space).matchAll(/--vx-(space-[a-z0-9-]+):/g)].map((m) => m[1] as string),
|
|
210
|
-
)
|
|
211
|
-
// Read straight off the resolved `SpaceValues` as a JS number instead of through a var — each
|
|
212
|
-
// has zero `var()` consumers, so a declaration would be dead weight. See `spaceDecls`'s doc in
|
|
213
|
-
// `tokens/index.ts` for why, and `deriveSpacing`'s JSDoc for the runtime gap the chart six have.
|
|
214
|
-
const jsNumberOnly = [
|
|
215
|
-
'space-timeline-bullet', // Timeline defaultProps.bulletSize
|
|
216
|
-
'space-progress-bar-size', // Progress defaultProps.size
|
|
217
|
-
'space-table-header-height', // Table.extend styles.th height
|
|
218
|
-
'space-table-row-height', // Table.extend styles.td height
|
|
219
|
-
'space-sidebar-account-menu-width', // Menu width prop
|
|
220
|
-
'space-sidebar-settings-menu-width', // Menu width prop
|
|
221
|
-
'space-app-shell-header-height', // AppShell header/navbar props
|
|
222
|
-
'space-app-shell-navbar-width',
|
|
223
|
-
'space-app-shell-navbar-rail-width',
|
|
224
|
-
'space-mobile-nav-bar-height', // AppShell footer.height prop
|
|
225
|
-
'space-mobile-nav-menu-width', // Menu width prop
|
|
226
|
-
'space-chart-legend-gap', // VX.legendGap / VX.margin / VX.dotR — visx SVG props
|
|
227
|
-
'space-chart-margin-top',
|
|
228
|
-
'space-chart-margin-right',
|
|
229
|
-
'space-chart-margin-right-axis',
|
|
230
|
-
'space-chart-margin-bottom',
|
|
231
|
-
'space-chart-margin-left',
|
|
232
|
-
'space-chart-dot-r',
|
|
233
|
-
]
|
|
234
|
-
|
|
235
|
-
// `space.scale.*` (the generic Mantine scale) resolves through `--mantine-spacing-*`, not a
|
|
236
|
-
// `--vx-space-*` var, so it is not part of this contract at all.
|
|
237
|
-
const expected = [
|
|
238
|
-
...Object.keys(space.anchors).map(kebab),
|
|
239
|
-
...Object.keys(space.step).map(kebab),
|
|
240
|
-
'space-row-line-height',
|
|
241
|
-
].filter((name) => !jsNumberOnly.includes(name))
|
|
242
|
-
|
|
243
|
-
expect([...emitted].toSorted()).toEqual(expected.toSorted())
|
|
244
|
-
})
|
|
245
|
-
})
|
|
246
|
-
|
|
247
|
-
describe('the input-height var is emitted in REM, never a flat px', () => {
|
|
248
|
-
test("level 0 emits exactly 2.625rem — Mantine's own --input-height-md value", () => {
|
|
249
|
-
expect(buildDensityCss(deriveSpacing(0))).toContain('--vx-space-input-height: 2.625rem;')
|
|
250
|
-
expect(buildDensityCss(deriveSpacing(0))).not.toContain('--vx-space-input-height: 42px;')
|
|
251
|
-
})
|
|
252
|
-
|
|
253
|
-
test('a retuned level still emits rem, computed from the scaled px anchor', () => {
|
|
254
|
-
// inputHeight scales like every other anchor (42 -> 55 at level +3, the new endpoint), then
|
|
255
|
-
// converts to rem — the LAW stays px-denominated; only the CSS emission is rem, per `pxRem`.
|
|
256
|
-
expect(deriveSpacing(3).anchors.inputHeight).toBe(55)
|
|
257
|
-
expect(buildDensityCss(deriveSpacing(3))).toContain('--vx-space-input-height: 3.4375rem;')
|
|
258
|
-
})
|
|
259
|
-
})
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `deriveRadius` — the radius analog of `deriveTokens`'s color knobs. Locks the law
|
|
3
|
-
* (`docs/DESIGN-SPEC.md` §4) at a handful of levels, plus the throw-and-propagate validation.
|
|
4
|
-
* `theme/radius.test.ts` separately locks that `RADIUS`/`RADIUS_STEP` equal `deriveRadius(0)`'s
|
|
5
|
-
* output byte-for-byte — this file is the law itself, not the shipped-identity snapshot.
|
|
6
|
-
*/
|
|
7
|
-
import { describe, expect, test } from 'bun:test'
|
|
8
|
-
import { deriveRadius, RADIUS, RADIUS_STEP } from './palette'
|
|
9
|
-
|
|
10
|
-
describe('deriveRadius(0) reproduces the shipped identity', () => {
|
|
11
|
-
test('matches RADIUS/RADIUS_STEP exactly', () => {
|
|
12
|
-
expect(deriveRadius(0)).toEqual({
|
|
13
|
-
card: RADIUS.card,
|
|
14
|
-
ctrl: RADIUS.ctrl,
|
|
15
|
-
floating: RADIUS_STEP.floating,
|
|
16
|
-
tight: RADIUS_STEP.tight,
|
|
17
|
-
fine: RADIUS_STEP.fine,
|
|
18
|
-
})
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
test('card 7, ctrl 6, floating 8, tight 5, fine 4', () => {
|
|
22
|
-
expect(deriveRadius(0)).toEqual({ card: 7, ctrl: 6, floating: 8, tight: 5, fine: 4 })
|
|
23
|
-
})
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
describe('a positive level scales every anchor and its offsets', () => {
|
|
27
|
-
test('level +2: card 9, ctrl 8, floating 10, tight 7, fine 6', () => {
|
|
28
|
-
expect(deriveRadius(2)).toEqual({ card: 9, ctrl: 8, floating: 10, tight: 7, fine: 6 })
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
test('level +5: card 12, ctrl 11, floating 13, tight 10, fine 9', () => {
|
|
32
|
-
expect(deriveRadius(5)).toEqual({ card: 12, ctrl: 11, floating: 13, tight: 10, fine: 9 })
|
|
33
|
-
})
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
describe('a negative level clamps at zero instead of going negative', () => {
|
|
37
|
-
test('level -5: card 2, ctrl 1, floating 3, tight 0, fine clamps to 0', () => {
|
|
38
|
-
expect(deriveRadius(-5)).toEqual({ card: 2, ctrl: 1, floating: 3, tight: 0, fine: 0 })
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
test('level -2: card 5, ctrl 4, floating 6, tight 3, fine 2 (no clamp needed yet)', () => {
|
|
42
|
-
expect(deriveRadius(-2)).toEqual({ card: 5, ctrl: 4, floating: 6, tight: 3, fine: 2 })
|
|
43
|
-
})
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
describe('deriveRadius rejects a malformed level', () => {
|
|
47
|
-
test('a non-integer throws', () => {
|
|
48
|
-
expect(() => deriveRadius(1.5)).toThrow()
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
test('below -5 throws', () => {
|
|
52
|
-
expect(() => deriveRadius(-6)).toThrow()
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
test('above 5 throws', () => {
|
|
56
|
-
expect(() => deriveRadius(6)).toThrow()
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
test('NaN throws', () => {
|
|
60
|
-
expect(() => deriveRadius(Number.NaN)).toThrow()
|
|
61
|
-
})
|
|
62
|
-
})
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `derive.ts`'s fill-page contrast clamp — the law that an accent fill shifted off the band centre
|
|
3
|
-
* by `accentBrightness` must still clear `FILL_PAGE_CONTRAST_MIN` (3.0:1) against BOTH derived page
|
|
4
|
-
* backgrounds, never just the label-vs-fill floor. See the law comment above `FILL_LUMINANCE` in
|
|
5
|
-
* `derive.ts`.
|
|
6
|
-
*/
|
|
7
|
-
import { describe, expect, test } from 'bun:test'
|
|
8
|
-
import { contrastRatio } from './hct'
|
|
9
|
-
import { DEFAULT_DERIVE_CONFIG, deriveTokens } from './derive'
|
|
10
|
-
|
|
11
|
-
const FILL_PAGE_CONTRAST_MIN = 3.0
|
|
12
|
-
|
|
13
|
-
describe('the fill-page contrast clamp', () => {
|
|
14
|
-
test('the default config (accentBrightness 0) is a no-op — accentFill hex is unchanged', () => {
|
|
15
|
-
expect(deriveTokens(DEFAULT_DERIVE_CONFIG).accentFill.light).toBe('#4374a6')
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
for (const accentBrightness of [5, -5]) {
|
|
19
|
-
test(`accentBrightness ${accentBrightness} at the default seed clears 3.0:1 vs both derived page backgrounds`, () => {
|
|
20
|
-
const data = deriveTokens({ ...DEFAULT_DERIVE_CONFIG, accentBrightness })
|
|
21
|
-
const fill = data.accentFill.light
|
|
22
|
-
expect(contrastRatio(fill, data.surface.bg.light)).toBeGreaterThanOrEqual(
|
|
23
|
-
FILL_PAGE_CONTRAST_MIN,
|
|
24
|
-
)
|
|
25
|
-
expect(contrastRatio(fill, data.surface.bg.dark)).toBeGreaterThanOrEqual(
|
|
26
|
-
FILL_PAGE_CONTRAST_MIN,
|
|
27
|
-
)
|
|
28
|
-
})
|
|
29
|
-
}
|
|
30
|
-
})
|