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/guard/index.ts
CHANGED
|
@@ -160,8 +160,9 @@ const INLINE_FONT_SIZE =
|
|
|
160
160
|
// Two deliberate non-matches:
|
|
161
161
|
// • `<Card.Section withBorder>` — a section DIVIDER, not card depth. Excluded by the `(?![\w.])`
|
|
162
162
|
// lookahead, which also rejects `<CardHeader>`-style names.
|
|
163
|
-
// • `withBorder={false}` —
|
|
164
|
-
// the lookahead on
|
|
163
|
+
// • `withBorder={false}` — a consumer opt-out; the shell no longer uses it (region edges are
|
|
164
|
+
// painted by the theme's `AppShell.extend`, not by a prop). Excluded by the lookahead on
|
|
165
|
+
// WITH_BORDER_PROP.
|
|
165
166
|
const CARD_SURFACE_TAG = /<(?:Card|Paper)(?![\w.])(?:=>|[^>])*?>/g
|
|
166
167
|
const WITH_BORDER_PROP = /\bwithBorder\b(?!\s*=\s*\{\s*false\s*\})/
|
|
167
168
|
|
|
@@ -506,9 +507,19 @@ const RAW_SELECTION_CONTROL_TAG =
|
|
|
506
507
|
*/
|
|
507
508
|
const PROSE_CONTEXT_TAG = /<(?:Prose|ArticleLayout|Modal|Drawer)(?![\w])/
|
|
508
509
|
|
|
509
|
-
/**
|
|
510
|
+
/**
|
|
511
|
+
* An opening tag for one of the declared non-homes — a settings row, an overlay, a composer — or
|
|
512
|
+
* for one of the basalt SUBTREE homes, where the children ARE the home (`FilterSet` / `PageAside` /
|
|
513
|
+
* `PanelRow`, `docs/ASIDE-SPEC.md` §3). The text lane cannot ask which of the two a tag is, and it
|
|
514
|
+
* does not need to: both mean "a raw control here is not homeless".
|
|
515
|
+
*
|
|
516
|
+
* The three subtree homes are the plugin's `BASALT_HOST_TAGS`, mirrored here so one law does not
|
|
517
|
+
* read differently in the two lanes. The plugin gates them on the tag's basalt IMPORT; a 12-line
|
|
518
|
+
* regex window has no import graph, so this lane matches by name and accepts the missed warn on a
|
|
519
|
+
* consumer's own `PanelRow` — the same direction every approximation in this scan already leans.
|
|
520
|
+
*/
|
|
510
521
|
const CONTROL_HOST_TAG =
|
|
511
|
-
/<(?:SettingsRow|Modal|Drawer|Popover\.Dropdown|Menu\.Dropdown|Composer)(?![\w])/
|
|
522
|
+
/<(?:SettingsRow|Modal|Drawer|Popover\.Dropdown|Menu\.Dropdown|Composer|FilterSet|PageAside|PanelRow)(?![\w])/
|
|
512
523
|
|
|
513
524
|
/**
|
|
514
525
|
* How far ABOVE a control the host-tag window reaches, in lines.
|
|
@@ -522,9 +533,52 @@ const CONTROL_HOST_TAG =
|
|
|
522
533
|
*/
|
|
523
534
|
const CONTROL_HOST_WINDOW_LINES = 12
|
|
524
535
|
|
|
525
|
-
/**
|
|
536
|
+
/**
|
|
537
|
+
* A file whose BASENAME declares it is an overlay's or a form's own body — the cross-file half of
|
|
538
|
+
* {@link CONTROL_HOST_TAG}, and the same two dialects the plugin's `isOverlayConventionFile`
|
|
539
|
+
* applies to `basalt/control-outside-home` and `basalt/bound-control-outside-home` (one law, two
|
|
540
|
+
* lanes, one exemption).
|
|
541
|
+
*
|
|
542
|
+
* Law C1's cross-file case is advisory by declaration (`docs/CONTROLS-SPEC.md` §6, "Honest
|
|
543
|
+
* coverage"), and this kind was paying for it: a `<Select>` inside `edit-session-modal.tsx` whose
|
|
544
|
+
* `<Modal>` is rendered by the parent route is outside BOTH the 12-line host window and any
|
|
545
|
+
* ancestry walk, because the host tag is not in the file at all. argo carried 9 of them.
|
|
546
|
+
*
|
|
547
|
+
* KEBAB and PascalCase both count, because a repo picks one file-naming law and the convention has
|
|
548
|
+
* to survive either: `edit-session-modal.tsx`, and `CbbiPanel.tsx` in a repo mandating
|
|
549
|
+
* `PascalCase.tsx` for component files (basalt's own root `CLAUDE.md` included). Each needs the
|
|
550
|
+
* leading SUBJECT — a bare `modal.tsx` / `Panel.tsx` is a page module, not the convention.
|
|
551
|
+
*
|
|
552
|
+
* The trade is that a whole file goes unscanned on a naming convention — the same bargain
|
|
553
|
+
* {@link MANTINE_FORM_IMPORT} already buys, and a smaller one than promoting the kind with 9 known
|
|
554
|
+
* false positives. Basename only: a `modal/` DIRECTORY holds the page pieces around the modals too.
|
|
555
|
+
*/
|
|
556
|
+
const OVERLAY_CONVENTION_KEBAB = /^[^/]*-(?:modal|drawer|popover|panel|form)\.[jt]sx$/
|
|
557
|
+
const OVERLAY_CONVENTION_PASCAL = /^[A-Z]\w*(?:Modal|Drawer|Popover|Panel|Form)\.[jt]sx$/
|
|
558
|
+
|
|
559
|
+
/** Does `relPath`'s BASENAME declare the overlay convention, in either dialect? */
|
|
560
|
+
function isOverlayConventionFile(relPath: string): boolean {
|
|
561
|
+
const basename = relPath.slice(relPath.lastIndexOf('/') + 1)
|
|
562
|
+
return OVERLAY_CONVENTION_KEBAB.test(basename) || OVERLAY_CONVENTION_PASCAL.test(basename)
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
/**
|
|
566
|
+
* A name whose DECLARATION means this file DEFINES a basalt control rather than consuming one.
|
|
567
|
+
*
|
|
568
|
+
* Paired with {@link BASALT_ANY_IMPORT}, and the pair is the exemption — see the plugin's
|
|
569
|
+
* `CONTROL_OWNER_NAMES` for the whole reasoning: `PanelRow`, `EnumFilter` and `SliderControl` are
|
|
570
|
+
* names a consumer writes for their own helpers, so a bare-name match let one local
|
|
571
|
+
* `function PanelRow(…)` switch this kind off for the whole file.
|
|
572
|
+
*/
|
|
526
573
|
const CONTROL_OWNER_DEF =
|
|
527
|
-
/\b(?:function|const|class)\s+(?:RangeFilter|CompareFilter|SelectFilter|MultiSelectFilter|SearchFilter|ToggleFilter|ViewTabs|FilterSet|FilterPill|SyncButton|ActionGroup|OverflowMenu|CtlSlot)(?![\w])/
|
|
574
|
+
/\b(?:function|const|class)\s+(?:RangeFilter|CompareFilter|SelectFilter|MultiSelectFilter|NumberFilter|SearchFilter|ToggleFilter|ViewTabs|FilterSet|FilterPill|EnumFilter|PanelRow|SliderControl|SyncButton|ActionGroup|OverflowMenu|CtlSlot)(?![\w])/
|
|
575
|
+
|
|
576
|
+
/**
|
|
577
|
+
* ANY import from `basalt-ui` or one of its subpaths — named, default, namespace or side-effect.
|
|
578
|
+
* A file that CONSUMES basalt is not the module that DEFINES its controls, whatever it names its
|
|
579
|
+
* own helpers; basalt's own control sources import each other relatively and never by package name.
|
|
580
|
+
*/
|
|
581
|
+
const BASALT_ANY_IMPORT = /\b(?:from|import)\s+['"]basalt-ui(?:\/[^'"]*)?['"]/
|
|
528
582
|
|
|
529
583
|
/** `@mantine/form` — a form is C1's third home, and its inputs are not filters. */
|
|
530
584
|
const MANTINE_FORM_IMPORT = /from\s+['"]@mantine\/form['"]/
|
|
@@ -635,24 +689,21 @@ export type GraceEntry = { since: string; promote: string; why: string }
|
|
|
635
689
|
* }
|
|
636
690
|
*/
|
|
637
691
|
export const GRACE_PERIOD_KINDS: Partial<Record<GuardKind, GraceEntry>> = {
|
|
638
|
-
'in-body-page-title': {
|
|
639
|
-
since: '1.26.0',
|
|
640
|
-
promote: '1.27.0',
|
|
641
|
-
why:
|
|
642
|
-
'new in the wave-6 control guards (docs/CONTROLS-SPEC.md §6, law C8). Its AST twin is the ' +
|
|
643
|
-
'oxlint rule of the SAME id, whose PLUGIN_RULE_GRACE entry carries the same dates — one law, ' +
|
|
644
|
-
'two lanes, one promotion. Warn for a minor because the fix is a route/breadcrumb change ' +
|
|
645
|
-
'(the page is named by staticData.title), not a prop edit, so a consumer needs to schedule it.',
|
|
646
|
-
},
|
|
647
692
|
'raw-selection-control': {
|
|
648
693
|
since: '1.26.0',
|
|
649
|
-
promote: '1.
|
|
694
|
+
promote: '1.30.0',
|
|
650
695
|
why:
|
|
651
696
|
'new in the wave-6 control guards (docs/CONTROLS-SPEC.md §6, law C1). The text lane cannot ' +
|
|
652
697
|
'see ancestry, so "no home" is approximated by a 12-line host-tag window — the loosest ' +
|
|
653
698
|
'reading in the guard, and the reason this one lands warn rather than error even though its ' +
|
|
654
|
-
'law is settled.
|
|
655
|
-
'
|
|
699
|
+
'law is settled. It moved from 1.27.0 to 1.30.0 with its AST twin, `basalt/control-outside-' +
|
|
700
|
+
'home`, whose PLUGIN_RULE_GRACE entry carries the measurement: the wave-7 run left 9 warns ' +
|
|
701
|
+
'in argo, all of them a control in a modal/form module whose `<Modal>` is rendered by the ' +
|
|
702
|
+
'PARENT — law C1 cross-file, which neither lane can see. `isOverlayConventionFile` (this ' +
|
|
703
|
+
'file, and the same regex in the plugin) exempts that declared naming convention in both ' +
|
|
704
|
+
'lanes. Re-dated 2026-08-28 — the argo wave-7 migration has not run; the PascalCase overlay ' +
|
|
705
|
+
'convention (this change) is expected to clear most of the 9. 1.30.0 is when the remainder ' +
|
|
706
|
+
'is re-measured. One law, two lanes, one promotion.',
|
|
656
707
|
},
|
|
657
708
|
}
|
|
658
709
|
|
|
@@ -823,11 +874,25 @@ export const PLUGIN_RULE_IDS: ReadonlySet<string> = new Set([
|
|
|
823
874
|
'raw-scroll-container',
|
|
824
875
|
'hand-rolled-filter',
|
|
825
876
|
'control-outside-home',
|
|
877
|
+
// No text-lane twin, by design: a bound control's NAME says nothing without the import graph
|
|
878
|
+
// and the ancestry, which a 12-line regex window has neither of. See the rule's own JSDoc.
|
|
879
|
+
'bound-control-outside-home',
|
|
826
880
|
'control-size-literal',
|
|
827
881
|
'page-bar-budget',
|
|
828
882
|
'responsive-twin',
|
|
829
883
|
'search-literal-link',
|
|
830
884
|
'use-search-from-literal',
|
|
885
|
+
// The four F5 rules and the B4 deprecation rule — all AST-only, all outside `checkSource`'s
|
|
886
|
+
// reach: provenance here is an import graph and a JSX ancestry, neither of which a 12-line
|
|
887
|
+
// regex window has. Same reason `bound-control-outside-home` has no text-lane twin.
|
|
888
|
+
'provider-above-router',
|
|
889
|
+
'duplicate-notifications-mount',
|
|
890
|
+
'query-dual-import',
|
|
891
|
+
'query-fn-unwrap',
|
|
892
|
+
'deprecated-export',
|
|
893
|
+
// Same lane: `{...inputProps(…)}` without a sibling `key` is a JSX-ancestry claim (does this
|
|
894
|
+
// ELEMENT carry a `key` attribute?) over an import-resolved callee — neither is text.
|
|
895
|
+
'forms-field-key',
|
|
831
896
|
// `in-body-page-title` is deliberately ABSENT: it is a plugin rule AND a guard kind under one id
|
|
832
897
|
// (one law, two lanes, one annotation), and this set is the ids OUTSIDE `checkSource`'s reach.
|
|
833
898
|
// `check-source.test.ts` asserts the two registries stay disjoint.
|
|
@@ -1901,7 +1966,7 @@ export const GUARD_RULES = {
|
|
|
1901
1966
|
enabled: (cfg: GuardConfig) => cfg.rawHtmlLayout,
|
|
1902
1967
|
appliesTo: (relPath) => !isChartFile(relPath) && !relPath.endsWith('.css'),
|
|
1903
1968
|
message:
|
|
1904
|
-
'Raw HTML element with inline layout/surface styling that the line scan cannot see — the tag is formatted across lines, or the style object is hoisted to a const. Same violation as raw-html-layout: use a Mantine layout primitive (Box/Flex/Grid/Stack/Group). Promoted to error
|
|
1969
|
+
'Raw HTML element with inline layout/surface styling that the line scan cannot see — the tag is formatted across lines, or the style object is hoisted to a const. Same violation as raw-html-layout: use a Mantine layout primitive (Box/Flex/Grid/Stack/Group). Promoted to error at 1.26.0 (C16) with severity only — the kind stayed standalone rather than folding into raw-html-layout as originally planned; the merge is still open, tracked as a follow-up, not done here.',
|
|
1905
1970
|
},
|
|
1906
1971
|
'in-body-page-title': {
|
|
1907
1972
|
kind: 'in-body-page-title',
|
|
@@ -2369,12 +2434,15 @@ export function checkSource(text: string, relPath: string, cfg: GuardConfig): Fi
|
|
|
2369
2434
|
}
|
|
2370
2435
|
|
|
2371
2436
|
// raw-selection-control — full-text tag scan plus the host WINDOW (see CONTROL_HOST_WINDOW_LINES).
|
|
2372
|
-
//
|
|
2373
|
-
// a file that DEFINES a basalt control
|
|
2374
|
-
// `@mantine/form` is a form — C1's third home, whose inputs are not
|
|
2437
|
+
// Three file-level exemptions mirror the plugin rule's, so the two lanes agree on the same file:
|
|
2438
|
+
// a file that DEFINES a basalt control (and imports none — see CONTROL_OWNER_DEF) cannot be told
|
|
2439
|
+
// to use one, a file importing `@mantine/form` is a form — C1's third home, whose inputs are not
|
|
2440
|
+
// filters — and a file NAMED as an overlay body carries its `<Modal>` in the parent, where no
|
|
2441
|
+
// scan of this file can reach it.
|
|
2375
2442
|
if (
|
|
2376
2443
|
ruleApplies('raw-selection-control', relPath) &&
|
|
2377
|
-
!
|
|
2444
|
+
!isOverlayConventionFile(relPath) &&
|
|
2445
|
+
!(CONTROL_OWNER_DEF.test(codeText) && !BASALT_ANY_IMPORT.test(codeText)) &&
|
|
2378
2446
|
!MANTINE_FORM_IMPORT.test(codeText)
|
|
2379
2447
|
) {
|
|
2380
2448
|
for (const m of codeText.matchAll(RAW_SELECTION_CONTROL_TAG)) {
|
package/src/index.ts
CHANGED
|
@@ -12,23 +12,57 @@ export {
|
|
|
12
12
|
BasaltErrorBoundary,
|
|
13
13
|
type BasaltErrorContext,
|
|
14
14
|
} from './provider'
|
|
15
|
+
// -- Common primitives (src/common) ------------------------------------------------------------
|
|
16
|
+
// Not a subpath of its own: `BasaltProps` is the base every component's props extend, so it belongs
|
|
17
|
+
// on the entry a consumer already imports. The module is Mantine-free (`common/boundary.test.ts`),
|
|
18
|
+
// which is what lets `./charts` reach `cx`/`mergeRefs` without breaching the layer boundary.
|
|
19
|
+
export {
|
|
20
|
+
type BasaltProps,
|
|
21
|
+
type SlotClassNames,
|
|
22
|
+
type SlotStylesProps,
|
|
23
|
+
type Tone,
|
|
24
|
+
type ToneWithNeutral,
|
|
25
|
+
type Tier,
|
|
26
|
+
cx,
|
|
27
|
+
assignRef,
|
|
28
|
+
mergeRefs,
|
|
29
|
+
BASALT_PREFIX,
|
|
30
|
+
requiredProp,
|
|
31
|
+
oneOf,
|
|
32
|
+
deprecatedProp,
|
|
33
|
+
duplicateMount,
|
|
34
|
+
missingLayer,
|
|
35
|
+
useValidateProps,
|
|
36
|
+
assertRequiredProps,
|
|
37
|
+
scrollParentOf,
|
|
38
|
+
SCROLLPORT_ATTRIBUTE,
|
|
39
|
+
} from './common'
|
|
40
|
+
|
|
15
41
|
export { createBasaltTheme, baseTheme, cssVariablesResolver } from './theme'
|
|
16
42
|
export type { BasaltFontsConfig, CreateBasaltThemeOptions } from './theme'
|
|
17
43
|
export { CTL_THEME, CtlSlot } from './theme'
|
|
18
44
|
export type { CtlSlotProps } from './theme'
|
|
19
45
|
/**
|
|
20
46
|
* The action vocabulary every home's `actions` slot takes (`docs/CONTROLS-SPEC.md` §2.1). The
|
|
21
|
-
*
|
|
22
|
-
*
|
|
47
|
+
* OTHER components that project it (`OverflowMenu`, `SyncButton`, and the filter family) live on
|
|
48
|
+
* `basalt-ui/controls`; `ActionGroup` is re-exported here alongside its own types so a typed
|
|
49
|
+
* `PageBar`/`BasaltShell` `actions` wrapper needs only this one subpath.
|
|
23
50
|
*/
|
|
24
|
-
export
|
|
51
|
+
export {
|
|
52
|
+
ActionGroup,
|
|
53
|
+
type BarAction,
|
|
54
|
+
type ActionGroupProps,
|
|
55
|
+
type GlobalAction,
|
|
56
|
+
} from './controls/actions'
|
|
25
57
|
export { ThemeToggle, type ThemeToggleProps } from './theme-toggle'
|
|
26
58
|
export { MOTION_DURATION, MOTION_SPRING, MOTION_EASE_STANDARD } from './motion'
|
|
27
59
|
export {
|
|
28
60
|
BasaltShell,
|
|
29
61
|
NavCountBadge,
|
|
62
|
+
type NavCountBadgeProps,
|
|
30
63
|
AppSidebar,
|
|
31
64
|
SidebarSearch,
|
|
65
|
+
type SidebarSearchProps,
|
|
32
66
|
type SidebarSearchConfig,
|
|
33
67
|
type SidebarSearchActions,
|
|
34
68
|
SidebarAccount,
|
|
@@ -40,8 +74,13 @@ export {
|
|
|
40
74
|
MOBILE_MENU_MAX_DEFAULT,
|
|
41
75
|
MOBILE_MORE_KEY,
|
|
42
76
|
AppBreadcrumbs,
|
|
77
|
+
type AppBreadcrumbsProps,
|
|
43
78
|
PageBar,
|
|
44
79
|
type PageBarProps,
|
|
80
|
+
type PageBarSlot,
|
|
81
|
+
PageAside,
|
|
82
|
+
type PageAsideProps,
|
|
83
|
+
type PageAsideSlot,
|
|
45
84
|
type SidebarSection,
|
|
46
85
|
type SidebarItem,
|
|
47
86
|
type SidebarBlock,
|
|
@@ -87,9 +126,11 @@ export {
|
|
|
87
126
|
} from './register'
|
|
88
127
|
|
|
89
128
|
// ── Persisted state + the headless store kernel (state.ts) ───────────────────────────────────────
|
|
90
|
-
// The `field.*` VALUE is deliberately not re-exported here
|
|
91
|
-
// name `field`
|
|
92
|
-
//
|
|
129
|
+
// The `field.*` VALUE is deliberately not re-exported here. `basalt-ui/forms` used to own the
|
|
130
|
+
// name `field` too and collide with this one; that forms helper is now `inputProps` (`field`
|
|
131
|
+
// stays there only as a @deprecated alias — see MIGRATING.md). Import `field.*` from
|
|
132
|
+
// `basalt-ui/router-tanstack` (beside `createSearchStore`) or from `basalt-ui/state` (beside
|
|
133
|
+
// `createLocalStore`).
|
|
93
134
|
export {
|
|
94
135
|
createPersistedState,
|
|
95
136
|
type PersistedStateOptions,
|
|
@@ -99,9 +140,11 @@ export {
|
|
|
99
140
|
type AnyField,
|
|
100
141
|
type BooleanField,
|
|
101
142
|
type EnumField,
|
|
143
|
+
type FieldFallback,
|
|
102
144
|
type FieldHandle,
|
|
103
145
|
type FieldLane,
|
|
104
146
|
type FieldOption,
|
|
147
|
+
type FieldSetOptions,
|
|
105
148
|
type FieldValue,
|
|
106
149
|
type MultiField,
|
|
107
150
|
type NumberField,
|
|
@@ -109,36 +152,62 @@ export {
|
|
|
109
152
|
type RangeParams,
|
|
110
153
|
type RangePresets,
|
|
111
154
|
type RangeValue,
|
|
155
|
+
type RangeWindow,
|
|
156
|
+
type RangeWindows,
|
|
112
157
|
type ResolvedLane,
|
|
158
|
+
type ResolveLane,
|
|
113
159
|
type SearchValues,
|
|
114
160
|
type StoredValues,
|
|
115
161
|
type StringField,
|
|
116
162
|
} from './state'
|
|
117
163
|
|
|
118
164
|
// ── WidgetHeader (unified section/widget/card heading primitive, docs/CONTROLS-SPEC.md §2.2) ─────
|
|
119
|
-
export {
|
|
165
|
+
export {
|
|
166
|
+
WidgetHeader,
|
|
167
|
+
type WidgetHeaderDeltaProps,
|
|
168
|
+
type WidgetHeaderMetricProps,
|
|
169
|
+
type WidgetHeaderProps,
|
|
170
|
+
type WidgetHeaderSlot,
|
|
171
|
+
type WidgetHeaderTier,
|
|
172
|
+
type WidgetHeaderTitleProps,
|
|
173
|
+
DeltaBadge,
|
|
174
|
+
type DeltaBadgeProps,
|
|
175
|
+
type DeltaPolarity,
|
|
176
|
+
} from './widget-header'
|
|
120
177
|
|
|
121
178
|
// ── Section (tier-2 heading composer over WidgetHeader, docs/CONTROLS-SPEC.md §2.2) ───────────────
|
|
122
|
-
export { Section, type SectionProps } from './section'
|
|
179
|
+
export { Section, type SectionProps, type SectionSlot } from './section'
|
|
123
180
|
|
|
124
181
|
// ── Dashboard composites (KPI atoms + settings building blocks) ──────────────────────────────────
|
|
125
182
|
export {
|
|
126
|
-
DeltaBadge,
|
|
127
|
-
type DeltaBadgeProps,
|
|
128
183
|
StatCard,
|
|
184
|
+
type StatCardBreakdownRow,
|
|
129
185
|
type StatCardProps,
|
|
186
|
+
type StatCardSlot,
|
|
130
187
|
type StatCardTone,
|
|
188
|
+
WidgetGrid,
|
|
189
|
+
type WidgetGridCols,
|
|
190
|
+
type WidgetGridItemProps,
|
|
191
|
+
type WidgetGridProps,
|
|
192
|
+
StatGroup,
|
|
193
|
+
type StatGroupCols,
|
|
194
|
+
type StatGroupProps,
|
|
131
195
|
EmptyState,
|
|
132
196
|
type EmptyStateProps,
|
|
197
|
+
type EmptyStateSlot,
|
|
133
198
|
SettingsSection,
|
|
134
199
|
type SettingsSectionProps,
|
|
200
|
+
type SettingsSectionSlot,
|
|
135
201
|
SettingsRow,
|
|
136
202
|
type SettingsRowProps,
|
|
203
|
+
type SettingsRowSlot,
|
|
137
204
|
DangerZone,
|
|
138
205
|
type DangerZoneProps,
|
|
139
206
|
QueryState,
|
|
140
207
|
type QueryStateProps,
|
|
141
208
|
type QueryStateLike,
|
|
209
|
+
type QueryStateSlot,
|
|
210
|
+
type QueryStateTier,
|
|
142
211
|
type QueryStateVariant,
|
|
143
212
|
type QueryEmptyCopy,
|
|
144
213
|
LoadingState,
|
package/src/nav/types.ts
CHANGED
|
@@ -73,11 +73,14 @@ export type SidebarSection = {
|
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
/**
|
|
76
|
-
* Status tone on a sidebar-block item —
|
|
77
|
-
* members are `VX.status` keys by
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
76
|
+
* Status tone on a sidebar-block item — byte-identical to the common `Tone` vocabulary
|
|
77
|
+
* (`common/props.ts`, audit A13) and to `StatCardTone`, whose members are `VX.status` keys by
|
|
78
|
+
* construction. Declared here rather than aliased to `common`'s `Tone`: this module is the one
|
|
79
|
+
* `./router-tanstack` reads, and `common/props.ts` re-exports `Tier` (type-only) from
|
|
80
|
+
* `../widget-header/widget-header`, a Mantine-coupled file — importing anything from `common/props`
|
|
81
|
+
* here would pull that whole module's declaration graph into `nav/types.d.ts`, making it
|
|
82
|
+
* unresolvable without `@mantine/core` installed. Kept in step with `Tone` by convention, not by
|
|
83
|
+
* import.
|
|
81
84
|
*/
|
|
82
85
|
export type SidebarBlockTone = 'good' | 'warn' | 'bad'
|
|
83
86
|
|
|
@@ -192,6 +195,12 @@ export type MobileNavConfig = {
|
|
|
192
195
|
menuMax?: number
|
|
193
196
|
/** @default 'More' */
|
|
194
197
|
moreLabel?: string
|
|
195
|
-
/**
|
|
198
|
+
/**
|
|
199
|
+
* Scroll container for active-slot re-tap. Only needed when the page scrolls somewhere basalt
|
|
200
|
+
* cannot see — inside a shell the default already resolves `AppShell.Main`
|
|
201
|
+
* (`[data-basalt-scrollport]`), and outside one it falls back to the document.
|
|
202
|
+
*
|
|
203
|
+
* @default the `[data-basalt-scrollport]` element, else `document.scrollingElement`
|
|
204
|
+
*/
|
|
196
205
|
getScrollElement?: () => HTMLElement | null
|
|
197
206
|
}
|
|
@@ -18,13 +18,14 @@
|
|
|
18
18
|
import { ActionIcon, Indicator, Popover } from '@mantine/core'
|
|
19
19
|
import { useDisclosure } from '@mantine/hooks'
|
|
20
20
|
import { useRef } from 'react'
|
|
21
|
+
import type { BasaltProps } from '../common/props'
|
|
21
22
|
import { useNotificationHistory } from './store'
|
|
22
|
-
import { NotificationCenter } from './center'
|
|
23
|
+
import { NOTIFICATION_POPOVER_WIDTH, NotificationCenter } from './center'
|
|
23
24
|
|
|
24
25
|
const HOVER_OPEN_DELAY = 150
|
|
25
26
|
const HOVER_CLOSE_DELAY = 200
|
|
26
27
|
|
|
27
|
-
export type NotificationBellProps = {
|
|
28
|
+
export type NotificationBellProps = BasaltProps & {
|
|
28
29
|
/** Tooltip label. Default: 'Notifications'. */
|
|
29
30
|
label?: string
|
|
30
31
|
}
|
|
@@ -38,7 +39,11 @@ export type NotificationBellProps = {
|
|
|
38
39
|
* {...rest}
|
|
39
40
|
* />
|
|
40
41
|
*/
|
|
41
|
-
export function NotificationBell({
|
|
42
|
+
export function NotificationBell({
|
|
43
|
+
label = 'Notifications',
|
|
44
|
+
className,
|
|
45
|
+
style,
|
|
46
|
+
}: NotificationBellProps) {
|
|
42
47
|
const [opened, { open, toggle, close }] = useDisclosure(false)
|
|
43
48
|
const { unreadCount } = useNotificationHistory()
|
|
44
49
|
const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)
|
|
@@ -53,7 +58,14 @@ export function NotificationBell({ label = 'Notifications' }: NotificationBellPr
|
|
|
53
58
|
}
|
|
54
59
|
|
|
55
60
|
return (
|
|
56
|
-
<Popover
|
|
61
|
+
<Popover
|
|
62
|
+
opened={opened}
|
|
63
|
+
onClose={close}
|
|
64
|
+
position="bottom-end"
|
|
65
|
+
width={NOTIFICATION_POPOVER_WIDTH}
|
|
66
|
+
withArrow
|
|
67
|
+
withinPortal
|
|
68
|
+
>
|
|
57
69
|
<Popover.Target>
|
|
58
70
|
<Indicator
|
|
59
71
|
color="color-mix(in srgb, var(--vx-ink) 8%, transparent)"
|
|
@@ -78,6 +90,8 @@ export function NotificationBell({ label = 'Notifications' }: NotificationBellPr
|
|
|
78
90
|
aria-label={label}
|
|
79
91
|
aria-expanded={opened}
|
|
80
92
|
aria-haspopup="dialog"
|
|
93
|
+
{...(className !== undefined && { className })}
|
|
94
|
+
{...(style !== undefined && { style })}
|
|
81
95
|
>
|
|
82
96
|
{/* Bell icon (simple SVG — no @tabler/icons dep per house rules) */}
|
|
83
97
|
<svg
|
|
@@ -25,6 +25,8 @@ import {
|
|
|
25
25
|
Stack,
|
|
26
26
|
Text,
|
|
27
27
|
} from '@mantine/core'
|
|
28
|
+
import type { BasaltProps } from '../common/props'
|
|
29
|
+
import { cx } from '../common/props'
|
|
28
30
|
import { VX } from '../tokens'
|
|
29
31
|
import { resolveAction } from './define-notifications'
|
|
30
32
|
import { useNotificationHistory } from './store'
|
|
@@ -64,6 +66,11 @@ const INTENT_STATUS: Record<NotificationIntent, string> = {
|
|
|
64
66
|
|
|
65
67
|
type CenterView = 'inbox' | 'all'
|
|
66
68
|
|
|
69
|
+
/** The popover width `NotificationBell` fixes at the `Popover` level (see `NotificationCenter`'s
|
|
70
|
+
* own doc for why WIDTH lives there and not on this component). Shared so the two call sites and
|
|
71
|
+
* this doc's example never drift apart. */
|
|
72
|
+
export const NOTIFICATION_POPOVER_WIDTH = 320
|
|
73
|
+
|
|
67
74
|
// ── NotificationItem ──────────────────────────────────────────────────────────
|
|
68
75
|
|
|
69
76
|
function NotificationItem({
|
|
@@ -150,7 +157,7 @@ function NotificationItem({
|
|
|
150
157
|
|
|
151
158
|
// ── NotificationCenter ────────────────────────────────────────────────────────
|
|
152
159
|
|
|
153
|
-
export type NotificationCenterProps = {
|
|
160
|
+
export type NotificationCenterProps = BasaltProps & {
|
|
154
161
|
/** Maximum height of the scrollable list. Default: 320px. */
|
|
155
162
|
maxHeight?: number | string
|
|
156
163
|
}
|
|
@@ -160,16 +167,22 @@ export type NotificationCenterProps = {
|
|
|
160
167
|
* registry-resolved action buttons. Designed to be mounted inside a Popover or Drawer (e.g.
|
|
161
168
|
* NotificationBell).
|
|
162
169
|
*
|
|
170
|
+
* Sizes to its host's full width (`width: 100%`) rather than a fixed px — a popover default that
|
|
171
|
+
* overflowed any inline mount. `NotificationBell` fixes the WIDTH at the Popover level instead
|
|
172
|
+
* (`<Popover width={NOTIFICATION_POPOVER_WIDTH}>`), which is the correct home for a
|
|
173
|
+
* popover-specific dimension; a consumer mounting this directly controls the same thing through
|
|
174
|
+
* its own container.
|
|
175
|
+
*
|
|
163
176
|
* @example
|
|
164
|
-
* import { NotificationCenter } from 'basalt-ui/notifications'
|
|
177
|
+
* import { NOTIFICATION_POPOVER_WIDTH, NotificationCenter } from 'basalt-ui/notifications'
|
|
165
178
|
*
|
|
166
|
-
* <Popover>
|
|
179
|
+
* <Popover width={NOTIFICATION_POPOVER_WIDTH}>
|
|
167
180
|
* <Popover.Dropdown>
|
|
168
181
|
* <NotificationCenter />
|
|
169
182
|
* </Popover.Dropdown>
|
|
170
183
|
* </Popover>
|
|
171
184
|
*/
|
|
172
|
-
export function NotificationCenter({ maxHeight = 320 }: NotificationCenterProps) {
|
|
185
|
+
export function NotificationCenter({ maxHeight = 320, className, style }: NotificationCenterProps) {
|
|
173
186
|
const { items, inbox, unreadCount, markRead, markAllRead, dismiss, dismissAll, remove, clear } =
|
|
174
187
|
useNotificationHistory()
|
|
175
188
|
const [view, setView] = useState<CenterView>('inbox')
|
|
@@ -178,7 +191,7 @@ export function NotificationCenter({ maxHeight = 320 }: NotificationCenterProps)
|
|
|
178
191
|
const emptyLabel = view === 'inbox' ? "You're all caught up" : 'No notifications yet'
|
|
179
192
|
|
|
180
193
|
return (
|
|
181
|
-
<Stack gap="xs" style={{ width:
|
|
194
|
+
<Stack className={cx(className)} gap="xs" style={{ width: '100%', ...style }}>
|
|
182
195
|
{/* Header: title + a single mark-all-read affordance (only when there's something unread) */}
|
|
183
196
|
<Group justify="space-between" align="center" wrap="nowrap">
|
|
184
197
|
<Text size="sm" fw={600}>
|
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
* Consumer augments BasaltRegister.notifications with the spec map type, then uses the typed
|
|
6
6
|
* `emit` helper which resolves the registered kind at compile-time. An unknown kind is a tsc error.
|
|
7
7
|
*
|
|
8
|
+
* A kind's payload type is INFERRED, the same way `defineOverlays` infers an overlay's props from
|
|
9
|
+
* `render` — annotate `toMessage` (or `action.run`) with the payload shape and `emit` picks it up:
|
|
10
|
+
* `emit('saved', { id })` then requires that shape and a wrong one is a tsc error. A kind that never
|
|
11
|
+
* annotates either function keeps today's `payload?: unknown` — additive, no existing call breaks.
|
|
12
|
+
*
|
|
8
13
|
* @example
|
|
9
14
|
* // notifications.ts (app-side)
|
|
10
15
|
* import { defineNotifications } from 'basalt-ui/notifications'
|
|
@@ -18,8 +23,9 @@
|
|
|
18
23
|
*
|
|
19
24
|
* // usage.ts
|
|
20
25
|
* import { emit } from 'basalt-ui/notifications'
|
|
21
|
-
* emit('upload:success', { name: 'photo.jpg' }) // ✓ typed
|
|
22
|
-
* emit('
|
|
26
|
+
* emit('upload:success', { name: 'photo.jpg' }) // ✓ typed, and the payload shape is checked
|
|
27
|
+
* emit('upload:success', 'nope') // ✗ tsc error — wrong payload shape
|
|
28
|
+
* emit('nonexistent', {}) // ✗ tsc error — unregistered kind
|
|
23
29
|
*/
|
|
24
30
|
import type { ReactNode } from 'react'
|
|
25
31
|
import type { Slot } from '../register'
|
|
@@ -36,23 +42,33 @@ export type { NotificationIntent }
|
|
|
36
42
|
* registry (code, app-scoped) — only a serializable `{ kind, payload }` ref is persisted — so an
|
|
37
43
|
* actionable notification keeps working after a reload. The handler can do anything (navigate, open
|
|
38
44
|
* a modal, retry a request); it receives the same payload that was passed to `emit`.
|
|
45
|
+
*
|
|
46
|
+
* The payload type P is the consumer's own payload — same generic shape as `Overlay<P>` in
|
|
47
|
+
* ./define-overlays, inferred from `run`'s parameter, not a separate declared field.
|
|
39
48
|
*/
|
|
40
|
-
export type NotificationAction = {
|
|
49
|
+
export type NotificationAction<P = unknown> = {
|
|
41
50
|
label: string
|
|
42
|
-
run: (payload:
|
|
51
|
+
run: (payload: P) => void
|
|
43
52
|
}
|
|
44
53
|
|
|
45
54
|
// ── NotificationSpecMap ───────────────────────────────────────────────────────
|
|
46
55
|
|
|
47
|
-
/**
|
|
48
|
-
|
|
56
|
+
/**
|
|
57
|
+
* A single notification kind spec — intent + optional payload→message renderer + optional action.
|
|
58
|
+
*
|
|
59
|
+
* The payload type P is INFERRED from `toMessage`/`action.run`'s parameter, the same mechanism
|
|
60
|
+
* `defineOverlays`' `Overlay<P>` uses for `render`. Default `unknown` — a kind that annotates
|
|
61
|
+
* neither function keeps taking any payload, unchanged.
|
|
62
|
+
*/
|
|
63
|
+
export type NotificationSpec<P = unknown> = {
|
|
49
64
|
intent?: NotificationIntent
|
|
50
|
-
toMessage?: (payload:
|
|
51
|
-
action?: NotificationAction
|
|
65
|
+
toMessage?: (payload: P) => ReactNode
|
|
66
|
+
action?: NotificationAction<P>
|
|
52
67
|
}
|
|
53
68
|
|
|
54
69
|
/** The map of kind → spec that a consumer registers. */
|
|
55
|
-
|
|
70
|
+
// oxlint-disable-next-line typescript/no-explicit-any -- load-bearing contravariant spec map, mirrors OverlayMap
|
|
71
|
+
export type NotificationSpecMap = Record<string, NotificationSpec<any>>
|
|
56
72
|
|
|
57
73
|
// ── Slot extraction (mirror of SeriesKey pattern in register.ts) ──────────────
|
|
58
74
|
|
|
@@ -66,11 +82,33 @@ type Notifications = Slot<'notifications', NotificationSpecMap>
|
|
|
66
82
|
*/
|
|
67
83
|
export type NotificationKind = Extract<keyof Notifications, string>
|
|
68
84
|
|
|
85
|
+
/**
|
|
86
|
+
* Extract the inferred payload type for a registered notification kind — mirrors `OverlayProps` in
|
|
87
|
+
* ./define-overlays (same `infer` over the generic spec type, not a separate declared field).
|
|
88
|
+
*
|
|
89
|
+
* Resolves to `unknown` for a kind whose spec never annotates `toMessage`/`action.run` with a
|
|
90
|
+
* payload shape — that is the additive fallback, not a failure to infer.
|
|
91
|
+
*/
|
|
92
|
+
type NotificationPayload<K extends NotificationKind> = Notifications extends {
|
|
93
|
+
[_K in K]: NotificationSpec<infer V>
|
|
94
|
+
}
|
|
95
|
+
? V
|
|
96
|
+
: unknown
|
|
97
|
+
|
|
69
98
|
// ── defineNotification (singular) ────────────────────────────────────────────
|
|
70
99
|
|
|
71
100
|
/**
|
|
72
|
-
* Type a single notification spec without registering it.
|
|
73
|
-
*
|
|
101
|
+
* Type a single notification spec without registering it. Identity passthrough — the payload type
|
|
102
|
+
* `P` is INFERRED from `toMessage`/`action.run`'s parameter, exactly as it is inside
|
|
103
|
+
* `defineNotifications`, so a spec typed here and a spec written inline behave identically.
|
|
104
|
+
*
|
|
105
|
+
* **It is `NotificationSpec<P>`, NOT `<const T extends NotificationSpec>(spec: T): T`** — the
|
|
106
|
+
* const-generic shape every other `defineX` factory takes. Under `strictFunctionTypes` that
|
|
107
|
+
* constraint rejects the example below outright: `T` must extend `NotificationSpec<unknown>`, and a
|
|
108
|
+
* `toMessage: (p: { name: string }) => …` is not assignable to `(payload: unknown) => …`
|
|
109
|
+
* (parameters are contravariant). The factory's own documented usage did not compile. Inferring `P`
|
|
110
|
+
* instead is what makes an annotated payload the point of this file rather than a type error.
|
|
111
|
+
* `.type-guard.test.ts` pins both halves.
|
|
74
112
|
*
|
|
75
113
|
* **WARNING:** this does NOT register the spec in the runtime registry and does NOT
|
|
76
114
|
* augment BasaltRegister. Use `defineNotifications` (plural) to register a full spec
|
|
@@ -85,7 +123,7 @@ export type NotificationKind = Extract<keyof Notifications, string>
|
|
|
85
123
|
* // Merge into the full registry before passing to defineNotifications:
|
|
86
124
|
* const NOTIFICATIONS = defineNotifications({ 'upload:success': uploadSuccess })
|
|
87
125
|
*/
|
|
88
|
-
export function defineNotification<
|
|
126
|
+
export function defineNotification<P = unknown>(spec: NotificationSpec<P>): NotificationSpec<P> {
|
|
89
127
|
return spec
|
|
90
128
|
}
|
|
91
129
|
|
|
@@ -116,6 +154,16 @@ export function defineNotifications<const T extends NotificationSpecMap>(spec: T
|
|
|
116
154
|
|
|
117
155
|
// ── emit ──────────────────────────────────────────────────────────────────────
|
|
118
156
|
|
|
157
|
+
/**
|
|
158
|
+
* The rest-args tuple for `emit`'s payload + opts. A kind whose spec declared a payload shape
|
|
159
|
+
* (`NotificationPayload<K>` is narrower than `unknown`) requires that shape as a real argument; a
|
|
160
|
+
* kind that never declared one keeps `payload?: unknown` — the pre-existing, backward-compatible
|
|
161
|
+
* shape.
|
|
162
|
+
*/
|
|
163
|
+
type EmitArgs<K extends NotificationKind> = [unknown] extends [NotificationPayload<K>]
|
|
164
|
+
? [payload?: unknown, opts?: Omit<NotifyOptions, 'intent' | 'message'>]
|
|
165
|
+
: [payload: NotificationPayload<K>, opts?: Omit<NotifyOptions, 'intent' | 'message'>]
|
|
166
|
+
|
|
119
167
|
/**
|
|
120
168
|
* Emit a registered notification kind. The kind must be a key of the consumer's registered
|
|
121
169
|
* `BasaltRegister.notifications` map — any other string is a tsc error.
|
|
@@ -123,17 +171,15 @@ export function defineNotifications<const T extends NotificationSpecMap>(spec: T
|
|
|
123
171
|
* Resolves the spec's intent + toMessage, then calls notify(). Extra opts override spec defaults.
|
|
124
172
|
*
|
|
125
173
|
* Un-augmented (Notifications = {}): NotificationKind = never → `emit` is effectively uncallable.
|
|
126
|
-
* Augmented: only the registered keys are accepted
|
|
174
|
+
* Augmented: only the registered keys are accepted, and a kind whose spec annotated
|
|
175
|
+
* `toMessage`/`action.run` with a payload shape requires that shape — see {@link NotificationPayload}.
|
|
127
176
|
*
|
|
128
177
|
* @example
|
|
129
178
|
* emit('upload:success', { name: 'photo.jpg' })
|
|
130
179
|
* emit('upload:error', null, { title: 'Storage full' })
|
|
131
180
|
*/
|
|
132
|
-
export function emit(
|
|
133
|
-
|
|
134
|
-
payload?: unknown,
|
|
135
|
-
opts?: Omit<NotifyOptions, 'intent' | 'message'>,
|
|
136
|
-
): string {
|
|
181
|
+
export function emit<K extends NotificationKind>(kind: K, ...args: EmitArgs<K>): string {
|
|
182
|
+
const [payload, opts] = args
|
|
137
183
|
// The kind's compile-time validity comes from the BasaltRegister slot; the runtime spec
|
|
138
184
|
// (intent/toMessage/action) comes from the registry stashed by defineNotifications.
|
|
139
185
|
const spec: NotificationSpec | undefined = activeRegistry[kind]
|