@aceshooting/lyra-ui 7.7.0 → 7.8.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 (170) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/custom-elements.json +5951 -4326
  3. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.d.ts +4 -0
  4. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.d.ts.map +1 -1
  5. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.js +11 -4
  6. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.js.map +1 -1
  7. package/dist/components/agent-tools/browser-frame/browser-frame.class.d.ts +4 -0
  8. package/dist/components/agent-tools/browser-frame/browser-frame.class.d.ts.map +1 -1
  9. package/dist/components/agent-tools/browser-frame/browser-frame.class.js +13 -4
  10. package/dist/components/agent-tools/browser-frame/browser-frame.class.js.map +1 -1
  11. package/dist/components/agent-tools/commit-card/commit-card.class.d.ts +4 -0
  12. package/dist/components/agent-tools/commit-card/commit-card.class.d.ts.map +1 -1
  13. package/dist/components/agent-tools/commit-card/commit-card.class.js +10 -3
  14. package/dist/components/agent-tools/commit-card/commit-card.class.js.map +1 -1
  15. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts +6 -0
  16. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts.map +1 -1
  17. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +6 -0
  18. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js.map +1 -1
  19. package/dist/components/agent-tools/mcp-app/mcp-app.class.js +1 -1
  20. package/dist/components/agent-tools/mcp-app/mcp-app.class.js.map +1 -1
  21. package/dist/components/agent-tools/stack-trace/stack-trace.class.d.ts.map +1 -1
  22. package/dist/components/agent-tools/stack-trace/stack-trace.class.js +8 -1
  23. package/dist/components/agent-tools/stack-trace/stack-trace.class.js.map +1 -1
  24. package/dist/components/agent-tools/terminal/terminal.class.d.ts +8 -2
  25. package/dist/components/agent-tools/terminal/terminal.class.d.ts.map +1 -1
  26. package/dist/components/agent-tools/terminal/terminal.class.js +12 -4
  27. package/dist/components/agent-tools/terminal/terminal.class.js.map +1 -1
  28. package/dist/components/conversation/code-block/code-block-shared.d.ts.map +1 -1
  29. package/dist/components/conversation/code-block/code-block-shared.js +9 -1
  30. package/dist/components/conversation/code-block/code-block-shared.js.map +1 -1
  31. package/dist/components/conversation/markdown/markdown-core.class.d.ts.map +1 -1
  32. package/dist/components/conversation/markdown/markdown-core.class.js +2 -1
  33. package/dist/components/conversation/markdown/markdown-core.class.js.map +1 -1
  34. package/dist/components/conversation/markdown/markdown-shared.d.ts +6 -1
  35. package/dist/components/conversation/markdown/markdown-shared.d.ts.map +1 -1
  36. package/dist/components/conversation/markdown/markdown-shared.js +6 -3
  37. package/dist/components/conversation/markdown/markdown-shared.js.map +1 -1
  38. package/dist/components/conversation/markdown/markdown.class.d.ts.map +1 -1
  39. package/dist/components/conversation/markdown/markdown.class.js +2 -1
  40. package/dist/components/conversation/markdown/markdown.class.js.map +1 -1
  41. package/dist/components/data/document-library/document-library.class.d.ts +6 -0
  42. package/dist/components/data/document-library/document-library.class.d.ts.map +1 -1
  43. package/dist/components/data/document-library/document-library.class.js +7 -0
  44. package/dist/components/data/document-library/document-library.class.js.map +1 -1
  45. package/dist/components/data/env-list/env-list.class.d.ts.map +1 -1
  46. package/dist/components/data/env-list/env-list.class.js +2 -1
  47. package/dist/components/data/env-list/env-list.class.js.map +1 -1
  48. package/dist/components/data/heatmap/heatmap.class.d.ts +4 -0
  49. package/dist/components/data/heatmap/heatmap.class.d.ts.map +1 -1
  50. package/dist/components/data/heatmap/heatmap.class.js +9 -3
  51. package/dist/components/data/heatmap/heatmap.class.js.map +1 -1
  52. package/dist/components/data/query-builder/query-builder.class.d.ts +4 -0
  53. package/dist/components/data/query-builder/query-builder.class.d.ts.map +1 -1
  54. package/dist/components/data/query-builder/query-builder.class.js +8 -1
  55. package/dist/components/data/query-builder/query-builder.class.js.map +1 -1
  56. package/dist/components/data/table/table.class.d.ts.map +1 -1
  57. package/dist/components/data/table/table.class.js +8 -3
  58. package/dist/components/data/table/table.class.js.map +1 -1
  59. package/dist/components/data/table/table.styles.d.ts.map +1 -1
  60. package/dist/components/data/table/table.styles.js +4 -1
  61. package/dist/components/data/table/table.styles.js.map +1 -1
  62. package/dist/components/data/tree/tree.class.d.ts +4 -0
  63. package/dist/components/data/tree/tree.class.d.ts.map +1 -1
  64. package/dist/components/data/tree/tree.class.js +16 -4
  65. package/dist/components/data/tree/tree.class.js.map +1 -1
  66. package/dist/components/data/word-cloud/word-cloud.class.d.ts +4 -0
  67. package/dist/components/data/word-cloud/word-cloud.class.d.ts.map +1 -1
  68. package/dist/components/data/word-cloud/word-cloud.class.js +7 -1
  69. package/dist/components/data/word-cloud/word-cloud.class.js.map +1 -1
  70. package/dist/components/forms/radio/radio-group.class.d.ts.map +1 -1
  71. package/dist/components/forms/radio/radio-group.class.js +6 -1
  72. package/dist/components/forms/radio/radio-group.class.js.map +1 -1
  73. package/dist/components/forms/radio/radio.class.d.ts.map +1 -1
  74. package/dist/components/forms/radio/radio.class.js +5 -0
  75. package/dist/components/forms/radio/radio.class.js.map +1 -1
  76. package/dist/components/layout/command-palette/command-palette.class.d.ts +7 -0
  77. package/dist/components/layout/command-palette/command-palette.class.d.ts.map +1 -1
  78. package/dist/components/layout/command-palette/command-palette.class.js +45 -7
  79. package/dist/components/layout/command-palette/command-palette.class.js.map +1 -1
  80. package/dist/components/layout/dashboard-grid/dashboard-grid.class.d.ts +3 -0
  81. package/dist/components/layout/dashboard-grid/dashboard-grid.class.d.ts.map +1 -1
  82. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js +19 -2
  83. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js.map +1 -1
  84. package/dist/components/layout/virtual-list/virtual-list.class.d.ts +16 -0
  85. package/dist/components/layout/virtual-list/virtual-list.class.d.ts.map +1 -1
  86. package/dist/components/layout/virtual-list/virtual-list.class.js +26 -7
  87. package/dist/components/layout/virtual-list/virtual-list.class.js.map +1 -1
  88. package/dist/components/media/attachment-chip/attachment-chip.class.d.ts.map +1 -1
  89. package/dist/components/media/attachment-chip/attachment-chip.class.js +5 -1
  90. package/dist/components/media/attachment-chip/attachment-chip.class.js.map +1 -1
  91. package/dist/components/media/av-player/av-player.class.d.ts +8 -4
  92. package/dist/components/media/av-player/av-player.class.d.ts.map +1 -1
  93. package/dist/components/media/av-player/av-player.class.js +14 -8
  94. package/dist/components/media/av-player/av-player.class.js.map +1 -1
  95. package/dist/components/media/zoomable-frame/zoomable-frame.class.d.ts.map +1 -1
  96. package/dist/components/media/zoomable-frame/zoomable-frame.class.js +2 -2
  97. package/dist/components/media/zoomable-frame/zoomable-frame.class.js.map +1 -1
  98. package/dist/components/overlays/progress/progress-ring.class.d.ts.map +1 -1
  99. package/dist/components/overlays/progress/progress-ring.class.js +6 -0
  100. package/dist/components/overlays/progress/progress-ring.class.js.map +1 -1
  101. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts +18 -1
  102. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts.map +1 -1
  103. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +28 -2
  104. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js.map +1 -1
  105. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.d.ts.map +1 -1
  106. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +8 -1
  107. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js.map +1 -1
  108. package/dist/components/retrieval/memory-panel/memory-panel.class.d.ts +25 -0
  109. package/dist/components/retrieval/memory-panel/memory-panel.class.d.ts.map +1 -1
  110. package/dist/components/retrieval/memory-panel/memory-panel.class.js +69 -0
  111. package/dist/components/retrieval/memory-panel/memory-panel.class.js.map +1 -1
  112. package/dist/components/utility/tour/tour.class.d.ts.map +1 -1
  113. package/dist/components/utility/tour/tour.class.js +5 -0
  114. package/dist/components/utility/tour/tour.class.js.map +1 -1
  115. package/dist/components/viewers/csv-viewer/csv-viewer.class.js +1 -1
  116. package/dist/components/viewers/csv-viewer/csv-viewer.class.js.map +1 -1
  117. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +1 -1
  118. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js.map +1 -1
  119. package/dist/components/viewers/document-preview/document-preview.class.d.ts.map +1 -1
  120. package/dist/components/viewers/document-preview/document-preview.class.js +4 -1
  121. package/dist/components/viewers/document-preview/document-preview.class.js.map +1 -1
  122. package/dist/components/viewers/docx-viewer/docx-viewer.class.js +2 -2
  123. package/dist/components/viewers/docx-viewer/docx-viewer.class.js.map +1 -1
  124. package/dist/components/viewers/include/include.class.d.ts.map +1 -1
  125. package/dist/components/viewers/include/include.class.js +6 -1
  126. package/dist/components/viewers/include/include.class.js.map +1 -1
  127. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts +16 -2
  128. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts.map +1 -1
  129. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +36 -12
  130. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js.map +1 -1
  131. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +3 -0
  132. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts.map +1 -1
  133. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +5 -2
  134. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js.map +1 -1
  135. package/dist/components/viewers/pdf-viewer/pdf-viewer.styles.js +1 -1
  136. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.d.ts.map +1 -1
  137. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.js +6 -1
  138. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.js.map +1 -1
  139. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +1 -1
  140. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js.map +1 -1
  141. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts +8 -2
  142. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts.map +1 -1
  143. package/dist/components/viewers/xml-viewer/xml-viewer.class.js +19 -7
  144. package/dist/components/viewers/xml-viewer/xml-viewer.class.js.map +1 -1
  145. package/dist/internal/anchor-target.d.ts.map +1 -1
  146. package/dist/internal/anchor-target.js +7 -1
  147. package/dist/internal/anchor-target.js.map +1 -1
  148. package/dist/internal/lyra-element.d.ts +18 -6
  149. package/dist/internal/lyra-element.d.ts.map +1 -1
  150. package/dist/internal/lyra-element.js +35 -15
  151. package/dist/internal/lyra-element.js.map +1 -1
  152. package/dist/internal/text-quote.d.ts +15 -0
  153. package/dist/internal/text-quote.d.ts.map +1 -1
  154. package/dist/internal/text-quote.js +13 -6
  155. package/dist/internal/text-quote.js.map +1 -1
  156. package/dist/internal/text-viewer-target.d.ts +0 -6
  157. package/dist/internal/text-viewer-target.d.ts.map +1 -1
  158. package/dist/internal/text-viewer-target.js +68 -21
  159. package/dist/internal/text-viewer-target.js.map +1 -1
  160. package/llms/components/lr-chat-viewport.md +2 -2
  161. package/llms/components/lr-embedding-explorer.md +8 -3
  162. package/llms/components/lr-memory-panel.md +11 -2
  163. package/llms/components/lr-notebook-viewer.md +4 -1
  164. package/llms/components/lr-pdf-viewer.md +6 -3
  165. package/llms/components/lr-usage-badge.md +1 -1
  166. package/llms-full.txt +29 -9
  167. package/package.json +2 -2
  168. package/vscode-css-data.json +15 -1
  169. package/vscode-html-data.json +7 -7
  170. package/web-types.json +17 -9
package/CHANGELOG.md CHANGED
@@ -1,5 +1,162 @@
1
1
  # Changelog
2
2
 
3
+ ## 7.8.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 2c3934b: `<lr-embedding-explorer>`'s `height` property now actually sizes the plot. It was rendered as an
8
+ SVG `height` presentation attribute while the component's own stylesheet declared
9
+ `[part='plot'] { block-size: auto }` — and any stylesheet declaration outranks a presentation
10
+ attribute, so the property was inert at every value, including its documented `360px` default: the
11
+ plot always sized itself from the `viewBox` aspect ratio instead.
12
+
13
+ `height` is now published on the host as the new `--lr-embedding-explorer-height` custom property,
14
+ which `[part='plot']`'s `block-size` reads. Consequences worth knowing before upgrading:
15
+
16
+ - The default `height="360px"` now takes effect, so a plot wider than 640px is no longer as tall as
17
+ its allocation implies. Set `height="auto"` to keep the previous aspect-ratio-preserved sizing.
18
+ - A value the browser cannot parse as a `block-size` is dropped rather than applied, leaving the
19
+ `auto` behavior instead of collapsing the plot.
20
+ - A consumer's own `::part(plot) { block-size: ... }` rule still overrides `height`, and the
21
+ narrow-allocation `min-block-size` floor still raises it.
22
+
23
+ - 2c3934b: `<lr-memory-panel>` no longer strands keyboard focus when a row action opens its confirmation step.
24
+ Activating "Add to long-term memory", "Remove", or "Forget all" destroys the button that had focus,
25
+ and nothing moved focus into the `lr-confirm-bar` that replaces it, so focus fell back to `<body>`:
26
+ a keyboard user was dumped at the top of the page with nothing announced, and had to re-tab through
27
+ the whole document to reach the confirmation they had just opened. Focus now moves into the
28
+ confirmation (its Deny control -- the safe action -- falling back to the bar's status element), and
29
+ is handed back to the row (or to the "Forget all" control) once the decision resolves. Pressing
30
+ Escape while the confirmation holds focus now cancels it exactly like pressing Deny: no event is
31
+ emitted, focus returns the same way, and the key does not propagate past the panel.
32
+ - 2c3934b: `<lr-notebook-viewer>`: `searchNext()` and `searchPrevious()` now resolve `true` when the active
33
+ match moved and `false` when there was nothing to move to, matching the shared viewer search
34
+ contract (`LyraTextViewerTarget`) that every other searchable viewer already honors. They
35
+ previously returned nothing, so a find-in-page host driving several viewers polymorphically —
36
+ `if (await viewer.searchNext()) { ... }`, or awaiting the call before reading its own match
37
+ counter — got `undefined` from the notebook viewer alone and took its falsy "no more matches"
38
+ branch on every press, even mid-notebook.
39
+
40
+ This is an additive widening: the methods return a resolved promise instead of nothing, and callers
41
+ that ignored the return value are unaffected. `search()` already resolved the match count and is
42
+ unchanged.
43
+
44
+ - 80e0ef1: Repair four regressions left by earlier fixes:
45
+
46
+ - `<lr-radio-group>`: arrow-key selection now emits `input` and `change` alongside `lr-change`, as
47
+ click and Space already did and as native `<input type=radio>` does. The earlier fix for a
48
+ duplicate `lr-change` had left the keyboard path emitting only the group event, so a consumer
49
+ bound to the native-mirroring events silently missed every keyboard selection.
50
+ - `<lr-progress-ring>`: an unslotted ring is named from the localized fallback again. Its slot's
51
+ fallback content is the formatted percent, and `assignedNodes({flatten:true})` returns fallback
52
+ children when nothing is assigned, so the control had been naming itself "40%" and no
53
+ `registerLyraLocale()` override could reach it.
54
+ - `<lr-tour>`: opening a detached tour no longer locks scroll on the document or installs a global
55
+ Escape handler with nothing visible, matching the guard `<lr-dialog>` already had.
56
+ - `text-quote` anchors and highlights now case-fold with the component's locale in
57
+ `<lr-docx-viewer>`, `<lr-pdf-viewer>`, `<lr-markdown>` and `<lr-markdown-core>`. Under `lang="tr"`
58
+ a quote of "istanbul" silently failed to match "İSTANBUL" in these four while resolving correctly
59
+ in every viewer built on the shared text-viewer mixin.
60
+
61
+ - d8a026d: Give `<lr-table>`'s sorted column header an opaque default fill. The header is `position: sticky`
62
+ and the sorted-state rule defaulted to `transparent`, so in any height-capped table the body rows
63
+ scrolled visibly through the sorted column's header cell.
64
+
65
+ Give `<lr-pdf-viewer>`'s toolbar buttons a hover fill that differs from the toolbar behind them —
66
+ the rule existed but resolved to the toolbar's own opaque token, so hovering produced no visual
67
+ change at all. Retunable via the new `--lr-pdf-viewer-toolbar-button-hover-bg`.
68
+
69
+ Correct three `<lr-chat-message>` snippets in the authored reference that used `role="user"`. The
70
+ property reflects to `data-role`, so `role` was never observed: consumers copying those examples
71
+ got a message rendered as the default `assistant`, plus an invalid ARIA role token in the DOM.
72
+
73
+ - 2c3934b: `<lr-xml-viewer>`, `<lr-av-player>`, and `<lr-terminal>` now resolve a boolean from `searchNext()`
74
+ and `searchPrevious()`, matching the shared `LyraTextViewerTarget` search contract that
75
+ `search()` already followed on all three. They returned `void`, so a host driving several
76
+ searchable components through that one typed surface — `if (await viewer.searchNext())` — read
77
+ `undefined` and took the "nothing to move to" branch on every press.
78
+
79
+ ### Patch Changes
80
+
81
+ - ed7f463: Stop retaining one live `Range` per search match in every text viewer. `<lr-archive-viewer>`,
82
+ `<lr-calendar-viewer>`, `<lr-contact-viewer>`, `<lr-email-viewer>`, `<lr-geojson-view>`,
83
+ `<lr-html-viewer>`, `<lr-include>`, and `<lr-pptx-viewer>` share a search mixin that held a live
84
+ `Range` for every match. The engine revalidates each retained `Range` on every DOM mutation in its
85
+ document, so a short query over a long document made every later mutation dramatically slower.
86
+ Matches are now kept as inert offsets, and only a bounded window around the active match is
87
+ materialized and painted. `matchCount`, `searchNext()`, and `searchPrevious()` still cover every
88
+ match.
89
+ - 2d149dc: `<lr-dashboard-grid>` no longer starts a cell drag when the pointer lands on a button, link, or
90
+ input inside the cell. The guard compared a slotted light-DOM control against a shadow-root wrapper
91
+ with `contains()`, which never crosses the slot boundary, so it could never fire and every control
92
+ click inside a draggable cell dragged the cell instead of activating the control.
93
+
94
+ `<lr-tree>` no longer throws on the first arrow key when a `<lr-tree-node>` is written declaratively
95
+ into its documented slot. `item` is `attribute: false`, so such a node has none until a host assigns
96
+ one, and the keyboard handler read `item.id` unguarded.
97
+
98
+ - 9083c9b: `<lr-document-library>` now sorts its Updated column chronologically. It ordered rows correctly by
99
+ timestamp itself, then handed the composed `<lr-table>` both those rows and a `sortKey` without
100
+ `sort-mode="server"`, so the table sorted them a second time in client mode — from the column's
101
+ rendered output, which is a _formatted_ date. The result was alphabetical by month name.
102
+ - 2c3934b: `<lr-env-list>` no longer paints its screen-reader-only "Value hidden" announcement as visible text
103
+ beside the mask. The template emitted `class="sr-only"` but the component never adopted the shared
104
+ stylesheet that defines that class, and no rule in `LyraElement.styles` supplies it.
105
+ - 2c3934b: Hide the anchor-announcement live region in `<lr-include>` and `<lr-pptx-viewer>`.
106
+
107
+ Both viewers render the shared anchor-target mixin's `role="status"` live region, which the mixin
108
+ marks up with `class="sr-only"`, but neither component's shadow stylesheet defined that class. The
109
+ region therefore laid out as an ordinary block, so the first anchor jump (or a failed one) painted
110
+ its localized announcement — "Jumped to highlighted passage." / "Passage not found in this
111
+ document." — as visible body text: beside the transcluded fragment for `<lr-include>`, and as an
112
+ extra row under the fidelity notice for `<lr-pptx-viewer>`. The announcement is now visually hidden
113
+ and screen-reader-only, matching every other viewer that adopts the same mixin.
114
+
115
+ - 0e2dbf3: `LyraElement`'s internal `scheduleAfterUpdate()` now coalesces per key instead of collapsing every
116
+ caller in an update cycle onto one slot. It tracked pending work in a single boolean, so the second
117
+ caller in a cycle early-returned and its callback was dropped and never replayed — a component that
118
+ scheduled two genuinely different pieces of after-update work silently lost one of them. Repeated
119
+ schedules under the same key still collapse to one run, so the load path keeps producing one fetch
120
+ per cycle rather than one per property write.
121
+ - 2cd5fb5: `<lr-artifact-panel>`, `<lr-commit-card>`, `<lr-heatmap>`, `<lr-query-builder>`, `<lr-tree>`, and
122
+ `<lr-word-cloud>` now format the numbers they interpolate into localized strings with the effective
123
+ locale. `localize()` substitutes values with a bare `String(value)` and does no number formatting,
124
+ so these rendered Western digits inside otherwise fully-translated sentences — under a locale using
125
+ its own numbering system (`ar-u-nu-arab`, `hi-u-nu-deva`, …) a single announcement mixed two digit
126
+ sets.
127
+
128
+ `<lr-attachment-chip>` also no longer falls back to an empty `src` on its thumbnail `<img>`; an
129
+ empty `src` is a valid URL that resolves against the document, so it would make the browser
130
+ re-request the page as an image.
131
+
132
+ - df4dac8: Reject non-integer index segments in anchor resolution. A range-only guard (`i < 0 || i >= len`)
133
+ does not reject `NaN` (both comparisons are false) or a fractional index, so `<lr-xml-viewer>`
134
+ reported `lr-anchor-result { found: true }` and announced "Jumped to…" for a `node-path` that
135
+ matched nothing, and a non-trailing bad segment threw — rejecting `scrollToAnchor()` so
136
+ `lr-anchor-result` never fired at all, and surfacing as an unhandled rejection on the declarative
137
+ `anchor` path. `<lr-notebook-viewer>` had the same false-positive shape, and
138
+ `<lr-virtual-list>.scrollToIndex(NaN)` silently scrolled the list to the top.
139
+
140
+ `DocumentAnchorTarget` now also degrades a throwing `applyAnchor()` to "not resolved" instead of
141
+ letting it reject, so the mixin keeps its documented promise of always reporting a definite result.
142
+
143
+ - c76ebf8: Fix `<lr-mcp-app>`'s remote `src` mode, which never loaded: binding `srcdoc` to an empty string
144
+ still produced a _present_ `srcdoc=""` attribute, and the HTML spec's iframe processing branches on
145
+ that attribute's presence, so the frame navigated to `about:srcdoc` and ignored `src` entirely
146
+ (while still firing `lr-mcp-ready`). The same empty-string-vs-absent shape is fixed in
147
+ `<lr-av-player>` (a bare player painted a "Failed to load the media" alert before a `src` was set)
148
+ and `<lr-zoomable-frame>` (a rejected `src` rendered a broken-image glyph).
149
+
150
+ Validate consumer-supplied CSS lengths before they reach an inline style declaration list, so a
151
+ crafted value can no longer inject extra declarations: `<lr-stack-trace>`'s `max-height`,
152
+ `<lr-code-block>`/`<lr-code-block-core>`'s `max-height`, `<lr-table>`'s column
153
+ `width`/`minWidth`/`maxWidth`, and `<lr-browser-frame>`'s agent-supplied ping coordinates (which are
154
+ now also clamped to the documented 0-100 range instead of serializing `NaN`).
155
+
156
+ - ed7f463: `<lr-virtual-list>` no longer rescans the whole `items` array on every scroll frame to resolve
157
+ `active-id`. The lookup is now memoized on the `items`/`active-id`/`keyFunction` identities, so
158
+ scrolling a large list stops calling `keyFunction` once per item per frame.
159
+
3
160
  ## 7.7.0
4
161
 
5
162
  ### Minor Changes