@aceshooting/lyra-ui 9.0.0 → 9.1.1

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 (110) hide show
  1. package/CHANGELOG.md +369 -0
  2. package/README.md +9 -2
  3. package/custom-elements.json +1 -1
  4. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +1 -1
  5. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.class.js +1 -1
  6. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.styles.js +2 -2
  7. package/dist/components/agent-tools/agent-run/agent-run.class.js +1 -1
  8. package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts +1 -0
  9. package/dist/components/agent-tools/agent-trace/agent-trace.class.js +1 -1
  10. package/dist/components/agent-tools/browser-frame/browser-frame.class.js +1 -1
  11. package/dist/components/agent-tools/commit-card/commit-card.class.js +1 -1
  12. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
  13. package/dist/components/agent-tools/context-inspector/context-inspector.class.js +1 -1
  14. package/dist/components/agent-tools/eval-result/eval-result.class.js +1 -1
  15. package/dist/components/agent-tools/policy-summary/policy-summary.class.js +1 -1
  16. package/dist/components/agent-tools/schema-viewer/schema-viewer.styles.js +2 -2
  17. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +1 -1
  18. package/dist/components/agent-tools/subagent-panel/subagent-panel.styles.js +1 -1
  19. package/dist/components/agent-tools/task-list/task-list.class.js +2 -2
  20. package/dist/components/agent-tools/test-results/test-results.class.js +1 -1
  21. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.js +1 -1
  22. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +2 -2
  23. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.js +2 -2
  24. package/dist/components/agent-tools/trace-tree/trace-tree.class.js +2 -2
  25. package/dist/components/charts/chart/bar-chart.class.js +1 -1
  26. package/dist/components/charts/chart/bubble-chart.class.js +1 -1
  27. package/dist/components/charts/chart/chart.class.js +1 -1
  28. package/dist/components/charts/chart/doughnut-chart.class.js +1 -1
  29. package/dist/components/charts/chart/histogram.class.js +1 -1
  30. package/dist/components/charts/chart/line-chart.class.js +1 -1
  31. package/dist/components/charts/chart/lite-chart.class.js +1 -1
  32. package/dist/components/charts/chart/pie-chart.class.js +1 -1
  33. package/dist/components/charts/chart/polar-area-chart.class.js +1 -1
  34. package/dist/components/charts/chart/radar-chart.class.js +1 -1
  35. package/dist/components/charts/chart/scatter-chart.class.js +1 -1
  36. package/dist/components/conversation/chat-message/chat-message.class.js +2 -2
  37. package/dist/components/conversation/chat-message/chat-message.styles.js +6 -0
  38. package/dist/components/conversation/chat-viewport/chat-viewport.class.js +1 -1
  39. package/dist/components/conversation/generation-metrics/generation-metrics.class.js +2 -2
  40. package/dist/components/conversation/realtime-session/realtime-session.styles.js +1 -1
  41. package/dist/components/conversation/thread-list/thread-list.styles.js +9 -0
  42. package/dist/components/conversation/usage-badge/usage-badge.class.js +1 -1
  43. package/dist/components/data/file-tree/file-tree.class.js +1 -1
  44. package/dist/components/data/heatmap/heatmap.class.d.ts +1 -1
  45. package/dist/components/data/heatmap/heatmap.class.js +1 -1
  46. package/dist/components/data/pagination/pagination.class.js +1 -1
  47. package/dist/components/data/table/table.class.js +1 -1
  48. package/dist/components/forms/button/button.styles.js +1 -1
  49. package/dist/components/forms/checkbox-group/checkbox-group.class.js +1 -1
  50. package/dist/components/forms/combobox/combobox.class.js +1 -1
  51. package/dist/components/forms/emoji-picker/emoji-picker.class.js +1 -1
  52. package/dist/components/forms/input/time-input.class.js +1 -1
  53. package/dist/components/forms/switch/switch.styles.js +3 -1
  54. package/dist/components/layout/card/card.styles.js +2 -2
  55. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js +1 -1
  56. package/dist/components/layout/drilldown-panel/drilldown-panel.class.d.ts +1 -0
  57. package/dist/components/layout/filter-bar/filter-bar.class.js +1 -1
  58. package/dist/components/layout/multi-split/multi-split.class.js +1 -1
  59. package/dist/components/layout/multi-split/multi-split.styles.js +29 -9
  60. package/dist/components/media/attachment-chip/attachment-chip.class.js +2 -2
  61. package/dist/components/media/attachment-trigger/attachment-trigger.class.d.ts +1 -1
  62. package/dist/components/media/attachment-trigger/attachment-trigger.class.js +2 -2
  63. package/dist/components/media/attachment-trigger/attachment-trigger.styles.js +2 -2
  64. package/dist/components/media/file-icon/file-icon.class.js +1 -1
  65. package/dist/components/media/file-input/file-input.class.js +1 -1
  66. package/dist/components/media/flag/flag.class.js +1 -1
  67. package/dist/components/media/lightbox/lightbox.styles.js +2 -0
  68. package/dist/components/overlays/callout/callout.styles.js +2 -2
  69. package/dist/components/overlays/kbd/kbd.class.js +1 -1
  70. package/dist/components/overlays/overlay/popover.class.js +2 -2
  71. package/dist/components/overlays/overlay/tooltip.class.js +2 -2
  72. package/dist/components/overlays/popup/popup.class.js +2 -2
  73. package/dist/components/overlays/spinner/spinner.styles.js +2 -2
  74. package/dist/components/retrieval/citation-badge/citation-badge.class.js +1 -1
  75. package/dist/components/retrieval/claim-evidence/claim-evidence.class.js +1 -1
  76. package/dist/components/retrieval/entity-card/entity-card.class.d.ts +1 -0
  77. package/dist/components/retrieval/entity-dossier/entity-dossier.class.d.ts +1 -0
  78. package/dist/components/retrieval/entity-dossier/entity-dossier.class.js +1 -1
  79. package/dist/components/retrieval/graph/graph.class.d.ts +1 -0
  80. package/dist/components/retrieval/graph-legend/graph-legend.class.d.ts +1 -0
  81. package/dist/components/retrieval/grounding-summary/grounding-summary.class.js +2 -2
  82. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +1 -0
  83. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.styles.js +11 -0
  84. package/dist/components/retrieval/memory-panel/memory-panel.class.d.ts +1 -1
  85. package/dist/components/retrieval/memory-panel/memory-panel.class.js +1 -1
  86. package/dist/components/retrieval/provenance-panel/provenance-panel.class.d.ts +1 -1
  87. package/dist/components/retrieval/provenance-panel/provenance-panel.class.js +1 -1
  88. package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js +1 -1
  89. package/dist/components/retrieval/source-picker/source-picker.class.js +1 -1
  90. package/dist/components/viewers/archive-viewer/archive-viewer.class.js +1 -1
  91. package/dist/components/viewers/contact-viewer/contact-viewer.class.js +1 -1
  92. package/dist/components/viewers/document-compare/document-compare.class.js +1 -1
  93. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +1 -1
  94. package/dist/internal/dev-mode-attribute-warning.d.ts +7 -0
  95. package/dist/internal/dev-mode-attribute-warning.js +1 -0
  96. package/dist/internal/lyra-element.js +1 -1
  97. package/dist/internal/package-metadata.d.ts +1 -1
  98. package/dist/internal/package-metadata.js +1 -1
  99. package/llms/components/lr-archive-viewer.md +5 -0
  100. package/llms/components/lr-attachment-trigger.md +2 -2
  101. package/llms/components/lr-ebook-viewer.md +3 -0
  102. package/llms/components/lr-heatmap.md +1 -1
  103. package/llms/index.md +1 -1
  104. package/llms/migration.md +3 -3
  105. package/llms/peers.md +1 -1
  106. package/llms/shared.md +13 -0
  107. package/llms-full.txt +24 -3
  108. package/package.json +5 -3
  109. package/vscode-html-data.json +1 -1
  110. package/web-types.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,374 @@
1
1
  # Changelog
2
2
 
3
+ ## 9.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 3de3498: Document 18 additive public surface additions from 9.0.0 that had no changelog entry:
8
+
9
+ - `<lr-chip>`: new `end` slot (trailing content, typically an icon, after the label).
10
+ - `<lr-claim-evidence>`: new `compact` and `frame` properties.
11
+ - `<lr-code-editor>`: new `size` property.
12
+ - `<lr-ebook-viewer>`, `<lr-pptx-viewer>`, `<lr-spreadsheet-viewer>`: new `maxHeight` property on
13
+ each.
14
+ - `<lr-token-input>`: new `start` and `end` adornment slots.
15
+ - New CSS custom-property indirection (a themeable `--lr-*` hook backing a previously
16
+ hardcoded/token-only value) on `<lr-dock-panel>`, `<lr-retrieval-compare>`,
17
+ `<lr-spreadsheet-viewer>`, `<lr-stream-status>`, `<lr-code-block>`/`<lr-code-block-core>`,
18
+ `<lr-page-rail>`, and `<lr-pdf-viewer>`.
19
+
20
+ All 18 are additive and backward-compatible — nothing removed or renamed, no behavior change when
21
+ left unset — but none were individually called out in the 9.0.0 changelog entry, unlike the many
22
+ other opt-in additions from the same release that are documented by exact component/property name.
23
+ - d04b07e: Document six cancelable pre-mutation events added in 9.0.0 with no changelog entry:
24
+ `<lr-dock-panel>`'s `lr-collapse-request`, `<lr-widget>`'s `lr-collapse-request`,
25
+ `lr-fullscreen-request`, and `lr-view-request`, `<lr-page>`'s `lr-nav-toggle`, and
26
+ `<lr-split-panel>`'s `lr-reposition-request`.
27
+
28
+ 9.0.0 added a consistent propose-then-commit event pair to several components that previously
29
+ only fired a single post-commit notification: a new cancelable `*-request` event fires first with
30
+ the proposed next state, and a consumer's `preventDefault()` on it now vetoes the change before
31
+ the existing non-cancelable `*-change`/completion event fires. `<lr-dock-panel>` gained
32
+ `lr-collapse-request` alongside its existing `lr-collapse-change`; `<lr-widget>` gained its own,
33
+ independent `lr-collapse-request` (alongside `lr-collapse-change`) plus `lr-fullscreen-request`
34
+ and `lr-view-request` (alongside `lr-fullscreen-change`/`lr-view-change`); `<lr-page>` gained
35
+ `lr-nav-toggle`, its first event of any kind; `<lr-split-panel>` gained `lr-reposition-request`
36
+ alongside its existing `lr-reposition` post-commit event. All six are genuine new opt-in public
37
+ API — a consumer can now veto a collapse, fullscreen, view, nav-open, or divider-reposition
38
+ mutation before it commits — but none were called out in the 9.0.0 changelog entry, unlike the
39
+ many other opt-in additions from the same release that are individually documented by name.
40
+ - 7bcef3e: Document further additive 9.0.0 public surface that had no changelog entry, found auditing the
41
+ two largest 9.0.0 remediation commits:
42
+
43
+ - `<lr-context-inspector>`: five new events — `lr-error`, `lr-copy-error`, `lr-export-error`,
44
+ `lr-show`, `lr-hide` (all from its embedded copy/export controls).
45
+ - `<lr-graph>`: eight categorical fallback CSS custom properties, `--lr-graph-cat-1` through
46
+ `--lr-graph-cat-8`, backing the default node-type color palette.
47
+ - `<lr-tag>`: new `lr-remove` event (non-cancelable notification that the remove button was
48
+ activated).
49
+ - `<lr-rating>`: new `focus`/`blur` native-passthrough events, `focus()`/`blur()`/`click()`
50
+ methods, and `base`/`rating` csspart compatibility aliases (same node, two names).
51
+ - A long tail of new, narrowly-scoped CSS custom properties (visual tokens only, no new
52
+ interaction surface) on `<lr-activity-feed>`, `<lr-prompt-studio>`, `<lr-task-list>`,
53
+ `<lr-tool-approval-dialog>`, `<lr-tool-param-form>`, `<lr-push-to-talk>`, `<lr-flow-controls>`,
54
+ `<lr-menu-item>`, `<lr-chip-group>`, and further `<lr-rating>` properties; plus new slot aliases
55
+ on `<lr-prompt-input>` (`start`/`leading`/`end`/`trailing`) and `<lr-push-to-talk>`
56
+ (`microphone-icon`/`icon`), and new cssparts on `<lr-model-select>`, `<lr-push-to-talk>`, and
57
+ `<lr-source-picker>`.
58
+
59
+ All additive and backward-compatible — nothing removed or renamed, no behavior change when left
60
+ unset.
61
+ - d59f8c5: Fix `<lr-button>`'s start/end adornments claiming a 40%-of-row flex-basis instead of just being
62
+ capped at 40%.
63
+
64
+ A 9.0.0 change gave `[part~="start"]`/`[part~="end"]` `flex: 0 1 40%`, which sets the flex
65
+ *basis* to 40% of the button's own internal row -- a preferred size the flex algorithm tries to
66
+ honor before shrinking -- not merely `max-inline-size: 40%`'s ceiling. Because the basis is
67
+ self-referential (relative to the button's own internal row, unrelated to its position in the
68
+ page), even a small icon claimed a 40% preferred share before shrinking, squeezing
69
+ `[part="label"]`'s `flex: 1 1 auto` below what its text needed and ellipsizing labels that had
70
+ room to spare, with visible unused space left in the row. Adornments now use `flex: 0 0 auto`
71
+ (content-sized); `max-inline-size: 40%` remains as the actual cap for a genuinely oversized
72
+ adornment.
73
+ - f7de4a5: Fix the same `overflow-wrap: anywhere` mid-word-break defect already fixed across seven other
74
+ components (see the `overflow-wrap-anywhere-sibling-components` and `switch-label-break-word`
75
+ changesets) in `<lr-card>` too — a straggler that remediation pass missed. Both `[part="body"]`
76
+ and a slotted `[slot="header"]` collapsed their min-content contribution to near nothing while
77
+ sitting as a flex item next to a non-shrinking sibling, splitting an ordinary short word mid-
78
+ syllable instead of wrapping at the space before it. `overflow-wrap: break-word` gives the
79
+ identical last-resort rescue for a genuinely unbreakable long token without that regression.
80
+ - e57c135: Fix `<lr-chat-message>`'s `[part='actions']` pinning its footer actions to the inline end
81
+ regardless of `message-role`, detaching an assistant/system turn's copy/regenerate controls from
82
+ their own start-aligned (and often transparent-background) bubble. `[part='actions']` now scopes
83
+ its `margin-inline-start: auto` to `message-role="user"` and adds the mirrored
84
+ `margin-inline-end: auto` for `assistant`/`system`, matching the role-conditional alignment
85
+ `[part='bubble']` already uses. `actions-position="outside"` is unaffected for every role.
86
+ - f7de4a5: Fix `<lr-checkbox-group>` occasionally leaking a child `<lr-checkbox>`'s own raw `lr-change`
87
+ (`{checked, value}`-shaped detail) to an ancestor listener, ahead of the group's own translated
88
+ `lr-change` (`{value: string[]}`-shaped detail) — two events instead of one, the first the wrong
89
+ shape. `onChildEvent`'s `stopImmediatePropagation()` only protects a listener that runs *after* it;
90
+ the internal listener was registered on the default bubble phase in `connectedCallback()`, which
91
+ only outraces a consumer's *own* bubble-phase listener when that listener happens to be registered
92
+ later. A Lit `@lr-change=${...}` template binding — the common case — attaches its listener while
93
+ the element is still a disconnected fragment, before `connectedCallback` ever runs, so it saw the
94
+ unstopped child event first. The internal listener now runs in the capture phase instead, which
95
+ always completes before any bubble-phase listener on the same node fires, regardless of
96
+ registration order.
97
+ - 7d2ad99: Fix `<lr-dashboard-grid>`'s auto-created default `<lr-widget>` cell tripping the dev-mode
98
+ unknown-attribute diagnostic. The component marked its own library-created default cell with a
99
+ plain `cell-id` attribute — the same name used for the public, author-facing routing attribute a
100
+ consumer writes on their own light-DOM children (`<div cell-id="a">`), but `cell-id` isn't (and
101
+ shouldn't be) a real `<lr-widget>` property, since `lr-widget` is a general-purpose component with
102
+ no concept of dashboard-grid cells. The auto-created default cell now carries `data-cell-id`
103
+ instead — internal bookkeeping through the universally dev-mode-exempt `data-*` prefix, consistent
104
+ with the existing `data-dashboard-grid-default-cell` marker on the same element — while
105
+ author-authored content continues to use the public `cell-id` attribute unchanged.
106
+ - 7a03421: Add a dev-mode console warning when an `lr-*` element is connected with an attribute it doesn't
107
+ observe.
108
+
109
+ A typo'd or renamed attribute previously failed silently: the browser stores it inertly, the
110
+ component keeps rendering its default, and nothing signals the mismatch, in any environment. In
111
+ development only -- gated on Lit's own dev-mode signal (`globalThis.litIssuedWarnings`, already
112
+ populated whenever a consumer's bundler resolves `lit`'s `development` build, exactly as it
113
+ already does for Lit's own dev-mode warnings) -- each `lr-*` component now warns once per
114
+ `(tag, attribute-name)` for an attribute outside its observed set, with a did-you-mean suggestion
115
+ when a close match exists: `` `<lr-lite-chart>: unknown attribute 'hide-axis' — did you mean
116
+ 'without-value-axis'?` ``. Global HTML attributes (`class`, `id`, `style`, `hidden`, `slot`,
117
+ `part`, ...), `data-*`, and `aria-*` are always exempt. No production behavior change -- the
118
+ check is fully inert when Lit's own dev-mode signal isn't present.
119
+
120
+ Scoped to attributes only; an unrecognized `.property =` write is not detected (there is no safe
121
+ way to intercept it generically without either enumerating instance properties -- which floods
122
+ false positives against this codebase's extensive use of TypeScript's `private` keyword for
123
+ internal state -- or wrapping every instance in a Proxy, which cannot intercept parser-driven
124
+ custom-element upgrades).
125
+ - e57c135: Fix `<lr-heatmap>` silently substituting the built-in fallback ramp color whenever
126
+ `--lr-heatmap-scale-lo`/`-hi` (or a `colorSteps` entry) was set to a modern CSS color function --
127
+ `color-mix()`, `oklch()`, `lab()`, `color(display-p3 ...)`, etc. -- with no warning. `resolveRgb()`
128
+ previously re-parsed the canvas's `ctx.fillStyle` read-back as a string (hex or `rgb()`/`rgba()`
129
+ only), which neither recognizes the `color(srgb r g b [/ a])` form Chromium normalizes
130
+ `color-mix()` to, nor the literal `oklch()`/`lab()`/`color(display-p3 ...)` syntax canvas
131
+ round-trips as-is for those functions. It now falls back to reading the actual rendered pixel back
132
+ via `getImageData(0, 0, 1, 1)` -- the same idiom already used in `theme.ts`/`shiki-dark-theme.ts`/
133
+ `color-core.ts` -- resolving any CSS color syntax the canvas accepts instead of only the forms a
134
+ hand-written parser recognizes. A genuinely invalid color string is unaffected: it still triggers
135
+ `warnInvalidColor()` and falls back.
136
+ - 3a9ae9d: Fix `<lr-knowledge-graph-explorer>`'s composed legend starving the graph pane when `nodeTypes` is long.
137
+
138
+ The explorer's flex column gives `[part='graph']` `flex: 1 1 auto; min-block-size: 0` so it's the
139
+ one part designed to shrink, but `[part='legend']` had no size cap — browser-default flex-item
140
+ sizing floors it at its full content height, so a `nodeTypes` list long enough to exceed the
141
+ host's allocated height pushed 100% of the shrinkage onto the graph pane instead, silently
142
+ ignoring the documented `height` property. `[part='legend']` now caps at `var(--lr-size-12rem)`
143
+ and scrolls internally past that, matching the existing `[part='search-results']` pattern in the
144
+ same stylesheet.
145
+ - fa7b8a1: Fix `<lr-lightbox>`'s caption starving the stage when it's unusually long.
146
+
147
+ `[part='stage']` is `flex: 1 1 auto; min-block-size: 0` — the one part designed to shrink — but
148
+ `[part='caption']` had no size cap, so an unusually long caller-supplied caption could floor at
149
+ its full multi-line content height and squeeze the stage's allocation. `[part='caption']` now
150
+ caps at `var(--lr-size-8rem)` and scrolls internally past that. Same mechanism, same fix shape, as
151
+ `<lr-knowledge-graph-explorer>`'s composed-legend fix in this same release.
152
+ - 53ad948: Raise the optional `marked` peer dependency's lower bound to `^18.0.10` (was `^18.0.9`), picking
153
+ up an upstream patch release. Affects every Markdown-rendering component that declares `marked` as
154
+ an optional peer: `lr-agent-workspace`, `lr-dashboard-grid`, `lr-eval-run`, `lr-markdown`,
155
+ `lr-markdown-core`, `lr-message-parts`, `lr-notebook-viewer`, `lr-rag-answer`,
156
+ `lr-streaming-text`, and `lr-widget-renderer`.
157
+ - f7de4a5: Fix `<lr-multi-split>`'s `'floating'` collapse state requiring `!important` to override its
158
+ drawer's `position`/`inset-block`/`inset-inline-start`/`inset-inline-end`. All four were applied
159
+ as owned *inline* styles — always higher cascade priority than any external stylesheet rule,
160
+ regardless of specificity — even though their floating-state value is always the same fixed
161
+ literal (`absolute`, `0`), never per-render computed data. They're ordinary (overridable)
162
+ stylesheet rules now, keyed off the already-reflected `collapse` host attribute and the panel's
163
+ existing `data-collapse-state="floating"` marker, so a consumer's own CSS wins at normal
164
+ specificity. `flex`/`order`/`inline-size` are unaffected and stay inline: `inline-size` in
165
+ particular is intentionally live, mirroring the panel's own draggable `sizes` percentage so there's
166
+ no visual jump un-floating — a consumer wanting a different floating *width* should set `.sizes`
167
+ rather than override the stylesheet rule.
168
+ - 961987b: Document `<lr-multi-split>`'s 9.0.0 behavior change: leaving a non-floating collapse state now
169
+ actually clears `open`, a change that shipped without a changelog entry.
170
+
171
+ Before 8.2.3, the component reference already promised: "Leaving 'floating' while `open` is still
172
+ `true` also closes it, the same way `<lr-app-rail>` closes its mobile overlay when leaving
173
+ 'mobile' while open." 8.2.3's compiled class never implemented it — there was no assignment
174
+ clearing `open` anywhere in the collapse path; `this.open = false` appeared only as the property
175
+ initializer.
176
+
177
+ 9.0.0 implemented it, in `applyEffectiveCollapseTransition`: for any transition to a state other
178
+ than `'floating'`, `open` is now cleared. The direction of the fix was correct — the code now
179
+ matches what was always documented — but it shipped silently, and the reference read identically
180
+ in both versions since it described the intended behavior all along, giving no changelog signal
181
+ to grep for.
182
+
183
+ The ordering matters to any `lr-multi-split-collapse-change` handler that reads `open`: the clear
184
+ happens **after** the event fires, not before, so a listener reading `this.open` synchronously
185
+ inside its own handler still sees the pre-clear value.
186
+
187
+ This is the same omission class already retro-documented twice in 9.1.0 (the heatmap
188
+ flat-property-to-`data` collapse, and the tab group's removed `slot`/`label` child model).
189
+ - 22056b1: Fix the same `overflow-wrap: anywhere` mid-word-break defect just fixed in `<lr-switch>` (see the
190
+ sibling `switch-label-break-word` changeset) in six more components, found by auditing the rest of
191
+ the library for the same `overflow-wrap: anywhere` + `min-inline-size: 0` fingerprint on
192
+ natural-language text: `<lr-agent-eval-dashboard>` (heading and run-label text),
193
+ `<lr-realtime-session>` (status text), `<lr-spinner>` (the after-placement label),
194
+ `<lr-schema-viewer>` (name/description/issue text), `<lr-subagent-panel>` (label/task/model text),
195
+ and `<lr-callout>` (content/message text). Same root cause and fix in every case:
196
+ `overflow-wrap: break-word` gives the identical last-resort rescue for a genuinely unbreakable
197
+ long token without collapsing normal min-content sizing, so ordinary text now only wraps when it
198
+ truly cannot fit, and wraps at a word boundary when it does.
199
+ - efb4b9b: Fix `<lr-popover>` and `<lr-tooltip>` getting stuck visible and interactive after closing.
200
+
201
+ Both components drove their popup's `data-hidden` attribute through a Lit declarative template
202
+ binding *and* an imperative direct DOM write to the same attribute, keyed off a plain
203
+ non-reactive private field (`anchorPositioned`). The imperative write silently desynced Lit's own
204
+ dirty-check cache for that attribute part; because neither component's `updated()` lifecycle hook
205
+ repositions on close (only while `open`), a later close transition could evaluate the same
206
+ boolean expression to a value matching Lit's stale cache and skip the DOM write entirely — leaving
207
+ the popup visually and interactively present (`pointer-events: auto`) after every dismissal route
208
+ (trigger click, outside click, Escape, `.hide()`) once it had opened once. `anchorPositioned` is
209
+ now a real reactive `@state()` property in both classes, and the redundant imperative writes are
210
+ removed, making Lit's own render cycle the single source of truth for the attribute.
211
+ - 34c12fa: Harden `<lr-popup>` against the same imperative/declarative attribute-write desync just fixed in
212
+ `<lr-popover>`/`<lr-tooltip>`.
213
+
214
+ `<lr-popup>` shared the identical pattern (`anchorPositioned` as a plain non-reactive field, an
215
+ imperative `toggleAttribute` write alongside a declarative template binding for the same
216
+ `data-active`/`data-awaits-position` attributes) but never exhibited the observable bug, because
217
+ its `updated()` lifecycle hook unconditionally repositions on every update cycle regardless of
218
+ which property changed -- masking any stale-cache skip with a redundant imperative correction on
219
+ the same cycle. `anchorPositioned` is now a real reactive `@state()` property here too, removing
220
+ the fragile reliance on that masking behavior.
221
+ - 03fd04f: Fix `<lr-switch>`'s label/hint/error text breaking mid-syllable, and possibly wrapping, well
222
+ before it runs out of room.
223
+
224
+ The shared `[part="form-control"], [part="label"], [part~="hint"], [part="error"]` rule used
225
+ `overflow-wrap: anywhere`, which -- unlike `overflow-wrap: break-word` -- also collapses the
226
+ element's min-content contribution to essentially a single character. Combined with the same
227
+ rule's `min-inline-size: 0`, an ordinary short label could be squeezed far below its longest
228
+ word's width and forced to split it mid-syllable, even when there was ample room to sit on one
229
+ line or wrap cleanly at a space.
230
+
231
+ Switching to `overflow-wrap: break-word` alone regressed the pre-existing 320px unbreakable-token
232
+ test: without a width propagated down to it, `.switch-layout` (an `inline-flex` box with no
233
+ explicit size) falls back to shrink-to-fit sizing, which can never size narrower than its own
234
+ min-content -- and `break-word` (correctly) keeps that min-content at the token's full width, so
235
+ the layout overflowed its ancestor instead of shrinking into it. Adding `max-inline-size: 100%` to
236
+ both `:host` and `.switch-layout` propagates an ancestor's real constraint all the way down to the
237
+ flex layout, fixing the overflow. `min-inline-size: 0` was deliberately *not* added to either of
238
+ those two rules: leaving their automatic minimum size content-based means an outer flex/grid
239
+ ancestor (e.g. a settings-panel row with another sibling control) won't disproportionately squeeze
240
+ the switch below its longest word's width the way `overflow-wrap: anywhere`'s near-zero min-content
241
+ let it -- at the cost of the row overflowing slightly rather than breaking a word, which is the
242
+ tradeoff `break-word` intends.
243
+ - f7de4a5: Fix `<lr-thread-list>`'s exported `row-start`/`row-actions` parts sitting on the row's inline text
244
+ baseline (adding descender strut height above and below) instead of vertically centering their
245
+ `renderStart`/`renderActions` adornment content. Both parts are plain `<span>`s and default to
246
+ `display: inline`; they are now `display: inline-flex; align-items: center`, matching every other
247
+ adornment slot in the library. `row-content`/`row-meta`, which hold real text, are unaffected.
248
+
249
+ ## 9.1.0
250
+
251
+ ### Minor Changes
252
+
253
+ - b027f44: Re-export `LyraNodeTypeStyle` from every component module whose public API types a property
254
+ against it (`lr-graph`, `lr-knowledge-graph-explorer`, `lr-drilldown-panel`, `lr-agent-trace`,
255
+ `lr-entity-dossier`, `lr-entity-card`, `lr-memory-panel`, `lr-provenance-panel`,
256
+ `lr-graph-legend`). The type was previously only reachable from the package root barrel
257
+ (`@aceshooting/lyra-ui`'s `LyraNodeTypeStyle` export); a consumer importing one of these
258
+ components from its own granular subpath, as this library's own examples do, had no local type
259
+ to import against and had to either duplicate the shape by hand or reach into the disallowed
260
+ `internal/` path.
261
+ - d8fe77e: Restore `./components/viewers/archive-viewer/archive-viewer-register.js` and
262
+ `./components/viewers/ebook-viewer/ebook-viewer-register.js` as importable package subpaths. Both
263
+ files register a `<lr-document-viewer>` renderer (`application/zip`/`.zip` and
264
+ `application/epub+zip`/`.epub` respectively) and are genuinely opt-in for a granular consumer not
265
+ using the `all.js` compatibility bundle. Neither had an entry in `package.json`'s `exports` map, so
266
+ the documented import pattern (matching `flag-peer.js`'s precedent) hit
267
+ `ERR_PACKAGE_PATH_NOT_EXPORTED` even though both files ship in `dist/` and are correctly declared in
268
+ `sideEffects` — the same defect class as the historical `flag-peer.js` `sideEffects` omission, this
269
+ time in the exports map instead.
270
+
271
+ ### Patch Changes
272
+
273
+ - c9a9303: Document `<lr-heatmap>`'s flat-property-to-`data` replacement, a 9.0.0 breaking change that shipped
274
+ without a changelog entry.
275
+
276
+ 9.0.0 replaced ten independent top-level `<lr-heatmap>` members with a single discriminated-union
277
+ `data` property. The removed members are `mode`, `days`, `rowLabels`, `colLabels`, `values`,
278
+ `firstDayOfWeek`, `columnX`, `rowY`, `weekdayLabelText`, and `monthLabelText`. They are now fields on
279
+ one of the two `data` branches — `HeatmapMatrixData` (`{ kind: 'matrix', rowLabels, colLabels,
280
+ values }`) or `HeatmapCalendarData` (`{ kind: 'calendar', days, firstDayOfWeek?, columnX?, rowY?,
281
+ weekdayLabelText?, monthLabelText? }`) — united as `HeatmapData` and exported from the package root.
282
+
283
+ There are no runtime aliases, and assigning a removed member is silent: Lit accepts it as an
284
+ unobserved instance property, so the component keeps rendering its default empty grid instead of
285
+ erroring. That silence is why this entry exists — the 9.0.0 notes omitted the change entirely, so a
286
+ consumer grepping the changelog for `HeatmapMatrixData`, `HeatmapCalendarData`, `HeatmapData`, or any
287
+ of the removed member names found nothing and had no way to learn the API had moved.
288
+
289
+ The `data` shape itself is unchanged and intentional; only the changelog record was missing.
290
+ `llms/data.md`'s "9.0 migration" note already carries the full recipe, including the related removal
291
+ of the magic `value-label="value"` localization sentinel:
292
+
293
+ ```js
294
+ // removed in 9.0.0
295
+ el.mode = 'matrix';
296
+ el.rowLabels = ['Mon', 'Tue'];
297
+ el.colLabels = ['00h', '06h'];
298
+ el.values = [
299
+ [1, 2],
300
+ [3, 4],
301
+ ];
302
+
303
+ // 9.0.0 and later
304
+ el.data = {
305
+ kind: 'matrix',
306
+ rowLabels: ['Mon', 'Tue'],
307
+ colLabels: ['00h', '06h'],
308
+ values: [
309
+ [1, 2],
310
+ [3, 4],
311
+ ],
312
+ };
313
+ ```
314
+ - 3f294c1: Fix `<lr-lite-chart>`'s first category label colliding with the bottom y-axis tick.
315
+
316
+ A line chart centres its first category label on `plotX`, so that label always reaches left into the
317
+ y-axis tick column — a measured 5.7px horizontal overlap on both Chromium and Firefox. The only thing
318
+ holding the two apart is the vertical gap between the label row and the bottom tick, which is
319
+ `dominant-baseline="middle"` on the plot floor and therefore hangs half its line box below that floor
320
+ into the label row.
321
+
322
+ That gap was 1.3px on Chromium and **-0.7px on Firefox**, whose line box for the same 10px
323
+ `system-ui` font is 16px against Chromium's 14px. Firefox therefore painted the first x-axis label
324
+ overlapping the `0` tick. Raising `CATEGORY_LABEL_OFFSET` 18 → 24 and `PAD_BOTTOM` 24 → 30 together
325
+ leaves ~5px clear on both engines, comfortably past that 2px cross-engine variation.
326
+
327
+ Because both constants moved by the same amount, the category-label row does not shift: the plot
328
+ floor rises instead, so a chart's labels stay where they were and its plot area is 6px shorter. Charts
329
+ with an `x-label` axis title are unaffected beyond that, since `AXIS_TITLE_SPACE` is measured from
330
+ `padBottom`.
331
+
332
+ Note the truncation width model is unchanged: `displayCategoryLabel()` still estimates fit from
333
+ `APPROX_LABEL_CHARACTER_WIDTH`, so a label's *horizontal* extent remains an approximation rather than
334
+ a measurement. This change makes the label row robust to that approximation being wrong rather than
335
+ making the approximation exact.
336
+ - 7ae8930: Document `<lr-tab-group>`'s removed `slot`/`label` child model, a 9.0.0 breaking change that shipped
337
+ without a changelog entry.
338
+
339
+ 9.0.0 removed the pre-9.0 attribute child model, in which a direct `<div slot="x" label="…">` child
340
+ became a tab captioned by its `label` with its own content as the panel, and a sibling
341
+ `slot="x-icon"` child supplied that tab's leading icon. `<lr-tab-group>` now builds its tab list
342
+ only from `<lr-tab panel="x">` descriptors paired with `<lr-tab-panel name="x">` panels; any other
343
+ child element is skipped regardless of its `slot`/`label` attributes, so markup still written in the
344
+ old shape renders an empty tab strip with no console warning.
345
+
346
+ The removal itself is unchanged and intentional — this entry only records it, because the 9.0.0 notes
347
+ omitted it while `README.md` continued to state that the `slot`/`label` shape "still works
348
+ unchanged". Both README claims are corrected (the 7.x → 8.0.0 rename table and the component/mirror
349
+ table), which also clears the same stale claim from three generated `llms/migration.md` rows
350
+ (`<wa-tab>`, `<wa-tab-panel>`, `<sl-tab-panel>`) and the packaged skill reference. `llms/layout.md`
351
+ already described the removal correctly and is unchanged.
352
+
353
+ To migrate, rewrite each former child as one descriptor plus one panel, folding any former
354
+ `slot="x-icon"` sibling's content into the `<lr-tab>`'s own default slot:
355
+
356
+ ```html
357
+ <!-- removed in 9.0.0 -->
358
+ <lr-tab-group>
359
+ <div slot="general" label="General">General settings</div>
360
+ </lr-tab-group>
361
+
362
+ <!-- 9.0.0 and later -->
363
+ <lr-tab-group>
364
+ <lr-tab panel="general">General</lr-tab>
365
+ <lr-tab-panel name="general">General settings</lr-tab-panel>
366
+ </lr-tab-group>
367
+ ```
368
+
369
+ A regression test now asserts a plain `slot`/`label` child produces no tab and no rendered panel, so
370
+ the behavior cannot drift back into being documented as supported.
371
+
3
372
  ## 9.0.0
4
373
 
5
374
  ### Major Changes
package/README.md CHANGED
@@ -307,7 +307,7 @@ doesn't carry it silently adopts the opposite behavior.
307
307
 
308
308
  | 7.x | 8.0.0 | Also |
309
309
  | ---------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
310
- | `<lr-tabs>` | `<lr-tab-group>` | The `lr-tabs-change` event splits into `lr-tab-hide` (outgoing tab) then `lr-tab-show` (incoming), and `--lr-tabs-*` custom properties become `--lr-tab-group-*`. The group now also accepts `<lr-tab>` / `<lr-tab-panel>` children; the library's own `slot`/`label` panel shape still works unchanged. |
310
+ | `<lr-tabs>` | `<lr-tab-group>` | The `lr-tabs-change` event splits into `lr-tab-hide` (outgoing tab) then `lr-tab-show` (incoming), and `--lr-tabs-*` custom properties become `--lr-tab-group-*`. The group is composed from `<lr-tab>` / `<lr-tab-panel>` children. The library's own `slot`/`label` panel-attribute shape was **removed in 9.0.0** — rewrite each former `<div slot="x" label="…">` child as one `<lr-tab panel="x">` plus one `<lr-tab-panel name="x">`, and fold each former `slot="x-icon"` sibling's content into that `<lr-tab>`'s own default slot (mark a decorative glyph `aria-hidden`, since the tab derives its accessible name from that content). A leftover `slot`/`label` child is skipped silently: the strip renders empty. |
311
311
  | `<lr-tree-node>` | `<lr-tree-item>` | |
312
312
 
313
313
  Neither old name is registered as an alias. A tag that silently keeps working under its old name is
@@ -897,6 +897,13 @@ Build tools can import the published manifest directly through its explicit pack
897
897
  import manifest from '@aceshooting/lyra-ui/custom-elements.json' with { type: 'json' };
898
898
  ```
899
899
 
900
+ A subclass declaration's `cssParts` is always fully flattened (everything inherited included), but
901
+ `attributes`/`members`/`events`/`slots`/`cssProperties` list only a declaration's own entries plus
902
+ any inherited entry it overrides — intentional, since a TypeScript/JS consumer already resolves the
903
+ rest through the generated `.d.ts` `extends` chain. Reading `custom-elements.json` directly for
904
+ those four kinds means walking each declaration's own `superclass` chain, or using the already-
905
+ resolved `web-types.json`/`vscode-html-data.json` above instead.
906
+
900
907
  ## Components
901
908
 
902
909
  The catalog below lists all 284 tags in the current Custom Elements Manifest, grouped by
@@ -1172,7 +1179,7 @@ each one-liner below.
1172
1179
  | `<lr-image-comparer>` | `wa-comparison` / `sl-image-comparer` | Before/after slotted surfaces with a keyboard-accessible range divider |
1173
1180
  | `<lr-pan-zoom>` | — (extra) | Bounded zoom and scrollable panning for slotted content or an image source, preserving Lyra 7's former zoomable-frame behavior |
1174
1181
  | `<lr-zoomable-frame>` | `wa-zoomable-frame` | Sandboxed iframe preview with safe URL forwarding, discrete zoom levels, optional controls/interaction, and same-origin theme synchronization |
1175
- | `<lr-tab-group>` + `<lr-tab>` + `<lr-tab-panel>` | `wa-tab-group` / `wa-tab` / `wa-tab-panel` / `sl-tab-group` / `sl-tab` / `sl-tab-panel` | Tab strip with `placement` (logical `start`/`end` turn it vertical) and `activation="auto"`/`"manual"`; accepts the upstream `<lr-tab>`/`<lr-tab-panel>` child pairs or this library's own `slot`/`label` panel-attribute shape |
1182
+ | `<lr-tab-group>` + `<lr-tab>` + `<lr-tab-panel>` | `wa-tab-group` / `wa-tab` / `wa-tab-panel` / `sl-tab-group` / `sl-tab` / `sl-tab-panel` | Tab strip with `placement` (logical `start`/`end` turn it vertical) and `activation="auto"`/`"manual"`; composed from the upstream `<lr-tab>`/`<lr-tab-panel>` child pairs |
1176
1183
  | `<lr-checkbox>` | `wa-checkbox` / `sl-checkbox` | Boolean form control, `role="checkbox"` with a visual/`indeterminate` mixed state |
1177
1184
  | `<lr-switch>` | `wa-switch` / `sl-switch` | Boolean toggle-switch form control, `role="switch"` on/off semantics |
1178
1185
  | `<lr-menu>` + `<lr-menu-item>` | `sl-menu` / `sl-menu-item` | Anchored dropdown menu around a consumer-supplied trigger; WAI-ARIA "menu button" pattern with real roving focus (not a listbox) |