basalt-ui 1.25.0 → 1.27.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 +26 -0
- package/MIGRATING.md +815 -23
- package/README.md +45 -32
- package/agent/rules/basalt-batteries.md +205 -0
- package/agent/rules/basalt-charts.md +125 -555
- package/agent/rules/basalt-controls.md +160 -0
- package/agent/rules/basalt-mantine.md +146 -439
- package/agent/rules/basalt-state.md +118 -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 +1465 -36
- package/configs/oxlint-plugin.test.ts +1190 -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 +39 -0
- package/dist/controls/enum-filter.d.ts.map +1 -0
- package/dist/controls/enum-filter.js +93 -0
- package/dist/controls/filter-context.d.ts +60 -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 +20 -0
- package/dist/controls/index.d.ts.map +1 -0
- package/dist/controls/index.js +46 -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/number-filter.d.ts +26 -0
- package/dist/controls/number-filter.d.ts.map +1 -0
- package/dist/controls/number-filter.js +143 -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 +43 -0
- package/dist/controls/range-filter.d.ts.map +1 -0
- package/dist/controls/range-filter.js +135 -0
- package/dist/controls/range-filter.type-guard.test.d.ts +2 -0
- package/dist/controls/range-filter.type-guard.test.d.ts.map +1 -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/index.d.ts +1 -1
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/index.js +3 -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 +95 -9
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +108 -49
- package/dist/dashboard/stat-card.module.css +153 -0
- package/dist/dashboard/stat-card.module.css.d.ts +15 -0
- package/dist/data/data-table.d.ts +37 -15
- package/dist/data/data-table.d.ts.map +1 -1
- package/dist/data/data-table.js +96 -58
- 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 +78 -7
- package/dist/guard/types.d.ts +3 -3
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +13 -3
- 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 +84 -0
- package/dist/router-tanstack/search-store.d.ts.map +1 -0
- package/dist/router-tanstack/search-store.js +271 -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 +565 -0
- package/dist/state/fields.d.ts.map +1 -0
- package/dist/state/fields.js +405 -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 +60 -0
- package/dist/state/persisted.d.ts.map +1 -0
- package/dist/state/persisted.js +123 -0
- package/dist/state/persisted.test.d.ts +2 -0
- package/dist/state/persisted.test.d.ts.map +1 -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 +156 -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 +67 -0
- package/dist/widget-header/widget-header.d.ts.map +1 -0
- package/dist/widget-header/widget-header.js +89 -0
- package/dist/widget-header/widget-header.module.css +350 -0
- package/dist/widget-header/widget-header.module.css.d.ts +25 -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 +1053 -0
- package/src/controls/enum-filter.tsx +170 -0
- package/src/controls/filter-context.tsx +158 -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 +49 -0
- package/src/controls/multi-select-filter.tsx +140 -0
- package/src/controls/number-filter.tsx +291 -0
- package/src/controls/peer-boundary.test.ts +85 -0
- package/src/controls/props-contract.test.tsx +137 -0
- package/src/controls/range-filter.tsx +237 -0
- package/src/controls/range-filter.type-guard.test.tsx +122 -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/index.ts +6 -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 +153 -0
- package/src/dashboard/stat-card.module.css.d.ts +15 -0
- package/src/dashboard/stat-card.test.tsx +298 -1
- package/src/dashboard/stat-card.tsx +289 -67
- package/src/data/data-table.test.tsx +96 -11
- package/src/data/data-table.tsx +228 -84
- package/src/guard/check-source.test.ts +159 -13
- package/src/guard/grace.test.ts +158 -0
- package/src/guard/index.ts +185 -29
- package/src/guard/types.ts +4 -2
- package/src/index.ts +51 -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 +35 -0
- package/src/router-tanstack/index.ts +28 -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 +882 -0
- package/src/router-tanstack/search-store.test.ts +578 -0
- package/src/router-tanstack/search-store.ts +546 -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 +512 -0
- package/src/state/fields.ts +1150 -0
- package/src/state/persisted.test.ts +91 -0
- package/src/state/persisted.ts +261 -0
- package/src/state.ts +52 -240
- package/src/styles.css +13 -0
- package/src/surfaces.ts +204 -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 +350 -0
- package/src/widget-header/widget-header.module.css.d.ts +25 -0
- package/src/widget-header/widget-header.test.tsx +187 -0
- package/src/widget-header/widget-header.tsx +213 -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 -329
- 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/data/data-table.js
CHANGED
|
@@ -1,15 +1,5 @@
|
|
|
1
1
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
Box,
|
|
4
|
-
Group,
|
|
5
|
-
MultiSelect,
|
|
6
|
-
Pagination,
|
|
7
|
-
Select,
|
|
8
|
-
Skeleton,
|
|
9
|
-
Table,
|
|
10
|
-
Text,
|
|
11
|
-
TextInput
|
|
12
|
-
} from "@mantine/core";
|
|
2
|
+
import { Box, Group, Pagination, Select, Skeleton, Table, Text, TextInput } from "@mantine/core";
|
|
13
3
|
import {
|
|
14
4
|
flexRender,
|
|
15
5
|
getCoreRowModel,
|
|
@@ -19,7 +9,12 @@ import {
|
|
|
19
9
|
useReactTable
|
|
20
10
|
} from "@tanstack/react-table";
|
|
21
11
|
import { useCallback, useMemo, useState } from "react";
|
|
12
|
+
import { FilterSet } from "../controls/index.js";
|
|
13
|
+
import { EnumFilter } from "../controls/enum-filter.js";
|
|
14
|
+
import { MultiSelectFilter } from "../controls/multi-select-filter.js";
|
|
15
|
+
import { CtlSlot } from "../theme/index.js";
|
|
22
16
|
import { alpha, VX } from "../tokens/index.js";
|
|
17
|
+
import { WidgetHeader } from "../widget-header/index.js";
|
|
23
18
|
const ALIGNMENTS = /* @__PURE__ */ new Set(["left", "center", "right"]);
|
|
24
19
|
function resolveAlign(column) {
|
|
25
20
|
const align = column.columnDef.meta?.align;
|
|
@@ -31,6 +26,52 @@ function resolveAlign(column) {
|
|
|
31
26
|
}
|
|
32
27
|
return align;
|
|
33
28
|
}
|
|
29
|
+
const FACET_ALL_VALUE = "__basalt_facet_all__";
|
|
30
|
+
function facetAllLabel(facet) {
|
|
31
|
+
return `Any ${facet.label.toLowerCase()}`;
|
|
32
|
+
}
|
|
33
|
+
function facetEnumHandle(column, facet) {
|
|
34
|
+
return {
|
|
35
|
+
kind: "enum",
|
|
36
|
+
fallback: FACET_ALL_VALUE,
|
|
37
|
+
options: [{ value: FACET_ALL_VALUE, label: facetAllLabel(facet) }, ...facet.options],
|
|
38
|
+
use: () => {
|
|
39
|
+
const current = column.getFilterValue() ?? FACET_ALL_VALUE;
|
|
40
|
+
return [
|
|
41
|
+
current,
|
|
42
|
+
(next) => {
|
|
43
|
+
column.setFilterValue(next === FACET_ALL_VALUE ? void 0 : next);
|
|
44
|
+
}
|
|
45
|
+
];
|
|
46
|
+
},
|
|
47
|
+
// A facet column has no lane to unset: clearing the column filter IS its fallback state.
|
|
48
|
+
clear: () => {
|
|
49
|
+
column.setFilterValue(void 0);
|
|
50
|
+
},
|
|
51
|
+
isDefault: (value) => value === FACET_ALL_VALUE
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function facetMultiHandle(column, facet) {
|
|
55
|
+
return {
|
|
56
|
+
kind: "multi",
|
|
57
|
+
fallback: [],
|
|
58
|
+
options: facet.options,
|
|
59
|
+
use: () => {
|
|
60
|
+
const current = column.getFilterValue() ?? [];
|
|
61
|
+
return [
|
|
62
|
+
current,
|
|
63
|
+
(next) => {
|
|
64
|
+
column.setFilterValue(next.length > 0 ? [...next] : void 0);
|
|
65
|
+
}
|
|
66
|
+
];
|
|
67
|
+
},
|
|
68
|
+
// Same as the single-select facet: an empty column filter is this handle's fallback.
|
|
69
|
+
clear: () => {
|
|
70
|
+
column.setFilterValue(void 0);
|
|
71
|
+
},
|
|
72
|
+
isDefault: (value) => value.length === 0
|
|
73
|
+
};
|
|
74
|
+
}
|
|
34
75
|
function SortIndicator({ direction }) {
|
|
35
76
|
if (!direction) return null;
|
|
36
77
|
return /* @__PURE__ */ jsx(Box, { component: "span", ml: 4, "aria-hidden": true, children: direction === "asc" ? "\u2191" : "\u2193" });
|
|
@@ -49,6 +90,10 @@ const RANGE_LABEL_STYLE = {
|
|
|
49
90
|
color: "var(--vx-faint)"
|
|
50
91
|
};
|
|
51
92
|
const DEFAULT_PAGE_SIZE_OPTIONS = [10, 25, 50, 100];
|
|
93
|
+
const TABLE_HEADER_LEAD_STYLE = { flex: "1 1 auto", minWidth: 0 };
|
|
94
|
+
const TABLE_TOOLBAR_STYLE = { flex: "0 0 auto" };
|
|
95
|
+
const SEARCH_WIDTH = 220;
|
|
96
|
+
const PAGE_SIZE_WIDTH = 116;
|
|
52
97
|
function getOrderedHeaderGroups(table) {
|
|
53
98
|
const left = table.getLeftHeaderGroups();
|
|
54
99
|
const center = table.getCenterHeaderGroups();
|
|
@@ -118,6 +163,9 @@ function enforceManualPaginationContract(breaches) {
|
|
|
118
163
|
console.error(message);
|
|
119
164
|
}
|
|
120
165
|
function BasaltDataTable({
|
|
166
|
+
title,
|
|
167
|
+
icon,
|
|
168
|
+
subtitle,
|
|
121
169
|
data,
|
|
122
170
|
columns,
|
|
123
171
|
enableSorting = true,
|
|
@@ -137,7 +185,7 @@ function BasaltDataTable({
|
|
|
137
185
|
facets,
|
|
138
186
|
onColumnFiltersChange,
|
|
139
187
|
manualFiltering = false,
|
|
140
|
-
|
|
188
|
+
actions,
|
|
141
189
|
enablePagination = false,
|
|
142
190
|
pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,
|
|
143
191
|
initialPagination,
|
|
@@ -154,7 +202,7 @@ function BasaltDataTable({
|
|
|
154
202
|
verticalSpacing,
|
|
155
203
|
horizontalSpacing,
|
|
156
204
|
withRowBorders,
|
|
157
|
-
withTableBorder =
|
|
205
|
+
withTableBorder = false
|
|
158
206
|
}) {
|
|
159
207
|
const [sorting, setSorting] = useState(initialSorting ?? []);
|
|
160
208
|
const [globalFilter, setGlobalFilter] = useState(initialGlobalFilter ?? "");
|
|
@@ -268,7 +316,7 @@ function BasaltDataTable({
|
|
|
268
316
|
});
|
|
269
317
|
const showSearch = enableGlobalFilter && filteringEnabled;
|
|
270
318
|
const showFacets = hasFacets && filteringEnabled;
|
|
271
|
-
const showToolbar = showSearch || showFacets || Boolean(
|
|
319
|
+
const showToolbar = showSearch || showFacets || Boolean(actions);
|
|
272
320
|
const headerGroups = enablePinning ? getOrderedHeaderGroups(table) : table.getHeaderGroups();
|
|
273
321
|
const rows = table.getRowModel().rows;
|
|
274
322
|
const tableNode = /* @__PURE__ */ jsxs(
|
|
@@ -341,62 +389,55 @@ function BasaltDataTable({
|
|
|
341
389
|
);
|
|
342
390
|
const scrolls = maxHeight !== void 0 || minWidth !== void 0;
|
|
343
391
|
const paginationState = table.getState().pagination;
|
|
392
|
+
const pageSizeRows = [.../* @__PURE__ */ new Set([...pageSizeOptions, paginationState.pageSize])].sort((a, b) => a - b).map((size) => ({ value: String(size), label: `${size} / page` }));
|
|
344
393
|
const total = table.getRowCount();
|
|
345
394
|
const rangeStart = total === 0 ? 0 : paginationState.pageIndex * paginationState.pageSize + 1;
|
|
346
395
|
const rangeEnd = Math.min((paginationState.pageIndex + 1) * paginationState.pageSize, total);
|
|
347
396
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
348
|
-
showToolbar && /* @__PURE__ */ jsxs(Group, { justify: "space-between", align: "
|
|
349
|
-
/* @__PURE__ */
|
|
397
|
+
(title !== void 0 || showToolbar) && /* @__PURE__ */ jsxs(Group, { justify: "space-between", align: "center", wrap: "wrap", gap: "xs", mb: "xs", children: [
|
|
398
|
+
title !== void 0 ? /* @__PURE__ */ jsx(Box, { style: TABLE_HEADER_LEAD_STYLE, children: /* @__PURE__ */ jsx(
|
|
399
|
+
WidgetHeader,
|
|
400
|
+
{
|
|
401
|
+
tier: "widget",
|
|
402
|
+
title,
|
|
403
|
+
...icon !== void 0 && { icon },
|
|
404
|
+
...subtitle !== void 0 && { subtitle },
|
|
405
|
+
count: table.getRowCount()
|
|
406
|
+
}
|
|
407
|
+
) }) : null,
|
|
408
|
+
showToolbar && /* @__PURE__ */ jsx(CtlSlot, { children: /* @__PURE__ */ jsxs(Group, { gap: "xs", wrap: "wrap", align: "center", style: TABLE_TOOLBAR_STYLE, children: [
|
|
350
409
|
showSearch && /* @__PURE__ */ jsx(
|
|
351
410
|
TextInput,
|
|
352
411
|
{
|
|
353
|
-
size: "xs",
|
|
354
412
|
radius: "md",
|
|
413
|
+
w: SEARCH_WIDTH,
|
|
355
414
|
placeholder: globalFilterPlaceholder,
|
|
356
415
|
leftSection: searchIcon,
|
|
357
416
|
value: globalFilter,
|
|
358
|
-
onChange: (event) => handleGlobalFilterChange(event.currentTarget.value)
|
|
359
|
-
w: 220
|
|
417
|
+
onChange: (event) => handleGlobalFilterChange(event.currentTarget.value)
|
|
360
418
|
}
|
|
361
419
|
),
|
|
362
|
-
showFacets && facets?.map((facet) => {
|
|
420
|
+
showFacets && /* @__PURE__ */ jsx(FilterSet, { children: facets?.map((facet) => {
|
|
363
421
|
const column = table.getColumn(facet.columnId);
|
|
364
422
|
if (!column) return null;
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
return /* @__PURE__ */ jsx(
|
|
368
|
-
MultiSelect,
|
|
369
|
-
{
|
|
370
|
-
size: "xs",
|
|
371
|
-
radius: "md",
|
|
372
|
-
placeholder: facet.label,
|
|
373
|
-
data: facet.options,
|
|
374
|
-
value: value2,
|
|
375
|
-
onChange: (next) => column.setFilterValue(next.length > 0 ? next : void 0),
|
|
376
|
-
clearable: true,
|
|
377
|
-
w: 200
|
|
378
|
-
},
|
|
379
|
-
facet.columnId
|
|
380
|
-
);
|
|
381
|
-
}
|
|
382
|
-
const value = column.getFilterValue() ?? null;
|
|
383
|
-
return /* @__PURE__ */ jsx(
|
|
384
|
-
Select,
|
|
423
|
+
return facet.multiple ? /* @__PURE__ */ jsx(
|
|
424
|
+
MultiSelectFilter,
|
|
385
425
|
{
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
426
|
+
field: facetMultiHandle(column, facet),
|
|
427
|
+
label: facet.label
|
|
428
|
+
},
|
|
429
|
+
facet.columnId
|
|
430
|
+
) : /* @__PURE__ */ jsx(
|
|
431
|
+
EnumFilter,
|
|
432
|
+
{
|
|
433
|
+
field: facetEnumHandle(column, facet),
|
|
434
|
+
label: facet.label
|
|
394
435
|
},
|
|
395
436
|
facet.columnId
|
|
396
437
|
);
|
|
397
|
-
})
|
|
398
|
-
|
|
399
|
-
|
|
438
|
+
}) }),
|
|
439
|
+
actions
|
|
440
|
+
] }) })
|
|
400
441
|
] }),
|
|
401
442
|
scrolls ? /* @__PURE__ */ jsx(
|
|
402
443
|
Table.ScrollContainer,
|
|
@@ -419,16 +460,13 @@ function BasaltDataTable({
|
|
|
419
460
|
/* @__PURE__ */ jsx(
|
|
420
461
|
Select,
|
|
421
462
|
{
|
|
422
|
-
size: "
|
|
463
|
+
size: "ctl",
|
|
423
464
|
radius: "md",
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
label: `${size} / page`
|
|
427
|
-
})),
|
|
465
|
+
w: PAGE_SIZE_WIDTH,
|
|
466
|
+
data: pageSizeRows,
|
|
428
467
|
value: String(paginationState.pageSize),
|
|
429
468
|
onChange: (value) => value && table.setPageSize(Number(value)),
|
|
430
|
-
allowDeselect: false
|
|
431
|
-
w: 110
|
|
469
|
+
allowDeselect: false
|
|
432
470
|
}
|
|
433
471
|
),
|
|
434
472
|
/* @__PURE__ */ jsx(
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
type GraceEntry = {
|
|
2
|
+
since: string;
|
|
3
|
+
promote: string;
|
|
4
|
+
why: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Tiny local semver compare — no dependency. Assumes plain `x.y.z`, no pre-release identifiers
|
|
8
|
+
* (basalt-ui bans majors and ships no pre-releases). Returns negative when `a` sorts before `b`,
|
|
9
|
+
* positive when after, zero when equal. Compares each component numerically, not lexically, so
|
|
10
|
+
* `'1.9.0' < '1.10.0'` and `'1.3.0' < '1.26.0'` — a string compare would get both backwards.
|
|
11
|
+
*/
|
|
12
|
+
export declare function compareSemver(a: string, b: string): number;
|
|
13
|
+
/**
|
|
14
|
+
* The C16 gate itself, extracted so it can be exercised against a synthetic ledger as well as the
|
|
15
|
+
* real one. Throws naming the first offending entry when either invariant breaks: `since` must
|
|
16
|
+
* precede `promote` for every entry, and no entry's `promote` may be `<=` the given `version`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function assertGraceLedger(ledger: Record<string, GraceEntry>, version: string): void;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=grace.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grace.test.d.ts","sourceRoot":"","sources":["../../src/guard/grace.test.ts"],"names":[],"mappings":"AA+BA,KAAK,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAEjE;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ1D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAc3F"}
|
package/dist/guard/index.d.ts
CHANGED
|
@@ -1,13 +1,64 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ./guard — headless policy core. Mantine-free, dependency-free.
|
|
3
3
|
*
|
|
4
|
-
* GUARD_RULES: the closed registry of all
|
|
4
|
+
* GUARD_RULES: the closed registry of all 27 violation kinds.
|
|
5
5
|
* checkSource: pure (text, relPath, cfg) → Finding[]. No FS, no walk, no console.
|
|
6
6
|
*/
|
|
7
7
|
import type { Finding, GuardConfig, GuardKind, GuardSeverity } from './types.js';
|
|
8
8
|
export type { Finding, GuardConfig, GuardKind, GuardSeverity };
|
|
9
9
|
/** Shared default config — CLI and tests import this to avoid duplication. */
|
|
10
10
|
export declare const DEFAULT_GUARD_CONFIG: GuardConfig;
|
|
11
|
+
/**
|
|
12
|
+
* A grace-ledger entry: `since` and `promote` are plain `x.y.z` semver strings (C16,
|
|
13
|
+
* `docs/CONTROLS-SPEC.md` §1). `grace.test.ts` fails the build once `package.json`'s version
|
|
14
|
+
* reaches `promote` while the entry is still here — the version-gate that replaces the honor
|
|
15
|
+
* system a bare promotion-note string used to run on. `since` must be strictly before `promote`,
|
|
16
|
+
* also asserted there.
|
|
17
|
+
*/
|
|
18
|
+
export type GraceEntry = {
|
|
19
|
+
since: string;
|
|
20
|
+
promote: string;
|
|
21
|
+
why: string;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Kinds still inside their grace minor — reported, not fatal, until the next minor promotes them.
|
|
25
|
+
* See {@link GuardSeverity} for the doctrine and why basalt-ui in particular needs it.
|
|
26
|
+
*
|
|
27
|
+
* Adding a kind here is part of shipping it; removing the entry IS the promotion, and belongs in
|
|
28
|
+
* its own commit so the changelog says enforcement got stricter. `grace.test.ts` is the other half
|
|
29
|
+
* of "belongs in its own commit": it fails once `package.json`'s version reaches an entry's
|
|
30
|
+
* `promote` while the entry is still here, so a kind can no longer sit at `warn` with nothing
|
|
31
|
+
* tracking it — which is exactly what happened to the five entries this ledger shipped in the
|
|
32
|
+
* round-4 guard minor (D4, `docs/CONTROLS-SPEC.md` §6): all five stayed `warn` for five minors
|
|
33
|
+
* because deleting the entry was the only enforcement, and nothing checked that anyone had.
|
|
34
|
+
*
|
|
35
|
+
* The runway is measured in consumer UPGRADES, not in version numbers: `mantine-shade-index`
|
|
36
|
+
* (the table's first tenant, promoted and gone) sat here across two minors because 1.8.0 shipped
|
|
37
|
+
* the same day as 1.7.0 and 1.9.0 carried the chart batch the same consumer was upgrading for —
|
|
38
|
+
* bundling a build-breaking promotion into the minor they take for the fixes turns a routine bump
|
|
39
|
+
* into an unplanned refactor, which is exactly what the grace minor exists to prevent.
|
|
40
|
+
*
|
|
41
|
+
* **A `SCANNABLE_EXT` widening cannot be expressed here, and 1.23.2's was deliberately not.**
|
|
42
|
+
* Adding `.astro`/`.jsx`/`.vue` widens the FILE SET for all 25 kinds at once — there is no kind to
|
|
43
|
+
* key an entry on, and the nearest one (`raw-hex`, which is what actually fired) is keyed per KIND,
|
|
44
|
+
* not per extension: an entry for it would demote basalt's most load-bearing kind to `warn` in
|
|
45
|
+
* every `.tsx` and `.css` in every consumer for a minor, to buy runway on a file type only one
|
|
46
|
+
* consumer has. `css-raw-surface` is the shape that DOES fit — the new dialect got its own kind
|
|
47
|
+
* because kebab CSS is a distinct pattern set; more files running the same patterns is not.
|
|
48
|
+
*
|
|
49
|
+
* The measurement agreed with the structure. Once the two defects the widening exposed were fixed
|
|
50
|
+
* (`{` read as a hex; `<!-- … -->` never stripped in an SFC), rollhook's marketing site scans
|
|
51
|
+
* 6 files with 0 findings, and no other consumer has a single `.astro`, `.vue` or `.jsx` file — so
|
|
52
|
+
* grace would have covered zero incumbent violations. The doctrine protects code that "passed every
|
|
53
|
+
* previous release"; a violation in a newly-scanned file type is code the consumer is writing now,
|
|
54
|
+
* with `theme-allow`, `basalt.severity` and `exemptRules` all still available.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* const GRACE: Partial<Record<GuardKind, GraceEntry>> = {
|
|
58
|
+
* 'raw-font-family': { since: '1.4.0', promote: '1.5.0', why: 'introduced 1.4.0 — …' },
|
|
59
|
+
* }
|
|
60
|
+
*/
|
|
61
|
+
export declare const GRACE_PERIOD_KINDS: Partial<Record<GuardKind, GraceEntry>>;
|
|
11
62
|
/** One `exemptRules` entry that suppressed nothing, and why — see {@link unmatchedExemptPatterns}. */
|
|
12
63
|
export type UnmatchedExemptPattern = {
|
|
13
64
|
readonly kind: string;
|
|
@@ -64,7 +115,7 @@ export declare const GENERATED_HEADER_LINE = "/* @generated basalt-ui \u2014 do
|
|
|
64
115
|
*/
|
|
65
116
|
export declare const TOKENS_ONLY_DISABLED_KINDS: ReadonlySet<GuardKind>;
|
|
66
117
|
/**
|
|
67
|
-
* The closed registry of all
|
|
118
|
+
* The closed registry of all 27 guard kinds. The triad test asserts
|
|
68
119
|
* `surface.guardKinds ⊆ keyof GUARD_RULES` at runtime.
|
|
69
120
|
*
|
|
70
121
|
* raw-surface, raw-html-layout, and sub-16-input-font are handled inline in checkSource
|
|
@@ -229,7 +280,19 @@ export declare const GUARD_RULES: {
|
|
|
229
280
|
readonly pattern: RegExp;
|
|
230
281
|
readonly enabled: (cfg: GuardConfig) => boolean;
|
|
231
282
|
readonly appliesTo: (relPath: string) => boolean;
|
|
232
|
-
readonly message: "Raw HTML element with inline layout/surface styling that the line scan cannot see — the tag is formatted across lines, or the style object is hoisted to a const. Same violation as raw-html-layout: use a Mantine layout primitive (Box/Flex/Grid/Stack/Group).
|
|
283
|
+
readonly message: "Raw HTML element with inline layout/surface styling that the line scan cannot see — the tag is formatted across lines, or the style object is hoisted to a const. Same violation as raw-html-layout: use a Mantine layout primitive (Box/Flex/Grid/Stack/Group). Promoted to error at 1.26.0 (C16) with severity only — the kind stayed standalone rather than folding into raw-html-layout as originally planned; the merge is still open, tracked as a follow-up, not done here.";
|
|
284
|
+
};
|
|
285
|
+
readonly 'in-body-page-title': {
|
|
286
|
+
readonly kind: "in-body-page-title";
|
|
287
|
+
readonly pattern: RegExp;
|
|
288
|
+
readonly appliesTo: (relPath: string) => boolean;
|
|
289
|
+
readonly message: "In-body page title — a page is named ONCE, by the breadcrumb (staticData.title) or by PageBar.title in a shell-less app, and every section/card/table title is a WidgetHeader (docs/CONTROLS-SPEC.md law C8). An <Title order={1|2}> in the body is a second name for the same page, and it drifts. Prose / ArticleLayout / an overlay and anything under a content/ path are document headings and never report. Same law the oxlint plugin enforces as basalt/in-body-page-title — one id, two lanes, so one theme-allow covers both.";
|
|
290
|
+
};
|
|
291
|
+
readonly 'raw-selection-control': {
|
|
292
|
+
readonly kind: "raw-selection-control";
|
|
293
|
+
readonly pattern: RegExp;
|
|
294
|
+
readonly appliesTo: (relPath: string) => boolean;
|
|
295
|
+
readonly message: "Raw selection control with no home — a filter or tab belongs in a PageBar / Section / WidgetHeader slot and takes a `field` (a FieldHandle), so it owns the URL write and the localStorage mirror instead of carrying value/onChange (docs/CONTROLS-SPEC.md laws C1–C3). Use the bound control from basalt-ui/controls. A settings row, an overlay and an @mantine/form file are the declared non-homes and never report. This is the TEXT lane of basalt/control-outside-home, which answers the same question against the real AST — where the two disagree, the plugin is right.";
|
|
233
296
|
};
|
|
234
297
|
readonly 'inline-font-size': {
|
|
235
298
|
readonly kind: "inline-font-size";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guard/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE7E,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guard/index.ts"],"names":[],"mappings":"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"}
|
package/dist/guard/index.js
CHANGED
|
@@ -132,6 +132,15 @@ function basaltImportedNames(codeText) {
|
|
|
132
132
|
}
|
|
133
133
|
const RAW_FORM_CONTROL = /<(?:input|select|textarea)\b/g;
|
|
134
134
|
const RAW_FORM_CONTROL_TAG = /<(?:input|select|textarea)\b(?:=>|[^>])*?>/g;
|
|
135
|
+
const PAGE_TITLE_TAG = /<Title(?![\w.])(?:=>|[^>])*?>/g;
|
|
136
|
+
const PAGE_TITLE_ORDER_PROP = /\border\s*=\s*\{\s*([12])\s*\}/;
|
|
137
|
+
const RAW_SELECTION_CONTROL_TAG = /<(SegmentedControl|Select|MultiSelect|NativeSelect|DatePickerInput|DateInput|TagsInput|Chip\.Group)(?![\w])(?:=>|[^>])*?>/g;
|
|
138
|
+
const PROSE_CONTEXT_TAG = /<(?:Prose|ArticleLayout|Modal|Drawer)(?![\w])/;
|
|
139
|
+
const CONTROL_HOST_TAG = /<(?:SettingsRow|Modal|Drawer|Popover\.Dropdown|Menu\.Dropdown|Composer)(?![\w])/;
|
|
140
|
+
const CONTROL_HOST_WINDOW_LINES = 12;
|
|
141
|
+
const OVERLAY_CONVENTION_FILE = /(?:^|\/)[^/]*-(?:modal|drawer|popover|panel|form)\.[jt]sx$/;
|
|
142
|
+
const CONTROL_OWNER_DEF = /\b(?:function|const|class)\s+(?:RangeFilter|CompareFilter|SelectFilter|MultiSelectFilter|NumberFilter|SearchFilter|ToggleFilter|ViewTabs|FilterSet|FilterPill|SyncButton|ActionGroup|OverflowMenu|CtlSlot)(?![\w])/;
|
|
143
|
+
const MANTINE_FORM_IMPORT = /from\s+['"]@mantine\/form['"]/;
|
|
135
144
|
const STYLES_INPUT_PART = /\bstyles\s*=\s*\{\{\s*input\s*:\s*\{([^}]*)\}/g;
|
|
136
145
|
const SUB_16_FONT_SIZE = /font-?[Ss]ize\s*:\s*['"]?(-?\d+(?:\.\d+)?)(?:px)?['"]?(?=[,\s}]|$)/g;
|
|
137
146
|
const DEFAULT_SPACING_STEPS = [11, 13, 18, 20, 26];
|
|
@@ -158,11 +167,11 @@ const DEFAULT_GUARD_CONFIG = {
|
|
|
158
167
|
severity: {}
|
|
159
168
|
};
|
|
160
169
|
const GRACE_PERIOD_KINDS = {
|
|
161
|
-
"
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
170
|
+
"raw-selection-control": {
|
|
171
|
+
since: "1.26.0",
|
|
172
|
+
promote: "1.28.0",
|
|
173
|
+
why: 'new in the wave-6 control guards (docs/CONTROLS-SPEC.md \xA76, law C1). The text lane cannot see ancestry, so "no home" is approximated by a 12-line host-tag window \u2014 the loosest reading in the guard, and the reason this one lands warn rather than error even though its law is settled. It moved from 1.27.0 to 1.28.0 with its AST twin, `basalt/control-outside-home`, whose PLUGIN_RULE_GRACE entry carries the measurement: the wave-7 run left 9 warns in argo, all of them a control in a modal/form module whose `<Modal>` is rendered by the PARENT \u2014 law C1 cross-file, which neither lane can see. `OVERLAY_CONVENTION_FILE` (this file, and the same regex in the plugin) exempts that declared naming convention in both lanes; 1.28.0 is when the remainder is re-measured. One law, two lanes, one promotion.'
|
|
174
|
+
}
|
|
166
175
|
};
|
|
167
176
|
function severityOf(kind, cfg) {
|
|
168
177
|
return cfg.severity?.[kind] ?? (Object.hasOwn(GRACE_PERIOD_KINDS, kind) ? "warn" : "error");
|
|
@@ -238,6 +247,16 @@ const PLUGIN_RULE_IDS = /* @__PURE__ */ new Set([
|
|
|
238
247
|
"hand-rolled-shell",
|
|
239
248
|
"shadow-basalt-export",
|
|
240
249
|
"raw-scroll-container",
|
|
250
|
+
"hand-rolled-filter",
|
|
251
|
+
"control-outside-home",
|
|
252
|
+
"control-size-literal",
|
|
253
|
+
"page-bar-budget",
|
|
254
|
+
"responsive-twin",
|
|
255
|
+
"search-literal-link",
|
|
256
|
+
"use-search-from-literal",
|
|
257
|
+
// `in-body-page-title` is deliberately ABSENT: it is a plugin rule AND a guard kind under one id
|
|
258
|
+
// (one law, two lanes, one annotation), and this set is the ids OUTSIDE `checkSource`'s reach.
|
|
259
|
+
// `check-source.test.ts` asserts the two registries stay disjoint.
|
|
241
260
|
"visx-boundary",
|
|
242
261
|
"visx-tooltip",
|
|
243
262
|
"token-layer-boundary",
|
|
@@ -443,7 +462,12 @@ const TOKENS_ONLY_DISABLED_KINDS = /* @__PURE__ */ new Set([
|
|
|
443
462
|
"unframed-chart",
|
|
444
463
|
"chart-missing-aria-label",
|
|
445
464
|
"raw-form-control",
|
|
446
|
-
"sub-16-input-font"
|
|
465
|
+
"sub-16-input-font",
|
|
466
|
+
// Both wave-6 control kinds: `<Title>` is a Mantine component and the remedy for either one is a
|
|
467
|
+
// Mantine-rendered home (PageBar / WidgetHeader) or a basalt control over @mantine/core. Neither
|
|
468
|
+
// sentence is followable in a consumer that installs the token layer and nothing else.
|
|
469
|
+
"in-body-page-title",
|
|
470
|
+
"raw-selection-control"
|
|
447
471
|
]);
|
|
448
472
|
const REGEX_PRECEDING_PUNCT = /* @__PURE__ */ new Set([
|
|
449
473
|
"=",
|
|
@@ -791,7 +815,23 @@ const GUARD_RULES = {
|
|
|
791
815
|
// handled inline (full-text tag-scoped scan + hoisted-const lookup)
|
|
792
816
|
enabled: (cfg) => cfg.rawHtmlLayout,
|
|
793
817
|
appliesTo: (relPath) => !isChartFile(relPath) && !relPath.endsWith(".css"),
|
|
794
|
-
message: "Raw HTML element with inline layout/surface styling that the line scan cannot see \u2014 the tag is formatted across lines, or the style object is hoisted to a const. Same violation as raw-html-layout: use a Mantine layout primitive (Box/Flex/Grid/Stack/Group).
|
|
818
|
+
message: "Raw HTML element with inline layout/surface styling that the line scan cannot see \u2014 the tag is formatted across lines, or the style object is hoisted to a const. Same violation as raw-html-layout: use a Mantine layout primitive (Box/Flex/Grid/Stack/Group). Promoted to error at 1.26.0 (C16) with severity only \u2014 the kind stayed standalone rather than folding into raw-html-layout as originally planned; the merge is still open, tracked as a follow-up, not done here."
|
|
819
|
+
},
|
|
820
|
+
"in-body-page-title": {
|
|
821
|
+
kind: "in-body-page-title",
|
|
822
|
+
pattern: PAGE_TITLE_TAG,
|
|
823
|
+
// handled inline (full-text tag-scoped scan); entry keeps the registry complete
|
|
824
|
+
// JSX-tag-shaped (`<Title order={1}>`) — never appears in CSS text.
|
|
825
|
+
appliesTo: (relPath) => !relPath.endsWith(".css"),
|
|
826
|
+
message: "In-body page title \u2014 a page is named ONCE, by the breadcrumb (staticData.title) or by PageBar.title in a shell-less app, and every section/card/table title is a WidgetHeader (docs/CONTROLS-SPEC.md law C8). An <Title order={1|2}> in the body is a second name for the same page, and it drifts. Prose / ArticleLayout / an overlay and anything under a content/ path are document headings and never report. Same law the oxlint plugin enforces as basalt/in-body-page-title \u2014 one id, two lanes, so one theme-allow covers both."
|
|
827
|
+
},
|
|
828
|
+
"raw-selection-control": {
|
|
829
|
+
kind: "raw-selection-control",
|
|
830
|
+
pattern: RAW_SELECTION_CONTROL_TAG,
|
|
831
|
+
// handled inline (full-text tag-scoped scan + host window)
|
|
832
|
+
// JSX-tag-shaped (`<Select …>`) — never appears in CSS text.
|
|
833
|
+
appliesTo: (relPath) => !relPath.endsWith(".css"),
|
|
834
|
+
message: "Raw selection control with no home \u2014 a filter or tab belongs in a PageBar / Section / WidgetHeader slot and takes a `field` (a FieldHandle), so it owns the URL write and the localStorage mirror instead of carrying value/onChange (docs/CONTROLS-SPEC.md laws C1\u2013C3). Use the bound control from basalt-ui/controls. A settings row, an overlay and an @mantine/form file are the declared non-homes and never report. This is the TEXT lane of basalt/control-outside-home, which answers the same question against the real AST \u2014 where the two disagree, the plugin is right."
|
|
795
835
|
},
|
|
796
836
|
"inline-font-size": {
|
|
797
837
|
kind: "inline-font-size",
|
|
@@ -1034,6 +1074,36 @@ function checkSource(text, relPath, cfg) {
|
|
|
1034
1074
|
push("card-with-border", lineNo, "withBorder");
|
|
1035
1075
|
}
|
|
1036
1076
|
}
|
|
1077
|
+
if (ruleApplies("in-body-page-title", relPath) && !relPath.split("/").includes("content") && !PROSE_CONTEXT_TAG.test(codeText)) {
|
|
1078
|
+
for (const m of codeText.matchAll(PAGE_TITLE_TAG)) {
|
|
1079
|
+
const order = PAGE_TITLE_ORDER_PROP.exec(m[0]);
|
|
1080
|
+
if (order === null) continue;
|
|
1081
|
+
const startLine = codeText.slice(0, m.index ?? 0).split("\n").length;
|
|
1082
|
+
const endLine = startLine + (m[0].split("\n").length - 1);
|
|
1083
|
+
if (isAllowedInRange(startLine, endLine, "in-body-page-title")) continue;
|
|
1084
|
+
findings.push({
|
|
1085
|
+
relPath,
|
|
1086
|
+
line: startLine,
|
|
1087
|
+
token: `<Title order={${order[1]}}`,
|
|
1088
|
+
kind: "in-body-page-title"
|
|
1089
|
+
});
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
if (ruleApplies("raw-selection-control", relPath) && !OVERLAY_CONVENTION_FILE.test(relPath) && !CONTROL_OWNER_DEF.test(codeText) && !MANTINE_FORM_IMPORT.test(codeText)) {
|
|
1093
|
+
for (const m of codeText.matchAll(RAW_SELECTION_CONTROL_TAG)) {
|
|
1094
|
+
const startLine = codeText.slice(0, m.index ?? 0).split("\n").length;
|
|
1095
|
+
const windowStart = Math.max(0, startLine - 1 - CONTROL_HOST_WINDOW_LINES);
|
|
1096
|
+
if (CONTROL_HOST_TAG.test(codeLines.slice(windowStart, startLine).join("\n"))) continue;
|
|
1097
|
+
const endLine = startLine + (m[0].split("\n").length - 1);
|
|
1098
|
+
if (isAllowedInRange(startLine, endLine, "raw-selection-control")) continue;
|
|
1099
|
+
findings.push({
|
|
1100
|
+
relPath,
|
|
1101
|
+
line: startLine,
|
|
1102
|
+
token: `<${m[1] ?? "Select"}`,
|
|
1103
|
+
kind: "raw-selection-control"
|
|
1104
|
+
});
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1037
1107
|
if (GUARD_RULES["sub-16-input-font"].enabled(cfg) && ruleApplies("sub-16-input-font", relPath)) {
|
|
1038
1108
|
for (const m of codeText.matchAll(RAW_FORM_CONTROL_TAG)) {
|
|
1039
1109
|
const tagText = m[0];
|
|
@@ -1096,6 +1166,7 @@ function neutralizeAllowAnnotation(text, line, cfg) {
|
|
|
1096
1166
|
export {
|
|
1097
1167
|
DEFAULT_GUARD_CONFIG,
|
|
1098
1168
|
GENERATED_HEADER_LINE,
|
|
1169
|
+
GRACE_PERIOD_KINDS,
|
|
1099
1170
|
GUARD_RULES,
|
|
1100
1171
|
NEUTRALIZED_ALLOW_TOKEN,
|
|
1101
1172
|
PLUGIN_RULE_IDS,
|
package/dist/guard/types.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Guard types — Mantine-free, dependency-free (zero imports beyond TS types).
|
|
3
3
|
*
|
|
4
|
-
* GuardKind is the closed set of
|
|
4
|
+
* GuardKind is the closed set of 27 violation kinds the theme guard can emit.
|
|
5
5
|
* Finding is the structured result per violation, replacing the old `Violation` shape.
|
|
6
6
|
* GuardConfig is the per-run configuration that drives checkSource.
|
|
7
7
|
*/
|
|
8
|
-
/** The
|
|
9
|
-
export type GuardKind = 'raw-hex' | 'raw-color-fn' | 'localstorage-theme' | 'off-identity-accent' | 'mantine-shade-index' | 'raw-spacing' | 'raw-radius' | 'raw-surface' | 'card-with-border' | 'off-system-surface-var' | 'raw-html-layout' | 'inline-spacing' | 'inline-display' | 'raw-visx-axis' | 'raw-motion-value' | 'unframed-chart' | 'chart-missing-aria-label' | 'raw-form-control' | 'sub-16-input-font' | 'raw-font-family' | 'theme-allow-unscoped' | 'surface-shadow-override' | 'css-raw-surface' | 'inline-font-size' | 'hidden-inline-style';
|
|
8
|
+
/** The 27 theme-guard violation kinds. */
|
|
9
|
+
export type GuardKind = 'raw-hex' | 'raw-color-fn' | 'localstorage-theme' | 'off-identity-accent' | 'mantine-shade-index' | 'raw-spacing' | 'raw-radius' | 'raw-surface' | 'card-with-border' | 'off-system-surface-var' | 'raw-html-layout' | 'inline-spacing' | 'inline-display' | 'raw-visx-axis' | 'raw-motion-value' | 'unframed-chart' | 'chart-missing-aria-label' | 'raw-form-control' | 'sub-16-input-font' | 'raw-font-family' | 'theme-allow-unscoped' | 'surface-shadow-override' | 'css-raw-surface' | 'inline-font-size' | 'hidden-inline-style' | 'in-body-page-title' | 'raw-selection-control';
|
|
10
10
|
/**
|
|
11
11
|
* How hard a finding lands. `error` fails the build; `warn` reports and passes.
|
|
12
12
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/guard/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,cAAc,GACd,oBAAoB,GACpB,qBAAqB,GACrB,qBAAqB,GACrB,aAAa,GACb,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,wBAAwB,GACxB,iBAAiB,GACjB,gBAAgB,GAChB,gBAAgB,GAChB,eAAe,GACf,kBAAkB,GAClB,gBAAgB,GAChB,0BAA0B,GAC1B,kBAAkB,GAClB,mBAAmB,GACnB,iBAAiB,GACjB,sBAAsB,GACtB,yBAAyB,GACzB,iBAAiB,GACjB,kBAAkB,GAClB,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/guard/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,cAAc,GACd,oBAAoB,GACpB,qBAAqB,GACrB,qBAAqB,GACrB,aAAa,GACb,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,wBAAwB,GACxB,iBAAiB,GACjB,gBAAgB,GAChB,gBAAgB,GAChB,eAAe,GACf,kBAAkB,GAClB,gBAAgB,GAChB,0BAA0B,GAC1B,kBAAkB,GAClB,mBAAmB,GACnB,iBAAiB,GACjB,sBAAsB,GACtB,yBAAyB,GACzB,iBAAiB,GACjB,kBAAkB,GAClB,qBAAqB,GACrB,oBAAoB,GACpB,uBAAuB,CAAA;AAE3B;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,CAAA;AAE5C;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;CACjC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,wGAAwG;IACxG,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,uEAAuE;IACvE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5C;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;IACnC,iGAAiG;IACjG,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,2GAA2G;IAC3G,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAA;IACrC,sGAAsG;IACtG,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,4FAA4F;IAC5F,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,yFAAyF;IACzF,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;IAC7B,kGAAkG;IAClG,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAA;IACvC;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,CAAA;IAC5C;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAC1D;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAA;CAC7D,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,12 +8,22 @@
|
|
|
8
8
|
export { BasaltProvider, type BasaltProviderProps, BasaltErrorBoundary, type BasaltErrorContext, } from './provider/index.js';
|
|
9
9
|
export { createBasaltTheme, baseTheme, cssVariablesResolver } from './theme/index.js';
|
|
10
10
|
export type { BasaltFontsConfig, CreateBasaltThemeOptions } from './theme/index.js';
|
|
11
|
+
export { CTL_THEME, CtlSlot } from './theme/index.js';
|
|
12
|
+
export type { CtlSlotProps } from './theme/index.js';
|
|
13
|
+
/**
|
|
14
|
+
* The action vocabulary every home's `actions` slot takes (`docs/CONTROLS-SPEC.md` §2.1). The
|
|
15
|
+
* COMPONENTS that project it (`ActionGroup`, `OverflowMenu`, `SyncButton`, and the filter family)
|
|
16
|
+
* live on `basalt-ui/controls` — only the types a `PageBar`/`BasaltShell` prop mentions are here.
|
|
17
|
+
*/
|
|
18
|
+
export type { BarAction, ActionGroupProps, GlobalAction } from './controls/actions.js';
|
|
11
19
|
export { ThemeToggle, type ThemeToggleProps } from './theme-toggle/index.js';
|
|
12
20
|
export { MOTION_DURATION, MOTION_SPRING, MOTION_EASE_STANDARD } from './motion/index.js';
|
|
13
|
-
export { BasaltShell, NavCountBadge, AppSidebar, SidebarSearch, type SidebarSearchConfig, SidebarAccount, MobileNav, type MobileNavProps, projectMobileNav, type ProjectMobileNavOptions, MOBILE_MAX_TABS_DEFAULT, MOBILE_MENU_MAX_DEFAULT, MOBILE_MORE_KEY, AppBreadcrumbs,
|
|
21
|
+
export { BasaltShell, NavCountBadge, AppSidebar, SidebarSearch, type SidebarSearchConfig, type SidebarSearchActions, SidebarAccount, MobileNav, type MobileNavProps, projectMobileNav, type ProjectMobileNavOptions, MOBILE_MAX_TABS_DEFAULT, MOBILE_MENU_MAX_DEFAULT, MOBILE_MORE_KEY, AppBreadcrumbs, PageBar, type PageBarProps, type SidebarSection, type SidebarItem, type SidebarBlock, type SidebarBlockItem, type SidebarBlockTone, type SidebarListBlock, type SidebarProgressBlock, type SidebarCustomBlock, type NavAnchor, type NavAnchorProps, type NavMobilePlacement, type NavSectionMobile, type MobileNavConfig, type MobileNavGroup, type MobileNavModel, type MobileNavSlot, type MobileNavSurface, type BasaltShellProps, type BrandConfig, type SettingsMenuItem, type AppSidebarProps, type AccountBadgeTone, type BasaltIdentity, type BasaltRole, type BasaltPlan, type AccountMenuItem, type BasaltAccountState, type BasaltAccountActions, type BasaltAccountProps, } from './shell/index.js';
|
|
14
22
|
export { type BasaltRegister, type Slot, type Series, type SeriesKey, type AsyncState, assertNever, type StandardSchemaV1, } from './register.js';
|
|
15
|
-
export { createPersistedState, type PersistedStateOptions,
|
|
16
|
-
export {
|
|
23
|
+
export { createPersistedState, type PersistedStateOptions, readPersistedValue, createLocalStore, type LocalStore, type AnyField, type BooleanField, type EnumField, type FieldFallback, type FieldHandle, type FieldLane, type FieldOption, type FieldSetOptions, type FieldValue, type MultiField, type NumberField, type RangeField, type RangeParams, type RangePresets, type RangeValue, type RangeWindow, type RangeWindows, type ResolvedLane, type SearchValues, type StoredValues, type StringField, } from './state.js';
|
|
24
|
+
export { WidgetHeader, type WidgetHeaderProps } from './widget-header/index.js';
|
|
25
|
+
export { Section, type SectionProps } from './section/index.js';
|
|
26
|
+
export { DeltaBadge, type DeltaBadgeProps, StatCard, type StatCardBreakdownRow, type StatCardProps, type StatCardTone, EmptyState, type EmptyStateProps, SettingsSection, type SettingsSectionProps, SettingsRow, type SettingsRowProps, DangerZone, type DangerZoneProps, QueryState, type QueryStateProps, type QueryStateLike, type QueryStateVariant, type QueryEmptyCopy, LoadingState, type LoadingStateProps, ErrorState, type ErrorStateProps, } from './dashboard/index.js';
|
|
17
27
|
export { ConnectivityProvider, ConnectivityIndicator, useConnectivity } from './connectivity/index.js';
|
|
18
28
|
export type { ConnectivityStatus, ConnectivitySnapshot, ConnectivityProviderProps, ConnectivityOverride, } from './connectivity/index.js';
|
|
19
29
|
export type { SurfaceSpec, RuleName, SkillName } from './surfaces.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,mBAAmB,EACnB,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAC5E,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAC/E,OAAO,EACL,WAAW,EACX,aAAa,EACb,UAAU,EACV,aAAa,EACb,KAAK,mBAAmB,EACxB,cAAc,EACd,SAAS,EACT,KAAK,cAAc,EACnB,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,eAAe,EACf,cAAc,EACd,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,mBAAmB,EACnB,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAC5E,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAC3C;;;;GAIG;AACH,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACnF,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAC/E,OAAO,EACL,WAAW,EACX,aAAa,EACb,UAAU,EACV,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,cAAc,EACd,SAAS,EACT,KAAK,cAAc,EACnB,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,eAAe,EACf,cAAc,EACd,OAAO,EACP,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,GACxB,MAAM,SAAS,CAAA;AAKhB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,IAAI,EACT,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,UAAU,EACf,WAAW,EACX,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAA;AAMnB,OAAO,EACL,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAGtE,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAA;AAGtD,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,QAAQ,EACR,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,UAAU,EACV,KAAK,eAAe,EACpB,eAAe,EACf,KAAK,oBAAoB,EACzB,WAAW,EACX,KAAK,gBAAgB,EACrB,UAAU,EACV,KAAK,eAAe,EACpB,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,YAAY,EACZ,KAAK,iBAAiB,EACtB,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC7F,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,gBAAgB,CAAA;AAKvB,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAClE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAU9C,OAAO,EACL,eAAe,EACf,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,mBAAmB,EACnB,gBAAgB,EAChB,QAAQ,GACT,MAAM,cAAc,CAAA;AACrB,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,aAAa,GACd,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,yBAAyB,EACzB,kBAAkB,EAClB,gBAAgB,EAChB,2BAA2B,EAC3B,kBAAkB,GACnB,MAAM,SAAS,CAAA;AAChB,YAAY,EACV,0BAA0B,EAC1B,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,+BAA+B,EAC/B,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,SAAS,EACT,cAAc,GACf,MAAM,SAAS,CAAA"}
|