basalt-ui 1.27.0 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +23 -23
- package/CHANGELOG.md +59 -0
- package/MIGRATING.md +613 -20
- package/README.md +33 -3
- package/agent/rules/basalt-batteries.md +25 -10
- package/agent/rules/basalt-controls.md +56 -31
- package/agent/rules/basalt-mantine.md +17 -6
- package/agent/rules/basalt-tokens.md +1 -1
- package/configs/oxlint-plugin.js +1056 -28
- package/configs/oxlint-plugin.test.ts +1066 -0
- package/configs/oxlint.json +7 -0
- package/dist/agent/coalesce.d.ts.map +1 -1
- package/dist/agent/coalesce.js +2 -1
- package/dist/agent/merge.d.ts.map +1 -1
- package/dist/agent/merge.js +2 -1
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/part-list.js +2 -0
- package/dist/agent/stick-to-bottom.d.ts +3 -6
- package/dist/agent/stick-to-bottom.d.ts.map +1 -1
- package/dist/agent/stick-to-bottom.js +6 -3
- package/dist/agent-chat/composer.d.ts +6 -2
- package/dist/agent-chat/composer.d.ts.map +1 -1
- package/dist/agent-chat/composer.js +49 -33
- package/dist/agent-chat/relative-time.d.ts +0 -9
- package/dist/agent-chat/relative-time.d.ts.map +1 -1
- package/dist/agent-chat/relative-time.js +2 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +3 -2
- package/dist/agent-chat/thread-detail-panel.d.ts.map +1 -1
- package/dist/agent-chat/thread-detail-panel.js +8 -5
- package/dist/agent-chat/thread-feed-row.d.ts +2 -1
- package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed-row.js +92 -92
- package/dist/agent-chat/thread-feed.d.ts +3 -2
- package/dist/agent-chat/thread-feed.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed.js +8 -3
- package/dist/agent-chat/thread-message.d.ts +4 -3
- package/dist/agent-chat/thread-message.d.ts.map +1 -1
- package/dist/agent-chat/thread-message.js +70 -31
- package/dist/agent-chat/thread-outcome-card.d.ts +3 -2
- package/dist/agent-chat/thread-outcome-card.d.ts.map +1 -1
- package/dist/agent-chat/thread-outcome-card.js +9 -2
- package/dist/agent-chat/thread-workspace.d.ts +7 -2
- package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
- package/dist/agent-chat/thread-workspace.js +62 -29
- package/dist/agent-chat/tool-chip.d.ts +3 -2
- package/dist/agent-chat/tool-chip.d.ts.map +1 -1
- package/dist/agent-chat/tool-chip.js +7 -2
- package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
- package/dist/charts/hooks/useBandPlot.js +15 -8
- package/dist/charts/index.d.ts +8 -7
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +45 -5
- package/dist/charts/kinds/BandStrip.d.ts +10 -7
- package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
- package/dist/charts/kinds/BandStrip.js +12 -7
- package/dist/charts/kinds/Bars.d.ts +12 -6
- package/dist/charts/kinds/Bars.d.ts.map +1 -1
- package/dist/charts/kinds/Bars.js +37 -11
- package/dist/charts/kinds/Donut.d.ts +6 -5
- package/dist/charts/kinds/Donut.d.ts.map +1 -1
- package/dist/charts/kinds/Donut.js +19 -2
- package/dist/charts/kinds/DualPanel.d.ts +6 -5
- package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
- package/dist/charts/kinds/DualPanel.js +36 -8
- package/dist/charts/kinds/Heatmap.d.ts +10 -6
- package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
- package/dist/charts/kinds/Heatmap.js +58 -31
- package/dist/charts/kinds/MirroredBars.d.ts +6 -5
- package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
- package/dist/charts/kinds/MirroredBars.js +9 -2
- package/dist/charts/kinds/MultiLine.d.ts +11 -6
- package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
- package/dist/charts/kinds/MultiLine.js +24 -15
- package/dist/charts/kinds/StackedArea.d.ts +18 -8
- package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
- package/dist/charts/kinds/StackedArea.js +29 -4
- package/dist/charts/kinds/ZonedLine.d.ts +12 -8
- package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
- package/dist/charts/kinds/ZonedLine.js +33 -23
- package/dist/charts/layout/auto-margin.d.ts +65 -8
- package/dist/charts/layout/auto-margin.d.ts.map +1 -1
- package/dist/charts/layout/auto-margin.js +45 -10
- package/dist/charts/layout/log-ticks.d.ts +27 -0
- package/dist/charts/layout/log-ticks.d.ts.map +1 -0
- package/dist/charts/layout/log-ticks.js +42 -0
- package/dist/charts/primitives/Axes.d.ts +11 -2
- package/dist/charts/primitives/Axes.d.ts.map +1 -1
- package/dist/charts/primitives/Axes.js +15 -5
- package/dist/charts/primitives/CartesianChart.d.ts +45 -7
- package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
- package/dist/charts/primitives/CartesianChart.js +86 -28
- package/dist/charts/primitives/ChartCard.d.ts +27 -2
- package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
- package/dist/charts/primitives/ChartCard.js +37 -17
- package/dist/charts/primitives/ChartFrame.d.ts +30 -4
- package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
- package/dist/charts/primitives/ChartFrame.js +45 -15
- package/dist/charts/primitives/ChartLegend.d.ts +13 -2
- package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
- package/dist/charts/primitives/ChartLegend.js +33 -13
- package/dist/charts/primitives/ChartPending.d.ts +77 -4
- package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
- package/dist/charts/primitives/ChartPending.js +100 -6
- package/dist/charts/primitives/ChartTooltip.d.ts +7 -0
- package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
- package/dist/charts/primitives/ChartTooltip.js +18 -5
- package/dist/charts/primitives/Crosshair.d.ts +3 -0
- package/dist/charts/primitives/Crosshair.d.ts.map +1 -1
- package/dist/charts/primitives/Crosshair.js +3 -1
- package/dist/charts/primitives/chart-frame-layout.d.ts +95 -0
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -0
- package/dist/charts/primitives/chart-frame-layout.js +89 -0
- package/dist/charts/primitives/chart-tier.d.ts +16 -0
- package/dist/charts/primitives/chart-tier.d.ts.map +1 -0
- package/dist/charts/primitives/chart-tier.js +20 -0
- package/dist/charts/series.d.ts +55 -1
- package/dist/charts/series.d.ts.map +1 -1
- package/dist/charts/series.js +27 -1
- package/dist/charts/sparklines/BarSparkline.d.ts +3 -3
- package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/BarSparkline.js +9 -3
- package/dist/charts/sparklines/LineSparkline.d.ts +3 -3
- package/dist/charts/sparklines/LineSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/LineSparkline.js +15 -3
- package/dist/charts/sparklines/index.d.ts +2 -2
- package/dist/charts/sparklines/index.d.ts.map +1 -1
- package/dist/charts/utils/format.d.ts +92 -2
- package/dist/charts/utils/format.d.ts.map +1 -1
- package/dist/charts/utils/format.js +64 -1
- package/dist/charts/utils/ticks.d.ts +81 -2
- package/dist/charts/utils/ticks.d.ts.map +1 -1
- package/dist/charts/utils/ticks.js +54 -4
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/commands/ShortcutsHelp.d.ts +3 -2
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +8 -2
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +2 -2
- package/dist/commands/define-overlays.d.ts +102 -0
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +102 -2
- package/dist/commands/index.d.ts +10 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +3 -1
- package/dist/commands/overlays-mount.d.ts +13 -6
- package/dist/commands/overlays-mount.d.ts.map +1 -1
- package/dist/commands/overlays-mount.js +23 -14
- package/dist/common/errors.d.ts +34 -0
- package/dist/common/errors.d.ts.map +1 -0
- package/dist/common/errors.js +36 -0
- package/dist/common/index.d.ts +15 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +29 -0
- package/dist/common/props.d.ts +63 -0
- package/dist/common/props.d.ts.map +1 -0
- package/dist/common/props.js +6 -0
- package/dist/common/query-state-like.d.ts +43 -0
- package/dist/common/query-state-like.d.ts.map +1 -0
- package/dist/common/query-state-like.js +20 -0
- package/dist/common/refs.d.ts +29 -0
- package/dist/common/refs.d.ts.map +1 -0
- package/dist/common/refs.js +29 -0
- package/dist/common/scroll-parent.d.ts +23 -0
- package/dist/common/scroll-parent.d.ts.map +1 -0
- package/dist/common/scroll-parent.js +21 -0
- package/dist/common/validate.d.ts +38 -0
- package/dist/common/validate.d.ts.map +1 -0
- package/dist/common/validate.js +36 -0
- package/dist/connectivity/connectivity-indicator.d.ts +3 -1
- package/dist/connectivity/connectivity-indicator.d.ts.map +1 -1
- package/dist/connectivity/connectivity-indicator.js +3 -1
- package/dist/connectivity/connectivity-provider.d.ts.map +1 -1
- package/dist/connectivity/connectivity-provider.js +4 -1
- package/dist/connectivity/index.d.ts +1 -0
- package/dist/connectivity/index.d.ts.map +1 -1
- package/dist/connectivity/types.d.ts +2 -2
- package/dist/connectivity/types.d.ts.map +1 -1
- package/dist/connectivity/use-connectivity.d.ts.map +1 -1
- package/dist/content/article-layout.module.css +11 -4
- package/dist/content/callout.d.ts +8 -4
- package/dist/content/callout.d.ts.map +1 -1
- package/dist/content/callout.js +15 -8
- package/dist/content/guide.d.ts +5 -4
- package/dist/content/guide.d.ts.map +1 -1
- package/dist/content/guide.js +13 -4
- package/dist/content/heading-anchor.d.ts +24 -2
- package/dist/content/heading-anchor.d.ts.map +1 -1
- package/dist/content/heading-anchor.js +23 -9
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +2 -0
- package/dist/content/prose.module.css +9 -7
- package/dist/content/reading-progress.d.ts +10 -4
- package/dist/content/reading-progress.d.ts.map +1 -1
- package/dist/content/reading-progress.js +26 -10
- package/dist/content/slug.d.ts +4 -0
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/toc.d.ts +11 -0
- package/dist/content/toc.d.ts.map +1 -1
- package/dist/content/toc.js +23 -10
- package/dist/controls/actions.d.ts +49 -6
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/actions.js +39 -8
- package/dist/controls/compare-filter.d.ts +3 -2
- package/dist/controls/compare-filter.d.ts.map +1 -1
- package/dist/controls/compare-filter.js +17 -2
- package/dist/controls/control-group.d.ts +3 -3
- package/dist/controls/control-group.d.ts.map +1 -1
- package/dist/controls/control-group.js +9 -2
- package/dist/controls/controls.module.css +169 -186
- package/dist/controls/controls.module.css.d.ts +9 -11
- package/dist/controls/enum-filter.d.ts +3 -2
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/enum-filter.js +28 -13
- package/dist/controls/filter-context.d.ts +8 -4
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-pill.d.ts +3 -3
- package/dist/controls/filter-pill.d.ts.map +1 -1
- package/dist/controls/filter-pill.js +4 -1
- package/dist/controls/filter-set.d.ts +3 -2
- package/dist/controls/filter-set.d.ts.map +1 -1
- package/dist/controls/filter-set.js +66 -41
- package/dist/controls/filter-sheet.d.ts +20 -80
- package/dist/controls/filter-sheet.d.ts.map +1 -1
- package/dist/controls/filter-sheet.js +9 -95
- package/dist/controls/index.d.ts +2 -0
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +4 -0
- package/dist/controls/multi-select-filter.d.ts +18 -2
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/multi-select-filter.js +122 -20
- package/dist/controls/number-filter.d.ts +7 -5
- package/dist/controls/number-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.js +40 -11
- package/dist/controls/panel-row.d.ts +132 -0
- package/dist/controls/panel-row.d.ts.map +1 -0
- package/dist/controls/panel-row.js +173 -0
- package/dist/controls/panel-row.module.css +86 -0
- package/dist/controls/panel-row.module.css.d.ts +13 -0
- package/dist/controls/range-filter.d.ts +2 -1
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/range-filter.js +57 -35
- package/dist/controls/search-filter.d.ts +3 -2
- package/dist/controls/search-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.js +25 -10
- package/dist/controls/select-filter.d.ts +2 -1
- package/dist/controls/select-filter.d.ts.map +1 -1
- package/dist/controls/select-filter.js +4 -0
- package/dist/controls/slider-control.d.ts +36 -0
- package/dist/controls/slider-control.d.ts.map +1 -0
- package/dist/controls/slider-control.js +64 -0
- package/dist/controls/sync-button.d.ts +3 -2
- package/dist/controls/sync-button.d.ts.map +1 -1
- package/dist/controls/sync-button.js +16 -3
- package/dist/controls/toggle-filter.d.ts +3 -2
- package/dist/controls/toggle-filter.d.ts.map +1 -1
- package/dist/controls/toggle-filter.js +28 -11
- package/dist/controls/view-tabs.d.ts +3 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls/view-tabs.js +43 -11
- package/dist/controls-dates/date-range-picker.d.ts +1 -1
- package/dist/controls-dates/date-range-picker.d.ts.map +1 -1
- package/dist/controls-dates/date-range-picker.js +6 -1
- package/dist/dashboard/delta-badge.d.ts +5 -1
- package/dist/dashboard/delta-badge.d.ts.map +1 -1
- package/dist/dashboard/empty-state.d.ts +10 -3
- package/dist/dashboard/empty-state.d.ts.map +1 -1
- package/dist/dashboard/empty-state.js +37 -6
- package/dist/dashboard/index.d.ts +6 -4
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +7 -1
- package/dist/dashboard/query-state.d.ts +48 -27
- package/dist/dashboard/query-state.d.ts.map +1 -1
- package/dist/dashboard/query-state.js +111 -57
- package/dist/dashboard/settings-section.d.ts +19 -9
- package/dist/dashboard/settings-section.d.ts.map +1 -1
- package/dist/dashboard/settings-section.js +74 -25
- package/dist/dashboard/stat-card.d.ts +44 -38
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +55 -42
- package/dist/dashboard/stat-card.module.css +46 -31
- package/dist/dashboard/stat-card.module.css.d.ts +1 -0
- package/dist/dashboard/stat-group.d.ts +41 -0
- package/dist/dashboard/stat-group.d.ts.map +1 -0
- package/dist/dashboard/stat-group.js +30 -0
- package/dist/dashboard/stat-group.module.css +66 -0
- package/dist/dashboard/stat-group.module.css.d.ts +8 -0
- package/dist/dashboard/widget-grid.d.ts +27 -0
- package/dist/dashboard/widget-grid.d.ts.map +1 -0
- package/dist/dashboard/widget-grid.js +41 -0
- package/dist/dashboard/widget-grid.module.css +53 -0
- package/dist/dashboard/widget-grid.module.css.d.ts +9 -0
- package/dist/data/data-table.d.ts +151 -12
- package/dist/data/data-table.d.ts.map +1 -1
- package/dist/data/data-table.js +384 -138
- package/dist/data/data-table.module.css +64 -0
- package/dist/data/data-table.module.css.d.ts +11 -0
- package/dist/data/index.d.ts +2 -2
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +24 -2
- package/dist/data/query-branch.d.ts +28 -0
- package/dist/data/query-branch.d.ts.map +1 -0
- package/dist/data/query-branch.js +10 -0
- package/dist/data/table.d.ts +2 -2
- package/dist/data/table.d.ts.map +1 -1
- package/dist/data/virtual-list.d.ts +65 -6
- package/dist/data/virtual-list.d.ts.map +1 -1
- package/dist/data/virtual-list.js +89 -38
- package/dist/data/virtual.d.ts +1 -1
- package/dist/data/virtual.d.ts.map +1 -1
- package/dist/forms/FormErrorSummary.d.ts +4 -3
- package/dist/forms/FormErrorSummary.d.ts.map +1 -1
- package/dist/forms/FormErrorSummary.js +6 -4
- package/dist/forms/create-form.d.ts +2 -2
- package/dist/forms/field.d.ts +46 -6
- package/dist/forms/field.d.ts.map +1 -1
- package/dist/forms/field.js +10 -5
- package/dist/forms/form-layout.d.ts +142 -0
- package/dist/forms/form-layout.d.ts.map +1 -0
- package/dist/forms/form-layout.js +110 -0
- package/dist/forms/form-layout.module.css +145 -0
- package/dist/forms/form-layout.module.css.d.ts +20 -0
- package/dist/forms/form-state.d.ts +42 -0
- package/dist/forms/form-state.d.ts.map +1 -0
- package/dist/forms/form-state.js +26 -0
- package/dist/forms/index.d.ts +22 -6
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +19 -3
- package/dist/forms/use-field-array.d.ts +60 -0
- package/dist/forms/use-field-array.d.ts.map +1 -0
- package/dist/forms/use-field-array.js +20 -0
- package/dist/forms/use-form-draft.d.ts +25 -10
- package/dist/forms/use-form-draft.d.ts.map +1 -1
- package/dist/forms/use-form-draft.js +55 -18
- package/dist/forms/use-form-submit.d.ts +88 -0
- package/dist/forms/use-form-submit.d.ts.map +1 -0
- package/dist/forms/use-form-submit.js +63 -0
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +26 -6
- package/dist/index.d.ts +10 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -4
- package/dist/nav/types.d.ts +15 -6
- package/dist/nav/types.d.ts.map +1 -1
- package/dist/notifications/bell.d.ts +3 -2
- package/dist/notifications/bell.d.ts.map +1 -1
- package/dist/notifications/bell.js +73 -56
- package/dist/notifications/center.d.ts +15 -4
- package/dist/notifications/center.d.ts.map +1 -1
- package/dist/notifications/center.js +5 -2
- package/dist/notifications/define-notifications.d.ts +56 -14
- package/dist/notifications/define-notifications.d.ts.map +1 -1
- package/dist/notifications/define-notifications.js +2 -1
- package/dist/notifications/index.d.ts +6 -2
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +5 -1
- package/dist/notifications/mount-guard.d.ts +8 -0
- package/dist/notifications/mount-guard.d.ts.map +1 -0
- package/dist/notifications/mount-guard.js +19 -0
- package/dist/notifications/notify.d.ts +58 -1
- package/dist/notifications/notify.d.ts.map +1 -1
- package/dist/notifications/notify.js +46 -2
- package/dist/notifications/overlay.d.ts.map +1 -1
- package/dist/notifications/overlay.js +2 -0
- package/dist/notifications/store.d.ts +7 -0
- package/dist/notifications/store.d.ts.map +1 -1
- package/dist/provider/index.d.ts +37 -5
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +66 -28
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/lab-theme.js +2 -1
- package/dist/query/devtools.d.ts.map +1 -1
- package/dist/query/devtools.js +1 -0
- package/dist/router-tanstack/field.d.ts +1 -1
- package/dist/router-tanstack/field.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.js +1 -1
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +1 -1
- package/dist/section/index.d.ts +1 -1
- package/dist/section/index.d.ts.map +1 -1
- package/dist/section/section.d.ts +36 -2
- package/dist/section/section.d.ts.map +1 -1
- package/dist/section/section.js +49 -57
- package/dist/section/section.module.css +11 -0
- package/dist/shell/account-types.d.ts +5 -2
- package/dist/shell/account-types.d.ts.map +1 -1
- package/dist/shell/app-brand.d.ts +13 -0
- package/dist/shell/app-brand.d.ts.map +1 -0
- package/dist/shell/app-brand.js +94 -0
- package/dist/shell/app-brand.module.css +109 -0
- package/dist/shell/app-brand.module.css.d.ts +14 -0
- package/dist/shell/app-breadcrumbs.d.ts +4 -2
- package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
- package/dist/shell/app-breadcrumbs.js +33 -22
- package/dist/shell/app-header.module.css +10 -5
- package/dist/shell/app-main.module.css +107 -0
- package/dist/shell/app-main.module.css.d.ts +11 -0
- package/dist/shell/app-mobile-nav.d.ts +3 -2
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-mobile-nav.js +29 -15
- package/dist/shell/app-mobile-nav.module.css +48 -27
- package/dist/shell/app-mobile-nav.module.css.d.ts +0 -1
- package/dist/shell/app-sidebar-account.d.ts +2 -1
- package/dist/shell/app-sidebar-account.d.ts.map +1 -1
- package/dist/shell/app-sidebar-account.js +57 -22
- package/dist/shell/app-sidebar.d.ts +9 -3
- package/dist/shell/app-sidebar.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +55 -109
- package/dist/shell/app-sidebar.module.css +53 -96
- package/dist/shell/app-sidebar.module.css.d.ts +0 -5
- package/dist/shell/index.d.ts +14 -6
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +47 -12
- package/dist/shell/isomorphic-layout-effect.d.ts +14 -0
- package/dist/shell/isomorphic-layout-effect.d.ts.map +1 -0
- package/dist/shell/isomorphic-layout-effect.js +5 -0
- package/dist/shell/mobile-nav-model.d.ts.map +1 -1
- package/dist/shell/mobile-nav-model.js +27 -6
- package/dist/shell/nav-count-badge.d.ts +5 -3
- package/dist/shell/nav-count-badge.d.ts.map +1 -1
- package/dist/shell/nav-count-badge.js +3 -1
- package/dist/shell/page-aside.d.ts +43 -0
- package/dist/shell/page-aside.d.ts.map +1 -0
- package/dist/shell/page-aside.js +202 -0
- package/dist/shell/page-aside.module.css +174 -0
- package/dist/shell/page-aside.module.css.d.ts +14 -0
- package/dist/shell/page-bar.d.ts +55 -15
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +130 -41
- package/dist/shell/page-bar.module.css +107 -13
- package/dist/shell/page-bar.module.css.d.ts +4 -1
- package/dist/shell/sidebar-search.d.ts +4 -2
- package/dist/shell/sidebar-search.d.ts.map +1 -1
- package/dist/shell/sidebar-search.js +9 -4
- package/dist/shell/sidebar-search.module.css +1 -1
- package/dist/state/fields.d.ts +23 -3
- package/dist/state/fields.d.ts.map +1 -1
- package/dist/state/fields.js +13 -2
- package/dist/state/persisted-or-local.d.ts +9 -0
- package/dist/state/persisted-or-local.d.ts.map +1 -0
- package/dist/state/persisted-or-local.js +24 -0
- package/dist/state.d.ts +1 -1
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +2 -6
- package/dist/surfaces.d.ts +12 -11
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +42 -12
- package/dist/theme/ctl-theme.d.ts.map +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +102 -17
- package/dist/theme/nav-link.module.css +37 -26
- package/dist/theme/segmented-control.module.css +22 -0
- package/dist/theme/segmented-control.module.css.d.ts +1 -0
- package/dist/theme-lab/boot.d.ts +66 -0
- package/dist/theme-lab/boot.d.ts.map +1 -0
- package/dist/theme-lab/boot.js +82 -0
- package/dist/theme-lab/index.d.ts +4 -43
- package/dist/theme-lab/index.d.ts.map +1 -1
- package/dist/theme-lab/index.js +9 -69
- package/dist/theme-toggle/index.d.ts +3 -2
- package/dist/theme-toggle/index.d.ts.map +1 -1
- package/dist/theme-toggle/index.js +8 -2
- package/dist/tokens/index.d.ts +42 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +35 -6
- package/dist/tokens/palette.d.ts +45 -25
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +31 -14
- package/dist/tokens.css +4 -5
- package/dist/utils/is-dev.d.ts +3 -0
- package/dist/utils/is-dev.d.ts.map +1 -0
- package/dist/utils/is-dev.js +6 -0
- package/dist/widget-header/delta-badge.d.ts +7 -1
- package/dist/widget-header/delta-badge.d.ts.map +1 -1
- package/dist/widget-header/delta-badge.js +8 -1
- package/dist/widget-header/index.d.ts +2 -2
- package/dist/widget-header/index.d.ts.map +1 -1
- package/dist/widget-header/index.js +3 -1
- package/dist/widget-header/widget-header.d.ts +69 -4
- package/dist/widget-header/widget-header.d.ts.map +1 -1
- package/dist/widget-header/widget-header.js +42 -27
- package/dist/widget-header/widget-header.module.css +72 -7
- package/llms.txt +6 -6
- package/package.json +49 -25
- package/src/agent/coalesce.ts +2 -1
- package/src/agent/merge.ts +2 -1
- package/src/agent/part-list.tsx +2 -0
- package/src/agent/stick-to-bottom.tsx +9 -11
- package/src/agent-chat/composer.tsx +124 -103
- package/src/agent-chat/relative-time.ts +2 -1
- package/src/agent-chat/thread-detail-panel.tsx +9 -5
- package/src/agent-chat/thread-feed-row.tsx +17 -9
- package/src/agent-chat/thread-feed.tsx +9 -3
- package/src/agent-chat/thread-message.tsx +48 -13
- package/src/agent-chat/thread-outcome-card.tsx +9 -1
- package/src/agent-chat/thread-workspace.tsx +72 -33
- package/src/agent-chat/tool-chip.tsx +8 -2
- package/src/charts/hooks/useBandPlot.ts +26 -8
- package/src/charts/index.ts +39 -4
- package/src/charts/kinds/BandStrip.tsx +36 -14
- package/src/charts/kinds/Bars.tsx +67 -16
- package/src/charts/kinds/Donut.tsx +30 -3
- package/src/charts/kinds/DualPanel.tsx +56 -10
- package/src/charts/kinds/Heatmap.tsx +90 -33
- package/src/charts/kinds/MirroredBars.tsx +21 -3
- package/src/charts/kinds/MultiLine.tsx +61 -18
- package/src/charts/kinds/StackedArea.tsx +77 -6
- package/src/charts/kinds/ZonedLine.tsx +71 -31
- package/src/charts/layout/auto-margin.ts +134 -21
- package/src/charts/layout/log-ticks.ts +90 -0
- package/src/charts/primitives/Axes.tsx +33 -5
- package/src/charts/primitives/CartesianChart.tsx +194 -41
- package/src/charts/primitives/ChartCard.tsx +66 -25
- package/src/charts/primitives/ChartFrame.tsx +107 -26
- package/src/charts/primitives/ChartLegend.tsx +43 -13
- package/src/charts/primitives/ChartPending.tsx +185 -7
- package/src/charts/primitives/ChartTooltip.tsx +37 -5
- package/src/charts/primitives/Crosshair.tsx +6 -3
- package/src/charts/primitives/chart-frame-layout.ts +212 -0
- package/src/charts/primitives/chart-tier.tsx +37 -0
- package/src/charts/series.ts +77 -1
- package/src/charts/sparklines/BarSparkline.tsx +11 -3
- package/src/charts/sparklines/LineSparkline.tsx +18 -4
- package/src/charts/sparklines/index.ts +2 -2
- package/src/charts/utils/format.ts +163 -2
- package/src/charts/utils/ticks.ts +149 -4
- package/src/cli/index.ts +8 -3
- package/src/commands/ShortcutsHelp.tsx +10 -3
- package/src/commands/define-commands.ts +2 -2
- package/src/commands/define-overlays.ts +216 -1
- package/src/commands/index.ts +12 -0
- package/src/commands/overlays-mount.tsx +60 -26
- package/src/common/errors.ts +73 -0
- package/src/common/index.ts +21 -0
- package/src/common/props.ts +71 -0
- package/src/common/query-state-like.ts +64 -0
- package/src/common/refs.ts +58 -0
- package/src/common/scroll-parent.ts +42 -0
- package/src/common/validate.ts +94 -0
- package/src/connectivity/connectivity-indicator.tsx +6 -1
- package/src/connectivity/connectivity-provider.tsx +4 -1
- package/src/connectivity/index.ts +1 -0
- package/src/connectivity/types.ts +5 -2
- package/src/connectivity/use-connectivity.ts +3 -2
- package/src/content/article-layout.module.css +11 -4
- package/src/content/callout.tsx +13 -7
- package/src/content/guide.tsx +14 -4
- package/src/content/heading-anchor.tsx +14 -3
- package/src/content/index.ts +2 -0
- package/src/content/markdown.tsx +2 -0
- package/src/content/prose.module.css +9 -7
- package/src/content/reading-progress.tsx +40 -15
- package/src/content/slug.ts +4 -0
- package/src/content/toc.tsx +47 -10
- package/src/controls/actions.tsx +89 -9
- package/src/controls/compare-filter.tsx +20 -3
- package/src/controls/control-group.tsx +11 -4
- package/src/controls/controls.module.css +169 -186
- package/src/controls/controls.module.css.d.ts +9 -11
- package/src/controls/enum-filter.tsx +32 -16
- package/src/controls/filter-context.tsx +14 -6
- package/src/controls/filter-pill.tsx +6 -3
- package/src/controls/filter-set.tsx +32 -13
- package/src/controls/filter-sheet.tsx +44 -194
- package/src/controls/index.ts +7 -0
- package/src/controls/multi-select-filter.tsx +177 -27
- package/src/controls/number-filter.tsx +61 -23
- package/src/controls/panel-row.module.css +86 -0
- package/src/controls/panel-row.module.css.d.ts +13 -0
- package/src/controls/panel-row.tsx +392 -0
- package/src/controls/range-filter.tsx +76 -39
- package/src/controls/search-filter.tsx +30 -12
- package/src/controls/select-filter.tsx +11 -1
- package/src/controls/slider-control.tsx +159 -0
- package/src/controls/sync-button.tsx +13 -3
- package/src/controls/toggle-filter.tsx +36 -16
- package/src/controls/view-tabs.tsx +63 -11
- package/src/controls-dates/date-range-picker.tsx +8 -1
- package/src/dashboard/delta-badge.tsx +5 -1
- package/src/dashboard/empty-state.tsx +72 -25
- package/src/dashboard/index.ts +13 -1
- package/src/dashboard/query-state.tsx +154 -84
- package/src/dashboard/settings-section.tsx +87 -31
- package/src/dashboard/stat-card.module.css +46 -31
- package/src/dashboard/stat-card.module.css.d.ts +1 -0
- package/src/dashboard/stat-card.tsx +185 -127
- package/src/dashboard/stat-group.module.css +66 -0
- package/src/dashboard/stat-group.module.css.d.ts +8 -0
- package/src/dashboard/stat-group.tsx +74 -0
- package/src/dashboard/widget-grid.module.css +53 -0
- package/src/dashboard/widget-grid.module.css.d.ts +9 -0
- package/src/dashboard/widget-grid.tsx +127 -0
- package/src/data/data-table.module.css +64 -0
- package/src/data/data-table.module.css.d.ts +11 -0
- package/src/data/data-table.tsx +919 -346
- package/src/data/index.ts +30 -2
- package/src/data/query-branch.ts +53 -0
- package/src/data/table.ts +5 -0
- package/src/data/virtual-list.tsx +189 -55
- package/src/data/virtual.ts +5 -1
- package/src/forms/FormErrorSummary.tsx +13 -6
- package/src/forms/create-form.ts +2 -2
- package/src/forms/field.ts +60 -11
- package/src/forms/form-layout.module.css +145 -0
- package/src/forms/form-layout.module.css.d.ts +20 -0
- package/src/forms/form-layout.tsx +305 -0
- package/src/forms/form-state.tsx +94 -0
- package/src/forms/index.ts +38 -7
- package/src/forms/use-field-array.ts +94 -0
- package/src/forms/use-form-draft.ts +145 -53
- package/src/forms/use-form-submit.ts +199 -0
- package/src/guard/index.ts +73 -18
- package/src/index.ts +74 -10
- package/src/nav/types.ts +15 -6
- package/src/notifications/bell.tsx +18 -4
- package/src/notifications/center.tsx +18 -5
- package/src/notifications/define-notifications.ts +64 -18
- package/src/notifications/index.ts +12 -1
- package/src/notifications/mount-guard.ts +41 -0
- package/src/notifications/notify.tsx +122 -3
- package/src/notifications/overlay.tsx +2 -0
- package/src/notifications/store.ts +7 -0
- package/src/provider/index.tsx +101 -13
- package/src/provider/lab-theme.ts +2 -1
- package/src/query/devtools.tsx +1 -0
- package/src/router-tanstack/field.ts +1 -0
- package/src/router-tanstack/search-store.ts +3 -10
- package/src/router-tanstack/use-nav.ts +18 -13
- package/src/section/index.ts +1 -1
- package/src/section/section.module.css +11 -0
- package/src/section/section.tsx +163 -96
- package/src/shell/account-types.ts +5 -2
- package/src/shell/app-brand.module.css +109 -0
- package/src/shell/app-brand.module.css.d.ts +14 -0
- package/src/shell/app-brand.tsx +140 -0
- package/src/shell/app-breadcrumbs.tsx +19 -9
- package/src/shell/app-header.module.css +10 -5
- package/src/shell/app-main.module.css +107 -0
- package/src/shell/app-main.module.css.d.ts +11 -0
- package/src/shell/app-mobile-nav.module.css +48 -27
- package/src/shell/app-mobile-nav.module.css.d.ts +0 -1
- package/src/shell/app-mobile-nav.tsx +43 -11
- package/src/shell/app-sidebar-account.tsx +29 -6
- package/src/shell/app-sidebar.module.css +53 -96
- package/src/shell/app-sidebar.module.css.d.ts +0 -5
- package/src/shell/app-sidebar.tsx +40 -113
- package/src/shell/index.tsx +156 -65
- package/src/shell/isomorphic-layout-effect.ts +14 -0
- package/src/shell/mobile-nav-model.ts +66 -10
- package/src/shell/nav-count-badge.tsx +6 -1
- package/src/shell/page-aside.module.css +174 -0
- package/src/shell/page-aside.module.css.d.ts +14 -0
- package/src/shell/page-aside.tsx +377 -0
- package/src/shell/page-bar.module.css +107 -13
- package/src/shell/page-bar.module.css.d.ts +4 -1
- package/src/shell/page-bar.tsx +294 -94
- package/src/shell/sidebar-search.module.css +1 -1
- package/src/shell/sidebar-search.tsx +13 -4
- package/src/state/fields.ts +43 -10
- package/src/state/persisted-or-local.ts +50 -0
- package/src/state.ts +0 -9
- package/src/surfaces.ts +42 -12
- package/src/theme/ctl-theme.tsx +10 -0
- package/src/theme/index.ts +129 -16
- package/src/theme/nav-link.module.css +37 -26
- package/src/theme/segmented-control.module.css +22 -0
- package/src/theme/segmented-control.module.css.d.ts +1 -0
- package/src/theme-lab/boot.ts +140 -0
- package/src/theme-lab/index.tsx +21 -112
- package/src/theme-toggle/index.tsx +10 -3
- package/src/tokens/index.ts +50 -6
- package/src/tokens/palette.ts +58 -30
- package/src/utils/is-dev.ts +4 -0
- package/src/widget-header/delta-badge.tsx +25 -5
- package/src/widget-header/index.ts +10 -2
- package/src/widget-header/widget-header.module.css +72 -7
- package/src/widget-header/widget-header.tsx +150 -71
- package/dist/agent/adapter.test.d.ts +0 -2
- package/dist/agent/adapter.test.d.ts.map +0 -1
- package/dist/agent/ai-sdk-transport.test.d.ts +0 -2
- package/dist/agent/ai-sdk-transport.test.d.ts.map +0 -1
- package/dist/agent/coalesce.test.d.ts +0 -2
- package/dist/agent/coalesce.test.d.ts.map +0 -1
- package/dist/agent/foreign.test.d.ts +0 -2
- package/dist/agent/foreign.test.d.ts.map +0 -1
- package/dist/agent/id.test.d.ts +0 -2
- package/dist/agent/id.test.d.ts.map +0 -1
- package/dist/agent/merge.test.d.ts +0 -2
- package/dist/agent/merge.test.d.ts.map +0 -1
- package/dist/agent/part-list.test.d.ts +0 -2
- package/dist/agent/part-list.test.d.ts.map +0 -1
- package/dist/agent/parts.test.d.ts +0 -2
- package/dist/agent/parts.test.d.ts.map +0 -1
- package/dist/agent/thread.test.d.ts +0 -2
- package/dist/agent/thread.test.d.ts.map +0 -1
- package/dist/agent/transport.test.d.ts +0 -2
- package/dist/agent/transport.test.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.test.d.ts +0 -2
- package/dist/agent/use-agent-stream.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts.map +0 -1
- package/dist/agent-chat/composer.test.d.ts +0 -2
- package/dist/agent-chat/composer.test.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.test.d.ts +0 -2
- package/dist/agent-chat/relative-time.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed-row.test.d.ts +0 -2
- package/dist/agent-chat/thread-feed-row.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.test.d.ts +0 -2
- package/dist/agent-chat/thread-feed.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.test.d.ts +0 -2
- package/dist/agent-chat/thread-message.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.test.d.ts +0 -2
- package/dist/agent-chat/thread-workspace.test.d.ts.map +0 -1
- package/dist/agent-chat/tool-chip.test.d.ts +0 -2
- package/dist/agent-chat/tool-chip.test.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.type-guard.test.d.ts +0 -2
- package/dist/agent-chat/virtualize.type-guard.test.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.test.d.ts +0 -2
- package/dist/charts/cursor/resolve.test.d.ts.map +0 -1
- package/dist/charts/cursor/store.test.d.ts +0 -2
- package/dist/charts/cursor/store.test.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.test.d.ts +0 -2
- package/dist/charts/kinds/BandStrip.test.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.test.d.ts +0 -2
- package/dist/charts/kinds/Bars.test.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.test.d.ts +0 -2
- package/dist/charts/kinds/DualPanel.test.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.test.d.ts +0 -2
- package/dist/charts/kinds/MirroredBars.test.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.test.d.ts +0 -2
- package/dist/charts/kinds/MultiLine.test.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.test.d.ts +0 -2
- package/dist/charts/kinds/StackedArea.test.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.test.d.ts +0 -2
- package/dist/charts/kinds/ZonedLine.test.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.test.d.ts +0 -2
- package/dist/charts/layout/auto-margin.test.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.test.d.ts +0 -2
- package/dist/charts/primitives/CartesianChart.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.test.d.ts +0 -2
- package/dist/charts/primitives/ChartCard.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.test.d.ts +0 -2
- package/dist/charts/primitives/ChartFrame.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.test.d.ts +0 -2
- package/dist/charts/primitives/ChartLegend.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.test.d.ts +0 -2
- package/dist/charts/primitives/ChartTooltip.test.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.test.d.ts +0 -2
- package/dist/charts/primitives/XZoneRects.test.d.ts.map +0 -1
- package/dist/charts/series.test.d.ts +0 -2
- package/dist/charts/series.test.d.ts.map +0 -1
- package/dist/charts/utils/domain.test.d.ts +0 -2
- package/dist/charts/utils/domain.test.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.test.d.ts +0 -2
- package/dist/charts/utils/measure-text.test.d.ts.map +0 -1
- package/dist/cli/check-coverage.test.d.ts +0 -2
- package/dist/cli/check-coverage.test.d.ts.map +0 -1
- package/dist/cli/check-theme.test.d.ts +0 -2
- package/dist/cli/check-theme.test.d.ts.map +0 -1
- package/dist/cli/help.test.d.ts +0 -2
- package/dist/cli/help.test.d.ts.map +0 -1
- package/dist/cli/init-sync.test.d.ts +0 -2
- package/dist/cli/init-sync.test.d.ts.map +0 -1
- package/dist/cli/placement-engine.test.d.ts +0 -2
- package/dist/cli/placement-engine.test.d.ts.map +0 -1
- package/dist/cli/shipped-versions.test.d.ts +0 -2
- package/dist/cli/shipped-versions.test.d.ts.map +0 -1
- package/dist/cli/tarball-parity.test.d.ts +0 -2
- package/dist/cli/tarball-parity.test.d.ts.map +0 -1
- package/dist/cli/template-format.test.d.ts +0 -2
- package/dist/cli/template-format.test.d.ts.map +0 -1
- package/dist/cli/template-ledger.test.d.ts +0 -2
- package/dist/cli/template-ledger.test.d.ts.map +0 -1
- package/dist/cli/tokens-css.test.d.ts +0 -2
- package/dist/cli/tokens-css.test.d.ts.map +0 -1
- package/dist/cli/toolchain-wiring.test.d.ts +0 -2
- package/dist/cli/toolchain-wiring.test.d.ts.map +0 -1
- package/dist/cli/waiver-audit.test.d.ts +0 -2
- package/dist/cli/waiver-audit.test.d.ts.map +0 -1
- package/dist/content/article-actions.test.d.ts +0 -2
- package/dist/content/article-actions.test.d.ts.map +0 -1
- package/dist/content/article-model.test.d.ts +0 -2
- package/dist/content/article-model.test.d.ts.map +0 -1
- package/dist/content/block-split.test.d.ts +0 -2
- package/dist/content/block-split.test.d.ts.map +0 -1
- package/dist/content/heading-components.test.d.ts +0 -2
- package/dist/content/heading-components.test.d.ts.map +0 -1
- package/dist/content/markdown.test.d.ts +0 -2
- package/dist/content/markdown.test.d.ts.map +0 -1
- package/dist/content/prose.module.css.test.d.ts +0 -2
- package/dist/content/prose.module.css.test.d.ts.map +0 -1
- package/dist/content/sanitize.test.d.ts +0 -2
- package/dist/content/sanitize.test.d.ts.map +0 -1
- package/dist/content/slug.test.d.ts +0 -2
- package/dist/content/slug.test.d.ts.map +0 -1
- package/dist/controls/actions.test.d.ts +0 -2
- package/dist/controls/actions.test.d.ts.map +0 -1
- package/dist/controls/actions.type-guard.test.d.ts +0 -2
- package/dist/controls/actions.type-guard.test.d.ts.map +0 -1
- package/dist/controls/control-group.test.d.ts +0 -2
- package/dist/controls/control-group.test.d.ts.map +0 -1
- package/dist/controls/controls.router.test.d.ts +0 -2
- package/dist/controls/controls.router.test.d.ts.map +0 -1
- package/dist/controls/filter-set.test.d.ts +0 -2
- package/dist/controls/filter-set.test.d.ts.map +0 -1
- package/dist/controls/peer-boundary.test.d.ts +0 -2
- package/dist/controls/peer-boundary.test.d.ts.map +0 -1
- package/dist/controls/props-contract.test.d.ts +0 -2
- package/dist/controls/props-contract.test.d.ts.map +0 -1
- package/dist/controls/range-filter.type-guard.test.d.ts +0 -2
- package/dist/controls/range-filter.type-guard.test.d.ts.map +0 -1
- package/dist/controls/sync-button.test.d.ts +0 -2
- package/dist/controls/sync-button.test.d.ts.map +0 -1
- package/dist/dashboard/query-state.test.d.ts +0 -2
- package/dist/dashboard/query-state.test.d.ts.map +0 -1
- package/dist/dashboard/settings-section.test.d.ts +0 -2
- package/dist/dashboard/settings-section.test.d.ts.map +0 -1
- package/dist/dashboard/stat-card.test.d.ts +0 -2
- package/dist/dashboard/stat-card.test.d.ts.map +0 -1
- package/dist/data/data-table.test.d.ts +0 -2
- package/dist/data/data-table.test.d.ts.map +0 -1
- package/dist/guard/check-source.test.d.ts +0 -2
- package/dist/guard/check-source.test.d.ts.map +0 -1
- package/dist/guard/grace.test.d.ts +0 -20
- package/dist/guard/grace.test.d.ts.map +0 -1
- package/dist/guard/guard-hook.test.d.ts +0 -2
- package/dist/guard/guard-hook.test.d.ts.map +0 -1
- package/dist/provider/index.test.d.ts +0 -2
- package/dist/provider/index.test.d.ts.map +0 -1
- package/dist/provider/lab-theme.test.d.ts +0 -2
- package/dist/provider/lab-theme.test.d.ts.map +0 -1
- package/dist/query/error-message.test.d.ts +0 -2
- package/dist/query/error-message.test.d.ts.map +0 -1
- package/dist/router-tanstack/multi-search-param-store.test.d.ts +0 -2
- package/dist/router-tanstack/multi-search-param-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/nav.test.d.ts +0 -2
- package/dist/router-tanstack/nav.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-param-store.test.d.ts +0 -2
- package/dist/router-tanstack/search-param-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-store.router.test.d.ts +0 -2
- package/dist/router-tanstack/search-store.router.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-store.test.d.ts +0 -2
- package/dist/router-tanstack/search-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/use-nav.test.d.ts +0 -2
- package/dist/router-tanstack/use-nav.test.d.ts.map +0 -1
- package/dist/section/section.test.d.ts +0 -2
- package/dist/section/section.test.d.ts.map +0 -1
- package/dist/shell/app-mobile-nav.test.d.ts +0 -2
- package/dist/shell/app-mobile-nav.test.d.ts.map +0 -1
- package/dist/shell/app-sidebar.test.d.ts +0 -2
- package/dist/shell/app-sidebar.test.d.ts.map +0 -1
- package/dist/shell/index.test.d.ts +0 -2
- package/dist/shell/index.test.d.ts.map +0 -1
- package/dist/shell/mobile-nav-model.test.d.ts +0 -2
- package/dist/shell/mobile-nav-model.test.d.ts.map +0 -1
- package/dist/shell/page-bar.test.d.ts +0 -2
- package/dist/shell/page-bar.test.d.ts.map +0 -1
- package/dist/state/fields.test.d.ts +0 -2
- package/dist/state/fields.test.d.ts.map +0 -1
- package/dist/state/persisted.test.d.ts +0 -2
- package/dist/state/persisted.test.d.ts.map +0 -1
- package/dist/styles.floor.test.d.ts +0 -2
- package/dist/styles.floor.test.d.ts.map +0 -1
- package/dist/theme/border-coverage.test.d.ts +0 -18
- package/dist/theme/border-coverage.test.d.ts.map +0 -1
- package/dist/theme/contrast.test.d.ts +0 -2
- package/dist/theme/contrast.test.d.ts.map +0 -1
- package/dist/theme/ctl-theme.test.d.ts +0 -2
- package/dist/theme/ctl-theme.test.d.ts.map +0 -1
- package/dist/theme/ctl-tier-coverage.test.d.ts +0 -2
- package/dist/theme/ctl-tier-coverage.test.d.ts.map +0 -1
- package/dist/theme/density-option.test.d.ts +0 -2
- package/dist/theme/density-option.test.d.ts.map +0 -1
- package/dist/theme/density-relations.test.d.ts +0 -2
- package/dist/theme/density-relations.test.d.ts.map +0 -1
- package/dist/theme/derive-theme.test.d.ts +0 -2
- package/dist/theme/derive-theme.test.d.ts.map +0 -1
- package/dist/theme/divider-law.test.d.ts +0 -2
- package/dist/theme/divider-law.test.d.ts.map +0 -1
- package/dist/theme/fonts-option.test.d.ts +0 -2
- package/dist/theme/fonts-option.test.d.ts.map +0 -1
- package/dist/theme/icon-slot.test.d.ts +0 -2
- package/dist/theme/icon-slot.test.d.ts.map +0 -1
- package/dist/theme/layout-rhythm-css.test.d.ts +0 -2
- package/dist/theme/layout-rhythm-css.test.d.ts.map +0 -1
- package/dist/theme/radius-option.test.d.ts +0 -2
- package/dist/theme/radius-option.test.d.ts.map +0 -1
- package/dist/theme/radius.test.d.ts +0 -2
- package/dist/theme/radius.test.d.ts.map +0 -1
- package/dist/theme/shadow-surfaces.test.d.ts +0 -26
- package/dist/theme/shadow-surfaces.test.d.ts.map +0 -1
- package/dist/theme/spacing.test.d.ts +0 -2
- package/dist/theme/spacing.test.d.ts.map +0 -1
- package/dist/theme/use-basalt-spacing.test.d.ts +0 -2
- package/dist/theme/use-basalt-spacing.test.d.ts.map +0 -1
- package/dist/theme-lab/derive-controls.test.d.ts +0 -2
- package/dist/theme-lab/derive-controls.test.d.ts.map +0 -1
- package/dist/theme-lab/derive-state.test.d.ts +0 -2
- package/dist/theme-lab/derive-state.test.d.ts.map +0 -1
- package/dist/theme-lab/theme-lab.test.d.ts +0 -2
- package/dist/theme-lab/theme-lab.test.d.ts.map +0 -1
- package/dist/tokens/build-fonts-css.test.d.ts +0 -2
- package/dist/tokens/build-fonts-css.test.d.ts.map +0 -1
- package/dist/tokens/build-radius-css.test.d.ts +0 -2
- package/dist/tokens/build-radius-css.test.d.ts.map +0 -1
- package/dist/tokens/chart-margin.test.d.ts +0 -2
- package/dist/tokens/chart-margin.test.d.ts.map +0 -1
- package/dist/tokens/density.test.d.ts +0 -2
- package/dist/tokens/density.test.d.ts.map +0 -1
- package/dist/tokens/derive-radius.test.d.ts +0 -2
- package/dist/tokens/derive-radius.test.d.ts.map +0 -1
- package/dist/tokens/derive.test.d.ts +0 -2
- package/dist/tokens/derive.test.d.ts.map +0 -1
- package/dist/tokens/palette.test.d.ts +0 -2
- package/dist/tokens/palette.test.d.ts.map +0 -1
- package/dist/tokens/text-scale.test.d.ts +0 -2
- package/dist/tokens/text-scale.test.d.ts.map +0 -1
- package/dist/vite-color-mix.test.d.ts +0 -2
- package/dist/vite-color-mix.test.d.ts.map +0 -1
- package/dist/vite.test.d.ts +0 -2
- package/dist/vite.test.d.ts.map +0 -1
- package/dist/widget-header/delta-badge.test.d.ts +0 -2
- package/dist/widget-header/delta-badge.test.d.ts.map +0 -1
- package/dist/widget-header/no-mantine.test.d.ts +0 -2
- package/dist/widget-header/no-mantine.test.d.ts.map +0 -1
- package/dist/widget-header/widget-header.test.d.ts +0 -2
- package/dist/widget-header/widget-header.test.d.ts.map +0 -1
- package/src/agent/adapter.test.ts +0 -1640
- package/src/agent/ai-sdk-transport.test.ts +0 -658
- package/src/agent/coalesce.test.ts +0 -387
- package/src/agent/foreign.test.ts +0 -51
- package/src/agent/id.test.ts +0 -169
- package/src/agent/merge.test.ts +0 -206
- package/src/agent/part-list.test.tsx +0 -112
- package/src/agent/parts.test.ts +0 -720
- package/src/agent/thread.test.ts +0 -220
- package/src/agent/transport.test.ts +0 -70
- package/src/agent/use-agent-stream.test.tsx +0 -287
- package/src/agent/use-agent-thread-runs.foreign.test.tsx +0 -138
- package/src/agent/use-agent-thread-runs.resume.test.tsx +0 -294
- package/src/agent/use-agent-thread-runs.test.tsx +0 -1120
- package/src/agent/use-agent-thread-runs.wedge.test.tsx +0 -387
- package/src/agent-chat/composer.test.tsx +0 -924
- package/src/agent-chat/relative-time.test.ts +0 -95
- package/src/agent-chat/thread-feed-row.test.tsx +0 -510
- package/src/agent-chat/thread-feed.test.tsx +0 -241
- package/src/agent-chat/thread-message.test.tsx +0 -1285
- package/src/agent-chat/thread-workspace.test.tsx +0 -169
- package/src/agent-chat/tool-chip.test.tsx +0 -139
- package/src/agent-chat/virtualize.type-guard.test.ts +0 -49
- package/src/charts/cursor/resolve.test.ts +0 -151
- package/src/charts/cursor/store.test.ts +0 -64
- package/src/charts/kinds/BandStrip.test.tsx +0 -282
- package/src/charts/kinds/Bars.test.tsx +0 -183
- package/src/charts/kinds/DualPanel.test.tsx +0 -527
- package/src/charts/kinds/MirroredBars.test.tsx +0 -232
- package/src/charts/kinds/MultiLine.test.tsx +0 -218
- package/src/charts/kinds/StackedArea.test.tsx +0 -114
- package/src/charts/kinds/ZonedLine.test.tsx +0 -147
- package/src/charts/layout/auto-margin.test.ts +0 -42
- package/src/charts/primitives/CartesianChart.test.tsx +0 -647
- package/src/charts/primitives/ChartCard.test.tsx +0 -66
- package/src/charts/primitives/ChartFrame.test.tsx +0 -142
- package/src/charts/primitives/ChartLegend.test.tsx +0 -78
- package/src/charts/primitives/ChartTooltip.test.tsx +0 -44
- package/src/charts/primitives/XZoneRects.test.tsx +0 -123
- package/src/charts/series.test.ts +0 -112
- package/src/charts/utils/domain.test.ts +0 -54
- package/src/charts/utils/measure-text.test.ts +0 -36
- package/src/cli/check-coverage.test.ts +0 -297
- package/src/cli/check-theme.test.ts +0 -837
- package/src/cli/help.test.ts +0 -170
- package/src/cli/init-sync.test.ts +0 -343
- package/src/cli/placement-engine.test.ts +0 -298
- package/src/cli/shipped-versions.test.ts +0 -83
- package/src/cli/tarball-parity.test.ts +0 -44
- package/src/cli/template-format.test.ts +0 -64
- package/src/cli/template-ledger.test.ts +0 -219
- package/src/cli/tokens-css.test.ts +0 -249
- package/src/cli/toolchain-wiring.test.ts +0 -1358
- package/src/cli/waiver-audit.test.ts +0 -215
- package/src/content/article-actions.test.ts +0 -78
- package/src/content/article-model.test.ts +0 -119
- package/src/content/block-split.test.ts +0 -75
- package/src/content/heading-components.test.tsx +0 -65
- package/src/content/markdown.test.tsx +0 -603
- package/src/content/prose.module.css.test.ts +0 -39
- package/src/content/sanitize.test.ts +0 -659
- package/src/content/slug.test.ts +0 -62
- package/src/controls/actions.test.tsx +0 -252
- package/src/controls/actions.type-guard.test.ts +0 -63
- package/src/controls/control-group.test.tsx +0 -229
- package/src/controls/controls.router.test.tsx +0 -1053
- package/src/controls/filter-set.test.tsx +0 -472
- package/src/controls/peer-boundary.test.ts +0 -85
- package/src/controls/props-contract.test.tsx +0 -137
- package/src/controls/range-filter.type-guard.test.tsx +0 -122
- package/src/controls/sync-button.test.tsx +0 -183
- package/src/dashboard/query-state.test.tsx +0 -152
- package/src/dashboard/settings-section.test.tsx +0 -56
- package/src/dashboard/stat-card.test.tsx +0 -385
- package/src/data/data-table.test.tsx +0 -434
- package/src/guard/check-source.test.ts +0 -3388
- package/src/guard/grace.test.ts +0 -158
- package/src/guard/guard-hook.test.ts +0 -203
- package/src/provider/index.test.tsx +0 -101
- package/src/provider/lab-theme.test.ts +0 -147
- package/src/query/error-message.test.ts +0 -67
- package/src/router-tanstack/multi-search-param-store.test.ts +0 -124
- package/src/router-tanstack/nav.test.ts +0 -111
- package/src/router-tanstack/search-param-store.test.ts +0 -135
- package/src/router-tanstack/search-store.router.test.tsx +0 -882
- package/src/router-tanstack/search-store.test.ts +0 -578
- package/src/router-tanstack/use-nav.test.tsx +0 -187
- package/src/section/section.test.tsx +0 -204
- package/src/shell/app-mobile-nav.test.tsx +0 -403
- package/src/shell/app-sidebar.test.tsx +0 -509
- package/src/shell/index.test.tsx +0 -428
- package/src/shell/mobile-nav-model.test.ts +0 -517
- package/src/shell/page-bar.test.tsx +0 -316
- package/src/state/fields.test.tsx +0 -512
- package/src/state/persisted.test.ts +0 -91
- package/src/styles.floor.test.ts +0 -36
- package/src/theme/border-coverage.test.ts +0 -272
- package/src/theme/contrast.test.ts +0 -354
- package/src/theme/ctl-theme.test.tsx +0 -275
- package/src/theme/ctl-tier-coverage.test.ts +0 -170
- package/src/theme/density-option.test.ts +0 -96
- package/src/theme/density-relations.test.ts +0 -506
- package/src/theme/derive-theme.test.ts +0 -101
- package/src/theme/divider-law.test.ts +0 -259
- package/src/theme/fonts-option.test.ts +0 -75
- package/src/theme/icon-slot.test.tsx +0 -275
- package/src/theme/layout-rhythm-css.test.ts +0 -72
- package/src/theme/radius-option.test.ts +0 -86
- package/src/theme/radius.test.ts +0 -142
- package/src/theme/shadow-surfaces.test.ts +0 -488
- package/src/theme/spacing.test.ts +0 -495
- package/src/theme/use-basalt-spacing.test.tsx +0 -55
- package/src/theme-lab/derive-controls.test.ts +0 -94
- package/src/theme-lab/derive-state.test.ts +0 -71
- package/src/theme-lab/theme-lab.test.ts +0 -46
- package/src/tokens/build-fonts-css.test.ts +0 -52
- package/src/tokens/build-radius-css.test.ts +0 -25
- package/src/tokens/chart-margin.test.ts +0 -39
- package/src/tokens/density.test.ts +0 -259
- package/src/tokens/derive-radius.test.ts +0 -62
- package/src/tokens/derive.test.ts +0 -30
- package/src/tokens/palette.test.ts +0 -114
- package/src/tokens/text-scale.test.ts +0 -51
- package/src/vite-color-mix.test.ts +0 -46
- package/src/vite.test.ts +0 -423
- package/src/widget-header/delta-badge.test.tsx +0 -60
- package/src/widget-header/no-mantine.test.ts +0 -33
- package/src/widget-header/widget-header.test.tsx +0 -187
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `PageAside` — the right-hand aside REGION (`docs/ASIDE-SPEC.md` §0, wave 1). One per page, and
|
|
3
|
+
* it is the page that decides the region exists at all: `BasaltShell` always renders an
|
|
4
|
+
* `AppShell.Aside`, but with a width of 0 and `collapsed.desktop` until a route mounts a
|
|
5
|
+
* `PageAside` to CLAIM it — an empty home renders nothing (law C14), so no route pays for a
|
|
6
|
+
* reserved column. There is deliberately no `BasaltShellProps` prop for it.
|
|
7
|
+
*
|
|
8
|
+
* The mechanism is `PageBar` row 1's, one region over: an internal provider owns the portal target
|
|
9
|
+
* plus the claim, an internal outlet publishes the node, and the public component portals its own
|
|
10
|
+
* chrome into it. What the aside adds on top of the claim is the FOLD state — the shell needs it to
|
|
11
|
+
* size the region, so `PageAside` publishes it back through the same provider.
|
|
12
|
+
*
|
|
13
|
+
* WHERE it renders is decided by context and viewport, never by a prop:
|
|
14
|
+
*
|
|
15
|
+
* - **Inside `BasaltShell`, from `sm` up** the panel portals into `AppShell.Aside`, folding to a
|
|
16
|
+
* `appShellAsideRailWidth` rail with one expand button.
|
|
17
|
+
* - **Below `sm`, with a `PageBar` that renders a row 2**, the panel PROJECTS into that row: it
|
|
18
|
+
* registers its title and glyph with the page-bar slot, renders no node of its own, and row 2
|
|
19
|
+
* draws one `Panel` pill opening a `FilterSheet` its children portal into. One node at a time —
|
|
20
|
+
* never the in-flow block AND the sheet.
|
|
21
|
+
* - **Below `sm` with no such row, and in a shell-less app**, it renders IN-FLOW exactly where it
|
|
22
|
+
* is written — one node, no `visibleFrom` twin, no second mount (law C9) — with no fold chrome,
|
|
23
|
+
* because there is no region to fold into. A page therefore writes it after its main column and
|
|
24
|
+
* gets the stacked mobile order for free.
|
|
25
|
+
*
|
|
26
|
+
* **The body is the `panel` filter surface.** Children mount under `FilterSetScope surface="panel"`
|
|
27
|
+
* with a `null` registry, so every basalt control in an aside renders its inspector/facet ROW form
|
|
28
|
+
* rather than a pill (`docs/ASIDE-SPEC.md` §3), and none of them counts toward a `Filters (n)` that
|
|
29
|
+
* does not exist here. In the mobile projection the same children mount under `surface="sheet"` —
|
|
30
|
+
* the sheet's own row form, not a panel row squeezed into a drawer.
|
|
31
|
+
*
|
|
32
|
+
* **This component is law C9's ONE declared exception, and the exception is the point of the law.**
|
|
33
|
+
* Every other responsive twin in the package is CSS (`visibleFrom`/`hiddenFrom` in `actions.tsx`,
|
|
34
|
+
* `view-tabs.tsx`), because there the two forms are two RENDERINGS of one stateless control and
|
|
35
|
+
* mounting both costs a hidden box. Here they are not. The desktop form lives inside
|
|
36
|
+
* `AppShell.Aside` and the phone form inside a `FilterSheet` whose Drawer UNMOUNTS its body when
|
|
37
|
+
* closed — two portal targets, never one node CSS could reposition between them — and the two
|
|
38
|
+
* mount their children under DIFFERENT filter surfaces (`panel` vs `sheet`), which is a React
|
|
39
|
+
* context value no media query in CSS can express. A CSS-only twin would therefore have to render
|
|
40
|
+
* the children TWICE, and an aside's children are stateful: every bound control in there would
|
|
41
|
+
* subscribe to its field twice, which is the same defect the shell already refuses for live
|
|
42
|
+
* indicators in the More sheet. Single-mounting a stateful panel beats a CSS twin, so the viewport
|
|
43
|
+
* read stays in JS — through `useSyncExternalStore`, so SSR, hydration and the first paint agree.
|
|
44
|
+
* Recorded in `docs/CONTROLS-SPEC.md` §1 (C9) and `docs/ASIDE-SPEC.md` §0.
|
|
45
|
+
*/
|
|
46
|
+
import {
|
|
47
|
+
createContext,
|
|
48
|
+
useCallback,
|
|
49
|
+
useContext,
|
|
50
|
+
useMemo,
|
|
51
|
+
useState,
|
|
52
|
+
useSyncExternalStore,
|
|
53
|
+
} from 'react'
|
|
54
|
+
import type { ReactNode } from 'react'
|
|
55
|
+
import { createPortal } from 'react-dom'
|
|
56
|
+
import { useMantineTheme } from '@mantine/core'
|
|
57
|
+
import { cx } from '../common/props'
|
|
58
|
+
import type { BasaltProps, SlotStylesProps } from '../common/props'
|
|
59
|
+
import { assertRequiredProps } from '../common/validate'
|
|
60
|
+
import { usePersistedOrLocal } from '../state/persisted-or-local'
|
|
61
|
+
import { FilterSetScope } from '../controls/filter-context'
|
|
62
|
+
import { useAsidePanelSlot } from './page-bar'
|
|
63
|
+
import { useIsomorphicLayoutEffect } from './isomorphic-layout-effect'
|
|
64
|
+
import classes from './page-aside.module.css'
|
|
65
|
+
|
|
66
|
+
type AsideRegion = {
|
|
67
|
+
/** The node inside `AppShell.Aside` the panel portals into. `null` outside a shell, and until
|
|
68
|
+
* the outlet mounts. */
|
|
69
|
+
target: HTMLElement | null
|
|
70
|
+
setTarget: (el: HTMLElement | null) => void
|
|
71
|
+
/** True only under `BasaltShell` — the provider is shell-internal, so the context IS the probe. */
|
|
72
|
+
inShell: boolean
|
|
73
|
+
/** A page is rendering a `PageAside` into the region; until then it has zero width. */
|
|
74
|
+
claimed: boolean
|
|
75
|
+
/** The claiming page's fold state, published back so the shell can size the region. */
|
|
76
|
+
folded: boolean
|
|
77
|
+
claim: () => () => void
|
|
78
|
+
publishFolded: (folded: boolean) => void
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const NO_REGION: AsideRegion = {
|
|
82
|
+
target: null,
|
|
83
|
+
setTarget: () => {},
|
|
84
|
+
inShell: false,
|
|
85
|
+
claimed: false,
|
|
86
|
+
folded: false,
|
|
87
|
+
claim: () => () => {},
|
|
88
|
+
publishFolded: () => {},
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const AsideContext = createContext<AsideRegion>(NO_REGION)
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Internal — mounted by `BasaltShell` inside `PageBarProvider`. Owns the portal target, the claim
|
|
95
|
+
* that turns the region on, and the mirrored fold flag the shell reads for `aside.width`.
|
|
96
|
+
*/
|
|
97
|
+
export function AsideProvider({ children }: { children: ReactNode }): ReactNode {
|
|
98
|
+
const [target, setTarget] = useState<HTMLElement | null>(null)
|
|
99
|
+
const [claims, setClaims] = useState(0)
|
|
100
|
+
const [folded, setFolded] = useState(false)
|
|
101
|
+
|
|
102
|
+
const claim = useCallback(() => {
|
|
103
|
+
setClaims((n) => n + 1)
|
|
104
|
+
return () => {
|
|
105
|
+
setClaims((n) => n - 1)
|
|
106
|
+
// A route that leaves folded must not hand the next one a folded, unclaimed region.
|
|
107
|
+
setFolded(false)
|
|
108
|
+
}
|
|
109
|
+
}, [])
|
|
110
|
+
|
|
111
|
+
const value: AsideRegion = {
|
|
112
|
+
target,
|
|
113
|
+
setTarget,
|
|
114
|
+
inShell: true,
|
|
115
|
+
claimed: claims > 0,
|
|
116
|
+
folded,
|
|
117
|
+
claim,
|
|
118
|
+
publishFolded: setFolded,
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return <AsideContext.Provider value={value}>{children}</AsideContext.Provider>
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Internal — the region's state, read by `BasaltShell` to size `AppShell.Aside`. */
|
|
125
|
+
export function useAsideRegion(): Pick<AsideRegion, 'claimed' | 'folded'> {
|
|
126
|
+
const { claimed, folded } = useContext(AsideContext)
|
|
127
|
+
return { claimed, folded }
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Internal — the node inside `AppShell.Aside` the active page's panel portals into. */
|
|
131
|
+
export function AsideOutlet({ className }: { className?: string }) {
|
|
132
|
+
const { setTarget } = useContext(AsideContext)
|
|
133
|
+
return <div ref={setTarget} className={className} />
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** `window.matchMedia`, or `null` where there is no window and on a shim that does not ship it. */
|
|
137
|
+
function mediaQueryList(query: string): MediaQueryList | null {
|
|
138
|
+
if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return null
|
|
139
|
+
return window.matchMedia(query)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Internal — a media query read through `useSyncExternalStore`, the ONE hook whose server snapshot
|
|
144
|
+
* React honours during BOTH `renderToString` and the hydration pass.
|
|
145
|
+
*
|
|
146
|
+
* That is the whole reason it is not `@mantine/hooks`' `useMediaQuery`, which reads `matchMedia`
|
|
147
|
+
* inside a `useState` INITIALIZER: on the server it returns `initialValue`, on the client's very
|
|
148
|
+
* first render it returns the real match, and when that render is a HYDRATION the two disagree
|
|
149
|
+
* silently — a server-rendered desktop panel hydrating on a phone against a client tree that has
|
|
150
|
+
* already moved the children into the page bar's sheet. `getServerSnapshot` makes React render the
|
|
151
|
+
* server's answer during hydration and re-render with the real one immediately after, which is the
|
|
152
|
+
* documented, warning-free version of the same correction.
|
|
153
|
+
*
|
|
154
|
+
* `fallback` is what the server (and a shim with no `matchMedia`) sees. It stays the DESKTOP
|
|
155
|
+
* answer, because the portalled branch is the one a shell-less or pre-hydration page can always
|
|
156
|
+
* fall back to rendering.
|
|
157
|
+
*/
|
|
158
|
+
function useMediaQueryMatches(query: string, fallback: boolean): boolean {
|
|
159
|
+
// ONE `MediaQueryList` per query, held across renders. `matchMedia()` allocates a fresh live
|
|
160
|
+
// object on every call and `getSnapshot` runs on every render AND after every store
|
|
161
|
+
// notification — so calling it in there churned an object per read, and the list `subscribe`
|
|
162
|
+
// listened on was never the one `getSnapshot` measured. Reading `.matches` off the SAME instance
|
|
163
|
+
// it subscribed to is what makes the snapshot and the notification describe one thing.
|
|
164
|
+
const list = useMemo(() => mediaQueryList(query), [query])
|
|
165
|
+
const subscribe = useCallback(
|
|
166
|
+
(onStoreChange: () => void) => {
|
|
167
|
+
if (list === null) return () => {}
|
|
168
|
+
list.addEventListener('change', onStoreChange)
|
|
169
|
+
return () => {
|
|
170
|
+
list.removeEventListener('change', onStoreChange)
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
[list],
|
|
174
|
+
)
|
|
175
|
+
const getSnapshot = useCallback(() => list?.matches ?? fallback, [list, fallback])
|
|
176
|
+
const getServerSnapshot = useCallback(() => fallback, [fallback])
|
|
177
|
+
return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** The three boxes `PageAside` paints, in every projection (`common/props.ts`). */
|
|
181
|
+
export type PageAsideSlot = 'root' | 'header' | 'body'
|
|
182
|
+
|
|
183
|
+
export type PageAsideProps = BasaltProps &
|
|
184
|
+
SlotStylesProps<PageAsideSlot> & {
|
|
185
|
+
/** Header label; also the accessible name of the region. */
|
|
186
|
+
title: string
|
|
187
|
+
/** Persists the fold at `basalt:aside:<persistKey>`. Omit for an unpersisted fold. */
|
|
188
|
+
persistKey?: string
|
|
189
|
+
/** Fold state on first render, respected only while nothing is persisted. @default false */
|
|
190
|
+
defaultFolded?: boolean
|
|
191
|
+
children: ReactNode
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** The fold glyph — `app-sidebar.tsx`'s `IconCollapse`, mirrored onto the right-hand edge, so the
|
|
195
|
+
* two shell folds read as one family. Inline, because basalt ships no icon dependency. */
|
|
196
|
+
function IconAsideFold({ folded }: { folded: boolean }) {
|
|
197
|
+
return (
|
|
198
|
+
<svg
|
|
199
|
+
width={16}
|
|
200
|
+
height={16}
|
|
201
|
+
viewBox="0 0 24 24"
|
|
202
|
+
fill="none"
|
|
203
|
+
stroke="currentColor"
|
|
204
|
+
strokeWidth={2}
|
|
205
|
+
strokeLinecap="round"
|
|
206
|
+
strokeLinejoin="round"
|
|
207
|
+
aria-hidden
|
|
208
|
+
>
|
|
209
|
+
<path d="M4 4h16v16H4z" />
|
|
210
|
+
<path d="M15 4v16" />
|
|
211
|
+
{folded ? <path d="M10 9l-3 3l3 3" /> : <path d="M8 9l3 3l-3 3" />}
|
|
212
|
+
</svg>
|
|
213
|
+
)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* The aside's own glyph for the mobile `Panel` pill — {@link IconAsideFold}'s box and divider with
|
|
218
|
+
* no chevron, because a pill that OPENS a panel is not folding one. Deliberately not a funnel: a
|
|
219
|
+
* funnel is `Filters (n)`, and an aside is not a filter set.
|
|
220
|
+
*
|
|
221
|
+
* It travels to `PageBar` as part of the claim rather than being imported there, which is what
|
|
222
|
+
* keeps `page-bar.tsx` free of any import back into this module.
|
|
223
|
+
*/
|
|
224
|
+
function IconAsidePanel() {
|
|
225
|
+
return (
|
|
226
|
+
<svg
|
|
227
|
+
width={16}
|
|
228
|
+
height={16}
|
|
229
|
+
viewBox="0 0 24 24"
|
|
230
|
+
fill="none"
|
|
231
|
+
stroke="currentColor"
|
|
232
|
+
strokeWidth={2}
|
|
233
|
+
strokeLinecap="round"
|
|
234
|
+
strokeLinejoin="round"
|
|
235
|
+
aria-hidden
|
|
236
|
+
>
|
|
237
|
+
<path d="M4 4h16v16H4z" />
|
|
238
|
+
<path d="M15 4v16" />
|
|
239
|
+
</svg>
|
|
240
|
+
)
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/** The fold toggle — a plain control sized to the `ctl` tier by hand, exactly like `Section`'s own
|
|
244
|
+
* chevron (`section/section.module.css`) and for the same reason: wrapping one glyph in a
|
|
245
|
+
* `CtlSlot` would nest a theme provider around it. */
|
|
246
|
+
function FoldButton({ folded, onToggle }: { folded: boolean; onToggle: () => void }) {
|
|
247
|
+
return (
|
|
248
|
+
<button
|
|
249
|
+
type="button"
|
|
250
|
+
className={classes.fold}
|
|
251
|
+
aria-expanded={!folded}
|
|
252
|
+
aria-label={folded ? 'Expand panel' : 'Collapse panel'}
|
|
253
|
+
onClick={onToggle}
|
|
254
|
+
>
|
|
255
|
+
<IconAsideFold folded={folded} />
|
|
256
|
+
</button>
|
|
257
|
+
)
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
export function PageAside(props: PageAsideProps): ReactNode {
|
|
261
|
+
// F-ERR-1, and here it is an ACCESSIBILITY fault rather than a crash: `title` is both the visible
|
|
262
|
+
// header and the region's `aria-label`, so a missing one ships a landmark with no name and a
|
|
263
|
+
// header row with nothing in it — silently, on the branch a screen reader depends on.
|
|
264
|
+
assertRequiredProps('PageAside', props, ['title'], {
|
|
265
|
+
title: 'it names the region — it is the header text AND the `aria-label` on the landmark.',
|
|
266
|
+
})
|
|
267
|
+
const { title, persistKey, defaultFolded = false, children, className, style, classNames } = props
|
|
268
|
+
const { target, inShell, claim, publishFolded } = useContext(AsideContext)
|
|
269
|
+
// Destructured, not held as one object: the hook returns a fresh literal every render, and the
|
|
270
|
+
// claim effect below would then re-run (claim → release → claim) forever. `claimPanel` is a
|
|
271
|
+
// `useCallback` on the provider, so it is the stable half.
|
|
272
|
+
const { host: panelHost, claim: claimPanel, target: panelTarget } = useAsidePanelSlot()
|
|
273
|
+
const theme = useMantineTheme()
|
|
274
|
+
// `sm` is the only breakpoint (`docs/CONTROLS-SPEC.md` §2), read off the theme so a consumer that
|
|
275
|
+
// retunes it moves the aside with it. THE declared C9 exception (see this file's header): the
|
|
276
|
+
// read is JS because the two projections are two portal targets under two filter surfaces, and a
|
|
277
|
+
// CSS twin would double-mount stateful children. `useSyncExternalStore` is what keeps SSR, the
|
|
278
|
+
// hydration pass and the first client paint agreeing on which single node exists.
|
|
279
|
+
const desktop = useMediaQueryMatches(`(min-width: ${theme.breakpoints.sm})`, true)
|
|
280
|
+
const [folded, setFolded] = usePersistedOrLocal({
|
|
281
|
+
scope: 'aside',
|
|
282
|
+
persistKey,
|
|
283
|
+
initial: defaultFolded,
|
|
284
|
+
})
|
|
285
|
+
|
|
286
|
+
const portalled = inShell && desktop
|
|
287
|
+
// Below `sm` the panel goes into the page bar's row 2 IF there is one. Without a row 2 there is
|
|
288
|
+
// nowhere to put a trigger, so the honest in-flow form (wave 1) stays.
|
|
289
|
+
const projected = !portalled && panelHost
|
|
290
|
+
// WHETHER there is a row 2 is published by a LAYOUT EFFECT inside `PageBar`, and React runs
|
|
291
|
+
// layout effects after the whole commit — so on a phone's FIRST render pass `panelHost` is
|
|
292
|
+
// always false, whatever the page contains. Rendering the in-flow form on that pass therefore
|
|
293
|
+
// mounted the children, ran their effects, and unmounted them one commit later on every page
|
|
294
|
+
// that does project: MEASURED at 2 mounts of one probe subtree for one sheet (real Chrome,
|
|
295
|
+
// 390x844). Invisible — a layout-effect state flip is flushed before paint — but every bound
|
|
296
|
+
// control in the aside subscribed to its field, tore the subscription down and rebuilt it, and
|
|
297
|
+
// any child holding state lost it. Deferring ONE commit is what makes "exactly one mount at
|
|
298
|
+
// each width" true, which is the promise law C9's exception for this component is granted on.
|
|
299
|
+
//
|
|
300
|
+
// Scoped to the shell branch on purpose: a shell-less app has no row 2 to wait for, so it keeps
|
|
301
|
+
// rendering in flow on its first pass with nothing deferred.
|
|
302
|
+
const [settled, setSettled] = useState(false)
|
|
303
|
+
// Memoized on `title` alone: the claim goes into the provider's state, so an object rebuilt every
|
|
304
|
+
// render would re-run the effect, re-set the state and re-render this component forever.
|
|
305
|
+
const panelClaim = useMemo(() => ({ title, icon: <IconAsidePanel /> }), [title])
|
|
306
|
+
|
|
307
|
+
useIsomorphicLayoutEffect(() => {
|
|
308
|
+
setSettled(true)
|
|
309
|
+
}, [])
|
|
310
|
+
|
|
311
|
+
useIsomorphicLayoutEffect(() => {
|
|
312
|
+
if (!portalled) return
|
|
313
|
+
return claim()
|
|
314
|
+
}, [portalled, claim])
|
|
315
|
+
|
|
316
|
+
useIsomorphicLayoutEffect(() => {
|
|
317
|
+
if (!portalled) return
|
|
318
|
+
publishFolded(folded)
|
|
319
|
+
}, [portalled, folded, publishFolded])
|
|
320
|
+
|
|
321
|
+
useIsomorphicLayoutEffect(() => {
|
|
322
|
+
if (!projected) return
|
|
323
|
+
return claimPanel(panelClaim)
|
|
324
|
+
}, [projected, panelClaim, claimPanel])
|
|
325
|
+
|
|
326
|
+
const panel = (
|
|
327
|
+
<section
|
|
328
|
+
className={cx(classes.panel, classNames?.root, className)}
|
|
329
|
+
data-basalt-page-aside={portalled ? 'shell' : 'standalone'}
|
|
330
|
+
aria-label={title}
|
|
331
|
+
{...(style !== undefined && { style })}
|
|
332
|
+
>
|
|
333
|
+
{portalled && folded ? (
|
|
334
|
+
<div className={classes.rail}>
|
|
335
|
+
<FoldButton folded onToggle={() => setFolded(false)} />
|
|
336
|
+
</div>
|
|
337
|
+
) : (
|
|
338
|
+
<>
|
|
339
|
+
<div className={cx(classes.header, classNames?.header)} data-basalt-page-aside-header="">
|
|
340
|
+
<span className={classes.title}>{title}</span>
|
|
341
|
+
{portalled && <FoldButton folded={false} onToggle={() => setFolded(true)} />}
|
|
342
|
+
</div>
|
|
343
|
+
<div className={cx(classes.body, classNames?.body)}>
|
|
344
|
+
{/* The aside body IS a home (law C1) and a filter surface: `panel` is what turns every
|
|
345
|
+
bound control inside into an inspector row. `registry: null` because there is no
|
|
346
|
+
census here — no `Filters (n)`, no `Reset all`. */}
|
|
347
|
+
<FilterSetScope surface="panel" registry={null}>
|
|
348
|
+
{children}
|
|
349
|
+
</FilterSetScope>
|
|
350
|
+
</div>
|
|
351
|
+
</>
|
|
352
|
+
)}
|
|
353
|
+
</section>
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
// Projected: the node lives in the page bar's sheet, so this position renders NOTHING. The
|
|
357
|
+
// children go through the outlet the bar publishes, under the SHEET surface — a 300px inspector
|
|
358
|
+
// row in a full-width drawer would be a panel drawn in the wrong place.
|
|
359
|
+
if (projected) {
|
|
360
|
+
if (panelTarget === null) return null
|
|
361
|
+
return createPortal(
|
|
362
|
+
<FilterSetScope surface="sheet" registry={null}>
|
|
363
|
+
{children}
|
|
364
|
+
</FilterSetScope>,
|
|
365
|
+
panelTarget,
|
|
366
|
+
)
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// In flow: below `sm` with no page bar to project into, and in every shell-less app. One node,
|
|
370
|
+
// written where the page put it — and inside a shell, not until the row-2 claim has had its one
|
|
371
|
+
// commit to arrive (see `settled` above), so a page that DOES project never mounts these
|
|
372
|
+
// children just to throw them away.
|
|
373
|
+
if (!portalled) return inShell && !settled ? null : panel
|
|
374
|
+
// `target` is null for the first commit only — the outlet's ref sets it.
|
|
375
|
+
if (target === null) return null
|
|
376
|
+
return createPortal(panel, target)
|
|
377
|
+
}
|
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
* scrolls sideways hides its own controls; the fold is computed instead — `More` for actions
|
|
6
6
|
* (`ActionGroup`), a `Filters (n)` sheet for filters (`FilterSet`'s job, wave 4). The filter
|
|
7
7
|
* container below only supplies `min-width: 0` so that fold has a box to measure against.
|
|
8
|
+
*
|
|
9
|
+
* Below `sm`, row 2 is a COLUMN of two declared lines — tabs, then pills (the tabs' phone form is
|
|
10
|
+
* full-width by contract). That is not a wrap: the line count is decided by what is mounted, never
|
|
11
|
+
* by width (law C14 for a phone form).
|
|
8
12
|
*/
|
|
9
13
|
|
|
10
14
|
/* The shell-less bar: both rows, sticky at the top of the document. One layer under the AppShell
|
|
@@ -22,16 +26,23 @@
|
|
|
22
26
|
}
|
|
23
27
|
|
|
24
28
|
/*
|
|
25
|
-
* Row 2 inside a shell
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
+
* Row 2 inside a shell — the CONTENT of the shell's band, not a band of its own.
|
|
30
|
+
*
|
|
31
|
+
* Nothing positional here on purpose. `BasaltShell` renders the band
|
|
32
|
+
* (`app-main.module.css`'s `.band`) as a sibling of the scrollport, between the header and Main,
|
|
33
|
+
* and row 2 portals into it (`page-bar.tsx`). The band owns the width, the inset and the single
|
|
34
|
+
* `--vx-divider` seam under it; this rule only has to fill it.
|
|
35
|
+
*
|
|
36
|
+
* There is deliberately no `position: sticky` left. When row 2 lived in the page flow it stuck to
|
|
37
|
+
* whatever scrollport contained it, which made its resting position depend on the consumer's own
|
|
38
|
+
* DOM: nested one `Stack` deep — every real page — the sticky constraint rectangle was that
|
|
39
|
+
* wrapper, so the band sat one `--app-shell-padding` below the header seam, while a bar written as
|
|
40
|
+
* Main's direct child sat flush. Outside the scrollport there is nothing to stick to and nothing to
|
|
41
|
+
* be clamped by.
|
|
29
42
|
*/
|
|
30
|
-
.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
z-index: calc(var(--app-shell-header-z-index, 100) - 1);
|
|
34
|
-
background-color: var(--vx-surface-bg);
|
|
43
|
+
.row2Band {
|
|
44
|
+
width: 100%;
|
|
45
|
+
min-width: 0;
|
|
35
46
|
}
|
|
36
47
|
|
|
37
48
|
.row1 {
|
|
@@ -108,9 +119,16 @@
|
|
|
108
119
|
* `min-height: var(--vx-space-page-bar-row-height)` (40px) left a 30px pill floating inside a 40px
|
|
109
120
|
* box with the 5px above and below it belonging to nothing — and because the row sat in a `Stack`
|
|
110
121
|
* that already spaced it, the visible gap between the header and the pills read as ~19px while the
|
|
111
|
-
* gap from the pills to the first card read as ~19px too. Symmetric padding on the row itself is
|
|
112
|
-
*
|
|
113
|
-
*
|
|
122
|
+
* gap from the pills to the first card read as ~19px too. Symmetric padding on the row itself is
|
|
123
|
+
* one declaration owning both halves, so the sticky bar's published height covers exactly the band
|
|
124
|
+
* it paints — including below `sm`, where `.row2` becomes a COLUMN of `.tabs` then `.pills` and
|
|
125
|
+
* `padding-block` still owns both edges of the taller band.
|
|
126
|
+
*
|
|
127
|
+
* `stackXs` and not `stackSm`: the row sits inside the shell's own bordered band
|
|
128
|
+
* (`app-main.module.css`'s `.band`), so it no longer has to carry the visual separation in
|
|
129
|
+
* whitespace — 4px above and below a 30px `ctl` pill still clears it (38px total) and buys back 8px
|
|
130
|
+
* of content on every page.
|
|
131
|
+
* Row 1's 40px `--vx-space-page-bar-row-height` is untouched: it is a HEIGHT token, not padding.
|
|
114
132
|
*/
|
|
115
133
|
.row2 {
|
|
116
134
|
display: flex;
|
|
@@ -118,7 +136,29 @@
|
|
|
118
136
|
align-items: center;
|
|
119
137
|
gap: var(--vx-space-control-gap);
|
|
120
138
|
min-width: 0;
|
|
121
|
-
padding-block: var(--vx-space-stack-
|
|
139
|
+
padding-block: var(--vx-space-stack-xs);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* The tabs' own line — a direct flex child so a `fullWidth` `ViewTabs` gets the whole row instead
|
|
143
|
+
* of sharing it with the pills (the row-2 defect: `CtlSlot` is `display: contents`, so an unwrapped
|
|
144
|
+
* `ViewTabs` used to shrink alongside `.filters` and clip). `flex: none` above `sm`, where the row
|
|
145
|
+
* is one line and the tabs sit at their intrinsic width beside the pills. */
|
|
146
|
+
.tabs {
|
|
147
|
+
display: flex;
|
|
148
|
+
flex: none;
|
|
149
|
+
min-width: 0;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* The rest of row 2 — filters, the aside's `Panel` pill, `filtersEnd` — as one line so `.filters`'s
|
|
153
|
+
* `flex: 1 1 auto` and the trailing auto-margins keep working unchanged; they now measure against
|
|
154
|
+
* this box instead of `.row2` directly. */
|
|
155
|
+
.pills {
|
|
156
|
+
display: flex;
|
|
157
|
+
flex-wrap: nowrap;
|
|
158
|
+
align-items: center;
|
|
159
|
+
gap: var(--vx-space-control-gap);
|
|
160
|
+
flex: 1 1 auto;
|
|
161
|
+
min-width: 0;
|
|
122
162
|
}
|
|
123
163
|
|
|
124
164
|
.filters {
|
|
@@ -175,4 +215,58 @@
|
|
|
175
215
|
min-width: var(--vx-space-touch-control-height);
|
|
176
216
|
min-height: var(--vx-space-touch-control-height);
|
|
177
217
|
}
|
|
218
|
+
|
|
219
|
+
/*
|
|
220
|
+
* Row 2's phone form: two declared lines, tabs then pills — not a wrap (law C7). `.pills` folds
|
|
221
|
+
* every overflow into `Filters (n)` at any width, EXCEPT when it holds nothing visible: below `sm`
|
|
222
|
+
* `filtersEnd` renders only in the row-1 kebab (`BarActionRow viewport="desktop"` mounts a
|
|
223
|
+
* `visibleFrom="sm"` group and nothing else), so `tabs` + `filtersEnd` with no `filters`/`panel`
|
|
224
|
+
* would otherwise mount an empty `.pills` box and its column `gap` still reserves the line's height
|
|
225
|
+
* — the exact reserved-row case law C14 forbids. `:has()` is already load-bearing elsewhere in this
|
|
226
|
+
* package (`controls.module.css`'s `.sheetOption`/`.facetOption` focus rules).
|
|
227
|
+
*/
|
|
228
|
+
.row2 {
|
|
229
|
+
flex-direction: column;
|
|
230
|
+
align-items: stretch;
|
|
231
|
+
gap: var(--vx-space-stack-xs);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.pills:not(:has(> .filters, > .panelPill)) {
|
|
235
|
+
display: none;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.tabs {
|
|
239
|
+
width: 100%;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/*
|
|
243
|
+
* `CtlSlot` (`theme/ctl-theme.tsx`) wraps `tabs` in a `<Box data-basalt-tier style="display:
|
|
244
|
+
* contents">` — a box-less element, so a bare `.tabs > *` matches ONLY that inert wrapper and never
|
|
245
|
+
* reaches `ViewTabs`' actual `SegmentedControl`/`Select` root. `display: contents` still promotes
|
|
246
|
+
* its children to be `.tabs`' real flex items for LAYOUT while leaving them `.tabs`' grandchildren
|
|
247
|
+
* for the DOM the `>` combinator walks — so the selector has to name the slot's own attribute to
|
|
248
|
+
* reach past it.
|
|
249
|
+
*/
|
|
250
|
+
.tabs > [data-basalt-tier] > * {
|
|
251
|
+
flex: 1 1 auto;
|
|
252
|
+
min-width: 0;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/* The phone `Select` past three tab options keeps its own bounded `.phoneSelect` max-width
|
|
256
|
+
* (`controls.module.css`) and stays left-aligned rather than stretching to fill the line. More
|
|
257
|
+
* specific than the catch-all above by one class either way, so source order does not matter. */
|
|
258
|
+
.tabs > [data-basalt-tier] > :global(.mantine-Select-root) {
|
|
259
|
+
flex: none;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/*
|
|
264
|
+
* The aside's mobile trigger (`docs/ASIDE-SPEC.md` §0). Trailing, incompressible, and it exists
|
|
265
|
+
* only below `sm` — but the gate is JS, not a media query: `PageAside` claims the slot only when it
|
|
266
|
+
* is NOT portalled into the region, so on a desktop viewport there is no pill to hide. A second,
|
|
267
|
+
* CSS-side gate here would be a second answer to the same question.
|
|
268
|
+
*/
|
|
269
|
+
.panelPill {
|
|
270
|
+
margin-inline-start: auto;
|
|
271
|
+
flex-shrink: 0;
|
|
178
272
|
}
|
|
@@ -4,14 +4,17 @@
|
|
|
4
4
|
*/
|
|
5
5
|
declare const classes: {
|
|
6
6
|
readonly bar: string
|
|
7
|
-
readonly
|
|
7
|
+
readonly row2Band: string
|
|
8
8
|
readonly row1: string
|
|
9
9
|
readonly lead: string
|
|
10
10
|
readonly icon: string
|
|
11
11
|
readonly title: string
|
|
12
12
|
readonly row2: string
|
|
13
13
|
readonly row1End: string
|
|
14
|
+
readonly tabs: string
|
|
15
|
+
readonly pills: string
|
|
14
16
|
readonly filters: string
|
|
15
17
|
readonly filtersEnd: string
|
|
18
|
+
readonly panelPill: string
|
|
16
19
|
}
|
|
17
20
|
export default classes
|