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
package/src/shell/index.tsx
CHANGED
|
@@ -20,11 +20,16 @@
|
|
|
20
20
|
import { AppShell, Box } from '@mantine/core'
|
|
21
21
|
import { Fragment, useMemo } from 'react'
|
|
22
22
|
import type { MouseEvent, ReactNode } from 'react'
|
|
23
|
+
import { cx } from '../common/props'
|
|
24
|
+
import type { BasaltProps } from '../common/props'
|
|
25
|
+
import { assertRequiredProps } from '../common/validate'
|
|
23
26
|
import { AppSidebar } from './app-sidebar'
|
|
27
|
+
import { AppBrand } from './app-brand'
|
|
24
28
|
import { MobileNav, accountRowCount } from './app-mobile-nav'
|
|
25
29
|
import { blockRowCount, projectMobileNav } from './mobile-nav-model'
|
|
26
30
|
import { AppBreadcrumbs } from './app-breadcrumbs'
|
|
27
|
-
import { PageBarOutlet, PageBarProvider, usePageKebabClaimed } from './page-bar'
|
|
31
|
+
import { PageBarBandOutlet, PageBarOutlet, PageBarProvider, usePageKebabClaimed } from './page-bar'
|
|
32
|
+
import { AsideOutlet, AsideProvider, useAsideRegion } from './page-aside'
|
|
28
33
|
import { OverflowMenu, globalActionAsBarAction, globalActionMobile } from '../controls/actions'
|
|
29
34
|
import type { GlobalAction } from '../controls/actions'
|
|
30
35
|
import type { AccountMenuItem, BasaltAccountProps } from './account-types'
|
|
@@ -38,13 +43,16 @@ import type {
|
|
|
38
43
|
} from '../nav/types'
|
|
39
44
|
import { CtlSlot, useBasaltSpacing } from '../theme'
|
|
40
45
|
import { createPersistedState } from '../state'
|
|
46
|
+
import brandClasses from './app-brand.module.css'
|
|
41
47
|
import headerClasses from './app-header.module.css'
|
|
42
|
-
import
|
|
48
|
+
import mainClasses from './app-main.module.css'
|
|
49
|
+
import asideClasses from './page-aside.module.css'
|
|
43
50
|
|
|
44
51
|
export { AppSidebar, type AppSidebarProps } from './app-sidebar'
|
|
45
|
-
export { NavCountBadge } from './nav-count-badge'
|
|
52
|
+
export { NavCountBadge, type NavCountBadgeProps } from './nav-count-badge'
|
|
46
53
|
export {
|
|
47
54
|
SidebarSearch,
|
|
55
|
+
type SidebarSearchProps,
|
|
48
56
|
type SidebarSearchConfig,
|
|
49
57
|
type SidebarSearchActions,
|
|
50
58
|
} from './sidebar-search'
|
|
@@ -67,8 +75,9 @@ export {
|
|
|
67
75
|
MOBILE_MENU_MAX_DEFAULT,
|
|
68
76
|
MOBILE_MORE_KEY,
|
|
69
77
|
} from './mobile-nav-model'
|
|
70
|
-
export { AppBreadcrumbs } from './app-breadcrumbs'
|
|
71
|
-
export { PageBar, type PageBarProps } from './page-bar'
|
|
78
|
+
export { AppBreadcrumbs, type AppBreadcrumbsProps } from './app-breadcrumbs'
|
|
79
|
+
export { PageBar, type PageBarProps, type PageBarSlot } from './page-bar'
|
|
80
|
+
export { PageAside, type PageAsideProps, type PageAsideSlot } from './page-aside'
|
|
72
81
|
|
|
73
82
|
/**
|
|
74
83
|
* The shared nav vocabulary lives in `src/nav/types.ts` so the headless router bridge can `import
|
|
@@ -115,7 +124,7 @@ export type SettingsMenuItem = {
|
|
|
115
124
|
onClick?: (e: MouseEvent) => void
|
|
116
125
|
}
|
|
117
126
|
|
|
118
|
-
export type BasaltShellProps = {
|
|
127
|
+
export type BasaltShellProps = BasaltProps & {
|
|
119
128
|
/**
|
|
120
129
|
* Brand identity for the sidebar header. Supplying `menu` turns the brand row into a `Name ▾`
|
|
121
130
|
* workspace switcher — the rows are `AccountMenuItem`s, the shape the account menu already uses.
|
|
@@ -296,7 +305,28 @@ function collapseStore(key: string): () => readonly [boolean, (next: boolean) =>
|
|
|
296
305
|
return store
|
|
297
306
|
}
|
|
298
307
|
|
|
299
|
-
|
|
308
|
+
// The shared inset for the shell padding and the header's inline padding, so the breadcrumb's
|
|
309
|
+
// left edge and the global actions' right edge land on the card column's edges.
|
|
310
|
+
const SHELL_INSET = 'sm' as const
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* The shell's two page-level regions are providers, and both wrap the frame rather than living
|
|
314
|
+
* inside it: `PageBarProvider` owns the header portal and the single-kebab claim, `AsideProvider`
|
|
315
|
+
* owns the aside portal, the region CLAIM and the claiming page's fold state — which `ShellFrame`
|
|
316
|
+
* has to READ to size `AppShell.Aside`, so it cannot be the component that provides it.
|
|
317
|
+
*/
|
|
318
|
+
export function BasaltShell(props: BasaltShellProps) {
|
|
319
|
+
assertRequiredProps('BasaltShell', props, ['brand', 'sections'])
|
|
320
|
+
return (
|
|
321
|
+
<PageBarProvider globalActions={props.globalActions ?? []}>
|
|
322
|
+
<AsideProvider>
|
|
323
|
+
<ShellFrame {...props} />
|
|
324
|
+
</AsideProvider>
|
|
325
|
+
</PageBarProvider>
|
|
326
|
+
)
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
function ShellFrame({
|
|
300
330
|
brand,
|
|
301
331
|
sections,
|
|
302
332
|
mobileNav,
|
|
@@ -310,12 +340,15 @@ export function BasaltShell({
|
|
|
310
340
|
account,
|
|
311
341
|
search,
|
|
312
342
|
children,
|
|
343
|
+
className,
|
|
344
|
+
style,
|
|
313
345
|
}: BasaltShellProps) {
|
|
314
346
|
// The active density level's resolved spacing — the AppShell dimensions below must track it
|
|
315
347
|
// (see `SPACE_STEP_BASE`'s "shell/index.tsx" group doc in `tokens/palette.ts`): their contents
|
|
316
348
|
// (controls, the search trigger/avatar, nav labels) already track density, so a fixed literal
|
|
317
349
|
// container squeezes progressively worse as density rises.
|
|
318
350
|
const { step } = useBasaltSpacing()
|
|
351
|
+
const aside = useAsideRegion()
|
|
319
352
|
const [storedCollapsed, setStoredCollapsed] = collapseStore(storageKey)()
|
|
320
353
|
// Controlled/uncontrolled seam (item 19): an explicit `collapsed` prop overrides the internal
|
|
321
354
|
// localStorage-persisted state entirely — the consumer becomes the source of truth.
|
|
@@ -344,68 +377,126 @@ export function BasaltShell({
|
|
|
344
377
|
)
|
|
345
378
|
|
|
346
379
|
return (
|
|
347
|
-
<
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
380
|
+
<AppShell
|
|
381
|
+
h="100dvh"
|
|
382
|
+
// Mantine's DEFAULT layout, not `alt`: the header spans the full viewport width on top and
|
|
383
|
+
// the navbar/aside start underneath it at `top: var(--app-shell-header-offset)`. `alt` did
|
|
384
|
+
// the opposite — a full-height navbar with the header inset beside it — which put the top
|
|
385
|
+
// bar to the RIGHT of the sidebar instead of above it.
|
|
386
|
+
header={{
|
|
387
|
+
// ONE height at every width (law C14): nothing reserves a second mobile row any more.
|
|
388
|
+
height: step.appShellHeaderHeight,
|
|
389
|
+
}}
|
|
390
|
+
navbar={{
|
|
391
|
+
width: {
|
|
392
|
+
base: step.appShellNavbarWidth,
|
|
393
|
+
sm: collapsed ? step.appShellNavbarRailWidth : step.appShellNavbarWidth,
|
|
394
|
+
},
|
|
395
|
+
breakpoint: 'sm',
|
|
396
|
+
// No mobile sidebar drawer, ever — the bottom bar is the entire mobile nav.
|
|
397
|
+
collapsed: { mobile: true },
|
|
398
|
+
}}
|
|
399
|
+
// The aside region (`docs/ASIDE-SPEC.md` §0). It is DECLARED here on every route and costs
|
|
400
|
+
// nothing until a page mounts a `PageAside` to claim it: unclaimed it is zero-wide and
|
|
401
|
+
// `collapsed.desktop`, so `--app-shell-aside-offset` stays 0 and the main column is
|
|
402
|
+
// full-width (law C14 — an empty home renders nothing). There is no `BasaltShellProps`
|
|
403
|
+
// prop for it on purpose; the ROUTE decides, the same way it decides its page bar.
|
|
404
|
+
aside={{
|
|
405
|
+
width: aside.claimed
|
|
406
|
+
? aside.folded
|
|
407
|
+
? step.appShellAsideRailWidth
|
|
408
|
+
: step.appShellAsideWidth
|
|
409
|
+
: 0,
|
|
410
|
+
breakpoint: 'sm',
|
|
411
|
+
// Below `sm` there is no region at all — `PageAside` renders its content in the page
|
|
412
|
+
// flow instead, one node, no responsive twin (law C9).
|
|
413
|
+
collapsed: { desktop: !aside.claimed, mobile: true },
|
|
414
|
+
}}
|
|
415
|
+
// A plain number, NOT a `calc(... + env(safe-area-inset-bottom))` string: Mantine's own
|
|
416
|
+
// `.footer` rule already adds the inset to both the height and the padding (§2.7).
|
|
417
|
+
footer={{ height: { base: step.mobileNavBarHeight, sm: 0 } }}
|
|
418
|
+
padding={SHELL_INSET}
|
|
419
|
+
// `mainClasses.shell` is not decoration — see its rule for why the root has to establish a
|
|
420
|
+
// block formatting context now that Main is offset with margins.
|
|
421
|
+
className={cx(mainClasses.shell, className)}
|
|
422
|
+
{...(style !== undefined && { style })}
|
|
423
|
+
>
|
|
424
|
+
{/* Region seams (docs/DESIGN-SPEC.md §5, §8 #12): Mantine's `[data-with-border]` painted in
|
|
425
|
+
* `--vx-divider` by the theme's `AppShell.extend({ vars })`. No shell module draws a region
|
|
426
|
+
* edge; never opt a section back out of its border here. */}
|
|
427
|
+
<AppShell.Header px={SHELL_INSET}>
|
|
428
|
+
<div className={headerClasses.bar}>
|
|
429
|
+
{/* The header's LEADING ZONE — exactly `--app-shell-navbar-offset` wide, so its trailing
|
|
430
|
+
* edge lands on the sidebar|main seam and the breadcrumb after it starts on Main's own
|
|
431
|
+
* content edge. The brand lives here rather than in the sidebar because with a full-width
|
|
432
|
+
* header a sidebar brand row painted as a SECOND 48px band under the header seam; see
|
|
433
|
+
* `app-brand.tsx`. `data-collapsed` is the rail's one signal — the zone narrows with the
|
|
434
|
+
* navbar and shows the toggle alone, exactly as the sidebar's own row did. */}
|
|
435
|
+
<div className={brandClasses.zone} data-collapsed={collapsed || undefined}>
|
|
436
|
+
<AppBrand brand={brand} collapsed={collapsed} onToggleCollapse={toggleCollapse} />
|
|
376
437
|
</div>
|
|
377
|
-
|
|
438
|
+
<div className={headerClasses.lead}>
|
|
439
|
+
<AppBreadcrumbs {...activeCrumb} />
|
|
440
|
+
</div>
|
|
441
|
+
<PageBarOutlet className={headerClasses.pageBar} />
|
|
442
|
+
<HeaderGlobalActions actions={globalActions ?? []} />
|
|
443
|
+
</div>
|
|
444
|
+
</AppShell.Header>
|
|
378
445
|
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
446
|
+
<AppShell.Navbar p={0}>
|
|
447
|
+
<AppSidebar
|
|
448
|
+
brand={brand}
|
|
449
|
+
sections={sections}
|
|
450
|
+
collapsed={collapsed}
|
|
451
|
+
onToggleCollapse={toggleCollapse}
|
|
452
|
+
{...(sidebarBlocks !== undefined && { blocks: sidebarBlocks })}
|
|
453
|
+
{...(settingsMenuItems !== undefined && { settingsMenuItems })}
|
|
454
|
+
{...(settingsMenu !== undefined && { settingsMenu })}
|
|
455
|
+
{...(account !== undefined && { account })}
|
|
456
|
+
{...(search !== undefined && { search })}
|
|
457
|
+
/>
|
|
458
|
+
</AppShell.Navbar>
|
|
392
459
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
460
|
+
{/* The PAGE-BAR BAND — a shell-owned outlet between the header and the scrollport that
|
|
461
|
+
* `PageBar` row 2 portals into, the same mechanism row 1 uses one region up. It is written
|
|
462
|
+
* BEFORE Main because the two are the AppShell root's only in-flow children (every other
|
|
463
|
+
* region is `position: fixed`), so DOM order is column order: band, then whatever height is
|
|
464
|
+
* left. Empty, it is a zero-height, seam-less box (law C14). */}
|
|
465
|
+
<PageBarBandOutlet className={mainClasses.band} />
|
|
397
466
|
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
467
|
+
{/* MAIN IS THE SCROLLPORT (`app-main.module.css`), not the document: the scrollbar belongs
|
|
468
|
+
* on the content's own right edge, inside the aside, and every sticky offset in the package
|
|
469
|
+
* resolves against this box rather than the window. `data-basalt-scrollport` is the public
|
|
470
|
+
* handle — `scrollParentOf` (`../common`) and `MobileNav`'s scroll-to-top both resolve it —
|
|
471
|
+
* and `data-scroll-restoration-id` is the attribute TanStack Router's scroll restoration
|
|
472
|
+
* reads (`@tanstack/router-core`'s `scrollRestorationIdAttribute`), so a router-driven app
|
|
473
|
+
* restores THIS element's scrollTop instead of the window's, which no longer moves. */}
|
|
474
|
+
<AppShell.Main
|
|
475
|
+
className={mainClasses.main}
|
|
476
|
+
data-basalt-scrollport
|
|
477
|
+
data-scroll-restoration-id="basalt-main"
|
|
478
|
+
>
|
|
479
|
+
{children}
|
|
480
|
+
</AppShell.Main>
|
|
481
|
+
|
|
482
|
+
{/* The outlet is bare; the region's leading seam is the AppShell's own. An unclaimed region
|
|
483
|
+
* is zero-wide but NOT display-none — Mantine's collapsed aside keeps its border-box, so a
|
|
484
|
+
* seam would still paint as a 1px ghost at the viewport's right edge (measured on
|
|
485
|
+
* `/dashboard`). The border follows the claim, not the section (C14). */}
|
|
486
|
+
<AppShell.Aside p={0} withBorder={aside.claimed}>
|
|
487
|
+
<AsideOutlet className={asideClasses.outlet} />
|
|
488
|
+
</AppShell.Aside>
|
|
489
|
+
|
|
490
|
+
<AppShell.Footer hiddenFrom="sm" p={0}>
|
|
491
|
+
<MobileNav
|
|
492
|
+
model={model}
|
|
493
|
+
config={mobileNav}
|
|
494
|
+
{...(account !== undefined && { account })}
|
|
495
|
+
{...(settingsMenuItems !== undefined && { settingsMenuItems })}
|
|
496
|
+
{...(sidebarBlocks !== undefined && { blocks: sidebarBlocks })}
|
|
497
|
+
/>
|
|
498
|
+
</AppShell.Footer>
|
|
499
|
+
</AppShell>
|
|
409
500
|
)
|
|
410
501
|
}
|
|
411
502
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal — `useLayoutEffect` in the browser, `useEffect` on the server.
|
|
3
|
+
*
|
|
4
|
+
* The standard isomorphic pattern, so an SSR render never trips React's "useLayoutEffect does
|
|
5
|
+
* nothing on the server" warning. The branch reads a global that cannot change between renders, so
|
|
6
|
+
* the hook identity is stable across every render of every caller.
|
|
7
|
+
*
|
|
8
|
+
* One module rather than one `const` per file: `page-bar.tsx` and `page-aside.tsx` declared the
|
|
9
|
+
* same line with the same doc, and the second copy's doc already said "see `page-bar.tsx`'s copy".
|
|
10
|
+
* Not exported from any barrel — this is a shell-internal utility, not a published hook.
|
|
11
|
+
*/
|
|
12
|
+
import { useEffect, useLayoutEffect } from 'react'
|
|
13
|
+
|
|
14
|
+
export const useIsomorphicLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect
|
|
@@ -136,9 +136,10 @@ function collectKeys(items: readonly SidebarItem[], out: Set<string>): void {
|
|
|
136
136
|
|
|
137
137
|
/**
|
|
138
138
|
* Depth-first flatten, parent before children — the order every candidate list and the zero-config
|
|
139
|
-
* fallback read. Nesting is NOT lost: this is the lookup/selection view
|
|
140
|
-
*
|
|
141
|
-
*
|
|
139
|
+
* fallback read. Nesting is NOT lost: this is the lookup/selection view only (deciding which
|
|
140
|
+
* destinations are eligible for a bar slot), while the overflow and group rendering below keep the
|
|
141
|
+
* tree — `pruneOverflowTree` even preserves it across a covered parent, so a nested destination
|
|
142
|
+
* renders indented under its parent (or its parent's group anchor) rather than as a flat sibling.
|
|
142
143
|
*/
|
|
143
144
|
function flattenItems(items: readonly SidebarItem[], out: SidebarItem[]): void {
|
|
144
145
|
for (const item of items) {
|
|
@@ -147,6 +148,18 @@ function flattenItems(items: readonly SidebarItem[], out: SidebarItem[]): void {
|
|
|
147
148
|
}
|
|
148
149
|
}
|
|
149
150
|
|
|
151
|
+
/**
|
|
152
|
+
* Attaches `children` to a shallow copy of `item` — or omits `children` from it entirely when
|
|
153
|
+
* there are none, rather than leaving a stale empty array — and pushes the result onto `out`.
|
|
154
|
+
* Shared tail of `pruneTree`/`pruneOverflowTree`'s keep branches.
|
|
155
|
+
*/
|
|
156
|
+
function pushWithChildren(out: SidebarItem[], item: SidebarItem, children: SidebarItem[]): void {
|
|
157
|
+
const next: SidebarItem = { ...item }
|
|
158
|
+
if (children.length > 0) next.children = children
|
|
159
|
+
else delete next.children
|
|
160
|
+
out.push(next)
|
|
161
|
+
}
|
|
162
|
+
|
|
150
163
|
/**
|
|
151
164
|
* Drops every destination `keep` rejects, HOISTING a rejected parent's surviving children into its
|
|
152
165
|
* place rather than discarding the subtree — placement is normalized per destination (rule 1), so a
|
|
@@ -163,10 +176,51 @@ function pruneTree(
|
|
|
163
176
|
out.push(...children)
|
|
164
177
|
continue
|
|
165
178
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
179
|
+
pushWithChildren(out, item, children)
|
|
180
|
+
}
|
|
181
|
+
return out
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* `pruneTree`'s overflow-only sibling — the More surface has TWO independent reasons a destination
|
|
186
|
+
* drops out, and they no longer resolve the same way. `hidden` (a consumer opted the destination
|
|
187
|
+
* fully out via rule 1) still hoists exactly like `pruneTree`: nothing should hint a hidden node
|
|
188
|
+
* exists, so its visible children rise to fill its place. `covered` (the destination already has
|
|
189
|
+
* its OWN slot elsewhere in the bar — a tab, or another section's slot) used to hoist identically,
|
|
190
|
+
* which is the bug this function fixes: hoisting discards the tree edge between a covered PARENT
|
|
191
|
+
* and its still-overflowing children, so `Sessions`/`Traffic`/`Revenue` rendered as flat siblings
|
|
192
|
+
* with no indication they belong under `Dashboard` at all — depth information the renderer has no
|
|
193
|
+
* way to reconstruct once it is gone. A covered parent with surviving children is kept instead, as
|
|
194
|
+
* the GROUP ANCHOR those children nest under (same row shape and same destination it already is on
|
|
195
|
+
* the bar — tapping it in the sheet does exactly what tapping its tab does); a covered LEAF (no
|
|
196
|
+
* surviving children) still drops entirely, since rule 7's original reasoning — a destination with
|
|
197
|
+
* nowhere new to add is not worth a second, redundant row — still holds for that case unchanged.
|
|
198
|
+
*/
|
|
199
|
+
function pruneOverflowTree(
|
|
200
|
+
items: readonly SidebarItem[],
|
|
201
|
+
isHidden: (item: SidebarItem) => boolean,
|
|
202
|
+
isCovered: (item: SidebarItem) => boolean,
|
|
203
|
+
): SidebarItem[] {
|
|
204
|
+
const out: SidebarItem[] = []
|
|
205
|
+
for (const item of items) {
|
|
206
|
+
const children = pruneOverflowTree(item.children ?? [], isHidden, isCovered)
|
|
207
|
+
if (isHidden(item)) {
|
|
208
|
+
out.push(...children)
|
|
209
|
+
continue
|
|
210
|
+
}
|
|
211
|
+
if (isCovered(item)) {
|
|
212
|
+
// A covered leaf contributes nothing new — drop it, exactly like `pruneTree` would.
|
|
213
|
+
if (children.length === 0) continue
|
|
214
|
+
// Rule 12 (`hasActiveDestination`'s doc): this destination is covered, so its REAL slot is
|
|
215
|
+
// what lights when it is the active route — its own tab, or another section's slot. The
|
|
216
|
+
// anchor copied here is not that slot, so its own `active` is forced false; only a
|
|
217
|
+
// surviving CHILD's activeness may roll up and light the surface this anchor sits inside.
|
|
218
|
+
// Without this a route at the covered parent lit BOTH its own tab and the anchor's
|
|
219
|
+
// enclosing More/section surface — two `aria-current="page"` tabs for one location.
|
|
220
|
+
out.push({ ...item, active: false, children })
|
|
221
|
+
continue
|
|
222
|
+
}
|
|
223
|
+
pushWithChildren(out, item, children)
|
|
170
224
|
}
|
|
171
225
|
return out
|
|
172
226
|
}
|
|
@@ -335,7 +389,8 @@ function buildCandidates(
|
|
|
335
389
|
return fallback
|
|
336
390
|
}
|
|
337
391
|
|
|
338
|
-
/** Rule 7 — the leftovers, grouped by source section, tree intact
|
|
392
|
+
/** Rule 7 — the leftovers, grouped by source section, tree intact — including a covered
|
|
393
|
+
* parent kept on as its surviving children's group anchor (`pruneOverflowTree`'s doc). */
|
|
339
394
|
function buildOverflow(
|
|
340
395
|
sections: readonly SidebarSection[],
|
|
341
396
|
covered: Set<string>,
|
|
@@ -344,9 +399,10 @@ function buildOverflow(
|
|
|
344
399
|
for (const section of sections) {
|
|
345
400
|
const hidden = isSectionHidden(section)
|
|
346
401
|
if (hidden) continue
|
|
347
|
-
const items =
|
|
402
|
+
const items = pruneOverflowTree(
|
|
348
403
|
section.items,
|
|
349
|
-
(item) => placementOf(item, hidden)
|
|
404
|
+
(item) => placementOf(item, hidden) === 'hidden',
|
|
405
|
+
(item) => covered.has(item.key),
|
|
350
406
|
)
|
|
351
407
|
if (items.length === 0) continue
|
|
352
408
|
groups.push({ key: section.label, label: section.label, items })
|
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { Badge } from '@mantine/core'
|
|
8
8
|
import { VX } from '../tokens'
|
|
9
|
+
import type { BasaltProps } from '../common/props'
|
|
10
|
+
|
|
11
|
+
export type NavCountBadgeProps = BasaltProps & { count: number }
|
|
9
12
|
|
|
10
13
|
/**
|
|
11
14
|
* Sidebar nav count badge (docs/DESIGN-SPEC.md §5): mono micro (11px), ink-8% bg, radius 5, height 16,
|
|
@@ -14,11 +17,13 @@ import { VX } from '../tokens'
|
|
|
14
17
|
* combinations land on the ink-tint idiom. Returns `null` for a zero/empty count so the badge slot
|
|
15
18
|
* stays clean ("ink earns its color", DESIGN.md).
|
|
16
19
|
*/
|
|
17
|
-
export function NavCountBadge({ count
|
|
20
|
+
export function NavCountBadge({ count, className, style }: NavCountBadgeProps) {
|
|
18
21
|
if (!count) return null
|
|
19
22
|
return (
|
|
20
23
|
<Badge
|
|
21
24
|
size="sm"
|
|
25
|
+
{...(className !== undefined && { className })}
|
|
26
|
+
{...(style !== undefined && { style })}
|
|
22
27
|
styles={{
|
|
23
28
|
root: {
|
|
24
29
|
backgroundColor: 'color-mix(in srgb, var(--vx-ink) 8%, transparent)',
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* `PageAside` chrome (`docs/ASIDE-SPEC.md` §0, wave 1).
|
|
3
|
+
*
|
|
4
|
+
* Two forms, one class set, told apart by `data-basalt-page-aside`: `"shell"` is the portalled
|
|
5
|
+
* panel that fills `AppShell.Aside` and owns the region's paint, `"standalone"` is the in-flow node
|
|
6
|
+
* a phone (or a shell-less app) renders where the page wrote it — plain flow content, no surface of
|
|
7
|
+
* its own, exactly like the block that used to live in the page's second column.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/* The `AppShell.Aside` inner node the panel portals into — a bare box, so an UNCLAIMED region
|
|
11
|
+
* paints nothing at all (law C14). Every pixel of chrome belongs to `.panel` below. */
|
|
12
|
+
.outlet {
|
|
13
|
+
display: flex;
|
|
14
|
+
height: 100%;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.panel {
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-direction: column;
|
|
20
|
+
min-width: 0;
|
|
21
|
+
gap: var(--vx-space-stack-md, 0.75rem);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* The portalled form. Paints only the page background (the same surface the sidebar and the sticky
|
|
26
|
+
* page bar sit on — neither declares one, both inherit the body). The leading edge is the
|
|
27
|
+
* `AppShell.Aside` region seam (docs/DESIGN-SPEC.md §5) — same token, same pixel, now produced by
|
|
28
|
+
* the same rule as the other three region edges, so two 1px lines can never sit side by side.
|
|
29
|
+
*/
|
|
30
|
+
.panel[data-basalt-page-aside='shell'] {
|
|
31
|
+
flex: 1;
|
|
32
|
+
height: 100%;
|
|
33
|
+
gap: 0;
|
|
34
|
+
background-color: var(--vx-surface-bg);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/*
|
|
38
|
+
* Header row — the title (`.title` below, shared by both forms), plus the fold toggle in the
|
|
39
|
+
* portalled form only, at `sectionHeaderHeight` (standalone) / the header band (shell, below).
|
|
40
|
+
* Same horizontal inset every sidebar region aligns to.
|
|
41
|
+
*/
|
|
42
|
+
.header {
|
|
43
|
+
display: flex;
|
|
44
|
+
flex: none;
|
|
45
|
+
align-items: center;
|
|
46
|
+
justify-content: space-between;
|
|
47
|
+
gap: var(--vx-space-control-gap);
|
|
48
|
+
min-height: var(--vx-space-section-header-height, 2.25rem);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* The portalled form's band matches the SHELL-OWNED page-bar band exactly, whenever one is
|
|
52
|
+
* present (`--basalt-page-bar-h`, `docs/DESIGN-SPEC.md` §5) — not a fixed 48px. `PageBar`
|
|
53
|
+
* publishes that var on `documentElement` from a ResizeObserver on the band's own content
|
|
54
|
+
* (`shell/page-bar.tsx`), so it inherits down to every descendant, this header included, with no
|
|
55
|
+
* extra wiring. Two seams, one line: MEASURED on `/cbbi` 1440x900, the band's outer edge (its own
|
|
56
|
+
* `border-bottom`, `app-main.module.css` `.band:not(:empty)`) used to sit at y87 while this header
|
|
57
|
+
* (unconditionally `var(--app-shell-header-height)`, 48px) sat at y96 — 9px apart.
|
|
58
|
+
*
|
|
59
|
+
* The `+ 1px` is not decorative. `--basalt-page-bar-h` measures the band's CONTENT box only (the
|
|
60
|
+
* portalled row-2 wrapper `page-bar.tsx` attaches its ResizeObserver to); the band's own
|
|
61
|
+
* `border-bottom` is drawn OUTSIDE that box, on a plain `height: auto` element, so it ADDS a pixel
|
|
62
|
+
* the published var never counted. This header is the opposite shape — an explicit `min-height`
|
|
63
|
+
* under the page's global `box-sizing: border-box` reset — so its OWN `border-bottom` is absorbed
|
|
64
|
+
* INSIDE whatever height is declared instead of adding on top. Feeding the raw var straight in
|
|
65
|
+
* therefore undershoots by exactly the band's border: `calc(38px + 1px)` = 39px, matching the
|
|
66
|
+
* band's true painted height, while the no-band fallback nets out unchanged (`calc((48px - 1px) +
|
|
67
|
+
* 1px)` = 48px) because the same `+ 1px` also wraps that branch. Without a `PageBar` there is no
|
|
68
|
+
* band seam to align to, so the header keeps closing the ordinary 48px top belt
|
|
69
|
+
* (`docs/DESIGN-SPEC.md` §5) the header and sidebar-brand bands also close.
|
|
70
|
+
*/
|
|
71
|
+
.panel[data-basalt-page-aside='shell'] .header {
|
|
72
|
+
padding-inline: var(--vx-space-row-inset-x);
|
|
73
|
+
min-height: calc(
|
|
74
|
+
var(
|
|
75
|
+
--basalt-page-bar-h,
|
|
76
|
+
calc(var(--app-shell-header-height, var(--vx-space-section-header-height, 2.25rem)) - 1px)
|
|
77
|
+
) +
|
|
78
|
+
1px
|
|
79
|
+
);
|
|
80
|
+
border-bottom: 1px solid var(--vx-divider);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* A real title (docs/DESIGN-SPEC.md §5): mirrors `widget-header.module.css` `.heading` and the
|
|
84
|
+
* breadcrumb's current-page treatment — the three 48px bands each carry one 550-weight head-font
|
|
85
|
+
* name. */
|
|
86
|
+
.title {
|
|
87
|
+
font-family: var(--basalt-font-head);
|
|
88
|
+
font-size: var(--vx-text-md);
|
|
89
|
+
font-weight: 550;
|
|
90
|
+
font-stretch: 88%;
|
|
91
|
+
color: var(--vx-ink);
|
|
92
|
+
overflow: hidden;
|
|
93
|
+
text-overflow: ellipsis;
|
|
94
|
+
white-space: nowrap;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* The body scrolls, the header does not — `min-height: 0` is what lets a flex child shrink below
|
|
98
|
+
* its content and actually become a scroll box. In flow (standalone) it is plain content: no
|
|
99
|
+
* scroll region, no inset, so it sits in the page's own rhythm. */
|
|
100
|
+
.body {
|
|
101
|
+
display: flex;
|
|
102
|
+
flex-direction: column;
|
|
103
|
+
gap: var(--vx-space-stack-md, 0.75rem);
|
|
104
|
+
min-width: 0;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.panel[data-basalt-page-aside='shell'] .body {
|
|
108
|
+
flex: 1;
|
|
109
|
+
min-height: 0;
|
|
110
|
+
overflow-y: auto;
|
|
111
|
+
padding-inline: var(--vx-space-row-inset-x);
|
|
112
|
+
padding-block: var(--vx-space-stack-md, 0.75rem);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/*
|
|
116
|
+
* FLUSH chrome (`docs/ASIDE-SPEC.md` §3, wave 2). An aside's groups separate with a hairline, not
|
|
117
|
+
* with cards — Lightroom, not a dashboard: at ~300px a stack of bordered, inset panels spends most
|
|
118
|
+
* of the column on its own edges, and the reader's job here is comparing rows across groups rather
|
|
119
|
+
* than reading one card at a time.
|
|
120
|
+
*
|
|
121
|
+
* It is drawn HERE and not in `Section`, on the `.body`'s own children, for two reasons. The
|
|
122
|
+
* component does not know where it is mounted (there is no aside context and no prop that would
|
|
123
|
+
* tell it), and a body child is not necessarily a `Section` at all — a bare `PanelRow`, a chart, a
|
|
124
|
+
* paragraph all take the same rhythm. `> * + *`, so the first child never draws a rule under the
|
|
125
|
+
* header that already bounds it.
|
|
126
|
+
*/
|
|
127
|
+
.body > * + * {
|
|
128
|
+
border-top: 1px solid var(--vx-divider);
|
|
129
|
+
padding-top: var(--vx-space-stack-md, 0.75rem);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* The folded rail: one button, top-aligned, centred in the rail's own width. */
|
|
133
|
+
.rail {
|
|
134
|
+
display: flex;
|
|
135
|
+
flex: 1;
|
|
136
|
+
justify-content: center;
|
|
137
|
+
align-items: flex-start;
|
|
138
|
+
padding-top: var(--vx-space-stack-xs, 0.25rem);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/*
|
|
142
|
+
* The fold toggle — a plain control sized to the `ctl` tier by hand, verbatim from `Section`'s
|
|
143
|
+
* chevron (`section/section.module.css`), including the `calc(<rem> * var(--mantine-scale))`
|
|
144
|
+
* reconstruction that keeps it tracking a scaled Button beside it. No `< sm` hit-area overlay
|
|
145
|
+
* (unlike that chevron): the toggle exists only in the portalled form, which is `sm` and up.
|
|
146
|
+
*/
|
|
147
|
+
/* Deliberately NOT shared with `section/section.module.css`'s `.chevron`, which it echoes: the two
|
|
148
|
+
* live in different CSS modules and this repo keeps one module per component, so sharing would need
|
|
149
|
+
* a third module + `composes` across that boundary. They also differ where it counts — `.fold` is
|
|
150
|
+
* `--vx-faint` and draws no rotation or C15 touch overlay, because the aside's fold is a desktop-
|
|
151
|
+
* only control. */
|
|
152
|
+
.fold {
|
|
153
|
+
position: relative;
|
|
154
|
+
display: inline-flex;
|
|
155
|
+
flex: none;
|
|
156
|
+
align-items: center;
|
|
157
|
+
justify-content: center;
|
|
158
|
+
width: calc(var(--vx-space-control-height-ctl) * var(--mantine-scale, 1));
|
|
159
|
+
height: calc(var(--vx-space-control-height-ctl) * var(--mantine-scale, 1));
|
|
160
|
+
appearance: none;
|
|
161
|
+
margin: 0;
|
|
162
|
+
padding: 0;
|
|
163
|
+
border: none;
|
|
164
|
+
background: none;
|
|
165
|
+
border-radius: var(--vx-radius-ctrl);
|
|
166
|
+
color: var(--vx-faint);
|
|
167
|
+
cursor: pointer;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.fold:hover,
|
|
171
|
+
.fold:focus-visible {
|
|
172
|
+
color: var(--vx-ink);
|
|
173
|
+
background: var(--vx-surface-subtle);
|
|
174
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed CSS-module declaration (the S4 CSS-modules path). Named string props — not an index
|
|
3
|
+
* signature — so dot access stays verbatim under the package's strict flags.
|
|
4
|
+
*/
|
|
5
|
+
declare const classes: {
|
|
6
|
+
readonly outlet: string
|
|
7
|
+
readonly panel: string
|
|
8
|
+
readonly header: string
|
|
9
|
+
readonly title: string
|
|
10
|
+
readonly body: string
|
|
11
|
+
readonly rail: string
|
|
12
|
+
readonly fold: string
|
|
13
|
+
}
|
|
14
|
+
export default classes
|