@aceshooting/lyra-ui 6.1.0 → 6.2.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 (663) hide show
  1. package/CHANGELOG.md +140 -0
  2. package/README.md +10 -5
  3. package/custom-elements.json +7947 -860
  4. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.class.d.ts +67 -0
  5. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.class.d.ts.map +1 -0
  6. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.class.js +78 -0
  7. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.class.js.map +1 -0
  8. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.d.ts +2 -0
  9. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.d.ts.map +1 -0
  10. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.js +5 -0
  11. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.js.map +1 -0
  12. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.styles.d.ts +2 -0
  13. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.styles.d.ts.map +1 -0
  14. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.styles.js +17 -0
  15. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.styles.js.map +1 -0
  16. package/dist/components/agent-tools/agent-trace/agent-trace.class.js +1 -1
  17. package/dist/components/agent-tools/agent-trace/agent-trace.class.js.map +1 -1
  18. package/dist/components/agent-tools/agent-trace/agent-trace.styles.d.ts.map +1 -1
  19. package/dist/components/agent-tools/agent-trace/agent-trace.styles.js +2 -0
  20. package/dist/components/agent-tools/agent-trace/agent-trace.styles.js.map +1 -1
  21. package/dist/components/agent-tools/approval-queue/approval-queue.class.d.ts +77 -0
  22. package/dist/components/agent-tools/approval-queue/approval-queue.class.d.ts.map +1 -0
  23. package/dist/components/agent-tools/approval-queue/approval-queue.class.js +144 -0
  24. package/dist/components/agent-tools/approval-queue/approval-queue.class.js.map +1 -0
  25. package/dist/components/agent-tools/approval-queue/approval-queue.d.ts +2 -0
  26. package/dist/components/agent-tools/approval-queue/approval-queue.d.ts.map +1 -0
  27. package/dist/components/agent-tools/approval-queue/approval-queue.js +5 -0
  28. package/dist/components/agent-tools/approval-queue/approval-queue.js.map +1 -0
  29. package/dist/components/agent-tools/approval-queue/approval-queue.styles.d.ts +2 -0
  30. package/dist/components/agent-tools/approval-queue/approval-queue.styles.d.ts.map +1 -0
  31. package/dist/components/agent-tools/approval-queue/approval-queue.styles.js +96 -0
  32. package/dist/components/agent-tools/approval-queue/approval-queue.styles.js.map +1 -0
  33. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
  34. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js.map +1 -1
  35. package/dist/components/agent-tools/context-inspector/context-inspector.class.d.ts +1 -0
  36. package/dist/components/agent-tools/context-inspector/context-inspector.class.d.ts.map +1 -1
  37. package/dist/components/agent-tools/context-inspector/context-inspector.class.js +4 -1
  38. package/dist/components/agent-tools/context-inspector/context-inspector.class.js.map +1 -1
  39. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.js +1 -1
  40. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.js.map +1 -1
  41. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.d.ts.map +1 -1
  42. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +10 -8
  43. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js.map +1 -1
  44. package/dist/components/agent-tools/stack-trace/stack-trace.class.js +1 -1
  45. package/dist/components/agent-tools/stack-trace/stack-trace.class.js.map +1 -1
  46. package/dist/components/agent-tools/terminal/terminal.class.js +1 -1
  47. package/dist/components/agent-tools/terminal/terminal.class.js.map +1 -1
  48. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.d.ts.map +1 -1
  49. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.js +11 -5
  50. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.js.map +1 -1
  51. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +1 -1
  52. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js.map +1 -1
  53. package/dist/components/agent-tools/tool-result-view/registry.d.ts +38 -1
  54. package/dist/components/agent-tools/tool-result-view/registry.d.ts.map +1 -1
  55. package/dist/components/agent-tools/tool-result-view/registry.js.map +1 -1
  56. package/dist/components/agent-tools/tool-result-view/tool-result-view.class.d.ts +16 -1
  57. package/dist/components/agent-tools/tool-result-view/tool-result-view.class.d.ts.map +1 -1
  58. package/dist/components/agent-tools/tool-result-view/tool-result-view.class.js +32 -1
  59. package/dist/components/agent-tools/tool-result-view/tool-result-view.class.js.map +1 -1
  60. package/dist/components/agent-tools/trace-tree/trace-tree.class.d.ts.map +1 -1
  61. package/dist/components/agent-tools/trace-tree/trace-tree.class.js +21 -10
  62. package/dist/components/agent-tools/trace-tree/trace-tree.class.js.map +1 -1
  63. package/dist/components/charts/chart/box-plot.class.d.ts +4 -0
  64. package/dist/components/charts/chart/box-plot.class.d.ts.map +1 -1
  65. package/dist/components/charts/chart/box-plot.class.js +43 -11
  66. package/dist/components/charts/chart/box-plot.class.js.map +1 -1
  67. package/dist/components/charts/chart/chart-loader.d.ts +39 -0
  68. package/dist/components/charts/chart/chart-loader.d.ts.map +1 -1
  69. package/dist/components/charts/chart/chart-loader.js +53 -0
  70. package/dist/components/charts/chart/chart-loader.js.map +1 -1
  71. package/dist/components/charts/chart/chart.class.d.ts +113 -10
  72. package/dist/components/charts/chart/chart.class.d.ts.map +1 -1
  73. package/dist/components/charts/chart/chart.class.js +293 -20
  74. package/dist/components/charts/chart/chart.class.js.map +1 -1
  75. package/dist/components/charts/chart/lite-chart.class.d.ts +17 -5
  76. package/dist/components/charts/chart/lite-chart.class.d.ts.map +1 -1
  77. package/dist/components/charts/chart/lite-chart.class.js +60 -9
  78. package/dist/components/charts/chart/lite-chart.class.js.map +1 -1
  79. package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +4 -0
  80. package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts.map +1 -1
  81. package/dist/components/conversation/agent-workspace/agent-workspace.class.js +17 -4
  82. package/dist/components/conversation/agent-workspace/agent-workspace.class.js.map +1 -1
  83. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.d.ts +2 -7
  84. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.d.ts.map +1 -1
  85. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.js +29 -58
  86. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.js.map +1 -1
  87. package/dist/components/conversation/code-block/code-block-core.class.d.ts.map +1 -1
  88. package/dist/components/conversation/code-block/code-block-core.class.js +12 -1
  89. package/dist/components/conversation/code-block/code-block-core.class.js.map +1 -1
  90. package/dist/components/conversation/code-block/code-block.class.d.ts.map +1 -1
  91. package/dist/components/conversation/code-block/code-block.class.js +3 -0
  92. package/dist/components/conversation/code-block/code-block.class.js.map +1 -1
  93. package/dist/components/conversation/conversation-item/conversation-item.class.d.ts +7 -0
  94. package/dist/components/conversation/conversation-item/conversation-item.class.d.ts.map +1 -1
  95. package/dist/components/conversation/conversation-item/conversation-item.class.js +8 -0
  96. package/dist/components/conversation/conversation-item/conversation-item.class.js.map +1 -1
  97. package/dist/components/conversation/conversation-item/conversation-item.styles.d.ts.map +1 -1
  98. package/dist/components/conversation/conversation-item/conversation-item.styles.js +12 -0
  99. package/dist/components/conversation/conversation-item/conversation-item.styles.js.map +1 -1
  100. package/dist/components/conversation/markdown/markdown-core.class.d.ts.map +1 -1
  101. package/dist/components/conversation/markdown/markdown-core.class.js +2 -1
  102. package/dist/components/conversation/markdown/markdown-core.class.js.map +1 -1
  103. package/dist/components/conversation/markdown/markdown.class.d.ts.map +1 -1
  104. package/dist/components/conversation/markdown/markdown.class.js +2 -1
  105. package/dist/components/conversation/markdown/markdown.class.js.map +1 -1
  106. package/dist/components/conversation/message-actions/message-actions.class.d.ts.map +1 -1
  107. package/dist/components/conversation/message-actions/message-actions.class.js +5 -2
  108. package/dist/components/conversation/message-actions/message-actions.class.js.map +1 -1
  109. package/dist/components/conversation/model-select/model-select.class.d.ts +4 -0
  110. package/dist/components/conversation/model-select/model-select.class.d.ts.map +1 -1
  111. package/dist/components/conversation/model-select/model-select.class.js +4 -0
  112. package/dist/components/conversation/model-select/model-select.class.js.map +1 -1
  113. package/dist/components/conversation/model-select/model-select.styles.d.ts.map +1 -1
  114. package/dist/components/conversation/model-select/model-select.styles.js +7 -3
  115. package/dist/components/conversation/model-select/model-select.styles.js.map +1 -1
  116. package/dist/components/conversation/thread-list/thread-list.class.d.ts +2 -0
  117. package/dist/components/conversation/thread-list/thread-list.class.d.ts.map +1 -1
  118. package/dist/components/conversation/thread-list/thread-list.class.js +4 -2
  119. package/dist/components/conversation/thread-list/thread-list.class.js.map +1 -1
  120. package/dist/components/conversation/typing-indicator/typing-indicator.class.d.ts +4 -2
  121. package/dist/components/conversation/typing-indicator/typing-indicator.class.d.ts.map +1 -1
  122. package/dist/components/conversation/typing-indicator/typing-indicator.class.js +4 -2
  123. package/dist/components/conversation/typing-indicator/typing-indicator.class.js.map +1 -1
  124. package/dist/components/conversation/typing-indicator/typing-indicator.styles.d.ts.map +1 -1
  125. package/dist/components/conversation/typing-indicator/typing-indicator.styles.js +35 -21
  126. package/dist/components/conversation/typing-indicator/typing-indicator.styles.js.map +1 -1
  127. package/dist/components/data/graph-query-builder/graph-query-builder.styles.d.ts.map +1 -1
  128. package/dist/components/data/graph-query-builder/graph-query-builder.styles.js +2 -0
  129. package/dist/components/data/graph-query-builder/graph-query-builder.styles.js.map +1 -1
  130. package/dist/components/data/heatmap/heatmap.class.d.ts +1 -6
  131. package/dist/components/data/heatmap/heatmap.class.d.ts.map +1 -1
  132. package/dist/components/data/heatmap/heatmap.class.js +118 -136
  133. package/dist/components/data/heatmap/heatmap.class.js.map +1 -1
  134. package/dist/components/data/table/table.class.d.ts +27 -0
  135. package/dist/components/data/table/table.class.d.ts.map +1 -1
  136. package/dist/components/data/table/table.class.js +67 -2
  137. package/dist/components/data/table/table.class.js.map +1 -1
  138. package/dist/components/data/table/table.styles.d.ts.map +1 -1
  139. package/dist/components/data/table/table.styles.js +17 -2
  140. package/dist/components/data/table/table.styles.js.map +1 -1
  141. package/dist/components/data/tree/tree.class.d.ts +16 -1
  142. package/dist/components/data/tree/tree.class.d.ts.map +1 -1
  143. package/dist/components/data/tree/tree.class.js.map +1 -1
  144. package/dist/components/data/word-cloud/word-cloud.class.d.ts +17 -0
  145. package/dist/components/data/word-cloud/word-cloud.class.d.ts.map +1 -1
  146. package/dist/components/data/word-cloud/word-cloud.class.js +43 -0
  147. package/dist/components/data/word-cloud/word-cloud.class.js.map +1 -1
  148. package/dist/components/data/word-cloud/word-cloud.styles.d.ts.map +1 -1
  149. package/dist/components/data/word-cloud/word-cloud.styles.js +18 -15
  150. package/dist/components/data/word-cloud/word-cloud.styles.js.map +1 -1
  151. package/dist/components/forms/button/button.class.d.ts +51 -7
  152. package/dist/components/forms/button/button.class.d.ts.map +1 -1
  153. package/dist/components/forms/button/button.class.js +102 -15
  154. package/dist/components/forms/button/button.class.js.map +1 -1
  155. package/dist/components/forms/button/button.styles.d.ts.map +1 -1
  156. package/dist/components/forms/button/button.styles.js +12 -4
  157. package/dist/components/forms/button/button.styles.js.map +1 -1
  158. package/dist/components/forms/checkbox/checkbox.class.d.ts +3 -0
  159. package/dist/components/forms/checkbox/checkbox.class.d.ts.map +1 -1
  160. package/dist/components/forms/checkbox/checkbox.class.js +19 -2
  161. package/dist/components/forms/checkbox/checkbox.class.js.map +1 -1
  162. package/dist/components/forms/combobox/combobox.class.d.ts +61 -10
  163. package/dist/components/forms/combobox/combobox.class.d.ts.map +1 -1
  164. package/dist/components/forms/combobox/combobox.class.js +62 -17
  165. package/dist/components/forms/combobox/combobox.class.js.map +1 -1
  166. package/dist/components/forms/combobox/combobox.styles.d.ts.map +1 -1
  167. package/dist/components/forms/combobox/combobox.styles.js +7 -3
  168. package/dist/components/forms/combobox/combobox.styles.js.map +1 -1
  169. package/dist/components/forms/date-picker/date-input.styles.js +1 -1
  170. package/dist/components/forms/emoji-picker/emoji-picker.styles.d.ts.map +1 -1
  171. package/dist/components/forms/emoji-picker/emoji-picker.styles.js +4 -5
  172. package/dist/components/forms/emoji-picker/emoji-picker.styles.js.map +1 -1
  173. package/dist/components/forms/icon-button/icon-button.class.d.ts +3 -0
  174. package/dist/components/forms/icon-button/icon-button.class.d.ts.map +1 -1
  175. package/dist/components/forms/icon-button/icon-button.class.js +3 -0
  176. package/dist/components/forms/icon-button/icon-button.class.js.map +1 -1
  177. package/dist/components/forms/icon-button/icon-button.styles.js +2 -2
  178. package/dist/components/forms/input/input.class.d.ts +25 -1
  179. package/dist/components/forms/input/input.class.d.ts.map +1 -1
  180. package/dist/components/forms/input/input.class.js +51 -4
  181. package/dist/components/forms/input/input.class.js.map +1 -1
  182. package/dist/components/forms/select/select.class.d.ts +23 -4
  183. package/dist/components/forms/select/select.class.d.ts.map +1 -1
  184. package/dist/components/forms/select/select.class.js +24 -8
  185. package/dist/components/forms/select/select.class.js.map +1 -1
  186. package/dist/components/forms/select/select.styles.d.ts.map +1 -1
  187. package/dist/components/forms/select/select.styles.js +8 -3
  188. package/dist/components/forms/select/select.styles.js.map +1 -1
  189. package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts +16 -0
  190. package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts.map +1 -1
  191. package/dist/components/forms/swatch-picker/swatch-picker.class.js +22 -4
  192. package/dist/components/forms/swatch-picker/swatch-picker.class.js.map +1 -1
  193. package/dist/components/forms/swatch-picker/swatch-picker.styles.d.ts.map +1 -1
  194. package/dist/components/forms/swatch-picker/swatch-picker.styles.js +31 -4
  195. package/dist/components/forms/swatch-picker/swatch-picker.styles.js.map +1 -1
  196. package/dist/components/forms/textarea/textarea.class.d.ts +30 -0
  197. package/dist/components/forms/textarea/textarea.class.d.ts.map +1 -1
  198. package/dist/components/forms/textarea/textarea.class.js +54 -0
  199. package/dist/components/forms/textarea/textarea.class.js.map +1 -1
  200. package/dist/components/forms/token-input/token-input.styles.d.ts.map +1 -1
  201. package/dist/components/forms/token-input/token-input.styles.js +6 -1
  202. package/dist/components/forms/token-input/token-input.styles.js.map +1 -1
  203. package/dist/components/layout/app-rail/app-rail.class.d.ts +16 -4
  204. package/dist/components/layout/app-rail/app-rail.class.d.ts.map +1 -1
  205. package/dist/components/layout/app-rail/app-rail.class.js +36 -4
  206. package/dist/components/layout/app-rail/app-rail.class.js.map +1 -1
  207. package/dist/components/layout/app-rail/app-rail.styles.d.ts.map +1 -1
  208. package/dist/components/layout/app-rail/app-rail.styles.js +21 -2
  209. package/dist/components/layout/app-rail/app-rail.styles.js.map +1 -1
  210. package/dist/components/layout/card/card.class.d.ts +6 -0
  211. package/dist/components/layout/card/card.class.d.ts.map +1 -1
  212. package/dist/components/layout/card/card.class.js +9 -1
  213. package/dist/components/layout/card/card.class.js.map +1 -1
  214. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.d.ts.map +1 -1
  215. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js +2 -0
  216. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js.map +1 -1
  217. package/dist/components/layout/segmented/segmented.class.d.ts +10 -1
  218. package/dist/components/layout/segmented/segmented.class.d.ts.map +1 -1
  219. package/dist/components/layout/segmented/segmented.class.js +29 -2
  220. package/dist/components/layout/segmented/segmented.class.js.map +1 -1
  221. package/dist/components/layout/split/split.class.d.ts +14 -3
  222. package/dist/components/layout/split/split.class.d.ts.map +1 -1
  223. package/dist/components/layout/split/split.class.js +65 -35
  224. package/dist/components/layout/split/split.class.js.map +1 -1
  225. package/dist/components/layout/widget/widget.class.d.ts +10 -0
  226. package/dist/components/layout/widget/widget.class.d.ts.map +1 -1
  227. package/dist/components/layout/widget/widget.class.js +29 -1
  228. package/dist/components/layout/widget/widget.class.js.map +1 -1
  229. package/dist/components/media/attachment-chip/attachment-chip.styles.d.ts.map +1 -1
  230. package/dist/components/media/attachment-chip/attachment-chip.styles.js +7 -8
  231. package/dist/components/media/attachment-chip/attachment-chip.styles.js.map +1 -1
  232. package/dist/components/media/file-input/file-input.class.d.ts +16 -1
  233. package/dist/components/media/file-input/file-input.class.d.ts.map +1 -1
  234. package/dist/components/media/file-input/file-input.class.js +42 -2
  235. package/dist/components/media/file-input/file-input.class.js.map +1 -1
  236. package/dist/components/media/file-input/file-input.styles.d.ts.map +1 -1
  237. package/dist/components/media/file-input/file-input.styles.js +12 -0
  238. package/dist/components/media/file-input/file-input.styles.js.map +1 -1
  239. package/dist/components/media/media-card/media-card.class.d.ts +6 -2
  240. package/dist/components/media/media-card/media-card.class.d.ts.map +1 -1
  241. package/dist/components/media/media-card/media-card.class.js +7 -3
  242. package/dist/components/media/media-card/media-card.class.js.map +1 -1
  243. package/dist/components/media/qr-code/qr-code.class.d.ts +1 -6
  244. package/dist/components/media/qr-code/qr-code.class.d.ts.map +1 -1
  245. package/dist/components/media/qr-code/qr-code.class.js +31 -67
  246. package/dist/components/media/qr-code/qr-code.class.js.map +1 -1
  247. package/dist/components/overlays/empty/empty.class.d.ts +3 -0
  248. package/dist/components/overlays/empty/empty.class.d.ts.map +1 -1
  249. package/dist/components/overlays/empty/empty.class.js +3 -0
  250. package/dist/components/overlays/empty/empty.class.js.map +1 -1
  251. package/dist/components/overlays/empty/empty.styles.d.ts.map +1 -1
  252. package/dist/components/overlays/empty/empty.styles.js +6 -0
  253. package/dist/components/overlays/empty/empty.styles.js.map +1 -1
  254. package/dist/components/overlays/overlay/popover.class.d.ts +9 -0
  255. package/dist/components/overlays/overlay/popover.class.d.ts.map +1 -1
  256. package/dist/components/overlays/overlay/popover.class.js +13 -0
  257. package/dist/components/overlays/overlay/popover.class.js.map +1 -1
  258. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.d.ts +1 -0
  259. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.d.ts.map +1 -1
  260. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.js +11 -5
  261. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.js.map +1 -1
  262. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts +54 -0
  263. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts.map +1 -0
  264. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +147 -0
  265. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js.map +1 -0
  266. package/dist/components/retrieval/embedding-explorer/embedding-explorer.d.ts +2 -0
  267. package/dist/components/retrieval/embedding-explorer/embedding-explorer.d.ts.map +1 -0
  268. package/dist/components/retrieval/embedding-explorer/embedding-explorer.js +5 -0
  269. package/dist/components/retrieval/embedding-explorer/embedding-explorer.js.map +1 -0
  270. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.d.ts +2 -0
  271. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.d.ts.map +1 -0
  272. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +51 -0
  273. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js.map +1 -0
  274. package/dist/components/retrieval/graph/graph.class.d.ts +1 -0
  275. package/dist/components/retrieval/graph/graph.class.d.ts.map +1 -1
  276. package/dist/components/retrieval/graph/graph.class.js +21 -6
  277. package/dist/components/retrieval/graph/graph.class.js.map +1 -1
  278. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts +73 -0
  279. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts.map +1 -0
  280. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +109 -0
  281. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js.map +1 -0
  282. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.d.ts +2 -0
  283. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.d.ts.map +1 -0
  284. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.js +5 -0
  285. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.js.map +1 -0
  286. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.d.ts +2 -0
  287. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.d.ts.map +1 -0
  288. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js +56 -0
  289. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js.map +1 -0
  290. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +1 -0
  291. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts.map +1 -1
  292. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +12 -4
  293. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js.map +1 -1
  294. package/dist/components/retrieval/rag-answer/rag-answer.class.d.ts +58 -0
  295. package/dist/components/retrieval/rag-answer/rag-answer.class.d.ts.map +1 -0
  296. package/dist/components/retrieval/rag-answer/rag-answer.class.js +110 -0
  297. package/dist/components/retrieval/rag-answer/rag-answer.class.js.map +1 -0
  298. package/dist/components/retrieval/rag-answer/rag-answer.d.ts +2 -0
  299. package/dist/components/retrieval/rag-answer/rag-answer.d.ts.map +1 -0
  300. package/dist/components/retrieval/rag-answer/rag-answer.js +5 -0
  301. package/dist/components/retrieval/rag-answer/rag-answer.js.map +1 -0
  302. package/dist/components/retrieval/rag-answer/rag-answer.styles.d.ts +2 -0
  303. package/dist/components/retrieval/rag-answer/rag-answer.styles.d.ts.map +1 -0
  304. package/dist/components/retrieval/rag-answer/rag-answer.styles.js +13 -0
  305. package/dist/components/retrieval/rag-answer/rag-answer.styles.js.map +1 -0
  306. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts.map +1 -1
  307. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +6 -3
  308. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js.map +1 -1
  309. package/dist/components/utility/diff-view/diff-view.class.d.ts +4 -2
  310. package/dist/components/utility/diff-view/diff-view.class.d.ts.map +1 -1
  311. package/dist/components/utility/diff-view/diff-view.class.js +16 -6
  312. package/dist/components/utility/diff-view/diff-view.class.js.map +1 -1
  313. package/dist/components/utility/icon/icon.class.d.ts.map +1 -1
  314. package/dist/components/utility/icon/icon.class.js +5 -0
  315. package/dist/components/utility/icon/icon.class.js.map +1 -1
  316. package/dist/components/viewers/archive-viewer/archive-viewer.class.d.ts +16 -2
  317. package/dist/components/viewers/archive-viewer/archive-viewer.class.d.ts.map +1 -1
  318. package/dist/components/viewers/archive-viewer/archive-viewer.class.js +14 -4
  319. package/dist/components/viewers/archive-viewer/archive-viewer.class.js.map +1 -1
  320. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.d.ts +14 -2
  321. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.d.ts.map +1 -1
  322. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.js +10 -2
  323. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.js.map +1 -1
  324. package/dist/components/viewers/contact-viewer/contact-viewer.class.d.ts +14 -2
  325. package/dist/components/viewers/contact-viewer/contact-viewer.class.d.ts.map +1 -1
  326. package/dist/components/viewers/contact-viewer/contact-viewer.class.js +10 -2
  327. package/dist/components/viewers/contact-viewer/contact-viewer.class.js.map +1 -1
  328. package/dist/components/viewers/document-preview/document-preview.class.js +2 -2
  329. package/dist/components/viewers/document-preview/document-preview.class.js.map +1 -1
  330. package/dist/components/viewers/document-viewer/document-viewer.class.js +2 -2
  331. package/dist/components/viewers/document-viewer/document-viewer.class.js.map +1 -1
  332. package/dist/components/viewers/email-viewer/email-viewer.class.d.ts +14 -2
  333. package/dist/components/viewers/email-viewer/email-viewer.class.d.ts.map +1 -1
  334. package/dist/components/viewers/email-viewer/email-viewer.class.js +10 -2
  335. package/dist/components/viewers/email-viewer/email-viewer.class.js.map +1 -1
  336. package/dist/components/viewers/geojson-view/geojson-view.class.d.ts +15 -2
  337. package/dist/components/viewers/geojson-view/geojson-view.class.d.ts.map +1 -1
  338. package/dist/components/viewers/geojson-view/geojson-view.class.js +13 -2
  339. package/dist/components/viewers/geojson-view/geojson-view.class.js.map +1 -1
  340. package/dist/components/viewers/html-viewer/html-viewer.class.d.ts +14 -2
  341. package/dist/components/viewers/html-viewer/html-viewer.class.d.ts.map +1 -1
  342. package/dist/components/viewers/html-viewer/html-viewer.class.js +11 -3
  343. package/dist/components/viewers/html-viewer/html-viewer.class.js.map +1 -1
  344. package/dist/components/viewers/include/include.class.d.ts +15 -2
  345. package/dist/components/viewers/include/include.class.d.ts.map +1 -1
  346. package/dist/components/viewers/include/include.class.js +13 -2
  347. package/dist/components/viewers/include/include.class.js.map +1 -1
  348. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.d.ts +15 -2
  349. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.d.ts.map +1 -1
  350. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.js +14 -3
  351. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.js.map +1 -1
  352. package/dist/internal/form-associated.d.ts.map +1 -1
  353. package/dist/internal/form-associated.js +57 -1
  354. package/dist/internal/form-associated.js.map +1 -1
  355. package/dist/internal/length-constraints.d.ts +27 -0
  356. package/dist/internal/length-constraints.d.ts.map +1 -0
  357. package/dist/internal/length-constraints.js +42 -0
  358. package/dist/internal/length-constraints.js.map +1 -0
  359. package/dist/internal/localization.d.ts +1 -1
  360. package/dist/internal/localization.d.ts.map +1 -1
  361. package/dist/internal/localization.js +27 -0
  362. package/dist/internal/localization.js.map +1 -1
  363. package/dist/internal/persisted-state.d.ts +27 -0
  364. package/dist/internal/persisted-state.d.ts.map +1 -0
  365. package/dist/internal/persisted-state.js +57 -0
  366. package/dist/internal/persisted-state.js.map +1 -0
  367. package/dist/internal/root-registration-allowlist.d.ts +1 -1
  368. package/dist/internal/root-registration-allowlist.d.ts.map +1 -1
  369. package/dist/internal/root-registration-allowlist.js +5 -0
  370. package/dist/internal/root-registration-allowlist.js.map +1 -1
  371. package/dist/internal/safe-url.d.ts +13 -2
  372. package/dist/internal/safe-url.d.ts.map +1 -1
  373. package/dist/internal/safe-url.js +27 -4
  374. package/dist/internal/safe-url.js.map +1 -1
  375. package/dist/internal/text-quote.d.ts +4 -0
  376. package/dist/internal/text-quote.d.ts.map +1 -1
  377. package/dist/internal/text-quote.js +21 -0
  378. package/dist/internal/text-quote.js.map +1 -1
  379. package/dist/internal/text-viewer-target.d.ts +27 -0
  380. package/dist/internal/text-viewer-target.d.ts.map +1 -0
  381. package/dist/internal/text-viewer-target.js +179 -0
  382. package/dist/internal/text-viewer-target.js.map +1 -0
  383. package/dist/internal/theme-watcher.d.ts +32 -0
  384. package/dist/internal/theme-watcher.d.ts.map +1 -0
  385. package/dist/internal/theme-watcher.js +67 -0
  386. package/dist/internal/theme-watcher.js.map +1 -0
  387. package/dist/lyra.d.ts +17 -5
  388. package/dist/lyra.d.ts.map +1 -1
  389. package/dist/lyra.js +11 -0
  390. package/dist/lyra.js.map +1 -1
  391. package/dist/theme/gemstones.d.ts +22 -0
  392. package/dist/theme/gemstones.d.ts.map +1 -0
  393. package/dist/theme/gemstones.js +44 -0
  394. package/dist/theme/gemstones.js.map +1 -0
  395. package/dist/theme/theme.d.ts +60 -0
  396. package/dist/theme/theme.d.ts.map +1 -0
  397. package/dist/theme/theme.js +132 -0
  398. package/dist/theme/theme.js.map +1 -0
  399. package/llms/components/lr-accordion-item.md +1 -0
  400. package/llms/components/lr-accordion.md +1 -0
  401. package/llms/components/lr-activity-feed.md +1 -0
  402. package/llms/components/lr-agent-eval-dashboard.md +29 -0
  403. package/llms/components/lr-agent-run.md +1 -0
  404. package/llms/components/lr-agent-trace.md +1 -0
  405. package/llms/components/lr-agent-workspace.md +1 -0
  406. package/llms/components/lr-animated-image.md +1 -0
  407. package/llms/components/lr-animation.md +1 -0
  408. package/llms/components/lr-app-rail-item.md +8 -2
  409. package/llms/components/lr-app-rail.md +8 -2
  410. package/llms/components/lr-approval-queue.md +27 -0
  411. package/llms/components/lr-archive-viewer.md +9 -3
  412. package/llms/components/lr-artifact-panel.md +1 -0
  413. package/llms/components/lr-attachment-chip.md +1 -0
  414. package/llms/components/lr-attachment-trigger.md +1 -0
  415. package/llms/components/lr-audio-visualizer.md +1 -0
  416. package/llms/components/lr-av-player.md +1 -0
  417. package/llms/components/lr-avatar-group.md +1 -0
  418. package/llms/components/lr-avatar.md +1 -0
  419. package/llms/components/lr-badge.md +1 -0
  420. package/llms/components/lr-bar-chart.md +5 -3
  421. package/llms/components/lr-box-plot.md +5 -3
  422. package/llms/components/lr-branch-picker.md +1 -0
  423. package/llms/components/lr-breadcrumb-item.md +1 -0
  424. package/llms/components/lr-breadcrumb.md +1 -0
  425. package/llms/components/lr-browser-frame.md +1 -0
  426. package/llms/components/lr-bubble-chart.md +5 -3
  427. package/llms/components/lr-button-group.md +1 -0
  428. package/llms/components/lr-button.md +29 -3
  429. package/llms/components/lr-calendar-viewer.md +7 -1
  430. package/llms/components/lr-calendar.md +1 -0
  431. package/llms/components/lr-callout.md +1 -0
  432. package/llms/components/lr-card.md +6 -0
  433. package/llms/components/lr-carousel-item.md +1 -0
  434. package/llms/components/lr-carousel.md +1 -0
  435. package/llms/components/lr-chart.md +50 -14
  436. package/llms/components/lr-chat-composer.md +1 -0
  437. package/llms/components/lr-chat-message.md +6 -0
  438. package/llms/components/lr-chat-viewport.md +1 -0
  439. package/llms/components/lr-checkbox-group.md +1 -0
  440. package/llms/components/lr-checkbox.md +5 -0
  441. package/llms/components/lr-checkpoint.md +1 -0
  442. package/llms/components/lr-chip-group.md +1 -0
  443. package/llms/components/lr-chip.md +1 -0
  444. package/llms/components/lr-chunk-inspector.md +1 -0
  445. package/llms/components/lr-citation-badge.md +6 -0
  446. package/llms/components/lr-code-block-core.md +1 -0
  447. package/llms/components/lr-code-block.md +1 -0
  448. package/llms/components/lr-code-editor.md +1 -0
  449. package/llms/components/lr-color-picker.md +1 -0
  450. package/llms/components/lr-combobox.md +61 -14
  451. package/llms/components/lr-command-palette.md +1 -0
  452. package/llms/components/lr-commit-card.md +1 -0
  453. package/llms/components/lr-community-card.md +1 -0
  454. package/llms/components/lr-compare-panel.md +1 -0
  455. package/llms/components/lr-confirm-bar.md +1 -0
  456. package/llms/components/lr-contact-viewer.md +7 -1
  457. package/llms/components/lr-context-inspector.md +1 -0
  458. package/llms/components/lr-context-meter.md +1 -0
  459. package/llms/components/lr-control-group.md +1 -0
  460. package/llms/components/lr-conversation-item.md +10 -2
  461. package/llms/components/lr-copy-button.md +1 -0
  462. package/llms/components/lr-csv-viewer.md +1 -0
  463. package/llms/components/lr-dashboard-grid.md +1 -0
  464. package/llms/components/lr-dataset-viewer.md +1 -0
  465. package/llms/components/lr-date-input.md +1 -0
  466. package/llms/components/lr-date-picker.md +1 -0
  467. package/llms/components/lr-details.md +1 -0
  468. package/llms/components/lr-dialog.md +1 -0
  469. package/llms/components/lr-diff-view.md +1 -0
  470. package/llms/components/lr-divider.md +1 -0
  471. package/llms/components/lr-dock-panel.md +1 -0
  472. package/llms/components/lr-document-compare.md +1 -0
  473. package/llms/components/lr-document-library.md +1 -0
  474. package/llms/components/lr-document-preview.md +5 -3
  475. package/llms/components/lr-document-viewer.md +1 -0
  476. package/llms/components/lr-docx-viewer.md +1 -0
  477. package/llms/components/lr-doughnut-chart.md +5 -3
  478. package/llms/components/lr-drawer.md +1 -0
  479. package/llms/components/lr-drilldown-panel.md +1 -0
  480. package/llms/components/lr-dropdown-item.md +1 -0
  481. package/llms/components/lr-dropdown.md +1 -0
  482. package/llms/components/lr-ebook-viewer.md +1 -0
  483. package/llms/components/lr-email-viewer.md +7 -1
  484. package/llms/components/lr-embedding-explorer.md +26 -0
  485. package/llms/components/lr-emoji-picker.md +1 -0
  486. package/llms/components/lr-empty.md +4 -1
  487. package/llms/components/lr-entity-card.md +1 -0
  488. package/llms/components/lr-entity-chip.md +1 -0
  489. package/llms/components/lr-entity-dossier.md +1 -0
  490. package/llms/components/lr-env-list.md +1 -0
  491. package/llms/components/lr-eval-dataset.md +1 -0
  492. package/llms/components/lr-eval-result.md +1 -0
  493. package/llms/components/lr-evaluation-run.md +1 -0
  494. package/llms/components/lr-export-button.md +1 -0
  495. package/llms/components/lr-file-icon.md +1 -0
  496. package/llms/components/lr-file-input.md +14 -1
  497. package/llms/components/lr-file-tree.md +1 -0
  498. package/llms/components/lr-filter-bar.md +1 -0
  499. package/llms/components/lr-flag.md +1 -0
  500. package/llms/components/lr-flow-canvas.md +1 -0
  501. package/llms/components/lr-flow-controls.md +1 -0
  502. package/llms/components/lr-flow-minimap.md +1 -0
  503. package/llms/components/lr-flow-node.md +1 -0
  504. package/llms/components/lr-flow-run-overlay.md +1 -0
  505. package/llms/components/lr-format-bytes.md +1 -0
  506. package/llms/components/lr-format-date.md +1 -0
  507. package/llms/components/lr-format-number.md +1 -0
  508. package/llms/components/lr-gauge.md +1 -0
  509. package/llms/components/lr-generation-status.md +1 -0
  510. package/llms/components/lr-geojson-view.md +5 -1
  511. package/llms/components/lr-graph-legend.md +1 -0
  512. package/llms/components/lr-graph-query-builder.md +1 -0
  513. package/llms/components/lr-graph.md +1 -0
  514. package/llms/components/lr-grounding-summary.md +1 -0
  515. package/llms/components/lr-handoff-divider.md +1 -0
  516. package/llms/components/lr-heatmap.md +1 -0
  517. package/llms/components/lr-highlight-layer.md +1 -0
  518. package/llms/components/lr-histogram.md +5 -3
  519. package/llms/components/lr-html-viewer.md +7 -1
  520. package/llms/components/lr-icon-button.md +10 -4
  521. package/llms/components/lr-icon.md +1 -0
  522. package/llms/components/lr-image-comparer.md +1 -0
  523. package/llms/components/lr-image-viewer.md +1 -0
  524. package/llms/components/lr-include.md +6 -0
  525. package/llms/components/lr-ingestion-queue.md +1 -0
  526. package/llms/components/lr-input.md +21 -1
  527. package/llms/components/lr-intersection-observer.md +1 -0
  528. package/llms/components/lr-json-viewer.md +1 -0
  529. package/llms/components/lr-kbd.md +1 -0
  530. package/llms/components/lr-knowledge-base-admin.md +30 -0
  531. package/llms/components/lr-knowledge-base.md +1 -0
  532. package/llms/components/lr-knowledge-graph-explorer.md +1 -0
  533. package/llms/components/lr-known-date.md +1 -0
  534. package/llms/components/lr-lightbox.md +1 -0
  535. package/llms/components/lr-line-chart.md +5 -3
  536. package/llms/components/lr-lite-chart.md +20 -2
  537. package/llms/components/lr-live-region.md +1 -0
  538. package/llms/components/lr-locale-picker.md +1 -0
  539. package/llms/components/lr-map.md +1 -0
  540. package/llms/components/lr-markdown-core.md +1 -0
  541. package/llms/components/lr-markdown.md +1 -0
  542. package/llms/components/lr-media-card.md +1 -0
  543. package/llms/components/lr-memory-panel.md +1 -0
  544. package/llms/components/lr-mention-popover.md +1 -0
  545. package/llms/components/lr-menu-item.md +1 -0
  546. package/llms/components/lr-menu.md +1 -0
  547. package/llms/components/lr-message-actions.md +1 -0
  548. package/llms/components/lr-message-feedback.md +1 -0
  549. package/llms/components/lr-mind-map.md +1 -0
  550. package/llms/components/lr-model-select.md +8 -1
  551. package/llms/components/lr-model-settings-panel.md +1 -0
  552. package/llms/components/lr-mutation-observer.md +1 -0
  553. package/llms/components/lr-neighbor-list.md +1 -0
  554. package/llms/components/lr-node-palette.md +1 -0
  555. package/llms/components/lr-notebook-viewer.md +1 -0
  556. package/llms/components/lr-number-input.md +5 -3
  557. package/llms/components/lr-option.md +61 -14
  558. package/llms/components/lr-page-rail.md +1 -0
  559. package/llms/components/lr-pagination.md +1 -0
  560. package/llms/components/lr-path-strip.md +1 -0
  561. package/llms/components/lr-pdf-viewer.md +1 -0
  562. package/llms/components/lr-phone-input.md +1 -0
  563. package/llms/components/lr-pie-chart.md +5 -3
  564. package/llms/components/lr-playback.md +1 -0
  565. package/llms/components/lr-polar-area-chart.md +5 -3
  566. package/llms/components/lr-policy-summary.md +1 -0
  567. package/llms/components/lr-poll-status.md +1 -0
  568. package/llms/components/lr-popover.md +4 -0
  569. package/llms/components/lr-pptx-viewer.md +7 -2
  570. package/llms/components/lr-progress-bar.md +1 -0
  571. package/llms/components/lr-progress-ring.md +1 -0
  572. package/llms/components/lr-provenance-panel.md +1 -0
  573. package/llms/components/lr-push-to-talk.md +1 -0
  574. package/llms/components/lr-qr-code.md +1 -0
  575. package/llms/components/lr-query-builder.md +1 -0
  576. package/llms/components/lr-radar-chart.md +5 -3
  577. package/llms/components/lr-radio-group.md +1 -0
  578. package/llms/components/lr-radio.md +1 -0
  579. package/llms/components/lr-rag-answer.md +31 -0
  580. package/llms/components/lr-random-content.md +1 -0
  581. package/llms/components/lr-rating.md +1 -0
  582. package/llms/components/lr-relative-time.md +1 -0
  583. package/llms/components/lr-reorder-item.md +1 -0
  584. package/llms/components/lr-reorder-list.md +1 -0
  585. package/llms/components/lr-resize-observer.md +1 -0
  586. package/llms/components/lr-responsive-panel.md +1 -0
  587. package/llms/components/lr-result-card.md +1 -0
  588. package/llms/components/lr-result-field.md +1 -0
  589. package/llms/components/lr-retrieval-results.md +1 -0
  590. package/llms/components/lr-retrieval-search.md +1 -0
  591. package/llms/components/lr-retrieval-trace.md +1 -0
  592. package/llms/components/lr-rubric-form.md +1 -0
  593. package/llms/components/lr-scatter-chart.md +5 -3
  594. package/llms/components/lr-scroller.md +1 -0
  595. package/llms/components/lr-segmented.md +8 -0
  596. package/llms/components/lr-select.md +16 -3
  597. package/llms/components/lr-sequence-strip.md +1 -0
  598. package/llms/components/lr-skeleton.md +1 -0
  599. package/llms/components/lr-slider.md +1 -0
  600. package/llms/components/lr-source-card.md +1 -0
  601. package/llms/components/lr-source-list.md +1 -0
  602. package/llms/components/lr-source-picker.md +1 -0
  603. package/llms/components/lr-span-waterfall.md +1 -0
  604. package/llms/components/lr-sparkline.md +1 -0
  605. package/llms/components/lr-spinner.md +1 -0
  606. package/llms/components/lr-split.md +11 -3
  607. package/llms/components/lr-spreadsheet-viewer.md +1 -0
  608. package/llms/components/lr-stack-trace.md +1 -0
  609. package/llms/components/lr-stat.md +1 -0
  610. package/llms/components/lr-stepper.md +1 -0
  611. package/llms/components/lr-stream-status.md +1 -0
  612. package/llms/components/lr-streaming-text.md +1 -0
  613. package/llms/components/lr-suggestion-chips.md +1 -0
  614. package/llms/components/lr-svg-viewer.md +1 -0
  615. package/llms/components/lr-swatch-picker.md +29 -6
  616. package/llms/components/lr-switch.md +1 -0
  617. package/llms/components/lr-table.md +19 -5
  618. package/llms/components/lr-tabs.md +1 -0
  619. package/llms/components/lr-tag.md +1 -0
  620. package/llms/components/lr-task-list.md +1 -0
  621. package/llms/components/lr-terminal.md +1 -0
  622. package/llms/components/lr-test-results.md +1 -0
  623. package/llms/components/lr-textarea.md +20 -0
  624. package/llms/components/lr-thinking-panel.md +1 -0
  625. package/llms/components/lr-thread-list.md +2 -1
  626. package/llms/components/lr-time-input.md +4 -2
  627. package/llms/components/lr-time-range.md +1 -0
  628. package/llms/components/lr-timeline-item.md +1 -0
  629. package/llms/components/lr-timeline.md +1 -0
  630. package/llms/components/lr-toast-item.md +3 -2
  631. package/llms/components/lr-toast.md +3 -2
  632. package/llms/components/lr-token-input.md +1 -0
  633. package/llms/components/lr-tool-approval-dialog.md +1 -0
  634. package/llms/components/lr-tool-call-chip.md +6 -0
  635. package/llms/components/lr-tool-param-form.md +1 -0
  636. package/llms/components/lr-tool-result-dialog.md +1 -0
  637. package/llms/components/lr-tool-result-view.md +53 -4
  638. package/llms/components/lr-tool-select-dialog.md +1 -0
  639. package/llms/components/lr-tool-timeline.md +1 -0
  640. package/llms/components/lr-tooltip.md +1 -0
  641. package/llms/components/lr-tour.md +1 -0
  642. package/llms/components/lr-trace-tree.md +1 -0
  643. package/llms/components/lr-transcript-feed.md +1 -0
  644. package/llms/components/lr-tree-node.md +1 -0
  645. package/llms/components/lr-tree.md +1 -0
  646. package/llms/components/lr-typing-indicator.md +13 -8
  647. package/llms/components/lr-usage-badge.md +1 -0
  648. package/llms/components/lr-virtual-list.md +1 -0
  649. package/llms/components/lr-voice-picker.md +1 -0
  650. package/llms/components/lr-widget-renderer.md +1 -0
  651. package/llms/components/lr-widget.md +13 -0
  652. package/llms/components/lr-word-cloud.md +9 -2
  653. package/llms/components/lr-xml-viewer.md +1 -0
  654. package/llms/components/lr-zoomable-frame.md +1 -0
  655. package/llms/index.md +8 -3
  656. package/llms/peers.md +2 -1
  657. package/llms/shared.md +88 -0
  658. package/llms-full.txt +684 -105
  659. package/llms.txt +2 -2
  660. package/package.json +20 -2
  661. package/vscode-css-data.json +176 -1
  662. package/vscode-html-data.json +551 -23
  663. package/web-types.json +676 -25
package/llms-full.txt CHANGED
@@ -40,8 +40,8 @@ family and entry point.
40
40
  - **Charts** — 12 tags in `components/charts/`
41
41
  - **Document & file viewers** — 22 tags in `components/viewers/`
42
42
  - **Conversation & chat UI** — 28 tags in `components/conversation/`
43
- - **Agent tooling, tool calls & evaluation** — 29 tags in `components/agent-tools/`
44
- - **Retrieval, knowledge graph & grounding** — 24 tags in `components/retrieval/`
43
+ - **Agent tooling, tool calls & evaluation** — 31 tags in `components/agent-tools/`
44
+ - **Retrieval, knowledge graph & grounding** — 27 tags in `components/retrieval/`
45
45
  - **Reference tables** — design tokens (`llms/tokens.md`), optional peers (`llms/peers.md`), `wa-*`/`sl-*` migration (`llms/migration.md`)
46
46
 
47
47
  ---
@@ -240,6 +240,94 @@ dark palette — that fallback applies only where no real `--lr-theme-*` value i
240
240
  The token layer also sets `:host([hidden]) { display: none !important; }` and an inherited
241
241
  `box-sizing: border-box` reset.
242
242
 
243
+ ### Theme mode/accent runtime (`@aceshooting/lyra-ui/theme.js`)
244
+
245
+ Flipping the mode class/attribute above is something every app ends up hand-rolling — persist a
246
+ choice, apply it on load, avoid the flash of wrong theme before the app boots. `theme.js` is that
247
+ runtime, published as its own subpath: **zero dependencies, no Lit, no component imports, and no
248
+ side effects on import**, so an app can persist and apply a theme without pulling the component
249
+ graph into its first-paint bundle.
250
+
251
+ ```ts
252
+ import { setLyraTheme, getLyraTheme } from '@aceshooting/lyra-ui/theme.js';
253
+
254
+ setLyraTheme({ mode: 'dark' }); // unspecified fields keep their current value
255
+ setLyraTheme({ accent: '#7c3aed' }); // mode stays 'dark'
256
+ getLyraTheme(); // → { mode: 'dark', accent: '#7c3aed' }
257
+ setLyraTheme({ mode: 'auto', accent: null }); // clears the override and the accent
258
+ ```
259
+
260
+ - **`setLyraTheme({ mode?, accent? })`** persists to `localStorage['lyra-theme']`, applies to
261
+ `document.documentElement`, and dispatches `lr-theme-change` on `window` with
262
+ `detail: { mode, accent }`. Fields you omit keep their current value; pass `null` to clear the
263
+ accent. It **never throws** — when `localStorage` is unavailable (private browsing, quota, a
264
+ sandboxed iframe) it degrades to apply-without-persist, and the "fields you omit keep their
265
+ current value" rule still holds across calls in that state: the merge falls back to the last
266
+ theme applied in this session rather than to the default.
267
+ - **`getLyraTheme()`** returns `{ mode, accent }`, defaulting to `{ mode: 'auto', accent: null }`
268
+ when nothing is stored or the stored value is malformed. Storage is re-read on every call — no
269
+ in-memory cache — so a value written by another tab or a previous session is picked up cold.
270
+ Where storage is unreadable or unwritable it reports the theme last applied, so the return value
271
+ always describes what the document is actually showing and a toggle UI bound to it stays in sync.
272
+ - **`mode`** is `'light' | 'dark' | 'auto'`. `'light'`/`'dark'` set **both `data-lr-theme`** (the
273
+ attribute `theme.css` actually keys its palette blocks on) **and `data-theme`** (the generic
274
+ attribute canvas-rendered components watch, so `lr-chart`/`lr-heatmap`/`lr-qr-code` repaint on
275
+ the switch rather than keeping stale colors — see `llms/components/lr-chart.md`). `'auto'`
276
+ removes both, which means **no override — not "follow the OS"**:
277
+ - **With `theme.css` imported** (the setup this section is nested under), its `:root` block sets
278
+ the full light palette unconditionally and that file ships no `prefers-color-scheme` block, so
279
+ `'auto'` renders **light** whatever the OS is set to.
280
+ - **Without `theme.css`**, no real `--lr-theme-*` value is set, so the token layer's
281
+ `prefers-color-scheme: dark` fallback described above does apply and bare components follow
282
+ the OS.
283
+
284
+ To follow the OS *alongside* `theme.css`, resolve the preference yourself and pass a concrete
285
+ mode — `setLyraTheme` deliberately does no `matchMedia` work of its own:
286
+ ```ts
287
+ const os = matchMedia('(prefers-color-scheme: dark)');
288
+ const sync = () => setLyraTheme({ mode: os.matches ? 'dark' : 'light' });
289
+ sync();
290
+ os.addEventListener('change', sync);
291
+ ```
292
+ - **`accent`** is written to `--lr-theme-accent` as an inline custom property on the root element.
293
+ This is a **hook for your CSS, not a token the library reads** — no lyra-ui component consumes
294
+ `--lr-theme-accent`. Point the real inputs at it to make it retint anything, **writing one rule
295
+ per mode**:
296
+ ```css
297
+ :root { --lr-theme-color-brand-fill-loud: var(--lr-theme-accent, #0969da); }
298
+ .lr-dark,
299
+ [data-lr-theme='dark'] { --lr-theme-color-brand-fill-loud: var(--lr-theme-accent, #4ea0f0); }
300
+ ```
301
+ **Each arm's fallback must carry that mode's own value.** A single `:root` rule flattens both
302
+ modes to one color whenever the accent is unset (`accent: null`, the default): `:root` and
303
+ `[data-lr-theme='dark']` have equal specificity and both match `<html>` — the element
304
+ `setLyraTheme` writes `data-lr-theme` onto — so a consumer stylesheet loaded after `theme.css`
305
+ wins the tie on source order and pins the light-mode blue in dark mode. Copy each fallback from
306
+ the matching palette block in `theme.css` (`#0969da` light / `#4ea0f0` dark here).
307
+
308
+ Because that is a `--lr-theme-*` input, it reaches every nested shadow root — see "Where an
309
+ override actually reaches" above for why setting a `--lr-*` token instead would not.
310
+
311
+ **No-flash bootstrap.** `lyraThemeBootstrap` is a self-contained IIFE **string** (not a function),
312
+ meant to be inlined into a `<script>` in `<head>` **before any stylesheet**, so the persisted theme
313
+ is on the root element before first paint. It is a string precisely so this can happen in an
314
+ unbundled `<script>` context without shipping or parsing the module:
315
+
316
+ ```html
317
+ <head>
318
+ <script>/* server-inlines lyraThemeBootstrap here */</script>
319
+ <link rel="stylesheet" href="/theme.css" />
320
+ </head>
321
+ ```
322
+
323
+ It reads the same storage key, applies the same two attributes and `--lr-theme-accent`, and
324
+ swallows any error — malformed storage or a blocked `localStorage` leaves the document untouched
325
+ rather than throwing before your app loads.
326
+
327
+ **This runtime does no color math.** It stores and applies whatever accent string you give it; it
328
+ does not validate the value, compute a palette from it, or check contrast against any surface.
329
+ Verifying that an accent meets WCAG contrast against the light *and* dark palettes is yours.
330
+
243
331
  ## Localization: `locale`, `strings`, and the locale runtime
244
332
 
245
333
  Every built-in string — button labels, accessible names, descriptions, validation messages, status
@@ -545,14 +633,21 @@ shared `FormAssociated` mixin — see gotchas).
545
633
  shown when `maxRender` caps the row list; `{n}` is replaced with the hidden count)
546
634
  - `filter: OptionFilter | null = null` (attribute: false — `(option, query) => boolean`; default
547
635
  matches `label`/`searchText` case-insensitively; ignored while `source` is set)
548
- - `source: ComboboxSource | null = null` (attribute: false — `(query: string) =>
549
- Promise<ComboboxSourceRow[]>`; when set, replaces the light-DOM `<lr-option>` list with an async
550
- lookup, debounced ~200ms after each keystroke and re-run on clear/pick. `loadingText` is shown
551
- while a call is in flight; a stale in-flight call that resolves after a newer one (or after
552
- disconnect) is dropped via a monotonic token)
636
+ - `source: ComboboxSource | null = null` (attribute: false — `(query: string, options: { signal:
637
+ AbortSignal }) => Promise<ComboboxSourceRow[]>`; when set, replaces the light-DOM `<lr-option>`
638
+ list with an async lookup, debounced by `sourceDelay` ms after each keystroke and re-run on
639
+ clear/pick. Forward `options.signal` to `fetch(url, { signal })` to cancel the request when a
640
+ newer query supersedes it or the element disconnects. `loadingText` is shown while a call is in
641
+ flight; a stale in-flight call that resolves after a newer one (or after disconnect) is dropped
642
+ via a monotonic token. The `options` parameter is optional in the type, so a legacy
643
+ `(query) => …` source stays assignable.)
644
+ - `sourceDelay: number = 200` (attribute `source-delay` — debounce in ms between the last keystroke
645
+ and the `source` call; `0` fires on every keystroke. Sanitized to a finite non-negative duration,
646
+ falling back to `200` for a non-finite value)
553
647
  - `maxRender: number = 200` (attribute `max-render` — caps how many rows render at once, always
554
648
  keeping the current selection visible even if it's outside the cap; the excess renders as one
555
- `overflowText` row instead of being dropped silently)
649
+ `overflowText` row instead of being dropped silently. See "Large option lists" below for how to
650
+ size it, and when `source` is the better answer)
556
651
  - `value: string | string[]` — a getter/setter: plain `string` in single mode, `string[]` in
557
652
  `multiple` mode
558
653
  - `selectedRows: ComboboxSourceRow[]` (read-only getter) — structured rows for the current
@@ -573,11 +668,16 @@ The light-DOM `<lr-option>` path normalizes its supported label/sub/dot/group fi
573
668
  internal row model.
574
669
 
575
670
  **Events:** typing in the filter exposes the original bubbling/composed, non-cancelable `InputEvent`
576
- as exactly one host `input` event and does not fire `change`. An actual user selection mutation —
577
- pointer or keyboard selection, multiple-value toggle, tag/Backspace removal, or clear — emits exactly
578
- one bubbling/composed, non-cancelable plain `input` `Event`, immediately followed by the same shape
579
- of `change` `Event`. Re-picking the current single value and programmatic/default/reset/restore
580
- writes are silent. The clear button emits one `lr-clear` after its `input`/`change` pair.
671
+ as exactly one host `input` event (no `value` detail) and does not fire `change`. An actual user
672
+ selection mutation — pointer or keyboard selection, multiple-value toggle, tag/Backspace removal, or
673
+ clear — emits exactly one bubbling/composed, non-cancelable `input` `CustomEvent`, immediately
674
+ followed by the same shape of `change`, then a prefixed `lr-change` alias. All three carry
675
+ `detail: { value }` the new committed selection (a string in single mode, a `string[]` in
676
+ `multiple` mode). `lr-change` mirrors `<lr-checkbox>`'s namespaced alias; subscribe to it when you
677
+ want a `lr-`-prefixed event, or to the native-style `input`/`change` for parity with a native
678
+ control. Re-picking the current single value and programmatic/default/reset/restore writes are
679
+ silent (including on `lr-change`). The clear button emits one `lr-clear` after its
680
+ `input`/`change`/`lr-change` triple.
581
681
  `lr-filter` (`detail: { value: string }`) reports the in-progress filter text on every user-driven
582
682
  keystroke — the live as-you-typed search string, deliberately *not* `value`, which is the committed
583
683
  selection. It is the supported way to read that text; reaching into the shadow root for
@@ -594,8 +694,8 @@ The internal input's `focus` and `blur` are re-dispatched as bubbling, composed
594
694
  committed selection and an in-progress filter query, so the button renders whenever either has
595
695
  something to clear, and one press clears both:
596
696
 
597
- - Clearing a selection emits `input`, then `change`, then `lr-clear` — and, if the query was also
598
- non-empty, `lr-filter` with an empty `value`.
697
+ - Clearing a selection emits `input`, then `change`, then `lr-change`, then `lr-clear` — and, if the
698
+ query was also non-empty, `lr-filter` with an empty `value`.
599
699
  - A **query-only** clear (nothing selected, just typed text) emits `lr-filter` with an empty
600
700
  `value` and deliberately **no** `change` and **no** `lr-clear`. There was no selection
601
701
  transition to report, so announcing one would be a lie. Don't listen for `lr-clear` to detect
@@ -605,6 +705,32 @@ something to clear, and one press clears both:
605
705
  selected label rather than the query, so a stale query alone never surfaces a button offering to
606
706
  clear text the user cannot see.
607
707
 
708
+ **Large option lists: sizing `maxRender`, and why the listbox is not windowed.** Every row that
709
+ survives the filter and fits under `maxRender` is a real DOM element — the listbox renders its rows
710
+ in full rather than recycling a small window of them across a scroll. That is a deliberate
711
+ accessibility constraint, not an omission: the filter input carries `aria-activedescendant`, which
712
+ is an **IDREF**, and an IDREF only resolves within its own tree scope. Moving the rows into the
713
+ library's windowing primitive (`<lr-virtual-list>`) would place them one shadow root deeper than the
714
+ input that has to point at them, where neither the attribute nor its `ariaActiveDescendantElement`
715
+ element-reflection replacement can reach — element reflection resolves same-root or upward only. So
716
+ `<lr-virtual-list>` stays `role="list"`/`role="listitem"` and is the right tool for feeds and
717
+ viewers, not for a listbox whose active row must stay addressable.
718
+
719
+ What that means in practice:
720
+
721
+ - **Up to a few hundred rows, raise `maxRender` and move on.** A few hundred flex rows is an
722
+ unremarkable amount of DOM; a country, currency, or time-zone list (typically 200–450 entries)
723
+ renders comfortably with `max-render` set to cover it. The cap exists to bound pathological
724
+ cases, not to make lists of that size expensive.
725
+ - **Past roughly a thousand rows, reach for `source` instead of a larger cap.** An async source
726
+ narrows the candidate set before it ever becomes DOM, which is a categorically better trade than
727
+ rendering everything and asking the browser to lay it out. Pair it with `sourceDelay` to debounce.
728
+ - **Leave the overflow row doing its job.** When the cap does bite, the excess collapses into one
729
+ `overflowText` row (default `"+{n} more — refine your search"`) rather than disappearing
730
+ silently, and the current selection is always kept visible even when it falls outside the cap.
731
+ Suppressing that row by setting `maxRender` far above the real list size trades a useful "keep
732
+ typing" affordance for layout work no user asked for.
733
+
608
734
  **Slots:** default (`<lr-option>` children), `label`, `hint`, `error` (overrides the `errorText`
609
735
  attribute when provided), plus two adornment slots:
610
736
  - `start` — content at the inline-start of the trigger row, before the selected-value tags and the
@@ -634,6 +760,14 @@ a hovered or keyboard-active `[part='option']` row — the same per-component in
634
760
  `lr-select`'s identical `--lr-select-option-active-bg` uses, so a consumer can retheme just this
635
761
  row state without hijacking the shared `--lr-color-brand-quiet` token library-wide.
636
762
 
763
+ The currently-**selected** row (`[part='option'][aria-selected='true']`) has its own matching set:
764
+ `--lr-combobox-option-selected-bg` (default `transparent`), `--lr-combobox-option-selected-border`
765
+ and `--lr-combobox-option-selected-color` (both default `var(--lr-color-brand)`), and
766
+ `--lr-combobox-option-selected-font-weight` (default `var(--lr-font-weight-semibold)`) — the same
767
+ four-token indirection `lr-select`/`lr-model-select` already provide for their own selected row.
768
+ Like the active-bg knob these are inline `var()` fallbacks, not declared on `:host`, so a consumer
769
+ can retheme the selected row without hijacking `--lr-color-brand` library-wide.
770
+
637
771
  `--lr-combobox-trigger-height` pins an **exact** input-container height (both floors and caps it),
638
772
  for pixel-matching an `<lr-input>` or `<lr-select>` in the same toolbar row. It is **undeclared by
639
773
  default**, leaving `--lr-combobox-trigger-min-height` as a floor only and the row free to grow —
@@ -695,7 +829,7 @@ Session-history/autofill state is stored as a name-independent JSON string array
695
829
  array restores the selection (single mode keeps its first entry); malformed or wrong-shape state
696
830
  restores an empty selection. Restored state wins even when it arrives before the first option
697
831
  collection, while `form.reset()` still returns to the declarative selected default. Restoration is
698
- synchronous and fires no `input`/`change` event.
832
+ synchronous and fires no `input`/`change`/`lr-change` event.
699
833
 
700
834
  **Known gotchas:**
701
835
  - `with-clear` remains supported for compatibility, but new code should use the mirrored
@@ -734,7 +868,8 @@ input: click/Enter/Space/ArrowDown opens it, and there's no typing-to-filter. Op
734
868
  `<lr-option value>` children — the same element `<lr-combobox>` uses — reconciled the same way
735
869
  combobox does, and the popup reuses `internal/positioner.ts` for placement.
736
870
  Session-history/autofill restoration assigns the stored string through the same synchronous
737
- value/form/validity path as a programmatic value write and does not emit `input` or `change`.
871
+ value/form/validity path as a programmatic value write and does not emit `input`, `change`, or
872
+ `lr-change`.
738
873
 
739
874
  Single-select only, with no `filter`/`source`/`with-clear`/`max-options-visible`/`empty-text`/
740
875
  `max-render`/`multiple` surface — reach for `<lr-combobox>` instead whenever any of those apply.
@@ -767,8 +902,10 @@ exactly like the multi-option case, until the trigger is actually activated.
767
902
  - `value: string` — a getter/setter; always a single string (no `multiple` mode)
768
903
 
769
904
  **Events:** `change` (native-style — selection changed), `input` (fired alongside `change` on every
770
- selection change — a native `<select>` doesn't meaningfully distinguish the two either),
771
- `lr-show`, `lr-hide`
905
+ selection change — a native `<select>` doesn't meaningfully distinguish the two either), and
906
+ `lr-change` (a prefixed compatibility alias fired after both, mirroring `<lr-checkbox>`'s
907
+ `lr-change`). All three carry `detail: { value: string }` (the new selection) and fire only on a
908
+ real change, never on a programmatic `value` write. Plus `lr-show`, `lr-hide`.
772
909
 
773
910
  **Slots:** default (`<lr-option>` children), `label`, `hint`, `error` (overrides the `errorText`
774
911
  attribute when provided)
@@ -820,6 +957,15 @@ ancestor is never shadowed — retheme just this row state without hijacking the
820
957
  `--lr-color-brand-quiet` token every other component's own hover/active state also reads. Same
821
958
  knob `lr-combobox`'s own `--lr-combobox-option-active-bg` provides.
822
959
 
960
+ The currently-**selected** row (`[part='option'][aria-selected='true']`) has its own matching set:
961
+ `--lr-select-option-selected-bg` (default `transparent`), `--lr-select-option-selected-border` and
962
+ `--lr-select-option-selected-color` (both default `var(--lr-color-brand)`), and
963
+ `--lr-select-option-selected-font-weight` (default `var(--lr-font-weight-semibold)`). Like the
964
+ active-bg knob these are inline `var()` fallbacks, not declared on `:host`, so a consumer can
965
+ retheme the selected row without hijacking `--lr-color-brand` library-wide. Note the shadow-parts
966
+ spec forbids an attribute selector after `::part()` — `::part(option)[aria-selected='true']` is
967
+ invalid CSS and never matches — which is exactly why these tokens exist.
968
+
823
969
  **Optional peer deps:** none.
824
970
 
825
971
  ```html
@@ -1105,10 +1251,29 @@ submission/validation/reset via `name`/`value`/`disabled`/`required`/`checkValid
1105
1251
  | `autocomplete` | `autocomplete` | `string` | `''` | Forwarded to the native `<textarea>`; empty omits the attribute. |
1106
1252
  | `inputMode` | `inputmode` | `string` | `''` | Virtual-keyboard input hint forwarded to the native `<textarea>`. |
1107
1253
  | `enterKeyHint` | `enterkeyhint` | `string` | `''` | Virtual-keyboard Enter-key hint forwarded to the native `<textarea>`. |
1254
+ | `minlength` | `minlength` | `number \| undefined` | `undefined` | Minimum text length; forwarded to the native `<textarea>` and reported as `validity.tooShort`. |
1255
+ | `maxlength` | `maxlength` | `number \| undefined` | `undefined` | Maximum text length; forwarded to the native `<textarea>` (which also stops typing past it) and reported as `validity.tooLong`. |
1108
1256
  | `name` | `name` | `string` | `''` | Form field name. |
1109
1257
  | `disabled` | `disabled` | `boolean` | `false` | Disables the control. |
1110
1258
  | `required` | `required` | `boolean` | `false` | Participates in native constraint validation. |
1111
1259
 
1260
+ ### Constraint validation
1261
+
1262
+ `validity` reports `valueMissing` (from `required`), `tooShort` (from `minlength`), and `tooLong`
1263
+ (from `maxlength`) — the complete set a native `<textarea>` can produce. Leaving `minlength` and
1264
+ `maxlength` unset constrains nothing, exactly as before they existed.
1265
+
1266
+ Two behaviors are worth knowing, both inherited from the platform and both shared with `lr-input`:
1267
+
1268
+ - **An empty value is never `tooShort`.** Native `minlength` only applies to a non-empty value, so
1269
+ an optional field left blank stays valid; `required` is what rejects empty.
1270
+ - **A script-assigned value is validated too.** The native `tooShort`/`tooLong` flags are raised
1271
+ only for a value the *user* edited, so the component recomputes both from its own `value` and
1272
+ ORs them in — `el.value = <over-length>` reports `tooLong` rather than silently submitting.
1273
+ Lengths count UTF-16 code units, matching the native control (one emoji counts as two).
1274
+ `validationMessage` is the browser's own localized message when the native control flagged the
1275
+ value, and the localized `valueInvalid` string when only the script-value check did.
1276
+
1112
1277
  The visible label, hint, and error live in the same shadow tree as the native control, so their
1113
1278
  generated ids safely drive the native `<label>`/`aria-describedby` relationships. Name precedence
1114
1279
  is `accessibleLabel`/host `aria-label`, visible `label`, `placeholder`, then the localized
@@ -1181,7 +1346,27 @@ A generic action-button primitive. Renders an internal native `<button>`; `type=
1181
1346
  `type="reset"` are handled by the component itself via the host's own `closest('form')`, since a
1182
1347
  shadow-internal native button doesn't participate in an ancestor form's submission on its own.
1183
1348
 
1349
+ Set `href` to a safe link URL and the root renders as a real `<a part="base" href=…>` instead — a
1350
+ link styled as a button (e.g. a CTA). Native navigation is then the activation, so the submit/reset
1351
+ handling and `type` have no effect in that mode. A disabled link button (its own `disabled` or an
1352
+ ancestor `<fieldset disabled>`) renders the anchor with `aria-disabled="true"` and **no `href`**, so
1353
+ it is neither focusable nor navigable; an unsafe/unparseable `href` falls back to the native
1354
+ `<button>`.
1355
+
1184
1356
  **Properties:**
1357
+ - `href?: string` — when set to a safe link URL (`http:`/`https:`/`blob:`/`mailto:`/relative; see
1358
+ `safeLinkHref`), the root renders as an `<a href=…>` instead of a `<button>`. Setting `download`
1359
+ narrows the allowlist to `http:`/`https:`/`blob:`/relative — `mailto:` names no retrievable bytes,
1360
+ so a `mailto:` href paired with `download` falls back to the native `<button>`. Unset (the default)
1361
+ renders a plain `<button>`, unchanged. `type` (submit/reset) has no effect while the anchor
1362
+ renders. While the button is disabled the anchor is rendered **without** `href` (keeping
1363
+ `aria-disabled="true"`), so a disabled link button cannot navigate. An unsafe/unparseable value
1364
+ falls back to the native `<button>`
1365
+ - `target?: string` — native anchor `target`, used only while `href` resolves to a link. Setting it
1366
+ (e.g. `'_blank'`) automatically derives `rel="noopener noreferrer"` on the anchor; `rel` is never
1367
+ independently settable (reverse-tabnabbing). Ignored in `<button>` mode
1368
+ - `download?: string` — native anchor `download` attribute, used only while `href` resolves to a
1369
+ link. Ignored in `<button>` mode
1185
1370
  - `variant: 'neutral' | 'brand' | 'success' | 'warning' | 'danger' = 'neutral'` (reflected)
1186
1371
  - `appearance: 'accent' | 'filled' | 'outlined' | 'plain' | 'quiet' | 'link' = 'filled'` (reflected)
1187
1372
  — `'accent'` is a
@@ -1206,15 +1391,17 @@ shadow-internal native button doesn't participate in an ancestor form's submissi
1206
1391
  The shared `m` size uses `--lr-font-size-m`. The internal button follows the host's inline size through `--lr-button-width` (default
1207
1392
  `100%`), and each size tier's `min-block-size` floor is exposed as its own token (see below).
1208
1393
 
1209
- **Getters/methods:** `click()`, `focus(options?)`, and `blur()` — forwarded to the internal native
1210
- `<button>`; `click()` also runs the component's submit/reset behavior.
1394
+ **Getters/methods:** `click()`, `focus(options?)`, and `blur()` — forwarded to the internal base
1395
+ element (the `<button>`, or the `<a>` in anchor mode); `click()` also runs the component's
1396
+ submit/reset behavior in `<button>` mode.
1211
1397
 
1212
1398
  **Events:** none (a plain native `click` bubbles and composes through the shadow boundary
1213
1399
  unmodified; disabled while `disabled` or `loading`).
1214
1400
 
1215
1401
  **Slots:** default (label content), `start` (leading icon/content), `end` (trailing icon/content).
1216
1402
 
1217
- **CSS parts:** `base`, `label`, `start`, `end`, `spinner` (present only while `loading`).
1403
+ **CSS parts:** `base` (the internal native `<button>`, or an `<a>` when `href` resolves to a safe
1404
+ link), `label`, `start`, `end`, `spinner` (present only while `loading`).
1218
1405
 
1219
1406
  **Themeable custom properties:** `--lr-button-width`, `--lr-button-accent`, `--lr-button-fill`,
1220
1407
  `--lr-button-on-fill`, `--lr-button-border` (each swapped by the active `variant`, default
@@ -1242,6 +1429,9 @@ and the per-`size`
1242
1429
  and any slotted content) and `--lr-button-radius` (default `--lr-radius`, the corner radius) are
1243
1430
  both retunable without a `::part(base)` rule but — unlike the four size knobs below — do not vary
1244
1431
  by `size` tier; `appearance="link"` ignores `--lr-button-radius` (it renders with zero radius).
1432
+ `--lr-button-shadow` is **undeclared by default**, so `box-shadow` falls back to `none` —
1433
+ byte-identical to before this property existed — set it to add a drop shadow (e.g. an
1434
+ elevated/floating action button) without a `::part(base)` rule.
1245
1435
 
1246
1436
  **Retuning one `size` tier's geometry, without a `::part(base)` rule.** Four more properties carry
1247
1437
  the active tier's geometry, and every `:host([size='…'])` rule does nothing but re-assign them — no
@@ -1286,9 +1476,8 @@ box no matter what tier or override is in play.
1286
1476
 
1287
1477
  ## `lr-icon-button`
1288
1478
 
1289
- An accessible icon-only action button — a native `<button>` wrapping an `lr-icon`. Not
1290
- form-associated: it is an action trigger, so `type="submit"`/`"reset"` work through the ancestor
1291
- form the way a native button does, but the element itself contributes no form value.
1479
+ An accessible icon-only action button — a form-associated custom element with a native `<button>`
1480
+ inside. Its `type="submit"`/`"reset"` behavior is forwarded to the ancestor form by the component.
1292
1481
 
1293
1482
  **Properties:**
1294
1483
  - `icon: string = ''` — an `lr-icon` glyph name (see `llms/components/lr-icon.md`)
@@ -1339,7 +1528,13 @@ that several other components size their icon-only controls against), so overrid
1339
1528
  above 24px — see `llms/shared.md`. `--lr-icon-button-radius` (default `--lr-radius`) is the
1340
1529
  `[part='button']` corner radius, retunable without a `::part(button)` rule — the same
1341
1530
  `--lr-button-radius` pattern; `lr-icon-button` has no `size` tiers, so there is no per-tier gap
1342
- counterpart to it.
1531
+ counterpart to it. `--lr-icon-button-background` (default `transparent`) tints the
1532
+ `[part='button']` background, `--lr-icon-button-background-hover` (default `--lr-color-surface`)
1533
+ its hover-state background, and `--lr-icon-button-color` (default `inherit`) its icon/text color —
1534
+ the same per-component indirection `lr-button`'s `--lr-button-fill`/`--lr-button-on-fill` provide,
1535
+ letting you tint a single button without a `::part(button)` rule. Left unset, each falls back to
1536
+ today's value, so rendering is unchanged. There is deliberately no border-color token:
1537
+ `[part='button']` sets `border: 0`, so a border color could never render.
1343
1538
 
1344
1539
  ## `lr-input`
1345
1540
 
@@ -1373,6 +1568,13 @@ form-associated via the same `FormAssociated` mixin as `lr-textarea`. Ships the
1373
1568
  non-numeric bound only survives a direct property assignment; the declared type also admits a
1374
1569
  string so a subclass can narrow the attribute parsing to its own native type's literal form —
1375
1570
  `lr-time-input` does exactly that. Inert for the other types
1571
+ - `minlength?: number` / `maxlength?: number` (attributes `minlength`/`maxlength`) — text-length
1572
+ bounds forwarded to the native input and reported as `validity.tooShort`/`validity.tooLong`.
1573
+ Apply to the text-bearing types (`text`, `search`, `email`, `password`); the platform ignores
1574
+ both on `type="number"`/`type="time"`, and so does this component
1575
+ - `pattern?: string` (attribute `pattern`) — a regular expression the value must match in full,
1576
+ forwarded to the native input and reported as `validity.patternMismatch`. Anchored to the whole
1577
+ value by the platform, so no `^`/`$` is needed; an empty value never violates it
1376
1578
  - `passwordVisible: boolean = false` (attribute `password-visible` — `type="password"` only)
1377
1579
  - `name`/`disabled`/`required` (from `FormAssociated`)
1378
1580
 
@@ -1447,7 +1649,19 @@ Several controls expose the same pair: a per-`size` `*-min-height` **floor**, an
1447
1649
  **Known gotchas:**
1448
1650
  - `type="email"`/`type="number"` delegate constraint validation to the internal native `<input>`'s
1449
1651
  own browser-computed `validity` (format/range/step), bridged into this element's own
1450
- `ElementInternals` — not a second hand-rolled regex check.
1652
+ `ElementInternals` — not a second hand-rolled regex check. The same bridge carries
1653
+ `minlength`/`maxlength`/`pattern`, so `validity` reports the full native set: `valueMissing`,
1654
+ `typeMismatch`, `rangeUnderflow`, `rangeOverflow`, `stepMismatch`, `tooShort`, `tooLong`,
1655
+ `patternMismatch`, and `badInput`.
1656
+ - **`tooShort`/`tooLong` also fire for a value assigned from script.** The native flags are raised
1657
+ only for a value the *user* edited, so the component recomputes both from its own `value` and ORs
1658
+ them in; `el.value = <over-length>` reports `tooLong` rather than silently submitting. Lengths
1659
+ count UTF-16 code units, matching the native control (one emoji counts as two). `patternMismatch`
1660
+ needs no such handling — the platform applies `pattern` to script-assigned values already.
1661
+ `validationMessage` is the browser's own localized message when the native input flagged the
1662
+ value, and the localized `valueInvalid` string when only the script-value check did.
1663
+ - An empty value is never `tooShort` and never a `patternMismatch` — both native constraints skip
1664
+ the empty string, and `required` is what rejects it.
1451
1665
  - `type="password"` always renders the `password-toggle` button; there is no separate opt-out.
1452
1666
 
1453
1667
  ## `lr-number-input`
@@ -1459,8 +1673,8 @@ A migration-friendly numeric alias of `lr-input` — a subclass whose constructo
1459
1673
  **Properties:** `size` (`2xs`…`xl`), `placeholder`, `readonly`, `label`, `hint`, `errorText`
1460
1674
  (`error-text`), `accessibleLabel` (`aria-label`), `autocomplete`, `spellcheck`, `autocapitalize`,
1461
1675
  `autoCorrect` (`autocorrect`), `inputMode` (`inputmode`), `enterKeyHint` (`enterkeyhint`), and
1462
- `min`/`max`/`step` (the native numeric constraint validation). `clearable` and `passwordVisible`
1463
- (`password-visible`) are inherited but inert — see gotchas.
1676
+ `min`/`max`/`step` (the native numeric constraint validation). `clearable`, `passwordVisible`
1677
+ (`password-visible`), and `minlength`/`maxlength`/`pattern` are inherited but inert — see gotchas.
1464
1678
 
1465
1679
  **Events:** `input`/`change` (native-style, composed), `lr-input`/`lr-change`
1466
1680
  (`detail: { value }`), `focus`/`blur` (re-dispatched bubbling + composed from the internal native
@@ -1482,7 +1696,8 @@ vary by `size` at all).
1482
1696
  **Known gotchas:**
1483
1697
  - `clearable`/`clear-button`/`lr-clear` are inert: the clear action only renders for
1484
1698
  `type="text"`/`"search"`. `password-visible`/`password-toggle` are likewise inert, since the
1485
- toggle only renders for `type="password"`.
1699
+ toggle only renders for `type="password"`. `minlength`/`maxlength`/`pattern` are inert too — the
1700
+ platform ignores all three on `type="number"`; use `min`/`max`/`step` instead.
1486
1701
  - `type` is re-forced to `number` on every connect, but a later `el.type = 'text'` on a connected
1487
1702
  element is not reverted — use `lr-input` when the type has to change.
1488
1703
 
@@ -1495,8 +1710,9 @@ re-typed `min`/`max` pair (below); every other property, event, slot and part is
1495
1710
  **Properties:** `size` (`2xs`…`xl`), `placeholder`, `readonly`, `label`, `hint`, `errorText`
1496
1711
  (`error-text`), `accessibleLabel` (`aria-label`), `autocomplete`, `spellcheck`, `autocapitalize`,
1497
1712
  `autoCorrect` (`autocorrect`), `inputMode` (`inputmode`), and `enterKeyHint` (`enterkeyhint`).
1498
- `clearable` and `passwordVisible` (`password-visible`) are inherited but inert, exactly as on
1499
- `lr-number-input`.
1713
+ `clearable`, `passwordVisible` (`password-visible`), and `minlength`/`maxlength`/`pattern` are
1714
+ inherited but inert, exactly as on `lr-number-input` — the platform ignores all three length/pattern
1715
+ constraints on `type="time"` as well.
1500
1716
 
1501
1717
  `step` is forwarded verbatim to the native time input, where it means seconds (`step="1"` reveals
1502
1718
  the seconds field, `'any'` disables step validation).
@@ -1838,16 +2054,18 @@ named colors, the shape apps otherwise hand-roll as a row of round accent-color
1838
2054
 
1839
2055
  **Properties:**
1840
2056
  - `options: SwatchOption[] = []` (attribute: false) — `SwatchOption { value: string; color: string;
1841
- label: string; icon?: unknown }`; `color` is any CSS color string used as the swatch fill, `label`
1842
- is each swatch's accessible name and `title`. `icon` is an optional custom shape (e.g. a gem
1843
- glyph) rendered *instead of* the plain filled circle; the swatch sets `color: <option color>` so a
1844
- `currentColor`-based SVG picks the option's color up automatically, matching
1845
- `<lr-segmented>`'s `SegmentedItem.icon`.
2057
+ label: string; icon?: unknown; gemstone?: GemstoneKey }`; `color` is any CSS color string used as
2058
+ the swatch fill, `label` is each swatch's accessible name and `title`. `icon` is an optional
2059
+ custom shape rendered *instead of* the plain filled circle; `gemstone` selects the canonical
2060
+ faceted glyph when `mode="gemstone"`. An explicit `icon` wins over `gemstone`.
1846
2061
  - `value: string | null = null` — the currently selected option's `value` (controlled); `null`
1847
2062
  leaves nothing selected while keeping the first swatch tabbable.
1848
2063
  - `size: '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected — scales the swatch hit-area and
1849
2064
  fill diameter proportionally, hit-area floored at 24px; not pixel-matched to `lr-input`'s
1850
2065
  row-height scale)
2066
+ - `mode: 'swatch' | 'gemstone' = 'swatch'` (reflected) — `swatch` preserves the plain-circle
2067
+ default. `gemstone` renders the shared glyph for options carrying a `gemstone` key and enables
2068
+ the selected glow/shine defaults.
1851
2069
  - `label: string = ''` — accessible name copied to the internal `role="radiogroup"`; when empty, a
1852
2070
  host-level `aria-label` is used as a fallback.
1853
2071
 
@@ -1876,7 +2094,9 @@ for a looping brighten-and-settle pulse on the selected swatch. It drives a sepa
1876
2094
  works identically for a fill and an icon; disabled outright under `prefers-reduced-motion: reduce`,
1877
2095
  which also drops the hover/selection scale transition), `--lr-swatch-picker-hit-size` (hit-area
1878
2096
  size, swapped per `size` tier), `--lr-swatch-picker-fill-size` (visible fill/icon diameter, swapped
1879
- per `size` tier); plus shared tokens — `--lr-color-border`/`-brand`, `--lr-space-xs`,
2097
+ per `size` tier), `--lr-swatch-picker-gemstone-selected-blur` (default `--lr-size-0-5rem` in
2098
+ gemstone mode), `--lr-swatch-picker-gemstone-shine-duration` (default `1.8s` in gemstone mode);
2099
+ plus shared tokens — `--lr-color-border`/`-brand`, `--lr-space-xs`,
1880
2100
  `--lr-border-width-thin`/`-thick`, `--lr-radius`, `--lr-transition-fast`, `--lr-focus-ring-*`,
1881
2101
  and the per-tier `--lr-size-*` tokens.
1882
2102
 
@@ -1896,6 +2116,24 @@ and the per-tier `--lr-size-*` tokens.
1896
2116
  </script>
1897
2117
  ```
1898
2118
 
2119
+ For the shared gemstone accent mode, import the side-effect-free palette/glyph helper. The
2120
+ consumer still owns localized labels, display order, and the initial value:
2121
+
2122
+ ```ts
2123
+ import '@aceshooting/lyra-ui/components/forms/swatch-picker/swatch-picker.js';
2124
+ import { GEMSTONES } from '@aceshooting/lyra-ui/theme/gemstones.js';
2125
+
2126
+ const order = ['emerald', 'ruby', 'sapphire', 'hematite'] as const;
2127
+ picker.mode = 'gemstone';
2128
+ picker.options = order.map((key) => ({
2129
+ value: key,
2130
+ color: GEMSTONES[key].fill,
2131
+ label: translateGemstone(key),
2132
+ gemstone: key,
2133
+ }));
2134
+ picker.value = 'ruby';
2135
+ ```
2136
+
1899
2137
  **Known gotchas:**
1900
2138
  - arrow-key navigation cycles (past the last swatch wraps to the first, and vice versa) rather than
1901
2139
  clamping, and self-selects on move — arrow-navigating to a swatch immediately updates `value` and
@@ -1940,6 +2178,10 @@ silent. Internal `focus`/`blur` are re-dispatched as bubbling, composed host eve
1940
2178
  same as clicking a native checkbox's associated `<label>`. If left empty, set `aria-label` on the
1941
2179
  host so the control still has an accessible name.
1942
2180
 
2181
+ Host `aria-describedby` is forwarded to the internal `role="checkbox"`, so an externally-owned
2182
+ description can be associated with one checkbox inside a group. The attribute is omitted from the
2183
+ internal role when unset and tracks host attribute changes.
2184
+
1943
2185
  **CSS parts:** `base` (the whole interactive control, `role="checkbox"`), `box` (the small square
1944
2186
  showing the checkmark/indeterminate dash), `checkmark` (the checkmark or indeterminate-dash glyph),
1945
2187
  `label` (wrapper around the default slot)
@@ -2871,6 +3113,9 @@ own "consumer computes/renders" contract rather than assuming addition.
2871
3113
  button's label once they've been revealed)
2872
3114
  - `showAllColumns: boolean = false` (attribute `show-all-columns`, reflected) — forces responsive
2873
3115
  priority columns visible and is updated by the built-in reveal button
3116
+ - `storageKey?: string` (attribute `storage-key`) — when set, persists `showAllColumns` to
3117
+ `localStorage` (namespaced as `lr-table:${storageKey}`) and restores it on the next mount. Unset
3118
+ (the default) touches storage not at all. Mirrors `lr-app-rail`'s identical `storage-key` pattern
2874
3119
  - `heatTintScale?: { min?: number; max?: number }` (attribute: false) — overrides the auto-derived
2875
3120
  heat-tint domain (min/max of every `heatValue` result across every currently-rendered row —
2876
3121
  post-sort, pre-pagination, the same rows `footer(rows)` already sees). Unset (the default) computes
@@ -2939,6 +3184,11 @@ element *or on any ancestor* and still reach the rule that reads it. It exists b
2939
3184
  forbids an attribute selector after `::part()` — `::part(row)[aria-selected='true']` is invalid CSS —
2940
3185
  so the only prior lever for restyling the selected row was overriding the library-wide
2941
3186
  `--lr-color-brand-quiet` token, which repaints everything else reading it.
3187
+ `--lr-table-header-sorted-bg` (default `transparent`) and `--lr-table-header-sorted-color` (default
3188
+ `inherit`) restyle the **currently-sorted** column's header cell (`[aria-sort]` other than `none`).
3189
+ Same shape and rationale as `--lr-table-row-selected-bg`: inline `var()` fallbacks, not on `:host`,
3190
+ because `::part(header-cell)[aria-sort]` is invalid CSS. The `sort-icon` part styles only the
3191
+ chevron; these tokens style the header cell itself.
2942
3192
  `--lr-table-sticky-offset` (default `0`) is measured and written inline per column by the component
2943
3193
  so multiple `sticky` columns stack instead of overlapping; it is a read-out, not a knob you set.
2944
3194
  `--lr-table-heat-t` is likewise component-written (each `[data-heat]` cell's position on the ramp).
@@ -2964,11 +3214,16 @@ so multiple `sticky` columns stack instead of overlapping; it is a read-out, not
2964
3214
  - only single-row selection is modeled (`selectedKey: string | number | null`);
2965
3215
  there's no bulk-select/checkbox-column API — you must hand-roll a checkbox column entirely inside
2966
3216
  a `cell()` callback if you need multi-select.
2967
- - no `caption`/`aria-label` *property* exists, but a plain `aria-label` HTML attribute set on the
2968
- host **is** forwarded into the shadow-DOM `<table role="grid">` (read via
2969
- `this.getAttribute('aria-label')` at render time a plain global-attribute read, not a reactive
2970
- Lit `@property`): `<lr-table aria-label="Scores">` gives the grid an accessible name; omit it and
2971
- the shadow table simply has none.
3217
+ - `accessibleLabel: string = ''` (attribute `accessible-label`) a typed accessible name for the
3218
+ `<table role="grid">`. A plain `aria-label` HTML attribute on the host is also forwarded (read via
3219
+ `this.getAttribute('aria-label')` at render time) and serves as a fallback when `accessibleLabel`
3220
+ is unset. Consumer-supplied text, so neither is run through `this.localize()`.
3221
+ - `caption: string = ''` — an optional visible `<caption>` (exposed as the `caption` CSS part). When
3222
+ no `accessibleLabel`/host `aria-label` is present the caption also names the grid via
3223
+ `aria-labelledby`.
3224
+ - A grid with **none** of `accessibleLabel`, host `aria-label`, or `caption` logs a one-time
3225
+ `console.warn` on first render (dev signal) — an unnamed grid is an accessibility defect that
3226
+ otherwise renders silently.
2972
3227
  - Full roving-tabindex grid keyboard pattern (one `tabindex="0"` stop among header cells, one among
2973
3228
  body rows) — Left/Right/Home/End move within the header row, Up/Down/Home/End move within the
2974
3229
  body, Down from the header enters the body's roving stop and Up from the body's first row returns
@@ -3179,6 +3434,12 @@ visually-hidden `[part="live-region"]` (`role="status" aria-live="polite"`) anno
3179
3434
  90° for denser packing
3180
3435
  - `palette?: string[]` (attribute: false) — custom categorical colors, cycled by word index (or by
3181
3436
  `group`); defaults to the `--lr-word-cloud-color-1..8` tokens
3437
+ - `legend: WordCloudLegendItem[] = []` (attribute: false) — optional named `{ label, color }`
3438
+ entries for explaining explicit `words[].color`/group color overrides; when omitted, the
3439
+ component derives entries from grouped and explicitly colored words
3440
+ - `showLegend: boolean = false` (attribute `show-legend`, reflected) — renders the supplied or
3441
+ derived legend below the cloud; the color key is an accessible list and does not change word
3442
+ activation or palette selection
3182
3443
 
3183
3444
  **Methods:** `refreshTheme(): void` — forces a relayout so the `--lr-font` custom property is
3184
3445
  re-read from computed style (font-family affects the canvas text measurement layout depends on);
@@ -3192,8 +3453,8 @@ the currently-focused word — a no-op if nothing is focused yet)
3192
3453
 
3193
3454
  **CSS parts:** `base`, `svg`, `word` (each `<text>`), `focus-ring` (the rect around the roving-focus
3194
3455
  cursor's word), `live-region` (visually-hidden `role="status" aria-live="polite"` announcement text),
3195
- `empty` (the no-data placeholder hardcoded `"No data"` text, no property to customize it, unlike
3196
- `lr-empty`/`lr-table`)
3456
+ `legend`/`legend-item`/`legend-swatch`/`legend-label` (the optional static color key), and `empty`
3457
+ (the no-data placeholder)
3197
3458
 
3198
3459
  **Themeable custom properties:** `--lr-word-cloud-color-1`, `--lr-word-cloud-color-2`,
3199
3460
  `--lr-word-cloud-color-3`, `--lr-word-cloud-color-4`, `--lr-word-cloud-color-5`,
@@ -4321,9 +4582,16 @@ auto-inserted between each adjacent pair.
4321
4582
  **Properties:**
4322
4583
  - `sizes: number[] = []` (attribute: false — percentages per panel, auto-computed equally if
4323
4584
  omitted/mismatched)
4324
- - `defaultSizes: number[] = []` (attribute: false) — initialization-only fallback: a valid restored
4325
- `storageKey` layout wins first; otherwise a valid `defaultSizes` wins over equal distribution.
4326
- Later reassignment never overwrites live drag/persisted state — set it once, at mount.
4585
+ - `defaultSizes: (number | string)[] = []` (attribute: false) — initialization-only fallback: a
4586
+ valid restored `storageKey` layout wins first; otherwise a valid `defaultSizes` wins over equal
4587
+ distribution. Later reassignment never overwrites live drag/persisted state — set it once, at
4588
+ mount. Each entry is either a plain **number** (percent-of-container, validated unchanged: a
4589
+ pure-number array that does not sum to ~100, e.g. `[30, 60]`, is still rejected and falls through
4590
+ to the equal split) or a CSS **length string** (`'200px'`, `'20%'`, `'3rem'`). When at least one
4591
+ entry is a length string, every entry is resolved against the measured container (numbers as
4592
+ percent-of-container, `%` as-is, `px`/`rem`/`em` via the shared length resolver) and then
4593
+ normalized to percentages before the same validation applies — so `['200px', '300px']` on a 500px
4594
+ container initializes to `[40, 60]`.
4327
4595
  - `min: number = 10` (min % per panel)
4328
4596
  - `orientation: 'horizontal'|'vertical' = 'horizontal'` (reflected) — the axis used at/above
4329
4597
  `orientationBreakpoint` (or always, when that's unset).
@@ -4567,6 +4835,10 @@ position) survives the transition.
4567
4835
  view externally; also updated internally when a view toggle is clicked.
4568
4836
  - `accessibleLabel: string = ''` (attribute `aria-label`) — overrides the label-derived fullscreen
4569
4837
  dialog name.
4838
+ - `storageKey?: string` (attribute `storage-key`) — when set, persists `collapsed` to `localStorage`
4839
+ under `lr-widget:${storageKey}` and restores it on the next mount (mirrors `lr-app-rail`'s/
4840
+ `lr-table`'s identical `storage-key` pattern). Without a `storageKey` there is no persistence and
4841
+ storage is never touched — listen for `lr-collapse-change` and persist the state yourself.
4570
4842
 
4571
4843
  **Events:** `lr-collapse-change` (`detail: { collapsed }`, the new state), `lr-fullscreen-change`
4572
4844
  (`detail: { fullscreen }` — also fired when fullscreen is exited via Escape or a backdrop click, not
@@ -4629,6 +4901,9 @@ space for a persistent sidebar/toolbar that should stay visible instead of being
4629
4901
  fullscreen panel/backdrop — it overrides the default `var(--lr-space-l)` inset on every side for
4630
4902
  both `[part="base"]` and `[part="backdrop"]`. Set `compact` for tighter header/body padding.
4631
4903
 
4904
+ The collapse-button `aria-label` is localized via its own `widgetCollapse` (default `'Collapse
4905
+ panel'`) and `widgetExpand` (default `'Expand panel'`) keys.
4906
+
4632
4907
  **Known gotchas:**
4633
4908
  - a reconnect that preserves the same element instance (e.g. a drag-and-drop reparent) resumes its
4634
4909
  shared overlay registration and re-acquires the scroll lock if `fullscreen` was still `true`
@@ -4636,6 +4911,11 @@ both `[part="base"]` and `[part="backdrop"]`. Set `compact` for tighter header/b
4636
4911
  between, so `willUpdate()` alone wouldn't otherwise notice.
4637
4912
  - `collapsed` hides the body via `hidden` rather than an animated height transition — collapsing is
4638
4913
  instant, not a slide.
4914
+ - prior to this release the collapse-button `aria-label` was localized through `lr-dock-panel`'s
4915
+ own `dockPanelCollapse`/`dockPanelExpand` keys (a borrowed, differently-named pair). A locale
4916
+ registered against those keys specifically to target `lr-widget`'s collapse button should move
4917
+ to `widgetCollapse`/`widgetExpand`; the default English strings are unchanged, and `lr-dock-panel`
4918
+ itself is unaffected.
4639
4919
 
4640
4920
  ---
4641
4921
 
@@ -5102,6 +5382,13 @@ labeled options, rendered as a button row" is ubiquitous settings/filter-panel U
5102
5382
  **Events:** `lr-change` (`detail: { value }`) — fired when the selected value changes via click or
5103
5383
  keyboard.
5104
5384
 
5385
+ **Methods:**
5386
+ - `scrollToValue(value: string): void` — scroll the segment with the given `value` into view within
5387
+ the (possibly overflowing) track, without changing the selection. Honors
5388
+ `prefers-reduced-motion` (falls back to `behavior: 'auto'`). This runs automatically when `value`
5389
+ is changed programmatically (keyboard navigation already reveals the focused segment on its own),
5390
+ so you only need to call it for the "reveal without selecting" case.
5391
+
5105
5392
  **Slots:** none.
5106
5393
 
5107
5394
  **CSS parts:** `base` (the `role="radiogroup"` root), `segment` (a single `role="radio"` button),
@@ -5408,8 +5695,10 @@ content is never duplicated.
5408
5695
 
5409
5696
  Opting in to `resizable` adds a continuously draggable width for the `'full'` state: a
5410
5697
  `[part="resizer"]` handle (pointer-drag and Left/Right-arrow keyboard stepping, RTL-aware) clamped to
5411
- `[minRailWidthPx, maxRailWidthPx]`, with no built-in persistence a consumer that wants the chosen
5412
- width to survive a reload listens for `lr-rail-resize` and persists `railWidthPx` itself.
5698
+ `[minRailWidthPx, maxRailWidthPx]`. Set `storageKey` (attribute `storage-key`) to persist `open` and
5699
+ `railWidthPx` to `localStorage` under `lr-app-rail:${storageKey}` and restore them on the next mount
5700
+ (mirrors `lr-split`'s `storage-key`; `mode` is breakpoint-derived and never persisted). Without a
5701
+ `storageKey` there is no persistence — listen for `lr-rail-resize` and persist `widthPx` yourself.
5413
5702
  `preferredMode` separately lets a host manually prefer `'full'`/`'icon-only'` for the non-mobile
5414
5703
  breakpoint axis (e.g. a user's own collapse toggle) while `mobile-breakpoint` continues to be tracked
5415
5704
  automatically regardless — it's only consulted while `mode` isn't force-pinned via the `mode`
@@ -5454,6 +5743,9 @@ accessor itself, which still takes full priority.
5454
5743
  - `railWidthPx?: number` (attribute `rail-width-px`) — the rail's current width in px while
5455
5744
  `resizable`; settable/gettable directly. Unset defers to `--lr-app-rail-width`'s own resolved
5456
5745
  width.
5746
+ - `storageKey?: string` (attribute `storage-key`) — when set, persists `open` and `railWidthPx` to
5747
+ `localStorage` under `lr-app-rail:${storageKey}` and restores them on the next mount. `mode` is
5748
+ breakpoint-derived and never persisted. Unset means no persistence.
5457
5749
  - `minRailWidthPx: number = 190` (attribute `min-rail-width-px`) — minimum `railWidthPx` a
5458
5750
  drag/keyboard resize can reach.
5459
5751
  - `maxRailWidthPx: number = 440` (attribute `max-rail-width-px`) — maximum `railWidthPx` a
@@ -6047,6 +6339,11 @@ to `<wa-card>`'s contract, staying slot-compatible with `lr-result-card` where t
6047
6339
  reproduces a plain static card: no `tabindex`, no listeners, no events.
6048
6340
  - `href?: string` — when set, the card's root renders as a real `<a href=...>` instead of a `<div>`,
6049
6341
  for a whole-card link (e.g. a wide CTA tile). Unset (the default) renders a plain `<div>`.
6342
+ - `target?: string` — native anchor target, applied only while `href` resolves to a link. Setting it
6343
+ to `'_blank'` (or any other target) automatically derives `rel="noopener noreferrer"` on the
6344
+ rendered anchor; there is deliberately **no** separately-settable `rel` property, so a consumer
6345
+ can't forget it and leave the opened page holding a `window.opener` back-reference
6346
+ (reverse-tabnabbing). Unset (the default) emits neither `target` nor `rel`.
6050
6347
 
6051
6348
  **Events:** `lr-card-activate` (no detail) — the whole card was activated, by click or by
6052
6349
  Enter/Space while `[part='base']` has focus. Only fired while `interactive` is set **without**
@@ -6338,7 +6635,7 @@ From the `toaster` controller — the ergonomic entry point, no manual `<lr-toas
6338
6635
  needed:
6339
6636
 
6340
6637
  ```ts
6341
- import { toast } from '@aceshooting/lyra-ui';
6638
+ import { toast } from '@aceshooting/lyra-ui/components/overlays/toast/toaster.js';
6342
6639
 
6343
6640
  toast('Saved');
6344
6641
  toast({ message: 'Deleted', variant: 'danger', action: { label: 'Undo', onClick: (item) => {/*...*/} } });
@@ -6353,7 +6650,7 @@ at another, since `placement` is a per-call option rather than a single global r
6353
6650
 
6354
6651
  ```html
6355
6652
  <script type="module">
6356
- import { toast } from '@aceshooting/lyra-ui';
6653
+ import { toast } from '@aceshooting/lyra-ui/components/overlays/toast/toaster.js';
6357
6654
  document.getElementById('save-btn').addEventListener('click', () => toast('Saved!'));
6358
6655
  </script>
6359
6656
  ```
@@ -6401,7 +6698,9 @@ the existing `flex-start` cross-axis and `start` text alignment, and `center` ce
6401
6698
  `--lr-empty-compact-padding` (default `--lr-space-xs` — padding used in compact mode),
6402
6699
  `--lr-empty-compact-gap` (default `--lr-space-2xs` — gap between the icon, heading, and description
6403
6700
  in compact mode; the non-compact layout's gap stays the plain shared `--lr-space-s` token, not
6404
- independently themeable), plus shared tokens (`--lr-space-xs/-s/-l`,
6701
+ independently themeable), `--lr-empty-compact-font-size` (compact mode only; unset by default with
6702
+ **no fallback value** — the compact heading keeps its ordinary inherited font size until a
6703
+ consumer explicitly sets this token), plus shared tokens (`--lr-space-xs/-s/-l`,
6405
6704
  `--lr-color-text-quiet/-border/-text`).
6406
6705
 
6407
6706
  **Optional peer deps:** none.
@@ -6918,6 +7217,9 @@ near the virtual point) when one is available to give it something to observe; o
6918
7217
  the anchor point moves on its own (e.g. a graph pan/zoom tick), re-call `showAt()` with fresh
6919
7218
  coordinates to re-anchor — the popover stays open across such a call. A popover that never calls
6920
7219
  `showAt()` behaves exactly as before.
7220
+ `hide(options?: { focusTrigger?: boolean })` programmatically closes the popover; pass
7221
+ `{ focusTrigger: true }` to return focus to the slotted trigger (as Escape does), or omit it to
7222
+ close without moving focus (as a bare `el.open = false` does). No-op when already closed.
6921
7223
  **Events:** `lr-show`, `lr-hide`. **Slots:** `trigger`, default content. **CSS parts:** `trigger`,
6922
7224
  `popup`, `content`. **Themeable custom properties:** `--lr-overlay-max-inline-size` (default
6923
7225
  `--lr-size-20rem` — maximum inline size of the popup).
@@ -8475,12 +8777,24 @@ accepted), `'size'` from `maxFileSize`, or `'directory'` for a dropped folder. `
8475
8777
  when the semantic dropzone (the actual keyboard-focusable element, not the hidden native `<input>`)
8476
8778
  gains/loses focus.
8477
8779
 
8780
+ Each rejected file also renders as its own line in the visible `[part="rejection"]` alert, naming
8781
+ the file and the reason via one of four locale keys: `fileInputRejectedType` (default
8782
+ `'{filename}: this file type is not accepted.'`), `fileInputRejectedSize` (default
8783
+ `'{filename}: this file is too large.'`), `fileInputRejectedCount` (default `'{filename}: only one
8784
+ file can be selected at a time.'`), and — for `'directory'` — the pre-existing
8785
+ `fileInputFolderRejected` (default `'Folders are not accepted here.'`, reused verbatim, so it has no
8786
+ `{filename}` placeholder). The filename is interpolated as caller-supplied data, never localized
8787
+ itself. The region is cleared (and unrendered) as soon as a subsequent selection rejects nothing.
8788
+
8478
8789
  **Slots:** default slot — custom dropzone content, overrides the `label` attribute text when
8479
8790
  provided. The accessible name always comes from `label` regardless, so icon-only slot content still
8480
8791
  announces correctly.
8481
8792
 
8482
8793
  **CSS parts:** `base`, `input`, `status` (a visually-hidden `role="status" aria-live="polite"`
8483
- element carrying the drag accept/reject announcement)
8794
+ element carrying the drag accept/reject announcement and the aggregate accepted/rejected count),
8795
+ `rejection` (a **visible** `role="alert"` region, rendered only while a rejection exists, listing
8796
+ each currently-rejected file next to a per-reason message — in addition to, never in place of, the
8797
+ sr-only `status` summary above)
8484
8798
 
8485
8799
  **Themeable custom properties:** `--lr-file-input-compact-padding` (default `var(--lr-space-s)`) —
8486
8800
  `[part='base']`'s padding while `compact`; `--lr-file-input-compact-gap` (default
@@ -9393,15 +9707,27 @@ Chart.js wrapper every other `lr-*-chart` tag subclasses; supports both a simpli
9393
9707
  - `labels: string[] = []` (attribute: false)
9394
9708
  - `datasets: Series[] = []` (attribute: false) — `Series { label: string; data?: (number|null)[];
9395
9709
  points?: {x,y,label?}[]; color?: string|string[]; fill?: boolean; width?: number; dash?: boolean;
9396
- noTooltip?: boolean; axis?: 'y'|'y2'; pointColors?: string[]; pointRadius?: number; type?:
9397
- 'line'|'bar' }`
9710
+ noTooltip?: boolean; axis?: 'y'|'y2'; pointColors?: string[]; pointRadius?: number|number[];
9711
+ segmentColors?: string[]; type?: 'line'|'bar' }`
9712
+ - `pointRadius` takes a single number (applied to every point) **or** an array matching `data`'s
9713
+ length that sizes each point independently — passed straight through to Chart.js, which
9714
+ supports both natively. Useful for emphasizing a single outlier or the latest reading without
9715
+ splitting the series in two.
9716
+ - `segmentColors` colors each *segment* (the line drawn between two consecutive points) by the
9717
+ segment's **starting** point index, so `['red', 'green']` over 3 points paints the first
9718
+ segment red and the second green; a shorter array cycles. Wired to Chart.js's
9719
+ `segment.borderColor` scriptable option, so it is only meaningful for line-type series.
9720
+ Typical use is threshold/anomaly banding along one line. A series that omits it (or passes an
9721
+ empty array) emits no `segment` key at all, leaving line rendering exactly as before.
9398
9722
  - `legend: boolean = false`
9399
9723
  - `legendPosition: LyraChartLegendPosition = 'top'` (attribute `legend-position`) — places the
9400
9724
  legend at `top`, `right`, `bottom`, or `left`; `auto` chooses right above 480px and bottom below
9401
9725
  that allocation width
9402
- - `valueFormatter?: LyraChartValueFormatter` (attribute: false) — formats numeric tick, tooltip,
9403
- and legend values; the callback receives the value and `'tick'`, `'tooltip'`, or `'legend'`
9404
- context
9726
+ - `valueFormatter?: LyraChartValueFormatter` (attribute: false) — formats numeric (value-axis)
9727
+ tick, tooltip, and legend values; the callback receives the value and `'tick'`, `'tooltip'`, or
9728
+ `'legend'` context. Never runs against the categorical x-axis's own labels (line/bar's `labels`
9729
+ strings) — Chart.js's category scale passes the tick index to `ticks.callback`, not the label
9730
+ text
9405
9731
  - `area: boolean = false`
9406
9732
  - `zoom: boolean = false` — wheel/drag/pinch zoom on the `x` axis only (pan disabled, and the zoom
9407
9733
  range is limited to the original data extent); shows the `reset-zoom-button` while zoomed
@@ -9415,6 +9741,16 @@ Chart.js wrapper every other `lr-*-chart` tag subclasses; supports both a simpli
9415
9741
  - `stacked: boolean = false` — stacks the `x`/`y`(/`y2`) scale entries `buildScales()` returns; only
9416
9742
  meaningful for `bar`/`line` types (scatter/bubble's linear `x` scale and the radial `r` scale used
9417
9743
  by radar/polar-area are out of scope)
9744
+ - `dataLabels: boolean = false` (attribute `data-labels`) — draws each point's value on the chart via
9745
+ the optional `chartjs-plugin-datalabels` peer (see `peers.md`). Unset (the default) leaves labels
9746
+ off; because the plugin is registered **per chart instance** (not globally), a `<lr-chart
9747
+ data-labels>` never affects any other chart on the page. If the peer is not installed the chart
9748
+ still renders and the attribute is inert, with one `console.warn`. The screen-reader equivalent is
9749
+ the always-present accessible data table (`show-data-table` makes it visible) — labels are a
9750
+ purely visual, canvas-only addition and add no new a11y surface.
9751
+ - `stackTotals: boolean = false` (attribute `stack-totals`) — with `stacked` (bar/line only), draws
9752
+ the per-category stack total above each stack, via the same `chartjs-plugin-datalabels` peer.
9753
+ Null/undefined points are skipped; a category whose every value is null shows no total (not `0`)
9418
9754
  - `config?: Partial<ChartConfiguration>` (attribute: false) — deep-merged over the generated
9419
9755
  config; any nested key wins without clobbering sibling generated keys. This is the raw Chart.js
9420
9756
  escape hatch, so a caller-supplied `config.type` is passed through rather than normalized.
@@ -9427,11 +9763,25 @@ Chart.js wrapper every other `lr-*-chart` tag subclasses; supports both a simpli
9427
9763
  - `chartArea: LyraChartArea | undefined` (readonly) — current Chart.js chart-area geometry in
9428
9764
  canvas-local coordinates (`top`, `left`, `right`, `bottom`, `width`, `height`), when a chart is
9429
9765
  drawn
9430
-
9431
- **Methods:** `resetZoom()` (reset any active zoom/pan to the original view), `refreshTheme()`
9432
- (forces a redraw so the `--lr-chart-*` tokens below are re-read from the current computed style —
9433
- the escape hatch for a consumer's own theme-toggle handler to call when it flips something, e.g. a
9434
- `data-theme` attribute, that doesn't otherwise change any `lr-chart` property)
9766
+ - `appendData(label, values, maxPoints?)` — appends one aligned numeric category and optionally
9767
+ keeps only the newest `maxPoints`; point-based scatter/bubble series are left unchanged
9768
+
9769
+ **Methods:** `resetZoom()` (reset any active zoom/pan to the original view), `refreshTheme()`, and
9770
+ `exportData('csv' | 'png')` (returns a spreadsheet-safe CSV snapshot or the current PNG data URL
9771
+ when Chart.js is loaded)
9772
+ (forces a redraw so the `--lr-chart-*` tokens below are re-read from the current computed style. A
9773
+ built-in `ThemeWatcher` now calls this automatically when `prefers-color-scheme` flips or an
9774
+ ancestor's `class`/`style`/`data-theme`/`data-color-scheme` attribute mutates — the most common
9775
+ theme-toggle mechanisms — so a consumer rarely needs to call it by hand; it remains public as the
9776
+ escape hatch for theme changes those signals can't observe)
9777
+
9778
+ `seriesPalette(): string[]` resolves the categorical series ramp (`--lr-color-chart-1..8`) through
9779
+ `getComputedStyle` and returns the concrete, theme-aware colors — the exact same values the chart
9780
+ hands any series that sets no `color` of its own. Call it to color chart-adjacent UI (custom
9781
+ legends, KPI tiles, annotations fed through the raw `config` passthrough) from one source of truth
9782
+ instead of hand-resolving `--lr-color-chart-N` and drifting out of sync when the theme flips.
9783
+ Returns a fresh array each call (safe to mutate), and falls back to the light-mode literals only
9784
+ when the custom properties can't be resolved at all (e.g. a detached host).
9435
9785
 
9436
9786
  **Events:** `lr-zoom` (`detail: { zoomed: boolean }`, fired on zoom-complete and on
9437
9787
  `resetZoom()`), `lr-point-click` (fired when a click lands on, or nearest to — intersect-only —
@@ -9477,10 +9827,9 @@ subset actually used.
9477
9827
  property values fall back to `line`. Each typed `lr-*-chart` subclass (e.g.
9478
9828
  `llms/components/lr-bar-chart.md`) locks its *own* `type` via a real prototype accessor — a
9479
9829
  genuine runtime lock, not just a compile-time default.
9480
- - no global theme-broadcast event exists to auto-retheme an already-drawn chart on a theme switch —
9481
- a consumer flipping something upstream (e.g. a `data-theme` attribute) that doesn't otherwise
9482
- change any `lr-chart` property must call `refreshTheme()` itself to make Chart.js re-read the
9483
- `--lr-chart-*` tokens above.
9830
+ - a built-in `ThemeWatcher` auto-retheme an already-drawn chart when `prefers-color-scheme` flips or
9831
+ an ancestor's `class`/`style`/`data-theme`/`data-color-scheme` attribute mutates (coalesced to one
9832
+ redraw). `refreshTheme()` stays public for out-of-band theme changes those signals can't observe.
9484
9833
  - generated `scales` are keyed off the *effective* type (`config.type` ?? `type`, see
9485
9834
  `effectiveType()`) and are type-appropriate: no scale at all for `type="pie"`/`"doughnut"` (true of
9486
9835
  `<lr-chart type="pie">` directly, not just the `lr-pie-chart`/`lr-doughnut-chart` subclasses),
@@ -9585,16 +9934,24 @@ passthrough). Not a subclass of `LyraChart`.
9585
9934
  every bar/segment at that index, across every dataset — e.g. to highlight a whole selected week's
9586
9935
  column in a stacked chart. Empty (the default) reproduces the exact existing output: no bar
9587
9936
  carries `data-selected`. This component takes no opinion on what the highlight looks like, only
9588
- which bars it applies to — style it via `::part(bar)[data-selected]`.
9937
+ which bars it applies to — style the highlight via the `--lr-lite-chart-selected-outline-color`
9938
+ custom property (documented below). Note `::part(bar)[data-selected]` is **invalid CSS** — Shadow
9939
+ Parts forbids an attribute selector after `::part()` — so it silently never matches; the outline
9940
+ is painted inside the shadow root and exposed through that token instead.
9589
9941
  - `minBarHeight?: number` (attribute `min-bar-height`) — optional minimum visible bar height for
9590
9942
  small non-zero values
9591
9943
  - `accessibleLabel?: string` (attribute `accessible-label`) — SVG accessible-name override; a host
9592
9944
  `aria-label` wins
9945
+ - `appendData(label, values, maxPoints?)` — appends one aligned category and optionally trims the
9946
+ oldest categories
9593
9947
 
9594
9948
  **Events:** `lr-point-click` — fired when a bar/point is activated (click, or Enter/Space while
9595
9949
  focused). `detail: { datasetIndex: number, index: number, label: string | undefined, value: number
9596
9950
  | null }` — same shape as `lr-chart`'s `lr-point-click`.
9597
9951
 
9952
+ **Methods:** `exportData('csv' | 'svg')` returns a spreadsheet-safe CSV snapshot or the current SVG
9953
+ markup. The method does not download a file; pair it with `lr-export-button` for download UX.
9954
+
9598
9955
  The axis gutter/title and y-axis labels mirror to logical start under RTL. Built-in mark summaries
9599
9956
  are complete localized templates and format values with `effectiveLocale`.
9600
9957
 
@@ -9609,7 +9966,16 @@ fresh, small SVG render is cheaper and more correct than a lossy cache.
9609
9966
  `data-selected` when its category index is in `selectedIndex`), `line`, `point`, `legend`,
9610
9967
  `legend-item`, `legend-swatch`, `legend-text` (extra per-item text after the series label,
9611
9968
  rendered only when `legendText` is set), `live-region` (the current mark announcement for keyboard
9612
- users), `data-list` (a visually hidden list of all plotted data points).
9969
+ users), `data-list` (a visually hidden list of all plotted data points — single-series only),
9970
+ `data-table` (a visually hidden category×series data table, rendered instead of `data-list` when
9971
+ there is more than one dataset).
9972
+
9973
+ **Screen-reader data alternative:** a single dataset renders the flat `data-list` (one `<li>` per
9974
+ plotted point, matching the roving-tabindex mark order). More than one dataset instead renders a
9975
+ `data-table` — a category-labelled `<caption>` (the shared localized `chartData` string), one
9976
+ `<th scope="col">` per series (plus a leading `chartCategory` corner header), and one
9977
+ `<th scope="row">` per category label with its per-series values in the body — so a screen-reader
9978
+ user hears the values grouped by series rather than one flattened N×M sequence.
9613
9979
 
9614
9980
  **Themeable custom properties:** `--lr-chart-height` (same host-level property as `lr-chart`);
9615
9981
  `--lr-chart-grid-color`, `--lr-chart-tick-color`, `--lr-chart-legend-color` — same token
@@ -9664,7 +10030,8 @@ of every entry in these lists.**
9664
10030
 
9665
10031
  **Properties:** `labels`, `datasets`, `legend`, `legendPosition` (attribute `legend-position`),
9666
10032
  `valueFormatter`, `area`, `zoom`, `height`, `xLabel` (`x-label`), `yLabel` (`y-label`), `y2Label`
9667
- (`y2-label`), `beginAtZero` (`begin-at-zero`), `horizontal`, `stacked`, `config`, `accessibleLabel`
10033
+ (`y2-label`), `beginAtZero` (`begin-at-zero`), `horizontal`, `stacked`, `dataLabels`
10034
+ (`data-labels`), `stackTotals` (`stack-totals`), `config`, `accessibleLabel`
9668
10035
  (`accessible-label`), `accessibleDescription` (`accessible-description`), `showDataTable`
9669
10036
  (`show-data-table`), `chartArea` (readonly). `type` is the only member that differs: read-only,
9670
10037
  locked to this tag's value.
@@ -9685,7 +10052,7 @@ dependency fails to load — see `llms/components/lr-chart.md`).
9685
10052
  `--lr-chart-tooltip-text`.
9686
10053
 
9687
10054
  **Optional peer deps:** same as `lr-chart` — `chart.js`, plus `chartjs-plugin-zoom` only once
9688
- `zoom` is set.
10055
+ `zoom` is set, and `chartjs-plugin-datalabels` only once `data-labels`/`stack-totals` is set.
9689
10056
 
9690
10057
  ```html
9691
10058
  <lr-bar-chart legend></lr-bar-chart>
@@ -9729,8 +10096,9 @@ Bins `values` into `bins` equal-width buckets and renders as a bar chart (extend
9729
10096
  - All other `LyraChart` properties are inherited and usable: `legend`, `legendPosition` (attribute
9730
10097
  `legend-position`), `valueFormatter`, `area`, `zoom`, `config`, `height`, `xLabel` (`x-label`),
9731
10098
  `yLabel` (`y-label`), `y2Label` (`y2-label`), `beginAtZero` (`begin-at-zero`), `horizontal`,
9732
- `stacked`, `accessibleLabel` (`accessible-label`), `accessibleDescription`
9733
- (`accessible-description`), `showDataTable` (`show-data-table`), `chartArea` (readonly).
10099
+ `stacked`, `dataLabels` (`data-labels`), `stackTotals` (`stack-totals`), `accessibleLabel`
10100
+ (`accessible-label`), `accessibleDescription` (`accessible-description`), `showDataTable`
10101
+ (`show-data-table`), `chartArea` (readonly).
9734
10102
 
9735
10103
  **Methods:** `resetZoom()`, `refreshTheme()` — both inherited.
9736
10104
 
@@ -9794,7 +10162,8 @@ browser). Does **not** extend `LyraChart` — a deliberately bespoke API.
9794
10162
 
9795
10163
  **Slots:** `data-table` — an optional consumer-provided accessible table alternative.
9796
10164
 
9797
- **CSS parts:** `base`, `canvas`, `description`, `data-table`
10165
+ **CSS parts:** `base`, `canvas`, `description`, `data-table`, `error` (`role="alert"` message shown
10166
+ instead of `canvas` when the optional box-plot peer fails to load)
9798
10167
 
9799
10168
  **Themeable custom properties:** `--lr-chart-height`, `--lr-chart-grid-color`,
9800
10169
  `--lr-chart-tick-color`, `--lr-chart-legend-color`, `--lr-chart-tooltip-bg`,
@@ -9821,10 +10190,19 @@ independently of the base `chart-loader.ts`).
9821
10190
  logical start in RTL, canvas tooltip/axis colors are token-driven, and animation is disabled
9822
10191
  under reduced motion.
9823
10192
  - If `@sgratzl/chartjs-chart-boxplot` fails to load, the component warns to the console and
9824
- resolves to no chart rather than throwing.
10193
+ fails closed with a localized `role="alert"` error part rather than leaving a blank canvas.
9825
10194
 
9826
10195
  ---
9827
10196
 
10197
+ ## Chart streaming and export
10198
+
10199
+ `lr-lite-chart` and `lr-chart` expose additive imperative helpers for live dashboards:
10200
+ `appendData(label, values, maxPoints?)` appends one aligned category and optionally trims the oldest
10201
+ points. `lr-lite-chart.exportData('csv' | 'svg')` returns a spreadsheet-safe CSV snapshot or the
10202
+ current SVG markup. `lr-chart.exportData('csv' | 'png')` returns a CSV snapshot or Chart.js's current
10203
+ PNG data URL when the optional peer is loaded. These helpers do not download files; compose them
10204
+ with `lr-export-button` so the host owns filenames and download policy.
10205
+
9828
10206
  # Document & file viewers (`components/viewers/`)
9829
10207
 
9830
10208
  ## `lr-document-preview`
@@ -9992,9 +10370,10 @@ available, the region becomes a standard `role="progressbar"` instead, self-desc
9992
10370
  just via two different mechanisms depending on timing.
9993
10371
  - `download-link` (and thus `lr-download`) only renders/fires when `src` is set — a generic-fallback
9994
10372
  state with no `src` shows only the file glyph and message, with no download affordance at all.
9995
- - `download-link` also never renders for a `data:` URL, even though `data:` is accepted for text/image
9996
- sinks a `src="data:..."` document renders/fetches fine but falls back to no download affordance
9997
- in the generic state.
10373
+ - `download-link` also never renders for a `data:` or `mailto:` URL, even though `data:` is accepted
10374
+ for text/image sinks and `mailto:` is accepted for navigation anchors elsewhere in the library — a
10375
+ `src="data:..."` document renders/fetches fine but falls back to no download affordance in the
10376
+ generic state, and a `mailto:` names no retrievable bytes so it cannot be a download target at all.
9998
10377
  - A `src` that fails its sink's URL-safety check does **not** raise `lr-render-error` — that event is
9999
10378
  reserved for a `fetch()` that was actually attempted and failed at the network layer; an unsafe/
10000
10379
  malformed `src` is silently treated as unusable instead (a rendered `[part="error"]` message for
@@ -10144,7 +10523,12 @@ Remote resources are capped at 25 MB; exceeding it surfaces the localized
10144
10523
 
10145
10524
  **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. `foldQuotes:
10146
10525
  boolean = false` (attribute `fold-quotes`) — collapses trailing quoted-reply text/HTML behind a
10147
- localized show/hide toggle. `false` (the default) preserves the full body rendering.
10526
+ localized show/hide toggle. `false` (the default) preserves the full body rendering. A host
10527
+ `aria-label` takes precedence over `name`. `highlights`, `activeHighlightId`, `anchor`, and
10528
+ `anchorKinds` (`['text-quote', 'fragment']`) provide the shared text-viewer contract.
10529
+
10530
+ **Methods:** `search(query)`, `searchNext()`, `searchPrevious()`, `clearSearch()`, and
10531
+ `scrollToAnchor()` operate on rendered message text and emit the shared search/anchor events.
10148
10532
 
10149
10533
  **Events:** `lr-render-error` with `detail.error` when fetching or parsing fails.
10150
10534
  `lr-attachment-open` — `detail: { attachment: { filename, mimeType, content? } }`, `content` a
@@ -10174,7 +10558,12 @@ contract: an absent `postal-mime` renders `[part="error"]` with the localized
10174
10558
  Fetches and parses `.ics` calendars with the optional `ical.js` peer and renders each VEVENT as
10175
10559
  plain text, including its title, start/end time, location, and description. No HTML is injected.
10176
10560
 
10177
- **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings.
10561
+ **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. A host
10562
+ `aria-label` takes precedence over `name`. `highlights`, `activeHighlightId`, `anchor`, and
10563
+ `anchorKinds` (`['text-quote', 'fragment']`) provide the shared text-viewer contract.
10564
+
10565
+ **Methods:** `search(query)`, `searchNext()`, `searchPrevious()`, `clearSearch()`, and
10566
+ `scrollToAnchor()` operate on rendered event text and emit `lr-search-change`/`lr-anchor-result`.
10178
10567
 
10179
10568
  **Events:** `lr-render-error` with `detail.error` when fetching or parsing fails.
10180
10569
 
@@ -10198,12 +10587,17 @@ read straight from JSZip's local file header (`uncompressedSize`) when available
10198
10587
  fully decompressing only the rare entry missing that header field. The list composes
10199
10588
  `<lr-virtual-list>` for large archives.
10200
10589
 
10201
- **Properties:** `src` and `name` are strings — `name` (or a host-level `aria-label`) names the
10202
- listing region as `role="region"`; with neither set, the region is unnamed.
10590
+ **Properties:** `src` and `name` are strings — a host-level `aria-label` takes precedence over
10591
+ `name` when naming the `role="region"` listing. The viewer also exposes the shared text-viewer
10592
+ contract: `highlights`, `activeHighlightId`, `anchor`, and `anchorKinds` (`['text-quote', 'fragment']`).
10593
+
10594
+ **Methods:** `search(query)`, `searchNext()`, `searchPrevious()`, and `clearSearch()` provide
10595
+ case-insensitive text search over rendered entry names; `scrollToAnchor()` resolves text-quote and
10596
+ fragment anchors and emits `lr-anchor-result`.
10203
10597
 
10204
10598
  **Events:** `lr-render-error` with `detail.error` when fetching or parsing fails.
10205
10599
 
10206
- **CSS parts:** `base`, `entry`, `entry-icon`, `entry-name`, `entry-name-dir`, `entry-size`,
10600
+ **CSS parts:** `base`, `body`, `entry`, `entry-icon`, `entry-name`, `entry-name-dir`, `entry-size`,
10207
10601
  `spinner`, and `error`. A directory row's name element carries both `entry-name` and
10208
10602
  `entry-name-dir` (a part list), so `::part(entry-name-dir)` selects only directory names while
10209
10603
  `::part(entry-name)` still selects every name. Entry rows are rendered into the embedded
@@ -10276,10 +10670,14 @@ Best-effort client-side PPTX viewer backed by the optional `@aiden0z/pptx-render
10276
10670
  localized fidelity notice is always visible because animations, equations, embedded objects,
10277
10671
  speaker notes, and several advanced effects are not rendered.
10278
10672
 
10279
- **Properties:** `src`, `name`, and `label` are strings. A host `aria-label` also names the viewer
10280
- region when `label` is unset.
10673
+ **Properties:** `src`, `name`, and `label` are strings. A host `aria-label` takes precedence over
10674
+ `label` and `name`. `highlights`, `activeHighlightId`, `anchor`, and `anchorKinds`
10675
+ (`['text-quote', 'fragment']`) provide the shared text-viewer contract when the renderer exposes
10676
+ DOM text.
10281
10677
 
10282
10678
  **Methods:** `goToSlide(index)` returns a promise and navigates the mounted presentation.
10679
+ `search(query)`, `searchNext()`, `searchPrevious()`, `clearSearch()`, and `scrollToAnchor()` are
10680
+ available for renderer output that exposes DOM text.
10283
10681
 
10284
10682
  **Events:** `lr-load` (`detail: { slideCount }`), `lr-slide-change` (`detail: { index, count }`),
10285
10683
  and `lr-render-error` with `detail.error`.
@@ -10343,7 +10741,12 @@ Remote resources are capped at 25 MB; exceeding it surfaces the localized
10343
10741
  Fetches an HTML document, sanitizes it with the optional `dompurify` peer, and renders the safe markup
10344
10742
  inside a bounded, scrollable body.
10345
10743
 
10346
- **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings.
10744
+ **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. A host
10745
+ `aria-label` takes precedence over `name`. `highlights`, `activeHighlightId`, `anchor`, and
10746
+ `anchorKinds` (`['text-quote', 'fragment']`) provide the shared text-viewer contract.
10747
+
10748
+ **Methods:** `search(query)`, `searchNext()`, `searchPrevious()`, `clearSearch()`, and
10749
+ `scrollToAnchor()` operate on sanitized HTML text and emit the shared search/anchor events.
10347
10750
 
10348
10751
  **Events:** `lr-render-error` with `detail.error` when fetching or sanitizing fails.
10349
10752
 
@@ -10419,7 +10822,12 @@ label when `FN` is absent).
10419
10822
  Remote resources are capped at 25 MB; exceeding it surfaces the localized
10420
10823
  `documentPreviewResourceTooLarge` message instead of the contacts.
10421
10824
 
10422
- **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings.
10825
+ **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. A host
10826
+ `aria-label` takes precedence over `name`. `highlights`, `activeHighlightId`, `anchor`, and
10827
+ `anchorKinds` (`['text-quote', 'fragment']`) provide the shared text-viewer contract.
10828
+
10829
+ **Methods:** `search(query)`, `searchNext()`, `searchPrevious()`, `clearSearch()`, and
10830
+ `scrollToAnchor()` operate on rendered contact text and emit the shared search/anchor events.
10423
10831
 
10424
10832
  **Events:** `lr-render-error` with `detail.error` when fetching or parsing fails.
10425
10833
 
@@ -10635,6 +11043,11 @@ removed once it settles either way. Build error UI from `lr-include-error`.
10635
11043
  letting `fetch()` throw. `no-cors` is accepted for enum completeness but always yields an opaque
10636
11044
  response (`status` `0`, unreadable body) — a Fetch API limitation, not a bug here.
10637
11045
 
11046
+ The shared text-viewer contract is also available for the sanitized light-DOM fragment:
11047
+ `highlights`, `activeHighlightId`, `anchor`, and `anchorKinds` (`['text-quote', 'fragment']`).
11048
+ `search(query)`, `searchNext()`, `searchPrevious()`, `clearSearch()`, and `scrollToAnchor()`
11049
+ operate on the included text.
11050
+
10638
11051
  **Events:**
10639
11052
  - `lr-load` — `detail: { src }` — the fragment was sanitized and written into the light DOM.
10640
11053
  - `lr-include-error` — `detail: { status, reason, error? }`. `reason` is a `LyraIncludeErrorReason`:
@@ -10878,7 +11291,10 @@ collapsed-depth="2">` of the raw value instead of the map.
10878
11291
 
10879
11292
  **Properties:** `src: string = ''` — URL to fetch and parse. `name: string = ''` — accessible label,
10880
11293
  used as `<lr-map>`'s `label` and the root's `aria-label` (falling back to the localized
10881
- `geojsonViewLabel` when unset).
11294
+ `geojsonViewLabel` when unset). A host `aria-label` takes precedence over `name`. The shared
11295
+ text-viewer contract adds `highlights`, `activeHighlightId`, `anchor`, and
11296
+ `anchorKinds` (`['text-quote', 'fragment']`), plus `search()`, `searchNext()`, `searchPrevious()`,
11297
+ `clearSearch()`, and `scrollToAnchor()` for rendered feature metadata and status text.
10882
11298
 
10883
11299
  **Events:** `lr-render-error` — `detail: { error }` — fetch, parse, or shape-validation failure.
10884
11300
 
@@ -11240,6 +11656,11 @@ streaming-indicator pulse animation's cycle, the same shared compound token
11240
11656
  background already maps to that same token, override `[part=bubble]`'s background explicitly (e.g.
11241
11657
  via `::part(bubble)`) so message bubbles stay visually distinct from the surrounding panel.
11242
11658
 
11659
+ > Retheming a bubble from outside `<lr-chat-message>` (e.g. per-thread or per-role colors)?
11660
+ > Set `--lr-theme-*` on the ancestor wrapper, not `--lr-*` directly — see `llms/shared.md`'s
11661
+ > "Theming and design tokens" section for why a `--lr-*` override on a wrapper only reaches that
11662
+ > wrapper's *direct* children, not a nested `<lr-*>` host's shadow DOM.
11663
+
11243
11664
  **Optional peer deps:** none. Internally renders a `<lr-live-region>` (a first-party sibling
11244
11665
  component, auto-imported alongside this one, not an npm peer) for the status-transition
11245
11666
  announcements described below.
@@ -11313,10 +11734,13 @@ variant), `cursor` (the blinking bar in the `cursor` variant)
11313
11734
  `size="sm"`), `--lr-typing-gap` (default `0.25rem`, `0.1875rem` at `size="sm"`),
11314
11735
  `--lr-typing-cursor-width` (default `0.125rem`, `0.09375rem` at `size="sm"`),
11315
11736
  `--lr-typing-cursor-height` (default `1em`, unaffected by `size`),
11316
- `--lr-typing-dot-stagger-1` (default `600ms`, second dot), and
11317
- `--lr-typing-dot-stagger-2` (default `1200ms`, third dot). Every variant uses the shared
11318
- `--lr-transition-ambient` compound duration/timing token (default `1.8s ease-in-out`) as its
11319
- animation cycle.
11737
+ `--lr-typing-dot-stagger-1` (default `600ms`, second dot), `--lr-typing-dot-stagger-2` (default
11738
+ `1200ms`, third dot), and `--lr-typing-duration` (default `var(--lr-transition-ambient)`, i.e.
11739
+ `1.8s ease-in-out`) — the compound duration/timing-function token every variant uses as its
11740
+ animation cycle. `--lr-typing-duration` is a dedicated alias: it defaults to the library-wide
11741
+ `--lr-transition-ambient` token (shared by every other ambient-looping component), but overriding
11742
+ it retimes only this component, leaving `--lr-transition-ambient` itself — and anything else keyed
11743
+ off it — untouched.
11320
11744
 
11321
11745
  **Optional peer deps:** none.
11322
11746
 
@@ -11325,7 +11749,7 @@ animation cycle.
11325
11749
  <lr-typing-indicator variant="pulse" size="sm"></lr-typing-indicator>
11326
11750
  <lr-typing-indicator variant="cursor"></lr-typing-indicator>
11327
11751
  <lr-typing-indicator
11328
- style="--lr-transition-ambient: 900ms ease-in-out; --lr-typing-dot-stagger-1: 300ms; --lr-typing-dot-stagger-2: 600ms"
11752
+ style="--lr-typing-duration: 900ms ease-in-out; --lr-typing-dot-stagger-1: 300ms; --lr-typing-dot-stagger-2: 600ms"
11329
11753
  ></lr-typing-indicator>
11330
11754
  ```
11331
11755
 
@@ -11344,9 +11768,10 @@ decorative; `label` is the entire accessible content, nothing narrates individua
11344
11768
  state (`opacity: 1`, no transform, `animation: none !important`) rather than freezing on whatever
11345
11769
  frame the animation happened to be on — notably relevant for `cursor`, which would otherwise risk
11346
11770
  freezing on its invisible ("off") blink half.
11347
- - `--lr-transition-ambient` is a compound `duration timing-function` value and cannot be divided
11348
- with `calc()`. When retiming it, override both stagger properties alongside it to preserve the
11349
- default one-third/two-thirds dot phasing, as shown above.
11771
+ - `--lr-typing-duration` (like the `--lr-transition-ambient` token it aliases by default) is a
11772
+ compound `duration timing-function` value and cannot be divided with `calc()`. When retiming it,
11773
+ override both stagger properties alongside it to preserve the default one-third/two-thirds dot
11774
+ phasing, as shown above.
11350
11775
  - `size="sm"` shrinks the dot size, gap, and cursor width, but **not** `--lr-typing-cursor-height`
11351
11776
  (still `1em` at any size) — the cursor bar's height is meant to track surrounding text size via
11352
11777
  `1em`, not the component's own `size` property.
@@ -11674,8 +12099,8 @@ in-place rename `<input>`'s own `focus`, for the same reason as `blur`)
11674
12099
 
11675
12100
  `leading`/`content`/`excerpt`/`meta` must all stay non-focusable — see the `role="button"` note below.
11676
12101
 
11677
- **CSS parts:** `base`, `option`, `content`, `title`, `title-input`, `rename-button`, `excerpt`,
11678
- `timestamp`, `actions`
12102
+ **CSS parts:** `base`, `active-indicator` (decorative, rendered only while `active`), `option`,
12103
+ `content`, `title`, `title-input`, `rename-button`, `excerpt`, `timestamp`, `actions`
11679
12104
 
11680
12105
  **Themeable custom properties:** `--lr-conversation-item-active-bg` (default
11681
12106
  `var(--lr-color-brand-quiet)`) — the row's background while `active`. `--lr-conversation-item-active-color`
@@ -11694,6 +12119,13 @@ the default active background; keep any override at 4.5:1 or better against it.
11694
12119
  custom active background needs its own title color set alongside them, or the title drops below
11695
12120
  contrast while the excerpt stays legible.
11696
12121
 
12122
+ `--lr-conversation-item-active-indicator-color` (default `var(--lr-color-brand)`) controls the
12123
+ decorative `active-indicator` part's color. `--lr-conversation-item-active-indicator-width`
12124
+ (default `var(--lr-size-2px)`) controls its inline width. `--lr-conversation-item-active-indicator-inset-inline`
12125
+ (default `0 auto`) controls its logical inline insets; set `auto 0` to move the indicator to
12126
+ inline-end. The indicator is `aria-hidden`, occupies the full row block-size, and is absent while
12127
+ the row is inactive.
12128
+
11697
12129
  `--lr-conversation-item-compact-padding` (default `var(--lr-space-xs) var(--lr-space-s)`) —
11698
12130
  `[part='base']`'s padding while `compact`. `--lr-conversation-item-compact-gap` (default
11699
12131
  `var(--lr-space-2xs)`) — `[part='base']`'s gap while `compact`. Like the active-state pair, both are
@@ -11875,7 +12307,13 @@ decorative box size (clamped against `--lr-icon-button-size` via `min()`). All f
11875
12307
  uses — so `size` is the primary lever; override the cssprop directly only to retune a single tier or
11876
12308
  step outside the scale entirely. `--lr-model-select-option-active-bg` (default
11877
12309
  `var(--lr-color-brand-quiet)`) — background of a hovered or keyboard-active `[part="option"]` row;
11878
- declared as a `var()` fallback at the point of use, not on `:host`, so it isn't tied to `size`. Plus
12310
+ declared as a `var()` fallback at the point of use, not on `:host`, so it isn't tied to `size`. The
12311
+ selected row (`[part="option"][aria-selected="true"]`) has the matching set
12312
+ `--lr-model-select-option-selected-bg` (default `transparent`),
12313
+ `--lr-model-select-option-selected-border` and `--lr-model-select-option-selected-color` (both
12314
+ `var(--lr-color-brand)`), and `--lr-model-select-option-selected-font-weight`
12315
+ (`var(--lr-font-weight-semibold)`), all inline `var()` fallbacks so the selected row is rethemeable
12316
+ without hijacking `--lr-color-brand`. Plus
11879
12317
  shared tokens — `--lr-space-xs/-s`, `--lr-color-border/-surface/-brand/-brand-quiet/-text-quiet`,
11880
12318
  `--lr-radius`, `--lr-shadow`, `--lr-focus-ring-width/-color/-offset`, `--lr-icon-button-size`,
11881
12319
  `--lr-transition-fast`, `--lr-opacity-disabled`.
@@ -12884,7 +13322,7 @@ reach callback-rendered descendants through these parts). `row-excerpt` wraps `r
12884
13322
  output, which is slotted into the row item's own `excerpt` slot.
12885
13323
 
12886
13324
  Data mode additionally forwards each row `<lr-conversation-item>`'s own parts under a `row-item-`
12887
- prefix: `row-item-base`, `row-item-option`, `row-item-leading`, `row-item-content`,
13325
+ prefix: `row-item-base`, `row-item-active-indicator`, `row-item-option`, `row-item-leading`, `row-item-content`,
12888
13326
  `row-item-title`, `row-item-title-input`, `row-item-rename-button`, `row-item-excerpt`,
12889
13327
  `row-item-meta`, `row-item-timestamp`, `row-item-actions`.
12890
13328
 
@@ -13300,6 +13738,11 @@ referenced: `--lr-color-text-quiet`, `--lr-color-surface`, `--lr-color-border`,
13300
13738
  `--lr-space-xs/-s/-m`, `--lr-radius`, `--lr-shadow`, `--lr-focus-ring-*`,
13301
13739
  `--lr-transition-fast`.
13302
13740
 
13741
+ > Retheming a chip from outside `<lr-tool-call-chip>` (e.g. per-tool or per-status colors)?
13742
+ > Set `--lr-theme-*` on the ancestor wrapper, not `--lr-*` directly — see `llms/shared.md`'s
13743
+ > "Theming and design tokens" section for why a `--lr-*` override on a wrapper only reaches that
13744
+ > wrapper's *direct* children, not a nested `<lr-*>` host's shadow DOM.
13745
+
13303
13746
  **Optional peer deps:** none.
13304
13747
 
13305
13748
  ```html
@@ -13366,6 +13809,13 @@ shell around it.
13366
13809
  - `copyable: boolean = false` (reflected) — shows a copy-to-clipboard affordance alongside the
13367
13810
  fallback view, for either `fallback` kind: forwarded to `<lr-json-viewer>`'s own `copyable` for
13368
13811
  `"json"`, or a `<lr-copy-button>` rendered next to the text for `"text"`.
13812
+ - `status: 'pending'|'running'|'success'|'error'|'denied' = 'success'` (reflected) — the outcome of
13813
+ the currently-rendered result, as reported by the matched renderer's own `context.reportStatus()`
13814
+ (see below). Reset to `'success'` immediately before every `render()` call, so a renderer that
13815
+ never calls `reportStatus` — including every pre-existing 2-arg renderer written before this
13816
+ property existed — leaves it at that default, and a later renderer that stays quiet doesn't
13817
+ inherit a stale outcome left behind by a previous one. Same status vocabulary as
13818
+ `<lr-tool-result-dialog>`/`<lr-tool-call-chip>`.
13369
13819
 
13370
13820
  **Events:** `lr-render-error` (`detail: { toolName: string; error: unknown }`) — fired immediately
13371
13821
  before falling back to `<lr-json-viewer>`, whether because no renderer matched, a candidate
@@ -13408,10 +13858,16 @@ this same module-level registry unless a given `<lr-tool-result-view>`'s `regist
13408
13858
  set to a different `Map` instance.
13409
13859
 
13410
13860
  **`ToolRendererDefinition`** — the shape of one registered renderer:
13411
- - `render?: (result: unknown, args: unknown) => unknown` — renders the result (and the args that
13412
- produced it) as UI. Typed as `unknown` rather than Lit's `TemplateResult` so any lit-html-renderable
13413
- value works (a plain string, a DOM node, an array of templates) — consumers already own their own
13414
- Lit import and don't need this module to add one
13861
+ - `render?: (result: unknown, args: unknown, context: ToolRenderContext) => unknown` — renders the
13862
+ result (and the args that produced it) as UI. Typed as `unknown` rather than Lit's
13863
+ `TemplateResult` so any lit-html-renderable value works (a plain string, a DOM node, an array of
13864
+ templates) — consumers already own their own Lit import and don't need this module to add one.
13865
+ The 3rd `context` argument is additive: it's the *last* positional parameter, so a pre-existing
13866
+ 2-arg `render(result, args)` function stays assignable to this type unchanged — JS/TS function
13867
+ assignability allows an implementation with fewer parameters than its declared type. Use
13868
+ `context.reportStatus(status)` (see `ToolRenderContext` below) to signal a non-throwing outcome
13869
+ — e.g. an application-level failure the renderer still drew real UI for — instead of throwing,
13870
+ which discards that UI for the `<lr-json-viewer>` fallback instead
13415
13871
  - `matches?: (payload: unknown) => boolean` — facade/shape-based dispatch predicate, consulted only
13416
13872
  when no exact `toolName` key matches (see dispatch order below); only ever consulted *before*
13417
13873
  `load` resolves when supplied inline at registration time — a definition that needs shape-based
@@ -13424,6 +13880,27 @@ set to a different `Map` instance.
13424
13880
  object, so `load: () => import('./my-renderer.js')` works unmodified when that module's default
13425
13881
  export is itself a `ToolRendererDefinition`
13426
13882
 
13883
+ **`ToolRenderContext`** — the shape of `render()`'s 3rd argument:
13884
+ - `reportStatus: (status: ToolResultStatus) => void` — reports this render's outcome without
13885
+ throwing. `ToolResultStatus` is `'pending' | 'running' | 'success' | 'error' | 'denied'`, the same
13886
+ union `<lr-tool-result-dialog>`/`<lr-tool-call-chip>` use, re-exported from this module. Calling
13887
+ it is entirely optional: a renderer that never calls it leaves `<lr-tool-result-view>`'s `status`
13888
+ property at its default, `'success'`. This threads through the lazy `load()` path exactly the
13889
+ same way — a `render()` resolved via `load()` receives the same 3rd `context` argument as one
13890
+ registered directly.
13891
+
13892
+ ```ts
13893
+ registerToolRenderer('run_query', {
13894
+ render: (result, _args, context) => {
13895
+ if ((result as { rows?: unknown[] })?.rows === undefined) {
13896
+ context.reportStatus('error');
13897
+ return html`<p class="query-error">The query returned no result set.</p>`;
13898
+ }
13899
+ return html`<query-result-table .rows=${(result as { rows: unknown[] }).rows}></query-result-table>`;
13900
+ },
13901
+ });
13902
+ ```
13903
+
13427
13904
  **Exports:**
13428
13905
  - `registerToolRenderer(name: string, def: ToolRendererDefinition): void` — registers (or
13429
13906
  overwrites) the renderer for `name` in the module-level default registry
@@ -13483,6 +13960,20 @@ registerToolRenderer('web_search', {
13483
13960
  - `matches` is a linear scan over every registered definition's `matches` in registration order; it
13484
13961
  only runs when the exact-name lookup misses, so tool names with a direct registration never pay
13485
13962
  that scan cost
13963
+ - `status` is reset to `'success'` immediately before every `render()` call, not merely at
13964
+ construction — a renderer that reported `'error'` on one result does not leave that status
13965
+ behind once dispatch moves on to a different (quiet) renderer; a `reportStatus()` call that
13966
+ arrives asynchronously after a *newer* resolve has already started (a stale promise the previous
13967
+ render kicked off) is detected via the same generation counter as the `load()` staleness guard
13968
+ and discarded rather than clobbering the newer status
13969
+ - **don't type a custom renderer against a hand-rolled, over-generic function signature** (e.g.
13970
+ `render: (...args: any[]) => unknown`, or a locally-declared narrower alias then cast to
13971
+ `ToolRendererDefinition`) — write the registration as a plain object literal (as in every example
13972
+ above) or annotate it as `ToolRendererDefinition` directly, so TypeScript checks the actual
13973
+ current `render`/`matches`/`load` shape, including the `context: ToolRenderContext` 3rd
13974
+ parameter and the exact `ToolResultStatus` string union `reportStatus` accepts. A loosened/`any`
13975
+ signature type-checks either way but silently gives up the compiler's ability to catch a typo'd
13976
+ status string or a dropped `context` parameter
13486
13977
  - `fallback` implements exactly two kinds, `"json"` and `"text"`; any *other* value silently behaves
13487
13978
  as `"json"`, as does `"text"` whenever `result` isn't a string. Only `"text"` renders
13488
13979
  `[part="fallback-text"]`/`[part="fallback-copy"]`
@@ -15064,6 +15555,38 @@ retinted independently; `--lr-tool-timeline-pending-approval-border-color` (defa
15064
15555
  `var(--lr-color-warning)`) — color of the entry body's leading border while that entry's
15065
15556
  `data-pending-approval` is `"true"`.
15066
15557
 
15558
+ ## `lr-agent-eval-dashboard`
15559
+
15560
+ Controlled evaluation overview with metric cards, a dependency-free trend chart, and run-status
15561
+ history. It never launches or scores evaluations.
15562
+
15563
+ **Properties:** `metrics: AgentEvaluationMetric[] = []` (attribute: false), where each metric is
15564
+ `{ id, label, value, format?: 'number' | 'percent' | 'milliseconds' | 'currency' }`; `runs:
15565
+ AgentEvaluationDashboardRun[] = []` (attribute: false), where each run is `{ id, label, status,
15566
+ metrics?: Record<string, number> }`; `metricId: string = ''`; `label: string = ''`; `showChart:
15567
+ boolean = true`; `chartHeight: string = '220px'`.
15568
+
15569
+ **Events:** `lr-metric-change` (`{ metricId }`, reserved for host-controlled metric selectors) and
15570
+ `lr-run-select` (`{ runId }`).
15571
+
15572
+ **CSS parts:** `base`, `heading`, `metrics`, `metric`, `chart`, `runs`, `runs-heading`, `run`,
15573
+ `run-label`, `run-meta`, `run-status`, `empty`.
15574
+
15575
+ ## `lr-approval-queue`
15576
+
15577
+ Keyboard-accessible queue of pending tool calls backed by one reusable `lr-tool-approval-dialog`.
15578
+ It never executes tools or persists decisions.
15579
+
15580
+ **Properties:** `requests: ToolApprovalRequest[] = []` (attribute: false), where each request is
15581
+ `{ id, toolName, args, status?: 'pending' | 'approved' | 'denied' }`; `selectedId: string = ''`;
15582
+ `open: boolean = false`; `editable: boolean = true`; `label: string = ''`.
15583
+
15584
+ **Events:** `lr-approval-select` (`{ invocationId }`), `lr-approval-decision` (`{ invocationId,
15585
+ approved, args? }`), and `lr-approval-close` (`{ invocationId, reason }`).
15586
+
15587
+ **CSS parts:** `base`, `heading-row`, `heading`, `count`, `list`, `request`, `request-info`,
15588
+ `tool-name`, `request-id`, `status`, `empty`.
15589
+
15067
15590
  # Retrieval, knowledge graph & grounding (`components/retrieval/`)
15068
15591
 
15069
15592
  ## `lr-graph`
@@ -15939,6 +16462,11 @@ directly — set instead by the `:host([status=...])` rules), plus shared tokens
15939
16462
  `--lr-color-surface`, `--lr-color-border`, `--lr-shadow`, `--lr-space-s`/`-m`,
15940
16463
  `--lr-transition-fast`, `--lr-focus-ring-*`.
15941
16464
 
16465
+ > Retheming a badge from outside `<lr-citation-badge>` (e.g. per-source or per-confidence colors)?
16466
+ > Set `--lr-theme-*` on the ancestor wrapper, not `--lr-*` directly — see `llms/shared.md`'s
16467
+ > "Theming and design tokens" section for why a `--lr-*` override on a wrapper only reaches that
16468
+ > wrapper's *direct* children, not a nested `<lr-*>` host's shadow DOM.
16469
+
15942
16470
  **Optional peer deps:** none.
15943
16471
 
15944
16472
  ```html
@@ -16687,3 +17215,54 @@ falls back to that token, so rendering is unchanged. Plus shared tokens otherwis
16687
17215
  **Known gotchas:**
16688
17216
  - Every stage starts collapsed; expansion state is internal `@state` keyed by stage id, not a
16689
17217
  controlled property.
17218
+
17219
+ ## `lr-rag-answer`
17220
+
17221
+ Controlled grounded-answer surface combining sanitized Markdown, citation badges, grounding
17222
+ assessment, and expandable source previews. It performs no model call, retrieval, citation parsing,
17223
+ or source fetching.
17224
+
17225
+ **Properties:** `answer: string = ''`; `citations: Citation[] = []` (attribute: false);
17226
+ `sources: DocumentRef[] = []` (attribute: false); `assessment: GroundingAssessment | null = null`
17227
+ (attribute: false); `loading: boolean = false`; `error: string = ''`; `showSources: boolean = true`;
17228
+ `label: string = ''`; `accessibleLabel: string | null = null` (attribute `aria-label`).
17229
+
17230
+ **Events:** `lr-citation-select` (`{ citation }`) and `lr-retry`.
17231
+
17232
+ **Slots:** `answer` replaces the data-driven Markdown body; `sources` replaces the data-driven
17233
+ source list.
17234
+
17235
+ **CSS parts:** `base`, `answer`, `loading`, `error`, `retry`, `grounding`, `citations`,
17236
+ `citation-list`, `sources`, `source-list`, `section-heading`.
17237
+
17238
+ ## `lr-embedding-explorer`
17239
+
17240
+ Dependency-free accessible 2D embedding projection viewer. Coordinates are projected by the host;
17241
+ the component only normalizes them into SVG, colors optional clusters, and emits selection events.
17242
+
17243
+ **Properties:** `points: EmbeddingPoint[] = []` (attribute: false), where each point is `{ id, x,
17244
+ y, label?, sourceId?, cluster? }`; `selectedId: string = ''`; `height: string = '360px'`;
17245
+ `accessibleLabel: string | null = null` (attribute `aria-label`). Non-finite coordinates are
17246
+ omitted.
17247
+
17248
+ **Events:** `lr-point-select` (`{ point }`), activated by click or Enter/Space.
17249
+
17250
+ **CSS parts:** `base`, `plot`, `point`, `empty`.
17251
+
17252
+ ## `lr-knowledge-base-admin`
17253
+
17254
+ Tabbed operations shell composing `lr-knowledge-base` and `lr-ingestion-queue`. It forwards source
17255
+ and ingestion actions under namespaced events; host-owned controls such as chunking, embedding,
17256
+ permissions, and connector settings go in the `settings` slot.
17257
+
17258
+ **Properties:** `sources: KnowledgeSource[] = []` (attribute: false); `ingestionItems:
17259
+ IngestionQueueItem[] = []` (attribute: false); `activeTab: 'sources' | 'ingestion' = 'sources'`;
17260
+ `label: string = ''`; `hideIngestion: boolean = false`.
17261
+
17262
+ **Events:** `lr-tab-change` (`{ tab }`), `lr-source-create`, `lr-source-sync`, `lr-source-pause`,
17263
+ `lr-source-delete`, `lr-ingestion-retry`, and `lr-ingestion-cancel` (the latter four preserve the
17264
+ correlated ids/details from their composed primitives).
17265
+
17266
+ **Slots:** `settings` — host-owned KB configuration controls.
17267
+
17268
+ **CSS parts:** `base`, `heading`, `tabs`, `tab`, `panel`, `settings`.