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
|
@@ -18,18 +18,16 @@ declare const classes: {
|
|
|
18
18
|
readonly sheetHeader: string
|
|
19
19
|
readonly sheetTitle: string
|
|
20
20
|
readonly sheetTitleText: string
|
|
21
|
-
readonly sheetField: string
|
|
22
|
-
readonly sheetList: string
|
|
23
|
-
readonly sheetOption: string
|
|
24
|
-
readonly sheetDisclosureBody: string
|
|
25
|
-
readonly sheetOptionInput: string
|
|
26
|
-
readonly sheetOptionLabel: string
|
|
27
|
-
readonly sheetOptionCheck: string
|
|
28
|
-
readonly sheetLabel: string
|
|
29
21
|
readonly groupLabel: string
|
|
30
|
-
readonly sheetRow: string
|
|
31
|
-
readonly sheetRowBody: string
|
|
32
|
-
readonly sheetRowLabel: string
|
|
33
22
|
readonly phoneSelect: string
|
|
23
|
+
readonly facetList: string
|
|
24
|
+
readonly facetOption: string
|
|
25
|
+
readonly facetBar: string
|
|
26
|
+
readonly facetLabel: string
|
|
27
|
+
readonly facetCount: string
|
|
28
|
+
readonly facetCheck: string
|
|
29
|
+
readonly facetCheckbox: string
|
|
30
|
+
readonly facetInput: string
|
|
31
|
+
readonly facetMore: string
|
|
34
32
|
}
|
|
35
33
|
export default classes
|
|
@@ -28,11 +28,13 @@
|
|
|
28
28
|
*/
|
|
29
29
|
import { Button, Radio, Stack } from '@mantine/core'
|
|
30
30
|
import type { ReactNode } from 'react'
|
|
31
|
+
import type { BasaltProps } from '../common/props'
|
|
31
32
|
import type { FieldOption } from '../state'
|
|
32
33
|
import classes from './controls.module.css'
|
|
33
34
|
import { useFilterRegistration, useFilterSurface } from './filter-context'
|
|
34
35
|
import { FilterPill } from './filter-pill'
|
|
35
|
-
import {
|
|
36
|
+
import { useControlName } from './filter-sheet'
|
|
37
|
+
import { PanelChoice, PanelRow } from './panel-row'
|
|
36
38
|
import type { FilterOption } from './select-filter'
|
|
37
39
|
|
|
38
40
|
/**
|
|
@@ -46,13 +48,16 @@ export type ChoiceHandle<T extends string> = {
|
|
|
46
48
|
readonly options: readonly FieldOption[]
|
|
47
49
|
use(): readonly [T, (next: T) => void]
|
|
48
50
|
isDefault(v: T): boolean
|
|
51
|
+
/** Removes the value on whichever lane the field is on — what both reset paths call, never a write
|
|
52
|
+
* of the fallback back over it. See `useFilterRegistration`'s doc for why. */
|
|
53
|
+
clear(): void
|
|
49
54
|
}
|
|
50
55
|
|
|
51
|
-
export type EnumFilterProps<T extends string> = {
|
|
56
|
+
export type EnumFilterProps<T extends string> = BasaltProps & {
|
|
52
57
|
readonly field: ChoiceHandle<T>
|
|
53
58
|
readonly label: string
|
|
54
59
|
readonly icon?: ReactNode
|
|
55
|
-
/** Adds a `Clear` action that
|
|
60
|
+
/** Adds a `Clear` action that clears the field — the same `field.clear()` `Reset all` calls. */
|
|
56
61
|
readonly clearable?: boolean
|
|
57
62
|
/**
|
|
58
63
|
* Overrides `field.options` at render — a runtime catalogue whose labels carry live data, or the
|
|
@@ -60,6 +65,12 @@ export type EnumFilterProps<T extends string> = {
|
|
|
60
65
|
* into, and `exactOptionalPropertyTypes` rejects a possibly-undefined member on a bare optional.
|
|
61
66
|
*/
|
|
62
67
|
readonly options?: readonly FilterOption[] | undefined
|
|
68
|
+
/**
|
|
69
|
+
* Mono pill label — forwarded to `FilterPill.numeric`. Set by `NumberFilter`, whose values ARE
|
|
70
|
+
* numbers (`1` / `2` / `7`), and by nothing else: the same law `[data-numeric]` applies to a
|
|
71
|
+
* numeric SegmentedControl label. A word-valued filter never sets it.
|
|
72
|
+
*/
|
|
73
|
+
readonly numeric?: boolean | undefined
|
|
63
74
|
}
|
|
64
75
|
|
|
65
76
|
export function EnumFilter<T extends string>({
|
|
@@ -67,13 +78,16 @@ export function EnumFilter<T extends string>({
|
|
|
67
78
|
label,
|
|
68
79
|
icon,
|
|
69
80
|
clearable,
|
|
81
|
+
numeric,
|
|
70
82
|
options: optionsProp,
|
|
83
|
+
className,
|
|
84
|
+
style,
|
|
71
85
|
}: EnumFilterProps<T>): ReactNode {
|
|
72
86
|
const [value, setValue] = field.use()
|
|
73
87
|
const surface = useFilterSurface()
|
|
74
88
|
const isDefault = field.isDefault(value)
|
|
75
89
|
useFilterRegistration(!isDefault, () => {
|
|
76
|
-
|
|
90
|
+
field.clear()
|
|
77
91
|
})
|
|
78
92
|
|
|
79
93
|
// The prop wins whole, never merged: a catalogue that has dropped a value must be able to drop
|
|
@@ -81,26 +95,36 @@ export function EnumFilter<T extends string>({
|
|
|
81
95
|
const options: readonly FilterOption[] = optionsProp ?? field.options
|
|
82
96
|
const selected = options.find((option) => option.value === value)
|
|
83
97
|
const inSheet = surface === 'sheet'
|
|
84
|
-
const
|
|
98
|
+
const inPanel = surface === 'panel'
|
|
99
|
+
// Both non-pill surfaces render a VISIBLE heading for the control to point at; only the pill has
|
|
100
|
+
// none, because its text is the value.
|
|
101
|
+
const { labelId, nameProps } = useControlName(label, inSheet || inPanel)
|
|
85
102
|
|
|
86
|
-
// The SHEET form is
|
|
87
|
-
//
|
|
88
|
-
//
|
|
89
|
-
|
|
103
|
+
// The SHEET form is the PANEL form (`docs/CONTROLS-SPEC.md` §3: "sheet = panel rows inside a
|
|
104
|
+
// Drawer") — label above, control below, and the control is a full-width track while the set is
|
|
105
|
+
// small enough to read at ~300px, a `Select` past that. The sheet used to render a `SheetOptionList`
|
|
106
|
+
// (44px rows, a hairline between them), which did not scale: a filter with many options became a
|
|
107
|
+
// column of full-height rows as tall as the sheet itself, where a `PanelChoice` folds the same set
|
|
108
|
+
// behind a `Select` instead.
|
|
109
|
+
if (inSheet || inPanel) {
|
|
90
110
|
return (
|
|
91
|
-
<
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
111
|
+
<PanelRow
|
|
112
|
+
label={label}
|
|
113
|
+
labelId={labelId}
|
|
114
|
+
{...(className !== undefined && { className })}
|
|
115
|
+
{...(style !== undefined && { style })}
|
|
116
|
+
>
|
|
117
|
+
<PanelChoice
|
|
118
|
+
nameProps={nameProps}
|
|
119
|
+
value={value}
|
|
96
120
|
options={options}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
//
|
|
121
|
+
{...(numeric === true && { numeric: true })}
|
|
122
|
+
onChange={(next) => {
|
|
123
|
+
// Rendered from `options` — the cast restores what the codec already guarantees.
|
|
100
124
|
setValue(next as T)
|
|
101
125
|
}}
|
|
102
126
|
/>
|
|
103
|
-
</
|
|
127
|
+
</PanelRow>
|
|
104
128
|
)
|
|
105
129
|
}
|
|
106
130
|
|
|
@@ -138,7 +162,7 @@ export function EnumFilter<T extends string>({
|
|
|
138
162
|
variant="subtle"
|
|
139
163
|
size="ctl"
|
|
140
164
|
onClick={() => {
|
|
141
|
-
|
|
165
|
+
field.clear()
|
|
142
166
|
}}
|
|
143
167
|
>
|
|
144
168
|
Clear
|
|
@@ -151,7 +175,10 @@ export function EnumFilter<T extends string>({
|
|
|
151
175
|
<FilterPill
|
|
152
176
|
label={selected?.label ?? label}
|
|
153
177
|
active={!isDefault}
|
|
178
|
+
{...(numeric === true && { numeric: true })}
|
|
154
179
|
{...(icon !== undefined && { icon })}
|
|
180
|
+
{...(className !== undefined && { className })}
|
|
181
|
+
{...(style !== undefined && { style })}
|
|
155
182
|
>
|
|
156
183
|
<div className={classes.optionList}>{body}</div>
|
|
157
184
|
</FilterPill>
|
|
@@ -5,8 +5,12 @@
|
|
|
5
5
|
*
|
|
6
6
|
* **Surface** — `useFilterSurface()` is how a control decides its FORM, not a media query: `'pill'`
|
|
7
7
|
* inside the bar row (and inside the desktop `+N` fold), `'sheet'` inside the mobile `Filters (n)`
|
|
8
|
-
* Drawer
|
|
9
|
-
*
|
|
8
|
+
* Drawer and `'panel'` inside a `PageAside` body render the IDENTICAL control body — a chip in a
|
|
9
|
+
* 300px column, or across a bottom drawer, reads as a stray button, so both resolve to the same
|
|
10
|
+
* inspector ROW archetype (`docs/ASIDE-SPEC.md` §1, `docs/CONTROLS-SPEC.md` §3: "sheet = panel rows
|
|
11
|
+
* inside a Drawer"); only the chrome around them differs. A control renders exactly one form per
|
|
12
|
+
* mount; the desktop/mobile swap WITHIN the pill form is CSS (`visibleFrom`/`hiddenFrom`), never JS
|
|
13
|
+
* (C9).
|
|
10
14
|
*
|
|
11
15
|
* **Registry** — `useFilterRegistration()` is what makes `Filters (n)` and `Reset all` derived
|
|
12
16
|
* rather than hand-passed: each filter reports `{ isActive, reset }` for itself, so `FilterSet`
|
|
@@ -28,8 +32,11 @@ import {
|
|
|
28
32
|
} from 'react'
|
|
29
33
|
import type { ReactNode } from 'react'
|
|
30
34
|
|
|
31
|
-
/**
|
|
32
|
-
|
|
35
|
+
/**
|
|
36
|
+
* Which form a control renders. Provided by `FilterSet` (`'pill'` / `'sheet'`) and by `PageAside`
|
|
37
|
+
* (`'panel'`); `'pill'` when there is neither.
|
|
38
|
+
*/
|
|
39
|
+
export type FilterSurface = 'pill' | 'sheet' | 'panel'
|
|
33
40
|
|
|
34
41
|
const FilterSurfaceContext = createContext<FilterSurface>('pill')
|
|
35
42
|
|
|
@@ -38,7 +45,7 @@ const FilterSurfaceContext = createContext<FilterSurface>('pill')
|
|
|
38
45
|
*
|
|
39
46
|
* @example
|
|
40
47
|
* const surface = useFilterSurface()
|
|
41
|
-
* if (surface === 'sheet') return <
|
|
48
|
+
* if (surface === 'sheet' || surface === 'panel') return <PanelRow label={label}>…</PanelRow>
|
|
42
49
|
*/
|
|
43
50
|
export function useFilterSurface(): FilterSurface {
|
|
44
51
|
return useContext(FilterSurfaceContext)
|
|
@@ -61,7 +68,8 @@ const FilterRegistryContext = createContext<FilterRegistry | null>(null)
|
|
|
61
68
|
|
|
62
69
|
export type FilterSetScopeProps = {
|
|
63
70
|
readonly surface: FilterSurface
|
|
64
|
-
/** `null` on a second copy of the same children (the fold dropdown, the sheet)
|
|
71
|
+
/** `null` on a second copy of the same children (the fold dropdown, the sheet) and on a surface
|
|
72
|
+
* that owns no census at all (the aside panel — it has no `Filters (n)` and no `Reset all`). */
|
|
65
73
|
readonly registry: FilterRegistry | null
|
|
66
74
|
readonly children: ReactNode
|
|
67
75
|
}
|
|
@@ -80,9 +88,14 @@ export function FilterSetScope({ surface, registry, children }: FilterSetScopePr
|
|
|
80
88
|
* it no-ops outside a registering scope (a bare filter with no `FilterSet`, the fold dropdown, the
|
|
81
89
|
* sheet), which is what keeps it hook-safe in every control.
|
|
82
90
|
*
|
|
91
|
+
* The reset is `field.clear()`, never `setValue(field.fallback)`: writing the fallback back is a
|
|
92
|
+
* WRITE, so it persists the default as if the user had chosen it — the URL keeps `?window=7d`, the
|
|
93
|
+
* localStorage mirror keeps its key, and a later change to the field's fallback no longer reaches
|
|
94
|
+
* either. `clear()` removes the value instead, on whichever lane the field is on.
|
|
95
|
+
*
|
|
83
96
|
* @example
|
|
84
|
-
* const [value
|
|
85
|
-
* useFilterRegistration(!field.isDefault(value), () =>
|
|
97
|
+
* const [value] = field.use()
|
|
98
|
+
* useFilterRegistration(!field.isDefault(value), () => field.clear())
|
|
86
99
|
*/
|
|
87
100
|
export function useFilterRegistration(isActive: boolean, reset: () => void): void {
|
|
88
101
|
const registry = useContext(FilterRegistryContext)
|
|
@@ -16,11 +16,13 @@
|
|
|
16
16
|
import { Button, Popover } from '@mantine/core'
|
|
17
17
|
import { useState } from 'react'
|
|
18
18
|
import type { ReactNode } from 'react'
|
|
19
|
+
import { cx } from '../common/props'
|
|
20
|
+
import type { BasaltProps } from '../common/props'
|
|
19
21
|
import { IconSlot } from '../theme/icon-slot'
|
|
20
22
|
import classes from './controls.module.css'
|
|
21
23
|
import { UpDownGlyph } from './glyphs'
|
|
22
24
|
|
|
23
|
-
export type FilterPillProps = {
|
|
25
|
+
export type FilterPillProps = BasaltProps & {
|
|
24
26
|
readonly label: string
|
|
25
27
|
readonly icon?: ReactNode
|
|
26
28
|
/** Non-default → accent-tinted border. Derived from `field.isDefault(value)`, never hand-set. */
|
|
@@ -39,7 +41,6 @@ export type FilterPillProps = {
|
|
|
39
41
|
* where `aria-expanded` (which Mantine's `Popover.Target` supplies) is the correct state.
|
|
40
42
|
*/
|
|
41
43
|
readonly pressed?: boolean
|
|
42
|
-
readonly className?: string
|
|
43
44
|
/** Set by `FilterSet` on its own fold/sheet pills; a filter never passes either of these. */
|
|
44
45
|
readonly hideGlyph?: boolean
|
|
45
46
|
/** `data-shown` — the CSS hook that reveals the `+N` fold pill once folding is needed. */
|
|
@@ -56,6 +57,7 @@ export function FilterPill({
|
|
|
56
57
|
ariaLabel,
|
|
57
58
|
pressed,
|
|
58
59
|
className,
|
|
60
|
+
style,
|
|
59
61
|
hideGlyph,
|
|
60
62
|
shown,
|
|
61
63
|
}: FilterPillProps): ReactNode {
|
|
@@ -68,8 +70,9 @@ export function FilterPill({
|
|
|
68
70
|
<Button
|
|
69
71
|
variant="default"
|
|
70
72
|
size="ctl"
|
|
71
|
-
className={
|
|
73
|
+
className={cx(classes.pill, className)}
|
|
72
74
|
classNames={{ label: classes.pillLabel }}
|
|
75
|
+
{...(style !== undefined && { style })}
|
|
73
76
|
{...(active === true && { 'data-active': true })}
|
|
74
77
|
{...(numeric === true && { 'data-numeric': true })}
|
|
75
78
|
{...(ariaLabel !== undefined && { 'aria-label': ariaLabel })}
|
|
@@ -33,6 +33,8 @@
|
|
|
33
33
|
*/
|
|
34
34
|
import { Children, isValidElement, useCallback, useEffect, useRef, useState } from 'react'
|
|
35
35
|
import type { ReactNode, RefObject } from 'react'
|
|
36
|
+
import { cx } from '../common/props'
|
|
37
|
+
import type { BasaltProps, SlotStylesProps } from '../common/props'
|
|
36
38
|
import classes from './controls.module.css'
|
|
37
39
|
import { FilterSetScope, useFilterCensus } from './filter-context'
|
|
38
40
|
import { FilterPill } from './filter-pill'
|
|
@@ -44,18 +46,25 @@ const FOLD_PILL_WIDTH = 52
|
|
|
44
46
|
/** `--vx-space-control-gap`'s level-0 value — the fallback when the row has no computed style. */
|
|
45
47
|
const FALLBACK_GAP = 6
|
|
46
48
|
|
|
47
|
-
export type FilterSetProps =
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
49
|
+
export type FilterSetProps = BasaltProps &
|
|
50
|
+
SlotStylesProps<'root' | 'sheet'> & {
|
|
51
|
+
readonly children: ReactNode
|
|
52
|
+
/**
|
|
53
|
+
* How many children stay inline pills below `sm`. The rest are reachable only through the
|
|
54
|
+
* `Filters (n)` sheet — which always holds every child, inline ones included.
|
|
55
|
+
*
|
|
56
|
+
* @default 1
|
|
57
|
+
*/
|
|
58
|
+
readonly inline?: number
|
|
59
|
+
}
|
|
57
60
|
|
|
58
|
-
export function FilterSet({
|
|
61
|
+
export function FilterSet({
|
|
62
|
+
children,
|
|
63
|
+
inline = 1,
|
|
64
|
+
className,
|
|
65
|
+
style,
|
|
66
|
+
classNames,
|
|
67
|
+
}: FilterSetProps): ReactNode {
|
|
59
68
|
const items = Children.toArray(children)
|
|
60
69
|
const { registry, activeCount, resetAll } = useFilterCensus()
|
|
61
70
|
const [sheetOpened, setSheetOpened] = useState(false)
|
|
@@ -81,7 +90,12 @@ export function FilterSet({ children, inline = 1 }: FilterSetProps): ReactNode {
|
|
|
81
90
|
|
|
82
91
|
return (
|
|
83
92
|
<>
|
|
84
|
-
<div
|
|
93
|
+
<div
|
|
94
|
+
className={cx(classes.pillRow, classNames?.root, className)}
|
|
95
|
+
ref={rowRef}
|
|
96
|
+
data-filter-row
|
|
97
|
+
{...(style !== undefined && { style })}
|
|
98
|
+
>
|
|
85
99
|
<FilterSetScope surface="pill" registry={registry}>
|
|
86
100
|
{items.map((child, index) => (
|
|
87
101
|
// `Children.toArray` already stamped a stable `.0`/`.1`-style key on every child, so
|
|
@@ -131,7 +145,12 @@ export function FilterSet({ children, inline = 1 }: FilterSetProps): ReactNode {
|
|
|
131
145
|
</div>
|
|
132
146
|
|
|
133
147
|
{anyFoldedOnMobile && (
|
|
134
|
-
<FilterSheet
|
|
148
|
+
<FilterSheet
|
|
149
|
+
opened={sheetOpened}
|
|
150
|
+
onClose={closeSheet}
|
|
151
|
+
onResetAll={resetAll}
|
|
152
|
+
{...(classNames?.sheet !== undefined && { className: classNames.sheet })}
|
|
153
|
+
>
|
|
135
154
|
<FilterSetScope surface="sheet" registry={null}>
|
|
136
155
|
{items}
|
|
137
156
|
</FilterSetScope>
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The mobile `Filters (n)` sheet
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* The mobile `Filters (n)` sheet (`docs/CONTROLS-SPEC.md` §2.1/§3) — a bottom `Drawer` around the
|
|
3
|
+
* SAME `PanelRow` forms the aside's `panel` surface renders (`useFilterSurface` resolves `'sheet'`
|
|
4
|
+
* and `'panel'` to the identical control body; only the surrounding chrome differs). Every child of
|
|
5
|
+
* the `FilterSet` renders its full-width form inside it, edits APPLY IMMEDIATELY (there is no Apply
|
|
6
|
+
* button — the URL is the truth and a filter write is already `history: 'replace'`), and one
|
|
7
|
+
* `Reset all` (in the header, not a footer — see this module's doc below) clears every registered
|
|
8
|
+
* filter.
|
|
7
9
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
+
* This module used to also own the sheet's OWN row primitives — a `SheetOptionList` of 44px rows
|
|
11
|
+
* with a hairline between them, one per option. That did not scale (`docs/CONTROLS-SPEC.md` §3): a
|
|
12
|
+
* filter with many options became a sheet as tall as the set, where the panel's own `PanelChoice`
|
|
13
|
+
* (a track, or a `Select` past three) and `MultiSelectFilter`'s facet fold both already had an
|
|
14
|
+
* answer. Deleted with it: `SheetField`, `SheetOptionList`, `SheetDisclosure`, `SheetRow` and
|
|
15
|
+
* `sheetRowClassNames` (`MIGRATING.md`).
|
|
10
16
|
*
|
|
11
17
|
* INTERNAL, like `FilterPill`: `FilterSet` owns when the sheet opens, so a consumer mounting it by
|
|
12
18
|
* hand would own a second, unregistered filter home (C1).
|
|
@@ -14,12 +20,18 @@
|
|
|
14
20
|
import { Button, Drawer } from '@mantine/core'
|
|
15
21
|
import { useId } from 'react'
|
|
16
22
|
import type { ReactNode } from 'react'
|
|
23
|
+
import type { BasaltProps } from '../common/props'
|
|
17
24
|
import classes from './controls.module.css'
|
|
18
25
|
|
|
19
|
-
export type FilterSheetProps = {
|
|
26
|
+
export type FilterSheetProps = BasaltProps & {
|
|
20
27
|
readonly opened: boolean
|
|
21
28
|
readonly onClose: () => void
|
|
22
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Clears every registered filter. OMITTED on a sheet with no census behind it — the aside's
|
|
31
|
+
* mobile projection (`docs/ASIDE-SPEC.md` §0) mounts its children under a `null` registry, so
|
|
32
|
+
* there is nothing to reset and a button that resets nothing is worse than no button.
|
|
33
|
+
*/
|
|
34
|
+
readonly onResetAll?: () => void
|
|
23
35
|
readonly title?: string
|
|
24
36
|
readonly children: ReactNode
|
|
25
37
|
}
|
|
@@ -39,6 +51,8 @@ export function FilterSheet({
|
|
|
39
51
|
onResetAll,
|
|
40
52
|
title = 'Filters',
|
|
41
53
|
children,
|
|
54
|
+
className,
|
|
55
|
+
style,
|
|
42
56
|
}: FilterSheetProps): ReactNode {
|
|
43
57
|
return (
|
|
44
58
|
<Drawer
|
|
@@ -47,12 +61,16 @@ export function FilterSheet({
|
|
|
47
61
|
position="bottom"
|
|
48
62
|
radius="sm"
|
|
49
63
|
classNames={{ header: classes.sheetHeader, title: classes.sheetTitle }}
|
|
64
|
+
{...(className !== undefined && { className })}
|
|
65
|
+
{...(style !== undefined && { style })}
|
|
50
66
|
title={
|
|
51
67
|
<>
|
|
52
68
|
<span className={classes.sheetTitleText}>{title}</span>
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
69
|
+
{onResetAll !== undefined && (
|
|
70
|
+
<Button variant="subtle" size="ctl" onClick={onResetAll}>
|
|
71
|
+
Reset all
|
|
72
|
+
</Button>
|
|
73
|
+
)}
|
|
56
74
|
</>
|
|
57
75
|
}
|
|
58
76
|
>
|
|
@@ -61,8 +79,12 @@ export function FilterSheet({
|
|
|
61
79
|
)
|
|
62
80
|
}
|
|
63
81
|
|
|
64
|
-
/**
|
|
65
|
-
|
|
82
|
+
/**
|
|
83
|
+
* The selected-row mark — 16px, drawn at the row's trailing edge (`docs/CONTROLS-SPEC.md` §2.1).
|
|
84
|
+
* Exported from the MODULE, not from `./index.ts`: the panel surface's facet list draws the same
|
|
85
|
+
* mark at the same edge, and two hand-drawn checks would drift.
|
|
86
|
+
*/
|
|
87
|
+
export function CheckGlyph(): ReactNode {
|
|
66
88
|
return (
|
|
67
89
|
<svg
|
|
68
90
|
width={16}
|
|
@@ -80,177 +102,27 @@ function CheckGlyph(): ReactNode {
|
|
|
80
102
|
)
|
|
81
103
|
}
|
|
82
104
|
|
|
83
|
-
/** One row of a {@link SheetOptionList}. */
|
|
84
|
-
export type SheetOption = {
|
|
85
|
-
readonly value: string
|
|
86
|
-
readonly label: string
|
|
87
|
-
readonly disabled?: boolean
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export type SheetOptionListProps = {
|
|
91
|
-
/** `single` renders radio semantics, `multi` checkbox semantics. */
|
|
92
|
-
readonly mode: 'single' | 'multi'
|
|
93
|
-
/** The selected value(s) — a one-element array in `single` mode. */
|
|
94
|
-
readonly selected: readonly string[]
|
|
95
|
-
readonly options: readonly SheetOption[]
|
|
96
|
-
readonly onToggle: (value: string) => void
|
|
97
|
-
/** The `SheetField` heading this list is named by. */
|
|
98
|
-
readonly labelId: string
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* The sheet's ONE list form (`docs/CONTROLS-SPEC.md` §2.1): every option is a 44px full-width row,
|
|
103
|
-
* label left, a check at the trailing edge when selected, a 1px hairline between rows and nowhere
|
|
104
|
-
* else.
|
|
105
|
-
*
|
|
106
|
-
* **It replaced a `SegmentedControl` and a Mantine `Radio` list, for two different reasons.** The
|
|
107
|
-
* range presets rendered as a `orientation="vertical"` SegmentedControl, which in a full-width sheet
|
|
108
|
-
* is a stack of left-aligned labels inside a tinted track — it read as a broken control, not as a
|
|
109
|
-
* choice, and it carried the track's own inset so it aligned with nothing else in the sheet. The
|
|
110
|
-
* enum/multi filters rendered Mantine `Radio`/`Checkbox` rows, which put a 20px dot or box in the
|
|
111
|
-
* leading position of every row; at six filters the sheet was a column of controls rather than a
|
|
112
|
-
* column of options, and the leading marks pushed every label off the sheet's own text column.
|
|
113
|
-
*
|
|
114
|
-
* The semantics are a real native `<input>` inside the row's `<label>`, visually hidden — not
|
|
115
|
-
* `role="radio"` on a div. A hidden native input keeps the arrow-key group behaviour, the
|
|
116
|
-
* form-association and the announced state for free, and `<label>` wrapping it makes the whole 44px
|
|
117
|
-
* box the hit target (C15) without a single `onClick` on a non-interactive element.
|
|
118
|
-
*/
|
|
119
|
-
export function SheetOptionList({
|
|
120
|
-
mode,
|
|
121
|
-
selected,
|
|
122
|
-
options,
|
|
123
|
-
onToggle,
|
|
124
|
-
labelId,
|
|
125
|
-
}: SheetOptionListProps): ReactNode {
|
|
126
|
-
// ONE name per rendered list, so a sheet holding two range filters keeps two radio groups.
|
|
127
|
-
const name = useId()
|
|
128
|
-
return (
|
|
129
|
-
// A real `<fieldset>`, not `role="group"` on a div — the native element carries the grouping
|
|
130
|
-
// semantics and gets its own box reset in the module (`.sheetList`). `aria-labelledby` points at
|
|
131
|
-
// the `SheetField` heading rather than a `<legend>`: the heading is already visible above the
|
|
132
|
-
// list, and a legend would render it a second time.
|
|
133
|
-
<fieldset className={classes.sheetList} aria-labelledby={labelId}>
|
|
134
|
-
{options.map((option) => {
|
|
135
|
-
const isSelected = selected.includes(option.value)
|
|
136
|
-
return (
|
|
137
|
-
<label
|
|
138
|
-
key={option.value}
|
|
139
|
-
className={classes.sheetOption}
|
|
140
|
-
{...(isSelected && { 'data-selected': true })}
|
|
141
|
-
{...(option.disabled === true && { 'data-disabled': true })}
|
|
142
|
-
>
|
|
143
|
-
{/* theme-allow raw-form-control — the input is NEVER PAINTED. It is visually hidden
|
|
144
|
-
(`.sheetOptionInput`) and exists only to carry the row's semantics: the checked state,
|
|
145
|
-
the radio-group arrow keys, the announced name. The surface the reader sees and taps
|
|
146
|
-
is the `<label>` around it, which the theme's tokens style directly. A Mantine
|
|
147
|
-
`Radio` here would paint the 20px indicator this row form exists to remove — see
|
|
148
|
-
`SheetOptionList`'s doc. */}
|
|
149
|
-
<input
|
|
150
|
-
className={classes.sheetOptionInput}
|
|
151
|
-
type={mode === 'single' ? 'radio' : 'checkbox'}
|
|
152
|
-
name={name}
|
|
153
|
-
value={option.value}
|
|
154
|
-
checked={isSelected}
|
|
155
|
-
disabled={option.disabled === true}
|
|
156
|
-
aria-label={option.label}
|
|
157
|
-
onChange={() => {
|
|
158
|
-
onToggle(option.value)
|
|
159
|
-
}}
|
|
160
|
-
/>
|
|
161
|
-
<span className={classes.sheetOptionLabel}>{option.label}</span>
|
|
162
|
-
{isSelected && (
|
|
163
|
-
<span className={classes.sheetOptionCheck} aria-hidden>
|
|
164
|
-
<CheckGlyph />
|
|
165
|
-
</span>
|
|
166
|
-
)}
|
|
167
|
-
</label>
|
|
168
|
-
)
|
|
169
|
-
})}
|
|
170
|
-
</fieldset>
|
|
171
|
-
)
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
export type SheetDisclosureProps = {
|
|
175
|
-
readonly label: string
|
|
176
|
-
readonly expanded: boolean
|
|
177
|
-
readonly onToggle: () => void
|
|
178
|
-
readonly children: ReactNode
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* A 44px row that expands its own body inline — the sheet's answer to a control too large to sit in
|
|
183
|
-
* the list unconditionally (`RangeFilter`'s custom date picker, which is a whole calendar). Same row
|
|
184
|
-
* geometry as a {@link SheetOptionList} option, so the disclosure reads as the list's last entry
|
|
185
|
-
* rather than as a different kind of thing.
|
|
186
|
-
*/
|
|
187
|
-
export function SheetDisclosure({
|
|
188
|
-
label,
|
|
189
|
-
expanded,
|
|
190
|
-
onToggle,
|
|
191
|
-
children,
|
|
192
|
-
}: SheetDisclosureProps): ReactNode {
|
|
193
|
-
return (
|
|
194
|
-
<div className={classes.sheetList}>
|
|
195
|
-
<button
|
|
196
|
-
type="button"
|
|
197
|
-
className={classes.sheetOption}
|
|
198
|
-
aria-expanded={expanded}
|
|
199
|
-
{...(expanded && { 'data-selected': true })}
|
|
200
|
-
onClick={onToggle}
|
|
201
|
-
>
|
|
202
|
-
<span className={classes.sheetOptionLabel}>{label}</span>
|
|
203
|
-
{expanded && (
|
|
204
|
-
<span className={classes.sheetOptionCheck} aria-hidden>
|
|
205
|
-
<CheckGlyph />
|
|
206
|
-
</span>
|
|
207
|
-
)}
|
|
208
|
-
</button>
|
|
209
|
-
{expanded && <div className={classes.sheetDisclosureBody}>{children}</div>}
|
|
210
|
-
</div>
|
|
211
|
-
)
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
export type SheetFieldProps = {
|
|
215
|
-
readonly label: string
|
|
216
|
-
/** Stamped on the heading so a control can point `aria-labelledby` at it — see `useControlName`. */
|
|
217
|
-
readonly labelId?: string
|
|
218
|
-
readonly children: ReactNode
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/** A labelled block inside the sheet — the sheet form's outer shell for every control. */
|
|
222
|
-
export function SheetField({ label, labelId, children }: SheetFieldProps): ReactNode {
|
|
223
|
-
return (
|
|
224
|
-
<div className={classes.sheetField}>
|
|
225
|
-
<span className={classes.sheetLabel} {...(labelId !== undefined && { id: labelId })}>
|
|
226
|
-
{label}
|
|
227
|
-
</span>
|
|
228
|
-
{children}
|
|
229
|
-
</div>
|
|
230
|
-
)
|
|
231
|
-
}
|
|
232
|
-
|
|
233
105
|
/**
|
|
234
106
|
* Names a control that has no VISIBLE Mantine `label`, and does it differently per surface — which
|
|
235
107
|
* is the whole reason this is one helper instead of an `aria-label` sprinkled per call site.
|
|
236
108
|
*
|
|
237
|
-
* In the SHEET the visible `
|
|
238
|
-
* (`aria-labelledby`) and the heading stops being decoration. In the PILL surface there is no
|
|
109
|
+
* In the SHEET and the PANEL the visible `PanelRow` heading is right there, so the control points
|
|
110
|
+
* at it (`aria-labelledby`) and the heading stops being decoration. In the PILL surface there is no
|
|
239
111
|
* visible name to point at — the pill text is the VALUE (`EUR`, `30d`, `3 channels`) — so the
|
|
240
112
|
* control carries the filter's own name instead. Either way the announced name is what is being
|
|
241
113
|
* filtered, not what it currently holds.
|
|
242
114
|
*
|
|
243
|
-
* The id is generated by the CONTROL, not by `
|
|
244
|
-
* `
|
|
115
|
+
* The id is generated by the CONTROL, not by `PanelRow`, because the control renders its own
|
|
116
|
+
* `PanelRow`: an id published downward through context could never reach the sibling that needs it.
|
|
245
117
|
*
|
|
246
118
|
* @example
|
|
247
|
-
* const { labelId, nameProps } = useControlName(label, inSheet)
|
|
119
|
+
* const { labelId, nameProps } = useControlName(label, inSheet || inPanel)
|
|
248
120
|
* <Radio.Group {...nameProps} …/>
|
|
249
|
-
* // and, in the sheet branch: <
|
|
121
|
+
* // and, in the sheet/panel branch: <PanelRow label={label} labelId={labelId}>…</PanelRow>
|
|
250
122
|
*/
|
|
251
123
|
export function useControlName(
|
|
252
124
|
label: string,
|
|
253
|
-
|
|
125
|
+
named: boolean,
|
|
254
126
|
): {
|
|
255
127
|
labelId: string
|
|
256
128
|
nameProps: { 'aria-labelledby': string } | { 'aria-label': string }
|
|
@@ -258,28 +130,6 @@ export function useControlName(
|
|
|
258
130
|
const labelId = useId()
|
|
259
131
|
return {
|
|
260
132
|
labelId,
|
|
261
|
-
nameProps:
|
|
133
|
+
nameProps: named ? { 'aria-labelledby': labelId } : { 'aria-label': label },
|
|
262
134
|
}
|
|
263
135
|
}
|
|
264
|
-
|
|
265
|
-
export type SheetRowProps = {
|
|
266
|
-
readonly children: ReactNode
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
/** One 44px full-width row (`--vx-space-sheet-row-height`). */
|
|
270
|
-
export function SheetRow({ children }: SheetRowProps): ReactNode {
|
|
271
|
-
return <div className={classes.sheetRow}>{children}</div>
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
/** The class every sheet-form list item shares, for controls that render their own row element. */
|
|
275
|
-
export const sheetRowClass = classes.sheetRow
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* `classNames` for a Radio/Checkbox/Switch rendered as a sheet row — stretches its `body` and
|
|
279
|
-
* `<label>` across the full 44px so the whole row is the touch target, not the middle 20px of it.
|
|
280
|
-
*/
|
|
281
|
-
export const sheetRowClassNames = {
|
|
282
|
-
root: classes.sheetRow,
|
|
283
|
-
body: classes.sheetRowBody,
|
|
284
|
-
label: classes.sheetRowLabel,
|
|
285
|
-
} as const
|
package/src/controls/index.ts
CHANGED
|
@@ -43,6 +43,14 @@ export {
|
|
|
43
43
|
type SelectFilterStringProps,
|
|
44
44
|
} from './select-filter'
|
|
45
45
|
export { MultiSelectFilter, type MultiSelectFilterProps } from './multi-select-filter'
|
|
46
|
+
export { NumberFilter, type NumberFilterOption, type NumberFilterProps } from './number-filter'
|
|
46
47
|
export { SearchFilter, type SearchFilterProps } from './search-filter'
|
|
47
48
|
export { ToggleFilter, type ToggleFilterProps } from './toggle-filter'
|
|
48
49
|
export { ViewTabs, type ViewTabsOption, type ViewTabsProps } from './view-tabs'
|
|
50
|
+
|
|
51
|
+
// ── The `panel` surface (docs/ASIDE-SPEC.md wave 2) ───────────────────────────────────────────
|
|
52
|
+
// The two row-level primitives an aside body needs. `PanelRow` is the home (it wraps its slots in
|
|
53
|
+
// `CtlSlot`), and `SliderControl` is the one bound control that has no pill form at all — see their
|
|
54
|
+
// docs. The filters above render their own panel forms; there is nothing extra to import for them.
|
|
55
|
+
export { PanelRow, type PanelRowProps } from './panel-row'
|
|
56
|
+
export { SliderControl, type SliderControlProps } from './slider-control'
|