@aceshooting/lyra-ui 5.1.0 → 5.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 (1278) hide show
  1. package/README.md +2 -1
  2. package/custom-elements.json +5796 -354
  3. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts +9 -0
  4. package/dist/components/agent-tools/activity-feed/activity-feed.class.d.ts.map +1 -1
  5. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +33 -2
  6. package/dist/components/agent-tools/activity-feed/activity-feed.class.js.map +1 -1
  7. package/dist/components/agent-tools/activity-feed/activity-feed.styles.d.ts.map +1 -1
  8. package/dist/components/agent-tools/activity-feed/activity-feed.styles.js +34 -9
  9. package/dist/components/agent-tools/activity-feed/activity-feed.styles.js.map +1 -1
  10. package/dist/components/agent-tools/agent-run/agent-run.class.d.ts +18 -0
  11. package/dist/components/agent-tools/agent-run/agent-run.class.d.ts.map +1 -1
  12. package/dist/components/agent-tools/agent-run/agent-run.class.js +22 -0
  13. package/dist/components/agent-tools/agent-run/agent-run.class.js.map +1 -1
  14. package/dist/components/agent-tools/agent-run/agent-run.styles.d.ts.map +1 -1
  15. package/dist/components/agent-tools/agent-run/agent-run.styles.js +19 -0
  16. package/dist/components/agent-tools/agent-run/agent-run.styles.js.map +1 -1
  17. package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts +4 -0
  18. package/dist/components/agent-tools/agent-trace/agent-trace.class.d.ts.map +1 -1
  19. package/dist/components/agent-tools/agent-trace/agent-trace.class.js +4 -0
  20. package/dist/components/agent-tools/agent-trace/agent-trace.class.js.map +1 -1
  21. package/dist/components/agent-tools/agent-trace/agent-trace.styles.js +1 -1
  22. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.d.ts +7 -0
  23. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.d.ts.map +1 -1
  24. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.js +9 -2
  25. package/dist/components/agent-tools/artifact-panel/artifact-panel.class.js.map +1 -1
  26. package/dist/components/agent-tools/artifact-panel/artifact-panel.styles.d.ts.map +1 -1
  27. package/dist/components/agent-tools/artifact-panel/artifact-panel.styles.js +17 -2
  28. package/dist/components/agent-tools/artifact-panel/artifact-panel.styles.js.map +1 -1
  29. package/dist/components/agent-tools/browser-frame/browser-frame.class.d.ts.map +1 -1
  30. package/dist/components/agent-tools/browser-frame/browser-frame.class.js +18 -2
  31. package/dist/components/agent-tools/browser-frame/browser-frame.class.js.map +1 -1
  32. package/dist/components/agent-tools/browser-frame/browser-frame.styles.d.ts.map +1 -1
  33. package/dist/components/agent-tools/browser-frame/browser-frame.styles.js +4 -0
  34. package/dist/components/agent-tools/browser-frame/browser-frame.styles.js.map +1 -1
  35. package/dist/components/agent-tools/commit-card/commit-card.class.d.ts +20 -1
  36. package/dist/components/agent-tools/commit-card/commit-card.class.d.ts.map +1 -1
  37. package/dist/components/agent-tools/commit-card/commit-card.class.js +41 -4
  38. package/dist/components/agent-tools/commit-card/commit-card.class.js.map +1 -1
  39. package/dist/components/agent-tools/commit-card/commit-card.styles.d.ts.map +1 -1
  40. package/dist/components/agent-tools/commit-card/commit-card.styles.js +24 -0
  41. package/dist/components/agent-tools/commit-card/commit-card.styles.js.map +1 -1
  42. package/dist/components/agent-tools/compare-panel/compare-panel.styles.d.ts.map +1 -1
  43. package/dist/components/agent-tools/compare-panel/compare-panel.styles.js +4 -1
  44. package/dist/components/agent-tools/compare-panel/compare-panel.styles.js.map +1 -1
  45. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts +19 -0
  46. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.d.ts.map +1 -1
  47. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js +22 -0
  48. package/dist/components/agent-tools/confirm-bar/confirm-bar.class.js.map +1 -1
  49. package/dist/components/agent-tools/confirm-bar/confirm-bar.styles.d.ts.map +1 -1
  50. package/dist/components/agent-tools/confirm-bar/confirm-bar.styles.js +50 -0
  51. package/dist/components/agent-tools/confirm-bar/confirm-bar.styles.js.map +1 -1
  52. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts +7 -1
  53. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.d.ts.map +1 -1
  54. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js +17 -2
  55. package/dist/components/agent-tools/eval-dataset/eval-dataset.class.js.map +1 -1
  56. package/dist/components/agent-tools/eval-dataset/eval-dataset.styles.d.ts.map +1 -1
  57. package/dist/components/agent-tools/eval-dataset/eval-dataset.styles.js +13 -2
  58. package/dist/components/agent-tools/eval-dataset/eval-dataset.styles.js.map +1 -1
  59. package/dist/components/agent-tools/policy-summary/policy-summary.class.d.ts +10 -1
  60. package/dist/components/agent-tools/policy-summary/policy-summary.class.d.ts.map +1 -1
  61. package/dist/components/agent-tools/policy-summary/policy-summary.class.js +15 -2
  62. package/dist/components/agent-tools/policy-summary/policy-summary.class.js.map +1 -1
  63. package/dist/components/agent-tools/policy-summary/policy-summary.styles.js +3 -3
  64. package/dist/components/agent-tools/result-card/result-card.class.d.ts +18 -0
  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 +21 -0
  67. package/dist/components/agent-tools/result-card/result-card.class.js.map +1 -1
  68. package/dist/components/agent-tools/result-card/result-card.styles.d.ts.map +1 -1
  69. package/dist/components/agent-tools/result-card/result-card.styles.js +21 -0
  70. package/dist/components/agent-tools/result-card/result-card.styles.js.map +1 -1
  71. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.d.ts +3 -0
  72. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.d.ts.map +1 -1
  73. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js +3 -0
  74. package/dist/components/agent-tools/span-waterfall/span-waterfall.class.js.map +1 -1
  75. package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.d.ts.map +1 -1
  76. package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js +4 -1
  77. package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js.map +1 -1
  78. package/dist/components/agent-tools/stack-trace/stack-trace.class.d.ts +10 -1
  79. package/dist/components/agent-tools/stack-trace/stack-trace.class.d.ts.map +1 -1
  80. package/dist/components/agent-tools/stack-trace/stack-trace.class.js +28 -3
  81. package/dist/components/agent-tools/stack-trace/stack-trace.class.js.map +1 -1
  82. package/dist/components/agent-tools/stack-trace/stack-trace.styles.d.ts.map +1 -1
  83. package/dist/components/agent-tools/stack-trace/stack-trace.styles.js +14 -0
  84. package/dist/components/agent-tools/stack-trace/stack-trace.styles.js.map +1 -1
  85. package/dist/components/agent-tools/task-list/task-list.class.d.ts +18 -0
  86. package/dist/components/agent-tools/task-list/task-list.class.d.ts.map +1 -1
  87. package/dist/components/agent-tools/task-list/task-list.class.js +22 -0
  88. package/dist/components/agent-tools/task-list/task-list.class.js.map +1 -1
  89. package/dist/components/agent-tools/task-list/task-list.styles.d.ts.map +1 -1
  90. package/dist/components/agent-tools/task-list/task-list.styles.js +27 -1
  91. package/dist/components/agent-tools/task-list/task-list.styles.js.map +1 -1
  92. package/dist/components/agent-tools/terminal/terminal.class.d.ts +19 -1
  93. package/dist/components/agent-tools/terminal/terminal.class.d.ts.map +1 -1
  94. package/dist/components/agent-tools/terminal/terminal.class.js +62 -11
  95. package/dist/components/agent-tools/terminal/terminal.class.js.map +1 -1
  96. package/dist/components/agent-tools/terminal/terminal.styles.d.ts.map +1 -1
  97. package/dist/components/agent-tools/terminal/terminal.styles.js +7 -0
  98. package/dist/components/agent-tools/terminal/terminal.styles.js.map +1 -1
  99. package/dist/components/agent-tools/test-results/test-results.class.d.ts +10 -1
  100. package/dist/components/agent-tools/test-results/test-results.class.d.ts.map +1 -1
  101. package/dist/components/agent-tools/test-results/test-results.class.js +30 -3
  102. package/dist/components/agent-tools/test-results/test-results.class.js.map +1 -1
  103. package/dist/components/agent-tools/test-results/test-results.styles.d.ts.map +1 -1
  104. package/dist/components/agent-tools/test-results/test-results.styles.js +10 -3
  105. package/dist/components/agent-tools/test-results/test-results.styles.js.map +1 -1
  106. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.d.ts +4 -0
  107. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.d.ts.map +1 -1
  108. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js +30 -4
  109. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.class.js.map +1 -1
  110. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.styles.d.ts.map +1 -1
  111. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.styles.js +6 -2
  112. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.styles.js.map +1 -1
  113. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.d.ts.map +1 -1
  114. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js +10 -0
  115. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.class.js.map +1 -1
  116. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.styles.js +1 -1
  117. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts +14 -0
  118. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.d.ts.map +1 -1
  119. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +60 -1
  120. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js.map +1 -1
  121. package/dist/components/agent-tools/tool-param-form/tool-param-form.styles.d.ts.map +1 -1
  122. package/dist/components/agent-tools/tool-param-form/tool-param-form.styles.js +8 -0
  123. package/dist/components/agent-tools/tool-param-form/tool-param-form.styles.js.map +1 -1
  124. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.styles.d.ts.map +1 -1
  125. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.styles.js +8 -0
  126. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.styles.js.map +1 -1
  127. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts +5 -0
  128. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.d.ts.map +1 -1
  129. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js +5 -0
  130. package/dist/components/agent-tools/tool-timeline/tool-timeline.class.js.map +1 -1
  131. package/dist/components/agent-tools/tool-timeline/tool-timeline.styles.d.ts.map +1 -1
  132. package/dist/components/agent-tools/tool-timeline/tool-timeline.styles.js +5 -2
  133. package/dist/components/agent-tools/tool-timeline/tool-timeline.styles.js.map +1 -1
  134. package/dist/components/agent-tools/trace-tree/trace-tree.class.d.ts +14 -0
  135. package/dist/components/agent-tools/trace-tree/trace-tree.class.d.ts.map +1 -1
  136. package/dist/components/agent-tools/trace-tree/trace-tree.class.js +14 -0
  137. package/dist/components/agent-tools/trace-tree/trace-tree.class.js.map +1 -1
  138. package/dist/components/agent-tools/trace-tree/trace-tree.styles.d.ts.map +1 -1
  139. package/dist/components/agent-tools/trace-tree/trace-tree.styles.js +39 -1
  140. package/dist/components/agent-tools/trace-tree/trace-tree.styles.js.map +1 -1
  141. package/dist/components/charts/chart/chart.class.d.ts +17 -0
  142. package/dist/components/charts/chart/chart.class.d.ts.map +1 -1
  143. package/dist/components/charts/chart/chart.class.js +90 -7
  144. package/dist/components/charts/chart/chart.class.js.map +1 -1
  145. package/dist/components/charts/chart/chart.styles.d.ts.map +1 -1
  146. package/dist/components/charts/chart/chart.styles.js +13 -0
  147. package/dist/components/charts/chart/chart.styles.js.map +1 -1
  148. package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts.map +1 -1
  149. package/dist/components/conversation/agent-workspace/agent-workspace.class.js +18 -3
  150. package/dist/components/conversation/agent-workspace/agent-workspace.class.js.map +1 -1
  151. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.d.ts +11 -1
  152. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.d.ts.map +1 -1
  153. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.js +36 -1
  154. package/dist/components/conversation/audio-visualizer/audio-visualizer.class.js.map +1 -1
  155. package/dist/components/conversation/branch-picker/branch-picker.class.d.ts.map +1 -1
  156. package/dist/components/conversation/branch-picker/branch-picker.class.js +1 -0
  157. package/dist/components/conversation/branch-picker/branch-picker.class.js.map +1 -1
  158. package/dist/components/conversation/branch-picker/branch-picker.styles.d.ts.map +1 -1
  159. package/dist/components/conversation/branch-picker/branch-picker.styles.js +6 -2
  160. package/dist/components/conversation/branch-picker/branch-picker.styles.js.map +1 -1
  161. package/dist/components/conversation/chat-composer/chat-composer.class.d.ts +25 -7
  162. package/dist/components/conversation/chat-composer/chat-composer.class.d.ts.map +1 -1
  163. package/dist/components/conversation/chat-composer/chat-composer.class.js +47 -22
  164. package/dist/components/conversation/chat-composer/chat-composer.class.js.map +1 -1
  165. package/dist/components/conversation/chat-composer/chat-composer.styles.d.ts.map +1 -1
  166. package/dist/components/conversation/chat-composer/chat-composer.styles.js +30 -3
  167. package/dist/components/conversation/chat-composer/chat-composer.styles.js.map +1 -1
  168. package/dist/components/conversation/chat-message/chat-message.class.d.ts +3 -1
  169. package/dist/components/conversation/chat-message/chat-message.class.d.ts.map +1 -1
  170. package/dist/components/conversation/chat-message/chat-message.class.js +5 -1
  171. package/dist/components/conversation/chat-message/chat-message.class.js.map +1 -1
  172. package/dist/components/conversation/chat-message/chat-message.styles.d.ts.map +1 -1
  173. package/dist/components/conversation/chat-message/chat-message.styles.js +10 -2
  174. package/dist/components/conversation/chat-message/chat-message.styles.js.map +1 -1
  175. package/dist/components/conversation/chat-viewport/chat-viewport.class.d.ts +10 -2
  176. package/dist/components/conversation/chat-viewport/chat-viewport.class.d.ts.map +1 -1
  177. package/dist/components/conversation/chat-viewport/chat-viewport.class.js +42 -4
  178. package/dist/components/conversation/chat-viewport/chat-viewport.class.js.map +1 -1
  179. package/dist/components/conversation/chat-viewport/chat-viewport.styles.d.ts.map +1 -1
  180. package/dist/components/conversation/chat-viewport/chat-viewport.styles.js +30 -2
  181. package/dist/components/conversation/chat-viewport/chat-viewport.styles.js.map +1 -1
  182. package/dist/components/conversation/checkpoint/checkpoint.styles.d.ts.map +1 -1
  183. package/dist/components/conversation/checkpoint/checkpoint.styles.js +3 -0
  184. package/dist/components/conversation/checkpoint/checkpoint.styles.js.map +1 -1
  185. package/dist/components/conversation/code-block/code-block-core.class.d.ts +8 -0
  186. package/dist/components/conversation/code-block/code-block-core.class.d.ts.map +1 -1
  187. package/dist/components/conversation/code-block/code-block-core.class.js +33 -56
  188. package/dist/components/conversation/code-block/code-block-core.class.js.map +1 -1
  189. package/dist/components/conversation/code-block/code-block-shared.d.ts +27 -0
  190. package/dist/components/conversation/code-block/code-block-shared.d.ts.map +1 -1
  191. package/dist/components/conversation/code-block/code-block-shared.js +61 -0
  192. package/dist/components/conversation/code-block/code-block-shared.js.map +1 -1
  193. package/dist/components/conversation/code-block/code-block.class.d.ts +30 -8
  194. package/dist/components/conversation/code-block/code-block.class.d.ts.map +1 -1
  195. package/dist/components/conversation/code-block/code-block.class.js +76 -65
  196. package/dist/components/conversation/code-block/code-block.class.js.map +1 -1
  197. package/dist/components/conversation/code-block/code-block.styles.d.ts.map +1 -1
  198. package/dist/components/conversation/code-block/code-block.styles.js +46 -16
  199. package/dist/components/conversation/code-block/code-block.styles.js.map +1 -1
  200. package/dist/components/conversation/code-block/shiki-dark-theme.d.ts +14 -0
  201. package/dist/components/conversation/code-block/shiki-dark-theme.d.ts.map +1 -0
  202. package/dist/components/conversation/code-block/shiki-dark-theme.js +92 -0
  203. package/dist/components/conversation/code-block/shiki-dark-theme.js.map +1 -0
  204. package/dist/components/conversation/conversation-item/conversation-item.class.d.ts +22 -0
  205. package/dist/components/conversation/conversation-item/conversation-item.class.d.ts.map +1 -1
  206. package/dist/components/conversation/conversation-item/conversation-item.class.js +46 -1
  207. package/dist/components/conversation/conversation-item/conversation-item.class.js.map +1 -1
  208. package/dist/components/conversation/conversation-item/conversation-item.styles.d.ts.map +1 -1
  209. package/dist/components/conversation/conversation-item/conversation-item.styles.js +31 -2
  210. package/dist/components/conversation/conversation-item/conversation-item.styles.js.map +1 -1
  211. package/dist/components/conversation/markdown/markdown-core.class.d.ts +20 -11
  212. package/dist/components/conversation/markdown/markdown-core.class.d.ts.map +1 -1
  213. package/dist/components/conversation/markdown/markdown-core.class.js +56 -249
  214. package/dist/components/conversation/markdown/markdown-core.class.js.map +1 -1
  215. package/dist/components/conversation/markdown/markdown-loader.d.ts +1 -3
  216. package/dist/components/conversation/markdown/markdown-loader.d.ts.map +1 -1
  217. package/dist/components/conversation/markdown/markdown-loader.js +7 -1
  218. package/dist/components/conversation/markdown/markdown-loader.js.map +1 -1
  219. package/dist/components/conversation/markdown/markdown-shared.d.ts +93 -0
  220. package/dist/components/conversation/markdown/markdown-shared.d.ts.map +1 -0
  221. package/dist/components/conversation/markdown/markdown-shared.js +252 -0
  222. package/dist/components/conversation/markdown/markdown-shared.js.map +1 -0
  223. package/dist/components/conversation/markdown/markdown.class.d.ts +20 -11
  224. package/dist/components/conversation/markdown/markdown.class.d.ts.map +1 -1
  225. package/dist/components/conversation/markdown/markdown.class.js +56 -249
  226. package/dist/components/conversation/markdown/markdown.class.js.map +1 -1
  227. package/dist/components/conversation/markdown/markdown.styles.d.ts.map +1 -1
  228. package/dist/components/conversation/markdown/markdown.styles.js +19 -0
  229. package/dist/components/conversation/markdown/markdown.styles.js.map +1 -1
  230. package/dist/components/conversation/message-actions/message-actions.styles.d.ts.map +1 -1
  231. package/dist/components/conversation/message-actions/message-actions.styles.js +4 -0
  232. package/dist/components/conversation/message-actions/message-actions.styles.js.map +1 -1
  233. package/dist/components/conversation/message-feedback/message-feedback.class.d.ts +24 -0
  234. package/dist/components/conversation/message-feedback/message-feedback.class.d.ts.map +1 -1
  235. package/dist/components/conversation/message-feedback/message-feedback.class.js +34 -1
  236. package/dist/components/conversation/message-feedback/message-feedback.class.js.map +1 -1
  237. package/dist/components/conversation/message-feedback/message-feedback.styles.d.ts.map +1 -1
  238. package/dist/components/conversation/message-feedback/message-feedback.styles.js +23 -9
  239. package/dist/components/conversation/message-feedback/message-feedback.styles.js.map +1 -1
  240. package/dist/components/conversation/model-select/model-select.class.d.ts +21 -0
  241. package/dist/components/conversation/model-select/model-select.class.d.ts.map +1 -1
  242. package/dist/components/conversation/model-select/model-select.class.js +65 -1
  243. package/dist/components/conversation/model-select/model-select.class.js.map +1 -1
  244. package/dist/components/conversation/model-select/model-select.styles.d.ts.map +1 -1
  245. package/dist/components/conversation/model-select/model-select.styles.js +45 -6
  246. package/dist/components/conversation/model-select/model-select.styles.js.map +1 -1
  247. package/dist/components/conversation/push-to-talk/push-to-talk.class.d.ts +3 -0
  248. package/dist/components/conversation/push-to-talk/push-to-talk.class.d.ts.map +1 -1
  249. package/dist/components/conversation/push-to-talk/push-to-talk.class.js +17 -1
  250. package/dist/components/conversation/push-to-talk/push-to-talk.class.js.map +1 -1
  251. package/dist/components/conversation/push-to-talk/push-to-talk.styles.d.ts.map +1 -1
  252. package/dist/components/conversation/push-to-talk/push-to-talk.styles.js +12 -3
  253. package/dist/components/conversation/push-to-talk/push-to-talk.styles.js.map +1 -1
  254. package/dist/components/conversation/suggestion-chips/suggestion-chips.class.d.ts +2 -0
  255. package/dist/components/conversation/suggestion-chips/suggestion-chips.class.d.ts.map +1 -1
  256. package/dist/components/conversation/suggestion-chips/suggestion-chips.class.js +2 -0
  257. package/dist/components/conversation/suggestion-chips/suggestion-chips.class.js.map +1 -1
  258. package/dist/components/conversation/suggestion-chips/suggestion-chips.styles.js +2 -2
  259. package/dist/components/conversation/thread-list/thread-list.class.d.ts +67 -5
  260. package/dist/components/conversation/thread-list/thread-list.class.d.ts.map +1 -1
  261. package/dist/components/conversation/thread-list/thread-list.class.js +161 -23
  262. package/dist/components/conversation/thread-list/thread-list.class.js.map +1 -1
  263. package/dist/components/conversation/thread-list/thread-list.styles.d.ts.map +1 -1
  264. package/dist/components/conversation/thread-list/thread-list.styles.js +33 -1
  265. package/dist/components/conversation/thread-list/thread-list.styles.js.map +1 -1
  266. package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts.map +1 -1
  267. package/dist/components/conversation/transcript-feed/transcript-feed.class.js +18 -1
  268. package/dist/components/conversation/transcript-feed/transcript-feed.class.js.map +1 -1
  269. package/dist/components/conversation/transcript-feed/transcript-feed.styles.d.ts.map +1 -1
  270. package/dist/components/conversation/transcript-feed/transcript-feed.styles.js +4 -0
  271. package/dist/components/conversation/transcript-feed/transcript-feed.styles.js.map +1 -1
  272. package/dist/components/conversation/typing-indicator/typing-indicator.class.d.ts +14 -10
  273. package/dist/components/conversation/typing-indicator/typing-indicator.class.d.ts.map +1 -1
  274. package/dist/components/conversation/typing-indicator/typing-indicator.class.js +26 -11
  275. package/dist/components/conversation/typing-indicator/typing-indicator.class.js.map +1 -1
  276. package/dist/components/conversation/usage-badge/usage-badge.class.d.ts +4 -0
  277. package/dist/components/conversation/usage-badge/usage-badge.class.d.ts.map +1 -1
  278. package/dist/components/conversation/usage-badge/usage-badge.class.js +15 -1
  279. package/dist/components/conversation/usage-badge/usage-badge.class.js.map +1 -1
  280. package/dist/components/conversation/usage-badge/usage-badge.styles.js +1 -1
  281. package/dist/components/conversation/voice-picker/voice-picker.class.d.ts +12 -0
  282. package/dist/components/conversation/voice-picker/voice-picker.class.d.ts.map +1 -1
  283. package/dist/components/conversation/voice-picker/voice-picker.class.js +35 -1
  284. package/dist/components/conversation/voice-picker/voice-picker.class.js.map +1 -1
  285. package/dist/components/conversation/voice-picker/voice-picker.styles.d.ts.map +1 -1
  286. package/dist/components/conversation/voice-picker/voice-picker.styles.js +17 -1
  287. package/dist/components/conversation/voice-picker/voice-picker.styles.js.map +1 -1
  288. package/dist/components/data/calendar/calendar.class.d.ts +2 -1
  289. package/dist/components/data/calendar/calendar.class.d.ts.map +1 -1
  290. package/dist/components/data/calendar/calendar.class.js +3 -2
  291. package/dist/components/data/calendar/calendar.class.js.map +1 -1
  292. package/dist/components/data/calendar/calendar.styles.d.ts.map +1 -1
  293. package/dist/components/data/calendar/calendar.styles.js +39 -5
  294. package/dist/components/data/calendar/calendar.styles.js.map +1 -1
  295. package/dist/components/data/data-grid/data-grid.class.d.ts +4 -0
  296. package/dist/components/data/data-grid/data-grid.class.d.ts.map +1 -1
  297. package/dist/components/data/data-grid/data-grid.class.js +4 -0
  298. package/dist/components/data/data-grid/data-grid.class.js.map +1 -1
  299. package/dist/components/data/data-grid/data-grid.styles.d.ts.map +1 -1
  300. package/dist/components/data/data-grid/data-grid.styles.js +4 -2
  301. package/dist/components/data/data-grid/data-grid.styles.js.map +1 -1
  302. package/dist/components/data/env-list/env-list.class.d.ts +5 -0
  303. package/dist/components/data/env-list/env-list.class.d.ts.map +1 -1
  304. package/dist/components/data/env-list/env-list.class.js +22 -2
  305. package/dist/components/data/env-list/env-list.class.js.map +1 -1
  306. package/dist/components/data/env-list/env-list.styles.d.ts.map +1 -1
  307. package/dist/components/data/env-list/env-list.styles.js +6 -2
  308. package/dist/components/data/env-list/env-list.styles.js.map +1 -1
  309. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts +10 -0
  310. package/dist/components/data/flow-canvas/flow-canvas.class.d.ts.map +1 -1
  311. package/dist/components/data/flow-canvas/flow-canvas.class.js +24 -3
  312. package/dist/components/data/flow-canvas/flow-canvas.class.js.map +1 -1
  313. package/dist/components/data/flow-canvas/flow-canvas.styles.d.ts.map +1 -1
  314. package/dist/components/data/flow-canvas/flow-canvas.styles.js +14 -4
  315. package/dist/components/data/flow-canvas/flow-canvas.styles.js.map +1 -1
  316. package/dist/components/data/flow-controls/flow-controls.class.d.ts +16 -1
  317. package/dist/components/data/flow-controls/flow-controls.class.d.ts.map +1 -1
  318. package/dist/components/data/flow-controls/flow-controls.class.js +17 -1
  319. package/dist/components/data/flow-controls/flow-controls.class.js.map +1 -1
  320. package/dist/components/data/flow-controls/flow-controls.styles.d.ts.map +1 -1
  321. package/dist/components/data/flow-controls/flow-controls.styles.js +26 -2
  322. package/dist/components/data/flow-controls/flow-controls.styles.js.map +1 -1
  323. package/dist/components/data/flow-minimap/flow-minimap.styles.d.ts.map +1 -1
  324. package/dist/components/data/flow-minimap/flow-minimap.styles.js +4 -0
  325. package/dist/components/data/flow-minimap/flow-minimap.styles.js.map +1 -1
  326. package/dist/components/data/flow-node/flow-node.class.d.ts +20 -1
  327. package/dist/components/data/flow-node/flow-node.class.d.ts.map +1 -1
  328. package/dist/components/data/flow-node/flow-node.class.js +24 -2
  329. package/dist/components/data/flow-node/flow-node.class.js.map +1 -1
  330. package/dist/components/data/flow-node/flow-node.styles.d.ts.map +1 -1
  331. package/dist/components/data/flow-node/flow-node.styles.js +23 -5
  332. package/dist/components/data/flow-node/flow-node.styles.js.map +1 -1
  333. package/dist/components/data/flow-run-overlay/flow-run-overlay.class.d.ts +9 -1
  334. package/dist/components/data/flow-run-overlay/flow-run-overlay.class.d.ts.map +1 -1
  335. package/dist/components/data/flow-run-overlay/flow-run-overlay.class.js +9 -1
  336. package/dist/components/data/flow-run-overlay/flow-run-overlay.class.js.map +1 -1
  337. package/dist/components/data/flow-run-overlay/flow-run-overlay.styles.d.ts.map +1 -1
  338. package/dist/components/data/flow-run-overlay/flow-run-overlay.styles.js +11 -0
  339. package/dist/components/data/flow-run-overlay/flow-run-overlay.styles.js.map +1 -1
  340. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +15 -1
  341. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts.map +1 -1
  342. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +40 -3
  343. package/dist/components/data/graph-query-builder/graph-query-builder.class.js.map +1 -1
  344. package/dist/components/data/graph-query-builder/graph-query-builder.styles.d.ts.map +1 -1
  345. package/dist/components/data/graph-query-builder/graph-query-builder.styles.js +7 -1
  346. package/dist/components/data/graph-query-builder/graph-query-builder.styles.js.map +1 -1
  347. package/dist/components/data/heatmap/heatmap.class.d.ts +107 -7
  348. package/dist/components/data/heatmap/heatmap.class.d.ts.map +1 -1
  349. package/dist/components/data/heatmap/heatmap.class.js +174 -19
  350. package/dist/components/data/heatmap/heatmap.class.js.map +1 -1
  351. package/dist/components/data/heatmap/heatmap.styles.d.ts.map +1 -1
  352. package/dist/components/data/heatmap/heatmap.styles.js +20 -0
  353. package/dist/components/data/heatmap/heatmap.styles.js.map +1 -1
  354. package/dist/components/data/pagination/pagination.class.d.ts +3 -0
  355. package/dist/components/data/pagination/pagination.class.d.ts.map +1 -1
  356. package/dist/components/data/pagination/pagination.class.js +3 -0
  357. package/dist/components/data/pagination/pagination.class.js.map +1 -1
  358. package/dist/components/data/pagination/pagination.styles.d.ts.map +1 -1
  359. package/dist/components/data/pagination/pagination.styles.js +22 -4
  360. package/dist/components/data/pagination/pagination.styles.js.map +1 -1
  361. package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +13 -3
  362. package/dist/components/data/sequence-strip/sequence-strip.class.d.ts.map +1 -1
  363. package/dist/components/data/sequence-strip/sequence-strip.class.js +30 -7
  364. package/dist/components/data/sequence-strip/sequence-strip.class.js.map +1 -1
  365. package/dist/components/data/sequence-strip/sequence-strip.styles.d.ts.map +1 -1
  366. package/dist/components/data/sequence-strip/sequence-strip.styles.js +11 -1
  367. package/dist/components/data/sequence-strip/sequence-strip.styles.js.map +1 -1
  368. package/dist/components/data/stat/stat.class.d.ts +33 -4
  369. package/dist/components/data/stat/stat.class.d.ts.map +1 -1
  370. package/dist/components/data/stat/stat.class.js +35 -6
  371. package/dist/components/data/stat/stat.class.js.map +1 -1
  372. package/dist/components/data/stat/stat.styles.d.ts.map +1 -1
  373. package/dist/components/data/stat/stat.styles.js +69 -5
  374. package/dist/components/data/stat/stat.styles.js.map +1 -1
  375. package/dist/components/data/table/table.class.d.ts +238 -11
  376. package/dist/components/data/table/table.class.d.ts.map +1 -1
  377. package/dist/components/data/table/table.class.js +470 -84
  378. package/dist/components/data/table/table.class.js.map +1 -1
  379. package/dist/components/data/table/table.styles.d.ts.map +1 -1
  380. package/dist/components/data/table/table.styles.js +46 -4
  381. package/dist/components/data/table/table.styles.js.map +1 -1
  382. package/dist/components/data/timeline/timeline-item.class.d.ts +2 -2
  383. package/dist/components/data/timeline/timeline-item.class.d.ts.map +1 -1
  384. package/dist/components/data/timeline/timeline-item.class.js +2 -1
  385. package/dist/components/data/timeline/timeline-item.class.js.map +1 -1
  386. package/dist/components/data/timeline/timeline.class.d.ts +4 -4
  387. package/dist/components/data/timeline/timeline.class.d.ts.map +1 -1
  388. package/dist/components/data/timeline/timeline.class.js +4 -3
  389. package/dist/components/data/timeline/timeline.class.js.map +1 -1
  390. package/dist/components/data/timeline/timeline.styles.d.ts.map +1 -1
  391. package/dist/components/data/timeline/timeline.styles.js +21 -2
  392. package/dist/components/data/timeline/timeline.styles.js.map +1 -1
  393. package/dist/components/data/tree/tree-node.class.d.ts +2 -2
  394. package/dist/components/data/tree/tree-node.class.d.ts.map +1 -1
  395. package/dist/components/data/tree/tree-node.class.js +2 -1
  396. package/dist/components/data/tree/tree-node.class.js.map +1 -1
  397. package/dist/components/data/tree/tree.class.d.ts +53 -2
  398. package/dist/components/data/tree/tree.class.d.ts.map +1 -1
  399. package/dist/components/data/tree/tree.class.js +138 -13
  400. package/dist/components/data/tree/tree.class.js.map +1 -1
  401. package/dist/components/data/tree/tree.styles.d.ts.map +1 -1
  402. package/dist/components/data/tree/tree.styles.js +6 -1
  403. package/dist/components/data/tree/tree.styles.js.map +1 -1
  404. package/dist/components/data/word-cloud/word-cloud.class.d.ts.map +1 -1
  405. package/dist/components/data/word-cloud/word-cloud.class.js +1 -0
  406. package/dist/components/data/word-cloud/word-cloud.class.js.map +1 -1
  407. package/dist/components/forms/button/button.class.d.ts +30 -4
  408. package/dist/components/forms/button/button.class.d.ts.map +1 -1
  409. package/dist/components/forms/button/button.class.js +46 -5
  410. package/dist/components/forms/button/button.class.js.map +1 -1
  411. package/dist/components/forms/button/button.styles.d.ts.map +1 -1
  412. package/dist/components/forms/button/button.styles.js +74 -42
  413. package/dist/components/forms/button/button.styles.js.map +1 -1
  414. package/dist/components/forms/checkbox/checkbox.class.d.ts +19 -2
  415. package/dist/components/forms/checkbox/checkbox.class.d.ts.map +1 -1
  416. package/dist/components/forms/checkbox/checkbox.class.js +57 -2
  417. package/dist/components/forms/checkbox/checkbox.class.js.map +1 -1
  418. package/dist/components/forms/checkbox/checkbox.styles.d.ts.map +1 -1
  419. package/dist/components/forms/checkbox/checkbox.styles.js +24 -3
  420. package/dist/components/forms/checkbox/checkbox.styles.js.map +1 -1
  421. package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts +26 -1
  422. package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts.map +1 -1
  423. package/dist/components/forms/checkbox-group/checkbox-group.class.js +115 -6
  424. package/dist/components/forms/checkbox-group/checkbox-group.class.js.map +1 -1
  425. package/dist/components/forms/checkbox-group/checkbox-group.styles.d.ts.map +1 -1
  426. package/dist/components/forms/checkbox-group/checkbox-group.styles.js +9 -1
  427. package/dist/components/forms/checkbox-group/checkbox-group.styles.js.map +1 -1
  428. package/dist/components/forms/code-editor/code-editor.class.d.ts +1 -1
  429. package/dist/components/forms/code-editor/code-editor.class.d.ts.map +1 -1
  430. package/dist/components/forms/code-editor/code-editor.class.js +18 -2
  431. package/dist/components/forms/code-editor/code-editor.class.js.map +1 -1
  432. package/dist/components/forms/code-editor/code-editor.styles.d.ts.map +1 -1
  433. package/dist/components/forms/code-editor/code-editor.styles.js +14 -1
  434. package/dist/components/forms/code-editor/code-editor.styles.js.map +1 -1
  435. package/dist/components/forms/color-picker/color-picker.styles.d.ts.map +1 -1
  436. package/dist/components/forms/color-picker/color-picker.styles.js +2 -0
  437. package/dist/components/forms/color-picker/color-picker.styles.js.map +1 -1
  438. package/dist/components/forms/combobox/combobox.class.d.ts +46 -6
  439. package/dist/components/forms/combobox/combobox.class.d.ts.map +1 -1
  440. package/dist/components/forms/combobox/combobox.class.js +136 -20
  441. package/dist/components/forms/combobox/combobox.class.js.map +1 -1
  442. package/dist/components/forms/combobox/combobox.styles.d.ts.map +1 -1
  443. package/dist/components/forms/combobox/combobox.styles.js +41 -3
  444. package/dist/components/forms/combobox/combobox.styles.js.map +1 -1
  445. package/dist/components/forms/date-picker/date-input.class.d.ts +17 -0
  446. package/dist/components/forms/date-picker/date-input.class.d.ts.map +1 -1
  447. package/dist/components/forms/date-picker/date-input.class.js +35 -0
  448. package/dist/components/forms/date-picker/date-input.class.js.map +1 -1
  449. package/dist/components/forms/date-picker/date-input.styles.d.ts.map +1 -1
  450. package/dist/components/forms/date-picker/date-input.styles.js +46 -4
  451. package/dist/components/forms/date-picker/date-input.styles.js.map +1 -1
  452. package/dist/components/forms/date-picker/date-picker.class.d.ts +1 -1
  453. package/dist/components/forms/date-picker/date-picker.class.d.ts.map +1 -1
  454. package/dist/components/forms/date-picker/date-picker.class.js +5 -1
  455. package/dist/components/forms/date-picker/date-picker.class.js.map +1 -1
  456. package/dist/components/forms/date-picker/date-picker.styles.d.ts.map +1 -1
  457. package/dist/components/forms/date-picker/date-picker.styles.js +4 -0
  458. package/dist/components/forms/date-picker/date-picker.styles.js.map +1 -1
  459. package/dist/components/forms/emoji-picker/emoji-data-loader.js +8 -1
  460. package/dist/components/forms/emoji-picker/emoji-data-loader.js.map +1 -1
  461. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +46 -1
  462. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts.map +1 -1
  463. package/dist/components/forms/emoji-picker/emoji-picker.class.js +142 -27
  464. package/dist/components/forms/emoji-picker/emoji-picker.class.js.map +1 -1
  465. package/dist/components/forms/emoji-picker/emoji-picker.styles.d.ts.map +1 -1
  466. package/dist/components/forms/emoji-picker/emoji-picker.styles.js +54 -1
  467. package/dist/components/forms/emoji-picker/emoji-picker.styles.js.map +1 -1
  468. package/dist/components/forms/icon-button/icon-button.class.d.ts +36 -6
  469. package/dist/components/forms/icon-button/icon-button.class.d.ts.map +1 -1
  470. package/dist/components/forms/icon-button/icon-button.class.js +59 -13
  471. package/dist/components/forms/icon-button/icon-button.class.js.map +1 -1
  472. package/dist/components/forms/icon-button/icon-button.styles.d.ts.map +1 -1
  473. package/dist/components/forms/icon-button/icon-button.styles.js +4 -1
  474. package/dist/components/forms/icon-button/icon-button.styles.js.map +1 -1
  475. package/dist/components/forms/input/input.class.d.ts +25 -0
  476. package/dist/components/forms/input/input.class.d.ts.map +1 -1
  477. package/dist/components/forms/input/input.class.js +45 -0
  478. package/dist/components/forms/input/input.class.js.map +1 -1
  479. package/dist/components/forms/input/input.styles.d.ts.map +1 -1
  480. package/dist/components/forms/input/input.styles.js +27 -2
  481. package/dist/components/forms/input/input.styles.js.map +1 -1
  482. package/dist/components/forms/phone-input/phone-input.class.d.ts +34 -1
  483. package/dist/components/forms/phone-input/phone-input.class.d.ts.map +1 -1
  484. package/dist/components/forms/phone-input/phone-input.class.js +61 -13
  485. package/dist/components/forms/phone-input/phone-input.class.js.map +1 -1
  486. package/dist/components/forms/phone-input/phone-input.styles.d.ts.map +1 -1
  487. package/dist/components/forms/phone-input/phone-input.styles.js +92 -9
  488. package/dist/components/forms/phone-input/phone-input.styles.js.map +1 -1
  489. package/dist/components/forms/radio/radio.class.d.ts +24 -0
  490. package/dist/components/forms/radio/radio.class.d.ts.map +1 -1
  491. package/dist/components/forms/radio/radio.class.js +50 -1
  492. package/dist/components/forms/radio/radio.class.js.map +1 -1
  493. package/dist/components/forms/radio/radio.styles.d.ts.map +1 -1
  494. package/dist/components/forms/radio/radio.styles.js +36 -5
  495. package/dist/components/forms/radio/radio.styles.js.map +1 -1
  496. package/dist/components/forms/rubric-form/rubric-form.class.d.ts +9 -7
  497. package/dist/components/forms/rubric-form/rubric-form.class.d.ts.map +1 -1
  498. package/dist/components/forms/rubric-form/rubric-form.class.js +34 -8
  499. package/dist/components/forms/rubric-form/rubric-form.class.js.map +1 -1
  500. package/dist/components/forms/rubric-form/rubric-form.styles.d.ts.map +1 -1
  501. package/dist/components/forms/rubric-form/rubric-form.styles.js +7 -1
  502. package/dist/components/forms/rubric-form/rubric-form.styles.js.map +1 -1
  503. package/dist/components/forms/select/select.class.d.ts +26 -7
  504. package/dist/components/forms/select/select.class.d.ts.map +1 -1
  505. package/dist/components/forms/select/select.class.js +86 -8
  506. package/dist/components/forms/select/select.class.js.map +1 -1
  507. package/dist/components/forms/select/select.styles.d.ts.map +1 -1
  508. package/dist/components/forms/select/select.styles.js +39 -19
  509. package/dist/components/forms/select/select.styles.js.map +1 -1
  510. package/dist/components/forms/slider/slider.class.d.ts +5 -6
  511. package/dist/components/forms/slider/slider.class.d.ts.map +1 -1
  512. package/dist/components/forms/slider/slider.class.js +20 -7
  513. package/dist/components/forms/slider/slider.class.js.map +1 -1
  514. package/dist/components/forms/slider/slider.styles.d.ts.map +1 -1
  515. package/dist/components/forms/slider/slider.styles.js +8 -0
  516. package/dist/components/forms/slider/slider.styles.js.map +1 -1
  517. package/dist/components/forms/switch/switch.class.d.ts +7 -2
  518. package/dist/components/forms/switch/switch.class.d.ts.map +1 -1
  519. package/dist/components/forms/switch/switch.class.js +48 -2
  520. package/dist/components/forms/switch/switch.class.js.map +1 -1
  521. package/dist/components/forms/switch/switch.styles.d.ts.map +1 -1
  522. package/dist/components/forms/switch/switch.styles.js +8 -0
  523. package/dist/components/forms/switch/switch.styles.js.map +1 -1
  524. package/dist/components/forms/textarea/textarea.class.d.ts +1 -1
  525. package/dist/components/forms/textarea/textarea.class.d.ts.map +1 -1
  526. package/dist/components/forms/textarea/textarea.class.js +5 -1
  527. package/dist/components/forms/textarea/textarea.class.js.map +1 -1
  528. package/dist/components/forms/textarea/textarea.styles.d.ts.map +1 -1
  529. package/dist/components/forms/textarea/textarea.styles.js +8 -0
  530. package/dist/components/forms/textarea/textarea.styles.js.map +1 -1
  531. package/dist/components/forms/time-range/time-range.class.d.ts +8 -0
  532. package/dist/components/forms/time-range/time-range.class.d.ts.map +1 -1
  533. package/dist/components/forms/time-range/time-range.class.js +47 -1
  534. package/dist/components/forms/time-range/time-range.class.js.map +1 -1
  535. package/dist/components/forms/time-range/time-range.styles.d.ts.map +1 -1
  536. package/dist/components/forms/time-range/time-range.styles.js +32 -7
  537. package/dist/components/forms/time-range/time-range.styles.js.map +1 -1
  538. package/dist/components/forms/token-input/token-input.class.d.ts +61 -3
  539. package/dist/components/forms/token-input/token-input.class.d.ts.map +1 -1
  540. package/dist/components/forms/token-input/token-input.class.js +253 -10
  541. package/dist/components/forms/token-input/token-input.class.js.map +1 -1
  542. package/dist/components/forms/token-input/token-input.styles.d.ts.map +1 -1
  543. package/dist/components/forms/token-input/token-input.styles.js +16 -1
  544. package/dist/components/forms/token-input/token-input.styles.js.map +1 -1
  545. package/dist/components/layout/app-rail/app-rail-item.class.d.ts +6 -0
  546. package/dist/components/layout/app-rail/app-rail-item.class.d.ts.map +1 -1
  547. package/dist/components/layout/app-rail/app-rail-item.class.js +6 -0
  548. package/dist/components/layout/app-rail/app-rail-item.class.js.map +1 -1
  549. package/dist/components/layout/app-rail/app-rail-item.styles.d.ts.map +1 -1
  550. package/dist/components/layout/app-rail/app-rail-item.styles.js +11 -2
  551. package/dist/components/layout/app-rail/app-rail-item.styles.js.map +1 -1
  552. package/dist/components/layout/breadcrumb/breadcrumb-item.class.d.ts +4 -0
  553. package/dist/components/layout/breadcrumb/breadcrumb-item.class.d.ts.map +1 -1
  554. package/dist/components/layout/breadcrumb/breadcrumb-item.class.js +4 -0
  555. package/dist/components/layout/breadcrumb/breadcrumb-item.class.js.map +1 -1
  556. package/dist/components/layout/breadcrumb/breadcrumb-item.styles.d.ts.map +1 -1
  557. package/dist/components/layout/breadcrumb/breadcrumb-item.styles.js +6 -1
  558. package/dist/components/layout/breadcrumb/breadcrumb-item.styles.js.map +1 -1
  559. package/dist/components/layout/card/card.class.d.ts +29 -5
  560. package/dist/components/layout/card/card.class.d.ts.map +1 -1
  561. package/dist/components/layout/card/card.class.js +90 -6
  562. package/dist/components/layout/card/card.class.js.map +1 -1
  563. package/dist/components/layout/card/card.styles.d.ts.map +1 -1
  564. package/dist/components/layout/card/card.styles.js +8 -0
  565. package/dist/components/layout/card/card.styles.js.map +1 -1
  566. package/dist/components/layout/carousel/carousel.class.d.ts +6 -0
  567. package/dist/components/layout/carousel/carousel.class.d.ts.map +1 -1
  568. package/dist/components/layout/carousel/carousel.class.js +22 -1
  569. package/dist/components/layout/carousel/carousel.class.js.map +1 -1
  570. package/dist/components/layout/carousel/carousel.styles.d.ts.map +1 -1
  571. package/dist/components/layout/carousel/carousel.styles.js +10 -0
  572. package/dist/components/layout/carousel/carousel.styles.js.map +1 -1
  573. package/dist/components/layout/command-palette/command-palette.class.d.ts +8 -0
  574. package/dist/components/layout/command-palette/command-palette.class.d.ts.map +1 -1
  575. package/dist/components/layout/command-palette/command-palette.class.js +6 -1
  576. package/dist/components/layout/command-palette/command-palette.class.js.map +1 -1
  577. package/dist/components/layout/command-palette/command-palette.styles.d.ts.map +1 -1
  578. package/dist/components/layout/command-palette/command-palette.styles.js +11 -2
  579. package/dist/components/layout/command-palette/command-palette.styles.js.map +1 -1
  580. package/dist/components/layout/dashboard-grid/dashboard-grid.class.d.ts.map +1 -1
  581. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js +1 -0
  582. package/dist/components/layout/dashboard-grid/dashboard-grid.class.js.map +1 -1
  583. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.d.ts.map +1 -1
  584. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js +15 -0
  585. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js.map +1 -1
  586. package/dist/components/layout/details/details.class.js +1 -1
  587. package/dist/components/layout/details/details.class.js.map +1 -1
  588. package/dist/components/layout/details/details.styles.d.ts.map +1 -1
  589. package/dist/components/layout/details/details.styles.js +2 -0
  590. package/dist/components/layout/details/details.styles.js.map +1 -1
  591. package/dist/components/layout/dock-panel/dock-panel.class.d.ts.map +1 -1
  592. package/dist/components/layout/dock-panel/dock-panel.class.js +16 -1
  593. package/dist/components/layout/dock-panel/dock-panel.class.js.map +1 -1
  594. package/dist/components/layout/drilldown-panel/drilldown-panel.class.d.ts.map +1 -1
  595. package/dist/components/layout/drilldown-panel/drilldown-panel.class.js +15 -1
  596. package/dist/components/layout/drilldown-panel/drilldown-panel.class.js.map +1 -1
  597. package/dist/components/layout/filter-bar/filter-bar.class.d.ts +54 -9
  598. package/dist/components/layout/filter-bar/filter-bar.class.d.ts.map +1 -1
  599. package/dist/components/layout/filter-bar/filter-bar.class.js +149 -5
  600. package/dist/components/layout/filter-bar/filter-bar.class.js.map +1 -1
  601. package/dist/components/layout/filter-bar/filter-bar.d.ts +1 -0
  602. package/dist/components/layout/filter-bar/filter-bar.d.ts.map +1 -1
  603. package/dist/components/layout/filter-bar/filter-bar.js +1 -0
  604. package/dist/components/layout/filter-bar/filter-bar.js.map +1 -1
  605. package/dist/components/layout/filter-bar/filter-bar.styles.d.ts.map +1 -1
  606. package/dist/components/layout/filter-bar/filter-bar.styles.js +12 -3
  607. package/dist/components/layout/filter-bar/filter-bar.styles.js.map +1 -1
  608. package/dist/components/layout/menu/menu.class.d.ts +119 -24
  609. package/dist/components/layout/menu/menu.class.d.ts.map +1 -1
  610. package/dist/components/layout/menu/menu.class.js +202 -35
  611. package/dist/components/layout/menu/menu.class.js.map +1 -1
  612. package/dist/components/layout/menu/menu.styles.d.ts.map +1 -1
  613. package/dist/components/layout/menu/menu.styles.js +38 -1
  614. package/dist/components/layout/menu/menu.styles.js.map +1 -1
  615. package/dist/components/layout/responsive-panel/responsive-panel.class.d.ts +2 -0
  616. package/dist/components/layout/responsive-panel/responsive-panel.class.d.ts.map +1 -1
  617. package/dist/components/layout/responsive-panel/responsive-panel.class.js +4 -0
  618. package/dist/components/layout/responsive-panel/responsive-panel.class.js.map +1 -1
  619. package/dist/components/layout/responsive-panel/responsive-panel.styles.d.ts.map +1 -1
  620. package/dist/components/layout/responsive-panel/responsive-panel.styles.js +12 -2
  621. package/dist/components/layout/responsive-panel/responsive-panel.styles.js.map +1 -1
  622. package/dist/components/layout/scroller/scroller.styles.d.ts.map +1 -1
  623. package/dist/components/layout/scroller/scroller.styles.js +4 -0
  624. package/dist/components/layout/scroller/scroller.styles.js.map +1 -1
  625. package/dist/components/layout/segmented/segmented.class.d.ts +20 -2
  626. package/dist/components/layout/segmented/segmented.class.d.ts.map +1 -1
  627. package/dist/components/layout/segmented/segmented.class.js +20 -2
  628. package/dist/components/layout/segmented/segmented.class.js.map +1 -1
  629. package/dist/components/layout/segmented/segmented.styles.d.ts.map +1 -1
  630. package/dist/components/layout/segmented/segmented.styles.js +27 -8
  631. package/dist/components/layout/segmented/segmented.styles.js.map +1 -1
  632. package/dist/components/layout/split/split.class.d.ts +79 -27
  633. package/dist/components/layout/split/split.class.d.ts.map +1 -1
  634. package/dist/components/layout/split/split.class.js +119 -36
  635. package/dist/components/layout/split/split.class.js.map +1 -1
  636. package/dist/components/layout/stepper/stepper.class.d.ts +30 -3
  637. package/dist/components/layout/stepper/stepper.class.d.ts.map +1 -1
  638. package/dist/components/layout/stepper/stepper.class.js +44 -8
  639. package/dist/components/layout/stepper/stepper.class.js.map +1 -1
  640. package/dist/components/layout/stepper/stepper.styles.d.ts.map +1 -1
  641. package/dist/components/layout/stepper/stepper.styles.js +71 -6
  642. package/dist/components/layout/stepper/stepper.styles.js.map +1 -1
  643. package/dist/components/layout/tabs/tabs.class.d.ts +7 -0
  644. package/dist/components/layout/tabs/tabs.class.d.ts.map +1 -1
  645. package/dist/components/layout/tabs/tabs.class.js +7 -0
  646. package/dist/components/layout/tabs/tabs.class.js.map +1 -1
  647. package/dist/components/layout/tabs/tabs.styles.d.ts.map +1 -1
  648. package/dist/components/layout/tabs/tabs.styles.js +12 -4
  649. package/dist/components/layout/tabs/tabs.styles.js.map +1 -1
  650. package/dist/components/layout/virtual-list/virtual-list.class.d.ts +144 -2
  651. package/dist/components/layout/virtual-list/virtual-list.class.d.ts.map +1 -1
  652. package/dist/components/layout/virtual-list/virtual-list.class.js +259 -16
  653. package/dist/components/layout/virtual-list/virtual-list.class.js.map +1 -1
  654. package/dist/components/layout/virtual-list/virtual-list.styles.d.ts.map +1 -1
  655. package/dist/components/layout/virtual-list/virtual-list.styles.js +57 -0
  656. package/dist/components/layout/virtual-list/virtual-list.styles.js.map +1 -1
  657. package/dist/components/layout/widget/widget.class.d.ts +6 -0
  658. package/dist/components/layout/widget/widget.class.d.ts.map +1 -1
  659. package/dist/components/layout/widget/widget.class.js +6 -0
  660. package/dist/components/layout/widget/widget.class.js.map +1 -1
  661. package/dist/components/layout/widget/widget.styles.d.ts.map +1 -1
  662. package/dist/components/layout/widget/widget.styles.js +13 -2
  663. package/dist/components/layout/widget/widget.styles.js.map +1 -1
  664. package/dist/components/media/animated-image/animated-image.class.d.ts.map +1 -1
  665. package/dist/components/media/animated-image/animated-image.class.js +20 -1
  666. package/dist/components/media/animated-image/animated-image.class.js.map +1 -1
  667. package/dist/components/media/animated-image/animated-image.styles.d.ts.map +1 -1
  668. package/dist/components/media/animated-image/animated-image.styles.js +6 -1
  669. package/dist/components/media/animated-image/animated-image.styles.js.map +1 -1
  670. package/dist/components/media/animation/animation.class.d.ts.map +1 -1
  671. package/dist/components/media/animation/animation.class.js +20 -1
  672. package/dist/components/media/animation/animation.class.js.map +1 -1
  673. package/dist/components/media/attachment-chip/attachment-chip.class.d.ts +3 -2
  674. package/dist/components/media/attachment-chip/attachment-chip.class.d.ts.map +1 -1
  675. package/dist/components/media/attachment-chip/attachment-chip.class.js +20 -4
  676. package/dist/components/media/attachment-chip/attachment-chip.class.js.map +1 -1
  677. package/dist/components/media/attachment-chip/attachment-chip.styles.d.ts.map +1 -1
  678. package/dist/components/media/attachment-chip/attachment-chip.styles.js +9 -0
  679. package/dist/components/media/attachment-chip/attachment-chip.styles.js.map +1 -1
  680. package/dist/components/media/attachment-trigger/attachment-trigger.class.d.ts.map +1 -1
  681. package/dist/components/media/attachment-trigger/attachment-trigger.class.js +15 -1
  682. package/dist/components/media/attachment-trigger/attachment-trigger.class.js.map +1 -1
  683. package/dist/components/media/av-player/av-player.class.d.ts +24 -0
  684. package/dist/components/media/av-player/av-player.class.d.ts.map +1 -1
  685. package/dist/components/media/av-player/av-player.class.js +56 -18
  686. package/dist/components/media/av-player/av-player.class.js.map +1 -1
  687. package/dist/components/media/av-player/av-player.styles.d.ts.map +1 -1
  688. package/dist/components/media/av-player/av-player.styles.js +70 -14
  689. package/dist/components/media/av-player/av-player.styles.js.map +1 -1
  690. package/dist/components/media/avatar/avatar.class.d.ts +4 -0
  691. package/dist/components/media/avatar/avatar.class.d.ts.map +1 -1
  692. package/dist/components/media/avatar/avatar.class.js +4 -0
  693. package/dist/components/media/avatar/avatar.class.js.map +1 -1
  694. package/dist/components/media/avatar/avatar.styles.d.ts.map +1 -1
  695. package/dist/components/media/avatar/avatar.styles.js +8 -1
  696. package/dist/components/media/avatar/avatar.styles.js.map +1 -1
  697. package/dist/components/media/avatar-group/avatar-group.class.d.ts +4 -0
  698. package/dist/components/media/avatar-group/avatar-group.class.d.ts.map +1 -1
  699. package/dist/components/media/avatar-group/avatar-group.class.js +5 -1
  700. package/dist/components/media/avatar-group/avatar-group.class.js.map +1 -1
  701. package/dist/components/media/avatar-group/avatar-group.styles.d.ts.map +1 -1
  702. package/dist/components/media/avatar-group/avatar-group.styles.js +7 -1
  703. package/dist/components/media/avatar-group/avatar-group.styles.js.map +1 -1
  704. package/dist/components/media/file-input/file-input.class.d.ts +20 -1
  705. package/dist/components/media/file-input/file-input.class.d.ts.map +1 -1
  706. package/dist/components/media/file-input/file-input.class.js +41 -2
  707. package/dist/components/media/file-input/file-input.class.js.map +1 -1
  708. package/dist/components/media/file-input/file-input.styles.d.ts.map +1 -1
  709. package/dist/components/media/file-input/file-input.styles.js +22 -4
  710. package/dist/components/media/file-input/file-input.styles.js.map +1 -1
  711. package/dist/components/media/flag/flag.class.d.ts.map +1 -1
  712. package/dist/components/media/flag/flag.class.js +3 -0
  713. package/dist/components/media/flag/flag.class.js.map +1 -1
  714. package/dist/components/media/flag/language-map.d.ts +15 -0
  715. package/dist/components/media/flag/language-map.d.ts.map +1 -1
  716. package/dist/components/media/flag/language-map.js +23 -0
  717. package/dist/components/media/flag/language-map.js.map +1 -1
  718. package/dist/components/media/image-comparer/image-comparer.styles.d.ts.map +1 -1
  719. package/dist/components/media/image-comparer/image-comparer.styles.js +11 -0
  720. package/dist/components/media/image-comparer/image-comparer.styles.js.map +1 -1
  721. package/dist/components/media/image-viewer/image-viewer.class.d.ts +17 -0
  722. package/dist/components/media/image-viewer/image-viewer.class.d.ts.map +1 -1
  723. package/dist/components/media/image-viewer/image-viewer.class.js +47 -6
  724. package/dist/components/media/image-viewer/image-viewer.class.js.map +1 -1
  725. package/dist/components/media/image-viewer/image-viewer.styles.d.ts.map +1 -1
  726. package/dist/components/media/image-viewer/image-viewer.styles.js +41 -3
  727. package/dist/components/media/image-viewer/image-viewer.styles.js.map +1 -1
  728. package/dist/components/media/lightbox/lightbox.class.d.ts +4 -9
  729. package/dist/components/media/lightbox/lightbox.class.d.ts.map +1 -1
  730. package/dist/components/media/lightbox/lightbox.class.js +32 -2
  731. package/dist/components/media/lightbox/lightbox.class.js.map +1 -1
  732. package/dist/components/media/lightbox/lightbox.styles.d.ts.map +1 -1
  733. package/dist/components/media/lightbox/lightbox.styles.js +7 -3
  734. package/dist/components/media/lightbox/lightbox.styles.js.map +1 -1
  735. package/dist/components/media/map/map.class.d.ts +8 -0
  736. package/dist/components/media/map/map.class.d.ts.map +1 -1
  737. package/dist/components/media/map/map.class.js +30 -6
  738. package/dist/components/media/map/map.class.js.map +1 -1
  739. package/dist/components/media/map/map.styles.d.ts.map +1 -1
  740. package/dist/components/media/map/map.styles.js +73 -0
  741. package/dist/components/media/map/map.styles.js.map +1 -1
  742. package/dist/components/media/media-card/media-card.class.d.ts +14 -0
  743. package/dist/components/media/media-card/media-card.class.d.ts.map +1 -1
  744. package/dist/components/media/media-card/media-card.class.js +14 -0
  745. package/dist/components/media/media-card/media-card.class.js.map +1 -1
  746. package/dist/components/media/media-card/media-card.styles.d.ts.map +1 -1
  747. package/dist/components/media/media-card/media-card.styles.js +10 -0
  748. package/dist/components/media/media-card/media-card.styles.js.map +1 -1
  749. package/dist/components/media/playback/playback.class.d.ts +6 -1
  750. package/dist/components/media/playback/playback.class.d.ts.map +1 -1
  751. package/dist/components/media/playback/playback.class.js +23 -1
  752. package/dist/components/media/playback/playback.class.js.map +1 -1
  753. package/dist/components/media/playback/playback.styles.d.ts.map +1 -1
  754. package/dist/components/media/playback/playback.styles.js +9 -0
  755. package/dist/components/media/playback/playback.styles.js.map +1 -1
  756. package/dist/components/media/qr-code/qr-code.class.d.ts +2 -0
  757. package/dist/components/media/qr-code/qr-code.class.d.ts.map +1 -1
  758. package/dist/components/media/qr-code/qr-code.class.js +27 -0
  759. package/dist/components/media/qr-code/qr-code.class.js.map +1 -1
  760. package/dist/components/overlays/badge/badge.class.d.ts +10 -0
  761. package/dist/components/overlays/badge/badge.class.d.ts.map +1 -1
  762. package/dist/components/overlays/badge/badge.class.js +12 -0
  763. package/dist/components/overlays/badge/badge.class.js.map +1 -1
  764. package/dist/components/overlays/badge/badge.styles.d.ts.map +1 -1
  765. package/dist/components/overlays/badge/badge.styles.js +15 -2
  766. package/dist/components/overlays/badge/badge.styles.js.map +1 -1
  767. package/dist/components/overlays/callout/callout.class.d.ts +8 -0
  768. package/dist/components/overlays/callout/callout.class.d.ts.map +1 -1
  769. package/dist/components/overlays/callout/callout.class.js +25 -1
  770. package/dist/components/overlays/callout/callout.class.js.map +1 -1
  771. package/dist/components/overlays/callout/callout.styles.d.ts.map +1 -1
  772. package/dist/components/overlays/callout/callout.styles.js +12 -1
  773. package/dist/components/overlays/callout/callout.styles.js.map +1 -1
  774. package/dist/components/overlays/chip/chip.class.d.ts +7 -0
  775. package/dist/components/overlays/chip/chip.class.d.ts.map +1 -1
  776. package/dist/components/overlays/chip/chip.class.js +7 -0
  777. package/dist/components/overlays/chip/chip.class.js.map +1 -1
  778. package/dist/components/overlays/chip/chip.styles.d.ts.map +1 -1
  779. package/dist/components/overlays/chip/chip.styles.js +21 -1
  780. package/dist/components/overlays/chip/chip.styles.js.map +1 -1
  781. package/dist/components/overlays/empty/empty.class.d.ts +2 -0
  782. package/dist/components/overlays/empty/empty.class.d.ts.map +1 -1
  783. package/dist/components/overlays/empty/empty.class.js +2 -0
  784. package/dist/components/overlays/empty/empty.class.js.map +1 -1
  785. package/dist/components/overlays/empty/empty.styles.d.ts.map +1 -1
  786. package/dist/components/overlays/empty/empty.styles.js +5 -0
  787. package/dist/components/overlays/empty/empty.styles.js.map +1 -1
  788. package/dist/components/overlays/overlay/popover.class.d.ts +12 -6
  789. package/dist/components/overlays/overlay/popover.class.d.ts.map +1 -1
  790. package/dist/components/overlays/overlay/popover.class.js +34 -18
  791. package/dist/components/overlays/overlay/popover.class.js.map +1 -1
  792. package/dist/components/overlays/overlay/tooltip.class.d.ts +12 -7
  793. package/dist/components/overlays/overlay/tooltip.class.d.ts.map +1 -1
  794. package/dist/components/overlays/overlay/tooltip.class.js +36 -21
  795. package/dist/components/overlays/overlay/tooltip.class.js.map +1 -1
  796. package/dist/components/overlays/rating/rating.styles.d.ts.map +1 -1
  797. package/dist/components/overlays/rating/rating.styles.js +5 -0
  798. package/dist/components/overlays/rating/rating.styles.js.map +1 -1
  799. package/dist/components/overlays/skeleton/skeleton.class.d.ts.map +1 -1
  800. package/dist/components/overlays/skeleton/skeleton.class.js +15 -1
  801. package/dist/components/overlays/skeleton/skeleton.class.js.map +1 -1
  802. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.d.ts +28 -2
  803. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.d.ts.map +1 -1
  804. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.js +77 -36
  805. package/dist/components/retrieval/chunk-inspector/chunk-inspector.class.js.map +1 -1
  806. package/dist/components/retrieval/chunk-inspector/chunk-inspector.styles.d.ts.map +1 -1
  807. package/dist/components/retrieval/chunk-inspector/chunk-inspector.styles.js +73 -14
  808. package/dist/components/retrieval/chunk-inspector/chunk-inspector.styles.js.map +1 -1
  809. package/dist/components/retrieval/citation-badge/citation-badge.class.d.ts.map +1 -1
  810. package/dist/components/retrieval/citation-badge/citation-badge.class.js +12 -0
  811. package/dist/components/retrieval/citation-badge/citation-badge.class.js.map +1 -1
  812. package/dist/components/retrieval/citation-badge/citation-badge.styles.js +1 -1
  813. package/dist/components/retrieval/community-card/community-card.class.d.ts +8 -0
  814. package/dist/components/retrieval/community-card/community-card.class.d.ts.map +1 -1
  815. package/dist/components/retrieval/community-card/community-card.class.js +8 -0
  816. package/dist/components/retrieval/community-card/community-card.class.js.map +1 -1
  817. package/dist/components/retrieval/community-card/community-card.styles.d.ts.map +1 -1
  818. package/dist/components/retrieval/community-card/community-card.styles.js +25 -0
  819. package/dist/components/retrieval/community-card/community-card.styles.js.map +1 -1
  820. package/dist/components/retrieval/entity-card/entity-card.class.d.ts +16 -0
  821. package/dist/components/retrieval/entity-card/entity-card.class.d.ts.map +1 -1
  822. package/dist/components/retrieval/entity-card/entity-card.class.js +35 -1
  823. package/dist/components/retrieval/entity-card/entity-card.class.js.map +1 -1
  824. package/dist/components/retrieval/entity-card/entity-card.styles.d.ts.map +1 -1
  825. package/dist/components/retrieval/entity-card/entity-card.styles.js +19 -0
  826. package/dist/components/retrieval/entity-card/entity-card.styles.js.map +1 -1
  827. package/dist/components/retrieval/entity-chip/entity-chip.class.d.ts.map +1 -1
  828. package/dist/components/retrieval/entity-chip/entity-chip.class.js +8 -0
  829. package/dist/components/retrieval/entity-chip/entity-chip.class.js.map +1 -1
  830. package/dist/components/retrieval/entity-chip/entity-chip.styles.js +1 -1
  831. package/dist/components/retrieval/entity-dossier/entity-dossier.class.d.ts.map +1 -1
  832. package/dist/components/retrieval/entity-dossier/entity-dossier.class.js +15 -1
  833. package/dist/components/retrieval/entity-dossier/entity-dossier.class.js.map +1 -1
  834. package/dist/components/retrieval/graph/graph.class.d.ts +24 -0
  835. package/dist/components/retrieval/graph/graph.class.d.ts.map +1 -1
  836. package/dist/components/retrieval/graph/graph.class.js +77 -3
  837. package/dist/components/retrieval/graph/graph.class.js.map +1 -1
  838. package/dist/components/retrieval/graph/graph.styles.d.ts.map +1 -1
  839. package/dist/components/retrieval/graph/graph.styles.js +22 -0
  840. package/dist/components/retrieval/graph/graph.styles.js.map +1 -1
  841. package/dist/components/retrieval/graph-legend/graph-legend.class.d.ts +2 -0
  842. package/dist/components/retrieval/graph-legend/graph-legend.class.d.ts.map +1 -1
  843. package/dist/components/retrieval/graph-legend/graph-legend.class.js +17 -1
  844. package/dist/components/retrieval/graph-legend/graph-legend.class.js.map +1 -1
  845. package/dist/components/retrieval/graph-legend/graph-legend.styles.js +1 -1
  846. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.d.ts.map +1 -1
  847. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js +1 -0
  848. package/dist/components/retrieval/ingestion-queue/ingestion-queue.class.js.map +1 -1
  849. package/dist/components/retrieval/knowledge-base/knowledge-base.class.d.ts +2 -1
  850. package/dist/components/retrieval/knowledge-base/knowledge-base.class.d.ts.map +1 -1
  851. package/dist/components/retrieval/knowledge-base/knowledge-base.class.js +4 -2
  852. package/dist/components/retrieval/knowledge-base/knowledge-base.class.js.map +1 -1
  853. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts.map +1 -1
  854. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +1 -0
  855. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js.map +1 -1
  856. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.styles.js +1 -1
  857. package/dist/components/retrieval/memory-panel/memory-panel.class.d.ts +6 -0
  858. package/dist/components/retrieval/memory-panel/memory-panel.class.d.ts.map +1 -1
  859. package/dist/components/retrieval/memory-panel/memory-panel.class.js +6 -0
  860. package/dist/components/retrieval/memory-panel/memory-panel.class.js.map +1 -1
  861. package/dist/components/retrieval/memory-panel/memory-panel.styles.d.ts.map +1 -1
  862. package/dist/components/retrieval/memory-panel/memory-panel.styles.js +11 -3
  863. package/dist/components/retrieval/memory-panel/memory-panel.styles.js.map +1 -1
  864. package/dist/components/retrieval/mind-map/mind-map.class.d.ts +7 -0
  865. package/dist/components/retrieval/mind-map/mind-map.class.d.ts.map +1 -1
  866. package/dist/components/retrieval/mind-map/mind-map.class.js +15 -1
  867. package/dist/components/retrieval/mind-map/mind-map.class.js.map +1 -1
  868. package/dist/components/retrieval/mind-map/mind-map.styles.d.ts.map +1 -1
  869. package/dist/components/retrieval/mind-map/mind-map.styles.js +6 -0
  870. package/dist/components/retrieval/mind-map/mind-map.styles.js.map +1 -1
  871. package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts +13 -3
  872. package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts.map +1 -1
  873. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +30 -21
  874. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js.map +1 -1
  875. package/dist/components/retrieval/neighbor-list/neighbor-list.styles.d.ts.map +1 -1
  876. package/dist/components/retrieval/neighbor-list/neighbor-list.styles.js +43 -10
  877. package/dist/components/retrieval/neighbor-list/neighbor-list.styles.js.map +1 -1
  878. package/dist/components/retrieval/node-palette/node-palette.class.d.ts +8 -0
  879. package/dist/components/retrieval/node-palette/node-palette.class.d.ts.map +1 -1
  880. package/dist/components/retrieval/node-palette/node-palette.class.js +21 -1
  881. package/dist/components/retrieval/node-palette/node-palette.class.js.map +1 -1
  882. package/dist/components/retrieval/node-palette/node-palette.styles.d.ts.map +1 -1
  883. package/dist/components/retrieval/node-palette/node-palette.styles.js +19 -3
  884. package/dist/components/retrieval/node-palette/node-palette.styles.js.map +1 -1
  885. package/dist/components/retrieval/path-strip/path-strip.styles.d.ts.map +1 -1
  886. package/dist/components/retrieval/path-strip/path-strip.styles.js +4 -0
  887. package/dist/components/retrieval/path-strip/path-strip.styles.js.map +1 -1
  888. package/dist/components/retrieval/provenance-panel/provenance-panel.styles.d.ts.map +1 -1
  889. package/dist/components/retrieval/provenance-panel/provenance-panel.styles.js +7 -0
  890. package/dist/components/retrieval/provenance-panel/provenance-panel.styles.js.map +1 -1
  891. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts +25 -0
  892. package/dist/components/retrieval/retrieval-results/retrieval-results.class.d.ts.map +1 -1
  893. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js +51 -5
  894. package/dist/components/retrieval/retrieval-results/retrieval-results.class.js.map +1 -1
  895. package/dist/components/retrieval/retrieval-results/retrieval-results.styles.d.ts.map +1 -1
  896. package/dist/components/retrieval/retrieval-results/retrieval-results.styles.js +48 -13
  897. package/dist/components/retrieval/retrieval-results/retrieval-results.styles.js.map +1 -1
  898. package/dist/components/retrieval/retrieval-search/retrieval-search.styles.js +1 -1
  899. package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.d.ts +2 -0
  900. package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.d.ts.map +1 -1
  901. package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js +10 -1
  902. package/dist/components/retrieval/retrieval-trace/retrieval-trace.class.js.map +1 -1
  903. package/dist/components/retrieval/retrieval-trace/retrieval-trace.styles.js +1 -1
  904. package/dist/components/retrieval/source-card/source-card.class.d.ts +20 -2
  905. package/dist/components/retrieval/source-card/source-card.class.d.ts.map +1 -1
  906. package/dist/components/retrieval/source-card/source-card.class.js +24 -1
  907. package/dist/components/retrieval/source-card/source-card.class.js.map +1 -1
  908. package/dist/components/retrieval/source-card/source-card.styles.d.ts.map +1 -1
  909. package/dist/components/retrieval/source-card/source-card.styles.js +20 -0
  910. package/dist/components/retrieval/source-card/source-card.styles.js.map +1 -1
  911. package/dist/components/retrieval/source-list/source-list.class.d.ts +2 -2
  912. package/dist/components/retrieval/source-list/source-list.class.d.ts.map +1 -1
  913. package/dist/components/retrieval/source-list/source-list.class.js +2 -1
  914. package/dist/components/retrieval/source-list/source-list.class.js.map +1 -1
  915. package/dist/components/retrieval/source-picker/source-picker.class.d.ts +8 -0
  916. package/dist/components/retrieval/source-picker/source-picker.class.d.ts.map +1 -1
  917. package/dist/components/retrieval/source-picker/source-picker.class.js +27 -2
  918. package/dist/components/retrieval/source-picker/source-picker.class.js.map +1 -1
  919. package/dist/components/retrieval/source-picker/source-picker.styles.d.ts.map +1 -1
  920. package/dist/components/retrieval/source-picker/source-picker.styles.js +13 -6
  921. package/dist/components/retrieval/source-picker/source-picker.styles.js.map +1 -1
  922. package/dist/components/utility/diff-view/diff-view.class.d.ts.map +1 -1
  923. package/dist/components/utility/diff-view/diff-view.class.js +1 -0
  924. package/dist/components/utility/diff-view/diff-view.class.js.map +1 -1
  925. package/dist/components/utility/diff-view/diff-view.styles.d.ts.map +1 -1
  926. package/dist/components/utility/diff-view/diff-view.styles.js +1 -0
  927. package/dist/components/utility/diff-view/diff-view.styles.js.map +1 -1
  928. package/dist/components/utility/export-button/export-button.class.d.ts +1 -1
  929. package/dist/components/utility/export-button/export-button.class.d.ts.map +1 -1
  930. package/dist/components/utility/export-button/export-button.class.js +3 -1
  931. package/dist/components/utility/export-button/export-button.class.js.map +1 -1
  932. package/dist/components/utility/export-button/export-button.styles.d.ts.map +1 -1
  933. package/dist/components/utility/export-button/export-button.styles.js +9 -3
  934. package/dist/components/utility/export-button/export-button.styles.js.map +1 -1
  935. package/dist/components/utility/format/relative-time.class.d.ts.map +1 -1
  936. package/dist/components/utility/format/relative-time.class.js +1 -0
  937. package/dist/components/utility/format/relative-time.class.js.map +1 -1
  938. package/dist/components/utility/icon/icon.class.d.ts +2 -2
  939. package/dist/components/utility/icon/icon.class.d.ts.map +1 -1
  940. package/dist/components/utility/icon/icon.class.js +2 -1
  941. package/dist/components/utility/icon/icon.class.js.map +1 -1
  942. package/dist/components/utility/intersection-observer/intersection-observer.class.d.ts.map +1 -1
  943. package/dist/components/utility/intersection-observer/intersection-observer.class.js +1 -0
  944. package/dist/components/utility/intersection-observer/intersection-observer.class.js.map +1 -1
  945. package/dist/components/utility/json-viewer/json-viewer.class.d.ts +2 -0
  946. package/dist/components/utility/json-viewer/json-viewer.class.d.ts.map +1 -1
  947. package/dist/components/utility/json-viewer/json-viewer.class.js +3 -0
  948. package/dist/components/utility/json-viewer/json-viewer.class.js.map +1 -1
  949. package/dist/components/utility/json-viewer/json-viewer.styles.d.ts.map +1 -1
  950. package/dist/components/utility/json-viewer/json-viewer.styles.js +27 -8
  951. package/dist/components/utility/json-viewer/json-viewer.styles.js.map +1 -1
  952. package/dist/components/utility/known-date/known-date.class.d.ts +12 -1
  953. package/dist/components/utility/known-date/known-date.class.d.ts.map +1 -1
  954. package/dist/components/utility/known-date/known-date.class.js +13 -1
  955. package/dist/components/utility/known-date/known-date.class.js.map +1 -1
  956. package/dist/components/utility/known-date/known-date.styles.d.ts.map +1 -1
  957. package/dist/components/utility/known-date/known-date.styles.js +33 -1
  958. package/dist/components/utility/known-date/known-date.styles.js.map +1 -1
  959. package/dist/components/utility/mention-popover/mention-popover.class.d.ts +2 -0
  960. package/dist/components/utility/mention-popover/mention-popover.class.d.ts.map +1 -1
  961. package/dist/components/utility/mention-popover/mention-popover.class.js +2 -0
  962. package/dist/components/utility/mention-popover/mention-popover.class.js.map +1 -1
  963. package/dist/components/utility/mention-popover/mention-popover.styles.d.ts.map +1 -1
  964. package/dist/components/utility/mention-popover/mention-popover.styles.js +7 -2
  965. package/dist/components/utility/mention-popover/mention-popover.styles.js.map +1 -1
  966. package/dist/components/utility/mutation-observer/mutation-observer.class.d.ts.map +1 -1
  967. package/dist/components/utility/mutation-observer/mutation-observer.class.js +17 -2
  968. package/dist/components/utility/mutation-observer/mutation-observer.class.js.map +1 -1
  969. package/dist/components/utility/poll-status/poll-status.class.d.ts +10 -0
  970. package/dist/components/utility/poll-status/poll-status.class.d.ts.map +1 -1
  971. package/dist/components/utility/poll-status/poll-status.class.js +34 -3
  972. package/dist/components/utility/poll-status/poll-status.class.js.map +1 -1
  973. package/dist/components/utility/poll-status/poll-status.styles.js +1 -1
  974. package/dist/components/utility/tour/tour.class.d.ts +3 -0
  975. package/dist/components/utility/tour/tour.class.d.ts.map +1 -1
  976. package/dist/components/utility/tour/tour.class.js +18 -1
  977. package/dist/components/utility/tour/tour.class.js.map +1 -1
  978. package/dist/components/utility/tour/tour.styles.d.ts.map +1 -1
  979. package/dist/components/utility/tour/tour.styles.js +9 -6
  980. package/dist/components/utility/tour/tour.styles.js.map +1 -1
  981. package/dist/components/viewers/archive-viewer/archive-viewer.class.d.ts +1 -0
  982. package/dist/components/viewers/archive-viewer/archive-viewer.class.d.ts.map +1 -1
  983. package/dist/components/viewers/archive-viewer/archive-viewer.class.js +4 -2
  984. package/dist/components/viewers/archive-viewer/archive-viewer.class.js.map +1 -1
  985. package/dist/components/viewers/archive-viewer/archive-viewer.styles.d.ts.map +1 -1
  986. package/dist/components/viewers/archive-viewer/archive-viewer.styles.js +11 -5
  987. package/dist/components/viewers/archive-viewer/archive-viewer.styles.js.map +1 -1
  988. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.d.ts.map +1 -1
  989. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.js +2 -3
  990. package/dist/components/viewers/calendar-viewer/calendar-viewer.class.js.map +1 -1
  991. package/dist/components/viewers/contact-viewer/contact-viewer.class.d.ts.map +1 -1
  992. package/dist/components/viewers/contact-viewer/contact-viewer.class.js +6 -3
  993. package/dist/components/viewers/contact-viewer/contact-viewer.class.js.map +1 -1
  994. package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts +7 -0
  995. package/dist/components/viewers/csv-viewer/csv-viewer.class.d.ts.map +1 -1
  996. package/dist/components/viewers/csv-viewer/csv-viewer.class.js +27 -3
  997. package/dist/components/viewers/csv-viewer/csv-viewer.class.js.map +1 -1
  998. package/dist/components/viewers/csv-viewer/csv-viewer.styles.d.ts.map +1 -1
  999. package/dist/components/viewers/csv-viewer/csv-viewer.styles.js +22 -3
  1000. package/dist/components/viewers/csv-viewer/csv-viewer.styles.js.map +1 -1
  1001. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts +8 -2
  1002. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.d.ts.map +1 -1
  1003. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +18 -5
  1004. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js.map +1 -1
  1005. package/dist/components/viewers/dataset-viewer/dataset-viewer.styles.d.ts.map +1 -1
  1006. package/dist/components/viewers/dataset-viewer/dataset-viewer.styles.js +3 -0
  1007. package/dist/components/viewers/dataset-viewer/dataset-viewer.styles.js.map +1 -1
  1008. package/dist/components/viewers/document-compare/document-compare.class.d.ts.map +1 -1
  1009. package/dist/components/viewers/document-compare/document-compare.class.js +14 -1
  1010. package/dist/components/viewers/document-compare/document-compare.class.js.map +1 -1
  1011. package/dist/components/viewers/document-compare/document-compare.styles.d.ts.map +1 -1
  1012. package/dist/components/viewers/document-compare/document-compare.styles.js +1 -0
  1013. package/dist/components/viewers/document-compare/document-compare.styles.js.map +1 -1
  1014. package/dist/components/viewers/document-preview/document-preview.class.d.ts +4 -1
  1015. package/dist/components/viewers/document-preview/document-preview.class.d.ts.map +1 -1
  1016. package/dist/components/viewers/document-preview/document-preview.class.js +5 -1
  1017. package/dist/components/viewers/document-preview/document-preview.class.js.map +1 -1
  1018. package/dist/components/viewers/document-preview/document-preview.styles.d.ts.map +1 -1
  1019. package/dist/components/viewers/document-preview/document-preview.styles.js +8 -1
  1020. package/dist/components/viewers/document-preview/document-preview.styles.js.map +1 -1
  1021. package/dist/components/viewers/document-viewer/document-viewer.class.d.ts.map +1 -1
  1022. package/dist/components/viewers/document-viewer/document-viewer.class.js +1 -0
  1023. package/dist/components/viewers/document-viewer/document-viewer.class.js.map +1 -1
  1024. package/dist/components/viewers/docx-viewer/docx-viewer.styles.d.ts.map +1 -1
  1025. package/dist/components/viewers/docx-viewer/docx-viewer.styles.js +3 -0
  1026. package/dist/components/viewers/docx-viewer/docx-viewer.styles.js.map +1 -1
  1027. package/dist/components/viewers/ebook-viewer/ebook-viewer.styles.d.ts.map +1 -1
  1028. package/dist/components/viewers/ebook-viewer/ebook-viewer.styles.js +4 -0
  1029. package/dist/components/viewers/ebook-viewer/ebook-viewer.styles.js.map +1 -1
  1030. package/dist/components/viewers/email-viewer/email-viewer.class.d.ts +2 -0
  1031. package/dist/components/viewers/email-viewer/email-viewer.class.d.ts.map +1 -1
  1032. package/dist/components/viewers/email-viewer/email-viewer.class.js +5 -2
  1033. package/dist/components/viewers/email-viewer/email-viewer.class.js.map +1 -1
  1034. package/dist/components/viewers/email-viewer/email-viewer.styles.d.ts.map +1 -1
  1035. package/dist/components/viewers/email-viewer/email-viewer.styles.js +20 -1
  1036. package/dist/components/viewers/email-viewer/email-viewer.styles.js.map +1 -1
  1037. package/dist/components/viewers/geojson-view/geojson-view.class.d.ts.map +1 -1
  1038. package/dist/components/viewers/geojson-view/geojson-view.class.js +2 -1
  1039. package/dist/components/viewers/geojson-view/geojson-view.class.js.map +1 -1
  1040. package/dist/components/viewers/highlight-layer/highlight-layer.class.d.ts.map +1 -1
  1041. package/dist/components/viewers/highlight-layer/highlight-layer.class.js +16 -1
  1042. package/dist/components/viewers/highlight-layer/highlight-layer.class.js.map +1 -1
  1043. package/dist/components/viewers/highlight-layer/highlight-layer.styles.d.ts.map +1 -1
  1044. package/dist/components/viewers/highlight-layer/highlight-layer.styles.js +3 -0
  1045. package/dist/components/viewers/highlight-layer/highlight-layer.styles.js.map +1 -1
  1046. package/dist/components/viewers/html-viewer/dompurify-loader.d.ts +1 -1
  1047. package/dist/components/viewers/html-viewer/dompurify-loader.d.ts.map +1 -1
  1048. package/dist/components/viewers/html-viewer/dompurify-loader.js +5 -1
  1049. package/dist/components/viewers/html-viewer/dompurify-loader.js.map +1 -1
  1050. package/dist/components/viewers/html-viewer/html-viewer.class.d.ts.map +1 -1
  1051. package/dist/components/viewers/html-viewer/html-viewer.class.js +2 -1
  1052. package/dist/components/viewers/html-viewer/html-viewer.class.js.map +1 -1
  1053. package/dist/components/viewers/include/include.class.d.ts.map +1 -1
  1054. package/dist/components/viewers/include/include.class.js +1 -0
  1055. package/dist/components/viewers/include/include.class.js.map +1 -1
  1056. package/dist/components/viewers/notebook-viewer/dompurify-loader.d.ts +1 -1
  1057. package/dist/components/viewers/notebook-viewer/dompurify-loader.d.ts.map +1 -1
  1058. package/dist/components/viewers/notebook-viewer/dompurify-loader.js +7 -1
  1059. package/dist/components/viewers/notebook-viewer/dompurify-loader.js.map +1 -1
  1060. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts +7 -0
  1061. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.d.ts.map +1 -1
  1062. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +15 -4
  1063. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js.map +1 -1
  1064. package/dist/components/viewers/notebook-viewer/notebook-viewer.styles.d.ts.map +1 -1
  1065. package/dist/components/viewers/notebook-viewer/notebook-viewer.styles.js +31 -12
  1066. package/dist/components/viewers/notebook-viewer/notebook-viewer.styles.js.map +1 -1
  1067. package/dist/components/viewers/page-rail/page-rail.class.d.ts +9 -0
  1068. package/dist/components/viewers/page-rail/page-rail.class.d.ts.map +1 -1
  1069. package/dist/components/viewers/page-rail/page-rail.class.js +16 -4
  1070. package/dist/components/viewers/page-rail/page-rail.class.js.map +1 -1
  1071. package/dist/components/viewers/page-rail/page-rail.styles.d.ts.map +1 -1
  1072. package/dist/components/viewers/page-rail/page-rail.styles.js +24 -14
  1073. package/dist/components/viewers/page-rail/page-rail.styles.js.map +1 -1
  1074. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +15 -0
  1075. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts.map +1 -1
  1076. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +29 -4
  1077. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js.map +1 -1
  1078. package/dist/components/viewers/pdf-viewer/pdf-viewer.styles.d.ts.map +1 -1
  1079. package/dist/components/viewers/pdf-viewer/pdf-viewer.styles.js +26 -9
  1080. package/dist/components/viewers/pdf-viewer/pdf-viewer.styles.js.map +1 -1
  1081. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.d.ts.map +1 -1
  1082. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.js +1 -0
  1083. package/dist/components/viewers/pptx-viewer/pptx-viewer.class.js.map +1 -1
  1084. package/dist/components/viewers/pptx-viewer/pptx-viewer.styles.d.ts.map +1 -1
  1085. package/dist/components/viewers/pptx-viewer/pptx-viewer.styles.js +2 -0
  1086. package/dist/components/viewers/pptx-viewer/pptx-viewer.styles.js.map +1 -1
  1087. package/dist/components/viewers/spreadsheet-viewer/fixtures/minimal-xlsx-fixture.d.ts +2 -0
  1088. package/dist/components/viewers/spreadsheet-viewer/fixtures/minimal-xlsx-fixture.d.ts.map +1 -0
  1089. package/dist/components/viewers/spreadsheet-viewer/fixtures/minimal-xlsx-fixture.js +5 -0
  1090. package/dist/components/viewers/spreadsheet-viewer/fixtures/minimal-xlsx-fixture.js.map +1 -0
  1091. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.d.ts +3 -0
  1092. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.d.ts.map +1 -1
  1093. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +6 -1
  1094. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js.map +1 -1
  1095. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.styles.d.ts.map +1 -1
  1096. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.styles.js +12 -1
  1097. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.styles.js.map +1 -1
  1098. package/dist/components/viewers/svg-viewer/dompurify-loader.d.ts +1 -1
  1099. package/dist/components/viewers/svg-viewer/dompurify-loader.d.ts.map +1 -1
  1100. package/dist/components/viewers/svg-viewer/dompurify-loader.js +6 -1
  1101. package/dist/components/viewers/svg-viewer/dompurify-loader.js.map +1 -1
  1102. package/dist/components/viewers/svg-viewer/svg-viewer.class.d.ts +3 -0
  1103. package/dist/components/viewers/svg-viewer/svg-viewer.class.d.ts.map +1 -1
  1104. package/dist/components/viewers/svg-viewer/svg-viewer.class.js +5 -1
  1105. package/dist/components/viewers/svg-viewer/svg-viewer.class.js.map +1 -1
  1106. package/dist/components/viewers/svg-viewer/svg-viewer.styles.d.ts.map +1 -1
  1107. package/dist/components/viewers/svg-viewer/svg-viewer.styles.js +8 -1
  1108. package/dist/components/viewers/svg-viewer/svg-viewer.styles.js.map +1 -1
  1109. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts +9 -0
  1110. package/dist/components/viewers/xml-viewer/xml-viewer.class.d.ts.map +1 -1
  1111. package/dist/components/viewers/xml-viewer/xml-viewer.class.js +0 -0
  1112. package/dist/components/viewers/xml-viewer/xml-viewer.class.js.map +1 -1
  1113. package/dist/components/viewers/xml-viewer/xml-viewer.styles.d.ts.map +1 -1
  1114. package/dist/components/viewers/xml-viewer/xml-viewer.styles.js +22 -8
  1115. package/dist/components/viewers/xml-viewer/xml-viewer.styles.js.map +1 -1
  1116. package/dist/internal/localization.d.ts +1 -1
  1117. package/dist/internal/localization.d.ts.map +1 -1
  1118. package/dist/internal/localization.js +7 -0
  1119. package/dist/internal/localization.js.map +1 -1
  1120. package/dist/internal/orientation-breakpoint.d.ts +19 -8
  1121. package/dist/internal/orientation-breakpoint.d.ts.map +1 -1
  1122. package/dist/internal/orientation-breakpoint.js +181 -0
  1123. package/dist/internal/orientation-breakpoint.js.map +1 -1
  1124. package/dist/internal/tokens.styles.d.ts.map +1 -1
  1125. package/dist/internal/tokens.styles.js +22 -5
  1126. package/dist/internal/tokens.styles.js.map +1 -1
  1127. package/dist/lyra.d.ts +7 -7
  1128. package/dist/lyra.d.ts.map +1 -1
  1129. package/dist/lyra.js +1 -1
  1130. package/dist/lyra.js.map +1 -1
  1131. package/dist/theme.css +103 -0
  1132. package/llms/components/lr-activity-feed.md +11 -2
  1133. package/llms/components/lr-agent-run.md +16 -1
  1134. package/llms/components/lr-agent-trace.md +11 -0
  1135. package/llms/components/lr-app-rail-item.md +11 -0
  1136. package/llms/components/lr-app-rail.md +11 -0
  1137. package/llms/components/lr-archive-viewer.md +7 -1
  1138. package/llms/components/lr-artifact-panel.md +11 -1
  1139. package/llms/components/lr-av-player.md +38 -2
  1140. package/llms/components/lr-avatar-group.md +6 -1
  1141. package/llms/components/lr-avatar.md +6 -2
  1142. package/llms/components/lr-badge.md +8 -1
  1143. package/llms/components/lr-bar-chart.md +3 -1
  1144. package/llms/components/lr-breadcrumb-item.md +9 -0
  1145. package/llms/components/lr-breadcrumb.md +9 -0
  1146. package/llms/components/lr-bubble-chart.md +3 -1
  1147. package/llms/components/lr-button.md +29 -1
  1148. package/llms/components/lr-calendar.md +5 -1
  1149. package/llms/components/lr-callout.md +6 -1
  1150. package/llms/components/lr-card.md +26 -5
  1151. package/llms/components/lr-carousel.md +9 -0
  1152. package/llms/components/lr-chart.md +2 -1
  1153. package/llms/components/lr-chat-composer.md +18 -5
  1154. package/llms/components/lr-chat-message.md +16 -0
  1155. package/llms/components/lr-chat-viewport.md +12 -0
  1156. package/llms/components/lr-checkbox-group.md +17 -0
  1157. package/llms/components/lr-checkbox.md +28 -1
  1158. package/llms/components/lr-chip-group.md +19 -1
  1159. package/llms/components/lr-chip.md +19 -1
  1160. package/llms/components/lr-chunk-inspector.md +33 -5
  1161. package/llms/components/lr-code-block-core.md +6 -1
  1162. package/llms/components/lr-code-block.md +20 -1
  1163. package/llms/components/lr-combobox.md +39 -4
  1164. package/llms/components/lr-command-palette.md +18 -7
  1165. package/llms/components/lr-commit-card.md +10 -0
  1166. package/llms/components/lr-community-card.md +5 -0
  1167. package/llms/components/lr-confirm-bar.md +26 -1
  1168. package/llms/components/lr-conversation-item.md +41 -1
  1169. package/llms/components/lr-csv-viewer.md +16 -3
  1170. package/llms/components/lr-data-grid.md +8 -0
  1171. package/llms/components/lr-dataset-viewer.md +4 -1
  1172. package/llms/components/lr-date-input.md +31 -6
  1173. package/llms/components/lr-date-picker.md +31 -6
  1174. package/llms/components/lr-document-preview.md +9 -1
  1175. package/llms/components/lr-doughnut-chart.md +3 -1
  1176. package/llms/components/lr-dropdown-item.md +63 -11
  1177. package/llms/components/lr-email-viewer.md +4 -3
  1178. package/llms/components/lr-emoji-picker.md +28 -4
  1179. package/llms/components/lr-empty.md +5 -2
  1180. package/llms/components/lr-entity-card.md +14 -1
  1181. package/llms/components/lr-env-list.md +9 -0
  1182. package/llms/components/lr-eval-dataset.md +3 -1
  1183. package/llms/components/lr-export-button.md +4 -1
  1184. package/llms/components/lr-file-input.md +19 -2
  1185. package/llms/components/lr-filter-bar.md +23 -0
  1186. package/llms/components/lr-flag.md +39 -1
  1187. package/llms/components/lr-flow-canvas.md +15 -2
  1188. package/llms/components/lr-flow-controls.md +14 -3
  1189. package/llms/components/lr-flow-node.md +24 -3
  1190. package/llms/components/lr-flow-run-overlay.md +4 -0
  1191. package/llms/components/lr-graph-legend.md +4 -1
  1192. package/llms/components/lr-graph.md +4 -1
  1193. package/llms/components/lr-heatmap.md +29 -3
  1194. package/llms/components/lr-histogram.md +3 -1
  1195. package/llms/components/lr-icon-button.md +20 -4
  1196. package/llms/components/lr-image-viewer.md +20 -1
  1197. package/llms/components/lr-ingestion-queue.md +8 -0
  1198. package/llms/components/lr-input.md +36 -1
  1199. package/llms/components/lr-json-viewer.md +6 -3
  1200. package/llms/components/lr-known-date.md +22 -3
  1201. package/llms/components/lr-line-chart.md +3 -1
  1202. package/llms/components/lr-map.md +3 -1
  1203. package/llms/components/lr-markdown-core.md +9 -0
  1204. package/llms/components/lr-markdown.md +13 -1
  1205. package/llms/components/lr-media-card.md +5 -0
  1206. package/llms/components/lr-memory-panel.md +6 -1
  1207. package/llms/components/lr-mention-popover.md +10 -3
  1208. package/llms/components/lr-menu-item.md +63 -11
  1209. package/llms/components/lr-menu.md +63 -11
  1210. package/llms/components/lr-message-feedback.md +15 -0
  1211. package/llms/components/lr-mind-map.md +3 -1
  1212. package/llms/components/lr-model-select.md +29 -4
  1213. package/llms/components/lr-neighbor-list.md +10 -4
  1214. package/llms/components/lr-node-palette.md +3 -1
  1215. package/llms/components/lr-notebook-viewer.md +17 -2
  1216. package/llms/components/lr-number-input.md +3 -2
  1217. package/llms/components/lr-option.md +39 -4
  1218. package/llms/components/lr-page-rail.md +14 -3
  1219. package/llms/components/lr-pagination.md +5 -2
  1220. package/llms/components/lr-pdf-viewer.md +25 -9
  1221. package/llms/components/lr-phone-input.md +39 -5
  1222. package/llms/components/lr-pie-chart.md +3 -1
  1223. package/llms/components/lr-polar-area-chart.md +3 -1
  1224. package/llms/components/lr-policy-summary.md +10 -0
  1225. package/llms/components/lr-poll-status.md +5 -1
  1226. package/llms/components/lr-push-to-talk.md +8 -1
  1227. package/llms/components/lr-radar-chart.md +3 -1
  1228. package/llms/components/lr-radio.md +10 -2
  1229. package/llms/components/lr-responsive-panel.md +5 -1
  1230. package/llms/components/lr-result-card.md +14 -2
  1231. package/llms/components/lr-result-field.md +14 -2
  1232. package/llms/components/lr-retrieval-results.md +30 -3
  1233. package/llms/components/lr-retrieval-trace.md +8 -1
  1234. package/llms/components/lr-rubric-form.md +5 -0
  1235. package/llms/components/lr-scatter-chart.md +3 -1
  1236. package/llms/components/lr-segmented.md +23 -1
  1237. package/llms/components/lr-select.md +31 -4
  1238. package/llms/components/lr-sequence-strip.md +16 -4
  1239. package/llms/components/lr-source-card.md +14 -1
  1240. package/llms/components/lr-source-list.md +14 -1
  1241. package/llms/components/lr-source-picker.md +13 -1
  1242. package/llms/components/lr-span-waterfall.md +12 -2
  1243. package/llms/components/lr-split.md +46 -4
  1244. package/llms/components/lr-spreadsheet-viewer.md +10 -1
  1245. package/llms/components/lr-stack-trace.md +7 -1
  1246. package/llms/components/lr-stat.md +26 -4
  1247. package/llms/components/lr-stepper.md +25 -8
  1248. package/llms/components/lr-suggestion-chips.md +9 -0
  1249. package/llms/components/lr-svg-viewer.md +8 -0
  1250. package/llms/components/lr-table.md +117 -6
  1251. package/llms/components/lr-tabs.md +12 -1
  1252. package/llms/components/lr-tag.md +8 -1
  1253. package/llms/components/lr-task-list.md +12 -2
  1254. package/llms/components/lr-terminal.md +14 -2
  1255. package/llms/components/lr-test-results.md +11 -0
  1256. package/llms/components/lr-thread-list.md +67 -7
  1257. package/llms/components/lr-time-input.md +3 -2
  1258. package/llms/components/lr-time-range.md +18 -2
  1259. package/llms/components/lr-token-input.md +33 -6
  1260. package/llms/components/lr-tool-approval-dialog.md +5 -5
  1261. package/llms/components/lr-tool-timeline.md +6 -1
  1262. package/llms/components/lr-tour.md +11 -1
  1263. package/llms/components/lr-trace-tree.md +23 -0
  1264. package/llms/components/lr-tree-node.md +21 -3
  1265. package/llms/components/lr-tree.md +21 -3
  1266. package/llms/components/lr-virtual-list.md +99 -10
  1267. package/llms/components/lr-voice-picker.md +8 -0
  1268. package/llms/components/lr-widget.md +11 -0
  1269. package/llms/components/lr-xml-viewer.md +24 -1
  1270. package/llms/peers.md +1 -1
  1271. package/llms/shared.md +129 -7
  1272. package/llms/tokens.md +14 -7
  1273. package/llms-full.txt +2180 -250
  1274. package/llms.txt +12 -0
  1275. package/package.json +10 -3
  1276. package/vscode-css-data.json +1421 -168
  1277. package/vscode-html-data.json +499 -155
  1278. package/web-types.json +1296 -188
@@ -65,7 +65,7 @@
65
65
  "name": "lr-activity-feed",
66
66
  "description": {
67
67
  "kind": "markdown",
68
- "value": "`<lr-activity-feed>` — an append-only streaming log of granular agent actions (\"Searching the\nweb…\", \"Read src/index.ts\"), collapsing to a localized \"Completed N steps\" summary once the run\nis over. Entries never change state once added (a step whose status mutates in place belongs to\n`<lr-task-list>` instead). Implements the shared follow (stick-to-bottom) contract: `follow`\nis a component-managed, host-assignable property, released on user scroll-up and re-engaged at\nthe bottom, firing `lr-follow-change` on every transition (mount excluded). At/above\n`virtualizeThreshold` entries, the body renders through an internal `<lr-virtual-list>`\ninstead of a plain keyed list — same list semantics either way, keyed by `id`.\n\nEach entry's `text` renders as plain text by default; a host needing richer per-entry content\n(rendered markdown, a trailing tool-call chip list, etc.) sets `renderText` to fully replace it,\nidentically whether or not the feed is currently virtualized.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer container. |\n| `body` | The scrollable region containing the entries (or the internal virtual-list). |\n| `entry` | One entry row; carries `data-tone`. |\n| `entry-icon` | The literal `icon` hint, or a tone dot when unset. |\n| `entry-text` | The entry's `text`. Not rendered while `renderText` is set — its returned content replaces this part entirely. |\n| `entry-timestamp` | The formatted timestamp, only rendered while `showTimestamps` and a valid `timestamp` is set. |\n| `header` | The clickable header (`<button>`). |\n| `label` | The header's title text — `label`, or its localized default when `label` is left at `'Activity'`. |\n| `status-dot` | The decorative mode indicator dot; pulses while `mode=\"live\"`. |\n| `summary` | The header's one-line ticker (`live`) or completed-count summary (`post-hoc`). |\n| `toggle` | The chevron indicator inside the header. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-activity-feed-max-height` (default: `16rem`) — Cap on how tall the expanded body grows before it scrolls internally (non-virtualized mode); also sizes the internal virtual-list."
68
+ "value": "`<lr-activity-feed>` — an append-only streaming log of granular agent actions (\"Searching the\nweb…\", \"Read src/index.ts\"), collapsing to a localized \"Completed N steps\" summary once the run\nis over. Entries never change state once added (a step whose status mutates in place belongs to\n`<lr-task-list>` instead). Implements the shared follow (stick-to-bottom) contract: `follow`\nis a component-managed, host-assignable property, released on user scroll-up and re-engaged at\nthe bottom, firing `lr-follow-change` on every transition (mount excluded). At/above\n`virtualizeThreshold` entries, the body renders through an internal `<lr-virtual-list>`\ninstead of a plain keyed list — same list semantics either way, keyed by `id`.\n\nEach entry's `text` renders as plain text by default; a host needing richer per-entry content\n(rendered markdown, a trailing tool-call chip list, etc.) sets `renderText` to fully replace it,\nidentically whether or not the feed is currently virtualized.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer container. |\n| `body` | The scrollable region containing the entries (or the internal virtual-list). |\n| `entry` | One entry row; carries `data-tone`. |\n| `entry-icon` | The literal `icon` hint, or a tone dot when unset. |\n| `entry-text` | The entry's `text`. Not rendered while `renderText` is set — its returned content replaces this part entirely. |\n| `entry-timestamp` | The formatted timestamp, only rendered while `showTimestamps` and a valid `timestamp` is set. |\n| `header` | The clickable header (`<button>`). |\n| `label` | The header's title text — `label`, or its localized default when `label` is left at `'Activity'`. |\n| `status-dot` | The decorative mode indicator dot; pulses while `mode=\"live\"`. |\n| `summary` | The header's one-line ticker (`live`) or completed-count summary (`post-hoc`). |\n| `toggle` | The chevron indicator inside the header. |\n| `tone-dot` | The tone dot rendered inside `entry-icon` when the entry sets no literal `icon`. Its own named part rather than an internal class, so it stays styleable in both the plain and virtualized rendering paths and reachable from a consumer's `::part()`. Also carries a tone-specific name, since `::part()` cannot be qualified by `[data-tone]`. |\n| `tone-dot-brand` | A `brand`-tone entry's dot (also carries `tone-dot`). |\n| `tone-dot-danger` | A `danger`-tone entry's dot (also carries `tone-dot`). |\n| `tone-dot-neutral` | An untoned entry's dot (also carries `tone-dot`). |\n| `tone-dot-success` | A `success`-tone entry's dot (also carries `tone-dot`). |\n| `tone-dot-warning` | A `warning`-tone entry's dot (also carries `tone-dot`). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-activity-feed-max-height` (default: `16rem`) — Cap on how tall the expanded body grows before it scrolls internally (non-virtualized mode); also sizes the internal virtual-list."
69
69
  },
70
70
  "attributes": [
71
71
  {
@@ -123,9 +123,23 @@
123
123
  "name": "lr-agent-run",
124
124
  "description": {
125
125
  "kind": "markdown",
126
- "value": "`<lr-agent-run>` — the top-level shell for one `AgentRun`: lifecycle-status badge, elapsed\ntime, current step, model/cost summary, and built-in Cancel/Retry controls in a header, plus\nfour named composition slots (`tasks`/`tools`/`reasoning`/`output`) for the run's actual\ncontent. This is deliberately a SHELL, not a new step-rendering surface — every piece of\nper-step or per-invocation rendering routes through an existing primitive:\n\n- **Elapsed time**: composes `<lr-generation-status>` (`active`/`started-at`, its own built-in\n Stop button hidden via `show-stop=\"false\"` since this component renders its own Cancel/Retry\n pair instead) for the *live, ticking* readout while the run is genuinely in progress\n (`running`/`collecting`/`waiting-input`/`waiting-approval`). `<lr-stream-status>` doesn't fit:\n its `phase` vocabulary\n (`idle`/`connecting`/`streaming`/`stalled`) models transport/connection health, not an agent\n run's nine built-in lifecycle statuses (plus application-defined extensions), and it exposes no elapsed-time readout at all — exactly the\n distinction `<lr-generation-status>`'s own class doc already draws between the two. Once the\n run reaches a terminal state (`done`/`error`/`cancelled`) with both a `startedAt` and an\n `endedAt`, this component instead renders a small locally-formatted static duration\n (`endedAt - startedAt`): `<lr-generation-status>`'s freeze-on-`active=false` semantics only\n ever freeze at whatever it last computed *live*, so mounting it directly against a completed\n run loaded from history (e.g. `startedAt` yesterday, `endedAt` five minutes later, loaded\n today) would either show a stale zero or the wrong multi-hour span — it has no way to render a\n fixed historical span on demand. That static fallback reuses the same small `formatDuration()`\n algorithm `<lr-usage-badge>` and `<lr-tool-call-chip>` already duplicate locally for the same\n reason (see this file's own copy).\n- **Model + cost summary**: composes `<lr-usage-badge>`, fed `run.costEstimate` (formatted via\n `formatCost`, or a plain `Intl.NumberFormat` by default — this library never assumes a\n currency, see `<lr-format-number>`'s own explicit `currency` prop) as its `cost-text`.\n `run.model` (a plain string with no analogous `<lr-usage-badge>` property) renders alongside\n as plain text.\n- **Current step**: a single-line summary of whichever `run.steps` entry currently has\n `status.kind === 'running'` (the last such entry, if more than one) — a plain text line, not a\n list, so it doesn't duplicate `<lr-task-list>`'s own per-item rendering.\n- **Tasks slot default content**: when the host doesn't slot anything into `tasks` and\n `run.steps` is non-empty, this component's own `<slot>` fallback renders a `<lr-task-list>`\n populated by mapping every `AgentStep` to a `TaskItem` (see `toTaskItem()`) — a plain data\n adapter between the two existing shapes, not new rendering.\n- **Status badge**: composes `<lr-badge>`. **Empty state**: composes `<lr-empty>` when `run` is\n `null`.\n\n`tools`/`reasoning`/`output` are plain named slots with no default content — entirely the\nhost's own composition (typically `<lr-tool-call-chip>`/`<lr-tool-result-view>` rows,\nreasoning/streaming text, and final output respectively). An `actions` slot adds extra header\ncontrols alongside the built-in Cancel/Retry pair. The `header` and `summary` slots replace the\nbuilt-in lifecycle header and model/usage/metrics summary respectively. `statusLabels` and\n`statusVariants` make application-defined lifecycle kinds first-class, while `metrics` renders\narbitrary labeled values such as prompt and completion token counts.\n\nThe built-in Cancel button renders while `showCancel` is true and the run's status is one of\n`TICKING_KINDS` (still genuinely in progress); Retry renders while `showRetry` is true and the\nstatus is `error` or `cancelled`. Clicking either fires `lr-cancel`/`lr-retry` with\n`CancelEventDetail`/`RetryEventDetail` from `src/ai/types.ts` — this component never cancels or\nretries anything itself, it only requests. `RetryEventDetail.attempt` is a 1-based counter\nlocal to this component, incremented on every `lr-retry` click and reset to `0` whenever\n`run.id` changes (a genuinely new run replacing the old one, as opposed to the same run's status\nmerely updating in place).\n\nLifecycle transitions into an attention-needing or terminal state (`waiting-input`,\n`waiting-approval`, `done`, `error`, `cancelled`) are announced through an internal\n`<lr-live-region>`, mirroring `<lr-stream-status>`'s own stall/recover announcements —\n`running`/`idle` transitions are frequent and not independently actionable, so they stay\nsilent, and whatever status a freshly-assigned `run` (a new `run.id`) happens to already carry\nis never itself treated as an eventful transition, only a later in-place change is.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `actions` | Extra header actions alongside the built-in Cancel/Retry buttons. |\n| `header` | Replaces the built-in lifecycle header and its built-in actions. |\n| `output` | The run's final output content. No default content. |\n| `reasoning` | Reasoning/thinking content. No default content. |\n| `summary` | Replaces the built-in model, usage, and metrics summary. |\n| `tasks` | Task/plan content. Falls back to a `<lr-task-list>` built from `run.steps` when nothing is slotted and `run.steps` is non-empty. |\n| `tools` | Tool-call content (e.g. `<lr-tool-call-chip>`/`<lr-tool-result-view>` rows). No default content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | Wrapper around the `actions` slot and the built-in Cancel/Retry buttons. |\n| `base` | The root container. |\n| `body` | Wrapper around the four composition slots. |\n| `cancel-button` | The built-in Cancel button. Only rendered while cancelable (see the class doc). |\n| `current-step` | Wrapper around the current-step icon and label. Only rendered while a step has `status.kind === 'running'`. |\n| `current-step-icon` | The spinning current-step icon. |\n| `current-step-label` | The current step's `label` text. |\n| `elapsed` | The composed `<lr-generation-status>`, only rendered while the run is actively ticking (see the class doc). |\n| `elapsed-static` | The static formatted duration for a terminal run with both `startedAt` and `endedAt`. |\n| `empty` | The `<lr-empty>` shown when `run` is `null`. |\n| `header` | The header row wrapping status, elapsed time, current step, summary, and actions. |\n| `metric` | One arbitrary metric in the built-in summary. |\n| `metric-label` | The metric's label. |\n| `metric-value` | The metric's value. |\n| `model` | `run.model`, when set. |\n| `output` | The `output` slot. |\n| `reasoning` | The `reasoning` slot. |\n| `retry-button` | The built-in Retry button. Only rendered while retryable. |\n| `status` | Wrapper around the status badge and optional status message. |\n| `status-badge` | The resolved `<lr-badge>` lifecycle-status pill. |\n| `status-message` | `run.status.message`, when set. |\n| `summary` | Wrapper around the model text and the composed `<lr-usage-badge>`. Only rendered while `run.model` or a valid `run.costEstimate` is present. |\n| `tasks` | The `tasks` slot. |\n| `tools` | The `tools` slot. |\n| `usage` | The composed `<lr-usage-badge>`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-agent-run-spin` (default: `1s linear`) — Current-step icon spin animation duration and timing."
126
+ "value": "`<lr-agent-run>` — the top-level shell for one `AgentRun`: lifecycle-status badge, elapsed\ntime, current step, model/cost summary, and built-in Cancel/Retry controls in a header, plus\nfour named composition slots (`tasks`/`tools`/`reasoning`/`output`) for the run's actual\ncontent. This is deliberately a SHELL, not a new step-rendering surface — every piece of\nper-step or per-invocation rendering routes through an existing primitive:\n\n- **Elapsed time**: composes `<lr-generation-status>` (`active`/`started-at`, its own built-in\n Stop button hidden via `show-stop=\"false\"` since this component renders its own Cancel/Retry\n pair instead) for the *live, ticking* readout while the run is genuinely in progress\n (`running`/`collecting`/`waiting-input`/`waiting-approval`). `<lr-stream-status>` doesn't fit:\n its `phase` vocabulary\n (`idle`/`connecting`/`streaming`/`stalled`) models transport/connection health, not an agent\n run's nine built-in lifecycle statuses (plus application-defined extensions), and it exposes no elapsed-time readout at all — exactly the\n distinction `<lr-generation-status>`'s own class doc already draws between the two. Once the\n run reaches a terminal state (`done`/`error`/`cancelled`) with both a `startedAt` and an\n `endedAt`, this component instead renders a small locally-formatted static duration\n (`endedAt - startedAt`): `<lr-generation-status>`'s freeze-on-`active=false` semantics only\n ever freeze at whatever it last computed *live*, so mounting it directly against a completed\n run loaded from history (e.g. `startedAt` yesterday, `endedAt` five minutes later, loaded\n today) would either show a stale zero or the wrong multi-hour span — it has no way to render a\n fixed historical span on demand. That static fallback reuses the same small `formatDuration()`\n algorithm `<lr-usage-badge>` and `<lr-tool-call-chip>` already duplicate locally for the same\n reason (see this file's own copy).\n- **Model + cost summary**: composes `<lr-usage-badge>`, fed `run.costEstimate` (formatted via\n `formatCost`, or a plain `Intl.NumberFormat` by default — this library never assumes a\n currency, see `<lr-format-number>`'s own explicit `currency` prop) as its `cost-text`.\n `run.model` (a plain string with no analogous `<lr-usage-badge>` property) renders alongside\n as plain text.\n- **Current step**: a single-line summary of whichever `run.steps` entry currently has\n `status.kind === 'running'` (the last such entry, if more than one) — a plain text line, not a\n list, so it doesn't duplicate `<lr-task-list>`'s own per-item rendering.\n- **Tasks slot default content**: when the host doesn't slot anything into `tasks` and\n `run.steps` is non-empty, this component's own `<slot>` fallback renders a `<lr-task-list>`\n populated by mapping every `AgentStep` to a `TaskItem` (see `toTaskItem()`) — a plain data\n adapter between the two existing shapes, not new rendering.\n- **Status badge**: composes `<lr-badge>`. **Empty state**: composes `<lr-empty>` when `run` is\n `null`.\n\n`tools`/`reasoning`/`output` are plain named slots with no default content — entirely the\nhost's own composition (typically `<lr-tool-call-chip>`/`<lr-tool-result-view>` rows,\nreasoning/streaming text, and final output respectively). An `actions` slot adds extra header\ncontrols alongside the built-in Cancel/Retry pair. The `header` and `summary` slots replace the\nbuilt-in lifecycle header and model/usage/metrics summary respectively. `statusLabels` and\n`statusVariants` make application-defined lifecycle kinds first-class, while `metrics` renders\narbitrary labeled values such as prompt and completion token counts.\n\nThe built-in Cancel button renders while `showCancel` is true and the run's status is one of\n`TICKING_KINDS` (still genuinely in progress); Retry renders while `showRetry` is true and the\nstatus is `error` or `cancelled`. Clicking either fires `lr-cancel`/`lr-retry` with\n`CancelEventDetail`/`RetryEventDetail` from `src/ai/types.ts` — this component never cancels or\nretries anything itself, it only requests. `RetryEventDetail.attempt` is a 1-based counter\nlocal to this component, incremented on every `lr-retry` click and reset to `0` whenever\n`run.id` changes (a genuinely new run replacing the old one, as opposed to the same run's status\nmerely updating in place).\n\nLifecycle transitions into an attention-needing or terminal state (`waiting-input`,\n`waiting-approval`, `done`, `error`, `cancelled`) are announced through an internal\n`<lr-live-region>`, mirroring `<lr-stream-status>`'s own stall/recover announcements —\n`running`/`idle` transitions are frequent and not independently actionable, so they stay\nsilent, and whatever status a freshly-assigned `run` (a new `run.id`) happens to already carry\nis never itself treated as an eventful transition, only a later in-place change is.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `actions` | Extra header actions alongside the built-in Cancel/Retry buttons. |\n| `header` | Replaces the built-in lifecycle header and its built-in actions. |\n| `output` | The run's final output content. No default content. |\n| `reasoning` | Reasoning/thinking content. No default content. |\n| `summary` | Replaces the built-in model, usage, and metrics summary. |\n| `tasks` | Task/plan content. Falls back to a `<lr-task-list>` built from `run.steps` when nothing is slotted and `run.steps` is non-empty. |\n| `tools` | Tool-call content (e.g. `<lr-tool-call-chip>`/`<lr-tool-result-view>` rows). No default content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | Wrapper around the `actions` slot and the built-in Cancel/Retry buttons. |\n| `base` | The root container. |\n| `body` | Wrapper around the four composition slots. |\n| `cancel-button` | The built-in Cancel button. Only rendered while cancelable (see the class doc). |\n| `current-step` | Wrapper around the current-step icon and label. Only rendered while a step has `status.kind === 'running'`. |\n| `current-step-icon` | The spinning current-step icon. |\n| `current-step-label` | The current step's `label` text. |\n| `elapsed` | The composed `<lr-generation-status>`, only rendered while the run is actively ticking (see the class doc). |\n| `elapsed-static` | The static formatted duration for a terminal run with both `startedAt` and `endedAt`. |\n| `empty` | The `<lr-empty>` shown when `run` is `null`. |\n| `header` | The header row wrapping status, elapsed time, current step, summary, and actions. |\n| `metric` | One arbitrary metric in the built-in summary. |\n| `metric-label` | The metric's label. |\n| `metric-value` | The metric's value. |\n| `model` | `run.model`, when set. |\n| `output` | The `output` slot. |\n| `reasoning` | The `reasoning` slot. |\n| `retry-button` | The built-in Retry button. Only rendered while retryable. |\n| `status` | Wrapper around the status badge and optional status message. |\n| `status-badge` | The resolved `<lr-badge>` lifecycle-status pill. |\n| `status-message` | `run.status.message`, when set. |\n| `summary` | Wrapper around the model text and the composed `<lr-usage-badge>`. Only rendered while `run.model` or a valid `run.costEstimate` is present. |\n| `tasks` | The `tasks` slot. |\n| `tools` | The `tools` slot. |\n| `usage` | The composed `<lr-usage-badge>`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-agent-run-spin` (default: `1s linear`) — Current-step icon spin animation duration and timing.\n- `--lr-agent-run-compact-padding` (default: `var(--lr-space-s)`) — `[part=\"base\"]` padding while `compact`.\n- `--lr-agent-run-compact-gap` (default: `var(--lr-space-s)`) — Gap between `[part=\"base\"]`'s header and body while `compact`."
127
127
  },
128
128
  "attributes": [
129
+ {
130
+ "name": "appearance",
131
+ "description": {
132
+ "kind": "markdown",
133
+ "value": "Visual chrome, mirroring `lr-card`'s `appearance` vocabulary. `'card'` (the default) keeps the\nbordered, filled, padded box. `'plain'` removes the border, background, padding and corner\nradius, so a run nested inside a host frame that already draws a border doesn't double it.\n`plain` wins over `compact` when both are set (nothing left to tighten). The built-in\nCancel/Retry buttons draw their own border/background and stay visibly interactive either\nway.\n\nType: `AgentRunAppearance` \nDefault: `'card'`"
134
+ }
135
+ },
136
+ {
137
+ "name": "compact",
138
+ "description": {
139
+ "kind": "markdown",
140
+ "value": "Tighter root padding and header/body gap for dense contexts (a run rendered as a row in a\nlist, a side panel) -- same convention as `lr-empty`'s `compact`. Defaults to `false`, i.e.\nthe full card padding. Purely a density knob: the border and background stay, so use\n`appearance=\"plain\"` instead to drop the chrome entirely.\n\nType: `boolean` \nDefault: `false`"
141
+ }
142
+ },
129
143
  {
130
144
  "name": "locale",
131
145
  "description": {
@@ -153,7 +167,7 @@
153
167
  "name": "lr-agent-trace",
154
168
  "description": {
155
169
  "kind": "markdown",
156
- "value": "`<lr-agent-trace>` — a provider-neutral agent/LLM trace view: a span-kind filter row, a\nhandoff quick-jump list, and the full trace hierarchy, all driven by one shared `LyraSpan[]`\narray (the same shape `<lr-trace-tree>` and `<lr-span-waterfall>` already consume).\n\nThe actual trace rendering -- hierarchy, expand/collapse, roving-tabindex keyboard navigation,\nduration bars, the empty state -- is entirely `<lr-trace-tree>`'s own: this component only ever\npasses it a (possibly filtered) `spans` array plus a handful of pass-through properties, never\nbuilding its own row markup. `<lr-trace-tree>` was chosen over `<lr-span-waterfall>` because a\ntrace is fundamentally the hierarchy relationship between spans (which agent called which tool,\nwhich handed off to which sub-agent) -- exactly what `parentId`-derived `aria-level` nesting\nconveys and a flat, `startMs`-ordered timeline does not.\n\nThis component's own contribution is the multi-domain filter layer on top of that: a filter\nrow composing `<lr-graph-legend>` -- the same abstract type/visibility-toggle legend pattern\nthat component already establishes for `<lr-graph>`'s node types, reused here (it neither\nreads nor writes an actual graph) for `LyraSpan.kind` visibility instead -- and a handoff\nquick-jump list composing `<lr-handoff-divider>` for each visible `'agent'`-kind span (an\nagent invocation is, in trace terms, a handoff of control to that agent). Hidden kinds are\nsimply excluded from the array handed to `<lr-trace-tree>`; a span whose parent got filtered\nout is promoted to a root by `<lr-trace-tree>`'s own existing orphan handling, never dropped.\n\nSelection is controlled end-to-end for deep-linking: `activeSpanId` flows down into\n`<lr-trace-tree>` verbatim, and both activation paths -- a row click inside the tree, or a\nhandoff quick-jump entry -- update it and fire the identical `lr-span-select` `{ id }` shape, so\na host can encode the current span id in a URL and feed it straight back in.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `filter` | The composed `<lr-graph-legend>` filter row, only rendered while `spans` has at least one span. |\n| `handoff` | One handoff quick-jump entry (a `<button>` wrapping an `<lr-handoff-divider>`); carries `data-active`. |\n| `handoffs` | The handoff quick-jump list wrapper, only rendered while at least one visible span has `kind: 'agent'`. |\n| `tree` | The composed `<lr-trace-tree>`. |"
170
+ "value": "`<lr-agent-trace>` — a provider-neutral agent/LLM trace view: a span-kind filter row, a\nhandoff quick-jump list, and the full trace hierarchy, all driven by one shared `LyraSpan[]`\narray (the same shape `<lr-trace-tree>` and `<lr-span-waterfall>` already consume).\n\nThe actual trace rendering -- hierarchy, expand/collapse, roving-tabindex keyboard navigation,\nduration bars, the empty state -- is entirely `<lr-trace-tree>`'s own: this component only ever\npasses it a (possibly filtered) `spans` array plus a handful of pass-through properties, never\nbuilding its own row markup. `<lr-trace-tree>` was chosen over `<lr-span-waterfall>` because a\ntrace is fundamentally the hierarchy relationship between spans (which agent called which tool,\nwhich handed off to which sub-agent) -- exactly what `parentId`-derived `aria-level` nesting\nconveys and a flat, `startMs`-ordered timeline does not.\n\nThis component's own contribution is the multi-domain filter layer on top of that: a filter\nrow composing `<lr-graph-legend>` -- the same abstract type/visibility-toggle legend pattern\nthat component already establishes for `<lr-graph>`'s node types, reused here (it neither\nreads nor writes an actual graph) for `LyraSpan.kind` visibility instead -- and a handoff\nquick-jump list composing `<lr-handoff-divider>` for each visible `'agent'`-kind span (an\nagent invocation is, in trace terms, a handoff of control to that agent). Hidden kinds are\nsimply excluded from the array handed to `<lr-trace-tree>`; a span whose parent got filtered\nout is promoted to a root by `<lr-trace-tree>`'s own existing orphan handling, never dropped.\n\nSelection is controlled end-to-end for deep-linking: `activeSpanId` flows down into\n`<lr-trace-tree>` verbatim, and both activation paths -- a row click inside the tree, or a\nhandoff quick-jump entry -- update it and fire the identical `lr-span-select` `{ id }` shape, so\na host can encode the current span id in a URL and feed it straight back in.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `filter` | The composed `<lr-graph-legend>` filter row, only rendered while `spans` has at least one span. |\n| `handoff` | One handoff quick-jump entry (a `<button>` wrapping an `<lr-handoff-divider>`); carries `data-active`. |\n| `handoffs` | The handoff quick-jump list wrapper, only rendered while at least one visible span has `kind: 'agent'`. |\n| `tree` | The composed `<lr-trace-tree>`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-agent-trace-handoff-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the active (`activeSpanId`) handoff quick-jump entry. Shadow Parts forbids an attribute selector after `::part()`, so the active entry could otherwise only be restyled by hijacking the library-wide `--lr-color-brand-quiet` token."
157
171
  },
158
172
  "attributes": [
159
173
  {
@@ -619,7 +633,7 @@
619
633
  "name": "lr-app-rail-item",
620
634
  "description": {
621
635
  "kind": "markdown",
622
- "value": "`<lr-app-rail-item>` — an explicit icon/label navigation item for\n`<lr-app-rail>`. The rail sets its `icon-only` attribute as the viewport\nchanges, keeping the label available to assistive technology while removing\nit from the visual layout.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The visible navigation label. |\n| `icon` | The leading icon. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The link or button receiving focus and activation. |\n| `icon` | The icon wrapper. |\n| `label` | The label wrapper; visually clipped in icon-only mode. |\n| `tooltip` | The hover/focus label flyout, only rendered while `tooltip` is set, the item is `icon-only`, and it is hovered or focused. |"
636
+ "value": "`<lr-app-rail-item>` — an explicit icon/label navigation item for\n`<lr-app-rail>`. The rail sets its `icon-only` attribute as the viewport\nchanges, keeping the label available to assistive technology while removing\nit from the visual layout.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The visible navigation label. |\n| `icon` | The leading icon. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The link or button receiving focus and activation. |\n| `icon` | The icon wrapper. |\n| `label` | The label wrapper; visually clipped in icon-only mode. |\n| `tooltip` | The hover/focus label flyout, only rendered while `tooltip` is set, the item is `icon-only`, and it is hovered or focused. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-app-rail-item-current-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the `active`/`aria-current=\"page\"` item. Scoped to `[aria-current='page']` only and declared as an inline `var()` fallback (never on `:host`), so setting it on the element or an ancestor recolors only the current item without hijacking the library-wide `--lr-color-brand-quiet` token.\n- `--lr-app-rail-item-current-color` (default: `var(--lr-color-brand)`) — Text/icon color of the `active`/`aria-current=\"page\"` item."
623
637
  },
624
638
  "attributes": [
625
639
  {
@@ -670,7 +684,7 @@
670
684
  "name": "lr-archive-viewer",
671
685
  "description": {
672
686
  "kind": "markdown",
673
- "value": "Lists names and uncompressed sizes in a ZIP archive without rendering entry contents. File sizes\nare measured through JSZip's public async API, so opening an archive decompresses each file once.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root container. |\n| `entry` | An archive entry row. |\n| `entry-icon` | The decorative folder or file icon. |\n| `entry-name` | The entry path. |\n| `entry-size` | The human-readable file size. |\n| `error` | The error region. |\n| `spinner` | The loading region. |"
687
+ "value": "Lists names and uncompressed sizes in a ZIP archive without rendering entry contents. File sizes\nare measured through JSZip's public async API, so opening an archive decompresses each file once.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root container. |\n| `entry` | An archive entry row. |\n| `entry-icon` | The decorative folder or file icon. |\n| `entry-name` | The entry path. |\n| `entry-name-dir` | The entry path of a directory row (also carries `entry-name`). |\n| `entry-size` | The human-readable file size. |\n| `error` | The error region. |\n| `spinner` | The loading region. |"
674
688
  },
675
689
  "attributes": [
676
690
  {
@@ -700,7 +714,7 @@
700
714
  "name": "lr-artifact-panel",
701
715
  "description": {
702
716
  "kind": "markdown",
703
- "value": "`<lr-artifact-panel>` — shell around one agent-generated artifact: a\ntitle/kind header, a preview<->code toggle, version navigation with\nrestore, a streaming indicator, and built-in copy/download actions.\nRenders none of the artifact itself — content is slotted.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Preview-view content. |\n| `actions` | Extra header controls, rendered between the version navigation and the built-in copy/download buttons. |\n| `code` | Code-view content (typically a `<lr-code-block>`). The preview/code toggle only renders once this slot has assigned content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The `actions` slot wrapper. |\n| `base` | The root wrapper. |\n| `body` | The content body wrapper. |\n| `copy-button` | The copy button, rendered only while `copyText` is non-empty. |\n| `download-button` | The download button, rendered only while `downloadSrc` is non-empty. |\n| `header` | The header row. |\n| `kind` | The kind badge. |\n| `label` | The artifact title. |\n| `restore-button` | The restore-this-version button, rendered only while the active version isn't the latest one. |\n| `streaming-indicator` | The streaming state indicator, rendered only while `streaming`. |\n| `version-nav` | The version navigation group (rendered only once `versions` is non-empty). |\n| `version-next` | The next-version button. |\n| `version-position` | The \"Version N of M\" text. |\n| `version-previous` | The previous-version button. |\n| `view-button` | One toggle button; carries `data-view=\"preview\"` or `data-view=\"code\"`. |\n| `view-toggle` | The preview/code toggle group (rendered only once the `code` slot has content). |"
717
+ "value": "`<lr-artifact-panel>` — shell around one agent-generated artifact: a\ntitle/kind header, a preview<->code toggle, version navigation with\nrestore, a streaming indicator, and built-in copy/download actions.\nRenders none of the artifact itself — content is slotted.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Preview-view content. |\n| `actions` | Extra header controls, rendered between the version navigation and the built-in copy/download buttons. |\n| `code` | Code-view content (typically a `<lr-code-block>`). The preview/code toggle only renders once this slot has assigned content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The `actions` slot wrapper. |\n| `base` | The root wrapper. |\n| `body` | The content body wrapper. |\n| `copy-button` | The copy button, rendered only while `copyText` is non-empty. |\n| `download-button` | The download button, rendered only while `downloadSrc` is non-empty. |\n| `header` | The header row. |\n| `kind` | The kind badge. |\n| `label` | The artifact title. |\n| `restore-button` | The restore-this-version button, rendered only while the active version isn't the latest one. |\n| `streaming-indicator` | The streaming state indicator, rendered only while `streaming`. |\n| `version-nav` | The version navigation group (rendered only once `versions` is non-empty). |\n| `version-next` | The next-version button. |\n| `version-next-glyph` | The chevron glyph inside `version-next`, mirrored under RTL. |\n| `version-position` | The \"Version N of M\" text. |\n| `version-previous` | The previous-version button. |\n| `version-previous-glyph` | The chevron glyph inside `version-previous`, mirrored under RTL. |\n| `view-button` | One toggle button; carries `data-view=\"preview\"` or `data-view=\"code\"`. |\n| `view-toggle` | The preview/code toggle group (rendered only once the `code` slot has content). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-artifact-panel-view-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the pressed (active) preview/code toggle button.\n- `--lr-artifact-panel-view-active-color` (default: `var(--lr-color-brand)`) — Text color of the pressed (active) preview/code toggle button. Restyling the pressed state otherwise requires overriding the library-wide brand tokens, since `::part(view-button)[aria-pressed]` is invalid CSS."
704
718
  },
705
719
  "attributes": [
706
720
  {
@@ -780,7 +794,7 @@
780
794
  "name": "lr-attachment-chip",
781
795
  "description": {
782
796
  "kind": "markdown",
783
- "value": "`<lr-attachment-chip>` — a compact chip representing one file queued for\n(or already part of) a chat message: a composer's pre-send attachment\ntray, or a sent message's `attachments` slot (see `<lr-chat-message>`).\n\nTwo independent ways to populate it, matching the two points in a message's\nlifecycle this is used at:\n - Set `file` to a real `File` (fresh from a picker/drop) — `name`, `size`,\n `mime-type` and the image thumbnail are all auto-derived from it.\n - Set the plain `name`/`size`/`mime-type`/`thumbnail-src` props instead,\n for reconstructing a chip from server-persisted attachment metadata\n (e.g. after a page reload, when no real `File` object exists any more).\n\n`file` always wins when both are present — see each accessor's own doc.\nThe image thumbnail for a real `File` is a cached `URL.createObjectURL()`\nblob URL, created in the update lifecycle immediately before the thumbnail\nrenders and revoked automatically once `file`\nchanges away from the object it was created for, and on disconnect — this\ncomponent never leaks a blob URL.\n\nIdentifying *which* attachment a `lr-remove`/`lr-retry` event is about:\nthis deliberately reuses the platform's own `id`/`id` attribute (every\nelement already has one; there's no need to shadow it with a second,\ndifferently-named Lit property, unlike e.g. `<lr-tool-call-chip>`'s\n`call-id` which identifies a *call*, a concept distinct from the chip\nelement itself). Set `id=\"...\"` when you have a stable server-side\nattachment id. When `id` is left unset and `file` is set, a stable id is\nderived from `` `${file.name}:${file.size}:${file.lastModified}` `` — stable\nacross re-renders of the *same* `File` object without requiring the\nconsumer to invent one. When neither is available, a generated internal id\nis used as a last resort so the event always has *some* id.\n\ni18n/locale: complete contextual messages (including filename/percentage\nplacement and punctuation) route through the shared localization registry.\n`removeLabel`/`retryLabel`/`uploadingLabel`/`uploadFailedLabel` remain as\nsimple per-instance copy overrides; use the component's `.strings` map or a\nregistered locale when a translation needs to reorder the interpolated\nvalues. These are plain properties, not slots — this component still\nexposes no slots.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chip's root container. |\n| `meta` | Wrapper around `name` and `size`. |\n| `name` | The filename (ellipsis-truncated via CSS; the untruncated name is always available via the native `title` tooltip). |\n| `preview-button` | The preview affordance, rendered when a file or `preview-src` is available. |\n| `progress` | The numeric upload progress bar (`role=\"progressbar\"`), shown only while `status=\"uploading\"` and `progress` is a meaningful (>0) number. |\n| `progress-fill` | The filled portion of `progress`. |\n| `remove-button` | The remove (×) affordance, only rendered while `removable`. |\n| `retry-button` | The retry affordance, only rendered while `status=\"error\"`. |\n| `size` | The human-readable formatted file size. Hidden when no size is known. |\n| `spinner` | The indeterminate upload spinner, shown instead of `progress` while `status=\"uploading\"` and `progress` is unset/0. |\n| `status-text` | The visible text twin of the status accent color — carries the state in text, not just color. Empty/hidden for `pending`/`done`. Gets `role=\"alert\"` for `status=\"error\"` only, so a screen-reader user not already focused on the chip still hears an upload failure; the ticking `'uploading'` readout deliberately stays out of the accessibility tree the same way `<lr-generation-status>`'s per-second elapsed/token readout does — a live region re-announcing every progress tick would be noise, not information, while a one-shot failure is exactly the kind of infrequent, actionable transition a live region exists for. |\n| `thumbnail` | The leading image thumbnail / generic file glyph. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-attachment-chip-spinner-duration` (default: `0.8s`) — Duration of one indeterminate upload-spinner rotation. The ambient loop stops under reduced motion.\n- `--lr-attachment-chip-accent` (default: `var(--lr-color-text-quiet)`) — Accent color used for the status text, spinner, and progress fill. Auto-swapped per `status` (`uploading`/`error`/`done`); the default is the neutral `pending` tone.\n- `--lr-attachment-chip-bg` (default: `var(--lr-color-surface)`) — Chip background, auto-swapped per `status` to that status's `-quiet` tint.\n- `--lr-attachment-chip-border` (default: `var(--lr-color-border)`) — Chip border color. Every non-`pending` `status` sets it to `transparent`.\n- `--lr-attachment-chip-compact-thumbnail-size` (default: `var(--lr-size-1-75rem)`) — Thumbnail size while `compact`, rethemeable independently of `--lr-icon-button-size`.\n- `--lr-attachment-chip-compact-font-size` (default: `var(--lr-font-size-xs)`) — Font size of `[part=\"base\"]` while `compact`.\n- `--lr-attachment-chip-compact-gap` (default: `var(--lr-size-0-25rem)`) — Gap between the chip's parts while `compact`."
797
+ "value": "`<lr-attachment-chip>` — a compact chip representing one file queued for\n(or already part of) a chat message: a composer's pre-send attachment\ntray, or a sent message's `attachments` slot (see `<lr-chat-message>`).\n\nTwo independent ways to populate it, matching the two points in a message's\nlifecycle this is used at:\n - Set `file` to a real `File` (fresh from a picker/drop) — `name`, `size`,\n `mime-type` and the image thumbnail are all auto-derived from it.\n - Set the plain `name`/`size`/`mime-type`/`thumbnail-src` props instead,\n for reconstructing a chip from server-persisted attachment metadata\n (e.g. after a page reload, when no real `File` object exists any more).\n\n`file` always wins when both are present — see each accessor's own doc.\nThe image thumbnail for a real `File` is a cached `URL.createObjectURL()`\nblob URL, created in the update lifecycle immediately before the thumbnail\nrenders and revoked automatically once `file`\nchanges away from the object it was created for, and on disconnect — this\ncomponent never leaks a blob URL.\n\nIdentifying *which* attachment a `lr-remove`/`lr-retry` event is about:\nthis deliberately reuses the platform's own `id`/`id` attribute (every\nelement already has one; there's no need to shadow it with a second,\ndifferently-named Lit property, unlike e.g. `<lr-tool-call-chip>`'s\n`call-id` which identifies a *call*, a concept distinct from the chip\nelement itself). Set `id=\"...\"` when you have a stable server-side\nattachment id. When `id` is left unset and `file` is set, a stable id is\nderived from `` `${file.name}:${file.size}:${file.lastModified}` `` — stable\nacross re-renders of the *same* `File` object without requiring the\nconsumer to invent one. When neither is available, a generated internal id\nis used as a last resort so the event always has *some* id.\n\ni18n/locale: complete contextual messages (including filename/percentage\nplacement and punctuation) route through the shared localization registry.\n`removeLabel`/`retryLabel`/`uploadingLabel`/`uploadFailedLabel` remain as\nsimple per-instance copy overrides; use the component's `.strings` map or a\nregistered locale when a translation needs to reorder the interpolated\nvalues. These are plain properties, not slots — this component still\nexposes no slots.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chip's root container. |\n| `meta` | Wrapper around `name` and `size`. |\n| `name` | The filename (ellipsis-truncated via CSS; the untruncated name is always available via the native `title` tooltip). |\n| `preview-button` | The preview affordance, rendered when a file or `preview-src` is available. |\n| `progress` | The numeric upload progress bar (`role=\"progressbar\"`), shown only while `status=\"uploading\"` and `progress` is a meaningful (>0) number. |\n| `progress-fill` | The filled portion of `progress`. |\n| `remove-button` | The remove (×) affordance, only rendered while `removable`. |\n| `retry-button` | The retry affordance, only rendered while `status=\"error\"`. |\n| `size` | The human-readable formatted file size. Hidden when no size is known. |\n| `spinner` | The indeterminate upload spinner, shown instead of `progress` while `status=\"uploading\"` and `progress` is unset/0. |\n| `status-text` | The visible text twin of the status accent color — carries the state in text, not just color. Empty/hidden for `pending`/`done`. Gets `role=\"alert\"` for `status=\"error\"` only, so a screen-reader user not already focused on the chip still hears an upload failure; the ticking `'uploading'` readout deliberately stays out of the accessibility tree the same way `<lr-generation-status>`'s per-second elapsed/token readout does — a live region re-announcing every progress tick would be noise, not information, while a one-shot failure is exactly the kind of infrequent, actionable transition a live region exists for. |\n| `thumbnail` | The leading image thumbnail / generic file glyph. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-attachment-chip-spinner-duration` (default: `0.8s`) — Duration of one indeterminate upload-spinner rotation. The ambient loop stops under reduced motion.\n- `--lr-attachment-chip-accent` (default: `var(--lr-color-text-quiet)`) — Accent color used for the status text, spinner, and progress fill. Auto-swapped per `status` (`uploading`/`error`/`done`); the default is the neutral `pending` tone.\n- `--lr-attachment-chip-bg` (default: `var(--lr-color-surface)`) — Chip background, auto-swapped per `status` to that status's `-quiet` tint.\n- `--lr-attachment-chip-border` (default: `var(--lr-color-border)`) — Chip border color. Every non-`pending` `status` sets it to `transparent`.\n- `--lr-attachment-chip-compact-thumbnail-size` (default: `var(--lr-size-1-75rem)`) — Thumbnail and retry/preview/remove-button minimum size while `compact`, rethemeable independently of `--lr-icon-button-size`.\n- `--lr-attachment-chip-compact-font-size` (default: `var(--lr-font-size-xs)`) — Font size of `[part=\"base\"]` while `compact`.\n- `--lr-attachment-chip-compact-gap` (default: `var(--lr-size-0-25rem)`) — Gap between the chip's parts while `compact`."
784
798
  },
785
799
  "attributes": [
786
800
  {
@@ -959,7 +973,7 @@
959
973
  "name": "lr-audio-visualizer",
960
974
  "description": {
961
975
  "kind": "markdown",
962
- "value": "`<lr-audio-visualizer>` — a presentational, canvas-drawn voice-activity visualization (bars or\nwaveform), the LiveKit-BarVisualizer counterpart for this library. Driven by a `MediaStream`\n(lazily wired to a WebAudio `AnalyserNode`), a numeric `level` for hosts that already compute\nlevels (e.g. `lr-push-to-talk`'s `lr-level`), or `state` alone for an ambient animation when no\nreal signal exists. A real signal (`stream` or `level`) always drives amplitude regardless of\n`prefers-reduced-motion` — that is live, user-controlled feedback, not decorative motion; only the\nsignal-less ambient animation is throttled and simplified under reduced motion.\n\nAnimation frames are only scheduled while the drawn output is actually time-varying (live analyser\ndata, or a non-reduced ambient pulse/sweep). Static output — a constant `level`, idle bars, or the\nflattened reduced-motion ambient patterns — draws once and stops; any change that could alter the\nnext frame (properties, stream/`AudioContext` state, size, theme, motion preference) re-enters the\nloop via `scheduleDraw()`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `canvas` | The drawing surface (`aria-hidden`; the host itself carries `role=\"img\"` and the accessible name). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-audio-visualizer-color` (default: `var(--lr-color-brand)`) — Active bar/waveform color.\n- `--lr-audio-visualizer-quiet-color` (default: `var(--lr-color-brand-quiet)`) — Inactive/idle color.\n- `--lr-audio-visualizer-height` (default: `var(--lr-size-3rem)`) — The host's block size, which the canvas fills at 100%."
976
+ "value": "`<lr-audio-visualizer>` — a presentational, canvas-drawn voice-activity visualization (bars or\nwaveform), the LiveKit-BarVisualizer counterpart for this library. Driven by a `MediaStream`\n(lazily wired to a WebAudio `AnalyserNode`), a numeric `level` for hosts that already compute\nlevels (e.g. `lr-push-to-talk`'s `lr-level`), or `state` alone for an ambient animation when no\nreal signal exists. A real signal (`stream` or `level`) always drives amplitude regardless of\n`prefers-reduced-motion` — that is live, user-controlled feedback, not decorative motion; only the\nsignal-less ambient animation is throttled and simplified under reduced motion.\n\nAnimation frames are only scheduled while the drawn output is actually time-varying (live analyser\ndata, or a non-reduced ambient pulse/sweep). Static output — a constant `level`, idle bars, or the\nflattened reduced-motion ambient patterns — draws once and stops; any change that could alter the\nnext frame (properties, stream/`AudioContext` state, size, theme, motion preference) re-enters the\nloop via `scheduleDraw()`. The loop is also paused while the host is scrolled off-screen (an\n`IntersectionObserver`-gated `visible` flag, mirroring `<lr-chart>`'s own `draw()` gating), so a\nlive-signal visualizer buried behind later transcript messages doesn't keep repainting for nobody.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `canvas` | The drawing surface (`aria-hidden`; the host itself carries `role=\"img\"` and the accessible name). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-audio-visualizer-color` (default: `var(--lr-color-brand)`) — Active bar/waveform color.\n- `--lr-audio-visualizer-quiet-color` (default: `var(--lr-color-brand-quiet)`) — Inactive/idle color.\n- `--lr-audio-visualizer-height` (default: `var(--lr-size-3rem)`) — The host's block size, which the canvas fills at 100%."
963
977
  },
964
978
  "attributes": [
965
979
  {
@@ -1017,7 +1031,7 @@
1017
1031
  "name": "lr-av-player",
1018
1032
  "description": {
1019
1033
  "kind": "markdown",
1020
- "value": "`<lr-av-player>` — audio/video player built on a native `<audio>`/`<video>` element, plus a cue\ntranscript synced to `currentTime`, `time-range` anchor/highlight support, an optional\ndependency-free waveform (peaks in, no in-component decoding), and playback-rate control. Owns\nrecorded-media transcript sync; distinct from `<lr-transcript-feed>` (live captions for an\nin-progress voice session) and `<lr-playback>` (an index stepper over `[0, length)` for\ntime-series dashboards — no media involved in either).\n\nAdopts `DocumentAnchorTarget` with `anchorKinds: ['time-range']` only. No text selection is bound:\ntranscript rows render inside `<lr-virtual-list>`'s own nested shadow root, one boundary deeper\nthan the mixin's default selection lookup resolves.\n\nThe transcript virtualizes through `<lr-virtual-list>` the same way `pdf-viewer.class.ts`\nvirtualizes pages: `items`/`renderItem`/`keyFunction`/`activeId` props, and the active cue's\nscroll-into-view comes for free from `activeId` rather than any custom follow logic.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `cue` | One transcript row (`aria-current`, `data-match`, `data-active-match`). |\n| `cue-speaker` | A cue's speaker label. |\n| `cue-text` | A cue's text. |\n| `cue-time` | A cue's timestamp label. |\n| `error` | The error region. |\n| `media` | The native `<audio>`/`<video>` element. |\n| `rate-select` | The playback-rate `<select>`. |\n| `timeline` | The waveform canvas or plain seek rail; click-to-seek and arrow-key seeking. |\n| `timeline-marker` | One clickable marker per `time-range` highlight (`data-tone`, `data-active`). |\n| `toolbar` | The playback-rate control row. |\n| `transcript` | The virtualized cue list (`<lr-virtual-list>` itself). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-av-player-transcript-height` (default: `var(--lr-size-16rem)`) — Block size of the virtualized transcript list."
1034
+ "value": "`<lr-av-player>` — audio/video player built on a native `<audio>`/`<video>` element, plus a cue\ntranscript synced to `currentTime`, `time-range` anchor/highlight support, an optional\ndependency-free waveform (peaks in, no in-component decoding), and playback-rate control. Owns\nrecorded-media transcript sync; distinct from `<lr-transcript-feed>` (live captions for an\nin-progress voice session) and `<lr-playback>` (an index stepper over `[0, length)` for\ntime-series dashboards — no media involved in either).\n\nAdopts `DocumentAnchorTarget` with `anchorKinds: ['time-range']` only. No text selection is bound:\ntranscript rows render inside `<lr-virtual-list>`'s own nested shadow root, one boundary deeper\nthan the mixin's default selection lookup resolves.\n\nThe transcript virtualizes through `<lr-virtual-list>` the same way `pdf-viewer.class.ts`\nvirtualizes pages: `items`/`renderItem`/`keyFunction`/`activeId` props, and the active cue's\nscroll-into-view comes for free from `activeId` rather than any custom follow logic.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `cue` | One transcript row (`aria-current`, `data-match`, `data-active-match`). |\n| `cue-active-match` | Added alongside `cue`/`cue-match` on the row holding the current search match. |\n| `cue-current` | Added alongside `cue` on the row the playhead is inside. A second part name rather than an attribute selector, because Shadow Parts forbids an attribute selector after `::part()`. |\n| `cue-match` | Added alongside `cue` on every row matching the current search query. |\n| `cue-speaker` | A cue's speaker label. |\n| `cue-text` | A cue's text. |\n| `cue-time` | A cue's timestamp label. |\n| `error` | The error region. |\n| `media` | The native `<audio>`/`<video>` element. |\n| `rate-select` | The playback-rate `<select>`. |\n| `timeline` | The waveform canvas or plain seek rail; click-to-seek and arrow-key seeking. |\n| `timeline-marker` | One clickable marker per `time-range` highlight (`data-tone`, `data-active`). |\n| `toolbar` | The playback-rate control row. |\n| `transcript` | The virtualized cue list (`<lr-virtual-list>` itself). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-av-player-transcript-height` (default: `var(--lr-size-16rem)`) — Block size of the virtualized transcript list.\n- `--lr-av-player-marker-active-color` (default: `var(--lr-color-brand)`) — Outline color of the `[part=\"timeline-marker\"]` matching `activeHighlightId`.\n- `--lr-av-player-marker-bg` (default: `color-mix(in srgb, var(--lr-color-brand) 35%, transparent)`) — Background of a `[part=\"timeline-marker\"]` with no (or an unrecognized) `data-tone`.\n- `--lr-av-player-marker-success-bg` (default: `color-mix(in srgb, var(--lr-color-success) 35%, transparent)`) — Background of a `[part=\"timeline-marker\"][data-tone=\"success\"]`.\n- `--lr-av-player-marker-warning-bg` (default: `color-mix(in srgb, var(--lr-color-warning) 35%, transparent)`) — Background of a `[part=\"timeline-marker\"][data-tone=\"warning\"]`.\n- `--lr-av-player-marker-danger-bg` (default: `color-mix(in srgb, var(--lr-color-danger) 35%, transparent)`) — Background of a `[part=\"timeline-marker\"][data-tone=\"danger\"]`.\n- `--lr-av-player-marker-neutral-bg` (default: `color-mix(in srgb, var(--lr-color-text) 25%, transparent)`) — Background of a `[part=\"timeline-marker\"][data-tone=\"neutral\"]`.\n- `--lr-av-player-cue-current-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the `[part=\"cue\"]` the playhead is currently inside.\n- `--lr-av-player-cue-active-match-color` (default: `var(--lr-color-warning)`) — Outline color of the `[part=\"cue\"]` holding the current search match, leaving the other matches' dashed outline on the shared warning token."
1021
1035
  },
1022
1036
  "attributes": [
1023
1037
  {
@@ -1107,7 +1121,7 @@
1107
1121
  "name": "lr-avatar",
1108
1122
  "description": {
1109
1123
  "kind": "markdown",
1110
- "value": "`<lr-avatar>` — a small, fixed-size identity marker: default-slotted icon/glyph content, an\nimage, or an initials fallback, in that priority order (whichever's set takes over from the\nnext). First-party invention (no Web Awesome equivalent) -- purely presentational, no built-in\ninteractivity; a consumer wraps it in their own `<button>`/`<lr-menu>` trigger for a\nuser-menu affordance.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Icon/glyph content (e.g. an inline SVG) shown in place of the image/initials, e.g. to mark a chat message avatar as \"AI\" vs. \"user\" with a role glyph instead of a photo or initials. Takes priority over both `src` and `initials`. The glyph itself is treated as decorative (`aria-hidden`); set `alt` alongside it for an accessible name. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer circle/square container. |\n| `icon` | Wrapper around the default-slotted icon/glyph content. Only rendered while the slot has assigned content. |\n| `image` | The `<img>`, only rendered while `src` is set and has not failed to load (and no icon content is slotted). |\n| `initials` | The fallback initials text, rendered whenever neither slotted content nor `image` is. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-avatar-size` (default: `var(--lr-size-2rem)`) — Inline and block size of the container. `size` swaps it to `var(--lr-size-1-5rem)` (`sm`) or `var(--lr-size-2-5rem)` (`lg`).\n- `--lr-avatar-bg` (default: `var(--lr-color-border)`) — Container background. Each non-neutral `tone` sets it to that tone's `-quiet` tint.\n- `--lr-avatar-color` (default: `var(--lr-color-text)`) — Initials/glyph color. Each non-neutral `tone` sets it to that tone's loud color."
1124
+ "value": "`<lr-avatar>` — a small, fixed-size identity marker: default-slotted icon/glyph content, an\nimage, or an initials fallback, in that priority order (whichever's set takes over from the\nnext). First-party invention (no Web Awesome equivalent) -- purely presentational, no built-in\ninteractivity; a consumer wraps it in their own `<button>`/`<lr-menu>` trigger for a\nuser-menu affordance.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Icon/glyph content (e.g. an inline SVG) shown in place of the image/initials, e.g. to mark a chat message avatar as \"AI\" vs. \"user\" with a role glyph instead of a photo or initials. Takes priority over both `src` and `initials`. The glyph itself is treated as decorative (`aria-hidden`); set `alt` alongside it for an accessible name. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer circle/square container. |\n| `icon` | Wrapper around the default-slotted icon/glyph content. Only rendered while the slot has assigned content. |\n| `image` | The `<img>`, only rendered while `src` is set and has not failed to load (and no icon content is slotted). |\n| `initials` | The fallback initials text, rendered whenever neither slotted content nor `image` is. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-avatar-size` (default: `var(--lr-size-2rem)`) — Inline and block size of the container. `size` swaps it to `var(--lr-size-1-5rem)` (`sm`) or `var(--lr-size-2-5rem)` (`lg`).\n- `--lr-avatar-bg` (default: `var(--lr-color-border)`) — Container background. Each non-neutral `tone` sets it to that tone's `-quiet` tint.\n- `--lr-avatar-color` (default: `var(--lr-color-text)`) — Initials/glyph color. Each non-neutral `tone` sets it to that tone's loud color.\n- `--lr-avatar-font-size` (default: `var(--lr-font-size-sm)`) — Font size of the initials fallback (and of any `em`-sized slotted glyph). `size` swaps it to `var(--lr-font-size-xs)` (`sm`) or `var(--lr-font-size-md)` (`lg`), so the initials track the circle instead of staying at one fixed size across every tier."
1111
1125
  },
1112
1126
  "attributes": [
1113
1127
  {
@@ -1165,7 +1179,7 @@
1165
1179
  "name": "lr-avatar-group",
1166
1180
  "description": {
1167
1181
  "kind": "markdown",
1168
- "value": "`<lr-avatar-group>` — stacks a set of slotted `<lr-avatar>` children into a single\noverlapping row (negative-margin overlap, ring border so each circle reads as distinct) and,\npast a configurable `max` count, collapses the excess into a \"+N\" overflow badge. First-party\ninvention (no Web Awesome equivalent), composed over `<lr-avatar>` rather than reimplementing\nit — plain light-DOM slotted content is the group's items, the same shape `<lr-split>`'s\npanels / `<lr-source-list>`'s cards / `<lr-chip-group>`'s chips already use, not a\n`.items` array prop.\n\n**`size`/`shape`/`tone` do not cascade onto slotted avatars.** They drive only this\ncomponent's own ring, overlap amount, and the overflow badge's rendering — they cannot resize\nor reshape the `<lr-avatar>` children themselves, since each avatar's own `--lr-avatar-size`\nlives inside *its own* shadow-scoped `:host` block and unconditionally overrides anything of\nthe same custom-property name inherited from an ancestor. This mirrors every other group\ncomponent in this library (`button-group`, `checkbox-group`, `radio`): none of them cascade a\nsize/variant prop onto their children either. The consumer is responsible for setting a\nmatching `size`/`shape` on both the group and each `<lr-avatar>` child for a visually coherent\nstack.\n\n**Deliberate divergence from `<lr-chip-group>`'s overflow pattern.** Chip-group's overflow\nindicator is a disclosure toggle that reveals the excess children in place (`aria-expanded`,\na \"Show less\" relabel). This component's overflow badge does not do that — unstacking N more\ncircles back into the row would defeat the entire point of a compact identity stack. Instead,\n`lr-overflow-click` is a pure notification hook: the component keeps rendering the same\ncollapsed stack + badge regardless of whether anyone listens, and a consumer typically wires\nthe event to open their own popover/dialog/tooltip listing the hidden members (out of scope for\nthis component — no popover dependency is introduced here). There is no `expanded` state, no\n`aria-expanded`, and the badge never changes its own text/label on click.\n\n**No roving-tabindex / arrow-key composite-widget behavior applies here, and this is\nintentional, not an oversight.** Avatars are non-interactive per `<lr-avatar>`'s own\nestablished contract (purely presentational, no built-in interactivity), so this is not a\nlistbox/toolbar/grid needing `ArrowLeft`/`ArrowRight` roving focus — the overflow badge is the\nonly interactive element, and as a native `<button>` it's automatically part of the normal Tab\nsequence with no custom keyboard handling required.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-avatar>` elements (or any content, though the avatar pairing is the intended usage). |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer inline-flex container (holds the slot and the overflow badge). |\n| `overflow-badge` | The \"+N\" button. Only rendered while `max` is actively causing an overflow. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-avatar-group-avatar-size` (default: `var(--lr-size-2rem)`) — Sizes the overflow badge to match the slotted avatars. Does not resize the avatars themselves (see class doc) — set a matching `size` on each `<lr-avatar>` child directly for that.\n- `--lr-avatar-group-overlap` (default: `var(--lr-size-neg-6px)`) — Horizontal overlap between consecutive avatars (a logical `margin-inline-start`, so it auto-mirrors under `dir=\"rtl\"`). Setting this to `0` or a positive length is a supported escape hatch that turns the stack into normal, non-overlapping spacing.\n- `--lr-avatar-group-ring-color` (default: `var(--lr-color-surface)`) — The cutout-style ring drawn around every avatar and the overflow badge.\n- `--lr-avatar-group-ring-width` (default: `var(--lr-border-width-medium)`) — Ring thickness.\n- `--lr-avatar-group-badge-bg` (default: `var(--lr-color-border)`) — Overflow badge background. Tone-driven; see `tone`.\n- `--lr-avatar-group-badge-color` (default: `var(--lr-color-text)`) — Overflow badge text color. Tone-driven; see `tone`."
1182
+ "value": "`<lr-avatar-group>` — stacks a set of slotted `<lr-avatar>` children into a single\noverlapping row (negative-margin overlap, ring border so each circle reads as distinct) and,\npast a configurable `max` count, collapses the excess into a \"+N\" overflow badge. First-party\ninvention (no Web Awesome equivalent), composed over `<lr-avatar>` rather than reimplementing\nit — plain light-DOM slotted content is the group's items, the same shape `<lr-split>`'s\npanels / `<lr-source-list>`'s cards / `<lr-chip-group>`'s chips already use, not a\n`.items` array prop.\n\n**`size`/`shape`/`tone` do not cascade onto slotted avatars.** They drive only this\ncomponent's own ring, overlap amount, and the overflow badge's rendering — they cannot resize\nor reshape the `<lr-avatar>` children themselves, since each avatar's own `--lr-avatar-size`\nlives inside *its own* shadow-scoped `:host` block and unconditionally overrides anything of\nthe same custom-property name inherited from an ancestor. This mirrors every other group\ncomponent in this library (`button-group`, `checkbox-group`, `radio`): none of them cascade a\nsize/variant prop onto their children either. The consumer is responsible for setting a\nmatching `size`/`shape` on both the group and each `<lr-avatar>` child for a visually coherent\nstack.\n\n**Deliberate divergence from `<lr-chip-group>`'s overflow pattern.** Chip-group's overflow\nindicator is a disclosure toggle that reveals the excess children in place (`aria-expanded`,\na \"Show less\" relabel). This component's overflow badge does not do that — unstacking N more\ncircles back into the row would defeat the entire point of a compact identity stack. Instead,\n`lr-overflow-click` is a pure notification hook: the component keeps rendering the same\ncollapsed stack + badge regardless of whether anyone listens, and a consumer typically wires\nthe event to open their own popover/dialog/tooltip listing the hidden members (out of scope for\nthis component — no popover dependency is introduced here). There is no `expanded` state, no\n`aria-expanded`, and the badge never changes its own text/label on click.\n\n**No roving-tabindex / arrow-key composite-widget behavior applies here, and this is\nintentional, not an oversight.** Avatars are non-interactive per `<lr-avatar>`'s own\nestablished contract (purely presentational, no built-in interactivity), so this is not a\nlistbox/toolbar/grid needing `ArrowLeft`/`ArrowRight` roving focus — the overflow badge is the\nonly interactive element, and as a native `<button>` it's automatically part of the normal Tab\nsequence with no custom keyboard handling required.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-avatar>` elements (or any content, though the avatar pairing is the intended usage). |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer inline-flex container (holds the slot and the overflow badge). |\n| `overflow-badge` | The \"+N\" button. Only rendered while `max` is actively causing an overflow. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-avatar-group-avatar-size` (default: `var(--lr-size-2rem)`) — Sizes the overflow badge to match the slotted avatars. Does not resize the avatars themselves (see class doc) — set a matching `size` on each `<lr-avatar>` child directly for that.\n- `--lr-avatar-group-overlap` (default: `var(--lr-size-neg-6px)`) — Horizontal overlap between consecutive avatars (a logical `margin-inline-start`, so it auto-mirrors under `dir=\"rtl\"`). Setting this to `0` or a positive length is a supported escape hatch that turns the stack into normal, non-overlapping spacing.\n- `--lr-avatar-group-ring-color` (default: `var(--lr-color-surface)`) — The cutout-style ring drawn around every avatar and the overflow badge.\n- `--lr-avatar-group-ring-width` (default: `var(--lr-border-width-medium)`) — Ring thickness.\n- `--lr-avatar-group-badge-bg` (default: `var(--lr-color-border)`) — Overflow badge background. Tone-driven; see `tone`.\n- `--lr-avatar-group-badge-color` (default: `var(--lr-color-text)`) — Overflow badge text color. Tone-driven; see `tone`.\n- `--lr-avatar-group-badge-font-size` (default: `var(--lr-font-size-sm)`) — Font size of the \"+N\" badge label. `size` swaps it to `var(--lr-font-size-xs)` (`sm`) or `var(--lr-font-size-md)` (`lg`), matching `<lr-avatar>`'s own `--lr-avatar-font-size` scale so the badge and the avatars it caps read at the same optical weight."
1169
1183
  },
1170
1184
  "attributes": [
1171
1185
  {
@@ -1216,7 +1230,7 @@
1216
1230
  "name": "lr-badge",
1217
1231
  "description": {
1218
1232
  "kind": "markdown",
1219
- "value": "`<lr-badge>` — a compact status label.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Badge content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The badge surface. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-badge-background` (default: `var(--lr-color-surface)`) — The badge's background. Each non-neutral `variant` sets it to that variant's `-quiet` tint.\n- `--lr-badge-border` (default: `var(--lr-color-border)`) — The badge's border color. Each non-neutral `variant` sets it to that variant's loud color.\n- `--lr-badge-color` (default: `var(--lr-color-text)`) — The badge's text color. Each non-neutral `variant` sets it to that variant's loud color."
1233
+ "value": "`<lr-badge>` — a compact status label.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Badge content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The badge surface. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-badge-background` (default: `var(--lr-color-surface)`) — The badge's background. Each non-neutral `variant` sets it to that variant's `-quiet` tint.\n- `--lr-badge-border` (default: `var(--lr-color-border)`) — The badge's border color. Each non-neutral `variant` sets it to that variant's loud color.\n- `--lr-badge-color` (default: `var(--lr-color-text)`) — The badge's text color. Each non-neutral `variant` sets it to that variant's loud color.\n- `--lr-badge-font-size` (default: `var(--lr-font-size-sm)`) — The badge's label font size. Each `size` sets it to that step's font size.\n- `--lr-badge-padding-inline` (default: `var(--lr-space-s)`) — The badge's inline padding. Each `size` sets it to that step's inline padding.\n- `--lr-badge-min-height` (default: `var(--lr-size-1-25rem)`) — The badge's minimum block size. Each `size` sets it to that step's minimum block size."
1220
1234
  },
1221
1235
  "attributes": [
1222
1236
  {
@@ -1226,6 +1240,13 @@
1226
1240
  "value": "Optional locale override. Otherwise the nearest `locale`/`lang` ancestor is used.\n\nType: `string` \nDefault: `''`"
1227
1241
  }
1228
1242
  },
1243
+ {
1244
+ "name": "size",
1245
+ "description": {
1246
+ "kind": "markdown",
1247
+ "value": "Visual density, matching `<lr-chip>`'s `2xs`–`xl` size scale. `m` preserves the original\nbadge dimensions.\n\nType: `BadgeSize` \nDefault: `'m'`"
1248
+ }
1249
+ },
1229
1250
  {
1230
1251
  "name": "variant",
1231
1252
  "description": {
@@ -1239,7 +1260,7 @@
1239
1260
  "name": "lr-bar-chart",
1240
1261
  "description": {
1241
1262
  "kind": "markdown",
1242
- "value": "`<lr-bar-chart>` — `<lr-chart>` with `type` locked to `\"bar\"`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
1263
+ "value": "`<lr-bar-chart>` — `<lr-chart>` with `type` locked to `\"bar\"`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `error` | `role=\"alert\"` message shown instead of `canvas` when the optional `chart.js` peer dependency is not installed. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
1243
1264
  },
1244
1265
  "attributes": [
1245
1266
  {
@@ -1485,7 +1506,7 @@
1485
1506
  "name": "lr-breadcrumb-item",
1486
1507
  "description": {
1487
1508
  "kind": "markdown",
1488
- "value": "`<lr-breadcrumb-item>` — one link or current-page label in a breadcrumb.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Item label. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The link or current-page label. |"
1509
+ "value": "`<lr-breadcrumb-item>` — one link or current-page label in a breadcrumb.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Item label. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The link or current-page label. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-breadcrumb-current-color` (default: `var(--lr-color-text-quiet)`) — Text color of the current-page item (`current`/`aria-current=\"page\"`). Declared as an inline `var()` fallback (never on `:host`), so setting it on the element or an ancestor recolors only the current item without hijacking the library-wide `--lr-color-text-quiet` token."
1489
1510
  },
1490
1511
  "attributes": [
1491
1512
  {
@@ -1588,7 +1609,7 @@
1588
1609
  "name": "lr-bubble-chart",
1589
1610
  "description": {
1590
1611
  "kind": "markdown",
1591
- "value": "`<lr-bubble-chart>` — `<lr-chart>` with `type` locked to `\"bubble\"`. Feed\npoints via `Series.points`, each needing an `x`/`y`/`r` (radius) triple —\ncast the array through `as unknown as Series['points']` (or a local\n`BubblePoint` type) when constructing it, since `Series.points` itself is\ntyped as `{ x; y; label? }[]` with no `r` field.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
1612
+ "value": "`<lr-bubble-chart>` — `<lr-chart>` with `type` locked to `\"bubble\"`. Feed\npoints via `Series.points`, each needing an `x`/`y`/`r` (radius) triple —\ncast the array through `as unknown as Series['points']` (or a local\n`BubblePoint` type) when constructing it, since `Series.points` itself is\ntyped as `{ x; y; label? }[]` with no `r` field.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `error` | `role=\"alert\"` message shown instead of `canvas` when the optional `chart.js` peer dependency is not installed. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
1592
1613
  },
1593
1614
  "attributes": [
1594
1615
  {
@@ -1709,7 +1730,7 @@
1709
1730
  "name": "lr-button",
1710
1731
  "description": {
1711
1732
  "kind": "markdown",
1712
- "value": "`<lr-button>` — a generic action-button primitive. Renders an internal native\n`<button part=\"base\">`. `type=\"submit\"`/`type=\"reset\"`\nare handled by this component itself via the host's own `closest('form')` — a shadow-internal\nnative `<button type=\"submit\">` does not participate in an ancestor light-DOM form's submission\non its own, since form-submitter semantics don't cross the shadow boundary.\n\nA host `aria-label` is forwarded to the internal button as a literal string (for an icon-only\nbutton with no visible label); external `aria-labelledby`/`aria-describedby` idrefs are not\ncopied across the shadow boundary.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Default slot: the button's label content. |\n| `end` | Trailing icon/content, rendered after the label. |\n| `start` | Leading icon/content, rendered before the label. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The internal native `<button>`. |\n| `end` | The `end` slot wrapper. |\n| `label` | The default-slot label wrapper. |\n| `spinner` | The loading spinner, present only while `loading` is `true`. |\n| `start` | The `start` slot wrapper. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-button-width` (default: `100%`) — Inline size of the internal button. The host defaults it to `100%` so the native button follows the host's own width; override to `auto` (or any other value) for a compact inline composition.\n- `--lr-button-hover-brightness` (default: `1.08`) — `filter: brightness()` multiplier applied while hovering a non-disabled button.\n- `--lr-button-active-scale` (default: `0.9875`) — `transform: scale()` factor applied while a non-disabled button is pressed.\n- `--lr-button-spinner-duration` (default: `1s`) — Rotation period of the `loading` spinner.\n- `--lr-button-accent` (default: `var(--lr-color-text)`) — Text/glyph color for the chrome-less appearances (`outlined`, `plain`, `link`). Swapped per `variant` to that variant's semantic color.\n- `--lr-button-fill` (default: `var(--lr-color-surface)`) — Background of `appearance=\"filled\"`. Swapped per `variant` to that variant's semantic color.\n- `--lr-button-on-fill` (default: `var(--lr-color-text)`) — Text color on top of `--lr-button-fill`. Swapped per `variant` to that variant's `on-*` color.\n- `--lr-button-accent-fill` (default: `var(--lr-color-neutral)`) — Background of `appearance=\"accent\"` (and its border color). Swapped per `variant` to that variant's semantic color.\n- `--lr-button-accent-on-fill` (default: `var(--lr-color-on-neutral)`) — Text color on top of `--lr-button-accent-fill`. Swapped per `variant` to that variant's `on-*` color.\n- `--lr-button-border` (default: `var(--lr-color-border)`) — Border color of the internal button. Swapped per `variant` to that variant's semantic color.\n- `--lr-button-outlined-border` (default: `var(--lr-color-border-strong)`) — Border color of `appearance=\"outlined\"`, which overrides `--lr-button-border`.\n- `--lr-button-quiet-border` (default: `var(--lr-color-border)`) — Border color of `appearance=\"quiet\"`.\n- `--lr-button-quiet-text` (default: `var(--lr-color-text-quiet)`) — Text color of `appearance=\"quiet\"`.\n- `--lr-button-size-2xs` (default: `var(--lr-size-1-25rem)`) — `min-block-size` at `size=\"2xs\"`.\n- `--lr-button-size-xs` (default: `var(--lr-size-1-5rem)`) — `min-block-size` at `size=\"xs\"`.\n- `--lr-button-size-s` (default: `var(--lr-size-1-75rem)`) — `min-block-size` at `size=\"s\"`.\n- `--lr-button-size-m` (default: `var(--lr-size-2rem)`) — `min-block-size` at `size=\"m\"`.\n- `--lr-button-size-l` (default: `var(--lr-size-2-5rem)`) — `min-block-size` at `size=\"l\"`.\n- `--lr-button-size-xl` (default: `var(--lr-size-3rem)`) — `min-block-size` at `size=\"xl\"`."
1733
+ "value": "`<lr-button>` — a generic action-button primitive. Renders an internal native\n`<button part=\"base\">`. `type=\"submit\"`/`type=\"reset\"`\nare handled by this component itself via the host's own `closest('form')` — a shadow-internal\nnative `<button type=\"submit\">` does not participate in an ancestor light-DOM form's submission\non its own, since form-submitter semantics don't cross the shadow boundary.\n\nA host `aria-label` is forwarded to the internal button as a literal string (for an icon-only\nbutton with no visible label); external `aria-labelledby`/`aria-describedby` idrefs are not\ncopied across the shadow boundary.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Default slot: the button's label content. |\n| `end` | Trailing icon/content, rendered after the label. |\n| `start` | Leading icon/content, rendered before the label. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The internal native `<button>`. |\n| `end` | The `end` slot wrapper. |\n| `label` | The default-slot label wrapper. |\n| `spinner` | The loading spinner, present only while `loading` is `true`. |\n| `start` | The `start` slot wrapper. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-button-width` (default: `100%`) — Inline size of the internal button. The host defaults it to `100%` so the native button follows the host's own width; override to `auto` (or any other value) for a compact inline composition.\n- `--lr-button-hover-brightness` (default: `1.08`) — `filter: brightness()` multiplier applied while hovering a non-disabled button.\n- `--lr-button-active-scale` (default: `0.9875`) — `transform: scale()` factor applied while a non-disabled button is pressed.\n- `--lr-button-spinner-duration` (default: `1s`) — Rotation period of the `loading` spinner.\n- `--lr-button-accent` (default: `var(--lr-color-text)`) — Text/glyph color for the chrome-less appearances (`outlined`, `plain`, `link`). Swapped per `variant` to that variant's semantic color.\n- `--lr-button-fill` (default: `var(--lr-color-surface)`) — Background of `appearance=\"filled\"`. Swapped per `variant` to that variant's semantic color.\n- `--lr-button-on-fill` (default: `var(--lr-color-text)`) — Text color on top of `--lr-button-fill`. Swapped per `variant` to that variant's `on-*` color.\n- `--lr-button-accent-fill` (default: `var(--lr-color-neutral)`) — Background of `appearance=\"accent\"` (and its border color). Swapped per `variant` to that variant's semantic color.\n- `--lr-button-accent-on-fill` (default: `var(--lr-color-on-neutral)`) — Text color on top of `--lr-button-accent-fill`. Swapped per `variant` to that variant's `on-*` color.\n- `--lr-button-border` (default: `var(--lr-color-border)`) — Border color of the internal button. Swapped per `variant` to that variant's semantic color.\n- `--lr-button-outlined-border` (default: `var(--lr-color-border-strong)`) — Border color of `appearance=\"outlined\"`, which overrides `--lr-button-border`.\n- `--lr-button-outlined-fill` (default: `transparent`) — Background of `appearance=\"outlined\"`. Transparent by default; set it to tint the button (e.g. a faint surface wash behind the outline) without a `::part(base)` rule. Like `--lr-button-quiet-*`, it is deliberately *not* swapped per `variant`. Note that the `:hover` `filter: brightness()` applies to whatever fill is set, so a tinted outlined button now visibly brightens on hover where a transparent one did not.\n- `--lr-button-quiet-border` (default: `var(--lr-color-border)`) — Border color of `appearance=\"quiet\"`.\n- `--lr-button-quiet-text` (default: `var(--lr-color-text-quiet)`) — Text color of `appearance=\"quiet\"`.\n- `--lr-button-size-2xs` (default: `var(--lr-size-1-25rem)`) — `min-block-size` at `size=\"2xs\"`.\n- `--lr-button-size-xs` (default: `var(--lr-size-1-5rem)`) — `min-block-size` at `size=\"xs\"`.\n- `--lr-button-size-s` (default: `var(--lr-size-1-875rem)`) — `min-block-size` at `size=\"s\"`. Matches `lr-input`/`lr-select`/`lr-combobox`'s own `size=\"s\"` control height.\n- `--lr-button-size-m` (default: `var(--lr-size-2-5rem)`) — `min-block-size` at `size=\"m\"`. Matches `lr-input`/`lr-select`/`lr-combobox`'s own default control height, so a default-size button sitting next to a default-size input/select/combobox in the same row lines up.\n- `--lr-button-size-l` (default: `var(--lr-size-3rem)`) — `min-block-size` at `size=\"l\"`. Matches `lr-input`/`lr-select`/`lr-combobox`'s own `size=\"l\"` control height.\n- `--lr-button-size-xl` (default: `var(--lr-size-3-5rem)`) — `min-block-size` at `size=\"xl\"`. Matches `lr-input`/`lr-select`/`lr-combobox`'s own `size=\"xl\"` control height.\n- `--lr-button-padding-block` (default: `var(--lr-space-xs)`) — Block padding of the internal button, re-assigned per `size` tier (the default is the `m` tier's value). Override it to retune a tier without a `::part(base)` rule; `appearance=\"link\"` ignores it (it renders with zero padding).\n- `--lr-button-padding-inline` (default: `var(--lr-space-m)`) — Inline padding of the internal button, re-assigned per `size` tier (the default is the `m` tier's value). `appearance=\"link\"` ignores it.\n- `--lr-button-font-size` (default: `var(--lr-font-size-m)`) — Font size of the internal button, re-assigned per `size` tier (the default is the `m` tier's value). `appearance=\"link\"` ignores it and inherits the ambient font instead.\n- `--lr-button-min-height` (default: `var(--lr-button-size-m)`) — The active tier's `min-block-size` floor. Re-assigned per `size` tier to that tier's own `--lr-button-size-*` token, and used as the fallback when `--lr-button-height` is unset.\n- `--lr-button-height` — Exact height of the internal button. **Undeclared by default** — so the button keeps the active tier's `min-block-size` floor and an `auto` height, exactly as before. Set it (e.g. to pin the button to a fixed toolbar row) to both floor *and* cap the height. Never declare it as `auto`: a declared value wins over the `var()` fallback arm and would make every tier's floor dead code. `appearance=\"link\"` ignores it."
1713
1734
  },
1714
1735
  "attributes": [
1715
1736
  {
@@ -1797,7 +1818,7 @@
1797
1818
  "name": "lr-calendar",
1798
1819
  "description": {
1799
1820
  "kind": "markdown",
1800
- "value": "`<lr-calendar>` — responsive month calendar with event markers and agenda mode.\n\nMonth-view event markers are a mouse-only quick-select affordance layered on\ntop of the focusable day cell: the day grid's own roving-tabindex/arrow-key\nnavigation already targets the day `<button>`, and nesting a second\nfocusable control inside that same native `<button>` is not valid (a\n`<button>` element must not contain interactive/tabindex descendants, and\n`role=\"button\"` itself forbids focusable descendants regardless). Agenda\nview renders each event as its own real `<button part=\"agenda-event\">` and\nis the fully keyboard-accessible way to reach `lr-event-select`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `agenda` | Agenda list. |\n| `agenda-event` | One focusable event button in agenda view (`view=\"agenda\"` only). |\n| `date` | The day-of-month number inside a day cell. |\n| `day` | Day cell. |\n| `event` | Event marker. |\n| `grid` | Month grid. |\n| `header` | Calendar header. |\n| `nav` | A previous/next navigation control in the header (the previous button, and the wrapper around the next button). |\n| `nav-glyph` | The previous/next chevron glyph, mirrored under RTL. |\n| `title` | The header's month/year title. |\n| `week` | One week row within the month grid. |\n| `weekday` | One weekday header cell. |\n| `weekdays` | Weekday header row. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-calendar-day-min-block-size` (default: `var(--lr-size-6rem)`) — Minimum block size of a day cell.\n- `--lr-calendar-day-min-block-size-narrow` (default: `4rem`) — Minimum block size of a day cell once the host is narrower than 28rem."
1821
+ "value": "`<lr-calendar>` — responsive month calendar with event markers and agenda mode.\n\nMonth-view event markers are a mouse-only quick-select affordance layered on\ntop of the focusable day cell: the day grid's own roving-tabindex/arrow-key\nnavigation already targets the day `<button>`, and nesting a second\nfocusable control inside that same native `<button>` is not valid (a\n`<button>` element must not contain interactive/tabindex descendants, and\n`role=\"button\"` itself forbids focusable descendants regardless). Agenda\nview renders each event as its own real `<button part=\"agenda-event\">` and\nis the fully keyboard-accessible way to reach `lr-event-select`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `agenda` | Agenda list. |\n| `agenda-event` | One focusable event button in agenda view (`view=\"agenda\"` only). |\n| `date` | The day-of-month number inside a day cell. |\n| `day` | Day cell. |\n| `event` | Event marker. |\n| `grid` | Month grid. |\n| `header` | Calendar header. |\n| `nav` | A previous/next navigation control in the header (the previous button, and the wrapper around the next button). |\n| `nav-glyph` | The previous/next chevron glyph, mirrored under RTL. |\n| `title` | The header's month/year title. |\n| `week` | One week row within the month grid. |\n| `weekday` | One weekday header cell. |\n| `weekdays` | Weekday header row. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-calendar-day-min-block-size` (default: `var(--lr-size-6rem)`) — Minimum block size of a day cell.\n- `--lr-calendar-day-min-block-size-narrow` (default: `var(--lr-size-4rem)`) — Minimum block size of a day cell once the host is narrower than 28rem.\n- `--lr-calendar-day-selected-bg` (default: `var(--lr-color-brand-quiet)`) — Background of a selected day cell, decoupled from the shared token also driving the nav-button/agenda-event hover background."
1801
1822
  },
1802
1823
  "attributes": [
1803
1824
  {
@@ -1889,7 +1910,7 @@
1889
1910
  "name": "lr-callout",
1890
1911
  "description": {
1891
1912
  "kind": "markdown",
1892
- "value": "`<lr-callout>` — an inline message surface for status, warning, and error content.\nSet `inline` for lightweight reactive status/error text: it removes the panel chrome while\npreserving the semantic role, optional leading icon, and close action.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Message content. |\n| `heading` | Optional heading. |\n| `icon` | Optional icon. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The callout surface. |\n| `close-button` | The close button's interactive hit target, sized to the shared minimum tappable size (`--lr-icon-button-size`) in both the default panel and the compact `inline` variant. |\n| `close-icon` | The close button's visible \"×\" glyph, independent of `close-button`'s hit target size -- shrinks in the `inline` variant while the hit target stays full-size. |\n| `content` | The message content. |\n| `heading` | The heading wrapper. |\n| `icon` | The icon wrapper. |\n| `message` | The message content wrapper. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-callout-background` (default: `var(--lr-color-surface)`) — The callout surface's background. Each non-neutral `variant` sets it to that variant's `-quiet` tint.\n- `--lr-callout-border` (default: `var(--lr-color-border)`) — The callout surface's border color. Each non-neutral `variant` sets it to that variant's loud color.\n- `--lr-callout-color` (default: `var(--lr-color-text)`) — The callout's text color. Each non-neutral `variant` sets it to that variant's loud color."
1913
+ "value": "`<lr-callout>` — an inline message surface for status, warning, and error content.\nSet `inline` for lightweight reactive status/error text: it removes the panel chrome while\npreserving the semantic role, optional leading icon, and close action.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Message content. |\n| `heading` | Optional heading. |\n| `icon` | Optional icon. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The callout surface. |\n| `close-button` | The close button's interactive hit target, sized to the shared minimum tappable size (`--lr-icon-button-size`) in both the default panel and the compact `inline` variant. |\n| `close-icon` | The close button's visible \"×\" glyph, independent of `close-button`'s hit target size -- shrinks in the `inline` variant while the hit target stays full-size. |\n| `content` | The message content. |\n| `heading` | The heading wrapper. |\n| `icon` | The icon wrapper. |\n| `message` | The message content wrapper. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-callout-background` (default: `var(--lr-color-surface)`) — The callout surface's background. Each non-neutral `variant` sets it to that variant's `-quiet` tint.\n- `--lr-callout-border` (default: `var(--lr-color-border)`) — The callout surface's border color. Each non-neutral `variant` sets it to that variant's loud color.\n- `--lr-callout-color` (default: `var(--lr-color-text)`) — The callout's text color. Each non-neutral `variant` sets it to that variant's loud color.\n- `--lr-callout-close-hover-bg` (default: `var(--lr-color-brand-quiet)`) — The close button's hover background, decoupled from `--lr-callout-background` so a consumer can retint one without affecting the other (e.g. keeping the hover fill visibly distinct from a `variant=\"brand\"` panel, which shares the same default token)."
1893
1914
  },
1894
1915
  "attributes": [
1895
1916
  {
@@ -1931,7 +1952,7 @@
1931
1952
  "name": "open",
1932
1953
  "description": {
1933
1954
  "kind": "markdown",
1934
- "value": "Type: `boolean` \nDefault: `true`"
1955
+ "value": "Whether the callout is shown. Defaults `true`; uses `trueDefaultBooleanConverter` (above) so\nplain HTML `open=\"false\"` actually renders it closed -- Lit's default presence-based\n`type: Boolean` converter cannot distinguish an absent attribute from the literal string\n`\"false\"`.\n\nType: `boolean` \nDefault: `true`"
1935
1956
  }
1936
1957
  },
1937
1958
  {
@@ -1968,7 +1989,7 @@
1968
1989
  "name": "interactive",
1969
1990
  "description": {
1970
1991
  "kind": "markdown",
1971
- "value": "Opt-in hover/focus-visible treatment (border-color shift, cursor: pointer) for a card used\nas a clickable tile -- purely visual; this component takes no position on what \"activate\"\nmeans unless `href` is also set. `false` (the default) reproduces today's exact static\noutput.\n\nType: `boolean` \nDefault: `false`"
1992
+ "value": "Opt-in clickable-tile behavior: the hover/focus-visible treatment (border-color shift,\n`cursor: pointer`) plus, when `href` is **not** also set, real activation semantics --\n`[part='base']` becomes focusable (`tabindex=\"0\"`), responds to Enter/Space, and emits\n`lr-card-activate`. With `href` set the root is already a real `<a>`, so native navigation\nstays the activation and `lr-card-activate` is never fired. `false` (the default) reproduces\ntoday's exact static output: no `tabindex`, no listeners, no events.\n\nType: `boolean` \nDefault: `false`"
1972
1993
  }
1973
1994
  },
1974
1995
  {
@@ -1984,7 +2005,7 @@
1984
2005
  "name": "lr-carousel",
1985
2006
  "description": {
1986
2007
  "kind": "markdown",
1987
- "value": "`<lr-carousel>` — an accessible single-slide carousel for arbitrary\nslotted content. The index is reflected and self-managed by navigation;\nevery change emits `lr-slide-change` so applications can persist or\ncoordinate the active slide.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Slide elements. Each assigned element becomes one slide. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The carousel landmark. |\n| `controls` | Previous/next control row. |\n| `indicator` | An individual slide indicator's interactive hit target, sized to the shared minimum tappable size (`--lr-icon-button-size`), independent of the smaller visible dot rendered inside it (mirrors `<lr-swatch-picker>`'s `[part=\"swatch\"]`/`[part=\"swatch-fill\"]` split). |\n| `indicator-dot` | The individual indicator's compact visible dot. |\n| `indicators` | Indicator button group. |\n| `next-button` | Next slide button. |\n| `next-glyph` | The chevron glyph inside `next-button`, mirrored under RTL. |\n| `previous-button` | Previous slide button. |\n| `previous-glyph` | The chevron glyph inside `previous-button`, mirrored under RTL. |\n| `track` | The slotted slide wrapper. |\n| `viewport` | The keyboard-focusable slide viewport. |"
2008
+ "value": "`<lr-carousel>` — an accessible single-slide carousel for arbitrary\nslotted content. The index is reflected and self-managed by navigation;\nevery change emits `lr-slide-change` so applications can persist or\ncoordinate the active slide.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Slide elements. Each assigned element becomes one slide. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The carousel landmark. |\n| `controls` | Previous/next control row. |\n| `indicator` | An individual slide indicator's interactive hit target, sized to the shared minimum tappable size (`--lr-icon-button-size`), independent of the smaller visible dot rendered inside it (mirrors `<lr-swatch-picker>`'s `[part=\"swatch\"]`/`[part=\"swatch-fill\"]` split). |\n| `indicator-dot` | The individual indicator's compact visible dot. |\n| `indicators` | Indicator button group. |\n| `next-button` | Next slide button. |\n| `next-glyph` | The chevron glyph inside `next-button`, mirrored under RTL. |\n| `previous-button` | Previous slide button. |\n| `previous-glyph` | The chevron glyph inside `previous-button`, mirrored under RTL. |\n| `track` | The slotted slide wrapper. |\n| `viewport` | The keyboard-focusable slide viewport. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-carousel-indicator-current-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the current slide's indicator dot (`[aria-current=\"true\"]`). Declared as an inline `var()` fallback (never on `:host`), so setting it on the element or an ancestor recolors only the current indicator without hijacking the library-wide `--lr-color-brand-quiet` token.\n- `--lr-carousel-indicator-current-border-color` (default: `var(--lr-color-brand)`) — Border color of the current slide's indicator dot."
1988
2009
  },
1989
2010
  "attributes": [
1990
2011
  {
@@ -2065,7 +2086,7 @@
2065
2086
  "name": "lr-chart",
2066
2087
  "description": {
2067
2088
  "kind": "markdown",
2068
- "value": "`<lr-chart>` — the core Chart.js wrapper every other `lr-*-chart` tag\nsubclasses. Requires the optional peer deps `chart.js` + `chartjs-plugin-zoom`.\n\n**API mirror note:** the real `wa-chart` docs page\n(https://webawesome.com/docs/components/chart/) documents a `config:\nChartJS['config']` property alongside its simplified attributes — \"a\nflexible wrapper around Chart.js\" supporting *both* simplified attributes\nand full Chart.js configuration passthrough, not a `data`/`options` prop\npair. `lr-chart` mirrors that dual surface: the `Series`-based\n`datasets`/`labels`/`type`/`legend`/`xLabel`/`yLabel`/`zoom` attributes\nbelow are the simplified surface (compatible with WA's `type`, `xLabel`,\n`yLabel`, `withoutLegend`-equivalent `legend`, etc.), and the additional\n`config` property is the raw-passthrough escape hatch — a\n`Partial<ChartConfiguration>` deep-merged over the generated config in\n`buildConfig()`, mirroring WA's `config` property without discarding the\n`Series` shape the rest of this component family (subclasses, box-plot,\nhistogram) is built on.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
2089
+ "value": "`<lr-chart>` — the core Chart.js wrapper every other `lr-*-chart` tag\nsubclasses. Requires the optional peer deps `chart.js` + `chartjs-plugin-zoom`.\n\n**API mirror note:** the real `wa-chart` docs page\n(https://webawesome.com/docs/components/chart/) documents a `config:\nChartJS['config']` property alongside its simplified attributes — \"a\nflexible wrapper around Chart.js\" supporting *both* simplified attributes\nand full Chart.js configuration passthrough, not a `data`/`options` prop\npair. `lr-chart` mirrors that dual surface: the `Series`-based\n`datasets`/`labels`/`type`/`legend`/`xLabel`/`yLabel`/`zoom` attributes\nbelow are the simplified surface (compatible with WA's `type`, `xLabel`,\n`yLabel`, `withoutLegend`-equivalent `legend`, etc.), and the additional\n`config` property is the raw-passthrough escape hatch — a\n`Partial<ChartConfiguration>` deep-merged over the generated config in\n`buildConfig()`, mirroring WA's `config` property without discarding the\n`Series` shape the rest of this component family (subclasses, box-plot,\nhistogram) is built on.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `error` | `role=\"alert\"` message shown instead of `canvas` when the optional `chart.js` peer dependency is not installed. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
2069
2090
  },
2070
2091
  "attributes": [
2071
2092
  {
@@ -2186,9 +2207,16 @@
2186
2207
  "name": "lr-chat-composer",
2187
2208
  "description": {
2188
2209
  "kind": "markdown",
2189
- "value": "`<lr-chat-composer>` — the message input for a chat/agent conversation\nsurface: an auto-resizing textarea plus a send/stop button. Form-\nassociated via the `FormAssociated` mixin (see `<lr-date-input>` for the\nsame shape), so it participates in native `<form>` submission/validation/\nreset like any other text control — `name`/`value`/`disabled`/`required`/\n`checkValidity()`/`reportValidity()` all come from that mixin.\n\nAuto-resize reads the textarea's own *computed* line-height/padding/\nborder at runtime (`resizeTextarea()`) rather than assuming a fixed\npx-per-row constant, so it stays correct under a consumer's own font-size/\nline-height overrides. It grows between `min-rows` and `max-rows`, then\nswitches to internal scrolling. A `ResizeObserver` on the textarea itself\nre-runs the same fit whenever its *width* changes (a responsive\nbreakpoint, a sidebar toggling, a window resize, an orientation change)\neven though `value`/`min-rows`/`max-rows` never did -- a narrower box\nwraps the same text across more lines, so the previously-fitted height\nwould otherwise go stale and clip content with no scrollbar to reveal it.\n\nEnter-to-send (only active while `submit-on-enter` is true, the default):\nplain Enter submits and is prevented from inserting a newline; Shift+Enter\nalways inserts a newline no matter what; an IME composition step (checked\nvia `isComposing`, with `keyCode === 229` as a defense-in-depth fallback\nfor browsers that report `isComposing` inconsistently on the\ncompositionend-adjacent keydown) is never treated as a submit trigger;\nand while `status` isn't `\"idle\"` Enter is left alone to insert a newline\ntoo, rather than trying to submit again -- there is nothing meaningful to\nsubmit while a previous message is still sending/streaming, and the\ntextarea deliberately stays interactive (see `disabled` below) so a user\ncan keep composing their next message in the meantime.\n\nDeliberately no label/hint/error chrome -- a composite chat-input control, not a labeled form\nfield; wrap it in your own layout for that context. A host `aria-label` is forwarded to the\ninternal textarea and takes precedence over the placeholder-derived name.\n\n`lr-submit`'s `detail.value` is always the exact, untrimmed current\nvalue (`detail.value === value` at the moment it fires) -- trimming is\nleft to the consumer so it never silently diverges from what `value`\nitself reports. Submitting does not clear `value`; the consumer clears it\nonce the submission has actually been accepted (so e.g. a failed send can\nleave the text in place for retry).\n`submitDisabled` lets the consumer apply its own validation policy without\ndisabling the textarea or the busy-state Stop action.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `chips` | An attachment tray rendered above the input row (e.g. files queued for this message). |\n| `leading` | Content rendered before the textarea (e.g. an attach-file trigger button). |\n| `trailing` | Overrides the built-in send/stop button entirely when it has assigned content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `action-button` | The built-in send/stop button. Absent from the accessibility tree's meaningful content whenever `trailing` has assigned content. Style its busy treatment via `:host([status='sending'])`/`:host([status='streaming'])`. |\n| `base` | The bordered root container. |\n| `chips` | The wrapper around the `chips` slot. Hidden entirely when the slot is empty. |\n| `leading` | The wrapper around the `leading` slot. Hidden entirely when the slot is empty. |\n| `row` | The row holding the leading slot, textarea, and trailing slot/button. |\n| `textarea` | The auto-resizing `<textarea>` itself. |\n| `trailing` | The wrapper around the `trailing` slot and the built-in `action-button`. |"
2210
+ "value": "`<lr-chat-composer>` — the message input for a chat/agent conversation\nsurface: an auto-resizing textarea plus a send/stop button. Form-\nassociated via the `FormAssociated` mixin (see `<lr-date-input>` for the\nsame shape), so it participates in native `<form>` submission/validation/\nreset like any other text control — `name`/`value`/`disabled`/`required`/\n`checkValidity()`/`reportValidity()` all come from that mixin.\n\nAuto-resize reads the textarea's own *computed* line-height/padding/\nborder at runtime (`resizeTextarea()`) rather than assuming a fixed\npx-per-row constant, so it stays correct under a consumer's own font-size/\nline-height overrides. It grows between `min-rows` and `max-rows`, then\nswitches to internal scrolling. A `ResizeObserver` on the textarea itself\nre-runs the same fit whenever its *width* changes (a responsive\nbreakpoint, a sidebar toggling, a window resize, an orientation change)\neven though `value`/`min-rows`/`max-rows` never did -- a narrower box\nwraps the same text across more lines, so the previously-fitted height\nwould otherwise go stale and clip content with no scrollbar to reveal it.\n\nEnter-to-send (only active while `submit-on-enter` is true, the default):\nplain Enter submits and is prevented from inserting a newline; Shift+Enter\nalways inserts a newline no matter what; an IME composition step (checked\nvia `isComposing`, with `keyCode === 229` as a defense-in-depth fallback\nfor browsers that report `isComposing` inconsistently on the\ncompositionend-adjacent keydown) is never treated as a submit trigger;\nand while `status` isn't `\"idle\"` Enter is left alone to insert a newline\ntoo, rather than trying to submit again -- there is nothing meaningful to\nsubmit while a previous message is still sending/streaming, and the\ntextarea deliberately stays interactive (see `disabled` below) so a user\ncan keep composing their next message in the meantime.\n\nDeliberately no label/hint/error chrome -- a composite chat-input control, not a labeled form\nfield; wrap it in your own layout for that context. A host `aria-label` is forwarded to the\ninternal textarea and takes precedence over the placeholder-derived name.\n\n`lr-submit`'s `detail.value` is always the exact, untrimmed current\nvalue (`detail.value === value` at the moment it fires) -- trimming is\nleft to the consumer so it never silently diverges from what `value`\nitself reports. Submitting does not clear `value`; the consumer clears it\nonce the submission has actually been accepted (so e.g. a failed send can\nleave the text in place for retry).\n`submitDisabled` lets the consumer apply its own validation policy without\ndisabling the textarea or the busy-state Stop action.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `chips` | An attachment tray rendered above the input row (e.g. files queued for this message). |\n| `leading` | Content rendered before the textarea (e.g. an attach-file trigger button). |\n| `trailing` | Overrides the built-in send/stop button entirely when it has assigned content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `action-button` | The built-in send/stop button. Absent from the accessibility tree's meaningful content whenever `trailing` has assigned content. Style its busy treatment via `:host([status='sending'])`/`:host([status='streaming'])`, or the dedicated `--lr-chat-composer-busy-bg` cssprop below. |\n| `base` | The bordered root container. Drops its card chrome (border, background, padding, radius) under `appearance=\"plain\"`, where the focus affordance becomes an underline on this same part instead of the border-color shift. |\n| `chips` | The wrapper around the `chips` slot. Hidden entirely when the slot is empty. |\n| `leading` | The wrapper around the `leading` slot. Hidden entirely when the slot is empty. |\n| `row` | The row holding the leading slot, textarea, and trailing slot/button. |\n| `textarea` | The auto-resizing `<textarea>` itself. |\n| `trailing` | The wrapper around the `trailing` slot and the built-in `action-button`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chat-composer-busy-bg` (default: `var(--lr-color-text-quiet)`) — `action-button` background while `status` is `\"sending\"` or `\"streaming\"`. Scoped separately from the shared `--lr-color-text-quiet` token, which the `textarea` part's placeholder also reads -- overriding this recolors only the busy button, not the placeholder text too."
2190
2211
  },
2191
2212
  "attributes": [
2213
+ {
2214
+ "name": "appearance",
2215
+ "description": {
2216
+ "kind": "markdown",
2217
+ "value": "Visual chrome, mirroring `lr-card`'s `appearance` vocabulary. `'card'` (the default) keeps the\nbordered, filled, padded box. `'plain'` removes the border, background, padding and corner\nradius, so a composer docked inside a chat panel, dialog footer or toolbar that already draws\nits own border doesn't double the frame. Focus stays visible either way: `plain` swaps the\nborder-color shift for an underline across the input row, since there is no border left to\nrecolor.\n\nType: `ChatComposerAppearance` \nDefault: `'card'`"
2218
+ }
2219
+ },
2192
2220
  {
2193
2221
  "name": "aria-label",
2194
2222
  "description": {
@@ -2263,7 +2291,7 @@
2263
2291
  "name": "spellcheck",
2264
2292
  "description": {
2265
2293
  "kind": "markdown",
2266
- "value": "Forwarded to the internal `<textarea>`'s own `spellcheck`. Defaults to `true`, matching the\nnative element's own default. Uses spellcheckConverter rather than Lit's default\npresence-based `type: Boolean` handling, so a plain-HTML consumer with no way to write a\n`.spellcheck` property binding can still turn this off with `spellcheck=\"false\"`; a Lit\ntemplate can do the same with either that attribute string or a `.spellcheck=${false}`\nproperty binding.\n\nType: `boolean` \nDefault: `true`"
2294
+ "value": "Forwarded to the internal `<textarea>`'s own `spellcheck`. Defaults to `true`, matching the\nnative element's own default. Uses trueDefaultBooleanConverter rather than Lit's\ndefault presence-based `type: Boolean` handling, so a plain-HTML consumer with no way to write\na `.spellcheck` property binding can still turn this off with `spellcheck=\"false\"`; a Lit\ntemplate can do the same with either that attribute string or a `.spellcheck=${false}`\nproperty binding.\n\nType: `boolean` \nDefault: `true`"
2267
2295
  }
2268
2296
  },
2269
2297
  {
@@ -2277,7 +2305,7 @@
2277
2305
  "name": "stoppable",
2278
2306
  "description": {
2279
2307
  "kind": "markdown",
2280
- "value": "When `false`, the built-in button never renders as a Stop/cancel control\nwhile busy -- instead it stays a (disabled) Send button, since there is\nno cancellation operation to offer. Defaults to `true`, reproducing\ntoday's Stop-button behavior for every `status` other than `'idle'`.\n\nType: `boolean` \nDefault: `true`"
2308
+ "value": "When `false`, the built-in button never renders as a Stop/cancel control\nwhile busy -- instead it stays a (disabled) Send button, since there is\nno cancellation operation to offer. Defaults to `true`, reproducing\ntoday's Stop-button behavior for every `status` other than `'idle'`. Uses\ntrueDefaultBooleanConverter so a plain-HTML consumer can turn this off with the\nattribute string `stoppable=\"false\"`, not just a `.stoppable=${false}` property binding.\n\nType: `boolean` \nDefault: `true`"
2281
2309
  }
2282
2310
  },
2283
2311
  {
@@ -2291,7 +2319,7 @@
2291
2319
  "name": "submit-on-enter",
2292
2320
  "description": {
2293
2321
  "kind": "markdown",
2294
- "value": "Type: `boolean` \nDefault: `true`"
2322
+ "value": "Enter-to-send toggle -- see the class doc's \"Enter-to-send\" paragraph. Uses\ntrueDefaultBooleanConverter rather than Lit's default presence-based `type: Boolean`\nhandling, so a plain-HTML consumer can turn this off with the attribute string\n`submit-on-enter=\"false\"`, not just a `.submitOnEnter=${false}` property binding.\n\nType: `boolean` \nDefault: `true`"
2295
2323
  }
2296
2324
  },
2297
2325
  {
@@ -2307,7 +2335,7 @@
2307
2335
  "name": "lr-chat-message",
2308
2336
  "description": {
2309
2337
  "kind": "markdown",
2310
- "value": "`<lr-chat-message>` — a role-based message bubble *shell* for a chat/\nagent conversation surface. It renders none of the message content itself:\nthe default slot carries whatever a consumer wants to display (plain\ntext, a `<lr-markdown>`, a custom template, anything at all) and this\ncomponent only supplies the surrounding chrome — alignment/coloring by\n`role`, an avatar/badges header row, an optional collapse toggle, an\nattachments strip, and a status-aware footer (a live-updating status dot +\ntext, the formatted `timestamp`, a built-in retry affordance for\n`status=\"failed\"`, and an `actions` slot for everything else).\n\nNo built-in copy button is rendered. Deciding what \"the copyable text\" of\nan arbitrary slotted message even means (plain text? the rendered\nmarkdown source? something else?) is exactly the kind of content\ninterpretation this shell deliberately stays out of — slot a copy control\ninto `actions` instead. Firing `lr-copy` (`detail: { text }`) from that\ncontrol keeps the event name consistent with `<lr-json-viewer>`'s own\ncopy affordance, for anything listening at the conversation-surface level.\n\nAccessibility of `status`: the current status is always available as\nplain visible text (`[part=\"status-text\"]`), never color alone. A\ntransition *to* `\"failed\"`, or *from* `\"streaming\"` to `\"sent\"` (a stream\nfinishing), is additionally announced through an internal\n`<lr-live-region>` (see that component's header for the throttled-\nannouncement wiring this composes) so a screen-reader user who isn't\ncurrently focused on this message still learns about it — *unless* the\n`failure` slot has content, in which case this internal announcement is\nskipped: the host's own `role=\"alert\"` failure content is expected to\nannounce itself, and firing both would double-announce the same failure\nwith two different (and differently specific) messages. This differs\nfrom `<lr-typing-indicator>`'s deliberately simpler `role=\"status\"`\napproach — that component only ever has one thing to announce (its own\nmount); this one has a `status` that can flip between several values\nacross a single element's lifetime, which is exactly the coalescing job\n`<lr-live-region>` exists for.\n\n`role` is a message-author role (`user`/`assistant`/`system`, matching\nthe vocabulary of every chat/completion API), *not* a WAI-ARIA role, so\nit reflects to a `data-role` attribute rather than the bare `role`\nattribute — `role=\"user\"` would collide with `Element`'s own ARIA `role`\naccessor and is not a valid ARIA role token to begin with.\n\n`actionsOutsideBubble` allows the `actions` slot to render as a sibling\nimmediately after the message bubble instead of nested inside the footer —\nuseful for consumers whose action row (e.g., a hover-reveal copy button)\nmust sit visually outside the bubble's chrome.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The message body. |\n| `actions` | Action controls (e.g. copy, retry), rendered at the end of the footer. |\n| `attachments` | File/image attachment chips, rendered below the message body by default; see `attachments-position`. |\n| `avatar` | An avatar/icon for the message author. |\n| `badges` | Small status/metric chips (e.g. token count, latency, model name) — entirely app-supplied; this component computes none of that itself. |\n| `failure` | Only ever rendered while `status=\"failed\"`. Empty (the default), the footer keeps its built-in `[part=\"status-text\"]`/`[part=\"retry-button\"]` exactly as before. The moment this slot has assigned content, that built-in status text and retry button are suppressed — the host is now fully responsible for presenting its own failure UI, and the built-in `chatFailedAnnounce` live-region announcement is suppressed too (see `@event lr-retry` below for the effect on that event, and the \"Accessibility of `status`\" paragraph above for the built-in announcement this replaces). Content assigned here should carry `role=\"alert\"` itself when it represents an actionable send failure — this component does not add that role on the host's behalf, since it has no way to know what markup the host puts in this slot. This mirrors `lr-flow-node`'s `header` slot, which replaces that component's own built-in heading row the same way. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The wrapper around the `actions` slot. Rendered inside the footer by default; a sibling immediately after `bubble` when `actionsOutsideBubble` is set. |\n| `attachments` | The wrapper around the `attachments` slot. |\n| `avatar` | The wrapper around the `avatar` slot. |\n| `badges` | The wrapper around the `badges` slot. |\n| `body` | The wrapper around the default slot (the message content). Hidden while `collapsed`. |\n| `bubble` | The message bubble root. Programmatically focusable (`tabindex=\"-1\"`) so focus has a stable place to land when the built-in retry button is removed (e.g. a `lr-retry` listener flipping `status` away from `\"failed\"`). Its fill/text derive from `--lr-chat-message-bubble-bg`/`--lr-chat-message-bubble-color` for every role except `user`, which derives from `--lr-chat-message-user-bubble-bg`/`--lr-chat-message-user-bubble-color` instead — override those cssprops rather than the shared `--lr-color-*` tokens they default to. |\n| `collapse-button` | The built-in collapse/expand toggle (only rendered when `collapsible`). |\n| `failure` | The `failure` slot itself (`display: contents` — it contributes no box of its own, so the host's own content lays out exactly as if it were a direct child of `bubble`, with no `::part(failure)` override needed to get there). Only present in the DOM while `status=\"failed\"`. |\n| `footer` | The row below the message body — status, timestamp, retry, and actions. Hidden entirely when none of those have anything to show. |\n| `header` | The row above the message body — avatar, badges, and the collapse toggle. Hidden entirely when none of those have anything to show. |\n| `retry-button` | The built-in retry button (only rendered when `status=\"failed\"`). |\n| `status-indicator` | A small decorative (`aria-hidden`) dot reflecting `status`; absent while `status=\"sent\"`. |\n| `status-text` | The visible text twin of `status-indicator` — carries the state in text, not just color. |\n| `timestamp` | The formatted `timestamp`, rendered in a `<time>` element. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chat-message-max-width` (default: `80%`) — Maximum inline size of the message bubble.\n- `--lr-chat-message-bubble-bg` (default: `var(--lr-color-surface)`) — Bubble fill for every role except `user`.\n- `--lr-chat-message-bubble-color` (default: `var(--lr-color-text)`) — Bubble text color for every role except `user`.\n- `--lr-chat-message-user-bubble-bg` (default: `var(--lr-color-brand-quiet)`) — Bubble fill for `data-role=\"user\"`.\n- `--lr-chat-message-user-bubble-color` (default: `var(--lr-color-text)`) — Bubble text color for `data-role=\"user\"`.\n- `--lr-transition-ambient` (default: `1.8s ease-in-out`) — Streaming-indicator animation duration and timing function."
2338
+ "value": "`<lr-chat-message>` — a role-based message bubble *shell* for a chat/\nagent conversation surface. It renders none of the message content itself:\nthe default slot carries whatever a consumer wants to display (plain\ntext, a `<lr-markdown>`, a custom template, anything at all) and this\ncomponent only supplies the surrounding chrome — alignment/coloring by\n`role`, an avatar/badges header row, an optional collapse toggle, an\nattachments strip, and a status-aware footer (a live-updating status dot +\ntext, the formatted `timestamp`, a built-in retry affordance for\n`status=\"failed\"`, and an `actions` slot for everything else).\n\nNo built-in copy button is rendered. Deciding what \"the copyable text\" of\nan arbitrary slotted message even means (plain text? the rendered\nmarkdown source? something else?) is exactly the kind of content\ninterpretation this shell deliberately stays out of — slot a copy control\ninto `actions` instead. Firing `lr-copy` (`detail: { text }`) from that\ncontrol keeps the event name consistent with `<lr-json-viewer>`'s own\ncopy affordance, for anything listening at the conversation-surface level.\n\nAccessibility of `status`: the current status is always available as\nplain visible text (`[part=\"status-text\"]`), never color alone. A\ntransition *to* `\"failed\"`, or *from* `\"streaming\"` to `\"sent\"` (a stream\nfinishing), is additionally announced through an internal\n`<lr-live-region>` (see that component's header for the throttled-\nannouncement wiring this composes) so a screen-reader user who isn't\ncurrently focused on this message still learns about it — *unless* the\n`failure` slot has content, in which case this internal announcement is\nskipped: the host's own `role=\"alert\"` failure content is expected to\nannounce itself, and firing both would double-announce the same failure\nwith two different (and differently specific) messages. This differs\nfrom `<lr-typing-indicator>`'s deliberately simpler `role=\"status\"`\napproach — that component only ever has one thing to announce (its own\nmount); this one has a `status` that can flip between several values\nacross a single element's lifetime, which is exactly the coalescing job\n`<lr-live-region>` exists for.\n\n`role` is a message-author role (`user`/`assistant`/`system`, matching\nthe vocabulary of every chat/completion API), *not* a WAI-ARIA role, so\nit reflects to a `data-role` attribute rather than the bare `role`\nattribute — `role=\"user\"` would collide with `Element`'s own ARIA `role`\naccessor and is not a valid ARIA role token to begin with.\n\n`actionsOutsideBubble` allows the `actions` slot to render as a sibling\nimmediately after the message bubble instead of nested inside the footer —\nuseful for consumers whose action row (e.g., a hover-reveal copy button)\nmust sit visually outside the bubble's chrome.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The message body. |\n| `actions` | Action controls (e.g. copy, retry), rendered at the end of the footer. |\n| `attachments` | File/image attachment chips, rendered below the message body by default; see `attachments-position`. |\n| `avatar` | An avatar/icon for the message author. |\n| `badges` | Small status/metric chips (e.g. token count, latency, model name) — entirely app-supplied; this component computes none of that itself. |\n| `failure` | Only ever rendered while `status=\"failed\"`. Empty (the default), the footer keeps its built-in `[part=\"status-text\"]`/`[part=\"retry-button\"]` exactly as before. The moment this slot has assigned content, that built-in status text and retry button are suppressed — the host is now fully responsible for presenting its own failure UI, and the built-in `chatFailedAnnounce` live-region announcement is suppressed too (see `@event lr-retry` below for the effect on that event, and the \"Accessibility of `status`\" paragraph above for the built-in announcement this replaces). Content assigned here should carry `role=\"alert\"` itself when it represents an actionable send failure — this component does not add that role on the host's behalf, since it has no way to know what markup the host puts in this slot. This mirrors `lr-flow-node`'s `header` slot, which replaces that component's own built-in heading row the same way. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The wrapper around the `actions` slot. Rendered inside the footer by default; a sibling immediately after `bubble` when `actionsOutsideBubble` is set. |\n| `attachments` | The wrapper around the `attachments` slot. |\n| `avatar` | The wrapper around the `avatar` slot. |\n| `badges` | The wrapper around the `badges` slot. |\n| `body` | The wrapper around the default slot (the message content). Hidden while `collapsed`. |\n| `bubble` | The message bubble root. Programmatically focusable (`tabindex=\"-1\"`) so focus has a stable place to land when the built-in retry button is removed (e.g. a `lr-retry` listener flipping `status` away from `\"failed\"`). Its fill/text derive from `--lr-chat-message-bubble-bg`/`--lr-chat-message-bubble-color` for every role except `user`, which derives from `--lr-chat-message-user-bubble-bg`/`--lr-chat-message-user-bubble-color` instead — override those cssprops rather than the shared `--lr-color-*` tokens they default to. Its geometry comes from `--lr-chat-message-bubble-padding`/`--lr-chat-message-bubble-radius` for the same reason — a `::part(bubble)` override from the consumer's tree outranks the per-`status` rules in this shadow tree and silently erases the `failed`/`streaming` treatments. |\n| `collapse-button` | The built-in collapse/expand toggle (only rendered when `collapsible`). |\n| `failure` | The `failure` slot itself (`display: contents` — it contributes no box of its own, so the host's own content lays out exactly as if it were a direct child of `bubble`, with no `::part(failure)` override needed to get there). Only present in the DOM while `status=\"failed\"`. |\n| `footer` | The row below the message body — status, timestamp, retry, and actions. Hidden entirely when none of those have anything to show. |\n| `header` | The row above the message body — avatar, badges, and the collapse toggle. Hidden entirely when none of those have anything to show. |\n| `retry-button` | The built-in retry button (only rendered when `status=\"failed\"`). |\n| `status-indicator` | A small decorative (`aria-hidden`) dot reflecting `status`; absent while `status=\"sent\"`. |\n| `status-text` | The visible text twin of `status-indicator` — carries the state in text, not just color. |\n| `timestamp` | The formatted `timestamp`, rendered in a `<time>` element. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chat-message-max-width` (default: `80%`) — Maximum inline size of the message bubble.\n- `--lr-chat-message-bubble-bg` (default: `var(--lr-color-surface)`) — Bubble fill for every role except `user`.\n- `--lr-chat-message-bubble-color` (default: `var(--lr-color-text)`) — Bubble text color for every role except `user`.\n- `--lr-chat-message-user-bubble-bg` (default: `var(--lr-color-brand-quiet)`) — Bubble fill for `data-role=\"user\"`.\n- `--lr-chat-message-user-bubble-color` (default: `var(--lr-color-text)`) — Bubble text color for `data-role=\"user\"`.\n- `--lr-chat-message-bubble-padding` (default: `var(--lr-space-m)`) — Bubble padding. Prefer this over a `::part(bubble)` padding override: an outer-tree `::part` declaration outranks every rule in this shadow tree, which silently suppresses the per-`status` and per-role bubble styling below it.\n- `--lr-chat-message-bubble-radius` (default: `var(--lr-radius)`) — Bubble corner radius. Bubble-only by design — `collapse-button` and `retry-button` keep reading the shared `--lr-radius`, so a rounder bubble never desyncs the controls from the rest of the library.\n- `--lr-transition-ambient` (default: `1.8s ease-in-out`) — Streaming-indicator animation duration and timing function."
2311
2339
  },
2312
2340
  "attributes": [
2313
2341
  {
@@ -2380,7 +2408,7 @@
2380
2408
  "name": "lr-chat-viewport",
2381
2409
  "description": {
2382
2410
  "kind": "markdown",
2383
- "value": "`<lr-chat-viewport>` — the transcript scroll container: owns stick-to-bottom behavior while an\nanswer streams, the \"jump to latest\" pill, and the unread divider.\n\n**Two supported content shapes, auto-detected:** ordinary element children (typically\n`<lr-chat-message>`s -- *slotted mode*), or exactly one `<lr-virtual-list>` (*virtual mode*,\ndetected via `instanceof` against the imported class so custom prefixes keep working). In virtual\nmode this component defers all scrolling to the slotted list's own `scrollToIndex()`.\n\n**Follow/release state machine.** While `follow` is engaged, content growth re-scrolls to the end.\nRelease happens only on a *user-intent* gesture (wheel, touchmove, scrollbar-drag, or\nPageUp/ArrowUp/Home while the log region has focus) that leaves the view more than\n`bottomThreshold` from the end -- a scroll caused by this component's own programmatic scrolling,\nor by a layout shift, never releases it. Reaching the bottom again by any means re-engages `follow`.\nThe internal log defaults to `live=\"off\"`, which avoids announcing every streaming token. Consumers\nthat append complete messages at an announcement-safe cadence can opt into `polite` or `assertive`.\n\n**`scrollToUnread()` in virtual mode.** The target row is scrolled with `align: 'start'` so the\ndivider boundary lands at the top of the view with the unread content visible below it -- the\nonly alignment that matches what \"scroll to the divider\" means here. The underlying virtual list\nonly issues a corrective re-scroll for an initially-unmeasured target when that target's *own*\nheight is what was uncertain (`align: 'end'`/a downward `align: 'auto'`); a `'start'`-aligned\ntarget's position is a function of the rows *before* it, so it has no such self-correction. In\npractice the rows leading up to an unread boundary are usually ones the reader already scrolled\npast (and so already measured), which keeps this accurate in the common case; a still-unmeasured\nlong-distance jump can land approximately rather than pixel-exact. Fixing that fully would mean\nchanging how the underlying list resolves offsets, which is out of scope here -- `align: 'end'`\nwas considered and rejected because it changes the visible outcome (it would put the *bottom* of\nthe boundary row at the viewport's bottom edge, hiding the unread content the jump is meant to\nreveal, not just changing how precisely it lands).\n\nRenders no messages and computes no unread state itself -- the host supplies `unreadStartIndex`;\nno virtualization of its own (`<lr-virtual-list>`); not a generic overflow surface\n(`<lr-scroller>`); no message semantics (`<lr-chat-message>`).\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The transcript: ordinary element children, or exactly one `<lr-virtual-list>`. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The positioning root. |\n| `content` | The slotted-content wrapper the growth observers watch. |\n| `jump-pill` | The built-in jump-to-latest button, absent while `follow` is engaged. |\n| `scroll` | The scroll container (`role=\"log\"`, `tabindex=\"0\"`). In virtual mode it stops scrolling itself (the slotted list scrolls) but keeps the role. |\n| `unread-divider` | The \"New messages\" separator (slotted mode only). |"
2411
+ "value": "`<lr-chat-viewport>` — the transcript scroll container: owns stick-to-bottom behavior while an\nanswer streams, the \"jump to latest\" pill, and the unread divider.\n\n**Two supported content shapes, auto-detected:** ordinary element children (typically\n`<lr-chat-message>`s -- *slotted mode*), or exactly one `<lr-virtual-list>` (*virtual mode*,\ndetected via `instanceof` against the imported class so custom prefixes keep working). In virtual\nmode this component defers all scrolling to the slotted list's own `scrollToIndex()`, and sizes\nthat list to its own height -- without which the list would scroll inside `lr-virtual-list`'s\n24rem `--lr-virtual-list-height` default no matter how tall this viewport is. That sizing is a\npercentage, so virtual mode needs a height-bounded parent, the same requirement slotted mode's\nown scroll container already has; a consumer's own rule or inline style setting\n`--lr-virtual-list-height` on the list still wins.\n\n**Follow/release state machine.** While `follow` is engaged, content growth re-scrolls to the end.\nRelease happens only on a *user-intent* gesture (wheel, touchmove, scrollbar-drag, or\nPageUp/ArrowUp/Home while the log region has focus) that leaves the view more than\n`bottomThreshold` from the end -- a scroll caused by this component's own programmatic scrolling,\nor by a layout shift, never releases it. Reaching the bottom again by any means re-engages `follow`.\nThe internal log defaults to `live=\"off\"`, which avoids announcing every streaming token. Consumers\nthat append complete messages at an announcement-safe cadence can opt into `polite` or `assertive`.\n\n**`scrollToUnread()` in virtual mode.** The target row is scrolled with `align: 'start'` so the\ndivider boundary lands at the top of the view with the unread content visible below it -- the\nonly alignment that matches what \"scroll to the divider\" means here. The underlying virtual list\nonly issues a corrective re-scroll for an initially-unmeasured target when that target's *own*\nheight is what was uncertain (`align: 'end'`/a downward `align: 'auto'`); a `'start'`-aligned\ntarget's position is a function of the rows *before* it, so it has no such self-correction. In\npractice the rows leading up to an unread boundary are usually ones the reader already scrolled\npast (and so already measured), which keeps this accurate in the common case; a still-unmeasured\nlong-distance jump can land approximately rather than pixel-exact. Fixing that fully would mean\nchanging how the underlying list resolves offsets, which is out of scope here -- `align: 'end'`\nwas considered and rejected because it changes the visible outcome (it would put the *bottom* of\nthe boundary row at the viewport's bottom edge, hiding the unread content the jump is meant to\nreveal, not just changing how precisely it lands).\n\nRenders no messages and computes no unread state itself -- the host supplies `unreadStartIndex`;\nno virtualization of its own (`<lr-virtual-list>`); not a generic overflow surface\n(`<lr-scroller>`); no message semantics (`<lr-chat-message>`).\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The transcript: ordinary element children, or exactly one `<lr-virtual-list>`. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The positioning root. |\n| `content` | The slotted-content wrapper the growth observers watch. |\n| `jump-pill` | The built-in jump-to-latest button, absent while `follow` is engaged. |\n| `scroll` | The scroll container (`role=\"log\"`, `tabindex=\"0\"`). In virtual mode it stops scrolling itself (the slotted list scrolls) but keeps the role. |\n| `unread-divider` | The \"New messages\" separator (slotted mode only). |"
2384
2412
  },
2385
2413
  "attributes": [
2386
2414
  {
@@ -2401,7 +2429,7 @@
2401
2429
  "name": "follow",
2402
2430
  "description": {
2403
2431
  "kind": "markdown",
2404
- "value": "Component-managed stick-to-bottom state, host-writable. Setting `true` scrolls to the end and\nre-engages following; setting `false` releases it.\n\nType: `boolean` \nDefault: `true`"
2432
+ "value": "Component-managed stick-to-bottom state, host-writable. Setting `true` scrolls to the end and\nre-engages following; setting `false` releases it. Uses trueDefaultBooleanConverter\nrather than Lit's default presence-based `type: Boolean` handling, so a plain-HTML consumer\ncan start released with the attribute string `follow=\"false\"`, not just a `.follow=${false}`\nproperty binding.\n\nType: `boolean` \nDefault: `true`"
2405
2433
  }
2406
2434
  },
2407
2435
  {
@@ -2438,7 +2466,7 @@
2438
2466
  "name": "lr-checkbox",
2439
2467
  "description": {
2440
2468
  "kind": "markdown",
2441
- "value": "`<lr-checkbox>` — a boolean form control. Structurally the same idea as\n`<lr-switch>` (form-associated via `ElementInternals`, click and\nSpace both toggle) but with checkbox semantics: `role=\"checkbox\"` +\nan `aria-checked` that can also be `\"mixed\"`, and a visual box/checkmark\ninstead of a track/thumb.\n\n`checked` is not a plain string, so this attaches `ElementInternals`\ndirectly and implements its own `updateValidity()` rather than using the\n`FormAssociated` mixin — see `<lr-combobox>` for the same\ndirect-`ElementInternals` shape with a non-string value.\n\nDeliberately no hint/error chrome of its own -- the default slot already carries real, visible\nlabel text (see `@slot` below), so a labeled-field frame built around `label`/`hint`/`errorText`\nprops has nothing to add here. A consumer needing hint/error messaging composes it in their own\nwrapper (e.g. `<lr-tool-param-form>` folds a boolean field's validation error into adjacent\ndescription text / `aria-label` rather than a `<lr-checkbox>`-owned slot), the same way a\nnative `<input type=\"checkbox\">` plus `<label>` pairs with an externally-owned error node.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Label text, rendered next to the box. Clicking it toggles the checkbox, the same as clicking a native checkbox's associated `<label>`. If left empty, set `aria-label` on the host so the control still has an accessible name. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The whole interactive control (`role=\"checkbox\"`); wraps the box and label. |\n| `box` | The small square that shows the checkmark/indeterminate dash. |\n| `checkmark` | The checkmark (or indeterminate dash) glyph inside the box. |\n| `label` | The wrapper around the default slot. |"
2469
+ "value": "`<lr-checkbox>` — a boolean form control. Structurally the same idea as\n`<lr-switch>` (form-associated via `ElementInternals`, click and\nSpace both toggle) but with checkbox semantics: `role=\"checkbox\"` +\nan `aria-checked` that can also be `\"mixed\"`, and a visual box/checkmark\ninstead of a track/thumb.\n\n`checked` is not a plain string, so this attaches `ElementInternals`\ndirectly and implements its own `updateValidity()` rather than using the\n`FormAssociated` mixin — see `<lr-combobox>` for the same\ndirect-`ElementInternals` shape with a non-string value.\n\nDeliberately no hint/error chrome of its own -- the default slot already carries real, visible\nlabel text (see `@slot` below), so a labeled-field frame built around `label`/`hint`/`errorText`\nprops has nothing to add here. A consumer needing hint/error messaging composes it in their own\nwrapper (e.g. `<lr-tool-param-form>` folds a boolean field's validation error into adjacent\ndescription text / `aria-label` rather than a `<lr-checkbox>`-owned slot), the same way a\nnative `<input type=\"checkbox\">` plus `<label>` pairs with an externally-owned error node.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Label text, rendered next to the box. Clicking it toggles the checkbox, the same as clicking a native checkbox's associated `<label>`. If left empty, set `aria-label` on the host so the control still has an accessible name. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The whole interactive control (`role=\"checkbox\"`); wraps the box and label. |\n| `box` | The small square that shows the checkmark/indeterminate dash. |\n| `checkmark` | The checkmark (or indeterminate dash) glyph inside the box. |\n| `label` | The wrapper around the default slot. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-checkbox-label-indent` (default: `calc(min(var(--lr-icon-button-size), 1.75rem) + var(--lr-space-s))`) — The inline distance from the control's start edge to the start of the label text, i.e. the box's own floor plus the gap next to it. Published so a consumer composing per-option hint text under the label can align it without re-deriving that formula from the shadow styles, and used as the source of the real gap so the two cannot drift. Setting it on the element (or on `lr-checkbox` in your own stylesheet) moves the label; because custom properties inherit down and not sideways, it is *not* readable from a sibling node in your tree — align a sibling by computing the same formula from `--lr-theme-icon-button-size` and `--lr-theme-space-s`, which you control.\n- `--lr-checkbox-checked-bg` (default: `var(--lr-color-brand)`) — Background of `[part='box']` while `checked` or `indeterminate`. Retint just this control's checked fill without touching the shared `--lr-color-brand` token every other component also reads.\n- `--lr-checkbox-checked-border` (default: `var(--lr-color-brand)`) — Border color of `[part='box']` while `checked` or `indeterminate`."
2442
2470
  },
2443
2471
  "attributes": [
2444
2472
  {
@@ -2612,7 +2640,7 @@
2612
2640
  "name": "lr-chip",
2613
2641
  "description": {
2614
2642
  "kind": "markdown",
2615
- "value": "`<lr-chip>` — a small, content-agnostic pill for a short label: a tag, an\nactive-filter/scope indicator, etc. Distinct from `<lr-attachment-chip>`\n(specifically file-shaped, with a thumbnail/size/upload-progress) — this\none carries no domain assumptions at all, just a label and an optional\nleading icon/dot.\n\n`tone` tints the whole pill using the same loud-color-on-quiet-tint\nconvention `<lr-tool-call-chip>`/`<lr-citation-badge>` already\nestablish for status coloring: background is the tone's `-quiet` tint,\ntext/icon is the tone's loud color. `neutral` (the default) has no\ndedicated token pair of its own, so it falls back to a plain\nbordered-surface look — the same \"no signal\" treatment\n`<lr-citation-badge>`'s `default` status and `<lr-tool-call-chip>`'s\n`pending` status already use.\n\nThis is a controlled component: clicking the remove (×) button only fires\n`lr-remove` — the chip never removes itself from the DOM on its own\ninteraction, the same contract `<lr-attachment-chip>`/\n`<lr-conversation-item>` already follow. A consumer owns the underlying\nlist and decides whether/how the click actually removes anything.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The chip's label content. |\n| `icon` | Optional leading icon or status dot. Nothing is reserved for it (no extra gap) when left empty. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The pill's root container. |\n| `icon` | Wrapper around the `icon` slot. Hidden entirely while empty. |\n| `label` | Wrapper around the default slot. |\n| `remove-button` | The remove (×) affordance, only rendered while `removable`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chip-accent` (default: `var(--lr-color-text)`) — Text/icon color of the pill. Each `tone` sets it to that tone's loud color.\n- `--lr-chip-bg` (default: `var(--lr-color-surface)`) — Background of the pill. Each `tone` sets it to that tone's `-quiet` tint.\n- `--lr-chip-border` (default: `var(--lr-color-border)`) — Border color of the pill. Every non-neutral `tone` sets it to `transparent`.\n- `--lr-chip-font-size` (default: `var(--lr-font-size-sm)`) — Label font size. Each `size` sets it to that step's font size.\n- `--lr-chip-gap` (default: `var(--lr-space-xs)`) — Gap between the icon, label, and remove button. Each `size` sets it to that step's gap.\n- `--lr-chip-icon-size` (default: `var(--lr-font-size-sm)`) — Font size of the `icon` slot wrapper. Each `size` sets it to that step's icon size.\n- `--lr-chip-padding-block` (default: `var(--lr-size-0-25rem)`) — Block padding of the pill. Each `size` sets it to that step's block padding.\n- `--lr-chip-padding-inline` (default: `var(--lr-space-s)`) — Inline padding of the pill. Each `size` sets it to that step's inline padding.\n- `--lr-chip-pressed-bg` (default: `var(--lr-chip-bg)`) — Background while a toggleable chip is selected, independently themeable from its resting background.\n- `--lr-chip-pressed-border` (default: `var(--lr-chip-accent)`) — Border color while a toggleable chip is selected, independently themeable from the label/icon color."
2643
+ "value": "`<lr-chip>` — a small, content-agnostic pill for a short label: a tag, an\nactive-filter/scope indicator, etc. Distinct from `<lr-attachment-chip>`\n(specifically file-shaped, with a thumbnail/size/upload-progress) — this\none carries no domain assumptions at all, just a label and an optional\nleading icon/dot.\n\n`tone` tints the whole pill using the same loud-color-on-quiet-tint\nconvention `<lr-tool-call-chip>`/`<lr-citation-badge>` already\nestablish for status coloring: background is the tone's `-quiet` tint,\ntext/icon is the tone's loud color. `neutral` (the default) has no\ndedicated token pair of its own, so it falls back to a plain\nbordered-surface look — the same \"no signal\" treatment\n`<lr-citation-badge>`'s `default` status and `<lr-tool-call-chip>`'s\n`pending` status already use.\n\nThis is a controlled component: clicking the remove (×) button only fires\n`lr-remove` — the chip never removes itself from the DOM on its own\ninteraction, the same contract `<lr-attachment-chip>`/\n`<lr-conversation-item>` already follow. A consumer owns the underlying\nlist and decides whether/how the click actually removes anything.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The chip's label content. |\n| `icon` | Optional leading icon or status dot. Nothing is reserved for it (no extra gap) when left empty. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The pill's root container. |\n| `icon` | Wrapper around the `icon` slot. Hidden entirely while empty. |\n| `label` | Wrapper around the default slot. |\n| `remove-button` | The remove (×) affordance, only rendered while `removable`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chip-accent` (default: `var(--lr-color-text)`) — Text/icon color of the pill. Each `tone` sets it to that tone's loud color.\n- `--lr-chip-bg` (default: `var(--lr-color-surface)`) — Background of the pill. Each `tone` sets it to that tone's `-quiet` tint.\n- `--lr-chip-border` (default: `var(--lr-color-border)`) — Border color of the pill. Every non-neutral `tone` sets it to `transparent`.\n- `--lr-chip-font-size` (default: `var(--lr-font-size-sm)`) — Label font size. Each `size` sets it to that step's font size.\n- `--lr-chip-gap` (default: `var(--lr-space-xs)`) — Gap between the icon, label, and remove button. Each `size` sets it to that step's gap.\n- `--lr-chip-icon-size` (default: `var(--lr-font-size-sm)`) — Font size of the `icon` slot wrapper. Each `size` sets it to that step's icon size.\n- `--lr-chip-padding-block` (default: `var(--lr-size-0-25rem)`) — Block padding of the pill. Each `size` sets it to that step's block padding.\n- `--lr-chip-padding-inline` (default: `var(--lr-space-s)`) — Inline padding of the pill. Each `size` sets it to that step's inline padding.\n- `--lr-chip-min-height` (default: `var(--lr-size-1-5rem)`) — Minimum block size of an interactive (`removable`/`toggleable`) chip's tap target. `size` keeps `2xs`/`xs`/`s`/`m` at the `1.5rem` (24px) WCAG 2.2 SC 2.5.8 minimum and raises `l` to `var(--lr-size-1-75rem)` and `xl` to `var(--lr-size-2rem)`. Non-interactive display chips are unaffected by this floor.\n- `--lr-chip-height` — Exact block size of the chip. Undeclared by default, so the chip grows to fit its content (floored by `--lr-chip-min-height` when interactive). Set it to pin a fixed height. A value below the 24px interactive target is for non-interactive chips only.\n- `--lr-chip-pressed-bg` (default: `var(--lr-chip-bg)`) — Background while a toggleable chip is selected, independently themeable from its resting background.\n- `--lr-chip-pressed-border` (default: `var(--lr-chip-accent)`) — Border color while a toggleable chip is selected, independently themeable from the label/icon color."
2616
2644
  },
2617
2645
  "attributes": [
2618
2646
  {
@@ -2693,7 +2721,7 @@
2693
2721
  "name": "lr-chunk-inspector",
2694
2722
  "description": {
2695
2723
  "kind": "markdown",
2696
- "value": "`<lr-chunk-inspector>` — a ranked retrieved-chunks list: relevance score bars with tier tones,\nexpandable chunk text, and the deep-link event that lands a chunk in `lr-document-viewer`.\nNever fetches, ranks, or dedupes; never opens documents itself.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The `role=\"group\"` wrapper. |\n| `chunk` | One chunk row (`role=\"listitem\"`). |\n| `empty` | The empty-state message, shown when `chunks` is empty. |\n| `open-button` | The chunk's title/open `<button>`. |\n| `score` | The visible percent-score text. |\n| `score-bar` | The `aria-hidden` score bar track. |\n| `score-fill` | The score bar's tone-mapped fill. |\n| `text` | The chunk's text preview, line-clamped unless expanded. Omitted when `compact`. |\n| `title` | The `<span>` inside `open-button` carrying the visible title text. Split from `open-button` (rather than a dual part name on one element) because an exact-match `[part=\"...\"]` CSS attribute selector -- as used by this component's own tests -- cannot match a multi-token `part` attribute value. |\n| `toggle` | The \"Show more\"/\"Show less\" button. Omitted when `compact`. |"
2724
+ "value": "`<lr-chunk-inspector>` — a ranked retrieved-chunks list: relevance score bars with tier tones,\nexpandable chunk text, and the deep-link event that lands a chunk in `lr-document-viewer`.\nNever fetches, ranks, or dedupes; never opens documents itself.\n\nEvery row-level part is reachable through `::part()` in both rendering paths: above\n`virtualize-at` a row lives in the internal `<lr-virtual-list>`'s shadow root, and its parts are\nre-exported from there under the same names. Row *state* is exposed as an additional part name\n(`chunk-current`, `score-current`, `score-fill-<tone>`, `text-clamped`) rather than as an\nattribute on the part, because Shadow Parts forbids an attribute selector after `::part()` --\n`::part(chunk)[aria-current='true']` is invalid CSS. The equivalent attributes are still present\non the elements. A state part is a second token in the same `part` attribute, so a `[part~=\"...\"]`\n(not `[part=\"...\"]`) selector is the one that matches inside a tree.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The `role=\"group\"` wrapper. |\n| `chunk` | One chunk row. Carries `role=\"listitem\"` only in the non-virtualized path; while virtualized the surrounding `<lr-virtual-list>` row supplies that role instead. |\n| `chunk-current` | Additional part on the `chunk` row matching `activeId`. |\n| `empty` | The empty-state message, shown when `chunks` is empty. |\n| `open-button` | The chunk's title/open `<button>`. |\n| `score` | The visible percent-score text. |\n| `score-bar` | The `aria-hidden` score bar track. |\n| `score-current` | Additional part on the current row's `score` line. |\n| `score-fill` | The score bar's tone-mapped fill. |\n| `score-fill-danger` | Additional part on a `score-fill` in the low-score tier. |\n| `score-fill-success` | Additional part on a `score-fill` in the high-score tier. |\n| `score-fill-warning` | Additional part on a `score-fill` in the medium-score tier. |\n| `text` | The chunk's text preview. Omitted when `compact`. |\n| `text-clamped` | Additional part on a `text` preview that is still collapsed (line-clamped); dropped once that chunk is expanded. |\n| `title` | The `<span>` inside `open-button` carrying the visible title text. Split from `open-button` (rather than a dual part name on one element) because an exact-match `[part=\"...\"]` CSS attribute selector -- as used by this component's own tests -- cannot match a multi-token `part` attribute value. |\n| `toggle` | The \"Show more\"/\"Show less\" button. Omitted when `compact`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chunk-inspector-current-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the chunk matching `activeId`. **Contrast-sensitive:** paired with `--lr-chunk-inspector-current-color`, which has to keep a 4.5:1 ratio against it.\n- `--lr-chunk-inspector-current-color` (default: `var(--lr-color-text)`) — Text color of the current chunk's `[part=\"score\"]` line. **Contrast-sensitive:** the quiet token it replaces only reaches ~4.24:1 against the current background, so override this together with `--lr-chunk-inspector-current-bg`, never alone."
2697
2725
  },
2698
2726
  "attributes": [
2699
2727
  {
@@ -2803,7 +2831,7 @@
2803
2831
  "name": "lr-code-block",
2804
2832
  "description": {
2805
2833
  "kind": "markdown",
2806
- "value": "`<lr-code-block>` — fenced code display with optional lazy syntax\nhighlighting and a copy button. No highlighting grammar ships in this\ncomponent itself: it lazy-loads the optional peer dependency `shiki` (see\n`code-loader.ts`) for the actual tokenizing, and degrades to a plain\n`<pre><code>` when that peer isn't installed or `language` is unset/\nunrecognized — the exact same optional-peer shape `<lr-markdown>` and\n`<lr-chart>` already establish. That fallback is the *default* rendering\npath, not a degraded one: unhighlighted code is perfectly usable, and it's\nwhat every instance renders at zero extra bytes until shiki resolves.\n\nA `<lr-skeleton>` placeholder stands in only while shiki itself is\nloading for the very first time on the page (cached — see\n`loadShikiHighlighter()`) and `language` is set. It's deliberately *not*\nshown again for a subsequent per-language grammar load (e.g. a second\n`<lr-code-block>` requesting a language no earlier instance has used\nyet) — that grammar fetch is typically fast, and the plain-text fallback\nis already a perfectly readable placeholder for it, so a second\nloading-chrome state would add complexity for little practical benefit.\n\nSet a host `aria-label` (or the matching `accessibleLabel` property) to\noverride the filename/language-derived name on the internal focusable code\nregion. The name is forwarded to the element that owns `role=\"group\"`, not\nleft only on the custom-element host across the shadow boundary.\n\n`languages` is an additive, opt-in escape hatch from that default path for\na consumer whose language set is fixed and known ahead of time: a map of\nlanguage id to an already-imported shiki grammar module (e.g. `import bash\nfrom 'shiki/langs/bash.mjs'`). When `language` matches a key in `languages`,\nthis component seeds a fine-grained `createHighlighterCore()` highlighter\nwith *only* the pre-supplied grammars (see `code-loader.ts`'s\n`loadShikiHighlighterCore()`) instead of waiting on `loadShikiHighlighter()`\nand its dynamic per-language `loadLanguage()` import. The payoff isn't\nruntime cost — the default dynamic-import path is already well-optimized\nfor that — it's *build output*: shiki's main entry point bundles a dynamic\n`import()` per bundled language (~200 of them) because a bundler can't\nstatically narrow which of those a `loadLanguage(lang: string)` call might\nrequest at runtime, so it conservatively emits a build-output chunk for\nevery one of them. `shiki/core`'s fine-grained API has no such table — a\nbundler only ever sees the exact grammar modules `languages` itself\n`import`s, so a consumer who pins its full language set this way trades a\nhand-maintained list for a build output scoped to just those languages\ninstead of shiki's entire bundled set. A language requested but absent\nfrom `languages` still falls back to the ordinary dynamic-import path\nunchanged, so this is a partial opt-in, not a replacement for it.\n\nAdopts the `line-range` slice of this library's shared anchor-target contract:\n`highlights`/`activeHighlightId` paint (and `highlight-lines` additionally marks) per-line\nemphasis in both the shiki and plain-text-fallback rendering paths identically, and\n`scrollToAnchor()` resolves a `line-range` anchor. `interactive-lines` is a separate, purely\nlocal affordance that turns the (`line-numbers`-gated) gutter into a keyboard-navigable,\nclickable roving-tabindex group emitting `lr-line-click` — it doesn't require `highlights` to\nbe set.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer container. |\n| `body` | The scrollable region wrapping the code (or the loading skeleton); respects `max-height`, `hidden` while `collapsible` and `collapsed`. |\n| `code` | The rendered `<code>`, same split as `pre` above. |\n| `copy-button` | The copy-to-clipboard button, when `copyable`. |\n| `filename` | The `filename` text, when set. |\n| `header` | The row above the code (filename/language/copy/toggle), present whenever there's anything to put in it. |\n| `language` | The `language` badge, when set, so the language is exposed to assistive tech as visible text rather than only a `language` attribute a screen reader would never announce. |\n| `line-button` | A gutter line-number button, only rendered while `interactive-lines` and `line-numbers` are both set. |\n| `line-highlight` | A line marked by `highlight-lines` or a `line-range` entry in `highlights`. |\n| `pre` | The rendered `<pre>` — shiki's own in the highlighted path, this component's own plain one in the fallback path. |\n| `toggle` | The collapse/expand chevron button, when `collapsible`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-code-block-max-height` (default: `none`) — Scroll cap applied to `body`. The `max-height` attribute, when set, writes this same property inline on `body` and therefore wins.\n- `--lr-code-block-font` (default: `var(--lr-font-mono)`) — Monospace family for the rendered `pre` and `code`."
2834
+ "value": "`<lr-code-block>` — fenced code display with optional lazy syntax\nhighlighting and a copy button. No highlighting grammar ships in this\ncomponent itself: it lazy-loads the optional peer dependency `shiki` (see\n`code-loader.ts`) for the actual tokenizing, and degrades to a plain\n`<pre><code>` when that peer isn't installed or `language` is unset/\nunrecognized — the exact same optional-peer shape `<lr-markdown>` and\n`<lr-chart>` already establish. That fallback is the *default* rendering\npath, not a degraded one: unhighlighted code is perfectly usable, and it's\nwhat every instance renders at zero extra bytes until shiki resolves.\n\nA `<lr-skeleton>` placeholder stands in only while shiki itself is\nloading for the very first time on the page (cached — see\n`loadShikiHighlighter()`) and `language` is set. It's deliberately *not*\nshown again for a subsequent per-language grammar load (e.g. a second\n`<lr-code-block>` requesting a language no earlier instance has used\nyet) — that grammar fetch is typically fast, and the plain-text fallback\nis already a perfectly readable placeholder for it, so a second\nloading-chrome state would add complexity for little practical benefit.\n\nSet a host `aria-label` (or the matching `accessibleLabel` property) to\noverride the filename/language-derived name on the internal focusable code\nregion. The name is forwarded to the element that owns `role=\"group\"`, not\nleft only on the custom-element host across the shadow boundary.\n\n`languages` is an additive, opt-in escape hatch from that default path for\na consumer whose language set is fixed and known ahead of time: a map of\nlanguage id to an already-imported shiki grammar module (e.g. `import bash\nfrom 'shiki/langs/bash.mjs'`). When `language` matches a key in `languages`,\nthis component seeds a fine-grained `createHighlighterCore()` highlighter\nwith *only* the pre-supplied grammars (see `code-loader.ts`'s\n`loadShikiHighlighterCore()`) instead of waiting on `loadShikiHighlighter()`\nand its dynamic per-language `loadLanguage()` import. The payoff isn't\nruntime cost — the default dynamic-import path is already well-optimized\nfor that — it's *build output*: shiki's main entry point bundles a dynamic\n`import()` per bundled language (~200 of them) because a bundler can't\nstatically narrow which of those a `loadLanguage(lang: string)` call might\nrequest at runtime, so it conservatively emits a build-output chunk for\nevery one of them. `shiki/core`'s fine-grained API has no such table — a\nbundler only ever sees the exact grammar modules `languages` itself\n`import`s, so a consumer who pins its full language set this way trades a\nhand-maintained list for a build output scoped to just those languages\ninstead of shiki's entire bundled set. A language requested but absent\nfrom `languages` still falls back to the ordinary dynamic-import path\nunchanged, so this is a partial opt-in, not a replacement for it.\n\nAdopts the `line-range` slice of this library's shared anchor-target contract:\n`highlights`/`activeHighlightId` paint (and `highlight-lines` additionally marks) per-line\nemphasis in both the shiki and plain-text-fallback rendering paths identically, and\n`scrollToAnchor()` resolves a `line-range` anchor. `interactive-lines` is a separate, purely\nlocal affordance that turns the (`line-numbers`-gated) gutter into a keyboard-navigable,\nclickable roving-tabindex group emitting `lr-line-click` — it doesn't require `highlights` to\nbe set.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer container. |\n| `body` | The scrollable region wrapping the code (or the loading skeleton); respects `max-height`, `hidden` while `collapsible` and `collapsed`. |\n| `code` | The rendered `<code>`, same split as `pre` above. |\n| `copy-button` | The copy-to-clipboard button, when `copyable`. |\n| `filename` | The `filename` text, when set. |\n| `header` | The row above the code (filename/language/copy/toggle), present whenever there's anything to put in it. |\n| `language` | The `language` badge, when set, so the language is exposed to assistive tech as visible text rather than only a `language` attribute a screen reader would never announce. |\n| `line-button` | A gutter line-number button, only rendered while `interactive-lines` and `line-numbers` are both set. |\n| `line-highlight` | A line marked by `highlight-lines` or a `line-range` entry in `highlights`. |\n| `pre` | The rendered `<pre>` — shiki's own in the highlighted path, this component's own plain one in the fallback path. |\n| `toggle` | The collapse/expand chevron button, when `collapsible`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-code-block-max-height` (default: `none`) — Scroll cap applied to `body`. The `max-height` attribute, when set, writes this same property inline on `body` and therefore wins.\n- `--lr-code-block-font` (default: `var(--lr-font-mono)`) — Monospace family for the rendered `pre` and `code`.\n- `--lr-code-block-tab-size` (default: `2`) — Tab width for the rendered code, applied to `pre`. Same default as `--lr-code-editor-tab-size`, so the editable and read-only code surfaces agree; `lr-markdown`/`lr-markdown-core` declare the same token for their own `code-block` part (they are sibling elements, so they cannot inherit this one). Read as a token and never written inline, so a host override survives shiki's own inline `style` on the highlighted `pre`. The default is a `var()` fallback at the point of use rather than a `:host` declaration, so it inherits: set it on the element, a container, or `:root` and it reaches every code surface below. The markdown surface wraps (`white-space: pre-wrap`) while this one does not, so the same value can look different on a wrapped line, where tab stops restart.\n- `--lr-code-block-active-line-outline-color` (default: `var(--lr-color-brand)`) — Outline color of the line marked active by `active-highlight-id`. Retints just that outline, leaving every other `--lr-color-brand` surface in the component (header pill, hover states, focus ring) alone. Inherits, so it can also be set on an ancestor or at the theme level."
2807
2835
  },
2808
2836
  "attributes": [
2809
2837
  {
@@ -2880,7 +2908,7 @@
2880
2908
  "name": "languages-only",
2881
2909
  "description": {
2882
2910
  "kind": "markdown",
2883
- "value": "When `true`, skips the default `loadShikiHighlighter()` call in `connectedCallback()`\nentirely — for a consumer whose `languages` map already covers every language every instance\nwill ever render, so the bundler has no reachable path from this component to shiki's\n~200-language dynamic-import table. A `language` value absent from `languages` while this is\n`true` renders the plain-text fallback (no attempt to fall back to the now-unloaded default\nhighlighter) rather than hanging. `false` (the default) reproduces today's unconditional\n`loadShikiHighlighter()` call exactly.\n\nType: `boolean` \nDefault: `false`"
2911
+ "value": "When `true`, skips the *call* to the default `loadShikiHighlighter()` in\n`connectedCallback()` — for a consumer whose `languages` map already covers every language\nevery instance will ever render. This is a runtime branch only, **not** a build-time\nexclusion: `loadShikiHighlighter` is still imported unconditionally at this module's top\nlevel (see the import list above), and a bundler doing static reachability/chunk analysis\ncan't prove this flag is always `true`, so shiki's ~200-language dynamic-import table stays\nreachable from — and stays in the build output of — this component's module regardless of\nhow `languagesOnly` is set. A consumer who actually needs that table excluded from their\nbuild has to import `<lr-code-block-core>` instead, whose module never references\n`loadShikiHighlighter` at all (see its own class doc). A `language` value absent from\n`languages` while this is `true` renders the plain-text fallback (no attempt to fall back to\nthe now-unloaded default highlighter) rather than hanging. `false` (the default) reproduces\ntoday's unconditional `loadShikiHighlighter()` call exactly.\n\nType: `boolean` \nDefault: `false`"
2884
2912
  }
2885
2913
  },
2886
2914
  {
@@ -2910,7 +2938,7 @@
2910
2938
  "name": "lr-code-block-core",
2911
2939
  "description": {
2912
2940
  "kind": "markdown",
2913
- "value": "`<lr-code-block-core>` — a build-lean variant of `<lr-code-block>` for\na consumer whose `languages` map already covers every language it will\never render. It only ever calls `loadShikiHighlighterCore(this.languages)`\n(see `code-loader.ts`) — never `loadShikiHighlighter()`, the default\n~200-language dynamic-import table loader `<lr-code-block>` calls\nunconditionally unless its runtime `languagesOnly` flag is `true`. A\nruntime flag on that same module can't be proven always-`true` by a\nbundler, so the unconditional call (and everything shiki's main entry\npoint can reach from it) always stays in the build output regardless of\nhow that flag is used. This component's own module never textually\ncontains a call to (or import of) `loadShikiHighlighter` at all, so a\nconsumer importing this entry point instead of `code-block.js` gets a\ngenuinely shiki-full-table-free build.\n\nA `language` value absent from `languages` always renders the plain\n`<pre><code>` fallback — there is no default/full-table highlighter here\nto fall back to, unlike `<lr-code-block>`'s dynamic-import path for an\nunmapped language. That fallback is the *default* rendering path, not a\ndegraded one, same as `<lr-code-block>`'s own plain-text fallback.\n\nEverything else — `code`/`language`/`filename`/`copyable`/`collapsible`/\n`collapsed`/`maxHeight`, the copy button, the collapse header toggle, the\nloading-skeleton behavior while the fine-grained highlighter itself\nresolves — matches `<lr-code-block>` exactly. A host `aria-label` (or\nthe matching `accessibleLabel` property) is forwarded to the internal\nfocusable element that owns the named `group` role.\n\nAdopts the `line-range` slice of this library's shared anchor-target contract, identical to\n`<lr-code-block>`: `highlights`/`activeHighlightId` paint (and `highlight-lines` additionally\nmarks) per-line emphasis in both the shiki and plain-text-fallback rendering paths identically,\nand `scrollToAnchor()` resolves a `line-range` anchor. `interactive-lines` is a separate, purely\nlocal affordance that turns the (`line-numbers`-gated) gutter into a keyboard-navigable,\nclickable roving-tabindex group emitting `lr-line-click` — it doesn't require `highlights` to\nbe set.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer container. |\n| `body` | The scrollable region wrapping the code (or the loading skeleton); respects `max-height`, `hidden` while `collapsible` and `collapsed`. |\n| `code` | The rendered `<code>`, same split as `pre` above. |\n| `copy-button` | The copy-to-clipboard button, when `copyable`. |\n| `filename` | The `filename` text, when set. |\n| `header` | The row above the code (filename/language/copy/toggle), present whenever there's anything to put in it. |\n| `language` | The `language` badge, when set, so the language is exposed to assistive tech as visible text rather than only a `language` attribute a screen reader would never announce. |\n| `line-button` | A gutter line-number button, only rendered while `interactive-lines` and `line-numbers` are both set. |\n| `line-highlight` | A line marked by `highlight-lines` or a `line-range` entry in `highlights`. |\n| `pre` | The rendered `<pre>` — shiki's own in the highlighted path, this component's own plain one in the fallback path. |\n| `toggle` | The collapse/expand chevron button, when `collapsible`. |"
2941
+ "value": "`<lr-code-block-core>` — a build-lean variant of `<lr-code-block>` for\na consumer whose `languages` map already covers every language it will\never render. It only ever calls `loadShikiHighlighterCore(this.languages)`\n(see `code-loader.ts`) — never `loadShikiHighlighter()`, the default\n~200-language dynamic-import table loader `<lr-code-block>` calls\nunconditionally unless its runtime `languagesOnly` flag is `true`. A\nruntime flag on that same module can't be proven always-`true` by a\nbundler, so the unconditional call (and everything shiki's main entry\npoint can reach from it) always stays in the build output regardless of\nhow that flag is used. This component's own module never textually\ncontains a call to (or import of) `loadShikiHighlighter` at all, so a\nconsumer importing this entry point instead of `code-block.js` gets a\ngenuinely shiki-full-table-free build.\n\nA `language` value absent from `languages` always renders the plain\n`<pre><code>` fallback — there is no default/full-table highlighter here\nto fall back to, unlike `<lr-code-block>`'s dynamic-import path for an\nunmapped language. That fallback is the *default* rendering path, not a\ndegraded one, same as `<lr-code-block>`'s own plain-text fallback.\n\nEverything else — `code`/`language`/`filename`/`copyable`/`collapsible`/\n`collapsed`/`maxHeight`, the copy button, the collapse header toggle, the\nloading-skeleton behavior while the fine-grained highlighter itself\nresolves — matches `<lr-code-block>` exactly. A host `aria-label` (or\nthe matching `accessibleLabel` property) is forwarded to the internal\nfocusable element that owns the named `group` role.\n\nAdopts the `line-range` slice of this library's shared anchor-target contract, identical to\n`<lr-code-block>`: `highlights`/`activeHighlightId` paint (and `highlight-lines` additionally\nmarks) per-line emphasis in both the shiki and plain-text-fallback rendering paths identically,\nand `scrollToAnchor()` resolves a `line-range` anchor. `interactive-lines` is a separate, purely\nlocal affordance that turns the (`line-numbers`-gated) gutter into a keyboard-navigable,\nclickable roving-tabindex group emitting `lr-line-click` — it doesn't require `highlights` to\nbe set.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer container. |\n| `body` | The scrollable region wrapping the code (or the loading skeleton); respects `max-height`, `hidden` while `collapsible` and `collapsed`. |\n| `code` | The rendered `<code>`, same split as `pre` above. |\n| `copy-button` | The copy-to-clipboard button, when `copyable`. |\n| `filename` | The `filename` text, when set. |\n| `header` | The row above the code (filename/language/copy/toggle), present whenever there's anything to put in it. |\n| `language` | The `language` badge, when set, so the language is exposed to assistive tech as visible text rather than only a `language` attribute a screen reader would never announce. |\n| `line-button` | A gutter line-number button, only rendered while `interactive-lines` and `line-numbers` are both set. |\n| `line-highlight` | A line marked by `highlight-lines` or a `line-range` entry in `highlights`. |\n| `pre` | The rendered `<pre>` — shiki's own in the highlighted path, this component's own plain one in the fallback path. |\n| `toggle` | The collapse/expand chevron button, when `collapsible`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-code-block-tab-size` (default: `2`) — Tab width for the rendered code, applied to `pre`. Shared with `lr-code-block` (this component reuses its stylesheet), `lr-code-editor`, and the markdown viewers' own `code-block` part, so every code surface agrees on a tab's width.\n- `--lr-code-block-active-line-outline-color` (default: `var(--lr-color-brand)`) — Outline color of the line marked active by `active-highlight-id`, leaving every other `--lr-color-brand` surface in the component alone."
2914
2942
  },
2915
2943
  "attributes": [
2916
2944
  {
@@ -3193,7 +3221,7 @@
3193
3221
  "name": "lr-combobox",
3194
3222
  "description": {
3195
3223
  "kind": "markdown",
3196
- "value": "`<lr-combobox>` — a filterable single/multi select that combines a text\ninput with a listbox. Mirrors the core `<wa-combobox>` API under `lr-`.\n\nOptions are `<lr-option value>` children. Emits native-style `change`/`input`\n(like Web Awesome) plus `lr-show`/`lr-hide`/`lr-clear`.\nStandard size tiers share their outer control height with sibling Lyra controls; the decorative\nexpand icon scales inside that allocation without creating an independent action target.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-option>` elements. |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `clear-button` | The clear button. |\n| `combobox` | The input container (positioning anchor). |\n| `combobox-input` | The text input. |\n| `error` | The error message. |\n| `expand-icon` | The dropdown indicator. |\n| `form-control` | The outer wrapper around label, combobox, listbox, error and hint. |\n| `form-control-label` | The `<label>` element. |\n| `hint` | The hint message. |\n| `listbox` | The options popover. |\n| `option` | An option row. |\n| `option-badge` | An async option row's optional trailing metadata badge. |\n| `option-dot` | An option row's leading status dot (when `dot-color` is set). |\n| `option-icon` | An async option row's optional decorative leading visual. |\n| `option-label` | An option row's label/sub wrapper. |\n| `option-overflow` | The \"+N more\" indicator shown when rows are capped by `maxRender`. |\n| `option-sub` | An option row's secondary line (when `sub` is set). |\n| `tag` | An individual selected tag. |\n| `tag__remove-button` | A tag's remove button. |\n| `tags` | The multi-select tag container. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-combobox-trigger-padding` — Padding inside the input container.\n- `--lr-combobox-trigger-min-height` — Minimum input-container block size.\n- `--lr-combobox-font-size` — Input text size.\n- `--lr-combobox-tag-padding` — Selected-tag padding.\n- `--lr-combobox-tag-font-size` — Selected-tag text size.\n- `--lr-combobox-expand-size` — Decorative expand-icon box size, scaled by `size`."
3224
+ "value": "`<lr-combobox>` — a filterable single/multi select that combines a text\ninput with a listbox. Mirrors the core `<wa-combobox>` API under `lr-`.\n\nOptions are `<lr-option value>` children. Emits native-style `change`/`input`\n(like Web Awesome) plus `lr-show`/`lr-hide`/`lr-clear`.\nStandard size tiers share their outer control height with sibling Lyra controls; the decorative\nexpand icon scales inside that allocation without creating an independent action target.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-option>` elements. |\n| `end` | Adornment after the filter input and the built-in clear action, and before the expand icon — so consumer content never sits outboard of the dropdown chevron. |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n| `start` | Adornment at the inline-start of the trigger row, before the selected-value tags and the filter input. Slotted content is decorative chrome, not an option: `collectOptions()` only ever collects `<lr-option>` elements from the default slot. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `clear-button` | The clear button. |\n| `combobox` | The input container (positioning anchor). |\n| `combobox-input` | The text input. |\n| `end` | Wrapper around the `end` adornment slot; `hidden` while nothing is slotted. |\n| `error` | The error message. |\n| `expand-icon` | The dropdown indicator. |\n| `form-control` | The outer wrapper around label, combobox, listbox, error and hint. |\n| `form-control-label` | The `<label>` element. |\n| `hint` | The hint message. |\n| `listbox` | The options popover. |\n| `option` | An option row. |\n| `option-badge` | An async option row's optional trailing metadata badge. |\n| `option-dot` | An option row's leading status dot (when `dot-color` is set). |\n| `option-icon` | An async option row's optional decorative leading visual. |\n| `option-label` | An option row's label/sub wrapper. |\n| `option-overflow` | The \"+N more\" indicator shown when rows are capped by `maxRender`. |\n| `option-sub` | An option row's secondary line (when `sub` is set). |\n| `start` | Wrapper around the `start` adornment slot; `hidden` while nothing is slotted. |\n| `tag` | An individual selected tag. |\n| `tag__remove-button` | A tag's remove button. |\n| `tags` | The multi-select tag container. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-combobox-trigger-padding` — Padding inside the input container.\n- `--lr-combobox-trigger-min-height` — Minimum input-container block size, scaled by `size`.\n- `--lr-combobox-trigger-height` — Exact input-container height. Unset by default, which leaves `--lr-combobox-trigger-min-height` as a floor only; set it to a length to both floor and cap the row (e.g. to pixel-match `<lr-input>`/`<lr-select>` in the same toolbar). Because it is never declared by the component itself, it can be set from an ancestor or an outer-tree rule as well as inline on the element. Intended for a single-row combobox: in `multiple` mode a tag row long enough to wrap overflows the pinned box visibly (nothing is clipped or made unreachable), so leave it unset there.\n- `--lr-combobox-font-size` — Input text size.\n- `--lr-combobox-tag-padding` — Selected-tag padding.\n- `--lr-combobox-tag-font-size` — Selected-tag text size.\n- `--lr-combobox-expand-size` — Decorative expand-icon box size, scaled by `size`.\n- `--lr-combobox-option-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of a hovered or keyboard-active option row."
3197
3225
  },
3198
3226
  "attributes": [
3199
3227
  {
@@ -3221,7 +3249,7 @@
3221
3249
  "name": "clearable",
3222
3250
  "description": {
3223
3251
  "kind": "markdown",
3224
- "value": "Show a clear button while the combobox has a value. Mirrors `wa-combobox`'s public name.\n\nType: `boolean` \nDefault: `false`"
3252
+ "value": "Show a clear button while the combobox has something to clear on either axis: a committed\nselection, or visible filter text (the open listbox in single-select, any time in `multiple`\nmode — a closed single-select shows the selected label, not the query, so a stale query alone\nnever surfaces the button). Clearing a selection emits `input`/`change`/`lr-clear`; clearing\nfilter text emits `lr-filter` with an empty `value`; each fires only for the axis that\nactually changed. Mirrors `wa-combobox`'s public name.\n\nType: `boolean` \nDefault: `false`"
3225
3253
  }
3226
3254
  },
3227
3255
  {
@@ -3377,7 +3405,7 @@
3377
3405
  "name": "lr-command-palette",
3378
3406
  "description": {
3379
3407
  "kind": "markdown",
3380
- "value": "`<lr-command-palette>` — searchable application command menu with keyboard navigation.\nShared overlay infrastructure (the same one `<lr-dialog>` uses) coordinates focus-trapping\nTab, Escape dismissal, and document scroll-locking for as long as the palette is open.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `backdrop` | Modal backdrop. |\n| `command` | A command button. |\n| `description` | A command's secondary description text. Rendered for every command; empty when the command has no `description`. |\n| `dialog` | Palette dialog. |\n| `empty` | The \"no results\" message. Only rendered when the filter matches no command. |\n| `group` | A group heading, rendered before the first command of each `group`. |\n| `input` | Search input. |\n| `list` | Command list. |\n| `search` | The search row wrapping the leading icon and the `input`. |\n| `shortcut` | A command's trailing shortcut hint. Only rendered when the command has a `shortcut`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-command-palette-z-index` (default: `var(--lr-overlay-stack-index, var(--lr-layer-modal))`) — Stacking index of the backdrop.\n- `--lr-command-palette-max-inline-size` (default: `var(--lr-size-48rem)`) — Maximum dialog width.\n- `--lr-command-palette-max-block-size` (default: `70vh`) — Maximum dialog height.\n- `--lr-command-palette-list-max-block-size` (default: `50vh`) — Maximum height of the scrolling command list.\n- `--lr-command-palette-offset-block-start` (default: `12vh`) — Gap between the viewport top and the dialog."
3408
+ "value": "`<lr-command-palette>` — searchable application command menu with keyboard navigation.\nShared overlay infrastructure (the same one `<lr-dialog>` uses) coordinates focus-trapping\nTab, Escape dismissal, and document scroll-locking for as long as the palette is open.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `backdrop` | Modal backdrop. |\n| `command` | A command button. |\n| `description` | A command's secondary description text. Rendered for every command; empty when the command has no `description`. |\n| `dialog` | Palette dialog. |\n| `empty` | The \"no results\" message. Only rendered when the filter matches no command. |\n| `group` | A group heading, rendered before the first command of each `group`. |\n| `icon` | A command's leading icon glyph. Only rendered when the command has an `icon`. |\n| `input` | Search input. |\n| `list` | Command list. |\n| `search` | The search row wrapping the leading icon and the `input`. |\n| `shortcut` | A command's trailing shortcut hint. Only rendered when the command has a `shortcut`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-command-palette-z-index` (default: `var(--lr-overlay-stack-index, var(--lr-layer-modal))`) — Stacking index of the backdrop.\n- `--lr-command-palette-max-inline-size` (default: `var(--lr-size-48rem)`) — Maximum dialog width.\n- `--lr-command-palette-max-block-size` (default: `70vh`) — Maximum dialog height.\n- `--lr-command-palette-list-max-block-size` (default: `50vh`) — Maximum height of the scrolling command list.\n- `--lr-command-palette-offset-block-start` (default: `12vh`) — Gap between the viewport top and the dialog.\n- `--lr-command-palette-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the active (keyboard-highlighted, `data-active=\"true\"`) command row. Declared as an inline `var()` fallback (never on `:host`), so setting it on the element or an ancestor recolors only the active row without hijacking the library-wide `--lr-color-brand-quiet` token."
3381
3409
  },
3382
3410
  "attributes": [
3383
3411
  {
@@ -3414,9 +3442,16 @@
3414
3442
  "name": "lr-commit-card",
3415
3443
  "description": {
3416
3444
  "kind": "markdown",
3417
- "value": "`<lr-commit-card>` — compact commit summary (subject, author/time, diffstat, per-file changes)\nthat links file rows out to a diff view.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `actions` | Trailing header controls (e.g. an \"open PR\" button). |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The `actions` slot wrapper. |\n| `additions` | The additions count. |\n| `author` | The author text. |\n| `base` | The root wrapper. |\n| `body` | The commit message's remaining lines. |\n| `copy-button` | The hash copy button. |\n| `deletions` | The deletions count. |\n| `diffstat` | The aggregate `+N -M` summary. |\n| `file` | A file row; carries `data-status`. |\n| `file-additions` | A file row's additions count. |\n| `file-deletions` | A file row's deletions count. |\n| `file-path` | A file row's path text. |\n| `files-toggle` | The file-list fold toggle. |\n| `hash` | The abbreviated hash text. |\n| `meta` | The author/time/diffstat row. |\n| `subject` | The commit message's first line. |\n| `time` | The `<time>` wrapper. |"
3445
+ "value": "`<lr-commit-card>` — compact commit summary (subject, author/time, diffstat, per-file changes)\nthat links file rows out to a diff view. Set `compact` (tighter padding) and/or\n`appearance=\"plain\"` (no border/padding at all) when embedding one as a row in a commit list or\nPR timeline, so the built-in card chrome doesn't double up against the list's own — same\nconvention as `<lr-agent-run>`'s own `compact`/`appearance`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `actions` | Trailing header controls (e.g. an \"open PR\" button). |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The `actions` slot wrapper. |\n| `additions` | The additions count. |\n| `author` | The author text. |\n| `base` | The root wrapper. |\n| `body` | The commit message's remaining lines. |\n| `copy-button` | The hash copy button. |\n| `deletions` | The deletions count. |\n| `diffstat` | The aggregate `+N -M` summary. |\n| `file` | A file row; carries `data-status`. |\n| `file-additions` | A file row's additions count. |\n| `file-deletions` | A file row's deletions count. |\n| `file-path` | A file row's path text. |\n| `files-toggle` | The file-list fold toggle. |\n| `hash` | The abbreviated hash text. |\n| `meta` | The author/time/diffstat row. |\n| `subject` | The commit message's first line. |\n| `time` | The `<time>` wrapper. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-commit-card-compact-padding` (default: `var(--lr-space-s)`) — `[part=\"base\"]` padding while `compact`."
3418
3446
  },
3419
3447
  "attributes": [
3448
+ {
3449
+ "name": "appearance",
3450
+ "description": {
3451
+ "kind": "markdown",
3452
+ "value": "Visual chrome, mirroring `lr-card`'s (and `<lr-agent-run>`'s own) `appearance` vocabulary.\n`'card'` (the default) keeps the bordered, padded box. `'plain'` removes the border, padding\nand corner radius, so a commit nested inside a host list that already draws its own row\nchrome doesn't double it. `plain` wins over `compact` when both are set (nothing left to\ntighten).\n\nType: `CommitCardAppearance` \nDefault: `'card'`"
3453
+ }
3454
+ },
3420
3455
  {
3421
3456
  "name": "author",
3422
3457
  "description": {
@@ -3424,6 +3459,13 @@
3424
3459
  "value": "Type: `string` \nDefault: `''`"
3425
3460
  }
3426
3461
  },
3462
+ {
3463
+ "name": "compact",
3464
+ "description": {
3465
+ "kind": "markdown",
3466
+ "value": "Tighter root padding for dense contexts (a commit rendered as a row in a list or PR\ntimeline) -- same convention as `<lr-agent-run>`'s own `compact`. Defaults to `false`, i.e.\nthe full card padding. Purely a density knob: the border stays, so use `appearance=\"plain\"`\ninstead to drop the chrome entirely.\n\nType: `boolean` \nDefault: `false`"
3467
+ }
3468
+ },
3427
3469
  {
3428
3470
  "name": "copyable",
3429
3471
  "description": {
@@ -3468,6 +3510,13 @@
3468
3510
  "value": "`<lr-community-card>` — a cluster/community summary card (GraphRAG community report): label,\nLLM summary excerpt, member count, member chips with overflow, and a drill-in action. Doesn't\nown community rendering on the graph or membership fetching -- `lr-drill` asks the host to\nload members/subgraph.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `actions` | Extra header actions alongside the built-in drill button. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The wrapper around the `actions` slot and the drill button. |\n| `base` | The outer bordered container. |\n| `drill-button` | The built-in \"Explore community\" button. |\n| `empty` | The empty state shown when `community` is `null`. |\n| `header` | The header row. |\n| `member` | One member chip button. |\n| `member-count` | The `\"{count} members\"` text. |\n| `members` | The wrapper around member chips, omitted in `compact` mode. |\n| `overflow` | The \"+N\" overflow chip button. |\n| `summary` | The LLM summary excerpt, omitted in `compact` mode. |\n| `title` | The community label, `role=\"heading\" aria-level=\"3\"` wrapping a `<button>`. |"
3469
3511
  },
3470
3512
  "attributes": [
3513
+ {
3514
+ "name": "appearance",
3515
+ "description": {
3516
+ "kind": "markdown",
3517
+ "value": "Visual chrome, mirroring `lr-card`'s `appearance` vocabulary and this component's sibling\n`lr-entity-card`'s identical property. `'card'` (the default) keeps the bordered, filled,\npadded box. `'plain'` removes the border, background, and padding, so a card nested inside a\ncontainer that already draws a border doesn't double it.\n\nType: `CommunityCardAppearance` \nDefault: `'card'`"
3518
+ }
3519
+ },
3471
3520
  {
3472
3521
  "name": "compact",
3473
3522
  "description": {
@@ -3567,9 +3616,16 @@
3567
3616
  "name": "lr-confirm-bar",
3568
3617
  "description": {
3569
3618
  "kind": "markdown",
3570
- "value": "`<lr-confirm-bar>` — an inline, non-modal approve/deny block for one proposed action: the\nin-flow sibling of `<lr-tool-approval-dialog>` for confirmations that should sit in the\ntranscript instead of hijacking focus. Same `lr-approve`/`lr-deny` event shapes as the dialog,\nand the same `toolApprovalHeading`/`toolApprovalArgsLabel`/`deny`/`approve` localization keys, so\nthe two always translate in lockstep.\n\nNon-modal by contract: no focus trap, no scroll lock, no Escape/backdrop semantics, and it never\nsteals focus when it appears in the transcript. DOM and tab order put Deny before Approve (the\ndialog's safe-action-first rationale). On activation, focus moves synchronously to `[part=\"status\"]`\n(an always-rendered, `tabindex=\"-1\"` element) *before* the Deny/Approve buttons unmount, so focus\nnever has a gap where it would otherwise fall back to `<body>`.\n\nNo argument editing (escalate to `<lr-tool-approval-dialog>`'s `editable` when edit-before-approve\nmatters); no blocking/modality guarantee (a user can scroll past); no decision persistence or\n\"remember choice\" logic (the `footer` slot + host own that).\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Supplementary body content between the heading and the actions (e.g. a `lr-diff-view` of the proposed change). |\n| `footer` | Extra content at the start of the action row (e.g. a \"remember this choice\" checkbox), mirroring `lr-tool-approval-dialog`'s own `footer` slot. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `approve-button` | Named identically to the dialog's part. |\n| `args` | The `lr-details` + `lr-json-viewer` wrapper. Only rendered when `args` is defined. |\n| `base` | The root (`role=\"group\"`). |\n| `body` | The default-slot wrapper. |\n| `deny-button` | Named identically to the dialog's part. |\n| `footer` | The action row. |\n| `heading` | The heading. |\n| `status` | The decided-state text. Always present in the DOM (`tabindex=\"-1\"`) so focus has a stable, synchronous landing spot on activation. |\n| `tool-name` | The tool-name span within the heading. Only rendered when `heading` is unset. |"
3619
+ "value": "`<lr-confirm-bar>` — an inline, non-modal approve/deny block for one proposed action: the\nin-flow sibling of `<lr-tool-approval-dialog>` for confirmations that should sit in the\ntranscript instead of hijacking focus. Same `lr-approve`/`lr-deny` event shapes as the dialog,\nand the same `toolApprovalHeading`/`toolApprovalArgsLabel`/`deny`/`approve` localization keys, so\nthe two always translate in lockstep.\n\nNon-modal by contract: no focus trap, no scroll lock, no Escape/backdrop semantics, and it never\nsteals focus when it appears in the transcript. DOM and tab order put Deny before Approve (the\ndialog's safe-action-first rationale). On activation, focus moves synchronously to `[part=\"status\"]`\n(an always-rendered, `tabindex=\"-1\"` element) *before* the Deny/Approve buttons unmount, so focus\nnever has a gap where it would otherwise fall back to `<body>`.\n\nNo argument editing (escalate to `<lr-tool-approval-dialog>`'s `editable` when edit-before-approve\nmatters); no blocking/modality guarantee (a user can scroll past); no decision persistence or\n\"remember choice\" logic (the `footer` slot + host own that).\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Supplementary body content between the heading and the actions (e.g. a `lr-diff-view` of the proposed change). |\n| `footer` | Extra content at the start of the action row (e.g. a \"remember this choice\" checkbox), mirroring `lr-tool-approval-dialog`'s own `footer` slot. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `approve-button` | Named identically to the dialog's part. |\n| `args` | The `lr-details` + `lr-json-viewer` wrapper. Only rendered when `args` is defined. |\n| `base` | The root (`role=\"group\"`). |\n| `body` | The default-slot wrapper. |\n| `deny-button` | Named identically to the dialog's part. |\n| `footer` | The action row. |\n| `heading` | The heading. |\n| `status` | The decided-state text. Always present in the DOM (`tabindex=\"-1\"`) so focus has a stable, synchronous landing spot on activation. |\n| `tool-name` | The tool-name span within the heading. Only rendered when `heading` is unset. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-confirm-bar-compact-padding` (default: `0`) — Padding of `[part='base']` while `compact`. Accepts any padding shorthand.\n- `--lr-confirm-bar-compact-gap` (default: `var(--lr-space-s)`) — Gap between the row's items while `compact`.\n- `--lr-confirm-bar-compact-border` (default: `none`) — Border of `[part='base']` while `compact`. Accepts any `border` shorthand.\n- `--lr-confirm-bar-compact-radius` (default: `0`) — Border radius of `[part='base']` while `compact` (only visible once `--lr-confirm-bar-compact-border`/`-background` are set).\n- `--lr-confirm-bar-compact-background` (default: `transparent`) — Background of `[part='base']` while `compact`."
3571
3620
  },
3572
3621
  "attributes": [
3622
+ {
3623
+ "name": "compact",
3624
+ "description": {
3625
+ "kind": "markdown",
3626
+ "value": "Collapses the bar from a full card (bordered, padded, `display: block` surface) to a single\ninline row with no chrome of its own, for a confirmation that has to live inside an existing\ncontainer -- a table cell, a card's action row, a toolbar. The host becomes `inline-flex`, and\nthe narrow-allocation `@container` treatment is switched off (a compact bar is *expected* to\nbe narrow, so stretching the buttons to fill would be exactly wrong). Re-chrome it through the\n`--lr-confirm-bar-compact-*` properties. Everything else -- the event shapes, the\nfocus-to-`[part='status']`-before-unmount contract, `role=\"group\"` and its heading label --\nis unchanged. `false` (the default) renders today's exact card presentation.\n\nType: `boolean` \nDefault: `false`"
3627
+ }
3628
+ },
3573
3629
  {
3574
3630
  "name": "decision",
3575
3631
  "description": {
@@ -3745,7 +3801,7 @@
3745
3801
  "name": "lr-conversation-item",
3746
3802
  "description": {
3747
3803
  "kind": "markdown",
3748
- "value": "`<lr-conversation-item>` — a selectable row representing one chat\nsession in a history sidebar list. Usable standalone or as the\n`renderItem()` payload of a sibling virtualized-list component; this\nmodule has no dependency on that (or any) other component.\n\nTakes `title`/`excerpt`/`timestamp` as individual primitive props rather\nthan one opaque bound object, deliberately consistent with how\n`<lr-chat-message>` takes individual props instead of a single\n`.message` blob -- every other component in this family follows that\nshape, so this one does too even though a single bound `.session` object\nwould also have been a reasonable design.\n\nIdentifying *which* session a `lr-select` click/keypress was about: this\nreuses the platform's own `id` attribute (every element already has one)\nrather than inventing a second, differently-named id-carrying prop --\nconsumers already have the event's `target`/`currentTarget` (and thus\n`.id`), the same reasoning `<lr-attachment-chip>` documents for its own\nidentically-shaped choice. `lr-select` therefore carries no detail\npayload at all.\n\n`role=\"button\"` on `[part=\"option\"]` so the item has valid semantics both\nstandalone and when placed in a larger history-list layout. A conversation\nrow activates one current session; it is not itself a listbox option and\ntherefore does not require a particular owner role.\n\n`role=\"button\"` forbids focusable\ndescendants -- verified against axe-core's `nested-interactive` rule,\nwhich flags it. That's why the rename button and the `actions` slot are\nrendered as DOM *siblings* of `[part=\"option\"]` (both inside\n`[part=\"base\"]`) rather than nested inside it: `[part=\"option\"]` only ever\ncontains plain text/`<time>` content. The in-place rename `<input>` is the\nsame problem one level deeper -- it replaces the title *inside*\n`[part=\"option\"]` while renaming -- so `[part=\"option\"]` sheds its\n`role`/`tabindex`/`aria-current`/`aria-label` entirely for the duration\nof an edit. A row mid-edit is a text field, so suspending the button\nsemantics is also the more accurate\ndescription of what's on screen.\n\nInline rename is a dedicated pencil/edit icon button (not a double-click\non the title) -- double-click has no keyboard/screen-reader equivalent\nand would silently swallow the row's own single-click `lr-select`,\nwhereas a button is independently focusable, has its own accessible name,\nand composes cleanly with click-to-select.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `actions` | Overflow/icon-button controls (for example a pin/delete button or a `lr-menu` trigger) rendered at the trailing edge of the row. |\n| `content` | Replaces the built-in title, excerpt, and meta content area with host-supplied non-interactive row content. |\n| `excerpt` | Full override of the excerpt presentation (e.g. a search-hit snippet with `<mark>` highlighting). Wins over the `excerpt` property whenever it has assigned content, even if `excerpt` is also set. Only non-focusable content should be slotted here — see the `excerpt` property's own doc for why. |\n| `leading` | Non-interactive leading content such as an avatar, purpose icon, or status indicator. It is rendered inside the selectable region before the title/excerpt content. |\n| `meta` | Small, non-focusable structured fields for the row (e.g. a day label, cost, request count) rendered below the title/excerpt. Entirely app-supplied; this component computes none of it. Only non-focusable content should be slotted here, for the same `nested-interactive` reason as `excerpt`. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The wrapper around the `actions` slot. |\n| `base` | The outer row wrapper (plain, no ARIA role) laying out `[part=\"option\"]`, the rename button, and `actions`. |\n| `content` | Wrapper around the title and excerpt. |\n| `excerpt` | The last-message preview snippet. Only rendered when `excerpt` is non-empty. |\n| `leading` | The wrapper around the `leading` slot, inside `option`. Always rendered, but `hidden` while that slot is empty. |\n| `meta` | The wrapper around the `meta` slot. Only rendered in the built-in content path (not when the `content` slot is used), and `hidden` while the `meta` slot is empty. |\n| `option` | The selectable region (`role=\"button\"`, removed while renaming -- see the class doc). Wraps `content` and `timestamp`. |\n| `rename-button` | The pencil/edit affordance that starts a rename (only rendered while `editable` and not already renaming). |\n| `timestamp` | The formatted `timestamp`, rendered in a `<time>` element. Only rendered when `timestamp` is set and valid. |\n| `title` | The title text, shown while not renaming. |\n| `title-input` | The in-place rename `<input>`, shown only while renaming. |"
3804
+ "value": "`<lr-conversation-item>` — a selectable row representing one chat\nsession in a history sidebar list. Usable standalone or as the\n`renderItem()` payload of a sibling virtualized-list component; this\nmodule has no dependency on that (or any) other component.\n\nTakes `title`/`excerpt`/`timestamp` as individual primitive props rather\nthan one opaque bound object, deliberately consistent with how\n`<lr-chat-message>` takes individual props instead of a single\n`.message` blob -- every other component in this family follows that\nshape, so this one does too even though a single bound `.session` object\nwould also have been a reasonable design.\n\nIdentifying *which* session a `lr-select` click/keypress was about: this\nreuses the platform's own `id` attribute (every element already has one)\nrather than inventing a second, differently-named id-carrying prop --\nconsumers already have the event's `target`/`currentTarget` (and thus\n`.id`), the same reasoning `<lr-attachment-chip>` documents for its own\nidentically-shaped choice. `lr-select` therefore carries no detail\npayload at all.\n\n`role=\"button\"` on `[part=\"option\"]` so the item has valid semantics both\nstandalone and when placed in a larger history-list layout. A conversation\nrow activates one current session; it is not itself a listbox option and\ntherefore does not require a particular owner role.\n\n`role=\"button\"` forbids focusable\ndescendants -- verified against axe-core's `nested-interactive` rule,\nwhich flags it. That's why the rename button and the `actions` slot are\nrendered as DOM *siblings* of `[part=\"option\"]` (both inside\n`[part=\"base\"]`) rather than nested inside it: `[part=\"option\"]` only ever\ncontains plain text/`<time>` content. The in-place rename `<input>` is the\nsame problem one level deeper -- it replaces the title *inside*\n`[part=\"option\"]` while renaming -- so `[part=\"option\"]` sheds its\n`role`/`tabindex`/`aria-current`/`aria-label` entirely for the duration\nof an edit. A row mid-edit is a text field, so suspending the button\nsemantics is also the more accurate\ndescription of what's on screen.\n\nInline rename is a dedicated pencil/edit icon button (not a double-click\non the title) -- double-click has no keyboard/screen-reader equivalent\nand would silently swallow the row's own single-click `lr-select`,\nwhereas a button is independently focusable, has its own accessible name,\nand composes cleanly with click-to-select.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `actions` | Overflow/icon-button controls (for example a pin/delete button or a `lr-menu` trigger) rendered at the trailing edge of the row. |\n| `content` | Replaces the built-in title, excerpt, and meta content area with host-supplied non-interactive row content. |\n| `excerpt` | Full override of the excerpt presentation (e.g. a search-hit snippet with `<mark>` highlighting). Wins over the `excerpt` property whenever it has assigned content, even if `excerpt` is also set. Only non-focusable content should be slotted here — see the `excerpt` property's own doc for why. |\n| `leading` | Non-interactive leading content such as an avatar, purpose icon, or status indicator. It is rendered inside the selectable region before the title/excerpt content. |\n| `meta` | Small, non-focusable structured fields for the row (e.g. a day label, cost, request count) rendered below the title/excerpt. Entirely app-supplied; this component computes none of it. Only non-focusable content should be slotted here, for the same `nested-interactive` reason as `excerpt`. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The wrapper around the `actions` slot. |\n| `base` | The outer row wrapper (plain, no ARIA role) laying out `[part=\"option\"]`, the rename button, and `actions`. |\n| `content` | Wrapper around the title and excerpt. |\n| `excerpt` | The last-message preview snippet. Only rendered when `excerpt` is non-empty. |\n| `leading` | The wrapper around the `leading` slot, inside `option`. Always rendered, but `hidden` while that slot is empty. |\n| `meta` | The wrapper around the `meta` slot. Only rendered in the built-in content path (not when the `content` slot is used), and `hidden` while the `meta` slot is empty. |\n| `option` | The selectable region (`role=\"button\"`, removed while renaming -- see the class doc). Wraps `content` and `timestamp`. |\n| `rename-button` | The pencil/edit affordance that starts a rename (only rendered while `editable` and not already renaming). |\n| `timestamp` | The formatted `timestamp`, rendered in a `<time>` element. Only rendered when `timestamp` is set and valid. |\n| `title` | The title text, shown while not renaming. |\n| `title-input` | The in-place rename `<input>`, shown only while renaming. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-conversation-item-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the row while `active`. **Contrast-sensitive:** it is one half of a documented WCAG-AA pair — the active row's text is sized/toned for this background, so an override has to keep at least a 4.5:1 ratio against `--lr-conversation-item-active-color` (excerpt/timestamp) and against `--lr-color-text` (the title, which is not restyled by the pair).\n- `--lr-conversation-item-active-color` (default: `var(--lr-color-text)`) — Text color of `[part=\"excerpt\"]` and `[part=\"timestamp\"]` while `active`. **Contrast-sensitive:** it exists precisely because `--lr-color-text-quiet` only reaches ~4.25:1 against the active background; override it together with `--lr-conversation-item-active-bg`, never alone.\n- `--lr-conversation-item-compact-padding` (default: `var(--lr-space-xs) var(--lr-space-s)`) — `[part=\"base\"]` padding while `compact`.\n- `--lr-conversation-item-compact-gap` (default: `var(--lr-space-2xs)`) — Gap between `[part=\"base\"]`'s columns while `compact`."
3749
3805
  },
3750
3806
  "attributes": [
3751
3807
  {
@@ -3769,6 +3825,13 @@
3769
3825
  "value": "Forwarded to the in-place rename `<input>`'s own `autocorrect` (Safari/WebKit-specific).\nEmpty string omits the attribute (browser default). Named `autoCorrect` to avoid\n`HTMLElement.autocorrect`'s incompatible DOM typing -- mirrors `<lr-textarea>`'s identical\nchoice.\n\nType: `string` \nDefault: `''`"
3770
3826
  }
3771
3827
  },
3828
+ {
3829
+ "name": "compact",
3830
+ "description": {
3831
+ "kind": "markdown",
3832
+ "value": "Tighter row padding and gaps, for the dense history sidebars these rows usually render in --\nsame convention as `lr-empty`'s `compact`. Defaults to `false`, i.e. the full row padding.\nPurely a density knob: it tightens `[part=\"base\"]`'s padding and gap and collapses\n`[part=\"content\"]`'s inter-line gap, and changes nothing else. In particular it does **not**\nshrink `[part=\"rename-button\"]` below the shared `--lr-icon-button-size` target floor, hide the\nexcerpt (bind `excerpt`/the `excerpt` slot per row for that), or reduce the excerpt/timestamp\nfont sizes -- so a row with a rename button or slotted `actions` still floors at roughly that\nicon size plus the compact padding.\n\nType: `boolean` \nDefault: `false`"
3833
+ }
3834
+ },
3772
3835
  {
3773
3836
  "name": "editable",
3774
3837
  "description": {
@@ -3854,7 +3917,7 @@
3854
3917
  "name": "lr-csv-viewer",
3855
3918
  "description": {
3856
3919
  "kind": "markdown",
3857
- "value": "Fetches CSV text, parses quoted fields with PapaParse, and virtualizes its rows.\n\nAdopts `DocumentAnchorTarget`: a `cell-range` anchor addresses the raw file grid, 1-based, with\nthe header row included whenever `has-header-row` is set (matching how a spreadsheet app itself\nlabels `A1`) -- `scrollToAnchor()` scrolls the addressed row into view via the virtualized list's\n`active-id`, then scrolls the first addressed column horizontally into view. A `sheet`-qualified\nanchor never resolves here -- this viewer has no sheets. `highlights` paint as a focusable\n`part=\"cell-highlight\"` on membership, recomputed per row inside `renderRow()` so a row scrolled\nout and back in reconstructs its highlight for free, with no persistent DOM to keep in sync.\n`search()` is a case-insensitive substring match over the same stringified cell values `cell()`\nalready renders, ordered row then column.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `cell` | One rendered cell. |\n| `cell-highlight` | A cell covered by a `highlights` entry -- focusable, emits `lr-highlight-activate` on click or Enter/Space. |\n| `data-row` | One virtualized data row. |\n| `error` | The error message region. |\n| `header-row` | The sticky header row, rendered while `has-header-row` is set. |\n| `rows` | The virtualized row list. |\n| `sheet` | The wrapper around the header row and virtualized body. |\n| `spinner` | The loading status region. |"
3920
+ "value": "Fetches CSV text, parses quoted fields with PapaParse, and virtualizes its rows.\n\nAdopts `DocumentAnchorTarget`: a `cell-range` anchor addresses the raw file grid, 1-based, with\nthe header row included whenever `has-header-row` is set (matching how a spreadsheet app itself\nlabels `A1`) -- `scrollToAnchor()` scrolls the addressed row into view via the virtualized list's\n`active-id`, then scrolls the first addressed column horizontally into view. A `sheet`-qualified\nanchor never resolves here -- this viewer has no sheets. `highlights` paint as a focusable\n`part=\"cell-highlight\"` on membership, recomputed per row inside `renderRow()` so a row scrolled\nout and back in reconstructs its highlight for free, with no persistent DOM to keep in sync.\n`search()` is a case-insensitive substring match over the same stringified cell values `cell()`\nalready renders, ordered row then column.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `body` | The scrollable wrapper around the fetched-state content, capped by `max-height`. |\n| `cell` | One rendered cell. |\n| `cell-highlight` | A cell covered by a `highlights` entry -- focusable, emits `lr-highlight-activate` on click or Enter/Space. |\n| `data-row` | One virtualized data row. |\n| `error` | The error message region. |\n| `header-row` | The sticky header row, rendered while `has-header-row` is set. |\n| `rows` | The virtualized row list. |\n| `sheet` | The wrapper around the header row and virtualized body. |\n| `spinner` | The loading status region. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-csv-viewer-highlight-color` (default: `var(--lr-color-brand)`) — Outline color of a highlighted cell. The active highlight sets it inline to `var(--lr-color-warning, var(--lr-color-brand))`.\n- `--lr-csv-viewer-max-height` (default: `none`) — Maximum block size of `[part=\"body\"]` before it scrolls internally. The `maxHeight` property sets this token inline on `[part=\"base\"]`."
3858
3921
  },
3859
3922
  "attributes": [
3860
3923
  {
@@ -3871,6 +3934,13 @@
3871
3934
  "value": "Optional locale override. Otherwise the nearest `locale`/`lang` ancestor is used.\n\nType: `string` \nDefault: `''`"
3872
3935
  }
3873
3936
  },
3937
+ {
3938
+ "name": "max-height",
3939
+ "description": {
3940
+ "kind": "markdown",
3941
+ "value": "CSS length that caps the scrollable body.\n\nType: `string` \nDefault: `''`"
3942
+ }
3943
+ },
3874
3944
  {
3875
3945
  "name": "name",
3876
3946
  "description": {
@@ -3963,7 +4033,7 @@
3963
4033
  "name": "lr-data-grid",
3964
4034
  "description": {
3965
4035
  "kind": "markdown",
3966
- "value": "`<lr-data-grid>` — keyboard-navigable, responsive data grid with sortable columns.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `cell` | Body cell. |\n| `empty` | The single full-width cell rendered in place of body rows while `loading`, or when `rows` is empty. |\n| `grid` | Native table grid. |\n| `header` | Header cell. |\n| `row` | Body row. |\n| `viewport` | Scrollable grid viewport. |"
4036
+ "value": "`<lr-data-grid>` — keyboard-navigable, responsive data grid with sortable columns.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `cell` | Body cell. |\n| `empty` | The single full-width cell rendered in place of body rows while `loading`, or when `rows` is empty. |\n| `grid` | Native table grid. |\n| `header` | Header cell. |\n| `row` | Body row. |\n| `viewport` | Scrollable grid viewport. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-data-grid-row-selected-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the selected row's cells. Shadow Parts forbids an attribute selector after `::part()`, so `::part(row)[aria-selected]` is invalid CSS and the selected row could otherwise only be restyled by hijacking the library-wide `--lr-color-brand-quiet` token."
3967
4037
  },
3968
4038
  "attributes": [
3969
4039
  {
@@ -4000,7 +4070,7 @@
4000
4070
  "name": "lr-dataset-viewer",
4001
4071
  "description": {
4002
4072
  "kind": "markdown",
4003
- "value": "Fetches delimited text and renders a virtualized, accessible data table: a `role=\"table\"`\ncontainer with a sticky `role=\"row\"` header, composed with `<lr-virtual-list item-role=\"row\">`\nfor the body so files far larger than a real synchronous `<table>` can render without locking the\nmain thread.\n\nAdopts `DocumentAnchorTarget`: a `cell-range` anchor addresses the raw file grid, 1-based, with\nthe header row always occupying row 1 (this component always parses with PapaParse's `header:\ntrue`, so the first row is never part of the virtualized body) -- `scrollToAnchor()` scrolls the\naddressed row into view via the virtualized list's `active-id`. A `sheet`-qualified anchor never\nresolves here -- this viewer has no sheets. `highlights` paint as a `part=\"cell-highlight\"` cell\nwrapping a focusable `part=\"cell-highlight-action\"` native button (keeping the ARIA table tree\nintact) on membership, recomputed per row inside `renderRow()` so a row scrolled out and back\nin reconstructs its highlight for free, with no persistent DOM to keep in sync. `search()` is a\ncase-insensitive substring match over every body cell's raw string value, ordered row then column.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `body` | The scrollable body wrapper. |\n| `cell` | One rendered cell (`role=\"cell\"`). |\n| `cell-highlight` | A cell (`role=\"cell\"`) covered by a `highlights` entry; wraps the `cell-highlight-action` button. |\n| `cell-highlight-action` | The native button filling a highlighted cell -- focusable, emits `lr-highlight-activate` on click or Enter/Space. |\n| `data-row` | One virtualized data row. |\n| `error` | The error message region. |\n| `header-cell` | A header cell (`role=\"columnheader\"`). |\n| `header-row` | The sticky header row (`role=\"row\"`). |\n| `spinner` | The loading status region. |\n| `table` | The `role=\"table\"` container (accessible name via `aria-label`). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-dataset-viewer-max-height` (default: `none`) — Maximum block size of `[part=\"body\"]` before it scrolls internally. The `maxHeight` property sets this token inline on `[part=\"base\"]`.\n- `--lr-dataset-viewer-highlight-color` (default: `var(--lr-color-brand)`) — Outline color of a highlighted cell. The active highlight sets it inline to `var(--lr-color-warning, var(--lr-color-brand))`."
4073
+ "value": "Fetches delimited text and renders a virtualized, accessible data table: a `role=\"table\"`\ncontainer with a sticky `role=\"row\"` header, composed with `<lr-virtual-list item-role=\"row\">`\nfor the body so files far larger than a real synchronous `<table>` can render without locking the\nmain thread.\n\nAdopts `DocumentAnchorTarget`: a `cell-range` anchor addresses the raw file grid, 1-based, with\nthe header row always occupying row 1 (this component always parses with PapaParse's `header:\ntrue`, so the first row is never part of the virtualized body) -- `scrollToAnchor()` scrolls the\naddressed row into view via the virtualized list's `active-id`. A `sheet`-qualified anchor never\nresolves here -- this viewer has no sheets. `highlights` paint as a `part=\"cell-highlight\"` cell\nwrapping a focusable `part=\"cell-highlight-action\"` native button (keeping the ARIA table tree\nintact) on membership, recomputed per row inside `renderRow()` so a row scrolled out and back\nin reconstructs its highlight for free, with no persistent DOM to keep in sync. `search()` is a\ncase-insensitive substring match over every body cell's raw string value, ordered row then column.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `body` | The scrollable body wrapper. |\n| `cell` | One rendered cell (`role=\"cell\"`). |\n| `cell-highlight` | A cell (`role=\"cell\"`) covered by a `highlights` entry; wraps the `cell-highlight-action` button. |\n| `cell-highlight-action` | The native button filling a highlighted cell -- focusable, emits `lr-highlight-activate` on click or Enter/Space. |\n| `data-row` | One virtualized data row. |\n| `error` | The error message region. |\n| `header-cell` | A header cell (`role=\"columnheader\"`). |\n| `header-row` | The sticky header row (`role=\"row\"`). |\n| `spinner` | The loading status region. |\n| `table` | The `role=\"table\"` container. Its accessible name is `name` when set, otherwise a host `aria-label`, otherwise a localized row-count caption. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-dataset-viewer-max-height` (default: `none`) — Maximum block size of `[part=\"body\"]` before it scrolls internally. The `maxHeight` property sets this token inline on `[part=\"base\"]`.\n- `--lr-dataset-viewer-highlight-color` (default: `var(--lr-color-brand)`) — Outline color of a highlighted cell. The active highlight sets it inline to `var(--lr-color-warning, var(--lr-color-brand))`."
4004
4074
  },
4005
4075
  "attributes": [
4006
4076
  {
@@ -4021,7 +4091,7 @@
4021
4091
  "name": "name",
4022
4092
  "description": {
4023
4093
  "kind": "markdown",
4024
- "value": "Display name used for the table's accessible name.\n\nType: `string` \nDefault: `''`"
4094
+ "value": "Display name used for the table's accessible name, taking precedence over a host\n`aria-label`.\n\nType: `string` \nDefault: `''`"
4025
4095
  }
4026
4096
  },
4027
4097
  {
@@ -4037,7 +4107,7 @@
4037
4107
  "name": "lr-date-input",
4038
4108
  "description": {
4039
4109
  "kind": "markdown",
4040
- "value": "`<lr-date-input>` — a date field with an attached calendar popover.\nMirrors the core `<wa-date-input>` API under `lr-`. Value is ISO 8601\n(`YYYY-MM-DD`, or `YYYY-MM-DD/YYYY-MM-DD` in range mode). Form-associated.\n\nThis component uses a single text field; typing accepts ISO or a\nlocale-parseable date.\n\n`size` uses the same `2xs`–`xl` scale as `lr-input`/`lr-select`/`lr-combobox`'s own `size`,\ndefault `m`. The calendar-toggle and clear buttons keep a constant touch-target size at every\ntier (mirroring `lr-input`'s own password-toggle button), so only the field's density scales.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `clear-button` | The clear control. |\n| `date-picker` | The nested date picker. |\n| `error` | The validation message. |\n| `expand-button` | The calendar popup toggle. |\n| `expand-icon` | The calendar icon. |\n| `form-control` | The outer form-control wrapper. |\n| `form-control-label` | The label wrapper. |\n| `hint` | The hint message. |\n| `input` | The text input. |\n| `input-wrapper` | The input and button wrapper. |\n| `popup` | The positioned calendar popup. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-date-input-padding-block` (default: `var(--lr-space-xs)`) — Block padding of the input row, scaled by `size`.\n- `--lr-date-input-padding-inline` (default: `var(--lr-space-s)`) — Inline padding of the input row, scaled by `size`.\n- `--lr-date-input-font-size` (default: `inherit`) — Font size of the text input, scaled by `size`."
4110
+ "value": "`<lr-date-input>` — a date field with an attached calendar popover.\nMirrors the core `<wa-date-input>` API under `lr-`. Value is ISO 8601\n(`YYYY-MM-DD`, or `YYYY-MM-DD/YYYY-MM-DD` in range mode). Form-associated.\n\nThis component uses a single text field; typing accepts ISO or a\nlocale-parseable date.\n\n`size` uses the same `2xs`–`xl` scale as `lr-input`/`lr-select`/`lr-combobox`'s own `size`,\ndefault `m`. The calendar-toggle and clear buttons keep a constant touch-target size at every\ntier (mirroring `lr-input`'s own password-toggle button), so only the field's density scales.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `end` | Adornment after the text field and the built-in clear action, and before the calendar toggle — so consumer content never sits outboard of the calendar button. |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n| `start` | Adornment at the inline-start of the input row, before the text field. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `clear-button` | The clear control. |\n| `date-picker` | The nested date picker. |\n| `end` | Wrapper around the `end` adornment slot; `hidden` while nothing is slotted. |\n| `error` | The validation message. |\n| `expand-button` | The calendar popup toggle. |\n| `expand-icon` | The calendar icon. |\n| `form-control` | The outer form-control wrapper. |\n| `form-control-label` | The label wrapper. |\n| `hint` | The hint message. |\n| `input` | The text input. |\n| `input-wrapper` | The input and button wrapper. |\n| `popup` | The positioned calendar popup. |\n| `start` | Wrapper around the `start` adornment slot; `hidden` while nothing is slotted. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-date-input-padding-block` (default: `var(--lr-space-xs)`) — Block padding of the input row, scaled by `size`.\n- `--lr-date-input-padding-inline` (default: `var(--lr-space-s)`) — Inline padding of the input row, scaled by `size`.\n- `--lr-date-input-font-size` (default: `inherit`) — Font size of the text input, scaled by `size`.\n- `--lr-date-input-control-min-height` (default: `var(--lr-size-2-5rem)`) — Minimum block size of the input row, scaled by `size` to mirror `lr-input`'s own min-height scale. Each default sits below the row's transitively-pinned height, so it is dead until a consumer raises it -- the unset render is unchanged.\n- `--lr-date-input-control-height` — Exact block size of the input row. Undeclared by default, so the row grows to fit its content (floored by `--lr-date-input-control-min-height`). Set it to pin a fixed height; the calendar toggle keeps its own 24x24 touch target even when this pins a shorter row."
4041
4111
  },
4042
4112
  "attributes": [
4043
4113
  {
@@ -4734,7 +4804,7 @@
4734
4804
  "name": "lr-document-preview",
4735
4805
  "description": {
4736
4806
  "kind": "markdown",
4737
- "value": "`<lr-document-preview>` — a format-dispatching viewer for one document/\nattachment, plus the visual state machine for an async server-side\nconversion a host app runs in front of it.\n\nFormat dispatch is intentionally minimal (see this family's scope\nguidance): only `text/*`/`application/json` (plain, scrollable `<pre>` —\nno syntax highlighting; compose `<lr-code-block>` yourself via the\n`unsupported` slot for that) and `image/*` (a contained `<img>`) render\ninline. Everything else — PDF, office documents, video, audio, or any\nunrecognized MIME type — falls back to a generic \"can't preview this\"\nstate: a file glyph, a short message, and (when `src` is set) a native\n`<a download>` link. This is a deliberate ceiling, not a gap: this\ncomponent ships a dispatch *shell*, not a format registry. The\n`unsupported` slot is the escape hatch for every format left out of the\nbuilt-in three — plug in a PDF.js viewer, an office-doc renderer, a\n`<lr-code-block>`, or anything else keyed off `mime-type` yourself.\n\n`status=\"converting\"` is a second, independent axis from format dispatch.\nThis component does not know your backend's conversion API shape and\ntherefore owns none of the actual polling/fetch — a host that's converting\na non-natively-previewable format server-side (e.g. .docx → .pdf) polls\nits own backend and updates `status`/`progress`/`src` here as that\nproceeds. This component only *visualizes* that state: an indeterminate\nspinner, or a determinate one once `progress` is supplied. Once the host\nflips `status` to `\"ready\"` (typically alongside a new `src`/`mime-type`\npointing at the converted artifact), normal format dispatch resumes.\n\nThe one piece of async work this component *does* own is fetching a\n`text/*`/`application/json` `src` itself (there's no other way to get a\n`<pre>`'s text content from a URL) — gated behind the same generation-\ncounter guard `<lr-tool-result-view>`'s `resolve()` uses, plus an\n`AbortController`, so a `src` reassigned mid-fetch cancels the obsolete\nrequest and can't have a stale response clobber a newer one. A\nfailure here (network error, non-2xx response) renders inline via\n`[part=\"error\"]` and fires `lr-render-error`, independently of the\nhost-owned `status` prop — mirrors `<lr-markdown>`'s identical stance\nthat a *rendering* failure and a host's own state machine are different\nconcerns.\n\nEvery `src` is validated for the DOM/API sink that consumes it. Text\nfetches and image sources allow relative URLs plus `http:`, `https:`,\n`blob:`, and `data:`. Download links deliberately exclude `data:` because\nfollowing a `data:text/html` URL can create an active document. Unsafe or\nmalformed URLs never reach `fetch()`, an image `src`, or an anchor `href`;\nthey render a non-interactive fallback/error instead.\n\nAccessibility: the `\"converting\"` state (no numeric `progress`) is a\n`role=\"status\"` region wrapping a visually-hidden \"Converting document…\"\nstring. This is a *plain* static region, not routed through\n`<lr-live-region>`/`Announcer` — like `<lr-typing-indicator>`'s\nidentical judgement call (see that component's class doc), this only ever\nhas one thing to announce (entering the state), not a rapidly-repeating\nstream of updates, so the coalescing machinery a high-frequency component\nneeds would be pure overhead here. Once real `progress` is available, the\nregion becomes a standard `role=\"progressbar\"` instead, which is\nself-describing via `aria-valuenow` with no extra live-region wiring\nneeded. `status=\"error\"` renders `[part=\"error\"]` as `role=\"alert\"` — an\nassertive, one-shot failure notice, the same native-role shortcut\n`<lr-live-region>`'s own `mode=\"assertive\"` maps to, without requiring\nthe announcer machinery here either.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `unsupported` | Escape hatch: when populated, its content renders *instead of* the generic download fallback for any `mime-type` this component doesn't natively support (i.e. whenever format dispatch would otherwise fall through to \"generic\"). Ignored while `mime-type` resolves to `text`/`image` dispatch, or while `status` is `\"converting\"`/`\"error\"`. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root container. |\n| `body` | The wrapper around whichever content is currently showing (text/image preview, the generic fallback, the spinner, or the error message). |\n| `download-link` | The `<a download>` affordance in the generic fallback. Only rendered when `src` is set and safe for link navigation. |\n| `error` | The error message region (`role=\"alert\"`) — used both for `status=\"error\"` and for a failed text fetch. |\n| `filename` | The filename text. |\n| `frame-content` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable` (image format only). |\n| `frame-controls` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable` (image format only). |\n| `frame-reset` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable` (image format only). |\n| `frame-viewport` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable` (image format only). |\n| `frame-zoom-in` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable` (image format only). |\n| `frame-zoom-out` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable` (image format only). |\n| `header` | The row above the body, holding `filename`. Hidden entirely when `filename` is unset. |\n| `highlight-layer` | The wrapper around every rendered region highlight (image format only). |\n| `region-highlight` | One region highlight (`data-tone`, `data-active`) (image format only). |\n| `spinner` | The converting/loading indicator — indeterminate (`role=\"status\"`) or, once numeric progress is known, a determinate `role=\"progressbar\"`. Used both for `status=\"converting\"` and for this component's own in-flight text fetch. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-document-preview-max-height` (default: `none`) — Maximum body block size before the preview scrolls internally.\n- `--lr-document-preview-font` (default: `var(--lr-font-mono)`) — Font used for plain-text previews.\n- `--lr-document-preview-spin-duration` (default: `0.8s`) — Duration of one indeterminate loading-indicator rotation.\n- `--lr-document-preview-progress` (default: `0`) — Unitless 0-100 completion of the determinate loading ring (multiplied by `1%` in its conic gradient). Written inline by the component from the clamped `progress` value, so it is a read-out rather than a consumer knob."
4807
+ "value": "`<lr-document-preview>` — a format-dispatching viewer for one document/\nattachment, plus the visual state machine for an async server-side\nconversion a host app runs in front of it.\n\nFormat dispatch is intentionally minimal (see this family's scope\nguidance): only `text/*`/`application/json` (plain, scrollable `<pre>` —\nno syntax highlighting; compose `<lr-code-block>` yourself via the\n`unsupported` slot for that) and `image/*` (a contained `<img>`) render\ninline. Everything else — PDF, office documents, video, audio, or any\nunrecognized MIME type — falls back to a generic \"can't preview this\"\nstate: a file glyph, a short message, and (when `src` is set) a native\n`<a download>` link. This is a deliberate ceiling, not a gap: this\ncomponent ships a dispatch *shell*, not a format registry. The\n`unsupported` slot is the escape hatch for every format left out of the\nbuilt-in three — plug in a PDF.js viewer, an office-doc renderer, a\n`<lr-code-block>`, or anything else keyed off `mime-type` yourself.\n\n`status=\"converting\"` is a second, independent axis from format dispatch.\nThis component does not know your backend's conversion API shape and\ntherefore owns none of the actual polling/fetch — a host that's converting\na non-natively-previewable format server-side (e.g. .docx → .pdf) polls\nits own backend and updates `status`/`progress`/`src` here as that\nproceeds. This component only *visualizes* that state: an indeterminate\nspinner, or a determinate one once `progress` is supplied. Once the host\nflips `status` to `\"ready\"` (typically alongside a new `src`/`mime-type`\npointing at the converted artifact), normal format dispatch resumes.\n\nThe one piece of async work this component *does* own is fetching a\n`text/*`/`application/json` `src` itself (there's no other way to get a\n`<pre>`'s text content from a URL) — gated behind the same generation-\ncounter guard `<lr-tool-result-view>`'s `resolve()` uses, plus an\n`AbortController`, so a `src` reassigned mid-fetch cancels the obsolete\nrequest and can't have a stale response clobber a newer one. A\nfailure here (network error, non-2xx response) renders inline via\n`[part=\"error\"]` and fires `lr-render-error`, independently of the\nhost-owned `status` prop — mirrors `<lr-markdown>`'s identical stance\nthat a *rendering* failure and a host's own state machine are different\nconcerns.\n\nEvery `src` is validated for the DOM/API sink that consumes it. Text\nfetches and image sources allow relative URLs plus `http:`, `https:`,\n`blob:`, and `data:`. Download links deliberately exclude `data:` because\nfollowing a `data:text/html` URL can create an active document. Unsafe or\nmalformed URLs never reach `fetch()`, an image `src`, or an anchor `href`;\nthey render a non-interactive fallback/error instead.\n\nAccessibility: the `\"converting\"` state (no numeric `progress`) is a\n`role=\"status\"` region wrapping a visually-hidden \"Converting document…\"\nstring. This is a *plain* static region, not routed through\n`<lr-live-region>`/`Announcer` — like `<lr-typing-indicator>`'s\nidentical judgement call (see that component's class doc), this only ever\nhas one thing to announce (entering the state), not a rapidly-repeating\nstream of updates, so the coalescing machinery a high-frequency component\nneeds would be pure overhead here. Once real `progress` is available, the\nregion becomes a standard `role=\"progressbar\"` instead, which is\nself-describing via `aria-valuenow` with no extra live-region wiring\nneeded. `status=\"error\"` renders `[part=\"error\"]` as `role=\"alert\"` — an\nassertive, one-shot failure notice, the same native-role shortcut\n`<lr-live-region>`'s own `mode=\"assertive\"` maps to, without requiring\nthe announcer machinery here either.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `unsupported` | Escape hatch: when populated, its content renders *instead of* the generic download fallback for any `mime-type` this component doesn't natively support (i.e. whenever format dispatch would otherwise fall through to \"generic\"). Ignored while `mime-type` resolves to `text`/`image` dispatch, or while `status` is `\"converting\"`/`\"error\"`. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root container. |\n| `body` | The wrapper around whichever content is currently showing (text/image preview, the generic fallback, the spinner, or the error message). |\n| `download-link` | The `<a download>` affordance in the generic fallback. Only rendered when `src` is set and safe for link navigation. |\n| `error` | The error message region (`role=\"alert\"`) — used both for `status=\"error\"` and for a failed text fetch. |\n| `filename` | The filename text. |\n| `frame-content` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable` (image format only). |\n| `frame-controls` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable` (image format only). |\n| `frame-reset` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable` (image format only). |\n| `frame-viewport` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable` (image format only). |\n| `frame-zoom-in` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable` (image format only). |\n| `frame-zoom-out` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable` (image format only). |\n| `header` | The row above the body, holding `filename`. Hidden entirely when `filename` is unset. |\n| `highlight-layer` | The wrapper around every rendered region highlight (image format only). |\n| `region-highlight` | One region highlight (`data-tone`, `data-active`) (image format only). |\n| `spinner` | The converting/loading indicator — indeterminate (`role=\"status\"`) or, once numeric progress is known, a determinate `role=\"progressbar\"`. Used both for `status=\"converting\"` and for this component's own in-flight text fetch. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-document-preview-max-height` (default: `none`) — Maximum body block size before the preview scrolls internally.\n- `--lr-document-preview-font` (default: `var(--lr-font-mono)`) — Font used for plain-text previews.\n- `--lr-document-preview-spin-duration` (default: `0.8s`) — Duration of one indeterminate loading-indicator rotation.\n- `--lr-document-preview-progress` (default: `0`) — Unitless 0-100 completion of the determinate loading ring (multiplied by `1%` in its conic gradient). Written inline by the component from the clamped `progress` value, so it is a read-out rather than a consumer knob.\n- `--lr-document-preview-active-border` (default: `var(--lr-color-warning, var(--lr-color-brand))`) — Border color of the `[part=\"region-highlight\"]` matching `activeHighlightId` (image format only). Distinct from the resting highlight border."
4738
4808
  },
4739
4809
  "attributes": [
4740
4810
  {
@@ -4908,7 +4978,7 @@
4908
4978
  "name": "lr-doughnut-chart",
4909
4979
  "description": {
4910
4980
  "kind": "markdown",
4911
- "value": "`<lr-doughnut-chart>` — `<lr-chart>` with `type` locked to `\"doughnut\"`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
4981
+ "value": "`<lr-doughnut-chart>` — `<lr-chart>` with `type` locked to `\"doughnut\"`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `error` | `role=\"alert\"` message shown instead of `canvas` when the optional `chart.js` peer dependency is not installed. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
4912
4982
  },
4913
4983
  "attributes": [
4914
4984
  {
@@ -5285,7 +5355,7 @@
5285
5355
  "name": "lr-email-viewer",
5286
5356
  "description": {
5287
5357
  "kind": "markdown",
5288
- "value": "Parses `.eml` messages with the optional `postal-mime` peer and renders\ntheir HTML body only after DOMPurify sanitization. Plain-text messages remain\nuseful without DOMPurify. Attachment rows are real buttons that emit\n`lr-attachment-open` with the attachment's decoded bytes -- this component itself never\nopens, downloads, or object-URLs the content; a host routes the event into e.g.\n`URL.createObjectURL(new Blob([content], { type: mimeType }))` -> `lr-document-viewer` ->\nrevoke on `lr-close`. `fold-quotes` collapses trailing quoted-reply text/HTML behind a\nlocalized toggle.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `attachment-button` | An attachment's open button. |\n| `attachment-item` | An attachment metadata item. |\n| `attachment-list` | The attachment list. |\n| `attachments` | The attachment region. |\n| `attachments-label` | The localized attachment heading. |\n| `base` | The root container. |\n| `body` | The scrollable message body. |\n| `body-html` | The sanitized HTML body. |\n| `body-text` | The plain-text body. |\n| `date` | The message date. |\n| `date-label` | The localized date label. |\n| `error` | The error region. |\n| `from` | The sender address. |\n| `from-label` | The localized sender label. |\n| `headers` | Message metadata. |\n| `quote-toggle` | The show/hide-quoted-text toggle button. |\n| `quoted` | A folded quoted-text block (hidden until expanded). |\n| `spinner` | The loading region. |\n| `subject` | The message subject. |\n| `subject-label` | The localized subject label. |\n| `to` | The recipient addresses. |\n| `to-label` | The localized recipient label. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-email-viewer-max-height` (default: `none`) — Maximum block size of `[part=\"body\"]` before it scrolls internally. The `maxHeight` property sets this token inline on `[part=\"base\"]`."
5358
+ "value": "Parses `.eml` messages with the optional `postal-mime` peer and renders\ntheir HTML body only after DOMPurify sanitization. Plain-text messages remain\nuseful without DOMPurify. Attachment rows are real buttons that emit\n`lr-attachment-open` with the attachment's decoded bytes -- this component itself never\nopens, downloads, or object-URLs the content; a host routes the event into e.g.\n`URL.createObjectURL(new Blob([content], { type: mimeType }))` -> `lr-document-viewer` ->\nrevoke on `lr-close`. `fold-quotes` collapses trailing quoted-reply text/HTML behind a\nlocalized toggle.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `attachment-button` | An attachment's open button. |\n| `attachment-item` | An attachment metadata item. |\n| `attachment-list` | The attachment list. |\n| `attachment-name` | An attachment's filename, inside `attachment-button`. |\n| `attachment-size` | An attachment's formatted file size, inside `attachment-button`. |\n| `attachments` | The attachment region. |\n| `attachments-label` | The localized attachment heading. |\n| `base` | The root container. |\n| `body` | The scrollable message body. |\n| `body-html` | The sanitized HTML body. |\n| `body-text` | The plain-text body. |\n| `date` | The message date. |\n| `date-label` | The localized date label. |\n| `error` | The error region. |\n| `from` | The sender address. |\n| `from-label` | The localized sender label. |\n| `headers` | Message metadata. |\n| `quote-toggle` | The show/hide-quoted-text toggle button. |\n| `quoted` | A folded quoted-text block (hidden until expanded). |\n| `spinner` | The loading region. |\n| `subject` | The message subject. |\n| `subject-label` | The localized subject label. |\n| `to` | The recipient addresses. |\n| `to-label` | The localized recipient label. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-email-viewer-max-height` (default: `none`) — Maximum block size of `[part=\"body\"]` before it scrolls internally. The `maxHeight` property sets this token inline on `[part=\"base\"]`."
5289
5359
  },
5290
5360
  "attributes": [
5291
5361
  {
@@ -5329,7 +5399,7 @@
5329
5399
  "name": "lr-emoji-picker",
5330
5400
  "description": {
5331
5401
  "kind": "markdown",
5332
- "value": "`<lr-emoji-picker>` — a searchable, keyboard-navigable, form-associated emoji picker. In the\nsame \"zero/optional-peer dependency\" spirit as `<lr-lite-chart>`/`<lr-heatmap>`: `groups` is\nfully consumer-suppliable (this component ships no emoji data of its own), with an *optional*\nconvenience auto-loader for a default set — see `emoji-data-loader.ts` and the class doc there for\nexactly what that covers.\n\nKeyboard model: the grid is a roving-tabindex listbox (a single Tab stop — only the active emoji\nis tabbable). Arrow keys move the active option (Left/Right follow reading direction and swap\nunder RTL; Up/Down move by one visual row, measured from the live wrap layout), Home/End jump to\nthe first/last option, and Enter/Space picks. The search input doubles as a `role=\"combobox\"`\nover the same listbox: the arrow keys and Enter also work there while focus stays in the input,\nwith `aria-activedescendant` tracking the active option. Large data sets automatically window\ntheir visible rows so scrolling does not create one button per supplied emoji in the DOM.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `emoji` | Each emoji's own `<button>`; meets the shared minimum tappable size (`--lr-icon-button-size`) without enlarging the rendered emoji glyph itself. |\n| `empty` | The empty-state message, shown when the search matches nothing. |\n| `grid` | The keyboard-navigable emoji grid. |\n| `group-label` | Each group's heading, rendered above its emojis. |\n| `search` | The search/filter `<input>` (`role=\"combobox\"` over the grid). |\n| `virtual-items` | The flex row holding one windowed row's emoji buttons. |\n| `virtual-label` | The `aria-hidden` placeholder that reserves a row's group-label band when that row has no label, keeping every row the same height. Rendered on the windowed path only. |\n| `virtual-row` | One windowed row, absolutely positioned at the `--lr-emoji-picker-row-height` pitch. Rendered on the windowed path only. |\n| `virtual-spacer` | The full-height scroll spacer that gives the grid its scrollbar while only the visible rows exist in the DOM. Rendered on the windowed path only. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-emoji-picker-item-size` (default: `var(--lr-icon-button-size)`) — Each emoji button's box. Clamped up to `--lr-icon-button-size`: a smaller value does not shrink the button.\n- `--lr-emoji-picker-gap` (default: `var(--lr-space-2xs)`) — Gap between emoji within a windowed row.\n- `--lr-emoji-picker-row-height` (default: `calc(var(--lr-emoji-picker-item-size) + var(--lr-space-l))`) — One windowed row's height. Must stay at or above the item size plus the group-label band, or consecutive absolutely-positioned rows overlap."
5402
+ "value": "`<lr-emoji-picker>` — a searchable, keyboard-navigable, form-associated emoji picker. In the\nsame \"zero/optional-peer dependency\" spirit as `<lr-lite-chart>`/`<lr-heatmap>`: `groups` is\nfully consumer-suppliable (this component ships no emoji data of its own), with an *optional*\nconvenience auto-loader for a default set — see `emoji-data-loader.ts` and the class doc there for\nexactly what that covers.\n\nKeyboard model: the grid is a roving-tabindex listbox (a single Tab stop — only the active emoji\nis tabbable). Arrow keys move the active option (Left/Right follow reading direction and swap\nunder RTL; Up/Down move by one visual row, measured from the live wrap layout), Home/End jump to\nthe first/last option, and Enter/Space picks. The search input doubles as a `role=\"combobox\"`\nover the same listbox: the arrow keys and Enter also work there while focus stays in the input,\nwith `aria-activedescendant` tracking the active option. Large data sets automatically window\ntheir visible rows so scrolling does not create one button per supplied emoji in the DOM.\n\nShips the same opt-in `label`/`hint`/`errorText` form-control chrome as `<lr-select>`/\n`<lr-color-picker>` (props + matching named slots + `form-control`/`form-control-label`/`hint`/\n`error` parts) — left unset, the chrome stays hidden. When `label` (or the `label` slot) is set\nand `aria-label`/`accessibleLabel` is not, the grid's accessible name switches from the\nlocalized default to `aria-labelledby` pointing at the visible label, mirroring\n`<lr-checkbox-group>`'s identical `accessibleLabel`-wins-over-`aria-labelledby` precedence.\n\n`disabled` (from the `FormAssociated` mixin) gates every self-rendered interactive\nsub-control — the search input and every emoji button — not just one of them.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The wrapper around the search input and grid. |\n| `emoji` | Each emoji's own `<button>`; meets the shared minimum tappable size (`--lr-icon-button-size`) without enlarging the rendered emoji glyph itself. |\n| `empty` | The empty-state message, shown when the search matches nothing. |\n| `error` | The error message. |\n| `form-control` | The outer wrapper around label, base, error and hint. |\n| `form-control-label` | The visible label. |\n| `grid` | The keyboard-navigable emoji grid. |\n| `group-label` | Each group's heading, rendered above its emojis. |\n| `hint` | The hint message. |\n| `search` | The search/filter `<input>` (`role=\"combobox\"` over the grid). |\n| `virtual-items` | The flex row holding one windowed row's emoji buttons. |\n| `virtual-label` | The `aria-hidden` placeholder that reserves a row's group-label band when that row has no label, keeping every row the same height. Rendered on the windowed path only. |\n| `virtual-row` | One windowed row, absolutely positioned at the `--lr-emoji-picker-row-height` pitch. Rendered on the windowed path only. |\n| `virtual-spacer` | The full-height scroll spacer that gives the grid its scrollbar while only the visible rows exist in the DOM. Rendered on the windowed path only. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-emoji-picker-item-size` (default: `var(--lr-icon-button-size)`) — Each emoji button's box. Clamped up to `--lr-icon-button-size`: a smaller value does not shrink the button.\n- `--lr-emoji-picker-gap` (default: `var(--lr-space-2xs)`) — Gap between emoji within a windowed row.\n- `--lr-emoji-picker-row-height` (default: `calc(var(--lr-emoji-picker-item-size) + var(--lr-space-l))`) — One windowed row's height. Must stay at or above the item size plus the group-label band, or consecutive absolutely-positioned rows overlap.\n- `--lr-emoji-picker-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the keyboard-active (`data-active`) **and** hovered emoji button — the two share a single rule, so this one hook retints both consistently. Declared as an inline `var()` fallback (never on `:host`), so setting it on the element or an ancestor recolors only the emoji highlight without hijacking the library-wide `--lr-color-brand-quiet` token."
5333
5403
  },
5334
5404
  "attributes": [
5335
5405
  {
@@ -5339,6 +5409,27 @@
5339
5409
  "value": "Accessible name forwarded from the host to the internal emoji listbox. Empty falls back to\nthe localized default grid label.\n\nType: `string` \nDefault: `''`"
5340
5410
  }
5341
5411
  },
5412
+ {
5413
+ "name": "error-text",
5414
+ "description": {
5415
+ "kind": "markdown",
5416
+ "value": "Validation-error text rendered below the hint.\n\nType: `string` \nDefault: `''`"
5417
+ }
5418
+ },
5419
+ {
5420
+ "name": "hint",
5421
+ "description": {
5422
+ "kind": "markdown",
5423
+ "value": "Supporting text rendered below the search/grid.\n\nType: `string` \nDefault: `''`"
5424
+ }
5425
+ },
5426
+ {
5427
+ "name": "label",
5428
+ "description": {
5429
+ "kind": "markdown",
5430
+ "value": "Visible label content, rendered above the search/grid. Empty (the default) renders no label\nchrome at all -- see the class doc above for the full label/hint/error contract.\n\nType: `string` \nDefault: `''`"
5431
+ }
5432
+ },
5342
5433
  {
5343
5434
  "name": "locale",
5344
5435
  "description": {
@@ -5352,7 +5443,7 @@
5352
5443
  "name": "lr-empty",
5353
5444
  "description": {
5354
5445
  "kind": "markdown",
5355
- "value": "`<lr-empty>` — a generic empty/no-data state. First-party invention (no\nWeb Awesome equivalent); fills a gap common to dashboard-style apps.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Custom icon or illustration (defaults to none). |\n| `actions` | Buttons/links shown below the description. |\n| `description` | Rich description content (overrides the `description` attribute). |\n| `heading` | Rich heading content (overrides the `heading` attribute). |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The wrapper around the `actions`-slotted content. |\n| `base` | The outer container. |\n| `description` | The description paragraph. |\n| `heading` | The heading paragraph. |\n| `icon` | The wrapper around the default-slotted icon/illustration. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-empty-compact-align` — Cross-axis and text alignment used in compact mode; set to `center` for dense but centered empty states.\n- `--lr-empty-compact-padding` (default: `var(--lr-space-xs)`) — Padding used in compact mode; accepts any padding shorthand (e.g. `8px 2px`)."
5446
+ "value": "`<lr-empty>` — a generic empty/no-data state. First-party invention (no\nWeb Awesome equivalent); fills a gap common to dashboard-style apps.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Custom icon or illustration (defaults to none). |\n| `actions` | Buttons/links shown below the description. |\n| `description` | Rich description content (overrides the `description` attribute). |\n| `heading` | Rich heading content (overrides the `heading` attribute). |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The wrapper around the `actions`-slotted content. |\n| `base` | The outer container. |\n| `description` | The description paragraph. |\n| `heading` | The heading paragraph. |\n| `icon` | The wrapper around the default-slotted icon/illustration. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-empty-compact-align` — Cross-axis and text alignment used in compact mode; set to `center` for dense but centered empty states.\n- `--lr-empty-compact-padding` (default: `var(--lr-space-xs)`) — Padding used in compact mode; accepts any padding shorthand (e.g. `8px 2px`).\n- `--lr-empty-compact-gap` (default: `var(--lr-space-2xs)`) — Gap between the icon, title, and description in compact mode."
5356
5447
  },
5357
5448
  "attributes": [
5358
5449
  {
@@ -5389,9 +5480,16 @@
5389
5480
  "name": "lr-entity-card",
5390
5481
  "description": {
5391
5482
  "kind": "markdown",
5392
- "value": "`<lr-entity-card>` — a dossier card for one `LyraEntity`: type badge, description, key/value\nproperty rows, degree, community chip, plus a built-in \"focus in graph\" action. Never fetches or\nfocuses a graph itself — `lr-entity-activate` is a request a host routes into `lr-graph`'s\n`focusNode(id, { zoom? })`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Extra body content below the property rows (e.g. a `lr-neighbor-list`). |\n| `actions` | Extra header actions alongside the built-in focus button. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The wrapper around the `actions` slot and the built-in focus button. |\n| `base` | The outer bordered container. |\n| `community` | The community-chip row. |\n| `degree` | The relationship-count row. |\n| `description` | The entity's description text. |\n| `empty` | The empty state shown when `entity` is `null`. |\n| `focus-button` | The built-in \"Focus in graph\" button. |\n| `header` | The header row wrapping the type badge, title, and actions. |\n| `properties` | The wrapper around every property/degree/community row. |\n| `property` | One key/value dossier row. |\n| `title` | The entity's label, `role=\"heading\" aria-level=\"3\"` by default. |\n| `type-badge` | The resolved entity-type badge. |"
5483
+ "value": "`<lr-entity-card>` — a dossier card for one `LyraEntity`: type badge, description, key/value\nproperty rows, degree, community chip, plus a built-in \"focus in graph\" action. Never fetches or\nfocuses a graph itself — `lr-entity-activate` is a request a host routes into `lr-graph`'s\n`focusNode(id, { zoom? })`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Extra body content below the property rows (e.g. a `lr-neighbor-list`). |\n| `actions` | Extra header actions alongside the built-in focus button. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The wrapper around the `actions` slot and the built-in focus button. |\n| `base` | The outer bordered container. |\n| `community` | The community-chip row. |\n| `degree` | The relationship-count row. |\n| `description` | The entity's description text. |\n| `empty` | The empty state shown when `entity` is `null`. |\n| `focus-button` | The built-in \"Focus in graph\" button. |\n| `header` | The header row wrapping the type badge, title, and actions. |\n| `properties` | The wrapper around every property/degree/community row. |\n| `property` | One key/value dossier row. |\n| `title` | The entity's label, `role=\"heading\" aria-level=\"3\"` by default. |\n| `type-badge` | The resolved entity-type badge. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-entity-card-compact-padding` (default: `var(--lr-space-s)`) — `[part=\"base\"]` padding while `compact`.\n- `--lr-entity-card-compact-gap` (default: `var(--lr-space-xs)`) — Gap between `[part=\"base\"]`'s rows while `compact`."
5393
5484
  },
5394
5485
  "attributes": [
5486
+ {
5487
+ "name": "appearance",
5488
+ "description": {
5489
+ "kind": "markdown",
5490
+ "value": "Visual chrome, mirroring `lr-card`'s `appearance` vocabulary. `'card'` (the default) keeps the\nbordered, filled, padded box. `'plain'` removes the border, background, padding and corner\nradius, so a card nested inside a container that already draws a border doesn't double it.\n`plain` wins over `compact` when both are set (nothing left to tighten).\n\nType: `EntityCardAppearance` \nDefault: `'card'`"
5491
+ }
5492
+ },
5395
5493
  {
5396
5494
  "name": "community-label",
5397
5495
  "description": {
@@ -5399,6 +5497,13 @@
5399
5497
  "value": "Display label for `entity.communityId`'s chip; falls back to the raw id.\n\nType: `string` \nDefault: `''`"
5400
5498
  }
5401
5499
  },
5500
+ {
5501
+ "name": "compact",
5502
+ "description": {
5503
+ "kind": "markdown",
5504
+ "value": "Tighter root padding and row gap for dense contexts (a dossier rendered in a sidebar or a\nresult list) -- same convention as `lr-empty`'s `compact`, and as this component's sibling\n`lr-community-card`. Defaults to `false`, i.e. the full card padding. Purely a density knob:\nthe border and background stay, so use `appearance=\"plain\"` to drop the chrome entirely.\n\nType: `boolean` \nDefault: `false`"
5505
+ }
5506
+ },
5402
5507
  {
5403
5508
  "name": "locale",
5404
5509
  "description": {
@@ -5514,7 +5619,7 @@
5514
5619
  "name": "lr-env-list",
5515
5620
  "description": {
5516
5621
  "kind": "markdown",
5517
- "value": "`<lr-env-list>` — masked key/value list for environment variables and secrets, with per-row\nreveal and copy. Masking is presentational, not a security boundary: the real value sits in a DOM\nproperty regardless of mask state.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The `<dl>` root. |\n| `copy-button` | The per-row copy button. |\n| `name` | The `<dt>` name text. |\n| `reveal-button` | The per-row reveal/hide toggle. |\n| `value` | The value text itself; carries `data-masked`. |\n| `value-cell` | The `<dd>` wrapping one entry's value text and its buttons; buttons live here (not as siblings of `<dt>`/`<dd>`) so the `<dl>` keeps a valid dt/dd content model. |"
5622
+ "value": "`<lr-env-list>` — masked key/value list for environment variables and secrets, with per-row\nreveal and copy. Masking is presentational, not a security boundary: the real value sits in a DOM\nproperty regardless of mask state.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The `<dl>` root. |\n| `copy-button` | The per-row copy button. |\n| `name` | The `<dt>` name text. |\n| `reveal-button` | The per-row reveal/hide toggle. |\n| `value` | The value text itself; carries `data-masked`. |\n| `value-cell` | The `<dd>` wrapping one entry's value text and its buttons; buttons live here (not as siblings of `<dt>`/`<dd>`) so the `<dl>` keeps a valid dt/dd content model. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-env-list-reveal-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of a pressed (revealed) reveal toggle.\n- `--lr-env-list-reveal-active-border` (default: `var(--lr-color-brand)`) — Border color of a pressed (revealed) reveal toggle. Restyling the pressed state otherwise requires overriding the library-wide brand tokens, since `::part(reveal-button)[aria-pressed]` is invalid CSS."
5518
5623
  },
5519
5624
  "attributes": [
5520
5625
  {
@@ -5572,7 +5677,7 @@
5572
5677
  "name": "label",
5573
5678
  "description": {
5574
5679
  "kind": "markdown",
5575
- "value": "Accessible name for the example grid region. Defaults to the localized `evalDatasetLabel`.\n\nType: `string` \nDefault: `''`"
5680
+ "value": "Accessible name for the example grid region. A host-level `aria-label` attribute wins over\nthis, which in turn wins over the localized `evalDatasetLabel` default.\n\nType: `string` \nDefault: `''`"
5576
5681
  }
5577
5682
  },
5578
5683
  {
@@ -5785,7 +5890,7 @@
5785
5890
  "name": "lr-file-input",
5786
5891
  "description": {
5787
5892
  "kind": "markdown",
5788
- "value": "`<lr-file-input>` — a drag-drop + click-to-browse file dropzone. Emits\nraw `File[]`; parsing (CSV/XLSX/etc.) is left to the host, since that's\nwhere files ultimately get uploaded and processed anyway.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Custom drop-zone content, overrides the visible `label` text. The accessible name comes from a host `aria-label` when present, then falls back to `label`, so icon-only slot content remains announced correctly. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The dropzone's root, clickable/focusable container. |\n| `input` | The visually-hidden native `<input type=\"file\">`. |\n| `status` | The visually-hidden live region announcing drag accept/reject state. |"
5893
+ "value": "`<lr-file-input>` — a drag-drop + click-to-browse file dropzone. Emits\nraw `File[]`; parsing (CSV/XLSX/etc.) is left to the host, since that's\nwhere files ultimately get uploaded and processed anyway.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Custom drop-zone content, overrides the visible `label` text. The accessible name comes from a host `aria-label` when present, then falls back to `label`, so icon-only slot content remains announced correctly. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The dropzone's root, clickable/focusable container. |\n| `input` | The visually-hidden native `<input type=\"file\">`. |\n| `status` | The visually-hidden live region announcing drag accept/reject state. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-file-input-compact-padding` (default: `var(--lr-space-s)`) — `[part=\"base\"]` padding while `compact`.\n- `--lr-file-input-compact-gap` (default: `var(--lr-space-2xs)`) — Gap between the dropzone's slotted children while `compact`.\n- `--lr-file-input-compact-font-size` (default: `var(--lr-font-size-sm)`) — Label font size while `compact`.\n- `--lr-file-input-accept-border-color` (default: `var(--lr-color-success)`) — Border color of `[part=\"base\"][data-drag-state=\"accept\"]`.\n- `--lr-file-input-accept-bg` (default: `color-mix(in srgb, var(--lr-color-success) 8%, transparent)`) — Background of `[part=\"base\"][data-drag-state=\"accept\"]`.\n- `--lr-file-input-reject-border-color` (default: `var(--lr-color-danger)`) — Border color of `[part=\"base\"][data-drag-state=\"reject\"]`.\n- `--lr-file-input-reject-bg` (default: `color-mix(in srgb, var(--lr-color-danger) 8%, transparent)`) — Background of `[part=\"base\"][data-drag-state=\"reject\"]`."
5789
5894
  },
5790
5895
  "attributes": [
5791
5896
  {
@@ -5809,6 +5914,13 @@
5809
5914
  "value": "Accessible name forwarded to the semantic dropzone and native file input.\nWhen unset, the effective `label` text is used.\n\nType: `string` \nDefault: `''`"
5810
5915
  }
5811
5916
  },
5917
+ {
5918
+ "name": "compact",
5919
+ "description": {
5920
+ "kind": "markdown",
5921
+ "value": "Tighter dropzone padding, gap and label font for constrained spaces (a toolbar, a table cell)\n-- same convention as `lr-empty`'s `compact`. Defaults to `false`, i.e. the full `--lr-space-l`\ndropzone. The dashed border stays; only the internal spacing shrinks.\n\nType: `boolean` \nDefault: `false`"
5922
+ }
5923
+ },
5812
5924
  {
5813
5925
  "name": "directory",
5814
5926
  "description": {
@@ -5855,7 +5967,7 @@
5855
5967
  "name": "paste",
5856
5968
  "description": {
5857
5969
  "kind": "markdown",
5858
- "value": "Enables files pasted from the clipboard into the dropzone.\n\nType: `boolean` \nDefault: `true`"
5970
+ "value": "Enables files pasted from the clipboard into the dropzone. `true`-defaulting, so a plain\n`paste=\"false\"` attribute (not just a `.paste=${false}` property binding) actually disables it.\n\nType: `boolean` \nDefault: `true`"
5859
5971
  }
5860
5972
  },
5861
5973
  {
@@ -5901,7 +6013,7 @@
5901
6013
  "name": "lr-filter-bar",
5902
6014
  "description": {
5903
6015
  "kind": "markdown",
5904
- "value": "`<lr-filter-bar>` — a row of dashboard filters, each declared by the host (`filters`) rather\nthan invented by this component: every filter composes an existing Lyra input --\n`<lr-select>`/`<lr-combobox>` for closed choice sets, `<lr-date-input>` (single or `mode=\"range\"`)\nfor dates -- plus a `<lr-chip-group>` of removable `<lr-chip>`s summarizing the currently-active\nfilters, an `<lr-button>` that resets every filter, and (while `loading`) an `<lr-spinner>`\nstatus indicator.\n\nControlled, like every other Lyra data component: `value` is a plain, JSON-serializable object\n(`FilterBarValue`) the host reads/writes directly -- this component never touches\n`location`/`history`/storage itself, so turning `value` into (and back out of) a URL\nquerystring or an app state store is entirely the host's own concern. Every edit -- picking an\noption, committing a date, removing an active-filter chip, or clicking reset -- goes through\nthe same `setFilterValue()` path and emits a single `lr-input` carrying the *full* resulting\n`value`, not just the changed filter's own value, mirroring `<lr-tool-param-form>`'s identical\n\"always the whole object\" event contract.\n\nValidation is scoped to each filter definition's own `required` flag: `invalidFilterIds`/\n`checkValidity()` are always live (plain getters over `filters`/`value`, not cached), and\n`reportValidity()` additionally reveals every currently-invalid filter's inline error (rendered\nby that filter's own composed control, via its `errorText`/`required` props -- this component\nnever renders a second, duplicate label/hint/error chrome of its own around an already-chromed\ncontrol) the same way a blur naturally would. `lr-validity-change` fires whenever the computed\n`{ valid, invalidFilterIds }` actually changes.\n\nDeliberately not form-associated: a dashboard filter bar's state is not a submitted form field,\nand every value it holds already round-trips through `value` directly -- see `disabled` below,\na plain property with no `<fieldset disabled>` cascade, for the same reason.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `active-filters` | The `role=\"group\"` wrapper around the active-filter chip row, only rendered while any filter is set. |\n| `base` | The root `role=\"group\"` wrapper. |\n| `chip` | One active-filter `<lr-chip>`. |\n| `chips` | The `<lr-chip-group>` inside `active-filters`. |\n| `controls` | The row holding every filter control, the reset button, and the loading status. |\n| `filter-control` | One filter's composed `<lr-select>`/`<lr-combobox>`/`<lr-date-input>`. |\n| `reset-button` | The reset `<lr-button>`. |\n| `status` | The loading `<lr-spinner>`, only rendered while `loading`. |"
6016
+ "value": "`<lr-filter-bar>` — a row of dashboard filters, each declared by the host (`filters`) rather\nthan invented by this component: every filter composes an existing Lyra input --\n`<lr-select>`/`<lr-combobox>` for closed choice sets, `<lr-date-input>` (single or `mode=\"range\"`)\nfor dates, `<lr-input>` for a free-text query -- plus a `<lr-chip-group>` of removable\n`<lr-chip>`s summarizing the currently-active filters, an `<lr-button>` that resets every\nfilter, and (while `loading`) an `<lr-spinner>` status indicator.\n\nA `'text'` filter is the one control that is *not* a fully controlled `.value=` binding: a text\nfield re-rendered from `value` mid-typing would push a stale value back into the field and drop\nthe caret to the end, so the field owns its own value while the user types and an external\n`value` write is synced back in only once no edit is in flight (see `syncTextControls()`). Its\noptional per-filter `debounce` (ms) is the only behaviour this component adds on top of the\ncomposed control itself -- flushed by that field's own `change`/blur, cancelled by `reset()`, a\nchip removal, and `disconnectedCallback`, so a stale keystroke can never overwrite a reset or\nfire after teardown.\n\nControlled, like every other Lyra data component: `value` is a plain, JSON-serializable object\n(`FilterBarValue`) the host reads/writes directly -- this component never touches\n`location`/`history`/storage itself, so turning `value` into (and back out of) a URL\nquerystring or an app state store is entirely the host's own concern. Every edit -- picking an\noption, committing a date, removing an active-filter chip, or clicking reset -- goes through\nthe same `setFilterValue()` path and emits a single `lr-input` carrying the *full* resulting\n`value`, not just the changed filter's own value, mirroring `<lr-tool-param-form>`'s identical\n\"always the whole object\" event contract.\n\nValidation is scoped to each filter definition's own `required` flag: `invalidFilterIds`/\n`checkValidity()` are always live (plain getters over `filters`/`value`, not cached), and\n`reportValidity()` additionally reveals every currently-invalid filter's inline error (rendered\nby that filter's own composed control, via its `errorText`/`required` props -- this component\nnever renders a second, duplicate label/hint/error chrome of its own around an already-chromed\ncontrol) the same way a blur naturally would. `lr-validity-change` fires whenever the computed\n`{ valid, invalidFilterIds }` actually changes.\n\nDeliberately not form-associated: a dashboard filter bar's state is not a submitted form field,\nand every value it holds already round-trips through `value` directly -- see `disabled` below,\na plain property with no `<fieldset disabled>` cascade, for the same reason.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `active-filters` | The `role=\"group\"` wrapper around the active-filter chip row, only rendered while any filter is set. |\n| `base` | The root `role=\"group\"` wrapper. |\n| `chip` | One active-filter `<lr-chip>`. |\n| `chips` | The `<lr-chip-group>` inside `active-filters`. |\n| `controls` | The row holding every filter control, the reset button, and the loading status. |\n| `filter-control` | One filter's composed `<lr-select>`/`<lr-combobox>`/`<lr-date-input>`/`<lr-input>`. |\n| `reset-button` | The reset `<lr-button>`. |\n| `status` | The loading `<lr-spinner>`, only rendered while `loading`. |"
5905
6017
  },
5906
6018
  "attributes": [
5907
6019
  {
@@ -6010,7 +6122,7 @@
6010
6122
  "name": "lr-flow-canvas",
6011
6123
  "description": {
6012
6124
  "kind": "markdown",
6013
- "value": "`<lr-flow-canvas>` — a pannable/zoomable DAG workflow canvas: positions HTML node cards, draws\nSVG edges between their handles, runs a shared layered auto-layout for unpositioned nodes, and owns\nall selection/drag/connect interaction as controlled events. Readonly (viewer) by default; opt into\neditor gestures individually via `nodes-draggable`, `connectable`, `droppable`. Never mutates `nodes`\nor `edges` itself — every edit intent is an event the host applies, mirroring `lr-stepper`/\n`lr-table`'s controlled-component contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `lr-flow-node` children to adopt by `node-id`; non-matching children are ignored with a console warning. |\n| `bottom-end` | Floating corner overlay (e.g. `lr-flow-minimap`). |\n| `bottom-start` | Floating corner overlay (e.g. `lr-flow-controls`). |\n| `top-end` | Floating corner overlay. |\n| `top-start` | Floating corner overlay (e.g. `lr-flow-run-overlay`). |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `arrowhead` | The shared directed-edge arrowhead marker. |\n| `background` | The dotted background grid. |\n| `base` | The root wrapper. |\n| `connection-line` | The in-progress connect-gesture path. |\n| `edge` | A single edge path. |\n| `edge-label` | An edge's drawn label. |\n| `edge-list` | A visually hidden list of every edge. |\n| `edges` | The edges SVG. |\n| `empty` | The `lr-empty` shown when `nodes` is empty. |\n| `live-region` | The current item/gesture announcement. |\n| `node` | A node's positioned wrapper. |\n| `stub` | A dangling-edge stub line. |\n| `viewport` | The focusable pan/zoom surface. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-flow-canvas-grid-size` (default: `var(--lr-size-0-5rem)`) — Dotted background spacing. The canvas also writes it inline as `${grid}px` from the `grid` property, which wins over the stylesheet fallback whenever a grid is in effect.\n- `--lr-flow-canvas-march-duration` (default: `var(--lr-transition-ambient)`) — Running-edge march animation duration."
6125
+ "value": "`<lr-flow-canvas>` — a pannable/zoomable DAG workflow canvas: positions HTML node cards, draws\nSVG edges between their handles, runs a shared layered auto-layout for unpositioned nodes, and owns\nall selection/drag/connect interaction as controlled events. Readonly (viewer) by default; opt into\neditor gestures individually via `nodes-draggable`, `connectable`, `droppable`. Never mutates `nodes`\nor `edges` itself — every edit intent is an event the host applies, mirroring `lr-stepper`/\n`lr-table`'s controlled-component contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `lr-flow-node` children to adopt by `node-id`; non-matching children are ignored with a console warning. |\n| `bottom-end` | Floating corner overlay (e.g. `lr-flow-minimap`). |\n| `bottom-start` | Floating corner overlay (e.g. `lr-flow-controls`). |\n| `top-end` | Floating corner overlay. |\n| `top-start` | Floating corner overlay (e.g. `lr-flow-run-overlay`). |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `arrowhead` | The shared directed-edge arrowhead marker. |\n| `background` | The dotted background grid. |\n| `base` | The root wrapper. |\n| `connection-line` | The in-progress connect-gesture path. |\n| `edge` | A single edge path. |\n| `edge-label` | An edge's drawn label. |\n| `edge-list` | A visually hidden list of every edge. |\n| `edges` | The edges SVG. |\n| `empty` | The `lr-empty` shown when `nodes` is empty. |\n| `live-region` | The current item/gesture announcement. |\n| `node` | A node's positioned wrapper. |\n| `stub` | A dangling-edge stub line. |\n| `viewport` | The focusable pan/zoom surface. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-flow-canvas-grid-size` (default: `var(--lr-size-0-5rem)`) — Dotted background spacing. The canvas also writes it inline as `${grid}px` from the `grid` property, which wins over the stylesheet fallback whenever a grid is in effect.\n- `--lr-flow-canvas-march-duration` (default: `var(--lr-transition-ambient)`) — Running-edge march animation duration.\n- `--lr-flow-canvas-node-current-outline-color` (default: `var(--lr-color-brand)`) — Outline color of the current (`aria-current`) node. Shadow Parts forbids an attribute selector after `::part()`, so the current node could otherwise only be restyled by hijacking the library-wide `--lr-color-brand` token.\n- `--lr-flow-canvas-node-connect-invalid-outline-color` (default: `var(--lr-color-danger)`) — Outline color of a node that is an invalid connect-gesture drop target. Same `::part()` attribute-selector restriction as `--lr-flow-canvas-node-current-outline-color` above.\n- `--lr-flow-canvas-node-connect-target-outline-color` (default: `var(--lr-color-brand)`) — Outline color of a node that is a valid connect-gesture drop target.\n- `--lr-flow-canvas-drop-active-outline-color` (default: `var(--lr-color-brand)`) — Outline color of the viewport while a palette item is dragged over it (`droppable`)."
6014
6126
  },
6015
6127
  "attributes": [
6016
6128
  {
@@ -6111,21 +6223,28 @@
6111
6223
  "name": "lr-flow-controls",
6112
6224
  "description": {
6113
6225
  "kind": "markdown",
6114
- "value": "`<lr-flow-controls>` — the canvas's button cluster: zoom in/out, fit, and interaction lock, so\nevery flow surface ships the same affordances without hosts rebuilding them. Manipulates only\nview state, never `nodes`/`edges` — no editing commands live here.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Extra host buttons appended to the cluster, styled by the same group. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The `role=\"group\"` wrapper. |\n| `fit` | Zoom-to-fit button. |\n| `lock` | Lock/unlock toggle button (omitted when `hideLock`). |\n| `zoom-in` | Zoom-in button. |\n| `zoom-out` | Zoom-out button. |"
6226
+ "value": "`<lr-flow-controls>` — the canvas's button cluster: zoom in/out, fit, and interaction lock, so\nevery flow surface ships the same affordances without hosts rebuilding them. Manipulates only\nview state, never `nodes`/`edges` — no editing commands live here.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Extra host buttons appended to the cluster, styled by the same group. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The `role=\"group\"` wrapper. Drops its floating-surface chrome (border, background, shadow, padding, radius) under `appearance=\"plain\"`. |\n| `fit` | Zoom-to-fit button. |\n| `lock` | Lock/unlock toggle button (omitted when `hideLock`). |\n| `zoom-in` | Zoom-in button. |\n| `zoom-out` | Zoom-out button. |"
6115
6227
  },
6116
6228
  "attributes": [
6229
+ {
6230
+ "name": "appearance",
6231
+ "description": {
6232
+ "kind": "markdown",
6233
+ "value": "Visual chrome, mirroring `lr-card`'s `appearance` vocabulary. `'card'` (the default) keeps the\nbordered, filled, shadowed floating cluster. `'plain'` removes the border, background, shadow,\npadding and corner radius, so a cluster placed in a host toolbar or panel that already draws\nits own surface doesn't double the frame. The buttons keep their shared minimum hit area and\ntheir own hover/focus affordances either way.\n\nType: `FlowControlsAppearance` \nDefault: `'card'`"
6234
+ }
6235
+ },
6117
6236
  {
6118
6237
  "name": "for",
6119
6238
  "description": {
6120
6239
  "kind": "markdown",
6121
- "value": "Type: `string` \nDefault: `''`"
6240
+ "value": "Id of the `lr-flow-canvas` this cluster drives. Empty (the default) resolves to the nearest\nancestor canvas -- the slotted-into-a-corner-slot case. Changing it at runtime re-resolves and\nre-subscribes; a target that mounts later is picked up too.\n\nType: `string` \nDefault: `''`"
6122
6241
  }
6123
6242
  },
6124
6243
  {
6125
6244
  "name": "hide-lock",
6126
6245
  "description": {
6127
6246
  "kind": "markdown",
6128
- "value": "Type: `boolean` \nDefault: `false`"
6247
+ "value": "Omits the lock/unlock toggle button entirely, for canvases that never expose an interaction\nlock.\n\nType: `boolean` \nDefault: `false`"
6129
6248
  }
6130
6249
  },
6131
6250
  {
@@ -6139,7 +6258,7 @@
6139
6258
  "name": "orientation",
6140
6259
  "description": {
6141
6260
  "kind": "markdown",
6142
- "value": "Type: `'vertical' | 'horizontal'` \nDefault: `'vertical'`"
6261
+ "value": "Layout axis of the button cluster.\n\nType: `'vertical' | 'horizontal'` \nDefault: `'vertical'`"
6143
6262
  },
6144
6263
  "values": [
6145
6264
  {
@@ -6186,9 +6305,16 @@
6186
6305
  "name": "lr-flow-node",
6187
6306
  "description": {
6188
6307
  "kind": "markdown",
6189
- "value": "`<lr-flow-node>` — the card a workflow node renders as: header/body/toolbar chrome,\ntool-lifecycle status tones, and the named connection-handle elements edges anchor to. Used as\n`lr-flow-canvas`'s default card and as a slotted override; also renders standalone (palette\npreviews, docs). Purely presentational — activation, selection, movement, and connection are all\n`lr-flow-canvas` events; this component owns none of that.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Body content. |\n| `header` | Replaces the built-in heading row entirely. |\n| `icon` | Leading header glyph. |\n| `toolbar` | Action row at the block-end edge. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The card root. |\n| `body` | The default-slot body wrapper. |\n| `handle` | Every handle dot (input or output). |\n| `handle-input` | An input handle dot (also carries the shared `handle` part). |\n| `handle-output` | An output handle dot (also carries the shared `handle` part). |\n| `header` | The built-in header row (omitted when the `header` slot has content). |\n| `heading` | The heading text. |\n| `icon` | The wrapper around the `icon` slot. |\n| `progress` | The determinate progress bar. |\n| `status` | The visible status chip (status is never color-only). |\n| `toolbar` | The toolbar row wrapper. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-flow-node-min-inline-size` (default: `calc(var(--lr-size-10rem) + var(--lr-size-1rem))`) — Minimum card inline size."
6308
+ "value": "`<lr-flow-node>` — the card a workflow node renders as: header/body/toolbar chrome,\ntool-lifecycle status tones, and the named connection-handle elements edges anchor to. Used as\n`lr-flow-canvas`'s default card and as a slotted override; also renders standalone (palette\npreviews, docs). Purely presentational — activation, selection, movement, and connection are all\n`lr-flow-canvas` events; this component owns none of that.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Body content. |\n| `header` | Replaces the built-in heading row entirely. |\n| `icon` | Leading header glyph. |\n| `toolbar` | Action row at the block-end edge. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The row wrapping the input handles, the card, and the output handles. Carries no card chrome of its own — style the card itself through the `card` part. |\n| `body` | The default-slot body wrapper. |\n| `card` | The bordered, filled node card. |\n| `handle` | Every handle dot (input or output). |\n| `handle-input` | An input handle dot (also carries the shared `handle` part). |\n| `handle-output` | An output handle dot (also carries the shared `handle` part). |\n| `header` | The built-in header row (omitted when the `header` slot has content). |\n| `heading` | The heading text. |\n| `icon` | The wrapper around the `icon` slot. |\n| `progress` | The determinate progress bar. |\n| `status` | The visible status chip (status is never color-only). |\n| `toolbar` | The toolbar row wrapper. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-flow-node-min-inline-size` (default: `calc(var(--lr-size-10rem) + var(--lr-size-1rem))`) — Minimum card inline size.\n- `--lr-flow-node-compact-padding` (default: `var(--lr-space-xs)`) — `[part=\"card\"]` padding while `compact`.\n- `--lr-flow-node-compact-gap` (default: `var(--lr-space-2xs)`) — Gap between `[part=\"card\"]`'s rows while `compact`.\n- `--lr-flow-node-selected-border` (default: `var(--lr-color-brand)`) — Border color of the card while `selected`. Overriding the selection color otherwise requires hijacking the library-wide `--lr-color-brand` token.\n- `--lr-flow-node-running-border` (default: `var(--lr-color-brand)`) — Border color of the card while `status=\"running\"`. Independent from `--lr-flow-node-selected-border` so a consumer can retint just one of the two states without the other following along.\n- `--lr-flow-node-running-glow` (default: `var(--lr-color-brand-quiet)`) — Box-shadow color of the running-state ring around the card, and the pulse keyframes' peak color."
6190
6309
  },
6191
6310
  "attributes": [
6311
+ {
6312
+ "name": "compact",
6313
+ "description": {
6314
+ "kind": "markdown",
6315
+ "value": "Tighter card padding and row gap, for the dense canvases and palette previews these cards\nusually render in -- same convention as `lr-source-card`'s `compact`. Defaults to `false`,\ni.e. the full card padding. Purely a density knob: the border, background and shadow stay, as\ndo the `selected` and `status=\"running\"` treatments.\n\nType: `boolean` \nDefault: `false`"
6316
+ }
6317
+ },
6192
6318
  {
6193
6319
  "name": "duration-ms",
6194
6320
  "description": {
@@ -6266,9 +6392,16 @@
6266
6392
  "name": "lr-flow-run-overlay",
6267
6393
  "description": {
6268
6394
  "kind": "markdown",
6269
- "value": "`<lr-flow-run-overlay>` — execution-state presentation for a `lr-flow-canvas`: pushes a\n`FlowRunDecorations` map into the resolved canvas (the canvas itself renders the node/edge paint)\nand renders a compact run-summary strip. Does not execute, poll, or time anything — pure pushed\nstate; `durationMs` is host-computed.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Extra host chrome appended to the strip (e.g. a cancel button or a usage badge). |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `count` | One per status present (text + tone dot, never color-only). |\n| `live-region` | The step-transition announcement. |\n| `summary` | The \"{done} of {total} steps complete\" line. |"
6395
+ "value": "`<lr-flow-run-overlay>` — execution-state presentation for a `lr-flow-canvas`: pushes a\n`FlowRunDecorations` map into the resolved canvas (the canvas itself renders the node/edge paint)\nand renders a compact run-summary strip. Does not execute, poll, or time anything — pure pushed\nstate; `durationMs` is host-computed.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Extra host chrome appended to the strip (e.g. a cancel button or a usage badge). |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. Drops its floating-surface chrome under `appearance=\"plain\"`. |\n| `count` | One per status present (text + tone dot, never color-only). |\n| `live-region` | The step-transition announcement. |\n| `summary` | The \"{done} of {total} steps complete\" line. |"
6270
6396
  },
6271
6397
  "attributes": [
6398
+ {
6399
+ "name": "appearance",
6400
+ "description": {
6401
+ "kind": "markdown",
6402
+ "value": "Visual chrome, mirroring `lr-card`'s `appearance` vocabulary. `'card'` (the default) keeps the\nbordered, filled, shadowed floating strip. `'plain'` removes the border, background, shadow,\npadding and corner radius, so a summary strip dropped directly into a host toolbar that\nalready draws its own frame doesn't double it.\n\nType: `FlowRunOverlayAppearance` \nDefault: `'card'`"
6403
+ }
6404
+ },
6272
6405
  {
6273
6406
  "name": "for",
6274
6407
  "description": {
@@ -6602,7 +6735,7 @@
6602
6735
  "name": "lr-graph",
6603
6736
  "description": {
6604
6737
  "kind": "markdown",
6605
- "value": "`<lr-graph>` — a force-directed node-link diagram with pan/zoom/drag.\nRequires the optional peer deps `d3-force`/`d3-drag`/`d3-zoom`/`d3-selection`\n(lazy-loaded; a consumer who never uses this component pays zero d3 cost).\n\nSet `seed` for a deterministic layout: node initial positions become\nreproducible (keyed by node id) and the settle happens synchronously\ninstead of animating, like `prefers-reduced-motion`. `seed` only takes\neffect on the update that first populates `nodes`/`links` (or a later\nupdate that adds genuinely new node ids) — willUpdate() only reads it from\ninside rebuildSimulation(), which itself only ever assigns x/y to nodes\nthat don't already have a settled position, so changing `seed` on an\nalready-rendered graph is a no-op; nothing re-derives already-positioned\nnodes' x/y from the new value.\n\n`hiddenTypes` filters nodes/links by `GraphNode.type` without discarding position state --\n`lastPositionById` remembers every node's last settled x/y across a hide/show round-trip, so\ntoggling a type off and back on restores each node where it was instead of re-randomizing it.\n\n`communities` draws one translucent convex-hull blob per entry, behind links/nodes -- a hull's\nmembership is the union of its own `memberIds` and every node whose `communityId` matches its\n`id`. A community with no currently-visible members (all its nodes hidden by `hiddenTypes`, or\nsimply empty) renders no hull.\n\n`layout=\"layered\"` swaps the d3-force simulation for a deterministic layered layout (see\n`src/internal/layered-layout.ts`) -- node drag is disabled in that mode, and `chargeStrength` is\na documented no-op.\n\n`renderer=\"canvas\"` swaps the per-node/per-link SVG DOM for a single DPR-aware `<canvas>` --\nevery event/method/property behaves identically to `renderer=\"svg\"` (the default), with hit-\ntesting resolved via an offscreen color-picking canvas instead of DOM event targets. The\ndocumented trade-offs: no `::part(node)`/`::part(link)` styling (pixels, not elements -- theme\nvia cssprops instead), no native SVG `<title>` tooltip (replaced by `part=\"tooltip\"`), and a\ndrawn focus ring instead of a CSS one. Keyboard roving/announcements are preserved through an\noffscreen `part=\"cursor-item\"` button per node/link/hull, driving the identical roving-tabindex\nlogic as `renderer=\"svg\"`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `arrowhead` | The marker used by directed graph links. |\n| `base` | The graph wrapper. |\n| `canvas` | The single canvas surface (`renderer=\"canvas\"` only). |\n| `community-label` | A hull's label text. |\n| `cursor-item` | An offscreen keyboard-roving item (`renderer=\"canvas\"`'s a11y virtual cursor). |\n| `cursor-items` | The container of offscreen keyboard-roving items (`renderer=\"canvas\"` only). |\n| `data-list` | A visually hidden list alternative for graph data. |\n| `empty` | The empty-state message, shown when `nodes` is empty. |\n| `expand-indicator` | The \"+\" badge rendered on a node with `expandable: true`. |\n| `focus-halo` | The persistent ring tracking `focusId`'s node. |\n| `hull` | A community hull (behind links/nodes; role=\"button\"). |\n| `label` | A node label. |\n| `link` | A graph link. |\n| `link-label` | A drawn edge label (only rendered when `showEdgeLabels` is set). |\n| `live-region` | The current graph item announcement. |\n| `node` | A graph node. |\n| `svg` | The graph SVG. |\n| `tooltip` | The hover tooltip (`renderer=\"canvas\"` only; the SVG `<title>` replacement). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-node-fill` (default: `var(--lr-color-brand)`) — Default node fill, overridden per-node by `GraphNode.color`.\n- `--lr-link-color` (default: `var(--lr-color-border)`) — Default link stroke, overridden per-link by a link's own `color`.\n- `--lr-graph-cat-1..8` — Ordered categorical fallback palette for a typed node with no `GraphNodeType.color`, assigned by the type's index in `nodeTypes` (wraps every 8 entries). Declared centrally in `tokens.styles.ts` so `<lr-graph>` and any future `<lr-graph-legend>`- style component resolve the identical default.\n- `--lr-graph-edge-label-halo` (default: `var(--lr-color-surface)`) — Legibility halo (`stroke`) behind a drawn edge label, painted under the fill via `paint-order: stroke`.\n- `--lr-graph-focus-halo-color` (default: `var(--lr-color-brand)`) — `focus-halo` stroke color.\n- `--lr-graph-selected-color` (default: `var(--lr-color-success)`) — Selected node/link stroke.\n- `--lr-graph-dimmed-opacity` (default: `0.35`) — Opacity applied to a node/link when `dimmedNodeIds`/`dimmedLinkIds` includes its id (both SVG and canvas renderers). Visible by default -- a consumer controlling `dimmedNodeIds`/`dimmedLinkIds` (e.g. `lr-knowledge-graph-explorer`) sees the dimming take effect with no extra host styling.\n- `--lr-graph-hull-fill` (default: `var(--lr-color-brand)`) — Hull fill/stroke color.\n- `--lr-graph-hull-opacity` (default: `0.12`) — Hull element opacity (composites fill+stroke as one group, avoiding a double-opacity seam at the fill/stroke boundary)."
6738
+ "value": "`<lr-graph>` — a force-directed node-link diagram with pan/zoom/drag.\nRequires the optional peer deps `d3-force`/`d3-drag`/`d3-zoom`/`d3-selection`\n(lazy-loaded; a consumer who never uses this component pays zero d3 cost).\n\nSet `seed` for a deterministic layout: node initial positions become\nreproducible (keyed by node id) and the settle happens synchronously\ninstead of animating, like `prefers-reduced-motion`. `seed` only takes\neffect on the update that first populates `nodes`/`links` (or a later\nupdate that adds genuinely new node ids) — willUpdate() only reads it from\ninside rebuildSimulation(), which itself only ever assigns x/y to nodes\nthat don't already have a settled position, so changing `seed` on an\nalready-rendered graph is a no-op; nothing re-derives already-positioned\nnodes' x/y from the new value.\n\n`hiddenTypes` filters nodes/links by `GraphNode.type` without discarding position state --\n`lastPositionById` remembers every node's last settled x/y across a hide/show round-trip, so\ntoggling a type off and back on restores each node where it was instead of re-randomizing it.\n\n`communities` draws one translucent convex-hull blob per entry, behind links/nodes -- a hull's\nmembership is the union of its own `memberIds` and every node whose `communityId` matches its\n`id`. A community with no currently-visible members (all its nodes hidden by `hiddenTypes`, or\nsimply empty) renders no hull.\n\n`layout=\"layered\"` swaps the d3-force simulation for a deterministic layered layout (see\n`src/internal/layered-layout.ts`) -- node drag is disabled in that mode, and `chargeStrength` is\na documented no-op.\n\n`renderer=\"canvas\"` swaps the per-node/per-link SVG DOM for a single DPR-aware `<canvas>` --\nevery event/method/property behaves identically to `renderer=\"svg\"` (the default), with hit-\ntesting resolved via an offscreen color-picking canvas instead of DOM event targets. The\ndocumented trade-offs: no `::part(node)`/`::part(link)` styling (pixels, not elements -- theme\nvia cssprops instead), no native SVG `<title>` tooltip (replaced by `part=\"tooltip\"`), and a\ndrawn focus ring instead of a CSS one. Keyboard roving/announcements are preserved through an\noffscreen `part=\"cursor-item\"` button per node/link/hull, driving the identical roving-tabindex\nlogic as `renderer=\"svg\"`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `arrowhead` | The marker used by directed graph links. |\n| `base` | The graph wrapper. |\n| `canvas` | The single canvas surface (`renderer=\"canvas\"` only). |\n| `community-label` | A hull's label text. |\n| `cursor-item` | An offscreen keyboard-roving item (`renderer=\"canvas\"`'s a11y virtual cursor). |\n| `cursor-items` | The container of offscreen keyboard-roving items (`renderer=\"canvas\"` only). |\n| `data-list` | A visually hidden list alternative for graph data. |\n| `empty` | The empty-state message, shown when `nodes` is empty. |\n| `error` | `role=\"alert\"` message shown instead of the graph when the optional `d3` peer dependency is not installed. |\n| `expand-indicator` | The \"+\" badge rendered on a node with `expandable: true`. |\n| `focus-halo` | The persistent ring tracking `focusId`'s node. |\n| `hull` | A community hull (behind links/nodes; role=\"button\"). |\n| `label` | A node label. |\n| `link` | A graph link. |\n| `link-label` | A drawn edge label (only rendered when `showEdgeLabels` is set). |\n| `live-region` | The current graph item announcement. |\n| `node` | A graph node. |\n| `svg` | The graph SVG. |\n| `tooltip` | The hover tooltip (`renderer=\"canvas\"` only; the SVG `<title>` replacement). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-node-fill` (default: `var(--lr-color-brand)`) — Default node fill, overridden per-node by `GraphNode.color`.\n- `--lr-link-color` (default: `var(--lr-color-border)`) — Default link stroke, overridden per-link by a link's own `color`.\n- `--lr-graph-cat-1..8` — Ordered categorical fallback palette for a typed node with no `GraphNodeType.color`, assigned by the type's index in `nodeTypes` (wraps every 8 entries). Declared centrally in `tokens.styles.ts` so `<lr-graph>` and any future `<lr-graph-legend>`- style component resolve the identical default.\n- `--lr-graph-edge-label-halo` (default: `var(--lr-color-surface)`) — Legibility halo (`stroke`) behind a drawn edge label, painted under the fill via `paint-order: stroke`.\n- `--lr-graph-focus-halo-color` (default: `var(--lr-color-brand)`) — `focus-halo` stroke color.\n- `--lr-graph-selected-color` (default: `var(--lr-color-success)`) — Selected node/link stroke.\n- `--lr-graph-dimmed-opacity` (default: `0.35`) — Opacity applied to a node/link when `dimmedNodeIds`/`dimmedLinkIds` includes its id (both SVG and canvas renderers). Visible by default -- a consumer controlling `dimmedNodeIds`/`dimmedLinkIds` (e.g. `lr-knowledge-graph-explorer`) sees the dimming take effect with no extra host styling.\n- `--lr-graph-hull-fill` (default: `var(--lr-color-brand)`) — Hull fill/stroke color.\n- `--lr-graph-hull-opacity` (default: `0.12`) — Hull element opacity (composites fill+stroke as one group, avoiding a double-opacity seam at the fill/stroke boundary)."
6606
6739
  },
6607
6740
  "attributes": [
6608
6741
  {
@@ -6743,7 +6876,7 @@
6743
6876
  "name": "lr-graph-legend",
6744
6877
  "description": {
6745
6878
  "kind": "markdown",
6746
- "value": "`<lr-graph-legend>` — a node-type legend for a paired `lr-graph`: one swatch + label + count\nrow per `lr-graph` node type, doubling as visibility filters. Never reads or writes a graph directly —\nthe host forwards `types` in from `graph.nodeTypes` and `hiddenTypes` back out to\n`graph.hiddenTypes` on `lr-visibility-change`, the same event-decoupled contract every sibling\nin this family follows.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The `role=\"group\"` wrapper. |\n| `count` | The optional per-type count. |\n| `item` | One row per type — a `<button>` when `interactive`, a plain `<div>` otherwise. |\n| `label` | The type's label text. |\n| `live-region` | The visually hidden filter-toggle announcement. |\n| `swatch` | The type's shape glyph. |"
6879
+ "value": "`<lr-graph-legend>` — a node-type legend for a paired `lr-graph`: one swatch + label + count\nrow per `lr-graph` node type, doubling as visibility filters. Never reads or writes a graph directly —\nthe host forwards `types` in from `graph.nodeTypes` and `hiddenTypes` back out to\n`graph.hiddenTypes` on `lr-visibility-change`, the same event-decoupled contract every sibling\nin this family follows.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The `role=\"group\"` wrapper. |\n| `count` | The optional per-type count. |\n| `item` | One row per type — a `<button>` when `interactive`, a plain `<div>` otherwise. |\n| `label` | The type's label text. |\n| `live-region` | The visually hidden filter-toggle announcement. |\n| `swatch` | The type's shape glyph. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-graph-legend-hidden-color` (default: `var(--lr-color-text-quiet)`) — Text color for a filtered-out (hidden) legend row's label/count, independent of the shared quiet-text token."
6747
6880
  },
6748
6881
  "attributes": [
6749
6882
  {
@@ -6773,7 +6906,7 @@
6773
6906
  "name": "lr-graph-query-builder",
6774
6907
  "description": {
6775
6908
  "kind": "markdown",
6776
- "value": "`<lr-graph-query-builder>` — an editor for a single typed relationship/path filter\n(`GraphQuery`) over a knowledge graph: start/end entity anchors, relationship-type and\nnode-type pickers with a removable active-filter chip display, a traversal direction, a\nmin/max hop range, validation, and a host-persisted saved-query list -- a serializable query\nmodel for GraphRAG workflows (feed the `value`/`lr-query-run` payload straight to a retrieval\nor traversal backend).\n\nComposes `<lr-select>` for every closed-choice picker (relationship type, node type,\ndirection, hop counts) and `<lr-input>` for the free-text entity ids -- the relationship/\nnode-type pickers are \"add\" selects: choosing an option appends it to the corresponding\narray and the picker itself resets to its placeholder, so the *current* selection is shown\nseparately as a row of removable `<lr-chip>`s inside an `<lr-chip-group>` (click a chip's\nremove button to drop that one type). A type value present in `value` but missing from\n`relationshipTypeOptions`/`nodeTypeOptions` (e.g. a saved query referencing a type that was\nsince renamed/removed from the picker's own option list) still renders as a chip, labeled with\nits raw value, rather than being silently dropped.\n\n**Query model placement:** `GraphQuery` is kept local to this component rather than promoted\nto the shared `src/ai/types.ts` surface. Unlike that module's types (`ChatMessage`,\n`Citation`, `RetrievalQuery`, etc.), which each mirror a shape multiple existing primitives\nalready consume, `GraphQuery` is specific to this component's own editable-filter-set shape\n(its `minHops`/`maxHops` selects, its \"add picker + chip list\" editing idiom) -- no other\ncomponent reads or produces this exact shape today. This mirrors `<lr-rubric-form>`'s\n`RubricValue`/`RubricKey` and `<lr-tool-param-form>`'s `ToolParamFormSchema`, both also kept\nlocal to their own component for the identical reason.\n\n**Form association:** every other \"structured, non-string value\" editor in this package that\nlooks like this one -- `<lr-rubric-form>`, `<lr-tool-param-form>`, `<lr-time-range>` -- attaches\n`ElementInternals` directly (the `FormAssociated` mixin only fits a plain string value) and\ntreats native `<form>` participation as a nice-to-have layered on top of its primary\n`value`/`lr-input`/`lr-validity-change` integration contract, not a requirement. This component\nfollows that same established convention: `value` round-trips through `JSON.stringify()` as the\nsubmitted form value, and a consumer that never places this inside a `<form>` loses nothing.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `actions` | Extra host controls rendered in the footer beside the Run button. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer wrapper around every section. |\n| `direction` | The traversal-direction `<lr-select>`. |\n| `end-input` | The end-entity `<lr-input>`. |\n| `filter-group` | One type-filter section (relationship or node type); rendered twice. |\n| `footer` | The row containing the actions slot and the Run button. |\n| `max-hops` | The maximum-hops `<lr-select>`. |\n| `min-hops` | The minimum-hops `<lr-select>`. |\n| `node-type-chips` | The `<lr-chip-group>` listing currently active node types. |\n| `node-type-picker` | The \"add a node type\" `<lr-select>`. |\n| `path-fields` | The row wrapping the start/end entity inputs and hop-count selects. |\n| `relationship-chips` | The `<lr-chip-group>` listing currently active relationship types. |\n| `relationship-picker` | The \"add a relationship type\" `<lr-select>`. |\n| `run-button` | The Run button. |\n| `save-button` | The Save button. |\n| `save-name-input` | The new-saved-query name `<lr-input>`. |\n| `save-row` | The row containing the save-name input and Save button. |\n| `saved-delete-button` | A saved query row's delete button. |\n| `saved-empty` | The message shown when `savedQueries` has no entries. |\n| `saved-item` | One saved query's row. |\n| `saved-list` | The list of saved queries. |\n| `saved-load-button` | A saved query row's Load button. |\n| `saved-queries` | The wrapper around the save row and the saved-query list. |\n| `saved-queries-label` | The saved-queries section heading. |\n| `start-input` | The start-entity `<lr-input>`. |"
6909
+ "value": "`<lr-graph-query-builder>` — an editor for a single typed relationship/path filter\n(`GraphQuery`) over a knowledge graph: start/end entity anchors, relationship-type and\nnode-type pickers with a removable active-filter chip display, a traversal direction, a\nmin/max hop range, validation, and a host-persisted saved-query list -- a serializable query\nmodel for GraphRAG workflows (feed the `value`/`lr-query-run` payload straight to a retrieval\nor traversal backend).\n\nComposes `<lr-select>` for every closed-choice picker (relationship type, node type,\ndirection, hop counts) and `<lr-input>` for the free-text entity ids -- the relationship/\nnode-type pickers are \"add\" selects: choosing an option appends it to the corresponding\narray and the picker itself resets to its placeholder, so the *current* selection is shown\nseparately as a row of removable `<lr-chip>`s inside an `<lr-chip-group>` (click a chip's\nremove button to drop that one type). A type value present in `value` but missing from\n`relationshipTypeOptions`/`nodeTypeOptions` (e.g. a saved query referencing a type that was\nsince renamed/removed from the picker's own option list) still renders as a chip, labeled with\nits raw value, rather than being silently dropped.\n\n**Query model placement:** `GraphQuery` is kept local to this component rather than promoted\nto the shared `src/ai/types.ts` surface. Unlike that module's types (`ChatMessage`,\n`Citation`, `RetrievalQuery`, etc.), which each mirror a shape multiple existing primitives\nalready consume, `GraphQuery` is specific to this component's own editable-filter-set shape\n(its `minHops`/`maxHops` selects, its \"add picker + chip list\" editing idiom) -- no other\ncomponent reads or produces this exact shape today. This mirrors `<lr-rubric-form>`'s\n`RubricValue`/`RubricKey` and `<lr-tool-param-form>`'s `ToolParamFormSchema`, both also kept\nlocal to their own component for the identical reason.\n\n**Form association:** every other \"structured, non-string value\" editor in this package that\nlooks like this one -- `<lr-rubric-form>`, `<lr-tool-param-form>`, `<lr-time-range>` -- attaches\n`ElementInternals` directly (the `FormAssociated` mixin only fits a plain string value) and\ntreats native `<form>` participation as a nice-to-have layered on top of its primary\n`value`/`lr-input`/`lr-validity-change` integration contract, not a requirement. This component\nfollows that same established convention: `value` round-trips through `JSON.stringify()` as the\nsubmitted form value, and a consumer that never places this inside a `<form>` loses nothing.\n\n**Accessible name:** the region (`role=\"group\"`) is named by, in order, a host-level\n`aria-label` attribute, the `label` property, or the localized `graphQueryBuilderLabel` default\n-- mirroring `<lr-query-builder>`'s identical `role=\"group\"` region, whose own `aria-label`\nattribute similarly wins over its internal default.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `actions` | Extra host controls rendered in the footer beside the Run button. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer wrapper around every section. |\n| `direction` | The traversal-direction `<lr-select>`. |\n| `end-input` | The end-entity `<lr-input>`. |\n| `filter-group` | One type-filter section (relationship or node type); rendered twice. |\n| `footer` | The row containing the actions slot and the Run button. |\n| `max-hops` | The maximum-hops `<lr-select>`. |\n| `min-hops` | The minimum-hops `<lr-select>`. |\n| `node-type-chips` | The `<lr-chip-group>` listing currently active node types. |\n| `node-type-picker` | The \"add a node type\" `<lr-select>`. |\n| `path-fields` | The row wrapping the start/end entity inputs and hop-count selects. |\n| `relationship-chips` | The `<lr-chip-group>` listing currently active relationship types. |\n| `relationship-picker` | The \"add a relationship type\" `<lr-select>`. |\n| `run-button` | The Run button. |\n| `save-button` | The Save button. |\n| `save-name-input` | The new-saved-query name `<lr-input>`. |\n| `save-row` | The row containing the save-name input and Save button. |\n| `saved-delete-button` | A saved query row's delete button. |\n| `saved-empty` | The message shown when `savedQueries` has no entries. |\n| `saved-item` | One saved query's row. |\n| `saved-list` | The list of saved queries. |\n| `saved-load-button` | A saved query row's Load button. |\n| `saved-queries` | The wrapper around the save row and the saved-query list. |\n| `saved-queries-label` | The saved-queries section heading. |\n| `start-input` | The start-entity `<lr-input>`. |"
6777
6910
  },
6778
6911
  "attributes": [
6779
6912
  {
@@ -6794,7 +6927,7 @@
6794
6927
  "name": "label",
6795
6928
  "description": {
6796
6929
  "kind": "markdown",
6797
- "value": "Accessible name for the whole component; falls back to the localized `graphQueryBuilderLabel`.\n\nType: `string` \nDefault: `''`"
6930
+ "value": "Accessible name for the whole component; falls back to the localized `graphQueryBuilderLabel`.\nA host-level `aria-label` attribute wins over both this property and the localized default --\nsee the class doc's \"Accessible name\" note.\n\nType: `string` \nDefault: `''`"
6798
6931
  }
6799
6932
  },
6800
6933
  {
@@ -6877,7 +7010,7 @@
6877
7010
  "name": "lr-heatmap",
6878
7011
  "description": {
6879
7012
  "kind": "markdown",
6880
- "value": "`<lr-heatmap>` — a Canvas heatmap with a DPR-aware, resize-aware redraw\nloop, in one of two `mode`s:\n\n- `\"matrix\"` (default): a `rowLabels` x `colLabels` grid of `values`. `-1`\n (or any non-finite value) is treated as \"no data\". `scale=\"sqrt\"`\n compresses the ramp via `sqrtStep()` so one heavy cell doesn't wash out\n the rest; the default `\"linear\"` scale maps linearly instead.\n- `\"calendar\"`: a GitHub-style Sunday-Saturday (or `firstDayOfWeek`-anchored\n — see below) x week grid built from `days`. `scale` governs its\n bucketing too: the default `\"linear\"` buckets by `quartileBucket()`\n (today's original behavior, unchanged); `\"sqrt\"` instead compresses via\n the same `sqrtStep()` magnitude compression matrix mode uses, so one\n heavy day doesn't wash out the rest. As in matrix mode, a cell whose\n `value` is negative or non-finite is treated as \"no data\" rather than\n being bucketed — as is a grid position with no matching entry in `days`\n at all (a gap in a sparse calendar).\n\nThe sequential color ramp's endpoints are read from the\n`--lr-heatmap-scale-lo`/`-hi` custom properties (declared in\n`heatmap.styles.ts`) so hosts can retheme it — canvas can't consume\n`var()` directly, so they're resolved once per draw via\n`getComputedStyle`, then normalized to RGB by `resolveRgb()` (any valid\nCSS color syntax, not just hex — see its doc comment).\n\nEvery cell is independently addressable: a `pointermove` hit test over the\ncanvas shows `[part=\"tooltip\"]` with that cell's label + value (hidden on\n`pointerleave`); the canvas is `tabindex=\"0\"` with arrow-key roving focus\n(a stroked ring redrawn over the focused cell on every draw, plus a\nvisually-hidden `aria-live=\"polite\"` status announcement — avoids a\nDOM-node-per-cell overlay, which would be hundreds of nodes for a year\ncalendar); and a click, or Enter/Space on the focused cell, fires\n`lr-cell-click`. `annotations` additionally strokes a ring around\nspecific cells (e.g. to call out an anomaly), each one optionally\nsurfaced in the legend too via `[part=\"legend-annotation\"]`.\n\n`legendStops` swaps the legend's two-endpoint gradient bar for a discrete\nkey of swatches, so a consumer whose `cellColor` callback paints an\nentirely different domain than the `--lr-heatmap-scale-lo`/`-hi` ramp can\nkeep the built-in legend (labels, number formatting, annotation entries)\ninstead of hiding `[part=\"legend\"]` and hand-rolling swatches. It is\npresentation only — it never feeds back into the cell colors.\n\nSet `accessibleCells` when each cell needs a persistent DOM control for\nassistive technology. The opt-in overlay uses native buttons with a\nroving tabindex, localized `aria-label`, and explicit `aria-pressed` state\nderived from the controlled `selectedCell` property; the canvas remains the\nvisual rendering surface underneath.\n\n`columnX` (calendar mode only) overrides the x-origin computed for each\nweek column — drawing, hit-testing, the focus ring, and month-label\npositioning all consult it consistently, so a consumer can pixel-align a\ncalendar's week columns with a sibling chart's coordinate system. Unset\n(the default) keeps the original evenly-spaced formula. `rowY` is its\ncalendar-mode vertical analogue — overrides the y-origin computed for each\nweekday row, consulted consistently by drawing, hit-testing, and the focus\nring via the private `rowYFor()` helper (mirroring `columnXFor()` exactly).\n\n`firstDayOfWeek` (calendar mode only, default `0`/Sunday, no-op in matrix\nmode) anchors the calendar grid at a different weekday — `0`-`6`, same\nnumbering as `CalendarCellPos.weekday` (`0` Sunday .. `6` Saturday) —\nthreaded into `buildCalendarGrid()`.\n\n`cellSize`/`fitToWidth` (previously matrix-mode only) also drive calendar\nmode's per-cell size: unset, calendar mode keeps today's original 11px\ncell size unchanged; explicitly set, the same fixed size (or, with\n`fitToWidth`, the same host-width-derived size matrix mode already\nsupports) governs calendar mode's grid too.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The heatmap wrapper. |\n| `canvas` | The heatmap canvas. |\n| `cell` | An opt-in native button for one matrix or calendar cell. |\n| `cells` | The opt-in per-cell accessibility overlay. |\n| `legend` | The color legend. |\n| `legend-annotation` | An annotation label. |\n| `legend-hi` | The high legend endpoint (omitted when `legendStops` is supplied). |\n| `legend-lo` | The low legend endpoint (omitted when `legendStops` is supplied). |\n| `legend-stop` | One discrete `legendStops` entry — swatch plus label. |\n| `legend-stop-label` | The text of one `legendStops` entry. |\n| `legend-swatch` | The color swatch of one `legendStops` entry. |\n| `live-region` | The visually hidden keyboard announcement region. |\n| `tooltip` | The hover tooltip. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-heatmap-scale-lo` (default: `var(--lr-color-brand-quiet)`) — Low endpoint of the sequential color ramp.\n- `--lr-heatmap-scale-hi` (default: `var(--lr-color-brand)`) — High endpoint of the sequential color ramp.\n- `--lr-heatmap-no-data-fill` (default: `var(--lr-color-no-data)`) — Fill for cells with no value.\n- `--lr-heatmap-label-font` — Font for axis/legend labels drawn on the canvas.\n- `--lr-heatmap-tooltip-bg` (default: `var(--lr-color-surface)`) — Hover tooltip background.\n- `--lr-heatmap-tooltip-text` (default: `var(--lr-color-text)`) — Hover tooltip text color.\n- `--lr-heatmap-focus-ring-color` (default: `var(--lr-focus-ring-color)`) — Focus ring around a focused cell.\n- `--lr-heatmap-annotation-color` (default: `var(--lr-color-danger)`) — Border color for an annotated cell.\n- `--lr-heatmap-selected-color` (default: `var(--lr-color-success)`) — Border color for the selected cell.\n- `--lr-heatmap-color-steps-gradient` (default: `linear-gradient(to right, var(--lr-heatmap-scale-lo), var(--lr-heatmap-scale-hi))`) — Gradient painted on the continuous legend bar. Set on the host by the component itself while `colorSteps` is supplied, and removed again when it is not; the fallback is the two-endpoint scale ramp."
7013
+ "value": "`<lr-heatmap>` — a Canvas heatmap with a DPR-aware, resize-aware redraw\nloop, in one of two `mode`s:\n\n- `\"matrix\"` (default): a `rowLabels` x `colLabels` grid of `values`. `-1`\n (or any non-finite value) is treated as \"no data\". `scale=\"sqrt\"`\n compresses the ramp via `sqrtStep()` so one heavy cell doesn't wash out\n the rest; the default `\"linear\"` scale maps linearly instead.\n- `\"calendar\"`: a GitHub-style Sunday-Saturday (or `firstDayOfWeek`-anchored\n — see below) x week grid built from `days`. `scale` governs its\n bucketing too: the default `\"linear\"` buckets by `quartileBucket()`\n (today's original behavior, unchanged); `\"sqrt\"` instead compresses via\n the same `sqrtStep()` magnitude compression matrix mode uses, so one\n heavy day doesn't wash out the rest. As in matrix mode, a cell whose\n `value` is negative or non-finite is treated as \"no data\" rather than\n being bucketed — as is a grid position with no matching entry in `days`\n at all (a gap in a sparse calendar).\n\n`fitToWidth` divides the host's measured width across the grid in either\nmode; `maxCellSize`/`minCellSize` bound the result, so a sparse grid in a\nwide pane cannot inflate into a few giant blocks and a year calendar in a\nnarrow one cannot collapse into hairlines. Both are ignored while\n`fitToWidth` is unset (an explicit `cellSize` is an exact request), and the\ncanvas is sized from the *clamped* size — a capped grid leaves the host's\nremaining width unfilled rather than stretching to it.\n\nThe sequential color ramp's endpoints are read from the\n`--lr-heatmap-scale-lo`/`-hi` custom properties (declared in\n`heatmap.styles.ts`) so hosts can retheme it — canvas can't consume\n`var()` directly, so they're resolved once per draw via\n`getComputedStyle`, then normalized to RGB by `resolveRgb()` (any valid\nCSS color syntax, not just hex — see its doc comment).\n\nEvery cell is independently addressable: a `pointermove` hit test over the\ncanvas shows `[part=\"tooltip\"]` with that cell's label + value (hidden on\n`pointerleave`); the canvas is `tabindex=\"0\"` with arrow-key roving focus\n(a stroked ring redrawn over the focused cell on every draw, plus a\nvisually-hidden `aria-live=\"polite\"` status announcement — avoids a\nDOM-node-per-cell overlay, which would be hundreds of nodes for a year\ncalendar); and a click, or Enter/Space on the focused cell, fires\n`lr-cell-click`. `annotations` additionally strokes a ring around\nspecific cells (e.g. to call out an anomaly), each one optionally\nsurfaced in the legend too via `[part=\"legend-annotation\"]`.\n\nIn calendar mode every cell position handed to `cellText`, `cellColor` and\n`cellInteractive` is a `CalendarCellPos` carrying the resolved ISO\n`yyyy-mm-dd` `date` alongside `week`/`weekday` — including for a grid\nposition with no entry in `days` at all — so a callback can key off the\ndate without re-deriving the grid's own anchor arithmetic.\n\n`legendStops` swaps the legend's two-endpoint gradient bar for a discrete\nkey of swatches, so a consumer whose `cellColor` callback paints an\nentirely different domain than the `--lr-heatmap-scale-lo`/`-hi` ramp can\nkeep the built-in legend (labels, number formatting, annotation entries)\ninstead of hiding `[part=\"legend\"]` and hand-rolling swatches. It is\npresentation only — it never feeds back into the cell colors.\n\nSet `accessibleCells` when each cell needs a persistent DOM control for\nassistive technology. The opt-in overlay uses native buttons with a\nroving tabindex, localized `aria-label`, and explicit `aria-pressed` state\nderived from the controlled `selectedCell` property; the canvas remains the\nvisual rendering surface underneath.\n\n`columnX` (calendar mode only) overrides the x-origin computed for each\nweek column — drawing, hit-testing, the focus ring, and month-label\npositioning all consult it consistently, so a consumer can pixel-align a\ncalendar's week columns with a sibling chart's coordinate system. Unset\n(the default) keeps the original evenly-spaced formula. `rowY` is its\ncalendar-mode vertical analogue — overrides the y-origin computed for each\nweekday row, consulted consistently by drawing, hit-testing, and the focus\nring via the private `rowYFor()` helper (mirroring `columnXFor()` exactly).\n\n`firstDayOfWeek` (calendar mode only, default `0`/Sunday, no-op in matrix\nmode) anchors the calendar grid at a different weekday — `0`-`6`, same\nnumbering as `CalendarCellPos.weekday` (`0` Sunday .. `6` Saturday) —\nthreaded into `buildCalendarGrid()`.\n\n`cellSize`/`fitToWidth` (previously matrix-mode only) also drive calendar\nmode's per-cell size: unset, calendar mode keeps today's original 11px\ncell size unchanged; explicitly set, the same fixed size (or, with\n`fitToWidth`, the same host-width-derived size matrix mode already\nsupports) governs calendar mode's grid too.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The heatmap wrapper. |\n| `canvas` | The heatmap canvas. |\n| `cell` | An opt-in native button for one matrix or calendar cell. |\n| `cells` | The opt-in per-cell accessibility overlay. |\n| `legend` | The color legend. |\n| `legend-annotation` | An annotation label. |\n| `legend-hi` | The high legend endpoint (omitted when `legendStops` is supplied). |\n| `legend-lo` | The low legend endpoint (omitted when `legendStops` is supplied). |\n| `legend-stop` | One discrete `legendStops` entry — swatch plus label. |\n| `legend-stop-label` | The text of one `legendStops` entry. |\n| `legend-swatch` | The color swatch of one `legendStops` entry. Not rendered at all for a caption-only stop (one with no `color`). |\n| `legend-value-label` | The trailing `valueLabel` caption that closes the legend row, in both the gradient and the `legendStops` branch. |\n| `live-region` | The visually hidden keyboard announcement region. |\n| `tooltip` | The hover tooltip. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-heatmap-scale-lo` (default: `var(--lr-color-brand-quiet)`) — Low endpoint of the sequential color ramp.\n- `--lr-heatmap-scale-hi` (default: `var(--lr-color-brand)`) — High endpoint of the sequential color ramp.\n- `--lr-heatmap-no-data-fill` (default: `var(--lr-color-no-data)`) — Fill for cells with no value.\n- `--lr-heatmap-label-font` — Font for axis/legend labels drawn on the canvas.\n- `--lr-heatmap-tooltip-bg` (default: `var(--lr-color-surface)`) — Hover tooltip background.\n- `--lr-heatmap-tooltip-text` (default: `var(--lr-color-text)`) — Hover tooltip text color.\n- `--lr-heatmap-focus-ring-color` (default: `var(--lr-focus-ring-color)`) — Focus ring around a focused cell.\n- `--lr-heatmap-annotation-color` (default: `var(--lr-color-danger)`) — Border color for an annotated cell.\n- `--lr-heatmap-selected-color` (default: `var(--lr-color-success)`) — Border color for the selected cell.\n- `--lr-heatmap-color-steps-gradient` (default: `linear-gradient(to right, var(--lr-heatmap-scale-lo), var(--lr-heatmap-scale-hi))`) — Gradient painted on the continuous legend bar. Set on the host by the component itself while `colorSteps` is supplied, and removed again when it is not; the fallback is the two-endpoint scale ramp."
6881
7014
  },
6882
7015
  "attributes": [
6883
7016
  {
@@ -6922,6 +7055,20 @@
6922
7055
  "value": "Optional locale override. Otherwise the nearest `locale`/`lang` ancestor is used.\n\nType: `string` \nDefault: `''`"
6923
7056
  }
6924
7057
  },
7058
+ {
7059
+ "name": "max-cell-size",
7060
+ "description": {
7061
+ "kind": "markdown",
7062
+ "value": "Ceiling (CSS px) on the cell size `fitToWidth` derives from the host width, in **both** modes.\nIgnored entirely while `fitToWidth` is unset — an explicit `cellSize` is never clamped, since\nit is already an exact request.\n\nExists because `fitToWidth` divides the whole host width across the grid: a 5-week calendar or\na 3-column matrix in a wide pane produces enormous cells. Capping them keeps the cell a cell.\nThe canvas is sized *from the clamped cell size*, so a capped grid deliberately leaves the\nremaining host width unfilled (the canvas simply ends early) rather than stretching to fill it\n— position it with normal CSS on the host if you want it centered or end-aligned.\n\nUnset (the default) reproduces today's exact fit-to-width behavior. Clamped to at least the\nbuilt-in `4`px floor; a non-finite value (or an empty attribute) means unset rather than `0`.\nWhen both clamps are set and `maxCellSize < minCellSize`, the ceiling wins — the same\nprecedence `finiteRange()` itself applies.\n\nType: `number | undefined`"
7063
+ }
7064
+ },
7065
+ {
7066
+ "name": "min-cell-size",
7067
+ "description": {
7068
+ "kind": "markdown",
7069
+ "value": "Floor (CSS px) under the cell size `fitToWidth` derives from the host width, in **both** modes\n— the mirror of `maxCellSize`, and likewise ignored while `fitToWidth` is unset. Raises the\nbuilt-in `FIT_MIN_CELL` (4px) floor so a year-long calendar in a narrow pane keeps legible,\nhit-testable cells and overflows its host instead of collapsing to hairlines.\n\nCan only raise that floor, never lower it: a value below `4` normalizes to `4`. Unset (the\ndefault) reproduces today's exact fit-to-width behavior, and a non-finite value (or an empty\nattribute) means unset.\n\nType: `number | undefined`"
7070
+ }
7071
+ },
6925
7072
  {
6926
7073
  "name": "mode",
6927
7074
  "description": {
@@ -6995,7 +7142,7 @@
6995
7142
  "name": "lr-histogram",
6996
7143
  "description": {
6997
7144
  "kind": "markdown",
6998
- "value": "`<lr-histogram>` — bins `values` into `bins` equal-width buckets and\nrenders them as a bar chart. Chart.js has no built-in histogram\ncontroller; this composes `binValues()` with the plain `bar` type.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
7145
+ "value": "`<lr-histogram>` — bins `values` into `bins` equal-width buckets and\nrenders them as a bar chart. Chart.js has no built-in histogram\ncontroller; this composes `binValues()` with the plain `bar` type.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `error` | `role=\"alert\"` message shown instead of `canvas` when the optional `chart.js` peer dependency is not installed. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
6999
7146
  },
7000
7147
  "attributes": [
7001
7148
  {
@@ -7204,7 +7351,7 @@
7204
7351
  "name": "lr-icon-button",
7205
7352
  "description": {
7206
7353
  "kind": "markdown",
7207
- "value": "`<lr-icon-button>` — an accessible icon-only action button.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Optional custom icon content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `button` | Native button. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-icon-button-size` (default: `2.5rem`) — Inline and block size of the native button. A library-wide token (declared on `:root` by `tokens.styles.ts`, and the shared minimum tappable size several other components size their icon controls against), so overriding it globally resizes all of them together."
7354
+ "value": "`<lr-icon-button>` — an accessible icon-only action button.\n\nSet `icon` for one of `<lr-icon>`'s named glyphs, or slot your own content instead. Slotted\ncontent is a **sibling** of the built-in glyph rather than being piped through `<lr-icon>`, so\nany complete element — an `<svg>`, an `<img>`, an `<lr-flag>` — renders at its own natural\naspect ratio instead of being forced into a 1:1 box. Bare SVG geometry (`<path>`, `<circle>`)\nhas no SVG parent here and must be wrapped in an `<lr-icon>` or a complete `<svg>` of your own.\n\nForm-associated (mirroring `<lr-button>`'s identical shape): discoverable through\n`form.elements`, and `type=\"submit\"`/`type=\"reset\"` are handled by this component itself via\nthe host's own `closest('form')` — a shadow-internal native `<button type=\"submit\">` does not\nparticipate in an ancestor light-DOM form's submission on its own, since form-submitter\nsemantics don't cross the shadow boundary.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Optional custom icon content, rendered beside (not inside) the `icon` glyph. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `button` | Native button. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-icon-button-size` (default: `2.5rem`) — Minimum tappable inline and block size of the native button — a **floor**, not a fixed size: content larger than it grows the button and keeps its own aspect ratio, while a small glyph pads out to it. A library-wide token (declared on `:root` by `tokens.styles.ts`, and the shared minimum tappable size several other components size their icon controls against), so overriding it globally resizes all of them together."
7208
7355
  },
7209
7356
  "attributes": [
7210
7357
  {
@@ -7218,7 +7365,7 @@
7218
7365
  "name": "disabled",
7219
7366
  "description": {
7220
7367
  "kind": "markdown",
7221
- "value": "Type: `boolean` \nDefault: `false`"
7368
+ "value": "Type: `boolean`"
7222
7369
  }
7223
7370
  },
7224
7371
  {
@@ -7246,7 +7393,7 @@
7246
7393
  "name": "type",
7247
7394
  "description": {
7248
7395
  "kind": "markdown",
7249
- "value": "Type: `'button' | 'submit' | 'reset'` \nDefault: `'button'`"
7396
+ "value": "Forwarded to this component's own submit/reset handling (`onClick` below) — see the class\ndoc comment for why this component (not the shadow-internal `<button>`) owns that behavior.\n\nType: `'button' | 'submit' | 'reset'` \nDefault: `'button'`"
7250
7397
  },
7251
7398
  "values": [
7252
7399
  {
@@ -7317,7 +7464,7 @@
7317
7464
  "name": "lr-image-viewer",
7318
7465
  "description": {
7319
7466
  "kind": "markdown",
7320
- "value": "`<lr-image-viewer>` — full pan/zoom raster-image viewer with labeled region highlights and\nopt-in region annotation, the landing surface for `region`-anchored citations. Distinct from\n`<lr-svg-viewer>` (rendered SVG documents) and `<lr-image-comparer>` (before/after slotted\nsurfaces) — this component owns raster grounding/citation display, not comparison or vector\nrendering.\n\nAdopts `DocumentAnchorTarget` with `anchorKinds: ['region']` only — no text selection is bound\n(a raster image has no selectable text), so `lr-text-select` is never emitted by this viewer.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | None. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `annotate-toggle` | The annotation-mode toggle button. |\n| `annotation-box` | The in-progress draft rectangle. |\n| `base` | The root wrapper. |\n| `error` | The error region. |\n| `fit-control` | The fit-mode select. |\n| `frame` | The embedded `lr-zoomable-frame`. |\n| `highlight` | One highlight box (`data-tone`, `data-active`). |\n| `highlight-label` | A highlight's visible label. |\n| `highlight-layer` | The overlay hosting highlight boxes. |\n| `image` | The `<img>` element. |\n| `image-wrapper` | The rotated wrapper around the image and its overlays. |\n| `rotate-button` | The rotate-90-clockwise button. |\n| `toolbar` | The fit/rotate/annotate controls row. |"
7467
+ "value": "`<lr-image-viewer>` — full pan/zoom raster-image viewer with labeled region highlights and\nopt-in region annotation, the landing surface for `region`-anchored citations. Distinct from\n`<lr-svg-viewer>` (rendered SVG documents) and `<lr-image-comparer>` (before/after slotted\nsurfaces) — this component owns raster grounding/citation display, not comparison or vector\nrendering.\n\nAdopts `DocumentAnchorTarget` with `anchorKinds: ['region']` only — no text selection is bound\n(a raster image has no selectable text), so `lr-text-select` is never emitted by this viewer.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | None. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `annotate-toggle` | The annotation-mode toggle button. |\n| `annotation-box` | The in-progress draft rectangle. |\n| `base` | The root wrapper. |\n| `error` | The error region. |\n| `fit-control` | The fit-mode select. |\n| `frame` | The embedded `lr-zoomable-frame`. |\n| `highlight` | One highlight box (`data-tone`, `data-active`). |\n| `highlight-label` | A highlight's visible label. |\n| `highlight-layer` | The overlay hosting highlight boxes. |\n| `image` | The `<img>` element. |\n| `image-wrapper` | The rotated wrapper around the image and its overlays. |\n| `rotate-button` | The rotate-90-clockwise button. |\n| `toolbar` | The fit/rotate/annotate controls row. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-image-viewer-annotate-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of `[part=\"annotate-toggle\"]` while annotation mode is on. The toggle carries its own glyph in `--lr-color-text`, so keep a 4.5:1 ratio against it.\n- `--lr-image-viewer-annotate-active-border` (default: `var(--lr-color-brand)`) — Border color of `[part=\"annotate-toggle\"]` while annotation mode is on.\n- `--lr-image-viewer-highlight-active-color` (default: `var(--lr-color-brand)`) — Outline color of the `[part=\"highlight\"]` matching `activeHighlightId`, independent of the per-tone border colors."
7321
7468
  },
7322
7469
  "attributes": [
7323
7470
  {
@@ -7348,6 +7495,20 @@
7348
7495
  "value": "Optional locale override. Otherwise the nearest `locale`/`lang` ancestor is used.\n\nType: `string` \nDefault: `''`"
7349
7496
  }
7350
7497
  },
7498
+ {
7499
+ "name": "max-zoom",
7500
+ "description": {
7501
+ "kind": "markdown",
7502
+ "value": "Passed through to the embedded `<lr-zoomable-frame>` as `.maxZoom`. Mirrors\n`<lr-lightbox>`'s own `maxZoom`.\n\nType: `number` \nDefault: `4`"
7503
+ }
7504
+ },
7505
+ {
7506
+ "name": "min-zoom",
7507
+ "description": {
7508
+ "kind": "markdown",
7509
+ "value": "Passed through to the embedded `<lr-zoomable-frame>` as `.minZoom`. Same default as\n`<lr-zoomable-frame>` itself. Mirrors `<lr-lightbox>`'s own `minZoom` (name, default,\npass-through shape) -- both wrap the exact same `<lr-zoomable-frame>` pan/zoom surface.\n\nType: `number` \nDefault: `0.5`"
7510
+ }
7511
+ },
7351
7512
  {
7352
7513
  "name": "name",
7353
7514
  "description": {
@@ -7375,6 +7536,13 @@
7375
7536
  "kind": "markdown",
7376
7537
  "value": "Multiplier over the fit-derived base scale, delegated to the embedded zoomable-frame.\n\nType: `number` \nDefault: `1`"
7377
7538
  }
7539
+ },
7540
+ {
7541
+ "name": "zoom-step",
7542
+ "description": {
7543
+ "kind": "markdown",
7544
+ "value": "Passed through to the embedded `<lr-zoomable-frame>` as `.zoomStep`. Mirrors\n`<lr-lightbox>`'s own `zoomStep`.\n\nType: `number` \nDefault: `0.25`"
7545
+ }
7378
7546
  }
7379
7547
  ]
7380
7548
  },
@@ -7442,7 +7610,7 @@
7442
7610
  "name": "lr-input",
7443
7611
  "description": {
7444
7612
  "kind": "markdown",
7445
- "value": "`<lr-input>` — a single-line plain-text input primitive, the `lr-*` equivalent of a plain\n`wa-input`, form-associated via the `FormAssociated` mixin (same shape as `<lr-textarea>`).\n\nShips the same opt-in `label`/`hint`/`errorText` form-control chrome as `<lr-textarea>`/\n`<lr-select>` (props + matching named slots + `form-control`/`form-control-label`/`hint`/`error`\nparts) — left unset, the chrome stays hidden. `size` uses the same `xs`–`xl` scale as\n`<lr-select>`/`<lr-combobox>`. `type=\"password\"` always renders a\n`password-toggle` eye-icon button that flips the internal native input between\n`type=\"password\"`/`type=\"text\"` and tracks `passwordVisible`. `type=\"email\"`/`type=\"number\"`\n(with `min`/`max`/`step`) delegate constraint validation to the internal native `<input>`'s own\nbrowser-computed `validity`, bridged into this element's `ElementInternals` by `updateValidity()`.\n`type=\"search\"`/`type=\"time\"` forward straight through to the native input with no additional\nchrome or validation, the same as `type=\"text\"`.\n\nA host `aria-label` is forwarded to the internal textbox via the typed `accessibleLabel` property;\nexternal `aria-labelledby`/`aria-describedby` idrefs are not copied across the shadow boundary.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `end` | Adornment after the native input and built-in actions. |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n| `start` | Adornment before the native input. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `clear-button` | The clear action, rendered for non-empty clearable text/search inputs. |\n| `end` | Wrapper around the `end` adornment slot. |\n| `error` | The error message. |\n| `form-control` | The outer wrapper around label, input, error and hint. |\n| `form-control-label` | The `<label>` element. |\n| `hint` | The hint message. |\n| `input` | The native `<input>` element. |\n| `input-wrapper` | The row wrapping the native input and the password-toggle button. |\n| `password-toggle` | The show/hide-password button, present only when `type=\"password\"`. |\n| `start` | Wrapper around the `start` adornment slot. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-input-control-min-height` — Outer control height floor, scaled by `size`.\n- `--lr-input-padding-block` — Block padding of the native input, scaled by `size`.\n- `--lr-input-padding-inline` — Inline padding of the control row, scaled by `size`.\n- `--lr-input-font-size` — Font size of the native input, scaled by `size`."
7613
+ "value": "`<lr-input>` — a single-line plain-text input primitive, the `lr-*` equivalent of a plain\n`wa-input`, form-associated via the `FormAssociated` mixin (same shape as `<lr-textarea>`).\n\nShips the same opt-in `label`/`hint`/`errorText` form-control chrome as `<lr-textarea>`/\n`<lr-select>` (props + matching named slots + `form-control`/`form-control-label`/`hint`/`error`\nparts) — left unset, the chrome stays hidden. `size` uses the same `xs`–`xl` scale as\n`<lr-select>`/`<lr-combobox>`. `type=\"password\"` always renders a\n`password-toggle` eye-icon button that flips the internal native input between\n`type=\"password\"`/`type=\"text\"` and tracks `passwordVisible`. `type=\"email\"`/`type=\"number\"`\n(with `min`/`max`/`step`) delegate constraint validation to the internal native `<input>`'s own\nbrowser-computed `validity`, bridged into this element's `ElementInternals` by `updateValidity()`.\n`type=\"search\"`/`type=\"time\"` forward straight through to the native input with no additional\nchrome or validation, the same as `type=\"text\"`.\n\nA host `aria-label` is forwarded to the internal textbox via the typed `accessibleLabel` property;\nexternal `aria-labelledby`/`aria-describedby` idrefs are not copied across the shadow boundary.\n\nForwards the full native selection/editing surface (`selectionStart`/`selectionEnd`,\n`setSelectionRange()`, `setRangeText()`), the same as `<lr-textarea>`, in addition to\n`focus()`/`blur()`/`select()`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `end` | Adornment after the native input and built-in actions. |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n| `start` | Adornment before the native input. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `clear-button` | The clear action, rendered for non-empty clearable text/search inputs. |\n| `end` | Wrapper around the `end` adornment slot. |\n| `error` | The error message. |\n| `form-control` | The outer wrapper around label, input, error and hint. |\n| `form-control-label` | The `<label>` element. |\n| `hint` | The hint message. |\n| `input` | The native `<input>` element. |\n| `input-wrapper` | The row wrapping the native input and the password-toggle button. |\n| `password-toggle` | The show/hide-password button, present only when `type=\"password\"`. |\n| `start` | Wrapper around the `start` adornment slot. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-input-control-min-height` — Outer control height floor, scaled by `size`.\n- `--lr-input-control-height` — Exact outer control height. Unset by default, which leaves `--lr-input-control-min-height` as a floor only; set it to a length to both floor and cap the control row (e.g. to pixel-match `<lr-select>`/`<lr-combobox>` in the same toolbar). Because it is never declared by the component itself, it can be set from an ancestor or an outer-tree rule as well as inline on the element.\n- `--lr-input-padding-block` — Block padding of the native input, scaled by `size`.\n- `--lr-input-padding-inline` — Inline padding of the control row, scaled by `size`.\n- `--lr-input-font-size` — Font size of the native input, scaled by `size`."
7446
7614
  },
7447
7615
  "attributes": [
7448
7616
  {
@@ -7621,7 +7789,7 @@
7621
7789
  "name": "lr-json-viewer",
7622
7790
  "description": {
7623
7791
  "kind": "markdown",
7624
- "value": "`<lr-json-viewer>` — a collapsible, copyable tree view for an arbitrary\nJSON-serializable value (object/array/string/number/boolean/null/\nundefined). Serves as the fallback renderer wherever a raw payload (tool\ncall arguments, a tool result, an API response) needs inspecting without a\nbespoke view.\n\nExpand/collapse state is keyed by structural path (not by object identity),\nso it survives a `data` reassignment that keeps the same shape -- e.g. a\nstreaming tool result being patched in place.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root scroll container; respects `max-height`. |\n| `bracket` | A `{`, `}`, `[`, or `]` delimiter. |\n| `copy-button` | A copy-to-clipboard button -- the top-level one (in `toolbar`, labelled \"Copy JSON to clipboard\") or a per-node one (only rendered when `copyable`; labelled with its own key/type, e.g. \"Copy age\", so assistive tech can tell rows apart). |\n| `key` | An object property key or array index label. |\n| `toggle` | A container node's expand/collapse button (hidden, but present for row alignment, on leaf/empty nodes). |\n| `toolbar` | The wrapper around the top-level copy button (only rendered when `copyable`). |\n| `tree` | The wrapper around the rendered node tree. |\n| `value` | A primitive value's text -- carries `data-type` (`string`/`number`/`boolean`/`null`/`undefined`, or `circular` for a self-reference marker in place of a re-visited container's subtree) for per-type coloring, `data-match` while it matches `search`, and `data-active` while it is the current `searchNext()`/`searchPrevious()` cursor position. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-json-viewer-max-height` (default: `none`) — Cap on `[part=\"base\"]`'s block size, past which the viewer scrolls internally. The `maxHeight` property sets this token inline on `[part=\"base\"]`.\n- `--lr-json-viewer-font` (default: `var(--lr-font-mono)`) — Font family used for the rendered tree."
7792
+ "value": "`<lr-json-viewer>` — a collapsible, copyable tree view for an arbitrary\nJSON-serializable value (object/array/string/number/boolean/null/\nundefined). Serves as the fallback renderer wherever a raw payload (tool\ncall arguments, a tool result, an API response) needs inspecting without a\nbespoke view.\n\nExpand/collapse state is keyed by structural path (not by object identity),\nso it survives a `data` reassignment that keeps the same shape -- e.g. a\nstreaming tool result being patched in place.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root scroll container; respects `max-height`. |\n| `bracket` | A `{`, `}`, `[`, or `]` delimiter. |\n| `copy-button` | A copy-to-clipboard button -- the top-level one (in `toolbar`, labelled \"Copy JSON to clipboard\") or a per-node one (only rendered when `copyable`; labelled with its own key/type, e.g. \"Copy age\", so assistive tech can tell rows apart). |\n| `key` | An object property key or array index label. |\n| `toggle` | A container node's expand/collapse button (hidden, but present for row alignment, on leaf/empty nodes). |\n| `toolbar` | The wrapper around the top-level copy button (only rendered when `copyable`). |\n| `tree` | The wrapper around the rendered node tree. |\n| `value` | A primitive value's text -- carries `data-type` (`string`/`number`/`boolean`/`null`/`undefined`, or `circular` for a self-reference marker in place of a re-visited container's subtree) for per-type coloring, `data-match` while it matches `search`, and `data-active` while it is the current `searchNext()`/`searchPrevious()` cursor position. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-json-viewer-max-height` (default: `none`) — Cap on `[part=\"base\"]`'s block size, past which the viewer scrolls internally. The `maxHeight` property sets this token inline on `[part=\"base\"]`.\n- `--lr-json-viewer-font` (default: `var(--lr-font-mono)`) — Font family used for the rendered tree.\n- `--lr-json-viewer-match-bg` (default: `var(--lr-color-warning-quiet)`) — Background (and surrounding box-shadow) of a key/value that currently matches `search`."
7625
7793
  },
7626
7794
  "attributes": [
7627
7795
  {
@@ -7709,7 +7877,7 @@
7709
7877
  "name": "label",
7710
7878
  "description": {
7711
7879
  "kind": "markdown",
7712
- "value": "Heading text and the table's accessible name. Falls back to a localized default.\n\nType: `string` \nDefault: `''`"
7880
+ "value": "Heading text and the table's accessible name (unless overridden by a host `aria-label`).\nFalls back to a localized default.\n\nType: `string` \nDefault: `''`"
7713
7881
  }
7714
7882
  },
7715
7883
  {
@@ -7802,7 +7970,7 @@
7802
7970
  "name": "lr-known-date",
7803
7971
  "description": {
7804
7972
  "kind": "markdown",
7805
- "value": "`<lr-known-date>` — a date a user already knows (a birthdate, a passport\nissue/expiry date) collected as three plain, labeled day/month/year number\nfields in the locale's natural field order, rather than a calendar popup.\nForm-associated; the submitted form value is always canonical ISO 8601\n(`YYYY-MM-DD`), or `''` while any field is blank or the combination isn't a\nreal calendar date. Mirrors Web Awesome's `wa-known-date` API surface under\n`lr-`, with `appearance`/`pill`/`form` dropped and `size` normalized to\nthis library's own `xs`–`xl` scale, matching every other lyra form control\nmirrored from a Web Awesome counterpart.\n\nA field's own `<input>` shows exactly what was typed (never reformatted or\nreverted) -- only the composite `value` is zero-padded. Auto-advance\n(typing a field's last digit moves focus to the next field) and\nbackspace-to-previous-field-when-empty are this library's own additions on\ntop of Web Awesome's bare typing model, which documents no auto-advance;\ndon't remove them to \"restore\" WA parity. Arrow-key field-to-field\nnavigation at a field's text boundary is RTL-aware: the *physical* key that\nmeans \"toward the next field\" flips under an inherited `dir=\"rtl\"`, while\nthe field order itself (locale-derived) does not. Non-digit keystrokes are\nrejected before they reach a field's state -- no locale-specific numeral\ninput (e.g. Arabic-Indic digits) is supported.\n\nNo resizable text-editing surface exists (three fixed-width digit fields),\nso resize forwarding doesn't apply, and `spellcheck`/`autocapitalize`/\n`autocorrect`/`wrap` don't meaningfully apply to 2–4-digit numeric fields\neither -- the same carve-out `lr-input[type=\"number\"]` already documents.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `error` | Custom error content, alongside the `errorText` attribute. |\n| `hint` | Custom hint content, alongside the `hint` attribute. |\n| `label` | Custom label/legend content, alongside the `label` attribute. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `error` | The validation message. |\n| `field` | Each field block (label + input), repeated three times; distinguished by `data-field=\"day\"\\|\"month\"\\|\"year\"`. |\n| `field-input` | The native per-field `<input type=\"text\" inputmode=\"numeric\">`, repeated three times; distinguished by `data-field=\"day\"\\|\"month\"\\|\"year\"`. |\n| `field-label` | The small visible per-field text label (\"Day\"/\"Month\"/\"Year\"). |\n| `fields` | The row wrapping the three field blocks. |\n| `fieldset` | The `<fieldset>` grouping the three fields. |\n| `form-control` | The outer wrapper around legend, fieldset, hint, and error. |\n| `hint` | The hint message. |\n| `legend` | The `<legend>` element. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-known-date-field-padding-block` (default: `var(--lr-space-s)`) — Block padding of each `field-input`, auto-swapped per `size`.\n- `--lr-known-date-field-padding-inline` (default: `var(--lr-space-s)`) — Inline padding of each `field-input`, auto-swapped per `size`.\n- `--lr-known-date-field-font-size` (default: `var(--lr-font-size-md-sm)`) — Font size of each `field-input`, auto-swapped per `size`.\n- `--lr-known-date-field-gap` (default: `var(--lr-space-s)`) — Gap between the three field blocks.\n- `--lr-known-date-day-field-width` (default: `var(--lr-size-3-5em)`) — Inline size of the day field.\n- `--lr-known-date-month-field-width` (default: `var(--lr-size-3-5em)`) — Inline size of the month field.\n- `--lr-known-date-year-field-width` (default: `var(--lr-size-5em)`) — Inline size of the year field."
7973
+ "value": "`<lr-known-date>` — a date a user already knows (a birthdate, a passport\nissue/expiry date) collected as three plain, labeled day/month/year number\nfields in the locale's natural field order, rather than a calendar popup.\nForm-associated; the submitted form value is always canonical ISO 8601\n(`YYYY-MM-DD`), or `''` while any field is blank or the combination isn't a\nreal calendar date. Mirrors Web Awesome's `wa-known-date` API surface under\n`lr-`, with `appearance`/`pill`/`form` dropped and `size` normalized to\nthis library's own `xs`–`xl` scale, matching every other lyra form control\nmirrored from a Web Awesome counterpart.\n\nA field's own `<input>` shows exactly what was typed (never reformatted or\nreverted) -- only the composite `value` is zero-padded. Auto-advance\n(typing a field's last digit moves focus to the next field) and\nbackspace-to-previous-field-when-empty are this library's own additions on\ntop of Web Awesome's bare typing model, which documents no auto-advance;\ndon't remove them to \"restore\" WA parity. Arrow-key field-to-field\nnavigation at a field's text boundary is RTL-aware: the *physical* key that\nmeans \"toward the next field\" flips under an inherited `dir=\"rtl\"`, while\nthe field order itself (locale-derived) does not. Non-digit keystrokes are\nrejected before they reach a field's state -- no locale-specific numeral\ninput (e.g. Arabic-Indic digits) is supported.\n\nNo resizable text-editing surface exists (three fixed-width digit fields),\nso resize forwarding doesn't apply, and `spellcheck`/`autocapitalize`/\n`autocorrect`/`wrap` don't meaningfully apply to 2–4-digit numeric fields\neither -- the same carve-out `lr-input[type=\"number\"]` already documents.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `error` | Custom error content, alongside the `errorText` attribute. |\n| `hint` | Custom hint content, alongside the `hint` attribute. |\n| `label` | Custom label/legend content, alongside the `label` attribute. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `error` | The validation message. |\n| `field` | Each field block (label + input), repeated three times; distinguished by `data-field=\"day\"\\|\"month\"\\|\"year\"`. |\n| `field-input` | The native per-field `<input type=\"text\" inputmode=\"numeric\">`, repeated three times; distinguished by `data-field=\"day\"\\|\"month\"\\|\"year\"`. |\n| `field-label` | The small visible per-field text label (\"Day\"/\"Month\"/\"Year\"). |\n| `fields` | The row wrapping the three field blocks. |\n| `fieldset` | The `<fieldset>` grouping the three fields. |\n| `form-control` | The outer wrapper around legend, fieldset, hint, and error. |\n| `hint` | The hint message. |\n| `legend` | The `<legend>` element. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-known-date-field-padding-block` (default: `var(--lr-space-s)`) — Block padding of each `field-input`, auto-swapped per `size`.\n- `--lr-known-date-field-padding-inline` (default: `var(--lr-space-s)`) — Inline padding of each `field-input`, auto-swapped per `size`.\n- `--lr-known-date-field-font-size` (default: `var(--lr-font-size-md-sm)`) — Font size of each `field-input`, auto-swapped per `size`.\n- `--lr-known-date-field-min-height` (default: `var(--lr-size-2-5rem)`) — Minimum block size of each `field-input`, auto-swapped per `size` (`xs`→`1.5rem`, `s`→`1.875rem`, `l`→`3rem`, `xl`→`3.5rem`) -- matches `lr-input`'s/`lr-date-input`'s own min-height scale, so a birthdate field sitting in a form row next to those controls renders at the same height. At `xs`/`s`/`m` the floor now exceeds the field's own content height and actively pins the rendered box; at `l`/`xl` the content height already exceeds the floor, so those two tiers are unaffected.\n- `--lr-known-date-field-height` — Exact block size of each `field-input`. Undeclared by default, so the field grows to fit its content, floored by `--lr-known-date-field-min-height`. Set it to pin a fixed height.\n- `--lr-known-date-field-gap` (default: `var(--lr-space-s)`) — Gap between the three field blocks.\n- `--lr-known-date-day-field-width` (default: `var(--lr-size-3-5em)`) — Inline size of the day field.\n- `--lr-known-date-month-field-width` (default: `var(--lr-size-3-5em)`) — Inline size of the month field.\n- `--lr-known-date-year-field-width` (default: `var(--lr-size-5em)`) — Inline size of the year field.\n- `--lr-known-date-invalid-border-color` (default: `var(--lr-color-danger)`) — Border color of each `field-input` while `:host([data-invalid])` is set."
7806
7974
  },
7807
7975
  "attributes": [
7808
7976
  {
@@ -7965,7 +8133,7 @@
7965
8133
  "name": "show-counter",
7966
8134
  "description": {
7967
8135
  "kind": "markdown",
7968
- "value": "Shows/hides `part=\"counter\"` (and its `part=\"live-region\"` announcement). Mirrors\n`<lr-carousel>`'s `showIndicators` (name shape, no reflect).\n\nType: `boolean` \nDefault: `true`"
8136
+ "value": "Shows/hides `part=\"counter\"` (and its `part=\"live-region\"` announcement). Mirrors\n`<lr-carousel>`'s `showIndicators` (name shape, no reflect). Uses\nshowCounterConverter rather than Lit's default presence-based `type: Boolean`\nhandling, so a plain-HTML consumer with no way to write a `.showCounter` property binding\ncan still turn this off with `show-counter=\"false\"`.\n\nType: `boolean` \nDefault: `true`"
7969
8137
  }
7970
8138
  },
7971
8139
  {
@@ -7981,7 +8149,7 @@
7981
8149
  "name": "lr-line-chart",
7982
8150
  "description": {
7983
8151
  "kind": "markdown",
7984
- "value": "`<lr-line-chart>` — `<lr-chart>` with `type` locked to `\"line\"`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
8152
+ "value": "`<lr-line-chart>` — `<lr-chart>` with `type` locked to `\"line\"`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `error` | `role=\"alert\"` message shown instead of `canvas` when the optional `chart.js` peer dependency is not installed. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
7985
8153
  },
7986
8154
  "attributes": [
7987
8155
  {
@@ -8282,7 +8450,7 @@
8282
8450
  "name": "lr-map",
8283
8451
  "description": {
8284
8452
  "kind": "markdown",
8285
- "value": "`<lr-map>` — a maplibre-gl wrapper with a declarative legend, choropleth\nGeoJSON layer, markers, and additive `dataLayers` GeoJSON overlays\n(arbitrary shapes rendered as a source plus fill/line/circle layers,\nindependent of `choropleth`'s field/stops color-interpolation), plus a raw\n`map` escape hatch. Requires the optional peer dep `maplibre-gl`\n(consumers also import its CSS once).\n\nThe underlying `maplibregl.Map` — and the WebGL context it opens — isn't\nconstructed until this element is first visible in the viewport (tracked\nvia `IntersectionObserver`), even once the `maplibre-gl` peer dependency\nhas finished loading. Browsers hard-cap concurrent WebGL contexts per\npage, so a grid/dashboard of many `<lr-map>` instances only constructs\nthe ones actually on-screen instead of racing to exhaust that budget the\ninstant each one mounts. `map` stays `undefined` (and `lr-map-load`\ndoesn't fire) until construction actually happens.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The map wrapper. |\n| `container` | The maplibre container. |\n| `legend` | The map legend. |\n| `legend-swatch` | A legend color swatch. ⚠️ The default `mapStyle` (when unset) uses OpenStreetMap's demo tile server, which is not suitable for production traffic — see the `DEFAULT_STYLE` doc comment above. Always pass an explicit `mapStyle` in production. |"
8453
+ "value": "`<lr-map>` — a maplibre-gl wrapper with a declarative legend, choropleth\nGeoJSON layer, markers, and additive `dataLayers` GeoJSON overlays\n(arbitrary shapes rendered as a source plus fill/line/circle layers,\nindependent of `choropleth`'s field/stops color-interpolation), plus a raw\n`map` escape hatch. Requires the optional peer dep `maplibre-gl`\n(consumers also import its CSS once).\n\nThe underlying `maplibregl.Map` — and the WebGL context it opens — isn't\nconstructed until this element is first visible in the viewport (tracked\nvia `IntersectionObserver`), even once the `maplibre-gl` peer dependency\nhas finished loading. Browsers hard-cap concurrent WebGL contexts per\npage, so a grid/dashboard of many `<lr-map>` instances only constructs\nthe ones actually on-screen instead of racing to exhaust that budget the\ninstant each one mounts. `map` stays `undefined` (and `lr-map-load`\ndoesn't fire) until construction actually happens.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The map wrapper. |\n| `container` | The maplibre container. |\n| `error` | `role=\"alert\"` message shown instead of `container` if the optional `maplibre-gl` peer dependency fails to load (e.g. not installed). ⚠️ The default `mapStyle` (when unset) uses OpenStreetMap's demo tile server, which is not suitable for production traffic — see the `DEFAULT_STYLE` doc comment above. Always pass an explicit `mapStyle` in production. |\n| `legend` | The map legend. |\n| `legend-swatch` | A legend color swatch. |"
8286
8454
  },
8287
8455
  "attributes": [
8288
8456
  {
@@ -8319,7 +8487,7 @@
8319
8487
  "name": "lr-markdown",
8320
8488
  "description": {
8321
8489
  "kind": "markdown",
8322
- "value": "`<lr-markdown>` — sanitized Markdown-to-HTML rendering (GFM tables,\nfenced code blocks, links, blockquotes) built on the optional peer\ndependencies `marked` (parsing) and `dompurify` (sanitizing), both\nlazy-loaded via `markdown-loader.ts` on first connect.\n\nRendering never ships unsanitized or broken markup silently:\n- If `marked` fails to load, or throws while parsing malformed input, the\n component falls back to plain text (`white-space: pre-wrap`, no HTML\n parsing at all) and fires `lr-render-error`.\n- If `sanitize` is `true` (the default) and `dompurify` fails to load, the\n component *also* falls back to plain text + `lr-render-error` — it\n never renders marked's raw HTML output when sanitization was requested\n (or defaulted to) but is unavailable, even though `marked` itself loaded\n fine.\n- If `sanitize` is explicitly `false`, marked's raw output renders as-is\n regardless of whether `dompurify` is installed — the consumer opted out\n of sanitization, so `dompurify`'s absence is irrelevant to that path.\n\nThat same plain-text fallback rendering (`data-fallback` on the `content`\npart) is also, unconditionally and by default, a brief *transient* state on\nevery connect, not just a failure path: `connectedCallback()`'s dynamic\n`import()` of `marked`/`dompurify` (see `markdown-loader.ts`) is\nasynchronous, so the very first paint of any `<lr-markdown>` on a page\nshows plain text for at least one microtask — even when both peers are\nalready installed and load without error — until that import resolves and\na second render replaces it with the real Markdown output. Set\n`eager-load` to skip that window once the shared dependency cache is\nalready warm; see that property's doc for exactly what \"warm\" requires.\n\n`heading`/`code`/`blockquote`/`table`/`link`/`image` tokens are rendered\nthrough a `marked` renderer override that injects `part=\"...\"` attributes\ndirectly into the produced HTML — a single pass, not a second DOM walk\nafter insertion.\n\nFenced code blocks are syntax-highlighted via the same optional `shiki` peer `<lr-code-block>`\nuses (`highlightCode`, default `true` — a pure upgrade gated by whether `shiki` is installed at\nall, not a separate opt-in). `languages`/`languagesOnly` mirror `<lr-code-block>`'s own\nfine-grained bundle-size controls. The very first render of any content is always plain\n(identical to today's output); highlighting arrives as an asynchronous upgrade one render later,\nonce shiki resolves. No highlighting is attempted while `streaming` is `true` — it applies once a\nstream settles, so there is no added per-chunk cost while content is still arriving.\n\nWhen `heading-anchors` is set, every rendered heading's slug (computed via the shared\nGitHub-slugger-style `Slugger`) is stamped as its `id`; `getHeadingTree()` computes that same\noutline on every parse regardless of `heading-anchors`, so a host can build a table of contents\neven while ids aren't in the DOM yet. `scrollToAnchor()` (from the adopted `DocumentAnchorTarget`\nmixin) resolves `fragment` anchors against that outline and `text-quote` anchors via\n`internal/text-quote.ts`'s shared scope/resolve helpers; `highlights` re-resolve by quote after\nevery render (never by node identity), so a highlight painted before a `streaming` update\nfinishes still finds its quote once the matching text arrives. Highlight painting uses\n`internal/text-highlights.ts`'s `acquireHighlightHandle()` -- the CSS Custom Highlight API where\nthe browser supports it (no DOM mutation at all), a `<mark>`-wrap fallback otherwise.\n\n`math` renders `$...$`/`$$...$$` TeX as MathML via the optional `katex` peer's\n`renderToString(tex, { output: 'mathml' })` -- MathML Core renders natively and accessibly in\nevergreen browsers with no extra stylesheet or webfont needing to cross the shadow boundary. A\nmissing `katex` peer renders the literal, unparsed TeX source (delimiters included) and fires one\n`lr-render-error`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `blockquote` | Every rendered `<blockquote>`. |\n| `code-block` | Every rendered fenced/indented `<pre>`. |\n| `content` | The wrapper around the rendered (or plain-text fallback) output. |\n| `heading` | Every rendered `<h1>`–`<h6>` (shifted by `heading-offset`). |\n| `img` | Every rendered `<img>`. |\n| `inline-code` | Every rendered inline `<code>` span (backtick spans, not fenced blocks). |\n| `link` | Every rendered `<a>`. |\n| `list` | Every rendered `<ul>`/`<ol>`. |\n| `math` | A rendered inline or block math span (`data-display=\"inline\"\\|\"block\"`). |\n| `paragraph` | Every rendered `<p>`. |\n| `table` | Every rendered `<table>`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-markdown-font-mono` (default: `var(--lr-font-mono)`) — Monospace family for rendered `<code>` inside `content`."
8490
+ "value": "`<lr-markdown>` — sanitized Markdown-to-HTML rendering (GFM tables,\nfenced code blocks, links, blockquotes) built on the optional peer\ndependencies `marked` (parsing) and `dompurify` (sanitizing), both\nlazy-loaded via `markdown-loader.ts` on first connect.\n\nRendering never ships unsanitized or broken markup silently:\n- If `marked` fails to load, or throws while parsing malformed input, the\n component falls back to plain text (`white-space: pre-wrap`, no HTML\n parsing at all) and fires `lr-render-error`.\n- If `sanitize` is `true` (the default) and `dompurify` fails to load, the\n component *also* falls back to plain text + `lr-render-error` — it\n never renders marked's raw HTML output when sanitization was requested\n (or defaulted to) but is unavailable, even though `marked` itself loaded\n fine.\n- If `sanitize` is explicitly `false`, marked's raw output renders as-is\n regardless of whether `dompurify` is installed — the consumer opted out\n of sanitization, so `dompurify`'s absence is irrelevant to that path.\n\nThat same plain-text fallback rendering (`data-fallback` on the `content`\npart) is also, unconditionally and by default, a brief *transient* state on\nevery connect, not just a failure path: `connectedCallback()`'s dynamic\n`import()` of `marked`/`dompurify` (see `markdown-loader.ts`) is\nasynchronous, so the very first paint of any `<lr-markdown>` on a page\nshows plain text for at least one microtask — even when both peers are\nalready installed and load without error — until that import resolves and\na second render replaces it with the real Markdown output. Set\n`eager-load` to skip that window once the shared dependency cache is\nalready warm; see that property's doc for exactly what \"warm\" requires.\n\n`heading`/`code`/`blockquote`/`table`/`link`/`image` tokens are rendered\nthrough a `marked` renderer override that injects `part=\"...\"` attributes\ndirectly into the produced HTML — a single pass, not a second DOM walk\nafter insertion.\n\nFenced code blocks are syntax-highlighted via the same optional `shiki` peer `<lr-code-block>`\nuses (`highlightCode`, default `true` — a pure upgrade gated by whether `shiki` is installed at\nall, not a separate opt-in). `languages`/`languagesOnly` mirror `<lr-code-block>`'s own\nfine-grained bundle-size controls. The very first render of any content is always plain\n(identical to today's output); highlighting arrives as an asynchronous upgrade one render later,\nonce shiki resolves. No highlighting is attempted while `streaming` is `true` — it applies once a\nstream settles, so there is no added per-chunk cost while content is still arriving.\n\nWhen `heading-anchors` is set, every rendered heading's slug (computed via the shared\nGitHub-slugger-style `Slugger`) is stamped as its `id`; `getHeadingTree()` computes that same\noutline on every parse regardless of `heading-anchors`, so a host can build a table of contents\neven while ids aren't in the DOM yet. `scrollToAnchor()` (from the adopted `DocumentAnchorTarget`\nmixin) resolves `fragment` anchors against that outline and `text-quote` anchors via\n`internal/text-quote.ts`'s shared scope/resolve helpers; `highlights` re-resolve by quote after\nevery render (never by node identity), so a highlight painted before a `streaming` update\nfinishes still finds its quote once the matching text arrives. Highlight painting uses\n`internal/text-highlights.ts`'s `acquireHighlightHandle()` -- the CSS Custom Highlight API where\nthe browser supports it (no DOM mutation at all), a `<mark>`-wrap fallback otherwise.\n\n`math` renders `$...$`/`$$...$$` TeX as MathML via the optional `katex` peer's\n`renderToString(tex, { output: 'mathml' })` -- MathML Core renders natively and accessibly in\nevergreen browsers with no extra stylesheet or webfont needing to cross the shadow boundary. A\nmissing `katex` peer renders the literal, unparsed TeX source (delimiters included) and fires one\n`lr-render-error`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `blockquote` | Every rendered `<blockquote>`. |\n| `code-block` | Every rendered fenced/indented `<pre>`. |\n| `content` | The wrapper around the rendered (or plain-text fallback) output. |\n| `heading` | Every rendered `<h1>`–`<h6>` (shifted by `heading-offset`). |\n| `img` | Every rendered `<img>`. |\n| `inline-code` | Every rendered inline `<code>` span (backtick spans, not fenced blocks). |\n| `link` | Every rendered `<a>`. |\n| `list` | Every rendered `<ul>`/`<ol>`. |\n| `math` | A rendered inline or block math span (`data-display=\"inline\"\\|\"block\"`). |\n| `paragraph` | Every rendered `<p>`. |\n| `table` | Every rendered `<table>`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-markdown-font-mono` (default: `var(--lr-font-mono)`) — Monospace family for rendered `<code>` inside `content`.\n- `--lr-code-block-tab-size` (default: `2`) — Tab width for a rendered fenced/indented `code-block`. Deliberately the same token (and default) `lr-code-block` and `lr-code-editor` use, so a consumer sets one tab width for every code surface — it is declared here rather than inherited because `lr-code-block` is a sibling element, not an ancestor. A markdown code block wraps (`white-space: pre-wrap`) while `lr-code-block` does not, so the same value can render differently on a wrapped line, where tab stops restart."
8323
8491
  },
8324
8492
  "attributes": [
8325
8493
  {
@@ -8426,7 +8594,7 @@
8426
8594
  "name": "lr-markdown-core",
8427
8595
  "description": {
8428
8596
  "kind": "markdown",
8429
- "value": "`<lr-markdown-core>` — a build-lean variant of `<lr-markdown>` for a consumer whose\n`languages` map already covers every language it will ever render. Every other capability (GFM\ntables, fenced code blocks, links, blockquotes, heading anchors, text-quote highlights, math) is\nidentical to `<lr-markdown>` -- only fenced-code-block highlighting differs: this component's\nown module never textually contains a call to (or import of) `loadShikiHighlighter` (the\n~200-language default dynamic-import table `<lr-markdown>` calls unconditionally unless its\n*runtime* `languagesOnly` flag is `true` -- a flag on that same module a bundler can't prove\nalways-true, so the unconditional call stays in the build output regardless). A consumer\nimporting this entry point instead of `markdown.js` gets a genuinely shiki-full-table-free\nbuild. A fenced block whose language isn't a key in `languages` always renders the plain-text\nfallback -- there is no default/full-table highlighter here to fall back to, mirroring\n`<lr-code-block-core>`'s identical contract for the sibling component.\n\nBuilt on the optional peer dependencies `marked` (parsing) and `dompurify` (sanitizing), both\nlazy-loaded via `markdown-loader.ts` on first connect.\n\nRendering never ships unsanitized or broken markup silently:\n- If `marked` fails to load, or throws while parsing malformed input, the\n component falls back to plain text (`white-space: pre-wrap`, no HTML\n parsing at all) and fires `lr-render-error`.\n- If `sanitize` is `true` (the default) and `dompurify` fails to load, the\n component *also* falls back to plain text + `lr-render-error` — it\n never renders marked's raw HTML output when sanitization was requested\n (or defaulted to) but is unavailable, even though `marked` itself loaded\n fine.\n- If `sanitize` is explicitly `false`, marked's raw output renders as-is\n regardless of whether `dompurify` is installed — the consumer opted out\n of sanitization, so `dompurify`'s absence is irrelevant to that path.\n\nThat same plain-text fallback rendering (`data-fallback` on the `content`\npart) is also, unconditionally and by default, a brief *transient* state on\nevery connect, not just a failure path: `connectedCallback()`'s dynamic\n`import()` of `marked`/`dompurify` (see `markdown-loader.ts`) is\nasynchronous, so the very first paint of any `<lr-markdown>` on a page\nshows plain text for at least one microtask — even when both peers are\nalready installed and load without error — until that import resolves and\na second render replaces it with the real Markdown output. Set\n`eager-load` to skip that window once the shared dependency cache is\nalready warm; see that property's doc for exactly what \"warm\" requires.\n\n`heading`/`code`/`blockquote`/`table`/`link`/`image` tokens are rendered\nthrough a `marked` renderer override that injects `part=\"...\"` attributes\ndirectly into the produced HTML — a single pass, not a second DOM walk\nafter insertion.\n\nFenced code blocks are syntax-highlighted via the same fine-grained `shiki/core` recipe\n`<lr-code-block-core>` uses (`highlightCode`, default `true` — gated by whether a fenced\nblock's language is a key in `languages`, since there is no default highlighter here to gate on\n\"is shiki installed at all\"). The very first render of any content is always plain (identical to\n`<lr-markdown>`'s own output); highlighting arrives as an asynchronous upgrade one render\nlater, once the fine-grained highlighter resolves. No highlighting is attempted while\n`streaming` is `true` — it applies once a stream settles, so there is no added per-chunk cost\nwhile content is still arriving.\n\nWhen `heading-anchors` is set, every rendered heading's slug (computed via the shared\nGitHub-slugger-style `Slugger`) is stamped as its `id`; `getHeadingTree()` computes that same\noutline on every parse regardless of `heading-anchors`, so a host can build a table of contents\neven while ids aren't in the DOM yet. `scrollToAnchor()` (from the adopted `DocumentAnchorTarget`\nmixin) resolves `fragment` anchors against that outline and `text-quote` anchors via\n`internal/text-quote.ts`'s shared scope/resolve helpers; `highlights` re-resolve by quote after\nevery render (never by node identity), so a highlight painted before a `streaming` update\nfinishes still finds its quote once the matching text arrives. Highlight painting uses\n`internal/text-highlights.ts`'s `acquireHighlightHandle()` -- the CSS Custom Highlight API where\nthe browser supports it (no DOM mutation at all), a `<mark>`-wrap fallback otherwise.\n\n`math` renders `$...$`/`$$...$$` TeX as MathML via the optional `katex` peer's\n`renderToString(tex, { output: 'mathml' })` -- MathML Core renders natively and accessibly in\nevergreen browsers with no extra stylesheet or webfont needing to cross the shadow boundary. A\nmissing `katex` peer renders the literal, unparsed TeX source (delimiters included) and fires one\n`lr-render-error`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `blockquote` | Every rendered `<blockquote>`. |\n| `code-block` | Every rendered fenced/indented `<pre>`. |\n| `content` | The wrapper around the rendered (or plain-text fallback) output. |\n| `heading` | Every rendered `<h1>`–`<h6>` (shifted by `heading-offset`). |\n| `img` | Every rendered `<img>`. |\n| `inline-code` | Every rendered inline `<code>` span (backtick spans, not fenced blocks). |\n| `link` | Every rendered `<a>`. |\n| `list` | Every rendered `<ul>`/`<ol>`. |\n| `math` | A rendered inline or block math span (`data-display=\"inline\"\\|\"block\"`). |\n| `paragraph` | Every rendered `<p>`. |\n| `table` | Every rendered `<table>`. |"
8597
+ "value": "`<lr-markdown-core>` — a build-lean variant of `<lr-markdown>` for a consumer whose\n`languages` map already covers every language it will ever render. Every other capability (GFM\ntables, fenced code blocks, links, blockquotes, heading anchors, text-quote highlights, math) is\nidentical to `<lr-markdown>` -- only fenced-code-block highlighting differs: this component's\nown module never textually contains a call to (or import of) `loadShikiHighlighter` (the\n~200-language default dynamic-import table `<lr-markdown>` calls unconditionally unless its\n*runtime* `languagesOnly` flag is `true` -- a flag on that same module a bundler can't prove\nalways-true, so the unconditional call stays in the build output regardless). A consumer\nimporting this entry point instead of `markdown.js` gets a genuinely shiki-full-table-free\nbuild. A fenced block whose language isn't a key in `languages` always renders the plain-text\nfallback -- there is no default/full-table highlighter here to fall back to, mirroring\n`<lr-code-block-core>`'s identical contract for the sibling component.\n\nBuilt on the optional peer dependencies `marked` (parsing) and `dompurify` (sanitizing), both\nlazy-loaded via `markdown-loader.ts` on first connect.\n\nRendering never ships unsanitized or broken markup silently:\n- If `marked` fails to load, or throws while parsing malformed input, the\n component falls back to plain text (`white-space: pre-wrap`, no HTML\n parsing at all) and fires `lr-render-error`.\n- If `sanitize` is `true` (the default) and `dompurify` fails to load, the\n component *also* falls back to plain text + `lr-render-error` — it\n never renders marked's raw HTML output when sanitization was requested\n (or defaulted to) but is unavailable, even though `marked` itself loaded\n fine.\n- If `sanitize` is explicitly `false`, marked's raw output renders as-is\n regardless of whether `dompurify` is installed — the consumer opted out\n of sanitization, so `dompurify`'s absence is irrelevant to that path.\n\nThat same plain-text fallback rendering (`data-fallback` on the `content`\npart) is also, unconditionally and by default, a brief *transient* state on\nevery connect, not just a failure path: `connectedCallback()`'s dynamic\n`import()` of `marked`/`dompurify` (see `markdown-loader.ts`) is\nasynchronous, so the very first paint of any `<lr-markdown>` on a page\nshows plain text for at least one microtask — even when both peers are\nalready installed and load without error — until that import resolves and\na second render replaces it with the real Markdown output. Set\n`eager-load` to skip that window once the shared dependency cache is\nalready warm; see that property's doc for exactly what \"warm\" requires.\n\n`heading`/`code`/`blockquote`/`table`/`link`/`image` tokens are rendered\nthrough a `marked` renderer override that injects `part=\"...\"` attributes\ndirectly into the produced HTML — a single pass, not a second DOM walk\nafter insertion.\n\nFenced code blocks are syntax-highlighted via the same fine-grained `shiki/core` recipe\n`<lr-code-block-core>` uses (`highlightCode`, default `true` — gated by whether a fenced\nblock's language is a key in `languages`, since there is no default highlighter here to gate on\n\"is shiki installed at all\"). The very first render of any content is always plain (identical to\n`<lr-markdown>`'s own output); highlighting arrives as an asynchronous upgrade one render\nlater, once the fine-grained highlighter resolves. No highlighting is attempted while\n`streaming` is `true` — it applies once a stream settles, so there is no added per-chunk cost\nwhile content is still arriving.\n\nWhen `heading-anchors` is set, every rendered heading's slug (computed via the shared\nGitHub-slugger-style `Slugger`) is stamped as its `id`; `getHeadingTree()` computes that same\noutline on every parse regardless of `heading-anchors`, so a host can build a table of contents\neven while ids aren't in the DOM yet. `scrollToAnchor()` (from the adopted `DocumentAnchorTarget`\nmixin) resolves `fragment` anchors against that outline and `text-quote` anchors via\n`internal/text-quote.ts`'s shared scope/resolve helpers; `highlights` re-resolve by quote after\nevery render (never by node identity), so a highlight painted before a `streaming` update\nfinishes still finds its quote once the matching text arrives. Highlight painting uses\n`internal/text-highlights.ts`'s `acquireHighlightHandle()` -- the CSS Custom Highlight API where\nthe browser supports it (no DOM mutation at all), a `<mark>`-wrap fallback otherwise.\n\n`math` renders `$...$`/`$$...$$` TeX as MathML via the optional `katex` peer's\n`renderToString(tex, { output: 'mathml' })` -- MathML Core renders natively and accessibly in\nevergreen browsers with no extra stylesheet or webfont needing to cross the shadow boundary. A\nmissing `katex` peer renders the literal, unparsed TeX source (delimiters included) and fires one\n`lr-render-error`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `blockquote` | Every rendered `<blockquote>`. |\n| `code-block` | Every rendered fenced/indented `<pre>`. |\n| `content` | The wrapper around the rendered (or plain-text fallback) output. |\n| `heading` | Every rendered `<h1>`–`<h6>` (shifted by `heading-offset`). |\n| `img` | Every rendered `<img>`. |\n| `inline-code` | Every rendered inline `<code>` span (backtick spans, not fenced blocks). |\n| `link` | Every rendered `<a>`. |\n| `list` | Every rendered `<ul>`/`<ol>`. |\n| `math` | A rendered inline or block math span (`data-display=\"inline\"\\|\"block\"`). |\n| `paragraph` | Every rendered `<p>`. |\n| `table` | Every rendered `<table>`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-code-block-tab-size` (default: `2`) — Tab width for a rendered fenced/indented `code-block`. Deliberately the same token (and default) `lr-code-block` and `lr-code-editor` use, so a consumer sets one tab width for every code surface — it is declared here rather than inherited because `lr-code-block` is a sibling element, not an ancestor. A markdown code block wraps (`white-space: pre-wrap`) while `lr-code-block` does not, so the same value can render differently on a wrapped line, where tab stops restart."
8430
8598
  },
8431
8599
  "attributes": [
8432
8600
  {
@@ -8526,7 +8694,7 @@
8526
8694
  "name": "lr-media-card",
8527
8695
  "description": {
8528
8696
  "kind": "markdown",
8529
- "value": "`<lr-media-card>` — a lightweight inline preview for one already-sent,\nalready-available attachment inside a rendered chat message body (e.g.\nplugged into `<lr-chat-message>`'s `attachments` slot, or embedded\ndirectly by a markdown/message renderer). Distinct from two other,\nsimilarly-named components in this family: `<lr-document-preview>` is a\nfuller viewer with header chrome and an async server-side-conversion\nstate machine (`status=\"converting\"`), and `<lr-attachment-chip>` is a\npre-send queued-file chip with upload progress. This component has\nneither concern — it only ever shows a `src` that's already final.\n\n**Format dispatch.** `kind` selects `'image'` (a plain `<img>`), `'video'`\n(a plain `<video controls>`), or `'file'` (an icon + filename chip with a\ndownload/open affordance). Leave `kind` unset to auto-detect from\n`mime-type` (`image/*` / `video/*` / anything else -> `'file'`);\nexplicitly setting `kind` always wins over detection.\n\n**Safe-URL checking.** `src` is validated before it's ever assigned to an\n`<img>`/`<video>` `src` or an `<a href>` — only `http:`/`https:`/`blob:`\n(plus `data:` for a *media* `src` only) or a scheme-relative/relative URL\nwith no scheme at all pass; anything else (`javascript:`, `vbscript:`,\nand similarly suspicious schemes) is rejected. `safeMediaSrc()` and\n`safeLinkHref()` share a platform-URL-based validator; their sink-specific\nallowlists explain why `data:` gets two different answers depending on\nwhere it is used. An `image`/`video` `kind` whose `src` fails the\nmedia-src check falls back to the generic file-chip rendering — this is\nthe \"plain preview unavailable state\" a dangerous URL degrades to, rather\nthan ever reaching a real media/anchor sink. That fallback also re-checks\n`src` against the stricter href allowlist for its own download affordance,\nbut since the href allowlist is a strict subset of the media-src allowlist,\nthat re-check can only ever change the outcome for a direct/auto-detected\n`kind=\"file\"` `src` — an `image`/`video` `src` that already failed the\nwider media-src check necessarily fails the narrower href check too, so\nthe fallback for those two kinds is always the plain, unclickable `span`.\n\n**The `video` case renders its open affordance separately from `base`.**\n`image`/`file` wrap their *entire* card in one native `<button>`/`<a>` —\nsafe because an `<img>` and a plain icon+text chip have no interactive\ncontent of their own to conflict with. A `<video controls>` element is\nitself interactive content (its own play/seek/volume controls), and HTML\nforbids nesting interactive content inside a `<button>`/`<a>` — doing so\nanyway would also make every click on the video's own controls bubble up\nand spuriously fire `lr-open`. So for `kind=\"video\"`, `base` is a plain,\nnon-interactive wrapper around `[part=\"media\"]`, and a small separate\n`[part=\"open-button\"]` (not one of this component's originally-scoped\nparts, added as the \"explicit view/open affordance\" the class is free to\nprovide) is the thing that actually fires `lr-open`.\n\n**Navigation.** This component never navigates on its own for `image`/\n`video` — activating the card only fires `lr-open`; a host decides what\n\"open\" means (a lightbox, a new tab, whatever). The `file`-chip case is\nthe one exception: when `src` passes the (stricter) href safety check, the\nchip is a real `<a href download>` so a bare drop-in still does something\nuseful — but `lr-open` fires first and is `cancelable`; a host that\ncalls `preventDefault()` on it suppresses that default download/open so it\ncan substitute its own handling instead.\n\n**Accessible action name.** The host `aria-label` maps to\n`accessibleLabel` and overrides the filename/alt/per-kind action name on\nwhichever internal element is actionable for the resolved kind. The name\nis therefore applied directly to the button or link across the shadow\nboundary; it does not replace the image alt text or the video control's\nown label.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root interactive/container element. A `<button>` for `kind=\"image\"`, a plain wrapper `<div>` for `kind=\"video\"`, and either an `<a>` (when `src` passes the href safety check) or a plain `<span>` (otherwise) for the `file`-chip fallback. |\n| `file-icon` | The generic file glyph, shown only in the file-chip fallback. |\n| `filename` | The filename text, shown only in the file-chip fallback. |\n| `media` | The `<img>` or `<video>` element. |\n| `open-button` | The explicit \"open\" affordance rendered next to `[part=\"media\"]` for `kind=\"video\"` only — see the class doc. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-media-card-max-height` (default: `var(--lr-size-20rem)`) — Cap on the block size of the `<img>`/`<video>` in `[part=\"media\"]`."
8697
+ "value": "`<lr-media-card>` — a lightweight inline preview for one already-sent,\nalready-available attachment inside a rendered chat message body (e.g.\nplugged into `<lr-chat-message>`'s `attachments` slot, or embedded\ndirectly by a markdown/message renderer). Distinct from two other,\nsimilarly-named components in this family: `<lr-document-preview>` is a\nfuller viewer with header chrome and an async server-side-conversion\nstate machine (`status=\"converting\"`), and `<lr-attachment-chip>` is a\npre-send queued-file chip with upload progress. This component has\nneither concern — it only ever shows a `src` that's already final.\n\n**Format dispatch.** `kind` selects `'image'` (a plain `<img>`), `'video'`\n(a plain `<video controls>`), or `'file'` (an icon + filename chip with a\ndownload/open affordance). Leave `kind` unset to auto-detect from\n`mime-type` (`image/*` / `video/*` / anything else -> `'file'`);\nexplicitly setting `kind` always wins over detection.\n\n**Safe-URL checking.** `src` is validated before it's ever assigned to an\n`<img>`/`<video>` `src` or an `<a href>` — only `http:`/`https:`/`blob:`\n(plus `data:` for a *media* `src` only) or a scheme-relative/relative URL\nwith no scheme at all pass; anything else (`javascript:`, `vbscript:`,\nand similarly suspicious schemes) is rejected. `safeMediaSrc()` and\n`safeLinkHref()` share a platform-URL-based validator; their sink-specific\nallowlists explain why `data:` gets two different answers depending on\nwhere it is used. An `image`/`video` `kind` whose `src` fails the\nmedia-src check falls back to the generic file-chip rendering — this is\nthe \"plain preview unavailable state\" a dangerous URL degrades to, rather\nthan ever reaching a real media/anchor sink. That fallback also re-checks\n`src` against the stricter href allowlist for its own download affordance,\nbut since the href allowlist is a strict subset of the media-src allowlist,\nthat re-check can only ever change the outcome for a direct/auto-detected\n`kind=\"file\"` `src` — an `image`/`video` `src` that already failed the\nwider media-src check necessarily fails the narrower href check too, so\nthe fallback for those two kinds is always the plain, unclickable `span`.\n\n**The `video` case renders its open affordance separately from `base`.**\n`image`/`file` wrap their *entire* card in one native `<button>`/`<a>` —\nsafe because an `<img>` and a plain icon+text chip have no interactive\ncontent of their own to conflict with. A `<video controls>` element is\nitself interactive content (its own play/seek/volume controls), and HTML\nforbids nesting interactive content inside a `<button>`/`<a>` — doing so\nanyway would also make every click on the video's own controls bubble up\nand spuriously fire `lr-open`. So for `kind=\"video\"`, `base` is a plain,\nnon-interactive wrapper around `[part=\"media\"]`, and a small separate\n`[part=\"open-button\"]` (not one of this component's originally-scoped\nparts, added as the \"explicit view/open affordance\" the class is free to\nprovide) is the thing that actually fires `lr-open`.\n\n**Navigation.** This component never navigates on its own for `image`/\n`video` — activating the card only fires `lr-open`; a host decides what\n\"open\" means (a lightbox, a new tab, whatever). The `file`-chip case is\nthe one exception: when `src` passes the (stricter) href safety check, the\nchip is a real `<a href download>` so a bare drop-in still does something\nuseful — but `lr-open` fires first and is `cancelable`; a host that\ncalls `preventDefault()` on it suppresses that default download/open so it\ncan substitute its own handling instead.\n\n**Accessible action name.** The host `aria-label` maps to\n`accessibleLabel` and overrides the filename/alt/per-kind action name on\nwhichever internal element is actionable for the resolved kind. The name\nis therefore applied directly to the button or link across the shadow\nboundary; it does not replace the image alt text or the video control's\nown label.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root interactive/container element. A `<button>` for `kind=\"image\"`, a plain wrapper `<div>` for `kind=\"video\"`, and either an `<a>` (when `src` passes the href safety check) or a plain `<span>` (otherwise) for the `file`-chip fallback. |\n| `file-icon` | The generic file glyph, shown only in the file-chip fallback. |\n| `filename` | The filename text, shown only in the file-chip fallback. |\n| `media` | The `<img>` or `<video>` element. |\n| `open-button` | The explicit \"open\" affordance rendered next to `[part=\"media\"]` for `kind=\"video\"` only — see the class doc. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-media-card-max-height` (default: `var(--lr-size-20rem)`) — Cap on the block size of the `<img>`/`<video>` in `[part=\"media\"]`. **Chrome escape hatch.** `appearance=\"plain\"` drops `[part=\"base\"]`'s border, background, padding, and corner radius — for a dense list/feed of cards (this component's own documented primary use case) where the surrounding container already provides its own separation, so cards don't double up on chrome. Mirrors `<lr-source-card>`'s identical `appearance` vocabulary."
8530
8698
  },
8531
8699
  "attributes": [
8532
8700
  {
@@ -8536,6 +8704,13 @@
8536
8704
  "value": "Alt text for the image case (and reused as a video label fallback).\nFalls back to `filename`, then a generic per-kind description.\n\nType: `string` \nDefault: `''`"
8537
8705
  }
8538
8706
  },
8707
+ {
8708
+ "name": "appearance",
8709
+ "description": {
8710
+ "kind": "markdown",
8711
+ "value": "Visual chrome, mirroring `<lr-source-card>`'s `appearance` vocabulary. `'card'` (the\ndefault) keeps the bordered, filled box. `'plain'` removes the border, background, padding\nand corner radius, so a card inside a dense chat transcript (or any container already\ndrawing its own separation between attachments) doesn't double the frame.\n\nType: `MediaCardAppearance` \nDefault: `'card'`"
8712
+ }
8713
+ },
8539
8714
  {
8540
8715
  "name": "aria-label",
8541
8716
  "description": {
@@ -8591,7 +8766,7 @@
8591
8766
  "name": "lr-memory-panel",
8592
8767
  "description": {
8593
8768
  "kind": "markdown",
8594
- "value": "`<lr-memory-panel>` — an agent's working memory surface: short-term context and long-term\nmemories, each item's confidence and (optional) grounding provenance, and add/remove/forget\nactions gated behind an explicit confirmation step before anything is reported as decided.\n\nComposes `lr-provenance-panel` for a per-item's provenance breakdown (revealed behind a\ndisclosure toggle, only rendered when `item.provenance` is set) and `lr-confirm-bar` for every\nadd/remove/forget confirmation -- this component never re-implements a new inline-confirmation\npattern of its own. A memory item's confidence reuses `lr-citation-badge`'s own confidence\nvocabulary (`citationHighConfidence`/`citationMediumConfidence`/`citationLowConfidence`), tiered\nagainst `thresholds` the same way `lr-chunk-inspector` tiers a chunk's relevance score.\n\n`shortTerm`/`longTerm` are controlled and never mutated by this component -- approving a pending\naction only fires the matching event; the host applies the resulting state change (adding to\n`longTerm`, removing an item, clearing `longTerm`) and passes new arrays back down. At most one\nconfirmation is ever pending at a time: starting a new action (on the same item or a different\none) silently cancels whichever confirmation was already open, the same way only one row can be\nmid-edit in a list at once.\n\nThree distinct, non-overlapping actions: `add` promotes a short-term item into long-term memory\n(only offered on short-term items -- long-term items are already there); `remove` deletes one\nspecific item from whichever list it's in (offered on every item); `forget` is deliberately\nscoped to the whole long-term list at once (a single \"Forget all\" control in that section's\nheader, only rendered while `longTerm` is non-empty) -- a bulk, more consequential action kept\ndistinct from the per-item `remove`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `add-button` | The \"Add to long-term memory\" action. Only rendered on short-term items. |\n| `base` | The root wrapper. |\n| `confidence` | The item's confidence tier text, carrying `data-tone`. Omitted when `confidence` is unset. |\n| `empty` | The all-empty `lr-empty` state, shown when both lists are empty. |\n| `expand-toggle` | The provenance disclosure toggle. Omitted when `provenance` is unset. |\n| `forget-all-button` | The long-term section's bulk \"Forget all\" action. Only rendered while `longTerm` is non-empty. |\n| `heading` | A section's visible heading text. |\n| `item` | One memory item row (`role=\"listitem\"`); carries `data-id`/`data-scope` and a stable `tabindex=\"-1\"` so focus has somewhere to land after a pending confirmation on this row resolves. |\n| `item-actions` | The wrapper around an item's action row (or its pending `lr-confirm-bar`). |\n| `item-body` | The disclosed `lr-provenance-panel` wrapper, `hidden` while collapsed. Omitted when `provenance` is unset. |\n| `item-row` | The wrapper around an item's text and confidence indicator. |\n| `item-text` | The item's `text`. |\n| `list` | A section's `role=\"list\"` wrapper, omitted while that section is empty. |\n| `remove-button` | The \"Remove\" action. Rendered on every item. |\n| `section` | One of the two (short-term/long-term) sections; carries `data-scope`. |\n| `section-empty` | A section's \"no items\" text, shown when that section's own list is empty. |\n| `section-header` | A section's heading + (long-term only) \"Forget all\" control row. |"
8769
+ "value": "`<lr-memory-panel>` — an agent's working memory surface: short-term context and long-term\nmemories, each item's confidence and (optional) grounding provenance, and add/remove/forget\nactions gated behind an explicit confirmation step before anything is reported as decided.\n\nComposes `lr-provenance-panel` for a per-item's provenance breakdown (revealed behind a\ndisclosure toggle, only rendered when `item.provenance` is set) and `lr-confirm-bar` for every\nadd/remove/forget confirmation -- this component never re-implements a new inline-confirmation\npattern of its own. A memory item's confidence reuses `lr-citation-badge`'s own confidence\nvocabulary (`citationHighConfidence`/`citationMediumConfidence`/`citationLowConfidence`), tiered\nagainst `thresholds` the same way `lr-chunk-inspector` tiers a chunk's relevance score.\n\n`shortTerm`/`longTerm` are controlled and never mutated by this component -- approving a pending\naction only fires the matching event; the host applies the resulting state change (adding to\n`longTerm`, removing an item, clearing `longTerm`) and passes new arrays back down. At most one\nconfirmation is ever pending at a time: starting a new action (on the same item or a different\none) silently cancels whichever confirmation was already open, the same way only one row can be\nmid-edit in a list at once.\n\nThree distinct, non-overlapping actions: `add` promotes a short-term item into long-term memory\n(only offered on short-term items -- long-term items are already there); `remove` deletes one\nspecific item from whichever list it's in (offered on every item); `forget` is deliberately\nscoped to the whole long-term list at once (a single \"Forget all\" control in that section's\nheader, only rendered while `longTerm` is non-empty) -- a bulk, more consequential action kept\ndistinct from the per-item `remove`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `add-button` | The \"Add to long-term memory\" action. Only rendered on short-term items. |\n| `base` | The root wrapper. |\n| `confidence` | The item's confidence tier text, carrying `data-tone`. Omitted when `confidence` is unset. |\n| `empty` | The all-empty `lr-empty` state, shown when both lists are empty. |\n| `expand-toggle` | The provenance disclosure toggle. Omitted when `provenance` is unset. |\n| `forget-all-button` | The long-term section's bulk \"Forget all\" action. Only rendered while `longTerm` is non-empty. |\n| `heading` | A section's visible heading text. |\n| `item` | One memory item row (`role=\"listitem\"`); carries `data-id`/`data-scope` and a stable `tabindex=\"-1\"` so focus has somewhere to land after a pending confirmation on this row resolves. |\n| `item-actions` | The wrapper around an item's action row (or its pending `lr-confirm-bar`). |\n| `item-body` | The disclosed `lr-provenance-panel` wrapper, `hidden` while collapsed. Omitted when `provenance` is unset. |\n| `item-row` | The wrapper around an item's text and confidence indicator. |\n| `item-text` | The item's `text`. |\n| `list` | A section's `role=\"list\"` wrapper, omitted while that section is empty. |\n| `remove-button` | The \"Remove\" action. Rendered on every item. |\n| `section` | One of the two (short-term/long-term) sections; carries `data-scope`. |\n| `section-empty` | A section's \"no items\" text, shown when that section's own list is empty. |\n| `section-header` | A section's heading + (long-term only) \"Forget all\" control row. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-memory-panel-confidence-success-color` (default: `var(--lr-color-success)`) — Text color for a high-confidence item's confidence indicator.\n- `--lr-memory-panel-confidence-warning-color` (default: `var(--lr-color-warning)`) — Text color for a medium-confidence item's confidence indicator.\n- `--lr-memory-panel-confidence-danger-color` (default: `var(--lr-color-danger)`) — Text color for a low-confidence item's confidence indicator."
8595
8770
  },
8596
8771
  "attributes": [
8597
8772
  {
@@ -8614,7 +8789,7 @@
8614
8789
  "name": "lr-mention-popover",
8615
8790
  "description": {
8616
8791
  "kind": "markdown",
8617
- "value": "`<lr-mention-popover>` — a caret-anchored, keyboard-navigable popover for\n`@`-mention and `/`-slash-command autocomplete inside a plain-text\n`<textarea>`/`<input>` the host owns (e.g. `<lr-chat-composer>`'s own\ntextarea, though this component has no dependency on that or any other\nspecific input). It never takes DOM focus itself — the same \"focus stays\nput, `aria-activedescendant` conveys the active row\" pattern\n`<lr-select>`/`<lr-combobox>` use for their own listbox — so a host\nmust apply `aria-activedescendant` to its *own* input element, pointing at\nwhatever `activeDescendantId` currently returns.\n\nIntegration contract (entirely the host's responsibility — this component\nnever inspects the text control's value or listens to it directly):\n1. Detect a mention/command trigger (e.g. `@`/`/` at the start of a word)\n in the host's own `input` handling.\n2. Set `anchor` (the `<textarea>`/`<input>` itself, or any element for\n plain whole-element anchoring — see \"Positioning\" below), `items`, and\n `query` (the text typed since the trigger character), then flip\n `open = true`.\n3. Forward every `keydown` the input receives, while `open`, through\n `handleKeyDown()` — it returns `true` when it consumed the key (so the\n host's own handler should stop, e.g. skip submitting the message on an\n Enter that actually picked a mention) and `false` otherwise.\n4. Set `open = false` whenever the query stops looking like an active\n mention context (a space typed, the trigger character deleted, the\n input blurred, …) — `lr-mention-close` fires automatically from that\n (see below), there is no separate \"tell it to close\" call needed.\n5. Keep the host's own input's `aria-activedescendant` (and, optionally,\n `aria-controls`, via `listboxId`) in sync with `activeDescendantId` —\n this component has no DOM of the host's to attach that to itself.\n\nPositioning: when `anchor` is a plain `<textarea>` or single-line text\n`<input>`, this component measures exactly where the caret currently\npaints (`caretClientRect()`, the standard hidden-mirror-element technique\n— see that function's own doc) and positions against that single point\nwith `internal/positioner.js`'s `place()`, so the popup tracks the caret\nrather than sitting under the whole textarea. Any other `anchor` element\n(or a text control this component fails to measure, e.g. one with\n`display: none`) falls back to `place(anchor, popup)` against the whole\nelement — the same whole-element anchoring `<lr-combobox>`/\n`<lr-select>` use for their own popups. Re-measures on every `anchor`/\n`query` change while open (a keystroke moves the caret, so a fresh `query`\nis the proxy for \"the caret may have moved\"); a caret that moves for a\nreason other than typing (e.g. a mouse click elsewhere in the text while\nthe popover happens to still be open) is not separately tracked — the\nhost can force a re-measure by toggling `open` or reassigning `anchor`.\n\nFiltering happens internally against `items` (mirroring `<lr-combobox>`'s\nfilter-predicate convention via `filter`, rather than requiring the host to\npre-filter): the default predicate is a case-insensitive substring match\nagainst `label`/`description`, overridable via `filter`.\n\nThere is no persisted \"selection\" the way a real listbox has one — a\nmention is either committed (closing the popover) or the popover is\ndismissed with nothing chosen — so `aria-selected=\"true\"` marks whichever\nrow is currently *active* (what Enter/Tab would commit right now), per the\nWAI-ARIA combobox-with-list-autocomplete pattern, rather than tracking a\nseparate persisted value the way `<lr-combobox>`'s own `aria-selected`\ndoes.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `empty` | The \"no matches\" message, shown when `items`/`query` produce zero rows. |\n| `listbox` | The popover's root element (`role=\"listbox\"`). |\n| `option` | A candidate row (`role=\"option\"`). |\n| `option-description` | A row's optional secondary line, when `description` is set. |\n| `option-icon` | A row's leading icon glyph, when `icon` is set. |\n| `option-label` | Wrapper around a row's label/description. |"
8792
+ "value": "`<lr-mention-popover>` — a caret-anchored, keyboard-navigable popover for\n`@`-mention and `/`-slash-command autocomplete inside a plain-text\n`<textarea>`/`<input>` the host owns (e.g. `<lr-chat-composer>`'s own\ntextarea, though this component has no dependency on that or any other\nspecific input). It never takes DOM focus itself — the same \"focus stays\nput, `aria-activedescendant` conveys the active row\" pattern\n`<lr-select>`/`<lr-combobox>` use for their own listbox — so a host\nmust apply `aria-activedescendant` to its *own* input element, pointing at\nwhatever `activeDescendantId` currently returns.\n\nIntegration contract (entirely the host's responsibility — this component\nnever inspects the text control's value or listens to it directly):\n1. Detect a mention/command trigger (e.g. `@`/`/` at the start of a word)\n in the host's own `input` handling.\n2. Set `anchor` (the `<textarea>`/`<input>` itself, or any element for\n plain whole-element anchoring — see \"Positioning\" below), `items`, and\n `query` (the text typed since the trigger character), then flip\n `open = true`.\n3. Forward every `keydown` the input receives, while `open`, through\n `handleKeyDown()` — it returns `true` when it consumed the key (so the\n host's own handler should stop, e.g. skip submitting the message on an\n Enter that actually picked a mention) and `false` otherwise.\n4. Set `open = false` whenever the query stops looking like an active\n mention context (a space typed, the trigger character deleted, the\n input blurred, …) — `lr-mention-close` fires automatically from that\n (see below), there is no separate \"tell it to close\" call needed.\n5. Keep the host's own input's `aria-activedescendant` (and, optionally,\n `aria-controls`, via `listboxId`) in sync with `activeDescendantId` —\n this component has no DOM of the host's to attach that to itself.\n\nPositioning: when `anchor` is a plain `<textarea>` or single-line text\n`<input>`, this component measures exactly where the caret currently\npaints (`caretClientRect()`, the standard hidden-mirror-element technique\n— see that function's own doc) and positions against that single point\nwith `internal/positioner.js`'s `place()`, so the popup tracks the caret\nrather than sitting under the whole textarea. Any other `anchor` element\n(or a text control this component fails to measure, e.g. one with\n`display: none`) falls back to `place(anchor, popup)` against the whole\nelement — the same whole-element anchoring `<lr-combobox>`/\n`<lr-select>` use for their own popups. Re-measures on every `anchor`/\n`query` change while open (a keystroke moves the caret, so a fresh `query`\nis the proxy for \"the caret may have moved\"); a caret that moves for a\nreason other than typing (e.g. a mouse click elsewhere in the text while\nthe popover happens to still be open) is not separately tracked — the\nhost can force a re-measure by toggling `open` or reassigning `anchor`.\n\nFiltering happens internally against `items` (mirroring `<lr-combobox>`'s\nfilter-predicate convention via `filter`, rather than requiring the host to\npre-filter): the default predicate is a case-insensitive substring match\nagainst `label`/`description`, overridable via `filter`.\n\nThere is no persisted \"selection\" the way a real listbox has one — a\nmention is either committed (closing the popover) or the popover is\ndismissed with nothing chosen — so `aria-selected=\"true\"` marks whichever\nrow is currently *active* (what Enter/Tab would commit right now), per the\nWAI-ARIA combobox-with-list-autocomplete pattern, rather than tracking a\nseparate persisted value the way `<lr-combobox>`'s own `aria-selected`\ndoes.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `empty` | The \"no matches\" message, shown when `items`/`query` produce zero rows. |\n| `listbox` | The popover's root element (`role=\"listbox\"`). |\n| `option` | A candidate row (`role=\"option\"`). |\n| `option-description` | A row's optional secondary line, when `description` is set. |\n| `option-icon` | A row's leading icon glyph, when `icon` is set. |\n| `option-label` | Wrapper around a row's label/description. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-mention-popover-option-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the hovered or `[data-active]` (keyboard-highlighted) suggestion row."
8618
8793
  },
8619
8794
  "attributes": [
8620
8795
  {
@@ -8658,14 +8833,14 @@
8658
8833
  "name": "lr-menu",
8659
8834
  "description": {
8660
8835
  "kind": "markdown",
8661
- "value": "`<lr-menu>` — an anchored dropdown of `<lr-menu-item>` actions, opened\nfrom a consumer-supplied trigger (typically an icon button). A close, drop-\nin-shaped replacement for reaching outside this library for a third-party\ndropdown to build a gear menu, an avatar menu, or a history row's overflow\nmenu: click the trigger, a positioned menu appears, clicking an item both\nperforms the action *and* closes the menu.\n\n**ARIA pattern — `role=\"menu\"`/`role=\"menuitem\"` with real roving DOM\nfocus, not a listbox.** Two coherent, mutually-exclusive shapes were\navailable here: (a) `role=\"listbox\"`/`role=\"option\"` with\n`aria-activedescendant`, the pattern `<lr-select>`'s trigger-button +\npopup listbox uses, where DOM focus never leaves the trigger; or (b)\n`role=\"menu\"`/`role=\"menuitem\"` with real focus moving between actual\nfocusable rows, the WAI-ARIA \"menu button\" pattern. This picks (b):\n`<lr-menu-item>` rows are real, independently-focusable elements (see\nthat class's own doc), which is the more natural fit for a menu\nspecifically — unlike a listbox's rows, a menu's rows are conventionally\nbutton-/link-shaped, and every well-known native/OS menu (and this\nfamily's own `<lr-tree>`/`<lr-tree-node>` pair, which this component's\nroving-tabindex plumbing directly mirrors) already moves real focus rather\nthan merely a virtual `aria-activedescendant` pointer. `role`/`tabIndex`\nare consistently the menu-button shape throughout — never mixed with\nlistbox/option.\n\nInteraction contract (mirrors the WAI-ARIA APG \"menu button\" pattern):\n- Click the trigger (or Enter/Space on it, via the trigger's own native\n `click` activation) toggles the menu, moving focus to the first\n non-disabled item on open.\n- ArrowDown/ArrowUp on the trigger while closed also open it, focusing the\n first/last non-disabled item respectively.\n- Once open, ArrowDown/ArrowUp move the roving focus among non-disabled\n items (wrapping past either end — the recommended, and more common,\n menu-widget behavior, unlike `<lr-select>`'s clamped listbox nav).\n Home/End jump to the first/last non-disabled item. Enter/Space activate\n the focused item. Escape closes and returns focus to the trigger. Tab\n closes the menu without trapping focus (the browser's own default Tab\n behavior proceeds untouched). A printable keypress runs type-ahead:\n roving focus jumps to the next non-disabled item whose text starts with\n the accumulated buffer, cycling from just after the active item (mirrors\n `<lr-select>`'s identical listbox type-ahead). All of the above (except\n Escape) only respond to keydowns from a real `<lr-menu-item>` target,\n so a slotted non-item control (e.g. a date input) keeps its own full\n default keyboard behavior. Escape from such a slotted control closes the\n menu too, but only when `closeOnEscapeAnywhere` is setit defaults to\n `false`, so existing consumers keep today's behavior unchanged.\n- A click outside both the trigger and the open popup closes it (mirrors\n `<lr-select>`'s `onDocPointer` exactly) — this does *not* refocus the\n trigger, since the outside click itself already moved focus somewhere\n the user chose; Escape and a committed selection *do* refocus the\n trigger, since those are dismissals with nowhere else for focus to go.\n\nThe trigger element itself is read from the `trigger` slot's assigned\nelement (first one, if several are assigned) and enhanced imperatively\nwith `aria-haspopup=\"menu\"`/`aria-expanded`/`aria-controls` — the same\n\"reach into a consumer-owned light-DOM element to complete its a11y\nwiring\" approach `<lr-dialog>` documents for its own heading detection,\nnecessary here because those attributes belong on the actual interactive\ntrigger, which lives outside this component's own shadow root.\n\nThe popup is always rendered (never `display:none`) so `.focus()` calls on\nits content work synchronously the instant it opens — visually hidden via\n`visibility`/`opacity` instead (identical to `<lr-select>`'s own\n`[part=\"listbox\"]`). `visibility` is an inherited CSS property that\npierces the `<slot>` projection boundary, so every closed-state\n`<lr-menu-item>` is automatically excluded from sequential (Tab-key)\nnavigation with no separate JS bookkeeping.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-menu-item>` elements, plus optionally plain `<hr>` dividers between groups (native `<hr>` already carries an implicit `separator` role, matching what `role=\"menu\"` expects between item groups). |\n| `trigger` | The consumer's own trigger element (typically an icon button). Clicking it toggles the menu; it's positioned against via `internal/positioner.js`'s `place()`. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `list` | The `role=\"menu\"` container wrapping the default slot. |\n| `popup` | The positioned floating panel. |\n| `trigger` | The wrapper around the `trigger` slot (the positioning anchor). |"
8836
+ "value": "`<lr-menu>` — an anchored dropdown of `<lr-menu-item>` actions, opened\nfrom a consumer-supplied trigger (typically an icon button). A close, drop-\nin-shaped replacement for reaching outside this library for a third-party\ndropdown to build a gear menu, an avatar menu, or a history row's overflow\nmenu: click the trigger, a positioned menu appears, clicking an item both\nperforms the action *and* closes the menu.\n\n**ARIA pattern — `role=\"menu\"`/`role=\"menuitem\"` with real roving DOM\nfocus, not a listbox.** Two coherent, mutually-exclusive shapes were\navailable here: (a) `role=\"listbox\"`/`role=\"option\"` with\n`aria-activedescendant`, the pattern `<lr-select>`'s trigger-button +\npopup listbox uses, where DOM focus never leaves the trigger; or (b)\n`role=\"menu\"`/`role=\"menuitem\"` with real focus moving between actual\nfocusable rows, the WAI-ARIA \"menu button\" pattern. This picks (b):\n`<lr-menu-item>` rows are real, independently-focusable elements (see\nthat class's own doc), which is the more natural fit for a menu\nspecifically — unlike a listbox's rows, a menu's rows are conventionally\nbutton-/link-shaped, and every well-known native/OS menu (and this\nfamily's own `<lr-tree>`/`<lr-tree-node>` pair, which this component's\nroving-tabindex plumbing directly mirrors) already moves real focus rather\nthan merely a virtual `aria-activedescendant` pointer. `role`/`tabIndex`\nare consistently the menu-button shape throughout — never mixed with\nlistbox/option.\n\nInteraction contract (mirrors the WAI-ARIA APG \"menu button\" pattern):\n- Click the trigger (or Enter/Space on it, via the trigger's own native\n `click` activation) toggles the menu, moving focus to the first\n non-disabled item on open.\n- ArrowDown/ArrowUp on the trigger while closed also open it, focusing the\n first/last non-disabled item respectively.\n- Once open, ArrowDown/ArrowUp move the roving focus among non-disabled\n items (wrapping past either end — the recommended, and more common,\n menu-widget behavior, unlike `<lr-select>`'s clamped listbox nav).\n Home/End jump to the first/last non-disabled item. Enter/Space activate\n the focused item. Escape closes and returns focus to the trigger. A\n printable keypress runs type-ahead: roving focus jumps to the next\n non-disabled item whose text starts with the accumulated buffer, cycling\n from just after the active item (mirrors `<lr-select>`'s identical\n listbox type-ahead). All of the above (except Escape and Tab) only\n respond to keydowns from a real `<lr-menu-item>` target, so a slotted\n non-item control (e.g. a date input) keeps its own full default keyboard\n behavior.\n- Tab never traps focus and never calls `preventDefault()` — the browser's\n own Tab navigation always proceeds untouched. It closes the menu only\n when focus is on its way *out* of the popup: with a focusable in the\n `header`/`footer` region on the far side of the keypress, the menu stays\n open so native Tab can carry focus there instead. With neither region\n filled, Tab closes exactly as it always has. Tabbing past the popup's\n last focusable in either direction closes it too, including from slotted\n non-item content — which previously left the menu open while focus\n walked away.\n- Escape from `header`/`footer` content closes the menu and refocuses the\n trigger unconditionally, mirroring `<lr-popover>`'s handling of arbitrary\n popup content. `closeOnEscapeAnywhere` governs only the *legacy* shape —\n non-item content slotted into the **default** slot and defaults to\n `false`, so existing consumers keep today's behavior unchanged.\n- A click outside both the trigger and the open popup closes it (mirrors\n `<lr-select>`'s `onDocPointer` exactly) — this does *not* refocus the\n trigger, since the outside click itself already moved focus somewhere\n the user chose; Escape and a committed selection *do* refocus the\n trigger, since those are dismissals with nowhere else for focus to go.\n\n`show(focus?)` and `hide(options?)` are the public imperative pair, for the cases the trigger\ncan't express: a slotted \"Apply\"/\"Done\" button inside the menu, a keyboard shortcut, a parent\nrestoring UI state. `hide({ focusTrigger: true })` is the one that also returns DOM focus to the\ntrigger — use it whenever the interaction that closed the menu hasn't already put focus\nsomewhere the user chose. Writing `open` directly still works and is fully equivalent apart from\nthe focus moves: the roving-tabindex reset is centralized in `updated()`, so `el.open = false`\nnever leaves a stale `tabindex=\"0\"` tab stop on the last active item.\n\nThe trigger element itself is read from the `trigger` slot's assigned\nelement (first one, if several are assigned) and enhanced imperatively\nwith `aria-haspopup=\"menu\"`/`aria-expanded`/`aria-controls` — the same\n\"reach into a consumer-owned light-DOM element to complete its a11y\nwiring\" approach `<lr-dialog>` documents for its own heading detection,\nnecessary here because those attributes belong on the actual interactive\ntrigger, which lives outside this component's own shadow root.\n\nThe popup is always rendered (never `display:none`) so `.focus()` calls on\nits content work synchronously the instant it opens — visually hidden via\n`visibility`/`opacity` instead (identical to `<lr-select>`'s own\n`[part=\"listbox\"]`). `visibility` is an inherited CSS property that\npierces the `<slot>` projection boundary, so every closed-state\n`<lr-menu-item>` is automatically excluded from sequential (Tab-key)\nnavigation with no separate JS bookkeeping.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-menu-item>` elements, plus optionally plain `<hr>` dividers between groups (native `<hr>` already carries an implicit `separator` role, matching what `role=\"menu\"` expects between item groups). Arbitrary non-item content still renders here for backward compatibility, but the `header`/`footer` slots below are the supported place for it. |\n| `footer` | Same as `header`, rendered below the items — an \"Apply\"/\"Done\" button, a link to a fuller settings page, a count. |\n| `header` | Composed content rendered above the items and *outside* the `role=\"menu\"` list — a filter/search field, a section title, a summary row. Keeps its own full default keyboard behavior, is reachable with Tab from the items, and is ARIA-valid (arbitrary content inside `role=\"menu\"` is not). Collapses to no box at all while unfilled. |\n| `trigger` | The consumer's own trigger element (typically an icon button). Clicking it toggles the menu; it's positioned against via `internal/positioner.js`'s `place()`. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `footer` | The wrapper around the `footer` slot, below the list and outside `role=\"menu\"`. `display: none` while the slot is unfilled. |\n| `header` | The wrapper around the `header` slot, above the list and outside `role=\"menu\"`. `display: none` while the slot is unfilled. |\n| `list` | The `role=\"menu\"` container wrapping the default slot. |\n| `popup` | The positioned floating panel. |\n| `trigger` | The wrapper around the `trigger` slot (the positioning anchor). |"
8662
8837
  },
8663
8838
  "attributes": [
8664
8839
  {
8665
8840
  "name": "close-on-escape-anywhere",
8666
8841
  "description": {
8667
8842
  "kind": "markdown",
8668
- "value": "Extends the Escape-closes-and-refocuses-trigger behavior to keydown\nevents originating from slotted non-item content within `[part=\"list\"]`\n(e.g. a date input or a custom section slotted alongside\n`<lr-menu-item>`s), not just from a real `<lr-menu-item>`. Default\n`false` leaves Escape from slotted non-item content with full default\nkeyboard behavior, matching every existing consumer. Arrow/Home/End/\nEnter/Space stay scoped to real `<lr-menu-item>` targets regardless of\nthis property — only Escape is affected.\n\nType: `boolean` \nDefault: `false`"
8843
+ "value": "Extends the Escape-closes-and-refocuses-trigger behavior to keydown\nevents originating from non-item content slotted into the **default**\nslot, i.e. rendered within `[part=\"list\"]` alongside the\n`<lr-menu-item>`s. Default `false` leaves Escape from such content with\nfull default keyboard behavior, matching every existing consumer.\nArrow/Home/End/Enter/Space stay scoped to real `<lr-menu-item>` targets\nregardless of this property — only Escape is affected.\n\nIt has no bearing on the `header`/`footer` slots, which sit outside\n`[part=\"list\"]` and always close on Escape. Prefer those for composed\ncontrols: they are keyboard-reachable and ARIA-valid, whereas arbitrary\ncontent inside `role=\"menu\"` is an `aria-required-children` violation.\n\nType: `boolean` \nDefault: `false`"
8669
8844
  }
8670
8845
  },
8671
8846
  {
@@ -8812,7 +8987,7 @@
8812
8987
  "name": "lr-message-feedback",
8813
8988
  "description": {
8814
8989
  "kind": "markdown",
8815
- "value": "`<lr-message-feedback>` — thumbs up/down for one assistant message, with an optional inline\ndetail step (categorical reason chips + a free-text comment) that opens as a disclosure directly\nbelow the thumbs. Emits; never persists — a host reflects a previously-recorded rating back via\n`value` (+ `disabled` for a read-only display).\n\nActivating the pressed thumb again toggles it off to `null` (mirrors `<lr-rating>`'s\nre-activate-to-clear contract) *unless* its own detail panel is currently open, in which case that\nclick re-opens the panel instead (showing whatever reason/comment draft survived a prior Escape or\nsubmit). A thumbs-only configuration (`reasons` empty and `commentable` false, e.g.\n`<lr-message-actions>`'s embedded built-in) never has a panel to reopen, so its thumbs always\nbehave as a plain toggle.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root. |\n| `comment` | The comment `<textarea>`. Only rendered when `commentable`. |\n| `down-button` | The thumbs-down toggle button. |\n| `panel` | The inline detail disclosure. Only rendered when `reasons` is non-empty or `commentable` is set. |\n| `reasons` | The reason-chip group. Only rendered when `reasons` is non-empty. |\n| `submit-button` | The panel's submit button. |\n| `thumbs` | The wrapper around both thumb buttons. |\n| `up-button` | The thumbs-up toggle button. |"
8990
+ "value": "`<lr-message-feedback>` — thumbs up/down for one assistant message, with an optional inline\ndetail step (categorical reason chips + a free-text comment) that opens as a disclosure directly\nbelow the thumbs. Emits; never persists — a host reflects a previously-recorded rating back via\n`value` (+ `disabled` for a read-only display).\n\nActivating the pressed thumb again toggles it off to `null` (mirrors `<lr-rating>`'s\nre-activate-to-clear contract) *unless* its own detail panel is currently open, in which case that\nclick re-opens the panel instead (showing whatever reason/comment draft survived a prior Escape or\nsubmit). A thumbs-only configuration (`reasons` empty and `commentable` false, e.g.\n`<lr-message-actions>`'s embedded built-in) never has a panel to reopen, so its thumbs always\nbehave as a plain toggle.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root. |\n| `comment` | The comment `<textarea>`. Only rendered when `commentable`. |\n| `down-button` | The thumbs-down toggle button. |\n| `panel` | The inline detail disclosure. Only rendered when `reasons` is non-empty or `commentable` is set. |\n| `reasons` | The reason-chip group. Only rendered when `reasons` is non-empty. |\n| `submit-button` | The panel's submit button. |\n| `thumbs` | The wrapper around both thumb buttons. |\n| `up-button` | The thumbs-up toggle button. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-message-feedback-up-active-color` (default: `var(--lr-color-success)`) — Glyph color of the pressed thumbs-up button. Not declared on `:host`, so it can be set on the element or any ancestor; scoped to the pressed state, unlike overriding the shared `--lr-color-success`.\n- `--lr-message-feedback-up-active-bg` (default: `var(--lr-color-success-quiet)`) — Background of the pressed thumbs-up button.\n- `--lr-message-feedback-up-active-border` (default: `var(--lr-color-success)`) — Border color of the pressed thumbs-up button.\n- `--lr-message-feedback-down-active-color` (default: `var(--lr-color-danger)`) — Glyph color of the pressed thumbs-down button.\n- `--lr-message-feedback-down-active-bg` (default: `var(--lr-color-danger-quiet)`) — Background of the pressed thumbs-down button.\n- `--lr-message-feedback-down-active-border` (default: `var(--lr-color-danger)`) — Border color of the pressed thumbs-down button."
8816
8991
  },
8817
8992
  "attributes": [
8818
8993
  {
@@ -8872,7 +9047,7 @@
8872
9047
  "name": "lr-mind-map",
8873
9048
  "description": {
8874
9049
  "kind": "markdown",
8875
- "value": "`<lr-mind-map>` — a radial expandable topic tree (NotebookLM Mind Maps): a spatial overview of\na topic hierarchy where activating a topic drills in or hands the topic to the chat. Hierarchy,\nnot network — no cross-links, no force simulation, no communities, no edge labels (that's\n`lr-graph`). Zero-dependency SVG; the radial layout is closed-form arithmetic, in its own\n`mind-map-layout.ts` module, mirroring `lr-word-cloud`'s dependency-free precedent.\n\nNode-position transitions use `--lr-transition-base`, which already collapses to near-zero\nunder `prefers-reduced-motion: reduce` globally (`tokens.styles.ts`), so expansion snaps rather\nthan tweening for a reduced-motion user with no extra branching in this component.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The wrapper. |\n| `empty` | The empty-state message, shown when `topics` is empty. |\n| `focus-ring` | The keyboard focus ring. |\n| `link` | A parent-child connector. |\n| `live-region` | The visually hidden announcement region. |\n| `node` | A topic node group. |\n| `node-label` | A topic's label text. |\n| `svg` | The single-tab-stop SVG focus target. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-mind-map-ring-gap` (default: `6rem`) — Radius step per depth ring."
9050
+ "value": "`<lr-mind-map>` — a radial expandable topic tree (NotebookLM Mind Maps): a spatial overview of\na topic hierarchy where activating a topic drills in or hands the topic to the chat. Hierarchy,\nnot network — no cross-links, no force simulation, no communities, no edge labels (that's\n`lr-graph`). Zero-dependency SVG; the radial layout is closed-form arithmetic, in its own\n`mind-map-layout.ts` module, mirroring `lr-word-cloud`'s dependency-free precedent.\n\nNode-position transitions use `--lr-transition-base`, which already collapses to near-zero\nunder `prefers-reduced-motion: reduce` globally (`tokens.styles.ts`), so expansion snaps rather\nthan tweening for a reduced-motion user with no extra branching in this component.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The wrapper. |\n| `empty` | The empty-state message, shown when `topics` is empty. |\n| `focus-ring` | The keyboard focus ring. |\n| `link` | A parent-child connector. |\n| `live-region` | The visually hidden announcement region. |\n| `node` | A topic node group. |\n| `node-label` | A topic's label text. |\n| `svg` | The single-tab-stop SVG focus target. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-mind-map-ring-gap` (default: `6rem`) — Radius step per depth ring.\n- `--lr-mind-map-node-hover-halo` (default: `var(--lr-color-brand-quiet)`) — Stroke color of the hover halo drawn around a topic node's dot, giving mouse users the same \"this is clickable\" feedback keyboard users get from the drawn focus ring."
8876
9051
  },
8877
9052
  "attributes": [
8878
9053
  {
@@ -8902,7 +9077,7 @@
8902
9077
  "name": "lr-model-select",
8903
9078
  "description": {
8904
9079
  "kind": "markdown",
8905
- "value": "`<lr-model-select>` — a provider/model picker that renders as a closed\ndropdown when a fixed `catalog` is available, or as a filterable free-text\ncombobox when it isn't (or when `allow-custom` explicitly permits typing\nsomething outside the catalog). Built directly on the shared\ntrigger-button/aria-activedescendant listbox technique `<lr-select>` uses\nand the filter-as-you-type suggestion-popup technique `<lr-combobox>`\nuses — not by composing either element, since the mode switch and the\nstale-value handling below are specific to this control.\n\nA `value` that isn't present in `catalog` (e.g. a model id saved from a\nprovider whose live catalog has since changed) is never silently dropped:\n`effectiveEntries` appends it to the rendered option list as a synthetic,\nvisually-distinct row (dashed border, italic label, \"not in catalog\"\nbadge — see `model-select.styles.ts`) computed fresh from `catalog` +\n`value` on every render, without ever mutating the `catalog` property\nitself.\n\nShips an opt-in `hint`/`errorText` form-control chrome (props + matching named slots +\n`hint`/`error` parts), mirroring `<lr-select>`'s exact pattern -- left unset, neither renders.\nPairs with the existing `label` prop/part (also mirroring `<lr-select>`) for a full\nlabel/hint/error field.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `combobox` | The text-input container (free-text mode's positioning anchor). |\n| `combobox-input` | The free-text mode's text input. |\n| `empty` | The empty-listbox message, shown when no rows match. |\n| `error` | The error message. |\n| `expand-icon` | The dropdown indicator. |\n| `form-control-label` | The `<label>` element (only rendered — and only contributes to the accessible name — once `label` is non-empty). |\n| `hint` | The hint message. |\n| `listbox` | The options popover (shared by both modes). |\n| `option` | An option row. |\n| `option-badge` | The \"not in catalog\" badge on a synthetic stale-value row. |\n| `option-label` | An option row's label. |\n| `provider-badge` | The optional leading `provider` label. |\n| `trigger` | The trigger button (closed-dropdown mode's positioning anchor). |"
9080
+ "value": "`<lr-model-select>` — a provider/model picker that renders as a closed\ndropdown when a fixed `catalog` is available, or as a filterable free-text\ncombobox when it isn't (or when `allow-custom` explicitly permits typing\nsomething outside the catalog). Built directly on the shared\ntrigger-button/aria-activedescendant listbox technique `<lr-select>` uses\nand the filter-as-you-type suggestion-popup technique `<lr-combobox>`\nuses — not by composing either element, since the mode switch and the\nstale-value handling below are specific to this control.\n\nA `value` that isn't present in `catalog` (e.g. a model id saved from a\nprovider whose live catalog has since changed) is never silently dropped:\n`effectiveEntries` appends it to the rendered option list as a synthetic,\nvisually-distinct row (dashed border, italic label, \"not in catalog\"\nbadge — see `model-select.styles.ts`) computed fresh from `catalog` +\n`value` on every render, without ever mutating the `catalog` property\nitself.\n\nShips an opt-in `hint`/`errorText` form-control chrome (props + matching named slots +\n`hint`/`error` parts), mirroring `<lr-select>`'s exact pattern -- left unset, neither renders.\nPairs with the existing `label` prop/part (also mirroring `<lr-select>`) for a full\nlabel/hint/error field.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `combobox` | The text-input container (free-text mode's positioning anchor). |\n| `combobox-input` | The free-text mode's text input. |\n| `empty` | The empty-listbox message, shown when no rows match. |\n| `error` | The error message. |\n| `expand-icon` | The dropdown indicator. |\n| `form-control-label` | The `<label>` element (only rendered — and only contributes to the accessible name — once `label` is non-empty). |\n| `hint` | The hint message. |\n| `listbox` | The options popover (shared by both modes). |\n| `option` | An option row. |\n| `option-badge` | The \"not in catalog\" badge on a synthetic stale-value row. |\n| `option-label` | An option row's label. |\n| `provider-badge` | The optional leading `provider` label. |\n| `trigger` | The trigger button (closed-dropdown mode's positioning anchor). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-model-select-trigger-padding` (default: `var(--lr-space-xs) var(--lr-space-s)`) — Trigger/combobox padding shorthand, scaled by `size`.\n- `--lr-model-select-trigger-min-height` (default: `var(--lr-size-2-5rem)`) — Trigger/combobox block-size floor, scaled by `size`.\n- `--lr-model-select-font-size` (default: `var(--lr-font-size-md)`) — Trigger/combobox font size, scaled by `size`.\n- `--lr-model-select-expand-size` (default: `var(--lr-size-1-75rem)`) — Decorative expand-icon box size, scaled by `size`.\n- `--lr-model-select-option-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of a hovered or keyboard-active option row."
8906
9081
  },
8907
9082
  "attributes": [
8908
9083
  {
@@ -9017,6 +9192,13 @@
9017
9192
  "value": "Type: `boolean`"
9018
9193
  }
9019
9194
  },
9195
+ {
9196
+ "name": "size",
9197
+ "description": {
9198
+ "kind": "markdown",
9199
+ "value": "Visual size — same `xs`–`xl` scale as `lr-select`'s `size`.\n\nType: `LyraModelSelectSize` \nDefault: `'m'`"
9200
+ }
9201
+ },
9020
9202
  {
9021
9203
  "name": "spellcheck",
9022
9204
  "description": {
@@ -9167,7 +9349,7 @@
9167
9349
  "name": "lr-neighbor-list",
9168
9350
  "description": {
9169
9351
  "kind": "markdown",
9170
- "value": "`<lr-neighbor-list>` — one entity's relationship rows: relation, direction, neighbor, with\nper-row navigate and expand-in-graph affordances. Never computes neighbors itself (the host\nderives rows from its own graph data) and never mutates a graph.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper (`role=\"list\"`). |\n| `direction` | The `aria-hidden` direction glyph. |\n| `empty` | The empty-state message, shown when `rows` is empty. |\n| `expand-button` | The per-row expand-in-graph icon button, only rendered when `expandable`. |\n| `group-header` | A relation group header, only rendered when `groupByRelation`. |\n| `node-label` | The row's node `<button>`. |\n| `node-meta` | Secondary node text (type/degree), when present. |\n| `relation` | The relation text. |\n| `row` | One relationship row (`role=\"listitem\"`). |"
9352
+ "value": "`<lr-neighbor-list>` — one entity's relationship rows: relation, direction, neighbor, with\nper-row navigate and expand-in-graph affordances. Never computes neighbors itself (the host\nderives rows from its own graph data) and never mutates a graph.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper (`role=\"list\"`). |\n| `direction` | The `aria-hidden` direction glyph. |\n| `empty` | The empty-state message, shown when `rows` is empty. |\n| `expand-button` | The per-row expand-in-graph icon button, only rendered when `expandable`. |\n| `group-header` | A relation group header, only rendered when `groupByRelation`. Above `virtualizeAt` this is the internal virtual-list's own group label, re-exported under the same name so both paths present identically. |\n| `node-label` | The row's node `<button>`. |\n| `node-meta` | Secondary node text (type/degree), when present. |\n| `relation` | The relation text. |\n| `row` | One relationship row (`role=\"listitem\"`). Above `virtualizeAt` this is the internal virtual-list's own row wrapper, re-exported under the same name. |"
9171
9353
  },
9172
9354
  "attributes": [
9173
9355
  {
@@ -9188,7 +9370,7 @@
9188
9370
  "name": "label",
9189
9371
  "description": {
9190
9372
  "kind": "markdown",
9191
- "value": "Accessible name; falls back to the localized `neighborListLabel`.\n\nType: `string` \nDefault: `''`"
9373
+ "value": "Accessible name. A host `aria-label` wins over this, then this falls back to the localized\n`neighborListLabel` default.\n\nType: `string` \nDefault: `''`"
9192
9374
  }
9193
9375
  },
9194
9376
  {
@@ -9241,7 +9423,7 @@
9241
9423
  "name": "lr-notebook-viewer",
9242
9424
  "description": {
9243
9425
  "kind": "markdown",
9244
- "value": "`<lr-notebook-viewer>` — read-only Jupyter notebook (nbformat 4.x) renderer, composing existing\ncomponents per cell. Execution is a hard non-goal.\n\nMarkdown cells render through `<lr-markdown>`, code cells through `<lr-code-block>` (using the\nnotebook's kernel language for syntax highlighting), and raw cells as plain preformatted text. A\ncode cell's `execute_result`/`display_data` outputs prefer, in order, `image/png`, `image/jpeg`,\n`image/svg+xml` (sanitized), `text/html` (sanitized), `application/json` (via `<lr-json-viewer>`),\nthen `text/plain`. Stream/error outputs (tinted `danger` for stderr/tracebacks) interpret embedded\nANSI SGR color/style escapes via the shared `internal/ansi.ts` parser, same as `<lr-terminal>`.\nSanitizing raw HTML/SVG\noutput markup lazy-loads the optional peer dependency `dompurify` via `dompurify-loader.ts`; when\nthat peer isn't installed, the output renders a localized notice instead of raw markup.\n\nCells are virtualized through `<lr-virtual-list>` so a notebook with many cells stays cheap to\nscroll. `node-path` anchors resolve `path[0]` as a cell index; `fragment` anchors resolve a cell's\nown `id`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root scroll container. |\n| `cell` | One cell row (`data-cell-type`, `data-active`). |\n| `cell-gutter` | The `In [n]`/`Out [n]` label column. |\n| `cell-source` | A cell's source content. |\n| `error` | The error region. |\n| `output` | One output (`data-output-type`, `data-stream`). |\n| `output-toggle` | Expands/collapses a long text output. |\n| `outputs` | The wrapper around a code cell's outputs. |\n| `spinner` | The loading status region. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-notebook-viewer-max-height` (default: `none`) — Maximum block size of the scrollable body before it scrolls internally. Also settable via the `max-height` property."
9426
+ "value": "`<lr-notebook-viewer>` — read-only Jupyter notebook (nbformat 4.x) renderer, composing existing\ncomponents per cell. Execution is a hard non-goal.\n\nMarkdown cells render through `<lr-markdown>`, code cells through `<lr-code-block>` (using the\nnotebook's kernel language for syntax highlighting), and raw cells as plain preformatted text. A\ncode cell's `execute_result`/`display_data` outputs prefer, in order, `image/png`, `image/jpeg`,\n`image/svg+xml` (sanitized), `text/html` (sanitized), `application/json` (via `<lr-json-viewer>`),\nthen `text/plain`. Stream/error outputs (tinted `danger` for stderr/tracebacks) interpret embedded\nANSI SGR color/style escapes via the shared `internal/ansi.ts` parser, same as `<lr-terminal>`.\nSanitizing raw HTML/SVG\noutput markup lazy-loads the optional peer dependency `dompurify` via `dompurify-loader.ts`; when\nthat peer isn't installed, the output renders a localized notice instead of raw markup.\n\nCells are virtualized through `<lr-virtual-list>` so a notebook with many cells stays cheap to\nscroll. `node-path` anchors resolve `path[0]` as a cell index; `fragment` anchors resolve a cell's\nown `id`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root scroll container. |\n| `cell` | One cell row (`data-cell-type`, `data-active`). |\n| `cell-active` | Added alongside `cell` on the cell an anchor currently targets. A second part name rather than an attribute selector, because Shadow Parts forbids an attribute selector after `::part()`. |\n| `cell-gutter` | The `In [n]`/`Out [n]` label column. |\n| `cell-source` | A cell's source content. |\n| `error` | The error region. |\n| `error-output-label` | The label introducing an error output's traceback. |\n| `output` | One output (`data-output-type`, `data-stream`). |\n| `output-error` | Added alongside `output` on a stderr stream or an error output. |\n| `output-toggle` | Expands/collapses a long text output. |\n| `outputs` | The wrapper around a code cell's outputs. |\n| `spinner` | The loading status region. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-notebook-viewer-max-height` (default: `none`) — Maximum block size of the scrollable body before it scrolls internally. Also settable via the `max-height` property.\n- `--lr-notebook-viewer-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the `[part=\"cell\"]` currently targeted by an anchor."
9245
9427
  },
9246
9428
  "attributes": [
9247
9429
  {
@@ -9285,7 +9467,7 @@
9285
9467
  "name": "lr-number-input",
9286
9468
  "description": {
9287
9469
  "kind": "markdown",
9288
- "value": "`<lr-number-input>` — a numeric-input alias with the complete `lr-input`\nform, validation, and native editing contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `end` | Adornment after the native input and built-in actions. |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n| `start` | Adornment before the native input. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `clear-button` | The clear action, rendered for non-empty clearable text/search inputs. |\n| `end` | Wrapper around the `end` adornment slot. |\n| `error` | The error message. |\n| `form-control` | The outer wrapper around label, input, error and hint. |\n| `form-control-label` | The `<label>` element. |\n| `hint` | The hint message. |\n| `input` | The native `<input>` element. |\n| `input-wrapper` | The row wrapping the native input and the password-toggle button. |\n| `password-toggle` | The show/hide-password button, present only when `type=\"password\"`. |\n| `start` | Wrapper around the `start` adornment slot. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-input-control-min-height` — Outer control height floor, scaled by `size`.\n- `--lr-input-padding-block` — Block padding of the native input, scaled by `size`.\n- `--lr-input-padding-inline` — Inline padding of the control row, scaled by `size`.\n- `--lr-input-font-size` — Font size of the native input, scaled by `size`."
9470
+ "value": "`<lr-number-input>` — a numeric-input alias with the complete `lr-input`\nform, validation, and native editing contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `end` | Adornment after the native input and built-in actions. |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n| `start` | Adornment before the native input. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `clear-button` | The clear action, rendered for non-empty clearable text/search inputs. |\n| `end` | Wrapper around the `end` adornment slot. |\n| `error` | The error message. |\n| `form-control` | The outer wrapper around label, input, error and hint. |\n| `form-control-label` | The `<label>` element. |\n| `hint` | The hint message. |\n| `input` | The native `<input>` element. |\n| `input-wrapper` | The row wrapping the native input and the password-toggle button. |\n| `password-toggle` | The show/hide-password button, present only when `type=\"password\"`. |\n| `start` | Wrapper around the `start` adornment slot. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-input-control-min-height` — Outer control height floor, scaled by `size`.\n- `--lr-input-control-height` — Exact outer control height. Unset by default, which leaves `--lr-input-control-min-height` as a floor only; set it to a length to both floor and cap the control row (e.g. to pixel-match `<lr-select>`/`<lr-combobox>` in the same toolbar). Because it is never declared by the component itself, it can be set from an ancestor or an outer-tree rule as well as inline on the element.\n- `--lr-input-padding-block` — Block padding of the native input, scaled by `size`.\n- `--lr-input-padding-inline` — Inline padding of the control row, scaled by `size`.\n- `--lr-input-font-size` — Font size of the native input, scaled by `size`."
9289
9471
  },
9290
9472
  "attributes": [
9291
9473
  {
@@ -9499,7 +9681,7 @@
9499
9681
  "name": "lr-page-rail",
9500
9682
  "description": {
9501
9683
  "kind": "markdown",
9502
- "value": "`<lr-page-rail>` — a virtualized vertical thumbnail rail for page-addressed documents, with\nper-page highlight heat markers. Two modes: **wired** (`viewer`/`for` supply a live\n`PageThumbnailSource`, e.g. `lr-pdf-viewer` -- thumbnails render lazily as rows materialize, and\nthe rail tracks page/count from the viewer's own events) and **mediated** (`page-count`/`page` are\nhost-bound directly, rows render a placeholder glyph -- still a fully functional pager). In wired\nmode the viewer's `page` is the single source of truth.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The rail. |\n| `heat` | The heat-marker cluster. |\n| `heat-dot` | One tone-colored heat marker (or the `+n` overflow marker). |\n| `page` | One page button. |\n| `page-number` | The visible page number. |\n| `pages` | The embedded `lr-virtual-list`. |\n| `thumbnail` | The thumbnail canvas wrapper. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-page-rail-height` (default: `var(--lr-size-24rem)`) — Block size of the virtualized rail."
9684
+ "value": "`<lr-page-rail>` — a virtualized vertical thumbnail rail for page-addressed documents, with\nper-page highlight heat markers. Two modes: **wired** (`viewer`/`for` supply a live\n`PageThumbnailSource`, e.g. `lr-pdf-viewer` -- thumbnails render lazily as rows materialize, and\nthe rail tracks page/count from the viewer's own events) and **mediated** (`page-count`/`page` are\nhost-bound directly, rows render a placeholder glyph -- still a fully functional pager). In wired\nmode the viewer's `page` is the single source of truth.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The rail. |\n| `heat` | The heat-marker cluster. |\n| `heat-dot` | One tone-colored heat marker (or the `+n` overflow marker). |\n| `heat-dot-accent` | An accent-tone heat marker (also carries `heat-dot`). |\n| `heat-dot-danger` | A danger-tone heat marker (also carries `heat-dot`). |\n| `heat-dot-neutral` | A neutral-tone heat marker (also carries `heat-dot`). |\n| `heat-dot-overflow` | The `+n` overflow marker (also carries `heat-dot`). |\n| `heat-dot-success` | A success-tone heat marker (also carries `heat-dot`). |\n| `heat-dot-warning` | A warning-tone heat marker (also carries `heat-dot`). |\n| `page` | One page button. |\n| `page-current` | The page button for the current `page` (also carries `page`). |\n| `page-number` | The visible page number. |\n| `pages` | The embedded `lr-virtual-list`. |\n| `thumbnail` | The thumbnail canvas wrapper. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-page-rail-height` (default: `var(--lr-size-24rem)`) — Block size of the virtualized rail.\n- `--lr-page-rail-current-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the `[part=\"page-current\"]` button for the current `page`."
9503
9685
  },
9504
9686
  "attributes": [
9505
9687
  {
@@ -9550,7 +9732,7 @@
9550
9732
  "name": "lr-pagination",
9551
9733
  "description": {
9552
9734
  "kind": "markdown",
9553
- "value": "`<lr-pagination>` — controlled, server-friendly page navigation with an\neditable page jump and optional item-range summary.\n\nThe component never mutates `page`. Activating a control emits\n`lr-page-change`; the consumer applies the requested page after its own\nrouting or data-fetch decision. Once the `page` property changes, a polite\nlive region announces the applied page.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The navigation wrapper. |\n| `controls` | The previous/page/next control group. |\n| `live-region` | The visually hidden applied-page announcement. |\n| `next-button` | The next-page button. |\n| `next-icon` | The next-page directional icon. |\n| `page-count` | The total page count shown after the input. |\n| `page-field` | The current-page input and page-count wrapper. |\n| `page-input` | The validated numeric page-jump input. |\n| `previous-button` | The previous-page button. |\n| `previous-icon` | The previous-page directional icon. |\n| `summary` | The item-range summary. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-pagination-control-size` — Control inline/block size; defaults from the `size` variant.\n- `--lr-pagination-font-size` — Control font size; defaults from the `size` variant."
9735
+ "value": "`<lr-pagination>` — controlled, server-friendly page navigation with an\neditable page jump and optional item-range summary.\n\nThe component never mutates `page`. Activating a control emits\n`lr-page-change`; the consumer applies the requested page after its own\nrouting or data-fetch decision. Once the `page` property changes, a polite\nlive region announces the applied page.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The navigation wrapper. |\n| `controls` | The previous/page/next control group. |\n| `live-region` | The visually hidden applied-page announcement. |\n| `next-button` | The next-page button. |\n| `next-icon` | The next-page directional icon. |\n| `page-count` | The total page count shown after the input. |\n| `page-field` | The current-page input and page-count wrapper. |\n| `page-input` | The validated numeric page-jump input. |\n| `previous-button` | The previous-page button. |\n| `previous-icon` | The previous-page directional icon. |\n| `summary` | The item-range summary. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-pagination-control-size` — Control inline/block size; defaults from the `size` variant.\n- `--lr-pagination-font-size` — Control font size; defaults from the `size` variant.\n- `--lr-pagination-control-padding` (default: `var(--lr-space-xs)`) — Inner padding of the nav buttons and the page input. Uniform across every `size` (the control footprint is fixed by `--lr-pagination-control-size`, so this only adjusts the icon/digit inset)."
9554
9736
  },
9555
9737
  "attributes": [
9556
9738
  {
@@ -9680,7 +9862,7 @@
9680
9862
  "name": "lr-pdf-viewer",
9681
9863
  "description": {
9682
9864
  "kind": "markdown",
9683
- "value": "Fetches PDF bytes and renders their pages with the optional `pdfjs-dist` peer. Pages are composed\nthrough `lr-virtual-list`, while a PDF.js text layer keeps rendered text selectable and copyable.\nAdopts `DocumentAnchorTarget`: `page`, `text-quote`, and `region` anchors resolve; highlights paint\nvia one `<lr-highlight-layer>` per page, stacked beneath the text layer (canvas -> highlights ->\ntext layer) so starting a text selection over a cited passage keeps working. Pointer activation of\na highlight is hit-tested at the page-wrapper level (`onPageClick`) since the text layer sitting on\ntop intercepts most direct pointer events; keyboard activation reaches the highlight layer's own\nroving-tabindex rects directly, since z-stacking doesn't affect tab order. Accepted residual: a\nclick that ends a text-selection drag over a highlighted passage never activates it (the\nselection-in-progress check in `onPageClick` exists precisely to distinguish that case from a\ngenuine activation click).\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root viewer container. |\n| `error` | The error message region. |\n| `page` | One rendered page wrapper. |\n| `page-indicator` | The current page text. |\n| `pages` | The virtualized page list. |\n| `search-match` | A painted in-document search match. |\n| `search-match-active` | The currently active search match (also carries `search-match`). |\n| `spinner` | The loading status region. |\n| `text-layer` | Selectable text positioned over a page canvas. |\n| `toolbar` | Pagination and zoom controls. |\n| `zoom-indicator` | The current zoom percentage. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-pdf-viewer-height` (default: `var(--lr-size-24rem)`) — Block size of the virtualized page list."
9865
+ "value": "Fetches PDF bytes and renders their pages with the optional `pdfjs-dist` peer. Pages are composed\nthrough `lr-virtual-list`, while a PDF.js text layer keeps rendered text selectable and copyable.\nAdopts `DocumentAnchorTarget`: `page`, `text-quote`, and `region` anchors resolve; highlights paint\nvia one `<lr-highlight-layer>` per page, stacked beneath the text layer (canvas -> highlights ->\ntext layer) so starting a text selection over a cited passage keeps working. Pointer activation of\na highlight is hit-tested at the page-wrapper level (`onPageClick`) since the text layer sitting on\ntop intercepts most direct pointer events; keyboard activation reaches the highlight layer's own\nroving-tabindex rects directly, since z-stacking doesn't affect tab order. Accepted residual: a\nclick that ends a text-selection drag over a highlighted passage never activates it (the\nselection-in-progress check in `onPageClick` exists precisely to distinguish that case from a\ngenuine activation click).\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root viewer container. |\n| `error` | The error message region. |\n| `page` | One rendered page wrapper. |\n| `page-canvas` | The canvas a page's content is painted onto. |\n| `page-indicator` | The current page text. |\n| `pages` | The virtualized page list. |\n| `search-match` | A painted in-document search match. |\n| `search-match-active` | The currently active search match (also carries `search-match`). |\n| `spinner` | The loading status region. |\n| `text-layer` | Selectable text positioned over a page canvas. |\n| `text-span` | One generated text run inside a page's text layer. |\n| `toolbar` | Pagination and zoom controls. |\n| `zoom-indicator` | The current zoom percentage. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-pdf-viewer-height` (default: `var(--lr-size-24rem)`) — Block size of the virtualized page list. Also settable via the `max-height` property."
9684
9866
  },
9685
9867
  "attributes": [
9686
9868
  {
@@ -9690,6 +9872,13 @@
9690
9872
  "value": "Optional locale override. Otherwise the nearest `locale`/`lang` ancestor is used.\n\nType: `string` \nDefault: `''`"
9691
9873
  }
9692
9874
  },
9875
+ {
9876
+ "name": "max-height",
9877
+ "description": {
9878
+ "kind": "markdown",
9879
+ "value": "A CSS length (e.g. `\"30rem\"`); once set, overrides `--lr-pdf-viewer-height` -- the block size\nof the virtualized page list -- declaratively, the same `max-height` attribute\n`<lr-notebook-viewer>`/`<lr-svg-viewer>`/`<lr-xml-viewer>` expose, rather than requiring a\nconsumer to set the differently-named CSS custom property inline.\n\nType: `string` \nDefault: `''`"
9880
+ }
9881
+ },
9693
9882
  {
9694
9883
  "name": "name",
9695
9884
  "description": {
@@ -9724,7 +9913,7 @@
9724
9913
  "name": "lr-phone-input",
9725
9914
  "description": {
9726
9915
  "kind": "markdown",
9727
- "value": "`<lr-phone-input>` — a country-aware telephone field whose form value is\ncanonical E.164. National formatting and numbering-plan validation are\nsupplied through `adapter`; without one, already-international E.164 input\nremains useful and national input stays editable with `incomplete` validity.\n\nUser edits emit native-style `input` and `change` events. Event detail\nexposes both the canonical `value` and editable `inputValue`; programmatic\nproperty changes are silent. Phone-number text is deliberately LTR while\nthe form chrome and country selector follow the inherited direction. A host\n`aria-label` names the internal telephone input and wins over every derived\nor component-specific fallback.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `country-prefix` | Optional visual displayed before the country selector, such as a flag. |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `calling-code` | The selected country's calling code. |\n| `country-prefix` | Optional country adornment slot wrapper. |\n| `country-select` | The native country selector. |\n| `error` | The error or validation message. |\n| `form-control` | The outer form-control wrapper. |\n| `form-control-label` | The visible label. |\n| `hint` | The hint message. |\n| `input` | The native telephone input. |\n| `input-wrapper` | The country selector and telephone input wrapper. |"
9916
+ "value": "`<lr-phone-input>` — a country-aware telephone field whose form value is\ncanonical E.164. National formatting and numbering-plan validation are\nsupplied through `adapter`; without one, already-international E.164 input\nremains useful and national input stays editable with `incomplete` validity.\n\nUser edits emit native-style `input` and `change` events. Event detail\nexposes both the canonical `value` and editable `inputValue`; programmatic\nproperty changes are silent. Phone-number text is deliberately LTR while\nthe form chrome and country selector follow the inherited direction. A host\n`aria-label` names the internal telephone input and wins over every derived\nor component-specific fallback.\n\nThe country selector keeps the real, fully accessible native `<select>`\n(full country names in its popup, native mobile pickers, type-ahead) but\nrenders it invisibly over a compact visual trigger — selected alpha-2 code\nplus a design-system chevron — so long localized country names never clip\nthe closed control and the calling code isn't shown twice. With `flags`\nset, the trigger also shows the selected country's `<lr-flag>`; actual flag\nartwork still comes from the optional `@aceshooting/lyra-flags` peer,\nregistered by the consumer via `components/media/flag/flag-peer.js`\nexactly as for a standalone `<lr-flag>` (without that registration the\ntrigger simply omits the image). Native `<option>`s cannot contain\nelements, so the open popup remains text-only by platform design.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `country-prefix` | Optional visual displayed before the country selector, such as a flag. |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `calling-code` | The selected country's calling code. |\n| `country` | The country selector region (invisible native select over the visual trigger). |\n| `country-code` | The selected alpha-2 code (or placeholder text) inside the trigger. |\n| `country-prefix` | Optional country adornment slot wrapper. |\n| `country-select` | The native country selector, stretched invisibly over the trigger. |\n| `country-trigger` | The visible, decorative closed-state trigger. |\n| `error` | The error or validation message. |\n| `expand-icon` | The dropdown indicator inside the trigger. |\n| `flag` | The selected country's `<lr-flag>` inside the trigger (only with `flags`). |\n| `form-control` | The outer form-control wrapper. |\n| `form-control-label` | The visible label. |\n| `hint` | The hint message. |\n| `input` | The native telephone input. |\n| `input-wrapper` | The country selector and telephone input wrapper. |"
9728
9917
  },
9729
9918
  "attributes": [
9730
9919
  {
@@ -9790,6 +9979,13 @@
9790
9979
  "value": "Type: `string` \nDefault: `''`"
9791
9980
  }
9792
9981
  },
9982
+ {
9983
+ "name": "flags",
9984
+ "description": {
9985
+ "kind": "markdown",
9986
+ "value": "Show the selected country's flag in the country trigger. Rendering uses `<lr-flag\nvariant=\"compact\">` (the icon-scale tier); the flag artwork itself still comes from the\noptional `@aceshooting/lyra-flags` peer package, which the consumer registers by importing\n`@aceshooting/lyra-ui/components/media/flag/flag-peer.js` — the same contract as a standalone\n`<lr-flag>`. Without that registration (or the peer package) the trigger simply renders no\nimage; nothing flag-related is bundled while this stays `false`. The native popup list stays\ntext-only — an `<option>` cannot contain elements.\n\nType: `boolean` \nDefault: `false`"
9987
+ }
9988
+ },
9793
9989
  {
9794
9990
  "name": "hint",
9795
9991
  "description": {
@@ -9870,7 +10066,7 @@
9870
10066
  "name": "lr-pie-chart",
9871
10067
  "description": {
9872
10068
  "kind": "markdown",
9873
- "value": "`<lr-pie-chart>` — `<lr-chart>` with `type` locked to `\"pie\"`. Single-series:\none `Series` with `data: number[]` and `color: string[]` as the slice palette.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
10069
+ "value": "`<lr-pie-chart>` — `<lr-chart>` with `type` locked to `\"pie\"`. Single-series:\none `Series` with `data: number[]` and `color: string[]` as the slice palette.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `error` | `role=\"alert\"` message shown instead of `canvas` when the optional `chart.js` peer dependency is not installed. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
9874
10070
  },
9875
10071
  "attributes": [
9876
10072
  {
@@ -10033,7 +10229,7 @@
10033
10229
  "name": "loop",
10034
10230
  "description": {
10035
10231
  "kind": "markdown",
10036
- "value": "Type: `boolean` \nDefault: `true`"
10232
+ "value": "Whether playback wraps back to index 0 after the last step instead of pausing there. Defaults\n`true`; uses `trueDefaultBooleanConverter` (declared via `static properties` above) so plain\nHTML `loop=\"false\"` actually clears it -- Lit's default presence-based `type: Boolean`\nconverter cannot distinguish an absent attribute from the literal string `\"false\"`.\n\nType: `boolean` \nDefault: `true`"
10037
10233
  }
10038
10234
  },
10039
10235
  {
@@ -10049,7 +10245,7 @@
10049
10245
  "name": "lr-polar-area-chart",
10050
10246
  "description": {
10051
10247
  "kind": "markdown",
10052
- "value": "`<lr-polar-area-chart>` — `<lr-chart>` with `type` locked to `\"polarArea\"`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
10248
+ "value": "`<lr-polar-area-chart>` — `<lr-chart>` with `type` locked to `\"polarArea\"`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `error` | `role=\"alert\"` message shown instead of `canvas` when the optional `chart.js` peer dependency is not installed. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
10053
10249
  },
10054
10250
  "attributes": [
10055
10251
  {
@@ -10170,7 +10366,7 @@
10170
10366
  "name": "lr-policy-summary",
10171
10367
  "description": {
10172
10368
  "kind": "markdown",
10173
- "value": "`<lr-policy-summary>` — a read-only list of guardrail, permission, privacy, and tool-policy\ndecisions, each carrying an `allow` / `deny` / `needs-review` state and an always-visible,\naccessible explanation of why that decision was made -- never conveyed by color alone.\n\nComposes `<lr-badge>` for the compact per-decision state indicator and `<lr-callout inline>`\nfor the explanation text: the callout's own `role=\"alert\"`/`role=\"status\"` semantics already\ncarry the right urgency per state (`deny` renders as an alert, `allow`/`needs-review` as\nstatus), so this component only needs to pick the matching `variant` rather than re-implement\nthat wiring. `<lr-details>` renders a decision's optional richer `detail` (matched rule text,\npolicy id, cited evidence) behind progressive disclosure, collapsed by default, instead of\nalways showing it alongside the shorter `explanation`.\n\n`decisions` is controlled and never mutated by this component -- pass a new array (e.g. as a\nguardrail pipeline resolves) to update it. This is a summary surface, not an approval gate:\nthere is no per-decision action here, and a decision's `state` is fixed data, not something a\nviewer can change from this component.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper, only rendered while `decisions` is non-empty. |\n| `category` | The decision's localized category text. |\n| `count` | One state's localized count text; carries `data-state`. |\n| `decision` | One decision row (`role=\"listitem\"`); carries `data-state` and `data-category`. |\n| `decision-header` | The row's category/label/state-badge line. |\n| `detail` | The `<lr-details>` progressive-disclosure panel for `detail`, only rendered when a decision defines one. |\n| `empty` | The `<lr-empty>` shown when `decisions` is empty. |\n| `explanation` | The `<lr-callout inline>` wrapping the always-visible `explanation` text. |\n| `label` | The decision's `label` text. |\n| `list` | The `role=\"list\"` wrapper around every decision row. |\n| `state-badge` | The resolved `<lr-badge>` state indicator. |\n| `summary` | The always-visible allow/deny/needs-review count row. |"
10369
+ "value": "`<lr-policy-summary>` — a read-only list of guardrail, permission, privacy, and tool-policy\ndecisions, each carrying an `allow` / `deny` / `needs-review` state and an always-visible,\naccessible explanation of why that decision was made -- never conveyed by color alone.\n\nComposes `<lr-badge>` for the compact per-decision state indicator and `<lr-callout inline>`\nfor the explanation text: the callout's own `role=\"alert\"`/`role=\"status\"` semantics already\ncarry the right urgency per state (`deny` renders as an alert, `allow`/`needs-review` as\nstatus), so this component only needs to pick the matching `variant` rather than re-implement\nthat wiring. `<lr-details>` renders a decision's optional richer `detail` (matched rule text,\npolicy id, cited evidence) behind progressive disclosure, collapsed by default, instead of\nalways showing it alongside the shorter `explanation`.\n\n`decisions` is controlled and never mutated by this component -- pass a new array (e.g. as a\nguardrail pipeline resolves) to update it. This is a summary surface, not an approval gate:\nthere is no per-decision action here, and a decision's `state` is fixed data, not something a\nviewer can change from this component.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper, only rendered while `decisions` is non-empty. |\n| `category` | The decision's localized category text. |\n| `count` | One state's localized count text; carries `data-state`. |\n| `decision` | One decision row (`role=\"listitem\"`); carries `data-state` and `data-category`. |\n| `decision-header` | The row's category/label/state-badge line. |\n| `detail` | The `<lr-details>` progressive-disclosure panel for `detail`, only rendered when a decision defines one. |\n| `empty` | The `<lr-empty>` shown when `decisions` is empty. |\n| `explanation` | The `<lr-callout inline>` wrapping the always-visible `explanation` text. |\n| `label` | The decision's `label` text. |\n| `list` | The `role=\"list\"` wrapper around every decision row. Its accessible name defaults to the localized `policySummaryLabel`, but a host-level `aria-label` on `<lr-policy-summary>` wins over that default. |\n| `state-badge` | The resolved `<lr-badge>` state indicator. |\n| `summary` | The always-visible allow/deny/needs-review count row. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-policy-summary-count-allow-color` (default: `var(--lr-color-success)`) — Text color of the `allow` count.\n- `--lr-policy-summary-count-deny-color` (default: `var(--lr-color-danger)`) — Text color of the `deny` count.\n- `--lr-policy-summary-count-needs-review-color` (default: `var(--lr-color-warning)`) — Text color of the `needs-review` count. Restyling a state count otherwise requires overriding the library-wide status tokens, since `::part(count)[data-state]` is invalid CSS."
10174
10370
  },
10175
10371
  "attributes": [
10176
10372
  {
@@ -10186,7 +10382,7 @@
10186
10382
  "name": "lr-poll-status",
10187
10383
  "description": {
10188
10384
  "kind": "markdown",
10189
- "value": "`<lr-poll-status>` — a \"next scheduled refresh\" countdown with a built-in pause control: a\nticking `M:SS` display counting down to the next scheduled action, a \"Refreshing…\" state at\nzero, a \"Paused\" state while `paused` (instead of freezing on a stale value), and a\npause/resume toggle. First-party invention (no Web Awesome equivalent); the\nclosest existing component, `lr-stream-status`, is scoped to transport/connection-health\nphases, a different concern from a scheduled-interval countdown -- this mirrors its internal\n`<lr-live-region>` composition for accessible phase-transition announcements.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `countdown` | The `M:SS` text (or \"Refreshing…\" once due, or \"Paused\" while `paused`). |\n| `indicator` | The pulsing status dot. |\n| `pause-button` | The built-in pause/resume toggle. |"
10385
+ "value": "`<lr-poll-status>` — a \"next scheduled refresh\" countdown with a built-in pause control: a\nticking `M:SS` display counting down to the next scheduled action, a \"Refreshing…\" state at\nzero, a \"Paused\" state while `paused` (instead of freezing on a stale value), and a\npause/resume toggle. First-party invention (no Web Awesome equivalent); the\nclosest existing component, `lr-stream-status`, is scoped to transport/connection-health\nphases, a different concern from a scheduled-interval countdown -- this mirrors its internal\n`<lr-live-region>` composition for accessible phase-transition announcements.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `countdown` | The `M:SS` text (or \"Refreshing…\" once due, or \"Paused\" while `paused`). |\n| `indicator` | The pulsing status dot. |\n| `pause-button` | The built-in pause/resume toggle. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-poll-status-due-bg` (default: `var(--lr-color-success)`) — Background of `indicator` while `data-due` is set, without repainting every other component that reuses the shared success token."
10190
10386
  },
10191
10387
  "attributes": [
10192
10388
  {
@@ -10444,7 +10640,7 @@
10444
10640
  "name": "lr-push-to-talk",
10445
10641
  "description": {
10446
10642
  "kind": "markdown",
10447
- "value": "`<lr-push-to-talk>` — a mic capture button owning the full `getUserMedia` + `MediaRecorder`\nlifecycle: permission request, recording, optional chunked streaming, teardown. The one place in\nthis library that touches the microphone — no SDK, no LiveKit/ElevenLabs import, native browser\nAPIs only.\n\n`mode=\"hold\"` (the default) is a press-and-hold gesture: pointerdown/Enter-or-Space-keydown starts,\npointerup/keyup/blur stops. `mode=\"toggle\"` is click-to-start/click-to-stop with `aria-pressed`.\nEscape cancels the in-progress take in either mode (discarding it — `lr-record-cancel`, never\n`lr-record-stop`). `state` is a read-only lifecycle reflected to the `data-state` attribute (not\n`state`, avoiding any ambiguity with a native form-control `state`): `'idle' | 'requesting' |\n'denied' | 'recording' | 'error'`. A host-level `aria-label` (set on `<lr-push-to-talk>` itself)\noverrides the computed trigger label.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `icon` | Replaces the default mic glyph. |\n| `recording-icon` | Replaces the default recording-state pulse glyph. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `icon` | Wrapper around the `icon` slot / default mic glyph. |\n| `pulse` | Wrapper around the `recording-icon` slot / default pulse glyph, rendered only while recording. |\n| `status` | Visible status text for the `requesting`/`denied`/`error`/unsupported states. |\n| `timer` | The `M:SS` elapsed-time readout, rendered only while recording and `show-timer`. |\n| `trigger` | The capture button. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-push-to-talk-size` (default: `var(--lr-size-3rem)`) — Inline and block size of the circular `trigger` button."
10643
+ "value": "`<lr-push-to-talk>` — a mic capture button owning the full `getUserMedia` + `MediaRecorder`\nlifecycle: permission request, recording, optional chunked streaming, teardown. The one place in\nthis library that touches the microphone — no SDK, no LiveKit/ElevenLabs import, native browser\nAPIs only.\n\n`mode=\"hold\"` (the default) is a press-and-hold gesture: pointerdown/Enter-or-Space-keydown starts,\npointerup/keyup/blur stops. `mode=\"toggle\"` is click-to-start/click-to-stop with `aria-pressed`.\nEscape cancels the in-progress take in either mode (discarding it — `lr-record-cancel`, never\n`lr-record-stop`). `state` is a read-only lifecycle reflected to the `data-state` attribute (not\n`state`, avoiding any ambiguity with a native form-control `state`): `'idle' | 'requesting' |\n'denied' | 'recording' | 'error'`. A host-level `aria-label` (set on `<lr-push-to-talk>` itself)\noverrides the computed trigger label.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `icon` | Replaces the default mic glyph. |\n| `recording-icon` | Replaces the default recording-state pulse glyph. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `icon` | Wrapper around the `icon` slot / default mic glyph. |\n| `pulse` | Wrapper around the `recording-icon` slot / default pulse glyph, rendered only while recording. |\n| `status` | Visible status text for the `requesting`/`denied`/`error`/unsupported states. |\n| `timer` | The `M:SS` elapsed-time readout, rendered only while recording and `show-timer`. |\n| `trigger` | The capture button. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-push-to-talk-size` (default: `var(--lr-size-3rem)`) — Inline and block size of the circular `trigger` button.\n- `--lr-push-to-talk-recording-color` (default: `var(--lr-color-danger)`) — Border and text color of `[part=\"trigger\"]` while `state` is `recording`. Recolors only the recording treatment, leaving every other danger-toned surface on the page untouched."
10448
10644
  },
10449
10645
  "attributes": [
10450
10646
  {
@@ -10590,7 +10786,7 @@
10590
10786
  "name": "lr-radar-chart",
10591
10787
  "description": {
10592
10788
  "kind": "markdown",
10593
- "value": "`<lr-radar-chart>` — `<lr-chart>` with `type` locked to `\"radar\"`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
10789
+ "value": "`<lr-radar-chart>` — `<lr-chart>` with `type` locked to `\"radar\"`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `error` | `role=\"alert\"` message shown instead of `canvas` when the optional `chart.js` peer dependency is not installed. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
10594
10790
  },
10595
10791
  "attributes": [
10596
10792
  {
@@ -10711,7 +10907,7 @@
10711
10907
  "name": "lr-radio",
10712
10908
  "description": {
10713
10909
  "kind": "markdown",
10714
- "value": "`<lr-radio>` — a form-associated single-choice control. Radios can be used\nalone or inside `<lr-radio-group>`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Label text. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The interactive radio control. |\n| `circle` | The circular radio indicator. |\n| `dot` | The selected indicator. |\n| `label` | The default slot wrapper. |"
10910
+ "value": "`<lr-radio>` — a form-associated single-choice control. Radios can be used\nalone or inside `<lr-radio-group>`.\n\nDeliberately no hint/error chrome of its own -- the default slot already carries real, visible\nlabel text (see `@slot` below), so a labeled-field frame built around `label`/`hint`/`errorText`\nprops has nothing to add here. A consumer needing shared hint/error messaging for a set of\noptions composes it once on the owning `<lr-radio-group>` (which does carry `hint`/`errorText`),\nthe same way a native radio `<fieldset>`/`<legend>` pairs with one externally-owned error node\nshared across all its `<input type=\"radio\">` children rather than one per option.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Label text. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The interactive radio control. |\n| `circle` | The circular radio indicator. |\n| `dot` | The selected indicator. |\n| `label` | The default slot wrapper. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-radio-label-indent` (default: `calc(min(var(--lr-icon-button-size), 1.75rem) + var(--lr-space-s))`) — The inline distance from the control's start edge to the start of the label text, i.e. the circle's own floor plus the gap next to it. Published so a consumer composing per-option hint text under the label can align it without re-deriving that formula from the shadow styles, and used as the source of the real gap so the two cannot drift. Setting it on the element (or on `lr-radio` in your own stylesheet) moves the label; because custom properties inherit down and not sideways, it is *not* readable from a sibling node in your tree — align a sibling by computing the same formula from `--lr-theme-icon-button-size` and `--lr-theme-space-s`, which you control."
10715
10911
  },
10716
10912
  "attributes": [
10717
10913
  {
@@ -11018,7 +11214,7 @@
11018
11214
  "name": "lr-responsive-panel",
11019
11215
  "description": {
11020
11216
  "kind": "markdown",
11021
- "value": "`<lr-responsive-panel>` — the same slotted content either docked inline\nin the page's normal layout flow (desktop) or presented as a full-screen/\nbottom-sheet overlay (mobile), depending on viewport width. Typical uses:\na settings panel or a conversation-history sidebar that's a permanent\ndocked pane on a wide screen but a modal on a phone.\n\nBreakpoint detection uses `matchMedia('(max-width: ' + mobileBreakpoint +\n')')`, re-evaluated live while connected -- resizing/rotating a device\nthat crosses the breakpoint while `mode=\"auto\"` (the default) updates the\neffective presentation without unmounting or re-creating the slotted\ncontent: inline and overlay presentation share the exact same shadow DOM\nstructure (only a css class, and the overlay-only `role`/`aria-modal`\nattributes and backdrop element, differ), so lit-html's diffing keeps\n`[part=\"body\"]` and its `<slot>` as the same DOM node across the\ntransition -- scroll position and focus inside the slotted content survive\nit for free. When an open inline panel becomes modal, focus already inside\nis preserved and outside focus moves to the first available target. Closing\nstill returns to the opener captured by the original inline open.\n\nThe overlay presentation uses the library's shared overlay coordinator for\nfocus trapping, Escape/backdrop dismissal, inerting, and stack ordering,\nwhile retaining this component's own responsive rendering and close event.\n\nAccessible name (overlay presentation only -- the inline presentation has\nno dialog semantics to name), in priority order: if the host element itself\nhas an `aria-label` attribute set, its value wins outright, overriding\nevery source below -- the standard ARIA convention for a consumer that\nwants full control over the announced name, matching lr-dialog's\n`accessibleLabel` pattern. Otherwise `label`, when set, is used verbatim.\nWhen both are empty, this falls back to the `header` slot's content -- a\nheading element (`h1`–`h6` or `[role=\"heading\"]`) among the slotted header\ncontent wins if present, otherwise the header slot's full text content is\nused, mirroring lr-dialog's `detectHeading()`/`headingText` fallback (see\ndialog.ts's module doc for why this uses `aria-label`, a copied string,\nrather than `aria-labelledby`: the header content is light DOM while\n`[part=\"panel\"]` lives in this element's shadow tree, and an ID-reference\nattribute can't resolve across that boundary). A panel opened without a\nhost `aria-label`, `label`, or header content still renders `role=\"dialog\"`\nwith no accessible name -- set one of those to avoid that.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The panel body. |\n| `footer` | Optional footer content (e.g. action buttons), rendered below the body. |\n| `header` | Optional header content, rendered above the body. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `backdrop` | The full-viewport scrim behind the panel -- only rendered in the overlay presentation. |\n| `base` | The root wrapper; `display: none` while closed, positioned `fixed` while open and in the overlay presentation. |\n| `body` | The wrapper around the default slot. |\n| `footer` | The wrapper around the `footer` slot. |\n| `header` | The wrapper around the `header` slot. |\n| `panel` | The panel surface itself (`role=\"dialog\"` while open and in the overlay presentation). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-responsive-panel-overlay-color` (default: `var(--lr-color-overlay)`) — The overlay presentation's scrim color, applied to `[part=\"backdrop\"]`."
11217
+ "value": "`<lr-responsive-panel>` — the same slotted content either docked inline\nin the page's normal layout flow (desktop) or presented as a full-screen/\nbottom-sheet overlay (mobile), depending on viewport width. Typical uses:\na settings panel or a conversation-history sidebar that's a permanent\ndocked pane on a wide screen but a modal on a phone.\n\nBreakpoint detection uses `matchMedia('(max-width: ' + mobileBreakpoint +\n')')`, re-evaluated live while connected -- resizing/rotating a device\nthat crosses the breakpoint while `mode=\"auto\"` (the default) updates the\neffective presentation without unmounting or re-creating the slotted\ncontent: inline and overlay presentation share the exact same shadow DOM\nstructure (only a css class, and the overlay-only `role`/`aria-modal`\nattributes and backdrop element, differ), so lit-html's diffing keeps\n`[part=\"body\"]` and its `<slot>` as the same DOM node across the\ntransition -- scroll position and focus inside the slotted content survive\nit for free. When an open inline panel becomes modal, focus already inside\nis preserved and outside focus moves to the first available target. Closing\nstill returns to the opener captured by the original inline open.\n\nThe overlay presentation uses the library's shared overlay coordinator for\nfocus trapping, Escape/backdrop dismissal, inerting, and stack ordering,\nwhile retaining this component's own responsive rendering and close event.\n\nAccessible name (overlay presentation only -- the inline presentation has\nno dialog semantics to name), in priority order: if the host element itself\nhas an `aria-label` attribute set, its value wins outright, overriding\nevery source below -- the standard ARIA convention for a consumer that\nwants full control over the announced name, matching lr-dialog's\n`accessibleLabel` pattern. Otherwise `label`, when set, is used verbatim.\nWhen both are empty, this falls back to the `header` slot's content -- a\nheading element (`h1`–`h6` or `[role=\"heading\"]`) among the slotted header\ncontent wins if present, otherwise the header slot's full text content is\nused, mirroring lr-dialog's `detectHeading()`/`headingText` fallback (see\ndialog.ts's module doc for why this uses `aria-label`, a copied string,\nrather than `aria-labelledby`: the header content is light DOM while\n`[part=\"panel\"]` lives in this element's shadow tree, and an ID-reference\nattribute can't resolve across that boundary). A panel opened without a\nhost `aria-label`, `label`, or header content still renders `role=\"dialog\"`\nwith no accessible name -- set one of those to avoid that.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The panel body. |\n| `footer` | Optional footer content (e.g. action buttons), rendered below the body. |\n| `header` | Optional header content, rendered above the body. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `backdrop` | The full-viewport scrim behind the panel -- only rendered in the overlay presentation. |\n| `base` | The root wrapper; `display: none` while closed, positioned `fixed` while open and in the overlay presentation. |\n| `body` | The wrapper around the default slot. |\n| `footer` | The wrapper around the `footer` slot. |\n| `header` | The wrapper around the `header` slot. |\n| `panel` | The panel surface itself (`role=\"dialog\"` while open and in the overlay presentation). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-responsive-panel-overlay-color` (default: `var(--lr-color-overlay)`) — The overlay presentation's scrim color, applied to `[part=\"backdrop\"]`.\n- `--lr-responsive-panel-sheet-max-block-size` (default: `85dvh`) — Maximum height of the `variant=\"bottom-sheet\"` overlay panel (falls back to `85vh` where `dvh` is unsupported)."
11022
11218
  },
11023
11219
  "attributes": [
11024
11220
  {
@@ -11076,9 +11272,23 @@
11076
11272
  "name": "lr-result-card",
11077
11273
  "description": {
11078
11274
  "kind": "markdown",
11079
- "value": "`<lr-result-card>` — a small bordered card shell for a custom tool-result\nrenderer's body (see `<lr-tool-result-view>`'s `registerToolRenderer()`\nin `../tool-result-view/registry.js`). Purely visual, with no state of its\nown beyond slot-presence tracking: it gives every custom renderer the same\n\"small card\" language (border, radius, optional title + header actions)\nwithout each one hand-rolling its own box.\n\nPairs with `<lr-result-field>` for the label/value rows that typically\nmake up the body, though the default slot accepts any content — nothing\nhere requires a `<lr-result-field>` specifically.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The card body — typically one or more `<lr-result-field>` rows. |\n| `actions` | Small header controls (e.g. a copy button), rendered alongside the title. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The wrapper around the `actions` slot. `hidden` whenever the slot has no assigned content. |\n| `base` | The outer bordered container. |\n| `body` | The wrapper around the default slot. |\n| `header` | The header row wrapping the title and the `actions` slot. Present in the DOM at all times (so a later `slotchange` on `actions` is still observed) but `hidden` whenever there is no `title` and no `actions` content — an untitled, action-less card has no visible header bar at all. |\n| `title` | The title text. Truncates with an ellipsis when it overflows; carries its own native `title` attribute (the full string) so hovering the truncated text reveals it via the browser's default tooltip, scoped to just this element rather than the whole card. The host's own `title` attribute is stripped once Lit has synced it into the `title` property (see `StripHostTitleAttribute` in `internal/strip-host-title.ts`), so the native tooltip never also covers the rest of the card. |"
11275
+ "value": "`<lr-result-card>` — a small bordered card shell for a custom tool-result\nrenderer's body (see `<lr-tool-result-view>`'s `registerToolRenderer()`\nin `../tool-result-view/registry.js`). Purely visual, with no state of its\nown beyond slot-presence tracking: it gives every custom renderer the same\n\"small card\" language (border, radius, optional title + header actions)\nwithout each one hand-rolling its own box.\n\nPairs with `<lr-result-field>` for the label/value rows that typically\nmake up the body, though the default slot accepts any content — nothing\nhere requires a `<lr-result-field>` specifically.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The card body — typically one or more `<lr-result-field>` rows. |\n| `actions` | Small header controls (e.g. a copy button), rendered alongside the title. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The wrapper around the `actions` slot. `hidden` whenever the slot has no assigned content. |\n| `base` | The outer bordered container. |\n| `body` | The wrapper around the default slot. |\n| `header` | The header row wrapping the title and the `actions` slot. Present in the DOM at all times (so a later `slotchange` on `actions` is still observed) but `hidden` whenever there is no `title` and no `actions` content — an untitled, action-less card has no visible header bar at all. |\n| `title` | The title text. Truncates with an ellipsis when it overflows; carries its own native `title` attribute (the full string) so hovering the truncated text reveals it via the browser's default tooltip, scoped to just this element rather than the whole card. The host's own `title` attribute is stripped once Lit has synced it into the `title` property (see `StripHostTitleAttribute` in `internal/strip-host-title.ts`), so the native tooltip never also covers the rest of the card. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-result-card-compact-header-padding` (default: `var(--lr-space-xs)`) — `[part=\"header\"]` block/inline padding while `compact`.\n- `--lr-result-card-compact-body-padding` (default: `var(--lr-space-xs)`) — `[part=\"body\"]` padding while `compact`."
11080
11276
  },
11081
11277
  "attributes": [
11278
+ {
11279
+ "name": "appearance",
11280
+ "description": {
11281
+ "kind": "markdown",
11282
+ "value": "Visual chrome, mirroring `lr-card`'s/`lr-agent-run`'s `appearance` vocabulary. `'card'` (the\ndefault) keeps the bordered, filled box. `'plain'` removes the border, background, and corner\nradius, so a card nested inside a host frame that already draws a border (e.g.\n`<lr-tool-result-view>`'s own chrome) doesn't double it. `plain` wins over `compact` when\nboth are set (nothing left to tighten).\n\nType: `ResultCardAppearance` \nDefault: `'card'`"
11283
+ }
11284
+ },
11285
+ {
11286
+ "name": "compact",
11287
+ "description": {
11288
+ "kind": "markdown",
11289
+ "value": "Tighter header/body padding for dense contexts (a card rendered as a row in a transcript or\nresult list) -- same convention as `lr-agent-run`'s `compact`. Defaults to `false`, i.e. the\nfull card padding. Purely a density knob: the border and background stay, so use\n`appearance=\"plain\"` instead to drop the chrome entirely.\n\nType: `boolean` \nDefault: `false`"
11290
+ }
11291
+ },
11082
11292
  {
11083
11293
  "name": "locale",
11084
11294
  "description": {
@@ -11129,7 +11339,7 @@
11129
11339
  "name": "lr-retrieval-results",
11130
11340
  "description": {
11131
11341
  "kind": "markdown",
11132
- "value": "`<lr-retrieval-results>` — the orchestration-level ranked-chunk-list surface: takes raw\n`RetrievalChunk[]` (the shared retrieval-and-grounding type from `src/ai/types.ts`) and adds\neverything a single retrieval call's result set needs beyond what one chunk's own rendering\nprovides -- deduplication, optional grouping by source, multi-selection, pagination/infinite\nloading, and a compact/expanded presentation switch -- while composing existing primitives for\nevery part that already has one, never re-implementing chunk/score/source rendering itself.\n\n**Composition, not reinvention.** Each rendered row wraps exactly one chunk in an internal\n`<lr-chunk-inspector>` (fed a single-element `chunks` array), reusing its score bar/tier\ncoloring, title+page rendering, expandable text, and `compact` mode verbatim -- this component\nnever hand-rolls chunk-card markup. `metadata` (arbitrary `Record<string, unknown>`, which no\nexisting primitive renders) is the one genuinely new bit of presentation here, shown as a plain\nkey/value list in `expanded` presentation only. Large result sets are windowed through an\ninternal `<lr-virtual-list>`, exactly like `<lr-thread-list>`'s own data-mode rendering -- each\nrow's rendered content therefore lives inside `<lr-virtual-list>`'s own shadow root, not this\ncomponent's, whenever virtualization is active (see that component's own doc for why).\n\n**Controlled component.** `chunks`/`selectedIds`/`loading`/`error`/`hasMore` are all host-owned;\nthis component never fetches, retries, or mutates its own copy of `chunks`. Selecting a row\nupdates `selectedIds` locally *then* emits `lr-select` (the same \"update own copy, then emit;\nreassign to control\" convention `<lr-source-picker>` already uses) so a host can either accept\nthe update as-is or override it before the next render.\n\n**Deduplication** keeps, per duplicate `id`, whichever chunk has the higher `score` -- set\n`dedupe=\"false\"` to see every raw entry `chunks` contains, duplicates included. **Grouping**\n(`grouping=\"source\"`) buckets the deduplicated, score-sorted list by `source.id`, each bucket\nordered by its own best-scoring chunk first, and always renders through the internal\n`<lr-virtual-list>` (regardless of `virtualize-at`) so group headers have a single rendering path\n— `<lr-thread-list>`'s own date-bucket grouping takes the identical approach.\n\n**Pagination.** While virtualized, `has-more`/`loading` are forwarded straight to the internal\n`<lr-virtual-list>`, which fires `lr-load-more` itself on scroll-near-bottom (re-emitted here\nunchanged). Below the virtualization threshold (a short, non-grouped list), scrolling near the\nbottom isn't a meaningful gesture, so a `[part=\"load-more\"]` button takes its place instead,\nshowing a spinner in place of the button while `loading` is true.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer container. |\n| `empty` | The `<lr-empty>` wrapper, shown when `chunks` is empty and neither `error` nor `loading` is set. |\n| `error` | The error message region (`role=\"alert\"`), shown while `error` is non-empty. |\n| `group-header` | Exported from the internal `<lr-virtual-list>`'s `group` part — grouped/virtualized mode only. |\n| `load-more` | The \"Load more\" button itself (non-virtualized mode, `loading` false). |\n| `load-more-row` | The wrapper around the non-virtualized-mode pagination footer. |\n| `metadata` | The `<dl>` of a chunk's `metadata` entries — omitted entirely when a chunk has no `metadata`, or while `presentation=\"compact\"`. |\n| `metadata-entry` | One metadata key/value pair's wrapper. |\n| `row` | One result row's wrapper. Below the virtualization threshold this is a plain, directly-styleable element in this component's own shadow root; while virtualized it is exported from the internal `<lr-virtual-list>`'s own `row` part instead (`::part(row)` still reaches it either way). |\n| `row-body` | The wrapper around a row's `<lr-chunk-inspector>` plus its optional metadata list; carries `data-selected` while that row is selected. |\n| `select` | The per-row `<lr-checkbox>`, omitted entirely when `selectable` is false. |\n| `spinner` | The initial-load `<lr-spinner>`, shown while `loading` is true and `chunks` is still empty. |"
11342
+ "value": "`<lr-retrieval-results>` — the orchestration-level ranked-chunk-list surface: takes raw\n`RetrievalChunk[]` (the shared retrieval-and-grounding type from `src/ai/types.ts`) and adds\neverything a single retrieval call's result set needs beyond what one chunk's own rendering\nprovides -- deduplication, optional grouping by source, multi-selection, pagination/infinite\nloading, and a compact/expanded presentation switch -- while composing existing primitives for\nevery part that already has one, never re-implementing chunk/score/source rendering itself.\n\n**Composition, not reinvention.** Each rendered row wraps exactly one chunk in an internal\n`<lr-chunk-inspector>` (fed a single-element `chunks` array), reusing its score bar/tier\ncoloring, title+page rendering, expandable text, and `compact` mode verbatim -- this component\nnever hand-rolls chunk-card markup. `metadata` (arbitrary `Record<string, unknown>`, which no\nexisting primitive renders) is the one genuinely new bit of presentation here, shown as a plain\nkey/value list in `expanded` presentation only. Large result sets are windowed through an\ninternal `<lr-virtual-list>`, exactly like `<lr-thread-list>`'s own data-mode rendering -- each\nrow's rendered content therefore lives inside `<lr-virtual-list>`'s own shadow root, not this\ncomponent's, whenever virtualization is active (see that component's own doc for why).\n\n**Controlled component.** `chunks`/`selectedIds`/`loading`/`error`/`hasMore` are all host-owned;\nthis component never fetches, retries, or mutates its own copy of `chunks`. Selecting a row\nupdates `selectedIds` locally *then* emits `lr-select` (the same \"update own copy, then emit;\nreassign to control\" convention `<lr-source-picker>` already uses) so a host can either accept\nthe update as-is or override it before the next render.\n\n**Deduplication** keeps, per duplicate `id`, whichever chunk has the higher `score` -- set\n`dedupe=\"false\"` to see every raw entry `chunks` contains, duplicates included. **Grouping**\n(`grouping=\"source\"`) buckets the deduplicated, score-sorted list by `source.id`, each bucket\nordered by its own best-scoring chunk first, and always renders through the internal\n`<lr-virtual-list>` (regardless of `virtualize-at`) so group headers have a single rendering path\n— `<lr-thread-list>`'s own date-bucket grouping takes the identical approach.\n\n**Pagination.** While virtualized, `has-more`/`loading` are forwarded straight to the internal\n`<lr-virtual-list>`, which fires `lr-load-more` itself on scroll-near-bottom (re-emitted here\nunchanged). Below the virtualization threshold (a short, non-grouped list), scrolling near the\nbottom isn't a meaningful gesture, so a `[part=\"load-more\"]` button takes its place instead,\nshowing a spinner in place of the button while `loading` is true.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer container. |\n| `chunk` | The per-row `<lr-chunk-inspector>`'s own `chunk` row. |\n| `chunk-current` | The row `<lr-chunk-inspector>`'s current-chunk state part. |\n| `chunk-open-button` | The row chunk's title/open `<button>`. |\n| `chunk-score` | The row chunk's percent-score line. |\n| `chunk-score-bar` | The row chunk's score bar track. |\n| `chunk-score-current` | The current row chunk's score line. |\n| `chunk-score-fill` | The row chunk's score bar fill. |\n| `chunk-score-fill-danger` | The row chunk's score fill in the low-score tier. |\n| `chunk-score-fill-success` | The row chunk's score fill in the high-score tier. |\n| `chunk-score-fill-warning` | The row chunk's score fill in the medium-score tier. |\n| `chunk-text` | The row chunk's text preview (`presentation=\"expanded\"` only). |\n| `chunk-text-clamped` | The row chunk's text preview while still collapsed. |\n| `chunk-title` | The row chunk's visible title text. |\n| `chunk-toggle` | The row chunk's \"Show more\"/\"Show less\" button. |\n| `empty` | The `<lr-empty>` wrapper, shown when `chunks` is empty and neither `error` nor `loading` is set. |\n| `error` | The error message region (`role=\"alert\"`), shown while `error` is non-empty. |\n| `group-header` | Exported from the internal `<lr-virtual-list>`'s `group` part — grouped/virtualized mode only. |\n| `load-more` | The \"Load more\" button itself (non-virtualized mode, `loading` false). |\n| `load-more-row` | The wrapper around the non-virtualized-mode pagination footer. |\n| `metadata` | The `<dl>` of a chunk's `metadata` entries — omitted entirely when a chunk has no `metadata`, or while `presentation=\"compact\"`. |\n| `metadata-entry` | One metadata key/value pair's wrapper. |\n| `metadata-term` | The `<dt>` carrying a metadata key. Named separately because `::part()` matches one element and cannot be followed into its subtree. |\n| `metadata-value` | The `<dd>` carrying a metadata value. |\n| `row` | One result row's wrapper. Below the virtualization threshold this is a plain, directly-styleable element in this component's own shadow root; while virtualized it is exported from the internal `<lr-virtual-list>`'s own `row` part instead (`::part(row)` still reaches it either way). |\n| `row-body` | The wrapper around a row's `<lr-chunk-inspector>` plus its optional metadata list; carries `data-selected` while that row is selected. |\n| `row-body-selected` | Additional part on a selected `row-body`. State is exposed as a second part name because Shadow Parts forbids an attribute selector after `::part()` — `::part(row-body)[data-selected]` is invalid CSS, and while virtualized `::part()` is the only way in. A state part is a second token in the same `part` attribute, so a `[part~=\"…\"]` (not `[part=\"…\"]`) selector is the one that matches inside a tree. |\n| `select` | The per-row `<lr-checkbox>`, omitted entirely when `selectable` is false. |\n| `spinner` | The initial-load `<lr-spinner>`, shown while `loading` is true and `chunks` is still empty. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-retrieval-results-selected-border` (default: `var(--lr-color-brand)`) — Inline-start border color marking a selected `[part=\"row-body\"]`. A border rather than a fill by design (see the styles file), so recoloring it carries no contrast risk for the row's own text."
11133
11343
  },
11134
11344
  "attributes": [
11135
11345
  {
@@ -11318,7 +11528,7 @@
11318
11528
  "name": "lr-retrieval-trace",
11319
11529
  "description": {
11320
11530
  "kind": "markdown",
11321
- "value": "`<lr-retrieval-trace>` — a retrieval pipeline's stage timeline (query rewriting, embedding,\nretrieval, reranking, filtering), rendered through `<lr-span-waterfall>`'s existing\ntime-scaled bar rendering, plus a disclosure list below it exposing each stage's evidence:\nfree-form text, retrieved/reranked/filtered chunks via `<lr-chunk-inspector>`, and/or arbitrary\nstage metadata. Never fetches, ranks, or computes retrieval results itself.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `evidence-body` | A stage's evidence content wrapper, hidden while collapsed. |\n| `evidence-list` | The wrapper around every stage's evidence disclosure row. Omitted when no stage has evidence. |\n| `evidence-metadata` | A stage's key/value metadata list (a `<dl>`). |\n| `evidence-metadata-key` | One metadata entry's key (a `<dt>`). |\n| `evidence-metadata-row` | One metadata entry's `<dt>`/`<dd>` pair wrapper, inside `evidence-metadata`. |\n| `evidence-metadata-value` | One metadata entry's value (a `<dd>`). |\n| `evidence-row` | One stage's evidence disclosure row. Omitted for a stage with no evidence. |\n| `evidence-text` | A stage's free-form text evidence. |\n| `evidence-toggle` | A stage's evidence disclosure `<button>`. |\n| `evidence-toggle-icon` | The disclosure button's chevron glyph. |\n| `timeline` | The internal `<lr-span-waterfall>` element. |"
11531
+ "value": "`<lr-retrieval-trace>` — a retrieval pipeline's stage timeline (query rewriting, embedding,\nretrieval, reranking, filtering), rendered through `<lr-span-waterfall>`'s existing\ntime-scaled bar rendering, plus a disclosure list below it exposing each stage's evidence:\nfree-form text, retrieved/reranked/filtered chunks via `<lr-chunk-inspector>`, and/or arbitrary\nstage metadata. Never fetches, ranks, or computes retrieval results itself.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `evidence-body` | A stage's evidence content wrapper, hidden while collapsed. |\n| `evidence-list` | The wrapper around every stage's evidence disclosure row. Omitted when no stage has evidence. |\n| `evidence-metadata` | A stage's key/value metadata list (a `<dl>`). |\n| `evidence-metadata-key` | One metadata entry's key (a `<dt>`). |\n| `evidence-metadata-row` | One metadata entry's `<dt>`/`<dd>` pair wrapper, inside `evidence-metadata`. |\n| `evidence-metadata-value` | One metadata entry's value (a `<dd>`). |\n| `evidence-row` | One stage's evidence disclosure row. Omitted for a stage with no evidence. |\n| `evidence-text` | A stage's free-form text evidence. |\n| `evidence-toggle` | A stage's evidence disclosure `<button>`. |\n| `evidence-toggle-icon` | The disclosure button's chevron glyph. |\n| `timeline` | The internal `<lr-span-waterfall>` element. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-retrieval-trace-active-border` (default: `var(--lr-color-brand)`) — Border color of the `[part=\"evidence-row\"]` whose stage matches `activeStageId`."
11322
11532
  },
11323
11533
  "attributes": [
11324
11534
  {
@@ -11399,7 +11609,7 @@
11399
11609
  "name": "lr-scatter-chart",
11400
11610
  "description": {
11401
11611
  "kind": "markdown",
11402
- "value": "`<lr-scatter-chart>` — `<lr-chart>` with `type` locked to `\"scatter\"`. Feed\npoints via `Series.points`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
11612
+ "value": "`<lr-scatter-chart>` — `<lr-chart>` with `type` locked to `\"scatter\"`. Feed\npoints via `Series.points`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `center` | Optional overlay content positioned at the chart area's center. Useful for doughnut and pie totals. |\n| `data-table` | An optional consumer-provided accessible table alternative. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The chart wrapper. |\n| `canvas` | The Chart.js canvas. |\n| `center` | The chart-area-centered overlay wrapper for the `center` slot. |\n| `data-table` | The optional generated or slotted data table. |\n| `description` | The accessible chart summary. |\n| `error` | `role=\"alert\"` message shown instead of `canvas` when the optional `chart.js` peer dependency is not installed. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-chart-height` (default: `var(--lr-size-280px)`) — The host's `block-size`. Set on the host element from the `height` property on every change (custom properties only cascade downward, so it cannot be set from inside the shadow root); a host-level override is overwritten the next time `height` changes.\n- `--lr-chart-grid-color` (default: `var(--lr-color-border)`) — Grid-line color. Resolved via `getComputedStyle` on every draw (Chart.js paints to canvas and cannot consume `var()`).\n- `--lr-chart-tick-color` (default: `var(--lr-color-text-quiet)`) — Axis tick-label color; also used for the `xLabel`/`yLabel`/`y2Label` axis-title text (there is no separate title-color token). Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-bg` (default: `var(--lr-color-surface)`) — Tooltip background color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-tooltip-text` (default: `var(--lr-color-text)`) — Tooltip text color. Resolved via `getComputedStyle` on every draw."
11403
11613
  },
11404
11614
  "attributes": [
11405
11615
  {
@@ -11571,7 +11781,7 @@
11571
11781
  "name": "lr-segmented",
11572
11782
  "description": {
11573
11783
  "kind": "markdown",
11574
- "value": "`<lr-segmented>` — a single-select button row with the WAI-ARIA APG `radiogroup` contract\nbuilt in: `role=\"radiogroup\"`/`role=\"radio\"`, roving tabindex, automatic activation (click or\narrow-key move both select immediately, like a native radio group), cyclic Arrow/Home/End\nnavigation among non-disabled items. First-party invention --\n\"choose exactly one of N labeled options, rendered as a button row\" is ubiquitous\nsettings/filter-panel UI. Supports the same `2xs`-`xl` compact-form-control `size` scale as\n`<lr-select>`/`<lr-combobox>`/`<lr-input>`, so it can sit flush beside those controls in a\ntoolbar at a matching height.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The `role=\"radiogroup\"` root. |\n| `segment` | A single `role=\"radio\"` button. |\n| `segment-icon` | Optional leading visual supplied by the item's `icon` field; content may have a natural aspect ratio and is not restricted to a square icon. |\n| `segment-label` | The segment's label text. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-scroll-fade-size` (default: `2rem`) — Width of the static fade at each horizontal scroll edge.\n- `--lr-segmented-track-min-height` (default: `auto`) — Minimum height of the `base` track. Re-set per `size` (`2xs` through `xl`); the `auto` default applies at the unset/`m` size.\n- `--lr-segmented-segment-padding` (default: `var(--lr-size-0-125rem) var(--lr-space-s)`) — Each segment's padding. Re-set per `size`; this default applies at the unset/`m` size.\n- `--lr-segmented-font-size` (default: `var(--lr-font-size-sm)`) — Each segment's font size. Re-set per `size`; this default applies at the unset/`m` size."
11784
+ "value": "`<lr-segmented>` — a single-select button row with the WAI-ARIA APG `radiogroup` contract\nbuilt in: `role=\"radiogroup\"`/`role=\"radio\"`, roving tabindex, automatic activation (click or\narrow-key move both select immediately, like a native radio group), cyclic Arrow/Home/End\nnavigation among non-disabled items. First-party invention --\n\"choose exactly one of N labeled options, rendered as a button row\" is ubiquitous\nsettings/filter-panel UI. Supports the same `2xs`-`xl` compact-form-control `size` scale as\n`<lr-select>`/`<lr-combobox>`/`<lr-input>`, so it can sit flush beside those controls in a\ntoolbar at a matching height.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The `role=\"radiogroup\"` root. |\n| `segment` | A single `role=\"radio\"` button. |\n| `segment-icon` | Optional leading visual supplied by the item's `icon` field; content may have a natural aspect ratio and is not restricted to a square icon. |\n| `segment-label` | The segment's label text. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-scroll-fade-size` (default: `2rem`) — Width of the static fade at each horizontal scroll edge.\n- `--lr-segmented-track-min-height` (default: `var(--lr-size-2-5rem)`) — Minimum height of the `base` track. Re-set per `size` (`2xs` through `xl`); the `2.5rem` (40px) default applies at the unset/`m` size, matching `<lr-input>`/`<lr-select>`/`<lr-combobox>`'s own shared default-tier floor. Because it is declared on `:host` per tier, override it on the element itself, not on an ancestor.\n- `--lr-segmented-track-height` — Exact height of the `base` track, pinning it at every `size` tier (sets both `block-size` and `min-block-size`) so the row can sit flush beside a hard-sized toolbar control. **Genuinely unset by default** — while unset each tier keeps its own `--lr-segmented-track-min-height` floor and the track grows with its content.\n- `--lr-segmented-selected-bg` (default: `var(--lr-color-surface)`) — Background of the checked segment. Scoped to `[aria-checked='true']` only, so it never repaints a hovered unselected segment (which is what hijacking `--lr-color-surface` library-wide used to do).\n- `--lr-segmented-selected-color` (default: `var(--lr-color-text)`) — Text color of the checked segment.\n- `--lr-segmented-selected-font-weight` (default: `var(--lr-font-weight-semibold)`) — Font weight of the checked segment.\n- `--lr-segmented-selected-shadow` (default: `var(--lr-shadow)`) — Box shadow lifting the checked segment off the track.\n- `--lr-segmented-hover-color` (default: `var(--lr-color-text)`) — Text color of a hovered segment that is neither checked nor disabled. Independent of the selected-state props above — recoloring the checked pill leaves this untouched.\n- `--lr-segmented-segment-padding` (default: `var(--lr-size-0-125rem) var(--lr-space-s)`) — Each segment's padding. Re-set per `size`; this default applies at the unset/`m` size.\n- `--lr-segmented-font-size` (default: `var(--lr-font-size-sm)`) — Each segment's font size. Re-set per `size`; this default applies at the unset/`m` size."
11575
11785
  },
11576
11786
  "attributes": [
11577
11787
  {
@@ -11608,7 +11818,7 @@
11608
11818
  "name": "lr-select",
11609
11819
  "description": {
11610
11820
  "kind": "markdown",
11611
- "value": "`<lr-select>` — a plain closed-list dropdown: a direct `<lr-*>`\ncounterpart to `<wa-select>`/`<wa-option>`. Trigger is a button (not a text\ninput) -- click/Enter/Space/ArrowDown opens it, there's no typing-to-filter.\nA printable keypress instead jumps (or, while closed, directly selects) the\nnext option whose label starts with what's been typed, like a native\n`<select>`'s type-ahead.\n\nOptions are `<lr-option value>` children, the same element `<lr-combobox>`\nuses. Unlike `lr-combobox` this is single-select only, with no filter/\nsource/with-clear/max-options-visible/empty-text/max-render/multiple surface\n-- see `<lr-combobox>` for the filterable/multi-select case.\n\nReuses `lr-combobox`'s popup positioning (`internal/positioner.js`) and\nclick-outside/Escape/Home/End/Arrow-key listbox navigation patterns,\nadapted to a trigger button that keeps DOM focus throughout (the listbox's\n\"active\" row is conveyed via `aria-activedescendant`, never actual focus),\nmatching the WAI-ARIA \"select-only combobox\" pattern.\n\nWhen `autoCommitSingleOption` is set and exactly one option is enabled\n(regardless of how many disabled ones exist alongside it), the popup never\nopens at all: a click, Enter, Space, ArrowDown, or ArrowUp on the trigger\ncommits that sole option directly, and the trigger renders as a plain\n`role=\"button\"` with no chevron/`aria-haspopup`/`aria-expanded` rather than\na combobox with a permanently inert popup state — opening a one-row list to\npick the only available choice is pure friction with no real decision\nbehind it. This never changes `value`/validity defaults on its own — an\nunselected single-option select stays unselected (and a `required` one\nstays invalid) exactly like the multi-option case, until the trigger is\nactually activated. `autoCommitSingleOption` defaults to `false`: by\ndefault a select always renders the normal combobox/listbox/chevron\ntrigger no matter how many options are enabled, matching pre-1.3.0\nbehavior — opt in explicitly if a narrowing-to-one option list should\nauto-commit.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-option>` elements. |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `error` | The error message. |\n| `expand-icon` | The dropdown indicator. |\n| `form-control` | The outer wrapper around label, trigger, listbox, error and hint. |\n| `form-control-label` | The `<label>` element. |\n| `group-label` | An option group's heading row (shown when any option declares a `group`). |\n| `hint` | The hint message. |\n| `listbox` | The options popover. |\n| `option` | An option row. |\n| `option-dot` | An option row's leading status dot (when `dot-color` is set). |\n| `option-label` | An option row's label/sub wrapper. |\n| `option-sub` | An option row's secondary line (when `sub` is set). |\n| `trigger` | The trigger button (positioning anchor). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-select-expand-size` — Decorative expand-icon box size, scaled by `size`.\n- `--lr-select-trigger-padding` — Trigger padding shorthand, scaled by `size`.\n- `--lr-select-trigger-min-height` — Trigger block-size floor, scaled by `size`. Applied only for the `xs`/`s`/`l`/`xl` tiers see the stylesheet note; the default tier stays floor-free.\n- `--lr-select-font-size` — Trigger font size, scaled by `size`.\n- `--lr-select-trigger-height` (default: `auto`) — Exact trigger height. Left at `auto` the trigger is floored only; set it to a length to both floor and cap the trigger (e.g. to pixel-match a sibling field in the same row)."
11821
+ "value": "`<lr-select>` — a plain closed-list dropdown: a direct `<lr-*>`\ncounterpart to `<wa-select>`/`<wa-option>`. Trigger is a button (not a text\ninput) -- click/Enter/Space/ArrowDown opens it, there's no typing-to-filter.\nA printable keypress instead jumps (or, while closed, directly selects) the\nnext option whose label starts with what's been typed, like a native\n`<select>`'s type-ahead.\n\nOptions are `<lr-option value>` children, the same element `<lr-combobox>`\nuses. Unlike `lr-combobox` this is single-select only, with no filter/\nsource/with-clear/max-options-visible/empty-text/max-render/multiple surface\n-- see `<lr-combobox>` for the filterable/multi-select case.\n\nReuses `lr-combobox`'s popup positioning (`internal/positioner.js`) and\nclick-outside/Escape/Home/End/Arrow-key listbox navigation patterns,\nadapted to a trigger button that keeps DOM focus throughout (the listbox's\n\"active\" row is conveyed via `aria-activedescendant`, never actual focus),\nmatching the WAI-ARIA \"select-only combobox\" pattern.\n\nWhen `autoCommitSingleOption` is set and exactly one option is enabled\n(regardless of how many disabled ones exist alongside it), the popup never\nopens at all: a click, Enter, Space, ArrowDown, or ArrowUp on the trigger\ncommits that sole option directly, and the trigger renders as a plain\n`role=\"button\"` with no chevron/`aria-haspopup`/`aria-expanded` rather than\na combobox with a permanently inert popup state — opening a one-row list to\npick the only available choice is pure friction with no real decision\nbehind it. This never changes `value`/validity defaults on its own — an\nunselected single-option select stays unselected (and a `required` one\nstays invalid) exactly like the multi-option case, until the trigger is\nactually activated. `autoCommitSingleOption` defaults to `false`: by\ndefault a select always renders the normal combobox/listbox/chevron\ntrigger no matter how many options are enabled, matching pre-1.3.0\nbehavior — opt in explicitly if a narrowing-to-one option list should\nauto-commit.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-option>` elements. |\n| `end` | Adornment after the selected-value label and before the expand icon. |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n| `start` | Adornment at the inline-start of the trigger row, before the selected-value label. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `end` | Wrapper around the `end` adornment slot; `hidden` while nothing is slotted. |\n| `error` | The error message. |\n| `expand-icon` | The dropdown indicator. |\n| `form-control` | The outer wrapper around label, trigger, listbox, error and hint. |\n| `form-control-label` | The `<label>` element. |\n| `group-label` | An option group's heading row (shown when any option declares a `group`). |\n| `hint` | The hint message. |\n| `listbox` | The options popover. |\n| `option` | An option row. |\n| `option-dot` | An option row's leading status dot (when `dot-color` is set). |\n| `option-label` | An option row's label/sub wrapper. |\n| `option-sub` | An option row's secondary line (when `sub` is set). |\n| `start` | Wrapper around the `start` adornment slot; `hidden` while nothing is slotted. |\n| `trigger` | The trigger button (positioning anchor). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-select-expand-size` — Decorative expand-icon box size, scaled by `size`.\n- `--lr-select-trigger-padding` — Trigger padding shorthand, scaled by `size`.\n- `--lr-select-trigger-min-height` — Trigger block-size floor, scaled by `size`, and live at every tier including the default `m` (`2.5rem`, matching `<lr-input>`/`<lr-combobox>` at that tier).\n- `--lr-select-font-size` — Trigger font size, scaled by `size`.\n- `--lr-select-option-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the hovered/keyboard-active option row. Not declared on `:host`, so a value set on any ancestor is never shadowed -- retheme just this row state without hijacking the shared `--lr-color-brand-quiet` token used by every other component's own hover/active state.\n- `--lr-select-trigger-height` — Exact trigger height. Unset by default, which leaves `--lr-select-trigger-min-height` as a floor only; set it to a length to both floor and cap the trigger (e.g. to pixel-match a sibling field in the same toolbar row). Because it is never declared by the component itself, it can be set from an ancestor or an outer-tree rule as well as inline on the element."
11612
11822
  },
11613
11823
  "attributes": [
11614
11824
  {
@@ -11701,7 +11911,7 @@
11701
11911
  "name": "lr-sequence-strip",
11702
11912
  "description": {
11703
11913
  "kind": "markdown",
11704
- "value": "`<lr-sequence-strip>` — a compact, one-thin-cell-per-item strip visualizing a sequence of\ncategorical states, with an optional secondary per-cell marker. Pure CSS/flex, no chart.js/SVG/\ncanvas — sized/named consistently with the sparkline/heatmap family, but a glanceable aggregate\nvisualization (`role=\"img\"`, one summarizing `aria-label`), not a `role=\"list\"` of\nseparately-operable items: no per-cell keyboard focus, no per-cell click event, matching\n`<lr-sparkline>`'s accessibility model rather than `<lr-heatmap>`'s heavier canvas +\nkeyboard-roving one.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root strip wrapper (`role=\"img\"`). |\n| `cell` | Each item's cell, background-colored by its category. |\n| `legend` | The static category key rendered below the strip when `showLegend` is set (`aria-hidden` — it repeats the strip's own `aria-label` visually). |\n| `legend-item` | One swatch + label pair in the legend, one per `categories` entry. |\n| `legend-label` | The text of a legend item (the category's `label`, or its `key`). |\n| `legend-swatch` | The color chip of a legend item, matching that category's cell color. |\n| `marker` | The small bottom marker on a cell whose item sets `marker: true`. |\n| `tooltip` | The hover tooltip showing the hovered item's label. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-sequence-strip-height` (default: `var(--lr-size-1-5rem)`) — Block size of the strip.\n- `--lr-sequence-strip-marker-color` (default: `var(--lr-color-text)`) — Color of the bottom marker on a `marker: true` cell.\n- `--lr-sequence-strip-legend-swatch-size` (default: `var(--lr-size-0-625rem)`) — Inline and block size of a legend swatch."
11914
+ "value": "`<lr-sequence-strip>` — a compact, one-thin-cell-per-item strip visualizing a sequence of\ncategorical states, with an optional secondary per-cell marker. Pure CSS/flex, no chart.js/SVG/\ncanvas — sized/named consistently with the sparkline/heatmap family, but a glanceable aggregate\nvisualization (`role=\"img\"`, one summarizing `aria-label`), not a `role=\"list\"` of\nseparately-operable items: no per-cell keyboard focus, no per-cell click event, matching\n`<lr-sparkline>`'s accessibility model rather than `<lr-heatmap>`'s heavier canvas +\nkeyboard-roving one.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root strip wrapper (`role=\"img\"`). |\n| `cell` | Each item's cell, background-colored by its category. |\n| `legend` | The static category key rendered below the strip when `showLegend` is set (`aria-hidden` — it repeats the strip's own `aria-label` visually). |\n| `legend-item` | One swatch + label pair in the legend, one per `categories` entry (plus one trailing marker row when `markerLabel` is set). |\n| `legend-label` | The text of a legend item (the category's `label`, or its `key`). |\n| `legend-marker-swatch` | The chip of the `markerLabel` legend row: a neutral chip carrying the same bottom bar a `marker: true` cell paints, in the same `--lr-sequence-strip-marker-color`. |\n| `legend-swatch` | The color chip of a legend item, matching that category's cell color. |\n| `marker` | The small bottom marker on a cell whose item sets `marker: true`. |\n| `tooltip` | The hover tooltip showing the hovered item's label. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-sequence-strip-height` (default: `var(--lr-size-1-5rem)`) — Block size of the strip.\n- `--lr-sequence-strip-marker-color` (default: `var(--lr-color-text)`) — Color of the bottom marker on a `marker: true` cell, and of the marker legend row's bar.\n- `--lr-sequence-strip-legend-swatch-size` (default: `var(--lr-size-0-625rem)`) — Inline and block size of a legend swatch (category and marker rows alike).\n- `--lr-sequence-strip-legend-marker-bg` (default: `var(--lr-color-surface-raised)`) — Neutral chip background behind the marker legend row's bar; it stands in for \"any cell\", so it deliberately matches no category color."
11705
11915
  },
11706
11916
  "attributes": [
11707
11917
  {
@@ -11718,6 +11928,13 @@
11718
11928
  "value": "Optional locale override. Otherwise the nearest `locale`/`lang` ancestor is used.\n\nType: `string` \nDefault: `''`"
11719
11929
  }
11720
11930
  },
11931
+ {
11932
+ "name": "marker-label",
11933
+ "description": {
11934
+ "kind": "markdown",
11935
+ "value": "Names what a cell's `marker` means (e.g. `\"Subagent\"`). Set it to key the marker in the legend\n— with `showLegend` on it adds one trailing `[part=\"legend-item\"]` whose swatch reproduces the\ncell's own marker treatment — and to have the marker counted in the auto-generated summary,\nwhich is otherwise per-category only. Unset (the default) nothing changes: no extra legend row\nand no extra summary clause.\n\nType: `string | undefined`"
11936
+ }
11937
+ },
11721
11938
  {
11722
11939
  "name": "orientation",
11723
11940
  "description": {
@@ -11836,7 +12053,7 @@
11836
12053
  "name": "show-value",
11837
12054
  "description": {
11838
12055
  "kind": "markdown",
11839
- "value": "Whether to render the current numeric value as visible text next to\nthe track. Like `<lr-markdown>`'s `sanitize`/`gfm`, this is a plain\n`type: Boolean` property defaulting `true` turn it off via the\n`.showValue=${false}` property binding (a bare `show-value=\"false\"`\ncontent attribute is still truthy, since presence is all Lit's default\nboolean converter checks).\n\nType: `boolean` \nDefault: `true`"
12056
+ "value": "Whether to render the current numeric value as visible text next to the track. Defaults to\n`true`; uses `trueDefaultBooleanConverter` (like `<lr-agent-run>`'s `show-cancel`/\n`show-retry`) rather than Lit's default presence-based `type: Boolean` converter, so a plain\nHTML `show-value=\"false\"` content attribute actually turns it off, not just a\n`.showValue=${false}` property binding.\n\nType: `boolean` \nDefault: `true`"
11840
12057
  }
11841
12058
  },
11842
12059
  {
@@ -11852,9 +12069,23 @@
11852
12069
  "name": "lr-source-card",
11853
12070
  "description": {
11854
12071
  "kind": "markdown",
11855
- "value": "`<lr-source-card>` — one citation/source entry, meant to be a direct\nlight-DOM child of `<lr-source-list>` (though it renders and functions\nfine standalone). Shows a title/page heading, an always-visible `excerpt`\nslot, and an optional `full` slot revealed behind its own independent\n\"Show more\" toggle — unrelated to the parent `<lr-source-list>`'s own\nexpand/collapse, which only ever hides/shows the *set* of cards, never a\nsingle card's own content.\n\n`source-id` is this card's stable identity, meant to match a\n`<lr-citation-badge>` (a sibling component) elsewhere on the page. This\ncomponent doesn't implement any scroll-to/highlight behavior itself — that\nlives at the app level, wiring a citation badge's activation event to this\ncard's `id`/`source-id`. See the `@example` below.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `excerpt` | A short preview. When left empty, the `excerpt` part collapses away entirely rather than leaving an empty gap in the card. |\n| `full` | The complete source text/chunk, hidden behind the \"Show more\"/\"Show less\" toggle. When left empty, no toggle renders at all — a card with no `full` content simply has no expand affordance. Removing all `full`-slotted content while expanded automatically collapses it back. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer container. |\n| `excerpt` | The wrapper around the `excerpt` slot, `hidden` when the slot has no assigned content. |\n| `full` | The wrapper around the `full` slot, `hidden` while collapsed. |\n| `title` | The clickable title/page heading (`<button>`). |\n| `toggle` | The \"Show more\"/\"Show less\" button. Only rendered when the `full` slot has content. |"
12072
+ "value": "`<lr-source-card>` — one citation/source entry, meant to be a direct\nlight-DOM child of `<lr-source-list>` (though it renders and functions\nfine standalone). Shows a title/page heading, an always-visible `excerpt`\nslot, and an optional `full` slot revealed behind its own independent\n\"Show more\" toggle — unrelated to the parent `<lr-source-list>`'s own\nexpand/collapse, which only ever hides/shows the *set* of cards, never a\nsingle card's own content.\n\n`source-id` is this card's stable identity, meant to match a\n`<lr-citation-badge>` (a sibling component) elsewhere on the page. This\ncomponent doesn't implement any scroll-to/highlight behavior itself — that\nlives at the app level, wiring a citation badge's activation event to this\ncard's `id`/`source-id`. See the `@example` below.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `excerpt` | A short preview. When left empty, the `excerpt` part collapses away entirely rather than leaving an empty gap in the card. |\n| `full` | The complete source text/chunk, hidden behind the \"Show more\"/\"Show less\" toggle. When left empty, no toggle renders at all — a card with no `full` content simply has no expand affordance. Removing all `full`-slotted content while expanded automatically collapses it back. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer container. |\n| `excerpt` | The wrapper around the `excerpt` slot, `hidden` when the slot has no assigned content. |\n| `full` | The wrapper around the `full` slot, `hidden` while collapsed. |\n| `title` | The clickable title/page heading (`<button>`). |\n| `toggle` | The \"Show more\"/\"Show less\" button. Only rendered when the `full` slot has content. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-source-card-compact-padding` (default: `var(--lr-space-xs)`) — `[part=\"base\"]` padding while `compact`.\n- `--lr-source-card-compact-gap` (default: `var(--lr-space-2xs)`) — Gap between `[part=\"base\"]`'s rows while `compact`."
11856
12073
  },
11857
12074
  "attributes": [
12075
+ {
12076
+ "name": "appearance",
12077
+ "description": {
12078
+ "kind": "markdown",
12079
+ "value": "Visual chrome, mirroring `lr-card`'s `appearance` vocabulary. `'card'` (the default) keeps the\nbordered, filled, padded box. `'plain'` removes the border, background, padding and corner\nradius, so a card inside a `<lr-source-list>` (or any container already drawing its own\nborder/dividers) doesn't double the frame. `plain` wins over `compact` when both are set\n(nothing left to tighten); the title and toggle keep their brand color and hover underline,\nwhich never depended on the card chrome.\n\nType: `SourceCardAppearance` \nDefault: `'card'`"
12080
+ }
12081
+ },
12082
+ {
12083
+ "name": "compact",
12084
+ "description": {
12085
+ "kind": "markdown",
12086
+ "value": "Tighter root padding and row gap, for the dense citation lists these cards usually render in\n-- same convention as `lr-empty`'s `compact`. Defaults to `false`, i.e. the full card\npadding. Purely a density knob: the border and background stay, so use `appearance=\"plain\"`\nto drop the chrome entirely.\n\nType: `boolean` \nDefault: `false`"
12087
+ }
12088
+ },
11858
12089
  {
11859
12090
  "name": "href",
11860
12091
  "description": {
@@ -11933,7 +12164,7 @@
11933
12164
  "name": "lr-source-picker",
11934
12165
  "description": {
11935
12166
  "kind": "markdown",
11936
- "value": "`<lr-source-picker>` — a checkbox tree/list scoping which sources ground the next answer:\ntri-state folders, select-all, type icons, search. **Not `FormAssociated`, deliberately**: this\nis a scoping panel, not a form control — the selection is immediate app state consumed by the\nnext retrieval call, exactly the stance `lr-tool-select-dialog` already takes.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `checkbox` | The tri-state checkbox glyph. |\n| `empty` | The empty state (`noData` when `sources` is empty, `noMatches` when a filter empties the tree). |\n| `icon` | The `lr-file-icon` type badge. |\n| `item` | One `role=\"treeitem\"` row. |\n| `label` | The entry's label text. |\n| `search` | The built-in filter `lr-input`, only rendered when `searchable`. |\n| `select-all` | The header select-all row, only rendered when `showSelectAll`. |\n| `summary` | The \"{selected} of {total} selected\" text. |\n| `tree` | The `role=\"tree\"` container. |"
12167
+ "value": "`<lr-source-picker>` — a checkbox tree/list scoping which sources ground the next answer:\ntri-state folders, select-all, type icons, search. **Not `FormAssociated`, deliberately**: this\nis a scoping panel, not a form control — the selection is immediate app state consumed by the\nnext retrieval call, exactly the stance `lr-tool-select-dialog` already takes.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `checkbox` | The tri-state checkbox glyph. |\n| `empty` | The empty state (`noData` when `sources` is empty, `noMatches` when a filter empties the tree). |\n| `icon` | The `lr-file-icon` type badge. |\n| `item` | One `role=\"treeitem\"` row. |\n| `label` | The entry's label text. |\n| `search` | The built-in filter `lr-input`, only rendered when `searchable`. |\n| `select-all` | The header select-all row, only rendered when `showSelectAll`. |\n| `summary` | The \"{selected} of {total} selected\" text. |\n| `tree` | The `role=\"tree\"` container. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-source-picker-checked-bg` — Background of a fully-checked selection control: the `select-all` pill (defaults to `var(--lr-color-brand-quiet)`) and a fully-selected entry's `[part=\"checkbox\"]` (defaults to `var(--lr-color-brand)`). The two keep their distinct resting defaults; setting this prop unifies both.\n- `--lr-source-picker-checked-border` (default: `var(--lr-color-brand)`) — Border color of every checked or mixed selection control.\n- `--lr-source-picker-mixed-bg` (default: `color-mix(in srgb, var(--lr-color-brand) 50%, var(--lr-color-surface))`) — Background of a partially-selected entry's `[part=\"checkbox\"]`."
11937
12168
  },
11938
12169
  "attributes": [
11939
12170
  {
@@ -11977,7 +12208,7 @@
11977
12208
  "name": "lr-span-waterfall",
11978
12209
  "description": {
11979
12210
  "kind": "markdown",
11980
- "value": "`<lr-span-waterfall>` — the horizontal-timeline projection of the same\n`LyraSpan[]` `<lr-trace-tree>` consumes: a time axis, one row per span\nin start order, status-toned bars (Langfuse timeline / Temporal\nevent-history style).\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `axis` | The time-ruler row, hidden when `hideAxis`. |\n| `bar` | The interactive, focusable status-toned bar (`role` via `<button>`). |\n| `bar-track` | The bar's positioning track. |\n| `base` | The root wrapper. |\n| `duration` | The formatted duration text. |\n| `empty` | The empty-state message shown when `spans` is empty. |\n| `live-region` | The internal focus/status-announcement live region. |\n| `meta` | Secondary row info (status/duration), shown inline under 480px. |\n| `name` | The span's name (the row's name gutter). |\n| `row` | One span's row. |\n| `status-text` | The visible status label. |\n| `tick` | One axis tick mark. |\n| `tick-label` | An axis tick's formatted duration label. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-span-waterfall-name-width` (default: `8rem`) — Width of the name gutter column.\n- `--lr-span-waterfall-stripe-speed` — Animation duration for a `running` span's striped bar; defaults to `--lr-transition-ambient`."
12211
+ "value": "`<lr-span-waterfall>` — the horizontal-timeline projection of the same\n`LyraSpan[]` `<lr-trace-tree>` consumes: a time axis, one row per span\nin start order, status-toned bars (Langfuse timeline / Temporal\nevent-history style).\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `axis` | The time-ruler row, hidden when `hideAxis`. |\n| `bar` | The interactive, focusable status-toned bar (`role` via `<button>`). |\n| `bar-track` | The bar's positioning track. |\n| `base` | The root wrapper. |\n| `duration` | The formatted duration text. |\n| `empty` | The empty-state message shown when `spans` is empty. |\n| `live-region` | The internal focus/status-announcement live region. |\n| `meta` | Secondary row info (status/duration), shown inline under 480px. |\n| `name` | The span's name (the row's name gutter). |\n| `row` | One span's row. |\n| `status-text` | The visible status label. |\n| `tick` | One axis tick mark. |\n| `tick-label` | An axis tick's formatted duration label. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-span-waterfall-name-width` (default: `8rem`) — Width of the name gutter column.\n- `--lr-span-waterfall-stripe-speed` — Animation duration for a `running` span's striped bar; defaults to `--lr-transition-ambient`.\n- `--lr-span-waterfall-row-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the active (`activeSpanId`) row. Shadow Parts forbids an attribute selector after `::part()`, so the active row could otherwise only be restyled by hijacking the library-wide `--lr-color-brand-quiet` token."
11981
12212
  },
11982
12213
  "attributes": [
11983
12214
  {
@@ -12120,7 +12351,7 @@
12120
12351
  "name": "lr-split",
12121
12352
  "description": {
12122
12353
  "kind": "markdown",
12123
- "value": "`<lr-split>` — resizable panels for dashboard layouts. Direct light-DOM\nchildren are the panels; a divider is auto-inserted between each pair.\n\nOptionally, one pane can opt in to responsive collapse via `collapse`\n(`\"start\"`/`\"end\"`, default `\"none\"` — no behavior change when unset): as\nthe split's own container narrows past `railBreakpoint` that pane clamps\nto a fixed `railWidth`, and past the narrower `floatBreakpoint` it instead\nbecomes an absolutely-positioned overlay \"floating card\" above the other\npane. This component only handles the width-collapse mechanics and\nsignals the current state — via the `collapseState`-derived\n`data-collapse-state` attribute (set on both the host and the collapsing\npanel itself) and the `lr-split-collapse-change` event — it renders no\nicon-only/collapsed UI of its own; slotted content is expected to adapt to\nits own clamped width (e.g. via its own container query).\n\n`collapseState` is a public accessor with force/auto semantics mirroring\n`<lr-app-rail>`'s `mode`: it's normally derived automatically from the\nmeasured container width (via a `ResizeObserver` on `[part=\"base\"]`)\nwhenever it crosses `railBreakpoint`/`floatBreakpoint`, but assigning it a\nconcrete `'wide'`/`'rail'`/`'floating'` value pins it there and stops that\nautomatic tracking — useful for a consumer-driven toggle (e.g. a button\nthat forces `'floating'` regardless of width). Assigning the write-only\n`'auto'` sentinel releases the pin and immediately re-derives the state\nfrom the current measured width, resuming automatic tracking. `'auto'` is\nnever a value this getter returns.\n\nThe `'floating'` state is a hidden-by-default drawer, gated by `open`\n(mirrors `<lr-app-rail>`'s mobile overlay): while `collapseState` is\n`'floating'` and `open` is `false` (the default), the collapsing panel\nrenders nothing — `hidden`, out of the accessibility tree, not just\nvisually hidden — instead of the always-visible overlay card this state\nrendered before `open` existed. Setting `open = true` reveals it as a\nfocus-trapped floating panel with a `[part=\"backdrop\"]` scrim; Escape or a\nbackdrop click set `open` back to `false`. `open` is preserved (not reset)\nwhile `collapseState` isn't `'floating'`, but no drawer chrome renders\nuntil it is again — except that leaving `'floating'` while `open` is\n`true` (a breakpoint crossing back to `'wide'`/`'rail'`, or a forced\nreassignment) also closes it, the same way `<lr-app-rail>` closes its\nmobile overlay when leaving `'mobile'` while open.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Panels to arrange side by side (or stacked, when `orientation=\"vertical\"`); each direct child becomes one resizable panel. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `backdrop` | The `'floating'` drawer's scrim. Only rendered while `collapseState === 'floating'` and `open`. |\n| `base` | The flex layout wrapper (`position: relative`, so the `'floating'` collapse state can anchor to it). |\n| `divider` | Each divider between two panels; carries `aria-disabled=\"true\"` and is drag/keyboard-inert while its adjacent panel is collapsed (`'rail'`/`'floating'`). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-split-overlay-color` (default: `var(--lr-color-overlay)`) — The `'floating'` drawer scrim's color, applied to `[part=\"backdrop\"]`."
12354
+ "value": "`<lr-split>` — resizable panels for dashboard layouts. Direct light-DOM\nchildren are the panels; a divider is auto-inserted between each pair.\n\nOptionally, one pane can opt in to responsive collapse via `collapse`\n(`\"start\"`/`\"end\"`, default `\"none\"` — no behavior change when unset): as\nthe split's own container narrows past `railBreakpoint` that pane clamps\nto a fixed `railWidth`, and past the narrower `floatBreakpoint` it instead\nbecomes an absolutely-positioned overlay \"floating card\" above the other\npane. Both breakpoints accept a bare pixel number or a CSS length\n(`px`/`rem`/`em`), and `collapseBreakpointBasis=\"viewport\"` measures them\nagainst the viewport via `matchMedia` instead of this component's own\nallocation. This component only handles the width-collapse mechanics and\nsignals the current state — via the `collapseState`-derived\n`data-collapse-state` attribute (set on both the host and the collapsing\npanel itself) and the `lr-split-collapse-change` event — it renders no\nicon-only/collapsed UI of its own; slotted content is expected to adapt to\nits own clamped width (e.g. via its own container query).\n\n`collapseState` is a public accessor with force/auto semantics mirroring\n`<lr-app-rail>`'s `mode`: it's normally derived automatically from the\nmeasured container width (via a `ResizeObserver` on `[part=\"base\"]`)\nwhenever it crosses `railBreakpoint`/`floatBreakpoint`, but assigning it a\nconcrete `'wide'`/`'rail'`/`'floating'` value pins it there and stops that\nautomatic tracking — useful for a consumer-driven toggle (e.g. a button\nthat forces `'floating'` regardless of width). Assigning the write-only\n`'auto'` sentinel releases the pin and immediately re-derives the state\nfrom the current measured width, resuming automatic tracking. `'auto'` is\nnever a value this getter returns.\n\nThe `'floating'` state is a hidden-by-default drawer, gated by `open`\n(mirrors `<lr-app-rail>`'s mobile overlay): while `collapseState` is\n`'floating'` and `open` is `false` (the default), the collapsing panel\nrenders nothing — `hidden`, out of the accessibility tree, not just\nvisually hidden — instead of the always-visible overlay card this state\nrendered before `open` existed. Setting `open = true` reveals it as a\nfocus-trapped floating panel with a `[part=\"backdrop\"]` scrim; Escape or a\nbackdrop click set `open` back to `false`. `open` is preserved (not reset)\nwhile `collapseState` isn't `'floating'`, but no drawer chrome renders\nuntil it is again — except that leaving `'floating'` while `open` is\n`true` (a breakpoint crossing back to `'wide'`/`'rail'`, or a forced\nreassignment) also closes it, the same way `<lr-app-rail>` closes its\nmobile overlay when leaving `'mobile'` while open.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Panels to arrange side by side (or stacked, when `orientation=\"vertical\"`); each direct child becomes one resizable panel. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `backdrop` | The `'floating'` drawer's scrim. Only rendered while `collapseState === 'floating'` and `open`. |\n| `base` | The flex layout wrapper (`position: relative`, so the `'floating'` collapse state can anchor to it). |\n| `divider` | Each divider between two panels; carries `aria-disabled=\"true\"` and is drag/keyboard-inert while its adjacent panel is collapsed (`'rail'`/`'floating'`). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-split-overlay-color` (default: `var(--lr-color-overlay)`) — The `'floating'` drawer scrim's color, applied to `[part=\"backdrop\"]`."
12124
12355
  },
12125
12356
  "attributes": [
12126
12357
  {
@@ -12130,6 +12361,13 @@
12130
12361
  "value": "Opts a pane in to responsive collapse: `'start'` is the first light-DOM\npanel (index 0), `'end'` is the last. Both are LOGICAL positions, same\nas CSS `inset-inline-start`/`-end` — see the `collapsingIndex` getter\nfor why that already resolves to the same physical index under RTL for\nthis component (panels are never re-`order`ed for RTL, only the drag\ndelta sign mirrors). Default `'none'`: none of the collapse behavior\nbelow applies, and rendering/behavior is identical to before this\nproperty existed.\n\nType: `SplitCollapseMode` \nDefault: `'none'`"
12131
12362
  }
12132
12363
  },
12364
+ {
12365
+ "name": "collapse-breakpoint-basis",
12366
+ "description": {
12367
+ "kind": "markdown",
12368
+ "value": "Which box `railBreakpoint`/`floatBreakpoint` measure. `'container'` (the default) observes\nthis component's own `[part=\"base\"]` inline size via `ResizeObserver`, comparing strictly `<`.\n`'viewport'` instead evaluates `matchMedia('(max-width: <breakpoint>)')` for each of the two\nthresholds, which is inclusive (`<=`) — native `max-width` semantics, deliberately, so the\ncrossing point matches a CSS `@media` rule authored with the same length exactly. Switching\nbasis therefore shifts each crossing point by 1px (the same trade-off\n`orientationBreakpointBasis` already makes).\n\nUse `'viewport'` to collapse in step with a page-level responsive layout — e.g. a shell whose\nown `@media` rules restack at the same width — rather than with this split's own allocation.\n`'viewport'` also lets the browser resolve a `rem` breakpoint with real `@media` semantics\n(against the *initial* font size, ignoring an `html { font-size }` override), keeping it in\nstep with such a rule.\n\nBoth bands are classified from both queries together on every change, so a fast resize that\ncrosses both thresholds at once still lands on one correct state and fires\n`lr-split-collapse-change` once. Under `'viewport'` basis the first paint is already correct —\nno `ResizeObserver` round-trip — and the initial state is not announced as a transition.\n\nDefault: `'container'`.\n\nType: `BreakpointBasis` \nDefault: `'container'`"
12369
+ }
12370
+ },
12133
12371
  {
12134
12372
  "name": "collapse-state",
12135
12373
  "description": {
@@ -12141,7 +12379,7 @@
12141
12379
  "name": "float-breakpoint",
12142
12380
  "description": {
12143
12381
  "kind": "markdown",
12144
- "value": "Container width (px) below which the collapsing pane instead becomes an\nabsolutely-positioned overlay above the other pane (`'floating'` state).\n\nType: `number` \nDefault: `400`"
12382
+ "value": "Width below which the collapsing pane instead becomes an absolutely-positioned overlay above\nthe other pane (`'floating'` state). Same accepted forms, basis, and sanitization as\n`railBreakpoint`; an unparseable value falls back to the `400` default.\n\nDefault: `400`.\n\nType: `number | string` \nDefault: `400`"
12145
12383
  }
12146
12384
  },
12147
12385
  {
@@ -12197,7 +12435,7 @@
12197
12435
  "name": "rail-breakpoint",
12198
12436
  "description": {
12199
12437
  "kind": "markdown",
12200
- "value": "Container width (px, measured on `[part=\"base\"]`) below which the\ncollapsing pane switches from its normal percent width to the fixed\n`railWidth` (`'rail'` state). Must stay above `floatBreakpoint`.\n\nType: `number` \nDefault: `640`"
12438
+ "value": "Width below which the collapsing pane switches from its normal percent width to the fixed\n`railWidth` (`'rail'` state). Must stay above `floatBreakpoint` — an inverted pair is\nsanitized by raising this one to match, which collapses the `'rail'` band away rather than\nleaving a wide container reported as collapsed.\n\nAccepts a bare pixel number (`640`, `rail-breakpoint=\"640\"` — the original form) or a CSS\nlength string: `'640px'`, `'68.75rem'`, `'3em'`. Under the default\n`collapseBreakpointBasis=\"container\"` this is compared against this component's own measured\n`[part=\"base\"]` inline size, strictly `<`, and `rem` resolves against the *document root*'s\ncomputed font size (a `@container` query's rule, not a `@media` query's) while `em` resolves\nagainst this element's own. The length is re-resolved on every measurement, never cached, so\na root font-size change moves the crossing width with no invalidation step.\n\nAnything the grammar rejects — `''`, `'auto'`, garbage, a non-finite number, and deliberately\n`%`/`vw`/`vh`/`calc()`/`var()` — falls back to the `640` default rather than switching the\nfeature off (unlike `orientationBreakpoint`, this breakpoint has a documented default to fall\nback to). A negative length is floored at `0`, i.e. never crossed.\n\nDefault: `640`.\n\nType: `number | string` \nDefault: `640`"
12201
12439
  }
12202
12440
  },
12203
12441
  {
@@ -12220,7 +12458,7 @@
12220
12458
  "name": "lr-spreadsheet-viewer",
12221
12459
  "description": {
12222
12460
  "kind": "markdown",
12223
- "value": "Fetches and renders `.xlsx` and legacy `.xls` workbooks with virtualized rows and sheet tabs.\n\nAdopts `DocumentAnchorTarget`: a `cell-range` anchor addresses one sheet's raw grid, 1-based, with\nits (always-present) header row included -- matching how a spreadsheet app itself labels `A1`.\nThe target sheet resolves from the anchor's own `sheet` field (falling back to a `Sheet!`-prefixed\n`range`, then the currently active sheet when neither is set); `scrollToAnchor()` switches\n`<lr-tabs>`'s `active` tab first when the resolved sheet isn't already active, then scrolls the\naddressed row into view via the virtualized list's `active-id`, then scrolls the first addressed\ncolumn horizontally into view. `highlights` paint as a focusable `part=\"cell-highlight\"` on\nmembership, recomputed per row inside `renderRow()` so a row scrolled out and back in reconstructs\nits highlight for free, with no persistent DOM to keep in sync. `search()` is a case-insensitive\nsubstring match over every sheet's stringified cell values (the same stringification `cell()`\nalready renders), ordered sheet then row then column, switching tabs as navigation crosses sheets.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `cell` | One rendered cell. |\n| `cell-highlight` | A cell covered by a `highlights` entry -- focusable, emits `lr-highlight-activate` on click or Enter/Space. |\n| `data-row` | One virtualized data row. |\n| `error` | The error message region. |\n| `header-row` | A sheet's header row. |\n| `rows` | The virtualized row list. |\n| `sheet` | The wrapper around one sheet's header row and virtualized body. |\n| `spinner` | The loading status region. |\n| `tabs` | The sheet-switching `<lr-tabs>`, rendered only for a multi-sheet workbook. |"
12461
+ "value": "Fetches and renders `.xlsx` and legacy `.xls` workbooks with virtualized rows and sheet tabs.\n\nAdopts `DocumentAnchorTarget`: a `cell-range` anchor addresses one sheet's raw grid, 1-based, with\nits (always-present) header row included -- matching how a spreadsheet app itself labels `A1`.\nThe target sheet resolves from the anchor's own `sheet` field (falling back to a `Sheet!`-prefixed\n`range`, then the currently active sheet when neither is set); `scrollToAnchor()` switches\n`<lr-tabs>`'s `active` tab first when the resolved sheet isn't already active, then scrolls the\naddressed row into view via the virtualized list's `active-id`, then scrolls the first addressed\ncolumn horizontally into view. `highlights` paint as a focusable `part=\"cell-highlight\"` on\nmembership, recomputed per row inside `renderRow()` so a row scrolled out and back in reconstructs\nits highlight for free, with no persistent DOM to keep in sync. `search()` is a case-insensitive\nsubstring match over every sheet's stringified cell values (the same stringification `cell()`\nalready renders), ordered sheet then row then column, switching tabs as navigation crosses sheets.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `cell` | One rendered cell. |\n| `cell-highlight` | A cell covered by a `highlights` entry -- focusable, emits `lr-highlight-activate` on click or Enter/Space. |\n| `data-row` | One virtualized data row. |\n| `error` | The error message region. |\n| `header-row` | A sheet's header row. |\n| `rows` | The virtualized row list. |\n| `sheet` | The wrapper around one sheet's header row and virtualized body. |\n| `spinner` | The loading status region. |\n| `tabs` | The sheet-switching `<lr-tabs>`, rendered only for a multi-sheet workbook. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-spreadsheet-viewer-highlight-color` (default: `var(--lr-color-brand)`) — Outline color of a highlighted cell. The active highlight sets it inline to `var(--lr-color-warning, var(--lr-color-brand))`."
12224
12462
  },
12225
12463
  "attributes": [
12226
12464
  {
@@ -12250,9 +12488,16 @@
12250
12488
  "name": "lr-stack-trace",
12251
12489
  "description": {
12252
12490
  "kind": "markdown",
12253
- "value": "`<lr-stack-trace>` — parses common V8/JS-TS, Firefox/Safari, and Python stack traces into a\nleading message plus activatable frames, splitting chained/caused-by errors into separate\ngroups. Frames matching `internalPatterns` (`node_modules/`, `node:internal`,\n`site-packages/`, ... by default) fold behind a count-labeled toggle. Falls back to verbatim\nraw text when nothing parses. First-party invention (no Web Awesome equivalent).\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper; respects `max-height`. |\n| `copy-button` | The copy-to-clipboard button, only rendered while `copyable`. |\n| `frame` | A single frame button; carries `data-internal` for internal frames. |\n| `frame-function` | The frame's function name. |\n| `frame-location` | The frame's `file:line:col` text. |\n| `group` | One chained-error group of frames. |\n| `internal-toggle` | The collapse/expand toggle for a run of internal frames. |\n| `message` | The leading error message text for a group. |\n| `raw` | The verbatim `<pre>` fallback when zero structured frames parsed. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-stack-trace-max-height` (default: `none`) — Cap on how tall `[part=\"base\"]` grows before it scrolls internally. `none` lets the component grow with its content; the `max-height` attribute sets this token.\n- `--lr-stack-trace-font` (default: `var(--lr-font-mono)`) — Font family for the parsed frames and the verbatim raw fallback."
12491
+ "value": "`<lr-stack-trace>` — parses common V8/JS-TS, Firefox/Safari, and Python stack traces into a\nleading message plus activatable frames, splitting chained/caused-by errors into separate\ngroups. Frames matching `internalPatterns` (`node_modules/`, `node:internal`,\n`site-packages/`, ... by default) fold behind a count-labeled toggle. Falls back to verbatim\nraw text when nothing parses. First-party invention (no Web Awesome equivalent).\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper; respects `max-height`. Drops its card chrome under `appearance=\"plain\"`. |\n| `copy-button` | The copy-to-clipboard button, only rendered while `copyable`. |\n| `frame` | A single frame button; carries `data-internal` for internal frames. |\n| `frame-function` | The frame's function name. |\n| `frame-location` | The frame's `file:line:col` text. |\n| `group` | One chained-error group of frames. |\n| `internal-toggle` | The collapse/expand toggle for a run of internal frames. |\n| `message` | The leading error message text for a group. |\n| `raw` | The verbatim `<pre>` fallback when zero structured frames parsed. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-stack-trace-max-height` (default: `none`) — Cap on how tall `[part=\"base\"]` grows before it scrolls internally. `none` lets the component grow with its content; the `max-height` attribute sets this token.\n- `--lr-stack-trace-font` (default: `var(--lr-font-mono)`) — Font family for the parsed frames and the verbatim raw fallback."
12254
12492
  },
12255
12493
  "attributes": [
12494
+ {
12495
+ "name": "appearance",
12496
+ "description": {
12497
+ "kind": "markdown",
12498
+ "value": "Visual chrome, mirroring `lr-card`'s `appearance` vocabulary. `'card'` (the default) keeps the\nbordered, filled, padded box. `'plain'` removes the border, background, padding and corner\nradius so a trace nested inside an `lr-result-card`/`lr-agent-run` (which already draws a\nborder) doesn't double the frame. The `max-height` scroll cap and the copy/frame affordances\nare unaffected.\n\nType: `StackTraceAppearance` \nDefault: `'card'`"
12499
+ }
12500
+ },
12256
12501
  {
12257
12502
  "name": "collapse-internal",
12258
12503
  "description": {
@@ -12294,9 +12539,16 @@
12294
12539
  "name": "lr-stat",
12295
12540
  "description": {
12296
12541
  "kind": "markdown",
12297
- "value": "`<lr-stat>` — a KPI/stat card. First-party invention consolidating the\n\"metric row\" / \"KPI card\" pattern common to dashboard UIs.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Leading icon. |\n| `caption` | Rich caption content (overrides the `caption` attribute). |\n| `spark` | A sparkline (e.g. `<lr-sparkline>`) or other compact trend visual. `lr-stat` only reserves the slot; it doesn't render one itself. |\n| `sub` | Rich sub-line content (overrides the `sub` attribute). |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The component's root wrapper (`<div>`, or a real `<a>` when `href` is safe). |\n| `caption` | Container for the caption attribute/slot. |\n| `icon` | Container for the leading icon slot. |\n| `label` | The label text. |\n| `row` | A single breakdown row (one per `rows` entry). |\n| `row-label` | The label text of a breakdown row. |\n| `row-value` | The value text of a breakdown row. Shows the row's `exactValue` (if any) as a hover/focus tooltip, same as the headline `value`, and is accessibly labelled by its `row-label` (via `aria-labelledby`) the same way the headline `value` is. |\n| `rows` | Container for the `rows` breakdown list. |\n| `spark` | Container for the `spark` slot. |\n| `sub` | Container for the `sub` attribute/slot. |\n| `trend` | The trend pill. |\n| `unit` | The unit text. |\n| `value` | The value text. Accessibly labelled by the `label` part (via `aria-labelledby`) whenever `label` is set, so tabbing directly to this (focusable when `exactValue` is set) control still announces which metric it is. |\n| `value-row` | Wrapper around the value and unit. |"
12542
+ "value": "`<lr-stat>` — a KPI/stat card. First-party invention consolidating the\n\"metric row\" / \"KPI card\" pattern common to dashboard UIs.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Leading icon. |\n| `caption` | Rich caption content (overrides the `caption` attribute). |\n| `spark` | A sparkline (e.g. `<lr-sparkline>`) or other compact trend visual. `lr-stat` only reserves the slot; it doesn't render one itself. |\n| `sub` | Rich sub-line content (overrides the `sub` attribute). |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The component's root wrapper (`<div>`, or a real `<a>` when `href` is safe). |\n| `caption` | Container for the caption attribute/slot. |\n| `icon` | Container for the leading icon slot. |\n| `label` | The label text. Hidden (and collapsed) whenever `label` is empty, so a label-less stat doesn't leave a blank line above the value. |\n| `row` | A single breakdown row (one per `rows` entry). |\n| `row-label` | The label text of a breakdown row. |\n| `row-value` | The value text of a breakdown row. Shows the row's `exactValue` (if any) as a hover/focus tooltip, same as the headline `value`, and is accessibly labelled by its `row-label` (via `aria-labelledby`) the same way the headline `value` is. |\n| `rows` | Container for the `rows` breakdown list. |\n| `spark` | Container for the `spark` slot. |\n| `sub` | Container for the `sub` attribute/slot. |\n| `trend` | The trend pill. |\n| `unit` | The unit text. |\n| `value` | The value text. Accessibly labelled by the `label` part (via `aria-labelledby`) whenever `label` is set, so tabbing directly to this (focusable when `exactValue` is set) control still announces which metric it is. |\n| `value-row` | Wrapper around the value and unit. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-stat-trend-good-color` (default: `var(--lr-color-success)`) — Text color of the trend pill when its polarity is \"good\". Independent of the headline value's `variant=\"success\"` tint, which reads the shared `--lr-color-success` token directly.\n- `--lr-stat-trend-good-bg` (default: `color-mix(in srgb, var(--lr-color-success) 8%, transparent)`) — Background of the trend pill when its polarity is \"good\".\n- `--lr-stat-trend-bad-color` (default: `var(--lr-color-danger)`) — Text color of the trend pill when its polarity is \"bad\". Independent of the headline value's `variant=\"danger\"` tint, which reads the shared `--lr-color-danger` token directly.\n- `--lr-stat-trend-bad-bg` (default: `color-mix(in srgb, var(--lr-color-danger) 8%, transparent)`) — Background of the trend pill when its polarity is \"bad\"."
12298
12543
  },
12299
12544
  "attributes": [
12545
+ {
12546
+ "name": "appearance",
12547
+ "description": {
12548
+ "kind": "markdown",
12549
+ "value": "Visual chrome, mirroring `lr-card`'s `appearance` vocabulary. `'card'` (the default) keeps the\nbordered, filled, padded box that stretches to fill its parent; `'plain'` removes the border,\nbackground, padding, corner radius and the `block-size: 100%` stretch so the stat can sit\ninline in prose, a toolbar or a table cell. `plain` wins over `compact` when both are set\n(nothing left to tighten), and it also drops `emphasis`'s accent edge — that edge is card\nchrome — while `emphasis`'s brand value tint still applies. A `plain` stat with a safe `href`\nswaps the card's border-color/lift hover affordance (invisible with no border) for an\nunderline on `[part='value']`; the `:focus-visible` ring is unchanged.\n\nType: `StatAppearance` \nDefault: `'card'`"
12550
+ }
12551
+ },
12300
12552
  {
12301
12553
  "name": "caption",
12302
12554
  "description": {
@@ -12354,17 +12606,17 @@
12354
12606
  }
12355
12607
  },
12356
12608
  {
12357
- "name": "prose",
12609
+ "name": "orientation",
12358
12610
  "description": {
12359
12611
  "kind": "markdown",
12360
- "value": "Renders `value` as smaller/lighter prose (e.g. a loading/status message) instead of the bold\nnumeric headline style, and hides `unit`.\n\nType: `boolean` \nDefault: `false`"
12612
+ "value": "Layout axis. `'vertical'` (the default) stacks label, value, trend, sub and caption.\n`'horizontal'` lays label, value+unit, trend, sub and caption out on a single wrapping\nbaseline row; `[part='spark']` and `[part='rows']` have no sensible place on a text baseline\nand stay stacked on their own full-width line beneath that row.\n\nType: `StatOrientation` \nDefault: `'vertical'`"
12361
12613
  }
12362
12614
  },
12363
12615
  {
12364
- "name": "rel",
12616
+ "name": "prose",
12365
12617
  "description": {
12366
12618
  "kind": "markdown",
12367
- "value": "Native anchor relationship tokens, used only while `href` resolves to a link.\n\nType: `string | undefined`"
12619
+ "value": "Renders `value` as smaller/lighter prose (e.g. a loading/status message) instead of the bold\nnumeric headline style, and hides `unit`.\n\nType: `boolean` \nDefault: `false`"
12368
12620
  }
12369
12621
  },
12370
12622
  {
@@ -12378,7 +12630,7 @@
12378
12630
  "name": "target",
12379
12631
  "description": {
12380
12632
  "kind": "markdown",
12381
- "value": "Native anchor target, used only while `href` resolves to a link.\n\nType: `string | undefined`"
12633
+ "value": "Native anchor target, used only while `href` resolves to a link. Setting this to `'_blank'`\n(or any other target) automatically derives `rel=\"noopener noreferrer\"` on the rendered\nanchor -- there is no separately-settable `rel` property, so a consumer can't forget it and\nleave the opened page holding a `window.opener` back-reference (reverse-tabnabbing). Matches\n`app-rail-item.class.ts`'s pattern.\n\nType: `string | undefined`"
12382
12634
  }
12383
12635
  },
12384
12636
  {
@@ -12415,7 +12667,7 @@
12415
12667
  "name": "lr-stepper",
12416
12668
  "description": {
12417
12669
  "kind": "markdown",
12418
- "value": "`<lr-stepper>` — ordered multi-step wizard/form navigation: label + index per step,\ncurrent/completed/locked/error state, click-to-jump. First-party invention (no Web Awesome\nequivalent). Fully data-driven and controlled, like `lr-table`'s `columns`/`rows` -- it never\nmutates `steps` itself; a click or Enter/Space on a non-disabled step fires a cancelable\n`lr-step-select`, and the host decides whether/how `steps` changes in response (mirroring\n`lr-dialog-close`'s cancelable-event convention).\n\nAn opt-in `orientationBreakpoint` (unset by default -- no behavior change) makes the effective\nlayout/navigation axis respond to a measured inline size instead of only the authored\n`orientation`: below that width (a pixel number or a `px`/`rem`/`em` CSS length), `narrowOrientation`\nbecomes effective; at/above it, `orientation` does. This mirrors `<lr-split>`'s identically-named\n`orientationBreakpoint`/`narrowOrientation`/`orientationBreakpointBasis` contract. Under the default\n`orientationBreakpointBasis=\"container\"` the breakpoint is measured on this stepper's own\n`[part=\"base\"]` inline size via `ResizeObserver`, so a stepper placed in a narrow split pane or\ndialog still responds correctly even in a wide window; `orientationBreakpointBasis=\"viewport\"`\ninstead evaluates `matchMedia('(max-width: <breakpoint>)')`, needed when the stepper has a fixed\nwidth in a row that stacks at a shared breakpoint. The effective axis is exposed via the\n`effectiveOrientation` getter, a `data-effective-orientation` host attribute (only present while\nthe breakpoint feature is active), and `lr-stepper-orientation-change`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `step` | A single step button. |\n| `step-check` | The completed-checkmark glyph, shown for `completed` steps instead of `step-index`. |\n| `step-index` | The numbered index chip, shown for `pending`/`current`/`error` steps. |\n| `step-label` | The step's label text. |"
12670
+ "value": "`<lr-stepper>` — ordered multi-step wizard/form navigation: label + index per step,\ncurrent/completed/locked/error state, click-to-jump. First-party invention (no Web Awesome\nequivalent). Fully data-driven and controlled, like `lr-table`'s `columns`/`rows` -- it never\nmutates `steps` itself; a click or Enter/Space on a non-disabled step fires a cancelable\n`lr-step-select`, and the host decides whether/how `steps` changes in response (mirroring\n`lr-dialog-close`'s cancelable-event convention).\n\nAn opt-in `orientationBreakpoint` (unset by default -- no behavior change) makes the effective\nlayout/navigation axis respond to a measured inline size instead of only the authored\n`orientation`: below that width (a pixel number or a `px`/`rem`/`em` CSS length), `narrowOrientation`\nbecomes effective; at/above it, `orientation` does. This mirrors `<lr-split>`'s identically-named\n`orientationBreakpoint`/`narrowOrientation`/`orientationBreakpointBasis` contract. Under the default\n`orientationBreakpointBasis=\"container\"` the breakpoint is measured on this stepper's own\n`[part=\"base\"]` inline size via `ResizeObserver`, so a stepper placed in a narrow split pane or\ndialog still responds correctly even in a wide window; `orientationBreakpointBasis=\"viewport\"`\ninstead evaluates `matchMedia('(max-width: <breakpoint>)')`, needed when the stepper has a fixed\nwidth in a row that stacks at a shared breakpoint. The effective axis is exposed via the\n`effectiveOrientation` getter, a `data-effective-orientation` host attribute (only present while\nthe breakpoint feature is active), and `lr-stepper-orientation-change`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `step` | A single step button. |\n| `step-check` | The completed-checkmark glyph, shown for `completed` steps instead of `step-index`. |\n| `step-icon` | Optional leading topic glyph supplied by the item's `icon` field; content may have a natural aspect ratio and is not restricted to a square icon. Rendered additionally to, never instead of, `step-index`/`step-check`. |\n| `step-index` | The numbered index chip, shown for `pending`/`current`/`error` steps. |\n| `step-label` | The step's label text. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-stepper-current-color` (default: `var(--lr-color-text)`) — Text color of the `current` step. Declared as an inline `var()` fallback (never on `:host`), so setting it on the element or an ancestor recolors only the current step without hijacking the library-wide `--lr-color-text` token.\n- `--lr-stepper-current-font-weight` (default: `var(--lr-font-weight-semibold)`) — Font weight of the `current` step's label. `::part(step)[data-state='current']` is invalid CSS (an attribute selector cannot follow `::part`), so this is the only way to change just the current step's boldness without hijacking the library-wide `--lr-font-weight-semibold` token.\n- `--lr-stepper-error-color` (default: `var(--lr-color-danger)`) — Text color of an `error` step.\n- `--lr-stepper-current-index-bg` (default: `var(--lr-color-brand)`) — Background of the `current` step's numbered index chip (`step-index`).\n- `--lr-stepper-current-index-color` (default: `var(--lr-color-surface)`) — Text color of the `current` step's numbered index chip."
12419
12671
  },
12420
12672
  "attributes": [
12421
12673
  {
@@ -12540,7 +12792,7 @@
12540
12792
  "name": "lr-suggestion-chips",
12541
12793
  "description": {
12542
12794
  "kind": "markdown",
12543
- "value": "`<lr-suggestion-chips>` — starter prompts (empty thread) and follow-up suggestions (after a\nresponse) as a horizontally scrollable chip row; activation hands the prompt to the host, which\ndecides whether to compose it into an input or send it directly. Never writes into a composer or\nsends anything itself.\n\nStreaming-friendly: chips render through a keyed `repeat()` on `id`, so replacing follow-ups\nmid-conversation preserves focus on any chip whose `id` survives.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The labeled group. |\n| `chip` | Each suggestion button. |\n| `chip-detail` | The secondary line (only rendered when `detail` is set). |\n| `chip-label` | The primary text. |"
12795
+ "value": "`<lr-suggestion-chips>` — starter prompts (empty thread) and follow-up suggestions (after a\nresponse) as a horizontally scrollable chip row; activation hands the prompt to the host, which\ndecides whether to compose it into an input or send it directly. Never writes into a composer or\nsends anything itself.\n\nStreaming-friendly: chips render through a keyed `repeat()` on `id`, so replacing follow-ups\nmid-conversation preserves focus on any chip whose `id` survives.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The labeled group. |\n| `chip` | Each suggestion button. |\n| `chip-detail` | The secondary line (only rendered when `detail` is set). |\n| `chip-label` | The primary text. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-suggestion-chips-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Background of a hovered chip.\n- `--lr-suggestion-chips-hover-border` (default: `var(--lr-color-brand)`) — Border color of a hovered chip."
12544
12796
  },
12545
12797
  "attributes": [
12546
12798
  {
@@ -12570,7 +12822,7 @@
12570
12822
  "name": "lr-svg-viewer",
12571
12823
  "description": {
12572
12824
  "kind": "markdown",
12573
- "value": "Fetches and safely renders an inline SVG document.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root container. |\n| `body` | The wrapper around the fetched-state content. |\n| `error` | The error region. |\n| `frame-content` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable`. |\n| `frame-controls` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable`. |\n| `frame-reset` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable`. |\n| `frame-viewport` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable`. |\n| `frame-zoom-in` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable`. |\n| `frame-zoom-out` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable`. |\n| `highlight-layer` | The wrapper around every rendered region highlight. |\n| `region-highlight` | One region highlight (`data-tone`, `data-active`). |\n| `spinner` | The loading region. |\n| `svg` | The sanitized SVG document, once loaded. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-svg-viewer-max-height` (default: `none`) — Maximum block size of the scrollable body before it scrolls internally. Also settable via the `max-height` property."
12825
+ "value": "Fetches and safely renders an inline SVG document.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root container. |\n| `body` | The wrapper around the fetched-state content. |\n| `error` | The error region. |\n| `frame-content` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable`. |\n| `frame-controls` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable`. |\n| `frame-reset` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable`. |\n| `frame-viewport` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable`. |\n| `frame-zoom-in` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable`. |\n| `frame-zoom-out` | Forwarded from the internal `<lr-zoomable-frame>` when `zoomable`. |\n| `highlight-layer` | The wrapper around every rendered region highlight. |\n| `region-highlight` | One region highlight (`data-tone`, `data-active`). |\n| `spinner` | The loading region. |\n| `svg` | The sanitized SVG document, once loaded. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-svg-viewer-max-height` (default: `none`) — Maximum block size of the scrollable body before it scrolls internally. Also settable via the `max-height` property.\n- `--lr-svg-viewer-active-border` (default: `var(--lr-color-warning, var(--lr-color-brand))`) — Border color of the `[part=\"region-highlight\"]` matching `activeHighlightId`. Distinct from the resting highlight border, so the active region can be recolored without touching the rest."
12574
12826
  },
12575
12827
  "attributes": [
12576
12828
  {
@@ -12716,7 +12968,7 @@
12716
12968
  "name": "lr-table",
12717
12969
  "description": {
12718
12970
  "kind": "markdown",
12719
- "value": "`<lr-table>` — a presentational, sort/select-aware data table.\n\nHeader/row activation is delegated: one `click` and one `keydown`\nlistener on `<table>` resolve the target via `closest('[data-col-key]'\n| '[data-row-key]')` and a key→object lookup map, instead of allocating\nfresh per-column/per-row closures on every render. Both listeners guard\nagainst nested interactive `cell()` content first (see\n`INTERACTIVE_SELECTOR`) so a button/link/input inside a cell owns its own\nactivation instead of triggering `lr-row-click`.\n\nKeyboard focus follows a roving-tabindex pattern (one `tabindex=\"0\"` stop\namong the header cells, one among the body rows — see `focusedColKey()` /\n`focusedRowKey()`), matching this repo's other `role=\"grid\"`/composite\nwidgets. Left/Right/Home/End move within the header row; Up/Down/Home/End\nmove within the body; Down from the header enters the body's roving stop,\nand Up from the body's first row returns to the header's roving stop.\nEnter/Space still only sort/activate (see `activateColumn()` /\n`activateRow()`).\n\nSet `aria-label` on the host to give the `role=\"grid\"` element an\naccessible name; it's forwarded into the shadow DOM's `<table>`.\n\n`columns[].priority` ('medium' | 'low') hides that column under\n`[part='base']`'s `@container` breakpoints; `[part='reveal-columns-button']`\nforces them all back into view. Rather than a *static* check of whether any\ncolumn merely declares a `priority`, the button (and the public\n`columnsHidden` property, see below) reflects whether a `priority` column\nis *actually* hidden right now — measured via `ResizeObserver` on\n`[part='base']` plus a post-render DOM check — or the public `showAllColumns`\nforce-visible mode is currently active (so there's still a way to toggle\nit back off). `showAllColumns` defaults to `false` and toggles itself on\n`[part='reveal-columns-button']` activation with no external wiring\nrequired, but is also settable up front (property or the reflected\n`show-all-columns` attribute) to restore a previously-persisted\npreference, and readable back — directly or via the `lr-columns-revealed`\nevent — to persist the current one. `columns[].sticky` pins a column's\nheader/cells to the inline-start (default/`true`) or inline-end (`'end'`)\nedge while the table scrolls horizontally.\n\n`expandedContent` (a table-level `(row: T) => unknown`, not a per-column\nhook, since the resulting panel spans every column via `colspan`) makes\nevery row render a leading chevron-toggle cell before its data columns.\n`canExpand` optionally gates which rows actually get an interactive\ntoggle — a row that fails it still gets a blank leading cell for column\nalignment. Which rows are currently open is fully consumer-owned via\n`expandedKeys` (a `Set<string | number>` of row keys, per `rowKey`/\n`keyOf()`) — the table only reads it and emits `lr-row-expand-toggle`\non activation, mirroring `sortKey`/`selectedKey`'s existing\npresentational-only convention.\n\nSelection is opt-in through the `selectionMode` property. Use `single` or\n`multiple` to self-manage row selection; the default `none` remains\npresentational. `selectedKeys` contains the raw keys selected in multiple\nmode.\n\n`filterable` adds a compact search field above the grid. `filterText` is\ncontrolled and emits `lr-filter-change`; `filter` can provide a typed\npredicate, otherwise the row is matched against its JSON representation.\n`pageSize` enables controlled pagination through the existing\n`<lr-pagination>` primitive. Client mode slices `rows`; server mode\nrenders the supplied page unchanged while using `totalItems` for the\nnavigation summary. `loading` keeps the table shell busy and renders an\nindeterminate spinner.\nColumns with `editable: true` open a native text/number editor on\ndouble-click and emit `lr-cell-edit`; row mutation remains consumer-owned.\n`spellcheck`/`autocapitalize`/`autoCorrect` forward to the filter input and, for a `'text'`\n(the default) `editType`, the inline cell editor -- no effect on a `'number'` cell editor.\n`groupBy` inserts non-focusable group header rows before each group; use\n`groupLabel` when the raw group key needs custom content.\n\n`columns[].heatValue` opts a column into heat-tint mode: its numeric return value is normalized\nagainst a shared scale spanning every `heatValue`-defining column across every currently-rendered\nrow (auto-derived, or overridden via `heatTintScale`) and painted as a `color-mix()` background via\nthe retheme-able `--lr-table-heat-tint-lo`/`-hi` custom properties (matching `lr-heatmap`'s own\nramp-token convention). `rowTotal`/`grandTotal` add a trailing column mirroring `expandedContent`'s\nleading one: `rowTotal(row)` renders per-row, `grandTotal(rows)` renders at its intersection with\nthe footer row (only when a column also defines `footer`) — both share `footer`'s own\n\"consumer computes/renders\" contract rather than assuming addition.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper around the `<table>` and its footer controls. |\n| `cell` | Each body `<td>`. |\n| `cell-editor` | The native inline cell editor, shown after a double-click on an editable cell. |\n| `expand-toggle-cell` | Each row's (and the header's) leading chevron-toggle cell, rendered only when `expandedContent` is set. |\n| `expanded-cell` | The single `colspan`-spanning `<td>` inside `expanded-row`, containing `expandedContent(row)`. |\n| `expanded-row` | The full-width panel `<tr>` rendered beneath a row whose key is in `expandedKeys`. |\n| `filter` | The optional row-filter input. |\n| `filter-label` | The `<label>` wrapping the filter input. |\n| `foot` | The `<tfoot>`, only rendered when at least one column defines `footer`. |\n| `footer-cell` | A single footer cell. |\n| `footer-row` | The single footer row. |\n| `group-cell` | The full-width group header cell. |\n| `group-row` | A non-focusable group header row. |\n| `head` | The `<thead>` element. |\n| `header-cell` | Each `<th>` header cell. |\n| `loading` | The loading-state wrapper. |\n| `more-button` | The \"load more\" control, shown when `hasMore` is true. |\n| `pagination` | The optional pagination component. |\n| `resize-handle` | The focusable separator used to resize a `resizable` column. |\n| `reveal-columns-button` | The button that toggles `priority`-hidden columns back into view. |\n| `row` | Each body `<tr>`. |\n| `row-expand-icon` | The chevron icon inside `row-expand-toggle`. |\n| `row-expand-toggle` | The `<button>` inside `expand-toggle-cell`, absent for a row that fails `canExpand`. |\n| `row-total-cell` | Each body row's trailing `<td>` holding `rowTotal(row)`, rendered only when `rowTotal` is set. The corresponding footer-row cell (holding `grandTotal`) is a `footer-cell` instead, matching every other footer cell. |\n| `sort-icon` | The chevron shown in the active sortable column's header cell. |\n| `table` | The `<table role=\"grid\">` element. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-table-resize-min-width` (default: `var(--lr-size-3rem)`) — Default minimum width for a resizable column without an explicit pixel `minWidth`.\n- `--lr-table-resize-handle-opacity` (default: `0.12`) — Hover/focus opacity of the resize handle.\n- `--lr-table-max-height` (default: `none`) — Cap on the scroll container's block size, past which the table body scrolls.\n- `--lr-table-heat-tint-lo` (default: `var(--lr-color-brand-quiet)`) — Low endpoint of the heat-tint ramp used by `heatValue` columns.\n- `--lr-table-heat-tint-hi` (default: `var(--lr-color-brand)`) — High endpoint of the heat-tint ramp used by `heatValue` columns.\n- `--lr-table-heat-t` — This cell's position on the heat-tint ramp, as a percentage string. Set inline by the component on each `[data-heat]` cell; not consumer-settable.\n- `--lr-table-sticky-offset` (default: `0`) — Distance a `sticky` column pins from the inline edge. Measured and set inline per column by the component so multiple sticky columns stack instead of overlapping; falls back to `0` for the first one, or before the first measurement pass."
12971
+ "value": "`<lr-table>` — a presentational, sort/select-aware data table.\n\nHeader/row activation is delegated: one `click` and one `keydown`\nlistener on `<table>` resolve the target via `closest('[data-col-key]'\n| '[data-row-key]')` and a key→object lookup map, instead of allocating\nfresh per-column/per-row closures on every render. Both listeners guard\nagainst nested interactive `cell()` content first (see\n`INTERACTIVE_SELECTOR`) so a button/link/input inside a cell owns its own\nactivation instead of triggering `lr-row-click`.\n\nKeyboard focus follows a roving-tabindex pattern (one `tabindex=\"0\"` stop\namong the header cells, one among the body rows — see `focusedColKey()` /\n`focusedRowKey()`), matching this repo's other `role=\"grid\"`/composite\nwidgets. Left/Right/Home/End move within the header row; Up/Down/Home/End\nmove within the body; Down from the header enters the body's roving stop,\nand Up from the body's first row returns to the header's roving stop.\nEnter/Space still only sort/activate (see `activateColumn()` /\n`activateRow()`).\n\nSet `aria-label` on the host to give the `role=\"grid\"` element an\naccessible name; it's forwarded into the shadow DOM's `<table>`.\n\n`columns[].priority` ('medium' | 'low') hides that column under\n`[part='base']`'s `@container` breakpoints; `[part='reveal-columns-button']`\nforces them all back into view. Rather than a *static* check of whether any\ncolumn merely declares a `priority`, the button (and the public\n`columnsHidden` property, see below) reflects whether a `priority` column\nis *actually* hidden right now — measured via `ResizeObserver` on\n`[part='base']` plus a post-render DOM check — or the public `showAllColumns`\nforce-visible mode is currently active (so there's still a way to toggle\nit back off). `showAllColumns` defaults to `false` and toggles itself on\n`[part='reveal-columns-button']` activation with no external wiring\nrequired, but is also settable up front (property or the reflected\n`show-all-columns` attribute) to restore a previously-persisted\npreference, and readable back — directly or via the `lr-columns-revealed`\nevent — to persist the current one. `columns[].sticky` pins a column's\nheader/cells to the inline-start (default/`true`) or inline-end (`'end'`)\nedge while the table scrolls horizontally.\n\n`expandedContent` (a table-level `(row: T) => unknown`, not a per-column\nhook, since the resulting panel spans every column via `colspan`) makes\nevery row render a leading chevron-toggle cell before its data columns.\n`canExpand` optionally gates which rows actually get an interactive\ntoggle — a row that fails it still gets a blank leading cell for column\nalignment. Which rows are currently open is fully consumer-owned via\n`expandedKeys` (a `Set<string | number>` of row keys, per `rowKey`/\n`keyOf()`) — the table only reads it and emits `lr-row-expand-toggle`\non activation, mirroring `sortKey`/`selectedKey`'s existing\npresentational-only convention.\n\nSelection is opt-in through the `selectionMode` property. Use `single` or\n`multiple` to self-manage row selection; the default `none` remains\npresentational. `selectedKeys` contains the raw keys selected in multiple\nmode.\n\n`filterable` adds a compact search field above the grid. `filterText` is\ncontrolled and emits `lr-filter-change`; `filter` can provide a typed\npredicate, otherwise the row is matched against its JSON representation.\n`pageSize` enables controlled pagination through the existing\n`<lr-pagination>` primitive. Client mode slices `rows`; server mode\nrenders the supplied page unchanged while using `totalItems` for the\nnavigation summary. `loading` keeps the table shell busy; `loadingAppearance`\nchooses how — the default `'spinner'` replaces the grid with an indeterminate\nspinner, while `'skeleton'` keeps the real `<colgroup>`/`<thead>` (and the\nfilter/pagination chrome) and fills the body with `skeletonRows` placeholder\nrows, so column geometry survives the load instead of collapsing and\nreflowing. Either way exactly one `role=\"status\"` live region announces the\nstate — every placeholder opts out of `<lr-skeleton>`'s own announcement.\nColumns with `editable: true` open a native text/number editor on\ndouble-click and emit `lr-cell-edit`; row mutation remains consumer-owned.\n`editable: 'always'` instead renders that editor in every body cell of the\ncolumn from first paint — a settings/rate-style column meant to be typed\nstraight into. Persistent editors are plain tab stops (no `tabindex` of their\nown, exactly like the row-expand toggle) outside the header/row roving model,\nso arrow keys still navigate the grid from a row's own tab stop and act as\ncaret movement once focus is inside a field. Enter commits and keeps focus;\nEscape has nothing to cancel back to, so it is left uncancelled for an\nancestor dialog/popover. Their value binds as a content attribute, so once\nthe user has typed into one an out-of-band `rows` update to that same cell no\nlonger replaces the draft; an untouched editor still picks up a new value.\nFocus is restored across a re-sort that moves the editor's node, and dropped\n(never re-aimed at an unrelated row) when its row leaves the rendered page.\n`spellcheck`/`autocapitalize`/`autoCorrect` forward to the filter input and, for a `'text'`\n(the default) `editType`, the inline cell editor -- no effect on a `'number'` cell editor.\n`groupBy` inserts non-focusable group header rows before each group; use\n`groupLabel` when the raw group key needs custom content.\n\n`columns[].heatValue` opts a column into heat-tint mode: its numeric return value is normalized\nagainst a shared scale spanning every `heatValue`-defining column across every currently-rendered\nrow (auto-derived, or overridden via `heatTintScale`) and painted as a `color-mix()` background via\nthe retheme-able `--lr-table-heat-tint-lo`/`-hi` custom properties (matching `lr-heatmap`'s own\nramp-token convention). `rowTotal`/`grandTotal` add a trailing column mirroring `expandedContent`'s\nleading one: `rowTotal(row)` renders per-row, `grandTotal(rows)` renders at its intersection with\nthe footer row (only when a column also defines `footer`) — both share `footer`'s own\n\"consumer computes/renders\" contract rather than assuming addition.\n\nThe built-in empty state is addressable rather than fixed: every `<lr-empty>` the table renders\ncarries `part=\"empty\"` and re-exports its own inner parts as `empty-heading`/`empty-description`/\n`empty-icon`/`empty-actions`/`empty-base`, the two *data*-empty branches (no rows at all, and\nfiltered/paginated down to zero) render it as the fallback content of a named `empty` slot so a\nconsumer can replace it wholesale, and `emptyCompact` overrides each branch's built-in `compact`\ndefault. The no-columns branch is deliberately **not** slot-replaceable — it reports a\nconfiguration problem (`noColumnsHeading`), not \"this query returned nothing\", and a single slot\ncovering all three would collapse that distinction.\n\n`layout` sets a floor on the `<table>`'s `table-layout`: `'fixed'` forces it even with no column\nwidths, while the default `'auto'` still resolves to `fixed` whenever a column declares a `width`\nor a drag-resize is in flight (column resizing does not work under `table-layout: auto`).\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `empty` | Replaces the built-in empty state on the two *data*-empty branches (no rows at all, and filtered/paginated down to zero). Left unfilled, the built-in `[part='empty']` `<lr-empty>` renders as this slot's fallback content. The no-columns branch renders its own `noColumnsHeading` state and is not slot-replaceable. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper around the `<table>` and its footer controls. |\n| `cell` | Each body `<td>`. |\n| `cell-editor` | The native inline cell editor: shown after a double-click on an `editable: true` cell, and rendered persistently in every body cell of an `editable: 'always'` column. |\n| `empty` | The built-in `<lr-empty>` host, in all three empty states (no columns configured, no rows at all, and filtered/paginated down to zero rows). The two data-empty states render it as the `empty` slot's fallback, so it disappears once that slot is filled. Note that the no-columns and no-rows states return the empty element as the shadow root's own root, with no `[part='base']` wrapper around it — `::part(base)` does not apply in those two states, only in the filtered-to-zero one. |\n| `empty-actions` | Exported from the built-in `<lr-empty>`'s `actions` part. |\n| `empty-base` | Exported from the built-in `<lr-empty>`'s own `base` part. |\n| `empty-description` | Exported from the built-in `<lr-empty>`'s `description` part. |\n| `empty-heading` | Exported from the built-in `<lr-empty>`'s `heading` part. |\n| `empty-icon` | Exported from the built-in `<lr-empty>`'s `icon` part. |\n| `expand-toggle-cell` | Each row's (and the header's) leading chevron-toggle cell, rendered only when `expandedContent` is set. |\n| `expanded-cell` | The single `colspan`-spanning `<td>` inside `expanded-row`, containing `expandedContent(row)`. |\n| `expanded-row` | The full-width panel `<tr>` rendered beneath a row whose key is in `expandedKeys`. |\n| `filter` | The optional row-filter input. |\n| `filter-label` | The `<label>` wrapping the filter input. |\n| `foot` | The `<tfoot>`, only rendered when at least one column defines `footer`. |\n| `footer-cell` | A single footer cell. |\n| `footer-row` | The single footer row. |\n| `group-cell` | The full-width group header cell. |\n| `group-row` | A non-focusable group header row. |\n| `head` | The `<thead>` element. |\n| `header-cell` | Each `<th>` header cell. |\n| `loading` | The loading-state wrapper. Under `loadingAppearance=\"spinner\"` (the default) it is the visible block holding the spinner; under `\"skeleton\"` it is the visually-hidden `role=\"status\"` node, since the placeholder rows are the visible affordance. |\n| `more-button` | The \"load more\" control, shown when `hasMore` is true. |\n| `pagination` | The optional pagination component. |\n| `resize-handle` | The focusable separator used to resize a `resizable` column. |\n| `reveal-columns-button` | The button that toggles `priority`-hidden columns back into view. |\n| `row` | Each body `<tr>`. |\n| `row-expand-icon` | The chevron icon inside `row-expand-toggle`. |\n| `row-expand-toggle` | The `<button>` inside `expand-toggle-cell`, absent for a row that fails `canExpand`. |\n| `row-total-cell` | Each body row's trailing `<td>` holding `rowTotal(row)`, rendered only when `rowTotal` is set. The corresponding footer-row cell (holding `grandTotal`) is a `footer-cell` instead, matching every other footer cell. |\n| `skeleton` | Each `<lr-skeleton>` placeholder inside a `loadingAppearance=\"skeleton\"` body cell. Its rows and cells reuse the ordinary `row`/`cell`/`row-total-cell` parts (that is what keeps them geometrically identical to real rows), so this is the part to target for the placeholder's own look — e.g. `::part(skeleton) { --lr-skeleton-h: 2em; }`. |\n| `sort-icon` | The chevron shown in the active sortable column's header cell. |\n| `table` | The `<table role=\"grid\">` element. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-table-resize-min-width` (default: `var(--lr-size-3rem)`) — Default minimum width for a resizable column without an explicit pixel `minWidth`.\n- `--lr-table-resize-handle-opacity` (default: `0.12`) — Hover/focus opacity of the resize handle.\n- `--lr-table-max-height` (default: `none`) — Cap on the scroll container's block size, past which the table body scrolls.\n- `--lr-table-heat-tint-lo` (default: `var(--lr-color-brand-quiet)`) — Low endpoint of the heat-tint ramp used by `heatValue` columns.\n- `--lr-table-heat-tint-hi` (default: `var(--lr-color-brand)`) — High endpoint of the heat-tint ramp used by `heatValue` columns.\n- `--lr-table-heat-t` — This cell's position on the heat-tint ramp, as a percentage string. Set inline by the component on each `[data-heat]` cell; not consumer-settable.\n- `--lr-table-row-selected-bg` (default: `var(--lr-color-brand-quiet)`) — Background of a row whose `aria-selected` is `true`. Shadow Parts forbids an attribute selector after `::part()`, so `::part(row)[aria-selected]` is invalid CSS and the selected row could otherwise only be restyled by hijacking the library-wide `--lr-color-brand-quiet` token.\n- `--lr-table-sticky-offset` (default: `0`) — Distance a `sticky` column pins from the inline edge. Measured and set inline per column by the component so multiple sticky columns stack instead of overlapping; falls back to `0` for the first one, or before the first measurement pass."
12720
12972
  },
12721
12973
  "attributes": [
12722
12974
  {
@@ -12740,6 +12992,13 @@
12740
12992
  "value": "Whether a `priority` column is *actually* hidden right now by\ntable.styles.ts's `@container` rules, or `showAllColumns` force-visible\nmode is currently active — the same computed value that gates whether\n`[part='reveal-columns-button']` renders at all (see `render()`), kept\nin sync by `recomputeColumnsHidden()`. Computed/read-only by\nconvention: consumers may read it (and listen for\n`lr-columns-hidden-change`), but setting it directly has no lasting\neffect, since it's recomputed on the very next render or\n`[part='base']` resize.\n\nType: `boolean` \nDefault: `false`"
12741
12993
  }
12742
12994
  },
12995
+ {
12996
+ "name": "empty-compact",
12997
+ "description": {
12998
+ "kind": "markdown",
12999
+ "value": "Overrides the built-in `[part='empty']` state's `compact` rendering. Leave `undefined` (the\ndefault) to keep each branch's own built-in behavior: the whole-table states (no columns, no\nrows) render spacious, while the in-table filtered/paginated-to-zero state — which sits below\nthe filter field inside `[part='base']` — renders compact. `empty-compact=\"false\"` forces the\nspacious rendering everywhere. Has no effect once the `empty` slot is filled.\n\nType: `boolean | undefined`"
13000
+ }
13001
+ },
12743
13002
  {
12744
13003
  "name": "empty-description",
12745
13004
  "description": {
@@ -12796,6 +13055,21 @@
12796
13055
  "value": "Type: `string` \nDefault: `''`"
12797
13056
  }
12798
13057
  },
13058
+ {
13059
+ "name": "layout",
13060
+ "description": {
13061
+ "kind": "markdown",
13062
+ "value": "Floor for the `<table>`'s `table-layout`. `'fixed'` forces the fixed algorithm even when no\ncolumn declares a `width`, so every column shares the available width evenly and long cell\ncontent is clipped/wrapped instead of stretching its column. The default `'auto'` is only a\nfloor: it still resolves to `fixed` whenever a column declares a `width`, a column has been\ndrag-resized, or a resize gesture is in flight — resizing does not work under\n`table-layout: auto`.\n\nTwo consequences of the fixed algorithm are worth knowing before opting in: with no declared\nwidths the *first* row (header row included) determines every column's width, so revealing a\n`priority`-hidden column via `[part='reveal-columns-button']` re-measures and changes all of\nthem; and `columns[].minWidth`/`maxWidth` are silently ignored by `table-layout: fixed`\n(declare `width` instead when you need a specific column sized).\n\nType: `'auto' | 'fixed'` \nDefault: `'auto'`"
13063
+ },
13064
+ "values": [
13065
+ {
13066
+ "name": "auto"
13067
+ },
13068
+ {
13069
+ "name": "fixed"
13070
+ }
13071
+ ]
13072
+ },
12799
13073
  {
12800
13074
  "name": "loading",
12801
13075
  "description": {
@@ -12803,6 +13077,13 @@
12803
13077
  "value": "Type: `boolean` \nDefault: `false`"
12804
13078
  }
12805
13079
  },
13080
+ {
13081
+ "name": "loading-appearance",
13082
+ "description": {
13083
+ "kind": "markdown",
13084
+ "value": "How `loading` renders. `'spinner'` (the default, unchanged output) replaces the whole grid\nwith an indeterminate spinner. `'skeleton'` instead renders the real table — the same\n`<colgroup>` (declared *and* drag-resized widths included), the same `<thead>`, the filter\nfield and the pagination footer — and fills `<tbody>` with placeholder rows, so a cold load\nsketches the grid's shape rather than collapsing to a spinner and reflowing when the rows\nland. Kept separate from `loading` rather than widening it to a string union, so\n`?loading=${…}` bindings and `el.loading === true` checks keep working.\n\nColumn *widths* only stay pixel-identical across the load if the browser isn't sizing them\nfrom cell content: declare `columns[].width`, or set `layout=\"fixed\"`. Under the default\n`table-layout: auto`, placeholder cells have no intrinsic width, so the columns re-measure\nwhen real content arrives — exactly as they do between any two different data sets.\n\nType: `TableLoadingAppearance` \nDefault: `'spinner'`"
13085
+ }
13086
+ },
12806
13087
  {
12807
13088
  "name": "loading-label",
12808
13089
  "description": {
@@ -12899,6 +13180,13 @@
12899
13180
  "value": "Forces `priority`-hidden columns back into view, overriding the\n`@container` hide rules in table.styles.ts. Toggles itself on\n`[part='reveal-columns-button']` activation by default — no external\nwiring is required for the button to work. Also settable from outside\n(property or the reflected `show-all-columns` attribute) to restore a\npreviously-persisted preference, and readable back at any time — or via\nthe `lr-columns-revealed` event, fired whenever the button toggles it\n— to persist the current one.\n\nType: `boolean` \nDefault: `false`"
12900
13181
  }
12901
13182
  },
13183
+ {
13184
+ "name": "skeleton-rows",
13185
+ "description": {
13186
+ "kind": "markdown",
13187
+ "value": "Number of placeholder rows rendered by `loadingAppearance=\"skeleton\"`. `0` (the default)\nderives the count instead: the normalized `pageSize` when pagination is on (capped at 20, so\na large page size can't emit thousands of placeholder cells), otherwise 3. Any positive value\nis used verbatim and is not capped. Ignored entirely under the default spinner appearance.\n\nType: `number` \nDefault: `0`"
13188
+ }
13189
+ },
12902
13190
  {
12903
13191
  "name": "sort-dir",
12904
13192
  "description": {
@@ -12941,7 +13229,7 @@
12941
13229
  "name": "lr-tabs",
12942
13230
  "description": {
12943
13231
  "kind": "markdown",
12944
- "value": "`<lr-tabs>` — a tab strip whose panels are direct light-DOM children,\neach carrying `slot=\"<id>\"` (the panel's stable id) and `label=\"<text>\"`\n(the tab button's text). One named `<slot>` is rendered per distinct\n`slot` name found among the current children — a child with no `label`,\nor a name with no matching child, simply never produces a tab.\n\nA tab button's *visible* content can carry a leading icon without ever\nchanging its *accessible name* (which always stays exactly `label`'s\ntext, nothing else): give a tab an extra direct-child sibling of\n`<lr-tabs>` carrying `slot=\"<id>-icon\"` (that sibling's own content --\nan inline SVG, an emoji span, a custom icon element, anything -- is\nentirely up to the consumer). It's rendered ahead of the label inside\nthat tab's button, wrapped in an `aria-hidden=\"true\"` part so it's\nexcluded from accessible-name computation no matter what it contains. A\ntab with no matching `<id>-icon` sibling renders no icon wrapper at all,\nso existing text-only tabs are completely unaffected. (A named slot,\nrather than a second attribute holding an icon-name lookup, was chosen\nbecause this library's `internal/icons.ts` is a small closed set of\nchrome glyphs for this library's *own* components, not a public\nname-keyed registry -- a slot lets a consumer supply an arbitrary,\ndomain-specific icon instead of being limited to that internal set.)\n\nImplements the WAI-ARIA APG tabs pattern with automatic activation:\nLeft/Right (swapped under RTL) move focus *and* selection together,\nHome/End jump to the first/last enabled tab, and a roving `tabindex`\nfollows whichever tab is currently selected.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Direct children with `slot=\"<id>\" label=\"<text>\"` (and optionally `disabled`); one becomes each tab's panel. |\n| `<id>-icon` | Optional sibling direct child supplying a tab's leading icon content; excluded from the tab button's accessible name. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper around the tablist and panels. |\n| `panel` | A single `role=\"tabpanel\"` wrapper (one per tab, hidden unless active). |\n| `tab` | A single tab button. |\n| `tab-icon` | The optional leading-icon wrapper inside a tab button; only rendered when that tab has a matching `<id>-icon` sibling. |\n| `tablist` | The `role=\"tablist\"` row of tab buttons. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-scroll-fade-size` (default: `2rem`) — Width of the static fade at each horizontal scroll edge."
13232
+ "value": "`<lr-tabs>` — a tab strip whose panels are direct light-DOM children,\neach carrying `slot=\"<id>\"` (the panel's stable id) and `label=\"<text>\"`\n(the tab button's text). One named `<slot>` is rendered per distinct\n`slot` name found among the current children — a child with no `label`,\nor a name with no matching child, simply never produces a tab.\n\nA tab button's *visible* content can carry a leading icon without ever\nchanging its *accessible name* (which always stays exactly `label`'s\ntext, nothing else): give a tab an extra direct-child sibling of\n`<lr-tabs>` carrying `slot=\"<id>-icon\"` (that sibling's own content --\nan inline SVG, an emoji span, a custom icon element, anything -- is\nentirely up to the consumer). It's rendered ahead of the label inside\nthat tab's button, wrapped in an `aria-hidden=\"true\"` part so it's\nexcluded from accessible-name computation no matter what it contains. A\ntab with no matching `<id>-icon` sibling renders no icon wrapper at all,\nso existing text-only tabs are completely unaffected. (A named slot,\nrather than a second attribute holding an icon-name lookup, was chosen\nbecause this library's `internal/icons.ts` is a small closed set of\nchrome glyphs for this library's *own* components, not a public\nname-keyed registry -- a slot lets a consumer supply an arbitrary,\ndomain-specific icon instead of being limited to that internal set.)\n\nImplements the WAI-ARIA APG tabs pattern with automatic activation:\nLeft/Right (swapped under RTL) move focus *and* selection together,\nHome/End jump to the first/last enabled tab, and a roving `tabindex`\nfollows whichever tab is currently selected.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Direct children with `slot=\"<id>\" label=\"<text>\"` (and optionally `disabled`); one becomes each tab's panel. |\n| `<id>-icon` | Optional sibling direct child supplying a tab's leading icon content; excluded from the tab button's accessible name. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper around the tablist and panels. |\n| `panel` | A single `role=\"tabpanel\"` wrapper (one per tab, hidden unless active). |\n| `tab` | A single tab button. |\n| `tab-icon` | The optional leading-icon wrapper inside a tab button; only rendered when that tab has a matching `<id>-icon` sibling. |\n| `tablist` | The `role=\"tablist\"` row of tab buttons. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-scroll-fade-size` (default: `2rem`) — Width of the static fade at each horizontal scroll edge.\n- `--lr-tabs-selected-color` (default: `var(--lr-color-brand)`) — Text color of the selected tab. Scoped to `[aria-selected='true']` only, so it never repaints a hovered unselected tab (which is what hijacking `--lr-color-brand` library-wide used to do).\n- `--lr-tabs-indicator-color` (default: `var(--lr-color-brand)`) — Color of the selected tab's underline, themeable independently of its text color.\n- `--lr-tabs-hover-color` (default: `var(--lr-color-text)`) — Text color of a hovered, non-disabled tab. Independent of the selected-state props above."
12945
13233
  },
12946
13234
  "attributes": [
12947
13235
  {
@@ -12971,7 +13259,7 @@
12971
13259
  "name": "lr-tag",
12972
13260
  "description": {
12973
13261
  "kind": "markdown",
12974
- "value": "`<lr-tag>` — a semantic alias for the compact badge treatment.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Badge content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The badge surface. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-badge-background` (default: `var(--lr-color-surface)`) — The badge's background. Each non-neutral `variant` sets it to that variant's `-quiet` tint.\n- `--lr-badge-border` (default: `var(--lr-color-border)`) — The badge's border color. Each non-neutral `variant` sets it to that variant's loud color.\n- `--lr-badge-color` (default: `var(--lr-color-text)`) — The badge's text color. Each non-neutral `variant` sets it to that variant's loud color."
13262
+ "value": "`<lr-tag>` — a semantic alias for the compact badge treatment.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Badge content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The badge surface. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-badge-background` (default: `var(--lr-color-surface)`) — The badge's background. Each non-neutral `variant` sets it to that variant's `-quiet` tint.\n- `--lr-badge-border` (default: `var(--lr-color-border)`) — The badge's border color. Each non-neutral `variant` sets it to that variant's loud color.\n- `--lr-badge-color` (default: `var(--lr-color-text)`) — The badge's text color. Each non-neutral `variant` sets it to that variant's loud color.\n- `--lr-badge-font-size` (default: `var(--lr-font-size-sm)`) — The badge's label font size. Each `size` sets it to that step's font size.\n- `--lr-badge-padding-inline` (default: `var(--lr-space-s)`) — The badge's inline padding. Each `size` sets it to that step's inline padding.\n- `--lr-badge-min-height` (default: `var(--lr-size-1-25rem)`) — The badge's minimum block size. Each `size` sets it to that step's minimum block size."
12975
13263
  },
12976
13264
  "attributes": [
12977
13265
  {
@@ -12981,6 +13269,13 @@
12981
13269
  "value": "Optional locale override. Otherwise the nearest `locale`/`lang` ancestor is used.\n\nType: `string` \nDefault: `''`"
12982
13270
  }
12983
13271
  },
13272
+ {
13273
+ "name": "size",
13274
+ "description": {
13275
+ "kind": "markdown",
13276
+ "value": "Visual density, matching `<lr-chip>`'s `2xs`–`xl` size scale. `m` preserves the original\nbadge dimensions.\n\nType: `BadgeSize` \nDefault: `'m'`"
13277
+ }
13278
+ },
12984
13279
  {
12985
13280
  "name": "variant",
12986
13281
  "description": {
@@ -12994,9 +13289,16 @@
12994
13289
  "name": "lr-task-list",
12995
13290
  "description": {
12996
13291
  "kind": "markdown",
12997
- "value": "`<lr-task-list>` — a live, collapsible tracker for an agent's plan: ordered steps with\nper-step lifecycle status and one level of nested sub-steps, embedded in the transcript.\n`items` is controlled and never mutated by this component, mirroring `<lr-stepper>`'s `steps`\ncontract -- but unlike stepper's single-`current` navigation control, task-list is a read-only\nstatus report: several steps may be `running` at once, there is no selection, and status changes\nare announced through an internal `<lr-live-region>`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `detail-<id>` | Dynamic, one per item id (e.g. `slot=\"detail-step-3\"`). Rich detail under that item's label, after its `detail` text -- typically a `<lr-tool-call-chip>` or file `<lr-chip>`. Plain-HTML friendly, no render props. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer container. |\n| `body` | The list of items, `hidden` while collapsed. |\n| `header` | The clickable header (a `<button>` when `collapsible`, a plain heading otherwise). |\n| `item` | One item row (`role=\"listitem\"`); carries `data-status`, `data-id`, `data-depth` (`\"0\"` for a top-level item, `\"1\"` for a child). |\n| `item-children` | The nested `role=\"list\"` wrapper around a top-level item's children. |\n| `item-detail` | The item's optional `detail` text. |\n| `item-label` | The item's `label` text. |\n| `label` | The `label` text. |\n| `status-icon` | The per-item status glyph. |\n| `summary` | The visible \"N of M completed\" summary, counting only top-level items. |\n| `toggle` | The chevron indicator inside the header. Only rendered when `collapsible`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-task-list-spin` (default: `1s linear`) — Running-status icon spin animation duration/timing."
13292
+ "value": "`<lr-task-list>` — a live, collapsible tracker for an agent's plan: ordered steps with\nper-step lifecycle status and one level of nested sub-steps, embedded in the transcript.\n`items` is controlled and never mutated by this component, mirroring `<lr-stepper>`'s `steps`\ncontract -- but unlike stepper's single-`current` navigation control, task-list is a read-only\nstatus report: several steps may be `running` at once, there is no selection, and status changes\nare announced through an internal `<lr-live-region>`.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `detail-<id>` | Dynamic, one per item id (e.g. `slot=\"detail-step-3\"`). Rich detail under that item's label, after its `detail` text -- typically a `<lr-tool-call-chip>` or file `<lr-chip>`. Plain-HTML friendly, no render props. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer container. |\n| `body` | The list of items, `hidden` while collapsed. |\n| `header` | The clickable header (a `<button>` when `collapsible`, a plain heading otherwise). |\n| `item` | One item row (`role=\"listitem\"`); carries `data-status`, `data-id`, `data-depth` (`\"0\"` for a top-level item, `\"1\"` for a child). |\n| `item-children` | The nested `role=\"list\"` wrapper around a top-level item's children. |\n| `item-detail` | The item's optional `detail` text. |\n| `item-label` | The item's `label` text. |\n| `label` | The `label` text. |\n| `status-icon` | The per-item status glyph. |\n| `summary` | The visible \"N of M completed\" summary, counting only top-level items. |\n| `toggle` | The chevron indicator inside the header. Only rendered when `collapsible`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-task-list-spin` (default: `1s linear`) — Running-status icon spin animation duration/timing.\n- `--lr-task-list-compact-header-padding` (default: `var(--lr-space-2xs) var(--lr-space-s)`) — `[part=\"header\"]` padding while `compact`.\n- `--lr-task-list-compact-gap` (default: `var(--lr-space-2xs)`) — Gap between `[part=\"body\"]`'s item rows while `compact`.\n- `--lr-task-list-compact-body-padding` (default: `var(--lr-space-2xs) var(--lr-space-s) var(--lr-space-s)`) — `[part=\"body\"]` padding while `compact`."
12998
13293
  },
12999
13294
  "attributes": [
13295
+ {
13296
+ "name": "appearance",
13297
+ "description": {
13298
+ "kind": "markdown",
13299
+ "value": "Visual chrome, mirroring `lr-card`'s `appearance` vocabulary. `'card'` (the default) keeps the\nbordered, filled box. `'plain'` removes `[part=\"base\"]`'s border, background, and corner\nradius, so a list embedded in the transcript inside a frame that already draws a border (an\nagent-run panel, a message bubble) doesn't double it.\n\nType: `TaskListAppearance` \nDefault: `'card'`"
13300
+ }
13301
+ },
13000
13302
  {
13001
13303
  "name": "collapsible",
13002
13304
  "description": {
@@ -13004,6 +13306,13 @@
13004
13306
  "value": "When `false`, the header renders as a static heading (no button, no toggle affordance) and\n`expanded` can still be set programmatically by the host, just not toggled via the UI.\n\nType: `boolean` \nDefault: `true`"
13005
13307
  }
13006
13308
  },
13309
+ {
13310
+ "name": "compact",
13311
+ "description": {
13312
+ "kind": "markdown",
13313
+ "value": "Tighter header/body padding and item gap for dense contexts (a plan tracker nested in an\nalready-padded transcript row) -- same convention as `lr-agent-run`/`lr-source-card`'s\n`compact`. Defaults to `false`, i.e. the full padding. Purely a density knob: the border and\nbackground stay, so use `appearance=\"plain\"` instead to drop the chrome entirely.\n\nType: `boolean` \nDefault: `false`"
13314
+ }
13315
+ },
13007
13316
  {
13008
13317
  "name": "expanded",
13009
13318
  "description": {
@@ -13031,7 +13340,7 @@
13031
13340
  "name": "lr-terminal",
13032
13341
  "description": {
13033
13342
  "kind": "markdown",
13034
- "value": "`<lr-terminal>` — read-only ANSI console for streamed agent/tool output. Not a PTY: no\nstdin/keystroke handling, no cursor-addressed full-screen apps.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `announcer` | The visually-hidden `role=\"status\"` region used when `announce-output` is set. |\n| `base` | The outer container. |\n| `copy-button` | The copy-to-clipboard button. |\n| `download-button` | The download button. |\n| `jump-to-latest` | The pill shown while `follow` is disengaged and new output has arrived. |\n| `line` | One rendered line; carries `data-line-number`, `data-match`, `data-highlight-tone`. Rendered through `<lr-virtual-list>`'s `renderItem`, so it lives inside that element's own shadow root rather than this component's -- this component's own stylesheet reaches it via `lr-virtual-list::part(line)`, one hop of the standard CSS Shadow Parts selector. |\n| `toolbar` | The header row, only rendered when copy/download are enabled. |\n| `viewport` | The `role=\"log\"` scrollable region wrapping the virtualized line list. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-terminal-height` (default: `var(--lr-size-20rem)`) — Block size of `[part=\"viewport\"]`, the scrollable log region. Not declared on `:host`, so it is inherited — set it on the host or any ancestor."
13343
+ "value": "`<lr-terminal>` — read-only ANSI console for streamed agent/tool output. Not a PTY: no\nstdin/keystroke handling, no cursor-addressed full-screen apps.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `announcer` | The visually-hidden `role=\"status\"` region used when `announce-output` is set. |\n| `base` | The outer container. |\n| `copy-button` | The copy-to-clipboard button. |\n| `download-button` | The download button. |\n| `jump-to-latest` | The pill shown while `follow` is disengaged and new output has arrived. |\n| `line` | One rendered line; carries `data-line-number`, `data-match`, `data-highlight-tone`. Rendered through `<lr-virtual-list>`'s `renderItem`, so it lives inside that element's own shadow root rather than this component's -- this component's own stylesheet reaches it via `lr-virtual-list::part(line)`, one hop of the standard CSS Shadow Parts selector. |\n| `toolbar` | The header row, only rendered when copy/download are enabled. |\n| `viewport` | The `role=\"log\"` scrollable region wrapping the virtualized line list. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-terminal-height` (default: `var(--lr-size-20rem)`) — Block size of `[part=\"viewport\"]`, the scrollable log region. Not declared on `:host`, so it is inherited — set it on the host or any ancestor.\n- `--lr-terminal-highlight-accent-bg` (default: `var(--lr-color-brand-quiet)`) — Background of an `accent`-tone highlighted line. Decoupled from the shared `--lr-color-brand-quiet` token also used by `[part=\"copy-button\"]`/`[part=\"download-button\"]`'s hover state, and from any `::part('line')` override (the background is applied inline, so a stylesheet rule can't beat it without `!important`).\n- `--lr-terminal-highlight-success-bg` (default: `var(--lr-color-success-quiet)`) — Background of a `success`-tone highlighted line.\n- `--lr-terminal-highlight-warning-bg` (default: `var(--lr-color-warning-quiet)`) — Background of a `warning`-tone highlighted line.\n- `--lr-terminal-highlight-danger-bg` (default: `var(--lr-color-danger-quiet)`) — Background of a `danger`-tone highlighted line.\n- `--lr-terminal-highlight-neutral-bg` (default: `var(--lr-color-surface)`) — Background of a `neutral`-tone highlighted line."
13035
13344
  },
13036
13345
  "attributes": [
13037
13346
  {
@@ -13110,7 +13419,7 @@
13110
13419
  "name": "lr-test-results",
13111
13420
  "description": {
13112
13421
  "kind": "markdown",
13113
- "value": "`<lr-test-results>` — a pass/fail suite summary with per-status counts, status filter\ntoggles, and per-test rows whose failures auto-expand by default and can host rich slotted\ndetail (e.g. a diff or code block) alongside the plain failure message.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `detail-{testId}` | Rich failure detail for that test, rendered after its plain message text once the row is expanded. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |\n| `count` | One status count; carries `data-status`. |\n| `failure` | The failure-detail wrapper; hidden while collapsed. |\n| `failure-message` | The failure's plain message text. |\n| `filter` | The filter-toggle row. |\n| `filter-toggle` | One status filter toggle; carries `data-status` and `aria-pressed`. |\n| `suite` | One suite section. |\n| `suite-header` | The suite's name row. |\n| `summary` | The status-count strip. |\n| `test` | One test row; carries `data-status`. |\n| `test-duration` | The duration text. |\n| `test-expand-toggle` | The expand/collapse button for a row's failure detail. Rendered for any failed test, or any test with slotted `detail-{testId}` content. |\n| `test-name` | The activatable test-name button. |\n| `test-status` | The status glyph and its visible status-word text; carries `data-status`. |"
13422
+ "value": "`<lr-test-results>` — a pass/fail suite summary with per-status counts, status filter\ntoggles, and per-test rows whose failures auto-expand by default and can host rich slotted\ndetail (e.g. a diff or code block) alongside the plain failure message.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `detail-{testId}` | Rich failure detail for that test, rendered after its plain message text once the row is expanded. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper; carries `role=\"group\"`. Its `aria-label` defaults to the localized \"Test results\", but a host `aria-label` on `<lr-test-results>` itself wins over that default. |\n| `count` | One status count; carries `data-status`. |\n| `failure` | The failure-detail wrapper; hidden while collapsed. |\n| `failure-message` | The failure's plain message text. |\n| `filter` | The filter-toggle row. |\n| `filter-toggle` | One status filter toggle; carries `data-status` and `aria-pressed`. |\n| `suite` | One suite section. |\n| `suite-header` | The suite's name row. |\n| `summary` | The status-count strip. |\n| `test` | One test row; carries `data-status`. |\n| `test-duration` | The duration text. |\n| `test-expand-toggle` | The expand/collapse button for a row's failure detail. Rendered for any failed test, or any test with slotted `detail-{testId}` content. |\n| `test-name` | The activatable test-name button. |\n| `test-status` | The status glyph and its visible status-word text; carries `data-status`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-test-results-filter-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of a pressed (active) status filter toggle.\n- `--lr-test-results-filter-active-border` (default: `var(--lr-color-brand)`) — Border color of a pressed (active) status filter toggle.\n- `--lr-test-results-filter-active-color` (default: `var(--lr-color-brand)`) — Text color of a pressed (active) status filter toggle. Restyling the pressed state otherwise requires overriding the library-wide brand tokens, since `::part(filter-toggle)[aria-pressed]` is invalid CSS."
13114
13423
  },
13115
13424
  "attributes": [
13116
13425
  {
@@ -13291,7 +13600,7 @@
13291
13600
  "name": "lr-thread-list",
13292
13601
  "description": {
13293
13602
  "kind": "markdown",
13294
- "value": "`<lr-thread-list>` — the conversation sidebar: a grouped, searchable list of chat sessions with\npin/archive/delete/rename affordances. *Data mode* (non-empty `threads`, or empty `threads` with\nnothing slotted) renders every row as a `<lr-conversation-item>` inside an internal\n`<lr-virtual-list>` — virtualized by construction, scroll position and per-row state survive a\n`threads` replacement; zero rows renders the built-in empty state. *Slotted mode* (empty `threads`\n*and* real slotted content) renders host-supplied `<lr-conversation-item>`s from the default slot\nas-is: no grouping, virtualization, or row actions in that mode — those are data-mode-only by design\n(shadow DOM cannot inject group headers between slotted children).\n\nNo thread CRUD or persistence: every mutation (`lr-thread-pin`/`-archive`/`-delete`/`-rename`) is\na controlled event carrying the *requested* new state — the host mutates `threads`.\n\nData mode: a host needing content with no home in `lr-conversation-item`'s own\n`title`/`excerpt`/`meta`/`actions` surface sets `wrapRow` to wrap the already-built row. For\ncommon row composition, `renderLeading`, `renderMeta`, and `renderRowContent` provide focused\nvirtualized render hooks. A host needing a fully custom\n`actions` surface itself — beyond `rowActions`'s closed `pin | archive | delete` set, e.g. a\n`<lr-menu>` with Rename/Delete — sets `renderActions` instead; its content is appended after any\nbuilt-in `rowActions` output in the same slot, and `wrapRow` continues to compose around the result.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Slotted mode only: host-supplied `lr-conversation-item`s, rendered in order. Each top-level assigned element that doesn't already carry an explicit `role` is given `role=\"listitem\"`, since `[part=\"list\"]` is `role=\"list\"` in this mode and `lr-conversation-item` deliberately doesn't self-apply that role (see its own class doc). |\n| `empty` | Replaces the built-in empty state. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root. |\n| `empty` | The empty/no-matches state. |\n| `group-header` | A date/custom group header in data mode. |\n| `group-icon` | The decorative expand/collapse glyph. |\n| `group-label` | The group label inside `group-toggle`. |\n| `group-toggle` | The controlled group expand/collapse button. |\n| `list` | The list region. |\n| `pin-glyph` | The small pin indicator shown in a pinned row's `meta` slot (data mode). |\n| `row` | Exported from the internal `lr-virtual-list`'s `row` part (data mode). |\n| `row-action` | A built-in pin/archive/delete icon button (data mode, when `rowActions` includes it). |\n| `row-actions` | The wrapper around built-in and `renderActions` output. |\n| `row-content` | The wrapper around `renderRowContent` output. |\n| `row-leading` | The wrapper around `renderLeading` output. |\n| `row-meta` | A wrapper around built-in or `renderMeta` metadata. |\n| `search` | The search field wrapper. |\n| `search-input` | The `<input type=\"search\">`. |\n| `viewport` | The real scroll container, exported from the internal `lr-virtual-list`. |"
13603
+ "value": "`<lr-thread-list>` — the conversation sidebar: a grouped, searchable list of chat sessions with\npin/archive/delete/rename affordances. *Data mode* (non-empty `threads`, or empty `threads` with\nnothing slotted) renders every row as a `<lr-conversation-item>` inside an internal\n`<lr-virtual-list>` — virtualized by construction, scroll position and per-row state survive a\n`threads` replacement; zero rows renders the built-in empty state. *Slotted mode* (empty `threads`\n*and* real slotted content) renders host-supplied `<lr-conversation-item>`s from the default slot\nas-is: no grouping, virtualization, or row actions in that mode — those are data-mode-only by design\n(shadow DOM cannot inject group headers between slotted children).\n\nNo thread CRUD or persistence: every mutation (`lr-thread-pin`/`-archive`/`-delete`/`-rename`) is\na controlled event carrying the *requested* new state — the host mutates `threads`.\n\nData mode: a host needing content with no home in `lr-conversation-item`'s own\n`title`/`excerpt`/`meta`/`actions` surface sets `wrapRow` to wrap the already-built row. For\ncommon row composition, `renderLeading`, `renderMeta`, and `renderRowContent` provide focused\nvirtualized render hooks. A host needing a fully custom\n`actions` surface itself — beyond `rowActions`'s closed `pin | archive | delete` set, e.g. a\n`<lr-menu>` with Rename/Delete — sets `renderActions` instead; its content is appended after any\nbuilt-in `rowActions` output in the same slot, and `wrapRow` continues to compose around the result.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Slotted mode only: host-supplied `lr-conversation-item`s, rendered in order. Each top-level assigned element that doesn't already carry an explicit `role` is given `role=\"listitem\"`, since `[part=\"list\"]` is `role=\"list\"` in this mode and `lr-conversation-item` deliberately doesn't self-apply that role (see its own class doc). |\n| `empty` | Replaces the built-in empty state. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root. |\n| `empty` | The empty/no-matches state. |\n| `group-header` | A date/custom group header in data mode. |\n| `group-icon` | The decorative expand/collapse glyph. |\n| `group-label` | The group label inside `group-toggle`. |\n| `group-sticky` | `sticky-groups` only: the pinned copy of the current group's header, exported from the internal `lr-virtual-list`'s sticky layer. It wraps a full copy of the `group-header`/`group-toggle`/`group-label`/`group-icon` markup (which therefore styles both the real header row and the pinned copy), and carries `aria-hidden` — style it for the pinned band itself, e.g. a shadow or a border under the band. |\n| `group-toggle` | The controlled group expand/collapse button. |\n| `list` | The list region. |\n| `pin-glyph` | The small pin indicator shown in a pinned row's `meta` slot (data mode). |\n| `row` | Exported from the internal `lr-virtual-list`'s `row` part (data mode). |\n| `row-action` | A built-in pin/archive/delete icon button (data mode, when `rowActions` includes it). |\n| `row-actions` | The wrapper around built-in and `renderActions` output. |\n| `row-content` | The wrapper around `renderRowContent` output. |\n| `row-item-actions` | Data mode: the row item's `actions` wrapper. |\n| `row-item-base` | Data mode: the row `<lr-conversation-item>`'s own `base` part — the box whose padding sets row height. `row-item-*` parts are the item's *internals*; the `row-*` parts above wrap this component's own callback output and are a different surface. Styling row density here replaces the older `::part(row) { --lr-theme-*: … }` workaround, which retheme'd the whole row subtree (`renderActions` popups included). |\n| `row-item-content` | Data mode: the row item's title/excerpt content column. |\n| `row-item-excerpt` | Data mode: the row item's excerpt line. |\n| `row-item-leading` | Data mode: the row item's `leading` wrapper. |\n| `row-item-meta` | Data mode: the row item's `meta` wrapper. |\n| `row-item-option` | Data mode: the row item's selectable `option` region. |\n| `row-item-rename-button` | Data mode: the row item's pencil/rename affordance. |\n| `row-item-timestamp` | Data mode: the row item's `<time>` element. |\n| `row-item-title` | Data mode: the row item's title text. |\n| `row-item-title-input` | Data mode: the row item's in-place rename `<input>`. |\n| `row-leading` | The wrapper around `renderLeading` output. |\n| `row-meta` | A wrapper around built-in or `renderMeta` metadata. |\n| `row-wrapper` | The wrapper around `wrapRow` output (data mode, only when `wrapRow` is set). Row-only: group headers are never passed through `wrapRow`, so they never carry it. |\n| `search` | The search field wrapper. |\n| `search-input` | The `<input type=\"search\">`. |\n| `viewport` | The real scroll container, exported from the internal `lr-virtual-list`. It fills this component's height with no consumer CSS (and falls back to `lr-virtual-list`'s own 24rem `--lr-virtual-list-height` default when the container has no resolvable height). |"
13295
13604
  },
13296
13605
  "attributes": [
13297
13606
  {
@@ -13301,6 +13610,13 @@
13301
13610
  "value": "Data mode: marks the matching row `active`/`aria-current` and scrolls it into view.\n\nType: `string` \nDefault: `''`"
13302
13611
  }
13303
13612
  },
13613
+ {
13614
+ "name": "compact",
13615
+ "description": {
13616
+ "kind": "markdown",
13617
+ "value": "Data mode only: forwarded to every row `<lr-conversation-item>`'s own `compact`, tightening\neach row's padding and gaps in one place. Slotted mode is a deliberate no-op — this component\nrenders host-supplied items as-is, so the host sets `compact` on its own items there, the same\ndivision of responsibility slotted mode already has for every other row property.\n\nType: `boolean` \nDefault: `false`"
13618
+ }
13619
+ },
13304
13620
  {
13305
13621
  "name": "editable",
13306
13622
  "description": {
@@ -13353,6 +13669,13 @@
13353
13669
  "kind": "markdown",
13354
13670
  "value": "Data mode: include `archived` threads (in their own trailing group under `grouping=\"date\"`).\n\nType: `boolean` \nDefault: `false`"
13355
13671
  }
13672
+ },
13673
+ {
13674
+ "name": "sticky-groups",
13675
+ "description": {
13676
+ "kind": "markdown",
13677
+ "value": "Data mode only: pins the current date/custom group's header to the top of the scroll viewport\nwhile its rows are in view, pushing it off as the next group's header arrives. Group headers\nare ordinary virtualized rows, so this renders a `aria-hidden` copy of the header into\n`lr-virtual-list`'s sticky layer (`[part=\"group-sticky\"]`) — the real row keeps the\n`role=\"heading\"` semantics and the tab order, and the copy stays clickable so the pinned\ntoggle still requests a collapse. Default `false` leaves rendering exactly as it is without\nthis feature; `grouping=\"none\"` has no headers to pin, so it is a no-op there.\n\nType: `boolean` \nDefault: `false`"
13678
+ }
13356
13679
  }
13357
13680
  ]
13358
13681
  },
@@ -13360,7 +13683,7 @@
13360
13683
  "name": "lr-time-input",
13361
13684
  "description": {
13362
13685
  "kind": "markdown",
13363
- "value": "`<lr-time-input>` — a native time-input alias with Lyra form chrome and events.\n\nAdds no API of its own beyond re-typing the inherited `min`/`max` bounds for time values; every\nother property, event, slot and part is `<lr-input>`'s.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `end` | Adornment after the native input and built-in actions. |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n| `start` | Adornment before the native input. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `clear-button` | The clear action, rendered for non-empty clearable text/search inputs. |\n| `end` | Wrapper around the `end` adornment slot. |\n| `error` | The error message. |\n| `form-control` | The outer wrapper around label, input, error and hint. |\n| `form-control-label` | The `<label>` element. |\n| `hint` | The hint message. |\n| `input` | The native `<input>` element. |\n| `input-wrapper` | The row wrapping the native input and the password-toggle button. |\n| `password-toggle` | The show/hide-password button, present only when `type=\"password\"`. |\n| `start` | Wrapper around the `start` adornment slot. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-input-control-min-height` — Outer control height floor, scaled by `size`.\n- `--lr-input-padding-block` — Block padding of the native input, scaled by `size`.\n- `--lr-input-padding-inline` — Inline padding of the control row, scaled by `size`.\n- `--lr-input-font-size` — Font size of the native input, scaled by `size`."
13686
+ "value": "`<lr-time-input>` — a native time-input alias with Lyra form chrome and events.\n\nAdds no API of its own beyond re-typing the inherited `min`/`max` bounds for time values; every\nother property, event, slot and part is `<lr-input>`'s.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `end` | Adornment after the native input and built-in actions. |\n| `error` | Custom error content. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n| `start` | Adornment before the native input. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `clear-button` | The clear action, rendered for non-empty clearable text/search inputs. |\n| `end` | Wrapper around the `end` adornment slot. |\n| `error` | The error message. |\n| `form-control` | The outer wrapper around label, input, error and hint. |\n| `form-control-label` | The `<label>` element. |\n| `hint` | The hint message. |\n| `input` | The native `<input>` element. |\n| `input-wrapper` | The row wrapping the native input and the password-toggle button. |\n| `password-toggle` | The show/hide-password button, present only when `type=\"password\"`. |\n| `start` | Wrapper around the `start` adornment slot. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-input-control-min-height` — Outer control height floor, scaled by `size`.\n- `--lr-input-control-height` — Exact outer control height. Unset by default, which leaves `--lr-input-control-min-height` as a floor only; set it to a length to both floor and cap the control row (e.g. to pixel-match `<lr-select>`/`<lr-combobox>` in the same toolbar). Because it is never declared by the component itself, it can be set from an ancestor or an outer-tree rule as well as inline on the element.\n- `--lr-input-padding-block` — Block padding of the native input, scaled by `size`.\n- `--lr-input-padding-inline` — Inline padding of the control row, scaled by `size`.\n- `--lr-input-font-size` — Font size of the native input, scaled by `size`."
13364
13687
  },
13365
13688
  "attributes": [
13366
13689
  {
@@ -13509,7 +13832,7 @@
13509
13832
  "name": "lr-time-range",
13510
13833
  "description": {
13511
13834
  "kind": "markdown",
13512
- "value": "`<lr-time-range>` — a two-handle brush/scrubber over a numeric domain.\nCallers map their own time axis to `[min, max]`; no date logic lives here\n(matches the no-date-library constraint used elsewhere in this library).\n\nOptionally paired with a row of discrete presets (`presets`) — e.g. \"Last\n7 days\" / \"Last 30 days\" — rendered above the track; picking one is just a\nshortcut that sets both handles at once, the continuous brush underneath\nis unaffected and both interaction modes coexist.\n\nForm-associated only for the `<fieldset disabled>` cascade, not for a\nsubmitted value: it attaches `ElementInternals` (like `<lr-combobox>`'s\nminimal pattern, rather than the single-string-value `FormAssociated`\nmixin, which doesn't fit a two-handle range) purely so an ancestor\n`<fieldset disabled>` disables both handles and every preset button\nthrough `effectiveDisabled`, the same way it would a native `<input>`,\nwithout touching the consumer-facing `disabled` property/attribute itself.\nUnlike `<lr-combobox>`, it never calls `internals.setFormValue()` and\nhas no `name` — the selected range is not included in the owning form's\n`FormData` on submit; read `start`/`end` directly (e.g. from `lr-change`)\ninstead of relying on native form submission.\n\nDeliberately no label/hint/error chrome -- `startLabel`/`endLabel` here are per-handle\naccessible-name overrides, not visible label text, the same carve-out `<lr-slider>` states for\nits own single-handle `label`; a labeled-field consumer wraps this element in their own layout.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The time-range wrapper. |\n| `handle-end` | The end handle. |\n| `handle-start` | The start handle. |\n| `preset-button` | A preset button. |\n| `presets` | The preset controls wrapper. |\n| `range` | The selected range. |\n| `track` | The complete range track. |"
13835
+ "value": "`<lr-time-range>` — a two-handle brush/scrubber over a numeric domain.\nCallers map their own time axis to `[min, max]`; no date logic lives here\n(matches the no-date-library constraint used elsewhere in this library).\n\nOptionally paired with a row of discrete presets (`presets`) — e.g. \"Last\n7 days\" / \"Last 30 days\" — rendered above the track; picking one is just a\nshortcut that sets both handles at once, the continuous brush underneath\nis unaffected and both interaction modes coexist.\n\nForm-associated only for the `<fieldset disabled>` cascade, not for a\nsubmitted value: it attaches `ElementInternals` (like `<lr-combobox>`'s\nminimal pattern, rather than the single-string-value `FormAssociated`\nmixin, which doesn't fit a two-handle range) purely so an ancestor\n`<fieldset disabled>` disables both handles and every preset button\nthrough `effectiveDisabled`, the same way it would a native `<input>`,\nwithout touching the consumer-facing `disabled` property/attribute itself.\nUnlike `<lr-combobox>`, it never calls `internals.setFormValue()` and\nhas no `name` — the selected range is not included in the owning form's\n`FormData` on submit; read `start`/`end` directly (e.g. from `lr-change`)\ninstead of relying on native form submission.\n\nDeliberately no label/hint/error chrome -- `startLabel`/`endLabel` here are per-handle\naccessible-name overrides, not visible label text, the same carve-out `<lr-slider>` states for\nits own single-handle `label`; a labeled-field consumer wraps this element in their own layout.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The time-range wrapper. |\n| `handle-end` | The end handle. |\n| `handle-start` | The start handle. |\n| `preset-button` | A preset button. |\n| `presets` | The preset controls wrapper. |\n| `range` | The selected range. |\n| `track` | The complete range track. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-time-range-preset-active-bg` (default: `var(--lr-color-brand)`) — Background of the active preset button (`[data-active]`, i.e. the preset whose range matches the current value). Declared as an inline `var()` fallback (never on `:host`), so setting it on the element or an ancestor recolors only the active preset without hijacking the library-wide `--lr-color-brand` token.\n- `--lr-time-range-preset-active-border-color` (default: `var(--lr-color-brand)`) — Border color of the active preset button.\n- `--lr-time-range-preset-active-color` (default: `var(--lr-color-on-brand)`) — Text color of the active preset button."
13513
13836
  },
13514
13837
  "attributes": [
13515
13838
  {
@@ -13581,7 +13904,7 @@
13581
13904
  "name": "lr-timeline",
13582
13905
  "description": {
13583
13906
  "kind": "markdown",
13584
- "value": "`<lr-timeline>` — an ordered, connected sequence of past-event rows (an audit trail, an agent\naction history, a changelog) composed from `<lr-timeline-item>` light-DOM children, joined by a\ncontinuous connecting rail. First-party invention: no Web Awesome/Shoelace counterpart exists, so\nthis follows the library's own established conventions rather than mirroring an upstream API.\n\nA pure, read-only, declarative display component — same zero-event shape as `<lr-badge>`/\n`<lr-avatar>`/`<lr-skeleton>`. It never mutates its own children and fires no events; a\nconsumer who needs to react to item count changes already owns the mutation (they're the one\nadding/removing `<lr-timeline-item>` children) and can listen to the native `slotchange` event\ndirectly if truly needed.\n\nNo keyboard navigation, roving-tabindex, or selection model of any kind — a deliberate scope\ndecision, not an oversight. A timeline is a passive record display, not a navigable widget; see\n`<lr-timeline-item>`'s class doc for the full reasoning behind dropping an earlier\n\"interactive row\" design. Not a form-associated control — no value to submit, no label/hint/error\nchrome.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-timeline-item>` children, in display order. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. `role=\"list\"` lives here directly (a timeline isn't a navigation landmark, so it doesn't need a two-layer `base`+`list` split). Flex container: `flex-direction: column` in `vertical` orientation (the default), `flex-direction: row` (with `overflow-x: auto`) in `horizontal` orientation. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-timeline-gap` (default: `var(--lr-space-l)`) — Spacing between consecutive items along the timeline's main axis; also the length each item's own rail visually bridges to reach the next item's marker. Declared here but actually consumed inside each `<lr-timeline-item>`'s own stylesheet, via ordinary CSS custom-property inheritance across the slot boundary."
13907
+ "value": "`<lr-timeline>` — an ordered, connected sequence of past-event rows (an audit trail, an agent\naction history, a changelog) composed from `<lr-timeline-item>` light-DOM children, joined by a\ncontinuous connecting rail. First-party invention: no Web Awesome/Shoelace counterpart exists, so\nthis follows the library's own established conventions rather than mirroring an upstream API.\n\nA pure, read-only, declarative display component — same zero-event shape as `<lr-badge>`/\n`<lr-avatar>`/`<lr-skeleton>`. It never mutates its own children and fires no events; a\nconsumer who needs to react to item count changes already owns the mutation (they're the one\nadding/removing `<lr-timeline-item>` children) and can listen to the native `slotchange` event\ndirectly if truly needed.\n\nNo keyboard navigation, roving-tabindex, or selection model of any kind — a deliberate scope\ndecision, not an oversight. A timeline is a passive record display, not a navigable widget; see\n`<lr-timeline-item>`'s class doc for the full reasoning behind dropping an earlier\n\"interactive row\" design. Not a form-associated control — no value to submit, no label/hint/error\nchrome.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-timeline-item>` children, in display order. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. `role=\"list\"` lives here directly (a timeline isn't a navigation landmark, so it doesn't need a two-layer `base`+`list` split). Flex container: `flex-direction: column` in `vertical` orientation (the default), `flex-direction: row` (with `overflow-x: auto`, `overflow-y: hidden`, and a static edge-fade `mask-image`) in `horizontal` orientation. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-timeline-gap` (default: `var(--lr-space-l)`) — Spacing between consecutive items along the timeline's main axis; also the length each item's own rail visually bridges to reach the next item's marker. Declared here but actually consumed inside each `<lr-timeline-item>`'s own stylesheet, via ordinary CSS custom-property inheritance across the slot boundary."
13585
13908
  },
13586
13909
  "attributes": [
13587
13910
  {
@@ -13715,7 +14038,7 @@
13715
14038
  "name": "lr-token-input",
13716
14039
  "description": {
13717
14040
  "kind": "markdown",
13718
- "value": "`<lr-token-input>` — an editable, form-associated list of removable tokens.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `error` | Validation message. |\n| `hint` | Supporting text. |\n| `label` | Visible label content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `error` | Validation message. |\n| `form-control` | Outer control wrapper. |\n| `form-control-label` | Label. |\n| `hint` | Supporting text. |\n| `input` | Native text input. |\n| `input-wrapper` | Token and input row. |\n| `remove` | Token remove button. |\n| `token` | Individual token. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-token-input-input-inline-size` (default: `var(--lr-size-8rem)`) — `flex-basis` of the native text input within the token row.\n- `--lr-token-input-min-input-inline-size` (default: `var(--lr-size-4rem)`) — Inline-size floor of the native text input, so it stays usable once tokens wrap."
14041
+ "value": "`<lr-token-input>` — an editable, form-associated list of removable tokens.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `error` | Validation message. |\n| `hint` | Supporting text. |\n| `label` | Visible label content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `error` | Validation message. |\n| `form-control` | Outer control wrapper. |\n| `form-control-label` | Label. |\n| `hint` | Supporting text. |\n| `input` | Native text input. |\n| `input-wrapper` | Token and input row. |\n| `remove` | Token remove button. |\n| `token` | Individual token. |\n| `token-editor` | The inline text field replacing a token's text while it is being edited. Rendered only while `editable` is set and that token is open for editing. |\n| `token-label` | The token's text, as the roving-focus edit trigger. Rendered only while `editable` is set. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-token-input-input-inline-size` (default: `var(--lr-size-8rem)`) — `flex-basis` of the native text input within the token row.\n- `--lr-token-input-min-input-inline-size` (default: `var(--lr-size-4rem)`) — Inline-size floor of the native text input, so it stays usable once tokens wrap.\n- `--lr-token-input-editor-inline-size` (default: `var(--lr-size-6rem)`) — Inline size of the inline token editor opened by `editable`."
13719
14042
  },
13720
14043
  "attributes": [
13721
14044
  {
@@ -13736,7 +14059,7 @@
13736
14059
  "name": "delimiter",
13737
14060
  "description": {
13738
14061
  "kind": "markdown",
13739
- "value": "Type: `string` \nDefault: `','`"
14062
+ "value": "Character(s) that split a typed draft into several tokens, and (when a single character) the\nkeystroke that commits the draft. `null` — from the property, or from `delimiter=\"none\"` /\n`delimiter=\"\"` — disables both, so a token may contain the delimiter verbatim. Defaults to `,`.\n\nType: `string | null` \nDefault: `','`"
13740
14063
  }
13741
14064
  },
13742
14065
  {
@@ -13746,6 +14069,13 @@
13746
14069
  "value": "Type: `boolean`"
13747
14070
  }
13748
14071
  },
14072
+ {
14073
+ "name": "editable",
14074
+ "description": {
14075
+ "kind": "markdown",
14076
+ "value": "Allow editing an existing token in place: each token becomes a roving tab stop that opens an\ninline editor on click, Enter, or F2. Defaults to `false`, in which case the token row renders\nexactly as it does without this feature and stays non-focusable.\n\nType: `boolean` \nDefault: `false`"
14077
+ }
14078
+ },
13749
14079
  {
13750
14080
  "name": "error-text",
13751
14081
  "description": {
@@ -13804,6 +14134,13 @@
13804
14134
  "value": "`<lr-tool-approval-dialog>` — a human-in-the-loop gate: presents one\nproposed tool/function call (`toolName` + `args`) and blocks an agent from\nexecuting it until a person explicitly approves or denies it, with an\noptional inline \"edit the arguments before approving\" step.\n\nThis renders its own dialog panel rather than nesting a `<lr-dialog>` in\nits shadow template. Shared overlay infrastructure coordinates stacking,\nfocus trapping, Escape/backdrop dismissal, and focus return with every\nother overlay in the same document.\n\nApprove/Deny/Edit are built-in chrome (not a `footer` slot a consumer must\nassemble) — this component's interaction shape is fixed enough (there is\nexactly one correct set of actions for \"approve this call\") that requiring\nevery consumer to re-build it would just be boilerplate. A `footer` slot is\nstill offered for *supplementary* content a consumer wants alongside those\nbuttons (e.g. a \"remember this choice for this tool\" checkbox) — its\ncontent renders to the start of the action row, before Deny/Edit/Approve.\n\nEditing: while `editable`, an Edit button swaps the read-only\n`<lr-json-viewer>` for a plain `<textarea>` pre-filled with\n`JSON.stringify(args, null, 2)`. Every keystroke is re-validated with\n`JSON.parse` — the Approve button is `disabled` for as long as the current\ntextarea content fails to parse, so a malformed edit can never be silently\napproved as either the broken text or a stale copy of the original args.\nThe editor defaults to `spellcheck=\"false\"`, `autocapitalize=\"off\"`,\n`autocorrect=\"off\"`, and `autocomplete=\"off\"` because its content is raw\nJSON, never prose. The corresponding native editing properties remain\nconfigurable for integrations that need different browser behavior.\nThe same button relabels to \"Cancel\" while editing; clicking it discards\nthe draft entirely and returns to the read-only view of the *original*\n`args` — there is no separate \"save\" step independent of Approve itself.\nBoth `editing` and any in-progress draft reset back to the read-only view\nevery time the dialog transitions from closed to open, so a reused\ninstance never leaks one proposal's half-finished edit into the next.\n`editable` flipping to `false` mid-edit does the same (see `willUpdate()`)\nand, if the textarea it unmounts still held focus, `updated()` refocuses\nDeny so the focus trap keeps engaging instead of silently letting focus\nfall through to the document.\n\nInitial focus deliberately does *not* land on Approve:\napproving a tool call is a consequential, potentially irreversible action,\nso a user who opens this dialog and reflexively presses Enter/Space before\nreading anything should deny, not approve. Deny gets the initial focus\ninstead — the same \"focus the safe action\" convention a native destructive-\nconfirmation dialog (delete, discard, etc.) typically follows for its own\nCancel button — rather than the inert dialog panel, which would need an\nextra Tab press before *any* action is reachable at all.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `footer` | Optional supplementary content (e.g. a \"remember this choice\" checkbox), rendered before the built-in Deny/Edit/Approve buttons. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `approve-button` | The built-in Approve button — `disabled` while an in-progress edit is invalid JSON. |\n| `args-editor` | The raw-JSON `<textarea>` shown while editing. |\n| `args-view` | The read-only `<lr-json-viewer>` shown while not editing. |\n| `backdrop` | The full-viewport scrim behind the panel. |\n| `body` | The wrapper around the args view/editor. |\n| `deny-button` | The built-in Deny button. |\n| `edit-button` | The built-in Edit/Cancel toggle button (only rendered while `editable`). |\n| `error` | The inline \"invalid JSON\" message, shown only while editing with unparseable content. |\n| `footer` | The action row wrapping the `footer` slot and the built-in buttons. |\n| `header` | The wrapper around the heading. |\n| `panel` | The dialog panel itself (`role=\"dialog\"` while open). |\n| `tool-name` | The `toolName` text within the heading. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-tool-approval-dialog-overlay-color` (default: `var(--lr-color-overlay)`) — Backdrop scrim color.\n- `--lr-tool-approval-dialog-mono-font` (default: `var(--lr-font-mono)`) — Font family for the tool name and the raw-JSON args editor."
13805
14135
  },
13806
14136
  "attributes": [
14137
+ {
14138
+ "name": "aria-label",
14139
+ "description": {
14140
+ "kind": "markdown",
14141
+ "value": "Overrides the dialog panel's accessible name, taking precedence over the visible heading --\nmirrors `<lr-dialog>`'s/`<lr-tool-result-dialog>`'s/`<lr-tool-select-dialog>`'s own host-\n`aria-label` override pattern. Fed only by a host `aria-label`.\n\nType: `string | null` \nDefault: `null`"
14142
+ }
14143
+ },
13807
14144
  {
13808
14145
  "name": "autocapitalize",
13809
14146
  "description": {
@@ -13952,7 +14289,7 @@
13952
14289
  "name": "lr-tool-param-form",
13953
14290
  "description": {
13954
14291
  "kind": "markdown",
13955
- "value": "`<lr-tool-param-form>` — renders one form control per top-level property\nof a JSON Schema object, for ad hoc tool invocation or approval-editing UIs\n(e.g. \"the agent wants to call `create_event(title, attendees, allDay)` —\nlet the user tweak the arguments before running it\").\n\n**Scope limitation (intentional, not accidental):** this renderer only\nunderstands a *flat* object schema — every `properties` entry must be\n`'string'`, `'number'`, `'integer'`, `'boolean'`, or a string `enum`;\nprimitive `const` is also enforced. Nested objects, arrays,\n`oneOf`/`anyOf`/`allOf`, `$ref`, constraints such as `minLength`/`minimum`,\nand schema-valued `additionalProperties` are not read. A full\nJSON-Schema-to-form renderer is\nout of scope for this component; a property whose `type` isn't one of the\nfour above renders a visible \"Unsupported field type\" note and marks the\nform invalid instead of silently dropping it or throwing.\n\nFields render in `Object.keys(schema.properties)` order (insertion order,\nwhich is reliable for a plain object's string keys). A field's label is\n`title ?? ` the property key; `description` renders as helper text below\nthe control; a key listed in `required` gets a visible `*`. The outer\ncomponent owns validation because JSON Schema `required` means property\npresence, unlike HTML controls' nonempty/must-check semantics.\n\nThis component owns no Submit/Cancel/Approve chrome — a consumer composes\nit inside their own dialog (e.g. a tool-approval dialog) and reads\n`.value`/`.errors`/`checkValidity()` (or calls `reportValidity()` right\nbefore acting, which also reveals any inline errors that user interaction\nhasn't surfaced yet).\n\n`value` is exactly what the consumer last set it to — a field with no\nentry in `value` but a schema `default` displays (and is *emitted*, via\n`lr-input`) as that default, but the `value` *property* itself is left\nalone until the user actually edits that field. This mirrors an\nuncontrolled `<input placeholder>` not writing to `.value`, and means the\nvery first `lr-input` a consumer receives already carries every default\nresolved, so round-tripping `e.detail.value` back into `.value` converges\nafter one edit. JSON Schema defines `default` as an annotation; this form\nrenderer deliberately materializes it before validation and submission,\nso a valid default can satisfy `required` here.\n\nOptional native `<form>` participation is implemented via `ElementInternals`\nattached directly (this component's value is a whole object, not a plain\nstring, so the `FormAssociated` string-value mixin doesn't fit — same\nshape as `<lr-combobox>`'s array-valued case). This is a nice-to-have\nlayered on top of the primary integration contract (`value` +\n`lr-input`/`lr-validity-change`), not a requirement: a consumer that\nnever puts this inside a `<form>` loses nothing.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer wrapper around all fields. |\n| `description` | A field's helper text, from `schema.description`. |\n| `empty` | The message shown when `schema.properties` has no entries. |\n| `error` | A field-level or form-level validation message. |\n| `field` | One property's wrapper (label + control + description + error). |\n| `label` | A field's label. |\n| `unsupported` | The fallback note rendered in place of a control for a property whose `type` is outside this renderer's scope. |"
14292
+ "value": "`<lr-tool-param-form>` — renders one form control per top-level property\nof a JSON Schema object, for ad hoc tool invocation or approval-editing UIs\n(e.g. \"the agent wants to call `create_event(title, attendees, allDay)` —\nlet the user tweak the arguments before running it\").\n\n**Scope limitation (intentional, not accidental):** this renderer only\nunderstands a *flat* object schema — every `properties` entry must be\n`'string'`, `'number'`, `'integer'`, `'boolean'`, or a string `enum`;\nprimitive `const` is also enforced. Nested objects, arrays,\n`oneOf`/`anyOf`/`allOf`, `$ref`, constraints such as `minLength`/`minimum`,\nand schema-valued `additionalProperties` are not read. A full\nJSON-Schema-to-form renderer is\nout of scope for this component; a property whose `type` isn't one of the\nfour above renders a visible \"Unsupported field type\" note and marks the\nform invalid instead of silently dropping it or throwing.\n\nFields render in `Object.keys(schema.properties)` order (insertion order,\nwhich is reliable for a plain object's string keys). A field's label is\n`title ?? ` the property key; `description` renders as helper text below\nthe control; a key listed in `required` gets a visible `*`. The outer\ncomponent owns validation because JSON Schema `required` means property\npresence, unlike HTML controls' nonempty/must-check semantics.\n\nDeliberately no top-level `label`/`hint`/`errorText` chrome (unlike\n`<lr-checkbox-group>`'s own trio, despite both being compound, multi-item\nform controls): every field already carries its own per-field\n`label`/`description`/`error` parts above, and this whole control is\nmeant to be composed inside a consumer's own dialog/section (e.g. \"Approve\n`create_event` call?\") that already supplies the surrounding heading and\ncontext — a second, redundant outer label here would just repeat it. A\nform-wide validation summary is still available via the `error` part\n(`class=\"form-error\"`), driven by `reportValidity()`.\n\nThis component owns no Submit/Cancel/Approve chrome — a consumer composes\nit inside their own dialog (e.g. a tool-approval dialog) and reads\n`.value`/`.errors`/`checkValidity()` (or calls `reportValidity()` right\nbefore acting, which also reveals any inline errors that user interaction\nhasn't surfaced yet).\n\n`value` is exactly what the consumer last set it to — a field with no\nentry in `value` but a schema `default` displays (and is *emitted*, via\n`lr-input`) as that default, but the `value` *property* itself is left\nalone until the user actually edits that field. This mirrors an\nuncontrolled `<input placeholder>` not writing to `.value`, and means the\nvery first `lr-input` a consumer receives already carries every default\nresolved, so round-tripping `e.detail.value` back into `.value` converges\nafter one edit. JSON Schema defines `default` as an annotation; this form\nrenderer deliberately materializes it before validation and submission,\nso a valid default can satisfy `required` here.\n\nOptional native `<form>` participation is implemented via `ElementInternals`\nattached directly (this component's value is a whole object, not a plain\nstring, so the `FormAssociated` string-value mixin doesn't fit — same\nshape as `<lr-combobox>`'s array-valued case). This is a nice-to-have\nlayered on top of the primary integration contract (`value` +\n`lr-input`/`lr-validity-change`), not a requirement: a consumer that\nnever puts this inside a `<form>` loses nothing.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The outer wrapper around all fields. |\n| `description` | A field's helper text, from `schema.description`. |\n| `empty` | The message shown when `schema.properties` has no entries. |\n| `error` | A field-level or form-level validation message. |\n| `field` | One property's wrapper (label + control + description + error). |\n| `label` | A field's label. |\n| `unsupported` | The fallback note rendered in place of a control for a property whose `type` is outside this renderer's scope. |"
13956
14293
  },
13957
14294
  "attributes": [
13958
14295
  {
@@ -14170,7 +14507,7 @@
14170
14507
  "name": "lr-tool-timeline",
14171
14508
  "description": {
14172
14509
  "kind": "markdown",
14173
- "value": "`<lr-tool-timeline>` — a chronological list of an agent run's tool/function calls, each\nrendered through `<lr-tool-call-chip>` (name/status/duration) and `<lr-tool-result-view>`\n(args/result), with per-entry retry counts, sensitive-field redaction, and a shared\n`<lr-tool-approval-dialog>` for entries gated behind a human approval decision. This component\nowns none of the actual per-call rendering -- that is entirely those three existing\nprimitives -- its own job is ordering `entries` chronologically, computing each entry's\nduration from `startedAt`/`endedAt`, masking `redactedFields` before handing `args`/`result` to\n`<lr-tool-result-view>`, and opening/closing the one shared approval dialog for whichever entry\nis currently pending a decision.\n\nOrdering: `entries` is sorted ascending by `startedAt`; an entry with no `startedAt` sorts after\nevery timed entry, keeping its position relative to any other untimed entries stable (input\norder is preserved among ties) — a still-pending call with no timestamp yet naturally lands at\nthe end without needing to be pre-sorted by the host.\n\nRedaction only ever affects the read-only detail view: the copy of `args` handed to the\napproval dialog is always the entry's real, unmasked value. Approving a masked-args call must\nlet the reviewer see (and, if `approvalEditable`, edit) what will actually be sent — handing the\ndialog a placeholder string in place of a real field would silently corrupt the decision.\n\nApproval: activating the chip (`lr-tool-call-chip-select`) of an entry with `needsApproval` and\nan undecided `approved` opens the shared dialog for that entry; approving or denying emits this\ncomponent's own `lr-tool-approval-decide` and closes the dialog. This component never mutates\n`entries` itself — a host applies the decision (and any resulting status change) and re-assigns\n`entries`; if the entry currently under review disappears or no longer qualifies as pending\n(its `approved` was resolved some other way) by the time `entries` changes, the dialog closes on\nits own rather than staying open over stale data. A chip belonging to an entry that isn't\npending approval is left alone — its own `lr-tool-call-chip-select` (and deprecated\n`lr-tool-chip-select` alias) still bubble out normally for a host that wants to react to raw\nchip selection for its own purposes.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `approval-dialog` | The single shared `<lr-tool-approval-dialog>` instance. |\n| `base` | The root `<ol>`. |\n| `entry` | One entry's `<li>`; carries `data-status` (the entry's `status`) and `data-pending-approval` (`\"true\"`/`\"false\"`). |\n| `entry-approval-status` | The \"Approved\"/\"Denied\" badge, only rendered once `approved` is set; carries `data-decision` (`\"approved\"`/`\"denied\"`). |\n| `entry-body` | Wrapper around one entry's header and details. |\n| `entry-details` | The `<lr-details>` disclosure wrapping the entry's result view. |\n| `entry-error` | The entry's `error` text, only rendered when set. |\n| `entry-header` | Wrapper around the timestamp, chip, retry badge, and approval status. |\n| `entry-marker` | The decorative rail dot/connector for one entry. |\n| `entry-redacted-indicator` | A decorative marker shown when `redactedFields` is non-empty for that entry. |\n| `entry-result` | The entry's `<lr-tool-result-view>`. |\n| `entry-retries` | The retry-count badge, only rendered while `retryCount > 0`. |\n| `entry-retries-count` | The formatted retry count within the retry badge. |\n| `entry-retries-label` | The localized \"Retry\" text within the retry badge. |\n| `entry-timestamp` | The formatted `startedAt`, only rendered while it's set. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-tool-timeline-gap` (default: `var(--lr-space-l)`) — Vertical gap between entries.\n- `--lr-tool-timeline-marker-size` (default: `var(--lr-size-0-625rem)`) — Diameter of an entry's rail dot; also the width of the marker gutter column."
14510
+ "value": "`<lr-tool-timeline>` — a chronological list of an agent run's tool/function calls, each\nrendered through `<lr-tool-call-chip>` (name/status/duration) and `<lr-tool-result-view>`\n(args/result), with per-entry retry counts, sensitive-field redaction, and a shared\n`<lr-tool-approval-dialog>` for entries gated behind a human approval decision. This component\nowns none of the actual per-call rendering -- that is entirely those three existing\nprimitives -- its own job is ordering `entries` chronologically, computing each entry's\nduration from `startedAt`/`endedAt`, masking `redactedFields` before handing `args`/`result` to\n`<lr-tool-result-view>`, and opening/closing the one shared approval dialog for whichever entry\nis currently pending a decision.\n\nOrdering: `entries` is sorted ascending by `startedAt`; an entry with no `startedAt` sorts after\nevery timed entry, keeping its position relative to any other untimed entries stable (input\norder is preserved among ties) — a still-pending call with no timestamp yet naturally lands at\nthe end without needing to be pre-sorted by the host.\n\nRedaction only ever affects the read-only detail view: the copy of `args` handed to the\napproval dialog is always the entry's real, unmasked value. Approving a masked-args call must\nlet the reviewer see (and, if `approvalEditable`, edit) what will actually be sent — handing the\ndialog a placeholder string in place of a real field would silently corrupt the decision.\n\nApproval: activating the chip (`lr-tool-call-chip-select`) of an entry with `needsApproval` and\nan undecided `approved` opens the shared dialog for that entry; approving or denying emits this\ncomponent's own `lr-tool-approval-decide` and closes the dialog. This component never mutates\n`entries` itself — a host applies the decision (and any resulting status change) and re-assigns\n`entries`; if the entry currently under review disappears or no longer qualifies as pending\n(its `approved` was resolved some other way) by the time `entries` changes, the dialog closes on\nits own rather than staying open over stale data. A chip belonging to an entry that isn't\npending approval is left alone — its own `lr-tool-call-chip-select` (and deprecated\n`lr-tool-chip-select` alias) still bubble out normally for a host that wants to react to raw\nchip selection for its own purposes.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `approval-dialog` | The single shared `<lr-tool-approval-dialog>` instance. |\n| `base` | The root `<ol>`. |\n| `entry` | One entry's `<li>`; carries `data-status` (the entry's `status`) and `data-pending-approval` (`\"true\"`/`\"false\"`). |\n| `entry-approval-status` | The \"Approved\"/\"Denied\" badge, only rendered once `approved` is set; carries `data-decision` (`\"approved\"`/`\"denied\"`). |\n| `entry-body` | Wrapper around one entry's header and details. |\n| `entry-details` | The `<lr-details>` disclosure wrapping the entry's result view. |\n| `entry-error` | The entry's `error` text, only rendered when set. |\n| `entry-header` | Wrapper around the timestamp, chip, retry badge, and approval status. |\n| `entry-marker` | The decorative rail dot/connector for one entry. |\n| `entry-redacted-indicator` | A decorative marker shown when `redactedFields` is non-empty for that entry. |\n| `entry-result` | The entry's `<lr-tool-result-view>`. |\n| `entry-retries` | The retry-count badge, only rendered while `retryCount > 0`. |\n| `entry-retries-count` | The formatted retry count within the retry badge. |\n| `entry-retries-label` | The localized \"Retry\" text within the retry badge. |\n| `entry-timestamp` | The formatted `startedAt`, only rendered while it's set. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-tool-timeline-gap` (default: `var(--lr-space-l)`) — Vertical gap between entries.\n- `--lr-tool-timeline-marker-size` (default: `var(--lr-size-0-625rem)`) — Diameter of an entry's rail dot; also the width of the marker gutter column.\n- `--lr-tool-timeline-denied-marker-color` (default: `var(--lr-color-warning)`) — Rail-dot color for a `status=\"denied\"` entry, decoupled from the pending-approval border below so a consumer can retint either independently.\n- `--lr-tool-timeline-pending-approval-border-color` (default: `var(--lr-color-warning)`) — Color of the entry body's leading border while `data-pending-approval=\"true\"`."
14174
14511
  },
14175
14512
  "attributes": [
14176
14513
  {
@@ -14258,7 +14595,7 @@
14258
14595
  "name": "lr-tour",
14259
14596
  "description": {
14260
14597
  "kind": "markdown",
14261
- "value": "`<lr-tour>` -- a spotlight-and-step guided walkthrough for first-run onboarding. A sequence\nof steps, each anchored to a target element elsewhere in the page via the shared Floating UI\npositioner, shown against a dimmed full-viewport backdrop with a cutout/ring highlighting the\ncurrent target, with Next/Previous/Skip controls and a step-progress indicator. First-party\ninvention (no Web Awesome equivalent) -- nearest precedent in shape is `lr-dialog` (overlay\nlifecycle/focus trap) + `lr-carousel` (index-based navigation) + `lr-stepper`\n(progress/RTL arrow-key nav).\n\n**Not a form-associated control.** A tour is a walkthrough, not a field -- it deliberately has\nno `label`/`hint`/`error` chrome and no `FormAssociated` mixin.\n\n**Controlled component.** `steps` is never mutated by this component (mirrors\n`lr-stepper`'s `steps`); only `activeIndex` and `open` are self-managed, mirroring\n`lr-carousel`'s `index`.\n\n**Target interactivity.** By default, the step's spotlighted target is non-interactive while\nits step is active: it stays visually revealed and perceivable/announceable by assistive tech\n(not `inert`, not `aria-hidden`) but cannot be clicked -- every pointer event over the full\nviewport, including directly over the visually-revealed target, is captured by the backdrop\n(CSS `mask` does not affect hit-testing, only `clip-path` does) -- and cannot be reached by Tab\n(the shared overlay focus trap confines Tab to the popover panel). Set `step.interactiveTarget`\nto opt a step's target out of this: the backdrop additionally clips itself (via `clip-path`,\nwhich *does* affect hit-testing) around the same rect, so pointer/click events fall through to\nthe live target underneath. This only restores pointer/click reachability, not Tab\nreachability -- the focus trap still confines keyboard focus to the step popover regardless of\n`interactiveTarget`. If the interaction a step demonstrates must also be keyboard-reachable,\ndon't rely on Tab to reach the live target -- have the app's own listener on the target call\n`tourEl.next()` to advance the tour programmatically.\n\n**Focus management.** Uses the shared overlay manager with `modal: false` -- a deliberate\nchoice, not an oversight. The default `modal: true` would mark the entire rest of the page\n(including the spotlighted target itself, since it lives outside `<lr-tour>`'s own ancestor\nchain) `inert`, stripping it from the accessibility tree entirely -- stronger than the\n\"non-interactive but still perceivable\" default described above. `modal: false` skips that\nDOM-wide `inert` marking; the shared Tab-trap still confines keyboard Tab to the popover panel\nunconditionally regardless of `modal`, and the backdrop's own hit-testing handles\npointer/click reachability, so nothing is lost. `role=\"dialog\"` and `aria-modal=\"true\"` are\nstill rendered on the popover panel anyway: most screen readers restrict their own virtual-\ncursor/browse-mode navigation to an `aria-modal=\"true\"` element's subtree, giving assistive-\ntech users the same \"can perceive, can't wander into, the live target\" experience that the\nTab-trap and backdrop hit-testing already give sighted/mouse users.\n\nEach step transition mounts a genuinely new popover DOM node (keyed on the step's `id`) so\nfocus reliably re-enters the panel every time, even though the Previous/Next button that\ntriggered the transition lives inside that same persistent-looking region.\n\nNo `Home`/`End` jump-to-first/last-step shortcut and no click-to-jump progress dots, unlike\n`lr-stepper` -- a tour's steps are tied to live DOM targets that may not exist until an\nearlier step's side effect (opening a menu, navigating a route) has run, so free jumping is\nunsafe by default. `goToStep()` remains available for a host that knows what it's doing (e.g.\na \"restart tour\" affordance elsewhere).\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Rich content overriding the currently active step's plain-text `content` for that step only. When real content is assigned, it's shown instead of `step.content`; when empty, `step.content` renders as plain text. Not scoped per step by this component itself -- a consumer that needs different rich content per step swaps the slotted children (or listens for `lr-tour-step-change` and re-renders them) itself, the same \"consumer owns slotted content\" pattern `lr-dialog`'s default slot already uses. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `backdrop` | The full-viewport dimmed scrim with the spotlight cutout, an inline `<svg>`. `aria-hidden=\"true\"`. |\n| `body` | Wrapper around the step's content (slotted or `step.content`). |\n| `footer` | Wrapper around the Previous/Skip/Next-or-Done control row. |\n| `heading` | The step's visible heading text element -- the `aria-labelledby` target. |\n| `next-button` | The Next/Done control (label switches on the last step). |\n| `popover` | The step panel itself. `role=\"dialog\"`. |\n| `previous-button` | The Previous control. |\n| `progress` | Wrapper around the built-in step-progress indicator (dots + text). |\n| `progress-dot` | An individual decorative dot within `progress`. `aria-hidden=\"true\"`. |\n| `progress-text` | The visible \"Step X of Y\" text -- one of the popover's `aria-describedby` targets. |\n| `skip-button` | The Skip control. |\n| `spotlight` | The decorative highlight ring drawn around the current target's (padded) rect. `pointer-events: none`, `aria-hidden=\"true\"`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-tour-backdrop-color` — Backdrop scrim fill. Defaults to `--lr-color-overlay`.\n- `--lr-tour-spotlight-radius` — Corner radius shared by the cutout and the ring. Defaults to `--lr-radius`.\n- `--lr-tour-spotlight-ring-color` — Spotlight ring color. Defaults to `--lr-color-brand`.\n- `--lr-tour-spotlight-ring-width` — Spotlight ring thickness. Defaults to `--lr-border-width-medium`.\n- `--lr-tour-popover-max-width` — Maximum popover inline size. Defaults to `--lr-size-22rem`."
14598
+ "value": "`<lr-tour>` -- a spotlight-and-step guided walkthrough for first-run onboarding. A sequence\nof steps, each anchored to a target element elsewhere in the page via the shared Floating UI\npositioner, shown against a dimmed full-viewport backdrop with a cutout/ring highlighting the\ncurrent target, with Next/Previous/Skip controls and a step-progress indicator. First-party\ninvention (no Web Awesome equivalent) -- nearest precedent in shape is `lr-dialog` (overlay\nlifecycle/focus trap) + `lr-carousel` (index-based navigation) + `lr-stepper`\n(progress/RTL arrow-key nav).\n\n**Not a form-associated control.** A tour is a walkthrough, not a field -- it deliberately has\nno `label`/`hint`/`error` chrome and no `FormAssociated` mixin.\n\n**Controlled component.** `steps` is never mutated by this component (mirrors\n`lr-stepper`'s `steps`); only `activeIndex` and `open` are self-managed, mirroring\n`lr-carousel`'s `index`.\n\n**Target interactivity.** By default, the step's spotlighted target is non-interactive while\nits step is active: it stays visually revealed and perceivable/announceable by assistive tech\n(not `inert`, not `aria-hidden`) but cannot be clicked -- every pointer event over the full\nviewport, including directly over the visually-revealed target, is captured by the backdrop\n(CSS `mask` does not affect hit-testing, only `clip-path` does) -- and cannot be reached by Tab\n(the shared overlay focus trap confines Tab to the popover panel). Set `step.interactiveTarget`\nto opt a step's target out of this: the backdrop additionally clips itself (via `clip-path`,\nwhich *does* affect hit-testing) around the same rect, so pointer/click events fall through to\nthe live target underneath. This only restores pointer/click reachability, not Tab\nreachability -- the focus trap still confines keyboard focus to the step popover regardless of\n`interactiveTarget`. If the interaction a step demonstrates must also be keyboard-reachable,\ndon't rely on Tab to reach the live target -- have the app's own listener on the target call\n`tourEl.next()` to advance the tour programmatically.\n\n**Focus management.** Uses the shared overlay manager with `modal: false` -- a deliberate\nchoice, not an oversight. The default `modal: true` would mark the entire rest of the page\n(including the spotlighted target itself, since it lives outside `<lr-tour>`'s own ancestor\nchain) `inert`, stripping it from the accessibility tree entirely -- stronger than the\n\"non-interactive but still perceivable\" default described above. `modal: false` skips that\nDOM-wide `inert` marking; the shared Tab-trap still confines keyboard Tab to the popover panel\nunconditionally regardless of `modal`, and the backdrop's own hit-testing handles\npointer/click reachability, so nothing is lost. `role=\"dialog\"` and `aria-modal=\"true\"` are\nstill rendered on the popover panel anyway: most screen readers restrict their own virtual-\ncursor/browse-mode navigation to an `aria-modal=\"true\"` element's subtree, giving assistive-\ntech users the same \"can perceive, can't wander into, the live target\" experience that the\nTab-trap and backdrop hit-testing already give sighted/mouse users.\n\nEach step transition mounts a genuinely new popover DOM node (keyed on the step's `id`) so\nfocus reliably re-enters the panel every time, even though the Previous/Next button that\ntriggered the transition lives inside that same persistent-looking region.\n\nNo `Home`/`End` jump-to-first/last-step shortcut and no click-to-jump progress dots, unlike\n`lr-stepper` -- a tour's steps are tied to live DOM targets that may not exist until an\nearlier step's side effect (opening a menu, navigating a route) has run, so free jumping is\nunsafe by default. `goToStep()` remains available for a host that knows what it's doing (e.g.\na \"restart tour\" affordance elsewhere).\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Rich content overriding the currently active step's plain-text `content` for that step only. When real content is assigned, it's shown instead of `step.content`; when empty, `step.content` renders as plain text. Not scoped per step by this component itself -- a consumer that needs different rich content per step swaps the slotted children (or listens for `lr-tour-step-change` and re-renders them) itself, the same \"consumer owns slotted content\" pattern `lr-dialog`'s default slot already uses. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `backdrop` | The full-viewport dimmed scrim with the spotlight cutout, an inline `<svg>`. `aria-hidden=\"true\"`. |\n| `body` | Wrapper around the step's content (slotted or `step.content`). |\n| `footer` | Wrapper around the Previous/Skip/Next-or-Done control row. |\n| `heading` | The step's visible heading text element -- the `aria-labelledby` target. |\n| `next-button` | The Next/Done control (label switches on the last step). |\n| `popover` | The step panel itself. `role=\"dialog\"`. |\n| `previous-button` | The Previous control. |\n| `progress` | Wrapper around the built-in step-progress indicator (dots + text). |\n| `progress-dot` | An individual decorative dot within `progress`. `aria-hidden=\"true\"`. |\n| `progress-text` | The visible \"Step X of Y\" text -- one of the popover's `aria-describedby` targets. |\n| `skip-button` | The Skip control. |\n| `spotlight` | The decorative highlight ring drawn around the current target's (padded) rect. `pointer-events: none`, `aria-hidden=\"true\"`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-tour-backdrop-color` — Backdrop scrim fill. Defaults to `--lr-color-overlay`.\n- `--lr-tour-spotlight-radius` — Corner radius shared by the cutout and the ring. Defaults to `--lr-radius`.\n- `--lr-tour-spotlight-ring-color` — Spotlight ring color. Defaults to `--lr-color-brand`.\n- `--lr-tour-spotlight-ring-width` — Spotlight ring thickness. Defaults to `--lr-border-width-medium`.\n- `--lr-tour-popover-max-width` — Maximum popover inline size. Defaults to `--lr-size-22rem`.\n- `--lr-tour-progress-dot-current-bg` (default: `var(--lr-color-brand)`) — Background of `progress-dot` for the current step, without repainting every other component that reuses the shared brand token."
14262
14599
  },
14263
14600
  "attributes": [
14264
14601
  {
@@ -14330,7 +14667,7 @@
14330
14667
  "name": "lr-trace-tree",
14331
14668
  "description": {
14332
14669
  "kind": "markdown",
14333
- "value": "`<lr-trace-tree>` — a collapsible span hierarchy for one agent/LLM trace\n(Langfuse/LangSmith run-tree style): kind icon, name, status, an inline\nduration bar on the shared trace time scale, and optional tokens/cost\ncolumns. Consumes the same `LyraSpan[]` as `<lr-span-waterfall>`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `bar` | The duration bar's filled portion. |\n| `bar-track` | The duration bar's background track. |\n| `base` | The root wrapper (`role=\"tree\"`). |\n| `cost` | The cost column cell (when `showCost`). |\n| `detail` | The span's secondary text, from `LyraSpan.detail`. |\n| `duration` | The formatted duration text. |\n| `empty` | The empty-state message shown when `spans` is empty. |\n| `header` | The column-header row, rendered only when `showTokens`/`showCost` is on. |\n| `icon` | The span-kind icon. |\n| `live-region` | The internal status-announcement live region. |\n| `name` | The span's name. |\n| `row` | One span's row (`role=\"treeitem\"`). |\n| `status-text` | The visible status label. |\n| `toggle` | A row's expand/collapse button. |\n| `tokens-in` | The tokens-in column cell (when `showTokens`). |\n| `tokens-out` | The tokens-out column cell (when `showTokens`). |"
14670
+ "value": "`<lr-trace-tree>` — a collapsible span hierarchy for one agent/LLM trace\n(Langfuse/LangSmith run-tree style): kind icon, name, status, an inline\nduration bar on the shared trace time scale, and optional tokens/cost\ncolumns. Consumes the same `LyraSpan[]` as `<lr-span-waterfall>`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `bar` | The duration bar's filled portion. |\n| `bar-track` | The duration bar's background track. |\n| `base` | The root wrapper (`role=\"tree\"`). |\n| `cost` | The cost column cell (when `showCost`). |\n| `detail` | The span's secondary text, from `LyraSpan.detail`. |\n| `duration` | The formatted duration text. |\n| `empty` | The empty-state message shown when `spans` is empty. |\n| `header` | The column-header row, rendered only when `showTokens`/`showCost` is on. |\n| `icon` | The span-kind icon. |\n| `live-region` | The internal status-announcement live region. |\n| `name` | The span's name. |\n| `row` | One span's row (`role=\"treeitem\"`). |\n| `status-text` | The visible status label. |\n| `toggle` | A row's expand/collapse button. |\n| `tokens-in` | The tokens-in column cell (when `showTokens`). |\n| `tokens-out` | The tokens-out column cell (when `showTokens`). |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-trace-tree-row-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the active (`activeSpanId`) row. Shadow Parts forbids an attribute selector after `::part()`, so the active row could otherwise only be restyled by hijacking the library-wide `--lr-color-brand-quiet` token. Pairs with `--lr-trace-tree-row-active-color`: set both together, since the defaults assume the active background stays on the same side of the lightness midpoint as the ambient surface — a dark tint in light mode needs the matching text color set too, or the row's secondary text drops below the WCAG AA contrast floor.\n- `--lr-trace-tree-row-active-color` (default: `var(--lr-color-text)`) — Foreground reference for the active (`activeSpanId`) row. It sets the color of that row's secondary text (`detail`, `duration`, `tokens-in`, `tokens-out`, `cost`, and the `pending` status label), which is raised from the quiet token to full-strength text so it clears WCAG AA against the active row's tint. The semantic status labels keep their own hue but are mixed 25% toward this same value, so overriding it re-aims every foreground on the row at once rather than leaving the status colors stranded. See the pairing caveat on `--lr-trace-tree-row-active-bg`."
14334
14671
  },
14335
14672
  "attributes": [
14336
14673
  {
@@ -14432,7 +14769,7 @@
14432
14769
  "name": "lr-tree",
14433
14770
  "description": {
14434
14771
  "kind": "markdown",
14435
- "value": "`<lr-tree>` — an expand/collapse hierarchy for graph/document navigation.\n\nImplements the WAI-ARIA treeitem keyboard pattern: a single roving\n`tabindex` (tracked here as `activeId`, pushed down to every\n`<lr-tree-node>` — including nested ones, recursively) and\nArrowUp/Down/Right/Left/Home/End/Enter/Space handled by one delegated\n`keydown` listener. Native `KeyboardEvent`s are `composed: true` and\nbubble across shadow-DOM boundaries, so a press inside a deeply-nested\n`<lr-tree-node>`'s own shadow root still reaches this listener.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-tree-node>` elements (top-level tree items). |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The tree's root wrapper (role=\"tree\"). |\n| `empty` | The empty-state message shown when `data` is empty. |"
14772
+ "value": "`<lr-tree>` — an expand/collapse hierarchy for graph/document navigation.\n\nImplements the WAI-ARIA treeitem keyboard pattern: a single roving\n`tabindex` (tracked here as `activeId`, pushed down to every\n`<lr-tree-node>` — including nested ones, recursively) and\nArrowUp/Down/Right/Left/Home/End/Enter/Space handled by one delegated\n`keydown` listener. Native `KeyboardEvent`s are `composed: true` and\nbubble across shadow-DOM boundaries, so a press inside a deeply-nested\n`<lr-tree-node>`'s own shadow root still reaches this listener.\n\nSet `reorderable` to opt into keyboard reordering: Ctrl/Cmd+ArrowUp/ArrowDown on the focused\nnode emits `lr-reorder` — a *request*, exactly like every other event here. `data` is\nhost-owned and never mutated by this component, so nothing moves until the host reassigns a\nreordered `data`; focus then follows the moved node. The keybinding matches\n`<lr-dashboard-grid>`'s `cells-draggable` precedent (Alt+Arrow is browser back/forward on\nWindows/Linux). `<lr-file-tree>` deliberately **opts out**: its `TreeItem[]` is derived from\n`nodes` on every render and keyed by filesystem path, an order it does not own.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-tree-node>` elements (top-level tree items). |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The tree's root wrapper (role=\"tree\"). |\n| `empty` | The empty-state message shown when `data` is empty. |"
14436
14773
  },
14437
14774
  "attributes": [
14438
14775
  {
@@ -14448,6 +14785,13 @@
14448
14785
  "kind": "markdown",
14449
14786
  "value": "Optional locale override. Otherwise the nearest `locale`/`lang` ancestor is used.\n\nType: `string` \nDefault: `''`"
14450
14787
  }
14788
+ },
14789
+ {
14790
+ "name": "reorderable",
14791
+ "description": {
14792
+ "kind": "markdown",
14793
+ "value": "Opts into Ctrl/Cmd+ArrowUp/ArrowDown keyboard reordering (see the class doc). Defaults to\n`false`: unset, no `lr-reorder` is ever emitted, Ctrl/Cmd+Arrow keeps behaving exactly like\na plain Arrow press, and the internal live region is not rendered at all.\n\nType: `boolean` \nDefault: `false`"
14794
+ }
14451
14795
  }
14452
14796
  ]
14453
14797
  },
@@ -14485,7 +14829,7 @@
14485
14829
  "name": "lr-typing-indicator",
14486
14830
  "description": {
14487
14831
  "kind": "markdown",
14488
- "value": "`<lr-typing-indicator>` — a purely presentational \"assistant is\nresponding\" presence cue. No events, no interactivity: a consumer mounts\nit while a response is being generated and removes it (or hides it) once\nreal content has arrived.\n\nThree visual variants share one component rather than three separate tags\nbecause callers pick between them along a single axis — how the\nsurrounding surface wants the cue to read — and nothing else about the\ncomponent differs:\n- `dots` (default) — three dots with a staggered bounce, the classic\n \"typing…\" affordance for a standalone status line.\n- `pulse` — a single breathing dot, a quieter cue for a tighter space\n (e.g. next to an avatar).\n- `cursor` — a blinking vertical bar, meant to sit inline at the tail end\n of streamed text that is still being appended to.\n\nAccessibility: this indicator typically mounts and unmounts around a real\ngeneration lifecycle (appears when a response starts, disappears once one\narrives) rather than emitting a stream of updates of its own, so it does\n*not* route through `<lr-live-region>`/`Announcer`\n(`../../internal/announcer.js`) — that machinery exists to coalesce many\nrapidly-changing announcements into one, and there is only ever a single\nannouncement here: the mount itself. A plain `role=\"status\"` plus an\naccessible name derived from `label` is sufficient, set both as an\n`aria-label` on the host *and* as a visually-hidden text node in the\nshadow tree, so the name survives even if only one of the two is picked up\nby a given assistive-tech/browser pairing. An untouched-default, empty, or\nwhitespace-only `label` falls back to the localized \"Thinking…\" copy in\nboth places, rather than leaving the component with no accessible name at\nall. The animated dots/pulse/cursor\nshape is `aria-hidden=\"true\"` — it's decorative; `label` is the entire\naccessible content, so nothing narrates individual animation frames.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The decorative (`aria-hidden`) wrapper around the animated shape. |\n| `cursor` | The blinking bar in the `cursor` variant. |\n| `dot` | Each of the three dots in the `dots` variant. |\n| `pulse` | The single pulsing dot in the `pulse` variant. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-transition-ambient` (default: `1.8s ease-in-out`) — Animation duration and timing function shared by all variants.\n- `--lr-typing-dot-stagger-1` (default: `600ms`) — Delay for the second dot in the dots variant.\n- `--lr-typing-dot-stagger-2` (default: `1200ms`) — Delay for the third dot in the dots variant."
14832
+ "value": "`<lr-typing-indicator>` — a purely presentational \"assistant is\nresponding\" presence cue. No events, no interactivity: a consumer mounts\nit while a response is being generated and removes it (or hides it) once\nreal content has arrived.\n\nThree visual variants share one component rather than three separate tags\nbecause callers pick between them along a single axis — how the\nsurrounding surface wants the cue to read — and nothing else about the\ncomponent differs:\n- `dots` (default) — three dots with a staggered bounce, the classic\n \"typing…\" affordance for a standalone status line.\n- `pulse` — a single breathing dot, a quieter cue for a tighter space\n (e.g. next to an avatar).\n- `cursor` — a blinking vertical bar, meant to sit inline at the tail end\n of streamed text that is still being appended to.\n\nAccessibility: this indicator typically mounts and unmounts around a real\ngeneration lifecycle (appears when a response starts, disappears once one\narrives) rather than emitting a stream of updates of its own, so it does\n*not* route through `<lr-live-region>`/`Announcer`\n(`../../internal/announcer.js`) — that machinery exists to coalesce many\nrapidly-changing announcements into one, and there is only ever a single\nannouncement here: the mount itself. A plain `role=\"status\"` plus an\naccessible name derived from `label` is sufficient, set both as an\n`aria-label` on the host *and* as a visually-hidden text node in the\nshadow tree, so the name survives even if only one of the two is picked up\nby a given assistive-tech/browser pairing. An untouched-default, empty, or\nwhitespace-only `label` falls back to the localized \"Thinking…\" copy in\nboth places, rather than leaving the component with no accessible name at\nall. An `aria-label` set directly on the host element (the idiomatic way to\nname any custom element) wins over the `label`-derived default, in both\nplaces -- the host attribute is never silently clobbered on first render.\nThe animated dots/pulse/cursor\nshape is `aria-hidden=\"true\"` — it's decorative; `label` is the entire\naccessible content, so nothing narrates individual animation frames.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The decorative (`aria-hidden`) wrapper around the animated shape. |\n| `cursor` | The blinking bar in the `cursor` variant. |\n| `dot` | Each of the three dots in the `dots` variant. |\n| `pulse` | The single pulsing dot in the `pulse` variant. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-transition-ambient` (default: `1.8s ease-in-out`) — Animation duration and timing function shared by all variants.\n- `--lr-typing-dot-stagger-1` (default: `600ms`) — Delay for the second dot in the dots variant.\n- `--lr-typing-dot-stagger-2` (default: `1200ms`) — Delay for the third dot in the dots variant."
14489
14833
  },
14490
14834
  "attributes": [
14491
14835
  {
@@ -14522,7 +14866,7 @@
14522
14866
  "name": "lr-usage-badge",
14523
14867
  "description": {
14524
14868
  "kind": "markdown",
14525
- "value": "`<lr-usage-badge>` — a compact, static resource strip for one message or run: tokens in/out,\ncost, latency, with a hover/focus tooltip breakdown. Purely formatting — this component computes\nno counts, rates, or prices; every segment is independently optional, and with nothing set,\nnothing renders at all (not even a focusable/interactive shell).\n\nThe tooltip reuses `<lr-tool-call-chip>`'s hover/focus/Escape/`aria-describedby` contract\nwholesale: hover and focus are tracked as independent \"keep it open\" reasons, so releasing one\nmodality while the other still holds doesn't close it.\n\nThe built-in latency formatting has no minutes/hours tier (`'{ms}ms'`, or one-decimal seconds\nabove 1000ms) — a host whose latencies commonly exceed a minute sets `formatLatency` to render\nits own scale instead, in both the visible strip and the tooltip row.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Extra rows appended below the built-in tooltip breakdown (e.g. cache-read tokens). The visible strip itself is prop-driven only. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root inline strip (a focusable non-button `role=\"group\"`, only while at least one segment or the default slot has content). |\n| `cost` | The verbatim `costText`. Only rendered when set. |\n| `latency` | The formatted `latencyMs`. Only rendered when it's a finite number. |\n| `tokens-in` | The `'{count} in'` segment. Only rendered when `tokensIn` is a finite number. |\n| `tokens-out` | The `'{count} out'` segment. Only rendered when `tokensOut` is a finite number. |\n| `tooltip` | The floating detail breakdown, only meaningful while open. |"
14869
+ "value": "`<lr-usage-badge>` — a compact, static resource strip for one message or run: tokens in/out,\ncost, latency, with a hover/focus tooltip breakdown. Purely formatting — this component computes\nno counts, rates, or prices; every segment is independently optional, and with nothing set,\nnothing renders at all (not even a focusable/interactive shell).\n\nThe tooltip reuses `<lr-tool-call-chip>`'s hover/focus/Escape/`aria-describedby` contract\nwholesale: hover and focus are tracked as independent \"keep it open\" reasons, so releasing one\nmodality while the other still holds doesn't close it.\n\nThe built-in latency formatting has no minutes/hours tier (`'{ms}ms'`, or one-decimal seconds\nabove 1000ms) — a host whose latencies commonly exceed a minute sets `formatLatency` to render\nits own scale instead, in both the visible strip and the tooltip row.\n\nAn `aria-label` set on the host element (the idiomatic way to name any custom element) wins\nover the localized default accessible name, same convention as `<lr-tool-call-chip>`'s own\n`aria-label` precedence.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Extra rows appended below the built-in tooltip breakdown (e.g. cache-read tokens). The visible strip itself is prop-driven only. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root inline strip (a focusable non-button `role=\"group\"`, only while at least one segment or the default slot has content). |\n| `cost` | The verbatim `costText`. Only rendered when set. |\n| `latency` | The formatted `latencyMs`. Only rendered when it's a finite number. |\n| `tokens-in` | The `'{count} in'` segment. Only rendered when `tokensIn` is a finite number. |\n| `tokens-out` | The `'{count} out'` segment. Only rendered when `tokensOut` is a finite number. |\n| `tooltip` | The floating detail breakdown, only meaningful while open. |"
14526
14870
  },
14527
14871
  "attributes": [
14528
14872
  {
@@ -14573,7 +14917,7 @@
14573
14917
  "name": "lr-virtual-list",
14574
14918
  "description": {
14575
14919
  "kind": "markdown",
14576
- "value": "`<lr-virtual-list>` — a generic windowed/virtualized list host. Renders\nonly the items within the current viewport (plus `overscan` padding rows\non each side) as real DOM, regardless of how large `items` is, so a\nmulti-thousand-row chat history sidebar or long message thread stays cheap\nto scroll.\n\nContent is entirely caller-supplied: `renderItem(item, index)` returns\nwhatever `lit-html` value should represent that row (typically a\n`TemplateResult`), and `keyFunction(item, index)` gives it a stable\nidentity for `repeat()`'s DOM-reconciliation key, so scroll position and\nany per-row state (e.g. an `<audio>` element's playback position) survive\nan `items` mutation instead of every row remounting from scratch.\n\n**Windowing math.** Every row — in both `row-height` modes — is positioned\nby a `transform: translateY(offset)` computed from a single cumulative\n`offsets` array (`offsets[i]` = the pixel top of row `i`), rather than by\npage flow. This is what lets only a small DOM window exist while the\nscrollbar still reflects the *true* total content height:\n- **`row-height=\"auto\"` (default).** Each currently-rendered row is\n watched by a `ResizeObserver`; its real height lands in a per-key\n `Map`, and any row not yet measured contributes `DEFAULT_ROW_ESTIMATE_PX`\n to the offsets array until it has been. `offsets` is *not* the same\n thing as a page-count-based `padding-top`/`padding-bottom` spacer pair —\n that approach reflows every unmeasured row's position on every new\n measurement, which is exactly what per-row transform offsets avoid: only\n the rows *after* a newly-measured one shift, and even that shift is a\n cheap style recompute, not a layout-affecting padding change.\n- **Fixed numeric `row-height`.** No measurement needed — `offsets[i]` is\n just `i * rowHeightPx`, computed by the exact same cumulative-array code\n path (a dedicated \"single spacer + start-index\" special case was\n considered and would work too, but reusing one code path for both modes\n avoids maintaining two parallel rendering strategies for a difference\n that's otherwise just \"how is row *i*'s height looked up\").\n\nThe `offsets` array is rebuilt only when `items`, `row-height`, or\n`keyFunction` change, or a row's measured height changes -- not on every\nupdate, so a pure scroll-position tick (potentially every rAF while\nscrolling) only re-runs the cheap range/visibility math in\n`computeRange()`, never the `O(n)` offsets rebuild (which, in\n`row-height=\"auto\"` mode, also means a `keyFunction` call per item). For\nthe list sizes this component is meant for (a scrollable history sidebar,\nrealistically hundreds to a few thousand rows) that rebuild is a trivial\n`O(n)` arithmetic loop even when it does run; it is *not* the right\napproach for a hundred-thousand-row list without further work (e.g. a\nFenwick/segment tree for `O(log n)` offset queries+updates), which is out\nof scope here.\n\n**Accessibility.** The scroll container is `role=\"list\"` and each rendered\nrow is `role=\"listitem\"`, deliberately *not* `listbox`/`option` — this\ncomponent only provides windowing, not the roving-tabindex/\n`aria-activedescendant` keyboard-interaction contract ARIA requires\nalongside a real `listbox`. A consumer that wants full single-select\nlistbox semantics on top of this should compose that behavior itself (see\n`<lr-select>`'s pattern), the same way this component's `active-id`\nonly *scrolls* the matching row into view and marks it `aria-current` —\nit never claims to be a selection widget. `aria-setsize`/`aria-posinset`\nare computed from the row's real index in the full `items` array (not its\nposition among the currently-rendered DOM window), so a screen reader\nstill announces e.g. \"item 12 of 340\" correctly. `[part=\"base\"]` itself\ncarries `tabindex=\"0\"` — `renderItem`'s content is caller-supplied and not\nguaranteed to contain a focusable element, and a scrollable region with no\nfocusable content of its own is otherwise unreachable by keyboard (native\narrow/Page Up/Page Down scrolling included).\n\n**Grouping.** When supplied, `groups` renders a labeled group marker at the\ncorresponding `startIndex`. Group markers are positioned independently of\nthe row window, so they remain available when the first row in a group is\noutside the current overscanned range.\n\n**Programmatic scrolling.** `scrollToIndex()` is the public counterpart to `active-id`'s automatic\nscroll-into-view -- used by `<lr-chat-viewport>`'s virtual mode and any other host that needs to\nscroll to a specific row without also changing which row is \"active.\"\n\n**`item-role=\"row\"` mode.** Additive to the default `'listitem'` mapping above: `[part=\"base\"]`\nbecomes `role=\"rowgroup\"`, `[part=\"spacer\"]` becomes `role=\"presentation\"`, and each row becomes\n`role=\"row\"` with `aria-rowindex` (the row's 1-based index plus `row-index-offset`) instead of\n`aria-setsize`/`aria-posinset`. For a consumer composing its own `role=\"table\"` wrapper and header\nrow around this component (see `<lr-dataset-viewer>`), where `row-index-offset=\"1\"` accounts for\nthat external header row occupying `aria-rowindex=\"1\"`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The scrollable container (`role=\"list\"`). |\n| `group` | A positioned group label. |\n| `row` | One rendered row's absolutely-positioned wrapper (`role=\"listitem\"`); `renderItem`'s return value renders inside it. |\n| `spacer` | The full-content-height inner element that gives the container its true scrollable extent. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-virtual-list-height` (default: `var(--lr-size-24rem)`) — The scroll viewport's height. A virtualized list needs a bounded scroll extent, so this ships a default rather than collapsing to zero when a caller does not size the host."
14920
+ "value": "`<lr-virtual-list>` — a generic windowed/virtualized list host. Renders\nonly the items within the current viewport (plus `overscan` padding rows\non each side) as real DOM, regardless of how large `items` is, so a\nmulti-thousand-row chat history sidebar or long message thread stays cheap\nto scroll.\n\nContent is entirely caller-supplied: `renderItem(item, index)` returns\nwhatever `lit-html` value should represent that row (typically a\n`TemplateResult`), and `keyFunction(item, index)` gives it a stable\nidentity for `repeat()`'s DOM-reconciliation key, so scroll position and\nany per-row state (e.g. an `<audio>` element's playback position) survive\nan `items` mutation instead of every row remounting from scratch.\n\n**Windowing math.** Every row — in both `row-height` modes — is positioned\nby a `transform: translateY(offset)` computed from a single cumulative\n`offsets` array (`offsets[i]` = the pixel top of row `i`), rather than by\npage flow. This is what lets only a small DOM window exist while the\nscrollbar still reflects the *true* total content height:\n- **`row-height=\"auto\"` (default).** Each currently-rendered row is\n watched by a `ResizeObserver`; its real height lands in a per-key\n `Map`, and any row not yet measured contributes `DEFAULT_ROW_ESTIMATE_PX`\n to the offsets array until it has been. `offsets` is *not* the same\n thing as a page-count-based `padding-top`/`padding-bottom` spacer pair —\n that approach reflows every unmeasured row's position on every new\n measurement, which is exactly what per-row transform offsets avoid: only\n the rows *after* a newly-measured one shift, and even that shift is a\n cheap style recompute, not a layout-affecting padding change.\n- **Fixed numeric `row-height`.** No measurement needed — `offsets[i]` is\n just `i * rowHeightPx`, computed by the exact same cumulative-array code\n path (a dedicated \"single spacer + start-index\" special case was\n considered and would work too, but reusing one code path for both modes\n avoids maintaining two parallel rendering strategies for a difference\n that's otherwise just \"how is row *i*'s height looked up\").\n\nThe `offsets` array is rebuilt only when `items`, `row-height`, or\n`keyFunction` change, or a row's measured height changes -- not on every\nupdate, so a pure scroll-position tick (potentially every rAF while\nscrolling) only re-runs the cheap range/visibility math in\n`computeRange()`, never the `O(n)` offsets rebuild (which, in\n`row-height=\"auto\"` mode, also means a `keyFunction` call per item). For\nthe list sizes this component is meant for (a scrollable history sidebar,\nrealistically hundreds to a few thousand rows) that rebuild is a trivial\n`O(n)` arithmetic loop even when it does run; it is *not* the right\napproach for a hundred-thousand-row list without further work (e.g. a\nFenwick/segment tree for `O(log n)` offset queries+updates), which is out\nof scope here.\n\n**Accessibility.** The scroll container is `role=\"list\"` and each rendered\nrow is `role=\"listitem\"`, deliberately *not* `listbox`/`option` — this\ncomponent only provides windowing, not the roving-tabindex/\n`aria-activedescendant` keyboard-interaction contract ARIA requires\nalongside a real `listbox`. A consumer that wants full single-select\nlistbox semantics on top of this should compose that behavior itself (see\n`<lr-select>`'s pattern), the same way this component's `active-id`\nonly *scrolls* the matching row into view and marks it `aria-current` —\nit never claims to be a selection widget. `aria-setsize`/`aria-posinset`\nare computed from the row's real index in the full `items` array (not its\nposition among the currently-rendered DOM window), so a screen reader\nstill announces e.g. \"item 12 of 340\" correctly. `[part=\"base\"]` itself\ncarries `tabindex=\"0\"` — `renderItem`'s content is caller-supplied and not\nguaranteed to contain a focusable element, and a scrollable region with no\nfocusable content of its own is otherwise unreachable by keyboard (native\narrow/Page Up/Page Down scrolling included).\n\n**Grouping.** When supplied, `groups` renders a labeled group marker at the\ncorresponding `startIndex`. Group markers are positioned independently of\nthe row window, so they remain available when the first row in a group is\noutside the current overscanned range.\n\n**Sticky group headers.** `renderStickyGroup` adds a `[part=\"sticky-group\"]` overlay pinned to the\ntop of the scroll viewport, showing the `groups` entry the viewport is currently inside; as the\nnext group's header arrives it is pushed out by the overlap rather than swapped abruptly. Unset\n(the default) renders no overlay element at all, and the list renders exactly as it does without\nthis feature. Four properties of the overlay matter to a consumer:\n- It is a **visual copy** of content that already exists in the list, so it is `aria-hidden` and\n any ordinary focusable element inside it is forced to `tabindex=\"-1\"`: the real row keeps sole\n ownership of the heading semantics and of the tab order. (`inert` would express this more\n directly but would also block the pointer opt-in below, so it is deliberately not used; a\n focus-delegating custom element rendered into the overlay needs its own `tabindex=\"-1\"`.)\n- It is **`pointer-events: none` by default**; a consumer whose header content is interactive\n opts in with `lr-virtual-list::part(sticky-group) { pointer-events: auto; }`.\n- It is **never measured as a row.** It contributes nothing to `offsets`, so a group header that\n is also a real row is not counted twice in `row-height=\"auto\"` mode.\n- Its measured height becomes a `scroll-padding-block-start` on the scroll container, so both\n `active-id`/`scrollToIndex` and native keyboard scrolling stop *below* the band instead of\n parking the target row behind it. Scrolled above the first group the band shows nothing but\n stays mounted, so that height is known before the first jump rather than after it.\nA host that renders its own group headers as ordinary rows supplies `groups` purely as position\nanchors, with `label: ''` so no duplicate `[part=\"group\"]` marker renders.\n\n**Position queries.** `offsetForIndex(index)` and `indexAtOffset(px)` expose the windowing math\nitself: they translate between an item index and the pixel offset that row renders at, in the same\ncoordinate space as the scroll container's `scrollTop`. A host doing its own scroll-linked layout\n(a pinned group header, a scrollbar minimap, a \"jump to here\" affordance) needs those numbers and\nwould otherwise have to duplicate the offsets array.\n\n**Programmatic scrolling.** `scrollToIndex()` is the public counterpart to `active-id`'s automatic\nscroll-into-view -- used by `<lr-chat-viewport>`'s virtual mode and any other host that needs to\nscroll to a specific row without also changing which row is \"active.\"\n\n**`item-role=\"row\"` mode.** Additive to the default `'listitem'` mapping above: `[part=\"base\"]`\nbecomes `role=\"rowgroup\"`, `[part=\"spacer\"]` becomes `role=\"presentation\"`, and each row becomes\n`role=\"row\"` with `aria-rowindex` (the row's 1-based index plus `row-index-offset`) instead of\n`aria-setsize`/`aria-posinset`. For a consumer composing its own `role=\"table\"` wrapper and header\nrow around this component (see `<lr-dataset-viewer>`), where `row-index-offset=\"1\"` accounts for\nthat external header row occupying `aria-rowindex=\"1\"`.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The scrollable container (`role=\"list\"`). |\n| `group` | A positioned group label. Not rendered for a `groups` entry whose `label` is the empty string (a position-anchor-only entry). |\n| `row` | One rendered row's absolutely-positioned wrapper (`role=\"listitem\"`); `renderItem`'s return value renders inside it. |\n| `spacer` | The full-content-height inner element that gives the container its true scrollable extent. |\n| `sticky-group` | The pinned copy of the current group, rendered only while `renderStickyGroup` is set (and showing nothing while the viewport is above the first group, where there is no group to pin). `aria-hidden` and `pointer-events: none` by default — style this part with `pointer-events: auto` to make copied interactive content clickable again. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-virtual-list-height` (default: `var(--lr-size-24rem)`) — The scroll viewport's height. A virtualized list needs a bounded scroll extent, so this ships a default rather than collapsing to zero when a caller does not size the host."
14577
14921
  },
14578
14922
  "attributes": [
14579
14923
  {
@@ -14788,7 +15132,7 @@
14788
15132
  "name": "lr-widget",
14789
15133
  "description": {
14790
15134
  "kind": "markdown",
14791
- "value": "`<lr-widget>` — a titled panel shell with an optional collapse toggle and\nan optional fullscreen-expand toggle. Fullscreen promotes the same host\nelement in place (a CSS state, not a clone/portal), so slotted content\n(a chart, a running simulation, scroll position) survives the transition.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The panel body. |\n| `actions` | Header action controls, rendered before the collapse/expand buttons. |\n| `collapse-icon` | Overrides the built-in chevron glyph inside the collapse/expand toggle button entirely, via the platform's own slot-fallback-content mechanism (same convention as `<lr-tool-call-chip>`'s `icon` slot): whatever is assigned wins, otherwise the default chevron renders. Only meaningful while `collapsible`. |\n| `fullscreen-icon` | Overrides the built-in expand/close glyph inside the fullscreen toggle button entirely, using the same mechanism -- the override replaces *both* the \"expand\" and \"exit fullscreen\" default icons, so a consumer supplying one is responsible for its own expand/exit distinction (e.g. by reading the `fullscreen` attribute). Only meaningful while `expandable`. |\n| `icon` | Optional leading icon in the title row. |\n| `label` | Rich label content (overrides the `label` attribute). |\n| `sublabel` | Rich sublabel content (overrides the `sublabel` attribute). |\n| `view-{id}` | Content for the view whose `WidgetView.id` matches `{id}`, rendered when `views` is non-empty. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The wrapper around the `actions` slot. |\n| `backdrop` | The fullscreen scrim behind the panel. |\n| `base` | The panel root (dialog role + backdrop when fullscreen). |\n| `body` | The wrapper around the default slot (the panel body). |\n| `collapse-button` | The collapse/expand toggle button. |\n| `fullscreen-button` | The fullscreen toggle button. |\n| `header` | The header row containing the title, actions, and toggle buttons. |\n| `icon` | Wrapper around the `icon` slot. Hidden entirely when empty. |\n| `label` | The panel title text. |\n| `label-group` | Wrapper around the label and sublabel. |\n| `sublabel` | The panel subtitle text. |\n| `title` | The wrapper around the label/sublabel. |\n| `view-toggle` | A single view toggle button. |\n| `view-toggles` | The header toggle-button group, only rendered when `views` is non-empty. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-widget-overlay-color` (default: `var(--lr-color-overlay)`) — The fullscreen scrim's color, applied to `[part=\"backdrop\"]`.\n- `--lr-widget-fullscreen-inset` (default: `max(var(--lr-space-l), var(--lr-safe-area-top)) max(var(--lr-space-l), var(--lr-safe-area-inline-end)) max(var(--lr-space-l), var(--lr-safe-area-bottom)) max(var(--lr-space-l), var(--lr-safe-area-inline-start))`) — The `inset` applied to `[part=\"base\"]` while `fullscreen`. Also set inline from the `fullscreen-inset` attribute.\n- `--lr-widget-backdrop-inset` (default: `var(--lr-widget-fullscreen-inset)`) — The `inset` applied to `[part=\"backdrop\"]`, so the scrim can be pulled back independently of the panel. Also set inline from the `backdrop-inset` attribute (falling back to `fullscreen-inset`). `fullscreen-inset` overrides the default `var(--lr-space-l)` inset applied to `[part=\"base\"]` and `[part=\"backdrop\"]` while fullscreen (e.g. `\"0 0 0 240px\"` to leave a persistent sidebar visible). `compact` tightens header/body padding — same convention as `lr-empty`'s `compact`."
15135
+ "value": "`<lr-widget>` — a titled panel shell with an optional collapse toggle and\nan optional fullscreen-expand toggle. Fullscreen promotes the same host\nelement in place (a CSS state, not a clone/portal), so slotted content\n(a chart, a running simulation, scroll position) survives the transition.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The panel body. |\n| `actions` | Header action controls, rendered before the collapse/expand buttons. |\n| `collapse-icon` | Overrides the built-in chevron glyph inside the collapse/expand toggle button entirely, via the platform's own slot-fallback-content mechanism (same convention as `<lr-tool-call-chip>`'s `icon` slot): whatever is assigned wins, otherwise the default chevron renders. Only meaningful while `collapsible`. |\n| `fullscreen-icon` | Overrides the built-in expand/close glyph inside the fullscreen toggle button entirely, using the same mechanism -- the override replaces *both* the \"expand\" and \"exit fullscreen\" default icons, so a consumer supplying one is responsible for its own expand/exit distinction (e.g. by reading the `fullscreen` attribute). Only meaningful while `expandable`. |\n| `icon` | Optional leading icon in the title row. |\n| `label` | Rich label content (overrides the `label` attribute). |\n| `sublabel` | Rich sublabel content (overrides the `sublabel` attribute). |\n| `view-{id}` | Content for the view whose `WidgetView.id` matches `{id}`, rendered when `views` is non-empty. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | The wrapper around the `actions` slot. |\n| `backdrop` | The fullscreen scrim behind the panel. |\n| `base` | The panel root (dialog role + backdrop when fullscreen). |\n| `body` | The wrapper around the default slot (the panel body). |\n| `collapse-button` | The collapse/expand toggle button. |\n| `fullscreen-button` | The fullscreen toggle button. |\n| `header` | The header row containing the title, actions, and toggle buttons. |\n| `icon` | Wrapper around the `icon` slot. Hidden entirely when empty. |\n| `label` | The panel title text. |\n| `label-group` | Wrapper around the label and sublabel. |\n| `sublabel` | The panel subtitle text. |\n| `title` | The wrapper around the label/sublabel. |\n| `view-toggle` | A single view toggle button. |\n| `view-toggles` | The header toggle-button group, only rendered when `views` is non-empty. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-widget-overlay-color` (default: `var(--lr-color-overlay)`) — The fullscreen scrim's color, applied to `[part=\"backdrop\"]`.\n- `--lr-widget-view-toggle-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of the pressed (`aria-pressed=\"true\"`) view toggle. Declared as an inline `var()` fallback (never on `:host`), so setting it on the element or an ancestor recolors only the active toggle without hijacking the library-wide `--lr-color-brand-quiet` token.\n- `--lr-widget-view-toggle-active-color` (default: `var(--lr-color-brand)`) — Text color of the pressed view toggle.\n- `--lr-widget-fullscreen-inset` (default: `max(var(--lr-space-l), var(--lr-safe-area-top)) max(var(--lr-space-l), var(--lr-safe-area-inline-end)) max(var(--lr-space-l), var(--lr-safe-area-bottom)) max(var(--lr-space-l), var(--lr-safe-area-inline-start))`) — The `inset` applied to `[part=\"base\"]` while `fullscreen`. Also set inline from the `fullscreen-inset` attribute.\n- `--lr-widget-backdrop-inset` (default: `var(--lr-widget-fullscreen-inset)`) — The `inset` applied to `[part=\"backdrop\"]`, so the scrim can be pulled back independently of the panel. Also set inline from the `backdrop-inset` attribute (falling back to `fullscreen-inset`). `fullscreen-inset` overrides the default `var(--lr-space-l)` inset applied to `[part=\"base\"]` and `[part=\"backdrop\"]` while fullscreen (e.g. `\"0 0 0 240px\"` to leave a persistent sidebar visible). `compact` tightens header/body padding — same convention as `lr-empty`'s `compact`."
14792
15136
  },
14793
15137
  "attributes": [
14794
15138
  {
@@ -14950,7 +15294,7 @@
14950
15294
  "name": "lr-xml-viewer",
14951
15295
  "description": {
14952
15296
  "kind": "markdown",
14953
- "value": "`<lr-xml-viewer>` — collapsible, copyable, `DOMParser`-based tree view for XML documents,\nmirroring `lr-json-viewer`'s UX (`collapsed-depth`, `copyable`, structural-path-keyed expand\nstate that survives a same-shape `xml` reassignment -- e.g. a streaming document being patched\nin place) adapted for XML's own node kinds: elements with attributes, text, comments, CDATA\nsections, and processing instructions.\n\nSearch is a purely imperative surface (`search()`/`searchNext()`/`searchPrevious()`/\n`clearSearch()`), the same uniform contract every anchor-target, search-capable viewer in this\nlibrary implements (`lr-pdf-viewer`, `lr-ebook-viewer`, `lr-notebook-viewer`) rather than\na settable property. `node-path` anchors address an element by child-index chain from the\ndocument root, with an optional trailing `'@attrName'` segment addressing one of that\nelement's attributes.\n\nNamespace-literal: qualified names render exactly as authored, with no namespace-URI-aware\nmatching. `DOMParser` never resolves external entities or DTDs, so XXE injection is\nstructurally out of reach.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `attribute` | One attribute's name/value pair wrapper. |\n| `attribute-name` | An attribute's name. |\n| `attribute-value` | An attribute's value (`data-match`). |\n| `base` | The root scroll container. |\n| `cdata` | A CDATA section leaf. |\n| `comment` | A comment leaf. |\n| `copy-button` | A copy-to-clipboard button -- the whole-document one (in `toolbar`) or a per-node one (only when `copyable`). |\n| `error` | The error region. |\n| `node` | One element row (`data-active` while it's the resolved anchor target, `data-match` while any part of it matches the current search, `data-active-match` while it's the currently active search match). |\n| `pi` | A processing-instruction leaf. |\n| `spinner` | The loading status region. |\n| `tag` | An element's tag name (`data-match`). |\n| `text` | A text leaf (`data-match`). |\n| `toggle` | An element's expand/collapse button (hidden, but present for row alignment, on leaf/empty elements). |\n| `toolbar` | The whole-document copy button row (only when `copyable`). |\n| `tree` | The rendered node tree. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-xml-viewer-max-height` (default: `none`) — Maximum block size of the scrollable body before it scrolls internally. Also settable via the `max-height` property."
15297
+ "value": "`<lr-xml-viewer>` — collapsible, copyable, `DOMParser`-based tree view for XML documents,\nmirroring `lr-json-viewer`'s UX (`collapsed-depth`, `copyable`, structural-path-keyed expand\nstate that survives a same-shape `xml` reassignment -- e.g. a streaming document being patched\nin place) adapted for XML's own node kinds: elements with attributes, text, comments, CDATA\nsections, and processing instructions.\n\nSearch is a purely imperative surface (`search()`/`searchNext()`/`searchPrevious()`/\n`clearSearch()`), the same uniform contract every anchor-target, search-capable viewer in this\nlibrary implements (`lr-pdf-viewer`, `lr-ebook-viewer`, `lr-notebook-viewer`) rather than\na settable property. `node-path` anchors address an element by child-index chain from the\ndocument root, with an optional trailing `'@attrName'` segment addressing one of that\nelement's attributes.\n\nNamespace-literal: qualified names render exactly as authored, with no namespace-URI-aware\nmatching. `DOMParser` never resolves external entities or DTDs, so XXE injection is\nstructurally out of reach.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `attribute` | One attribute's name/value pair wrapper. |\n| `attribute-name` | An attribute's name. |\n| `attribute-value` | An attribute's value (`data-match`). |\n| `base` | The root scroll container. |\n| `cdata` | A CDATA section leaf. |\n| `comment` | A comment leaf. |\n| `copy-button` | A copy-to-clipboard button -- the whole-document one (in `toolbar`) or a per-node one (only when `copyable`). |\n| `error` | The error region. |\n| `node` | One element row (`data-active` while it's the resolved anchor target, `data-match` while any part of it matches the current search, `data-active-match` while it's the currently active search match). |\n| `pi` | A processing-instruction leaf. |\n| `spinner` | The loading status region. |\n| `tag` | An element's tag name (`data-match`). |\n| `text` | A text leaf (`data-match`). |\n| `toggle` | An element's expand/collapse button (hidden, but present for row alignment, on leaf/empty elements). |\n| `toolbar` | The whole-document copy button row (only when `copyable`). |\n| `tree` | The rendered node tree. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-xml-viewer-max-height` (default: `none`) — Maximum block size of the scrollable body before it scrolls internally. Also settable via the `max-height` property.\n- `--lr-xml-viewer-active-match-color` (default: `var(--lr-color-warning)`) — Outline color of the `[part=\"node\"]` holding the current search match. Scoped to the active match, so the dashed outline on the other matches keeps the shared warning token.\n- `--lr-xml-viewer-match-color` (default: `var(--lr-color-warning)`) — Outline color of a (non-active) `[part=\"node\"]` search match, and the tint source for a matching `[part=\"text\"]`'s background. Distinct from `--lr-xml-viewer-active-match-color`, so the non-active matches can be recolored without touching the active one.\n- `--lr-xml-viewer-match-bg` (default: `var(--lr-color-warning-quiet)`) — Background of a matching `[part=\"tag\"]`/`[part=\"attribute-value\"]`."
14954
15298
  },
14955
15299
  "attributes": [
14956
15300
  {