@ponchia/ui 0.12.0 → 0.13.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 (48) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +3 -3
  3. package/classes/classes.json +3 -1
  4. package/classes/index.d.ts +2 -0
  5. package/classes/index.js +3 -1
  6. package/classes/vscode.css-custom-data.json +64 -0
  7. package/css/base.css +2 -2
  8. package/css/blocknote.css +61 -0
  9. package/css/clamp.css +2 -2
  10. package/css/content.css +126 -0
  11. package/css/disclosure.css +10 -10
  12. package/css/forms.css +8 -8
  13. package/css/primitives.css +5 -6
  14. package/css/row.css +2 -2
  15. package/css/term.css +2 -2
  16. package/css/textref.css +2 -2
  17. package/css/toc.css +2 -2
  18. package/css/tokens.css +43 -0
  19. package/css/workbench.css +2 -2
  20. package/dist/bronto.css +1 -1
  21. package/dist/css/base.css +1 -1
  22. package/dist/css/blocknote.css +1 -0
  23. package/dist/css/clamp.css +1 -1
  24. package/dist/css/content.css +1 -1
  25. package/dist/css/disclosure.css +1 -1
  26. package/dist/css/forms.css +1 -1
  27. package/dist/css/report-kit.css +1 -1
  28. package/dist/css/row.css +1 -1
  29. package/dist/css/term.css +1 -1
  30. package/dist/css/textref.css +1 -1
  31. package/dist/css/toc.css +1 -1
  32. package/dist/css/tokens.css +1 -1
  33. package/dist/css/workbench.css +1 -1
  34. package/docs/compositions.md +2 -2
  35. package/docs/interop/blocknote.md +60 -0
  36. package/docs/package-contract.md +6 -2
  37. package/docs/reference.md +18 -1
  38. package/docs/reporting.md +8 -8
  39. package/docs/stability.md +2 -1
  40. package/docs/theming.md +48 -1
  41. package/llms.txt +1 -1
  42. package/package.json +13 -10
  43. package/tokens/figma.variables.json +240 -0
  44. package/tokens/index.d.ts +2 -2
  45. package/tokens/index.js +30 -2
  46. package/tokens/index.json +32 -0
  47. package/tokens/resolved.json +17 -1
  48. package/tokens/tokens.dtcg.json +190 -0
@@ -0,0 +1,60 @@
1
+ # BlockNote interop
2
+
3
+ [BlockNote](https://www.blocknotejs.org) is a block editor. It themes its
4
+ editor, menus, side menu, formatting toolbar and text highlights through
5
+ `--bn-*` custom properties declared on `.bn-root`, with its own light and dark
6
+ values. `css/blocknote.css` points those properties at bronto tokens, so the
7
+ editor follows the theme, skins, contrast and the OLED surface like the rest of
8
+ the page.
9
+
10
+ ## Import
11
+
12
+ BlockNote's stylesheet is unlayered, and an unlayered rule outranks every
13
+ layered one. Import this leaf's **unlayered** build, after BlockNote's:
14
+
15
+ ```css
16
+ @import '@blocknote/mantine/style.css';
17
+ @import '@ponchia/ui/css/dataviz.css';
18
+ @import '@ponchia/ui/css/unlayered/blocknote.css';
19
+ ```
20
+
21
+ The rule targets `.bn-root` and `.bn-root[data-color-scheme]`, which has the
22
+ same specificity as BlockNote's dark block, so source order is what makes it
23
+ win.
24
+
25
+ ## What maps to what
26
+
27
+ | BlockNote | bronto |
28
+ | --- | --- |
29
+ | editor text, background | `--text`, `--panel` |
30
+ | menu text, background | `--text`, `--panel-strong` |
31
+ | tooltip, hovered background | `--panel-soft` |
32
+ | selected text, background | `--on-accent`, `--accent` |
33
+ | disabled text | `--text-dim` |
34
+ | border, shadow | `--line` |
35
+ | side menu (drag handle, add) | `--text-dim` |
36
+ | font, radius | `--sans`, `--radius-lg` |
37
+
38
+ Text and background highlights are categorical identity: a colour someone chose
39
+ for a span. They take `--cat-N-ink` (text, 4.5:1 on its tint and the panel) and
40
+ `--cat-N-tint` (background) from `css/dataviz.css`:
41
+
42
+ | BlockNote highlight | Categorical hue |
43
+ | --- | --- |
44
+ | blue | 1 · blue |
45
+ | orange, brown (text) | 2 · orange |
46
+ | yellow | 4 · yellow |
47
+ | pink | 5 · magenta |
48
+ | green | 6 · green |
49
+ | purple | 7 · violet |
50
+ | red | 8 · red |
51
+ | gray | `--text-dim` on `--panel-soft` |
52
+
53
+ Without `css/dataviz.css` the highlights fall back to the status colours.
54
+
55
+ ## A read view that matches the editor
56
+
57
+ A surface that shows the same text read-only (a preview, a fallback while the
58
+ editor loads) can use `.ui-prose.ui-prose--blocks`. That variant reproduces
59
+ BlockNote's block geometry, so text does not jump when the surface switches
60
+ between reading and editing. See [the prose reference](../reference.md).
@@ -48,6 +48,7 @@ semantic versioning contract for the surfaces listed here.
48
48
  | `./css/app.css` | `./dist/css/app.css` | Bundled layered CSS leaf | Stable additive | Generated layered direct-import leaf. Also included in dist/bronto.css. |
49
49
  | `./css/skins.css` | `./dist/css/skins.css` | Opt-in layered CSS leaf | Stable additive | Generated layered direct-import leaf. Opt-in and not included in dist/bronto.css. |
50
50
  | `./css/dataviz.css` | `./dist/css/dataviz.css` | Opt-in layered CSS leaf | Stable additive | Generated layered direct-import leaf. Opt-in and not included in dist/bronto.css. |
51
+ | `./css/blocknote.css` | `./dist/css/blocknote.css` | Opt-in layered CSS leaf | Stable additive | Generated layered direct-import leaf. Opt-in and not included in dist/bronto.css. |
51
52
  | `./css/report.css` | `./dist/css/report.css` | Opt-in layered CSS leaf | Stable additive | Generated layered direct-import leaf. Opt-in and not included in dist/bronto.css. |
52
53
  | `./css/row.css` | `./dist/css/row.css` | Bundled layered CSS leaf | Stable additive | Generated layered direct-import leaf. Also included in dist/bronto.css. |
53
54
  | `./css/figure.css` | `./dist/css/figure.css` | Opt-in layered CSS leaf | Stable additive | Generated layered direct-import leaf. Opt-in and not included in dist/bronto.css. |
@@ -94,6 +95,7 @@ semantic versioning contract for the surfaces listed here.
94
95
  | `./css/unlayered/app.css` | `./css/app.css` | Unlayered CSS leaf | Stable path | Raw authored CSS leaf for consumers that deliberately opt out of @layer bronto on that leaf. |
95
96
  | `./css/unlayered/skins.css` | `./css/skins.css` | Unlayered CSS leaf | Stable path | Raw authored CSS leaf for consumers that deliberately opt out of @layer bronto on that leaf. |
96
97
  | `./css/unlayered/dataviz.css` | `./css/dataviz.css` | Unlayered CSS leaf | Stable path | Raw authored CSS leaf for consumers that deliberately opt out of @layer bronto on that leaf. |
98
+ | `./css/unlayered/blocknote.css` | `./css/blocknote.css` | Unlayered CSS leaf | Stable path | Raw authored CSS leaf for consumers that deliberately opt out of @layer bronto on that leaf. |
97
99
  | `./css/unlayered/report.css` | `./css/report.css` | Unlayered CSS leaf | Stable path | Raw authored CSS leaf for consumers that deliberately opt out of @layer bronto on that leaf. |
98
100
  | `./css/unlayered/row.css` | `./css/row.css` | Unlayered CSS leaf | Stable path | Raw authored CSS leaf for consumers that deliberately opt out of @layer bronto on that leaf. |
99
101
  | `./css/unlayered/figure.css` | `./css/figure.css` | Unlayered CSS leaf | Stable path | Raw authored CSS leaf for consumers that deliberately opt out of @layer bronto on that leaf. |
@@ -173,6 +175,7 @@ semantic versioning contract for the surfaces listed here.
173
175
  | `./docs/command.md` | `./docs/command.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
174
176
  | `./docs/interop/tailwind.md` | `./docs/interop/tailwind.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
175
177
  | `./docs/interop/react-flow.md` | `./docs/interop/react-flow.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
178
+ | `./docs/interop/blocknote.md` | `./docs/interop/blocknote.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
176
179
  | `./docs/migrations/0.2-to-0.3.md` | `./docs/migrations/0.2-to-0.3.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
177
180
  | `./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. |
178
181
  | `./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. |
@@ -299,6 +302,7 @@ always includes `package.json`, `README.md`, `LICENSE`, and
299
302
  | `docs/command.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
300
303
  | `docs/interop/tailwind.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
301
304
  | `docs/interop/react-flow.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
305
+ | `docs/interop/blocknote.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
302
306
  | `docs/migrations/0.2-to-0.3.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
303
307
  | `docs/migrations/0.3-to-0.4.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
304
308
  | `docs/migrations/0.4-to-0.5.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
@@ -328,8 +332,8 @@ result. The listed gates are part of `npm run check`.
328
332
  | Package manifest | `package.json` | docs/package-contract.md | `npm run package-contract:build` | check:fresh; check:exports; check:pack; check:consumer-surface; check:consumer-types; check:publint; check:attw | The complete export/file matrix in this document is generated from the manifest; packed tarball imports, concrete file resolution, and package-level type resolution are smoke-tested in clean consumers. |
329
333
  | Token model | `tokens/index.js` | css/tokens.css; tokens/index.json; tokens/tokens.dtcg.json; tokens/resolved.json; tokens/figma.variables.json; tokens/index.d.ts | `npm run tokens:css:build; tokens:build; dtcg:build; resolved:build; figma:variables:build; dts:build` | check:fresh; check:contrast | Token names/roles are public. Resolved and Figma handoff values are visual tuning before 1.0. |
330
334
  | Class registry | `classes/index.js plus css/*.css selectors` | classes/classes.json; classes/index.d.ts; classes/vscode.css-custom-data.json; docs/reference.md | `npm run classes:json:build; dts:build; vscode:build; reference:build` | check:fresh; check:classes; check:contract | The typed registry, JSON vocabulary, and generated reference stay aligned with real selectors. |
331
- | Authored CSS graph | `css/core.css plus css/*.css leaves` | dist/bronto.css; dist/css/*.css (48 layered outputs) | `npm run dist:build` | check:dist; check:exports; check:component-matrix | Default bundle and direct layered leaf imports are generated from authored CSS, size-gated, and coverage-owned as foundation or component leaves. |
332
- | JSDoc-authored public JS | `behaviors/; annotations/; connectors/; renderer/; react/; solid/; qwik/; svelte/; vue/` | adjacent *.d.ts and *.d.ts.map files | `npm run dts:emit` | check:dts-emit; check:types; check:consumer-surface; check:consumer-types; check:behavior-matrix; check:attw; check:publint | Declarations are emitted from the shipped JS, package subpath imports are compiled from a packed clean consumer, and public behavior exports are docs/unit/browser owned. |
335
+ | Authored CSS graph | `css/core.css plus css/*.css leaves` | dist/bronto.css; dist/css/*.css (49 layered outputs) | `npm run dist:build` | check:dist; check:exports; check:component-matrix | Default bundle and direct layered leaf imports are generated from authored CSS, size-gated, and coverage-owned as foundation or component leaves. |
336
+ | JSDoc-authored public JS | `connectors/; renderer/; annotations/; behaviors/` | adjacent *.d.ts and *.d.ts.map files | `npm run dts:emit` | check:dts-emit; check:types; check:consumer-surface; check:consumer-types; check:behavior-matrix; check:attw; check:publint | Declarations are emitted from the shipped JS, package subpath imports are compiled from a packed clean consumer, and public behavior exports are docs/unit/browser owned. |
333
337
  | Glyph registry | `glyphs/glyphs.js` | glyphs/glyphs.d.ts | `npm run glyphs:build` | check:glyphs; check:unit | Glyph names and render options are public. The registry stays sorted and type-covered. |
334
338
  | Display colorways | `tokens/skins.js` | css/skins.css; tokens/skins.d.ts | `npm run skins:build` | check:skins; check:contrast | Skins are opt-in root-level choices and never part of dist/bronto.css. |
335
339
  | Chart palette | `tokens/charts.js` | css/dataviz.css; tokens/charts.json; tokens/charts.d.ts | `npm run charts:build` | check:charts | Data-viz colors are opt-in, CVD-gated, and never UI chrome. |
package/docs/reference.md CHANGED
@@ -9,7 +9,7 @@ rendering of every class is the kitchen-sink demo:
9
9
  **<https://ponchia.github.io/bronto-ui/>**. Theming knobs and the token
10
10
  contract: [docs/theming.md](theming.md).
11
11
 
12
- - 695 classes across 187 component groups
12
+ - 696 classes across 187 component groups
13
13
  - Import the typed registry: `import { cls, ui, cx } from '@ponchia/ui/classes'`
14
14
  - Validate markup as data (no JS/TS): `@ponchia/ui/classes.json` — the same
15
15
  vocabulary as language-neutral JSON (`groups`, `classes`, `states`,
@@ -1035,6 +1035,7 @@ each one matches a real selector in the stylesheet.
1035
1035
  | Registry key | Class | Kind |
1036
1036
  | --- | --- | --- |
1037
1037
  | `cls.prose` | `ui-prose` | base |
1038
+ | `cls.proseBlocks` | `ui-prose--blocks` | modifier |
1038
1039
  | `cls.proseCompact` | `ui-prose--compact` | modifier |
1039
1040
 
1040
1041
  ### `.ui-provenance`
@@ -1759,6 +1760,10 @@ Exact mirror of the `:root` blocks in `css/tokens.css`
1759
1760
  | `--space-lg` | `1.35rem` |
1760
1761
  | `--space-xl` | `1.75rem` |
1761
1762
  | `--space-2xl` | `2.5rem` |
1763
+ | `--space-0-5` | `0.125rem` |
1764
+ | `--space-0-75` | `0.1875rem` |
1765
+ | `--space-1-5` | `0.375rem` |
1766
+ | `--space-2-5` | `0.625rem` |
1762
1767
  | `--tap-target` | `max(44px, 2.9rem)` |
1763
1768
  | `--tap-target-min` | `max(24px, 1.6rem)` |
1764
1769
  | `--safe-area-top` | `env(safe-area-inset-top, 0px)` |
@@ -1793,6 +1798,18 @@ Exact mirror of the `:root` blocks in `css/tokens.css`
1793
1798
  | `--z-overlay` | `30` |
1794
1799
  | `--z-popover` | `50` |
1795
1800
  | `--z-toast` | `60` |
1801
+ | `--z-canvas` | `var(--z-base)` |
1802
+ | `--z-chrome` | `var(--z-sticky)` |
1803
+ | `--z-panel` | `25` |
1804
+ | `--z-modal` | `var(--z-overlay)` |
1805
+ | `--z-menu` | `var(--z-popover)` |
1806
+ | `--z-tooltip` | `70` |
1807
+ | `--z-navigation` | `80` |
1808
+ | `--ui-zoom` | `1` |
1809
+ | `--ui-px` | `1px` |
1810
+ | `--hairline` | `1px` |
1811
+ | `--focus-ring-width` | `2px` |
1812
+ | `--focus-ring-offset` | `2px` |
1796
1813
  | `--accent-1` | `color-mix(in oklch, var(--accent) 8%, var(--accent-ramp-end))` |
1797
1814
  | `--accent-2` | `color-mix(in oklch, var(--accent) 16%, var(--accent-ramp-end))` |
1798
1815
  | `--accent-3` | `color-mix(in oklch, var(--accent) 32%, var(--accent-ramp-end))` |
package/docs/reporting.md CHANGED
@@ -60,18 +60,18 @@ No install? Link the same files from a CDN. Pin the version — pre-1.0, breakin
60
60
  changes ship in the minor (see [stability.md](./stability.md)):
61
61
 
62
62
  ```html
63
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.12.0/dist/bronto.css" />
64
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.12.0/dist/css/report-kit.css" />
63
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.13.0/dist/bronto.css" />
64
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.13.0/dist/css/report-kit.css" />
65
65
  ```
66
66
 
67
67
  Leaf-by-leaf CDN imports use the same `dist/css/` paths:
68
68
 
69
69
  ```html
70
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.12.0/dist/bronto.css" />
71
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.12.0/dist/css/report.css" />
72
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.12.0/dist/css/dataviz.css" />
73
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.12.0/dist/css/annotations.css" />
74
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.12.0/dist/css/legend.css" />
70
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.13.0/dist/bronto.css" />
71
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.13.0/dist/css/report.css" />
72
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.13.0/dist/css/dataviz.css" />
73
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.13.0/dist/css/annotations.css" />
74
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.13.0/dist/css/legend.css" />
75
75
  ```
76
76
 
77
77
  The CDN serves the package's own `fonts/` next to the CSS, so font URLs resolve
@@ -885,7 +885,7 @@ or validation runtime.
885
885
 
886
886
  ```json
887
887
  {
888
- "$schema": "https://cdn.jsdelivr.net/npm/@ponchia/ui@0.12.0/schemas/report-claims.v1.schema.json",
888
+ "$schema": "https://cdn.jsdelivr.net/npm/@ponchia/ui@0.13.0/schemas/report-claims.v1.schema.json",
889
889
  "schemaVersion": "bronto-report-claims.v1",
890
890
  "report": { "title": "Decision readiness", "type": "decision" },
891
891
  "claims": [
package/docs/stability.md CHANGED
@@ -1,7 +1,7 @@
1
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.12.x`) are
4
+ patches are non-breaking. In practical terms: **PATCH releases (`0.13.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
@@ -93,6 +93,7 @@ current public-surface matrix and the release policy above still applies.
93
93
  | 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. |
94
94
  | `.ui-icon` mask renderer | Stable | Class name, `--icon-size`, currentColor inheritance, and `--icon-mask` contract are public. The internal data URL encoding is not. |
95
95
  | 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. |
96
+ | BlockNote interop (`css/blocknote.css`) | Stable additive | The leaf is opt-in and maps BlockNote's `--bn-*` theme variables to bronto tokens. Which bronto token a BlockNote variable points at may tune with the tokens; newly mapped BlockNote variables are additive. Import the unlayered build after BlockNote's own stylesheet. |
96
97
  | Charts (`@ponchia/ui/charts`, `charts.json`, `css/dataviz.css`) | Stable additive | Token names (`--chart-*`, `--cat-N`, `--cat-N-tint`, `--cat-N-ink`), `CATEGORICAL_HUES`, the JSON shape, and the 8 categorical slots in fixed hue order 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. |
97
98
  | Renderer tokens (`@ponchia/ui/renderer`) | Stable additive | Function names, option names and the `RendererTokens` field names are public; new fields are additive. Colours are returned as `#rrggbb` or `rgba()` literals. The exact Vega/xterm mapping may tune with the token model. |
98
99
  | 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. |
package/docs/theming.md CHANGED
@@ -129,7 +129,10 @@ you change CSS `--accent` later.
129
129
 
130
130
  - **Spacing** — override the `--space-2xs … --space-2xl` scale, or use a
131
131
  preset: `data-density="compact"` / `data-density="comfortable"` on any
132
- element (defaults to the middle scale).
132
+ element (defaults to the middle scale). Dense tool chrome also gets four half
133
+ steps on the 0.25rem unit that the t-shirt scale skips: `--space-0-5`,
134
+ `--space-0-75`, `--space-1-5` and `--space-2-5` (2, 3, 6 and 10px at a 16px
135
+ root). The density presets scale them with the rest.
133
136
 
134
137
  **Read this before relying on the preset.** It re-points the `--space-*`
135
138
  scale, and only components whose padding is *expressed in that scale* move
@@ -189,6 +192,50 @@ you change CSS `--accent` later.
189
192
  set `accent-color` yourself on them — this is the one accent surface
190
193
  the framework can't tune for you.
191
194
 
195
+ ## A tool over a canvas: layers and zoom
196
+
197
+ **Layers.** A page needs six stacking layers (`--z-base`, `--z-raised`,
198
+ `--z-sticky`, `--z-overlay`, `--z-popover`, `--z-toast`). A tool drawn over a
199
+ canvas needs named ones, lowest first:
200
+
201
+ | Token | Value | For |
202
+ | --- | --- | --- |
203
+ | `--z-canvas` | `--z-base` | the canvas plane; its nodes stack locally inside it |
204
+ | `--z-chrome` | `--z-sticky` | toolbars, headers and rails over the canvas |
205
+ | `--z-panel` | 25 | docked and floating panels |
206
+ | `--z-modal` | `--z-overlay` | dialogs and their scrim |
207
+ | `--z-menu` | `--z-popover` | menus and popovers, including those a dialog opens |
208
+ | `--z-toast` | 60 | toasts |
209
+ | `--z-tooltip` | 70 | tooltips |
210
+ | `--z-navigation` | 80 | presentation and tour chrome that drives the whole surface |
211
+
212
+ Where a workspace layer means the same as a page layer it is an alias, so the
213
+ two scales cannot disagree.
214
+
215
+ **Zoom.** A host that draws bronto UI inside a scaled surface, such as a
216
+ zoomable canvas, marks the scaled element with `data-ui-zoom` and sets
217
+ `--ui-zoom` to its scale there:
218
+
219
+ ```css
220
+ .canvas-viewport {
221
+ --ui-zoom: var(--my-canvas-zoom);
222
+ }
223
+ ```
224
+
225
+ ```html
226
+ <div class="canvas-viewport" data-ui-zoom>…</div>
227
+ ```
228
+
229
+ Inside it `--ui-px` is one screen pixel (1px divided by the zoom, with the zoom
230
+ floored at 0.15), and `--hairline`, `--focus-ring-width` and
231
+ `--focus-ring-offset` are re-declared in it. Every bronto focus ring uses those
232
+ tokens, so a control inside a zoomed-out canvas keeps a 2px ring on screen.
233
+ Size your own canvas overlays the same way: `width: calc(1.5 * var(--ui-px))`.
234
+
235
+ The scope is an attribute rather than an inherited value on purpose. A custom
236
+ property that reads `--ui-zoom` resolves where it is declared, so a value set on
237
+ `:root` could not follow a zoomed subtree.
238
+
192
239
  ## Beyond accent: full re-skins
193
240
 
194
241
  The "Nothing" look is the **default skin, not the architecture**. It is
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.12.0/dist/css/<leaf>.css" />
48
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.13.0/dist/css/<leaf>.css" />
49
49
  ```
50
50
 
51
51
  The flattened default bundle is `dist/bronto.css` (bundler shorthand
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ponchia/ui",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "type": "module",
5
5
  "description": "CSS-first identity and UI layer for services, tools, sites, and reports — works in HTML, every framework, and PDF, no component runtime. Shared app shell, forms, tables, workflow chrome, plus opt-in analytical/report primitives. Monochrome with one rationed accent. Zero runtime dependencies.",
6
6
  "keywords": [
@@ -106,6 +106,7 @@
106
106
  "docs/command.md",
107
107
  "docs/interop/tailwind.md",
108
108
  "docs/interop/react-flow.md",
109
+ "docs/interop/blocknote.md",
109
110
  "docs/migrations/0.2-to-0.3.md",
110
111
  "docs/migrations/0.3-to-0.4.md",
111
112
  "docs/migrations/0.4-to-0.5.md",
@@ -164,7 +165,6 @@
164
165
  "check:recipe-types": "node scripts/check-recipe-types.mjs",
165
166
  "check:dead": "knip --treat-config-hints-as-errors",
166
167
  "check:complexity": "node scripts/check-complexity.mjs",
167
- "check:chain": "node scripts/check-chain.mjs",
168
168
  "check:dts-emit": "node scripts/check-dts-emit.mjs",
169
169
  "check:glyphs": "node scripts/check-glyphs.mjs",
170
170
  "check:color-policy": "node scripts/check-color-policy.mjs",
@@ -203,7 +203,7 @@
203
203
  "check:publint": "publint --strict",
204
204
  "check:attw": "attw --pack --ignore-rules no-resolution cjs-resolves-to-esm",
205
205
  "check:workflows": "github-actionlint .github/workflows/*.yml",
206
- "check": "npm run lint && npm run check:format && npm run check:exports && npm run check:fresh && npm run check:classes && npm run check:recipe-types && npm run check:dead && npm run check:complexity && npm run check:types && npm run check:unit && npm run check:shiki && npm run check:dist && npm run check:pack && npm run check:consumer-surface && npm run check:consumer-types && npm run check:component-matrix && npm run check:behavior-matrix && npm run check:helper-matrix && npm run check:examples && npm run check:visual-baselines && npm run check:playwright-container && npm run check:schemas && npm run check:publint && npm run check:attw && npm run check:workflows && npm run check:release && npm run check:versions && npm run check:migrations && npm run check:public-metadata && npm run check:public-hygiene && npm run check:doc-links && npm run check:doc-recipes && npm run check:contract && npm run check:variables && npm run check:contrast && npm run check:dtcg && npm run check:dts-emit && npm run check:glyphs && npm run check:color-policy && npm run check:skins && npm run check:charts && npm run check:mermaid && npm run check:d2 && npm run check:vega && npm run check:report && npm run check:legend && npm run check:chain",
206
+ "check": "node scripts/run-checks.mjs",
207
207
  "test": "node --test \"test/*.test.mjs\"",
208
208
  "test:e2e": "playwright test",
209
209
  "test:e2e:chromium": "playwright test --project=chromium",
@@ -222,16 +222,16 @@
222
222
  "@axe-core/playwright": "^4.11.3",
223
223
  "@playwright/test": "1.60.0",
224
224
  "github-actionlint": "^1.7.12",
225
- "jsdom": "^30.0.1",
226
- "knip": "^6.32.1",
227
- "pdfjs-dist": "^6.2.108",
228
- "prettier": "^3.9.6",
229
- "publint": "^0.3.23",
230
- "stylelint": "^17.14.1",
225
+ "jsdom": "^30.1.1",
226
+ "knip": "^6.39.0",
227
+ "pdfjs-dist": "^6.3.289",
228
+ "prettier": "^3.9.9",
229
+ "publint": "^0.3.24",
230
+ "stylelint": "^17.16.0",
231
231
  "stylelint-config-standard": "^40.0.0",
232
232
  "stylelint-use-logical": "^2.1.3",
233
233
  "typescript": "^6.0.3",
234
- "vega": "^6.3.1",
234
+ "vega": "^6.4.0",
235
235
  "vega-lite": "^6.4.3"
236
236
  },
237
237
  "exports": {
@@ -262,6 +262,7 @@
262
262
  "./css/app.css": "./dist/css/app.css",
263
263
  "./css/skins.css": "./dist/css/skins.css",
264
264
  "./css/dataviz.css": "./dist/css/dataviz.css",
265
+ "./css/blocknote.css": "./dist/css/blocknote.css",
265
266
  "./css/report.css": "./dist/css/report.css",
266
267
  "./css/row.css": "./dist/css/row.css",
267
268
  "./css/figure.css": "./dist/css/figure.css",
@@ -308,6 +309,7 @@
308
309
  "./css/unlayered/app.css": "./css/app.css",
309
310
  "./css/unlayered/skins.css": "./css/skins.css",
310
311
  "./css/unlayered/dataviz.css": "./css/dataviz.css",
312
+ "./css/unlayered/blocknote.css": "./css/blocknote.css",
311
313
  "./css/unlayered/report.css": "./css/report.css",
312
314
  "./css/unlayered/row.css": "./css/row.css",
313
315
  "./css/unlayered/figure.css": "./css/figure.css",
@@ -390,6 +392,7 @@
390
392
  "./docs/command.md": "./docs/command.md",
391
393
  "./docs/interop/tailwind.md": "./docs/interop/tailwind.md",
392
394
  "./docs/interop/react-flow.md": "./docs/interop/react-flow.md",
395
+ "./docs/interop/blocknote.md": "./docs/interop/blocknote.md",
393
396
  "./docs/migrations/0.2-to-0.3.md": "./docs/migrations/0.2-to-0.3.md",
394
397
  "./docs/migrations/0.3-to-0.4.md": "./docs/migrations/0.3-to-0.4.md",
395
398
  "./docs/migrations/0.4-to-0.5.md": "./docs/migrations/0.4-to-0.5.md",
@@ -1817,6 +1817,51 @@
1817
1817
  }
1818
1818
  }
1819
1819
  },
1820
+ {
1821
+ "name": "focus/ring/offset",
1822
+ "type": "FLOAT",
1823
+ "sourceCssVariable": "--focus-ring-offset",
1824
+ "valuesByMode": {
1825
+ "global": 2
1826
+ },
1827
+ "$extensions": {
1828
+ "com.ponchia.css": {
1829
+ "variable": "--focus-ring-offset",
1830
+ "value": "2px"
1831
+ }
1832
+ },
1833
+ "unit": "px"
1834
+ },
1835
+ {
1836
+ "name": "focus/ring/width",
1837
+ "type": "FLOAT",
1838
+ "sourceCssVariable": "--focus-ring-width",
1839
+ "valuesByMode": {
1840
+ "global": 2
1841
+ },
1842
+ "$extensions": {
1843
+ "com.ponchia.css": {
1844
+ "variable": "--focus-ring-width",
1845
+ "value": "2px"
1846
+ }
1847
+ },
1848
+ "unit": "px"
1849
+ },
1850
+ {
1851
+ "name": "hairline",
1852
+ "type": "FLOAT",
1853
+ "sourceCssVariable": "--hairline",
1854
+ "valuesByMode": {
1855
+ "global": 1
1856
+ },
1857
+ "$extensions": {
1858
+ "com.ponchia.css": {
1859
+ "variable": "--hairline",
1860
+ "value": "1px"
1861
+ }
1862
+ },
1863
+ "unit": "px"
1864
+ },
1820
1865
  {
1821
1866
  "name": "mono",
1822
1867
  "type": "STRING",
@@ -1976,6 +2021,66 @@
1976
2021
  }
1977
2022
  }
1978
2023
  },
2024
+ {
2025
+ "name": "space/0/5",
2026
+ "type": "FLOAT",
2027
+ "sourceCssVariable": "--space-0-5",
2028
+ "valuesByMode": {
2029
+ "global": 0.125
2030
+ },
2031
+ "$extensions": {
2032
+ "com.ponchia.css": {
2033
+ "variable": "--space-0-5",
2034
+ "value": "0.125rem"
2035
+ }
2036
+ },
2037
+ "unit": "rem"
2038
+ },
2039
+ {
2040
+ "name": "space/0/75",
2041
+ "type": "FLOAT",
2042
+ "sourceCssVariable": "--space-0-75",
2043
+ "valuesByMode": {
2044
+ "global": 0.1875
2045
+ },
2046
+ "$extensions": {
2047
+ "com.ponchia.css": {
2048
+ "variable": "--space-0-75",
2049
+ "value": "0.1875rem"
2050
+ }
2051
+ },
2052
+ "unit": "rem"
2053
+ },
2054
+ {
2055
+ "name": "space/1/5",
2056
+ "type": "FLOAT",
2057
+ "sourceCssVariable": "--space-1-5",
2058
+ "valuesByMode": {
2059
+ "global": 0.375
2060
+ },
2061
+ "$extensions": {
2062
+ "com.ponchia.css": {
2063
+ "variable": "--space-1-5",
2064
+ "value": "0.375rem"
2065
+ }
2066
+ },
2067
+ "unit": "rem"
2068
+ },
2069
+ {
2070
+ "name": "space/2/5",
2071
+ "type": "FLOAT",
2072
+ "sourceCssVariable": "--space-2-5",
2073
+ "valuesByMode": {
2074
+ "global": 0.625
2075
+ },
2076
+ "$extensions": {
2077
+ "com.ponchia.css": {
2078
+ "variable": "--space-2-5",
2079
+ "value": "0.625rem"
2080
+ }
2081
+ },
2082
+ "unit": "rem"
2083
+ },
1979
2084
  {
1980
2085
  "name": "space/2xl",
1981
2086
  "type": "FLOAT",
@@ -2229,6 +2334,36 @@
2229
2334
  },
2230
2335
  "unit": "em"
2231
2336
  },
2337
+ {
2338
+ "name": "ui/px",
2339
+ "type": "FLOAT",
2340
+ "sourceCssVariable": "--ui-px",
2341
+ "valuesByMode": {
2342
+ "global": 1
2343
+ },
2344
+ "$extensions": {
2345
+ "com.ponchia.css": {
2346
+ "variable": "--ui-px",
2347
+ "value": "1px"
2348
+ }
2349
+ },
2350
+ "unit": "px"
2351
+ },
2352
+ {
2353
+ "name": "ui/zoom",
2354
+ "type": "FLOAT",
2355
+ "sourceCssVariable": "--ui-zoom",
2356
+ "valuesByMode": {
2357
+ "global": 1
2358
+ },
2359
+ "$extensions": {
2360
+ "com.ponchia.css": {
2361
+ "variable": "--ui-zoom",
2362
+ "value": "1"
2363
+ }
2364
+ },
2365
+ "unit": "number"
2366
+ },
2232
2367
  {
2233
2368
  "name": "z/base",
2234
2369
  "type": "FLOAT",
@@ -2244,6 +2379,81 @@
2244
2379
  },
2245
2380
  "unit": "number"
2246
2381
  },
2382
+ {
2383
+ "name": "z/canvas",
2384
+ "type": "FLOAT",
2385
+ "sourceCssVariable": "--z-canvas",
2386
+ "valuesByMode": {
2387
+ "global": 0
2388
+ },
2389
+ "$extensions": {
2390
+ "com.ponchia.css": {
2391
+ "variable": "--z-canvas",
2392
+ "value": "0"
2393
+ }
2394
+ },
2395
+ "unit": "number"
2396
+ },
2397
+ {
2398
+ "name": "z/chrome",
2399
+ "type": "FLOAT",
2400
+ "sourceCssVariable": "--z-chrome",
2401
+ "valuesByMode": {
2402
+ "global": 20
2403
+ },
2404
+ "$extensions": {
2405
+ "com.ponchia.css": {
2406
+ "variable": "--z-chrome",
2407
+ "value": "20"
2408
+ }
2409
+ },
2410
+ "unit": "number"
2411
+ },
2412
+ {
2413
+ "name": "z/menu",
2414
+ "type": "FLOAT",
2415
+ "sourceCssVariable": "--z-menu",
2416
+ "valuesByMode": {
2417
+ "global": 50
2418
+ },
2419
+ "$extensions": {
2420
+ "com.ponchia.css": {
2421
+ "variable": "--z-menu",
2422
+ "value": "50"
2423
+ }
2424
+ },
2425
+ "unit": "number"
2426
+ },
2427
+ {
2428
+ "name": "z/modal",
2429
+ "type": "FLOAT",
2430
+ "sourceCssVariable": "--z-modal",
2431
+ "valuesByMode": {
2432
+ "global": 30
2433
+ },
2434
+ "$extensions": {
2435
+ "com.ponchia.css": {
2436
+ "variable": "--z-modal",
2437
+ "value": "30"
2438
+ }
2439
+ },
2440
+ "unit": "number"
2441
+ },
2442
+ {
2443
+ "name": "z/navigation",
2444
+ "type": "FLOAT",
2445
+ "sourceCssVariable": "--z-navigation",
2446
+ "valuesByMode": {
2447
+ "global": 80
2448
+ },
2449
+ "$extensions": {
2450
+ "com.ponchia.css": {
2451
+ "variable": "--z-navigation",
2452
+ "value": "80"
2453
+ }
2454
+ },
2455
+ "unit": "number"
2456
+ },
2247
2457
  {
2248
2458
  "name": "z/overlay",
2249
2459
  "type": "FLOAT",
@@ -2259,6 +2469,21 @@
2259
2469
  },
2260
2470
  "unit": "number"
2261
2471
  },
2472
+ {
2473
+ "name": "z/panel",
2474
+ "type": "FLOAT",
2475
+ "sourceCssVariable": "--z-panel",
2476
+ "valuesByMode": {
2477
+ "global": 25
2478
+ },
2479
+ "$extensions": {
2480
+ "com.ponchia.css": {
2481
+ "variable": "--z-panel",
2482
+ "value": "25"
2483
+ }
2484
+ },
2485
+ "unit": "number"
2486
+ },
2262
2487
  {
2263
2488
  "name": "z/popover",
2264
2489
  "type": "FLOAT",
@@ -2318,6 +2543,21 @@
2318
2543
  }
2319
2544
  },
2320
2545
  "unit": "number"
2546
+ },
2547
+ {
2548
+ "name": "z/tooltip",
2549
+ "type": "FLOAT",
2550
+ "sourceCssVariable": "--z-tooltip",
2551
+ "valuesByMode": {
2552
+ "global": 70
2553
+ },
2554
+ "$extensions": {
2555
+ "com.ponchia.css": {
2556
+ "variable": "--z-tooltip",
2557
+ "value": "70"
2558
+ }
2559
+ },
2560
+ "unit": "number"
2321
2561
  }
2322
2562
  ]
2323
2563
  }