@godxjp/ui 32.12.0 → 32.13.1

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/DESIGN.md CHANGED
@@ -202,7 +202,7 @@ A list whose rows are decisions. Show requester, target, reason, submitted time;
202
202
 
203
203
  1. Pick the archetype, call `get_exemplar` and build from that screen, not from memory.
204
204
  2. `npx @godxjp/ui audit <files>` — zero errors.
205
- 3. `npx @godxjp/ui visual-audit <url> <routes>` — runs every route at 320, 390, 768, 1024, 1280 and 844×390 (landscape phone) and measures what a screenshot glance misses: clipped or squeezed controls (WCAG 1.4.10 has two halves — no two-way scrolling AND no lost information; page overflow alone checks only the first), compact search, avatar-only identity, editor inset, action count and target size, rail and search keylines, tiny tracked capitals. Zero machine failures at every width; an "unmapped" result is not a pass. Signed-in routes: `--storage-state state.json` (Playwright storageState). WCAG 1.4.12 / 1.4.4 cells: `--text-spacing` / `--text-zoom 200` (add `--screenshots DIR`) — each reports its geometry delta against the base render, and a zero delta is "override not applied", not a pass.
205
+ 3. `npx @godxjp/ui visual-audit <url> <routes>` — runs every route at 320, 390, 768, 1024, 1280 and 844×390 (landscape phone) and measures what a screenshot glance misses: clipped or squeezed controls (WCAG 1.4.10 has two halves — no two-way scrolling AND no lost information; page overflow alone checks only the first), compact search, avatar-only identity, editor inset, action count and target size, rail and search keylines, tiny tracked capitals. Zero machine failures at every width; an "unmapped" result is not a pass. Signed-in routes: `--storage-state state.json` (Playwright storageState). WCAG 1.4.12 / 1.4.4 cells: `--text-spacing` / `--text-zoom 200` (add `--screenshots DIR`) — each reports its geometry delta against the base render, and a zero delta is "override not applied", not a pass. Visible text that did not take the override is listed in `notTaken` (selector + text) and fails the cell as "override partially applied".
206
206
  4. Inspect every screenshot at every width, region by region — top bar, page header, body, aside or rail, menus and drawers — against the checklist the report prints. A region you were told not to change is still inspected; a defect there becomes an issue, not a silent pass.
207
207
  5. No top-N and no round cap. Stop only when every width has zero machine failures and every checklist row is pass or a written N/A.
208
208
  6. The builder does not accept its own screen. Report "probes passed; independent acceptance pending" with the report JSON, the screenshots per width and the checklist; acceptance comes from someone who did not build it (a person, or a separate agent given only the build and the artifacts). Never call a screen done on self-review.
package/README.md CHANGED
@@ -18,7 +18,7 @@ npm i @godxjp/ui
18
18
 
19
19
  <!-- agent-catalog-counts:start -->
20
20
 
21
- The catalog — 162 components, 2204 tokens, 43 cardinal rules — is published in two forms from one
21
+ The catalog — 162 components, 2210 tokens, 43 cardinal rules — is published in two forms from one
22
22
  source. **Entry point for either: [`AGENTS.md`](AGENTS.md).**
23
23
  <!-- agent-catalog-counts:end -->
24
24
 
@@ -56,7 +56,7 @@ static files straight from this public repo — no hosting, no deploy step:
56
56
  | [`agent/components-index.json`](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/components-index.json) | 48 KB | all 162 as name + group + tagline — **fetch this first** |
57
57
  | [`agent/components/<Name>.json`](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/components/Select.json) | 1 KB–37 KB | one file per component, each with its `importPath` — **this is the route to take** |
58
58
  | [`agent/components.json`](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/components.json) | 1.2 MB | all 162 entries in one file — most URL fetchers truncate this silently; prefer the per-component files |
59
- | [`agent/tokens.json`](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/tokens.json) | 849 KB | all 2204 design tokens, their values and why they exist |
59
+ | [`agent/tokens.json`](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/tokens.json) | 850 KB | all 2210 design tokens, their values and why they exist |
60
60
  | [`agent/vocabulary.json`](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/vocabulary.json) | 7 KB | the controlled prop vocabulary |
61
61
  | [`agent/rules.json`](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/rules.json) | 21 KB | the 43 cardinal rules |
62
62
  <!-- prettier-ignore-end -->
package/agent/DESIGN.md CHANGED
@@ -202,7 +202,7 @@ A list whose rows are decisions. Show requester, target, reason, submitted time;
202
202
 
203
203
  1. Pick the archetype, call `get_exemplar` and build from that screen, not from memory.
204
204
  2. `npx @godxjp/ui audit <files>` — zero errors.
205
- 3. `npx @godxjp/ui visual-audit <url> <routes>` — runs every route at 320, 390, 768, 1024, 1280 and 844×390 (landscape phone) and measures what a screenshot glance misses: clipped or squeezed controls (WCAG 1.4.10 has two halves — no two-way scrolling AND no lost information; page overflow alone checks only the first), compact search, avatar-only identity, editor inset, action count and target size, rail and search keylines, tiny tracked capitals. Zero machine failures at every width; an "unmapped" result is not a pass. Signed-in routes: `--storage-state state.json` (Playwright storageState). WCAG 1.4.12 / 1.4.4 cells: `--text-spacing` / `--text-zoom 200` (add `--screenshots DIR`) — each reports its geometry delta against the base render, and a zero delta is "override not applied", not a pass.
205
+ 3. `npx @godxjp/ui visual-audit <url> <routes>` — runs every route at 320, 390, 768, 1024, 1280 and 844×390 (landscape phone) and measures what a screenshot glance misses: clipped or squeezed controls (WCAG 1.4.10 has two halves — no two-way scrolling AND no lost information; page overflow alone checks only the first), compact search, avatar-only identity, editor inset, action count and target size, rail and search keylines, tiny tracked capitals. Zero machine failures at every width; an "unmapped" result is not a pass. Signed-in routes: `--storage-state state.json` (Playwright storageState). WCAG 1.4.12 / 1.4.4 cells: `--text-spacing` / `--text-zoom 200` (add `--screenshots DIR`) — each reports its geometry delta against the base render, and a zero delta is "override not applied", not a pass. Visible text that did not take the override is listed in `notTaken` (selector + text) and fails the cell as "override partially applied".
206
206
  4. Inspect every screenshot at every width, region by region — top bar, page header, body, aside or rail, menus and drawers — against the checklist the report prints. A region you were told not to change is still inspected; a defect there becomes an issue, not a silent pass.
207
207
  5. No top-N and no round cap. Stop only when every width has zero machine failures and every checklist row is pass or a written N/A.
208
208
  6. The builder does not accept its own screen. Report "probes passed; independent acceptance pending" with the report JSON, the screenshots per width and the checklist; acceptance comes from someone who did not build it (a person, or a separate agent given only the build and the artifacts). Never call a screen done on self-review.
@@ -3,7 +3,7 @@
3
3
  You are about to write code against a design system you did not author. This file is the whole
4
4
  contract. Read it before you write JSX.
5
5
 
6
- **This catalog describes `@godxjp/ui` 32.12.0.** If the project you are editing has a different
6
+ **This catalog describes `@godxjp/ui` 32.13.1.** If the project you are editing has a different
7
7
  version in its `package.json`, read the pinned catalog for THAT version instead
8
8
  (`…/v<their-version>/agent/…`). A catalog newer than the installed package describes props that do
9
9
  not exist yet; older, and it hides props that do. Neither failure announces itself.
@@ -61,10 +61,10 @@ screen anatomy, the visual target the rules below do not give you. Then fetch in
61
61
  its `importPath`, and its examples. Fetch only the handful you picked in step 1.
62
62
  3. `rules.json` — 43 cardinal rules. The ones about raw HTML and hardcoded colour are not
63
63
  style advice.
64
- 4. `tokens.json` — 2204 design tokens, each tagged with its `tier`. **If you were handed a
64
+ 4. `tokens.json` — 2210 design tokens, each tagged with its `tier`. **If you were handed a
65
65
  brand, read the 211 `foundation` entries first** — `--primary`, `--background`,
66
66
  `--radius`, `--font-size-base` are the handful everything else derives from. The
67
- 1880 `component` entries are per-part knobs; reach for one only when a role is
67
+ 1886 `component` entries are per-part knobs; reach for one only when a role is
68
68
  right everywhere except one component.
69
69
  5. `anti-ai-tells.json` — 35 shapes that make generated UI look generated, each with the
70
70
  fix. Read before you reach for a gradient hero or a wall of coloured chips.
@@ -150,7 +150,7 @@ has stopped following the brand.
150
150
  |---|---|---|---|
151
151
  | `foundation` | 211 | the seeds — `--primary`, `--background`, `--foreground`, `--radius`, `--font-size-base`, `--shadow-color`. Everything below is derived from these | **yes — this is the main road.** The default `--primary` is a neutral placeholder: set it (`:root { --primary: <H> <S>% <L>%; }`, HSL components, no `hsl()` wrapper) or import a theme preset such as `@godxjp/ui/themes/godx.css` |
152
152
  | `semantic` | 113 | named roles that follow the seeds — `--ring`, `--text-link`, `--primary-hover`, `--overlay-background` | only when the seed is right and ONE role must differ. That role then stops following a later brand change |
153
- | `component` | 1880 | per-part knobs, `--{component}-{part}-{property}` | rarely. Most are declared `initial` with the real default at the call site — deliberate, so a scoped override re-resolves instead of freezing at `:root` |
153
+ | `component` | 1886 | per-part knobs, `--{component}-{part}-{property}` | rarely. Most are declared `initial` with the real default at the call site — deliberate, so a scoped override re-resolves instead of freezing at `:root` |
154
154
 
155
155
  A token whose `value` is `initial` is not empty and not broken: `initial` is the guaranteed-invalid
156
156
  value, so the real default is computed where the element paints it. Set it and yours wins.
@@ -209,7 +209,7 @@
209
209
  "tagline": "The standalone WAI-ARIA tree view on a page (antd `Tree` / `DirectoryTree`) — nested `treeData`, a disclosure triangle per branch, roving-tabindex arrow navigation, optional tri-state checkboxes, async `loadData` and `draggable` reorder/reparent (antd `onDrop`). Reach for it whenever nodes expand, collapse or are navigated by keyboard; TreeSelect is the same hierarchy inside a Popover.",
210
210
  "usage": [
211
211
  "DO name the tree — pass `aria-label` (through your own `t()`) or `aria-labelledby`. A tree with no name is an unlabelled landmark for every screen reader user.",
212
- "DO rely on Tree for a cut label (gh#1308): a label that is actually truncated gets its full text as a `title` and unfolds while its row holds keyboard focus (not in a windowed tree, whose rows share one height — the `title` stays). No `titleRender` wrapper with a hand-set `title` is needed; one you set is kept.",
212
+ "DO rely on Tree for a cut label (gh#1308): a label that is actually truncated gets its full text as a `title` and unfolds while its row holds keyboard focus (not in a windowed tree, whose rows share one height — the `title` stays). It is re-measured when a label's box, the tree's width or the loaded fonts change — text spacing (WCAG 1.4.12) or a late web font included (gh#1318). No `titleRender` wrapper with a hand-set `title` is needed; one you set is kept.",
213
213
  "DO keep SELECTION and CHECKS apart: `value`/`onValueChange` is which node is open in the detail pane; `checkedValues`/`onCheckedValuesChange` is which nodes are ticked. They are two axes, exactly as in antd — never drive one from the other.",
214
214
  "DO keep SELECTION and EXPANSION apart too — this is the THIRD axis and the one gh#910 tripped on. `onValueChange` says which node a detail pane should show; `onExpandedValuesChange` says which branches are unfolded. A sibling pane listens to the first and ignores the second, so unfolding a branch cannot reload it. If your pane reloads when a branch opens, it is being driven from the wrong event — not from a missing feature.",
215
215
  "DO let the keyboard work: the tree ships the full APG contract (Up/Down through visible nodes, Right expands then descends, Left collapses then climbs, Home/End, Enter/Space, `*` to expand the current level, type-ahead). Do not add your own key handling on top.",
@@ -11433,7 +11433,7 @@
11433
11433
  "tagline": "The standalone WAI-ARIA tree view on a page (antd `Tree` / `DirectoryTree`) — nested `treeData`, a disclosure triangle per branch, roving-tabindex arrow navigation, optional tri-state checkboxes, async `loadData` and `draggable` reorder/reparent (antd `onDrop`). Reach for it whenever nodes expand, collapse or are navigated by keyboard; TreeSelect is the same hierarchy inside a Popover.",
11434
11434
  "usage": [
11435
11435
  "DO name the tree — pass `aria-label` (through your own `t()`) or `aria-labelledby`. A tree with no name is an unlabelled landmark for every screen reader user.",
11436
- "DO rely on Tree for a cut label (gh#1308): a label that is actually truncated gets its full text as a `title` and unfolds while its row holds keyboard focus (not in a windowed tree, whose rows share one height — the `title` stays). No `titleRender` wrapper with a hand-set `title` is needed; one you set is kept.",
11436
+ "DO rely on Tree for a cut label (gh#1308): a label that is actually truncated gets its full text as a `title` and unfolds while its row holds keyboard focus (not in a windowed tree, whose rows share one height — the `title` stays). It is re-measured when a label's box, the tree's width or the loaded fonts change — text spacing (WCAG 1.4.12) or a late web font included (gh#1318). No `titleRender` wrapper with a hand-set `title` is needed; one you set is kept.",
11437
11437
  "DO keep SELECTION and CHECKS apart: `value`/`onValueChange` is which node is open in the detail pane; `checkedValues`/`onCheckedValuesChange` is which nodes are ticked. They are two axes, exactly as in antd — never drive one from the other.",
11438
11438
  "DO keep SELECTION and EXPANSION apart too — this is the THIRD axis and the one gh#910 tripped on. `onValueChange` says which node a detail pane should show; `onExpandedValuesChange` says which branches are unfolded. A sibling pane listens to the first and ignores the second, so unfolding a branch cannot reload it. If your pane reloads when a branch opens, it is being driven from the wrong event — not from a missing feature.",
11439
11439
  "DO let the keyboard work: the tree ships the full APG contract (Up/Down through visible nodes, Right expands then descends, Left collapses then climbs, Home/End, Enter/Space, `*` to expand the current level, type-ahead). Do not add your own key handling on top.",
package/agent/index.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "components": 162,
5
5
  "patterns": 24,
6
6
  "rules": 43,
7
- "tokens": 2204,
7
+ "tokens": 2210,
8
8
  "vocabulary": 14
9
9
  },
10
10
  "design": "https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/DESIGN.md",
@@ -54,19 +54,19 @@
54
54
  "note": "Pin to the tag that matches the @godxjp/ui version you installed. A catalog newer than your package describes props you do not have; older, and it hides props you do.",
55
55
  "read": {
56
56
  "live": "https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/index.json",
57
- "pinned": "https://raw.githubusercontent.com/godx-jp/godxjp-ui/v32.12.0/agent/index.json"
57
+ "pinned": "https://raw.githubusercontent.com/godx-jp/godxjp-ui/v32.13.1/agent/index.json"
58
58
  },
59
59
  "source": "mcp/src/data — the same data @godxjp/ui-mcp serves — plus the foundation and semantic token tiers, read from src/tokens/*.css",
60
60
  "start": "https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/START-HERE.md",
61
61
  "tokenTiers": {
62
62
  "component": "per-part knobs, --{component}-{part}-{property}; usually leave these alone",
63
63
  "counts": {
64
- "component": 1880,
64
+ "component": 1886,
65
65
  "foundation": 211,
66
66
  "semantic": 113
67
67
  },
68
68
  "foundation": "the seeds a consumer is invited to set — --primary, --background, --radius",
69
69
  "semantic": "named roles that follow the seeds — --ring, --text-link, --overlay-background"
70
70
  },
71
- "version": "32.12.0"
71
+ "version": "32.13.1"
72
72
  }
package/agent/llms.txt CHANGED
@@ -1,10 +1,10 @@
1
1
  # @godxjp/ui
2
2
 
3
- > A Japanese-enterprise React design system: 162 components, 2204 design tokens,
4
- > 43 cardinal rules. This file is the entry point for AI agents. Catalog version 32.12.0.
3
+ > A Japanese-enterprise React design system: 162 components, 2210 design tokens,
4
+ > 43 cardinal rules. This file is the entry point for AI agents. Catalog version 32.13.1.
5
5
 
6
6
  If your client can run a process, do not read these files — run the MCP server instead
7
- (`npx @godxjp/ui-mcp@32.12.0`). It is searchable and version-locked. These files exist for agents
7
+ (`npx @godxjp/ui-mcp@32.13.1`). It is searchable and version-locked. These files exist for agents
8
8
  that can only fetch URLs.
9
9
 
10
10
  ## Start
@@ -19,7 +19,7 @@ that can only fetch URLs.
19
19
  - [components-index.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/components-index.json): 48 KB — all 162 components as name, group, tagline, plus `absorbed`: the names that do NOT exist and map to it (`Combobox` → `Select`).
20
20
  - [components/&lt;Name&gt;.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/components/Select.json): one file per component (1 KB–37 KB, median 6 KB). Read the index, then fetch only the ones you chose — this is the selective route, and the reason you do not need the blob.
21
21
  - [components.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/components.json): 1.2 MB — every entry in one file. Most URL fetchers truncate a response this size without saying so; prefer the per-component files.
22
- - [tokens.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/tokens.json): every design token with its value, the reason it exists, and its `tier` — 211 `foundation` seeds (`--primary`, `--background`, `--radius`: set these when you are handed a brand), 113 `semantic` roles, 1880 `component` knobs.
22
+ - [tokens.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/tokens.json): every design token with its value, the reason it exists, and its `tier` — 211 `foundation` seeds (`--primary`, `--background`, `--radius`: set these when you are handed a brand), 113 `semantic` roles, 1886 `component` knobs.
23
23
  - [vocabulary.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/vocabulary.json): the controlled prop vocabulary — which prop name means what, across every component.
24
24
  - [rules.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/rules.json): 43 cardinal rules.
25
25
  - [anti-ai-tells.json](https://raw.githubusercontent.com/godx-jp/godxjp-ui/main/agent/anti-ai-tells.json): 35 shapes that make generated UI look generated, each with its fix.
@@ -27,7 +27,7 @@ that can only fetch URLs.
27
27
  ## Pinning
28
28
 
29
29
  Every URL above tracks `main`. To pin to the release a project actually installed, swap `main` for
30
- the tag: `.../godx-jp/godxjp-ui/v32.12.0/agent/...`. A catalog that does not match the installed
30
+ the tag: `.../godx-jp/godxjp-ui/v32.13.1/agent/...`. A catalog that does not match the installed
31
31
  package describes props that are absent, or hides props that are present, and says nothing either way.
32
32
 
33
33
  Pinned catalogs only exist for releases whose tag actually contains `agent/`. If `…/v<version>/agent/index.json` returns 404, that release predates this catalog: read `…/main/…` instead and compare `index.json` → `version` against the package you have, so you at least know which way it drifted.
package/agent/tokens.json CHANGED
@@ -5375,6 +5375,36 @@
5375
5375
  "tier": "component",
5376
5376
  "value": "calc(1em / var(--font-size-ratio))"
5377
5377
  },
5378
+ {
5379
+ "description": "scale-exempt: a `pre` in prose follows the surrounding text size, so it scales with user text (gh#1320)",
5380
+ "name": "--prose-code-block-font-size",
5381
+ "tier": "component",
5382
+ "value": "1em"
5383
+ },
5384
+ {
5385
+ "description": "Prose heading steps RELATIVE to the prose text (gh#1320): ProseMirror strips per-block attributes, so editor headings only grow with user text size by inheriting — a fixed step would not. Same default sizes as the global type scale at 14px body; `--heading-h*` still overrides.",
5386
+ "name": "--prose-heading-h1-font-size",
5387
+ "tier": "component",
5388
+ "value": "calc( 1em * var(--font-size-ratio) * var(--font-size-ratio) * var(--font-size-ratio) )"
5389
+ },
5390
+ {
5391
+ "description": "Data-display component tokens — small-by-design text knobs (rule #45/#46).",
5392
+ "name": "--prose-heading-h2-font-size",
5393
+ "tier": "component",
5394
+ "value": "calc(1em * var(--font-size-ratio) * var(--font-size-ratio))"
5395
+ },
5396
+ {
5397
+ "description": "Data-display component tokens — small-by-design text knobs (rule #45/#46).",
5398
+ "name": "--prose-heading-h3-font-size",
5399
+ "tier": "component",
5400
+ "value": "calc(1em * var(--font-size-ratio))"
5401
+ },
5402
+ {
5403
+ "description": "scale-exempt: h4–h6 sit at the prose text size, relative so they scale with it (gh#1320)",
5404
+ "name": "--prose-heading-h4-font-size",
5405
+ "tier": "component",
5406
+ "value": "1em"
5407
+ },
5378
5408
  {
5379
5409
  "description": "Data-display component tokens — small-by-design text knobs (rule #45/#46).",
5380
5410
  "name": "--prose-code-space-inline",
@@ -5405,6 +5435,12 @@
5405
5435
  "tier": "component",
5406
5436
  "value": "var(--block-editor-frame-padding)"
5407
5437
  },
5438
+ {
5439
+ "description": "Raw-Markdown block head: one step below the editor text, relative so it scales with it (gh#1320).",
5440
+ "name": "--block-editor-raw-block-head-font-size",
5441
+ "tier": "component",
5442
+ "value": "calc(1em / var(--font-size-ratio))"
5443
+ },
5408
5444
  {
5409
5445
  "description": "Data-display component tokens — small-by-design text knobs (rule #45/#46).",
5410
5446
  "name": "--block-editor-min-height",
@@ -297,21 +297,50 @@ function TreeRoot({
297
297
  }
298
298
  }
299
299
  }, []);
300
- React.useEffect(() => {
301
- markTruncatedLabels();
302
- });
300
+ const resizeObserver = React.useRef(null);
301
+ const observedLabels = React.useRef(/* @__PURE__ */ new Set());
303
302
  React.useEffect(() => {
304
303
  const tree = treeRef.current;
305
- if (!tree || typeof ResizeObserver === "undefined") return;
306
- const observer = new ResizeObserver(markTruncatedLabels);
307
- observer.observe(tree);
304
+ if (!tree) return;
305
+ const fonts = typeof document === "undefined" ? void 0 : document.fonts;
306
+ let live = true;
307
+ void fonts?.ready.then(() => {
308
+ if (live) markTruncatedLabels();
309
+ });
310
+ fonts?.addEventListener?.("loadingdone", markTruncatedLabels);
311
+ const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(markTruncatedLabels);
312
+ resizeObserver.current = observer;
313
+ observer?.observe(tree);
308
314
  const refold = () => requestAnimationFrame(markTruncatedLabels);
309
315
  tree.addEventListener("focusout", refold);
316
+ const observed = observedLabels.current;
310
317
  return () => {
311
- observer.disconnect();
318
+ live = false;
319
+ fonts?.removeEventListener?.("loadingdone", markTruncatedLabels);
320
+ observer?.disconnect();
321
+ resizeObserver.current = null;
322
+ observed.clear();
312
323
  tree.removeEventListener("focusout", refold);
313
324
  };
314
325
  }, [markTruncatedLabels]);
326
+ React.useEffect(() => {
327
+ markTruncatedLabels();
328
+ const observer = resizeObserver.current;
329
+ const tree = treeRef.current;
330
+ if (!observer || !tree) return;
331
+ const observed = observedLabels.current;
332
+ const rendered = new Set(tree.querySelectorAll(".ui-tree-label"));
333
+ for (const label of observed) {
334
+ if (rendered.has(label)) continue;
335
+ observer.unobserve(label);
336
+ observed.delete(label);
337
+ }
338
+ for (const label of rendered) {
339
+ if (observed.has(label)) continue;
340
+ observer.observe(label);
341
+ observed.add(label);
342
+ }
343
+ });
315
344
  const nodeRefs = React.useRef(/* @__PURE__ */ new Map());
316
345
  const pendingFocus = React.useRef(null);
317
346
  React.useEffect(() => {
@@ -69,6 +69,7 @@ function useCollapsesToMenu(ref, enabled) {
69
69
  if (typeof ResizeObserver === "undefined") return void 0;
70
70
  const observer = new ResizeObserver(update);
71
71
  observer.observe(bar);
72
+ if (!collapsed) for (const cluster of bar.children) observer.observe(cluster);
72
73
  return () => observer.disconnect();
73
74
  }, [ref, enabled, collapsed]);
74
75
  return enabled && collapsed;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$comment": "AUTO-GENERATED by scripts/gen-measurement-contract.mjs — do not edit. Read this instead of guessing: docs/MEASUREMENT-CONTRACT.md.",
3
- "version": "32.12.0",
3
+ "version": "32.13.1",
4
4
  "targetSize": {
5
5
  "standard": "WCAG 2.2 SC 2.5.8 Target Size (Minimum), level AA — 24×24 CSS px",
6
6
  "min": 24,
@@ -1171,6 +1171,10 @@
1171
1171
  tab-size: 2;
1172
1172
  }
1173
1173
 
1174
+ .ui-prose pre {
1175
+ font-size: var(--prose-code-block-font-size);
1176
+ }
1177
+
1174
1178
  :is(.ui-code-block, .ui-prose pre) > code {
1175
1179
  font: inherit;
1176
1180
  background: transparent;
@@ -1350,32 +1354,23 @@
1350
1354
  }
1351
1355
 
1352
1356
  .ui-prose h1 {
1353
- font-size: var(
1354
- --heading-h1,
1355
- calc(
1356
- var(--font-size-base) * var(--font-size-ratio) * var(--font-size-ratio) *
1357
- var(--font-size-ratio)
1358
- )
1359
- );
1357
+ font-size: var(--heading-h1, var(--prose-heading-h1-font-size));
1360
1358
  }
1361
1359
 
1362
1360
  .ui-prose h2 {
1363
- font-size: var(
1364
- --heading-h2,
1365
- calc(var(--font-size-base) * var(--font-size-ratio) * var(--font-size-ratio))
1366
- );
1361
+ font-size: var(--heading-h2, var(--prose-heading-h2-font-size));
1367
1362
  }
1368
1363
 
1369
1364
  .ui-prose h3 {
1370
- font-size: var(--heading-h3, calc(var(--prose-font-size) * var(--font-size-ratio)));
1365
+ font-size: var(--heading-h3, var(--prose-heading-h3-font-size));
1371
1366
  }
1372
1367
 
1373
1368
  .ui-prose h4 {
1374
- font-size: var(--heading-h4, var(--prose-font-size));
1369
+ font-size: var(--heading-h4, var(--prose-heading-h4-font-size));
1375
1370
  }
1376
1371
 
1377
1372
  .ui-prose :is(h5, h6) {
1378
- font-size: var(--prose-font-size);
1373
+ font-size: inherit;
1379
1374
  }
1380
1375
 
1381
1376
  .ui-prose :is(h4, h5, h6) {
@@ -1692,6 +1687,10 @@
1692
1687
  gap: var(--space-2);
1693
1688
  }
1694
1689
 
1690
+ .ui-block-editor .ui-block-editor-raw-block-head :is([data-slot="text"], .ui-button) {
1691
+ font-size: var(--block-editor-raw-block-head-font-size);
1692
+ }
1693
+
1695
1694
  .ui-block-editor-raw-block-source {
1696
1695
  margin: 0;
1697
1696
  white-space: pre-wrap;
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "32.12.0",
2
+ "version": "32.13.1",
3
3
  "generatedBy": "scripts/gen-style-layers.mjs — do not edit by hand; run `pnpm gen:style-layers`",
4
4
  "base": "base.css",
5
5
  "fonts": "fonts.css",
@@ -2095,6 +2095,7 @@
2095
2095
 
2096
2096
  .ui-topbar-search-panel > .ui-search-input {
2097
2097
  inline-size: var(--topbar-search-inline-size);
2098
+ min-inline-size: min-content;
2098
2099
  flex: 0 1 auto;
2099
2100
  }
2100
2101