@ponchia/ui 0.6.5 → 0.6.6

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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,77 @@
5
5
  |> `^0` / `*` wildcard does **not** protect you. See README → Versioning, and
6
6
  |> the deprecation policy in CONTRIBUTING.md.
7
7
 
8
+ ## 0.6.6 — 2026-06-10
9
+
10
+ Consolidation pass from the 2026-06-10 multi-agent audit: two real PDF-export
11
+ defects fixed and gated, the reporting hub routed to every shipped leaf, and
12
+ the drift-prone hand lists in the gates derived from registries. No breaking
13
+ changes, no `MIGRATIONS.json` entry.
14
+
15
+ ### Fixed
16
+
17
+ - **Print overprint (the big one)** — Chromium-class print engines restart
18
+ grid tracks at each page break, printing new rows over the running content.
19
+ `css/report.css` `@media print` now demotes the vertical document-flow
20
+ wrappers (`.ui-report`, `__section`, `__figure`, `__actions`,
21
+ `.ui-evidence-ledger`) to block flow with margin-emulated gaps; the column
22
+ grids (`.ui-compare`, `.ui-meter__row`, `.ui-report__decision-item`,
23
+ `.ui-evidence-grid`) keep their tracks. Gated by a promoted multi-page
24
+ fixture (`test/e2e/_report-print.fixture.html`) whose PDF is parsed with
25
+ pdfjs-dist and asserted overlap-free (`test/e2e/report-print.spec.mjs`).
26
+ - **Silent module-figure drop in PDFs** — reports that render figures from
27
+ relative `<script type="module">` imports lose them over `file://` (CORS).
28
+ `scripts/render-pdf.mjs` gains `--serve` (loopback HTTP + the report's
29
+ `data-report-ready` signal), forwards page/console errors to stderr, and
30
+ warns when a module report is rendered over `file://`.
31
+ - **Demo class drift** — `demo/index.html` still used the renamed
32
+ `ui-inspector__header` (now `__head`), and `demo/version-history-report.html`
33
+ carried a never-registered cover-mark class; both were silent no-ops. The
34
+ generated reference's analytical-leaves note now names `ui-annotation`
35
+ (singular, the real class).
36
+ - `scripts/smoke-example.mjs` imports Chromium from `@playwright/test` (the
37
+ installed devDependency) instead of the hoisting-dependent bare
38
+ `playwright` specifier.
39
+
40
+ ### Added
41
+
42
+ - **Reporting hub routing** — `docs/reporting.md`'s analytical-toolbox table
43
+ now routes ALL report-relevant leaves (spark, bullet, diff, code, sidenote,
44
+ textref, term, glossary, contents rail, tree, dot surfaces) and states
45
+ precisely what `analytical.css` does and does not bundle. New convention in
46
+ CONTRIBUTING: a new report-relevant leaf ships in the same PR as its
47
+ routing row.
48
+ - **`npm run release:prep -- X.Y.Z`** — one-shot release prep: version + lock
49
+ bump, CHANGELOG heading dating, and re-pinning every `@ponchia/ui@X.Y.Z`
50
+ literal across the gated shipped docs AND the ungated `demo/*.html` pages
51
+ (which had already drifted a version behind).
52
+ - **Cross-engine e2e on merge-to-main** — pushes to `main` that touch
53
+ engine-sensitive surfaces (`css/`, `dist/`, `behaviors/`, `fonts/`,
54
+ `tokens/`, `test/e2e/`, the Playwright config) now run the firefox/webkit
55
+ pass too, instead of deferring it to the release tag.
56
+ - **`demo/dots.html`** — the dot data surfaces (waffle, activity, level,
57
+ dotgauge, readout, spark--dots, halftone, dotfit) get a specimen page,
58
+ axe/guard coverage in `demos.spec`, and render-geometry boundingBox
59
+ assertions (their only possible executable gate — they ship no JS).
60
+ - jsdom coverage for `initDisabledGuard` (activation blocking, Tab
61
+ pass-through, root scoping, cleanup).
62
+
63
+ ### Changed
64
+
65
+ - `check:report` and `check:pack` derive their scan/entrypoint lists from
66
+ registries (`package.json` `files`/`exports` via `scripts/lib/css-leaves.mjs`
67
+ + `lib/shipped-docs.mjs`) instead of hand lists that had drifted behind the
68
+ post-0.6.0 leaves. The broadened scan immediately caught the demo/reference
69
+ class defects above. `core.css` imports are now closed over an explicit
70
+ CORE_BUNDLE allowlist in both directions.
71
+ - `ROADMAP.md` / `docs/frontier-primitives.md` reconciled to 0.6.5: the
72
+ report/provenance/explanation lane is named the proven core; ui-job,
73
+ ui-conflict, ui-splitter, the tree roving-focus kernel, and
74
+ command/workbench follow-ons are explicitly dormant until a real app
75
+ consumer exists; the 2026-06-09 scout keeps (ui-interval, ui-clamp,
76
+ ui-highlights) are recorded as report-lane candidates gated behind the
77
+ routing hub. The adoption stance is stated in ROADMAP.
78
+
8
79
  ## 0.6.5 — 2026-06-09
9
80
 
10
81
  Patch release: the source-backref behavior, the report decision/evidence
package/README.md CHANGED
@@ -22,9 +22,16 @@ SVG annotations, legends, leader-line connectors, a guided-focus spotlight, text
22
22
  marks, a colourblind-safe data-viz palette, and a static/PDF report grammar — for
23
23
  dashboards and LLM-authored reports.
24
24
 
25
- ### [Live demo →](https://ponchia.github.io/bronto-ui/) &nbsp;·&nbsp; [Theme playground →](https://ponchia.github.io/bronto-ui/demo/theme-playground.html)
25
+ ### [Live demo →](https://ponchia.github.io/bronto-ui/) &nbsp;·&nbsp; [Static report →](https://ponchia.github.io/bronto-ui/demo/report-standalone.html) &nbsp;·&nbsp; [Theme playground →](https://ponchia.github.io/bronto-ui/demo/theme-playground.html)
26
26
 
27
27
  The demo is the kitchen sink — every component, light/dark, RTL, live theming.
28
+ The static report is the differentiator in one file: a complete, no-build,
29
+ no-JS, Chromium-PDF-ready report built from the report grammar.
30
+
31
+ <p>
32
+ <img alt="A research report built with the @ponchia/ui report layer" src="https://raw.githubusercontent.com/Ponchia/bronto-ui/main/demo/_preview-report-research.png" width="49%" />
33
+ <img alt="The same report grammar printed to PDF" src="https://raw.githubusercontent.com/Ponchia/bronto-ui/main/demo/_preview-report-print.png" width="49%" />
34
+ </p>
28
35
 
29
36
  ---
30
37
 
@@ -104,7 +111,7 @@ toast('Saved', { tone: 'success' }); // body-anchored stack, no markup needed
104
111
 
105
112
  Behaviors cover theme persistence, disclosure, dropdown menus, native-`<dialog>` modals/drawers, tabs, combobox, form validation, table sort, carousel, source backrefs and toasts — wired by `data-bronto-*` attributes.
106
113
 
107
- **5. (Optional) display glyphs — a 48-glyph dot-matrix icon set:**
114
+ **5. (Optional) display glyphs — a 71-glyph dot-matrix icon set:**
108
115
 
109
116
  ```js
110
117
  import { renderGlyph } from '@ponchia/ui/glyphs';
@@ -128,7 +135,7 @@ Arrows, chevrons, check/close/plus/minus, search/menu/gear, info/warning/bell/lo
128
135
  - **Analytical & communication primitives** _(opt-in)_ — `@ponchia/ui/css/analytical.css`: SVG **annotations** (subject/connector/note), standalone **legends**/data-keys, text/evidence **marks**, leader-line **connectors** (+ a pure `@ponchia/ui/connectors` geometry kernel), a guided-focus **spotlight**, a **crosshair**/readout, and a cross-cutting **selection** vocabulary. Each owns its visual grammar + pure geometry and refuses scales/state/hit-testing — figures that explain themselves, not a chart engine. Plus standalone **`source`/provenance** (trust) and **lifecycle `state`** leaves.
129
136
  - **Reports** _(opt-in)_ — `@ponchia/ui/css/report.css`, a static/PDF-first report grammar for LLM-authored HTML: covers, decisions, claims, sections, severity-labelled findings, evidence packets, evidence ledgers, action registers, source-card bindings, figures, chart wrappers and print utilities.
130
137
  - **Motion & dots** — the dot-matrix motif kit: dot grid, status dots, dot loaders, the orbital spinner, matrix reveal — all reduced-motion aware.
131
- - **Glyphs** — `@ponchia/ui/glyphs`, a 48-glyph dot-matrix icon set on the `.ui-dotmatrix` primitive (display marks + crisp `solid` inline icons + one-node `.ui-icon` mask rendering).
138
+ - **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).
132
139
  - **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.
133
140
  - **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.
134
141
 
package/css/report.css CHANGED
@@ -693,6 +693,33 @@
693
693
  min-block-size: auto;
694
694
  }
695
695
 
696
+ /* Chromium-class print engines overprint grid rows across page breaks
697
+ (fragmented grid tracks restart at the page top, on top of the running
698
+ content). Demote ONLY the vertical document-flow wrappers to block flow
699
+ and emulate their gap with margins; multi-column grids (.ui-compare,
700
+ .ui-meter__row, .ui-report__decision-item, .ui-evidence-grid, …) keep
701
+ grid — their content is break-inside-avoided as a unit instead. */
702
+ .ui-report,
703
+ .ui-report__section,
704
+ .ui-report__figure,
705
+ .ui-report__actions,
706
+ .ui-evidence-ledger {
707
+ display: block;
708
+ }
709
+
710
+ .ui-report > * + * {
711
+ margin-block-start: var(--report-gap);
712
+ }
713
+
714
+ .ui-report__section > * + * {
715
+ margin-block-start: var(--space-md);
716
+ }
717
+
718
+ .ui-report__figure > * + *,
719
+ .ui-evidence-ledger > * + * {
720
+ margin-block-start: var(--space-sm);
721
+ }
722
+
696
723
  .ui-report__cover,
697
724
  .ui-report__head,
698
725
  .ui-report__decision,
@@ -700,6 +727,7 @@
700
727
  .ui-report__finding,
701
728
  .ui-report__evidence,
702
729
  .ui-report__figure,
730
+ .ui-report__toc,
703
731
  .ui-claim,
704
732
  .ui-evidence-item,
705
733
  .ui-report__action {
@@ -1 +1 @@
1
- @layer bronto{.ui-report{--report-width: 72rem;--report-padding-block: var(--space-2xl);--report-gap: var(--space-lg);--report-measure: 74ch;color: var(--text-soft);display: grid;gap: var(--report-gap);inline-size: min(100%,var(--report-width));margin-inline: auto;padding: var(--report-padding-block) var(--space-md)}.ui-report--compact{--report-gap: var(--space-md);--report-padding-block: var(--space-xl)}.ui-report--numbered{counter-reset: report-section}.ui-report > *,.ui-report__cover > *,.ui-report__head > *,.ui-report__toc > *,.ui-report__summary > *,.ui-report__decision > *,.ui-report__finding > *,.ui-report__evidence > *,.ui-report__section > *,.ui-report__figure > *,.ui-claim > *,.ui-evidence-grid > *,.ui-evidence-ledger > *,.ui-compare > *,.ui-compare__col > *{min-inline-size: 0}.ui-report__cover{align-content: end;border-block-end: 1px solid var(--line);display: grid;gap: var(--space-md);min-block-size: min(62vh,34rem);padding-block-end: var(--space-xl)}.ui-report__cover--compact{min-block-size: auto;padding-block: var(--space-xl) var(--space-lg)}.ui-report__head{align-items: end;border-block-end: 1px solid var(--line);display: flex;flex-wrap: wrap;gap: var(--space-md);justify-content: space-between;padding-block-end: var(--space-md)}.ui-report__title{color: var(--text);font-family: var(--display);font-size: calc(var(--text-xl) * 1.35);font-weight: var(--display-weight-strong);letter-spacing: 0;line-height: 1.05;margin: 0;max-inline-size: var(--report-measure);text-transform: uppercase;text-wrap: balance}.ui-report__subtitle{color: var(--text-dim);font-size: var(--text-lg);line-height: 1.5;margin: 0;max-inline-size: var(--report-measure)}.ui-report__meta{align-items: center;color: var(--text-dim);display: flex;flex-wrap: wrap;font-family: var(--mono);font-size: var(--text-2xs);gap: 0.55rem;letter-spacing: 0;list-style: none;margin: 0;padding: 0;text-transform: uppercase}.ui-report__meta > *{align-items: center;display: inline-flex;gap: 0.55rem}.ui-report__meta > :not(:last-child)::after{background: var(--line-strong);border-radius: 50%;block-size: 0.22rem;content: '';inline-size: 0.22rem}.ui-report__toc{border: 1px solid var(--line);border-radius: var(--radius-md);display: grid;gap: var(--space-xs);padding: var(--space-md)}.ui-report__toc ol,.ui-report__toc ul{display: grid;gap: 0.35rem;margin: 0;padding-inline-start: var(--space-md)}.ui-report__toc a{color: var(--text);text-decoration: underline;text-decoration-color: color-mix(in srgb,var(--accent) 45%,transparent);text-underline-offset: 0.2rem}.ui-report__summary,.ui-report__finding,.ui-report__evidence{background: var(--panel);border: 1px solid var(--line);border-radius: var(--radius-md);display: grid;gap: var(--space-sm);padding: var(--space-md)}.ui-report__summary{border-inline-start: 2px solid var(--accent)}.ui-report__decision{background: var(--panel);border: 1px solid color-mix(in srgb,var(--accent) 40%,var(--line));border-inline-start: 3px solid var(--accent);border-radius: var(--radius-md);display: grid;gap: var(--space-sm);padding: var(--space-md)}.ui-report__decision-kicker{color: var(--accent-text);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide);margin: 0;text-transform: uppercase}.ui-report__decision-title{color: var(--text);font-family: var(--display);font-size: var(--text-lg);font-weight: var(--display-weight);letter-spacing: 0;line-height: 1.18;margin: 0;text-transform: uppercase;text-wrap: balance}.ui-report__decision-body{color: var(--text-soft);line-height: 1.6;margin: 0;max-inline-size: var(--report-measure)}.ui-report__decision-meta{color: var(--text-dim);display: flex;flex-wrap: wrap;font-family: var(--mono);font-size: var(--text-2xs);gap: 0.45rem 0.75rem;letter-spacing: 0}.ui-report__decision-grid{border-block-start: 1px solid var(--line);display: grid;gap: 0}.ui-report__decision-item{align-items: start;border-block-end: 1px solid var(--line);display: grid;gap: var(--space-xs);grid-template-columns: minmax(8rem,14rem) minmax(0,1fr);padding-block: var(--space-xs)}.ui-report__decision-label,.ui-report__decision-value{margin: 0}.ui-report__decision-label{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide);text-transform: uppercase}.ui-report__decision-value{color: var(--text-soft);line-height: 1.5}.ui-report__finding{--report-finding-tone: var(--line-strong);border-inline-start: 2px solid var(--report-finding-tone)}.ui-report__finding--critical{--report-finding-tone: var(--danger)}.ui-report__finding--major{--report-finding-tone: var(--warning)}.ui-report__finding--minor{--report-finding-tone: var(--info)}.ui-report__finding--resolved{--report-finding-tone: var(--success)}.ui-report__finding-title,.ui-report__finding-claim,.ui-report__finding-impact,.ui-report__finding-remediation,.ui-report__finding-evidence,.ui-report__finding-caveat{margin: 0}.ui-report__finding-title{color: var(--text);font-size: var(--text-md);font-weight: 650;line-height: 1.25}.ui-report__finding-claim{color: var(--text);line-height: 1.6}.ui-report__finding-impact,.ui-report__finding-remediation,.ui-report__finding-evidence{color: var(--text-soft);line-height: 1.55}.ui-report__finding-caveat{color: var(--text-dim);font-size: var(--text-sm);line-height: 1.55}.ui-claim{--claim-tone: var(--accent);background: var(--panel-soft);border: 1px solid var(--line);border-inline-start: 2px solid var(--claim-tone);border-radius: var(--radius-md);display: grid;gap: var(--space-xs);padding: var(--space-sm)}.ui-claim--supported{--claim-tone: var(--success)}.ui-claim--partial{--claim-tone: var(--warning)}.ui-claim--disputed,.ui-claim--unsupported{--claim-tone: var(--danger)}.ui-claim--unknown{--claim-tone: var(--info)}.ui-claim__statement,.ui-claim__status,.ui-claim__scope,.ui-claim__basis,.ui-claim__limits,.ui-claim__refs,.ui-claim__caveat{margin: 0}.ui-claim__statement{color: var(--text);font-weight: 650;line-height: 1.45}.ui-claim__status,.ui-claim__scope,.ui-claim__refs{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0;text-transform: uppercase}.ui-claim__basis,.ui-claim__limits,.ui-claim__caveat{color: var(--text-soft);font-size: var(--text-sm);line-height: 1.55}.ui-report__evidence{background: var(--panel-soft)}.ui-report__evidence:has(> .ui-table-wrap:only-child){padding: 0}.ui-report__evidence:has(> .ui-table-wrap:only-child) > .ui-table-wrap{border: 0;border-radius: var(--radius-md)}.ui-report__section{display: grid;gap: var(--space-md);scroll-margin-block-start: 6rem}.ui-report__section + .ui-report__section{border-block-start: 1px solid var(--line);padding-block-start: var(--space-xl)}.ui-report__section-head{color: var(--text);font-family: var(--display);font-size: var(--text-xl);font-weight: var(--display-weight);letter-spacing: 0;line-height: 1.1;margin: 0;text-transform: uppercase;text-wrap: balance}.ui-report--numbered .ui-report__section-head::before{color: var(--accent-text);content: counter(report-section,decimal-leading-zero) ' / ';counter-increment: report-section}.ui-report--numbered .ui-report__section--unnumbered > .ui-report__section-head::before{content: none;counter-increment: none}.ui-report__figure{display: grid;gap: var(--space-sm);margin: 0}.ui-report__caption{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0;line-height: 1.5;text-transform: uppercase}.ui-evidence-grid{display: grid;gap: var(--space-sm);grid-template-columns: repeat(auto-fit,minmax(min(100%,16rem),1fr))}.ui-evidence-item{background: var(--panel-soft);border: 1px solid var(--line);border-radius: var(--radius-md);display: grid;gap: 0.35rem;padding: var(--space-sm)}.ui-evidence-item__title{color: var(--text);font-size: var(--text-sm);font-weight: 600;margin: 0}.ui-evidence-item__meta{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0}.ui-evidence-item__body{color: var(--text-soft);font-size: var(--text-sm);line-height: 1.55;margin: 0}.ui-evidence-item__kind,.ui-evidence-item__method,.ui-evidence-item__window,.ui-evidence-item__value,.ui-evidence-item__source,.ui-evidence-item__caveat{margin: 0}.ui-evidence-item__kind,.ui-evidence-item__method,.ui-evidence-item__window,.ui-evidence-item__source{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0;text-transform: uppercase}.ui-evidence-item__value{color: var(--text);font-size: var(--text-md);font-weight: 650}.ui-evidence-item__caveat{color: var(--text-dim);font-size: var(--text-sm);line-height: 1.5}.ui-evidence-ledger{display: grid;gap: var(--space-sm)}.ui-report__actions{border-block-start: 1px solid var(--line);display: grid;gap: 0}.ui-report__action{align-items: start;border-block-end: 1px solid var(--line);display: grid;gap: var(--space-xs);grid-template-columns: minmax(0,1fr) auto;padding-block: var(--space-sm)}.ui-report__action-status{align-self: start;color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide);text-transform: uppercase}.ui-report__action-title,.ui-report__action-owner,.ui-report__action-due,.ui-report__action-priority,.ui-report__action-criteria,.ui-report__action-source{margin: 0}.ui-report__action-title{color: var(--text);font-weight: 650;line-height: 1.45}.ui-report__action-owner,.ui-report__action-due,.ui-report__action-priority,.ui-report__action-source{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0;text-transform: uppercase}.ui-report__action-criteria{color: var(--text-soft);font-size: var(--text-sm);line-height: 1.5}@media (max-width: 32rem){.ui-report__decision-item,.ui-report__action{grid-template-columns: 1fr}}.ui-report__sources,.ui-report__appendix,.ui-report__footnotes{border-block-start: 1px solid var(--line);color: var(--text-dim);display: grid;font-size: var(--text-sm);gap: var(--space-sm);padding-block-start: var(--space-md)}.ui-compare{display: grid;gap: var(--space-md);grid-template-columns: repeat(auto-fit,minmax(min(100%,16rem),1fr))}.ui-compare--2up{grid-template-columns: repeat(2,minmax(0,1fr))}@media (max-width: 33rem){.ui-compare--2up{grid-template-columns: 1fr}}.ui-compare__col{align-content: start;display: grid;gap: var(--space-sm)}.ui-compare__head{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide);text-transform: uppercase}.ui-meter__row{align-items: center;display: grid;gap: var(--space-2xs) var(--space-md);grid-template-columns: minmax(9rem,14rem) 1fr auto;margin-block: var(--space-2xs)}.ui-meter__row .ui-meter{min-inline-size: 8rem}.ui-meter__label{color: var(--text-soft)}.ui-meter__value{color: var(--text);font-family: var(--mono);font-variant-numeric: tabular-nums;text-align: end}@media (max-width: 32rem){.ui-meter__row{grid-template-columns: 1fr}.ui-meter__value{text-align: start}}.ui-print-only{display: none !important}.ui-print-exact{-webkit-print-color-adjust: exact;print-color-adjust: exact}@media print{@page{margin: 18mm}.ui-report{--report-padding-block: 0;color-scheme: light;--text: #111;--text-soft: #2a2a2a;--text-dim: #555;--panel: #fff;--panel-soft: #f7f7f7;--line: #d9d9d9;--line-strong: #b3b3b3;inline-size: auto;padding: 0}.ui-report__cover{min-block-size: auto}.ui-report__cover,.ui-report__head,.ui-report__decision,.ui-report__summary,.ui-report__finding,.ui-report__evidence,.ui-report__figure,.ui-claim,.ui-evidence-item,.ui-report__action{break-inside: avoid}.ui-report__section-head{break-after: avoid}.ui-print-only{display: var(--print-display,block) !important}.ui-screen-only{display: none !important}.ui-break-before{break-before: page}.ui-break-after{break-after: page}.ui-keep{break-inside: avoid}}}
1
+ @layer bronto{.ui-report{--report-width: 72rem;--report-padding-block: var(--space-2xl);--report-gap: var(--space-lg);--report-measure: 74ch;color: var(--text-soft);display: grid;gap: var(--report-gap);inline-size: min(100%,var(--report-width));margin-inline: auto;padding: var(--report-padding-block) var(--space-md)}.ui-report--compact{--report-gap: var(--space-md);--report-padding-block: var(--space-xl)}.ui-report--numbered{counter-reset: report-section}.ui-report > *,.ui-report__cover > *,.ui-report__head > *,.ui-report__toc > *,.ui-report__summary > *,.ui-report__decision > *,.ui-report__finding > *,.ui-report__evidence > *,.ui-report__section > *,.ui-report__figure > *,.ui-claim > *,.ui-evidence-grid > *,.ui-evidence-ledger > *,.ui-compare > *,.ui-compare__col > *{min-inline-size: 0}.ui-report__cover{align-content: end;border-block-end: 1px solid var(--line);display: grid;gap: var(--space-md);min-block-size: min(62vh,34rem);padding-block-end: var(--space-xl)}.ui-report__cover--compact{min-block-size: auto;padding-block: var(--space-xl) var(--space-lg)}.ui-report__head{align-items: end;border-block-end: 1px solid var(--line);display: flex;flex-wrap: wrap;gap: var(--space-md);justify-content: space-between;padding-block-end: var(--space-md)}.ui-report__title{color: var(--text);font-family: var(--display);font-size: calc(var(--text-xl) * 1.35);font-weight: var(--display-weight-strong);letter-spacing: 0;line-height: 1.05;margin: 0;max-inline-size: var(--report-measure);text-transform: uppercase;text-wrap: balance}.ui-report__subtitle{color: var(--text-dim);font-size: var(--text-lg);line-height: 1.5;margin: 0;max-inline-size: var(--report-measure)}.ui-report__meta{align-items: center;color: var(--text-dim);display: flex;flex-wrap: wrap;font-family: var(--mono);font-size: var(--text-2xs);gap: 0.55rem;letter-spacing: 0;list-style: none;margin: 0;padding: 0;text-transform: uppercase}.ui-report__meta > *{align-items: center;display: inline-flex;gap: 0.55rem}.ui-report__meta > :not(:last-child)::after{background: var(--line-strong);border-radius: 50%;block-size: 0.22rem;content: '';inline-size: 0.22rem}.ui-report__toc{border: 1px solid var(--line);border-radius: var(--radius-md);display: grid;gap: var(--space-xs);padding: var(--space-md)}.ui-report__toc ol,.ui-report__toc ul{display: grid;gap: 0.35rem;margin: 0;padding-inline-start: var(--space-md)}.ui-report__toc a{color: var(--text);text-decoration: underline;text-decoration-color: color-mix(in srgb,var(--accent) 45%,transparent);text-underline-offset: 0.2rem}.ui-report__summary,.ui-report__finding,.ui-report__evidence{background: var(--panel);border: 1px solid var(--line);border-radius: var(--radius-md);display: grid;gap: var(--space-sm);padding: var(--space-md)}.ui-report__summary{border-inline-start: 2px solid var(--accent)}.ui-report__decision{background: var(--panel);border: 1px solid color-mix(in srgb,var(--accent) 40%,var(--line));border-inline-start: 3px solid var(--accent);border-radius: var(--radius-md);display: grid;gap: var(--space-sm);padding: var(--space-md)}.ui-report__decision-kicker{color: var(--accent-text);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide);margin: 0;text-transform: uppercase}.ui-report__decision-title{color: var(--text);font-family: var(--display);font-size: var(--text-lg);font-weight: var(--display-weight);letter-spacing: 0;line-height: 1.18;margin: 0;text-transform: uppercase;text-wrap: balance}.ui-report__decision-body{color: var(--text-soft);line-height: 1.6;margin: 0;max-inline-size: var(--report-measure)}.ui-report__decision-meta{color: var(--text-dim);display: flex;flex-wrap: wrap;font-family: var(--mono);font-size: var(--text-2xs);gap: 0.45rem 0.75rem;letter-spacing: 0}.ui-report__decision-grid{border-block-start: 1px solid var(--line);display: grid;gap: 0}.ui-report__decision-item{align-items: start;border-block-end: 1px solid var(--line);display: grid;gap: var(--space-xs);grid-template-columns: minmax(8rem,14rem) minmax(0,1fr);padding-block: var(--space-xs)}.ui-report__decision-label,.ui-report__decision-value{margin: 0}.ui-report__decision-label{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide);text-transform: uppercase}.ui-report__decision-value{color: var(--text-soft);line-height: 1.5}.ui-report__finding{--report-finding-tone: var(--line-strong);border-inline-start: 2px solid var(--report-finding-tone)}.ui-report__finding--critical{--report-finding-tone: var(--danger)}.ui-report__finding--major{--report-finding-tone: var(--warning)}.ui-report__finding--minor{--report-finding-tone: var(--info)}.ui-report__finding--resolved{--report-finding-tone: var(--success)}.ui-report__finding-title,.ui-report__finding-claim,.ui-report__finding-impact,.ui-report__finding-remediation,.ui-report__finding-evidence,.ui-report__finding-caveat{margin: 0}.ui-report__finding-title{color: var(--text);font-size: var(--text-md);font-weight: 650;line-height: 1.25}.ui-report__finding-claim{color: var(--text);line-height: 1.6}.ui-report__finding-impact,.ui-report__finding-remediation,.ui-report__finding-evidence{color: var(--text-soft);line-height: 1.55}.ui-report__finding-caveat{color: var(--text-dim);font-size: var(--text-sm);line-height: 1.55}.ui-claim{--claim-tone: var(--accent);background: var(--panel-soft);border: 1px solid var(--line);border-inline-start: 2px solid var(--claim-tone);border-radius: var(--radius-md);display: grid;gap: var(--space-xs);padding: var(--space-sm)}.ui-claim--supported{--claim-tone: var(--success)}.ui-claim--partial{--claim-tone: var(--warning)}.ui-claim--disputed,.ui-claim--unsupported{--claim-tone: var(--danger)}.ui-claim--unknown{--claim-tone: var(--info)}.ui-claim__statement,.ui-claim__status,.ui-claim__scope,.ui-claim__basis,.ui-claim__limits,.ui-claim__refs,.ui-claim__caveat{margin: 0}.ui-claim__statement{color: var(--text);font-weight: 650;line-height: 1.45}.ui-claim__status,.ui-claim__scope,.ui-claim__refs{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0;text-transform: uppercase}.ui-claim__basis,.ui-claim__limits,.ui-claim__caveat{color: var(--text-soft);font-size: var(--text-sm);line-height: 1.55}.ui-report__evidence{background: var(--panel-soft)}.ui-report__evidence:has(> .ui-table-wrap:only-child){padding: 0}.ui-report__evidence:has(> .ui-table-wrap:only-child) > .ui-table-wrap{border: 0;border-radius: var(--radius-md)}.ui-report__section{display: grid;gap: var(--space-md);scroll-margin-block-start: 6rem}.ui-report__section + .ui-report__section{border-block-start: 1px solid var(--line);padding-block-start: var(--space-xl)}.ui-report__section-head{color: var(--text);font-family: var(--display);font-size: var(--text-xl);font-weight: var(--display-weight);letter-spacing: 0;line-height: 1.1;margin: 0;text-transform: uppercase;text-wrap: balance}.ui-report--numbered .ui-report__section-head::before{color: var(--accent-text);content: counter(report-section,decimal-leading-zero) ' / ';counter-increment: report-section}.ui-report--numbered .ui-report__section--unnumbered > .ui-report__section-head::before{content: none;counter-increment: none}.ui-report__figure{display: grid;gap: var(--space-sm);margin: 0}.ui-report__caption{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0;line-height: 1.5;text-transform: uppercase}.ui-evidence-grid{display: grid;gap: var(--space-sm);grid-template-columns: repeat(auto-fit,minmax(min(100%,16rem),1fr))}.ui-evidence-item{background: var(--panel-soft);border: 1px solid var(--line);border-radius: var(--radius-md);display: grid;gap: 0.35rem;padding: var(--space-sm)}.ui-evidence-item__title{color: var(--text);font-size: var(--text-sm);font-weight: 600;margin: 0}.ui-evidence-item__meta{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0}.ui-evidence-item__body{color: var(--text-soft);font-size: var(--text-sm);line-height: 1.55;margin: 0}.ui-evidence-item__kind,.ui-evidence-item__method,.ui-evidence-item__window,.ui-evidence-item__value,.ui-evidence-item__source,.ui-evidence-item__caveat{margin: 0}.ui-evidence-item__kind,.ui-evidence-item__method,.ui-evidence-item__window,.ui-evidence-item__source{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0;text-transform: uppercase}.ui-evidence-item__value{color: var(--text);font-size: var(--text-md);font-weight: 650}.ui-evidence-item__caveat{color: var(--text-dim);font-size: var(--text-sm);line-height: 1.5}.ui-evidence-ledger{display: grid;gap: var(--space-sm)}.ui-report__actions{border-block-start: 1px solid var(--line);display: grid;gap: 0}.ui-report__action{align-items: start;border-block-end: 1px solid var(--line);display: grid;gap: var(--space-xs);grid-template-columns: minmax(0,1fr) auto;padding-block: var(--space-sm)}.ui-report__action-status{align-self: start;color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide);text-transform: uppercase}.ui-report__action-title,.ui-report__action-owner,.ui-report__action-due,.ui-report__action-priority,.ui-report__action-criteria,.ui-report__action-source{margin: 0}.ui-report__action-title{color: var(--text);font-weight: 650;line-height: 1.45}.ui-report__action-owner,.ui-report__action-due,.ui-report__action-priority,.ui-report__action-source{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: 0;text-transform: uppercase}.ui-report__action-criteria{color: var(--text-soft);font-size: var(--text-sm);line-height: 1.5}@media (max-width: 32rem){.ui-report__decision-item,.ui-report__action{grid-template-columns: 1fr}}.ui-report__sources,.ui-report__appendix,.ui-report__footnotes{border-block-start: 1px solid var(--line);color: var(--text-dim);display: grid;font-size: var(--text-sm);gap: var(--space-sm);padding-block-start: var(--space-md)}.ui-compare{display: grid;gap: var(--space-md);grid-template-columns: repeat(auto-fit,minmax(min(100%,16rem),1fr))}.ui-compare--2up{grid-template-columns: repeat(2,minmax(0,1fr))}@media (max-width: 33rem){.ui-compare--2up{grid-template-columns: 1fr}}.ui-compare__col{align-content: start;display: grid;gap: var(--space-sm)}.ui-compare__head{color: var(--text-dim);font-family: var(--mono);font-size: var(--text-2xs);letter-spacing: var(--tracking-wide);text-transform: uppercase}.ui-meter__row{align-items: center;display: grid;gap: var(--space-2xs) var(--space-md);grid-template-columns: minmax(9rem,14rem) 1fr auto;margin-block: var(--space-2xs)}.ui-meter__row .ui-meter{min-inline-size: 8rem}.ui-meter__label{color: var(--text-soft)}.ui-meter__value{color: var(--text);font-family: var(--mono);font-variant-numeric: tabular-nums;text-align: end}@media (max-width: 32rem){.ui-meter__row{grid-template-columns: 1fr}.ui-meter__value{text-align: start}}.ui-print-only{display: none !important}.ui-print-exact{-webkit-print-color-adjust: exact;print-color-adjust: exact}@media print{@page{margin: 18mm}.ui-report{--report-padding-block: 0;color-scheme: light;--text: #111;--text-soft: #2a2a2a;--text-dim: #555;--panel: #fff;--panel-soft: #f7f7f7;--line: #d9d9d9;--line-strong: #b3b3b3;inline-size: auto;padding: 0}.ui-report__cover{min-block-size: auto}.ui-report,.ui-report__section,.ui-report__figure,.ui-report__actions,.ui-evidence-ledger{display: block}.ui-report > * + *{margin-block-start: var(--report-gap)}.ui-report__section > * + *{margin-block-start: var(--space-md)}.ui-report__figure > * + *,.ui-evidence-ledger > * + *{margin-block-start: var(--space-sm)}.ui-report__cover,.ui-report__head,.ui-report__decision,.ui-report__summary,.ui-report__finding,.ui-report__evidence,.ui-report__figure,.ui-report__toc,.ui-claim,.ui-evidence-item,.ui-report__action{break-inside: avoid}.ui-report__section-head{break-after: avoid}.ui-print-only{display: var(--print-display,block) !important}.ui-screen-only{display: none !important}.ui-break-before{break-before: page}.ui-break-after{break-after: page}.ui-keep{break-inside: avoid}}}
@@ -226,14 +226,38 @@ precision signal the product does not have).
226
226
 
227
227
  The CSS cores of candidates 1–5 shipped in 0.5.0, the 2026 scout batch shipped
228
228
  in PRs #97/#100, and scout batch #2 (textref / bullet / term / toc / tree)
229
- shipped 2026-06-04. The remaining active work, in order:
230
-
231
- 1. `ui-job` / `ui-conflict` lifecycle surfaces (candidate 2).
232
- 2. The `ui-splitter` ARIA window-splitter behavior + drag affordances
233
- (candidate 4) also the gating consumer for `ui-tree`'s deferred roving-focus
234
- tree kernel.
235
-
236
- Deferred items stay gated on a real consumer needing them. This order keeps
229
+ shipped 2026-06-04.
230
+
231
+ **The proven lane is report / provenance / explanation** it is the only lane
232
+ with a real consumer (LLM-authored reports). The command, workbench, and
233
+ durable-state lanes shipped their CSS cores and have had **no non-demo
234
+ consumer since**; their follow-ons are demand-gated, not queued. Active work
235
+ is therefore consolidation of the report lane (hub routing, print/PDF
236
+ fidelity, consumer-contract gates), not new surfaces.
237
+
238
+ ### Report-lane candidates (build only after the routing hub carries them)
239
+
240
+ From the 2026-06-09 local scout — kept on merit, deliberately NOT started
241
+ until the reporting.md routing/adoption pass has landed (shipping more leaves
242
+ into an unrouted hub repeats the discoverability gap):
243
+
244
+ 1. `ui-interval` — honest low–high uncertainty span + ± chip, inline in
245
+ reports; the error-bar grammar generic kits never ship.
246
+ 2. `ui-clamp` — N-line clamp + fade + native show-more for claim-basis and
247
+ source excerpts (`-webkit-line-clamp` + `mask-image` + `<details>`).
248
+ 3. `ui-highlights` — cited-evidence / search-hit spans painted from host
249
+ Ranges via the CSS Custom Highlight API (progressive enhancement; clean
250
+ no-op below the floor).
251
+
252
+ ### Dormant (build with the first real app consumer, not before)
253
+
254
+ - `ui-job` / `ui-conflict` lifecycle surfaces (candidate 2).
255
+ - `ui-splitter` ARIA window-splitter behavior + drag affordances
256
+ (candidate 4), which is also the gating consumer for `ui-tree`'s deferred
257
+ roving-focus tree kernel.
258
+ - Any command/workbench follow-ons beyond the shipped CSS cores.
259
+
260
+ Dormant items stay gated on a real consumer needing them. This posture keeps
237
261
  Bronto differentiated while staying inside its core philosophy: small,
238
262
  framework-agnostic primitives that make complex interfaces clearer.
239
263
 
package/docs/reference.md CHANGED
@@ -1545,7 +1545,7 @@ works in any framework without a binding layer:
1545
1545
  - **Opt-in component CSS** — a few classes are not in the core bundle and need
1546
1546
  their leaf imported, or they render unstyled: `ui-property`/`ui-readout` →
1547
1547
  `@ponchia/ui/css/workbench.css`; `ui-mark`/`ui-bracket-note` →
1548
- `@ponchia/ui/css/marks.css`; the analytical leaves (`ui-annotations`,
1548
+ `@ponchia/ui/css/marks.css`; the analytical leaves (`ui-annotation`,
1549
1549
  `ui-crosshair`, `ui-spotlight`, …) → their matching leaf.
1550
1550
  - **Loaders need their children** — `ui-dotspinner` requires exactly eight
1551
1551
  `<i>` children, `ui-dotloader` three `<span>`, and a static `ui-dotbar`
package/docs/reporting.md CHANGED
@@ -37,11 +37,11 @@ No install? Link the same files from a CDN. Pin the version — pre-1.0, breakin
37
37
  changes ship in the minor (see [stability.md](./stability.md)):
38
38
 
39
39
  ```html
40
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.5/dist/bronto.css" />
41
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.5/dist/css/report.css" />
42
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.5/dist/css/dataviz.css" />
43
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.5/dist/css/annotations.css" />
44
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.5/dist/css/legend.css" />
40
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.6/dist/bronto.css" />
41
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.6/dist/css/report.css" />
42
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.6/dist/css/dataviz.css" />
43
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.6/dist/css/annotations.css" />
44
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.6/dist/css/legend.css" />
45
45
  ```
46
46
 
47
47
  The CDN serves the package's own `fonts/` next to the CSS, so font URLs resolve
@@ -59,8 +59,11 @@ sanitize that content before rendering it and do not initialize
59
59
  `css/report.css` gives you the document grammar (covers, sections, findings,
60
60
  evidence). The _content_ inside those sections is where the rest of the
61
61
  analytical layer earns its place. Each one is an opt-in import that stays out of
62
- the default bundle — add the leaves a given report actually needs, or pull the
63
- whole set with `@ponchia/ui/css/analytical.css`. Reach for:
62
+ the default bundle — add the leaves a given report actually needs.
63
+ `@ponchia/ui/css/analytical.css` is a convenience roll-up of the **seven
64
+ figure-layer leaves only** (annotations, legends, marks, connectors, spotlight,
65
+ crosshair, selection) — sources, generated, state, and the prose/evidence
66
+ leaves below are NOT in it and must be linked individually. Reach for:
64
67
 
65
68
  | Layer | Import | Reach for it when… |
66
69
  | --- | --- | --- |
@@ -72,6 +75,16 @@ whole set with `@ponchia/ui/css/analytical.css`. Reach for:
72
75
  | **D2 theme** (`@ponchia/ui/d2`) | _(JS/JSON, no CSS)_ | The report embeds a [D2](https://d2lang.com) diagram and you want it on-brand. Resolved theme-override slots (monochrome base + one rationed accent) projected from the same tokens; annotate the rendered SVG. See [d2.md](./d2.md). |
73
76
  | **Generated-content trust** (`.ui-generated`, `.ui-origin-label`, `.ui-reasoning`, `.ui-tool-log`) | `css/generated.css` | The report (or a section of it) is AI/system-authored and should _say so_ — an origin label plus quiet, collapsible reasoning / tool-call logs. Pairs with the sources layer. See [generated.md](./generated.md). |
74
77
  | **Lifecycle / system state** (`.ui-state`, `.ui-syncbar`) | `css/state.css` | A status report needs to show the state a thing is in — saving / queued / stale / conflict / reviewed — as a labelled object, not a bare coloured dot. See [state.md](./state.md). |
78
+ | **Spark** (`.ui-spark*`) | `css/spark.css` | A trend belongs _inside a sentence or table cell_ — a word-sized inline microchart, the inline counterpart to `ui-delta`/`ui-num`/`ui-stat`. See [spark.md](./spark.md). |
79
+ | **Bullet graph** (`.ui-bullet*`) | `css/bullet.css` | A measure needs "inside budget? vs target?" at a glance — the canonical SLO / error-budget figure that `ui-meter` structurally cannot express. See [bullet.md](./bullet.md). |
80
+ | **Diff** (`.ui-diff*`) | `css/diff.css` | The report shows what _changed_ — code review, changelogs, version history, config diffs. Marks call out a sentence; diff calls out a line. See [diff.md](./diff.md). |
81
+ | **Code** (`.ui-code*`) | `css/code.css` | Code-as-evidence: fenced snippets with an optional gutter and add/remove/highlight line states, sharing diff's change vocabulary. On-brand syntax colours via the [Shiki theme](./code.md). See [code.md](./code.md). |
82
+ | **Sidenotes** (`.ui-sidenote`, `.ui-marginnote`) | `css/sidenote.css` | Evidence, caveats, and provenance asides that belong _beside_ the prose, Tufte-style, instead of interrupting it. See [sidenote.md](./sidenote.md). |
83
+ | **Textref** (`.ui-textref`) | `css/textref.css` | A citation should deep-link to the _exact quoted sentence_ (URL text fragments, on-brand `::target-text` paint) — the inline counterpart to the source-card layer. See [textref.md](./textref.md). |
84
+ | **Term / glossary** (`.ui-term`, `.ui-glossary`) | `css/term.css` | Jargon should explain itself inline (native popover definition) and gather into an end-of-report glossary. See [term.md](./term.md). |
85
+ | **Contents rail** (`.ui-toc*`) | `css/toc.css` | A long report needs a sticky table of contents with the in-view section highlighted; degrades to a plain anchored list with zero JS. Distinct from the in-flow `ui-report__toc` block. See [toc.md](./toc.md). |
86
+ | **Tree** (`.ui-tree*`) | `css/tree.css` | Nested structure — file trees, object graphs, nested provenance — as a depth-indented outline on native `<details>`. See [tree.md](./tree.md). |
87
+ | **Dot surfaces** (`.ui-waffle`, `.ui-activity`, `.ui-level`, `.ui-dotgauge`, `.ui-readout`, …) | _(in the core bundle)_ | A count, rate, level, or gauge wants the library's signature dot-matrix expression — waffle units, activity strips, dot gauges, readouts. See [dots.md](./dots.md). |
75
88
 
76
89
  These compose with the report-native primitives already called out in
77
90
  [Composition rules](#composition-rules): `ui-statgrid`, `ui-alert`, `ui-table`,
@@ -876,6 +889,14 @@ tooling.
876
889
  (Puppeteer ships its own). The repo's `scripts/render-pdf.mjs` is a working
877
890
  copy of this (`npm run report:pdf -- report.html`); it is a dev/example
878
891
  helper, not part of the published API — bronto does not own rendering.
892
+
893
+ **If the report renders figures from `<script type="module">`, do not load
894
+ it over `file://`** — browsers block relative module imports from `file://`
895
+ (CORS, opaque `null` origin), so the figures silently render empty in the
896
+ PDF. Serve the report over HTTP first; `render-pdf.mjs --serve` does this
897
+ (loopback server + load over `http://127.0.0.1`), waits for the report's
898
+ `data-report-ready` signal if it sets one, and logs page errors instead of
899
+ swallowing them.
879
900
  - **As a service / from another language:** run Chromium-as-a-service
880
901
  (e.g. **Gotenberg**'s `POST /forms/chromium/convert/html`, or a hosted CDP
881
902
  endpoint) and POST the HTML + the `dist/css/*` assets. A Python/Go/any host
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.5/dist/css/<leaf>.css" />
47
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.6/dist/css/<leaf>.css" />
48
48
  ```
49
49
 
50
50
  The flattened default bundle is `dist/bronto.css` (bundler shorthand
@@ -583,10 +583,10 @@ Canonical report skeleton:
583
583
  <p class="ui-eyebrow">Report</p>
584
584
  <h1 class="ui-report__title">System review</h1>
585
585
  <p class="ui-report__subtitle">Static HTML, Chromium PDF-ready.</p>
586
- <ol class="ui-report__meta">
586
+ <ul class="ui-report__meta">
587
587
  <li>2026-06-01</li>
588
588
  <li>Generated</li>
589
- </ol>
589
+ </ul>
590
590
  </header>
591
591
  <section class="ui-report__section">
592
592
  <h2 class="ui-report__section-head">Executive summary</h2>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ponchia/ui",
3
- "version": "0.6.5",
3
+ "version": "0.6.6",
4
4
  "type": "module",
5
5
  "description": "CSS-first design system for interfaces that explain themselves — works in HTML, every framework, and PDF, no component runtime. A standard component set plus an opt-in analytical & report layer (annotations, legends, connectors, data-viz, report grammar). Monochrome with one rationed accent, re-skinnable from one --accent knob. Zero runtime dependencies.",
6
6
  "keywords": [
@@ -105,6 +105,7 @@
105
105
  "check:format": "prettier --check .",
106
106
  "size:report": "node scripts/size-report.mjs",
107
107
  "report:pdf": "node scripts/render-pdf.mjs",
108
+ "release:prep": "node scripts/release-prep.mjs",
108
109
  "emit:theme": "node scripts/emit-theme.mjs",
109
110
  "emit:theme:check": "node scripts/emit-theme.mjs --check",
110
111
  "gen": "npm run prepack",
@@ -165,6 +166,7 @@
165
166
  "@builder.io/qwik": "^1.20.0",
166
167
  "@playwright/test": "1.60.0",
167
168
  "jsdom": "^29.1.1",
169
+ "pdfjs-dist": "^6.0.227",
168
170
  "prettier": "^3.8.3",
169
171
  "publint": "^0.3.21",
170
172
  "react": "^19.2.7",