@aceshooting/lyra-ui 10.0.1 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/CHANGELOG.md +188 -0
  2. package/custom-elements.json +1 -1
  3. package/design-tokens.json +13 -0
  4. package/dist/cli/migrate-wa.mjs +164 -1
  5. package/dist/cli/migration-contract.json +1 -1
  6. package/dist/components/charts/chart/box-plot.class.d.ts +27 -0
  7. package/dist/components/charts/chart/box-plot.class.js +14 -4
  8. package/dist/components/charts/chart/box-plot.styles.js +28 -0
  9. package/dist/components/charts/chart/chart.class.d.ts +27 -0
  10. package/dist/components/charts/chart/chart.class.js +15 -5
  11. package/dist/components/charts/chart/chart.styles.js +28 -0
  12. package/dist/components/data/heatmap/heatmap.class.d.ts +35 -2
  13. package/dist/components/data/heatmap/heatmap.class.js +2 -2
  14. package/dist/components/forms/combobox/combobox.class.d.ts +71 -3
  15. package/dist/components/forms/combobox/combobox.class.js +4 -2
  16. package/dist/components/forms/combobox/combobox.styles.js +9 -0
  17. package/dist/components/forms/date-picker/date-picker.class.d.ts +46 -0
  18. package/dist/components/forms/date-picker/date-picker.class.js +15 -3
  19. package/dist/components/forms/date-picker/date-picker.styles.js +46 -0
  20. package/dist/components/media/flag/flag.class.d.ts +3 -1
  21. package/dist/components/media/flag/flag.class.js +1 -1
  22. package/dist/components/media/map/map.class.d.ts +39 -2
  23. package/dist/components/media/map/map.class.js +1 -1
  24. package/dist/components/overlays/dialog/dialog.class.d.ts +20 -0
  25. package/dist/components/overlays/overlay/popover.class.d.ts +19 -3
  26. package/dist/components/overlays/overlay/popover.class.js +1 -1
  27. package/dist/custom-elements-jsx.d.ts +27 -14
  28. package/dist/internal/package-metadata.d.ts +1 -1
  29. package/dist/internal/package-metadata.js +1 -1
  30. package/dist/internal/tokens.styles.js +1 -0
  31. package/dist/lyra.d.ts +1 -1
  32. package/dist/svelte.d.ts +27 -14
  33. package/dist/vue.d.ts +27 -14
  34. package/llms/components/lr-bar-chart.md +4 -3
  35. package/llms/components/lr-box-plot.md +14 -3
  36. package/llms/components/lr-bubble-chart.md +4 -3
  37. package/llms/components/lr-chart.md +13 -3
  38. package/llms/components/lr-combobox.md +42 -6
  39. package/llms/components/lr-date-input.md +22 -2
  40. package/llms/components/lr-date-picker.md +23 -3
  41. package/llms/components/lr-dialog.md +2 -1
  42. package/llms/components/lr-doughnut-chart.md +4 -3
  43. package/llms/components/lr-flag.md +10 -3
  44. package/llms/components/lr-heatmap.md +20 -2
  45. package/llms/components/lr-histogram.md +4 -3
  46. package/llms/components/lr-line-chart.md +4 -3
  47. package/llms/components/lr-map.md +21 -4
  48. package/llms/components/lr-option.md +41 -5
  49. package/llms/components/lr-pie-chart.md +4 -3
  50. package/llms/components/lr-polar-area-chart.md +4 -3
  51. package/llms/components/lr-popover.md +20 -1
  52. package/llms/components/lr-radar-chart.md +4 -3
  53. package/llms/components/lr-scatter-chart.md +4 -3
  54. package/llms/tokens.md +15 -1
  55. package/llms-full.txt +197 -26
  56. package/package.json +1 -1
  57. package/vscode-css-data.json +56 -0
  58. package/vscode-html-data.json +115 -18
  59. package/web-types.json +162 -21
@@ -24,6 +24,24 @@ An `lr-option` row remains bounded by its owning listbox: the default label elli
24
24
  `start`/`end` (or `prefix`/`suffix`) adornment is capped at 40% of the row. Unbroken metadata
25
25
  therefore cannot widen a 320px LTR or RTL picker.
26
26
 
27
+ **Adornments in the popup (fixed in 10.1.0).** Before 10.1.0 this paragraph described behavior the
28
+ code did not have: `lr-combobox` builds its popup from normalized row *data* rather than from the
29
+ light-DOM nodes, so a slotted `start`/`end`/`prefix`/`suffix` adornment had nowhere to land and
30
+ simply never rendered — the documented slots and their documented parts were both dead inside the
31
+ one component `lr-option` exists to feed. They now render. The nodes are **cloned** into the row
32
+ (`option-start` / `option-end` parts, inert and `aria-hidden`, so they never join the option's
33
+ accessible name), which means the author's own `<lr-option>` subtree is left exactly where they put
34
+ it rather than being moved into a shadow root as a side effect of opening a dropdown:
35
+
36
+ ```html
37
+ <lr-combobox label="Country">
38
+ <lr-option value="fr"><lr-flag slot="start" country="fr"></lr-flag>France</lr-option>
39
+ <lr-option value="mt"><lr-flag slot="start" country="mt"></lr-flag>Malta</lr-option>
40
+ </lr-combobox>
41
+ ```
42
+
43
+ An async `source` row can carry the same two fields (`start`, `end`) alongside its existing `icon`.
44
+
27
45
  ### `lr-combobox`
28
46
 
29
47
  **Properties:**
@@ -90,8 +108,21 @@ therefore cannot widen a 320px LTR or RTL picker.
90
108
  mapped IDLs `inputmode` and `enterkeyhint` delegate to the corresponding camel-case native
91
109
  properties
92
110
  - `inputValue: string` — the live filter input text; programmatic writes are event-silent
93
- - `maxOptionsVisible: number = 3` (attribute `max-options-visible` — caps how many selected tags
94
- show before collapsing to `+N`)
111
+ - `maxOptionsVisible: number = 3` (attribute `max-options-visible` — caps how many selected **tags**
112
+ show before collapsing to `+N`; nothing to do with the suggestion list, see the three-caps note
113
+ below)
114
+ - `visibleOptions?: number` (attribute `visible-options`, new in 10.1.0) — bounds the popup to about
115
+ this many suggestion rows, leaving the rest reachable by scrolling. Purely presentational: every
116
+ row is still rendered. Measured from where row N actually starts rather than computed from a
117
+ token, because a row's height varies with `sub` lines, adornments and group labels. Unset imposes
118
+ no bound of its own and the listbox keeps exactly its previous max-height behavior; zero,
119
+ negative, and non-finite values normalize to unset rather than collapsing the popup
120
+
121
+ **The three caps, which are easy to confuse.** `visibleOptions` caps how many suggestion rows are
122
+ *visible* (presentation; the rest scroll). `maxRender` caps how many suggestion rows are *rendered
123
+ at all* (performance; the rest do not exist and are summarized by `option-overflow`).
124
+ `maxOptionsVisible` caps how many *selected tags* show in multi-select and never touches the
125
+ suggestion list.
95
126
  - `emptyText?: string` (attribute `empty-text`) — omission displays localized `noMatches` (`"No
96
127
  matches"` in the built-in English locale); any supplied string, including `''`, renders verbatim
97
128
  - `loadingText?: string` (attribute `loading-text`) — shown while a `source` fetch is in flight;
@@ -154,9 +185,12 @@ every selection change and a `form.reset()` — like a native control, only anot
154
185
  **8.0 migration:** the former camel-case string property `autoCorrect` is not retained as a public
155
186
  alias. Set the boolean `autocorrect` IDL, or use `autocorrect="on"` / `autocorrect="off"` in markup.
156
187
 
157
- `ComboboxSourceRow = { readonly value: string; readonly label: string; readonly sub?: string; readonly icon?: unknown; readonly badge?: string |
188
+ `ComboboxSourceRow = { readonly value: string; readonly label: string; readonly sub?: string; readonly icon?: unknown; readonly start?: unknown;
189
+ readonly end?: unknown; readonly badge?: string |
158
190
  number; accessibleLabel?: string; data?: unknown; dotColor?: string; group?: string; disabled?:
159
- boolean }` — the row shape used by the async `source` path. `icon` renders as a decorative leading
191
+ boolean }` — the row shape used by the async `source` path. `start` and `end` (new in 10.1.0) are
192
+ the async counterparts of `<lr-option>`'s `start`/`end` adornment slots and render as the
193
+ `option-start` / `option-end` parts, inert and aria-hidden exactly like `icon`. `icon` renders as a decorative leading
160
194
  visual whose rendered subtree stays visible but is inert and hidden from assistive technology;
161
195
  put independent actions outside it. `badge` renders as trailing metadata, `accessibleLabel` can
162
196
  provide richer spoken text than the visible label, and `data` is retained without being rendered
@@ -264,7 +298,9 @@ adornment-slot wrappers, each `hidden` while nothing is slotted into it), `tags`
264
298
  `lr-emoji-picker` so one rule styles every grouped list; it labels the `role="group"` wrapper here),
265
299
  `option`,
266
300
  `option-dot` (the leading status dot, when a row's `dotColor` is set), `option-icon` (the inert,
267
- aria-hidden decorative leading visual for an async row), `option-label`, `option-sub` (a row's
301
+ aria-hidden decorative leading visual for an async row), `option-start` and `option-end` (the inert,
302
+ aria-hidden adornments cloned from the source option's `start`/`prefix` and `end`/`suffix` slots, or
303
+ from an async row's `start`/`end`), `option-label`, `option-sub` (a row's
268
304
  secondary line, when `sub` is set), `option-badge` (an async row's trailing metadata),
269
305
  `option-overflow` (the "+N more" indicator from `maxRender`), `error`, `hint`
270
306
 
@@ -8,7 +8,7 @@
8
8
  - **Status** `stable` since `4.0.0` — see the maturity and deprecation policy in `llms/shared.md`
9
9
  - **Deprecations** none
10
10
  - **Optional peers** `chart.js`, `chartjs-plugin-annotation`, `chartjs-plugin-datalabels`, `chartjs-plugin-zoom` — see `llms/peers.md`
11
- - **Themeable via** 15 parts, 33 custom properties — see this component's own `@csspart`/`@cssprop` list below
11
+ - **Themeable via** 16 parts, 35 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
12
  - **Documented with** `lr-line-chart`, `lr-bar-chart`, `lr-doughnut-chart`, `lr-radar-chart`, `lr-polar-area-chart`, `lr-bubble-chart`, `lr-scatter-chart` (same section below)
13
13
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
14
14
 
@@ -44,7 +44,7 @@ complete `hiddenDatasets` snapshot).
44
44
  **Slots:** default JSON configuration script, `data-table`, `center`.
45
45
 
46
46
  **CSS parts:** `base`, `plot`, `canvas`, `legend`, `legend-item`, `legend-item-hidden`, `legend-swatch`,
47
- `reset-zoom-button`, `description`, `notices`, `data-table`, `data-truncation`, `feature-warning`, `center`, `error` (neutral visible message
47
+ `reset-zoom-button`, `description`, `notices`, `data-table`, `data-table-toggle`, `data-truncation`, `feature-warning`, `center`, `error` (neutral visible message
48
48
  rendered in place of `canvas` when the optional `chart.js` peer dependency fails to load; the
49
49
  failure transition is announced through the shared document-level light-DOM assertive sink — see
50
50
  `llms/components/lr-chart.md`).
@@ -53,7 +53,8 @@ failure transition is announced through the shared document-level light-DOM asse
53
53
  `--lr-chart-tick-color`, `--lr-chart-legend-color`, `--lr-chart-tooltip-bg`,
54
54
  `--lr-chart-tooltip-text`, `--lr-chart-legend-item-hover-bg`,
55
55
  `--lr-chart-legend-item-active-bg`, `--lr-chart-data-table-button-hover-bg`,
56
- `--lr-chart-data-table-button-active-bg`, `--lr-chart-reset-zoom-button-hover-bg`,
56
+ `--lr-chart-data-table-button-active-bg`, `--lr-chart-data-table-toggle-hover-bg`,
57
+ `--lr-chart-data-table-toggle-active-bg`, `--lr-chart-reset-zoom-button-hover-bg`,
57
58
  `--lr-chart-reset-zoom-button-active-bg`, `--lr-chart-canvas-hover-outline-width`, and
58
59
  `--lr-chart-pattern-step`, plus `--lr-chart-legend-side-max` — all inherited from `LyraChart`, identical in meaning and default (see
59
60
  `lr-chart` above); each of the eight variants below reads the same set, so one rule retunes them
@@ -8,7 +8,7 @@
8
8
  - **Status** `stable` since `4.0.0` — see the maturity and deprecation policy in `llms/shared.md`
9
9
  - **Deprecations** none
10
10
  - **Optional peers** `chart.js`, `chartjs-plugin-annotation`, `chartjs-plugin-datalabels`, `chartjs-plugin-zoom` — see `llms/peers.md`
11
- - **Themeable via** 15 parts, 33 custom properties — see this component's own `@csspart`/`@cssprop` list below
11
+ - **Themeable via** 16 parts, 35 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
12
  - **Documented with** `lr-line-chart`, `lr-bar-chart`, `lr-pie-chart`, `lr-doughnut-chart`, `lr-radar-chart`, `lr-bubble-chart`, `lr-scatter-chart` (same section below)
13
13
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
14
14
 
@@ -44,7 +44,7 @@ complete `hiddenDatasets` snapshot).
44
44
  **Slots:** default JSON configuration script, `data-table`, `center`.
45
45
 
46
46
  **CSS parts:** `base`, `plot`, `canvas`, `legend`, `legend-item`, `legend-item-hidden`, `legend-swatch`,
47
- `reset-zoom-button`, `description`, `notices`, `data-table`, `data-truncation`, `feature-warning`, `center`, `error` (neutral visible message
47
+ `reset-zoom-button`, `description`, `notices`, `data-table`, `data-table-toggle`, `data-truncation`, `feature-warning`, `center`, `error` (neutral visible message
48
48
  rendered in place of `canvas` when the optional `chart.js` peer dependency fails to load; the
49
49
  failure transition is announced through the shared document-level light-DOM assertive sink — see
50
50
  `llms/components/lr-chart.md`).
@@ -53,7 +53,8 @@ failure transition is announced through the shared document-level light-DOM asse
53
53
  `--lr-chart-tick-color`, `--lr-chart-legend-color`, `--lr-chart-tooltip-bg`,
54
54
  `--lr-chart-tooltip-text`, `--lr-chart-legend-item-hover-bg`,
55
55
  `--lr-chart-legend-item-active-bg`, `--lr-chart-data-table-button-hover-bg`,
56
- `--lr-chart-data-table-button-active-bg`, `--lr-chart-reset-zoom-button-hover-bg`,
56
+ `--lr-chart-data-table-button-active-bg`, `--lr-chart-data-table-toggle-hover-bg`,
57
+ `--lr-chart-data-table-toggle-active-bg`, `--lr-chart-reset-zoom-button-hover-bg`,
57
58
  `--lr-chart-reset-zoom-button-active-bg`, `--lr-chart-canvas-hover-outline-width`, and
58
59
  `--lr-chart-pattern-step`, plus `--lr-chart-legend-side-max` — all inherited from `LyraChart`, identical in meaning and default (see
59
60
  `lr-chart` above); each of the eight variants below reads the same set, so one rule retunes them
@@ -51,7 +51,26 @@ A click-triggered, light-dismiss floating surface positioned with the shared Flo
51
51
  - `accessibleLabel: string = ''` (attribute **`aria-label`**) — names the popup. An authored host
52
52
  attribute wins by presence, including `aria-label=""`; only when it is absent does the property
53
53
  or localized "Popover" ("Menu" when `popupRole` is `menu`) fallback apply
54
- - `popupRole: 'dialog'|'menu' = 'dialog'` (attribute `popup-role`)
54
+ - `popupRole: 'dialog'|'menu'|'none' = 'dialog'` (attribute `popup-role`). `none` (new in 10.1.0)
55
+ renders **no** `role` and no generated `aria-label` on the popup surface, and leaves
56
+ `aria-haspopup` off the trigger, so slotted content owns its own semantics and accessible name.
57
+ It exists for the WAI-ARIA **disclosure navigation** pattern: a flyout of links is not an
58
+ application action menu (`menu` announces "menu, menu item" and expects `menuitem` children) and
59
+ is not an interruptive surface (`dialog`). The `aria-expanded`/`aria-controls` wiring that pattern
60
+ requires is unchanged, as are light dismiss, Escape, focus return, and positioning:
61
+
62
+ ```html
63
+ <lr-popover popup-role="none">
64
+ <button slot="trigger">Products</button>
65
+ <nav aria-label="Products">
66
+ <ul><li><a href="/overview">Overview</a></li><li><a href="/pricing">Pricing</a></li></ul>
67
+ </nav>
68
+ </lr-popover>
69
+ ```
70
+
71
+ Note there is deliberately no `aria-haspopup="none"` — that is an invalid attribute value, not a
72
+ neutral one, and axe reports it as a critical violation. `lr-dropdown` still pins `popupRole` to
73
+ `menu`; the escape hatch lives on the general-purpose primitive.
55
74
  - `disabled: boolean = false` (reflected, new in 10.0.0) — prevents opening the popover; pointer,
56
75
  keyboard, and programmatic `show()`/`open = true` are all refused while set. Becoming disabled also
57
76
  closes an already-open popover, and initial `disabled` plus `open` normalizes closed in either
@@ -8,7 +8,7 @@
8
8
  - **Status** `stable` since `4.0.0` — see the maturity and deprecation policy in `llms/shared.md`
9
9
  - **Deprecations** none
10
10
  - **Optional peers** `chart.js`, `chartjs-plugin-annotation`, `chartjs-plugin-datalabels`, `chartjs-plugin-zoom` — see `llms/peers.md`
11
- - **Themeable via** 15 parts, 33 custom properties — see this component's own `@csspart`/`@cssprop` list below
11
+ - **Themeable via** 16 parts, 35 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
12
  - **Documented with** `lr-line-chart`, `lr-bar-chart`, `lr-pie-chart`, `lr-doughnut-chart`, `lr-polar-area-chart`, `lr-bubble-chart`, `lr-scatter-chart` (same section below)
13
13
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
14
14
 
@@ -44,7 +44,7 @@ complete `hiddenDatasets` snapshot).
44
44
  **Slots:** default JSON configuration script, `data-table`, `center`.
45
45
 
46
46
  **CSS parts:** `base`, `plot`, `canvas`, `legend`, `legend-item`, `legend-item-hidden`, `legend-swatch`,
47
- `reset-zoom-button`, `description`, `notices`, `data-table`, `data-truncation`, `feature-warning`, `center`, `error` (neutral visible message
47
+ `reset-zoom-button`, `description`, `notices`, `data-table`, `data-table-toggle`, `data-truncation`, `feature-warning`, `center`, `error` (neutral visible message
48
48
  rendered in place of `canvas` when the optional `chart.js` peer dependency fails to load; the
49
49
  failure transition is announced through the shared document-level light-DOM assertive sink — see
50
50
  `llms/components/lr-chart.md`).
@@ -53,7 +53,8 @@ failure transition is announced through the shared document-level light-DOM asse
53
53
  `--lr-chart-tick-color`, `--lr-chart-legend-color`, `--lr-chart-tooltip-bg`,
54
54
  `--lr-chart-tooltip-text`, `--lr-chart-legend-item-hover-bg`,
55
55
  `--lr-chart-legend-item-active-bg`, `--lr-chart-data-table-button-hover-bg`,
56
- `--lr-chart-data-table-button-active-bg`, `--lr-chart-reset-zoom-button-hover-bg`,
56
+ `--lr-chart-data-table-button-active-bg`, `--lr-chart-data-table-toggle-hover-bg`,
57
+ `--lr-chart-data-table-toggle-active-bg`, `--lr-chart-reset-zoom-button-hover-bg`,
57
58
  `--lr-chart-reset-zoom-button-active-bg`, `--lr-chart-canvas-hover-outline-width`, and
58
59
  `--lr-chart-pattern-step`, plus `--lr-chart-legend-side-max` — all inherited from `LyraChart`, identical in meaning and default (see
59
60
  `lr-chart` above); each of the eight variants below reads the same set, so one rule retunes them
@@ -8,7 +8,7 @@
8
8
  - **Status** `stable` since `4.0.0` — see the maturity and deprecation policy in `llms/shared.md`
9
9
  - **Deprecations** none
10
10
  - **Optional peers** `chart.js`, `chartjs-plugin-annotation`, `chartjs-plugin-datalabels`, `chartjs-plugin-zoom` — see `llms/peers.md`
11
- - **Themeable via** 15 parts, 33 custom properties — see this component's own `@csspart`/`@cssprop` list below
11
+ - **Themeable via** 16 parts, 35 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
12
  - **Documented with** `lr-line-chart`, `lr-bar-chart`, `lr-pie-chart`, `lr-doughnut-chart`, `lr-radar-chart`, `lr-polar-area-chart`, `lr-bubble-chart` (same section below)
13
13
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
14
14
 
@@ -44,7 +44,7 @@ complete `hiddenDatasets` snapshot).
44
44
  **Slots:** default JSON configuration script, `data-table`, `center`.
45
45
 
46
46
  **CSS parts:** `base`, `plot`, `canvas`, `legend`, `legend-item`, `legend-item-hidden`, `legend-swatch`,
47
- `reset-zoom-button`, `description`, `notices`, `data-table`, `data-truncation`, `feature-warning`, `center`, `error` (neutral visible message
47
+ `reset-zoom-button`, `description`, `notices`, `data-table`, `data-table-toggle`, `data-truncation`, `feature-warning`, `center`, `error` (neutral visible message
48
48
  rendered in place of `canvas` when the optional `chart.js` peer dependency fails to load; the
49
49
  failure transition is announced through the shared document-level light-DOM assertive sink — see
50
50
  `llms/components/lr-chart.md`).
@@ -53,7 +53,8 @@ failure transition is announced through the shared document-level light-DOM asse
53
53
  `--lr-chart-tick-color`, `--lr-chart-legend-color`, `--lr-chart-tooltip-bg`,
54
54
  `--lr-chart-tooltip-text`, `--lr-chart-legend-item-hover-bg`,
55
55
  `--lr-chart-legend-item-active-bg`, `--lr-chart-data-table-button-hover-bg`,
56
- `--lr-chart-data-table-button-active-bg`, `--lr-chart-reset-zoom-button-hover-bg`,
56
+ `--lr-chart-data-table-button-active-bg`, `--lr-chart-data-table-toggle-hover-bg`,
57
+ `--lr-chart-data-table-toggle-active-bg`, `--lr-chart-reset-zoom-button-hover-bg`,
57
58
  `--lr-chart-reset-zoom-button-active-bg`, `--lr-chart-canvas-hover-outline-width`, and
58
59
  `--lr-chart-pattern-step`, plus `--lr-chart-legend-side-max` — all inherited from `LyraChart`, identical in meaning and default (see
59
60
  `lr-chart` above); each of the eight variants below reads the same set, so one rule retunes them
package/llms/tokens.md CHANGED
@@ -17,6 +17,19 @@ For a ready-made light/dark base, import `@aceshooting/lyra-ui/theme.css` once a
17
17
  Per-component `--lr-<component>-*` custom properties (listed in each component's own section)
18
18
  override a single element without touching the shared layer.
19
19
 
20
+ > **Why layer 1 is not merely *preferred* but *required*: an ancestor `--lr-*` override does
21
+ > not survive a nested component boundary.** Every component re-derives the whole `--lr-*` layer
22
+ > from `--lr-theme-*` on its **own** `:host` (that is what `LyraElement`'s shared token
23
+ > stylesheet does). So setting, say, `--lr-color-warning-quiet` on an application element does
24
+ > apply to that element and to plain nested markup — it looks right in review and in a shallow
25
+ > `getComputedStyle` probe — but it is **reset at the first `lr-*` element inside another
26
+ > `lr-*` element's shadow root** (a badge inside a table cell, say), which re-derives it back to
27
+ > the library fallback. The override degrades silently, the deeper it is consumed, with no
28
+ > warning. Always set the `--lr-theme-*` input instead: that layer is read through `var()` at
29
+ > every level, so it inherits across every boundary. Per-component `--lr-<component>-*`
30
+ > properties are the other safe lever, because no component re-declares another component's
31
+ > namespace.
32
+
20
33
  ## Direct theme-backed tokens (263)
21
34
 
22
35
  | Internal token | `--lr-theme-*` input | Light/default fallback | Mode overrides |
@@ -285,7 +298,7 @@ override a single element without touching the shared layer.
285
298
  | `--lr-transition-base` | `--lr-theme-transition-normal` | `var(--lr-duration-base) var(--lr-easing-standard)` | reducedMotion: `0.001ms linear` |
286
299
  | `--lr-transition-fast` | `--lr-theme-transition-fast` | `var(--lr-duration-fast) var(--lr-easing-standard)` | reducedMotion: `0.001ms linear` |
287
300
 
288
- ## Derived and fixed tokens (75)
301
+ ## Derived and fixed tokens (76)
289
302
 
290
303
  These do not directly read a `--lr-theme-*` input. Aliases and computed values still follow
291
304
  the tokens or environment values they reference; fixed contract constants are intentionally
@@ -307,6 +320,7 @@ not theme inputs.
307
320
  | `--lr-color-success-quiet` | `var(--lr-color-success-fill-quiet)` | forcedColors: `Canvas` |
308
321
  | `--lr-color-warning` | `var(--lr-color-warning-fill-loud)` | forcedColors: `CanvasText` |
309
322
  | `--lr-color-warning-quiet` | `var(--lr-color-warning-fill-quiet)` | forcedColors: `Canvas` |
323
+ | `--lr-focus-ring` | `var(--lr-focus-ring-width) solid var(--lr-focus-ring-color)` | — |
310
324
  | `--lr-mask-opaque` | `#000` | — |
311
325
  | `--lr-ramp-brand-05` | `#000002` | — |
312
326
  | `--lr-ramp-brand-10` | `#00030f` | — |