@aceshooting/lyra-ui 7.5.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 (1078) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/custom-elements.json +6652 -559
  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 +59 -13
  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 +65 -6
  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-filter-bar.md +45 -0
  981. package/llms/components/lr-flow-minimap.md +8 -2
  982. package/llms/components/lr-flow-node.md +8 -2
  983. package/llms/components/lr-flow-run-overlay.md +10 -3
  984. package/llms/components/lr-format-bytes.md +2 -1
  985. package/llms/components/lr-format-number.md +3 -0
  986. package/llms/components/lr-gauge.md +4 -0
  987. package/llms/components/lr-geojson-view.md +10 -3
  988. package/llms/components/lr-graph-legend.md +5 -3
  989. package/llms/components/lr-graph.md +20 -12
  990. package/llms/components/lr-grounding-summary.md +2 -1
  991. package/llms/components/lr-heatmap.md +8 -5
  992. package/llms/components/lr-highlight-layer.md +2 -1
  993. package/llms/components/lr-histogram.md +12 -5
  994. package/llms/components/lr-html-viewer.md +3 -2
  995. package/llms/components/lr-icon.md +3 -1
  996. package/llms/components/lr-image-viewer.md +5 -0
  997. package/llms/components/lr-include.md +4 -3
  998. package/llms/components/lr-ingestion-queue.md +2 -1
  999. package/llms/components/lr-json-viewer.md +10 -3
  1000. package/llms/components/lr-kbd.md +3 -2
  1001. package/llms/components/lr-knowledge-base-admin.md +3 -1
  1002. package/llms/components/lr-knowledge-graph-explorer.md +2 -1
  1003. package/llms/components/lr-known-date.md +2 -1
  1004. package/llms/components/lr-lightbox.md +5 -4
  1005. package/llms/components/lr-line-chart.md +10 -8
  1006. package/llms/components/lr-lite-chart.md +46 -32
  1007. package/llms/components/lr-map.md +10 -5
  1008. package/llms/components/lr-mcp-app.md +6 -0
  1009. package/llms/components/lr-media-card.md +3 -1
  1010. package/llms/components/lr-mention-popover.md +5 -2
  1011. package/llms/components/lr-menu-item.md +3 -1
  1012. package/llms/components/lr-menu.md +3 -1
  1013. package/llms/components/lr-message-feedback.md +2 -1
  1014. package/llms/components/lr-message-parts.md +5 -1
  1015. package/llms/components/lr-model-select.md +5 -1
  1016. package/llms/components/lr-notebook-viewer.md +7 -3
  1017. package/llms/components/lr-option.md +6 -2
  1018. package/llms/components/lr-page-rail.md +5 -0
  1019. package/llms/components/lr-pdf-viewer.md +10 -3
  1020. package/llms/components/lr-pie-chart.md +10 -8
  1021. package/llms/components/lr-polar-area-chart.md +10 -8
  1022. package/llms/components/lr-poll-status.md +11 -6
  1023. package/llms/components/lr-popover.md +2 -1
  1024. package/llms/components/lr-progress-bar.md +2 -1
  1025. package/llms/components/lr-progress-ring.md +2 -1
  1026. package/llms/components/lr-prompt-studio.md +4 -0
  1027. package/llms/components/lr-qr-code.md +7 -5
  1028. package/llms/components/lr-radar-chart.md +10 -8
  1029. package/llms/components/lr-radio-group.md +4 -1
  1030. package/llms/components/lr-radio.md +6 -2
  1031. package/llms/components/lr-random-content.md +2 -0
  1032. package/llms/components/lr-rating.md +7 -1
  1033. package/llms/components/lr-retrieval-search.md +2 -0
  1034. package/llms/components/lr-scatter-chart.md +10 -8
  1035. package/llms/components/lr-schema-viewer.md +9 -4
  1036. package/llms/components/lr-segmented.md +2 -0
  1037. package/llms/components/lr-selection-toolbar.md +2 -0
  1038. package/llms/components/lr-sequence-strip.md +10 -8
  1039. package/llms/components/lr-source-card.md +2 -1
  1040. package/llms/components/lr-source-list.md +2 -1
  1041. package/llms/components/lr-source-picker.md +4 -2
  1042. package/llms/components/lr-span-waterfall.md +13 -1
  1043. package/llms/components/lr-spinner.md +3 -1
  1044. package/llms/components/lr-stack-trace.md +6 -2
  1045. package/llms/components/lr-stat.md +7 -5
  1046. package/llms/components/lr-subagent-panel.md +4 -1
  1047. package/llms/components/lr-svg-viewer.md +5 -2
  1048. package/llms/components/lr-swatch-picker.md +6 -4
  1049. package/llms/components/lr-switch.md +2 -1
  1050. package/llms/components/lr-task-list.md +7 -2
  1051. package/llms/components/lr-terminal.md +13 -1
  1052. package/llms/components/lr-test-results.md +25 -7
  1053. package/llms/components/lr-textarea.md +1 -1
  1054. package/llms/components/lr-thinking-panel.md +4 -2
  1055. package/llms/components/lr-timeline-item.md +2 -1
  1056. package/llms/components/lr-timeline.md +2 -1
  1057. package/llms/components/lr-toast-item.md +8 -2
  1058. package/llms/components/lr-toast.md +8 -2
  1059. package/llms/components/lr-token-input.md +7 -5
  1060. package/llms/components/lr-tool-approval-dialog.md +6 -7
  1061. package/llms/components/lr-tool-param-form.md +21 -9
  1062. package/llms/components/lr-tool-select-dialog.md +11 -7
  1063. package/llms/components/lr-tool-timeline.md +6 -1
  1064. package/llms/components/lr-tooltip.md +12 -1
  1065. package/llms/components/lr-tour.md +19 -16
  1066. package/llms/components/lr-trace-tree.md +3 -0
  1067. package/llms/components/lr-tree-node.md +12 -3
  1068. package/llms/components/lr-tree.md +11 -2
  1069. package/llms/components/lr-widget.md +5 -3
  1070. package/llms/components/lr-word-cloud.md +7 -4
  1071. package/llms/components/lr-xml-viewer.md +4 -2
  1072. package/llms/index.md +1 -1
  1073. package/llms/peers.md +1 -1
  1074. package/llms-full.txt +836 -336
  1075. package/package.json +10 -5
  1076. package/vscode-css-data.json +429 -2
  1077. package/vscode-html-data.json +126 -123
  1078. package/web-types.json +379 -137
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
 
@@ -7056,6 +7125,51 @@ value means no debounce at all: every keystroke commits immediately. A pending d
7056
7125
  keystroke can never overwrite a reset or fire after teardown. `debounce` is ignored for every other
7057
7126
  `type`, whose commits are discrete choices with nothing to debounce.
7058
7127
 
7128
+ ### Custom controls
7129
+
7130
+ Use `type: 'custom'` when an existing Lyra control does not fit the built-in filter types. Provide a
7131
+ `custom` object with a `render(context)` function and an `adapter`. The renderer owns the control's
7132
+ markup and should bind the context's `value`, `disabled`, `required`, and `errorText` as appropriate;
7133
+ `context.onValueChange` (or its `onInput`/`onChange` aliases) reads the event through
7134
+ `adapter.valueFromEvent` and commits it to the filter bar. `context.setValue(value)` is available for
7135
+ controls that expose a value without an event payload, and `context.onFocusout` marks the filter
7136
+ touched for required validation.
7137
+
7138
+ The adapter's optional `emptyValue` is used when the active chip is removed, and its optional
7139
+ `formatValue` controls the chip's display text. Custom values may be strings, string arrays,
7140
+ booleans, or `undefined`, so controls such as `lr-time-range`, `lr-checkbox`, and an async-backed
7141
+ `lr-combobox` can participate in the same controlled `value`, active-chip, reset, disabled, and
7142
+ validation contract:
7143
+
7144
+ ```ts
7145
+ const filters: FilterBarFilterDefinition[] = [
7146
+ {
7147
+ id: 'archived',
7148
+ label: 'Include archived',
7149
+ type: 'custom',
7150
+ custom: {
7151
+ adapter: {
7152
+ valueFromEvent: (event) =>
7153
+ (event as CustomEvent<{ checked: boolean }>).detail.checked,
7154
+ emptyValue: false,
7155
+ formatValue: (value) => value === true ? 'Enabled' : 'Disabled',
7156
+ },
7157
+ render: (context) => html`
7158
+ <lr-checkbox
7159
+ ?checked=${context.value === true}
7160
+ ?disabled=${context.disabled}
7161
+ @lr-change=${context.onValueChange}
7162
+ @focusout=${context.onFocusout}
7163
+ >${context.label}</lr-checkbox>
7164
+ `,
7165
+ },
7166
+ },
7167
+ ];
7168
+ ```
7169
+
7170
+ The custom renderer returns a Lit `TemplateResult`; the filter bar places it in its
7171
+ `filter-control` part and re-renders it whenever the controlled value or validation state changes.
7172
+
7059
7173
  # Overlays, status & feedback (`components/overlays/`)
7060
7174
 
7061
7175
  ## `lr-toast` / `lr-toast-item` / `toast()`
@@ -7156,12 +7270,18 @@ at another, since `placement` is a per-call option rather than a single global r
7156
7270
  - the close button's accessible name is derived from the toast's own message text (`"Close: <first
7157
7271
  40 chars>…"`, falling back to bare `"Close"` only when the toast has no text content) rather than
7158
7272
  a bare `"Close"` on every instance — useful when several toasts are stacked and a screen-reader or
7159
- 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.
7160
7276
  - pause/resume-on-hover/focus (the component's main accessibility differentiator), including the
7161
7277
  independent-hover-vs-focus pause reasons above, now has regression test coverage.
7162
7278
  - `hide()` is idempotent (a second call while already hiding is a no-op) and `[part="close-button"]`
7163
7279
  gets `aria-disabled="true"` once hiding starts, so a stray extra click/Enter during the hide
7164
- 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.
7165
7285
  - Prefer the `toast()` helper over manually creating `<lr-toast>`/`<lr-toast-item>` — it already
7166
7286
  handles the singleton-region and remount-if-removed logic.
7167
7287
 
@@ -7324,8 +7444,9 @@ hand-building that chrome isn't worth it.
7324
7444
 
7325
7445
  Also settable as a plain `aria-label` attribute (not a public JS property): overrides the panel's
7326
7446
  computed accessible name outright, winning over every other source below (a slotted heading,
7327
- `heading`, `label`) — matching `<lr-date-input>`'s `accessibleLabel` pattern. Left unset, the
7328
- 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.
7329
7450
 
7330
7451
  **Methods:** `close(reason: DialogCloseReason = 'api'): void` — closes the dialog, emits
7331
7452
  `lr-dialog-close` with `reason`, and returns focus to whatever had it right before the dialog
@@ -7337,8 +7458,10 @@ own `close()` (a consumer's own cleanup code, a parent re-render that drops it);
7337
7458
  whatever a caller passes (e.g. a footer Cancel button calling `dlg.close('cancel')`, or `confirm()`'s
7338
7459
  own `'confirm'`/`'cancel'`).
7339
7460
 
7340
- **Events:** `lr-dialog-close` (`detail: DialogCloseReason`) — fired on every dismissal path
7341
- (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.
7342
7465
 
7343
7466
  **Stacking:** participates in the shared per-document overlay stack described above. A dialog can be
7344
7467
  stacked with another dialog or any other modal family; only the visually topmost overlay receives
@@ -7388,19 +7511,20 @@ clipped; the viewport is still a hard limit either way), plus shared tokens `--l
7388
7511
 
7389
7512
  Accessible name / visible header, in priority order: (0) if the host element itself has an
7390
7513
  `aria-label` attribute set, its value becomes `aria-label` on the panel outright, overriding every
7391
- source below (including a slotted heading) and suppressing the visible header/`heading` row and the
7392
- sr-only `label` element from rendering at all the standard ARIA convention for a consumer that
7393
- wants full control over the announced name regardless of whatever `heading`/`label` props are also
7394
- 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
7395
7517
  `[role="heading"]`) is a *direct child* (not inside `slot="footer"`), its text content becomes
7396
7518
  `aria-label` on the panel — takes priority over `heading` below so an existing consumer that already
7397
7519
  slots its own heading keeps rendering it exactly as before; (2) otherwise, when `heading` is set, a
7398
7520
  visible header row (`[part="header"]`) renders containing that text (`[part="heading"]`), which
7399
7521
  becomes the `aria-labelledby` target; (3) otherwise, when `label` is set, an invisible (`.sr-only`,
7400
7522
  exposed as the `label` part) element carrying that text is rendered inside the panel and
7401
- `aria-labelledby` points at it instead. Only one of cases 2/3 ever renders at a time. `label` itself
7402
- never renders visible chrome on its own `::part(label)` can be restyled to make the sr-only text
7403
- 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.
7404
7528
  The slotted-heading case (1) deliberately uses `aria-label` (a copied string) rather than
7405
7529
  `aria-labelledby` pointing at the heading's `id`, because the heading is light-DOM content while
7406
7530
  `[part="panel"]` lives in shadow DOM and an ID-reference attribute can't resolve across that
@@ -7410,9 +7534,8 @@ root it labels.
7410
7534
  **Known gotchas:**
7411
7535
  - `role="dialog"`/`aria-modal="true"` are only present on `[part="panel"]` while `open` is `true` —
7412
7536
  inspecting closed markup won't show them.
7413
- - Heading detection only rescans on `slotchange`, not on every render — mutating an already-slotted
7414
- heading's `textContent` in place (rather than replacing the node) won't retroactively update
7415
- `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.
7416
7539
  - Only *direct* children are scanned for a heading — one nested several layers deep, or inside a
7417
7540
  slotted custom element's own shadow root, is left to the consumer to label explicitly via `label`.
7418
7541
  - A reconnect that preserves the same element instance (e.g. a drag-and-drop reparent) resumes its
@@ -7459,7 +7582,8 @@ used is still a `--lr-*` token reference, never a raw literal.
7459
7582
  - Every dismissal path (confirm button, cancel button, Escape, backdrop click) funnels through
7460
7583
  `<lr-dialog>`'s own `close()`/`lr-dialog-close` event, so there is exactly one place that
7461
7584
  resolves the promise and tears the dialog down — a consumer never needs to (and shouldn't) call
7462
- `.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()`.
7463
7587
  - The neutral confirm button pairs `--lr-color-on-brand` with `--lr-color-brand`; the danger
7464
7588
  tone pairs `--lr-color-on-danger` with `--lr-color-danger`. Each token chains through Web
7465
7589
  Awesome's matching `*-on-loud` semantic role and has contrast-tested standalone light/dark
@@ -7626,7 +7750,9 @@ library-wide `--lr-color-text` token. Left unset, rendering is unchanged. Otherw
7626
7750
  Since CSS alone can't parameterize `:nth-child` on a runtime prop, `<lr-chip-group>` reaches
7627
7751
  directly into the light DOM and sets each excess child's own `hidden` property once `max-visible` is
7628
7752
  exceeded — the same approach `<lr-split>` uses to set each panel's inline `flex`/`order`, rather
7629
- 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.
7630
7756
 
7631
7757
  **Known gotchas:**
7632
7758
  - `<lr-chip>`'s accessible remove-button label ("Remove {text}") is computed only from the default
@@ -7673,8 +7799,9 @@ resolves a full `keys` string with the same optional localization callback.
7673
7799
  **Slots:** default — an escape hatch for fully custom key-cap content (e.g. an icon instead of a
7674
7800
  text glyph). When it has any real (non-whitespace) content, it replaces the `keys`-driven rendering
7675
7801
  entirely and this component stops *computing* its own `aria-label` from `keys`, leaving the slotted
7676
- content to carry its own accessible name a host-supplied `aria-label` attribute is still forwarded
7677
- 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.
7678
7805
 
7679
7806
  **CSS parts:** `base` (the chip root), `key` (one per rendered token).
7680
7807
 
@@ -7727,7 +7854,8 @@ track ancestor scroll/resize against — pass `rect.contextElement` (a real, sti
7727
7854
  near the virtual point) when one is available to give it something to observe; otherwise, or when
7728
7855
  the anchor point moves on its own (e.g. a graph pan/zoom tick), re-call `showAt()` with fresh
7729
7856
  coordinates to re-anchor — the popover stays open across such a call. A popover that never calls
7730
- `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.
7731
7859
  `hide(options?: { focusTrigger?: boolean })` programmatically closes the popover; pass
7732
7860
  `{ focusTrigger: false }` to opt out of focus restoration. By default, `hide()`, Escape, light
7733
7861
  dismiss, and a bare `el.open = false` all return focus to the slotted trigger, or to a virtual
@@ -7749,7 +7877,8 @@ contextElement? }, options?: { returnFocusTo?: HTMLElement })` — same virtual-
7749
7877
  Escape returns focus to `options.returnFocusTo` or skips focus-return, re-call with fresh
7750
7878
  coordinates to re-anchor a moving point). Opens immediately, bypassing `delay`/`manual` (both are
7751
7879
  hover-debounce concerns for a slotted trigger, not a deliberate programmatic call); close it the
7752
- 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.
7753
7882
  **CSS parts:** `trigger`, `popup`. **Themeable custom properties:** `--lr-tooltip-max-inline-size`
7754
7883
  (default `--lr-size-20rem`), `--lr-tooltip-background` (default `--lr-color-neutral`), and
7755
7884
  `--lr-tooltip-color` (default `--lr-color-on-neutral`).
@@ -7762,6 +7891,16 @@ intentionally leaves the internal control's serialized `aria-describedby` value
7762
7891
  author-provided descriptions are merged while open and restored when the trigger is replaced or
7763
7892
  the tooltip disconnects.
7764
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
+
7765
7904
  **`showAt()` composed with `lr-graph`** — anchoring a popover to a clicked graph node. Note:
7766
7905
  `lr-graph.getNodePosition()` and the `lr-node-click` event's `{ x, y }` are in the graph's own
7767
7906
  *local drawing space* (pre pan/zoom), not viewport pixels, so they can't be passed to `showAt()`
@@ -7807,7 +7946,9 @@ names `[part="base"]`'s `role="status"`; unset falls back to the localized "Load
7807
7946
  **Events:** none.
7808
7947
 
7809
7948
  **Slots:** default — optional label text. `label-placement="after"` renders it inline next to the
7810
- 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.
7811
7952
 
7812
7953
  **CSS parts:** `base` (the `role="status"` wrapper), `spinner` (the animated ring; `aria-hidden`),
7813
7954
  `label` (the default-slot wrapper).
@@ -7824,7 +7965,8 @@ A determinate or indeterminate progress bar.
7824
7965
  **Properties:** `value`, `max`, `indeterminate`, `variant`, `showValue` (`show-value`), and
7825
7966
  `accessibleLabel` (`accessible-label`).
7826
7967
  The rendered progressbar exposes `aria-valuemin`, `aria-valuemax`, and `aria-valuenow` when
7827
- 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.
7828
7970
 
7829
7971
  **Slots:** `label`. **CSS parts:** `base`, `track`, `indicator`, `label`.
7830
7972
  **Themeable custom properties:** `--lr-progress-height` (default `var(--lr-size-0-5rem)`) — the
@@ -7840,7 +7982,8 @@ A circular progress indicator with the same value contract as `lr-progress-bar`.
7840
7982
 
7841
7983
  **Properties:** `value: number = 0`, `max: number = 100`, `indeterminate: boolean = false`
7842
7984
  (reflected), and `accessibleLabel: string = ''` (attribute `accessible-label`; unset falls back to
7843
- 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
7844
7987
  back to `100`, `value` clamps to `[0, max]`) rather than producing NaN geometry.
7845
7988
  **Slots:** default — replaces the built-in center label, which otherwise renders the rounded
7846
7989
  percentage (and nothing at all while `indeterminate`).
@@ -7910,9 +8053,15 @@ A keyboard-accessible star rating control with slider semantics. **Properties:**
7910
8053
  `lr-change` with `{ value }`. **CSS parts:** `base`, `star`, `star-fill` (the filled overlay
7911
8054
  inside each star, clipped to the fractional `precision` value). **Themeable custom properties:**
7912
8055
  `--lr-rating-fill` (default `--lr-color-warning` — filled-star color), `--lr-rating-empty-color`
7913
- (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
7914
8058
  `--lr-font-size-xl` — star size).
7915
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
+
7916
8065
  **Additional API surface:**
7917
8066
 
7918
8067
  - `blur()` — Forwards host blur to the internal rating control.
@@ -7997,7 +8146,7 @@ Package-level CSV utilities (used internally, also exported for standalone use
7997
8146
  escapeCsvField, buildCsv, downloadBlob } from
7998
8147
  '@aceshooting/lyra-ui/components/utility/export-button/csv.js'`):
7999
8148
  ```ts
8000
- 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
8001
8150
  buildCsv(rows: Record<string, unknown>[], columns: CsvColumn[]): string // CRLF-joined, header row included
8002
8151
  downloadBlob(content: string, filename: string, mime: string): void // triggers a browser download
8003
8152
  ```
@@ -8009,6 +8158,10 @@ downloadBlob(content: string, filename: string, mime: string): void // trig
8009
8158
  for that handler, not automatic filename handling.
8010
8159
  - CSV formula-injection guarding and the deferred (5s) `URL.revokeObjectURL` (works around Safari
8011
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__`.
8012
8165
  - the multi-format menu (`role="menu"`) supports full arrow-key navigation — ArrowUp/ArrowDown move
8013
8166
  between items (opening the menu and seeding the right one focused, if it was closed), Home/End
8014
8167
  jump to the first/last item once open, Escape closes it and returns focus to the trigger button,
@@ -8058,6 +8211,8 @@ buttons, this has no code/JSON content model to adopt just to reuse the copy aff
8058
8211
  - best-effort clipboard write: `navigator.clipboard` is absent in insecure contexts/older browsers,
8059
8212
  and some engines throw synchronously rather than rejecting — either way `lr-copy` still fires
8060
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.
8061
8216
 
8062
8217
  **Additional API surface:**
8063
8218
 
@@ -8124,7 +8279,9 @@ stack overflow on cyclic `data`.
8124
8279
  - `collapsedDepth?: number` (attribute `collapsed-depth`) — nodes at or beyond this nesting depth
8125
8280
  (root = `0`) start collapsed; omitted/`undefined` means nothing auto-collapses
8126
8281
  - `maxHeight: string = ''` (attribute `max-height`) — a CSS length (e.g. `"20rem"`); once set, the
8127
- 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
8128
8285
  - `copyable: boolean = false` (reflected) — shows copy-to-clipboard affordances: one for the whole
8129
8286
  value, plus one per node
8130
8287
  - `search: string = ''` — case-insensitive substring match against keys/values; matches are
@@ -8151,7 +8308,8 @@ search query, match count, or active-match cursor changes, from `runSearch()`/`s
8151
8308
 
8152
8309
  **CSS parts:** `base` (root scroll container, respects `max-height`), `toolbar` (wrapper around the
8153
8310
  top-level copy button, only rendered when `copyable`), `tree` (wrapper around the rendered node
8154
- 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`,
8155
8313
  `data-active` while it is the current `searchNext()`/`searchPrevious()` cursor position),
8156
8314
  `value` (a primitive value's text — carries `data-type` of
8157
8315
  `string`/`number`/`boolean`/`null`/`undefined`/`circular` for per-type coloring, `data-match`
@@ -8169,6 +8327,8 @@ until `max-height` is set), `--lr-json-viewer-font` (default `var(--lr-font-mono
8169
8327
  box-shadow, of a key/value that currently matches `search`. Component-scoped indirection over the
8170
8328
  shared `--lr-color-warning-quiet` token, so a consumer can retheme just this search-match highlight
8171
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;
8172
8332
  `--lr-json-viewer-active-outline` (default `var(--lr-focus-ring-color)`) — outline color for the
8173
8333
  current imperative search match; `--lr-json-viewer-string-color` (default
8174
8334
  `var(--lr-color-success)`), `--lr-json-viewer-number-color` (default `var(--lr-color-brand)`),
@@ -8207,6 +8367,8 @@ html`<lr-json-viewer .data=${apiResponse} copyable max-height="24rem" search=${q
8207
8367
  a different shape.
8208
8368
  - Per-node copy buttons call `stopPropagation()` on click so clicking one doesn't also toggle the
8209
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.
8210
8372
 
8211
8373
  ---
8212
8374
 
@@ -8325,6 +8487,9 @@ accessible phase-transition announcements.
8325
8487
  `paused`), `lr-pause-change` (`detail: boolean` — fired when `paused` changes via the built-in
8326
8488
  button).
8327
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
+
8328
8493
  **Slots:** none.
8329
8494
 
8330
8495
  **CSS parts:** `base`, `indicator` (the pulsing status dot), `countdown` (the `M:SS`, or
@@ -8351,14 +8516,16 @@ repainting every other component that reuses the same shared success token. Plus
8351
8516
 
8352
8517
  Internally, a 1-second ticker re-derives the remaining time from a captured target timestamp (rather
8353
8518
  than a naive per-tick decrement), so the countdown stays accurate even if the tab was backgrounded
8354
- and timers were throttled. Reassigning `nextInMs` at any time restarts the countdown from that new
8355
- value; pausing/resuming, or toggling `active`, starts or stops the ticker without discarding the
8356
- current remaining time. Phase transitions ("Paused.", "Resumed.", "Refreshing now.") are announced
8357
- 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.
8358
8525
 
8359
8526
  **Known gotchas:**
8360
- - there's no built-in "reset" or "extend" method beyond reassigning `nextInMs` a host that wants to
8361
- 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.
8362
8529
  - `active="false"` and `paused` both stop the ticker independently, but only `paused` fires
8363
8530
  `lr-pause-change` — that event is scoped to the built-in pause button's own toggle, not to
8364
8531
  `active`.
@@ -8513,8 +8680,11 @@ fresh `query` is the proxy for "the caret may have moved").
8513
8680
  - A caret that moves for a reason other than typing (e.g. a mouse click elsewhere in the text while
8514
8681
  the popover happens to still be open) is not separately tracked — force a re-measure by toggling
8515
8682
  `open` or reassigning `anchor`.
8516
- - `activeIndex` resets to `0` whenever `query` or `items` changes, but not when only `anchor`
8517
- 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.
8518
8688
  - There's no persisted "selection" the way `<lr-combobox>`'s own listbox has one — a mention is
8519
8689
  either committed (closing the popover) or dismissed with nothing chosen. `aria-selected="true"`
8520
8690
  here marks whichever row is currently *active* (what Enter/Tab would commit right now, per the
@@ -8598,6 +8768,7 @@ consumer can compute or unit-test the same alignment without instantiating the e
8598
8768
  explicit performance-risk opt-out.
8599
8769
  - the computed `diffOps` state is cached and recomputed only when `oldText`, `newText`, or
8600
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.
8601
8772
 
8602
8773
  **Additional API surface:**
8603
8774
 
@@ -8627,7 +8798,9 @@ Dependency-free SVG path icon: no icon font, no sprite sheet, no network fetch.
8627
8798
  **Slots:** (default) — custom SVG geometry, rendered only when neither `path` nor a known `name`
8628
8799
  resolves. Slotted nodes are cloned into the component-owned `<svg>` (Chromium does not paint SVG
8629
8800
  geometry distributed through a slot that sits inside an SVG), so pass plain `<path>`/`<circle>`/
8630
- `<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.
8631
8804
 
8632
8805
  **CSS parts:** `svg`
8633
8806
 
@@ -8637,7 +8810,8 @@ the surrounding text with no configuration.
8637
8810
 
8638
8811
  ## `lr-divider`
8639
8812
 
8640
- 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.
8641
8815
 
8642
8816
  **Properties:** `orientation: 'horizontal' | 'vertical' = 'horizontal'` (reflected).
8643
8817
 
@@ -8665,6 +8839,9 @@ empty, which means "the runtime's default locale". Every `Intl` instance is pull
8665
8839
  memoized `internal/intl-cache.ts` (one instance per locale + options pair, LRU-capped), so these are
8666
8840
  cheap to use per row in a large table or feed.
8667
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
+
8668
8845
  **Properties:**
8669
8846
  - `value: number = 0`
8670
8847
  - `currency: string = ''` — an ISO 4217 code (`'EUR'`, `'JPY'`). Non-empty switches the formatter to
@@ -8719,7 +8896,8 @@ name is localized too. Text-only host — no CSS parts, events, or own tokens; l
8719
8896
 
8720
8897
  The unit ladder is fixed at `byte`, `kilobyte`, `megabyte`, `gigabyte`, `terabyte`, `petabyte` and
8721
8898
  saturates at the top; the index is `floor(log|value| / log(unitStep))`, and `0` always formats as
8722
- 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
8723
8901
  `log(1) === 0`) falling back to `1024`; `decimals` is clamped to `[0, 10]` — an out-of-range value
8724
8902
  would otherwise throw a `RangeError` from `maximumFractionDigits`. Note that `unitStep: 1024` still
8725
8903
  prints the SI-named `kB`/`MB` units, not `KiB`/`MiB` — `Intl` has no binary unit names.
@@ -8778,7 +8956,8 @@ field currently has focus.
8778
8956
 
8779
8957
  **Events:** `input` (every keystroke), `change` (a field blur where the composite value newly
8780
8958
  transitioned), plus re-dispatched bubbling/composed `focus` and `blur` (`blur` fires once when focus
8781
- 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
8782
8961
  `{ value, day, month, year, field }` — `value` is the canonical ISO date or `''`, `day`/`month`/`year`
8783
8962
  are the live raw typed text, and `field` is `'day' | 'month' | 'year'`, whichever was last edited.
8784
8963
 
@@ -8897,6 +9076,8 @@ directional `fade-*` effects).
8897
9076
  - The host is `display: block`. For an inline text-fragment swap inside a sentence, override
8898
9077
  `lr-random-content { display: inline; }` from outside; `display: contents` is deliberately not
8899
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.
8900
9081
 
8901
9082
  ## `lr-tour`
8902
9083
 
@@ -8911,8 +9092,8 @@ controls and a step-progress indicator. Controlled component — `steps` is neve
8911
9092
  `start()`/`end()`
8912
9093
  - `steps: TourStep[] = []` (attribute: false) — empty renders nothing
8913
9094
  - `activeIndex: number = 0` (attribute `active-index`, reflected) — clamped to
8914
- `[0, steps.length - 1]`, including for a direct property/attribute write that bypasses
8915
- `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`
8916
9097
  - `placement: Placement = 'bottom'` (reflected) — tour-level Floating UI default, overridable per
8917
9098
  step; resolved through `rtlAwarePlacement()`
8918
9099
  - `distance: number = 12` — px offset between target and popover. Tour-level only (no per-step
@@ -8929,9 +9110,11 @@ controls and a step-progress indicator. Controlled component — `steps` is neve
8929
9110
  **Exported types:** `TourStep { id: string; target: TourTarget; heading: string; content?: string;
8930
9111
  placement?: Placement; spotlightPadding?: number; interactiveTarget?: boolean; hidePrevious?: boolean }`;
8931
9112
  `TourTarget = string | HTMLElement | (() => HTMLElement | null)` — a string resolves via
8932
- `ownerDocument.querySelector` (top-level light DOM only), and every form is re-resolved on each step
8933
- activation, never cached, so a target mounted later still resolves. `heading` is required and
8934
- 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).
8935
9118
  `TourEndReason = 'completed' | 'skip' | 'escape' | 'api' | 'unmount' | (string & {})`.
8936
9119
 
8937
9120
  **Methods:** `start(index = 0)` (clamps, opens, emits `lr-tour-start`), `next()` (on the last step
@@ -8953,8 +9136,9 @@ step: a consumer needing different rich content per step swaps the slotted child
8953
9136
 
8954
9137
  **CSS parts:** `backdrop` (the full-viewport `<svg>` scrim with the cutout, `aria-hidden`),
8955
9138
  `spotlight` (the decorative ring around the padded target rect, `pointer-events: none`),
8956
- `popover` (the step panel, `role="dialog" aria-modal="true"`, `data-unanchored` when the target
8957
- 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`),
8958
9142
  `progress` (wrapper), `progress-text` (the "Step X of Y" text — an `aria-describedby` target),
8959
9143
  `progress-dot` (one decorative dot per step, `data-current` on the active one, `aria-hidden`),
8960
9144
  `footer` (the control row), `previous-button`, `skip-button`, `next-button` (the Next control's
@@ -8979,23 +9163,23 @@ rather than per component.
8979
9163
  **Known gotchas:**
8980
9164
  - By default the spotlighted target is **non-interactive**: it stays visible and announceable (not
8981
9165
  `inert`, not `aria-hidden`) but every pointer event over the viewport is captured by the backdrop.
8982
- Set `step.interactiveTarget` to clip the backdrop around the target so clicks fall through that
8983
- restores pointer reachability only. The focus trap still confines Tab to the popover regardless,
8984
- so for a keyboard-reachable demonstrated interaction have the app's own listener call `next()`.
8985
- - Uses the overlay manager with `modal: false` deliberately: `modal: true` would mark the whole page
8986
- (including the target, which lives outside this element) `inert`. `role="dialog"` +
8987
- `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.
8988
9170
  - Each step transition mounts a genuinely new popover node (keyed on `step.id`) so focus reliably
8989
9171
  re-enters the panel — don't cache a reference to `[part="popover"]` across steps.
8990
9172
  - No `Home`/`End` shortcut and no click-to-jump progress dots (unlike `lr-stepper`): later steps may
8991
9173
  depend on an earlier step's side effect having run. `goToStep()` is available for a caller that
8992
9174
  knows better. ArrowRight/ArrowLeft do move between steps (swapped under RTL), except while focus
8993
9175
  is in an `input`/`textarea`/`contenteditable` inside slotted content.
8994
- - A direct `HTMLElement` target is re-checked for `isConnected` on every activation and treated as
8995
- missing if it was remounted — prefer a selector string or resolver function for targets that can
8996
- 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.
8997
9179
  - The active step's target is `scrollIntoView({ block: 'center' })`'d on activation, smoothly unless
8998
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`.
8999
9183
 
9000
9184
  # Media, files & maps (`components/media/`)
9001
9185
 
@@ -9254,7 +9438,9 @@ and additive plain-GeoJSON `dataLayers`, plus a raw `map` escape hatch for anyth
9254
9438
  content, sanitize anything derived from user input first; prefer `label` (`Popup.setText()`,
9255
9439
  escaped) when the content is plain text. A marker whose `color` changes for a persisting `id`
9256
9440
  can't be recolored in place (no `Marker.setColor()`) and is torn down/reconstructed instead — see
9257
- 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.
9258
9444
  - `dataLayers: GeoJsonDataLayer[] = []` (attribute: false) — `GeoJsonDataLayer { sourceId: string;
9259
9445
  geojson: GeoJSON.Feature | GeoJSON.FeatureCollection; tone?: 'accent' | 'success' | 'warning' |
9260
9446
  'danger' | 'neutral' }`. Each entry adds one GeoJSON source plus three layers
@@ -9266,10 +9452,9 @@ and additive plain-GeoJSON `dataLayers`, plus a raw `map` escape hatch for anyth
9266
9452
  is: an entry whose `sourceId` persists across a `dataLayers` reassignment gets its GeoJSON updated
9267
9453
  in place (`setData()`), one that's dropped has its source/layers removed, and a genuinely new
9268
9454
  `sourceId` gets a new source/layers — nothing leaks on removal, style change, or disconnect.
9269
- - `label: string = ''` — accessible name for the map region, applied as `[part="base"]`'s
9270
- `aria-label`. A plain `aria-label` attribute on the host itself is honored as a fallback when
9271
- `label` is left unset, matching `lr-slider`/`lr-checkbox`/`lr-switch`; with neither set, it
9272
- 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.
9273
9458
 
9274
9459
  **Getters:** `map` → the raw `maplibregl.Map` instance.
9275
9460
 
@@ -9328,6 +9513,10 @@ https://maplibre.org/maplibre-gl-js/docs/#esm.
9328
9513
  layer/source maplibre-gl knows about.
9329
9514
  - Point markers now have a declarative API (`markers`, above) with popup support — the `.map` escape
9330
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.
9331
9520
  - a marker whose `color` changes for a persisting `id` is torn down and reconstructed (maplibre-gl's
9332
9521
  `Marker` has no `setColor()`) rather than mutated in place — this also closes any popup the user
9333
9522
  currently has open on that marker (a fresh, closed `Popup` is built for the new instance); an
@@ -9402,10 +9591,14 @@ file can be selected at a time.'`), and — for `'directory'` — the pre-existi
9402
9591
  itself. The region is cleared (and unrendered) as soon as a subsequent selection rejects nothing.
9403
9592
 
9404
9593
  **Slots:** default slot — custom dropzone content, overrides the `label` attribute text when
9405
- provided. The accessible name always comes from `label` regardless, so icon-only slot content still
9406
- announces correctly.
9407
-
9408
- **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"`
9409
9602
  element carrying the drag accept/reject announcement and the aggregate accepted/rejected count),
9410
9603
  `rejection` (a **visible** `role="alert"` region, rendered only while a rejection exists, listing
9411
9604
  each currently-rejected file next to a per-reason message — in addition to, never in place of, the
@@ -9680,7 +9873,9 @@ type wins; filename extension fallback is used only for an empty or `application
9680
9873
  MIME type. Unknown values return a generic file result.
9681
9874
 
9682
9875
  **Properties:** `mimeType` (attribute `mime-type`), `name`, `size` (bytes; `0` renders no size),
9683
- `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.
9684
9879
 
9685
9880
  **CSS parts:** `base`, `icon`, `label`, and `size`.
9686
9881
 
@@ -9717,7 +9912,9 @@ final.
9717
9912
  - `maxHeight: string = ''` (attribute `max-height`) — a CSS length (e.g. `"16rem"`); once set,
9718
9913
  overrides the `--lr-media-card-max-height` custom property for this instance only (applied
9719
9914
  inline on `[part="base"]`, so it reliably wins over a `:host{}`-declared default from outside the
9720
- 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.
9721
9918
  - `appearance: 'card' | 'plain' = 'card'` (reflected) — visual chrome, mirroring
9722
9919
  `<lr-source-card>`'s `appearance` vocabulary. `'card'` (the default) keeps the bordered, filled
9723
9920
  box. `'plain'` removes `[part="base"]`'s border, background, padding, and corner radius, so a
@@ -9819,10 +10016,10 @@ capability as a row.
9819
10016
  attribute.
9820
10017
  - `disabled: boolean = false` (reflected)
9821
10018
  - `triggerLabel?: string` (attribute `trigger-label`) — overrides the single-capability trigger
9822
- button's `aria-label`, which otherwise comes from `CAPABILITY_META[capability].triggerLabel` (e.g.
9823
- `'Attach files'`); only affects the single-capability button (`[part='trigger']`) — the
9824
- multi-capability menu's own trigger keeps its fixed `'Add attachment'` label regardless. Unset
9825
- (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.
9826
10023
  - `triggerTitle?: string` (attribute `trigger-title`) — forwards a sighted-user hover tooltip to
9827
10024
  both the single-capability and multi-capability trigger buttons
9828
10025
 
@@ -9835,8 +10032,8 @@ default) — fired when the `camera` / `audio` capability is activated; this com
9835
10032
  capture UI of its own, the host owns everything from here (there's no single right answer for
9836
10033
  `getUserMedia` vs. `<input capture>` vs. a native wrapper's own camera API; for `audio` the
9837
10034
  typical host response is opening `<lr-push-to-talk>` in an overlay, then handing the resulting
9838
- blob to `<lr-attachment-chip>`). Internal `focus`/`blur` from the hidden input are re-emitted as
9839
- 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.
9840
10037
 
9841
10038
  **Slots:** none — capabilities are configured entirely via the `capabilities` prop.
9842
10039
 
@@ -9873,6 +10070,8 @@ hidden via CSS by default, exposed as a part only so a consumer can override tha
9873
10070
  - The `camera`/`audio` capabilities never touch the hidden `<input type="file">` at all — both are
9874
10071
  scope-limited by design to firing `lr-camera-request`/`lr-audio-request` and nothing else. The
9875
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.
9876
10075
 
9877
10076
  **Additional API surface:**
9878
10077
 
@@ -9906,10 +10105,10 @@ it in a `<button>`/`<lr-menu>` trigger for a user-menu affordance.
9906
10105
 
9907
10106
  **Events:** none.
9908
10107
 
9909
- **Slots:** default slot — icon/glyph content (e.g. an inline SVG), shown in place of the image and
9910
- initials, e.g. to mark a chat avatar as "AI" vs. "user" with a role glyph. Takes priority over both
9911
- `src` and `initials`. The glyph is treated as decorative (`aria-hidden`) — set `alt` alongside it
9912
- 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.
9913
10112
 
9914
10113
  **CSS parts:** `base` (the outer circle/square container), `icon` (wrapper around the slotted
9915
10114
  icon/glyph, only shown while the slot has assigned content), `image` (the `<img>`, only rendered
@@ -9938,7 +10137,8 @@ override it on the element for a size the built-in scale doesn't cover. Plus sha
9938
10137
 
9939
10138
  **Known gotchas:**
9940
10139
  - an image load failure falls back to `initials` automatically. Changing `src` clears the failure
9941
- 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.
9942
10142
  - when `alt` or host `aria-label` supplies a name, the base preserves that name through the
9943
10143
  initials fallback while hiding duplicate initials text from assistive technology.
9944
10144
 
@@ -9998,6 +10198,8 @@ backgrounded circle around the button; only rendered once loaded and error-free)
9998
10198
  - both `image` and `canvas` stay mounted at all times (never `display: none`/removed) so the
9999
10199
  browser's native decode loop keeps running while visually covered; only opacity and `aria-hidden`
10000
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.
10001
10203
 
10002
10204
  **Additional API surface:**
10003
10205
 
@@ -10034,7 +10236,7 @@ Declaratively animates one slotted element through the native Web Animations API
10034
10236
  `threshold: number | number[] = 0` (both attribute: false) plus `rootMargin: string = '0px'`
10035
10237
  (attribute `root-margin`) configure that observer.
10036
10238
  - `currentTime: number` — the underlying `Animation.currentTime` (`0` when no animation exists);
10037
- writable, forwarded to the animation when one exists.
10239
+ writable, forwarded to the animation when one exists. Non-finite assignments are ignored.
10038
10240
 
10039
10241
  **Methods:** `start()` (sugar for `play = true` — named `start` because `play` is already a
10040
10242
  property), `pause()` (`play = false`), `finish()`, `cancel()`.
@@ -10107,6 +10309,9 @@ badge label. `size` swaps it per tier (`var(--lr-font-size-xs)` at `sm`, `var(--
10107
10309
  caps read at the same optical weight; override it alongside `--lr-avatar-font-size` on the avatars
10108
10310
  themselves when tuning a custom tier.
10109
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
+
10110
10315
  **Optional peer deps:** none.
10111
10316
 
10112
10317
  ```html
@@ -10144,16 +10349,17 @@ trap, Escape/backdrop dismissal, scroll lock, and focus return.
10144
10349
  event) when `images` shrinks.
10145
10350
  - `loop: boolean = false` (reflected) — wraps prev/next past the ends.
10146
10351
  - `noLightDismiss: boolean = false` (attribute `no-light-dismiss`) — opts out of backdrop dismissal.
10147
- - `showCounter: boolean = true` (attribute `show-counter`) — shows `[part="counter"]` and its
10148
- 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.
10149
10354
  - `minZoom: number = 0.5`, `maxZoom: number = 4`, `zoomStep: number = 0.25` (attributes `min-zoom`/
10150
10355
  `max-zoom`/`zoom-step`) — pure pass-throughs to the embedded `<lr-zoomable-frame>`, which does the
10151
10356
  normalizing.
10152
10357
  - `accessibleLabel: string | null = null` (attribute `aria-label`) — the panel's accessible name,
10153
10358
  overriding the localized `lightboxLabel`.
10154
10359
 
10155
- **Methods:** `next()`, `previous()`, `goTo(index)`, `close(reason?)` — `reason` defaults to `'api'`
10156
- 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.
10157
10363
 
10158
10364
  **Events:** `lr-lightbox-close` (`detail: LyraLightboxCloseReason = 'escape' | 'backdrop' |
10159
10365
  'close-button' | 'api' | 'unmount' | (string & {})`; **cancelable** — `preventDefault()` blocks
@@ -10198,12 +10404,14 @@ photo content.
10198
10404
 
10199
10405
  ## `lr-qr-code`
10200
10406
 
10201
- Renders `value` as a QR code using the optional `qrcode` peer dependency. **Properties:** `value`, `label`,
10202
- `size`, `radius`, and `errorCorrection` (`error-correction`, `L`/`M`/`Q`/`H`). The canvas owns `role="img"`;
10203
- 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.
10204
10411
  **CSS parts:** `base`, `canvas`, `empty`, `loading`, and `error`. **CSS custom properties:**
10205
- `--lr-qr-code-fill` and `--lr-qr-code-background`. Call `refreshTheme()` after external theme changes
10206
- 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.
10207
10415
 
10208
10416
  ## `lr-image-viewer`
10209
10417
 
@@ -10234,6 +10442,11 @@ zoom }`), `lr-rotation-change` (`detail: { rotation }`), `lr-fit-change` (`detai
10234
10442
  embedded `lr-zoomable-frame`), `image-wrapper`, `image`, `highlight-layer`, `highlight` (carries
10235
10443
  `data-tone`/`data-active`), `highlight-label`, `annotation-box`, and `error`.
10236
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
+
10237
10450
  **Themeable custom properties:** `--lr-image-viewer-annotate-active-bg` (default
10238
10451
  `var(--lr-color-brand-quiet)`) and `--lr-image-viewer-annotate-active-border` (default
10239
10452
  `var(--lr-color-brand)`) — the background and border of `[part='annotate-toggle']` while annotation
@@ -10273,9 +10486,17 @@ number[] = []` (attribute: false), and `tracks: LyraAvTrack[] = []` (attribute:
10273
10486
  `LyraAvCue = { id, start, end?, text, speaker? }`; `LyraAvTrack = { src, kind: 'subtitles' |
10274
10487
  'captions' | 'descriptions', srclang, label, default? }`.
10275
10488
 
10276
- **Methods:** `play()`, `pause()`, and `toggle()` proxy the native media element. `seek(seconds)`
10277
- sets `currentTime` and forces an immediate `lr-time-change`. `search(query)` resolves the match
10278
- 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.
10279
10500
 
10280
10501
  **Events:** `lr-play`, `lr-pause`, `lr-load` (`detail: { duration, kind }`), `lr-time-change`
10281
10502
  (`detail: { currentTime }`, throttled to at most 4/s while playing plus one extra per `seek()`),
@@ -10344,9 +10565,12 @@ Chart.js wrapper every other `lr-*-chart` tag subclasses; supports both a simpli
10344
10565
  unknown runtime attribute/property values fall back to `line` before reaching Chart.js
10345
10566
  - `labels: string[] = []` (attribute: false)
10346
10567
  - `datasets: Series[] = []` (attribute: false) — `Series { label: string; data?: (number|null)[];
10347
- 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;
10348
10569
  noTooltip?: boolean; axis?: 'y'|'y2'; pointColors?: string[]; pointRadius?: number|number[];
10349
- 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.
10350
10574
  - `pointRadius` takes a single number (applied to every point) **or** an array matching `data`'s
10351
10575
  length that sizes each point independently — passed straight through to Chart.js, which
10352
10576
  supports both natively. Useful for emphasizing a single outlier or the latest reading without
@@ -10357,7 +10581,11 @@ Chart.js wrapper every other `lr-*-chart` tag subclasses; supports both a simpli
10357
10581
  `segment.borderColor` scriptable option, so it is only meaningful for line-type series.
10358
10582
  Typical use is threshold/anomaly banding along one line. A series that omits it (or passes an
10359
10583
  empty array) emits no `segment` key at all, leaving line rendering exactly as before.
10360
- - `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.
10361
10589
  - `legendPosition: LyraChartLegendPosition = 'top'` (attribute `legend-position`) — places the
10362
10590
  legend at `top`, `right`, `bottom`, or `left`; `auto` chooses right above 480px and bottom below
10363
10591
  that allocation width
@@ -10395,6 +10623,11 @@ Chart.js wrapper every other `lr-*-chart` tag subclasses; supports both a simpli
10395
10623
  - `config?: Partial<ChartConfiguration>` (attribute: false) — deep-merged over the generated
10396
10624
  config; any nested key wins without clobbering sibling generated keys. This is the raw Chart.js
10397
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.
10398
10631
  - `accessibleLabel: string = ''` (attribute `accessible-label`) — canvas name override; a host
10399
10632
  `aria-label` has highest precedence
10400
10633
  - `accessibleDescription: string = ''` (attribute `accessible-description`) — overrides the
@@ -10405,15 +10638,23 @@ Chart.js wrapper every other `lr-*-chart` tag subclasses; supports both a simpli
10405
10638
  canvas-local coordinates (`top`, `left`, `right`, `bottom`, `width`, `height`), when a chart is
10406
10639
  drawn
10407
10640
  - `appendData(label, values, maxPoints?)` — appends one aligned numeric category and optionally
10408
- 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.
10409
10646
 
10410
10647
  **Methods:** `resetZoom()` resets any active zoom/pan to the original view. `refreshTheme()` forces
10411
10648
  a redraw so the `--lr-chart-*` tokens below are re-read from the current computed style. A
10412
10649
  built-in `ThemeWatcher` now calls this automatically when `prefers-color-scheme` flips or an
10413
10650
  ancestor's `class`/`style`/`data-theme`/`data-color-scheme` attribute mutates — the most common
10414
10651
  theme-toggle mechanisms — so a consumer rarely needs to call it by hand; it remains public as the
10415
- escape hatch for theme changes those signals can't observe. `exportData('csv' | 'png')` returns a
10416
- 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.
10417
10658
 
10418
10659
  The instance method `seriesPalette(): string[]` resolves the categorical series ramp
10419
10660
  (`--lr-color-chart-1..8`) through `getComputedStyle` and returns the concrete, theme-aware colors —
@@ -10439,20 +10680,26 @@ const series = [
10439
10680
  ```
10440
10681
 
10441
10682
  **Events:** `lr-zoom` (`detail: { zoomed: boolean }`, fired on zoom-complete and on
10442
- `resetZoom()`), `lr-point-click` (fired when a click lands on, or nearest to — intersect-only —
10443
- a data point/segment, for any chart type, not just bar; `detail: { datasetIndex: number, index:
10444
- 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`.
10445
10688
 
10446
10689
  **Slots:** `data-table` — an optional consumer-provided accessible table alternative; `center` —
10447
10690
  optional overlay content positioned at the chart area's center, useful for doughnut and pie totals.
10448
10691
 
10449
- **CSS parts:** `base`, `canvas`, `reset-zoom-button`, `description`, `data-table`, `center` (the
10450
- chart-area-centered wrapper for the `center` slot), `error` (`role="alert"` message rendered in
10451
- 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)
10452
10697
 
10453
10698
  **Themeable custom properties:** `--lr-chart-height` (set programmatically on the host from the
10454
- `height` property must be read from the host, not a shadow-tree descendant, since custom
10455
- 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)`),
10456
10703
  `--lr-chart-tick-color` (default `var(--lr-color-text-quiet)`), `--lr-chart-legend-color`
10457
10704
  (default `var(--lr-color-text)`), `--lr-chart-tooltip-bg` (default `var(--lr-color-surface)`),
10458
10705
  `--lr-chart-tooltip-text` (default `var(--lr-color-text)`) — each resolved fresh via
@@ -10488,9 +10735,14 @@ subset actually used.
10488
10735
  property values fall back to `line`. Each typed `lr-*-chart` subclass (e.g.
10489
10736
  `llms/components/lr-bar-chart.md`) locks its *own* `type` via a real prototype accessor — a
10490
10737
  genuine runtime lock, not just a compile-time default.
10491
- - a built-in `ThemeWatcher` auto-retheme an already-drawn chart when `prefers-color-scheme` flips or
10492
- an ancestor's `class`/`style`/`data-theme`/`data-color-scheme` attribute mutates (coalesced to one
10493
- 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.
10494
10746
  - generated `scales` are keyed off the *effective* type (`config.type` ?? `type`, see
10495
10747
  `effectiveType()`) and are type-appropriate: no scale at all for `type="pie"`/`"doughnut"` (true of
10496
10748
  `<lr-chart type="pie">` directly, not just the `lr-pie-chart`/`lr-doughnut-chart` subclasses),
@@ -10516,11 +10768,14 @@ subset actually used.
10516
10768
  single redraw fires once it re-enters the viewport). Independently, `updated()` only reaches
10517
10769
  Chart.js when at least one of `type`, `labels`, `datasets`, `legend`, `legendPosition`, the
10518
10770
  internal resolved auto legend position, `valueFormatter`, `area`, `height`, `xLabel`, `yLabel`,
10519
- `y2Label`, `beginAtZero`, `horizontal`, `stacked`, `config`, `zoom`, `locale`, `strings`, or the
10520
- internal loading state actually changed in that update (so an unrelated property/state update, or
10521
- a bare `requestUpdate()`, draws nothing). `refreshTheme()` calls `draw()` directly and is
10522
- unaffected by either gate it always redraws, since a theme change isn't reflected in any tracked
10523
- 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.
10524
10779
  - Chart.js receives `effectiveLocale`; generated summary values use the same locale. Cartesian y/y2
10525
10780
  axes swap logical sides under RTL, and host `aria-label` is forwarded to the canvas and data-table
10526
10781
  caption.
@@ -10540,9 +10795,11 @@ passthrough). Not a subclass of `LyraChart`.
10540
10795
  - `type: LyraLiteChartType = 'bar'` — `'bar' | 'line'`
10541
10796
  - `labels: string[] = []` (attribute: false)
10542
10797
  - `datasets: LiteSeries[] = []` (attribute: false) — `LiteSeries { label: string; data:
10543
- (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
10544
10800
  - `legend: boolean = false`
10545
- - `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
10546
10803
  - `xLabel: string = ''` (attribute `x-label`)
10547
10804
  - `yLabel: string = ''` (attribute `y-label`)
10548
10805
  - `beginAtZero: boolean = true` (attribute `begin-at-zero`)
@@ -10569,16 +10826,19 @@ passthrough). Not a subclass of `LyraChart`.
10569
10826
  - `maxLabels?: number` (attribute `max-labels`, type Number) — decimates which category axis labels
10570
10827
  actually render *text* when `labels.length > maxLabels` (bars themselves are never decimated, only
10571
10828
  their axis `<text>` labels): always shows the first and last label, and roughly evenly distributes
10572
- the rest between them. Works in either `layout` mode. Unset (the default) renders every label,
10573
- 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.
10574
10832
  - `barX?: (index: number) => number` (attribute: false, bar type only) — overrides the internal
10575
10833
  per-category x-origin formula (`plotX + i * slot`) used by both bars and their axis labels, so a
10576
10834
  consumer can pixel-align this chart's bars with a sibling `<lr-heatmap>` calendar's week columns
10577
10835
  (see that component's own `columnX`) by supplying the same coordinate function to both. Unset (the
10578
10836
  default) is the original formula, unchanged.
10579
10837
  - `pointText?: (label: string, value: number, datasetIndex: number) => string` (attribute: false) —
10580
- overrides the per-bar/per-point `<title>`/`aria-label` tooltip text (mirrors `lr-heatmap`'s
10581
- `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.
10582
10842
  - `legendText?: (label: string, datasetIndex: number) => string` (attribute: false) — appends
10583
10843
  formatter-supplied text (e.g. a value or percentage share) after each series' label in the
10584
10844
  built-in legend row, mirroring `pointText`/`tickFormat`'s opt-in-hook convention. Falls back to
@@ -10599,14 +10859,14 @@ passthrough). Not a subclass of `LyraChart`.
10599
10859
  ignores it entirely.
10600
10860
  - `hideAxis: boolean = false` (attribute `hide-axis`) — suppresses gridlines/y-axis tick labels
10601
10861
  altogether; x-axis category labels (rendered separately) are unaffected.
10602
- - `selectedIndex: number[] = []` (attribute: false) — category indexes to mark `data-selected` on
10603
- every bar/segment at that index, across every dataset e.g. to highlight a whole selected week's
10604
- column in a stacked chart. Empty (the default) reproduces the exact existing output: no bar
10605
- carries `data-selected`. This component takes no opinion on what the highlight looks like, only
10606
- which bars it applies to — style the highlight via the `--lr-lite-chart-selected-outline-color`
10607
- custom property (documented below). Note `::part(bar)[data-selected]` is **invalid CSS** — Shadow
10608
- Parts forbids an attribute selector after `::part()` — so it silently never matches; the outline
10609
- 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.
10610
10870
  - `minBarHeight?: number` (attribute `min-bar-height`) — optional minimum visible bar height for
10611
10871
  small non-zero values
10612
10872
  - `accessibleLabel?: string` (attribute `accessible-label`) — SVG accessible-name override; a host
@@ -10614,9 +10874,11 @@ passthrough). Not a subclass of `LyraChart`.
10614
10874
  - `appendData(label, values, maxPoints?)` — appends one aligned category and optionally trims the
10615
10875
  oldest categories
10616
10876
 
10617
- **Events:** `lr-point-click` — fired when a bar/point is activated (click, or Enter/Space while
10618
- focused). `detail: { datasetIndex: number, index: number, label: string | undefined, value: number
10619
- | 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.
10620
10882
 
10621
10883
  **Methods:** `exportData('csv' | 'svg')` returns a spreadsheet-safe CSV snapshot or the current SVG
10622
10884
  markup. The method does not download a file; pair it with `lr-export-button` for download UX.
@@ -10631,13 +10893,13 @@ fresh, small SVG render is cheaper and more correct than a lossy cache.
10631
10893
 
10632
10894
  **Slots:** none.
10633
10895
 
10634
- **CSS parts:** `base`, `grid-line`, `axis-label`, `axis-title`, `bar` (each bar rect; carries
10635
- `data-selected` when its category index is in `selectedIndex`), `line`, `point`, `legend`,
10636
- `legend-item`, `legend-swatch`, `legend-text` (extra per-item text after the series label,
10637
- rendered only when `legendText` is set), `live-region` (the current mark announcement for keyboard
10638
- users), `data-list` (a visually hidden list of all plotted data points — single-series only),
10639
- `data-table` (a visually hidden category×series data table, rendered instead of `data-list` when
10640
- 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).
10641
10903
 
10642
10904
  **Screen-reader data alternative:** a single dataset renders the flat `data-list` (one `<li>` per
10643
10905
  plotted point, matching the roving-tabindex mark order). More than one dataset instead renders a
@@ -10654,10 +10916,9 @@ blank instead of reporting a misleading zero.
10654
10916
  `--lr-chart-grid-color`, `--lr-chart-tick-color`, `--lr-chart-legend-color` — same token
10655
10917
  *names* as `lr-chart`, so a host already theming `lr-chart` themes this for free;
10656
10918
  `--lr-lite-chart-selected-outline-color` (default `var(--lr-color-brand)`) — the stroke drawn on
10657
- `[part='bar'][data-selected]`, i.e. bars whose category index is in `selectedIndex` (bars only;
10658
- `[part='point']` is never marked `data-selected`, and the stroke width is a fixed 2px). Unlike
10659
- `lr-chart` (canvas-rendered, needs `getComputedStyle`-based re-theming on every draw), this is
10660
- 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
10661
10922
  `refreshTheme()` method needed (there's nothing to go stale).
10662
10923
 
10663
10924
  **Optional peer deps:** none. This is the point of the component.
@@ -10679,10 +10940,18 @@ plain SVG/DOM and reads these via native CSS `var()` — no JS-side resolution s
10679
10940
  always vertical.
10680
10941
  - No dual y-axis (`Series.axis: 'y2'`) — every series shares one y-axis/domain.
10681
10942
  - Series colors default to a fixed built-in 8-color categorical palette (round-robin by dataset
10682
- index) when `color` is unset — not configurable beyond passing `color` per series.
10683
- - Bar/point elements are real focusable DOM nodes (`tabindex="0" role="button"`, each with its own
10684
- `aria-label`), so the `<svg>` itself uses `role="group"`, not `role="img"` an "img" role would
10685
- 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.
10686
10955
  - Tick values use a standard "nice numbers" (1/2/5 × 10ⁿ) rounding step, not exact data min/max —
10687
10956
  intentional (readable axis labels), matches how most charting libraries pick tick steps.
10688
10957
 
@@ -10709,16 +10978,18 @@ of every entry in these lists.**
10709
10978
  (`show-data-table`), `chartArea` (readonly). `type` is the only member that differs: read-only,
10710
10979
  locked to this tag's value.
10711
10980
 
10712
- **Methods:** `resetZoom()`, `refreshTheme()`.
10981
+ **Methods:** `appendData(label, values, maxPoints?)`, `exportData('csv' | 'png')`, `resetZoom()`,
10982
+ `refreshTheme()`.
10713
10983
 
10714
10984
  **Events:** `lr-zoom` (`detail: { zoomed: boolean }`), `lr-point-click` (`detail: { datasetIndex,
10715
10985
  index, label, value }`).
10716
10986
 
10717
10987
  **Slots:** `data-table`, `center`.
10718
10988
 
10719
- **CSS parts:** `base`, `canvas`, `reset-zoom-button`, `description`, `data-table`, `center`,
10720
- `error` (`role="alert"` message rendered in place of `canvas` when the optional `chart.js` peer
10721
- 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`).
10722
10993
 
10723
10994
  **Themeable custom properties:** `--lr-chart-height`, `--lr-chart-grid-color`,
10724
10995
  `--lr-chart-tick-color`, `--lr-chart-legend-color`, `--lr-chart-tooltip-bg`,
@@ -10745,9 +11016,9 @@ same set, so one rule retunes them together.
10745
11016
  - `type` truly is locked per subclass: `<lr-pie-chart type="bar">` or `el.type = 'bar'` at runtime
10746
11017
  is a genuine no-op (the accessor's setter silently ignores the write), not a footgun like a plain
10747
11018
  overridden class-field default would be.
10748
- - `lr-bubble-chart` needs `Series.points` entries with an `x`/`y`/`r` triple, but `Series.points`
10749
- is typed as `{x, y, label?}[]` with no `r` field — cast the array through `as unknown as
10750
- 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.
10751
11022
 
10752
11023
  ---
10753
11024
 
@@ -10775,16 +11046,20 @@ Bins `values` into `bins` equal-width buckets and renders as a bar chart (extend
10775
11046
  (`accessible-label`), `accessibleDescription` (`accessible-description`), `showDataTable`
10776
11047
  (`show-data-table`), `chartArea` (readonly).
10777
11048
 
10778
- **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.
10779
11053
 
10780
11054
  **Events:** `lr-zoom`, `lr-point-click` — inherited; `lr-point-click`'s `index` is the bucket index
10781
11055
  and `label` the generated bucket range string (`"lo–hi"`, both bounds at one decimal place).
10782
11056
 
10783
11057
  **Slots:** `data-table`, `center`.
10784
11058
 
10785
- **CSS parts:** `base`, `canvas`, `reset-zoom-button`, `description`, `data-table`, `center`,
10786
- `error` (`role="alert"` message rendered in place of `canvas` when the optional `chart.js` peer
10787
- 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).
10788
11063
 
10789
11064
  **Themeable custom properties:** `--lr-chart-height`, `--lr-chart-grid-color`,
10790
11065
  `--lr-chart-tick-color`, `--lr-chart-legend-color`, `--lr-chart-tooltip-bg`,
@@ -10810,6 +11085,9 @@ their semantics, defaults, and gotchas.
10810
11085
  property write from requesting an unbounded bucket array.
10811
11086
  - non-finite samples in `values` are dropped before bucketing rather than corrupting bucket-index
10812
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.
10813
11091
 
10814
11092
  ---
10815
11093
 
@@ -10822,7 +11100,8 @@ browser). Does **not** extend `LyraChart` — a deliberately bespoke API.
10822
11100
  - `labels: string[] = []` (attribute: false)
10823
11101
  - `boxes: BoxPlotSeries[] = []` (attribute: false) — `BoxPlotSeries { label: string; data:
10824
11102
  BoxPlotPoint[]; color?: string }`, `BoxPlotPoint { min, q1, median, q3, max }`
10825
- - `legend: boolean = false`
11103
+ - `legend: boolean = false` — renders a wrapping DOM legend whose buttons toggle box-series
11104
+ visibility without clipping long labels.
10826
11105
  - `height: string = '280px'`
10827
11106
  - `yLabel: string = ''` (attribute `y-label`)
10828
11107
  - `beginAtZero: boolean = true` (attribute `begin-at-zero`)
@@ -10832,13 +11111,16 @@ browser). Does **not** extend `LyraChart` — a deliberately bespoke API.
10832
11111
  localized five-number summary
10833
11112
  - `showDataTable: boolean = false` (attribute `show-data-table`) — reveals the accessible data table
10834
11113
 
10835
- **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.
10836
11117
 
10837
11118
  **Events:** none.
10838
11119
 
10839
11120
  **Slots:** `data-table` — an optional consumer-provided accessible table alternative.
10840
11121
 
10841
- **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
10842
11124
  instead of `canvas` when the optional box-plot peer fails to load)
10843
11125
 
10844
11126
  **Themeable custom properties:** `--lr-chart-height`, `--lr-chart-grid-color`,
@@ -10863,8 +11145,12 @@ through the same cached `chart-loader.ts` used by `lr-chart`.
10863
11145
  - no raw `config` passthrough — limited to the properties above; can't reach the underlying
10864
11146
  controller's own options (`itemRadius`, `outlierRadius`, `coef`).
10865
11147
  - Chart.js receives `effectiveLocale`; generated numeric summaries use it, the y axis moves to
10866
- logical start in RTL, canvas tooltip/axis colors are token-driven, and animation is disabled
10867
- 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.
10868
11154
  - If `@sgratzl/chartjs-chart-boxplot` fails to load, the component warns to the console and
10869
11155
  fails closed with a localized `role="alert"` error part rather than leaving a blank canvas.
10870
11156
 
@@ -10874,10 +11160,13 @@ through the same cached `chart-loader.ts` used by `lr-chart`.
10874
11160
 
10875
11161
  `lr-lite-chart` and `lr-chart` expose additive imperative helpers for live dashboards:
10876
11162
  `appendData(label, values, maxPoints?)` appends one aligned category and optionally trims the oldest
10877
- points. `lr-lite-chart.exportData('csv' | 'svg')` returns a spreadsheet-safe CSV snapshot or the
10878
- current SVG markup. `lr-chart.exportData('csv' | 'png')` returns a CSV snapshot or Chart.js's current
10879
- PNG data URL when the optional peer is loaded. These helpers do not download files; compose them
10880
- 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.
10881
11170
 
10882
11171
  # Document & file viewers (`components/viewers/`)
10883
11172
 
@@ -10935,13 +11224,15 @@ image path — and the generic fallback simply omits `[part="download-link"]` en
10935
11224
  `status="error"`.
10936
11225
  - `maxHeight: string = ''` (attribute `max-height`) — a CSS length (e.g. `"24rem"`); once set,
10937
11226
  `[part="body"]` scrolls internally past this height instead of growing the page — same contract as
10938
- `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.
10939
11229
  - `zoomable: boolean = false` (reflected) — wraps the rendered image (image format only) in an
10940
11230
  internal `<lr-zoomable-frame>`. `false` (the default) preserves the exact pre-`zoomable` DOM — an
10941
11231
  inline thumbnail (e.g. in a chat stream) must not unexpectedly grow a focusable zoom-chrome
10942
11232
  viewport; an inspection surface opts in.
10943
11233
  - `highlights: LyraHighlight[] = []` (attribute: false) — display-only `region` highlights painted
10944
- 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.
10945
11236
  - `activeHighlightId: string | null = null` (attribute `active-highlight-id`) — the `highlights`
10946
11237
  entry, if any, currently treated as active (`data-active` on its `region-highlight`).
10947
11238
  - `anchorKinds` is a readonly `['region']` (this viewer's supported `LyraAnchor.kind` values for the
@@ -11078,8 +11369,10 @@ type. First-party invention.
11078
11369
  - `mimeType: string = ''` (attribute `mime-type`) — MIME type used for exact renderer dispatch.
11079
11370
  - `src: string = ''` — source URL passed to the selected renderer or the fallback preview.
11080
11371
  - `registry?: DocumentRendererRegistry` (attribute: false) — optional per-instance registry override;
11081
- the module-level registry is used when unset.
11082
- - `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.
11083
11376
  - `anchor: LyraAnchor | string | null = null` (attribute: false) — declarative scroll-to-anchor
11084
11377
  target forwarded to the resolved renderer; a string is a highlight id in `highlights`.
11085
11378
  `hasChanged: () => true`, so re-assigning the same value (e.g. re-clicking the same citation
@@ -11102,6 +11395,7 @@ type. First-party invention.
11102
11395
  (a highlight id) counts as supported by any renderer declaring at least one anchor kind.
11103
11396
 
11104
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"`;
11105
11399
  `download-link` — the native download action, rendered when `src` passes Lyra's safe-link policy.
11106
11400
 
11107
11401
  **Themeable custom properties:** `--lr-document-viewer-max-height` (default `70vh`) — maximum block
@@ -11140,6 +11434,9 @@ registerDocumentRenderer('application/x-example', {
11140
11434
  When no renderer matches, the viewer renders `<lr-document-preview>`, which handles text and images
11141
11435
  inline and provides a safe generic fallback for other formats.
11142
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
+
11143
11440
  ## `lr-docx-viewer`
11144
11441
 
11145
11442
  Fetches a `.docx` Word document as an `ArrayBuffer`, converts it to semantic HTML with the optional
@@ -11151,10 +11448,13 @@ hatch: if `dompurify` is unavailable, rendering is blocked even when Mammoth con
11151
11448
  Every rendered heading's slug (the same GitHub-slugger-style algorithm `<lr-markdown>` uses) is
11152
11449
  stamped as its `id` and cached into `getHeadingTree()`'s document-ordered outline. Adopts
11153
11450
  `DocumentAnchorTarget`: `fragment` anchors resolve against that outline, `text-quote` anchors via
11154
- 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.
11155
11454
 
11156
11455
  **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. `maxHeight` caps
11157
- 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
11158
11458
  viewer's supported `LyraAnchor.kind` values for the shared anchor-target contract).
11159
11459
 
11160
11460
  **Methods:** `getHeadingTree()` returns the document-ordered outline as `DocxHeadingItem[]` (`{ id,
@@ -11167,14 +11467,17 @@ painted marks.
11167
11467
  **Events:** `lr-render-error` with `detail.error` when fetching, conversion, sanitization, or a
11168
11468
  non-fatal Mammoth conversion message occurs. `lr-search-change` (`detail: { query, matchCount,
11169
11469
  activeIndex }`) — from `search()`/`searchNext()`/`searchPrevious()`/`clearSearch()`.
11170
- `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.
11171
11472
  `lr-text-select` (`detail: { text, anchor, rects }`) — fired on selection end inside the rendered
11172
11473
  content. `lr-anchor-result` (`detail: { found }`) — fired after an `anchor` assignment or a
11173
11474
  `scrollToAnchor()` call.
11174
11475
 
11175
11476
  **CSS parts:** `base`, `body`, `content`, `spinner`, `error`, `highlight` (a painted `text-quote`
11176
- highlight), `search-match` (a painted in-document search match), and `search-match-active` (the
11177
- 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`).
11178
11481
 
11179
11482
  **Themeable custom properties:** `--lr-docx-viewer-max-height` (default `none`) — maximum block size
11180
11483
  of `[part="body"]`; also settable via the `max-height` property, which writes this token inline.
@@ -11217,8 +11520,9 @@ downloading, or object-URL'ing them is the host's job (e.g.
11217
11520
  Remote resources are capped at 25 MB; exceeding it surfaces the localized
11218
11521
  `documentPreviewResourceTooLarge` message instead of the message.
11219
11522
 
11220
- **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. `foldQuotes:
11221
- 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
11222
11526
  localized show/hide toggle. `false` (the default) preserves the full body rendering. A host
11223
11527
  `aria-label` takes precedence over `name`. `highlights`, `activeHighlightId`, `anchor`, and
11224
11528
  `anchorKinds` (`['text-quote', 'fragment']`) provide the shared text-viewer contract.
@@ -11254,8 +11558,9 @@ matching `.eml` filenames in `<lr-document-viewer>`. Fail-closed behavior is exp
11254
11558
  Fetches and parses `.ics` calendars with the optional `ical.js` peer and renders each VEVENT as
11255
11559
  plain text, including its title, start/end time, location, and description. No HTML is injected.
11256
11560
 
11257
- **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. A host
11258
- `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
11259
11564
  `anchorKinds` (`['text-quote', 'fragment']`) provide the shared text-viewer contract.
11260
11565
 
11261
11566
  **Methods:** `search(query)`, `searchNext()`, `searchPrevious()`, `clearSearch()`, and
@@ -11288,19 +11593,34 @@ fully decompressing only the rare entry missing that header field. The list comp
11288
11593
  contract: `highlights`, `activeHighlightId`, `anchor`, and `anchorKinds` (`['text-quote', 'fragment']`).
11289
11594
 
11290
11595
  **Methods:** `search(query)`, `searchNext()`, `searchPrevious()`, and `clearSearch()` provide
11291
- case-insensitive text search over rendered entry names; `scrollToAnchor()` resolves text-quote and
11292
- 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.
11293
11601
 
11294
- **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.
11295
11606
 
11296
11607
  **CSS parts:** `base`, `body`, `entry`, `entry-icon`, `entry-name`, `entry-name-dir`, `entry-size`,
11297
- `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
11298
11610
  `entry-name-dir` (a part list), so `::part(entry-name-dir)` selects only directory names while
11299
11611
  `::part(entry-name)` still selects every name. Entry rows are rendered into the embedded
11300
11612
  `<lr-virtual-list>`'s own shadow root and forwarded with `exportparts`, so
11301
11613
  `lr-archive-viewer::part(entry)` (and every other row part above) reaches them from a consuming
11302
11614
  stylesheet.
11303
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
+
11304
11624
  **Exports:** `ArchiveEntry` — `{ name: string; dir: boolean; size: number }`.
11305
11625
 
11306
11626
  **Optional peer dependency:** install `jszip` with `pnpm add jszip`. The lazy registry registers
@@ -11326,8 +11646,9 @@ the reading region's accessible name. `location: string = ''` (not reflected —
11326
11646
  a CFI or spine href identifying the current reading position: set before the book finishes
11327
11647
  loading it's recorded and applied once ready, set after it applies immediately, and epub.js's own
11328
11648
  `relocated` event keeps it in sync with user navigation without re-triggering its own `display()`
11329
- call. `anchorKinds` is a readonly `['cfi', 'text-quote']` (this viewer's supported `LyraAnchor.kind`
11330
- 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).
11331
11652
 
11332
11653
  **Methods:** `getToc()` resolves the EPUB's own navigation document (`book.navigation.toc`,
11333
11654
  populated once `book.ready` resolves) flattened into document-ordered `EbookTocItem[]` (`{ id,
@@ -11335,16 +11656,20 @@ label, href, level }`, `level` starting at 1 for a top-level entry, `id` falling
11335
11656
  when a navigation entry has none), `[]` before a book has loaded. `search(query)` resolves the
11336
11657
  match count across every spine section, in document order, via epub.js's own `item.load()`/
11337
11658
  `item.find()`/`item.unload()` (empty/whitespace query behaves like `clearSearch()`; a newer
11338
- `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()`
11339
11661
  advance/step back through matches (wrapping, resolving `false` when there are none); `clearSearch()`
11340
11662
  clears the query, matches, and painted search annotation.
11341
11663
 
11342
11664
  **Events:** `lr-render-error` with `detail.error` when fetching, opening, or rendering fails;
11343
11665
  `lr-location-change` (`detail: { cfi, href }`) fired from epub.js's own `relocated` event;
11344
11666
  `lr-search-change` (`detail: { query, matchCount, activeIndex }`) from `search()`/`searchNext()`/
11345
- `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.
11346
11670
 
11347
- **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`,
11348
11673
  `mount`, `error`, and `announcer` (the visually-hidden `role="status"` region search results
11349
11674
  announce through).
11350
11675
 
@@ -11354,7 +11679,8 @@ unambiguous beside other previous/next controls and are overridable through `.st
11354
11679
 
11355
11680
  **Optional peer dependency:** install `epubjs` with `pnpm add epubjs`. The document-viewer registry
11356
11681
  matches `application/epub+zip` and `.epub` filenames, declaring `{ anchors: ['cfi', 'text-quote'],
11357
- 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.
11358
11684
 
11359
11685
  Remote resources are capped at 25 MB; exceeding it surfaces the localized
11360
11686
  `documentPreviewResourceTooLarge` message instead of the ebook.
@@ -11368,6 +11694,10 @@ same reason. `highlights` (kind `cfi`) paint via `rendition.annotations.highligh
11368
11694
  re-applied whenever the rendition is recreated (a `src` change, or a reconnect remount), since
11369
11695
  epub.js doesn't persist annotations across a fresh `renderTo()`.
11370
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
+
11371
11701
  ## `lr-pptx-viewer`
11372
11702
 
11373
11703
  Best-effort client-side PPTX viewer backed by the optional `@aiden0z/pptx-renderer` peer. A
@@ -11410,7 +11740,8 @@ here — a sanitized SVG document has neither pages nor extractable text to quot
11410
11740
  its registry entry declares `capabilities: { anchors: ['region'], search: false, textSelect: false }`.
11411
11741
 
11412
11742
  **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. `maxHeight` caps
11413
- 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
11414
11745
  internal `<lr-zoomable-frame>`. `false` (the default) preserves the exact pre-`zoomable` DOM — an
11415
11746
  inline thumbnail (e.g. in a chat stream) must not unexpectedly grow a focusable zoom-chrome viewport;
11416
11747
  an inspection surface opts in. `anchor: LyraAnchor | string | null = null` (attribute: false) —
@@ -11418,7 +11749,9 @@ declaratively jump to an anchor (a `LyraAnchor` object, or a `highlights` entry'
11418
11749
  calls `scrollToAnchor()` and fires `lr-anchor-result`; re-assigning the same value re-triggers the
11419
11750
  scroll, it is not reference-gated. `highlights: LyraHighlight[] = []` (attribute: false) —
11420
11751
  display-only `region` highlights painted over the rendered SVG; unchanged behavior, now inherited
11421
- 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`
11422
11755
  (attribute `active-highlight-id`) — the `highlights` entry, if any, currently treated as active
11423
11756
  (`data-active` on its `region-highlight`). `anchorKinds` is a readonly `['region']` (this viewer's
11424
11757
  supported `LyraAnchor.kind` values for the shared anchor-target contract).
@@ -11470,8 +11803,9 @@ Remote resources are capped at 25 MB; exceeding it surfaces the localized
11470
11803
  Fetches an HTML document, sanitizes it with the optional `dompurify` peer, and renders the safe markup
11471
11804
  inside a bounded, scrollable body.
11472
11805
 
11473
- **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. A host
11474
- `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
11475
11809
  `anchorKinds` (`['text-quote', 'fragment']`) provide the shared text-viewer contract.
11476
11810
 
11477
11811
  **Methods:** `search(query)`, `searchNext()`, `searchPrevious()`, `clearSearch()`, and
@@ -11505,9 +11839,10 @@ is never part of the virtualized body); `scrollToAnchor()` scrolls the addressed
11505
11839
  the virtualized list's `active-id`. `highlights` paint as a `part="cell-highlight"` cell wrapping a
11506
11840
  focusable `part="cell-highlight-action"` native button, keeping the ARIA table tree intact.
11507
11841
 
11508
- **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. `anchorKinds` is
11509
- a readonly `['cell-range']` (this viewer's supported `LyraAnchor.kind` values for the shared
11510
- 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).
11511
11846
 
11512
11847
  **Methods:** `search(query)` resolves the match count via a case-insensitive substring search over
11513
11848
  every body cell's raw string value, ordered row then column (empty/whitespace query behaves like
@@ -11554,8 +11889,9 @@ label when `FN` is absent).
11554
11889
  Remote resources are capped at 25 MB; exceeding it surfaces the localized
11555
11890
  `documentPreviewResourceTooLarge` message instead of the contacts.
11556
11891
 
11557
- **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. A host
11558
- `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
11559
11895
  `anchorKinds` (`['text-quote', 'fragment']`) provide the shared text-viewer contract.
11560
11896
 
11561
11897
  **Methods:** `search(query)`, `searchNext()`, `searchPrevious()`, `clearSearch()`, and
@@ -11589,9 +11925,12 @@ to tell that apart from a genuine activation click.
11589
11925
  **Properties:** `src` and `name` are strings. `page: number = 1` is the one-based current page and
11590
11926
  `zoom: number = 1` is clamped to `0.25`–`4`. `maxHeight: string = ''` (attribute `max-height`) is a
11591
11927
  CSS length that, once set, overrides `--lr-pdf-viewer-height` — the block size of the virtualized
11592
- 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
11593
11930
  `['page', 'text-quote', 'region']` (this viewer's supported `LyraAnchor.kind` values for the shared
11594
- 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.
11595
11934
 
11596
11935
  **Events:**
11597
11936
  - `lr-render-error` — `detail: { error }` — fetching, parsing, or rendering (page canvas or text
@@ -11618,7 +11957,8 @@ of one page (per-page LRU-cached, 64 pages), rejecting on no loaded document or
11618
11957
  `options.width` CSS px (default 96), devicePixelRatio-aware, resolving `false` when not ready or out
11619
11958
  of range. `goToPage(page)` scrolls the virtualized list to `page`, resolving `true` once mounted (or
11620
11959
  `false` for an out-of-range value, without changing `page`). `getOutline()` resolves the document's
11621
- 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.
11622
11962
  `search(query)` resolves the match count across all pages (empty/whitespace query behaves like
11623
11963
  `clearSearch()`); `searchNext()` and `searchPrevious()` advance/step back through matches (wrapping,
11624
11964
  resolving `false` when there are none); `clearSearch()` clears the query, matches, and painted marks.
@@ -11658,6 +11998,9 @@ rendering without it.
11658
11998
  Remote resources are capped at 25 MB; exceeding it surfaces the localized
11659
11999
  `documentPreviewResourceTooLarge` message instead of the PDF.
11660
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
+
11661
12004
  ## `lr-spreadsheet-viewer`
11662
12005
 
11663
12006
  Fetches and renders `.xlsx` and `.xls` workbooks with the optional `xlsx` (SheetJS) peer. Multiple
@@ -11717,9 +12060,9 @@ row/column into view via the virtualized list's `active-id`. `highlights` paint
11717
12060
  **Properties:** `src` and `name` are strings. `hasHeaderRow: boolean = true` (attribute
11718
12061
  `has-header-row`) controls whether the first parsed row is rendered as a sticky header.
11719
12062
  `maxHeight: string = ''` (attribute `max-height`) is a CSS length that caps the scrollable body —
11720
- setting it writes `--lr-csv-viewer-max-height` inline on `[part="base"]`. `anchorKinds` is a
11721
- readonly `['cell-range']` (this viewer's supported `LyraAnchor.kind` values for the shared
11722
- 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).
11723
12066
 
11724
12067
  **Methods:** `search(query)` resolves the match count via a case-insensitive substring match over
11725
12068
  the same stringified cell values `cell()` renders, ordered row then column (empty/whitespace query
@@ -11769,8 +12112,8 @@ raw injection option is omitted, not shipped as a no-op).
11769
12112
 
11770
12113
  A bare primitive: no label/hint/error chrome, no implicit role, no computed accessible name, and no
11771
12114
  `aria-live` wrapper (the fragment can carry its own landmarks; wrapping the host would re-announce
11772
- all of it on every load). `aria-busy="true"` is set on the host while a fetch is in flight and
11773
- 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`.
11774
12117
 
11775
12118
  **Properties:**
11776
12119
  - `src: string = ''` (reflected) — URL of the fragment, validated through the shared `safeFetchUrl()`
@@ -11785,7 +12128,8 @@ removed once it settles either way. Build error UI from `lr-include-error`.
11785
12128
  The shared text-viewer contract is also available for the sanitized light-DOM fragment:
11786
12129
  `highlights`, `activeHighlightId`, `anchor`, and `anchorKinds` (`['text-quote', 'fragment']`).
11787
12130
  `search(query)`, `searchNext()`, `searchPrevious()`, `clearSearch()`, and `scrollToAnchor()`
11788
- 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.
11789
12133
 
11790
12134
  **Events:**
11791
12135
  - `lr-load` — `detail: { src }` — the fragment was sanitized and written into the light DOM.
@@ -11815,7 +12159,8 @@ positioned ancestor.
11815
12159
 
11816
12160
  **Properties:** `items: HighlightLayerItem[] = []` (attribute: false), `activeId: string | null =
11817
12161
  null` (attribute `active-id`), and `interactive: boolean = true` (reflected) — gates click/keyboard
11818
- 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.
11819
12164
 
11820
12165
  **Methods:** `flash(id)` briefly re-triggers the flash styling for an already-rendered rect (e.g. a
11821
12166
  re-click of the same source citation).
@@ -11858,6 +12203,11 @@ truth.
11858
12203
  **Events:** `lr-page-select` — a page row was activated (click, or Enter/Space on a focused row).
11859
12204
  `detail: { page }`. In wired mode the rail also sets `viewer.page` itself.
11860
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
+
11861
12211
  **CSS parts:** `base` (the rail), `pages` (the embedded `<lr-virtual-list>`), `page` (one page
11862
12212
  button), `page-current` (the button for the current `page`), `thumbnail` (the thumbnail canvas
11863
12213
  wrapper), `page-number` (the visible page number), `heat` (the heat-marker cluster), `heat-dot` (one
@@ -11899,9 +12249,10 @@ JSON text; wins over `src` and is parsed (and validated) synchronously. `name: s
11899
12249
  accessible label, and matched against a `fragment` anchor's cell id. `outputCollapseLines: number =
11900
12250
  40` (attribute `output-collapse-lines`) — a plain-text output longer than this many lines renders
11901
12251
  collapsed behind a toggle; `0` disables collapsing. `maxHeight: string = ''` (attribute
11902
- `max-height`) — once set, the notebook scrolls internally past this height. `anchorKinds` is a
11903
- readonly `['node-path', 'fragment']` (this viewer's supported `LyraAnchor.kind` values for the
11904
- 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).
11905
12256
 
11906
12257
  **Methods:** `search(query)` resolves the match count over cell sources and text outputs — a
11907
12258
  matching cell counts as one match (empty/whitespace query behaves like `clearSearch()`);
@@ -11953,6 +12304,9 @@ the element or on any ancestor.
11953
12304
  A notebook major version outside 4.0–4.5, an invalid shape, or more than 2,000 cells renders a
11954
12305
  localized error and fires `lr-render-error` instead of the notebook.
11955
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
+
11956
12310
  ## `lr-xml-viewer`
11957
12311
 
11958
12312
  Collapsible, copyable, `DOMParser`-based tree view for XML documents, mirroring `lr-json-viewer`'s
@@ -11971,7 +12325,8 @@ boolean = false` (reflected) — shows copy-to-clipboard affordances, one for th
11971
12325
  one per element. `maxHeight: string = ''` (attribute `max-height`). `anchorKinds` is a readonly
11972
12326
  `['node-path']` (this viewer's supported `LyraAnchor.kind` values for the shared anchor-target
11973
12327
  contract) — each numeric path segment is the 0-based index within the parent's *element* children,
11974
- 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.
11975
12330
 
11976
12331
  **Methods:** `search(query)` resolves the match count via a case-insensitive substring search over
11977
12332
  every element's tag name, attribute names/values, and own text (empty/whitespace query behaves like
@@ -12023,7 +12378,8 @@ await viewer.search(query);
12023
12378
  ```
12024
12379
 
12025
12380
  Node cap: 50,000 — exceeding it renders the localized `xmlViewerTooManyNodes` error instead of the
12026
- tree.
12381
+ tree. A collapsed element's child count includes element, text, comment, CDATA, and processing-
12382
+ instruction children rather than only element descendants.
12027
12383
 
12028
12384
  ## `lr-document-compare`
12029
12385
 
@@ -12083,17 +12439,24 @@ approximation weighting latitude span ~2x, with 40% padding), then hands the par
12083
12439
  `maplibre-gl` peer isn't installed, it falls back to a status line plus a `<lr-json-viewer
12084
12440
  collapsed-depth="2">` of the raw value instead of the map.
12085
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
+
12086
12447
  **Properties:** `src: string = ''` — URL to fetch and parse. `name: string = ''` — accessible label,
12087
12448
  used as `<lr-map>`'s `label` and the root's `aria-label` (falling back to the localized
12088
12449
  `geojsonViewLabel` when unset). A host `aria-label` takes precedence over `name`. The shared
12089
12450
  text-viewer contract adds `highlights`, `activeHighlightId`, `anchor`, and
12090
12451
  `anchorKinds` (`['text-quote', 'fragment']`), plus `search()`, `searchNext()`, `searchPrevious()`,
12091
- `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.
12092
12454
 
12093
12455
  **Events:** `lr-render-error` — `detail: { error }` — fetch, parse, or shape-validation failure.
12094
12456
 
12095
12457
  **CSS parts:** `base` (the root container), `status` (the feature-count status line, `role="status"`,
12096
- 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
12097
12460
  alongside the `lr-json-viewer` fallback), `error` (the error region, `role="alert"`), `spinner`
12098
12461
  (the loading status region).
12099
12462
 
@@ -13099,7 +13462,9 @@ combination (`catalog` empty/unset, or `allowCustom` true) renders the free-text
13099
13462
  (`[part="combobox"]`/`[part="combobox-input"]`) with live substring filtering against the catalog (id or
13100
13463
  label, case-insensitive). The mode is re-evaluated on every render, so toggling `allowCustom` or clearing
13101
13464
  `catalog` at runtime switches modes live, repositioning the shared `[part="listbox"]` popover against
13102
- 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.
13103
13468
 
13104
13469
  A `value` that isn't present in `catalog` (e.g. a model id saved from a provider whose live catalog has
13105
13470
  since changed) is never silently dropped: it's appended to the rendered option list as a synthetic,
@@ -13114,6 +13479,8 @@ visually-distinct row (dashed border, italic label, "not in catalog" badge) comp
13114
13479
  - `change` (`Event`, no detail) — fired alongside `lr-change`, mirroring `<lr-select>`/
13115
13480
  `<lr-combobox>`'s native-style value-change pair so native form bindings/framework `v-model`
13116
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>`.
13117
13484
  - `blur` (no detail) — re-dispatched from the free-text mode's internal `<input>`'s own `blur`,
13118
13485
  bubbling and composed unlike the native event. Closed-dropdown mode's trigger `<button>` has no
13119
13486
  equivalent re-dispatch, matching `<lr-select>`'s own trigger.
@@ -13833,7 +14200,8 @@ rating opens the detail panel, and `disabled: boolean = false` (reflected) for a
13833
14200
  **Events:** `lr-change` — `detail: { value: 'up' | 'down' | null }`, fired when a thumb's rating
13834
14201
  changes or clears. `lr-submit` — `detail: { value: 'up' | 'down'; reasonIds: string[]; comment:
13835
14202
  string }`, fired by the panel's submit button (`value` is never `null` here — the panel only exists
13836
- 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.
13837
14205
 
13838
14206
  **CSS parts:** `base` (the root), `thumbs` (wrapper around both thumb buttons), `up-button`,
13839
14207
  `down-button`, `panel` (the inline detail disclosure, only rendered when `reasons` is non-empty or
@@ -14570,7 +14938,11 @@ part to the built-in renderer; `label: string = ''`; `accessibleLabel: string |
14570
14938
  `MessagePartRenderer = (part: MessagePart, index: number) => unknown`; `MessagePart` and its
14571
14939
  discriminated part shapes come from the `@aceshooting/lyra-ui/ai` subpath.
14572
14940
 
14573
- **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`.
14574
14946
 
14575
14947
  **CSS parts:** `base`, `part`, `part-streaming`, `text`, `reasoning`, `tool-call`, `tool-result`,
14576
14948
  `citation`, `attachment`, `data`, `audio`, `audio-transcript`, `error`, `retry`.
@@ -14683,6 +15055,8 @@ Nonmodal, Escape-dismissible text-selection toolbar carrying selected text plus
14683
15055
  **Events:** `lr-selection-action` (`SelectionActionDetail = { action, text, anchor }`);
14684
15056
  `lr-dismiss` (Escape); `lr-copy-error` (`{ error }`). Copy uses the Clipboard API when available;
14685
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.
14686
15060
 
14687
15061
  **CSS parts:** `toolbar`, `action`, `action-ask`, `action-quote`, `action-cite`, `action-copy`.
14688
15062
 
@@ -15145,11 +15519,12 @@ shared overlay stack. First-party invention (no Web Awesome equivalent).
15145
15519
  - `ToolSelectDialogTool { id: string; name: string; description?: string; category?: string; icon?:
15146
15520
  string; disabled?: boolean; disabledReason?: string }` — one selectable agent tool. `category` groups
15147
15521
  the row into a heading; tools with no `category` (or an empty/whitespace-only one) fall into a
15148
- trailing "Other" bucket. `icon` is a literal glyph (e.g. an emoji) rendered next to `name` an opaque
15149
- string, not a registry lookup, the same convention `<lr-tool-call-chip>`'s `icon` uses. `disabled`
15150
- individually gates a tool regardless of `useDefaults`/`selected` (e.g. a tool requiring admin
15151
- approval); `disabledReason` is supporting text shown under a disabled row, ignored when `disabled` is
15152
- 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.
15153
15528
  - `ToolSelectFilter = (tool: ToolSelectDialogTool, query: string) => boolean` — a predicate deciding
15154
15529
  whether `tool` matches an already-trimmed, already-lowercased `query`. Assign `filter` to replace the
15155
15530
  built-in case-insensitive name/description substring match entirely (mirrors `<lr-combobox>`'s
@@ -15184,7 +15559,8 @@ shared overlay stack. First-party invention (no Web Awesome equivalent).
15184
15559
 
15185
15560
  **Events:** `lr-change` (`detail: ToolSelectionChangeDetail` — the enabled-tool selection or the
15186
15561
  `useDefaults` toggle changed), `lr-close` (`detail: ToolSelectDialogCloseReason` — fired exactly once
15187
- 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.
15188
15564
 
15189
15565
  **Slots:** `footer` — optional action buttons (e.g. a "Done" button), rendered in a bottom row. Changes
15190
15566
  already apply live via `lr-change`, so this slot is purely optional; only visually shown once it has
@@ -15239,7 +15615,9 @@ checkboxes for editing.
15239
15615
  - `disabledReason` text only renders when both `tool.disabled` and `tool.disabledReason` are set.
15240
15616
  - Categories are grouped in first-seen order across `tools`; an empty/whitespace-only `category` folds
15241
15617
  into a trailing "Other" bucket that's always rendered last. A category left with zero matches after
15242
- 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.
15243
15621
  - Reconnecting the element while still `open` (e.g. a drag-and-drop reparent that keeps the same
15244
15622
  instance) resumes its shared overlay registration and re-acquires the scroll lock dropped in
15245
15623
  `disconnectedCallback`.
@@ -15279,7 +15657,9 @@ jump-to-latest action of its own.
15279
15657
  **Themeable custom properties:** `--lr-thinking-panel-max-block-size` (default `16rem` —
15280
15658
  consumer-overridable cap on how tall `[part="body"]` grows before it scrolls internally; not
15281
15659
  exposed as a component property since it's a pure layout knob, not something a template branches
15282
- 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`,
15283
15663
  `--lr-space-xs`/`-s`/`-m`, `--lr-radius`, `--lr-focus-ring-width`/`-color`/`-offset`,
15284
15664
  `--lr-transition-fast`/`-base`.
15285
15665
 
@@ -15371,7 +15751,11 @@ toggle for a run of internal frames), `raw` (the verbatim fallback when zero str
15371
15751
  parsed), `copy-button` (only rendered while `copyable`).
15372
15752
 
15373
15753
  **Themeable custom properties:** `--lr-stack-trace-max-height` (default `none`),
15374
- `--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
15375
15759
  `--lr-color-border`/`-surface`/`-text`/`-text-quiet`/`-brand`, `--lr-radius`,
15376
15760
  `--lr-border-width-thin`, `--lr-space-xs`/`-s`/`-2xs`, `--lr-font-size-sm`/`-xs`,
15377
15761
  `--lr-font-weight-bold`/`-semibold`, `--lr-focus-ring-*`.
@@ -15459,7 +15843,8 @@ closing; otherwise always followed by `lr-close` with reason `'approve'`), `lr-d
15459
15843
  default, `event.detail` is `null`, not `undefined`. Cancelable, same `pending` mechanism, setting
15460
15844
  `pending` to `'deny'`; otherwise always followed by `lr-close` with reason `'deny'`), `lr-close`
15461
15845
  (`detail: ToolApprovalDialogCloseReason` — fired exactly once per dismissal, via Escape, a backdrop
15462
- 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.
15463
15848
 
15464
15849
  **Slots:** `footer` — optional supplementary content (e.g. a "remember this choice" checkbox),
15465
15850
  rendered before the built-in Deny/Edit/Approve buttons.
@@ -15526,12 +15911,10 @@ shared composed-tree focus traversal used by the other modal families.
15526
15911
  disconnect/reconnect fire back-to-back with no update in between.
15527
15912
  - the Approve button's native `disabled` attribute (while the draft is invalid JSON) automatically
15528
15913
  excludes it from the shared Tab trap, whose focusable-set computation skips disabled controls.
15529
- - the raw-JSON `args-editor` textarea always hardcodes `spellcheck="false"`, `autocapitalize="off"`,
15530
- and `autocorrect="off"` not exposed as configurable properties, unlike `<lr-textarea>`'s/
15531
- `<lr-chat-composer>`'s passthrough props since its content is always JSON, never prose; without
15532
- this a mobile browser (notably iOS Safari, which defaults textarea `autocapitalize` to
15533
- `'sentences'`) could auto-capitalize or auto-correct key/value text as the user edits, silently
15534
- 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.
15535
15918
  - `deny-button`/`approve-button` are `<lr-button>` hosts (`variant="neutral"`/`"brand"` — this
15536
15919
  component has no `tone` property) — `--lr-button-*` theming reaches them directly. A consumer
15537
15920
  previously styling `::part(deny-button)`/`::part(approve-button)` for
@@ -15597,13 +15980,19 @@ and makes the form invalid instead of being silently accepted.
15597
15980
  updates `ElementInternals`, and returns validity without revealing inline errors.
15598
15981
  - `reportValidity(): boolean` — performs the same resynchronization, reveals all current field/root
15599
15982
  errors, focuses the first invalid generated field when one exists, and delegates to native
15600
- `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.
15601
15986
 
15602
15987
  **Events:** `lr-input` (`detail: { value: Record<string, unknown> }` — the full current value
15603
15988
  object, every property with defaults resolved, not just the field that changed), `lr-validity-change`
15604
15989
  (`detail: { valid: boolean; errors: Record<string, string> }` — fired whenever overall validity or
15605
15990
  the field-error set changes, including once up front at connect time; serialization-only failures
15606
- 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.
15607
15996
 
15608
15997
  **Slots:** none.
15609
15998
 
@@ -15646,13 +16035,16 @@ This component owns no Submit/Cancel/Approve chrome — a consumer composes it i
15646
16035
  `<lr-option>`s; a plain `'string'` renders a text `<input>`; `'number'`/`'integer'` render a numeric
15647
16036
  `<input type="number">` (`step="1"` for integer, `step="any"` for number); `'boolean'` renders a
15648
16037
  `<lr-checkbox>` with the field's label projected into its default slot — real slotted content, since
15649
- that's `<lr-checkbox>`'s documented way to give itself an accessible name, unlike `aria-describedby`
15650
- (neither `<lr-select>` nor `<lr-checkbox>` forward a host-level `aria-describedby` to their
15651
- internal focusable element, so for the enum-select case the error message is folded into `aria-label`
15652
- instead, alongside the always-visible adjacent `[part="description"]` text). The outer component owns
15653
- schema validity rather than forwarding HTML `required` constraints: JSON Schema `required` means an
15654
- own property is present, so `''`, `0`, and `false` are valid present values. Use
15655
- `{ 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.
15656
16048
 
15657
16049
  Optional native `<form>` participation is implemented via `ElementInternals` attached directly in the
15658
16050
  constructor (`static formAssociated = true`) rather than a string-value mixin, since this component's
@@ -15673,6 +16065,9 @@ a JSON object, falls back to `{}` for malformed/non-object state, and does not e
15673
16065
  after an explicit `reportValidity()` call — `checkValidity()` alone never reveals them, matching
15674
16066
  every other form control in this library (`<lr-select>`/`<lr-combobox>`/`<lr-model-select>`
15675
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.
15676
16071
  - `effectiveValue` distinguishes "key absent from `value`" (falls back to `default`) from "key present
15677
16072
  but `undefined`" (stays cleared and counts as absent for `required`) via `hasOwnProperty`, not an
15678
16073
  `=== undefined` fallback check.
@@ -15799,6 +16194,8 @@ scroll position. `disabled: boolean = false` (reflected) disables every vote but
15799
16194
  output), and `prompt` (optional shared-input header above both panes).
15800
16195
 
15801
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.
15802
16199
 
15803
16200
  **CSS parts:** `base` (the outer wrapper), `prompt` (the optional prompt header, hidden when the
15804
16201
  `prompt` slot is empty), `panes` (the row, or under 640px column, wrapping both panes), `pane-a`,
@@ -15807,7 +16204,11 @@ output), and `prompt` (optional shared-input header above both panes).
15807
16204
  internal vote-announcement live region).
15808
16205
 
15809
16206
  **Themeable custom properties:** `--lr-compare-panel-max-height` (default `var(--lr-size-24rem)`) —
15810
- 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.
15811
16212
 
15812
16213
  ## `lr-span-waterfall`
15813
16214
 
@@ -15836,10 +16237,22 @@ Space).
15836
16237
  bar), `meta` (secondary row info, shown inline under 480px), `status-text`, `duration`, `empty` (shown
15837
16238
  when `spans` is empty), and `live-region`.
15838
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
+
15839
16244
  **Themeable custom properties:** `--lr-span-waterfall-name-width` (default `8rem`),
15840
16245
  `--lr-span-waterfall-stripe-speed` (a `running` span's striped-bar animation duration; defaults to
15841
16246
  `--lr-transition-ambient`), and `--lr-span-waterfall-row-active-bg` (default
15842
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.
15843
16256
 
15844
16257
  That last one follows the convention every **state-scoped** custom property in this family uses, and
15845
16258
  it is worth reading once: it is an inline `var()` fallback at its point of use and is deliberately
@@ -15893,7 +16306,12 @@ label/summary/toggle while `compact`, one step tighter than the header's uncompa
15893
16306
  `--lr-space-xs`, so `compact` tightens the header's *interior* spacing and not just its padding;
15894
16307
  `--lr-task-list-compact-gap` (default `var(--lr-space-2xs)`) — gap between `[part="body"]`'s item
15895
16308
  rows while `compact`; `--lr-task-list-compact-body-padding` (default `var(--lr-space-2xs)
15896
- 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.
15897
16315
 
15898
16316
  ## `lr-terminal`
15899
16317
 
@@ -15920,7 +16338,10 @@ line-granular (a match identifies a whole line, not a character range) and cappe
15920
16338
  stops climbing on a pathologically repetitive buffer. `getPlainText()` returns the SGR-stripped
15921
16339
  plain text of the whole buffer.
15922
16340
 
15923
- **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),
15924
16345
  `lr-follow-change` (`detail: { following }`), `lr-search-change` (`detail: { query, matchCount,
15925
16346
  activeIndex }`), `lr-highlight-activate` (`detail: { id }`), and `lr-text-select` (`detail: {
15926
16347
  text, anchor, rects }`).
@@ -15951,6 +16372,15 @@ beat it without `!important`.
15951
16372
  - `--lr-terminal-search-outline-color` — Outline color for a line containing a non-active search match. Default: `var(--lr-color-warning)`.
15952
16373
  - `--lr-terminal-search-active-outline-color` — Outline color for the active search match's line. Default: `var(--lr-color-brand)`.
15953
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
+
15954
16384
  ## `lr-trace-tree`
15955
16385
 
15956
16386
  A collapsible span hierarchy for one agent/LLM trace (Langfuse/LangSmith run-tree style): kind icon,
@@ -15964,6 +16394,9 @@ as a root rather than being dropped. `activeSpanId: string | null = null`
15964
16394
  (attribute `active-span-id`), `label: string = ''`, `showTokens: boolean = false` (attribute
15965
16395
  `show-tokens`) — surfaces `tokensIn`/`tokensOut`, `showCost: boolean = false` (attribute
15966
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.
15967
16400
 
15968
16401
  **Methods:** `expandAll()` and `collapseAll()` set every row's expanded state at once.
15969
16402
 
@@ -16103,16 +16536,30 @@ name: string; tests: TestCaseResult[] }` and `TestCaseResult { id: string; name:
16103
16536
  TestStatus; durationMs?: number; message?: string }`, with `TestStatus = 'passed' | 'failed' |
16104
16537
  'skipped' | 'running'` (all three exported here). `statusFilter: TestStatus[] =
16105
16538
  []` (attribute: false) — empty shows every status; and `autoExpandFailures: boolean = true`
16106
- (attribute `auto-expand-failures`).
16107
-
16108
- **Slots:** `detail-{testId}` — rich failure detail for that test, rendered after its plain `message`
16109
- 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.
16110
16552
 
16111
16553
  **Events:** `lr-test-select` (`detail: { suiteId: string; testId: string }`, a test row's name was
16112
16554
  activated), `lr-filter-change` (`detail: { statuses: TestStatus[] }` — the complete next filter set; the
16113
16555
  component updates its own `statusFilter` first, then emits),
16114
- and `lr-toggle` (`detail: { id: string; expanded: boolean }`, a row's failure detail was
16115
- 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.
16116
16563
 
16117
16564
  **CSS parts:** `base`, `summary` (the status-count strip), `count` (carries `data-status`), `filter`,
16118
16565
  `filter-toggle` (carries `data-status`/`aria-pressed`), `suite`, `suite-header`, `test` (carries
@@ -16128,7 +16575,11 @@ filter toggle. All three follow the state-scoped-property convention described u
16128
16575
  the element or on any ancestor. They exist because
16129
16576
  `::part(filter-toggle)[aria-pressed='true']` is invalid CSS — Shadow Parts forbids an attribute
16130
16577
  selector after `::part()` — so restyling the pressed state otherwise meant overriding the
16131
- 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)`).
16132
16583
 
16133
16584
  ## `lr-confirm-bar`
16134
16585
 
@@ -16539,6 +16990,8 @@ Rubric scoring and human-review surface for comparing the runs of one evaluation
16539
16990
 
16540
16991
  Composes `lr-table` (the comparison table), `lr-rubric-form` (the review surface), and
16541
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.
16542
16995
 
16543
16996
  **Properties:**
16544
16997
  - `runs: EvalRunResult[] = []` (attribute: false) — `EvalRunResult { id: string; label: string;
@@ -16672,12 +17125,17 @@ primitives, with retry counts and sensitive-field redaction.
16672
17125
  unknown }`, extending the shared detail from `@aceshooting/lyra-ui/ai`). `args` is present only when
16673
17126
  `approved` is `true`, and may differ from what the entry originally proposed — the dialog's inline
16674
17127
  edit step can hand back different arguments. A listener that only needs `{ invocationId, approved }`
16675
- 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.
16676
17132
 
16677
17133
  **CSS parts:** `base`,
16678
17134
  `entry`, `entry-marker`, `entry-header`, `entry-timestamp`, `entry-body`, `entry-details`,
16679
17135
  `entry-result`, `entry-error`, `entry-retries`, `entry-retries-count`, `entry-retries-label`,
16680
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.
16681
17139
 
16682
17140
  **Themeable custom properties:** `--lr-tool-timeline-gap` (default `var(--lr-space-l)`) — vertical
16683
17141
  gap between entries; `--lr-tool-timeline-marker-size` (default `var(--lr-size-0-625rem)`) — the
@@ -16734,6 +17192,8 @@ It never executes tools or persists decisions.
16734
17192
 
16735
17193
  **Events:** `lr-approval-select` (`{ invocationId }`), `lr-approval-decision` (`{ invocationId,
16736
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.
16737
17197
 
16738
17198
  **CSS parts:** `base`, `heading-row`, `heading`, `count`, `list`, `request`, `request-info`,
16739
17199
  `tool-name`, `request-id`, `status`, `empty`. The `[part='request']` row matching `selectedId`
@@ -16778,6 +17238,12 @@ request. Both are no-ops before a frame exists.
16778
17238
  (`{ level, value }`), and `lr-mcp-resize` (`{ height }`). These are host-authorized requests; the
16779
17239
  component does not execute tools, send messages, or navigate itself.
16780
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
+
16781
17247
  **CSS parts:** `base`, `frame`, `loading`, `error`.
16782
17248
 
16783
17249
  **Slots:** none. **Optional peer deps:** none.
@@ -16813,6 +17279,10 @@ PromptStudioMessage[]; variables?: PromptStudioVariable[]; createdAt?: string }`
16813
17279
  `message-content`, `remove-message`, `add-message`, `variables`, `variable`, `versions`, `version`,
16814
17280
  `preview`, `save`, `run`.
16815
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
+
16816
17286
  **Slots:** none. **Optional peer deps:** none.
16817
17287
 
16818
17288
  ```ts
@@ -16845,7 +17315,9 @@ keywords. `SchemaValidationIssue = { path: string; message: string; severity?: '
16845
17315
  **Events:** `lr-schema-select` (`{ path, schema }`, with an RFC 6901-style JSON Pointer).
16846
17316
 
16847
17317
  **CSS parts:** `base`, `tree`, `node`, `node-selected`, `node-trigger`, `name`, `type`, `required`,
16848
- `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.
16849
17321
 
16850
17322
  `[part='issue']` carries `data-severity` and each severity has its own styling: `error` reads the
16851
17323
  danger tokens, `warning` the warning tokens, and `info` its own pair —
@@ -16859,8 +17331,10 @@ invalid CSS, so this is the only way to recolor one severity without touching th
16859
17331
  **Themeable custom properties:** `--lr-schema-viewer-info-border`, `--lr-schema-viewer-info-bg` (see
16860
17332
  above); otherwise shared tokens only.
16861
17333
 
16862
- Rendering is capped at 500 schema nodes; `limit` reports truncation. Cycles stop at the repeated
16863
- 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.
16864
17338
 
16865
17339
  ```ts
16866
17340
  import '@aceshooting/lyra-ui/components/agent-tools/schema-viewer/schema-viewer.js';
@@ -16869,6 +17343,7 @@ import '@aceshooting/lyra-ui/components/agent-tools/schema-viewer/schema-viewer.
16869
17343
  **Additional API surface:**
16870
17344
 
16871
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.
16872
17347
  - `--lr-schema-viewer-selected-border` — Selected node branch. Default: `var(--lr-color-brand)`.
16873
17348
  - `--lr-schema-viewer-error-border` — Error issue border. Default: `var(--lr-color-danger)`.
16874
17349
  - `--lr-schema-viewer-error-bg` — Error issue background. Default: `var(--lr-color-danger-quiet)`.
@@ -16893,7 +17368,10 @@ Record<string, unknown> }`.
16893
17368
  `task`, `model`, `progress`, `actions`, `cancel`, `retry`, `limit`, `empty`.
16894
17369
 
16895
17370
  At most 500 runs render, and visual indentation is capped at 12 levels while ARIA hierarchy keeps
16896
- 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.
16897
17375
 
16898
17376
  ```ts
16899
17377
  import '@aceshooting/lyra-ui/components/agent-tools/subagent-panel/subagent-panel.js';
@@ -16935,8 +17413,9 @@ A force-directed node-link diagram with pan/zoom/drag, built on `d3-force`.
16935
17413
  boolean; color?: string; dash?: number[] }` (source/target are node ids). `directed` adds an
16936
17414
  arrowhead; `color` and `dash` style the individual stroke; `label` provides a spoken-name and SVG
16937
17415
  tooltip fallback but is not rendered as visible edge text; `accessibleLabel` and `description`
16938
- can override the spoken name and tooltip independently. A link whose `source` id doesn't resolve
16939
- 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
16940
17419
  (there's no position to draw a stub from). A link whose `target` id doesn't resolve instead renders
16941
17420
  as a short, dashed, non-interactive stub off `source`'s own position
16942
17421
  (`[part='link'][data-dangling]`, `aria-hidden="true"`) rather than being silently dropped — e.g. for
@@ -16979,7 +17458,9 @@ A force-directed node-link diagram with pan/zoom/drag, built on `d3-force`.
16979
17458
  `::part(node)`/`::part(link)` styling (pixels, not elements — theme via cssprops instead), no
16980
17459
  native SVG `<title>` tooltip (replaced by `part="tooltip"`), and a drawn focus ring instead of a
16981
17460
  CSS one. Keyboard roving/announcements are preserved through an offscreen `part="cursor-item"`
16982
- 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.
16983
17464
 
16984
17465
  **Methods:** `focusNode(id, options?: { zoom? })` and `fit(options?: { padding?: number })` control the
16985
17466
  camera; `getNodePosition(id)` returns the current `{ x, y }` in graph-local drawing coordinates, or
@@ -16992,7 +17473,9 @@ id? }`; the optional `id` is the stable `GraphLink.id` supplied by the caller),
16992
17473
  `lr-link-enter`/`lr-link-leave` (`detail: { source, target, id? }`, same hover contract),
16993
17474
  `lr-node-expand` (`detail: { id }`, a node was double-activated — native `dblclick`, or two
16994
17475
  Enter/Space activations within 500ms — regardless of `GraphNode.expandable`), `lr-community-click`
16995
- (`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)
16996
17479
 
16997
17480
  **Slots:** none.
16998
17481
 
@@ -17028,8 +17511,10 @@ Under `renderer="canvas"` these five are read from computed style at paint time
17028
17511
  per-node elements to inherit them), so they must be set on or above the `<lr-graph>` host itself.
17029
17512
 
17030
17513
  **Optional peer deps:** `d3-force`, `d3-drag`, `d3-zoom`, `d3-selection` (all four required
17031
- together; lazy-`import()`ed once per page, `console.warn` once and renders empty if missing
17032
- 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`.
17033
17518
 
17034
17519
  ```html
17035
17520
  <lr-graph style="display:block;height:500px"></lr-graph>
@@ -17071,12 +17556,11 @@ install with `pnpm add d3-force d3-drag d3-zoom d3-selection`).
17071
17556
  `<lr-skeleton>` sized to `width`/`height` with `aria-busy="true"`. If they fail to load (for
17072
17557
  example, because they are not installed), the graph fails closed with a localized
17073
17558
  `part="error"` / `role="alert"` message instead of leaving an empty SVG.
17074
- - `GraphNode.color` is sanitized (rejects `;`/`{`/`}`) before being written into the
17075
- `--lr-node-fill` inline custom property, so an untrusted color string can't break out of that
17076
- CSS declaration.
17077
- - `GraphLink.color` applies the same declaration-delimiter sanitization. `GraphLink.dash` is used
17078
- only when every entry is finite and non-negative; an empty or invalid array falls back to a solid
17079
- 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.
17080
17564
  - a structural `nodes`/`links` change now carries over each already-settled node's position (and any
17081
17565
  in-progress drag) by id when rebuilding the simulation, instead of discarding every node's (x, y)
17082
17566
  and re-running the whole ~300-tick random-start settle from scratch — only genuinely new ids get a
@@ -17085,6 +17569,8 @@ install with `pnpm add d3-force d3-drag d3-zoom d3-selection`).
17085
17569
  - under `prefers-reduced-motion: reduce`, or whenever `seed` is set, the simulation converges
17086
17570
  synchronously (ticked in a loop down to `alphaMin` before first paint) instead of animating over
17087
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.
17088
17574
  - the `<svg part="svg">` now carries `role="group"` and an `aria-label` summarizing the node/link
17089
17575
  counts (e.g. "Node-link diagram with 5 nodes and 4 links"), and node `<text part="label">`s are
17090
17576
  `aria-hidden="true"` (their content is already covered by each node's own `aria-label`).
@@ -17192,7 +17678,8 @@ same event-decoupled contract every sibling in this family follows.
17192
17678
  **Properties:**
17193
17679
  - `types: LyraGraphLegendType[] = []` (attribute: false) — `{ id: string; label: string; color?:
17194
17680
  string; shape?: 'circle' | 'square' | 'diamond' }`, the exact `lr-graph.nodeTypes` entry shape
17195
- (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
17196
17683
  - `counts?: Record<string, number>` (attribute: false) — optional per-type count shown alongside the
17197
17684
  label
17198
17685
  - `hiddenTypes: string[] = []` (attribute: false) — controlled; the host assigns this back from
@@ -17212,7 +17699,8 @@ after each toggle).
17212
17699
  **Themeable custom properties:** `--lr-graph-legend-hidden-color` (default
17213
17700
  `var(--lr-color-text-quiet)`) — text color of a filtered-out (hidden) row's `label`/`count`,
17214
17701
  independent of the shared quiet-text token so a host can retint "hidden" rows without repainting
17215
- 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`
17216
17704
  (the same computed-style fallback palette `lr-graph`/`lr-word-cloud` use) plus shared tokens.
17217
17705
 
17218
17706
  **Optional peer deps:** none.
@@ -17580,7 +18068,8 @@ stance `lr-tool-select-dialog` already takes.
17580
18068
  - `sources: LyraSourceEntry[] = []` (attribute: false) — `LyraSourceEntry { id: string; label:
17581
18069
  string; mimeType?: string; name?: string; children?: LyraSourceEntry[] }`; flat (no `children`) or
17582
18070
  a tree — presence of `children` makes a row a group/folder with tri-state select
17583
- - `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
17584
18073
  `lr-sources-change`
17585
18074
  - `showSelectAll: boolean = true` (attribute `show-select-all`)
17586
18075
  - `searchable: boolean = true`
@@ -17596,7 +18085,8 @@ fired after every toggle including select-all).
17596
18085
 
17597
18086
  **CSS parts:** `base`, `search` (the built-in filter `lr-input`, only when `searchable`),
17598
18087
  `select-all` (only when `showSelectAll`), `summary` ("{selected} of {total} selected"), `tree`
17599
- (`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),
17600
18090
  `checkbox` (tri-state glyph), `icon` (the `lr-file-icon` type badge), `label`, `empty` (`noData`
17601
18091
  when `sources` is empty, `noMatches` when a filter empties the tree).
17602
18092
 
@@ -17752,8 +18242,9 @@ anything about `<lr-source-card>`, it only carries the id through its event deta
17752
18242
  echoed back verbatim in both events; never read or validated by this component.
17753
18243
  - `href: string = ''` — optional direct link target for the citation's source, carried into
17754
18244
  `lr-citation-open`'s detail as-is; this component never navigates.
17755
- - `label: string = ''` — overrides the computed accessible name. The built-in citation/status
17756
- 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.
17757
18248
 
17758
18249
  **Events:**
17759
18250
  - `lr-citation-activate` (`detail: { sourceId: string; index: number }`) — fires on click, or on
@@ -17856,7 +18347,8 @@ handy for building a `label-plural` string reactively, e.g. `` list.labelPlural
17856
18347
  collapsing the list.
17857
18348
 
17858
18349
  **Slots:** default — `<lr-source-card>` elements (or any content, though the card pairing is the
17859
- 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.
17860
18352
 
17861
18353
  **CSS parts:** `base` (outer container), `header` (the clickable `<button>` toggling `expanded`),
17862
18354
  `toggle` (the chevron indicator inside the header), `list` (wrapper around the default slot, `hidden`
@@ -18054,7 +18546,8 @@ and `lr-citation-badge` for each evidence entry.
18054
18546
  `@aceshooting/lyra-ui/ai` = `{ citation: Citation }`) — emitted when an evidence badge is activated.
18055
18547
  The inner `lr-citation-badge`'s own `lr-citation-activate` (`detail: { sourceId, index }`) still
18056
18548
  bubbles through unmodified; this richer event exists because a bare `sourceId`/`index` pair can't
18057
- 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.
18058
18551
 
18059
18552
  **Slots:** none.
18060
18553
 
@@ -18097,7 +18590,8 @@ embedding counts, retry attempts, errors, and retry/cancel requests. Never inges
18097
18590
  **Events:**
18098
18591
  - `lr-retry` (`detail: IngestionRetryEventDetail` = `RetryEventDetail & { itemId: string }` =
18099
18592
  `{ attempt: number; messageId?: string; itemId: string }`) — `attempt` is the attempt about to be
18100
- 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.
18101
18595
  - `lr-cancel` (`detail: IngestionCancelEventDetail` = `CancelEventDetail & { itemId: string }` =
18102
18596
  `{ reason?: string; itemId: string }`) — this component never supplies `reason` itself. Only
18103
18597
  offered on non-terminal rows (`'queued'` plus the five active stages).
@@ -18208,7 +18702,8 @@ overlay. Composes `lr-graph`, `lr-graph-legend`, `lr-entity-card`, `lr-neighbor-
18208
18702
  (self-managed but presettable/observable — this component toggles its own copy on interaction, the
18209
18703
  same self-toggle-then-emit contract `lr-graph-legend` uses, so every feature works with zero host wiring)
18210
18704
  - `hiddenTypes: string[] = []` (attribute: false) — forwarded to both `lr-graph.hiddenTypes` and
18211
- `lr-graph-legend.hiddenTypes`
18705
+ `lr-graph-legend.hiddenTypes`; hidden nodes are also excluded from explorer search results,
18706
+ neighbor rows, and activation
18212
18707
  - `selectedNodeId: string | null = null` (attribute `selected-node-id`) — drives the details popover
18213
18708
  and `lr-graph.selectedNodeIds`; `null` shows no selection and keeps the popover closed
18214
18709
  - `pinnedNodeIds: string[] = []` (attribute: false) — exactly two pinned nodes reveals the "Find
@@ -18492,6 +18987,8 @@ is non-empty and not `loading`), `empty` (only when `empty` and neither `loading
18492
18987
  - Submitting while `loading` is already true **supersedes** the in-flight request: `lr-cancel` fires
18493
18988
  immediately before the new `lr-search`. Clicking the submit button (rather than pressing Enter)
18494
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.
18495
18992
 
18496
18993
  ---
18497
18994
 
@@ -18579,7 +19076,8 @@ the component only normalizes them into SVG, colors optional clusters, and emits
18579
19076
  **Properties:** `points: EmbeddingPoint[] = []` (attribute: false), where each point is `{ id, x,
18580
19077
  y, label?, sourceId?, cluster? }`; `selectedId: string = ''`; `height: string = '360px'`;
18581
19078
  `accessibleLabel: string | null = null` (attribute `aria-label`). Non-finite coordinates are
18582
- 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.
18583
19081
 
18584
19082
  **Events:** `lr-point-select` (`{ point }`), activated by click or Enter/Space.
18585
19083
 
@@ -18596,7 +19094,9 @@ permissions, and connector settings go in the `settings` slot.
18596
19094
 
18597
19095
  **Properties:** `sources: KnowledgeSource[] = []` (attribute: false); `ingestionItems:
18598
19096
  IngestionQueueItem[] = []` (attribute: false); `activeTab: 'sources' | 'ingestion' = 'sources'`;
18599
- `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.
18600
19100
 
18601
19101
  **Events:** `lr-tab-change` (`{ tab }`), `lr-source-create`, `lr-source-sync`, `lr-source-pause`,
18602
19102
  `lr-source-delete`, `lr-ingestion-retry`, and `lr-ingestion-cancel` (the latter four preserve the