basalt-ui 1.30.0 → 1.30.2

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.
Files changed (52) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/MIGRATING.md +284 -30
  3. package/dist/charts/index.d.ts +1 -1
  4. package/dist/charts/index.d.ts.map +1 -1
  5. package/dist/charts/kinds/BandStrip.d.ts +5 -3
  6. package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
  7. package/dist/charts/kinds/Bars.d.ts +4 -2
  8. package/dist/charts/kinds/Bars.d.ts.map +1 -1
  9. package/dist/charts/kinds/Donut.d.ts +4 -2
  10. package/dist/charts/kinds/Donut.d.ts.map +1 -1
  11. package/dist/charts/kinds/DualPanel.d.ts +4 -2
  12. package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
  13. package/dist/charts/kinds/Heatmap.d.ts +5 -2
  14. package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
  15. package/dist/charts/kinds/MirroredBars.d.ts +4 -2
  16. package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
  17. package/dist/charts/kinds/MultiLine.d.ts +4 -2
  18. package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
  19. package/dist/charts/kinds/StackedArea.d.ts +4 -2
  20. package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
  21. package/dist/charts/kinds/ZonedLine.d.ts +4 -2
  22. package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
  23. package/dist/charts/primitives/CartesianChart.d.ts +4 -1
  24. package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
  25. package/dist/charts/primitives/ChartFrame.d.ts +20 -11
  26. package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
  27. package/dist/charts/primitives/ChartFrame.js +39 -14
  28. package/dist/charts/primitives/ChartLegend.d.ts +5 -3
  29. package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
  30. package/dist/charts/primitives/chart-frame-layout.d.ts +64 -9
  31. package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -1
  32. package/dist/charts/primitives/chart-frame-layout.js +35 -6
  33. package/dist/common/errors.d.ts +11 -0
  34. package/dist/common/errors.d.ts.map +1 -1
  35. package/dist/common/errors.js +4 -0
  36. package/llms.txt +2 -2
  37. package/package.json +1 -1
  38. package/src/charts/index.ts +1 -0
  39. package/src/charts/kinds/BandStrip.tsx +5 -3
  40. package/src/charts/kinds/Bars.tsx +4 -2
  41. package/src/charts/kinds/Donut.tsx +4 -2
  42. package/src/charts/kinds/DualPanel.tsx +4 -2
  43. package/src/charts/kinds/Heatmap.tsx +5 -2
  44. package/src/charts/kinds/MirroredBars.tsx +4 -2
  45. package/src/charts/kinds/MultiLine.tsx +4 -2
  46. package/src/charts/kinds/StackedArea.tsx +4 -2
  47. package/src/charts/kinds/ZonedLine.tsx +4 -2
  48. package/src/charts/primitives/CartesianChart.tsx +4 -1
  49. package/src/charts/primitives/ChartFrame.tsx +72 -37
  50. package/src/charts/primitives/ChartLegend.tsx +5 -3
  51. package/src/charts/primitives/chart-frame-layout.ts +123 -16
  52. package/src/common/errors.ts +14 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## [1.30.2](https://github.com/jkrumm/basalt-ui/compare/v1.30.1...v1.30.2) (2026-09-09)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * stop legendWins collapsing a self-measured fill frame to no plot ([07f0fcd](https://github.com/jkrumm/basalt-ui/commit/07f0fcd65df5047caec1ce09aaaf7f05958e58ad))
7
+
8
+ ## [1.30.1](https://github.com/jkrumm/basalt-ui/compare/v1.30.0...v1.30.1) (2026-09-09)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * automate MIGRATING's release rename, and correct what 1.30.0 published ([e8b03fa](https://github.com/jkrumm/basalt-ui/commit/e8b03fa35cb02fc7358933b9168d5a4c7506c92e))
14
+ * make the responsive chart height reachable and the legend cap honoured ([5ab5bad](https://github.com/jkrumm/basalt-ui/commit/5ab5badbbbb4d2ed7962313b467e699f33f17554))
15
+
1
16
  # [1.30.0](https://github.com/jkrumm/basalt-ui/compare/v1.29.2...v1.30.0) (2026-09-09)
2
17
 
3
18
 
package/MIGRATING.md CHANGED
@@ -15,12 +15,22 @@ the types, not this table, if the two disagree.
15
15
 
16
16
  **The newest section is headed `## Unreleased`, and the RELEASE renames it to its own number.**
17
17
  This file is written before `semantic-release` picks the number, so a number written here is a guess
18
- — and it was wrong three rounds running. The rename is therefore a release-time step, not an
18
+ — and it was wrong four rounds running. The rename is therefore a release-time step, not an
19
19
  authoring-time one: the section is authored as `## Unreleased — <title>`, and the release swaps the
20
20
  word `Unreleased` for the computed version, leaving the title alone; a fresh `## Unreleased` opens
21
- above it. Doing it by hand is what failed three times running — `.releaserc.json`'s `prepareCmd`
22
- already rewrites `package.json` and regenerates `llms.txt` at exactly that moment, so that is where
23
- the swap belongs.
21
+ above it, with a fresh column in the index below.
22
+
23
+ **Since 1.30.1 a script does it, and that is the fix the previous revision only claimed.** This
24
+ paragraph used to end "so that is where the swap belongs" — a statement of intent that read as a
25
+ statement of fact. `prepareCmd` was never given the step and MIGRATING.md was never added to
26
+ `@semantic-release/git`'s assets, so even a correct local edit could not have reached the tarball,
27
+ and 1.30.0 duly shipped `## Unreleased — the chrome wave` to npm; three separate consumer agents
28
+ found it there. `packages/basalt-ui/scripts/release-migrating.ts` now performs the rename in
29
+ `prepareCmd` beside `gen-llms.ts` and commits through the same assets list, `--check` runs it in
30
+ `scripts/release.sh`'s preflight (a dry run SKIPS `prepare`, so nothing else in the pipeline can
31
+ catch a shape it cannot rewrite), and it FAILS rather than doing nothing when the shape surprises
32
+ it. If you are reading a heading that still says `Unreleased` in an installed tarball, that is a
33
+ bug, not an authoring slip.
24
34
 
25
35
  **Skipping that step is what this file's worst defect was.** 1.27.0, 1.28.0 and 1.29.0 all shipped
26
36
  under one `## Unreleased` heading — ~1000 lines, two of its subsections still titled "targeting
@@ -48,22 +58,136 @@ all 2294 lines of the previous revision to learn that four minors moved two thin
48
58
  layer; this index is that answer in one line. It is a POINTER, not a second copy: every cell names
49
59
  the section that carries the detail, and a surface with no row in a minor had no delta in it. The
50
60
  `Unreleased` column takes the version number at the same moment the section below it does, and a new
51
- column is added at the same time — one edit, in the release commit.
52
-
53
- | Surface | 1.27.0 | 1.28.0 | 1.29.0 | Unreleased |
54
- | --------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | ----------------------------------- |
55
- | **tokens** (`./tokens`) | — | `--vx-divider` → `rgba()` on both schemes (§ Shell) | `--vx-space-touch-target` added (§ Additions) | eight spacing numbers (§ Chrome) |
56
- | **charts** (`./charts`) | — | phone tier, `curve`, formatters, `state`, log axis (§ preamble) | `ChartState.empty: string`, `AxisBottomNumeric` (§ Additions) | — |
57
- | **shell** (`.`) | — | scrollport, region seams, **the brand left the sidebar** (§§ scrollport, brand, Shell) | `PageTitle`, `BasaltDevDock`, `useBreakpoint` (§ Additions) | More popover, aside pill (§ Chrome) |
58
- | **controls** (`./controls`) | `NumberFilter`, `field.number` (§ Controls) | sheet renders panel rows; `PanelRow`, `SliderControl` (§ `basalt-ui/controls`) | — | — |
59
- | **forms** (`./forms`) | — | `field` → `inputProps`, **`inputProps` drops `key`**, the layout tier (§ `inputProps`) | `field` DELETED — and the `--fix` recipe no longer works (§ Consolidation) | — |
60
- | **data** (`./data/table`) | — | root is a `<div>`, row selection, `getItemKey` required (§ `basalt-ui/data`) | `./data` + `./query` + `./connectivity` dropped (§ Consolidation) | — |
61
- | **CLI** (`basalt-ui`) | — | — | **resolver stops relocating; `doctor` loses 6 of 10 checks** (§ CLI) | — |
62
- | **guards** | five rules → `error` (§ Guards) | six new ids at `warn` (§ preamble) | `query-dual-import` retired in 1.29.1 (§ Guards) | four rules → `error` (§ Guards) |
61
+ column opens at the same time — both performed by `scripts/release-migrating.ts` in the release
62
+ commit, so the column head and the section it points at can never disagree.
63
+
64
+ There is one row per SURFACE, not per export, and a surface earns a row once anything in it moves:
65
+ **dashboard** and **toolchain** were added at 1.30.1 because `StatGroup`/`WidgetGrid` and the
66
+ shipped lefthook preset both changed in 1.30.0 with no row that owned them — which is how a
67
+ consumer read this index, found nothing, and diffed a KPI row that had silently gone 4-up → 2-up.
68
+
69
+ | Surface | 1.27.0 | 1.28.0 | 1.29.0 | 1.30.0 | 1.30.1 | 1.30.2 | Unreleased |
70
+ | ----------------------------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | --------------------------------------------------------------------- | ------ | ---------- |
71
+ | **tokens** (`./tokens`) | — | `--vx-divider` → `rgba()` on both schemes (§ Shell) | `--vx-space-touch-target` added (§ Additions) | eight spacing numbers (§ Chrome) | — | — | — |
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) | — | — |
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) | — | — | — |
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) | — | — | — | — |
76
+ | **data** (`./data/table`) | — | root is a `<div>`, row selection, `getItemKey` required (§ `basalt-ui/data`) | `./data` + `./query` + `./connectivity` dropped (§ Consolidation) | — | — | — | — |
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) | — | — | — |
63
81
 
64
82
  ---
65
83
 
66
- ## Unreleased — the chrome wave
84
+ ## Unreleased
85
+
86
+ _Nothing yet. Author the next section under this heading as `## Unreleased — <title>`; the
87
+ release renames it and opens a new one here._
88
+
89
+ ## 1.30.2 — the `legendWins` collapse, and two things `ChartFrame` never said out loud
90
+
91
+ **A patch. Nothing is added, renamed or removed.** One rendering regression 1.30.1 shipped is
92
+ fixed; the other two entries correct documentation, not behaviour.
93
+
94
+ ### Charts — a stated `legend.maxRows` no longer costs a `fill` chart its whole plot
95
+
96
+ 1.30.1's `legendWins` drops `resolvePlotRect`'s `VX.minPlotHeight` floor so the caller's cap is
97
+ paid for out of the frame's own cell. `ChartFrame` measures its OWN node, and under `fill` its
98
+ `height: 100%` resolves to `auto` in a parent that states no height — so with the floor gone the
99
+ sequence has a fixpoint at zero: plot 0 → the legend is the only content → the box IS the legend
100
+ band → 0 again, forever. MEASURED in headless Chrome: a 7-entry `fill` chart at `maxRows: 3` in an
101
+ unsized parent rendered a 29.375px frame and **no plot svg at all**; with nothing stated the same
102
+ chart rendered a 120px plot in a 149.375px frame.
103
+
104
+ The floor now stands while the frame measures exactly its own legend band and nothing else, which
105
+ is the signature of a box nothing else sized. From there the frame is 120px + the band, the box has
106
+ room, and `legendWins` applies normally.
107
+
108
+ - **In the documented `fill` shape — a parent that states a height — nothing changes.** The plot
109
+ still yields the cell to a stated cap, below `VX.minPlotHeight` and down to 0 when the legend
110
+ band is taller than the cell. That is still the caller's arithmetic, made visible.
111
+ - **`fill` in a parent that states no height is not a supported shape** and never was: the frame
112
+ has no external height to fill, so it settles on the plot floor. State a height on the parent
113
+ cell, or use `height` / `aspectRatio` instead of `fill`.
114
+ - Pinned by `tests/layout/charts.layout.test.ts` INVARIANT 7 (both halves) — happy-dom cannot
115
+ observe a `ResizeObserver` fixpoint at all.
116
+
117
+ ### `ChartFrame` warns in dev when `height` or `aspectRatio` is passed with `fill`
118
+
119
+ `fill` always won and the other two were never read; the JSDoc said so and nothing else did. Both
120
+ now `console.error` once in dev through `common/errors.ts`' new `ignoredProp` builder. **No
121
+ rendering moves** — the props were already ignored. A consumer carrying `height` alongside `fill`
122
+ will see one message per prop and can delete the dead constants behind it. A mutually-exclusive
123
+ union prop is the stronger fix and is deliberately not in a patch.
124
+
125
+ ### `legend.maxRows` counts ENTRIES, not rows — a documentation correction
126
+
127
+ `ChartLegend` slices `entries.slice(0, cap)`. `maxRows: 3` on a 7-entry legend renders three
128
+ entries and a `+4 more` chip, on ONE row at any width they fit. This is unchanged behaviour and
129
+ matches `ChartLegend`'s own JSDoc; § 1.30.1's "takes the rows it asked for" and the name itself
130
+ (plus `ChartTierMetrics.legendMaxRows`) said otherwise. **Nothing is renamed** — a public prop
131
+ rename is not a patch, and the value you pass keeps meaning exactly what it always meant.
132
+
133
+ ## 1.30.1 — finishing 1.30.0
134
+
135
+ **A patch. Nothing is added, renamed or removed — three things 1.30.0 shipped are made to work, and
136
+ one number it published is corrected.** If you are on 1.29.x, read § 1.30.0 first and this second;
137
+ if you are already on 1.30.0, this section is the whole delta.
138
+
139
+ ### Charts — the responsive `height` reaches the kinds it was written for
140
+
141
+ `ResponsiveChartHeight` (`{ base, sm?, md?, lg? }`) landed at 1.30.0 on `ChartFrame.height` alone.
142
+ `CartesianChart` and all nine kinds still declared `height?: number` and merely spread the value
143
+ through — and `basalt/hand-rolled-plot` forbids composing `ChartFrame` directly for a single-plot
144
+ cartesian chart, so the feature could not be reached from any compliant call site.
145
+ `MultiLine height={{ base: 200, sm: 260 }}` was a `tsc` error over a value that would have resolved
146
+ correctly at runtime.
147
+
148
+ Ten declarations are widened to `number | ResponsiveChartHeight` — `CartesianChart`, `MultiLine`,
149
+ `Bars`, `StackedArea`, `ZonedLine`, `BandStrip`, `MirroredBars`, `Heatmap`, `DualPanel`, `Donut` —
150
+ and `ResponsiveChartHeight` is exported from `./charts` so a consumer can name the type.
151
+ **Type-only, additive, no rendering moves**: a plain `number` behaves exactly as before, and the steps resolve
152
+ against the MEASURED container width (the same width the chart tier reads), never the viewport.
153
+
154
+ ### Charts — `legend.maxRows` wins under `fill` too, and the plot yields
155
+
156
+ **This one MOVES RENDERING for a chart that already sets `legend.maxRows` inside a `fill` frame.**
157
+ 1.30.0 promised an explicit `maxRows` "WINS OUTRIGHT" and delivered half of it: the tier default
158
+ stopped trimming the number, but `legendEntryCap`'s measured fit then ran `Math.min(fitted, caller)`
159
+ on top. In a docked panel — where `fill` is the norm and the row height sits near
160
+ `VX.minPlotHeight` — the fit is the binding constraint, so the documented escape was inert in
161
+ exactly the case it was restored for. Measured: a 7-entry legend in a 92–150px row rendered 2
162
+ entries at `maxRows` 3, 6 **and** 99, with five series drawn in colours nothing named.
163
+
164
+ The fit now resolves an ABSENT cap only. When a caller states a number on a `fill` band, the legend
165
+ takes the ENTRIES it asked for (`maxRows` counts entries, not rows — see § Unreleased) and
166
+ **`VX.minPlotHeight` stops being a floor** — the plot yields the height instead. Both things that used to trim the number are framework DEFAULTS (the tier's cap,
167
+ and a floor about the plot); the stated number is the only intent in the room.
168
+
169
+ - **Expect a taller legend and a shorter plot** anywhere you set `maxRows` on a docked/`fill` chart.
170
+ A number too large for the box now costs the plot visibly, in the frame you sized, rather than
171
+ being silently rolled back up.
172
+ - **Opt-out: drop `maxRows`.** With nothing stated the measured fit applies exactly as it did at
173
+ 1.30.0, bounded by the tier's default. That is the same setting as before this change.
174
+ - **Fixed-height frames are unaffected** — they grow around their legend and never entered the fit.
175
+
176
+ ### This file — the release-time rename is a script now
177
+
178
+ The `## Unreleased` → `## <version>` swap and its index column are performed by
179
+ `packages/basalt-ui/scripts/release-migrating.ts` in `prepareCmd`, committed through the same
180
+ `@semantic-release/git` assets list that keeps `llms.txt` current, gated by `--check` in the release
181
+ wrapper's preflight, and covered by tests. See this file's preamble for why the previous revision's
182
+ claim to have already done this was false. **Consumer-visible consequence:** the newest section in
183
+ an installed tarball carries its own version number. If it says `Unreleased`, file it.
184
+
185
+ **§ 1.30.0 § Guards carries a corrected number**, restated here because a published measurement
186
+ moved: meteo is 5 `control-outside-home` incumbents, not 0, and the fleet total is 34, not 29 — the
187
+ zero was a failed `npx --no-install oxlint` invocation read as "no findings". The four promotions to
188
+ `error` are unaffected and stand as shipped; only the extended C1 pair's count changed.
189
+
190
+ ## 1.30.0 — the chrome wave
67
191
 
68
192
  **Mostly CHROME, which removes and renames nothing: eight spacing numbers move, the mobile More
69
193
  surface becomes a compact popover instead of a bottom sheet, and the aside's phone pill takes the
@@ -116,6 +240,22 @@ through `useBasaltSpacing()`, deliberately — a Mantine spacing KEY would resol
116
240
  those numbers, for a consumer computing geometry that has to track `density` rather than pinning a
117
241
  literal. Additive; it was already the shell's own reader.
118
242
 
243
+ **READING the gutter is the other direction, and it is a different variable.** The paragraph above
244
+ states the WRITE consequence; the read one caught a consumer. `--vx-space-app-shell-inset` is a
245
+ single value (20) with no phone twin in the same var, while the shell's real gutter reaches Mantine
246
+ as the JS pair and lands in **`--app-shell-padding`**, which Mantine emits per breakpoint. So
247
+ full-bleed math (`margin-inline: calc(var(--…) * -1)`, a height budget subtracting the page inset)
248
+ must read `--app-shell-padding` — grepping for the basalt-prefixed token gets a number that is
249
+ correct by coincidence from `sm` up and wrong on a phone (20 against the real 8). Inside a
250
+ `BasaltShell`, read Mantine's var.
251
+
252
+ **Shell-less, the two `--vx-*` gutter vars ARE your lever**, and that is the case they were emitted
253
+ for — nothing else in the framework reads them, which is why they are the exception among the
254
+ JS-only `appShell*` entries. A provider-only app that had a hand-maintained `Container px` pair and a
255
+ matching negative-margin `.bleed` pair, restating the same two numbers in two files behind two media
256
+ queries, deletes both and reads `--vx-space-app-shell-inset{,-mobile}` instead. Only `BasaltShell`'s
257
+ own gutter is unreachable that way.
258
+
119
259
  **The mobile More surface is a compact POPOVER, not a bottom sheet**, and `MOBILE_MENU_MAX_DEFAULT`
120
260
  rises 6 → 12. `projectMobileNav` is unchanged in shape — the surface is still INFERRED from row
121
261
  count (0 drops the slot, 1 is a plain link, ≤ `menuMax` is a `menu`, past it a `sheet`) — but a
@@ -154,12 +294,90 @@ are not a `FilterSet`, so unlike `Filters (n)` there is no census to derive one
154
294
  bottom of the page — deliberate, pinned by tests, and invisible on the desktop it was authored
155
295
  on, so `PageAside` now says it once in dev. The remedy is to give that bar a row 2.
156
296
 
297
+ ### Dashboard — `StatGroup` and `WidgetGrid` key on the CONTAINER, and `cols={4}` goes 2-up at `sm`
298
+
299
+ **This is the item in 1.30.0 that can silently change a production layout, and the previous revision
300
+ of this section did not mention it at all.** Neither export changed shape; both changed where their
301
+ column law reads its width from.
302
+
303
+ - **The law now keys on the CONTAINER, not the viewport.** Each primitive renders its own
304
+ `container-type: inline-size` box around the grid, so the counts follow the width the row
305
+ ACTUALLY has. The shell moves that width with the viewport held still — a `PageAside` claiming its
306
+ 300px, the sidebar collapsing 256px → its 48px rail, your own split pane — and `@media` sees none
307
+ of it. Measured: a `PageAside` on a 1512px desktop left a KPI row ~956px wide, `@media` still
308
+ resolved `lg`, and four cells of 239px truncated their own values mid-word. **If you mount either
309
+ primitive inside an aside, a split pane or beside a collapsible sidebar, expect a column count to
310
+ drop where it used to overflow.** The old viewport law survives verbatim under
311
+ `@supports not (container-type: inline-size)` for pre-2023 browsers, so there are two laws in the
312
+ file and exactly one is ever live.
313
+ - **`StatGroup cols={4}` now takes TWO columns at `sm`, not three.** The general rule is still
314
+ `min(cols, 3)`; `4` is the exception, because three columns leave a four-KPI row as 3 + 1 — one
315
+ orphan cell against two thirds of empty track. `2`, `3` and `5` are unchanged. The full law is
316
+ `base 2 → sm min(cols, 3), except 4 → 2 → lg cols`.
317
+ - **No opt-out, and none is offered**: `cols` is the DESKTOP count and a responsive object is
318
+ deliberately not forwarded (that seam is what let five call sites in one app disagree). If you
319
+ need a different law, you are outside these primitives.
320
+
321
+ Worth checking while you are here: `WidgetGrid` and `StatGroup` exist to own exactly the
322
+ `SimpleGrid cols={{ base: 1, sm: 2, lg: 3 }}` a dashboard hand-writes per page, and the container
323
+ fix only reaches the rows that adopted them. In the reference consumer, five KPI rows still
324
+ hand-roll the law over raw Mantine `Card` and no guard names it — a `SimpleGrid` of card-shaped
325
+ children is invisible to every rule. Grep for `SimpleGrid` before concluding the wave reached you.
326
+
327
+ ### Charts — a responsive `height`, and the legend escape 1.30.0 promised
328
+
329
+ Both of these landed in 1.30.0 with no row here, and both were only partly reachable. **Read this
330
+ section against 1.30.1, not 1.30.0** — the § Unreleased entries above are what makes them usable.
331
+
332
+ - **`height` accepts `{ base, sm?, md?, lg? }`** as well as a plain number, resolved against the
333
+ chart's MEASURED container width (the same width the tier reads), not the viewport. In 1.30.0 the
334
+ widened type reached `ChartFrame` alone, while `CartesianChart` and all nine kinds still declared
335
+ `height?: number` and merely spread it through — and `basalt/hand-rolled-plot` forbids composing
336
+ `ChartFrame` directly for a single-plot cartesian chart, so the feature was unreachable from any
337
+ compliant call site. It was type-only: the object always resolved correctly at runtime.
338
+ - **An explicit `legend={{ maxRows: n }}` beats the phone tier's default cap.** The tier keys on the
339
+ measured box, so a 380px inspector panel on a 1440px desktop IS "a phone" and its two-row default
340
+ rolled a six-series legend up to `+4 more` with no way to say no. `margin` and `xLabelRotate`
341
+ always had that escape; the legend did not. Under `fill` a measured cap still applies on top — see
342
+ § Unreleased for what that actually costs, because "can still roll up FURTHER" understated it.
343
+
344
+ ### Toolchain — the shipped lefthook preset's `check-theme`, and what it does NOT fix
345
+
346
+ **The one item in this release with a known-broken incumbent state, and it had no row at all.** The
347
+ preset is `extends:`-ed, which means it auto-updates unread — so if you hand-patched around the
348
+ 1.29.0 breakage, nothing else will tell you to re-examine that patch.
349
+
350
+ **What broke in 1.29.0** (two things, in one release): the CLI resolver stopped ascending to a
351
+ config-carrying ancestor — since then it is `BASALT_CWD`, else the invocation cwd, and it infers
352
+ nothing — while the preset's default bin was `bunx --no-install basalt-ui`, which resolves to
353
+ nothing at a repo root under bun's isolated linker. Lefthook runs commands at the REPO ROOT, so for
354
+ every consumer whose `basalt` config is not at the repo root the hook was a hard `0 files scanned`
355
+ failure. (It keys on where the **config** lives, not where the app lives: an app at `apps/web` with
356
+ its `basalt` block, manifest and `lefthook.yml` at the root was never affected.)
357
+
358
+ **What 1.30.0 fixes is ONE of the two.** The default bin is now
359
+ `${BASALT_BIN:-${BASALT_CWD:+$BASALT_CWD/}node_modules/.bin/basalt-ui}` — the local bin of the
360
+ package the guard runs FOR, failing with the path it looked for instead of a resolver error — and
361
+ the preset gained `root:` in its list of merging seams plus a monorepo recipe at the bottom of the
362
+ file. **The resolver is untouched.** So:
363
+
364
+ - **If you set `BASALT_CWD`, keep it.** Deleting the `env:` block is the natural reading of "the
365
+ preset's `check-theme` was fixed" and it silently un-gates the hook again: with no `BASALT_CWD`
366
+ the guard is back to scanning a config-less root. Only the `BASALT_BIN` half may now be redundant.
367
+ - **If you set `BASALT_BIN` alone**, it still wins outright and nothing changes.
368
+ - **If you spell the commands out with `root: '<pkg>/'`** rather than extending the preset — the
369
+ sanctioned monorepo recipe — the new default never runs and this is a no-op for you.
370
+ - **`basalt-ui doctor` reads the MERGED config** (`lefthook dump`), so it is what tells you whether
371
+ the result actually gates. The file's own comments are accurate; check against them, not against
372
+ a summary.
373
+
157
374
  ### Guards — four rules promote to `error`, and the C1 pair does not
158
375
 
159
376
  Every one of these six entries said in its own `why` that this release "is when the incumbent count
160
377
  across argo, linewatch, image-share, rb, image-gen and the playground is re-measured" (law C16).
161
378
  That measurement was taken 2026-09-09, with all seven consumers freshly migrated to 1.29.2 and
162
- basalt built from `master`, by running `npx oxlint .` in each repo and counting by rule id:
379
+ basalt built from `master`, by running `npx oxlint .` in each repo and counting by rule id — a
380
+ method that failed open in one of them, see the correction under the table:
163
381
 
164
382
  | Rule | argo | image-gen | image-share | rb | linewatch | meteo | obsidian | playground | Verdict |
165
383
  | ----------------------------------------------------------------- | ---- | --------- | ----------- | --- | --------- | ----- | -------- | ---------- | ------------ |
@@ -167,24 +385,60 @@ basalt built from `master`, by running `npx oxlint .` in each repo and counting
167
385
  | `basalt/forms-field-key` | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | → `error` |
168
386
  | `basalt/query-fn-unwrap` | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | → `error` |
169
387
  | `basalt/bound-control-outside-home` | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | → `error` |
170
- | `basalt/control-outside-home` + `raw-selection-control` (one law) | 2 | 10 | 6 | 8 | 0 | 0 | 0 | 3 | stays `warn` |
388
+ | `basalt/control-outside-home` + `raw-selection-control` (one law) | 2 | 10 | 6 | 8 | 0 | 5 | 0 | 3 | stays `warn` |
389
+
390
+ **Corrected at 1.30.1: meteo is 5, not 0 — the fleet total is 34, not 29.** The zero published at
391
+ 1.30.0 was an artifact: meteo has no local oxlint binary, so `npx --no-install oxlint` failed there
392
+ with a package error and the counting pipeline read that failure as "no findings" — the same
393
+ silent-zero shape this file already warns about for `check-theme`'s fabricated roots, arrived at from the other side. The
394
+ five are real (`display-controls.tsx:258`, `stack-editor.tsx:301/323/337`, `forecast-tab.tsx:151`),
395
+ and re-measuring with a guaranteed-present binary is what found them. **The DECISION is unchanged**:
396
+ all four promoted rules re-measured at zero in every repo including meteo, so those four promotions
397
+ stand exactly as shipped — only the extended pair's count moved. A count taken through a repo's own
398
+ `lint` script rather than a bare oxlint invocation is not a measurement; meteo's `lint` is
399
+ `basalt-ui check-theme` alone and never runs oxlint at all.
171
400
 
172
401
  **The four promotions cost nothing to take.** They were measured at zero, in every consumer, before
173
402
  being flipped — which is the entire point of a grace window: it is a period in which the count is
174
403
  allowed to fall to zero on its own, not a timer that fires regardless. If one of them fires in your
175
404
  app, it is finding something none of the fleet had, and the message names the remedy.
176
405
 
177
- **The C1 pair is extended to 1.31.0, and the reason is not the count.** 29 incumbents is a large
178
- number, but the argument is that **this release is the first in which either lane names a home those
179
- 29 can reach.** Every home both messages listed was a shell slot — `PageBar` / `Section` /
180
- `WidgetHeader` — so a consumer mounting `BasaltProvider` and no `BasaltShell` had no reachable home
181
- at all: image-gen is a Tauri window with a hand-rolled header and carries 10 of the 29 by itself,
182
- and `basalt/bound-control-outside-home` closed the `ViewTabs` escape it would otherwise have taken.
183
- This release adds the missing sentence to both messages — a `PageBar` outside a shell renders in
184
- flow, sticky, with its own `title`, which is what `PageBar` has always actually done — so the
185
- remedy exists from now, not before. Promoting a rule to `error` in the same minor that first makes
186
- it satisfiable hands you zero minors to act on the answer. **1.31.0 is when those 29 are measured
187
- against this number.**
406
+ **The C1 pair is extended to 1.31.0, and the reason is not the count.** The argument is that
407
+ **until this release, one class of consumer had no reachable home at all.** Every home both messages
408
+ listed was a shell slot — `PageBar` / `Section` / `WidgetHeader` — so an app mounting
409
+ `BasaltProvider` and no `BasaltShell` was being told to move a control somewhere it could not
410
+ render one. This release adds the missing sentence to both messages: a `PageBar` outside a shell
411
+ renders in flow, sticky, with its own `title`, which is what `PageBar` has always actually done.
412
+ Promoting a rule to `error` in the same minor that first makes it satisfiable hands you zero minors
413
+ to act on the answer.
414
+
415
+ **What that sentence does and does not buy, measured rather than assumed** — the 1.30.0 revision of
416
+ this paragraph rested the extension on "image-gen is a Tauri window with a hand-rolled header and
417
+ carries 10 of the 29 by itself" (the count as
418
+ published), implying a shell-less `PageBar` addresses those 10. It addresses
419
+ **zero** of them. image-gen's header `SegmentedControl` was already waived and is not in the count;
420
+ the real 10 are labelled `Select`/`SegmentedControl` form fields, a `Chip.Group` role tagger and a
421
+ canvas preview-mode switch. The remedy that moves that number is **`basalt-ui/forms`** — `FormRow`
422
+ and `FormGroup` both silence the rule, verified against a bare labelled `Select` — and adopting it
423
+ is a nine-site change that moves each label off the input onto the row. The extension still stands;
424
+ the reason is this:
425
+
426
+ - **A shell-less SINGLE-page app is closed by `PageBar`** — one page, so every control is a page
427
+ control and row 2 is the honest home. That is the whole of linewatch.
428
+ - **A shell-less app whose switcher is primary NAVIGATION is not.** `PageBar`'s `tabs` models a
429
+ page's sub-views; basalt models top-level nav only through `BasaltShell`, and `BasaltShell` is
430
+ all-or-nothing — sidebar plus header plus scrollport — which a 100vh Tauri window with per-view
431
+ keep-alive scrollports cannot take. The missing primitive there is a shell-less top-level nav,
432
+ not a page bar.
433
+ - **A shell-FUL app was never blocked on reachability at all**, and 14 of the 34 are in one (rb and
434
+ image-share both mount `BasaltShell`). Their blocker is law C1's other half: `PageBar.filters`
435
+ accepts `FilterSet` descendants only, so the honest fix is porting hand-rolled `value`/`onChange`
436
+ clusters onto bound `FieldHandle`s plus a `createSearchStore` — a page-shape change per page, and
437
+ the 1.30.0 sentence made it no cheaper.
438
+
439
+ **1.31.0 is when the 34 are re-measured — with a bare oxlint invocation in every repo, and split by
440
+ whether the app mounts a shell.** The raw count is the wrong number to promote on; "how many are in
441
+ an app that already had a home" is the one that says what an `error` would cost.
188
442
 
189
443
  Riding along, and the reason a single waiver now works: `control-outside-home` (the AST lane) and
190
444
  `raw-selection-control` (the text lane) are one law with two rule ids, and until now
@@ -17,7 +17,7 @@ export { ChartCursorScope, type ChartCursorScopeProps, useCursorState } from './
17
17
  export { createCursorStore, globalCursorStore, type CursorState, type CursorStore, } from './cursor/store.js';
18
18
  export { type SeriesMark, type SeriesDash, type SeriesCurve, curveFor, type SeriesRole, type LegendPlacement, type ChartLegendConfig, type SeriesStyle, type ChartSeries, deriveLegend, deriveTooltipRows, } from './series.js';
19
19
  export { CartesianChart, resolveAxisDomain, type CartesianChartProps, type CartesianTooltipConfig, type CartesianTooltipRowContext, type AxisConfig, type PlotContext, } from './primitives/CartesianChart.js';
20
- export { ChartFrame, type ChartFrameProps, type ChartFrameLegend, type PlotRect, resolveLegend, } from './primitives/ChartFrame.js';
20
+ export { ChartFrame, type ChartFrameProps, type ChartFrameLegend, type ResponsiveChartHeight, type PlotRect, resolveLegend, } from './primitives/ChartFrame.js';
21
21
  export { ChartCenter, type ChartCenterProps, ChartPending, type ChartPendingProps, ChartEmpty, type ChartEmptyProps, ChartError, type ChartErrorProps, type ChartState, type ResolvedChartState, resolveChartState, } from './primitives/ChartPending.js';
22
22
  export { useChartTier, useChartTierMetrics, chartTierMetrics, resolveChartTier, type ChartTier, type ChartTierMetrics, } from './primitives/chart-tier.js';
23
23
  export { Crosshair, SeriesDot } from './primitives/Crosshair.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/charts/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/charts/index.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import type { BasaltProps } from '../../common/props.js';
2
2
  import type { ChartMargin } from '../../tokens/index.js';
3
3
  import type { CursorResolution } from '../cursor/resolve.js';
4
4
  import type { BandFold, BandTooltipConfig } from '../hooks/useBandPlot.js';
5
+ import type { ResponsiveChartHeight } from '../primitives/ChartFrame.js';
5
6
  import type { ChartState } from '../primitives/ChartPending.js';
6
7
  import type { ChartLegendConfig, SeriesStyle } from '../series.js';
7
8
  /**
@@ -72,9 +73,10 @@ export type BandStripProps<T> = BasaltProps & {
72
73
  series: readonly BandStripSeries<T>[];
73
74
  /** Which state each datum is in. */
74
75
  getBand: (d: T) => BandSpan;
75
- /** Fixed height in px, forwarded to `ChartFrame`. The band row gets whatever the measured
76
- * margins and the measured legend band leave. Default 240. */
77
- height?: number;
76
+ /** Height in px, or one per size step (`{ base, sm?, md?, lg? }`), forwarded to `ChartFrame`.
77
+ * The band row gets whatever the measured margins and legend band leave. Default 240.
78
+ * `ChartFrameProps.height` owns the law — steps resolve off the MEASURED width. */
79
+ height?: number | ResponsiveChartHeight;
78
80
  /** Fill the parent flex/grid cell's measured height instead of a fixed one. */
79
81
  fill?: boolean;
80
82
  /** X tick label formatter. Default `fmtAxisDate` (DD.MM). */
@@ -1 +1 @@
1
- {"version":3,"file":"BandStrip.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/BandStrip.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAYvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAI/D;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,WAAW,GAAG;IAC7C;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,GAAG,IAAI,CAAA;CACtC,CAAA;AAED,0FAA0F;AAC1F,MAAM,MAAM,QAAQ,GAAG;IACrB;;;;;;;;;OASG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,MAAM,CAAC,EAAE;QACP,iFAAiF;QACjF,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,uEAAuE;QACvE,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;CACF,CAAA;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,WAAW,GAAG;IAC5C,IAAI,EAAE,SAAS,CAAC,EAAE,CAAA;IAClB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAA;IACf;yFACqF;IACrF,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;IACtB;sCACkC;IAClC,MAAM,EAAE,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE,CAAA;IACrC,oCAAoC;IACpC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAA;IAC3B;kEAC8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+EAA+E;IAC/E,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,6DAA6D;IAC7D,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IACjC,mDAAmD;IACnD,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,CAAA;IAC/E,4EAA4E;IAC5E,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IAClB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;IACtC,MAAM,CAAC,EAAE,iBAAiB,GAAG,KAAK,CAAA;IAClC;;;;;wEAKoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAC7B;iDAC6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;4FACwF;IACxF,KAAK,CAAC,EAAE,UAAU,CAAA;CACnB,CAAA;AA2CD;;;;;;;;;;;;;GAaG;AACH,iBAAS,cAAc,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,+BAwBlD;AAwQD,eAAO,MAAM,SAAS,EAAoB,OAAO,cAAc,CAAA"}
1
+ {"version":3,"file":"BandStrip.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/BandStrip.tsx"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import type { BasaltProps } from '../../common/props.js';
2
2
  import type { CursorResolution } from '../cursor/resolve.js';
3
3
  import type { ChartMargin } from '../../tokens/index.js';
4
4
  import type { AxisConfig, CartesianTooltipConfig } from '../primitives/CartesianChart.js';
5
+ import type { ResponsiveChartHeight } from '../primitives/ChartFrame.js';
5
6
  import type { ZoneSpec } from '../primitives/ZoneRects.js';
6
7
  import type { ChartState } from '../primitives/ChartPending.js';
7
8
  import type { ChartLegendConfig, SeriesCurve } from '../series.js';
@@ -53,8 +54,9 @@ export type BarsRefLine = {
53
54
  };
54
55
  export type BarsProps<T> = BasaltProps & {
55
56
  data: T[];
56
- /** Fixed height in pixels, forwarded to `CartesianChart`. Default 240. */
57
- height?: number;
57
+ /** Height in px, or one per size step (`{ base, sm?, md?, lg? }`). Default 240. Forwarded
58
+ * unchanged; `ChartFrameProps.height` owns the law — steps resolve off the MEASURED width. */
59
+ height?: number | ResponsiveChartHeight;
58
60
  chartId: string;
59
61
  getX: (d: T) => string;
60
62
  /** Generic value accessor — given a data point and a bar/line key, returns the value or null. */
@@ -1 +1 @@
1
- {"version":3,"file":"Bars.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/Bars.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Bars.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/Bars.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import type { BasaltProps } from '../../common/props.js';
3
+ import type { ResponsiveChartHeight } from '../primitives/ChartFrame.js';
3
4
  import type { ChartState } from '../primitives/ChartPending.js';
4
5
  import type { SeriesKey } from '../../register.js';
5
6
  /**
@@ -13,8 +14,9 @@ export type DonutDatum<K extends string = SeriesKey> = {
13
14
  };
14
15
  export type DonutProps<K extends string = SeriesKey> = BasaltProps & {
15
16
  data: DonutDatum<K>[];
16
- /** Fixed height in pixels, forwarded to the internal `ChartFrame`. Default 240. */
17
- height?: number;
17
+ /** Height in px, or one per size step (`{ base, sm?, md?, lg? }`). Default 240. Forwarded
18
+ * unchanged; `ChartFrameProps.height` owns the law — steps resolve off the MEASURED width. */
19
+ height?: number | ResponsiveChartHeight;
18
20
  colorForKey: (key: K) => string;
19
21
  formatValue: (v: number) => string;
20
22
  seriesLabel?: (key: string) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"Donut.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/Donut.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,OAAO,CAAA;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAG5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C;;;;GAIG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,IAAI;IAAE,GAAG,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhF,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,IAAI,WAAW,GAAG;IACnE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAA;IACrB,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAA;IAC/B,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAClC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,aAAa,CAAC,EAAE,SAAS,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;4FACwF;IACxF,KAAK,CAAC,EAAE,UAAU,CAAA;CACnB,CAAA;AAED;;;;;;;;GAQG;AACH,iBAAS,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,+BAqCrE;AAoKD,eAAO,MAAM,KAAK,EAAgB,OAAO,UAAU,CAAA"}
1
+ {"version":3,"file":"Donut.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/Donut.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,OAAO,CAAA;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAG5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C;;;;GAIG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,IAAI;IAAE,GAAG,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhF,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,IAAI,WAAW,GAAG;IACnE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAA;IACrB;kGAC8F;IAC9F,MAAM,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAAA;IACvC,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAA;IAC/B,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAClC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,aAAa,CAAC,EAAE,SAAS,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;4FACwF;IACxF,KAAK,CAAC,EAAE,UAAU,CAAA;CACnB,CAAA;AAED;;;;;;;;GAQG;AACH,iBAAS,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,+BAqCrE;AAoKD,eAAO,MAAM,KAAK,EAAgB,OAAO,UAAU,CAAA"}
@@ -1,12 +1,14 @@
1
1
  import type { BasaltProps } from '../../common/props.js';
2
+ import type { ResponsiveChartHeight } from '../primitives/ChartFrame.js';
2
3
  import type { ZoneSpec } from '../primitives/ZoneRects.js';
3
4
  import type { ChartState } from '../primitives/ChartPending.js';
4
5
  import type { CursorResolution } from '../cursor/resolve.js';
5
6
  import type { ChartLegendConfig, ChartSeries } from '../series.js';
6
7
  export type DualPanelProps<T> = BasaltProps & {
7
8
  data: T[];
8
- /** Fixed height in pixels, forwarded to the internal `ChartFrame`. Default 240. */
9
- height?: number;
9
+ /** Height in px, or one per size step (`{ base, sm?, md?, lg? }`). Default 240. Forwarded
10
+ * unchanged; `ChartFrameProps.height` owns the law — steps resolve off the MEASURED width. */
11
+ height?: number | ResponsiveChartHeight;
10
12
  chartId: string;
11
13
  getX: (d: T) => string;
12
14
  /** X tick label formatter. Default `fmtAxisDate` (DD.MM) — same default `CartesianChart` uses,
@@ -1 +1 @@
1
- {"version":3,"file":"DualPanel.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/DualPanel.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DualPanel.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/DualPanel.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import type { BasaltProps } from '../../common/props.js';
3
+ import type { ResponsiveChartHeight } from '../primitives/ChartFrame.js';
3
4
  import type { ChartState } from '../primitives/ChartPending.js';
4
5
  /** A single resolved heatmap cell — the unit the tooltip and hover operate on. */
5
6
  type HeatmapCell = {
@@ -9,8 +10,10 @@ type HeatmapCell = {
9
10
  };
10
11
  export type HeatmapProps<T> = BasaltProps & {
11
12
  data: T[];
12
- /** Fixed height in pixels. Used when neither `aspectRatio` nor `fill` is set. Default 240. */
13
- height?: number;
13
+ /** Height in px, or one per size step (`{ base, sm?, md?, lg? }`). Used when neither
14
+ * `aspectRatio` nor `fill` is set. Default 240. `ChartFrameProps.height` owns the law —
15
+ * steps resolve off the MEASURED width. */
16
+ height?: number | ResponsiveChartHeight;
14
17
  /** height = Math.round(containerWidth / aspectRatio). Ignored when `fill` is set. */
15
18
  aspectRatio?: number;
16
19
  /** Fill the parent flex/grid cell's measured height instead of a fixed/derived one. */
@@ -1 +1 @@
1
- {"version":3,"file":"Heatmap.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/Heatmap.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,OAAO,CAAA;AAGpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AASrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAK5D,kFAAkF;AAClF,KAAK,WAAW,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAK9D,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,WAAW,GAAG;IAC1C,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uFAAuF;IACvF,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,4DAA4D;IAC5D,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;IACxB,+DAA+D;IAC/D,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;IACxB,yCAAyC;IACzC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;IAC1B,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2DAA2D;IAC3D,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAClD,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uCAAuC;IACvC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IACnC,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAClC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAClC,iEAAiE;IACjE,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,SAAS,CAAA;IAChD,2EAA2E;IAC3E,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACrC,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;4FACwF;IACxF,KAAK,CAAC,EAAE,UAAU,CAAA;CACnB,CAAA;AAoCD;;;;;;;;;;;;;GAaG;AACH,iBAAS,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,+BAyB9C;AAkND,eAAO,MAAM,OAAO,EAAkB,OAAO,YAAY,CAAA"}
1
+ {"version":3,"file":"Heatmap.d.ts","sourceRoot":"","sources":["../../../src/charts/kinds/Heatmap.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,OAAO,CAAA;AAGpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAQrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAK5D,kFAAkF;AAClF,KAAK,WAAW,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAK9D,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,WAAW,GAAG;IAC1C,IAAI,EAAE,CAAC,EAAE,CAAA;IACT;;+CAE2C;IAC3C,MAAM,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAAA;IACvC,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,uFAAuF;IACvF,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,4DAA4D;IAC5D,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;IACxB,+DAA+D;IAC/D,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;IACxB,yCAAyC;IACzC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAA;IAC1B,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2DAA2D;IAC3D,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAClD,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uCAAuC;IACvC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IACnC,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAClC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAClC,iEAAiE;IACjE,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,SAAS,CAAA;IAChD,2EAA2E;IAC3E,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACrC,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;4FACwF;IACxF,KAAK,CAAC,EAAE,UAAU,CAAA;CACnB,CAAA;AAoCD;;;;;;;;;;;;;GAaG;AACH,iBAAS,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,+BAyB9C;AAkND,eAAO,MAAM,OAAO,EAAkB,OAAO,YAAY,CAAA"}