@ponchia/ui 0.5.0 → 0.6.3

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 (196) hide show
  1. package/CHANGELOG.md +386 -4
  2. package/MIGRATIONS.json +14 -0
  3. package/README.md +29 -6
  4. package/annotations/index.d.ts +398 -276
  5. package/annotations/index.d.ts.map +1 -0
  6. package/annotations/index.js +350 -77
  7. package/behaviors/carousel.d.ts +28 -0
  8. package/behaviors/carousel.d.ts.map +1 -0
  9. package/behaviors/carousel.js +20 -16
  10. package/behaviors/combobox.d.ts +40 -0
  11. package/behaviors/combobox.d.ts.map +1 -0
  12. package/behaviors/combobox.js +111 -29
  13. package/behaviors/command.d.ts +41 -0
  14. package/behaviors/command.d.ts.map +1 -0
  15. package/behaviors/command.js +27 -15
  16. package/behaviors/connectors.d.ts +17 -0
  17. package/behaviors/connectors.d.ts.map +1 -0
  18. package/behaviors/connectors.js +7 -5
  19. package/behaviors/crosshair.d.ts +42 -0
  20. package/behaviors/crosshair.d.ts.map +1 -0
  21. package/behaviors/crosshair.js +23 -6
  22. package/behaviors/dialog.d.ts +20 -0
  23. package/behaviors/dialog.d.ts.map +1 -0
  24. package/behaviors/dialog.js +6 -2
  25. package/behaviors/disclosure.d.ts +10 -0
  26. package/behaviors/disclosure.d.ts.map +1 -0
  27. package/behaviors/disclosure.js +6 -2
  28. package/behaviors/dismissible.d.ts +10 -0
  29. package/behaviors/dismissible.d.ts.map +1 -0
  30. package/behaviors/dismissible.js +6 -2
  31. package/behaviors/forms.d.ts +27 -0
  32. package/behaviors/forms.d.ts.map +1 -0
  33. package/behaviors/forms.js +54 -13
  34. package/behaviors/glyph.d.ts +14 -0
  35. package/behaviors/glyph.d.ts.map +1 -0
  36. package/behaviors/glyph.js +28 -5
  37. package/behaviors/index.d.ts +31 -237
  38. package/behaviors/index.d.ts.map +1 -0
  39. package/behaviors/index.js +17 -0
  40. package/behaviors/inert.d.ts +20 -0
  41. package/behaviors/inert.d.ts.map +1 -0
  42. package/behaviors/inert.js +46 -0
  43. package/behaviors/internal.d.ts +25 -0
  44. package/behaviors/internal.d.ts.map +1 -0
  45. package/behaviors/internal.js +77 -1
  46. package/behaviors/legend.d.ts +35 -0
  47. package/behaviors/legend.d.ts.map +1 -0
  48. package/behaviors/legend.js +32 -2
  49. package/behaviors/menu.d.ts +16 -0
  50. package/behaviors/menu.d.ts.map +1 -0
  51. package/behaviors/menu.js +6 -2
  52. package/behaviors/modal.d.ts +41 -0
  53. package/behaviors/modal.d.ts.map +1 -0
  54. package/behaviors/modal.js +124 -0
  55. package/behaviors/popover.d.ts +28 -0
  56. package/behaviors/popover.d.ts.map +1 -0
  57. package/behaviors/popover.js +78 -7
  58. package/behaviors/spotlight.d.ts +17 -0
  59. package/behaviors/spotlight.d.ts.map +1 -0
  60. package/behaviors/spotlight.js +7 -5
  61. package/behaviors/table.d.ts +36 -0
  62. package/behaviors/table.d.ts.map +1 -0
  63. package/behaviors/table.js +84 -17
  64. package/behaviors/tabs.d.ts +20 -0
  65. package/behaviors/tabs.d.ts.map +1 -0
  66. package/behaviors/tabs.js +17 -14
  67. package/behaviors/theme.d.ts +54 -0
  68. package/behaviors/theme.d.ts.map +1 -0
  69. package/behaviors/theme.js +22 -3
  70. package/behaviors/toast.d.ts +49 -0
  71. package/behaviors/toast.d.ts.map +1 -0
  72. package/behaviors/toast.js +47 -3
  73. package/classes/classes.json +2527 -0
  74. package/classes/index.d.ts +134 -15
  75. package/classes/index.js +280 -80
  76. package/classes/vscode.css-custom-data.json +12 -0
  77. package/connectors/index.d.ts +201 -69
  78. package/connectors/index.d.ts.map +1 -0
  79. package/connectors/index.js +142 -25
  80. package/css/app.css +69 -13
  81. package/css/base.css +15 -10
  82. package/css/bullet.css +108 -0
  83. package/css/code.css +98 -0
  84. package/css/connectors.css +17 -0
  85. package/css/content.css +22 -3
  86. package/css/crosshair.css +7 -7
  87. package/css/dataviz.css +5 -1
  88. package/css/diff.css +153 -0
  89. package/css/disclosure.css +53 -7
  90. package/css/dots.css +94 -7
  91. package/css/feedback.css +97 -7
  92. package/css/forms.css +113 -4
  93. package/css/legend.css +16 -9
  94. package/css/marks.css +38 -8
  95. package/css/motion.css +98 -53
  96. package/css/navigation.css +7 -0
  97. package/css/overlay.css +90 -3
  98. package/css/primitives.css +158 -13
  99. package/css/report.css +73 -56
  100. package/css/sidenote.css +67 -0
  101. package/css/site.css +16 -2
  102. package/css/sources.css +43 -1
  103. package/css/spark.css +62 -0
  104. package/css/spotlight.css +1 -1
  105. package/css/table.css +9 -2
  106. package/css/term.css +110 -0
  107. package/css/textref.css +63 -0
  108. package/css/toc.css +91 -0
  109. package/css/tokens.css +49 -1
  110. package/css/tree.css +134 -0
  111. package/css/workbench.css +1 -1
  112. package/dist/bronto.css +1 -1
  113. package/dist/css/analytical.css +1 -1
  114. package/dist/css/app.css +1 -1
  115. package/dist/css/base.css +1 -1
  116. package/dist/css/bullet.css +1 -0
  117. package/dist/css/code.css +1 -0
  118. package/dist/css/connectors.css +1 -1
  119. package/dist/css/content.css +1 -1
  120. package/dist/css/crosshair.css +1 -1
  121. package/dist/css/diff.css +1 -0
  122. package/dist/css/disclosure.css +1 -1
  123. package/dist/css/dots.css +1 -1
  124. package/dist/css/feedback.css +1 -1
  125. package/dist/css/forms.css +1 -1
  126. package/dist/css/legend.css +1 -1
  127. package/dist/css/marks.css +1 -1
  128. package/dist/css/motion.css +1 -1
  129. package/dist/css/navigation.css +1 -1
  130. package/dist/css/overlay.css +1 -1
  131. package/dist/css/primitives.css +1 -1
  132. package/dist/css/report.css +1 -1
  133. package/dist/css/sidenote.css +1 -0
  134. package/dist/css/site.css +1 -1
  135. package/dist/css/sources.css +1 -1
  136. package/dist/css/spark.css +1 -0
  137. package/dist/css/spotlight.css +1 -1
  138. package/dist/css/table.css +1 -1
  139. package/dist/css/term.css +1 -0
  140. package/dist/css/textref.css +1 -0
  141. package/dist/css/toc.css +1 -0
  142. package/dist/css/tokens.css +1 -1
  143. package/dist/css/tree.css +1 -0
  144. package/dist/css/workbench.css +1 -1
  145. package/docs/adr/0003-theme-model.md +1 -1
  146. package/docs/annotations.md +133 -14
  147. package/docs/architecture.md +49 -6
  148. package/docs/bullet.md +78 -0
  149. package/docs/code.md +76 -0
  150. package/docs/contrast.md +116 -92
  151. package/docs/d2.md +196 -0
  152. package/docs/diff.md +146 -0
  153. package/docs/legends.md +23 -3
  154. package/docs/marks.md +9 -2
  155. package/docs/mermaid.md +169 -0
  156. package/docs/reference.md +201 -26
  157. package/docs/reporting.md +416 -57
  158. package/docs/sidenote.md +64 -0
  159. package/docs/sources.md +27 -0
  160. package/docs/spark.md +78 -0
  161. package/docs/stability.md +10 -2
  162. package/docs/term.md +81 -0
  163. package/docs/textref.md +78 -0
  164. package/docs/theming.md +44 -5
  165. package/docs/toc.md +83 -0
  166. package/docs/tree.md +74 -0
  167. package/docs/usage.md +354 -16
  168. package/docs/vega.md +244 -0
  169. package/docs/workbench.md +7 -1
  170. package/glyphs/glyphs.js +13 -5
  171. package/llms.txt +285 -14
  172. package/package.json +95 -17
  173. package/qwik/index.d.ts +44 -59
  174. package/qwik/index.d.ts.map +1 -0
  175. package/qwik/index.js +65 -3
  176. package/react/index.d.ts +41 -61
  177. package/react/index.d.ts.map +1 -0
  178. package/react/index.js +63 -3
  179. package/solid/index.d.ts +68 -61
  180. package/solid/index.d.ts.map +1 -0
  181. package/solid/index.js +66 -3
  182. package/tokens/d2.d.ts +38 -0
  183. package/tokens/d2.js +71 -0
  184. package/tokens/d2.json +43 -0
  185. package/tokens/index.d.ts +5 -5
  186. package/tokens/index.js +15 -1
  187. package/tokens/index.json +9 -0
  188. package/tokens/mermaid.d.ts +23 -0
  189. package/tokens/mermaid.js +181 -0
  190. package/tokens/mermaid.json +163 -0
  191. package/tokens/resolved.json +45 -1
  192. package/tokens/skins.js +3 -2
  193. package/tokens/tokens.dtcg.json +26 -0
  194. package/tokens/vega.d.ts +34 -0
  195. package/tokens/vega.js +155 -0
  196. package/tokens/vega.json +179 -0
package/CHANGELOG.md CHANGED
@@ -1,9 +1,391 @@
1
1
  # Changelog
2
2
 
3
- > **Versioning:** pre-1.0, breaking changes ship in the _minor_. Pin to the
4
- > minor — `~0.4.0` (equivalently `^0.4.0`) resolves to `>=0.4.0 <0.5.0`; a bare
5
- > `^0` / `*` wildcard does **not** protect you. See README → Versioning, and
6
- > the deprecation policy in CONTRIBUTING.md.
3
+ |> **Versioning:** pre-1.0, breaking changes ship in the _minor_. Pin to the
4
+ |> minor — `~0.4.0` (equivalently `^0.4.0`) resolves to `>=0.4.0 <0.5.0`; a bare
5
+ |> `^0` / `*` wildcard does **not** protect you. See README → Versioning, and
6
+ |> the deprecation policy in CONTRIBUTING.md.
7
+
8
+ ## 0.6.3 — 2026-06-08
9
+
10
+ Patch release to publish the WebKit release fix after the `v0.6.1` and `v0.6.2`
11
+ tag runs failed before npm publish. No public API change, no class contract
12
+ change, no `MIGRATIONS.json` entry.
13
+
14
+ The 0.6.2 test-only diagnosis was incomplete: WebKit does not reliably honor
15
+ the unprefixed `user-select: none` on the generated line-number affordances.
16
+ The actual fix is CSS-side. `css/diff.css` and `css/code.css` now include the
17
+ legacy `-webkit-user-select: none` declaration alongside the standard property,
18
+ and the built `dist/css/diff.css` / `dist/css/code.css` leaves were regenerated.
19
+
20
+ ### Fixed
21
+
22
+ - **Diff/code line numbers in WebKit** — `.ui-diff__ln`,
23
+ `.ui-diff__code::before`, and `.ui-code--numbered .ui-code__line::before`
24
+ now opt out of selection in WebKit as well as chromium/firefox.
25
+
26
+ ### Internal
27
+
28
+ - **`test/e2e/diff.spec.mjs`** — reads the CSSOM `-webkit-user-select` value
29
+ before the standard property so the assertion verifies the prefixed WebKit
30
+ path directly.
31
+
32
+ ## 0.6.2 — 2026-06-07
33
+
34
+ Release attempt: test-only WebKit e2e patch for the `0.6.1` publish blocker. The
35
+ tag was cut but the release still did not publish. The diagnosis here was
36
+ superseded by `0.6.3`, which fixes the CSS rule itself.
37
+
38
+ ### Internal
39
+
40
+ - **`test/e2e/diff.spec.mjs`** — read `getComputedStyle(el).userSelect ||
41
+ getComputedStyle(el).webkitUserSelect` for the line-number
42
+ `user-select: none` assertion, so the test passes on WebKit (where
43
+ `userSelect` is `undefined` even when the standard CSS rule is
44
+ applied) as well as chromium + firefox.
45
+
46
+ ## 0.6.1 — 2026-06-07
47
+
48
+ Dev-only patch: refreshes the SHA-pinned GitHub Actions used by CI
49
+ ([`actions/checkout`](https://github.com/actions/checkout) 6.0.2 → 6.0.3 —
50
+ SHA-256 repository init fix, expanded SHA regex; and
51
+ [`github/codeql-action`](https://github.com/github/codeql-action) 4.36.0 →
52
+ 4.36.2 — CLI version caching, exponential-backoff SARIF polling, CodeQL
53
+ bundle 2.25.6) plus a small DevDeps bump ([react](https://github.com/facebook/react)
54
+ /[react-dom](https://github.com/facebook/react) 19.2.6 → 19.2.7 — Server
55
+ Components `FormData` fix; [stylelint](https://github.com/stylelint/stylelint)
56
+ 17.12.0 → 17.13.0). No public API, no published CSS/JS, no `MIGRATIONS.json`
57
+ entry. All bumps were authored by Dependabot and landed through #109 + #110.
58
+
59
+ ### Internal
60
+
61
+ - Bump the **actions** Dependabot group: `actions/checkout` 6.0.2 → 6.0.3 and
62
+ `github/codeql-action` 4.36.0 → 4.36.2 (CI only, SHA-pinned in
63
+ `.github/workflows/*.yml`).
64
+ - Bump the **dev** Dependabot group: `react`/`react-dom` 19.2.6 → 19.2.7 and
65
+ `stylelint` 17.12.0 → 17.13.0 (devDependencies only — the package itself
66
+ ships zero runtime deps).
67
+
68
+ ## 0.6.0 — 2026-06-03
69
+
70
+ Accumulates the post-0.5.0 work: a multi-agent audit pass (accessibility
71
+ hardening, a behavior/binding scope-safety fix, codegen/gate tightening) plus a
72
+ **breaking** charting realignment. The local static-bar renderer
73
+ (`.ui-chart*`) is **removed** — a chart needs scales + data binding, which the
74
+ analytical layer refuses to own. In its place, bronto becomes a themeable target
75
+ for **Vega-Lite** (`@ponchia/ui/vega`), the same tokens-as-data path as Mermaid
76
+ and D2. The data-viz **palette** (`--chart-*`, `tokens/charts.json`) and the
77
+ **legend** layer are unchanged. Pin `~0.5` → re-pin `~0.6`; see
78
+ [`MIGRATIONS.json`](./MIGRATIONS.json) (`0.5`→`0.6`).
79
+
80
+ ### Added
81
+
82
+ - **`@ponchia/ui/vega`** (+ `vega.json`) — an on-brand Vega-Lite / Vega
83
+ [`config`](https://vega.github.io/vega-lite/docs/config.html) resolved per
84
+ theme (the idiomatic `vega-themes` shape): monochrome chrome + one rationed
85
+ accent, `range.category/ordinal/ramp/heatmap/diverging` from the CVD-safe
86
+ data-viz palette. `brontoVegaConfig(theme)`. Resolved hex (Vega bakes colours
87
+ into SVG/canvas, can't read `var()`); gated structurally **and** by a headless
88
+ render-probe that asserts the colours land on a rendered chart. Vega is the
89
+ consumer's renderer — config only, not a dependency. See `docs/vega.md`.
90
+ - **`ui-delta`** — a standalone trend/change indicator (core primitive): an
91
+ arrow glyph (the non-colour channel) plus the figure, with
92
+ `--up`/`--down`/`--flat`, and `--invert` to swap only the tone when "up" is
93
+ the bad direction (latency, error rate, cost). `ui.delta({ dir, invert })`.
94
+ - **`ui-compare`** — a fluid side-by-side / before-after layout for the report
95
+ layer (`css/report.css`): `__col`, `__head`, and `--2up`.
96
+ `ui.compare({ cols })`.
97
+ - **`@ponchia/ui/classes.json`** — the class vocabulary as language-neutral
98
+ data (`groups`/`classes`/`states`/`customProperties`), so a non-JS/non-TS
99
+ host or an external linter can validate emitted markup without executing the
100
+ ESM `cls` map or parsing the `.d.ts`. Generated from `cls`; drift-checked and
101
+ its `states`/`customProperties` gated against the stylesheet.
102
+ - **`tokens/resolved.json` `scale` block** — the resolved non-colour scales
103
+ (spacing/radius/type/z/motion, `var()` chains flattened), completing the
104
+ token contract for non-CSS hosts (previously colour-only).
105
+ - **`--display-weight` / `--display-weight-strong`** (700 / 800) — the weight of
106
+ the Doto dot-matrix display face, now a token. Themes/skins can re-tune how
107
+ heavy display text renders in one place.
108
+ - On-brand **Mermaid** (`@ponchia/ui/mermaid`, `mermaid.json`) and **D2**
109
+ (`@ponchia/ui/d2`, `d2.json`) theme maps — resolved per-theme palettes
110
+ projected from the same tokens, gated. Diagrams stay the consumer's renderer;
111
+ these are config only.
112
+ - Annotation geometry options: `connectorElbow({ mid })` (turn position along the
113
+ dominant axis), `notePlacement({ inset })` (reserve the title stroke-halo so a
114
+ placement that "fits" doesn't clip), and a `spread` half-angle on both
115
+ `connectorEndArrow` and the shared `arrowHead` kernel.
116
+ - **`brontoVegaAccent(theme)` / `brontoVegaNeutral(theme)`** (`@ponchia/ui/vega`)
117
+ — the exact per-theme hexes for `range.category`'s accent (series 1) and
118
+ neutral (last series), so spending the accent on one emphasised mark needs no
119
+ palette-index reverse-engineering.
120
+ - **`--on-accent`** token — the readable ink for a label on **any accent fill**
121
+ (button, badge, themed chart bar, a Vega/D2 node). Resolves to `--button-text`
122
+ (white on the light accent, black on the dark) and is gated ≥ 4.5:1 in
123
+ `docs/contrast.md`. Use it instead of `--accent-text`, which is the inverse
124
+ (accent-coloured text for a *neutral* background, ~1.3:1 on an accent fill).
125
+ - **`.ui-src`** standalone trust pill (`cls.src`, `css/sources.css`) — wears a
126
+ `.ui-src--*` tone (verified / reviewed / generated / unverified / stale /
127
+ conflict) on its own, for a bare trust label outside a citation or source card.
128
+ Previously the `.ui-src--*` modifiers only painted a `--src-tone` with no
129
+ standalone host, so a lone pill validated against `classes.json` yet rendered
130
+ nothing.
131
+
132
+ ### Removed
133
+
134
+ - **BREAKING: the local static bar-chart renderer (`.ui-chart`, `.ui-chart__plot`,
135
+ `__bar`, `__label`, `__track`, `__fill`, `__fallback`, `__caption`).** A chart
136
+ needs scales and data binding — out of scope for a CSS-first analytical layer
137
+ (ADR-0002). Replace with a Vega-Lite chart themed via `@ponchia/ui/vega`, or a
138
+ hand-authored token-themed inline `<svg>`, inside a `.ui-report__figure` with a
139
+ `.ui-report__caption` and a `.ui-legend` key. The `--chart-value` inline knob
140
+ is gone; the `--chart-color`/`--chart-pattern` swatch knobs remain (legend).
141
+ See `MIGRATIONS.json` (`0.5`→`0.6`) and `docs/vega.md`.
142
+
143
+ ### Changed
144
+
145
+ - **Annotation connectors are crisper.** `connectorEndArrow` now defaults to a
146
+ sharper head (half-angle 0.32 ≈ 37°, size 8 vs the former blunt 0.45 / 7).
147
+ Author-facing geometry only; the `arrowHead` kernel default is unchanged, so
148
+ node-connector arrowheads don't move.
149
+
150
+ ### Accessibility
151
+
152
+ - **Coarse-pointer tap-target floors extended to navigation.** The 2.9 rem
153
+ touch floor (already on primitives/forms/feedback) now also covers
154
+ `.ui-sitenav a`, `.ui-app-nav a`, `.ui-sitemenu > summary`, and
155
+ `.ui-themetoggle__button` under `@media (pointer: coarse)` — the primary nav
156
+ affordances were below the 44 px target on touch.
157
+ - **App shell uses dynamic viewport units.** `100vh` → `100dvh` (shell/body) and
158
+ the scrolling rail → `100svh`, so the rail and its pinned account/footer no
159
+ longer fall under the mobile URL bar.
160
+ - **Forced-colors status dots stay distinct.** `.ui-dot--success/--warning/--danger/--info`
161
+ and `.ui-dotmatrix__cell--hot/--accent` now map to distinct system colors
162
+ under Windows High Contrast instead of collapsing to one — the only signal
163
+ these carry is colour.
164
+ - **Keyboard affordance parity.** `.ui-menu__item:focus-visible` gets the same
165
+ row highlight as hover; the segmented control's focus ring is now inset so the
166
+ container's `overflow: hidden` no longer clips it.
167
+ - **Reduced-motion skeleton.** `.ui-skeleton` flattens to a solid placeholder
168
+ under `prefers-reduced-motion` instead of freezing mid-shimmer.
169
+
170
+ ### Fixed
171
+
172
+ - **Published-type drift (code-quality audit).** `ui.meter({ tone: 'info' })` and
173
+ `ui.bracketNote({ tone: 'success' })` emit real classes at runtime, but the
174
+ generated `.d.ts` tone unions (hand-mirrored in `gen-dts.mjs`) omitted them, so
175
+ a TS consumer got a spurious type error for a value that renders. The unions
176
+ now match the factory; a new `check:recipe-types` gate cross-checks every
177
+ factory's string-literal options against its `*Opts` union so this whole class
178
+ of drift fails CI.
179
+ - **Component-library audit (16-agent dogfood pass) — the validates-but-no-ops
180
+ cluster.** A whole-surface audit found the meter-style trap (a class/token that
181
+ validates and paints but silently does nothing without an undocumented
182
+ precondition) recurring across components. Fixed:
183
+ - `aria-disabled="true"` on `.ui-button` / `.ui-link` now sets
184
+ `pointer-events: none` — it looked dead but a real `<a>` still navigated.
185
+ - Disabled affordance reaches the controls that wrap a native input
186
+ (`.ui-switch` / `.ui-check` / `.ui-segmented__option` via `:has(input:disabled)`,
187
+ plus `.ui-range` / `.ui-file`) — they previously looked operable and their
188
+ label kept `cursor: pointer`.
189
+ - Bare `[aria-current]` selectors (`.ui-sitenav`, `.ui-breadcrumb__item`) now
190
+ scope `:not([aria-current='false'])`, so a correctly-authored
191
+ `aria-current="false"` link is no longer styled as current.
192
+ - The active-tab forced-colors re-assert moved from `base.css` to
193
+ `disclosure.css` (after the default rule) — an earlier bundle leaf let the
194
+ accent default override it, so the selected tab lost its only HC cue.
195
+ - `.ui-meter__fill` / `.ui-progress__bar` get a system colour under
196
+ `forced-colors`, so the measured proportion stays visible.
197
+ - `.ui-search` gains a 2px keyboard focus ring to match every sibling input
198
+ (it had only a 1px border-colour shift).
199
+ - `.ui-prose` gets `overflow-wrap: break-word` — long tokens in
200
+ machine-generated Markdown forced horizontal page scroll.
201
+ - `.ui-mark--draw` is scoped to fill styles (`:not(--underline, --box, --strike)`)
202
+ so it no longer looks applied while doing nothing.
203
+ - `.ui-cq` hardcodes its container-name (the `@container bronto` collapse
204
+ queries hardcode it, so a `--cq-name` override silently killed the collapse).
205
+ - `initPopover()` seeds resting ARIA (`aria-haspopup`, `aria-controls`,
206
+ `aria-expanded`) and syncs `aria-expanded` when the UA closes a native
207
+ popover; `toast()` validates `tone` (an unknown string rendered an unstyled
208
+ neutral toast) and warns; the combobox listbox gets an accessible name.
209
+ - `.ui-error-summary__title` uses the legible sans, not the low-legibility Doto
210
+ display face. `.ui-input` / `.ui-search` autofill stays on-theme.
211
+ - `.ui-reveal` hidden state is gated on `scripting: enabled` (genuinely degrades
212
+ visible with no JS; the prior comment lied) — and `ui-scroll-reveal` is the
213
+ documented zero-JS path.
214
+ - Parity modifiers added: `.ui-meter--info`, `.ui-bracket-note--success`.
215
+ - Responsive/mobile hardening across the framework: `rem`-rooted type for WCAG
216
+ 1.4.4, coarse-pointer tap-target floors, combobox/tour-note viewport clamps,
217
+ and `@media (hover)` gating — with a new responsive e2e sweep.
218
+ - **Faint numbers on stat cards.** `.ui-stat__value` / `.ui-app-metric__value`
219
+ (and the report cover/section titles, rail brand, panel titles, `.ui-display`,
220
+ `.ui-quote`) set the Doto display face but no weight, so they rendered at the
221
+ thinnest cut (400). They now apply `--display-weight(-strong)` — visibly bolder
222
+ and more legible, on screen and in print.
223
+ - **Painted data surfaces dropped in the PDF.** Headless-Chromium print drops
224
+ backgrounds by default, silently blanking the data-bearing fills. Dot-matrix
225
+ cells, the segmented meter, status dots, masked glyphs, highlight marks,
226
+ connector lines, and progress/meter fills now carry `print-color-adjust: exact`
227
+ so they survive the A4 print/PDF that the report kit targets.
228
+ - **Dark-theme cards/tables printed dark-on-white.** The dark→ink token remap was
229
+ scoped to `.ui-report`; it is now lifted to the print `:root` (in the exempt
230
+ token-definition file), so a bare `.ui-card` / `.ui-statgrid` / `.ui-table` —
231
+ the markup an external LLM emits — also prints legibly.
232
+ - Inline `ui-citation` no longer dumps its full URL mid-sentence when printed
233
+ (the reference list carries the URL); `ui-legend--with-values` values are
234
+ right-aligned for a clean tabular column.
235
+ - **Annotation elbow connector was a 45° chamfer, not a dogleg.**
236
+ `connectorElbow` turned by `min(|dx|,|dy|)`, drawing a diagonal stub the
237
+ `stroke-linejoin` bevel never matched. It now delegates to the connectors
238
+ geometry kernel's right-angle `elbowPath` (H/V/H), so an annotation leader and
239
+ a node connector draw the same elbow.
240
+ - **Scoped behaviors no longer hijack the whole document on a null root.**
241
+ `init*({ root })` with an explicitly-provided-but-unready root (a framework
242
+ ref still `null` at mount, a conditional that hasn't rendered) now no-ops
243
+ instead of silently widening to document-wide delegation. The react/solid/qwik
244
+ bindings emit `root: null` for the not-ready case so the distinction survives
245
+ the boundary; passing no `root` still delegates from `document` exactly as
246
+ before. Affects every delegated behavior (dialog, menu, combobox, …).
247
+ - **`--report-width` / `--report-padding-block` are now declared defaults** on
248
+ `.ui-report` — they were read with inline fallbacks but never declared, so the
249
+ override surface was undiscoverable and `--report-measure` looked like the
250
+ width knob when it isn't.
251
+ - Carousel's IntersectionObserver is now set up and torn down in lockstep with
252
+ its event binding, removing a one-tick window where a re-init left two
253
+ observers on the same slides.
254
+ - **`ui-meter` / `ui-progress` fill painted a 0×0 box.** `.ui-meter__fill` and
255
+ `.ui-progress__bar` set `block-size`/`inline-size` but no `display`, so on the
256
+ documented `<span>` fill (an inline box ignores width/height) the bar rendered
257
+ empty — a "validates-but-renders-nothing" trap the registry and docs both
258
+ hid. They are now `display: block`. Found by a second multi-agent dogfood
259
+ pass; guarded going forward by a render-geometry e2e (below).
260
+
261
+ ### Documentation
262
+
263
+ - LLM-authored static reports: a prominent CSS-loading note (bundler vs
264
+ `node_modules` vs CDN) and a copy-pasteable CDN report in
265
+ `docs/reporting.md`; clarified that `dist/bronto.css` does **not** include the
266
+ opt-in report/chart/legend/annotation layers; number/date formatting
267
+ guidance; and a standalone, no-build report reference
268
+ (`demo/report-standalone.html`).
269
+ - Resolved the `is-*` self-contradiction: the framework's own
270
+ `is-num`/`is-pos`/`is-neg`/`is-key`/`is-open` state hooks are valid even
271
+ though they deliberately live outside `cls` (documented in
272
+ `docs/reference.md` and `classes.json`).
273
+ - Clarified two standing contracts in `docs/architecture.md`: `css/analytical.css`
274
+ is the roll-up of exactly the seven figure leaves (annotations, legend, marks,
275
+ connectors, spotlight, crosshair, selection) — `sources`/`state`/`generated`/
276
+ `workbench`/`command` are adjacent leaves imported individually — and the root
277
+ `.` export is CSS-only (no runtime JS at the root). Pre-1.0 stability/pinning
278
+ spelled out in `docs/stability.md`. `docs/workbench.md` notes that
279
+ `.ui-selectionbar` is unrelated to the `.ui-sel--*` selection-emphasis classes.
280
+ - Honest JSDoc limits: combobox/command read options from the DOM at init
281
+ (re-run after replacing them); popover restores focus on Escape but not on
282
+ outside-click; the table sorter is locale-naive display-text; mask-mode glyphs
283
+ are single-tone.
284
+ - **Foreign-renderer recipes hardened after a multi-agent dogfooding pass**
285
+ (build five real reports across the whole stack, review from every POV). The
286
+ Vega CDN recipe now pins the `/build/*.min.js` UMD bundles and `renderer:'svg'`
287
+ (a bare `cdn.jsdelivr.net/npm/vega@6` tag has no `window.vega`, so the previous
288
+ recipe rendered nothing); the file://-portable path (inline the config — an
289
+ imported/fetched config is CORS-blocked from disk) is now explicit. New
290
+ `docs/reporting.md` recipes: "Theming a live report" (the theme-toggle/re-embed
291
+ foot-guns — clear the host, container-width-while-hidden, Mermaid source vs
292
+ output), live charts are `ui-screen-only` while the table prints (a kept live
293
+ chart bakes the on-screen theme), `ui-meter`/`ui-quote` markup, and the
294
+ sequential/diverging frozen-figure ramp. `docs/d2.md` gains a frozen
295
+ inline-`<svg>`-from-slots recipe and on-accent-ink guidance; `docs/vega.md`
296
+ documents the theme-inverting ramp and the OKLCH-vs-d3 gradient-key drift.
297
+ - `docs/annotations.md` states the rule in both directions: a data annotation
298
+ must stay readable (not `aria-hidden`), a decorative one must be hidden.
299
+ - **A second dogfood pass closed the foreign-renderer/contract gaps it found.**
300
+ `docs/sources.md` + `llms.txt` now document the standalone `.ui-src` trust
301
+ pill and state that a `ui-src--*` tone class **needs a host** (a bare
302
+ `<span class="ui-src--verified">` validates but renders nothing), and name the
303
+ source-card body part as `__excerpt` (not `__detail`). `docs/mermaid.md`:
304
+ `gantt`/`timeline` are **not** covered by the base `themeVariables` (they
305
+ render with Mermaid's own defaults — prefer the native `ui-timeline` for a
306
+ report). `docs/mermaid.md` + `docs/d2.md` gain the same `file://` CORS caveat
307
+ Vega carries (inline the map or pre-render). `docs/vega.md`: select the themed
308
+ ramp with `scale: { range: 'heatmap' }` — **not** `scheme:`, which throws — and
309
+ the accent/neutral series map to `--chart-1` / `--chart-8`, so a legend keys
310
+ them with `ui-legend__swatch--1`/`--8` (`docs/legends.md`). `docs/reporting.md`:
311
+ the live-theme recipe now `finalize()`s the prior Vega view before re-embed
312
+ (was leaking a view per toggle), and notes `ui-meter --value` clamps at 100
313
+ (put an over-target figure in the written label). `docs/marks.md`: `ui-mark`
314
+ is a behind-text highlight (contrast-safe; never needs `--on-accent`).
315
+
316
+ ### Internal
317
+
318
+ - **New `check:versions` gate** — every `@ponchia/ui@X.Y.Z` literal in a shipped
319
+ doc (`llms.txt`, `docs/reporting.md`, …) must equal `package.json`, so a stale
320
+ CDN pin can't ship to LLM/copy-paste consumers on the next bump.
321
+ - **Dev-dependency Vega bumped to the v6 stack** — the render-probe now runs on
322
+ `vega@^6.2.0` + `vega-lite@^6.4.3` (Vega-Lite 6 peers Vega 6; a Vega-Lite-6 ÷
323
+ Vega-5 mix is incoherent). The theme `config` is version-independent resolved
324
+ hex, so the artifacts and the probe assertions are unchanged; the documented
325
+ CDN recipe is re-pinned to the matching majors (`vega@6.2.0` / `vega-lite@6.4.3`
326
+ / `vega-embed@7.1.0`, all still shipping a UMD `/build/*.min.js`). Vega remains
327
+ the consumer's renderer, not a runtime dependency.
328
+ - **New `check:doc-recipes` gate** — a `<script src>` CDN recipe in a shipped doc
329
+ must pin a jsDelivr `/build/*.min.js` UMD bundle, never a bare
330
+ `cdn.jsdelivr.net/npm/<pkg>@N` redirect (which serves a module bundle with no
331
+ global and renders nothing). Docs are otherwise an untested surface; this is
332
+ the structural guard that closes the broken-recipe class the dogfood pass
333
+ found. `<link href>` CSS and prose mentions are exempt.
334
+ - **`classes.json` `customProperties` expanded** to cover the load-bearing,
335
+ no-op-without-it knobs the audit found undocumented: the **required**
336
+ `--icon-mask` (a bare `.ui-icon` paints a solid square without it) and
337
+ `--ui-vt-name` (`.ui-vt` is inert without it), plus `--icon-size`. The
338
+ `states` manifest comment now explicitly names the runtime-managed hooks it
339
+ deliberately excludes (`is-leaving`/`is-visible`/`is-in`/`is-on`) so the
340
+ omission reads as intentional, not a gap. `--on-accent` is annotated at its
341
+ token source as a read-only export for foreign renderers (in-DOM ink is
342
+ `--button-text`). `contrast.md` now prints APCA `Lc` to one decimal so an
343
+ advisory shortfall (e.g. `Lc 44.9`) no longer rounds to a passing-looking `45`.
344
+ - Raw bundle budget 81 → 82 kB for the component-audit accessibility/state
345
+ blocks (gzip held ~14.1 kB — the additions are repetitive media-query and
346
+ `:has()`/`:not()` rules that compress well).
347
+ - **Code-quality audit (16-agent) — two new gates + targeted dedup, no churn.**
348
+ A code-health pass (complexity / duplication / AI-slop / missing-best-practice)
349
+ that deliberately left working, gate-protected code alone. Added:
350
+ `check:recipe-types` (factory↔`.d.ts` option parity, above) and `check:chain`
351
+ (every `check:*` script is wired into the aggregate `check` chain — closes the
352
+ silent-coverage-drop class; it would have caught a forgotten gate). Reconciled
353
+ a latent bug — `clamp()` had silently diverged between `connectors` and
354
+ `annotations`; the two now share one scalar/geometry kernel (the guarded form).
355
+ Dedup that removed real duplication: a shared `collectHosts()` /
356
+ `scrollIntoViewSafe()` / `wrapIndex()` in `behaviors/internal.js` (~9 behaviors),
357
+ a `freshnessErrors()` helper reused by 7 drift gates, the shared `CSS_COLOR`
358
+ regex across the 3 foreign-renderer gates, `check-report`'s opt-in list as a
359
+ loop, `check-pack`'s shipped-docs derived from `pkg.files`, and a looser
360
+ `check-classes` recipe-scrape. README hero de-densified; `srcTone` matched to
361
+ `stateTone`'s idiom; the intentional badge accent-mix (45% vs 40%) documented.
362
+ - **`check:dist` now asserts source-coverage** — every `css/*.css` leaf must be
363
+ bundled, an opt-in `EXTRA_LEAVES` entry, or a roll-up; an orphaned leaf that
364
+ would ship nothing now fails loudly (the inverse of the existing stale-dist
365
+ guard).
366
+ - **`check:dts-emit` now compares `.d.ts.map`** mapping data (volatile `sources`
367
+ path normalized), closing a drift hole the code comment had acknowledged.
368
+ - DTCG export types `--display-weight*` as the spec `fontWeight` type (was
369
+ `number`). Corrected stale `check-tokens.mjs` doc references (the real gate is
370
+ `check:fresh`).
371
+ - Tests: binding hook-surface parity is now **derived** from the modules (the old
372
+ hard-coded list silently omitted the five analytical hooks); a new
373
+ `analytical-boundary` test makes the "no scales/state/fetch/global-hotkey"
374
+ contract executable; a new behavior test pins the null-root no-op.
375
+ - Removed four dead keyframes (`scan`/`growBar`/`drawLine`/`pulseNode`) from
376
+ `motion.css`. Raw bundle budget 80 → 81 kB for the accessibility blocks (gzip
377
+ held ~14.0 kB).
378
+ - **`classes.json` `--value` retargeted** to `.ui-meter__fill, .ui-progress__bar`
379
+ (was the `.ui-meter, .ui-progress` track parent) — the custom property is read
380
+ on the fill child, so the machine-readable manifest now matches where an author
381
+ actually sets it.
382
+ - **New render-geometry e2e** (`test/e2e/render-geometry.spec.mjs`) — launches a
383
+ browser at the demo's real report primitives and asserts the `.ui-meter__fill`
384
+ / `.ui-progress__bar` fills and the standalone `.ui-src` pill paint a non-zero
385
+ box (via `getBoundingClientRect`, not the inline-box-lying
386
+ `getComputedStyle().inlineSize`). Closes the validates-but-renders-nothing
387
+ category that hid the meter regression. The demo gains a standalone `.ui-src`
388
+ pill row to exercise it.
7
389
 
8
390
  ## 0.5.0 — 2026-06-02
9
391
 
package/MIGRATIONS.json CHANGED
@@ -87,6 +87,20 @@
87
87
  }
88
88
  ],
89
89
  "codemod": "rg -l 'ui-chart__legend|ui-chart__swatch' then s/ui-chart__swatch/ui-legend__swatch/g and rework the ul.ui-chart__legend wrapper into ul.ui-legend with li.ui-legend__item rows. See docs/legends.md."
90
+ },
91
+ {
92
+ "from": "0.5",
93
+ "to": "0.6",
94
+ "summary": "Charting realignment. The local static bar-chart renderer (.ui-chart*) is removed — a chart needs scales + data binding, out of scope for the analytical layer. bronto is now a themeable target for Vega-Lite (@ponchia/ui/vega), the same tokens-as-data path as Mermaid/D2. The --chart-* data-viz palette, tokens/charts.json, and the .ui-legend layer are unchanged.",
95
+ "safe": [],
96
+ "manual": [
97
+ {
98
+ "old": "ui-chart / ui-chart__plot / ui-chart__bar / ui-chart__label / ui-chart__track / ui-chart__fill / ui-chart__fallback / ui-chart__caption",
99
+ "new": "a Vega-Lite chart themed with @ponchia/ui/vega, or a token-themed inline <svg>",
100
+ "note": "No 1:1 class mapping — the renderer is removed. For a real chart: import '@ponchia/ui/vega', pass brontoVegaConfig(theme) to vega-embed, and place the result in a <figure class=\"ui-report__figure\"> with a <figcaption class=\"ui-report__caption\"> and a <ul class=\"ui-legend\"> key (see docs/vega.md). For a frozen/print chart: hand-author an inline <svg> using the --chart-N palette tokens for fills. The --chart-value inline knob is gone; --chart-color/--chart-pattern remain on .ui-legend__swatch."
101
+ }
102
+ ],
103
+ "codemod": "No codemod — the .ui-chart* renderer has no replacement class. rg -l 'ui-chart\\\\b|ui-chart__' to find call sites, then rebuild each as a Vega-Lite chart (@ponchia/ui/vega) or a token-themed inline <svg>. See docs/vega.md."
90
104
  }
91
105
  ]
92
106
  }
package/README.md CHANGED
@@ -8,7 +8,19 @@
8
8
  [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/Ponchia/bronto-ui/badge)](https://scorecard.dev/viewer/?uri=github.com/Ponchia/bronto-ui)
9
9
  [![license: MIT](https://img.shields.io/badge/license-MIT-blue)](https://github.com/Ponchia/bronto-ui/blob/main/LICENSE)
10
10
 
11
- **A CSS-first design system for interfaces that explain themselves.** Works in plain HTML, every modern framework, and print/PDF — there's no component runtime to adopt. The look is a deliberate stance: a neutral monochrome canvas with **one _rationed_ accent** (colour _signals_, it never decorates), dot-matrix display type and hairline borders, re-skinnable from a single `--accent` knob (opt-in amber-CRT · phosphor-green · e-ink colorways). And beyond the standard component set it ships an opt-in **analytical & report layer** — SVG annotations, legends, leader-line connectors, a guided-focus spotlight, text marks, a colourblind-safe data-viz palette and a static/PDF report grammar — for dashboards and LLM-authored reports. Zero runtime dependencies; re-brand the whole thing with one CSS variable.
11
+ **A CSS-first design system for interfaces that explain themselves.** It works in
12
+ plain HTML, every modern framework, and print/PDF, with no component runtime to
13
+ adopt and zero runtime dependencies.
14
+
15
+ The look is a deliberate stance: a neutral monochrome canvas with one rationed
16
+ accent (colour signals, it never decorates), dot-matrix display type, and
17
+ hairline borders — all re-skinnable from a single `--accent` knob (opt-in
18
+ amber-CRT, phosphor-green, and e-ink colorways).
19
+
20
+ Beyond the standard component set it ships an opt-in analytical & report layer —
21
+ SVG annotations, legends, leader-line connectors, a guided-focus spotlight, text
22
+ marks, a colourblind-safe data-viz palette, and a static/PDF report grammar — for
23
+ dashboards and LLM-authored reports.
12
24
 
13
25
  ### [Live demo →](https://ponchia.github.io/bronto-ui/) &nbsp;·&nbsp; [Theme playground →](https://ponchia.github.io/bronto-ui/demo/theme-playground.html)
14
26
 
@@ -18,9 +30,18 @@ The demo is the kitchen sink — every component, light/dark, RTL, live theming.
18
30
 
19
31
  ## What it is
20
32
 
21
- `@ponchia/ui` ships its design as **CSS**, not components. You drop in one stylesheet and style with semantic `ui-*` classes; an optional thin layer of typed class-name recipes and SSR-safe vanilla behaviors sits on top for the few things that genuinely need JS (theme persistence, dialogs, toasts, disclosure). The guiding principle is **color is rationed, structure carries meaning** — layout, type weight and the hairline do the work before a hue does, and the accent is a spotlight, not a paint bucket. Because everything lives in a single `@layer bronto`, your own un-layered CSS overrides the framework with no specificity fight and no `!important`.
33
+ `@ponchia/ui` ships its design as CSS, not components. You drop in one stylesheet
34
+ and style with semantic `ui-*` classes; an optional thin layer of typed
35
+ class-name recipes and SSR-safe vanilla behaviors sits on top for the few things
36
+ that genuinely need JS (theme persistence, dialogs, toasts, disclosure).
22
37
 
23
- It ships a complete, accessible **standard component set** — but that's not where it competes. Its differentiator is an opt-in **analytical & communication layer** for interfaces that make complex work legible: annotations, legends, connectors, marks, a guided-focus spotlight, lifecycle/system-state and source-provenance vocabularies, and a static/PDF report grammar. Each owns only its visual grammar and pure geometry — no chart engine, no state, no hit-testing. See **[docs/frontier-primitives.md](https://github.com/Ponchia/bronto-ui/blob/main/docs/frontier-primitives.md)** for the thesis.
38
+ The guiding principle is that **colour is rationed and structure carries
39
+ meaning** — layout, type weight, and the hairline do the work before a hue does,
40
+ and the accent is a spotlight, not a paint bucket. Because everything lives in a
41
+ single `@layer bronto`, your own un-layered CSS overrides the framework with no
42
+ specificity fight and no `!important`.
43
+
44
+ It ships a complete, accessible **standard component set**, but that's not where it competes — its differentiator is the opt-in **analytical & communication layer** sketched above. The line that holds it together: each primitive owns only its visual grammar and pure geometry — no chart engine, no state, no hit-testing. See **[docs/frontier-primitives.md](https://github.com/Ponchia/bronto-ui/blob/main/docs/frontier-primitives.md)** for the thesis.
24
45
 
25
46
  ## Install
26
47
 
@@ -36,7 +57,7 @@ Or drop it in with no build step, straight from a CDN:
36
57
 
37
58
  ## Quick start
38
59
 
39
- **1. Load the CSS.** One flattened, minified bundle — the whole framework, one request (~76 kB raw / ~13 kB gzip):
60
+ **1. Load the CSS.** One flattened, minified bundle — the whole standard component set, one request (~76 kB raw / ~13 kB gzip):
40
61
 
41
62
  ```css
42
63
  @import '@ponchia/ui'; /* via a bundler */
@@ -49,6 +70,8 @@ Or drop it in with no build step, straight from a CDN:
49
70
 
50
71
  > Prefer source leaves through a bundler? Use `@import '@ponchia/ui/css'` (a thin `@import` fan-out) instead. Both resolve the Doto `@font-face` with relative URLs, so there's no `/fonts` path assumption.
51
72
 
73
+ > The bundle is the standard component set. The opt-in analytical & report layers — `report.css`, `dataviz.css`, `annotations.css`, `legend.css`, and the rest — are **not** in `bronto.css`; link each one you need from `dist/css/`. For LLM-authored static reports see [docs/reporting.md](docs/reporting.md).
74
+
52
75
  **2. Write markup with `ui-*` classes** (primary is the default button; modifiers are opt-in):
53
76
 
54
77
  ```html
@@ -168,7 +191,7 @@ Recent-evergreen, by design. The framework targets the modern web platform — c
168
191
 
169
192
  ## Versioning
170
193
 
171
- Pre-1.0 and deliberately so. **Until `1.0.0`, breaking changes ship in the _minor_** (`0.x.0`); patches (`0.x.y`) are always non-breaking. Pin with the patch range — at `0.x`, `~0.5.0` (and equivalently `^0.5.0`) resolves to `>=0.5.0 <0.6.0`, giving you safe patches while holding back the next breaking minor. Every breaking change is called out under a **BREAKING** heading in the **[CHANGELOG](https://github.com/Ponchia/bronto-ui/blob/main/CHANGELOG.md)** with a migration note.
194
+ Pre-1.0 and deliberately so. **Until `1.0.0`, breaking changes ship in the _minor_** (`0.x.0`); patches (`0.x.y`) are always non-breaking. Pin with the patch range — at `0.x`, `~0.6.0` (and equivalently `^0.6.0`) resolves to `>=0.6.0 <0.7.0`, giving you safe patches while holding back the next breaking minor. Every breaking change is called out under a **BREAKING** heading in the **[CHANGELOG](https://github.com/Ponchia/bronto-ui/blob/main/CHANGELOG.md)** with a migration note.
172
195
 
173
196
  Contractual (changes are breaking): token **names** and documented token roles, `.ui-*` class and recipe names, `data-bronto-*` attributes, exported behavior/glyph/binding function names and each behavior's cleanup contract. Not contractual (may change any release): exact token **values** and generated colour math outputs (visual tuning) unless a doc explicitly says the value is stable, plus internal leaf-file / `@layer` boundaries. See **[docs/stability.md](https://github.com/Ponchia/bronto-ui/blob/main/docs/stability.md)** for the full public-surface matrix.
174
197
 
@@ -178,7 +201,7 @@ Release candidates publish to the `next` dist-tag, never to `latest` — opt in
178
201
 
179
202
  - **[Live demo](https://ponchia.github.io/bronto-ui/)** · **[Theme playground](https://ponchia.github.io/bronto-ui/demo/theme-playground.html)**
180
203
  - **[Class reference](https://github.com/Ponchia/bronto-ui/blob/main/docs/reference.md)** · **[Usage guide](https://github.com/Ponchia/bronto-ui/blob/main/docs/usage.md)** · **[Theming](https://github.com/Ponchia/bronto-ui/blob/main/docs/theming.md)** · **[Contrast](https://github.com/Ponchia/bronto-ui/blob/main/docs/contrast.md)** · **[Color system (ADR-0001)](https://github.com/Ponchia/bronto-ui/blob/main/docs/adr/0001-color-system.md)** · **[Scope & 2026 baseline (ADR-0002)](https://github.com/Ponchia/bronto-ui/blob/main/docs/adr/0002-scope-and-2026-baseline.md)**
181
- - **[CHANGELOG](https://github.com/Ponchia/bronto-ui/blob/main/CHANGELOG.md)** · **[Roadmap](https://github.com/Ponchia/bronto-ui/blob/main/ROADMAP.md)** · **[Contributing](https://github.com/Ponchia/bronto-ui/blob/main/CONTRIBUTING.md)**
204
+ - **[CHANGELOG](https://github.com/Ponchia/bronto-ui/blob/main/CHANGELOG.md)** · **[Roadmap](https://github.com/Ponchia/bronto-ui/blob/main/ROADMAP.md)** · **[Contributing](https://github.com/Ponchia/bronto-ui/blob/main/CONTRIBUTING.md)** · **[Repository layout](https://github.com/Ponchia/bronto-ui/blob/main/docs/architecture.md#repository-layout)**
182
205
 
183
206
  ## License
184
207