@aceshooting/lyra-ui 6.0.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 (1148) hide show
  1. package/CHANGELOG.md +185 -0
  2. package/README.md +11 -6
  3. package/custom-elements.json +8223 -939
  4. package/dist/ai/types.contract.js +1 -0
  5. package/dist/ai/types.contract.js.map +1 -1
  6. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts.map +1 -1
  7. package/dist/components/agent-tools/activity-feed/activity-feed.class.js.map +1 -1
  8. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.class.d.ts +67 -0
  9. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.class.d.ts.map +1 -0
  10. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.class.js +78 -0
  11. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.class.js.map +1 -0
  12. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.d.ts +2 -0
  13. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.d.ts.map +1 -0
  14. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.js +5 -0
  15. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.js.map +1 -0
  16. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.styles.d.ts +2 -0
  17. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.styles.d.ts.map +1 -0
  18. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.styles.js +17 -0
  19. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.styles.js.map +1 -0
  20. package/dist/components/agent-tools/agent-run/agent-run.class.d.ts.map +1 -1
  21. package/dist/components/agent-tools/agent-run/agent-run.class.js.map +1 -1
  22. package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts.map +1 -1
  23. package/dist/components/agent-tools/agent-trace/agent-trace.class.js +1 -1
  24. package/dist/components/agent-tools/agent-trace/agent-trace.class.js.map +1 -1
  25. package/dist/components/agent-tools/agent-trace/agent-trace.styles.d.ts.map +1 -1
  26. package/dist/components/agent-tools/agent-trace/agent-trace.styles.js +2 -0
  27. package/dist/components/agent-tools/agent-trace/agent-trace.styles.js.map +1 -1
  28. package/dist/components/agent-tools/approval-queue/approval-queue.class.d.ts +77 -0
  29. package/dist/components/agent-tools/approval-queue/approval-queue.class.d.ts.map +1 -0
  30. package/dist/components/agent-tools/approval-queue/approval-queue.class.js +144 -0
  31. package/dist/components/agent-tools/approval-queue/approval-queue.class.js.map +1 -0
  32. package/dist/components/agent-tools/approval-queue/approval-queue.d.ts +2 -0
  33. package/dist/components/agent-tools/approval-queue/approval-queue.d.ts.map +1 -0
  34. package/dist/components/agent-tools/approval-queue/approval-queue.js +5 -0
  35. package/dist/components/agent-tools/approval-queue/approval-queue.js.map +1 -0
  36. package/dist/components/agent-tools/approval-queue/approval-queue.styles.d.ts +2 -0
  37. package/dist/components/agent-tools/approval-queue/approval-queue.styles.d.ts.map +1 -0
  38. package/dist/components/agent-tools/approval-queue/approval-queue.styles.js +96 -0
  39. package/dist/components/agent-tools/approval-queue/approval-queue.styles.js.map +1 -0
  40. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.d.ts.map +1 -1
  41. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.js +3 -1
  42. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.js.map +1 -1
  43. package/dist/components/agent-tools/browser-frame/browser-frame.class.d.ts.map +1 -1
  44. package/dist/components/agent-tools/browser-frame/browser-frame.class.js.map +1 -1
  45. package/dist/components/agent-tools/commit-card/commit-card.class.d.ts.map +1 -1
  46. package/dist/components/agent-tools/commit-card/commit-card.class.js.map +1 -1
  47. package/dist/components/agent-tools/compare-panel/compare-panel.class.d.ts.map +1 -1
  48. package/dist/components/agent-tools/compare-panel/compare-panel.class.js.map +1 -1
  49. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts.map +1 -1
  50. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +2 -2
  51. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js.map +1 -1
  52. package/dist/components/agent-tools/context-inspector/context-inspector.class.d.ts +1 -0
  53. package/dist/components/agent-tools/context-inspector/context-inspector.class.d.ts.map +1 -1
  54. package/dist/components/agent-tools/context-inspector/context-inspector.class.js +4 -1
  55. package/dist/components/agent-tools/context-inspector/context-inspector.class.js.map +1 -1
  56. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts.map +1 -1
  57. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js.map +1 -1
  58. package/dist/components/agent-tools/eval-result/eval-result.class.d.ts.map +1 -1
  59. package/dist/components/agent-tools/eval-result/eval-result.class.js.map +1 -1
  60. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.d.ts.map +1 -1
  61. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.js +7 -7
  62. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.js.map +1 -1
  63. package/dist/components/agent-tools/policy-summary/policy-summary.class.d.ts.map +1 -1
  64. package/dist/components/agent-tools/policy-summary/policy-summary.class.js.map +1 -1
  65. package/dist/components/agent-tools/result-card/result-card.class.d.ts.map +1 -1
  66. package/dist/components/agent-tools/result-card/result-card.class.js.map +1 -1
  67. package/dist/components/agent-tools/result-card/result-field.class.d.ts.map +1 -1
  68. package/dist/components/agent-tools/result-card/result-field.class.js.map +1 -1
  69. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.d.ts.map +1 -1
  70. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +11 -8
  71. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js.map +1 -1
  72. package/dist/components/agent-tools/stack-trace/stack-trace-parse.d.ts.map +1 -1
  73. package/dist/components/agent-tools/stack-trace/stack-trace-parse.js +1 -0
  74. package/dist/components/agent-tools/stack-trace/stack-trace-parse.js.map +1 -1
  75. package/dist/components/agent-tools/stack-trace/stack-trace.class.d.ts.map +1 -1
  76. package/dist/components/agent-tools/stack-trace/stack-trace.class.js +1 -1
  77. package/dist/components/agent-tools/stack-trace/stack-trace.class.js.map +1 -1
  78. package/dist/components/agent-tools/task-list/task-list.class.d.ts.map +1 -1
  79. package/dist/components/agent-tools/task-list/task-list.class.js.map +1 -1
  80. package/dist/components/agent-tools/terminal/terminal.class.d.ts.map +1 -1
  81. package/dist/components/agent-tools/terminal/terminal.class.js +2 -2
  82. package/dist/components/agent-tools/terminal/terminal.class.js.map +1 -1
  83. package/dist/components/agent-tools/test-results/test-results.class.d.ts.map +1 -1
  84. package/dist/components/agent-tools/test-results/test-results.class.js +1 -1
  85. package/dist/components/agent-tools/test-results/test-results.class.js.map +1 -1
  86. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.d.ts.map +1 -1
  87. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.js +11 -5
  88. package/dist/components/agent-tools/thinking-panel/thinking-panel.class.js.map +1 -1
  89. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.d.ts.map +1 -1
  90. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js.map +1 -1
  91. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.d.ts.map +1 -1
  92. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +1 -1
  93. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js.map +1 -1
  94. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts.map +1 -1
  95. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +12 -11
  96. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js.map +1 -1
  97. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.d.ts.map +1 -1
  98. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.class.js.map +1 -1
  99. package/dist/components/agent-tools/tool-result-view/registry.d.ts +38 -1
  100. package/dist/components/agent-tools/tool-result-view/registry.d.ts.map +1 -1
  101. package/dist/components/agent-tools/tool-result-view/registry.js.map +1 -1
  102. package/dist/components/agent-tools/tool-result-view/tool-result-view.class.d.ts +16 -1
  103. package/dist/components/agent-tools/tool-result-view/tool-result-view.class.d.ts.map +1 -1
  104. package/dist/components/agent-tools/tool-result-view/tool-result-view.class.js +32 -1
  105. package/dist/components/agent-tools/tool-result-view/tool-result-view.class.js.map +1 -1
  106. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.d.ts.map +1 -1
  107. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.class.js.map +1 -1
  108. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts.map +1 -1
  109. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js.map +1 -1
  110. package/dist/components/agent-tools/trace-tree/trace-tree.class.d.ts.map +1 -1
  111. package/dist/components/agent-tools/trace-tree/trace-tree.class.js +26 -12
  112. package/dist/components/agent-tools/trace-tree/trace-tree.class.js.map +1 -1
  113. package/dist/components/charts/chart/box-plot.class.d.ts +4 -0
  114. package/dist/components/charts/chart/box-plot.class.d.ts.map +1 -1
  115. package/dist/components/charts/chart/box-plot.class.js +43 -11
  116. package/dist/components/charts/chart/box-plot.class.js.map +1 -1
  117. package/dist/components/charts/chart/chart-loader.d.ts +39 -0
  118. package/dist/components/charts/chart/chart-loader.d.ts.map +1 -1
  119. package/dist/components/charts/chart/chart-loader.js +53 -0
  120. package/dist/components/charts/chart/chart-loader.js.map +1 -1
  121. package/dist/components/charts/chart/chart.class.d.ts +113 -10
  122. package/dist/components/charts/chart/chart.class.d.ts.map +1 -1
  123. package/dist/components/charts/chart/chart.class.js +293 -23
  124. package/dist/components/charts/chart/chart.class.js.map +1 -1
  125. package/dist/components/charts/chart/histogram-bin.js +3 -3
  126. package/dist/components/charts/chart/histogram-bin.js.map +1 -1
  127. package/dist/components/charts/chart/lite-chart.class.d.ts +17 -5
  128. package/dist/components/charts/chart/lite-chart.class.d.ts.map +1 -1
  129. package/dist/components/charts/chart/lite-chart.class.js +72 -16
  130. package/dist/components/charts/chart/lite-chart.class.js.map +1 -1
  131. package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +4 -0
  132. package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts.map +1 -1
  133. package/dist/components/conversation/agent-workspace/agent-workspace.class.js +22 -4
  134. package/dist/components/conversation/agent-workspace/agent-workspace.class.js.map +1 -1
  135. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.d.ts +2 -7
  136. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.d.ts.map +1 -1
  137. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.js +29 -58
  138. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.js.map +1 -1
  139. package/dist/components/conversation/branch-picker/branch-picker.class.d.ts.map +1 -1
  140. package/dist/components/conversation/branch-picker/branch-picker.class.js.map +1 -1
  141. package/dist/components/conversation/chat-composer/chat-composer.class.d.ts.map +1 -1
  142. package/dist/components/conversation/chat-composer/chat-composer.class.js.map +1 -1
  143. package/dist/components/conversation/chat-message/chat-message.class.d.ts.map +1 -1
  144. package/dist/components/conversation/chat-message/chat-message.class.js.map +1 -1
  145. package/dist/components/conversation/chat-viewport/chat-viewport.class.d.ts.map +1 -1
  146. package/dist/components/conversation/chat-viewport/chat-viewport.class.js.map +1 -1
  147. package/dist/components/conversation/checkpoint/checkpoint.class.d.ts.map +1 -1
  148. package/dist/components/conversation/checkpoint/checkpoint.class.js.map +1 -1
  149. package/dist/components/conversation/code-block/code-block-core.class.d.ts +0 -1
  150. package/dist/components/conversation/code-block/code-block-core.class.d.ts.map +1 -1
  151. package/dist/components/conversation/code-block/code-block-core.class.js +18 -9
  152. package/dist/components/conversation/code-block/code-block-core.class.js.map +1 -1
  153. package/dist/components/conversation/code-block/code-block.class.d.ts.map +1 -1
  154. package/dist/components/conversation/code-block/code-block.class.js +3 -0
  155. package/dist/components/conversation/code-block/code-block.class.js.map +1 -1
  156. package/dist/components/conversation/conversation-item/conversation-item.class.d.ts +7 -0
  157. package/dist/components/conversation/conversation-item/conversation-item.class.d.ts.map +1 -1
  158. package/dist/components/conversation/conversation-item/conversation-item.class.js +8 -0
  159. package/dist/components/conversation/conversation-item/conversation-item.class.js.map +1 -1
  160. package/dist/components/conversation/conversation-item/conversation-item.styles.d.ts.map +1 -1
  161. package/dist/components/conversation/conversation-item/conversation-item.styles.js +12 -0
  162. package/dist/components/conversation/conversation-item/conversation-item.styles.js.map +1 -1
  163. package/dist/components/conversation/generation-status/generation-status.class.d.ts.map +1 -1
  164. package/dist/components/conversation/generation-status/generation-status.class.js.map +1 -1
  165. package/dist/components/conversation/handoff-divider/handoff-divider.class.d.ts.map +1 -1
  166. package/dist/components/conversation/handoff-divider/handoff-divider.class.js.map +1 -1
  167. package/dist/components/conversation/markdown/markdown-core.class.d.ts.map +1 -1
  168. package/dist/components/conversation/markdown/markdown-core.class.js +6 -2
  169. package/dist/components/conversation/markdown/markdown-core.class.js.map +1 -1
  170. package/dist/components/conversation/markdown/markdown-shared.d.ts.map +1 -1
  171. package/dist/components/conversation/markdown/markdown-shared.js +1 -0
  172. package/dist/components/conversation/markdown/markdown-shared.js.map +1 -1
  173. package/dist/components/conversation/markdown/markdown.class.d.ts.map +1 -1
  174. package/dist/components/conversation/markdown/markdown.class.js +3 -5
  175. package/dist/components/conversation/markdown/markdown.class.js.map +1 -1
  176. package/dist/components/conversation/message-actions/message-actions.class.d.ts.map +1 -1
  177. package/dist/components/conversation/message-actions/message-actions.class.js +5 -2
  178. package/dist/components/conversation/message-actions/message-actions.class.js.map +1 -1
  179. package/dist/components/conversation/message-feedback/message-feedback.class.d.ts.map +1 -1
  180. package/dist/components/conversation/message-feedback/message-feedback.class.js.map +1 -1
  181. package/dist/components/conversation/model-select/model-select.class.d.ts +4 -0
  182. package/dist/components/conversation/model-select/model-select.class.d.ts.map +1 -1
  183. package/dist/components/conversation/model-select/model-select.class.js +11 -10
  184. package/dist/components/conversation/model-select/model-select.class.js.map +1 -1
  185. package/dist/components/conversation/model-select/model-select.styles.d.ts.map +1 -1
  186. package/dist/components/conversation/model-select/model-select.styles.js +7 -3
  187. package/dist/components/conversation/model-select/model-select.styles.js.map +1 -1
  188. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.d.ts.map +1 -1
  189. package/dist/components/conversation/model-settings-panel/model-settings-panel.class.js.map +1 -1
  190. package/dist/components/conversation/push-to-talk/push-to-talk.class.d.ts.map +1 -1
  191. package/dist/components/conversation/push-to-talk/push-to-talk.class.js.map +1 -1
  192. package/dist/components/conversation/stream-status/stream-status.class.d.ts.map +1 -1
  193. package/dist/components/conversation/stream-status/stream-status.class.js.map +1 -1
  194. package/dist/components/conversation/streaming-text/streaming-text.class.d.ts.map +1 -1
  195. package/dist/components/conversation/streaming-text/streaming-text.class.js.map +1 -1
  196. package/dist/components/conversation/suggestion-chips/suggestion-chips.class.d.ts.map +1 -1
  197. package/dist/components/conversation/suggestion-chips/suggestion-chips.class.js.map +1 -1
  198. package/dist/components/conversation/thread-list/thread-list.class.d.ts +2 -0
  199. package/dist/components/conversation/thread-list/thread-list.class.d.ts.map +1 -1
  200. package/dist/components/conversation/thread-list/thread-list.class.js +18 -6
  201. package/dist/components/conversation/thread-list/thread-list.class.js.map +1 -1
  202. package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts.map +1 -1
  203. package/dist/components/conversation/transcript-feed/transcript-feed.class.js +2 -1
  204. package/dist/components/conversation/transcript-feed/transcript-feed.class.js.map +1 -1
  205. package/dist/components/conversation/typing-indicator/typing-indicator.class.d.ts +4 -2
  206. package/dist/components/conversation/typing-indicator/typing-indicator.class.d.ts.map +1 -1
  207. package/dist/components/conversation/typing-indicator/typing-indicator.class.js +4 -2
  208. package/dist/components/conversation/typing-indicator/typing-indicator.class.js.map +1 -1
  209. package/dist/components/conversation/typing-indicator/typing-indicator.styles.d.ts.map +1 -1
  210. package/dist/components/conversation/typing-indicator/typing-indicator.styles.js +35 -21
  211. package/dist/components/conversation/typing-indicator/typing-indicator.styles.js.map +1 -1
  212. package/dist/components/conversation/usage-badge/usage-badge.class.d.ts.map +1 -1
  213. package/dist/components/conversation/usage-badge/usage-badge.class.js.map +1 -1
  214. package/dist/components/conversation/voice-picker/voice-picker.class.d.ts.map +1 -1
  215. package/dist/components/conversation/voice-picker/voice-picker.class.js +7 -5
  216. package/dist/components/conversation/voice-picker/voice-picker.class.js.map +1 -1
  217. package/dist/components/conversation/widget-renderer/resolve.js +2 -2
  218. package/dist/components/conversation/widget-renderer/resolve.js.map +1 -1
  219. package/dist/components/conversation/widget-renderer/widget-renderer.class.d.ts.map +1 -1
  220. package/dist/components/conversation/widget-renderer/widget-renderer.class.js +3 -3
  221. package/dist/components/conversation/widget-renderer/widget-renderer.class.js.map +1 -1
  222. package/dist/components/data/calendar/calendar.class.d.ts.map +1 -1
  223. package/dist/components/data/calendar/calendar.class.js +1 -0
  224. package/dist/components/data/calendar/calendar.class.js.map +1 -1
  225. package/dist/components/data/context-meter/context-meter.class.d.ts.map +1 -1
  226. package/dist/components/data/context-meter/context-meter.class.js.map +1 -1
  227. package/dist/components/data/document-library/document-library.class.d.ts.map +1 -1
  228. package/dist/components/data/document-library/document-library.class.js.map +1 -1
  229. package/dist/components/data/env-list/env-list.class.d.ts.map +1 -1
  230. package/dist/components/data/env-list/env-list.class.js.map +1 -1
  231. package/dist/components/data/file-tree/file-tree.class.d.ts.map +1 -1
  232. package/dist/components/data/file-tree/file-tree.class.js.map +1 -1
  233. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts.map +1 -1
  234. package/dist/components/data/flow-canvas/flow-canvas.class.js +12 -12
  235. package/dist/components/data/flow-canvas/flow-canvas.class.js.map +1 -1
  236. package/dist/components/data/flow-controls/flow-controls.class.d.ts.map +1 -1
  237. package/dist/components/data/flow-controls/flow-controls.class.js.map +1 -1
  238. package/dist/components/data/flow-minimap/flow-minimap.class.d.ts.map +1 -1
  239. package/dist/components/data/flow-minimap/flow-minimap.class.js.map +1 -1
  240. package/dist/components/data/flow-node/flow-node.class.d.ts.map +1 -1
  241. package/dist/components/data/flow-node/flow-node.class.js.map +1 -1
  242. package/dist/components/data/flow-run-overlay/flow-run-overlay.class.d.ts.map +1 -1
  243. package/dist/components/data/flow-run-overlay/flow-run-overlay.class.js +1 -1
  244. package/dist/components/data/flow-run-overlay/flow-run-overlay.class.js.map +1 -1
  245. package/dist/components/data/gauge/gauge.class.d.ts.map +1 -1
  246. package/dist/components/data/gauge/gauge.class.js.map +1 -1
  247. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +0 -1
  248. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts.map +1 -1
  249. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +0 -2
  250. package/dist/components/data/graph-query-builder/graph-query-builder.class.js.map +1 -1
  251. package/dist/components/data/graph-query-builder/graph-query-builder.styles.d.ts.map +1 -1
  252. package/dist/components/data/graph-query-builder/graph-query-builder.styles.js +2 -0
  253. package/dist/components/data/graph-query-builder/graph-query-builder.styles.js.map +1 -1
  254. package/dist/components/data/heatmap/calendar-grid.d.ts.map +1 -1
  255. package/dist/components/data/heatmap/calendar-grid.js +8 -2
  256. package/dist/components/data/heatmap/calendar-grid.js.map +1 -1
  257. package/dist/components/data/heatmap/heatmap.class.d.ts +1 -6
  258. package/dist/components/data/heatmap/heatmap.class.d.ts.map +1 -1
  259. package/dist/components/data/heatmap/heatmap.class.js +122 -140
  260. package/dist/components/data/heatmap/heatmap.class.js.map +1 -1
  261. package/dist/components/data/pagination/pagination.class.d.ts.map +1 -1
  262. package/dist/components/data/pagination/pagination.class.js.map +1 -1
  263. package/dist/components/data/query-builder/query-builder.class.d.ts.map +1 -1
  264. package/dist/components/data/query-builder/query-builder.class.js.map +1 -1
  265. package/dist/components/data/sequence-strip/sequence-strip.class.d.ts.map +1 -1
  266. package/dist/components/data/sequence-strip/sequence-strip.class.js.map +1 -1
  267. package/dist/components/data/sparkline/sparkline.class.d.ts.map +1 -1
  268. package/dist/components/data/sparkline/sparkline.class.js +4 -2
  269. package/dist/components/data/sparkline/sparkline.class.js.map +1 -1
  270. package/dist/components/data/stat/stat.class.d.ts.map +1 -1
  271. package/dist/components/data/stat/stat.class.js.map +1 -1
  272. package/dist/components/data/table/table.class.d.ts +27 -0
  273. package/dist/components/data/table/table.class.d.ts.map +1 -1
  274. package/dist/components/data/table/table.class.js +102 -35
  275. package/dist/components/data/table/table.class.js.map +1 -1
  276. package/dist/components/data/table/table.styles.d.ts.map +1 -1
  277. package/dist/components/data/table/table.styles.js +17 -2
  278. package/dist/components/data/table/table.styles.js.map +1 -1
  279. package/dist/components/data/timeline/timeline-item.class.d.ts.map +1 -1
  280. package/dist/components/data/timeline/timeline-item.class.js +5 -2
  281. package/dist/components/data/timeline/timeline-item.class.js.map +1 -1
  282. package/dist/components/data/timeline/timeline-item.styles.d.ts.map +1 -1
  283. package/dist/components/data/timeline/timeline-item.styles.js +6 -0
  284. package/dist/components/data/timeline/timeline-item.styles.js.map +1 -1
  285. package/dist/components/data/timeline/timeline.class.d.ts.map +1 -1
  286. package/dist/components/data/timeline/timeline.class.js.map +1 -1
  287. package/dist/components/data/tree/tree-item.d.ts +24 -0
  288. package/dist/components/data/tree/tree-item.d.ts.map +1 -0
  289. package/dist/components/data/tree/tree-item.js +5 -0
  290. package/dist/components/data/tree/tree-item.js.map +1 -0
  291. package/dist/components/data/tree/tree-node.class.d.ts +1 -1
  292. package/dist/components/data/tree/tree-node.class.d.ts.map +1 -1
  293. package/dist/components/data/tree/tree-node.class.js.map +1 -1
  294. package/dist/components/data/tree/tree.class.d.ts +17 -23
  295. package/dist/components/data/tree/tree.class.d.ts.map +1 -1
  296. package/dist/components/data/tree/tree.class.js +5 -2
  297. package/dist/components/data/tree/tree.class.js.map +1 -1
  298. package/dist/components/data/word-cloud/word-cloud.class.d.ts +17 -0
  299. package/dist/components/data/word-cloud/word-cloud.class.d.ts.map +1 -1
  300. package/dist/components/data/word-cloud/word-cloud.class.js +43 -0
  301. package/dist/components/data/word-cloud/word-cloud.class.js.map +1 -1
  302. package/dist/components/data/word-cloud/word-cloud.styles.d.ts.map +1 -1
  303. package/dist/components/data/word-cloud/word-cloud.styles.js +18 -15
  304. package/dist/components/data/word-cloud/word-cloud.styles.js.map +1 -1
  305. package/dist/components/forms/button/button.class.d.ts +51 -7
  306. package/dist/components/forms/button/button.class.d.ts.map +1 -1
  307. package/dist/components/forms/button/button.class.js +102 -15
  308. package/dist/components/forms/button/button.class.js.map +1 -1
  309. package/dist/components/forms/button/button.styles.d.ts.map +1 -1
  310. package/dist/components/forms/button/button.styles.js +12 -4
  311. package/dist/components/forms/button/button.styles.js.map +1 -1
  312. package/dist/components/forms/checkbox/checkbox.class.d.ts +3 -0
  313. package/dist/components/forms/checkbox/checkbox.class.d.ts.map +1 -1
  314. package/dist/components/forms/checkbox/checkbox.class.js +19 -2
  315. package/dist/components/forms/checkbox/checkbox.class.js.map +1 -1
  316. package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts.map +1 -1
  317. package/dist/components/forms/checkbox-group/checkbox-group.class.js.map +1 -1
  318. package/dist/components/forms/code-editor/code-editor.class.d.ts.map +1 -1
  319. package/dist/components/forms/code-editor/code-editor.class.js.map +1 -1
  320. package/dist/components/forms/color-picker/color-picker.class.d.ts.map +1 -1
  321. package/dist/components/forms/color-picker/color-picker.class.js.map +1 -1
  322. package/dist/components/forms/combobox/combobox.class.d.ts +66 -10
  323. package/dist/components/forms/combobox/combobox.class.d.ts.map +1 -1
  324. package/dist/components/forms/combobox/combobox.class.js +76 -21
  325. package/dist/components/forms/combobox/combobox.class.js.map +1 -1
  326. package/dist/components/forms/combobox/combobox.styles.d.ts.map +1 -1
  327. package/dist/components/forms/combobox/combobox.styles.js +14 -5
  328. package/dist/components/forms/combobox/combobox.styles.js.map +1 -1
  329. package/dist/components/forms/combobox/option.class.d.ts.map +1 -1
  330. package/dist/components/forms/combobox/option.class.js.map +1 -1
  331. package/dist/components/forms/date-picker/date-input.class.d.ts.map +1 -1
  332. package/dist/components/forms/date-picker/date-input.class.js +6 -7
  333. package/dist/components/forms/date-picker/date-input.class.js.map +1 -1
  334. package/dist/components/forms/date-picker/date-input.styles.js +1 -1
  335. package/dist/components/forms/date-picker/date-picker.class.d.ts.map +1 -1
  336. package/dist/components/forms/date-picker/date-picker.class.js.map +1 -1
  337. package/dist/components/forms/emoji-picker/emoji-data-loader.d.ts +1 -1
  338. package/dist/components/forms/emoji-picker/emoji-data-loader.d.ts.map +1 -1
  339. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +2 -14
  340. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts.map +1 -1
  341. package/dist/components/forms/emoji-picker/emoji-picker.class.js +3 -3
  342. package/dist/components/forms/emoji-picker/emoji-picker.class.js.map +1 -1
  343. package/dist/components/forms/emoji-picker/emoji-picker.styles.d.ts.map +1 -1
  344. package/dist/components/forms/emoji-picker/emoji-picker.styles.js +4 -5
  345. package/dist/components/forms/emoji-picker/emoji-picker.styles.js.map +1 -1
  346. package/dist/components/forms/emoji-picker/emoji-types.d.ts +14 -0
  347. package/dist/components/forms/emoji-picker/emoji-types.d.ts.map +1 -0
  348. package/dist/components/forms/emoji-picker/emoji-types.js +5 -0
  349. package/dist/components/forms/emoji-picker/emoji-types.js.map +1 -0
  350. package/dist/components/forms/icon-button/icon-button.class.d.ts +11 -3
  351. package/dist/components/forms/icon-button/icon-button.class.d.ts.map +1 -1
  352. package/dist/components/forms/icon-button/icon-button.class.js +12 -4
  353. package/dist/components/forms/icon-button/icon-button.class.js.map +1 -1
  354. package/dist/components/forms/icon-button/icon-button.styles.js +3 -3
  355. package/dist/components/forms/input/input.class.d.ts +30 -1
  356. package/dist/components/forms/input/input.class.d.ts.map +1 -1
  357. package/dist/components/forms/input/input.class.js +56 -4
  358. package/dist/components/forms/input/input.class.js.map +1 -1
  359. package/dist/components/forms/input/input.styles.d.ts.map +1 -1
  360. package/dist/components/forms/input/input.styles.js +7 -2
  361. package/dist/components/forms/input/input.styles.js.map +1 -1
  362. package/dist/components/forms/input/number-input.class.d.ts.map +1 -1
  363. package/dist/components/forms/input/number-input.class.js.map +1 -1
  364. package/dist/components/forms/input/time-input.class.d.ts.map +1 -1
  365. package/dist/components/forms/input/time-input.class.js.map +1 -1
  366. package/dist/components/forms/locale-picker/locale-picker.class.d.ts +11 -3
  367. package/dist/components/forms/locale-picker/locale-picker.class.d.ts.map +1 -1
  368. package/dist/components/forms/locale-picker/locale-picker.class.js +14 -11
  369. package/dist/components/forms/locale-picker/locale-picker.class.js.map +1 -1
  370. package/dist/components/forms/phone-input/phone-input.class.d.ts.map +1 -1
  371. package/dist/components/forms/phone-input/phone-input.class.js.map +1 -1
  372. package/dist/components/forms/radio/radio-group.class.d.ts.map +1 -1
  373. package/dist/components/forms/radio/radio-group.class.js +1 -0
  374. package/dist/components/forms/radio/radio-group.class.js.map +1 -1
  375. package/dist/components/forms/radio/radio.class.d.ts.map +1 -1
  376. package/dist/components/forms/radio/radio.class.js.map +1 -1
  377. package/dist/components/forms/rubric-form/rubric-form.class.d.ts +0 -1
  378. package/dist/components/forms/rubric-form/rubric-form.class.d.ts.map +1 -1
  379. package/dist/components/forms/rubric-form/rubric-form.class.js +0 -2
  380. package/dist/components/forms/rubric-form/rubric-form.class.js.map +1 -1
  381. package/dist/components/forms/select/select.class.d.ts +26 -4
  382. package/dist/components/forms/select/select.class.d.ts.map +1 -1
  383. package/dist/components/forms/select/select.class.js +40 -16
  384. package/dist/components/forms/select/select.class.js.map +1 -1
  385. package/dist/components/forms/select/select.styles.d.ts.map +1 -1
  386. package/dist/components/forms/select/select.styles.js +15 -5
  387. package/dist/components/forms/select/select.styles.js.map +1 -1
  388. package/dist/components/forms/slider/slider.class.d.ts.map +1 -1
  389. package/dist/components/forms/slider/slider.class.js.map +1 -1
  390. package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts +16 -0
  391. package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts.map +1 -1
  392. package/dist/components/forms/swatch-picker/swatch-picker.class.js +22 -4
  393. package/dist/components/forms/swatch-picker/swatch-picker.class.js.map +1 -1
  394. package/dist/components/forms/swatch-picker/swatch-picker.styles.d.ts.map +1 -1
  395. package/dist/components/forms/swatch-picker/swatch-picker.styles.js +31 -4
  396. package/dist/components/forms/swatch-picker/swatch-picker.styles.js.map +1 -1
  397. package/dist/components/forms/switch/switch.class.d.ts.map +1 -1
  398. package/dist/components/forms/switch/switch.class.js.map +1 -1
  399. package/dist/components/forms/textarea/textarea.class.d.ts +30 -0
  400. package/dist/components/forms/textarea/textarea.class.d.ts.map +1 -1
  401. package/dist/components/forms/textarea/textarea.class.js +54 -0
  402. package/dist/components/forms/textarea/textarea.class.js.map +1 -1
  403. package/dist/components/forms/time-range/time-range.class.d.ts +0 -1
  404. package/dist/components/forms/time-range/time-range.class.d.ts.map +1 -1
  405. package/dist/components/forms/time-range/time-range.class.js +1 -1
  406. package/dist/components/forms/time-range/time-range.class.js.map +1 -1
  407. package/dist/components/forms/token-input/token-input.class.d.ts +3 -1
  408. package/dist/components/forms/token-input/token-input.class.d.ts.map +1 -1
  409. package/dist/components/forms/token-input/token-input.class.js +8 -4
  410. package/dist/components/forms/token-input/token-input.class.js.map +1 -1
  411. package/dist/components/forms/token-input/token-input.styles.d.ts.map +1 -1
  412. package/dist/components/forms/token-input/token-input.styles.js +6 -1
  413. package/dist/components/forms/token-input/token-input.styles.js.map +1 -1
  414. package/dist/components/layout/app-rail/app-rail-item.class.d.ts.map +1 -1
  415. package/dist/components/layout/app-rail/app-rail-item.class.js.map +1 -1
  416. package/dist/components/layout/app-rail/app-rail.class.d.ts +21 -6
  417. package/dist/components/layout/app-rail/app-rail.class.d.ts.map +1 -1
  418. package/dist/components/layout/app-rail/app-rail.class.js +56 -10
  419. package/dist/components/layout/app-rail/app-rail.class.js.map +1 -1
  420. package/dist/components/layout/app-rail/app-rail.styles.d.ts.map +1 -1
  421. package/dist/components/layout/app-rail/app-rail.styles.js +21 -2
  422. package/dist/components/layout/app-rail/app-rail.styles.js.map +1 -1
  423. package/dist/components/layout/breadcrumb/breadcrumb-item.class.d.ts.map +1 -1
  424. package/dist/components/layout/breadcrumb/breadcrumb-item.class.js.map +1 -1
  425. package/dist/components/layout/breadcrumb/breadcrumb.class.d.ts.map +1 -1
  426. package/dist/components/layout/breadcrumb/breadcrumb.class.js.map +1 -1
  427. package/dist/components/layout/button-group/button-group.class.d.ts.map +1 -1
  428. package/dist/components/layout/button-group/button-group.class.js.map +1 -1
  429. package/dist/components/layout/card/card.class.d.ts +6 -0
  430. package/dist/components/layout/card/card.class.d.ts.map +1 -1
  431. package/dist/components/layout/card/card.class.js +9 -1
  432. package/dist/components/layout/card/card.class.js.map +1 -1
  433. package/dist/components/layout/carousel/carousel-item.class.d.ts.map +1 -1
  434. package/dist/components/layout/carousel/carousel-item.class.js.map +1 -1
  435. package/dist/components/layout/carousel/carousel.class.d.ts.map +1 -1
  436. package/dist/components/layout/carousel/carousel.class.js.map +1 -1
  437. package/dist/components/layout/command-palette/command-palette.class.d.ts.map +1 -1
  438. package/dist/components/layout/command-palette/command-palette.class.js +6 -3
  439. package/dist/components/layout/command-palette/command-palette.class.js.map +1 -1
  440. package/dist/components/layout/control-group/control-group.class.d.ts.map +1 -1
  441. package/dist/components/layout/control-group/control-group.class.js.map +1 -1
  442. package/dist/components/layout/dashboard-grid/dashboard-grid.class.d.ts.map +1 -1
  443. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js +1 -1
  444. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js.map +1 -1
  445. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.d.ts.map +1 -1
  446. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js +2 -0
  447. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js.map +1 -1
  448. package/dist/components/layout/details/accordion.class.d.ts.map +1 -1
  449. package/dist/components/layout/details/accordion.class.js.map +1 -1
  450. package/dist/components/layout/details/details.class.d.ts.map +1 -1
  451. package/dist/components/layout/details/details.class.js.map +1 -1
  452. package/dist/components/layout/dock-panel/dock-panel.class.d.ts.map +1 -1
  453. package/dist/components/layout/dock-panel/dock-panel.class.js +1 -1
  454. package/dist/components/layout/dock-panel/dock-panel.class.js.map +1 -1
  455. package/dist/components/layout/drilldown-panel/drilldown-panel.class.d.ts.map +1 -1
  456. package/dist/components/layout/drilldown-panel/drilldown-panel.class.js +1 -1
  457. package/dist/components/layout/drilldown-panel/drilldown-panel.class.js.map +1 -1
  458. package/dist/components/layout/filter-bar/filter-bar.class.d.ts.map +1 -1
  459. package/dist/components/layout/filter-bar/filter-bar.class.js +1 -1
  460. package/dist/components/layout/filter-bar/filter-bar.class.js.map +1 -1
  461. package/dist/components/layout/menu/menu-item.class.d.ts.map +1 -1
  462. package/dist/components/layout/menu/menu-item.class.js.map +1 -1
  463. package/dist/components/layout/menu/menu.class.d.ts.map +1 -1
  464. package/dist/components/layout/menu/menu.class.js +16 -4
  465. package/dist/components/layout/menu/menu.class.js.map +1 -1
  466. package/dist/components/layout/reorder-list/reorder-item.class.d.ts +9 -2
  467. package/dist/components/layout/reorder-list/reorder-item.class.d.ts.map +1 -1
  468. package/dist/components/layout/reorder-list/reorder-item.class.js +12 -2
  469. package/dist/components/layout/reorder-list/reorder-item.class.js.map +1 -1
  470. package/dist/components/layout/reorder-list/reorder-list.class.d.ts +30 -4
  471. package/dist/components/layout/reorder-list/reorder-list.class.d.ts.map +1 -1
  472. package/dist/components/layout/reorder-list/reorder-list.class.js +75 -16
  473. package/dist/components/layout/reorder-list/reorder-list.class.js.map +1 -1
  474. package/dist/components/layout/responsive-panel/responsive-panel.class.d.ts.map +1 -1
  475. package/dist/components/layout/responsive-panel/responsive-panel.class.js.map +1 -1
  476. package/dist/components/layout/scroller/scroller.class.d.ts.map +1 -1
  477. package/dist/components/layout/scroller/scroller.class.js.map +1 -1
  478. package/dist/components/layout/segmented/segmented.class.d.ts +10 -1
  479. package/dist/components/layout/segmented/segmented.class.d.ts.map +1 -1
  480. package/dist/components/layout/segmented/segmented.class.js +29 -2
  481. package/dist/components/layout/segmented/segmented.class.js.map +1 -1
  482. package/dist/components/layout/split/split.class.d.ts +14 -14
  483. package/dist/components/layout/split/split.class.d.ts.map +1 -1
  484. package/dist/components/layout/split/split.class.js +90 -60
  485. package/dist/components/layout/split/split.class.js.map +1 -1
  486. package/dist/components/layout/stepper/stepper.class.d.ts +0 -7
  487. package/dist/components/layout/stepper/stepper.class.d.ts.map +1 -1
  488. package/dist/components/layout/stepper/stepper.class.js +1 -10
  489. package/dist/components/layout/stepper/stepper.class.js.map +1 -1
  490. package/dist/components/layout/tabs/tabs.class.d.ts.map +1 -1
  491. package/dist/components/layout/tabs/tabs.class.js +2 -2
  492. package/dist/components/layout/tabs/tabs.class.js.map +1 -1
  493. package/dist/components/layout/virtual-list/virtual-list.class.d.ts.map +1 -1
  494. package/dist/components/layout/virtual-list/virtual-list.class.js +7 -4
  495. package/dist/components/layout/virtual-list/virtual-list.class.js.map +1 -1
  496. package/dist/components/layout/widget/widget.class.d.ts +10 -0
  497. package/dist/components/layout/widget/widget.class.d.ts.map +1 -1
  498. package/dist/components/layout/widget/widget.class.js +29 -1
  499. package/dist/components/layout/widget/widget.class.js.map +1 -1
  500. package/dist/components/media/animated-image/animated-image.class.d.ts.map +1 -1
  501. package/dist/components/media/animated-image/animated-image.class.js.map +1 -1
  502. package/dist/components/media/animation/animation.class.d.ts.map +1 -1
  503. package/dist/components/media/animation/animation.class.js +4 -1
  504. package/dist/components/media/animation/animation.class.js.map +1 -1
  505. package/dist/components/media/attachment-chip/attachment-chip.class.d.ts.map +1 -1
  506. package/dist/components/media/attachment-chip/attachment-chip.class.js +1 -1
  507. package/dist/components/media/attachment-chip/attachment-chip.class.js.map +1 -1
  508. package/dist/components/media/attachment-chip/attachment-chip.styles.d.ts.map +1 -1
  509. package/dist/components/media/attachment-chip/attachment-chip.styles.js +7 -8
  510. package/dist/components/media/attachment-chip/attachment-chip.styles.js.map +1 -1
  511. package/dist/components/media/attachment-trigger/attachment-trigger.class.d.ts.map +1 -1
  512. package/dist/components/media/attachment-trigger/attachment-trigger.class.js +5 -2
  513. package/dist/components/media/attachment-trigger/attachment-trigger.class.js.map +1 -1
  514. package/dist/components/media/av-player/av-player.class.d.ts.map +1 -1
  515. package/dist/components/media/av-player/av-player.class.js.map +1 -1
  516. package/dist/components/media/avatar/avatar.class.d.ts.map +1 -1
  517. package/dist/components/media/avatar/avatar.class.js.map +1 -1
  518. package/dist/components/media/avatar-group/avatar-group.class.d.ts.map +1 -1
  519. package/dist/components/media/avatar-group/avatar-group.class.js.map +1 -1
  520. package/dist/components/media/file-icon/file-icon.class.d.ts.map +1 -1
  521. package/dist/components/media/file-icon/file-icon.class.js.map +1 -1
  522. package/dist/components/media/file-icon/file-type-metadata.js +1 -1
  523. package/dist/components/media/file-icon/file-type-metadata.js.map +1 -1
  524. package/dist/components/media/file-input/file-input.class.d.ts +16 -1
  525. package/dist/components/media/file-input/file-input.class.d.ts.map +1 -1
  526. package/dist/components/media/file-input/file-input.class.js +42 -2
  527. package/dist/components/media/file-input/file-input.class.js.map +1 -1
  528. package/dist/components/media/file-input/file-input.styles.d.ts.map +1 -1
  529. package/dist/components/media/file-input/file-input.styles.js +12 -0
  530. package/dist/components/media/file-input/file-input.styles.js.map +1 -1
  531. package/dist/components/media/flag/flag.class.d.ts.map +1 -1
  532. package/dist/components/media/flag/flag.class.js.map +1 -1
  533. package/dist/components/media/flag/language-map.js +1 -1
  534. package/dist/components/media/flag/language-map.js.map +1 -1
  535. package/dist/components/media/image-comparer/image-comparer.class.d.ts.map +1 -1
  536. package/dist/components/media/image-comparer/image-comparer.class.js.map +1 -1
  537. package/dist/components/media/image-viewer/image-viewer.class.d.ts.map +1 -1
  538. package/dist/components/media/image-viewer/image-viewer.class.js.map +1 -1
  539. package/dist/components/media/lightbox/lightbox.class.d.ts.map +1 -1
  540. package/dist/components/media/lightbox/lightbox.class.js.map +1 -1
  541. package/dist/components/media/map/map.class.d.ts.map +1 -1
  542. package/dist/components/media/map/map.class.js.map +1 -1
  543. package/dist/components/media/media-card/media-card.class.d.ts +6 -2
  544. package/dist/components/media/media-card/media-card.class.d.ts.map +1 -1
  545. package/dist/components/media/media-card/media-card.class.js +7 -3
  546. package/dist/components/media/media-card/media-card.class.js.map +1 -1
  547. package/dist/components/media/playback/playback.class.d.ts.map +1 -1
  548. package/dist/components/media/playback/playback.class.js.map +1 -1
  549. package/dist/components/media/qr-code/qr-code.class.d.ts +1 -6
  550. package/dist/components/media/qr-code/qr-code.class.d.ts.map +1 -1
  551. package/dist/components/media/qr-code/qr-code.class.js +31 -70
  552. package/dist/components/media/qr-code/qr-code.class.js.map +1 -1
  553. package/dist/components/media/zoomable-frame/zoomable-frame.class.d.ts.map +1 -1
  554. package/dist/components/media/zoomable-frame/zoomable-frame.class.js +1 -1
  555. package/dist/components/media/zoomable-frame/zoomable-frame.class.js.map +1 -1
  556. package/dist/components/overlays/badge/badge.class.d.ts +2 -0
  557. package/dist/components/overlays/badge/badge.class.d.ts.map +1 -1
  558. package/dist/components/overlays/badge/badge.class.js +2 -0
  559. package/dist/components/overlays/badge/badge.class.js.map +1 -1
  560. package/dist/components/overlays/badge/badge.styles.d.ts.map +1 -1
  561. package/dist/components/overlays/badge/badge.styles.js +4 -1
  562. package/dist/components/overlays/badge/badge.styles.js.map +1 -1
  563. package/dist/components/overlays/callout/callout.class.d.ts.map +1 -1
  564. package/dist/components/overlays/callout/callout.class.js.map +1 -1
  565. package/dist/components/overlays/chip/chip-group.class.d.ts.map +1 -1
  566. package/dist/components/overlays/chip/chip-group.class.js.map +1 -1
  567. package/dist/components/overlays/chip/chip.class.d.ts +2 -0
  568. package/dist/components/overlays/chip/chip.class.d.ts.map +1 -1
  569. package/dist/components/overlays/chip/chip.class.js +2 -0
  570. package/dist/components/overlays/chip/chip.class.js.map +1 -1
  571. package/dist/components/overlays/chip/chip.styles.d.ts.map +1 -1
  572. package/dist/components/overlays/chip/chip.styles.js +7 -2
  573. package/dist/components/overlays/chip/chip.styles.js.map +1 -1
  574. package/dist/components/overlays/dialog/dialog.class.d.ts.map +1 -1
  575. package/dist/components/overlays/dialog/dialog.class.js.map +1 -1
  576. package/dist/components/overlays/drawer/drawer.class.d.ts.map +1 -1
  577. package/dist/components/overlays/drawer/drawer.class.js.map +1 -1
  578. package/dist/components/overlays/empty/empty.class.d.ts +3 -0
  579. package/dist/components/overlays/empty/empty.class.d.ts.map +1 -1
  580. package/dist/components/overlays/empty/empty.class.js +3 -0
  581. package/dist/components/overlays/empty/empty.class.js.map +1 -1
  582. package/dist/components/overlays/empty/empty.styles.d.ts.map +1 -1
  583. package/dist/components/overlays/empty/empty.styles.js +6 -0
  584. package/dist/components/overlays/empty/empty.styles.js.map +1 -1
  585. package/dist/components/overlays/kbd/kbd.class.d.ts.map +1 -1
  586. package/dist/components/overlays/kbd/kbd.class.js.map +1 -1
  587. package/dist/components/overlays/overlay/popover.class.d.ts +9 -0
  588. package/dist/components/overlays/overlay/popover.class.d.ts.map +1 -1
  589. package/dist/components/overlays/overlay/popover.class.js +13 -0
  590. package/dist/components/overlays/overlay/popover.class.js.map +1 -1
  591. package/dist/components/overlays/overlay/tooltip.class.d.ts.map +1 -1
  592. package/dist/components/overlays/overlay/tooltip.class.js.map +1 -1
  593. package/dist/components/overlays/progress/progress-bar.class.d.ts.map +1 -1
  594. package/dist/components/overlays/progress/progress-bar.class.js.map +1 -1
  595. package/dist/components/overlays/progress/progress-ring.class.d.ts.map +1 -1
  596. package/dist/components/overlays/progress/progress-ring.class.js.map +1 -1
  597. package/dist/components/overlays/rating/rating.class.d.ts.map +1 -1
  598. package/dist/components/overlays/rating/rating.class.js +1 -1
  599. package/dist/components/overlays/rating/rating.class.js.map +1 -1
  600. package/dist/components/overlays/skeleton/skeleton.class.d.ts.map +1 -1
  601. package/dist/components/overlays/skeleton/skeleton.class.js.map +1 -1
  602. package/dist/components/overlays/spinner/spinner.class.d.ts.map +1 -1
  603. package/dist/components/overlays/spinner/spinner.class.js.map +1 -1
  604. package/dist/components/overlays/toast/toast-item.class.d.ts.map +1 -1
  605. package/dist/components/overlays/toast/toast-item.class.js.map +1 -1
  606. package/dist/components/overlays/toast/toast.class.d.ts.map +1 -1
  607. package/dist/components/overlays/toast/toast.class.js.map +1 -1
  608. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.d.ts +1 -0
  609. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.d.ts.map +1 -1
  610. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.js +11 -5
  611. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.js.map +1 -1
  612. package/dist/components/retrieval/citation-badge/citation-badge.class.d.ts.map +1 -1
  613. package/dist/components/retrieval/citation-badge/citation-badge.class.js.map +1 -1
  614. package/dist/components/retrieval/community-card/community-card.class.d.ts.map +1 -1
  615. package/dist/components/retrieval/community-card/community-card.class.js.map +1 -1
  616. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts +54 -0
  617. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.d.ts.map +1 -0
  618. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js +147 -0
  619. package/dist/components/retrieval/embedding-explorer/embedding-explorer.class.js.map +1 -0
  620. package/dist/components/retrieval/embedding-explorer/embedding-explorer.d.ts +2 -0
  621. package/dist/components/retrieval/embedding-explorer/embedding-explorer.d.ts.map +1 -0
  622. package/dist/components/retrieval/embedding-explorer/embedding-explorer.js +5 -0
  623. package/dist/components/retrieval/embedding-explorer/embedding-explorer.js.map +1 -0
  624. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.d.ts +2 -0
  625. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.d.ts.map +1 -0
  626. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +51 -0
  627. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js.map +1 -0
  628. package/dist/components/retrieval/entity-card/entity-card.class.d.ts.map +1 -1
  629. package/dist/components/retrieval/entity-card/entity-card.class.js.map +1 -1
  630. package/dist/components/retrieval/entity-chip/entity-chip.class.d.ts.map +1 -1
  631. package/dist/components/retrieval/entity-chip/entity-chip.class.js.map +1 -1
  632. package/dist/components/retrieval/entity-dossier/entity-dossier.class.d.ts.map +1 -1
  633. package/dist/components/retrieval/entity-dossier/entity-dossier.class.js.map +1 -1
  634. package/dist/components/retrieval/graph/graph-loader.d.ts +5 -5
  635. package/dist/components/retrieval/graph/graph-loader.d.ts.map +1 -1
  636. package/dist/components/retrieval/graph/graph-loader.js.map +1 -1
  637. package/dist/components/retrieval/graph/graph.class.d.ts +1 -0
  638. package/dist/components/retrieval/graph/graph.class.d.ts.map +1 -1
  639. package/dist/components/retrieval/graph/graph.class.js +30 -9
  640. package/dist/components/retrieval/graph/graph.class.js.map +1 -1
  641. package/dist/components/retrieval/graph-legend/graph-legend.class.d.ts.map +1 -1
  642. package/dist/components/retrieval/graph-legend/graph-legend.class.js.map +1 -1
  643. package/dist/components/retrieval/grounding-summary/grounding-summary.class.d.ts.map +1 -1
  644. package/dist/components/retrieval/grounding-summary/grounding-summary.class.js.map +1 -1
  645. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts.map +1 -1
  646. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js.map +1 -1
  647. package/dist/components/retrieval/knowledge-base/knowledge-base.class.d.ts.map +1 -1
  648. package/dist/components/retrieval/knowledge-base/knowledge-base.class.js.map +1 -1
  649. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts +73 -0
  650. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts.map +1 -0
  651. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js +109 -0
  652. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.js.map +1 -0
  653. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.d.ts +2 -0
  654. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.d.ts.map +1 -0
  655. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.js +5 -0
  656. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.js.map +1 -0
  657. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.d.ts +2 -0
  658. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.d.ts.map +1 -0
  659. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js +56 -0
  660. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js.map +1 -0
  661. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +1 -0
  662. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts.map +1 -1
  663. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +20 -5
  664. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js.map +1 -1
  665. package/dist/components/retrieval/memory-panel/memory-panel.class.d.ts.map +1 -1
  666. package/dist/components/retrieval/memory-panel/memory-panel.class.js.map +1 -1
  667. package/dist/components/retrieval/mind-map/mind-map.class.d.ts.map +1 -1
  668. package/dist/components/retrieval/mind-map/mind-map.class.js.map +1 -1
  669. package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts.map +1 -1
  670. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js.map +1 -1
  671. package/dist/components/retrieval/node-palette/node-palette.class.d.ts.map +1 -1
  672. package/dist/components/retrieval/node-palette/node-palette.class.js.map +1 -1
  673. package/dist/components/retrieval/path-strip/path-strip.class.d.ts.map +1 -1
  674. package/dist/components/retrieval/path-strip/path-strip.class.js.map +1 -1
  675. package/dist/components/retrieval/provenance-panel/provenance-panel.class.d.ts.map +1 -1
  676. package/dist/components/retrieval/provenance-panel/provenance-panel.class.js.map +1 -1
  677. package/dist/components/retrieval/rag-answer/rag-answer.class.d.ts +58 -0
  678. package/dist/components/retrieval/rag-answer/rag-answer.class.d.ts.map +1 -0
  679. package/dist/components/retrieval/rag-answer/rag-answer.class.js +110 -0
  680. package/dist/components/retrieval/rag-answer/rag-answer.class.js.map +1 -0
  681. package/dist/components/retrieval/rag-answer/rag-answer.d.ts +2 -0
  682. package/dist/components/retrieval/rag-answer/rag-answer.d.ts.map +1 -0
  683. package/dist/components/retrieval/rag-answer/rag-answer.js +5 -0
  684. package/dist/components/retrieval/rag-answer/rag-answer.js.map +1 -0
  685. package/dist/components/retrieval/rag-answer/rag-answer.styles.d.ts +2 -0
  686. package/dist/components/retrieval/rag-answer/rag-answer.styles.d.ts.map +1 -0
  687. package/dist/components/retrieval/rag-answer/rag-answer.styles.js +13 -0
  688. package/dist/components/retrieval/rag-answer/rag-answer.styles.js.map +1 -0
  689. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts.map +1 -1
  690. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +20 -5
  691. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js.map +1 -1
  692. package/dist/components/retrieval/retrieval-search/retrieval-search.class.d.ts.map +1 -1
  693. package/dist/components/retrieval/retrieval-search/retrieval-search.class.js.map +1 -1
  694. package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.d.ts.map +1 -1
  695. package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js.map +1 -1
  696. package/dist/components/retrieval/source-card/source-card.class.d.ts.map +1 -1
  697. package/dist/components/retrieval/source-card/source-card.class.js.map +1 -1
  698. package/dist/components/retrieval/source-list/source-list.class.d.ts.map +1 -1
  699. package/dist/components/retrieval/source-list/source-list.class.js.map +1 -1
  700. package/dist/components/retrieval/source-picker/source-picker.class.d.ts.map +1 -1
  701. package/dist/components/retrieval/source-picker/source-picker.class.js.map +1 -1
  702. package/dist/components/utility/copy-button/copy-button.class.d.ts.map +1 -1
  703. package/dist/components/utility/copy-button/copy-button.class.js.map +1 -1
  704. package/dist/components/utility/diff-view/diff-view.class.d.ts +4 -2
  705. package/dist/components/utility/diff-view/diff-view.class.d.ts.map +1 -1
  706. package/dist/components/utility/diff-view/diff-view.class.js +16 -6
  707. package/dist/components/utility/diff-view/diff-view.class.js.map +1 -1
  708. package/dist/components/utility/divider/divider.class.d.ts.map +1 -1
  709. package/dist/components/utility/divider/divider.class.js.map +1 -1
  710. package/dist/components/utility/export-button/export-button.class.d.ts.map +1 -1
  711. package/dist/components/utility/export-button/export-button.class.js.map +1 -1
  712. package/dist/components/utility/format/format-bytes.class.d.ts.map +1 -1
  713. package/dist/components/utility/format/format-bytes.class.js.map +1 -1
  714. package/dist/components/utility/format/format-date.class.d.ts.map +1 -1
  715. package/dist/components/utility/format/format-date.class.js.map +1 -1
  716. package/dist/components/utility/format/format-number.class.d.ts.map +1 -1
  717. package/dist/components/utility/format/format-number.class.js.map +1 -1
  718. package/dist/components/utility/format/relative-time.class.d.ts.map +1 -1
  719. package/dist/components/utility/format/relative-time.class.js.map +1 -1
  720. package/dist/components/utility/icon/icon.class.d.ts.map +1 -1
  721. package/dist/components/utility/icon/icon.class.js +5 -0
  722. package/dist/components/utility/icon/icon.class.js.map +1 -1
  723. package/dist/components/utility/intersection-observer/intersection-observer.class.d.ts.map +1 -1
  724. package/dist/components/utility/intersection-observer/intersection-observer.class.js.map +1 -1
  725. package/dist/components/utility/json-viewer/json-viewer.class.d.ts.map +1 -1
  726. package/dist/components/utility/json-viewer/json-viewer.class.js.map +1 -1
  727. package/dist/components/utility/known-date/known-date.class.d.ts.map +1 -1
  728. package/dist/components/utility/known-date/known-date.class.js +2 -2
  729. package/dist/components/utility/known-date/known-date.class.js.map +1 -1
  730. package/dist/components/utility/live-region/live-region.class.d.ts.map +1 -1
  731. package/dist/components/utility/live-region/live-region.class.js.map +1 -1
  732. package/dist/components/utility/mention-popover/mention-popover.class.d.ts.map +1 -1
  733. package/dist/components/utility/mention-popover/mention-popover.class.js +2 -2
  734. package/dist/components/utility/mention-popover/mention-popover.class.js.map +1 -1
  735. package/dist/components/utility/mutation-observer/mutation-observer.class.d.ts.map +1 -1
  736. package/dist/components/utility/mutation-observer/mutation-observer.class.js.map +1 -1
  737. package/dist/components/utility/poll-status/poll-status.class.d.ts.map +1 -1
  738. package/dist/components/utility/poll-status/poll-status.class.js.map +1 -1
  739. package/dist/components/utility/random-content/random-content.class.d.ts.map +1 -1
  740. package/dist/components/utility/random-content/random-content.class.js +3 -2
  741. package/dist/components/utility/random-content/random-content.class.js.map +1 -1
  742. package/dist/components/utility/resize-observer/resize-observer.class.d.ts.map +1 -1
  743. package/dist/components/utility/resize-observer/resize-observer.class.js.map +1 -1
  744. package/dist/components/utility/tour/tour.class.d.ts.map +1 -1
  745. package/dist/components/utility/tour/tour.class.js.map +1 -1
  746. package/dist/components/viewers/archive-viewer/archive-viewer.class.d.ts +16 -2
  747. package/dist/components/viewers/archive-viewer/archive-viewer.class.d.ts.map +1 -1
  748. package/dist/components/viewers/archive-viewer/archive-viewer.class.js +14 -4
  749. package/dist/components/viewers/archive-viewer/archive-viewer.class.js.map +1 -1
  750. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.d.ts +14 -2
  751. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.d.ts.map +1 -1
  752. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.js +10 -2
  753. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.js.map +1 -1
  754. package/dist/components/viewers/contact-viewer/contact-viewer.class.d.ts +14 -2
  755. package/dist/components/viewers/contact-viewer/contact-viewer.class.d.ts.map +1 -1
  756. package/dist/components/viewers/contact-viewer/contact-viewer.class.js +10 -2
  757. package/dist/components/viewers/contact-viewer/contact-viewer.class.js.map +1 -1
  758. package/dist/components/viewers/contact-viewer/vcard.d.ts.map +1 -1
  759. package/dist/components/viewers/contact-viewer/vcard.js +11 -9
  760. package/dist/components/viewers/contact-viewer/vcard.js.map +1 -1
  761. package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts.map +1 -1
  762. package/dist/components/viewers/csv-viewer/csv-viewer.class.js.map +1 -1
  763. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts.map +1 -1
  764. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js.map +1 -1
  765. package/dist/components/viewers/document-compare/document-compare.class.d.ts.map +1 -1
  766. package/dist/components/viewers/document-compare/document-compare.class.js.map +1 -1
  767. package/dist/components/viewers/document-preview/document-preview.class.d.ts.map +1 -1
  768. package/dist/components/viewers/document-preview/document-preview.class.js +2 -2
  769. package/dist/components/viewers/document-preview/document-preview.class.js.map +1 -1
  770. package/dist/components/viewers/document-viewer/document-viewer.class.d.ts.map +1 -1
  771. package/dist/components/viewers/document-viewer/document-viewer.class.js +2 -2
  772. package/dist/components/viewers/document-viewer/document-viewer.class.js.map +1 -1
  773. package/dist/components/viewers/docx-viewer/docx-viewer.class.d.ts.map +1 -1
  774. package/dist/components/viewers/docx-viewer/docx-viewer.class.js +2 -2
  775. package/dist/components/viewers/docx-viewer/docx-viewer.class.js.map +1 -1
  776. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.d.ts.map +1 -1
  777. package/dist/components/viewers/ebook-viewer/ebook-viewer.class.js.map +1 -1
  778. package/dist/components/viewers/email-viewer/email-viewer.class.d.ts +14 -2
  779. package/dist/components/viewers/email-viewer/email-viewer.class.d.ts.map +1 -1
  780. package/dist/components/viewers/email-viewer/email-viewer.class.js +10 -2
  781. package/dist/components/viewers/email-viewer/email-viewer.class.js.map +1 -1
  782. package/dist/components/viewers/geojson-view/geojson-view.class.d.ts +15 -2
  783. package/dist/components/viewers/geojson-view/geojson-view.class.d.ts.map +1 -1
  784. package/dist/components/viewers/geojson-view/geojson-view.class.js +13 -2
  785. package/dist/components/viewers/geojson-view/geojson-view.class.js.map +1 -1
  786. package/dist/components/viewers/highlight-layer/highlight-layer.class.d.ts.map +1 -1
  787. package/dist/components/viewers/highlight-layer/highlight-layer.class.js +3 -3
  788. package/dist/components/viewers/highlight-layer/highlight-layer.class.js.map +1 -1
  789. package/dist/components/viewers/html-viewer/html-viewer.class.d.ts +14 -2
  790. package/dist/components/viewers/html-viewer/html-viewer.class.d.ts.map +1 -1
  791. package/dist/components/viewers/html-viewer/html-viewer.class.js +11 -3
  792. package/dist/components/viewers/html-viewer/html-viewer.class.js.map +1 -1
  793. package/dist/components/viewers/include/include.class.d.ts +15 -2
  794. package/dist/components/viewers/include/include.class.d.ts.map +1 -1
  795. package/dist/components/viewers/include/include.class.js +13 -2
  796. package/dist/components/viewers/include/include.class.js.map +1 -1
  797. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts.map +1 -1
  798. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +1 -1
  799. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js.map +1 -1
  800. package/dist/components/viewers/page-rail/page-rail.class.d.ts.map +1 -1
  801. package/dist/components/viewers/page-rail/page-rail.class.js.map +1 -1
  802. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts.map +1 -1
  803. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +5 -2
  804. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js.map +1 -1
  805. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.d.ts +15 -2
  806. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.d.ts.map +1 -1
  807. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.js +14 -3
  808. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.js.map +1 -1
  809. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.d.ts.map +1 -1
  810. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js.map +1 -1
  811. package/dist/components/viewers/svg-viewer/svg-viewer.class.d.ts.map +1 -1
  812. package/dist/components/viewers/svg-viewer/svg-viewer.class.js.map +1 -1
  813. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts.map +1 -1
  814. package/dist/components/viewers/xml-viewer/xml-viewer.class.js +0 -0
  815. package/dist/components/viewers/xml-viewer/xml-viewer.class.js.map +1 -1
  816. package/dist/internal/anchor-target.js.map +1 -1
  817. package/dist/internal/anchored-validity.js +0 -1
  818. package/dist/internal/anchored-validity.js.map +1 -1
  819. package/dist/internal/ansi.d.ts.map +1 -1
  820. package/dist/internal/ansi.js +14 -7
  821. package/dist/internal/ansi.js.map +1 -1
  822. package/dist/internal/cell-range.d.ts.map +1 -1
  823. package/dist/internal/cell-range.js +1 -0
  824. package/dist/internal/cell-range.js.map +1 -1
  825. package/dist/internal/css-length.d.ts.map +1 -1
  826. package/dist/internal/css-length.js +1 -0
  827. package/dist/internal/css-length.js.map +1 -1
  828. package/dist/internal/form-associated.d.ts.map +1 -1
  829. package/dist/internal/form-associated.js +57 -1
  830. package/dist/internal/form-associated.js.map +1 -1
  831. package/dist/internal/length-constraints.d.ts +27 -0
  832. package/dist/internal/length-constraints.d.ts.map +1 -0
  833. package/dist/internal/length-constraints.js +42 -0
  834. package/dist/internal/length-constraints.js.map +1 -0
  835. package/dist/internal/localization.d.ts +1 -1
  836. package/dist/internal/localization.d.ts.map +1 -1
  837. package/dist/internal/localization.js +27 -0
  838. package/dist/internal/localization.js.map +1 -1
  839. package/dist/internal/lyra-element.d.ts.map +1 -1
  840. package/dist/internal/lyra-element.js.map +1 -1
  841. package/dist/internal/numbers.d.ts.map +1 -1
  842. package/dist/internal/numbers.js +3 -1
  843. package/dist/internal/numbers.js.map +1 -1
  844. package/dist/internal/overlay-manager.d.ts.map +1 -1
  845. package/dist/internal/overlay-manager.js +13 -8
  846. package/dist/internal/overlay-manager.js.map +1 -1
  847. package/dist/internal/persisted-state.d.ts +27 -0
  848. package/dist/internal/persisted-state.d.ts.map +1 -0
  849. package/dist/internal/persisted-state.js +57 -0
  850. package/dist/internal/persisted-state.js.map +1 -0
  851. package/dist/internal/root-registration-allowlist.d.ts +1 -1
  852. package/dist/internal/root-registration-allowlist.d.ts.map +1 -1
  853. package/dist/internal/root-registration-allowlist.js +5 -0
  854. package/dist/internal/root-registration-allowlist.js.map +1 -1
  855. package/dist/internal/safe-url.d.ts +13 -2
  856. package/dist/internal/safe-url.d.ts.map +1 -1
  857. package/dist/internal/safe-url.js +27 -4
  858. package/dist/internal/safe-url.js.map +1 -1
  859. package/dist/internal/strip-host-title.js.map +1 -1
  860. package/dist/internal/text-quote.d.ts +4 -0
  861. package/dist/internal/text-quote.d.ts.map +1 -1
  862. package/dist/internal/text-quote.js +28 -7
  863. package/dist/internal/text-quote.js.map +1 -1
  864. package/dist/internal/text-viewer-target.d.ts +27 -0
  865. package/dist/internal/text-viewer-target.d.ts.map +1 -0
  866. package/dist/internal/text-viewer-target.js +179 -0
  867. package/dist/internal/text-viewer-target.js.map +1 -0
  868. package/dist/internal/theme-watcher.d.ts +32 -0
  869. package/dist/internal/theme-watcher.d.ts.map +1 -0
  870. package/dist/internal/theme-watcher.js +67 -0
  871. package/dist/internal/theme-watcher.js.map +1 -0
  872. package/dist/lyra.d.ts +17 -5
  873. package/dist/lyra.d.ts.map +1 -1
  874. package/dist/lyra.js +11 -0
  875. package/dist/lyra.js.map +1 -1
  876. package/dist/theme/gemstones.d.ts +22 -0
  877. package/dist/theme/gemstones.d.ts.map +1 -0
  878. package/dist/theme/gemstones.js +44 -0
  879. package/dist/theme/gemstones.js.map +1 -0
  880. package/dist/theme/theme.d.ts +60 -0
  881. package/dist/theme/theme.d.ts.map +1 -0
  882. package/dist/theme/theme.js +132 -0
  883. package/dist/theme/theme.js.map +1 -0
  884. package/llms/components/lr-accordion-item.md +1 -0
  885. package/llms/components/lr-accordion.md +1 -0
  886. package/llms/components/lr-activity-feed.md +1 -0
  887. package/llms/components/lr-agent-eval-dashboard.md +29 -0
  888. package/llms/components/lr-agent-run.md +1 -0
  889. package/llms/components/lr-agent-trace.md +1 -0
  890. package/llms/components/lr-agent-workspace.md +1 -0
  891. package/llms/components/lr-animated-image.md +1 -0
  892. package/llms/components/lr-animation.md +1 -0
  893. package/llms/components/lr-app-rail-item.md +14 -5
  894. package/llms/components/lr-app-rail.md +14 -5
  895. package/llms/components/lr-approval-queue.md +27 -0
  896. package/llms/components/lr-archive-viewer.md +9 -3
  897. package/llms/components/lr-artifact-panel.md +1 -0
  898. package/llms/components/lr-attachment-chip.md +1 -0
  899. package/llms/components/lr-attachment-trigger.md +1 -0
  900. package/llms/components/lr-audio-visualizer.md +1 -0
  901. package/llms/components/lr-av-player.md +1 -0
  902. package/llms/components/lr-avatar-group.md +1 -0
  903. package/llms/components/lr-avatar.md +1 -0
  904. package/llms/components/lr-badge.md +4 -0
  905. package/llms/components/lr-bar-chart.md +5 -3
  906. package/llms/components/lr-box-plot.md +5 -3
  907. package/llms/components/lr-branch-picker.md +1 -0
  908. package/llms/components/lr-breadcrumb-item.md +1 -0
  909. package/llms/components/lr-breadcrumb.md +1 -0
  910. package/llms/components/lr-browser-frame.md +1 -0
  911. package/llms/components/lr-bubble-chart.md +5 -3
  912. package/llms/components/lr-button-group.md +1 -0
  913. package/llms/components/lr-button.md +29 -3
  914. package/llms/components/lr-calendar-viewer.md +7 -1
  915. package/llms/components/lr-calendar.md +1 -0
  916. package/llms/components/lr-callout.md +1 -0
  917. package/llms/components/lr-card.md +6 -0
  918. package/llms/components/lr-carousel-item.md +1 -0
  919. package/llms/components/lr-carousel.md +1 -0
  920. package/llms/components/lr-chart.md +50 -14
  921. package/llms/components/lr-chat-composer.md +1 -0
  922. package/llms/components/lr-chat-message.md +6 -0
  923. package/llms/components/lr-chat-viewport.md +1 -0
  924. package/llms/components/lr-checkbox-group.md +1 -0
  925. package/llms/components/lr-checkbox.md +5 -0
  926. package/llms/components/lr-checkpoint.md +1 -0
  927. package/llms/components/lr-chip-group.md +4 -0
  928. package/llms/components/lr-chip.md +4 -0
  929. package/llms/components/lr-chunk-inspector.md +1 -0
  930. package/llms/components/lr-citation-badge.md +6 -0
  931. package/llms/components/lr-code-block-core.md +1 -0
  932. package/llms/components/lr-code-block.md +1 -0
  933. package/llms/components/lr-code-editor.md +1 -0
  934. package/llms/components/lr-color-picker.md +1 -0
  935. package/llms/components/lr-combobox.md +65 -15
  936. package/llms/components/lr-command-palette.md +1 -0
  937. package/llms/components/lr-commit-card.md +1 -0
  938. package/llms/components/lr-community-card.md +1 -0
  939. package/llms/components/lr-compare-panel.md +1 -0
  940. package/llms/components/lr-confirm-bar.md +1 -0
  941. package/llms/components/lr-contact-viewer.md +7 -1
  942. package/llms/components/lr-context-inspector.md +1 -0
  943. package/llms/components/lr-context-meter.md +1 -0
  944. package/llms/components/lr-control-group.md +1 -0
  945. package/llms/components/lr-conversation-item.md +10 -2
  946. package/llms/components/lr-copy-button.md +1 -0
  947. package/llms/components/lr-csv-viewer.md +1 -0
  948. package/llms/components/lr-dashboard-grid.md +1 -0
  949. package/llms/components/lr-dataset-viewer.md +1 -0
  950. package/llms/components/lr-date-input.md +1 -0
  951. package/llms/components/lr-date-picker.md +1 -0
  952. package/llms/components/lr-details.md +1 -0
  953. package/llms/components/lr-dialog.md +1 -0
  954. package/llms/components/lr-diff-view.md +1 -0
  955. package/llms/components/lr-divider.md +1 -0
  956. package/llms/components/lr-dock-panel.md +1 -0
  957. package/llms/components/lr-document-compare.md +1 -0
  958. package/llms/components/lr-document-library.md +1 -0
  959. package/llms/components/lr-document-preview.md +5 -3
  960. package/llms/components/lr-document-viewer.md +1 -0
  961. package/llms/components/lr-docx-viewer.md +1 -0
  962. package/llms/components/lr-doughnut-chart.md +5 -3
  963. package/llms/components/lr-drawer.md +1 -0
  964. package/llms/components/lr-drilldown-panel.md +1 -0
  965. package/llms/components/lr-dropdown-item.md +1 -0
  966. package/llms/components/lr-dropdown.md +1 -0
  967. package/llms/components/lr-ebook-viewer.md +1 -0
  968. package/llms/components/lr-email-viewer.md +7 -1
  969. package/llms/components/lr-embedding-explorer.md +26 -0
  970. package/llms/components/lr-emoji-picker.md +1 -0
  971. package/llms/components/lr-empty.md +4 -1
  972. package/llms/components/lr-entity-card.md +1 -0
  973. package/llms/components/lr-entity-chip.md +1 -0
  974. package/llms/components/lr-entity-dossier.md +1 -0
  975. package/llms/components/lr-env-list.md +1 -0
  976. package/llms/components/lr-eval-dataset.md +1 -0
  977. package/llms/components/lr-eval-result.md +1 -0
  978. package/llms/components/lr-evaluation-run.md +1 -0
  979. package/llms/components/lr-export-button.md +1 -0
  980. package/llms/components/lr-file-icon.md +1 -0
  981. package/llms/components/lr-file-input.md +14 -1
  982. package/llms/components/lr-file-tree.md +1 -0
  983. package/llms/components/lr-filter-bar.md +1 -0
  984. package/llms/components/lr-flag.md +1 -0
  985. package/llms/components/lr-flow-canvas.md +1 -0
  986. package/llms/components/lr-flow-controls.md +1 -0
  987. package/llms/components/lr-flow-minimap.md +1 -0
  988. package/llms/components/lr-flow-node.md +1 -0
  989. package/llms/components/lr-flow-run-overlay.md +1 -0
  990. package/llms/components/lr-format-bytes.md +1 -0
  991. package/llms/components/lr-format-date.md +1 -0
  992. package/llms/components/lr-format-number.md +1 -0
  993. package/llms/components/lr-gauge.md +1 -0
  994. package/llms/components/lr-generation-status.md +1 -0
  995. package/llms/components/lr-geojson-view.md +5 -1
  996. package/llms/components/lr-graph-legend.md +1 -0
  997. package/llms/components/lr-graph-query-builder.md +1 -0
  998. package/llms/components/lr-graph.md +1 -0
  999. package/llms/components/lr-grounding-summary.md +1 -0
  1000. package/llms/components/lr-handoff-divider.md +1 -0
  1001. package/llms/components/lr-heatmap.md +1 -0
  1002. package/llms/components/lr-highlight-layer.md +1 -0
  1003. package/llms/components/lr-histogram.md +5 -3
  1004. package/llms/components/lr-html-viewer.md +7 -1
  1005. package/llms/components/lr-icon-button.md +21 -7
  1006. package/llms/components/lr-icon.md +1 -0
  1007. package/llms/components/lr-image-comparer.md +1 -0
  1008. package/llms/components/lr-image-viewer.md +1 -0
  1009. package/llms/components/lr-include.md +6 -0
  1010. package/llms/components/lr-ingestion-queue.md +1 -0
  1011. package/llms/components/lr-input.md +25 -2
  1012. package/llms/components/lr-intersection-observer.md +1 -0
  1013. package/llms/components/lr-json-viewer.md +1 -0
  1014. package/llms/components/lr-kbd.md +1 -0
  1015. package/llms/components/lr-knowledge-base-admin.md +30 -0
  1016. package/llms/components/lr-knowledge-base.md +1 -0
  1017. package/llms/components/lr-knowledge-graph-explorer.md +1 -0
  1018. package/llms/components/lr-known-date.md +1 -0
  1019. package/llms/components/lr-lightbox.md +1 -0
  1020. package/llms/components/lr-line-chart.md +5 -3
  1021. package/llms/components/lr-lite-chart.md +20 -2
  1022. package/llms/components/lr-live-region.md +1 -0
  1023. package/llms/components/lr-locale-picker.md +10 -5
  1024. package/llms/components/lr-map.md +1 -0
  1025. package/llms/components/lr-markdown-core.md +1 -0
  1026. package/llms/components/lr-markdown.md +1 -0
  1027. package/llms/components/lr-media-card.md +1 -0
  1028. package/llms/components/lr-memory-panel.md +1 -0
  1029. package/llms/components/lr-mention-popover.md +1 -0
  1030. package/llms/components/lr-menu-item.md +1 -0
  1031. package/llms/components/lr-menu.md +1 -0
  1032. package/llms/components/lr-message-actions.md +1 -0
  1033. package/llms/components/lr-message-feedback.md +1 -0
  1034. package/llms/components/lr-mind-map.md +1 -0
  1035. package/llms/components/lr-model-select.md +8 -1
  1036. package/llms/components/lr-model-settings-panel.md +1 -0
  1037. package/llms/components/lr-mutation-observer.md +1 -0
  1038. package/llms/components/lr-neighbor-list.md +1 -0
  1039. package/llms/components/lr-node-palette.md +1 -0
  1040. package/llms/components/lr-notebook-viewer.md +1 -0
  1041. package/llms/components/lr-number-input.md +9 -5
  1042. package/llms/components/lr-option.md +65 -15
  1043. package/llms/components/lr-page-rail.md +1 -0
  1044. package/llms/components/lr-pagination.md +1 -0
  1045. package/llms/components/lr-path-strip.md +1 -0
  1046. package/llms/components/lr-pdf-viewer.md +1 -0
  1047. package/llms/components/lr-phone-input.md +1 -0
  1048. package/llms/components/lr-pie-chart.md +5 -3
  1049. package/llms/components/lr-playback.md +1 -0
  1050. package/llms/components/lr-polar-area-chart.md +5 -3
  1051. package/llms/components/lr-policy-summary.md +1 -0
  1052. package/llms/components/lr-poll-status.md +1 -0
  1053. package/llms/components/lr-popover.md +4 -0
  1054. package/llms/components/lr-pptx-viewer.md +7 -2
  1055. package/llms/components/lr-progress-bar.md +1 -0
  1056. package/llms/components/lr-progress-ring.md +1 -0
  1057. package/llms/components/lr-provenance-panel.md +1 -0
  1058. package/llms/components/lr-push-to-talk.md +1 -0
  1059. package/llms/components/lr-qr-code.md +1 -0
  1060. package/llms/components/lr-query-builder.md +1 -0
  1061. package/llms/components/lr-radar-chart.md +5 -3
  1062. package/llms/components/lr-radio-group.md +1 -0
  1063. package/llms/components/lr-radio.md +1 -0
  1064. package/llms/components/lr-rag-answer.md +31 -0
  1065. package/llms/components/lr-random-content.md +1 -0
  1066. package/llms/components/lr-rating.md +1 -0
  1067. package/llms/components/lr-relative-time.md +1 -0
  1068. package/llms/components/lr-reorder-item.md +16 -4
  1069. package/llms/components/lr-reorder-list.md +16 -4
  1070. package/llms/components/lr-resize-observer.md +1 -0
  1071. package/llms/components/lr-responsive-panel.md +1 -0
  1072. package/llms/components/lr-result-card.md +1 -0
  1073. package/llms/components/lr-result-field.md +1 -0
  1074. package/llms/components/lr-retrieval-results.md +1 -0
  1075. package/llms/components/lr-retrieval-search.md +1 -0
  1076. package/llms/components/lr-retrieval-trace.md +1 -0
  1077. package/llms/components/lr-rubric-form.md +1 -0
  1078. package/llms/components/lr-scatter-chart.md +5 -3
  1079. package/llms/components/lr-scroller.md +1 -0
  1080. package/llms/components/lr-segmented.md +8 -0
  1081. package/llms/components/lr-select.md +20 -4
  1082. package/llms/components/lr-sequence-strip.md +1 -0
  1083. package/llms/components/lr-skeleton.md +1 -0
  1084. package/llms/components/lr-slider.md +1 -0
  1085. package/llms/components/lr-source-card.md +1 -0
  1086. package/llms/components/lr-source-list.md +1 -0
  1087. package/llms/components/lr-source-picker.md +1 -0
  1088. package/llms/components/lr-span-waterfall.md +1 -0
  1089. package/llms/components/lr-sparkline.md +1 -0
  1090. package/llms/components/lr-spinner.md +1 -0
  1091. package/llms/components/lr-split.md +11 -3
  1092. package/llms/components/lr-spreadsheet-viewer.md +1 -0
  1093. package/llms/components/lr-stack-trace.md +1 -0
  1094. package/llms/components/lr-stat.md +1 -0
  1095. package/llms/components/lr-stepper.md +1 -0
  1096. package/llms/components/lr-stream-status.md +1 -0
  1097. package/llms/components/lr-streaming-text.md +1 -0
  1098. package/llms/components/lr-suggestion-chips.md +1 -0
  1099. package/llms/components/lr-svg-viewer.md +1 -0
  1100. package/llms/components/lr-swatch-picker.md +29 -6
  1101. package/llms/components/lr-switch.md +1 -0
  1102. package/llms/components/lr-table.md +19 -5
  1103. package/llms/components/lr-tabs.md +1 -0
  1104. package/llms/components/lr-tag.md +4 -0
  1105. package/llms/components/lr-task-list.md +1 -0
  1106. package/llms/components/lr-terminal.md +1 -0
  1107. package/llms/components/lr-test-results.md +1 -0
  1108. package/llms/components/lr-textarea.md +20 -0
  1109. package/llms/components/lr-thinking-panel.md +1 -0
  1110. package/llms/components/lr-thread-list.md +2 -1
  1111. package/llms/components/lr-time-input.md +8 -4
  1112. package/llms/components/lr-time-range.md +1 -0
  1113. package/llms/components/lr-timeline-item.md +1 -0
  1114. package/llms/components/lr-timeline.md +1 -0
  1115. package/llms/components/lr-toast-item.md +3 -2
  1116. package/llms/components/lr-toast.md +3 -2
  1117. package/llms/components/lr-token-input.md +3 -1
  1118. package/llms/components/lr-tool-approval-dialog.md +1 -0
  1119. package/llms/components/lr-tool-call-chip.md +6 -0
  1120. package/llms/components/lr-tool-param-form.md +1 -0
  1121. package/llms/components/lr-tool-result-dialog.md +1 -0
  1122. package/llms/components/lr-tool-result-view.md +53 -4
  1123. package/llms/components/lr-tool-select-dialog.md +1 -0
  1124. package/llms/components/lr-tool-timeline.md +1 -0
  1125. package/llms/components/lr-tooltip.md +1 -0
  1126. package/llms/components/lr-tour.md +1 -0
  1127. package/llms/components/lr-trace-tree.md +1 -0
  1128. package/llms/components/lr-transcript-feed.md +1 -0
  1129. package/llms/components/lr-tree-node.md +1 -0
  1130. package/llms/components/lr-tree.md +1 -0
  1131. package/llms/components/lr-typing-indicator.md +13 -8
  1132. package/llms/components/lr-usage-badge.md +1 -0
  1133. package/llms/components/lr-virtual-list.md +1 -0
  1134. package/llms/components/lr-voice-picker.md +1 -0
  1135. package/llms/components/lr-widget-renderer.md +1 -0
  1136. package/llms/components/lr-widget.md +13 -0
  1137. package/llms/components/lr-word-cloud.md +9 -2
  1138. package/llms/components/lr-xml-viewer.md +1 -0
  1139. package/llms/components/lr-zoomable-frame.md +1 -0
  1140. package/llms/index.md +8 -3
  1141. package/llms/peers.md +2 -1
  1142. package/llms/shared.md +88 -0
  1143. package/llms-full.txt +753 -128
  1144. package/llms.txt +2 -2
  1145. package/package.json +21 -2
  1146. package/vscode-css-data.json +239 -1
  1147. package/vscode-html-data.json +565 -30
  1148. package/web-types.json +730 -34
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
@@ -624,13 +750,24 @@ indicator from `maxRender`), `error`, `hint`
624
750
  **Themeable custom properties:** `--lr-combobox-trigger-padding`,
625
751
  `--lr-combobox-trigger-min-height`, `--lr-combobox-font-size`, `--lr-combobox-tag-padding`,
626
752
  `--lr-combobox-tag-font-size`, and `--lr-combobox-expand-size` (the decorative icon box; each
627
- standard size supplies an aligned default), plus shared tokens.
753
+ standard size supplies an aligned default), plus shared tokens. `--lr-combobox-gap` (default
754
+ `--lr-space-xs`, the gap inside `[part='combobox']`) and `--lr-combobox-radius` (default
755
+ `--lr-radius`, its corner radius) are both retunable without a `::part(combobox)` rule but, unlike
756
+ the properties above, do not vary by `size` — the same `--lr-button-gap`/`-radius` pattern.
628
757
 
629
758
  `--lr-combobox-option-active-bg` (default `var(--lr-color-brand-quiet)`) recolors the background of
630
759
  a hovered or keyboard-active `[part='option']` row — the same per-component indirection
631
760
  `lr-select`'s identical `--lr-select-option-active-bg` uses, so a consumer can retheme just this
632
761
  row state without hijacking the shared `--lr-color-brand-quiet` token library-wide.
633
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
+
634
771
  `--lr-combobox-trigger-height` pins an **exact** input-container height (both floors and caps it),
635
772
  for pixel-matching an `<lr-input>` or `<lr-select>` in the same toolbar row. It is **undeclared by
636
773
  default**, leaving `--lr-combobox-trigger-min-height` as a floor only and the row free to grow —
@@ -692,7 +829,7 @@ Session-history/autofill state is stored as a name-independent JSON string array
692
829
  array restores the selection (single mode keeps its first entry); malformed or wrong-shape state
693
830
  restores an empty selection. Restored state wins even when it arrives before the first option
694
831
  collection, while `form.reset()` still returns to the declarative selected default. Restoration is
695
- synchronous and fires no `input`/`change` event.
832
+ synchronous and fires no `input`/`change`/`lr-change` event.
696
833
 
697
834
  **Known gotchas:**
698
835
  - `with-clear` remains supported for compatibility, but new code should use the mirrored
@@ -731,7 +868,8 @@ input: click/Enter/Space/ArrowDown opens it, and there's no typing-to-filter. Op
731
868
  `<lr-option value>` children — the same element `<lr-combobox>` uses — reconciled the same way
732
869
  combobox does, and the popup reuses `internal/positioner.ts` for placement.
733
870
  Session-history/autofill restoration assigns the stored string through the same synchronous
734
- 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`.
735
873
 
736
874
  Single-select only, with no `filter`/`source`/`with-clear`/`max-options-visible`/`empty-text`/
737
875
  `max-render`/`multiple` surface — reach for `<lr-combobox>` instead whenever any of those apply.
@@ -764,8 +902,10 @@ exactly like the multi-option case, until the trigger is actually activated.
764
902
  - `value: string` — a getter/setter; always a single string (no `multiple` mode)
765
903
 
766
904
  **Events:** `change` (native-style — selection changed), `input` (fired alongside `change` on every
767
- selection change — a native `<select>` doesn't meaningfully distinguish the two either),
768
- `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`.
769
909
 
770
910
  **Slots:** default (`<lr-option>` children), `label`, `hint`, `error` (overrides the `errorText`
771
911
  attribute when provided)
@@ -791,7 +931,10 @@ presentational `<div>`, not a `role="group"`; options with an empty `group` get
791
931
 
792
932
  **Themeable custom properties:** `--lr-select-trigger-padding`, `--lr-select-trigger-min-height`,
793
933
  `--lr-select-font-size`, `--lr-select-expand-size` — all four auto-swapped per `size` (`xs`…`xl`), the same pattern
794
- `lr-toast-item`'s `--lr-toast-padding`/`--lr-toast-font-size` use.
934
+ `lr-toast-item`'s `--lr-toast-padding`/`--lr-toast-font-size` use. `--lr-select-gap` (default
935
+ `--lr-space-xs`, the gap inside `[part='trigger']`) and `--lr-select-radius` (default `--lr-radius`,
936
+ its corner radius) are both retunable without a `::part(trigger)` rule but, unlike the four above,
937
+ do not vary by `size` — the same `--lr-button-gap`/`-radius` pattern.
795
938
 
796
939
  `--lr-select-trigger-min-height` is live at **every** tier, the default `m` included, where it is
797
940
  `2.5rem` — byte-identical to `lr-input`'s and `lr-combobox`'s own `m` floor, so the three controls
@@ -814,6 +957,15 @@ ancestor is never shadowed — retheme just this row state without hijacking the
814
957
  `--lr-color-brand-quiet` token every other component's own hover/active state also reads. Same
815
958
  knob `lr-combobox`'s own `--lr-combobox-option-active-bg` provides.
816
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
+
817
969
  **Optional peer deps:** none.
818
970
 
819
971
  ```html
@@ -1099,10 +1251,29 @@ submission/validation/reset via `name`/`value`/`disabled`/`required`/`checkValid
1099
1251
  | `autocomplete` | `autocomplete` | `string` | `''` | Forwarded to the native `<textarea>`; empty omits the attribute. |
1100
1252
  | `inputMode` | `inputmode` | `string` | `''` | Virtual-keyboard input hint forwarded to the native `<textarea>`. |
1101
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`. |
1102
1256
  | `name` | `name` | `string` | `''` | Form field name. |
1103
1257
  | `disabled` | `disabled` | `boolean` | `false` | Disables the control. |
1104
1258
  | `required` | `required` | `boolean` | `false` | Participates in native constraint validation. |
1105
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
+
1106
1277
  The visible label, hint, and error live in the same shadow tree as the native control, so their
1107
1278
  generated ids safely drive the native `<label>`/`aria-describedby` relationships. Name precedence
1108
1279
  is `accessibleLabel`/host `aria-label`, visible `label`, `placeholder`, then the localized
@@ -1175,7 +1346,27 @@ A generic action-button primitive. Renders an internal native `<button>`; `type=
1175
1346
  `type="reset"` are handled by the component itself via the host's own `closest('form')`, since a
1176
1347
  shadow-internal native button doesn't participate in an ancestor form's submission on its own.
1177
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
+
1178
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
1179
1370
  - `variant: 'neutral' | 'brand' | 'success' | 'warning' | 'danger' = 'neutral'` (reflected)
1180
1371
  - `appearance: 'accent' | 'filled' | 'outlined' | 'plain' | 'quiet' | 'link' = 'filled'` (reflected)
1181
1372
  — `'accent'` is a
@@ -1200,15 +1391,17 @@ shadow-internal native button doesn't participate in an ancestor form's submissi
1200
1391
  The shared `m` size uses `--lr-font-size-m`. The internal button follows the host's inline size through `--lr-button-width` (default
1201
1392
  `100%`), and each size tier's `min-block-size` floor is exposed as its own token (see below).
1202
1393
 
1203
- **Getters/methods:** `click()`, `focus(options?)`, and `blur()` — forwarded to the internal native
1204
- `<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.
1205
1397
 
1206
1398
  **Events:** none (a plain native `click` bubbles and composes through the shadow boundary
1207
1399
  unmodified; disabled while `disabled` or `loading`).
1208
1400
 
1209
1401
  **Slots:** default (label content), `start` (leading icon/content), `end` (trailing icon/content).
1210
1402
 
1211
- **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`).
1212
1405
 
1213
1406
  **Themeable custom properties:** `--lr-button-width`, `--lr-button-accent`, `--lr-button-fill`,
1214
1407
  `--lr-button-on-fill`, `--lr-button-border` (each swapped by the active `variant`, default
@@ -1236,6 +1429,9 @@ and the per-`size`
1236
1429
  and any slotted content) and `--lr-button-radius` (default `--lr-radius`, the corner radius) are
1237
1430
  both retunable without a `::part(base)` rule but — unlike the four size knobs below — do not vary
1238
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.
1239
1435
 
1240
1436
  **Retuning one `size` tier's geometry, without a `::part(base)` rule.** Four more properties carry
1241
1437
  the active tier's geometry, and every `:host([size='…'])` rule does nothing but re-assign them — no
@@ -1280,9 +1476,8 @@ box no matter what tier or override is in play.
1280
1476
 
1281
1477
  ## `lr-icon-button`
1282
1478
 
1283
- An accessible icon-only action button — a native `<button>` wrapping an `lr-icon`. Not
1284
- form-associated: it is an action trigger, so `type="submit"`/`"reset"` work through the ancestor
1285
- 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.
1286
1481
 
1287
1482
  **Properties:**
1288
1483
  - `icon: string = ''` — an `lr-icon` glyph name (see `llms/components/lr-icon.md`)
@@ -1312,9 +1507,14 @@ by side; that is a valid composition, not a fallback.
1312
1507
  `polygon`, `polyline`, `ellipse`, `g`, `use`) with no `icon` set and no enclosing `<svg>` of its
1313
1508
  own has no real SVG parent as parsed, and is detected and cloned into an internal
1314
1509
  `[part="fallback"]` SVG-namespaced element so it still paints — the same fallback `<lr-icon>`'s own
1315
- custom-content slot uses. This is narrowly scoped to that whitelist: a complete `<svg>`, `<img>`,
1316
- or custom element (e.g. `<lr-flag>`) is never touched by it and keeps rendering as an untouched
1317
- sibling at its own natural aspect ratio.
1510
+ custom-content slot uses. The `[part="fallback"]` svg carries the same `fill="none"
1511
+ stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"` defaults
1512
+ `<lr-icon>`'s own wrapper svg does, so bare stroke-style geometry (the common lucide/feather/tabler
1513
+ path-data shape, which carries no fill/stroke of its own) renders outlined instead of as a solid
1514
+ shape; an explicit `fill`/`stroke`/etc. already present on the slotted node still wins for that
1515
+ node. This is narrowly scoped to that whitelist: a complete `<svg>`, `<img>`, or custom element
1516
+ (e.g. `<lr-flag>`) is never touched by it and keeps rendering as an untouched sibling at its own
1517
+ natural aspect ratio.
1318
1518
 
1319
1519
  **CSS parts:** `button`, `fallback` (only present in the DOM while at least one top-level slotted
1320
1520
  element needs the bare-geometry fallback above)
@@ -1325,7 +1525,16 @@ than it grows the button and keeps its own aspect ratio; a small glyph pads out
1325
1525
  library-wide token (declared on `:root` by the token layer, and the shared minimum tappable size
1326
1526
  that several other components size their icon-only controls against), so overriding
1327
1527
  `--lr-theme-icon-button-size` globally resizes all of them together. Keep the resolved value at or
1328
- above 24px — see `llms/shared.md`.
1528
+ above 24px — see `llms/shared.md`. `--lr-icon-button-radius` (default `--lr-radius`) is the
1529
+ `[part='button']` corner radius, retunable without a `::part(button)` rule — the same
1530
+ `--lr-button-radius` pattern; `lr-icon-button` has no `size` tiers, so there is no per-tier gap
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.
1329
1538
 
1330
1539
  ## `lr-input`
1331
1540
 
@@ -1359,6 +1568,13 @@ form-associated via the same `FormAssociated` mixin as `lr-textarea`. Ships the
1359
1568
  non-numeric bound only survives a direct property assignment; the declared type also admits a
1360
1569
  string so a subclass can narrow the attribute parsing to its own native type's literal form —
1361
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
1362
1578
  - `passwordVisible: boolean = false` (attribute `password-visible` — `type="password"` only)
1363
1579
  - `name`/`disabled`/`required` (from `FormAssociated`)
1364
1580
 
@@ -1392,7 +1608,10 @@ input and built-in actions).
1392
1608
  `--lr-input-control-height` pins an **exact** outer control-row height (both floors and caps it) —
1393
1609
  for example to pixel-match an `<lr-select>` or `<lr-combobox>` in the same toolbar row. It is
1394
1610
  undeclared by default, leaving `--lr-input-control-min-height` as a floor only and the row free to
1395
- grow.
1611
+ grow. `--lr-input-gap` (default `--lr-space-xs`, the gap inside `[part='input-wrapper']`) and
1612
+ `--lr-input-radius` (default `--lr-radius`, its corner radius) are both retunable without a
1613
+ `::part(input-wrapper)` rule but, unlike the four properties above, do not vary by `size` — the same
1614
+ `--lr-button-gap`/`-radius` pattern; `lr-number-input`/`lr-time-input` inherit both unchanged.
1396
1615
 
1397
1616
  ### Exact-height hatches — the one rule that applies to all of them
1398
1617
 
@@ -1430,7 +1649,19 @@ Several controls expose the same pair: a per-`size` `*-min-height` **floor**, an
1430
1649
  **Known gotchas:**
1431
1650
  - `type="email"`/`type="number"` delegate constraint validation to the internal native `<input>`'s
1432
1651
  own browser-computed `validity` (format/range/step), bridged into this element's own
1433
- `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.
1434
1665
  - `type="password"` always renders the `password-toggle` button; there is no separate opt-out.
1435
1666
 
1436
1667
  ## `lr-number-input`
@@ -1442,8 +1673,8 @@ A migration-friendly numeric alias of `lr-input` — a subclass whose constructo
1442
1673
  **Properties:** `size` (`2xs`…`xl`), `placeholder`, `readonly`, `label`, `hint`, `errorText`
1443
1674
  (`error-text`), `accessibleLabel` (`aria-label`), `autocomplete`, `spellcheck`, `autocapitalize`,
1444
1675
  `autoCorrect` (`autocorrect`), `inputMode` (`inputmode`), `enterKeyHint` (`enterkeyhint`), and
1445
- `min`/`max`/`step` (the native numeric constraint validation). `clearable` and `passwordVisible`
1446
- (`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.
1447
1678
 
1448
1679
  **Events:** `input`/`change` (native-style, composed), `lr-input`/`lr-change`
1449
1680
  (`detail: { value }`), `focus`/`blur` (re-dispatched bubbling + composed from the internal native
@@ -1457,13 +1688,16 @@ alias ever renders.
1457
1688
 
1458
1689
  **Themeable custom properties:** inherited from `lr-input`, identical in meaning —
1459
1690
  `--lr-input-control-min-height`, `--lr-input-control-height`, `--lr-input-padding-block`,
1460
- `--lr-input-padding-inline` and `--lr-input-font-size` (all but `--lr-input-control-height` swap
1461
- per `size`; that one stays undeclared until you pin an exact row height).
1691
+ `--lr-input-padding-inline`, `--lr-input-font-size`, `--lr-input-gap`, and `--lr-input-radius` (all
1692
+ but `--lr-input-control-height` swap per `size`; that one stays undeclared until you pin an exact
1693
+ row height, and `--lr-input-gap`/`--lr-input-radius` — like `--lr-button-gap`/`-radius` — never
1694
+ vary by `size` at all).
1462
1695
 
1463
1696
  **Known gotchas:**
1464
1697
  - `clearable`/`clear-button`/`lr-clear` are inert: the clear action only renders for
1465
1698
  `type="text"`/`"search"`. `password-visible`/`password-toggle` are likewise inert, since the
1466
- 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.
1467
1701
  - `type` is re-forced to `number` on every connect, but a later `el.type = 'text'` on a connected
1468
1702
  element is not reverted — use `lr-input` when the type has to change.
1469
1703
 
@@ -1476,8 +1710,9 @@ re-typed `min`/`max` pair (below); every other property, event, slot and part is
1476
1710
  **Properties:** `size` (`2xs`…`xl`), `placeholder`, `readonly`, `label`, `hint`, `errorText`
1477
1711
  (`error-text`), `accessibleLabel` (`aria-label`), `autocomplete`, `spellcheck`, `autocapitalize`,
1478
1712
  `autoCorrect` (`autocorrect`), `inputMode` (`inputmode`), and `enterKeyHint` (`enterkeyhint`).
1479
- `clearable` and `passwordVisible` (`password-visible`) are inherited but inert, exactly as on
1480
- `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.
1481
1716
 
1482
1717
  `step` is forwarded verbatim to the native time input, where it means seconds (`step="1"` reveals
1483
1718
  the seconds field, `'any'` disables step validation).
@@ -1501,8 +1736,10 @@ native input's own constraint validation reports `rangeUnderflow`/`rangeOverflow
1501
1736
 
1502
1737
  **Themeable custom properties:** inherited from `lr-input`, identical in meaning —
1503
1738
  `--lr-input-control-min-height`, `--lr-input-control-height`, `--lr-input-padding-block`,
1504
- `--lr-input-padding-inline` and `--lr-input-font-size` (all but `--lr-input-control-height` swap
1505
- per `size`; that one stays undeclared until you pin an exact row height).
1739
+ `--lr-input-padding-inline`, `--lr-input-font-size`, `--lr-input-gap`, and `--lr-input-radius` (all
1740
+ but `--lr-input-control-height` swap per `size`; that one stays undeclared until you pin an exact
1741
+ row height, and `--lr-input-gap`/`--lr-input-radius` — like `--lr-button-gap`/`-radius` — never
1742
+ vary by `size` at all).
1506
1743
 
1507
1744
  **Known gotchas:** the same two as `lr-number-input` — the inert clear/password surface, and `type`
1508
1745
  only being re-forced on connect. The native `type="time"` UI (spinners, AM/PM, picker) is the
@@ -1817,16 +2054,18 @@ named colors, the shape apps otherwise hand-roll as a row of round accent-color
1817
2054
 
1818
2055
  **Properties:**
1819
2056
  - `options: SwatchOption[] = []` (attribute: false) — `SwatchOption { value: string; color: string;
1820
- label: string; icon?: unknown }`; `color` is any CSS color string used as the swatch fill, `label`
1821
- is each swatch's accessible name and `title`. `icon` is an optional custom shape (e.g. a gem
1822
- glyph) rendered *instead of* the plain filled circle; the swatch sets `color: <option color>` so a
1823
- `currentColor`-based SVG picks the option's color up automatically, matching
1824
- `<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`.
1825
2061
  - `value: string | null = null` — the currently selected option's `value` (controlled); `null`
1826
2062
  leaves nothing selected while keeping the first swatch tabbable.
1827
2063
  - `size: '2xs' | 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected — scales the swatch hit-area and
1828
2064
  fill diameter proportionally, hit-area floored at 24px; not pixel-matched to `lr-input`'s
1829
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.
1830
2069
  - `label: string = ''` — accessible name copied to the internal `role="radiogroup"`; when empty, a
1831
2070
  host-level `aria-label` is used as a fallback.
1832
2071
 
@@ -1855,7 +2094,9 @@ for a looping brighten-and-settle pulse on the selected swatch. It drives a sepa
1855
2094
  works identically for a fill and an icon; disabled outright under `prefers-reduced-motion: reduce`,
1856
2095
  which also drops the hover/selection scale transition), `--lr-swatch-picker-hit-size` (hit-area
1857
2096
  size, swapped per `size` tier), `--lr-swatch-picker-fill-size` (visible fill/icon diameter, swapped
1858
- 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`,
1859
2100
  `--lr-border-width-thin`/`-thick`, `--lr-radius`, `--lr-transition-fast`, `--lr-focus-ring-*`,
1860
2101
  and the per-tier `--lr-size-*` tokens.
1861
2102
 
@@ -1875,6 +2116,24 @@ and the per-tier `--lr-size-*` tokens.
1875
2116
  </script>
1876
2117
  ```
1877
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
+
1878
2137
  **Known gotchas:**
1879
2138
  - arrow-key navigation cycles (past the last swatch wraps to the first, and vice versa) rather than
1880
2139
  clamping, and self-selects on move — arrow-navigating to a swatch immediately updates `value` and
@@ -1919,6 +2178,10 @@ silent. Internal `focus`/`blur` are re-dispatched as bubbling, composed host eve
1919
2178
  same as clicking a native checkbox's associated `<label>`. If left empty, set `aria-label` on the
1920
2179
  host so the control still has an accessible name.
1921
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
+
1922
2185
  **CSS parts:** `base` (the whole interactive control, `role="checkbox"`), `box` (the small square
1923
2186
  showing the checkmark/indeterminate dash), `checkmark` (the checkmark or indeterminate-dash glyph),
1924
2187
  `label` (wrapper around the default slot)
@@ -2222,7 +2485,8 @@ hit area stays fixed at `40px` across all sizes), `allowDuplicates` (`allow-dupl
2222
2485
  `','` — see below).
2223
2486
  **Slots:** `label`, `hint`, `error`.
2224
2487
  **Events:** `input`, `change`, `lr-add` (`detail: { value }`), `lr-remove`
2225
- (`detail: { value, index }`), and `lr-token-edit`
2488
+ (`detail: { value, index }` — cancelable; `preventDefault()` keeps the token in `value`
2489
+ unchanged), and `lr-token-edit`
2226
2490
  (`detail: { value, previousValue, index }` — an existing token was edited in place and committed).
2227
2491
  **CSS parts:** `form-control`, `form-control-label`, `input-wrapper`, `token`, `token-label` (the
2228
2492
  token's text, doubling as the roving-focus edit trigger — rendered only while `editable`),
@@ -2471,11 +2735,15 @@ list, no filter/free-text mode.
2471
2735
 
2472
2736
  **Properties:**
2473
2737
  - `locales: LyraLocaleCatalog = []` (attribute: false) — `LyraLocaleCatalog = string[] |
2474
- LyraLocaleEntry[]`, `LyraLocaleEntry { tag: string; label?: string }`. Empty (the default)
2475
- auto-discovers the registry; a non-empty array (either form) overrides it entirely — a curated
2476
- subset, custom order, custom labels, or a locale offered before its strings are registered.
2477
- - `showFlags: boolean = true` each row's leading `<lr-flag language={tag} variant="compact">`;
2478
- `false` omits the flag element entirely (not just visually).
2738
+ LyraLocaleEntry[]`, `LyraLocaleEntry { tag: string; label?: string; country?: string }`. Empty
2739
+ (the default) auto-discovers the registry; a non-empty array (either form) overrides it
2740
+ entirely — a curated subset, custom order, custom labels, or a locale offered before its
2741
+ strings are registered. `country` (ISO 3166-1 alpha-2) overrides a row's derived flag e.g.
2742
+ showing Lebanon's flag for an `'ar'` row instead of the library's default Saudi Arabia mapping;
2743
+ only available on the `{tag,label,country}` object form, not the bare `string[]` form.
2744
+ - `showFlags: boolean = true` — each row's leading `<lr-flag language={tag} variant="compact">`
2745
+ (or `<lr-flag country={country} variant="compact">` when the entry sets `country`); `false`
2746
+ omits the flag element entirely (not just visually).
2479
2747
  - `value: string = ''` — the **committed** selection (form value, drives `lr-change`). While `''`
2480
2748
  and untouched, the trigger *displays* `effectiveLocale` as a preview label, but
2481
2749
  `checkValidity()`/`required` are governed by the real `value`, which stays `''` until a real
@@ -2845,6 +3113,9 @@ own "consumer computes/renders" contract rather than assuming addition.
2845
3113
  button's label once they've been revealed)
2846
3114
  - `showAllColumns: boolean = false` (attribute `show-all-columns`, reflected) — forces responsive
2847
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
2848
3119
  - `heatTintScale?: { min?: number; max?: number }` (attribute: false) — overrides the auto-derived
2849
3120
  heat-tint domain (min/max of every `heatValue` result across every currently-rendered row —
2850
3121
  post-sort, pre-pagination, the same rows `footer(rows)` already sees). Unset (the default) computes
@@ -2913,6 +3184,11 @@ element *or on any ancestor* and still reach the rule that reads it. It exists b
2913
3184
  forbids an attribute selector after `::part()` — `::part(row)[aria-selected='true']` is invalid CSS —
2914
3185
  so the only prior lever for restyling the selected row was overriding the library-wide
2915
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.
2916
3192
  `--lr-table-sticky-offset` (default `0`) is measured and written inline per column by the component
2917
3193
  so multiple `sticky` columns stack instead of overlapping; it is a read-out, not a knob you set.
2918
3194
  `--lr-table-heat-t` is likewise component-written (each `[data-heat]` cell's position on the ramp).
@@ -2938,11 +3214,16 @@ so multiple `sticky` columns stack instead of overlapping; it is a read-out, not
2938
3214
  - only single-row selection is modeled (`selectedKey: string | number | null`);
2939
3215
  there's no bulk-select/checkbox-column API — you must hand-roll a checkbox column entirely inside
2940
3216
  a `cell()` callback if you need multi-select.
2941
- - no `caption`/`aria-label` *property* exists, but a plain `aria-label` HTML attribute set on the
2942
- host **is** forwarded into the shadow-DOM `<table role="grid">` (read via
2943
- `this.getAttribute('aria-label')` at render time a plain global-attribute read, not a reactive
2944
- Lit `@property`): `<lr-table aria-label="Scores">` gives the grid an accessible name; omit it and
2945
- 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.
2946
3227
  - Full roving-tabindex grid keyboard pattern (one `tabindex="0"` stop among header cells, one among
2947
3228
  body rows) — Left/Right/Home/End move within the header row, Up/Down/Home/End move within the
2948
3229
  body, Down from the header enters the body's roving stop and Up from the body's first row returns
@@ -3153,6 +3434,12 @@ visually-hidden `[part="live-region"]` (`role="status" aria-live="polite"`) anno
3153
3434
  90° for denser packing
3154
3435
  - `palette?: string[]` (attribute: false) — custom categorical colors, cycled by word index (or by
3155
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
3156
3443
 
3157
3444
  **Methods:** `refreshTheme(): void` — forces a relayout so the `--lr-font` custom property is
3158
3445
  re-read from computed style (font-family affects the canvas text measurement layout depends on);
@@ -3166,8 +3453,8 @@ the currently-focused word — a no-op if nothing is focused yet)
3166
3453
 
3167
3454
  **CSS parts:** `base`, `svg`, `word` (each `<text>`), `focus-ring` (the rect around the roving-focus
3168
3455
  cursor's word), `live-region` (visually-hidden `role="status" aria-live="polite"` announcement text),
3169
- `empty` (the no-data placeholder hardcoded `"No data"` text, no property to customize it, unlike
3170
- `lr-empty`/`lr-table`)
3456
+ `legend`/`legend-item`/`legend-swatch`/`legend-label` (the optional static color key), and `empty`
3457
+ (the no-data placeholder)
3171
3458
 
3172
3459
  **Themeable custom properties:** `--lr-word-cloud-color-1`, `--lr-word-cloud-color-2`,
3173
3460
  `--lr-word-cloud-color-3`, `--lr-word-cloud-color-4`, `--lr-word-cloud-color-5`,
@@ -4295,9 +4582,16 @@ auto-inserted between each adjacent pair.
4295
4582
  **Properties:**
4296
4583
  - `sizes: number[] = []` (attribute: false — percentages per panel, auto-computed equally if
4297
4584
  omitted/mismatched)
4298
- - `defaultSizes: number[] = []` (attribute: false) — initialization-only fallback: a valid restored
4299
- `storageKey` layout wins first; otherwise a valid `defaultSizes` wins over equal distribution.
4300
- 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]`.
4301
4595
  - `min: number = 10` (min % per panel)
4302
4596
  - `orientation: 'horizontal'|'vertical' = 'horizontal'` (reflected) — the axis used at/above
4303
4597
  `orientationBreakpoint` (or always, when that's unset).
@@ -4541,6 +4835,10 @@ position) survives the transition.
4541
4835
  view externally; also updated internally when a view toggle is clicked.
4542
4836
  - `accessibleLabel: string = ''` (attribute `aria-label`) — overrides the label-derived fullscreen
4543
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.
4544
4842
 
4545
4843
  **Events:** `lr-collapse-change` (`detail: { collapsed }`, the new state), `lr-fullscreen-change`
4546
4844
  (`detail: { fullscreen }` — also fired when fullscreen is exited via Escape or a backdrop click, not
@@ -4603,6 +4901,9 @@ space for a persistent sidebar/toolbar that should stay visible instead of being
4603
4901
  fullscreen panel/backdrop — it overrides the default `var(--lr-space-l)` inset on every side for
4604
4902
  both `[part="base"]` and `[part="backdrop"]`. Set `compact` for tighter header/body padding.
4605
4903
 
4904
+ The collapse-button `aria-label` is localized via its own `widgetCollapse` (default `'Collapse
4905
+ panel'`) and `widgetExpand` (default `'Expand panel'`) keys.
4906
+
4606
4907
  **Known gotchas:**
4607
4908
  - a reconnect that preserves the same element instance (e.g. a drag-and-drop reparent) resumes its
4608
4909
  shared overlay registration and re-acquires the scroll lock if `fullscreen` was still `true`
@@ -4610,6 +4911,11 @@ both `[part="base"]` and `[part="backdrop"]`. Set `compact` for tighter header/b
4610
4911
  between, so `willUpdate()` alone wouldn't otherwise notice.
4611
4912
  - `collapsed` hides the body via `hidden` rather than an animated height transition — collapsing is
4612
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.
4613
4919
 
4614
4920
  ---
4615
4921
 
@@ -4982,7 +5288,9 @@ Ctrl/Cmd+ArrowUp/ArrowDown from focus anywhere inside a row — the same modifie
4982
5288
  `<lr-tree>`'s controlled `reorderable` mode, this list physically moves its own slotted
4983
5289
  `<lr-reorder-item>` light-DOM nodes itself (there is no `data` array prop to reconcile against),
4984
5290
  and emits `lr-reorder` with the full new order so the host can persist it without hand-rolling its
4985
- own splice/resort logic.
5291
+ own splice/resort logic. `lr-reorder` is cancelable — a listener calling `preventDefault()` holds
5292
+ the move open (mirroring `lr-confirm-bar`'s cancelable approve/deny pattern) until the host calls
5293
+ `finalizePendingMove()`/`revertPendingMove()`.
4986
5294
 
4987
5295
  ### `lr-reorder-list`
4988
5296
 
@@ -4992,9 +5300,15 @@ own splice/resort logic.
4992
5300
  - `disabled: boolean = false` (reflected) — disables every item's move buttons and the Ctrl/Cmd+
4993
5301
  Arrow shortcut, without mutating any item's own `disabled` attribute.
4994
5302
 
4995
- **Events:** `lr-reorder` (`detail: { order: string[], fromIndex: number, toIndex: number }` — fired
4996
- after every successful move; `order` is every current item's `value` (or its DOM-position-index
4997
- fallback) in the new top-to-bottom order)
5303
+ **Events:** `lr-reorder` (`detail: { order: string[], fromIndex: number, toIndex: number }`,
5304
+ cancelable fired before a move is applied; `order` is every item's `value` (or its
5305
+ DOM-position-index fallback) in the order the move WOULD produce. Uncanceled, the move applies
5306
+ synchronously right after. `preventDefault()` holds the move instead: the affected item reflects
5307
+ `pending`, and no other move can start until the host resolves it — see **Methods** below.
5308
+
5309
+ **Methods:** `finalizePendingMove()` — applies a move held via `preventDefault()`.
5310
+ `revertPendingMove()` — discards a held move, restoring the prior order. Both no-op when nothing
5311
+ is pending.
4998
5312
 
4999
5313
  **Slots:** default — `<lr-reorder-item>` elements.
5000
5314
 
@@ -5029,6 +5343,9 @@ between rows.
5029
5343
  - `atStart: boolean = false`, `atEnd: boolean = false`, `listDisabled: boolean = false`
5030
5344
  (attribute: false) — pushed down by the parent `<lr-reorder-list>`; normally set internally, not
5031
5345
  by consumers.
5346
+ - `pending: boolean = false` (reflected) — set while this item's move is held via the parent's
5347
+ `lr-reorder` `preventDefault()`. Informational only (doesn't itself disable the item's buttons);
5348
+ style via `lr-reorder-item[pending]`. Pushed down by the parent; normally set internally.
5032
5349
 
5033
5350
  **Events:** `lr-move-request` (`detail: { direction: 'up' | 'down' }` — a move button was activated
5034
5351
  while not disabled; handled by the parent `<lr-reorder-list>`, which performs the actual move)
@@ -5065,6 +5382,13 @@ labeled options, rendered as a button row" is ubiquitous settings/filter-panel U
5065
5382
  **Events:** `lr-change` (`detail: { value }`) — fired when the selected value changes via click or
5066
5383
  keyboard.
5067
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
+
5068
5392
  **Slots:** none.
5069
5393
 
5070
5394
  **CSS parts:** `base` (the `role="radiogroup"` root), `segment` (a single `role="radio"` button),
@@ -5371,8 +5695,10 @@ content is never duplicated.
5371
5695
 
5372
5696
  Opting in to `resizable` adds a continuously draggable width for the `'full'` state: a
5373
5697
  `[part="resizer"]` handle (pointer-drag and Left/Right-arrow keyboard stepping, RTL-aware) clamped to
5374
- `[minRailWidthPx, maxRailWidthPx]`, with no built-in persistence a consumer that wants the chosen
5375
- 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.
5376
5702
  `preferredMode` separately lets a host manually prefer `'full'`/`'icon-only'` for the non-mobile
5377
5703
  breakpoint axis (e.g. a user's own collapse toggle) while `mobile-breakpoint` continues to be tracked
5378
5704
  automatically regardless — it's only consulted while `mode` isn't force-pinned via the `mode`
@@ -5417,6 +5743,9 @@ accessor itself, which still takes full priority.
5417
5743
  - `railWidthPx?: number` (attribute `rail-width-px`) — the rail's current width in px while
5418
5744
  `resizable`; settable/gettable directly. Unset defers to `--lr-app-rail-width`'s own resolved
5419
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.
5420
5749
  - `minRailWidthPx: number = 190` (attribute `min-rail-width-px`) — minimum `railWidthPx` a
5421
5750
  drag/keyboard resize can reach.
5422
5751
  - `maxRailWidthPx: number = 440` (attribute `max-rail-width-px`) — maximum `railWidthPx` a
@@ -5434,9 +5763,12 @@ role, matching `<lr-date-input>`'s `accessibleLabel`.
5434
5763
  **Events:** `lr-mode-change` (`detail: AppRailModeChangeDetail` = `{ mode: AppRailMode }`; the
5435
5764
  effective mode changed, whether from a breakpoint crossing or an explicit `mode` assignment — not
5436
5765
  fired for a redundant reassignment to the mode already in effect), `lr-toggle`
5437
- (`detail: AppRailToggleDetail` = `{ open: boolean }`; the mobile overlay opened or closed — via the
5438
- built-in toggle button, Escape, a backdrop click, a nav-item click while open, or a breakpoint/forced
5439
- mode change leaving `'mobile'` while open — not fired when a consumer sets `open` directly),
5766
+ (`detail: AppRailToggleDetail` = `{ open: boolean }`; the mobile overlay is opening or closing — via
5767
+ the built-in toggle button, Escape, a backdrop click, a nav-item click while open, or a
5768
+ breakpoint/forced mode change leaving `'mobile'` while open — not fired when a consumer sets `open`
5769
+ directly. Cancelable for every trigger except the forced mode-change close, which always applies —
5770
+ vetoing that one would leave `open` stuck `true` in a mode where it's meaningless; call
5771
+ `preventDefault()` to keep the overlay as it is for the other triggers),
5440
5772
  `lr-rail-resize` (`detail: AppRailResizeDetail` = `{ widthPx: number }`; the `resizable` rail's
5441
5773
  width changed via drag or keyboard stepping — not fired when a consumer sets `railWidthPx` directly).
5442
5774
 
@@ -6007,6 +6339,11 @@ to `<wa-card>`'s contract, staying slot-compatible with `lr-result-card` where t
6007
6339
  reproduces a plain static card: no `tabindex`, no listeners, no events.
6008
6340
  - `href?: string` — when set, the card's root renders as a real `<a href=...>` instead of a `<div>`,
6009
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`.
6010
6347
 
6011
6348
  **Events:** `lr-card-activate` (no detail) — the whole card was activated, by click or by
6012
6349
  Enter/Space while `[part='base']` has focus. Only fired while `interactive` is set **without**
@@ -6298,7 +6635,7 @@ From the `toaster` controller — the ergonomic entry point, no manual `<lr-toas
6298
6635
  needed:
6299
6636
 
6300
6637
  ```ts
6301
- import { toast } from '@aceshooting/lyra-ui';
6638
+ import { toast } from '@aceshooting/lyra-ui/components/overlays/toast/toaster.js';
6302
6639
 
6303
6640
  toast('Saved');
6304
6641
  toast({ message: 'Deleted', variant: 'danger', action: { label: 'Undo', onClick: (item) => {/*...*/} } });
@@ -6313,7 +6650,7 @@ at another, since `placement` is a per-call option rather than a single global r
6313
6650
 
6314
6651
  ```html
6315
6652
  <script type="module">
6316
- import { toast } from '@aceshooting/lyra-ui';
6653
+ import { toast } from '@aceshooting/lyra-ui/components/overlays/toast/toaster.js';
6317
6654
  document.getElementById('save-btn').addEventListener('click', () => toast('Saved!'));
6318
6655
  </script>
6319
6656
  ```
@@ -6361,7 +6698,9 @@ the existing `flex-start` cross-axis and `start` text alignment, and `center` ce
6361
6698
  `--lr-empty-compact-padding` (default `--lr-space-xs` — padding used in compact mode),
6362
6699
  `--lr-empty-compact-gap` (default `--lr-space-2xs` — gap between the icon, heading, and description
6363
6700
  in compact mode; the non-compact layout's gap stays the plain shared `--lr-space-s` token, not
6364
- 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`,
6365
6704
  `--lr-color-text-quiet/-border/-text`).
6366
6705
 
6367
6706
  **Optional peer deps:** none.
@@ -6700,6 +7039,9 @@ back to `--lr-chip-bg`), the density quintet `--lr-chip-font-size`, `--lr-chip-p
6700
7039
  `:host([size])` rule, so setting one directly on the element overrides that step of the scale; the
6701
7040
  `m` defaults are `--lr-font-size-sm` / `--lr-size-0-25rem` / `--lr-space-s` / `--lr-space-xs` /
6702
7041
  `--lr-font-size-sm`), the height pair `--lr-chip-min-height` / `--lr-chip-height` (below),
7042
+ `--lr-chip-radius` (default `--lr-radius-pill`, the corner radius of both `[part='base']` and
7043
+ `[part='remove-button']` — retunable without a `::part()` rule, and unlike the density quintet
7044
+ above does not vary by `size`; the same `--lr-button-radius` pattern),
6703
7045
  plus shared tokens (`--lr-space-xs`, `--lr-space-s`,
6704
7046
  `--lr-color-brand`/`-brand-quiet`, `--lr-color-success`/`-success-quiet`,
6705
7047
  `--lr-color-warning`/`-warning-quiet`, `--lr-color-danger`/`-danger-quiet`,
@@ -6875,6 +7217,9 @@ near the virtual point) when one is available to give it something to observe; o
6875
7217
  the anchor point moves on its own (e.g. a graph pan/zoom tick), re-call `showAt()` with fresh
6876
7218
  coordinates to re-anchor — the popover stays open across such a call. A popover that never calls
6877
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.
6878
7223
  **Events:** `lr-show`, `lr-hide`. **Slots:** `trigger`, default content. **CSS parts:** `trigger`,
6879
7224
  `popup`, `content`. **Themeable custom properties:** `--lr-overlay-max-inline-size` (default
6880
7225
  `--lr-size-20rem` — maximum inline size of the popup).
@@ -6994,6 +7339,9 @@ color for text and border). Set one directly on the element for a tint outside t
6994
7339
  `var(--lr-space-s)`), and `--lr-badge-min-height` (default `var(--lr-size-1-25rem)`) — the density
6995
7340
  trio each `:host([size])` rule rewrites to that step's font size, inline padding, and minimum block
6996
7341
  size; the `m` defaults above exactly reproduce the pre-`size` fixed badge treatment.
7342
+ `--lr-badge-radius` (default `--lr-radius-pill`) is `[part='base']`'s corner radius, retunable
7343
+ without a `::part(base)` rule and, unlike the density trio, does not vary by `size` — the same
7344
+ `--lr-button-radius` pattern; `lr-tag` inherits it unchanged, the same as `size`.
6997
7345
 
6998
7346
  ## `lr-callout`
6999
7347
 
@@ -8429,12 +8777,24 @@ accepted), `'size'` from `maxFileSize`, or `'directory'` for a dropped folder. `
8429
8777
  when the semantic dropzone (the actual keyboard-focusable element, not the hidden native `<input>`)
8430
8778
  gains/loses focus.
8431
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
+
8432
8789
  **Slots:** default slot — custom dropzone content, overrides the `label` attribute text when
8433
8790
  provided. The accessible name always comes from `label` regardless, so icon-only slot content still
8434
8791
  announces correctly.
8435
8792
 
8436
8793
  **CSS parts:** `base`, `input`, `status` (a visually-hidden `role="status" aria-live="polite"`
8437
- 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)
8438
8798
 
8439
8799
  **Themeable custom properties:** `--lr-file-input-compact-padding` (default `var(--lr-space-s)`) —
8440
8800
  `[part='base']`'s padding while `compact`; `--lr-file-input-compact-gap` (default
@@ -9347,15 +9707,27 @@ Chart.js wrapper every other `lr-*-chart` tag subclasses; supports both a simpli
9347
9707
  - `labels: string[] = []` (attribute: false)
9348
9708
  - `datasets: Series[] = []` (attribute: false) — `Series { label: string; data?: (number|null)[];
9349
9709
  points?: {x,y,label?}[]; color?: string|string[]; fill?: boolean; width?: number; dash?: boolean;
9350
- noTooltip?: boolean; axis?: 'y'|'y2'; pointColors?: string[]; pointRadius?: number; type?:
9351
- '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.
9352
9722
  - `legend: boolean = false`
9353
9723
  - `legendPosition: LyraChartLegendPosition = 'top'` (attribute `legend-position`) — places the
9354
9724
  legend at `top`, `right`, `bottom`, or `left`; `auto` chooses right above 480px and bottom below
9355
9725
  that allocation width
9356
- - `valueFormatter?: LyraChartValueFormatter` (attribute: false) — formats numeric tick, tooltip,
9357
- and legend values; the callback receives the value and `'tick'`, `'tooltip'`, or `'legend'`
9358
- 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
9359
9731
  - `area: boolean = false`
9360
9732
  - `zoom: boolean = false` — wheel/drag/pinch zoom on the `x` axis only (pan disabled, and the zoom
9361
9733
  range is limited to the original data extent); shows the `reset-zoom-button` while zoomed
@@ -9369,6 +9741,16 @@ Chart.js wrapper every other `lr-*-chart` tag subclasses; supports both a simpli
9369
9741
  - `stacked: boolean = false` — stacks the `x`/`y`(/`y2`) scale entries `buildScales()` returns; only
9370
9742
  meaningful for `bar`/`line` types (scatter/bubble's linear `x` scale and the radial `r` scale used
9371
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`)
9372
9754
  - `config?: Partial<ChartConfiguration>` (attribute: false) — deep-merged over the generated
9373
9755
  config; any nested key wins without clobbering sibling generated keys. This is the raw Chart.js
9374
9756
  escape hatch, so a caller-supplied `config.type` is passed through rather than normalized.
@@ -9381,11 +9763,25 @@ Chart.js wrapper every other `lr-*-chart` tag subclasses; supports both a simpli
9381
9763
  - `chartArea: LyraChartArea | undefined` (readonly) — current Chart.js chart-area geometry in
9382
9764
  canvas-local coordinates (`top`, `left`, `right`, `bottom`, `width`, `height`), when a chart is
9383
9765
  drawn
9384
-
9385
- **Methods:** `resetZoom()` (reset any active zoom/pan to the original view), `refreshTheme()`
9386
- (forces a redraw so the `--lr-chart-*` tokens below are re-read from the current computed style —
9387
- the escape hatch for a consumer's own theme-toggle handler to call when it flips something, e.g. a
9388
- `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).
9389
9785
 
9390
9786
  **Events:** `lr-zoom` (`detail: { zoomed: boolean }`, fired on zoom-complete and on
9391
9787
  `resetZoom()`), `lr-point-click` (fired when a click lands on, or nearest to — intersect-only —
@@ -9431,10 +9827,9 @@ subset actually used.
9431
9827
  property values fall back to `line`. Each typed `lr-*-chart` subclass (e.g.
9432
9828
  `llms/components/lr-bar-chart.md`) locks its *own* `type` via a real prototype accessor — a
9433
9829
  genuine runtime lock, not just a compile-time default.
9434
- - no global theme-broadcast event exists to auto-retheme an already-drawn chart on a theme switch —
9435
- a consumer flipping something upstream (e.g. a `data-theme` attribute) that doesn't otherwise
9436
- change any `lr-chart` property must call `refreshTheme()` itself to make Chart.js re-read the
9437
- `--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.
9438
9833
  - generated `scales` are keyed off the *effective* type (`config.type` ?? `type`, see
9439
9834
  `effectiveType()`) and are type-appropriate: no scale at all for `type="pie"`/`"doughnut"` (true of
9440
9835
  `<lr-chart type="pie">` directly, not just the `lr-pie-chart`/`lr-doughnut-chart` subclasses),
@@ -9539,16 +9934,24 @@ passthrough). Not a subclass of `LyraChart`.
9539
9934
  every bar/segment at that index, across every dataset — e.g. to highlight a whole selected week's
9540
9935
  column in a stacked chart. Empty (the default) reproduces the exact existing output: no bar
9541
9936
  carries `data-selected`. This component takes no opinion on what the highlight looks like, only
9542
- 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.
9543
9941
  - `minBarHeight?: number` (attribute `min-bar-height`) — optional minimum visible bar height for
9544
9942
  small non-zero values
9545
9943
  - `accessibleLabel?: string` (attribute `accessible-label`) — SVG accessible-name override; a host
9546
9944
  `aria-label` wins
9945
+ - `appendData(label, values, maxPoints?)` — appends one aligned category and optionally trims the
9946
+ oldest categories
9547
9947
 
9548
9948
  **Events:** `lr-point-click` — fired when a bar/point is activated (click, or Enter/Space while
9549
9949
  focused). `detail: { datasetIndex: number, index: number, label: string | undefined, value: number
9550
9950
  | null }` — same shape as `lr-chart`'s `lr-point-click`.
9551
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
+
9552
9955
  The axis gutter/title and y-axis labels mirror to logical start under RTL. Built-in mark summaries
9553
9956
  are complete localized templates and format values with `effectiveLocale`.
9554
9957
 
@@ -9563,7 +9966,16 @@ fresh, small SVG render is cheaper and more correct than a lossy cache.
9563
9966
  `data-selected` when its category index is in `selectedIndex`), `line`, `point`, `legend`,
9564
9967
  `legend-item`, `legend-swatch`, `legend-text` (extra per-item text after the series label,
9565
9968
  rendered only when `legendText` is set), `live-region` (the current mark announcement for keyboard
9566
- 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.
9567
9979
 
9568
9980
  **Themeable custom properties:** `--lr-chart-height` (same host-level property as `lr-chart`);
9569
9981
  `--lr-chart-grid-color`, `--lr-chart-tick-color`, `--lr-chart-legend-color` — same token
@@ -9618,7 +10030,8 @@ of every entry in these lists.**
9618
10030
 
9619
10031
  **Properties:** `labels`, `datasets`, `legend`, `legendPosition` (attribute `legend-position`),
9620
10032
  `valueFormatter`, `area`, `zoom`, `height`, `xLabel` (`x-label`), `yLabel` (`y-label`), `y2Label`
9621
- (`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`
9622
10035
  (`accessible-label`), `accessibleDescription` (`accessible-description`), `showDataTable`
9623
10036
  (`show-data-table`), `chartArea` (readonly). `type` is the only member that differs: read-only,
9624
10037
  locked to this tag's value.
@@ -9639,7 +10052,7 @@ dependency fails to load — see `llms/components/lr-chart.md`).
9639
10052
  `--lr-chart-tooltip-text`.
9640
10053
 
9641
10054
  **Optional peer deps:** same as `lr-chart` — `chart.js`, plus `chartjs-plugin-zoom` only once
9642
- `zoom` is set.
10055
+ `zoom` is set, and `chartjs-plugin-datalabels` only once `data-labels`/`stack-totals` is set.
9643
10056
 
9644
10057
  ```html
9645
10058
  <lr-bar-chart legend></lr-bar-chart>
@@ -9683,8 +10096,9 @@ Bins `values` into `bins` equal-width buckets and renders as a bar chart (extend
9683
10096
  - All other `LyraChart` properties are inherited and usable: `legend`, `legendPosition` (attribute
9684
10097
  `legend-position`), `valueFormatter`, `area`, `zoom`, `config`, `height`, `xLabel` (`x-label`),
9685
10098
  `yLabel` (`y-label`), `y2Label` (`y2-label`), `beginAtZero` (`begin-at-zero`), `horizontal`,
9686
- `stacked`, `accessibleLabel` (`accessible-label`), `accessibleDescription`
9687
- (`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).
9688
10102
 
9689
10103
  **Methods:** `resetZoom()`, `refreshTheme()` — both inherited.
9690
10104
 
@@ -9748,7 +10162,8 @@ browser). Does **not** extend `LyraChart` — a deliberately bespoke API.
9748
10162
 
9749
10163
  **Slots:** `data-table` — an optional consumer-provided accessible table alternative.
9750
10164
 
9751
- **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)
9752
10167
 
9753
10168
  **Themeable custom properties:** `--lr-chart-height`, `--lr-chart-grid-color`,
9754
10169
  `--lr-chart-tick-color`, `--lr-chart-legend-color`, `--lr-chart-tooltip-bg`,
@@ -9775,10 +10190,19 @@ independently of the base `chart-loader.ts`).
9775
10190
  logical start in RTL, canvas tooltip/axis colors are token-driven, and animation is disabled
9776
10191
  under reduced motion.
9777
10192
  - If `@sgratzl/chartjs-chart-boxplot` fails to load, the component warns to the console and
9778
- resolves to no chart rather than throwing.
10193
+ fails closed with a localized `role="alert"` error part rather than leaving a blank canvas.
9779
10194
 
9780
10195
  ---
9781
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
+
9782
10206
  # Document & file viewers (`components/viewers/`)
9783
10207
 
9784
10208
  ## `lr-document-preview`
@@ -9946,9 +10370,10 @@ available, the region becomes a standard `role="progressbar"` instead, self-desc
9946
10370
  just via two different mechanisms depending on timing.
9947
10371
  - `download-link` (and thus `lr-download`) only renders/fires when `src` is set — a generic-fallback
9948
10372
  state with no `src` shows only the file glyph and message, with no download affordance at all.
9949
- - `download-link` also never renders for a `data:` URL, even though `data:` is accepted for text/image
9950
- sinks a `src="data:..."` document renders/fetches fine but falls back to no download affordance
9951
- 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.
9952
10377
  - A `src` that fails its sink's URL-safety check does **not** raise `lr-render-error` — that event is
9953
10378
  reserved for a `fetch()` that was actually attempted and failed at the network layer; an unsafe/
9954
10379
  malformed `src` is silently treated as unusable instead (a rendered `[part="error"]` message for
@@ -10098,7 +10523,12 @@ Remote resources are capped at 25 MB; exceeding it surfaces the localized
10098
10523
 
10099
10524
  **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. `foldQuotes:
10100
10525
  boolean = false` (attribute `fold-quotes`) — collapses trailing quoted-reply text/HTML behind a
10101
- 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.
10102
10532
 
10103
10533
  **Events:** `lr-render-error` with `detail.error` when fetching or parsing fails.
10104
10534
  `lr-attachment-open` — `detail: { attachment: { filename, mimeType, content? } }`, `content` a
@@ -10128,7 +10558,12 @@ contract: an absent `postal-mime` renders `[part="error"]` with the localized
10128
10558
  Fetches and parses `.ics` calendars with the optional `ical.js` peer and renders each VEVENT as
10129
10559
  plain text, including its title, start/end time, location, and description. No HTML is injected.
10130
10560
 
10131
- **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`.
10132
10567
 
10133
10568
  **Events:** `lr-render-error` with `detail.error` when fetching or parsing fails.
10134
10569
 
@@ -10152,12 +10587,17 @@ read straight from JSZip's local file header (`uncompressedSize`) when available
10152
10587
  fully decompressing only the rare entry missing that header field. The list composes
10153
10588
  `<lr-virtual-list>` for large archives.
10154
10589
 
10155
- **Properties:** `src` and `name` are strings — `name` (or a host-level `aria-label`) names the
10156
- 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`.
10157
10597
 
10158
10598
  **Events:** `lr-render-error` with `detail.error` when fetching or parsing fails.
10159
10599
 
10160
- **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`,
10161
10601
  `spinner`, and `error`. A directory row's name element carries both `entry-name` and
10162
10602
  `entry-name-dir` (a part list), so `::part(entry-name-dir)` selects only directory names while
10163
10603
  `::part(entry-name)` still selects every name. Entry rows are rendered into the embedded
@@ -10230,10 +10670,14 @@ Best-effort client-side PPTX viewer backed by the optional `@aiden0z/pptx-render
10230
10670
  localized fidelity notice is always visible because animations, equations, embedded objects,
10231
10671
  speaker notes, and several advanced effects are not rendered.
10232
10672
 
10233
- **Properties:** `src`, `name`, and `label` are strings. A host `aria-label` also names the viewer
10234
- 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.
10235
10677
 
10236
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.
10237
10681
 
10238
10682
  **Events:** `lr-load` (`detail: { slideCount }`), `lr-slide-change` (`detail: { index, count }`),
10239
10683
  and `lr-render-error` with `detail.error`.
@@ -10297,7 +10741,12 @@ Remote resources are capped at 25 MB; exceeding it surfaces the localized
10297
10741
  Fetches an HTML document, sanitizes it with the optional `dompurify` peer, and renders the safe markup
10298
10742
  inside a bounded, scrollable body.
10299
10743
 
10300
- **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.
10301
10750
 
10302
10751
  **Events:** `lr-render-error` with `detail.error` when fetching or sanitizing fails.
10303
10752
 
@@ -10373,7 +10822,12 @@ label when `FN` is absent).
10373
10822
  Remote resources are capped at 25 MB; exceeding it surfaces the localized
10374
10823
  `documentPreviewResourceTooLarge` message instead of the contacts.
10375
10824
 
10376
- **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.
10377
10831
 
10378
10832
  **Events:** `lr-render-error` with `detail.error` when fetching or parsing fails.
10379
10833
 
@@ -10589,6 +11043,11 @@ removed once it settles either way. Build error UI from `lr-include-error`.
10589
11043
  letting `fetch()` throw. `no-cors` is accepted for enum completeness but always yields an opaque
10590
11044
  response (`status` `0`, unreadable body) — a Fetch API limitation, not a bug here.
10591
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
+
10592
11051
  **Events:**
10593
11052
  - `lr-load` — `detail: { src }` — the fragment was sanitized and written into the light DOM.
10594
11053
  - `lr-include-error` — `detail: { status, reason, error? }`. `reason` is a `LyraIncludeErrorReason`:
@@ -10832,7 +11291,10 @@ collapsed-depth="2">` of the raw value instead of the map.
10832
11291
 
10833
11292
  **Properties:** `src: string = ''` — URL to fetch and parse. `name: string = ''` — accessible label,
10834
11293
  used as `<lr-map>`'s `label` and the root's `aria-label` (falling back to the localized
10835
- `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.
10836
11298
 
10837
11299
  **Events:** `lr-render-error` — `detail: { error }` — fetch, parse, or shape-validation failure.
10838
11300
 
@@ -11194,6 +11656,11 @@ streaming-indicator pulse animation's cycle, the same shared compound token
11194
11656
  background already maps to that same token, override `[part=bubble]`'s background explicitly (e.g.
11195
11657
  via `::part(bubble)`) so message bubbles stay visually distinct from the surrounding panel.
11196
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
+
11197
11664
  **Optional peer deps:** none. Internally renders a `<lr-live-region>` (a first-party sibling
11198
11665
  component, auto-imported alongside this one, not an npm peer) for the status-transition
11199
11666
  announcements described below.
@@ -11267,10 +11734,13 @@ variant), `cursor` (the blinking bar in the `cursor` variant)
11267
11734
  `size="sm"`), `--lr-typing-gap` (default `0.25rem`, `0.1875rem` at `size="sm"`),
11268
11735
  `--lr-typing-cursor-width` (default `0.125rem`, `0.09375rem` at `size="sm"`),
11269
11736
  `--lr-typing-cursor-height` (default `1em`, unaffected by `size`),
11270
- `--lr-typing-dot-stagger-1` (default `600ms`, second dot), and
11271
- `--lr-typing-dot-stagger-2` (default `1200ms`, third dot). Every variant uses the shared
11272
- `--lr-transition-ambient` compound duration/timing token (default `1.8s ease-in-out`) as its
11273
- 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.
11274
11744
 
11275
11745
  **Optional peer deps:** none.
11276
11746
 
@@ -11279,7 +11749,7 @@ animation cycle.
11279
11749
  <lr-typing-indicator variant="pulse" size="sm"></lr-typing-indicator>
11280
11750
  <lr-typing-indicator variant="cursor"></lr-typing-indicator>
11281
11751
  <lr-typing-indicator
11282
- 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"
11283
11753
  ></lr-typing-indicator>
11284
11754
  ```
11285
11755
 
@@ -11298,9 +11768,10 @@ decorative; `label` is the entire accessible content, nothing narrates individua
11298
11768
  state (`opacity: 1`, no transform, `animation: none !important`) rather than freezing on whatever
11299
11769
  frame the animation happened to be on — notably relevant for `cursor`, which would otherwise risk
11300
11770
  freezing on its invisible ("off") blink half.
11301
- - `--lr-transition-ambient` is a compound `duration timing-function` value and cannot be divided
11302
- with `calc()`. When retiming it, override both stagger properties alongside it to preserve the
11303
- 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.
11304
11775
  - `size="sm"` shrinks the dot size, gap, and cursor width, but **not** `--lr-typing-cursor-height`
11305
11776
  (still `1em` at any size) — the cursor bar's height is meant to track surrounding text size via
11306
11777
  `1em`, not the component's own `size` property.
@@ -11628,8 +12099,8 @@ in-place rename `<input>`'s own `focus`, for the same reason as `blur`)
11628
12099
 
11629
12100
  `leading`/`content`/`excerpt`/`meta` must all stay non-focusable — see the `role="button"` note below.
11630
12101
 
11631
- **CSS parts:** `base`, `option`, `content`, `title`, `title-input`, `rename-button`, `excerpt`,
11632
- `timestamp`, `actions`
12102
+ **CSS parts:** `base`, `active-indicator` (decorative, rendered only while `active`), `option`,
12103
+ `content`, `title`, `title-input`, `rename-button`, `excerpt`, `timestamp`, `actions`
11633
12104
 
11634
12105
  **Themeable custom properties:** `--lr-conversation-item-active-bg` (default
11635
12106
  `var(--lr-color-brand-quiet)`) — the row's background while `active`. `--lr-conversation-item-active-color`
@@ -11648,6 +12119,13 @@ the default active background; keep any override at 4.5:1 or better against it.
11648
12119
  custom active background needs its own title color set alongside them, or the title drops below
11649
12120
  contrast while the excerpt stays legible.
11650
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
+
11651
12129
  `--lr-conversation-item-compact-padding` (default `var(--lr-space-xs) var(--lr-space-s)`) —
11652
12130
  `[part='base']`'s padding while `compact`. `--lr-conversation-item-compact-gap` (default
11653
12131
  `var(--lr-space-2xs)`) — `[part='base']`'s gap while `compact`. Like the active-state pair, both are
@@ -11829,7 +12307,13 @@ decorative box size (clamped against `--lr-icon-button-size` via `min()`). All f
11829
12307
  uses — so `size` is the primary lever; override the cssprop directly only to retune a single tier or
11830
12308
  step outside the scale entirely. `--lr-model-select-option-active-bg` (default
11831
12309
  `var(--lr-color-brand-quiet)`) — background of a hovered or keyboard-active `[part="option"]` row;
11832
- 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
11833
12317
  shared tokens — `--lr-space-xs/-s`, `--lr-color-border/-surface/-brand/-brand-quiet/-text-quiet`,
11834
12318
  `--lr-radius`, `--lr-shadow`, `--lr-focus-ring-width/-color/-offset`, `--lr-icon-button-size`,
11835
12319
  `--lr-transition-fast`, `--lr-opacity-disabled`.
@@ -12838,7 +13322,7 @@ reach callback-rendered descendants through these parts). `row-excerpt` wraps `r
12838
13322
  output, which is slotted into the row item's own `excerpt` slot.
12839
13323
 
12840
13324
  Data mode additionally forwards each row `<lr-conversation-item>`'s own parts under a `row-item-`
12841
- 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`,
12842
13326
  `row-item-title`, `row-item-title-input`, `row-item-rename-button`, `row-item-excerpt`,
12843
13327
  `row-item-meta`, `row-item-timestamp`, `row-item-actions`.
12844
13328
 
@@ -13254,6 +13738,11 @@ referenced: `--lr-color-text-quiet`, `--lr-color-surface`, `--lr-color-border`,
13254
13738
  `--lr-space-xs/-s/-m`, `--lr-radius`, `--lr-shadow`, `--lr-focus-ring-*`,
13255
13739
  `--lr-transition-fast`.
13256
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
+
13257
13746
  **Optional peer deps:** none.
13258
13747
 
13259
13748
  ```html
@@ -13320,6 +13809,13 @@ shell around it.
13320
13809
  - `copyable: boolean = false` (reflected) — shows a copy-to-clipboard affordance alongside the
13321
13810
  fallback view, for either `fallback` kind: forwarded to `<lr-json-viewer>`'s own `copyable` for
13322
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>`.
13323
13819
 
13324
13820
  **Events:** `lr-render-error` (`detail: { toolName: string; error: unknown }`) — fired immediately
13325
13821
  before falling back to `<lr-json-viewer>`, whether because no renderer matched, a candidate
@@ -13362,10 +13858,16 @@ this same module-level registry unless a given `<lr-tool-result-view>`'s `regist
13362
13858
  set to a different `Map` instance.
13363
13859
 
13364
13860
  **`ToolRendererDefinition`** — the shape of one registered renderer:
13365
- - `render?: (result: unknown, args: unknown) => unknown` — renders the result (and the args that
13366
- produced it) as UI. Typed as `unknown` rather than Lit's `TemplateResult` so any lit-html-renderable
13367
- value works (a plain string, a DOM node, an array of templates) — consumers already own their own
13368
- 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
13369
13871
  - `matches?: (payload: unknown) => boolean` — facade/shape-based dispatch predicate, consulted only
13370
13872
  when no exact `toolName` key matches (see dispatch order below); only ever consulted *before*
13371
13873
  `load` resolves when supplied inline at registration time — a definition that needs shape-based
@@ -13378,6 +13880,27 @@ set to a different `Map` instance.
13378
13880
  object, so `load: () => import('./my-renderer.js')` works unmodified when that module's default
13379
13881
  export is itself a `ToolRendererDefinition`
13380
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
+
13381
13904
  **Exports:**
13382
13905
  - `registerToolRenderer(name: string, def: ToolRendererDefinition): void` — registers (or
13383
13906
  overwrites) the renderer for `name` in the module-level default registry
@@ -13437,6 +13960,20 @@ registerToolRenderer('web_search', {
13437
13960
  - `matches` is a linear scan over every registered definition's `matches` in registration order; it
13438
13961
  only runs when the exact-name lookup misses, so tool names with a direct registration never pay
13439
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
13440
13977
  - `fallback` implements exactly two kinds, `"json"` and `"text"`; any *other* value silently behaves
13441
13978
  as `"json"`, as does `"text"` whenever `result` isn't a string. Only `"text"` renders
13442
13979
  `[part="fallback-text"]`/`[part="fallback-copy"]`
@@ -15018,6 +15555,38 @@ retinted independently; `--lr-tool-timeline-pending-approval-border-color` (defa
15018
15555
  `var(--lr-color-warning)`) — color of the entry body's leading border while that entry's
15019
15556
  `data-pending-approval` is `"true"`.
15020
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
+
15021
15590
  # Retrieval, knowledge graph & grounding (`components/retrieval/`)
15022
15591
 
15023
15592
  ## `lr-graph`
@@ -15893,6 +16462,11 @@ directly — set instead by the `:host([status=...])` rules), plus shared tokens
15893
16462
  `--lr-color-surface`, `--lr-color-border`, `--lr-shadow`, `--lr-space-s`/`-m`,
15894
16463
  `--lr-transition-fast`, `--lr-focus-ring-*`.
15895
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
+
15896
16470
  **Optional peer deps:** none.
15897
16471
 
15898
16472
  ```html
@@ -16641,3 +17215,54 @@ falls back to that token, so rendering is unchanged. Plus shared tokens otherwis
16641
17215
  **Known gotchas:**
16642
17216
  - Every stage starts collapsed; expansion state is internal `@state` keyed by stage id, not a
16643
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`.