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
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal — one disclosure flag that persists only when the caller named a key.
|
|
3
|
+
*
|
|
4
|
+
* `Section`'s collapse and `PageAside`'s fold are the same hook written twice: an optional
|
|
5
|
+
* `persistKey` decides whether the flag survives a reload, and both a `useState` and a
|
|
6
|
+
* `createPersistedState` hook are ALWAYS called so the hook order is stable across a key appearing
|
|
7
|
+
* or disappearing. Only the branch the caller asked for is returned, so an unpersisted surface
|
|
8
|
+
* never writes to storage.
|
|
9
|
+
*
|
|
10
|
+
* `scope` stays a parameter rather than being folded into `key`: it is what keeps
|
|
11
|
+
* `basalt:section:<key>` and `basalt:aside:<key>` from colliding when two surfaces on one page
|
|
12
|
+
* persist under the same name.
|
|
13
|
+
*
|
|
14
|
+
* Not exported from `../state` — this is an internal hook, not part of the `./state` surface.
|
|
15
|
+
*/
|
|
16
|
+
import { useMemo, useState } from 'react'
|
|
17
|
+
import { createPersistedState } from './persisted'
|
|
18
|
+
|
|
19
|
+
/** The key an unpersisted caller parks on — never read, because that branch returns local state. */
|
|
20
|
+
const UNPERSISTED_KEY = '__local__'
|
|
21
|
+
|
|
22
|
+
export function usePersistedOrLocal<T>({
|
|
23
|
+
scope,
|
|
24
|
+
persistKey,
|
|
25
|
+
initial,
|
|
26
|
+
}: {
|
|
27
|
+
/** The storage namespace — `section`, `aside`. Prefixed onto `persistKey`. */
|
|
28
|
+
scope: string
|
|
29
|
+
/** Persist under `basalt:<scope>:<persistKey>`. Omitted → local state, nothing written. */
|
|
30
|
+
persistKey: string | undefined
|
|
31
|
+
/** First-render value, respected only while nothing is persisted. */
|
|
32
|
+
initial: T
|
|
33
|
+
}): readonly [T, (next: T) => void] {
|
|
34
|
+
const [local, setLocal] = useState(initial)
|
|
35
|
+
// `createPersistedState` is a per-key module FACTORY, so it is memoized rather than called during
|
|
36
|
+
// render — the same reason `shell/index.tsx` memoizes its collapse store.
|
|
37
|
+
const usePersisted = useMemo(
|
|
38
|
+
() =>
|
|
39
|
+
createPersistedState<T>({
|
|
40
|
+
key: `${scope}:${persistKey ?? UNPERSISTED_KEY}`,
|
|
41
|
+
version: 1,
|
|
42
|
+
initial,
|
|
43
|
+
}),
|
|
44
|
+
[scope, persistKey, initial],
|
|
45
|
+
)
|
|
46
|
+
const [persisted, setPersisted] = usePersisted()
|
|
47
|
+
|
|
48
|
+
if (persistKey !== undefined) return [persisted, setPersisted] as const
|
|
49
|
+
return [local, setLocal] as const
|
|
50
|
+
}
|
package/src/state/persisted.ts
CHANGED
|
@@ -32,6 +32,42 @@ export type PersistedStateOptions<T> = {
|
|
|
32
32
|
readonly schema?: StandardSchemaV1<unknown, T>
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
/**
|
|
36
|
+
* Every subscriber for ONE storage key, shared by every `createPersistedState` instance over that
|
|
37
|
+
* key — plus the single `storage` event listener the key needs.
|
|
38
|
+
*
|
|
39
|
+
* Module-level rather than per-instance because two instances of the same key are ordinary, not a
|
|
40
|
+
* mistake: a page's `createSearchStore` and a widget's `createPersistedState` legitimately name the
|
|
41
|
+
* same key, and a consumer re-exporting a store from two modules ends up there by accident. With
|
|
42
|
+
* per-instance listener sets a write through one instance updated localStorage and notified only
|
|
43
|
+
* its own hooks, so the other instance's components kept rendering the stale value until something
|
|
44
|
+
* else re-rendered them — in the SAME tab, while the cross-tab path (the `storage` event) worked.
|
|
45
|
+
*
|
|
46
|
+
* The map is keyed by the NAMESPACED key and holds no window reference; a channel is created on
|
|
47
|
+
* first subscribe, which only happens in the browser (`subscribe` is never passed on the server).
|
|
48
|
+
*/
|
|
49
|
+
type KeyChannel = {
|
|
50
|
+
readonly listeners: Set<() => void>
|
|
51
|
+
handler: ((e: StorageEvent) => void) | null
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const channels = new Map<string, KeyChannel>()
|
|
55
|
+
|
|
56
|
+
/** Wake every hook on a key, whichever instance holds it. */
|
|
57
|
+
function notify(storageKey: string): void {
|
|
58
|
+
const channel = channels.get(storageKey)
|
|
59
|
+
if (channel === undefined) return
|
|
60
|
+
for (const listener of channel.listeners) listener()
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function channelFor(storageKey: string): KeyChannel {
|
|
64
|
+
const existing = channels.get(storageKey)
|
|
65
|
+
if (existing !== undefined) return existing
|
|
66
|
+
const created: KeyChannel = { listeners: new Set(), handler: null }
|
|
67
|
+
channels.set(storageKey, created)
|
|
68
|
+
return created
|
|
69
|
+
}
|
|
70
|
+
|
|
35
71
|
/** The envelope stored in localStorage: `{ v: number, value: unknown }`. */
|
|
36
72
|
type Envelope = { v: number; value: unknown }
|
|
37
73
|
|
|
@@ -73,16 +109,19 @@ function parseStorage<T>(raw: string | null, opts: PersistedStateOptions<T>): T
|
|
|
73
109
|
}
|
|
74
110
|
}
|
|
75
111
|
|
|
76
|
-
function
|
|
77
|
-
const storageKey = `basalt:${opts.key}`
|
|
112
|
+
function writeEnvelope(storageKey: string, version: number, value: unknown): void {
|
|
78
113
|
try {
|
|
79
|
-
const envelope: Envelope = { v:
|
|
114
|
+
const envelope: Envelope = { v: version, value }
|
|
80
115
|
window.localStorage.setItem(storageKey, JSON.stringify(envelope))
|
|
81
116
|
} catch {
|
|
82
117
|
// Silently fail (storage full, private browsing, etc.)
|
|
83
118
|
}
|
|
84
119
|
}
|
|
85
120
|
|
|
121
|
+
function writeStorage<T>(opts: PersistedStateOptions<T>, next: T): void {
|
|
122
|
+
writeEnvelope(`basalt:${opts.key}`, opts.version, next)
|
|
123
|
+
}
|
|
124
|
+
|
|
86
125
|
/**
|
|
87
126
|
* Versioned, Standard-Schema-validated localStorage state via useSyncExternalStore (no zustand).
|
|
88
127
|
* SSR-safe (getServerSnapshot returns `initial`). Cross-tab via the storage event.
|
|
@@ -100,32 +139,25 @@ export function createPersistedState<T>(
|
|
|
100
139
|
): () => readonly [T, (next: T) => void] {
|
|
101
140
|
const storageKey = `basalt:${opts.key}`
|
|
102
141
|
|
|
103
|
-
// One Set of subscriber callbacks — mirrors notifications/store.ts single-listener-to-Set pattern.
|
|
104
|
-
const listeners = new Set<() => void>()
|
|
105
|
-
|
|
106
|
-
// ONE module-scoped 'storage' event listener per key, registered lazily on first subscriber.
|
|
107
|
-
// Removed when the last subscriber unsubscribes (cleanup semantics preserved).
|
|
108
|
-
let storageHandler: ((e: StorageEvent) => void) | null = null
|
|
109
|
-
|
|
110
142
|
const subscribe = (cb: () => void): (() => void) => {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
143
|
+
// The subscriber set is the KEY's, not this instance's — see `KeyChannel`.
|
|
144
|
+
const channel = channelFor(storageKey)
|
|
145
|
+
channel.listeners.add(cb)
|
|
146
|
+
|
|
147
|
+
// ONE 'storage' event listener per key, registered lazily on the first subscriber and removed
|
|
148
|
+
// when the last one leaves (cleanup semantics preserved).
|
|
149
|
+
if (channel.handler === null) {
|
|
150
|
+
channel.handler = (e: StorageEvent): void => {
|
|
151
|
+
if (e.key === storageKey) notify(storageKey)
|
|
119
152
|
}
|
|
120
|
-
window.addEventListener('storage',
|
|
153
|
+
window.addEventListener('storage', channel.handler)
|
|
121
154
|
}
|
|
122
155
|
|
|
123
156
|
return () => {
|
|
124
|
-
listeners.delete(cb)
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
storageHandler = null
|
|
157
|
+
channel.listeners.delete(cb)
|
|
158
|
+
if (channel.listeners.size === 0 && channel.handler !== null) {
|
|
159
|
+
window.removeEventListener('storage', channel.handler)
|
|
160
|
+
channel.handler = null
|
|
129
161
|
}
|
|
130
162
|
}
|
|
131
163
|
}
|
|
@@ -158,8 +190,9 @@ export function createPersistedState<T>(
|
|
|
158
190
|
|
|
159
191
|
const setState = (next: T): void => {
|
|
160
192
|
writeStorage(opts, next)
|
|
161
|
-
// Notify in-tab
|
|
162
|
-
|
|
193
|
+
// Notify every in-tab listener on this KEY — the 'storage' event fires in OTHER tabs only, and
|
|
194
|
+
// a second instance of the same key has its own hooks to wake.
|
|
195
|
+
notify(storageKey)
|
|
163
196
|
}
|
|
164
197
|
|
|
165
198
|
// Detect SSR once at creation time — the environment doesn't change between renders.
|
|
@@ -209,3 +242,20 @@ export function readPersistedValue(key: string, version?: number): unknown | nul
|
|
|
209
242
|
return null
|
|
210
243
|
}
|
|
211
244
|
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Write a value under the namespaced key `basalt:<key>` in the same versioned envelope
|
|
248
|
+
* `createPersistedState` writes, and wake every hook on that key — the write half of
|
|
249
|
+
* `readPersistedValue`, and plain in the same way: no React required.
|
|
250
|
+
*
|
|
251
|
+
* The one call site is a store field's `clear()`, which has to DELETE its key from the store's
|
|
252
|
+
* record from an event handler, where the hook's setter is not in reach. Not exported from the
|
|
253
|
+
* `basalt-ui/state` barrel: the two store factories are the API, this is their seam.
|
|
254
|
+
*
|
|
255
|
+
* @internal
|
|
256
|
+
*/
|
|
257
|
+
export function writePersistedValue(key: string, version: number, value: unknown): void {
|
|
258
|
+
const storageKey = `basalt:${key}`
|
|
259
|
+
writeEnvelope(storageKey, version, value)
|
|
260
|
+
notify(storageKey)
|
|
261
|
+
}
|
package/src/state.ts
CHANGED
|
@@ -30,6 +30,10 @@ export {
|
|
|
30
30
|
type RangeValue,
|
|
31
31
|
type RangeParams,
|
|
32
32
|
type RangePresets,
|
|
33
|
+
type RangeWindow,
|
|
34
|
+
type RangeWindows,
|
|
35
|
+
type FieldFallback,
|
|
36
|
+
type FieldSetOptions,
|
|
33
37
|
type EnumField,
|
|
34
38
|
type MultiField,
|
|
35
39
|
type RangeField,
|
|
@@ -42,11 +46,4 @@ export {
|
|
|
42
46
|
type FieldHandle,
|
|
43
47
|
type SearchValues,
|
|
44
48
|
type StoredValues,
|
|
45
|
-
// @internal — the seam `createSearchStore` is built on, not a consumer API.
|
|
46
|
-
type FieldCodec,
|
|
47
|
-
type StoreEntry,
|
|
48
|
-
type StoreCoreOptions,
|
|
49
|
-
type StoreCore,
|
|
50
|
-
resolveFieldCodec,
|
|
51
|
-
createStoreCore,
|
|
52
49
|
} from './state/fields'
|
package/src/surfaces.ts
CHANGED
|
@@ -48,12 +48,19 @@ export const PLUGIN_RULE_ID_LIST = [
|
|
|
48
48
|
'raw-scroll-container',
|
|
49
49
|
'hand-rolled-filter',
|
|
50
50
|
'control-outside-home',
|
|
51
|
+
'bound-control-outside-home',
|
|
51
52
|
'control-size-literal',
|
|
52
53
|
'page-bar-budget',
|
|
53
54
|
'in-body-page-title',
|
|
54
55
|
'responsive-twin',
|
|
55
56
|
'search-literal-link',
|
|
56
57
|
'use-search-from-literal',
|
|
58
|
+
'provider-above-router',
|
|
59
|
+
'duplicate-notifications-mount',
|
|
60
|
+
'query-dual-import',
|
|
61
|
+
'query-fn-unwrap',
|
|
62
|
+
'deprecated-export',
|
|
63
|
+
'forms-field-key',
|
|
57
64
|
'visx-boundary',
|
|
58
65
|
'visx-tooltip',
|
|
59
66
|
'token-layer-boundary',
|
|
@@ -78,7 +85,7 @@ export type SkillName = 'basalt-app' | 'basalt-design' | 'basalt-charts'
|
|
|
78
85
|
* @example
|
|
79
86
|
* const l: Layer = 'headless'
|
|
80
87
|
*/
|
|
81
|
-
export type Layer = 'mantine-coupled' | 'headless' | 'app-global' | 'non-js-asset'
|
|
88
|
+
export type Layer = 'mantine-coupled' | 'headless' | 'app-global' | 'non-js-asset' | 'build-tooling'
|
|
82
89
|
|
|
83
90
|
/**
|
|
84
91
|
* A single import ban. `{ctx}` in the message is filled per target so shipped/repo wording
|
|
@@ -267,9 +274,22 @@ export const SURFACES = {
|
|
|
267
274
|
'raw-scroll-container',
|
|
268
275
|
'page-bar-budget',
|
|
269
276
|
'shadow-basalt-export',
|
|
277
|
+
// The two mount-order laws, guarded as of 1.28.0 (F5) — both same-file static ancestry, so
|
|
278
|
+
// both `warn`. `deprecated-export` sits here too: the ledger it reads spans subpaths, and
|
|
279
|
+
// `BasaltProvider`'s three flattened connectivity props are most of it.
|
|
280
|
+
'provider-above-router',
|
|
281
|
+
'duplicate-notifications-mount',
|
|
282
|
+
'deprecated-export',
|
|
283
|
+
],
|
|
284
|
+
// agent/rules/basalt-mantine.md — stated, not guarded. The other two laws that stood here
|
|
285
|
+
// gained `provider-above-router` / `duplicate-notifications-mount` at 1.28.0; this one has no
|
|
286
|
+
// AST form left to catch, because `cssVariablesResolver` is now `Omit`ted from the accepted
|
|
287
|
+
// prop type and a hand-built `createTheme` is a consumer's own call to make.
|
|
288
|
+
advisoryLaws: [
|
|
289
|
+
"no second cssVariablesResolver — don't hand-build createTheme or re-add the resolver basalt already installs",
|
|
270
290
|
],
|
|
271
291
|
description:
|
|
272
|
-
'BasaltProvider, createBasaltTheme, BasaltShell + sidebar/mobile-nav/breadcrumbs, PageBar, NavCountBadge, ThemeToggle, ThreadWorkspace + thread-chat components, WidgetHeader, dashboard composites (DeltaBadge, StatCard with threshold tone, EmptyState, QueryState/LoadingState/ErrorState, SettingsSection/SettingsRow/DangerZone)',
|
|
292
|
+
'BasaltProvider, createBasaltTheme, BasaltShell + sidebar/mobile-nav/breadcrumbs, PageBar, PageAside, NavCountBadge, ThemeToggle, ThreadWorkspace + thread-chat components, WidgetHeader, dashboard composites (DeltaBadge, StatCard with threshold tone, EmptyState, QueryState/LoadingState/ErrorState, SettingsSection/SettingsRow/DangerZone)',
|
|
273
293
|
optionalPeers: [
|
|
274
294
|
'react-markdown',
|
|
275
295
|
'remark-gfm',
|
|
@@ -358,7 +378,7 @@ export const SURFACES = {
|
|
|
358
378
|
},
|
|
359
379
|
'./vite': {
|
|
360
380
|
kind: 'tooling',
|
|
361
|
-
layer: '
|
|
381
|
+
layer: 'build-tooling',
|
|
362
382
|
description:
|
|
363
383
|
'basaltViteConfig(opts) — Vite preset for basalt-ui consumer apps; basaltAppPlugin(opts) — PWA head, manifest, and icon metadata derived from the token palette',
|
|
364
384
|
optionalPeers: ['vite-plugin-pwa'],
|
|
@@ -381,7 +401,10 @@ export const SURFACES = {
|
|
|
381
401
|
rule: 'batteries',
|
|
382
402
|
skill: ['basalt-app'],
|
|
383
403
|
guardKinds: [],
|
|
384
|
-
|
|
404
|
+
// Both laws this surface used to declare advisory (F5), guarded as of 1.28.0 and both `warn`:
|
|
405
|
+
// `query-dual-import`'s softer half reads intent ("this file is already a basalt file") and
|
|
406
|
+
// `query-fn-unwrap` is a text heuristic inside a syntactic range. See their grace entries.
|
|
407
|
+
pluginRules: ['query-dual-import', 'query-fn-unwrap'],
|
|
385
408
|
description: 'createBasaltQueryClient, transport-agnostic unwrap, lazy BasaltQueryDevtools',
|
|
386
409
|
optionalPeers: ['@tanstack/react-query-devtools'],
|
|
387
410
|
globs: {
|
|
@@ -415,9 +438,13 @@ export const SURFACES = {
|
|
|
415
438
|
rule: 'batteries',
|
|
416
439
|
skill: ['basalt-design'],
|
|
417
440
|
guardKinds: [],
|
|
418
|
-
|
|
441
|
+
// The one change in the 1.28.0 forms minor a compiler cannot see: `inputProps` stopped
|
|
442
|
+
// returning `key`, and the pre-1.28.0 spread still type-checks, renders and validates — it
|
|
443
|
+
// only stops resetting. `warn` through the 1.30.0 grace because it fires on what every
|
|
444
|
+
// consumer ships today (`PLUGIN_RULE_GRACE`).
|
|
445
|
+
pluginRules: ['forms-field-key'],
|
|
419
446
|
description:
|
|
420
|
-
'Mantine form
|
|
447
|
+
'Mantine form layer: useBasaltForm + inputProps/fieldKey (two calls — a spread `key` is a React 19 warning), the FormSection/FormRow/FormGroup/FormActions layout (FormRow is law C1’s form row), useFormSubmit (submit state, decoded errors, server fieldErrors, focus-first-error, validateAsync), FormStateProvider disable propagation, useFieldArray, FormErrorSummary, useFormDraft with autosave (Standard Schema; deprecated `field` alias for `inputProps` until the surface next changes)',
|
|
421
448
|
optionalPeers: ['@mantine/form'],
|
|
422
449
|
forbiddenImports: [],
|
|
423
450
|
},
|
|
@@ -553,12 +580,16 @@ export const SURFACES = {
|
|
|
553
580
|
// The text lane of law C1 — the plugin's `control-outside-home` seen through a 12-line host-tag
|
|
554
581
|
// window, since a regex scan has no ancestry. Same law, same wave, same promotion.
|
|
555
582
|
guardKinds: ['raw-selection-control'],
|
|
556
|
-
// The control tier itself (laws C1/C3/C5/C9). `hand-rolled-filter
|
|
557
|
-
//
|
|
558
|
-
//
|
|
583
|
+
// The control tier itself (laws C1/C3/C5/C9). `hand-rolled-filter`, `control-size-literal` and
|
|
584
|
+
// `responsive-twin` all ship `error`; the two C1 placement rules are the grace entries in
|
|
585
|
+
// `PLUGIN_RULE_GRACE`, both promoting at 1.30.0 — `control-outside-home` re-dated against the
|
|
586
|
+
// wave-7 measurement, `bound-control-outside-home` new since 1.28.0 (ASIDE-SPEC G5: the basalt
|
|
587
|
+
// half of C1, where a bound control in a section body rendered as a stray pill). The budget
|
|
588
|
+
// rules live on `.` with `PageBar` itself.
|
|
559
589
|
pluginRules: [
|
|
560
590
|
'hand-rolled-filter',
|
|
561
591
|
'control-outside-home',
|
|
592
|
+
'bound-control-outside-home',
|
|
562
593
|
'control-size-literal',
|
|
563
594
|
'responsive-twin',
|
|
564
595
|
],
|
|
@@ -571,7 +602,7 @@ export const SURFACES = {
|
|
|
571
602
|
'C12 — one shape for refresh/sync (SyncButton); only the alias table sees a renamed copy',
|
|
572
603
|
],
|
|
573
604
|
description:
|
|
574
|
-
'The control tier (docs/CONTROLS-SPEC.md §3): FilterSet (nowrap row + measured +N fold + the mobile Filters (n) sheet), RangeFilter/CompareFilter/SelectFilter/MultiSelectFilter/SearchFilter/ToggleFilter (each bound to a FieldHandle — no value/onChange/size, law C2/C5), ViewTabs, and the action/sync family (ActionGroup, OverflowMenu, SyncButton, BarAction/GlobalAction). Every control owns its own desktop/mobile swap in CSS (C9) and renders size="ctl" internally. Resolves and renders with NO @mantine/dates installed — the custom date picker is injected through RangeFilter.customPicker from ./controls-dates.',
|
|
605
|
+
'The control tier (docs/CONTROLS-SPEC.md §3): FilterSet (nowrap row + measured +N fold + the mobile Filters (n) sheet), RangeFilter/CompareFilter/SelectFilter/MultiSelectFilter/NumberFilter/SearchFilter/ToggleFilter (each bound to a FieldHandle — no value/onChange/size, law C2/C5; NumberFilter is the field.number lane, a radio list over `options` or a stepper without), ViewTabs, and the action/sync family (ActionGroup, OverflowMenu, SyncButton, BarAction/GlobalAction). THREE surfaces, picked by the home and never by a prop (useFilterSurface): pill in a PageBar row, sheet in the mobile Filters (n) drawer, panel in a PageAside body — where every control renders an inspector/facet ROW instead of a chip (docs/ASIDE-SPEC.md §3). PanelRow is that row primitive (label above, hint, mono readout, an `end` control on the label line) and SliderControl is the one bound control with no pill form at all; the counts/max props on MultiSelectFilter render the Foundry facet list there. Every control owns its own desktop/mobile swap in CSS (C9) and renders size="ctl" internally. Resolves and renders with NO @mantine/dates installed — the custom date picker is injected through RangeFilter.customPicker from ./controls-dates.',
|
|
575
606
|
optionalPeers: [],
|
|
576
607
|
forbiddenImports: [],
|
|
577
608
|
},
|
|
@@ -599,10 +630,10 @@ export const SURFACES = {
|
|
|
599
630
|
optionalPeers: [],
|
|
600
631
|
// Consumers import basalt-ui/state from node_modules (lint-ignored), so there is nothing to
|
|
601
632
|
// enforce consumer-side, and a shipped **/state* glob would wrongly hit consumers' own
|
|
602
|
-
// Mantine-using state files. Enforce
|
|
633
|
+
// Mantine-using state files. Enforce basalt's own barrel AND its implementation files.
|
|
603
634
|
globs: {
|
|
604
635
|
shipped: [],
|
|
605
|
-
repo: ['packages/basalt-ui/src/state.ts'],
|
|
636
|
+
repo: ['packages/basalt-ui/src/state.ts', 'packages/basalt-ui/src/state/**'],
|
|
606
637
|
},
|
|
607
638
|
// @visx/* ban dropped — `basalt/visx-boundary` now bans it universally outside charts.
|
|
608
639
|
forbiddenImports: [...MANTINE_BANS],
|
package/src/theme/ctl-theme.tsx
CHANGED
|
@@ -78,6 +78,16 @@ export const CTL_THEME: MantineThemeOverride = {
|
|
|
78
78
|
},
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
+
/**
|
|
82
|
+
* **`Slider` is deliberately NOT here, and `--slider-size-ctl` still is** (`theme/index.ts`). The
|
|
83
|
+
* tier's var set is what the size means, and `controls/slider-control.tsx` states `size="ctl"`
|
|
84
|
+
* itself the way every control on `./controls` does. Putting it in this map instead would widen
|
|
85
|
+
* `basalt/control-size-literal` — the rule is scoped to `CTL_THEME_TAGS`, ships at `error`, and a
|
|
86
|
+
* widened `error` rule lands its new form with no grace period at all (C16, `docs/CONTROLS-SPEC.md`
|
|
87
|
+
* §6). A `Slider` a consumer sizes by hand in a slot therefore keeps working; the one basalt draws
|
|
88
|
+
* is on the tier because it says so.
|
|
89
|
+
*/
|
|
90
|
+
|
|
81
91
|
/**
|
|
82
92
|
* The `tier="widget"` slot theme — ActionIcon-ONLY, at the 24px `size="icon"` step
|
|
83
93
|
* (`--ai-size-icon` → `--vx-space-control-height-widget`, `docs/CONTROLS-SPEC.md` §5).
|
package/src/theme/index.ts
CHANGED
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
Accordion,
|
|
20
20
|
ActionIcon,
|
|
21
21
|
Alert,
|
|
22
|
+
AppShell,
|
|
22
23
|
Badge,
|
|
23
24
|
Breadcrumbs,
|
|
24
25
|
Button,
|
|
@@ -547,6 +548,24 @@ function buildTheme(data: PaletteData, options: BuildThemeOptions = {}): Mantine
|
|
|
547
548
|
},
|
|
548
549
|
},
|
|
549
550
|
}),
|
|
551
|
+
// Region seams (docs/DESIGN-SPEC.md §5, §8 #12): the ONE lever for every AppShell edge —
|
|
552
|
+
// Mantine declares `--app-shell-border-color` on the shell element per scheme, which beats
|
|
553
|
+
// an inherited `:root` value, so a theme-level `vars` override (merged into the root's
|
|
554
|
+
// inline style) wins. Sections keep their default `withBorder: true`; the color is this.
|
|
555
|
+
// `styles` would also land on the same root style attribute, just through Mantine's own
|
|
556
|
+
// `[key: string]: any` index rather than a typed field.
|
|
557
|
+
// Cast: `AppShellCssVariables` declares only `--app-shell-transition-duration` /
|
|
558
|
+
// `-timing-function`, yet Mantine's OWN AppShell.css sets `--app-shell-border-color` on the
|
|
559
|
+
// same root.
|
|
560
|
+
AppShell: AppShell.extend({
|
|
561
|
+
vars: () =>
|
|
562
|
+
({ root: { '--app-shell-border-color': 'var(--vx-divider)' } }) as unknown as {
|
|
563
|
+
root: Record<
|
|
564
|
+
'--app-shell-transition-duration' | '--app-shell-transition-timing-function',
|
|
565
|
+
string | undefined
|
|
566
|
+
>
|
|
567
|
+
},
|
|
568
|
+
}),
|
|
550
569
|
// "Ink earns its color" — a nav selection is UI state, not the identity accent on the LABEL.
|
|
551
570
|
// The active item is a SELECTED ROW, not a raised control: the same ink-tint idiom as the
|
|
552
571
|
// hover state (one step stronger, ink-9%), no panel fill and no `shadow-card` — a raised,
|
|
@@ -733,13 +752,32 @@ function buildTheme(data: PaletteData, options: BuildThemeOptions = {}): Mantine
|
|
|
733
752
|
classNames: (_theme, props) =>
|
|
734
753
|
(props.variant ?? 'filled') === 'filled' ? { label: controlsClasses.chipLabel } : {},
|
|
735
754
|
}),
|
|
736
|
-
// Track = ink-6% tint, radius 7, 2px padding; active segment = panel
|
|
737
|
-
// radius 5. `--sc-radius`/`--sc-color` don't reach the root track background
|
|
738
|
-
// hardcodes that to a raw gray step), so it's forced via `styles.root` same as
|
|
739
|
-
// The active-only ink label color + weight can't live in the flat `styles.label`
|
|
740
|
-
// (applies to every option regardless of state), so it's in segmented-control.module.css
|
|
755
|
+
// Track = ink-6% tint, radius 7, 2px padding; active segment = an ink-mixed panel fill +
|
|
756
|
+
// `shadow-ctrl`, radius 5. `--sc-radius`/`--sc-color` don't reach the root track background
|
|
757
|
+
// (Mantine hardcodes that to a raw gray step), so it's forced via `styles.root` same as
|
|
758
|
+
// Card/Paper. The active-only ink label color + weight can't live in the flat `styles.label`
|
|
759
|
+
// object (applies to every option regardless of state), so it's in segmented-control.module.css
|
|
741
760
|
// instead — same pattern as NavLink's active-icon accent.
|
|
742
761
|
//
|
|
762
|
+
// The indicator's fill is `color-mix(in srgb, var(--vx-ink) 12%, var(--vx-surface-panel))`,
|
|
763
|
+
// not a flat `--vx-surface-panel` — a flat panel fill is indistinguishable from the track's
|
|
764
|
+
// OWN parent on the one surface that IS `--vx-surface-panel` (the aside's `panel` filter
|
|
765
|
+
// surface, `docs/CONTROLS-SPEC.md` §3): the track (ink-6% over panel) and the indicator (panel,
|
|
766
|
+
// flat) then differ by 6% ink with no other cue, and `shadow-ctrl` alone (a bare
|
|
767
|
+
// `0 1px 2px` drop, no ring) reads as "barely there". This is NOT the `raised`-token doctrine
|
|
768
|
+
// in `tokens/palette.ts` (`SHADOW.raised`'s "a default control nested in a Card has no boundary
|
|
769
|
+
// but the drop — raise the drop, do not reintroduce an edge") — that doctrine is scoped to the
|
|
770
|
+
// shared Button/ActionIcon/Input depth token, whose fill is a real surface color a border would
|
|
771
|
+
// outline. The indicator's own fill has no such constraint, so a second ink-mix step (12%, double
|
|
772
|
+
// the track's) is the fix: it holds up on every surface the control mounts on, not only the
|
|
773
|
+
// panel-nested one.
|
|
774
|
+
//
|
|
775
|
+
// `.control`'s `min-width: 0` (`segmented-control.module.css`) is the other half of an even
|
|
776
|
+
// `fullWidth` split — Mantine's own `.control` ships `flex: 1` with no `min-width` override, so
|
|
777
|
+
// the initial `auto` floors every option at its min-content width and a `fullWidth` track splits
|
|
778
|
+
// UNEVENLY. The label already carries `overflow: hidden` + `text-overflow: ellipsis`, so a
|
|
779
|
+
// label that no longer fits its equal share truncates instead of forcing the column wide.
|
|
780
|
+
//
|
|
743
781
|
// The track's padding is `SPACE_FIXED.segmentedTrackInset`, a plain literal — NOT a
|
|
744
782
|
// `--vx-space-*` var — because it is density-EXEMPT: it is load-bearing for the nested-corner
|
|
745
783
|
// law (`RADIUS.card === RADIUS_STEP.tight + segmentedTrackInset`, see that constant's doc in
|
|
@@ -748,7 +786,10 @@ function buildTheme(data: PaletteData, options: BuildThemeOptions = {}): Mantine
|
|
|
748
786
|
// density.
|
|
749
787
|
SegmentedControl: SegmentedControl.extend({
|
|
750
788
|
defaultProps: { radius: radius.card },
|
|
751
|
-
classNames: {
|
|
789
|
+
classNames: {
|
|
790
|
+
label: segmentedControlClasses.label,
|
|
791
|
+
control: segmentedControlClasses.control,
|
|
792
|
+
},
|
|
752
793
|
// `label` gets a `ctl`-only min-height (function-form `styles`, same `props.size === …` gate
|
|
753
794
|
// as Button/ActionIcon/Input's `vars` overrides above) so a `size="ctl"` SegmentedControl
|
|
754
795
|
// matches the ctl Button/Input box exactly instead of following its own fixed padding — see
|
|
@@ -758,21 +799,57 @@ function buildTheme(data: PaletteData, options: BuildThemeOptions = {}): Mantine
|
|
|
758
799
|
root: {
|
|
759
800
|
backgroundColor: 'color-mix(in srgb, var(--vx-ink) 6%, transparent)',
|
|
760
801
|
padding: `${SPACE_FIXED.segmentedTrackInset}px`,
|
|
802
|
+
// The OUTER safety net a `.control`'s own `min-width: 0` (`segmented-control.module.css`)
|
|
803
|
+
// cannot provide by itself: that rule only lets each SEGMENT shrink below its own label's
|
|
804
|
+
// content width so `fullWidth` can split evenly — it does nothing to stop the WHOLE TRACK
|
|
805
|
+
// from being squeezed by an ANCESTOR flex row with room to spare (a `Section`/`StatCard`
|
|
806
|
+
// header's `actions` slot), which silently clipped "Absolute" to "Absolut" with no
|
|
807
|
+
// ellipsis at all. `min-width: max-content` pins the root to the sum of its labels'
|
|
808
|
+
// natural widths — it now OVERFLOWS a too-narrow ancestor instead of shrinking into it,
|
|
809
|
+
// which is also what makes the overflow MEASURABLE (`panel-row.tsx`'s `useTrackFits`
|
|
810
|
+
// compares the root's rendered width against its parent's available space). Inside that
|
|
811
|
+
// floor, `fullWidth` with room to spare still splits its segments evenly exactly as
|
|
812
|
+
// before — the floor only ever raises the STARTING point flex-grow distributes surplus
|
|
813
|
+
// from, never removes the segments' own equal-share arithmetic.
|
|
814
|
+
minWidth: 'max-content',
|
|
761
815
|
},
|
|
762
816
|
indicator: {
|
|
763
|
-
backgroundColor: 'var(--vx-surface-panel)',
|
|
817
|
+
backgroundColor: 'color-mix(in srgb, var(--vx-ink) 12%, var(--vx-surface-panel))',
|
|
764
818
|
boxShadow: 'var(--vx-shadow-ctrl)',
|
|
765
819
|
borderRadius: 'var(--vx-radius-tight)',
|
|
766
820
|
},
|
|
767
821
|
// Conditionally spread the WHOLE key (never a present `label: undefined`) — the package
|
|
768
822
|
// builds under `exactOptionalPropertyTypes`, which treats a key present-but-`undefined` as
|
|
769
823
|
// a type error distinct from the key being absent.
|
|
824
|
+
//
|
|
825
|
+
// `width: '100%'` + `minWidth: 0` are load-bearing, not cosmetic: `inline-flex` is a
|
|
826
|
+
// shrink-to-fit box by default (like `inline-block`), so switching `.label` to it for
|
|
827
|
+
// vertical centering ALSO switched its width from "fills `.control`'s box" (a plain
|
|
828
|
+
// `display: block`'s default) to "sized to its own content" — which is invisible until
|
|
829
|
+
// `fullWidth` forces every `.control` to an EQUAL share (`segmented-control.module.css`'s
|
|
830
|
+
// `min-width: 0`): a label wider than that equal share then rendered at its own full
|
|
831
|
+
// content width, overflowing its column and getting hard-clipped by the track's own
|
|
832
|
+
// `overflow: hidden` instead of ellipsizing inside it ("Same period last year" cut off
|
|
833
|
+
// mid-word). `width: 100%` makes the inline-flex box fill `.control` again, and `minWidth:
|
|
834
|
+
// 0` is the same flex-item footgun `.control` itself needed — `.label` is ALSO a flex
|
|
835
|
+
// container's item once `fullWidth`'s `.root { display: flex }` applies, so it inherits an
|
|
836
|
+
// `auto` (content-based) minimum unless told otherwise.
|
|
770
837
|
...(props.size === 'ctl'
|
|
771
838
|
? {
|
|
772
839
|
label: {
|
|
773
840
|
display: 'inline-flex',
|
|
774
841
|
alignItems: 'center',
|
|
775
842
|
minHeight: `calc(var(--vx-space-control-height-ctl) * var(--mantine-scale) - ${2 * SPACE_FIXED.segmentedTrackInset}px)`,
|
|
843
|
+
// `width: '100%'` only when `fullWidth` — it is what makes an EQUAL-SPLIT
|
|
844
|
+
// segment's label fill its column instead of shrink-to-fit around its own text
|
|
845
|
+
// (the "Same period last year" clipped-with-no-ellipsis case). A NON-`fullWidth`
|
|
846
|
+
// track (a header's `actions` slot, two or three options) wants the opposite: its
|
|
847
|
+
// label sized to its OWN content, so the root's `min-width: max-content` (below)
|
|
848
|
+
// measures the label's true natural width rather than an equal 1/2 or 1/3 share
|
|
849
|
+
// computed through `.control`'s `flex-basis: 0%` — forcing `width: 100%` there
|
|
850
|
+
// too under-computed the shrink-to-fit root by a few px ("Absolute" clipped to
|
|
851
|
+
// "Absolut" even with the floor in place).
|
|
852
|
+
...(props.fullWidth === true ? { width: '100%', minWidth: 0 } : {}),
|
|
776
853
|
},
|
|
777
854
|
}
|
|
778
855
|
: {}),
|
|
@@ -896,9 +973,13 @@ function buildTheme(data: PaletteData, options: BuildThemeOptions = {}): Mantine
|
|
|
896
973
|
},
|
|
897
974
|
},
|
|
898
975
|
}),
|
|
899
|
-
// Modal/Drawer: overlay surface + overlay shadow on the content
|
|
900
|
-
// Mantine
|
|
901
|
-
//
|
|
976
|
+
// Modal/Drawer: overlay surface + overlay shadow on the content, the SAME surface on the
|
|
977
|
+
// header. Mantine's header is `position: sticky` by default, painted `--mantine-color-body` —
|
|
978
|
+
// basalt used to drop that to `transparent`, which reads fine over a body that never scrolls
|
|
979
|
+
// under it but shows every scrolled row straight through the title once one does (the mobile
|
|
980
|
+
// filter sheet, the shell's "More" nav sheet). The header stays sticky; only its own
|
|
981
|
+
// background moves back to opaque, matching the content box it sits above rather than the page
|
|
982
|
+
// behind it. Title = head font; close button = the ghost idiom (floating.module.css).
|
|
902
983
|
Modal: Modal.extend({
|
|
903
984
|
defaultProps: { radius: radius.floating },
|
|
904
985
|
classNames: { close: floatingClasses.closeButton },
|
|
@@ -907,7 +988,7 @@ function buildTheme(data: PaletteData, options: BuildThemeOptions = {}): Mantine
|
|
|
907
988
|
backgroundColor: 'var(--vx-surface-overlay)',
|
|
908
989
|
boxShadow: 'var(--vx-shadow-overlay)',
|
|
909
990
|
},
|
|
910
|
-
header: { backgroundColor: '
|
|
991
|
+
header: { backgroundColor: 'var(--vx-surface-overlay)' },
|
|
911
992
|
title: {
|
|
912
993
|
fontFamily: 'var(--basalt-font-head)',
|
|
913
994
|
fontWeight: 550,
|
|
@@ -922,7 +1003,7 @@ function buildTheme(data: PaletteData, options: BuildThemeOptions = {}): Mantine
|
|
|
922
1003
|
backgroundColor: 'var(--vx-surface-overlay)',
|
|
923
1004
|
boxShadow: 'var(--vx-shadow-overlay)',
|
|
924
1005
|
},
|
|
925
|
-
header: { backgroundColor: '
|
|
1006
|
+
header: { backgroundColor: 'var(--vx-surface-overlay)' },
|
|
926
1007
|
title: {
|
|
927
1008
|
fontFamily: 'var(--basalt-font-head)',
|
|
928
1009
|
fontWeight: 550,
|
|
@@ -1153,13 +1234,30 @@ const CTL_INPUT_PADDING_Y = 4
|
|
|
1153
1234
|
const CTL_SEGMENT_PADDING_Y = 2.5
|
|
1154
1235
|
/** A `ctl` Combobox chevron. Mantine's own `xs` value; restated because it cannot be referenced. */
|
|
1155
1236
|
const CTL_CHEVRON_SIZE = 14
|
|
1237
|
+
/**
|
|
1238
|
+
* The `ctl` NumberInput's stepper column, in px — Mantine's own `xs` pair (`--ni-chevron-size-xs`,
|
|
1239
|
+
* `--ni-right-section-width-xs`; `NumberInput.css`), restated for the same reason `CTL_CHEVRON_SIZE`
|
|
1240
|
+
* is: `xs` is Mantine's own `--input-height-xs: 30px`, the ONE built-in size tier that already equals
|
|
1241
|
+
* the `ctl` height, so its stepper column is the size a 30px NumberInput was always meant to carry.
|
|
1242
|
+
* Both vars are load-bearing, not cosmetic — `NumberInput.mjs`'s `varsResolver` sets
|
|
1243
|
+
* `--ni-chevron-size` via `getSize(size, 'ni-chevron-size')` (undeclared at `:root` for a custom
|
|
1244
|
+
* size, so a `size="ctl"` NumberInput fell back to the property's initial value, and
|
|
1245
|
+
* `.controls { max-width: calc(var(--ni-chevron-size) * 1.7) }` — `NumberInput.css:21` — resolved to
|
|
1246
|
+
* an invalid `calc()` and dropped its `max-width` entirely, so the stacked chevrons stretched across
|
|
1247
|
+
* the whole right section), and `rightSectionWidth` defaults to a raw
|
|
1248
|
+
* `` `var(--ni-right-section-width-${size})` `` template (`NumberInput.mjs:412`) rather than a
|
|
1249
|
+
* `getSize` call, so `ctl-tier-coverage.test.ts`'s scan cannot discover it — it is declared here
|
|
1250
|
+
* because the CSS reads it, not because a scan requires it.
|
|
1251
|
+
*/
|
|
1252
|
+
const CTL_NUMBER_CHEVRON_SIZE = 10
|
|
1253
|
+
const CTL_NUMBER_RIGHT_SECTION_WIDTH = 17
|
|
1156
1254
|
/**
|
|
1157
1255
|
* The `ctl` tier's Radio/Checkbox indicator box, in px — 16, the SAME square
|
|
1158
1256
|
* `theme/icon-slot.module.css` gives every icon in the tier, and for the same reason: a 13.5px
|
|
1159
1257
|
* option label needs a mark it reads as part of the row rather than as a control beside it. Mantine's
|
|
1160
1258
|
* default is `sm` (20px) and its `md` is 24px, both of which made the popover a column of controls
|
|
1161
|
-
* (
|
|
1162
|
-
*
|
|
1259
|
+
* (the sheet/panel forms found the same thing and went further — `docs/CONTROLS-SPEC.md` §3's
|
|
1260
|
+
* `PanelChoice`/facet rows draw no Radio/Checkbox indicator at all, a hidden native input instead).
|
|
1163
1261
|
*/
|
|
1164
1262
|
const CTL_TOGGLE_SIZE = 16
|
|
1165
1263
|
/**
|
|
@@ -1183,6 +1281,14 @@ const CTL_SWITCH_THUMB_SIZE = 12
|
|
|
1183
1281
|
* the last tier whose label still fits an 18px track. */
|
|
1184
1282
|
const CTL_SWITCH_TRACK_LABEL_SIZE = 5
|
|
1185
1283
|
const CTL_SWITCH_TRACK_LABEL_PADDING = 2
|
|
1284
|
+
/**
|
|
1285
|
+
* The `ctl` Slider's TRACK height, in px. The thumb is not a second number: Mantine derives it as
|
|
1286
|
+
* `calc(var(--slider-size) * 2)` (`Slider.mjs`'s `varsResolver`), so 6 lands a 12px thumb — the same
|
|
1287
|
+
* moving part the `ctl` Switch carries, which is what makes a row of inspector rows read as one
|
|
1288
|
+
* family. Mantine's own `md` (8 → a 16px thumb) is the tier's whole icon box, and its `xs`
|
|
1289
|
+
* (4 → 8px) is smaller than the tier's radio dot.
|
|
1290
|
+
*/
|
|
1291
|
+
const CTL_SLIDER_TRACK_SIZE = 6
|
|
1186
1292
|
|
|
1187
1293
|
/**
|
|
1188
1294
|
* The `size="ctl"` / `size="icon"` Mantine size-tier var sets (`docs/CONTROLS-SPEC.md` §5, C5) —
|
|
@@ -1241,6 +1347,8 @@ function ctlSizeVars(): Record<string, string> {
|
|
|
1241
1347
|
'--sc-padding-ctl': `${pxRem(CTL_SEGMENT_PADDING_Y)} calc(${pxRem(CTL_PADDING_X)} * var(--mantine-scale))`,
|
|
1242
1348
|
'--combobox-option-padding-ctl': `${pxRem(CTL_SEGMENT_PADDING_Y)} ${pxRem(CTL_PADDING_X)}`,
|
|
1243
1349
|
'--combobox-chevron-size-ctl': pxRem(CTL_CHEVRON_SIZE),
|
|
1350
|
+
'--ni-chevron-size-ctl': pxRem(CTL_NUMBER_CHEVRON_SIZE),
|
|
1351
|
+
'--ni-right-section-width-ctl': `calc(${pxRem(CTL_NUMBER_RIGHT_SECTION_WIDTH)} * var(--mantine-scale))`,
|
|
1244
1352
|
'--badge-height-ctl': ctlHeight,
|
|
1245
1353
|
'--badge-padding-x-ctl': `calc(${pxRem(CTL_PADDING_X)} * var(--mantine-scale))`,
|
|
1246
1354
|
'--badge-fz-ctl': `calc(${pxRem(VX.text.xs)} * var(--mantine-scale))`,
|
|
@@ -1262,6 +1370,10 @@ function ctlSizeVars(): Record<string, string> {
|
|
|
1262
1370
|
'--switch-thumb-size-ctl': `calc(${pxRem(CTL_SWITCH_THUMB_SIZE)} * var(--mantine-scale))`,
|
|
1263
1371
|
'--switch-label-font-size-ctl': pxRem(CTL_SWITCH_TRACK_LABEL_SIZE),
|
|
1264
1372
|
'--switch-track-label-padding-ctl': pxRem(CTL_SWITCH_TRACK_LABEL_PADDING),
|
|
1373
|
+
// Slider — the inspector row's control (`SliderControl`, `docs/ASIDE-SPEC.md` §1). One prefix
|
|
1374
|
+
// only: `slider-size` is the track, and every other dimension (the thumb, the root's inline
|
|
1375
|
+
// padding, the vertical hit box) is derived from it in `Slider.css`.
|
|
1376
|
+
'--slider-size-ctl': `calc(${pxRem(CTL_SLIDER_TRACK_SIZE)} * var(--mantine-scale))`,
|
|
1265
1377
|
}
|
|
1266
1378
|
}
|
|
1267
1379
|
|
|
@@ -1303,7 +1415,8 @@ function buildCssVariablesResolver(data: PaletteData): CSSVariablesResolver {
|
|
|
1303
1415
|
'--mantine-color-default-border': 'transparent',
|
|
1304
1416
|
'--mantine-color-dimmed': `var(--vx-neutral, ${NEUTRAL.neutral.light})`, // secondary / muted text
|
|
1305
1417
|
'--mantine-color-text': `var(--vx-ink, ${INK.ink.light})`, // primary body/heading text
|
|
1306
|
-
|
|
1418
|
+
// `--app-shell-border-color` is set by `components.AppShell.extend({ vars })` above — this
|
|
1419
|
+
// entry was dead (an element-level declaration always beats an inherited `:root` value).
|
|
1307
1420
|
// THE strict-surface lever. Mantine components do NOT chain border/surface colors through
|
|
1308
1421
|
// `--mantine-color-default-*`; each hardcodes a RAW ramp step (`--mantine-color-gray-{2,3,4}`
|
|
1309
1422
|
// on light) directly — which is why AppShell/Table/Input/Divider/Tabs/Popover/Accordion borders
|
|
@@ -1330,7 +1443,7 @@ function buildCssVariablesResolver(data: PaletteData): CSSVariablesResolver {
|
|
|
1330
1443
|
'--mantine-color-default-border': 'transparent',
|
|
1331
1444
|
'--mantine-color-dimmed': `var(--vx-neutral, ${NEUTRAL.neutral.dark})`,
|
|
1332
1445
|
'--mantine-color-text': `var(--vx-ink, ${INK.ink.dark})`,
|
|
1333
|
-
|
|
1446
|
+
// See the light block above — `--app-shell-border-color` is set by `AppShell.extend` now.
|
|
1334
1447
|
// Dark components read `--mantine-color-dark-4` (border) raw. `buildDarkTuple` already sets
|
|
1335
1448
|
// dark-4, but to a slightly lighter step than the hairline token, so layout borders read
|
|
1336
1449
|
// marginally heavier than card borders. Pin dark-4 to the SAME "line" token for parity.
|