@ponchia/ui 0.10.0 → 0.12.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 (62) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/MIGRATIONS.json +52 -9
  3. package/README.md +3 -3
  4. package/behaviors/forms.d.ts +1 -1
  5. package/behaviors/internal.d.ts +1 -1
  6. package/classes/classes.json +31 -2
  7. package/classes/index.d.ts +12 -0
  8. package/classes/index.js +13 -0
  9. package/css/annotations.css +2 -2
  10. package/css/app.css +3 -1
  11. package/css/command.css +4 -4
  12. package/css/dataviz.css +117 -64
  13. package/css/discussion.css +150 -0
  14. package/css/figure.css +6 -4
  15. package/css/generated.css +19 -12
  16. package/css/legend.css +14 -7
  17. package/css/report.css +25 -11
  18. package/css/sources.css +1 -1
  19. package/dist/bronto.css +1 -1
  20. package/dist/css/analytical.css +1 -1
  21. package/dist/css/annotations.css +1 -1
  22. package/dist/css/app.css +1 -1
  23. package/dist/css/command.css +1 -1
  24. package/dist/css/dataviz.css +1 -1
  25. package/dist/css/discussion.css +1 -0
  26. package/dist/css/figure.css +1 -1
  27. package/dist/css/generated.css +1 -1
  28. package/dist/css/legend.css +1 -1
  29. package/dist/css/report-kit.css +1 -1
  30. package/dist/css/report.css +1 -1
  31. package/dist/css/sources.css +1 -1
  32. package/docs/adr/0001-color-system.md +29 -0
  33. package/docs/architecture.md +1 -1
  34. package/docs/compositions.md +23 -2
  35. package/docs/contrast.md +24 -24
  36. package/docs/discussion.md +64 -0
  37. package/docs/figure.md +10 -1
  38. package/docs/frontier-primitives.md +5 -0
  39. package/docs/mermaid.md +1 -1
  40. package/docs/migrations/0.10-to-0.11.md +61 -0
  41. package/docs/migrations/0.11-to-0.12.md +47 -0
  42. package/docs/package-contract.md +14 -2
  43. package/docs/reference.md +18 -1
  44. package/docs/renderer.md +100 -0
  45. package/docs/reporting.md +9 -9
  46. package/docs/stability.md +4 -2
  47. package/docs/theming.md +29 -19
  48. package/docs/usage.md +12 -8
  49. package/docs/vega.md +24 -23
  50. package/llms.txt +8 -4
  51. package/package.json +18 -3
  52. package/renderer/index.d.ts +203 -0
  53. package/renderer/index.d.ts.map +1 -0
  54. package/renderer/index.js +650 -0
  55. package/tokens/charts.d.ts +16 -10
  56. package/tokens/charts.js +65 -49
  57. package/tokens/charts.json +77 -29
  58. package/tokens/mermaid.js +56 -56
  59. package/tokens/mermaid.json +56 -56
  60. package/tokens/vega.d.ts +3 -3
  61. package/tokens/vega.js +111 -72
  62. package/tokens/vega.json +198 -126
package/CHANGELOG.md CHANGED
@@ -5,6 +5,90 @@
5
5
  |> `^0` / `*` wildcard does **not** protect you. See README → Versioning, and
6
6
  |> the deprecation policy in CONTRIBUTING.md.
7
7
 
8
+ ## 0.12.0 — 2026-10-01
9
+
10
+ ### Changed
11
+
12
+ - **BREAKING: a categorical palette with no accent slot.** `--chart-1..8` are
13
+ now eight fixed hues — blue, orange, aqua, yellow, magenta, green, violet,
14
+ red — authored as measured sRGB per theme. Series 1 is no longer
15
+ `var(--accent)`, so an ordinary first series stops reading as an alert, and
16
+ the `ACCENT` export of `@ponchia/ui/charts` is removed. The 0.11 set failed
17
+ the measurable palette checks on the package's own surfaces (Okabe-Ito
18
+ yellow and the slate outside the lightness band, the slate under the chroma
19
+ floor). The values come from a consumer that validated and shipped them as a
20
+ recorded divergence. `CATEGORICAL_HUES` names the slots.
21
+ - **BREAKING: `--chart-seq-*` is one blue hue in five steps.** `--chart-seq-6`
22
+ is removed. Step 1 sits nearest the surface in both themes.
23
+ - **BREAKING: the static Vega config is frameless.** `brontoVegaConfig()` sets
24
+ no plot frame, draws a single series in the first categorical hue, keeps a
25
+ `--panel` gap between adjacent fills and sets readable label sizes. It is now
26
+ generated from `@ponchia/ui/renderer`'s `vegaConfig()`, so the static and
27
+ runtime configs share one mapping. `brontoVegaAccent()` returns `--accent`
28
+ and `brontoVegaNeutral()` returns `--text-dim`.
29
+ - `check:charts` measures what a reader sees: per theme and against the panel,
30
+ the page and the OLED surfaces, each slot sits inside the OKLCH lightness
31
+ band and above the chroma floor, and adjacent slots stay apart under
32
+ simulated protanopia/deuteranopia (ΔE×100 ≥ 6) and normal vision (≥ 15).
33
+ All-pairs separation and sub-3:1 contrast are reported, not gated; the
34
+ pattern fill remains the second channel. ADR-0001 step 7 records the
35
+ amendment.
36
+
37
+ ### Added
38
+
39
+ - **Categorical identity tokens** in `css/dataviz.css`: `--cat-1..8` (the same
40
+ hues), `--cat-N-tint` (a 16% wash over `--panel`, so it follows skins and
41
+ OLED) and `--cat-N-ink` (text that holds 4.5:1 on the panel, the page and its
42
+ own tint, gated). For tags, participants and user-chosen tints — never
43
+ status. `charts.json` gains `hues`, `tint` and `ink`.
44
+ - **`@ponchia/ui/renderer`** — the live theme for renderers that cannot read
45
+ CSS. `readTokens()` resolves the bronto roles a renderer needs (surfaces,
46
+ inks, lines, accent, status, fonts, categorical set and ramps) to `#rrggbb`
47
+ or `rgba()` literals, following skins, contrast and the OLED surface.
48
+ `observeTokens()` calls back when one of them changed. `vegaConfig()` and
49
+ `xtermTheme()` map tokens to those renderers' configuration; `parseColor()`,
50
+ `formatColor()` and `resolveColor()` convert any CSS colour, including
51
+ `oklch()`, `lab()` and `color(display-p3 …)`.
52
+
53
+ See [the migration guide](docs/migrations/0.11-to-0.12.md).
54
+
55
+ ## 0.11.0 — 2026-09-09
56
+
57
+ ### Changed
58
+
59
+ - **BREAKING: complete the supporting typography.** Figure captions, legend
60
+ text, generated-content labels and command groups use sentence-case sans.
61
+ Technical log bodies and identifiers retain mono. Caption text is 14px at
62
+ the default root size; inline citations no longer shrink below 12px.
63
+ - Figure keys and decision/action rows respond to their own available width.
64
+ Two-up comparisons wrap intrinsically, including outside a report. Named
65
+ containment on figure, decision-grid and actions wrappers is disabled for
66
+ print to preserve document flow.
67
+
68
+ ### Fixed
69
+
70
+ - Narrow evidence panels no longer squeeze a chart into 40px or decision text
71
+ into 21px on a wide page. Long action status and legend labels wrap.
72
+ - Long mobile navigation labels wrap while keeping every destination reachable.
73
+ - The figure specimen's authored annotation stays inside its viewBox.
74
+ - Generated-content disclosure summaries retain the coarse-pointer target floor.
75
+
76
+ ### Added
77
+
78
+ - Optional `discussion.css` with thread lists, quoted passages, messages and
79
+ composers. State and posting remain host-owned; includes a local interactive
80
+ specimen and a narrow-panel example.
81
+
82
+ - A working service specimen with deterministic loading, empty, error and stale
83
+ states, environment/search filtering, retry and native-dialog sample creation.
84
+ Unavailable observations never retain an operational health claim. Product
85
+ state stays in the specimen; no framework state machine or data dependency.
86
+ - Narrow-parent regression checks, including a comparison outside a report,
87
+ annotation bounds, long action status, citation text and recovery journeys.
88
+ - A complete-screen migration recipe for explicit consumer typography overrides.
89
+
90
+ See [the migration guide](docs/migrations/0.10-to-0.11.md).
91
+
8
92
  ## 0.10.0 — 2026-09-08
9
93
 
10
94
  ### Changed
package/MIGRATIONS.json CHANGED
@@ -83,7 +83,7 @@
83
83
  {
84
84
  "old": "hero / project-* / post-card / essay-* / page-* / home-* / signal-panel / worklog-summary",
85
85
  "new": "the ui-* content layer",
86
- "note": "Long-form content: .ui-prose / .ui-quote. Cards: .ui-card. Layout: .ui-grid / .ui-stack. Site chrome: the ui-site* shell. No 1:1 mapping \u2014 re-compose with the content primitives."
86
+ "note": "Long-form content: .ui-prose / .ui-quote. Cards: .ui-card. Layout: .ui-grid / .ui-stack. Site chrome: the ui-site* shell. No 1:1 mapping — re-compose with the content primitives."
87
87
  },
88
88
  {
89
89
  "old": "callout",
@@ -98,7 +98,7 @@
98
98
  {
99
99
  "old": "tag-list / tag",
100
100
  "new": "ui-tags / ui-tag",
101
- "note": "Compact variant .tag-list--compact \u2192 .ui-tags--compact; verify accent-on-accent contrast (see CHANGELOG 0.3.0 a11y fix)."
101
+ "note": "Compact variant .tag-list--compact → .ui-tags--compact; verify accent-on-accent contrast (see CHANGELOG 0.3.0 a11y fix)."
102
102
  }
103
103
  ],
104
104
  "codemod": "See docs/migrations/0.2-to-0.3.md for a ready-to-run ripgrep+sed recipe covering the 'safe' rules."
@@ -111,7 +111,7 @@
111
111
  "manual": [
112
112
  {
113
113
  "old": "--orange / --orange-soft",
114
- "new": "(removed \u2014 re-declare in a consumer :root override if referenced)",
114
+ "new": "(removed — re-declare in a consumer :root override if referenced)",
115
115
  "note": "Orphan token pair: defined in the token mirrors but referenced by no shipped component and documented nowhere, and untiered under the new colour model. Removed under the CONTRIBUTING 'provably-unreferenced surface' exception. If you used it: :root { --orange: #a85f32; --orange-soft: rgb(168 95 50 / 0.13); }"
116
116
  }
117
117
  ],
@@ -120,7 +120,7 @@
120
120
  {
121
121
  "from": "0.4",
122
122
  "to": "0.5",
123
- "summary": "Adds the analytical-primitives suite (annotations, legend, marks, connectors, spotlight, crosshair, selection + the analytical.css roll-up); all additive/opt-in. Three breaking changes: the chart data key moved out of the report kit into the standalone Legends layer (`.ui-chart__legend`/`.ui-chart__swatch` removed); annotation arrowheads now render via the shared connectors geometry kernel (a small visual path change, no API change); and the marks/bracket-note rationed-accent tone was renamed `evidence`\u2192`accent` to match the annotation/connector tone vocabulary (`.ui-annotation--evidence` stays \u2014 it's a marker variant, not a tone).",
123
+ "summary": "Adds the analytical-primitives suite (annotations, legend, marks, connectors, spotlight, crosshair, selection + the analytical.css roll-up); all additive/opt-in. Three breaking changes: the chart data key moved out of the report kit into the standalone Legends layer (`.ui-chart__legend`/`.ui-chart__swatch` removed); annotation arrowheads now render via the shared connectors geometry kernel (a small visual path change, no API change); and the marks/bracket-note rationed-accent tone was renamed `evidence`→`accent` to match the annotation/connector tone vocabulary (`.ui-annotation--evidence` stays — it's a marker variant, not a tone).",
124
124
  "safe": [
125
125
  {
126
126
  "old": "ui-chart__swatch",
@@ -139,12 +139,12 @@
139
139
  {
140
140
  "old": "ui.mark({ tone: 'evidence' }) / ui.bracketNote({ tone: 'evidence' })",
141
141
  "new": "tone: 'accent'",
142
- "note": "The rationed-accent tone option on the mark/bracket-note recipes is now 'accent' (was 'evidence'), matching ui.connector/ui.annotation. Do NOT rewrite ui.annotation({ variant: 'evidence' }) or the 'evidence' subject marker \u2014 those are a marker shape, not a tone, and are unchanged."
142
+ "note": "The rationed-accent tone option on the mark/bracket-note recipes is now 'accent' (was 'evidence'), matching ui.connector/ui.annotation. Do NOT rewrite ui.annotation({ variant: 'evidence' }) or the 'evidence' subject marker — those are a marker shape, not a tone, and are unchanged."
143
143
  },
144
144
  {
145
145
  "old": "ui-chart__legend",
146
146
  "new": "ui-legend",
147
- "note": "Also import '@ponchia/ui/css/legend.css' beside report.css, and wrap each entry's content as <li class=\"ui-legend__item\"> \u2026 <span class=\"ui-legend__label\">\u2026</span>. The swatch's --chart-color/--chart-pattern inline contract is unchanged; the categorical --chart-N colour is also available via .ui-legend__swatch--N. See docs/legends.md."
147
+ "note": "Also import '@ponchia/ui/css/legend.css' beside report.css, and wrap each entry's content as <li class=\"ui-legend__item\"> … <span class=\"ui-legend__label\">…</span>. The swatch's --chart-color/--chart-pattern inline contract is unchanged; the categorical --chart-N colour is also available via .ui-legend__swatch--N. See docs/legends.md."
148
148
  },
149
149
  {
150
150
  "old": "connectorEndArrow (annotations)",
@@ -157,16 +157,16 @@
157
157
  {
158
158
  "from": "0.5",
159
159
  "to": "0.6",
160
- "summary": "Charting realignment. The local static bar-chart renderer (.ui-chart*) is removed \u2014 a chart needs scales + data binding, out of scope for the analytical layer. bronto is now a themeable target for Vega-Lite (@ponchia/ui/vega), the same tokens-as-data path as Mermaid/D2. The --chart-* data-viz palette, tokens/charts.json, and the .ui-legend layer are unchanged.",
160
+ "summary": "Charting realignment. The local static bar-chart renderer (.ui-chart*) is removed — a chart needs scales + data binding, out of scope for the analytical layer. bronto is now a themeable target for Vega-Lite (@ponchia/ui/vega), the same tokens-as-data path as Mermaid/D2. The --chart-* data-viz palette, tokens/charts.json, and the .ui-legend layer are unchanged.",
161
161
  "safe": [],
162
162
  "manual": [
163
163
  {
164
164
  "old": "ui-chart / ui-chart__plot / ui-chart__bar / ui-chart__label / ui-chart__track / ui-chart__fill / ui-chart__fallback / ui-chart__caption",
165
165
  "new": "a Vega-Lite chart themed with @ponchia/ui/vega, or a token-themed inline <svg>",
166
- "note": "No 1:1 class mapping \u2014 the renderer is removed. For a real chart: import '@ponchia/ui/vega', pass brontoVegaConfig(theme) to vega-embed, and place the result in a <figure class=\"ui-report__figure\"> with a <figcaption class=\"ui-report__caption\"> and a <ul class=\"ui-legend\"> key (see docs/vega.md). For a frozen/print chart: hand-author an inline <svg> using the --chart-N palette tokens for fills. The --chart-value inline knob is gone; --chart-color/--chart-pattern remain on .ui-legend__swatch."
166
+ "note": "No 1:1 class mapping — the renderer is removed. For a real chart: import '@ponchia/ui/vega', pass brontoVegaConfig(theme) to vega-embed, and place the result in a <figure class=\"ui-report__figure\"> with a <figcaption class=\"ui-report__caption\"> and a <ul class=\"ui-legend\"> key (see docs/vega.md). For a frozen/print chart: hand-author an inline <svg> using the --chart-N palette tokens for fills. The --chart-value inline knob is gone; --chart-color/--chart-pattern remain on .ui-legend__swatch."
167
167
  }
168
168
  ],
169
- "codemod": "No codemod \u2014 the .ui-chart* renderer has no replacement class. rg -l 'ui-chart\\\\b|ui-chart__' to find call sites, then rebuild each as a Vega-Lite chart (@ponchia/ui/vega) or a token-themed inline <svg>. See docs/vega.md."
169
+ "codemod": "No codemod — the .ui-chart* renderer has no replacement class. rg -l 'ui-chart\\\\b|ui-chart__' to find call sites, then rebuild each as a Vega-Lite chart (@ponchia/ui/vega) or a token-themed inline <svg>. See docs/vega.md."
170
170
  },
171
171
  {
172
172
  "from": "0.6",
@@ -205,6 +205,49 @@
205
205
  }
206
206
  ],
207
207
  "codemod": "See docs/migrations/0.9-to-0.10.md. Changes require consumer lifecycle and visual review; no blanket replacement is safe."
208
+ },
209
+ {
210
+ "from": "0.10",
211
+ "to": "0.11",
212
+ "summary": "Readable supporting typography and container-aware evidence layouts.",
213
+ "safe": [],
214
+ "manual": [
215
+ {
216
+ "old": "viewport-based figure/report layouts",
217
+ "new": "container-aware figure, decision-grid and actions layouts; intrinsic two-up comparisons",
218
+ "note": "Keep the documented wrappers, verify narrow parents on wide screens and review print. New inline-size containment can change intrinsic sizing."
219
+ },
220
+ {
221
+ "old": "uppercase mono explanatory labels and unconstrained superscript citations",
222
+ "new": "sentence-case sans supporting text and a citation size floor",
223
+ "note": "Review explicit consumer overrides by role, preserving intentional display and technical identifiers."
224
+ }
225
+ ],
226
+ "codemod": "No automatic rewrite: review complete consumer tasks and docs/migrations/0.10-to-0.11.md."
227
+ },
228
+ {
229
+ "from": "0.11",
230
+ "to": "0.12",
231
+ "summary": "Categorical palette with no accent slot, categorical identity tokens, runtime renderer tokens.",
232
+ "safe": [],
233
+ "manual": [
234
+ {
235
+ "old": "--chart-1 = var(--accent) / ACCENT from @ponchia/ui/charts",
236
+ "new": "fixed hues; paint an emphasised mark with var(--accent) or brontoVegaAccent(theme)",
237
+ "note": "ACCENT is removed. Charts that meant 'the brand' need an explicit accent encoding."
238
+ },
239
+ {
240
+ "old": "--chart-seq-6",
241
+ "new": "--chart-seq-1..5",
242
+ "note": "Re-map six-bin sequential figures to five bins."
243
+ },
244
+ {
245
+ "old": "brontoVegaConfig() framed plot, accent default mark",
246
+ "new": "frameless plot, first categorical hue as the default mark",
247
+ "note": "A spec's own config still wins; review dashboards that relied on the frame."
248
+ }
249
+ ],
250
+ "codemod": "No automatic rewrite: see docs/migrations/0.11-to-0.12.md."
208
251
  }
209
252
  ]
210
253
  }
package/README.md CHANGED
@@ -93,7 +93,7 @@ Or drop it in with no build step, straight from a CDN (replace the version only
93
93
  when deliberately upgrading across a breaking pre-1.0 minor):
94
94
 
95
95
  ```html
96
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.10.0/dist/bronto.css">
96
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.12.0/dist/bronto.css">
97
97
  ```
98
98
 
99
99
  ## Quick start
@@ -171,7 +171,7 @@ Arrows, chevrons, check/close/plus/minus, search/menu/gear, info/warning/bell/lo
171
171
  - **Motion & dots** — the dot-matrix motif kit: dot grid, status dots, dot loaders, the orbital spinner, matrix reveal — all reduced-motion aware.
172
172
  - **Glyphs** — `@ponchia/ui/glyphs`, a 71-glyph dot-matrix icon set on the `.ui-dotmatrix` primitive (display marks + crisp `solid` inline icons + one-node `.ui-icon` mask rendering).
173
173
  - **Colorways** _(opt-in)_ — `data-bronto-skin="amber-crt | phosphor-green | e-ink"`: a root-level recolour of the one accent (OKLCH, per-theme, contrast-gated), never in the default bundle.
174
- - **Data-viz** _(opt-in)_ — a colourblind-safe chart palette (`--chart-*` + dot-matrix pattern fills, resolved hex in `charts.json`), gated under simulated protan/deutan/tritan vision. Charts only, never UI chrome.
174
+ - **Categorical + data-viz** _(opt-in)_ — eight fixed hues as chart series (`--chart-*`, sequential/diverging ramps, dot-matrix pattern fills) and as categorical identity (`--cat-*` with tint and text ink), measured per theme and surface. Never UI chrome. `@ponchia/ui/renderer` resolves them, with the chrome, for canvas/WebGL/SVG renderers.
175
175
 
176
176
  Full generated catalog of every class: **[docs/reference.md](https://github.com/Ponchia/bronto-ui/blob/main/docs/reference.md)**. The decision guide (which primitive when): **[docs/usage.md](https://github.com/Ponchia/bronto-ui/blob/main/docs/usage.md)**.
177
177
 
@@ -221,7 +221,7 @@ Per-framework getting-started guides + runnable example apps live in the repo:
221
221
 
222
222
  - **Tokens as data** — `import tokens, { themeColor, cssVars } from '@ponchia/ui/tokens'` (plus authored `tokens.json`, a structured DTCG 2025.10 `tokens.dtcg.json`, `tokens/resolved.json` for concrete values in canvas/SVG/MapLibre, and `tokens/figma.variables.json` for local Figma Variables import/sync scripts).
223
223
  - **Consumer contract checker** — after an upgrade, run `npx --no-install bronto-ui-check src` to catch unknown literal `ui-*` classes and unresolved Bronto token references in code, style, and template sources before build or deployment. Comments, generated/vendor directories, and Markdown prose are excluded.
224
- - **Chart colours for dashboards** — `import charts from '@ponchia/ui/charts.json' with { type: 'json' }` in Node ESM, or the same path through a bundler JSON import (resolved hex per theme; series 1 = your accent) plus the opt-in `@ponchia/ui/css/dataviz.css`.
224
+ - **Chart colours for dashboards** — `import charts from '@ponchia/ui/charts.json' with { type: 'json' }` in Node ESM, or the same path through a bundler JSON import (resolved hex per theme, eight fixed hues) plus the opt-in `@ponchia/ui/css/dataviz.css`; for a live page that switches skin or theme, `@ponchia/ui/renderer` resolves the same palette and chrome at runtime.
225
225
  - **Static reports for LLMs** — add `@ponchia/ui/css/report-kit.css` for the complete report vocabulary, or `@ponchia/ui/css/report.css` plus the specific leaves a smaller report needs. Sidecar claim/source contracts can validate against `@ponchia/ui/schemas/report-claims.v1.schema.json`. Full cookbook: `docs/reporting.md`.
226
226
  - **Modern-platform motion** — overlays (modal/drawer/popover), toasts and the `<details>` accordion animate **in and out** with zero JS (`@starting-style` + `allow-discrete`, `::details-content` + `interpolate-size`). Progressive-enhancement extras: `.ui-scroll-progress` / `.ui-scroll-reveal` (scroll-driven, no JS) and `.ui-vt` for View Transitions. All degrade to a static end-state and respect `prefers-reduced-motion`. For smooth **cross-document** navigations, add the document-global one-liner to your own top-level (unlayered) CSS: `@view-transition { navigation: auto; }`.
227
227
  - **Editor IntelliSense** — point VS Code at the shipped custom-data file so every token autocompletes in `var(--…)`:
@@ -37,7 +37,7 @@ export type FormValidationOpts = {
37
37
  /**
38
38
  * Event-delegation root; default: `document`.
39
39
  */
40
- root?: Document | Element | null | undefined;
40
+ root?: Element | Document | null | undefined;
41
41
  /**
42
42
  * Localized validation-summary title. A summary/form
43
43
  * `data-bronto-error-summary-title` attribute overrides it, and an authored
@@ -21,6 +21,6 @@ export type DelegateOpts = {
21
21
  * Event-delegation root; also scopes which controls are queried. Default: `document`.
22
22
  * `null` means a scope was requested but is not ready yet, so the behavior no-ops.
23
23
  */
24
- root?: Document | Element | null | undefined;
24
+ root?: Element | Document | null | undefined;
25
25
  };
26
26
  //# sourceMappingURL=internal.d.ts.map
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$comment": "@ponchia/ui class vocabulary as language-neutral data — validate emitted markup without executing the ESM cls map or parsing the .d.ts. Generated from classes/index.js — do not edit by hand; run `npm run classes:json:build`. Drift-checked in CI. `groups[].base` is null for a parts-only namespace (no standalone base class — do NOT emit it). A modifier whose name contains `__` (e.g. `ui-spark__bar--pos`) attaches to THAT part, not the base host. `states` is the author-applied `is-*` hooks (runtime/behavior-managed hooks are excluded); `behaviorAttributes` are the `data-bronto-*` wiring hooks the optional behaviors delegate on; `requiredAria` is the role/aria a generator must emit per component. `states` + `customProperties` are documented in docs/reference.md and ship outside `cls` by design.",
3
3
  "counts": {
4
- "classes": 683,
5
- "groups": 186
4
+ "classes": 695,
5
+ "groups": 187
6
6
  },
7
7
  "groups": {
8
8
  "ui-accordion": {
@@ -465,6 +465,23 @@
465
465
  "ui-diff__row"
466
466
  ]
467
467
  },
468
+ "ui-discussion": {
469
+ "base": "ui-discussion",
470
+ "modifiers": [],
471
+ "parts": [
472
+ "ui-discussion__actions",
473
+ "ui-discussion__composer",
474
+ "ui-discussion__header",
475
+ "ui-discussion__hint",
476
+ "ui-discussion__item",
477
+ "ui-discussion__list",
478
+ "ui-discussion__message",
479
+ "ui-discussion__messages",
480
+ "ui-discussion__meta",
481
+ "ui-discussion__quote",
482
+ "ui-discussion__state"
483
+ ]
484
+ },
468
485
  "ui-display": {
469
486
  "base": "ui-display",
470
487
  "modifiers": [],
@@ -1799,6 +1816,18 @@
1799
1816
  "ui-diff__row--add",
1800
1817
  "ui-diff__row--context",
1801
1818
  "ui-diff__row--remove",
1819
+ "ui-discussion",
1820
+ "ui-discussion__actions",
1821
+ "ui-discussion__composer",
1822
+ "ui-discussion__header",
1823
+ "ui-discussion__hint",
1824
+ "ui-discussion__item",
1825
+ "ui-discussion__list",
1826
+ "ui-discussion__message",
1827
+ "ui-discussion__messages",
1828
+ "ui-discussion__meta",
1829
+ "ui-discussion__quote",
1830
+ "ui-discussion__state",
1802
1831
  "ui-display",
1803
1832
  "ui-divider",
1804
1833
  "ui-dot",
@@ -382,6 +382,18 @@ export declare const cls: {
382
382
  readonly legendTrack: 'ui-legend__track';
383
383
  readonly legendTicks: 'ui-legend__ticks';
384
384
  readonly legendTick: 'ui-legend__tick';
385
+ readonly discussion: 'ui-discussion';
386
+ readonly discussionHeader: 'ui-discussion__header';
387
+ readonly discussionActions: 'ui-discussion__actions';
388
+ readonly discussionQuote: 'ui-discussion__quote';
389
+ readonly discussionMessages: 'ui-discussion__messages';
390
+ readonly discussionList: 'ui-discussion__list';
391
+ readonly discussionMessage: 'ui-discussion__message';
392
+ readonly discussionMeta: 'ui-discussion__meta';
393
+ readonly discussionHint: 'ui-discussion__hint';
394
+ readonly discussionState: 'ui-discussion__state';
395
+ readonly discussionItem: 'ui-discussion__item';
396
+ readonly discussionComposer: 'ui-discussion__composer';
385
397
  readonly annotation: 'ui-annotation';
386
398
  readonly annotationSubject: 'ui-annotation__subject';
387
399
  readonly annotationConnector: 'ui-annotation__connector';
package/classes/index.js CHANGED
@@ -400,6 +400,19 @@ export const cls = Object.freeze({
400
400
  legendTrack: 'ui-legend__track',
401
401
  legendTicks: 'ui-legend__ticks',
402
402
  legendTick: 'ui-legend__tick',
403
+ // discussions (opt-in discussion.css; host-owned state)
404
+ discussion: 'ui-discussion',
405
+ discussionHeader: 'ui-discussion__header',
406
+ discussionActions: 'ui-discussion__actions',
407
+ discussionQuote: 'ui-discussion__quote',
408
+ discussionMessages: 'ui-discussion__messages',
409
+ discussionList: 'ui-discussion__list',
410
+ discussionMessage: 'ui-discussion__message',
411
+ discussionMeta: 'ui-discussion__meta',
412
+ discussionHint: 'ui-discussion__hint',
413
+ discussionState: 'ui-discussion__state',
414
+ discussionItem: 'ui-discussion__item',
415
+ discussionComposer: 'ui-discussion__composer',
403
416
  annotation: 'ui-annotation',
404
417
  annotationSubject: 'ui-annotation__subject',
405
418
  annotationConnector: 'ui-annotation__connector',
@@ -14,7 +14,7 @@
14
14
  --annotation-stroke-width: 1.5;
15
15
 
16
16
  color: var(--annotation-color);
17
- font-family: var(--mono);
17
+ font-family: var(--sans);
18
18
  font-size: var(--text-xs);
19
19
  overflow: visible;
20
20
  }
@@ -96,7 +96,7 @@
96
96
  stroke: var(--annotation-note-bg);
97
97
  stroke-linejoin: round;
98
98
  stroke-width: 3;
99
- text-transform: uppercase;
99
+ text-transform: none;
100
100
  }
101
101
 
102
102
  .ui-annotation__label {
package/css/app.css CHANGED
@@ -73,6 +73,8 @@
73
73
  }
74
74
 
75
75
  .ui-app-nav a {
76
+ min-inline-size: 0;
77
+ overflow-wrap: anywhere;
76
78
  align-items: center;
77
79
  border-inline-start: 2px solid transparent;
78
80
  color: var(--text-soft);
@@ -354,7 +356,7 @@
354
356
  justify-content: center;
355
357
  border-inline-start: 0;
356
358
  border-block-end: 2px solid transparent;
357
- white-space: nowrap;
359
+ white-space: normal;
358
360
  }
359
361
 
360
362
  .ui-app-nav a.is-active,
package/css/command.css CHANGED
@@ -43,11 +43,11 @@
43
43
 
44
44
  .ui-command__group {
45
45
  color: var(--text-dim);
46
- font-family: var(--mono);
47
- font-size: var(--text-2xs);
48
- letter-spacing: var(--tracking-wide);
46
+ font-family: var(--sans);
47
+ font-size: var(--text-xs);
48
+ letter-spacing: 0;
49
49
  padding: 0.5rem 0.6rem 0.25rem;
50
- text-transform: uppercase;
50
+ text-transform: none;
51
51
  }
52
52
 
53
53
  .ui-command__item {
package/css/dataviz.css CHANGED
@@ -1,27 +1,39 @@
1
1
  /* @ponchia/ui — GENERATED from tokens/charts.js by scripts/gen-charts.mjs.
2
2
  * Do not edit by hand; run `npm run charts:build`. Drift-checked in CI.
3
3
  *
4
- * Tier-4 data-viz palette (ADR-0001). OPT-IN: import `@ponchia/ui/css/dataviz.css`
5
- * on demand; never in the default bundle, never UI chrome. --chart-1 is the live
6
- * accent (series 1 = brand). Pair colour N with pattern N (a 2nd, non-colour
7
- * channel): background: var(--chart-3); background-image: var(--chart-pattern-3);
4
+ * Tier-4 categorical + data-viz palette (ADR-0001). OPT-IN: import
5
+ * `@ponchia/ui/css/dataviz.css` on demand; never in the default bundle, never
6
+ * UI chrome. Eight fixed hues (blue, orange, aqua, yellow, magenta, green,
7
+ * violet, red) in two namespaces:
8
+ * --cat-N / --cat-N-tint / --cat-N-ink categorical identity (a tag, a
9
+ * participant, a user-chosen tint): ink holds 4.5:1 on the panel and tint.
10
+ * --chart-N, --chart-seq-*, --chart-div-* data-viz series and ramps.
11
+ * Pair colour N with pattern N (a 2nd, non-colour channel):
12
+ * background: var(--chart-3); background-image: var(--chart-pattern-3);
8
13
  * background-size: var(--chart-pattern-size); --chart-pattern-ink: <contrast>. */
9
14
 
10
15
  :root {
11
- --chart-1: var(--accent);
12
- --chart-2: #e69f00;
13
- --chart-3: #56b4e9;
14
- --chart-4: #009e73;
15
- --chart-5: #f0e442;
16
- --chart-6: #0072b2;
17
- --chart-7: #cc79a7;
18
- --chart-8: #4d5358;
19
- --chart-seq-1: oklch(94% 0.03 25deg);
20
- --chart-seq-2: oklch(85% 0.07 25deg);
21
- --chart-seq-3: oklch(74% 0.12 25deg);
22
- --chart-seq-4: oklch(62% 0.16 25deg);
23
- --chart-seq-5: oklch(50% 0.16 25deg);
24
- --chart-seq-6: oklch(38% 0.13 25deg);
16
+ --cat-1: #2a78d6;
17
+ --cat-2: #eb6834;
18
+ --cat-3: #1baf7a;
19
+ --cat-4: #eda100;
20
+ --cat-5: #e87ba4;
21
+ --cat-6: #008300;
22
+ --cat-7: #4a3aa7;
23
+ --cat-8: #e34948;
24
+ --cat-1-ink: #1467c3;
25
+ --cat-2-ink: #bf3f00;
26
+ --cat-3-ink: #007d4c;
27
+ --cat-4-ink: #a45d00;
28
+ --cat-5-ink: #b04972;
29
+ --cat-6-ink: #007800;
30
+ --cat-7-ink: #4a3aa7;
31
+ --cat-8-ink: #c62b30;
32
+ --chart-seq-1: #80b0e8;
33
+ --chart-seq-2: #5598e7;
34
+ --chart-seq-3: #2a78d6;
35
+ --chart-seq-4: #1c5cab;
36
+ --chart-seq-5: #104281;
25
37
  --chart-div-1: oklch(45% 0.14 255deg);
26
38
  --chart-div-2: oklch(62% 0.1 250deg);
27
39
  --chart-div-3: oklch(82% 0.05 245deg);
@@ -30,11 +42,31 @@
30
42
  --chart-div-6: oklch(66% 0.13 55deg);
31
43
  --chart-div-7: oklch(56% 0.15 45deg);
32
44
 
45
+ /* Theme-independent: each series and tint follows its slot, and the tint
46
+ follows whichever --panel the page, a skin or the OLED preset set. */
47
+ --cat-1-tint: color-mix(in oklch, var(--cat-1) 16%, var(--panel));
48
+ --cat-2-tint: color-mix(in oklch, var(--cat-2) 16%, var(--panel));
49
+ --cat-3-tint: color-mix(in oklch, var(--cat-3) 16%, var(--panel));
50
+ --cat-4-tint: color-mix(in oklch, var(--cat-4) 16%, var(--panel));
51
+ --cat-5-tint: color-mix(in oklch, var(--cat-5) 16%, var(--panel));
52
+ --cat-6-tint: color-mix(in oklch, var(--cat-6) 16%, var(--panel));
53
+ --cat-7-tint: color-mix(in oklch, var(--cat-7) 16%, var(--panel));
54
+ --cat-8-tint: color-mix(in oklch, var(--cat-8) 16%, var(--panel));
55
+ --chart-1: var(--cat-1);
56
+ --chart-2: var(--cat-2);
57
+ --chart-3: var(--cat-3);
58
+ --chart-4: var(--cat-4);
59
+ --chart-5: var(--cat-5);
60
+ --chart-6: var(--cat-6);
61
+ --chart-7: var(--cat-7);
62
+ --chart-8: var(--cat-8);
63
+
33
64
  /* Dot-matrix pattern fills — pair with the matching colour (WCAG 1.4.1).
34
- Series 1 (the accent) is intentionally `none`: absence-of-pattern IS its
35
- redundant channel. The colour palette is CVD-safe on its own (gated by
36
- check:charts), so a colour+pattern chart stays distinguishable; a
37
- pattern-ONLY chart must still give series 1 a fill or a labelled legend. */
65
+ Series 1 is intentionally `none`: absence-of-pattern IS its redundant
66
+ channel. Adjacent series are separated under simulated colour-vision
67
+ deficiency (gated by check:charts), so a colour+pattern chart stays
68
+ distinguishable; a pattern-ONLY chart must still give series 1 a fill or
69
+ a labelled legend. */
38
70
  --chart-pattern-size: 8px;
39
71
  --chart-pattern-ink: rgb(0 0 0 / 0.34);
40
72
  --chart-pattern-1: none;
@@ -49,20 +81,27 @@
49
81
 
50
82
  @media (prefers-color-scheme: dark) {
51
83
  :root:not([data-theme='light']) {
52
- --chart-1: var(--accent);
53
- --chart-2: #e69f00;
54
- --chart-3: #56b4e9;
55
- --chart-4: #009e73;
56
- --chart-5: #f0e442;
57
- --chart-6: #0072b2;
58
- --chart-7: #cc79a7;
59
- --chart-8: #4d5358;
60
- --chart-seq-1: oklch(30% 0.1 25deg);
61
- --chart-seq-2: oklch(42% 0.15 25deg);
62
- --chart-seq-3: oklch(55% 0.17 25deg);
63
- --chart-seq-4: oklch(68% 0.15 25deg);
64
- --chart-seq-5: oklch(80% 0.1 25deg);
65
- --chart-seq-6: oklch(90% 0.05 25deg);
84
+ --cat-1: #3987e5;
85
+ --cat-2: #d95926;
86
+ --cat-3: #199e70;
87
+ --cat-4: #c98500;
88
+ --cat-5: #d55181;
89
+ --cat-6: #008300;
90
+ --cat-7: #9085e9;
91
+ --cat-8: #e66767;
92
+ --cat-1-ink: #4694f3;
93
+ --cat-2-ink: #e86f42;
94
+ --cat-3-ink: #27a677;
95
+ --cat-4-ink: #cb8705;
96
+ --cat-5-ink: #e46792;
97
+ --cat-6-ink: #38a433;
98
+ --cat-7-ink: #9187eb;
99
+ --cat-8-ink: #eb6c6c;
100
+ --chart-seq-1: #1b5298;
101
+ --chart-seq-2: #256abf;
102
+ --chart-seq-3: #3987e5;
103
+ --chart-seq-4: #6da7ec;
104
+ --chart-seq-5: #9ec5f4;
66
105
  --chart-div-1: oklch(70% 0.13 250deg);
67
106
  --chart-div-2: oklch(60% 0.12 252deg);
68
107
  --chart-div-3: oklch(48% 0.08 255deg);
@@ -75,20 +114,27 @@
75
114
  }
76
115
 
77
116
  :root[data-theme='dark'] {
78
- --chart-1: var(--accent);
79
- --chart-2: #e69f00;
80
- --chart-3: #56b4e9;
81
- --chart-4: #009e73;
82
- --chart-5: #f0e442;
83
- --chart-6: #0072b2;
84
- --chart-7: #cc79a7;
85
- --chart-8: #4d5358;
86
- --chart-seq-1: oklch(30% 0.1 25deg);
87
- --chart-seq-2: oklch(42% 0.15 25deg);
88
- --chart-seq-3: oklch(55% 0.17 25deg);
89
- --chart-seq-4: oklch(68% 0.15 25deg);
90
- --chart-seq-5: oklch(80% 0.1 25deg);
91
- --chart-seq-6: oklch(90% 0.05 25deg);
117
+ --cat-1: #3987e5;
118
+ --cat-2: #d95926;
119
+ --cat-3: #199e70;
120
+ --cat-4: #c98500;
121
+ --cat-5: #d55181;
122
+ --cat-6: #008300;
123
+ --cat-7: #9085e9;
124
+ --cat-8: #e66767;
125
+ --cat-1-ink: #4694f3;
126
+ --cat-2-ink: #e86f42;
127
+ --cat-3-ink: #27a677;
128
+ --cat-4-ink: #cb8705;
129
+ --cat-5-ink: #e46792;
130
+ --cat-6-ink: #38a433;
131
+ --cat-7-ink: #9187eb;
132
+ --cat-8-ink: #eb6c6c;
133
+ --chart-seq-1: #1b5298;
134
+ --chart-seq-2: #256abf;
135
+ --chart-seq-3: #3987e5;
136
+ --chart-seq-4: #6da7ec;
137
+ --chart-seq-5: #9ec5f4;
92
138
  --chart-div-1: oklch(70% 0.13 250deg);
93
139
  --chart-div-2: oklch(60% 0.12 252deg);
94
140
  --chart-div-3: oklch(48% 0.08 255deg);
@@ -101,20 +147,27 @@
101
147
 
102
148
  @media print {
103
149
  :root:not([data-theme='light']) {
104
- --chart-1: var(--accent);
105
- --chart-2: #e69f00;
106
- --chart-3: #56b4e9;
107
- --chart-4: #009e73;
108
- --chart-5: #f0e442;
109
- --chart-6: #0072b2;
110
- --chart-7: #cc79a7;
111
- --chart-8: #4d5358;
112
- --chart-seq-1: oklch(94% 0.03 25deg);
113
- --chart-seq-2: oklch(85% 0.07 25deg);
114
- --chart-seq-3: oklch(74% 0.12 25deg);
115
- --chart-seq-4: oklch(62% 0.16 25deg);
116
- --chart-seq-5: oklch(50% 0.16 25deg);
117
- --chart-seq-6: oklch(38% 0.13 25deg);
150
+ --cat-1: #2a78d6;
151
+ --cat-2: #eb6834;
152
+ --cat-3: #1baf7a;
153
+ --cat-4: #eda100;
154
+ --cat-5: #e87ba4;
155
+ --cat-6: #008300;
156
+ --cat-7: #4a3aa7;
157
+ --cat-8: #e34948;
158
+ --cat-1-ink: #1467c3;
159
+ --cat-2-ink: #bf3f00;
160
+ --cat-3-ink: #007d4c;
161
+ --cat-4-ink: #a45d00;
162
+ --cat-5-ink: #b04972;
163
+ --cat-6-ink: #007800;
164
+ --cat-7-ink: #4a3aa7;
165
+ --cat-8-ink: #c62b30;
166
+ --chart-seq-1: #80b0e8;
167
+ --chart-seq-2: #5598e7;
168
+ --chart-seq-3: #2a78d6;
169
+ --chart-seq-4: #1c5cab;
170
+ --chart-seq-5: #104281;
118
171
  --chart-div-1: oklch(45% 0.14 255deg);
119
172
  --chart-div-2: oklch(62% 0.1 250deg);
120
173
  --chart-div-3: oklch(82% 0.05 245deg);