@aceshooting/lyra-ui 25.3.0 → 25.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/custom-elements.json +1 -1
  3. package/dist/cli/migration-contract.json +1 -1
  4. package/dist/components/agent-tools/browser-frame/browser-frame.styles.js +1 -1
  5. package/dist/components/charts/chart/chart-sync.d.ts +4 -0
  6. package/dist/components/charts/chart/chart-sync.js +1 -0
  7. package/dist/components/charts/chart/chart-sync.styles.d.ts +1 -0
  8. package/dist/components/charts/chart/chart-sync.styles.js +1 -0
  9. package/dist/components/charts/chart/chart.class.d.ts +12 -2
  10. package/dist/components/charts/chart/chart.class.js +5 -4
  11. package/dist/components/charts/chart/histogram.class.js +1 -1
  12. package/dist/components/charts/chart/lite-chart.class.d.ts +18 -5
  13. package/dist/components/charts/chart/lite-chart.class.js +11 -11
  14. package/dist/components/data/heatmap/heatmap-grid-navigation.d.ts +2 -2
  15. package/dist/components/data/heatmap/heatmap-grid-navigation.js +1 -1
  16. package/dist/components/data/heatmap/heatmap.class.d.ts +24 -9
  17. package/dist/components/data/heatmap/heatmap.class.js +3 -3
  18. package/dist/components/forms/button/button.styles.js +1 -1
  19. package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -1
  20. package/dist/components/layout/app-rail/app-rail.class.d.ts +1 -1
  21. package/dist/components/layout/app-rail/app-rail.class.js +1 -1
  22. package/dist/components/layout/card/card.styles.js +1 -1
  23. package/dist/components/layout/details/accordion-item.styles.js +1 -1
  24. package/dist/components/layout/details/details.styles.js +1 -1
  25. package/dist/components/layout/menu/menu.class.js +1 -1
  26. package/dist/components/layout/reorder-list/reorder-item.class.js +2 -0
  27. package/dist/components/media/avatar/avatar.class.d.ts +3 -0
  28. package/dist/components/media/avatar/avatar.styles.js +1 -1
  29. package/dist/components/media/pan-zoom/pan-zoom.styles.js +1 -1
  30. package/dist/framework-types.d.ts +1 -1
  31. package/dist/internal/glass-surface.styles.js +1 -1
  32. package/dist/internal/opaque-content-border.styles.d.ts +3 -0
  33. package/dist/internal/opaque-content-border.styles.js +1 -0
  34. package/dist/internal/package-metadata.d.ts +1 -1
  35. package/dist/internal/package-metadata.js +1 -1
  36. package/dist/internal/tokens.styles.js +1 -1
  37. package/dist/surfaces/glass.css +1 -1
  38. package/dist/theme.css +1 -1
  39. package/llms/components/lr-avatar.md +9 -3
  40. package/llms/components/lr-bar-chart.md +1 -1
  41. package/llms/components/lr-bubble-chart.md +1 -1
  42. package/llms/components/lr-chart.md +11 -2
  43. package/llms/components/lr-doughnut-chart.md +1 -1
  44. package/llms/components/lr-heatmap.md +16 -3
  45. package/llms/components/lr-histogram.md +9 -1
  46. package/llms/components/lr-line-chart.md +11 -1
  47. package/llms/components/lr-lite-chart.md +14 -4
  48. package/llms/components/lr-locale-picker.md +5 -5
  49. package/llms/components/lr-menu.md +4 -0
  50. package/llms/components/lr-pie-chart.md +1 -1
  51. package/llms/components/lr-polar-area-chart.md +1 -1
  52. package/llms/components/lr-radar-chart.md +1 -1
  53. package/llms/components/lr-reorder-list.md +5 -0
  54. package/llms/components/lr-scatter-chart.md +1 -1
  55. package/llms/peers.md +2 -2
  56. package/llms/shared/styles-and-tokens.md +31 -14
  57. package/llms/shared.md +31 -14
  58. package/llms/tokens.md +7 -4
  59. package/package.json +5 -5
  60. package/vscode-css-data.json +1 -1
  61. package/vscode-html-data.json +1 -1
  62. package/web-types.json +1 -1
@@ -9,7 +9,7 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [media](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/media.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** none
12
- - **Themeable via** 4 parts, 6 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 4 parts, 7 custom properties — see this component's own `@csspart`/`@cssprop` list below
13
13
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
14
14
 
15
15
  ---
@@ -88,9 +88,14 @@ initials track the circle instead of staying one fixed size across every tier. `
88
88
  (default `var(--lr-radius-pill)`) — corner radius of the container. Its private default follows
89
89
  `shape` (`var(--lr-radius-pill)` for `circle`, `var(--lr-radius)` for `rounded`, `0` for `square`);
90
90
  an inherited or direct public value overrides uniformly across every shape, the same way
91
- `--lr-avatar-size` spans every size tier. Every public value
91
+ `--lr-avatar-size` spans every size tier. `--lr-avatar-border` (default `none`) — border shorthand
92
+ on `base`, applying to image, glyph and initials avatars in every shape. Border-box sizing keeps
93
+ the border inside the outer diameter set by `--size`, `--lr-avatar-size` or the size ladder;
94
+ image content fills the remaining inner area. Forced colors preserves the system-color boundary
95
+ instead of the normal token border. Existing `::part(base)` border customization remains supported.
96
+ Every public value
92
97
  above can be inherited from an ancestor or set directly on the avatar and remains authoritative
93
- across size/variant states. Plus shared tokens
98
+ across size/variant states in normal color modes. Plus shared tokens
94
99
  `--lr-radius`/`-pill`, `--lr-font-weight-semibold`.
95
100
 
96
101
  The variant colors are deliberately **not** the library's generic quiet-fill/on-quiet-text pairing:
@@ -103,6 +108,7 @@ variant's quiet tint.
103
108
  <lr-avatar initials="JS" variant="brand"></lr-avatar>
104
109
  <lr-avatar image="/users/42/photo.jpg" label="Jane Smith" size="large" shape="rounded"></lr-avatar>
105
110
  <lr-avatar label="Assistant"><svg slot="icon" viewBox="0 0 24 24"><!-- role glyph --></svg></lr-avatar>
111
+ <lr-avatar initials="JS" style="--lr-avatar-border: var(--lr-border-width-medium) solid var(--lr-color-border)"></lr-avatar>
106
112
 
107
113
  <!-- Far down a long list: defer the request, fall back to a glyph, and report a broken URL. -->
108
114
  <lr-avatar id="lazy-avatar" image="/users/7/photo.jpg" label="Ada Lovelace" loading="lazy">
@@ -9,6 +9,6 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [charts](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/charts.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** `chart.js`, `chartjs-plugin-annotation`, `chartjs-plugin-datalabels`, `chartjs-plugin-zoom` — see `llms/peers.md`
12
- - **Themeable via** 16 parts, 37 custom properties — see `lr-line-chart.md`
12
+ - **Themeable via** 17 parts, 39 custom properties — see `lr-line-chart.md`
13
13
  - **Documented with** `lr-line-chart`: see [lr-line-chart.md](./lr-line-chart.md).
14
14
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
@@ -9,6 +9,6 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [charts](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/charts.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** `chart.js`, `chartjs-plugin-annotation`, `chartjs-plugin-datalabels`, `chartjs-plugin-zoom` — see `llms/peers.md`
12
- - **Themeable via** 16 parts, 37 custom properties — see `lr-line-chart.md`
12
+ - **Themeable via** 17 parts, 39 custom properties — see `lr-line-chart.md`
13
13
  - **Documented with** `lr-line-chart`: see [lr-line-chart.md](./lr-line-chart.md).
14
14
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
@@ -9,7 +9,7 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [charts](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/charts.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** `chart.js`, `chartjs-plugin-annotation`, `chartjs-plugin-datalabels`, `chartjs-plugin-zoom` — see `llms/peers.md`
12
- - **Themeable via** 16 parts, 37 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 17 parts, 39 custom properties — see this component's own `@csspart`/`@cssprop` list below
13
13
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
14
14
 
15
15
  ---
@@ -233,6 +233,10 @@ structured points retain their y-value formatting.
233
233
  value, matching Chart.js's own paired index/value-scale stacking contract.
234
234
  - `withoutAnimation: boolean = false` (attribute `without-animation`, reflected) — disables Chart.js
235
235
  construction animation; reduced-motion preference also disables it regardless of this value
236
+ - `syncGroup: string = ''` (attribute `sync-group`) — opt-in exact category coordination; see
237
+ [Synchronized categorical charts](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/charts.md#synchronized-categorical-charts). Only effective vertical
238
+ categorical bar/line configurations participate; other types, horizontal charts and continuous
239
+ x scales keep this setting inert. Core keeps its native canvas tooltip and existing tooltip tokens.
236
240
  - `withoutTooltip: boolean = false` (attribute `without-tooltip`, reflected) — disables the
237
241
  Chart.js tooltip plugin for this instance
238
242
  - `dataLabels: boolean = false` (attribute `data-labels`) — draws each point's value on the chart via
@@ -432,7 +436,9 @@ notice, so use that escape hatch when the complete data set needs pagination, vi
432
436
  another application-owned presentation. Explicit `config.data` is the deliberate full-fidelity
433
437
  Chart.js escape hatch and is not rewritten by the simplified-surface sampler.
434
438
 
435
- **CSS parts:** `base`, `plot` (the fixed-height canvas/overlay region), `canvas`, `legend` (the
439
+ **CSS parts:** `base`, `plot` (the fixed-height canvas/overlay region), `canvas`,
440
+ `sync-crosshair` (decorative category line during an admitted synchronized interaction; the native
441
+ canvas tooltip has no CSS part), `legend` (the
436
442
  wrapping DOM legend), `legend-item` (a dataset/category visibility button), `legend-item-hidden`
437
443
  (added while the dataset/category is hidden), `legend-swatch`,
438
444
  `reset-zoom-button`, `description`, `notices` (wrapper for nonfatal feature warnings and
@@ -448,6 +454,9 @@ legend grows the host in normal flow. The `height` property writes only a privat
448
454
  public token wins across valid, invalid, and unset `height` updates. Set it on the host or an
449
455
  ancestor, not a shadow-tree descendant, since custom properties only cascade downward);
450
456
  `--lr-chart-grid-color` (default `var(--lr-color-border-subtle)`),
457
+ `--lr-chart-sync-crosshair-color` (default `var(--lr-color-text)`) and
458
+ `--lr-chart-sync-crosshair-width` (default `var(--lr-border-width-thin)`) style the synchronized
459
+ category line;
451
460
  `--lr-chart-tick-color` (default `var(--lr-color-text-quiet)`), `--lr-chart-legend-color`
452
461
  (default `var(--lr-color-text)`), `--lr-chart-tooltip-bg` (default `var(--lr-color-surface)`),
453
462
  `--lr-chart-tooltip-color` (default `var(--lr-color-text)`) — each resolved fresh via
@@ -9,6 +9,6 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [charts](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/charts.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** `chart.js`, `chartjs-plugin-annotation`, `chartjs-plugin-datalabels`, `chartjs-plugin-zoom` — see `llms/peers.md`
12
- - **Themeable via** 16 parts, 37 custom properties — see `lr-line-chart.md`
12
+ - **Themeable via** 17 parts, 39 custom properties — see `lr-line-chart.md`
13
13
  - **Documented with** `lr-line-chart`: see [lr-line-chart.md](./lr-line-chart.md).
14
14
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
@@ -83,9 +83,17 @@ weekdayLabelWidth?: number|'auto'; weekdayLabelText?: (jsWeekday:number)=>string
83
83
  - `cellSize: number = 22` (attribute `cell-size` — default `22` in matrix mode, `11` in calendar
84
84
  mode when left unset; explicitly setting it now governs both modes' per-cell size alike, and it's
85
85
  ignored in either mode when `fitToWidth` is set)
86
+ - `rowHeight?: number` (attribute `row-height`) — independent matrix vertical row pitch in CSS
87
+ pixels, including its trailing `cellGapY` separator. Unset, removed, `null`, `undefined`, and
88
+ non-finite values restore square rows from the effective `cellSize`; finite values
89
+ clamp to the `1`–`4096` range. This bounds numeric outliers; browser canvas limits still apply
90
+ to the complete grid. `fitToWidth`, `minCellSize`, and `maxCellSize` continue to govern column pitch.
91
+ Calendar mode ignores it and preserves its existing square geometry. With `accessibleCells`,
92
+ width and height independently preserve the accessible target floor; dense columns can therefore
93
+ overflow even when fitting is requested.
86
94
  - `cellGapX: number = 1` / `cellGapY: number = 1` (attributes `cell-gap-x` / `cell-gap-y`) —
87
95
  trailing horizontal/vertical gaps in CSS pixels. In matrix mode they are subtracted from the
88
- square `cellSize` pitch. Negative values clamp to zero, non-finite values use `1`, and oversized
96
+ horizontal `cellSize` / vertical `rowHeight ?? cellSize` pitch. Negative values clamp to zero, non-finite values use `1`, and oversized
89
97
  gaps leave at least one painted pixel. Custom geometry with `accessibleCells` grows the minimum
90
98
  pitch and caps gaps to preserve the `--lr-icon-button-size` target floor. In calendar mode they
91
99
  are opt-in: only an explicitly set property or attribute replaces the calendar's original `2px`
@@ -374,10 +382,11 @@ otherwise keep private. For the case that motivated it — a frozen header or gu
374
382
  matrix — prefer `stickyLabels`, which freezes the band inside the component and needs no mirror at
375
383
  all; the getter remains the way to align a *separate* element (a sibling chart, a custom overlay)
376
384
  with the grid. `LyraHeatmapMatrixGeometryChangeDetail` contains `padLeft`, `padTop`, and `cellSize`
377
- (the square pitch), plus optional `cellWidth`, `cellHeight`, and `cellRadius` for custom matrix
385
+ (the horizontal pitch), plus optional `rowHeight` when vertical pitch differs and optional
386
+ `cellWidth`, `cellHeight`, and `cellRadius` for custom matrix
378
387
  presentation. When those optional fields are absent, painted width/height are `cellSize - 1` and
379
388
  radius is zero. The getter and geometry-change event always share one frozen snapshot, including
380
- changes to the resolved gaps/radius.
389
+ changes to the resolved row pitch, gaps, and radius. Use `rowHeight ?? cellSize` to position rows.
381
390
 
382
391
  `calendarGeometry: Readonly<LyraHeatmapCalendarGeometry> | undefined` (read-only; assignment is
383
392
  ignored) is the calendar-mode counterpart: the frozen snapshot of the last calendar draw with
@@ -394,6 +403,10 @@ selection, `lr-cell-activate`, and `cellText` keep working with no matrix rebuil
394
403
 
395
404
  For a fluid day/hour matrix, keep all 24 hour strings in `data.colLabels` and use
396
405
  `fit-to-width cell-gap-x="1" cell-gap-y="2" cell-radius="2" col-label-interval="3"`.
406
+ For a dense matrix with 144 time columns and 20 rows, use `fit-to-width row-height="28"` to fit
407
+ columns while keeping readable rows. Row height includes the trailing separator and stays `28px`
408
+ when the host resizes. The existing `minCellSize` floor and accessible target sizes can require
409
+ horizontal overflow in a narrow allocation; choose `sticky-labels` when you want a scrollport.
397
410
  For a single fluid square cell, use `fit-to-width` with equal horizontal and vertical gaps.
398
411
 
399
412
  **Events:** `lr-selection-change` (not cancelable; frozen readonly `HeatmapSelectionChangeDetail { selectedCells, source }` proposal in multiple mode, with `source: 'pointer' | 'keyboard' | 'row' | 'column'`; accept it by assigning `selectedCells`). `lr-cell-activate` (fired on click, or Enter/Space on the keyboard-focused cell —
@@ -9,7 +9,7 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [charts](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/charts.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** `chart.js`, `chartjs-plugin-annotation`, `chartjs-plugin-datalabels`, `chartjs-plugin-zoom` — see `llms/peers.md`
12
- - **Themeable via** 16 parts, 37 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 17 parts, 39 custom properties — see this component's own `@csspart`/`@cssprop` list below
13
13
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
14
14
 
15
15
  ---
@@ -28,6 +28,11 @@ Bins `values` into `bins` equal-width buckets and renders as a bar chart (extend
28
28
  chart-wide accessible-name meaning.
29
29
  - inherits `lr-chart`'s full surface, including `scaleType` (`scale-type`) and `annotations` —
30
30
  a logarithmic frequency axis and threshold/band markers both apply to a histogram
31
+ - `syncGroup: string = ''` (attribute `sync-group`) — inherited exact category coordination for its
32
+ vertical categorical bar configuration; see
33
+ [Synchronized categorical charts](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/charts.md#synchronized-categorical-charts). Matches use the generated
34
+ bucket range strings, so different bin boundaries do not match unless their labels are exactly
35
+ equal. Horizontal or continuous-x raw configurations do not participate.
31
36
  - `labels`/`datasets`/`type` are **derived, read-only** (installed as getter/setter pairs on the
32
37
  prototype; direct writes are silently ignored) — `labels`/`datasets` are computed from
33
38
  `values`/`bins` (memoized per instance, keyed by reference equality on `values` plus the
@@ -59,12 +64,15 @@ bar controller and dataset legend even with `legend-mode="datum"`.
59
64
  **Slots:** default JSON configuration script, `data-table`, `center`.
60
65
 
61
66
  **CSS parts:** `base`, `plot`, `canvas`, `legend`, `legend-item`, `legend-item-hidden`, `legend-swatch`,
67
+ `sync-crosshair` (inherited decorative category line during synchronization; the native canvas
68
+ tooltip has no CSS part),
62
69
  `reset-zoom-button`, `description`, `notices`, `data-table`, `data-table-toggle`, `data-truncation`, `feature-warning`, `center`, `error` (neutral visible message
63
70
  rendered in place of `canvas` when the optional `chart.js` peer dependency fails to load; the
64
71
  failure transition is announced through the shared document-level light-DOM assertive sink —
65
72
  inherited from `LyraChart`, unaffected by the binning logic).
66
73
 
67
74
  **Themeable custom properties:** `--lr-chart-height`, `--lr-chart-grid-color`,
75
+ `--lr-chart-sync-crosshair-color`, `--lr-chart-sync-crosshair-width`,
68
76
  `--lr-chart-tick-color`, `--lr-chart-tick-font-size`, `--lr-chart-legend-color`, `--lr-chart-tooltip-bg`,
69
77
  `--lr-chart-tooltip-color`, `--lr-chart-legend-item-hover-bg`,
70
78
  `--lr-chart-legend-item-active-bg`, `--lr-chart-data-table-button-hover-bg`,
@@ -9,7 +9,7 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [charts](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/charts.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** `chart.js`, `chartjs-plugin-annotation`, `chartjs-plugin-datalabels`, `chartjs-plugin-zoom` — see `llms/peers.md`
12
- - **Themeable via** 16 parts, 37 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 17 parts, 39 custom properties — see this component's own `@csspart`/`@cssprop` list below
13
13
  - **Documented with** `lr-bar-chart`, `lr-pie-chart`, `lr-doughnut-chart`, `lr-radar-chart`, `lr-polar-area-chart`, `lr-bubble-chart`, `lr-scatter-chart` (same section below)
14
14
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
15
15
 
@@ -21,6 +21,13 @@ Each is `LyraChart` with a named default `type` — respectively `line`, `bar`,
21
21
  `radar`, `polarArea`, `bubble`, `scatter`. In parity with the mirrored tags, `type` remains writable
22
22
  and accepts the full `LyraChartType` vocabulary; the tag name is a convenient default, not a lock.
23
23
 
24
+ `syncGroup: string = ''` (attribute `sync-group`) is inherited. The default vertical categorical
25
+ `lr-line-chart` and `lr-bar-chart` configurations can participate in
26
+ [Synchronized categorical charts](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/charts.md#synchronized-categorical-charts). The other six default chart
27
+ types leave it inert; changing `type` or raw `config` to an admitted vertical categorical bar/line
28
+ configuration enables participation regardless of the tag. Horizontal or continuous-x
29
+ configurations remain outside synchronization.
30
+
24
31
  Everything else is inherited verbatim from `lr-chart`; each name below has the same type, default,
25
32
  and behavior there. **See `llms/components/lr-chart.md` for the details, code example, and gotchas
26
33
  of every entry in these lists.**
@@ -51,12 +58,15 @@ Radial category legends additionally emit `lr-datum-visibility-change-request` (
51
58
  **Slots:** default JSON configuration script, `data-table`, `center`.
52
59
 
53
60
  **CSS parts:** `base`, `plot`, `canvas`, `legend`, `legend-item`, `legend-item-hidden`, `legend-swatch`,
61
+ `sync-crosshair` (inherited decorative category line, rendered only for an admitted synchronized
62
+ configuration; the native canvas tooltip has no CSS part),
54
63
  `reset-zoom-button`, `description`, `notices`, `data-table`, `data-table-toggle`, `data-truncation`, `feature-warning`, `center`, `error` (neutral visible message
55
64
  rendered in place of `canvas` when the optional `chart.js` peer dependency fails to load; the
56
65
  failure transition is announced through the shared document-level light-DOM assertive sink — see
57
66
  `llms/components/lr-chart.md`).
58
67
 
59
68
  **Themeable custom properties:** `--lr-chart-height`, `--lr-chart-grid-color`,
69
+ `--lr-chart-sync-crosshair-color`, `--lr-chart-sync-crosshair-width`,
60
70
  `--lr-chart-tick-color`, `--lr-chart-tick-font-size`, `--lr-chart-legend-color`, `--lr-chart-tooltip-bg`,
61
71
  `--lr-chart-tooltip-color`, `--lr-chart-legend-item-hover-bg`,
62
72
  `--lr-chart-legend-item-active-bg`, `--lr-chart-data-table-button-hover-bg`,
@@ -9,17 +9,21 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [charts](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/charts.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** none
12
- - **Themeable via** 18 parts, 19 custom properties — see this component's own `@csspart`/`@cssprop` list below
12
+ - **Themeable via** 20 parts, 23 custom properties — see this component's own `@csspart`/`@cssprop` list below
13
13
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
14
14
 
15
15
  ---
16
16
 
17
17
  ## `lr-lite-chart`
18
18
 
19
+ `syncGroup: string = ''` (attribute `sync-group`) opts into
20
+ [Synchronized categorical charts](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/charts.md#synchronized-categorical-charts). Its DOM `sync-crosshair` and
21
+ `sync-tooltip` parts use the shared crosshair and tooltip tokens described there.
22
+
19
23
  A dependency-free bar/line chart — plain SVG/DOM rendering, zero peer dependencies (unlike
20
24
  `lr-chart`, which wraps `chart.js`). For a project whose architecture forbids a charting
21
25
  dependency outright: covers grouped/stacked bars, multi-series lines, per-point click, and hover
22
- tooltips (native SVG `<title>`, no positioning JS) — not a full `lr-chart` replacement (no
26
+ tooltips (native SVG `<title>` by default, positioned text tooltips in a sync group) — not a full `lr-chart` replacement (no
23
27
  zoom/pan, no pie/doughnut/radar/scatter/bubble types, no horizontal/dual-y-axis, no raw-config
24
28
  passthrough). Not a subclass of `LyraChart`.
25
29
 
@@ -31,7 +35,7 @@ shape to express. A per-series stack-group id would also need the hand-rolled SV
31
35
  pass (linear/sqrt/log stack compression, `minBarHeight`) to track independent running offsets per
32
36
  group instead of one per category, which is a materially larger, higher-risk change than this
33
37
  component's existing single-stack model. `tooltipTitleFormatter`/`tooltipFooterFormatter` are
34
- similarly absent: this component's hover tooltip is a native SVG `<title>` on each mark — one
38
+ similarly absent: this component's default hover tooltip is a native SVG `<title>` on each mark — one
35
39
  self-contained string per mark, generated by `pointText` — not a Chart.js-style multi-item tooltip
36
40
  with separate title/body/footer regions for several datasets sharing a hovered category, so there
37
41
  is no "every item in the tooltip" surface to hook a title or footer formatter onto.
@@ -275,7 +279,9 @@ instead of materializing an unbounded hidden DOM or SVG tree.
275
279
  **Slots:** `data-table` — optional consumer-provided complete, paginated, or virtualized accessible
276
280
  data alternative.
277
281
 
278
- **CSS parts:** `base`, `description`, `grid-line`, `axis-label`, `axis-title`, `bar` and `point` (each carries
282
+ **CSS parts:** `base`, `description`, `grid-line`, `axis-label`, `axis-title`,
283
+ `sync-crosshair` (decorative synchronized category line), `sync-tooltip` (noninteractive positioned
284
+ text tooltip while `syncGroup` is active), `bar` and `point` (each carries
279
285
  `data-selected` when its category index is in `selectedIndices`, with explicit pressed state on every
280
286
  mark), `line`, `legend`, `legend-item`, `legend-swatch`, `legend-text` (extra per-item text after
281
287
  the series label, rendered only when `legendText` is set), `live-region` (the current mark
@@ -303,6 +309,10 @@ suppresses the generated sample and notice.
303
309
 
304
310
  **Themeable custom properties:** `--lr-chart-height` (same public host-level property and precedence
305
311
  as `lr-chart`; it always wins over the `height` property's private fallback);
312
+ `--lr-chart-sync-crosshair-color` (default `var(--lr-color-text)`) and
313
+ `--lr-chart-sync-crosshair-width` (default `var(--lr-border-width-thin)`) style the synchronized
314
+ category line; `--lr-chart-tooltip-bg` (default `var(--lr-color-surface)`) and
315
+ `--lr-chart-tooltip-color` (default `var(--lr-color-text)`) style the positioned synchronized tooltip;
306
316
  `--lr-chart-grid-color`, `--lr-chart-tick-color`, `--lr-chart-tick-font-size` (default
307
317
  `var(--lr-font-size-2xs)`), `--lr-chart-legend-color` — same token
308
318
  *names* as `lr-chart`, so a host already theming `lr-chart` themes this for free;
@@ -222,11 +222,11 @@ A compact header can set `trigger-display="flag"` and
222
222
  Import `@aceshooting/lyra-ui/components/media/flag/flag-peer.js` to register the optional flag
223
223
  resolver. Menu labels stay visible; a per-entry `country` override also reaches the compact trigger.
224
224
 
225
- Option rows keep at least the medium control height (`--lr-form-control-height-m`, normally
226
- `2.25rem`), including `option-display="label"` and a small flag trigger. Larger control tiers,
227
- coarse-pointer control heights, larger text, and the optional tag line can grow the rows beyond
228
- that floor. The listbox keeps its scrolling height limit; `size` does not make language rows
229
- smaller than the medium floor.
225
+ Option rows keep at least `--lr-size-3rem` (normally `3rem`, or 48px at a 16px root size),
226
+ including `option-display="label"`, compact density, and a small flag trigger. Block padding is
227
+ `--lr-space-s`; long native labels wrap and rows grow with the text. Larger medium/current control
228
+ height tokens and the optional tag line can also grow rows beyond that floor. The listbox keeps
229
+ its scrolling height limit; `size` controls the trigger rather than shrinking language choices.
230
230
 
231
231
  ```html
232
232
  <lr-locale-picker label="Language"></lr-locale-picker>
@@ -265,6 +265,10 @@ has `aria-haspopup="menu"`, explicit `aria-expanded="true|false"`, the transient
265
265
  `submenu-open` state, and a logical-direction chevron. Its submenu is named from the parent's
266
266
  accessible label unless the submenu supplies its own `aria-label` or non-default `label`.
267
267
 
268
+ Submenus prefer the inline end of their parent and flip to the other side when necessary. When
269
+ neither side has enough space, they can open above or below the parent, keeping their labels
270
+ readable within the viewport instead of shrinking to the remaining strip beside a wide menu.
271
+
268
272
  The into-branch and back-out arrow keys swap under RTL. Enter/Space and the into key open and focus
269
273
  the first child; the back-out key and Escape close only the innermost branch and return focus to its
270
274
  parent row. Pointer hover uses an intent delay, outside pointer dismissal closes the branch, and at
@@ -9,6 +9,6 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [charts](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/charts.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** `chart.js`, `chartjs-plugin-annotation`, `chartjs-plugin-datalabels`, `chartjs-plugin-zoom` — see `llms/peers.md`
12
- - **Themeable via** 16 parts, 37 custom properties — see `lr-line-chart.md`
12
+ - **Themeable via** 17 parts, 39 custom properties — see `lr-line-chart.md`
13
13
  - **Documented with** `lr-line-chart`: see [lr-line-chart.md](./lr-line-chart.md).
14
14
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
@@ -9,6 +9,6 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [charts](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/charts.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** `chart.js`, `chartjs-plugin-annotation`, `chartjs-plugin-datalabels`, `chartjs-plugin-zoom` — see `llms/peers.md`
12
- - **Themeable via** 16 parts, 37 custom properties — see `lr-line-chart.md`
12
+ - **Themeable via** 17 parts, 39 custom properties — see `lr-line-chart.md`
13
13
  - **Documented with** `lr-line-chart`: see [lr-line-chart.md](./lr-line-chart.md).
14
14
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
@@ -9,6 +9,6 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [charts](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/charts.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** `chart.js`, `chartjs-plugin-annotation`, `chartjs-plugin-datalabels`, `chartjs-plugin-zoom` — see `llms/peers.md`
12
- - **Themeable via** 16 parts, 37 custom properties — see `lr-line-chart.md`
12
+ - **Themeable via** 17 parts, 39 custom properties — see `lr-line-chart.md`
13
13
  - **Documented with** `lr-line-chart`: see [lr-line-chart.md](./lr-line-chart.md).
14
14
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
@@ -126,6 +126,11 @@ row content for the repeated move-action names.
126
126
  effective owner state. Corresponding custom states include `:state(at-start)`, `:state(at-end)`,
127
127
  `:state(list-disabled)`, `:state(pending)`, and `:state(busy)`.
128
128
 
129
+ Each move control also carries its localized `moveUp` or `moveDown` action as an `aria-label`
130
+ fallback. The reflected `ariaLabelledByElements` relationship retains the full action and row name
131
+ and takes precedence in supporting browsers. Automation tools that omit reflected element references
132
+ may report only the action fallback; repeated actions can be located within their owning row.
133
+
129
134
  **Events:** `lr-move-request` (`detail: { direction: 'up' | 'down' }` — a move button was activated
130
135
  while not disabled; handled by the parent `<lr-reorder-list>`, which performs the actual move)
131
136
 
@@ -9,6 +9,6 @@
9
9
  - **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [charts](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/llms/charts.md)
10
10
  - **Deprecations** none
11
11
  - **Optional peers** `chart.js`, `chartjs-plugin-annotation`, `chartjs-plugin-datalabels`, `chartjs-plugin-zoom` — see `llms/peers.md`
12
- - **Themeable via** 16 parts, 37 custom properties — see `lr-line-chart.md`
12
+ - **Themeable via** 17 parts, 39 custom properties — see `lr-line-chart.md`
13
13
  - **Documented with** `lr-line-chart`: see [lr-line-chart.md](./lr-line-chart.md).
14
14
  - **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`
package/llms/peers.md CHANGED
@@ -52,14 +52,14 @@ for the page.
52
52
  | `emoji-picker-element-data` | `^1.8.0` | `lr-emoji-picker` |
53
53
  | `epubjs` | `^0.3.93` | `lr-ebook-viewer` |
54
54
  | `ical.js` | `^2.2.1` | `lr-calendar-viewer` |
55
- | `katex` | `^0.18.4` | `lr-agent-workspace`, `lr-dashboard-grid`, `lr-eval-run`, `lr-markdown`, `lr-markdown-core`, `lr-message-parts`, `lr-notebook-viewer`, `lr-rag-answer`, `lr-streaming-text`, `lr-streaming-text-core`, `lr-widget-renderer` |
55
+ | `katex` | `^0.18.4 \|\| ^0.19.0` | `lr-agent-workspace`, `lr-dashboard-grid`, `lr-eval-run`, `lr-markdown`, `lr-markdown-core`, `lr-message-parts`, `lr-notebook-viewer`, `lr-rag-answer`, `lr-streaming-text`, `lr-streaming-text-core`, `lr-widget-renderer` |
56
56
  | `libphonenumber-js` | `>=1.11.0 <2` | _(not referenced by any component)_ |
57
57
  | `mammoth` | `^1.12.1` | `lr-docx-viewer` |
58
58
  | `maplibre-gl` | `>=5 <7` | `lr-geojson-viewer`, `lr-map` |
59
59
  | `marked` | `^18.0.11` | `lr-agent-workspace`, `lr-dashboard-grid`, `lr-eval-run`, `lr-markdown`, `lr-markdown-core`, `lr-message-parts`, `lr-notebook-viewer`, `lr-rag-answer`, `lr-streaming-text`, `lr-streaming-text-core`, `lr-widget-renderer` |
60
60
  | `papaparse` | `^5.7.0` | `lr-csv-viewer`, `lr-dataset-viewer` |
61
61
  | `pdfjs-dist` | `^6.3.289` | `lr-pdf-viewer` |
62
- | `postal-mime` | `^3.0.1 || ^4.0.0` | `lr-email-viewer` |
62
+ | `postal-mime` | `^3.0.1 \|\| ^4.0.0` | `lr-email-viewer` |
63
63
  | `qrcode` | `^1.5.4` | `lr-qr-code` |
64
64
  | `react` | `>=19 <20` | type-only `@aceshooting/lyra-ui/custom-elements-jsx` entry (no runtime import) |
65
65
  | `shiki` | `^4.4.3` | `lr-agent-workspace`, `lr-change-review`, `lr-code-block`, `lr-code-block-core`, `lr-dashboard-grid`, `lr-diff-view`, `lr-document-compare`, `lr-eval-result`, `lr-eval-run`, `lr-markdown`, `lr-markdown-core`, `lr-message-parts`, `lr-notebook-viewer`, `lr-rag-answer`, `lr-streaming-text`, `lr-streaming-text-core`, `lr-widget-renderer` |
@@ -505,7 +505,8 @@ page you are on — that is what keeps two overlapping surfaces reading in the c
505
505
 
506
506
  ### Cascade layers
507
507
 
508
- `theme.css` declares its layer order up front, then puts all of its own tokens in `lr-theme`:
508
+ `theme.css` declares its layer order up front, with base inputs in `lr-theme` and built-in profile
509
+ rules in the `lr-theme-preset` sublayers:
509
510
 
510
511
  ```css
511
512
  @layer lr-base, lr-theme, lr-theme-preset, lr-utilities, lr-overrides;
@@ -513,9 +514,10 @@ page you are on — that is what keeps two overlapping surfaces reading in the c
513
514
 
514
515
  - **`lr-base`** — contains the explicitly scoped native-element rules only when the optional
515
516
  `native.css` asset is imported.
516
- - **`lr-theme`** — where every `--lr-theme-*` token `theme.css` ships is declared.
517
- - **`lr-theme-preset`** — the compatibility layer name that holds optional look stylesheets, such as
518
- [`looks/shadcn.css`](#the-shadcn-look--looksshadcncss). Empty unless one is imported.
517
+ - **`lr-theme`** — contains the base theme inputs and token resolvers.
518
+ - **`lr-theme-preset`** — the compatibility layer name for look, density, surface, accent and mode
519
+ rules. `theme.css` already supplies the built-in Shadcn, Glass and Emerald profile here; optional
520
+ look stylesheets add their own rules to the same sublayers.
519
521
  - **`lr-utilities`** — contains exact `lr-*` classes only when the optional `utilities.css` asset is
520
522
  imported.
521
523
  - **`lr-overrides`** — named so an application can opt its own rules into a defined position
@@ -574,17 +576,25 @@ reason.
574
576
 
575
577
  ### The shadcn look — looks/shadcn.css
576
578
 
577
- Import the base resolver and the optional look stylesheet, then select the look on the scope that should receive it:
579
+ `theme.css` already installs Shadcn as the built-in default and supports explicit
580
+ `data-lr-look="shadcn"` scopes. Import it once; the separate Shadcn sheet is unnecessary for this
581
+ profile:
578
582
 
579
583
  ~~~ts
580
584
  import "@aceshooting/lyra-ui/theme.css";
581
- import "@aceshooting/lyra-ui/looks/shadcn.css";
582
585
  import { setLyraStyle } from "@aceshooting/lyra-ui/theme.js";
583
586
 
584
587
  setLyraStyle({ look: "shadcn" });
585
588
  ~~~
586
589
 
587
- The stylesheet declares values only under data-lr-look="shadcn". It composes with the independent mode, surface, density, and accent axes. For a local region, set data-lr-look="shadcn" on that region or use applyLyraStyleScope(). A nested data-lr-mode="dark" still changes mode without changing the look.
590
+ Shadcn composes with the independent mode, surface, density and accent axes. For a local region,
591
+ set data-lr-look="shadcn" on that region or use applyLyraStyleScope(). A nested data-lr-mode="dark"
592
+ still changes mode without changing the look.
593
+
594
+ The separate `looks/shadcn.css` sheet remains compatible. Besides the same scoped look values, it
595
+ adds legacy `.light` and `.dark` mode aliases inside a Shadcn scope. Import that sheet only when
596
+ those aliases are needed; prefer `data-lr-mode`, `data-lr-theme` or `.lr-light`/`.lr-dark` for new
597
+ code. Explicit Lyra mode selectors on the same element take precedence over the compatibility aliases.
588
598
 
589
599
  The look sets --lr-theme-* inputs, so no component API changes. Its rules use Lyra's named cascade layers: unlayered application rules still win, and runtime accent ramps still take precedence over look values for the roles they paint. Import order between theme.css and looks/shadcn.css does not change the layer order.
590
600
 
@@ -602,7 +612,9 @@ Override the look through an unlayered application rule or the lr-overrides laye
602
612
  }
603
613
  ~~~
604
614
 
605
- The former global themes/shadcn.css facade and its data-lr-theme-preset behavior have been removed. Use looks/shadcn.css and the data-lr-look axis for new styling.
615
+ The former global themes/shadcn.css facade and its data-lr-theme-preset behavior have been removed.
616
+ Use theme.css and the data-lr-look axis for new styling; looks/shadcn.css is needed only for the
617
+ compatibility aliases above.
606
618
 
607
619
  ### Where an override actually reaches
608
620
 
@@ -845,7 +857,7 @@ bytes; build plugins must not prepend the bootstrap ahead of it.
845
857
 
846
858
  For a strict CSP that disallows inline scripts, the package also publishes theme-bootstrap.js, a classic script asset with identical bytes. Load it synchronously after the charset declaration and before stylesheets. Its optional data-lr-theme-storage-key and data-lr-theme-attributes attributes select an application-owned storage key or mode-attribute list; values are validated and fall back to defaults when invalid.
847
859
 
848
- **Migrating the retired theme facade.** New code uses setLyraStyle() and getLyraStyle(). Map old auto mode to system, an old surface reference color to accentBackground, and an old token map to overrides; review custom CSS colors that share a gemstone name before choosing a named accent. Replace preset definitions with a LyraLook plus explicit style choices. Replace selectors for data-lr-theme-preset with the actual axis they need, such as data-lr-look="shadcn". Import looks/shadcn.css in place of the removed fixed themes/shadcn.css facade and select the look with setLyraStyle({ look: "shadcn" }) or a scoped data-lr-look attribute. Listen for lr-style-change and read event.detail.style and event.detail.changed; the old theme and preset events are no longer emitted. For the complete project-by-project sequence, see [Upgrading from v23 to v24](v23-to-v24-migration.md).
860
+ **Migrating the retired theme facade.** New code uses setLyraStyle() and getLyraStyle(). Map old auto mode to system, an old surface reference color to accentBackground, and an old token map to overrides; review custom CSS colors that share a gemstone name before choosing a named accent. Replace preset definitions with a LyraLook plus explicit style choices. Replace selectors for data-lr-theme-preset with the actual axis they need, such as data-lr-look="shadcn". Import theme.css in place of the removed fixed themes/shadcn.css facade and select the look with setLyraStyle({ look: "shadcn" }) or a scoped data-lr-look attribute. Listen for lr-style-change and read event.detail.style and event.detail.changed; the old theme and preset events are no longer emitted. For the complete project-by-project sequence, see [Upgrading from v23 to v24](v23-to-v24-migration.md).
849
861
 
850
862
  Historical v1 stored records remain readable by the runtime and bootstrap. The removed JavaScript functions, preset subpaths, preset event, root marker, and fixed stylesheet are not available in the current API.
851
863
 
@@ -897,10 +909,8 @@ mode and accent; the axes compose independently.
897
909
 
898
910
  ```js
899
911
  import '@aceshooting/lyra-ui/theme.css';
900
- import '@aceshooting/lyra-ui/looks/shadcn.css';
901
912
  import '@aceshooting/lyra-ui/looks/material.css';
902
913
  import '@aceshooting/lyra-ui/density.css';
903
- import '@aceshooting/lyra-ui/surfaces/glass.css';
904
914
  import '@aceshooting/lyra-ui/accents.css';
905
915
  import { setLyraStyle, resetLyraStyle, applyLyraStyleScope } from '@aceshooting/lyra-ui/theme.js';
906
916
 
@@ -918,7 +928,8 @@ inherit), without persistence or global events; clearing preserves later author
918
928
  reports requested axes and resolved mode.
919
929
 
920
930
  Set `data-lr-look`, `data-lr-surface`, `data-lr-density`, `data-lr-mode` and `data-lr-accent`
921
- directly if needed. Stylesheet look ids need their sheet; arbitrary ids neither load nor register.
931
+ directly if needed. Shadcn and Lyra are included in `theme.css`; other stylesheet look ids need
932
+ their optional sheet. Arbitrary ids neither load nor register.
922
933
  `defineLyraLook({ id, tokens })` defines a validated immutable runtime look;
923
934
  `lyraLookCss()` from `theme/look-css.js` creates CSS without DOM access. In app-owned shadow roots
924
935
  with local boundaries, install `theme.css` and selected sheets; selectors stop at roots, inheritance
@@ -1124,12 +1135,18 @@ The public `--lr-theme-surface-opacity` input accepts 0 through 1. Lower opacity
1124
1135
  of the backdrop; the default foreground qualification covers 70%, while a custom lower setting
1125
1136
  cannot guarantee contrast against every backdrop. Solid and accessibility preferences retain
1126
1137
  opaque fills regardless of this input.
1127
- Quiet text, necessary control edges, focus indicators and transparent actions gain a local
1138
+ Necessary control borders use the effective painted opacity: their glass adjustment grows as
1139
+ transparency increases and disappears at 100% opacity. Ordinary and strong borders share this
1140
+ adjustment; decorative borders and explicit component border overrides keep their own tokens.
1141
+ Quiet text, focus indicators and transparent actions retain their separate local
1128
1142
  contrast-qualified foreground; opaque accent fills retain their own on-colours. Supported chrome
1129
1143
  includes app rails, navigation menus, menubars, menus and their context-menu composition, popovers,
1130
1144
  selection toolbars, toast items and the owned playback-rate toolbar of `lr-av-player`. Nested glass
1131
1145
  chrome is opaque, preventing repeated blur. Independently promoted menus and modal panels start a
1132
- new material root. Content cards and editing fields remain opaque.
1146
+ new material root. Surface-colored outlined card and disclosure interiors let nested Lyra
1147
+ controls use their solid border colors while preserving the enclosing edge against glass.
1148
+ Filled accent interiors retain qualification. Native descendants retain inherited public color
1149
+ aliases. Custom translucent content fills require the author to choose suitable control borders.
1133
1150
  A design panel can offer a Glass opacity range from 0–100%, shown when the selected surface is
1134
1151
  Glass. Start and reset it at 70%; convert the displayed percentage to the public token's 0–1 range.
1135
1152
  Apply this CSS input independently of look overrides: `setLyraStyle()` does not accept surface