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/shell/page-bar.tsx
CHANGED
|
@@ -7,10 +7,11 @@
|
|
|
7
7
|
* - **Inside `BasaltShell`** row 1 (`actions`, `sync`) portals into the existing 48px app-shell
|
|
8
8
|
* header — the same slot/portal mechanism `PageActions` used through 1.25.0, which this replaces.
|
|
9
9
|
* The breadcrumb stays the header's lead, so `title` is ignored. Row 2 (`tabs`, `filters`,
|
|
10
|
-
* `filtersEnd`)
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
10
|
+
* `filtersEnd`) portals into a shell-owned band between the header and the scrollport
|
|
11
|
+
* (`PageBarBandOutlet`, mounted once by `BasaltShell`) — it is never in-flow or sticky inside the
|
|
12
|
+
* scrollport itself, since the band already sits outside it. The outlet renders unconditionally
|
|
13
|
+
* as a zero-height, seam-less box while no page claims it (law C14), so an empty home costs
|
|
14
|
+
* nothing.
|
|
14
15
|
* - **Without a shell** both rows render in-flow, sticky at the top of the document, with
|
|
15
16
|
* `title` + `icon` leading row 1 — the page title is the bar's job when there is no breadcrumb
|
|
16
17
|
* (law C8). The published height then covers the whole bar, since that is what content clears.
|
|
@@ -21,31 +22,53 @@
|
|
|
21
22
|
* Originally extracted from argo's `apps/dashboard/src/components/app-shell/page-header.tsx`;
|
|
22
23
|
* linewatch's `page-header.tsx` measure-and-publish effect became the framework behaviour below.
|
|
23
24
|
*/
|
|
24
|
-
import {
|
|
25
|
-
|
|
26
|
-
useCallback,
|
|
27
|
-
useContext,
|
|
28
|
-
useEffect,
|
|
29
|
-
useLayoutEffect,
|
|
30
|
-
useRef,
|
|
31
|
-
useState,
|
|
32
|
-
} from 'react'
|
|
33
|
-
import type { ReactNode, RefObject } from 'react'
|
|
25
|
+
import { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react'
|
|
26
|
+
import type { ReactNode } from 'react'
|
|
34
27
|
import { createPortal } from 'react-dom'
|
|
28
|
+
import { cx } from '../common/props'
|
|
29
|
+
import type { BasaltProps, SlotStylesProps } from '../common/props'
|
|
35
30
|
import { CtlSlot } from '../theme'
|
|
36
31
|
import { BarActionRow, BarExtrasProvider, globalActionAsBarAction } from '../controls/actions'
|
|
32
|
+
import { FilterPill } from '../controls/filter-pill'
|
|
33
|
+
import { FilterSheet } from '../controls/filter-sheet'
|
|
37
34
|
import { SyncButton } from '../controls/sync-button'
|
|
38
35
|
import type { ActionGroupProps, BarAction, GlobalAction } from '../controls/actions'
|
|
39
36
|
import type { SyncButtonProps } from '../controls/sync-button'
|
|
37
|
+
import { useIsomorphicLayoutEffect } from './isomorphic-layout-effect'
|
|
40
38
|
import classes from './page-bar.module.css'
|
|
39
|
+
import asideClasses from './page-aside.module.css'
|
|
41
40
|
|
|
42
41
|
/** The custom property row 2's measured height is published on. */
|
|
43
42
|
export const PAGE_BAR_HEIGHT_VAR = '--basalt-page-bar-h'
|
|
44
43
|
|
|
44
|
+
/**
|
|
45
|
+
* What a `PageAside` publishes when it projects itself into row 2 below `sm`
|
|
46
|
+
* (`docs/ASIDE-SPEC.md` §0 "Desktop and mobile are one declaration"). Metadata only — the aside's
|
|
47
|
+
* CHILDREN never travel through this context: they are portalled into the sheet's own node
|
|
48
|
+
* ({@link PageBarSlots.panelTarget}), because a `ReactNode` in state would be a fresh object on
|
|
49
|
+
* every parent render and the claim effect would loop.
|
|
50
|
+
*/
|
|
51
|
+
export type AsidePanelClaim = {
|
|
52
|
+
/** The aside's `title` — the pill's accessible name and the sheet's heading. */
|
|
53
|
+
readonly title: string
|
|
54
|
+
/** The aside's own glyph, supplied by the claimant so this module owns no aside iconography. */
|
|
55
|
+
readonly icon: ReactNode
|
|
56
|
+
}
|
|
57
|
+
|
|
45
58
|
type PageBarSlots = {
|
|
46
59
|
/** The header node row 1 portals into. `null` outside a shell, and until the outlet mounts. */
|
|
47
60
|
target: HTMLElement | null
|
|
48
61
|
setTarget: (el: HTMLElement | null) => void
|
|
62
|
+
/**
|
|
63
|
+
* The BAND node row 2 portals into — a shell-owned box between the header and the scrollport.
|
|
64
|
+
* Same mechanism as `target` one region down, and it exists for the same reason: where a row
|
|
65
|
+
* renders must not depend on where the consumer wrote `<PageBar>` in its page tree. Row 2 used to
|
|
66
|
+
* render in flow at the top of Main and stick there, which meant a bar nested inside a `Stack`
|
|
67
|
+
* (every real page) had `position: sticky` clamped to that wrapper and sat one shell padding low.
|
|
68
|
+
* `null` outside a shell, and until the outlet mounts.
|
|
69
|
+
*/
|
|
70
|
+
bandTarget: HTMLElement | null
|
|
71
|
+
setBandTarget: (el: HTMLElement | null) => void
|
|
49
72
|
/** True only under `BasaltShell` — the provider is shell-internal, so the context IS the probe. */
|
|
50
73
|
inShell: boolean
|
|
51
74
|
/** Shell `globalActions` marked `mobile: 'more'`, already shaped as kebab rows. */
|
|
@@ -53,15 +76,34 @@ type PageBarSlots = {
|
|
|
53
76
|
/** How many page kebabs are mounted. `> 0` means the shell must not render one of its own. */
|
|
54
77
|
kebabClaims: number
|
|
55
78
|
claimKebab: () => () => void
|
|
79
|
+
/** True while a mounted `PageBar` is rendering a row 2 — the row that can host the aside's pill.
|
|
80
|
+
* Without one the aside keeps its in-flow mobile form; there is nowhere to put the trigger. */
|
|
81
|
+
panelHost: boolean
|
|
82
|
+
claimPanelHost: () => () => void
|
|
83
|
+
/** The projecting aside, or `null`. At most one — the aside region holds one page at a time. */
|
|
84
|
+
panel: AsidePanelClaim | null
|
|
85
|
+
claimPanel: (panel: AsidePanelClaim) => () => void
|
|
86
|
+
/** The node inside the open panel sheet the aside's children portal into. `null` while closed —
|
|
87
|
+
* the Drawer unmounts its body, which is what keeps ONE node mounted at a time (law C9). */
|
|
88
|
+
panelTarget: HTMLElement | null
|
|
89
|
+
setPanelTarget: (el: HTMLElement | null) => void
|
|
56
90
|
}
|
|
57
91
|
|
|
58
92
|
const NO_SLOTS: PageBarSlots = {
|
|
59
93
|
target: null,
|
|
60
94
|
setTarget: () => {},
|
|
95
|
+
bandTarget: null,
|
|
96
|
+
setBandTarget: () => {},
|
|
61
97
|
inShell: false,
|
|
62
98
|
mobileMoreActions: [],
|
|
63
99
|
kebabClaims: 0,
|
|
64
100
|
claimKebab: () => () => {},
|
|
101
|
+
panelHost: false,
|
|
102
|
+
claimPanelHost: () => () => {},
|
|
103
|
+
panel: null,
|
|
104
|
+
claimPanel: () => () => {},
|
|
105
|
+
panelTarget: null,
|
|
106
|
+
setPanelTarget: () => {},
|
|
65
107
|
}
|
|
66
108
|
|
|
67
109
|
const PageBarContext = createContext<PageBarSlots>(NO_SLOTS)
|
|
@@ -78,13 +120,32 @@ export function PageBarProvider({
|
|
|
78
120
|
children: ReactNode
|
|
79
121
|
}): ReactNode {
|
|
80
122
|
const [target, setTarget] = useState<HTMLElement | null>(null)
|
|
123
|
+
const [bandTarget, setBandTarget] = useState<HTMLElement | null>(null)
|
|
81
124
|
const [kebabClaims, setKebabClaims] = useState(0)
|
|
125
|
+
const [panelHostClaims, setPanelHostClaims] = useState(0)
|
|
126
|
+
const [panel, setPanel] = useState<AsidePanelClaim | null>(null)
|
|
127
|
+
const [panelTarget, setPanelTarget] = useState<HTMLElement | null>(null)
|
|
82
128
|
|
|
83
129
|
const claimKebab = useCallback(() => {
|
|
84
130
|
setKebabClaims((n) => n + 1)
|
|
85
131
|
return () => setKebabClaims((n) => n - 1)
|
|
86
132
|
}, [])
|
|
87
133
|
|
|
134
|
+
const claimPanelHost = useCallback(() => {
|
|
135
|
+
setPanelHostClaims((n) => n + 1)
|
|
136
|
+
return () => setPanelHostClaims((n) => n - 1)
|
|
137
|
+
}, [])
|
|
138
|
+
|
|
139
|
+
// Identity-checked on release, not an unconditional `null`: two asides never coexist, but a route
|
|
140
|
+
// change can mount the next one's claim before the previous one's cleanup runs, and clearing
|
|
141
|
+
// blindly there would drop the live claim.
|
|
142
|
+
const claimPanel = useCallback((next: AsidePanelClaim) => {
|
|
143
|
+
setPanel(next)
|
|
144
|
+
return () => {
|
|
145
|
+
setPanel((current) => (current === next ? null : current))
|
|
146
|
+
}
|
|
147
|
+
}, [])
|
|
148
|
+
|
|
88
149
|
const mobileMoreActions = globalActions
|
|
89
150
|
.filter((action, index) => (action.mobile ?? (index < 2 ? 'bar' : 'more')) === 'more')
|
|
90
151
|
.map(globalActionAsBarAction)
|
|
@@ -92,10 +153,18 @@ export function PageBarProvider({
|
|
|
92
153
|
const value: PageBarSlots = {
|
|
93
154
|
target,
|
|
94
155
|
setTarget,
|
|
156
|
+
bandTarget,
|
|
157
|
+
setBandTarget,
|
|
95
158
|
inShell: true,
|
|
96
159
|
mobileMoreActions,
|
|
97
160
|
kebabClaims,
|
|
98
161
|
claimKebab,
|
|
162
|
+
panelHost: panelHostClaims > 0,
|
|
163
|
+
claimPanelHost,
|
|
164
|
+
panel,
|
|
165
|
+
claimPanel,
|
|
166
|
+
panelTarget,
|
|
167
|
+
setPanelTarget,
|
|
99
168
|
}
|
|
100
169
|
|
|
101
170
|
return (
|
|
@@ -111,75 +180,122 @@ export function PageBarOutlet({ className }: { className?: string }) {
|
|
|
111
180
|
return <div ref={setTarget} className={className} />
|
|
112
181
|
}
|
|
113
182
|
|
|
183
|
+
/**
|
|
184
|
+
* Internal — the BAND between the header and the scrollport that the active page's row 2 portals
|
|
185
|
+
* into. `BasaltShell` mounts exactly one.
|
|
186
|
+
*
|
|
187
|
+
* It is rendered unconditionally and is a zero-height, seam-less box while no `PageBar` claims it:
|
|
188
|
+
* law C14 says an empty home renders nothing, and an outlet that only existed once something was
|
|
189
|
+
* inside it could not be a portal target in the first place. The `:empty` seam rule in
|
|
190
|
+
* `app-main.module.css` is what makes "nothing mounted" and "nothing painted" the same state.
|
|
191
|
+
*/
|
|
192
|
+
export function PageBarBandOutlet({ className }: { className?: string }) {
|
|
193
|
+
const { setBandTarget } = useContext(PageBarContext)
|
|
194
|
+
return <div ref={setBandTarget} className={className} />
|
|
195
|
+
}
|
|
196
|
+
|
|
114
197
|
/** Internal — `true` while a page's `ActionGroup` owns the header's one mobile kebab. */
|
|
115
198
|
export function usePageKebabClaimed(): boolean {
|
|
116
199
|
return useContext(PageBarContext).kebabClaims > 0
|
|
117
200
|
}
|
|
118
201
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
/** Right-aligned row-2 actions ("Manage metrics"). */
|
|
132
|
-
filtersEnd?: BarAction[]
|
|
133
|
-
/** One `ViewTabs`. */
|
|
134
|
-
tabs?: ReactNode
|
|
135
|
-
/**
|
|
136
|
-
* Added to the bar's ROOT — the shell-less `<div data-basalt-page-bar="standalone">`, or row 2's
|
|
137
|
-
* sticky wrapper (`data-basalt-page-bar="shell"`) inside a `BasaltShell`. The seam for the two
|
|
138
|
-
* things only the consumer's own layout knows: bleeding the sticky bar across its container's
|
|
139
|
-
* gutters (`margin-inline: calc(var(--gutter) * -1); padding-inline: var(--gutter)`) and drawing
|
|
140
|
-
* a hairline under it (`border-bottom: 1px solid var(--vx-border)`).
|
|
141
|
-
*
|
|
142
|
-
* Scope that CSS through this class, not through a global `[data-basalt-page-bar]` selector: the
|
|
143
|
-
* data attributes are stable enough to READ (a shell-less consumer can style
|
|
144
|
-
* `[data-basalt-page-bar="standalone"]` in a pinch, and this doc is the promise that the value
|
|
145
|
-
* stays), but a global rule reaches every page in the app including the ones that want neither.
|
|
146
|
-
*/
|
|
147
|
-
className?: string
|
|
202
|
+
/**
|
|
203
|
+
* Internal — the seam `PageAside` projects itself through below `sm` (`docs/ASIDE-SPEC.md` §0).
|
|
204
|
+
* `host` says whether there is a row 2 to hang the pill off at all; `claim` publishes the aside's
|
|
205
|
+
* title and glyph; `target` is the node inside the opened sheet its children portal into.
|
|
206
|
+
*/
|
|
207
|
+
export function useAsidePanelSlot(): {
|
|
208
|
+
host: boolean
|
|
209
|
+
claim: (panel: AsidePanelClaim) => () => void
|
|
210
|
+
target: HTMLElement | null
|
|
211
|
+
} {
|
|
212
|
+
const { panelHost, claimPanel, panelTarget } = useContext(PageBarContext)
|
|
213
|
+
return { host: panelHost, claim: claimPanel, target: panelTarget }
|
|
148
214
|
}
|
|
149
215
|
|
|
150
216
|
/**
|
|
151
|
-
* `
|
|
152
|
-
*
|
|
153
|
-
*
|
|
217
|
+
* The boxes `PageBar` paints (`common/props.ts`). `root` is whichever element is the bar's own
|
|
218
|
+
* outer node for the active mode — the shell-less standalone bar, or row 2's wrapper inside the
|
|
219
|
+
* shell's band (row 1 portals into the app-shell header and has no wrapper of PageBar's own,
|
|
220
|
+
* which is what `row1`/`row2` target directly).
|
|
221
|
+
*
|
|
222
|
+
* `className`/`classNames.root` land on that same root — the shell-less
|
|
223
|
+
* `<div data-basalt-page-bar="standalone">`, or row 2's band wrapper
|
|
224
|
+
* (`data-basalt-page-bar="shell"`) inside a `BasaltShell`. The one thing only the consumer's own
|
|
225
|
+
* layout knows is bleeding the sticky bar across its container's gutters
|
|
226
|
+
* (`margin-inline: calc(var(--gutter) * -1); padding-inline: var(--gutter)`) for the shell-less
|
|
227
|
+
* form. Scope that CSS through this class, not through a global `[data-basalt-page-bar]` selector:
|
|
228
|
+
* the data attributes are stable enough to READ (a shell-less consumer can style
|
|
229
|
+
* `[data-basalt-page-bar="standalone"]` in a pinch, and this doc is the promise that the value
|
|
230
|
+
* stays), but a global rule reaches every page in the app including the ones that want neither.
|
|
154
231
|
*/
|
|
155
|
-
|
|
232
|
+
export type PageBarSlot = 'root' | 'row1' | 'row2'
|
|
233
|
+
|
|
234
|
+
export type PageBarProps = BasaltProps &
|
|
235
|
+
SlotStylesProps<PageBarSlot> & {
|
|
236
|
+
/**
|
|
237
|
+
* Read only when there is no `BasaltShell` outlet (a shell-less app such as linewatch). Inside a
|
|
238
|
+
* shell the breadcrumb names the page and this is ignored.
|
|
239
|
+
*/
|
|
240
|
+
title?: string
|
|
241
|
+
icon?: ReactNode
|
|
242
|
+
actions?: ActionGroupProps
|
|
243
|
+
/** `scope` is fixed to `'page'` — a global sync belongs in the shell's `globalActions` (law C12). */
|
|
244
|
+
sync?: Omit<SyncButtonProps, 'scope'>
|
|
245
|
+
/** `FilterSet` descendants only (law C1). */
|
|
246
|
+
filters?: ReactNode
|
|
247
|
+
/** Right-aligned row-2 actions ("Manage metrics"). */
|
|
248
|
+
filtersEnd?: BarAction[]
|
|
249
|
+
/** One `ViewTabs`. */
|
|
250
|
+
tabs?: ReactNode
|
|
251
|
+
}
|
|
156
252
|
|
|
157
253
|
/**
|
|
158
254
|
* Publishes an element's measured height as a custom property on `documentElement`.
|
|
159
255
|
*
|
|
160
|
-
* **A LAYOUT effect, and a
|
|
161
|
-
* property
|
|
162
|
-
* frame in which a cold load of `/page#anchor` has already scrolled
|
|
163
|
-
*
|
|
164
|
-
*
|
|
256
|
+
* **A LAYOUT effect, and a CALLBACK REF keyed into the effect.** The layout effect is what puts the
|
|
257
|
+
* property in place before the FIRST paint: a passive effect publishes it one frame later, which is
|
|
258
|
+
* a frame in which a cold load of `/page#anchor` has already scrolled past its heading.
|
|
259
|
+
*
|
|
260
|
+
* The callback ref replaced a plain `RefObject`, and the reason is the row-2 portal. A `RefObject`
|
|
261
|
+
* is not a dependency, so the effect ran ONCE — on the commit where `active` became true — and read
|
|
262
|
+
* whatever `ref.current` held at that instant. In a shell that is `null`: the band outlet publishes
|
|
263
|
+
* its node through state, so row 2 has no target to portal into until the SECOND commit, by which
|
|
264
|
+
* time `active` has not changed and the effect never re-runs. The observer was then attached to
|
|
265
|
+
* nothing and `--basalt-page-bar-h` was never published. Node-as-state costs one extra commit
|
|
266
|
+
* before the first measurement and is the only form that survives a target arriving late.
|
|
165
267
|
*
|
|
166
268
|
* The `height > 0` guard is the whole point: a ResizeObserver fires once with a zero box while the
|
|
167
269
|
* element is still being laid out (and again whenever it is hidden), and publishing that zero is
|
|
168
270
|
* what made a consumer's sticky offset collapse mid-navigation. The property is removed on unmount
|
|
169
271
|
* so a route without a bar does not inherit the last one's height.
|
|
170
272
|
*/
|
|
171
|
-
function
|
|
172
|
-
const
|
|
273
|
+
function publishBarHeight(node: HTMLElement): void {
|
|
274
|
+
const { height } = node.getBoundingClientRect()
|
|
275
|
+
if (height > 0) {
|
|
276
|
+
document.documentElement.style.setProperty(PAGE_BAR_HEIGHT_VAR, `${height}px`)
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function useMeasuredHeightVar(active: boolean): (el: HTMLDivElement | null) => void {
|
|
281
|
+
const [node, setNode] = useState<HTMLDivElement | null>(null)
|
|
282
|
+
const activeRef = useRef(active)
|
|
283
|
+
activeRef.current = active
|
|
284
|
+
|
|
285
|
+
// The FIRST measurement happens here, in the ref callback, which React runs during the COMMIT —
|
|
286
|
+
// before paint, before layout effects, and one full commit before the state below has propagated.
|
|
287
|
+
// That is what keeps the property in place for a cold `/page#anchor` load. The state is only how
|
|
288
|
+
// the observer effect learns the node exists, which it has to, because in a shell the node is a
|
|
289
|
+
// portal into an outlet that publishes ITS node through state too: `active` alone is not a
|
|
290
|
+
// dependency that changes when the target finally arrives.
|
|
291
|
+
const attach = useCallback((el: HTMLDivElement | null) => {
|
|
292
|
+
setNode(el)
|
|
293
|
+
if (el !== null && activeRef.current) publishBarHeight(el)
|
|
294
|
+
}, [])
|
|
173
295
|
|
|
174
296
|
useIsomorphicLayoutEffect(() => {
|
|
175
|
-
const node = ref.current
|
|
176
297
|
if (!active || node === null) return
|
|
177
|
-
const publish = () =>
|
|
178
|
-
const { height } = node.getBoundingClientRect()
|
|
179
|
-
if (height > 0) {
|
|
180
|
-
document.documentElement.style.setProperty(PAGE_BAR_HEIGHT_VAR, `${height}px`)
|
|
181
|
-
}
|
|
182
|
-
}
|
|
298
|
+
const publish = () => publishBarHeight(node)
|
|
183
299
|
publish()
|
|
184
300
|
// Guarded like `FilterSet`'s identical call: happy-dom and jsdom ship no `ResizeObserver`, and a
|
|
185
301
|
// consumer's page test mounting a bar without the shim would otherwise throw from this effect.
|
|
@@ -194,14 +310,9 @@ function useMeasuredHeightVar(active: boolean): RefObject<HTMLDivElement | null>
|
|
|
194
310
|
observer.disconnect()
|
|
195
311
|
document.documentElement.style.removeProperty(PAGE_BAR_HEIGHT_VAR)
|
|
196
312
|
}
|
|
197
|
-
}, [active])
|
|
198
|
-
|
|
199
|
-
return ref
|
|
200
|
-
}
|
|
313
|
+
}, [active, node])
|
|
201
314
|
|
|
202
|
-
|
|
203
|
-
function rootClass(own: string, extra: string | undefined): string {
|
|
204
|
-
return [own, extra].filter(Boolean).join(' ')
|
|
315
|
+
return attach
|
|
205
316
|
}
|
|
206
317
|
|
|
207
318
|
export function PageBar({
|
|
@@ -213,8 +324,25 @@ export function PageBar({
|
|
|
213
324
|
filtersEnd,
|
|
214
325
|
tabs,
|
|
215
326
|
className,
|
|
327
|
+
style,
|
|
328
|
+
classNames,
|
|
216
329
|
}: PageBarProps): ReactNode {
|
|
217
|
-
const { target, inShell } =
|
|
330
|
+
const { target, bandTarget, inShell, panel, claimPanelHost, setPanelTarget } =
|
|
331
|
+
useContext(PageBarContext)
|
|
332
|
+
// An overlay's open flag, like `FilterPill`'s and `FilterSet`'s — not page state (C3).
|
|
333
|
+
const [panelOpened, setPanelOpened] = useState(false)
|
|
334
|
+
|
|
335
|
+
// The flag belongs to the CLAIM, not to the bar. `FilterSheet`'s `onClose` was the only thing
|
|
336
|
+
// clearing it, so a route change that released the aside's claim while the sheet was open left
|
|
337
|
+
// `true` behind — and the NEXT page's `PageAside` mounted its sheet already open, with no user
|
|
338
|
+
// action anywhere. Keyed on the claim's IDENTITY rather than on `panel === null` because the
|
|
339
|
+
// release and the next claim can land in one commit, where `panel` is never observed null.
|
|
340
|
+
const seenPanel = useRef(panel)
|
|
341
|
+
useEffect(() => {
|
|
342
|
+
if (seenPanel.current === panel) return
|
|
343
|
+
seenPanel.current = panel
|
|
344
|
+
setPanelOpened(false)
|
|
345
|
+
}, [panel])
|
|
218
346
|
|
|
219
347
|
const filtersEndActions = filtersEnd ?? []
|
|
220
348
|
const hasRow2 = tabs !== undefined || filters !== undefined || filtersEndActions.length > 0
|
|
@@ -225,8 +353,16 @@ export function PageBar({
|
|
|
225
353
|
actions !== undefined || sync !== undefined || hasLead || filtersEndActions.length > 0
|
|
226
354
|
const measureRef = useMeasuredHeightVar(hasRow2 || (!inShell && hasRow1))
|
|
227
355
|
|
|
356
|
+
// Row 2 is what an aside's mobile pill needs; publishing the claim from here is what lets
|
|
357
|
+
// `PageAside` decide between projecting and staying in flow without either component knowing
|
|
358
|
+
// about the other's props.
|
|
359
|
+
useIsomorphicLayoutEffect(() => {
|
|
360
|
+
if (!inShell || !hasRow2) return
|
|
361
|
+
return claimPanelHost()
|
|
362
|
+
}, [inShell, hasRow2, claimPanelHost])
|
|
363
|
+
|
|
228
364
|
const row1 = hasRow1 ? (
|
|
229
|
-
<div className={classes.row1}>
|
|
365
|
+
<div className={cx(classes.row1, classNames?.row1)}>
|
|
230
366
|
{hasLead && (
|
|
231
367
|
<div className={classes.lead}>
|
|
232
368
|
{icon !== undefined && (
|
|
@@ -261,34 +397,85 @@ export function PageBar({
|
|
|
261
397
|
</div>
|
|
262
398
|
) : null
|
|
263
399
|
|
|
400
|
+
// Desktop-shaped, not viewport-aware: `filtersEndActions` alone still renders the `.pills` line
|
|
401
|
+
// here even though below `sm` those items live in the row-1 kebab and paint nothing in it
|
|
402
|
+
// (`BarActionRow viewport="desktop"`). `page-bar.module.css`'s mobile `.pills:not(:has(…))` rule
|
|
403
|
+
// is what actually hides an empty line there — see that rule's comment for why this stays JS-free.
|
|
404
|
+
const hasPills = filters !== undefined || panel !== null || filtersEndActions.length > 0
|
|
405
|
+
|
|
264
406
|
const row2 = hasRow2 ? (
|
|
265
|
-
<div className={classes.row2}>
|
|
266
|
-
{tabs !== undefined &&
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
<CtlSlot>{filters}</CtlSlot>
|
|
407
|
+
<div className={cx(classes.row2, classNames?.row2)}>
|
|
408
|
+
{tabs !== undefined && (
|
|
409
|
+
<div className={classes.tabs} data-basalt-page-bar-line="tabs">
|
|
410
|
+
<CtlSlot>{tabs}</CtlSlot>
|
|
270
411
|
</div>
|
|
271
412
|
)}
|
|
272
|
-
{
|
|
273
|
-
<div className={classes.
|
|
274
|
-
|
|
275
|
-
{
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
413
|
+
{hasPills && (
|
|
414
|
+
<div className={classes.pills} data-basalt-page-bar-line="pills">
|
|
415
|
+
{filters !== undefined && (
|
|
416
|
+
<div className={classes.filters}>
|
|
417
|
+
<CtlSlot>{filters}</CtlSlot>
|
|
418
|
+
</div>
|
|
419
|
+
)}
|
|
420
|
+
{panel !== null && (
|
|
421
|
+
<FilterPill
|
|
422
|
+
// One word, no count: unlike `Filters (n)` an aside has no census to count (its
|
|
423
|
+
// children are not a `FilterSet`), and a number nobody can derive is worse than none.
|
|
424
|
+
label="Panel"
|
|
425
|
+
ariaLabel={panel.title}
|
|
426
|
+
icon={panel.icon}
|
|
427
|
+
className={classes.panelPill}
|
|
428
|
+
hideGlyph
|
|
429
|
+
onClick={() => {
|
|
430
|
+
setPanelOpened(true)
|
|
431
|
+
}}
|
|
432
|
+
/>
|
|
433
|
+
)}
|
|
434
|
+
{filtersEndActions.length > 0 && (
|
|
435
|
+
<div className={classes.filtersEnd}>
|
|
436
|
+
<CtlSlot>
|
|
437
|
+
{/* Desktop only — below `sm` these live in the row-1 kebab above, never in a second
|
|
438
|
+
one (`docs/CONTROLS-SPEC.md` §2.1: mobile row 2 is two lines: tabs, then the
|
|
439
|
+
first pill + `Filters (n)` + the aside's `Panel` pill — `docs/CONTROLS-SPEC.md`
|
|
440
|
+
§2.1 still describes the pre-aside one-line form). */}
|
|
441
|
+
<BarActionRow secondary={filtersEndActions} host="slot" viewport="desktop" />
|
|
442
|
+
</CtlSlot>
|
|
443
|
+
</div>
|
|
444
|
+
)}
|
|
279
445
|
</div>
|
|
280
446
|
)}
|
|
281
447
|
</div>
|
|
282
448
|
) : null
|
|
283
449
|
|
|
450
|
+
// The aside's mobile sheet. `onResetAll` is deliberately absent — the children mount under a
|
|
451
|
+
// `null` registry, so there is nothing registered to reset. The body is an OUTLET, not the
|
|
452
|
+
// children: `PageAside` portals into it, which is what keeps the aside's node singular (C9) and
|
|
453
|
+
// keeps a `ReactNode` out of context state (see `AsidePanelClaim`). The outlet carries the
|
|
454
|
+
// desktop panel's own `.body` class — same flex rhythm, and the same `> * + *` flush-hairline
|
|
455
|
+
// rule between groups (`page-aside.module.css`) — so the aside's groups separate identically in
|
|
456
|
+
// both projections instead of only in the portalled panel.
|
|
457
|
+
const panelSheet =
|
|
458
|
+
panel === null ? null : (
|
|
459
|
+
<FilterSheet
|
|
460
|
+
opened={panelOpened}
|
|
461
|
+
title={panel.title}
|
|
462
|
+
onClose={() => {
|
|
463
|
+
setPanelOpened(false)
|
|
464
|
+
}}
|
|
465
|
+
>
|
|
466
|
+
<div ref={setPanelTarget} className={asideClasses.body} />
|
|
467
|
+
</FilterSheet>
|
|
468
|
+
)
|
|
469
|
+
|
|
284
470
|
// Shell-less: one sticky bar at the top of the document holding both rows, `title` leading.
|
|
285
471
|
if (!inShell) {
|
|
286
472
|
if (row1 === null && row2 === null) return null
|
|
287
473
|
return (
|
|
288
474
|
<div
|
|
289
475
|
ref={measureRef}
|
|
290
|
-
className={
|
|
476
|
+
className={cx(classes.bar, classNames?.root, className)}
|
|
291
477
|
data-basalt-page-bar="standalone"
|
|
478
|
+
{...(style !== undefined && { style })}
|
|
292
479
|
>
|
|
293
480
|
{row1}
|
|
294
481
|
{row2}
|
|
@@ -296,20 +483,33 @@ export function PageBar({
|
|
|
296
483
|
)
|
|
297
484
|
}
|
|
298
485
|
|
|
299
|
-
// In a shell: row 1
|
|
300
|
-
//
|
|
486
|
+
// In a shell BOTH rows are portals: row 1 into the header, row 2 into the shell-owned band
|
|
487
|
+
// between the header and the scrollport. Neither target exists on the first commit — the outlets'
|
|
488
|
+
// refs set them — so a `null` target renders nothing for exactly one frame.
|
|
489
|
+
//
|
|
490
|
+
// Row 2 portals rather than rendering in flow because WHERE the band paints must not depend on
|
|
491
|
+
// where the consumer wrote `<PageBar>`. In flow it was `position: sticky` inside whatever wrapper
|
|
492
|
+
// held it, so a bar nested one `Stack` deep — which is every real page — had its sticky offset
|
|
493
|
+
// clamped to that wrapper's top edge and sat one `--app-shell-padding` below the header seam,
|
|
494
|
+
// while a bar written as Main's direct child sat flush. Same markup, two geometries. Out here the
|
|
495
|
+
// band is a sibling of the scrollport, so it is neither sticky nor nested and there is one answer.
|
|
301
496
|
return (
|
|
302
497
|
<>
|
|
303
498
|
{row1 !== null && target !== null && createPortal(row1, target)}
|
|
304
|
-
{row2 !== null &&
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
499
|
+
{row2 !== null &&
|
|
500
|
+
bandTarget !== null &&
|
|
501
|
+
createPortal(
|
|
502
|
+
<div
|
|
503
|
+
ref={measureRef}
|
|
504
|
+
className={cx(classes.row2Band, classNames?.root, className)}
|
|
505
|
+
data-basalt-page-bar="shell"
|
|
506
|
+
{...(style !== undefined && { style })}
|
|
507
|
+
>
|
|
508
|
+
{row2}
|
|
509
|
+
</div>,
|
|
510
|
+
bandTarget,
|
|
511
|
+
)}
|
|
512
|
+
{panelSheet}
|
|
313
513
|
</>
|
|
314
514
|
)
|
|
315
515
|
}
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
/*
|
|
64
|
-
* Collapsed rail button — mirrors app-
|
|
64
|
+
* Collapsed rail button — mirrors app-brand.module.css's `.ghostIcon`: faint icon, radius 6,
|
|
65
65
|
* hover ink-6% + ink. `!important` for the same reason as that rule: it competes with Mantine's
|
|
66
66
|
* own compiled ActionIcon variant CSS.
|
|
67
67
|
*
|
|
@@ -11,6 +11,8 @@ import { ActionIcon, Kbd, Text, UnstyledButton } from '@mantine/core'
|
|
|
11
11
|
import type { ReactNode } from 'react'
|
|
12
12
|
import { OverflowMenu } from '../controls/actions'
|
|
13
13
|
import type { BarAction } from '../controls/actions'
|
|
14
|
+
import { cx } from '../common/props'
|
|
15
|
+
import type { BasaltProps } from '../common/props'
|
|
14
16
|
import classes from './sidebar-search.module.css'
|
|
15
17
|
|
|
16
18
|
/**
|
|
@@ -95,13 +97,18 @@ function SearchAction({ action }: { action: BarAction }): ReactNode {
|
|
|
95
97
|
return <ActionIcon {...shared}>{body}</ActionIcon>
|
|
96
98
|
}
|
|
97
99
|
|
|
100
|
+
export type SidebarSearchProps = SidebarSearchConfig &
|
|
101
|
+
BasaltProps & { actions?: SidebarSearchActions; collapsed?: boolean }
|
|
102
|
+
|
|
98
103
|
export function SidebarSearch({
|
|
99
104
|
onOpen,
|
|
100
105
|
placeholder = 'Search…',
|
|
101
106
|
shortcut,
|
|
102
107
|
actions,
|
|
103
108
|
collapsed,
|
|
104
|
-
|
|
109
|
+
className,
|
|
110
|
+
style,
|
|
111
|
+
}: SidebarSearchProps) {
|
|
105
112
|
// SSR-safe mac detection, matching the shell's other shortcut-hint logic.
|
|
106
113
|
const isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPod|iPad/i.test(navigator.platform)
|
|
107
114
|
const hint = shortcut ?? (isMac ? '⌘K' : 'Ctrl K')
|
|
@@ -111,9 +118,10 @@ export function SidebarSearch({
|
|
|
111
118
|
<ActionIcon
|
|
112
119
|
variant="subtle"
|
|
113
120
|
size="md"
|
|
114
|
-
className={classes.railBtn}
|
|
121
|
+
className={cx(classes.railBtn, className)}
|
|
115
122
|
onClick={onOpen}
|
|
116
123
|
aria-label="Open search"
|
|
124
|
+
{...(style !== undefined && { style })}
|
|
117
125
|
>
|
|
118
126
|
<IconSearch />
|
|
119
127
|
</ActionIcon>
|
|
@@ -123,9 +131,10 @@ export function SidebarSearch({
|
|
|
123
131
|
const trigger = (
|
|
124
132
|
<UnstyledButton
|
|
125
133
|
type="button"
|
|
126
|
-
className={classes.trigger}
|
|
134
|
+
className={cx(classes.trigger, actions === undefined && className)}
|
|
127
135
|
onClick={onOpen}
|
|
128
136
|
aria-label="Open search"
|
|
137
|
+
{...(actions === undefined && style !== undefined && { style })}
|
|
129
138
|
>
|
|
130
139
|
<IconSearch />
|
|
131
140
|
<Text component="span" className={classes.label}>
|
|
@@ -139,7 +148,7 @@ export function SidebarSearch({
|
|
|
139
148
|
if (actions === undefined) return trigger
|
|
140
149
|
|
|
141
150
|
return (
|
|
142
|
-
<div className={classes.row}>
|
|
151
|
+
<div className={cx(classes.row, className)} {...(style !== undefined && { style })}>
|
|
143
152
|
{trigger}
|
|
144
153
|
{actions.map((action) => (
|
|
145
154
|
<SearchAction key={action.key} action={action} />
|