basalt-ui 1.24.0 → 1.26.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 +8 -6
- package/CHANGELOG.md +25 -0
- package/MIGRATING.md +547 -21
- package/README.md +46 -33
- package/agent/rules/basalt-batteries.md +205 -0
- package/agent/rules/basalt-charts.md +125 -555
- package/agent/rules/basalt-controls.md +155 -0
- package/agent/rules/basalt-mantine.md +146 -439
- package/agent/rules/basalt-state.md +113 -96
- package/agent/rules/basalt-tokens.md +126 -288
- package/agent/skills/basalt-app/SKILL.md +70 -195
- package/agent/skills/basalt-charts/SKILL.md +54 -234
- package/agent/skills/basalt-design/SKILL.md +56 -248
- package/agent/templates/CLAUDE-block.md.tpl +31 -40
- package/agent/templates/DESIGN.md.tpl +22 -51
- package/configs/oxlint-plugin.js +1275 -31
- package/configs/oxlint-plugin.test.ts +947 -11
- package/configs/oxlint.json +11 -3
- package/dist/charts/cursor/resolve.d.ts +18 -0
- package/dist/charts/cursor/resolve.d.ts.map +1 -1
- package/dist/charts/cursor/resolve.js +15 -6
- package/dist/charts/cursor/scope.d.ts +6 -3
- package/dist/charts/cursor/scope.d.ts.map +1 -1
- package/dist/charts/cursor/store.d.ts +5 -1
- package/dist/charts/cursor/store.d.ts.map +1 -1
- package/dist/charts/cursor/store.js +4 -4
- package/dist/charts/hooks/useChartCursor.d.ts.map +1 -1
- package/dist/charts/hooks/useChartCursor.js +9 -8
- package/dist/charts/index.d.ts +2 -2
- package/dist/charts/index.d.ts.map +1 -1
- package/dist/charts/primitives/ChartCard.d.ts +34 -9
- package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
- package/dist/charts/primitives/ChartCard.js +29 -114
- package/dist/charts/primitives/ChartCard.test.d.ts +2 -0
- package/dist/charts/primitives/ChartCard.test.d.ts.map +1 -0
- package/dist/charts/sparklines/BarSparkline.d.ts +26 -2
- package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
- package/dist/charts/sparklines/BarSparkline.js +18 -4
- package/dist/cli/check-coverage.test.d.ts +2 -0
- package/dist/cli/check-coverage.test.d.ts.map +1 -0
- package/dist/cli/index.d.ts +67 -4
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +225 -7
- package/dist/connectivity/connectivity-indicator.d.ts +4 -1
- package/dist/connectivity/connectivity-indicator.d.ts.map +1 -1
- package/dist/connectivity/connectivity-indicator.js +1 -1
- package/dist/content/index.d.ts +5 -3
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/index.js +4 -2
- package/dist/content/prose.module.css +7 -28
- package/dist/controls/actions.d.ts +169 -0
- package/dist/controls/actions.d.ts.map +1 -0
- package/dist/controls/actions.js +287 -0
- package/dist/controls/actions.module.css +62 -0
- package/dist/controls/actions.module.css.d.ts +13 -0
- package/dist/controls/actions.test.d.ts +2 -0
- package/dist/controls/actions.test.d.ts.map +1 -0
- package/dist/controls/actions.type-guard.test.d.ts +2 -0
- package/dist/controls/actions.type-guard.test.d.ts.map +1 -0
- package/dist/controls/compare-filter.d.ts +41 -0
- package/dist/controls/compare-filter.d.ts.map +1 -0
- package/dist/controls/compare-filter.js +23 -0
- package/dist/controls/control-group.d.ts +19 -0
- package/dist/controls/control-group.d.ts.map +1 -0
- package/dist/controls/control-group.js +20 -0
- package/dist/controls/control-group.test.d.ts +2 -0
- package/dist/controls/control-group.test.d.ts.map +1 -0
- package/dist/controls/controls.module.css +542 -0
- package/dist/controls/controls.module.css.d.ts +35 -0
- package/dist/controls/controls.router.test.d.ts +2 -0
- package/dist/controls/controls.router.test.d.ts.map +1 -0
- package/dist/controls/enum-filter.d.ts +30 -0
- package/dist/controls/enum-filter.d.ts.map +1 -0
- package/dist/controls/enum-filter.js +91 -0
- package/dist/controls/filter-context.d.ts +55 -0
- package/dist/controls/filter-context.d.ts.map +1 -0
- package/dist/controls/filter-context.js +69 -0
- package/dist/controls/filter-pill.d.ts +28 -0
- package/dist/controls/filter-pill.d.ts.map +1 -0
- package/dist/controls/filter-pill.js +70 -0
- package/dist/controls/filter-set.d.ts +13 -0
- package/dist/controls/filter-set.d.ts.map +1 -0
- package/dist/controls/filter-set.js +125 -0
- package/dist/controls/filter-set.test.d.ts +2 -0
- package/dist/controls/filter-set.test.d.ts.map +1 -0
- package/dist/controls/filter-sheet.d.ts +117 -0
- package/dist/controls/filter-sheet.d.ts.map +1 -0
- package/dist/controls/filter-sheet.js +146 -0
- package/dist/controls/glyphs.d.ts +27 -0
- package/dist/controls/glyphs.d.ts.map +1 -0
- package/dist/controls/glyphs.js +49 -0
- package/dist/controls/index.d.ts +19 -0
- package/dist/controls/index.d.ts.map +1 -0
- package/dist/controls/index.js +44 -0
- package/dist/controls/multi-select-filter.d.ts +23 -0
- package/dist/controls/multi-select-filter.d.ts.map +1 -0
- package/dist/controls/multi-select-filter.js +89 -0
- package/dist/controls/peer-boundary.test.d.ts +2 -0
- package/dist/controls/peer-boundary.test.d.ts.map +1 -0
- package/dist/controls/props-contract.test.d.ts +2 -0
- package/dist/controls/props-contract.test.d.ts.map +1 -0
- package/dist/controls/range-filter.d.ts +29 -0
- package/dist/controls/range-filter.d.ts.map +1 -0
- package/dist/controls/range-filter.js +120 -0
- package/dist/controls/search-filter.d.ts +10 -0
- package/dist/controls/search-filter.d.ts.map +1 -0
- package/dist/controls/search-filter.js +81 -0
- package/dist/controls/select-filter.d.ts +74 -0
- package/dist/controls/select-filter.d.ts.map +1 -0
- package/dist/controls/select-filter.js +10 -0
- package/dist/controls/sync-button.d.ts +38 -0
- package/dist/controls/sync-button.d.ts.map +1 -0
- package/dist/controls/sync-button.js +119 -0
- package/dist/controls/sync-button.module.css +63 -0
- package/dist/controls/sync-button.module.css.d.ts +11 -0
- package/dist/controls/sync-button.test.d.ts +2 -0
- package/dist/controls/sync-button.test.d.ts.map +1 -0
- package/dist/controls/toggle-filter.d.ts +9 -0
- package/dist/controls/toggle-filter.d.ts.map +1 -0
- package/dist/controls/toggle-filter.js +42 -0
- package/dist/controls/view-tabs.d.ts +23 -0
- package/dist/controls/view-tabs.d.ts.map +1 -0
- package/dist/controls/view-tabs.js +59 -0
- package/dist/controls-dates/date-range-picker.d.ts +4 -0
- package/dist/controls-dates/date-range-picker.d.ts.map +1 -0
- package/dist/controls-dates/date-range-picker.js +18 -0
- package/dist/controls-dates/index.d.ts +9 -0
- package/dist/controls-dates/index.d.ts.map +1 -0
- package/dist/controls-dates/index.js +4 -0
- package/dist/dashboard/delta-badge.d.ts +6 -12
- package/dist/dashboard/delta-badge.d.ts.map +1 -1
- package/dist/dashboard/delta-badge.js +1 -50
- package/dist/dashboard/query-state.d.ts +1 -1
- package/dist/dashboard/settings-section.d.ts +6 -4
- package/dist/dashboard/settings-section.d.ts.map +1 -1
- package/dist/dashboard/settings-section.js +23 -16
- package/dist/dashboard/settings-section.module.css +10 -0
- package/dist/dashboard/settings-section.module.css.d.ts +1 -0
- package/dist/dashboard/settings-section.test.d.ts +2 -0
- package/dist/dashboard/settings-section.test.d.ts.map +1 -0
- package/dist/dashboard/stat-card.d.ts +44 -9
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +80 -48
- package/dist/dashboard/stat-card.module.css +82 -0
- package/dist/dashboard/stat-card.module.css.d.ts +11 -0
- package/dist/data/data-table.d.ts +102 -20
- package/dist/data/data-table.d.ts.map +1 -1
- package/dist/data/data-table.js +166 -65
- package/dist/data/table.d.ts +1 -1
- package/dist/data/table.d.ts.map +1 -1
- package/dist/guard/grace.test.d.ts +20 -0
- package/dist/guard/grace.test.d.ts.map +1 -0
- package/dist/guard/index.d.ts +66 -3
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +82 -7
- package/dist/guard/types.d.ts +3 -3
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +12 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -10
- package/dist/nav/types.d.ts +78 -2
- package/dist/nav/types.d.ts.map +1 -1
- package/dist/notifications/bell.d.ts +4 -1
- package/dist/notifications/bell.d.ts.map +1 -1
- package/dist/notifications/index.d.ts +1 -1
- package/dist/router-tanstack/field.d.ts +14 -0
- package/dist/router-tanstack/field.d.ts.map +1 -0
- package/dist/router-tanstack/field.js +4 -0
- package/dist/router-tanstack/index.d.ts +6 -2
- package/dist/router-tanstack/index.d.ts.map +1 -1
- package/dist/router-tanstack/index.js +4 -0
- package/dist/router-tanstack/multi-search-param-store.d.ts +4 -52
- package/dist/router-tanstack/multi-search-param-store.d.ts.map +1 -1
- package/dist/router-tanstack/multi-search-param-store.js +19 -27
- package/dist/router-tanstack/search-param-store.d.ts +3 -87
- package/dist/router-tanstack/search-param-store.d.ts.map +1 -1
- package/dist/router-tanstack/search-param-store.js +16 -45
- package/dist/router-tanstack/search-store.d.ts +81 -0
- package/dist/router-tanstack/search-store.d.ts.map +1 -0
- package/dist/router-tanstack/search-store.js +187 -0
- package/dist/router-tanstack/search-store.router.test.d.ts +2 -0
- package/dist/router-tanstack/search-store.router.test.d.ts.map +1 -0
- package/dist/router-tanstack/search-store.test.d.ts +2 -0
- package/dist/router-tanstack/search-store.test.d.ts.map +1 -0
- package/dist/router-tanstack/use-nav.d.ts +0 -2
- package/dist/router-tanstack/use-nav.d.ts.map +1 -1
- package/dist/router-tanstack/use-nav.js +34 -12
- package/dist/router-tanstack/use-nav.test.d.ts +2 -0
- package/dist/router-tanstack/use-nav.test.d.ts.map +1 -0
- package/dist/section/index.d.ts +2 -0
- package/dist/section/index.d.ts.map +1 -0
- package/dist/section/index.js +4 -0
- package/dist/section/section.d.ts +24 -0
- package/dist/section/section.d.ts.map +1 -0
- package/dist/section/section.js +126 -0
- package/dist/section/section.module.css +104 -0
- package/dist/section/section.module.css.d.ts +11 -0
- package/dist/section/section.test.d.ts +2 -0
- package/dist/section/section.test.d.ts.map +1 -0
- package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
- package/dist/shell/app-breadcrumbs.js +18 -15
- package/dist/shell/app-header.module.css +77 -37
- package/dist/shell/app-header.module.css.d.ts +2 -1
- package/dist/shell/app-mobile-nav.d.ts +9 -2
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-mobile-nav.js +98 -11
- package/dist/shell/app-mobile-nav.module.css +8 -0
- package/dist/shell/app-mobile-nav.module.css.d.ts +1 -0
- package/dist/shell/app-sidebar.d.ts +55 -28
- package/dist/shell/app-sidebar.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +116 -67
- package/dist/shell/app-sidebar.module.css +303 -20
- package/dist/shell/app-sidebar.module.css.d.ts +19 -1
- package/dist/shell/index.d.ts +55 -21
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +40 -18
- package/dist/shell/mobile-nav-model.d.ts +13 -2
- package/dist/shell/mobile-nav-model.d.ts.map +1 -1
- package/dist/shell/mobile-nav-model.js +15 -1
- package/dist/shell/nav-count-badge.d.ts +1 -1
- package/dist/shell/page-bar.d.ts +51 -0
- package/dist/shell/page-bar.d.ts.map +1 -0
- package/dist/shell/page-bar.js +154 -0
- package/dist/shell/page-bar.module.css +178 -0
- package/dist/shell/page-bar.module.css.d.ts +17 -0
- package/dist/shell/page-bar.test.d.ts +2 -0
- package/dist/shell/page-bar.test.d.ts.map +1 -0
- package/dist/shell/sidebar-block-model.d.ts +48 -0
- package/dist/shell/sidebar-block-model.d.ts.map +1 -0
- package/dist/shell/sidebar-block-model.js +39 -0
- package/dist/shell/sidebar-blocks.d.ts +32 -0
- package/dist/shell/sidebar-blocks.d.ts.map +1 -0
- package/dist/shell/sidebar-blocks.js +169 -0
- package/dist/shell/sidebar-search.d.ts +13 -1
- package/dist/shell/sidebar-search.d.ts.map +1 -1
- package/dist/shell/sidebar-search.js +34 -1
- package/dist/shell/sidebar-search.module.css +26 -0
- package/dist/shell/sidebar-search.module.css.d.ts +2 -0
- package/dist/state/fields.d.ts +392 -0
- package/dist/state/fields.d.ts.map +1 -0
- package/dist/state/fields.js +369 -0
- package/dist/state/fields.test.d.ts +2 -0
- package/dist/state/fields.test.d.ts.map +1 -0
- package/dist/state/persisted.d.ts +48 -0
- package/dist/state/persisted.d.ts.map +1 -0
- package/dist/state/persisted.js +105 -0
- package/dist/state.d.ts +11 -56
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +14 -120
- package/dist/styles.css +13 -0
- package/dist/surfaces.d.ts +106 -24
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +155 -19
- package/dist/theme/controls.module.css +16 -1
- package/dist/theme/ctl-theme.d.ts +32 -0
- package/dist/theme/ctl-theme.d.ts.map +1 -0
- package/dist/theme/ctl-theme.js +54 -0
- package/dist/theme/ctl-theme.test.d.ts +2 -0
- package/dist/theme/ctl-theme.test.d.ts.map +1 -0
- package/dist/theme/ctl-tier-coverage.test.d.ts +2 -0
- package/dist/theme/ctl-tier-coverage.test.d.ts.map +1 -0
- package/dist/theme/divider-law.test.d.ts +2 -0
- package/dist/theme/divider-law.test.d.ts.map +1 -0
- package/dist/theme/icon-slot.d.ts +44 -0
- package/dist/theme/icon-slot.d.ts.map +1 -0
- package/dist/theme/icon-slot.js +21 -0
- package/dist/theme/icon-slot.module.css +47 -0
- package/dist/theme/icon-slot.module.css.d.ts +8 -0
- package/dist/theme/icon-slot.test.d.ts +2 -0
- package/dist/theme/icon-slot.test.d.ts.map +1 -0
- package/dist/theme/index.d.ts +1 -0
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +82 -5
- package/dist/theme/layout-rhythm-css.test.d.ts +2 -0
- package/dist/theme/layout-rhythm-css.test.d.ts.map +1 -0
- package/dist/theme/segmented-control.module.css +20 -0
- package/dist/theme/shadow-surfaces.test.d.ts.map +1 -1
- package/dist/tokens/index.d.ts +12 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +38 -8
- package/dist/tokens/palette.d.ts +97 -61
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +76 -38
- package/dist/tokens.css +10 -2
- package/dist/widget-header/delta-badge.d.ts +13 -0
- package/dist/widget-header/delta-badge.d.ts.map +1 -0
- package/dist/widget-header/delta-badge.js +29 -0
- package/dist/widget-header/delta-badge.test.d.ts +2 -0
- package/dist/widget-header/delta-badge.test.d.ts.map +1 -0
- package/dist/widget-header/index.d.ts +3 -0
- package/dist/widget-header/index.d.ts.map +1 -0
- package/dist/widget-header/index.js +6 -0
- package/dist/widget-header/no-mantine.test.d.ts +2 -0
- package/dist/widget-header/no-mantine.test.d.ts.map +1 -0
- package/dist/widget-header/widget-header.d.ts +37 -0
- package/dist/widget-header/widget-header.d.ts.map +1 -0
- package/dist/widget-header/widget-header.js +77 -0
- package/dist/widget-header/widget-header.module.css +335 -0
- package/dist/widget-header/widget-header.module.css.d.ts +24 -0
- package/dist/widget-header/widget-header.test.d.ts +2 -0
- package/dist/widget-header/widget-header.test.d.ts.map +1 -0
- package/llms.txt +30 -17
- package/package.json +14 -1
- package/src/charts/cursor/resolve.test.ts +29 -1
- package/src/charts/cursor/resolve.ts +38 -6
- package/src/charts/cursor/scope.tsx +6 -3
- package/src/charts/cursor/store.test.ts +19 -1
- package/src/charts/cursor/store.ts +10 -5
- package/src/charts/hooks/useChartCursor.ts +16 -8
- package/src/charts/index.ts +2 -2
- package/src/charts/primitives/CartesianChart.test.tsx +124 -0
- package/src/charts/primitives/ChartCard.test.tsx +66 -0
- package/src/charts/primitives/ChartCard.tsx +86 -146
- package/src/charts/sparklines/BarSparkline.tsx +43 -5
- package/src/cli/check-coverage.test.ts +297 -0
- package/src/cli/check-theme.test.ts +38 -14
- package/src/cli/index.ts +392 -16
- package/src/cli/init-sync.test.ts +97 -0
- package/src/connectivity/connectivity-indicator.tsx +16 -9
- package/src/content/index.ts +16 -3
- package/src/content/prose.module.css +7 -28
- package/src/content/prose.module.css.test.ts +8 -24
- package/src/controls/actions.module.css +62 -0
- package/src/controls/actions.module.css.d.ts +13 -0
- package/src/controls/actions.test.tsx +252 -0
- package/src/controls/actions.tsx +655 -0
- package/src/controls/actions.type-guard.test.ts +63 -0
- package/src/controls/compare-filter.tsx +64 -0
- package/src/controls/control-group.test.tsx +229 -0
- package/src/controls/control-group.tsx +63 -0
- package/src/controls/controls.module.css +542 -0
- package/src/controls/controls.module.css.d.ts +35 -0
- package/src/controls/controls.router.test.tsx +637 -0
- package/src/controls/enum-filter.tsx +159 -0
- package/src/controls/filter-context.tsx +153 -0
- package/src/controls/filter-pill.tsx +120 -0
- package/src/controls/filter-set.test.tsx +472 -0
- package/src/controls/filter-set.tsx +225 -0
- package/src/controls/filter-sheet.tsx +285 -0
- package/src/controls/glyphs.tsx +81 -0
- package/src/controls/index.ts +48 -0
- package/src/controls/multi-select-filter.tsx +140 -0
- package/src/controls/peer-boundary.test.ts +85 -0
- package/src/controls/props-contract.test.tsx +106 -0
- package/src/controls/range-filter.tsx +184 -0
- package/src/controls/search-filter.tsx +123 -0
- package/src/controls/select-filter.tsx +89 -0
- package/src/controls/sync-button.module.css +63 -0
- package/src/controls/sync-button.module.css.d.ts +11 -0
- package/src/controls/sync-button.test.tsx +183 -0
- package/src/controls/sync-button.tsx +197 -0
- package/src/controls/toggle-filter.tsx +60 -0
- package/src/controls/view-tabs.tsx +110 -0
- package/src/controls-dates/date-range-picker.tsx +42 -0
- package/src/controls-dates/index.ts +8 -0
- package/src/dashboard/delta-badge.tsx +4 -74
- package/src/dashboard/query-state.tsx +1 -1
- package/src/dashboard/settings-section.module.css +10 -0
- package/src/dashboard/settings-section.module.css.d.ts +1 -0
- package/src/dashboard/settings-section.test.tsx +56 -0
- package/src/dashboard/settings-section.tsx +33 -30
- package/src/dashboard/stat-card.module.css +82 -0
- package/src/dashboard/stat-card.module.css.d.ts +11 -0
- package/src/dashboard/stat-card.test.tsx +67 -1
- package/src/dashboard/stat-card.tsx +209 -68
- package/src/data/data-table.test.tsx +282 -6
- package/src/data/data-table.tsx +429 -94
- package/src/data/table.ts +2 -0
- package/src/guard/check-source.test.ts +126 -13
- package/src/guard/grace.test.ts +149 -0
- package/src/guard/index.ts +172 -29
- package/src/guard/types.ts +4 -2
- package/src/index.ts +46 -5
- package/src/nav/types.ts +84 -2
- package/src/notifications/bell.tsx +6 -3
- package/src/notifications/index.ts +1 -1
- package/src/router-tanstack/field.ts +31 -0
- package/src/router-tanstack/index.ts +24 -2
- package/src/router-tanstack/multi-search-param-store.test.ts +71 -3
- package/src/router-tanstack/multi-search-param-store.ts +46 -77
- package/src/router-tanstack/search-param-store.ts +42 -159
- package/src/router-tanstack/search-store.router.test.tsx +661 -0
- package/src/router-tanstack/search-store.test.ts +418 -0
- package/src/router-tanstack/search-store.ts +380 -0
- package/src/router-tanstack/use-nav.test.tsx +187 -0
- package/src/router-tanstack/use-nav.ts +72 -14
- package/src/section/index.ts +1 -0
- package/src/section/section.module.css +104 -0
- package/src/section/section.module.css.d.ts +11 -0
- package/src/section/section.test.tsx +204 -0
- package/src/section/section.tsx +220 -0
- package/src/shell/app-breadcrumbs.tsx +44 -31
- package/src/shell/app-header.module.css +77 -37
- package/src/shell/app-header.module.css.d.ts +2 -1
- package/src/shell/app-mobile-nav.module.css +8 -0
- package/src/shell/app-mobile-nav.module.css.d.ts +1 -0
- package/src/shell/app-mobile-nav.tsx +147 -8
- package/src/shell/app-sidebar-account.tsx +2 -2
- package/src/shell/app-sidebar.module.css +303 -20
- package/src/shell/app-sidebar.module.css.d.ts +19 -1
- package/src/shell/app-sidebar.test.tsx +456 -41
- package/src/shell/app-sidebar.tsx +276 -140
- package/src/shell/index.test.tsx +291 -5
- package/src/shell/index.tsx +137 -38
- package/src/shell/mobile-nav-model.test.ts +228 -7
- package/src/shell/mobile-nav-model.ts +53 -3
- package/src/shell/nav-count-badge.tsx +1 -1
- package/src/shell/page-bar.module.css +178 -0
- package/src/shell/page-bar.module.css.d.ts +17 -0
- package/src/shell/page-bar.test.tsx +316 -0
- package/src/shell/page-bar.tsx +315 -0
- package/src/shell/sidebar-block-model.ts +83 -0
- package/src/shell/sidebar-blocks.tsx +301 -0
- package/src/shell/sidebar-search.module.css +26 -0
- package/src/shell/sidebar-search.module.css.d.ts +2 -0
- package/src/shell/sidebar-search.tsx +71 -2
- package/src/state/fields.test.tsx +258 -0
- package/src/state/fields.ts +892 -0
- package/src/state/persisted.ts +211 -0
- package/src/state.ts +46 -240
- package/src/styles.css +13 -0
- package/src/surfaces.ts +203 -36
- package/src/theme/controls.module.css +16 -1
- package/src/theme/ctl-theme.test.tsx +275 -0
- package/src/theme/ctl-theme.tsx +138 -0
- package/src/theme/ctl-tier-coverage.test.ts +170 -0
- package/src/theme/density-relations.test.ts +106 -51
- package/src/theme/divider-law.test.ts +259 -0
- package/src/theme/icon-slot.module.css +47 -0
- package/src/theme/icon-slot.module.css.d.ts +8 -0
- package/src/theme/icon-slot.test.tsx +275 -0
- package/src/theme/icon-slot.tsx +59 -0
- package/src/theme/index.ts +165 -3
- package/src/theme/layout-rhythm-css.test.ts +72 -0
- package/src/theme/radius.test.ts +11 -1
- package/src/theme/segmented-control.module.css +20 -0
- package/src/theme/shadow-surfaces.test.ts +20 -7
- package/src/theme/spacing.test.ts +75 -27
- package/src/theme/use-basalt-spacing.ts +2 -2
- package/src/tokens/density.test.ts +7 -25
- package/src/tokens/index.ts +48 -8
- package/src/tokens/palette.ts +107 -73
- package/src/widget-header/delta-badge.test.tsx +60 -0
- package/src/widget-header/delta-badge.tsx +57 -0
- package/src/widget-header/index.ts +2 -0
- package/src/widget-header/no-mantine.test.ts +33 -0
- package/src/widget-header/widget-header.module.css +335 -0
- package/src/widget-header/widget-header.module.css.d.ts +24 -0
- package/src/widget-header/widget-header.test.tsx +187 -0
- package/src/widget-header/widget-header.tsx +168 -0
- package/agent/rules/basalt-agent.md +0 -452
- package/agent/rules/basalt-app.md +0 -246
- package/agent/rules/basalt-commands.md +0 -320
- package/agent/rules/basalt-content.md +0 -409
- package/agent/rules/basalt-data.md +0 -269
- package/agent/rules/basalt-forms.md +0 -186
- package/agent/rules/basalt-notifications.md +0 -264
- package/agent/rules/basalt-query.md +0 -187
- package/agent/rules/basalt-router.md +0 -336
- package/dist/content/article-filter-bar.d.ts +0 -40
- package/dist/content/article-filter-bar.d.ts.map +0 -1
- package/dist/content/article-filter-bar.js +0 -56
- package/dist/shell/page-header.d.ts +0 -13
- package/dist/shell/page-header.d.ts.map +0 -1
- package/dist/shell/page-header.js +0 -23
- package/src/content/article-filter-bar.tsx +0 -88
- package/src/shell/page-header.tsx +0 -35
package/dist/state.js
CHANGED
|
@@ -1,124 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
const getOnlineSnapshot = () => navigator.onLine;
|
|
13
|
-
const getOnlineServerSnapshot = () => true;
|
|
14
|
-
const isOnlineServer = typeof window === "undefined";
|
|
15
|
-
function useOnlineStatus() {
|
|
16
|
-
return useSyncExternalStore(
|
|
17
|
-
isOnlineServer ? noopSubscribe : subscribeOnline,
|
|
18
|
-
isOnlineServer ? getOnlineServerSnapshot : getOnlineSnapshot,
|
|
19
|
-
getOnlineServerSnapshot
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
function isEnvelope(raw) {
|
|
23
|
-
return typeof raw === "object" && raw !== null && "v" in raw && typeof raw["v"] === "number" && "value" in raw;
|
|
24
|
-
}
|
|
25
|
-
function parseStorage(raw, opts) {
|
|
26
|
-
if (raw === null) return opts.initial;
|
|
27
|
-
try {
|
|
28
|
-
const parsed = JSON.parse(raw);
|
|
29
|
-
if (!isEnvelope(parsed)) return opts.initial;
|
|
30
|
-
let value = parsed.value;
|
|
31
|
-
if (parsed.v !== opts.version) {
|
|
32
|
-
value = opts.migrate ? opts.migrate(parsed.value, parsed.v) : opts.initial;
|
|
33
|
-
}
|
|
34
|
-
if (opts.schema) {
|
|
35
|
-
const result = opts.schema["~standard"].validate(value);
|
|
36
|
-
if (result instanceof Promise) return opts.initial;
|
|
37
|
-
if (result.issues !== void 0) return opts.initial;
|
|
38
|
-
return result.value;
|
|
39
|
-
}
|
|
40
|
-
return value;
|
|
41
|
-
} catch {
|
|
42
|
-
return opts.initial;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
function writeStorage(opts, next) {
|
|
46
|
-
const storageKey = `basalt:${opts.key}`;
|
|
47
|
-
try {
|
|
48
|
-
const envelope = { v: opts.version, value: next };
|
|
49
|
-
window.localStorage.setItem(storageKey, JSON.stringify(envelope));
|
|
50
|
-
} catch {
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
function createPersistedState(opts) {
|
|
54
|
-
const storageKey = `basalt:${opts.key}`;
|
|
55
|
-
const listeners = /* @__PURE__ */ new Set();
|
|
56
|
-
let storageHandler = null;
|
|
57
|
-
const subscribe = (cb) => {
|
|
58
|
-
listeners.add(cb);
|
|
59
|
-
if (storageHandler === null) {
|
|
60
|
-
storageHandler = (e) => {
|
|
61
|
-
if (e.key === storageKey) {
|
|
62
|
-
for (const listener of listeners) listener();
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
window.addEventListener("storage", storageHandler);
|
|
66
|
-
}
|
|
67
|
-
return () => {
|
|
68
|
-
listeners.delete(cb);
|
|
69
|
-
if (listeners.size === 0 && storageHandler !== null) {
|
|
70
|
-
window.removeEventListener("storage", storageHandler);
|
|
71
|
-
storageHandler = null;
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
};
|
|
75
|
-
let cachedRaw = null;
|
|
76
|
-
let cachedValue = opts.initial;
|
|
77
|
-
let primed = false;
|
|
78
|
-
const getSnapshot = () => {
|
|
79
|
-
let raw;
|
|
80
|
-
try {
|
|
81
|
-
raw = window.localStorage.getItem(storageKey);
|
|
82
|
-
} catch {
|
|
83
|
-
raw = null;
|
|
84
|
-
}
|
|
85
|
-
if (primed && raw === cachedRaw) return cachedValue;
|
|
86
|
-
cachedRaw = raw;
|
|
87
|
-
cachedValue = parseStorage(raw, opts);
|
|
88
|
-
primed = true;
|
|
89
|
-
return cachedValue;
|
|
90
|
-
};
|
|
91
|
-
const getServerSnapshot = () => opts.initial;
|
|
92
|
-
const setState = (next) => {
|
|
93
|
-
writeStorage(opts, next);
|
|
94
|
-
for (const cb of listeners) cb();
|
|
95
|
-
};
|
|
96
|
-
const isServer = typeof window === "undefined";
|
|
97
|
-
return function usePersistedState() {
|
|
98
|
-
const value = useSyncExternalStore(
|
|
99
|
-
// SSR guard — subscribe must not reference `window` on the server.
|
|
100
|
-
isServer ? noopSubscribe : subscribe,
|
|
101
|
-
isServer ? getServerSnapshot : getSnapshot,
|
|
102
|
-
getServerSnapshot
|
|
103
|
-
);
|
|
104
|
-
return [value, setState];
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
function readPersistedValue(key, version) {
|
|
108
|
-
const storageKey = `basalt:${key}`;
|
|
109
|
-
try {
|
|
110
|
-
const raw = localStorage.getItem(storageKey);
|
|
111
|
-
if (raw === null) return null;
|
|
112
|
-
const envelope = JSON.parse(raw);
|
|
113
|
-
if (!isEnvelope(envelope)) return null;
|
|
114
|
-
if (version !== void 0 && envelope.v !== version) return null;
|
|
115
|
-
return envelope.value;
|
|
116
|
-
} catch {
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
createPersistedState,
|
|
3
|
+
readPersistedValue
|
|
4
|
+
} from "./state/persisted.js";
|
|
5
|
+
import {
|
|
6
|
+
field,
|
|
7
|
+
createLocalStore,
|
|
8
|
+
resolveFieldCodec,
|
|
9
|
+
createStoreCore
|
|
10
|
+
} from "./state/fields.js";
|
|
120
11
|
export {
|
|
12
|
+
createLocalStore,
|
|
121
13
|
createPersistedState,
|
|
14
|
+
createStoreCore,
|
|
15
|
+
field,
|
|
122
16
|
readPersistedValue,
|
|
123
|
-
|
|
17
|
+
resolveFieldCodec
|
|
124
18
|
};
|
package/dist/styles.css
CHANGED
|
@@ -68,6 +68,19 @@
|
|
|
68
68
|
font-size: max(16px, var(--input-fz, 1rem)) !important;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
/* `data-numeric` — one typographic law, every element. A number read as a MEASUREMENT (a preset
|
|
72
|
+
like `7d`/`30d`, a KPI value, a table cell, a count tag) is mono with tabular figures, so
|
|
73
|
+
digits line up column-wise and a changing value does not reflow its neighbours. Declared here,
|
|
74
|
+
unscoped, because the attribute is the contract: `theme/segmented-control.module.css` and
|
|
75
|
+
`controls/controls.module.css` were each carrying their own copy, which is why a plain
|
|
76
|
+
`<Text data-numeric>` in a consumer silently rendered in the sans face. Those two module rules
|
|
77
|
+
STAY — they additionally set `font-size` for their own component, which is a component
|
|
78
|
+
decision, not a law. */
|
|
79
|
+
[data-numeric] {
|
|
80
|
+
font-family: var(--basalt-font-mono);
|
|
81
|
+
font-variant-numeric: tabular-nums;
|
|
82
|
+
}
|
|
83
|
+
|
|
71
84
|
/* Focus ring = the accent as INK, not as a fill. Mantine hardcodes the ring to
|
|
72
85
|
`var(--mantine-primary-color-filled)` — the SURFACE token, which is deliberately deep in both
|
|
73
86
|
schemes so a white label sits on it (see ACCENT in tokens/palette.ts). A ring is read against
|
package/dist/surfaces.d.ts
CHANGED
|
@@ -6,13 +6,35 @@
|
|
|
6
6
|
* RULE_NAMES: derived projection — the deduped set of doctrine rule names (PROJECTION 1).
|
|
7
7
|
*/
|
|
8
8
|
import type { GuardKind } from './guard/types.js';
|
|
9
|
-
/** The
|
|
9
|
+
/** The 6 on-disk rule names (agent/rules/basalt-{name}.md — the set-equality target).
|
|
10
|
+
*
|
|
11
|
+
* One rule file per DOCTRINE, not per subpath: `state` also owns the router bridge's placement law
|
|
12
|
+
* (the two were one argument split across two files), and `batteries` owns every adapter surface
|
|
13
|
+
* whose doctrine is "use the shipped thing" — query, forms, notifications, commands, data, content,
|
|
14
|
+
* agent and the app-global layer. Thirteen files carried 4,177 lines, 55% of it with no guard
|
|
15
|
+
* behind it and the identity paragraph restated six times (`docs/CONTROLS-SPEC.md` §7).
|
|
10
16
|
*
|
|
11
17
|
* @example
|
|
12
18
|
* const r: RuleName = 'tokens' // ok
|
|
13
19
|
* // const bad: RuleName = 'overlays' // tsc error — not in the union
|
|
14
20
|
*/
|
|
15
|
-
export type RuleName = 'tokens' | 'charts' | 'mantine' | '
|
|
21
|
+
export type RuleName = 'tokens' | 'charts' | 'mantine' | 'state' | 'controls' | 'batteries';
|
|
22
|
+
/**
|
|
23
|
+
* Every rule the shipped oxlint JS plugin registers (`configs/oxlint-plugin.js` → `rules`), as one
|
|
24
|
+
* literal union AND one runtime list — the type and the list are the same declaration, so they
|
|
25
|
+
* cannot drift from each other. What they CAN drift from is the plugin itself, which this module
|
|
26
|
+
* must not import (it is a standalone `.js` loaded through `jsPlugins` out of a consumer's
|
|
27
|
+
* node_modules, and `surfaces.ts` is dependency-free by contract). `oxlint-plugin.test.ts` closes
|
|
28
|
+
* that gap: it asserts this list is EXACTLY the plugin's own rule keys, and `check-coverage`
|
|
29
|
+
* asserts every id here maps to exactly one surface.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* const id: PluginRuleId = 'hand-rolled-filter' // ok
|
|
33
|
+
* // const bad: PluginRuleId = 'hand-rolled-filters' // tsc error
|
|
34
|
+
*/
|
|
35
|
+
export declare const PLUGIN_RULE_ID_LIST: readonly ["no-raw-font-size", "raw-size-literal", "card-inset", "chart-in-raw-surface", "hand-rolled-plot", "chart-legend-literal", "shadow-basalt-export", "hand-rolled-shell", "raw-scroll-container", "hand-rolled-filter", "control-outside-home", "control-size-literal", "page-bar-budget", "in-body-page-title", "responsive-twin", "search-literal-link", "use-search-from-literal", "visx-boundary", "visx-tooltip", "token-layer-boundary", "agent-resume-guard", "agent-no-raw-usechat", "ai-sdk-major"];
|
|
36
|
+
/** One registered oxlint plugin rule id — the literal union of {@link PLUGIN_RULE_ID_LIST}. */
|
|
37
|
+
export type PluginRuleId = (typeof PLUGIN_RULE_ID_LIST)[number];
|
|
16
38
|
/** The 3 shipped skill names (agent/skills/basalt-{name}/SKILL.md, placed into a consumer's
|
|
17
39
|
* .claude/skills/ by `basalt-ui init`/`sync` — the same managed path the rules take).
|
|
18
40
|
*
|
|
@@ -88,15 +110,33 @@ type BaseSurface = {
|
|
|
88
110
|
*
|
|
89
111
|
* @example
|
|
90
112
|
* const s: DoctrineSpec = { kind: 'doctrine', layer: 'headless', rule: 'tokens',
|
|
91
|
-
* skill: ['basalt-design'], guardKinds: ['raw-hex'],
|
|
113
|
+
* skill: ['basalt-design'], guardKinds: ['raw-hex'], pluginRules: ['no-raw-font-size'],
|
|
114
|
+
* forbiddenImports: [] }
|
|
92
115
|
*/
|
|
93
116
|
export type DoctrineSpec = BaseSurface & {
|
|
94
117
|
readonly kind: 'doctrine';
|
|
95
118
|
readonly rule: RuleName;
|
|
96
119
|
/** A LIST (skill↔surface is many-to-one — basalt-design covers tokens AND mantine AND state). */
|
|
97
120
|
readonly skill: readonly SkillName[];
|
|
98
|
-
/** Required, but [] is legal for advisory surfaces (
|
|
121
|
+
/** Required, but [] is legal for advisory surfaces (the batteries: rule only, no guard). */
|
|
99
122
|
readonly guardKinds: readonly GuardKind[];
|
|
123
|
+
/**
|
|
124
|
+
* The oxlint plugin rules this surface's doctrine is enforced by — the AST half of the same seam
|
|
125
|
+
* `guardKinds` covers with text scans. Required (`[]` is legal, and says "no AST rule guards
|
|
126
|
+
* this"), because the ABSENCE of the field is what let the generated coverage headers claim a
|
|
127
|
+
* rule was "backed by" a guard kind while the plugin rule doing the real work went unnamed (D8).
|
|
128
|
+
*
|
|
129
|
+
* Every id in {@link PLUGIN_RULE_ID_LIST} maps to EXACTLY ONE surface — asserted by
|
|
130
|
+
* `check-coverage` and by `oxlint-plugin.test.ts`, so a new plugin rule cannot ship without a
|
|
131
|
+
* home, and one rule cannot be counted as coverage for two surfaces.
|
|
132
|
+
*/
|
|
133
|
+
readonly pluginRules: readonly PluginRuleId[];
|
|
134
|
+
/**
|
|
135
|
+
* Laws this surface states but nothing enforces — printed under `not guarded:` in the generated
|
|
136
|
+
* `<!-- basalt:coverage -->` header. The honest half of the block: claiming coverage that does
|
|
137
|
+
* not exist is D8, and the only way a reader can tell is if the doc says so itself.
|
|
138
|
+
*/
|
|
139
|
+
readonly advisoryLaws?: readonly string[];
|
|
100
140
|
};
|
|
101
141
|
/**
|
|
102
142
|
* A tooling surface owes NO triad — these fields are statically ABSENT (cannot be set).
|
|
@@ -111,6 +151,8 @@ export type ToolingSpec = BaseSurface & {
|
|
|
111
151
|
readonly rule?: never;
|
|
112
152
|
readonly skill?: never;
|
|
113
153
|
readonly guardKinds?: never;
|
|
154
|
+
readonly pluginRules?: never;
|
|
155
|
+
readonly advisoryLaws?: never;
|
|
114
156
|
};
|
|
115
157
|
/** The discriminated union — the SURFACES registry value type. */
|
|
116
158
|
export type SurfaceSpec = DoctrineSpec | ToolingSpec;
|
|
@@ -130,8 +172,9 @@ export declare const SURFACES: {
|
|
|
130
172
|
readonly layer: "mantine-coupled";
|
|
131
173
|
readonly rule: "mantine";
|
|
132
174
|
readonly skill: readonly ["basalt-app", "basalt-design"];
|
|
133
|
-
readonly guardKinds: readonly ["raw-motion-value", "card-with-border", "raw-form-control", "sub-16-input-font", "mantine-shade-index"];
|
|
134
|
-
readonly
|
|
175
|
+
readonly guardKinds: readonly ["raw-motion-value", "card-with-border", "raw-form-control", "sub-16-input-font", "mantine-shade-index", "in-body-page-title", "raw-spacing", "inline-spacing", "inline-display", "raw-html-layout", "hidden-inline-style"];
|
|
176
|
+
readonly pluginRules: readonly ["hand-rolled-shell", "card-inset", "in-body-page-title", "raw-scroll-container", "page-bar-budget", "shadow-basalt-export"];
|
|
177
|
+
readonly description: "BasaltProvider, createBasaltTheme, BasaltShell + sidebar/mobile-nav/breadcrumbs, PageBar, NavCountBadge, ThemeToggle, ThreadWorkspace + thread-chat components, WidgetHeader, dashboard composites (DeltaBadge, StatCard with threshold tone, EmptyState, QueryState/LoadingState/ErrorState, SettingsSection/SettingsRow/DangerZone)";
|
|
135
178
|
readonly optionalPeers: readonly ["react-markdown", "remark-gfm", "rehype-sanitize", "remend", "shiki", "beautiful-mermaid"];
|
|
136
179
|
readonly forbiddenImports: readonly [];
|
|
137
180
|
};
|
|
@@ -140,7 +183,8 @@ export declare const SURFACES: {
|
|
|
140
183
|
readonly layer: "headless";
|
|
141
184
|
readonly rule: "charts";
|
|
142
185
|
readonly skill: readonly ["basalt-charts"];
|
|
143
|
-
readonly guardKinds: readonly ["raw-hex", "raw-color-fn", "raw-visx-axis", "unframed-chart"];
|
|
186
|
+
readonly guardKinds: readonly ["raw-hex", "raw-color-fn", "raw-visx-axis", "unframed-chart", "chart-missing-aria-label"];
|
|
187
|
+
readonly pluginRules: readonly ["hand-rolled-plot", "chart-legend-literal", "chart-in-raw-surface", "visx-boundary", "visx-tooltip"];
|
|
144
188
|
readonly description: "CartesianChart + visx chart primitives, kinds, sparklines, hooks, and token re-exports (Mantine-free)";
|
|
145
189
|
readonly globs: {
|
|
146
190
|
readonly shipped: readonly ["**/charts/**"];
|
|
@@ -158,7 +202,8 @@ export declare const SURFACES: {
|
|
|
158
202
|
readonly layer: "headless";
|
|
159
203
|
readonly rule: "tokens";
|
|
160
204
|
readonly skill: readonly ["basalt-design", "basalt-charts"];
|
|
161
|
-
readonly guardKinds: readonly ["raw-hex", "raw-color-fn", "off-identity-accent", "off-system-surface-var"];
|
|
205
|
+
readonly guardKinds: readonly ["raw-hex", "raw-color-fn", "off-identity-accent", "off-system-surface-var", "raw-font-family", "raw-radius", "raw-surface", "inline-font-size", "css-raw-surface", "surface-shadow-override", "theme-allow-unscoped"];
|
|
206
|
+
readonly pluginRules: readonly ["no-raw-font-size", "raw-size-literal", "token-layer-boundary"];
|
|
162
207
|
readonly description: "VX token refs, buildPaletteCss, defineSeries, seriesTokens, groupTokens, alpha (Mantine-free)";
|
|
163
208
|
readonly globs: {
|
|
164
209
|
readonly shipped: readonly ["**/tokens/**"];
|
|
@@ -192,9 +237,10 @@ export declare const SURFACES: {
|
|
|
192
237
|
readonly './query': {
|
|
193
238
|
readonly kind: "doctrine";
|
|
194
239
|
readonly layer: "headless";
|
|
195
|
-
readonly rule: "
|
|
240
|
+
readonly rule: "batteries";
|
|
196
241
|
readonly skill: readonly ["basalt-app"];
|
|
197
242
|
readonly guardKinds: readonly [];
|
|
243
|
+
readonly pluginRules: readonly [];
|
|
198
244
|
readonly description: "createBasaltQueryClient, transport-agnostic unwrap, lazy BasaltQueryDevtools";
|
|
199
245
|
readonly optionalPeers: readonly ["@tanstack/react-query-devtools"];
|
|
200
246
|
readonly globs: {
|
|
@@ -206,10 +252,11 @@ export declare const SURFACES: {
|
|
|
206
252
|
readonly './router-tanstack': {
|
|
207
253
|
readonly kind: "doctrine";
|
|
208
254
|
readonly layer: "headless";
|
|
209
|
-
readonly rule: "
|
|
255
|
+
readonly rule: "state";
|
|
210
256
|
readonly skill: readonly ["basalt-app"];
|
|
211
257
|
readonly guardKinds: readonly [];
|
|
212
|
-
readonly
|
|
258
|
+
readonly pluginRules: readonly ["search-literal-link", "use-search-from-literal"];
|
|
259
|
+
readonly description: "TanStack Router bridge: defineNav/navGroup/navTarget (one typed nav definition) + useNav (sections + mobileNav, spread onto BasaltShell) + useBasaltNav (active route) + useRouterBreadcrumbs + createSearchStore (typed URL > localStorage > fallback store over field.enum/multi/range/number/boolean/string; deprecated createSearchParamStore/createMultiSearchParamStore wrappers until 1.29.0)";
|
|
213
260
|
readonly optionalPeers: readonly ["@tanstack/react-router"];
|
|
214
261
|
readonly globs: {
|
|
215
262
|
readonly shipped: readonly [];
|
|
@@ -220,9 +267,10 @@ export declare const SURFACES: {
|
|
|
220
267
|
readonly './forms': {
|
|
221
268
|
readonly kind: "doctrine";
|
|
222
269
|
readonly layer: "mantine-coupled";
|
|
223
|
-
readonly rule: "
|
|
270
|
+
readonly rule: "batteries";
|
|
224
271
|
readonly skill: readonly ["basalt-design"];
|
|
225
272
|
readonly guardKinds: readonly [];
|
|
273
|
+
readonly pluginRules: readonly [];
|
|
226
274
|
readonly description: "Mantine form adapter: useBasaltForm, field, FormErrorSummary, useFormDraft (Standard Schema)";
|
|
227
275
|
readonly optionalPeers: readonly ["@mantine/form"];
|
|
228
276
|
readonly forbiddenImports: readonly [];
|
|
@@ -230,9 +278,10 @@ export declare const SURFACES: {
|
|
|
230
278
|
readonly './notifications': {
|
|
231
279
|
readonly kind: "doctrine";
|
|
232
280
|
readonly layer: "mantine-coupled";
|
|
233
|
-
readonly rule: "
|
|
281
|
+
readonly rule: "batteries";
|
|
234
282
|
readonly skill: readonly ["basalt-app"];
|
|
235
283
|
readonly guardKinds: readonly [];
|
|
284
|
+
readonly pluginRules: readonly [];
|
|
236
285
|
readonly description: "Mantine notifications: notify helpers, typed registry, persisted history, NotificationBell, NotificationCenter";
|
|
237
286
|
readonly optionalPeers: readonly ["@mantine/notifications"];
|
|
238
287
|
readonly forbiddenImports: readonly [];
|
|
@@ -240,9 +289,10 @@ export declare const SURFACES: {
|
|
|
240
289
|
readonly './commands': {
|
|
241
290
|
readonly kind: "doctrine";
|
|
242
291
|
readonly layer: "mantine-coupled";
|
|
243
|
-
readonly rule: "
|
|
292
|
+
readonly rule: "batteries";
|
|
244
293
|
readonly skill: readonly ["basalt-app"];
|
|
245
294
|
readonly guardKinds: readonly [];
|
|
295
|
+
readonly pluginRules: readonly [];
|
|
246
296
|
readonly description: "typed command bus + overlay controller, toSpotlightActions, ShortcutsHelp, BasaltOverlays";
|
|
247
297
|
readonly optionalPeers: readonly ["@mantine/spotlight", "@mantine/modals", "@tanstack/react-hotkeys"];
|
|
248
298
|
readonly forbiddenImports: readonly [];
|
|
@@ -250,9 +300,10 @@ export declare const SURFACES: {
|
|
|
250
300
|
readonly './data': {
|
|
251
301
|
readonly kind: "doctrine";
|
|
252
302
|
readonly layer: "mantine-coupled";
|
|
253
|
-
readonly rule: "
|
|
303
|
+
readonly rule: "batteries";
|
|
254
304
|
readonly skill: readonly ["basalt-design"];
|
|
255
305
|
readonly guardKinds: readonly [];
|
|
306
|
+
readonly pluginRules: readonly [];
|
|
256
307
|
readonly description: "Convenience barrel pulling both TanStack Table + Virtual peer groups: BasaltDataTable, BasaltVirtualList (Mantine-rendered) — prefer ./data/table or ./data/virtual for per-feature opt-in";
|
|
257
308
|
readonly optionalPeers: readonly ["@tanstack/react-table", "@tanstack/react-virtual"];
|
|
258
309
|
readonly forbiddenImports: readonly [];
|
|
@@ -260,9 +311,10 @@ export declare const SURFACES: {
|
|
|
260
311
|
readonly './data/table': {
|
|
261
312
|
readonly kind: "doctrine";
|
|
262
313
|
readonly layer: "mantine-coupled";
|
|
263
|
-
readonly rule: "
|
|
314
|
+
readonly rule: "batteries";
|
|
264
315
|
readonly skill: readonly ["basalt-design"];
|
|
265
316
|
readonly guardKinds: readonly [];
|
|
317
|
+
readonly pluginRules: readonly [];
|
|
266
318
|
readonly description: "BasaltDataTable: a sortable data table over TanStack Table, rendered with Mantine (Mantine-rendered)";
|
|
267
319
|
readonly optionalPeers: readonly ["@tanstack/react-table"];
|
|
268
320
|
readonly forbiddenImports: readonly [];
|
|
@@ -270,9 +322,10 @@ export declare const SURFACES: {
|
|
|
270
322
|
readonly './data/virtual': {
|
|
271
323
|
readonly kind: "doctrine";
|
|
272
324
|
readonly layer: "mantine-coupled";
|
|
273
|
-
readonly rule: "
|
|
325
|
+
readonly rule: "batteries";
|
|
274
326
|
readonly skill: readonly ["basalt-design"];
|
|
275
327
|
readonly guardKinds: readonly [];
|
|
328
|
+
readonly pluginRules: readonly [];
|
|
276
329
|
readonly description: "BasaltVirtualList: a windowed virtual list over TanStack Virtual, rendered with Mantine (Mantine-rendered)";
|
|
277
330
|
readonly optionalPeers: readonly ["@tanstack/react-virtual"];
|
|
278
331
|
readonly forbiddenImports: readonly [];
|
|
@@ -280,9 +333,10 @@ export declare const SURFACES: {
|
|
|
280
333
|
readonly './agent': {
|
|
281
334
|
readonly kind: "doctrine";
|
|
282
335
|
readonly layer: "headless";
|
|
283
|
-
readonly rule: "
|
|
336
|
+
readonly rule: "batteries";
|
|
284
337
|
readonly skill: readonly ["basalt-app"];
|
|
285
338
|
readonly guardKinds: readonly [];
|
|
339
|
+
readonly pluginRules: readonly ["agent-resume-guard", "agent-no-raw-usechat", "ai-sdk-major"];
|
|
286
340
|
readonly description: "Headless streaming-chat layer: useAgentStream, aiSdkTransport (recommended default) + edenTransport, isResumable/ResumableAgentTransport (stream-resumption seam), PartList, coalesceParts, the ForeignPart/definePartRenderers/narrowAgentPart open part-registry seam, plus the multi-thread createThreadsStore + useAgentThreadRuns + outcome-resolver seam (Mantine-free)";
|
|
287
341
|
readonly optionalPeers: readonly ["ai", "use-stick-to-bottom"];
|
|
288
342
|
readonly globs: {
|
|
@@ -294,9 +348,10 @@ export declare const SURFACES: {
|
|
|
294
348
|
readonly './agent-chat': {
|
|
295
349
|
readonly kind: "doctrine";
|
|
296
350
|
readonly layer: "mantine-coupled";
|
|
297
|
-
readonly rule: "
|
|
351
|
+
readonly rule: "batteries";
|
|
298
352
|
readonly skill: readonly ["basalt-app"];
|
|
299
353
|
readonly guardKinds: readonly [];
|
|
354
|
+
readonly pluginRules: readonly [];
|
|
300
355
|
readonly description: "Mantine-styled thread-chat components over basalt-ui/agent: ThreadWorkspace, ThreadFeed (variant/renderRow), ThreadFeedRow (inline-expanding Slack row, lazily mounted + kept mounted), ThreadOutcomeCard, ThreadDetailPanel, Composer, ThreadTranscript (open part-renderer registry via its renderers/fallbackRenderer props, per-message MessageAffordances, groupConsecutive, and an optional virtualize/height windowing mode whose VirtualizeOptions carry overscan/estimateSize/initialScroll — a virtualized transcript opens scrolled to the newest message unless initialScroll is \"start\"), threadPartRenderers, ToolChip (Mantine-coupled). motion is required, not optional — ThreadFeed/ThreadDetailPanel import motion/react eagerly, so this subpath fails to resolve without it installed even though peerDependenciesMeta marks it optional (npm has no per-subpath optionality). remend is genuinely optional here — ThreadTranscript reaches it only through the lazy dynamic import() inside content/markdown.tsx, and @tanstack/react-virtual the same way through the lazy import() behind ThreadTranscript virtualize (absent peer degrades to an unwindowed, height-bound pane).";
|
|
301
356
|
readonly optionalPeers: readonly ["ai", "motion", "remend", "use-stick-to-bottom", "react-markdown", "remark-gfm", "shiki", "@shikijs/langs", "@shikijs/themes", "beautiful-mermaid", "@tanstack/react-virtual"];
|
|
302
357
|
readonly forbiddenImports: readonly [];
|
|
@@ -304,20 +359,45 @@ export declare const SURFACES: {
|
|
|
304
359
|
readonly './content': {
|
|
305
360
|
readonly kind: "doctrine";
|
|
306
361
|
readonly layer: "mantine-coupled";
|
|
307
|
-
readonly rule: "
|
|
362
|
+
readonly rule: "batteries";
|
|
308
363
|
readonly skill: readonly ["basalt-design"];
|
|
309
364
|
readonly guardKinds: readonly [];
|
|
310
|
-
readonly
|
|
365
|
+
readonly pluginRules: readonly [];
|
|
366
|
+
readonly description: "Prose (article/chat typography), CodeBlock (shiki, optional peer), Callout, TableOfContents, ReadingProgress, Markdown (react-markdown + remark-gfm, optional peers; `streaming` is a rendering mode ONLY — `contentTrust` is the independent security input, and any surface rendering agent/model output must pin `contentTrust=\"untrusted\"`, the sole input to the image-origin allowlist; a `fenceRenderers` registry — settledOnly/FenceRenderer/FenceRenderers/FenceRenderContext; `sanitizeSchema`, an additions-only SanitizeSchemaExtension merged over BASALT_SANITIZE_SCHEMA via mergeSanitizeSchema; the remend streaming-repair pass is now a lazy optional peer), MermaidDiagram (beautiful-mermaid, optional peer), mdxComponents/createMdxComponents, ArticleLayout (docs-page frame), ArticleCard/ArticleGrid (overview cards), Article model (sortArticles/filterArticles/formatArticleDate), FilterSet/ViewTabs/MultiSelectFilter re-exported from ./controls (they replaced the controlled ArticleFilterBar), toArticleActions (Spotlight projector, @mantine/spotlight type-only), GuideLink/GuideDrawer (contextual-help drawer) — the content/prose surface";
|
|
311
367
|
readonly optionalPeers: readonly ["shiki", "@shikijs/langs", "@shikijs/themes", "beautiful-mermaid", "react-markdown", "remark-gfm", "rehype-sanitize", "remend", "@mantine/spotlight"];
|
|
312
368
|
readonly forbiddenImports: readonly [];
|
|
313
369
|
};
|
|
370
|
+
readonly './controls': {
|
|
371
|
+
readonly kind: "doctrine";
|
|
372
|
+
readonly layer: "mantine-coupled";
|
|
373
|
+
readonly rule: "controls";
|
|
374
|
+
readonly skill: readonly ["basalt-design"];
|
|
375
|
+
readonly guardKinds: readonly ["raw-selection-control"];
|
|
376
|
+
readonly pluginRules: readonly ["hand-rolled-filter", "control-outside-home", "control-size-literal", "responsive-twin"];
|
|
377
|
+
readonly advisoryLaws: readonly ["C1 as a cross-file law (a control placed in one file, its home declared in another)", "hand-rolled section headings (argo writes `<Text fw={600} size=\"sm\">` + children, which no AST heuristic matches without false positives)", "C11 — a table/list stating its count when it is not a BasaltDataTable", "C12 — one shape for refresh/sync (SyncButton); only the alias table sees a renamed copy"];
|
|
378
|
+
readonly description: "The control tier (docs/CONTROLS-SPEC.md §3): FilterSet (nowrap row + measured +N fold + the mobile Filters (n) sheet), RangeFilter/CompareFilter/SelectFilter/MultiSelectFilter/SearchFilter/ToggleFilter (each bound to a FieldHandle — no value/onChange/size, law C2/C5), ViewTabs, and the action/sync family (ActionGroup, OverflowMenu, SyncButton, BarAction/GlobalAction). Every control owns its own desktop/mobile swap in CSS (C9) and renders size=\"ctl\" internally. Resolves and renders with NO @mantine/dates installed — the custom date picker is injected through RangeFilter.customPicker from ./controls-dates.";
|
|
379
|
+
readonly optionalPeers: readonly [];
|
|
380
|
+
readonly forbiddenImports: readonly [];
|
|
381
|
+
};
|
|
382
|
+
readonly './controls-dates': {
|
|
383
|
+
readonly kind: "doctrine";
|
|
384
|
+
readonly layer: "mantine-coupled";
|
|
385
|
+
readonly rule: "controls";
|
|
386
|
+
readonly skill: readonly ["basalt-design"];
|
|
387
|
+
readonly guardKinds: readonly [];
|
|
388
|
+
readonly pluginRules: readonly [];
|
|
389
|
+
readonly description: "DateRangePicker — the @mantine/dates implementation of RangeFilter's customPicker seam. Its own subpath because @mantine/dates is an optional peer and basaltViteConfig pre-bundles the whole @mantine scope, so a consumer without the peer (linewatch) must never resolve it: nothing under src/controls may import it, statically or lazily (docs/CONTROLS-SPEC.md §3).";
|
|
390
|
+
readonly optionalPeers: readonly ["@mantine/dates"];
|
|
391
|
+
readonly forbiddenImports: readonly [];
|
|
392
|
+
};
|
|
314
393
|
readonly './state': {
|
|
315
394
|
readonly kind: "doctrine";
|
|
316
395
|
readonly layer: "headless";
|
|
317
396
|
readonly rule: "state";
|
|
318
397
|
readonly skill: readonly ["basalt-design"];
|
|
319
398
|
readonly guardKinds: readonly ["localstorage-theme"];
|
|
320
|
-
readonly
|
|
399
|
+
readonly pluginRules: readonly [];
|
|
400
|
+
readonly description: "createPersistedState (versioned localStorage) + the store field vocabulary (field.enum/multi/range/number/boolean/string, FieldHandle, lanes) + createLocalStore, the router-free store — Mantine-free state primitives";
|
|
321
401
|
readonly optionalPeers: readonly [];
|
|
322
402
|
readonly globs: {
|
|
323
403
|
readonly shipped: readonly [];
|
|
@@ -331,6 +411,7 @@ export declare const SURFACES: {
|
|
|
331
411
|
readonly rule: "mantine";
|
|
332
412
|
readonly skill: readonly ["basalt-app"];
|
|
333
413
|
readonly guardKinds: readonly [];
|
|
414
|
+
readonly pluginRules: readonly [];
|
|
334
415
|
readonly description: "ConnectivityProvider (aggregates browser online/offline, React Query onlineManager, SSE, and health-check pings into one status), useConnectivity, and ConnectivityIndicator — auto-mounted by BasaltProvider";
|
|
335
416
|
readonly optionalPeers: readonly [];
|
|
336
417
|
readonly forbiddenImports: readonly [];
|
|
@@ -362,9 +443,10 @@ export declare const SURFACES: {
|
|
|
362
443
|
readonly '#app': {
|
|
363
444
|
readonly kind: "doctrine";
|
|
364
445
|
readonly layer: "app-global";
|
|
365
|
-
readonly rule: "
|
|
446
|
+
readonly rule: "batteries";
|
|
366
447
|
readonly skill: readonly ["basalt-app"];
|
|
367
448
|
readonly guardKinds: readonly [];
|
|
449
|
+
readonly pluginRules: readonly [];
|
|
368
450
|
readonly globs: {
|
|
369
451
|
readonly shipped: readonly ["**/*.{ts,tsx}"];
|
|
370
452
|
readonly repo: readonly ["packages/basalt-ui/src/**"];
|
|
@@ -379,7 +461,7 @@ export declare const SURFACES: {
|
|
|
379
461
|
};
|
|
380
462
|
/**
|
|
381
463
|
* Derived, deduped set of doctrine rule names. Projection 1 of SURFACES.
|
|
382
|
-
* → ['mantine', 'charts', 'tokens', '
|
|
464
|
+
* → ['mantine', 'charts', 'tokens', 'batteries', 'state', 'controls'] (order is insertion order of Set)
|
|
383
465
|
*
|
|
384
466
|
* @example
|
|
385
467
|
* RULE_NAMES.includes('tokens') // true
|
package/dist/surfaces.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surfaces.d.ts","sourceRoot":"","sources":["../src/surfaces.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAI9C
|
|
1
|
+
{"version":3,"file":"surfaces.d.ts","sourceRoot":"","sources":["../src/surfaces.ts"],"names":[],"mappings":"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"}
|