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
package/src/controls/actions.tsx
CHANGED
|
@@ -13,8 +13,9 @@
|
|
|
13
13
|
* media query, so there is no first-paint flash and no hook that re-renders on resize.
|
|
14
14
|
*/
|
|
15
15
|
import { ActionIcon, Button, Group, Menu } from '@mantine/core'
|
|
16
|
-
import { createContext, useContext, useEffect } from 'react'
|
|
16
|
+
import { createContext, isValidElement, useContext, useEffect } from 'react'
|
|
17
17
|
import type { ReactNode } from 'react'
|
|
18
|
+
import type { BasaltProps } from '../common/props'
|
|
18
19
|
import type { NavAnchor } from '../nav/types'
|
|
19
20
|
import type { AnyNavLink } from '../router-tanstack/nav'
|
|
20
21
|
import { IconSlot } from '../theme/icon-slot'
|
|
@@ -75,7 +76,7 @@ export type BarAction = BarActionItem | BarActionMenu | BarActionCustom
|
|
|
75
76
|
* A home's `actions` slot. `primary` is SINGULAR by type — that is the whole enforcement of law
|
|
76
77
|
* C6's "exactly one primary"; there is no runtime check because a second one cannot be written.
|
|
77
78
|
*/
|
|
78
|
-
export type ActionGroupProps = {
|
|
79
|
+
export type ActionGroupProps = BasaltProps & {
|
|
79
80
|
primary?: BarAction
|
|
80
81
|
secondary?: BarAction[]
|
|
81
82
|
}
|
|
@@ -309,7 +310,7 @@ function menuRows(actions: readonly BarAction[]): ReactNode[] {
|
|
|
309
310
|
})
|
|
310
311
|
}
|
|
311
312
|
|
|
312
|
-
export type OverflowMenuProps = {
|
|
313
|
+
export type OverflowMenuProps = BasaltProps & {
|
|
313
314
|
actions: readonly BarAction[]
|
|
314
315
|
/**
|
|
315
316
|
* `more` — the labelled desktop `More` button. `kebab` — the mobile ⋯ icon button.
|
|
@@ -329,6 +330,8 @@ export function OverflowMenu({
|
|
|
329
330
|
actions,
|
|
330
331
|
trigger = 'more',
|
|
331
332
|
label = 'More',
|
|
333
|
+
className,
|
|
334
|
+
style,
|
|
332
335
|
}: OverflowMenuProps): ReactNode {
|
|
333
336
|
if (actions.length === 0) return null
|
|
334
337
|
return (
|
|
@@ -352,7 +355,13 @@ export function OverflowMenu({
|
|
|
352
355
|
// `size="ctl"` explicitly, not inherited: the kebab is rendered by `HeaderGlobalActions`
|
|
353
356
|
// too, which is shell chrome rather than a home's slot, so there is no `CtlSlot` above it
|
|
354
357
|
// there. 28px beside 30px buttons is the mismatch the header read as.
|
|
355
|
-
<ActionIcon
|
|
358
|
+
<ActionIcon
|
|
359
|
+
variant="subtle"
|
|
360
|
+
size="ctl"
|
|
361
|
+
aria-label={label}
|
|
362
|
+
{...(className !== undefined && { className })}
|
|
363
|
+
{...(style !== undefined && { style })}
|
|
364
|
+
>
|
|
356
365
|
<IconSlot className={classes.kebabIcon}>
|
|
357
366
|
<DotsGlyph />
|
|
358
367
|
</IconSlot>
|
|
@@ -365,6 +374,8 @@ export function OverflowMenu({
|
|
|
365
374
|
<ChevronGlyph />
|
|
366
375
|
</IconSlot>
|
|
367
376
|
}
|
|
377
|
+
{...(className !== undefined && { className })}
|
|
378
|
+
{...(style !== undefined && { style })}
|
|
368
379
|
>
|
|
369
380
|
{label}
|
|
370
381
|
</Button>
|
|
@@ -390,8 +401,9 @@ type BarActionRowProps = ActionGroupProps & {
|
|
|
390
401
|
host: 'page' | 'slot'
|
|
391
402
|
/**
|
|
392
403
|
* `desktop` renders the desktop variant only — `PageBar` row 2, whose items live in the row-1
|
|
393
|
-
* kebab below `sm` (
|
|
394
|
-
*
|
|
404
|
+
* kebab below `sm` (`docs/CONTROLS-SPEC.md` §2.1: mobile row 2 is two lines — tabs, then the
|
|
405
|
+
* first pill + `Filters (n)` + the aside's `Panel` pill; `docs/CONTROLS-SPEC.md` §2.1 still
|
|
406
|
+
* describes the pre-aside one-line form). @default 'both'
|
|
395
407
|
*/
|
|
396
408
|
viewport?: 'both' | 'desktop'
|
|
397
409
|
/**
|
|
@@ -461,6 +473,8 @@ export function BarActionRow({
|
|
|
461
473
|
viewport = 'both',
|
|
462
474
|
mobileOnly = [],
|
|
463
475
|
syncNode,
|
|
476
|
+
className,
|
|
477
|
+
style,
|
|
464
478
|
}: BarActionRowProps): ReactNode {
|
|
465
479
|
const context = useContext(BarExtrasContext)
|
|
466
480
|
// Read unconditionally (hook order), scoped afterwards — see this type's doc.
|
|
@@ -517,10 +531,20 @@ export function BarActionRow({
|
|
|
517
531
|
|
|
518
532
|
const desktopLead = inline.length > 0 || desktopOverflow.length > 0 || syncNode === undefined
|
|
519
533
|
|
|
534
|
+
// The caller's `className`/`style` land on the ONE desktop group and the ONE mobile group. A
|
|
535
|
+
// `syncNode` splits the desktop row in two, and with nothing to lead with (no inline actions, no
|
|
536
|
+
// overflow) the lead group does not render at all — the primary-only group beside the sync button
|
|
537
|
+
// IS the desktop row then, so it takes them instead of dropping them. Never both groups: two nodes
|
|
538
|
+
// carrying one `style` is a layout the caller did not write.
|
|
539
|
+
const rootProps = {
|
|
540
|
+
...(className !== undefined && { className }),
|
|
541
|
+
...(style !== undefined && { style }),
|
|
542
|
+
}
|
|
543
|
+
|
|
520
544
|
return (
|
|
521
545
|
<>
|
|
522
546
|
{hasDesktop && desktopLead && (
|
|
523
|
-
<Group gap={BAR_GAP} wrap="nowrap" visibleFrom="sm">
|
|
547
|
+
<Group gap={BAR_GAP} wrap="nowrap" visibleFrom="sm" {...rootProps}>
|
|
524
548
|
{joinRuns(inline, { viewport: 'desktop' }).map((run) =>
|
|
525
549
|
run.length === 1 ? (
|
|
526
550
|
<BarEntry key={run[0]!.key} action={run[0]!} emphasis="secondary" />
|
|
@@ -538,12 +562,12 @@ export function BarActionRow({
|
|
|
538
562
|
)}
|
|
539
563
|
{syncNode}
|
|
540
564
|
{syncNode !== undefined && desktopPrimary !== null && (
|
|
541
|
-
<Group gap={BAR_GAP} wrap="nowrap" visibleFrom="sm">
|
|
565
|
+
<Group gap={BAR_GAP} wrap="nowrap" visibleFrom="sm" {...(!desktopLead && rootProps)}>
|
|
542
566
|
{desktopPrimary}
|
|
543
567
|
</Group>
|
|
544
568
|
)}
|
|
545
569
|
{hasMobile && (
|
|
546
|
-
<Group gap={BAR_GAP} wrap="nowrap" hiddenFrom="sm">
|
|
570
|
+
<Group gap={BAR_GAP} wrap="nowrap" hiddenFrom="sm" {...rootProps}>
|
|
547
571
|
{joinRuns(mobileBar, { viewport: 'mobile', excludeKey: primary?.key }).map((run) =>
|
|
548
572
|
run.length === 1 ? (
|
|
549
573
|
<BarEntry
|
|
@@ -592,6 +616,62 @@ export function ActionGroup(props: ActionGroupProps): ReactNode {
|
|
|
592
616
|
return <BarActionRow {...props} host="slot" />
|
|
593
617
|
}
|
|
594
618
|
|
|
619
|
+
/**
|
|
620
|
+
* A home's `actions` slot in the two forms it accepts (law C15): typed `BarAction[]` DATA, or an
|
|
621
|
+
* opaque `ReactNode` row the caller drew itself.
|
|
622
|
+
*
|
|
623
|
+
* Three homes took a bare `ReactNode` (`Section`, `BasaltDataTable`, `StatCard`) while `PageBar` and
|
|
624
|
+
* the shell took typed data, so only half the framework got the C6 budget and the C7 overflow fold —
|
|
625
|
+
* the `ReactNode` half was clipped on a phone with no kebab to fold into. Widening those slots to
|
|
626
|
+
* this union is what puts the fold back in basalt's hands without moving any existing call site: a
|
|
627
|
+
* node still renders verbatim.
|
|
628
|
+
*/
|
|
629
|
+
export type SlotActions = BarAction[] | ReactNode
|
|
630
|
+
|
|
631
|
+
/**
|
|
632
|
+
* Which arm of {@link SlotActions} a value is, at runtime — the union has no discriminant, and a
|
|
633
|
+
* `ReactNode` can itself be an array (a fragment list), so "is it an array" is not the test.
|
|
634
|
+
*
|
|
635
|
+
* A `BarAction` is a plain object carrying a STRING `key`; a React element carries `key` too (often
|
|
636
|
+
* `null`) but answers `isValidElement`, which is what separates the two. An EMPTY array takes the
|
|
637
|
+
* DATA arm: `[]` is what a caller's `.filter()` returns when nothing survived it, and the data path
|
|
638
|
+
* renders exactly nothing for it (`BarActionRow` bails on an empty row) — so both arms paint the
|
|
639
|
+
* same pixels and the typed one keeps `Section`'s ≤3 count and every other reader on one branch,
|
|
640
|
+
* instead of re-deciding per emptiness.
|
|
641
|
+
*/
|
|
642
|
+
export function isBarActionList(actions: SlotActions): actions is BarAction[] {
|
|
643
|
+
return (
|
|
644
|
+
Array.isArray(actions) &&
|
|
645
|
+
actions.every(
|
|
646
|
+
(entry) =>
|
|
647
|
+
typeof entry === 'object' &&
|
|
648
|
+
entry !== null &&
|
|
649
|
+
!isValidElement(entry) &&
|
|
650
|
+
typeof (entry as { key?: unknown }).key === 'string',
|
|
651
|
+
)
|
|
652
|
+
)
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
/**
|
|
656
|
+
* Renders a {@link SlotActions} slot: the typed form goes through the SAME projection `PageBar` and
|
|
657
|
+
* `ActionGroup` use — inline up to {@link DESKTOP_SECONDARY_MAX}, the rest folded into `More`, and a
|
|
658
|
+
* mobile kebab below `sm` — and the node form is returned untouched.
|
|
659
|
+
*
|
|
660
|
+
* Every entry lands in `secondary`: a `BarAction[]` carries no primary marker, and law C6's "exactly
|
|
661
|
+
* one primary" is the page bar's rule, enforced by `ActionGroupProps.primary` being singular. A home
|
|
662
|
+
* that wants a filled action passes a node, or an `ActionGroup` of its own.
|
|
663
|
+
*
|
|
664
|
+
* `host="slot"`, never `'page'` — only `PageBar` row 1 may read the shell's global actions and claim
|
|
665
|
+
* the single mobile kebab (see {@link BarActionRowProps}).
|
|
666
|
+
*
|
|
667
|
+
* @example
|
|
668
|
+
* <Section title="Runs" actions={[{ key: 'export', label: 'Export', onClick: exportCsv }]} />
|
|
669
|
+
*/
|
|
670
|
+
export function BarActionSlot({ actions }: { actions: SlotActions }): ReactNode {
|
|
671
|
+
if (!isBarActionList(actions)) return actions
|
|
672
|
+
return <BarActionRow secondary={actions} host="slot" />
|
|
673
|
+
}
|
|
674
|
+
|
|
595
675
|
/**
|
|
596
676
|
* One bar entry, resolved by kind: a custom node renders itself, a menu group folds to `More`.
|
|
597
677
|
*
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
* <CompareFilter field={analytics.field.compare} />
|
|
9
9
|
*/
|
|
10
10
|
import type { ReactNode } from 'react'
|
|
11
|
+
import type { BasaltProps } from '../common/props'
|
|
12
|
+
import { assertRequiredProps } from '../common/validate'
|
|
11
13
|
import type { EnumField, FieldHandle } from '../state'
|
|
12
14
|
import { EnumFilter } from './enum-filter'
|
|
13
15
|
import { SwapGlyph } from './glyphs'
|
|
@@ -39,7 +41,7 @@ export const COMPARE_LABELS: Readonly<Record<CompareValue, string>> = {
|
|
|
39
41
|
year: 'Same period last year',
|
|
40
42
|
}
|
|
41
43
|
|
|
42
|
-
export type CompareFilterProps = {
|
|
44
|
+
export type CompareFilterProps = BasaltProps & {
|
|
43
45
|
readonly field: FieldHandle<EnumField<CompareValue>>
|
|
44
46
|
/** @default 'Compare' */
|
|
45
47
|
readonly label?: string
|
|
@@ -48,7 +50,13 @@ export type CompareFilterProps = {
|
|
|
48
50
|
readonly icon?: ReactNode
|
|
49
51
|
}
|
|
50
52
|
|
|
51
|
-
export function CompareFilter(
|
|
53
|
+
export function CompareFilter(props: CompareFilterProps): ReactNode {
|
|
54
|
+
// F-ERR-1 — without this a missing `field` surfaces from inside `EnumFilter` as
|
|
55
|
+
// `undefined is not an object (evaluating 'field.use')`, caught by `BasaltErrorBoundary`.
|
|
56
|
+
assertRequiredProps('CompareFilter', props, ['field'], {
|
|
57
|
+
field: 'bind it to a store field (`store.field.<name>`), never a value/onChange pair.',
|
|
58
|
+
})
|
|
59
|
+
const { field, label = 'Compare', icon, className, style } = props
|
|
52
60
|
// Read through the handle's own options so a consumer's `labels()` and its option ORDER both
|
|
53
61
|
// survive; only an UNLABELLED row (label === value) takes basalt's default string.
|
|
54
62
|
const options = field.options.map((option) =>
|
|
@@ -56,7 +64,16 @@ export function CompareFilter({ field, label = 'Compare', icon }: CompareFilterP
|
|
|
56
64
|
? { value: option.value, label: COMPARE_LABELS[option.value] }
|
|
57
65
|
: option,
|
|
58
66
|
)
|
|
59
|
-
return
|
|
67
|
+
return (
|
|
68
|
+
<EnumFilter
|
|
69
|
+
field={field}
|
|
70
|
+
label={label}
|
|
71
|
+
icon={icon ?? <SwapGlyph />}
|
|
72
|
+
options={options}
|
|
73
|
+
{...(className !== undefined && { className })}
|
|
74
|
+
{...(style !== undefined && { style })}
|
|
75
|
+
/>
|
|
76
|
+
)
|
|
60
77
|
}
|
|
61
78
|
|
|
62
79
|
function isCompareValue(value: string): value is CompareValue {
|
|
@@ -30,9 +30,11 @@
|
|
|
30
30
|
*/
|
|
31
31
|
import { Box } from '@mantine/core'
|
|
32
32
|
import type { ReactNode } from 'react'
|
|
33
|
+
import { cx } from '../common/props'
|
|
34
|
+
import type { BasaltProps } from '../common/props'
|
|
33
35
|
import classes from './controls.module.css'
|
|
34
36
|
|
|
35
|
-
export type ControlGroupProps = {
|
|
37
|
+
export type ControlGroupProps = BasaltProps & {
|
|
36
38
|
readonly children: ReactNode
|
|
37
39
|
/**
|
|
38
40
|
* `none` (the default) JOINS the children: no gap, one shared hairline between each pair, and the
|
|
@@ -46,16 +48,21 @@ export type ControlGroupProps = {
|
|
|
46
48
|
* @default 'none'
|
|
47
49
|
*/
|
|
48
50
|
readonly gap?: 'none' | 'tight'
|
|
49
|
-
readonly className?: string
|
|
50
51
|
}
|
|
51
52
|
|
|
52
|
-
export function ControlGroup({
|
|
53
|
+
export function ControlGroup({
|
|
54
|
+
children,
|
|
55
|
+
gap = 'none',
|
|
56
|
+
className,
|
|
57
|
+
style,
|
|
58
|
+
}: ControlGroupProps): ReactNode {
|
|
53
59
|
return (
|
|
54
60
|
// A Mantine `Box`, not a raw `<div>` — `basalt/raw-html-layout` flags layout styling on a bare
|
|
55
61
|
// HTML tag, the same reason `CtlSlot` uses one.
|
|
56
62
|
<Box
|
|
57
|
-
className={
|
|
63
|
+
className={cx(classes.group, className)}
|
|
58
64
|
data-gap={gap}
|
|
65
|
+
{...(style !== undefined && { style })}
|
|
59
66
|
>
|
|
60
67
|
{children}
|
|
61
68
|
</Box>
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
* `basalt-ui/controls` — the filter/tab home surface (docs/CONTROLS-SPEC.md §3).
|
|
3
3
|
*
|
|
4
4
|
* Two form factors per control, ONE mount each, switched by CSS only (C9): the `pill` surface
|
|
5
|
-
* (bordered 30px chip + popover) and the `sheet` surface (
|
|
6
|
-
* `Filters (n)` Drawer
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* (bordered 30px chip + popover) and the `sheet` surface (`PanelRow` label-above-control rows
|
|
6
|
+
* inside the mobile `Filters (n)` Drawer — the same rows the aside's `panel` surface renders;
|
|
7
|
+
* `panel-row.module.css` owns their geometry). `48em` / `47.99375em` are the `sm` breakpoint in the
|
|
8
|
+
* exact literal form every other basalt CSS module uses — a media query cannot resolve a custom
|
|
9
|
+
* property, so the breakpoint cannot be a token (see `content/prose.module.css`'s note).
|
|
9
10
|
*/
|
|
10
11
|
|
|
11
12
|
/* ── The pill row (FilterSet, desktop + the mobile inline head) ───────────────────────────────── */
|
|
@@ -228,21 +229,19 @@
|
|
|
228
229
|
/* ── The sheet surface (inside the bottom Drawer) ─────────────────────────────────────────────── */
|
|
229
230
|
|
|
230
231
|
/*
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
* anything.
|
|
232
|
+
* The sheet's body holds a flat list of `PanelRow`s — the SAME rows the aside's `panel` surface
|
|
233
|
+
* renders (`panel-row.module.css`), zero gap between them: each row already draws its own
|
|
234
|
+
* `padding-block` inset and its own `.row + .row` hairline, the same "one rhythm, one separator"
|
|
235
|
+
* rule the aside's own body follows. A `gap` here would double up with that inset instead of
|
|
236
|
+
* replacing it.
|
|
237
237
|
*/
|
|
238
238
|
.sheetBody {
|
|
239
239
|
display: flex;
|
|
240
240
|
flex-direction: column;
|
|
241
|
-
gap: var(--vx-space-stack-md, 0.75rem);
|
|
242
241
|
}
|
|
243
242
|
|
|
244
243
|
/* The Drawer header holds the title AND `Reset all` (see `FilterSheet`'s doc), so it is a row that
|
|
245
|
-
* spreads rather than Mantine's default title-plus-close pair.
|
|
244
|
+
* spreads rather than Mantine's default title-plus-close pair. */
|
|
246
245
|
.sheetHeader {
|
|
247
246
|
min-height: var(--vx-space-sheet-row-height, 2.75rem);
|
|
248
247
|
padding-block: 0;
|
|
@@ -265,141 +264,12 @@
|
|
|
265
264
|
color: var(--vx-ink);
|
|
266
265
|
}
|
|
267
266
|
|
|
268
|
-
.sheetField {
|
|
269
|
-
display: flex;
|
|
270
|
-
flex-direction: column;
|
|
271
|
-
gap: 2px;
|
|
272
|
-
min-width: 0;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/* ── SheetOptionList / SheetDisclosure ────────────────────────────────────────────────────────── */
|
|
276
|
-
|
|
277
|
-
/* A `<fieldset>` in the option-list case (see `SheetOptionList`), a plain div in the disclosure
|
|
278
|
-
* case — the reset covers both, since a div ignores all of it. */
|
|
279
|
-
.sheetList {
|
|
280
|
-
display: flex;
|
|
281
|
-
flex-direction: column;
|
|
282
|
-
margin: 0;
|
|
283
|
-
padding: 0;
|
|
284
|
-
border: none;
|
|
285
|
-
min-inline-size: 0;
|
|
286
|
-
min-width: 0;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
267
|
/*
|
|
290
|
-
* The
|
|
291
|
-
*
|
|
292
|
-
*
|
|
293
|
-
*
|
|
294
|
-
*
|
|
295
|
-
*/
|
|
296
|
-
.sheetOption {
|
|
297
|
-
position: relative;
|
|
298
|
-
display: flex;
|
|
299
|
-
align-items: center;
|
|
300
|
-
gap: var(--mantine-spacing-xs, 0.625rem);
|
|
301
|
-
width: 100%;
|
|
302
|
-
min-height: var(--vx-space-sheet-row-height, 2.75rem);
|
|
303
|
-
appearance: none;
|
|
304
|
-
margin: 0;
|
|
305
|
-
padding: 0;
|
|
306
|
-
border: none;
|
|
307
|
-
background: none;
|
|
308
|
-
text-align: start;
|
|
309
|
-
color: var(--vx-muted);
|
|
310
|
-
cursor: pointer;
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
/* Hairline BETWEEN rows only — a trailing border on the last row would be the group separator this
|
|
314
|
-
* sheet deliberately does not draw. */
|
|
315
|
-
.sheetOption + .sheetOption,
|
|
316
|
-
.sheetDisclosureBody + .sheetOption,
|
|
317
|
-
.sheetOption + .sheetDisclosureBody {
|
|
318
|
-
border-top: 1px solid color-mix(in srgb, var(--vx-ink) 6%, transparent);
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
.sheetOption[data-selected] {
|
|
322
|
-
color: var(--vx-ink);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
.sheetOption[data-disabled] {
|
|
326
|
-
color: var(--vx-faint);
|
|
327
|
-
cursor: not-allowed;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
@media (hover: hover) {
|
|
331
|
-
.sheetOption:not([data-disabled]):hover {
|
|
332
|
-
color: var(--vx-ink);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
/*
|
|
337
|
-
* The real native radio/checkbox, visually hidden — the row's semantics, not decoration (see
|
|
338
|
-
* `SheetOptionList`'s doc). Not `display: none`: a hidden input is unfocusable, which would take the
|
|
339
|
-
* arrow-key group behaviour with it. Standard visually-hidden clip, and `:focus-visible` on it is
|
|
340
|
-
* what draws the ROW's focus ring below.
|
|
341
|
-
*/
|
|
342
|
-
.sheetOptionInput {
|
|
343
|
-
position: absolute;
|
|
344
|
-
width: 1px;
|
|
345
|
-
height: 1px;
|
|
346
|
-
margin: -1px;
|
|
347
|
-
padding: 0;
|
|
348
|
-
overflow: hidden;
|
|
349
|
-
clip-path: inset(50%);
|
|
350
|
-
white-space: nowrap;
|
|
351
|
-
border: 0;
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
.sheetOption:has(.sheetOptionInput:focus-visible),
|
|
355
|
-
.sheetOption:focus-visible {
|
|
356
|
-
outline: 2px solid var(--vx-accent);
|
|
357
|
-
outline-offset: -2px;
|
|
358
|
-
border-radius: var(--vx-radius-ctrl);
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
.sheetOptionLabel {
|
|
362
|
-
flex: 1;
|
|
363
|
-
min-width: 0;
|
|
364
|
-
font-size: var(--vx-text-md);
|
|
365
|
-
overflow: hidden;
|
|
366
|
-
text-overflow: ellipsis;
|
|
367
|
-
white-space: nowrap;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
.sheetOptionCheck {
|
|
371
|
-
display: inline-flex;
|
|
372
|
-
flex: none;
|
|
373
|
-
align-items: center;
|
|
374
|
-
color: var(--vx-accent);
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
.sheetDisclosureBody {
|
|
378
|
-
padding-bottom: var(--vx-space-stack-sm, 0.5rem);
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
/*
|
|
382
|
-
* The group heading — the package's MONO MICRO label (`docs/DESIGN-SPEC.md` §3), the same treatment
|
|
383
|
-
* `shell/app-sidebar.module.css`'s `.sectionLabel` draws for a nav section. It read as a head-font
|
|
384
|
-
* 13.5px line before, which is the same typography as the option rows it labels, so a group heading
|
|
385
|
-
* and its first option were indistinguishable — and the sheet's only remaining structure IS the
|
|
386
|
-
* heading, since it draws no rules between groups.
|
|
387
|
-
*/
|
|
388
|
-
.sheetLabel {
|
|
389
|
-
font-family: var(--basalt-font-mono);
|
|
390
|
-
font-size: var(--vx-text-micro);
|
|
391
|
-
font-weight: 500;
|
|
392
|
-
text-transform: uppercase;
|
|
393
|
-
letter-spacing: 0.08em;
|
|
394
|
-
color: var(--vx-faint);
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
/*
|
|
398
|
-
* The heading a `Radio.Group`/`Checkbox.Group` renders for itself (Mantine's `Input.Label`) — same
|
|
399
|
-
* typography as `.sheetLabel`, which is what the other sheet fields use. Both surfaces get it: in
|
|
400
|
-
* the popover it is the only place the filter's NAME appears (the pill reads the value), and in the
|
|
401
|
-
* sheet it replaces a `SheetField` heading that could never be programmatically associated —
|
|
402
|
-
* `Radio.Group` overwrites any `aria-labelledby` with its own.
|
|
268
|
+
* The heading a `Radio.Group`/`Checkbox.Group` renders for itself (Mantine's `Input.Label`) — the
|
|
269
|
+
* package's MONO MICRO label treatment, weighted up to the head font so it reads as a control's own
|
|
270
|
+
* name rather than as an option row. In the popover it is the only place the filter's NAME appears
|
|
271
|
+
* (the pill reads the value); the sheet and panel forms name their control through `PanelRow`'s own
|
|
272
|
+
* label instead, which is why this class is popover-only.
|
|
403
273
|
*/
|
|
404
274
|
.groupLabel {
|
|
405
275
|
font-family: var(--basalt-font-head);
|
|
@@ -409,46 +279,6 @@
|
|
|
409
279
|
color: var(--vx-muted);
|
|
410
280
|
}
|
|
411
281
|
|
|
412
|
-
/* The sheet's `SheetField` heading sits 2px off its list — the mono micro step above is small
|
|
413
|
-
* enough that the default flow gap read as part of the first row. */
|
|
414
|
-
.sheetField > .sheetLabel {
|
|
415
|
-
margin-bottom: 2px;
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
/* 44px rows — the one sheet dimension C15 pins. */
|
|
419
|
-
.sheetRow {
|
|
420
|
-
display: flex;
|
|
421
|
-
align-items: center;
|
|
422
|
-
gap: var(--mantine-spacing-xs, 0.625rem);
|
|
423
|
-
min-height: var(--vx-space-sheet-row-height, 2.75rem);
|
|
424
|
-
width: 100%;
|
|
425
|
-
border-bottom: 1px solid var(--vx-surface-hairline);
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
.sheetRow:last-child {
|
|
429
|
-
border-bottom: none;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
/*
|
|
433
|
-
* A 44px row is only a 44px TOUCH TARGET if the `<label>` fills it. Mantine centres a Radio/Checkbox
|
|
434
|
-
* `body` in its root and the label line-height is ~20px, so without these the tappable strip is the
|
|
435
|
-
* middle 20px of the row and the outer 12px top and bottom do nothing (C15's number, not delivered).
|
|
436
|
-
* Passed through `classNames`, never as a global `.sheetRow label` selector — a descendant selector
|
|
437
|
-
* here would also capture a nested control's own labels.
|
|
438
|
-
*/
|
|
439
|
-
.sheetRowBody {
|
|
440
|
-
flex: 1;
|
|
441
|
-
align-items: center;
|
|
442
|
-
min-height: inherit;
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
.sheetRowLabel {
|
|
446
|
-
display: flex;
|
|
447
|
-
flex: 1;
|
|
448
|
-
align-items: center;
|
|
449
|
-
min-height: inherit;
|
|
450
|
-
}
|
|
451
|
-
|
|
452
282
|
/* ── ControlGroup ─────────────────────────────────────────────────────────────────────────────── */
|
|
453
283
|
|
|
454
284
|
/*
|
|
@@ -540,3 +370,156 @@
|
|
|
540
370
|
max-width: 9rem;
|
|
541
371
|
flex: 0 1 auto;
|
|
542
372
|
}
|
|
373
|
+
|
|
374
|
+
/* ── The facet list (MultiSelectFilter, `panel` + `sheet` surfaces) ──────────────────────────────── */
|
|
375
|
+
|
|
376
|
+
/*
|
|
377
|
+
* Foundry's facet column (`docs/ASIDE-SPEC.md` §1): one 30px row per option, label left, an optional
|
|
378
|
+
* mono count and a proportional bar behind it, a check at the trailing edge when selected. The
|
|
379
|
+
* `sheet` surface renders the SAME list (`docs/CONTROLS-SPEC.md` §3: "sheet = panel rows inside a
|
|
380
|
+
* Drawer") — a set past `max` folds behind `Show N more` on both.
|
|
381
|
+
*
|
|
382
|
+
* The semantics are a hidden native `<input>` inside a `<label>` — not `role="checkbox"` on a div —
|
|
383
|
+
* so the arrow-key group behaviour, the form-association and the announced state come for free, and
|
|
384
|
+
* the `<label>` wrapping it makes the whole row the hit target rather than a 16px mark inside it.
|
|
385
|
+
*/
|
|
386
|
+
.facetList {
|
|
387
|
+
display: flex;
|
|
388
|
+
flex-direction: column;
|
|
389
|
+
margin: 0;
|
|
390
|
+
padding: 0;
|
|
391
|
+
border: none;
|
|
392
|
+
min-inline-size: 0;
|
|
393
|
+
min-width: 0;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
.facetOption {
|
|
397
|
+
position: relative;
|
|
398
|
+
display: flex;
|
|
399
|
+
align-items: center;
|
|
400
|
+
gap: var(--vx-space-control-gap, 0.375rem);
|
|
401
|
+
width: 100%;
|
|
402
|
+
min-width: 0;
|
|
403
|
+
height: calc(var(--vx-space-control-height-ctl, 1.875rem) * var(--mantine-scale, 1));
|
|
404
|
+
appearance: none;
|
|
405
|
+
margin: 0;
|
|
406
|
+
padding: 0;
|
|
407
|
+
border: none;
|
|
408
|
+
background: none;
|
|
409
|
+
text-align: start;
|
|
410
|
+
color: var(--vx-muted);
|
|
411
|
+
cursor: pointer;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
.facetOption[data-selected] {
|
|
415
|
+
color: var(--vx-ink);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
.facetOption[data-disabled] {
|
|
419
|
+
cursor: not-allowed;
|
|
420
|
+
opacity: 0.55;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
.facetOption:has(.facetInput:focus-visible),
|
|
424
|
+
.facetOption:focus-visible {
|
|
425
|
+
outline: 2px solid var(--vx-accent);
|
|
426
|
+
outline-offset: -2px;
|
|
427
|
+
border-radius: var(--vx-radius-ctrl);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/*
|
|
431
|
+
* The proportional bar. It is BEHIND the row's text, not a column beside it — a bar in its own
|
|
432
|
+
* column costs the label a third of a 300px row, and the quantity being compared is the row itself.
|
|
433
|
+
* The width arrives as `--facet-fill` (an inline custom property, the one dynamic number here), so
|
|
434
|
+
* this rule owns every other dimension and the tint.
|
|
435
|
+
*
|
|
436
|
+
* Accent at low alpha, never a fill: `--vx-accent-fill` is a control's surface, and a row of eight
|
|
437
|
+
* of them would read as eight selected options.
|
|
438
|
+
*/
|
|
439
|
+
.facetBar {
|
|
440
|
+
position: absolute;
|
|
441
|
+
inset-block: 0;
|
|
442
|
+
inset-inline-start: 0;
|
|
443
|
+
width: var(--facet-fill, 0%);
|
|
444
|
+
border-radius: var(--vx-radius-ctrl);
|
|
445
|
+
background: color-mix(in srgb, var(--vx-accent) 12%, transparent);
|
|
446
|
+
pointer-events: none;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/* Every painted child sits above the bar. `position: relative` is all that takes — they are in the
|
|
450
|
+
* same stacking context and come later in the DOM. */
|
|
451
|
+
.facetLabel,
|
|
452
|
+
.facetCount,
|
|
453
|
+
.facetCheck {
|
|
454
|
+
position: relative;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
.facetLabel {
|
|
458
|
+
flex: 1;
|
|
459
|
+
min-width: 0;
|
|
460
|
+
font-size: var(--vx-text-sm);
|
|
461
|
+
overflow: hidden;
|
|
462
|
+
text-overflow: ellipsis;
|
|
463
|
+
white-space: nowrap;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
.facetCount {
|
|
467
|
+
flex: none;
|
|
468
|
+
font-family: var(--basalt-font-mono);
|
|
469
|
+
font-size: var(--vx-text-xs);
|
|
470
|
+
font-variant-numeric: tabular-nums;
|
|
471
|
+
color: var(--vx-faint);
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
.facetCheck {
|
|
475
|
+
display: inline-flex;
|
|
476
|
+
flex: none;
|
|
477
|
+
align-items: center;
|
|
478
|
+
color: var(--vx-accent);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/*
|
|
482
|
+
* The visible checkbox box a facet row draws when it carries no count/bar — the ONLY affordance an
|
|
483
|
+
* unselected, uncounted row had otherwise was none at all (`.facetCheck` above paints only once
|
|
484
|
+
* selected). Its own component (`Checkbox.Indicator`) reads `--checkbox-size-ctl` off the `size`
|
|
485
|
+
* prop, so no dimension is declared here; `flex: none` alone keeps it from being squeezed by the
|
|
486
|
+
* label's `flex: 1`.
|
|
487
|
+
*/
|
|
488
|
+
.facetCheckbox {
|
|
489
|
+
flex: none;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
.facetInput {
|
|
493
|
+
position: absolute;
|
|
494
|
+
width: 1px;
|
|
495
|
+
height: 1px;
|
|
496
|
+
margin: -1px;
|
|
497
|
+
padding: 0;
|
|
498
|
+
overflow: hidden;
|
|
499
|
+
clip-path: inset(50%);
|
|
500
|
+
white-space: nowrap;
|
|
501
|
+
border: 0;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
/* `Show N more` — the list's last row, same height and inset as an option so the column keeps its
|
|
505
|
+
* rhythm, but muted and mono-free because it is a disclosure and not a value. */
|
|
506
|
+
.facetMore {
|
|
507
|
+
display: flex;
|
|
508
|
+
align-items: center;
|
|
509
|
+
width: 100%;
|
|
510
|
+
height: calc(var(--vx-space-control-height-ctl, 1.875rem) * var(--mantine-scale, 1));
|
|
511
|
+
appearance: none;
|
|
512
|
+
margin: 0;
|
|
513
|
+
padding: 0;
|
|
514
|
+
border: none;
|
|
515
|
+
background: none;
|
|
516
|
+
text-align: start;
|
|
517
|
+
font-size: var(--vx-text-xs);
|
|
518
|
+
color: var(--vx-faint);
|
|
519
|
+
cursor: pointer;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
.facetMore:hover,
|
|
523
|
+
.facetMore:focus-visible {
|
|
524
|
+
color: var(--vx-ink);
|
|
525
|
+
}
|