@aceshooting/lyra-ui 7.6.0 → 7.7.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 (1077) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/custom-elements.json +6633 -558
  3. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +2 -0
  4. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts.map +1 -1
  5. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +28 -2
  6. package/dist/components/agent-tools/activity-feed/activity-feed.class.js.map +1 -1
  7. package/dist/components/agent-tools/activity-feed/activity-feed.styles.d.ts.map +1 -1
  8. package/dist/components/agent-tools/activity-feed/activity-feed.styles.js +7 -2
  9. package/dist/components/agent-tools/activity-feed/activity-feed.styles.js.map +1 -1
  10. package/dist/components/agent-tools/agent-run/agent-run.styles.d.ts.map +1 -1
  11. package/dist/components/agent-tools/agent-run/agent-run.styles.js +18 -3
  12. package/dist/components/agent-tools/agent-run/agent-run.styles.js.map +1 -1
  13. package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts.map +1 -1
  14. package/dist/components/agent-tools/agent-trace/agent-trace.class.js +4 -6
  15. package/dist/components/agent-tools/agent-trace/agent-trace.class.js.map +1 -1
  16. package/dist/components/agent-tools/approval-queue/approval-queue.class.d.ts.map +1 -1
  17. package/dist/components/agent-tools/approval-queue/approval-queue.class.js +11 -10
  18. package/dist/components/agent-tools/approval-queue/approval-queue.class.js.map +1 -1
  19. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.d.ts +1 -0
  20. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.d.ts.map +1 -1
  21. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.js +8 -1
  22. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.js.map +1 -1
  23. package/dist/components/agent-tools/browser-frame/browser-frame.class.d.ts +4 -1
  24. package/dist/components/agent-tools/browser-frame/browser-frame.class.d.ts.map +1 -1
  25. package/dist/components/agent-tools/browser-frame/browser-frame.class.js +17 -2
  26. package/dist/components/agent-tools/browser-frame/browser-frame.class.js.map +1 -1
  27. package/dist/components/agent-tools/commit-card/commit-card.class.d.ts.map +1 -1
  28. package/dist/components/agent-tools/commit-card/commit-card.class.js +9 -3
  29. package/dist/components/agent-tools/commit-card/commit-card.class.js.map +1 -1
  30. package/dist/components/agent-tools/commit-card/commit-card.styles.d.ts.map +1 -1
  31. package/dist/components/agent-tools/commit-card/commit-card.styles.js +19 -0
  32. package/dist/components/agent-tools/commit-card/commit-card.styles.js.map +1 -1
  33. package/dist/components/agent-tools/compare-panel/compare-panel.class.d.ts +6 -0
  34. package/dist/components/agent-tools/compare-panel/compare-panel.class.d.ts.map +1 -1
  35. package/dist/components/agent-tools/compare-panel/compare-panel.class.js +6 -0
  36. package/dist/components/agent-tools/compare-panel/compare-panel.class.js.map +1 -1
  37. package/dist/components/agent-tools/compare-panel/compare-panel.styles.js +4 -4
  38. package/dist/components/agent-tools/context-inspector/context-inspector.class.d.ts +6 -2
  39. package/dist/components/agent-tools/context-inspector/context-inspector.class.d.ts.map +1 -1
  40. package/dist/components/agent-tools/context-inspector/context-inspector.class.js.map +1 -1
  41. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts +2 -0
  42. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts.map +1 -1
  43. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js.map +1 -1
  44. package/dist/components/agent-tools/eval-result/eval-result.class.js +1 -1
  45. package/dist/components/agent-tools/eval-result/eval-result.class.js.map +1 -1
  46. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.d.ts.map +1 -1
  47. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.js +10 -5
  48. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.js.map +1 -1
  49. package/dist/components/agent-tools/mcp-app/mcp-app.class.d.ts +1 -0
  50. package/dist/components/agent-tools/mcp-app/mcp-app.class.d.ts.map +1 -1
  51. package/dist/components/agent-tools/mcp-app/mcp-app.class.js +17 -12
  52. package/dist/components/agent-tools/mcp-app/mcp-app.class.js.map +1 -1
  53. package/dist/components/agent-tools/policy-summary/policy-summary.class.d.ts.map +1 -1
  54. package/dist/components/agent-tools/policy-summary/policy-summary.class.js +3 -1
  55. package/dist/components/agent-tools/policy-summary/policy-summary.class.js.map +1 -1
  56. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.d.ts.map +1 -1
  57. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.js +8 -6
  58. package/dist/components/agent-tools/prompt-studio/prompt-studio.class.js.map +1 -1
  59. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.d.ts +1 -0
  60. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.d.ts.map +1 -1
  61. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.js +21 -4
  62. package/dist/components/agent-tools/schema-viewer/schema-viewer.class.js.map +1 -1
  63. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.d.ts +6 -0
  64. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.d.ts.map +1 -1
  65. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +16 -4
  66. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js.map +1 -1
  67. package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.d.ts.map +1 -1
  68. package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js +18 -6
  69. package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js.map +1 -1
  70. package/dist/components/agent-tools/stack-trace/stack-trace.class.d.ts +2 -0
  71. package/dist/components/agent-tools/stack-trace/stack-trace.class.d.ts.map +1 -1
  72. package/dist/components/agent-tools/stack-trace/stack-trace.class.js +4 -1
  73. package/dist/components/agent-tools/stack-trace/stack-trace.class.js.map +1 -1
  74. package/dist/components/agent-tools/stack-trace/stack-trace.styles.js +4 -4
  75. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.d.ts.map +1 -1
  76. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js +24 -2
  77. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js.map +1 -1
  78. package/dist/components/agent-tools/task-list/task-list.class.d.ts +4 -0
  79. package/dist/components/agent-tools/task-list/task-list.class.d.ts.map +1 -1
  80. package/dist/components/agent-tools/task-list/task-list.class.js +10 -1
  81. package/dist/components/agent-tools/task-list/task-list.class.js.map +1 -1
  82. package/dist/components/agent-tools/task-list/task-list.styles.d.ts.map +1 -1
  83. package/dist/components/agent-tools/task-list/task-list.styles.js +12 -5
  84. package/dist/components/agent-tools/task-list/task-list.styles.js.map +1 -1
  85. package/dist/components/agent-tools/terminal/terminal.class.d.ts +4 -0
  86. package/dist/components/agent-tools/terminal/terminal.class.d.ts.map +1 -1
  87. package/dist/components/agent-tools/terminal/terminal.class.js +83 -22
  88. package/dist/components/agent-tools/terminal/terminal.class.js.map +1 -1
  89. package/dist/components/agent-tools/test-results/test-results.class.d.ts +28 -8
  90. package/dist/components/agent-tools/test-results/test-results.class.d.ts.map +1 -1
  91. package/dist/components/agent-tools/test-results/test-results.class.js +157 -61
  92. package/dist/components/agent-tools/test-results/test-results.class.js.map +1 -1
  93. package/dist/components/agent-tools/test-results/test-results.styles.d.ts.map +1 -1
  94. package/dist/components/agent-tools/test-results/test-results.styles.js +12 -10
  95. package/dist/components/agent-tools/test-results/test-results.styles.js.map +1 -1
  96. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.d.ts +1 -0
  97. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.d.ts.map +1 -1
  98. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.js +1 -0
  99. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.js.map +1 -1
  100. package/dist/components/agent-tools/thinking-panel/thinking-panel.styles.d.ts.map +1 -1
  101. package/dist/components/agent-tools/thinking-panel/thinking-panel.styles.js +6 -2
  102. package/dist/components/agent-tools/thinking-panel/thinking-panel.styles.js.map +1 -1
  103. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.d.ts +2 -0
  104. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.d.ts.map +1 -1
  105. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js +2 -0
  106. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js.map +1 -1
  107. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.styles.js +1 -1
  108. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.styles.d.ts.map +1 -1
  109. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.styles.js +18 -4
  110. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.styles.js.map +1 -1
  111. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts +6 -0
  112. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts.map +1 -1
  113. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +68 -21
  114. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js.map +1 -1
  115. package/dist/components/agent-tools/tool-param-form/tool-param-form.styles.d.ts.map +1 -1
  116. package/dist/components/agent-tools/tool-param-form/tool-param-form.styles.js +18 -0
  117. package/dist/components/agent-tools/tool-param-form/tool-param-form.styles.js.map +1 -1
  118. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.d.ts +4 -1
  119. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.d.ts.map +1 -1
  120. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.js +14 -10
  121. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.js.map +1 -1
  122. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts.map +1 -1
  123. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +1 -0
  124. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js.map +1 -1
  125. package/dist/components/agent-tools/trace-tree/trace-tree.class.d.ts +1 -0
  126. package/dist/components/agent-tools/trace-tree/trace-tree.class.d.ts.map +1 -1
  127. package/dist/components/agent-tools/trace-tree/trace-tree.class.js +10 -6
  128. package/dist/components/agent-tools/trace-tree/trace-tree.class.js.map +1 -1
  129. package/dist/components/charts/chart/box-plot.class.d.ts +10 -0
  130. package/dist/components/charts/chart/box-plot.class.d.ts.map +1 -1
  131. package/dist/components/charts/chart/box-plot.class.js +72 -15
  132. package/dist/components/charts/chart/box-plot.class.js.map +1 -1
  133. package/dist/components/charts/chart/box-plot.styles.d.ts.map +1 -1
  134. package/dist/components/charts/chart/box-plot.styles.js +62 -3
  135. package/dist/components/charts/chart/box-plot.styles.js.map +1 -1
  136. package/dist/components/charts/chart/bubble-chart.class.d.ts +2 -4
  137. package/dist/components/charts/chart/bubble-chart.class.d.ts.map +1 -1
  138. package/dist/components/charts/chart/bubble-chart.class.js +2 -4
  139. package/dist/components/charts/chart/bubble-chart.class.js.map +1 -1
  140. package/dist/components/charts/chart/chart.class.d.ts +54 -13
  141. package/dist/components/charts/chart/chart.class.d.ts.map +1 -1
  142. package/dist/components/charts/chart/chart.class.js +434 -120
  143. package/dist/components/charts/chart/chart.class.js.map +1 -1
  144. package/dist/components/charts/chart/chart.styles.d.ts.map +1 -1
  145. package/dist/components/charts/chart/chart.styles.js +102 -3
  146. package/dist/components/charts/chart/chart.styles.js.map +1 -1
  147. package/dist/components/charts/chart/histogram-bin.d.ts.map +1 -1
  148. package/dist/components/charts/chart/histogram-bin.js +5 -5
  149. package/dist/components/charts/chart/histogram-bin.js.map +1 -1
  150. package/dist/components/charts/chart/histogram.class.d.ts +6 -1
  151. package/dist/components/charts/chart/histogram.class.d.ts.map +1 -1
  152. package/dist/components/charts/chart/histogram.class.js +13 -5
  153. package/dist/components/charts/chart/histogram.class.js.map +1 -1
  154. package/dist/components/charts/chart/lite-chart.class.d.ts +7 -3
  155. package/dist/components/charts/chart/lite-chart.class.d.ts.map +1 -1
  156. package/dist/components/charts/chart/lite-chart.class.js +99 -17
  157. package/dist/components/charts/chart/lite-chart.class.js.map +1 -1
  158. package/dist/components/charts/chart/lite-chart.styles.js +1 -1
  159. package/dist/components/conversation/conversation-item/conversation-item.class.d.ts +3 -0
  160. package/dist/components/conversation/conversation-item/conversation-item.class.d.ts.map +1 -1
  161. package/dist/components/conversation/conversation-item/conversation-item.class.js +23 -4
  162. package/dist/components/conversation/conversation-item/conversation-item.class.js.map +1 -1
  163. package/dist/components/conversation/message-actions/message-actions.class.d.ts +4 -10
  164. package/dist/components/conversation/message-actions/message-actions.class.d.ts.map +1 -1
  165. package/dist/components/conversation/message-actions/message-actions.class.js +23 -14
  166. package/dist/components/conversation/message-actions/message-actions.class.js.map +1 -1
  167. package/dist/components/conversation/message-feedback/message-feedback.class.d.ts +4 -1
  168. package/dist/components/conversation/message-feedback/message-feedback.class.d.ts.map +1 -1
  169. package/dist/components/conversation/message-feedback/message-feedback.class.js +36 -6
  170. package/dist/components/conversation/message-feedback/message-feedback.class.js.map +1 -1
  171. package/dist/components/conversation/model-select/model-select.class.d.ts +3 -1
  172. package/dist/components/conversation/model-select/model-select.class.d.ts.map +1 -1
  173. package/dist/components/conversation/model-select/model-select.class.js +14 -2
  174. package/dist/components/conversation/model-select/model-select.class.js.map +1 -1
  175. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.d.ts.map +1 -1
  176. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.js +9 -4
  177. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.js.map +1 -1
  178. package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +2 -0
  179. package/dist/components/conversation/prompt-input/prompt-input.class.d.ts.map +1 -1
  180. package/dist/components/conversation/prompt-input/prompt-input.class.js +15 -1
  181. package/dist/components/conversation/prompt-input/prompt-input.class.js.map +1 -1
  182. package/dist/components/conversation/prompt-queue/prompt-queue.class.d.ts.map +1 -1
  183. package/dist/components/conversation/prompt-queue/prompt-queue.class.js +5 -0
  184. package/dist/components/conversation/prompt-queue/prompt-queue.class.js.map +1 -1
  185. package/dist/components/conversation/push-to-talk/push-to-talk.class.d.ts +2 -0
  186. package/dist/components/conversation/push-to-talk/push-to-talk.class.d.ts.map +1 -1
  187. package/dist/components/conversation/push-to-talk/push-to-talk.class.js +17 -5
  188. package/dist/components/conversation/push-to-talk/push-to-talk.class.js.map +1 -1
  189. package/dist/components/conversation/realtime-session/realtime-session.class.d.ts.map +1 -1
  190. package/dist/components/conversation/realtime-session/realtime-session.class.js +10 -2
  191. package/dist/components/conversation/realtime-session/realtime-session.class.js.map +1 -1
  192. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.d.ts +1 -0
  193. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.d.ts.map +1 -1
  194. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js +30 -24
  195. package/dist/components/conversation/selection-toolbar/selection-toolbar.class.js.map +1 -1
  196. package/dist/components/conversation/selection-toolbar/selection-toolbar.styles.d.ts.map +1 -1
  197. package/dist/components/conversation/selection-toolbar/selection-toolbar.styles.js +10 -0
  198. package/dist/components/conversation/selection-toolbar/selection-toolbar.styles.js.map +1 -1
  199. package/dist/components/conversation/thread-list/thread-list.class.d.ts +3 -0
  200. package/dist/components/conversation/thread-list/thread-list.class.d.ts.map +1 -1
  201. package/dist/components/conversation/thread-list/thread-list.class.js +33 -1
  202. package/dist/components/conversation/thread-list/thread-list.class.js.map +1 -1
  203. package/dist/components/conversation/widget-renderer/resolve.d.ts +5 -0
  204. package/dist/components/conversation/widget-renderer/resolve.d.ts.map +1 -1
  205. package/dist/components/conversation/widget-renderer/resolve.js +38 -2
  206. package/dist/components/conversation/widget-renderer/resolve.js.map +1 -1
  207. package/dist/components/conversation/widget-renderer/widget-renderer.class.d.ts +1 -0
  208. package/dist/components/conversation/widget-renderer/widget-renderer.class.d.ts.map +1 -1
  209. package/dist/components/conversation/widget-renderer/widget-renderer.class.js +17 -5
  210. package/dist/components/conversation/widget-renderer/widget-renderer.class.js.map +1 -1
  211. package/dist/components/data/calendar/calendar.styles.js +1 -1
  212. package/dist/components/data/document-library/document-library.class.d.ts.map +1 -1
  213. package/dist/components/data/document-library/document-library.class.js +8 -0
  214. package/dist/components/data/document-library/document-library.class.js.map +1 -1
  215. package/dist/components/data/env-list/env-list.class.d.ts.map +1 -1
  216. package/dist/components/data/env-list/env-list.class.js +4 -1
  217. package/dist/components/data/env-list/env-list.class.js.map +1 -1
  218. package/dist/components/data/env-list/env-list.styles.d.ts.map +1 -1
  219. package/dist/components/data/env-list/env-list.styles.js +16 -1
  220. package/dist/components/data/env-list/env-list.styles.js.map +1 -1
  221. package/dist/components/data/file-tree/file-tree.class.js +1 -1
  222. package/dist/components/data/file-tree/file-tree.class.js.map +1 -1
  223. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts.map +1 -1
  224. package/dist/components/data/flow-canvas/flow-canvas.class.js +14 -3
  225. package/dist/components/data/flow-canvas/flow-canvas.class.js.map +1 -1
  226. package/dist/components/data/flow-controls/flow-controls.class.js +3 -3
  227. package/dist/components/data/flow-controls/flow-controls.class.js.map +1 -1
  228. package/dist/components/data/flow-minimap/flow-minimap.class.d.ts +7 -0
  229. package/dist/components/data/flow-minimap/flow-minimap.class.d.ts.map +1 -1
  230. package/dist/components/data/flow-minimap/flow-minimap.class.js +7 -0
  231. package/dist/components/data/flow-minimap/flow-minimap.class.js.map +1 -1
  232. package/dist/components/data/flow-minimap/flow-minimap.styles.d.ts.map +1 -1
  233. package/dist/components/data/flow-minimap/flow-minimap.styles.js +8 -5
  234. package/dist/components/data/flow-minimap/flow-minimap.styles.js.map +1 -1
  235. package/dist/components/data/flow-node/flow-node.class.d.ts +7 -0
  236. package/dist/components/data/flow-node/flow-node.class.d.ts.map +1 -1
  237. package/dist/components/data/flow-node/flow-node.class.js +7 -0
  238. package/dist/components/data/flow-node/flow-node.class.js.map +1 -1
  239. package/dist/components/data/flow-node/flow-node.styles.d.ts.map +1 -1
  240. package/dist/components/data/flow-node/flow-node.styles.js +16 -5
  241. package/dist/components/data/flow-node/flow-node.styles.js.map +1 -1
  242. package/dist/components/data/flow-run-overlay/flow-run-overlay.class.d.ts +8 -0
  243. package/dist/components/data/flow-run-overlay/flow-run-overlay.class.d.ts.map +1 -1
  244. package/dist/components/data/flow-run-overlay/flow-run-overlay.class.js +8 -0
  245. package/dist/components/data/flow-run-overlay/flow-run-overlay.class.js.map +1 -1
  246. package/dist/components/data/flow-run-overlay/flow-run-overlay.styles.d.ts.map +1 -1
  247. package/dist/components/data/flow-run-overlay/flow-run-overlay.styles.js +33 -5
  248. package/dist/components/data/flow-run-overlay/flow-run-overlay.styles.js.map +1 -1
  249. package/dist/components/data/gauge/gauge.class.d.ts.map +1 -1
  250. package/dist/components/data/gauge/gauge.class.js +71 -12
  251. package/dist/components/data/gauge/gauge.class.js.map +1 -1
  252. package/dist/components/data/heatmap/heatmap-scale.d.ts.map +1 -1
  253. package/dist/components/data/heatmap/heatmap-scale.js +3 -5
  254. package/dist/components/data/heatmap/heatmap-scale.js.map +1 -1
  255. package/dist/components/data/heatmap/heatmap.class.d.ts +4 -2
  256. package/dist/components/data/heatmap/heatmap.class.d.ts.map +1 -1
  257. package/dist/components/data/heatmap/heatmap.class.js +20 -13
  258. package/dist/components/data/heatmap/heatmap.class.js.map +1 -1
  259. package/dist/components/data/heatmap/heatmap.styles.d.ts.map +1 -1
  260. package/dist/components/data/heatmap/heatmap.styles.js +27 -1
  261. package/dist/components/data/heatmap/heatmap.styles.js.map +1 -1
  262. package/dist/components/data/query-builder/query-builder.class.js +2 -2
  263. package/dist/components/data/query-builder/query-builder.class.js.map +1 -1
  264. package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +1 -0
  265. package/dist/components/data/sequence-strip/sequence-strip.class.d.ts.map +1 -1
  266. package/dist/components/data/sequence-strip/sequence-strip.class.js +8 -4
  267. package/dist/components/data/sequence-strip/sequence-strip.class.js.map +1 -1
  268. package/dist/components/data/sparkline/sparkline.class.d.ts.map +1 -1
  269. package/dist/components/data/sparkline/sparkline.class.js +2 -3
  270. package/dist/components/data/sparkline/sparkline.class.js.map +1 -1
  271. package/dist/components/data/stat/stat.class.d.ts +6 -0
  272. package/dist/components/data/stat/stat.class.d.ts.map +1 -1
  273. package/dist/components/data/stat/stat.class.js +6 -0
  274. package/dist/components/data/stat/stat.class.js.map +1 -1
  275. package/dist/components/data/stat/stat.styles.js +3 -3
  276. package/dist/components/data/table/table.class.d.ts.map +1 -1
  277. package/dist/components/data/table/table.class.js +41 -9
  278. package/dist/components/data/table/table.class.js.map +1 -1
  279. package/dist/components/data/table/table.styles.d.ts.map +1 -1
  280. package/dist/components/data/table/table.styles.js +6 -0
  281. package/dist/components/data/table/table.styles.js.map +1 -1
  282. package/dist/components/data/timeline/timeline-item.class.d.ts +1 -2
  283. package/dist/components/data/timeline/timeline-item.class.d.ts.map +1 -1
  284. package/dist/components/data/timeline/timeline-item.class.js +2 -8
  285. package/dist/components/data/timeline/timeline-item.class.js.map +1 -1
  286. package/dist/components/data/timeline/timeline.class.d.ts +1 -0
  287. package/dist/components/data/timeline/timeline.class.d.ts.map +1 -1
  288. package/dist/components/data/timeline/timeline.class.js +7 -3
  289. package/dist/components/data/timeline/timeline.class.js.map +1 -1
  290. package/dist/components/data/tree/tree-node.class.d.ts +10 -0
  291. package/dist/components/data/tree/tree-node.class.d.ts.map +1 -1
  292. package/dist/components/data/tree/tree-node.class.js +20 -4
  293. package/dist/components/data/tree/tree-node.class.js.map +1 -1
  294. package/dist/components/data/tree/tree-node.styles.d.ts.map +1 -1
  295. package/dist/components/data/tree/tree-node.styles.js +13 -10
  296. package/dist/components/data/tree/tree-node.styles.js.map +1 -1
  297. package/dist/components/data/tree/tree.class.d.ts +1 -0
  298. package/dist/components/data/tree/tree.class.d.ts.map +1 -1
  299. package/dist/components/data/tree/tree.class.js +39 -7
  300. package/dist/components/data/tree/tree.class.js.map +1 -1
  301. package/dist/components/data/word-cloud/word-cloud.class.d.ts +5 -2
  302. package/dist/components/data/word-cloud/word-cloud.class.d.ts.map +1 -1
  303. package/dist/components/data/word-cloud/word-cloud.class.js +22 -9
  304. package/dist/components/data/word-cloud/word-cloud.class.js.map +1 -1
  305. package/dist/components/forms/checkbox/checkbox.class.d.ts +2 -2
  306. package/dist/components/forms/checkbox/checkbox.class.js +2 -2
  307. package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts.map +1 -1
  308. package/dist/components/forms/checkbox-group/checkbox-group.class.js +8 -2
  309. package/dist/components/forms/checkbox-group/checkbox-group.class.js.map +1 -1
  310. package/dist/components/forms/checkbox-group/checkbox-group.styles.d.ts.map +1 -1
  311. package/dist/components/forms/checkbox-group/checkbox-group.styles.js +8 -0
  312. package/dist/components/forms/checkbox-group/checkbox-group.styles.js.map +1 -1
  313. package/dist/components/forms/code-editor/code-editor.class.d.ts +3 -0
  314. package/dist/components/forms/code-editor/code-editor.class.d.ts.map +1 -1
  315. package/dist/components/forms/code-editor/code-editor.class.js +12 -2
  316. package/dist/components/forms/code-editor/code-editor.class.js.map +1 -1
  317. package/dist/components/forms/code-editor/code-editor.styles.d.ts.map +1 -1
  318. package/dist/components/forms/code-editor/code-editor.styles.js +8 -0
  319. package/dist/components/forms/code-editor/code-editor.styles.js.map +1 -1
  320. package/dist/components/forms/color-picker/color-picker.styles.d.ts.map +1 -1
  321. package/dist/components/forms/color-picker/color-picker.styles.js +8 -0
  322. package/dist/components/forms/color-picker/color-picker.styles.js.map +1 -1
  323. package/dist/components/forms/combobox/combobox.class.d.ts.map +1 -1
  324. package/dist/components/forms/combobox/combobox.class.js +11 -2
  325. package/dist/components/forms/combobox/combobox.class.js.map +1 -1
  326. package/dist/components/forms/combobox/combobox.styles.d.ts.map +1 -1
  327. package/dist/components/forms/combobox/combobox.styles.js +8 -0
  328. package/dist/components/forms/combobox/combobox.styles.js.map +1 -1
  329. package/dist/components/forms/combobox/option.class.d.ts +2 -0
  330. package/dist/components/forms/combobox/option.class.d.ts.map +1 -1
  331. package/dist/components/forms/combobox/option.class.js +2 -0
  332. package/dist/components/forms/combobox/option.class.js.map +1 -1
  333. package/dist/components/forms/date-picker/date-input.class.d.ts +5 -1
  334. package/dist/components/forms/date-picker/date-input.class.d.ts.map +1 -1
  335. package/dist/components/forms/date-picker/date-input.class.js +18 -1
  336. package/dist/components/forms/date-picker/date-input.class.js.map +1 -1
  337. package/dist/components/forms/date-picker/date-input.styles.d.ts.map +1 -1
  338. package/dist/components/forms/date-picker/date-input.styles.js +8 -0
  339. package/dist/components/forms/date-picker/date-input.styles.js.map +1 -1
  340. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +7 -3
  341. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts.map +1 -1
  342. package/dist/components/forms/emoji-picker/emoji-picker.class.js +18 -7
  343. package/dist/components/forms/emoji-picker/emoji-picker.class.js.map +1 -1
  344. package/dist/components/forms/emoji-picker/emoji-picker.styles.d.ts.map +1 -1
  345. package/dist/components/forms/emoji-picker/emoji-picker.styles.js +8 -0
  346. package/dist/components/forms/emoji-picker/emoji-picker.styles.js.map +1 -1
  347. package/dist/components/forms/input/input.styles.d.ts.map +1 -1
  348. package/dist/components/forms/input/input.styles.js +8 -0
  349. package/dist/components/forms/input/input.styles.js.map +1 -1
  350. package/dist/components/forms/locale-picker/locale-picker.styles.d.ts.map +1 -1
  351. package/dist/components/forms/locale-picker/locale-picker.styles.js +8 -0
  352. package/dist/components/forms/locale-picker/locale-picker.styles.js.map +1 -1
  353. package/dist/components/forms/phone-input/phone-input.styles.d.ts.map +1 -1
  354. package/dist/components/forms/phone-input/phone-input.styles.js +8 -0
  355. package/dist/components/forms/phone-input/phone-input.styles.js.map +1 -1
  356. package/dist/components/forms/radio/radio-group.class.d.ts +3 -0
  357. package/dist/components/forms/radio/radio-group.class.d.ts.map +1 -1
  358. package/dist/components/forms/radio/radio-group.class.js +98 -24
  359. package/dist/components/forms/radio/radio-group.class.js.map +1 -1
  360. package/dist/components/forms/radio/radio-group.styles.d.ts.map +1 -1
  361. package/dist/components/forms/radio/radio-group.styles.js +8 -0
  362. package/dist/components/forms/radio/radio-group.styles.js.map +1 -1
  363. package/dist/components/forms/radio/radio.class.d.ts +8 -2
  364. package/dist/components/forms/radio/radio.class.d.ts.map +1 -1
  365. package/dist/components/forms/radio/radio.class.js +88 -19
  366. package/dist/components/forms/radio/radio.class.js.map +1 -1
  367. package/dist/components/forms/rubric-form/rubric-form.class.d.ts +1 -0
  368. package/dist/components/forms/rubric-form/rubric-form.class.d.ts.map +1 -1
  369. package/dist/components/forms/rubric-form/rubric-form.class.js +14 -3
  370. package/dist/components/forms/rubric-form/rubric-form.class.js.map +1 -1
  371. package/dist/components/forms/rubric-form/rubric-form.styles.d.ts.map +1 -1
  372. package/dist/components/forms/rubric-form/rubric-form.styles.js +16 -0
  373. package/dist/components/forms/rubric-form/rubric-form.styles.js.map +1 -1
  374. package/dist/components/forms/select/select.class.d.ts.map +1 -1
  375. package/dist/components/forms/select/select.class.js +8 -1
  376. package/dist/components/forms/select/select.class.js.map +1 -1
  377. package/dist/components/forms/select/select.styles.d.ts.map +1 -1
  378. package/dist/components/forms/select/select.styles.js +28 -2
  379. package/dist/components/forms/select/select.styles.js.map +1 -1
  380. package/dist/components/forms/slider/slider.class.d.ts +9 -8
  381. package/dist/components/forms/slider/slider.class.d.ts.map +1 -1
  382. package/dist/components/forms/slider/slider.class.js +31 -20
  383. package/dist/components/forms/slider/slider.class.js.map +1 -1
  384. package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts +4 -6
  385. package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts.map +1 -1
  386. package/dist/components/forms/swatch-picker/swatch-picker.class.js +11 -8
  387. package/dist/components/forms/swatch-picker/swatch-picker.class.js.map +1 -1
  388. package/dist/components/forms/switch/switch.styles.d.ts.map +1 -1
  389. package/dist/components/forms/switch/switch.styles.js +8 -0
  390. package/dist/components/forms/switch/switch.styles.js.map +1 -1
  391. package/dist/components/forms/textarea/textarea.class.d.ts +2 -1
  392. package/dist/components/forms/textarea/textarea.class.d.ts.map +1 -1
  393. package/dist/components/forms/textarea/textarea.class.js +6 -3
  394. package/dist/components/forms/textarea/textarea.class.js.map +1 -1
  395. package/dist/components/forms/textarea/textarea.styles.d.ts.map +1 -1
  396. package/dist/components/forms/textarea/textarea.styles.js +8 -0
  397. package/dist/components/forms/textarea/textarea.styles.js.map +1 -1
  398. package/dist/components/forms/time-range/time-range.class.d.ts.map +1 -1
  399. package/dist/components/forms/time-range/time-range.class.js +4 -8
  400. package/dist/components/forms/time-range/time-range.class.js.map +1 -1
  401. package/dist/components/forms/time-range/time-range.styles.d.ts.map +1 -1
  402. package/dist/components/forms/time-range/time-range.styles.js +8 -0
  403. package/dist/components/forms/time-range/time-range.styles.js.map +1 -1
  404. package/dist/components/forms/token-input/token-input.class.d.ts +14 -1
  405. package/dist/components/forms/token-input/token-input.class.d.ts.map +1 -1
  406. package/dist/components/forms/token-input/token-input.class.js +76 -7
  407. package/dist/components/forms/token-input/token-input.class.js.map +1 -1
  408. package/dist/components/forms/token-input/token-input.styles.d.ts.map +1 -1
  409. package/dist/components/forms/token-input/token-input.styles.js +7 -0
  410. package/dist/components/forms/token-input/token-input.styles.js.map +1 -1
  411. package/dist/components/layout/app-rail/app-rail-item.class.d.ts +3 -0
  412. package/dist/components/layout/app-rail/app-rail-item.class.d.ts.map +1 -1
  413. package/dist/components/layout/app-rail/app-rail-item.class.js +34 -15
  414. package/dist/components/layout/app-rail/app-rail-item.class.js.map +1 -1
  415. package/dist/components/layout/app-rail/app-rail.class.d.ts +2 -0
  416. package/dist/components/layout/app-rail/app-rail.class.d.ts.map +1 -1
  417. package/dist/components/layout/app-rail/app-rail.class.js +46 -15
  418. package/dist/components/layout/app-rail/app-rail.class.js.map +1 -1
  419. package/dist/components/layout/breadcrumb/breadcrumb-item.class.d.ts.map +1 -1
  420. package/dist/components/layout/breadcrumb/breadcrumb-item.class.js +3 -3
  421. package/dist/components/layout/breadcrumb/breadcrumb-item.class.js.map +1 -1
  422. package/dist/components/layout/breadcrumb/breadcrumb-item.styles.d.ts.map +1 -1
  423. package/dist/components/layout/breadcrumb/breadcrumb-item.styles.js +6 -0
  424. package/dist/components/layout/breadcrumb/breadcrumb-item.styles.js.map +1 -1
  425. package/dist/components/layout/breadcrumb/breadcrumb.styles.d.ts.map +1 -1
  426. package/dist/components/layout/breadcrumb/breadcrumb.styles.js +7 -0
  427. package/dist/components/layout/breadcrumb/breadcrumb.styles.js.map +1 -1
  428. package/dist/components/layout/button-group/button-group.class.js +1 -1
  429. package/dist/components/layout/button-group/button-group.class.js.map +1 -1
  430. package/dist/components/layout/card/card.class.d.ts.map +1 -1
  431. package/dist/components/layout/card/card.class.js +1 -0
  432. package/dist/components/layout/card/card.class.js.map +1 -1
  433. package/dist/components/layout/carousel/carousel.class.d.ts.map +1 -1
  434. package/dist/components/layout/carousel/carousel.class.js +14 -4
  435. package/dist/components/layout/carousel/carousel.class.js.map +1 -1
  436. package/dist/components/layout/command-palette/command-palette.class.d.ts.map +1 -1
  437. package/dist/components/layout/command-palette/command-palette.class.js +1 -0
  438. package/dist/components/layout/command-palette/command-palette.class.js.map +1 -1
  439. package/dist/components/layout/control-group/control-group.class.d.ts +2 -3
  440. package/dist/components/layout/control-group/control-group.class.d.ts.map +1 -1
  441. package/dist/components/layout/control-group/control-group.class.js +3 -4
  442. package/dist/components/layout/control-group/control-group.class.js.map +1 -1
  443. package/dist/components/layout/dashboard-grid/dashboard-grid.class.d.ts +13 -0
  444. package/dist/components/layout/dashboard-grid/dashboard-grid.class.d.ts.map +1 -1
  445. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js +145 -34
  446. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js.map +1 -1
  447. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js +1 -1
  448. package/dist/components/layout/details/accordion.class.d.ts +3 -1
  449. package/dist/components/layout/details/accordion.class.d.ts.map +1 -1
  450. package/dist/components/layout/details/accordion.class.js +19 -0
  451. package/dist/components/layout/details/accordion.class.js.map +1 -1
  452. package/dist/components/layout/details/details.styles.js +5 -5
  453. package/dist/components/layout/dock-panel/dock-panel.class.d.ts +1 -0
  454. package/dist/components/layout/dock-panel/dock-panel.class.d.ts.map +1 -1
  455. package/dist/components/layout/dock-panel/dock-panel.class.js +17 -10
  456. package/dist/components/layout/dock-panel/dock-panel.class.js.map +1 -1
  457. package/dist/components/layout/filter-bar/filter-bar.class.d.ts +3 -2
  458. package/dist/components/layout/filter-bar/filter-bar.class.d.ts.map +1 -1
  459. package/dist/components/layout/filter-bar/filter-bar.class.js +8 -3
  460. package/dist/components/layout/filter-bar/filter-bar.class.js.map +1 -1
  461. package/dist/components/layout/menu/menu-item.class.d.ts +2 -0
  462. package/dist/components/layout/menu/menu-item.class.d.ts.map +1 -1
  463. package/dist/components/layout/menu/menu-item.class.js +3 -4
  464. package/dist/components/layout/menu/menu-item.class.js.map +1 -1
  465. package/dist/components/layout/reorder-list/reorder-item.styles.d.ts.map +1 -1
  466. package/dist/components/layout/reorder-list/reorder-item.styles.js +6 -0
  467. package/dist/components/layout/reorder-list/reorder-item.styles.js.map +1 -1
  468. package/dist/components/layout/reorder-list/reorder-list.class.d.ts +3 -4
  469. package/dist/components/layout/reorder-list/reorder-list.class.d.ts.map +1 -1
  470. package/dist/components/layout/reorder-list/reorder-list.class.js +8 -7
  471. package/dist/components/layout/reorder-list/reorder-list.class.js.map +1 -1
  472. package/dist/components/layout/reorder-list/reorder-list.styles.d.ts.map +1 -1
  473. package/dist/components/layout/reorder-list/reorder-list.styles.js +4 -0
  474. package/dist/components/layout/reorder-list/reorder-list.styles.js.map +1 -1
  475. package/dist/components/layout/segmented/segmented.class.d.ts +4 -5
  476. package/dist/components/layout/segmented/segmented.class.d.ts.map +1 -1
  477. package/dist/components/layout/segmented/segmented.class.js +19 -7
  478. package/dist/components/layout/segmented/segmented.class.js.map +1 -1
  479. package/dist/components/layout/segmented/segmented.styles.d.ts.map +1 -1
  480. package/dist/components/layout/segmented/segmented.styles.js +6 -1
  481. package/dist/components/layout/segmented/segmented.styles.js.map +1 -1
  482. package/dist/components/layout/split/split.class.d.ts +5 -1
  483. package/dist/components/layout/split/split.class.d.ts.map +1 -1
  484. package/dist/components/layout/split/split.class.js +11 -5
  485. package/dist/components/layout/split/split.class.js.map +1 -1
  486. package/dist/components/layout/split/split.styles.d.ts.map +1 -1
  487. package/dist/components/layout/split/split.styles.js +9 -0
  488. package/dist/components/layout/split/split.styles.js.map +1 -1
  489. package/dist/components/layout/stepper/stepper.class.d.ts +1 -0
  490. package/dist/components/layout/stepper/stepper.class.d.ts.map +1 -1
  491. package/dist/components/layout/stepper/stepper.class.js +19 -0
  492. package/dist/components/layout/stepper/stepper.class.js.map +1 -1
  493. package/dist/components/layout/tabs/tabs.class.d.ts +2 -0
  494. package/dist/components/layout/tabs/tabs.class.d.ts.map +1 -1
  495. package/dist/components/layout/tabs/tabs.class.js +14 -0
  496. package/dist/components/layout/tabs/tabs.class.js.map +1 -1
  497. package/dist/components/layout/virtual-list/virtual-list.class.d.ts +10 -0
  498. package/dist/components/layout/virtual-list/virtual-list.class.d.ts.map +1 -1
  499. package/dist/components/layout/virtual-list/virtual-list.class.js +42 -12
  500. package/dist/components/layout/virtual-list/virtual-list.class.js.map +1 -1
  501. package/dist/components/layout/widget/widget.class.d.ts +3 -3
  502. package/dist/components/layout/widget/widget.class.d.ts.map +1 -1
  503. package/dist/components/layout/widget/widget.class.js +19 -19
  504. package/dist/components/layout/widget/widget.class.js.map +1 -1
  505. package/dist/components/media/animated-image/animated-image.class.d.ts.map +1 -1
  506. package/dist/components/media/animated-image/animated-image.class.js +4 -0
  507. package/dist/components/media/animated-image/animated-image.class.js.map +1 -1
  508. package/dist/components/media/animation/animation.class.js +1 -1
  509. package/dist/components/media/animation/animation.class.js.map +1 -1
  510. package/dist/components/media/attachment-trigger/attachment-trigger.class.d.ts +13 -10
  511. package/dist/components/media/attachment-trigger/attachment-trigger.class.d.ts.map +1 -1
  512. package/dist/components/media/attachment-trigger/attachment-trigger.class.js +20 -8
  513. package/dist/components/media/attachment-trigger/attachment-trigger.class.js.map +1 -1
  514. package/dist/components/media/av-player/av-player.class.d.ts +6 -2
  515. package/dist/components/media/av-player/av-player.class.d.ts.map +1 -1
  516. package/dist/components/media/av-player/av-player.class.js +57 -18
  517. package/dist/components/media/av-player/av-player.class.js.map +1 -1
  518. package/dist/components/media/av-player/av-player.styles.d.ts.map +1 -1
  519. package/dist/components/media/av-player/av-player.styles.js +10 -0
  520. package/dist/components/media/av-player/av-player.styles.js.map +1 -1
  521. package/dist/components/media/avatar/avatar.class.d.ts +3 -2
  522. package/dist/components/media/avatar/avatar.class.d.ts.map +1 -1
  523. package/dist/components/media/avatar/avatar.class.js +13 -3
  524. package/dist/components/media/avatar/avatar.class.js.map +1 -1
  525. package/dist/components/media/avatar-group/avatar-group.class.d.ts +1 -0
  526. package/dist/components/media/avatar-group/avatar-group.class.d.ts.map +1 -1
  527. package/dist/components/media/avatar-group/avatar-group.class.js +8 -0
  528. package/dist/components/media/avatar-group/avatar-group.class.js.map +1 -1
  529. package/dist/components/media/avatar-group/avatar-group.styles.d.ts.map +1 -1
  530. package/dist/components/media/avatar-group/avatar-group.styles.js +2 -0
  531. package/dist/components/media/avatar-group/avatar-group.styles.js.map +1 -1
  532. package/dist/components/media/file-icon/file-icon.class.d.ts.map +1 -1
  533. package/dist/components/media/file-icon/file-icon.class.js +3 -1
  534. package/dist/components/media/file-icon/file-icon.class.js.map +1 -1
  535. package/dist/components/media/file-icon/file-icon.styles.d.ts.map +1 -1
  536. package/dist/components/media/file-icon/file-icon.styles.js +21 -3
  537. package/dist/components/media/file-icon/file-icon.styles.js.map +1 -1
  538. package/dist/components/media/file-input/file-input.class.d.ts +3 -1
  539. package/dist/components/media/file-input/file-input.class.d.ts.map +1 -1
  540. package/dist/components/media/file-input/file-input.class.js +36 -15
  541. package/dist/components/media/file-input/file-input.class.js.map +1 -1
  542. package/dist/components/media/file-input/file-input.styles.d.ts.map +1 -1
  543. package/dist/components/media/file-input/file-input.styles.js +45 -4
  544. package/dist/components/media/file-input/file-input.styles.js.map +1 -1
  545. package/dist/components/media/flag/flag.class.d.ts.map +1 -1
  546. package/dist/components/media/flag/flag.class.js +1 -4
  547. package/dist/components/media/flag/flag.class.js.map +1 -1
  548. package/dist/components/media/image-comparer/image-comparer.class.d.ts +2 -0
  549. package/dist/components/media/image-comparer/image-comparer.class.d.ts.map +1 -1
  550. package/dist/components/media/image-comparer/image-comparer.class.js +2 -0
  551. package/dist/components/media/image-comparer/image-comparer.class.js.map +1 -1
  552. package/dist/components/media/image-viewer/image-viewer.class.d.ts +1 -0
  553. package/dist/components/media/image-viewer/image-viewer.class.d.ts.map +1 -1
  554. package/dist/components/media/image-viewer/image-viewer.class.js +18 -3
  555. package/dist/components/media/image-viewer/image-viewer.class.js.map +1 -1
  556. package/dist/components/media/image-viewer/image-viewer.styles.d.ts.map +1 -1
  557. package/dist/components/media/image-viewer/image-viewer.styles.js +5 -1
  558. package/dist/components/media/image-viewer/image-viewer.styles.js.map +1 -1
  559. package/dist/components/media/lightbox/lightbox.class.d.ts +3 -2
  560. package/dist/components/media/lightbox/lightbox.class.d.ts.map +1 -1
  561. package/dist/components/media/lightbox/lightbox.class.js +4 -3
  562. package/dist/components/media/lightbox/lightbox.class.js.map +1 -1
  563. package/dist/components/media/map/map.class.d.ts +18 -5
  564. package/dist/components/media/map/map.class.d.ts.map +1 -1
  565. package/dist/components/media/map/map.class.js +139 -30
  566. package/dist/components/media/map/map.class.js.map +1 -1
  567. package/dist/components/media/map/map.styles.d.ts.map +1 -1
  568. package/dist/components/media/map/map.styles.js +8 -0
  569. package/dist/components/media/map/map.styles.js.map +1 -1
  570. package/dist/components/media/media-card/media-card.class.d.ts +2 -1
  571. package/dist/components/media/media-card/media-card.class.d.ts.map +1 -1
  572. package/dist/components/media/media-card/media-card.class.js +8 -2
  573. package/dist/components/media/media-card/media-card.class.js.map +1 -1
  574. package/dist/components/media/qr-code/qr-code.class.d.ts +8 -6
  575. package/dist/components/media/qr-code/qr-code.class.d.ts.map +1 -1
  576. package/dist/components/media/qr-code/qr-code.class.js +15 -7
  577. package/dist/components/media/qr-code/qr-code.class.js.map +1 -1
  578. package/dist/components/media/zoomable-frame/zoomable-frame.class.d.ts.map +1 -1
  579. package/dist/components/media/zoomable-frame/zoomable-frame.class.js +4 -1
  580. package/dist/components/media/zoomable-frame/zoomable-frame.class.js.map +1 -1
  581. package/dist/components/overlays/badge/badge.styles.d.ts.map +1 -1
  582. package/dist/components/overlays/badge/badge.styles.js +2 -1
  583. package/dist/components/overlays/badge/badge.styles.js.map +1 -1
  584. package/dist/components/overlays/callout/callout.class.js +1 -1
  585. package/dist/components/overlays/callout/callout.class.js.map +1 -1
  586. package/dist/components/overlays/callout/callout.styles.d.ts.map +1 -1
  587. package/dist/components/overlays/callout/callout.styles.js +5 -4
  588. package/dist/components/overlays/callout/callout.styles.js.map +1 -1
  589. package/dist/components/overlays/chip/chip-group.class.d.ts +11 -0
  590. package/dist/components/overlays/chip/chip-group.class.d.ts.map +1 -1
  591. package/dist/components/overlays/chip/chip-group.class.js +88 -4
  592. package/dist/components/overlays/chip/chip-group.class.js.map +1 -1
  593. package/dist/components/overlays/chip/chip.class.d.ts +5 -3
  594. package/dist/components/overlays/chip/chip.class.d.ts.map +1 -1
  595. package/dist/components/overlays/chip/chip.class.js +19 -10
  596. package/dist/components/overlays/chip/chip.class.js.map +1 -1
  597. package/dist/components/overlays/chip/chip.styles.d.ts.map +1 -1
  598. package/dist/components/overlays/chip/chip.styles.js +3 -2
  599. package/dist/components/overlays/chip/chip.styles.js.map +1 -1
  600. package/dist/components/overlays/dialog/confirm.d.ts +3 -1
  601. package/dist/components/overlays/dialog/confirm.d.ts.map +1 -1
  602. package/dist/components/overlays/dialog/confirm.js +16 -5
  603. package/dist/components/overlays/dialog/confirm.js.map +1 -1
  604. package/dist/components/overlays/dialog/dialog.class.d.ts +8 -7
  605. package/dist/components/overlays/dialog/dialog.class.d.ts.map +1 -1
  606. package/dist/components/overlays/dialog/dialog.class.js +18 -15
  607. package/dist/components/overlays/dialog/dialog.class.js.map +1 -1
  608. package/dist/components/overlays/empty/empty.styles.d.ts.map +1 -1
  609. package/dist/components/overlays/empty/empty.styles.js +12 -0
  610. package/dist/components/overlays/empty/empty.styles.js.map +1 -1
  611. package/dist/components/overlays/kbd/kbd.class.d.ts +3 -3
  612. package/dist/components/overlays/kbd/kbd.class.d.ts.map +1 -1
  613. package/dist/components/overlays/kbd/kbd.class.js +8 -4
  614. package/dist/components/overlays/kbd/kbd.class.js.map +1 -1
  615. package/dist/components/overlays/kbd/kbd.styles.d.ts.map +1 -1
  616. package/dist/components/overlays/kbd/kbd.styles.js +8 -0
  617. package/dist/components/overlays/kbd/kbd.styles.js.map +1 -1
  618. package/dist/components/overlays/overlay/popover.class.d.ts +18 -7
  619. package/dist/components/overlays/overlay/popover.class.d.ts.map +1 -1
  620. package/dist/components/overlays/overlay/popover.class.js +71 -14
  621. package/dist/components/overlays/overlay/popover.class.js.map +1 -1
  622. package/dist/components/overlays/overlay/tooltip.class.d.ts +32 -15
  623. package/dist/components/overlays/overlay/tooltip.class.d.ts.map +1 -1
  624. package/dist/components/overlays/overlay/tooltip.class.js +155 -34
  625. package/dist/components/overlays/overlay/tooltip.class.js.map +1 -1
  626. package/dist/components/overlays/progress/progress-bar.class.d.ts +6 -1
  627. package/dist/components/overlays/progress/progress-bar.class.d.ts.map +1 -1
  628. package/dist/components/overlays/progress/progress-bar.class.js +25 -3
  629. package/dist/components/overlays/progress/progress-bar.class.js.map +1 -1
  630. package/dist/components/overlays/progress/progress-ring.class.d.ts +6 -1
  631. package/dist/components/overlays/progress/progress-ring.class.d.ts.map +1 -1
  632. package/dist/components/overlays/progress/progress-ring.class.js +25 -3
  633. package/dist/components/overlays/progress/progress-ring.class.js.map +1 -1
  634. package/dist/components/overlays/rating/rating.class.d.ts +4 -2
  635. package/dist/components/overlays/rating/rating.class.d.ts.map +1 -1
  636. package/dist/components/overlays/rating/rating.class.js +17 -4
  637. package/dist/components/overlays/rating/rating.class.js.map +1 -1
  638. package/dist/components/overlays/rating/rating.styles.js +2 -2
  639. package/dist/components/overlays/spinner/spinner.class.d.ts +8 -3
  640. package/dist/components/overlays/spinner/spinner.class.d.ts.map +1 -1
  641. package/dist/components/overlays/spinner/spinner.class.js +26 -5
  642. package/dist/components/overlays/spinner/spinner.class.js.map +1 -1
  643. package/dist/components/overlays/spinner/spinner.styles.js +3 -3
  644. package/dist/components/overlays/toast/toast-item.class.d.ts +11 -1
  645. package/dist/components/overlays/toast/toast-item.class.d.ts.map +1 -1
  646. package/dist/components/overlays/toast/toast-item.class.js +81 -17
  647. package/dist/components/overlays/toast/toast-item.class.js.map +1 -1
  648. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.d.ts.map +1 -1
  649. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.js +4 -3
  650. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.js.map +1 -1
  651. package/dist/components/retrieval/citation-badge/citation-badge.class.d.ts +2 -1
  652. package/dist/components/retrieval/citation-badge/citation-badge.class.d.ts.map +1 -1
  653. package/dist/components/retrieval/citation-badge/citation-badge.class.js +11 -6
  654. package/dist/components/retrieval/citation-badge/citation-badge.class.js.map +1 -1
  655. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts +3 -1
  656. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts.map +1 -1
  657. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +21 -3
  658. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js.map +1 -1
  659. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.d.ts.map +1 -1
  660. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +9 -0
  661. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js.map +1 -1
  662. package/dist/components/retrieval/entity-dossier/entity-dossier.class.d.ts +28 -9
  663. package/dist/components/retrieval/entity-dossier/entity-dossier.class.d.ts.map +1 -1
  664. package/dist/components/retrieval/entity-dossier/entity-dossier.class.js +18 -5
  665. package/dist/components/retrieval/entity-dossier/entity-dossier.class.js.map +1 -1
  666. package/dist/components/retrieval/graph/graph-canvas.d.ts.map +1 -1
  667. package/dist/components/retrieval/graph/graph-canvas.js +20 -4
  668. package/dist/components/retrieval/graph/graph-canvas.js.map +1 -1
  669. package/dist/components/retrieval/graph/graph-loader.d.ts.map +1 -1
  670. package/dist/components/retrieval/graph/graph-loader.js +23 -1
  671. package/dist/components/retrieval/graph/graph-loader.js.map +1 -1
  672. package/dist/components/retrieval/graph/graph.class.d.ts +21 -3
  673. package/dist/components/retrieval/graph/graph.class.d.ts.map +1 -1
  674. package/dist/components/retrieval/graph/graph.class.js +154 -68
  675. package/dist/components/retrieval/graph/graph.class.js.map +1 -1
  676. package/dist/components/retrieval/graph/graph.styles.d.ts.map +1 -1
  677. package/dist/components/retrieval/graph/graph.styles.js +18 -0
  678. package/dist/components/retrieval/graph/graph.styles.js.map +1 -1
  679. package/dist/components/retrieval/graph-legend/graph-legend.class.d.ts +3 -0
  680. package/dist/components/retrieval/graph-legend/graph-legend.class.d.ts.map +1 -1
  681. package/dist/components/retrieval/graph-legend/graph-legend.class.js +8 -2
  682. package/dist/components/retrieval/graph-legend/graph-legend.class.js.map +1 -1
  683. package/dist/components/retrieval/graph-legend/graph-legend.styles.d.ts.map +1 -1
  684. package/dist/components/retrieval/graph-legend/graph-legend.styles.js +11 -1
  685. package/dist/components/retrieval/graph-legend/graph-legend.styles.js.map +1 -1
  686. package/dist/components/retrieval/grounding-summary/grounding-summary.class.d.ts +1 -0
  687. package/dist/components/retrieval/grounding-summary/grounding-summary.class.d.ts.map +1 -1
  688. package/dist/components/retrieval/grounding-summary/grounding-summary.class.js +1 -0
  689. package/dist/components/retrieval/grounding-summary/grounding-summary.class.js.map +1 -1
  690. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts +3 -2
  691. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts.map +1 -1
  692. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +11 -4
  693. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js.map +1 -1
  694. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts +7 -3
  695. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts.map +1 -1
  696. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +27 -6
  697. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js.map +1 -1
  698. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +24 -0
  699. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts.map +1 -1
  700. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +19 -4
  701. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js.map +1 -1
  702. package/dist/components/retrieval/memory-panel/memory-panel.class.d.ts +5 -0
  703. package/dist/components/retrieval/memory-panel/memory-panel.class.d.ts.map +1 -1
  704. package/dist/components/retrieval/memory-panel/memory-panel.class.js +62 -3
  705. package/dist/components/retrieval/memory-panel/memory-panel.class.js.map +1 -1
  706. package/dist/components/retrieval/node-palette/node-palette.class.d.ts +2 -0
  707. package/dist/components/retrieval/node-palette/node-palette.class.d.ts.map +1 -1
  708. package/dist/components/retrieval/node-palette/node-palette.class.js.map +1 -1
  709. package/dist/components/retrieval/path-strip/path-strip.class.d.ts +2 -1
  710. package/dist/components/retrieval/path-strip/path-strip.class.d.ts.map +1 -1
  711. package/dist/components/retrieval/path-strip/path-strip.class.js +3 -2
  712. package/dist/components/retrieval/path-strip/path-strip.class.js.map +1 -1
  713. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +6 -2
  714. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts.map +1 -1
  715. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +20 -2
  716. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js.map +1 -1
  717. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts +12 -2
  718. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts.map +1 -1
  719. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +117 -5
  720. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js.map +1 -1
  721. package/dist/components/retrieval/retrieval-search/retrieval-search.styles.d.ts.map +1 -1
  722. package/dist/components/retrieval/retrieval-search/retrieval-search.styles.js +19 -0
  723. package/dist/components/retrieval/retrieval-search/retrieval-search.styles.js.map +1 -1
  724. package/dist/components/retrieval/source-card/source-card.class.d.ts.map +1 -1
  725. package/dist/components/retrieval/source-card/source-card.class.js +8 -1
  726. package/dist/components/retrieval/source-card/source-card.class.js.map +1 -1
  727. package/dist/components/retrieval/source-list/source-list.class.d.ts +7 -0
  728. package/dist/components/retrieval/source-list/source-list.class.d.ts.map +1 -1
  729. package/dist/components/retrieval/source-list/source-list.class.js +48 -5
  730. package/dist/components/retrieval/source-list/source-list.class.js.map +1 -1
  731. package/dist/components/retrieval/source-picker/source-picker.class.d.ts +5 -2
  732. package/dist/components/retrieval/source-picker/source-picker.class.d.ts.map +1 -1
  733. package/dist/components/retrieval/source-picker/source-picker.class.js +36 -11
  734. package/dist/components/retrieval/source-picker/source-picker.class.js.map +1 -1
  735. package/dist/components/retrieval/source-picker/source-picker.styles.d.ts.map +1 -1
  736. package/dist/components/retrieval/source-picker/source-picker.styles.js +0 -3
  737. package/dist/components/retrieval/source-picker/source-picker.styles.js.map +1 -1
  738. package/dist/components/utility/copy-button/copy-button.class.d.ts +2 -1
  739. package/dist/components/utility/copy-button/copy-button.class.d.ts.map +1 -1
  740. package/dist/components/utility/copy-button/copy-button.class.js +8 -0
  741. package/dist/components/utility/copy-button/copy-button.class.js.map +1 -1
  742. package/dist/components/utility/diff-view/diff-view.class.d.ts.map +1 -1
  743. package/dist/components/utility/diff-view/diff-view.class.js +7 -0
  744. package/dist/components/utility/diff-view/diff-view.class.js.map +1 -1
  745. package/dist/components/utility/divider/divider.class.d.ts.map +1 -1
  746. package/dist/components/utility/divider/divider.class.js +9 -2
  747. package/dist/components/utility/divider/divider.class.js.map +1 -1
  748. package/dist/components/utility/export-button/csv.d.ts.map +1 -1
  749. package/dist/components/utility/export-button/csv.js +4 -5
  750. package/dist/components/utility/export-button/csv.js.map +1 -1
  751. package/dist/components/utility/export-button/export-button.class.d.ts +1 -0
  752. package/dist/components/utility/export-button/export-button.class.d.ts.map +1 -1
  753. package/dist/components/utility/export-button/export-button.class.js +35 -5
  754. package/dist/components/utility/export-button/export-button.class.js.map +1 -1
  755. package/dist/components/utility/format/format-bytes.class.d.ts.map +1 -1
  756. package/dist/components/utility/format/format-bytes.class.js +13 -3
  757. package/dist/components/utility/format/format-bytes.class.js.map +1 -1
  758. package/dist/components/utility/format/format-date.class.d.ts.map +1 -1
  759. package/dist/components/utility/format/format-date.class.js +10 -2
  760. package/dist/components/utility/format/format-date.class.js.map +1 -1
  761. package/dist/components/utility/format/format-number.class.d.ts.map +1 -1
  762. package/dist/components/utility/format/format-number.class.js +10 -2
  763. package/dist/components/utility/format/format-number.class.js.map +1 -1
  764. package/dist/components/utility/icon/icon.class.d.ts +4 -0
  765. package/dist/components/utility/icon/icon.class.d.ts.map +1 -1
  766. package/dist/components/utility/icon/icon.class.js +34 -0
  767. package/dist/components/utility/icon/icon.class.js.map +1 -1
  768. package/dist/components/utility/json-viewer/json-viewer.class.d.ts +5 -1
  769. package/dist/components/utility/json-viewer/json-viewer.class.d.ts.map +1 -1
  770. package/dist/components/utility/json-viewer/json-viewer.class.js +22 -6
  771. package/dist/components/utility/json-viewer/json-viewer.class.js.map +1 -1
  772. package/dist/components/utility/json-viewer/json-viewer.styles.js +1 -1
  773. package/dist/components/utility/known-date/known-date.class.d.ts.map +1 -1
  774. package/dist/components/utility/known-date/known-date.class.js +4 -1
  775. package/dist/components/utility/known-date/known-date.class.js.map +1 -1
  776. package/dist/components/utility/mention-popover/mention-popover.class.d.ts.map +1 -1
  777. package/dist/components/utility/mention-popover/mention-popover.class.js +31 -8
  778. package/dist/components/utility/mention-popover/mention-popover.class.js.map +1 -1
  779. package/dist/components/utility/poll-status/poll-status.class.d.ts +7 -0
  780. package/dist/components/utility/poll-status/poll-status.class.d.ts.map +1 -1
  781. package/dist/components/utility/poll-status/poll-status.class.js +36 -5
  782. package/dist/components/utility/poll-status/poll-status.class.js.map +1 -1
  783. package/dist/components/utility/random-content/random-content.class.d.ts.map +1 -1
  784. package/dist/components/utility/random-content/random-content.class.js +22 -3
  785. package/dist/components/utility/random-content/random-content.class.js.map +1 -1
  786. package/dist/components/utility/tour/tour.class.d.ts +7 -6
  787. package/dist/components/utility/tour/tour.class.d.ts.map +1 -1
  788. package/dist/components/utility/tour/tour.class.js +62 -42
  789. package/dist/components/utility/tour/tour.class.js.map +1 -1
  790. package/dist/components/viewers/archive-viewer/archive-loader.d.ts.map +1 -1
  791. package/dist/components/viewers/archive-viewer/archive-loader.js +5 -1
  792. package/dist/components/viewers/archive-viewer/archive-loader.js.map +1 -1
  793. package/dist/components/viewers/archive-viewer/archive-viewer.class.d.ts +45 -4
  794. package/dist/components/viewers/archive-viewer/archive-viewer.class.d.ts.map +1 -1
  795. package/dist/components/viewers/archive-viewer/archive-viewer.class.js +257 -10
  796. package/dist/components/viewers/archive-viewer/archive-viewer.class.js.map +1 -1
  797. package/dist/components/viewers/archive-viewer/archive-viewer.styles.d.ts +3 -0
  798. package/dist/components/viewers/archive-viewer/archive-viewer.styles.d.ts.map +1 -1
  799. package/dist/components/viewers/archive-viewer/archive-viewer.styles.js +45 -0
  800. package/dist/components/viewers/archive-viewer/archive-viewer.styles.js.map +1 -1
  801. package/dist/components/viewers/calendar-viewer/calendar-loader.d.ts.map +1 -1
  802. package/dist/components/viewers/calendar-viewer/calendar-loader.js +6 -1
  803. package/dist/components/viewers/calendar-viewer/calendar-loader.js.map +1 -1
  804. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.d.ts +1 -0
  805. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.d.ts.map +1 -1
  806. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.js +7 -1
  807. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.js.map +1 -1
  808. package/dist/components/viewers/contact-viewer/contact-viewer.class.d.ts +1 -0
  809. package/dist/components/viewers/contact-viewer/contact-viewer.class.d.ts.map +1 -1
  810. package/dist/components/viewers/contact-viewer/contact-viewer.class.js +7 -1
  811. package/dist/components/viewers/contact-viewer/contact-viewer.class.js.map +1 -1
  812. package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts +1 -0
  813. package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts.map +1 -1
  814. package/dist/components/viewers/csv-viewer/csv-viewer.class.js +11 -3
  815. package/dist/components/viewers/csv-viewer/csv-viewer.class.js.map +1 -1
  816. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +1 -0
  817. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts.map +1 -1
  818. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +9 -2
  819. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js.map +1 -1
  820. package/dist/components/viewers/document-preview/document-preview.class.d.ts +2 -1
  821. package/dist/components/viewers/document-preview/document-preview.class.d.ts.map +1 -1
  822. package/dist/components/viewers/document-preview/document-preview.class.js +53 -14
  823. package/dist/components/viewers/document-preview/document-preview.class.js.map +1 -1
  824. package/dist/components/viewers/document-viewer/document-viewer.class.d.ts +9 -3
  825. package/dist/components/viewers/document-viewer/document-viewer.class.d.ts.map +1 -1
  826. package/dist/components/viewers/document-viewer/document-viewer.class.js +47 -13
  827. package/dist/components/viewers/document-viewer/document-viewer.class.js.map +1 -1
  828. package/dist/components/viewers/docx-viewer/docx-loader.d.ts.map +1 -1
  829. package/dist/components/viewers/docx-viewer/docx-loader.js +7 -2
  830. package/dist/components/viewers/docx-viewer/docx-loader.js.map +1 -1
  831. package/dist/components/viewers/docx-viewer/docx-viewer.class.d.ts +23 -3
  832. package/dist/components/viewers/docx-viewer/docx-viewer.class.d.ts.map +1 -1
  833. package/dist/components/viewers/docx-viewer/docx-viewer.class.js +100 -9
  834. package/dist/components/viewers/docx-viewer/docx-viewer.class.js.map +1 -1
  835. package/dist/components/viewers/docx-viewer/docx-viewer.styles.d.ts.map +1 -1
  836. package/dist/components/viewers/docx-viewer/docx-viewer.styles.js +28 -0
  837. package/dist/components/viewers/docx-viewer/docx-viewer.styles.js.map +1 -1
  838. package/dist/components/viewers/ebook-viewer/ebook-loader.d.ts.map +1 -1
  839. package/dist/components/viewers/ebook-viewer/ebook-loader.js +2 -1
  840. package/dist/components/viewers/ebook-viewer/ebook-loader.js.map +1 -1
  841. package/dist/components/viewers/ebook-viewer/ebook-viewer-register.js +8 -1
  842. package/dist/components/viewers/ebook-viewer/ebook-viewer-register.js.map +1 -1
  843. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.d.ts +10 -7
  844. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.d.ts.map +1 -1
  845. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js +115 -32
  846. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js.map +1 -1
  847. package/dist/components/viewers/email-viewer/email-loader.d.ts.map +1 -1
  848. package/dist/components/viewers/email-viewer/email-loader.js +4 -2
  849. package/dist/components/viewers/email-viewer/email-loader.js.map +1 -1
  850. package/dist/components/viewers/email-viewer/email-viewer.class.d.ts +5 -3
  851. package/dist/components/viewers/email-viewer/email-viewer.class.d.ts.map +1 -1
  852. package/dist/components/viewers/email-viewer/email-viewer.class.js +50 -5
  853. package/dist/components/viewers/email-viewer/email-viewer.class.js.map +1 -1
  854. package/dist/components/viewers/email-viewer/email-viewer.styles.js +1 -1
  855. package/dist/components/viewers/geojson-view/geojson-view.class.d.ts +13 -2
  856. package/dist/components/viewers/geojson-view/geojson-view.class.d.ts.map +1 -1
  857. package/dist/components/viewers/geojson-view/geojson-view.class.js +67 -8
  858. package/dist/components/viewers/geojson-view/geojson-view.class.js.map +1 -1
  859. package/dist/components/viewers/geojson-view/geojson-view.styles.d.ts +2 -0
  860. package/dist/components/viewers/geojson-view/geojson-view.styles.d.ts.map +1 -0
  861. package/dist/components/viewers/geojson-view/geojson-view.styles.js +22 -0
  862. package/dist/components/viewers/geojson-view/geojson-view.styles.js.map +1 -0
  863. package/dist/components/viewers/highlight-layer/highlight-layer.class.d.ts +3 -2
  864. package/dist/components/viewers/highlight-layer/highlight-layer.class.d.ts.map +1 -1
  865. package/dist/components/viewers/highlight-layer/highlight-layer.class.js +32 -13
  866. package/dist/components/viewers/highlight-layer/highlight-layer.class.js.map +1 -1
  867. package/dist/components/viewers/html-viewer/dompurify-loader.d.ts.map +1 -1
  868. package/dist/components/viewers/html-viewer/dompurify-loader.js +3 -1
  869. package/dist/components/viewers/html-viewer/dompurify-loader.js.map +1 -1
  870. package/dist/components/viewers/html-viewer/html-viewer.class.d.ts +3 -1
  871. package/dist/components/viewers/html-viewer/html-viewer.class.d.ts.map +1 -1
  872. package/dist/components/viewers/html-viewer/html-viewer.class.js +7 -2
  873. package/dist/components/viewers/html-viewer/html-viewer.class.js.map +1 -1
  874. package/dist/components/viewers/html-viewer/html-viewer.styles.d.ts.map +1 -1
  875. package/dist/components/viewers/html-viewer/html-viewer.styles.js +6 -1
  876. package/dist/components/viewers/html-viewer/html-viewer.styles.js.map +1 -1
  877. package/dist/components/viewers/include/include.class.d.ts +3 -3
  878. package/dist/components/viewers/include/include.class.d.ts.map +1 -1
  879. package/dist/components/viewers/include/include.class.js +13 -8
  880. package/dist/components/viewers/include/include.class.js.map +1 -1
  881. package/dist/components/viewers/notebook-viewer/dompurify-loader.d.ts.map +1 -1
  882. package/dist/components/viewers/notebook-viewer/dompurify-loader.js +5 -1
  883. package/dist/components/viewers/notebook-viewer/dompurify-loader.js.map +1 -1
  884. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts +1 -0
  885. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts.map +1 -1
  886. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +17 -4
  887. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js.map +1 -1
  888. package/dist/components/viewers/page-rail/page-rail.class.d.ts +8 -0
  889. package/dist/components/viewers/page-rail/page-rail.class.d.ts.map +1 -1
  890. package/dist/components/viewers/page-rail/page-rail.class.js +91 -0
  891. package/dist/components/viewers/page-rail/page-rail.class.js.map +1 -1
  892. package/dist/components/viewers/pdf-viewer/pdf-loader.d.ts.map +1 -1
  893. package/dist/components/viewers/pdf-viewer/pdf-loader.js +13 -1
  894. package/dist/components/viewers/pdf-viewer/pdf-loader.js.map +1 -1
  895. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +12 -5
  896. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts.map +1 -1
  897. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +103 -34
  898. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js.map +1 -1
  899. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-loader.d.ts.map +1 -1
  900. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-loader.js +9 -1
  901. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-loader.js.map +1 -1
  902. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.d.ts.map +1 -1
  903. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +4 -1
  904. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js.map +1 -1
  905. package/dist/components/viewers/svg-viewer/dompurify-loader.d.ts.map +1 -1
  906. package/dist/components/viewers/svg-viewer/dompurify-loader.js +5 -1
  907. package/dist/components/viewers/svg-viewer/dompurify-loader.js.map +1 -1
  908. package/dist/components/viewers/svg-viewer/svg-viewer.class.d.ts +2 -1
  909. package/dist/components/viewers/svg-viewer/svg-viewer.class.d.ts.map +1 -1
  910. package/dist/components/viewers/svg-viewer/svg-viewer.class.js +50 -14
  911. package/dist/components/viewers/svg-viewer/svg-viewer.class.js.map +1 -1
  912. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts +1 -0
  913. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts.map +1 -1
  914. package/dist/components/viewers/xml-viewer/xml-viewer.class.js +15 -3
  915. package/dist/components/viewers/xml-viewer/xml-viewer.class.js.map +1 -1
  916. package/dist/internal/anchor-target.d.ts.map +1 -1
  917. package/dist/internal/anchor-target.js +16 -5
  918. package/dist/internal/anchor-target.js.map +1 -1
  919. package/dist/internal/localization.d.ts +1 -1
  920. package/dist/internal/localization.d.ts.map +1 -1
  921. package/dist/internal/localization.js +19 -0
  922. package/dist/internal/localization.js.map +1 -1
  923. package/dist/internal/map-canvas-ready.d.ts +7 -0
  924. package/dist/internal/map-canvas-ready.d.ts.map +1 -0
  925. package/dist/internal/map-canvas-ready.js +13 -0
  926. package/dist/internal/map-canvas-ready.js.map +1 -0
  927. package/dist/internal/numbers.d.ts +14 -0
  928. package/dist/internal/numbers.d.ts.map +1 -1
  929. package/dist/internal/numbers.js +72 -0
  930. package/dist/internal/numbers.js.map +1 -1
  931. package/dist/internal/safe-css.d.ts +17 -0
  932. package/dist/internal/safe-css.d.ts.map +1 -1
  933. package/dist/internal/safe-css.js +64 -9
  934. package/dist/internal/safe-css.js.map +1 -1
  935. package/dist/lyra.d.ts +1 -1
  936. package/dist/lyra.d.ts.map +1 -1
  937. package/dist/lyra.js.map +1 -1
  938. package/llms/components/lr-animated-image.md +2 -0
  939. package/llms/components/lr-animation.md +1 -1
  940. package/llms/components/lr-approval-queue.md +2 -0
  941. package/llms/components/lr-archive-viewer.md +20 -5
  942. package/llms/components/lr-attachment-trigger.md +8 -6
  943. package/llms/components/lr-av-player.md +11 -3
  944. package/llms/components/lr-avatar-group.md +3 -0
  945. package/llms/components/lr-avatar.md +6 -5
  946. package/llms/components/lr-bar-chart.md +10 -8
  947. package/llms/components/lr-box-plot.md +14 -6
  948. package/llms/components/lr-bubble-chart.md +10 -8
  949. package/llms/components/lr-calendar-viewer.md +3 -2
  950. package/llms/components/lr-calendar.md +4 -4
  951. package/llms/components/lr-carousel.md +2 -0
  952. package/llms/components/lr-chart.md +57 -23
  953. package/llms/components/lr-chip-group.md +3 -1
  954. package/llms/components/lr-chip.md +3 -1
  955. package/llms/components/lr-citation-badge.md +3 -2
  956. package/llms/components/lr-code-editor.md +1 -1
  957. package/llms/components/lr-combobox.md +6 -2
  958. package/llms/components/lr-compare-panel.md +8 -2
  959. package/llms/components/lr-contact-viewer.md +3 -2
  960. package/llms/components/lr-copy-button.md +2 -0
  961. package/llms/components/lr-csv-viewer.md +3 -3
  962. package/llms/components/lr-dashboard-grid.md +2 -1
  963. package/llms/components/lr-dataset-viewer.md +4 -3
  964. package/llms/components/lr-dialog.md +19 -15
  965. package/llms/components/lr-diff-view.md +1 -0
  966. package/llms/components/lr-divider.md +2 -1
  967. package/llms/components/lr-document-preview.md +4 -2
  968. package/llms/components/lr-document-viewer.md +8 -2
  969. package/llms/components/lr-docx-viewer.md +12 -6
  970. package/llms/components/lr-doughnut-chart.md +10 -8
  971. package/llms/components/lr-dropdown-item.md +3 -1
  972. package/llms/components/lr-ebook-viewer.md +16 -6
  973. package/llms/components/lr-email-viewer.md +3 -2
  974. package/llms/components/lr-embedding-explorer.md +2 -1
  975. package/llms/components/lr-env-list.md +2 -1
  976. package/llms/components/lr-eval-result.md +2 -0
  977. package/llms/components/lr-export-button.md +5 -1
  978. package/llms/components/lr-file-icon.md +3 -1
  979. package/llms/components/lr-file-input.md +8 -4
  980. package/llms/components/lr-flow-minimap.md +8 -2
  981. package/llms/components/lr-flow-node.md +8 -2
  982. package/llms/components/lr-flow-run-overlay.md +10 -3
  983. package/llms/components/lr-format-bytes.md +2 -1
  984. package/llms/components/lr-format-number.md +3 -0
  985. package/llms/components/lr-gauge.md +4 -0
  986. package/llms/components/lr-geojson-view.md +10 -3
  987. package/llms/components/lr-graph-legend.md +5 -3
  988. package/llms/components/lr-graph.md +20 -12
  989. package/llms/components/lr-grounding-summary.md +2 -1
  990. package/llms/components/lr-heatmap.md +8 -5
  991. package/llms/components/lr-highlight-layer.md +2 -1
  992. package/llms/components/lr-histogram.md +12 -5
  993. package/llms/components/lr-html-viewer.md +3 -2
  994. package/llms/components/lr-icon.md +3 -1
  995. package/llms/components/lr-image-viewer.md +5 -0
  996. package/llms/components/lr-include.md +4 -3
  997. package/llms/components/lr-ingestion-queue.md +2 -1
  998. package/llms/components/lr-json-viewer.md +10 -3
  999. package/llms/components/lr-kbd.md +3 -2
  1000. package/llms/components/lr-knowledge-base-admin.md +3 -1
  1001. package/llms/components/lr-knowledge-graph-explorer.md +2 -1
  1002. package/llms/components/lr-known-date.md +2 -1
  1003. package/llms/components/lr-lightbox.md +5 -4
  1004. package/llms/components/lr-line-chart.md +10 -8
  1005. package/llms/components/lr-lite-chart.md +46 -32
  1006. package/llms/components/lr-map.md +10 -5
  1007. package/llms/components/lr-mcp-app.md +6 -0
  1008. package/llms/components/lr-media-card.md +3 -1
  1009. package/llms/components/lr-mention-popover.md +5 -2
  1010. package/llms/components/lr-menu-item.md +3 -1
  1011. package/llms/components/lr-menu.md +3 -1
  1012. package/llms/components/lr-message-feedback.md +2 -1
  1013. package/llms/components/lr-message-parts.md +5 -1
  1014. package/llms/components/lr-model-select.md +5 -1
  1015. package/llms/components/lr-notebook-viewer.md +7 -3
  1016. package/llms/components/lr-option.md +6 -2
  1017. package/llms/components/lr-page-rail.md +5 -0
  1018. package/llms/components/lr-pdf-viewer.md +10 -3
  1019. package/llms/components/lr-pie-chart.md +10 -8
  1020. package/llms/components/lr-polar-area-chart.md +10 -8
  1021. package/llms/components/lr-poll-status.md +11 -6
  1022. package/llms/components/lr-popover.md +2 -1
  1023. package/llms/components/lr-progress-bar.md +2 -1
  1024. package/llms/components/lr-progress-ring.md +2 -1
  1025. package/llms/components/lr-prompt-studio.md +4 -0
  1026. package/llms/components/lr-qr-code.md +7 -5
  1027. package/llms/components/lr-radar-chart.md +10 -8
  1028. package/llms/components/lr-radio-group.md +4 -1
  1029. package/llms/components/lr-radio.md +6 -2
  1030. package/llms/components/lr-random-content.md +2 -0
  1031. package/llms/components/lr-rating.md +7 -1
  1032. package/llms/components/lr-retrieval-search.md +2 -0
  1033. package/llms/components/lr-scatter-chart.md +10 -8
  1034. package/llms/components/lr-schema-viewer.md +9 -4
  1035. package/llms/components/lr-segmented.md +2 -0
  1036. package/llms/components/lr-selection-toolbar.md +2 -0
  1037. package/llms/components/lr-sequence-strip.md +10 -8
  1038. package/llms/components/lr-source-card.md +2 -1
  1039. package/llms/components/lr-source-list.md +2 -1
  1040. package/llms/components/lr-source-picker.md +4 -2
  1041. package/llms/components/lr-span-waterfall.md +13 -1
  1042. package/llms/components/lr-spinner.md +3 -1
  1043. package/llms/components/lr-stack-trace.md +6 -2
  1044. package/llms/components/lr-stat.md +7 -5
  1045. package/llms/components/lr-subagent-panel.md +4 -1
  1046. package/llms/components/lr-svg-viewer.md +5 -2
  1047. package/llms/components/lr-swatch-picker.md +6 -4
  1048. package/llms/components/lr-switch.md +2 -1
  1049. package/llms/components/lr-task-list.md +7 -2
  1050. package/llms/components/lr-terminal.md +13 -1
  1051. package/llms/components/lr-test-results.md +25 -7
  1052. package/llms/components/lr-textarea.md +1 -1
  1053. package/llms/components/lr-thinking-panel.md +4 -2
  1054. package/llms/components/lr-timeline-item.md +2 -1
  1055. package/llms/components/lr-timeline.md +2 -1
  1056. package/llms/components/lr-toast-item.md +8 -2
  1057. package/llms/components/lr-toast.md +8 -2
  1058. package/llms/components/lr-token-input.md +7 -5
  1059. package/llms/components/lr-tool-approval-dialog.md +6 -7
  1060. package/llms/components/lr-tool-param-form.md +21 -9
  1061. package/llms/components/lr-tool-select-dialog.md +11 -7
  1062. package/llms/components/lr-tool-timeline.md +6 -1
  1063. package/llms/components/lr-tooltip.md +12 -1
  1064. package/llms/components/lr-tour.md +19 -16
  1065. package/llms/components/lr-trace-tree.md +3 -0
  1066. package/llms/components/lr-tree-node.md +12 -3
  1067. package/llms/components/lr-tree.md +11 -2
  1068. package/llms/components/lr-widget.md +5 -3
  1069. package/llms/components/lr-word-cloud.md +7 -4
  1070. package/llms/components/lr-xml-viewer.md +4 -2
  1071. package/llms/index.md +1 -1
  1072. package/llms/peers.md +1 -1
  1073. package/llms-full.txt +791 -336
  1074. package/package.json +10 -5
  1075. package/vscode-css-data.json +429 -2
  1076. package/vscode-html-data.json +125 -122
  1077. package/web-types.json +378 -136
package/llms-full.txt CHANGED
@@ -727,6 +727,8 @@ number; accessibleLabel?: string; data?: unknown; dotColor?: string; group?: str
727
727
  boolean }` — the row shape used by the async `source` path. `icon` renders as a decorative leading
728
728
  visual, `badge` as trailing metadata, `accessibleLabel` can provide richer spoken text than the
729
729
  visible label, and `data` is retained without being rendered for retrieval through `selectedRows`.
730
+ `dotColor` accepts a valid CSS `color`; invalid values, declaration-breaking input, and `url()`
731
+ render a transparent dot.
730
732
  The light-DOM `<lr-option>` path normalizes its supported label/sub/dot/group fields to the same
731
733
  internal row model.
732
734
 
@@ -749,7 +751,6 @@ selection. It is the supported way to read that text; reaching into the shadow r
749
751
  carrying different strings. It fires for user input only: picking a row, the clear button,
750
752
  `form.reset()`, dismissing the listbox, a programmatic `value` write, and `setRangeText()` all blank
751
753
  the filter silently, mirroring how `<lr-input>`'s `lr-input` only reports user edits.
752
-
753
754
  `lr-show` and `lr-hide` report listbox visibility transitions.
754
755
  The internal input's `focus` and `blur` are re-dispatched as bubbling, composed host events.
755
756
 
@@ -852,9 +853,12 @@ box visibly (nothing is clipped or made unreachable), so leave it unset there.
852
853
  visible label)
853
854
  - `sub: string = ''` (optional secondary line rendered under the label, e.g. a status/date summary)
854
855
  - `dotColor: string = ''` (attribute `dot-color` — optional CSS color for a small leading status
855
- dot, any valid CSS color)
856
+ dot; invalid values, declaration-breaking input, and `url()` render the dot transparently)
856
857
  - `label` is a **read-only getter**: explicit `label` attribute wins, else trimmed `textContent`.
857
858
 
859
+ **Events:** `lr-option-change` — bubbles when the option's label or selectable data changes so
860
+ its parent `lr-combobox` or `lr-select` can refresh its normalized option rows.
861
+
858
862
  ```html
859
863
  <lr-combobox id="cb" label="Country" placeholder="Search…" with-clear>
860
864
  <lr-option value="fr">France</lr-option>
@@ -1319,7 +1323,7 @@ submission/validation/reset via `name`/`value`/`disabled`/`required`/`checkValid
1319
1323
  | --- | --- | --- | --- | --- |
1320
1324
  | `value` | `value` | `string` | `''` | The current text value. |
1321
1325
  | `rows` | `rows` | `number` | `3` | Visible text rows. |
1322
- | `resize` | `resize` | `'none' \| 'vertical' \| 'both' \| 'auto'` | `'vertical'` | Native CSS `resize` behavior, plus `'auto'` (`ResizeObserver`-driven grow-to-content, no manual handle). |
1326
+ | `resize` | `resize` | `'none' \| 'vertical' \| 'both' \| 'auto'` | `'vertical'` | Native CSS `resize` behavior, plus `'auto'` (`ResizeObserver`-driven grow-to-content, no manual handle). An invalid runtime value falls back to `'vertical'`; `'auto'` maps native CSS resize to `none`. |
1323
1327
  | `placeholder` | `placeholder` | `string` | `''` | Placeholder text. |
1324
1328
  | `readonly` | `readonly` | `boolean` | `false` | Native read-only behavior: prevents user edits while preserving focus, selection/copy, form submission, and silent programmatic editing methods. Reflected. |
1325
1329
  | `label` | `label` | `string` | `''` | Visible label text. Unset: no label chrome renders. |
@@ -2217,10 +2221,12 @@ named colors, the shape apps otherwise hand-roll as a row of round accent-color
2217
2221
 
2218
2222
  **Properties:**
2219
2223
  - `options: SwatchOption[] = []` (attribute: false) — `SwatchOption { value: string; color: string;
2220
- label: string; icon?: unknown; gemstone?: GemstoneKey }`; `color` is any CSS color string used as
2221
- the swatch fill, `label` is each swatch's accessible name and `title`. `icon` is an optional
2222
- custom shape rendered *instead of* the plain filled circle; `gemstone` selects the canonical
2223
- faceted glyph when `mode="gemstone"`. An explicit `icon` wins over `gemstone`.
2224
+ label: string; icon?: unknown; gemstone?: GemstoneKey }`; a valid CSS `color` is used as the
2225
+ swatch fill, while invalid values, declaration-breaking input, and `url()` are ignored (and are
2226
+ never interpolated into a gemstone SVG). `label` is each swatch's accessible name and `title`.
2227
+ `icon` is an optional custom shape rendered *instead of* the plain filled circle; `gemstone`
2228
+ selects the canonical faceted glyph when `mode="gemstone"`. An explicit `icon` wins over
2229
+ `gemstone`.
2224
2230
  - `value: string | null = null` — the currently selected option's `value` (controlled); `null`
2225
2231
  leaves nothing selected while keeping the first swatch tabbable.
2226
2232
  - `size: '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected — scales the swatch hit-area and
@@ -2444,7 +2450,8 @@ control's visible, clickable label (same as `<lr-checkbox>`).
2444
2450
  slotted `error` content). Unset: no error chrome renders.
2445
2451
 
2446
2452
  **Events:** `lr-change` (`detail: { checked: boolean }`) — fired on a user toggle (click or
2447
- Space/Enter); not fired for a programmatic `.checked` assignment.
2453
+ Space/Enter); not fired for a programmatic `.checked` assignment. The internal control's native
2454
+ `focus` and `blur` are re-dispatched as bubbling, composed host events.
2448
2455
 
2449
2456
  **Methods:** `focus(options?)`, `blur()`, and `click()` forward to the internal switch control.
2450
2457
 
@@ -2592,11 +2599,15 @@ A form-associated single-choice control. Use it alone or inside `lr-radio-group`
2592
2599
 
2593
2600
  **Properties:** `checked`, `disabled`, `required`, `name`, and `value` (all reflected where
2594
2601
  applicable). A selected radio submits its value through `ElementInternals`.
2602
+ An empty `name` is canonicalized to an omitted attribute rather than reappearing as `name=""`.
2595
2603
  `effectiveRequired` exposes the required state inherited from a containing radio group. `focus()`,
2596
2604
  `blur()`, and `click()` forward to the internal radio control.
2597
2605
 
2598
- **Events:** native-style composed `input` and `change`, plus `lr-change` with
2599
- `{ checked, value }`.
2606
+ **Events:** native-style composed `input` and `change`. A standalone radio also emits `lr-change`
2607
+ with `{ checked, value }`. An owned radio suppresses that child alias at its source; its group emits
2608
+ the sole aggregate `lr-change` described below, so capture and bubble listeners cannot observe two
2609
+ differently shaped aliases. The internal control's native `focus` and `blur` are re-dispatched as
2610
+ bubbling, composed host events.
2600
2611
 
2601
2612
  **Slots:** default label content.
2602
2613
 
@@ -2628,7 +2639,10 @@ focus; arrow navigation selects the next enabled radio.
2628
2639
  **Properties:** `label`, `hint`, `errorText` (`error-text`), `name`, `required`, `disabled`, and
2629
2640
  `aria-label` (through `accessibleLabel`).
2630
2641
 
2631
- **Events:** `lr-change` with `{ value, radio }`.
2642
+ **Events:** exactly one group-owned `lr-change` with `{ value, radio }` per owned selection,
2643
+ including keyboard activation. The selected child does not emit its standalone alias. Ownership is
2644
+ resolved synchronously, so immediate removal restores standalone behavior and immediate reparenting
2645
+ routes the event to the new group without waiting for a mutation-observer turn.
2632
2646
 
2633
2647
  **Slots:** default radios, `label`, `hint`, `error`.
2634
2648
 
@@ -2673,11 +2687,13 @@ the last token. `value` is a `string[]` and repeated values are submitted under
2673
2687
 
2674
2688
  **Properties:** `value`, `label`, `hint`, `errorText` (`error-text`), `placeholder`, `name`,
2675
2689
  `required`, `disabled`, `accessibleLabel` (attribute `aria-label` — forwarded to the internal text
2676
- input), `size: '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected — same scale as `lr-input`'s
2677
- `size`, scaling the input-wrapper's row height and text size across six tiers; the remove button's
2678
- hit area stays fixed at `40px` across all sizes), `allowDuplicates` (`allow-duplicates`, default
2679
- `false`), `editable` (reflected, default `false` see below), and `delimiter: string | null` (default
2680
- `','` see below).
2690
+ input), `spellcheck: boolean = true`, `autocapitalize: string = ''`, and `autoCorrect: string = ''`
2691
+ (attribute `autocorrect`) all three native text-entry hints are forwarded to both the draft input
2692
+ and the inline token editor `size: '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected
2693
+ same scale as `lr-input`'s `size`, scaling the input-wrapper's row height and text size across six
2694
+ tiers; the remove button's hit area stays fixed at `40px` across all sizes), `allowDuplicates`
2695
+ (`allow-duplicates`, default `false`), `editable` (reflected, default `false` — see below), and
2696
+ `delimiter: string | null` (default `','` — see below).
2681
2697
  **Slots:** `label`, `hint`, `error`.
2682
2698
  **Events:** native-style `input` and `change` (`detail: { value: string[] }`), bubbling/composed
2683
2699
  `focus` and `blur` re-dispatched from the internal text input, `lr-add` (`detail: { value }`),
@@ -2753,7 +2769,7 @@ optional line-number gutter. No syntax highlighting: `language` is metadata only
2753
2769
  `placeholder: string = ''`
2754
2770
  - `readonly: boolean = false` (reflected) — also disables Tab indentation
2755
2771
  - `resize: 'none' | 'both' | 'horizontal' | 'vertical' = 'both'` — written as the textarea's inline
2756
- `resize`
2772
+ `resize`; an invalid runtime value falls back to `'both'`
2757
2773
  - `wrap: 'off' | 'soft' | 'hard' = 'off'` — native textarea wrapping; `'off'` (the default) makes
2758
2774
  the `editor` part the single horizontal scroll viewport
2759
2775
  - `spellcheck: boolean = false` — off by default for code, and parsed with a string-aware converter
@@ -3183,10 +3199,12 @@ transparent)`) — text/background of `[part="trend"]` when its polarity (per `g
3183
3199
  "good"; `--lr-stat-trend-bad-color` (default `var(--lr-color-danger)`) and `--lr-stat-trend-bad-bg`
3184
3200
  (default `color-mix(in srgb, var(--lr-color-danger) 8%, transparent)`) — the "bad"-polarity
3185
3201
  counterparts. All four are independent of the headline value's `variant="success"`/`"danger"` tint,
3186
- which keeps reading the shared `--lr-color-success`/`--lr-color-danger` tokens directly retinting
3187
- the trend pill doesn't also recolor the value, and vice versa. Otherwise shared tokens only
3188
- (`--lr-color-success/-warning/-danger` drive the `variant`-colored value text; `--lr-color-brand`
3189
- drives `emphasis`'s accent edge and value tint).
3202
+ so retinting the trend pill doesn't also recolor the value, and vice versa.
3203
+ `--lr-stat-value-success-color` (default `var(--lr-color-success)`),
3204
+ `--lr-stat-value-warning-color` (default `var(--lr-color-warning)`), and
3205
+ `--lr-stat-value-danger-color` (default `var(--lr-color-danger)`) independently color the headline
3206
+ value for each non-neutral `variant`. `--lr-color-brand` still drives `emphasis`'s accent edge and
3207
+ value tint.
3190
3208
 
3191
3209
  **Optional peer deps:** none.
3192
3210
 
@@ -3718,6 +3736,10 @@ Dependency-free SVG radial, full-circle ring, or linear meter (no charting libra
3718
3736
  ```
3719
3737
 
3720
3738
  **Known gotchas:**
3739
+ - SVG text cannot wrap. When a caller-supplied visible `label` or `valueLabel` exceeds the
3740
+ single-line capacity, the component applies SVG `textLength` fitting so the complete string stays
3741
+ inside the fixed radial/ring viewBox or its half of the linear viewBox; the host's accessible
3742
+ label and `aria-valuetext` retain the original text.
3721
3743
  - setting `valueLabel` (e.g. `"72°F"`) now also sets `aria-valuetext` on the host (in addition to
3722
3744
  changing the visible SVG text), so a screen reader announces your formatted string instead of the
3723
3745
  raw `aria-valuenow` number; the SVG `<text part="value">`/`<text part="label">` elements are
@@ -3755,8 +3777,9 @@ visually-hidden `[part="live-region"]` (`role="status" aria-live="polite"`) anno
3755
3777
  - `words: WordCloudWord[] = []` (attribute: false) — `{ text: string, weight: number, color?:
3756
3778
  string, group?: string }`; `weight` drives font size (a negative/non-finite `weight` is clamped to
3757
3779
  `0` for sizing purposes only — the original value is still echoed verbatim in `lr-word-click`'s
3758
- `detail`), `color` overrides the palette for that word, `group` shares one palette color across
3759
- every word with the same `group` value
3780
+ `detail`), a valid CSS `color` overrides the palette for that word (invalid values,
3781
+ declaration-breaking input, and `url()` fall back to the palette), and `group` shares one palette
3782
+ color across every word with the same `group` value
3760
3783
  - `minFontSize: number = 12` (attribute `min-font-size`) — px, applied to the lowest-weight word;
3761
3784
  layout clamps positive finite values to at most 512px and uses 1px for invalid/non-positive values
3762
3785
  - `maxFontSize: number = 48` (attribute `max-font-size`) — px, applied to the highest-weight word;
@@ -3766,10 +3789,12 @@ visually-hidden `[part="live-region"]` (`role="status" aria-live="polite"`) anno
3766
3789
  - `orientations: 'horizontal'|'mixed' = 'horizontal'` — `mixed` lets ~25% of words render rotated
3767
3790
  90° for denser packing
3768
3791
  - `palette?: string[]` (attribute: false) — custom categorical colors, cycled by word index (or by
3769
- `group`); defaults to the `--lr-word-cloud-color-1..8` tokens
3792
+ `group`); invalid CSS colors, declaration-breaking input, and `url()` entries are skipped, and an
3793
+ all-invalid palette defaults to the `--lr-word-cloud-color-1..8` tokens
3770
3794
  - `legend: WordCloudLegendItem[] = []` (attribute: false) — optional named `{ label, color }`
3771
3795
  entries for explaining explicit `words[].color`/group color overrides; when omitted, the
3772
- component derives entries from grouped and explicitly colored words
3796
+ component derives entries from grouped and explicitly colored words. An invalid legend color
3797
+ renders a transparent swatch.
3773
3798
  - `showLegend: boolean = false` (attribute `show-legend`, reflected) — renders the supplied or
3774
3799
  derived legend below the cloud; the color key is an accessible list and does not change word
3775
3800
  activation or palette selection
@@ -3963,16 +3988,17 @@ focus; it continues to emit `lr-cell-click` and leaves selection state consumer-
3963
3988
  exact ramp steps instead of linearly interpolating between `--lr-heatmap-scale-lo`/`-hi`;
3964
3989
  governs both `mode`s and both `scale` values, discretizing whichever scale would otherwise
3965
3990
  interpolate continuously into `colorSteps.length` buckets instead. Unset (the default, or fewer
3966
- than 2 entries) keeps today's 2-endpoint interpolation exactly.
3991
+ than 2 entries) keeps today's 2-endpoint interpolation exactly. Invalid colors use the canvas
3992
+ fallback color and prevent the custom legend gradient from being assigned.
3967
3993
  - `legendStops?: HeatmapLegendStop[]` (attribute: false) — `HeatmapLegendStop { value: number;
3968
3994
  color?: string; label?: string }`: a discrete legend key rendered **instead of** the
3969
3995
  `--lr-heatmap-scale-lo`/`-hi` gradient bar and its `[part="legend-lo"]`/`[part="legend-hi"]`
3970
3996
  endpoint labels — one `[part="legend-stop"]` per entry, in array order, each a
3971
3997
  `[part="legend-swatch"]` filled with that entry's `color` plus a `[part="legend-stop-label"]`.
3972
- `color` is optional: omit it (or pass an empty string) for a **caption-only** stop, which renders
3973
- its `[part="legend-stop-label"]` alone with no `[part="legend-swatch"]` element in the DOM at all —
3974
- so a leading "0" or trailing "more" caption around a run of colored stops doesn't leave an empty
3975
- swatch box in the row.
3998
+ `color` is optional: omit it, pass an empty string, or pass an invalid CSS color for a
3999
+ **caption-only** stop, which renders its `[part="legend-stop-label"]` alone with no
4000
+ `[part="legend-swatch"]` element in the DOM at all — so a leading "0" or trailing "more" caption
4001
+ around a run of colored stops doesn't leave an empty swatch box in the row.
3976
4002
  A stop's label defaults to the component's own locale-aware numeric formatting of `value`, so an
3977
4003
  explicit `label` is only needed when the number isn't the right caption ("none", "≥ 90%"). Exists
3978
4004
  for the consumer who supplies `cellColor`: because that callback overrides a cell's color
@@ -4059,6 +4085,8 @@ same color as `--lr-heatmap-focus-ring-color`).
4059
4085
  ```
4060
4086
 
4061
4087
  **Known gotchas:**
4088
+ - The legend is a wrapping flex row. Long unbroken stop labels, the trailing `valueLabel`, and
4089
+ annotation labels wrap within the host instead of forcing the heatmap wider than its allocation.
4062
4090
  - `legendStops` *replaces* the lo/hi gradient bar rather than adding to it: supplying it removes
4063
4091
  `[part="legend-lo"]`, `[part="legend-hi"]` and the bar from the DOM, so a stylesheet targeting
4064
4092
  those parts silently stops applying. It is also presentation-only — it never feeds back into the
@@ -4103,11 +4131,12 @@ is a labeled `role="list"` and each cell a named `role="listitem"` (`aria-label`
4103
4131
  `aria-setsize`), so the sequence is walkable item by item rather than collapsed into one summary
4104
4132
  string. Exactly one cell is tabbable at a time (roving `tabindex`); ArrowLeft/ArrowRight and
4105
4133
  Home/End move the stop — direction-aware, so the arrows swap under RTL — and focusing a cell shows
4106
- the same `[part="tooltip"]` detail that pointer hover does, wired through `aria-describedby`. Cells
4107
- are inspectable, not actionable: there is no per-cell click/activation event, so unlike
4108
- `<lr-heatmap>` there is nothing to fire on Enter/Space. Setting `showLegend` additionally renders a
4109
- static `[part="legend"]` key below the strip, so the color-to-category mapping is readable without
4110
- visiting each cell.
4134
+ the same `[part="tooltip"]` detail that pointer hover does. The tooltip is visual only and is not
4135
+ wired through `aria-describedby`, because the cell's own `aria-label` already exposes the identical
4136
+ text and describing it again would duplicate the announcement. Cells are inspectable, not
4137
+ actionable: there is no per-cell click/activation event, so unlike `<lr-heatmap>` there is nothing
4138
+ to fire on Enter/Space. Setting `showLegend` additionally renders a static `[part="legend"]` key
4139
+ below the strip, so the color-to-category mapping is readable without visiting each cell.
4111
4140
 
4112
4141
  **Properties:**
4113
4142
  - `items: SequenceStripItem[] = []` (attribute: false) — `{ id, category, marker?, label? }`;
@@ -4117,9 +4146,10 @@ visiting each cell.
4117
4146
  `key`) when unset — it is not read by `[part="base"]`'s auto-generated `aria-label`, which
4118
4147
  summarizes by category/count only
4119
4148
  - `categories: SequenceStripCategory[] = []` (attribute: false) — `{ key, color, label? }`; `color`
4120
- is the cell background for every item whose `category` matches `key` (an item whose `category`
4121
- matches no entry renders `transparent`); `label` is used in the auto-generated `aria-label` summary
4122
- and as the hover-tooltip fallback text, falling back to `key` itself when unset
4149
+ is the cell background for every item whose `category` matches `key`; invalid CSS colors,
4150
+ declaration-breaking input, `url()`, and unmatched categories render `transparent`. `label` is
4151
+ used in the auto-generated `aria-label` summary and as the hover-tooltip fallback text, falling
4152
+ back to `key` itself when unset
4123
4153
  - `orientation: 'horizontal' = 'horizontal'` (reflected) — only `'horizontal'` is supported today;
4124
4154
  vertical is plausible future scope, not built speculatively without a motivating case
4125
4155
  - `accessibleLabel?: string` (attribute `accessible-label`) — overrides the auto-generated
@@ -4234,6 +4264,8 @@ moves focus to its parent. Home/End jump to the first/last visible node. Enter/S
4234
4264
  node within its own parent's child list instead of navigating. Ctrl/Cmd rather than Alt: Alt+Arrow is
4235
4265
  browser back/forward on Windows and Linux. ArrowUp/ArrowDown are not direction-sensitive, so this
4236
4266
  binding is deliberately **not** RTL-swapped — "down" always means later in the sibling list.
4267
+ If a same-id data refresh disables an expanded branch, that reused branch collapses immediately;
4268
+ enabled descendants are never left visibly stranded outside this navigation walk.
4237
4269
 
4238
4270
  **Methods:** `expandAll()`, `collapseAll()` (both recursive, properly sequenced around Lit's render
4239
4271
  cycle).
@@ -4299,8 +4331,15 @@ is applied to the legacy singular badge and to every `badges` chip; additive chi
4299
4331
  groups the primary label and optional wrapping secondary description while preserving one
4300
4332
  interactive treeitem per row.
4301
4333
 
4302
- **Themeable custom properties:** `--lr-tree-depth` (internal, set inline per row for
4303
- indentation), plus the shared tokens listed above.
4334
+ **Themeable custom properties:** `--lr-tree-depth` (internal, set inline per row for indentation);
4335
+ `--lr-tree-selected-color` and `--lr-tree-selected-bg` for the selected row; and paired
4336
+ `--lr-tree-badge-{neutral|brand|success|warning|danger}-color` /
4337
+ `--lr-tree-badge-{neutral|brand|success|warning|danger}-bg` properties for each badge tone. Each
4338
+ badge property falls back to its corresponding shared semantic token. The expanded names are
4339
+ `--lr-tree-badge-neutral-color`, `--lr-tree-badge-neutral-bg`, `--lr-tree-badge-brand-color`,
4340
+ `--lr-tree-badge-brand-bg`, `--lr-tree-badge-success-color`, `--lr-tree-badge-success-bg`,
4341
+ `--lr-tree-badge-warning-color`, `--lr-tree-badge-warning-bg`, `--lr-tree-badge-danger-color`,
4342
+ and `--lr-tree-badge-danger-bg`.
4304
4343
 
4305
4344
  **Optional peer deps:** none.
4306
4345
 
@@ -4520,7 +4559,13 @@ hijacking the library-wide `--lr-color-brand` token and repainting everything el
4520
4559
  `status="running"`, independent of `--lr-flow-node-selected-border` so a consumer can retint just one
4521
4560
  of the two states without the other following along — and `--lr-flow-node-running-glow` (default
4522
4561
  `var(--lr-color-brand-quiet)`) — the box-shadow color of the running-state ring around the card, and
4523
- the pulse keyframes' peak color.
4562
+ the pulse keyframes' peak color. The status dot has independent
4563
+ `--lr-flow-node-status-{pending|running|success|error|denied}-color` hooks, defaulting respectively
4564
+ to the shared border-strong, brand, success, danger, and warning tokens;
4565
+ `--lr-flow-node-status-color` controls the no-status fallback. The expanded status names are
4566
+ `--lr-flow-node-status-pending-color`, `--lr-flow-node-status-running-color`,
4567
+ `--lr-flow-node-status-success-color`, `--lr-flow-node-status-error-color`, and
4568
+ `--lr-flow-node-status-denied-color`.
4524
4569
 
4525
4570
  **Optional peer deps:** none.
4526
4571
 
@@ -4563,7 +4608,13 @@ disagree.
4563
4608
  draggable, focusable view rectangle).
4564
4609
 
4565
4610
  **Themeable custom properties:** `--lr-flow-minimap-inline-size` (default `12rem`),
4566
- `--lr-flow-minimap-block-size` (default `8rem`).
4611
+ `--lr-flow-minimap-block-size` (default `8rem`), `--lr-flow-minimap-node-color` for a node without
4612
+ an execution status, and `--lr-flow-minimap-node-{pending|running|success|error|denied}-color` for
4613
+ each status-specific rectangle. The status hooks default to the shared border-strong, brand,
4614
+ success, danger, and warning colors respectively. Their expanded names are
4615
+ `--lr-flow-minimap-node-pending-color`, `--lr-flow-minimap-node-running-color`,
4616
+ `--lr-flow-minimap-node-success-color`, `--lr-flow-minimap-node-error-color`, and
4617
+ `--lr-flow-minimap-node-denied-color`.
4567
4618
 
4568
4619
  **Optional peer deps:** none.
4569
4620
 
@@ -4638,7 +4689,8 @@ hit area, unchanged by `appearance`), `--lr-shadow`, `--lr-color-surface`, `--lr
4638
4689
 
4639
4690
  Execution-state presentation for a `lr-flow-canvas`: pushes a `FlowRunDecorations` map into the
4640
4691
  resolved canvas (the canvas itself renders the node/edge paint) and renders a compact run-summary
4641
- strip. Does not execute, poll, or time anything pure pushed state; `durationMs` is host-computed.
4692
+ strip. Summary/count text and slotted host chrome wrap within narrow allocations. Does not execute,
4693
+ poll, or time anything — pure pushed state; `durationMs` is host-computed.
4642
4694
 
4643
4695
  **Properties:**
4644
4696
  - `for: string = ''` — id of the target `lr-flow-canvas`; empty resolves to the nearest ancestor
@@ -4660,7 +4712,13 @@ badge).
4660
4712
  **CSS parts:** `base`, `summary` (the "{done} of {total} steps complete" line), `count` (one per
4661
4713
  status present, text + tone dot, never color-only), `live-region` (step-transition announcement).
4662
4714
 
4663
- **Themeable custom properties:** shared tokens only.
4715
+ **Themeable custom properties:** `--lr-flow-run-overlay-status-color` controls a count dot without
4716
+ an execution status. `--lr-flow-run-overlay-status-{pending|running|success|error|denied}-color`
4717
+ independently retints each status count, defaulting respectively to the shared border-strong,
4718
+ brand, success, danger, and warning tokens. Their expanded names are
4719
+ `--lr-flow-run-overlay-status-pending-color`, `--lr-flow-run-overlay-status-running-color`,
4720
+ `--lr-flow-run-overlay-status-success-color`, `--lr-flow-run-overlay-status-error-color`, and
4721
+ `--lr-flow-run-overlay-status-denied-color`.
4664
4722
 
4665
4723
  **Optional peer deps:** none.
4666
4724
 
@@ -4812,10 +4870,10 @@ a selected (`data-selected="true"`) day cell. Component-scoped indirection over
4812
4870
  without also recoloring `[part='nav']:hover`/`[part='agenda-event']:hover`, which read that shared
4813
4871
  token directly for a visually distinct purpose (transient hover feedback).
4814
4872
 
4815
- **Gotcha:** month-view `[part='event']` markers are a mouse-only quick-select affordance they sit
4816
- inside the day `<button>`, which may not contain focusable descendants. Agenda view renders each
4817
- event as a real `<button part="agenda-event">` and is the keyboard-accessible path to
4818
- `lr-event-select`.
4873
+ Month-view `[part='event']` markers are real keyboard-focusable buttons inside a non-interactive
4874
+ `role="gridcell"` day container; Enter/Space activates the same `lr-event-select` path as a pointer.
4875
+ Their target stays at least 24×24 CSS px even in the narrow month layout. Agenda view likewise
4876
+ renders each event as a `<button part="agenda-event">`.
4819
4877
 
4820
4878
  ## `lr-timeline` and `lr-timeline-item`
4821
4879
 
@@ -4831,7 +4889,8 @@ design (an item's `title`/`description` routinely hold focusable content, so wra
4831
4889
  opposite default from `lr-stepper`; `horizontal` makes `[part='base']` a horizontally scrollable row.
4832
4890
  `accessibleLabel: string = ''` (attribute `aria-label`) overrides the localized `"Timeline"` name
4833
4891
  (the `role="list"` element is in the shadow root and never inherits a host attribute). Read-only
4834
- `itemCount: number` is the live default-slot child count.
4892
+ `itemCount: number` is the live count of direct default-slot `<lr-timeline-item>` children;
4893
+ unrelated slotted elements and text nodes are ignored.
4835
4894
 
4836
4895
  **`lr-timeline-item` properties:** `timestamp?: Date | string | number` (attribute: false — `Date`
4837
4896
  isn't attribute-serializable; invalid input normalizes to unset and renders no timestamp UI),
@@ -4892,7 +4951,8 @@ git-status/diff-count badges, lazy directory loading, and select/open events.
4892
4951
 
4893
4952
  A masked key/value list for environment variables and secrets, with per-row reveal and copy.
4894
4953
  Masking is presentational, not a security boundary: the real value sits in a DOM property
4895
- regardless of mask state.
4954
+ regardless of mask state. Names, revealed values, and localized action text wrap within narrow
4955
+ allocations; the name track uses at most 40% of the available inline size.
4896
4956
 
4897
4957
  **Properties:** `entries: EnvEntry[] = []` (attribute: false), `revealable: boolean = true`
4898
4958
  (reflected), `copyable: boolean = true` (reflected), and `label: string = ''`.
@@ -5220,14 +5280,16 @@ position) survives the transition.
5220
5280
  - `collapsed: boolean = false` (reflected)
5221
5281
  - `expandable: boolean = false` (reflected — shows the fullscreen toggle button)
5222
5282
  - `fullscreen: boolean = false` (reflected)
5223
- - `fullscreenInset: string = ''` (attribute `fullscreen-inset`) — raw CSS `inset` shorthand applied to
5283
+ - `fullscreenInset: string = ''` (attribute `fullscreen-inset`) — CSS `inset` shorthand applied to
5224
5284
  `[part="base"]` and `[part="backdrop"]` while fullscreen instead of the default per-side
5225
5285
  `max(var(--lr-space-l), <safe-area inset>)`, e.g. `"0 0 0 240px"` to leave a 240px persistent
5226
- sidebar/toolbar visible during fullscreen
5286
+ sidebar/toolbar visible during fullscreen. Invalid values, declaration-breaking input, and
5287
+ `url()` are ignored.
5227
5288
  - `compact: boolean = false` (reflected) — tighter header/body padding, same convention as
5228
5289
  `lr-empty`'s `compact`
5229
5290
  - `backdropInset: string = ''` (attribute `backdrop-inset`) — overrides the fullscreen backdrop's
5230
- CSS `inset` independently from `fullscreenInset`; when empty, it follows `fullscreenInset`
5291
+ CSS `inset` independently from `fullscreenInset`; when empty or invalid, it follows a valid
5292
+ `fullscreenInset`
5231
5293
  - `views: WidgetView[] = []` (attribute: false) — named alternate views for the panel body, e.g. a
5232
5294
  chart/table toggle inside the same card chrome; `WidgetView { id: string; label?: string; icon?:
5233
5295
  TemplateResult; ariaLabel?: string }`. Each entry gets a header toggle button
@@ -5351,6 +5413,8 @@ navigation.
5351
5413
  **Methods:** `next()`, `previous()`, and `goTo(index)` update the active index and emit
5352
5414
  `lr-slide-change` (`detail: { index }`).
5353
5415
 
5416
+ **Events:** `lr-slide-change` (`detail: { index }`) — emitted after the active slide changes.
5417
+
5354
5418
  **CSS parts:** `base` (the `role="region"` landmark), `viewport` (the keyboard-focusable slide
5355
5419
  viewport), `track`, `controls`, `previous-button`, `next-button`, `previous-glyph`/`next-glyph` (the
5356
5420
  chevron inside each, mirrored under RTL), `indicators`, `indicator` (one indicator's hit target,
@@ -5837,6 +5901,8 @@ control. It is **genuinely undeclared by default** — not `auto` — and that i
5837
5901
  exact-height hatch only works as an undeclared sentinel, because `auto` is itself a valid value that
5838
5902
  would always win and would silently turn every tier's `--lr-segmented-track-min-height` floor into
5839
5903
  dead code. While it is unset, each tier keeps its own floor and the track grows with its content.
5904
+ The compact `2xs` track has a 24px minimum block size, and every `2xs`/`xs` segment retains at least
5905
+ a 24×24px activation target even when its label is very short.
5840
5906
 
5841
5907
  `--lr-segmented-selected-bg` (default `var(--lr-color-surface)`), `--lr-segmented-selected-color`
5842
5908
  (default `var(--lr-color-text)`), `--lr-segmented-selected-font-weight` (default
@@ -6573,7 +6639,9 @@ called with no second argument, so `event.detail` is `null`, not `undefined`; fi
6573
6639
  when the parent `<lr-menu>`'s own Enter/Space keydown handling calls `select()` on the currently
6574
6640
  roving-focused item), `lr-menu-item-change` (`detail: { value, checked }` — fired when a
6575
6641
  `type="checkbox"` item is activated and its `checked` state toggled, in addition to — never instead
6576
- of — `lr-menu-item-select`; never fired for `type="normal"`)
6642
+ of — `lr-menu-item-select`; never fired for `type="normal"`),
6643
+ `lr-menu-item-state-change` (`detail: { disabled, hidden }` — emitted when either navigability
6644
+ state changes so the parent menu can repair its roving-tabindex state immediately)
6577
6645
 
6578
6646
  **Slots:** default (the item's label content), `icon` (optional leading icon)
6579
6647
 
@@ -6994,6 +7062,7 @@ draggable/resizable target; set it to `transparent` to opt out of the hover trea
6994
7062
  **Additional API surface:**
6995
7063
 
6996
7064
  - `--lr-dashboard-grid-collision-outline-color` — Outline color of a cell whose current drag/resize preview collides with another cell. Default: `var(--lr-color-danger)`.
7065
+ - `--lr-dashboard-grid-interaction-shadow` — Box shadow applied during a cell drag or resize. Default: `var(--lr-shadow)`.
6997
7066
 
6998
7067
  ## `lr-drilldown-panel`
6999
7068
 
@@ -7201,12 +7270,18 @@ at another, since `placement` is a per-call option rather than a single global r
7201
7270
  - the close button's accessible name is derived from the toast's own message text (`"Close: <first
7202
7271
  40 chars>…"`, falling back to bare `"Close"` only when the toast has no text content) rather than
7203
7272
  a bare `"Close"` on every instance — useful when several toasts are stacked and a screen-reader or
7204
- switch-access user needs to tell their close buttons apart without activating one first.
7273
+ switch-access user needs to tell their close buttons apart without activating one first. Rich
7274
+ non-interactive message markup contributes its text, named-slot/icon and actionable content do
7275
+ not, and live message text mutations update the name.
7205
7276
  - pause/resume-on-hover/focus (the component's main accessibility differentiator), including the
7206
7277
  independent-hover-vs-focus pause reasons above, now has regression test coverage.
7207
7278
  - `hide()` is idempotent (a second call while already hiding is a no-op) and `[part="close-button"]`
7208
7279
  gets `aria-disabled="true"` once hiding starts, so a stray extra click/Enter during the hide
7209
- animation can't re-enter it.
7280
+ animation can't re-enter it. A disconnect during that animation pauses completion; reconnecting
7281
+ the same item resumes it and emits/removes exactly once.
7282
+ - When the focused close/action control's toast finishes hiding, focus moves to an adjacent toast's
7283
+ close control, or back to the connected element that held focus before the toast when no adjacent
7284
+ item remains.
7210
7285
  - Prefer the `toast()` helper over manually creating `<lr-toast>`/`<lr-toast-item>` — it already
7211
7286
  handles the singleton-region and remount-if-removed logic.
7212
7287
 
@@ -7369,8 +7444,9 @@ hand-building that chrome isn't worth it.
7369
7444
 
7370
7445
  Also settable as a plain `aria-label` attribute (not a public JS property): overrides the panel's
7371
7446
  computed accessible name outright, winning over every other source below (a slotted heading,
7372
- `heading`, `label`) — matching `<lr-date-input>`'s `accessibleLabel` pattern. Left unset, the
7373
- existing three-tier fallback below is unchanged.
7447
+ `heading`, `label`) — matching `<lr-date-input>`'s `accessibleLabel` pattern. It changes naming
7448
+ only: a `heading` property still renders its visible header chrome. Left unset, the existing
7449
+ three-tier fallback below is unchanged.
7374
7450
 
7375
7451
  **Methods:** `close(reason: DialogCloseReason = 'api'): void` — closes the dialog, emits
7376
7452
  `lr-dialog-close` with `reason`, and returns focus to whatever had it right before the dialog
@@ -7382,8 +7458,10 @@ own `close()` (a consumer's own cleanup code, a parent re-render that drops it);
7382
7458
  whatever a caller passes (e.g. a footer Cancel button calling `dlg.close('cancel')`, or `confirm()`'s
7383
7459
  own `'confirm'`/`'cancel'`).
7384
7460
 
7385
- **Events:** `lr-dialog-close` (`detail: DialogCloseReason`) — fired on every dismissal path
7386
- (Escape, backdrop click, any `close()` call, or an `'unmount'` removal as above).
7461
+ **Events:** `lr-dialog-close` (`detail: DialogCloseReason`) — a cancelable event fired on every
7462
+ dismissal path (Escape, backdrop click, the built-in close button, any `close()` call, or an
7463
+ `'unmount'` removal as above). Calling `preventDefault()` keeps a connected dialog open for every
7464
+ dismissal path; `'unmount'` cannot practically be vetoed because removal already happened.
7387
7465
 
7388
7466
  **Stacking:** participates in the shared per-document overlay stack described above. A dialog can be
7389
7467
  stacked with another dialog or any other modal family; only the visually topmost overlay receives
@@ -7433,19 +7511,20 @@ clipped; the viewport is still a hard limit either way), plus shared tokens `--l
7433
7511
 
7434
7512
  Accessible name / visible header, in priority order: (0) if the host element itself has an
7435
7513
  `aria-label` attribute set, its value becomes `aria-label` on the panel outright, overriding every
7436
- source below (including a slotted heading) and suppressing the visible header/`heading` row and the
7437
- sr-only `label` element from rendering at all the standard ARIA convention for a consumer that
7438
- wants full control over the announced name regardless of whatever `heading`/`label` props are also
7439
- set; (1) otherwise, if a heading element (`h1`–`h6` or
7514
+ source below (including a slotted heading) while leaving visible `heading` chrome intact the
7515
+ standard ARIA convention for a consumer that wants full control over the announced name regardless
7516
+ of whatever `heading`/`label` props are also set; (1) otherwise, if a heading element (`h1`–`h6` or
7440
7517
  `[role="heading"]`) is a *direct child* (not inside `slot="footer"`), its text content becomes
7441
7518
  `aria-label` on the panel — takes priority over `heading` below so an existing consumer that already
7442
7519
  slots its own heading keeps rendering it exactly as before; (2) otherwise, when `heading` is set, a
7443
7520
  visible header row (`[part="header"]`) renders containing that text (`[part="heading"]`), which
7444
7521
  becomes the `aria-labelledby` target; (3) otherwise, when `label` is set, an invisible (`.sr-only`,
7445
7522
  exposed as the `label` part) element carrying that text is rendered inside the panel and
7446
- `aria-labelledby` points at it instead. Only one of cases 2/3 ever renders at a time. `label` itself
7447
- never renders visible chrome on its own `::part(label)` can be restyled to make the sr-only text
7448
- visible, or `heading` can be set instead, for visible chrome without slotting a real heading element.
7523
+ `aria-labelledby` points at it instead. Only one of cases 2/3 supplies `aria-labelledby` at a time;
7524
+ case 0 can coexist with case 2's visible heading, but its explicit `aria-label` remains the name.
7525
+ `label` itself never renders visible chrome on its own `::part(label)` can be restyled to make the
7526
+ sr-only text visible, or `heading` can be set instead, for visible chrome without slotting a real
7527
+ heading element.
7449
7528
  The slotted-heading case (1) deliberately uses `aria-label` (a copied string) rather than
7450
7529
  `aria-labelledby` pointing at the heading's `id`, because the heading is light-DOM content while
7451
7530
  `[part="panel"]` lives in shadow DOM and an ID-reference attribute can't resolve across that
@@ -7455,9 +7534,8 @@ root it labels.
7455
7534
  **Known gotchas:**
7456
7535
  - `role="dialog"`/`aria-modal="true"` are only present on `[part="panel"]` while `open` is `true` —
7457
7536
  inspecting closed markup won't show them.
7458
- - Heading detection only rescans on `slotchange`, not on every render — mutating an already-slotted
7459
- heading's `textContent` in place (rather than replacing the node) won't retroactively update
7460
- `aria-label`; set `label` instead for a title that needs to change live.
7537
+ - Heading detection observes child, subtree, and character-data changes, so mutating an
7538
+ already-slotted direct heading's text updates the copied panel `aria-label` live.
7461
7539
  - Only *direct* children are scanned for a heading — one nested several layers deep, or inside a
7462
7540
  slotted custom element's own shadow root, is left to the consumer to label explicitly via `label`.
7463
7541
  - A reconnect that preserves the same element instance (e.g. a drag-and-drop reparent) resumes its
@@ -7504,7 +7582,8 @@ used is still a `--lr-*` token reference, never a raw literal.
7504
7582
  - Every dismissal path (confirm button, cancel button, Escape, backdrop click) funnels through
7505
7583
  `<lr-dialog>`'s own `close()`/`lr-dialog-close` event, so there is exactly one place that
7506
7584
  resolves the promise and tears the dialog down — a consumer never needs to (and shouldn't) call
7507
- `.remove()` itself.
7585
+ `.remove()` itself. Because the close event is cancelable, `confirm()` waits through the full
7586
+ dispatch and remains pending/mounted when a listener calls `preventDefault()`.
7508
7587
  - The neutral confirm button pairs `--lr-color-on-brand` with `--lr-color-brand`; the danger
7509
7588
  tone pairs `--lr-color-on-danger` with `--lr-color-danger`. Each token chains through Web
7510
7589
  Awesome's matching `*-on-loud` semantic role and has contrast-tested standalone light/dark
@@ -7671,7 +7750,9 @@ library-wide `--lr-color-text` token. Left unset, rendering is unchanged. Otherw
7671
7750
  Since CSS alone can't parameterize `:nth-child` on a runtime prop, `<lr-chip-group>` reaches
7672
7751
  directly into the light DOM and sets each excess child's own `hidden` property once `max-visible` is
7673
7752
  exceeded — the same approach `<lr-split>` uses to set each panel's inline `flex`/`order`, rather
7674
- than a stylesheet-only solution.
7753
+ than a stylesheet-only solution. It observes live author changes to each managed child's `hidden`
7754
+ state and restores the latest author-owned value when ownership ends or the group disconnects;
7755
+ reconnecting reapplies the current collapsed state.
7675
7756
 
7676
7757
  **Known gotchas:**
7677
7758
  - `<lr-chip>`'s accessible remove-button label ("Remove {text}") is computed only from the default
@@ -7718,8 +7799,9 @@ resolves a full `keys` string with the same optional localization callback.
7718
7799
  **Slots:** default — an escape hatch for fully custom key-cap content (e.g. an icon instead of a
7719
7800
  text glyph). When it has any real (non-whitespace) content, it replaces the `keys`-driven rendering
7720
7801
  entirely and this component stops *computing* its own `aria-label` from `keys`, leaving the slotted
7721
- content to carry its own accessible name a host-supplied `aria-label` attribute is still forwarded
7722
- onto the rendered chip in either mode, custom content included.
7802
+ content to carry its own accessible name. A host-supplied `aria-label` in custom mode is forwarded
7803
+ to `[part="base"]` together with `role="img"`; without one, the wrapper adds no image role and
7804
+ leaves the slotted content's own semantics exposed.
7723
7805
 
7724
7806
  **CSS parts:** `base` (the chip root), `key` (one per rendered token).
7725
7807
 
@@ -7772,7 +7854,8 @@ track ancestor scroll/resize against — pass `rect.contextElement` (a real, sti
7772
7854
  near the virtual point) when one is available to give it something to observe; otherwise, or when
7773
7855
  the anchor point moves on its own (e.g. a graph pan/zoom tick), re-call `showAt()` with fresh
7774
7856
  coordinates to re-anchor — the popover stays open across such a call. A popover that never calls
7775
- `showAt()` behaves exactly as before.
7857
+ `showAt()` behaves exactly as before. Non-finite coordinates or dimensions are a no-op and leave
7858
+ the current open/anchor state unchanged.
7776
7859
  `hide(options?: { focusTrigger?: boolean })` programmatically closes the popover; pass
7777
7860
  `{ focusTrigger: false }` to opt out of focus restoration. By default, `hide()`, Escape, light
7778
7861
  dismiss, and a bare `el.open = false` all return focus to the slotted trigger, or to a virtual
@@ -7794,7 +7877,8 @@ contextElement? }, options?: { returnFocusTo?: HTMLElement })` — same virtual-
7794
7877
  Escape returns focus to `options.returnFocusTo` or skips focus-return, re-call with fresh
7795
7878
  coordinates to re-anchor a moving point). Opens immediately, bypassing `delay`/`manual` (both are
7796
7879
  hover-debounce concerns for a slotted trigger, not a deliberate programmatic call); close it the
7797
- same way any tooltip closes, by setting `open = false`. **Slots:** `trigger`, default content.
7880
+ same way any tooltip closes, by setting `open = false`. Non-finite coordinates or dimensions are a
7881
+ no-op. **Slots:** `trigger`, default content.
7798
7882
  **CSS parts:** `trigger`, `popup`. **Themeable custom properties:** `--lr-tooltip-max-inline-size`
7799
7883
  (default `--lr-size-20rem`), `--lr-tooltip-background` (default `--lr-color-neutral`), and
7800
7884
  `--lr-tooltip-color` (default `--lr-color-on-neutral`).
@@ -7807,6 +7891,16 @@ intentionally leaves the internal control's serialized `aria-describedby` value
7807
7891
  author-provided descriptions are merged while open and restored when the trigger is replaced or
7808
7892
  the tooltip disconnects.
7809
7893
 
7894
+ Plain content keeps `role="tooltip"`. If actionable content appears anywhere in the assigned
7895
+ default-slot subtree — including inside a nested custom element's open shadow root — the popup
7896
+ promotes to a named `role="dialog"` and remains open while pointer or focus is within it. Escape
7897
+ from either the trigger or popup closes it; Escape from popup content returns focus to the trigger.
7898
+ While open, rootless custom-element content receives a bounded initialization grace period for an
7899
+ upgrade or newly attached open shadow root; later observable content mutations start a fresh
7900
+ grace period. This catches normal lazy initialization without scheduling perpetual animation-frame
7901
+ work for a legitimate custom element that intentionally has no shadow root. Use `lr-popover` when
7902
+ click-to-open ownership is desired.
7903
+
7810
7904
  **`showAt()` composed with `lr-graph`** — anchoring a popover to a clicked graph node. Note:
7811
7905
  `lr-graph.getNodePosition()` and the `lr-node-click` event's `{ x, y }` are in the graph's own
7812
7906
  *local drawing space* (pre pan/zoom), not viewport pixels, so they can't be passed to `showAt()`
@@ -7852,7 +7946,9 @@ names `[part="base"]`'s `role="status"`; unset falls back to the localized "Load
7852
7946
  **Events:** none.
7853
7947
 
7854
7948
  **Slots:** default — optional label text. `label-placement="after"` renders it inline next to the
7855
- indicator; `'none'` (the default) keeps it visually clipped but still in the DOM.
7949
+ indicator and its text becomes the status name unless `aria-label` overrides it. `'none'` (the
7950
+ default) applies the native `hidden` state to the label wrapper, removing it from both rendering and
7951
+ the accessibility tree; the status then uses `aria-label` or the localized "Loading…" fallback.
7856
7952
 
7857
7953
  **CSS parts:** `base` (the `role="status"` wrapper), `spinner` (the animated ring; `aria-hidden`),
7858
7954
  `label` (the default-slot wrapper).
@@ -7869,7 +7965,8 @@ A determinate or indeterminate progress bar.
7869
7965
  **Properties:** `value`, `max`, `indeterminate`, `variant`, `showValue` (`show-value`), and
7870
7966
  `accessibleLabel` (`accessible-label`).
7871
7967
  The rendered progressbar exposes `aria-valuemin`, `aria-valuemax`, and `aria-valuenow` when
7872
- determinate.
7968
+ determinate. When `show-value` exposes label-slot text, that visible text names the progressbar
7969
+ unless host `aria-label`/`accessible-label` overrides it; live label mutations stay synchronized.
7873
7970
 
7874
7971
  **Slots:** `label`. **CSS parts:** `base`, `track`, `indicator`, `label`.
7875
7972
  **Themeable custom properties:** `--lr-progress-height` (default `var(--lr-size-0-5rem)`) — the
@@ -7885,7 +7982,8 @@ A circular progress indicator with the same value contract as `lr-progress-bar`.
7885
7982
 
7886
7983
  **Properties:** `value: number = 0`, `max: number = 100`, `indeterminate: boolean = false`
7887
7984
  (reflected), and `accessibleLabel: string = ''` (attribute `accessible-label`; unset falls back to
7888
- the localized "Progress"). Non-finite/out-of-range `value`/`max` are normalized (`max <= 0` falls
7985
+ the visible default-slot text when supplied, then the localized "Progress"). Non-finite/out-of-range
7986
+ `value`/`max` are normalized (`max <= 0` falls
7889
7987
  back to `100`, `value` clamps to `[0, max]`) rather than producing NaN geometry.
7890
7988
  **Slots:** default — replaces the built-in center label, which otherwise renders the rounded
7891
7989
  percentage (and nothing at all while `indeterminate`).
@@ -7955,9 +8053,15 @@ A keyboard-accessible star rating control with slider semantics. **Properties:**
7955
8053
  `lr-change` with `{ value }`. **CSS parts:** `base`, `star`, `star-fill` (the filled overlay
7956
8054
  inside each star, clipped to the fractional `precision` value). **Themeable custom properties:**
7957
8055
  `--lr-rating-fill` (default `--lr-color-warning` — filled-star color), `--lr-rating-empty-color`
7958
- (default `--lr-color-border` — unfilled-star color), and `--lr-rating-size` (default
8056
+ (default `--lr-color-border` — unfilled-star color, also retained during hover preview), and
8057
+ `--lr-rating-size` (default
7959
8058
  `--lr-font-size-xl` — star size).
7960
8059
 
8060
+ Pointer selection resolves the position within the clicked star and snaps upward to `precision`
8061
+ (with the physical fraction mirrored under RTL), so half/quarter-star precision applies to pointer
8062
+ input as well as keyboard/value updates. The semantic slider's base keeps a 40×40px minimum
8063
+ activation area even for the degenerate `max=0`/`max=1` cases; larger ratings naturally grow wider.
8064
+
7961
8065
  **Additional API surface:**
7962
8066
 
7963
8067
  - `blur()` — Forwards host blur to the internal rating control.
@@ -8042,7 +8146,7 @@ Package-level CSV utilities (used internally, also exported for standalone use
8042
8146
  escapeCsvField, buildCsv, downloadBlob } from
8043
8147
  '@aceshooting/lyra-ui/components/utility/export-button/csv.js'`):
8044
8148
  ```ts
8045
- escapeCsvField(value: unknown): string // quotes/escapes; neutralizes formula-injection (=,+,@,tab,CR) with a leading apostrophe a bare leading '-' is deliberately left alone (OWASP guidance: it's not itself formula syntax, and guarding it would mangle ordinary negative numbers)
8149
+ escapeCsvField(value: unknown): string // quotes/escapes; neutralizes leading ASCII/fullwidth =,+,-,@ and tab/CR/LF formula prefixes with an apostrophe
8046
8150
  buildCsv(rows: Record<string, unknown>[], columns: CsvColumn[]): string // CRLF-joined, header row included
8047
8151
  downloadBlob(content: string, filename: string, mime: string): void // triggers a browser download
8048
8152
  ```
@@ -8054,6 +8158,10 @@ downloadBlob(content: string, filename: string, mime: string): void // trig
8054
8158
  for that handler, not automatic filename handling.
8055
8159
  - CSV formula-injection guarding and the deferred (5s) `URL.revokeObjectURL` (works around Safari
8056
8160
  cancelling in-flight downloads on immediate revoke) are genuine, safe-to-rely-on strengths.
8161
+ - `open` is valid only when `formats` contains more than one choice. An invalid open request is
8162
+ normalized closed without a false `lr-show`/`lr-hide` pair; shrinking an open menu to one format,
8163
+ or becoming `disabled`/`loading`, closes it and repairs focus. JSON projection safely preserves
8164
+ an own enumerable column literally named `__proto__`.
8057
8165
  - the multi-format menu (`role="menu"`) supports full arrow-key navigation — ArrowUp/ArrowDown move
8058
8166
  between items (opening the menu and seeding the right one focused, if it was closed), Home/End
8059
8167
  jump to the first/last item once open, Escape closes it and returns focus to the trigger button,
@@ -8103,6 +8211,8 @@ buttons, this has no code/JSON content model to adopt just to reuse the copy aff
8103
8211
  - best-effort clipboard write: `navigator.clipboard` is absent in insecure contexts/older browsers,
8104
8212
  and some engines throw synchronously rather than rejecting — either way `lr-copy` still fires
8105
8213
  with the intended text so a consumer can always show its own confirmation/fallback UI.
8214
+ - Changing `value` clears any in-progress "Copied" feedback immediately, so the confirmation can
8215
+ never describe stale text.
8106
8216
 
8107
8217
  **Additional API surface:**
8108
8218
 
@@ -8169,7 +8279,9 @@ stack overflow on cyclic `data`.
8169
8279
  - `collapsedDepth?: number` (attribute `collapsed-depth`) — nodes at or beyond this nesting depth
8170
8280
  (root = `0`) start collapsed; omitted/`undefined` means nothing auto-collapses
8171
8281
  - `maxHeight: string = ''` (attribute `max-height`) — a CSS length (e.g. `"20rem"`); once set, the
8172
- viewer scrolls internally past this height instead of growing the page
8282
+ viewer scrolls internally past this height instead of growing the page. Values that do not parse
8283
+ as CSS `max-height`, contain declaration breaks, or contain `url()` are ignored, leaving
8284
+ `--lr-json-viewer-max-height` in control
8173
8285
  - `copyable: boolean = false` (reflected) — shows copy-to-clipboard affordances: one for the whole
8174
8286
  value, plus one per node
8175
8287
  - `search: string = ''` — case-insensitive substring match against keys/values; matches are
@@ -8196,7 +8308,8 @@ search query, match count, or active-match cursor changes, from `runSearch()`/`s
8196
8308
 
8197
8309
  **CSS parts:** `base` (root scroll container, respects `max-height`), `toolbar` (wrapper around the
8198
8310
  top-level copy button, only rendered when `copyable`), `tree` (wrapper around the rendered node
8199
- tree), `key` (an object property key or array index label, `data-match` while it matches `search`,
8311
+ tree; a host `aria-label` is forwarded here), `row` (every structural opening/value and
8312
+ closing-delimiter row), `key` (an object property key or array index label, `data-match` while it matches `search`,
8200
8313
  `data-active` while it is the current `searchNext()`/`searchPrevious()` cursor position),
8201
8314
  `value` (a primitive value's text — carries `data-type` of
8202
8315
  `string`/`number`/`boolean`/`null`/`undefined`/`circular` for per-type coloring, `data-match`
@@ -8214,6 +8327,8 @@ until `max-height` is set), `--lr-json-viewer-font` (default `var(--lr-font-mono
8214
8327
  box-shadow, of a key/value that currently matches `search`. Component-scoped indirection over the
8215
8328
  shared `--lr-color-warning-quiet` token, so a consumer can retheme just this search-match highlight
8216
8329
  without repainting every other warning-toned surface that reads the same shared token;
8330
+ `--lr-json-viewer-row-hover-bg` (default `var(--lr-color-brand-quiet)`) — structural-row hover
8331
+ background;
8217
8332
  `--lr-json-viewer-active-outline` (default `var(--lr-focus-ring-color)`) — outline color for the
8218
8333
  current imperative search match; `--lr-json-viewer-string-color` (default
8219
8334
  `var(--lr-color-success)`), `--lr-json-viewer-number-color` (default `var(--lr-color-brand)`),
@@ -8252,6 +8367,8 @@ html`<lr-json-viewer .data=${apiResponse} copyable max-height="24rem" search=${q
8252
8367
  a different shape.
8253
8368
  - Per-node copy buttons call `stopPropagation()` on click so clicking one doesn't also toggle the
8254
8369
  row's expand/collapse state.
8370
+ - Whole-value copy always produces text, including for a root `undefined`, `Symbol`, or function
8371
+ that native `JSON.stringify()` would otherwise return as no value.
8255
8372
 
8256
8373
  ---
8257
8374
 
@@ -8370,6 +8487,9 @@ accessible phase-transition announcements.
8370
8487
  `paused`), `lr-pause-change` (`detail: boolean` — fired when `paused` changes via the built-in
8371
8488
  button).
8372
8489
 
8490
+ **Methods:** `restart(): void` — restarts the currently configured `nextInMs` delay from now,
8491
+ including after its previous deadline fired. With `nextInMs` unset it simply clears the due state.
8492
+
8373
8493
  **Slots:** none.
8374
8494
 
8375
8495
  **CSS parts:** `base`, `indicator` (the pulsing status dot), `countdown` (the `M:SS`, or
@@ -8396,14 +8516,16 @@ repainting every other component that reuses the same shared success token. Plus
8396
8516
 
8397
8517
  Internally, a 1-second ticker re-derives the remaining time from a captured target timestamp (rather
8398
8518
  than a naive per-tick decrement), so the countdown stays accurate even if the tab was backgrounded
8399
- and timers were throttled. Reassigning `nextInMs` at any time restarts the countdown from that new
8400
- value; pausing/resuming, or toggling `active`, starts or stops the ticker without discarding the
8401
- current remaining time. Phase transitions ("Paused.", "Resumed.", "Refreshing now.") are announced
8402
- via an internal `<lr-live-region>` in polite mode.
8519
+ and timers were throttled. Assigning a *changed* `nextInMs` value starts a fresh deadline; assigning
8520
+ the same value is a normal Lit no-op, so use `restart()` for a new cycle with the same delay.
8521
+ Pausing/resuming, toggling `active`, disconnecting/reconnecting, or toggling either after the due
8522
+ event stops/starts only an unconsumed ticker: a consumed deadline never replays until `nextInMs`
8523
+ changes or `restart()` is called. Phase transitions ("Paused.", "Resumed.", "Refreshing now.") are
8524
+ announced via an internal `<lr-live-region>` in polite mode.
8403
8525
 
8404
8526
  **Known gotchas:**
8405
- - there's no built-in "reset" or "extend" method beyond reassigning `nextInMs` a host that wants to
8406
- push the deadline back out on user activity re-sets `nextInMs` itself.
8527
+ - `restart()` is the explicit reset/extend path when the configured delay value itself has not
8528
+ changed.
8407
8529
  - `active="false"` and `paused` both stop the ticker independently, but only `paused` fires
8408
8530
  `lr-pause-change` — that event is scoped to the built-in pause button's own toggle, not to
8409
8531
  `active`.
@@ -8558,8 +8680,11 @@ fresh `query` is the proxy for "the caret may have moved").
8558
8680
  - A caret that moves for a reason other than typing (e.g. a mouse click elsewhere in the text while
8559
8681
  the popover happens to still be open) is not separately tracked — force a re-measure by toggling
8560
8682
  `open` or reassigning `anchor`.
8561
- - `activeIndex` resets to `0` whenever `query` or `items` changes, but not when only `anchor`
8562
- changes — reassigning `anchor` alone preserves whatever row was last highlighted.
8683
+ - `activeIndex` resets to `0` whenever `query`, `items`, or `filter` changes, but not when only
8684
+ `anchor` changes — reassigning `anchor` alone preserves whatever row was last highlighted. If
8685
+ fallback focus currently lives in the listbox and filtering removes every option, closing,
8686
+ emptying, or disconnecting the popover returns focus to the connected anchor before removing the
8687
+ active option.
8563
8688
  - There's no persisted "selection" the way `<lr-combobox>`'s own listbox has one — a mention is
8564
8689
  either committed (closing the popover) or dismissed with nothing chosen. `aria-selected="true"`
8565
8690
  here marks whichever row is currently *active* (what Enter/Tab would commit right now, per the
@@ -8643,6 +8768,7 @@ consumer can compute or unit-test the same alignment without instantiating the e
8643
8768
  explicit performance-risk opt-out.
8644
8769
  - the computed `diffOps` state is cached and recomputed only when `oldText`, `newText`, or
8645
8770
  `maxLines` changes. Copy-confirmation and other unrelated renders reuse the cached alignment.
8771
+ - Changing either `oldText` or `newText` clears any in-progress "Copied" feedback immediately.
8646
8772
 
8647
8773
  **Additional API surface:**
8648
8774
 
@@ -8672,7 +8798,9 @@ Dependency-free SVG path icon: no icon font, no sprite sheet, no network fetch.
8672
8798
  **Slots:** (default) — custom SVG geometry, rendered only when neither `path` nor a known `name`
8673
8799
  resolves. Slotted nodes are cloned into the component-owned `<svg>` (Chromium does not paint SVG
8674
8800
  geometry distributed through a slot that sits inside an SVG), so pass plain `<path>`/`<circle>`/
8675
- `<g>` elements, not a whole `<svg>`.
8801
+ `<g>` elements, not a whole `<svg>`. Attribute and descendant mutations to assigned geometry are
8802
+ mirrored live while connected; observation stops on detach and a reconnect synchronizes the latest
8803
+ source tree.
8676
8804
 
8677
8805
  **CSS parts:** `svg`
8678
8806
 
@@ -8682,7 +8810,8 @@ the surrounding text with no configuration.
8682
8810
 
8683
8811
  ## `lr-divider`
8684
8812
 
8685
- A semantic separator: renders `<hr part="base" role="separator" aria-orientation="…">`.
8813
+ A semantic separator: renders `<hr part="base" role="separator" aria-orientation="…">`. A host
8814
+ `aria-label` is forwarded to that inner semantic owner.
8686
8815
 
8687
8816
  **Properties:** `orientation: 'horizontal' | 'vertical' = 'horizontal'` (reflected).
8688
8817
 
@@ -8710,6 +8839,9 @@ empty, which means "the runtime's default locale". Every `Intl` instance is pull
8710
8839
  memoized `internal/intl-cache.ts` (one instance per locale + options pair, LRU-capped), so these are
8711
8840
  cheap to use per row in a large table or feed.
8712
8841
 
8842
+ Malformed runtime options fall back to a safe option set without discarding an otherwise-valid
8843
+ effective locale. Only a malformed locale itself falls back to the runtime default.
8844
+
8713
8845
  **Properties:**
8714
8846
  - `value: number = 0`
8715
8847
  - `currency: string = ''` — an ISO 4217 code (`'EUR'`, `'JPY'`). Non-empty switches the formatter to
@@ -8764,7 +8896,8 @@ name is localized too. Text-only host — no CSS parts, events, or own tokens; l
8764
8896
 
8765
8897
  The unit ladder is fixed at `byte`, `kilobyte`, `megabyte`, `gigabyte`, `terabyte`, `petabyte` and
8766
8898
  saturates at the top; the index is `floor(log|value| / log(unitStep))`, and `0` always formats as
8767
- bytes. `unitStep` is normalized to a finite number `> 1` (a step of exactly `1` would divide by
8899
+ bytes. Magnitudes below one byte, including negative values, stay in the `byte` unit rather than
8900
+ forming a negative unit index. `unitStep` is normalized to a finite number `> 1` (a step of exactly `1` would divide by
8768
8901
  `log(1) === 0`) falling back to `1024`; `decimals` is clamped to `[0, 10]` — an out-of-range value
8769
8902
  would otherwise throw a `RangeError` from `maximumFractionDigits`. Note that `unitStep: 1024` still
8770
8903
  prints the SI-named `kB`/`MB` units, not `KiB`/`MiB` — `Intl` has no binary unit names.
@@ -8823,7 +8956,8 @@ field currently has focus.
8823
8956
 
8824
8957
  **Events:** `input` (every keystroke), `change` (a field blur where the composite value newly
8825
8958
  transitioned), plus re-dispatched bubbling/composed `focus` and `blur` (`blur` fires once when focus
8826
- leaves all three fields, not per field-to-field Tab). `input`/`change` detail is
8959
+ leaves all three fields, not per field-to-field Tab; each entry into the control likewise produces
8960
+ exactly one public `focus`, with the private trusted focus suppressed). `input`/`change` detail is
8827
8961
  `{ value, day, month, year, field }` — `value` is the canonical ISO date or `''`, `day`/`month`/`year`
8828
8962
  are the live raw typed text, and `field` is `'day' | 'month' | 'year'`, whichever was last edited.
8829
8963
 
@@ -8942,6 +9076,8 @@ directional `fade-*` effects).
8942
9076
  - The host is `display: block`. For an inline text-fragment swap inside a sentence, override
8943
9077
  `lr-random-content { display: inline; }` from outside; `display: contents` is deliberately not
8944
9078
  used (a11y-tree inconsistencies across engines).
9079
+ - Slot/focus microtasks and autoplay never queue new selection work while detached; reconnecting
9080
+ starts again from current state rather than replaying stale work.
8945
9081
 
8946
9082
  ## `lr-tour`
8947
9083
 
@@ -8956,8 +9092,8 @@ controls and a step-progress indicator. Controlled component — `steps` is neve
8956
9092
  `start()`/`end()`
8957
9093
  - `steps: TourStep[] = []` (attribute: false) — empty renders nothing
8958
9094
  - `activeIndex: number = 0` (attribute `active-index`, reflected) — clamped to
8959
- `[0, steps.length - 1]`, including for a direct property/attribute write that bypasses
8960
- `goToStep()`
9095
+ `[0, steps.length - 1]` as a finite integer, including for a direct property/attribute write that
9096
+ bypasses `goToStep()`; fractions floor and non-finite values fall back to `0`
8961
9097
  - `placement: Placement = 'bottom'` (reflected) — tour-level Floating UI default, overridable per
8962
9098
  step; resolved through `rtlAwarePlacement()`
8963
9099
  - `distance: number = 12` — px offset between target and popover. Tour-level only (no per-step
@@ -8974,9 +9110,11 @@ controls and a step-progress indicator. Controlled component — `steps` is neve
8974
9110
  **Exported types:** `TourStep { id: string; target: TourTarget; heading: string; content?: string;
8975
9111
  placement?: Placement; spotlightPadding?: number; interactiveTarget?: boolean; hidePrevious?: boolean }`;
8976
9112
  `TourTarget = string | HTMLElement | (() => HTMLElement | null)` — a string resolves via
8977
- `ownerDocument.querySelector` (top-level light DOM only), and every form is re-resolved on each step
8978
- activation, never cached, so a target mounted later still resolves. `heading` is required and
8979
- becomes the panel's accessible name; `content` renders as plain text (no HTML/markdown parsing).
9113
+ `ownerDocument.querySelector` (top-level light DOM only). Every form resolves exactly once when the
9114
+ step becomes active and is kept as one connected snapshot for that activation, then resolves again
9115
+ on a later activation/reconnect. Invalid selectors, throwing resolvers, non-`HTMLElement` results,
9116
+ and detached elements use the normal missing-target path instead of throwing. `heading` is required
9117
+ and becomes the panel's accessible name; `content` renders as plain text (no HTML/markdown parsing).
8980
9118
  `TourEndReason = 'completed' | 'skip' | 'escape' | 'api' | 'unmount' | (string & {})`.
8981
9119
 
8982
9120
  **Methods:** `start(index = 0)` (clamps, opens, emits `lr-tour-start`), `next()` (on the last step
@@ -8998,8 +9136,9 @@ step: a consumer needing different rich content per step swaps the slotted child
8998
9136
 
8999
9137
  **CSS parts:** `backdrop` (the full-viewport `<svg>` scrim with the cutout, `aria-hidden`),
9000
9138
  `spotlight` (the decorative ring around the padded target rect, `pointer-events: none`),
9001
- `popover` (the step panel, `role="dialog" aria-modal="true"`, `data-unanchored` when the target
9002
- didn't resolve), `heading` (the `aria-labelledby` target), `body` (slot or `step.content`),
9139
+ `popover` (the step panel, `role="dialog"`, `aria-modal="true"` for default steps and `"false"` for
9140
+ an `interactiveTarget` step, `data-unanchored` when the target didn't resolve), `heading` (the
9141
+ `aria-labelledby` target), `body` (slot or `step.content`),
9003
9142
  `progress` (wrapper), `progress-text` (the "Step X of Y" text — an `aria-describedby` target),
9004
9143
  `progress-dot` (one decorative dot per step, `data-current` on the active one, `aria-hidden`),
9005
9144
  `footer` (the control row), `previous-button`, `skip-button`, `next-button` (the Next control's
@@ -9024,23 +9163,23 @@ rather than per component.
9024
9163
  **Known gotchas:**
9025
9164
  - By default the spotlighted target is **non-interactive**: it stays visible and announceable (not
9026
9165
  `inert`, not `aria-hidden`) but every pointer event over the viewport is captured by the backdrop.
9027
- Set `step.interactiveTarget` to clip the backdrop around the target so clicks fall through that
9028
- restores pointer reachability only. The focus trap still confines Tab to the popover regardless,
9029
- so for a keyboard-reachable demonstrated interaction have the app's own listener call `next()`.
9030
- - Uses the overlay manager with `modal: false` deliberately: `modal: true` would mark the whole page
9031
- (including the target, which lives outside this element) `inert`. `role="dialog"` +
9032
- `aria-modal="true"` are still rendered on the panel so screen readers confine their virtual cursor.
9166
+ A default step uses a modal overlay and traps focus in the panel. Set `step.interactiveTarget` to
9167
+ clip the backdrop around the target, switch the panel to nonmodal semantics, and install an
9168
+ explicit two-way Tab route between the panel and the live target, so both pointer and keyboard
9169
+ interaction remain reachable.
9033
9170
  - Each step transition mounts a genuinely new popover node (keyed on `step.id`) so focus reliably
9034
9171
  re-enters the panel — don't cache a reference to `[part="popover"]` across steps.
9035
9172
  - No `Home`/`End` shortcut and no click-to-jump progress dots (unlike `lr-stepper`): later steps may
9036
9173
  depend on an earlier step's side effect having run. `goToStep()` is available for a caller that
9037
9174
  knows better. ArrowRight/ArrowLeft do move between steps (swapped under RTL), except while focus
9038
9175
  is in an `input`/`textarea`/`contenteditable` inside slotted content.
9039
- - A direct `HTMLElement` target is re-checked for `isConnected` on every activation and treated as
9040
- missing if it was remounted — prefer a selector string or resolver function for targets that can
9041
- be replaced mid-tour.
9176
+ - A direct `HTMLElement` target must be connected at activation and is treated as missing after a
9177
+ remount; prefer a selector string or resolver function for targets that can be replaced between
9178
+ activations.
9042
9179
  - The active step's target is `scrollIntoView({ block: 'center' })`'d on activation, smoothly unless
9043
9180
  `prefers-reduced-motion: reduce`.
9181
+ - Changing `placement`, `distance`, or tour-level `spotlightPadding` while open repositions/repaints
9182
+ the current step live without scrolling again or emitting a duplicate `lr-tour-target-missing`.
9044
9183
 
9045
9184
  # Media, files & maps (`components/media/`)
9046
9185
 
@@ -9299,7 +9438,9 @@ and additive plain-GeoJSON `dataLayers`, plus a raw `map` escape hatch for anyth
9299
9438
  content, sanitize anything derived from user input first; prefer `label` (`Popup.setText()`,
9300
9439
  escaped) when the content is plain text. A marker whose `color` changes for a persisting `id`
9301
9440
  can't be recolored in place (no `Marker.setColor()`) and is torn down/reconstructed instead — see
9302
- gotchas.
9441
+ gotchas. Entries with non-finite coordinates or latitude outside `[-90, 90]` are skipped without
9442
+ aborting valid siblings. `color` is used only when the browser accepts it as CSS `color`;
9443
+ declaration breaks and `url()` paint servers fall back to MapLibre's default marker color.
9303
9444
  - `dataLayers: GeoJsonDataLayer[] = []` (attribute: false) — `GeoJsonDataLayer { sourceId: string;
9304
9445
  geojson: GeoJSON.Feature | GeoJSON.FeatureCollection; tone?: 'accent' | 'success' | 'warning' |
9305
9446
  'danger' | 'neutral' }`. Each entry adds one GeoJSON source plus three layers
@@ -9311,10 +9452,9 @@ and additive plain-GeoJSON `dataLayers`, plus a raw `map` escape hatch for anyth
9311
9452
  is: an entry whose `sourceId` persists across a `dataLayers` reassignment gets its GeoJSON updated
9312
9453
  in place (`setData()`), one that's dropped has its source/layers removed, and a genuinely new
9313
9454
  `sourceId` gets a new source/layers — nothing leaks on removal, style change, or disconnect.
9314
- - `label: string = ''` — accessible name for the map region, applied as `[part="base"]`'s
9315
- `aria-label`. A plain `aria-label` attribute on the host itself is honored as a fallback when
9316
- `label` is left unset, matching `lr-slider`/`lr-checkbox`/`lr-switch`; with neither set, it
9317
- falls back to the localized `'map'` message.
9455
+ - `label: string = ''` — accessible-name fallback for MapLibre's actual focusable canvas. A plain
9456
+ host `aria-label` takes precedence over `label`; with neither set, the canvas uses the localized
9457
+ `'map'` message. The non-semantic `[part="base"]` wrapper is not named instead.
9318
9458
 
9319
9459
  **Getters:** `map` → the raw `maplibregl.Map` instance.
9320
9460
 
@@ -9373,6 +9513,10 @@ https://maplibre.org/maplibre-gl-js/docs/#esm.
9373
9513
  layer/source maplibre-gl knows about.
9374
9514
  - Point markers now have a declarative API (`markers`, above) with popup support — the `.map` escape
9375
9515
  hatch and manual `new maplibregl.Marker()` are no longer the only way to place pins.
9516
+ - A marker uses `label` as its accessible name, falling back to the localized map label. Popup
9517
+ ownership is exposed through `aria-controls`/`aria-expanded`; an open popup is a named
9518
+ `role="dialog"` and its close button is localized. The map canvas, markers, popups, and MapLibre's
9519
+ own control strings all follow the component's effective locale.
9376
9520
  - a marker whose `color` changes for a persisting `id` is torn down and reconstructed (maplibre-gl's
9377
9521
  `Marker` has no `setColor()`) rather than mutated in place — this also closes any popup the user
9378
9522
  currently has open on that marker (a fresh, closed `Popup` is built for the new instance); an
@@ -9447,10 +9591,14 @@ file can be selected at a time.'`), and — for `'directory'` — the pre-existi
9447
9591
  itself. The region is cleared (and unrendered) as soon as a subsequent selection rejects nothing.
9448
9592
 
9449
9593
  **Slots:** default slot — custom dropzone content, overrides the `label` attribute text when
9450
- provided. The accessible name always comes from `label` regardless, so icon-only slot content still
9451
- announces correctly.
9452
-
9453
- **CSS parts:** `base`, `input`, `status` (a visually-hidden `role="status" aria-live="polite"`
9594
+ provided. The semantic button's accessible name comes from `accessibleLabel`/host `aria-label`,
9595
+ then `label`, so icon-only slot content still announces correctly. Slotted content is a sibling of
9596
+ the button rather than nested inside it: links, buttons, inputs, and other interactive slotted
9597
+ controls keep their own activation and do not also open the picker; clicking non-interactive custom
9598
+ content still activates the dropzone.
9599
+
9600
+ **CSS parts:** `base` (the native dropzone button, visually behind but semantically beside the
9601
+ slotted content), `input`, `status` (a visually-hidden `role="status" aria-live="polite"`
9454
9602
  element carrying the drag accept/reject announcement and the aggregate accepted/rejected count),
9455
9603
  `rejection` (a **visible** `role="alert"` region, rendered only while a rejection exists, listing
9456
9604
  each currently-rejected file next to a per-reason message — in addition to, never in place of, the
@@ -9725,7 +9873,9 @@ type wins; filename extension fallback is used only for an empty or `application
9725
9873
  MIME type. Unknown values return a generic file result.
9726
9874
 
9727
9875
  **Properties:** `mimeType` (attribute `mime-type`), `name`, `size` (bytes; `0` renders no size),
9728
- `label`, `decorative`, and `variant: 'icon' | 'label'`.
9876
+ `label`, `decorative`, and `variant: 'icon' | 'label'`. A host `aria-label` wins over the computed
9877
+ localized file-type/size name. `decorative` changes the semantic owner to presentation and renders
9878
+ `aria-hidden="true"` explicitly.
9729
9879
 
9730
9880
  **CSS parts:** `base`, `icon`, `label`, and `size`.
9731
9881
 
@@ -9762,7 +9912,9 @@ final.
9762
9912
  - `maxHeight: string = ''` (attribute `max-height`) — a CSS length (e.g. `"16rem"`); once set,
9763
9913
  overrides the `--lr-media-card-max-height` custom property for this instance only (applied
9764
9914
  inline on `[part="base"]`, so it reliably wins over a `:host{}`-declared default from outside the
9765
- shadow root) — same contract as `<lr-document-preview>`'s identically-named prop.
9915
+ shadow root) — same contract as `<lr-document-preview>`'s identically-named prop. Values that do
9916
+ not parse as CSS `max-height`, contain declaration breaks, or contain `url()` are ignored, leaving
9917
+ the stylesheet token in control.
9766
9918
  - `appearance: 'card' | 'plain' = 'card'` (reflected) — visual chrome, mirroring
9767
9919
  `<lr-source-card>`'s `appearance` vocabulary. `'card'` (the default) keeps the bordered, filled
9768
9920
  box. `'plain'` removes `[part="base"]`'s border, background, padding, and corner radius, so a
@@ -9864,10 +10016,10 @@ capability as a row.
9864
10016
  attribute.
9865
10017
  - `disabled: boolean = false` (reflected)
9866
10018
  - `triggerLabel?: string` (attribute `trigger-label`) — overrides the single-capability trigger
9867
- button's `aria-label`, which otherwise comes from `CAPABILITY_META[capability].triggerLabel` (e.g.
9868
- `'Attach files'`); only affects the single-capability button (`[part='trigger']`) — the
9869
- multi-capability menu's own trigger keeps its fixed `'Add attachment'` label regardless. Unset
9870
- (the default) keeps the built-in English default.
10019
+ button's accessible-name fallback, which otherwise comes from the localized capability metadata
10020
+ (e.g. `'Attach files'`); only affects the single-capability button (`[part='trigger']`). The
10021
+ multi-capability trigger uses its localized `'Add attachment'` fallback. A host `aria-label`
10022
+ takes precedence on either trigger shape.
9871
10023
  - `triggerTitle?: string` (attribute `trigger-title`) — forwards a sighted-user hover tooltip to
9872
10024
  both the single-capability and multi-capability trigger buttons
9873
10025
 
@@ -9880,8 +10032,8 @@ default) — fired when the `camera` / `audio` capability is activated; this com
9880
10032
  capture UI of its own, the host owns everything from here (there's no single right answer for
9881
10033
  `getUserMedia` vs. `<input capture>` vs. a native wrapper's own camera API; for `audio` the
9882
10034
  typical host response is opening `<lr-push-to-talk>` in an overlay, then handing the resulting
9883
- blob to `<lr-attachment-chip>`). Internal `focus`/`blur` from the hidden input are re-emitted as
9884
- host events.
10035
+ blob to `<lr-attachment-chip>`). `focus`/`blur` from the active single- or multi-capability trigger
10036
+ are re-emitted as bubbling, composed host events; the hidden file input is not the focus owner.
9885
10037
 
9886
10038
  **Slots:** none — capabilities are configured entirely via the `capabilities` prop.
9887
10039
 
@@ -9918,6 +10070,8 @@ hidden via CSS by default, exposed as a part only so a consumer can override tha
9918
10070
  - The `camera`/`audio` capabilities never touch the hidden `<input type="file">` at all — both are
9919
10071
  scope-limited by design to firing `lr-camera-request`/`lr-audio-request` and nothing else. The
9920
10072
  hidden input is only rendered when `capabilities` contains `files` or `image`.
10073
+ - Setting `disabled` closes an open capability menu, disables its items as well as the trigger, and
10074
+ discards a native file selection that arrives after the component became disabled.
9921
10075
 
9922
10076
  **Additional API surface:**
9923
10077
 
@@ -9951,10 +10105,10 @@ it in a `<button>`/`<lr-menu>` trigger for a user-menu affordance.
9951
10105
 
9952
10106
  **Events:** none.
9953
10107
 
9954
- **Slots:** default slot — icon/glyph content (e.g. an inline SVG), shown in place of the image and
9955
- initials, e.g. to mark a chat avatar as "AI" vs. "user" with a role glyph. Takes priority over both
9956
- `src` and `initials`. The glyph is treated as decorative (`aria-hidden`) — set `alt` alongside it
9957
- for an accessible name.
10108
+ **Slots:** default slot — icon/glyph content (e.g. an inline SVG or non-whitespace text/emoji),
10109
+ shown in place of the image and initials, e.g. to mark a chat avatar as "AI" vs. "user" with a role
10110
+ glyph. Takes priority over both `src` and `initials`. The glyph is treated as decorative
10111
+ (`aria-hidden`) — set `alt` alongside it for an accessible name.
9958
10112
 
9959
10113
  **CSS parts:** `base` (the outer circle/square container), `icon` (wrapper around the slotted
9960
10114
  icon/glyph, only shown while the slot has assigned content), `image` (the `<img>`, only rendered
@@ -9983,7 +10137,8 @@ override it on the element for a size the built-in scale doesn't cover. Plus sha
9983
10137
 
9984
10138
  **Known gotchas:**
9985
10139
  - an image load failure falls back to `initials` automatically. Changing `src` clears the failure
9986
- state so the replacement URL gets its own load attempt.
10140
+ state so the replacement URL gets its own load attempt, including when a later transition returns
10141
+ to a URL that failed previously.
9987
10142
  - when `alt` or host `aria-label` supplies a name, the base preserves that name through the
9988
10143
  initials fallback while hiding duplicate initials text from assistive technology.
9989
10144
 
@@ -10043,6 +10198,8 @@ backgrounded circle around the button; only rendered once loaded and error-free)
10043
10198
  - both `image` and `canvas` stay mounted at all times (never `display: none`/removed) so the
10044
10199
  browser's native decode loop keeps running while visually covered; only opacity and `aria-hidden`
10045
10200
  swap.
10201
+ - reduced-motion arbitration is re-evaluated on every reconnect, so a preference change made while
10202
+ the element was detached cannot leave `playing` stale.
10046
10203
 
10047
10204
  **Additional API surface:**
10048
10205
 
@@ -10079,7 +10236,7 @@ Declaratively animates one slotted element through the native Web Animations API
10079
10236
  `threshold: number | number[] = 0` (both attribute: false) plus `rootMargin: string = '0px'`
10080
10237
  (attribute `root-margin`) configure that observer.
10081
10238
  - `currentTime: number` — the underlying `Animation.currentTime` (`0` when no animation exists);
10082
- writable, forwarded to the animation when one exists.
10239
+ writable, forwarded to the animation when one exists. Non-finite assignments are ignored.
10083
10240
 
10084
10241
  **Methods:** `start()` (sugar for `play = true` — named `start` because `play` is already a
10085
10242
  property), `pause()` (`play = false`), `finish()`, `cancel()`.
@@ -10152,6 +10309,9 @@ badge label. `size` swaps it per tier (`var(--lr-font-size-xs)` at `sm`, `var(--
10152
10309
  caps read at the same optical weight; override it alongside `--lr-avatar-font-size` on the avatars
10153
10310
  themselves when tuning a custom tier.
10154
10311
 
10312
+ The overflow badge keeps a 40×40px minimum activation target at `sm`, `md`, and `lg`; this does not
10313
+ change the visible avatar circles themselves.
10314
+
10155
10315
  **Optional peer deps:** none.
10156
10316
 
10157
10317
  ```html
@@ -10189,16 +10349,17 @@ trap, Escape/backdrop dismissal, scroll lock, and focus return.
10189
10349
  event) when `images` shrinks.
10190
10350
  - `loop: boolean = false` (reflected) — wraps prev/next past the ends.
10191
10351
  - `noLightDismiss: boolean = false` (attribute `no-light-dismiss`) — opts out of backdrop dismissal.
10192
- - `showCounter: boolean = true` (attribute `show-counter`) — shows `[part="counter"]` and its
10193
- live-region announcement.
10352
+ - `showCounter: boolean = true` (attribute `show-counter`) — shows the visible `[part="counter"]`.
10353
+ The independent `[part="live-region"]` announcement remains active when the counter is hidden.
10194
10354
  - `minZoom: number = 0.5`, `maxZoom: number = 4`, `zoomStep: number = 0.25` (attributes `min-zoom`/
10195
10355
  `max-zoom`/`zoom-step`) — pure pass-throughs to the embedded `<lr-zoomable-frame>`, which does the
10196
10356
  normalizing.
10197
10357
  - `accessibleLabel: string | null = null` (attribute `aria-label`) — the panel's accessible name,
10198
10358
  overriding the localized `lightboxLabel`.
10199
10359
 
10200
- **Methods:** `next()`, `previous()`, `goTo(index)`, `close(reason?)` — `reason` defaults to `'api'`
10201
- and is forwarded as the close event's detail.
10360
+ **Methods:** `next()`, `previous()`, `goTo(index)`, `close(reason?)` — `goTo()` ignores a non-finite
10361
+ index without changing state or emitting `lr-index-change`; `reason` defaults to `'api'` and is
10362
+ forwarded as the close event's detail.
10202
10363
 
10203
10364
  **Events:** `lr-lightbox-close` (`detail: LyraLightboxCloseReason = 'escape' | 'backdrop' |
10204
10365
  'close-button' | 'api' | 'unmount' | (string & {})`; **cancelable** — `preventDefault()` blocks
@@ -10243,12 +10404,14 @@ photo content.
10243
10404
 
10244
10405
  ## `lr-qr-code`
10245
10406
 
10246
- Renders `value` as a QR code using the optional `qrcode` peer dependency. **Properties:** `value`, `label`,
10247
- `size`, `radius`, and `errorCorrection` (`error-correction`, `L`/`M`/`Q`/`H`). The canvas owns `role="img"`;
10248
- its accessible name uses `label`, host `aria-label`, then `value`. Empty values render an empty state.
10407
+ Renders `value` as a QR code using the optional `qrcode` peer dependency. **Properties:** `value`,
10408
+ `label`, `size`, `radius`, and `errorCorrection` (`error-correction`, `L`/`M`/`Q`/`H`). The canvas
10409
+ owns `role="img"`; its accessible name uses host `aria-label`, then `label`, then `value`. Empty
10410
+ values render an empty state.
10249
10411
  **CSS parts:** `base`, `canvas`, `empty`, `loading`, and `error`. **CSS custom properties:**
10250
- `--lr-qr-code-fill` and `--lr-qr-code-background`. Call `refreshTheme()` after external theme changes
10251
- when the computed QR colors need to be redrawn immediately.
10412
+ `--lr-qr-code-fill` and `--lr-qr-code-background`. Ancestor theme-attribute and color-scheme
10413
+ changes redraw automatically. Call `refreshTheme()` only for consumer-owned token changes that
10414
+ aren't represented by those signals.
10252
10415
 
10253
10416
  ## `lr-image-viewer`
10254
10417
 
@@ -10279,6 +10442,11 @@ zoom }`), `lr-rotation-change` (`detail: { rotation }`), `lr-fit-change` (`detai
10279
10442
  embedded `lr-zoomable-frame`), `image-wrapper`, `image`, `highlight-layer`, `highlight` (carries
10280
10443
  `data-tone`/`data-active`), `highlight-label`, `annotation-box`, and `error`.
10281
10444
 
10445
+ While `annotatable`, `image-wrapper` is a named `role="group"` with the localized annotation hint.
10446
+ Only `region` highlights whose `rect` contains finite numeric `x`/`y`/`width`/`height` and
10447
+ nonnegative dimensions are rendered; malformed rectangles are omitted rather than reaching inline
10448
+ styles or anchor hit testing.
10449
+
10282
10450
  **Themeable custom properties:** `--lr-image-viewer-annotate-active-bg` (default
10283
10451
  `var(--lr-color-brand-quiet)`) and `--lr-image-viewer-annotate-active-border` (default
10284
10452
  `var(--lr-color-brand)`) — the background and border of `[part='annotate-toggle']` while annotation
@@ -10318,9 +10486,17 @@ number[] = []` (attribute: false), and `tracks: LyraAvTrack[] = []` (attribute:
10318
10486
  `LyraAvCue = { id, start, end?, text, speaker? }`; `LyraAvTrack = { src, kind: 'subtitles' |
10319
10487
  'captions' | 'descriptions', srclang, label, default? }`.
10320
10488
 
10321
- **Methods:** `play()`, `pause()`, and `toggle()` proxy the native media element. `seek(seconds)`
10322
- sets `currentTime` and forces an immediate `lr-time-change`. `search(query)` resolves the match
10323
- count; `searchNext()`/`searchPrevious()` wrap; `clearSearch()` resets.
10489
+ Runtime numeric input is normalized before it reaches media, canvas, or `Intl`: cue/highlight times
10490
+ and waveform peaks are clamped to their valid ranges; non-finite native duration/current time
10491
+ cannot leak into state or events. `rates` keeps only unique finite values in the supported
10492
+ `0.0625..16` range, while always including the normalized current `playbackRate`.
10493
+
10494
+ **Methods:** `play(): Promise<void>` proxies the native media element and preserves its native
10495
+ promise/rejection (before the media mounts it returns an already-resolved promise). `pause()` and
10496
+ `toggle()` proxy the native element; an internal toggle that cannot start playback renders the
10497
+ error state and emits `lr-render-error`. `seek(seconds)` sets `currentTime` and forces an immediate
10498
+ `lr-time-change`. `search(query)` resolves the match count; `searchNext()`/`searchPrevious()` wrap;
10499
+ `clearSearch()` resets.
10324
10500
 
10325
10501
  **Events:** `lr-play`, `lr-pause`, `lr-load` (`detail: { duration, kind }`), `lr-time-change`
10326
10502
  (`detail: { currentTime }`, throttled to at most 4/s while playing plus one extra per `seek()`),
@@ -10389,9 +10565,12 @@ Chart.js wrapper every other `lr-*-chart` tag subclasses; supports both a simpli
10389
10565
  unknown runtime attribute/property values fall back to `line` before reaching Chart.js
10390
10566
  - `labels: string[] = []` (attribute: false)
10391
10567
  - `datasets: Series[] = []` (attribute: false) — `Series { label: string; data?: (number|null)[];
10392
- points?: {x,y,label?}[]; color?: string|string[]; fill?: boolean; width?: number; dash?: boolean;
10568
+ points?: ChartPoint[]; color?: string|string[]; fill?: boolean; width?: number; dash?: boolean;
10393
10569
  noTooltip?: boolean; axis?: 'y'|'y2'; pointColors?: string[]; pointRadius?: number|number[];
10394
- segmentColors?: string[]; type?: 'line'|'bar' }`
10570
+ segmentColors?: string[]; type?: 'line'|'bar' }`. Both the package root and granular chart entry
10571
+ export `ChartPoint { x: number; y: number; r?: number; label?: string }`: `r` is the bubble
10572
+ radius, and the optional per-point `label` is retained by events, CSV export, keyboard
10573
+ announcements, generated summaries, and the accessible table.
10395
10574
  - `pointRadius` takes a single number (applied to every point) **or** an array matching `data`'s
10396
10575
  length that sizes each point independently — passed straight through to Chart.js, which
10397
10576
  supports both natively. Useful for emphasizing a single outlier or the latest reading without
@@ -10402,7 +10581,11 @@ Chart.js wrapper every other `lr-*-chart` tag subclasses; supports both a simpli
10402
10581
  `segment.borderColor` scriptable option, so it is only meaningful for line-type series.
10403
10582
  Typical use is threshold/anomaly banding along one line. A series that omits it (or passes an
10404
10583
  empty array) emits no `segment` key at all, leaving line rendering exactly as before.
10405
- - `legend: boolean = false`
10584
+ - `legend: boolean = false` — renders a wrapping DOM legend whose keyboard-operable buttons toggle
10585
+ dataset visibility. The DOM surface preserves long public labels that a canvas legend would clip.
10586
+ Its pressed state honors an effective dataset's declarative `hidden` value before Chart.js is
10587
+ ready and across chart type/plugin rebuilds, while an in-place redraw preserves an explicit
10588
+ legend-button toggle.
10406
10589
  - `legendPosition: LyraChartLegendPosition = 'top'` (attribute `legend-position`) — places the
10407
10590
  legend at `top`, `right`, `bottom`, or `left`; `auto` chooses right above 480px and bottom below
10408
10591
  that allocation width
@@ -10440,6 +10623,11 @@ Chart.js wrapper every other `lr-*-chart` tag subclasses; supports both a simpli
10440
10623
  - `config?: Partial<ChartConfiguration>` (attribute: false) — deep-merged over the generated
10441
10624
  config; any nested key wins without clobbering sibling generated keys. This is the raw Chart.js
10442
10625
  escape hatch, so a caller-supplied `config.type` is passed through rather than normalized.
10626
+ Explicit `config.data.labels` and `config.data.datasets` arrays are authoritative independently:
10627
+ an omitted member still comes from the simplified `labels`/`datasets` properties, while an
10628
+ explicit array replaces that generated member rather than concatenating with it. This effective
10629
+ model drives canvas rendering, `appendData()`, export, the accessible name/summary, keyboard
10630
+ navigation and activation events, the DOM legend, and the generated fallback table.
10443
10631
  - `accessibleLabel: string = ''` (attribute `accessible-label`) — canvas name override; a host
10444
10632
  `aria-label` has highest precedence
10445
10633
  - `accessibleDescription: string = ''` (attribute `accessible-description`) — overrides the
@@ -10450,15 +10638,23 @@ Chart.js wrapper every other `lr-*-chart` tag subclasses; supports both a simpli
10450
10638
  canvas-local coordinates (`top`, `left`, `right`, `bottom`, `width`, `height`), when a chart is
10451
10639
  drawn
10452
10640
  - `appendData(label, values, maxPoints?)` — appends one aligned numeric category and optionally
10453
- keeps only the newest `maxPoints`; point-based scatter/bubble series are left unchanged
10641
+ keeps only the newest `maxPoints`. Each labels/datasets member is written back to the surface
10642
+ that owns it: an explicitly overridden `config.data` member stays in `config`, while an omitted
10643
+ member continues through the simplified property and retains its generated Chart.js styling.
10644
+ Point-based scatter/bubble series are left unchanged because appending their x/y/r coordinates
10645
+ needs a richer caller-defined contract.
10454
10646
 
10455
10647
  **Methods:** `resetZoom()` resets any active zoom/pan to the original view. `refreshTheme()` forces
10456
10648
  a redraw so the `--lr-chart-*` tokens below are re-read from the current computed style. A
10457
10649
  built-in `ThemeWatcher` now calls this automatically when `prefers-color-scheme` flips or an
10458
10650
  ancestor's `class`/`style`/`data-theme`/`data-color-scheme` attribute mutates — the most common
10459
10651
  theme-toggle mechanisms — so a consumer rarely needs to call it by hand; it remains public as the
10460
- escape hatch for theme changes those signals can't observe. `exportData('csv' | 'png')` returns a
10461
- spreadsheet-safe CSV snapshot or the current PNG data URL when Chart.js is loaded.
10652
+ escape hatch for theme changes those signals can't observe. Canvas redraw remains visibility-gated;
10653
+ when a DOM legend is present its computed swatch colors are refreshed too.
10654
+ `exportData('csv' | 'png')` returns a spreadsheet-safe CSV snapshot or the current PNG data URL
10655
+ when Chart.js is loaded. Numeric datasets retain the compact one-column-per-series CSV shape.
10656
+ Point datasets expand into `<series> x`, `<series> y`, and, when present, `<series> r` and
10657
+ `<series> label` columns so radius and per-point labels are not flattened away.
10462
10658
 
10463
10659
  The instance method `seriesPalette(): string[]` resolves the categorical series ramp
10464
10660
  (`--lr-color-chart-1..8`) through `getComputedStyle` and returns the concrete, theme-aware colors —
@@ -10484,20 +10680,26 @@ const series = [
10484
10680
  ```
10485
10681
 
10486
10682
  **Events:** `lr-zoom` (`detail: { zoomed: boolean }`, fired on zoom-complete and on
10487
- `resetZoom()`), `lr-point-click` (fired when a click lands on, or nearest to — intersect-only —
10488
- a data point/segment, for any chart type, not just bar; `detail: { datasetIndex: number, index:
10489
- number, label: string | undefined, value: unknown }`)
10683
+ `resetZoom()`), `lr-point-click` (fired when pointer input lands on an intersecting data
10684
+ point/segment, when a generated-table value is activated, or when Enter/Space activates the
10685
+ keyboard-current canvas datum; `detail: { datasetIndex: number, index: number, label: string |
10686
+ undefined, value: unknown }`). For scatter/bubble points, `label` prefers the per-point label and
10687
+ `value` is the complete `ChartPoint`, including optional `r` and `label`.
10490
10688
 
10491
10689
  **Slots:** `data-table` — an optional consumer-provided accessible table alternative; `center` —
10492
10690
  optional overlay content positioned at the chart area's center, useful for doughnut and pie totals.
10493
10691
 
10494
- **CSS parts:** `base`, `canvas`, `reset-zoom-button`, `description`, `data-table`, `center` (the
10495
- chart-area-centered wrapper for the `center` slot), `error` (`role="alert"` message rendered in
10496
- place of `canvas` when the optional `chart.js` peer dependency fails to load)
10692
+ **CSS parts:** `base`, `plot` (the fixed-height canvas/overlay region), `canvas`, `legend` (the
10693
+ wrapping DOM legend), `legend-item` (a dataset-visibility button), `legend-swatch`,
10694
+ `reset-zoom-button`, `description`, `data-table`, `center` (the chart-area-centered wrapper for the
10695
+ `center` slot), `error` (`role="alert"` message rendered in place of `canvas` when the optional
10696
+ `chart.js` peer dependency fails to load)
10497
10697
 
10498
10698
  **Themeable custom properties:** `--lr-chart-height` (set programmatically on the host from the
10499
- `height` property must be read from the host, not a shadow-tree descendant, since custom
10500
- properties only cascade downward); `--lr-chart-grid-color` (default `var(--lr-color-border)`),
10699
+ `height` property; sizes the `plot` region and the host's minimum block size, while a visible table
10700
+ or wrapping legend grows the host in normal flow — it must be read from the host, not a shadow-tree
10701
+ descendant, since custom properties only cascade downward);
10702
+ `--lr-chart-grid-color` (default `var(--lr-color-border)`),
10501
10703
  `--lr-chart-tick-color` (default `var(--lr-color-text-quiet)`), `--lr-chart-legend-color`
10502
10704
  (default `var(--lr-color-text)`), `--lr-chart-tooltip-bg` (default `var(--lr-color-surface)`),
10503
10705
  `--lr-chart-tooltip-text` (default `var(--lr-color-text)`) — each resolved fresh via
@@ -10533,9 +10735,14 @@ subset actually used.
10533
10735
  property values fall back to `line`. Each typed `lr-*-chart` subclass (e.g.
10534
10736
  `llms/components/lr-bar-chart.md`) locks its *own* `type` via a real prototype accessor — a
10535
10737
  genuine runtime lock, not just a compile-time default.
10536
- - a built-in `ThemeWatcher` auto-retheme an already-drawn chart when `prefers-color-scheme` flips or
10537
- an ancestor's `class`/`style`/`data-theme`/`data-color-scheme` attribute mutates (coalesced to one
10538
- redraw). `refreshTheme()` stays public for out-of-band theme changes those signals can't observe.
10738
+ - a built-in `ThemeWatcher` automatically rethemes an already-drawn chart when
10739
+ `prefers-color-scheme` flips or an ancestor's `class`/`style`/`data-theme`/`data-color-scheme`
10740
+ attribute mutates (coalesced to one redraw). `refreshTheme()` stays public for out-of-band theme
10741
+ changes those signals can't observe.
10742
+ - the focusable canvas is an interactive `application`, not a static image: Arrow keys move through
10743
+ finite data, Home/End jump to the endpoints, and Enter/Space activates the current datum. Its
10744
+ localized `aria-roledescription` identifies the application as a chart; the generated table is
10745
+ the non-canvas alternative.
10539
10746
  - generated `scales` are keyed off the *effective* type (`config.type` ?? `type`, see
10540
10747
  `effectiveType()`) and are type-appropriate: no scale at all for `type="pie"`/`"doughnut"` (true of
10541
10748
  `<lr-chart type="pie">` directly, not just the `lr-pie-chart`/`lr-doughnut-chart` subclasses),
@@ -10561,11 +10768,14 @@ subset actually used.
10561
10768
  single redraw fires once it re-enters the viewport). Independently, `updated()` only reaches
10562
10769
  Chart.js when at least one of `type`, `labels`, `datasets`, `legend`, `legendPosition`, the
10563
10770
  internal resolved auto legend position, `valueFormatter`, `area`, `height`, `xLabel`, `yLabel`,
10564
- `y2Label`, `beginAtZero`, `horizontal`, `stacked`, `config`, `zoom`, `locale`, `strings`, or the
10565
- internal loading state actually changed in that update (so an unrelated property/state update, or
10566
- a bare `requestUpdate()`, draws nothing). `refreshTheme()` calls `draw()` directly and is
10567
- unaffected by either gate it always redraws, since a theme change isn't reflected in any tracked
10568
- property.
10771
+ `y2Label`, `beginAtZero`, `horizontal`, `stacked`, `dataLabels`, `stackTotals`, `config`, `zoom`,
10772
+ `locale`, `strings`, or the internal loading state actually changed in that update (so an
10773
+ unrelated property/state update, or a bare `requestUpdate()`, draws nothing). Resize callbacks
10774
+ ignore unchanged inline sizes and coalesce into one animation-frame task; a responsive legend
10775
+ position change and its reactive update share that same single redraw. `refreshTheme()`, resize,
10776
+ optional-plugin completion, and histogram data changes all use the same connected/visible gate.
10777
+ A theme refresh may still rerender the cheap DOM legend while off-screen so its computed swatches
10778
+ do not go stale, but it does not repaint the canvas there.
10569
10779
  - Chart.js receives `effectiveLocale`; generated summary values use the same locale. Cartesian y/y2
10570
10780
  axes swap logical sides under RTL, and host `aria-label` is forwarded to the canvas and data-table
10571
10781
  caption.
@@ -10585,9 +10795,11 @@ passthrough). Not a subclass of `LyraChart`.
10585
10795
  - `type: LyraLiteChartType = 'bar'` — `'bar' | 'line'`
10586
10796
  - `labels: string[] = []` (attribute: false)
10587
10797
  - `datasets: LiteSeries[] = []` (attribute: false) — `LiteSeries { label: string; data:
10588
- (number|null)[]; color?: string }`
10798
+ (number|null)[]; color?: string }`; `color` accepts a valid CSS `color`, while invalid values,
10799
+ declaration-breaking input, and `url()` paint servers fall back to the built-in palette
10589
10800
  - `legend: boolean = false`
10590
- - `height: string = '280px'`
10801
+ - `height: string = '280px'` — accepts a valid CSS `height`; invalid values, declaration-breaking
10802
+ input, and `url()` leave the stylesheet's `--lr-chart-height` default/consumer override in control
10591
10803
  - `xLabel: string = ''` (attribute `x-label`)
10592
10804
  - `yLabel: string = ''` (attribute `y-label`)
10593
10805
  - `beginAtZero: boolean = true` (attribute `begin-at-zero`)
@@ -10614,16 +10826,19 @@ passthrough). Not a subclass of `LyraChart`.
10614
10826
  - `maxLabels?: number` (attribute `max-labels`, type Number) — decimates which category axis labels
10615
10827
  actually render *text* when `labels.length > maxLabels` (bars themselves are never decimated, only
10616
10828
  their axis `<text>` labels): always shows the first and last label, and roughly evenly distributes
10617
- the rest between them. Works in either `layout` mode. Unset (the default) renders every label,
10618
- unchanged.
10829
+ the rest between them. Works in either `layout` mode. Unset (the default) renders every label.
10830
+ Each rendered category label is allocation-aware: narrow/long text is ellipsized before paint,
10831
+ with the complete caller label retained as its accessible name.
10619
10832
  - `barX?: (index: number) => number` (attribute: false, bar type only) — overrides the internal
10620
10833
  per-category x-origin formula (`plotX + i * slot`) used by both bars and their axis labels, so a
10621
10834
  consumer can pixel-align this chart's bars with a sibling `<lr-heatmap>` calendar's week columns
10622
10835
  (see that component's own `columnX`) by supplying the same coordinate function to both. Unset (the
10623
10836
  default) is the original formula, unchanged.
10624
10837
  - `pointText?: (label: string, value: number, datasetIndex: number) => string` (attribute: false) —
10625
- overrides the per-bar/per-point `<title>`/`aria-label` tooltip text (mirrors `lr-heatmap`'s
10626
- `cellText`). Falls back to the built-in raw-value template when unset.
10838
+ overrides the per-bar/per-point native SVG `<title>` text (mirrors `lr-heatmap`'s `cellText`).
10839
+ That one `<title>` supplies both the browser tooltip and the mark's accessible name; the component
10840
+ does not duplicate the same string through `aria-label`. Falls back to the built-in raw-value
10841
+ template when unset.
10627
10842
  - `legendText?: (label: string, datasetIndex: number) => string` (attribute: false) — appends
10628
10843
  formatter-supplied text (e.g. a value or percentage share) after each series' label in the
10629
10844
  built-in legend row, mirroring `pointText`/`tickFormat`'s opt-in-hook convention. Falls back to
@@ -10644,14 +10859,14 @@ passthrough). Not a subclass of `LyraChart`.
10644
10859
  ignores it entirely.
10645
10860
  - `hideAxis: boolean = false` (attribute `hide-axis`) — suppresses gridlines/y-axis tick labels
10646
10861
  altogether; x-axis category labels (rendered separately) are unaffected.
10647
- - `selectedIndex: number[] = []` (attribute: false) — category indexes to mark `data-selected` on
10648
- every bar/segment at that index, across every dataset e.g. to highlight a whole selected week's
10649
- column in a stacked chart. Empty (the default) reproduces the exact existing output: no bar
10650
- carries `data-selected`. This component takes no opinion on what the highlight looks like, only
10651
- which bars it applies to — style the highlight via the `--lr-lite-chart-selected-outline-color`
10652
- custom property (documented below). Note `::part(bar)[data-selected]` is **invalid CSS** — Shadow
10653
- Parts forbids an attribute selector after `::part()` — so it silently never matches; the outline
10654
- is painted inside the shadow root and exposed through that token instead.
10862
+ - `selectedIndex: number[] = []` (attribute: false) — applies to every interactive data mark for
10863
+ both `type="bar"` and `type="line"`: matching bars and line points receive `data-selected` and
10864
+ explicit `aria-pressed="true"`; all other marks render `aria-pressed="false"`. For a multi-series
10865
+ chart, the category index selects the matching mark in every dataset. Empty is the default.
10866
+ Style the built-in highlight through `--lr-lite-chart-selected-outline-color`. Note
10867
+ `::part(bar)[data-selected]` and `::part(point)[data-selected]` are **invalid CSS** — Shadow Parts
10868
+ forbids an attribute selector after `::part()` — so they silently never match; the outline is
10869
+ painted inside the shadow root and exposed through that token instead.
10655
10870
  - `minBarHeight?: number` (attribute `min-bar-height`) — optional minimum visible bar height for
10656
10871
  small non-zero values
10657
10872
  - `accessibleLabel?: string` (attribute `accessible-label`) — SVG accessible-name override; a host
@@ -10659,9 +10874,11 @@ passthrough). Not a subclass of `LyraChart`.
10659
10874
  - `appendData(label, values, maxPoints?)` — appends one aligned category and optionally trims the
10660
10875
  oldest categories
10661
10876
 
10662
- **Events:** `lr-point-click` — fired when a bar/point is activated (click, or Enter/Space while
10663
- focused). `detail: { datasetIndex: number, index: number, label: string | undefined, value: number
10664
- | null }` — same shape as `lr-chart`'s `lr-point-click`.
10877
+ **Events:** `lr-point-click` — fired for bars and line points on pointer activation or Enter/Space
10878
+ while focused. `detail: { datasetIndex: number, index: number, label: string | undefined, value:
10879
+ number | null }` — same shape as `lr-chart`'s `lr-point-click`. When different series' expanded
10880
+ line-point targets overlap, pointer activation selects the closest rendered point in two-dimensional
10881
+ screen space; an exact distance tie retains the point whose target received the click.
10665
10882
 
10666
10883
  **Methods:** `exportData('csv' | 'svg')` returns a spreadsheet-safe CSV snapshot or the current SVG
10667
10884
  markup. The method does not download a file; pair it with `lr-export-button` for download UX.
@@ -10676,13 +10893,13 @@ fresh, small SVG render is cheaper and more correct than a lossy cache.
10676
10893
 
10677
10894
  **Slots:** none.
10678
10895
 
10679
- **CSS parts:** `base`, `grid-line`, `axis-label`, `axis-title`, `bar` (each bar rect; carries
10680
- `data-selected` when its category index is in `selectedIndex`), `line`, `point`, `legend`,
10681
- `legend-item`, `legend-swatch`, `legend-text` (extra per-item text after the series label,
10682
- rendered only when `legendText` is set), `live-region` (the current mark announcement for keyboard
10683
- users), `data-list` (a visually hidden list of all plotted data points — single-series only),
10684
- `data-table` (a visually hidden category×series data table, rendered instead of `data-list` when
10685
- there is more than one dataset).
10896
+ **CSS parts:** `base`, `grid-line`, `axis-label`, `axis-title`, `bar` and `point` (each carries
10897
+ `data-selected` when its category index is in `selectedIndex`, with explicit pressed state on every
10898
+ mark), `line`, `legend`, `legend-item`, `legend-swatch`, `legend-text` (extra per-item text after
10899
+ the series label, rendered only when `legendText` is set), `live-region` (the current mark
10900
+ announcement for keyboard users), `data-list` (a visually hidden list of all plotted data points —
10901
+ single-series only), `data-table` (a visually hidden category×series data table, rendered instead
10902
+ of `data-list` when there is more than one dataset).
10686
10903
 
10687
10904
  **Screen-reader data alternative:** a single dataset renders the flat `data-list` (one `<li>` per
10688
10905
  plotted point, matching the roving-tabindex mark order). More than one dataset instead renders a
@@ -10699,10 +10916,9 @@ blank instead of reporting a misleading zero.
10699
10916
  `--lr-chart-grid-color`, `--lr-chart-tick-color`, `--lr-chart-legend-color` — same token
10700
10917
  *names* as `lr-chart`, so a host already theming `lr-chart` themes this for free;
10701
10918
  `--lr-lite-chart-selected-outline-color` (default `var(--lr-color-brand)`) — the stroke drawn on
10702
- `[part='bar'][data-selected]`, i.e. bars whose category index is in `selectedIndex` (bars only;
10703
- `[part='point']` is never marked `data-selected`, and the stroke width is a fixed 2px). Unlike
10704
- `lr-chart` (canvas-rendered, needs `getComputedStyle`-based re-theming on every draw), this is
10705
- plain SVG/DOM and reads these via native CSS `var()` — no JS-side resolution step, and no
10919
+ selected `[part='bar']` and `[part='point']` marks whose category index is in `selectedIndex`.
10920
+ Unlike `lr-chart` (canvas-rendered, needs `getComputedStyle`-based re-theming on every draw), this
10921
+ is plain SVG/DOM and reads these via native CSS `var()` no JS-side resolution step, and no
10706
10922
  `refreshTheme()` method needed (there's nothing to go stale).
10707
10923
 
10708
10924
  **Optional peer deps:** none. This is the point of the component.
@@ -10724,10 +10940,18 @@ plain SVG/DOM and reads these via native CSS `var()` — no JS-side resolution s
10724
10940
  always vertical.
10725
10941
  - No dual y-axis (`Series.axis: 'y2'`) — every series shares one y-axis/domain.
10726
10942
  - Series colors default to a fixed built-in 8-color categorical palette (round-robin by dataset
10727
- index) when `color` is unset — not configurable beyond passing `color` per series.
10728
- - Bar/point elements are real focusable DOM nodes (`tabindex="0" role="button"`, each with its own
10729
- `aria-label`), so the `<svg>` itself uses `role="group"`, not `role="img"` an "img" role would
10730
- conflict with genuinely interactive descendants (axe's `nested-interactive` rule).
10943
+ index) when `color` is unset or invalid — not configurable beyond passing a valid CSS `color`
10944
+ per series.
10945
+ - Bar/point elements are real focusable DOM nodes (`role="button"` with one roving `tabindex="0"`);
10946
+ each native SVG `<title>` is the mark's sole accessible name and tooltip. The `<svg>` itself uses
10947
+ `role="group"`, not `role="img"` — an image role would conflict with genuinely interactive
10948
+ descendants (axe's `nested-interactive` rule).
10949
+ - Dense transparent hit regions expand toward 24px only while remaining inside the neighboring
10950
+ mark's midpoint lane; stacked segments keep their own vertical region. This prevents a
10951
+ later-painted mark from stealing pointer input from an adjacent datum. Cross-series line targets
10952
+ are additionally arbitrated by two-dimensional screen distance.
10953
+ - In narrow allocations, category labels are ellipsized to their available lane and retain the
10954
+ complete label through `aria-label`; SVG overflow is contained within the host.
10731
10955
  - Tick values use a standard "nice numbers" (1/2/5 × 10ⁿ) rounding step, not exact data min/max —
10732
10956
  intentional (readable axis labels), matches how most charting libraries pick tick steps.
10733
10957
 
@@ -10754,16 +10978,18 @@ of every entry in these lists.**
10754
10978
  (`show-data-table`), `chartArea` (readonly). `type` is the only member that differs: read-only,
10755
10979
  locked to this tag's value.
10756
10980
 
10757
- **Methods:** `resetZoom()`, `refreshTheme()`.
10981
+ **Methods:** `appendData(label, values, maxPoints?)`, `exportData('csv' | 'png')`, `resetZoom()`,
10982
+ `refreshTheme()`.
10758
10983
 
10759
10984
  **Events:** `lr-zoom` (`detail: { zoomed: boolean }`), `lr-point-click` (`detail: { datasetIndex,
10760
10985
  index, label, value }`).
10761
10986
 
10762
10987
  **Slots:** `data-table`, `center`.
10763
10988
 
10764
- **CSS parts:** `base`, `canvas`, `reset-zoom-button`, `description`, `data-table`, `center`,
10765
- `error` (`role="alert"` message rendered in place of `canvas` when the optional `chart.js` peer
10766
- dependency fails to load — see `llms/components/lr-chart.md`).
10989
+ **CSS parts:** `base`, `plot`, `canvas`, `legend`, `legend-item`, `legend-swatch`,
10990
+ `reset-zoom-button`, `description`, `data-table`, `center`, `error` (`role="alert"` message
10991
+ rendered in place of `canvas` when the optional `chart.js` peer dependency fails to load — see
10992
+ `llms/components/lr-chart.md`).
10767
10993
 
10768
10994
  **Themeable custom properties:** `--lr-chart-height`, `--lr-chart-grid-color`,
10769
10995
  `--lr-chart-tick-color`, `--lr-chart-legend-color`, `--lr-chart-tooltip-bg`,
@@ -10790,9 +11016,9 @@ same set, so one rule retunes them together.
10790
11016
  - `type` truly is locked per subclass: `<lr-pie-chart type="bar">` or `el.type = 'bar'` at runtime
10791
11017
  is a genuine no-op (the accessor's setter silently ignores the write), not a footgun like a plain
10792
11018
  overridden class-field default would be.
10793
- - `lr-bubble-chart` needs `Series.points` entries with an `x`/`y`/`r` triple, but `Series.points`
10794
- is typed as `{x, y, label?}[]` with no `r` field — cast the array through `as unknown as
10795
- Series['points']` (or a local `BubblePoint` type) when constructing bubble data.
11019
+ - `lr-bubble-chart` consumes the exported `ChartPoint` shape directly. Set `x`/`y`, optional `r`
11020
+ for bubble radius, and optional `label` for the point-level accessible/event/export label; no
11021
+ runtime cast is needed.
10796
11022
 
10797
11023
  ---
10798
11024
 
@@ -10820,16 +11046,20 @@ Bins `values` into `bins` equal-width buckets and renders as a bar chart (extend
10820
11046
  (`accessible-label`), `accessibleDescription` (`accessible-description`), `showDataTable`
10821
11047
  (`show-data-table`), `chartArea` (readonly).
10822
11048
 
10823
- **Methods:** `resetZoom()`, `refreshTheme()` — both inherited.
11049
+ **Methods:** `resetZoom()`, `refreshTheme()` — both inherited; plus
11050
+ `appendData(_label, values, maxPoints?)`, which appends finite raw samples to `values` and
11051
+ optionally retains only the newest `maxPoints`. The label argument is ignored because bucket
11052
+ labels are regenerated from the rebinned sample range.
10824
11053
 
10825
11054
  **Events:** `lr-zoom`, `lr-point-click` — inherited; `lr-point-click`'s `index` is the bucket index
10826
11055
  and `label` the generated bucket range string (`"lo–hi"`, both bounds at one decimal place).
10827
11056
 
10828
11057
  **Slots:** `data-table`, `center`.
10829
11058
 
10830
- **CSS parts:** `base`, `canvas`, `reset-zoom-button`, `description`, `data-table`, `center`,
10831
- `error` (`role="alert"` message rendered in place of `canvas` when the optional `chart.js` peer
10832
- dependency fails to load inherited from `LyraChart`, unaffected by the binning logic).
11059
+ **CSS parts:** `base`, `plot`, `canvas`, `legend`, `legend-item`, `legend-swatch`,
11060
+ `reset-zoom-button`, `description`, `data-table`, `center`, `error` (`role="alert"` message
11061
+ rendered in place of `canvas` when the optional `chart.js` peer dependency fails to load —
11062
+ inherited from `LyraChart`, unaffected by the binning logic).
10833
11063
 
10834
11064
  **Themeable custom properties:** `--lr-chart-height`, `--lr-chart-grid-color`,
10835
11065
  `--lr-chart-tick-color`, `--lr-chart-legend-color`, `--lr-chart-tooltip-bg`,
@@ -10855,6 +11085,9 @@ their semantics, defaults, and gotchas.
10855
11085
  property write from requesting an unbounded bucket array.
10856
11086
  - non-finite samples in `values` are dropped before bucketing rather than corrupting bucket-index
10857
11087
  math; constant data (every sample equal) lands wholly in the **first** bucket, not the last.
11088
+ - `values`/`bins`/`label` changes join the inherited connected-and-visible redraw path. There is no
11089
+ second post-update refresh, so a same-tick disconnect cannot recreate Chart.js on a detached
11090
+ canvas and off-screen sample updates do not repaint it.
10858
11091
 
10859
11092
  ---
10860
11093
 
@@ -10867,7 +11100,8 @@ browser). Does **not** extend `LyraChart` — a deliberately bespoke API.
10867
11100
  - `labels: string[] = []` (attribute: false)
10868
11101
  - `boxes: BoxPlotSeries[] = []` (attribute: false) — `BoxPlotSeries { label: string; data:
10869
11102
  BoxPlotPoint[]; color?: string }`, `BoxPlotPoint { min, q1, median, q3, max }`
10870
- - `legend: boolean = false`
11103
+ - `legend: boolean = false` — renders a wrapping DOM legend whose buttons toggle box-series
11104
+ visibility without clipping long labels.
10871
11105
  - `height: string = '280px'`
10872
11106
  - `yLabel: string = ''` (attribute `y-label`)
10873
11107
  - `beginAtZero: boolean = true` (attribute `begin-at-zero`)
@@ -10877,13 +11111,16 @@ browser). Does **not** extend `LyraChart` — a deliberately bespoke API.
10877
11111
  localized five-number summary
10878
11112
  - `showDataTable: boolean = false` (attribute `show-data-table`) — reveals the accessible data table
10879
11113
 
10880
- **Methods:** `refreshTheme()` re-reads canvas theme custom properties after an ancestor theme change.
11114
+ **Methods:** `refreshTheme()` re-reads canvas theme custom properties after an ancestor theme
11115
+ change. Canvas work remains connected/visible-gated, while a rendered DOM legend also refreshes
11116
+ its computed color swatches.
10881
11117
 
10882
11118
  **Events:** none.
10883
11119
 
10884
11120
  **Slots:** `data-table` — an optional consumer-provided accessible table alternative.
10885
11121
 
10886
- **CSS parts:** `base`, `canvas`, `description`, `data-table`, `error` (`role="alert"` message shown
11122
+ **CSS parts:** `base`, `plot` (the fixed-height canvas region), `canvas`, `legend`,
11123
+ `legend-item`, `legend-swatch`, `description`, `data-table`, `error` (`role="alert"` message shown
10887
11124
  instead of `canvas` when the optional box-plot peer fails to load)
10888
11125
 
10889
11126
  **Themeable custom properties:** `--lr-chart-height`, `--lr-chart-grid-color`,
@@ -10908,8 +11145,12 @@ through the same cached `chart-loader.ts` used by `lr-chart`.
10908
11145
  - no raw `config` passthrough — limited to the properties above; can't reach the underlying
10909
11146
  controller's own options (`itemRadius`, `outlierRadius`, `coef`).
10910
11147
  - Chart.js receives `effectiveLocale`; generated numeric summaries use it, the y axis moves to
10911
- logical start in RTL, canvas tooltip/axis colors are token-driven, and animation is disabled
10912
- under reduced motion.
11148
+ logical start in RTL, and live ancestor `lang`/`dir` changes redraw the already-mounted canvas
11149
+ without requiring another box property write. Canvas tooltip/axis colors are token-driven, and
11150
+ animation is disabled under reduced motion.
11151
+ - `--lr-chart-height` fixes the `plot` height and the host's minimum height, not the complete host.
11152
+ A visible or slotted table and the wrapping legend remain in normal document flow, grow the
11153
+ component, and cannot overlap following content; oversized tables scroll inside the host.
10913
11154
  - If `@sgratzl/chartjs-chart-boxplot` fails to load, the component warns to the console and
10914
11155
  fails closed with a localized `role="alert"` error part rather than leaving a blank canvas.
10915
11156
 
@@ -10919,10 +11160,13 @@ through the same cached `chart-loader.ts` used by `lr-chart`.
10919
11160
 
10920
11161
  `lr-lite-chart` and `lr-chart` expose additive imperative helpers for live dashboards:
10921
11162
  `appendData(label, values, maxPoints?)` appends one aligned category and optionally trims the oldest
10922
- points. `lr-lite-chart.exportData('csv' | 'svg')` returns a spreadsheet-safe CSV snapshot or the
10923
- current SVG markup. `lr-chart.exportData('csv' | 'png')` returns a CSV snapshot or Chart.js's current
10924
- PNG data URL when the optional peer is loaded. These helpers do not download files; compose them
10925
- with `lr-export-button` so the host owns filenames and download policy.
11163
+ points. `lr-histogram` retains the same method signature but treats `values` as finite raw samples,
11164
+ ignores the category label, rebins the complete retained sample window, and applies `maxPoints` to
11165
+ that raw history. `lr-lite-chart.exportData('csv' | 'svg')` returns a spreadsheet-safe CSV snapshot
11166
+ or the current SVG markup. `lr-chart.exportData('csv' | 'png')` returns a CSV snapshot or Chart.js's
11167
+ current PNG data URL when the optional peer is loaded; point datasets expand x/y and optional
11168
+ radius/point-label columns. These helpers do not download files; compose them with
11169
+ `lr-export-button` so the host owns filenames and download policy.
10926
11170
 
10927
11171
  # Document & file viewers (`components/viewers/`)
10928
11172
 
@@ -10980,13 +11224,15 @@ image path — and the generic fallback simply omits `[part="download-link"]` en
10980
11224
  `status="error"`.
10981
11225
  - `maxHeight: string = ''` (attribute `max-height`) — a CSS length (e.g. `"24rem"`); once set,
10982
11226
  `[part="body"]` scrolls internally past this height instead of growing the page — same contract as
10983
- `lr-json-viewer`'s identically-named prop.
11227
+ `lr-json-viewer`'s identically-named prop. Invalid CSS `max-height` values, declaration breaks,
11228
+ and `url()` are ignored, leaving the stylesheet token in control.
10984
11229
  - `zoomable: boolean = false` (reflected) — wraps the rendered image (image format only) in an
10985
11230
  internal `<lr-zoomable-frame>`. `false` (the default) preserves the exact pre-`zoomable` DOM — an
10986
11231
  inline thumbnail (e.g. in a chat stream) must not unexpectedly grow a focusable zoom-chrome
10987
11232
  viewport; an inspection surface opts in.
10988
11233
  - `highlights: LyraHighlight[] = []` (attribute: false) — display-only `region` highlights painted
10989
- over the image-format preview; ignored for the `text`/`generic` formats.
11234
+ over the image-format preview; ignored for the `text`/`generic` formats. A rectangle renders only
11235
+ when `x`/`y`/`width`/`height` are finite numbers and both dimensions are nonnegative.
10990
11236
  - `activeHighlightId: string | null = null` (attribute `active-highlight-id`) — the `highlights`
10991
11237
  entry, if any, currently treated as active (`data-active` on its `region-highlight`).
10992
11238
  - `anchorKinds` is a readonly `['region']` (this viewer's supported `LyraAnchor.kind` values for the
@@ -11123,8 +11369,10 @@ type. First-party invention.
11123
11369
  - `mimeType: string = ''` (attribute `mime-type`) — MIME type used for exact renderer dispatch.
11124
11370
  - `src: string = ''` — source URL passed to the selected renderer or the fallback preview.
11125
11371
  - `registry?: DocumentRendererRegistry` (attribute: false) — optional per-instance registry override;
11126
- the module-level registry is used when unset.
11127
- - `alt: string = ''` media alt text forwarded to the resolved renderer, for image-like renderers.
11372
+ the module-level registry is used when unset. A throwing consumer matcher or renderer is
11373
+ contained as the localized error state rather than escaping the update.
11374
+ - `alt?: string` — media alt text forwarded to the resolved renderer, for image-like renderers.
11375
+ Unset lets the renderer derive its fallback; an explicit `''` preserves decorative media.
11128
11376
  - `anchor: LyraAnchor | string | null = null` (attribute: false) — declarative scroll-to-anchor
11129
11377
  target forwarded to the resolved renderer; a string is a highlight id in `highlights`.
11130
11378
  `hasChanged: () => true`, so re-assigning the same value (e.g. re-clicking the same citation
@@ -11147,6 +11395,7 @@ type. First-party invention.
11147
11395
  (a highlight id) counts as supported by any renderer declaring at least one anchor kind.
11148
11396
 
11149
11397
  **CSS parts:** `body` — wrapper around the active renderer, loading/error state, or fallback preview;
11398
+ it renders explicit `aria-busy="true"|"false"`, and the loading text itself owns `role="status"`;
11150
11399
  `download-link` — the native download action, rendered when `src` passes Lyra's safe-link policy.
11151
11400
 
11152
11401
  **Themeable custom properties:** `--lr-document-viewer-max-height` (default `70vh`) — maximum block
@@ -11185,6 +11434,9 @@ registerDocumentRenderer('application/x-example', {
11185
11434
  When no renderer matches, the viewer renders `<lr-document-preview>`, which handles text and images
11186
11435
  inline and provides a safe generic fallback for other formats.
11187
11436
 
11437
+ If a consumer matcher/renderer throws while an anchor is pending, the viewer renders a localized
11438
+ `role="alert"` and emits exactly one `lr-anchor-result` with `{ found: false }`.
11439
+
11188
11440
  ## `lr-docx-viewer`
11189
11441
 
11190
11442
  Fetches a `.docx` Word document as an `ArrayBuffer`, converts it to semantic HTML with the optional
@@ -11196,10 +11448,13 @@ hatch: if `dompurify` is unavailable, rendering is blocked even when Mammoth con
11196
11448
  Every rendered heading's slug (the same GitHub-slugger-style algorithm `<lr-markdown>` uses) is
11197
11449
  stamped as its `id` and cached into `getHeadingTree()`'s document-ordered outline. Adopts
11198
11450
  `DocumentAnchorTarget`: `fragment` anchors resolve against that outline, `text-quote` anchors via
11199
- the shared quote-scoping helpers; `highlights` re-resolve by quote after every render.
11451
+ the shared quote-scoping helpers; `highlights` re-resolve by quote after every render. Native
11452
+ keyboard actions are exposed only for highlights whose quote resolves in the currently loaded
11453
+ document; unresolved highlights and idle/loading/error states never expose an enabled no-op.
11200
11454
 
11201
11455
  **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. `maxHeight` caps
11202
- the scrollable document body. `anchorKinds` is a readonly `['fragment', 'text-quote']` (this
11456
+ the scrollable document body; invalid CSS `max-height` values, declaration breaks, and `url()` are
11457
+ ignored. `anchorKinds` is a readonly `['fragment', 'text-quote']` (this
11203
11458
  viewer's supported `LyraAnchor.kind` values for the shared anchor-target contract).
11204
11459
 
11205
11460
  **Methods:** `getHeadingTree()` returns the document-ordered outline as `DocxHeadingItem[]` (`{ id,
@@ -11212,14 +11467,17 @@ painted marks.
11212
11467
  **Events:** `lr-render-error` with `detail.error` when fetching, conversion, sanitization, or a
11213
11468
  non-fatal Mammoth conversion message occurs. `lr-search-change` (`detail: { query, matchCount,
11214
11469
  activeIndex }`) — from `search()`/`searchNext()`/`searchPrevious()`/`clearSearch()`.
11215
- `lr-highlight-activate` (`detail: { id }`) — a painted `text-quote` highlight was clicked.
11470
+ `lr-highlight-activate` (`detail: { id }`) — a painted `text-quote` highlight was clicked or its
11471
+ resolved keyboard action was activated.
11216
11472
  `lr-text-select` (`detail: { text, anchor, rects }`) — fired on selection end inside the rendered
11217
11473
  content. `lr-anchor-result` (`detail: { found }`) — fired after an `anchor` assignment or a
11218
11474
  `scrollToAnchor()` call.
11219
11475
 
11220
11476
  **CSS parts:** `base`, `body`, `content`, `spinner`, `error`, `highlight` (a painted `text-quote`
11221
- highlight), `search-match` (a painted in-document search match), and `search-match-active` (the
11222
- currently active search match, also carries `search-match`).
11477
+ highlight), `highlight-actions` (keyboard-accessible actions for resolved highlights),
11478
+ `highlight-action` (one native highlight activation button), `search-match` (a painted in-document
11479
+ search match), and `search-match-active` (the currently active search match, also carries
11480
+ `search-match`).
11223
11481
 
11224
11482
  **Themeable custom properties:** `--lr-docx-viewer-max-height` (default `none`) — maximum block size
11225
11483
  of `[part="body"]`; also settable via the `max-height` property, which writes this token inline.
@@ -11262,8 +11520,9 @@ downloading, or object-URL'ing them is the host's job (e.g.
11262
11520
  Remote resources are capped at 25 MB; exceeding it surfaces the localized
11263
11521
  `documentPreviewResourceTooLarge` message instead of the message.
11264
11522
 
11265
- **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. `foldQuotes:
11266
- boolean = false` (attribute `fold-quotes`) collapses trailing quoted-reply text/HTML behind a
11523
+ **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings; invalid CSS
11524
+ `max-height` values, declaration breaks, and `url()` are ignored. `foldQuotes: boolean = false`
11525
+ (attribute `fold-quotes`) — collapses trailing quoted-reply text/HTML behind a
11267
11526
  localized show/hide toggle. `false` (the default) preserves the full body rendering. A host
11268
11527
  `aria-label` takes precedence over `name`. `highlights`, `activeHighlightId`, `anchor`, and
11269
11528
  `anchorKinds` (`['text-quote', 'fragment']`) provide the shared text-viewer contract.
@@ -11299,8 +11558,9 @@ matching `.eml` filenames in `<lr-document-viewer>`. Fail-closed behavior is exp
11299
11558
  Fetches and parses `.ics` calendars with the optional `ical.js` peer and renders each VEVENT as
11300
11559
  plain text, including its title, start/end time, location, and description. No HTML is injected.
11301
11560
 
11302
- **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. A host
11303
- `aria-label` takes precedence over `name`. `highlights`, `activeHighlightId`, `anchor`, and
11561
+ **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings; invalid CSS
11562
+ `max-height` values, declaration breaks, and `url()` are ignored. A host `aria-label` takes
11563
+ precedence over `name`. `highlights`, `activeHighlightId`, `anchor`, and
11304
11564
  `anchorKinds` (`['text-quote', 'fragment']`) provide the shared text-viewer contract.
11305
11565
 
11306
11566
  **Methods:** `search(query)`, `searchNext()`, `searchPrevious()`, `clearSearch()`, and
@@ -11333,19 +11593,34 @@ fully decompressing only the rare entry missing that header field. The list comp
11333
11593
  contract: `highlights`, `activeHighlightId`, `anchor`, and `anchorKinds` (`['text-quote', 'fragment']`).
11334
11594
 
11335
11595
  **Methods:** `search(query)`, `searchNext()`, `searchPrevious()`, and `clearSearch()` provide
11336
- case-insensitive text search over rendered entry names; `scrollToAnchor()` resolves text-quote and
11337
- fragment anchors and emits `lr-anchor-result`.
11596
+ case-insensitive text search over every loaded entry path; next/previous wrap and scroll the active
11597
+ virtualized row into view. `scrollToAnchor()` resolves text-quote and fragment anchors and emits
11598
+ `lr-anchor-result`. A fragment id is the exact ZIP entry path. A text quote resolves within one
11599
+ complete entry path; both forms first mount the absolute virtualized row and only then perform the
11600
+ shared DOM-level anchor resolution.
11338
11601
 
11339
- **Events:** `lr-render-error` with `detail.error` when fetching or parsing fails.
11602
+ **Events:** `lr-render-error` with `detail.error` when fetching or parsing fails;
11603
+ `lr-search-change` (`detail: { query, matchCount, activeIndex }`) from search, navigation, and
11604
+ clear; `lr-text-select` (`detail: { text, anchor, rects }`) for a selection contained within one
11605
+ entry path; and `lr-anchor-result` (`detail: { found }`) after anchor resolution.
11340
11606
 
11341
11607
  **CSS parts:** `base`, `body`, `entry`, `entry-icon`, `entry-name`, `entry-name-dir`, `entry-size`,
11342
- `spinner`, and `error`. A directory row's name element carries both `entry-name` and
11608
+ `highlight` (the `<mark>` fallback for a painted entry-path quote), `spinner`, and `error`. A
11609
+ directory row's name element carries both `entry-name` and
11343
11610
  `entry-name-dir` (a part list), so `::part(entry-name-dir)` selects only directory names while
11344
11611
  `::part(entry-name)` still selects every name. Entry rows are rendered into the embedded
11345
11612
  `<lr-virtual-list>`'s own shadow root and forwarded with `exportparts`, so
11346
11613
  `lr-archive-viewer::part(entry)` (and every other row part above) reaches them from a consuming
11347
11614
  stylesheet.
11348
11615
 
11616
+ **Themeable custom properties:** `--lr-archive-viewer-highlight-accent-background`,
11617
+ `--lr-archive-viewer-highlight-success-background`,
11618
+ `--lr-archive-viewer-highlight-warning-background`,
11619
+ `--lr-archive-viewer-highlight-danger-background`, and
11620
+ `--lr-archive-viewer-highlight-neutral-background` control tone backgrounds.
11621
+ `--lr-archive-viewer-highlight-active-background` and
11622
+ `--lr-archive-viewer-highlight-active-outline` control the active quote.
11623
+
11349
11624
  **Exports:** `ArchiveEntry` — `{ name: string; dir: boolean; size: number }`.
11350
11625
 
11351
11626
  **Optional peer dependency:** install `jszip` with `pnpm add jszip`. The lazy registry registers
@@ -11371,8 +11646,9 @@ the reading region's accessible name. `location: string = ''` (not reflected —
11371
11646
  a CFI or spine href identifying the current reading position: set before the book finishes
11372
11647
  loading it's recorded and applied once ready, set after it applies immediately, and epub.js's own
11373
11648
  `relocated` event keeps it in sync with user navigation without re-triggering its own `display()`
11374
- call. `anchorKinds` is a readonly `['cfi', 'text-quote']` (this viewer's supported `LyraAnchor.kind`
11375
- values for the shared anchor-target contract).
11649
+ call. A controlled `location` assignment made synchronously inside `lr-location-change` wins over
11650
+ the peer-reported CFI and is displayed. `anchorKinds` is a readonly `['cfi', 'text-quote']` (this
11651
+ viewer's supported `LyraAnchor.kind` values for the shared anchor-target contract).
11376
11652
 
11377
11653
  **Methods:** `getToc()` resolves the EPUB's own navigation document (`book.navigation.toc`,
11378
11654
  populated once `book.ready` resolves) flattened into document-ordered `EbookTocItem[]` (`{ id,
@@ -11380,16 +11656,20 @@ label, href, level }`, `level` starting at 1 for a top-level entry, `id` falling
11380
11656
  when a navigation entry has none), `[]` before a book has loaded. `search(query)` resolves the
11381
11657
  match count across every spine section, in document order, via epub.js's own `item.load()`/
11382
11658
  `item.find()`/`item.unload()` (empty/whitespace query behaves like `clearSearch()`; a newer
11383
- `search()` call or a `src` change aborts an in-flight scan); `searchNext()`/`searchPrevious()`
11659
+ `search()` call or a `src` change aborts an in-flight scan; peer output is capped at 10,000
11660
+ matches); `searchNext()`/`searchPrevious()`
11384
11661
  advance/step back through matches (wrapping, resolving `false` when there are none); `clearSearch()`
11385
11662
  clears the query, matches, and painted search annotation.
11386
11663
 
11387
11664
  **Events:** `lr-render-error` with `detail.error` when fetching, opening, or rendering fails;
11388
11665
  `lr-location-change` (`detail: { cfi, href }`) fired from epub.js's own `relocated` event;
11389
11666
  `lr-search-change` (`detail: { query, matchCount, activeIndex }`) from `search()`/`searchNext()`/
11390
- `searchPrevious()`/`clearSearch()`.
11667
+ `searchPrevious()`/`clearSearch()`; `lr-anchor-result` (`detail: { found }`) after an anchor is
11668
+ applied; `lr-highlight-activate` (`detail: { id }`) when a painted CFI highlight is clicked; and
11669
+ `lr-text-select` (`detail: { text, anchor, rects }`) after selection inside a chapter iframe.
11391
11670
 
11392
- **CSS parts:** `base`, `toolbar`, `previous-button`, `next-button`, `previous-icon`, `next-icon`,
11671
+ **CSS parts:** `base` (explicit `aria-busy="true"|"false"`; loading text owns `role="status"`),
11672
+ `toolbar`, `previous-button`, `next-button`, `previous-icon`, `next-icon`,
11393
11673
  `mount`, `error`, and `announcer` (the visually-hidden `role="status"` region search results
11394
11674
  announce through).
11395
11675
 
@@ -11399,7 +11679,8 @@ unambiguous beside other previous/next controls and are overridable through `.st
11399
11679
 
11400
11680
  **Optional peer dependency:** install `epubjs` with `pnpm add epubjs`. The document-viewer registry
11401
11681
  matches `application/epub+zip` and `.epub` filenames, declaring `{ anchors: ['cfi', 'text-quote'],
11402
- search: true, textSelect: true }` capabilities.
11682
+ search: true, textSelect: true }` capabilities and forwarding `anchor`/`highlights` to the mounted
11683
+ viewer. The peer loader requires the callable EPUB factory; malformed module shapes fail closed.
11403
11684
 
11404
11685
  Remote resources are capped at 25 MB; exceeding it surfaces the localized
11405
11686
  `documentPreviewResourceTooLarge` message instead of the ebook.
@@ -11413,6 +11694,10 @@ same reason. `highlights` (kind `cfi`) paint via `rendition.annotations.highligh
11413
11694
  re-applied whenever the rendition is recreated (a `src` change, or a reconnect remount), since
11414
11695
  epub.js doesn't persist annotations across a fresh `renderTo()`.
11415
11696
 
11697
+ Rejected or synchronous failures from display, previous/next navigation, search annotation, or
11698
+ anchor application enter the localized error state and emit `lr-render-error`. Anchor failures
11699
+ emit one `{ found: false }`, and superseded async anchor/search work cannot mutate the current book.
11700
+
11416
11701
  ## `lr-pptx-viewer`
11417
11702
 
11418
11703
  Best-effort client-side PPTX viewer backed by the optional `@aiden0z/pptx-renderer` peer. A
@@ -11455,7 +11740,8 @@ here — a sanitized SVG document has neither pages nor extractable text to quot
11455
11740
  its registry entry declares `capabilities: { anchors: ['region'], search: false, textSelect: false }`.
11456
11741
 
11457
11742
  **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. `maxHeight` caps
11458
- the scrollable body. `zoomable: boolean = false` (reflected) wraps the rendered content in an
11743
+ the scrollable body; invalid CSS `max-height` values, declaration breaks, and `url()` are ignored.
11744
+ `zoomable: boolean = false` (reflected) — wraps the rendered content in an
11459
11745
  internal `<lr-zoomable-frame>`. `false` (the default) preserves the exact pre-`zoomable` DOM — an
11460
11746
  inline thumbnail (e.g. in a chat stream) must not unexpectedly grow a focusable zoom-chrome viewport;
11461
11747
  an inspection surface opts in. `anchor: LyraAnchor | string | null = null` (attribute: false) —
@@ -11463,7 +11749,9 @@ declaratively jump to an anchor (a `LyraAnchor` object, or a `highlights` entry'
11463
11749
  calls `scrollToAnchor()` and fires `lr-anchor-result`; re-assigning the same value re-triggers the
11464
11750
  scroll, it is not reference-gated. `highlights: LyraHighlight[] = []` (attribute: false) —
11465
11751
  display-only `region` highlights painted over the rendered SVG; unchanged behavior, now inherited
11466
- from `DocumentAnchorTarget` rather than declared locally. `activeHighlightId: string | null = null`
11752
+ from `DocumentAnchorTarget` rather than declared locally. A region rectangle renders/resolves only
11753
+ when `x`/`y`/`width`/`height` are finite numbers and both dimensions are nonnegative.
11754
+ `activeHighlightId: string | null = null`
11467
11755
  (attribute `active-highlight-id`) — the `highlights` entry, if any, currently treated as active
11468
11756
  (`data-active` on its `region-highlight`). `anchorKinds` is a readonly `['region']` (this viewer's
11469
11757
  supported `LyraAnchor.kind` values for the shared anchor-target contract).
@@ -11515,8 +11803,9 @@ Remote resources are capped at 25 MB; exceeding it surfaces the localized
11515
11803
  Fetches an HTML document, sanitizes it with the optional `dompurify` peer, and renders the safe markup
11516
11804
  inside a bounded, scrollable body.
11517
11805
 
11518
- **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. A host
11519
- `aria-label` takes precedence over `name`. `highlights`, `activeHighlightId`, `anchor`, and
11806
+ **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings; invalid CSS
11807
+ `max-height` values, declaration breaks, and `url()` are ignored. A host `aria-label` takes
11808
+ precedence over `name`. `highlights`, `activeHighlightId`, `anchor`, and
11520
11809
  `anchorKinds` (`['text-quote', 'fragment']`) provide the shared text-viewer contract.
11521
11810
 
11522
11811
  **Methods:** `search(query)`, `searchNext()`, `searchPrevious()`, `clearSearch()`, and
@@ -11550,9 +11839,10 @@ is never part of the virtualized body); `scrollToAnchor()` scrolls the addressed
11550
11839
  the virtualized list's `active-id`. `highlights` paint as a `part="cell-highlight"` cell wrapping a
11551
11840
  focusable `part="cell-highlight-action"` native button, keeping the ARIA table tree intact.
11552
11841
 
11553
- **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. `anchorKinds` is
11554
- a readonly `['cell-range']` (this viewer's supported `LyraAnchor.kind` values for the shared
11555
- anchor-target contract).
11842
+ **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings; invalid CSS
11843
+ `max-height` values, declaration breaks, and `url()` are ignored. `anchorKinds` is a readonly
11844
+ `['cell-range']` (this viewer's supported `LyraAnchor.kind` values for the shared anchor-target
11845
+ contract).
11556
11846
 
11557
11847
  **Methods:** `search(query)` resolves the match count via a case-insensitive substring search over
11558
11848
  every body cell's raw string value, ordered row then column (empty/whitespace query behaves like
@@ -11599,8 +11889,9 @@ label when `FN` is absent).
11599
11889
  Remote resources are capped at 25 MB; exceeding it surfaces the localized
11600
11890
  `documentPreviewResourceTooLarge` message instead of the contacts.
11601
11891
 
11602
- **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. A host
11603
- `aria-label` takes precedence over `name`. `highlights`, `activeHighlightId`, `anchor`, and
11892
+ **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings; invalid CSS
11893
+ `max-height` values, declaration breaks, and `url()` are ignored. A host `aria-label` takes
11894
+ precedence over `name`. `highlights`, `activeHighlightId`, `anchor`, and
11604
11895
  `anchorKinds` (`['text-quote', 'fragment']`) provide the shared text-viewer contract.
11605
11896
 
11606
11897
  **Methods:** `search(query)`, `searchNext()`, `searchPrevious()`, `clearSearch()`, and
@@ -11634,9 +11925,12 @@ to tell that apart from a genuine activation click.
11634
11925
  **Properties:** `src` and `name` are strings. `page: number = 1` is the one-based current page and
11635
11926
  `zoom: number = 1` is clamped to `0.25`–`4`. `maxHeight: string = ''` (attribute `max-height`) is a
11636
11927
  CSS length that, once set, overrides `--lr-pdf-viewer-height` — the block size of the virtualized
11637
- page list — declaratively, writing it inline on `[part="base"]`. `anchorKinds` is a readonly
11928
+ page list — declaratively, writing it inline on `[part="base"]`; invalid CSS `max-height` values,
11929
+ declaration breaks, and `url()` are ignored. `anchorKinds` is a readonly
11638
11930
  `['page', 'text-quote', 'region']` (this viewer's supported `LyraAnchor.kind` values for the shared
11639
- anchor-target contract).
11931
+ anchor-target contract). Page and page-addressed region anchors require an in-range integer page
11932
+ and are rejected rather than clamped; region rectangles also require finite coordinates and
11933
+ nonnegative dimensions.
11640
11934
 
11641
11935
  **Events:**
11642
11936
  - `lr-render-error` — `detail: { error }` — fetching, parsing, or rendering (page canvas or text
@@ -11663,7 +11957,8 @@ of one page (per-page LRU-cached, 64 pages), rejecting on no loaded document or
11663
11957
  `options.width` CSS px (default 96), devicePixelRatio-aware, resolving `false` when not ready or out
11664
11958
  of range. `goToPage(page)` scrolls the virtualized list to `page`, resolving `true` once mounted (or
11665
11959
  `false` for an out-of-range value, without changing `page`). `getOutline()` resolves the document's
11666
- table of contents as `PdfOutlineItem[]` (`{ title, page?, children? }`), `[]` when there is none.
11960
+ table of contents as `PdfOutlineItem[]` (`{ title, page?, children? }`), `[]` when there is none;
11961
+ peer output is capped at 10,000 unique items and 100 levels, with cycles ignored.
11667
11962
  `search(query)` resolves the match count across all pages (empty/whitespace query behaves like
11668
11963
  `clearSearch()`); `searchNext()` and `searchPrevious()` advance/step back through matches (wrapping,
11669
11964
  resolving `false` when there are none); `clearSearch()` clears the query, matches, and painted marks.
@@ -11703,6 +11998,9 @@ rendering without it.
11703
11998
  Remote resources are capped at 25 MB; exceeding it surfaces the localized
11704
11999
  `documentPreviewResourceTooLarge` message instead of the PDF.
11705
12000
 
12001
+ Anchor navigation is generation-guarded: a newer anchor, document replacement, or disconnect
12002
+ prevents stale page/text/region work from scrolling or reporting success.
12003
+
11706
12004
  ## `lr-spreadsheet-viewer`
11707
12005
 
11708
12006
  Fetches and renders `.xlsx` and `.xls` workbooks with the optional `xlsx` (SheetJS) peer. Multiple
@@ -11762,9 +12060,9 @@ row/column into view via the virtualized list's `active-id`. `highlights` paint
11762
12060
  **Properties:** `src` and `name` are strings. `hasHeaderRow: boolean = true` (attribute
11763
12061
  `has-header-row`) controls whether the first parsed row is rendered as a sticky header.
11764
12062
  `maxHeight: string = ''` (attribute `max-height`) is a CSS length that caps the scrollable body —
11765
- setting it writes `--lr-csv-viewer-max-height` inline on `[part="base"]`. `anchorKinds` is a
11766
- readonly `['cell-range']` (this viewer's supported `LyraAnchor.kind` values for the shared
11767
- anchor-target contract).
12063
+ setting it writes `--lr-csv-viewer-max-height` inline on `[part="base"]`; invalid CSS `max-height`
12064
+ values, declaration breaks, and `url()` are ignored. `anchorKinds` is a readonly `['cell-range']`
12065
+ (this viewer's supported `LyraAnchor.kind` values for the shared anchor-target contract).
11768
12066
 
11769
12067
  **Methods:** `search(query)` resolves the match count via a case-insensitive substring match over
11770
12068
  the same stringified cell values `cell()` renders, ordered row then column (empty/whitespace query
@@ -11814,8 +12112,8 @@ raw injection option is omitted, not shipped as a no-op).
11814
12112
 
11815
12113
  A bare primitive: no label/hint/error chrome, no implicit role, no computed accessible name, and no
11816
12114
  `aria-live` wrapper (the fragment can carry its own landmarks; wrapping the host would re-announce
11817
- all of it on every load). `aria-busy="true"` is set on the host while a fetch is in flight and
11818
- removed once it settles either way. Build error UI from `lr-include-error`.
12115
+ all of it on every load). The host always carries explicit `aria-busy="true"|"false"`: true only
12116
+ while a fetch is in flight. Build error UI from `lr-include-error`.
11819
12117
 
11820
12118
  **Properties:**
11821
12119
  - `src: string = ''` (reflected) — URL of the fragment, validated through the shared `safeFetchUrl()`
@@ -11830,7 +12128,8 @@ removed once it settles either way. Build error UI from `lr-include-error`.
11830
12128
  The shared text-viewer contract is also available for the sanitized light-DOM fragment:
11831
12129
  `highlights`, `activeHighlightId`, `anchor`, and `anchorKinds` (`['text-quote', 'fragment']`).
11832
12130
  `search(query)`, `searchNext()`, `searchPrevious()`, `clearSearch()`, and `scrollToAnchor()`
11833
- operate on the included text.
12131
+ operate on the included text. A successful replacement explicitly recomputes any active search
12132
+ against the new fragment rather than leaving results from the previous content.
11834
12133
 
11835
12134
  **Events:**
11836
12135
  - `lr-load` — `detail: { src }` — the fragment was sanitized and written into the light DOM.
@@ -11860,7 +12159,8 @@ positioned ancestor.
11860
12159
 
11861
12160
  **Properties:** `items: HighlightLayerItem[] = []` (attribute: false), `activeId: string | null =
11862
12161
  null` (attribute `active-id`), and `interactive: boolean = true` (reflected) — gates click/keyboard
11863
- activation.
12162
+ activation. A rectangle is eligible only when `x`/`y`/`width`/`height` are finite numbers and both
12163
+ dimensions are nonnegative; invalid rectangles are omitted from paint, focus, and activation.
11864
12164
 
11865
12165
  **Methods:** `flash(id)` briefly re-triggers the flash styling for an already-rendered rect (e.g. a
11866
12166
  re-click of the same source citation).
@@ -11903,6 +12203,11 @@ truth.
11903
12203
  **Events:** `lr-page-select` — a page row was activated (click, or Enter/Space on a focused row).
11904
12204
  `detail: { page }`. In wired mode the rail also sets `viewer.page` itself.
11905
12205
 
12206
+ If `pageCount` shrinks past the currently focused row, focus moves to the absolute last remaining
12207
+ page instead of using the rendered window's local index or being lost with the virtualized row.
12208
+ Rapid consecutive shrinks supersede an in-flight repair, so focus lands on the latest count. The
12209
+ numeric type-ahead buffer is cleared on detach.
12210
+
11906
12211
  **CSS parts:** `base` (the rail), `pages` (the embedded `<lr-virtual-list>`), `page` (one page
11907
12212
  button), `page-current` (the button for the current `page`), `thumbnail` (the thumbnail canvas
11908
12213
  wrapper), `page-number` (the visible page number), `heat` (the heat-marker cluster), `heat-dot` (one
@@ -11944,9 +12249,10 @@ JSON text; wins over `src` and is parsed (and validated) synchronously. `name: s
11944
12249
  accessible label, and matched against a `fragment` anchor's cell id. `outputCollapseLines: number =
11945
12250
  40` (attribute `output-collapse-lines`) — a plain-text output longer than this many lines renders
11946
12251
  collapsed behind a toggle; `0` disables collapsing. `maxHeight: string = ''` (attribute
11947
- `max-height`) — once set, the notebook scrolls internally past this height. `anchorKinds` is a
11948
- readonly `['node-path', 'fragment']` (this viewer's supported `LyraAnchor.kind` values for the
11949
- shared anchor-target contract).
12252
+ `max-height`) — once set, the notebook scrolls internally past this height; invalid CSS
12253
+ `max-height` values, declaration breaks, and `url()` are ignored. `anchorKinds` is a readonly
12254
+ `['node-path', 'fragment']` (this viewer's supported `LyraAnchor.kind` values for the shared
12255
+ anchor-target contract).
11950
12256
 
11951
12257
  **Methods:** `search(query)` resolves the match count over cell sources and text outputs — a
11952
12258
  matching cell counts as one match (empty/whitespace query behaves like `clearSearch()`);
@@ -11998,6 +12304,9 @@ the element or on any ancestor.
11998
12304
  A notebook major version outside 4.0–4.5, an invalid shape, or more than 2,000 cells renders a
11999
12305
  localized error and fires `lr-render-error` instead of the notebook.
12000
12306
 
12307
+ PNG/JPEG outputs use their `text/plain` representation as alt text, falling back to a localized
12308
+ code-cell name. Sanitized SVG output is wrapped in a named `role="img"` with the same fallback.
12309
+
12001
12310
  ## `lr-xml-viewer`
12002
12311
 
12003
12312
  Collapsible, copyable, `DOMParser`-based tree view for XML documents, mirroring `lr-json-viewer`'s
@@ -12016,7 +12325,8 @@ boolean = false` (reflected) — shows copy-to-clipboard affordances, one for th
12016
12325
  one per element. `maxHeight: string = ''` (attribute `max-height`). `anchorKinds` is a readonly
12017
12326
  `['node-path']` (this viewer's supported `LyraAnchor.kind` values for the shared anchor-target
12018
12327
  contract) — each numeric path segment is the 0-based index within the parent's *element* children,
12019
- and an optional trailing string segment `'@attrName'` addresses one attribute.
12328
+ and an optional trailing string segment `'@attrName'` addresses one existing, nonempty-named
12329
+ attribute. Invalid CSS `max-height` values, declaration breaks, and `url()` are ignored.
12020
12330
 
12021
12331
  **Methods:** `search(query)` resolves the match count via a case-insensitive substring search over
12022
12332
  every element's tag name, attribute names/values, and own text (empty/whitespace query behaves like
@@ -12068,7 +12378,8 @@ await viewer.search(query);
12068
12378
  ```
12069
12379
 
12070
12380
  Node cap: 50,000 — exceeding it renders the localized `xmlViewerTooManyNodes` error instead of the
12071
- tree.
12381
+ tree. A collapsed element's child count includes element, text, comment, CDATA, and processing-
12382
+ instruction children rather than only element descendants.
12072
12383
 
12073
12384
  ## `lr-document-compare`
12074
12385
 
@@ -12128,17 +12439,24 @@ approximation weighting latitude span ~2x, with 40% padding), then hands the par
12128
12439
  `maplibre-gl` peer isn't installed, it falls back to a status line plus a `<lr-json-viewer
12129
12440
  collapsed-depth="2">` of the raw value instead of the map.
12130
12441
 
12442
+ The root owns the named `region` landmark while loading, in fallback/error/idle states, and while a
12443
+ lazy map initializes. After `lr-map-load`, landmark ownership transfers to the map canvas so there
12444
+ is exactly one named region. Serialized metadata is locally inline-scrollable, preventing long
12445
+ unbroken values from widening a 320px allocation.
12446
+
12131
12447
  **Properties:** `src: string = ''` — URL to fetch and parse. `name: string = ''` — accessible label,
12132
12448
  used as `<lr-map>`'s `label` and the root's `aria-label` (falling back to the localized
12133
12449
  `geojsonViewLabel` when unset). A host `aria-label` takes precedence over `name`. The shared
12134
12450
  text-viewer contract adds `highlights`, `activeHighlightId`, `anchor`, and
12135
12451
  `anchorKinds` (`['text-quote', 'fragment']`), plus `search()`, `searchNext()`, `searchPrevious()`,
12136
- `clearSearch()`, and `scrollToAnchor()` for rendered feature metadata and status text.
12452
+ `clearSearch()`, and `scrollToAnchor()` for the ordinary-DOM serialized feature metadata and status
12453
+ text, independent of whether the optional map peer is available.
12137
12454
 
12138
12455
  **Events:** `lr-render-error` — `detail: { error }` — fetch, parse, or shape-validation failure.
12139
12456
 
12140
12457
  **CSS parts:** `base` (the root container), `status` (the feature-count status line, `role="status"`,
12141
- shown only in the `<lr-map>` path), `missing-library` (the missing-`maplibre-gl` callout shown
12458
+ shown only in the `<lr-map>` path), `metadata` (selectable/searchable serialized GeoJSON `<pre>`,
12459
+ rendered in both map and fallback paths), `missing-library` (the missing-`maplibre-gl` callout shown
12142
12460
  alongside the `lr-json-viewer` fallback), `error` (the error region, `role="alert"`), `spinner`
12143
12461
  (the loading status region).
12144
12462
 
@@ -13144,7 +13462,9 @@ combination (`catalog` empty/unset, or `allowCustom` true) renders the free-text
13144
13462
  (`[part="combobox"]`/`[part="combobox-input"]`) with live substring filtering against the catalog (id or
13145
13463
  label, case-insensitive). The mode is re-evaluated on every render, so toggling `allowCustom` or clearing
13146
13464
  `catalog` at runtime switches modes live, repositioning the shared `[part="listbox"]` popover against
13147
- whichever element is the active anchor.
13465
+ whichever element is the active anchor. Replacing `catalog` while free-text mode remains open
13466
+ refilters suggestions without erasing the user's current draft; controlled `value` changes and
13467
+ actual mode switches still rebase the input to the committed value.
13148
13468
 
13149
13469
  A `value` that isn't present in `catalog` (e.g. a model id saved from a provider whose live catalog has
13150
13470
  since changed) is never silently dropped: it's appended to the rendered option list as a synthetic,
@@ -13159,6 +13479,8 @@ visually-distinct row (dashed border, italic label, "not in catalog" badge) comp
13159
13479
  - `change` (`Event`, no detail) — fired alongside `lr-change`, mirroring `<lr-select>`/
13160
13480
  `<lr-combobox>`'s native-style value-change pair so native form bindings/framework `v-model`
13161
13481
  handlers behave consistently across the picker family.
13482
+ - `input` (`Event`, no detail) — fired immediately before `change` alongside each committed
13483
+ `lr-change`, providing the same native-style value-event pair as `<lr-select>`/`<lr-combobox>`.
13162
13484
  - `blur` (no detail) — re-dispatched from the free-text mode's internal `<input>`'s own `blur`,
13163
13485
  bubbling and composed unlike the native event. Closed-dropdown mode's trigger `<button>` has no
13164
13486
  equivalent re-dispatch, matching `<lr-select>`'s own trigger.
@@ -13878,7 +14200,8 @@ rating opens the detail panel, and `disabled: boolean = false` (reflected) for a
13878
14200
  **Events:** `lr-change` — `detail: { value: 'up' | 'down' | null }`, fired when a thumb's rating
13879
14201
  changes or clears. `lr-submit` — `detail: { value: 'up' | 'down'; reasonIds: string[]; comment:
13880
14202
  string }`, fired by the panel's submit button (`value` is never `null` here — the panel only exists
13881
- for a set rating).
14203
+ for a set rating). The optional comment `<textarea>`'s native `focus` and `blur` are re-dispatched
14204
+ as bubbling, composed host events.
13882
14205
 
13883
14206
  **CSS parts:** `base` (the root), `thumbs` (wrapper around both thumb buttons), `up-button`,
13884
14207
  `down-button`, `panel` (the inline detail disclosure, only rendered when `reasons` is non-empty or
@@ -14615,7 +14938,11 @@ part to the built-in renderer; `label: string = ''`; `accessibleLabel: string |
14615
14938
  `MessagePartRenderer = (part: MessagePart, index: number) => unknown`; `MessagePart` and its
14616
14939
  discriminated part shapes come from the `@aceshooting/lyra-ui/ai` subpath.
14617
14940
 
14618
- **Events:** `lr-citation-select` (`{ citation }`), `lr-part-retry` (`{ part }`).
14941
+ **Events:** `lr-citation-select` (`{ citation }`), `lr-part-retry` (`{ part }`). Composed child
14942
+ events pass through unchanged: `lr-anchor-result`, `lr-citation-open`, `lr-copy`,
14943
+ `lr-highlight-activate`, `lr-link-click`, `lr-preview`, `lr-remove`, `lr-render-error`, `lr-retry`,
14944
+ `lr-search-change`, `lr-text-select`, `lr-toggle`, `lr-tool-call-chip-select`,
14945
+ `lr-tool-chip-select`, `lr-widget-action`, and `lr-widget-state-change`.
14619
14946
 
14620
14947
  **CSS parts:** `base`, `part`, `part-streaming`, `text`, `reasoning`, `tool-call`, `tool-result`,
14621
14948
  `citation`, `attachment`, `data`, `audio`, `audio-transcript`, `error`, `retry`.
@@ -14728,6 +15055,8 @@ Nonmodal, Escape-dismissible text-selection toolbar carrying selected text plus
14728
15055
  **Events:** `lr-selection-action` (`SelectionActionDetail = { action, text, anchor }`);
14729
15056
  `lr-dismiss` (Escape); `lr-copy-error` (`{ error }`). Copy uses the Clipboard API when available;
14730
15057
  the action event still reports the user intent if writing fails, alongside `lr-copy-error`.
15058
+ Detaching and later reinserting the same open instance re-establishes positioning and Escape
15059
+ ownership even when the detach lasts past an event-loop turn.
14731
15060
 
14732
15061
  **CSS parts:** `toolbar`, `action`, `action-ask`, `action-quote`, `action-cite`, `action-copy`.
14733
15062
 
@@ -15190,11 +15519,12 @@ shared overlay stack. First-party invention (no Web Awesome equivalent).
15190
15519
  - `ToolSelectDialogTool { id: string; name: string; description?: string; category?: string; icon?:
15191
15520
  string; disabled?: boolean; disabledReason?: string }` — one selectable agent tool. `category` groups
15192
15521
  the row into a heading; tools with no `category` (or an empty/whitespace-only one) fall into a
15193
- trailing "Other" bucket. `icon` is a literal glyph (e.g. an emoji) rendered next to `name` an opaque
15194
- string, not a registry lookup, the same convention `<lr-tool-call-chip>`'s `icon` uses. `disabled`
15195
- individually gates a tool regardless of `useDefaults`/`selected` (e.g. a tool requiring admin
15196
- approval); `disabledReason` is supporting text shown under a disabled row, ignored when `disabled` is
15197
- falsy.
15522
+ trailing localized "Other" bucket. A caller category literally named `"Other"` remains its own
15523
+ ordinary, first-seen category and is not merged into or reordered with that uncategorized bucket.
15524
+ `icon` is a literal glyph (e.g. an emoji) rendered next to `name` — an opaque string, not a registry
15525
+ lookup, the same convention `<lr-tool-call-chip>`'s `icon` uses. `disabled` individually gates a
15526
+ tool regardless of `useDefaults`/`selected` (e.g. a tool requiring admin approval);
15527
+ `disabledReason` is supporting text shown under a disabled row, ignored when `disabled` is falsy.
15198
15528
  - `ToolSelectFilter = (tool: ToolSelectDialogTool, query: string) => boolean` — a predicate deciding
15199
15529
  whether `tool` matches an already-trimmed, already-lowercased `query`. Assign `filter` to replace the
15200
15530
  built-in case-insensitive name/description substring match entirely (mirrors `<lr-combobox>`'s
@@ -15229,7 +15559,8 @@ shared overlay stack. First-party invention (no Web Awesome equivalent).
15229
15559
 
15230
15560
  **Events:** `lr-change` (`detail: ToolSelectionChangeDetail` — the enabled-tool selection or the
15231
15561
  `useDefaults` toggle changed), `lr-close` (`detail: ToolSelectDialogCloseReason` — fired exactly once
15232
- per dismissal, via Escape, a backdrop click, or a `close()` call)
15562
+ per dismissal, via Escape, a backdrop click, or a `close()` call), and no-detail `focus`/`blur`
15563
+ events re-dispatched when the internal search input gains or loses focus.
15233
15564
 
15234
15565
  **Slots:** `footer` — optional action buttons (e.g. a "Done" button), rendered in a bottom row. Changes
15235
15566
  already apply live via `lr-change`, so this slot is purely optional; only visually shown once it has
@@ -15284,7 +15615,9 @@ checkboxes for editing.
15284
15615
  - `disabledReason` text only renders when both `tool.disabled` and `tool.disabledReason` are set.
15285
15616
  - Categories are grouped in first-seen order across `tools`; an empty/whitespace-only `category` folds
15286
15617
  into a trailing "Other" bucket that's always rendered last. A category left with zero matches after
15287
- filtering is dropped entirely, not rendered as an empty heading.
15618
+ filtering is dropped entirely, not rendered as an empty heading. A caller-supplied category
15619
+ literally named `"Other"` is not the internal uncategorized sentinel: it stays in first-seen order
15620
+ and remains separate even when uncategorized tools are also present.
15288
15621
  - Reconnecting the element while still `open` (e.g. a drag-and-drop reparent that keeps the same
15289
15622
  instance) resumes its shared overlay registration and re-acquires the scroll lock dropped in
15290
15623
  `disconnectedCallback`.
@@ -15324,7 +15657,9 @@ jump-to-latest action of its own.
15324
15657
  **Themeable custom properties:** `--lr-thinking-panel-max-block-size` (default `16rem` —
15325
15658
  consumer-overridable cap on how tall `[part="body"]` grows before it scrolls internally; not
15326
15659
  exposed as a component property since it's a pure layout knob, not something a template branches
15327
- on), plus shared `--lr-color-border`/`-surface`/`-text`/`-text-quiet`/`-brand`/`-brand-quiet`,
15660
+ on), and `--lr-thinking-panel-pending-color` (default `var(--lr-color-brand)`) — the live-mode
15661
+ pending duration/toggle accent without changing the shared brand token. Plus shared
15662
+ `--lr-color-border`/`-surface`/`-text`/`-text-quiet`/`-brand`/`-brand-quiet`,
15328
15663
  `--lr-space-xs`/`-s`/`-m`, `--lr-radius`, `--lr-focus-ring-width`/`-color`/`-offset`,
15329
15664
  `--lr-transition-fast`/`-base`.
15330
15665
 
@@ -15416,7 +15751,11 @@ toggle for a run of internal frames), `raw` (the verbatim fallback when zero str
15416
15751
  parsed), `copy-button` (only rendered while `copyable`).
15417
15752
 
15418
15753
  **Themeable custom properties:** `--lr-stack-trace-max-height` (default `none`),
15419
- `--lr-stack-trace-font` (default `var(--lr-font-mono)`), plus shared tokens
15754
+ `--lr-stack-trace-font` (default `var(--lr-font-mono)`),
15755
+ `--lr-stack-trace-internal-frame-color` (default `var(--lr-color-text-quiet)`) — internal-frame
15756
+ foreground, and `--lr-stack-trace-interactive-color` (default `var(--lr-color-brand)`) — frame
15757
+ hover/focus, internal-toggle, and copy-button-hover accent. The scoped color hooks avoid changing
15758
+ the shared quiet/brand tokens used by surrounding UI. Plus shared tokens
15420
15759
  `--lr-color-border`/`-surface`/`-text`/`-text-quiet`/`-brand`, `--lr-radius`,
15421
15760
  `--lr-border-width-thin`, `--lr-space-xs`/`-s`/`-2xs`, `--lr-font-size-sm`/`-xs`,
15422
15761
  `--lr-font-weight-bold`/`-semibold`, `--lr-focus-ring-*`.
@@ -15504,7 +15843,8 @@ closing; otherwise always followed by `lr-close` with reason `'approve'`), `lr-d
15504
15843
  default, `event.detail` is `null`, not `undefined`. Cancelable, same `pending` mechanism, setting
15505
15844
  `pending` to `'deny'`; otherwise always followed by `lr-close` with reason `'deny'`), `lr-close`
15506
15845
  (`detail: ToolApprovalDialogCloseReason` — fired exactly once per dismissal, via Escape, a backdrop
15507
- click, the Approve/Deny buttons, or a `close()` call)
15846
+ click, the Approve/Deny buttons, or a `close()` call), and no-detail `focus`/`blur` events
15847
+ re-dispatched when the raw-JSON editor gains or loses focus.
15508
15848
 
15509
15849
  **Slots:** `footer` — optional supplementary content (e.g. a "remember this choice" checkbox),
15510
15850
  rendered before the built-in Deny/Edit/Approve buttons.
@@ -15571,12 +15911,10 @@ shared composed-tree focus traversal used by the other modal families.
15571
15911
  disconnect/reconnect fire back-to-back with no update in between.
15572
15912
  - the Approve button's native `disabled` attribute (while the draft is invalid JSON) automatically
15573
15913
  excludes it from the shared Tab trap, whose focusable-set computation skips disabled controls.
15574
- - the raw-JSON `args-editor` textarea always hardcodes `spellcheck="false"`, `autocapitalize="off"`,
15575
- and `autocorrect="off"` not exposed as configurable properties, unlike `<lr-textarea>`'s/
15576
- `<lr-chat-composer>`'s passthrough props since its content is always JSON, never prose; without
15577
- this a mobile browser (notably iOS Safari, which defaults textarea `autocapitalize` to
15578
- `'sentences'`) could auto-capitalize or auto-correct key/value text as the user edits, silently
15579
- corrupting the JSON.
15914
+ - the raw-JSON `args-editor` textarea defaults to `spellcheck="false"`, `autocapitalize="off"`,
15915
+ `autocorrect="off"`, and `autocomplete="off"` because its content is JSON, never prose. These
15916
+ native editing-assistance values remain configurable through the corresponding properties for
15917
+ integrations that intentionally need different browser behavior.
15580
15918
  - `deny-button`/`approve-button` are `<lr-button>` hosts (`variant="neutral"`/`"brand"` — this
15581
15919
  component has no `tone` property) — `--lr-button-*` theming reaches them directly. A consumer
15582
15920
  previously styling `::part(deny-button)`/`::part(approve-button)` for
@@ -15642,13 +15980,19 @@ and makes the form invalid instead of being silently accepted.
15642
15980
  updates `ElementInternals`, and returns validity without revealing inline errors.
15643
15981
  - `reportValidity(): boolean` — performs the same resynchronization, reveals all current field/root
15644
15982
  errors, focuses the first invalid generated field when one exists, and delegates to native
15645
- `ElementInternals.reportValidity()`.
15983
+ `ElementInternals.reportValidity()`. If `required` contains an unmet key absent from
15984
+ `properties`, there is no generated control to focus, so a localized, programmatically focusable
15985
+ root error names that dangling key instead.
15646
15986
 
15647
15987
  **Events:** `lr-input` (`detail: { value: Record<string, unknown> }` — the full current value
15648
15988
  object, every property with defaults resolved, not just the field that changed), `lr-validity-change`
15649
15989
  (`detail: { valid: boolean; errors: Record<string, string> }` — fired whenever overall validity or
15650
15990
  the field-error set changes, including once up front at connect time; serialization-only failures
15651
- set `valid: false` while `formError`, rather than a fabricated field key, carries the root message)
15991
+ set `valid: false` while `formError`, rather than a fabricated field key, carries the root message),
15992
+ and no-detail `focus`/`blur` events for generated native text/number inputs. The composed
15993
+ `<lr-select>`/`<lr-checkbox>` controls already bubble their own focus/blur bridges through the host.
15994
+ Their implementation events (`input`, `change`, `lr-change`, select show/hide, and option mutation)
15995
+ are contained at the form boundary; consumers receive the single form-level `lr-input` contract.
15652
15996
 
15653
15997
  **Slots:** none.
15654
15998
 
@@ -15691,13 +16035,16 @@ This component owns no Submit/Cancel/Approve chrome — a consumer composes it i
15691
16035
  `<lr-option>`s; a plain `'string'` renders a text `<input>`; `'number'`/`'integer'` render a numeric
15692
16036
  `<input type="number">` (`step="1"` for integer, `step="any"` for number); `'boolean'` renders a
15693
16037
  `<lr-checkbox>` with the field's label projected into its default slot — real slotted content, since
15694
- that's `<lr-checkbox>`'s documented way to give itself an accessible name, unlike `aria-describedby`
15695
- (neither `<lr-select>` nor `<lr-checkbox>` forward a host-level `aria-describedby` to their
15696
- internal focusable element, so for the enum-select case the error message is folded into `aria-label`
15697
- instead, alongside the always-visible adjacent `[part="description"]` text). The outer component owns
15698
- schema validity rather than forwarding HTML `required` constraints: JSON Schema `required` means an
15699
- own property is present, so `''`, `0`, and `false` are valid present values. Use
15700
- `{ type: 'boolean', const: true }` together with `required` for a must-confirm checkbox.
16038
+ that's `<lr-checkbox>`'s documented way to give itself an accessible name. Enum descriptions/errors
16039
+ flow through `<lr-select>`'s `.hint`/`.errorText` control chrome. Boolean descriptions/errors stay
16040
+ adjacent `[part="description"]`/`[part="error"]` nodes whose ids are passed through the checkbox
16041
+ host's `aria-describedby`; `<lr-checkbox>` resolves those ids onto its internal `role="checkbox"`
16042
+ through `ariaDescribedByElements`. Supporting text therefore keeps description semantics instead of
16043
+ being folded into an `aria-label`. The outer component owns JSON Schema validity: `required` means
16044
+ an own property is present, so `''`, `0`, and `false` are valid present values. A plain required
16045
+ boolean consequently does not set `<lr-checkbox>.required`'s must-check semantics. Use
16046
+ `{ type: 'boolean', const: true }` together with `required` for a must-confirm checkbox; that exact
16047
+ combination does set the nested checkbox's matching native/ARIA required state.
15701
16048
 
15702
16049
  Optional native `<form>` participation is implemented via `ElementInternals` attached directly in the
15703
16050
  constructor (`static formAssociated = true`) rather than a string-value mixin, since this component's
@@ -15718,6 +16065,9 @@ a JSON object, falls back to `{}` for malformed/non-object state, and does not e
15718
16065
  after an explicit `reportValidity()` call — `checkValidity()` alone never reveals them, matching
15719
16066
  every other form control in this library (`<lr-select>`/`<lr-combobox>`/`<lr-model-select>`
15720
16067
  all avoid flashing red before the user has touched anything).
16068
+ - a key listed in `schema.required` but absent from `schema.properties` still fails closed. Because
16069
+ no field exists for that dangling reference, `reportValidity()` renders and focuses a localized
16070
+ root error naming the key rather than leaving an invisible, unreachable validity failure.
15721
16071
  - `effectiveValue` distinguishes "key absent from `value`" (falls back to `default`) from "key present
15722
16072
  but `undefined`" (stays cleared and counts as absent for `required`) via `hasOwnProperty`, not an
15723
16073
  `=== undefined` fallback check.
@@ -15844,6 +16194,8 @@ scroll position. `disabled: boolean = false` (reflected) disables every vote but
15844
16194
  output), and `prompt` (optional shared-input header above both panes).
15845
16195
 
15846
16196
  **Events:** `lr-vote` — `detail: { choice: 'a' | 'b' | 'tie' | 'both-bad'; itemId: string }`.
16197
+ This is a cancelable veto point emitted before `vote` changes; call `preventDefault()` to preserve
16198
+ the prior vote.
15847
16199
 
15848
16200
  **CSS parts:** `base` (the outer wrapper), `prompt` (the optional prompt header, hidden when the
15849
16201
  `prompt` slot is empty), `panes` (the row, or under 640px column, wrapping both panes), `pane-a`,
@@ -15852,7 +16204,11 @@ output), and `prompt` (optional shared-input header above both panes).
15852
16204
  internal vote-announcement live region).
15853
16205
 
15854
16206
  **Themeable custom properties:** `--lr-compare-panel-max-height` (default `var(--lr-size-24rem)`) —
15855
- cap on each pane's scroll region before it scrolls internally.
16207
+ cap on each pane's scroll region before it scrolls internally;
16208
+ `--lr-compare-panel-selected-background` (default `var(--lr-color-brand-quiet)`),
16209
+ `--lr-compare-panel-selected-border-color` (default `var(--lr-color-brand)`), and
16210
+ `--lr-compare-panel-selected-color` (default `var(--lr-color-brand)`) style the selected vote
16211
+ button without changing shared brand tokens.
15856
16212
 
15857
16213
  ## `lr-span-waterfall`
15858
16214
 
@@ -15881,10 +16237,22 @@ Space).
15881
16237
  bar), `meta` (secondary row info, shown inline under 480px), `status-text`, `duration`, `empty` (shown
15882
16238
  when `spans` is empty), and `live-region`.
15883
16239
 
16240
+ The terminal axis tick is end-aligned so its label remains inside the allocated chart width. Roving
16241
+ keyboard focus is computed from the currently rendered/filtered span ids, so a hidden active span
16242
+ cannot leave the component with no `tabindex="0"` stop.
16243
+
15884
16244
  **Themeable custom properties:** `--lr-span-waterfall-name-width` (default `8rem`),
15885
16245
  `--lr-span-waterfall-stripe-speed` (a `running` span's striped-bar animation duration; defaults to
15886
16246
  `--lr-transition-ambient`), and `--lr-span-waterfall-row-active-bg` (default
15887
16247
  `var(--lr-color-brand-quiet)`) — the background of the active (`activeSpanId`) row.
16248
+ Status-scoped bar hooks are `--lr-span-waterfall-success-color` (default
16249
+ `var(--lr-color-success)`), `--lr-span-waterfall-error-color` (default
16250
+ `var(--lr-color-danger)`), `--lr-span-waterfall-denied-color` (default
16251
+ `var(--lr-color-warning)`), `--lr-span-waterfall-running-color` (default
16252
+ `var(--lr-color-brand)`) for the running stripe foreground,
16253
+ `--lr-span-waterfall-running-stripe-color` (default `var(--lr-color-brand-quiet)`) for its
16254
+ contrasting background, and `--lr-span-waterfall-pending-border-color` (default
16255
+ `var(--lr-color-border-strong)`) for pending bars.
15888
16256
 
15889
16257
  That last one follows the convention every **state-scoped** custom property in this family uses, and
15890
16258
  it is worth reading once: it is an inline `var()` fallback at its point of use and is deliberately
@@ -15938,7 +16306,12 @@ label/summary/toggle while `compact`, one step tighter than the header's uncompa
15938
16306
  `--lr-space-xs`, so `compact` tightens the header's *interior* spacing and not just its padding;
15939
16307
  `--lr-task-list-compact-gap` (default `var(--lr-space-2xs)`) — gap between `[part="body"]`'s item
15940
16308
  rows while `compact`; `--lr-task-list-compact-body-padding` (default `var(--lr-space-2xs)
15941
- var(--lr-space-s) var(--lr-space-s)`) — `[part="body"]` padding while `compact`.
16309
+ var(--lr-space-s) var(--lr-space-s)`) — `[part="body"]` padding while `compact`;
16310
+ `--lr-task-list-pending-color` (default `var(--lr-color-text-quiet)`),
16311
+ `--lr-task-list-running-color` (default `var(--lr-color-brand)`),
16312
+ `--lr-task-list-success-color` (default `var(--lr-color-success)`), and
16313
+ `--lr-task-list-error-color` (default `var(--lr-color-danger)`) independently retint the matching
16314
+ status icons without changing shared status tokens.
15942
16315
 
15943
16316
  ## `lr-terminal`
15944
16317
 
@@ -15965,7 +16338,10 @@ line-granular (a match identifies a whole line, not a character range) and cappe
15965
16338
  stops climbing on a pathologically repetitive buffer. `getPlainText()` returns the SGR-stripped
15966
16339
  plain text of the whole buffer.
15967
16340
 
15968
- **Events:** `lr-copy` (`detail: { text }`), `lr-download` (`detail: { filename }`),
16341
+ **Events:** `lr-copy` (`detail: { text }`), `lr-download` (`detail: { filename }`, cancelable — by
16342
+ default the component creates a plain-text `Blob`/object URL and activates a synthetic
16343
+ `<a download>`; `preventDefault()` suppresses that built-in download so the host can substitute
16344
+ server-side or other handling),
15969
16345
  `lr-follow-change` (`detail: { following }`), `lr-search-change` (`detail: { query, matchCount,
15970
16346
  activeIndex }`), `lr-highlight-activate` (`detail: { id }`), and `lr-text-select` (`detail: {
15971
16347
  text, anchor, rects }`).
@@ -15996,6 +16372,15 @@ beat it without `!important`.
15996
16372
  - `--lr-terminal-search-outline-color` — Outline color for a line containing a non-active search match. Default: `var(--lr-color-warning)`.
15997
16373
  - `--lr-terminal-search-active-outline-color` — Outline color for the active search match's line. Default: `var(--lr-color-brand)`.
15998
16374
 
16375
+ While a search query is active, writes, scrollback trimming, `content` replacement, and `clear()`
16376
+ recompute the exact match count and emit `lr-search-change` only when that public search snapshot
16377
+ actually changes. Pending output announcements are canceled by clear/replacement, disabling
16378
+ `announceOutput`, or disconnect, so stale text is never announced after it has been removed.
16379
+ A multi-line highlight paints every retained covered line but exposes exactly one keyboard/click
16380
+ owner at the anchor's start, or at the first surviving covered line after scrollback trims that
16381
+ start. Its accessible name combines the caller label with visible line text (or a localized line
16382
+ number for an empty line), avoiding duplicate tab stops for one logical highlight.
16383
+
15999
16384
  ## `lr-trace-tree`
16000
16385
 
16001
16386
  A collapsible span hierarchy for one agent/LLM trace (Langfuse/LangSmith run-tree style): kind icon,
@@ -16009,6 +16394,9 @@ as a root rather than being dropped. `activeSpanId: string | null = null`
16009
16394
  (attribute `active-span-id`), `label: string = ''`, `showTokens: boolean = false` (attribute
16010
16395
  `show-tokens`) — surfaces `tokensIn`/`tokensOut`, `showCost: boolean = false` (attribute
16011
16396
  `show-cost`) — surfaces `costText`, and `hideBars: boolean = false` (attribute `hide-bars`).
16397
+ Token counts render only when finite and non-negative; invalid metrics are omitted rather than
16398
+ reaching `Intl.NumberFormat`. A row's accessible name includes its optional `detail` text as well
16399
+ as its name/status/metrics, and updates when the supplied span data changes.
16012
16400
 
16013
16401
  **Methods:** `expandAll()` and `collapseAll()` set every row's expanded state at once.
16014
16402
 
@@ -16148,16 +16536,30 @@ name: string; tests: TestCaseResult[] }` and `TestCaseResult { id: string; name:
16148
16536
  TestStatus; durationMs?: number; message?: string }`, with `TestStatus = 'passed' | 'failed' |
16149
16537
  'skipped' | 'running'` (all three exported here). `statusFilter: TestStatus[] =
16150
16538
  []` (attribute: false) — empty shows every status; and `autoExpandFailures: boolean = true`
16151
- (attribute `auto-expand-failures`).
16152
-
16153
- **Slots:** `detail-{testId}` — rich failure detail for that test, rendered after its plain `message`
16154
- text once the row is expanded.
16539
+ (attribute `auto-expand-failures`). A duration renders only when it is finite and non-negative;
16540
+ invalid/negative values are omitted rather than reaching `Intl.NumberFormat`.
16541
+
16542
+ **Slots:** `detail-{encodedSuiteId}:{encodedTestId}` collision-free suite-scoped rich detail for
16543
+ a test, where each encoded segment is `encodeURIComponent(id)`. It renders after the plain
16544
+ `message` once expanded (for example, suite `unit` and test `same` use
16545
+ `slot="detail-unit:same"`). This canonical form distinguishes duplicate and delimiter-containing
16546
+ ids and wins when multiple forms are supplied. The prior
16547
+ `detail-{suiteId}-{testId}` form remains an unambiguous compatibility fallback; it is ignored when
16548
+ the same name could address multiple rows or collide with another row's canonical name. The older
16549
+ `detail-{testId}` form remains supported only while that test id is globally unique across all
16550
+ suites. Slot listeners remain mounted while detail is absent, so appending matching slotted
16551
+ content after the component's first render immediately enables the row's disclosure.
16155
16552
 
16156
16553
  **Events:** `lr-test-select` (`detail: { suiteId: string; testId: string }`, a test row's name was
16157
16554
  activated), `lr-filter-change` (`detail: { statuses: TestStatus[] }` — the complete next filter set; the
16158
16555
  component updates its own `statusFilter` first, then emits),
16159
- and `lr-toggle` (`detail: { id: string; expanded: boolean }`, a row's failure detail was
16160
- expanded/collapsed).
16556
+ and `lr-toggle` (`detail: { id: string; suiteId?: string; expanded: boolean }`, a row's failure
16557
+ detail was expanded/collapsed). To preserve the established exact event shape, `suiteId` is omitted
16558
+ for a globally unique test id and included when the id occurs in more than one suite. Manual
16559
+ expansion state is always keyed by the suite+test pair, so toggling one duplicate never toggles its
16560
+ sibling.
16561
+ Each expand/collapse action's localized accessible name includes both suite and test names, so
16562
+ repeated row controls remain distinguishable.
16161
16563
 
16162
16564
  **CSS parts:** `base`, `summary` (the status-count strip), `count` (carries `data-status`), `filter`,
16163
16565
  `filter-toggle` (carries `data-status`/`aria-pressed`), `suite`, `suite-header`, `test` (carries
@@ -16173,7 +16575,11 @@ filter toggle. All three follow the state-scoped-property convention described u
16173
16575
  the element or on any ancestor. They exist because
16174
16576
  `::part(filter-toggle)[aria-pressed='true']` is invalid CSS — Shadow Parts forbids an attribute
16175
16577
  selector after `::part()` — so restyling the pressed state otherwise meant overriding the
16176
- library-wide brand tokens.
16578
+ library-wide brand tokens. Per-result status foregrounds are independently exposed through
16579
+ `--lr-test-results-passed-color` (default `var(--lr-color-success)`),
16580
+ `--lr-test-results-failed-color` (default `var(--lr-color-danger)`),
16581
+ `--lr-test-results-skipped-color` (default `var(--lr-color-text-quiet)`), and
16582
+ `--lr-test-results-running-color` (default `var(--lr-color-brand)`).
16177
16583
 
16178
16584
  ## `lr-confirm-bar`
16179
16585
 
@@ -16584,6 +16990,8 @@ Rubric scoring and human-review surface for comparing the runs of one evaluation
16584
16990
 
16585
16991
  Composes `lr-table` (the comparison table), `lr-rubric-form` (the review surface), and
16586
16992
  `lr-diff-view` (baseline↔selected output diff) rather than re-deriving any of their behavior.
16993
+ The table's accessible name is the localized evaluation-runs label by default; a host
16994
+ `aria-label` on `<lr-eval-result>` overrides it.
16587
16995
 
16588
16996
  **Properties:**
16589
16997
  - `runs: EvalRunResult[] = []` (attribute: false) — `EvalRunResult { id: string; label: string;
@@ -16717,12 +17125,17 @@ primitives, with retry counts and sensitive-field redaction.
16717
17125
  unknown }`, extending the shared detail from `@aceshooting/lyra-ui/ai`). `args` is present only when
16718
17126
  `approved` is `true`, and may differ from what the entry originally proposed — the dialog's inline
16719
17127
  edit step can hand back different arguments. A listener that only needs `{ invocationId, approved }`
16720
- can ignore it; one actually executing the tool needs it.
17128
+ can ignore it; one actually executing the tool needs it. This is a cancelable veto point:
17129
+ `preventDefault()` preserves the pending approval dialog and its current inline argument edits
17130
+ instead of closing/resetting them, so asynchronous host validation can finish before resolving the
17131
+ decision.
16721
17132
 
16722
17133
  **CSS parts:** `base`,
16723
17134
  `entry`, `entry-marker`, `entry-header`, `entry-timestamp`, `entry-body`, `entry-details`,
16724
17135
  `entry-result`, `entry-error`, `entry-retries`, `entry-retries-count`, `entry-retries-label`,
16725
17136
  `entry-redacted-indicator`, `entry-approval-status`, `approval-dialog`.
17137
+ Each entry's `lr-details` disclosure has a localized contextual summary naming that tool call, not a
17138
+ repeated bare "Details" label.
16726
17139
 
16727
17140
  **Themeable custom properties:** `--lr-tool-timeline-gap` (default `var(--lr-space-l)`) — vertical
16728
17141
  gap between entries; `--lr-tool-timeline-marker-size` (default `var(--lr-size-0-625rem)`) — the
@@ -16779,6 +17192,8 @@ It never executes tools or persists decisions.
16779
17192
 
16780
17193
  **Events:** `lr-approval-select` (`{ invocationId }`), `lr-approval-decision` (`{ invocationId,
16781
17194
  approved, args? }`), and `lr-approval-close` (`{ invocationId, reason }`).
17195
+ `lr-approval-decision` is cancelable; calling `preventDefault()` vetoes the nested approve/deny
17196
+ request and keeps the decision dialog pending.
16782
17197
 
16783
17198
  **CSS parts:** `base`, `heading-row`, `heading`, `count`, `list`, `request`, `request-info`,
16784
17199
  `tool-name`, `request-id`, `status`, `empty`. The `[part='request']` row matching `selectedId`
@@ -16823,6 +17238,12 @@ request. Both are no-ops before a frame exists.
16823
17238
  (`{ level, value }`), and `lr-mcp-resize` (`{ height }`). These are host-authorized requests; the
16824
17239
  component does not execute tools, send messages, or navigate itself.
16825
17240
 
17241
+ Changing `resource` mounts a fresh iframe/window generation; messages from the prior
17242
+ `contentWindow` are ignored even when two opaque-origin inline documents otherwise look alike.
17243
+ Changing only `height`/`maxHeight` updates frame geometry without returning an already-ready frame
17244
+ to its loading state. The initial host context reports `effectiveLocale`, so inherited/document
17245
+ locale and per-element locale overrides follow the same precedence as the rest of Lyra UI.
17246
+
16826
17247
  **CSS parts:** `base`, `frame`, `loading`, `error`.
16827
17248
 
16828
17249
  **Slots:** none. **Optional peer deps:** none.
@@ -16858,6 +17279,10 @@ PromptStudioMessage[]; variables?: PromptStudioVariable[]; createdAt?: string }`
16858
17279
  `message-content`, `remove-message`, `add-message`, `variables`, `variable`, `versions`, `version`,
16859
17280
  `preview`, `save`, `run`.
16860
17281
 
17282
+ Each message's role select and content editor has a localized contextual accessible name containing
17283
+ its one-based message index and purpose (plus the current role for content), so repeated controls do
17284
+ not collapse to indistinguishable generic names.
17285
+
16861
17286
  **Slots:** none. **Optional peer deps:** none.
16862
17287
 
16863
17288
  ```ts
@@ -16890,7 +17315,9 @@ keywords. `SchemaValidationIssue = { path: string; message: string; severity?: '
16890
17315
  **Events:** `lr-schema-select` (`{ path, schema }`, with an RFC 6901-style JSON Pointer).
16891
17316
 
16892
17317
  **CSS parts:** `base`, `tree`, `node`, `node-selected`, `node-trigger`, `name`, `type`, `required`,
16893
- `description`, `constraints`, `issue`, `limit`, `empty`.
17318
+ `description`, `constraints`, `issue`, `limit`, `issue-limit`, `empty`. `issue-limit` is the
17319
+ localized resource-ceiling status shown when caller-supplied validation issues exceed the rendered
17320
+ issue cap.
16894
17321
 
16895
17322
  `[part='issue']` carries `data-severity` and each severity has its own styling: `error` reads the
16896
17323
  danger tokens, `warning` the warning tokens, and `info` its own pair —
@@ -16904,8 +17331,10 @@ invalid CSS, so this is the only way to recolor one severity without touching th
16904
17331
  **Themeable custom properties:** `--lr-schema-viewer-info-border`, `--lr-schema-viewer-info-bg` (see
16905
17332
  above); otherwise shared tokens only.
16906
17333
 
16907
- Rendering is capped at 500 schema nodes; `limit` reports truncation. Cycles stop at the repeated
16908
- node rather than recursing. **Slots:** none. **Optional peer deps:** none.
17334
+ Rendering is capped independently at 500 schema nodes and 500 validation issues; `limit` and
17335
+ `issue-limit` report their respective truncation. Issues are indexed by path once before recursive
17336
+ rendering instead of rescanning the full input for every node. Cycles stop at the repeated node
17337
+ rather than recursing. **Slots:** none. **Optional peer deps:** none.
16909
17338
 
16910
17339
  ```ts
16911
17340
  import '@aceshooting/lyra-ui/components/agent-tools/schema-viewer/schema-viewer.js';
@@ -16914,6 +17343,7 @@ import '@aceshooting/lyra-ui/components/agent-tools/schema-viewer/schema-viewer.
16914
17343
  **Additional API surface:**
16915
17344
 
16916
17345
  - `part="limit"` — Resource-ceiling status shown when additional nodes are omitted.
17346
+ - `part="issue-limit"` — Resource-ceiling status shown when additional validation issues are omitted.
16917
17347
  - `--lr-schema-viewer-selected-border` — Selected node branch. Default: `var(--lr-color-brand)`.
16918
17348
  - `--lr-schema-viewer-error-border` — Error issue border. Default: `var(--lr-color-danger)`.
16919
17349
  - `--lr-schema-viewer-error-bg` — Error issue background. Default: `var(--lr-color-danger-quiet)`.
@@ -16938,7 +17368,10 @@ Record<string, unknown> }`.
16938
17368
  `task`, `model`, `progress`, `actions`, `cancel`, `retry`, `limit`, `empty`.
16939
17369
 
16940
17370
  At most 500 runs render, and visual indentation is capped at 12 levels while ARIA hierarchy keeps
16941
- the logical depth. Progress is finite and clamped. **Slots:** none. **Optional peer deps:** none.
17371
+ the logical depth. The roving treeitem accepts Enter/Space as well as pointer activation for
17372
+ `lr-run-select`; cancel/retry action names include the run label so repeated row actions remain
17373
+ distinguishable to assistive technology. Progress is finite and clamped. **Slots:** none.
17374
+ **Optional peer deps:** none.
16942
17375
 
16943
17376
  ```ts
16944
17377
  import '@aceshooting/lyra-ui/components/agent-tools/subagent-panel/subagent-panel.js';
@@ -16980,8 +17413,9 @@ A force-directed node-link diagram with pan/zoom/drag, built on `d3-force`.
16980
17413
  boolean; color?: string; dash?: number[] }` (source/target are node ids). `directed` adds an
16981
17414
  arrowhead; `color` and `dash` style the individual stroke; `label` provides a spoken-name and SVG
16982
17415
  tooltip fallback but is not rendered as visible edge text; `accessibleLabel` and `description`
16983
- can override the spoken name and tooltip independently. A link whose `source` id doesn't resolve
16984
- to a real node is still dropped entirely
17416
+ can override the spoken name and tooltip independently. `width` is normalized before reaching
17417
+ SVG, canvas paint, or canvas picking: negative values clamp to `0`, while a non-finite or unset
17418
+ value uses `1.5`. A link whose `source` id doesn't resolve to a real node is still dropped entirely
16985
17419
  (there's no position to draw a stub from). A link whose `target` id doesn't resolve instead renders
16986
17420
  as a short, dashed, non-interactive stub off `source`'s own position
16987
17421
  (`[part='link'][data-dangling]`, `aria-hidden="true"`) rather than being silently dropped — e.g. for
@@ -17024,7 +17458,9 @@ A force-directed node-link diagram with pan/zoom/drag, built on `d3-force`.
17024
17458
  `::part(node)`/`::part(link)` styling (pixels, not elements — theme via cssprops instead), no
17025
17459
  native SVG `<title>` tooltip (replaced by `part="tooltip"`), and a drawn focus ring instead of a
17026
17460
  CSS one. Keyboard roving/announcements are preserved through an offscreen `part="cursor-item"`
17027
- button per node/link/hull.
17461
+ button per node/link/hull. In both renderers, node, link, and community-hull picking keeps at
17462
+ least 24 CSS px of screen-space geometry as the viewport zoom changes; this enlarges interaction
17463
+ only, not the visible marks.
17028
17464
 
17029
17465
  **Methods:** `focusNode(id, options?: { zoom? })` and `fit(options?: { padding?: number })` control the
17030
17466
  camera; `getNodePosition(id)` returns the current `{ x, y }` in graph-local drawing coordinates, or
@@ -17037,7 +17473,9 @@ id? }`; the optional `id` is the stable `GraphLink.id` supplied by the caller),
17037
17473
  `lr-link-enter`/`lr-link-leave` (`detail: { source, target, id? }`, same hover contract),
17038
17474
  `lr-node-expand` (`detail: { id }`, a node was double-activated — native `dblclick`, or two
17039
17475
  Enter/Space activations within 500ms — regardless of `GraphNode.expandable`), `lr-community-click`
17040
- (`detail: { id }`, a hull was activated)
17476
+ (`detail: { id }`, a hull was activated), `lr-selection-change`
17477
+ (`detail: { nodeIds, linkIds }`, a controlled selection intent), and `lr-viewport-change`
17478
+ (`detail: { k, x, y }`, a frame-coalesced camera/layout signal)
17041
17479
 
17042
17480
  **Slots:** none.
17043
17481
 
@@ -17073,8 +17511,10 @@ Under `renderer="canvas"` these five are read from computed style at paint time
17073
17511
  per-node elements to inherit them), so they must be set on or above the `<lr-graph>` host itself.
17074
17512
 
17075
17513
  **Optional peer deps:** `d3-force`, `d3-drag`, `d3-zoom`, `d3-selection` (all four required
17076
- together; lazy-`import()`ed once per page, `console.warn` once and renders empty if missing
17077
- install with `pnpm add d3-force d3-drag d3-zoom d3-selection`).
17514
+ together; lazy-`import()`ed once per page). Each loaded module is validated for the named callable
17515
+ capabilities the graph uses; a missing package or malformed module fails closed through the
17516
+ localized `part="error"` alert. Install with
17517
+ `pnpm add d3-force d3-drag d3-zoom d3-selection`.
17078
17518
 
17079
17519
  ```html
17080
17520
  <lr-graph style="display:block;height:500px"></lr-graph>
@@ -17116,12 +17556,11 @@ install with `pnpm add d3-force d3-drag d3-zoom d3-selection`).
17116
17556
  `<lr-skeleton>` sized to `width`/`height` with `aria-busy="true"`. If they fail to load (for
17117
17557
  example, because they are not installed), the graph fails closed with a localized
17118
17558
  `part="error"` / `role="alert"` message instead of leaving an empty SVG.
17119
- - `GraphNode.color` is sanitized (rejects `;`/`{`/`}`) before being written into the
17120
- `--lr-node-fill` inline custom property, so an untrusted color string can't break out of that
17121
- CSS declaration.
17122
- - `GraphLink.color` applies the same declaration-delimiter sanitization. `GraphLink.dash` is used
17123
- only when every entry is finite and non-negative; an empty or invalid array falls back to a solid
17124
- line rather than partially applying malformed SVG stroke data.
17559
+ - `GraphNode.color`, node-type colors, `GraphLink.color`, and community colors are accepted only
17560
+ when the browser parses them as CSS `color`; declaration breaks and `url()` paint servers are
17561
+ ignored in favor of the normal token/palette fallback. `GraphLink.dash` is used only when every
17562
+ entry is finite and non-negative; an empty or invalid array falls back to a solid line rather
17563
+ than partially applying malformed SVG stroke data.
17125
17564
  - a structural `nodes`/`links` change now carries over each already-settled node's position (and any
17126
17565
  in-progress drag) by id when rebuilding the simulation, instead of discarding every node's (x, y)
17127
17566
  and re-running the whole ~300-tick random-start settle from scratch — only genuinely new ids get a
@@ -17130,6 +17569,8 @@ install with `pnpm add d3-force d3-drag d3-zoom d3-selection`).
17130
17569
  - under `prefers-reduced-motion: reduce`, or whenever `seed` is set, the simulation converges
17131
17570
  synchronously (ticked in a loop down to `alphaMin` before first paint) instead of animating over
17132
17571
  ~300 rendered frames; user-initiated motion (dragging a node) is unaffected either way.
17572
+ - in canvas mode, `pointercancel`, lost pointer capture, and disconnect all release a live node's
17573
+ force pin and reset the simulation target; a canceled drag never leaves the node pinned.
17133
17574
  - the `<svg part="svg">` now carries `role="group"` and an `aria-label` summarizing the node/link
17134
17575
  counts (e.g. "Node-link diagram with 5 nodes and 4 links"), and node `<text part="label">`s are
17135
17576
  `aria-hidden="true"` (their content is already covered by each node's own `aria-label`).
@@ -17237,7 +17678,8 @@ same event-decoupled contract every sibling in this family follows.
17237
17678
  **Properties:**
17238
17679
  - `types: LyraGraphLegendType[] = []` (attribute: false) — `{ id: string; label: string; color?:
17239
17680
  string; shape?: 'circle' | 'square' | 'diamond' }`, the exact `lr-graph.nodeTypes` entry shape
17240
- (declared locally, not imported, so this stays a zero-dependency component)
17681
+ (declared locally, not imported, so this stays a zero-dependency component). A color is used only
17682
+ when valid for CSS `color`; declaration breaks and `url()` fall back to the categorical palette
17241
17683
  - `counts?: Record<string, number>` (attribute: false) — optional per-type count shown alongside the
17242
17684
  label
17243
17685
  - `hiddenTypes: string[] = []` (attribute: false) — controlled; the host assigns this back from
@@ -17257,7 +17699,8 @@ after each toggle).
17257
17699
  **Themeable custom properties:** `--lr-graph-legend-hidden-color` (default
17258
17700
  `var(--lr-color-text-quiet)`) — text color of a filtered-out (hidden) row's `label`/`count`,
17259
17701
  independent of the shared quiet-text token so a host can retint "hidden" rows without repainting
17260
- every other quiet-text surface. Also reads `--lr-graph-cat-1` through `-8`
17702
+ every other quiet-text surface; `--lr-graph-legend-hidden-swatch-opacity` (default `0.5`) controls
17703
+ only that row's decorative swatch opacity. Also reads `--lr-graph-cat-1` through `-8`
17261
17704
  (the same computed-style fallback palette `lr-graph`/`lr-word-cloud` use) plus shared tokens.
17262
17705
 
17263
17706
  **Optional peer deps:** none.
@@ -17625,7 +18068,8 @@ stance `lr-tool-select-dialog` already takes.
17625
18068
  - `sources: LyraSourceEntry[] = []` (attribute: false) — `LyraSourceEntry { id: string; label:
17626
18069
  string; mimeType?: string; name?: string; children?: LyraSourceEntry[] }`; flat (no `children`) or
17627
18070
  a tree — presence of `children` makes a row a group/folder with tri-state select
17628
- - `selectedIds: string[] = []` (attribute: false) — controlled; the host assigns this back from
18071
+ - `selectedIds: string[] = []` (attribute: false) — controlled; duplicates and ids that are not
18072
+ leaves in the current `sources` tree are pruned, and the host assigns updates back from
17629
18073
  `lr-sources-change`
17630
18074
  - `showSelectAll: boolean = true` (attribute `show-select-all`)
17631
18075
  - `searchable: boolean = true`
@@ -17641,7 +18085,8 @@ fired after every toggle including select-all).
17641
18085
 
17642
18086
  **CSS parts:** `base`, `search` (the built-in filter `lr-input`, only when `searchable`),
17643
18087
  `select-all` (only when `showSelectAll`), `summary` ("{selected} of {total} selected"), `tree`
17644
- (`role="tree"`), `item` (`role="treeitem"`), `disclosure` (a folder row's expand/collapse button),
18088
+ (`role="tree"`), `item` (`role="treeitem"`), `disclosure` (a folder row's pointer-only
18089
+ expand/collapse indicator; the surrounding treeitem owns keyboard expansion),
17645
18090
  `checkbox` (tri-state glyph), `icon` (the `lr-file-icon` type badge), `label`, `empty` (`noData`
17646
18091
  when `sources` is empty, `noMatches` when a filter empties the tree).
17647
18092
 
@@ -17797,8 +18242,9 @@ anything about `<lr-source-card>`, it only carries the id through its event deta
17797
18242
  echoed back verbatim in both events; never read or validated by this component.
17798
18243
  - `href: string = ''` — optional direct link target for the citation's source, carried into
17799
18244
  `lr-citation-open`'s detail as-is; this component never navigates.
17800
- - `label: string = ''` — overrides the computed accessible name. The built-in citation/status
17801
- summary is a complete localized template; a host `aria-label` has highest precedence.
18245
+ - `label: string = ''` — adds caller-supplied context to the localized citation name while retaining
18246
+ the visible citation number (for example, `"Citation 3, Annual report"`). A host `aria-label`
18247
+ remains the exact highest-precedence override.
17802
18248
 
17803
18249
  **Events:**
17804
18250
  - `lr-citation-activate` (`detail: { sourceId: string; index: number }`) — fires on click, or on
@@ -17901,7 +18347,8 @@ handy for building a `label-plural` string reactively, e.g. `` list.labelPlural
17901
18347
  collapsing the list.
17902
18348
 
17903
18349
  **Slots:** default — `<lr-source-card>` elements (or any content, though the card pairing is the
17904
- intended usage).
18350
+ intended usage). While connected, each assigned element receives `role="listitem"`; its author
18351
+ role is retained across live changes and restored when it leaves the list or the list disconnects.
17905
18352
 
17906
18353
  **CSS parts:** `base` (outer container), `header` (the clickable `<button>` toggling `expanded`),
17907
18354
  `toggle` (the chevron indicator inside the header), `list` (wrapper around the default slot, `hidden`
@@ -18099,7 +18546,8 @@ and `lr-citation-badge` for each evidence entry.
18099
18546
  `@aceshooting/lyra-ui/ai` = `{ citation: Citation }`) — emitted when an evidence badge is activated.
18100
18547
  The inner `lr-citation-badge`'s own `lr-citation-activate` (`detail: { sourceId, index }`) still
18101
18548
  bubbles through unmodified; this richer event exists because a bare `sourceId`/`index` pair can't
18102
- tell a host which exact evidence *span* to jump to.
18549
+ tell a host which exact evidence *span* to jump to. The composed `lr-claim-evidence` also surfaces
18550
+ `lr-claim-select` (`detail: { claim }`) unchanged when a claim is activated.
18103
18551
 
18104
18552
  **Slots:** none.
18105
18553
 
@@ -18142,7 +18590,8 @@ embedding counts, retry attempts, errors, and retry/cancel requests. Never inges
18142
18590
  **Events:**
18143
18591
  - `lr-retry` (`detail: IngestionRetryEventDetail` = `RetryEventDetail & { itemId: string }` =
18144
18592
  `{ attempt: number; messageId?: string; itemId: string }`) — `attempt` is the attempt about to be
18145
- made, `(item.attempts ?? 0) + 1`. Only offered on `'failed'` rows.
18593
+ made: the displayed nonnegative finite-integer `item.attempts` value plus one (invalid, negative,
18594
+ or fractional inputs are normalized first). Only offered on `'failed'` rows.
18146
18595
  - `lr-cancel` (`detail: IngestionCancelEventDetail` = `CancelEventDetail & { itemId: string }` =
18147
18596
  `{ reason?: string; itemId: string }`) — this component never supplies `reason` itself. Only
18148
18597
  offered on non-terminal rows (`'queued'` plus the five active stages).
@@ -18253,7 +18702,8 @@ overlay. Composes `lr-graph`, `lr-graph-legend`, `lr-entity-card`, `lr-neighbor-
18253
18702
  (self-managed but presettable/observable — this component toggles its own copy on interaction, the
18254
18703
  same self-toggle-then-emit contract `lr-graph-legend` uses, so every feature works with zero host wiring)
18255
18704
  - `hiddenTypes: string[] = []` (attribute: false) — forwarded to both `lr-graph.hiddenTypes` and
18256
- `lr-graph-legend.hiddenTypes`
18705
+ `lr-graph-legend.hiddenTypes`; hidden nodes are also excluded from explorer search results,
18706
+ neighbor rows, and activation
18257
18707
  - `selectedNodeId: string | null = null` (attribute `selected-node-id`) — drives the details popover
18258
18708
  and `lr-graph.selectedNodeIds`; `null` shows no selection and keeps the popover closed
18259
18709
  - `pinnedNodeIds: string[] = []` (attribute: false) — exactly two pinned nodes reveals the "Find
@@ -18537,6 +18987,8 @@ is non-empty and not `loading`), `empty` (only when `empty` and neither `loading
18537
18987
  - Submitting while `loading` is already true **supersedes** the in-flight request: `lr-cancel` fires
18538
18988
  immediately before the new `lr-search`. Clicking the submit button (rather than pressing Enter)
18539
18989
  while `loading` only emits `lr-cancel` and does not resubmit.
18990
+ - Long unbroken filter keys, values, and scope labels are contained within the search allocation;
18991
+ the removable chip label truncates while its remove action remains available.
18540
18992
 
18541
18993
  ---
18542
18994
 
@@ -18624,7 +19076,8 @@ the component only normalizes them into SVG, colors optional clusters, and emits
18624
19076
  **Properties:** `points: EmbeddingPoint[] = []` (attribute: false), where each point is `{ id, x,
18625
19077
  y, label?, sourceId?, cluster? }`; `selectedId: string = ''`; `height: string = '360px'`;
18626
19078
  `accessibleLabel: string | null = null` (attribute `aria-label`). Non-finite coordinates are
18627
- omitted.
19079
+ omitted. Pointer and programmatic focus synchronize the single roving tab stop, and every point
19080
+ keeps at least a 24×24 CSS px pointer target at narrow allocations without enlarging its marker.
18628
19081
 
18629
19082
  **Events:** `lr-point-select` (`{ point }`), activated by click or Enter/Space.
18630
19083
 
@@ -18641,7 +19094,9 @@ permissions, and connector settings go in the `settings` slot.
18641
19094
 
18642
19095
  **Properties:** `sources: KnowledgeSource[] = []` (attribute: false); `ingestionItems:
18643
19096
  IngestionQueueItem[] = []` (attribute: false); `activeTab: 'sources' | 'ingestion' = 'sources'`;
18644
- `label: string = ''`; `hideIngestion: boolean = false`.
19097
+ `label: string = ''` (visible heading and accessible-name fallback; a host `aria-label` wins);
19098
+ `hideIngestion: boolean = false`. If ingestion is active when it becomes hidden, `activeTab`
19099
+ normalizes to `'sources'`, emits `lr-tab-change`, and moves focus to the Sources tab when needed.
18645
19100
 
18646
19101
  **Events:** `lr-tab-change` (`{ tab }`), `lr-source-create`, `lr-source-sync`, `lr-source-pause`,
18647
19102
  `lr-source-delete`, `lr-ingestion-retry`, and `lr-ingestion-cancel` (the latter four preserve the