@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/docs/contrast.md CHANGED
@@ -283,40 +283,40 @@ palette untouched). Accents are authored in OKLCH; `--accent-text` is the
283
283
 
284
284
  ## Data-viz palette (advisory)
285
285
 
286
- The opt-in Tier-4 chart palette (`@ponchia/ui/css/dataviz.css`, authored in
287
- `tokens/charts.js`) is gated differently: categorical series are held to
288
- **mutual distinguishability under normal + simulated protan/deutan/tritan
289
- vision** (`check:charts`, OKLab ΔE), and colour is **never the sole signal** —
290
- each series ships a matching `--chart-pattern-*` dot-matrix fill. So the
291
- WCAG ratios below are **advisory** (a chart fill is not body text); use them to
292
- pick a darker series for thin lines/points, or rely on the pattern. Series 1 is
293
- the brand accent.
286
+ The opt-in Tier-4 categorical palette (`@ponchia/ui/css/dataviz.css`, authored
287
+ in `tokens/charts.js`) is gated differently: each slot sits inside the theme's
288
+ OKLCH lightness band and above the chroma floor, and **adjacent slots stay apart
289
+ under simulated protanopia/deuteranopia and in normal vision** (`check:charts`,
290
+ OKLab ΔE). Colour is **never the sole signal** — each series ships a matching
291
+ `--chart-pattern-*` dot-matrix fill. So the WCAG ratios below are **advisory**
292
+ (a chart fill is not body text); for thin lines, points or text use the slot's
293
+ `--cat-N-ink`, which `check:charts` holds to 4.5:1. No slot is the accent.
294
294
 
295
295
  ### Light theme — categorical vs `--bg`
296
296
 
297
297
  | Series | Colour | Ratio _(advisory)_ | APCA _(advisory)_ |
298
298
  | --- | --- | --- | --- |
299
- | 1 _(accent)_ | `#d71921` | 4.71:1 | Lc 66.8 |
300
- | 2 | `#e69f00` | 2.05:1 | Lc 37.4 |
301
- | 3 | `#56b4e9` | 2.10:1 | Lc 38.6 |
302
- | 4 | `#009e73` | 3.11:1 | Lc 54.4 |
303
- | 5 | `#f0e442` | 1.20:1 | Lc 9.1 |
304
- | 6 | `#0072b2` | 4.71:1 | Lc 68.4 |
305
- | 7 | `#cc79a7` | 2.78:1 | Lc 50.6 |
306
- | 8 | `#4d5358` | 7.08:1 | Lc 80.4 |
299
+ | 1 _(accent)_ | `#2a78d6` | 4.01:1 | Lc 63.5 |
300
+ | 2 | `#eb6834` | 2.91:1 | Lc 51.8 |
301
+ | 3 | `#1baf7a` | 2.56:1 | Lc 46.9 |
302
+ | 4 | `#eda100` | 1.97:1 | Lc 35.5 |
303
+ | 5 | `#e87ba4` | 2.44:1 | Lc 45.2 |
304
+ | 6 | `#008300` | 4.49:1 | Lc 66.8 |
305
+ | 7 | `#4a3aa7` | 7.77:1 | Lc 82.3 |
306
+ | 8 | `#e34948` | 3.59:1 | Lc 59.1 |
307
307
 
308
308
  ### Dark theme — categorical vs `--bg`
309
309
 
310
310
  | Series | Colour | Ratio _(advisory)_ | APCA _(advisory)_ |
311
311
  | --- | --- | --- | --- |
312
- | 1 _(accent)_ | `#ff3b41` | 5.31:1 | Lc 40.0 |
313
- | 2 | `#e69f00` | 8.32:1 | Lc 57.5 |
314
- | 3 | `#56b4e9` | 8.12:1 | Lc 56.3 |
315
- | 4 | `#009e73` | 5.48:1 | Lc 40.0 |
316
- | 5 | `#f0e442` | 14.17:1 | Lc 87.4 |
317
- | 6 | `#0072b2` | 3.61:1 | Lc 26.1 |
318
- | 7 | `#cc79a7` | 6.12:1 | Lc 43.9 |
319
- | 8 | `#4d5358` | 2.40:1 | Lc 14.4 |
312
+ | 1 _(accent)_ | `#3987e5` | 5.15:1 | Lc 37.5 |
313
+ | 2 | `#d95926` | 4.82:1 | Lc 35.6 |
314
+ | 3 | `#199e70` | 5.50:1 | Lc 40.1 |
315
+ | 4 | `#c98500` | 6.10:1 | Lc 43.9 |
316
+ | 5 | `#d55181` | 4.75:1 | Lc 35.0 |
317
+ | 6 | `#008300` | 3.79:1 | Lc 27.7 |
318
+ | 7 | `#9085e9` | 5.99:1 | Lc 43.0 |
319
+ | 8 | `#e66767` | 5.80:1 | Lc 42.2 |
320
320
 
321
321
  ## Scope & caveats
322
322
 
@@ -0,0 +1,64 @@
1
+ # Discussions
2
+
3
+ Use the opt-in discussion leaf for readable thread lists, messages, quotations,
4
+ and composers in a host application:
5
+
6
+ ```css
7
+ @import '@ponchia/ui';
8
+ @import '@ponchia/ui/css/discussion.css';
9
+ ```
10
+
11
+ BrontoUI supplies the visual structure. The host owns storage, identity,
12
+ thread resolution, text anchoring, unread state, and posting behavior. This leaf
13
+ adds no JavaScript or editor dependency.
14
+
15
+ ## Thread structure
16
+
17
+ ```html
18
+ <section class="ui-discussion" aria-labelledby="thread-title">
19
+ <header class="ui-discussion__header">
20
+ <div>
21
+ <h2 id="thread-title">Discussion</h2>
22
+ <p>Release notes</p>
23
+ </div>
24
+ </header>
25
+ <p class="ui-discussion__state">Open · passage attached</p>
26
+ <blockquote class="ui-discussion__quote">The selected passage.</blockquote>
27
+ <ol class="ui-discussion__messages">
28
+ <li class="ui-discussion__message">
29
+ <p class="ui-discussion__meta"><strong>Reviewer</strong> · today</p>
30
+ <p>Can we clarify this sentence?</p>
31
+ </li>
32
+ </ol>
33
+ <form class="ui-discussion__composer">
34
+ <label for="reply">Reply</label>
35
+ <textarea id="reply" name="reply" rows="4"></textarea>
36
+ <div class="ui-discussion__actions">
37
+ <button class="ui-button" type="submit">Post reply</button>
38
+ </div>
39
+ </form>
40
+ </section>
41
+ ```
42
+
43
+ Wire the form to the host's posting mechanism. Keep the draft when posting
44
+ fails, disable duplicate submissions while a request is pending, and announce
45
+ success only after confirmation. Use native buttons for actions and real links
46
+ for navigation. A modal host must supply focus management and focus return.
47
+
48
+ ## Reading and recovery
49
+
50
+ The styles use sentence case and sans-serif prose, wrap long text, and allow
51
+ action rows to wrap in narrow panels. Keep secondary actions visually quiet
52
+ with `ui-button--ghost`; posting is normally the primary action. The quote
53
+ should remain visible when its anchor disappears, with a clear status and a
54
+ host-owned way to choose a new target. Anchor status and thread resolution
55
+ answer different questions and should be labelled separately.
56
+
57
+ `ui-discussion__list` and `ui-discussion__item` style a host-owned thread index.
58
+ Keep the list bounded and offer more results explicitly. If a canvas uses pins,
59
+ provide the same discussions in a keyboard-accessible list. Pins, positions,
60
+ and annotation geometry are outside this CSS leaf.
61
+
62
+ The [discussion specimen](https://ponchia.github.io/bronto-ui/demo/discussion.html) includes a narrow-container
63
+ example and a local reply/resolve demonstration. Its state lasts only until
64
+ the page reloads.
package/docs/figure.md CHANGED
@@ -61,7 +61,7 @@ when the same stage appears in a dashboard, doc page, or generated artifact.
61
61
  | --- | --- | --- |
62
62
  | `--figure-max-inline` | `.ui-figure__stage` | Maximum stage width, default `42rem`. |
63
63
  | `--figure-min-block` | `.ui-figure__stage` | Reserved stage height for late-rendered media. |
64
- | `--figure-key-width` | `.ui-figure__body--key-right` | Right key column width before mobile collapse. |
64
+ | `--figure-key-width` | `.ui-figure__body--key-right` | Right key column width before the figure container stacks. |
65
65
 
66
66
  ## Boundary
67
67
 
@@ -76,3 +76,12 @@ when the same stage appears in a dashboard, doc page, or generated artifact.
76
76
 
77
77
  - [Usage](usage.md#static-reports) shows report figure composition.
78
78
  - [Reference](reference.md) lists the generated figure and report classes.
79
+
80
+ ## Narrow containers
81
+
82
+ The figure establishes the named `bronto-figure` inline-size container. Its
83
+ right-hand key stacks below 44rem of figure width, even in a wide browser.
84
+ Print disables size containment and uses document flow. Keep annotation text
85
+ and strokes within the authored `viewBox`; container layout does not reposition
86
+ chart geometry. Verify a 280px parent with long legend names and a fallback
87
+ table, not just a narrow viewport.
@@ -235,6 +235,11 @@ consumer since**; their follow-ons are demand-gated, not queued. Active work
235
235
  is therefore consolidation of the report lane (hub routing, print/PDF
236
236
  fidelity, consumer-contract gates), not new surfaces.
237
237
 
238
+ > **Superseded (2026-10-01).** A canvas workspace now consumes the command,
239
+ > workbench and state leaves daily, and its notes and visual models carry more
240
+ > agent-authored prose than reports do. The north star moved to objects on a
241
+ > canvas that explain themselves; see the [roadmap](https://github.com/Ponchia/bronto-ui/blob/main/ROADMAP.md#north-star).
242
+
238
243
  ### Report-lane primitives shipped in 0.6.7
239
244
 
240
245
  From the 2026-06-09 local scout. These were kept on merit, then shipped only
package/docs/mermaid.md CHANGED
@@ -92,7 +92,7 @@ switch, re-`initialize` with the other palette and re-render.
92
92
  - **Chart-like** diagrams carry a categorical series palette — **pie**
93
93
  (`pie1`…`pie12`), **git** (`git0`…`git7`), and **user-journey**
94
94
  (`fillType0`…`fillType7`) are wired to the CVD-safe
95
- [charts palette](./legends.md) (series 1 = the resolved accent).
95
+ [charts palette](./legends.md) (blue first; no slot is the accent).
96
96
  - **Structural** diagrams — flowchart, sequence, class, ER, state — use the
97
97
  monochrome node/edge/cluster grammar and spend the accent only on notes.
98
98
  - **Not themed: `gantt` and `timeline`.** Their colours come from
@@ -0,0 +1,61 @@
1
+ # Upgrade from 0.10 to 0.11
2
+
3
+ 0.11 completes the readable composition direction. The structured visual
4
+ changes are in [`MIGRATIONS.json`](../../MIGRATIONS.json). JavaScript exports,
5
+ classes, and tokens remain available. If you are coming from 0.9, apply the
6
+ [0.10 migration](0.9-to-0.10.md) first, including the retired adapters/modal.
7
+
8
+ ## Review reusable layouts
9
+
10
+ Figures use their own inline-size container to stack a right-hand key below
11
+ 44rem. Decision grids and action lists stack their rows below 32rem of their
12
+ own width, including inside an otherwise wide report. Keep the documented
13
+ `ui-report__decision-grid` and `ui-report__actions` wrappers. Two-up comparisons
14
+ need no wrapper: they keep at most two columns, with a 16rem reading floor.
15
+
16
+ Test a 280px and 320px parent inside a 1440px browser. Check that charts have
17
+ useful drawing width, text columns remain readable, long labels wrap and all
18
+ sources are reachable. Zero page overflow alone does not prove those things.
19
+ Keep authored SVG labels and annotations inside the drawing's `viewBox`, or
20
+ provide a narrow fallback with the same information. Bronto does not own chart
21
+ geometry. Named size containment is disabled in print; review your PDF too.
22
+
23
+ ## Review typography overrides by role
24
+
25
+ Figure captions, legends, generated labels and command groups use sans and
26
+ sentence case. Technical log bodies and identifiers keep mono. Inline citation
27
+ markers have a 12px floor at a default 16px root. Do not globally replace `Doto`:
28
+ keep intentional hero/display and readout roles.
29
+
30
+ 1. Find explicit `font-family: var(--display)` and `var(--dot-font)` declarations
31
+ in your loaded consumer styles, plus old root-size and control-height rules.
32
+ 2. Classify each use: display identity, numeric readout, heading, instruction,
33
+ control label or metadata. Check grouped selectors individually.
34
+ 3. Remove overrides that recreate old generic styles. Use `var(--sans)` for
35
+ local explanatory headings and labels; keep intentional display roles.
36
+ 4. Inspect complete tasks, not just the homepage. Include setup, result,
37
+ filtering, error/retry, source details and an empty state where applicable.
38
+ 5. Compare long names and translated text at narrow, laptop, and desktop widths,
39
+ in both themes, with keyboard and touch input.
40
+
41
+ Consumer CSS outside a layer takes precedence over the package's `bronto` layer.
42
+ Updating the package alone cannot change those explicit overrides. A prepared
43
+ patch from an older application revision must be reintegrated and checked
44
+ against current source before it can count as migration evidence.
45
+
46
+ ## Verify the package and consumer together
47
+
48
+ Install the packed candidate into an isolated consumer checkout before changing
49
+ production pins. Record the exact package version, consumer revision and screens
50
+ checked. Update the dependency and registry lock file together after publication;
51
+ do not commit a task-local tarball path into a production lock file.
52
+
53
+ Use the [composition guide](../compositions.md) for the service's local state
54
+ scenarios, container boundaries and report reading/print checks. Existing package
55
+ checks remain necessary; real consumer tasks provide additional evidence.
56
+
57
+ ## Optional discussion UI
58
+
59
+ Import `@ponchia/ui/css/discussion.css` for thread lists, quotations, messages,
60
+ and composers. The new `ui-discussion` vocabulary is additive. It carries no
61
+ posting behavior, storage, or editor dependency; see [Discussions](../discussion.md).
@@ -0,0 +1,47 @@
1
+ # Upgrade from 0.11 to 0.12
2
+
3
+ 0.12 replaces the categorical palette and adds a runtime resolver for
4
+ renderers. Classes and core tokens are unchanged; the structured changes are
5
+ in [`MIGRATIONS.json`](../../MIGRATIONS.json). If you are coming from 0.10,
6
+ apply the [0.11 migration](0.10-to-0.11.md) first.
7
+
8
+ ## Review charts that relied on series 1 being the accent
9
+
10
+ Until 0.11, `--chart-1` was `var(--accent)` and series 2–8 were Okabe-Ito.
11
+ From 0.12 the eight slots are fixed hues: blue, orange, aqua, yellow, magenta,
12
+ green, violet, red. No slot is the accent.
13
+
14
+ 1. Find uses of `--chart-1`, `range.category[0]`, `charts.<theme>.categorical[0]`
15
+ and `ACCENT` from `@ponchia/ui/charts`. `ACCENT` is removed.
16
+ 2. Where a chart meant "the brand", paint that one mark with the accent through
17
+ an explicit encoding (`brontoVegaAccent(theme)`, or `var(--accent)` in SVG),
18
+ and leave the categorical palette for categories.
19
+ 3. Where you pinned `--chart-1` to a fixed value to keep the accent out of
20
+ your data, delete the pin.
21
+ 4. `brontoVegaAccent(theme)` now returns the resolved `--accent`, and
22
+ `brontoVegaNeutral(theme)` the resolved `--text-dim`. They no longer index
23
+ `range.category`.
24
+
25
+ ## Sequential ramps have five steps
26
+
27
+ `--chart-seq-6` is removed; `--chart-seq-1..5` is one blue hue, step 1 nearest
28
+ the surface. Re-map a six-bin choropleth or heatmap to five bins, or
29
+ interpolate between steps in your renderer.
30
+
31
+ ## The static Vega config is frameless
32
+
33
+ `brontoVegaConfig()` sets `view.stroke: null` (no plot frame), draws a single
34
+ series in the first categorical hue, keeps a `--panel` gap between adjacent
35
+ rect, arc and area fills, and sets readable label sizes. A spec's own `config`
36
+ still wins. Review dashboards that relied on the frame or the accent-coloured
37
+ default mark.
38
+
39
+ ## New: categorical identity and runtime tokens
40
+
41
+ - `--cat-N`, `--cat-N-tint` and `--cat-N-ink` carry the same hues for tags,
42
+ participants and user-chosen tints. Replace hand-picked tag colours, and
43
+ status tokens borrowed as category colours, with these.
44
+ - `@ponchia/ui/renderer` resolves the live theme for canvas, WebGL and SVG
45
+ renderers (`readTokens`, `observeTokens`, `vegaConfig`, `xtermTheme`). A page
46
+ that switches skin, contrast or the OLED surface should use it instead of
47
+ `charts.json` or the static Vega files. See [renderer](../renderer.md).
@@ -150,6 +150,7 @@ semantic versioning contract for the surfaces listed here.
150
150
  | `./docs/legends.md` | `./docs/legends.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
151
151
  | `./docs/marks.md` | `./docs/marks.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
152
152
  | `./docs/connectors.md` | `./docs/connectors.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
153
+ | `./docs/renderer.md` | `./docs/renderer.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
153
154
  | `./docs/spotlight.md` | `./docs/spotlight.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
154
155
  | `./docs/crosshair.md` | `./docs/crosshair.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
155
156
  | `./docs/selection.md` | `./docs/selection.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
@@ -208,6 +209,7 @@ semantic versioning contract for the surfaces listed here.
208
209
  | `./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. |
209
210
  | `./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. |
210
211
  | `./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. |
212
+ | `./renderer` | types: `./renderer/index.d.ts`<br>default: `./renderer/index.js` | Renderer/theme helper JS | Stable additive | ESM theme data/helpers for opt-in skins, chart palettes, and external renderers. |
211
213
  | `./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. |
212
214
  | `./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. |
213
215
  | `./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. |
@@ -222,6 +224,11 @@ semantic versioning contract for the surfaces listed here.
222
224
  | `./docs/adr/0005-productive-tools-and-editorial-reports.md` | `./docs/adr/0005-productive-tools-and-editorial-reports.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
223
225
  | `./docs/migrations/0.9-to-0.10.md` | `./docs/migrations/0.9-to-0.10.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
224
226
  | `./docs/adr/0006-trusted-publishing.md` | `./docs/adr/0006-trusted-publishing.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
227
+ | `./docs/migrations/0.10-to-0.11.md` | `./docs/migrations/0.10-to-0.11.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
228
+ | `./docs/migrations/0.11-to-0.12.md` | `./docs/migrations/0.11-to-0.12.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
229
+ | `./css/discussion.css` | `./dist/css/discussion.css` | Opt-in layered CSS leaf | Stable additive | Generated layered direct-import leaf. Opt-in and not included in dist/bronto.css. |
230
+ | `./css/unlayered/discussion.css` | `./css/discussion.css` | Unlayered CSS leaf | Stable path | Raw authored CSS leaf for consumers that deliberately opt out of @layer bronto on that leaf. |
231
+ | `./docs/discussion.md` | `./docs/discussion.md` | Shipped documentation | Stable path | Markdown documentation shipped in the tarball. Paths are public reading assets within a compatible minor. |
225
232
 
226
233
  ## Shipped Files Allowlist
227
234
 
@@ -244,6 +251,7 @@ always includes `package.json`, `README.md`, `LICENSE`, and
244
251
  | `schemas` | Machine-readable schemas | Declarative JSON schemas for package-adjacent report/tooling contracts. |
245
252
  | `annotations` | Authored public JS directory | ESM source shipped as-is; adjacent declarations/maps are generated. |
246
253
  | `connectors` | Authored public JS directory | ESM source shipped as-is; adjacent declarations/maps are generated. |
254
+ | `renderer` | Authored public JS directory | ESM source shipped as-is; adjacent declarations/maps are generated. |
247
255
  | `shiki` | Theme data | Shiki theme JSON on the governed palette. |
248
256
  | `llms.txt` | Agent entrypoint | Shipped plain-text orientation for offline LLM/agent consumers. |
249
257
  | `CHANGELOG.md` | Release record | Shipped historical release notes. |
@@ -264,9 +272,11 @@ always includes `package.json`, `README.md`, `LICENSE`, and
264
272
  | `docs/vega.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
265
273
  | `docs/figure.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
266
274
  | `docs/annotations.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
275
+ | `docs/discussion.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
267
276
  | `docs/legends.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
268
277
  | `docs/marks.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
269
278
  | `docs/connectors.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
279
+ | `docs/renderer.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
270
280
  | `docs/spotlight.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
271
281
  | `docs/crosshair.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
272
282
  | `docs/selection.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
@@ -304,6 +314,8 @@ always includes `package.json`, `README.md`, `LICENSE`, and
304
314
  | `docs/adr/0005-productive-tools-and-editorial-reports.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
305
315
  | `docs/migrations/0.9-to-0.10.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
306
316
  | `docs/adr/0006-trusted-publishing.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
317
+ | `docs/migrations/0.10-to-0.11.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
318
+ | `docs/migrations/0.11-to-0.12.md` | Shipped documentation | Curated Markdown reading asset shipped in the npm tarball. |
307
319
 
308
320
  ## Artifact Provenance
309
321
 
@@ -316,8 +328,8 @@ result. The listed gates are part of `npm run check`.
316
328
  | 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. |
317
329
  | 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. |
318
330
  | 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. |
319
- | Authored CSS graph | `css/core.css plus css/*.css leaves` | dist/bronto.css; dist/css/*.css (47 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. |
320
- | JSDoc-authored public JS | `behaviors/; annotations/; connectors/; 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. |
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. |
321
333
  | 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. |
322
334
  | 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. |
323
335
  | 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
- - 683 classes across 186 component groups
12
+ - 695 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`,
@@ -487,6 +487,23 @@ each one matches a real selector in the stylesheet.
487
487
  | `cls.diffRowRemove` | `ui-diff__row--remove` | modifier |
488
488
  | `cls.diffSplit` | `ui-diff--split` | modifier |
489
489
 
490
+ ### `.ui-discussion`
491
+
492
+ | Registry key | Class | Kind |
493
+ | --- | --- | --- |
494
+ | `cls.discussion` | `ui-discussion` | base |
495
+ | `cls.discussionActions` | `ui-discussion__actions` | part |
496
+ | `cls.discussionComposer` | `ui-discussion__composer` | part |
497
+ | `cls.discussionHeader` | `ui-discussion__header` | part |
498
+ | `cls.discussionHint` | `ui-discussion__hint` | part |
499
+ | `cls.discussionItem` | `ui-discussion__item` | part |
500
+ | `cls.discussionList` | `ui-discussion__list` | part |
501
+ | `cls.discussionMessage` | `ui-discussion__message` | part |
502
+ | `cls.discussionMessages` | `ui-discussion__messages` | part |
503
+ | `cls.discussionMeta` | `ui-discussion__meta` | part |
504
+ | `cls.discussionQuote` | `ui-discussion__quote` | part |
505
+ | `cls.discussionState` | `ui-discussion__state` | part |
506
+
490
507
  ### `.ui-display`
491
508
 
492
509
  | Registry key | Class | Kind |
@@ -0,0 +1,100 @@
1
+ # Renderer tokens
2
+
3
+ `@ponchia/ui/renderer` resolves the live bronto theme for renderers that cannot
4
+ read CSS: Vega, xterm.js, a canvas or WebGL graph, a map, a 3D scene. Those
5
+ engines take literal colours, so a page that switches theme, skin, contrast or
6
+ the OLED surface has to resolve its tokens again before each repaint that
7
+ matters.
8
+
9
+ ```js
10
+ import { readTokens, observeTokens, vegaConfig, xtermTheme } from '@ponchia/ui/renderer';
11
+
12
+ const tokens = readTokens(); // { scheme, bg, panel, text, line, accent, categorical, … }
13
+ view = await embed(el, spec, { config: vegaConfig(tokens, { narrow: el.clientWidth < 480 }) });
14
+ terminal.options.theme = xtermTheme(tokens);
15
+
16
+ const stop = observeTokens((next) => {
17
+ terminal.options.theme = xtermTheme(next);
18
+ rebuildChart(vegaConfig(next));
19
+ });
20
+ ```
21
+
22
+ The static exports serve a different host. [`charts.json`](./theming.md#data-viz-palette)
23
+ and [`tokens/vega.js`](./vega.md) are snapshots per light/dark theme for a
24
+ report, a `file://` document or a build step. They cannot follow a skin or the
25
+ OLED preset; this module reads the page.
26
+
27
+ ## What `readTokens()` returns
28
+
29
+ Every colour is a renderer literal: `#rrggbb` when opaque, `rgba(r, g, b, a)`
30
+ when translucent. Canvas, SVG, d3-color, xterm.js, three.js and MapLibre all
31
+ accept both.
32
+
33
+ | Field | Token | Use |
34
+ | --- | --- | --- |
35
+ | `scheme` | luminance of `--bg` | `'light'` or `'dark'` |
36
+ | `bg`, `bgElevated`, `panel`, `panelStrong` | `--bg`, `--bg-elevated`, `--panel`, `--panel-strong` | Backgrounds; draw on `panel` |
37
+ | `text`, `textSoft`, `textDim` | `--text`, `--text-soft`, `--text-dim` | Labels, secondary and tertiary ink |
38
+ | `line`, `lineStrong` | `--line`, `--line-strong` | Grid and hairlines; axes and rules |
39
+ | `accent`, `accentText`, `onAccent`, `focus` | accent family | The one emphasis, its text forms, focus |
40
+ | `selection` | `--accent` at 27% | A translucent selection wash |
41
+ | `success`, `warning`, `danger`, `info` | status tier | Status only, never categories |
42
+ | `sans`, `mono` | `--sans`, `--mono` | Font stacks for a canvas renderer |
43
+ | `categorical` | `--cat-1..8` | Eight hues in fixed order |
44
+ | `categoricalTint` | `--cat-N-tint` | Each hue as a wash over `panel` |
45
+ | `categoricalInk` | `--cat-N-ink` | Each hue as text, 4.5:1 on panel and tint |
46
+ | `sequential`, `diverging` | `--chart-seq-*`, `--chart-div-*` | Ramps for magnitude and ± data |
47
+
48
+ `readTokens(element)` reads the custom properties as computed on `element`, so a
49
+ subtree that re-points tokens is honoured. Without `css/dataviz.css` on the
50
+ page, the categorical set and the ramps fall back to the packaged palette for
51
+ the resolved scheme, and the tint is computed over the live panel. Without a
52
+ DOM (SSR, tests) it returns the packaged values; pass `{ scheme: 'dark' }` to
53
+ choose.
54
+
55
+ ## Following changes
56
+
57
+ `observeTokens(callback, { element, signal })` calls back with fresh tokens
58
+ when the root's `data-theme`, `data-bronto-skin`, `data-contrast`,
59
+ `data-surface`, `data-density`, `class` or `style` changes and a token's value
60
+ moved with it, or when the system colour-scheme or contrast preference flips.
61
+ A host that writes its own inline properties on the root every frame (a canvas
62
+ zoom, say) costs one computed-style read per frame and no callback. Calls are
63
+ coalesced to one per animation frame. It returns a stop function; an
64
+ `AbortSignal` also stops it.
65
+
66
+ A host that already announces its own settled appearance change can read
67
+ `readTokens()` on that event instead and skip the observer.
68
+
69
+ ## Mappings
70
+
71
+ - **`vegaConfig(tokens, { mode, narrow, background })`** — a Vega-Lite (default)
72
+ or Vega `config`. Quiet chrome in the bronto inks, no plot frame, the
73
+ categorical palette as `range.category` (a single series takes its first
74
+ hue), the sequential ramp for `ordinal`/`ramp`/`heatmap`, the diverging ramp
75
+ for `diverging`. `narrow` moves the legend under the plot and thins ticks;
76
+ `background` defaults to transparent so the host panel shows. A spec's own
77
+ `config` still wins where Vega merges it. The static
78
+ [`tokens/vega.js`](./vega.md) is this mapping applied to each theme's
79
+ packaged tokens.
80
+ - **`xtermTheme(tokens)`** — an xterm.js `ITheme`: page ink on the page
81
+ background, the accent as cursor, the status colours for red, green, yellow
82
+ and blue, and the categorical magenta and aqua inks for magenta and cyan, so
83
+ all six ANSI hues differ.
84
+
85
+ For any other engine, map the fields yourself: they are already the roles a
86
+ renderer needs.
87
+
88
+ ## Conversions
89
+
90
+ - **`parseColor(value)`** — a resolved CSS colour to `{ r, g, b, alpha }`,
91
+ clipped into sRGB: hex, `rgb()`, `hsl()`, `oklch()`, `oklab()`, `lab()`,
92
+ `lch()` and `color(srgb | srgb-linear | display-p3 | xyz-d65 | xyz-d50 …)`.
93
+ It returns null for `var()`, `color-mix()`, `light-dark()` and named colours,
94
+ which only a browser can compute.
95
+ - **`formatColor(rgba)`** — `#rrggbb` or `rgba(r, g, b, a)`.
96
+ - **`resolveColor(value, { element })`** — any colour expression to a literal,
97
+ asking the browser for what `parseColor()` cannot compute.
98
+
99
+ The module is SSR-safe: it touches the DOM only inside a call that needs it.
100
+ It owns no renderer and imports none.
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.10.0/dist/bronto.css" />
64
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.10.0/dist/css/report-kit.css" />
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" />
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.10.0/dist/bronto.css" />
71
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.10.0/dist/css/report.css" />
72
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.10.0/dist/css/dataviz.css" />
73
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.10.0/dist/css/annotations.css" />
74
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.10.0/dist/css/legend.css" />
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" />
75
75
  ```
76
76
 
77
77
  The CDN serves the package's own `fonts/` next to the CSS, so font URLs resolve
@@ -649,7 +649,7 @@ directly; for a Vega chart, the same colours arrive through
649
649
  `brontoVegaConfig`'s `range.*` ramps, projected from `@ponchia/ui/charts.json`.
650
650
 
651
651
  For a **sequential** figure (a heatmap, a choropleth, a magnitude ramp) fill the
652
- cells from the single-hue ramp tokens `--chart-seq-1` … `--chart-seq-6`
652
+ cells from the single-hue ramp tokens `--chart-seq-1` … `--chart-seq-5`
653
653
  (low → high); for a **diverging** figure (−…0…+) use `--chart-div-1` …
654
654
  `--chart-div-7` (the middle band is the neutral midpoint). Both ramps live in
655
655
  `css/dataviz.css`, and their resolved per-theme hexes are in
@@ -885,7 +885,7 @@ or validation runtime.
885
885
 
886
886
  ```json
887
887
  {
888
- "$schema": "https://cdn.jsdelivr.net/npm/@ponchia/ui@0.10.0/schemas/report-claims.v1.schema.json",
888
+ "$schema": "https://cdn.jsdelivr.net/npm/@ponchia/ui@0.12.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.10.x`) are
4
+ patches are non-breaking. In practical terms: **PATCH releases (`0.12.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,13 +93,15 @@ 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
- | 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. |
96
+ | 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
+ | 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. |
97
98
  | 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. |
98
99
  | Shiki theme data (`@ponchia/ui/shiki/nothing.json`) | Stable additive | The bundled Shiki theme JSON shape and token-derived scope roles are public for syntax-highlighting consumers. Exact colours may tune with the token model and must stay generated from the governed palette. |
99
100
  | Reports (`css/report.css`, `.ui-report*`, print utilities) | Stable additive | Report class names, BEM part names, and print utility names are public. Report CSS is opt-in and not imported by the default bundle. The data key now lives in the standalone Legends layer (below), not `css/report.css`; charting is via the Vega theme target (`@ponchia/ui/vega`, see [vega](./vega.md)) or a token-themed inline SVG, not a shipped renderer. |
100
101
  | Report kit roll-up (`css/report-kit.css`) | Stable additive | A convenience `@import` of the complete static-report vocabulary. The set of leaves it bundles may grow additively; each leaf also stays individually exported. Opt-in, not in the default bundle. |
101
102
  | Figure stage (`css/figure.css`, `.ui-figure*`) | Stable additive | Figure class names, overlay/key/fallback-data slots, and report composition hooks are public. Opt-in, not in the default bundle. Bronto owns the figure frame, not chart rendering, scales, or data mapping. |
102
103
  | Annotations (`@ponchia/ui/annotations`, `css/annotations.css`, `.ui-annotation*`) | Stable additive | SVG annotation class names, recipe option names, and helper function names are public. Helper internals and exact path-control heuristics may tune before 1.0. Opt-in, not in the default bundle. Rich placement, renderer, editing, and chart/diagram adapter APIs belong to the sibling `@ponchia/annotations` package; `@ponchia/ui` does not depend on it at runtime or through public declarations. |
104
+ | Discussions (`css/discussion.css`, `.ui-discussion*`) | Stable additive | Thread-list, message, quotation and composer class names are public. Opt-in, not in the default bundle. The host owns posting, persistence, identity, resolution, text anchors and focus management. |
103
105
  | Legends (`css/legend.css`, `.ui-legend*`, `@ponchia/ui/behaviors` `initLegend`) | Stable additive | Legend class names, recipe option names, and the `bronto:legend:toggle` event contract (`aria-pressed="true"` ⇒ shown) are public. Opt-in, not in the default bundle; swatch colours are gated to the `--chart-*` palette. |
104
106
  | Marks (`css/marks.css`, `.ui-mark*`, `.ui-bracket-note*`) | Stable additive | Text-mark and bracket-note class names and recipe option names are public. Opt-in, not in the default bundle. Uses semantic tones only. |
105
107
  | Connectors (`@ponchia/ui/connectors`, `css/connectors.css`, `.ui-connector*`, `initConnectors`) | Stable additive | Connector class names, the `data-bronto-connector` attribute contract, geometry helper function names, and recipe options are public. Helper internals/heuristics may tune before 1.0. Opt-in, not in the default bundle. |