@ponchia/ui 0.6.6 → 0.6.8

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 (160) hide show
  1. package/CHANGELOG.md +175 -6
  2. package/README.md +38 -25
  3. package/annotations/index.d.ts.map +1 -1
  4. package/annotations/index.js +21 -3
  5. package/behaviors/carousel.d.ts.map +1 -1
  6. package/behaviors/carousel.js +91 -32
  7. package/behaviors/combobox.d.ts.map +1 -1
  8. package/behaviors/combobox.js +117 -43
  9. package/behaviors/command.d.ts.map +1 -1
  10. package/behaviors/command.js +74 -14
  11. package/behaviors/connectors.d.ts.map +1 -1
  12. package/behaviors/connectors.js +92 -9
  13. package/behaviors/crosshair.d.ts.map +1 -1
  14. package/behaviors/crosshair.js +47 -1
  15. package/behaviors/dialog.d.ts.map +1 -1
  16. package/behaviors/dialog.js +37 -16
  17. package/behaviors/disclosure.d.ts.map +1 -1
  18. package/behaviors/disclosure.js +33 -3
  19. package/behaviors/dismissible.d.ts.map +1 -1
  20. package/behaviors/dismissible.js +3 -2
  21. package/behaviors/forms.d.ts.map +1 -1
  22. package/behaviors/forms.js +78 -5
  23. package/behaviors/glyph.d.ts.map +1 -1
  24. package/behaviors/glyph.js +17 -2
  25. package/behaviors/index.d.ts +2 -0
  26. package/behaviors/index.d.ts.map +1 -1
  27. package/behaviors/index.js +2 -0
  28. package/behaviors/inert.js +3 -2
  29. package/behaviors/internal.d.ts +2 -1
  30. package/behaviors/internal.d.ts.map +1 -1
  31. package/behaviors/internal.js +25 -4
  32. package/behaviors/legend.d.ts +0 -5
  33. package/behaviors/legend.d.ts.map +1 -1
  34. package/behaviors/legend.js +78 -14
  35. package/behaviors/menu.d.ts.map +1 -1
  36. package/behaviors/menu.js +13 -8
  37. package/behaviors/modal.d.ts.map +1 -1
  38. package/behaviors/modal.js +77 -19
  39. package/behaviors/popover.d.ts +4 -3
  40. package/behaviors/popover.d.ts.map +1 -1
  41. package/behaviors/popover.js +89 -9
  42. package/behaviors/sources.d.ts.map +1 -1
  43. package/behaviors/sources.js +14 -2
  44. package/behaviors/splitter.d.ts +26 -0
  45. package/behaviors/splitter.d.ts.map +1 -0
  46. package/behaviors/splitter.js +239 -0
  47. package/behaviors/spotlight.d.ts.map +1 -1
  48. package/behaviors/spotlight.js +28 -2
  49. package/behaviors/table.d.ts.map +1 -1
  50. package/behaviors/table.js +105 -13
  51. package/behaviors/tabs.d.ts.map +1 -1
  52. package/behaviors/tabs.js +82 -18
  53. package/behaviors/theme.d.ts.map +1 -1
  54. package/behaviors/theme.js +26 -6
  55. package/classes/classes.json +230 -4
  56. package/classes/index.d.ts +64 -3
  57. package/classes/index.js +56 -2
  58. package/classes/vscode.css-custom-data.json +1 -1
  59. package/connectors/index.d.ts +39 -6
  60. package/connectors/index.d.ts.map +1 -1
  61. package/connectors/index.js +67 -9
  62. package/css/analytical.css +3 -1
  63. package/css/annotations.css +12 -0
  64. package/css/app.css +4 -4
  65. package/css/clamp.css +92 -0
  66. package/css/crosshair.css +27 -2
  67. package/css/feedback.css +2 -30
  68. package/css/figure.css +102 -0
  69. package/css/highlights.css +50 -0
  70. package/css/interval.css +90 -0
  71. package/css/navigation.css +12 -0
  72. package/css/primitives.css +2 -3
  73. package/css/report-kit.css +38 -0
  74. package/css/report.css +23 -4
  75. package/css/sidenote.css +12 -2
  76. package/css/site.css +2 -1
  77. package/css/sources.css +5 -0
  78. package/css/state.css +120 -1
  79. package/css/table.css +4 -0
  80. package/css/tokens.css +25 -9
  81. package/css/workbench.css +101 -8
  82. package/dist/bronto.css +1 -1
  83. package/dist/css/analytical.css +1 -1
  84. package/dist/css/annotations.css +1 -1
  85. package/dist/css/app.css +1 -1
  86. package/dist/css/clamp.css +1 -0
  87. package/dist/css/crosshair.css +1 -1
  88. package/dist/css/feedback.css +1 -1
  89. package/dist/css/figure.css +1 -0
  90. package/dist/css/highlights.css +1 -0
  91. package/dist/css/interval.css +1 -0
  92. package/dist/css/navigation.css +1 -1
  93. package/dist/css/primitives.css +1 -1
  94. package/dist/css/report-kit.css +1 -0
  95. package/dist/css/report.css +1 -1
  96. package/dist/css/sidenote.css +1 -1
  97. package/dist/css/site.css +1 -1
  98. package/dist/css/sources.css +1 -1
  99. package/dist/css/state.css +1 -1
  100. package/dist/css/table.css +1 -1
  101. package/dist/css/tokens.css +1 -1
  102. package/dist/css/workbench.css +1 -1
  103. package/docs/adr/0001-color-system.md +3 -2
  104. package/docs/adr/0002-scope-and-2026-baseline.md +1 -1
  105. package/docs/annotations.md +12 -1
  106. package/docs/architecture.md +105 -48
  107. package/docs/clamp.md +49 -0
  108. package/docs/command.md +4 -1
  109. package/docs/connectors.md +16 -0
  110. package/docs/contrast.md +34 -24
  111. package/docs/crosshair.md +1 -1
  112. package/docs/d2.md +37 -0
  113. package/docs/dots.md +4 -1
  114. package/docs/figure.md +71 -0
  115. package/docs/frontier-primitives.md +25 -24
  116. package/docs/glyphs.md +11 -0
  117. package/docs/highlights.md +52 -0
  118. package/docs/interop/tailwind.md +148 -0
  119. package/docs/interval.md +55 -0
  120. package/docs/legends.md +3 -2
  121. package/docs/mermaid.md +6 -0
  122. package/docs/migrations/0.2-to-0.3.md +80 -0
  123. package/docs/migrations/0.3-to-0.4.md +48 -0
  124. package/docs/migrations/0.4-to-0.5.md +96 -0
  125. package/docs/migrations/0.5-to-0.6.md +82 -0
  126. package/docs/package-contract.md +44 -6
  127. package/docs/reference.md +78 -5
  128. package/docs/reporting.md +126 -60
  129. package/docs/sidenote.md +7 -1
  130. package/docs/sources.md +1 -1
  131. package/docs/stability.md +23 -5
  132. package/docs/state.md +67 -10
  133. package/docs/theming.md +12 -4
  134. package/docs/usage.md +47 -13
  135. package/docs/vega.md +4 -4
  136. package/docs/workbench.md +59 -18
  137. package/llms.txt +89 -16
  138. package/package.json +82 -6
  139. package/qwik/index.d.ts +1 -0
  140. package/qwik/index.d.ts.map +1 -1
  141. package/qwik/index.js +26 -21
  142. package/react/index.d.ts +1 -0
  143. package/react/index.d.ts.map +1 -1
  144. package/react/index.js +4 -1
  145. package/schemas/report-claims.v1.schema.json +137 -0
  146. package/solid/index.d.ts +2 -0
  147. package/solid/index.d.ts.map +1 -1
  148. package/solid/index.js +3 -0
  149. package/svelte/index.d.ts +114 -0
  150. package/svelte/index.d.ts.map +1 -0
  151. package/svelte/index.js +193 -0
  152. package/tailwind.css +87 -0
  153. package/tokens/figma.variables.json +2241 -0
  154. package/tokens/index.js +1 -1
  155. package/tokens/index.json +2 -2
  156. package/tokens/resolved.json +3 -3
  157. package/tokens/tokens.dtcg.json +1 -1
  158. package/vue/index.d.ts +116 -0
  159. package/vue/index.d.ts.map +1 -0
  160. package/vue/index.js +228 -0
package/docs/usage.md CHANGED
@@ -191,6 +191,12 @@ destructive action).
191
191
  | toast | transient, out-of-flow, system-initiated. Danger toasts route to an assertive live region; everything else polite. |
192
192
  | tooltip | supplemental, hover/focus, never essential info (it's not announced reliably; don't hide required content in it). |
193
193
 
194
+ For dismissible in-flow alerts, mark the host with `data-bronto-dismissible`,
195
+ put `data-bronto-dismiss` on the close button, and wire `dismissible()` from
196
+ `@ponchia/ui/behaviors`. With no attribute value, the button removes the nearest
197
+ dismissible host; with a selector value, it removes the nearest matching
198
+ ancestor and dispatches a cancelable `bronto:dismiss` event first.
199
+
194
200
  The CSS `ui-tooltip` is hover/focus-only and CSS can't wire it to assistive
195
201
  tech for you — associate the bubble with its trigger yourself, or it conveys
196
202
  nothing to a screen reader: give `.ui-tooltip__bubble` an `id`, point the
@@ -222,6 +228,8 @@ Both are a thin horizontal bar; they mean different things.
222
228
  zero bar — so the helper returns just `role="progressbar"` + `aria-busy="true"`
223
229
  (no `aria-valuenow`, no `--value`). Pair it with the class:
224
230
  `<div class={ui.progress({ indeterminate: true })} {...attrs.progress()}>`.
231
+ The segmented `.ui-dotbar` uses the same accessibility contract through
232
+ `attrs.dotbar(value)` or `attrs.dotbar()` for the indeterminate sweep.
225
233
 
226
234
  Rule of thumb: *something is happening* → progress; *something measures
227
235
  this much* → meter.
@@ -276,12 +284,14 @@ without it these widgets are unlabelled or unannounced:
276
284
  - **`ui-skiplink`** — keep it the first focusable element and point its `href`
277
285
  at the `id` of your main landmark.
278
286
 
279
- ## App shell: the admin dashboard frame
287
+ ## App shell: the service frame
280
288
 
281
- `ui-app-shell` is a CSS-only two-column admin frame (sidebar rail + main
282
- column) that collapses to a single column with a horizontal rail below 880px —
283
- no behavior required. The nesting matters; the rail is `ui-app-rail` and the
284
- content side is `ui-app-main`:
289
+ `ui-app-shell` is the default cross-service identity frame: a CSS-only
290
+ two-column app shell (sidebar rail + main column) that collapses to a single
291
+ column with a horizontal rail below 880px no behavior required. Use it for
292
+ ops tools, admin apps, internal services, generated dashboards, and any workflow
293
+ surface that should feel like part of the same system. The nesting matters; the
294
+ rail is `ui-app-rail` and the content side is `ui-app-main`:
285
295
 
286
296
  ```html
287
297
  <div class="ui-app-shell">
@@ -290,7 +300,9 @@ content side is `ui-app-main`:
290
300
  <nav class="ui-app-nav" aria-label="Primary">
291
301
  <span class="ui-app-nav__section">Main</span>
292
302
  <a href="/overview" aria-current="page">Overview</a>
293
- <a href="/reports">Reports</a>
303
+ <a href="/jobs">Jobs</a>
304
+ <a href="/integrations">Integrations</a>
305
+ <a href="/settings">Settings</a>
294
306
  </nav>
295
307
  <div class="ui-app-rail__account">…</div>
296
308
  </aside>
@@ -310,6 +322,21 @@ Knobs: `--app-rail` sets the rail width (default 14rem); `ui-app-shell--full`
310
322
  drops the rail for a single-column app. `ui-app-nav` honours `aria-current="page"`
311
323
  (preferred) and the visual-only `.is-active`.
312
324
 
325
+ Service composition checklist:
326
+
327
+ - Start with `ui-app-shell`, `ui-app-rail`, `ui-app-nav`, `ui-app-main`,
328
+ `ui-app-topbar`, and `ui-app-content`.
329
+ - Put brand and account identity in the rail; do not rebuild that frame per app.
330
+ - Use `ui-app-toolbar` for filters/actions above a workflow surface.
331
+ - Use `ui-app-panel` for grouped operational sections, not nested cards.
332
+ - Use `ui-statgrid`/`ui-stat`, `ui-table`, `ui-field`, `ui-alert`, and
333
+ `ui-progress` inside panels; add opt-in `state.css` for `ui-state` lifecycle
334
+ labels.
335
+ - Keep nav current state on `aria-current="page"` so the visual cue and AT cue
336
+ match.
337
+ - Reach for opt-in `workbench.css` only when the service needs panes,
338
+ inspectors, or selected-object bulk actions.
339
+
313
340
  ## Menus: `data-bronto-menu` + `initMenu`
314
341
 
315
342
  A dropdown menu is a native `<details data-bronto-menu>` styled as
@@ -570,7 +597,9 @@ one of these a screen reader announces nothing while the user waits.
570
597
  carries the native `popover` attribute (never clipped by `overflow`/stacking);
571
598
  without it, it falls back to an `is-open` class that a clipping ancestor can cut
572
599
  off. Add `popover` to the panel for the robust path — the `is-open` form is a
573
- fallback, not the default to copy.
600
+ fallback, not the default to copy. Placement flips to the roomier vertical side,
601
+ keeps the panel on-screen, and scrolls tall content inside the available viewport
602
+ space.
574
603
 
575
604
  It is a **non-modal** dialog by design: the panel gets `role="dialog"` and focus
576
605
  moves into it, but there is **no focus trap** and the rest of the page stays
@@ -591,7 +620,7 @@ HTML, print/PDF, and before any hydration:
591
620
 
592
621
  | Component | How it works without JS |
593
622
  | --- | --- |
594
- | Tooltip (`ui-tooltip`) | `:hover` / `:focus-within` (+ anchor positioning where supported) |
623
+ | Tooltip (`ui-tooltip`) | `:hover` / `:focus-within` for short local labels |
595
624
  | Accordion | native `<details>` / `<summary>` |
596
625
  | Segmented control (`ui-segmented`) | `:has(input:checked)` over a radio group |
597
626
  | Scroll-reveal (`ui-scroll-reveal`) | scroll-driven animation, zero JS |
@@ -603,20 +632,25 @@ These are JS widgets wearing the Bronto look; without the behavior they are iner
603
632
 
604
633
  | Component | Behavior | With the behavior absent |
605
634
  | --- | --- | --- |
635
+ | Disclosure trigger (`[data-bronto-disclosure]`) | `initDisclosure` | a button with stale `aria-expanded`; the controlled panel never toggles |
606
636
  | Tabs (`ui-tabs`) | `initTabs` | **author panels visible** — ship `hidden` panels and if `initTabs` never runs the content is unreachable |
607
637
  | Combobox (`ui-combobox`) | `initCombobox` | a plain text input beside an unfiltered list |
608
638
  | Command palette (`ui-command`) | `initCommand` | a static, unfiltered list |
639
+ | Splitter (`ui-splitter`) | `initSplitter` | fixed panes at the authored `--splitter-pos`; no keyboard/pointer resize or `aria-valuenow` updates |
609
640
  | Table sort/select (`[data-bronto-sortable]`) | `initTableSort` | a static table (still readable) |
610
641
  | Popover (`ui-popover`) | `initPopover` | no placement/ARIA — prefer the native `popover` attribute |
611
642
  | Carousel (`ui-carousel`) | `initCarousel` | a native scroll-snap track (usable, no controls) |
612
- | Controlled modal (`ui-modal.is-open`) | `initModal` | no focus trapprovide one or use native `<dialog>` |
643
+ | Controlled modal (`ui-modal.is-open`) | `initModal` | open skin onlyno inert trap, focus-return, or Escape close signal |
613
644
  | Menu (`data-bronto-menu`) | `initMenu` | a button next to a list with no open/close, outside-click, or Escape |
645
+ | Dismissible alert/callout (`data-bronto-dismissible`) | `dismissible` | the close affordance is just a button; nothing is removed |
614
646
  | Toast | `toast()` | nothing — it is imperative-only |
615
647
 
616
648
  One cross-cutting guard, not tied to a single component:
617
649
 
618
650
  | Concern | Behavior | With the behavior absent |
619
651
  | --- | --- | --- |
652
+ | Theme persistence before first paint | `applyStoredTheme` | the token layer follows OS preference until client code sets `data-theme`, so a stored preference can flash |
653
+ | Theme toggle controls | `initThemeToggle` | the button is inert and does not persist `data-theme` |
620
654
  | `aria-disabled="true"` controls | `initDisabledGuard` | dimmed + pointer-inert via CSS, but still **keyboard**-activatable on Enter/Space (native `disabled` is already fully inert) |
621
655
 
622
656
  Rule of thumb: if a component needs ARIA-state sync, focus management, a keyboard
@@ -628,10 +662,10 @@ boundary of what CSS alone cannot do.
628
662
  The CSS is the framework; `@ponchia/ui/behaviors` is the *sanctioned*
629
663
  home for the little JS that genuinely needs scripting (theme persistence,
630
664
  disclosure, dialog glue, modal focus-trap, toast, combobox, form-validation,
631
- table-sort). Reach for it instead of reimplementing — every initializer is
632
- SSR-safe, idempotent, and returns a cleanup. If you find yourself writing focus
633
- management or `aria-expanded` toggling by hand, there is probably already
634
- a behavior for it.
665
+ table-sort, splitter resizing). Reach for it instead of reimplementing — every
666
+ initializer is SSR-safe, idempotent, and returns a cleanup. If you find yourself
667
+ writing focus management, ARIA value sync, or `aria-expanded` toggling by hand,
668
+ there is probably already a behavior for it.
635
669
 
636
670
  ## Re-brand obligations (the short version)
637
671
 
package/docs/vega.md CHANGED
@@ -137,7 +137,7 @@ one chromatic default (series 1 / the lone mark), never the chrome:
137
137
  | `range.diverging` | − … neutral … + ramp | `charts.json` diverging |
138
138
 
139
139
  The palette is the same CVD-safe, pattern-paired set documented in
140
- [theming](./theming.md#data-viz) — colour is never the sole channel. When a
140
+ [theming](./theming.md#data-viz-palette) — colour is never the sole channel. When a
141
141
  series needs the redundant second channel, drive the mark's fill from the
142
142
  `--chart-pattern-*` tokens or pair a [legend](./legends.md) swatch.
143
143
 
@@ -237,8 +237,8 @@ contract**, so pin your Vega version and key off the data, not generated ids.
237
237
 
238
238
  bronto owns the theme config — gated structurally by `check:vega` (every colour
239
239
  slot resolves, both themes, no `var()` leaks, every `range.*` ramp populated),
240
- and separately a dev-only render-probe (`npm test`, via the `vega`/`vega-lite`
241
- dev deps) asserts the colours actually land on a rendered chart — and the
242
- annotation geometry. It does not own Vega's grammar, its rendering, or its internal SVG —
240
+ and by the unit suite (`check:unit`, via the `vega`/`vega-lite` dev deps) which
241
+ asserts the colours actually land on a rendered chart — and the annotation
242
+ geometry. It does not own Vega's grammar, its rendering, or its internal SVG —
243
243
  those stay Vega's, and the chart is a documented composition, not a shipped
244
244
  runtime binding.
package/docs/workbench.md CHANGED
@@ -1,29 +1,69 @@
1
- # Workbench — inspector, properties, selection bar
1
+ # Workbench — split panes, inspector, properties, selection bar
2
2
 
3
3
  `@ponchia/ui/css/workbench.css` is an opt-in set of primitives for **real
4
- tools**: an inspector panel, property rows for a selected object, and a bar of
5
- actions on the current selection. Generic kits stop at cards/tables/forms, so
6
- every app builds its own half-consistent workbench. This is the low-risk CSS
7
- core — layout and affordances only.
4
+ tools**: resizable split panes, an inspector panel, property rows for a selected
5
+ object, and a bar of actions on the current selection. Generic kits stop at
6
+ cards/tables/forms, so every app builds its own half-consistent workbench. This
7
+ is the low-risk core — layout, resize affordance, and ARIA value sync.
8
8
 
9
9
  ```css
10
10
  @import '@ponchia/ui';
11
11
  @import '@ponchia/ui/css/workbench.css';
12
12
  ```
13
13
 
14
- Resizable split panes (a focusable ARIA window-splitter behavior) and drag
15
- handles are deliberately deferred until a consumer needs them. Not in the core
16
- bundle.
14
+ ```js
15
+ import { initSplitter } from '@ponchia/ui/behaviors';
16
+
17
+ initSplitter();
18
+ ```
19
+
20
+ Not in the core bundle. Import the CSS leaf where the workbench appears and run
21
+ `initSplitter()` only if the page includes `[data-bronto-splitter]`.
22
+
23
+ ## Splitter — `.ui-splitter`
24
+
25
+ Two panes separated by a focusable ARIA separator handle. The CSS owns the grid
26
+ tracks and handle affordance; `initSplitter()` owns keyboard/pointer resizing,
27
+ `--splitter-pos`, `aria-valuenow`, and the `bronto:splitter:resize` event. The
28
+ host owns pane content, persistence, saved layout state, collapse policy, and any
29
+ domain selection model.
30
+
31
+ ```html
32
+ <div
33
+ class="ui-splitter ui-splitter--vertical"
34
+ data-bronto-splitter
35
+ style="--splitter-pos: 36%"
36
+ >
37
+ <section class="ui-splitter__pane" id="files" aria-label="Files">...</section>
38
+ <div
39
+ class="ui-splitter__handle"
40
+ role="separator"
41
+ tabindex="0"
42
+ aria-controls="files"
43
+ aria-label="Resize files pane"
44
+ aria-orientation="vertical"
45
+ aria-valuemin="20"
46
+ aria-valuemax="72"
47
+ aria-valuenow="36"
48
+ ></div>
49
+ <section class="ui-splitter__pane" aria-label="Preview">...</section>
50
+ </div>
51
+ ```
52
+
53
+ Use `.ui-splitter--horizontal` for top/bottom panes. Arrow keys change the value
54
+ by 2 percentage points, Shift+Arrow and PageUp/PageDown by 10, and Home/End jump
55
+ to `aria-valuemin` / `aria-valuemax`. The handle needs a real accessible name
56
+ and `aria-controls` pointing at the primary pane.
17
57
 
18
58
  ## Inspector — `.ui-inspector`
19
59
 
20
- A panel of details for the selected object: a `__header` (title + actions) over
60
+ A panel of details for the selected object: a `__head` (title + actions) over
21
61
  a `__body` of property rows.
22
62
 
23
63
  ```html
24
64
  <aside class="ui-inspector">
25
65
  <div class="ui-inspector__head">
26
- <h2 class="ui-eyebrow">Rectangle</h2>
66
+ <h2 class="ui-eyebrow">Sync job</h2>
27
67
  <button class="ui-button ui-button--subtle ui-button--sm" type="button">Reset</button>
28
68
  </div>
29
69
  <div class="ui-inspector__body">
@@ -39,12 +79,12 @@ A label/value pair, denser than `ui-key-value` and tuned for an inspector. The
39
79
 
40
80
  ```html
41
81
  <div class="ui-property">
42
- <span class="ui-property__label">Width</span>
43
- <span class="ui-property__value">240 px</span>
82
+ <span class="ui-property__label">Owner</span>
83
+ <span class="ui-property__value">Platform</span>
44
84
  </div>
45
85
  <div class="ui-property">
46
- <span class="ui-property__label">Fill</span>
47
- <span class="ui-property__value"><input class="ui-input" value="#121212" /></span>
86
+ <span class="ui-property__label">Retries</span>
87
+ <span class="ui-property__value"><input class="ui-input" value="3" /></span>
48
88
  </div>
49
89
  ```
50
90
 
@@ -72,7 +112,8 @@ A raised bar of actions on the current selection: a `__count` on one side,
72
112
 
73
113
  ## Scope
74
114
 
75
- CSS only, no recipes — these are structural containers and rows; apply the
76
- classes directly (or read them from `cls.inspector`, `cls.property`, …). Pair
77
- the selection bar with the cross-cutting [`ui-sel`](./selection.md) states on the
78
- selected items themselves; Bronto styles both, the host owns the hit-testing.
115
+ No recipes — these are structural containers and rows; apply the classes
116
+ directly (or read them from `cls.splitter`, `cls.inspector`, `cls.property`, …).
117
+ Pair the selection bar with the cross-cutting [`ui-sel`](./selection.md) states
118
+ on the selected items themselves. Bronto styles both and wires the splitter
119
+ affordance; the host owns hit-testing, persistence, pane contents, and commands.
package/llms.txt CHANGED
@@ -44,7 +44,7 @@ the path changes from source `css/` to built `dist/css/`:
44
44
  <!-- installed locally -->
45
45
  <link rel="stylesheet" href="./node_modules/@ponchia/ui/dist/css/<leaf>.css" />
46
46
  <!-- or from a CDN; pin the version (pre-1.0, breaking changes ship in the minor) -->
47
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.6/dist/css/<leaf>.css" />
47
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.8/dist/css/<leaf>.css" />
48
48
  ```
49
49
 
50
50
  The flattened default bundle is `dist/bronto.css` (bundler shorthand
@@ -84,13 +84,17 @@ matching `.ui-source-card`, seed lightweight preview metadata, and emit
84
84
  `bronto:source:focus`; the host still owns numbering, fetching, trust decisions,
85
85
  and any rich preview popover.
86
86
 
87
- For React/Solid/Qwik, optional thin hook bindings over those behaviors (peer
88
- deps `react` / `solid-js` / `@builder.io/qwik`, optional — core stays zero-dep):
87
+ Optional lifecycle adapters wrap those behaviors without owning markup or state.
88
+ React/Solid/Qwik use hook bindings (peer deps `react` / `solid-js` /
89
+ `@builder.io/qwik`, optional — core stays zero-dep); Svelte uses dependency-free
90
+ actions, and Vue uses dependency-free directives/plugin helpers:
89
91
 
90
92
  ```js
91
93
  import { useDialog, useToast } from '@ponchia/ui/react'; // or '@ponchia/ui/solid' or '@ponchia/ui/qwik'
92
94
  // React: scope with { root: reactRef } or a resolver, not { root: ref.current } during render.
93
95
  // Qwik: hooks run in useVisibleTask$; scope with a Qwik signal — useDialog({ root: useSignal() }).
96
+ // Svelte: import { dialog, toast } from '@ponchia/ui/svelte'.
97
+ // Vue: import { vDialog, useToast } from '@ponchia/ui/vue', or app.use(brontoVue).
94
98
  ```
95
99
 
96
100
  Optional display glyphs — dot-matrix bitmaps on the `.ui-dotmatrix` primitive
@@ -213,10 +217,30 @@ simulated protan/deutan/tritan), `--chart-seq-*` (sequential), `--chart-div-*`
213
217
  pattern N; colour is never the sole signal). Details in `docs/theming.md`.
214
218
 
215
219
  Building analytical / generated-report UI? Import the roll-up
216
- `@ponchia/ui/css/analytical.css` (bundles annotations + legend + marks +
217
- connectors + spotlight + crosshair + selection) instead of the seven leaves;
218
- add `css/dataviz.css` for chart colours and `css/report.css` for the document
219
- grammar. The individual layers (each opt-in, none in the default bundle):
220
+ `@ponchia/ui/css/analytical.css` (bundles figure + annotations + legend +
221
+ marks + connectors + spotlight + crosshair + selection + highlights) instead
222
+ of the nine leaves; add `css/dataviz.css` for chart colours and `css/report.css`
223
+ for the document grammar. Interval and clamp are report/evidence leaves but are
224
+ NOT in the roll-up; link them individually. The individual layers (each opt-in,
225
+ none in the default bundle):
226
+
227
+ Optional figure stage for charts, diagrams, screenshots, and annotated media —
228
+ opt-in, never in the default bundle. It composes with `ui-report__figure` but
229
+ does not replace it:
230
+
231
+ ```html
232
+ <link rel="stylesheet" href="@ponchia/ui/css/figure.css" />
233
+ ```
234
+
235
+ Use `ui-figure` on the `<figure>`, `ui-figure__caption` on the caption,
236
+ `ui-figure__body` and optional `ui-figure__body--key-right` for stage + key
237
+ layout, `ui-figure__stage` for the centered media box, `ui-figure__media` for
238
+ the chart/SVG/img/canvas, `ui-figure__overlay` for pointer-transparent absolute
239
+ overlays, `ui-figure__key` for legends, and `ui-figure__data` for fallback
240
+ tables. Author-set knobs: `--figure-max-inline`, `--figure-min-block`,
241
+ `--figure-key-width`. Bronto owns layout only; the host owns data, scales,
242
+ chart rendering, overlay content, and accessibility text. Details:
243
+ `docs/figure.md`.
220
244
 
221
245
  Optional SVG annotations for charts/reports — opt-in, never in the default
222
246
  bundle. This is Bronto's subject / connector / note grammar inspired by
@@ -351,6 +375,20 @@ Apply `ui-sel` + `ui-sel--on` (selected), `ui-sel--off` (excluded), or
351
375
  row, list item, map region) from YOUR selection/brush logic — Bronto only styles
352
376
  them. `ui.sel({ state: 'on'|'off'|'maybe' })`. Details: `docs/selection.md`.
353
377
 
378
+ Optional Custom Highlight API paint — opt-in, CSS only, never in the default
379
+ bundle. For cited evidence, search hits, and current match ranges without
380
+ wrapping text nodes:
381
+
382
+ ```html
383
+ <link rel="stylesheet" href="@ponchia/ui/css/highlights.css" />
384
+ ```
385
+
386
+ Put `ui-highlights` on the text scope. The host creates `Range` objects and
387
+ registers `Highlight` sets as `CSS.highlights.set('bronto-evidence', ...)`,
388
+ `bronto-search`, and `bronto-current`; Bronto only paints them. Custom props:
389
+ `--highlight-evidence`, `--highlight-search`, `--highlight-current`. Always
390
+ check `CSS.highlights` before registering. Details: `docs/highlights.md`.
391
+
354
392
  Optional source/citation/provenance trust layer — opt-in, CSS only, never in
355
393
  the default bundle. The grammar for "where did this come from?" in generated
356
394
  reports/AI output:
@@ -371,6 +409,32 @@ author-written label (never colour alone). A tone class **needs a host**:
371
409
  states; the host owns fetching, numbering, and trust. `ui.citation({chip,state})` / `ui.source({state})` /
372
410
  `ui.provenance({state})`. Details: `docs/sources.md`.
373
411
 
412
+ Optional low/high interval — opt-in, CSS only, never in the default bundle. For
413
+ confidence windows, estimates, budget bands, or caveated evidence readings:
414
+
415
+ ```html
416
+ <link rel="stylesheet" href="@ponchia/ui/css/interval.css" />
417
+ ```
418
+
419
+ Use `ui-interval` with host-normalised `--lo` and `--hi` (0..1), optional
420
+ `ui-interval__point` with `--v`, plus `ui-interval__track`,
421
+ `ui-interval__range`, `ui-interval__label`, and `ui-interval__bounds`.
422
+ The container needs host-written text (`role="img"` + `aria-label`, or nearby
423
+ visible prose). Bronto paints geometry only. Details: `docs/interval.md`.
424
+
425
+ Optional bounded excerpt clamp — opt-in, CSS only, never in the default bundle.
426
+ For source excerpts, claim basis, and caveats that should scan compactly but
427
+ remain reachable:
428
+
429
+ ```html
430
+ <link rel="stylesheet" href="@ponchia/ui/css/clamp.css" />
431
+ ```
432
+
433
+ Use `ui-clamp` with `--clamp-lines`, `ui-clamp__body`, and optionally a checkbox
434
+ `ui-clamp__toggle` followed by a visible `ui-clamp__control` containing explicit
435
+ `ui-clamp__more` / `ui-clamp__less` text. Host owns IDs and content. Print
436
+ expands the body and hides the control. Details: `docs/clamp.md`.
437
+
374
438
  Optional line/row change-review grammar — opt-in, CSS only, never in the
375
439
  default bundle. For code review, changelogs, version history, config diffs, and
376
440
  generated reports:
@@ -558,7 +622,8 @@ behavior. Filter + keyboard-navigate a DOM-authored command list:
558
622
  Enter→`bronto:command:select` ({value,label}) and Escape→`bronto:command:close`.
559
623
  The HOST owns the action registry + execution; NO global Cmd/Ctrl+K (open it
560
624
  yourself, e.g. a <dialog> via initDialog). Pairs with `ui-shortcut`. Binding:
561
- `useCommand()` (react/solid/qwik). Details: `docs/command.md`.
625
+ `useCommand()` (React/Solid/Qwik), `command` / `useCommand` (Svelte), and
626
+ `vCommand` / `brontoVue` (Vue). Details: `docs/command.md`.
562
627
 
563
628
  Optional static report layer for LLM-authored HTML reports — opt-in, never in
564
629
  the default bundle. Pair it with the normal bundle, and add data-viz only when
@@ -569,11 +634,13 @@ specifiers only work after a bundler rewrites them:
569
634
  <link rel="stylesheet" href="./node_modules/@ponchia/ui/dist/bronto.css" />
570
635
  <link rel="stylesheet" href="./node_modules/@ponchia/ui/dist/css/report.css" />
571
636
  <link rel="stylesheet" href="./node_modules/@ponchia/ui/dist/css/dataviz.css" />
637
+ <link rel="stylesheet" href="./node_modules/@ponchia/ui/dist/css/figure.css" />
572
638
  <link rel="stylesheet" href="./node_modules/@ponchia/ui/dist/css/sources.css" />
573
639
  ```
574
640
 
575
641
  In Vite/webpack/etc., import `@ponchia/ui`, `@ponchia/ui/css/report.css`, and
576
- `@ponchia/ui/css/dataviz.css` instead.
642
+ `@ponchia/ui/css/dataviz.css` instead; add `figure.css`, `interval.css`,
643
+ `clamp.css`, or `highlights.css` only when the report uses them.
577
644
 
578
645
  Canonical report skeleton:
579
646
 
@@ -616,8 +683,9 @@ Report rules for agents:
616
683
  - Use semantic headings; give tables captions and header cells; give charts
617
684
  captions, legends/direct labels, and fallback data.
618
685
  - For a chart, theme Vega-Lite with `@ponchia/ui/vega` or hand-author a
619
- token-themed inline `<svg>` inside a `ui-report__figure`. Bronto ships no
620
- chart component.
686
+ token-themed inline `<svg>` inside `ui-report__figure ui-figure`, with a
687
+ `ui-figure__stage`, optional `ui-figure__key`, and fallback `ui-figure__data`.
688
+ Bronto ships no chart component.
621
689
  - Put the above-the-fold call in `ui-report__decision`; use
622
690
  `ui-report__finding--critical|--major|--minor|--resolved` only when the
623
691
  written finding label also states the severity/status.
@@ -633,9 +701,12 @@ Report rules for agents:
633
701
  conflicting, unverified, or generated inputs should be surfaced near affected
634
702
  claims, not only in the source appendix.
635
703
  - For important reports, emit a sidecar `claims.json` / source archive manifest
636
- with stable claim IDs, source IDs, status, risk, retrieval time, and
637
- claim-source relations. The visible HTML remains the primary artifact, but the
638
- sidecar lets tools prove IDs and high-risk evidence still resolve.
704
+ with `schemaVersion: "bronto-report-claims.v1"` and, when validating,
705
+ `@ponchia/ui/schemas/report-claims.v1.schema.json`. Include stable claim IDs,
706
+ source IDs, status, risk, retrieval time, and explicit `relations`
707
+ (`supports`, `limits`, `contradicts`, or `informs`). The visible HTML remains
708
+ the primary artifact, but the sidecar lets tools prove IDs and high-risk
709
+ evidence still resolve.
639
710
  - Use `ui-delta` (`--up`/`--down`/`--flat`, `--invert` when up is bad) for a
640
711
  trend figure and `ui-compare` (`--2up`) for an A/B / before-after section.
641
712
  - Use `ui-report__section--unnumbered` for appendices in numbered reports.
@@ -676,6 +747,8 @@ Read these from `node_modules/@ponchia/ui/` — no network needed:
676
747
  - `docs/reporting.md` — static/PDF-first report cookbook for LLM-authored
677
748
  reports, including report skeletons, decision/finding/evidence patterns,
678
749
  chart rules, print utilities, and safety boundaries.
750
+ - `schemas/report-claims.v1.schema.json` — declarative JSON Schema for
751
+ `claims.json` sidecars that map report claims to source IDs and relations.
679
752
  - `docs/annotations.md` — SVG annotation recipes and helper guidance for
680
753
  analytical figures.
681
754
  - `docs/mermaid.md` — theme Mermaid diagrams from bronto tokens (resolved
@@ -705,11 +778,11 @@ Read these from `node_modules/@ponchia/ui/` — no network needed:
705
778
  annotation geometry.
706
779
  - `classes/vscode.css-custom-data.json` — editor autocomplete for tokens.
707
780
 
708
- ## Human-browsable references (not shipped in the npm tarball, by design)
781
+ ## External web references
709
782
 
710
783
  - Live kitchen-sink demo (every component, light/dark, RTL): https://ponchia.github.io/bronto-ui/
711
784
  - Architecture & the CSS-first decision: https://github.com/Ponchia/bronto-ui/blob/main/docs/architecture.md
712
- - Framework integration guides (Astro / SvelteKit / React-Solid-Qwik / vanilla):
785
+ - Framework integration guides (Astro / SvelteKit / Vue / React-Solid-Qwik / vanilla):
713
786
  https://github.com/Ponchia/bronto-ui/tree/main/docs/getting-started
714
787
 
715
788
  ## Rules an agent should respect