@ponchia/ui 0.6.11 → 0.7.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.
Files changed (61) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/MIGRATIONS.json +14 -0
  3. package/README.md +14 -6
  4. package/behaviors/dialog.d.ts.map +1 -1
  5. package/behaviors/dialog.js +14 -0
  6. package/behaviors/modal.d.ts +17 -13
  7. package/behaviors/modal.d.ts.map +1 -1
  8. package/behaviors/modal.js +281 -106
  9. package/behaviors/popover.d.ts.map +1 -1
  10. package/behaviors/popover.js +50 -2
  11. package/behaviors/splitter.d.ts +2 -0
  12. package/behaviors/splitter.d.ts.map +1 -1
  13. package/behaviors/splitter.js +15 -1
  14. package/behaviors/theme.d.ts +3 -2
  15. package/behaviors/theme.d.ts.map +1 -1
  16. package/behaviors/theme.js +10 -6
  17. package/bin/bronto-ui-check.mjs +286 -0
  18. package/classes/classes.json +7 -0
  19. package/classes/vscode.css-custom-data.json +1 -1
  20. package/css/disclosure.css +10 -0
  21. package/css/dots.css +43 -18
  22. package/css/feedback.css +35 -0
  23. package/css/report.css +0 -40
  24. package/css/site.css +10 -0
  25. package/css/tokens.css +1 -1
  26. package/dist/bronto.css +1 -1
  27. package/dist/css/disclosure.css +1 -1
  28. package/dist/css/dots.css +1 -1
  29. package/dist/css/feedback.css +1 -1
  30. package/dist/css/report-kit.css +1 -1
  31. package/dist/css/report.css +1 -1
  32. package/dist/css/site.css +1 -1
  33. package/dist/css/tokens.css +1 -1
  34. package/docs/adr/0004-prune-unused-adapters.md +34 -0
  35. package/docs/architecture.md +15 -11
  36. package/docs/command.md +18 -4
  37. package/docs/migrations/0.6-to-0.7.md +85 -0
  38. package/docs/package-contract.md +10 -5
  39. package/docs/reference.md +1 -1
  40. package/docs/reporting.md +8 -8
  41. package/docs/stability.md +36 -10
  42. package/docs/theming.md +49 -5
  43. package/docs/usage.md +68 -18
  44. package/docs/workbench.md +16 -2
  45. package/llms.txt +7 -3
  46. package/package.json +13 -3
  47. package/qwik/index.d.ts.map +1 -1
  48. package/qwik/index.js +4 -0
  49. package/react/index.d.ts.map +1 -1
  50. package/react/index.js +4 -0
  51. package/solid/index.d.ts.map +1 -1
  52. package/solid/index.js +4 -0
  53. package/svelte/index.d.ts.map +1 -1
  54. package/svelte/index.js +4 -0
  55. package/tokens/figma.variables.json +2 -2
  56. package/tokens/index.js +1 -1
  57. package/tokens/index.json +2 -2
  58. package/tokens/resolved.json +1 -1
  59. package/tokens/tokens.dtcg.json +2508 -399
  60. package/vue/index.d.ts.map +1 -1
  61. package/vue/index.js +4 -0
@@ -0,0 +1,85 @@
1
+ # Migrating 0.6 to 0.7
2
+
3
+ Machine-readable migration graph: [`MIGRATIONS.json`](../../MIGRATIONS.json).
4
+
5
+ 0.7.0 repairs public contracts found by auditing ten real consumers. It does
6
+ not add another component family. The only immediate breaking change is the
7
+ value shape of `tokens.dtcg.json`.
8
+
9
+ ## 1. Update DTCG readers
10
+
11
+ `@ponchia/ui/tokens.dtcg.json` now follows the DTCG 2025.10 typed-value format.
12
+ Colors and dimensions are structured values instead of CSS strings, and the
13
+ file contains no `null` placeholders.
14
+
15
+ Before 0.7:
16
+
17
+ ```js
18
+ const accent = tokens.color.light.accent.DEFAULT.$value; // '#d71921'
19
+ ```
20
+
21
+ From 0.7:
22
+
23
+ ```js
24
+ const accent = tokens.color.light.accent.DEFAULT.$value;
25
+ // { colorSpace: 'srgb', components: [0.843137, 0.098039, 0.129412], alpha: 1, hex: '#d71921' }
26
+ ```
27
+
28
+ Dimensions now use the same structured form:
29
+
30
+ ```js
31
+ tokens.scale.space.md.$value; // { value: 1, unit: 'rem' }
32
+ ```
33
+
34
+ Derived `var()` and `color-mix()` colors are resolved separately for the light
35
+ and dark groups. Their authored CSS expression remains available under
36
+ `$extensions["com.ponchia.css"].authoredValue`.
37
+
38
+ If your tool needs every raw CSS expression, including CSS-only shadows and
39
+ em-based letter-spacing, read `@ponchia/ui/tokens.json` instead. If it only needs
40
+ static values for rendering, `@ponchia/ui/tokens/resolved.json` remains the
41
+ simpler flat projection. The DTCG root extension lists the deliberately omitted
42
+ CSS variables.
43
+
44
+ ## 2. Add a non-drag splitter path
45
+
46
+ Keep the existing separator for pointer dragging and keyboard operation. Add
47
+ normal buttons inside the splitter so a pointer user can resize without a drag:
48
+
49
+ ```html
50
+ <button type="button" data-bronto-splitter-adjust="-10">Narrow first pane</button>
51
+ <button type="button" data-bronto-splitter-adjust="10">Widen first pane</button>
52
+ ```
53
+
54
+ The value is a signed percentage-point delta. `initSplitter()` clamps it to the
55
+ separator's `aria-valuemin` and `aria-valuemax`, updates `--splitter-pos`, and
56
+ emits the existing `bronto:splitter:resize` event.
57
+
58
+ ## 3. Replace deprecated package-only adapters
59
+
60
+ The React, Solid, Qwik, Svelte, and Vue adapter subpaths remain compatible in
61
+ 0.7, but are deprecated for removal no earlier than 0.8. No inspected real
62
+ consumer uses them. Initialize the framework-agnostic behavior in the
63
+ framework's normal client lifecycle and retain its cleanup function.
64
+
65
+ The controlled non-`<dialog>` `initModal()` path follows the same deprecation
66
+ window. Prefer a native `<dialog class="ui-modal">` with `initDialog()`.
67
+
68
+ ## 4. Check consumer literals
69
+
70
+ Run the package's zero-dependency checker after upgrading:
71
+
72
+ ```bash
73
+ npx --no-install bronto-ui-check src
74
+ ```
75
+
76
+ It reports literal `ui-*` classes absent from the shipped registry and
77
+ unresolved Bronto-like `var(--*)` references. Use `--allow-class` or
78
+ `--allow-token` only for an intentional consumer-owned exception.
79
+
80
+ ## Re-pin
81
+
82
+ ```jsonc
83
+ // package.json — 0.7 is a breaking minor under the pre-1.0 policy
84
+ "@ponchia/ui": "~0.7.0"
85
+ ```
@@ -174,9 +174,11 @@ semantic versioning contract for the surfaces listed here.
174
174
  | `./docs/migrations/0.3-to-0.4.md` | `./docs/migrations/0.3-to-0.4.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
175
175
  | `./docs/migrations/0.4-to-0.5.md` | `./docs/migrations/0.4-to-0.5.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
176
176
  | `./docs/migrations/0.5-to-0.6.md` | `./docs/migrations/0.5-to-0.6.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
177
+ | `./docs/migrations/0.6-to-0.7.md` | `./docs/migrations/0.6-to-0.7.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
177
178
  | `./docs/adr/0001-color-system.md` | `./docs/adr/0001-color-system.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
178
179
  | `./docs/adr/0002-scope-and-2026-baseline.md` | `./docs/adr/0002-scope-and-2026-baseline.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
179
180
  | `./docs/adr/0003-theme-model.md` | `./docs/adr/0003-theme-model.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
181
+ | `./docs/adr/0004-prune-unused-adapters.md` | `./docs/adr/0004-prune-unused-adapters.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
180
182
  | `./classes` | types: `./classes/index.d.ts`<br>default: `./classes/index.js` | Class recipes JS | Stable | ESM class registry, recipes, attrs helpers, and cx joiner. The emitted class vocabulary is public. |
181
183
  | `./classes.json` | `./classes/classes.json` | Machine-readable data | Stable additive | JSON package data for non-JS/tooling consumers. Shape is public unless the paired doc marks a field internal. |
182
184
  | `./behaviors` | types: `./behaviors/index.d.ts`<br>default: `./behaviors/index.js` | Vanilla behavior JS | Stable | ESM, SSR-safe, cleanup-returning behavior initializers. Behavior internals are not public. |
@@ -205,11 +207,11 @@ semantic versioning contract for the surfaces listed here.
205
207
  | `./glyphs` | types: `./glyphs/glyphs.d.ts`<br>default: `./glyphs/glyphs.js` | Geometry/render helper JS | Stable additive | ESM helper surface. Function names, options, and data shapes are public; rendering heuristics may tune. |
206
208
  | `./annotations` | types: `./annotations/index.d.ts`<br>default: `./annotations/index.js` | Geometry/render helper JS | Stable additive | ESM helper surface. Function names, options, and data shapes are public; rendering heuristics may tune. |
207
209
  | `./connectors` | types: `./connectors/index.d.ts`<br>default: `./connectors/index.js` | Geometry/render helper JS | Stable additive | ESM helper surface. Function names, options, and data shapes are public; rendering heuristics may tune. |
208
- | `./react` | types: `./react/index.d.ts`<br>default: `./react/index.js` | Framework binding JS | Stable thin adapter | Optional peer wrapper over vanilla behaviors. It owns lifecycle hookup, not markup or component state. |
209
- | `./solid` | types: `./solid/index.d.ts`<br>default: `./solid/index.js` | Framework binding JS | Stable thin adapter | Optional peer wrapper over vanilla behaviors. It owns lifecycle hookup, not markup or component state. |
210
- | `./qwik` | types: `./qwik/index.d.ts`<br>default: `./qwik/index.js` | Framework binding JS | Stable thin adapter | Optional peer wrapper over vanilla behaviors. It owns lifecycle hookup, not markup or component state. |
211
- | `./svelte` | types: `./svelte/index.d.ts`<br>default: `./svelte/index.js` | Framework binding JS | Stable thin adapter | Optional peer wrapper over vanilla behaviors. It owns lifecycle hookup, not markup or component state. |
212
- | `./vue` | types: `./vue/index.d.ts`<br>default: `./vue/index.js` | Framework binding JS | Stable thin adapter | Optional peer wrapper over vanilla behaviors. It owns lifecycle hookup, not markup or component state. |
210
+ | `./react` | types: `./react/index.d.ts`<br>default: `./react/index.js` | Framework binding JS | Deprecated in 0.7 | Compatibility wrapper over vanilla behaviors. Scheduled for removal no earlier than 0.8 under ADR-0004; use direct behavior lifecycle cleanup. |
211
+ | `./solid` | types: `./solid/index.d.ts`<br>default: `./solid/index.js` | Framework binding JS | Deprecated in 0.7 | Compatibility wrapper over vanilla behaviors. Scheduled for removal no earlier than 0.8 under ADR-0004; use direct behavior lifecycle cleanup. |
212
+ | `./qwik` | types: `./qwik/index.d.ts`<br>default: `./qwik/index.js` | Framework binding JS | Deprecated in 0.7 | Compatibility wrapper over vanilla behaviors. Scheduled for removal no earlier than 0.8 under ADR-0004; use direct behavior lifecycle cleanup. |
213
+ | `./svelte` | types: `./svelte/index.d.ts`<br>default: `./svelte/index.js` | Framework binding JS | Deprecated in 0.7 | Compatibility wrapper over vanilla behaviors. Scheduled for removal no earlier than 0.8 under ADR-0004; use direct behavior lifecycle cleanup. |
214
+ | `./vue` | types: `./vue/index.d.ts`<br>default: `./vue/index.js` | Framework binding JS | Deprecated in 0.7 | Compatibility wrapper over vanilla behaviors. Scheduled for removal no earlier than 0.8 under ADR-0004; use direct behavior lifecycle cleanup. |
213
215
  | `./skins` | types: `./tokens/skins.d.ts`<br>default: `./tokens/skins.js` | Renderer/theme helper JS | Stable additive | ESM theme data/helpers for opt-in skins, chart palettes, and external renderers. |
214
216
  | `./charts` | types: `./tokens/charts.d.ts`<br>default: `./tokens/charts.js` | Renderer/theme helper JS | Stable additive | ESM theme data/helpers for opt-in skins, chart palettes, and external renderers. |
215
217
  | `./charts.json` | `./tokens/charts.json` | Machine-readable data | Stable additive | JSON package data for non-JS/tooling consumers. Shape is public unless the paired doc marks a field internal. |
@@ -236,6 +238,7 @@ always includes `package.json`, `README.md`, `LICENSE`, and
236
238
  | `fonts` | Vendored assets | Doto woff2 files plus OFL license. |
237
239
  | `tokens` | Mixed source/generated data | Token source plus generated JSON, declarations, and renderer theme data. |
238
240
  | `classes` | Mixed source/generated data | Class recipe source plus generated JSON/declarations/custom-data. |
241
+ | `bin` | Package file | Included in the npm files allowlist. |
239
242
  | `behaviors` | Authored public JS directory | ESM source shipped as-is; adjacent declarations/maps are generated. |
240
243
  | `glyphs` | Authored public JS directory | Glyph registry/renderers shipped as JS; declarations are generated. |
241
244
  | `schemas` | Machine-readable schemas | Declarative JSON schemas for package-adjacent report/tooling contracts. |
@@ -295,9 +298,11 @@ always includes `package.json`, `README.md`, `LICENSE`, and
295
298
  | `docs/migrations/0.3-to-0.4.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
296
299
  | `docs/migrations/0.4-to-0.5.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
297
300
  | `docs/migrations/0.5-to-0.6.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
301
+ | `docs/migrations/0.6-to-0.7.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
298
302
  | `docs/adr/0001-color-system.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
299
303
  | `docs/adr/0002-scope-and-2026-baseline.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
300
304
  | `docs/adr/0003-theme-model.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
305
+ | `docs/adr/0004-prune-unused-adapters.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
301
306
 
302
307
  ## Artifact Provenance
303
308
 
package/docs/reference.md CHANGED
@@ -1678,7 +1678,7 @@ Exact mirror of the `:root` blocks in `css/tokens.css`
1678
1678
  | `--display` | `var(--dot-font)` |
1679
1679
  | `--display-weight` | `700` |
1680
1680
  | `--display-weight-strong` | `800` |
1681
- | `--text-2xs` | `0.68rem` |
1681
+ | `--text-2xs` | `0.72rem` |
1682
1682
  | `--text-xs` | `0.76rem` |
1683
1683
  | `--text-sm` | `0.86rem` |
1684
1684
  | `--text-base` | `0.95rem` |
package/docs/reporting.md CHANGED
@@ -54,18 +54,18 @@ No install? Link the same files from a CDN. Pin the version — pre-1.0, breakin
54
54
  changes ship in the minor (see [stability.md](./stability.md)):
55
55
 
56
56
  ```html
57
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.11/dist/bronto.css" />
58
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.11/dist/css/report-kit.css" />
57
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.7.0/dist/bronto.css" />
58
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.7.0/dist/css/report-kit.css" />
59
59
  ```
60
60
 
61
61
  Leaf-by-leaf CDN imports use the same `dist/css/` paths:
62
62
 
63
63
  ```html
64
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.11/dist/bronto.css" />
65
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.11/dist/css/report.css" />
66
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.11/dist/css/dataviz.css" />
67
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.11/dist/css/annotations.css" />
68
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.11/dist/css/legend.css" />
64
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.7.0/dist/bronto.css" />
65
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.7.0/dist/css/report.css" />
66
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.7.0/dist/css/dataviz.css" />
67
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.7.0/dist/css/annotations.css" />
68
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.7.0/dist/css/legend.css" />
69
69
  ```
70
70
 
71
71
  The CDN serves the package's own `fonts/` next to the CSS, so font URLs resolve
@@ -879,7 +879,7 @@ or validation runtime.
879
879
 
880
880
  ```json
881
881
  {
882
- "$schema": "https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.11/schemas/report-claims.v1.schema.json",
882
+ "$schema": "https://cdn.jsdelivr.net/npm/@ponchia/ui@0.7.0/schemas/report-claims.v1.schema.json",
883
883
  "schemaVersion": "bronto-report-claims.v1",
884
884
  "report": { "title": "Decision readiness", "type": "decision" },
885
885
  "claims": [
package/docs/stability.md CHANGED
@@ -1,7 +1,7 @@
1
- # Public API Stability
1
+ # Public API stability
2
2
 
3
3
  `@ponchia/ui` is pre-1.0. Breaking changes ship in the minor (`0.x.0`), and
4
- patches are non-breaking. In practical terms: **PATCH releases (`0.6.x`) are
4
+ patches are non-breaking. In practical terms: **PATCH releases (`0.7.x`) are
5
5
  non-breaking bug-fixes and additive changes — safe to upgrade without review;
6
6
  MINOR releases (`0.x.0`) may include breaking changes and consumers should
7
7
  review the CHANGELOG before upgrading.** Pin `~0.x` (tilde) to accept only
@@ -11,7 +11,7 @@ For the exhaustive package-manifest inventory — every `exports` key, every
11
11
  shipped `files` entry, and the generated artifact provenance map — see
12
12
  [package-contract.md](./package-contract.md).
13
13
 
14
- ## Path To 1.0
14
+ ## Path to 1.0
15
15
 
16
16
  `1.0.0` is a stability declaration, not a catalog milestone. The package is
17
17
  ready for 1.0 when the existing public contract is boring to upgrade:
@@ -36,7 +36,7 @@ ready for 1.0 when the existing public contract is boring to upgrade:
36
36
  migration entry when machine-actionable, and the deprecate-one-minor policy
37
37
  has been followed or explicitly exempted for provably-unreferenced surface.
38
38
 
39
- ### 1.0 Readiness Ledger
39
+ ### 1.0 readiness ledger
40
40
 
41
41
  This ledger is the release-candidate checklist. A row is ready only when the
42
42
  evidence column is green for the candidate commit; prose approval alone is not
@@ -51,6 +51,31 @@ enough.
51
51
  | Bundle budget has headroom | `check:dist`, `check:public-metadata`, `check:pack`, and the README size badge keep default bundle and tarball claims visible. | Budget increases are intentional, reviewed, and named in `CHANGELOG.md`; accidental growth fails before release. |
52
52
  | Deprecation history is clean | `check:migrations`, `check:release`, `check:versions`, `MIGRATIONS.json`, and this deprecation policy tie breaking changes to changelog and migration evidence. | No removal ships without either a deprecate-one-minor trail or an explicit BREAKING note for provably-unreferenced surface. |
53
53
 
54
+ ### Adoption evidence for 1.0
55
+
56
+ This snapshot records product evidence as of 2026-07-20. Use three evidence
57
+ classes:
58
+
59
+ - **Downstream-proven:** A non-example app, site, report generator, or tool
60
+ imports the published surface and passes its own build or checks.
61
+ - **Package-proven:** Packed examples, unit tests, browser tests, and type tests
62
+ prove compatibility, but no inspected non-example consumer imports the
63
+ surface.
64
+ - **Speculative:** Neither downstream use nor a package-level executable proof
65
+ justifies freezing the surface into 1.0.
66
+
67
+ Package-proven is necessary but does not establish demand. During the catalog
68
+ freeze, do not expand package-only surfaces. Recheck this table against real
69
+ consumer upgrades before the 1.0 release candidate.
70
+
71
+ | Surface family | Current evidence | 1.0 disposition |
72
+ | --- | --- | --- |
73
+ | Core CSS, class recipes, vanilla behaviors, tokens, and Tailwind bridge | Downstream-proven across five inspected non-example app, site, and service consumers. | Stabilize names and behavior contracts. Use consumer upgrades as the release-candidate proof. |
74
+ | Report, provenance, analytical CSS, annotations, glyphs, skins, workbench CSS, chart data, and Vega theme | Downstream-proven across four inspected report, site, dashboard, and tool consumers. | Keep opt-in. Stabilize the consumed paths; do not broaden the catalog during the freeze. |
75
+ | Controlled non-`<dialog>` modal | Package-proven by stack, portal, late-node, focus, and cleanup regressions. None of ten inspected non-example consumers initializes `initModal`. | Deprecated in 0.7; remove no earlier than 0.8 unless a real consumer adopts it. Native `<dialog>` + `initDialog` is the stable path. |
76
+ | React, Solid, Qwik, Svelte, and Vue lifecycle adapters | Package-proven by packed examples, types, and lifecycle tests. None of ten inspected non-example consumers imports an adapter entrypoint. | Deprecated in 0.7; remove no earlier than 0.8 unless a real consumer adopts one. Vanilla behaviors remain stable. |
77
+ | Mermaid, D2, Shiki, Figma Variables, and the report-claims schema | Package-proven by generated-data, render, schema, and drift checks. No inspected non-example consumer currently supplies downstream proof for every path. | Keep compatible through 0.7.x, but decide each 1.0 contract from adoption evidence rather than generator coverage alone. |
78
+
54
79
  After 1.0, breaking changes move to majors. Until then, the table below is the
55
80
  current public-surface matrix and the release policy above still applies.
56
81
 
@@ -63,15 +88,16 @@ current public-surface matrix and the release policy above still applies.
63
88
  | Class vocabulary as data (`@ponchia/ui/classes.json`, `@ponchia/ui/vscode.css-custom-data.json`) | Stable additive | The JSON shape (`groups`/`classes`/`states`/`customProperties`) and class/custom-property entries are public — for validating markup from a non-JS/non-TS host or editor integration. Generated from `cls` and CSS selectors; `classes.json`, `.d.ts`, reference docs, and VS Code custom data are drift-checked together. New classes/hooks are additive. |
64
89
  | Design tokens | Stable names/roles | Token names and documented roles are public. Exact values and generated colour math outputs may change for visual tuning before 1.0. |
65
90
  | `--accent-1..6` | Stable names/roles | A subtle-to-bold accent ramp derived from `--accent`. Exact resolved values are visual tuning; algorithm changes require release-note visibility and resolver/browser checks. |
66
- | Tokens as data (`tokens.json`, `tokens.dtcg.json`, `tokens/resolved.json`, `tokens/figma.variables.json`) | Stable additive | The JSON shapes are public for non-CSS/non-JS consumers and handoff tooling. `resolved.json` exposes `light`/`dark` (resolved colours) and `scale` (resolved non-colour scales). `tokens/figma.variables.json` mirrors the token contract for local Figma Variables import/sync. Token names/roles are stable; exact resolved values are visual tuning (pin `~0.x`). |
91
+ | Tokens as data (`tokens.json`, `tokens.dtcg.json`, `tokens/resolved.json`, `tokens/figma.variables.json`) | Stable additive from 0.7 | The JSON shapes are public for non-CSS/non-JS consumers and handoff tooling. `tokens.dtcg.json` is a DTCG 2025.10 resolved projection with structured typed values; `tokens.json` preserves authored CSS expressions. `resolved.json` exposes flat `light`/`dark` colours and non-colour `scale`; `figma.variables.json` is the local Figma handoff. Token names/roles are stable; exact resolved values are visual tuning (pin `~0.x`). |
67
92
  | Schemas (`schemas/*.schema.json`, `schemas/report-claims.v1.schema.json`) | Stable additive | Declarative JSON Schema contracts for package-adjacent tooling data. Existing schema files and enum values are public within a compatible minor; new optional properties and new schema files are additive. No validator runtime ships. |
68
93
  | Theme axes | Mixed | `data-theme` (light/dark) is the **contractual** base. `data-surface="oled"`, `data-density`, and `data-contrast` are **convenience presets** — best-effort visual variants, **not** part of the stability contract; their presence and exact values may change for tuning. Computed-style smoke tests guard that the presets apply to their intended token families. |
69
94
  | Tailwind v4 bridge (`@ponchia/ui/tailwind`, `@ponchia/ui/tailwind.css`) | Stable additive | CSS-only token/variant bridge for Tailwind v4. It maps Bronto tokens and variants into Tailwind namespaces; it must not import Bronto component CSS or change the default bundle. |
70
95
  | Behavior attributes (`data-bronto-*`) | Stable | Attribute names and documented markup relationships are public. Behavior internals are not. |
71
96
  | Behavior functions (`@ponchia/ui/behaviors`) | Stable | Exported function names, option names, custom events, SSR no-op behavior, idempotency, and cleanup-returning contract are public. |
97
+ | Consumer checker (`bronto-ui-check`) | Stable additive | The installed binary lexically validates literal `ui-*` classes and unresolved reserved-token references in supported code, style, and template sources after stripping comments; Markdown prose and generated/vendor directories are excluded. Exit 0 means no findings, exit 1 means contract findings, and exit 2 means invocation/input failure. New checks may be additive; an existing valid literal cannot become an error within a patch unless the corresponding public contract was already invalid. |
72
98
  | Glyph registry/renderers (`@ponchia/ui/glyphs`) | Stable additive | Existing glyph names stay valid. New glyphs are additive. Renderer option names and accessibility defaults are public. |
73
99
  | `.ui-icon` mask renderer | Stable | Class name, `--icon-size`, currentColor inheritance, and `--icon-mask` contract are public. The internal data URL encoding is not. |
74
- | Framework lifecycle adapters (`react`/`solid`/`qwik`/`svelte`/`vue`) | Stable thin adapters | Hook/action/directive names, optional peer behavior where applicable, root ref/signal/resolver support, and cleanup lifecycle are public. They remain wrappers over vanilla behaviors, not component APIs. |
100
+ | Framework lifecycle adapters (`react`/`solid`/`qwik`/`svelte`/`vue`) | Deprecated in 0.7 | Hook/action/directive names, optional peer behavior, root resolver support, and cleanup remain compatible through 0.7. Scheduled for removal no earlier than 0.8 under ADR-0004. Use vanilla behaviors in framework lifecycle code. |
75
101
  | Skins (`@ponchia/ui/skins`, `css/skins.css`) | Stable additive | Existing skin names stay valid. New skins are additive. Skins are root-level choices. Skin CSS is opt-in, not in the default bundle. |
76
102
  | Charts (`@ponchia/ui/charts`, `charts.json`, `css/dataviz.css`) | Stable additive | Token names, JSON shape, and 8 categorical slots are public. `css/dataviz.css` is opt-in, not in the default bundle. Exact palette values may tune if gates and release notes justify it. |
77
103
  | External renderer themes (`@ponchia/ui/mermaid`, `@ponchia/ui/mermaid.json`, `@ponchia/ui/d2`, `@ponchia/ui/d2.json`, `@ponchia/ui/vega`, `@ponchia/ui/vega.json`) | Stable additive | Theme helper names, JSON shapes, and supported renderer theme slots are public. Values are resolved colours because Mermaid, D2, and Vega cannot consume Bronto CSS variables directly. Exact colours may tune with token changes, but `check:mermaid`, `check:d2`, and `check:vega` must prove every exported theme resolves with no `var()` leaks. No renderer runtime ships. |
@@ -94,7 +120,7 @@ current public-surface matrix and the release policy above still applies.
94
120
  | Lifecycle state (`css/state.css`, `.ui-state*`, `.ui-syncbar`) | Stable additive | The `.ui-state`/`__label`/`__detail`/`--busy` classes, the canonical lifecycle state modifiers, `.ui-syncbar`, and the `ui.state` recipe are public. Opt-in, not in the default bundle. |
95
121
  | Generated / AI-trust (`css/generated.css`, `.ui-generated*`, `.ui-origin-label*`, `.ui-reasoning*`, `.ui-tool-log`, `.ui-tool-call*`) | Stable additive | The generated-content, origin-label (incl. `--ai`), reasoning-trace and tool-log/tool-call class names and the `ui.originLabel` recipe are public. Opt-in, not in the default bundle. Not a chat kit; no confidence widget. |
96
122
  | Workbench (`css/workbench.css`, `.ui-splitter*`, `.ui-inspector*`, `.ui-property*`, `.ui-selectionbar*`, `initSplitter`) | Stable additive | Splitter, inspector, property-row and selection-bar class + BEM part names are public (no recipe). `data-bronto-splitter`, `--splitter-pos`, `bronto:splitter:resize`, and the `initSplitter` cleanup contract are public. Opt-in, not in the default bundle. The host owns pane content, persistence, collapse policy, and selection state. |
97
- | Command palette (`css/command.css`, `.ui-command*`, `initCommand`, `useCommand` / `command` / `vCommand`) | Stable additive | Command class/part names, the `data-bronto-command` attribute, and the event contract — `bronto:command:select` (`detail: { value, label }`) and `bronto:command:close` — are public, plus the framework binding adapters. Bronto filters + navigates (APG combobox/listbox); the host owns the action registry/execution. Opt-in, not in the default bundle, no global hotkey. |
123
+ | Command palette (`css/command.css`, `.ui-command*`, `initCommand`) | Stable additive | Command class/part names, the `data-bronto-command` attribute, and the event contract — `bronto:command:select` (`detail: { value, label }`) and `bronto:command:close` — are public. Bronto filters + navigates (APG combobox/listbox); the host owns the action registry/execution. Opt-in, not in the default bundle, no global hotkey. The deprecated framework bindings remain compatible only for the 0.7 migration window. |
98
124
  | Spark microcharts (`css/spark.css`, `.ui-spark*`) | Stable additive | Spark class names and inline sizing/label slots are public. Opt-in, not in the default bundle. The host owns data reduction and accessible surrounding text. |
99
125
  | Bullet graphs (`css/bullet.css`, `.ui-bullet*`) | Stable additive | Bullet class names and measure/target/range custom-property slots are public. Opt-in, not in the default bundle. The host owns thresholds, units, and data mapping. |
100
126
  | Diffs (`css/diff.css`, `.ui-diff*`) | Stable additive | Diff container/line/gutter class names and add/remove/highlight state modifiers are public. Opt-in, not in the default bundle. Bronto styles evidence; it does not compute diffs. |
@@ -104,13 +130,13 @@ current public-surface matrix and the release policy above still applies.
104
130
  | Terms / glossary (`css/term.css`, `.ui-term`, `.ui-glossary`) | Stable additive | Term and glossary class names plus native-popover definition hooks are public. Opt-in, not in the default bundle. The host owns glossary content and terminology policy. |
105
131
  | Contents rail (`css/toc.css`, `.ui-toc*`) | Stable additive | TOC rail class/part names and current-section state classes are public. Opt-in, not in the default bundle. The host owns section observation and active-state updates. |
106
132
  | Tree outlines (`css/tree.css`, `.ui-tree*`) | Stable additive | Tree outline class names, depth styling, and native `<details>` composition are public. Opt-in, not in the default bundle. The host owns tree data, lazy loading, and selection state. |
107
- | Controlled-modal focus trap (`initModal`, `useModal`, `data-bronto-modal`) | Stable additive | For the `.ui-modal.is-open` (non-`<dialog>`) path: the `data-bronto-modal` opt-in marker, the `inert`-based focus trap + focus-return, and the cancelable `bronto:modal:close` (`detail: { reason }`) event are public. The consumer still owns the `is-open` class; the behavior never changes visibility. The native `<dialog>` path (`initDialog`) is the default and gets the trap for free. |
133
+ | Controlled-modal focus trap (`initModal`, adapter `useModal`, `data-bronto-modal`) | Deprecated in 0.7 | The controlled non-`<dialog>` path remains compatible through 0.7 and is scheduled for removal no earlier than 0.8 under ADR-0004. Use native `<dialog>` with `initDialog()`; it remains stable. |
108
134
  | Keyboard-shortcut hint (`.ui-shortcut`, `.ui-shortcut__sep`) | Stable additive | Class names for the chord/sequence hint over `.ui-kbd` are public. Ships in the core layer (class-only, no recipe). |
109
135
  | Agent and migration data (`llms.txt`, `MIGRATIONS.json`) | Stable additive | `llms.txt` stays shipped as the offline agent entrypoint. `MIGRATIONS.json` stays a machine-readable migration map for breaking renames/removals. New migration entries are additive; removal of a migration record requires the same breaking-change discipline as the surface it describes. |
110
136
  | Generated docs shipped in npm | Stable paths | Exported docs paths stay shipped and resolvable within a compatible minor. Markdown/text assets are for reading unless your runtime has a loader. Generated content may change with the source contract. |
111
137
  | Demo, examples, tests, scripts | Internal | Useful for learning and verification, but not shipped runtime API unless a path is explicitly exported in `package.json`. |
112
138
 
113
- ## Deprecation Policy
139
+ ## Deprecation policy
114
140
 
115
141
  Public surface (`.ui-*` classes, `data-bronto-*` attributes, `cls`/token keys,
116
142
  behavior signatures, and exported schema values) is removed on a
@@ -126,7 +152,7 @@ A token/class/attribute that is provably referenced by no shipped CSS,
126
152
  component, behavior, or doc may skip that window and be removed with a BREAKING
127
153
  entry plus migration note; there is no working call-site to keep alive.
128
154
 
129
- ## Trust Boundary
155
+ ## Trust boundary
130
156
 
131
157
  Behaviors assume trusted application markup. If a delegated root includes
132
158
  untrusted CMS or user HTML, sanitize it first or do not initialize behaviors on
package/docs/theming.md CHANGED
@@ -4,6 +4,46 @@
4
4
  This is the **stable, supported surface** for re-branding without forking.
5
5
  Anything not listed here is internal and may change between minor versions.
6
6
 
7
+ ## Theme selection, persistence, and OS synchronization
8
+
9
+ Declare both supported schemes in the document head so browser-owned controls
10
+ and chrome follow the active theme:
11
+
12
+ ```html
13
+ <meta name="color-scheme" content="light dark" />
14
+ ```
15
+
16
+ Call `initThemeToggle()` for any `[data-bronto-theme-toggle]` controls. It
17
+ persists an explicit light/dark choice in `localStorage['bronto-theme']`, keeps
18
+ `aria-pressed` current, and emits `bronto:themechange` on `<html>`. When there is
19
+ no explicit `data-theme`, an OS preference change emits the same event, so
20
+ canvas, SVG, MapLibre, and other non-CSS renderers can redraw without a separate
21
+ media-query listener.
22
+
23
+ ```js
24
+ import { initThemeToggle } from '@ponchia/ui/behaviors';
25
+
26
+ const stopTheme = initThemeToggle();
27
+ document.documentElement.addEventListener('bronto:themechange', (event) => {
28
+ redrawNonCssSurface(event.detail.theme);
29
+ });
30
+ ```
31
+
32
+ For a stored preference without first-paint flash, put this render-blocking
33
+ script in `<head>` before the stylesheet/module code:
34
+
35
+ ```html
36
+ <script>
37
+ try {
38
+ var theme = localStorage.getItem('bronto-theme');
39
+ if (theme === 'light' || theme === 'dark') document.documentElement.dataset.theme = theme;
40
+ } catch (error) {}
41
+ </script>
42
+ ```
43
+
44
+ To return to automatic OS mode, remove both the storage item and `data-theme`,
45
+ then reinitialize the theme behavior so it can subscribe to OS changes again.
46
+
7
47
  ## The brand knob: `--accent`
8
48
 
9
49
  The accent family derives from `--accent` via `color-mix()` and the
@@ -307,11 +347,15 @@ semantics — the CSS can't add ARIA for you:
307
347
  `@ponchia/ui/tokens.dtcg.json` is the token model in the W3C Design
308
348
  Tokens Community Group format, for Style Dictionary / Figma / other
309
349
  tooling. Generated from `tokens/index.js` and drift-checked by
310
- `npm run check`. Resolvable primitives (the scale, `--accent`, literal
311
- palette) carry real `$value`s; the CSS-runtime-derived family
312
- (`accent-soft`, `focus-ring`, aliases) is spec-shaped with
313
- `$value: null` + the CSS in `$extensions["com.ponchia.css"]` rather than
314
- fabricating a number the resolvable knob is `color.<theme>.accent`.
350
+ `npm run check`. From 0.7 it is a resolved DTCG 2025.10 projection: colours use
351
+ structured sRGB values, dimensions use `{ value, unit }`, durations use
352
+ `{ value, unit }`, and every typed token has a non-null portable value. Derived
353
+ `var()` / `color-mix()` colours are resolved independently in the light and dark
354
+ groups. The authored CSS remains in `$extensions["com.ponchia.css"].authoredValue`.
355
+ CSS-only expressions that cannot be represented portably, including shadows,
356
+ and em-based letter-spacing remain in `@ponchia/ui/tokens.json` rather than
357
+ becoming fake DTCG values. The root extension lists every deliberately omitted
358
+ CSS variable.
315
359
 
316
360
  `@ponchia/ui/tokens/figma.variables.json` is the resolved local handoff for
317
361
  Figma Variables import/sync scripts. It is generated from `tokens/resolved.json`
package/docs/usage.md CHANGED
@@ -362,23 +362,29 @@ element (e.g. `aria-label="Ada Lovelace"`) because the initials alone don't
362
362
  convey identity to AT. Keep initials to ~2 characters — the box is
363
363
  `overflow: hidden` and silently clips a third.
364
364
 
365
- ## Modal: native `<dialog>` vs `is-open`
365
+ ## Modal: use native `<dialog>`
366
366
 
367
367
  Prefer the **native `<dialog>`** path — you get top-layer, backdrop and
368
368
  focus-trap free (wire it with `initDialog` for open-triggers + focus-return).
369
- Only use `ui-modal.is-open` (`ui.modal({ open: true })`) when a portal/React
370
- modal genuinely can't be a `<dialog>`. The **backdrop and top-layer stacking
371
- stay yours**, but you no longer have to hand-roll the focus trap: mark the
372
- overlay `data-bronto-modal` and call `initModal()`. While `is-open` it traps
373
- focus with `inert` (the rest of the page goes non-interactive), returns focus to
374
- the opener on close, and dispatches a cancelable `bronto:modal:close` on Escape —
375
- you still own the `is-open` class, so drop it in response. On bind `initModal`
376
- also gives the overlay `role="dialog"` + `aria-modal="true"` and dev-warns if it
377
- has no accessible name (add `aria-label`/`aria-labelledby`). A drawer is a modal
378
- that enters from an edge same rule.
379
-
380
- **Scroll-lock is not automatic on either path.** Neither the native `<dialog>`
381
- nor the `is-open` path freezes the background the page behind an open modal can
369
+ The older `ui-modal.is-open` + `data-bronto-modal` + `initModal()` path remains
370
+ compatible throughout 0.7, but is deprecated for removal no earlier than 0.8.
371
+ It duplicates platform focus, stacking, and inert ownership and no inspected
372
+ real consumer uses it. Migrate portals to a native `<dialog>` where possible;
373
+ if a framework must retain the controlled path during 0.7, keep the existing
374
+ accessible name and `bronto:modal:close` handling unchanged.
375
+
376
+ Controlled modals share one document-level stack. Opening a sibling portal
377
+ modal makes the previous modal inert and keeps only the new top modal
378
+ interactive; closing it restores focus into the previous modal. An
379
+ `initPopover()` trigger inside the top modal may target a panel portaled
380
+ elsewhere in the document: while that panel is open, it joins the live modal
381
+ tree and owns Escape without releasing unrelated background content. Background
382
+ nodes added after the modal opens are trapped too. If a controlled parent modal
383
+ closes while a descendant still carries `is-open`, the descendant is suspended
384
+ with the parent and resumes if the parent reopens.
385
+
386
+ **Scroll-lock is not automatic.** A native `<dialog>` does not freeze background
387
+ scroll — the page behind an open modal can
382
388
  still scroll. If that matters, toggle a lock yourself while the modal is open
383
389
  (`document.documentElement.style.overflow = 'hidden'`, restored on close), or add
384
390
  `html:has(dialog[open]) { overflow: hidden }` for the native path.
@@ -564,6 +570,49 @@ authoring engine.
564
570
  provide. The summary's title is the legible sans, not the display face — it's
565
571
  meant to be read.
566
572
 
573
+ ### Branded file input: keep the native control operable
574
+
575
+ Prefer the visible native control: `<input class="ui-file" type="file">` styles
576
+ its file-selector button without hiding the input. If the product needs a
577
+ button-shaped label, keep the native input focusable inside the label and expose
578
+ its focus on the visible wrapper. Never use `display: none` on the input: that
579
+ removes it from keyboard navigation.
580
+
581
+ ```html
582
+ <label class="ui-button upload-button">
583
+ Choose file
584
+ <input class="ui-visually-hidden" type="file" name="document" />
585
+ </label>
586
+ ```
587
+
588
+ ```css
589
+ .upload-button:focus-within {
590
+ outline: 3px solid var(--focus-ring);
591
+ outline-offset: var(--focus-offset);
592
+ }
593
+ ```
594
+
595
+ ### Sortable table: the button is part of the contract
596
+
597
+ Put a real button in each sortable header, mark the table, then initialize the
598
+ behavior. Use `data-sort="num"` for numeric columns and `data-sort-value` on a
599
+ cell when its displayed text is not a canonical sortable value.
600
+
601
+ ```html
602
+ <table class="ui-table" data-bronto-sortable>
603
+ <thead><tr>
604
+ <th><button class="ui-table__sort" data-sort type="button">Name</button></th>
605
+ <th class="is-num"><button class="ui-table__sort" data-sort="num" type="button">Score</button></th>
606
+ </tr></thead>
607
+ <tbody><tr><td>Ada</td><td class="is-num" data-sort-value="9.5">9,5</td></tr></tbody>
608
+ </table>
609
+ ```
610
+
611
+ ```js
612
+ import { initTableSort } from '@ponchia/ui/behaviors';
613
+ const cleanup = initTableSort();
614
+ ```
615
+
567
616
  ## Reveal: `ui-reveal` needs JS, `ui-scroll-reveal` doesn't
568
617
 
569
618
  `ui-scroll-reveal` is scroll-driven and **zero-JS** — reach for it in a static
@@ -605,8 +654,9 @@ It is a **non-modal** dialog by design: the panel gets `role="dialog"` and focus
605
654
  moves into it, but there is **no focus trap** and the rest of the page stays
606
655
  interactive — Tab moves *out* of the panel (it does not cycle), and it closes on
607
656
  Escape or outside-click. Don't assume `<dialog>`-modal semantics; if you need a
608
- trap and an inert backdrop, use a real modal (`<dialog>` + `initDialog`, or
609
- `initModal`). And the `is-open` fallback is a plain stacked element, so it sits
657
+ trap and an inert backdrop, use a real modal (`<dialog>` + `initDialog`). The
658
+ deprecated `initModal()` path remains available only for 0.7 migration. And the
659
+ `is-open` fallback is a plain stacked element, so it sits
610
660
  *under* any open native `<dialog>`'s top layer — another reason to prefer the
611
661
  native `popover` attribute when a popover and a dialog can be open together.
612
662
 
@@ -640,7 +690,7 @@ These are JS widgets wearing the Bronto look; without the behavior they are iner
640
690
  | Popover (`ui-popover`) | `initPopover` | no placement/ARIA — prefer the native `popover` attribute |
641
691
  | Carousel (`ui-carousel`) | `initCarousel` | a native scroll-snap track (usable, no controls) |
642
692
  | Native dialog/lightbox (`<dialog>`, `ui-lightbox`) | `initDialog` | closed markup stays closed; `data-bronto-open`/close buttons do nothing. Do not use `open` as a modal fallback: it is non-modal and has no trigger/focus-return path |
643
- | Controlled modal (`ui-modal.is-open`) | `initModal` | open skin only — no inert trap, focus-return, or Escape close signal |
693
+ | Controlled modal (`ui-modal.is-open`, deprecated) | `initModal` (deprecated) | open skin only — no inert trap, focus-return, or Escape close signal |
644
694
  | Menu (`data-bronto-menu`) | `initMenu` | a button next to a list with no open/close, outside-click, or Escape |
645
695
  | Dismissible alert/callout (`data-bronto-dismissible`) | `dismissible` | the close affordance is just a button; nothing is removed |
646
696
  | Toast | `toast()` | nothing — it is imperative-only |
@@ -661,7 +711,7 @@ boundary of what CSS alone cannot do.
661
711
 
662
712
  The CSS is the framework; `@ponchia/ui/behaviors` is the *sanctioned*
663
713
  home for the little JS that genuinely needs scripting (theme persistence,
664
- disclosure, dialog glue, modal focus-trap, toast, combobox, form-validation,
714
+ disclosure, native-dialog glue, toast, combobox, form-validation,
665
715
  table-sort, splitter resizing). Reach for it instead of reimplementing — every
666
716
  initializer is SSR-safe, idempotent, and returns a cleanup. If you find yourself
667
717
  writing focus management, ARIA value sync, or `aria-expanded` toggling by hand,
package/docs/workbench.md CHANGED
@@ -80,7 +80,17 @@ domain selection model.
80
80
  data-bronto-splitter
81
81
  style="--splitter-pos: 36%"
82
82
  >
83
- <section class="ui-splitter__pane" id="files" aria-label="Files">...</section>
83
+ <section class="ui-splitter__pane" id="files" aria-label="Files">
84
+ <div class="ui-cluster" role="group" aria-label="Resize files pane">
85
+ <button class="ui-button ui-button--sm" type="button" data-bronto-splitter-adjust="-10">
86
+ Narrow
87
+ </button>
88
+ <button class="ui-button ui-button--sm" type="button" data-bronto-splitter-adjust="10">
89
+ Widen
90
+ </button>
91
+ </div>
92
+ ...
93
+ </section>
84
94
  <div
85
95
  class="ui-splitter__handle"
86
96
  role="separator"
@@ -99,7 +109,11 @@ domain selection model.
99
109
  Use `.ui-splitter--horizontal` for top/bottom panes. Arrow keys change the value
100
110
  by 2 percentage points, Shift+Arrow and PageUp/PageDown by 10, and Home/End jump
101
111
  to `aria-valuemin` / `aria-valuemax`. The handle needs a real accessible name
102
- and `aria-controls` pointing at the primary pane.
112
+ and `aria-controls` pointing at the primary pane. Also provide ordinary buttons
113
+ with `data-bronto-splitter-adjust="-10"` / `"10"`: pointer users then have a
114
+ non-drag resize path, while keyboard and assistive-technology users retain the
115
+ separator interaction. The signed value is a percentage-point delta and is
116
+ clamped to the separator's min/max.
103
117
 
104
118
  ## Inspector — `.ui-inspector`
105
119
 
package/llms.txt CHANGED
@@ -45,7 +45,7 @@ the path changes from source `css/` to built `dist/css/`:
45
45
  <!-- installed locally -->
46
46
  <link rel="stylesheet" href="./node_modules/@ponchia/ui/dist/css/<leaf>.css" />
47
47
  <!-- or from a CDN; pin the version (pre-1.0, breaking changes ship in the minor) -->
48
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.11/dist/css/<leaf>.css" />
48
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.7.0/dist/css/<leaf>.css" />
49
49
  ```
50
50
 
51
51
  The flattened default bundle is `dist/bronto.css` (bundler shorthand
@@ -75,7 +75,8 @@ import { applyStoredTheme } from '@ponchia/ui/behaviors';
75
75
  Notable behaviors beyond the obvious: `initMenu()` adds close affordances to a
76
76
  native `<details data-bronto-menu>` dropdown (outside-click/Escape/select-close);
77
77
  `initModal()` wires the controlled `.ui-modal.is-open` path (inert focus-trap +
78
- role/aria-modal); `initDisabledGuard()` makes every `aria-disabled` control
78
+ role/aria-modal), but is deprecated in 0.7 for removal no earlier than 0.8;
79
+ prefer native `<dialog>` + `initDialog()`. `initDisabledGuard()` makes every `aria-disabled` control
79
80
  keyboard-inert (CSS alone is only pointer-inert). For the value-bearing fills,
80
81
  `attrs.meter(value)` / `attrs.progress(value)` from `@ponchia/ui/classes` return
81
82
  `role`+`aria-valuenow/min/max`+the `--value` style to spread onto the host.
@@ -86,6 +87,8 @@ matching `.ui-source-card`, seed lightweight preview metadata, and emit
86
87
  and any rich preview popover.
87
88
 
88
89
  Optional lifecycle adapters wrap those behaviors without owning markup or state.
90
+ They remain compatible in 0.7 but are deprecated for removal no earlier than
91
+ 0.8; prefer vanilla behavior initialization in the host lifecycle.
89
92
  React/Solid/Qwik use hook bindings (peer deps `react` / `solid-js` /
90
93
  `@builder.io/qwik`, optional — core stays zero-dep); Svelte uses dependency-free
91
94
  actions, and Vue uses dependency-free directives/plugin helpers:
@@ -769,7 +772,8 @@ Read these from `node_modules/@ponchia/ui/` — no network needed:
769
772
  resolved palette; the build fails below the declared floor.
770
773
  - `tokens/index.d.ts` — every design-token name as a literal union.
771
774
  - `tokens/index.json` — tokens as plain data (global / light / dark).
772
- - `tokens/tokens.dtcg.json` — same tokens in W3C DTCG format.
775
+ - `tokens/tokens.dtcg.json` — resolved DTCG 2025.10 structured typed values;
776
+ authored CSS expressions remain in `tokens/index.json` and DTCG extensions.
773
777
  - `tokens/resolved.json` — every colour token resolved to a static
774
778
  `#rrggbb` / `rgba(...)` per theme (var() + color-mix() evaluated) in
775
779
  `light`/`dark`, plus a `scale` block of the non-colour scales