basalt-ui 1.32.1 → 1.34.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 +1 -1
- package/CHANGELOG.md +65 -0
- package/MIGRATING.md +218 -25
- package/README.md +3 -0
- package/agent/rules/basalt-state.md +2 -2
- package/agent/rules/basalt-tokens.md +1 -1
- package/agent/skills/basalt-app/SKILL.md +5 -3
- package/configs/oxlint-basalt.json +33 -0
- package/configs/oxlint-plugin.js +89 -67
- package/configs/oxlint-plugin.test.ts +224 -19
- package/configs/oxlint.json +2 -30
- package/dist/agent/coalesce.d.ts.map +1 -1
- package/dist/agent/coalesce.js +1 -2
- package/dist/agent/merge.d.ts.map +1 -1
- package/dist/agent/merge.js +1 -2
- package/dist/agent-chat/relative-time.d.ts +9 -0
- package/dist/agent-chat/relative-time.d.ts.map +1 -1
- package/dist/agent-chat/relative-time.js +1 -2
- package/dist/agent-chat/thread-message.d.ts.map +1 -1
- package/dist/agent-chat/thread-message.js +1 -2
- package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
- package/dist/charts/kinds/BandStrip.js +3 -3
- package/dist/charts/kinds/Bars.d.ts.map +1 -1
- package/dist/charts/kinds/Bars.js +1 -2
- package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
- package/dist/charts/kinds/StackedArea.js +1 -2
- package/dist/charts/primitives/legend-disclosure.d.ts.map +1 -1
- package/dist/cli/audit-allows.d.ts +1 -1
- package/dist/cli/audit-allows.d.ts.map +1 -1
- package/dist/cli/audit-allows.js +4 -4
- package/dist/cli/check-theme.d.ts.map +1 -1
- package/dist/cli/check-theme.js +38 -38
- package/dist/cli/config.d.ts +197 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +20 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +4 -6
- package/dist/cli/guard-hook.d.ts.map +1 -1
- package/dist/cli/guard-hook.js +7 -41
- package/dist/cli/index.d.ts +31 -257
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +64 -37
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +7 -16
- package/dist/commands/define-commands.d.ts.map +1 -1
- package/dist/commands/define-commands.js +2 -2
- package/dist/commands/define-overlays.d.ts.map +1 -1
- package/dist/commands/define-overlays.js +1 -2
- package/dist/common/index.d.ts +0 -1
- package/dist/common/index.d.ts.map +1 -1
- package/dist/common/index.js +0 -2
- package/dist/common/validate.d.ts +2 -2
- package/dist/common/validate.d.ts.map +1 -1
- package/dist/common/validate.js +2 -3
- package/dist/common/vx-families.d.ts +7 -0
- package/dist/common/vx-families.d.ts.map +1 -0
- package/dist/common/vx-families.js +32 -0
- package/dist/common/vx-family.d.ts +11 -0
- package/dist/common/vx-family.d.ts.map +1 -0
- package/dist/common/vx-family.js +12 -0
- package/dist/content/article-card.d.ts.map +1 -1
- package/dist/content/article-card.js +4 -1
- package/dist/controls/enum-filter.d.ts.map +1 -1
- package/dist/controls/enum-filter.js +3 -13
- package/dist/controls/filter-pill.d.ts +8 -0
- package/dist/controls/filter-pill.d.ts.map +1 -1
- package/dist/controls/filter-pill.js +15 -0
- package/dist/controls/multi-select-filter.d.ts.map +1 -1
- package/dist/controls/multi-select-filter.js +3 -13
- package/dist/controls/number-filter.d.ts +3 -0
- package/dist/controls/number-filter.d.ts.map +1 -1
- package/dist/controls/number-filter.js +12 -4
- package/dist/controls/range-filter.d.ts.map +1 -1
- package/dist/controls/range-filter.js +1 -2
- package/dist/data/data-table.d.ts.map +1 -1
- package/dist/data/data-table.js +2 -3
- package/dist/guard/index.d.ts +17 -3
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +62 -23
- package/dist/guard/types.d.ts +3 -3
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/guard/vx-names.d.ts +3 -0
- package/dist/guard/vx-names.d.ts.map +1 -0
- package/dist/guard/vx-names.js +257 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/notifications/mount-guard.d.ts.map +1 -1
- package/dist/notifications/mount-guard.js +1 -2
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +2 -3
- package/dist/provider/lab-theme.d.ts +5 -4
- package/dist/provider/lab-theme.d.ts.map +1 -1
- package/dist/provider/lab-theme.js +1 -3
- package/dist/router-tanstack/search-store.d.ts +18 -0
- package/dist/router-tanstack/search-store.d.ts.map +1 -1
- package/dist/router-tanstack/search-store.js +33 -1
- package/dist/shell/app-mobile-nav.d.ts.map +1 -1
- package/dist/shell/app-mobile-nav.js +2 -1
- package/dist/shell/app-mobile-nav.module.css +12 -0
- package/dist/shell/app-sidebar.d.ts.map +1 -1
- package/dist/shell/app-sidebar.js +32 -36
- package/dist/shell/app-sidebar.module.css +6 -0
- package/dist/shell/index.d.ts +0 -1
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +0 -2
- package/dist/shell/mobile-nav-model.d.ts.map +1 -1
- package/dist/shell/mobile-nav-model.js +3 -4
- package/dist/shell/nav-glyph.d.ts +14 -0
- package/dist/shell/nav-glyph.d.ts.map +1 -0
- package/dist/shell/nav-glyph.js +21 -0
- package/dist/shell/nav-types.d.ts +1 -0
- package/dist/shell/nav-types.d.ts.map +1 -1
- package/dist/shell/page-bar.d.ts.map +1 -1
- package/dist/shell/page-bar.js +1 -2
- package/dist/shell/sidebar-search.d.ts.map +1 -1
- package/dist/shell/sidebar-search.js +1 -3
- package/dist/surfaces.d.ts +3 -3
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +4 -2
- package/dist/tokens/index.d.ts +1 -1
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +24 -2
- package/dist/tokens/size-classes.d.ts +25 -0
- package/dist/tokens/size-classes.d.ts.map +1 -1
- package/dist/tokens/size-classes.js +14 -0
- package/llms.txt +4 -4
- package/package.json +1 -1
- package/src/agent/coalesce.ts +1 -2
- package/src/agent/merge.ts +1 -2
- package/src/agent-chat/relative-time.ts +1 -2
- package/src/agent-chat/thread-message.tsx +2 -3
- package/src/charts/kinds/BandStrip.tsx +7 -3
- package/src/charts/kinds/Bars.tsx +1 -2
- package/src/charts/kinds/StackedArea.tsx +4 -2
- package/src/charts/primitives/legend-disclosure.tsx +1 -0
- package/src/cli/audit-allows.ts +10 -9
- package/src/cli/check-theme.ts +61 -39
- package/src/cli/config.ts +209 -0
- package/src/cli/doctor.ts +5 -7
- package/src/cli/guard-hook.ts +9 -42
- package/src/cli/index.ts +101 -294
- package/src/cli/sync.ts +7 -16
- package/src/commands/define-commands.ts +2 -2
- package/src/commands/define-overlays.ts +1 -2
- package/src/common/index.ts +0 -1
- package/src/common/validate.ts +4 -5
- package/src/common/vx-families.ts +36 -0
- package/src/common/vx-family.ts +22 -0
- package/src/content/article-card.tsx +1 -0
- package/src/controls/enum-filter.tsx +3 -13
- package/src/controls/filter-pill.tsx +20 -0
- package/src/controls/multi-select-filter.tsx +3 -13
- package/src/controls/number-filter.tsx +24 -3
- package/src/controls/range-filter.tsx +1 -2
- package/src/data/data-table.tsx +2 -3
- package/src/guard/index.ts +134 -47
- package/src/guard/types.ts +3 -2
- package/src/guard/vx-names.ts +257 -0
- package/src/index.ts +0 -2
- package/src/notifications/mount-guard.ts +1 -2
- package/src/provider/index.tsx +2 -3
- package/src/provider/lab-theme.ts +28 -21
- package/src/router-tanstack/search-store.ts +73 -1
- package/src/shell/app-mobile-nav.module.css +12 -0
- package/src/shell/app-mobile-nav.tsx +8 -1
- package/src/shell/app-sidebar.module.css +6 -0
- package/src/shell/app-sidebar.tsx +52 -50
- package/src/shell/index.tsx +0 -1
- package/src/shell/mobile-nav-model.ts +3 -5
- package/src/shell/nav-glyph.tsx +38 -0
- package/src/shell/nav-types.ts +1 -0
- package/src/shell/page-bar.tsx +1 -4
- package/src/shell/sidebar-search.tsx +1 -5
- package/src/surfaces.ts +4 -2
- package/src/tokens/index.ts +34 -2
- package/src/tokens/size-classes.ts +27 -0
- package/dist/common/is-dev.d.ts +0 -3
- package/dist/common/is-dev.d.ts.map +0 -1
- package/dist/common/is-dev.js +0 -6
- package/dist/shell/use-breakpoint.d.ts +0 -10
- package/dist/shell/use-breakpoint.d.ts.map +0 -1
- package/dist/shell/use-breakpoint.js +0 -11
- package/src/common/is-dev.ts +0 -4
- package/src/shell/use-breakpoint.ts +0 -37
package/AGENTS.md
CHANGED
|
@@ -8,7 +8,7 @@ Toolchain: Bun runtime, oxlint + oxfmt, conventional commits (empty scope), `mas
|
|
|
8
8
|
|
|
9
9
|
| Subpath | Layer | Purpose |
|
|
10
10
|
| --------------------------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
11
|
-
| `basalt-ui` | mantine-coupled | BasaltProvider, createBasaltTheme, BasaltShell + sidebar/mobile-nav/breadcrumbs, PageBar, PageAside, useSizeClass
|
|
11
|
+
| `basalt-ui` | mantine-coupled | BasaltProvider, createBasaltTheme, BasaltShell + sidebar/mobile-nav/breadcrumbs, PageBar, PageAside, useSizeClass, NavCountBadge, ThemeToggle, ThreadWorkspace + thread-chat components, WidgetHeader, dashboard composites (DeltaBadge, StatCard with threshold tone, EmptyState, QueryState/LoadingState/ErrorState, SettingsSection/SettingsRow/DangerZone), ConnectivityProvider/useConnectivity/ConnectivityIndicator (auto-mounted, C1: absorbed from the dropped ./connectivity), createBasaltQueryClient/unwrap/BasaltQueryDevtools (C1: absorbed from the dropped ./query), BasaltDevDock (C5: lazy Router/Query devtools + theme lab in one dock) |
|
|
12
12
|
| `basalt-ui/charts` | headless | CartesianChart + visx chart primitives, kinds, sparklines, hooks, and token re-exports (Mantine-free) |
|
|
13
13
|
| `basalt-ui/tokens` | headless | VX token refs, buildPaletteCss, defineSeries, seriesTokens, groupTokens, alpha (Mantine-free) |
|
|
14
14
|
| `basalt-ui/theme-lab` | mantine-coupled | ThemeLabControls, applyOverrides, COLOR_GROUPS — a low-level inspector for the non-derived structural tokens; identity/color tuning lives in DeriveControls |
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,68 @@
|
|
|
1
|
+
# [1.34.0](https://github.com/jkrumm/basalt-ui/compare/v1.33.0...v1.34.0) (2026-10-01)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* --merge-lint replaces a guards-only extends instead of stacking it ([b2e551b](https://github.com/jkrumm/basalt-ui/commit/b2e551bc1dc431a457f58db2f8727c5f2546a9f2))
|
|
7
|
+
* card-with-border remedy names its card-inset half ([1edfae7](https://github.com/jkrumm/basalt-ui/commit/1edfae79a0366d0f6c4618a7bd07d8c2370a1753))
|
|
8
|
+
* derive basalt's --vx-* families from every emitted name ([07ea183](https://github.com/jkrumm/basalt-ui/commit/07ea1834f4cfc14979bb81e4cd2afc5849f28712))
|
|
9
|
+
* dev-gate the basalt-family ref warning and pin its version ([23396df](https://github.com/jkrumm/basalt-ui/commit/23396df7d4fbb1f7b16f0d2f192c07485b6a4e47))
|
|
10
|
+
* give icon-less nav items a first-letter glyph and a name in the rail ([9095f15](https://github.com/jkrumm/basalt-ui/commit/9095f157d1652316f03e2ff1668faddb406a34ef))
|
|
11
|
+
* name an icon-less row by aria-label only in the collapsed rail ([bc13e09](https://github.com/jkrumm/basalt-ui/commit/bc13e09ff3c12e56be98c5353cf95c5925463ff9))
|
|
12
|
+
* never autofix a removed deprecation row ([0534a28](https://github.com/jkrumm/basalt-ui/commit/0534a287da5252b8699b9bd4eb5ec36c1279b1b9))
|
|
13
|
+
* refuse a release that reaches a deprecation's removeIn while it still ships ([eb55145](https://github.com/jkrumm/basalt-ui/commit/eb5514507011e9b9fdb7f1a23e335bc1c478c3aa))
|
|
14
|
+
* restore check-grace's singular 'grace entry' in the clear line ([6fca61c](https://github.com/jkrumm/basalt-ui/commit/6fca61cb5ec1dae71b1f8b9661817a17919ca9b5))
|
|
15
|
+
* take the rail glyph from a real grapheme via Intl.Segmenter ([ff4e396](https://github.com/jkrumm/basalt-ui/commit/ff4e39637f12cddb8817cd4be9367bb63f0ab5fc))
|
|
16
|
+
* treat a false icon as absent and expose a label-only glyph helper ([323ddbb](https://github.com/jkrumm/basalt-ui/commit/323ddbb0dc28c41b54c1c33271eb7d6a348ab1bd))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Features
|
|
20
|
+
|
|
21
|
+
* check-theme names an unwired AST lane ([91472ef](https://github.com/jkrumm/basalt-ui/commit/91472efbf87b336716c1871392878e648b355cd0))
|
|
22
|
+
* judge every unemitted name inside a basalt-owned --vx-* family ([4864a9d](https://github.com/jkrumm/basalt-ui/commit/4864a9d78a0a0ef95d1f6caee85043b0d64c75ea))
|
|
23
|
+
* remove useBreakpoint, overdue since 1.33.0 ([d68f538](https://github.com/jkrumm/basalt-ui/commit/d68f538dde34acecda481f567c17ade5a86074d4))
|
|
24
|
+
* ship a guards-only oxlint preset, configs/oxlint-basalt.json ([f96d150](https://github.com/jkrumm/basalt-ui/commit/f96d15097aabf5461b524270eb5ce523928bfab5))
|
|
25
|
+
* ship CONTAINER_KEYS for SimpleGrid type="container" keys ([acb5933](https://github.com/jkrumm/basalt-ui/commit/acb5933cf407cfb203819ad09bb7cf0315f73e79))
|
|
26
|
+
|
|
27
|
+
# [1.33.0](https://github.com/jkrumm/basalt-ui/compare/v1.32.1...v1.33.0) (2026-10-01)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
### Bug Fixes
|
|
31
|
+
|
|
32
|
+
* audit-allows asks oxlint about dual-lane and mixed waivers ([9e0a3d5](https://github.com/jkrumm/basalt-ui/commit/9e0a3d5a43cd9e27625801dd28c3360975f155ed))
|
|
33
|
+
* audit-allows probes bare line-scope waivers through oxlint ([b5d53f9](https://github.com/jkrumm/basalt-ui/commit/b5d53f9c8e3ac1712e455dd0fd7310d88358104f))
|
|
34
|
+
* break the audit-allows → index → check-theme → audit-allows cycle ([98d746c](https://github.com/jkrumm/basalt-ui/commit/98d746cd13e36b7cbf5fa809e120c91cd9d23c53))
|
|
35
|
+
* count only real declaration positions as a local --vx declaration ([4b5b723](https://github.com/jkrumm/basalt-ui/commit/4b5b723c994c6f6c2b01612f5a303649881f3cc2))
|
|
36
|
+
* gate the lab store on the dotted NODE_ENV form, record the fold matrix ([7d336b5](https://github.com/jkrumm/basalt-ui/commit/7d336b5209aa7be846ba11faa935e31e5aa8f795))
|
|
37
|
+
* gen-vx-names reads CSS declarations in ts/tsx and says what QUOTED admits ([238cdb9](https://github.com/jkrumm/basalt-ui/commit/238cdb9fb887b6b703e61c684d0c657d3a9a6a5c))
|
|
38
|
+
* harden the provider-only budget's build, dist and externals handling ([8a20d0f](https://github.com/jkrumm/basalt-ui/commit/8a20d0f49784e496b7db9634a2ac83f97c01903d))
|
|
39
|
+
* judge a resets write against the URL at navigate time, not the render ([74a6dc7](https://github.com/jkrumm/basalt-ui/commit/74a6dc762965e470525e9aabe14e9f5e0972b07b))
|
|
40
|
+
* judge only the vx names basalt claims — removed names and bare roots ([bf15dab](https://github.com/jkrumm/basalt-ui/commit/bf15dab0704858022ec2c157b74e8183dda71586))
|
|
41
|
+
* keep the page when clear() leaves a field where it was ([2a6b40f](https://github.com/jkrumm/basalt-ui/commit/2a6b40faebb38011b2203b10382411c97fb6d551))
|
|
42
|
+
* keep the page when Reset all moves no field ([c12d01a](https://github.com/jkrumm/basalt-ui/commit/c12d01ae7fa998f569369b3fb347bc941c56cf6c))
|
|
43
|
+
* print a failed provider-only build as a budget row, not a stack ([66361ef](https://github.com/jkrumm/basalt-ui/commit/66361ef1a41019b6f096e33ffc0d13d28913e639))
|
|
44
|
+
* resolve the CONTAINER_GRID_BREAKPOINTS trust through the scope manager ([26f664b](https://github.com/jkrumm/basalt-ui/commit/26f664b6c5af662ce89f09ff1d839fd8fc34830e))
|
|
45
|
+
* see a --vx reference a formatter wrapped across lines ([ba469b1](https://github.com/jkrumm/basalt-ui/commit/ba469b12cc7513d90fbc5171e570cfacc83312bf))
|
|
46
|
+
* stop NumberFilter's Clear from committing the draft on its way ([04e3156](https://github.com/jkrumm/basalt-ui/commit/04e315682571ad9cca24cadd451accce0a312134))
|
|
47
|
+
* trust CONTAINER_GRID_BREAKPOINTS read off a namespace import ([cc15f76](https://github.com/jkrumm/basalt-ui/commit/cc15f760fbcafa041404b750f1e588c712108745))
|
|
48
|
+
* word the bare-waiver oxlint verdict by what it waives, not a fake id ([3b5e3b2](https://github.com/jkrumm/basalt-ui/commit/3b5e3b2757b0ff7b875dc1a337f4a8137e8c4bc3))
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
### Features
|
|
52
|
+
|
|
53
|
+
* add clearable to NumberFilter for parity with SelectFilter ([a46d805](https://github.com/jkrumm/basalt-ui/commit/a46d805f97c1b60b93017ade2f6edb5a293fd302))
|
|
54
|
+
* add resets to createSearchStore for sibling params like page ([e809fd7](https://github.com/jkrumm/basalt-ui/commit/e809fd78e0b397f1ea52bb860b68bda5353c4943))
|
|
55
|
+
* promote the C1 and breakpoint twin pairs to error ([d49a5e2](https://github.com/jkrumm/basalt-ui/commit/d49a5e22b4f678f82f2377485f15ce6bc65c1be6))
|
|
56
|
+
* report removed and misspelled --vx-* names as unknown-vx-token ([6405f1a](https://github.com/jkrumm/basalt-ui/commit/6405f1af265cb7659026c1806bead121a22253f6))
|
|
57
|
+
* ship CONTAINER_GRID_BREAKPOINTS and let raw-breakpoint trust it ([4e3addb](https://github.com/jkrumm/basalt-ui/commit/4e3addbf50d1d358d8037389ad679d434ba00d98))
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
### Performance Improvements
|
|
61
|
+
|
|
62
|
+
* budget the provider-only first paint in check-budgets ([d36bed2](https://github.com/jkrumm/basalt-ui/commit/d36bed2c9c898490fddde0de126a36541ee25860))
|
|
63
|
+
* fold every dev-only gate out of production bundles ([25f94b7](https://github.com/jkrumm/basalt-ui/commit/25f94b79e81b045c05fe5eefb9479edebe195c43))
|
|
64
|
+
* keep the theme lab's store out of production first paint ([4e7512b](https://github.com/jkrumm/basalt-ui/commit/4e7512b41846e54fbb3d196ec157435c03b1c582))
|
|
65
|
+
|
|
1
66
|
## [1.32.1](https://github.com/jkrumm/basalt-ui/compare/v1.32.0...v1.32.1) (2026-09-30)
|
|
2
67
|
|
|
3
68
|
|
package/MIGRATING.md
CHANGED
|
@@ -66,18 +66,18 @@ There is one row per SURFACE, not per export, and a surface earns a row once any
|
|
|
66
66
|
shipped lefthook preset both changed in 1.30.0 with no row that owned them — which is how a
|
|
67
67
|
consumer read this index, found nothing, and diffed a KPI row that had silently gone 4-up → 2-up.
|
|
68
68
|
|
|
69
|
-
| Surface | 1.27.0 | 1.28.0 | 1.29.0 | 1.30.0 | 1.30.1 | 1.30.2 | 1.31.0 | 1.32.0 | 1.32.1 | Unreleased |
|
|
70
|
-
| ----------------------------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | --------------------------------------------------------------------- | ------ | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | ---------- |
|
|
71
|
-
| **tokens** (`./tokens`) | — | `--vx-divider` → `rgba()` on both schemes (§ Shell) | `--vx-space-touch-target` added (§ Additions) | eight spacing numbers (§ Chrome) | — | — | `--vx-hit` replaces the touch vars; `SIZE_CLASSES` (§ 1.31.0) | — | `SIZE_CLASSES`/`CONTAINER_CLASSES` actually exported (§ Fixes) | — |
|
|
72
|
-
| **charts** (`./charts`) | — | phone tier, `curve`, formatters, `state`, log axis (§ preamble) | `ChartState.empty: string`, `AxisBottomNumeric` (§ Additions) | responsive `height`, `legend.maxRows` (§ Charts) | `height` reaches the kinds; `maxRows` beats the `fill` fit (§ Charts) | — | container-class tier + `height` keys (§ 1.31.0) | — | `ResponsiveChartHeight` `sm` → key (§ Container recipes) | — |
|
|
73
|
-
| **shell** (`.`) | — | scrollport, region seams, **the brand left the sidebar** (§§ scrollport, brand, Shell) | `PageTitle`, `BasaltDevDock`, `useBreakpoint` (§ Additions) | More popover, aside pill, the responsive gutter, `useBasaltSpacing` (§ Chrome) | — | — | `theme.breakpoints` derived, `useSizeClass`, `data-basalt-host`, `useBreakpoint` on notice (§ 1.31.0) | `useBreakpoint` removal → 1.33.0; `useSizeClass` is shell-only (§ 1.32.0) | shell-less `shell/` gutter, `AppShell` breakpoints, `useSizeClass` for overlays (§§ Shell-less, `useSizeClass`) | — |
|
|
74
|
-
| **controls** (`./controls`) | `NumberFilter`, `field.number` (§ Controls) | sheet renders panel rows; `PanelRow`, `SliderControl` (§ `basalt-ui/controls`) | — | — | — | — | — | — | — | — |
|
|
75
|
-
| **forms** (`./forms`) | — | `field` → `inputProps`, **`inputProps` drops `key`**, the layout tier (§ `inputProps`) | `field` DELETED — and the `--fix` recipe no longer works (§ Consolidation) | — | — | — | — | — | `FormGroup` row no longer stretches (§ Fixes) | — |
|
|
76
|
-
| **data** (`./data/table`) | — | root is a `<div>`, row selection, `getItemKey` required (§ `basalt-ui/data`) | `./data` + `./query` + `./connectivity` dropped (§ Consolidation) | — | — | — | — | — | `renderCard` documented (§ `renderCard`) | — |
|
|
77
|
-
| **dashboard** (`.`) | `StatCard`: `unit`, `breakdown`, delta format (§ `StatCard`) | `StatGroup`, `WidgetGrid`, query-aware `StatCard` — additive | — | **the column law keys on the CONTAINER; `cols={4}` is 2-up at `sm`** (§ Dashboard) | — | — | — | — | — | — |
|
|
78
|
-
| **toolchain** (`./configs/*`) | — | — | the shipped lefthook preset's `check-theme` BROKE — the CLI resolver stopped ascending (§ CLI) | the preset's default bin, and the `root:` recipe (§ Toolchain) | — | — | — | — | — | — |
|
|
79
|
-
| **CLI** (`basalt-ui`) | — | — | **resolver stops relocating; `doctor` loses 6 of 10 checks** (§ CLI) | — | — | — | — | — | — | — |
|
|
80
|
-
| **guards** | five rules → `error` (§ Guards) | six new ids at `warn` (§ preamble) | `query-dual-import` retired in 1.29.1 (§ Guards) | four rules → `error` (§ Guards) | — | — | — | `raw-breakpoint`: the container-grid answer, `error` at 1.33.0 (§ 1.32.0) | `FormRow`/`FormGroup` homes in both lanes; `basalt-main` dropped (§ Fixes) | — |
|
|
69
|
+
| Surface | 1.27.0 | 1.28.0 | 1.29.0 | 1.30.0 | 1.30.1 | 1.30.2 | 1.31.0 | 1.32.0 | 1.32.1 | 1.33.0 | 1.34.0 | Unreleased |
|
|
70
|
+
| ----------------------------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | --------------------------------------------------------------------- | ------ | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ---------------------------------- | ---------- |
|
|
71
|
+
| **tokens** (`./tokens`) | — | `--vx-divider` → `rgba()` on both schemes (§ Shell) | `--vx-space-touch-target` added (§ Additions) | eight spacing numbers (§ Chrome) | — | — | `--vx-hit` replaces the touch vars; `SIZE_CLASSES` (§ 1.31.0) | — | `SIZE_CLASSES`/`CONTAINER_CLASSES` actually exported (§ Fixes) | `CONTAINER_GRID_BREAKPOINTS`; `raw-breakpoint` trusts it (§ 1.33.0) | `CONTAINER_KEYS` (§ 1.34.0) | — |
|
|
72
|
+
| **charts** (`./charts`) | — | phone tier, `curve`, formatters, `state`, log axis (§ preamble) | `ChartState.empty: string`, `AxisBottomNumeric` (§ Additions) | responsive `height`, `legend.maxRows` (§ Charts) | `height` reaches the kinds; `maxRows` beats the `fill` fit (§ Charts) | — | container-class tier + `height` keys (§ 1.31.0) | — | `ResponsiveChartHeight` `sm` → key (§ Container recipes) | — | — | — |
|
|
73
|
+
| **shell** (`.`) | — | scrollport, region seams, **the brand left the sidebar** (§§ scrollport, brand, Shell) | `PageTitle`, `BasaltDevDock`, `useBreakpoint` (§ Additions) | More popover, aside pill, the responsive gutter, `useBasaltSpacing` (§ Chrome) | — | — | `theme.breakpoints` derived, `useSizeClass`, `data-basalt-host`, `useBreakpoint` on notice (§ 1.31.0) | `useBreakpoint` removal → 1.33.0; `useSizeClass` is shell-only (§ 1.32.0) | shell-less `shell/` gutter, `AppShell` breakpoints, `useSizeClass` for overlays (§§ Shell-less, `useSizeClass`) | — | `useBreakpoint` removed (§ 1.34.0) | — |
|
|
74
|
+
| **controls** (`./controls`) | `NumberFilter`, `field.number` (§ Controls) | sheet renders panel rows; `PanelRow`, `SliderControl` (§ `basalt-ui/controls`) | — | — | — | — | — | — | — | `NumberFilter clearable`; `createSearchStore` `resets` (§ State and controls) | — | — |
|
|
75
|
+
| **forms** (`./forms`) | — | `field` → `inputProps`, **`inputProps` drops `key`**, the layout tier (§ `inputProps`) | `field` DELETED — and the `--fix` recipe no longer works (§ Consolidation) | — | — | — | — | — | `FormGroup` row no longer stretches (§ Fixes) | — | — | — |
|
|
76
|
+
| **data** (`./data/table`) | — | root is a `<div>`, row selection, `getItemKey` required (§ `basalt-ui/data`) | `./data` + `./query` + `./connectivity` dropped (§ Consolidation) | — | — | — | — | — | `renderCard` documented (§ `renderCard`) | — | — | — |
|
|
77
|
+
| **dashboard** (`.`) | `StatCard`: `unit`, `breakdown`, delta format (§ `StatCard`) | `StatGroup`, `WidgetGrid`, query-aware `StatCard` — additive | — | **the column law keys on the CONTAINER; `cols={4}` is 2-up at `sm`** (§ Dashboard) | — | — | — | — | — | — | — | — |
|
|
78
|
+
| **toolchain** (`./configs/*`) | — | — | the shipped lefthook preset's `check-theme` BROKE — the CLI resolver stopped ascending (§ CLI) | the preset's default bin, and the `root:` recipe (§ Toolchain) | — | — | — | — | — | — | — | — |
|
|
79
|
+
| **CLI** (`basalt-ui`) | — | — | **resolver stops relocating; `doctor` loses 6 of 10 checks** (§ CLI) | — | — | — | — | — | — | — | — | — |
|
|
80
|
+
| **guards** | five rules → `error` (§ Guards) | six new ids at `warn` (§ preamble) | `query-dual-import` retired in 1.29.1 (§ Guards) | four rules → `error` (§ Guards) | — | — | — | `raw-breakpoint`: the container-grid answer, `error` at 1.33.0 (§ 1.32.0) | `FormRow`/`FormGroup` homes in both lanes; `basalt-main` dropped (§ Fixes) | C1 + breakpoint pairs → `error`; `unknown-vx-token` `warn` (§ Guards) | — | — |
|
|
81
81
|
|
|
82
82
|
---
|
|
83
83
|
|
|
@@ -86,6 +86,197 @@ consumer read this index, found nothing, and diffed a KPI row that had silently
|
|
|
86
86
|
_Nothing yet. Author the next section under this heading as `## Unreleased — <title>`; the
|
|
87
87
|
release renames it and opens a new one here._
|
|
88
88
|
|
|
89
|
+
## 1.34.0 — the 1.34.0 minor
|
|
90
|
+
|
|
91
|
+
### `CONTAINER_KEYS` — the `SimpleGrid type="container"` keys ship
|
|
92
|
+
|
|
93
|
+
`basalt-ui/tokens` exports `CONTAINER_CLASSES` as the CSS lengths `SimpleGrid type="container"`
|
|
94
|
+
keys take (`compact` 240px · `regular` 480px · `wide` 800px), so the computed key is one import
|
|
95
|
+
instead of a template literal at every call site (argo: 19 sites behind two local `CQ_*` consts).
|
|
96
|
+
`micro` has no key — `base` is that class. `basalt/raw-breakpoint` judges theme names only, so the
|
|
97
|
+
computed key is green; nothing to waive.
|
|
98
|
+
|
|
99
|
+
```tsx
|
|
100
|
+
import { CONTAINER_KEYS as CQ } from 'basalt-ui/tokens'
|
|
101
|
+
;<SimpleGrid type="container" cols={{ base: 1, [CQ.regular]: 2, [CQ.wide]: 3 }}>
|
|
102
|
+
…
|
|
103
|
+
</SimpleGrid>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
| Delete | Replace with |
|
|
107
|
+
| --------------------------------------------------------------------------------------------- | -------------------------- |
|
|
108
|
+
| ``[`${CONTAINER_CLASSES.regular}px`]`` (or `.wide` / `.compact`) as a key | `[CONTAINER_KEYS.regular]` |
|
|
109
|
+
| a local ``CQ_REGULAR = `${CONTAINER_CLASSES.regular}px` `` const (argo's `container-grid.ts`) | the import above |
|
|
110
|
+
|
|
111
|
+
`Grid type="container"` is unchanged: `breakpoints={CONTAINER_GRID_BREAKPOINTS}` (§ 1.33.0) stays
|
|
112
|
+
its answer, and that map is now built from `CONTAINER_KEYS` — same values.
|
|
113
|
+
|
|
114
|
+
### `useBreakpoint` — removed from `basalt-ui`
|
|
115
|
+
|
|
116
|
+
| Was | Now |
|
|
117
|
+
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
118
|
+
| `useBreakpoint` — removed from `basalt-ui` | shell chrome: `useSizeClass() !== 'compact'` for `'sm'`, `useSizeClass() === 'expanded'` for `'lg'`; a page's own layout swap: a `type="container"` SimpleGrid/Grid or an `@container` rule (§ 1.32.0 `basalt/raw-breakpoint`) |
|
|
119
|
+
| `BreakpointName` — removed from `basalt-ui` | — (no replacement; `SizeClass` is the shell's vocabulary) |
|
|
120
|
+
|
|
121
|
+
On notice since 1.31.0, dated twice (1.31.0 → 1.33.0) and shipped one minor past that date; measured
|
|
122
|
+
fleet usage at removal was zero. The fix was never autofixable (the replacement is a different
|
|
123
|
+
shape), so `basalt/deprecated-export` keeps its row through 1.34.0 only to say the import is gone
|
|
124
|
+
instead of "still resolves".
|
|
125
|
+
|
|
126
|
+
### Guards — `unknown-vx-token` judges basalt's families in full (`warn`, `error` moves to 1.35.0)
|
|
127
|
+
|
|
128
|
+
`var(--vx-surface-2, transparent)` rendered transparent in image-gen since the file was written,
|
|
129
|
+
and 1.33.0 said nothing: it judged only removed names and bare roots, because `groupTokens` could
|
|
130
|
+
emit any name. Now:
|
|
131
|
+
|
|
132
|
+
- **Judged: every unemitted name inside a basalt-owned family** — the leading lowercase run of the
|
|
133
|
+
name: `accent`, `fill`, `ink`, `line`, `radius`, `shadow`, `space`, `status`, `surface`, `text`,
|
|
134
|
+
`tooltip`, … (the full list is in the finding's remedy, generated from what basalt emits). So
|
|
135
|
+
`--vx-surface-2`, `--vx-ink3`, `--vx-space-gutter` and a bare `--vx-space` are all findings.
|
|
136
|
+
- **Not judged: a name in any other family** (argo's `--vx-activity-*`, rb's `--vx-confidence-*`),
|
|
137
|
+
a computed name, and a name the same file declares.
|
|
138
|
+
- **`groupTokens` / `seriesTokens` warn** (once per name) on a ref inside a basalt family —
|
|
139
|
+
`groupTokens('surface', …)`, a series key `ink3` — and **throw from 1.35.0**, when the kind
|
|
140
|
+
promotes. That refusal is what makes the guard's judgement sound. Rename the group
|
|
141
|
+
(`groupTokens('app', …)`), and its `buildPaletteCss` `groups` key with it. Measured: no consumer
|
|
142
|
+
names one. `on` is not judged: the theme emits `--vx-on-<color>` for your own colors too.
|
|
143
|
+
|
|
144
|
+
Widening restarts the grace: `warn` through 1.34.x, `error` at 1.35.0. Measured at ship time:
|
|
145
|
+
argo, rb, image-gen, image-share, email-gateway, linewatch, obsidian, weatherorb all at 0
|
|
146
|
+
(image-gen's one hit was already fixed by hand in r4).
|
|
147
|
+
|
|
148
|
+
### `check-theme` says when the AST lane is not wired
|
|
149
|
+
|
|
150
|
+
When the nearest `.oxlintrc.json` up to the repo root neither extends a shipped preset nor loads
|
|
151
|
+
`configs/oxlint-plugin.js` with `basalt/*` rules on (or the target does not resolve), `check-theme`
|
|
152
|
+
prints one line — `AST lane not enforced — N basalt/* rule ids unguarded (incl. the promoted
|
|
153
|
+
control-outside-home, raw-breakpoint)`. Information only; the exit code is unchanged. `basalt-ui
|
|
154
|
+
doctor` names the fix.
|
|
155
|
+
|
|
156
|
+
### `card-with-border` names its `card-inset` half
|
|
157
|
+
|
|
158
|
+
Dropping `withBorder` and keeping `padding="md"` satisfied `check-theme` and then failed oxlint's
|
|
159
|
+
`basalt/card-inset`. The text-lane remedy now says to fix the inset in the same edit.
|
|
160
|
+
|
|
161
|
+
### `configs/oxlint-basalt.json` — the guard lane without the generic preset
|
|
162
|
+
|
|
163
|
+
Wiring `configs/oxlint.json` into a repo with history turns on the generic jsx-a11y / unicorn /
|
|
164
|
+
import / promise set alongside the `basalt/*` rules, and email-gateway hit unrelated errors before a
|
|
165
|
+
single guard could land. The new guards-only preset is the `basalt/*` plugin rules at their shipped
|
|
166
|
+
levels and nothing else:
|
|
167
|
+
|
|
168
|
+
```json
|
|
169
|
+
{ "extends": ["./node_modules/basalt-ui/configs/oxlint-basalt.json"] }
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Take it first, move to `configs/oxlint.json` when the generic debt is paid. The full preset now
|
|
173
|
+
`extends` the guards-only one, so every `basalt/*` level lives in one file; extending the full one
|
|
174
|
+
behaves exactly as before. `doctor` and `check-theme` accept either.
|
|
175
|
+
|
|
176
|
+
The full preset assumes the shipped `tsconfig.react-app.json` base (`lib: ES2023`): its
|
|
177
|
+
`unicorn/no-array-sort` warning steers to `toSorted()`, which an older `lib` does not type. Extend
|
|
178
|
+
that tsconfig rather than waiving the rule.
|
|
179
|
+
|
|
180
|
+
## 1.33.0 — the 1.33.0 minor
|
|
181
|
+
|
|
182
|
+
### `CONTAINER_GRID_BREAKPOINTS` — the `Grid type="container"` map ships
|
|
183
|
+
|
|
184
|
+
`basalt-ui/tokens` exports the five-key map the 1.32.0 recipe had every consumer hand-write
|
|
185
|
+
(`xs` compact 240px · `sm` regular 480px · `md`/`lg`/`xl` wide 800px), derived from
|
|
186
|
+
`CONTAINER_CLASSES`. `basalt/raw-breakpoint` trusts it by name: before, it read an IMPORTED map as
|
|
187
|
+
unresolvable and flagged every `Grid.Col` span under it, so each route file declared its own
|
|
188
|
+
same-file literal (argo: five identical copies).
|
|
189
|
+
|
|
190
|
+
```tsx
|
|
191
|
+
import { CONTAINER_GRID_BREAKPOINTS } from 'basalt-ui/tokens'
|
|
192
|
+
;<Grid type="container" breakpoints={CONTAINER_GRID_BREAKPOINTS}>
|
|
193
|
+
<Grid.Col span={{ base: 12, md: 4 }}>…</Grid.Col>
|
|
194
|
+
</Grid>
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
| Delete | Replace with |
|
|
198
|
+
| ------------------------------------------------------------------------------------ | -------------------------------------------- |
|
|
199
|
+
| a same-file `const GRID_BREAKPOINTS = { xs: …, sm: …, md: …, lg: …, xl: … }` literal | `breakpoints={CONTAINER_GRID_BREAKPOINTS}` |
|
|
200
|
+
| a shared map you export yourself (flagged when imported) | the shipped one, or keep a same-file literal |
|
|
201
|
+
|
|
202
|
+
The trust is provenance-gated: the import must name `CONTAINER_GRID_BREAKPOINTS` from
|
|
203
|
+
`basalt-ui/tokens` (an alias `{ CONTAINER_GRID_BREAKPOINTS as bp }`, a namespace member
|
|
204
|
+
`tokens.CONTAINER_GRID_BREAKPOINTS` on `import * as tokens`, and a same-file `const bp = …` of
|
|
205
|
+
either all count; a parameter or inner `const` that shadows the name does not). A map of your own
|
|
206
|
+
that deviates from it — a 1200px `xl`, say — stays a same-file literal. `SimpleGrid type="container"` is unchanged: its keys
|
|
207
|
+
are CSS lengths, so ``[`${CONTAINER_CLASSES.regular}px`]`` stays the form (from 1.34.0:
|
|
208
|
+
`[CONTAINER_KEYS.regular]`, § 1.34.0).
|
|
209
|
+
|
|
210
|
+
### State and controls — `resets: ['page']`, `NumberFilter clearable`
|
|
211
|
+
|
|
212
|
+
Additive; nothing to change unless you carry one of the two workarounds below.
|
|
213
|
+
|
|
214
|
+
**`createSearchStore({ …, resets: ['page'] })`** drops the named sibling params — ones the store does
|
|
215
|
+
NOT own — in the same navigate as every URL-lane write that moves a value (setter, `clear()`,
|
|
216
|
+
`useReset()`); a `url: false` field makes no navigate and keeps the page. The route's own `validateSearch` resolves the default (`page` → 1). An explicit
|
|
217
|
+
`set(v, { patch: { page } })` still wins; naming a param the store owns throws at definition.
|
|
218
|
+
Store-wide by design: every filter of a list narrows the same list, sort included.
|
|
219
|
+
|
|
220
|
+
```ts
|
|
221
|
+
// before — an effect per page, which also snapped Back/Forward onto page 1
|
|
222
|
+
useEffect(() => { if (filtersChanged && search.page !== 1) navigate({ search: (p) => ({ ...p, page: 1 }) }) }, [filterKey])
|
|
223
|
+
|
|
224
|
+
// after — the store owns it; Back restores filter AND page, because they were one write
|
|
225
|
+
export const b2Filters = createSearchStore({ key: 'b2-filters', fields: { … }, resets: ['page'] })
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**`NumberFilter clearable`** — parity with `SelectFilter`/`EnumFilter`: a `Clear` in the popover that
|
|
229
|
+
writes the fallback back, in both the `options` and the stepper form. "No filter" is the FALLBACK,
|
|
230
|
+
not a row: with `clearable`, drop an `{ value: 0, label: 'Any …' }` option — the pill reads the
|
|
231
|
+
filter's `label` while no preset matches.
|
|
232
|
+
|
|
233
|
+
### Guards — four ids promote to `error`
|
|
234
|
+
|
|
235
|
+
The last two twin pairs leave grace together, one law per pair and one promotion for both lanes:
|
|
236
|
+
|
|
237
|
+
| Law | oxlint rule (JSX) | `check-theme` kind (text/CSS) | In grace since |
|
|
238
|
+
| --------------------- | ----------------------------- | ----------------------------- | -------------- |
|
|
239
|
+
| C1 — a control's home | `basalt/control-outside-home` | `raw-selection-control` | 1.26.0 |
|
|
240
|
+
| the breakpoint law | `basalt/raw-breakpoint` | `raw-media-query` | 1.31.0 |
|
|
241
|
+
|
|
242
|
+
Measured before flipping, 2026-10-01: all nine consumers on 1.32.1 — argo, rb, image-gen,
|
|
243
|
+
image-share, email-gateway, linewatch, rollhook, obsidian, weatherorb — at 0 for all four ids.
|
|
244
|
+
basalt's own tree and the playground are at 0 too, after two reasoned waivers in the package
|
|
245
|
+
(`legend-disclosure.tsx` clamps a fixed panel with `window.innerWidth`, a position rather than a
|
|
246
|
+
breakpoint; `ArticleGrid`'s `cols` is documented per viewport `lg`, so moving it to container keys
|
|
247
|
+
would re-flow every consumer's grid and ships opt-in instead).
|
|
248
|
+
|
|
249
|
+
If one fires after upgrading, it is code written since the measurement: the remedies are unchanged
|
|
250
|
+
(§ 1.31.0 for C1's homes, § 1.32.0 `basalt/raw-breakpoint` for the container recipe), or a
|
|
251
|
+
`theme-allow <id> — <why>`. `basalt.severity` still turns a kind down per repo; the shipped oxlint
|
|
252
|
+
preset's level can be overridden in your own `.oxlintrc.json`.
|
|
253
|
+
|
|
254
|
+
### `unknown-vx-token` — a removed `--vx-*` name is a finding (`warn`, `error` at 1.34.0)
|
|
255
|
+
|
|
256
|
+
A `var(--vx-*)` naming a token basalt does not emit resolves to its fallback — or to nothing — with
|
|
257
|
+
no error from tsc, oxlint or the browser. obsidian lost its 44px touch floor that way, to
|
|
258
|
+
`var(--vx-space-touch-target)`. `check-theme` now reports it, in every scanned file type. It ships
|
|
259
|
+
`warn` for this minor and promotes at 1.34.0. Measured at ship time: all nine consumers at 0.
|
|
260
|
+
|
|
261
|
+
| Removed name | Replacement |
|
|
262
|
+
| --------------------------------------------- | --------------------------------------------------------- |
|
|
263
|
+
| `--vx-space-touch-target` | `--vx-hit` |
|
|
264
|
+
| `--vx-space-touch-control-height` | `--vx-hit` |
|
|
265
|
+
| `--vx-space-app-header-mobile-actions-height` | `--vx-space-sticky-header-clearance` |
|
|
266
|
+
| `--vx-space-sticky-header-clearance-mobile` | `--vx-space-sticky-header-clearance` |
|
|
267
|
+
| `--vx-space-sidebar-brand-inset-top` | none — the brand row is the header band (§ 1.30.0 Chrome) |
|
|
268
|
+
|
|
269
|
+
- **Judged: a removed name** (the table) **and a bare family root nothing emits** —
|
|
270
|
+
`var(--vx-surface)`, `var(--vx-space)`, `var(--vx-status)`: basalt only writes `<root>-<key>`,
|
|
271
|
+
and so does `groupTokens`. The live set is exactly `basalt-ui/tokens.css` plus three
|
|
272
|
+
component-scoped names (`--vx-hit-gap`, `--vx-space-icon-size`, `--vx-keyboard-inset`).
|
|
273
|
+
- **Not judged: any other unknown name**, even under a basalt prefix. `groupTokens('surface', …)`
|
|
274
|
+
emits `--vx-surface-<key>` from a file a per-file scan cannot see, so `--vx-surface-2` could be
|
|
275
|
+
your group or a typo, and the guard does not guess. Check such a name against
|
|
276
|
+
`basalt-ui/tokens.css` yourself. Your `defineSeries`/`groupTokens` series (argo's `--vx-lp-*`,
|
|
277
|
+
rb's `--vx-confidence-*`), a computed name (`var(--vx-fill-${hue})`) and a name the same file
|
|
278
|
+
declares are never reported.
|
|
279
|
+
|
|
89
280
|
## 1.32.1 — the 1.32.0 recipe resolves, and the gaps consumers hit upgrading to it
|
|
90
281
|
|
|
91
282
|
A patch: no new API beyond restoring what 1.31.0/1.32.0 already documented. Eight consumers
|
|
@@ -109,8 +300,10 @@ const-resolved prop value (`span={wide ? { base: 12, md: 4 } : 12}` used to slip
|
|
|
109
300
|
warnings.)
|
|
110
301
|
|
|
111
302
|
**After any guard narrows, audit your waivers:** `basalt-ui check-theme --audit-allows` lists every
|
|
112
|
-
`theme-allow` and whether it still suppresses anything. Dead ones (rb carried
|
|
113
|
-
`in-body-page-title`, linewatch one `bound-control-outside-home`) go.
|
|
303
|
+
`theme-allow` and whether it still suppresses anything. Dead ones (rb carried three
|
|
304
|
+
`in-body-page-title`, linewatch one `bound-control-outside-home`) go. Before 1.33.0 the audit also
|
|
305
|
+
called an `in-body-page-title` waiver dead when only the oxlint lane still needed it — if deleting
|
|
306
|
+
one makes `oxlint` fail, restore it.
|
|
114
307
|
|
|
115
308
|
**Scope — the breakpoint law is Mantine/CSS-scoped.** `raw-breakpoint` is an oxlint rule over JSX
|
|
116
309
|
and `raw-media-query` a `check-theme` kind over `.css`. A tokens-only (Tailwind) consumer has only
|
|
@@ -147,12 +340,12 @@ swap to a list inside a `min-width` query. `BasaltDataTable` needs the optional
|
|
|
147
340
|
**Layouts that need a step above `wide` (800px).** There is no fifth class; one ships when two named
|
|
148
341
|
consumers need the same width. Until then, verified against the 1.32.0 plugin:
|
|
149
342
|
|
|
150
|
-
| Where | Off-class width (e.g. `1200px`)
|
|
151
|
-
| ------------------------------------------------------------------------ |
|
|
152
|
-
| `SimpleGrid type="container"` px key — `cols={{ base: 1, '1200px': 5 }}` | passes: `raw-breakpoint` does not judge px keys, only theme names (`sm`)
|
|
153
|
-
| `Grid type="container"` `breakpoints` map value — `xl: '1200px'` | passes: the map's values are not judged
|
|
154
|
-
| `@container basalt-card` or unnamed, in CSS | flagged — `theme-allow raw-media-query — <why this layout needs 1200px>`
|
|
155
|
-
| `@container <your-own-name>` or `basalt-grid`, in CSS | passes
|
|
343
|
+
| Where | Off-class width (e.g. `1200px`) |
|
|
344
|
+
| ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
345
|
+
| `SimpleGrid type="container"` px key — `cols={{ base: 1, '1200px': 5 }}` | passes: `raw-breakpoint` does not judge px keys, only theme names (`sm`) |
|
|
346
|
+
| `Grid type="container"` `breakpoints` map value — `xl: '1200px'` | passes: the map's values are not judged |
|
|
347
|
+
| `@container basalt-card` or unnamed, in CSS | flagged — `theme-allow raw-media-query — <why this layout needs 1200px>` |
|
|
348
|
+
| `@container <your-own-name>` or `basalt-grid`, in CSS | passes — the name is unjudged, so write no waiver (`--audit-allows` reports one dead); a minor that starts judging `basalt-grid` will say so here |
|
|
156
349
|
|
|
157
350
|
Either way, write the reason next to the width: it is the evidence the fifth class is waiting on.
|
|
158
351
|
|
|
@@ -246,11 +439,11 @@ source, which is what the rule's exemption is built on:
|
|
|
246
439
|
<Grid><Grid.Col span={{ base: 12, lg: 4 }}>…</Grid.Col></Grid>
|
|
247
440
|
|
|
248
441
|
// after — the grid's own width
|
|
249
|
-
import {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
<Grid type="container" breakpoints={
|
|
442
|
+
import { CONTAINER_KEYS as CQ, CONTAINER_GRID_BREAKPOINTS } from 'basalt-ui/tokens'
|
|
443
|
+
// CONTAINER_KEYS ships from 1.34.0; before it, [`${CONTAINER_CLASSES.regular}px`]
|
|
444
|
+
<SimpleGrid type="container" cols={{ base: 1, [CQ.regular]: 3 }}>…</SimpleGrid>
|
|
445
|
+
// the shipped map (§ 1.33.0); on 1.32.x, a same-file literal of the same five keys
|
|
446
|
+
<Grid type="container" breakpoints={CONTAINER_GRID_BREAKPOINTS}>
|
|
254
447
|
<Grid.Col span={{ base: 12, md: 4 }}>…</Grid.Col>
|
|
255
448
|
</Grid>
|
|
256
449
|
```
|
package/README.md
CHANGED
|
@@ -872,6 +872,9 @@ The `./configs/*` export gives consumer apps raw presets to `extends` or copy vi
|
|
|
872
872
|
{ "extends": ["./node_modules/basalt-ui/configs/oxlint.json"] }
|
|
873
873
|
```
|
|
874
874
|
|
|
875
|
+
`configs/oxlint-basalt.json` is the guard lane alone — the `basalt/*` rules, none of the generic
|
|
876
|
+
jsx-a11y / unicorn / import set — for a repo with history to take first; `oxlint.json` extends it.
|
|
877
|
+
|
|
875
878
|
`tsconfig.json` `extends` resolves the SAME way, through package exports (`bundler`
|
|
876
879
|
`moduleResolution`, CI-verified by `scripts/pack-test.sh`) — three raw presets, `base` (the shared
|
|
877
880
|
strict flags), `react-app` (`base` + DOM/JSX libs) and `node` (`base` + Node types):
|
|
@@ -76,8 +76,8 @@ export const analytics = createSearchStore({
|
|
|
76
76
|
hand-count either.
|
|
77
77
|
- **A reset UNSETS.** `useReset()`/`field.clear()` DELETE the persisted key, never write
|
|
78
78
|
`fallback` (which would pin a thunk fallback as a value nobody chose).
|
|
79
|
-
- **`set(next, { patch })`** merges
|
|
80
|
-
|
|
79
|
+
- **`set(next, { patch })`** merges params the store does NOT own into the same navigate; store-level
|
|
80
|
+
`resets: ['page']` does it on every URL-lane write (never a `useEffect`: it snaps Back/Forward).
|
|
81
81
|
|
|
82
82
|
## Nav links carry the store BY REFERENCE
|
|
83
83
|
|
|
@@ -9,7 +9,7 @@ paths:
|
|
|
9
9
|
|
|
10
10
|
<!-- basalt:coverage -->
|
|
11
11
|
<!-- GENERATED from src/surfaces.ts — `bun scripts/check-coverage.ts --write`. Do not hand-edit. -->
|
|
12
|
-
<!-- backed by: guard kinds — css-raw-surface, inline-font-size, off-identity-accent, off-system-surface-var, raw-color-fn, raw-font-family, raw-hex, raw-radius, raw-surface, surface-shadow-override, theme-allow-unscoped · oxlint rules — basalt/no-raw-font-size, basalt/raw-size-literal, basalt/token-layer-boundary -->
|
|
12
|
+
<!-- backed by: guard kinds — css-raw-surface, inline-font-size, off-identity-accent, off-system-surface-var, raw-color-fn, raw-font-family, raw-hex, raw-radius, raw-surface, surface-shadow-override, theme-allow-unscoped, unknown-vx-token · oxlint rules — basalt/no-raw-font-size, basalt/raw-size-literal, basalt/token-layer-boundary -->
|
|
13
13
|
<!-- not guarded: — -->
|
|
14
14
|
<!-- /basalt:coverage -->
|
|
15
15
|
|
|
@@ -27,9 +27,11 @@ once and yours forever. Claude Code cannot load rules or skills out of `node_mod
|
|
|
27
27
|
only reason anything is copied at all; everything a MACHINE reads is an `extends` reference into
|
|
28
28
|
`node_modules/basalt-ui/configs/`, so the toolchain auto-updates with the package.
|
|
29
29
|
|
|
30
|
-
**`init` on an existing app is a lint-debt event, not a no-op** —
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
**`init` on an existing app is a lint-debt event, not a no-op** — `.claude/rules/basalt-batteries.md`
|
|
31
|
+
§ "App bootstrapping" says what it turns on. Too much at once? Extend `configs/oxlint-basalt.json`
|
|
32
|
+
(the basalt/\* guards alone, no generic jsx-a11y/unicorn set) first, `configs/oxlint.json` later —
|
|
33
|
+
the full one pairs with the shipped `tsconfig.react-app.json` (ES2023 lib: `unicorn/no-array-sort`
|
|
34
|
+
steers to `toSorted()`).
|
|
33
35
|
|
|
34
36
|
## 2. Wire the runtime (the CLI scaffolds files, not your app's composition)
|
|
35
37
|
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"jsPlugins": ["./oxlint-plugin.js"],
|
|
3
|
+
"rules": {
|
|
4
|
+
"basalt/no-raw-font-size": "error",
|
|
5
|
+
"basalt/raw-size-literal": "error",
|
|
6
|
+
"basalt/card-inset": "error",
|
|
7
|
+
"basalt/chart-in-raw-surface": "error",
|
|
8
|
+
"basalt/hand-rolled-plot": "error",
|
|
9
|
+
"basalt/chart-legend-literal": "error",
|
|
10
|
+
"basalt/shadow-basalt-export": "warn",
|
|
11
|
+
"basalt/hand-rolled-shell": "error",
|
|
12
|
+
"basalt/raw-scroll-container": "error",
|
|
13
|
+
"basalt/hand-rolled-filter": "error",
|
|
14
|
+
"basalt/control-outside-home": "error",
|
|
15
|
+
"basalt/bound-control-outside-home": "error",
|
|
16
|
+
"basalt/control-size-literal": "error",
|
|
17
|
+
"basalt/page-bar-budget": "error",
|
|
18
|
+
"basalt/in-body-page-title": "error",
|
|
19
|
+
"basalt/responsive-twin": "error",
|
|
20
|
+
"basalt/search-literal-link": "error",
|
|
21
|
+
"basalt/use-search-from-literal": "error",
|
|
22
|
+
"basalt/provider-above-router": "error",
|
|
23
|
+
"basalt/query-fn-unwrap": "error",
|
|
24
|
+
"basalt/deprecated-export": "warn",
|
|
25
|
+
"basalt/forms-field-key": "error",
|
|
26
|
+
"basalt/visx-boundary": "error",
|
|
27
|
+
"basalt/visx-tooltip": "error",
|
|
28
|
+
"basalt/agent-resume-guard": "error",
|
|
29
|
+
"basalt/agent-no-raw-usechat": "error",
|
|
30
|
+
"basalt/ai-sdk-major": "error",
|
|
31
|
+
"basalt/raw-breakpoint": "error"
|
|
32
|
+
}
|
|
33
|
+
}
|