basalt-ui 1.38.0 → 1.39.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 +15 -0
- package/MIGRATING.md +50 -12
- package/configs/oxlint-plugin.js +6 -0
- package/configs/oxlint-plugin.test.ts +2 -1
- package/dist/forms/index.d.ts +3 -36
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/index.js +0 -16
- package/dist/shell/app-brand.module.css +14 -9
- package/dist/shell/app-header.module.css +4 -1
- package/dist/shell/app-main.module.css +13 -7
- package/dist/shell/index.d.ts +11 -0
- package/dist/shell/index.d.ts.map +1 -1
- package/dist/shell/index.js +2 -1
- package/dist/surfaces.d.ts +1 -1
- package/dist/surfaces.js +1 -1
- package/dist/tokens/palette.d.ts +9 -7
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +9 -7
- package/dist/tokens.css +1 -1
- package/llms.txt +3 -3
- package/package.json +1 -1
- package/src/forms/index.ts +3 -44
- package/src/shell/app-brand.module.css +14 -9
- package/src/shell/app-header.module.css +4 -1
- package/src/shell/app-main.module.css +13 -7
- package/src/shell/index.tsx +13 -1
- package/src/surfaces.ts +1 -1
- package/src/tokens/palette.ts +9 -7
package/AGENTS.md
CHANGED
|
@@ -15,7 +15,7 @@ Toolchain: Bun runtime, oxlint + oxfmt, conventional commits (empty scope), `mas
|
|
|
15
15
|
| `basalt-ui/vite` | build-tooling | basaltViteConfig(opts) — Vite preset for basalt-ui consumer apps; basaltAppPlugin(opts) — PWA head, manifest, and icon metadata derived from the token palette |
|
|
16
16
|
| `basalt-ui/guard` | headless | checkSource, GUARD_RULES, Finding types — the headless theme-guard core |
|
|
17
17
|
| `basalt-ui/router-tanstack` | headless | TanStack Router bridge: defineNav/navGroup/navTarget (one typed nav definition) + useNav (sections + mobileNav, spread onto BasaltShell) + useBasaltNav (active route) + useRouterBreadcrumbs + createSearchStore (typed URL > localStorage > fallback store over field.enum/multi/range/number/boolean/string; the deprecated createSearchParamStore/createMultiSearchParamStore wrappers were removed in 1.29.0, C1 consolidation) |
|
|
18
|
-
| `basalt-ui/forms` | mantine-coupled | Mantine form layer: useBasaltForm + inputProps/fieldKey (two calls — a spread `key` is a React 19 warning; the deprecated `field` alias for `inputProps` was removed in 1.29.0, C1 consolidation), useFormSubmit (submit state, decoded errors, server fieldErrors, focus-first-error, validateAsync), FormStateProvider disable propagation, useFieldArray, FormErrorSummary, useFormDraft with autosave (Standard Schema). The FormSection/FormRow/FormGroup/FormActions layout
|
|
18
|
+
| `basalt-ui/forms` | mantine-coupled | Mantine form layer: useBasaltForm + inputProps/fieldKey (two calls — a spread `key` is a React 19 warning; the deprecated `field` alias for `inputProps` was removed in 1.29.0, C1 consolidation), useFormSubmit (submit state, decoded errors, server fieldErrors, focus-first-error, validateAsync), FormStateProvider disable propagation, useFieldArray, FormErrorSummary, useFormDraft with autosave (Standard Schema). The FormSection/FormRow/FormGroup/FormActions layout lives in ./controls (moved in 1.36.0) and useForm/schemaResolver come from @mantine/form; the six re-exports here were removed in 1.39.0 |
|
|
19
19
|
| `basalt-ui/notifications` | mantine-coupled | Mantine notifications: notify helpers, typed registry, persisted history, NotificationBell, NotificationCenter |
|
|
20
20
|
| `basalt-ui/commands` | mantine-coupled | typed command bus + overlay controller, toSpotlightActions, ShortcutsHelp, BasaltOverlays |
|
|
21
21
|
| `basalt-ui/data/table` | mantine-coupled | BasaltDataTable: a sortable data table over TanStack Table, rendered with Mantine (Mantine-rendered) |
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
# [1.39.0](https://github.com/jkrumm/basalt-ui/compare/v1.38.1...v1.39.0) (2026-10-04)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* add BasaltShell headerHeight for a deliberate, consumer-set header row ([3561361](https://github.com/jkrumm/basalt-ui/commit/3561361279664d3ee51d245586331e057dd62844))
|
|
7
|
+
* remove the deprecated forms layout and useForm re-exports ([9e8b8c6](https://github.com/jkrumm/basalt-ui/commit/9e8b8c69241ea33d8bdf47532358166a809eb4ce))
|
|
8
|
+
|
|
9
|
+
## [1.38.1](https://github.com/jkrumm/basalt-ui/compare/v1.38.0...v1.38.1) (2026-10-04)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* take the page content inset one step down, 20/12 to 16/8 from sm up ([cf61c05](https://github.com/jkrumm/basalt-ui/commit/cf61c05410df114d5c6182ed4a8c5ed38b308a56))
|
|
15
|
+
|
|
1
16
|
# [1.38.0](https://github.com/jkrumm/basalt-ui/compare/v1.37.1...v1.38.0) (2026-10-04)
|
|
2
17
|
|
|
3
18
|
|
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 | 1.33.0 | 1.34.0 | 1.34.1 | 1.35.0 | 1.36.0 | 1.36.1 | 1.37.0 | 1.37.1 | 1.38.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) | — | — | `useCoarsePointer()` (§ `useCoarsePointer()`) | — | — | — | — | — |
|
|
74
|
-
| **controls** (`./controls`) | `NumberFilter`, `field.number` (§ Controls) | sheet renders panel rows; `PanelRow`, `SliderControl` (§ `basalt-ui/controls`) | — | — | — | — | — | — | — | `NumberFilter clearable`; `createSearchStore` `resets` (§ State and controls) | — | — | — | `FormSection`/`FormRow`/`FormGroup`/`FormActions` move here (§ The form layout moves) | — | — | — | — | — |
|
|
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) | — | — | — | — | the layout + `useForm`/`schemaResolver` deprecated, removed 1.37.0 (§ The form layout moves) | — | — | — | — | — |
|
|
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) | — | — | — | `unknown-vx-token` → `error`; the token factories throw (§ Guards) | — | — | — | — | — |
|
|
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 | 1.34.1 | 1.35.0 | 1.36.0 | 1.36.1 | 1.37.0 | 1.37.1 | 1.38.0 | 1.38.1 | 1.39.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) | — | — | — | — | — | — | — | | `appShellInset` 20 → 16 (§ 1.38.1) | — | — |
|
|
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) | — | — | `useCoarsePointer()` (§ `useCoarsePointer()`) | — | — | — | — | | content gutter 16, block 8 from `sm` (§ 1.38.1) | — | — |
|
|
74
|
+
| **controls** (`./controls`) | `NumberFilter`, `field.number` (§ Controls) | sheet renders panel rows; `PanelRow`, `SliderControl` (§ `basalt-ui/controls`) | — | — | — | — | — | — | — | `NumberFilter clearable`; `createSearchStore` `resets` (§ State and controls) | — | — | — | `FormSection`/`FormRow`/`FormGroup`/`FormActions` move here (§ The form layout moves) | — | — | — | — | — | — | — |
|
|
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) | — | — | — | — | the layout + `useForm`/`schemaResolver` deprecated, removed 1.37.0 (§ The form layout moves) | — | — | — | — | — | — | — |
|
|
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) | — | — | — | `unknown-vx-token` → `error`; the token factories throw (§ Guards) | — | — | — | — | — | — | — |
|
|
81
81
|
|
|
82
82
|
---
|
|
83
83
|
|
|
@@ -86,6 +86,44 @@ 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.39.0 — the forms aliases leave
|
|
90
|
+
|
|
91
|
+
**Added: `BasaltShell headerHeight?: number`** (px, default unchanged — the density-tracking
|
|
92
|
+
`appShellHeaderHeight`, 44). One value for both sidebar forms and every width; the navbar and aside
|
|
93
|
+
tops, the page-bar band and Main follow it. A native unified-toolbar title bar sets ~52.
|
|
94
|
+
|
|
95
|
+
**Removed (grace ended — deprecated in 1.36.0, re-dated twice):** the six `basalt-ui/forms`
|
|
96
|
+
re-exports below. No autofix: move the import by hand.
|
|
97
|
+
|
|
98
|
+
| Was (`basalt-ui/forms`) | Now |
|
|
99
|
+
| ------------------------------------------------------------------------------------- | ---------------------------------------- |
|
|
100
|
+
| `FormSection`, `FormRow`, `FormGroup`, `FormActions` (+ their `*Props`/`*Slot` types) | the same names from `basalt-ui/controls` |
|
|
101
|
+
| `useForm`, `schemaResolver`, `UseFormReturnType`, `UseFormInput` | `@mantine/form` directly |
|
|
102
|
+
|
|
103
|
+
`basalt/deprecated-export` keeps the rows as `removed: true`, so an old import still gets a finding
|
|
104
|
+
that names the new home. `useBasaltForm`, `inputProps`, `fieldKey`, `useFormSubmit`,
|
|
105
|
+
`FormStateProvider`, `useFieldArray`, `FormErrorSummary` and `useFormDraft` are unchanged.
|
|
106
|
+
The `public symbols` budget is back to 400.
|
|
107
|
+
|
|
108
|
+
## 1.38.1 — the content inset
|
|
109
|
+
|
|
110
|
+
No export changed. Two default numbers moved, both from `sm` up (the phone gutter is untouched):
|
|
111
|
+
|
|
112
|
+
| Measured, 1440px desktop | Before | After |
|
|
113
|
+
| --------------------------------------------------------- | -------- | -------- |
|
|
114
|
+
| Main's inner box, from the sidebar seam (`appShellInset`) | 20px | 16px |
|
|
115
|
+
| Main's inner box, under the header / page-bar band | 12px | 8px |
|
|
116
|
+
| Header breadcrumb x, expanded / rail | 269 / 61 | 272 / 64 |
|
|
117
|
+
| Brand mark x (the sidebar's nav-icon column) | 20px | 20px |
|
|
118
|
+
|
|
119
|
+
The block inset is `stack-sm` from `sm` up and stays `stack-md` (12) on a phone. The breadcrumb
|
|
120
|
+
now sits exactly on Main's content edge (it was 7px short of it); the brand mark no longer borrows
|
|
121
|
+
the page gutter for its x — it is the nav-icon column (`row-inset-x` twice) on its own, so it stays
|
|
122
|
+
at 20 while the gutter is 16.
|
|
123
|
+
|
|
124
|
+
A consumer that wants the old numbers has no knob for them: the gutter
|
|
125
|
+
is a `SPACE_STEP` entry, so retune it through the density level or accept the new default.
|
|
126
|
+
|
|
89
127
|
## 1.38.0
|
|
90
128
|
|
|
91
129
|
_Nothing to migrate in this release._
|
package/configs/oxlint-plugin.js
CHANGED
|
@@ -3672,6 +3672,7 @@ export const DEPRECATED_EXPORTS = [
|
|
|
3672
3672
|
name: 'FormSection',
|
|
3673
3673
|
replacement: "FormSection from 'basalt-ui/controls'",
|
|
3674
3674
|
removeIn: '1.39.0',
|
|
3675
|
+
removed: true,
|
|
3675
3676
|
fix: false,
|
|
3676
3677
|
},
|
|
3677
3678
|
{
|
|
@@ -3679,6 +3680,7 @@ export const DEPRECATED_EXPORTS = [
|
|
|
3679
3680
|
name: 'FormRow',
|
|
3680
3681
|
replacement: "FormRow from 'basalt-ui/controls'",
|
|
3681
3682
|
removeIn: '1.39.0',
|
|
3683
|
+
removed: true,
|
|
3682
3684
|
fix: false,
|
|
3683
3685
|
},
|
|
3684
3686
|
{
|
|
@@ -3686,6 +3688,7 @@ export const DEPRECATED_EXPORTS = [
|
|
|
3686
3688
|
name: 'FormGroup',
|
|
3687
3689
|
replacement: "FormGroup from 'basalt-ui/controls'",
|
|
3688
3690
|
removeIn: '1.39.0',
|
|
3691
|
+
removed: true,
|
|
3689
3692
|
fix: false,
|
|
3690
3693
|
},
|
|
3691
3694
|
{
|
|
@@ -3693,6 +3696,7 @@ export const DEPRECATED_EXPORTS = [
|
|
|
3693
3696
|
name: 'FormActions',
|
|
3694
3697
|
replacement: "FormActions from 'basalt-ui/controls'",
|
|
3695
3698
|
removeIn: '1.39.0',
|
|
3699
|
+
removed: true,
|
|
3696
3700
|
fix: false,
|
|
3697
3701
|
},
|
|
3698
3702
|
{
|
|
@@ -3700,6 +3704,7 @@ export const DEPRECATED_EXPORTS = [
|
|
|
3700
3704
|
name: 'useForm',
|
|
3701
3705
|
replacement: "useForm from '@mantine/form'",
|
|
3702
3706
|
removeIn: '1.39.0',
|
|
3707
|
+
removed: true,
|
|
3703
3708
|
fix: false,
|
|
3704
3709
|
},
|
|
3705
3710
|
{
|
|
@@ -3707,6 +3712,7 @@ export const DEPRECATED_EXPORTS = [
|
|
|
3707
3712
|
name: 'schemaResolver',
|
|
3708
3713
|
replacement: "schemaResolver from '@mantine/form'",
|
|
3709
3714
|
removeIn: '1.39.0',
|
|
3715
|
+
removed: true,
|
|
3710
3716
|
fix: false,
|
|
3711
3717
|
},
|
|
3712
3718
|
{
|
|
@@ -3393,7 +3393,7 @@ describe('basalt/deprecated-export — the form layout move', () => {
|
|
|
3393
3393
|
)
|
|
3394
3394
|
expect(rules).toContain('deprecated-export')
|
|
3395
3395
|
expect(output).toContain(`'basalt-ui/controls'`)
|
|
3396
|
-
expect(output).toContain('removed in 1.39.0')
|
|
3396
|
+
expect(output).toContain('was removed in 1.39.0')
|
|
3397
3397
|
},
|
|
3398
3398
|
)
|
|
3399
3399
|
|
|
@@ -3403,6 +3403,7 @@ describe('basalt/deprecated-export — the form layout move', () => {
|
|
|
3403
3403
|
)
|
|
3404
3404
|
expect(rules).toContain('deprecated-export')
|
|
3405
3405
|
expect(output).toContain(`'@mantine/form'`)
|
|
3406
|
+
expect(output).toContain('was removed in 1.39.0')
|
|
3406
3407
|
})
|
|
3407
3408
|
|
|
3408
3409
|
it('does NOT report FormRow imported from basalt-ui/controls', () => {
|
package/dist/forms/index.d.ts
CHANGED
|
@@ -8,38 +8,15 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Four pieces: the form (`useBasaltForm` + `inputProps`/`fieldKey`), the submit lifecycle
|
|
10
10
|
* (`useFormSubmit` + `FormStateProvider`), the list field (`useFieldArray`) and the draft
|
|
11
|
-
* (`useFormDraft`). The layout (`FormSection` / `FormRow` / `FormGroup` / `FormActions`)
|
|
12
|
-
* `basalt-ui/controls`
|
|
13
|
-
*
|
|
14
|
-
* `@mantine/form`).
|
|
11
|
+
* (`useFormDraft`). The layout (`FormSection` / `FormRow` / `FormGroup` / `FormActions`) lives in
|
|
12
|
+
* `basalt-ui/controls` (it needs no `@mantine/form`); `useForm`/`schemaResolver` come from
|
|
13
|
+
* `@mantine/form` directly. Both stopped being re-exported here in 1.39.0.
|
|
15
14
|
*
|
|
16
15
|
* Optional peer: @mantine/form ^9.3.0 — install with: bun add @mantine/form
|
|
17
16
|
*/
|
|
18
17
|
export { useBasaltForm } from './create-form.js';
|
|
19
18
|
export type { UseBasaltFormOptions } from './create-form.js';
|
|
20
19
|
export { inputProps, fieldKey } from './field.js';
|
|
21
|
-
export {
|
|
22
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
23
|
-
FormSection,
|
|
24
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
25
|
-
FormRow,
|
|
26
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
27
|
-
FormGroup,
|
|
28
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
29
|
-
FormActions, } from '../controls/form-layout.js';
|
|
30
|
-
export type {
|
|
31
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
32
|
-
FormSectionProps,
|
|
33
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
34
|
-
FormSectionSlot,
|
|
35
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
36
|
-
FormRowProps,
|
|
37
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
38
|
-
FormRowSlot,
|
|
39
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
40
|
-
FormGroupProps,
|
|
41
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
42
|
-
FormActionsProps, } from '../controls/form-layout.js';
|
|
43
20
|
export { useFormSubmit, isFieldErrorEnvelope } from './use-form-submit.js';
|
|
44
21
|
export type { FormFieldErrors, UseFormSubmitOptions, UseFormSubmitReturn } from './use-form-submit.js';
|
|
45
22
|
export { FormStateProvider, useFormState } from './form-state.js';
|
|
@@ -50,14 +27,4 @@ export { FormErrorSummary } from './FormErrorSummary.js';
|
|
|
50
27
|
export type { FormErrorSummaryProps } from './FormErrorSummary.js';
|
|
51
28
|
export { useFormDraft, DEFAULT_AUTOSAVE_DEBOUNCE_MS } from './use-form-draft.js';
|
|
52
29
|
export type { UseFormDraftOptions, UseFormDraftReturn } from './use-form-draft.js';
|
|
53
|
-
export {
|
|
54
|
-
/** @deprecated Import from '@mantine/form' — removed in 1.39.0. */
|
|
55
|
-
useForm,
|
|
56
|
-
/** @deprecated Import from '@mantine/form' — removed in 1.39.0. */
|
|
57
|
-
schemaResolver, } from '@mantine/form';
|
|
58
|
-
export type {
|
|
59
|
-
/** @deprecated Import from '@mantine/form' — removed in 1.39.0. */
|
|
60
|
-
UseFormReturnType,
|
|
61
|
-
/** @deprecated Import from '@mantine/form' — removed in 1.39.0. */
|
|
62
|
-
UseFormInput, } from '@mantine/form';
|
|
63
30
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/forms/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/forms/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAIzD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAG9C,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACvE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACnG,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC9D,YAAY,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAGrE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAG5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAG/D,OAAO,EAAE,YAAY,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAA;AAC7E,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA"}
|
package/dist/forms/index.js
CHANGED
|
@@ -1,35 +1,19 @@
|
|
|
1
1
|
import { useBasaltForm } from "./create-form.js";
|
|
2
2
|
import { inputProps, fieldKey } from "./field.js";
|
|
3
|
-
import {
|
|
4
|
-
FormSection,
|
|
5
|
-
FormRow,
|
|
6
|
-
FormGroup,
|
|
7
|
-
FormActions
|
|
8
|
-
} from "../controls/form-layout.js";
|
|
9
3
|
import { useFormSubmit, isFieldErrorEnvelope } from "./use-form-submit.js";
|
|
10
4
|
import { FormStateProvider, useFormState } from "./form-state.js";
|
|
11
5
|
import { useFieldArray } from "./use-field-array.js";
|
|
12
6
|
import { FormErrorSummary } from "./FormErrorSummary.js";
|
|
13
7
|
import { useFormDraft, DEFAULT_AUTOSAVE_DEBOUNCE_MS } from "./use-form-draft.js";
|
|
14
|
-
import {
|
|
15
|
-
useForm,
|
|
16
|
-
schemaResolver
|
|
17
|
-
} from "@mantine/form";
|
|
18
8
|
export {
|
|
19
9
|
DEFAULT_AUTOSAVE_DEBOUNCE_MS,
|
|
20
|
-
FormActions,
|
|
21
10
|
FormErrorSummary,
|
|
22
|
-
FormGroup,
|
|
23
|
-
FormRow,
|
|
24
|
-
FormSection,
|
|
25
11
|
FormStateProvider,
|
|
26
12
|
fieldKey,
|
|
27
13
|
inputProps,
|
|
28
14
|
isFieldErrorEnvelope,
|
|
29
|
-
schemaResolver,
|
|
30
15
|
useBasaltForm,
|
|
31
16
|
useFieldArray,
|
|
32
|
-
useForm,
|
|
33
17
|
useFormDraft,
|
|
34
18
|
useFormState,
|
|
35
19
|
useFormSubmit
|
|
@@ -8,13 +8,15 @@
|
|
|
8
8
|
*
|
|
9
9
|
* The zone's WIDTH is `--app-shell-navbar-offset`, so it tracks the rail collapse with no React
|
|
10
10
|
* state and lands its trailing edge exactly on the sidebar|main seam. The negative
|
|
11
|
-
* `margin-inline-start` cancels `AppShell.Header`'s own `px` inset
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* `
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
11
|
+
* `margin-inline-start` cancels `AppShell.Header`'s own `px` inset (the page gutter,
|
|
12
|
+
* `--app-shell-padding`) so the zone starts at the viewport edge, and the zone's OWN inline padding
|
|
13
|
+
* is the sidebar's nav-icon column — 10px of `.root` frame inset plus 10px of NavLink inset, i.e.
|
|
14
|
+
* `row-inset-x` twice — which is what puts the brand lead on the same x as the nav ICON column below
|
|
15
|
+
* it. That padding used to BE the page gutter (`--app-shell-padding`, 20, the same number by
|
|
16
|
+
* coincidence); the gutter is 16 now, and the two are different claims, so each is stated on its
|
|
17
|
+
* own. The breadcrumb lands on Main's content edge: the zone's trailing margin is the gutter minus
|
|
18
|
+
* the header row's flex gap (`app-header.module.css`'s `--basalt-header-gap`), so zone end + margin
|
|
19
|
+
* + gap = seam + gutter.
|
|
18
20
|
*
|
|
19
21
|
* `--basalt-shell-lead-inset` (default 0px, set by the consumer on `:root`) is the opt-in native
|
|
20
22
|
* title-bar contract: a macOS overlay title bar paints its traffic lights ON TOP of this zone, so a
|
|
@@ -30,6 +32,8 @@
|
|
|
30
32
|
* `--ai-size-md` (1.75rem). Mantine defines that var on the ActionIcon, not on `:root`, so the
|
|
31
33
|
* zone restates the same arithmetic; `app-brand.module.css.test.ts` pins the two together. */
|
|
32
34
|
--basalt-shell-toggle-size: calc(1.75rem * var(--mantine-scale, 1));
|
|
35
|
+
/* The sidebar's nav-icon column: `.root` inset + NavLink inset, both `row-inset-x`. */
|
|
36
|
+
--basalt-nav-icon-x: calc(2 * var(--vx-space-row-inset-x));
|
|
33
37
|
--basalt-shell-zone-width: max(
|
|
34
38
|
var(--app-shell-navbar-offset, 0rem),
|
|
35
39
|
calc(var(--basalt-shell-lead-inset, 0px) + var(--basalt-shell-toggle-size))
|
|
@@ -43,8 +47,9 @@
|
|
|
43
47
|
* like, and the rail's centred toggle centres against the whole row. */
|
|
44
48
|
align-self: stretch;
|
|
45
49
|
margin-inline-start: calc(-1 * var(--app-shell-padding, 0px));
|
|
46
|
-
|
|
47
|
-
padding-inline
|
|
50
|
+
margin-inline-end: calc(var(--app-shell-padding, 0px) - var(--basalt-header-gap, 0px));
|
|
51
|
+
padding-inline: var(--basalt-nav-icon-x);
|
|
52
|
+
padding-inline-start: calc(var(--basalt-nav-icon-x) + var(--basalt-shell-lead-inset, 0px));
|
|
48
53
|
overflow: hidden;
|
|
49
54
|
/* Mantine's own AppShell timing, so the zone and the navbar under it move as one box. */
|
|
50
55
|
transition-property: flex-basis, width;
|
|
@@ -17,9 +17,12 @@
|
|
|
17
17
|
* `alt` — never a border in this module.
|
|
18
18
|
*/
|
|
19
19
|
.bar {
|
|
20
|
+
/* Named so the leading zone (`app-brand.module.css`) can offset its trailing margin by exactly
|
|
21
|
+
* this gap and land the breadcrumb on Main's content edge. */
|
|
22
|
+
--basalt-header-gap: var(--mantine-spacing-sm);
|
|
20
23
|
display: flex;
|
|
21
24
|
align-items: center;
|
|
22
|
-
gap: var(--
|
|
25
|
+
gap: var(--basalt-header-gap);
|
|
23
26
|
width: 100%;
|
|
24
27
|
height: 100%;
|
|
25
28
|
}
|
|
@@ -97,13 +97,13 @@
|
|
|
97
97
|
* value rather than an offset, because Mantine owns the responsive switch (`shell/index.tsx`
|
|
98
98
|
* hands `AppShell` the `appShellInset`/`appShellInsetMobile` pair) and the header, the band and
|
|
99
99
|
* Main all have to land on the SAME number — re-deriving it here would fork it. It is an
|
|
100
|
-
* ALIGNMENT constraint:
|
|
101
|
-
*
|
|
100
|
+
* ALIGNMENT constraint: the header's breadcrumb and globals land on the same edges as the
|
|
101
|
+
* content (`app-brand.module.css` states the arithmetic).
|
|
102
102
|
*
|
|
103
|
-
* Block is
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
103
|
+
* Block is breathing room under the band's single `--vx-divider` line — nothing aligns to it.
|
|
104
|
+
* `stack-md` (12) on a phone, one rung down (`stack-sm`, 8) from `sm` up where the inline gutter
|
|
105
|
+
* is 16: the page then sits 16 from the seam and 8 under the header, rather than the 20/12 it
|
|
106
|
+
* used to.
|
|
107
107
|
*/
|
|
108
108
|
padding: var(--vx-space-stack-md) var(--app-shell-padding);
|
|
109
109
|
/* Without this a wide flex/grid child (a bare table, a nowrap control row) sizes Main to ITSELF. */
|
|
@@ -122,11 +122,17 @@
|
|
|
122
122
|
transition-property: margin;
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
+
@media (min-width: 52.5em) {
|
|
126
|
+
.main {
|
|
127
|
+
padding-block: var(--vx-space-stack-sm);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
125
131
|
/* Installed PWA (C5 consolidation, seeded from argo's `styles/native.css`): clear the landscape
|
|
126
132
|
* notch on the side Main touches. `max()` is a FLOOR over the INLINE value of `.main`'s `padding`
|
|
127
133
|
* shorthand above — same mechanism as `app-sidebar.module.css`'s left counterpart, and it still
|
|
128
134
|
* floors correctly now that the shorthand is two axes and the inline one is responsive: this rule
|
|
129
|
-
* reads the same `--app-shell-padding`, so the floor is against whichever of
|
|
135
|
+
* reads the same `--app-shell-padding`, so the floor is against whichever of 16/8 is live, and on
|
|
130
136
|
* the phone half (8) it is doing MORE work than before, not less. It overrides only
|
|
131
137
|
* `padding-right`; the block padding keeps coming from the shorthand. The bottom inset already
|
|
132
138
|
* rides `margin-bottom` above (`env(safe-area-inset-bottom)`); the PWA's top inset needs no rule here
|
package/dist/shell/index.d.ts
CHANGED
|
@@ -144,6 +144,17 @@ export type BasaltShellProps = BasaltProps & {
|
|
|
144
144
|
* a no-op when omitted.
|
|
145
145
|
*/
|
|
146
146
|
onCollapsedChange?: (collapsed: boolean) => void;
|
|
147
|
+
/**
|
|
148
|
+
* The header row's height in px — default `SPACE_STEP.appShellHeaderHeight` (44, tracking the
|
|
149
|
+
* density level). ONE number at every width and in both sidebar forms (law C14): the navbar's and
|
|
150
|
+
* aside's top, the page-bar band, the aside's shell header and Main all derive from Mantine's
|
|
151
|
+
* `--app-shell-header-height`, so they follow it with no second value to keep in step. Brand,
|
|
152
|
+
* breadcrumb, page actions and globals centre vertically in the row. For a host that draws its
|
|
153
|
+
* own chrome into the header, e.g. a native macOS unified-toolbar title bar (~52): pair it with
|
|
154
|
+
* `--basalt-shell-lead-inset`. Keep it at or above the `ctl` control height (32) — the row holds
|
|
155
|
+
* one `ctl`-tier control.
|
|
156
|
+
*/
|
|
157
|
+
headerHeight?: number;
|
|
147
158
|
/** Page content. */
|
|
148
159
|
children?: ReactNode;
|
|
149
160
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shell/index.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAiB,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAYlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACjF,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,YAAY,EAEZ,cAAc,EACf,MAAM,aAAa,CAAA;AASpB,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC1E,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,GAC1B,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,YAAY,EACV,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,UAAU,EACV,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC5E,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA;AACjF,OAAO,EAAE,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA;AAEjF;;;;GAIG;AACH,YAAY,EACV,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,aAAa,CAAA;AAEpB,gEAAgE;AAChE,MAAM,MAAM,WAAW,GAAG;IACxB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,0FAA0F;IAC1F,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,6DAA6D;AAC7D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAA;IACjC;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB;qDACiD;IACjD,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,CAAA;CAC/B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG;IAC3C;;;OAGG;IACH,KAAK,EAAE,WAAW,GAAG;QAAE,IAAI,CAAC,EAAE,eAAe,EAAE,CAAA;KAAE,CAAA;IACjD,mGAAmG;IACnG,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B;;;OAGG;IACH,SAAS,CAAC,EAAE,eAAe,CAAA;IAC3B;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;IAC9B;;;;;;;;;;;;OAYG;IACH,aAAa,CAAC,EAAE,YAAY,EAAE,CAAA;IAC9B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAA;IACtC;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IACvC;;;OAGG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAA;IAC5B;;;;OAIG;IACH,MAAM,CAAC,EAAE,mBAAmB,GAAG;QAAE,OAAO,CAAC,EAAE,oBAAoB,CAAA;KAAE,CAAA;IACjE;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAA;IAChD,oBAAoB;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB,CAAA;AAgFD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BASlD"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shell/index.tsx"],"names":[],"mappings":"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"}
|
package/dist/shell/index.js
CHANGED
|
@@ -87,6 +87,7 @@ function ShellFrame({
|
|
|
87
87
|
storageKey = "basalt-sidebar-collapsed",
|
|
88
88
|
collapsed: collapsedProp,
|
|
89
89
|
onCollapsedChange,
|
|
90
|
+
headerHeight,
|
|
90
91
|
account,
|
|
91
92
|
search,
|
|
92
93
|
children,
|
|
@@ -146,7 +147,7 @@ function ShellFrame({
|
|
|
146
147
|
h: "100dvh",
|
|
147
148
|
header: {
|
|
148
149
|
// ONE height at every width (law C14): nothing reserves a second mobile row any more.
|
|
149
|
-
height: step.appShellHeaderHeight
|
|
150
|
+
height: headerHeight ?? step.appShellHeaderHeight
|
|
150
151
|
},
|
|
151
152
|
navbar: {
|
|
152
153
|
width: { base: step.appShellNavbarWidth, sm: navbarWidth },
|
package/dist/surfaces.d.ts
CHANGED
|
@@ -267,7 +267,7 @@ export declare const SURFACES: {
|
|
|
267
267
|
readonly skill: readonly ["basalt-design"];
|
|
268
268
|
readonly guardKinds: readonly [];
|
|
269
269
|
readonly pluginRules: readonly ["forms-field-key"];
|
|
270
|
-
readonly description: "Mantine form layer: useBasaltForm + inputProps/fieldKey (two calls — a spread `key` is a React 19 warning; the deprecated `field` alias for `inputProps` was removed in 1.29.0, C1 consolidation), useFormSubmit (submit state, decoded errors, server fieldErrors, focus-first-error, validateAsync), FormStateProvider disable propagation, useFieldArray, FormErrorSummary, useFormDraft with autosave (Standard Schema). The FormSection/FormRow/FormGroup/FormActions layout
|
|
270
|
+
readonly description: "Mantine form layer: useBasaltForm + inputProps/fieldKey (two calls — a spread `key` is a React 19 warning; the deprecated `field` alias for `inputProps` was removed in 1.29.0, C1 consolidation), useFormSubmit (submit state, decoded errors, server fieldErrors, focus-first-error, validateAsync), FormStateProvider disable propagation, useFieldArray, FormErrorSummary, useFormDraft with autosave (Standard Schema). The FormSection/FormRow/FormGroup/FormActions layout lives in ./controls (moved in 1.36.0) and useForm/schemaResolver come from @mantine/form; the six re-exports here were removed in 1.39.0";
|
|
271
271
|
readonly optionalPeers: readonly ["@mantine/form"];
|
|
272
272
|
readonly forbiddenImports: readonly [];
|
|
273
273
|
};
|
package/dist/surfaces.js
CHANGED
|
@@ -243,7 +243,7 @@ const SURFACES = {
|
|
|
243
243
|
// only stops resetting. `warn` through the 1.30.0 grace because it fires on what every
|
|
244
244
|
// consumer ships today (`PLUGIN_RULE_GRACE`).
|
|
245
245
|
pluginRules: ["forms-field-key"],
|
|
246
|
-
description: "Mantine form layer: useBasaltForm + inputProps/fieldKey (two calls \u2014 a spread `key` is a React 19 warning; the deprecated `field` alias for `inputProps` was removed in 1.29.0, C1 consolidation), useFormSubmit (submit state, decoded errors, server fieldErrors, focus-first-error, validateAsync), FormStateProvider disable propagation, useFieldArray, FormErrorSummary, useFormDraft with autosave (Standard Schema). The FormSection/FormRow/FormGroup/FormActions layout
|
|
246
|
+
description: "Mantine form layer: useBasaltForm + inputProps/fieldKey (two calls \u2014 a spread `key` is a React 19 warning; the deprecated `field` alias for `inputProps` was removed in 1.29.0, C1 consolidation), useFormSubmit (submit state, decoded errors, server fieldErrors, focus-first-error, validateAsync), FormStateProvider disable propagation, useFieldArray, FormErrorSummary, useFormDraft with autosave (Standard Schema). The FormSection/FormRow/FormGroup/FormActions layout lives in ./controls (moved in 1.36.0) and useForm/schemaResolver come from @mantine/form; the six re-exports here were removed in 1.39.0",
|
|
247
247
|
optionalPeers: ["@mantine/form"],
|
|
248
248
|
forbiddenImports: []
|
|
249
249
|
},
|
package/dist/tokens/palette.d.ts
CHANGED
|
@@ -502,6 +502,8 @@ declare const SPACE_STEP_BASE: {
|
|
|
502
502
|
* folds that row's overflow into a kebab and moves its filters/tabs into the page flow, so the
|
|
503
503
|
* bar is one row on a phone too and there is no sum to keep in step any more.
|
|
504
504
|
*
|
|
505
|
+
* Consumer-settable per shell through `BasaltShell`'s `headerHeight` (px); this is its default.
|
|
506
|
+
*
|
|
505
507
|
* 44, down from 48. The band holds ONE `ctl`-tier row (32 since this pass), so 48 left 8px of
|
|
506
508
|
* dead air above and below it — the "too much spacing at the top bar" the header reads as. 44
|
|
507
509
|
* keeps 6px of breathing room a side, still clears `controlHeight` (42) for a `size="md"`
|
|
@@ -541,13 +543,13 @@ declare const SPACE_STEP_BASE: {
|
|
|
541
543
|
* `tokens/index.ts` for why), because it is the single most visible spacing number the framework
|
|
542
544
|
* ships and a consumer retuning its identity has to be able to reach it.
|
|
543
545
|
*
|
|
544
|
-
*
|
|
545
|
-
*
|
|
546
|
-
*
|
|
547
|
-
*
|
|
548
|
-
*
|
|
549
|
-
*
|
|
550
|
-
readonly appShellInset:
|
|
546
|
+
* 16, down from 20 (and from the 13 `SPACE_SCALE.sm` the main column borrowed before that): at 20
|
|
547
|
+
* the content read as pushed away from the seam. 16 sits on the 4px grid. It is NOT the sidebar's
|
|
548
|
+
* nav-icon column any more (x=20: 10px of `.root` frame inset plus 10px of NavLink inset,
|
|
549
|
+
* `rowInsetX` twice) — the header's brand zone aligns to that column on its own
|
|
550
|
+
* (`shell/app-brand.module.css`), so the page gutter is free to be a gutter. The header's
|
|
551
|
+
* breadcrumb, the page-bar band and Main all land on this one number. */
|
|
552
|
+
readonly appShellInset: 16;
|
|
551
553
|
/** The page gutter BELOW `sm` — the phone half of `appShellInset` above. A separate entry rather
|
|
552
554
|
* than one responsive value for the same reason `appShellNavbarWidth` is one: there is no sidebar
|
|
553
555
|
* seam to align to on a phone, so the number is answering a different question (how much of a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../../src/tokens/palette.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../../src/tokens/palette.ts"],"names":[],"mappings":"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"}
|
package/dist/tokens/palette.js
CHANGED
|
@@ -414,6 +414,8 @@ const SPACE_STEP_BASE = {
|
|
|
414
414
|
* folds that row's overflow into a kebab and moves its filters/tabs into the page flow, so the
|
|
415
415
|
* bar is one row on a phone too and there is no sum to keep in step any more.
|
|
416
416
|
*
|
|
417
|
+
* Consumer-settable per shell through `BasaltShell`'s `headerHeight` (px); this is its default.
|
|
418
|
+
*
|
|
417
419
|
* 44, down from 48. The band holds ONE `ctl`-tier row (32 since this pass), so 48 left 8px of
|
|
418
420
|
* dead air above and below it — the "too much spacing at the top bar" the header reads as. 44
|
|
419
421
|
* keeps 6px of breathing room a side, still clears `controlHeight` (42) for a `size="md"`
|
|
@@ -453,13 +455,13 @@ const SPACE_STEP_BASE = {
|
|
|
453
455
|
* `tokens/index.ts` for why), because it is the single most visible spacing number the framework
|
|
454
456
|
* ships and a consumer retuning its identity has to be able to reach it.
|
|
455
457
|
*
|
|
456
|
-
*
|
|
457
|
-
*
|
|
458
|
-
*
|
|
459
|
-
*
|
|
460
|
-
*
|
|
461
|
-
*
|
|
462
|
-
appShellInset:
|
|
458
|
+
* 16, down from 20 (and from the 13 `SPACE_SCALE.sm` the main column borrowed before that): at 20
|
|
459
|
+
* the content read as pushed away from the seam. 16 sits on the 4px grid. It is NOT the sidebar's
|
|
460
|
+
* nav-icon column any more (x=20: 10px of `.root` frame inset plus 10px of NavLink inset,
|
|
461
|
+
* `rowInsetX` twice) — the header's brand zone aligns to that column on its own
|
|
462
|
+
* (`shell/app-brand.module.css`), so the page gutter is free to be a gutter. The header's
|
|
463
|
+
* breadcrumb, the page-bar band and Main all land on this one number. */
|
|
464
|
+
appShellInset: 16,
|
|
463
465
|
/** The page gutter BELOW `sm` — the phone half of `appShellInset` above. A separate entry rather
|
|
464
466
|
* than one responsive value for the same reason `appShellNavbarWidth` is one: there is no sidebar
|
|
465
467
|
* seam to align to on a phone, so the number is answering a different question (how much of a
|
package/dist/tokens.css
CHANGED
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
--vx-space-sidebar-child-list-indent: 15px;
|
|
96
96
|
--vx-space-sidebar-child-row-inset-y: 4px;
|
|
97
97
|
--vx-space-sidebar-child-row-indent: 12px;
|
|
98
|
-
--vx-space-app-shell-inset:
|
|
98
|
+
--vx-space-app-shell-inset: 16px;
|
|
99
99
|
--vx-space-app-shell-inset-mobile: 8px;
|
|
100
100
|
--vx-space-app-shell-header-lead-min: 96px;
|
|
101
101
|
--vx-space-mobile-nav-tab-gap: 3px;
|
package/llms.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# basalt-ui v1.
|
|
1
|
+
# basalt-ui v1.39.0
|
|
2
2
|
# Opinionated framework for Mantine-based React apps — theme, app shell, visx charts, toolchain presets
|
|
3
3
|
#
|
|
4
4
|
# basalt-ui is an opinionated framework for Mantine-based React apps.
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
# ./tokens.css subpath. Guide: docs/FRAMEWORK-FREE.md in the repo.
|
|
20
20
|
|
|
21
21
|
Package: basalt-ui
|
|
22
|
-
Version: 1.
|
|
22
|
+
Version: 1.39.0
|
|
23
23
|
|
|
24
24
|
## basalt-ui
|
|
25
25
|
Import: import { ... } from 'basalt-ui'
|
|
@@ -70,7 +70,7 @@ OptionalPeers: @tanstack/react-router@^1.170.0
|
|
|
70
70
|
|
|
71
71
|
## basalt-ui/forms
|
|
72
72
|
Import: import { ... } from 'basalt-ui/forms'
|
|
73
|
-
Description: Mantine form layer: useBasaltForm + inputProps/fieldKey (two calls — a spread `key` is a React 19 warning; the deprecated `field` alias for `inputProps` was removed in 1.29.0, C1 consolidation), useFormSubmit (submit state, decoded errors, server fieldErrors, focus-first-error, validateAsync), FormStateProvider disable propagation, useFieldArray, FormErrorSummary, useFormDraft with autosave (Standard Schema). The FormSection/FormRow/FormGroup/FormActions layout
|
|
73
|
+
Description: Mantine form layer: useBasaltForm + inputProps/fieldKey (two calls — a spread `key` is a React 19 warning; the deprecated `field` alias for `inputProps` was removed in 1.29.0, C1 consolidation), useFormSubmit (submit state, decoded errors, server fieldErrors, focus-first-error, validateAsync), FormStateProvider disable propagation, useFieldArray, FormErrorSummary, useFormDraft with autosave (Standard Schema). The FormSection/FormRow/FormGroup/FormActions layout lives in ./controls (moved in 1.36.0) and useForm/schemaResolver come from @mantine/form; the six re-exports here were removed in 1.39.0
|
|
74
74
|
Layer: mantine-coupled
|
|
75
75
|
Rule: basalt-batteries
|
|
76
76
|
OptionalPeers: @mantine/form@^9.3.0
|
package/package.json
CHANGED
package/src/forms/index.ts
CHANGED
|
@@ -8,10 +8,9 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Four pieces: the form (`useBasaltForm` + `inputProps`/`fieldKey`), the submit lifecycle
|
|
10
10
|
* (`useFormSubmit` + `FormStateProvider`), the list field (`useFieldArray`) and the draft
|
|
11
|
-
* (`useFormDraft`). The layout (`FormSection` / `FormRow` / `FormGroup` / `FormActions`)
|
|
12
|
-
* `basalt-ui/controls`
|
|
13
|
-
*
|
|
14
|
-
* `@mantine/form`).
|
|
11
|
+
* (`useFormDraft`). The layout (`FormSection` / `FormRow` / `FormGroup` / `FormActions`) lives in
|
|
12
|
+
* `basalt-ui/controls` (it needs no `@mantine/form`); `useForm`/`schemaResolver` come from
|
|
13
|
+
* `@mantine/form` directly. Both stopped being re-exported here in 1.39.0.
|
|
15
14
|
*
|
|
16
15
|
* Optional peer: @mantine/form ^9.3.0 — install with: bun add @mantine/form
|
|
17
16
|
*/
|
|
@@ -24,32 +23,6 @@ export type { UseBasaltFormOptions } from './create-form'
|
|
|
24
23
|
// Two calls, never one object: `key` inside a spread is a React 19 warning. See field.ts.
|
|
25
24
|
export { inputProps, fieldKey } from './field'
|
|
26
25
|
|
|
27
|
-
// ── layout — moved to ./controls (1.36.0), deprecated aliases until 1.39.0 ─────
|
|
28
|
-
export {
|
|
29
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
30
|
-
FormSection,
|
|
31
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
32
|
-
FormRow,
|
|
33
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
34
|
-
FormGroup,
|
|
35
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
36
|
-
FormActions,
|
|
37
|
-
} from '../controls/form-layout'
|
|
38
|
-
export type {
|
|
39
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
40
|
-
FormSectionProps,
|
|
41
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
42
|
-
FormSectionSlot,
|
|
43
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
44
|
-
FormRowProps,
|
|
45
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
46
|
-
FormRowSlot,
|
|
47
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
48
|
-
FormGroupProps,
|
|
49
|
-
/** @deprecated Import from 'basalt-ui/controls' — removed in 1.39.0. */
|
|
50
|
-
FormActionsProps,
|
|
51
|
-
} from '../controls/form-layout'
|
|
52
|
-
|
|
53
26
|
// ── submit lifecycle ──────────────────────────────────────────────────────────
|
|
54
27
|
export { useFormSubmit, isFieldErrorEnvelope } from './use-form-submit'
|
|
55
28
|
export type { FormFieldErrors, UseFormSubmitOptions, UseFormSubmitReturn } from './use-form-submit'
|
|
@@ -67,17 +40,3 @@ export type { FormErrorSummaryProps } from './FormErrorSummary'
|
|
|
67
40
|
// ── useFormDraft ──────────────────────────────────────────────────────────────
|
|
68
41
|
export { useFormDraft, DEFAULT_AUTOSAVE_DEBOUNCE_MS } from './use-form-draft'
|
|
69
42
|
export type { UseFormDraftOptions, UseFormDraftReturn } from './use-form-draft'
|
|
70
|
-
|
|
71
|
-
// ── @mantine/form re-exports — deprecated, zero consumers import them from here ──
|
|
72
|
-
export {
|
|
73
|
-
/** @deprecated Import from '@mantine/form' — removed in 1.39.0. */
|
|
74
|
-
useForm,
|
|
75
|
-
/** @deprecated Import from '@mantine/form' — removed in 1.39.0. */
|
|
76
|
-
schemaResolver,
|
|
77
|
-
} from '@mantine/form'
|
|
78
|
-
export type {
|
|
79
|
-
/** @deprecated Import from '@mantine/form' — removed in 1.39.0. */
|
|
80
|
-
UseFormReturnType,
|
|
81
|
-
/** @deprecated Import from '@mantine/form' — removed in 1.39.0. */
|
|
82
|
-
UseFormInput,
|
|
83
|
-
} from '@mantine/form'
|
|
@@ -8,13 +8,15 @@
|
|
|
8
8
|
*
|
|
9
9
|
* The zone's WIDTH is `--app-shell-navbar-offset`, so it tracks the rail collapse with no React
|
|
10
10
|
* state and lands its trailing edge exactly on the sidebar|main seam. The negative
|
|
11
|
-
* `margin-inline-start` cancels `AppShell.Header`'s own `px` inset
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* `
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
11
|
+
* `margin-inline-start` cancels `AppShell.Header`'s own `px` inset (the page gutter,
|
|
12
|
+
* `--app-shell-padding`) so the zone starts at the viewport edge, and the zone's OWN inline padding
|
|
13
|
+
* is the sidebar's nav-icon column — 10px of `.root` frame inset plus 10px of NavLink inset, i.e.
|
|
14
|
+
* `row-inset-x` twice — which is what puts the brand lead on the same x as the nav ICON column below
|
|
15
|
+
* it. That padding used to BE the page gutter (`--app-shell-padding`, 20, the same number by
|
|
16
|
+
* coincidence); the gutter is 16 now, and the two are different claims, so each is stated on its
|
|
17
|
+
* own. The breadcrumb lands on Main's content edge: the zone's trailing margin is the gutter minus
|
|
18
|
+
* the header row's flex gap (`app-header.module.css`'s `--basalt-header-gap`), so zone end + margin
|
|
19
|
+
* + gap = seam + gutter.
|
|
18
20
|
*
|
|
19
21
|
* `--basalt-shell-lead-inset` (default 0px, set by the consumer on `:root`) is the opt-in native
|
|
20
22
|
* title-bar contract: a macOS overlay title bar paints its traffic lights ON TOP of this zone, so a
|
|
@@ -30,6 +32,8 @@
|
|
|
30
32
|
* `--ai-size-md` (1.75rem). Mantine defines that var on the ActionIcon, not on `:root`, so the
|
|
31
33
|
* zone restates the same arithmetic; `app-brand.module.css.test.ts` pins the two together. */
|
|
32
34
|
--basalt-shell-toggle-size: calc(1.75rem * var(--mantine-scale, 1));
|
|
35
|
+
/* The sidebar's nav-icon column: `.root` inset + NavLink inset, both `row-inset-x`. */
|
|
36
|
+
--basalt-nav-icon-x: calc(2 * var(--vx-space-row-inset-x));
|
|
33
37
|
--basalt-shell-zone-width: max(
|
|
34
38
|
var(--app-shell-navbar-offset, 0rem),
|
|
35
39
|
calc(var(--basalt-shell-lead-inset, 0px) + var(--basalt-shell-toggle-size))
|
|
@@ -43,8 +47,9 @@
|
|
|
43
47
|
* like, and the rail's centred toggle centres against the whole row. */
|
|
44
48
|
align-self: stretch;
|
|
45
49
|
margin-inline-start: calc(-1 * var(--app-shell-padding, 0px));
|
|
46
|
-
|
|
47
|
-
padding-inline
|
|
50
|
+
margin-inline-end: calc(var(--app-shell-padding, 0px) - var(--basalt-header-gap, 0px));
|
|
51
|
+
padding-inline: var(--basalt-nav-icon-x);
|
|
52
|
+
padding-inline-start: calc(var(--basalt-nav-icon-x) + var(--basalt-shell-lead-inset, 0px));
|
|
48
53
|
overflow: hidden;
|
|
49
54
|
/* Mantine's own AppShell timing, so the zone and the navbar under it move as one box. */
|
|
50
55
|
transition-property: flex-basis, width;
|
|
@@ -17,9 +17,12 @@
|
|
|
17
17
|
* `alt` — never a border in this module.
|
|
18
18
|
*/
|
|
19
19
|
.bar {
|
|
20
|
+
/* Named so the leading zone (`app-brand.module.css`) can offset its trailing margin by exactly
|
|
21
|
+
* this gap and land the breadcrumb on Main's content edge. */
|
|
22
|
+
--basalt-header-gap: var(--mantine-spacing-sm);
|
|
20
23
|
display: flex;
|
|
21
24
|
align-items: center;
|
|
22
|
-
gap: var(--
|
|
25
|
+
gap: var(--basalt-header-gap);
|
|
23
26
|
width: 100%;
|
|
24
27
|
height: 100%;
|
|
25
28
|
}
|
|
@@ -97,13 +97,13 @@
|
|
|
97
97
|
* value rather than an offset, because Mantine owns the responsive switch (`shell/index.tsx`
|
|
98
98
|
* hands `AppShell` the `appShellInset`/`appShellInsetMobile` pair) and the header, the band and
|
|
99
99
|
* Main all have to land on the SAME number — re-deriving it here would fork it. It is an
|
|
100
|
-
* ALIGNMENT constraint:
|
|
101
|
-
*
|
|
100
|
+
* ALIGNMENT constraint: the header's breadcrumb and globals land on the same edges as the
|
|
101
|
+
* content (`app-brand.module.css` states the arithmetic).
|
|
102
102
|
*
|
|
103
|
-
* Block is
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
103
|
+
* Block is breathing room under the band's single `--vx-divider` line — nothing aligns to it.
|
|
104
|
+
* `stack-md` (12) on a phone, one rung down (`stack-sm`, 8) from `sm` up where the inline gutter
|
|
105
|
+
* is 16: the page then sits 16 from the seam and 8 under the header, rather than the 20/12 it
|
|
106
|
+
* used to.
|
|
107
107
|
*/
|
|
108
108
|
padding: var(--vx-space-stack-md) var(--app-shell-padding);
|
|
109
109
|
/* Without this a wide flex/grid child (a bare table, a nowrap control row) sizes Main to ITSELF. */
|
|
@@ -122,11 +122,17 @@
|
|
|
122
122
|
transition-property: margin;
|
|
123
123
|
}
|
|
124
124
|
|
|
125
|
+
@media (min-width: 52.5em) {
|
|
126
|
+
.main {
|
|
127
|
+
padding-block: var(--vx-space-stack-sm);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
125
131
|
/* Installed PWA (C5 consolidation, seeded from argo's `styles/native.css`): clear the landscape
|
|
126
132
|
* notch on the side Main touches. `max()` is a FLOOR over the INLINE value of `.main`'s `padding`
|
|
127
133
|
* shorthand above — same mechanism as `app-sidebar.module.css`'s left counterpart, and it still
|
|
128
134
|
* floors correctly now that the shorthand is two axes and the inline one is responsive: this rule
|
|
129
|
-
* reads the same `--app-shell-padding`, so the floor is against whichever of
|
|
135
|
+
* reads the same `--app-shell-padding`, so the floor is against whichever of 16/8 is live, and on
|
|
130
136
|
* the phone half (8) it is doing MORE work than before, not less. It overrides only
|
|
131
137
|
* `padding-right`; the block padding keeps coming from the shorthand. The bottom inset already
|
|
132
138
|
* rides `margin-bottom` above (`env(safe-area-inset-bottom)`); the PWA's top inset needs no rule here
|
package/src/shell/index.tsx
CHANGED
|
@@ -232,6 +232,17 @@ export type BasaltShellProps = BasaltProps & {
|
|
|
232
232
|
* a no-op when omitted.
|
|
233
233
|
*/
|
|
234
234
|
onCollapsedChange?: (collapsed: boolean) => void
|
|
235
|
+
/**
|
|
236
|
+
* The header row's height in px — default `SPACE_STEP.appShellHeaderHeight` (44, tracking the
|
|
237
|
+
* density level). ONE number at every width and in both sidebar forms (law C14): the navbar's and
|
|
238
|
+
* aside's top, the page-bar band, the aside's shell header and Main all derive from Mantine's
|
|
239
|
+
* `--app-shell-header-height`, so they follow it with no second value to keep in step. Brand,
|
|
240
|
+
* breadcrumb, page actions and globals centre vertically in the row. For a host that draws its
|
|
241
|
+
* own chrome into the header, e.g. a native macOS unified-toolbar title bar (~52): pair it with
|
|
242
|
+
* `--basalt-shell-lead-inset`. Keep it at or above the `ctl` control height (32) — the row holds
|
|
243
|
+
* one `ctl`-tier control.
|
|
244
|
+
*/
|
|
245
|
+
headerHeight?: number
|
|
235
246
|
/** Page content. */
|
|
236
247
|
children?: ReactNode
|
|
237
248
|
}
|
|
@@ -349,6 +360,7 @@ function ShellFrame({
|
|
|
349
360
|
storageKey = 'basalt-sidebar-collapsed',
|
|
350
361
|
collapsed: collapsedProp,
|
|
351
362
|
onCollapsedChange,
|
|
363
|
+
headerHeight,
|
|
352
364
|
account,
|
|
353
365
|
search,
|
|
354
366
|
children,
|
|
@@ -466,7 +478,7 @@ function ShellFrame({
|
|
|
466
478
|
// bar to the RIGHT of the sidebar instead of above it.
|
|
467
479
|
header={{
|
|
468
480
|
// ONE height at every width (law C14): nothing reserves a second mobile row any more.
|
|
469
|
-
height: step.appShellHeaderHeight,
|
|
481
|
+
height: headerHeight ?? step.appShellHeaderHeight,
|
|
470
482
|
}}
|
|
471
483
|
navbar={{
|
|
472
484
|
width: { base: step.appShellNavbarWidth, sm: navbarWidth },
|
package/src/surfaces.ts
CHANGED
|
@@ -443,7 +443,7 @@ export const SURFACES = {
|
|
|
443
443
|
// consumer ships today (`PLUGIN_RULE_GRACE`).
|
|
444
444
|
pluginRules: ['forms-field-key'],
|
|
445
445
|
description:
|
|
446
|
-
'Mantine form layer: useBasaltForm + inputProps/fieldKey (two calls — a spread `key` is a React 19 warning; the deprecated `field` alias for `inputProps` was removed in 1.29.0, C1 consolidation), useFormSubmit (submit state, decoded errors, server fieldErrors, focus-first-error, validateAsync), FormStateProvider disable propagation, useFieldArray, FormErrorSummary, useFormDraft with autosave (Standard Schema). The FormSection/FormRow/FormGroup/FormActions layout
|
|
446
|
+
'Mantine form layer: useBasaltForm + inputProps/fieldKey (two calls — a spread `key` is a React 19 warning; the deprecated `field` alias for `inputProps` was removed in 1.29.0, C1 consolidation), useFormSubmit (submit state, decoded errors, server fieldErrors, focus-first-error, validateAsync), FormStateProvider disable propagation, useFieldArray, FormErrorSummary, useFormDraft with autosave (Standard Schema). The FormSection/FormRow/FormGroup/FormActions layout lives in ./controls (moved in 1.36.0) and useForm/schemaResolver come from @mantine/form; the six re-exports here were removed in 1.39.0',
|
|
447
447
|
optionalPeers: ['@mantine/form'],
|
|
448
448
|
forbiddenImports: [],
|
|
449
449
|
},
|
package/src/tokens/palette.ts
CHANGED
|
@@ -611,6 +611,8 @@ const SPACE_STEP_BASE = {
|
|
|
611
611
|
* folds that row's overflow into a kebab and moves its filters/tabs into the page flow, so the
|
|
612
612
|
* bar is one row on a phone too and there is no sum to keep in step any more.
|
|
613
613
|
*
|
|
614
|
+
* Consumer-settable per shell through `BasaltShell`'s `headerHeight` (px); this is its default.
|
|
615
|
+
*
|
|
614
616
|
* 44, down from 48. The band holds ONE `ctl`-tier row (32 since this pass), so 48 left 8px of
|
|
615
617
|
* dead air above and below it — the "too much spacing at the top bar" the header reads as. 44
|
|
616
618
|
* keeps 6px of breathing room a side, still clears `controlHeight` (42) for a `size="md"`
|
|
@@ -650,13 +652,13 @@ const SPACE_STEP_BASE = {
|
|
|
650
652
|
* `tokens/index.ts` for why), because it is the single most visible spacing number the framework
|
|
651
653
|
* ships and a consumer retuning its identity has to be able to reach it.
|
|
652
654
|
*
|
|
653
|
-
*
|
|
654
|
-
*
|
|
655
|
-
*
|
|
656
|
-
*
|
|
657
|
-
*
|
|
658
|
-
*
|
|
659
|
-
appShellInset:
|
|
655
|
+
* 16, down from 20 (and from the 13 `SPACE_SCALE.sm` the main column borrowed before that): at 20
|
|
656
|
+
* the content read as pushed away from the seam. 16 sits on the 4px grid. It is NOT the sidebar's
|
|
657
|
+
* nav-icon column any more (x=20: 10px of `.root` frame inset plus 10px of NavLink inset,
|
|
658
|
+
* `rowInsetX` twice) — the header's brand zone aligns to that column on its own
|
|
659
|
+
* (`shell/app-brand.module.css`), so the page gutter is free to be a gutter. The header's
|
|
660
|
+
* breadcrumb, the page-bar band and Main all land on this one number. */
|
|
661
|
+
appShellInset: 16,
|
|
660
662
|
/** The page gutter BELOW `sm` — the phone half of `appShellInset` above. A separate entry rather
|
|
661
663
|
* than one responsive value for the same reason `appShellNavbarWidth` is one: there is no sidebar
|
|
662
664
|
* seam to align to on a phone, so the number is answering a different question (how much of a
|