basalt-ui 1.27.0 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +23 -23
- package/CHANGELOG.md +59 -0
- package/MIGRATING.md +613 -20
- package/README.md +33 -3
- package/agent/rules/basalt-batteries.md +25 -10
- package/agent/rules/basalt-controls.md +56 -31
- package/agent/rules/basalt-mantine.md +17 -6
- package/agent/rules/basalt-tokens.md +1 -1
- package/configs/oxlint-plugin.js +1056 -28
- package/configs/oxlint-plugin.test.ts +1066 -0
- package/configs/oxlint.json +7 -0
- package/dist/agent/coalesce.d.ts.map +1 -1
- package/dist/agent/coalesce.js +2 -1
- package/dist/agent/merge.d.ts.map +1 -1
- package/dist/agent/merge.js +2 -1
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/part-list.js +2 -0
- package/dist/agent/stick-to-bottom.d.ts +3 -6
- package/dist/agent/stick-to-bottom.d.ts.map +1 -1
- package/dist/agent/stick-to-bottom.js +6 -3
- package/dist/agent-chat/composer.d.ts +6 -2
- package/dist/agent-chat/composer.d.ts.map +1 -1
- package/dist/agent-chat/composer.js +49 -33
- package/dist/agent-chat/relative-time.d.ts +0 -9
- package/dist/agent-chat/relative-time.d.ts.map +1 -1
- package/dist/agent-chat/relative-time.js +2 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +3 -2
- package/dist/agent-chat/thread-detail-panel.d.ts.map +1 -1
- package/dist/agent-chat/thread-detail-panel.js +8 -5
- package/dist/agent-chat/thread-feed-row.d.ts +2 -1
- package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed-row.js +92 -92
- package/dist/agent-chat/thread-feed.d.ts +3 -2
- package/dist/agent-chat/thread-feed.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed.js +8 -3
- package/dist/agent-chat/thread-message.d.ts +4 -3
- package/dist/agent-chat/thread-message.d.ts.map +1 -1
- package/dist/agent-chat/thread-message.js +70 -31
- package/dist/agent-chat/thread-outcome-card.d.ts +3 -2
- package/dist/agent-chat/thread-outcome-card.d.ts.map +1 -1
- package/dist/agent-chat/thread-outcome-card.js +9 -2
- package/dist/agent-chat/thread-workspace.d.ts +7 -2
- package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
- package/dist/agent-chat/thread-workspace.js +62 -29
- package/dist/agent-chat/tool-chip.d.ts +3 -2
- package/dist/agent-chat/tool-chip.d.ts.map +1 -1
- package/dist/agent-chat/tool-chip.js +7 -2
- package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
- package/dist/charts/hooks/useBandPlot.js +15 -8
- package/dist/charts/index.d.ts +8 -7
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +45 -5
- package/dist/charts/kinds/BandStrip.d.ts +10 -7
- package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
- package/dist/charts/kinds/BandStrip.js +12 -7
- package/dist/charts/kinds/Bars.d.ts +12 -6
- package/dist/charts/kinds/Bars.d.ts.map +1 -1
- package/dist/charts/kinds/Bars.js +37 -11
- package/dist/charts/kinds/Donut.d.ts +6 -5
- package/dist/charts/kinds/Donut.d.ts.map +1 -1
- package/dist/charts/kinds/Donut.js +19 -2
- package/dist/charts/kinds/DualPanel.d.ts +6 -5
- package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
- package/dist/charts/kinds/DualPanel.js +36 -8
- package/dist/charts/kinds/Heatmap.d.ts +10 -6
- package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
- package/dist/charts/kinds/Heatmap.js +58 -31
- package/dist/charts/kinds/MirroredBars.d.ts +6 -5
- package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
- package/dist/charts/kinds/MirroredBars.js +9 -2
- package/dist/charts/kinds/MultiLine.d.ts +11 -6
- package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
- package/dist/charts/kinds/MultiLine.js +24 -15
- package/dist/charts/kinds/StackedArea.d.ts +18 -8
- package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
- package/dist/charts/kinds/StackedArea.js +29 -4
- package/dist/charts/kinds/ZonedLine.d.ts +12 -8
- package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
- package/dist/charts/kinds/ZonedLine.js +33 -23
- package/dist/charts/layout/auto-margin.d.ts +65 -8
- package/dist/charts/layout/auto-margin.d.ts.map +1 -1
- package/dist/charts/layout/auto-margin.js +45 -10
- package/dist/charts/layout/log-ticks.d.ts +27 -0
- package/dist/charts/layout/log-ticks.d.ts.map +1 -0
- package/dist/charts/layout/log-ticks.js +42 -0
- package/dist/charts/primitives/Axes.d.ts +11 -2
- package/dist/charts/primitives/Axes.d.ts.map +1 -1
- package/dist/charts/primitives/Axes.js +15 -5
- package/dist/charts/primitives/CartesianChart.d.ts +45 -7
- package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
- package/dist/charts/primitives/CartesianChart.js +86 -28
- package/dist/charts/primitives/ChartCard.d.ts +27 -2
- package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
- package/dist/charts/primitives/ChartCard.js +37 -17
- package/dist/charts/primitives/ChartFrame.d.ts +30 -4
- package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
- package/dist/charts/primitives/ChartFrame.js +45 -15
- package/dist/charts/primitives/ChartLegend.d.ts +13 -2
- package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
- package/dist/charts/primitives/ChartLegend.js +33 -13
- package/dist/charts/primitives/ChartPending.d.ts +77 -4
- package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
- package/dist/charts/primitives/ChartPending.js +100 -6
- package/dist/charts/primitives/ChartTooltip.d.ts +7 -0
- package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
- package/dist/charts/primitives/ChartTooltip.js +18 -5
- package/dist/charts/primitives/Crosshair.d.ts +3 -0
- package/dist/charts/primitives/Crosshair.d.ts.map +1 -1
- package/dist/charts/primitives/Crosshair.js +3 -1
- package/dist/charts/primitives/chart-frame-layout.d.ts +95 -0
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -0
- package/dist/charts/primitives/chart-frame-layout.js +89 -0
- package/dist/charts/primitives/chart-tier.d.ts +16 -0
- package/dist/charts/primitives/chart-tier.d.ts.map +1 -0
- package/dist/charts/primitives/chart-tier.js +20 -0
- package/dist/charts/series.d.ts +55 -1
- package/dist/charts/series.d.ts.map +1 -1
- package/dist/charts/series.js +27 -1
- package/dist/charts/sparklines/BarSparkline.d.ts +3 -3
- package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/BarSparkline.js +9 -3
- package/dist/charts/sparklines/LineSparkline.d.ts +3 -3
- package/dist/charts/sparklines/LineSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/LineSparkline.js +15 -3
- package/dist/charts/sparklines/index.d.ts +2 -2
- package/dist/charts/sparklines/index.d.ts.map +1 -1
- package/dist/charts/utils/format.d.ts +92 -2
- package/dist/charts/utils/format.d.ts.map +1 -1
- package/dist/charts/utils/format.js +64 -1
- package/dist/charts/utils/ticks.d.ts +81 -2
- package/dist/charts/utils/ticks.d.ts.map +1 -1
- package/dist/charts/utils/ticks.js +54 -4
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/commands/ShortcutsHelp.d.ts +3 -2
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +8 -2
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +2 -2
- package/dist/commands/define-overlays.d.ts +102 -0
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +102 -2
- package/dist/commands/index.d.ts +10 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +3 -1
- package/dist/commands/overlays-mount.d.ts +13 -6
- package/dist/commands/overlays-mount.d.ts.map +1 -1
- package/dist/commands/overlays-mount.js +23 -14
- package/dist/common/errors.d.ts +34 -0
- package/dist/common/errors.d.ts.map +1 -0
- package/dist/common/errors.js +36 -0
- package/dist/common/index.d.ts +15 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +29 -0
- package/dist/common/props.d.ts +63 -0
- package/dist/common/props.d.ts.map +1 -0
- package/dist/common/props.js +6 -0
- package/dist/common/query-state-like.d.ts +43 -0
- package/dist/common/query-state-like.d.ts.map +1 -0
- package/dist/common/query-state-like.js +20 -0
- package/dist/common/refs.d.ts +29 -0
- package/dist/common/refs.d.ts.map +1 -0
- package/dist/common/refs.js +29 -0
- package/dist/common/scroll-parent.d.ts +23 -0
- package/dist/common/scroll-parent.d.ts.map +1 -0
- package/dist/common/scroll-parent.js +21 -0
- package/dist/common/validate.d.ts +38 -0
- package/dist/common/validate.d.ts.map +1 -0
- package/dist/common/validate.js +36 -0
- package/dist/connectivity/connectivity-indicator.d.ts +3 -1
- package/dist/connectivity/connectivity-indicator.d.ts.map +1 -1
- package/dist/connectivity/connectivity-indicator.js +3 -1
- package/dist/connectivity/connectivity-provider.d.ts.map +1 -1
- package/dist/connectivity/connectivity-provider.js +4 -1
- package/dist/connectivity/index.d.ts +1 -0
- package/dist/connectivity/index.d.ts.map +1 -1
- package/dist/connectivity/types.d.ts +2 -2
- package/dist/connectivity/types.d.ts.map +1 -1
- package/dist/connectivity/use-connectivity.d.ts.map +1 -1
- package/dist/content/article-layout.module.css +11 -4
- package/dist/content/callout.d.ts +8 -4
- package/dist/content/callout.d.ts.map +1 -1
- package/dist/content/callout.js +15 -8
- package/dist/content/guide.d.ts +5 -4
- package/dist/content/guide.d.ts.map +1 -1
- package/dist/content/guide.js +13 -4
- package/dist/content/heading-anchor.d.ts +24 -2
- package/dist/content/heading-anchor.d.ts.map +1 -1
- package/dist/content/heading-anchor.js +23 -9
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +2 -0
- package/dist/content/prose.module.css +9 -7
- package/dist/content/reading-progress.d.ts +10 -4
- package/dist/content/reading-progress.d.ts.map +1 -1
- package/dist/content/reading-progress.js +26 -10
- package/dist/content/slug.d.ts +4 -0
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/toc.d.ts +11 -0
- package/dist/content/toc.d.ts.map +1 -1
- package/dist/content/toc.js +23 -10
- package/dist/controls/actions.d.ts +49 -6
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/actions.js +39 -8
- package/dist/controls/compare-filter.d.ts +3 -2
- package/dist/controls/compare-filter.d.ts.map +1 -1
- package/dist/controls/compare-filter.js +17 -2
- package/dist/controls/control-group.d.ts +3 -3
- package/dist/controls/control-group.d.ts.map +1 -1
- package/dist/controls/control-group.js +9 -2
- package/dist/controls/controls.module.css +169 -186
- package/dist/controls/controls.module.css.d.ts +9 -11
- package/dist/controls/enum-filter.d.ts +3 -2
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/enum-filter.js +28 -13
- package/dist/controls/filter-context.d.ts +8 -4
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-pill.d.ts +3 -3
- package/dist/controls/filter-pill.d.ts.map +1 -1
- package/dist/controls/filter-pill.js +4 -1
- package/dist/controls/filter-set.d.ts +3 -2
- package/dist/controls/filter-set.d.ts.map +1 -1
- package/dist/controls/filter-set.js +66 -41
- package/dist/controls/filter-sheet.d.ts +20 -80
- package/dist/controls/filter-sheet.d.ts.map +1 -1
- package/dist/controls/filter-sheet.js +9 -95
- package/dist/controls/index.d.ts +2 -0
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +4 -0
- package/dist/controls/multi-select-filter.d.ts +18 -2
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/multi-select-filter.js +122 -20
- package/dist/controls/number-filter.d.ts +7 -5
- package/dist/controls/number-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.js +40 -11
- package/dist/controls/panel-row.d.ts +132 -0
- package/dist/controls/panel-row.d.ts.map +1 -0
- package/dist/controls/panel-row.js +173 -0
- package/dist/controls/panel-row.module.css +86 -0
- package/dist/controls/panel-row.module.css.d.ts +13 -0
- package/dist/controls/range-filter.d.ts +2 -1
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/range-filter.js +57 -35
- package/dist/controls/search-filter.d.ts +3 -2
- package/dist/controls/search-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.js +25 -10
- package/dist/controls/select-filter.d.ts +2 -1
- package/dist/controls/select-filter.d.ts.map +1 -1
- package/dist/controls/select-filter.js +4 -0
- package/dist/controls/slider-control.d.ts +36 -0
- package/dist/controls/slider-control.d.ts.map +1 -0
- package/dist/controls/slider-control.js +64 -0
- package/dist/controls/sync-button.d.ts +3 -2
- package/dist/controls/sync-button.d.ts.map +1 -1
- package/dist/controls/sync-button.js +16 -3
- package/dist/controls/toggle-filter.d.ts +3 -2
- package/dist/controls/toggle-filter.d.ts.map +1 -1
- package/dist/controls/toggle-filter.js +28 -11
- package/dist/controls/view-tabs.d.ts +3 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls/view-tabs.js +43 -11
- package/dist/controls-dates/date-range-picker.d.ts +1 -1
- package/dist/controls-dates/date-range-picker.d.ts.map +1 -1
- package/dist/controls-dates/date-range-picker.js +6 -1
- package/dist/dashboard/delta-badge.d.ts +5 -1
- package/dist/dashboard/delta-badge.d.ts.map +1 -1
- package/dist/dashboard/empty-state.d.ts +10 -3
- package/dist/dashboard/empty-state.d.ts.map +1 -1
- package/dist/dashboard/empty-state.js +37 -6
- package/dist/dashboard/index.d.ts +6 -4
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +7 -1
- package/dist/dashboard/query-state.d.ts +48 -27
- package/dist/dashboard/query-state.d.ts.map +1 -1
- package/dist/dashboard/query-state.js +111 -57
- package/dist/dashboard/settings-section.d.ts +19 -9
- package/dist/dashboard/settings-section.d.ts.map +1 -1
- package/dist/dashboard/settings-section.js +74 -25
- package/dist/dashboard/stat-card.d.ts +44 -38
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +55 -42
- package/dist/dashboard/stat-card.module.css +46 -31
- package/dist/dashboard/stat-card.module.css.d.ts +1 -0
- package/dist/dashboard/stat-group.d.ts +41 -0
- package/dist/dashboard/stat-group.d.ts.map +1 -0
- package/dist/dashboard/stat-group.js +30 -0
- package/dist/dashboard/stat-group.module.css +66 -0
- package/dist/dashboard/stat-group.module.css.d.ts +8 -0
- package/dist/dashboard/widget-grid.d.ts +27 -0
- package/dist/dashboard/widget-grid.d.ts.map +1 -0
- package/dist/dashboard/widget-grid.js +41 -0
- package/dist/dashboard/widget-grid.module.css +53 -0
- package/dist/dashboard/widget-grid.module.css.d.ts +9 -0
- package/dist/data/data-table.d.ts +151 -12
- package/dist/data/data-table.d.ts.map +1 -1
- package/dist/data/data-table.js +384 -138
- package/dist/data/data-table.module.css +64 -0
- package/dist/data/data-table.module.css.d.ts +11 -0
- package/dist/data/index.d.ts +2 -2
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +24 -2
- package/dist/data/query-branch.d.ts +28 -0
- package/dist/data/query-branch.d.ts.map +1 -0
- package/dist/data/query-branch.js +10 -0
- package/dist/data/table.d.ts +2 -2
- package/dist/data/table.d.ts.map +1 -1
- package/dist/data/virtual-list.d.ts +65 -6
- package/dist/data/virtual-list.d.ts.map +1 -1
- package/dist/data/virtual-list.js +89 -38
- package/dist/data/virtual.d.ts +1 -1
- package/dist/data/virtual.d.ts.map +1 -1
- package/dist/forms/FormErrorSummary.d.ts +4 -3
- package/dist/forms/FormErrorSummary.d.ts.map +1 -1
- package/dist/forms/FormErrorSummary.js +6 -4
- package/dist/forms/create-form.d.ts +2 -2
- package/dist/forms/field.d.ts +46 -6
- package/dist/forms/field.d.ts.map +1 -1
- package/dist/forms/field.js +10 -5
- package/dist/forms/form-layout.d.ts +142 -0
- package/dist/forms/form-layout.d.ts.map +1 -0
- package/dist/forms/form-layout.js +110 -0
- package/dist/forms/form-layout.module.css +145 -0
- package/dist/forms/form-layout.module.css.d.ts +20 -0
- package/dist/forms/form-state.d.ts +42 -0
- package/dist/forms/form-state.d.ts.map +1 -0
- package/dist/forms/form-state.js +26 -0
- package/dist/forms/index.d.ts +22 -6
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +19 -3
- package/dist/forms/use-field-array.d.ts +60 -0
- package/dist/forms/use-field-array.d.ts.map +1 -0
- package/dist/forms/use-field-array.js +20 -0
- package/dist/forms/use-form-draft.d.ts +25 -10
- package/dist/forms/use-form-draft.d.ts.map +1 -1
- package/dist/forms/use-form-draft.js +55 -18
- package/dist/forms/use-form-submit.d.ts +88 -0
- package/dist/forms/use-form-submit.d.ts.map +1 -0
- package/dist/forms/use-form-submit.js +63 -0
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +26 -6
- package/dist/index.d.ts +10 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -4
- package/dist/nav/types.d.ts +15 -6
- package/dist/nav/types.d.ts.map +1 -1
- package/dist/notifications/bell.d.ts +3 -2
- package/dist/notifications/bell.d.ts.map +1 -1
- package/dist/notifications/bell.js +73 -56
- package/dist/notifications/center.d.ts +15 -4
- package/dist/notifications/center.d.ts.map +1 -1
- package/dist/notifications/center.js +5 -2
- package/dist/notifications/define-notifications.d.ts +56 -14
- package/dist/notifications/define-notifications.d.ts.map +1 -1
- package/dist/notifications/define-notifications.js +2 -1
- package/dist/notifications/index.d.ts +6 -2
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +5 -1
- package/dist/notifications/mount-guard.d.ts +8 -0
- package/dist/notifications/mount-guard.d.ts.map +1 -0
- package/dist/notifications/mount-guard.js +19 -0
- package/dist/notifications/notify.d.ts +58 -1
- package/dist/notifications/notify.d.ts.map +1 -1
- package/dist/notifications/notify.js +46 -2
- package/dist/notifications/overlay.d.ts.map +1 -1
- package/dist/notifications/overlay.js +2 -0
- package/dist/notifications/store.d.ts +7 -0
- package/dist/notifications/store.d.ts.map +1 -1
- package/dist/provider/index.d.ts +37 -5
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +66 -28
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/lab-theme.js +2 -1
- package/dist/query/devtools.d.ts.map +1 -1
- package/dist/query/devtools.js +1 -0
- package/dist/router-tanstack/field.d.ts +1 -1
- package/dist/router-tanstack/field.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.js +1 -1
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +1 -1
- package/dist/section/index.d.ts +1 -1
- package/dist/section/index.d.ts.map +1 -1
- package/dist/section/section.d.ts +36 -2
- package/dist/section/section.d.ts.map +1 -1
- package/dist/section/section.js +49 -57
- package/dist/section/section.module.css +11 -0
- package/dist/shell/account-types.d.ts +5 -2
- package/dist/shell/account-types.d.ts.map +1 -1
- package/dist/shell/app-brand.d.ts +13 -0
- package/dist/shell/app-brand.d.ts.map +1 -0
- package/dist/shell/app-brand.js +94 -0
- package/dist/shell/app-brand.module.css +109 -0
- package/dist/shell/app-brand.module.css.d.ts +14 -0
- package/dist/shell/app-breadcrumbs.d.ts +4 -2
- package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
- package/dist/shell/app-breadcrumbs.js +33 -22
- package/dist/shell/app-header.module.css +10 -5
- package/dist/shell/app-main.module.css +107 -0
- package/dist/shell/app-main.module.css.d.ts +11 -0
- package/dist/shell/app-mobile-nav.d.ts +3 -2
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-mobile-nav.js +29 -15
- package/dist/shell/app-mobile-nav.module.css +48 -27
- package/dist/shell/app-mobile-nav.module.css.d.ts +0 -1
- package/dist/shell/app-sidebar-account.d.ts +2 -1
- package/dist/shell/app-sidebar-account.d.ts.map +1 -1
- package/dist/shell/app-sidebar-account.js +57 -22
- package/dist/shell/app-sidebar.d.ts +9 -3
- package/dist/shell/app-sidebar.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +55 -109
- package/dist/shell/app-sidebar.module.css +53 -96
- package/dist/shell/app-sidebar.module.css.d.ts +0 -5
- package/dist/shell/index.d.ts +14 -6
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +47 -12
- package/dist/shell/isomorphic-layout-effect.d.ts +14 -0
- package/dist/shell/isomorphic-layout-effect.d.ts.map +1 -0
- package/dist/shell/isomorphic-layout-effect.js +5 -0
- package/dist/shell/mobile-nav-model.d.ts.map +1 -1
- package/dist/shell/mobile-nav-model.js +27 -6
- package/dist/shell/nav-count-badge.d.ts +5 -3
- package/dist/shell/nav-count-badge.d.ts.map +1 -1
- package/dist/shell/nav-count-badge.js +3 -1
- package/dist/shell/page-aside.d.ts +43 -0
- package/dist/shell/page-aside.d.ts.map +1 -0
- package/dist/shell/page-aside.js +202 -0
- package/dist/shell/page-aside.module.css +174 -0
- package/dist/shell/page-aside.module.css.d.ts +14 -0
- package/dist/shell/page-bar.d.ts +55 -15
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +130 -41
- package/dist/shell/page-bar.module.css +107 -13
- package/dist/shell/page-bar.module.css.d.ts +4 -1
- package/dist/shell/sidebar-search.d.ts +4 -2
- package/dist/shell/sidebar-search.d.ts.map +1 -1
- package/dist/shell/sidebar-search.js +9 -4
- package/dist/shell/sidebar-search.module.css +1 -1
- package/dist/state/fields.d.ts +23 -3
- package/dist/state/fields.d.ts.map +1 -1
- package/dist/state/fields.js +13 -2
- package/dist/state/persisted-or-local.d.ts +9 -0
- package/dist/state/persisted-or-local.d.ts.map +1 -0
- package/dist/state/persisted-or-local.js +24 -0
- package/dist/state.d.ts +1 -1
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +2 -6
- package/dist/surfaces.d.ts +12 -11
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +42 -12
- package/dist/theme/ctl-theme.d.ts.map +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +102 -17
- package/dist/theme/nav-link.module.css +37 -26
- package/dist/theme/segmented-control.module.css +22 -0
- package/dist/theme/segmented-control.module.css.d.ts +1 -0
- package/dist/theme-lab/boot.d.ts +66 -0
- package/dist/theme-lab/boot.d.ts.map +1 -0
- package/dist/theme-lab/boot.js +82 -0
- package/dist/theme-lab/index.d.ts +4 -43
- package/dist/theme-lab/index.d.ts.map +1 -1
- package/dist/theme-lab/index.js +9 -69
- package/dist/theme-toggle/index.d.ts +3 -2
- package/dist/theme-toggle/index.d.ts.map +1 -1
- package/dist/theme-toggle/index.js +8 -2
- package/dist/tokens/index.d.ts +42 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +35 -6
- package/dist/tokens/palette.d.ts +45 -25
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +31 -14
- package/dist/tokens.css +4 -5
- package/dist/utils/is-dev.d.ts +3 -0
- package/dist/utils/is-dev.d.ts.map +1 -0
- package/dist/utils/is-dev.js +6 -0
- package/dist/widget-header/delta-badge.d.ts +7 -1
- package/dist/widget-header/delta-badge.d.ts.map +1 -1
- package/dist/widget-header/delta-badge.js +8 -1
- package/dist/widget-header/index.d.ts +2 -2
- package/dist/widget-header/index.d.ts.map +1 -1
- package/dist/widget-header/index.js +3 -1
- package/dist/widget-header/widget-header.d.ts +69 -4
- package/dist/widget-header/widget-header.d.ts.map +1 -1
- package/dist/widget-header/widget-header.js +42 -27
- package/dist/widget-header/widget-header.module.css +72 -7
- package/llms.txt +6 -6
- package/package.json +49 -25
- package/src/agent/coalesce.ts +2 -1
- package/src/agent/merge.ts +2 -1
- package/src/agent/part-list.tsx +2 -0
- package/src/agent/stick-to-bottom.tsx +9 -11
- package/src/agent-chat/composer.tsx +124 -103
- package/src/agent-chat/relative-time.ts +2 -1
- package/src/agent-chat/thread-detail-panel.tsx +9 -5
- package/src/agent-chat/thread-feed-row.tsx +17 -9
- package/src/agent-chat/thread-feed.tsx +9 -3
- package/src/agent-chat/thread-message.tsx +48 -13
- package/src/agent-chat/thread-outcome-card.tsx +9 -1
- package/src/agent-chat/thread-workspace.tsx +72 -33
- package/src/agent-chat/tool-chip.tsx +8 -2
- package/src/charts/hooks/useBandPlot.ts +26 -8
- package/src/charts/index.ts +39 -4
- package/src/charts/kinds/BandStrip.tsx +36 -14
- package/src/charts/kinds/Bars.tsx +67 -16
- package/src/charts/kinds/Donut.tsx +30 -3
- package/src/charts/kinds/DualPanel.tsx +56 -10
- package/src/charts/kinds/Heatmap.tsx +90 -33
- package/src/charts/kinds/MirroredBars.tsx +21 -3
- package/src/charts/kinds/MultiLine.tsx +61 -18
- package/src/charts/kinds/StackedArea.tsx +77 -6
- package/src/charts/kinds/ZonedLine.tsx +71 -31
- package/src/charts/layout/auto-margin.ts +134 -21
- package/src/charts/layout/log-ticks.ts +90 -0
- package/src/charts/primitives/Axes.tsx +33 -5
- package/src/charts/primitives/CartesianChart.tsx +194 -41
- package/src/charts/primitives/ChartCard.tsx +66 -25
- package/src/charts/primitives/ChartFrame.tsx +107 -26
- package/src/charts/primitives/ChartLegend.tsx +43 -13
- package/src/charts/primitives/ChartPending.tsx +185 -7
- package/src/charts/primitives/ChartTooltip.tsx +37 -5
- package/src/charts/primitives/Crosshair.tsx +6 -3
- package/src/charts/primitives/chart-frame-layout.ts +212 -0
- package/src/charts/primitives/chart-tier.tsx +37 -0
- package/src/charts/series.ts +77 -1
- package/src/charts/sparklines/BarSparkline.tsx +11 -3
- package/src/charts/sparklines/LineSparkline.tsx +18 -4
- package/src/charts/sparklines/index.ts +2 -2
- package/src/charts/utils/format.ts +163 -2
- package/src/charts/utils/ticks.ts +149 -4
- package/src/cli/index.ts +8 -3
- package/src/commands/ShortcutsHelp.tsx +10 -3
- package/src/commands/define-commands.ts +2 -2
- package/src/commands/define-overlays.ts +216 -1
- package/src/commands/index.ts +12 -0
- package/src/commands/overlays-mount.tsx +60 -26
- package/src/common/errors.ts +73 -0
- package/src/common/index.ts +21 -0
- package/src/common/props.ts +71 -0
- package/src/common/query-state-like.ts +64 -0
- package/src/common/refs.ts +58 -0
- package/src/common/scroll-parent.ts +42 -0
- package/src/common/validate.ts +94 -0
- package/src/connectivity/connectivity-indicator.tsx +6 -1
- package/src/connectivity/connectivity-provider.tsx +4 -1
- package/src/connectivity/index.ts +1 -0
- package/src/connectivity/types.ts +5 -2
- package/src/connectivity/use-connectivity.ts +3 -2
- package/src/content/article-layout.module.css +11 -4
- package/src/content/callout.tsx +13 -7
- package/src/content/guide.tsx +14 -4
- package/src/content/heading-anchor.tsx +14 -3
- package/src/content/index.ts +2 -0
- package/src/content/markdown.tsx +2 -0
- package/src/content/prose.module.css +9 -7
- package/src/content/reading-progress.tsx +40 -15
- package/src/content/slug.ts +4 -0
- package/src/content/toc.tsx +47 -10
- package/src/controls/actions.tsx +89 -9
- package/src/controls/compare-filter.tsx +20 -3
- package/src/controls/control-group.tsx +11 -4
- package/src/controls/controls.module.css +169 -186
- package/src/controls/controls.module.css.d.ts +9 -11
- package/src/controls/enum-filter.tsx +32 -16
- package/src/controls/filter-context.tsx +14 -6
- package/src/controls/filter-pill.tsx +6 -3
- package/src/controls/filter-set.tsx +32 -13
- package/src/controls/filter-sheet.tsx +44 -194
- package/src/controls/index.ts +7 -0
- package/src/controls/multi-select-filter.tsx +177 -27
- package/src/controls/number-filter.tsx +61 -23
- package/src/controls/panel-row.module.css +86 -0
- package/src/controls/panel-row.module.css.d.ts +13 -0
- package/src/controls/panel-row.tsx +392 -0
- package/src/controls/range-filter.tsx +76 -39
- package/src/controls/search-filter.tsx +30 -12
- package/src/controls/select-filter.tsx +11 -1
- package/src/controls/slider-control.tsx +159 -0
- package/src/controls/sync-button.tsx +13 -3
- package/src/controls/toggle-filter.tsx +36 -16
- package/src/controls/view-tabs.tsx +63 -11
- package/src/controls-dates/date-range-picker.tsx +8 -1
- package/src/dashboard/delta-badge.tsx +5 -1
- package/src/dashboard/empty-state.tsx +72 -25
- package/src/dashboard/index.ts +13 -1
- package/src/dashboard/query-state.tsx +154 -84
- package/src/dashboard/settings-section.tsx +87 -31
- package/src/dashboard/stat-card.module.css +46 -31
- package/src/dashboard/stat-card.module.css.d.ts +1 -0
- package/src/dashboard/stat-card.tsx +185 -127
- package/src/dashboard/stat-group.module.css +66 -0
- package/src/dashboard/stat-group.module.css.d.ts +8 -0
- package/src/dashboard/stat-group.tsx +74 -0
- package/src/dashboard/widget-grid.module.css +53 -0
- package/src/dashboard/widget-grid.module.css.d.ts +9 -0
- package/src/dashboard/widget-grid.tsx +127 -0
- package/src/data/data-table.module.css +64 -0
- package/src/data/data-table.module.css.d.ts +11 -0
- package/src/data/data-table.tsx +919 -346
- package/src/data/index.ts +30 -2
- package/src/data/query-branch.ts +53 -0
- package/src/data/table.ts +5 -0
- package/src/data/virtual-list.tsx +189 -55
- package/src/data/virtual.ts +5 -1
- package/src/forms/FormErrorSummary.tsx +13 -6
- package/src/forms/create-form.ts +2 -2
- package/src/forms/field.ts +60 -11
- package/src/forms/form-layout.module.css +145 -0
- package/src/forms/form-layout.module.css.d.ts +20 -0
- package/src/forms/form-layout.tsx +305 -0
- package/src/forms/form-state.tsx +94 -0
- package/src/forms/index.ts +38 -7
- package/src/forms/use-field-array.ts +94 -0
- package/src/forms/use-form-draft.ts +145 -53
- package/src/forms/use-form-submit.ts +199 -0
- package/src/guard/index.ts +73 -18
- package/src/index.ts +74 -10
- package/src/nav/types.ts +15 -6
- package/src/notifications/bell.tsx +18 -4
- package/src/notifications/center.tsx +18 -5
- package/src/notifications/define-notifications.ts +64 -18
- package/src/notifications/index.ts +12 -1
- package/src/notifications/mount-guard.ts +41 -0
- package/src/notifications/notify.tsx +122 -3
- package/src/notifications/overlay.tsx +2 -0
- package/src/notifications/store.ts +7 -0
- package/src/provider/index.tsx +101 -13
- package/src/provider/lab-theme.ts +2 -1
- package/src/query/devtools.tsx +1 -0
- package/src/router-tanstack/field.ts +1 -0
- package/src/router-tanstack/search-store.ts +3 -10
- package/src/router-tanstack/use-nav.ts +18 -13
- package/src/section/index.ts +1 -1
- package/src/section/section.module.css +11 -0
- package/src/section/section.tsx +163 -96
- package/src/shell/account-types.ts +5 -2
- package/src/shell/app-brand.module.css +109 -0
- package/src/shell/app-brand.module.css.d.ts +14 -0
- package/src/shell/app-brand.tsx +140 -0
- package/src/shell/app-breadcrumbs.tsx +19 -9
- package/src/shell/app-header.module.css +10 -5
- package/src/shell/app-main.module.css +107 -0
- package/src/shell/app-main.module.css.d.ts +11 -0
- package/src/shell/app-mobile-nav.module.css +48 -27
- package/src/shell/app-mobile-nav.module.css.d.ts +0 -1
- package/src/shell/app-mobile-nav.tsx +43 -11
- package/src/shell/app-sidebar-account.tsx +29 -6
- package/src/shell/app-sidebar.module.css +53 -96
- package/src/shell/app-sidebar.module.css.d.ts +0 -5
- package/src/shell/app-sidebar.tsx +40 -113
- package/src/shell/index.tsx +156 -65
- package/src/shell/isomorphic-layout-effect.ts +14 -0
- package/src/shell/mobile-nav-model.ts +66 -10
- package/src/shell/nav-count-badge.tsx +6 -1
- package/src/shell/page-aside.module.css +174 -0
- package/src/shell/page-aside.module.css.d.ts +14 -0
- package/src/shell/page-aside.tsx +377 -0
- package/src/shell/page-bar.module.css +107 -13
- package/src/shell/page-bar.module.css.d.ts +4 -1
- package/src/shell/page-bar.tsx +294 -94
- package/src/shell/sidebar-search.module.css +1 -1
- package/src/shell/sidebar-search.tsx +13 -4
- package/src/state/fields.ts +43 -10
- package/src/state/persisted-or-local.ts +50 -0
- package/src/state.ts +0 -9
- package/src/surfaces.ts +42 -12
- package/src/theme/ctl-theme.tsx +10 -0
- package/src/theme/index.ts +129 -16
- package/src/theme/nav-link.module.css +37 -26
- package/src/theme/segmented-control.module.css +22 -0
- package/src/theme/segmented-control.module.css.d.ts +1 -0
- package/src/theme-lab/boot.ts +140 -0
- package/src/theme-lab/index.tsx +21 -112
- package/src/theme-toggle/index.tsx +10 -3
- package/src/tokens/index.ts +50 -6
- package/src/tokens/palette.ts +58 -30
- package/src/utils/is-dev.ts +4 -0
- package/src/widget-header/delta-badge.tsx +25 -5
- package/src/widget-header/index.ts +10 -2
- package/src/widget-header/widget-header.module.css +72 -7
- package/src/widget-header/widget-header.tsx +150 -71
- package/dist/agent/adapter.test.d.ts +0 -2
- package/dist/agent/adapter.test.d.ts.map +0 -1
- package/dist/agent/ai-sdk-transport.test.d.ts +0 -2
- package/dist/agent/ai-sdk-transport.test.d.ts.map +0 -1
- package/dist/agent/coalesce.test.d.ts +0 -2
- package/dist/agent/coalesce.test.d.ts.map +0 -1
- package/dist/agent/foreign.test.d.ts +0 -2
- package/dist/agent/foreign.test.d.ts.map +0 -1
- package/dist/agent/id.test.d.ts +0 -2
- package/dist/agent/id.test.d.ts.map +0 -1
- package/dist/agent/merge.test.d.ts +0 -2
- package/dist/agent/merge.test.d.ts.map +0 -1
- package/dist/agent/part-list.test.d.ts +0 -2
- package/dist/agent/part-list.test.d.ts.map +0 -1
- package/dist/agent/parts.test.d.ts +0 -2
- package/dist/agent/parts.test.d.ts.map +0 -1
- package/dist/agent/thread.test.d.ts +0 -2
- package/dist/agent/thread.test.d.ts.map +0 -1
- package/dist/agent/transport.test.d.ts +0 -2
- package/dist/agent/transport.test.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.test.d.ts +0 -2
- package/dist/agent/use-agent-stream.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts.map +0 -1
- package/dist/agent-chat/composer.test.d.ts +0 -2
- package/dist/agent-chat/composer.test.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.test.d.ts +0 -2
- package/dist/agent-chat/relative-time.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed-row.test.d.ts +0 -2
- package/dist/agent-chat/thread-feed-row.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.test.d.ts +0 -2
- package/dist/agent-chat/thread-feed.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.test.d.ts +0 -2
- package/dist/agent-chat/thread-message.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.test.d.ts +0 -2
- package/dist/agent-chat/thread-workspace.test.d.ts.map +0 -1
- package/dist/agent-chat/tool-chip.test.d.ts +0 -2
- package/dist/agent-chat/tool-chip.test.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.type-guard.test.d.ts +0 -2
- package/dist/agent-chat/virtualize.type-guard.test.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.test.d.ts +0 -2
- package/dist/charts/cursor/resolve.test.d.ts.map +0 -1
- package/dist/charts/cursor/store.test.d.ts +0 -2
- package/dist/charts/cursor/store.test.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.test.d.ts +0 -2
- package/dist/charts/kinds/BandStrip.test.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.test.d.ts +0 -2
- package/dist/charts/kinds/Bars.test.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.test.d.ts +0 -2
- package/dist/charts/kinds/DualPanel.test.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.test.d.ts +0 -2
- package/dist/charts/kinds/MirroredBars.test.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.test.d.ts +0 -2
- package/dist/charts/kinds/MultiLine.test.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.test.d.ts +0 -2
- package/dist/charts/kinds/StackedArea.test.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.test.d.ts +0 -2
- package/dist/charts/kinds/ZonedLine.test.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.test.d.ts +0 -2
- package/dist/charts/layout/auto-margin.test.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.test.d.ts +0 -2
- package/dist/charts/primitives/CartesianChart.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.test.d.ts +0 -2
- package/dist/charts/primitives/ChartCard.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.test.d.ts +0 -2
- package/dist/charts/primitives/ChartFrame.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.test.d.ts +0 -2
- package/dist/charts/primitives/ChartLegend.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.test.d.ts +0 -2
- package/dist/charts/primitives/ChartTooltip.test.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.test.d.ts +0 -2
- package/dist/charts/primitives/XZoneRects.test.d.ts.map +0 -1
- package/dist/charts/series.test.d.ts +0 -2
- package/dist/charts/series.test.d.ts.map +0 -1
- package/dist/charts/utils/domain.test.d.ts +0 -2
- package/dist/charts/utils/domain.test.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.test.d.ts +0 -2
- package/dist/charts/utils/measure-text.test.d.ts.map +0 -1
- package/dist/cli/check-coverage.test.d.ts +0 -2
- package/dist/cli/check-coverage.test.d.ts.map +0 -1
- package/dist/cli/check-theme.test.d.ts +0 -2
- package/dist/cli/check-theme.test.d.ts.map +0 -1
- package/dist/cli/help.test.d.ts +0 -2
- package/dist/cli/help.test.d.ts.map +0 -1
- package/dist/cli/init-sync.test.d.ts +0 -2
- package/dist/cli/init-sync.test.d.ts.map +0 -1
- package/dist/cli/placement-engine.test.d.ts +0 -2
- package/dist/cli/placement-engine.test.d.ts.map +0 -1
- package/dist/cli/shipped-versions.test.d.ts +0 -2
- package/dist/cli/shipped-versions.test.d.ts.map +0 -1
- package/dist/cli/tarball-parity.test.d.ts +0 -2
- package/dist/cli/tarball-parity.test.d.ts.map +0 -1
- package/dist/cli/template-format.test.d.ts +0 -2
- package/dist/cli/template-format.test.d.ts.map +0 -1
- package/dist/cli/template-ledger.test.d.ts +0 -2
- package/dist/cli/template-ledger.test.d.ts.map +0 -1
- package/dist/cli/tokens-css.test.d.ts +0 -2
- package/dist/cli/tokens-css.test.d.ts.map +0 -1
- package/dist/cli/toolchain-wiring.test.d.ts +0 -2
- package/dist/cli/toolchain-wiring.test.d.ts.map +0 -1
- package/dist/cli/waiver-audit.test.d.ts +0 -2
- package/dist/cli/waiver-audit.test.d.ts.map +0 -1
- package/dist/content/article-actions.test.d.ts +0 -2
- package/dist/content/article-actions.test.d.ts.map +0 -1
- package/dist/content/article-model.test.d.ts +0 -2
- package/dist/content/article-model.test.d.ts.map +0 -1
- package/dist/content/block-split.test.d.ts +0 -2
- package/dist/content/block-split.test.d.ts.map +0 -1
- package/dist/content/heading-components.test.d.ts +0 -2
- package/dist/content/heading-components.test.d.ts.map +0 -1
- package/dist/content/markdown.test.d.ts +0 -2
- package/dist/content/markdown.test.d.ts.map +0 -1
- package/dist/content/prose.module.css.test.d.ts +0 -2
- package/dist/content/prose.module.css.test.d.ts.map +0 -1
- package/dist/content/sanitize.test.d.ts +0 -2
- package/dist/content/sanitize.test.d.ts.map +0 -1
- package/dist/content/slug.test.d.ts +0 -2
- package/dist/content/slug.test.d.ts.map +0 -1
- package/dist/controls/actions.test.d.ts +0 -2
- package/dist/controls/actions.test.d.ts.map +0 -1
- package/dist/controls/actions.type-guard.test.d.ts +0 -2
- package/dist/controls/actions.type-guard.test.d.ts.map +0 -1
- package/dist/controls/control-group.test.d.ts +0 -2
- package/dist/controls/control-group.test.d.ts.map +0 -1
- package/dist/controls/controls.router.test.d.ts +0 -2
- package/dist/controls/controls.router.test.d.ts.map +0 -1
- package/dist/controls/filter-set.test.d.ts +0 -2
- package/dist/controls/filter-set.test.d.ts.map +0 -1
- package/dist/controls/peer-boundary.test.d.ts +0 -2
- package/dist/controls/peer-boundary.test.d.ts.map +0 -1
- package/dist/controls/props-contract.test.d.ts +0 -2
- package/dist/controls/props-contract.test.d.ts.map +0 -1
- package/dist/controls/range-filter.type-guard.test.d.ts +0 -2
- package/dist/controls/range-filter.type-guard.test.d.ts.map +0 -1
- package/dist/controls/sync-button.test.d.ts +0 -2
- package/dist/controls/sync-button.test.d.ts.map +0 -1
- package/dist/dashboard/query-state.test.d.ts +0 -2
- package/dist/dashboard/query-state.test.d.ts.map +0 -1
- package/dist/dashboard/settings-section.test.d.ts +0 -2
- package/dist/dashboard/settings-section.test.d.ts.map +0 -1
- package/dist/dashboard/stat-card.test.d.ts +0 -2
- package/dist/dashboard/stat-card.test.d.ts.map +0 -1
- package/dist/data/data-table.test.d.ts +0 -2
- package/dist/data/data-table.test.d.ts.map +0 -1
- package/dist/guard/check-source.test.d.ts +0 -2
- package/dist/guard/check-source.test.d.ts.map +0 -1
- package/dist/guard/grace.test.d.ts +0 -20
- package/dist/guard/grace.test.d.ts.map +0 -1
- package/dist/guard/guard-hook.test.d.ts +0 -2
- package/dist/guard/guard-hook.test.d.ts.map +0 -1
- package/dist/provider/index.test.d.ts +0 -2
- package/dist/provider/index.test.d.ts.map +0 -1
- package/dist/provider/lab-theme.test.d.ts +0 -2
- package/dist/provider/lab-theme.test.d.ts.map +0 -1
- package/dist/query/error-message.test.d.ts +0 -2
- package/dist/query/error-message.test.d.ts.map +0 -1
- package/dist/router-tanstack/multi-search-param-store.test.d.ts +0 -2
- package/dist/router-tanstack/multi-search-param-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/nav.test.d.ts +0 -2
- package/dist/router-tanstack/nav.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-param-store.test.d.ts +0 -2
- package/dist/router-tanstack/search-param-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-store.router.test.d.ts +0 -2
- package/dist/router-tanstack/search-store.router.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-store.test.d.ts +0 -2
- package/dist/router-tanstack/search-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/use-nav.test.d.ts +0 -2
- package/dist/router-tanstack/use-nav.test.d.ts.map +0 -1
- package/dist/section/section.test.d.ts +0 -2
- package/dist/section/section.test.d.ts.map +0 -1
- package/dist/shell/app-mobile-nav.test.d.ts +0 -2
- package/dist/shell/app-mobile-nav.test.d.ts.map +0 -1
- package/dist/shell/app-sidebar.test.d.ts +0 -2
- package/dist/shell/app-sidebar.test.d.ts.map +0 -1
- package/dist/shell/index.test.d.ts +0 -2
- package/dist/shell/index.test.d.ts.map +0 -1
- package/dist/shell/mobile-nav-model.test.d.ts +0 -2
- package/dist/shell/mobile-nav-model.test.d.ts.map +0 -1
- package/dist/shell/page-bar.test.d.ts +0 -2
- package/dist/shell/page-bar.test.d.ts.map +0 -1
- package/dist/state/fields.test.d.ts +0 -2
- package/dist/state/fields.test.d.ts.map +0 -1
- package/dist/state/persisted.test.d.ts +0 -2
- package/dist/state/persisted.test.d.ts.map +0 -1
- package/dist/styles.floor.test.d.ts +0 -2
- package/dist/styles.floor.test.d.ts.map +0 -1
- package/dist/theme/border-coverage.test.d.ts +0 -18
- package/dist/theme/border-coverage.test.d.ts.map +0 -1
- package/dist/theme/contrast.test.d.ts +0 -2
- package/dist/theme/contrast.test.d.ts.map +0 -1
- package/dist/theme/ctl-theme.test.d.ts +0 -2
- package/dist/theme/ctl-theme.test.d.ts.map +0 -1
- package/dist/theme/ctl-tier-coverage.test.d.ts +0 -2
- package/dist/theme/ctl-tier-coverage.test.d.ts.map +0 -1
- package/dist/theme/density-option.test.d.ts +0 -2
- package/dist/theme/density-option.test.d.ts.map +0 -1
- package/dist/theme/density-relations.test.d.ts +0 -2
- package/dist/theme/density-relations.test.d.ts.map +0 -1
- package/dist/theme/derive-theme.test.d.ts +0 -2
- package/dist/theme/derive-theme.test.d.ts.map +0 -1
- package/dist/theme/divider-law.test.d.ts +0 -2
- package/dist/theme/divider-law.test.d.ts.map +0 -1
- package/dist/theme/fonts-option.test.d.ts +0 -2
- package/dist/theme/fonts-option.test.d.ts.map +0 -1
- package/dist/theme/icon-slot.test.d.ts +0 -2
- package/dist/theme/icon-slot.test.d.ts.map +0 -1
- package/dist/theme/layout-rhythm-css.test.d.ts +0 -2
- package/dist/theme/layout-rhythm-css.test.d.ts.map +0 -1
- package/dist/theme/radius-option.test.d.ts +0 -2
- package/dist/theme/radius-option.test.d.ts.map +0 -1
- package/dist/theme/radius.test.d.ts +0 -2
- package/dist/theme/radius.test.d.ts.map +0 -1
- package/dist/theme/shadow-surfaces.test.d.ts +0 -26
- package/dist/theme/shadow-surfaces.test.d.ts.map +0 -1
- package/dist/theme/spacing.test.d.ts +0 -2
- package/dist/theme/spacing.test.d.ts.map +0 -1
- package/dist/theme/use-basalt-spacing.test.d.ts +0 -2
- package/dist/theme/use-basalt-spacing.test.d.ts.map +0 -1
- package/dist/theme-lab/derive-controls.test.d.ts +0 -2
- package/dist/theme-lab/derive-controls.test.d.ts.map +0 -1
- package/dist/theme-lab/derive-state.test.d.ts +0 -2
- package/dist/theme-lab/derive-state.test.d.ts.map +0 -1
- package/dist/theme-lab/theme-lab.test.d.ts +0 -2
- package/dist/theme-lab/theme-lab.test.d.ts.map +0 -1
- package/dist/tokens/build-fonts-css.test.d.ts +0 -2
- package/dist/tokens/build-fonts-css.test.d.ts.map +0 -1
- package/dist/tokens/build-radius-css.test.d.ts +0 -2
- package/dist/tokens/build-radius-css.test.d.ts.map +0 -1
- package/dist/tokens/chart-margin.test.d.ts +0 -2
- package/dist/tokens/chart-margin.test.d.ts.map +0 -1
- package/dist/tokens/density.test.d.ts +0 -2
- package/dist/tokens/density.test.d.ts.map +0 -1
- package/dist/tokens/derive-radius.test.d.ts +0 -2
- package/dist/tokens/derive-radius.test.d.ts.map +0 -1
- package/dist/tokens/derive.test.d.ts +0 -2
- package/dist/tokens/derive.test.d.ts.map +0 -1
- package/dist/tokens/palette.test.d.ts +0 -2
- package/dist/tokens/palette.test.d.ts.map +0 -1
- package/dist/tokens/text-scale.test.d.ts +0 -2
- package/dist/tokens/text-scale.test.d.ts.map +0 -1
- package/dist/vite-color-mix.test.d.ts +0 -2
- package/dist/vite-color-mix.test.d.ts.map +0 -1
- package/dist/vite.test.d.ts +0 -2
- package/dist/vite.test.d.ts.map +0 -1
- package/dist/widget-header/delta-badge.test.d.ts +0 -2
- package/dist/widget-header/delta-badge.test.d.ts.map +0 -1
- package/dist/widget-header/no-mantine.test.d.ts +0 -2
- package/dist/widget-header/no-mantine.test.d.ts.map +0 -1
- package/dist/widget-header/widget-header.test.d.ts +0 -2
- package/dist/widget-header/widget-header.test.d.ts.map +0 -1
- package/src/agent/adapter.test.ts +0 -1640
- package/src/agent/ai-sdk-transport.test.ts +0 -658
- package/src/agent/coalesce.test.ts +0 -387
- package/src/agent/foreign.test.ts +0 -51
- package/src/agent/id.test.ts +0 -169
- package/src/agent/merge.test.ts +0 -206
- package/src/agent/part-list.test.tsx +0 -112
- package/src/agent/parts.test.ts +0 -720
- package/src/agent/thread.test.ts +0 -220
- package/src/agent/transport.test.ts +0 -70
- package/src/agent/use-agent-stream.test.tsx +0 -287
- package/src/agent/use-agent-thread-runs.foreign.test.tsx +0 -138
- package/src/agent/use-agent-thread-runs.resume.test.tsx +0 -294
- package/src/agent/use-agent-thread-runs.test.tsx +0 -1120
- package/src/agent/use-agent-thread-runs.wedge.test.tsx +0 -387
- package/src/agent-chat/composer.test.tsx +0 -924
- package/src/agent-chat/relative-time.test.ts +0 -95
- package/src/agent-chat/thread-feed-row.test.tsx +0 -510
- package/src/agent-chat/thread-feed.test.tsx +0 -241
- package/src/agent-chat/thread-message.test.tsx +0 -1285
- package/src/agent-chat/thread-workspace.test.tsx +0 -169
- package/src/agent-chat/tool-chip.test.tsx +0 -139
- package/src/agent-chat/virtualize.type-guard.test.ts +0 -49
- package/src/charts/cursor/resolve.test.ts +0 -151
- package/src/charts/cursor/store.test.ts +0 -64
- package/src/charts/kinds/BandStrip.test.tsx +0 -282
- package/src/charts/kinds/Bars.test.tsx +0 -183
- package/src/charts/kinds/DualPanel.test.tsx +0 -527
- package/src/charts/kinds/MirroredBars.test.tsx +0 -232
- package/src/charts/kinds/MultiLine.test.tsx +0 -218
- package/src/charts/kinds/StackedArea.test.tsx +0 -114
- package/src/charts/kinds/ZonedLine.test.tsx +0 -147
- package/src/charts/layout/auto-margin.test.ts +0 -42
- package/src/charts/primitives/CartesianChart.test.tsx +0 -647
- package/src/charts/primitives/ChartCard.test.tsx +0 -66
- package/src/charts/primitives/ChartFrame.test.tsx +0 -142
- package/src/charts/primitives/ChartLegend.test.tsx +0 -78
- package/src/charts/primitives/ChartTooltip.test.tsx +0 -44
- package/src/charts/primitives/XZoneRects.test.tsx +0 -123
- package/src/charts/series.test.ts +0 -112
- package/src/charts/utils/domain.test.ts +0 -54
- package/src/charts/utils/measure-text.test.ts +0 -36
- package/src/cli/check-coverage.test.ts +0 -297
- package/src/cli/check-theme.test.ts +0 -837
- package/src/cli/help.test.ts +0 -170
- package/src/cli/init-sync.test.ts +0 -343
- package/src/cli/placement-engine.test.ts +0 -298
- package/src/cli/shipped-versions.test.ts +0 -83
- package/src/cli/tarball-parity.test.ts +0 -44
- package/src/cli/template-format.test.ts +0 -64
- package/src/cli/template-ledger.test.ts +0 -219
- package/src/cli/tokens-css.test.ts +0 -249
- package/src/cli/toolchain-wiring.test.ts +0 -1358
- package/src/cli/waiver-audit.test.ts +0 -215
- package/src/content/article-actions.test.ts +0 -78
- package/src/content/article-model.test.ts +0 -119
- package/src/content/block-split.test.ts +0 -75
- package/src/content/heading-components.test.tsx +0 -65
- package/src/content/markdown.test.tsx +0 -603
- package/src/content/prose.module.css.test.ts +0 -39
- package/src/content/sanitize.test.ts +0 -659
- package/src/content/slug.test.ts +0 -62
- package/src/controls/actions.test.tsx +0 -252
- package/src/controls/actions.type-guard.test.ts +0 -63
- package/src/controls/control-group.test.tsx +0 -229
- package/src/controls/controls.router.test.tsx +0 -1053
- package/src/controls/filter-set.test.tsx +0 -472
- package/src/controls/peer-boundary.test.ts +0 -85
- package/src/controls/props-contract.test.tsx +0 -137
- package/src/controls/range-filter.type-guard.test.tsx +0 -122
- package/src/controls/sync-button.test.tsx +0 -183
- package/src/dashboard/query-state.test.tsx +0 -152
- package/src/dashboard/settings-section.test.tsx +0 -56
- package/src/dashboard/stat-card.test.tsx +0 -385
- package/src/data/data-table.test.tsx +0 -434
- package/src/guard/check-source.test.ts +0 -3388
- package/src/guard/grace.test.ts +0 -158
- package/src/guard/guard-hook.test.ts +0 -203
- package/src/provider/index.test.tsx +0 -101
- package/src/provider/lab-theme.test.ts +0 -147
- package/src/query/error-message.test.ts +0 -67
- package/src/router-tanstack/multi-search-param-store.test.ts +0 -124
- package/src/router-tanstack/nav.test.ts +0 -111
- package/src/router-tanstack/search-param-store.test.ts +0 -135
- package/src/router-tanstack/search-store.router.test.tsx +0 -882
- package/src/router-tanstack/search-store.test.ts +0 -578
- package/src/router-tanstack/use-nav.test.tsx +0 -187
- package/src/section/section.test.tsx +0 -204
- package/src/shell/app-mobile-nav.test.tsx +0 -403
- package/src/shell/app-sidebar.test.tsx +0 -509
- package/src/shell/index.test.tsx +0 -428
- package/src/shell/mobile-nav-model.test.ts +0 -517
- package/src/shell/page-bar.test.tsx +0 -316
- package/src/state/fields.test.tsx +0 -512
- package/src/state/persisted.test.ts +0 -91
- package/src/styles.floor.test.ts +0 -36
- package/src/theme/border-coverage.test.ts +0 -272
- package/src/theme/contrast.test.ts +0 -354
- package/src/theme/ctl-theme.test.tsx +0 -275
- package/src/theme/ctl-tier-coverage.test.ts +0 -170
- package/src/theme/density-option.test.ts +0 -96
- package/src/theme/density-relations.test.ts +0 -506
- package/src/theme/derive-theme.test.ts +0 -101
- package/src/theme/divider-law.test.ts +0 -259
- package/src/theme/fonts-option.test.ts +0 -75
- package/src/theme/icon-slot.test.tsx +0 -275
- package/src/theme/layout-rhythm-css.test.ts +0 -72
- package/src/theme/radius-option.test.ts +0 -86
- package/src/theme/radius.test.ts +0 -142
- package/src/theme/shadow-surfaces.test.ts +0 -488
- package/src/theme/spacing.test.ts +0 -495
- package/src/theme/use-basalt-spacing.test.tsx +0 -55
- package/src/theme-lab/derive-controls.test.ts +0 -94
- package/src/theme-lab/derive-state.test.ts +0 -71
- package/src/theme-lab/theme-lab.test.ts +0 -46
- package/src/tokens/build-fonts-css.test.ts +0 -52
- package/src/tokens/build-radius-css.test.ts +0 -25
- package/src/tokens/chart-margin.test.ts +0 -39
- package/src/tokens/density.test.ts +0 -259
- package/src/tokens/derive-radius.test.ts +0 -62
- package/src/tokens/derive.test.ts +0 -30
- package/src/tokens/palette.test.ts +0 -114
- package/src/tokens/text-scale.test.ts +0 -51
- package/src/vite-color-mix.test.ts +0 -46
- package/src/vite.test.ts +0 -423
- package/src/widget-header/delta-badge.test.tsx +0 -60
- package/src/widget-header/no-mantine.test.ts +0 -33
- package/src/widget-header/widget-header.test.tsx +0 -187
|
@@ -1,488 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shadow-surface coverage — closes a class of bug `check-theme`'s regex scans cannot see: applying
|
|
3
|
-
* the depth token to the WRONG box.
|
|
4
|
-
*
|
|
5
|
-
* `--vx-shadow-card` (and `--vx-shadow-ctrl`/`--vx-shadow-raised`) bakes a 1px ring into the shadow
|
|
6
|
-
* value itself (see
|
|
7
|
-
* `tokens/palette.ts`'s `SHADOW`). THE INVARIANT: an element applying the token must carry the
|
|
8
|
-
* surface's OWN `border-radius` — the ring is drawn by the shadow's rendering box and follows THAT
|
|
9
|
-
* box's own corners, not any other element's. We shipped a bug where `box-shadow: var(--vx-shadow-
|
|
10
|
-
* card)` landed on Mantine's Input WRAPPER, a bare `position: relative` box with `border-radius: 0`
|
|
11
|
-
* against an 8px rounded `<input>` inside it. The ring rendered square around a rounded corner,
|
|
12
|
-
* leaking visible grey nubs — a radius mismatch, not a missing background. (A shadowed box need not
|
|
13
|
-
* paint its OWN background: the ring is bound to the box's RADIUS, not its background — a transparent
|
|
14
|
-
* shadow box whose fill lives on a separate, identically-rounded box is legal as long as the two
|
|
15
|
-
* radii match. Background usually DOES co-locate, since most surfaces declare both on the same box —
|
|
16
|
-
* but it is the radius, not the background, that the ring is contractually bound to.) Nothing short of a
|
|
17
|
-
* mechanical inventory of every site that APPLIES the token would have caught it: a source-level
|
|
18
|
-
* guard can only flag a bad value, never a bad ELEMENT.
|
|
19
|
-
*
|
|
20
|
-
* `--vx-shadow-raised`'s ring is INSET rather than outset, which changes nothing about the
|
|
21
|
-
* invariant: an inset ring is still drawn by the shadow's rendering box and still follows that
|
|
22
|
-
* box's own corners, so a radius mismatch leaks the same way (nubs on the inside of the corner
|
|
23
|
-
* instead of the outside). It is registered here for exactly the same reason as the other two.
|
|
24
|
-
*
|
|
25
|
-
* This test IS that inventory: it scans basalt-ui's own source for every place that applies
|
|
26
|
-
* `--vx-shadow-card`/`--vx-shadow-ctrl`/`--vx-shadow-raised` (a `box-shadow`/CSS-custom-property
|
|
27
|
-
* declaration in `*.module.css`, or a `boxShadow` object property — literal, `VX.shadowCard`/
|
|
28
|
-
* `VX.shadowCtrl`/`VX.shadowRaised`, or a template-literal composite of any — in `*.ts`/`*.tsx`)
|
|
29
|
-
* and asserts every one is registered in
|
|
30
|
-
* `SHADOW_SURFACES` below with a written `roundedBy` reason naming exactly where that box's
|
|
31
|
-
* `border-radius` comes from. Mere mentions in comments/docstrings and the token DEFINITION itself
|
|
32
|
-
* (`tokens/index.ts`, `tokens/palette.ts`) are excluded — this test only cares about APPLICATION.
|
|
33
|
-
*
|
|
34
|
-
* `roundedBy` is a REASON, not a rubber stamp: for several sites the radius is not co-declared on
|
|
35
|
-
* the same object/rule but arrives through a Mantine CSS var resolved elsewhere (`--button-radius`,
|
|
36
|
-
* `--ai-radius`, `--chip-radius`, `--input-radius`, `--card-radius`, `--notification-radius`) or an
|
|
37
|
-
* inline `styles.root.borderRadius` set in a different block of `theme/index.ts` (NavLink) — the
|
|
38
|
-
* whole point of writing it down is forcing whoever adds a new site to go verify that chain against
|
|
39
|
-
* Mantine's actual shipped CSS (`@mantine/core/styles/*.css`), not just copy the shadow line. A box
|
|
40
|
-
* that legitimately has `border-radius: 0` (a genuinely square surface) is a VALID reason too — say
|
|
41
|
-
* so plainly; a square ring on a square surface is correct, not a gap.
|
|
42
|
-
*
|
|
43
|
-
* THIS TEST IS DELIBERATELY COUPLED TO OUR OWN SOURCE. Adding a new `box-shadow: var(--vx-shadow-
|
|
44
|
-
* card)` (or `-ctrl`/`-raised`) anywhere SHOULD fail this test until it's registered — that failure
|
|
45
|
-
* IS the point. A NEW depth token is the one case the scan cannot fail loudly on: the two regexes
|
|
46
|
-
* below name their tokens explicitly, so an unlisted `--vx-shadow-*` slips through silently and
|
|
47
|
-
* vacuously. Adding a token to `SHADOW` therefore means adding it to BOTH regexes in the same
|
|
48
|
-
* commit — `raised` is the precedent.
|
|
49
|
-
* Do NOT "fix" a future failure by loosening the scan or bulk-registering with a placeholder
|
|
50
|
-
* reason; open the file, find the element the shadow is declared on, prove (or fix) that IT carries
|
|
51
|
-
* the surface's own border-radius, and write down where that radius comes from.
|
|
52
|
-
*
|
|
53
|
-
* NOTE — `overflow: hidden` does NOT threaten a box's own ring. An element's own outset `box-shadow`
|
|
54
|
-
* is painted outside its border box and is NOT clipped by that element's own `overflow` (only an
|
|
55
|
-
* ANCESTOR's overflow clips a descendant's shadow — verified in a browser). So a surface may safely
|
|
56
|
-
* carry `--vx-shadow-card` AND `overflow: hidden` on the SAME box (e.g. StatCard clipping a full-bleed
|
|
57
|
-
* sparkline). The outer/inner split some surfaces use (ChartCard) is about letting a DESCENDANT — an
|
|
58
|
-
* info-tooltip bubble — escape the clip, not about protecting the ring.
|
|
59
|
-
*/
|
|
60
|
-
import { readdirSync, readFileSync } from 'node:fs'
|
|
61
|
-
import { dirname, join, relative } from 'node:path'
|
|
62
|
-
import { fileURLToPath } from 'node:url'
|
|
63
|
-
import { describe, expect, test } from 'bun:test'
|
|
64
|
-
|
|
65
|
-
// ── Source scan ─────────────────────────────────────────────────────────────────────────────────
|
|
66
|
-
|
|
67
|
-
// `src/theme/../` — never a hardcoded absolute path, so the test keeps working regardless of where
|
|
68
|
-
// the repo is checked out.
|
|
69
|
-
const SRC_DIR = join(dirname(fileURLToPath(import.meta.url)), '..')
|
|
70
|
-
|
|
71
|
-
// The token's own DEFINITION files — every other mention is either an application (scanned) or a
|
|
72
|
-
// comment (ignored).
|
|
73
|
-
const DEFINITION_FILES = new Set(['tokens/index.ts', 'tokens/palette.ts'])
|
|
74
|
-
|
|
75
|
-
/** Recursively collects every `.css`/`.ts`/`.tsx` file under `SRC_DIR`, skipping `dist/` and test
|
|
76
|
-
* files (a test file, including this one, can quote the token in a string/comment without being an
|
|
77
|
-
* application site). */
|
|
78
|
-
function collectSourceFiles(dir: string, out: string[]): void {
|
|
79
|
-
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
80
|
-
if (entry.name === 'dist' || entry.name === 'node_modules') continue
|
|
81
|
-
const full = join(dir, entry.name)
|
|
82
|
-
if (entry.isDirectory()) {
|
|
83
|
-
collectSourceFiles(full, out)
|
|
84
|
-
continue
|
|
85
|
-
}
|
|
86
|
-
if (entry.name.endsWith('.test.ts') || entry.name.endsWith('.test.tsx')) continue
|
|
87
|
-
if (entry.name.endsWith('.css') || entry.name.endsWith('.ts') || entry.name.endsWith('.tsx')) {
|
|
88
|
-
out.push(full)
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function stripCssComments(text: string): string {
|
|
94
|
-
return text.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Strips `/* */` block comments and `//` line comments. The negative lookbehind on `//` excludes
|
|
98
|
-
// `://` (a URL) from being read as a comment start — not that we expect one here, but it's the
|
|
99
|
-
// standard guard against eating real code that happens to contain a protocol string.
|
|
100
|
-
function stripTsComments(text: string): string {
|
|
101
|
-
return text.replace(/\/\*[\s\S]*?\*\//g, '').replace(/(^|[^:])\/\/.*$/gm, '$1')
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// A real application in CSS: `box-shadow:` OR a custom property (`--field-depth:`, the mechanism
|
|
105
|
-
// `.input` uses to receive the token conditionally) whose value contains the literal token var(). A
|
|
106
|
-
// bare mention of `--vx-shadow-card` in a comment never matches — comments are stripped first, and
|
|
107
|
-
// this requires an actual `property:` declaration.
|
|
108
|
-
const CSS_SHADOW_TOKEN =
|
|
109
|
-
/(?<![\w-])(?:box-shadow|--[\w-]+)\s*:\s*[^;]*var\(--vx-shadow-(?:card|ctrl|raised)\)/
|
|
110
|
-
|
|
111
|
-
// A real application in TS/TSX: a `boxShadow` object property whose value is the literal CSS var
|
|
112
|
-
// string, `VX.shadowCard`/`VX.shadowCtrl`, or a template literal compositing either (e.g. the
|
|
113
|
-
// danger-zone ring: `` `${VX.shadowCard}, 0 0 0 1px ...` ``). Deliberately does NOT match
|
|
114
|
-
// `--vx-shadow-overlay` (a different, unrelated token) or a `boxShadow` string literal that doesn't
|
|
115
|
-
// reference either token (data-table's scroll-shadow, guard/index.ts's own regex source, etc.).
|
|
116
|
-
const TS_SHADOW_TOKEN =
|
|
117
|
-
/\bboxShadow\s*:\s*(?:'[^']*var\(--vx-shadow-(?:card|ctrl|raised)\)[^']*'|`[^`]*(?:var\(--vx-shadow-(?:card|ctrl|raised)\)|VX\.shadow(?:Card|Ctrl|Raised))[^`]*`|VX\.shadow(?:Card|Ctrl|Raised))/
|
|
118
|
-
|
|
119
|
-
type ShadowSite = {
|
|
120
|
-
/** Path relative to `src/`, e.g. `theme/controls.module.css`. */
|
|
121
|
-
readonly file: string
|
|
122
|
-
/** A stable, human-readable label for the box within that file — a CSS selector for `.css`
|
|
123
|
-
* files, or `Component.styles.slot`/a nearby object key for `.ts`/`.tsx` (`default` when a file
|
|
124
|
-
* has exactly one site and no enclosing key to name it, e.g. a bare inline `style={{}}`). */
|
|
125
|
-
readonly site: string
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/** Every rule in a CSS module whose declarations apply the token, keyed by the rule's own selector
|
|
129
|
-
* (multi-line selectors are collapsed to one line). Assumes flat, non-nested CSS (no native
|
|
130
|
-
* nesting). A rule nested one level inside an at-rule IS still found — the brace-pair regex matches
|
|
131
|
-
* INNERMOST pairs, so `@media (hover: hover) { .x:hover { … } }` resolves as the inner `.x:hover`
|
|
132
|
-
* rule. (No such site exists today — depth is static — but the scan must keep finding one if a
|
|
133
|
-
* future state-scoped depth rule lands inside an at-rule.) What the
|
|
134
|
-
* naive scan does NOT do is carry the at-rule condition into the site label: such a site registers
|
|
135
|
-
* under its bare inner selector, with the `@media` context stated in its `roundedBy` reason
|
|
136
|
-
* instead. That is a labeling limitation, never a coverage one. */
|
|
137
|
-
function cssShadowSites(relPath: string, text: string): ShadowSite[] {
|
|
138
|
-
const clean = stripCssComments(text)
|
|
139
|
-
const sites: ShadowSite[] = []
|
|
140
|
-
const RULE = /([^{}]+)\{([^{}]*)\}/g
|
|
141
|
-
let match: RegExpExecArray | null
|
|
142
|
-
while ((match = RULE.exec(clean))) {
|
|
143
|
-
// Both capture groups are non-optional in RULE — a successful match always populates them;
|
|
144
|
-
// the `!` documents that (matches the same idiom in vite-color-mix.ts's splitColorAndPercent).
|
|
145
|
-
const selector = match[1]!.trim().replace(/\s+/g, ' ')
|
|
146
|
-
const body = match[2]!
|
|
147
|
-
if (CSS_SHADOW_TOKEN.test(body)) sites.push({ file: relPath, site: selector })
|
|
148
|
-
}
|
|
149
|
-
return sites
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/** Every `boxShadow` application in a `.ts`/`.tsx` file, labeled by its nearest enclosing object
|
|
153
|
-
* key chain. Walks backward from each match: the first `key: {`-only line above it names the
|
|
154
|
-
* "slot" (`root`, `indicator`, `input`, …); continuing further back, the first `Name: Name.extend({`
|
|
155
|
-
* line names the Mantine component (`theme/index.ts`'s `components` block). Neither pattern found
|
|
156
|
-
* (a bare `style={{ … }}` object, common outside `theme/index.ts`) falls back to `'default'` — safe
|
|
157
|
-
* because every such file has exactly one site. */
|
|
158
|
-
function tsShadowSites(relPath: string, text: string): ShadowSite[] {
|
|
159
|
-
const clean = stripTsComments(text)
|
|
160
|
-
const lines = clean.split('\n')
|
|
161
|
-
const SLOT = /^\s*(\w+):\s*\{\s*$/
|
|
162
|
-
const COMPONENT = /^\s*(\w+):\s*\w+\.extend\(\{\s*$/
|
|
163
|
-
const LOOKBACK = 40
|
|
164
|
-
const sites: ShadowSite[] = []
|
|
165
|
-
for (const [i, line] of lines.entries()) {
|
|
166
|
-
if (!TS_SHADOW_TOKEN.test(line)) continue
|
|
167
|
-
let slot: string | null = null
|
|
168
|
-
let component: string | null = null
|
|
169
|
-
for (let j = i - 1; j >= 0 && j >= i - LOOKBACK; j--) {
|
|
170
|
-
// `j` is bounded by the loop condition (`j >= 0`) to a valid index of `lines` — the `!`
|
|
171
|
-
// documents that, not a mis-indexed fixture.
|
|
172
|
-
const jLine = lines[j]!
|
|
173
|
-
if (slot === null) {
|
|
174
|
-
const slotMatch = SLOT.exec(jLine)
|
|
175
|
-
if (slotMatch) {
|
|
176
|
-
// SLOT's one capture group is non-optional — a successful match always populates it.
|
|
177
|
-
slot = slotMatch[1]!
|
|
178
|
-
continue
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
const componentMatch = COMPONENT.exec(jLine)
|
|
182
|
-
if (componentMatch) {
|
|
183
|
-
component = componentMatch[1]!
|
|
184
|
-
break
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
const label =
|
|
188
|
-
component !== null
|
|
189
|
-
? slot !== null
|
|
190
|
-
? `${component}.styles.${slot}`
|
|
191
|
-
: component
|
|
192
|
-
: (slot ?? 'default')
|
|
193
|
-
sites.push({ file: relPath, site: label })
|
|
194
|
-
}
|
|
195
|
-
return sites
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/** Every application of `--vx-shadow-card`/`--vx-shadow-ctrl`/`--vx-shadow-raised` across `src/**`. */
|
|
199
|
-
function scanShadowSites(): ShadowSite[] {
|
|
200
|
-
const files: string[] = []
|
|
201
|
-
collectSourceFiles(SRC_DIR, files)
|
|
202
|
-
const sites: ShadowSite[] = []
|
|
203
|
-
for (const file of files) {
|
|
204
|
-
const relPath = relative(SRC_DIR, file)
|
|
205
|
-
if (DEFINITION_FILES.has(relPath)) continue
|
|
206
|
-
const text = readFileSync(file, 'utf8')
|
|
207
|
-
if (file.endsWith('.css')) sites.push(...cssShadowSites(relPath, text))
|
|
208
|
-
else sites.push(...tsShadowSites(relPath, text))
|
|
209
|
-
}
|
|
210
|
-
return sites
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
function siteKey(site: ShadowSite): string {
|
|
214
|
-
return `${site.file} :: ${site.site}`
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
// ── SHADOW_SURFACES registry ────────────────────────────────────────────────────────────────────
|
|
218
|
-
|
|
219
|
-
type ShadowSurfaceEntry = ShadowSite & {
|
|
220
|
-
/** Where THIS box's `border-radius` comes from — a co-declared `border-radius`/`borderRadius` in
|
|
221
|
-
* the same rule/object, or a Mantine CSS var/prop resolved elsewhere, VERIFIED against Mantine's
|
|
222
|
-
* actual shipped CSS (`@mantine/core/styles/*.css`) or component source, never inferred from
|
|
223
|
-
* memory. A box with a genuine `border-radius: 0` is a valid reason too, stated plainly — a
|
|
224
|
-
* square ring on a square surface is correct. Never a placeholder — this is the thing a reviewer
|
|
225
|
-
* checks to confirm the ring actually follows this box's own, real corners. */
|
|
226
|
-
readonly roundedBy: string
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* The closed registry of every site in `src/**` that applies `--vx-shadow-card`/`--vx-shadow-ctrl`,
|
|
231
|
-
* each with a reasoned `roundedBy`. Modeled on `BORDER_ALLOWLIST` (`border-coverage.test.ts`) /
|
|
232
|
-
* `GUARD_RULES` (`guard/index.ts`): every entry is real, reviewable, and reasoned — never a bare
|
|
233
|
-
* string array.
|
|
234
|
-
*/
|
|
235
|
-
export const SHADOW_SURFACES: readonly ShadowSurfaceEntry[] = [
|
|
236
|
-
// ── theme/controls.module.css ────────────────────────────────────────────────────────────────
|
|
237
|
-
{
|
|
238
|
-
file: 'theme/controls.module.css',
|
|
239
|
-
site: ".input[data-variant='default']",
|
|
240
|
-
roundedBy:
|
|
241
|
-
"--input-radius (Mantine's own Input.css sets --input-radius: var(--mantine-radius-default) " +
|
|
242
|
-
'on the wrapper and consumes it via `border-radius: var(--input-radius)` directly on the ' +
|
|
243
|
-
'<input> element itself — the custom property inherits from wrapper to input, landing on the ' +
|
|
244
|
-
'exact element the shadow lands on).',
|
|
245
|
-
},
|
|
246
|
-
// The five Button/ActionIcon entries below all resolve their radius the same way, and all set the
|
|
247
|
-
// token on `--ctrl-depth` rather than on `box-shadow` directly — the single `box-shadow:
|
|
248
|
-
// var(--ctrl-depth)` declaration lives on the shared `.buttonRoot, .actionIconRoot` base rule
|
|
249
|
-
// (which is therefore NOT a token-application site itself and correctly goes unregistered). The
|
|
250
|
-
// indirection changes nothing about this invariant: the variable is consumed on the very same
|
|
251
|
-
// element these selectors target, so the ring is still drawn by a box carrying the control's own
|
|
252
|
-
// `--button-radius`/`--ai-radius`.
|
|
253
|
-
{
|
|
254
|
-
file: 'theme/controls.module.css',
|
|
255
|
-
site:
|
|
256
|
-
".buttonRoot[data-variant='default'], .buttonRoot[data-variant='filled'], " +
|
|
257
|
-
".buttonRoot[data-variant='light']",
|
|
258
|
-
roundedBy:
|
|
259
|
-
"--button-radius (Mantine's own Button.css declares `border-radius: var(--button-radius, " +
|
|
260
|
-
'var(--mantine-radius-default))` directly on the button root — the same element `.buttonRoot` ' +
|
|
261
|
-
'targets). This is the raised family on the shared `shadow-raised`, and its ring is INSET — a ' +
|
|
262
|
-
'radius mismatch would leak nubs on the INSIDE of each corner rather than the outside, so the ' +
|
|
263
|
-
'invariant bites exactly as hard here as on an outset ring.',
|
|
264
|
-
},
|
|
265
|
-
{
|
|
266
|
-
file: 'theme/controls.module.css',
|
|
267
|
-
site: ".buttonRoot[data-variant='outline']",
|
|
268
|
-
roundedBy:
|
|
269
|
-
'--button-radius (same chain as the raised-family entry above — Button.css declares ' +
|
|
270
|
-
'`border-radius: var(--button-radius, var(--mantine-radius-default))` on the button root; the ' +
|
|
271
|
-
'variant changes only which depth token lands, never which element carries it). `outline` is ' +
|
|
272
|
-
'the one raised variant on ring-FREE `shadow-ctrl`, because its real 1px accent border already ' +
|
|
273
|
-
'IS its edge and an inset ring tucked just inside a border is muddy — so no ring is at risk ' +
|
|
274
|
-
'here at all, and the registration exists to keep the inventory exhaustive.',
|
|
275
|
-
},
|
|
276
|
-
{
|
|
277
|
-
file: 'theme/controls.module.css',
|
|
278
|
-
site:
|
|
279
|
-
".actionIconRoot[data-variant='default'], .actionIconRoot[data-variant='filled'], " +
|
|
280
|
-
".actionIconRoot[data-variant='light']",
|
|
281
|
-
roundedBy:
|
|
282
|
-
"--ai-radius (Mantine's own ActionIcon.css declares `border-radius: var(--ai-radius, " +
|
|
283
|
-
'var(--mantine-radius-default))` directly on the root — the same element `.actionIconRoot` ' +
|
|
284
|
-
'targets). Same inset-ring reasoning as the Button raised-family entry above.',
|
|
285
|
-
},
|
|
286
|
-
{
|
|
287
|
-
file: 'theme/controls.module.css',
|
|
288
|
-
site: ".actionIconRoot[data-variant='outline']",
|
|
289
|
-
roundedBy:
|
|
290
|
-
'--ai-radius (same chain as the entry above — ActionIcon.css declares `border-radius: ' +
|
|
291
|
-
'var(--ai-radius, var(--mantine-radius-default))` on the root). Ring-free `shadow-ctrl`, same ' +
|
|
292
|
-
"reason as Button's `outline`. ActionIcon has no `subtle` counterpart to Button's " +
|
|
293
|
-
"hover-materialized entry by design: its `subtle` IS the spec's separate ghost-icon-button " +
|
|
294
|
-
'idiom (DESIGN-SPEC §5), whose hover state is an ink tint, not a raise.',
|
|
295
|
-
},
|
|
296
|
-
{
|
|
297
|
-
file: 'theme/controls.module.css',
|
|
298
|
-
site: '.checkboxCardRoot[data-with-border], .radioCardRoot[data-with-border]',
|
|
299
|
-
roundedBy:
|
|
300
|
-
"--card-radius (Mantine's own CheckboxCard.css/RadioCard.css each declare `border-radius: " +
|
|
301
|
-
'var(--card-radius)` directly on the card root — the same element this rule targets).',
|
|
302
|
-
},
|
|
303
|
-
{
|
|
304
|
-
file: 'theme/controls.module.css',
|
|
305
|
-
site: '.chipLabel:not([data-checked]):not([data-disabled])',
|
|
306
|
-
roundedBy:
|
|
307
|
-
"--chip-radius (Mantine's own Chip.css declares `border-radius: var(--chip-radius, 1000rem)` " +
|
|
308
|
-
'directly on the label part — the same element `.chipLabel` targets).',
|
|
309
|
-
},
|
|
310
|
-
// theme/nav-link.module.css applies no shadow token: the active nav row is a selected row (ink
|
|
311
|
-
// tint), never a raised control — see that file's header comment.
|
|
312
|
-
// ── shell/app-mobile-nav.module.css ──────────────────────────────────────────────────────────
|
|
313
|
-
{
|
|
314
|
-
file: 'shell/app-mobile-nav.module.css',
|
|
315
|
-
site: '.sheet',
|
|
316
|
-
roundedBy:
|
|
317
|
-
'border-top-left-radius / border-top-right-radius: var(--mantine-radius-lg) (co-declared in ' +
|
|
318
|
-
'the same rule).',
|
|
319
|
-
},
|
|
320
|
-
// ── shell/sidebar-search.module.css ──────────────────────────────────────────────────────────
|
|
321
|
-
{
|
|
322
|
-
file: 'shell/sidebar-search.module.css',
|
|
323
|
-
site: '.trigger',
|
|
324
|
-
roundedBy:
|
|
325
|
-
'border-radius: var(--vx-radius-ctrl) (co-declared in the same .trigger rule, on the same ' +
|
|
326
|
-
"UnstyledButton root the box-shadow lands on — the ring follows this box's own corners). " +
|
|
327
|
-
'The collapsed `.railBtn` in the same file carries no shadow (radius only), so it is not a site.',
|
|
328
|
-
},
|
|
329
|
-
// ── theme/index.ts (baseTheme.components) ───────────────────────────────────────────────────
|
|
330
|
-
{
|
|
331
|
-
file: 'theme/index.ts',
|
|
332
|
-
site: 'Card.styles.root',
|
|
333
|
-
roundedBy:
|
|
334
|
-
"borderRadius: 'var(--vx-radius-card)' (co-declared in the same styles.root object).",
|
|
335
|
-
},
|
|
336
|
-
{
|
|
337
|
-
file: 'theme/index.ts',
|
|
338
|
-
site: 'Paper.styles.root',
|
|
339
|
-
roundedBy:
|
|
340
|
-
"borderRadius: 'var(--vx-radius-card)' (co-declared in the same styles.root object).",
|
|
341
|
-
},
|
|
342
|
-
{
|
|
343
|
-
file: 'theme/index.ts',
|
|
344
|
-
site: 'SegmentedControl.styles.indicator',
|
|
345
|
-
roundedBy: 'borderRadius: 5 (co-declared in the same styles.indicator object).',
|
|
346
|
-
},
|
|
347
|
-
{
|
|
348
|
-
file: 'theme/index.ts',
|
|
349
|
-
site: 'Notification.styles.root',
|
|
350
|
-
roundedBy:
|
|
351
|
-
'--notification-radius (defaultProps: { radius: 8 } on the same Notification.extend feeds ' +
|
|
352
|
-
"Mantine's own varsResolver — Notification.mjs sets `--notification-radius: getRadius(8)` " +
|
|
353
|
-
"on the root part; Mantine's own Notification.css declares `border-radius: var(--" +
|
|
354
|
-
'notification-radius)` on that same root element the styles.root boxShadow targets).',
|
|
355
|
-
},
|
|
356
|
-
// ── widget-header ────────────────────────────────────────────────────────────────────────────
|
|
357
|
-
{
|
|
358
|
-
file: 'widget-header/widget-header.module.css',
|
|
359
|
-
site: '.infoBubble',
|
|
360
|
-
roundedBy:
|
|
361
|
-
'border-radius: var(--vx-radius-card) (co-declared in the same .infoBubble rule as the ' +
|
|
362
|
-
'box-shadow, so the ring follows this box’s own shape). This is the info-tooltip bubble that ' +
|
|
363
|
-
'used to live in charts/primitives/ChartCard.tsx as `bubbleStyle`; it moved down into ' +
|
|
364
|
-
'WidgetHeader when ChartCard started composing it, so every tier gets the same ' +
|
|
365
|
-
'hover/focus/click affordance. Nothing clips it: its host `.info` span is `position: ' +
|
|
366
|
-
'relative` with no overflow, and ChartCard deliberately keeps its header outside the chart ' +
|
|
367
|
-
'body’s clip box for exactly this reason.',
|
|
368
|
-
},
|
|
369
|
-
// ── charts/primitives ────────────────────────────────────────────────────────────────────────
|
|
370
|
-
{
|
|
371
|
-
file: 'charts/primitives/ChartCard.tsx',
|
|
372
|
-
site: 'default',
|
|
373
|
-
roundedBy:
|
|
374
|
-
'One shadowed box in this file: cardStyle — the outer card box co-declares borderRadius: ' +
|
|
375
|
-
'VX.radiusCard + boxShadow + backgroundColor, so the ring is bound to THIS radius and ' +
|
|
376
|
-
'matches. It carries NO overflow: the chart body clips itself on a separate inner box ' +
|
|
377
|
-
'(bodyClipStyle, identical bottom-corner radius, no shadow) so the header — and the info ' +
|
|
378
|
-
'bubble WidgetHeader opens under it — can escape the clip; the ring is safe on the outer box ' +
|
|
379
|
-
'either way (an element’s own overflow never clips its own shadow). The second shadowed box ' +
|
|
380
|
-
'this entry used to cover, `bubbleStyle`, now lives in widget-header.module.css’s ' +
|
|
381
|
-
'.infoBubble (registered above).',
|
|
382
|
-
},
|
|
383
|
-
{
|
|
384
|
-
file: 'charts/primitives/ChartTooltip.tsx',
|
|
385
|
-
site: 'default',
|
|
386
|
-
roundedBy: 'borderRadius: 8 (co-declared in the same TOOLTIP_STYLES object).',
|
|
387
|
-
},
|
|
388
|
-
// ── agent-chat ───────────────────────────────────────────────────────────────────────────────
|
|
389
|
-
// agent-chat/composer.tsx applies no shadow token of its own: it takes the themed `.input` depth
|
|
390
|
-
// (theme/controls.module.css) so it also inherits that class's disabled grounding — an inline
|
|
391
|
-
// `boxShadow` in its `styles` object used to beat the class and leave a disabled composer raised.
|
|
392
|
-
{
|
|
393
|
-
file: 'agent-chat/thread-outcome-card.tsx',
|
|
394
|
-
site: 'default',
|
|
395
|
-
roundedBy: 'borderRadius: VX.radiusCard (co-declared in the same inline style object).',
|
|
396
|
-
},
|
|
397
|
-
{
|
|
398
|
-
file: 'agent-chat/thread-message.tsx',
|
|
399
|
-
site: 'default',
|
|
400
|
-
roundedBy: 'borderRadius: VX.radiusCard (co-declared in the same inline style object).',
|
|
401
|
-
},
|
|
402
|
-
{
|
|
403
|
-
file: 'agent-chat/thread-feed-row.tsx',
|
|
404
|
-
site: 'default',
|
|
405
|
-
roundedBy:
|
|
406
|
-
'borderRadius: VX.radiusCard (co-declared in the same inline style object as the shadow). ' +
|
|
407
|
-
'This box also carries overflow: hidden, which is what lets the header button and the ' +
|
|
408
|
-
'expanded body square off against the row’s rounded corners; an element’s own overflow ' +
|
|
409
|
-
'never clips its own ring, so the shadow is unaffected.',
|
|
410
|
-
},
|
|
411
|
-
// ── agent ────────────────────────────────────────────────────────────────────────────────────
|
|
412
|
-
{
|
|
413
|
-
file: 'agent/stick-to-bottom.tsx',
|
|
414
|
-
site: 'default',
|
|
415
|
-
roundedBy:
|
|
416
|
-
'borderRadius: 999 (co-declared in the same inline style object — a circular button).',
|
|
417
|
-
},
|
|
418
|
-
// ── dashboard ────────────────────────────────────────────────────────────────────────────────
|
|
419
|
-
{
|
|
420
|
-
file: 'dashboard/settings-section.tsx',
|
|
421
|
-
site: 'default',
|
|
422
|
-
roundedBy:
|
|
423
|
-
"Card.styles.root borderRadius: 'var(--vx-radius-card)' (theme/index.ts) — this DangerZone " +
|
|
424
|
-
"call site's inline `style` prop only overrides boxShadow (layering the danger-red ring on " +
|
|
425
|
-
"top); Card's themed border-radius stays active underneath on the same root element.",
|
|
426
|
-
},
|
|
427
|
-
]
|
|
428
|
-
|
|
429
|
-
// ── Tests ────────────────────────────────────────────────────────────────────────────────────────
|
|
430
|
-
|
|
431
|
-
describe('SHADOW_SURFACES is well-formed', () => {
|
|
432
|
-
test('every entry has a non-empty roundedBy reason', () => {
|
|
433
|
-
for (const entry of SHADOW_SURFACES) {
|
|
434
|
-
expect(entry.roundedBy.length).toBeGreaterThan(0)
|
|
435
|
-
}
|
|
436
|
-
})
|
|
437
|
-
|
|
438
|
-
test('no duplicate site entries', () => {
|
|
439
|
-
const keys = SHADOW_SURFACES.map(siteKey)
|
|
440
|
-
expect(new Set(keys).size).toBe(keys.length)
|
|
441
|
-
})
|
|
442
|
-
|
|
443
|
-
test('no orphaned entries — every registered site is still a real application in source', () => {
|
|
444
|
-
const found = new Set(scanShadowSites().map(siteKey))
|
|
445
|
-
const orphaned = SHADOW_SURFACES.map(siteKey).filter((key) => !found.has(key))
|
|
446
|
-
expect(orphaned).toEqual([])
|
|
447
|
-
})
|
|
448
|
-
})
|
|
449
|
-
|
|
450
|
-
describe('every applied --vx-shadow-card / -ctrl / -raised site is registered', () => {
|
|
451
|
-
// The coverage assertion below is `expect(gaps).toEqual([])`, which passes VACUOUSLY if the scan
|
|
452
|
-
// finds nothing. That is exactly the failure mode `border-coverage.test.ts` already had to guard
|
|
453
|
-
// against once — this is the same tripwire: fail loudly here if the scan stops resolving real
|
|
454
|
-
// sites, rather than quietly nodding a broken scan through as "full coverage".
|
|
455
|
-
test('the scan actually resolves shadow-token application sites (guards against a vacuous pass)', () => {
|
|
456
|
-
const sites = scanShadowSites()
|
|
457
|
-
expect(sites.length).toBeGreaterThanOrEqual(8)
|
|
458
|
-
// .buttonRoot and Card/Paper are the origin sites of the doctrine (docs/DESIGN-SPEC.md §5) —
|
|
459
|
-
// if the scan can't see THEM, the scan is broken, whatever its total count says.
|
|
460
|
-
expect(
|
|
461
|
-
sites.some((s) => s.file === 'theme/controls.module.css' && s.site.includes('.buttonRoot')),
|
|
462
|
-
).toBe(true)
|
|
463
|
-
expect(sites.some((s) => s.file === 'theme/index.ts' && s.site === 'Card.styles.root')).toBe(
|
|
464
|
-
true,
|
|
465
|
-
)
|
|
466
|
-
expect(sites.some((s) => s.file === 'theme/index.ts' && s.site === 'Paper.styles.root')).toBe(
|
|
467
|
-
true,
|
|
468
|
-
)
|
|
469
|
-
})
|
|
470
|
-
|
|
471
|
-
test('every scanned site is registered with a reasoned roundedBy', () => {
|
|
472
|
-
const registered = new Set(SHADOW_SURFACES.map(siteKey))
|
|
473
|
-
|
|
474
|
-
const gaps = scanShadowSites()
|
|
475
|
-
.filter((site) => !registered.has(siteKey(site)))
|
|
476
|
-
.map(
|
|
477
|
-
(site) =>
|
|
478
|
-
`${site.file} (${site.site}): applies --vx-shadow-card/-ctrl/-raised but has no ` +
|
|
479
|
-
'entry in SHADOW_SURFACES (src/theme/shadow-surfaces.test.ts). The ring baked into the ' +
|
|
480
|
-
"token follows THIS box's own border-radius — find where this box's radius comes from " +
|
|
481
|
-
'(a co-declared border-radius, or a Mantine CSS var/prop, verified against the shipped ' +
|
|
482
|
-
'@mantine/core CSS), and either register this site with a roundedBy reason, or fix the ' +
|
|
483
|
-
"radius mismatch if the box doesn't actually carry the surface's shape.",
|
|
484
|
-
)
|
|
485
|
-
|
|
486
|
-
expect(gaps).toEqual([])
|
|
487
|
-
})
|
|
488
|
-
})
|