basalt-ui 1.27.0 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +23 -23
- package/CHANGELOG.md +59 -0
- package/MIGRATING.md +613 -20
- package/README.md +33 -3
- package/agent/rules/basalt-batteries.md +25 -10
- package/agent/rules/basalt-controls.md +56 -31
- package/agent/rules/basalt-mantine.md +17 -6
- package/agent/rules/basalt-tokens.md +1 -1
- package/configs/oxlint-plugin.js +1056 -28
- package/configs/oxlint-plugin.test.ts +1066 -0
- package/configs/oxlint.json +7 -0
- package/dist/agent/coalesce.d.ts.map +1 -1
- package/dist/agent/coalesce.js +2 -1
- package/dist/agent/merge.d.ts.map +1 -1
- package/dist/agent/merge.js +2 -1
- package/dist/agent/part-list.d.ts.map +1 -1
- package/dist/agent/part-list.js +2 -0
- package/dist/agent/stick-to-bottom.d.ts +3 -6
- package/dist/agent/stick-to-bottom.d.ts.map +1 -1
- package/dist/agent/stick-to-bottom.js +6 -3
- package/dist/agent-chat/composer.d.ts +6 -2
- package/dist/agent-chat/composer.d.ts.map +1 -1
- package/dist/agent-chat/composer.js +49 -33
- package/dist/agent-chat/relative-time.d.ts +0 -9
- package/dist/agent-chat/relative-time.d.ts.map +1 -1
- package/dist/agent-chat/relative-time.js +2 -1
- package/dist/agent-chat/thread-detail-panel.d.ts +3 -2
- package/dist/agent-chat/thread-detail-panel.d.ts.map +1 -1
- package/dist/agent-chat/thread-detail-panel.js +8 -5
- package/dist/agent-chat/thread-feed-row.d.ts +2 -1
- package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed-row.js +92 -92
- package/dist/agent-chat/thread-feed.d.ts +3 -2
- package/dist/agent-chat/thread-feed.d.ts.map +1 -1
- package/dist/agent-chat/thread-feed.js +8 -3
- package/dist/agent-chat/thread-message.d.ts +4 -3
- package/dist/agent-chat/thread-message.d.ts.map +1 -1
- package/dist/agent-chat/thread-message.js +70 -31
- package/dist/agent-chat/thread-outcome-card.d.ts +3 -2
- package/dist/agent-chat/thread-outcome-card.d.ts.map +1 -1
- package/dist/agent-chat/thread-outcome-card.js +9 -2
- package/dist/agent-chat/thread-workspace.d.ts +7 -2
- package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
- package/dist/agent-chat/thread-workspace.js +62 -29
- package/dist/agent-chat/tool-chip.d.ts +3 -2
- package/dist/agent-chat/tool-chip.d.ts.map +1 -1
- package/dist/agent-chat/tool-chip.js +7 -2
- package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
- package/dist/charts/hooks/useBandPlot.js +15 -8
- package/dist/charts/index.d.ts +8 -7
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/index.js +45 -5
- package/dist/charts/kinds/BandStrip.d.ts +10 -7
- package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
- package/dist/charts/kinds/BandStrip.js +12 -7
- package/dist/charts/kinds/Bars.d.ts +12 -6
- package/dist/charts/kinds/Bars.d.ts.map +1 -1
- package/dist/charts/kinds/Bars.js +37 -11
- package/dist/charts/kinds/Donut.d.ts +6 -5
- package/dist/charts/kinds/Donut.d.ts.map +1 -1
- package/dist/charts/kinds/Donut.js +19 -2
- package/dist/charts/kinds/DualPanel.d.ts +6 -5
- package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
- package/dist/charts/kinds/DualPanel.js +36 -8
- package/dist/charts/kinds/Heatmap.d.ts +10 -6
- package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
- package/dist/charts/kinds/Heatmap.js +58 -31
- package/dist/charts/kinds/MirroredBars.d.ts +6 -5
- package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
- package/dist/charts/kinds/MirroredBars.js +9 -2
- package/dist/charts/kinds/MultiLine.d.ts +11 -6
- package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
- package/dist/charts/kinds/MultiLine.js +24 -15
- package/dist/charts/kinds/StackedArea.d.ts +18 -8
- package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
- package/dist/charts/kinds/StackedArea.js +29 -4
- package/dist/charts/kinds/ZonedLine.d.ts +12 -8
- package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
- package/dist/charts/kinds/ZonedLine.js +33 -23
- package/dist/charts/layout/auto-margin.d.ts +65 -8
- package/dist/charts/layout/auto-margin.d.ts.map +1 -1
- package/dist/charts/layout/auto-margin.js +45 -10
- package/dist/charts/layout/log-ticks.d.ts +27 -0
- package/dist/charts/layout/log-ticks.d.ts.map +1 -0
- package/dist/charts/layout/log-ticks.js +42 -0
- package/dist/charts/primitives/Axes.d.ts +11 -2
- package/dist/charts/primitives/Axes.d.ts.map +1 -1
- package/dist/charts/primitives/Axes.js +15 -5
- package/dist/charts/primitives/CartesianChart.d.ts +45 -7
- package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
- package/dist/charts/primitives/CartesianChart.js +86 -28
- package/dist/charts/primitives/ChartCard.d.ts +27 -2
- package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
- package/dist/charts/primitives/ChartCard.js +37 -17
- package/dist/charts/primitives/ChartFrame.d.ts +30 -4
- package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
- package/dist/charts/primitives/ChartFrame.js +45 -15
- package/dist/charts/primitives/ChartLegend.d.ts +13 -2
- package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
- package/dist/charts/primitives/ChartLegend.js +33 -13
- package/dist/charts/primitives/ChartPending.d.ts +77 -4
- package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
- package/dist/charts/primitives/ChartPending.js +100 -6
- package/dist/charts/primitives/ChartTooltip.d.ts +7 -0
- package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
- package/dist/charts/primitives/ChartTooltip.js +18 -5
- package/dist/charts/primitives/Crosshair.d.ts +3 -0
- package/dist/charts/primitives/Crosshair.d.ts.map +1 -1
- package/dist/charts/primitives/Crosshair.js +3 -1
- package/dist/charts/primitives/chart-frame-layout.d.ts +95 -0
- package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -0
- package/dist/charts/primitives/chart-frame-layout.js +89 -0
- package/dist/charts/primitives/chart-tier.d.ts +16 -0
- package/dist/charts/primitives/chart-tier.d.ts.map +1 -0
- package/dist/charts/primitives/chart-tier.js +20 -0
- package/dist/charts/series.d.ts +55 -1
- package/dist/charts/series.d.ts.map +1 -1
- package/dist/charts/series.js +27 -1
- package/dist/charts/sparklines/BarSparkline.d.ts +3 -3
- package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/BarSparkline.js +9 -3
- package/dist/charts/sparklines/LineSparkline.d.ts +3 -3
- package/dist/charts/sparklines/LineSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/LineSparkline.js +15 -3
- package/dist/charts/sparklines/index.d.ts +2 -2
- package/dist/charts/sparklines/index.d.ts.map +1 -1
- package/dist/charts/utils/format.d.ts +92 -2
- package/dist/charts/utils/format.d.ts.map +1 -1
- package/dist/charts/utils/format.js +64 -1
- package/dist/charts/utils/ticks.d.ts +81 -2
- package/dist/charts/utils/ticks.d.ts.map +1 -1
- package/dist/charts/utils/ticks.js +54 -4
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/commands/ShortcutsHelp.d.ts +3 -2
- package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
- package/dist/commands/ShortcutsHelp.js +8 -2
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +2 -2
- package/dist/commands/define-overlays.d.ts +102 -0
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +102 -2
- package/dist/commands/index.d.ts +10 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +3 -1
- package/dist/commands/overlays-mount.d.ts +13 -6
- package/dist/commands/overlays-mount.d.ts.map +1 -1
- package/dist/commands/overlays-mount.js +23 -14
- package/dist/common/errors.d.ts +34 -0
- package/dist/common/errors.d.ts.map +1 -0
- package/dist/common/errors.js +36 -0
- package/dist/common/index.d.ts +15 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +29 -0
- package/dist/common/props.d.ts +63 -0
- package/dist/common/props.d.ts.map +1 -0
- package/dist/common/props.js +6 -0
- package/dist/common/query-state-like.d.ts +43 -0
- package/dist/common/query-state-like.d.ts.map +1 -0
- package/dist/common/query-state-like.js +20 -0
- package/dist/common/refs.d.ts +29 -0
- package/dist/common/refs.d.ts.map +1 -0
- package/dist/common/refs.js +29 -0
- package/dist/common/scroll-parent.d.ts +23 -0
- package/dist/common/scroll-parent.d.ts.map +1 -0
- package/dist/common/scroll-parent.js +21 -0
- package/dist/common/validate.d.ts +38 -0
- package/dist/common/validate.d.ts.map +1 -0
- package/dist/common/validate.js +36 -0
- package/dist/connectivity/connectivity-indicator.d.ts +3 -1
- package/dist/connectivity/connectivity-indicator.d.ts.map +1 -1
- package/dist/connectivity/connectivity-indicator.js +3 -1
- package/dist/connectivity/connectivity-provider.d.ts.map +1 -1
- package/dist/connectivity/connectivity-provider.js +4 -1
- package/dist/connectivity/index.d.ts +1 -0
- package/dist/connectivity/index.d.ts.map +1 -1
- package/dist/connectivity/types.d.ts +2 -2
- package/dist/connectivity/types.d.ts.map +1 -1
- package/dist/connectivity/use-connectivity.d.ts.map +1 -1
- package/dist/content/article-layout.module.css +11 -4
- package/dist/content/callout.d.ts +8 -4
- package/dist/content/callout.d.ts.map +1 -1
- package/dist/content/callout.js +15 -8
- package/dist/content/guide.d.ts +5 -4
- package/dist/content/guide.d.ts.map +1 -1
- package/dist/content/guide.js +13 -4
- package/dist/content/heading-anchor.d.ts +24 -2
- package/dist/content/heading-anchor.d.ts.map +1 -1
- package/dist/content/heading-anchor.js +23 -9
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/markdown.d.ts.map +1 -1
- package/dist/content/markdown.js +2 -0
- package/dist/content/prose.module.css +9 -7
- package/dist/content/reading-progress.d.ts +10 -4
- package/dist/content/reading-progress.d.ts.map +1 -1
- package/dist/content/reading-progress.js +26 -10
- package/dist/content/slug.d.ts +4 -0
- package/dist/content/slug.d.ts.map +1 -1
- package/dist/content/toc.d.ts +11 -0
- package/dist/content/toc.d.ts.map +1 -1
- package/dist/content/toc.js +23 -10
- package/dist/controls/actions.d.ts +49 -6
- package/dist/controls/actions.d.ts.map +1 -1
- package/dist/controls/actions.js +39 -8
- package/dist/controls/compare-filter.d.ts +3 -2
- package/dist/controls/compare-filter.d.ts.map +1 -1
- package/dist/controls/compare-filter.js +17 -2
- package/dist/controls/control-group.d.ts +3 -3
- package/dist/controls/control-group.d.ts.map +1 -1
- package/dist/controls/control-group.js +9 -2
- package/dist/controls/controls.module.css +169 -186
- package/dist/controls/controls.module.css.d.ts +9 -11
- package/dist/controls/enum-filter.d.ts +3 -2
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/enum-filter.js +28 -13
- package/dist/controls/filter-context.d.ts +8 -4
- package/dist/controls/filter-context.d.ts.map +1 -1
- package/dist/controls/filter-pill.d.ts +3 -3
- package/dist/controls/filter-pill.d.ts.map +1 -1
- package/dist/controls/filter-pill.js +4 -1
- package/dist/controls/filter-set.d.ts +3 -2
- package/dist/controls/filter-set.d.ts.map +1 -1
- package/dist/controls/filter-set.js +66 -41
- package/dist/controls/filter-sheet.d.ts +20 -80
- package/dist/controls/filter-sheet.d.ts.map +1 -1
- package/dist/controls/filter-sheet.js +9 -95
- package/dist/controls/index.d.ts +2 -0
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/index.js +4 -0
- package/dist/controls/multi-select-filter.d.ts +18 -2
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/multi-select-filter.js +122 -20
- package/dist/controls/number-filter.d.ts +7 -5
- package/dist/controls/number-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.js +40 -11
- package/dist/controls/panel-row.d.ts +132 -0
- package/dist/controls/panel-row.d.ts.map +1 -0
- package/dist/controls/panel-row.js +173 -0
- package/dist/controls/panel-row.module.css +86 -0
- package/dist/controls/panel-row.module.css.d.ts +13 -0
- package/dist/controls/range-filter.d.ts +2 -1
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/range-filter.js +57 -35
- package/dist/controls/search-filter.d.ts +3 -2
- package/dist/controls/search-filter.d.ts.map +1 -1
- package/dist/controls/search-filter.js +25 -10
- package/dist/controls/select-filter.d.ts +2 -1
- package/dist/controls/select-filter.d.ts.map +1 -1
- package/dist/controls/select-filter.js +4 -0
- package/dist/controls/slider-control.d.ts +36 -0
- package/dist/controls/slider-control.d.ts.map +1 -0
- package/dist/controls/slider-control.js +64 -0
- package/dist/controls/sync-button.d.ts +3 -2
- package/dist/controls/sync-button.d.ts.map +1 -1
- package/dist/controls/sync-button.js +16 -3
- package/dist/controls/toggle-filter.d.ts +3 -2
- package/dist/controls/toggle-filter.d.ts.map +1 -1
- package/dist/controls/toggle-filter.js +28 -11
- package/dist/controls/view-tabs.d.ts +3 -2
- package/dist/controls/view-tabs.d.ts.map +1 -1
- package/dist/controls/view-tabs.js +43 -11
- package/dist/controls-dates/date-range-picker.d.ts +1 -1
- package/dist/controls-dates/date-range-picker.d.ts.map +1 -1
- package/dist/controls-dates/date-range-picker.js +6 -1
- package/dist/dashboard/delta-badge.d.ts +5 -1
- package/dist/dashboard/delta-badge.d.ts.map +1 -1
- package/dist/dashboard/empty-state.d.ts +10 -3
- package/dist/dashboard/empty-state.d.ts.map +1 -1
- package/dist/dashboard/empty-state.js +37 -6
- package/dist/dashboard/index.d.ts +6 -4
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +7 -1
- package/dist/dashboard/query-state.d.ts +48 -27
- package/dist/dashboard/query-state.d.ts.map +1 -1
- package/dist/dashboard/query-state.js +111 -57
- package/dist/dashboard/settings-section.d.ts +19 -9
- package/dist/dashboard/settings-section.d.ts.map +1 -1
- package/dist/dashboard/settings-section.js +74 -25
- package/dist/dashboard/stat-card.d.ts +44 -38
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +55 -42
- package/dist/dashboard/stat-card.module.css +46 -31
- package/dist/dashboard/stat-card.module.css.d.ts +1 -0
- package/dist/dashboard/stat-group.d.ts +41 -0
- package/dist/dashboard/stat-group.d.ts.map +1 -0
- package/dist/dashboard/stat-group.js +30 -0
- package/dist/dashboard/stat-group.module.css +66 -0
- package/dist/dashboard/stat-group.module.css.d.ts +8 -0
- package/dist/dashboard/widget-grid.d.ts +27 -0
- package/dist/dashboard/widget-grid.d.ts.map +1 -0
- package/dist/dashboard/widget-grid.js +41 -0
- package/dist/dashboard/widget-grid.module.css +53 -0
- package/dist/dashboard/widget-grid.module.css.d.ts +9 -0
- package/dist/data/data-table.d.ts +151 -12
- package/dist/data/data-table.d.ts.map +1 -1
- package/dist/data/data-table.js +384 -138
- package/dist/data/data-table.module.css +64 -0
- package/dist/data/data-table.module.css.d.ts +11 -0
- package/dist/data/index.d.ts +2 -2
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +24 -2
- package/dist/data/query-branch.d.ts +28 -0
- package/dist/data/query-branch.d.ts.map +1 -0
- package/dist/data/query-branch.js +10 -0
- package/dist/data/table.d.ts +2 -2
- package/dist/data/table.d.ts.map +1 -1
- package/dist/data/virtual-list.d.ts +65 -6
- package/dist/data/virtual-list.d.ts.map +1 -1
- package/dist/data/virtual-list.js +89 -38
- package/dist/data/virtual.d.ts +1 -1
- package/dist/data/virtual.d.ts.map +1 -1
- package/dist/forms/FormErrorSummary.d.ts +4 -3
- package/dist/forms/FormErrorSummary.d.ts.map +1 -1
- package/dist/forms/FormErrorSummary.js +6 -4
- package/dist/forms/create-form.d.ts +2 -2
- package/dist/forms/field.d.ts +46 -6
- package/dist/forms/field.d.ts.map +1 -1
- package/dist/forms/field.js +10 -5
- package/dist/forms/form-layout.d.ts +142 -0
- package/dist/forms/form-layout.d.ts.map +1 -0
- package/dist/forms/form-layout.js +110 -0
- package/dist/forms/form-layout.module.css +145 -0
- package/dist/forms/form-layout.module.css.d.ts +20 -0
- package/dist/forms/form-state.d.ts +42 -0
- package/dist/forms/form-state.d.ts.map +1 -0
- package/dist/forms/form-state.js +26 -0
- package/dist/forms/index.d.ts +22 -6
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +19 -3
- package/dist/forms/use-field-array.d.ts +60 -0
- package/dist/forms/use-field-array.d.ts.map +1 -0
- package/dist/forms/use-field-array.js +20 -0
- package/dist/forms/use-form-draft.d.ts +25 -10
- package/dist/forms/use-form-draft.d.ts.map +1 -1
- package/dist/forms/use-form-draft.js +55 -18
- package/dist/forms/use-form-submit.d.ts +88 -0
- package/dist/forms/use-form-submit.d.ts.map +1 -0
- package/dist/forms/use-form-submit.js +63 -0
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +26 -6
- package/dist/index.d.ts +10 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -4
- package/dist/nav/types.d.ts +15 -6
- package/dist/nav/types.d.ts.map +1 -1
- package/dist/notifications/bell.d.ts +3 -2
- package/dist/notifications/bell.d.ts.map +1 -1
- package/dist/notifications/bell.js +73 -56
- package/dist/notifications/center.d.ts +15 -4
- package/dist/notifications/center.d.ts.map +1 -1
- package/dist/notifications/center.js +5 -2
- package/dist/notifications/define-notifications.d.ts +56 -14
- package/dist/notifications/define-notifications.d.ts.map +1 -1
- package/dist/notifications/define-notifications.js +2 -1
- package/dist/notifications/index.d.ts +6 -2
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +5 -1
- package/dist/notifications/mount-guard.d.ts +8 -0
- package/dist/notifications/mount-guard.d.ts.map +1 -0
- package/dist/notifications/mount-guard.js +19 -0
- package/dist/notifications/notify.d.ts +58 -1
- package/dist/notifications/notify.d.ts.map +1 -1
- package/dist/notifications/notify.js +46 -2
- package/dist/notifications/overlay.d.ts.map +1 -1
- package/dist/notifications/overlay.js +2 -0
- package/dist/notifications/store.d.ts +7 -0
- package/dist/notifications/store.d.ts.map +1 -1
- package/dist/provider/index.d.ts +37 -5
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +66 -28
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/lab-theme.js +2 -1
- package/dist/query/devtools.d.ts.map +1 -1
- package/dist/query/devtools.js +1 -0
- package/dist/router-tanstack/field.d.ts +1 -1
- package/dist/router-tanstack/field.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.js +1 -1
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +1 -1
- package/dist/section/index.d.ts +1 -1
- package/dist/section/index.d.ts.map +1 -1
- package/dist/section/section.d.ts +36 -2
- package/dist/section/section.d.ts.map +1 -1
- package/dist/section/section.js +49 -57
- package/dist/section/section.module.css +11 -0
- package/dist/shell/account-types.d.ts +5 -2
- package/dist/shell/account-types.d.ts.map +1 -1
- package/dist/shell/app-brand.d.ts +13 -0
- package/dist/shell/app-brand.d.ts.map +1 -0
- package/dist/shell/app-brand.js +94 -0
- package/dist/shell/app-brand.module.css +109 -0
- package/dist/shell/app-brand.module.css.d.ts +14 -0
- package/dist/shell/app-breadcrumbs.d.ts +4 -2
- package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
- package/dist/shell/app-breadcrumbs.js +33 -22
- package/dist/shell/app-header.module.css +10 -5
- package/dist/shell/app-main.module.css +107 -0
- package/dist/shell/app-main.module.css.d.ts +11 -0
- package/dist/shell/app-mobile-nav.d.ts +3 -2
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-mobile-nav.js +29 -15
- package/dist/shell/app-mobile-nav.module.css +48 -27
- package/dist/shell/app-mobile-nav.module.css.d.ts +0 -1
- package/dist/shell/app-sidebar-account.d.ts +2 -1
- package/dist/shell/app-sidebar-account.d.ts.map +1 -1
- package/dist/shell/app-sidebar-account.js +57 -22
- package/dist/shell/app-sidebar.d.ts +9 -3
- package/dist/shell/app-sidebar.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +55 -109
- package/dist/shell/app-sidebar.module.css +53 -96
- package/dist/shell/app-sidebar.module.css.d.ts +0 -5
- package/dist/shell/index.d.ts +14 -6
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +47 -12
- package/dist/shell/isomorphic-layout-effect.d.ts +14 -0
- package/dist/shell/isomorphic-layout-effect.d.ts.map +1 -0
- package/dist/shell/isomorphic-layout-effect.js +5 -0
- package/dist/shell/mobile-nav-model.d.ts.map +1 -1
- package/dist/shell/mobile-nav-model.js +27 -6
- package/dist/shell/nav-count-badge.d.ts +5 -3
- package/dist/shell/nav-count-badge.d.ts.map +1 -1
- package/dist/shell/nav-count-badge.js +3 -1
- package/dist/shell/page-aside.d.ts +43 -0
- package/dist/shell/page-aside.d.ts.map +1 -0
- package/dist/shell/page-aside.js +202 -0
- package/dist/shell/page-aside.module.css +174 -0
- package/dist/shell/page-aside.module.css.d.ts +14 -0
- package/dist/shell/page-bar.d.ts +55 -15
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +130 -41
- package/dist/shell/page-bar.module.css +107 -13
- package/dist/shell/page-bar.module.css.d.ts +4 -1
- package/dist/shell/sidebar-search.d.ts +4 -2
- package/dist/shell/sidebar-search.d.ts.map +1 -1
- package/dist/shell/sidebar-search.js +9 -4
- package/dist/shell/sidebar-search.module.css +1 -1
- package/dist/state/fields.d.ts +23 -3
- package/dist/state/fields.d.ts.map +1 -1
- package/dist/state/fields.js +13 -2
- package/dist/state/persisted-or-local.d.ts +9 -0
- package/dist/state/persisted-or-local.d.ts.map +1 -0
- package/dist/state/persisted-or-local.js +24 -0
- package/dist/state.d.ts +1 -1
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +2 -6
- package/dist/surfaces.d.ts +12 -11
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +42 -12
- package/dist/theme/ctl-theme.d.ts.map +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +102 -17
- package/dist/theme/nav-link.module.css +37 -26
- package/dist/theme/segmented-control.module.css +22 -0
- package/dist/theme/segmented-control.module.css.d.ts +1 -0
- package/dist/theme-lab/boot.d.ts +66 -0
- package/dist/theme-lab/boot.d.ts.map +1 -0
- package/dist/theme-lab/boot.js +82 -0
- package/dist/theme-lab/index.d.ts +4 -43
- package/dist/theme-lab/index.d.ts.map +1 -1
- package/dist/theme-lab/index.js +9 -69
- package/dist/theme-toggle/index.d.ts +3 -2
- package/dist/theme-toggle/index.d.ts.map +1 -1
- package/dist/theme-toggle/index.js +8 -2
- package/dist/tokens/index.d.ts +42 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +35 -6
- package/dist/tokens/palette.d.ts +45 -25
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +31 -14
- package/dist/tokens.css +4 -5
- package/dist/utils/is-dev.d.ts +3 -0
- package/dist/utils/is-dev.d.ts.map +1 -0
- package/dist/utils/is-dev.js +6 -0
- package/dist/widget-header/delta-badge.d.ts +7 -1
- package/dist/widget-header/delta-badge.d.ts.map +1 -1
- package/dist/widget-header/delta-badge.js +8 -1
- package/dist/widget-header/index.d.ts +2 -2
- package/dist/widget-header/index.d.ts.map +1 -1
- package/dist/widget-header/index.js +3 -1
- package/dist/widget-header/widget-header.d.ts +69 -4
- package/dist/widget-header/widget-header.d.ts.map +1 -1
- package/dist/widget-header/widget-header.js +42 -27
- package/dist/widget-header/widget-header.module.css +72 -7
- package/llms.txt +6 -6
- package/package.json +49 -25
- package/src/agent/coalesce.ts +2 -1
- package/src/agent/merge.ts +2 -1
- package/src/agent/part-list.tsx +2 -0
- package/src/agent/stick-to-bottom.tsx +9 -11
- package/src/agent-chat/composer.tsx +124 -103
- package/src/agent-chat/relative-time.ts +2 -1
- package/src/agent-chat/thread-detail-panel.tsx +9 -5
- package/src/agent-chat/thread-feed-row.tsx +17 -9
- package/src/agent-chat/thread-feed.tsx +9 -3
- package/src/agent-chat/thread-message.tsx +48 -13
- package/src/agent-chat/thread-outcome-card.tsx +9 -1
- package/src/agent-chat/thread-workspace.tsx +72 -33
- package/src/agent-chat/tool-chip.tsx +8 -2
- package/src/charts/hooks/useBandPlot.ts +26 -8
- package/src/charts/index.ts +39 -4
- package/src/charts/kinds/BandStrip.tsx +36 -14
- package/src/charts/kinds/Bars.tsx +67 -16
- package/src/charts/kinds/Donut.tsx +30 -3
- package/src/charts/kinds/DualPanel.tsx +56 -10
- package/src/charts/kinds/Heatmap.tsx +90 -33
- package/src/charts/kinds/MirroredBars.tsx +21 -3
- package/src/charts/kinds/MultiLine.tsx +61 -18
- package/src/charts/kinds/StackedArea.tsx +77 -6
- package/src/charts/kinds/ZonedLine.tsx +71 -31
- package/src/charts/layout/auto-margin.ts +134 -21
- package/src/charts/layout/log-ticks.ts +90 -0
- package/src/charts/primitives/Axes.tsx +33 -5
- package/src/charts/primitives/CartesianChart.tsx +194 -41
- package/src/charts/primitives/ChartCard.tsx +66 -25
- package/src/charts/primitives/ChartFrame.tsx +107 -26
- package/src/charts/primitives/ChartLegend.tsx +43 -13
- package/src/charts/primitives/ChartPending.tsx +185 -7
- package/src/charts/primitives/ChartTooltip.tsx +37 -5
- package/src/charts/primitives/Crosshair.tsx +6 -3
- package/src/charts/primitives/chart-frame-layout.ts +212 -0
- package/src/charts/primitives/chart-tier.tsx +37 -0
- package/src/charts/series.ts +77 -1
- package/src/charts/sparklines/BarSparkline.tsx +11 -3
- package/src/charts/sparklines/LineSparkline.tsx +18 -4
- package/src/charts/sparklines/index.ts +2 -2
- package/src/charts/utils/format.ts +163 -2
- package/src/charts/utils/ticks.ts +149 -4
- package/src/cli/index.ts +8 -3
- package/src/commands/ShortcutsHelp.tsx +10 -3
- package/src/commands/define-commands.ts +2 -2
- package/src/commands/define-overlays.ts +216 -1
- package/src/commands/index.ts +12 -0
- package/src/commands/overlays-mount.tsx +60 -26
- package/src/common/errors.ts +73 -0
- package/src/common/index.ts +21 -0
- package/src/common/props.ts +71 -0
- package/src/common/query-state-like.ts +64 -0
- package/src/common/refs.ts +58 -0
- package/src/common/scroll-parent.ts +42 -0
- package/src/common/validate.ts +94 -0
- package/src/connectivity/connectivity-indicator.tsx +6 -1
- package/src/connectivity/connectivity-provider.tsx +4 -1
- package/src/connectivity/index.ts +1 -0
- package/src/connectivity/types.ts +5 -2
- package/src/connectivity/use-connectivity.ts +3 -2
- package/src/content/article-layout.module.css +11 -4
- package/src/content/callout.tsx +13 -7
- package/src/content/guide.tsx +14 -4
- package/src/content/heading-anchor.tsx +14 -3
- package/src/content/index.ts +2 -0
- package/src/content/markdown.tsx +2 -0
- package/src/content/prose.module.css +9 -7
- package/src/content/reading-progress.tsx +40 -15
- package/src/content/slug.ts +4 -0
- package/src/content/toc.tsx +47 -10
- package/src/controls/actions.tsx +89 -9
- package/src/controls/compare-filter.tsx +20 -3
- package/src/controls/control-group.tsx +11 -4
- package/src/controls/controls.module.css +169 -186
- package/src/controls/controls.module.css.d.ts +9 -11
- package/src/controls/enum-filter.tsx +32 -16
- package/src/controls/filter-context.tsx +14 -6
- package/src/controls/filter-pill.tsx +6 -3
- package/src/controls/filter-set.tsx +32 -13
- package/src/controls/filter-sheet.tsx +44 -194
- package/src/controls/index.ts +7 -0
- package/src/controls/multi-select-filter.tsx +177 -27
- package/src/controls/number-filter.tsx +61 -23
- package/src/controls/panel-row.module.css +86 -0
- package/src/controls/panel-row.module.css.d.ts +13 -0
- package/src/controls/panel-row.tsx +392 -0
- package/src/controls/range-filter.tsx +76 -39
- package/src/controls/search-filter.tsx +30 -12
- package/src/controls/select-filter.tsx +11 -1
- package/src/controls/slider-control.tsx +159 -0
- package/src/controls/sync-button.tsx +13 -3
- package/src/controls/toggle-filter.tsx +36 -16
- package/src/controls/view-tabs.tsx +63 -11
- package/src/controls-dates/date-range-picker.tsx +8 -1
- package/src/dashboard/delta-badge.tsx +5 -1
- package/src/dashboard/empty-state.tsx +72 -25
- package/src/dashboard/index.ts +13 -1
- package/src/dashboard/query-state.tsx +154 -84
- package/src/dashboard/settings-section.tsx +87 -31
- package/src/dashboard/stat-card.module.css +46 -31
- package/src/dashboard/stat-card.module.css.d.ts +1 -0
- package/src/dashboard/stat-card.tsx +185 -127
- package/src/dashboard/stat-group.module.css +66 -0
- package/src/dashboard/stat-group.module.css.d.ts +8 -0
- package/src/dashboard/stat-group.tsx +74 -0
- package/src/dashboard/widget-grid.module.css +53 -0
- package/src/dashboard/widget-grid.module.css.d.ts +9 -0
- package/src/dashboard/widget-grid.tsx +127 -0
- package/src/data/data-table.module.css +64 -0
- package/src/data/data-table.module.css.d.ts +11 -0
- package/src/data/data-table.tsx +919 -346
- package/src/data/index.ts +30 -2
- package/src/data/query-branch.ts +53 -0
- package/src/data/table.ts +5 -0
- package/src/data/virtual-list.tsx +189 -55
- package/src/data/virtual.ts +5 -1
- package/src/forms/FormErrorSummary.tsx +13 -6
- package/src/forms/create-form.ts +2 -2
- package/src/forms/field.ts +60 -11
- package/src/forms/form-layout.module.css +145 -0
- package/src/forms/form-layout.module.css.d.ts +20 -0
- package/src/forms/form-layout.tsx +305 -0
- package/src/forms/form-state.tsx +94 -0
- package/src/forms/index.ts +38 -7
- package/src/forms/use-field-array.ts +94 -0
- package/src/forms/use-form-draft.ts +145 -53
- package/src/forms/use-form-submit.ts +199 -0
- package/src/guard/index.ts +73 -18
- package/src/index.ts +74 -10
- package/src/nav/types.ts +15 -6
- package/src/notifications/bell.tsx +18 -4
- package/src/notifications/center.tsx +18 -5
- package/src/notifications/define-notifications.ts +64 -18
- package/src/notifications/index.ts +12 -1
- package/src/notifications/mount-guard.ts +41 -0
- package/src/notifications/notify.tsx +122 -3
- package/src/notifications/overlay.tsx +2 -0
- package/src/notifications/store.ts +7 -0
- package/src/provider/index.tsx +101 -13
- package/src/provider/lab-theme.ts +2 -1
- package/src/query/devtools.tsx +1 -0
- package/src/router-tanstack/field.ts +1 -0
- package/src/router-tanstack/search-store.ts +3 -10
- package/src/router-tanstack/use-nav.ts +18 -13
- package/src/section/index.ts +1 -1
- package/src/section/section.module.css +11 -0
- package/src/section/section.tsx +163 -96
- package/src/shell/account-types.ts +5 -2
- package/src/shell/app-brand.module.css +109 -0
- package/src/shell/app-brand.module.css.d.ts +14 -0
- package/src/shell/app-brand.tsx +140 -0
- package/src/shell/app-breadcrumbs.tsx +19 -9
- package/src/shell/app-header.module.css +10 -5
- package/src/shell/app-main.module.css +107 -0
- package/src/shell/app-main.module.css.d.ts +11 -0
- package/src/shell/app-mobile-nav.module.css +48 -27
- package/src/shell/app-mobile-nav.module.css.d.ts +0 -1
- package/src/shell/app-mobile-nav.tsx +43 -11
- package/src/shell/app-sidebar-account.tsx +29 -6
- package/src/shell/app-sidebar.module.css +53 -96
- package/src/shell/app-sidebar.module.css.d.ts +0 -5
- package/src/shell/app-sidebar.tsx +40 -113
- package/src/shell/index.tsx +156 -65
- package/src/shell/isomorphic-layout-effect.ts +14 -0
- package/src/shell/mobile-nav-model.ts +66 -10
- package/src/shell/nav-count-badge.tsx +6 -1
- package/src/shell/page-aside.module.css +174 -0
- package/src/shell/page-aside.module.css.d.ts +14 -0
- package/src/shell/page-aside.tsx +377 -0
- package/src/shell/page-bar.module.css +107 -13
- package/src/shell/page-bar.module.css.d.ts +4 -1
- package/src/shell/page-bar.tsx +294 -94
- package/src/shell/sidebar-search.module.css +1 -1
- package/src/shell/sidebar-search.tsx +13 -4
- package/src/state/fields.ts +43 -10
- package/src/state/persisted-or-local.ts +50 -0
- package/src/state.ts +0 -9
- package/src/surfaces.ts +42 -12
- package/src/theme/ctl-theme.tsx +10 -0
- package/src/theme/index.ts +129 -16
- package/src/theme/nav-link.module.css +37 -26
- package/src/theme/segmented-control.module.css +22 -0
- package/src/theme/segmented-control.module.css.d.ts +1 -0
- package/src/theme-lab/boot.ts +140 -0
- package/src/theme-lab/index.tsx +21 -112
- package/src/theme-toggle/index.tsx +10 -3
- package/src/tokens/index.ts +50 -6
- package/src/tokens/palette.ts +58 -30
- package/src/utils/is-dev.ts +4 -0
- package/src/widget-header/delta-badge.tsx +25 -5
- package/src/widget-header/index.ts +10 -2
- package/src/widget-header/widget-header.module.css +72 -7
- package/src/widget-header/widget-header.tsx +150 -71
- package/dist/agent/adapter.test.d.ts +0 -2
- package/dist/agent/adapter.test.d.ts.map +0 -1
- package/dist/agent/ai-sdk-transport.test.d.ts +0 -2
- package/dist/agent/ai-sdk-transport.test.d.ts.map +0 -1
- package/dist/agent/coalesce.test.d.ts +0 -2
- package/dist/agent/coalesce.test.d.ts.map +0 -1
- package/dist/agent/foreign.test.d.ts +0 -2
- package/dist/agent/foreign.test.d.ts.map +0 -1
- package/dist/agent/id.test.d.ts +0 -2
- package/dist/agent/id.test.d.ts.map +0 -1
- package/dist/agent/merge.test.d.ts +0 -2
- package/dist/agent/merge.test.d.ts.map +0 -1
- package/dist/agent/part-list.test.d.ts +0 -2
- package/dist/agent/part-list.test.d.ts.map +0 -1
- package/dist/agent/parts.test.d.ts +0 -2
- package/dist/agent/parts.test.d.ts.map +0 -1
- package/dist/agent/thread.test.d.ts +0 -2
- package/dist/agent/thread.test.d.ts.map +0 -1
- package/dist/agent/transport.test.d.ts +0 -2
- package/dist/agent/transport.test.d.ts.map +0 -1
- package/dist/agent/use-agent-stream.test.d.ts +0 -2
- package/dist/agent/use-agent-stream.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.foreign.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.resume.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.test.d.ts.map +0 -1
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts +0 -2
- package/dist/agent/use-agent-thread-runs.wedge.test.d.ts.map +0 -1
- package/dist/agent-chat/composer.test.d.ts +0 -2
- package/dist/agent-chat/composer.test.d.ts.map +0 -1
- package/dist/agent-chat/relative-time.test.d.ts +0 -2
- package/dist/agent-chat/relative-time.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed-row.test.d.ts +0 -2
- package/dist/agent-chat/thread-feed-row.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-feed.test.d.ts +0 -2
- package/dist/agent-chat/thread-feed.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-message.test.d.ts +0 -2
- package/dist/agent-chat/thread-message.test.d.ts.map +0 -1
- package/dist/agent-chat/thread-workspace.test.d.ts +0 -2
- package/dist/agent-chat/thread-workspace.test.d.ts.map +0 -1
- package/dist/agent-chat/tool-chip.test.d.ts +0 -2
- package/dist/agent-chat/tool-chip.test.d.ts.map +0 -1
- package/dist/agent-chat/virtualize.type-guard.test.d.ts +0 -2
- package/dist/agent-chat/virtualize.type-guard.test.d.ts.map +0 -1
- package/dist/charts/cursor/resolve.test.d.ts +0 -2
- package/dist/charts/cursor/resolve.test.d.ts.map +0 -1
- package/dist/charts/cursor/store.test.d.ts +0 -2
- package/dist/charts/cursor/store.test.d.ts.map +0 -1
- package/dist/charts/kinds/BandStrip.test.d.ts +0 -2
- package/dist/charts/kinds/BandStrip.test.d.ts.map +0 -1
- package/dist/charts/kinds/Bars.test.d.ts +0 -2
- package/dist/charts/kinds/Bars.test.d.ts.map +0 -1
- package/dist/charts/kinds/DualPanel.test.d.ts +0 -2
- package/dist/charts/kinds/DualPanel.test.d.ts.map +0 -1
- package/dist/charts/kinds/MirroredBars.test.d.ts +0 -2
- package/dist/charts/kinds/MirroredBars.test.d.ts.map +0 -1
- package/dist/charts/kinds/MultiLine.test.d.ts +0 -2
- package/dist/charts/kinds/MultiLine.test.d.ts.map +0 -1
- package/dist/charts/kinds/StackedArea.test.d.ts +0 -2
- package/dist/charts/kinds/StackedArea.test.d.ts.map +0 -1
- package/dist/charts/kinds/ZonedLine.test.d.ts +0 -2
- package/dist/charts/kinds/ZonedLine.test.d.ts.map +0 -1
- package/dist/charts/layout/auto-margin.test.d.ts +0 -2
- package/dist/charts/layout/auto-margin.test.d.ts.map +0 -1
- package/dist/charts/primitives/CartesianChart.test.d.ts +0 -2
- package/dist/charts/primitives/CartesianChart.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartCard.test.d.ts +0 -2
- package/dist/charts/primitives/ChartCard.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartFrame.test.d.ts +0 -2
- package/dist/charts/primitives/ChartFrame.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartLegend.test.d.ts +0 -2
- package/dist/charts/primitives/ChartLegend.test.d.ts.map +0 -1
- package/dist/charts/primitives/ChartTooltip.test.d.ts +0 -2
- package/dist/charts/primitives/ChartTooltip.test.d.ts.map +0 -1
- package/dist/charts/primitives/XZoneRects.test.d.ts +0 -2
- package/dist/charts/primitives/XZoneRects.test.d.ts.map +0 -1
- package/dist/charts/series.test.d.ts +0 -2
- package/dist/charts/series.test.d.ts.map +0 -1
- package/dist/charts/utils/domain.test.d.ts +0 -2
- package/dist/charts/utils/domain.test.d.ts.map +0 -1
- package/dist/charts/utils/measure-text.test.d.ts +0 -2
- package/dist/charts/utils/measure-text.test.d.ts.map +0 -1
- package/dist/cli/check-coverage.test.d.ts +0 -2
- package/dist/cli/check-coverage.test.d.ts.map +0 -1
- package/dist/cli/check-theme.test.d.ts +0 -2
- package/dist/cli/check-theme.test.d.ts.map +0 -1
- package/dist/cli/help.test.d.ts +0 -2
- package/dist/cli/help.test.d.ts.map +0 -1
- package/dist/cli/init-sync.test.d.ts +0 -2
- package/dist/cli/init-sync.test.d.ts.map +0 -1
- package/dist/cli/placement-engine.test.d.ts +0 -2
- package/dist/cli/placement-engine.test.d.ts.map +0 -1
- package/dist/cli/shipped-versions.test.d.ts +0 -2
- package/dist/cli/shipped-versions.test.d.ts.map +0 -1
- package/dist/cli/tarball-parity.test.d.ts +0 -2
- package/dist/cli/tarball-parity.test.d.ts.map +0 -1
- package/dist/cli/template-format.test.d.ts +0 -2
- package/dist/cli/template-format.test.d.ts.map +0 -1
- package/dist/cli/template-ledger.test.d.ts +0 -2
- package/dist/cli/template-ledger.test.d.ts.map +0 -1
- package/dist/cli/tokens-css.test.d.ts +0 -2
- package/dist/cli/tokens-css.test.d.ts.map +0 -1
- package/dist/cli/toolchain-wiring.test.d.ts +0 -2
- package/dist/cli/toolchain-wiring.test.d.ts.map +0 -1
- package/dist/cli/waiver-audit.test.d.ts +0 -2
- package/dist/cli/waiver-audit.test.d.ts.map +0 -1
- package/dist/content/article-actions.test.d.ts +0 -2
- package/dist/content/article-actions.test.d.ts.map +0 -1
- package/dist/content/article-model.test.d.ts +0 -2
- package/dist/content/article-model.test.d.ts.map +0 -1
- package/dist/content/block-split.test.d.ts +0 -2
- package/dist/content/block-split.test.d.ts.map +0 -1
- package/dist/content/heading-components.test.d.ts +0 -2
- package/dist/content/heading-components.test.d.ts.map +0 -1
- package/dist/content/markdown.test.d.ts +0 -2
- package/dist/content/markdown.test.d.ts.map +0 -1
- package/dist/content/prose.module.css.test.d.ts +0 -2
- package/dist/content/prose.module.css.test.d.ts.map +0 -1
- package/dist/content/sanitize.test.d.ts +0 -2
- package/dist/content/sanitize.test.d.ts.map +0 -1
- package/dist/content/slug.test.d.ts +0 -2
- package/dist/content/slug.test.d.ts.map +0 -1
- package/dist/controls/actions.test.d.ts +0 -2
- package/dist/controls/actions.test.d.ts.map +0 -1
- package/dist/controls/actions.type-guard.test.d.ts +0 -2
- package/dist/controls/actions.type-guard.test.d.ts.map +0 -1
- package/dist/controls/control-group.test.d.ts +0 -2
- package/dist/controls/control-group.test.d.ts.map +0 -1
- package/dist/controls/controls.router.test.d.ts +0 -2
- package/dist/controls/controls.router.test.d.ts.map +0 -1
- package/dist/controls/filter-set.test.d.ts +0 -2
- package/dist/controls/filter-set.test.d.ts.map +0 -1
- package/dist/controls/peer-boundary.test.d.ts +0 -2
- package/dist/controls/peer-boundary.test.d.ts.map +0 -1
- package/dist/controls/props-contract.test.d.ts +0 -2
- package/dist/controls/props-contract.test.d.ts.map +0 -1
- package/dist/controls/range-filter.type-guard.test.d.ts +0 -2
- package/dist/controls/range-filter.type-guard.test.d.ts.map +0 -1
- package/dist/controls/sync-button.test.d.ts +0 -2
- package/dist/controls/sync-button.test.d.ts.map +0 -1
- package/dist/dashboard/query-state.test.d.ts +0 -2
- package/dist/dashboard/query-state.test.d.ts.map +0 -1
- package/dist/dashboard/settings-section.test.d.ts +0 -2
- package/dist/dashboard/settings-section.test.d.ts.map +0 -1
- package/dist/dashboard/stat-card.test.d.ts +0 -2
- package/dist/dashboard/stat-card.test.d.ts.map +0 -1
- package/dist/data/data-table.test.d.ts +0 -2
- package/dist/data/data-table.test.d.ts.map +0 -1
- package/dist/guard/check-source.test.d.ts +0 -2
- package/dist/guard/check-source.test.d.ts.map +0 -1
- package/dist/guard/grace.test.d.ts +0 -20
- package/dist/guard/grace.test.d.ts.map +0 -1
- package/dist/guard/guard-hook.test.d.ts +0 -2
- package/dist/guard/guard-hook.test.d.ts.map +0 -1
- package/dist/provider/index.test.d.ts +0 -2
- package/dist/provider/index.test.d.ts.map +0 -1
- package/dist/provider/lab-theme.test.d.ts +0 -2
- package/dist/provider/lab-theme.test.d.ts.map +0 -1
- package/dist/query/error-message.test.d.ts +0 -2
- package/dist/query/error-message.test.d.ts.map +0 -1
- package/dist/router-tanstack/multi-search-param-store.test.d.ts +0 -2
- package/dist/router-tanstack/multi-search-param-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/nav.test.d.ts +0 -2
- package/dist/router-tanstack/nav.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-param-store.test.d.ts +0 -2
- package/dist/router-tanstack/search-param-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-store.router.test.d.ts +0 -2
- package/dist/router-tanstack/search-store.router.test.d.ts.map +0 -1
- package/dist/router-tanstack/search-store.test.d.ts +0 -2
- package/dist/router-tanstack/search-store.test.d.ts.map +0 -1
- package/dist/router-tanstack/use-nav.test.d.ts +0 -2
- package/dist/router-tanstack/use-nav.test.d.ts.map +0 -1
- package/dist/section/section.test.d.ts +0 -2
- package/dist/section/section.test.d.ts.map +0 -1
- package/dist/shell/app-mobile-nav.test.d.ts +0 -2
- package/dist/shell/app-mobile-nav.test.d.ts.map +0 -1
- package/dist/shell/app-sidebar.test.d.ts +0 -2
- package/dist/shell/app-sidebar.test.d.ts.map +0 -1
- package/dist/shell/index.test.d.ts +0 -2
- package/dist/shell/index.test.d.ts.map +0 -1
- package/dist/shell/mobile-nav-model.test.d.ts +0 -2
- package/dist/shell/mobile-nav-model.test.d.ts.map +0 -1
- package/dist/shell/page-bar.test.d.ts +0 -2
- package/dist/shell/page-bar.test.d.ts.map +0 -1
- package/dist/state/fields.test.d.ts +0 -2
- package/dist/state/fields.test.d.ts.map +0 -1
- package/dist/state/persisted.test.d.ts +0 -2
- package/dist/state/persisted.test.d.ts.map +0 -1
- package/dist/styles.floor.test.d.ts +0 -2
- package/dist/styles.floor.test.d.ts.map +0 -1
- package/dist/theme/border-coverage.test.d.ts +0 -18
- package/dist/theme/border-coverage.test.d.ts.map +0 -1
- package/dist/theme/contrast.test.d.ts +0 -2
- package/dist/theme/contrast.test.d.ts.map +0 -1
- package/dist/theme/ctl-theme.test.d.ts +0 -2
- package/dist/theme/ctl-theme.test.d.ts.map +0 -1
- package/dist/theme/ctl-tier-coverage.test.d.ts +0 -2
- package/dist/theme/ctl-tier-coverage.test.d.ts.map +0 -1
- package/dist/theme/density-option.test.d.ts +0 -2
- package/dist/theme/density-option.test.d.ts.map +0 -1
- package/dist/theme/density-relations.test.d.ts +0 -2
- package/dist/theme/density-relations.test.d.ts.map +0 -1
- package/dist/theme/derive-theme.test.d.ts +0 -2
- package/dist/theme/derive-theme.test.d.ts.map +0 -1
- package/dist/theme/divider-law.test.d.ts +0 -2
- package/dist/theme/divider-law.test.d.ts.map +0 -1
- package/dist/theme/fonts-option.test.d.ts +0 -2
- package/dist/theme/fonts-option.test.d.ts.map +0 -1
- package/dist/theme/icon-slot.test.d.ts +0 -2
- package/dist/theme/icon-slot.test.d.ts.map +0 -1
- package/dist/theme/layout-rhythm-css.test.d.ts +0 -2
- package/dist/theme/layout-rhythm-css.test.d.ts.map +0 -1
- package/dist/theme/radius-option.test.d.ts +0 -2
- package/dist/theme/radius-option.test.d.ts.map +0 -1
- package/dist/theme/radius.test.d.ts +0 -2
- package/dist/theme/radius.test.d.ts.map +0 -1
- package/dist/theme/shadow-surfaces.test.d.ts +0 -26
- package/dist/theme/shadow-surfaces.test.d.ts.map +0 -1
- package/dist/theme/spacing.test.d.ts +0 -2
- package/dist/theme/spacing.test.d.ts.map +0 -1
- package/dist/theme/use-basalt-spacing.test.d.ts +0 -2
- package/dist/theme/use-basalt-spacing.test.d.ts.map +0 -1
- package/dist/theme-lab/derive-controls.test.d.ts +0 -2
- package/dist/theme-lab/derive-controls.test.d.ts.map +0 -1
- package/dist/theme-lab/derive-state.test.d.ts +0 -2
- package/dist/theme-lab/derive-state.test.d.ts.map +0 -1
- package/dist/theme-lab/theme-lab.test.d.ts +0 -2
- package/dist/theme-lab/theme-lab.test.d.ts.map +0 -1
- package/dist/tokens/build-fonts-css.test.d.ts +0 -2
- package/dist/tokens/build-fonts-css.test.d.ts.map +0 -1
- package/dist/tokens/build-radius-css.test.d.ts +0 -2
- package/dist/tokens/build-radius-css.test.d.ts.map +0 -1
- package/dist/tokens/chart-margin.test.d.ts +0 -2
- package/dist/tokens/chart-margin.test.d.ts.map +0 -1
- package/dist/tokens/density.test.d.ts +0 -2
- package/dist/tokens/density.test.d.ts.map +0 -1
- package/dist/tokens/derive-radius.test.d.ts +0 -2
- package/dist/tokens/derive-radius.test.d.ts.map +0 -1
- package/dist/tokens/derive.test.d.ts +0 -2
- package/dist/tokens/derive.test.d.ts.map +0 -1
- package/dist/tokens/palette.test.d.ts +0 -2
- package/dist/tokens/palette.test.d.ts.map +0 -1
- package/dist/tokens/text-scale.test.d.ts +0 -2
- package/dist/tokens/text-scale.test.d.ts.map +0 -1
- package/dist/vite-color-mix.test.d.ts +0 -2
- package/dist/vite-color-mix.test.d.ts.map +0 -1
- package/dist/vite.test.d.ts +0 -2
- package/dist/vite.test.d.ts.map +0 -1
- package/dist/widget-header/delta-badge.test.d.ts +0 -2
- package/dist/widget-header/delta-badge.test.d.ts.map +0 -1
- package/dist/widget-header/no-mantine.test.d.ts +0 -2
- package/dist/widget-header/no-mantine.test.d.ts.map +0 -1
- package/dist/widget-header/widget-header.test.d.ts +0 -2
- package/dist/widget-header/widget-header.test.d.ts.map +0 -1
- package/src/agent/adapter.test.ts +0 -1640
- package/src/agent/ai-sdk-transport.test.ts +0 -658
- package/src/agent/coalesce.test.ts +0 -387
- package/src/agent/foreign.test.ts +0 -51
- package/src/agent/id.test.ts +0 -169
- package/src/agent/merge.test.ts +0 -206
- package/src/agent/part-list.test.tsx +0 -112
- package/src/agent/parts.test.ts +0 -720
- package/src/agent/thread.test.ts +0 -220
- package/src/agent/transport.test.ts +0 -70
- package/src/agent/use-agent-stream.test.tsx +0 -287
- package/src/agent/use-agent-thread-runs.foreign.test.tsx +0 -138
- package/src/agent/use-agent-thread-runs.resume.test.tsx +0 -294
- package/src/agent/use-agent-thread-runs.test.tsx +0 -1120
- package/src/agent/use-agent-thread-runs.wedge.test.tsx +0 -387
- package/src/agent-chat/composer.test.tsx +0 -924
- package/src/agent-chat/relative-time.test.ts +0 -95
- package/src/agent-chat/thread-feed-row.test.tsx +0 -510
- package/src/agent-chat/thread-feed.test.tsx +0 -241
- package/src/agent-chat/thread-message.test.tsx +0 -1285
- package/src/agent-chat/thread-workspace.test.tsx +0 -169
- package/src/agent-chat/tool-chip.test.tsx +0 -139
- package/src/agent-chat/virtualize.type-guard.test.ts +0 -49
- package/src/charts/cursor/resolve.test.ts +0 -151
- package/src/charts/cursor/store.test.ts +0 -64
- package/src/charts/kinds/BandStrip.test.tsx +0 -282
- package/src/charts/kinds/Bars.test.tsx +0 -183
- package/src/charts/kinds/DualPanel.test.tsx +0 -527
- package/src/charts/kinds/MirroredBars.test.tsx +0 -232
- package/src/charts/kinds/MultiLine.test.tsx +0 -218
- package/src/charts/kinds/StackedArea.test.tsx +0 -114
- package/src/charts/kinds/ZonedLine.test.tsx +0 -147
- package/src/charts/layout/auto-margin.test.ts +0 -42
- package/src/charts/primitives/CartesianChart.test.tsx +0 -647
- package/src/charts/primitives/ChartCard.test.tsx +0 -66
- package/src/charts/primitives/ChartFrame.test.tsx +0 -142
- package/src/charts/primitives/ChartLegend.test.tsx +0 -78
- package/src/charts/primitives/ChartTooltip.test.tsx +0 -44
- package/src/charts/primitives/XZoneRects.test.tsx +0 -123
- package/src/charts/series.test.ts +0 -112
- package/src/charts/utils/domain.test.ts +0 -54
- package/src/charts/utils/measure-text.test.ts +0 -36
- package/src/cli/check-coverage.test.ts +0 -297
- package/src/cli/check-theme.test.ts +0 -837
- package/src/cli/help.test.ts +0 -170
- package/src/cli/init-sync.test.ts +0 -343
- package/src/cli/placement-engine.test.ts +0 -298
- package/src/cli/shipped-versions.test.ts +0 -83
- package/src/cli/tarball-parity.test.ts +0 -44
- package/src/cli/template-format.test.ts +0 -64
- package/src/cli/template-ledger.test.ts +0 -219
- package/src/cli/tokens-css.test.ts +0 -249
- package/src/cli/toolchain-wiring.test.ts +0 -1358
- package/src/cli/waiver-audit.test.ts +0 -215
- package/src/content/article-actions.test.ts +0 -78
- package/src/content/article-model.test.ts +0 -119
- package/src/content/block-split.test.ts +0 -75
- package/src/content/heading-components.test.tsx +0 -65
- package/src/content/markdown.test.tsx +0 -603
- package/src/content/prose.module.css.test.ts +0 -39
- package/src/content/sanitize.test.ts +0 -659
- package/src/content/slug.test.ts +0 -62
- package/src/controls/actions.test.tsx +0 -252
- package/src/controls/actions.type-guard.test.ts +0 -63
- package/src/controls/control-group.test.tsx +0 -229
- package/src/controls/controls.router.test.tsx +0 -1053
- package/src/controls/filter-set.test.tsx +0 -472
- package/src/controls/peer-boundary.test.ts +0 -85
- package/src/controls/props-contract.test.tsx +0 -137
- package/src/controls/range-filter.type-guard.test.tsx +0 -122
- package/src/controls/sync-button.test.tsx +0 -183
- package/src/dashboard/query-state.test.tsx +0 -152
- package/src/dashboard/settings-section.test.tsx +0 -56
- package/src/dashboard/stat-card.test.tsx +0 -385
- package/src/data/data-table.test.tsx +0 -434
- package/src/guard/check-source.test.ts +0 -3388
- package/src/guard/grace.test.ts +0 -158
- package/src/guard/guard-hook.test.ts +0 -203
- package/src/provider/index.test.tsx +0 -101
- package/src/provider/lab-theme.test.ts +0 -147
- package/src/query/error-message.test.ts +0 -67
- package/src/router-tanstack/multi-search-param-store.test.ts +0 -124
- package/src/router-tanstack/nav.test.ts +0 -111
- package/src/router-tanstack/search-param-store.test.ts +0 -135
- package/src/router-tanstack/search-store.router.test.tsx +0 -882
- package/src/router-tanstack/search-store.test.ts +0 -578
- package/src/router-tanstack/use-nav.test.tsx +0 -187
- package/src/section/section.test.tsx +0 -204
- package/src/shell/app-mobile-nav.test.tsx +0 -403
- package/src/shell/app-sidebar.test.tsx +0 -509
- package/src/shell/index.test.tsx +0 -428
- package/src/shell/mobile-nav-model.test.ts +0 -517
- package/src/shell/page-bar.test.tsx +0 -316
- package/src/state/fields.test.tsx +0 -512
- package/src/state/persisted.test.ts +0 -91
- package/src/styles.floor.test.ts +0 -36
- package/src/theme/border-coverage.test.ts +0 -272
- package/src/theme/contrast.test.ts +0 -354
- package/src/theme/ctl-theme.test.tsx +0 -275
- package/src/theme/ctl-tier-coverage.test.ts +0 -170
- package/src/theme/density-option.test.ts +0 -96
- package/src/theme/density-relations.test.ts +0 -506
- package/src/theme/derive-theme.test.ts +0 -101
- package/src/theme/divider-law.test.ts +0 -259
- package/src/theme/fonts-option.test.ts +0 -75
- package/src/theme/icon-slot.test.tsx +0 -275
- package/src/theme/layout-rhythm-css.test.ts +0 -72
- package/src/theme/radius-option.test.ts +0 -86
- package/src/theme/radius.test.ts +0 -142
- package/src/theme/shadow-surfaces.test.ts +0 -488
- package/src/theme/spacing.test.ts +0 -495
- package/src/theme/use-basalt-spacing.test.tsx +0 -55
- package/src/theme-lab/derive-controls.test.ts +0 -94
- package/src/theme-lab/derive-state.test.ts +0 -71
- package/src/theme-lab/theme-lab.test.ts +0 -46
- package/src/tokens/build-fonts-css.test.ts +0 -52
- package/src/tokens/build-radius-css.test.ts +0 -25
- package/src/tokens/chart-margin.test.ts +0 -39
- package/src/tokens/density.test.ts +0 -259
- package/src/tokens/derive-radius.test.ts +0 -62
- package/src/tokens/derive.test.ts +0 -30
- package/src/tokens/palette.test.ts +0 -114
- package/src/tokens/text-scale.test.ts +0 -51
- package/src/vite-color-mix.test.ts +0 -46
- package/src/vite.test.ts +0 -423
- package/src/widget-header/delta-badge.test.tsx +0 -60
- package/src/widget-header/no-mantine.test.ts +0 -33
- package/src/widget-header/widget-header.test.tsx +0 -187
package/src/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.
|
|
@@ -524,23 +535,50 @@ const CONTROL_HOST_WINDOW_LINES = 12
|
|
|
524
535
|
|
|
525
536
|
/**
|
|
526
537
|
* A file whose BASENAME declares it is an overlay's or a form's own body — the cross-file half of
|
|
527
|
-
* {@link CONTROL_HOST_TAG}, and the same
|
|
528
|
-
* `basalt/control-outside-home` (one law, two
|
|
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).
|
|
529
541
|
*
|
|
530
542
|
* Law C1's cross-file case is advisory by declaration (`docs/CONTROLS-SPEC.md` §6, "Honest
|
|
531
543
|
* coverage"), and this kind was paying for it: a `<Select>` inside `edit-session-modal.tsx` whose
|
|
532
544
|
* `<Modal>` is rendered by the parent route is outside BOTH the 12-line host window and any
|
|
533
545
|
* ancestry walk, because the host tag is not in the file at all. argo carried 9 of them.
|
|
534
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
|
+
*
|
|
535
552
|
* The trade is that a whole file goes unscanned on a naming convention — the same bargain
|
|
536
553
|
* {@link MANTINE_FORM_IMPORT} already buys, and a smaller one than promoting the kind with 9 known
|
|
537
554
|
* false positives. Basename only: a `modal/` DIRECTORY holds the page pieces around the modals too.
|
|
538
555
|
*/
|
|
539
|
-
const
|
|
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$/
|
|
540
558
|
|
|
541
|
-
/**
|
|
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
|
+
*/
|
|
542
573
|
const CONTROL_OWNER_DEF =
|
|
543
|
-
/\b(?:function|const|class)\s+(?:RangeFilter|CompareFilter|SelectFilter|MultiSelectFilter|NumberFilter|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(?:\/[^'"]*)?['"]/
|
|
544
582
|
|
|
545
583
|
/** `@mantine/form` — a form is C1's third home, and its inputs are not filters. */
|
|
546
584
|
const MANTINE_FORM_IMPORT = /from\s+['"]@mantine\/form['"]/
|
|
@@ -653,17 +691,19 @@ export type GraceEntry = { since: string; promote: string; why: string }
|
|
|
653
691
|
export const GRACE_PERIOD_KINDS: Partial<Record<GuardKind, GraceEntry>> = {
|
|
654
692
|
'raw-selection-control': {
|
|
655
693
|
since: '1.26.0',
|
|
656
|
-
promote: '1.
|
|
694
|
+
promote: '1.30.0',
|
|
657
695
|
why:
|
|
658
696
|
'new in the wave-6 control guards (docs/CONTROLS-SPEC.md §6, law C1). The text lane cannot ' +
|
|
659
697
|
'see ancestry, so "no home" is approximated by a 12-line host-tag window — the loosest ' +
|
|
660
698
|
'reading in the guard, and the reason this one lands warn rather than error even though its ' +
|
|
661
|
-
'law is settled. It moved from 1.27.0 to 1.
|
|
699
|
+
'law is settled. It moved from 1.27.0 to 1.30.0 with its AST twin, `basalt/control-outside-' +
|
|
662
700
|
'home`, whose PLUGIN_RULE_GRACE entry carries the measurement: the wave-7 run left 9 warns ' +
|
|
663
701
|
'in argo, all of them a control in a modal/form module whose `<Modal>` is rendered by the ' +
|
|
664
|
-
'PARENT — law C1 cross-file, which neither lane can see. `
|
|
702
|
+
'PARENT — law C1 cross-file, which neither lane can see. `isOverlayConventionFile` (this ' +
|
|
665
703
|
'file, and the same regex in the plugin) exempts that declared naming convention in both ' +
|
|
666
|
-
'lanes
|
|
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.',
|
|
667
707
|
},
|
|
668
708
|
}
|
|
669
709
|
|
|
@@ -834,11 +874,25 @@ export const PLUGIN_RULE_IDS: ReadonlySet<string> = new Set([
|
|
|
834
874
|
'raw-scroll-container',
|
|
835
875
|
'hand-rolled-filter',
|
|
836
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',
|
|
837
880
|
'control-size-literal',
|
|
838
881
|
'page-bar-budget',
|
|
839
882
|
'responsive-twin',
|
|
840
883
|
'search-literal-link',
|
|
841
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',
|
|
842
896
|
// `in-body-page-title` is deliberately ABSENT: it is a plugin rule AND a guard kind under one id
|
|
843
897
|
// (one law, two lanes, one annotation), and this set is the ids OUTSIDE `checkSource`'s reach.
|
|
844
898
|
// `check-source.test.ts` asserts the two registries stay disjoint.
|
|
@@ -2381,13 +2435,14 @@ export function checkSource(text: string, relPath: string, cfg: GuardConfig): Fi
|
|
|
2381
2435
|
|
|
2382
2436
|
// raw-selection-control — full-text tag scan plus the host WINDOW (see CONTROL_HOST_WINDOW_LINES).
|
|
2383
2437
|
// Three file-level exemptions mirror the plugin rule's, so the two lanes agree on the same file:
|
|
2384
|
-
// a file that DEFINES a basalt control
|
|
2385
|
-
// `@mantine/form` is a form — C1's third home, whose inputs are not
|
|
2386
|
-
// an overlay body carries its `<Modal>` in the parent, where no
|
|
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.
|
|
2387
2442
|
if (
|
|
2388
2443
|
ruleApplies('raw-selection-control', relPath) &&
|
|
2389
|
-
!
|
|
2390
|
-
!CONTROL_OWNER_DEF.test(codeText) &&
|
|
2444
|
+
!isOverlayConventionFile(relPath) &&
|
|
2445
|
+
!(CONTROL_OWNER_DEF.test(codeText) && !BASALT_ANY_IMPORT.test(codeText)) &&
|
|
2391
2446
|
!MANTINE_FORM_IMPORT.test(codeText)
|
|
2392
2447
|
) {
|
|
2393
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,
|
|
@@ -114,36 +155,59 @@ export {
|
|
|
114
155
|
type RangeWindow,
|
|
115
156
|
type RangeWindows,
|
|
116
157
|
type ResolvedLane,
|
|
158
|
+
type ResolveLane,
|
|
117
159
|
type SearchValues,
|
|
118
160
|
type StoredValues,
|
|
119
161
|
type StringField,
|
|
120
162
|
} from './state'
|
|
121
163
|
|
|
122
164
|
// ── WidgetHeader (unified section/widget/card heading primitive, docs/CONTROLS-SPEC.md §2.2) ─────
|
|
123
|
-
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'
|
|
124
177
|
|
|
125
178
|
// ── Section (tier-2 heading composer over WidgetHeader, docs/CONTROLS-SPEC.md §2.2) ───────────────
|
|
126
|
-
export { Section, type SectionProps } from './section'
|
|
179
|
+
export { Section, type SectionProps, type SectionSlot } from './section'
|
|
127
180
|
|
|
128
181
|
// ── Dashboard composites (KPI atoms + settings building blocks) ──────────────────────────────────
|
|
129
182
|
export {
|
|
130
|
-
DeltaBadge,
|
|
131
|
-
type DeltaBadgeProps,
|
|
132
183
|
StatCard,
|
|
133
184
|
type StatCardBreakdownRow,
|
|
134
185
|
type StatCardProps,
|
|
186
|
+
type StatCardSlot,
|
|
135
187
|
type StatCardTone,
|
|
188
|
+
WidgetGrid,
|
|
189
|
+
type WidgetGridCols,
|
|
190
|
+
type WidgetGridItemProps,
|
|
191
|
+
type WidgetGridProps,
|
|
192
|
+
StatGroup,
|
|
193
|
+
type StatGroupCols,
|
|
194
|
+
type StatGroupProps,
|
|
136
195
|
EmptyState,
|
|
137
196
|
type EmptyStateProps,
|
|
197
|
+
type EmptyStateSlot,
|
|
138
198
|
SettingsSection,
|
|
139
199
|
type SettingsSectionProps,
|
|
200
|
+
type SettingsSectionSlot,
|
|
140
201
|
SettingsRow,
|
|
141
202
|
type SettingsRowProps,
|
|
203
|
+
type SettingsRowSlot,
|
|
142
204
|
DangerZone,
|
|
143
205
|
type DangerZoneProps,
|
|
144
206
|
QueryState,
|
|
145
207
|
type QueryStateProps,
|
|
146
208
|
type QueryStateLike,
|
|
209
|
+
type QueryStateSlot,
|
|
210
|
+
type QueryStateTier,
|
|
147
211
|
type QueryStateVariant,
|
|
148
212
|
type QueryEmptyCopy,
|
|
149
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]
|
|
@@ -19,6 +19,10 @@
|
|
|
19
19
|
* notifyError('Failed', { title: 'Upload error' })
|
|
20
20
|
* notifyPromise(save(), { loading: 'Saving…', success: 'Saved', error: 'Failed' })
|
|
21
21
|
*
|
|
22
|
+
* // Optimistic mutation with an undo window (the toast's autoClose IS the window):
|
|
23
|
+
* import { notifyUndo } from 'basalt-ui/notifications'
|
|
24
|
+
* notifyUndo({ message: 'Item deleted', onUndo: () => restore(), onExpire: () => api.delete(id) })
|
|
25
|
+
*
|
|
22
26
|
* // Shell bell (globalActions slot):
|
|
23
27
|
* <BasaltShell globalActions={[{ key: 'notifications', node: <NotificationBell />, mobile: 'bar' }]} ... />
|
|
24
28
|
*/
|
|
@@ -31,8 +35,15 @@ export {
|
|
|
31
35
|
notifyWarning,
|
|
32
36
|
notifyInfo,
|
|
33
37
|
notifyPromise,
|
|
38
|
+
notifyUndo,
|
|
39
|
+
notifyUndoable,
|
|
40
|
+
} from './notify'
|
|
41
|
+
export type {
|
|
42
|
+
NotifyOptions,
|
|
43
|
+
NotifyPromiseMessages,
|
|
44
|
+
NotifyUndoOptions,
|
|
45
|
+
NotifyUndoHandle,
|
|
34
46
|
} from './notify'
|
|
35
|
-
export type { NotifyOptions, NotifyPromiseMessages } from './notify'
|
|
36
47
|
|
|
37
48
|
// ── defineNotification + defineNotifications + typed emit ─────────────────────
|
|
38
49
|
export {
|