basalt-ui 1.26.0 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +23 -23
- package/CHANGELOG.md +67 -0
- package/MIGRATING.md +896 -37
- package/README.md +33 -3
- package/agent/rules/basalt-batteries.md +25 -10
- package/agent/rules/basalt-controls.md +73 -43
- package/agent/rules/basalt-mantine.md +17 -6
- package/agent/rules/basalt-state.md +5 -0
- package/agent/rules/basalt-tokens.md +1 -1
- package/configs/oxlint-plugin.js +1286 -73
- package/configs/oxlint-plugin.test.ts +1338 -29
- package/configs/oxlint.json +12 -5
- package/dist/agent/coalesce.d.ts.map +1 -1
- package/dist/agent/coalesce.js +2 -1
- package/dist/agent/merge.d.ts.map +1 -1
- package/dist/agent/merge.js +2 -1
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/part-list.js +2 -0
- package/dist/agent/stick-to-bottom.d.ts +3 -6
- package/dist/agent/stick-to-bottom.d.ts.map +1 -1
- package/dist/agent/stick-to-bottom.js +6 -3
- package/dist/agent-chat/composer.d.ts +6 -2
- package/dist/agent-chat/composer.d.ts.map +1 -1
- package/dist/agent-chat/composer.js +49 -33
- package/dist/agent-chat/relative-time.d.ts +0 -9
- package/dist/agent-chat/relative-time.d.ts.map +1 -1
- package/dist/agent-chat/relative-time.js +2 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +3 -2
- package/dist/agent-chat/thread-detail-panel.d.ts.map +1 -1
- package/dist/agent-chat/thread-detail-panel.js +8 -5
- package/dist/agent-chat/thread-feed-row.d.ts +2 -1
- package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed-row.js +92 -92
- package/dist/agent-chat/thread-feed.d.ts +3 -2
- package/dist/agent-chat/thread-feed.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed.js +8 -3
- package/dist/agent-chat/thread-message.d.ts +4 -3
- package/dist/agent-chat/thread-message.d.ts.map +1 -1
- package/dist/agent-chat/thread-message.js +70 -31
- package/dist/agent-chat/thread-outcome-card.d.ts +3 -2
- package/dist/agent-chat/thread-outcome-card.d.ts.map +1 -1
- package/dist/agent-chat/thread-outcome-card.js +9 -2
- package/dist/agent-chat/thread-workspace.d.ts +7 -2
- package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
- package/dist/agent-chat/thread-workspace.js +62 -29
- package/dist/agent-chat/tool-chip.d.ts +3 -2
- package/dist/agent-chat/tool-chip.d.ts.map +1 -1
- package/dist/agent-chat/tool-chip.js +7 -2
- package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
- package/dist/charts/hooks/useBandPlot.js +15 -8
- package/dist/charts/index.d.ts +8 -7
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +45 -5
- package/dist/charts/kinds/BandStrip.d.ts +10 -7
- package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
- package/dist/charts/kinds/BandStrip.js +12 -7
- package/dist/charts/kinds/Bars.d.ts +12 -6
- package/dist/charts/kinds/Bars.d.ts.map +1 -1
- package/dist/charts/kinds/Bars.js +37 -11
- package/dist/charts/kinds/Donut.d.ts +6 -5
- package/dist/charts/kinds/Donut.d.ts.map +1 -1
- package/dist/charts/kinds/Donut.js +19 -2
- package/dist/charts/kinds/DualPanel.d.ts +6 -5
- package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
- package/dist/charts/kinds/DualPanel.js +36 -8
- package/dist/charts/kinds/Heatmap.d.ts +10 -6
- package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
- package/dist/charts/kinds/Heatmap.js +58 -31
- package/dist/charts/kinds/MirroredBars.d.ts +6 -5
- package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
- package/dist/charts/kinds/MirroredBars.js +9 -2
- package/dist/charts/kinds/MultiLine.d.ts +11 -6
- package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
- package/dist/charts/kinds/MultiLine.js +24 -15
- package/dist/charts/kinds/StackedArea.d.ts +18 -8
- package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
- package/dist/charts/kinds/StackedArea.js +29 -4
- package/dist/charts/kinds/ZonedLine.d.ts +12 -8
- package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
- package/dist/charts/kinds/ZonedLine.js +33 -23
- package/dist/charts/layout/auto-margin.d.ts +65 -8
- package/dist/charts/layout/auto-margin.d.ts.map +1 -1
- package/dist/charts/layout/auto-margin.js +45 -10
- package/dist/charts/layout/log-ticks.d.ts +27 -0
- package/dist/charts/layout/log-ticks.d.ts.map +1 -0
- package/dist/charts/layout/log-ticks.js +42 -0
- package/dist/charts/primitives/Axes.d.ts +11 -2
- package/dist/charts/primitives/Axes.d.ts.map +1 -1
- package/dist/charts/primitives/Axes.js +15 -5
- package/dist/charts/primitives/CartesianChart.d.ts +45 -7
- package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
- package/dist/charts/primitives/CartesianChart.js +86 -28
- package/dist/charts/primitives/ChartCard.d.ts +27 -2
- package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
- package/dist/charts/primitives/ChartCard.js +37 -17
- package/dist/charts/primitives/ChartFrame.d.ts +30 -4
- package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
- package/dist/charts/primitives/ChartFrame.js +45 -15
- package/dist/charts/primitives/ChartLegend.d.ts +13 -2
- package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
- package/dist/charts/primitives/ChartLegend.js +33 -13
- package/dist/charts/primitives/ChartPending.d.ts +77 -4
- package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
- package/dist/charts/primitives/ChartPending.js +100 -6
- package/dist/charts/primitives/ChartTooltip.d.ts +7 -0
- package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
- package/dist/charts/primitives/ChartTooltip.js +18 -5
- package/dist/charts/primitives/Crosshair.d.ts +3 -0
- package/dist/charts/primitives/Crosshair.d.ts.map +1 -1
- package/dist/charts/primitives/Crosshair.js +3 -1
- package/dist/charts/primitives/chart-frame-layout.d.ts +95 -0
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -0
- package/dist/charts/primitives/chart-frame-layout.js +89 -0
- package/dist/charts/primitives/chart-tier.d.ts +16 -0
- package/dist/charts/primitives/chart-tier.d.ts.map +1 -0
- package/dist/charts/primitives/chart-tier.js +20 -0
- package/dist/charts/series.d.ts +55 -1
- package/dist/charts/series.d.ts.map +1 -1
- package/dist/charts/series.js +27 -1
- package/dist/charts/sparklines/BarSparkline.d.ts +3 -3
- package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/BarSparkline.js +9 -3
- package/dist/charts/sparklines/LineSparkline.d.ts +3 -3
- package/dist/charts/sparklines/LineSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/LineSparkline.js +15 -3
- package/dist/charts/sparklines/index.d.ts +2 -2
- package/dist/charts/sparklines/index.d.ts.map +1 -1
- package/dist/charts/utils/format.d.ts +92 -2
- package/dist/charts/utils/format.d.ts.map +1 -1
- package/dist/charts/utils/format.js +64 -1
- package/dist/charts/utils/ticks.d.ts +81 -2
- package/dist/charts/utils/ticks.d.ts.map +1 -1
- package/dist/charts/utils/ticks.js +54 -4
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/commands/ShortcutsHelp.d.ts +3 -2
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +8 -2
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +2 -2
- package/dist/commands/define-overlays.d.ts +102 -0
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +102 -2
- package/dist/commands/index.d.ts +10 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +3 -1
- package/dist/commands/overlays-mount.d.ts +13 -6
- package/dist/commands/overlays-mount.d.ts.map +1 -1
- package/dist/commands/overlays-mount.js +23 -14
- package/dist/common/errors.d.ts +34 -0
- package/dist/common/errors.d.ts.map +1 -0
- package/dist/common/errors.js +36 -0
- package/dist/common/index.d.ts +15 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +29 -0
- package/dist/common/props.d.ts +63 -0
- package/dist/common/props.d.ts.map +1 -0
- package/dist/common/props.js +6 -0
- package/dist/common/query-state-like.d.ts +43 -0
- package/dist/common/query-state-like.d.ts.map +1 -0
- package/dist/common/query-state-like.js +20 -0
- package/dist/common/refs.d.ts +29 -0
- package/dist/common/refs.d.ts.map +1 -0
- package/dist/common/refs.js +29 -0
- package/dist/common/scroll-parent.d.ts +23 -0
- package/dist/common/scroll-parent.d.ts.map +1 -0
- package/dist/common/scroll-parent.js +21 -0
- package/dist/common/validate.d.ts +38 -0
- package/dist/common/validate.d.ts.map +1 -0
- package/dist/common/validate.js +36 -0
- package/dist/connectivity/connectivity-indicator.d.ts +3 -1
- package/dist/connectivity/connectivity-indicator.d.ts.map +1 -1
- package/dist/connectivity/connectivity-indicator.js +3 -1
- package/dist/connectivity/connectivity-provider.d.ts.map +1 -1
- package/dist/connectivity/connectivity-provider.js +4 -1
- package/dist/connectivity/index.d.ts +1 -0
- package/dist/connectivity/index.d.ts.map +1 -1
- package/dist/connectivity/types.d.ts +2 -2
- package/dist/connectivity/types.d.ts.map +1 -1
- package/dist/connectivity/use-connectivity.d.ts.map +1 -1
- package/dist/content/article-layout.module.css +11 -4
- package/dist/content/callout.d.ts +8 -4
- package/dist/content/callout.d.ts.map +1 -1
- package/dist/content/callout.js +15 -8
- package/dist/content/guide.d.ts +5 -4
- package/dist/content/guide.d.ts.map +1 -1
- package/dist/content/guide.js +13 -4
- package/dist/content/heading-anchor.d.ts +24 -2
- package/dist/content/heading-anchor.d.ts.map +1 -1
- package/dist/content/heading-anchor.js +23 -9
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +2 -0
- package/dist/content/prose.module.css +9 -7
- package/dist/content/reading-progress.d.ts +10 -4
- package/dist/content/reading-progress.d.ts.map +1 -1
- package/dist/content/reading-progress.js +26 -10
- package/dist/content/slug.d.ts +4 -0
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/toc.d.ts +11 -0
- package/dist/content/toc.d.ts.map +1 -1
- package/dist/content/toc.js +23 -10
- package/dist/controls/actions.d.ts +49 -6
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/actions.js +39 -8
- package/dist/controls/compare-filter.d.ts +3 -2
- package/dist/controls/compare-filter.d.ts.map +1 -1
- package/dist/controls/compare-filter.js +17 -2
- package/dist/controls/control-group.d.ts +3 -3
- package/dist/controls/control-group.d.ts.map +1 -1
- package/dist/controls/control-group.js +9 -2
- package/dist/controls/controls.module.css +169 -186
- package/dist/controls/controls.module.css.d.ts +9 -11
- package/dist/controls/enum-filter.d.ts +13 -3
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/enum-filter.js +32 -15
- package/dist/controls/filter-context.d.ts +15 -6
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-pill.d.ts +3 -3
- package/dist/controls/filter-pill.d.ts.map +1 -1
- package/dist/controls/filter-pill.js +4 -1
- package/dist/controls/filter-set.d.ts +3 -2
- package/dist/controls/filter-set.d.ts.map +1 -1
- package/dist/controls/filter-set.js +66 -41
- package/dist/controls/filter-sheet.d.ts +20 -80
- package/dist/controls/filter-sheet.d.ts.map +1 -1
- package/dist/controls/filter-sheet.js +9 -95
- package/dist/controls/index.d.ts +3 -0
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +6 -0
- package/dist/controls/multi-select-filter.d.ts +18 -2
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/multi-select-filter.js +124 -22
- package/dist/controls/number-filter.d.ts +28 -0
- package/dist/controls/number-filter.d.ts.map +1 -0
- package/dist/controls/number-filter.js +172 -0
- package/dist/controls/panel-row.d.ts +132 -0
- package/dist/controls/panel-row.d.ts.map +1 -0
- package/dist/controls/panel-row.js +173 -0
- package/dist/controls/panel-row.module.css +86 -0
- package/dist/controls/panel-row.module.css.d.ts +13 -0
- package/dist/controls/range-filter.d.ts +20 -5
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/range-filter.js +75 -38
- package/dist/controls/search-filter.d.ts +3 -2
- package/dist/controls/search-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.js +26 -11
- package/dist/controls/select-filter.d.ts +2 -1
- package/dist/controls/select-filter.d.ts.map +1 -1
- package/dist/controls/select-filter.js +4 -0
- package/dist/controls/slider-control.d.ts +36 -0
- package/dist/controls/slider-control.d.ts.map +1 -0
- package/dist/controls/slider-control.js +64 -0
- package/dist/controls/sync-button.d.ts +3 -2
- package/dist/controls/sync-button.d.ts.map +1 -1
- package/dist/controls/sync-button.js +16 -3
- package/dist/controls/toggle-filter.d.ts +3 -2
- package/dist/controls/toggle-filter.d.ts.map +1 -1
- package/dist/controls/toggle-filter.js +29 -12
- package/dist/controls/view-tabs.d.ts +3 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls/view-tabs.js +43 -11
- package/dist/controls-dates/date-range-picker.d.ts +1 -1
- package/dist/controls-dates/date-range-picker.d.ts.map +1 -1
- package/dist/controls-dates/date-range-picker.js +6 -1
- package/dist/dashboard/delta-badge.d.ts +5 -1
- package/dist/dashboard/delta-badge.d.ts.map +1 -1
- package/dist/dashboard/empty-state.d.ts +10 -3
- package/dist/dashboard/empty-state.d.ts.map +1 -1
- package/dist/dashboard/empty-state.js +37 -6
- package/dist/dashboard/index.d.ts +6 -4
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +10 -2
- package/dist/dashboard/query-state.d.ts +48 -27
- package/dist/dashboard/query-state.d.ts.map +1 -1
- package/dist/dashboard/query-state.js +111 -57
- package/dist/dashboard/settings-section.d.ts +19 -9
- package/dist/dashboard/settings-section.d.ts.map +1 -1
- package/dist/dashboard/settings-section.js +74 -25
- package/dist/dashboard/stat-card.d.ts +76 -19
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +78 -38
- package/dist/dashboard/stat-card.module.css +112 -26
- package/dist/dashboard/stat-card.module.css.d.ts +5 -0
- package/dist/dashboard/stat-group.d.ts +41 -0
- package/dist/dashboard/stat-group.d.ts.map +1 -0
- package/dist/dashboard/stat-group.js +30 -0
- package/dist/dashboard/stat-group.module.css +66 -0
- package/dist/dashboard/stat-group.module.css.d.ts +8 -0
- package/dist/dashboard/widget-grid.d.ts +27 -0
- package/dist/dashboard/widget-grid.d.ts.map +1 -0
- package/dist/dashboard/widget-grid.js +41 -0
- package/dist/dashboard/widget-grid.module.css +53 -0
- package/dist/dashboard/widget-grid.module.css.d.ts +9 -0
- package/dist/data/data-table.d.ts +151 -12
- package/dist/data/data-table.d.ts.map +1 -1
- package/dist/data/data-table.js +392 -138
- package/dist/data/data-table.module.css +64 -0
- package/dist/data/data-table.module.css.d.ts +11 -0
- package/dist/data/index.d.ts +2 -2
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +24 -2
- package/dist/data/query-branch.d.ts +28 -0
- package/dist/data/query-branch.d.ts.map +1 -0
- package/dist/data/query-branch.js +10 -0
- package/dist/data/table.d.ts +2 -2
- package/dist/data/table.d.ts.map +1 -1
- package/dist/data/virtual-list.d.ts +65 -6
- package/dist/data/virtual-list.d.ts.map +1 -1
- package/dist/data/virtual-list.js +89 -38
- package/dist/data/virtual.d.ts +1 -1
- package/dist/data/virtual.d.ts.map +1 -1
- package/dist/forms/FormErrorSummary.d.ts +4 -3
- package/dist/forms/FormErrorSummary.d.ts.map +1 -1
- package/dist/forms/FormErrorSummary.js +6 -4
- package/dist/forms/create-form.d.ts +2 -2
- package/dist/forms/field.d.ts +46 -6
- package/dist/forms/field.d.ts.map +1 -1
- package/dist/forms/field.js +10 -5
- package/dist/forms/form-layout.d.ts +142 -0
- package/dist/forms/form-layout.d.ts.map +1 -0
- package/dist/forms/form-layout.js +110 -0
- package/dist/forms/form-layout.module.css +145 -0
- package/dist/forms/form-layout.module.css.d.ts +20 -0
- package/dist/forms/form-state.d.ts +42 -0
- package/dist/forms/form-state.d.ts.map +1 -0
- package/dist/forms/form-state.js +26 -0
- package/dist/forms/index.d.ts +22 -6
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +19 -3
- package/dist/forms/use-field-array.d.ts +60 -0
- package/dist/forms/use-field-array.d.ts.map +1 -0
- package/dist/forms/use-field-array.js +20 -0
- package/dist/forms/use-form-draft.d.ts +25 -10
- package/dist/forms/use-form-draft.d.ts.map +1 -1
- package/dist/forms/use-form-draft.js +55 -18
- package/dist/forms/use-form-submit.d.ts +88 -0
- package/dist/forms/use-form-submit.d.ts.map +1 -0
- package/dist/forms/use-form-submit.js +63 -0
- package/dist/guard/index.d.ts +1 -1
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +27 -11
- package/dist/index.d.ts +10 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -4
- package/dist/nav/types.d.ts +15 -6
- package/dist/nav/types.d.ts.map +1 -1
- package/dist/notifications/bell.d.ts +3 -2
- package/dist/notifications/bell.d.ts.map +1 -1
- package/dist/notifications/bell.js +73 -56
- package/dist/notifications/center.d.ts +15 -4
- package/dist/notifications/center.d.ts.map +1 -1
- package/dist/notifications/center.js +5 -2
- package/dist/notifications/define-notifications.d.ts +56 -14
- package/dist/notifications/define-notifications.d.ts.map +1 -1
- package/dist/notifications/define-notifications.js +2 -1
- package/dist/notifications/index.d.ts +6 -2
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +5 -1
- package/dist/notifications/mount-guard.d.ts +8 -0
- package/dist/notifications/mount-guard.d.ts.map +1 -0
- package/dist/notifications/mount-guard.js +19 -0
- package/dist/notifications/notify.d.ts +58 -1
- package/dist/notifications/notify.d.ts.map +1 -1
- package/dist/notifications/notify.js +46 -2
- package/dist/notifications/overlay.d.ts.map +1 -1
- package/dist/notifications/overlay.js +2 -0
- package/dist/notifications/store.d.ts +7 -0
- package/dist/notifications/store.d.ts.map +1 -1
- package/dist/provider/index.d.ts +37 -5
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +66 -28
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/lab-theme.js +2 -1
- package/dist/query/devtools.d.ts.map +1 -1
- package/dist/query/devtools.js +1 -0
- package/dist/router-tanstack/field.d.ts +1 -1
- package/dist/router-tanstack/field.d.ts.map +1 -1
- package/dist/router-tanstack/index.d.ts +1 -1
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.d.ts +4 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.js +92 -8
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +1 -1
- package/dist/section/index.d.ts +1 -1
- package/dist/section/index.d.ts.map +1 -1
- package/dist/section/section.d.ts +36 -2
- package/dist/section/section.d.ts.map +1 -1
- package/dist/section/section.js +49 -57
- package/dist/section/section.module.css +11 -0
- package/dist/shell/account-types.d.ts +5 -2
- package/dist/shell/account-types.d.ts.map +1 -1
- package/dist/shell/app-brand.d.ts +13 -0
- package/dist/shell/app-brand.d.ts.map +1 -0
- package/dist/shell/app-brand.js +94 -0
- package/dist/shell/app-brand.module.css +109 -0
- package/dist/shell/app-brand.module.css.d.ts +14 -0
- package/dist/shell/app-breadcrumbs.d.ts +4 -2
- package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
- package/dist/shell/app-breadcrumbs.js +33 -22
- package/dist/shell/app-header.module.css +10 -5
- package/dist/shell/app-main.module.css +107 -0
- package/dist/shell/app-main.module.css.d.ts +11 -0
- package/dist/shell/app-mobile-nav.d.ts +3 -2
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-mobile-nav.js +29 -15
- package/dist/shell/app-mobile-nav.module.css +48 -27
- package/dist/shell/app-mobile-nav.module.css.d.ts +0 -1
- package/dist/shell/app-sidebar-account.d.ts +2 -1
- package/dist/shell/app-sidebar-account.d.ts.map +1 -1
- package/dist/shell/app-sidebar-account.js +57 -22
- package/dist/shell/app-sidebar.d.ts +9 -3
- package/dist/shell/app-sidebar.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +55 -109
- package/dist/shell/app-sidebar.module.css +53 -96
- package/dist/shell/app-sidebar.module.css.d.ts +0 -5
- package/dist/shell/index.d.ts +14 -6
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +47 -12
- package/dist/shell/isomorphic-layout-effect.d.ts +14 -0
- package/dist/shell/isomorphic-layout-effect.d.ts.map +1 -0
- package/dist/shell/isomorphic-layout-effect.js +5 -0
- package/dist/shell/mobile-nav-model.d.ts.map +1 -1
- package/dist/shell/mobile-nav-model.js +27 -6
- package/dist/shell/nav-count-badge.d.ts +5 -3
- package/dist/shell/nav-count-badge.d.ts.map +1 -1
- package/dist/shell/nav-count-badge.js +3 -1
- package/dist/shell/page-aside.d.ts +43 -0
- package/dist/shell/page-aside.d.ts.map +1 -0
- package/dist/shell/page-aside.js +202 -0
- package/dist/shell/page-aside.module.css +174 -0
- package/dist/shell/page-aside.module.css.d.ts +14 -0
- package/dist/shell/page-bar.d.ts +55 -15
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +130 -41
- package/dist/shell/page-bar.module.css +107 -13
- package/dist/shell/page-bar.module.css.d.ts +4 -1
- package/dist/shell/sidebar-search.d.ts +4 -2
- package/dist/shell/sidebar-search.d.ts.map +1 -1
- package/dist/shell/sidebar-search.js +9 -4
- package/dist/shell/sidebar-search.module.css +1 -1
- package/dist/state/fields.d.ts +227 -34
- package/dist/state/fields.d.ts.map +1 -1
- package/dist/state/fields.js +77 -30
- package/dist/state/persisted-or-local.d.ts +9 -0
- package/dist/state/persisted-or-local.d.ts.map +1 -0
- package/dist/state/persisted-or-local.js +24 -0
- package/dist/state/persisted.d.ts +12 -0
- package/dist/state/persisted.d.ts.map +1 -1
- package/dist/state/persisted.js +36 -18
- package/dist/state.d.ts +1 -1
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +2 -6
- package/dist/surfaces.d.ts +12 -11
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +43 -12
- package/dist/theme/ctl-theme.d.ts.map +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +102 -17
- package/dist/theme/nav-link.module.css +37 -26
- package/dist/theme/segmented-control.module.css +22 -0
- package/dist/theme/segmented-control.module.css.d.ts +1 -0
- package/dist/theme-lab/boot.d.ts +66 -0
- package/dist/theme-lab/boot.d.ts.map +1 -0
- package/dist/theme-lab/boot.js +82 -0
- package/dist/theme-lab/index.d.ts +4 -43
- package/dist/theme-lab/index.d.ts.map +1 -1
- package/dist/theme-lab/index.js +9 -69
- package/dist/theme-toggle/index.d.ts +3 -2
- package/dist/theme-toggle/index.d.ts.map +1 -1
- package/dist/theme-toggle/index.js +8 -2
- package/dist/tokens/index.d.ts +42 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +35 -6
- package/dist/tokens/palette.d.ts +45 -25
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +31 -14
- package/dist/tokens.css +4 -5
- package/dist/utils/is-dev.d.ts +3 -0
- package/dist/utils/is-dev.d.ts.map +1 -0
- package/dist/utils/is-dev.js +6 -0
- package/dist/widget-header/delta-badge.d.ts +7 -1
- package/dist/widget-header/delta-badge.d.ts.map +1 -1
- package/dist/widget-header/delta-badge.js +8 -1
- package/dist/widget-header/index.d.ts +2 -2
- package/dist/widget-header/index.d.ts.map +1 -1
- package/dist/widget-header/index.js +3 -1
- package/dist/widget-header/widget-header.d.ts +99 -4
- package/dist/widget-header/widget-header.d.ts.map +1 -1
- package/dist/widget-header/widget-header.js +45 -18
- package/dist/widget-header/widget-header.module.css +87 -7
- package/dist/widget-header/widget-header.module.css.d.ts +1 -0
- package/llms.txt +6 -6
- package/package.json +49 -25
- package/src/agent/coalesce.ts +2 -1
- package/src/agent/merge.ts +2 -1
- package/src/agent/part-list.tsx +2 -0
- package/src/agent/stick-to-bottom.tsx +9 -11
- package/src/agent-chat/composer.tsx +124 -103
- package/src/agent-chat/relative-time.ts +2 -1
- package/src/agent-chat/thread-detail-panel.tsx +9 -5
- package/src/agent-chat/thread-feed-row.tsx +17 -9
- package/src/agent-chat/thread-feed.tsx +9 -3
- package/src/agent-chat/thread-message.tsx +48 -13
- package/src/agent-chat/thread-outcome-card.tsx +9 -1
- package/src/agent-chat/thread-workspace.tsx +72 -33
- package/src/agent-chat/tool-chip.tsx +8 -2
- package/src/charts/hooks/useBandPlot.ts +26 -8
- package/src/charts/index.ts +39 -4
- package/src/charts/kinds/BandStrip.tsx +36 -14
- package/src/charts/kinds/Bars.tsx +67 -16
- package/src/charts/kinds/Donut.tsx +30 -3
- package/src/charts/kinds/DualPanel.tsx +56 -10
- package/src/charts/kinds/Heatmap.tsx +90 -33
- package/src/charts/kinds/MirroredBars.tsx +21 -3
- package/src/charts/kinds/MultiLine.tsx +61 -18
- package/src/charts/kinds/StackedArea.tsx +77 -6
- package/src/charts/kinds/ZonedLine.tsx +71 -31
- package/src/charts/layout/auto-margin.ts +134 -21
- package/src/charts/layout/log-ticks.ts +90 -0
- package/src/charts/primitives/Axes.tsx +33 -5
- package/src/charts/primitives/CartesianChart.tsx +194 -41
- package/src/charts/primitives/ChartCard.tsx +66 -25
- package/src/charts/primitives/ChartFrame.tsx +107 -26
- package/src/charts/primitives/ChartLegend.tsx +43 -13
- package/src/charts/primitives/ChartPending.tsx +185 -7
- package/src/charts/primitives/ChartTooltip.tsx +37 -5
- package/src/charts/primitives/Crosshair.tsx +6 -3
- package/src/charts/primitives/chart-frame-layout.ts +212 -0
- package/src/charts/primitives/chart-tier.tsx +37 -0
- package/src/charts/series.ts +77 -1
- package/src/charts/sparklines/BarSparkline.tsx +11 -3
- package/src/charts/sparklines/LineSparkline.tsx +18 -4
- package/src/charts/sparklines/index.ts +2 -2
- package/src/charts/utils/format.ts +163 -2
- package/src/charts/utils/ticks.ts +149 -4
- package/src/cli/index.ts +8 -3
- package/src/commands/ShortcutsHelp.tsx +10 -3
- package/src/commands/define-commands.ts +2 -2
- package/src/commands/define-overlays.ts +216 -1
- package/src/commands/index.ts +12 -0
- package/src/commands/overlays-mount.tsx +60 -26
- package/src/common/errors.ts +73 -0
- package/src/common/index.ts +21 -0
- package/src/common/props.ts +71 -0
- package/src/common/query-state-like.ts +64 -0
- package/src/common/refs.ts +58 -0
- package/src/common/scroll-parent.ts +42 -0
- package/src/common/validate.ts +94 -0
- package/src/connectivity/connectivity-indicator.tsx +6 -1
- package/src/connectivity/connectivity-provider.tsx +4 -1
- package/src/connectivity/index.ts +1 -0
- package/src/connectivity/types.ts +5 -2
- package/src/connectivity/use-connectivity.ts +3 -2
- package/src/content/article-layout.module.css +11 -4
- package/src/content/callout.tsx +13 -7
- package/src/content/guide.tsx +14 -4
- package/src/content/heading-anchor.tsx +14 -3
- package/src/content/index.ts +2 -0
- package/src/content/markdown.tsx +2 -0
- package/src/content/prose.module.css +9 -7
- package/src/content/reading-progress.tsx +40 -15
- package/src/content/slug.ts +4 -0
- package/src/content/toc.tsx +47 -10
- package/src/controls/actions.tsx +89 -9
- package/src/controls/compare-filter.tsx +20 -3
- package/src/controls/control-group.tsx +11 -4
- package/src/controls/controls.module.css +169 -186
- package/src/controls/controls.module.css.d.ts +9 -11
- package/src/controls/enum-filter.tsx +46 -19
- package/src/controls/filter-context.tsx +21 -8
- package/src/controls/filter-pill.tsx +6 -3
- package/src/controls/filter-set.tsx +32 -13
- package/src/controls/filter-sheet.tsx +44 -194
- package/src/controls/index.ts +8 -0
- package/src/controls/multi-select-filter.tsx +179 -29
- package/src/controls/number-filter.tsx +329 -0
- package/src/controls/panel-row.module.css +86 -0
- package/src/controls/panel-row.module.css.d.ts +13 -0
- package/src/controls/panel-row.tsx +392 -0
- package/src/controls/range-filter.tsx +133 -43
- package/src/controls/search-filter.tsx +31 -13
- package/src/controls/select-filter.tsx +11 -1
- package/src/controls/slider-control.tsx +159 -0
- package/src/controls/sync-button.tsx +13 -3
- package/src/controls/toggle-filter.tsx +37 -17
- package/src/controls/view-tabs.tsx +63 -11
- package/src/controls-dates/date-range-picker.tsx +8 -1
- package/src/dashboard/delta-badge.tsx +5 -1
- package/src/dashboard/empty-state.tsx +72 -25
- package/src/dashboard/index.ts +19 -2
- package/src/dashboard/query-state.tsx +154 -84
- package/src/dashboard/settings-section.tsx +87 -31
- package/src/dashboard/stat-card.module.css +112 -26
- package/src/dashboard/stat-card.module.css.d.ts +5 -0
- package/src/dashboard/stat-card.tsx +207 -68
- package/src/dashboard/stat-group.module.css +66 -0
- package/src/dashboard/stat-group.module.css.d.ts +8 -0
- package/src/dashboard/stat-group.tsx +74 -0
- package/src/dashboard/widget-grid.module.css +53 -0
- package/src/dashboard/widget-grid.module.css.d.ts +9 -0
- package/src/dashboard/widget-grid.tsx +127 -0
- package/src/data/data-table.module.css +64 -0
- package/src/data/data-table.module.css.d.ts +11 -0
- package/src/data/data-table.tsx +927 -346
- package/src/data/index.ts +30 -2
- package/src/data/query-branch.ts +53 -0
- package/src/data/table.ts +5 -0
- package/src/data/virtual-list.tsx +189 -55
- package/src/data/virtual.ts +5 -1
- package/src/forms/FormErrorSummary.tsx +13 -6
- package/src/forms/create-form.ts +2 -2
- package/src/forms/field.ts +60 -11
- package/src/forms/form-layout.module.css +145 -0
- package/src/forms/form-layout.module.css.d.ts +20 -0
- package/src/forms/form-layout.tsx +305 -0
- package/src/forms/form-state.tsx +94 -0
- package/src/forms/index.ts +38 -7
- package/src/forms/use-field-array.ts +94 -0
- package/src/forms/use-form-draft.ts +145 -53
- package/src/forms/use-form-submit.ts +199 -0
- package/src/guard/index.ts +91 -23
- package/src/index.ts +79 -10
- package/src/nav/types.ts +15 -6
- package/src/notifications/bell.tsx +18 -4
- package/src/notifications/center.tsx +18 -5
- package/src/notifications/define-notifications.ts +64 -18
- package/src/notifications/index.ts +12 -1
- package/src/notifications/mount-guard.ts +41 -0
- package/src/notifications/notify.tsx +122 -3
- package/src/notifications/overlay.tsx +2 -0
- package/src/notifications/store.ts +7 -0
- package/src/provider/index.tsx +101 -13
- package/src/provider/lab-theme.ts +2 -1
- package/src/query/devtools.tsx +1 -0
- package/src/router-tanstack/field.ts +5 -0
- package/src/router-tanstack/index.ts +4 -0
- package/src/router-tanstack/search-store.ts +171 -12
- package/src/router-tanstack/use-nav.ts +18 -13
- package/src/section/index.ts +1 -1
- package/src/section/section.module.css +11 -0
- package/src/section/section.tsx +163 -96
- package/src/shell/account-types.ts +5 -2
- package/src/shell/app-brand.module.css +109 -0
- package/src/shell/app-brand.module.css.d.ts +14 -0
- package/src/shell/app-brand.tsx +140 -0
- package/src/shell/app-breadcrumbs.tsx +19 -9
- package/src/shell/app-header.module.css +10 -5
- package/src/shell/app-main.module.css +107 -0
- package/src/shell/app-main.module.css.d.ts +11 -0
- package/src/shell/app-mobile-nav.module.css +48 -27
- package/src/shell/app-mobile-nav.module.css.d.ts +0 -1
- package/src/shell/app-mobile-nav.tsx +43 -11
- package/src/shell/app-sidebar-account.tsx +29 -6
- package/src/shell/app-sidebar.module.css +53 -96
- package/src/shell/app-sidebar.module.css.d.ts +0 -5
- package/src/shell/app-sidebar.tsx +40 -113
- package/src/shell/index.tsx +156 -65
- package/src/shell/isomorphic-layout-effect.ts +14 -0
- package/src/shell/mobile-nav-model.ts +66 -10
- package/src/shell/nav-count-badge.tsx +6 -1
- package/src/shell/page-aside.module.css +174 -0
- package/src/shell/page-aside.module.css.d.ts +14 -0
- package/src/shell/page-aside.tsx +377 -0
- package/src/shell/page-bar.module.css +107 -13
- package/src/shell/page-bar.module.css.d.ts +4 -1
- package/src/shell/page-bar.tsx +294 -94
- package/src/shell/sidebar-search.module.css +1 -1
- package/src/shell/sidebar-search.tsx +13 -4
- package/src/state/fields.ts +360 -69
- package/src/state/persisted-or-local.ts +50 -0
- package/src/state/persisted.ts +76 -26
- package/src/state.ts +4 -7
- package/src/surfaces.ts +43 -12
- package/src/theme/ctl-theme.tsx +10 -0
- package/src/theme/index.ts +129 -16
- package/src/theme/nav-link.module.css +37 -26
- package/src/theme/segmented-control.module.css +22 -0
- package/src/theme/segmented-control.module.css.d.ts +1 -0
- package/src/theme-lab/boot.ts +140 -0
- package/src/theme-lab/index.tsx +21 -112
- package/src/theme-toggle/index.tsx +10 -3
- package/src/tokens/index.ts +50 -6
- package/src/tokens/palette.ts +58 -30
- package/src/utils/is-dev.ts +4 -0
- package/src/widget-header/delta-badge.tsx +25 -5
- package/src/widget-header/index.ts +10 -2
- package/src/widget-header/widget-header.module.css +87 -7
- package/src/widget-header/widget-header.module.css.d.ts +1 -0
- package/src/widget-header/widget-header.tsx +166 -42
- package/dist/agent/adapter.test.d.ts +0 -2
- package/dist/agent/adapter.test.d.ts.map +0 -1
- package/dist/agent/ai-sdk-transport.test.d.ts +0 -2
- package/dist/agent/ai-sdk-transport.test.d.ts.map +0 -1
- package/dist/agent/coalesce.test.d.ts +0 -2
- package/dist/agent/coalesce.test.d.ts.map +0 -1
- package/dist/agent/foreign.test.d.ts +0 -2
- package/dist/agent/foreign.test.d.ts.map +0 -1
- package/dist/agent/id.test.d.ts +0 -2
- package/dist/agent/id.test.d.ts.map +0 -1
- package/dist/agent/merge.test.d.ts +0 -2
- package/dist/agent/merge.test.d.ts.map +0 -1
- package/dist/agent/part-list.test.d.ts +0 -2
- package/dist/agent/part-list.test.d.ts.map +0 -1
- package/dist/agent/parts.test.d.ts +0 -2
- package/dist/agent/parts.test.d.ts.map +0 -1
- package/dist/agent/thread.test.d.ts +0 -2
- package/dist/agent/thread.test.d.ts.map +0 -1
- package/dist/agent/transport.test.d.ts +0 -2
- package/dist/agent/transport.test.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.test.d.ts +0 -2
- package/dist/agent/use-agent-stream.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts.map +0 -1
- package/dist/agent-chat/composer.test.d.ts +0 -2
- package/dist/agent-chat/composer.test.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.test.d.ts +0 -2
- package/dist/agent-chat/relative-time.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed-row.test.d.ts +0 -2
- package/dist/agent-chat/thread-feed-row.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.test.d.ts +0 -2
- package/dist/agent-chat/thread-feed.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.test.d.ts +0 -2
- package/dist/agent-chat/thread-message.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.test.d.ts +0 -2
- package/dist/agent-chat/thread-workspace.test.d.ts.map +0 -1
- package/dist/agent-chat/tool-chip.test.d.ts +0 -2
- package/dist/agent-chat/tool-chip.test.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.type-guard.test.d.ts +0 -2
- package/dist/agent-chat/virtualize.type-guard.test.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.test.d.ts +0 -2
- package/dist/charts/cursor/resolve.test.d.ts.map +0 -1
- package/dist/charts/cursor/store.test.d.ts +0 -2
- package/dist/charts/cursor/store.test.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.test.d.ts +0 -2
- package/dist/charts/kinds/BandStrip.test.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.test.d.ts +0 -2
- package/dist/charts/kinds/Bars.test.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.test.d.ts +0 -2
- package/dist/charts/kinds/DualPanel.test.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.test.d.ts +0 -2
- package/dist/charts/kinds/MirroredBars.test.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.test.d.ts +0 -2
- package/dist/charts/kinds/MultiLine.test.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.test.d.ts +0 -2
- package/dist/charts/kinds/StackedArea.test.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.test.d.ts +0 -2
- package/dist/charts/kinds/ZonedLine.test.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.test.d.ts +0 -2
- package/dist/charts/layout/auto-margin.test.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.test.d.ts +0 -2
- package/dist/charts/primitives/CartesianChart.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.test.d.ts +0 -2
- package/dist/charts/primitives/ChartCard.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.test.d.ts +0 -2
- package/dist/charts/primitives/ChartFrame.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.test.d.ts +0 -2
- package/dist/charts/primitives/ChartLegend.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.test.d.ts +0 -2
- package/dist/charts/primitives/ChartTooltip.test.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.test.d.ts +0 -2
- package/dist/charts/primitives/XZoneRects.test.d.ts.map +0 -1
- package/dist/charts/series.test.d.ts +0 -2
- package/dist/charts/series.test.d.ts.map +0 -1
- package/dist/charts/utils/domain.test.d.ts +0 -2
- package/dist/charts/utils/domain.test.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.test.d.ts +0 -2
- package/dist/charts/utils/measure-text.test.d.ts.map +0 -1
- package/dist/cli/check-coverage.test.d.ts +0 -2
- package/dist/cli/check-coverage.test.d.ts.map +0 -1
- package/dist/cli/check-theme.test.d.ts +0 -2
- package/dist/cli/check-theme.test.d.ts.map +0 -1
- package/dist/cli/help.test.d.ts +0 -2
- package/dist/cli/help.test.d.ts.map +0 -1
- package/dist/cli/init-sync.test.d.ts +0 -2
- package/dist/cli/init-sync.test.d.ts.map +0 -1
- package/dist/cli/placement-engine.test.d.ts +0 -2
- package/dist/cli/placement-engine.test.d.ts.map +0 -1
- package/dist/cli/shipped-versions.test.d.ts +0 -2
- package/dist/cli/shipped-versions.test.d.ts.map +0 -1
- package/dist/cli/tarball-parity.test.d.ts +0 -2
- package/dist/cli/tarball-parity.test.d.ts.map +0 -1
- package/dist/cli/template-format.test.d.ts +0 -2
- package/dist/cli/template-format.test.d.ts.map +0 -1
- package/dist/cli/template-ledger.test.d.ts +0 -2
- package/dist/cli/template-ledger.test.d.ts.map +0 -1
- package/dist/cli/tokens-css.test.d.ts +0 -2
- package/dist/cli/tokens-css.test.d.ts.map +0 -1
- package/dist/cli/toolchain-wiring.test.d.ts +0 -2
- package/dist/cli/toolchain-wiring.test.d.ts.map +0 -1
- package/dist/cli/waiver-audit.test.d.ts +0 -2
- package/dist/cli/waiver-audit.test.d.ts.map +0 -1
- package/dist/content/article-actions.test.d.ts +0 -2
- package/dist/content/article-actions.test.d.ts.map +0 -1
- package/dist/content/article-model.test.d.ts +0 -2
- package/dist/content/article-model.test.d.ts.map +0 -1
- package/dist/content/block-split.test.d.ts +0 -2
- package/dist/content/block-split.test.d.ts.map +0 -1
- package/dist/content/heading-components.test.d.ts +0 -2
- package/dist/content/heading-components.test.d.ts.map +0 -1
- package/dist/content/markdown.test.d.ts +0 -2
- package/dist/content/markdown.test.d.ts.map +0 -1
- package/dist/content/prose.module.css.test.d.ts +0 -2
- package/dist/content/prose.module.css.test.d.ts.map +0 -1
- package/dist/content/sanitize.test.d.ts +0 -2
- package/dist/content/sanitize.test.d.ts.map +0 -1
- package/dist/content/slug.test.d.ts +0 -2
- package/dist/content/slug.test.d.ts.map +0 -1
- package/dist/controls/actions.test.d.ts +0 -2
- package/dist/controls/actions.test.d.ts.map +0 -1
- package/dist/controls/actions.type-guard.test.d.ts +0 -2
- package/dist/controls/actions.type-guard.test.d.ts.map +0 -1
- package/dist/controls/control-group.test.d.ts +0 -2
- package/dist/controls/control-group.test.d.ts.map +0 -1
- package/dist/controls/controls.router.test.d.ts +0 -2
- package/dist/controls/controls.router.test.d.ts.map +0 -1
- package/dist/controls/filter-set.test.d.ts +0 -2
- package/dist/controls/filter-set.test.d.ts.map +0 -1
- package/dist/controls/peer-boundary.test.d.ts +0 -2
- package/dist/controls/peer-boundary.test.d.ts.map +0 -1
- package/dist/controls/props-contract.test.d.ts +0 -2
- package/dist/controls/props-contract.test.d.ts.map +0 -1
- package/dist/controls/sync-button.test.d.ts +0 -2
- package/dist/controls/sync-button.test.d.ts.map +0 -1
- package/dist/dashboard/query-state.test.d.ts +0 -2
- package/dist/dashboard/query-state.test.d.ts.map +0 -1
- package/dist/dashboard/settings-section.test.d.ts +0 -2
- package/dist/dashboard/settings-section.test.d.ts.map +0 -1
- package/dist/dashboard/stat-card.test.d.ts +0 -2
- package/dist/dashboard/stat-card.test.d.ts.map +0 -1
- package/dist/data/data-table.test.d.ts +0 -2
- package/dist/data/data-table.test.d.ts.map +0 -1
- package/dist/guard/check-source.test.d.ts +0 -2
- package/dist/guard/check-source.test.d.ts.map +0 -1
- package/dist/guard/grace.test.d.ts +0 -20
- package/dist/guard/grace.test.d.ts.map +0 -1
- package/dist/guard/guard-hook.test.d.ts +0 -2
- package/dist/guard/guard-hook.test.d.ts.map +0 -1
- package/dist/provider/index.test.d.ts +0 -2
- package/dist/provider/index.test.d.ts.map +0 -1
- package/dist/provider/lab-theme.test.d.ts +0 -2
- package/dist/provider/lab-theme.test.d.ts.map +0 -1
- package/dist/query/error-message.test.d.ts +0 -2
- package/dist/query/error-message.test.d.ts.map +0 -1
- package/dist/router-tanstack/multi-search-param-store.test.d.ts +0 -2
- package/dist/router-tanstack/multi-search-param-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/nav.test.d.ts +0 -2
- package/dist/router-tanstack/nav.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-param-store.test.d.ts +0 -2
- package/dist/router-tanstack/search-param-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-store.router.test.d.ts +0 -2
- package/dist/router-tanstack/search-store.router.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-store.test.d.ts +0 -2
- package/dist/router-tanstack/search-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/use-nav.test.d.ts +0 -2
- package/dist/router-tanstack/use-nav.test.d.ts.map +0 -1
- package/dist/section/section.test.d.ts +0 -2
- package/dist/section/section.test.d.ts.map +0 -1
- package/dist/shell/app-mobile-nav.test.d.ts +0 -2
- package/dist/shell/app-mobile-nav.test.d.ts.map +0 -1
- package/dist/shell/app-sidebar.test.d.ts +0 -2
- package/dist/shell/app-sidebar.test.d.ts.map +0 -1
- package/dist/shell/index.test.d.ts +0 -2
- package/dist/shell/index.test.d.ts.map +0 -1
- package/dist/shell/mobile-nav-model.test.d.ts +0 -2
- package/dist/shell/mobile-nav-model.test.d.ts.map +0 -1
- package/dist/shell/page-bar.test.d.ts +0 -2
- package/dist/shell/page-bar.test.d.ts.map +0 -1
- package/dist/state/fields.test.d.ts +0 -2
- package/dist/state/fields.test.d.ts.map +0 -1
- package/dist/styles.floor.test.d.ts +0 -2
- package/dist/styles.floor.test.d.ts.map +0 -1
- package/dist/theme/border-coverage.test.d.ts +0 -18
- package/dist/theme/border-coverage.test.d.ts.map +0 -1
- package/dist/theme/contrast.test.d.ts +0 -2
- package/dist/theme/contrast.test.d.ts.map +0 -1
- package/dist/theme/ctl-theme.test.d.ts +0 -2
- package/dist/theme/ctl-theme.test.d.ts.map +0 -1
- package/dist/theme/ctl-tier-coverage.test.d.ts +0 -2
- package/dist/theme/ctl-tier-coverage.test.d.ts.map +0 -1
- package/dist/theme/density-option.test.d.ts +0 -2
- package/dist/theme/density-option.test.d.ts.map +0 -1
- package/dist/theme/density-relations.test.d.ts +0 -2
- package/dist/theme/density-relations.test.d.ts.map +0 -1
- package/dist/theme/derive-theme.test.d.ts +0 -2
- package/dist/theme/derive-theme.test.d.ts.map +0 -1
- package/dist/theme/divider-law.test.d.ts +0 -2
- package/dist/theme/divider-law.test.d.ts.map +0 -1
- package/dist/theme/fonts-option.test.d.ts +0 -2
- package/dist/theme/fonts-option.test.d.ts.map +0 -1
- package/dist/theme/icon-slot.test.d.ts +0 -2
- package/dist/theme/icon-slot.test.d.ts.map +0 -1
- package/dist/theme/layout-rhythm-css.test.d.ts +0 -2
- package/dist/theme/layout-rhythm-css.test.d.ts.map +0 -1
- package/dist/theme/radius-option.test.d.ts +0 -2
- package/dist/theme/radius-option.test.d.ts.map +0 -1
- package/dist/theme/radius.test.d.ts +0 -2
- package/dist/theme/radius.test.d.ts.map +0 -1
- package/dist/theme/shadow-surfaces.test.d.ts +0 -26
- package/dist/theme/shadow-surfaces.test.d.ts.map +0 -1
- package/dist/theme/spacing.test.d.ts +0 -2
- package/dist/theme/spacing.test.d.ts.map +0 -1
- package/dist/theme/use-basalt-spacing.test.d.ts +0 -2
- package/dist/theme/use-basalt-spacing.test.d.ts.map +0 -1
- package/dist/theme-lab/derive-controls.test.d.ts +0 -2
- package/dist/theme-lab/derive-controls.test.d.ts.map +0 -1
- package/dist/theme-lab/derive-state.test.d.ts +0 -2
- package/dist/theme-lab/derive-state.test.d.ts.map +0 -1
- package/dist/theme-lab/theme-lab.test.d.ts +0 -2
- package/dist/theme-lab/theme-lab.test.d.ts.map +0 -1
- package/dist/tokens/build-fonts-css.test.d.ts +0 -2
- package/dist/tokens/build-fonts-css.test.d.ts.map +0 -1
- package/dist/tokens/build-radius-css.test.d.ts +0 -2
- package/dist/tokens/build-radius-css.test.d.ts.map +0 -1
- package/dist/tokens/chart-margin.test.d.ts +0 -2
- package/dist/tokens/chart-margin.test.d.ts.map +0 -1
- package/dist/tokens/density.test.d.ts +0 -2
- package/dist/tokens/density.test.d.ts.map +0 -1
- package/dist/tokens/derive-radius.test.d.ts +0 -2
- package/dist/tokens/derive-radius.test.d.ts.map +0 -1
- package/dist/tokens/derive.test.d.ts +0 -2
- package/dist/tokens/derive.test.d.ts.map +0 -1
- package/dist/tokens/palette.test.d.ts +0 -2
- package/dist/tokens/palette.test.d.ts.map +0 -1
- package/dist/tokens/text-scale.test.d.ts +0 -2
- package/dist/tokens/text-scale.test.d.ts.map +0 -1
- package/dist/vite-color-mix.test.d.ts +0 -2
- package/dist/vite-color-mix.test.d.ts.map +0 -1
- package/dist/vite.test.d.ts +0 -2
- package/dist/vite.test.d.ts.map +0 -1
- package/dist/widget-header/delta-badge.test.d.ts +0 -2
- package/dist/widget-header/delta-badge.test.d.ts.map +0 -1
- package/dist/widget-header/no-mantine.test.d.ts +0 -2
- package/dist/widget-header/no-mantine.test.d.ts.map +0 -1
- package/dist/widget-header/widget-header.test.d.ts +0 -2
- package/dist/widget-header/widget-header.test.d.ts.map +0 -1
- package/src/agent/adapter.test.ts +0 -1640
- package/src/agent/ai-sdk-transport.test.ts +0 -658
- package/src/agent/coalesce.test.ts +0 -387
- package/src/agent/foreign.test.ts +0 -51
- package/src/agent/id.test.ts +0 -169
- package/src/agent/merge.test.ts +0 -206
- package/src/agent/part-list.test.tsx +0 -112
- package/src/agent/parts.test.ts +0 -720
- package/src/agent/thread.test.ts +0 -220
- package/src/agent/transport.test.ts +0 -70
- package/src/agent/use-agent-stream.test.tsx +0 -287
- package/src/agent/use-agent-thread-runs.foreign.test.tsx +0 -138
- package/src/agent/use-agent-thread-runs.resume.test.tsx +0 -294
- package/src/agent/use-agent-thread-runs.test.tsx +0 -1120
- package/src/agent/use-agent-thread-runs.wedge.test.tsx +0 -387
- package/src/agent-chat/composer.test.tsx +0 -924
- package/src/agent-chat/relative-time.test.ts +0 -95
- package/src/agent-chat/thread-feed-row.test.tsx +0 -510
- package/src/agent-chat/thread-feed.test.tsx +0 -241
- package/src/agent-chat/thread-message.test.tsx +0 -1285
- package/src/agent-chat/thread-workspace.test.tsx +0 -169
- package/src/agent-chat/tool-chip.test.tsx +0 -139
- package/src/agent-chat/virtualize.type-guard.test.ts +0 -49
- package/src/charts/cursor/resolve.test.ts +0 -151
- package/src/charts/cursor/store.test.ts +0 -64
- package/src/charts/kinds/BandStrip.test.tsx +0 -282
- package/src/charts/kinds/Bars.test.tsx +0 -183
- package/src/charts/kinds/DualPanel.test.tsx +0 -527
- package/src/charts/kinds/MirroredBars.test.tsx +0 -232
- package/src/charts/kinds/MultiLine.test.tsx +0 -218
- package/src/charts/kinds/StackedArea.test.tsx +0 -114
- package/src/charts/kinds/ZonedLine.test.tsx +0 -147
- package/src/charts/layout/auto-margin.test.ts +0 -42
- package/src/charts/primitives/CartesianChart.test.tsx +0 -647
- package/src/charts/primitives/ChartCard.test.tsx +0 -66
- package/src/charts/primitives/ChartFrame.test.tsx +0 -142
- package/src/charts/primitives/ChartLegend.test.tsx +0 -78
- package/src/charts/primitives/ChartTooltip.test.tsx +0 -44
- package/src/charts/primitives/XZoneRects.test.tsx +0 -123
- package/src/charts/series.test.ts +0 -112
- package/src/charts/utils/domain.test.ts +0 -54
- package/src/charts/utils/measure-text.test.ts +0 -36
- package/src/cli/check-coverage.test.ts +0 -297
- package/src/cli/check-theme.test.ts +0 -837
- package/src/cli/help.test.ts +0 -170
- package/src/cli/init-sync.test.ts +0 -343
- package/src/cli/placement-engine.test.ts +0 -298
- package/src/cli/shipped-versions.test.ts +0 -83
- package/src/cli/tarball-parity.test.ts +0 -44
- package/src/cli/template-format.test.ts +0 -64
- package/src/cli/template-ledger.test.ts +0 -219
- package/src/cli/tokens-css.test.ts +0 -249
- package/src/cli/toolchain-wiring.test.ts +0 -1358
- package/src/cli/waiver-audit.test.ts +0 -215
- package/src/content/article-actions.test.ts +0 -78
- package/src/content/article-model.test.ts +0 -119
- package/src/content/block-split.test.ts +0 -75
- package/src/content/heading-components.test.tsx +0 -65
- package/src/content/markdown.test.tsx +0 -603
- package/src/content/prose.module.css.test.ts +0 -39
- package/src/content/sanitize.test.ts +0 -659
- package/src/content/slug.test.ts +0 -62
- package/src/controls/actions.test.tsx +0 -252
- package/src/controls/actions.type-guard.test.ts +0 -63
- package/src/controls/control-group.test.tsx +0 -229
- package/src/controls/controls.router.test.tsx +0 -637
- package/src/controls/filter-set.test.tsx +0 -472
- package/src/controls/peer-boundary.test.ts +0 -85
- package/src/controls/props-contract.test.tsx +0 -106
- package/src/controls/sync-button.test.tsx +0 -183
- package/src/dashboard/query-state.test.tsx +0 -152
- package/src/dashboard/settings-section.test.tsx +0 -56
- package/src/dashboard/stat-card.test.tsx +0 -154
- package/src/data/data-table.test.tsx +0 -434
- package/src/guard/check-source.test.ts +0 -3355
- package/src/guard/grace.test.ts +0 -149
- package/src/guard/guard-hook.test.ts +0 -203
- package/src/provider/index.test.tsx +0 -101
- package/src/provider/lab-theme.test.ts +0 -147
- package/src/query/error-message.test.ts +0 -67
- package/src/router-tanstack/multi-search-param-store.test.ts +0 -124
- package/src/router-tanstack/nav.test.ts +0 -111
- package/src/router-tanstack/search-param-store.test.ts +0 -135
- package/src/router-tanstack/search-store.router.test.tsx +0 -661
- package/src/router-tanstack/search-store.test.ts +0 -418
- package/src/router-tanstack/use-nav.test.tsx +0 -187
- package/src/section/section.test.tsx +0 -204
- package/src/shell/app-mobile-nav.test.tsx +0 -403
- package/src/shell/app-sidebar.test.tsx +0 -509
- package/src/shell/index.test.tsx +0 -428
- package/src/shell/mobile-nav-model.test.ts +0 -517
- package/src/shell/page-bar.test.tsx +0 -316
- package/src/state/fields.test.tsx +0 -258
- package/src/styles.floor.test.ts +0 -36
- package/src/theme/border-coverage.test.ts +0 -272
- package/src/theme/contrast.test.ts +0 -354
- package/src/theme/ctl-theme.test.tsx +0 -275
- package/src/theme/ctl-tier-coverage.test.ts +0 -170
- package/src/theme/density-option.test.ts +0 -96
- package/src/theme/density-relations.test.ts +0 -506
- package/src/theme/derive-theme.test.ts +0 -101
- package/src/theme/divider-law.test.ts +0 -259
- package/src/theme/fonts-option.test.ts +0 -75
- package/src/theme/icon-slot.test.tsx +0 -275
- package/src/theme/layout-rhythm-css.test.ts +0 -72
- package/src/theme/radius-option.test.ts +0 -86
- package/src/theme/radius.test.ts +0 -142
- package/src/theme/shadow-surfaces.test.ts +0 -488
- package/src/theme/spacing.test.ts +0 -495
- package/src/theme/use-basalt-spacing.test.tsx +0 -55
- package/src/theme-lab/derive-controls.test.ts +0 -94
- package/src/theme-lab/derive-state.test.ts +0 -71
- package/src/theme-lab/theme-lab.test.ts +0 -46
- package/src/tokens/build-fonts-css.test.ts +0 -52
- package/src/tokens/build-radius-css.test.ts +0 -25
- package/src/tokens/chart-margin.test.ts +0 -39
- package/src/tokens/density.test.ts +0 -259
- package/src/tokens/derive-radius.test.ts +0 -62
- package/src/tokens/derive.test.ts +0 -30
- package/src/tokens/palette.test.ts +0 -114
- package/src/tokens/text-scale.test.ts +0 -51
- package/src/vite-color-mix.test.ts +0 -46
- package/src/vite.test.ts +0 -423
- package/src/widget-header/delta-badge.test.tsx +0 -60
- package/src/widget-header/no-mantine.test.ts +0 -33
- package/src/widget-header/widget-header.test.tsx +0 -187
package/src/section/section.tsx
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Section — the tier-2 heading composer (docs/CONTROLS-SPEC.md §2.2, law C8): a page-level content
|
|
3
|
-
* grouping under `WidgetHeader tier="section"
|
|
3
|
+
* grouping under `WidgetHeader tier="section"` — or `tier="group"` when the section renders on the
|
|
4
|
+
* `PageAside` panel surface, resolved from `useFilterSurface()` and never a call-site prop (law C1:
|
|
5
|
+
* no fourth home, no new prop — the aside decides, not the caller). Named exactly `Section` — not
|
|
6
|
+
* `PageSection` — so
|
|
4
7
|
* the existing `shadow-basalt-export` guard fires on a consumer's own hand-rolled `Section` /
|
|
5
8
|
* `PageSection` / `SectionTitle` / `SectionHeading` copy with zero new rule code.
|
|
6
9
|
*
|
|
@@ -9,8 +12,8 @@
|
|
|
9
12
|
*
|
|
10
13
|
* `actions` and `tabs` are two separate `CtlSlot`-wrapped fragments rendered in the header row
|
|
11
14
|
* (C1/C5) via `WidgetHeader`'s single `actions` slot; `tabs` hides while the section is collapsed.
|
|
12
|
-
* `Section` holds ≤3 actions (C6) — past that, a dev-only
|
|
13
|
-
* lands in wave 6).
|
|
15
|
+
* `Section` holds ≤3 actions (C6) — past that, a dev-only `useValidateProps` message fires once per
|
|
16
|
+
* title (the AST guard lands in wave 6).
|
|
14
17
|
*
|
|
15
18
|
* `collapsible` state persists via `createPersistedState('basalt:section:<persistKey>')` when
|
|
16
19
|
* `persistKey` is given, else it is local `useState` — the header always stays drawn, only the body
|
|
@@ -43,77 +46,101 @@
|
|
|
43
46
|
* <UsageChart />
|
|
44
47
|
* </Section>
|
|
45
48
|
*/
|
|
46
|
-
import { Children, useId
|
|
49
|
+
import { Children, useId } from 'react'
|
|
47
50
|
import type { ReactNode } from 'react'
|
|
51
|
+
import { cx } from '../common/props'
|
|
52
|
+
import type { BasaltProps, SlotStylesProps } from '../common/props'
|
|
53
|
+
import { BASALT_PREFIX } from '../common/errors'
|
|
54
|
+
import { useValidateProps } from '../common/validate'
|
|
48
55
|
import { CtlSlot } from '../theme'
|
|
49
|
-
import {
|
|
56
|
+
import { BarActionSlot, isBarActionList } from '../controls/actions'
|
|
57
|
+
import type { SlotActions } from '../controls/actions'
|
|
58
|
+
import { useFilterSurface } from '../controls/filter-context'
|
|
59
|
+
import { QueryState } from '../dashboard/query-state'
|
|
60
|
+
import type { QueryEmptyCopy, QueryStateLike } from '../dashboard/query-state'
|
|
61
|
+
import { usePersistedOrLocal } from '../state/persisted-or-local'
|
|
50
62
|
import { WidgetHeader } from '../widget-header'
|
|
51
63
|
import type { WidgetHeaderProps } from '../widget-header'
|
|
52
64
|
import classes from './section.module.css'
|
|
53
65
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
* (`useState`). */
|
|
62
|
-
persistKey?: string
|
|
63
|
-
/** The fold state a section opens on, respected only while no persisted value exists — a section
|
|
64
|
-
* a reader has closed stays closed. `false` is what a long secondary block wants. @default true */
|
|
65
|
-
defaultOpen?: boolean
|
|
66
|
-
/** Rendered directly under the header and ALWAYS visible, collapsed or not: a collapsed section
|
|
67
|
-
* still states its headline figures, which is what makes collapsing it a real option. Keep it to
|
|
68
|
-
* one row — the body is what `children` is for. */
|
|
69
|
-
summary?: ReactNode
|
|
70
|
-
/** Turns the root into a scroll anchor (`id` + `scroll-margin-top` cleared for both sticky bars). */
|
|
71
|
-
id?: string
|
|
72
|
-
children: ReactNode
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/** The house dev gate (`data/data-table.tsx`, `provider`, `charts/kinds/BandStrip` use the same
|
|
76
|
-
* expression): `basaltViteConfig` defines `process.env.NODE_ENV`, so a production bundle
|
|
77
|
-
* constant-folds this to `false` and drops the warning. Read per call, never hoisted. */
|
|
78
|
-
function isDev(): boolean {
|
|
79
|
-
return process.env['NODE_ENV'] !== 'production'
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/** ≤3 actions is C6 (docs/CONTROLS-SPEC.md §1) — the AST guard (`basalt/page-bar-budget`) lands in
|
|
83
|
-
* wave 6; this is the dev-only stopgap so the budget is visible before the lint rule exists. */
|
|
84
|
-
function warnPastActionBudget(title: string, actions: ReactNode): void {
|
|
85
|
-
if (!isDev()) return
|
|
86
|
-
const count = Children.count(actions)
|
|
87
|
-
if (count <= 3) return
|
|
88
|
-
console.warn(
|
|
89
|
-
`Section "${title}": ${count} actions exceeds the ≤3 budget (docs/CONTROLS-SPEC.md C6) — ` +
|
|
90
|
-
'move the rest behind a menu.',
|
|
91
|
-
)
|
|
92
|
-
}
|
|
66
|
+
/**
|
|
67
|
+
* The three boxes `Section` paints, and the whole styling seam it offers (`common/props.ts`):
|
|
68
|
+
* `root` is the outer stack, `header` is the `WidgetHeader` row, `body` is the collapsible content
|
|
69
|
+
* box. `summary` is deliberately absent — it is a one-row readout under the header, not a layout
|
|
70
|
+
* box a consumer positions.
|
|
71
|
+
*/
|
|
72
|
+
export type SectionSlot = 'root' | 'header' | 'body'
|
|
93
73
|
|
|
94
|
-
|
|
74
|
+
// `classNames` is omitted alongside `tier`: `WidgetHeader` publishes its OWN slot union now, and
|
|
75
|
+
// intersecting the two would let a caller write `classNames={{ metric: … }}` on a `Section` and get
|
|
76
|
+
// silence. Section's three slots are its whole styling contract; the header's own slots are reached
|
|
77
|
+
// on a `WidgetHeader`.
|
|
78
|
+
export type SectionProps = Omit<WidgetHeaderProps, 'tier' | 'classNames' | 'actions'> &
|
|
79
|
+
BasaltProps &
|
|
80
|
+
SlotStylesProps<SectionSlot> & {
|
|
81
|
+
/**
|
|
82
|
+
* Header actions, in either form (law C15): a typed `BarAction[]`, which basalt projects through
|
|
83
|
+
* the SAME row `PageBar` and `ActionGroup` use — ≤3 inline, the rest folded into `More`, one
|
|
84
|
+
* kebab below `sm` — or an opaque `ReactNode` a caller drew itself, rendered verbatim. The ≤3
|
|
85
|
+
* budget (C6) is checked against whichever form is given.
|
|
86
|
+
*/
|
|
87
|
+
actions?: SlotActions
|
|
88
|
+
/**
|
|
89
|
+
* The section's async result. Given one, the BODY renders through `QueryState` at the section
|
|
90
|
+
* tier — pending / error-with-retry / empty each REPLACE `children`, data renders them — while
|
|
91
|
+
* the header, the fold chevron and `summary` stay drawn throughout, so a section never blinks out
|
|
92
|
+
* of the page while it refetches.
|
|
93
|
+
*
|
|
94
|
+
* This is law C3's uniform container contract (`docs/CONTROLS-SPEC.md` §1): without it every
|
|
95
|
+
* caller re-derives the four-way switch `QueryState` exists to delete, and gets it wrong in the
|
|
96
|
+
* one direction that matters — "nothing here" printed over a 500.
|
|
97
|
+
*/
|
|
98
|
+
query?: QueryStateLike<unknown>
|
|
99
|
+
/**
|
|
100
|
+
* Copy for `query`'s EMPTY branch, rendered through `EmptyState` like every other one. Omit to
|
|
101
|
+
* render nothing when the result is empty — `QueryState`'s own contract, unchanged. Ignored
|
|
102
|
+
* without `query`.
|
|
103
|
+
*/
|
|
104
|
+
empty?: QueryEmptyCopy
|
|
105
|
+
/** Rendered in the header row, in its own `CtlSlot` — hidden while the section is collapsed. */
|
|
106
|
+
tabs?: ReactNode
|
|
107
|
+
/** Renders a chevron toggle in the header; the header stays drawn when closed, only `children`
|
|
108
|
+
* (and `tabs`) unmount. @default false */
|
|
109
|
+
collapsible?: boolean
|
|
110
|
+
/** Persists the fold state at `basalt:section:<persistKey>`. Omit for a local, unpersisted fold
|
|
111
|
+
* (`useState`). */
|
|
112
|
+
persistKey?: string
|
|
113
|
+
/** The fold state a section opens on, respected only while no persisted value exists — a section
|
|
114
|
+
* a reader has closed stays closed. `false` is what a long secondary block wants. @default true */
|
|
115
|
+
defaultOpen?: boolean
|
|
116
|
+
/** Rendered directly under the header and ALWAYS visible, collapsed or not: a collapsed section
|
|
117
|
+
* still states its headline figures, which is what makes collapsing it a real option. Keep it to
|
|
118
|
+
* one row — the body is what `children` is for. */
|
|
119
|
+
summary?: ReactNode
|
|
120
|
+
/** Turns the root into a scroll anchor (`id` + `scroll-margin-top` cleared for both sticky bars). */
|
|
121
|
+
id?: string
|
|
122
|
+
children: ReactNode
|
|
123
|
+
}
|
|
95
124
|
|
|
96
|
-
/**
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
125
|
+
/**
|
|
126
|
+
* ≤3 actions is C6 (docs/CONTROLS-SPEC.md §1) — the AST guard (`basalt/page-bar-budget`) lands in
|
|
127
|
+
* wave 6; this is the dev-only stopgap so the budget is visible before the lint rule exists.
|
|
128
|
+
*
|
|
129
|
+
* Returns the message rather than logging it, because it is a {@link useValidateProps} check now:
|
|
130
|
+
* it used to `console.warn` straight from the render body, which said it again on every keystroke
|
|
131
|
+
* that re-rendered the page. The title is IN the message on purpose — the dedup key is
|
|
132
|
+
* `${component} ${message}`, so two over-budget sections only both get heard because they name
|
|
133
|
+
* themselves.
|
|
134
|
+
*/
|
|
135
|
+
function actionBudgetMessage(title: string, actions: SlotActions): string | null {
|
|
136
|
+
// Both arms of the union are counted, and the typed one is counted EXACTLY: `Children.count` over
|
|
137
|
+
// a `BarAction[]` would report the array's length as one child.
|
|
138
|
+
const count = isBarActionList(actions) ? actions.length : Children.count(actions)
|
|
139
|
+
if (count <= 3) return null
|
|
140
|
+
return (
|
|
141
|
+
`${BASALT_PREFIX} Section "${title}": ${count} actions exceeds the ≤3 budget ` +
|
|
142
|
+
'(docs/CONTROLS-SPEC.md C6) — move the rest behind a menu.'
|
|
112
143
|
)
|
|
113
|
-
const [persistedOpen, setPersistedOpen] = usePersistedOpen()
|
|
114
|
-
|
|
115
|
-
if (persistKey !== undefined) return [persistedOpen, setPersistedOpen] as const
|
|
116
|
-
return [localOpen, setLocalOpen] as const
|
|
117
144
|
}
|
|
118
145
|
|
|
119
146
|
function ChevronToggle({
|
|
@@ -151,16 +178,9 @@ function ChevronToggle({
|
|
|
151
178
|
}
|
|
152
179
|
|
|
153
180
|
export function Section({
|
|
154
|
-
title,
|
|
155
|
-
icon,
|
|
156
|
-
subtitle,
|
|
157
|
-
info,
|
|
158
|
-
value,
|
|
159
|
-
delta,
|
|
160
|
-
deltaPeriod,
|
|
161
|
-
sparkline,
|
|
162
|
-
count,
|
|
163
181
|
actions,
|
|
182
|
+
query,
|
|
183
|
+
empty,
|
|
164
184
|
tabs,
|
|
165
185
|
collapsible = false,
|
|
166
186
|
persistKey,
|
|
@@ -168,17 +188,66 @@ export function Section({
|
|
|
168
188
|
summary,
|
|
169
189
|
id,
|
|
170
190
|
children,
|
|
191
|
+
className,
|
|
192
|
+
style,
|
|
193
|
+
classNames,
|
|
194
|
+
...headerProps
|
|
171
195
|
}: SectionProps) {
|
|
172
|
-
const
|
|
196
|
+
const { title } = headerProps
|
|
197
|
+
|
|
198
|
+
// Two dev-only checks, one hook — both are misuses that RENDER fine, which is what puts them in
|
|
199
|
+
// `useValidateProps` rather than in `assertRequiredProps`.
|
|
200
|
+
//
|
|
201
|
+
// 1. A `persistKey` with nothing to fold writes a localStorage key nobody ever reads back — the
|
|
202
|
+
// shape a consumer lands on after deleting `collapsible` and leaving the key behind.
|
|
203
|
+
// 2. More than three header actions (C6). This used to `console.warn` from the render body, so a
|
|
204
|
+
// page that re-rendered on every keystroke reprinted it every keystroke.
|
|
205
|
+
useValidateProps(
|
|
206
|
+
'Section',
|
|
207
|
+
() => [
|
|
208
|
+
persistKey !== undefined && !collapsible
|
|
209
|
+
? `${BASALT_PREFIX} Section "${title}": \`persistKey\` is set but \`collapsible\` is ` +
|
|
210
|
+
'false — there is no fold to persist. Add `collapsible`, or drop `persistKey`.'
|
|
211
|
+
: null,
|
|
212
|
+
actions === undefined ? null : actionBudgetMessage(title, actions),
|
|
213
|
+
],
|
|
214
|
+
[persistKey, collapsible, title, actions],
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
const [open, setOpen] = usePersistedOrLocal({
|
|
218
|
+
scope: 'section',
|
|
219
|
+
persistKey,
|
|
220
|
+
initial: defaultOpen,
|
|
221
|
+
})
|
|
173
222
|
const bodyId = useId()
|
|
223
|
+
// The aside decides, not the call site (law C1): a Section on the PageAside panel surface, or on
|
|
224
|
+
// its mobile sheet projection, renders the quiet `group` tier automatically — a Section never
|
|
225
|
+
// lives inside a pill FilterSet fold, so `'pill'` (the context default outside any provider) is
|
|
226
|
+
// the only surface that stays `section`.
|
|
227
|
+
const tier = useFilterSurface() === 'pill' ? 'section' : 'group'
|
|
174
228
|
|
|
175
|
-
|
|
229
|
+
// The anchor offset is Section's own, so the caller's `style` merges OVER it rather than
|
|
230
|
+
// replacing it — a consumer setting a margin must not silently drop the scroll offset.
|
|
231
|
+
//
|
|
232
|
+
// NO chrome height in this offset. An anchor scroll happens inside the SCROLLPORT, and since
|
|
233
|
+
// `AppShell.Main` became that box (`shell/app-main.module.css`) BOTH the app header and `PageBar`
|
|
234
|
+
// row 2's band are shell regions rendered outside it — counting either would land every `#anchor`
|
|
235
|
+
// that far below its own heading. What is left is breathing room, which is exactly what
|
|
236
|
+
// `--vx-space-sticky-header-clearance` means (tokens/palette.ts, `deriveSpacing`).
|
|
237
|
+
const anchorStyle =
|
|
238
|
+
id === undefined ? undefined : { scrollMarginTop: 'var(--vx-space-sticky-header-clearance)' }
|
|
239
|
+
const rootStyle =
|
|
240
|
+
anchorStyle === undefined && style === undefined ? undefined : { ...anchorStyle, ...style }
|
|
176
241
|
|
|
177
242
|
const headerActions =
|
|
178
243
|
tabs !== undefined || actions !== undefined || collapsible ? (
|
|
179
244
|
<>
|
|
180
245
|
{tabs !== undefined && open && <CtlSlot>{tabs}</CtlSlot>}
|
|
181
|
-
{actions !== undefined &&
|
|
246
|
+
{actions !== undefined && (
|
|
247
|
+
<CtlSlot>
|
|
248
|
+
<BarActionSlot actions={actions} />
|
|
249
|
+
</CtlSlot>
|
|
250
|
+
)}
|
|
182
251
|
{collapsible && (
|
|
183
252
|
<ChevronToggle open={open} onToggle={() => setOpen(!open)} controls={bodyId} />
|
|
184
253
|
)}
|
|
@@ -187,32 +256,30 @@ export function Section({
|
|
|
187
256
|
|
|
188
257
|
return (
|
|
189
258
|
<div
|
|
190
|
-
className={classes.root}
|
|
259
|
+
className={cx(classes.root, classNames?.root, className)}
|
|
260
|
+
data-tier={tier}
|
|
191
261
|
{...(id !== undefined && { id })}
|
|
192
|
-
{...(
|
|
193
|
-
style: {
|
|
194
|
-
scrollMarginTop:
|
|
195
|
-
'calc(var(--app-shell-header-height, 0px) + var(--basalt-page-bar-h, 0px))',
|
|
196
|
-
},
|
|
197
|
-
})}
|
|
262
|
+
{...(rootStyle !== undefined && { style: rootStyle })}
|
|
198
263
|
>
|
|
199
264
|
<WidgetHeader
|
|
200
|
-
tier=
|
|
201
|
-
|
|
202
|
-
{...(
|
|
203
|
-
{...(subtitle !== undefined && { subtitle })}
|
|
204
|
-
{...(info !== undefined && { info })}
|
|
205
|
-
{...(value !== undefined && { value })}
|
|
206
|
-
{...(delta !== undefined && { delta })}
|
|
207
|
-
{...(deltaPeriod !== undefined && { deltaPeriod })}
|
|
208
|
-
{...(sparkline !== undefined && { sparkline })}
|
|
209
|
-
{...(count !== undefined && { count })}
|
|
265
|
+
tier={tier}
|
|
266
|
+
{...headerProps}
|
|
267
|
+
{...(classNames?.header !== undefined && { className: classNames.header })}
|
|
210
268
|
{...(headerActions !== undefined && { actions: headerActions })}
|
|
211
269
|
/>
|
|
212
270
|
{summary !== undefined && <div className={classes.summary}>{summary}</div>}
|
|
213
271
|
{open && (
|
|
214
|
-
<div id={bodyId} className={classes.body}>
|
|
215
|
-
{
|
|
272
|
+
<div id={bodyId} className={cx(classes.body, classNames?.body)}>
|
|
273
|
+
{query === undefined ? (
|
|
274
|
+
children
|
|
275
|
+
) : (
|
|
276
|
+
// `tier="section"` is the compact one: a bare spinner rather than a 64px centred
|
|
277
|
+
// block, and the error alert without the page-level stack around it. A Section IS the
|
|
278
|
+
// region, so the state belongs inside its body, never around its header.
|
|
279
|
+
<QueryState query={query} tier="section" {...(empty !== undefined && { empty })}>
|
|
280
|
+
{children}
|
|
281
|
+
</QueryState>
|
|
282
|
+
)}
|
|
216
283
|
</div>
|
|
217
284
|
)}
|
|
218
285
|
</div>
|
|
@@ -6,8 +6,11 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { ReactNode } from 'react'
|
|
8
8
|
|
|
9
|
-
/**
|
|
10
|
-
*
|
|
9
|
+
/**
|
|
10
|
+
* Badge tone for a role/plan chip. A different member set from `common`'s `Tone` (`common/props.ts`,
|
|
11
|
+
* audit A13) — `'neutral' | 'brand'` have no `Tone` equivalent — so this stays its own type rather
|
|
12
|
+
* than an alias; see `Tone` for the base three-tone vocabulary the rest of the framework shares.
|
|
13
|
+
*/
|
|
11
14
|
export type AccountBadgeTone = 'neutral' | 'brand' | 'success' | 'warn'
|
|
12
15
|
|
|
13
16
|
/** The signed-in user's identity. `image` is nullable and currently unused by `SidebarAccount`
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The header's leading zone (docs/DESIGN-SPEC.md §5). Moved here from `app-sidebar.module.css`
|
|
3
|
+
* verbatim — the brand did not change, only where it is painted.
|
|
4
|
+
*
|
|
5
|
+
* NO border and no background: the zone is part of the header row, so the header's own
|
|
6
|
+
* `AppShell.Header` region seam is the only line under it. The sidebar column below now starts
|
|
7
|
+
* directly with `SidebarSearch`.
|
|
8
|
+
*
|
|
9
|
+
* The zone's WIDTH is `--app-shell-navbar-offset`, so it tracks the rail collapse with no React
|
|
10
|
+
* state and lands its trailing edge exactly on the sidebar|main seam. The negative
|
|
11
|
+
* `margin-inline-start` cancels `AppShell.Header`'s own `px` inset so the zone starts at the
|
|
12
|
+
* viewport edge and re-applies that inset as padding — which is what puts the brand lead on the
|
|
13
|
+
* same x as the sidebar rows below it.
|
|
14
|
+
*/
|
|
15
|
+
.zone {
|
|
16
|
+
flex: 0 0 var(--app-shell-navbar-offset, 0rem);
|
|
17
|
+
width: var(--app-shell-navbar-offset, 0rem);
|
|
18
|
+
min-width: 0;
|
|
19
|
+
display: flex;
|
|
20
|
+
align-items: center;
|
|
21
|
+
/* The full header row, not just the toggle's own 28px — so the zone's box is the band it looks
|
|
22
|
+
* like, and the rail's centred toggle centres against the whole row. */
|
|
23
|
+
align-self: stretch;
|
|
24
|
+
margin-inline-start: calc(-1 * var(--app-shell-padding, 0px));
|
|
25
|
+
padding-inline: var(--app-shell-padding, 0px);
|
|
26
|
+
overflow: hidden;
|
|
27
|
+
/* Mantine's own AppShell timing, so the zone and the navbar under it move as one box. */
|
|
28
|
+
transition-property: flex-basis, width;
|
|
29
|
+
transition-duration: var(--app-shell-transition-duration);
|
|
30
|
+
transition-timing-function: var(--app-shell-transition-timing-function);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* Below `sm` there is no navbar at all (the bottom bar is the whole nav), so the zone would be a
|
|
34
|
+
* zero-width box holding a hidden toggle. The breadcrumb owns the phone header's lead. */
|
|
35
|
+
@media (max-width: 47.99375em) {
|
|
36
|
+
.zone {
|
|
37
|
+
display: none;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.brand {
|
|
42
|
+
justify-content: space-between;
|
|
43
|
+
align-items: center;
|
|
44
|
+
flex: 1 1 auto;
|
|
45
|
+
min-width: 0;
|
|
46
|
+
height: 100%;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.brandLead {
|
|
50
|
+
min-width: 0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* Brand name — head font at stretch 88% (docs/DESIGN-SPEC.md §3); the 18px/550 land as `fz`/`fw`
|
|
54
|
+
* props (inline, deterministic against Mantine's own Text base rule). */
|
|
55
|
+
.brandName {
|
|
56
|
+
font-family: var(--basalt-font-head);
|
|
57
|
+
font-stretch: 88%;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* Workspace switcher (`brand.menu`) — the brand name plus a chevron, as a row-shaped trigger. The
|
|
61
|
+
* chevron is faint until hover so the brand still reads as the brand, not as a control. */
|
|
62
|
+
.brandButton {
|
|
63
|
+
display: flex;
|
|
64
|
+
align-items: center;
|
|
65
|
+
gap: var(--vx-space-sidebar-section-label-gap);
|
|
66
|
+
min-width: 0;
|
|
67
|
+
padding: 0;
|
|
68
|
+
color: var(--vx-faint);
|
|
69
|
+
cursor: pointer;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.brandButton:hover {
|
|
73
|
+
color: var(--vx-ink);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/*
|
|
77
|
+
* Icon-only ghost button in shell chrome (the collapse toggle) — docs/DESIGN-SPEC.md §5:
|
|
78
|
+
* transparent, faint icon, hover ink-6% + ink, radius 6. `!important` because it competes with
|
|
79
|
+
* Mantine's own compiled ActionIcon variant CSS. This is the one copy — `sidebar-search.module.css`
|
|
80
|
+
* mirrors it rather than keeping its own duplicate.
|
|
81
|
+
*/
|
|
82
|
+
.ghostIcon {
|
|
83
|
+
color: var(--vx-faint) !important;
|
|
84
|
+
border-radius: var(--vx-radius-ctrl) !important;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.ghostIcon:hover {
|
|
88
|
+
background-color: color-mix(in srgb, var(--vx-ink) 6%, transparent) !important;
|
|
89
|
+
color: var(--vx-ink) !important;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/*
|
|
93
|
+
* The rail form, mirroring exactly what the sidebar's own brand row did when collapsed: the lead
|
|
94
|
+
* (logo + name) hides and the toggle centres. The zone drops its inset so the toggle's centre lands
|
|
95
|
+
* on the rail's icon column rather than 13px right of it.
|
|
96
|
+
*/
|
|
97
|
+
@media (min-width: 48em) {
|
|
98
|
+
.zone[data-collapsed] {
|
|
99
|
+
padding-inline: 0;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.zone[data-collapsed] .brand {
|
|
103
|
+
justify-content: center;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.zone[data-collapsed] .brandLead {
|
|
107
|
+
display: none;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -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. HAND-MAINTAINED:
|
|
4
|
+
* there is no generator, so a new class in `app-brand.module.css` must be added here too.
|
|
5
|
+
*/
|
|
6
|
+
declare const classes: {
|
|
7
|
+
readonly zone: string
|
|
8
|
+
readonly brand: string
|
|
9
|
+
readonly brandLead: string
|
|
10
|
+
readonly brandName: string
|
|
11
|
+
readonly brandButton: string
|
|
12
|
+
readonly ghostIcon: string
|
|
13
|
+
}
|
|
14
|
+
export default classes
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `AppBrand` — the brand identity plus the sidebar-collapse toggle, rendered as the HEADER's
|
|
3
|
+
* leading zone.
|
|
4
|
+
*
|
|
5
|
+
* It used to be the sidebar's own first row, an `appShellHeaderHeight` band under `layout="alt"`
|
|
6
|
+
* where the header was inset beside the navbar and the two bands sat side by side. With the header
|
|
7
|
+
* spanning the full viewport width, that band became a SECOND 48px row painted under the header
|
|
8
|
+
* seam — two horizontal rules where the design has one. So the markup moved up into the header,
|
|
9
|
+
* unchanged: same `BrandConfig`, same `brand.menu` workspace switcher, same collapse toggle, same
|
|
10
|
+
* rail behaviour (the lead hides, the toggle centres).
|
|
11
|
+
*
|
|
12
|
+
* It is internal — `BasaltShell` is the only mount. `AppSidebar` still takes `brand` because
|
|
13
|
+
* `brand.version` labels its settings footer; it simply no longer paints the row.
|
|
14
|
+
*/
|
|
15
|
+
import { ActionIcon, Group, Menu, Text, UnstyledButton } from '@mantine/core'
|
|
16
|
+
import { cx } from '../common/props'
|
|
17
|
+
import type { BasaltProps } from '../common/props'
|
|
18
|
+
import type { AccountMenuItem } from './account-types'
|
|
19
|
+
import type { BrandConfig } from './index'
|
|
20
|
+
import { IconChevron } from './sidebar-blocks'
|
|
21
|
+
import { VX } from '../tokens'
|
|
22
|
+
import { useBasaltSpacing } from '../theme'
|
|
23
|
+
import classes from './app-brand.module.css'
|
|
24
|
+
|
|
25
|
+
/** Inline collapse/expand chevrons — keeps the shell icon-dependency-free. */
|
|
26
|
+
function IconCollapse({ collapsed }: { collapsed: boolean }) {
|
|
27
|
+
return (
|
|
28
|
+
<svg
|
|
29
|
+
width={18}
|
|
30
|
+
height={18}
|
|
31
|
+
viewBox="0 0 24 24"
|
|
32
|
+
fill="none"
|
|
33
|
+
stroke="currentColor"
|
|
34
|
+
strokeWidth={2}
|
|
35
|
+
strokeLinecap="round"
|
|
36
|
+
strokeLinejoin="round"
|
|
37
|
+
aria-hidden
|
|
38
|
+
>
|
|
39
|
+
<path d="M4 4h16v16H4z" />
|
|
40
|
+
<path d="M9 4v16" />
|
|
41
|
+
{collapsed ? <path d="M14 9l3 3l-3 3" /> : <path d="M16 9l-3 3l3 3" />}
|
|
42
|
+
</svg>
|
|
43
|
+
)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The brand name, and — when `brand.menu` is supplied — the workspace switcher it becomes.
|
|
48
|
+
*
|
|
49
|
+
* The entries are `AccountMenuItem`s: the shell already had exactly this row shape (label, icon,
|
|
50
|
+
* onClick, danger) for the account menu, and a second vocabulary for the same dropdown would be
|
|
51
|
+
* two things to keep in step for no gain. The chevron is inline text, not an icon dependency.
|
|
52
|
+
*/
|
|
53
|
+
function BrandName({
|
|
54
|
+
brand,
|
|
55
|
+
menuWidth,
|
|
56
|
+
}: {
|
|
57
|
+
brand: BrandConfig & { menu?: AccountMenuItem[] }
|
|
58
|
+
menuWidth: number
|
|
59
|
+
}) {
|
|
60
|
+
const label = (
|
|
61
|
+
<Text className={classes.brandName} fz={VX.text.xl} fw={550}>
|
|
62
|
+
{brand.name}
|
|
63
|
+
</Text>
|
|
64
|
+
)
|
|
65
|
+
const menu = brand.menu
|
|
66
|
+
if (menu === undefined || menu.length === 0) return label
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<Menu position="bottom-start" withArrow width={menuWidth} zIndex={500}>
|
|
70
|
+
<Menu.Target>
|
|
71
|
+
<UnstyledButton className={classes.brandButton} aria-label={`${brand.name} workspace`}>
|
|
72
|
+
{label}
|
|
73
|
+
{/* `open` is the DOWN glyph — a switcher's affordance points at its dropdown, and this is
|
|
74
|
+
the same chevron every fold in the sidebar uses rather than a second one. */}
|
|
75
|
+
<IconChevron open />
|
|
76
|
+
</UnstyledButton>
|
|
77
|
+
</Menu.Target>
|
|
78
|
+
<Menu.Dropdown>
|
|
79
|
+
{menu.map((entry) => (
|
|
80
|
+
<Menu.Item
|
|
81
|
+
key={entry.key}
|
|
82
|
+
leftSection={entry.icon}
|
|
83
|
+
{...(entry.danger === true && { color: 'red' })}
|
|
84
|
+
onClick={entry.onClick}
|
|
85
|
+
>
|
|
86
|
+
{entry.label}
|
|
87
|
+
</Menu.Item>
|
|
88
|
+
))}
|
|
89
|
+
</Menu.Dropdown>
|
|
90
|
+
</Menu>
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export type AppBrandProps = BasaltProps & {
|
|
95
|
+
brand: BrandConfig & { menu?: AccountMenuItem[] }
|
|
96
|
+
/** Desktop rail state — the zone narrows with the navbar and shows the toggle alone. */
|
|
97
|
+
collapsed: boolean
|
|
98
|
+
onToggleCollapse: () => void
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function AppBrand({ brand, collapsed, onToggleCollapse, className, style }: AppBrandProps) {
|
|
102
|
+
// Density-tracking Menu dropdown width, read at the ACTIVE resolved level — same reason
|
|
103
|
+
// `AppSidebar` reads it rather than the frozen level-0 constant (`tokens/palette.ts`).
|
|
104
|
+
const { step } = useBasaltSpacing()
|
|
105
|
+
return (
|
|
106
|
+
<Group
|
|
107
|
+
className={cx(classes.brand, className)}
|
|
108
|
+
gap="sm"
|
|
109
|
+
wrap="nowrap"
|
|
110
|
+
{...(style !== undefined && { style })}
|
|
111
|
+
>
|
|
112
|
+
<Group className={classes.brandLead} gap="sm" wrap="nowrap">
|
|
113
|
+
{brand.logoSrc && (
|
|
114
|
+
<img
|
|
115
|
+
src={brand.logoSrc}
|
|
116
|
+
alt={brand.logoAlt ?? brand.name}
|
|
117
|
+
width={26}
|
|
118
|
+
height={26}
|
|
119
|
+
style={{ display: 'block' }}
|
|
120
|
+
/>
|
|
121
|
+
)}
|
|
122
|
+
<BrandName brand={brand} menuWidth={step.sidebarAccountMenuWidth} />
|
|
123
|
+
</Group>
|
|
124
|
+
<ActionIcon
|
|
125
|
+
variant="subtle"
|
|
126
|
+
// A numeric size, not the named `"md"` — same opt-out as `connectivity-indicator.tsx`'s
|
|
127
|
+
// toolbar icon (see that comment): this is a plain collapse-toggle icon, not a control meant
|
|
128
|
+
// to match a `size="md"` Input/Button, so it must not pick up the theme's `ActionIcon.extend`
|
|
129
|
+
// control-height override. Reproduces Mantine's own static `--ai-size-md` (28px).
|
|
130
|
+
size={28}
|
|
131
|
+
visibleFrom="sm"
|
|
132
|
+
className={classes.ghostIcon}
|
|
133
|
+
onClick={onToggleCollapse}
|
|
134
|
+
aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}
|
|
135
|
+
>
|
|
136
|
+
<IconCollapse collapsed={collapsed} />
|
|
137
|
+
</ActionIcon>
|
|
138
|
+
</Group>
|
|
139
|
+
)
|
|
140
|
+
}
|
|
@@ -14,6 +14,7 @@ import { Anchor, Group, Text } from '@mantine/core'
|
|
|
14
14
|
import type { CSSProperties } from 'react'
|
|
15
15
|
import type { NavAnchor } from '../nav/types'
|
|
16
16
|
import { VX } from '../tokens'
|
|
17
|
+
import type { BasaltProps } from '../common/props'
|
|
17
18
|
import classes from './app-header.module.css'
|
|
18
19
|
|
|
19
20
|
/** Parent/section crumbs — faint. */
|
|
@@ -31,13 +32,7 @@ const currentStyle: CSSProperties = {
|
|
|
31
32
|
color: 'var(--vx-ink)',
|
|
32
33
|
}
|
|
33
34
|
|
|
34
|
-
export
|
|
35
|
-
section,
|
|
36
|
-
parent,
|
|
37
|
-
parentAnchor,
|
|
38
|
-
parentHref,
|
|
39
|
-
page,
|
|
40
|
-
}: {
|
|
35
|
+
export type AppBreadcrumbsProps = BasaltProps & {
|
|
41
36
|
section?: string
|
|
42
37
|
/** Parent item label — shown when the active page is a nested child (e.g. "Dashboard"). */
|
|
43
38
|
parent?: string | undefined
|
|
@@ -49,10 +44,25 @@ export function AppBreadcrumbs({
|
|
|
49
44
|
/** Parent item href — the no-router fallback; ignored when `parentAnchor` is present. */
|
|
50
45
|
parentHref?: string | undefined
|
|
51
46
|
page?: string
|
|
52
|
-
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function AppBreadcrumbs({
|
|
50
|
+
section,
|
|
51
|
+
parent,
|
|
52
|
+
parentAnchor,
|
|
53
|
+
parentHref,
|
|
54
|
+
page,
|
|
55
|
+
className,
|
|
56
|
+
style,
|
|
57
|
+
}: AppBreadcrumbsProps) {
|
|
53
58
|
if (!page) return null
|
|
54
59
|
return (
|
|
55
|
-
<Group
|
|
60
|
+
<Group
|
|
61
|
+
gap={6}
|
|
62
|
+
wrap="nowrap"
|
|
63
|
+
{...(className !== undefined && { className })}
|
|
64
|
+
style={{ minWidth: 0, ...style }}
|
|
65
|
+
>
|
|
56
66
|
{/*
|
|
57
67
|
The ANCESTOR crumbs, in one box so CSS can drop them below `sm` — law C9's swap, owned by the
|
|
58
68
|
component, no JS media query and no first-paint flash. On a phone the header row is the
|