@aceshooting/lyra-ui 9.1.1 → 10.0.1

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 (578) hide show
  1. package/CHANGELOG.md +597 -0
  2. package/custom-elements.json +1 -1
  3. package/dist/cli/migrate-wa.mjs +52 -0
  4. package/dist/cli/migration-contract.json +1 -1
  5. package/dist/components/agent-tools/activity-feed/activity-feed.class.js +1 -1
  6. package/dist/components/agent-tools/activity-feed/activity-feed.styles.js +0 -16
  7. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.class.js +1 -1
  8. package/dist/components/agent-tools/agent-eval-dashboard/agent-eval-dashboard.styles.js +7 -5
  9. package/dist/components/agent-tools/agent-run/agent-run.class.js +2 -2
  10. package/dist/components/agent-tools/agent-run/agent-run.styles.js +0 -13
  11. package/dist/components/agent-tools/agent-trace/agent-trace.styles.js +7 -4
  12. package/dist/components/agent-tools/approval-queue/approval-queue.styles.js +7 -5
  13. package/dist/components/agent-tools/artifact-panel/artifact-panel.styles.js +0 -3
  14. package/dist/components/agent-tools/browser-frame/browser-frame.styles.js +3 -5
  15. package/dist/components/agent-tools/commit-card/commit-card.styles.js +0 -10
  16. package/dist/components/agent-tools/compare-panel/compare-panel.styles.js +11 -6
  17. package/dist/components/agent-tools/confirm-bar/confirm-bar.styles.js +0 -46
  18. package/dist/components/agent-tools/eval-dataset/eval-dataset.styles.js +0 -7
  19. package/dist/components/agent-tools/evaluation-run/evaluation-run.class.js +2 -2
  20. package/dist/components/agent-tools/prompt-studio/prompt-studio.styles.js +0 -15
  21. package/dist/components/agent-tools/result-card/result-card.styles.js +0 -7
  22. package/dist/components/agent-tools/result-card/result-field.styles.js +0 -5
  23. package/dist/components/agent-tools/schema-viewer/schema-viewer.styles.js +0 -3
  24. package/dist/components/agent-tools/span-waterfall/span-waterfall.styles.js +0 -15
  25. package/dist/components/agent-tools/stack-trace/stack-trace.styles.js +0 -20
  26. package/dist/components/agent-tools/subagent-panel/subagent-panel.class.js +2 -2
  27. package/dist/components/agent-tools/subagent-panel/subagent-panel.styles.js +0 -3
  28. package/dist/components/agent-tools/task-list/task-list.styles.js +0 -15
  29. package/dist/components/agent-tools/terminal/terminal.class.d.ts +11 -6
  30. package/dist/components/agent-tools/terminal/terminal.class.js +4 -4
  31. package/dist/components/agent-tools/terminal/terminal.styles.js +0 -46
  32. package/dist/components/agent-tools/test-results/test-results.class.js +2 -2
  33. package/dist/components/agent-tools/test-results/test-results.styles.js +0 -5
  34. package/dist/components/agent-tools/thinking-panel/thinking-panel.styles.js +0 -41
  35. package/dist/components/agent-tools/tool-approval-dialog/tool-approval-dialog.styles.js +0 -41
  36. package/dist/components/agent-tools/tool-call-chip/tool-call-chip.styles.js +0 -30
  37. package/dist/components/agent-tools/tool-param-form/tool-param-form.class.js +6 -6
  38. package/dist/components/agent-tools/tool-param-form/tool-param-form.styles.js +0 -5
  39. package/dist/components/agent-tools/tool-result-dialog/tool-result-dialog.styles.js +0 -20
  40. package/dist/components/agent-tools/tool-result-view/tool-result-view.styles.js +0 -4
  41. package/dist/components/agent-tools/tool-select-dialog/tool-select-dialog.styles.js +0 -21
  42. package/dist/components/agent-tools/trace-tree/trace-tree.styles.js +7 -31
  43. package/dist/components/charts/chart/box-plot.styles.js +0 -20
  44. package/dist/components/charts/chart/chart-colors.d.ts +1 -1
  45. package/dist/components/charts/chart/chart-colors.js +1 -1
  46. package/dist/components/charts/chart/chart-core-loader.d.ts +1 -0
  47. package/dist/components/charts/chart/chart-core-loader.js +1 -1
  48. package/dist/components/charts/chart/chart-feature-loader.d.ts +35 -0
  49. package/dist/components/charts/chart/chart-feature-loader.js +1 -1
  50. package/dist/components/charts/chart/chart.class.d.ts +93 -0
  51. package/dist/components/charts/chart/chart.class.js +3 -3
  52. package/dist/components/charts/chart/chart.styles.js +0 -27
  53. package/dist/components/charts/chart/lite-chart.class.d.ts +20 -1
  54. package/dist/components/charts/chart/lite-chart.class.js +4 -4
  55. package/dist/components/charts/chart/lite-chart.styles.js +0 -27
  56. package/dist/components/conversation/agent-workspace/agent-workspace.class.d.ts +20 -0
  57. package/dist/components/conversation/agent-workspace/agent-workspace.class.js +3 -1
  58. package/dist/components/conversation/agent-workspace/agent-workspace.styles.js +3 -0
  59. package/dist/components/conversation/audio-visualizer/audio-visualizer.styles.js +0 -7
  60. package/dist/components/conversation/branch-picker/branch-picker.styles.js +0 -3
  61. package/dist/components/conversation/chat-composer/chat-composer.styles.js +0 -51
  62. package/dist/components/conversation/chat-message/chat-message.styles.js +7 -35
  63. package/dist/components/conversation/chat-viewport/chat-viewport.class.js +1 -1
  64. package/dist/components/conversation/chat-viewport/chat-viewport.styles.js +0 -33
  65. package/dist/components/conversation/checkpoint/checkpoint.class.js +1 -1
  66. package/dist/components/conversation/checkpoint/checkpoint.styles.js +0 -3
  67. package/dist/components/conversation/code-block/code-block-shared.d.ts +5 -2
  68. package/dist/components/conversation/code-block/code-block.class.js +1 -1
  69. package/dist/components/conversation/code-block/code-block.styles.js +4 -95
  70. package/dist/components/conversation/code-block/code-loader.d.ts +11 -0
  71. package/dist/components/conversation/code-block/code-loader.js +1 -1
  72. package/dist/components/conversation/code-block/shiki-types.d.ts +12 -0
  73. package/dist/components/conversation/code-block/shiki-types.js +1 -1
  74. package/dist/components/conversation/conversation-item/conversation-item.styles.js +8 -54
  75. package/dist/components/conversation/generation-metrics/generation-metrics.class.js +2 -2
  76. package/dist/components/conversation/generation-metrics/generation-metrics.styles.js +0 -17
  77. package/dist/components/conversation/markdown/markdown-base.class.js +1 -1
  78. package/dist/components/conversation/markdown/markdown.styles.js +0 -41
  79. package/dist/components/conversation/message-actions/message-actions.styles.js +0 -3
  80. package/dist/components/conversation/message-feedback/message-feedback.styles.js +0 -35
  81. package/dist/components/conversation/message-parts/message-parts.class.d.ts +1 -1
  82. package/dist/components/conversation/message-parts/message-parts.styles.js +0 -5
  83. package/dist/components/conversation/model-select/model-select.class.js +3 -3
  84. package/dist/components/conversation/model-select/model-select.styles.js +12 -47
  85. package/dist/components/conversation/model-settings-panel/model-settings-panel.styles.js +0 -6
  86. package/dist/components/conversation/prompt-input/prompt-input.class.d.ts +3 -0
  87. package/dist/components/conversation/prompt-input/prompt-input.styles.js +0 -10
  88. package/dist/components/conversation/push-to-talk/push-to-talk.styles.js +0 -8
  89. package/dist/components/conversation/selection-toolbar/selection-toolbar.styles.js +1 -11
  90. package/dist/components/conversation/stream-status/stream-status.styles.js +0 -16
  91. package/dist/components/conversation/streaming-text/streaming-text.styles.js +0 -15
  92. package/dist/components/conversation/suggestion-chips/suggestion-chips.styles.js +0 -5
  93. package/dist/components/conversation/thread-list/thread-list.styles.js +0 -23
  94. package/dist/components/conversation/transcript-feed/transcript-feed.class.d.ts +16 -4
  95. package/dist/components/conversation/transcript-feed/transcript-feed.class.js +1 -1
  96. package/dist/components/conversation/transcript-feed/transcript-feed.styles.js +0 -1
  97. package/dist/components/conversation/typing-indicator/typing-indicator.styles.js +0 -23
  98. package/dist/components/conversation/usage-badge/usage-badge.styles.js +0 -3
  99. package/dist/components/conversation/voice-picker/voice-picker.class.js +3 -3
  100. package/dist/components/conversation/voice-picker/voice-picker.styles.js +9 -29
  101. package/dist/components/conversation/widget-renderer/resolve.d.ts +2 -0
  102. package/dist/components/conversation/widget-renderer/resolve.js +1 -1
  103. package/dist/components/data/calendar/calendar.class.d.ts +15 -2
  104. package/dist/components/data/calendar/calendar.class.js +2 -2
  105. package/dist/components/data/calendar/calendar.styles.js +2 -28
  106. package/dist/components/data/condition-builder/condition-builder.class.d.ts +10 -6
  107. package/dist/components/data/condition-builder/condition-builder.class.js +2 -2
  108. package/dist/components/data/condition-builder/condition-builder.styles.js +0 -6
  109. package/dist/components/data/context-meter/context-meter.styles.js +0 -24
  110. package/dist/components/data/data-grid/data-grid.class.js +3 -3
  111. package/dist/components/data/data-grid/data-grid.styles.js +0 -22
  112. package/dist/components/data/document-library/document-library.class.js +2 -2
  113. package/dist/components/data/document-library/document-library.styles.js +0 -4
  114. package/dist/components/data/env-list/env-list.class.js +1 -1
  115. package/dist/components/data/env-list/env-list.styles.js +7 -4
  116. package/dist/components/data/file-tree/file-tree.class.d.ts +12 -0
  117. package/dist/components/data/flow-canvas/flow-canvas.styles.js +12 -19
  118. package/dist/components/data/flow-controls/flow-controls.class.js +2 -2
  119. package/dist/components/data/flow-controls/flow-controls.styles.js +3 -36
  120. package/dist/components/data/flow-minimap/flow-minimap.class.js +1 -1
  121. package/dist/components/data/flow-minimap/flow-minimap.styles.js +0 -9
  122. package/dist/components/data/flow-node/flow-node.styles.js +0 -23
  123. package/dist/components/data/flow-run-status/flow-run-status.class.js +1 -1
  124. package/dist/components/data/flow-run-status/flow-run-status.styles.js +0 -7
  125. package/dist/components/data/graph-query-builder/graph-query-builder.class.d.ts +0 -7
  126. package/dist/components/data/graph-query-builder/graph-query-builder.class.js +1 -1
  127. package/dist/components/data/graph-query-builder/graph-query-builder.styles.js +0 -10
  128. package/dist/components/data/heatmap/heatmap-scale.d.ts +20 -0
  129. package/dist/components/data/heatmap/heatmap-scale.js +1 -1
  130. package/dist/components/data/heatmap/heatmap.class.d.ts +84 -1
  131. package/dist/components/data/heatmap/heatmap.class.js +2 -2
  132. package/dist/components/data/heatmap/heatmap.styles.js +0 -54
  133. package/dist/components/data/pagination/pagination.styles.js +23 -46
  134. package/dist/components/data/sequence-strip/sequence-strip.class.d.ts +34 -1
  135. package/dist/components/data/sequence-strip/sequence-strip.class.js +5 -2
  136. package/dist/components/data/sequence-strip/sequence-strip.styles.js +14 -20
  137. package/dist/components/data/sparkline/sparkline.class.js +1 -1
  138. package/dist/components/data/stat/stat.styles.js +0 -67
  139. package/dist/components/data/table/table.class.d.ts +42 -3
  140. package/dist/components/data/table/table.class.js +4 -4
  141. package/dist/components/data/table/table.styles.js +20 -91
  142. package/dist/components/data/timeline/timeline-item.styles.js +0 -30
  143. package/dist/components/data/timeline/timeline.class.d.ts +89 -1
  144. package/dist/components/data/timeline/timeline.class.js +2 -2
  145. package/dist/components/data/timeline/timeline.styles.js +111 -31
  146. package/dist/components/data/tree/tree-item.styles.js +1 -28
  147. package/dist/components/data/tree/tree.class.js +2 -2
  148. package/dist/components/data/tree/tree.styles.js +0 -6
  149. package/dist/components/data/word-cloud/word-cloud.styles.js +0 -5
  150. package/dist/components/forms/button/button.class.js +1 -1
  151. package/dist/components/forms/button/button.styles.js +0 -105
  152. package/dist/components/forms/checkbox/checkbox.class.d.ts +3 -0
  153. package/dist/components/forms/checkbox/checkbox.class.js +1 -1
  154. package/dist/components/forms/checkbox/checkbox.styles.js +0 -39
  155. package/dist/components/forms/checkbox-group/checkbox-group.class.d.ts +21 -2
  156. package/dist/components/forms/checkbox-group/checkbox-group.class.js +1 -1
  157. package/dist/components/forms/checkbox-group/checkbox-group.styles.js +0 -18
  158. package/dist/components/forms/code-editor/code-editor.styles.js +0 -30
  159. package/dist/components/forms/color-picker/color-picker.class.js +2 -2
  160. package/dist/components/forms/color-picker/color-picker.styles.js +0 -69
  161. package/dist/components/forms/combobox/combobox.class.js +2 -2
  162. package/dist/components/forms/combobox/combobox.styles.js +22 -111
  163. package/dist/components/forms/combobox/option.styles.js +7 -1
  164. package/dist/components/forms/date-picker/date-input.class.js +1 -1
  165. package/dist/components/forms/date-picker/date-input.styles.js +12 -67
  166. package/dist/components/forms/date-picker/date-picker.class.d.ts +1 -0
  167. package/dist/components/forms/date-picker/date-picker.class.js +22 -20
  168. package/dist/components/forms/date-picker/date-picker.styles.js +36 -29
  169. package/dist/components/forms/emoji-picker/emoji-data-loader.d.ts +6 -3
  170. package/dist/components/forms/emoji-picker/emoji-data-loader.js +1 -1
  171. package/dist/components/forms/emoji-picker/emoji-picker.class.d.ts +8 -1
  172. package/dist/components/forms/emoji-picker/emoji-picker.class.js +1 -1
  173. package/dist/components/forms/emoji-picker/emoji-picker.styles.js +3 -41
  174. package/dist/components/forms/icon-button/icon-button.class.js +1 -1
  175. package/dist/components/forms/icon-button/icon-button.styles.js +0 -16
  176. package/dist/components/forms/input/input.styles.js +0 -54
  177. package/dist/components/forms/input/number-input.styles.d.ts +4 -5
  178. package/dist/components/forms/input/number-input.styles.js +0 -11
  179. package/dist/components/forms/input/time-input-shared.d.ts +11 -0
  180. package/dist/components/forms/input/time-input-shared.js +1 -1
  181. package/dist/components/forms/input/time-input.class.d.ts +11 -2
  182. package/dist/components/forms/input/time-input.class.js +1 -1
  183. package/dist/components/forms/input/time-input.styles.js +0 -6
  184. package/dist/components/forms/locale-picker/locale-picker.class.js +2 -2
  185. package/dist/components/forms/locale-picker/locale-picker.styles.js +1 -26
  186. package/dist/components/forms/otp-input/otp-input.class.js +3 -3
  187. package/dist/components/forms/otp-input/otp-input.styles.js +0 -16
  188. package/dist/components/forms/phone-input/phone-input.class.d.ts +9 -1
  189. package/dist/components/forms/phone-input/phone-input.class.js +2 -2
  190. package/dist/components/forms/phone-input/phone-input.styles.js +0 -37
  191. package/dist/components/forms/radio/radio-button.styles.js +1 -30
  192. package/dist/components/forms/radio/radio-group.styles.js +0 -4
  193. package/dist/components/forms/radio/radio.styles.js +0 -44
  194. package/dist/components/forms/rubric-form/rubric-form.styles.js +0 -5
  195. package/dist/components/forms/select/select.class.js +1 -1
  196. package/dist/components/forms/select/select.styles.js +14 -114
  197. package/dist/components/forms/slider/slider.styles.js +0 -55
  198. package/dist/components/forms/swatch-picker/swatch-picker.class.d.ts +0 -11
  199. package/dist/components/forms/swatch-picker/swatch-picker.class.js +2 -2
  200. package/dist/components/forms/swatch-picker/swatch-picker.styles.js +0 -77
  201. package/dist/components/forms/switch/switch.class.d.ts +3 -0
  202. package/dist/components/forms/switch/switch.class.js +1 -1
  203. package/dist/components/forms/switch/switch.styles.js +0 -37
  204. package/dist/components/forms/textarea/textarea.styles.js +0 -28
  205. package/dist/components/forms/time-range/time-range.styles.js +12 -84
  206. package/dist/components/forms/token-input/token-input.class.d.ts +23 -9
  207. package/dist/components/forms/token-input/token-input.class.js +1 -1
  208. package/dist/components/forms/token-input/token-input.styles.js +1 -54
  209. package/dist/components/layout/app-rail/app-rail-item.class.js +2 -2
  210. package/dist/components/layout/app-rail/app-rail-item.styles.js +0 -13
  211. package/dist/components/layout/app-rail/app-rail.class.d.ts +5 -0
  212. package/dist/components/layout/app-rail/app-rail.class.js +1 -1
  213. package/dist/components/layout/app-rail/app-rail.styles.js +0 -46
  214. package/dist/components/layout/button-group/button-group.styles.js +0 -6
  215. package/dist/components/layout/card/card.class.d.ts +12 -0
  216. package/dist/components/layout/card/card.styles.js +3 -11
  217. package/dist/components/layout/carousel/carousel.styles.js +0 -1
  218. package/dist/components/layout/command-palette/command-palette.class.d.ts +8 -0
  219. package/dist/components/layout/command-palette/command-palette.class.js +3 -1
  220. package/dist/components/layout/command-palette/command-palette.styles.js +1 -13
  221. package/dist/components/layout/control-group/control-group.styles.js +0 -7
  222. package/dist/components/layout/dashboard-grid/dashboard-grid.styles.js +6 -25
  223. package/dist/components/layout/details/accordion.class.d.ts +13 -0
  224. package/dist/components/layout/details/accordion.class.js +1 -1
  225. package/dist/components/layout/details/details.class.js +1 -1
  226. package/dist/components/layout/details/details.styles.js +0 -12
  227. package/dist/components/layout/dock-panel/dock-panel.styles.js +0 -45
  228. package/dist/components/layout/drilldown-panel/drilldown-panel.class.d.ts +2 -0
  229. package/dist/components/layout/drilldown-panel/drilldown-panel.class.js +2 -2
  230. package/dist/components/layout/drilldown-panel/drilldown-panel.styles.js +0 -4
  231. package/dist/components/layout/filter-bar/filter-bar.class.js +1 -1
  232. package/dist/components/layout/filter-bar/filter-bar.styles.js +0 -9
  233. package/dist/components/layout/menu/menu-item.class.d.ts +5 -0
  234. package/dist/components/layout/menu/menu-item.class.js +1 -1
  235. package/dist/components/layout/menu/menu-item.styles.js +0 -49
  236. package/dist/components/layout/menu/menu-label.styles.js +0 -2
  237. package/dist/components/layout/menu/menu.styles.js +0 -18
  238. package/dist/components/layout/multi-split/multi-split.styles.js +0 -63
  239. package/dist/components/layout/page/page.class.d.ts +4 -0
  240. package/dist/components/layout/page/page.class.js +1 -1
  241. package/dist/components/layout/reorder-list/reorder-item.styles.js +0 -4
  242. package/dist/components/layout/responsive-panel/responsive-panel.styles.js +0 -27
  243. package/dist/components/layout/scroller/scroller.styles.js +0 -20
  244. package/dist/components/layout/segmented/segmented.class.d.ts +7 -1
  245. package/dist/components/layout/segmented/segmented.class.js +1 -1
  246. package/dist/components/layout/segmented/segmented.styles.js +69 -37
  247. package/dist/components/layout/split-panel/split-panel.styles.js +1 -7
  248. package/dist/components/layout/stepper/stepper.class.d.ts +8 -1
  249. package/dist/components/layout/stepper/stepper.class.js +1 -1
  250. package/dist/components/layout/stepper/stepper.styles.js +140 -41
  251. package/dist/components/layout/tab-group/tab-group.class.d.ts +4 -1
  252. package/dist/components/layout/tab-group/tab-group.styles.js +9 -75
  253. package/dist/components/layout/tab-group/tab.styles.js +0 -2
  254. package/dist/components/layout/virtual-list/virtual-list.class.d.ts +4 -4
  255. package/dist/components/layout/virtual-list/virtual-list.class.js +1 -1
  256. package/dist/components/layout/virtual-list/virtual-list.styles.js +0 -68
  257. package/dist/components/layout/widget/widget.class.d.ts +5 -1
  258. package/dist/components/layout/widget/widget.class.js +1 -1
  259. package/dist/components/layout/widget/widget.styles.js +97 -40
  260. package/dist/components/media/animated-image/animated-image.class.d.ts +3 -0
  261. package/dist/components/media/animated-image/animated-image.class.js +1 -1
  262. package/dist/components/media/animated-image/animated-image.styles.js +0 -28
  263. package/dist/components/media/attachment-chip/attachment-chip.class.d.ts +1 -1
  264. package/dist/components/media/attachment-chip/attachment-chip.class.js +1 -1
  265. package/dist/components/media/attachment-chip/attachment-chip.styles.js +0 -31
  266. package/dist/components/media/attachment-trigger/attachment-trigger.class.js +3 -3
  267. package/dist/components/media/attachment-trigger/attachment-trigger.styles.js +0 -40
  268. package/dist/components/media/av-player/av-player.class.d.ts +5 -6
  269. package/dist/components/media/av-player/av-player.class.js +1 -1
  270. package/dist/components/media/av-player/av-player.styles.js +0 -45
  271. package/dist/components/media/avatar/avatar.styles.js +3 -16
  272. package/dist/components/media/file-icon/file-icon.class.d.ts +1 -2
  273. package/dist/components/media/file-icon/file-icon.class.js +1 -1
  274. package/dist/components/media/file-input/file-input.class.d.ts +12 -0
  275. package/dist/components/media/file-input/file-input.styles.js +3 -24
  276. package/dist/components/media/flag/flag.class.d.ts +20 -0
  277. package/dist/components/media/flag/flag.class.js +4 -2
  278. package/dist/components/media/flag/flag.styles.js +7 -1
  279. package/dist/components/media/flag/language-map.d.ts +10 -0
  280. package/dist/components/media/flag/language-map.js +1 -1
  281. package/dist/components/media/image-comparer/image-comparer.styles.js +4 -33
  282. package/dist/components/media/image-viewer/image-viewer.class.js +0 -2
  283. package/dist/components/media/image-viewer/image-viewer.styles.js +7 -27
  284. package/dist/components/media/lightbox/lightbox.class.js +0 -2
  285. package/dist/components/media/lightbox/lightbox.styles.js +0 -21
  286. package/dist/components/media/map/map-loader.d.ts +19 -1
  287. package/dist/components/media/map/map-loader.js +1 -1
  288. package/dist/components/media/map/map.class.d.ts +141 -1
  289. package/dist/components/media/map/map.class.js +15 -3
  290. package/dist/components/media/map/map.styles.js +20 -17
  291. package/dist/components/media/media-card/media-card.class.d.ts +14 -3
  292. package/dist/components/media/media-card/media-card.class.js +1 -1
  293. package/dist/components/media/media-card/media-card.styles.js +2 -28
  294. package/dist/components/media/pan-zoom/pan-zoom.styles.js +0 -3
  295. package/dist/components/media/qr-code/qr-code.class.d.ts +3 -2
  296. package/dist/components/media/qr-code/qr-code.class.js +2 -2
  297. package/dist/components/media/qr-code/qr-code.styles.js +0 -3
  298. package/dist/components/media/sequence-playback/sequence-playback.class.d.ts +2 -0
  299. package/dist/components/media/sequence-playback/sequence-playback.class.js +2 -1
  300. package/dist/components/media/sequence-playback/sequence-playback.styles.js +0 -19
  301. package/dist/components/media/video/video.class.d.ts +23 -2
  302. package/dist/components/media/video/video.class.js +3 -3
  303. package/dist/components/media/video/video.styles.js +4 -2
  304. package/dist/components/media/zoomable-frame/zoomable-frame.class.d.ts +3 -2
  305. package/dist/components/media/zoomable-frame/zoomable-frame.class.js +2 -2
  306. package/dist/components/media/zoomable-frame/zoomable-frame.styles.js +0 -5
  307. package/dist/components/overlays/alert/alert.styles.js +4 -2
  308. package/dist/components/overlays/badge/badge.styles.js +4 -48
  309. package/dist/components/overlays/badge/tag.styles.js +0 -14
  310. package/dist/components/overlays/callout/callout.styles.js +0 -11
  311. package/dist/components/overlays/chip/chip-group.styles.js +0 -18
  312. package/dist/components/overlays/chip/chip.styles.js +6 -69
  313. package/dist/components/overlays/dialog/confirm.d.ts +1 -4
  314. package/dist/components/overlays/dialog/confirm.js +1 -1
  315. package/dist/components/overlays/dialog/dialog.class.d.ts +12 -9
  316. package/dist/components/overlays/dialog/dialog.class.js +1 -1
  317. package/dist/components/overlays/dialog/dialog.styles.js +0 -43
  318. package/dist/components/overlays/drawer/drawer.class.d.ts +2 -2
  319. package/dist/components/overlays/drawer/drawer.styles.js +0 -9
  320. package/dist/components/overlays/empty/empty.styles.js +0 -12
  321. package/dist/components/overlays/kbd/kbd.styles.js +0 -8
  322. package/dist/components/overlays/overlay/dropdown.class.d.ts +1 -6
  323. package/dist/components/overlays/overlay/dropdown.class.js +2 -2
  324. package/dist/components/overlays/overlay/overlay.styles.js +0 -28
  325. package/dist/components/overlays/overlay/popover.class.d.ts +9 -1
  326. package/dist/components/overlays/overlay/popover.class.js +2 -2
  327. package/dist/components/overlays/overlay/tooltip.class.d.ts +10 -0
  328. package/dist/components/overlays/overlay/tooltip.class.js +1 -1
  329. package/dist/components/overlays/popup/popup.class.d.ts +1 -0
  330. package/dist/components/overlays/popup/popup.class.js +1 -1
  331. package/dist/components/overlays/popup/popup.styles.js +0 -15
  332. package/dist/components/overlays/progress/progress-ring.class.d.ts +9 -1
  333. package/dist/components/overlays/progress/progress-ring.class.js +3 -3
  334. package/dist/components/overlays/progress/progress.styles.js +0 -21
  335. package/dist/components/overlays/rating/rating.styles.js +0 -25
  336. package/dist/components/overlays/skeleton/skeleton.styles.js +0 -4
  337. package/dist/components/overlays/spinner/spinner.styles.js +0 -3
  338. package/dist/components/overlays/toast/toast-item.styles.js +3 -45
  339. package/dist/components/retrieval/chunk-inspector/chunk-inspector.styles.js +0 -35
  340. package/dist/components/retrieval/citation-badge/citation-badge.class.d.ts +2 -2
  341. package/dist/components/retrieval/citation-badge/citation-badge.class.js +3 -3
  342. package/dist/components/retrieval/citation-badge/citation-badge.styles.js +0 -20
  343. package/dist/components/retrieval/claim-evidence/claim-evidence.styles.js +0 -8
  344. package/dist/components/retrieval/community-card/community-card.class.d.ts +1 -0
  345. package/dist/components/retrieval/community-card/community-card.styles.js +0 -6
  346. package/dist/components/retrieval/embedding-explorer/embedding-explorer.styles.js +8 -12
  347. package/dist/components/retrieval/entity-card/entity-card.class.d.ts +4 -3
  348. package/dist/components/retrieval/entity-card/entity-card.class.js +1 -1
  349. package/dist/components/retrieval/entity-card/entity-card.styles.js +0 -12
  350. package/dist/components/retrieval/entity-chip/entity-chip.class.d.ts +10 -4
  351. package/dist/components/retrieval/entity-chip/entity-chip.class.js +3 -3
  352. package/dist/components/retrieval/entity-chip/entity-chip.styles.js +6 -9
  353. package/dist/components/retrieval/entity-dossier/entity-dossier.class.d.ts +19 -5
  354. package/dist/components/retrieval/graph/graph.class.d.ts +5 -0
  355. package/dist/components/retrieval/graph/graph.class.js +1 -1
  356. package/dist/components/retrieval/graph/graph.styles.js +0 -30
  357. package/dist/components/retrieval/graph-legend/graph-legend.styles.js +0 -3
  358. package/dist/components/retrieval/ingestion-queue/ingestion-queue.styles.js +0 -25
  359. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.class.d.ts +2 -0
  360. package/dist/components/retrieval/knowledge-base-admin/knowledge-base-admin.styles.js +0 -7
  361. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.d.ts +20 -6
  362. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.class.js +2 -2
  363. package/dist/components/retrieval/knowledge-graph-explorer/knowledge-graph-explorer.styles.js +0 -16
  364. package/dist/components/retrieval/mind-map/mind-map.class.d.ts +5 -3
  365. package/dist/components/retrieval/mind-map/mind-map.class.js +1 -1
  366. package/dist/components/retrieval/mind-map/mind-map.styles.js +0 -2
  367. package/dist/components/retrieval/neighbor-list/neighbor-list.class.d.ts +3 -2
  368. package/dist/components/retrieval/neighbor-list/neighbor-list.class.js +1 -1
  369. package/dist/components/retrieval/neighbor-list/neighbor-list.styles.js +0 -30
  370. package/dist/components/retrieval/node-palette/node-palette.styles.js +0 -11
  371. package/dist/components/retrieval/path-strip/path-strip.styles.js +0 -10
  372. package/dist/components/retrieval/provenance-panel/provenance-panel.class.d.ts +12 -3
  373. package/dist/components/retrieval/provenance-panel/provenance-panel.styles.js +0 -2
  374. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.d.ts +3 -2
  375. package/dist/components/retrieval/rag-eval-dashboard/rag-eval-dashboard.class.js +2 -2
  376. package/dist/components/retrieval/retrieval-results/retrieval-results.styles.js +0 -28
  377. package/dist/components/retrieval/retrieval-search/retrieval-search.styles.js +0 -4
  378. package/dist/components/retrieval/retrieval-trace/retrieval-trace.styles.js +0 -2
  379. package/dist/components/retrieval/source-card/source-card.styles.js +0 -13
  380. package/dist/components/retrieval/source-list/source-list.styles.js +0 -7
  381. package/dist/components/retrieval/source-picker/source-picker.styles.js +0 -7
  382. package/dist/components/utility/copy-button/copy-button.styles.js +0 -10
  383. package/dist/components/utility/diff-view/diff-view.styles.js +0 -14
  384. package/dist/components/utility/export-button/export-button.styles.js +0 -22
  385. package/dist/components/utility/icon/icon.styles.js +0 -6
  386. package/dist/components/utility/json-viewer/json-viewer.styles.js +2 -48
  387. package/dist/components/utility/known-date/known-date.class.d.ts +7 -3
  388. package/dist/components/utility/known-date/known-date.styles.js +10 -51
  389. package/dist/components/utility/live-region/live-region.styles.js +0 -4
  390. package/dist/components/utility/mention-popover/mention-popover.styles.js +0 -25
  391. package/dist/components/utility/poll-status/poll-status.styles.js +0 -4
  392. package/dist/components/utility/random-content/random-content.class.d.ts +22 -0
  393. package/dist/components/utility/random-content/random-content.class.js +3 -2
  394. package/dist/components/utility/random-content/random-content.styles.js +6 -13
  395. package/dist/components/utility/tour/tour.class.d.ts +4 -2
  396. package/dist/components/utility/tour/tour.class.js +3 -3
  397. package/dist/components/utility/tour/tour.styles.js +0 -13
  398. package/dist/components/utility/visually-hidden/visually-hidden.styles.js +0 -5
  399. package/dist/components/viewers/archive-viewer/archive-viewer.class.js +1 -1
  400. package/dist/components/viewers/archive-viewer/archive-viewer.styles.d.ts +2 -2
  401. package/dist/components/viewers/archive-viewer/archive-viewer.styles.js +0 -10
  402. package/dist/components/viewers/csv-viewer/csv-viewer.class.js +1 -1
  403. package/dist/components/viewers/csv-viewer/csv-viewer.styles.js +0 -19
  404. package/dist/components/viewers/dataset-viewer/dataset-viewer.class.js +1 -1
  405. package/dist/components/viewers/dataset-viewer/dataset-viewer.styles.js +0 -15
  406. package/dist/components/viewers/document-compare/document-compare.styles.js +0 -3
  407. package/dist/components/viewers/document-preview/document-preview.styles.js +0 -25
  408. package/dist/components/viewers/document-viewer/document-viewer.class.d.ts +2 -1
  409. package/dist/components/viewers/document-viewer/document-viewer.class.js +1 -1
  410. package/dist/components/viewers/document-viewer/document-viewer.styles.js +0 -5
  411. package/dist/components/viewers/docx-viewer/docx-viewer.styles.js +0 -17
  412. package/dist/components/viewers/ebook-viewer/ebook-viewer.styles.js +0 -4
  413. package/dist/components/viewers/email-viewer/email-viewer.styles.js +0 -7
  414. package/dist/components/viewers/geojson-view/geojson-view.styles.js +0 -5
  415. package/dist/components/viewers/highlight-layer/highlight-layer.styles.js +0 -3
  416. package/dist/components/viewers/notebook-viewer/notebook-viewer.class.js +1 -1
  417. package/dist/components/viewers/notebook-viewer/notebook-viewer.styles.js +0 -38
  418. package/dist/components/viewers/page-rail/page-rail.class.js +1 -1
  419. package/dist/components/viewers/page-rail/page-rail.styles.js +0 -13
  420. package/dist/components/viewers/pdf-viewer/pdf-loader.d.ts +13 -2
  421. package/dist/components/viewers/pdf-viewer/pdf-loader.js +1 -1
  422. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.d.ts +32 -2
  423. package/dist/components/viewers/pdf-viewer/pdf-viewer.class.js +4 -4
  424. package/dist/components/viewers/pdf-viewer/pdf-viewer.styles.js +1 -27
  425. package/dist/components/viewers/pptx-viewer/pptx-viewer.styles.js +0 -3
  426. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.class.js +1 -1
  427. package/dist/components/viewers/spreadsheet-viewer/spreadsheet-viewer.styles.js +0 -14
  428. package/dist/components/viewers/svg-viewer/svg-viewer.styles.js +0 -7
  429. package/dist/components/viewers/xml-viewer/xml-viewer.styles.js +2 -24
  430. package/dist/custom-elements-jsx.d.ts +56 -37
  431. package/dist/events.d.ts +43 -33
  432. package/dist/internal/agent-status-variants.d.ts +18 -0
  433. package/dist/internal/agent-status-variants.js +1 -0
  434. package/dist/internal/announcer.d.ts +8 -3
  435. package/dist/internal/announcer.js +1 -1
  436. package/dist/internal/autoloader-manifest.js +1 -1
  437. package/dist/internal/canvas-color.d.ts +16 -0
  438. package/dist/internal/canvas-color.js +1 -1
  439. package/dist/internal/catalog-picker.d.ts +0 -1
  440. package/dist/internal/catalog-picker.js +1 -1
  441. package/dist/internal/default-strings.generated.d.ts +1 -0
  442. package/dist/internal/default-strings.generated.js +1 -1
  443. package/dist/internal/dev-mode-attribute-warning.d.ts +27 -4
  444. package/dist/internal/dev-mode-attribute-warning.js +1 -1
  445. package/dist/internal/localization-runtime.js +1 -1
  446. package/dist/internal/localization-types.d.ts +1 -1
  447. package/dist/internal/localization.js +1 -1
  448. package/dist/internal/lyra-element.d.ts +13 -0
  449. package/dist/internal/lyra-element.js +1 -1
  450. package/dist/internal/media-controller.js +1 -1
  451. package/dist/internal/package-metadata.d.ts +1 -1
  452. package/dist/internal/package-metadata.js +1 -1
  453. package/dist/internal/scroll-overflow.d.ts +35 -13
  454. package/dist/internal/scroll-overflow.js +1 -1
  455. package/dist/internal/sizes.styles.js +0 -2
  456. package/dist/internal/specialist-tokens.styles.js +6 -11
  457. package/dist/internal/text-highlights.d.ts +4 -1
  458. package/dist/internal/text-highlights.js +1 -1
  459. package/dist/internal/tokens/palette.styles.js +0 -15
  460. package/dist/internal/tokens.styles.js +19 -113
  461. package/dist/lyra.d.ts +8 -5
  462. package/dist/styles/reservations.css +82 -0
  463. package/dist/svelte.d.ts +56 -37
  464. package/dist/translations/ar.js +1 -1
  465. package/dist/translations/de.js +1 -1
  466. package/dist/translations/es.js +1 -1
  467. package/dist/translations/fa.js +1 -1
  468. package/dist/translations/fr.js +1 -1
  469. package/dist/translations/he.js +1 -1
  470. package/dist/translations/ja.js +1 -1
  471. package/dist/translations/pt-BR.js +1 -1
  472. package/dist/translations/ru.js +1 -1
  473. package/dist/translations/zh-CN.js +1 -1
  474. package/dist/vue.d.ts +56 -37
  475. package/llms/components/lr-accordion-item.md +12 -3
  476. package/llms/components/lr-accordion.md +11 -2
  477. package/llms/components/lr-agent-eval-dashboard.md +1 -1
  478. package/llms/components/lr-agent-trace.md +3 -1
  479. package/llms/components/lr-agent-workspace.md +20 -0
  480. package/llms/components/lr-artifact-panel.md +10 -4
  481. package/llms/components/lr-attachment-chip.md +7 -4
  482. package/llms/components/lr-attachment-trigger.md +7 -4
  483. package/llms/components/lr-av-player.md +3 -1
  484. package/llms/components/lr-avatar.md +6 -6
  485. package/llms/components/lr-bar-chart.md +4 -3
  486. package/llms/components/lr-box-plot.md +1 -1
  487. package/llms/components/lr-browser-frame.md +7 -3
  488. package/llms/components/lr-bubble-chart.md +4 -3
  489. package/llms/components/lr-calendar.md +9 -2
  490. package/llms/components/lr-card.md +24 -0
  491. package/llms/components/lr-chart.md +32 -8
  492. package/llms/components/lr-chat-viewport.md +7 -2
  493. package/llms/components/lr-checkbox-group.md +13 -5
  494. package/llms/components/lr-checkbox.md +5 -2
  495. package/llms/components/lr-checkpoint.md +6 -2
  496. package/llms/components/lr-combobox.md +5 -2
  497. package/llms/components/lr-command-palette.md +4 -1
  498. package/llms/components/lr-confirm-bar.md +7 -3
  499. package/llms/components/lr-context-meter.md +12 -11
  500. package/llms/components/lr-conversation-item.md +7 -4
  501. package/llms/components/lr-details.md +11 -2
  502. package/llms/components/lr-dialog.md +15 -10
  503. package/llms/components/lr-dock-panel.md +7 -10
  504. package/llms/components/lr-document-preview.md +6 -1
  505. package/llms/components/lr-document-viewer.md +3 -2
  506. package/llms/components/lr-doughnut-chart.md +4 -3
  507. package/llms/components/lr-drawer.md +3 -3
  508. package/llms/components/lr-entity-card.md +3 -3
  509. package/llms/components/lr-entity-chip.md +1 -1
  510. package/llms/components/lr-entity-dossier.md +4 -1
  511. package/llms/components/lr-file-input.md +2 -2
  512. package/llms/components/lr-flag.md +20 -5
  513. package/llms/components/lr-heatmap.md +28 -0
  514. package/llms/components/lr-histogram.md +3 -1
  515. package/llms/components/lr-icon.md +1 -1
  516. package/llms/components/lr-json-schema-viewer.md +2 -1
  517. package/llms/components/lr-knowledge-graph-explorer.md +8 -3
  518. package/llms/components/lr-known-date.md +4 -2
  519. package/llms/components/lr-line-chart.md +4 -3
  520. package/llms/components/lr-lite-chart.md +16 -6
  521. package/llms/components/lr-map.md +72 -8
  522. package/llms/components/lr-markdown-core.md +3 -2
  523. package/llms/components/lr-media-card.md +28 -12
  524. package/llms/components/lr-message-parts.md +2 -1
  525. package/llms/components/lr-model-select.md +9 -10
  526. package/llms/components/lr-model-settings-panel.md +9 -9
  527. package/llms/components/lr-neighbor-list.md +1 -1
  528. package/llms/components/lr-notebook-viewer.md +6 -3
  529. package/llms/components/lr-option.md +5 -2
  530. package/llms/components/lr-pdf-viewer.md +62 -2
  531. package/llms/components/lr-pie-chart.md +4 -3
  532. package/llms/components/lr-polar-area-chart.md +4 -3
  533. package/llms/components/lr-popover.md +5 -0
  534. package/llms/components/lr-progress-ring.md +8 -1
  535. package/llms/components/lr-prompt-studio.md +1 -1
  536. package/llms/components/lr-provenance-panel.md +4 -2
  537. package/llms/components/lr-qr-code.md +1 -1
  538. package/llms/components/lr-radar-chart.md +4 -3
  539. package/llms/components/lr-rag-eval-dashboard.md +2 -2
  540. package/llms/components/lr-random-content.md +13 -0
  541. package/llms/components/lr-reorder-item.md +6 -1
  542. package/llms/components/lr-reorder-list.md +6 -1
  543. package/llms/components/lr-responsive-panel.md +11 -7
  544. package/llms/components/lr-scatter-chart.md +4 -3
  545. package/llms/components/lr-sequence-strip.md +16 -2
  546. package/llms/components/lr-slider.md +12 -5
  547. package/llms/components/lr-sparkline.md +1 -1
  548. package/llms/components/lr-suggestion-chips.md +7 -2
  549. package/llms/components/lr-swatch-picker.md +5 -5
  550. package/llms/components/lr-switch.md +5 -2
  551. package/llms/components/lr-table.md +30 -4
  552. package/llms/components/lr-terminal.md +3 -1
  553. package/llms/components/lr-thread-list.md +8 -8
  554. package/llms/components/lr-time-input.md +6 -1
  555. package/llms/components/lr-timeline-item.md +24 -0
  556. package/llms/components/lr-timeline.md +25 -1
  557. package/llms/components/lr-token-input.md +7 -2
  558. package/llms/components/lr-tool-approval-dialog.md +7 -8
  559. package/llms/components/lr-tool-call-chip.md +5 -1
  560. package/llms/components/lr-tool-param-form.md +14 -12
  561. package/llms/components/lr-tool-result-dialog.md +11 -9
  562. package/llms/components/lr-tool-result-view.md +7 -6
  563. package/llms/components/lr-tool-select-dialog.md +18 -16
  564. package/llms/components/lr-trace-tree.md +3 -1
  565. package/llms/components/lr-usage-badge.md +4 -1
  566. package/llms/components/lr-video-playlist.md +1 -1
  567. package/llms/components/lr-virtual-list.md +22 -14
  568. package/llms/components/lr-voice-picker.md +8 -5
  569. package/llms/components/lr-widget-renderer.md +3 -3
  570. package/llms/components/lr-widget.md +1 -1
  571. package/llms/components/lr-word-cloud.md +6 -2
  572. package/llms/peers.md +12 -2
  573. package/llms/shared.md +70 -2
  574. package/llms-full.txt +1143 -285
  575. package/package.json +17 -5
  576. package/vscode-css-data.json +37 -2
  577. package/vscode-html-data.json +401 -44
  578. package/web-types.json +299 -55
package/web-types.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@aceshooting/lyra-ui",
4
- "version": "9.1.1",
4
+ "version": "10.0.1",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
@@ -65,7 +65,7 @@
65
65
  },
66
66
  {
67
67
  "name": "lr-accordion-item",
68
- "description": "`<lr-accordion-item>` — an accessible expandable section for `<lr-accordion>`.\n\nThe item deliberately owns only Web Awesome's accordion-item vocabulary. Use `expanded`,\n`label`, and `expand()`/`collapse()`/`toggle()` here; the independent `open`, `summary`, and\n`show()`/`hide()` disclosure vocabulary belongs to `<lr-details>`.\n\nA present host `aria-label`, including an explicitly empty value, names the trigger button.\nWhen absent, the trigger retains its native name-from-content behavior.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n- Deprecated part `base`: Deprecated since `8.2.3`. Use part `::part(accordion-item)`. Removal is not permitted before `10.0.0`. The accordion-item part names the outer wrapper explicitly; base remains on that same node during the compatibility window.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Panel content. |\n| `icon` | Optional decorative expand/collapse icon. Its flattened subtree remains visible but is inert and hidden from assistive technology; the trigger button is the sole action. |\n| `label` | Visible header label; takes priority over the `label` property. Its flattened subtree is inert and hidden from assistive technology, while its accessibility-visible text names the sole trigger button. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `accordion-item` | The outer wrapper. It is the same node as `base`. |\n| `base` | Deprecated compatibility name for the outer wrapper; use `accordion-item`. |\n| `button` | The trigger button. |\n| `content` | Content container inside the panel. |\n| `heading` | Heading around the trigger; omitted for `heading-level=\"none\"`. |\n| `icon` | Expand/collapse icon container. |\n| `label` | Label container. |\n| `panel` | Expandable panel. |\n\n---\n\n**CSS Custom Properties**\n\n- `--easing` — Upstream-compatible alias for `--lr-accordion-item-easing`.\n- `--hide-duration` — Upstream-compatible alias for `--lr-accordion-item-hide-duration`.\n- `--lr-accordion-item-button-active-bg` (default: `color-mix(...)`) — Trigger pressed background.\n- `--lr-accordion-item-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Trigger hover background.\n- `--lr-accordion-item-easing` (default: `var(--lr-easing-standard)`) — Expand/collapse easing.\n- `--lr-accordion-item-filled-bg` (default: `var(--lr-color-surface-raised)`) — Filled item background.\n- `--lr-accordion-item-filled-outlined-bg` (default: `var(--lr-color-surface-raised)`) — Filled-outlined item background.\n- `--lr-accordion-item-hide-duration` (default: `var(--lr-duration-base)`) — Collapse transition duration.\n- `--lr-accordion-item-outlined-bg` (default: `var(--lr-color-surface)`) — Outlined item background.\n- `--lr-accordion-item-show-duration` (default: `var(--lr-duration-base)`) — Expand transition duration.\n- `--lr-accordion-item-spacing` (default: `var(--lr-form-control-padding-inline)`) — Header/content spacing.\n- `--show-duration` — Upstream-compatible alias for `--lr-accordion-item-show-duration`.\n- `--spacing` — Upstream-compatible alias for `--lr-accordion-item-spacing`.",
68
+ "description": "`<lr-accordion-item>` — an accessible expandable section for `<lr-accordion>`.\n\nThe item deliberately owns only Web Awesome's accordion-item vocabulary. Use `expanded`,\n`label`, and `expand()`/`collapse()`/`toggle()` here; the independent `open`, `summary`, and\n`show()`/`hide()` disclosure vocabulary belongs to `<lr-details>`.\n\nA present host `aria-label`, including an explicitly empty value, names the trigger button.\nWhen absent, the trigger retains its native name-from-content behavior.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n- Deprecated part `base`: Deprecated since `8.2.3`. Use part `::part(accordion-item)`. Removal is not permitted before `10.0.0`. The accordion-item part names the outer wrapper explicitly; base remains on that same node during the compatibility window. That version is a policy floor, not a plan: Web Awesome still publishes its own deprecated `base` part on `wa-accordion-item`, and a mirrored tag owes its whole upstream surface, so this alias is removed only when upstream's is.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Panel content. |\n| `icon` | Optional decorative expand/collapse icon. Its flattened subtree remains visible but is inert and hidden from assistive technology; the trigger button is the sole action. |\n| `label` | Visible header label; takes priority over the `label` property. Its flattened subtree is inert and hidden from assistive technology, while its accessibility-visible text names the sole trigger button. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `accordion-item` | The outer wrapper. It is the same node as `base`. |\n| `base` | Deprecated compatibility name for the outer wrapper; use `accordion-item`. |\n| `button` | The trigger button. |\n| `content` | Content container inside the panel. |\n| `heading` | Heading around the trigger; omitted for `heading-level=\"none\"`. |\n| `icon` | Expand/collapse icon container. |\n| `label` | Label container. |\n| `panel` | Expandable panel. |\n\n---\n\n**CSS Custom Properties**\n\n- `--easing` — Upstream-compatible alias for `--lr-accordion-item-easing`.\n- `--hide-duration` — Upstream-compatible alias for `--lr-accordion-item-hide-duration`.\n- `--lr-accordion-item-button-active-bg` (default: `color-mix(...)`) — Trigger pressed background.\n- `--lr-accordion-item-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Trigger hover background.\n- `--lr-accordion-item-easing` (default: `var(--lr-easing-standard)`) — Expand/collapse easing.\n- `--lr-accordion-item-filled-bg` (default: `var(--lr-color-surface-raised)`) — Filled item background.\n- `--lr-accordion-item-filled-outlined-bg` (default: `var(--lr-color-surface-raised)`) — Filled-outlined item background.\n- `--lr-accordion-item-hide-duration` (default: `var(--lr-duration-base)`) — Collapse transition duration.\n- `--lr-accordion-item-outlined-bg` (default: `var(--lr-color-surface)`) — Outlined item background.\n- `--lr-accordion-item-show-duration` (default: `var(--lr-duration-base)`) — Expand transition duration.\n- `--lr-accordion-item-spacing` (default: `var(--lr-form-control-padding-inline)`) — Header/content spacing.\n- `--show-duration` — Upstream-compatible alias for `--lr-accordion-item-show-duration`.\n- `--spacing` — Upstream-compatible alias for `--lr-accordion-item-spacing`.",
69
69
  "attributes": [
70
70
  {
71
71
  "name": "appearance",
@@ -364,7 +364,7 @@
364
364
  },
365
365
  {
366
366
  "name": "lr-agent-workspace",
367
- "description": "`<lr-agent-workspace>` — a responsive, controlled shell for an AI conversation and its\nsupporting agent state. It renders the transcript and composer in the main pane, and composes\nexisting run, tool, retrieval, grounding, and context primitives in an optional details pane.\n\nThe component performs no network requests, model calls, retrieval, or persistence. Assign new\ndata to the public properties as the host application receives updates. The `messages` fallback\nrenders ordered `message.parts` through `<lr-message-parts>` when supplied, otherwise sanitized\nMarkdown from the legacy `message.text`; applications can replace the entire region with the\n`messages` slot. The `details` slot similarly replaces the built-in details pane while keeping\nthe responsive shell. Empty and duplicate message ids normalize first-wins before the bounded\nwindow is chosen; at most the latest 500 valid messages are materialized. Applications needing\na larger retained transcript can supply a virtualized `messages` slot.\nComposer value, follow state, and retrieval selection are request-only:\nchild events are forwarded, but the workspace never writes those public\nproperties. The host applies accepted state back to the component.\n\nPublic collection properties take bounded, clone-owned readonly snapshots. Create a new\ncollection and reassign it after changes; mutating the assigned array does not update the view.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.2.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `composer` | Replaces the built-in plain-frame `<lr-chat-composer>`; a supplied composer keeps its own frame. |\n| `details` | Replaces the built-in run/tool/retrieval/grounding/context details pane. |\n| `header-actions` | Header actions such as model selection, settings, or export controls. |\n| `messages` | Replaces the data-driven transcript message list. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root workspace wrapper. |\n| `body` | The main conversation/details layout. |\n| `composer` | The composer region. |\n| `composer-input` | The built-in `<lr-chat-composer>`. |\n| `conversation` | The main transcript pane. |\n| `details` | The responsive details pane. |\n| `details-content` | The built-in details content wrapper. |\n| `header` | The workspace heading and header-actions slot. |\n| `header-actions` | The header-actions slot wrapper. |\n| `heading` | The visible workspace heading. |\n| `message` | Each data-driven transcript message. |\n| `messages` | Each data-driven transcript message (also exposed as `message`). |\n| `messages-empty` | The empty transcript state. |\n| `section` | A built-in run, tools, retrieval, grounding, or context section. |\n| `section-heading` | A built-in details section heading. |\n| `viewport` | The composed `<lr-chat-viewport>`. |",
367
+ "description": "`<lr-agent-workspace>` — a responsive, controlled shell for an AI conversation and its\nsupporting agent state. It renders the transcript and composer in the main pane, and composes\nexisting run, tool, retrieval, grounding, and context primitives in an optional details pane.\n\nThe component performs no network requests, model calls, retrieval, or persistence. Assign new\ndata to the public properties as the host application receives updates. The `messages` fallback\nrenders ordered `message.parts` through `<lr-message-parts>` when supplied, otherwise sanitized\nMarkdown from the legacy `message.text`; applications can replace the entire region with the\n`messages` slot. The `details` slot similarly replaces the built-in details pane while keeping\nthe responsive shell. Empty and duplicate message ids normalize first-wins before the bounded\nwindow is chosen; at most the latest 500 valid messages are materialized. Applications needing\na larger retained transcript can supply a virtualized `messages` slot.\nComposer value, follow state, and retrieval selection are request-only:\nchild events are forwarded, but the workspace never writes those public\nproperties. The host applies accepted state back to the component.\n\nPublic collection properties take bounded, clone-owned readonly snapshots. Create a new\ncollection and reassign it after changes; mutating the assigned array does not update the view.\n\n**The transcript is the only region that scrolls.** `[part='base']` is a three-row grid —\nheader, conversation, composer — where only the middle row can shrink, so the composed\n`<lr-chat-viewport>` owns the scrolling and the chrome rows stay put. Header and composer\ncontent are therefore sized by their own content: give the workspace less block-size than they\nneed and the conversation row collapses to zero first, after which the chrome is clipped with no\nscrollbar. That only happens with unusually large slotted chrome — a very tall `header-actions`\ntoolbar, or a `composer` replacement much taller than the built-in one — and the fix belongs to\nwhoever supplied it, through the public parts:\n`lr-agent-workspace::part(header) { max-block-size: 4rem; overflow: auto; }` (the same applies\nto `::part(composer)`). No component-owned custom property duplicates that, because a\n`::part()` rule from the consumer's tree already wins over the shadow stylesheet regardless of\nspecificity and can set the cap and the overflow together.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.2.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `composer` | Replaces the built-in plain-frame `<lr-chat-composer>`; a supplied composer keeps its own frame. |\n| `details` | Replaces the built-in run/tool/retrieval/grounding/context details pane. |\n| `header-actions` | Header actions such as model selection, settings, or export controls. |\n| `messages` | Replaces the data-driven transcript message list. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root workspace wrapper. |\n| `body` | The main conversation/details layout. |\n| `composer` | The composer region. |\n| `composer-input` | The built-in `<lr-chat-composer>`. |\n| `conversation` | The main transcript pane. |\n| `details` | The responsive details pane. |\n| `details-content` | The built-in details content wrapper. |\n| `header` | The workspace heading and header-actions slot. |\n| `header-actions` | The header-actions slot wrapper. |\n| `heading` | The visible workspace heading. |\n| `message` | Each data-driven transcript message. |\n| `messages` | Each data-driven transcript message (also exposed as `message`). |\n| `messages-empty` | The empty transcript state. |\n| `section` | A built-in run, tools, retrieval, grounding, or context section. |\n| `section-heading` | A built-in details section heading. |\n| `viewport` | The composed `<lr-chat-viewport>`. |",
368
368
  "attributes": [
369
369
  {
370
370
  "name": "aria-label",
@@ -1771,6 +1771,10 @@
1771
1771
  "name": "lr-bar-chart",
1772
1772
  "description": "`<lr-bar-chart>` — `<lr-chart>` with a `\"bar\"` default. Like the mirrored Web Awesome tag,\nits writable `type` still accepts the complete chart-type vocabulary.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | An optional `<script type=\"application/json\">` containing a Chart.js configuration. |\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. Use this escape hatch for a complete paginated or virtualized alternative when the generated 1,000-record sample is insufficient. |\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| `data-truncation` | Explanation shown when the generated accessible alternative samples a data set larger than its 1,000-record ceiling. |\n| `description` | The accessible chart summary. |\n| `error` | Static visible error shown instead of `canvas` when the optional `chart.js` peer dependency is not installed; its transition is announced through a shared light-DOM alert. |\n| `feature-warning` | Static nonfatal warning when a requested optional feature peer is unavailable while the core chart remains usable. |\n| `legend` | The wrapping DOM legend, rendered unless `withoutLegend` is set. |\n| `legend-item` | A keyboard-operable series visibility toggle. |\n| `legend-item-hidden` | Added to a `legend-item` while its dataset is hidden. |\n| `legend-swatch` | The resolved series-color swatch in a legend item. |\n| `notices` | Wrapper for nonfatal feature warnings and generated-data truncation notices. |\n| `plot` | The fixed-height canvas/overlay region. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--border-color-1` (default: `var(--lr-color-chart-1)`) — First dataset border color.\n- `--border-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset border color.\n- `--border-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset border color.\n- `--border-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset border color.\n- `--border-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset border color.\n- `--border-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset border color.\n- `--border-radius` (default: `var(--lr-radius)`) — Dataset element corner radius.\n- `--border-width` (default: `var(--lr-border-width-thin)`) — Dataset element border width.\n- `--fill-color-1` (default: `var(--lr-color-chart-1)`) — First dataset fill color.\n- `--fill-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset fill color.\n- `--fill-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset fill color.\n- `--fill-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset fill color.\n- `--fill-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset fill color.\n- `--fill-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset fill color.\n- `--grid-border-width` (default: `var(--lr-border-width-thin)`) — Axis and grid line width.\n- `--grid-color` (default: `var(--lr-chart-grid-color)`) — Grid line color.\n- `--line-border-width` (default: `var(--lr-border-width-medium)`) — Line dataset stroke width.\n- `--lr-chart-canvas-hover-outline-width` (default: `var(--lr-border-width-thin)`) — Width of the `[part='canvas']` hover-state outline (its color is `--lr-chart-grid-color`, above).\n- `--lr-chart-data-table-button-active-bg` — Pressed background of an actionable generated- table value; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-data-table-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of an actionable generated-table value.\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-height` (default: `var(--lr-size-280px)`) — The plot region's `block-size` and the host's minimum block size. A visible data table or wrapping DOM legend grows the host in normal flow instead of overlapping following content. `height` supplies a private fallback; this public token always wins when a consumer sets it.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-item-active-bg` — Pressed background of a legend visibility button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-legend-item-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of a legend visibility button.\n- `--lr-chart-legend-side-max` (default: `var(--lr-size-15rem)`) — Maximum inline size reserved for a side-positioned DOM legend; the track is also capped at one third of the chart allocation.\n- `--lr-chart-pattern-step` (default: `var(--lr-space-2xs)`) — Tile size of the texture painted on `[part='legend-swatch']` while `forced-colors: active` matches, where every series collapses to one system color and the stripe/crosshatch pattern becomes the only channel keeping series apart. Declared on the swatch part rather than the host; the stripe width within a tile stays `--lr-border-width-thin`, so a larger step spaces the stripes further apart.\n- `--lr-chart-reset-zoom-button-active-bg` — Pressed background of the reset-zoom button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-reset-zoom-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of the reset-zoom button.\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-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.\n- `--point-radius` (default: `var(--lr-space-2xs)`) — Line/scatter point radius.",
1773
1773
  "attributes": [
1774
+ {
1775
+ "name": "annotations",
1776
+ "description": "Declarative reference lines and shaded bands — a threshold, an event year, a regime change, a\nhighlighted period. Each entry marks either a single `value` or a `from`/`to` range on `axis`\n(default `'y'`), with an optional `label` and semantic `tone`.\n\nNeeds the optional `chartjs-plugin-annotation` peer, loaded on first actual demand so a page\nwith no annotated charts never downloads it. The plugin is registered globally, like\n`chartjs-plugin-zoom` and unlike `chartjs-plugin-datalabels`: it draws nothing unless a chart\nsupplies annotation options, so the registration is unobservable to charts that set none, and\nregistration is also what installs the plugin's own element defaults. Without the peer\ninstalled the chart still renders and a single console warning explains the no-op — the same\nfail-closed contract `data-labels` uses.\n\nEntries are included in the generated accessible description, mirroring `lr-heatmap`.\n\nType: `readonly LyraChartAnnotation[]` \nDefault: `[]`"
1777
+ },
1774
1778
  {
1775
1779
  "name": "area",
1776
1780
  "description": "Chart-wide default fill-under-line setting for line-type series; a series's own `LyraChartSeries.fill` overrides it.\n\nType: `boolean` \nDefault: `false`",
@@ -1875,6 +1879,16 @@
1875
1879
  "name": "plugins",
1876
1880
  "description": "Chart.js plugins attached to this chart instance.\n\nType: `LyraChartPlugin[]` \nDefault: `[]`"
1877
1881
  },
1882
+ {
1883
+ "name": "scale-type",
1884
+ "description": "Scale type for the **value** axis (the categorical axis is unaffected). `'logarithmic'` plots\na dataset spanning several orders of magnitude honestly, where a linear axis collapses\neverything below the maximum into the baseline. Inherited by `lr-line-chart`,\n`lr-scatter-chart` and `lr-bar-chart`.\n\nA logarithmic axis cannot represent zero or negative values (`log(0)` is `-Infinity`), so\n`beginAtZero` is not forwarded in that mode -- Chart.js would otherwise be handed a bound it\ncannot place. Non-positive data points are dropped by Chart.js's own log scale.\n\nType: `LyraChartScaleType` \nDefault: `'linear'`",
1885
+ "value": {
1886
+ "type": [
1887
+ "'linear'",
1888
+ "'logarithmic'"
1889
+ ]
1890
+ }
1891
+ },
1878
1892
  {
1879
1893
  "name": "show-data-table",
1880
1894
  "description": "Makes the generated data table visible; it remains screen-reader available when false.\n\nType: `boolean` \nDefault: `false`",
@@ -2228,6 +2242,10 @@
2228
2242
  "name": "lr-bubble-chart",
2229
2243
  "description": "`<lr-bubble-chart>` — `<lr-chart>` with a `\"bubble\"` default and the mirrored writable type. Feed\npoints via `LyraChartSeries.points`, whose exported `LyraChartPoint` type carries\n`x`/`y`, optional bubble `r` (radius), and an optional per-point `label`.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | An optional `<script type=\"application/json\">` containing a Chart.js configuration. |\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. Use this escape hatch for a complete paginated or virtualized alternative when the generated 1,000-record sample is insufficient. |\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| `data-truncation` | Explanation shown when the generated accessible alternative samples a data set larger than its 1,000-record ceiling. |\n| `description` | The accessible chart summary. |\n| `error` | Static visible error shown instead of `canvas` when the optional `chart.js` peer dependency is not installed; its transition is announced through a shared light-DOM alert. |\n| `feature-warning` | Static nonfatal warning when a requested optional feature peer is unavailable while the core chart remains usable. |\n| `legend` | The wrapping DOM legend, rendered unless `withoutLegend` is set. |\n| `legend-item` | A keyboard-operable series visibility toggle. |\n| `legend-item-hidden` | Added to a `legend-item` while its dataset is hidden. |\n| `legend-swatch` | The resolved series-color swatch in a legend item. |\n| `notices` | Wrapper for nonfatal feature warnings and generated-data truncation notices. |\n| `plot` | The fixed-height canvas/overlay region. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--border-color-1` (default: `var(--lr-color-chart-1)`) — First dataset border color.\n- `--border-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset border color.\n- `--border-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset border color.\n- `--border-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset border color.\n- `--border-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset border color.\n- `--border-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset border color.\n- `--border-radius` (default: `var(--lr-radius)`) — Dataset element corner radius.\n- `--border-width` (default: `var(--lr-border-width-thin)`) — Dataset element border width.\n- `--fill-color-1` (default: `var(--lr-color-chart-1)`) — First dataset fill color.\n- `--fill-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset fill color.\n- `--fill-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset fill color.\n- `--fill-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset fill color.\n- `--fill-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset fill color.\n- `--fill-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset fill color.\n- `--grid-border-width` (default: `var(--lr-border-width-thin)`) — Axis and grid line width.\n- `--grid-color` (default: `var(--lr-chart-grid-color)`) — Grid line color.\n- `--line-border-width` (default: `var(--lr-border-width-medium)`) — Line dataset stroke width.\n- `--lr-chart-canvas-hover-outline-width` (default: `var(--lr-border-width-thin)`) — Width of the `[part='canvas']` hover-state outline (its color is `--lr-chart-grid-color`, above).\n- `--lr-chart-data-table-button-active-bg` — Pressed background of an actionable generated- table value; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-data-table-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of an actionable generated-table value.\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-height` (default: `var(--lr-size-280px)`) — The plot region's `block-size` and the host's minimum block size. A visible data table or wrapping DOM legend grows the host in normal flow instead of overlapping following content. `height` supplies a private fallback; this public token always wins when a consumer sets it.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-item-active-bg` — Pressed background of a legend visibility button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-legend-item-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of a legend visibility button.\n- `--lr-chart-legend-side-max` (default: `var(--lr-size-15rem)`) — Maximum inline size reserved for a side-positioned DOM legend; the track is also capped at one third of the chart allocation.\n- `--lr-chart-pattern-step` (default: `var(--lr-space-2xs)`) — Tile size of the texture painted on `[part='legend-swatch']` while `forced-colors: active` matches, where every series collapses to one system color and the stripe/crosshatch pattern becomes the only channel keeping series apart. Declared on the swatch part rather than the host; the stripe width within a tile stays `--lr-border-width-thin`, so a larger step spaces the stripes further apart.\n- `--lr-chart-reset-zoom-button-active-bg` — Pressed background of the reset-zoom button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-reset-zoom-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of the reset-zoom button.\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-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.\n- `--point-radius` (default: `var(--lr-space-2xs)`) — Line/scatter point radius.",
2230
2244
  "attributes": [
2245
+ {
2246
+ "name": "annotations",
2247
+ "description": "Declarative reference lines and shaded bands — a threshold, an event year, a regime change, a\nhighlighted period. Each entry marks either a single `value` or a `from`/`to` range on `axis`\n(default `'y'`), with an optional `label` and semantic `tone`.\n\nNeeds the optional `chartjs-plugin-annotation` peer, loaded on first actual demand so a page\nwith no annotated charts never downloads it. The plugin is registered globally, like\n`chartjs-plugin-zoom` and unlike `chartjs-plugin-datalabels`: it draws nothing unless a chart\nsupplies annotation options, so the registration is unobservable to charts that set none, and\nregistration is also what installs the plugin's own element defaults. Without the peer\ninstalled the chart still renders and a single console warning explains the no-op — the same\nfail-closed contract `data-labels` uses.\n\nEntries are included in the generated accessible description, mirroring `lr-heatmap`.\n\nType: `readonly LyraChartAnnotation[]` \nDefault: `[]`"
2248
+ },
2231
2249
  {
2232
2250
  "name": "area",
2233
2251
  "description": "Chart-wide default fill-under-line setting for line-type series; a series's own `LyraChartSeries.fill` overrides it.\n\nType: `boolean` \nDefault: `false`",
@@ -2332,6 +2350,16 @@
2332
2350
  "name": "plugins",
2333
2351
  "description": "Chart.js plugins attached to this chart instance.\n\nType: `LyraChartPlugin[]` \nDefault: `[]`"
2334
2352
  },
2353
+ {
2354
+ "name": "scale-type",
2355
+ "description": "Scale type for the **value** axis (the categorical axis is unaffected). `'logarithmic'` plots\na dataset spanning several orders of magnitude honestly, where a linear axis collapses\neverything below the maximum into the baseline. Inherited by `lr-line-chart`,\n`lr-scatter-chart` and `lr-bar-chart`.\n\nA logarithmic axis cannot represent zero or negative values (`log(0)` is `-Infinity`), so\n`beginAtZero` is not forwarded in that mode -- Chart.js would otherwise be handed a bound it\ncannot place. Non-positive data points are dropped by Chart.js's own log scale.\n\nType: `LyraChartScaleType` \nDefault: `'linear'`",
2356
+ "value": {
2357
+ "type": [
2358
+ "'linear'",
2359
+ "'logarithmic'"
2360
+ ]
2361
+ }
2362
+ },
2335
2363
  {
2336
2364
  "name": "show-data-table",
2337
2365
  "description": "Makes the generated data table visible; it remains screen-reader available when false.\n\nType: `boolean` \nDefault: `false`",
@@ -2724,7 +2752,7 @@
2724
2752
  },
2725
2753
  {
2726
2754
  "name": "lr-calendar",
2727
- "description": "`<lr-calendar>` — responsive month calendar with event markers and agenda mode.\n\nMonth-view event markers are real buttons inside each focusable gridcell, so\nkeyboard users can activate individual events without switching views.\nAgenda view renders the same events as full-width buttons.\n\nPublic collection properties take bounded, clone-owned readonly snapshots. Create a new\ncollection and reassign it after changes; mutating the assigned array does not update the view.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\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` | Either month-navigation button. |\n| `nav-glyph` | The previous/next chevron glyph, mirrored under RTL. |\n| `navigation` | Wrapper around both month-navigation controls and the title. |\n| `next-button` | Next-month button. |\n| `previous-button` | Previous-month button. |\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-outside-bg` (default: `var(--lr-color-surface)`) — Background of an adjacent-month day cell.\n- `--lr-calendar-day-outside-color` (default: `var(--lr-color-text-quiet)`) — Text color of an adjacent-month day cell.\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.\n- `--lr-calendar-day-today-outline-color` (default: `var(--lr-color-brand)`) — Outline color of today's day cell.",
2755
+ "description": "`<lr-calendar>` — responsive month calendar with event markers and agenda mode.\n\nMonth-view event markers are real buttons inside each focusable gridcell, so\nkeyboard users can activate individual events without switching views.\nAgenda view renders the same events as full-width buttons.\n\nPublic collection properties take bounded, clone-owned readonly snapshots. Create a new\ncollection and reassign it after changes; mutating the assigned array does not update the view.\n\n`firstDayOfWeek` defaults to `'auto'`, deriving the week start from `effectiveLocale` (via the\nshared `resolveFirstDayOfWeek()` contract also used by `lr-date-picker`/`lr-date-input`), and\nalso accepts one of the shared weekday-name tokens (`'sun'` through `'sat'`) for an explicit,\nlocale-independent week start.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\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` | Either month-navigation button. |\n| `nav-glyph` | The previous/next chevron glyph, mirrored under RTL. |\n| `navigation` | Wrapper around both month-navigation controls and the title. |\n| `next-button` | Next-month button. |\n| `previous-button` | Previous-month button. |\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-outside-bg` (default: `var(--lr-color-surface)`) — Background of an adjacent-month day cell.\n- `--lr-calendar-day-outside-color` (default: `var(--lr-color-text-quiet)`) — Text color of an adjacent-month day cell.\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.\n- `--lr-calendar-day-today-outline-color` (default: `var(--lr-color-brand)`) — Outline color of today's day cell.",
2728
2756
  "attributes": [
2729
2757
  {
2730
2758
  "name": "aria-label",
@@ -2737,10 +2765,17 @@
2737
2765
  },
2738
2766
  {
2739
2767
  "name": "first-day-of-week",
2740
- "description": "Type: `number` \nDefault: `1`",
2768
+ "description": "Type: `LyraCalendarFirstDayOfWeek` \nDefault: `'auto'`",
2741
2769
  "value": {
2742
2770
  "type": [
2743
- "number"
2771
+ "'auto'",
2772
+ "'sun'",
2773
+ "'mon'",
2774
+ "'tue'",
2775
+ "'wed'",
2776
+ "'thu'",
2777
+ "'fri'",
2778
+ "'sat'"
2744
2779
  ]
2745
2780
  }
2746
2781
  },
@@ -2949,7 +2984,7 @@
2949
2984
  },
2950
2985
  {
2951
2986
  "name": "lr-card",
2952
- "description": "`<lr-card>` — a generic, styled bordered content container: the \"small bordered surface with\npadding\" idiom common to hero highlights, clickable grid tiles, and management-list items. A\ndirect `<lr-*>` counterpart to `<wa-card>`'s contract, staying slot-compatible with\n`lr-result-card` where they overlap.\n\nThe header is allocation-responsive: long or translated header content can shrink and wrap,\nand the actions group moves onto another line when both no longer fit side by side.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The card body. |\n| `actions` | Horizontal-card actions; retained as the legacy header-actions alias vertically. |\n| `footer` | Footer content, rendered below the body. |\n| `footer-actions` | Controls rendered alongside the vertical footer. |\n| `header` | Header row content, rendered above the body. |\n| `header-actions` | Controls rendered alongside the vertical header. |\n| `image` | Shoelace-compatible alias for `media`. |\n| `media` | Media content, rendered above the header or at logical start when horizontal. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | Wrapper around the `actions` and `header-actions` slots. Hidden entirely when both are empty. |\n| `activation-button` | The native whole-card action, rendered while `actionable` without `href`. It is a sibling of slotted controls, so actionable descendants are never nested inside another actionable role. |\n| `base` | The outer container (a `<div>`, or a stretched `<a>` behind the consumer slots when `href` is set). |\n| `body` | Wrapper around the default slot. |\n| `footer` | Wrapper around the `footer` and `footer-actions` slots. Hidden entirely when both are empty. |\n| `header` | Wrapper around the `header` slot and `actions`. Hidden entirely when both are empty. |\n| `image` | Shoelace-compatible alias on the same wrapper as `media`. |\n| `media` | Wrapper around the `media` and `image` slots. Hidden entirely when empty. |\n\n---\n\n**CSS Custom Properties**\n\n- `--border-color` (default: `var(--lr-color-border)`) — Shoelace-compatible border color.\n- `--border-radius` (default: `var(--lr-radius)`) — Shoelace-compatible corner radius.\n- `--border-width` (default: `var(--lr-border-width-thin)`) — Shoelace-compatible border width.\n- `--lr-card-accent-border-color` (default: `var(--lr-color-brand)`) — Accent stripe color.\n- `--lr-card-filled-bg` (default: `var(--lr-color-brand-quiet)`) — Filled appearance background.\n- `--lr-card-filled-outlined-bg` (default: `var(--lr-color-brand-quiet)`) — Filled-outlined background.\n- `--lr-card-interactive-active-border-color` (default: `var(--lr-color-brand)`) — Interactive pressed border.\n- `--lr-card-interactive-active-overlay` — Interactive pressed overlay; defaults to the former transparent active mix.\n- `--lr-card-interactive-hover-border-color` (default: `var(--lr-color-brand)`) — Interactive hover border.\n- `--padding` (default: `var(--spacing,var(--lr-space-m))`) — Shoelace-compatible section padding.\n- `--spacing` (default: `var(--lr-space-m)`) — Space around and between card sections.",
2987
+ "description": "`<lr-card>` — a generic, styled bordered content container: the \"small bordered surface with\npadding\" idiom common to hero highlights, clickable grid tiles, and management-list items. A\ndirect `<lr-*>` counterpart to `<wa-card>`'s contract, staying slot-compatible with\n`lr-result-card` where they overlap.\n\nThe header is allocation-responsive: long or translated header content can shrink and wrap,\nand the actions group moves onto another line when both no longer fit side by side.\n\n**Overflow is clipped, deliberately, and the card never picks a scroll owner for you.**\n`[part='base']` stretches to the host's allocated block-size and clips its overflow — that clip\nis what keeps a full-bleed `media`/`image` child inside the rounded border. So a card given a\n*definite* allocation (a fixed grid row, an explicit `block-size`) clips body content taller\nthan that allocation rather than growing or scrolling; in an auto-sized row it simply grows and\nnothing is clipped. Neither upstream card exposes an overflow, block-size, or scroll hook, and\nthis one deliberately adds none either: the public `body` part already carries the whole\ndecision, and a `::part()` rule from the consumer's tree wins over the shadow stylesheet\nregardless of specificity. A fixed-height tile whose body must hold more content therefore says\nso itself — `lr-card::part(body) { overflow: auto; }` — which also leaves `max-block-size`,\n`scrollbar-gutter`, and `overscroll-behavior` in the consumer's hands.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The card body. |\n| `actions` | Horizontal-card actions; retained as the legacy header-actions alias vertically. |\n| `footer` | Footer content, rendered below the body. |\n| `footer-actions` | Controls rendered alongside the vertical footer. |\n| `header` | Header row content, rendered above the body. |\n| `header-actions` | Controls rendered alongside the vertical header. |\n| `image` | Shoelace-compatible alias for `media`. |\n| `media` | Media content, rendered above the header or at logical start when horizontal. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `actions` | Wrapper around the `actions` and `header-actions` slots. Hidden entirely when both are empty. |\n| `activation-button` | The native whole-card action, rendered while `actionable` without `href`. It is a sibling of slotted controls, so actionable descendants are never nested inside another actionable role. |\n| `base` | The outer container (a `<div>`, or a stretched `<a>` behind the consumer slots when `href` is set). |\n| `body` | Wrapper around the default slot. |\n| `footer` | Wrapper around the `footer` and `footer-actions` slots. Hidden entirely when both are empty. |\n| `header` | Wrapper around the `header` slot and `actions`. Hidden entirely when both are empty. |\n| `image` | Shoelace-compatible alias on the same wrapper as `media`. |\n| `media` | Wrapper around the `media` and `image` slots. Hidden entirely when empty. |\n\n---\n\n**CSS Custom Properties**\n\n- `--border-color` (default: `var(--lr-color-border)`) — Shoelace-compatible border color.\n- `--border-radius` (default: `var(--lr-radius)`) — Shoelace-compatible corner radius.\n- `--border-width` (default: `var(--lr-border-width-thin)`) — Shoelace-compatible border width.\n- `--lr-card-accent-border-color` (default: `var(--lr-color-brand)`) — Accent stripe color.\n- `--lr-card-filled-bg` (default: `var(--lr-color-brand-quiet)`) — Filled appearance background.\n- `--lr-card-filled-outlined-bg` (default: `var(--lr-color-brand-quiet)`) — Filled-outlined background.\n- `--lr-card-interactive-active-border-color` (default: `var(--lr-color-brand)`) — Interactive pressed border.\n- `--lr-card-interactive-active-overlay` — Interactive pressed overlay; defaults to the former transparent active mix.\n- `--lr-card-interactive-hover-border-color` (default: `var(--lr-color-brand)`) — Interactive hover border.\n- `--padding` (default: `var(--spacing,var(--lr-space-m))`) — Shoelace-compatible section padding.\n- `--spacing` (default: `var(--lr-space-m)`) — Space around and between card sections.",
2953
2988
  "attributes": [
2954
2989
  {
2955
2990
  "name": "actionable",
@@ -3197,6 +3232,10 @@
3197
3232
  "name": "lr-chart",
3198
3233
  "description": "`<lr-chart>` — the core Chart.js wrapper used directly and by the typed\nChart.js tags plus `<lr-histogram>`. `<lr-lite-chart>` and `<lr-box-plot>`\nare independent implementations. Requires the optional peer dep `chart.js`; `chartjs-plugin-zoom`\n(for `zoom`) and `chartjs-plugin-datalabels` (for `data-labels`/`stack-totals`)\nare further optional peers loaded only on demand.\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 `LyraChartSeries`-based\n`datasets`/`labels`/`type`/`withoutLegend`/`xLabel`/`yLabel`/`zoom` attributes\nbelow are the simplified surface (compatible with WA's `type`, `xLabel`,\n`yLabel`, `withoutLegend`, etc.), and the additional\n`config` property is the raw-passthrough escape hatch — a\n`LyraChartConfiguration` deep-merged over the generated config in\n`buildConfig()`, mirroring WA's `config` property without discarding the\n`LyraChartSeries` shape the rest of this component family (subclasses, box-plot,\nhistogram) is built on.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | An optional `<script type=\"application/json\">` containing a Chart.js configuration. |\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. Use this escape hatch for a complete paginated or virtualized alternative when the generated 1,000-record sample is insufficient. |\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| `data-truncation` | Explanation shown when the generated accessible alternative samples a data set larger than its 1,000-record ceiling. |\n| `description` | The accessible chart summary. |\n| `error` | Static visible error shown instead of `canvas` when the optional `chart.js` peer dependency is not installed; its transition is announced through a shared light-DOM alert. |\n| `feature-warning` | Static nonfatal warning when a requested optional feature peer is unavailable while the core chart remains usable. |\n| `legend` | The wrapping DOM legend, rendered unless `withoutLegend` is set. |\n| `legend-item` | A keyboard-operable series visibility toggle. |\n| `legend-item-hidden` | Added to a `legend-item` while its dataset is hidden. |\n| `legend-swatch` | The resolved series-color swatch in a legend item. |\n| `notices` | Wrapper for nonfatal feature warnings and generated-data truncation notices. |\n| `plot` | The fixed-height canvas/overlay region. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--border-color-1` (default: `var(--lr-color-chart-1)`) — First dataset border color.\n- `--border-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset border color.\n- `--border-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset border color.\n- `--border-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset border color.\n- `--border-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset border color.\n- `--border-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset border color.\n- `--border-radius` (default: `var(--lr-radius)`) — Dataset element corner radius.\n- `--border-width` (default: `var(--lr-border-width-thin)`) — Dataset element border width.\n- `--fill-color-1` (default: `var(--lr-color-chart-1)`) — First dataset fill color.\n- `--fill-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset fill color.\n- `--fill-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset fill color.\n- `--fill-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset fill color.\n- `--fill-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset fill color.\n- `--fill-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset fill color.\n- `--grid-border-width` (default: `var(--lr-border-width-thin)`) — Axis and grid line width.\n- `--grid-color` (default: `var(--lr-chart-grid-color)`) — Grid line color.\n- `--line-border-width` (default: `var(--lr-border-width-medium)`) — Line dataset stroke width.\n- `--lr-chart-canvas-hover-outline-width` (default: `var(--lr-border-width-thin)`) — Width of the `[part='canvas']` hover-state outline (its color is `--lr-chart-grid-color`, above).\n- `--lr-chart-data-table-button-active-bg` — Pressed background of an actionable generated- table value; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-data-table-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of an actionable generated-table value.\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-height` (default: `var(--lr-size-280px)`) — The plot region's `block-size` and the host's minimum block size. A visible data table or wrapping DOM legend grows the host in normal flow instead of overlapping following content. `height` supplies a private fallback; this public token always wins when a consumer sets it.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-item-active-bg` — Pressed background of a legend visibility button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-legend-item-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of a legend visibility button.\n- `--lr-chart-legend-side-max` (default: `var(--lr-size-15rem)`) — Maximum inline size reserved for a side-positioned DOM legend; the track is also capped at one third of the chart allocation.\n- `--lr-chart-pattern-step` (default: `var(--lr-space-2xs)`) — Tile size of the texture painted on `[part='legend-swatch']` while `forced-colors: active` matches, where every series collapses to one system color and the stripe/crosshatch pattern becomes the only channel keeping series apart. Declared on the swatch part rather than the host; the stripe width within a tile stays `--lr-border-width-thin`, so a larger step spaces the stripes further apart.\n- `--lr-chart-reset-zoom-button-active-bg` — Pressed background of the reset-zoom button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-reset-zoom-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of the reset-zoom button.\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-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.\n- `--point-radius` (default: `var(--lr-space-2xs)`) — Line/scatter point radius.",
3199
3234
  "attributes": [
3235
+ {
3236
+ "name": "annotations",
3237
+ "description": "Declarative reference lines and shaded bands — a threshold, an event year, a regime change, a\nhighlighted period. Each entry marks either a single `value` or a `from`/`to` range on `axis`\n(default `'y'`), with an optional `label` and semantic `tone`.\n\nNeeds the optional `chartjs-plugin-annotation` peer, loaded on first actual demand so a page\nwith no annotated charts never downloads it. The plugin is registered globally, like\n`chartjs-plugin-zoom` and unlike `chartjs-plugin-datalabels`: it draws nothing unless a chart\nsupplies annotation options, so the registration is unobservable to charts that set none, and\nregistration is also what installs the plugin's own element defaults. Without the peer\ninstalled the chart still renders and a single console warning explains the no-op — the same\nfail-closed contract `data-labels` uses.\n\nEntries are included in the generated accessible description, mirroring `lr-heatmap`.\n\nType: `readonly LyraChartAnnotation[]` \nDefault: `[]`"
3238
+ },
3200
3239
  {
3201
3240
  "name": "area",
3202
3241
  "description": "Chart-wide default fill-under-line setting for line-type series; a series's own `LyraChartSeries.fill` overrides it.\n\nType: `boolean` \nDefault: `false`",
@@ -3301,6 +3340,16 @@
3301
3340
  "name": "plugins",
3302
3341
  "description": "Chart.js plugins attached to this chart instance.\n\nType: `LyraChartPlugin[]` \nDefault: `[]`"
3303
3342
  },
3343
+ {
3344
+ "name": "scale-type",
3345
+ "description": "Scale type for the **value** axis (the categorical axis is unaffected). `'logarithmic'` plots\na dataset spanning several orders of magnitude honestly, where a linear axis collapses\neverything below the maximum into the baseline. Inherited by `lr-line-chart`,\n`lr-scatter-chart` and `lr-bar-chart`.\n\nA logarithmic axis cannot represent zero or negative values (`log(0)` is `-Infinity`), so\n`beginAtZero` is not forwarded in that mode -- Chart.js would otherwise be handed a bound it\ncannot place. Non-positive data points are dropped by Chart.js's own log scale.\n\nType: `LyraChartScaleType` \nDefault: `'linear'`",
3346
+ "value": {
3347
+ "type": [
3348
+ "'linear'",
3349
+ "'logarithmic'"
3350
+ ]
3351
+ }
3352
+ },
3304
3353
  {
3305
3354
  "name": "show-data-table",
3306
3355
  "description": "Makes the generated data table visible; it remains screen-reader available when false.\n\nType: `boolean` \nDefault: `false`",
@@ -3767,7 +3816,7 @@
3767
3816
  },
3768
3817
  {
3769
3818
  "name": "lr-checkbox",
3770
- "description": "`<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\nSupporting text is optional through either Web Awesome's `hint` spelling or Shoelace's\n`help-text` spelling. `errorText` and the `error` slot provide the matching owned error surface;\nall rendered messages share an additive described-by relationship with external host ids.\nDeliberately no separate top-of-field label property/slot/part: the default slot already is the\nvisible, clickable checkbox label, matching `lr-switch`'s form-control shape.\nDefault-slot presence follows flattened rendered assignment and updates when forwarded content\nchanges. Visual elements, including decorative `aria-hidden` icons, keep the label wrapper;\naccessible naming remains the browser's slot semantics unless a host `aria-label` is present.\nThe public label and supporting/error text wrap at arbitrary boundaries in constrained rows;\nthe fixed checkbox square and shared interactive target never shrink to make that fit.\nThe internal checkbox role exposes explicit stateful `aria-invalid`: visible error chrome wins\nimmediately, while intrinsic/custom invalidity is exposed only after user interaction.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\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. Host `aria-label` is forwarded by presence, including an explicitly empty value. Interactive label content remains a separate focus stop outside the checkbox role; activating that content does not also toggle the checkbox. |\n| `error` | Custom error content on the owned error surface. A host `aria-describedby` attribute is resolved onto the internal `role=\"checkbox\"` through `ariaDescribedByElements` so externally-owned descriptions remain valid across the shadow boundary. |\n| `help-text` | Shoelace-compatible supporting text; the same surface as `hint`. |\n| `hint` | Web Awesome-compatible supporting text. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | Compatibility name for the interactive control; use `checkbox`. |\n| `box` | The small square that shows the checkmark/indeterminate dash. |\n| `checkbox` | The interactive `role=\"checkbox\"` owner around the box. It is the same node as `base`, retains the shared `--lr-icon-button-size` minimum target at every size tier, and keeps the rich default label as a sibling so nested actions remain valid focus stops. |\n| `checked-icon` | WA/Shoelace name for the checked glyph. |\n| `checkmark` | Lyra name for the visible glyph inside the box. |\n| `control` | WA/Shoelace name for `box`. |\n| `control--checked` | Shoelace state alias on the control while checked. |\n| `control--indeterminate` | Shoelace state alias on the control while indeterminate. |\n| `error` | The error message. |\n| `form-control` | The outer wrapper around the checkbox, error, and hint. |\n| `form-control-help-text` | Shoelace name for the same supporting-text wrapper. |\n| `hint` | Web Awesome name for the supporting-text wrapper. |\n| `indeterminate-icon` | WA/Shoelace name for the indeterminate glyph. |\n| `label` | The wrapper around the default slot. |\n\n---\n\n**CSS Custom Properties**\n\n- `--checked-icon-color` (default: `currentColor`) — WA-compatible color of the checked or indeterminate glyph.\n- `--checked-icon-scale` (default: `1`) — WA-compatible scale of the checked or indeterminate glyph.\n- `--lr-checkbox-active-border` (default: `var(--lr-color-brand)`) — Box border while pressed.\n- `--lr-checkbox-active-ring` (default: `var(--lr-color-brand-quiet)`) — Outer box ring while pressed.\n- `--lr-checkbox-box-size` (default: `min(var(--lr-icon-button-size), calc(var(--lr-form-control-height) * 0.7))`) — Edge length of `[part='box']`. Derived from the `size` tier's shared control height, so the box lines up with an `<lr-input>`/`<lr-select>`/`<lr-button>` of the same `size`; set it to pin the box independently of the tier.\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`.\n- `--lr-checkbox-hover-border` (default: `var(--lr-color-brand)`) — Box border while the enabled interactive control is hovered.\n- `--lr-checkbox-invalid-border` (default: `var(--lr-color-danger)`) — Box border while invalid chrome is visible.\n- `--lr-checkbox-label-indent` (default: `calc(var(--lr-checkbox-box-size) + 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 — so it tracks `size` along with the box. 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`, `--lr-theme-form-control-height-*` and `--lr-theme-space-s`, which you control.",
3819
+ "description": "`<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\nSupporting text is optional through either Web Awesome's `hint` spelling or Shoelace's\n`help-text` spelling. `errorText` and the `error` slot provide the matching owned error surface;\nall rendered messages share an additive described-by relationship with external host ids.\nDeliberately no separate top-of-field label property/slot/part: the default slot already is the\nvisible, clickable checkbox label, matching `lr-switch`'s form-control shape.\nDefault-slot presence follows flattened rendered assignment and updates when forwarded content\nchanges. Visual elements, including decorative `aria-hidden` icons, keep the label wrapper;\naccessible naming remains the browser's slot semantics unless a host `aria-label` is present.\nThe public label and supporting/error text wrap at arbitrary boundaries in constrained rows;\nthe fixed checkbox square and shared interactive target never shrink to make that fit.\nThe internal checkbox role exposes explicit stateful `aria-invalid`: visible error chrome wins\nimmediately, while intrinsic/custom invalidity is exposed only after user interaction.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\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. Host `aria-label` is forwarded by presence, including an explicitly empty value. Interactive label content remains a separate focus stop outside the checkbox role; activating that content does not also toggle the checkbox. |\n| `error` | Custom error content on the owned error surface. A host `aria-describedby` attribute is resolved onto the internal `role=\"checkbox\"` through `ariaDescribedByElements` so externally-owned descriptions remain valid across the shadow boundary. |\n| `help-text` | Shoelace-compatible supporting text; the same surface as `hint`. |\n| `hint` | Web Awesome-compatible supporting text. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | Compatibility name for the interactive control; use `checkbox`. |\n| `box` | The small square that shows the checkmark/indeterminate dash. |\n| `checkbox` | The interactive `role=\"checkbox\"` owner around the box. It is the same node as `base`, retains the shared `--lr-icon-button-size` minimum target at every size tier, and keeps the rich default label as a sibling so nested actions remain valid focus stops. |\n| `checked-icon` | WA/Shoelace name for the checked glyph. |\n| `checkmark` | Lyra name for the visible glyph inside the box. |\n| `control` | WA/Shoelace name for `box`. |\n| `control--checked` | Shoelace state alias on the control while checked. |\n| `control--indeterminate` | Shoelace state alias on the control while indeterminate. |\n| `error` | The error message. |\n| `form-control` | The outer wrapper around the checkbox, error, and hint. |\n| `form-control-help-text` | Shoelace name for the same supporting-text wrapper. |\n| `hint` | Web Awesome name for the supporting-text wrapper. |\n| `indeterminate-icon` | WA/Shoelace name for the indeterminate glyph. |\n| `label` | The wrapper around the default slot. |\n| `row` | The row wrapping the checkbox owner and the label as siblings. This is the node to size or align when laying out a column of checkboxes; `base`/`checkbox` is only the control box inside it, so its inline size tracks the box, not the row. |\n\n---\n\n**CSS Custom Properties**\n\n- `--checked-icon-color` (default: `currentColor`) — WA-compatible color of the checked or indeterminate glyph.\n- `--checked-icon-scale` (default: `1`) — WA-compatible scale of the checked or indeterminate glyph.\n- `--lr-checkbox-active-border` (default: `var(--lr-color-brand)`) — Box border while pressed.\n- `--lr-checkbox-active-ring` (default: `var(--lr-color-brand-quiet)`) — Outer box ring while pressed.\n- `--lr-checkbox-box-size` (default: `min(var(--lr-icon-button-size), calc(var(--lr-form-control-height) * 0.7))`) — Edge length of `[part='box']`. Derived from the `size` tier's shared control height, so the box lines up with an `<lr-input>`/`<lr-select>`/`<lr-button>` of the same `size`; set it to pin the box independently of the tier.\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`.\n- `--lr-checkbox-hover-border` (default: `var(--lr-color-brand)`) — Box border while the enabled interactive control is hovered.\n- `--lr-checkbox-invalid-border` (default: `var(--lr-color-danger)`) — Box border while invalid chrome is visible.\n- `--lr-checkbox-label-indent` (default: `calc(var(--lr-checkbox-box-size) + 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 — so it tracks `size` along with the box. 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`, `--lr-theme-form-control-height-*` and `--lr-theme-space-s`, which you control.",
3771
3820
  "attributes": [
3772
3821
  {
3773
3822
  "name": "checked",
@@ -5105,7 +5154,7 @@
5105
5154
  },
5106
5155
  {
5107
5156
  "name": "lr-combobox",
5108
- "description": "`<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`.\nEnter commits the highlighted option while the listbox has one; with nothing highlighted it\nperforms the implicit form submission a native text field would (see\n`internal/submit-on-enter.ts` — the internal input is in a shadow root and has no form owner, so\nthe platform can never do it here).\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.\nIf local options or async rows change while a row is keyboard-active, the active descendant\nclamps to the nearest enabled survivor and clears when none remain.\nAn async `source` failure renders as a disabled listbox row, not a shadow-root live region; each\ncurrent post-mount rejection appends the localized `comboboxLoadError` message to the shared\nlight-DOM assertive announcement sink. Raw caught error text is never exposed to users.\nThe floating listbox is a nonmodal shared-overlay-manager entry. Visual stack order, Escape,\noutside-pointer dismissal, and focus handoff are therefore owned by only the newest Lyra\noverlay, including when another popup such as `lr-color-picker` remains open underneath it.\nThe editable combobox input exposes explicit stateful `aria-invalid`: visible error chrome wins\nimmediately, while intrinsic/custom invalidity is exposed only after interaction.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-option>` elements. |\n| `clear-icon` | Replaces the clear button's built-in icon. |\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| `expand-icon` | Replaces the dropdown indicator's built-in icon. |\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` | Ordinary form-validation text referenced by the internal input; it is not a live region, avoiding a second announcement alongside native validation/focus feedback. |\n| `expand-icon` | The dropdown indicator. |\n| `form-control` | The outer wrapper around label, combobox, listbox, error and hint. |\n| `form-control-input` | Compatibility wrapper around the editable control. |\n| `form-control-label` | The `<label>` element. |\n| `group-label` | The heading of an option group (rows sharing a `group`), named as on `lr-select` and `lr-emoji-picker` so one rule can style every grouped list. |\n| `hint` | The hint message. |\n| `label` | Compatibility wrapper around the visible label content. |\n| `listbox` | The managed nonmodal options popover; its stack depth comes from `--lr-overlay-stack-index` with `--lr-layer-dropdown` as the standalone fallback. |\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. Its rendered subtree remains visible but is inert and hidden from assistive technology. |\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__content` | Compatibility wrapper around a selected tag's visible content. |\n| `tag__remove-button` | A tag's remove button. |\n| `tag__remove-button__base` | Compatibility name on a tag's remove button. |\n| `tag-label` | The wrapping/ellipsis-safe selected-tag label. |\n| `tags` | The multi-select tag container. |\n\n---\n\n**CSS Custom Properties**\n\n- `--hide-duration` (default: `var(--lr-transition-fast)`) — Listbox exit-transition duration.\n- `--lr-combobox-expand-size` — Decorative expand-icon box size, scaled by `size`.\n- `--lr-combobox-font-size` (default: `var(--lr-form-control-font-size)`) — Input text size, from the shared form-control size ladder.\n- `--lr-combobox-gap` (default: `var(--lr-space-xs)`) — Gap between the start/end adornments, tags, and filter input inside the trigger row. Unlike the size knobs above it does not vary by `size` tier. Override it to retune without a `::part(combobox)` rule.\n- `--lr-combobox-option-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of a hovered or keyboard-active option row.\n- `--lr-combobox-option-selected-bg` (default: `transparent`) — Background of the currently-selected option row. Not declared on `:host`; retheme without hijacking `--lr-color-brand`.\n- `--lr-combobox-option-selected-border` (default: `var(--lr-color-brand)`) — Border color of the selected option row.\n- `--lr-combobox-option-selected-color` (default: `var(--lr-color-brand)`) — Text color of the selected option row.\n- `--lr-combobox-option-selected-font-weight` (default: `var(--lr-font-weight-semibold)`) — Font weight of the selected option row.\n- `--lr-combobox-radius` (default: `var(--lr-radius)`) — Corner radius of the trigger row (`[part='combobox']`). Does not vary by `size` tier; the `pill` attribute swaps it for `--lr-radius-pill`.\n- `--lr-combobox-tag-font-size` — Selected-tag text size.\n- `--lr-combobox-tag-padding` — Selected-tag padding.\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-trigger-min-height` (default: `var(--lr-form-control-height)`) — Minimum input-container block size. Reads the shared form-control height ladder, so retuning `--lr-theme-form-control-height-*` moves this control and every sibling field together.\n- `--lr-combobox-trigger-padding` — Padding inside the input container.\n- `--lr-form-control-required-color` (default: `var(--lr-color-danger)`) — Required-marker color, themeable independently of error text and invalid borders.\n- `--lr-form-control-required-content` (default: `' *'`) — The required marker appended to `form-control-label` while `required` is set. Set it to `''` to suppress the marker, or to any other quoted string (`' (required)'`, a localized word) to replace it.\n- `--lr-form-control-required-offset` (default: `0`) — Inline space between the label text and the required marker.\n- `--show-duration` (default: `var(--lr-transition-fast)`) — Listbox enter-transition duration.\n- `--tag-max-size` (default: `var(--lr-size-5rem)`) — Maximum inline size of a built-in selected tag.",
5157
+ "description": "`<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`.\nEnter commits the highlighted option while the listbox has one; with nothing highlighted it\nperforms the implicit form submission a native text field would (see\n`internal/submit-on-enter.ts` — the internal input is in a shadow root and has no form owner, so\nthe platform can never do it here).\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.\nIf local options or async rows change while a row is keyboard-active, the active descendant\nclamps to the nearest enabled survivor and clears when none remain.\nAn async `source` failure renders as a disabled listbox row, not a shadow-root live region; each\ncurrent post-mount rejection appends the localized `comboboxLoadError` message to the shared\nlight-DOM assertive announcement sink. Raw caught error text is never exposed to users.\nThe floating listbox is a nonmodal shared-overlay-manager entry. Visual stack order, Escape,\noutside-pointer dismissal, and focus handoff are therefore owned by only the newest Lyra\noverlay, including when another popup such as `lr-color-picker` remains open underneath it.\nThe editable combobox input exposes explicit stateful `aria-invalid`: visible error chrome wins\nimmediately, while intrinsic/custom invalidity is exposed only after interaction.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-option>` elements. |\n| `clear-icon` | Replaces the clear button's built-in icon. |\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| `expand-icon` | Replaces the dropdown indicator's built-in icon. |\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` | Ordinary form-validation text referenced by the internal input; it is not a live region, avoiding a second announcement alongside native validation/focus feedback. |\n| `expand-icon` | The dropdown indicator. |\n| `form-control` | The outer wrapper around label, combobox, listbox, error and hint. |\n| `form-control-input` | Compatibility wrapper around the editable control. |\n| `form-control-label` | The `<label>` element. |\n| `group-label` | The heading of an option group (rows sharing a `group`), named as on `lr-select` and `lr-emoji-picker` so one rule can style every grouped list. |\n| `hint` | The hint message. |\n| `label` | Compatibility wrapper around the visible label content. |\n| `listbox` | The managed nonmodal options popover; its stack depth comes from `--lr-overlay-stack-index` with `--lr-layer-dropdown` as the standalone fallback. |\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. Its rendered subtree remains visible but is inert and hidden from assistive technology. |\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-label` | The wrapping/ellipsis-safe selected-tag label. |\n| `tag__content` | Compatibility wrapper around a selected tag's visible content. |\n| `tag__remove-button` | A tag's remove button. |\n| `tag__remove-button__base` | Compatibility name on a tag's remove button. |\n| `tags` | The multi-select tag container. |\n\n---\n\n**CSS Custom Properties**\n\n- `--hide-duration` (default: `var(--lr-transition-fast)`) — Listbox exit-transition duration.\n- `--lr-combobox-expand-size` — Decorative expand-icon box size, scaled by `size`.\n- `--lr-combobox-font-size` (default: `var(--lr-form-control-font-size)`) — Input text size, from the shared form-control size ladder.\n- `--lr-combobox-gap` (default: `var(--lr-space-xs)`) — Gap between the start/end adornments, tags, and filter input inside the trigger row. Unlike the size knobs above it does not vary by `size` tier. Override it to retune without a `::part(combobox)` rule.\n- `--lr-combobox-option-active-bg` (default: `var(--lr-color-brand-quiet)`) — Background of a hovered or keyboard-active option row.\n- `--lr-combobox-option-selected-bg` (default: `transparent`) — Background of the currently-selected option row. Not declared on `:host`; retheme without hijacking `--lr-color-brand`.\n- `--lr-combobox-option-selected-border` (default: `var(--lr-color-brand)`) — Border color of the selected option row.\n- `--lr-combobox-option-selected-color` (default: `var(--lr-color-brand)`) — Text color of the selected option row.\n- `--lr-combobox-option-selected-font-weight` (default: `var(--lr-font-weight-semibold)`) — Font weight of the selected option row.\n- `--lr-combobox-radius` (default: `var(--lr-radius)`) — Corner radius of the trigger row (`[part='combobox']`). Does not vary by `size` tier; the `pill` attribute swaps it for `--lr-radius-pill`.\n- `--lr-combobox-tag-font-size` — Selected-tag text size.\n- `--lr-combobox-tag-padding` — Selected-tag padding.\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-trigger-min-height` (default: `var(--lr-form-control-height)`) — Minimum input-container block size. Reads the shared form-control height ladder, so retuning `--lr-theme-form-control-height-*` moves this control and every sibling field together.\n- `--lr-combobox-trigger-padding` — Padding inside the input container.\n- `--lr-form-control-required-color` (default: `var(--lr-color-danger)`) — Required-marker color, themeable independently of error text and invalid borders.\n- `--lr-form-control-required-content` (default: `' *'`) — The required marker appended to `form-control-label` while `required` is set. Set it to `''` to suppress the marker, or to any other quoted string (`' (required)'`, a localized word) to replace it.\n- `--lr-form-control-required-offset` (default: `0`) — Inline space between the label text and the required marker.\n- `--show-duration` (default: `var(--lr-transition-fast)`) — Listbox enter-transition duration.\n- `--tag-max-size` (default: `var(--lr-size-5rem)`) — Maximum inline size of a built-in selected tag.",
5109
5158
  "attributes": [
5110
5159
  {
5111
5160
  "name": "allow-create",
@@ -5638,7 +5687,7 @@
5638
5687
  },
5639
5688
  {
5640
5689
  "name": "lr-condition-builder",
5641
- "description": "`<lr-condition-builder>` — a composable structured-condition builder for tabular/dashboard data: a\nflat list of field/operator/value condition rows combined with one AND/OR combinator.\n\nDistinct from this package's `<lr-graph-query-builder>`: that component builds typed\nrelationship/path queries over a knowledge graph, a genuinely different data model from this\none's flat tabular field/operator/value conditions — they never share a file or a value type.\n\nFully controlled: a host supplies `fields` (the available columns, each with a\n`ConditionBuilderFieldType` that determines its offered operators and value control) and `value`\n(a plain, serializable `{ combinator, conditions }` object — safe to persist or send to a\nbackend as-is, the same shape convention as this package's `<lr-rubric-form>`/`<lr-filter-bar>`).\nThis component never mutates `fields`/`value` in place or calls out to storage/network itself;\nevery change is surfaced through `value`/`lr-input` for the host to own. A non-finite value on a\nfield declared as `number` normalizes to `undefined`, whether it arrives through the controlled\nmodel, later field metadata, or an overflowing user-input string, so JSON never turns it into\nan unrelated `null` condition.\nInputs are clone-owned, bounded readonly snapshots; blank field names, option values, and\ncondition ids are omitted, duplicates use their first valid record, closed vocabulary values normalize to a safe fallback, and all event\ndetails are frozen.\n\n**9.0 migration:** this original component was renamed from `<lr-query-builder>` /\n`LyraQueryBuilder` / `QueryBuilder*` to the condition-specific names above. No legacy tag, class,\ntype, or granular-path alias remains.\n\nEach row composes `<lr-select>` for the field and operator pickers, and a value control chosen\nfrom the selected field's `type`: `<lr-input type=\"text\">` (`string`), `<lr-input\ntype=\"number\">` (`number`), `<lr-select>` with `True`/`False` options (`boolean`),\n`<lr-date-input>` (`date`), `<lr-select>` (`enum`, `eq`/`neq`) or a multi-select\n`<lr-combobox>` (`enum`, `in`/`notIn`). A unary operator (`isEmpty`/`isNotEmpty`) renders no\nvalue control. `<lr-icon-button icon=\"trash\">` removes a row; `<lr-button>` appends one.\n\nThis is a composite query-definition control, not a single submittable form field — it\ndeliberately ships no `label`/`hint`/`errorText` chrome or native form association (the\n`label`/`hint`/`error` triad those controls share doesn't fit a multi-row, multi-field\ncomposite the way it fits one value). A host names the whole control via a plain `aria-label`\nattribute, applied to the element that owns `role=\"group\"`.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `9.0.0`\n- Rationale: This tag entered Lyra as a stable public API with documented behavior, accessibility, and cross-browser support.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `add-button` | The \"Add condition\" `lr-button`. |\n| `base` | The outer wrapper. |\n| `combinator` | The AND/OR combinator `lr-select`, rendered only when there are 2+ conditions. |\n| `condition` | One field/operator/value row. |\n| `conditions` | The wrapper around the condition rows. |\n| `empty` | The message shown when there are no fields, or no conditions yet. |\n| `field-select` | A row's field `lr-select`. |\n| `operator-select` | A row's operator `lr-select`. |\n| `remove-button` | A row's remove `lr-icon-button`. |\n| `value` | A row's value control (whichever of `lr-input`/`lr-select`/`lr-date-input`/ `lr-combobox` applies, or an empty placeholder for a unary operator or an incomplete row). |",
5690
+ "description": "`<lr-condition-builder>` — a composable structured-condition builder for tabular/dashboard data: a\nflat list of field/operator/value condition rows combined with one AND/OR combinator.\n\nDistinct from this package's `<lr-graph-query-builder>`: that component builds typed\nrelationship/path queries over a knowledge graph, a genuinely different data model from this\none's flat tabular field/operator/value conditions — they never share a file or a value type.\n\nA host supplies `fields` (the available columns, each with a `ConditionBuilderFieldType` that\ndetermines its offered operators and value control) and `value` (a plain, serializable\n`{ combinator, conditions }` object — safe to persist or send to a backend as-is, the same shape\nconvention as this package's `<lr-rubric-form>`/`<lr-filter-bar>`).\nThis component never mutates `fields`/`value` in place inputs are clone-owned — and never calls\nout to storage/network itself. It does advance its own copy of `value` on each edit and *then*\nemits `lr-input` with the complete next state: the same \"update, then emit; reassign to control\"\nround-trip `<lr-source-picker>`'s `selectedSourceIds` and `<lr-retrieval-search>`'s `filters`\nestablish. `lr-input` is not cancelable, so a host validating an edit reassigns `value` in its\nhandler rather than vetoing the change before it renders. A non-finite value on a\nfield declared as `number` normalizes to `undefined`, whether it arrives through the controlled\nmodel, later field metadata, or an overflowing user-input string, so JSON never turns it into\nan unrelated `null` condition.\nInputs are clone-owned, bounded readonly snapshots; blank field names, option values, and\ncondition ids are omitted, duplicates use their first valid record, closed vocabulary values normalize to a safe fallback, and all event\ndetails are frozen.\n\n**9.0 migration:** this original component was renamed from `<lr-query-builder>` /\n`LyraQueryBuilder` / `QueryBuilder*` to the condition-specific names above. No legacy tag, class,\ntype, or granular-path alias remains.\n\nEach row composes `<lr-select>` for the field and operator pickers, and a value control chosen\nfrom the selected field's `type`: `<lr-input type=\"text\">` (`string`), `<lr-input\ntype=\"number\">` (`number`), `<lr-select>` with `True`/`False` options (`boolean`),\n`<lr-date-input>` (`date`), `<lr-select>` (`enum`, `eq`/`neq`) or a multi-select\n`<lr-combobox>` (`enum`, `in`/`notIn`). A unary operator (`isEmpty`/`isNotEmpty`) renders no\nvalue control. `<lr-icon-button icon=\"trash\">` removes a row; `<lr-button>` appends one.\n\nThis is a composite query-definition control, not a single submittable form field — it\ndeliberately ships no `label`/`hint`/`errorText` chrome or native form association (the\n`label`/`hint`/`error` triad those controls share doesn't fit a multi-row, multi-field\ncomposite the way it fits one value). A host names the whole control via a plain `aria-label`\nattribute, applied to the element that owns `role=\"group\"`.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `9.0.0`\n- Rationale: This tag entered Lyra as a stable public API with documented behavior, accessibility, and cross-browser support.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `add-button` | The \"Add condition\" `lr-button`. |\n| `base` | The outer wrapper. |\n| `combinator` | The AND/OR combinator `lr-select`, rendered only when there are 2+ conditions. |\n| `condition` | One field/operator/value row. |\n| `conditions` | The wrapper around the condition rows. |\n| `empty` | The message shown when there are no fields, or no conditions yet. |\n| `field-select` | A row's field `lr-select`. |\n| `operator-select` | A row's operator `lr-select`. |\n| `remove-button` | A row's remove `lr-icon-button`. |\n| `value` | A row's value control (whichever of `lr-input`/`lr-select`/`lr-date-input`/ `lr-combobox` applies, or an empty placeholder for a unary operator or an incomplete row). |",
5642
5691
  "attributes": [
5643
5692
  {
5644
5693
  "name": "disabled",
@@ -7349,7 +7398,7 @@
7349
7398
  },
7350
7399
  {
7351
7400
  "name": "lr-dialog",
7352
- "description": "`<lr-dialog>` — a general-purpose modal/overlay. `role=\"dialog\"`,\nfocus-trapped while open, dismissible via Escape or (opt-in) a backdrop click, and\nscroll-locks the document for as long as it's open. While open it is promoted into the\nbrowser top layer, so no consumer stacking context can render on top of it. The mapped\n`label` property renders as a visible title and the close affordance is present by default;\n`closable=\"false\"` plus either header-suppression spelling support custom chrome. `no-header` is\nShoelace's name for it and `without-header` is Web Awesome's; both are current upstream\nspellings, neither is deprecated, and both are read.\n\nLifecycle: `show()` emits `lr-show` (cancelable) and then, once the enter animation has\nfinished, `lr-after-show`. `hide()`/`close()` emit `lr-hide` (cancelable), then\n`lr-dialog-close` (cancelable, carrying the dismissal reason), then — once the exit animation\nhas finished — `lr-after-hide`. Assigning `open` runs the same lifecycle, so the property, the\nreflected attribute, and the two method calls can never disagree. Markup that renders open\nfrom the start emits nothing, matching `<lr-menu>`.\nThe panel resolves `dialog.show`/`dialog.hide` through the public animation registry; the\nbackdrop resolves `dialog.overlay.show`/`dialog.overlay.hide`. A per-element registration wins\nover a page default, while keyframes-only overrides retain the dialog's token-derived timing.\n\nAccessible naming and visible-title precedence are independent. A host `aria-label` wins by\nattribute presence, including an explicitly empty value, followed by `accessible-label`, then\nthe text of a direct light-DOM heading. Otherwise the visible title wrapper names the panel.\nWithin that wrapper the rich `label` slot wins over the `label` property, which wins over the\nlegacy `heading` property. Explicit accessible-only naming never suppresses that visible title.\n\nThe slotted-heading case deliberately uses `aria-label` (a copied string)\nrather than `aria-labelledby` pointing at the heading's `id`: the heading is\n*light-DOM* content while `[part=\"panel\"]` lives in this element's\n*shadow* tree, and an ID-reference attribute can't resolve across that\nboundary (verified against axe's `aria-dialog-name` rule) — unlike the\nmapped-title cases above, where the target element is rendered\ninside the same shadow root it labels, so `aria-labelledby` there is safe.\nThe `label` *slot* is safe for the same reason: `aria-labelledby` targets the shadow-owned\n`part=\"heading\"` wrapper, and the accessible-name computation flattens the slot inside it.\nThat generated visible title is a level-three heading by default; set `heading-level` from\n`1`–`6` to fit the surrounding outline, or `none` for visual-only title text. A direct\nlight-DOM heading retains its own level instead.\n\n`closable` defaults to true and renders a close (X) button in the header row (creating one, with\nno heading text, if neither `heading` nor the `label` slot is set) that closes the dialog via\nthe same `close()` path as Escape/backdrop-dismiss, with reason `'close-button'`.\n\nThe `body` part is the element that scrolls, so it carries `tabindex=\"-1\"`: a dialog holding\nonly prose, a table, or a rendered document would otherwise have no keyboard stop at all and\nits content would be readable by mouse alone. It joins the Tab order only while it actually\noverflows, sorts behind any control inside it for initial focus, and shows the standard focus\nring on `::part(body)` when it takes focus.\n\nStacking: opening one `<lr-dialog>` while another is already open (e.g. a\n`confirm()` launched from within an already-open dialog) is supported --\nEscape and the Tab focus trap only ever act on the topmost open dialog, so\ndialogs beneath it stay open and untouched until the one on top closes.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The dialog body. |\n| `footer` | Action buttons, rendered in a bottom row. |\n| `header-actions` | Extra controls rendered in the header row, before the built-in close button. |\n| `label` | Rich header content, rendered in the header row and used as the panel's accessible name. Wins over the plain-string `label` and legacy `heading` properties. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `backdrop` | The full-viewport scrim behind the panel; also carries `overlay`. |\n| `base` | Shoelace wrapper alias. |\n| `body` | The wrapper around the default slot. |\n| `close-button` | The built-in close button, rendered inside `header` only when `closable` is `true`. |\n| `close-button__base` | Exported mapped alias on the close button. |\n| `dialog` | Web Awesome alias on the panel. |\n| `footer` | The wrapper around the `footer` slot. |\n| `header` | The header row, rendered when the `label` slot is filled, `label`/`heading` is set (and no heading is slotted into the default slot), `header-actions` is filled, and/or `closable` is `true` — and never when `noHeader` or `withoutHeader` is set. |\n| `header-actions` | The wrapper around the `header-actions` slot. |\n| `heading` | The visible title inside `header`; also carries `title` and `label`, and owns the configured heading semantics unless opted out. |\n| `label` | Mapped alias on the visible title. |\n| `overlay` | Shoelace alias on the backdrop. |\n| `panel` | The dialog panel itself (`role=\"dialog\"` while open); also carries `dialog`. Shrink-wraps to its content by default, capped at `--lr-dialog-max-width` (default `32rem`); set `--lr-dialog-width` for an assertive width instead of only a cap. |\n| `title` | Mapped alias on the visible title. |\n\n---\n\n**CSS Custom Properties**\n\n- `--backdrop-filter` (default: `var(--lr-dialog-backdrop-filter,none)`) — Mapped backdrop-filter alias.\n- `--body-spacing` — Shoelace body padding override.\n- `--footer-spacing` — Shoelace footer padding override.\n- `--header-spacing` — Mapped header padding override.\n- `--hide-duration` — Mapped closing animation duration.\n- `--lr-dialog-backdrop-duration` (default: `var(--lr-duration-fast)`) — Duration of the backdrop's fade.\n- `--lr-dialog-backdrop-filter` (default: `none`) — `backdrop-filter` applied to the scrim, for a frosted-glass treatment over the page behind it.\n- `--lr-dialog-max-width` (default: `var(--lr-dialog-width, var(--lr-size-32rem))`) — Cap on the panel's inline size. Falls back to `--lr-dialog-width` when that is set, so an assertive width is not clipped by the 32rem default; the viewport (`100%`) is always a hard limit on top.\n- `--lr-dialog-overlay-color` (default: `var(--lr-color-overlay)`) — Backdrop scrim color.\n- `--lr-dialog-panel-duration` (default: `var(--lr-duration-base)`) — Duration of the panel's enter/exit animation.\n- `--lr-dialog-spacing` (default: `var(--lr-space-l)`) — Padding inside the body, and the inline padding of the header and footer rows.\n- `--lr-dialog-spacing-block` (default: `var(--lr-space-m)`) — Block padding of the header and footer rows, which are tighter than the body by default.\n- `--lr-dialog-width` (default: `auto`) — Assertive inline size for the panel. Left at `auto` the panel shrink-wraps to its content.\n- `--show-duration` — Mapped opening animation duration.\n- `--spacing` (default: `var(--lr-dialog-spacing,var(--lr-space-l))`) — Mapped shared region spacing.\n- `--width` (default: `var(--lr-dialog-width,auto)`) — Mapped panel width alias.",
7401
+ "description": "`<lr-dialog>` — a general-purpose modal/overlay. `role=\"dialog\"`,\nfocus-trapped while open, dismissible via Escape or (opt-in) a backdrop click, and\nscroll-locks the document for as long as it's open. While open it is promoted into the\nbrowser top layer, so no consumer stacking context can render on top of it. The mapped\n`label` property renders as a visible title and the close affordance is present by default;\n`closable=\"false\"` plus either header-suppression spelling support custom chrome. `no-header` is\nShoelace's name for it and `without-header` is Web Awesome's; both are current upstream\nspellings, neither is deprecated, and both are read.\n\nLifecycle: `show()` emits `lr-show` (cancelable) and then, once the enter animation has\nfinished, `lr-after-show`. `hide()`/`close()` emit `lr-hide` (cancelable), then\n`lr-close` (cancelable, carrying the dismissal reason), then — once the exit animation\nhas finished — `lr-after-hide`. Assigning `open` runs the same lifecycle, so the property, the\nreflected attribute, and the two method calls can never disagree. Markup that renders open\nfrom the start emits nothing, matching `<lr-menu>`.\nThe panel resolves `dialog.show`/`dialog.hide` through the public animation registry; the\nbackdrop resolves `dialog.overlay.show`/`dialog.overlay.hide`. A per-element registration wins\nover a page default, while keyframes-only overrides retain the dialog's token-derived timing.\n\nAccessible naming and visible-title precedence are independent. A host `aria-label` wins by\nattribute presence, including an explicitly empty value, followed by `accessible-label`, then\nthe text of a direct light-DOM heading. Otherwise the visible title wrapper names the panel.\nWithin that wrapper the rich `label` slot wins over the `label` property, which wins over the\nlegacy `heading` property. Explicit accessible-only naming never suppresses that visible title.\n\nThe slotted-heading case deliberately uses `aria-label` (a copied string)\nrather than `aria-labelledby` pointing at the heading's `id`: the heading is\n*light-DOM* content while `[part=\"panel\"]` lives in this element's\n*shadow* tree, and an ID-reference attribute can't resolve across that\nboundary (verified against axe's `aria-dialog-name` rule) — unlike the\nmapped-title cases above, where the target element is rendered\ninside the same shadow root it labels, so `aria-labelledby` there is safe.\nThe `label` *slot* is safe for the same reason: `aria-labelledby` targets the shadow-owned\n`part=\"heading\"` wrapper, and the accessible-name computation flattens the slot inside it.\nThat generated visible title is a level-three heading by default; set `heading-level` from\n`1`–`6` to fit the surrounding outline, or `none` for visual-only title text. A direct\nlight-DOM heading retains its own level instead.\n\n`closable` defaults to true and renders a close (X) button in the header row (creating one, with\nno heading text, if neither `heading` nor the `label` slot is set) that closes the dialog via\nthe same `close()` path as Escape/backdrop-dismiss, with reason `'close-button'`.\n\nThe `body` part is the element that scrolls, so it carries `tabindex=\"-1\"`: a dialog holding\nonly prose, a table, or a rendered document would otherwise have no keyboard stop at all and\nits content would be readable by mouse alone. It joins the Tab order only while it actually\noverflows, sorts behind any control inside it for initial focus, and shows the standard focus\nring on `::part(body)` when it takes focus.\n\nStacking: opening one `<lr-dialog>` while another is already open (e.g. a\n`confirm()` launched from within an already-open dialog) is supported --\nEscape and the Tab focus trap only ever act on the topmost open dialog, so\ndialogs beneath it stay open and untouched until the one on top closes.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The dialog body. |\n| `footer` | Action buttons, rendered in a bottom row. |\n| `header-actions` | Extra controls rendered in the header row, before the built-in close button. |\n| `label` | Rich header content, rendered in the header row and used as the panel's accessible name. Wins over the plain-string `label` and legacy `heading` properties. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `backdrop` | The full-viewport scrim behind the panel; also carries `overlay`. |\n| `base` | Shoelace wrapper alias. |\n| `body` | The wrapper around the default slot. |\n| `close-button` | The built-in close button, rendered inside `header` only when `closable` is `true`. |\n| `close-button__base` | Exported mapped alias on the close button. |\n| `dialog` | Web Awesome alias on the panel. |\n| `footer` | The wrapper around the `footer` slot. |\n| `header` | The header row, rendered when the `label` slot is filled, `label`/`heading` is set (and no heading is slotted into the default slot), `header-actions` is filled, and/or `closable` is `true` — and never when `noHeader` or `withoutHeader` is set. |\n| `header-actions` | The wrapper around the `header-actions` slot. |\n| `heading` | The visible title inside `header`; also carries `title` and `label`, and owns the configured heading semantics unless opted out. |\n| `label` | Mapped alias on the visible title. |\n| `overlay` | Shoelace alias on the backdrop. |\n| `panel` | The dialog panel itself (`role=\"dialog\"` while open); also carries `dialog`. Shrink-wraps to its content by default, capped at `--lr-dialog-max-width` (default `32rem`); set `--lr-dialog-width` for an assertive width instead of only a cap. |\n| `title` | Mapped alias on the visible title. |\n\n---\n\n**CSS Custom Properties**\n\n- `--backdrop-filter` (default: `var(--lr-dialog-backdrop-filter,none)`) — Mapped backdrop-filter alias.\n- `--body-spacing` — Shoelace body padding override.\n- `--footer-spacing` — Shoelace footer padding override.\n- `--header-spacing` — Mapped header padding override.\n- `--hide-duration` — Mapped closing animation duration.\n- `--lr-dialog-backdrop-duration` (default: `var(--lr-duration-fast)`) — Duration of the backdrop's fade.\n- `--lr-dialog-backdrop-filter` (default: `none`) — `backdrop-filter` applied to the scrim, for a frosted-glass treatment over the page behind it.\n- `--lr-dialog-max-width` (default: `var(--lr-dialog-width, var(--lr-size-32rem))`) — Cap on the panel's inline size. Falls back to `--lr-dialog-width` when that is set, so an assertive width is not clipped by the 32rem default; the viewport (`100%`) is always a hard limit on top.\n- `--lr-dialog-overlay-color` (default: `var(--lr-color-overlay)`) — Backdrop scrim color.\n- `--lr-dialog-panel-duration` (default: `var(--lr-duration-base)`) — Duration of the panel's enter/exit animation.\n- `--lr-dialog-spacing` (default: `var(--lr-space-l)`) — Padding inside the body, and the inline padding of the header and footer rows.\n- `--lr-dialog-spacing-block` (default: `var(--lr-space-m)`) — Block padding of the header and footer rows, which are tighter than the body by default.\n- `--lr-dialog-width` (default: `auto`) — Assertive inline size for the panel. Left at `auto` the panel shrink-wraps to its content.\n- `--show-duration` — Mapped opening animation duration.\n- `--spacing` (default: `var(--lr-dialog-spacing,var(--lr-space-l))`) — Mapped shared region spacing.\n- `--width` (default: `var(--lr-dialog-width,auto)`) — Mapped panel width alias.",
7353
7402
  "attributes": [
7354
7403
  {
7355
7404
  "name": "accessible-label",
@@ -7948,6 +7997,10 @@
7948
7997
  "name": "lr-doughnut-chart",
7949
7998
  "description": "`<lr-doughnut-chart>` — `<lr-chart>` with a `\"doughnut\"` default and the mirrored writable type.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | An optional `<script type=\"application/json\">` containing a Chart.js configuration. |\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. Use this escape hatch for a complete paginated or virtualized alternative when the generated 1,000-record sample is insufficient. |\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| `data-truncation` | Explanation shown when the generated accessible alternative samples a data set larger than its 1,000-record ceiling. |\n| `description` | The accessible chart summary. |\n| `error` | Static visible error shown instead of `canvas` when the optional `chart.js` peer dependency is not installed; its transition is announced through a shared light-DOM alert. |\n| `feature-warning` | Static nonfatal warning when a requested optional feature peer is unavailable while the core chart remains usable. |\n| `legend` | The wrapping DOM legend, rendered unless `withoutLegend` is set. |\n| `legend-item` | A keyboard-operable series visibility toggle. |\n| `legend-item-hidden` | Added to a `legend-item` while its dataset is hidden. |\n| `legend-swatch` | The resolved series-color swatch in a legend item. |\n| `notices` | Wrapper for nonfatal feature warnings and generated-data truncation notices. |\n| `plot` | The fixed-height canvas/overlay region. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--border-color-1` (default: `var(--lr-color-chart-1)`) — First dataset border color.\n- `--border-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset border color.\n- `--border-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset border color.\n- `--border-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset border color.\n- `--border-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset border color.\n- `--border-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset border color.\n- `--border-radius` (default: `var(--lr-radius)`) — Dataset element corner radius.\n- `--border-width` (default: `var(--lr-border-width-thin)`) — Dataset element border width.\n- `--fill-color-1` (default: `var(--lr-color-chart-1)`) — First dataset fill color.\n- `--fill-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset fill color.\n- `--fill-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset fill color.\n- `--fill-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset fill color.\n- `--fill-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset fill color.\n- `--fill-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset fill color.\n- `--grid-border-width` (default: `var(--lr-border-width-thin)`) — Axis and grid line width.\n- `--grid-color` (default: `var(--lr-chart-grid-color)`) — Grid line color.\n- `--line-border-width` (default: `var(--lr-border-width-medium)`) — Line dataset stroke width.\n- `--lr-chart-canvas-hover-outline-width` (default: `var(--lr-border-width-thin)`) — Width of the `[part='canvas']` hover-state outline (its color is `--lr-chart-grid-color`, above).\n- `--lr-chart-data-table-button-active-bg` — Pressed background of an actionable generated- table value; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-data-table-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of an actionable generated-table value.\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-height` (default: `var(--lr-size-280px)`) — The plot region's `block-size` and the host's minimum block size. A visible data table or wrapping DOM legend grows the host in normal flow instead of overlapping following content. `height` supplies a private fallback; this public token always wins when a consumer sets it.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-item-active-bg` — Pressed background of a legend visibility button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-legend-item-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of a legend visibility button.\n- `--lr-chart-legend-side-max` (default: `var(--lr-size-15rem)`) — Maximum inline size reserved for a side-positioned DOM legend; the track is also capped at one third of the chart allocation.\n- `--lr-chart-pattern-step` (default: `var(--lr-space-2xs)`) — Tile size of the texture painted on `[part='legend-swatch']` while `forced-colors: active` matches, where every series collapses to one system color and the stripe/crosshatch pattern becomes the only channel keeping series apart. Declared on the swatch part rather than the host; the stripe width within a tile stays `--lr-border-width-thin`, so a larger step spaces the stripes further apart.\n- `--lr-chart-reset-zoom-button-active-bg` — Pressed background of the reset-zoom button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-reset-zoom-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of the reset-zoom button.\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-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.\n- `--point-radius` (default: `var(--lr-space-2xs)`) — Line/scatter point radius.",
7950
7999
  "attributes": [
8000
+ {
8001
+ "name": "annotations",
8002
+ "description": "Declarative reference lines and shaded bands — a threshold, an event year, a regime change, a\nhighlighted period. Each entry marks either a single `value` or a `from`/`to` range on `axis`\n(default `'y'`), with an optional `label` and semantic `tone`.\n\nNeeds the optional `chartjs-plugin-annotation` peer, loaded on first actual demand so a page\nwith no annotated charts never downloads it. The plugin is registered globally, like\n`chartjs-plugin-zoom` and unlike `chartjs-plugin-datalabels`: it draws nothing unless a chart\nsupplies annotation options, so the registration is unobservable to charts that set none, and\nregistration is also what installs the plugin's own element defaults. Without the peer\ninstalled the chart still renders and a single console warning explains the no-op — the same\nfail-closed contract `data-labels` uses.\n\nEntries are included in the generated accessible description, mirroring `lr-heatmap`.\n\nType: `readonly LyraChartAnnotation[]` \nDefault: `[]`"
8003
+ },
7951
8004
  {
7952
8005
  "name": "area",
7953
8006
  "description": "Chart-wide default fill-under-line setting for line-type series; a series's own `LyraChartSeries.fill` overrides it.\n\nType: `boolean` \nDefault: `false`",
@@ -8052,6 +8105,16 @@
8052
8105
  "name": "plugins",
8053
8106
  "description": "Chart.js plugins attached to this chart instance.\n\nType: `LyraChartPlugin[]` \nDefault: `[]`"
8054
8107
  },
8108
+ {
8109
+ "name": "scale-type",
8110
+ "description": "Scale type for the **value** axis (the categorical axis is unaffected). `'logarithmic'` plots\na dataset spanning several orders of magnitude honestly, where a linear axis collapses\neverything below the maximum into the baseline. Inherited by `lr-line-chart`,\n`lr-scatter-chart` and `lr-bar-chart`.\n\nA logarithmic axis cannot represent zero or negative values (`log(0)` is `-Infinity`), so\n`beginAtZero` is not forwarded in that mode -- Chart.js would otherwise be handed a bound it\ncannot place. Non-positive data points are dropped by Chart.js's own log scale.\n\nType: `LyraChartScaleType` \nDefault: `'linear'`",
8111
+ "value": {
8112
+ "type": [
8113
+ "'linear'",
8114
+ "'logarithmic'"
8115
+ ]
8116
+ }
8117
+ },
8055
8118
  {
8056
8119
  "name": "show-data-table",
8057
8120
  "description": "Makes the generated data table visible; it remains screen-reader available when false.\n\nType: `boolean` \nDefault: `false`",
@@ -8145,7 +8208,7 @@
8145
8208
  },
8146
8209
  {
8147
8210
  "name": "lr-drawer",
8148
- "description": "`<lr-drawer>` — a modal panel anchored to one logical edge of the\nviewport. It shares Lyra's dialog focus trap, Escape/backdrop dismissal,\nscroll lock, top-layer promotion, stacking, accessible naming,\n`show()`/`hide()`/`close()` surface, and the whole\n`lr-show`/`lr-after-show`/`lr-hide`/`lr-after-hide`/`lr-dialog-close` lifecycle — see\n`<lr-dialog>` for all of it. `contained` instead positions within the nearest containing block\nas a nonmodal panel: no backdrop, inerting, focus trap, scroll lock, top layer, or global Escape.\nOnly that mode, the slide animation, `placement`, and the `--size` alias are drawer-specific.\nThe panel registry names are `drawer.showTop`/`hideTop`, `showEnd`/`hideEnd`,\n`showBottom`/`hideBottom`, and `showStart`/`hideStart`; the scrim uses\n`drawer.overlay.show`/`drawer.overlay.hide`.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The drawer body. |\n| `footer` | Action buttons rendered in the footer row. |\n| `header-actions` | Extra header controls, inherited from `<lr-dialog>`. |\n| `label` | Rich header content, inherited from `<lr-dialog>`. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `backdrop` | The full-viewport scrim behind the panel; also carries `overlay`. |\n| `base` | Shoelace wrapper alias. |\n| `body` | The wrapper around the default slot. |\n| `close-button` | The built-in close button, rendered inside `header` only when `closable` is `true`. |\n| `close-button__base` | Exported mapped alias on the close button. |\n| `dialog` | Web Awesome alias on the panel. |\n| `footer` | The wrapper around the `footer` slot. |\n| `header` | The header row, rendered when the `label` slot is filled, `label`/`heading` is set (and no heading is slotted into the default slot), `header-actions` is filled, and/or `closable` is `true` — and never when `noHeader` or `withoutHeader` is set. |\n| `header-actions` | The wrapper around the `header-actions` slot. |\n| `heading` | The visible title inside `header`; also carries `title` and `label`, and owns the configured heading semantics unless opted out. |\n| `label` | Mapped alias on the visible title. |\n| `overlay` | Shoelace alias on the backdrop. |\n| `panel` | The dialog panel itself (`role=\"dialog\"` while open); also carries `dialog`. Shrink-wraps to its content by default, capped at `--lr-dialog-max-width` (default `32rem`); set `--lr-dialog-width` for an assertive width instead of only a cap. |\n| `title` | Mapped alias on the visible title. |\n\n---\n\n**CSS Custom Properties**\n\n- `--backdrop-filter` (default: `var(--lr-dialog-backdrop-filter,none)`) — Mapped backdrop-filter alias.\n- `--body-spacing` — Shoelace body padding.\n- `--footer-spacing` — Shoelace footer padding.\n- `--header-spacing` — Shoelace header padding.\n- `--hide-duration` — Closing slide duration.\n- `--lr-dialog-backdrop-duration` (default: `var(--lr-duration-fast)`) — Duration of the backdrop's fade.\n- `--lr-dialog-backdrop-filter` (default: `none`) — `backdrop-filter` applied to the scrim, for a frosted-glass treatment over the page behind it.\n- `--lr-dialog-max-width` (default: `var(--lr-dialog-width, var(--lr-size-32rem))`) — Cap on the panel's inline size. Falls back to `--lr-dialog-width` when that is set, so an assertive width is not clipped by the 32rem default; the viewport (`100%`) is always a hard limit on top.\n- `--lr-dialog-overlay-color` (default: `var(--lr-color-overlay)`) — Backdrop scrim color.\n- `--lr-dialog-panel-duration` (default: `var(--lr-duration-base)`) — Duration of the panel's enter/exit animation.\n- `--lr-dialog-spacing` (default: `var(--lr-space-l)`) — Padding inside the body, and the inline padding of the header and footer rows.\n- `--lr-dialog-spacing-block` (default: `var(--lr-space-m)`) — Block padding of the header and footer rows, which are tighter than the body by default.\n- `--lr-dialog-width` (default: `auto`) — Assertive inline size for the panel. Left at `auto` the panel shrink-wraps to its content.\n- `--lr-drawer-enter-x` (default: `calc(-1 * var(--lr-size-1rem))`) — Horizontal offset the panel slides in from, and back out to, for start/end drawers. Its private default changes per placement (and flips under RTL); an inherited or direct public value remains authoritative.\n- `--lr-drawer-enter-y` (default: `calc(-1 * var(--lr-size-1rem))`) — Vertical offset the panel slides in from, and back out to, for top/bottom drawers. Its private default becomes `var(--lr-size-1rem)` for `bottom`; an inherited or direct public value remains authoritative.\n- `--lr-drawer-height` — Block size for top/bottom drawers.\n- `--lr-drawer-width` — Inline size for start/end drawers.\n- `--show-duration` — Opening slide duration.\n- `--size` — Mapped drawer size for the active axis.\n- `--spacing` (default: `var(--lr-dialog-spacing,var(--lr-space-l))`) — Web Awesome shared region spacing.\n- `--width` (default: `var(--lr-dialog-width,auto)`) — Mapped panel width alias.",
8211
+ "description": "`<lr-drawer>` — a modal panel anchored to one logical edge of the\nviewport. It shares Lyra's dialog focus trap, Escape/backdrop dismissal,\nscroll lock, top-layer promotion, stacking, accessible naming,\n`show()`/`hide()`/`close()` surface, and the whole\n`lr-show`/`lr-after-show`/`lr-hide`/`lr-after-hide`/`lr-close` lifecycle — see\n`<lr-dialog>` for all of it. `contained` instead positions within the nearest containing block\nas a nonmodal panel: no backdrop, inerting, focus trap, scroll lock, top layer, or global Escape.\nOnly that mode, the slide animation, `placement`, and the `--size` alias are drawer-specific.\nThe panel registry names are `drawer.showTop`/`hideTop`, `showEnd`/`hideEnd`,\n`showBottom`/`hideBottom`, and `showStart`/`hideStart`; the scrim uses\n`drawer.overlay.show`/`drawer.overlay.hide`.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The drawer body. |\n| `footer` | Action buttons rendered in the footer row. |\n| `header-actions` | Extra header controls, inherited from `<lr-dialog>`. |\n| `label` | Rich header content, inherited from `<lr-dialog>`. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `backdrop` | The full-viewport scrim behind the panel; also carries `overlay`. |\n| `base` | Shoelace wrapper alias. |\n| `body` | The wrapper around the default slot. |\n| `close-button` | The built-in close button, rendered inside `header` only when `closable` is `true`. |\n| `close-button__base` | Exported mapped alias on the close button. |\n| `dialog` | Web Awesome alias on the panel. |\n| `footer` | The wrapper around the `footer` slot. |\n| `header` | The header row, rendered when the `label` slot is filled, `label`/`heading` is set (and no heading is slotted into the default slot), `header-actions` is filled, and/or `closable` is `true` — and never when `noHeader` or `withoutHeader` is set. |\n| `header-actions` | The wrapper around the `header-actions` slot. |\n| `heading` | The visible title inside `header`; also carries `title` and `label`, and owns the configured heading semantics unless opted out. |\n| `label` | Mapped alias on the visible title. |\n| `overlay` | Shoelace alias on the backdrop. |\n| `panel` | The dialog panel itself (`role=\"dialog\"` while open); also carries `dialog`. Shrink-wraps to its content by default, capped at `--lr-dialog-max-width` (default `32rem`); set `--lr-dialog-width` for an assertive width instead of only a cap. |\n| `title` | Mapped alias on the visible title. |\n\n---\n\n**CSS Custom Properties**\n\n- `--backdrop-filter` (default: `var(--lr-dialog-backdrop-filter,none)`) — Mapped backdrop-filter alias.\n- `--body-spacing` — Shoelace body padding.\n- `--footer-spacing` — Shoelace footer padding.\n- `--header-spacing` — Shoelace header padding.\n- `--hide-duration` — Closing slide duration.\n- `--lr-dialog-backdrop-duration` (default: `var(--lr-duration-fast)`) — Duration of the backdrop's fade.\n- `--lr-dialog-backdrop-filter` (default: `none`) — `backdrop-filter` applied to the scrim, for a frosted-glass treatment over the page behind it.\n- `--lr-dialog-max-width` (default: `var(--lr-dialog-width, var(--lr-size-32rem))`) — Cap on the panel's inline size. Falls back to `--lr-dialog-width` when that is set, so an assertive width is not clipped by the 32rem default; the viewport (`100%`) is always a hard limit on top.\n- `--lr-dialog-overlay-color` (default: `var(--lr-color-overlay)`) — Backdrop scrim color.\n- `--lr-dialog-panel-duration` (default: `var(--lr-duration-base)`) — Duration of the panel's enter/exit animation.\n- `--lr-dialog-spacing` (default: `var(--lr-space-l)`) — Padding inside the body, and the inline padding of the header and footer rows.\n- `--lr-dialog-spacing-block` (default: `var(--lr-space-m)`) — Block padding of the header and footer rows, which are tighter than the body by default.\n- `--lr-dialog-width` (default: `auto`) — Assertive inline size for the panel. Left at `auto` the panel shrink-wraps to its content.\n- `--lr-drawer-enter-x` (default: `calc(-1 * var(--lr-size-1rem))`) — Horizontal offset the panel slides in from, and back out to, for start/end drawers. Its private default changes per placement (and flips under RTL); an inherited or direct public value remains authoritative.\n- `--lr-drawer-enter-y` (default: `calc(-1 * var(--lr-size-1rem))`) — Vertical offset the panel slides in from, and back out to, for top/bottom drawers. Its private default becomes `var(--lr-size-1rem)` for `bottom`; an inherited or direct public value remains authoritative.\n- `--lr-drawer-height` — Block size for top/bottom drawers.\n- `--lr-drawer-width` — Inline size for start/end drawers.\n- `--show-duration` — Opening slide duration.\n- `--size` — Mapped drawer size for the active axis.\n- `--spacing` (default: `var(--lr-dialog-spacing,var(--lr-space-l))`) — Web Awesome shared region spacing.\n- `--width` (default: `var(--lr-dialog-width,auto)`) — Mapped panel width alias.",
8149
8212
  "attributes": [
8150
8213
  {
8151
8214
  "name": "accessible-label",
@@ -8369,7 +8432,7 @@
8369
8432
  },
8370
8433
  {
8371
8434
  "name": "disabled",
8372
- "description": "Type: `boolean` \nDefault: `false`",
8435
+ "description": "Prevents opening the popover -- pointer, keyboard, and programmatic `show()`/`open = true`\nare all refused while set. Becoming disabled also closes an already-open popover; initial\n`disabled` plus `open` markup/property state normalizes closed in either order. Mirrors\n`<lr-tooltip>`'s and `<lr-dropdown>`'s own `disabled`.\n\nType: `boolean` \nDefault: `false`",
8373
8436
  "value": {
8374
8437
  "type": [
8375
8438
  "boolean"
@@ -8936,7 +8999,7 @@
8936
8999
  },
8937
9000
  {
8938
9001
  "name": "lr-entity-card",
8939
- "description": "`<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\nPublic collection properties take bounded, clone-owned readonly snapshots. Create a new\ncollection and reassign it after changes; mutating the assigned array does not update the view.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\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-gap` (default: `var(--lr-space-xs)`) — Gap between `[part=\"base\"]`'s rows while `compact`.\n- `--lr-entity-card-compact-padding` (default: `var(--lr-space-s)`) — `[part=\"base\"]` padding while `compact`.",
9002
+ "description": "`<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-select` is a request a host routes into `lr-graph`'s\n`focusNode(id, { zoom? })`.\n\nPublic collection properties take bounded, clone-owned readonly snapshots. Create a new\ncollection and reassign it after changes; mutating the assigned array does not update the view.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\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-gap` (default: `var(--lr-space-xs)`) — Gap between `[part=\"base\"]`'s rows while `compact`.\n- `--lr-entity-card-compact-padding` (default: `var(--lr-space-s)`) — `[part=\"base\"]` padding while `compact`.",
8940
9003
  "attributes": [
8941
9004
  {
8942
9005
  "name": "community-label",
@@ -9034,7 +9097,7 @@
9034
9097
  },
9035
9098
  {
9036
9099
  "name": "lr-entity-dossier",
9037
- "description": "`<lr-entity-dossier>` — a full entity detail surface: a persistent header (`lr-entity-card` plus\nan optional confidence `lr-stat`) above a `lr-tab-group` strip for Relationships (`lr-neighbor-list`),\nSupporting chunks (`lr-chunk-inspector`), and Provenance (`lr-provenance-panel`). Pure layout —\nit never fetches, ranks, or mutates graph/document state, and never re-renders what any of those\nfive composed components already render themselves; every one of their own events (`\nlr-entity-activate`, `lr-node-expand`, `lr-chunk-open`, `lr-expand`, `lr-toggle`, `lr-tab-show`,\nplus the provenance panel's own conduit set — `lr-entity-open`, `lr-drill`,\n`lr-relation-activate`) bubbles through unmodified (`composed: true` crosses this component's own\nshadow boundary with no re-dispatch needed).\n\n`chunks`/`thresholds` (the \"supporting chunks\" tab) and `provenance` (the \"Provenance\" tab) are\ndeliberately separate inputs even though `lr-provenance-panel` can itself also show a chunks\nsection: the \"Supporting chunks\" tab is the evidence for *this entity's own* summary/properties,\nwhile `provenance` is the broader grounding chain (which may span other entities, relationships,\nand communities, and may or may not reuse the same chunk set) — a host is free to pass the same\narray to both when the two concepts genuinely coincide.\n\nTab labels reuse the exact `localize()` keys the composed child already uses for its own\naccessible name (`neighborListLabel`, `chunkInspectorLabel`, `provenancePanelLabel`) rather than\nnew dossier-specific keys, so a translated locale only has to cover each string once and the tab\nstrip and the panel underneath it always agree.\n\nThis component emits no events of its own. Its EventMap and `@event` documentation name the\ncomposed events that bubble through so host listeners remain typed and discoverable;\n`lr-tab-show` carries `detail: { tabId: LyraEntityDossierTab }`. This is the same \"pure\nprojection + event conduit\" convention `lr-provenance-panel` and `lr-spreadsheet-viewer`'s\ninternal `lr-tab-group` already establish.\n\nPublic collection properties take bounded, clone-owned readonly snapshots. Create a new\ncollection and reassign it after changes; mutating the assigned array does not update the view.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.1.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper, or the empty state's wrapper when `entity` is `null`. |\n| `chunk-inspector` | The nested `lr-chunk-inspector`, inside the Supporting chunks tab. |\n| `confidence` | The nested confidence `lr-stat`, only rendered when `confidence` is set. |\n| `empty` | The empty state shown when `entity` is `null`. |\n| `entity-card` | The nested `lr-entity-card`. |\n| `header` | The wrapper around the entity summary and the confidence stat. |\n| `neighbor-list` | The nested `lr-neighbor-list`, inside the Relationships tab. |\n| `provenance-panel` | The nested `lr-provenance-panel`, inside the Provenance tab. |\n| `tabs` | The nested `lr-tab-group` strip. |",
9100
+ "description": "`<lr-entity-dossier>` — a full entity detail surface: a persistent header (`lr-entity-card` plus\nan optional confidence `lr-stat`) above a `lr-tab-group` strip for Relationships (`lr-neighbor-list`),\nSupporting chunks (`lr-chunk-inspector`), and Provenance (`lr-provenance-panel`). Pure layout —\nit never fetches, ranks, or mutates graph/document state, and never re-renders what any of those\nfive composed components already render themselves; every one of their own events (`\nlr-entity-select`, `lr-entity-activate`, `lr-node-expand`, `lr-chunk-open`, `lr-expand`,\n`lr-toggle`, `lr-tab-show`, plus the provenance panel's own conduit set — `lr-entity-open`, `lr-drill`,\n`lr-relation-activate`) bubbles through unmodified (`composed: true` crosses this component's own\nshadow boundary with no re-dispatch needed).\n\n`chunks`/`thresholds` (the \"supporting chunks\" tab) and `provenance` (the \"Provenance\" tab) are\ndeliberately separate inputs even though `lr-provenance-panel` can itself also show a chunks\nsection: the \"Supporting chunks\" tab is the evidence for *this entity's own* summary/properties,\nwhile `provenance` is the broader grounding chain (which may span other entities, relationships,\nand communities, and may or may not reuse the same chunk set) — a host is free to pass the same\narray to both when the two concepts genuinely coincide.\n\nTab labels reuse the exact `localize()` keys the composed child already uses for its own\naccessible name (`neighborListLabel`, `chunkInspectorLabel`, `provenancePanelLabel`) rather than\nnew dossier-specific keys, so a translated locale only has to cover each string once and the tab\nstrip and the panel underneath it always agree.\n\nThis component emits no events of its own. Its EventMap and `@event` documentation name the\ncomposed events that bubble through so host listeners remain typed and discoverable;\n`lr-tab-show` carries `detail: { tabId: LyraEntityDossierTab }`. This is the same \"pure\nprojection + event conduit\" convention `lr-provenance-panel` and `lr-spreadsheet-viewer`'s\ninternal `lr-tab-group` already establish.\n\nPublic collection properties take bounded, clone-owned readonly snapshots. Create a new\ncollection and reassign it after changes; mutating the assigned array does not update the view.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.1.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper, or the empty state's wrapper when `entity` is `null`. |\n| `chunk-inspector` | The nested `lr-chunk-inspector`, inside the Supporting chunks tab. |\n| `confidence` | The nested confidence `lr-stat`, only rendered when `confidence` is set. |\n| `empty` | The empty state shown when `entity` is `null`. |\n| `entity-card` | The nested `lr-entity-card`. |\n| `header` | The wrapper around the entity summary and the confidence stat. |\n| `neighbor-list` | The nested `lr-neighbor-list`, inside the Relationships tab. |\n| `provenance-panel` | The nested `lr-provenance-panel`, inside the Provenance tab. |\n| `tabs` | The nested `lr-tab-group` strip. |",
9038
9101
  "attributes": [
9039
9102
  {
9040
9103
  "name": "aria-label",
@@ -9424,7 +9487,7 @@
9424
9487
  },
9425
9488
  {
9426
9489
  "name": "lr-file-input",
9427
- "description": "`<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**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n- Deprecated part `base`: Deprecated since `8.2.3`. Use part `::part(file-input)`. Removal is not permitted before `10.0.0`. The file-input part names the interactive picker surface; base remains on that same node during the compatibility window.\n- Deprecated part `label`: Deprecated since `8.2.3`. Use part `::part(form-control-label)`. Removal is not permitted before `10.0.0`. The form-control-label part follows the shared form-control vocabulary; label remains on that same node during the compatibility window.\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| `dropzone` | Named equivalent of the default dropzone-content slot. |\n| `error` | Custom validation error content. Use `with-error` when this slot is populated in server-rendered declarative shadow DOM before light-DOM slot assignment is observable. |\n| `hint` | Custom form-control hint content. |\n| `label` | Custom form-control label content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | Deprecated in 8.2.3; compatibility name for `file-input`; both names are on the native dropzone button, visually backing the slotted content while remaining its sibling in the accessibility tree so arbitrary slotted controls are never nested in it. |\n| `dropzone` | The drag/drop and paste target around the semantic button. |\n| `dropzone-icon` | The default decorative file icon. |\n| `dropzone-text` | Wrapper around dropzone slot/text content. |\n| `error` | The visible validation message or authored error content. |\n| `file` | One selected-file row. |\n| `file-details` | Filename and formatted-size wrapper. |\n| `file-icon` | Generic icon for a non-image file. |\n| `file-image` | Image preview for an image file. |\n| `file-input` | The interactive picker surface. |\n| `file-list` | The current selected-file list. |\n| `file-name` | Selected filename. |\n| `file-size` | Localized selected-file size. |\n| `file-thumbnail` | One selected file's thumbnail/icon wrapper. |\n| `form-control` | The complete label, dropzone, selected-file, error, and hint frame. |\n| `form-control-label` | The form-control label. |\n| `hint` | The form-control hint. |\n| `input` | The visually-hidden native `<input type=\"file\">`. |\n| `label` | Deprecated in 8.2.3; compatibility name for `form-control-label`; both names are on the same node. |\n| `rejection` | The visible region listing each currently-rejected file alongside its reason, rendered in addition to (never in place of) the sr-only `status` summary. Its text stays in the accessibility tree as ordinary visible content; the interrupting announcement it used to make as a shadow `role=\"alert\"` now goes through the shared light-DOM assertive region instead. |\n| `remove-button` | Removes one selected file. |\n| `status` | The visually-hidden, `aria-hidden` mirror of the drag accept/reject state and accepted/rejected selection counts. The announcement itself lands in the shared light-DOM polite region (`acquireAnnouncementSink()` in `internal/announcer.ts`) — a live region inside a shadow root is not reliably announced — so this part is a styling/inspection surface only. |\n\n---\n\n**CSS Custom Properties**\n\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-accept-border-color` (default: `var(--lr-color-success)`) — Border color of `[part~=\"base\"][data-drag-state=\"accept\"]`.\n- `--lr-file-input-compact-font-size` (default: `var(--lr-font-size-sm)`) — Label font size 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-padding` (default: `var(--lr-space-s)`) — `[part~=\"base\"]` padding while `compact`.\n- `--lr-file-input-detail-font-size` (default: `var(--lr-font-size-sm)`) — Size of the secondary text: the hint, the validation error, and each selected file's formatted size. Retuned per `size` tier.\n- `--lr-file-input-dropzone-font-size` (default: `var(--lr-font-size-md-sm)`) — Instructional text size inside the dropzone. Retuned per `size` tier; the documented default is the `m`/`medium` tier.\n- `--lr-file-input-dropzone-icon-size` (default: `var(--lr-font-size-xl)`) — `[part=\"dropzone-icon\"]` glyph size. Retuned per `size` tier.\n- `--lr-file-input-dropzone-padding` (default: `var(--lr-space-l)`) — Padding inside `[part~=\"base\"]` and the stacked dropzone content. Retuned per `size` tier; `compact` overrides it.\n- `--lr-file-input-font-size` (default: `var(--lr-form-control-font-size)`) — Label and selected-filename text size; tracks the shared `size` ladder.\n- `--lr-file-input-gap` (default: `var(--lr-space-xs)`) — Gap between the dropzone's slotted children. While `compact`, this is the fallback when `--lr-file-input-compact-gap` is unset.\n- `--lr-file-input-radius` (default: `var(--lr-radius)`) — Corner radius of `[part~=\"base\"]`.\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\"]`.\n- `--lr-file-input-reject-border-color` (default: `var(--lr-color-danger)`) — Border color of `[part~=\"base\"][data-drag-state=\"reject\"]`.\n- `--lr-form-control-required-color` (default: `var(--lr-color-danger)`) — Required-marker color, themeable independently of error text and invalid borders.\n- `--lr-form-control-required-content` (default: `' *'`) — The required marker appended to `form-control-label` while `required` is set. Set it to `''` to suppress the marker, or to any other quoted string (`' (required)'`, a localized word) to replace it.\n- `--lr-form-control-required-offset` (default: `0`) — Inline space between the label text and the required marker.",
9490
+ "description": "`<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**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n- Deprecated part `base`: Deprecated since `8.2.3`. Use part `::part(file-input)`. Removal is not permitted before `10.0.0`. The file-input part names the interactive picker surface; base remains on that same node during the compatibility window. That version is a policy floor, not a plan: `wa-file-input` still publishes its own deprecated `base` part, so this alias is removed only when upstream's is.\n- Deprecated part `label`: Deprecated since `8.2.3`. Use part `::part(form-control-label)`. Removal is not permitted before `10.0.0`. The form-control-label part follows the shared form-control vocabulary; label remains on that same node during the compatibility window. That version is a policy floor, not a plan: `wa-file-input` still publishes its own deprecated `label` part, so this alias is removed only when upstream's is.\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| `dropzone` | Named equivalent of the default dropzone-content slot. |\n| `error` | Custom validation error content. Use `with-error` when this slot is populated in server-rendered declarative shadow DOM before light-DOM slot assignment is observable. |\n| `hint` | Custom form-control hint content. |\n| `label` | Custom form-control label content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | Deprecated in 8.2.3; compatibility name for `file-input`; both names are on the native dropzone button, visually backing the slotted content while remaining its sibling in the accessibility tree so arbitrary slotted controls are never nested in it. |\n| `dropzone` | The drag/drop and paste target around the semantic button. |\n| `dropzone-icon` | The default decorative file icon. |\n| `dropzone-text` | Wrapper around dropzone slot/text content. |\n| `error` | The visible validation message or authored error content. |\n| `file` | One selected-file row. |\n| `file-details` | Filename and formatted-size wrapper. |\n| `file-icon` | Generic icon for a non-image file. |\n| `file-image` | Image preview for an image file. |\n| `file-input` | The interactive picker surface. |\n| `file-list` | The current selected-file list. |\n| `file-name` | Selected filename. |\n| `file-size` | Localized selected-file size. |\n| `file-thumbnail` | One selected file's thumbnail/icon wrapper. |\n| `form-control` | The complete label, dropzone, selected-file, error, and hint frame. |\n| `form-control-label` | The form-control label. |\n| `hint` | The form-control hint. |\n| `input` | The visually-hidden native `<input type=\"file\">`. |\n| `label` | Deprecated in 8.2.3; compatibility name for `form-control-label`; both names are on the same node. |\n| `rejection` | The visible region listing each currently-rejected file alongside its reason, rendered in addition to (never in place of) the sr-only `status` summary. Its text stays in the accessibility tree as ordinary visible content; the interrupting announcement it used to make as a shadow `role=\"alert\"` now goes through the shared light-DOM assertive region instead. |\n| `remove-button` | Removes one selected file. |\n| `status` | The visually-hidden, `aria-hidden` mirror of the drag accept/reject state and accepted/rejected selection counts. The announcement itself lands in the shared light-DOM polite region (`acquireAnnouncementSink()` in `internal/announcer.ts`) — a live region inside a shadow root is not reliably announced — so this part is a styling/inspection surface only. |\n\n---\n\n**CSS Custom Properties**\n\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-accept-border-color` (default: `var(--lr-color-success)`) — Border color of `[part~=\"base\"][data-drag-state=\"accept\"]`.\n- `--lr-file-input-compact-font-size` (default: `var(--lr-font-size-sm)`) — Label font size 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-padding` (default: `var(--lr-space-s)`) — `[part~=\"base\"]` padding while `compact`.\n- `--lr-file-input-detail-font-size` (default: `var(--lr-font-size-sm)`) — Size of the secondary text: the hint, the validation error, and each selected file's formatted size. Retuned per `size` tier.\n- `--lr-file-input-dropzone-font-size` (default: `var(--lr-font-size-md-sm)`) — Instructional text size inside the dropzone. Retuned per `size` tier; the documented default is the `m`/`medium` tier.\n- `--lr-file-input-dropzone-icon-size` (default: `var(--lr-font-size-xl)`) — `[part=\"dropzone-icon\"]` glyph size. Retuned per `size` tier.\n- `--lr-file-input-dropzone-padding` (default: `var(--lr-space-l)`) — Padding inside `[part~=\"base\"]` and the stacked dropzone content. Retuned per `size` tier; `compact` overrides it.\n- `--lr-file-input-font-size` (default: `var(--lr-form-control-font-size)`) — Label and selected-filename text size; tracks the shared `size` ladder.\n- `--lr-file-input-gap` (default: `var(--lr-space-xs)`) — Gap between the dropzone's slotted children. While `compact`, this is the fallback when `--lr-file-input-compact-gap` is unset.\n- `--lr-file-input-radius` (default: `var(--lr-radius)`) — Corner radius of `[part~=\"base\"]`.\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\"]`.\n- `--lr-file-input-reject-border-color` (default: `var(--lr-color-danger)`) — Border color of `[part~=\"base\"][data-drag-state=\"reject\"]`.\n- `--lr-form-control-required-color` (default: `var(--lr-color-danger)`) — Required-marker color, themeable independently of error text and invalid borders.\n- `--lr-form-control-required-content` (default: `' *'`) — The required marker appended to `form-control-label` while `required` is set. Set it to `''` to suppress the marker, or to any other quoted string (`' (required)'`, a localized word) to replace it.\n- `--lr-form-control-required-offset` (default: `0`) — Inline space between the label text and the required marker.",
9428
9491
  "attributes": [
9429
9492
  {
9430
9493
  "name": "accept",
@@ -9622,7 +9685,7 @@
9622
9685
  },
9623
9686
  {
9624
9687
  "name": "lr-file-tree",
9625
- "description": "`<lr-file-tree>` — a file-explorer preset over `<lr-tree>` + `<lr-file-icon>`: path-keyed\nnodes with git-status/diff-count badges, lazy directory loading, and select/open events.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |",
9688
+ "description": "`<lr-file-tree>` — a file-explorer preset over `<lr-tree>` + `<lr-file-icon>`: path-keyed\nnodes with git-status/diff-count badges, lazy directory loading, and select/open events.\n\n**The composed `<lr-tree>`'s `reorderable`/`lr-reorder` capability is deliberately not\nforwarded.** The tree it renders is not a model this component owns: `treeItems` is derived\nfrom `nodes` on every render and keyed by filesystem path, so sibling order is whatever the\nhost's own listing produced (name, type, git status), not an authored sequence a user can\nrearrange. `<lr-tree>`'s reorder is also strictly sibling-scoped — it never crosses a subtree\nboundary, precisely so a reorder can never become a reparent — which is the one file operation\n(\"move this file into that directory\") that would change a path and therefore mean something\nhere. Forwarding it would have to invent a second, path-shaped event alongside\n`lr-file-select`/`lr-file-open`/`lr-load-children`, permanently, for a gesture whose result the\nhost would have to discard. A consumer that genuinely needs orderable rows composes `<lr-tree>`\ndirectly, where the capability already lives.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The root wrapper. |",
9626
9689
  "attributes": [
9627
9690
  {
9628
9691
  "name": "label",
@@ -9687,12 +9750,16 @@
9687
9750
  },
9688
9751
  {
9689
9752
  "name": "lr-flag",
9690
- "description": "`<lr-flag>` — a country/language flag.\n\nFlag images are shipped by the optional peer package `@aceshooting/lyra-flags`,\nnot bundled into lyra-ui itself, so importing the core library pulls zero flag\nweight. Give it a `country` (ISO 3166-1 alpha-2) or a `language` tag (mapped to\na representative country). While that peer package's `flagUrl()` resolves,\nthe host carries `aria-busy=\"true\"`; a decorative skeleton and ordinary, non-live localized\nloading text render in its place. A missing or failed peer resolver fails closed with a localized visible error and a\nshared light-DOM assertive announcement;\nan installed resolver returning no URL for an unknown code remains a valid\nempty result.\n\n**Bundle-size note:** `country`/`language` resolve through the peer package's\n`flagUrl(code)`, which lazily fetches one requested flag at runtime. A\nbundler may still emit the complete reachable lazy-chunk graph; use a\nliteral asset subpath import when the deployment artifact must be pruned.\nIf you already\nhave a flag's URL at build time (e.g. from your own literal\n`import frUrl from '@aceshooting/lyra-flags/flags/fr.svg?url'`), pass it as\n`src` instead to skip the peer-package round trip (and its loading-skeleton\nflash) entirely.\n\nThe ~65 flags whose design includes a detailed coat of arms/seal/emblem (e.g. `es`, `pt`) ship\nthree fidelity tiers; choose one with `fidelity`: `\"compact\"` (a tiny WebP raster for icon-scale\nuse — menu items, language selectors, dense lists), the default `\"standard\"` (icon-optimized\nvector for card/row sizes), or `\"detailed\"` (the pristine full-detail vector for hero-scale\ndisplay). A no-op for every other code — all tiers resolve to the same file. See `fidelity`'s own\ndoc.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `error` | Ordinary localized visible error rendered when the optional peer resolver is unavailable or fails; each fresh resolution failure appends the same localized message to the shared light-DOM assertive announcement sink. |\n| `image` | The underlying <img>. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-flag-aspect-ratio` (default: `4 / 3`) — Rectangular flag aspect ratio.\n- `--lr-flag-object-fit` (default: `cover`) — How the image fits its flag frame.\n- `--lr-flag-radius` — Rectangular flag corner radius.",
9753
+ "description": "`<lr-flag>` — a country/language flag.\n\nFlag images are shipped by the optional peer package `@aceshooting/lyra-flags`,\nnot bundled into lyra-ui itself, so importing the core library pulls zero flag\nweight. Give it a `country` (ISO 3166-1 alpha-2) or a `language` tag (mapped to\na representative country). While that peer package's `flagUrl()` resolves,\nthe host carries `aria-busy=\"true\"`; a decorative skeleton and ordinary, non-live localized\nloading text render in its place. A missing or failed peer resolver fails closed with a localized visible error and a\nshared light-DOM assertive announcement;\nan installed resolver returning no URL for an unknown code remains a valid\nempty result.\n\n**Bundle-size note:** `country`/`language` resolve through the peer package's\n`flagUrl(code)`, which lazily fetches one requested flag at runtime. A\nbundler may still emit the complete reachable lazy-chunk graph; use a\nliteral asset subpath import when the deployment artifact must be pruned.\nIf you already\nhave a flag's URL at build time (e.g. from your own literal\n`import frUrl from '@aceshooting/lyra-flags/flags/fr.svg?url'`), pass it as\n`src` instead to skip the peer-package round trip (and its loading-skeleton\nflash) entirely.\n\nThe ~65 flags whose design includes a detailed coat of arms/seal/emblem (e.g. `es`, `pt`) ship\nthree fidelity tiers; choose one with `fidelity`: `\"compact\"` (a tiny WebP raster for icon-scale\nuse — menu items, language selectors, dense lists), the default `\"standard\"` (icon-optimized\nvector for card/row sizes), or `\"detailed\"` (the pristine full-detail vector for hero-scale\ndisplay). A no-op for every other code — all tiers resolve to the same file. See `fidelity`'s own\ndoc.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `fallback` | Rendered in place of the flag when `country`/`language` cannot resolve to a current flag (an unassigned, historical, or malformed code). Wins over the `fallback` property. Distinct from the peer-resolver failure that produces `[part=\"error\"]`: an unresolvable code is data, not a defect. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `error` | Ordinary localized visible error rendered when the optional peer resolver is unavailable or fails; each fresh resolution failure appends the same localized message to the shared light-DOM assertive announcement sink. |\n| `fallback-image` | The `fallback` property's placeholder image, when no `fallback` slot content is supplied. |\n| `image` | The underlying <img>. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-flag-aspect-ratio` (default: `4 / 3`) — Rectangular flag aspect ratio.\n- `--lr-flag-object-fit` (default: `cover`) — How the image fits its flag frame.\n- `--lr-flag-radius` — Rectangular flag corner radius.",
9691
9754
  "attributes": [
9692
9755
  {
9693
9756
  "name": "country",
9694
9757
  "description": "ISO 3166-1 alpha-2 country code (e.g. `fr`, `us`). Takes precedence over `language`.\n\nType: `string | undefined`"
9695
9758
  },
9759
+ {
9760
+ "name": "fallback",
9761
+ "description": "Placeholder image URL rendered in place of a flag when the code cannot resolve — a historical\nor defunct state in a longitudinal dataset, say. Unset renders the `fallback` slot's content\ninstead, or nothing at all, so the element still occupies its normal footprint in a table or\ncard grid rather than showing error wording.\n\nType: `string | undefined`"
9762
+ },
9696
9763
  {
9697
9764
  "name": "fidelity",
9698
9765
  "description": "Type: `LyraFlagFidelity`",
@@ -10950,9 +11017,13 @@
10950
11017
  ]
10951
11018
  }
10952
11019
  },
11020
+ {
11021
+ "name": "col-label-height",
11022
+ "description": "Height, in CSS px, of the matrix column-label band. Unset keeps the built-in 20px.\n\nType: `number | undefined`"
11023
+ },
10953
11024
  {
10954
11025
  "name": "fit-to-width",
10955
- "description": "When set, `cellSize` is derived from the host's measured `clientWidth`\non every draw (including ResizeObserver-triggered redraws) instead of\nthe fixed `cell-size` attribute, so the grid actually fills the\navailable width. Without this, canvas dimensions are computed purely\nfrom `PAD_LEFT + cols * cellSize` (matrix mode) or\n`CAL_PAD_LEFT + weekCount * cellSize` (calendar mode), so a\nresize-triggered redraw is a geometric no-op. Originally matrix-mode\nonly; now applies to calendar mode too.\n\nType: `boolean` \nDefault: `false`",
11026
+ "description": "When set, `cellSize` is derived from the host's measured `clientWidth`\non every draw (including ResizeObserver-triggered redraws) instead of\nthe fixed `cell-size` attribute, so the grid actually fills the\navailable width. Without this, canvas dimensions are computed purely\nfrom `matrixPadLeft + cols * cellSize` (matrix mode) or\n`CAL_PAD_LEFT + weekCount * cellSize` (calendar mode), so a\nresize-triggered redraw is a geometric no-op. Originally matrix-mode\nonly; now applies to calendar mode too.\n\nType: `boolean` \nDefault: `false`",
10956
11027
  "value": {
10957
11028
  "type": [
10958
11029
  "boolean"
@@ -10972,10 +11043,18 @@
10972
11043
  "name": "max-cell-size",
10973
11044
  "description": "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`"
10974
11045
  },
11046
+ {
11047
+ "name": "midpoint",
11048
+ "description": "Anchors a diverging ramp's neutral color on this value rather than at the middle of the\ndomain, scaling the two halves independently (`lo`->0, `midpoint`->0.5, `hi`->1). Unset (the\ndefault) leaves the plain min-max normalization untouched. Like `domain`, setting it opts into\nsigned data. A midpoint outside the resolved domain degrades to plain normalization rather\nthan distorting the ramp.\n\nType: `number | undefined`"
11049
+ },
10975
11050
  {
10976
11051
  "name": "min-cell-size",
10977
11052
  "description": "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`"
10978
11053
  },
11054
+ {
11055
+ "name": "row-label-width",
11056
+ "description": "Width, in CSS px, of the matrix row-label gutter, or `'auto'` to measure the widest label and\nsize the gutter to fit (never below the built-in 60px, never above 40% of the host's width, so\none long label cannot squeeze out the cells it exists to describe).\n\nUnset keeps the built-in 60px. That default is deliberate: auto-sizing every existing heatmap\nwould silently reflow charts whose labels already fit, which is a bigger change than the\nclipping it fixes. Opt in per chart, or pin an exact figure.\n\nIndependently of this, a row label too wide for the resolved gutter is now truncated with an\nellipsis instead of being clipped mid-glyph by whatever is painted beside it -- clipping read\nas a rendering fault, truncation reads as \"there is more here\". `cellText` still carries the\nfull label to the tooltip and the keyboard announcement either way.\n\nCalendar mode is unaffected; it has its own fixed weekday gutter.\n\nType: `number | 'auto' | undefined`"
11057
+ },
10979
11058
  {
10980
11059
  "name": "scale",
10981
11060
  "description": "`\"linear\"` (default) maps values linearly to the color ramp in matrix\nmode, and buckets calendar-mode values via `quartileBucket()` — both\nunchanged from before this property governed calendar mode too.\n`\"sqrt\"` compresses via `sqrtStep()`'s square-root magnitude compression\ninstead, in *both* modes, so one heavy cell/day doesn't wash out the\nrest of a skewed dataset.\n\nType: `HeatmapScale` \nDefault: `'linear'`",
@@ -11024,6 +11103,10 @@
11024
11103
  "name": "lr-histogram",
11025
11104
  "description": "`<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\nPublic collection properties take bounded, clone-owned readonly snapshots. Create a new\ncollection and reassign it after changes; mutating the assigned array does not update the view.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | An optional `<script type=\"application/json\">` containing a Chart.js configuration. |\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. Use this escape hatch for a complete paginated or virtualized alternative when the generated 1,000-record sample is insufficient. |\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| `data-truncation` | Explanation shown when the generated accessible alternative samples a data set larger than its 1,000-record ceiling. |\n| `description` | The accessible chart summary. |\n| `error` | Static visible error shown instead of `canvas` when the optional `chart.js` peer dependency is not installed; its transition is announced through a shared light-DOM alert. |\n| `feature-warning` | Static nonfatal warning when a requested optional feature peer is unavailable while the core chart remains usable. |\n| `legend` | The wrapping DOM legend, rendered unless `withoutLegend` is set. |\n| `legend-item` | A keyboard-operable series visibility toggle. |\n| `legend-item-hidden` | Added to a `legend-item` while its dataset is hidden. |\n| `legend-swatch` | The resolved series-color swatch in a legend item. |\n| `notices` | Wrapper for nonfatal feature warnings and generated-data truncation notices. |\n| `plot` | The fixed-height canvas/overlay region. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--border-color-1` (default: `var(--lr-color-chart-1)`) — First dataset border color.\n- `--border-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset border color.\n- `--border-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset border color.\n- `--border-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset border color.\n- `--border-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset border color.\n- `--border-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset border color.\n- `--border-radius` (default: `var(--lr-radius)`) — Dataset element corner radius.\n- `--border-width` (default: `var(--lr-border-width-thin)`) — Dataset element border width.\n- `--fill-color-1` (default: `var(--lr-color-chart-1)`) — First dataset fill color.\n- `--fill-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset fill color.\n- `--fill-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset fill color.\n- `--fill-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset fill color.\n- `--fill-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset fill color.\n- `--fill-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset fill color.\n- `--grid-border-width` (default: `var(--lr-border-width-thin)`) — Axis and grid line width.\n- `--grid-color` (default: `var(--lr-chart-grid-color)`) — Grid line color.\n- `--line-border-width` (default: `var(--lr-border-width-medium)`) — Line dataset stroke width.\n- `--lr-chart-canvas-hover-outline-width` (default: `var(--lr-border-width-thin)`) — Width of the `[part='canvas']` hover-state outline (its color is `--lr-chart-grid-color`, above).\n- `--lr-chart-data-table-button-active-bg` — Pressed background of an actionable generated- table value; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-data-table-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of an actionable generated-table value.\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-height` (default: `var(--lr-size-280px)`) — The plot region's `block-size` and the host's minimum block size. A visible data table or wrapping DOM legend grows the host in normal flow instead of overlapping following content. `height` supplies a private fallback; this public token always wins when a consumer sets it.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-item-active-bg` — Pressed background of a legend visibility button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-legend-item-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of a legend visibility button.\n- `--lr-chart-legend-side-max` (default: `var(--lr-size-15rem)`) — Maximum inline size reserved for a side-positioned DOM legend; the track is also capped at one third of the chart allocation.\n- `--lr-chart-pattern-step` (default: `var(--lr-space-2xs)`) — Tile size of the texture painted on `[part='legend-swatch']` while `forced-colors: active` matches, where every series collapses to one system color and the stripe/crosshatch pattern becomes the only channel keeping series apart. Declared on the swatch part rather than the host; the stripe width within a tile stays `--lr-border-width-thin`, so a larger step spaces the stripes further apart.\n- `--lr-chart-reset-zoom-button-active-bg` — Pressed background of the reset-zoom button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-reset-zoom-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of the reset-zoom button.\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-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.\n- `--point-radius` (default: `var(--lr-space-2xs)`) — Line/scatter point radius.",
11026
11105
  "attributes": [
11106
+ {
11107
+ "name": "annotations",
11108
+ "description": "Declarative reference lines and shaded bands — a threshold, an event year, a regime change, a\nhighlighted period. Each entry marks either a single `value` or a `from`/`to` range on `axis`\n(default `'y'`), with an optional `label` and semantic `tone`.\n\nNeeds the optional `chartjs-plugin-annotation` peer, loaded on first actual demand so a page\nwith no annotated charts never downloads it. The plugin is registered globally, like\n`chartjs-plugin-zoom` and unlike `chartjs-plugin-datalabels`: it draws nothing unless a chart\nsupplies annotation options, so the registration is unobservable to charts that set none, and\nregistration is also what installs the plugin's own element defaults. Without the peer\ninstalled the chart still renders and a single console warning explains the no-op — the same\nfail-closed contract `data-labels` uses.\n\nEntries are included in the generated accessible description, mirroring `lr-heatmap`.\n\nType: `readonly LyraChartAnnotation[]` \nDefault: `[]`"
11109
+ },
11027
11110
  {
11028
11111
  "name": "area",
11029
11112
  "description": "Chart-wide default fill-under-line setting for line-type series; a series's own `LyraChartSeries.fill` overrides it.\n\nType: `boolean` \nDefault: `false`",
@@ -11137,6 +11220,16 @@
11137
11220
  "name": "plugins",
11138
11221
  "description": "Chart.js plugins attached to this chart instance.\n\nType: `LyraChartPlugin[]` \nDefault: `[]`"
11139
11222
  },
11223
+ {
11224
+ "name": "scale-type",
11225
+ "description": "Scale type for the **value** axis (the categorical axis is unaffected). `'logarithmic'` plots\na dataset spanning several orders of magnitude honestly, where a linear axis collapses\neverything below the maximum into the baseline. Inherited by `lr-line-chart`,\n`lr-scatter-chart` and `lr-bar-chart`.\n\nA logarithmic axis cannot represent zero or negative values (`log(0)` is `-Infinity`), so\n`beginAtZero` is not forwarded in that mode -- Chart.js would otherwise be handed a bound it\ncannot place. Non-positive data points are dropped by Chart.js's own log scale.\n\nType: `LyraChartScaleType` \nDefault: `'linear'`",
11226
+ "value": {
11227
+ "type": [
11228
+ "'linear'",
11229
+ "'logarithmic'"
11230
+ ]
11231
+ }
11232
+ },
11140
11233
  {
11141
11234
  "name": "series-label",
11142
11235
  "description": "Dataset label used for the legend, tooltip, table, and summary.\n\nType: `string` \nDefault: `''`",
@@ -11292,7 +11385,7 @@
11292
11385
  },
11293
11386
  {
11294
11387
  "name": "lr-icon",
11295
- "description": "`<lr-icon>` — an SVG icon primitive. Renders a built-in named path with no network access at\nall, or resolves a name through a registered icon library, or fetches one SVG document from\n`src`. Remote markup is byte-capped, sanitized with DOMPurify, and rendered only if the whole\npipeline succeeds; anything else fails closed with a localized alert and no partial markup.\nMatching loads share a bounded cache of canonical sanitized SVGs. Each instance deep-clones the\ncanonical node before its trusted library mutator runs, so cached state is never mutated.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n- Deprecated property `autoWidth` / `auto-width`: Deprecated since `8.0.0`. Use property `canvas=\"auto\"`. Removal is not permitted before `10.0.0`. autoWidth is a boolean compatibility spelling that cannot express fixed canvas sizes; canvas covers both automatic and explicit sizing.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Optional custom SVG/path content when no `name`, `path`, `library`, or `src` resolves. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `empty` | Marker rendered when a remote icon resolved to an empty but valid document. |\n| `error` | The visually hidden, `aria-hidden` mirror shown when a remote icon fails. The spoken error is appended to Lyra's shared assertive light-DOM announcement sink while the icon and its composed ancestors are exposed to the accessibility tree. |\n| `svg` | The rendered SVG, whether built-in or fetched. |\n| `use` | Every `<use>` element in the rendered SVG. |\n\n---\n\n**CSS Custom Properties**\n\n- `--animation-delay` (default: `0s`) — Delay before an icon animation starts.\n- `--animation-direction` (default: `normal`) — Playback direction for icon animations.\n- `--animation-duration` (default: `var(--lr-duration-icon)`) — Duration of one animation cycle.\n- `--animation-iteration-count` (default: `infinite`) — Number of animation cycles.\n- `--animation-timing` (default: `var(--lr-easing-emphasized)`) — Animation timing function.\n- `--beat-fade-opacity` (default: `0.4`) — Lowest opacity during `beat-fade`.\n- `--beat-fade-scale` (default: `1.25`) — Peak scale during `beat-fade`.\n- `--beat-scale` (default: `1.25`) — Scale multiplier for `beat` and `spin-pulse`.\n- `--bounce-anticipation` (default: `0`) — Downward offset before a bounce.\n- `--bounce-height` (default: `calc(var(--lr-size-0-5em)*-1)`) — Peak bounce height.\n- `--bounce-jump-scale-x` (default: `0.95`) — Horizontal scale at the top of a bounce.\n- `--bounce-jump-scale-y` (default: `1.05`) — Vertical scale at the top of a bounce.\n- `--bounce-land-scale-x` (default: `1.08`) — Horizontal scale while landing.\n- `--bounce-land-scale-y` (default: `0.92`) — Vertical scale while landing.\n- `--bounce-rebound` (default: `calc(var(--lr-size-1em)*-0.1)`) — Landing rebound distance.\n- `--bounce-start-scale-x` (default: `1`) — Initial horizontal bounce scale.\n- `--bounce-start-scale-y` (default: `1`) — Initial vertical bounce scale.\n- `--buzz-distance` (default: `calc(var(--lr-size-1em)*0.12)`) — Horizontal buzz travel.\n- `--fade-opacity` (default: `0.4`) — Lowest opacity during `fade` and `spin-pulse`.\n- `--flip-angle` (default: `180deg`) — Rotation angle for flip treatments.\n- `--flip-anticipation-scale` (default: `0.9`) — Wind-up scale before a flip.\n- `--flip-overshoot` (default: `0deg`) — Extra angle before a flip settles.\n- `--flip-x` (default: `0`) — X coordinate of the flip rotation axis.\n- `--flip-y` (default: `1`) — Y coordinate of the flip rotation axis.\n- `--flip-z` (default: `0`) — Z coordinate of the flip rotation axis.\n- `--float-drift` (default: `0`) — Horizontal float drift.\n- `--float-height` (default: `calc(var(--lr-size-0-5em)*-1)`) — Float rise height.\n- `--float-squash-x` (default: `1.04`) — Resting horizontal float scale.\n- `--float-squash-y` (default: `0.96`) — Resting vertical float scale.\n- `--float-stretch-x` (default: `0.96`) — Peak horizontal float scale.\n- `--float-stretch-y` (default: `1.04`) — Peak vertical float scale.\n- `--float-tilt` (default: `4deg`) — Rotation at the float peak.\n- `--jello-scale-x` (default: `1.18`) — Horizontal jello stretch.\n- `--jello-scale-y` (default: `0.82`) — Vertical jello stretch.\n- `--lr-icon-fixed-width` (default: `var(--lr-size-1-5em)`) — Inline size of the box while `fixed-width` is set; the glyph keeps `--lr-icon-size` and centers inside it.\n- `--lr-icon-flip-x` (default: `1`) — Horizontal scale factor, set to `-1` by `flip`.\n- `--lr-icon-flip-y` (default: `1`) — Vertical scale factor, set to `-1` by `flip`.\n- `--lr-icon-rotate` (default: `0deg`) — Rotation applied to the box. Written inline from the `rotate` property, so set that rather than this property.\n- `--lr-icon-size` — Optional inline and block size override for every canvas.\n- `--primary-color` (default: `currentColor`) — Primary duotone layer color.\n- `--primary-opacity` (default: `1`) — Primary duotone layer opacity.\n- `--secondary-color` (default: `currentColor`) — Secondary duotone layer color.\n- `--secondary-opacity` (default: `0.4`) — Secondary duotone layer opacity.\n- `--swing-angle` (default: `15deg`) — Peak swing angle.\n- `--wag-angle` (default: `12deg`) — Peak wag angle.",
11388
+ "description": "`<lr-icon>` — an SVG icon primitive. Renders a built-in named path with no network access at\nall, or resolves a name through a registered icon library, or fetches one SVG document from\n`src`. Remote markup is byte-capped, sanitized with DOMPurify, and rendered only if the whole\npipeline succeeds; anything else fails closed with a localized alert and no partial markup.\nMatching loads share a bounded cache of canonical sanitized SVGs. Each instance deep-clones the\ncanonical node before its trusted library mutator runs, so cached state is never mutated.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n- Deprecated property `autoWidth` / `auto-width`: Deprecated since `8.0.0`. Use property `canvas=\"auto\"`. Removal is not permitted before `10.0.0`. autoWidth is a boolean compatibility spelling that cannot express fixed canvas sizes; canvas covers both automatic and explicit sizing. That version is a policy floor, not a plan: `wa-icon` still publishes its own deprecated `auto-width` attribute, so this alias is removed only when upstream's is.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Optional custom SVG/path content when no `name`, `path`, `library`, or `src` resolves. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `empty` | Marker rendered when a remote icon resolved to an empty but valid document. |\n| `error` | The visually hidden, `aria-hidden` mirror shown when a remote icon fails. The spoken error is appended to Lyra's shared assertive light-DOM announcement sink while the icon and its composed ancestors are exposed to the accessibility tree. |\n| `svg` | The rendered SVG, whether built-in or fetched. |\n| `use` | Every `<use>` element in the rendered SVG. |\n\n---\n\n**CSS Custom Properties**\n\n- `--animation-delay` (default: `0s`) — Delay before an icon animation starts.\n- `--animation-direction` (default: `normal`) — Playback direction for icon animations.\n- `--animation-duration` (default: `var(--lr-duration-icon)`) — Duration of one animation cycle.\n- `--animation-iteration-count` (default: `infinite`) — Number of animation cycles.\n- `--animation-timing` (default: `var(--lr-easing-emphasized)`) — Animation timing function.\n- `--beat-fade-opacity` (default: `0.4`) — Lowest opacity during `beat-fade`.\n- `--beat-fade-scale` (default: `1.25`) — Peak scale during `beat-fade`.\n- `--beat-scale` (default: `1.25`) — Scale multiplier for `beat` and `spin-pulse`.\n- `--bounce-anticipation` (default: `0`) — Downward offset before a bounce.\n- `--bounce-height` (default: `calc(var(--lr-size-0-5em)*-1)`) — Peak bounce height.\n- `--bounce-jump-scale-x` (default: `0.95`) — Horizontal scale at the top of a bounce.\n- `--bounce-jump-scale-y` (default: `1.05`) — Vertical scale at the top of a bounce.\n- `--bounce-land-scale-x` (default: `1.08`) — Horizontal scale while landing.\n- `--bounce-land-scale-y` (default: `0.92`) — Vertical scale while landing.\n- `--bounce-rebound` (default: `calc(var(--lr-size-1em)*-0.1)`) — Landing rebound distance.\n- `--bounce-start-scale-x` (default: `1`) — Initial horizontal bounce scale.\n- `--bounce-start-scale-y` (default: `1`) — Initial vertical bounce scale.\n- `--buzz-distance` (default: `calc(var(--lr-size-1em)*0.12)`) — Horizontal buzz travel.\n- `--fade-opacity` (default: `0.4`) — Lowest opacity during `fade` and `spin-pulse`.\n- `--flip-angle` (default: `180deg`) — Rotation angle for flip treatments.\n- `--flip-anticipation-scale` (default: `0.9`) — Wind-up scale before a flip.\n- `--flip-overshoot` (default: `0deg`) — Extra angle before a flip settles.\n- `--flip-x` (default: `0`) — X coordinate of the flip rotation axis.\n- `--flip-y` (default: `1`) — Y coordinate of the flip rotation axis.\n- `--flip-z` (default: `0`) — Z coordinate of the flip rotation axis.\n- `--float-drift` (default: `0`) — Horizontal float drift.\n- `--float-height` (default: `calc(var(--lr-size-0-5em)*-1)`) — Float rise height.\n- `--float-squash-x` (default: `1.04`) — Resting horizontal float scale.\n- `--float-squash-y` (default: `0.96`) — Resting vertical float scale.\n- `--float-stretch-x` (default: `0.96`) — Peak horizontal float scale.\n- `--float-stretch-y` (default: `1.04`) — Peak vertical float scale.\n- `--float-tilt` (default: `4deg`) — Rotation at the float peak.\n- `--jello-scale-x` (default: `1.18`) — Horizontal jello stretch.\n- `--jello-scale-y` (default: `0.82`) — Vertical jello stretch.\n- `--lr-icon-fixed-width` (default: `var(--lr-size-1-5em)`) — Inline size of the box while `fixed-width` is set; the glyph keeps `--lr-icon-size` and centers inside it.\n- `--lr-icon-flip-x` (default: `1`) — Horizontal scale factor, set to `-1` by `flip`.\n- `--lr-icon-flip-y` (default: `1`) — Vertical scale factor, set to `-1` by `flip`.\n- `--lr-icon-rotate` (default: `0deg`) — Rotation applied to the box. Written inline from the `rotate` property, so set that rather than this property.\n- `--lr-icon-size` — Optional inline and block size override for every canvas.\n- `--primary-color` (default: `currentColor`) — Primary duotone layer color.\n- `--primary-opacity` (default: `1`) — Primary duotone layer opacity.\n- `--secondary-color` (default: `currentColor`) — Secondary duotone layer color.\n- `--secondary-opacity` (default: `0.4`) — Secondary duotone layer opacity.\n- `--swing-angle` (default: `15deg`) — Peak swing angle.\n- `--wag-angle` (default: `12deg`) — Peak wag angle.",
11296
11389
  "attributes": [
11297
11390
  {
11298
11391
  "name": "animation",
@@ -11322,7 +11415,7 @@
11322
11415
  },
11323
11416
  {
11324
11417
  "name": "auto-width",
11325
- "description": "Compatibility alias for `canvas=\"auto\"`. Purely a CSS-level alias — it never reads or\nwrites `canvas` — so an explicit `canvas` attribute/property always wins and this becomes a\nno-op while one is set.\n\nDeprecated since `8.0.0`. Use property `canvas=\"auto\"`. Removal is not permitted before `10.0.0`. autoWidth is a boolean compatibility spelling that cannot express fixed canvas sizes; canvas covers both automatic and explicit sizing.\n\nType: `boolean` \nDefault: `false`",
11418
+ "description": "Compatibility alias for `canvas=\"auto\"`. Purely a CSS-level alias — it never reads or\nwrites `canvas` — so an explicit `canvas` attribute/property always wins and this becomes a\nno-op while one is set.\n\nDeprecated since `8.0.0`. Use property `canvas=\"auto\"`. Removal is not permitted before `10.0.0`. autoWidth is a boolean compatibility spelling that cannot express fixed canvas sizes; canvas covers both automatic and explicit sizing. That version is a policy floor, not a plan: `wa-icon` still publishes its own deprecated `auto-width` attribute, so this alias is removed only when upstream's is.\n\nType: `boolean` \nDefault: `false`",
11326
11419
  "value": {
11327
11420
  "type": [
11328
11421
  "boolean"
@@ -12458,7 +12551,7 @@
12458
12551
  },
12459
12552
  {
12460
12553
  "name": "lr-known-date",
12461
- "description": "`<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-`. `appearance` and `pill` mirror its field treatments, while `size` uses this library's\nshared `2xs`–`xl` ladder and also accepts the upstream `small`/`medium`/`large` spellings — the\nsame ladder every other Lyra form control sits on. The shared `FormAssociated` surface supplies\nthe upstream `form` owner contract.\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. Locale digits such as\nArabic-Indic and Persian numerals are accepted and normalized to the\ncanonical ASCII digits used by the ISO form value.\n\nPressing Enter in any of the three fields performs the implicit form submission a native\n`<input>` would (see `internal/submit-on-enter.ts` — the fields live in a shadow root and have no\nform owner, so the platform can never do it here), flushing any pending `change` first.\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.\nVisible validation-message changes are appended to a pre-mounted light-DOM assertive live\nregion. Hidden, inert, CSS-hidden, and `aria-hidden` slotted error content is excluded from the\nannouncement text, and no error is announced while the control or a composed ancestor is\nhidden. Initial and reconnected validation state remains silent.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n- Deprecated part `label`: Deprecated since `8.0.0`. Use part `::part(form-control-label)`. Removal is not permitted before `10.0.0`. The form-control-label part matches the shared form-control vocabulary; label remains on that same node during the compatibility window.\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| `base` | Compatibility name for the outer wrapper; use `known-date`. |\n| `error` | The validation message. |\n| `field` | Each field block (label + input), repeated three times; distinguished by `data-field=\"day\"\\|\"month\"\\|\"year\"`. |\n| `field-day` | Added to the day field block. |\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| `field-month` | Added to the month field block. |\n| `field-year` | Added to the year field block. |\n| `fields` | The row wrapping the three field blocks. |\n| `fieldset` | The `<fieldset>` grouping the three fields. |\n| `form-control` | The outer wrapper. It is the same node as `base` and `known-date`. |\n| `form-control-input` | Alias on the fields row matching other form controls. |\n| `form-control-label` | The visible label wrapper inside the legend. |\n| `hint` | The hint message. |\n| `known-date` | The outer wrapper around legend, fieldset, hint, and error. It is the same node as `base` and `form-control`. |\n| `label` | Deprecated in 8.0.0; compatibility alias for `form-control-label`, retained until at least 10.0.0. |\n| `legend` | The `<legend>` element. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-known-date-field-padding-block` (default: `var(--lr-form-control-padding-block)`) — Block padding of each `field-input`; its private default follows `size` through the shared ladder.\n- `--lr-known-date-field-padding-inline` (default: `var(--lr-form-control-padding-inline)`) — Inline padding of each `field-input`; its private default follows `size` through the shared ladder.\n- `--lr-known-date-field-font-size` (default: `var(--lr-form-control-font-size)`) — Font size of each `field-input`; its private default follows `size` through the shared ladder.\n- `--lr-known-date-field-min-height` (default: `max(var(--lr-form-control-height),var(--lr-size-24px))`) — Minimum block size of each `field-input`; its private default follows `size` (`2xs`/`xs`→`24px`, `s`→`1.875rem`, `m`→`2.5rem`, `l`→`3rem`, `xl`→`3.5rem`) -- the same shared control-height ladder `lr-input`/`lr-date-input` sit on, so a birthdate field in a form row beside those controls renders at the same height. The `max()` floors the two smallest tiers at WCAG 2.2 SC 2.5.8's 24px pointer-target minimum. At the small tiers the floor exceeds the field's own content height and actively pins the rendered box; at `l`/`xl` the content height stays under it, so those two tiers are unaffected. An inherited or direct public value wins in every tier.\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.\n- `--lr-form-control-required-content` (default: `' *'`) — The required-field marker, rendered after the shared `form-control-label` marker contract. Set it to `''` to suppress the marker, or to any other quoted string (`' (required)'`, a localized word) to replace it. Caller-supplied content, so it is never localized here.\n- `--lr-form-control-required-color` (default: `var(--lr-color-danger)`) — Color of that marker, retunable without touching any other danger-coloured surface.\n- `--lr-form-control-required-offset` (default: `0`) — Inline space between the label text and the marker.",
12554
+ "description": "`<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-`. `appearance` and `pill` mirror its field treatments, while `size` uses this library's\nshared `2xs`–`xl` ladder and also accepts the upstream `small`/`medium`/`large` spellings — the\nsame ladder every other Lyra form control sits on. The shared `FormAssociated` surface supplies\nthe upstream `form` owner contract.\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. Locale digits such as\nArabic-Indic and Persian numerals are accepted and normalized to the\ncanonical ASCII digits used by the ISO form value.\n\nPressing Enter in any of the three fields performs the implicit form submission a native\n`<input>` would (see `internal/submit-on-enter.ts` — the fields live in a shadow root and have no\nform owner, so the platform can never do it here), flushing any pending `change` first.\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.\nVisible validation-message changes are appended to a pre-mounted light-DOM assertive live\nregion. Hidden, inert, CSS-hidden, and `aria-hidden` slotted error content is excluded from the\nannouncement text, and no error is announced while the control or a composed ancestor is\nhidden. Initial and reconnected validation state remains silent.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n- Deprecated part `label`: Deprecated since `8.0.0`. Use part `::part(form-control-label)`. Removal is not permitted before `10.0.0`. The form-control-label part matches the shared form-control vocabulary; label remains on that same node during the compatibility window. That version is a policy floor, not a plan: `wa-known-date` still publishes its own deprecated `label` part, so this alias is removed only when upstream's is.\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| `base` | Compatibility name for the outer wrapper; use `known-date`. |\n| `error` | The validation message. |\n| `field` | Each field block (label + input), repeated three times; distinguished by `data-field=\"day\"\\|\"month\"\\|\"year\"`. |\n| `field-day` | Added to the day field block. |\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| `field-month` | Added to the month field block. |\n| `field-year` | Added to the year field block. |\n| `fields` | The row wrapping the three field blocks. |\n| `fieldset` | The `<fieldset>` grouping the three fields. |\n| `form-control` | The outer wrapper. It is the same node as `base` and `known-date`. |\n| `form-control-input` | Alias on the fields row matching other form controls. |\n| `form-control-label` | The visible label wrapper inside the legend. |\n| `hint` | The hint message. |\n| `known-date` | The outer wrapper around legend, fieldset, hint, and error. It is the same node as `base` and `form-control`. |\n| `label` | Deprecated in 8.0.0; compatibility alias for `form-control-label`. Web Awesome still publishes its own deprecated `label` part on `<wa-known-date>`, so this alias stays on the same node until upstream drops it. |\n| `legend` | The `<legend>` element. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-known-date-field-padding-block` (default: `var(--lr-form-control-padding-block)`) — Block padding of each `field-input`; its private default follows `size` through the shared ladder.\n- `--lr-known-date-field-padding-inline` (default: `var(--lr-form-control-padding-inline)`) — Inline padding of each `field-input`; its private default follows `size` through the shared ladder.\n- `--lr-known-date-field-font-size` (default: `var(--lr-form-control-font-size)`) — Font size of each `field-input`; its private default follows `size` through the shared ladder.\n- `--lr-known-date-field-min-height` (default: `max(var(--lr-form-control-height),var(--lr-size-24px))`) — Minimum block size of each `field-input`; its private default follows `size` (`2xs`/`xs`→`24px`, `s`→`1.875rem`, `m`→`2.5rem`, `l`→`3rem`, `xl`→`3.5rem`) -- the same shared control-height ladder `lr-input`/`lr-date-input` sit on, so a birthdate field in a form row beside those controls renders at the same height. The `max()` floors the two smallest tiers at WCAG 2.2 SC 2.5.8's 24px pointer-target minimum. At the small tiers the floor exceeds the field's own content height and actively pins the rendered box; at `l`/`xl` the content height stays under it, so those two tiers are unaffected. An inherited or direct public value wins in every tier.\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.\n- `--lr-form-control-required-content` (default: `' *'`) — The required-field marker, rendered after the shared `form-control-label` marker contract. Set it to `''` to suppress the marker, or to any other quoted string (`' (required)'`, a localized word) to replace it. Caller-supplied content, so it is never localized here.\n- `--lr-form-control-required-color` (default: `var(--lr-color-danger)`) — Color of that marker, retunable without touching any other danger-coloured surface.\n- `--lr-form-control-required-offset` (default: `0`) — Inline space between the label text and the marker.",
12462
12555
  "attributes": [
12463
12556
  {
12464
12557
  "name": "appearance",
@@ -12744,6 +12837,10 @@
12744
12837
  "name": "lr-line-chart",
12745
12838
  "description": "`<lr-line-chart>` — `<lr-chart>` with a `\"line\"` default and the mirrored writable type.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | An optional `<script type=\"application/json\">` containing a Chart.js configuration. |\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. Use this escape hatch for a complete paginated or virtualized alternative when the generated 1,000-record sample is insufficient. |\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| `data-truncation` | Explanation shown when the generated accessible alternative samples a data set larger than its 1,000-record ceiling. |\n| `description` | The accessible chart summary. |\n| `error` | Static visible error shown instead of `canvas` when the optional `chart.js` peer dependency is not installed; its transition is announced through a shared light-DOM alert. |\n| `feature-warning` | Static nonfatal warning when a requested optional feature peer is unavailable while the core chart remains usable. |\n| `legend` | The wrapping DOM legend, rendered unless `withoutLegend` is set. |\n| `legend-item` | A keyboard-operable series visibility toggle. |\n| `legend-item-hidden` | Added to a `legend-item` while its dataset is hidden. |\n| `legend-swatch` | The resolved series-color swatch in a legend item. |\n| `notices` | Wrapper for nonfatal feature warnings and generated-data truncation notices. |\n| `plot` | The fixed-height canvas/overlay region. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--border-color-1` (default: `var(--lr-color-chart-1)`) — First dataset border color.\n- `--border-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset border color.\n- `--border-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset border color.\n- `--border-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset border color.\n- `--border-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset border color.\n- `--border-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset border color.\n- `--border-radius` (default: `var(--lr-radius)`) — Dataset element corner radius.\n- `--border-width` (default: `var(--lr-border-width-thin)`) — Dataset element border width.\n- `--fill-color-1` (default: `var(--lr-color-chart-1)`) — First dataset fill color.\n- `--fill-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset fill color.\n- `--fill-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset fill color.\n- `--fill-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset fill color.\n- `--fill-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset fill color.\n- `--fill-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset fill color.\n- `--grid-border-width` (default: `var(--lr-border-width-thin)`) — Axis and grid line width.\n- `--grid-color` (default: `var(--lr-chart-grid-color)`) — Grid line color.\n- `--line-border-width` (default: `var(--lr-border-width-medium)`) — Line dataset stroke width.\n- `--lr-chart-canvas-hover-outline-width` (default: `var(--lr-border-width-thin)`) — Width of the `[part='canvas']` hover-state outline (its color is `--lr-chart-grid-color`, above).\n- `--lr-chart-data-table-button-active-bg` — Pressed background of an actionable generated- table value; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-data-table-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of an actionable generated-table value.\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-height` (default: `var(--lr-size-280px)`) — The plot region's `block-size` and the host's minimum block size. A visible data table or wrapping DOM legend grows the host in normal flow instead of overlapping following content. `height` supplies a private fallback; this public token always wins when a consumer sets it.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-item-active-bg` — Pressed background of a legend visibility button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-legend-item-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of a legend visibility button.\n- `--lr-chart-legend-side-max` (default: `var(--lr-size-15rem)`) — Maximum inline size reserved for a side-positioned DOM legend; the track is also capped at one third of the chart allocation.\n- `--lr-chart-pattern-step` (default: `var(--lr-space-2xs)`) — Tile size of the texture painted on `[part='legend-swatch']` while `forced-colors: active` matches, where every series collapses to one system color and the stripe/crosshatch pattern becomes the only channel keeping series apart. Declared on the swatch part rather than the host; the stripe width within a tile stays `--lr-border-width-thin`, so a larger step spaces the stripes further apart.\n- `--lr-chart-reset-zoom-button-active-bg` — Pressed background of the reset-zoom button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-reset-zoom-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of the reset-zoom button.\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-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.\n- `--point-radius` (default: `var(--lr-space-2xs)`) — Line/scatter point radius.",
12746
12839
  "attributes": [
12840
+ {
12841
+ "name": "annotations",
12842
+ "description": "Declarative reference lines and shaded bands — a threshold, an event year, a regime change, a\nhighlighted period. Each entry marks either a single `value` or a `from`/`to` range on `axis`\n(default `'y'`), with an optional `label` and semantic `tone`.\n\nNeeds the optional `chartjs-plugin-annotation` peer, loaded on first actual demand so a page\nwith no annotated charts never downloads it. The plugin is registered globally, like\n`chartjs-plugin-zoom` and unlike `chartjs-plugin-datalabels`: it draws nothing unless a chart\nsupplies annotation options, so the registration is unobservable to charts that set none, and\nregistration is also what installs the plugin's own element defaults. Without the peer\ninstalled the chart still renders and a single console warning explains the no-op — the same\nfail-closed contract `data-labels` uses.\n\nEntries are included in the generated accessible description, mirroring `lr-heatmap`.\n\nType: `readonly LyraChartAnnotation[]` \nDefault: `[]`"
12843
+ },
12747
12844
  {
12748
12845
  "name": "area",
12749
12846
  "description": "Chart-wide default fill-under-line setting for line-type series; a series's own `LyraChartSeries.fill` overrides it.\n\nType: `boolean` \nDefault: `false`",
@@ -12848,6 +12945,16 @@
12848
12945
  "name": "plugins",
12849
12946
  "description": "Chart.js plugins attached to this chart instance.\n\nType: `LyraChartPlugin[]` \nDefault: `[]`"
12850
12947
  },
12948
+ {
12949
+ "name": "scale-type",
12950
+ "description": "Scale type for the **value** axis (the categorical axis is unaffected). `'logarithmic'` plots\na dataset spanning several orders of magnitude honestly, where a linear axis collapses\neverything below the maximum into the baseline. Inherited by `lr-line-chart`,\n`lr-scatter-chart` and `lr-bar-chart`.\n\nA logarithmic axis cannot represent zero or negative values (`log(0)` is `-Infinity`), so\n`beginAtZero` is not forwarded in that mode -- Chart.js would otherwise be handed a bound it\ncannot place. Non-positive data points are dropped by Chart.js's own log scale.\n\nType: `LyraChartScaleType` \nDefault: `'linear'`",
12951
+ "value": {
12952
+ "type": [
12953
+ "'linear'",
12954
+ "'logarithmic'"
12955
+ ]
12956
+ }
12957
+ },
12851
12958
  {
12852
12959
  "name": "show-data-table",
12853
12960
  "description": "Makes the generated data table visible; it remains screen-reader available when false.\n\nType: `boolean` \nDefault: `false`",
@@ -13049,7 +13156,8 @@
13049
13156
  "value": {
13050
13157
  "type": [
13051
13158
  "'linear'",
13052
- "'sqrt'"
13159
+ "'sqrt'",
13160
+ "'logarithmic'"
13053
13161
  ]
13054
13162
  }
13055
13163
  },
@@ -13280,7 +13388,7 @@
13280
13388
  },
13281
13389
  {
13282
13390
  "name": "lr-map",
13283
- "description": "`<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 peer-neutral\n`map` getter for common imperative operations. Its runtime value is the underlying MapLibre\nmap, while its declaration stays independent of the optional peer. Requires `maplibre-gl`\nv5 or v6; the component styles MapLibre's generated canvas, marker, popup, and control DOM\ninside its shadow root. MapLibre v6 is ESM-only, requires WebGL2, and needs its module-worker\nURL configured once; v5's standard build includes its worker.\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\nCall `LyraMap.preload()` before connecting an element to start the optional\npeer import early. `dataLayers[].sourceId` is a trimmed nonempty business identity; the first\noccurrence is retained and blanks or later duplicates are ignored. It is declarative component input;\nits backing MapLibre source and layers use collision-free component-owned\nids and must not be accessed through `map`.\n\nCollection-bearing inputs take bounded, recursively frozen snapshots synchronously. Mutate a\ncopy and reassign it to update the map; later changes to the assigned source are not observed.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `attribution` | MapLibre-generated map attribution. |\n| `attribution-toggle` | MapLibre's compact-attribution disclosure control. |\n| `base` | The non-semantic map wrapper. It exposes `aria-busy=\"true\"` while the optional map library loads and contains ordinary, non-live localized loading text. |\n| `container` | The MapLibre container. Its generated canvas is the actual focusable map region and receives the host-first accessible name and effective locale. |\n| `error` | Visible localized message shown instead of `container` when `mapStyle` is missing, the optional peer is unavailable, WebGL2 cannot be created, or map initialization fails; the transition is announced through the shared light-DOM assertive region. |\n| `legend` | The map legend. |\n| `legend-limit` | Visible localized summary when legend input is bounded or shortened. |\n| `legend-swatch` | A legend color swatch. |\n| `marker` | A MapLibre-generated marker, with a 24px minimum target in both axes even when a peer/custom marker has no intrinsic content size. |\n| `popup` | A MapLibre-generated marker popup. |\n| `popup-close-button` | The MapLibre-generated button that closes an open marker popup. |\n| `popup-content` | The content container inside a MapLibre-generated marker popup. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-map-choropleth-fill-opacity` (default: `0.75`) — Fill opacity for choropleth and polygon `dataLayers` fills. Read from the resolved cascade whenever those layers are applied or painted after a theme change.\n- `--lr-map-popup-close-button-active-bg` (default: `color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active))`) — Pressed background of `popup-close-button`.\n- `--lr-map-popup-close-button-active-color` (default: `var(--lr-color-brand)`) — Pressed foreground of `popup-close-button`. No style or tile provider is selected implicitly. Set `mapStyle` explicitly before connection; this prevents a bare component from making an undeclared third-party request.\n- `--lr-map-popup-close-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of `popup-close-button`.\n- `--lr-map-popup-close-button-hover-color` (default: `var(--lr-color-brand)`) — Hover foreground of `popup-close-button`.",
13391
+ "description": "`<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 peer-neutral\n`map` getter for common imperative operations. Its runtime value is the underlying MapLibre\nmap, while its declaration stays independent of the optional peer. Requires `maplibre-gl`\nv5 or v6; the component styles MapLibre's generated canvas, marker, popup, and control DOM\ninside its shadow root. MapLibre v6 is ESM-only, requires WebGL2, and needs its module-worker\nURL configured once; v5's standard build includes its worker.\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\nCall `LyraMap.preload()` before connecting an element to start the optional\npeer import early. `dataLayers[].sourceId` is a trimmed nonempty business identity; the first\noccurrence is retained and blanks or later duplicates are ignored. It is declarative component input;\nits backing MapLibre source and layers use collision-free component-owned\nids and must not be accessed through `map`.\n\nCollection-bearing inputs take bounded, recursively frozen snapshots synchronously. Mutate a\ncopy and reassign it to update the map; later changes to the assigned source are not observed.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| `legend` | Custom legend content, rendered inside the legend panel's own layout so it stays positioned with the map instead of floating beside it. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `attribution` | MapLibre-generated map attribution. |\n| `attribution-toggle` | MapLibre's compact-attribution disclosure control. |\n| `base` | The non-semantic map wrapper. It exposes `aria-busy=\"true\"` while the optional map library loads and contains ordinary, non-live localized loading text. |\n| `container` | The MapLibre container. Its generated canvas is the actual focusable map region and receives the host-first accessible name and effective locale. |\n| `error` | Visible localized message shown instead of `container` when `mapStyle` is missing, the optional peer is unavailable, WebGL2 cannot be created, or map initialization fails; the transition is announced through the shared light-DOM assertive region. |\n| `legend` | The map legend. |\n| `legend-gradient` | The continuous ramp bar rendered from `legendGradient`. |\n| `legend-hi` | The high endpoint caption of the `legendGradient` bar (mirrors `lr-heatmap`). |\n| `legend-limit` | Visible localized summary when legend input is bounded or shortened. |\n| `legend-lo` | The low endpoint caption of the `legendGradient` bar (mirrors `lr-heatmap`). |\n| `legend-swatch` | A legend color swatch. |\n| `marker` | A MapLibre-generated marker, with a 24px minimum target in both axes even when a peer/custom marker has no intrinsic content size. |\n| `popup` | A MapLibre-generated marker popup. |\n| `popup-close-button` | The MapLibre-generated button that closes an open marker popup. |\n| `popup-content` | The content container inside a MapLibre-generated marker popup. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-map-choropleth-fill-opacity` (default: `0.75`) — Fill opacity for choropleth and polygon `dataLayers` fills. Read from the resolved cascade whenever those layers are applied or painted after a theme change.\n- `--lr-map-popup-close-button-active-bg` (default: `color-mix(in oklab, var(--lr-color-brand-quiet), var(--lr-color-mix-partner) var(--lr-color-mix-active))`) — Pressed background of `popup-close-button`.\n- `--lr-map-popup-close-button-active-color` (default: `var(--lr-color-brand)`) — Pressed foreground of `popup-close-button`. No style or tile provider is selected implicitly. Set `mapStyle` explicitly before connection; this prevents a bare component from making an undeclared third-party request.\n- `--lr-map-popup-close-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of `popup-close-button`.\n- `--lr-map-popup-close-button-hover-color` (default: `var(--lr-color-brand)`) — Hover foreground of `popup-close-button`.",
13284
13392
  "attributes": [
13285
13393
  {
13286
13394
  "name": "center",
@@ -13295,6 +13403,14 @@
13295
13403
  ]
13296
13404
  }
13297
13405
  },
13406
+ {
13407
+ "name": "legend-gradient-hi-label",
13408
+ "description": "Overrides the high endpoint's caption; defaults to the highest stop value, locale-formatted.\n\nType: `string | null` \nDefault: `null`"
13409
+ },
13410
+ {
13411
+ "name": "legend-gradient-lo-label",
13412
+ "description": "Overrides the low endpoint's caption; defaults to the lowest stop value, locale-formatted.\n\nType: `string | null` \nDefault: `null`"
13413
+ },
13298
13414
  {
13299
13415
  "name": "locale",
13300
13416
  "description": "Optional locale override. Otherwise the nearest `locale`/`lang` ancestor is used.\n\nType: `string` \nDefault: `''`",
@@ -13593,16 +13709,11 @@
13593
13709
  },
13594
13710
  {
13595
13711
  "name": "lr-media-card",
13596
- "description": "`<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. Internal sink-specific\nvalidators 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-media-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-media-open`.\n\n**Navigation.** This component never navigates on its own for `image`/\n`video` — activating the card only fires noncancelable `lr-media-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-before-media-download` 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**Pressed-state theme controls.** `--lr-media-card-active-border-color`\nand `--lr-media-card-active-bg` retint only an image/file card while it is\npressed. They are resolved in the state rule, rather than declared on the\nhost, so a conversation or attachment-list ancestor can theme every card\nwithout muting its own values.\n\n**Accessible action name.** A declarative host `aria-label` remains on the\nhost as the component's overall name; it is not cloned onto a second\nsemantic owner. The actionable button or link keeps a localized,\npurpose-specific name derived from filename/alt/kind. A property-only\n`accessibleLabel` assignment can name that internal action when no host\nlabel is present. Neither path replaces image alt text or the video\ncontrol's own purpose label, and an explicitly empty host name does not\nleave the still-interactive nested action unnamed.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\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-active-bg` (default: `color-mix(in oklab, var(--lr-color-surface), var(--lr-color-mix-partner) var(--lr-color-mix-active))`) — Pressed background color for image/file card actions. **Chrome escape hatch.** `frame=\"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. `frame` is the library-wide name for this container treatment.\n- `--lr-media-card-active-border-color` (default: `color-mix(in oklab, var(--lr-color-brand), var(--lr-color-mix-partner) var(--lr-color-mix-active))`) — Pressed border color for image/file card actions.\n- `--lr-media-card-max-height` (default: `var(--lr-size-20rem)`) — Cap on the block size of the `<img>`/`<video>` in `[part=\"media\"]`.",
13712
+ "description": "`<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. Internal sink-specific\nvalidators 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-media-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-media-open`.\n\n**Navigation.** This component never navigates on its own for `image`/\n`video` — activating the card only fires noncancelable `lr-media-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-before-media-download` 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**Pressed-state theme controls.** `--lr-media-card-active-border-color`\nand `--lr-media-card-active-bg` retint only an image/file card while it is\npressed. They are resolved in the state rule, rather than declared on the\nhost, so a conversation or attachment-list ancestor can theme every card\nwithout muting its own values.\n\n**Accessible action name.** A declarative host `aria-label` remains on the\nhost as the component's overall name; it is not cloned onto a second\nsemantic owner. The actionable button or link keeps a localized,\npurpose-specific name derived from filename/alt/kind. A property-only\n`accessibleLabel` assignment can name that internal action when no host\nlabel is present. Neither path replaces image alt text or the video\ncontrol's own purpose label, and an explicitly empty host name does not\nleave the still-interactive nested action unnamed.\n\n**Decorative images.** `alt` is optional rather than empty-by-default, so\n`alt=\"\"` -- the HTML idiom for a purely decorative image -- reaches the\nrendered `<img>` verbatim instead of collapsing into the unset case and\npicking up a generated description. Leaving `alt` off keeps the\n`filename`-then-generic fallback. The `<video>` label is deliberately\noutside that carve-out: an empty accessible name would leave an\ninteractive player unnamed rather than mark it decorative.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\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-active-bg` (default: `color-mix(in oklab, var(--lr-color-surface), var(--lr-color-mix-partner) var(--lr-color-mix-active))`) — Pressed background color for image/file card actions. **Chrome escape hatch.** `frame=\"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. `frame` is the library-wide name for this container treatment.\n- `--lr-media-card-active-border-color` (default: `color-mix(in oklab, var(--lr-color-brand), var(--lr-color-mix-partner) var(--lr-color-mix-active))`) — Pressed border color for image/file card actions.\n- `--lr-media-card-max-height` (default: `var(--lr-size-20rem)`) — Cap on the block size of the `<img>`/`<video>` in `[part=\"media\"]`.",
13597
13713
  "attributes": [
13598
13714
  {
13599
13715
  "name": "alt",
13600
- "description": "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: `''`",
13601
- "value": {
13602
- "type": [
13603
- "string"
13604
- ]
13605
- }
13716
+ "description": "Alt text for the image case (and reused as a video label fallback). Unset falls back to\n`filename`, then a generic per-kind description; explicitly `\"\"` marks the image decorative,\nmatching `<lr-image-viewer>`/`<lr-document-preview>`. The `<video>` label is deliberately\noutside that carve-out: an empty accessible name would leave an interactive player unnamed\nrather than mark it decorative, so an empty `alt` still falls through there.\n\nType: `string | undefined`"
13606
13717
  },
13607
13718
  {
13608
13719
  "name": "aria-label",
@@ -16180,6 +16291,15 @@
16180
16291
  ]
16181
16292
  }
16182
16293
  },
16294
+ {
16295
+ "name": "worker-src",
16296
+ "description": "URL of the `pdfjs-dist` web worker chunk (`pdfjs-dist/build/pdf.worker.min.mjs`) as emitted by\nthe consuming application's own bundler. PDF.js rejects every `getDocument()` call with\n`No \"GlobalWorkerOptions.workerSrc\" specified.` until a worker is configured, and a bare package\nspecifier cannot be resolved from inside this library at runtime (there is no import map for it\nin a bundled app, and joining it to Lyra's own module URL points into Lyra's dist tree, where no\nworker exists), so a bundled application supplies the URL here. Document-relative values resolve\nagainst the document base; only `http:`, `https:`, `blob:` and `file:` URLs are accepted and\nanything else is ignored.\n\n`GlobalWorkerOptions` is PDF.js's process-wide singleton, so this is applied only while that\nsingleton is still unset: a worker the application configured itself is never overwritten, and\nwhen two viewers carry different values only the first one to load PDF.js takes effect for the\nwhole page. Assigning it after PDF.js has already loaded is not silently dropped -- it is\nre-applied on the next load -- but it still cannot displace a worker that is already configured.\nThe equivalent escape hatch, and the right choice for an application that wants one explicit\nworker for every viewer, is to import `pdfjs-dist` and set `GlobalWorkerOptions.workerSrc`\ndirectly during startup.\n\nType: `string` \nDefault: `''`",
16297
+ "value": {
16298
+ "type": [
16299
+ "string"
16300
+ ]
16301
+ }
16302
+ },
16183
16303
  {
16184
16304
  "name": "zoom",
16185
16305
  "description": "Page zoom multiplier, clamped to the range 0.25–4.\n\nType: `number` \nDefault: `1`",
@@ -16457,6 +16577,10 @@
16457
16577
  "name": "lr-pie-chart",
16458
16578
  "description": "`<lr-pie-chart>` — `<lr-chart>` with a `\"pie\"` default and the mirrored writable type. Single-series:\none `LyraChartSeries` with `data: number[]` and `color: string[]` as the slice palette.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | An optional `<script type=\"application/json\">` containing a Chart.js configuration. |\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. Use this escape hatch for a complete paginated or virtualized alternative when the generated 1,000-record sample is insufficient. |\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| `data-truncation` | Explanation shown when the generated accessible alternative samples a data set larger than its 1,000-record ceiling. |\n| `description` | The accessible chart summary. |\n| `error` | Static visible error shown instead of `canvas` when the optional `chart.js` peer dependency is not installed; its transition is announced through a shared light-DOM alert. |\n| `feature-warning` | Static nonfatal warning when a requested optional feature peer is unavailable while the core chart remains usable. |\n| `legend` | The wrapping DOM legend, rendered unless `withoutLegend` is set. |\n| `legend-item` | A keyboard-operable series visibility toggle. |\n| `legend-item-hidden` | Added to a `legend-item` while its dataset is hidden. |\n| `legend-swatch` | The resolved series-color swatch in a legend item. |\n| `notices` | Wrapper for nonfatal feature warnings and generated-data truncation notices. |\n| `plot` | The fixed-height canvas/overlay region. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--border-color-1` (default: `var(--lr-color-chart-1)`) — First dataset border color.\n- `--border-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset border color.\n- `--border-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset border color.\n- `--border-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset border color.\n- `--border-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset border color.\n- `--border-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset border color.\n- `--border-radius` (default: `var(--lr-radius)`) — Dataset element corner radius.\n- `--border-width` (default: `var(--lr-border-width-thin)`) — Dataset element border width.\n- `--fill-color-1` (default: `var(--lr-color-chart-1)`) — First dataset fill color.\n- `--fill-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset fill color.\n- `--fill-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset fill color.\n- `--fill-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset fill color.\n- `--fill-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset fill color.\n- `--fill-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset fill color.\n- `--grid-border-width` (default: `var(--lr-border-width-thin)`) — Axis and grid line width.\n- `--grid-color` (default: `var(--lr-chart-grid-color)`) — Grid line color.\n- `--line-border-width` (default: `var(--lr-border-width-medium)`) — Line dataset stroke width.\n- `--lr-chart-canvas-hover-outline-width` (default: `var(--lr-border-width-thin)`) — Width of the `[part='canvas']` hover-state outline (its color is `--lr-chart-grid-color`, above).\n- `--lr-chart-data-table-button-active-bg` — Pressed background of an actionable generated- table value; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-data-table-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of an actionable generated-table value.\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-height` (default: `var(--lr-size-280px)`) — The plot region's `block-size` and the host's minimum block size. A visible data table or wrapping DOM legend grows the host in normal flow instead of overlapping following content. `height` supplies a private fallback; this public token always wins when a consumer sets it.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-item-active-bg` — Pressed background of a legend visibility button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-legend-item-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of a legend visibility button.\n- `--lr-chart-legend-side-max` (default: `var(--lr-size-15rem)`) — Maximum inline size reserved for a side-positioned DOM legend; the track is also capped at one third of the chart allocation.\n- `--lr-chart-pattern-step` (default: `var(--lr-space-2xs)`) — Tile size of the texture painted on `[part='legend-swatch']` while `forced-colors: active` matches, where every series collapses to one system color and the stripe/crosshatch pattern becomes the only channel keeping series apart. Declared on the swatch part rather than the host; the stripe width within a tile stays `--lr-border-width-thin`, so a larger step spaces the stripes further apart.\n- `--lr-chart-reset-zoom-button-active-bg` — Pressed background of the reset-zoom button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-reset-zoom-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of the reset-zoom button.\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-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.\n- `--point-radius` (default: `var(--lr-space-2xs)`) — Line/scatter point radius.",
16459
16579
  "attributes": [
16580
+ {
16581
+ "name": "annotations",
16582
+ "description": "Declarative reference lines and shaded bands — a threshold, an event year, a regime change, a\nhighlighted period. Each entry marks either a single `value` or a `from`/`to` range on `axis`\n(default `'y'`), with an optional `label` and semantic `tone`.\n\nNeeds the optional `chartjs-plugin-annotation` peer, loaded on first actual demand so a page\nwith no annotated charts never downloads it. The plugin is registered globally, like\n`chartjs-plugin-zoom` and unlike `chartjs-plugin-datalabels`: it draws nothing unless a chart\nsupplies annotation options, so the registration is unobservable to charts that set none, and\nregistration is also what installs the plugin's own element defaults. Without the peer\ninstalled the chart still renders and a single console warning explains the no-op — the same\nfail-closed contract `data-labels` uses.\n\nEntries are included in the generated accessible description, mirroring `lr-heatmap`.\n\nType: `readonly LyraChartAnnotation[]` \nDefault: `[]`"
16583
+ },
16460
16584
  {
16461
16585
  "name": "area",
16462
16586
  "description": "Chart-wide default fill-under-line setting for line-type series; a series's own `LyraChartSeries.fill` overrides it.\n\nType: `boolean` \nDefault: `false`",
@@ -16561,6 +16685,16 @@
16561
16685
  "name": "plugins",
16562
16686
  "description": "Chart.js plugins attached to this chart instance.\n\nType: `LyraChartPlugin[]` \nDefault: `[]`"
16563
16687
  },
16688
+ {
16689
+ "name": "scale-type",
16690
+ "description": "Scale type for the **value** axis (the categorical axis is unaffected). `'logarithmic'` plots\na dataset spanning several orders of magnitude honestly, where a linear axis collapses\neverything below the maximum into the baseline. Inherited by `lr-line-chart`,\n`lr-scatter-chart` and `lr-bar-chart`.\n\nA logarithmic axis cannot represent zero or negative values (`log(0)` is `-Infinity`), so\n`beginAtZero` is not forwarded in that mode -- Chart.js would otherwise be handed a bound it\ncannot place. Non-positive data points are dropped by Chart.js's own log scale.\n\nType: `LyraChartScaleType` \nDefault: `'linear'`",
16691
+ "value": {
16692
+ "type": [
16693
+ "'linear'",
16694
+ "'logarithmic'"
16695
+ ]
16696
+ }
16697
+ },
16564
16698
  {
16565
16699
  "name": "show-data-table",
16566
16700
  "description": "Makes the generated data table visible; it remains screen-reader available when false.\n\nType: `boolean` \nDefault: `false`",
@@ -16656,6 +16790,10 @@
16656
16790
  "name": "lr-polar-area-chart",
16657
16791
  "description": "`<lr-polar-area-chart>` — `<lr-chart>` with a `\"polarArea\"` default and the mirrored writable type.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | An optional `<script type=\"application/json\">` containing a Chart.js configuration. |\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. Use this escape hatch for a complete paginated or virtualized alternative when the generated 1,000-record sample is insufficient. |\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| `data-truncation` | Explanation shown when the generated accessible alternative samples a data set larger than its 1,000-record ceiling. |\n| `description` | The accessible chart summary. |\n| `error` | Static visible error shown instead of `canvas` when the optional `chart.js` peer dependency is not installed; its transition is announced through a shared light-DOM alert. |\n| `feature-warning` | Static nonfatal warning when a requested optional feature peer is unavailable while the core chart remains usable. |\n| `legend` | The wrapping DOM legend, rendered unless `withoutLegend` is set. |\n| `legend-item` | A keyboard-operable series visibility toggle. |\n| `legend-item-hidden` | Added to a `legend-item` while its dataset is hidden. |\n| `legend-swatch` | The resolved series-color swatch in a legend item. |\n| `notices` | Wrapper for nonfatal feature warnings and generated-data truncation notices. |\n| `plot` | The fixed-height canvas/overlay region. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--border-color-1` (default: `var(--lr-color-chart-1)`) — First dataset border color.\n- `--border-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset border color.\n- `--border-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset border color.\n- `--border-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset border color.\n- `--border-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset border color.\n- `--border-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset border color.\n- `--border-radius` (default: `var(--lr-radius)`) — Dataset element corner radius.\n- `--border-width` (default: `var(--lr-border-width-thin)`) — Dataset element border width.\n- `--fill-color-1` (default: `var(--lr-color-chart-1)`) — First dataset fill color.\n- `--fill-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset fill color.\n- `--fill-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset fill color.\n- `--fill-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset fill color.\n- `--fill-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset fill color.\n- `--fill-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset fill color.\n- `--grid-border-width` (default: `var(--lr-border-width-thin)`) — Axis and grid line width.\n- `--grid-color` (default: `var(--lr-chart-grid-color)`) — Grid line color.\n- `--line-border-width` (default: `var(--lr-border-width-medium)`) — Line dataset stroke width.\n- `--lr-chart-canvas-hover-outline-width` (default: `var(--lr-border-width-thin)`) — Width of the `[part='canvas']` hover-state outline (its color is `--lr-chart-grid-color`, above).\n- `--lr-chart-data-table-button-active-bg` — Pressed background of an actionable generated- table value; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-data-table-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of an actionable generated-table value.\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-height` (default: `var(--lr-size-280px)`) — The plot region's `block-size` and the host's minimum block size. A visible data table or wrapping DOM legend grows the host in normal flow instead of overlapping following content. `height` supplies a private fallback; this public token always wins when a consumer sets it.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-item-active-bg` — Pressed background of a legend visibility button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-legend-item-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of a legend visibility button.\n- `--lr-chart-legend-side-max` (default: `var(--lr-size-15rem)`) — Maximum inline size reserved for a side-positioned DOM legend; the track is also capped at one third of the chart allocation.\n- `--lr-chart-pattern-step` (default: `var(--lr-space-2xs)`) — Tile size of the texture painted on `[part='legend-swatch']` while `forced-colors: active` matches, where every series collapses to one system color and the stripe/crosshatch pattern becomes the only channel keeping series apart. Declared on the swatch part rather than the host; the stripe width within a tile stays `--lr-border-width-thin`, so a larger step spaces the stripes further apart.\n- `--lr-chart-reset-zoom-button-active-bg` — Pressed background of the reset-zoom button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-reset-zoom-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of the reset-zoom button.\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-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.\n- `--point-radius` (default: `var(--lr-space-2xs)`) — Line/scatter point radius.",
16658
16792
  "attributes": [
16793
+ {
16794
+ "name": "annotations",
16795
+ "description": "Declarative reference lines and shaded bands — a threshold, an event year, a regime change, a\nhighlighted period. Each entry marks either a single `value` or a `from`/`to` range on `axis`\n(default `'y'`), with an optional `label` and semantic `tone`.\n\nNeeds the optional `chartjs-plugin-annotation` peer, loaded on first actual demand so a page\nwith no annotated charts never downloads it. The plugin is registered globally, like\n`chartjs-plugin-zoom` and unlike `chartjs-plugin-datalabels`: it draws nothing unless a chart\nsupplies annotation options, so the registration is unobservable to charts that set none, and\nregistration is also what installs the plugin's own element defaults. Without the peer\ninstalled the chart still renders and a single console warning explains the no-op — the same\nfail-closed contract `data-labels` uses.\n\nEntries are included in the generated accessible description, mirroring `lr-heatmap`.\n\nType: `readonly LyraChartAnnotation[]` \nDefault: `[]`"
16796
+ },
16659
16797
  {
16660
16798
  "name": "area",
16661
16799
  "description": "Chart-wide default fill-under-line setting for line-type series; a series's own `LyraChartSeries.fill` overrides it.\n\nType: `boolean` \nDefault: `false`",
@@ -16760,6 +16898,16 @@
16760
16898
  "name": "plugins",
16761
16899
  "description": "Chart.js plugins attached to this chart instance.\n\nType: `LyraChartPlugin[]` \nDefault: `[]`"
16762
16900
  },
16901
+ {
16902
+ "name": "scale-type",
16903
+ "description": "Scale type for the **value** axis (the categorical axis is unaffected). `'logarithmic'` plots\na dataset spanning several orders of magnitude honestly, where a linear axis collapses\neverything below the maximum into the baseline. Inherited by `lr-line-chart`,\n`lr-scatter-chart` and `lr-bar-chart`.\n\nA logarithmic axis cannot represent zero or negative values (`log(0)` is `-Infinity`), so\n`beginAtZero` is not forwarded in that mode -- Chart.js would otherwise be handed a bound it\ncannot place. Non-positive data points are dropped by Chart.js's own log scale.\n\nType: `LyraChartScaleType` \nDefault: `'linear'`",
16904
+ "value": {
16905
+ "type": [
16906
+ "'linear'",
16907
+ "'logarithmic'"
16908
+ ]
16909
+ }
16910
+ },
16763
16911
  {
16764
16912
  "name": "show-data-table",
16765
16913
  "description": "Makes the generated data table visible; it remains screen-reader available when false.\n\nType: `boolean` \nDefault: `false`",
@@ -16946,6 +17094,15 @@
16946
17094
  ]
16947
17095
  }
16948
17096
  },
17097
+ {
17098
+ "name": "disabled",
17099
+ "description": "Prevents opening the popover -- pointer, keyboard, and programmatic `show()`/`open = true`\nare all refused while set. Becoming disabled also closes an already-open popover; initial\n`disabled` plus `open` markup/property state normalizes closed in either order. Mirrors\n`<lr-tooltip>`'s and `<lr-dropdown>`'s own `disabled`.\n\nType: `boolean` \nDefault: `false`",
17100
+ "value": {
17101
+ "type": [
17102
+ "boolean"
17103
+ ]
17104
+ }
17105
+ },
16949
17106
  {
16950
17107
  "name": "distance",
16951
17108
  "description": "Anchor-offset distance (px) passed to Floating UI's `offset()` middleware. Can legitimately\nbe negative (overlaps the popup with the trigger); NaN/non-finite falls back to the default.\n\nType: `number` \nDefault: `8`",
@@ -17405,7 +17562,7 @@
17405
17562
  },
17406
17563
  {
17407
17564
  "name": "lr-progress-ring",
17408
- "description": "`<lr-progress-ring>` — a circular determinate or indeterminate progress indicator. `variant`\nselects the indicator's semantic palette from the library's shared semantic grid (`neutral`\nthrough `danger`), defaulting to `brand`, matching sibling `<lr-progress-bar>`.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Optional center label whose visible accessible text names the progressbar unless an explicit accessible label overrides it; live mutations stay synchronized through forwarding slots. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | Compatibility name for the progress wrapper; use `progress-ring`. |\n| `indicator` | The SVG indicator. |\n| `label` | The center label. |\n| `progress-ring` | The progress wrapper. It is the same node as `base`. |\n| `track` | The SVG track. |\n\n---\n\n**CSS Custom Properties**\n\n- `--indicator-color` (default: `var(--lr-progress-ring-indicator-color)`) — Upstream-compatible indicator color.\n- `--indicator-transition-duration` (default: `var(--lr-progress-ring-indicator-transition-duration)`) — Upstream-compatible transition duration.\n- `--indicator-width` (default: `var(--lr-progress-ring-indicator-width)`) — Upstream-compatible indicator width.\n- `--lr-progress-duration` (default: `var(--lr-transition-ambient)`) — Indeterminate rotation timing.\n- `--lr-progress-ring-indicator-color` (default: `var(--lr-progress-ring-indicator-variant-color)`) — Indicator stroke color, overriding the variant palette below.\n- `--lr-progress-ring-indicator-transition-duration` (default: `var(--lr-transition-base)`) — Determinate indicator transition.\n- `--lr-progress-ring-indicator-variant-color` (default: `var(--lr-color-fill-loud,var(--lr-color-brand))`) — Palette slot: the active `variant`'s loud fill from the shared semantic grid. Feeds `--lr-progress-ring-indicator-color` above unless that (or the upstream `--indicator-color` alias) is itself set.\n- `--lr-progress-ring-indicator-width` (default: `var(--lr-progress-ring-track-width)`) — Indicator stroke width.\n- `--lr-progress-ring-size` (default: `var(--lr-size-2-5rem)`) — Outer diameter of the ring.\n- `--lr-progress-ring-track-color` (default: `var(--lr-color-brand-quiet)`) — Track stroke color.\n- `--lr-progress-ring-track-width` (default: `var(--lr-size-4px)`) — Track stroke width.\n- `--size` (default: `var(--lr-progress-ring-size)`) — Upstream-compatible outer diameter.\n- `--track-color` (default: `var(--lr-progress-ring-track-color)`) — Upstream-compatible track color.\n- `--track-width` (default: `var(--lr-progress-ring-track-width)`) — Upstream-compatible track width.",
17565
+ "description": "`<lr-progress-ring>` — a circular determinate or indeterminate progress indicator. `variant`\nselects the indicator's semantic palette from the library's shared semantic grid (`neutral`\nthrough `danger`), defaulting to `brand`, matching sibling `<lr-progress-bar>`.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Optional center label whose visible accessible text names the progressbar unless an explicit accessible label overrides it; live mutations stay synchronized through forwarding slots. When nothing is slotted, the fallback content is the formatted percentage while determinate and `show-value` is set (`''` otherwise, and always `''` while `indeterminate`) -- the same value contract as `<lr-progress-bar>`'s `showValue`. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | Compatibility name for the progress wrapper; use `progress-ring`. |\n| `indicator` | The SVG indicator. |\n| `label` | The center label. |\n| `progress-ring` | The progress wrapper. It is the same node as `base`. |\n| `track` | The SVG track. |\n\n---\n\n**CSS Custom Properties**\n\n- `--indicator-color` (default: `var(--lr-progress-ring-indicator-color)`) — Upstream-compatible indicator color.\n- `--indicator-transition-duration` (default: `var(--lr-progress-ring-indicator-transition-duration)`) — Upstream-compatible transition duration.\n- `--indicator-width` (default: `var(--lr-progress-ring-indicator-width)`) — Upstream-compatible indicator width.\n- `--lr-progress-duration` (default: `var(--lr-transition-ambient)`) — Indeterminate rotation timing.\n- `--lr-progress-ring-indicator-color` (default: `var(--lr-progress-ring-indicator-variant-color)`) — Indicator stroke color, overriding the variant palette below.\n- `--lr-progress-ring-indicator-transition-duration` (default: `var(--lr-transition-base)`) — Determinate indicator transition.\n- `--lr-progress-ring-indicator-variant-color` (default: `var(--lr-color-fill-loud,var(--lr-color-brand))`) — Palette slot: the active `variant`'s loud fill from the shared semantic grid. Feeds `--lr-progress-ring-indicator-color` above unless that (or the upstream `--indicator-color` alias) is itself set.\n- `--lr-progress-ring-indicator-width` (default: `var(--lr-progress-ring-track-width)`) — Indicator stroke width.\n- `--lr-progress-ring-size` (default: `var(--lr-size-2-5rem)`) — Outer diameter of the ring.\n- `--lr-progress-ring-track-color` (default: `var(--lr-color-brand-quiet)`) — Track stroke color.\n- `--lr-progress-ring-track-width` (default: `var(--lr-size-4px)`) — Track stroke width.\n- `--size` (default: `var(--lr-progress-ring-size)`) — Upstream-compatible outer diameter.\n- `--track-color` (default: `var(--lr-progress-ring-track-color)`) — Upstream-compatible track color.\n- `--track-width` (default: `var(--lr-progress-ring-track-width)`) — Upstream-compatible track width.",
17409
17566
  "attributes": [
17410
17567
  {
17411
17568
  "name": "accessible-label",
@@ -17452,6 +17609,15 @@
17452
17609
  ]
17453
17610
  }
17454
17611
  },
17612
+ {
17613
+ "name": "show-value",
17614
+ "description": "Shows the formatted percentage as the default slot's fallback content while determinate.\n`false` by default, matching sibling `<lr-progress-bar>`'s `showValue`/`show-value` exactly --\na determinate ring with no `show-value` renders no percentage text. Only the fallback is\ngated: a consumer who slots their own content always sees that content instead, with or\nwithout `show-value` (native `<slot>` projection semantics, unaffected by this property).\n\nType: `boolean` \nDefault: `false`",
17615
+ "value": {
17616
+ "type": [
17617
+ "boolean"
17618
+ ]
17619
+ }
17620
+ },
17455
17621
  {
17456
17622
  "name": "value",
17457
17623
  "description": "Type: `number` \nDefault: `0`",
@@ -17908,7 +18074,7 @@
17908
18074
  },
17909
18075
  {
17910
18076
  "name": "lr-qr-code",
17911
- "description": "`<lr-qr-code>` -- encodes `value` as a QR symbol with the optional\n`qrcode` peer dependency (Reed-Solomon error correction and every other\nalgorithmic step of the QR spec is delegated to that library, never\nhand-rolled) and draws the resulting module matrix across the full canvas,\none square (optionally rounded) cell per module. Like the mirrored WA/SL\ncomponents, it does not inject a quiet zone; add host CSS `padding` when a\nscanner or physical output needs one.\n\nThe stable host is the single semantic owner while a value is loading or\nrendered. Its accessible name resolves, in order, from a host `aria-label`\nattribute, `label`, then `value`; the canvas is presentational. The same\nhost publishes `aria-busy=\"true\"` and `\"false\"`. An empty `value` renders\n`[part=\"empty\"]` without image semantics.\n\nStandard host `color` and `background-color` control foreground and\nbackground paint. `--lr-qr-code-fill` and `--lr-qr-code-background` are\noptional aliases for those host styles; otherwise inherited color and the\nhost's transparent background are preserved. The permanent upstream parity\nproperties `fill` and `background` take precedence over those CSS inputs.\nShoelace migration inserts its historical black/white defaults.\n\nThe mirrored renderers use a fixed two backing pixels per CSS pixel rather\nthan the live device pixel ratio. Lyra preserves that geometry for ordinary\nsizes and uniformly reduces only extreme allocations to a bounded pixel\nbudget; CSS size and aspect ratio do not change.\n\nDeliberately out of scope for this component, not oversights: a finder-pattern-corner accent\ncolor; auto-shrinking to fit a\nnarrow container (this component's `size` is a direct request for a\nspecific rendered pixel density, like `<img width height>` -- the consumer\npicks a size that fits their layout, this component never second-guesses\nit, though it still renders correctly at its default size inside a narrow\nallocation); form association (`value` is caller-supplied display data the\nuser doesn't edit through this component -- no `FormAssociated` mixin, no\nlabel/hint/error chrome, no form internals); and playback behavior. Keyboard\nfocus is intentionally absent -- the canvas is a static image\nstanding in for `value`, structurally like `<img>`, not an interactive\ngrid.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n- Deprecated part `base`: Deprecated since `8.2.3`. Use part `::part(qr-code)`. Removal is not permitted before `10.0.0`. The qr-code part names the rendered code wrapper explicitly; base remains on that same node during the compatibility window.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | Deprecated in 8.2.3; compatibility name for the outer wrapper; use `qr-code`. |\n| `canvas` | The stable QR canvas. It remains hidden but reachable through `.canvas` while the component is empty, loading, or in an error state. |\n| `empty` | Shown when `value` is empty. |\n| `error` | Visible error shown when the peer is missing, or `value` failed to encode; the transition is announced through the shared light-DOM assertive region. |\n| `loading` | Shown while the optional `qrcode` peer is loading, the first time it's needed. |\n| `qr-code` | The outer wrapper, sized to `size`×`size` CSS px in every state. It is the same node as `base`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-qr-code-background` — Optional alias for host `background-color`, used by the canvas background.\n- `--lr-qr-code-fill` — Optional alias for host `color`, used by foreground modules.",
18077
+ "description": "`<lr-qr-code>` -- encodes `value` as a QR symbol with the optional\n`qrcode` peer dependency (Reed-Solomon error correction and every other\nalgorithmic step of the QR spec is delegated to that library, never\nhand-rolled) and draws the resulting module matrix across the full canvas,\none square (optionally rounded) cell per module. Like the mirrored WA/SL\ncomponents, it does not inject a quiet zone; add host CSS `padding` when a\nscanner or physical output needs one.\n\nThe stable host is the single semantic owner while a value is loading or\nrendered. Its accessible name resolves, in order, from a host `aria-label`\nattribute, `label`, then `value`; the canvas is presentational. The same\nhost publishes `aria-busy=\"true\"` and `\"false\"`. An empty `value` renders\n`[part=\"empty\"]` without image semantics.\n\nStandard host `color` and `background-color` control foreground and\nbackground paint. `--lr-qr-code-fill` and `--lr-qr-code-background` are\noptional aliases for those host styles; otherwise inherited color and the\nhost's transparent background are preserved. The permanent upstream parity\nproperties `fill` and `background` take precedence over those CSS inputs.\nShoelace migration inserts its historical black/white defaults.\n\nThe mirrored renderers use a fixed two backing pixels per CSS pixel rather\nthan the live device pixel ratio. Lyra preserves that geometry for ordinary\nsizes and uniformly reduces only extreme allocations to a bounded pixel\nbudget; CSS size and aspect ratio do not change.\n\nDeliberately out of scope for this component, not oversights: a finder-pattern-corner accent\ncolor; auto-shrinking to fit a\nnarrow container (this component's `size` is a direct request for a\nspecific rendered pixel density, like `<img width height>` -- the consumer\npicks a size that fits their layout, this component never second-guesses\nit, though it still renders correctly at its default size inside a narrow\nallocation); form association (`value` is caller-supplied display data the\nuser doesn't edit through this component -- no `FormAssociated` mixin, no\nlabel/hint/error chrome, no form internals); and playback behavior. Keyboard\nfocus is intentionally absent -- the canvas is a static image\nstanding in for `value`, structurally like `<img>`, not an interactive\ngrid.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n- Deprecated part `base`: Deprecated since `8.2.3`. Use part `::part(qr-code)`. Removal is not permitted before `10.0.0`. The qr-code part names the rendered code wrapper explicitly; base remains on that same node during the compatibility window. That version is a policy floor, not a plan: `wa-qr-code` still publishes `base` as a deprecated part and `sl-qr-code` still publishes it as its only, undeprecated part, so this alias stays for as long as either upstream ships it.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | Deprecated in 8.2.3; compatibility name for the outer wrapper; use `qr-code`. |\n| `canvas` | The stable QR canvas. It remains hidden but reachable through `.canvas` while the component is empty, loading, or in an error state. |\n| `empty` | Shown when `value` is empty. |\n| `error` | Visible error shown when the peer is missing, or `value` failed to encode; the transition is announced through the shared light-DOM assertive region. |\n| `loading` | Shown while the optional `qrcode` peer is loading, the first time it's needed. |\n| `qr-code` | The outer wrapper, sized to `size`×`size` CSS px in every state. It is the same node as `base`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-qr-code-background` — Optional alias for host `background-color`, used by the canvas background.\n- `--lr-qr-code-fill` — Optional alias for host `color`, used by foreground modules.",
17912
18078
  "attributes": [
17913
18079
  {
17914
18080
  "name": "background",
@@ -18007,6 +18173,10 @@
18007
18173
  "name": "lr-radar-chart",
18008
18174
  "description": "`<lr-radar-chart>` — `<lr-chart>` with a `\"radar\"` default and the mirrored writable type.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | An optional `<script type=\"application/json\">` containing a Chart.js configuration. |\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. Use this escape hatch for a complete paginated or virtualized alternative when the generated 1,000-record sample is insufficient. |\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| `data-truncation` | Explanation shown when the generated accessible alternative samples a data set larger than its 1,000-record ceiling. |\n| `description` | The accessible chart summary. |\n| `error` | Static visible error shown instead of `canvas` when the optional `chart.js` peer dependency is not installed; its transition is announced through a shared light-DOM alert. |\n| `feature-warning` | Static nonfatal warning when a requested optional feature peer is unavailable while the core chart remains usable. |\n| `legend` | The wrapping DOM legend, rendered unless `withoutLegend` is set. |\n| `legend-item` | A keyboard-operable series visibility toggle. |\n| `legend-item-hidden` | Added to a `legend-item` while its dataset is hidden. |\n| `legend-swatch` | The resolved series-color swatch in a legend item. |\n| `notices` | Wrapper for nonfatal feature warnings and generated-data truncation notices. |\n| `plot` | The fixed-height canvas/overlay region. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--border-color-1` (default: `var(--lr-color-chart-1)`) — First dataset border color.\n- `--border-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset border color.\n- `--border-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset border color.\n- `--border-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset border color.\n- `--border-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset border color.\n- `--border-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset border color.\n- `--border-radius` (default: `var(--lr-radius)`) — Dataset element corner radius.\n- `--border-width` (default: `var(--lr-border-width-thin)`) — Dataset element border width.\n- `--fill-color-1` (default: `var(--lr-color-chart-1)`) — First dataset fill color.\n- `--fill-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset fill color.\n- `--fill-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset fill color.\n- `--fill-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset fill color.\n- `--fill-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset fill color.\n- `--fill-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset fill color.\n- `--grid-border-width` (default: `var(--lr-border-width-thin)`) — Axis and grid line width.\n- `--grid-color` (default: `var(--lr-chart-grid-color)`) — Grid line color.\n- `--line-border-width` (default: `var(--lr-border-width-medium)`) — Line dataset stroke width.\n- `--lr-chart-canvas-hover-outline-width` (default: `var(--lr-border-width-thin)`) — Width of the `[part='canvas']` hover-state outline (its color is `--lr-chart-grid-color`, above).\n- `--lr-chart-data-table-button-active-bg` — Pressed background of an actionable generated- table value; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-data-table-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of an actionable generated-table value.\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-height` (default: `var(--lr-size-280px)`) — The plot region's `block-size` and the host's minimum block size. A visible data table or wrapping DOM legend grows the host in normal flow instead of overlapping following content. `height` supplies a private fallback; this public token always wins when a consumer sets it.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-item-active-bg` — Pressed background of a legend visibility button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-legend-item-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of a legend visibility button.\n- `--lr-chart-legend-side-max` (default: `var(--lr-size-15rem)`) — Maximum inline size reserved for a side-positioned DOM legend; the track is also capped at one third of the chart allocation.\n- `--lr-chart-pattern-step` (default: `var(--lr-space-2xs)`) — Tile size of the texture painted on `[part='legend-swatch']` while `forced-colors: active` matches, where every series collapses to one system color and the stripe/crosshatch pattern becomes the only channel keeping series apart. Declared on the swatch part rather than the host; the stripe width within a tile stays `--lr-border-width-thin`, so a larger step spaces the stripes further apart.\n- `--lr-chart-reset-zoom-button-active-bg` — Pressed background of the reset-zoom button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-reset-zoom-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of the reset-zoom button.\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-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.\n- `--point-radius` (default: `var(--lr-space-2xs)`) — Line/scatter point radius.",
18009
18175
  "attributes": [
18176
+ {
18177
+ "name": "annotations",
18178
+ "description": "Declarative reference lines and shaded bands — a threshold, an event year, a regime change, a\nhighlighted period. Each entry marks either a single `value` or a `from`/`to` range on `axis`\n(default `'y'`), with an optional `label` and semantic `tone`.\n\nNeeds the optional `chartjs-plugin-annotation` peer, loaded on first actual demand so a page\nwith no annotated charts never downloads it. The plugin is registered globally, like\n`chartjs-plugin-zoom` and unlike `chartjs-plugin-datalabels`: it draws nothing unless a chart\nsupplies annotation options, so the registration is unobservable to charts that set none, and\nregistration is also what installs the plugin's own element defaults. Without the peer\ninstalled the chart still renders and a single console warning explains the no-op — the same\nfail-closed contract `data-labels` uses.\n\nEntries are included in the generated accessible description, mirroring `lr-heatmap`.\n\nType: `readonly LyraChartAnnotation[]` \nDefault: `[]`"
18179
+ },
18010
18180
  {
18011
18181
  "name": "area",
18012
18182
  "description": "Chart-wide default fill-under-line setting for line-type series; a series's own `LyraChartSeries.fill` overrides it.\n\nType: `boolean` \nDefault: `false`",
@@ -18111,6 +18281,16 @@
18111
18281
  "name": "plugins",
18112
18282
  "description": "Chart.js plugins attached to this chart instance.\n\nType: `LyraChartPlugin[]` \nDefault: `[]`"
18113
18283
  },
18284
+ {
18285
+ "name": "scale-type",
18286
+ "description": "Scale type for the **value** axis (the categorical axis is unaffected). `'logarithmic'` plots\na dataset spanning several orders of magnitude honestly, where a linear axis collapses\neverything below the maximum into the baseline. Inherited by `lr-line-chart`,\n`lr-scatter-chart` and `lr-bar-chart`.\n\nA logarithmic axis cannot represent zero or negative values (`log(0)` is `-Infinity`), so\n`beginAtZero` is not forwarded in that mode -- Chart.js would otherwise be handed a bound it\ncannot place. Non-positive data points are dropped by Chart.js's own log scale.\n\nType: `LyraChartScaleType` \nDefault: `'linear'`",
18287
+ "value": {
18288
+ "type": [
18289
+ "'linear'",
18290
+ "'logarithmic'"
18291
+ ]
18292
+ }
18293
+ },
18114
18294
  {
18115
18295
  "name": "show-data-table",
18116
18296
  "description": "Makes the generated data table visible; it remains screen-reader available when false.\n\nType: `boolean` \nDefault: `false`",
@@ -18693,7 +18873,7 @@
18693
18873
  },
18694
18874
  {
18695
18875
  "name": "lr-random-content",
18696
- "description": "`<lr-random-content>` — displays a randomly (or sequentially) chosen\nsubset of its slotted children and hides the rest, for A/B copy testing,\ntestimonial/quote rotation, or varying marketing copy on each render or\ninterval without any custom JS beyond slotting the candidates.\n\nNot a form-associated control: it is a content-rotation primitive over\ncaller-supplied children, so the label/hint/error frame doesn't apply.\nIts only built-in action is the autoplay pause/resume control.\n\nThe host renders `display: block` by default, like the rest of this\nfamily. A consumer needing an inline text-fragment swap inside a sentence\ncan override `lr-random-content { display: inline; }` from outside —\nthat isn't baked in here, since `display: contents` on the host risks\naccessibility-tree inconsistencies across engines.\n\nSelection is driven by `autoplay`/`autoplayInterval` and the public\n`randomize()` method. When autoplay is enabled, a built-in localized\npause/resume action exposes the reflected `paused` state. Rotation also\nsuspends while focus is anywhere inside the component and never hides a\nsubtree that currently owns focus.\nSelection changes after mount are announced through a pre-mounted light-DOM live region,\nexcept for timer-driven autoplay ticks. In particular, an explicit `randomize()` call is\nannounced even while autoplay is enabled. Announcement text omits subtree-pruned content; a\nvisibility-hidden wrapper omits its own text but can contain a visible override descendant.\nA nested forwarding slot contributes flattened assigned text rather than fallback content;\nlater assigned-content and assignment changes are announced when they change the exposed\nselection, while initial distribution stays silent.\nChanges while the host or a composed ancestor is accessibility-hidden, as well as initial\nconnection and reconnection, stay silent.\nReactive selection changes written while detached and rendered during reconnection are part of\nthat silent baseline; a later explicit `randomize()` is still announced.\n\n`fade-left`/`fade-right` are physical-direction transforms (matching the\nupstream naming this component mirrors), not \"previous/next\" navigational\nsemantics like a carousel chevron, so they are deliberately **not**\nmirrored under `:host(:dir(rtl))`.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The pool of candidate children. Direct element children are eligible; a direct forwarding slot is flattened to its projected element candidates. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The wrapping element around the default slot. |\n| `pause-button` | The autoplay pause/resume action. |\n\n---\n\n**CSS Custom Properties**\n\n- `--animation-duration` (default: `300ms`) — Web Awesome duration alias.\n- `--animation-easing` (default: `ease`) — Web Awesome easing alias.\n- `--animation-translate` (default: `var(--lr-size-0-5em)`) — Web Awesome travel-distance alias.\n- `--lr-animation-duration` (default: `300ms`) — Mapped duration of the entrance animation.\n- `--lr-animation-easing` (default: `ease`) — Mapped easing function for the entrance animation.\n- `--lr-animation-translate` (default: `var(--lr-size-0-5em)`) — Mapped travel distance for directional animations.\n- `--lr-random-content-animation-duration` (default: `300ms`) — Duration of the entrance animation.\n- `--lr-random-content-animation-easing` (default: `ease`) — Easing function for the entrance animation.\n- `--lr-random-content-animation-translate` (default: `var(--lr-size-0-5em)`) — Translation distance for directional animations.\n- `--lr-random-content-item-alignment` (default: `flex-start`) — Cross-axis alignment of selected items.\n- `--lr-random-content-item-gap` (default: `var(--lr-space-s)`) — Gap between simultaneously selected items.",
18876
+ "description": "`<lr-random-content>` — displays a randomly (or sequentially) chosen\nsubset of its slotted children and hides the rest, for A/B copy testing,\ntestimonial/quote rotation, or varying marketing copy on each render or\ninterval without any custom JS beyond slotting the candidates.\n\nNot a form-associated control: it is a content-rotation primitive over\ncaller-supplied children, so the label/hint/error frame doesn't apply.\nIts only built-in action is the autoplay pause/resume control.\n\nThe host renders `display: block` by default, like the rest of this\nfamily. A consumer needing an inline text-fragment swap inside a sentence\ncan override `lr-random-content { display: inline; }` from outside —\nthat isn't baked in here, since `display: contents` on the host risks\naccessibility-tree inconsistencies across engines.\n\nSelection is driven by `autoplay`/`autoplayInterval` and the public\n`randomize()` method. When autoplay is enabled, a built-in localized\npause/resume action exposes the reflected `paused` state. Rotation also\nsuspends while focus is anywhere inside the component and never hides a\nsubtree that currently owns focus.\nSelection changes after mount are announced through a pre-mounted light-DOM live region,\nexcept for timer-driven autoplay ticks. In particular, an explicit `randomize()` call is\nannounced even while autoplay is enabled. Announcement text omits subtree-pruned content; a\nvisibility-hidden wrapper omits its own text but can contain a visible override descendant.\nA nested forwarding slot contributes flattened assigned text rather than fallback content;\nlater assigned-content and assignment changes are announced when they change the exposed\nselection, while initial distribution stays silent.\nChanges while the host or a composed ancestor is accessibility-hidden, as well as initial\nconnection and reconnection, stay silent.\nReactive selection changes written while detached and rendered during reconnection are part of\nthat silent baseline; a later explicit `randomize()` is still announced.\n\n**Before script runs, the first candidate is the one that shows.** Selection happens in\n`firstUpdated()`, which a server renderer never executes, and it works by setting\n`hidden`/`aria-hidden` on light-DOM siblings — something Lit's hydration diffing never inspects,\nso no amount of first-render seeding can make the server agree. The shadow stylesheet therefore\nhides every candidate after the first until a selection has actually been applied: a\nserver-rendered page (and a page whose script never runs at all) paints one candidate rather\nthan the entire pool, and hydration swaps that one for the chosen one instead of collapsing N\ndown to one. Randomness itself is genuinely unavailable server-side — there is no seed to share\n— so authors who need a *specific* pre-hydration candidate order the pool accordingly.\n\n`fade-left`/`fade-right` are physical-direction transforms (matching the\nupstream naming this component mirrors), not \"previous/next\" navigational\nsemantics like a carousel chevron, so they are deliberately **not**\nmirrored under `:host(:dir(rtl))`.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | The pool of candidate children. Direct element children are eligible; a direct forwarding slot is flattened to its projected element candidates. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The wrapping element around the default slot. |\n| `pause-button` | The autoplay pause/resume action. |\n\n---\n\n**CSS Custom Properties**\n\n- `--animation-duration` (default: `300ms`) — Web Awesome duration alias.\n- `--animation-easing` (default: `ease`) — Web Awesome easing alias.\n- `--animation-translate` (default: `var(--lr-size-0-5em)`) — Web Awesome travel-distance alias.\n- `--lr-animation-duration` (default: `300ms`) — Mapped duration of the entrance animation.\n- `--lr-animation-easing` (default: `ease`) — Mapped easing function for the entrance animation.\n- `--lr-animation-translate` (default: `var(--lr-size-0-5em)`) — Mapped travel distance for directional animations.\n- `--lr-random-content-animation-duration` (default: `300ms`) — Duration of the entrance animation.\n- `--lr-random-content-animation-easing` (default: `ease`) — Easing function for the entrance animation.\n- `--lr-random-content-animation-translate` (default: `var(--lr-size-0-5em)`) — Translation distance for directional animations.\n- `--lr-random-content-item-alignment` (default: `flex-start`) — Cross-axis alignment of selected items.\n- `--lr-random-content-item-gap` (default: `var(--lr-space-s)`) — Gap between simultaneously selected items.",
18697
18877
  "attributes": [
18698
18878
  {
18699
18879
  "name": "animation",
@@ -19665,6 +19845,10 @@
19665
19845
  "name": "lr-scatter-chart",
19666
19846
  "description": "`<lr-scatter-chart>` — `<lr-chart>` with a `\"scatter\"` default and the mirrored writable type. Feed\npoints via `LyraChartSeries.points`.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | An optional `<script type=\"application/json\">` containing a Chart.js configuration. |\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. Use this escape hatch for a complete paginated or virtualized alternative when the generated 1,000-record sample is insufficient. |\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| `data-truncation` | Explanation shown when the generated accessible alternative samples a data set larger than its 1,000-record ceiling. |\n| `description` | The accessible chart summary. |\n| `error` | Static visible error shown instead of `canvas` when the optional `chart.js` peer dependency is not installed; its transition is announced through a shared light-DOM alert. |\n| `feature-warning` | Static nonfatal warning when a requested optional feature peer is unavailable while the core chart remains usable. |\n| `legend` | The wrapping DOM legend, rendered unless `withoutLegend` is set. |\n| `legend-item` | A keyboard-operable series visibility toggle. |\n| `legend-item-hidden` | Added to a `legend-item` while its dataset is hidden. |\n| `legend-swatch` | The resolved series-color swatch in a legend item. |\n| `notices` | Wrapper for nonfatal feature warnings and generated-data truncation notices. |\n| `plot` | The fixed-height canvas/overlay region. |\n| `reset-zoom-button` | The reset-zoom control when zoom is active. |\n\n---\n\n**CSS Custom Properties**\n\n- `--border-color-1` (default: `var(--lr-color-chart-1)`) — First dataset border color.\n- `--border-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset border color.\n- `--border-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset border color.\n- `--border-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset border color.\n- `--border-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset border color.\n- `--border-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset border color.\n- `--border-radius` (default: `var(--lr-radius)`) — Dataset element corner radius.\n- `--border-width` (default: `var(--lr-border-width-thin)`) — Dataset element border width.\n- `--fill-color-1` (default: `var(--lr-color-chart-1)`) — First dataset fill color.\n- `--fill-color-2` (default: `var(--lr-color-chart-2)`) — Second dataset fill color.\n- `--fill-color-3` (default: `var(--lr-color-chart-3)`) — Third dataset fill color.\n- `--fill-color-4` (default: `var(--lr-color-chart-4)`) — Fourth dataset fill color.\n- `--fill-color-5` (default: `var(--lr-color-chart-5)`) — Fifth dataset fill color.\n- `--fill-color-6` (default: `var(--lr-color-chart-6)`) — Sixth dataset fill color.\n- `--grid-border-width` (default: `var(--lr-border-width-thin)`) — Axis and grid line width.\n- `--grid-color` (default: `var(--lr-chart-grid-color)`) — Grid line color.\n- `--line-border-width` (default: `var(--lr-border-width-medium)`) — Line dataset stroke width.\n- `--lr-chart-canvas-hover-outline-width` (default: `var(--lr-border-width-thin)`) — Width of the `[part='canvas']` hover-state outline (its color is `--lr-chart-grid-color`, above).\n- `--lr-chart-data-table-button-active-bg` — Pressed background of an actionable generated- table value; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-data-table-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of an actionable generated-table value.\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-height` (default: `var(--lr-size-280px)`) — The plot region's `block-size` and the host's minimum block size. A visible data table or wrapping DOM legend grows the host in normal flow instead of overlapping following content. `height` supplies a private fallback; this public token always wins when a consumer sets it.\n- `--lr-chart-legend-color` (default: `var(--lr-color-text)`) — Legend label color. Resolved via `getComputedStyle` on every draw.\n- `--lr-chart-legend-item-active-bg` — Pressed background of a legend visibility button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-legend-item-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of a legend visibility button.\n- `--lr-chart-legend-side-max` (default: `var(--lr-size-15rem)`) — Maximum inline size reserved for a side-positioned DOM legend; the track is also capped at one third of the chart allocation.\n- `--lr-chart-pattern-step` (default: `var(--lr-space-2xs)`) — Tile size of the texture painted on `[part='legend-swatch']` while `forced-colors: active` matches, where every series collapses to one system color and the stripe/crosshatch pattern becomes the only channel keeping series apart. Declared on the swatch part rather than the host; the stripe width within a tile stays `--lr-border-width-thin`, so a larger step spaces the stripes further apart.\n- `--lr-chart-reset-zoom-button-active-bg` — Pressed background of the reset-zoom button; defaults to the standard active mix of `--lr-color-brand-quiet`.\n- `--lr-chart-reset-zoom-button-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Hover background of the reset-zoom button.\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-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.\n- `--point-radius` (default: `var(--lr-space-2xs)`) — Line/scatter point radius.",
19667
19847
  "attributes": [
19848
+ {
19849
+ "name": "annotations",
19850
+ "description": "Declarative reference lines and shaded bands — a threshold, an event year, a regime change, a\nhighlighted period. Each entry marks either a single `value` or a `from`/`to` range on `axis`\n(default `'y'`), with an optional `label` and semantic `tone`.\n\nNeeds the optional `chartjs-plugin-annotation` peer, loaded on first actual demand so a page\nwith no annotated charts never downloads it. The plugin is registered globally, like\n`chartjs-plugin-zoom` and unlike `chartjs-plugin-datalabels`: it draws nothing unless a chart\nsupplies annotation options, so the registration is unobservable to charts that set none, and\nregistration is also what installs the plugin's own element defaults. Without the peer\ninstalled the chart still renders and a single console warning explains the no-op — the same\nfail-closed contract `data-labels` uses.\n\nEntries are included in the generated accessible description, mirroring `lr-heatmap`.\n\nType: `readonly LyraChartAnnotation[]` \nDefault: `[]`"
19851
+ },
19668
19852
  {
19669
19853
  "name": "area",
19670
19854
  "description": "Chart-wide default fill-under-line setting for line-type series; a series's own `LyraChartSeries.fill` overrides it.\n\nType: `boolean` \nDefault: `false`",
@@ -19769,6 +19953,16 @@
19769
19953
  "name": "plugins",
19770
19954
  "description": "Chart.js plugins attached to this chart instance.\n\nType: `LyraChartPlugin[]` \nDefault: `[]`"
19771
19955
  },
19956
+ {
19957
+ "name": "scale-type",
19958
+ "description": "Scale type for the **value** axis (the categorical axis is unaffected). `'logarithmic'` plots\na dataset spanning several orders of magnitude honestly, where a linear axis collapses\neverything below the maximum into the baseline. Inherited by `lr-line-chart`,\n`lr-scatter-chart` and `lr-bar-chart`.\n\nA logarithmic axis cannot represent zero or negative values (`log(0)` is `-Infinity`), so\n`beginAtZero` is not forwarded in that mode -- Chart.js would otherwise be handed a bound it\ncannot place. Non-positive data points are dropped by Chart.js's own log scale.\n\nType: `LyraChartScaleType` \nDefault: `'linear'`",
19959
+ "value": {
19960
+ "type": [
19961
+ "'linear'",
19962
+ "'logarithmic'"
19963
+ ]
19964
+ }
19965
+ },
19772
19966
  {
19773
19967
  "name": "show-data-table",
19774
19968
  "description": "Makes the generated data table visible; it remains screen-reader available when false.\n\nType: `boolean` \nDefault: `false`",
@@ -19982,7 +20176,7 @@
19982
20176
  },
19983
20177
  {
19984
20178
  "name": "lr-select",
19985
- "description": "`<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. Closed multiple mode skips selected option occurrences and keeps\nsearching for a later unselected match, including another occurrence of the same value.\n\nOptions are `<lr-option value>` children, the same element `<lr-combobox>`\nuses. Unlike `lr-combobox` there is no filter/source/empty-text/max-render\nsurface -- see `<lr-combobox>` for the filterable case.\n\n`multiple` turns the committed `value` into a `string[]` and renders one removable chip per\nselection. The chip row is a sibling overlaid on the real trigger button, never nested inside it,\nso every remove control is valid independently-focusable interactive content. The trigger keeps\none complete visually-hidden joined-value node for assistive technology while the painted\nbuilt-in chip labels are hidden from it, preventing both truncation and duplicate announcement.\nPicking a selected row again still toggles it off, Backspace/Delete on the trigger removes the\nlast selection, and `with-clear` removes all of them. `getTag` replaces a built-in chip entirely;\n`max-options-visible` caps how many render before the rest collapse behind a localized \"+N\" chip.\n\n`with-clear`'s button renders inside the trigger's inline-end padding,\noutboard of the expand icon, as a sibling of the trigger rather than a child\nof it -- for the same nesting reason.\nThe trigger and overlaid multi-select tag row accept constrained allocation: long selected\nlabels ellipsize and long chips wrap within a 320px LTR or RTL container instead of widening it.\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 available\n(neither disabled nor inert, including through an inert ancestor), 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\nDeliberately does **not** perform implicit form submission on Enter (unlike `<lr-input>`/\n`<lr-combobox>`/`<lr-date-input>`, which route through `internal/submit-on-enter.ts`): the\ntrigger is a `role=\"combobox\"` button where Enter opens the listbox and, once open, commits the\nactive option — the ARIA combobox behavior its upstream counterpart follows. Submitting there\nwould shadow the only keyboard way to open the list.\n\nWhile the listbox is open, live option collection changes preserve the keyboard-active option\nby element identity across reorders. If that option is removed or becomes unavailable, the\nnearest available survivor takes over (preferring the following row on a tie); an empty\navailable collection clears `aria-activedescendant` instead of retaining an invalid index.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-option>` elements. |\n| `clear-icon` | Replaces the built-in clear glyph. |\n| `end` | Decorative adornment after the selected-value label and before the expand icon. Its wrapper has the same enforced inert/`aria-hidden` contract as `start`. |\n| `error` | Custom error content. |\n| `expand-icon` | Replaces the built-in expand glyph. |\n| `help-text` | Shoelace alias for `hint`. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n| `prefix` | Shoelace alias for `start`. |\n| `start` | Decorative adornment at the inline-start of the trigger row, before the selected-value label. Its wrapper is always `aria-hidden` and inert because it lives inside the native trigger button; interactive content supplied here remains deliberately unavailable. |\n| `suffix` | Shoelace alias for `end`. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `clear-button` | The `with-clear` button. |\n| `combobox` | Compatibility name for the control wrapper. |\n| `display-input` | The selected-value/placeholder display inside the trigger. In populated multiple mode it is visually hidden but exposes every selected label to assistive technology. |\n| `end` | Inert, decorative 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-help-text` | Shoelace compatibility name for the hint message. |\n| `form-control-input` | Compatibility name for the control wrapper. |\n| `form-control-label` | The `<label>` element. |\n| `group-label` | An option group's heading row, referenced by the enclosing `role=\"group\"`. |\n| `hint` | The hint message. |\n| `label` | Wrapper around the visible label content. |\n| `listbox` | The managed nonmodal options popover; its stack depth comes from `--lr-overlay-stack-index` with `--lr-layer-dropdown` as the standalone fallback. |\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| `prefix` | Shoelace compatibility part on the `prefix` slot. |\n| `start` | Inert, decorative wrapper around the `start` adornment slot; `hidden` while nothing is slotted. |\n| `suffix` | Shoelace compatibility part on the `suffix` slot. |\n| `tag` | One selected-value chip. The \"+N\" overflow chip carries both `tag` and `tag-overflow`, so `::part(tag)` styles every chip and `::part(tag-overflow)` only that one -- state after `::part()` never matches, so it is encoded in the part name instead. |\n| `tag__base` | Compatibility name on a built-in selected-value chip. |\n| `tag__content` | Compatibility name around a built-in chip's visible label. |\n| `tag__remove-button` | A built-in chip's remove button. |\n| `tag__remove-button__base` | Compatibility name on the same remove button. |\n| `tag-label` | A chip's ellipsis-safe label. |\n| `tag-overflow` | The \"+N\" chip standing in for the selections past `max-options-visible`. |\n| `tags` | The `multiple`-mode chip row, rendered as a sibling overlaid on the trigger. |\n| `trigger` | The trigger button (positioning anchor). |\n\n---\n\n**CSS Custom Properties**\n\n- `--hide-duration` (default: `var(--lr-transition-fast)`) — Listbox exit-transition timing.\n- `--lr-form-control-required-color` (default: `var(--lr-color-danger)`) — Required-marker color, themeable independently of error text and invalid borders.\n- `--lr-form-control-required-content` (default: `' *'`) — The required marker appended to `form-control-label` while `required` is set. Set it to `''` to suppress the marker, or to any other quoted string (`' (required)'`, a localized word) to replace it.\n- `--lr-form-control-required-offset` (default: `0`) — Inline space between the label text and the required marker.\n- `--lr-select-expand-size` — Decorative expand-icon box size, scaled by `size`. The one piece of this component's geometry the shared ladder does not own: it sizes a glyph, not the control row.\n- `--lr-select-font-size` (default: `var(--lr-form-control-font-size)`) — Trigger font size, from the active `size` tier.\n- `--lr-select-gap` — Gap between the trigger's start adornment, label, end adornment, and expand icon. Doesn't vary by `size`.\n- `--lr-select-open-border-color` (default: `var(--lr-color-brand)`) — Trigger border while the listbox is open.\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-option-selected-bg` (default: `transparent`) — Background of the currently-selected option row. Not declared on `:host`; retheme just the selected row without hijacking `--lr-color-brand`.\n- `--lr-select-option-selected-border` (default: `var(--lr-color-brand)`) — Border color of the selected option row.\n- `--lr-select-option-selected-color` (default: `var(--lr-color-brand)`) — Text color of the selected option row.\n- `--lr-select-option-selected-font-weight` (default: `var(--lr-font-weight-semibold)`) — Font weight of the selected option row.\n- `--lr-select-radius` (default: `var(--lr-form-control-radius)`) — Trigger corner radius, from the active `size` tier of the shared form-control ladder (the two tightest tiers take a smaller radius).\n- `--lr-select-tag-font-size` — Chip text size. Doesn't vary by `size`.\n- `--lr-select-tag-padding` — Padding inside a `multiple`-mode chip. Doesn't vary by `size`.\n- `--lr-select-trigger-active-bg` (default: `color-mix(...)`) — Trigger background while pressed.\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.\n- `--lr-select-trigger-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Trigger background while hovered. Accent appearance keeps its louder mixed fallback when this hook is unset.\n- `--lr-select-trigger-min-height` (default: `var(--lr-form-control-height)`) — Trigger block-size floor, from the active `size` tier of the shared ladder, and live at every tier including the default `m` -- so a select is exactly as tall as an `<lr-button>`/`<lr-input>` of that tier.\n- `--lr-select-trigger-padding` — Trigger padding shorthand. Defaults to the active `size` tier's `var(--lr-form-control-padding-block) var(--lr-form-control-padding-inline)` from the shared ladder.\n- `--show-duration` (default: `var(--lr-transition-fast)`) — Listbox enter-transition timing.\n- `--tag-max-size` (default: `var(--lr-size-12rem)`) — Maximum inline size of one selected-value tag.",
20179
+ "description": "`<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. Closed multiple mode skips selected option occurrences and keeps\nsearching for a later unselected match, including another occurrence of the same value.\n\nOptions are `<lr-option value>` children, the same element `<lr-combobox>`\nuses. Unlike `lr-combobox` there is no filter/source/empty-text/max-render\nsurface -- see `<lr-combobox>` for the filterable case.\n\n`multiple` turns the committed `value` into a `string[]` and renders one removable chip per\nselection. The chip row is a sibling overlaid on the real trigger button, never nested inside it,\nso every remove control is valid independently-focusable interactive content. The trigger keeps\none complete visually-hidden joined-value node for assistive technology while the painted\nbuilt-in chip labels are hidden from it, preventing both truncation and duplicate announcement.\nPicking a selected row again still toggles it off, Backspace/Delete on the trigger removes the\nlast selection, and `with-clear` removes all of them. `getTag` replaces a built-in chip entirely;\n`max-options-visible` caps how many render before the rest collapse behind a localized \"+N\" chip.\n\n`with-clear`'s button renders inside the trigger's inline-end padding,\noutboard of the expand icon, as a sibling of the trigger rather than a child\nof it -- for the same nesting reason.\nThe trigger and overlaid multi-select tag row accept constrained allocation: long selected\nlabels ellipsize and long chips wrap within a 320px LTR or RTL container instead of widening it.\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 available\n(neither disabled nor inert, including through an inert ancestor), 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\nDeliberately does **not** perform implicit form submission on Enter (unlike `<lr-input>`/\n`<lr-combobox>`/`<lr-date-input>`, which route through `internal/submit-on-enter.ts`): the\ntrigger is a `role=\"combobox\"` button where Enter opens the listbox and, once open, commits the\nactive option — the ARIA combobox behavior its upstream counterpart follows. Submitting there\nwould shadow the only keyboard way to open the list.\n\nWhile the listbox is open, live option collection changes preserve the keyboard-active option\nby element identity across reorders. If that option is removed or becomes unavailable, the\nnearest available survivor takes over (preferring the following row on a tie); an empty\navailable collection clears `aria-activedescendant` instead of retaining an invalid index.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | `<lr-option>` elements. |\n| `clear-icon` | Replaces the built-in clear glyph. |\n| `end` | Decorative adornment after the selected-value label and before the expand icon. Its wrapper has the same enforced inert/`aria-hidden` contract as `start`. |\n| `error` | Custom error content. |\n| `expand-icon` | Replaces the built-in expand glyph. |\n| `help-text` | Shoelace alias for `hint`. |\n| `hint` | Custom hint content. |\n| `label` | Custom label content. |\n| `prefix` | Shoelace alias for `start`. |\n| `start` | Decorative adornment at the inline-start of the trigger row, before the selected-value label. Its wrapper is always `aria-hidden` and inert because it lives inside the native trigger button; interactive content supplied here remains deliberately unavailable. |\n| `suffix` | Shoelace alias for `end`. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `clear-button` | The `with-clear` button. |\n| `combobox` | Compatibility name for the control wrapper. |\n| `display-input` | The selected-value/placeholder display inside the trigger. In populated multiple mode it is visually hidden but exposes every selected label to assistive technology. |\n| `end` | Inert, decorative 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-help-text` | Shoelace compatibility name for the hint message. |\n| `form-control-input` | Compatibility name for the control wrapper. |\n| `form-control-label` | The `<label>` element. |\n| `group-label` | An option group's heading row, referenced by the enclosing `role=\"group\"`. |\n| `hint` | The hint message. |\n| `label` | Wrapper around the visible label content. |\n| `listbox` | The managed nonmodal options popover; its stack depth comes from `--lr-overlay-stack-index` with `--lr-layer-dropdown` as the standalone fallback. |\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| `prefix` | Shoelace compatibility part on the `prefix` slot. |\n| `start` | Inert, decorative wrapper around the `start` adornment slot; `hidden` while nothing is slotted. |\n| `suffix` | Shoelace compatibility part on the `suffix` slot. |\n| `tag` | One selected-value chip. The \"+N\" overflow chip carries both `tag` and `tag-overflow`, so `::part(tag)` styles every chip and `::part(tag-overflow)` only that one -- state after `::part()` never matches, so it is encoded in the part name instead. |\n| `tag-label` | A chip's ellipsis-safe label. |\n| `tag-overflow` | The \"+N\" chip standing in for the selections past `max-options-visible`. |\n| `tag__base` | Compatibility name on a built-in selected-value chip. |\n| `tag__content` | Compatibility name around a built-in chip's visible label. |\n| `tag__remove-button` | A built-in chip's remove button. |\n| `tag__remove-button__base` | Compatibility name on the same remove button. |\n| `tags` | The `multiple`-mode chip row, rendered as a sibling overlaid on the trigger. |\n| `trigger` | The trigger button (positioning anchor). |\n\n---\n\n**CSS Custom Properties**\n\n- `--hide-duration` (default: `var(--lr-transition-fast)`) — Listbox exit-transition timing.\n- `--lr-form-control-required-color` (default: `var(--lr-color-danger)`) — Required-marker color, themeable independently of error text and invalid borders.\n- `--lr-form-control-required-content` (default: `' *'`) — The required marker appended to `form-control-label` while `required` is set. Set it to `''` to suppress the marker, or to any other quoted string (`' (required)'`, a localized word) to replace it.\n- `--lr-form-control-required-offset` (default: `0`) — Inline space between the label text and the required marker.\n- `--lr-select-expand-size` — Decorative expand-icon box size, scaled by `size`. The one piece of this component's geometry the shared ladder does not own: it sizes a glyph, not the control row.\n- `--lr-select-font-size` (default: `var(--lr-form-control-font-size)`) — Trigger font size, from the active `size` tier.\n- `--lr-select-gap` — Gap between the trigger's start adornment, label, end adornment, and expand icon. Doesn't vary by `size`.\n- `--lr-select-open-border-color` (default: `var(--lr-color-brand)`) — Trigger border while the listbox is open.\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-option-selected-bg` (default: `transparent`) — Background of the currently-selected option row. Not declared on `:host`; retheme just the selected row without hijacking `--lr-color-brand`.\n- `--lr-select-option-selected-border` (default: `var(--lr-color-brand)`) — Border color of the selected option row.\n- `--lr-select-option-selected-color` (default: `var(--lr-color-brand)`) — Text color of the selected option row.\n- `--lr-select-option-selected-font-weight` (default: `var(--lr-font-weight-semibold)`) — Font weight of the selected option row.\n- `--lr-select-radius` (default: `var(--lr-form-control-radius)`) — Trigger corner radius, from the active `size` tier of the shared form-control ladder (the two tightest tiers take a smaller radius).\n- `--lr-select-tag-font-size` — Chip text size. Doesn't vary by `size`.\n- `--lr-select-tag-padding` — Padding inside a `multiple`-mode chip. Doesn't vary by `size`.\n- `--lr-select-trigger-active-bg` (default: `color-mix(...)`) — Trigger background while pressed.\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.\n- `--lr-select-trigger-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Trigger background while hovered. Accent appearance keeps its louder mixed fallback when this hook is unset.\n- `--lr-select-trigger-min-height` (default: `var(--lr-form-control-height)`) — Trigger block-size floor, from the active `size` tier of the shared ladder, and live at every tier including the default `m` -- so a select is exactly as tall as an `<lr-button>`/`<lr-input>` of that tier.\n- `--lr-select-trigger-padding` — Trigger padding shorthand. Defaults to the active `size` tier's `var(--lr-form-control-padding-block) var(--lr-form-control-padding-inline)` from the shared ladder.\n- `--show-duration` (default: `var(--lr-transition-fast)`) — Listbox enter-transition timing.\n- `--tag-max-size` (default: `var(--lr-size-12rem)`) — Maximum inline size of one selected-value tag.",
19986
20180
  "attributes": [
19987
20181
  {
19988
20182
  "name": "appearance",
@@ -20386,6 +20580,15 @@
20386
20580
  "name": "marker-label",
20387
20581
  "description": "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`"
20388
20582
  },
20583
+ {
20584
+ "name": "selected-index",
20585
+ "description": "Index of the currently selected item, or `-1` (the default) for none — the controlled selection\nthis strip's natural companion, `lr-sequence-playback`, scrubs through. Mirrors the shape\n`lr-lite-chart`'s `selectedIndices` and `lr-heatmap`'s `selectedCell` already establish.\n\nControlled, not self-managing: activating a cell emits `lr-item-activate` and does **not**\nmove the selection on its own, so the consumer stays the single source of truth and the\ncomponent cannot drift from a playback index it does not own. An out-of-range or non-integer\nvalue selects nothing rather than throwing.\n\nType: `number` \nDefault: `-1`",
20586
+ "value": {
20587
+ "type": [
20588
+ "number"
20589
+ ]
20590
+ }
20591
+ },
20389
20592
  {
20390
20593
  "name": "show-legend",
20391
20594
  "description": "Renders a static `[part=\"legend\"]` key of every `categories` entry below the strip, so the\ncolor-to-category mapping is readable without hovering each cell. Deliberately\nnon-interactive: unlike `<lr-graph-legend>` this toggles nothing and emits nothing — the\nstrip is a presentational aggregate, and the key describes the scheme, not the current data\n(a category with no matching item still gets a row).\n\nType: `boolean` \nDefault: `false`",
@@ -20910,7 +21113,7 @@
20910
21113
  },
20911
21114
  {
20912
21115
  "name": "lr-sparkline",
20913
- "description": "`<lr-sparkline>` — a zero-dependency inline SVG trend chart.\nMirrors the Web Awesome `<wa-sparkline>` API under the `lr-` prefix and retains the earlier\n`values`/`mark`/`min`/`max` Lyra surface as an additive programmatic extension.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n- Deprecated part `base`: Deprecated since `8.0.0`. Use part `::part(sparkline)`. Removal is not permitted before `10.0.0`. The sparkline part names the rendered SVG wrapper unambiguously; base remains on that same node during the compatibility window.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `area` | Compatibility alias for `fill` on the same path. |\n| `bar` | Each rectangle rendered by the additive `mark=\"bar\"` mode. |\n| `base` | Deprecated alias for `sparkline` on the same SVG wrapper. |\n| `fill` | The filled area rendered by `appearance=\"solid\"` and `appearance=\"gradient\"`. |\n| `line` | The stroked trend path. |\n| `sparkline` | The outer SVG wrapper. |\n\n---\n\n**CSS Custom Properties**\n\n- `--fill-color` (default: `var(--lr-color-brand-quiet)`) — Area fill color. A `trend` supplies a semantic token default, while an authored value always wins.\n- `--line-color` (default: `var(--lr-color-brand)`) — Trend line color. A `trend` supplies a semantic token default, while an authored value always wins.\n- `--line-width` (default: `var(--lr-border-width-medium)`) — Trend line width.\n- `--lr-sparkline-stroke-width` (default: `var(--lr-border-width-medium)`) — Compatibility alias used as the fallback for `--line-width`.",
21116
+ "description": "`<lr-sparkline>` — a zero-dependency inline SVG trend chart.\nMirrors the Web Awesome `<wa-sparkline>` API under the `lr-` prefix and retains the earlier\n`values`/`mark`/`min`/`max` Lyra surface as an additive programmatic extension.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n- Deprecated part `base`: Deprecated since `8.0.0`. Use part `::part(sparkline)`. Removal is not permitted before `10.0.0`. The sparkline part names the rendered SVG wrapper unambiguously; base remains on that same node during the compatibility window. That version is a policy floor, not a plan: `wa-sparkline` still publishes its own deprecated `base` part, so this alias is removed only when upstream's is.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `area` | Compatibility alias for `fill` on the same path. |\n| `bar` | Each rectangle rendered by the additive `mark=\"bar\"` mode. |\n| `base` | Deprecated alias for `sparkline` on the same SVG wrapper. |\n| `fill` | The filled area rendered by `appearance=\"solid\"` and `appearance=\"gradient\"`. |\n| `line` | The stroked trend path. |\n| `sparkline` | The outer SVG wrapper. |\n\n---\n\n**CSS Custom Properties**\n\n- `--fill-color` (default: `var(--lr-color-brand-quiet)`) — Area fill color. A `trend` supplies a semantic token default, while an authored value always wins.\n- `--line-color` (default: `var(--lr-color-brand)`) — Trend line color. A `trend` supplies a semantic token default, while an authored value always wins.\n- `--line-width` (default: `var(--lr-border-width-medium)`) — Trend line width.\n- `--lr-sparkline-stroke-width` (default: `var(--lr-border-width-medium)`) — Compatibility alias used as the fallback for `--line-width`.",
20914
21117
  "attributes": [
20915
21118
  {
20916
21119
  "name": "appearance",
@@ -21638,7 +21841,7 @@
21638
21841
  },
21639
21842
  {
21640
21843
  "name": "lr-swatch-picker",
21641
- "description": "`<lr-swatch-picker>` -- a single-select picker over a small, fixed set of color swatches with\nthe WAI-ARIA APG `radiogroup` contract built in: `role=\"radiogroup\"`/`role=\"radio\"`, roving\ntabindex, automatic activation (click or arrow-key move both select immediately, like a native\nradio group), cyclic Arrow/Home/End navigation. Distinct from `<lr-color-picker>`'s freeform\nnative color input -- this picks exactly one of N designer-chosen named colors, the shape apps\notherwise hand-roll as a row of round accent-color buttons.\n\n`mode=\"gemstone\"` uses the shared faceted gemstone glyph for items carrying a `gemstone`\nkey and opts into the gemstone glow/shine defaults. The `items` array controls display\norder and `value` still controls the initial selection. Live option reorders preserve focus by\noption identity; removing the focused option moves focus to the nearest surviving swatch without\nchanging the controlled `value` or emitting `lr-change`.\n\n`disabled` locks the whole picker: every swatch renders as a real `disabled` `<button>` (out of\nthe tab sequence, inert to activation), keyboard navigation and `click()` become no-ops, and the\nswatches dim with a `not-allowed` cursor. It is the picker's own attribute only — this control is\ndeliberately not form-associated (it submits nothing, carries no `name`, validity or reset\nsemantics), so an ancestor `<fieldset disabled>` does not cascade into it.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n- Deprecated property `label` / `label`: Deprecated since `8.2.3`. Use property `aria-label=\"…\"`. Removal is not permitted before `10.0.0`. accessibleLabel names the accessibility-only value explicitly while label remains a compatibility alias.\n- Deprecated property `options`: Deprecated since `8.2.3`. Use property `.items = […]`. Removal is not permitted before `10.0.0`. items follows the shared collection vocabulary while options remains a compatibility alias over the same immutable snapshot.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The `role=\"radiogroup\"` root. |\n| `swatch` | A single `role=\"radio\"` color swatch's interactive hit target; sized via `--lr-swatch-picker-hit-size` (its private default follows `size` and is floored at 24px), independent of the smaller visible fill/icon rendered inside it. A public value wins. The selected one is `[part='swatch'][aria-checked='true']`. |\n| `swatch-fill` | The compact filled circle rendered when the option has no custom `icon`. |\n| `swatch-icon` | Optional decorative custom shape supplied by the option's `icon` field; its subtree is inert and hidden from assistive technology. When present it replaces `swatch-fill` and the swatch renders unfilled/unbordered behind it. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-swatch-picker-fill-size` (default: `var(--lr-theme-swatch-picker-fill-size, var(--lr-size-1-5rem))`) — Visible fill/icon diameter for the swatch. Its private default follows the active tier. Set `--lr-theme-swatch-picker-fill-size` on an ancestor to give every tier a shared default, or set this component hook on an ancestor/direct host to override every tier.\n- `--lr-swatch-picker-gap` (default: `var(--lr-space-xs)`) — Gap between swatches.\n- `--lr-swatch-picker-gemstone-selected-blur` (default: `var(--lr-size-0-5rem)`) — Selected glow blur used by `mode=\"gemstone\"` when `--lr-swatch-picker-selected-blur` is not overridden.\n- `--lr-swatch-picker-gemstone-shine-duration` (default: `var(--lr-transition-ambient)`) — Selected shine timing used by `mode=\"gemstone\"` when `--lr-swatch-picker-shine-duration` is not overridden.\n- `--lr-swatch-picker-hit-size` (default: `var(--lr-size-2-5rem)`) — Hit-area size (both min-inline-size and min-block-size) for the swatch button. Its private default follows the active tier and is floored at 24px; an inherited or direct public value wins.\n- `--lr-swatch-picker-selected-blur` (default: `0`) — Blur radius of that same ring. 0 by default (a crisp ring); set a real length (e.g. 0.4rem) for a soft glow instead.\n- `--lr-swatch-picker-selected-color` (default: `var(--lr-color-brand)`) — Ring color drawn around the selected swatch, themeable independently of the focus ring and every other ring color.\n- `--lr-swatch-picker-shine-duration` (default: `0s`) — Duration of a rhythmic brighten-and-settle \"shine\" on the selected swatch. `0s` (the default) is a no-op -- today's static look for every existing consumer. Set a real duration (e.g. 1.6s) for a pulsing shine; disabled outright under `prefers-reduced-motion: reduce`. Independent of `--lr-swatch-picker-selected-blur` (a separate `filter: brightness()` animation, not `box-shadow`), so the two compose freely, and works identically for a plain color circle and an icon swatch alike.",
21844
+ "description": "`<lr-swatch-picker>` -- a single-select picker over a small, fixed set of color swatches with\nthe WAI-ARIA APG `radiogroup` contract built in: `role=\"radiogroup\"`/`role=\"radio\"`, roving\ntabindex, automatic activation (click or arrow-key move both select immediately, like a native\nradio group), cyclic Arrow/Home/End navigation. Distinct from `<lr-color-picker>`'s freeform\nnative color input -- this picks exactly one of N designer-chosen named colors, the shape apps\notherwise hand-roll as a row of round accent-color buttons.\n\n`mode=\"gemstone\"` uses the shared faceted gemstone glyph for items carrying a `gemstone`\nkey and opts into the gemstone glow/shine defaults. The `items` array controls display\norder and `value` still controls the initial selection. Live option reorders preserve focus by\noption identity; removing the focused option moves focus to the nearest surviving swatch without\nchanging the controlled `value` or emitting `lr-change`.\n\n`disabled` locks the whole picker: every swatch renders as a real `disabled` `<button>` (out of\nthe tab sequence, inert to activation), keyboard navigation and `click()` become no-ops, and the\nswatches dim with a `not-allowed` cursor. It is the picker's own attribute only — this control is\ndeliberately not form-associated (it submits nothing, carries no `name`, validity or reset\nsemantics), so an ancestor `<fieldset disabled>` does not cascade into it.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | The `role=\"radiogroup\"` root. |\n| `swatch` | A single `role=\"radio\"` color swatch's interactive hit target; sized via `--lr-swatch-picker-hit-size` (its private default follows `size` and is floored at 24px), independent of the smaller visible fill/icon rendered inside it. A public value wins. The selected one is `[part='swatch'][aria-checked='true']`. |\n| `swatch-fill` | The compact filled circle rendered when the option has no custom `icon`. |\n| `swatch-icon` | Optional decorative custom shape supplied by the option's `icon` field; its subtree is inert and hidden from assistive technology. When present it replaces `swatch-fill` and the swatch renders unfilled/unbordered behind it. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-swatch-picker-fill-size` (default: `var(--lr-theme-swatch-picker-fill-size, var(--lr-size-1-5rem))`) — Visible fill/icon diameter for the swatch. Its private default follows the active tier. Set `--lr-theme-swatch-picker-fill-size` on an ancestor to give every tier a shared default, or set this component hook on an ancestor/direct host to override every tier.\n- `--lr-swatch-picker-gap` (default: `var(--lr-space-xs)`) — Gap between swatches.\n- `--lr-swatch-picker-gemstone-selected-blur` (default: `var(--lr-size-0-5rem)`) — Selected glow blur used by `mode=\"gemstone\"` when `--lr-swatch-picker-selected-blur` is not overridden.\n- `--lr-swatch-picker-gemstone-shine-duration` (default: `var(--lr-transition-ambient)`) — Selected shine timing used by `mode=\"gemstone\"` when `--lr-swatch-picker-shine-duration` is not overridden.\n- `--lr-swatch-picker-hit-size` (default: `var(--lr-size-2-5rem)`) — Hit-area size (both min-inline-size and min-block-size) for the swatch button. Its private default follows the active tier and is floored at 24px; an inherited or direct public value wins.\n- `--lr-swatch-picker-selected-blur` (default: `0`) — Blur radius of that same ring. 0 by default (a crisp ring); set a real length (e.g. 0.4rem) for a soft glow instead.\n- `--lr-swatch-picker-selected-color` (default: `var(--lr-color-brand)`) — Ring color drawn around the selected swatch, themeable independently of the focus ring and every other ring color.\n- `--lr-swatch-picker-shine-duration` (default: `0s`) — Duration of a rhythmic brighten-and-settle \"shine\" on the selected swatch. `0s` (the default) is a no-op -- today's static look for every existing consumer. Set a real duration (e.g. 1.6s) for a pulsing shine; disabled outright under `prefers-reduced-motion: reduce`. Independent of `--lr-swatch-picker-selected-blur` (a separate `filter: brightness()` animation, not `box-shadow`), so the two compose freely, and works identically for a plain color circle and an icon swatch alike.",
21642
21845
  "attributes": [
21643
21846
  {
21644
21847
  "name": "aria-label",
@@ -21658,15 +21861,6 @@
21658
21861
  ]
21659
21862
  }
21660
21863
  },
21661
- {
21662
- "name": "label",
21663
- "description": "Deprecated since `8.2.3`. Use property `aria-label=\"…\"`. Removal is not permitted before `10.0.0`. accessibleLabel names the accessibility-only value explicitly while label remains a compatibility alias.\n\nType: `string` \nDefault: `''`",
21664
- "value": {
21665
- "type": [
21666
- "string"
21667
- ]
21668
- }
21669
- },
21670
21864
  {
21671
21865
  "name": "locale",
21672
21866
  "description": "Optional locale override. Otherwise the nearest `locale`/`lang` ancestor is used.\n\nType: `string` \nDefault: `''`",
@@ -21711,7 +21905,7 @@
21711
21905
  },
21712
21906
  {
21713
21907
  "name": "lr-switch",
21714
- "description": "`<lr-switch>` — a boolean toggle-switch form control. Structurally the\nsame idea as a checkbox (form-associated via `ElementInternals`, click and\nSpace toggle) but with switch semantics: `role=\"switch\"` +\n`aria-checked` read to assistive tech as an on/off state rather than a\nchecked/unchecked one, and there is no indeterminate state.\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 (that mixin's `value` accessor assumes a string —\nsee `<lr-combobox>` for the same direct-`ElementInternals` shape with a\nnon-string value).\n\nShips an opt-in `hint`/`errorText` form-control chrome (props + matching named slots +\n`hint`/`error` CSS parts), mirroring `<lr-select>`'s pattern for those two pieces -- left\nunset, neither renders. Deliberately no separate top-of-field `label` prop/slot/part mirroring\n`<lr-select>`'s `form-control-label`: the default slot already *is* this control's visible,\nclickable label (same as `<lr-checkbox>`), so a second label surface would be redundant.\nIts wrapper follows flattened rendered assignment and updates through forwarding slots. Visual\nelements, including decorative `aria-hidden` icons, retain the wrapper independently of their\naccessibility-tree contribution.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Label text, rendered next to the track. Clicking it toggles the switch, the same as clicking a checkbox's associated `<label>`. If left empty, set `aria-label` on the host so the control still has an accessible name. Host `aria-label` is forwarded by presence, including an explicitly empty value. |\n| `error` | Custom error content. |\n| `help-text` | Shoelace alias for `hint`. |\n| `hint` | Custom hint content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | Compatibility name for the semantic switch owner; use `switch`. |\n| `control` | WA/Shoelace name for the same pill-shaped background. |\n| `error` | The error message. |\n| `form-control` | The outer wrapper around the switch, error and hint. |\n| `form-control-help-text` | Shoelace name for the same hint message. |\n| `hint` | The hint message. |\n| `label` | The wrapper around the default slot. |\n| `switch` | The interactive `role=\"switch\"` owner around the track, with the rich default label as a sibling so nested actions remain valid focus stops. |\n| `thumb` | The circular knob that slides across the track. |\n| `track` | The pill-shaped background. |\n| `wrapper` | Compatibility name on the semantic switch owner. |\n\n---\n\n**CSS Custom Properties**\n\n- `--height` (default: `var(--lr-switch-track-block-size)`) — WA/Shoelace alias for the track's block size.\n- `--lr-switch-checked-track-fill` (default: `var(--lr-color-brand)`) — Track fill while checked.\n- `--lr-switch-gap` (default: `var(--lr-space-s)`) — Gap between the track and label.\n- `--lr-switch-thumb-fill` (default: `var(--lr-color-surface)`) — Thumb fill in either checked state.\n- `--lr-switch-thumb-offset` (default: `var(--lr-size-2px)`) — Inset of the thumb from the track's edges.\n- `--lr-switch-track-active-fill` (default: `color-mix(...)`) — Track fill while pressed.\n- `--lr-switch-track-block-size` (default: `calc(var(--lr-form-control-height) * 0.5)`) — Block size of the track, half the `size` tier's shared control height; the thumb's diameter is derived from it minus twice `--lr-switch-thumb-offset`.\n- `--lr-switch-track-fill` (default: `var(--lr-color-border)`) — Resting fill of `[part='track']`, used as the source for the hover and press fallbacks.\n- `--lr-switch-track-hover-fill` (default: `color-mix(...)`) — Track fill while hovered.\n- `--lr-switch-track-inline-size` (default: `calc(var(--lr-switch-track-block-size) * 1.8)`) — Inline size of the track, and (with the block size) the distance the thumb travels when checked. Derived from the block size, so re-sizing the track keeps its aspect ratio.\n- `--thumb-size` (default: `calc(var(--height, var(--lr-switch-track-block-size)) - (var(--lr-switch-thumb-offset) * 2))`) — WA/Shoelace thumb diameter alias.\n- `--width` (default: `var(--lr-switch-track-inline-size)`) — WA/Shoelace alias for the track's inline size.",
21908
+ "description": "`<lr-switch>` — a boolean toggle-switch form control. Structurally the\nsame idea as a checkbox (form-associated via `ElementInternals`, click and\nSpace toggle) but with switch semantics: `role=\"switch\"` +\n`aria-checked` read to assistive tech as an on/off state rather than a\nchecked/unchecked one, and there is no indeterminate state.\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 (that mixin's `value` accessor assumes a string —\nsee `<lr-combobox>` for the same direct-`ElementInternals` shape with a\nnon-string value).\n\nShips an opt-in `hint`/`errorText` form-control chrome (props + matching named slots +\n`hint`/`error` CSS parts), mirroring `<lr-select>`'s pattern for those two pieces -- left\nunset, neither renders. Deliberately no separate top-of-field `label` prop/slot/part mirroring\n`<lr-select>`'s `form-control-label`: the default slot already *is* this control's visible,\nclickable label (same as `<lr-checkbox>`), so a second label surface would be redundant.\nIts wrapper follows flattened rendered assignment and updates through forwarding slots. Visual\nelements, including decorative `aria-hidden` icons, retain the wrapper independently of their\naccessibility-tree contribution.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Label text, rendered next to the track. Clicking it toggles the switch, the same as clicking a checkbox's associated `<label>`. If left empty, set `aria-label` on the host so the control still has an accessible name. Host `aria-label` is forwarded by presence, including an explicitly empty value. |\n| `error` | Custom error content. |\n| `help-text` | Shoelace alias for `hint`. |\n| `hint` | Custom hint content. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | Compatibility name for the semantic switch owner; use `switch`. |\n| `control` | WA/Shoelace name for the same pill-shaped background. |\n| `error` | The error message. |\n| `form-control` | The outer wrapper around the switch, error and hint. |\n| `form-control-help-text` | Shoelace name for the same hint message. |\n| `hint` | The hint message. |\n| `label` | The wrapper around the default slot. |\n| `row` | The row wrapping the switch owner and the label as siblings. This is the node to size or align when laying out a column of switches; `base`/`switch` is only the track box inside it, so its inline size tracks the track, not the row. |\n| `switch` | The interactive `role=\"switch\"` owner around the track, with the rich default label as a sibling so nested actions remain valid focus stops. |\n| `thumb` | The circular knob that slides across the track. |\n| `track` | The pill-shaped background. |\n| `wrapper` | Compatibility name on the semantic switch owner. |\n\n---\n\n**CSS Custom Properties**\n\n- `--height` (default: `var(--lr-switch-track-block-size)`) — WA/Shoelace alias for the track's block size.\n- `--lr-switch-checked-track-fill` (default: `var(--lr-color-brand)`) — Track fill while checked.\n- `--lr-switch-gap` (default: `var(--lr-space-s)`) — Gap between the track and label.\n- `--lr-switch-thumb-fill` (default: `var(--lr-color-surface)`) — Thumb fill in either checked state.\n- `--lr-switch-thumb-offset` (default: `var(--lr-size-2px)`) — Inset of the thumb from the track's edges.\n- `--lr-switch-track-active-fill` (default: `color-mix(...)`) — Track fill while pressed.\n- `--lr-switch-track-block-size` (default: `calc(var(--lr-form-control-height) * 0.5)`) — Block size of the track, half the `size` tier's shared control height; the thumb's diameter is derived from it minus twice `--lr-switch-thumb-offset`.\n- `--lr-switch-track-fill` (default: `var(--lr-color-border)`) — Resting fill of `[part='track']`, used as the source for the hover and press fallbacks.\n- `--lr-switch-track-hover-fill` (default: `color-mix(...)`) — Track fill while hovered.\n- `--lr-switch-track-inline-size` (default: `calc(var(--lr-switch-track-block-size) * 1.8)`) — Inline size of the track, and (with the block size) the distance the thumb travels when checked. Derived from the block size, so re-sizing the track keeps its aspect ratio.\n- `--thumb-size` (default: `calc(var(--height, var(--lr-switch-track-block-size)) - (var(--lr-switch-thumb-offset) * 2))`) — WA/Shoelace thumb diameter alias.\n- `--width` (default: `var(--lr-switch-track-inline-size)`) — WA/Shoelace alias for the track's inline size.",
21715
21909
  "attributes": [
21716
21910
  {
21717
21911
  "name": "checked",
@@ -21883,7 +22077,7 @@
21883
22077
  },
21884
22078
  {
21885
22079
  "name": "lr-tab-group",
21886
- "description": "`<lr-tab-group>` — a tab strip composed from direct `<lr-tab panel=\"x\">` and\n`<lr-tab-panel name=\"x\">` children. This is the one canonical child model shared with both\nmapped upstreams; the group assigns private projection slots itself so consumer markup remains\na mechanical tag rename.\n\nImplements the WAI-ARIA APG tabs pattern. With the default `activation=\"auto\"`, Left/Right\n(swapped under RTL, or Up/Down when `placement` is `start`/`end`) move focus *and* selection\ntogether; with `activation=\"manual\"` they move focus only and Enter/Space commits, which the APG\nrequires whenever revealing a panel is expensive. Home/End jump to the first/last enabled tab,\nand a roving `tabindex` follows the focused tab. An enabled closable `<lr-tab>` adds\n`aria-keyshortcuts=\"Delete\"` to that same real tab button; Delete routes the close request through\nthe descriptor so `lr-close` still targets `<lr-tab>`. The visual close affordance stays\nnon-focusable and accessibility-hidden, avoiding a nested interactive control. Rich `<lr-tab>`\ncontent is likewise inert while projected; only its accessibility-exposed, default-slot text\nnames the real tab button rather than leaving an interactive descendant inside it. Author\n`aria-hidden`, hidden, inert, and CSS-hidden branches never leak into that name, and visibility\nor text changes refresh it.\n\n**`inert` on a source child excludes its tab exactly as `disabled` does** — it never takes\nselection, never holds the roving `tabindex`, and arrow keys step past it — and the rendered tab\nbutton is itself marked `inert`, so a pointer cannot reach it either. Only the child's *own*\n`inert` counts: a whole group inerted by an open modal keeps its selection and panels intact.\n\n`defaultSlot` exposes the real unnamed shadow slot expected by mapped integrations. Lyra keeps\nit hidden because every accepted child is assigned to a deterministic named projection slot.\n\n**Overflow.** A horizontal tab row that does not fit stays natively scrollable and gains two\nscroll controls flanking the tablist inside `[part=\"nav\"]`, mirroring both upstreams. They are\nrendered only for a horizontal `placement` (a vertical strip scrolls in the block direction,\nwhich these controls do not address — the same restriction both upstreams apply) and are laid out\nonly while the tablist genuinely overflows, gated on the measurement the edge fade already uses,\nso a row that fits is never flanked by two dead buttons. `without-scroll-controls` (or Shoelace's\n`no-scroll-controls`) opts out, leaving the pre-8.0.0 behavior: native scrolling plus the fade.\nThe fade is deliberately kept alongside the controls — it says \"the row continues past this\nedge\", which the controls themselves cannot show, and both appear on exactly the same condition.\nBy default an inactive edge control is hidden once that direction has nothing left to scroll to.\nShoelace's `fixed-scroll-controls` keeps both controls present throughout an overflowing range;\nin that mode an exhausted control stays visible but remains a no-op. Edge state is measured in\nlogical coordinates, so controls and the one-sided fade remain truthful under RTL too.\nA vertical `start`/`end` nav stays shrinkable and is capped at\n`--lr-tab-group-vertical-nav-max-inline-size` (default `var(--lr-size-12rem)`), so long labels\nellipsize rather than consuming the panel's allocation.\n\n**The scroll controls are `aria-hidden=\"true\"` and `tabindex=\"-1\"`** — a pointer affordance only,\nmatching upstream. The tablist is already fully keyboard-scrollable without them: the roving\n`tabindex` puts every tab one arrow key away, and focusing a tab scrolls it into view. Adding two\ntab stops in the middle of the strip would therefore buy no capability and cost every keyboard\nuser two extra stops between the tabs and the panel. They still carry a localized `aria-label`,\nso the name is there for automation and for a consumer that chooses to expose them.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `8.0.0`\n- Rationale: This tag entered Lyra as a stable public API with documented behavior, accessibility, and cross-browser support.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Canonical `<lr-tab>`/`<lr-tab-panel>` pairs. |\n| `nav` | Upstream-compatible slot used by `<lr-tab>` descriptors. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `active-tab-indicator` | Indicator inside the active tab. |\n| `base` | Compatibility name for the root wrapper; use `tab-group`. |\n| `body` | Wrapper around all tab panels. |\n| `nav` | The row wrapping the tablist together with the two overflow scroll controls; mirrors the upstream part of the same name. |\n| `panel` | A single `role=\"tabpanel\"` wrapper (one per tab, hidden unless active). |\n| `scroll-button` | Shared part on both overflow scroll controls. |\n| `scroll-button__base` | Export-compatible base name on both scroll controls. |\n| `scroll-button--end` | Upstream modifier alias on `scroll-button-end`. |\n| `scroll-button--start` | Upstream modifier alias on `scroll-button-start`. |\n| `scroll-button-end` | The control that scrolls the tabs toward their inline end (\"next\" — the left-hand control under RTL). |\n| `scroll-button-glyph` | The chevron wrapper inside a scroll control. This is the element that mirrors under RTL; the icon itself never rotates. |\n| `scroll-button-start` | The control that scrolls the tabs toward their inline start (\"previous\" — the right-hand control under RTL). |\n| `tab` | A single tab button. |\n| `tab-group` | The root wrapper around the tablist and panels. It is the same node as `base`. |\n| `tablist` | The `role=\"tablist\"` row of tab buttons. |\n| `tabs` | Upstream name on the same scroll container as `tablist`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--indicator-color` — Upstream alias for the active indicator color.\n- `--lr-scroll-fade-size` (default: `2rem`) — Width of the fade at each horizontal scroll edge. The fade is applied only while the tablist actually overflows, so a row that fits is never dimmed.\n- `--lr-tab-group-active-bg` (default: `color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-active))`) — Background of a pressed, non-disabled tab.\n- `--lr-tab-group-active-color` (default: `var(--lr-tab-group-hover-color, var(--lr-color-text))`) — Text color of a pressed, non-disabled tab.\n- `--lr-tab-group-hover-color` (default: `var(--lr-color-text)`) — Text color of a hovered, non-disabled tab. Independent of the selected-state props above. Pressed-tab and scroll-control hooks use inline `var()` fallbacks rather than a `:host` declaration, so they inherit from the group or any ancestor without retheming the other states.\n- `--lr-tab-group-indicator-color` (default: `var(--lr-color-brand)`) — Color of the selected tab's underline, themeable independently of its text color.\n- `--lr-tab-group-scroll-button-active-bg` (default: `color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-active))`) — Background of a pressed overflow scroll control.\n- `--lr-tab-group-scroll-button-active-color` (default: `var(--lr-color-text)`) — Text color of a pressed overflow scroll control.\n- `--lr-tab-group-scroll-button-hover-color` (default: `var(--lr-color-text)`) — Text color of a hovered overflow scroll control.\n- `--lr-tab-group-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-tab-group-vertical-nav-max-inline-size` (default: `var(--lr-size-12rem)`) — Maximum logical inline size of a vertical `start`/`end` nav. Long labels ellipsize inside that bound so the panel remains usable at narrow allocations.\n- `--track-color` — Upstream track color.\n- `--track-width` — Upstream track width.",
22080
+ "description": "`<lr-tab-group>` — a tab strip composed from direct `<lr-tab panel=\"x\">` and\n`<lr-tab-panel name=\"x\">` children. This is the one canonical child model shared with both\nmapped upstreams; the group assigns private projection slots itself so consumer markup remains\na mechanical tag rename.\n\nImplements the WAI-ARIA APG tabs pattern. With the default `activation=\"auto\"`, Left/Right\n(swapped under RTL, or Up/Down when `placement` is `start`/`end`) move focus *and* selection\ntogether; with `activation=\"manual\"` they move focus only and Enter/Space commits, which the APG\nrequires whenever revealing a panel is expensive. Home/End jump to the first/last enabled tab,\nand a roving `tabindex` follows the focused tab. An enabled closable `<lr-tab>` adds\n`aria-keyshortcuts=\"Delete\"` to that same real tab button; Delete routes the close request through\nthe descriptor so `lr-close` still targets `<lr-tab>`. The visual close affordance stays\nnon-focusable and accessibility-hidden, avoiding a nested interactive control. Rich `<lr-tab>`\ncontent is likewise inert while projected; only its accessibility-exposed, default-slot text\nnames the real tab button rather than leaving an interactive descendant inside it. Author\n`aria-hidden`, hidden, inert, and CSS-hidden branches never leak into that name, and visibility\nor text changes refresh it.\n\n**`inert` on a source child excludes its tab exactly as `disabled` does** — it never takes\nselection, never holds the roving `tabindex`, and arrow keys step past it — and the rendered tab\nbutton is itself marked `inert`, so a pointer cannot reach it either. Only the child's *own*\n`inert` counts: a whole group inerted by an open modal keeps its selection and panels intact.\n\n`defaultSlot` exposes the real unnamed shadow slot expected by mapped integrations. Lyra keeps\nit hidden because every accepted child is assigned to a deterministic named projection slot.\n\n**Overflow.** A horizontal tab row that does not fit stays natively scrollable and gains two\nscroll controls flanking the tablist inside `[part=\"nav\"]`, mirroring both upstreams. They are\nrendered only for a horizontal `placement` (a vertical strip scrolls in the block direction,\nwhich these controls do not address — the same restriction both upstreams apply) and are laid out\nonly while the tablist genuinely overflows, gated on the measurement the edge fade already uses,\nso a row that fits is never flanked by two dead buttons. `without-scroll-controls` (or Shoelace's\n`no-scroll-controls`) opts out, leaving the pre-8.0.0 behavior: native scrolling plus the fade.\nThe fade is deliberately kept alongside the controls — it says \"the row continues past this\nedge\", which the controls themselves cannot show, and both appear on exactly the same condition.\nBy default an inactive edge control is hidden once that direction has nothing left to scroll to.\nShoelace's `fixed-scroll-controls` keeps both controls present throughout an overflowing range;\nin that mode an exhausted control stays visible but remains a no-op. Edge state is measured in\nlogical coordinates, so controls and the one-sided fade remain truthful under RTL too.\nA vertical `start`/`end` nav stays shrinkable and is capped at\n`--lr-tab-group-vertical-nav-max-inline-size` (default `var(--lr-size-12rem)`), so long labels\nellipsize rather than consuming the panel's allocation.\n\n**The scroll controls are `aria-hidden=\"true\"` and `tabindex=\"-1\"`** — a pointer affordance only,\nmatching upstream. The tablist is already fully keyboard-scrollable without them: the roving\n`tabindex` puts every tab one arrow key away, and focusing a tab scrolls it into view. Adding two\ntab stops in the middle of the strip would therefore buy no capability and cost every keyboard\nuser two extra stops between the tabs and the panel. They still carry a localized `aria-label`,\nso the name is there for automation and for a consumer that chooses to expose them.\n\n---\n\n**Component metadata**\n\n- Status: `stable`\n- Since: `8.0.0`\n- Rationale: This tag entered Lyra as a stable public API with documented behavior, accessibility, and cross-browser support.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Canonical `<lr-tab>`/`<lr-tab-panel>` pairs. |\n| `nav` | Upstream-compatible slot used by `<lr-tab>` descriptors. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `active-tab-indicator` | Indicator inside the active tab. |\n| `base` | Compatibility name for the root wrapper; use `tab-group`. |\n| `body` | Wrapper around all tab panels. |\n| `nav` | The row wrapping the tablist together with the two overflow scroll controls; mirrors the upstream part of the same name. |\n| `panel` | A single `role=\"tabpanel\"` wrapper (one per tab, hidden unless active). |\n| `scroll-button` | Shared part on both overflow scroll controls. |\n| `scroll-button--end` | Upstream modifier alias on `scroll-button-end`. |\n| `scroll-button--start` | Upstream modifier alias on `scroll-button-start`. |\n| `scroll-button-end` | The control that scrolls the tabs toward their inline end (\"next\" — the left-hand control under RTL). |\n| `scroll-button-glyph` | The chevron wrapper inside a scroll control. This is the element that mirrors under RTL; the icon itself never rotates. |\n| `scroll-button-start` | The control that scrolls the tabs toward their inline start (\"previous\" — the right-hand control under RTL). |\n| `scroll-button__base` | Export-compatible base name on both scroll controls. |\n| `tab` | A single tab button. |\n| `tab-group` | The root wrapper around the tablist and panels. It is the same node as `base`. |\n| `tablist` | The `role=\"tablist\"` row of tab buttons. |\n| `tabs` | Upstream name on the same scroll container as `tablist`. |\n\n---\n\n**CSS Custom Properties**\n\n- `--indicator-color` — Upstream alias for the active indicator color.\n- `--lr-scroll-fade-size` (default: `2rem`) — Width of the fade at each horizontal scroll edge. The fade is applied only while the tablist actually overflows, so a row that fits is never dimmed.\n- `--lr-tab-group-active-bg` (default: `color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-active))`) — Background of a pressed, non-disabled tab.\n- `--lr-tab-group-active-color` (default: `var(--lr-tab-group-hover-color, var(--lr-color-text))`) — Text color of a pressed, non-disabled tab.\n- `--lr-tab-group-hover-color` (default: `var(--lr-color-text)`) — Text color of a hovered, non-disabled tab. Independent of the selected-state props above. Pressed-tab and scroll-control hooks use inline `var()` fallbacks rather than a `:host` declaration, so they inherit from the group or any ancestor without retheming the other states.\n- `--lr-tab-group-indicator-color` (default: `var(--lr-color-brand)`) — Color of the selected tab's underline, themeable independently of its text color.\n- `--lr-tab-group-scroll-button-active-bg` (default: `color-mix(in oklab, transparent, var(--lr-color-mix-partner) var(--lr-color-mix-active))`) — Background of a pressed overflow scroll control.\n- `--lr-tab-group-scroll-button-active-color` (default: `var(--lr-color-text)`) — Text color of a pressed overflow scroll control.\n- `--lr-tab-group-scroll-button-hover-color` (default: `var(--lr-color-text)`) — Text color of a hovered overflow scroll control.\n- `--lr-tab-group-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-tab-group-vertical-nav-max-inline-size` (default: `var(--lr-size-12rem)`) — Maximum logical inline size of a vertical `start`/`end` nav. Long labels ellipsize inside that bound so the panel remains usable at narrow allocations.\n- `--track-color` — Upstream track color.\n- `--track-width` — Upstream track width.",
21887
22081
  "attributes": [
21888
22082
  {
21889
22083
  "name": "activation",
@@ -21993,7 +22187,7 @@
21993
22187
  },
21994
22188
  {
21995
22189
  "name": "lr-table",
21996
- "description": "`<lr-table>` — a sort/select-aware data table.\n\nA sortable-header activation first proposes a cancelable `lr-sort-request`. If accepted, client\nmode writes `sortKey`/`sortDir` and reorders the rendered rows before emitting `lr-sort`; server\nmode leaves those properties controlled and emits the same committed transaction so the caller\ncan fetch and supply the corresponding row order. Single/multiple selection is self-managed in\none `selectedRowKeys` store; expansion remains controlled through `expandedRowKeys`.\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 inspect\nthe delegated event's composed path for actual native, role, or tabindex\nsemantics (see `INTERACTIVE_SELECTOR`) so a button/link/input inside a cell\nowns its own activation instead of triggering `lr-row-click`. A passive\ncustom element remains part of the row activation surface; an opaque\nclosed-shadow control marks its host with `data-table-interactive`.\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()`). When controlled rows or columns replace the focused\nmember, focus follows the same stable key when it survives and otherwise\nclamps to the nearest surviving index; an update never reclaims focus once\nthe user has moved it outside the table.\nBlank and later-duplicate column keys are omitted first-wins at assignment. Rows retain their\ncaller-owned records, then one canonical `rowKey` projection omits blank and later-duplicate\nidentities before filtering, counts, pagination, focus, actions, and events.\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. The public `hasHiddenPriorityColumns`\nproperty reports only whether a priority column is actually hidden right\nnow, measured via `ResizeObserver` on `[part='base']` plus a post-render DOM\ncheck. The toggle separately measures whether priority columns would hide\nat the current allocation, so it stays available while force-visible mode\nis active without making `hasHiddenPriorityColumns` contradict the rendered\nstate. `priorityColumnsVisible` 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`priority-columns-visible` attribute) to restore a previously-persisted\npreference, and readable back — directly or via the `lr-priority-columns-visibility-change`\nevent — to persist the current one. `columns[].sticky` pins a column's\nheader/cells to the inline-start (`'start'`) 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`expandedRowKeys` (a `Set<string | number>` of row keys, per `rowKey`/\n`keyOf()`) — the table only reads it and emits `lr-row-expand-toggle`\non activation. (`selectedRowKeys` is self-managed for selection, and\n`sortKey`/`sortDir` are *not* a parallel case either: under\nthe default `sortMode: 'client'` the table writes them on header\nactivation.)\n\nSelection is opt-in through the `selectionMode` property. Use `single` or\n`multiple` to self-manage row selection; the default `none` remains\npresentational. `selectedRowKeys` contains the raw keys in every mode; single mode enforces one.\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.\nThe internal filter and cell-editor native value events are contained at\ntheir translation boundaries; hosts receive `lr-filter-change` and\n`lr-cell-edit` instead.\n`pageSize` bounds pagination through the existing `<lr-pagination>` primitive (100 rows by\ndefault, normalized to 1..500). Client mode owns the accepted page and slices `rows`; server mode\nleaves `page` controlled, bounds the supplied page to `pageSize`, and uses `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. Loading takes precedence over both empty branches. Because a skeleton needs a\ncolumn schema, a skeleton request received before `columns` arrives temporarily falls back to\nthe spinner rather than showing the no-columns empty state. Initial declarative loading stays\nsilent; every post-mount transition into either\nloading appearance appends to the shared light-DOM polite sink — including repeated cycles —\nwhile every placeholder opts out of `<lr-skeleton>`'s own announcement.\nColumns with `editTrigger: 'double-click'` open a native text/number editor on\ndouble-click and emit `lr-cell-edit`; row mutation remains consumer-owned.\n`editTrigger: '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. A client-mode\nsort applies *within* each group, so grouping survives sorting on a column\nunrelated to the group key.\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). The heat-tint and resize properties can be set on the table or a theme\nancestor; a value set directly on the table wins through the normal cascade. `rowTotal`/`grandTotal`\nadd 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**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\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| `caption` | The `<caption>` element, rendered only when `caption` is set. |\n| `cell` | Each body `<td>`. |\n| `cell-editor` | The native inline cell editor: shown after a double-click on an `editTrigger: 'double-click'` cell, and rendered persistently in every body cell of an `editTrigger: '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 `expandedRowKeys`. |\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 aria-hidden announcement mirror, since the placeholder rows are the visible affordance. It is never itself live; post-mount loading announcements use the shared light-DOM polite sink. |\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-header-sorted-bg` (default: `var(--lr-color-surface)`) — Background of the currently-sorted column's header cell (`[aria-sort]` other than `none`). Same rationale as `--lr-table-row-selected-bg`: `::part(header-cell)[aria-sort]` is invalid CSS, so this token is the supported way to recolor the sorted header without hijacking a library-wide token.\n- `--lr-table-header-sorted-color` (default: `inherit`) — Text color of the currently-sorted column's header cell.\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-heat-tint-hi` (default: `var(--lr-color-brand)`) — High endpoint of the heat-tint ramp used by `heatValue` columns. Inherits from theme ancestors.\n- `--lr-table-heat-tint-lo` (default: `var(--lr-color-brand-quiet)`) — Low endpoint of the heat-tint ramp used by `heatValue` columns. Inherits from theme ancestors.\n- `--lr-table-max-height` (default: `none`) — Cap on the scroll container's block size, past which the table body scrolls.\n- `--lr-table-resize-handle-active-bg` (default: `var(--lr-table-resize-handle-hover-bg,var(--lr-color-brand))`) — Resize-handle pressed background.\n- `--lr-table-resize-handle-active-opacity` (default: `calc(var(--lr-table-resize-handle-hover-opacity,var(--lr-table-resize-handle-opacity,0.12))*2)`) — Resize-handle pressed opacity.\n- `--lr-table-resize-handle-hover-bg` (default: `var(--lr-color-brand)`) — Resize-handle hover/focus background.\n- `--lr-table-resize-handle-hover-opacity` (default: `var(--lr-table-resize-handle-opacity,0.12)`) — Resize-handle hover/focus opacity.\n- `--lr-table-resize-handle-opacity` (default: `0.12`) — Hover/focus opacity of the resize handle. Legacy shared-state hook; inherits from theme ancestors.\n- `--lr-table-resize-min-width` (default: `var(--lr-size-3rem)`) — Default minimum width for a resizable column without an explicit pixel `minWidth`. Inherits from theme ancestors.\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-row-stripe-bg` (default: `transparent`) — Background of alternating body rows. The token is read only on rows carrying the internal stripe marker, so it can be set on the table or an ancestor without affecting group, expanded, hover, or selected rows.\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.",
22190
+ "description": "`<lr-table>` — a sort/select-aware data table.\n\nA sortable-header activation first proposes a cancelable `lr-sort-request`. If accepted, client\nmode writes `sortKey`/`sortDir` and reorders the rendered rows before emitting `lr-sort`; server\nmode leaves those properties controlled and emits the same committed transaction so the caller\ncan fetch and supply the corresponding row order. Single/multiple selection is self-managed in\none `selectedRowKeys` store; expansion remains controlled through `expandedRowKeys`.\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 inspect\nthe delegated event's composed path for actual native, role, or tabindex\nsemantics (see `INTERACTIVE_SELECTOR`) so a button/link/input inside a cell\nowns its own activation instead of triggering `lr-row-click`. A passive\ncustom element remains part of the row activation surface; an opaque\nclosed-shadow control marks its host with `data-table-interactive`.\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()`). When controlled rows or columns replace the focused\nmember, focus follows the same stable key when it survives and otherwise\nclamps to the nearest surviving index; an update never reclaims focus once\nthe user has moved it outside the table.\nBlank and later-duplicate column keys are omitted first-wins at assignment. Rows retain their\ncaller-owned records, then one canonical `rowKey` projection omits blank and later-duplicate\nidentities before filtering, counts, pagination, focus, actions, and events.\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. The public `hasHiddenPriorityColumns`\nproperty reports only whether a priority column is actually hidden right\nnow, measured via `ResizeObserver` on `[part='base']` plus a post-render DOM\ncheck. The toggle separately measures whether priority columns would hide\nat the current allocation, so it stays available while force-visible mode\nis active without making `hasHiddenPriorityColumns` contradict the rendered\nstate. `priorityColumnsVisible` 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`priority-columns-visible` attribute) to restore a previously-persisted\npreference, and readable back — directly or via the `lr-priority-columns-visibility-change`\nevent — to persist the current one. `columns[].sticky` pins a column's\nheader/cells to the inline-start (`'start'`) 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`expandedRowKeys` (a `Set<string | number>` of row keys, per `rowKey`/\n`keyOf()`) — the table only reads it and emits `lr-row-expand-toggle`\non activation. (`selectedRowKeys` is self-managed for selection, and\n`sortKey`/`sortDir` are *not* a parallel case either: under\nthe default `sortMode: 'client'` the table writes them on header\nactivation.)\n\nSelection is opt-in through the `selectionMode` property. Use `single` or\n`multiple` to self-manage row selection; the default `none` remains\npresentational. `selectedRowKeys` contains the raw keys in every mode; single mode enforces one.\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.\nThe internal filter and cell-editor native value events are contained at\ntheir translation boundaries; hosts receive `lr-filter-change` and\n`lr-cell-edit` instead.\n`pageSize` bounds pagination through the existing `<lr-pagination>` primitive (100 rows by\ndefault, normalized to 1..500). Client mode owns the accepted page and slices `rows`; server mode\nleaves `page` controlled, bounds the supplied page to `pageSize`, and uses `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. Loading takes precedence over both empty branches. Because a skeleton needs a\ncolumn schema, a skeleton request received before `columns` arrives temporarily falls back to\nthe spinner rather than showing the no-columns empty state. Initial declarative loading stays\nsilent; every post-mount transition into either\nloading appearance appends to the shared light-DOM polite sink — including repeated cycles —\nwhile every placeholder opts out of `<lr-skeleton>`'s own announcement.\nColumns with `editTrigger: 'double-click'` open a native text/number editor on\ndouble-click and emit `lr-cell-edit`; row mutation remains consumer-owned.\n`editTrigger: '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. A client-mode\nsort applies *within* each group, so grouping survives sorting on a column\nunrelated to the group key.\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). The heat-tint and resize properties can be set on the table or a theme\nancestor; a value set directly on the table wins through the normal cascade. `rowTotal`/`grandTotal`\nadd 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**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\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| `caption` | The `<caption>` element, rendered only when `caption` is set. |\n| `cell` | Each body `<td>`. |\n| `cell-editor` | The native inline cell editor: shown after a double-click on an `editTrigger: 'double-click'` cell, and rendered persistently in every body cell of an `editTrigger: '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 `expandedRowKeys`. |\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 aria-hidden announcement mirror, since the placeholder rows are the visible affordance. It is never itself live; post-mount loading announcements use the shared light-DOM polite sink. |\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-cell-color` (default: `inherit`) — Text colour of body cells; inherits the host's own colour by default.\n- `--lr-table-cell-link-color` (default: `var(--lr-color-brand)`) — Colour of an anchor returned from a column's `cell(row)`. Such an anchor renders inside this component's shadow root, so page CSS cannot reach it and `::part()` cannot select past the first compound selector to reach it either; without this hook it computes to the UA default link blue. Set `revert` for the UA default.\n- `--lr-table-cell-link-hover-color` (default: `var(--lr-table-cell-link-color,var(--lr-color-brand))`) — Colour of that anchor on hover and `:focus-visible`, which also thicken its underline.\n- `--lr-table-header-sorted-bg` (default: `var(--lr-color-surface)`) — Background of the currently-sorted column's header cell (`[aria-sort]` other than `none`). Same rationale as `--lr-table-row-selected-bg`: `::part(header-cell)[aria-sort]` is invalid CSS, so this token is the supported way to recolor the sorted header without hijacking a library-wide token.\n- `--lr-table-header-sorted-color` (default: `inherit`) — Text color of the currently-sorted column's header cell.\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-heat-tint-hi` (default: `var(--lr-color-brand)`) — High endpoint of the heat-tint ramp used by `heatValue` columns. Inherits from theme ancestors.\n- `--lr-table-heat-tint-lo` (default: `var(--lr-color-brand-quiet)`) — Low endpoint of the heat-tint ramp used by `heatValue` columns. Inherits from theme ancestors.\n- `--lr-table-max-height` (default: `none`) — Cap on the scroll container's block size, past which the table body scrolls.\n- `--lr-table-resize-handle-active-bg` (default: `var(--lr-table-resize-handle-hover-bg,var(--lr-color-brand))`) — Resize-handle pressed background.\n- `--lr-table-resize-handle-active-opacity` (default: `calc(var(--lr-table-resize-handle-hover-opacity,var(--lr-table-resize-handle-opacity,0.12))*2)`) — Resize-handle pressed opacity.\n- `--lr-table-resize-handle-hover-bg` (default: `var(--lr-color-brand)`) — Resize-handle hover/focus background.\n- `--lr-table-resize-handle-hover-opacity` (default: `var(--lr-table-resize-handle-opacity,0.12)`) — Resize-handle hover/focus opacity.\n- `--lr-table-resize-handle-opacity` (default: `0.12`) — Hover/focus opacity of the resize handle. Legacy shared-state hook; inherits from theme ancestors.\n- `--lr-table-resize-min-width` (default: `var(--lr-size-3rem)`) — Default minimum width for a resizable column without an explicit pixel `minWidth`. Inherits from theme ancestors.\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-row-stripe-bg` (default: `transparent`) — Background of alternating body rows. The token is read only on rows carrying the internal stripe marker, so it can be set on the table or an ancestor without affecting group, expanded, hover, or selected rows.\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.",
21997
22191
  "attributes": [
21998
22192
  {
21999
22193
  "name": "accessible-label",
@@ -22201,6 +22395,16 @@
22201
22395
  "name": "reveal-columns-label",
22202
22396
  "description": "Type: `string | undefined`"
22203
22397
  },
22398
+ {
22399
+ "name": "scroll-mode",
22400
+ "description": "Which element scrolls when the table overflows; see `TableScrollMode`. Defaults to `'self'`,\nwhich is the pre-10.0 behaviour.\n\nType: `TableScrollMode` \nDefault: `'self'`",
22401
+ "value": {
22402
+ "type": [
22403
+ "'self'",
22404
+ "'page'"
22405
+ ]
22406
+ }
22407
+ },
22204
22408
  {
22205
22409
  "name": "selection-mode",
22206
22410
  "description": "Type: `TableSelectionMode` \nDefault: `'none'`",
@@ -23437,12 +23641,22 @@
23437
23641
  },
23438
23642
  {
23439
23643
  "name": "lr-timeline",
23440
- "description": "`<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**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\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 an edge-fade `mask-image` applied only while the strip actually overflows) in `horizontal` orientation. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-scroll-fade-size` (default: `2rem`) — Inline size of each edge fade while a horizontal timeline overflows. Forced-colors mode disables the masks while retaining native scrolling.\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.",
23644
+ "description": "`<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**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\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 an edge-fade `mask-image` applied only while the strip actually overflows) in `horizontal` orientation. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-scroll-fade-size` (default: `2rem`) — Inline size of each edge fade while a horizontal timeline overflows. Forced-colors mode disables the masks while retaining native scrolling.\n- `--lr-timeline-collision-offset` (default: `var(--lr-space-l)`) — Cross-axis step between items stacked by `collision=\"stack\"`. Each collision lane is indented one step further, so a wider marker can claim more room without the lanes overlapping again. Ignored unless both `scale=\"time\"` and `collision=\"stack\"` are set.\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.\n- `--lr-timeline-time-extent` (default: `var(--lr-size-20rem)`) — Distance the `scale=\"time\"` axis distributes items along: `block-size` when vertical, `inline-size` when horizontal. Time-scaled items are absolutely positioned, and a percentage offset against an auto-sized track resolves to zero, so the axis needs a definite extent. Ignored in the default `scale=\"flow\"`.",
23441
23645
  "attributes": [
23442
23646
  {
23443
23647
  "name": "aria-label",
23444
23648
  "description": "Host-level `aria-label` override for the list's accessible name — wins over the localized\ndefault `\"Timeline\"`. Needed because the `role=\"list\"` element lives in the shadow root and\nnever inherits a host attribute automatically — same reasoning as `<lr-breadcrumb>`'s\nidentical property. Unset falls back to the localized default; an explicitly empty\n`aria-label` stays empty.\n\nType: `string | undefined`"
23445
23649
  },
23650
+ {
23651
+ "name": "collision",
23652
+ "description": "Type: `LyraTimelineCollision`",
23653
+ "value": {
23654
+ "type": [
23655
+ "'overlap'",
23656
+ "'stack'"
23657
+ ]
23658
+ }
23659
+ },
23446
23660
  {
23447
23661
  "name": "locale",
23448
23662
  "description": "Optional locale override. Otherwise the nearest `locale`/`lang` ancestor is used.\n\nType: `string` \nDefault: `''`",
@@ -23461,6 +23675,16 @@
23461
23675
  "'vertical'"
23462
23676
  ]
23463
23677
  }
23678
+ },
23679
+ {
23680
+ "name": "scale",
23681
+ "description": "Type: `LyraTimelineScale`",
23682
+ "value": {
23683
+ "type": [
23684
+ "'flow'",
23685
+ "'time'"
23686
+ ]
23687
+ }
23464
23688
  }
23465
23689
  ]
23466
23690
  },
@@ -24463,7 +24687,7 @@
24463
24687
  },
24464
24688
  {
24465
24689
  "name": "aria-label",
24466
- "description": "Host-level `aria-label` override for every step popover's accessible name -- wins over each\nstep's own `heading`, matching `lr-dialog`'s `accessibleLabel` pattern. Most consumers\nwon't need this since each step already has a meaningful name via `heading`; setting it\nmakes the *same* string name every step's panel. Set as a plain `aria-label` attribute on\n`<lr-tour>` itself, not a public JS property.\n\nType: `string | null` \nDefault: `null`"
24690
+ "description": "Host-level `aria-label` override for every step popover's accessible name -- wins over each\nstep's own `heading`, matching `lr-dialog`'s `accessibleLabel` pattern. Most consumers\nwon't need this since each step already has a meaningful name via `heading`; setting it\nmakes the *same* string name every step's panel. Set as a plain `aria-label` attribute on\n`<lr-tour>` itself, not a public JS property. An explicitly empty `aria-label=\"\"` suppresses\nthe panel's accessible name outright rather than falling back to the heading or step count --\nagain as `lr-dialog` does.\n\nType: `string | null` \nDefault: `null`"
24467
24691
  },
24468
24692
  {
24469
24693
  "name": "distance",
@@ -25026,7 +25250,7 @@
25026
25250
  },
25027
25251
  {
25028
25252
  "name": "lr-video-playlist",
25029
- "description": "`<lr-video-playlist>` — a direct-child `<lr-video>` playlist with a navigable current-item\nlist. It mirrors the public `<wa-video-playlist>` surface under the `lr-` prefix.\n\nLyra additionally exposes `autoAdvance` and `repeat`. `autoAdvance` defaults to `true` to\npreserve the mirrored ended behavior; `repeat=\"one\"` restarts the current video and\n`repeat=\"all\"` wraps the final video to the first.\n`items` can seed deterministic playlist-row metadata for server rendering. Seeded rows are\nvisible but disabled until the browser can adopt the indexed direct video children; live child\nmetadata is authoritative after that corrective update.\n\nA child marked `inert` is unavailable: it never becomes the active video,\n`next()`/`previous()`/auto-advance step past it, and its playlist row renders `disabled` so the\nrow cannot enter the sequential or arrow-key path. Only the child's *own* `inert` counts — a\nplaylist inerted wholesale by an open modal keeps playing. `<lr-video>` has no `disabled`\ncontract; use the native `inert` property to make a child unavailable.\nEvery enabled row is an ordinary sequentially reachable button (`tabindex=\"0\"`); arrow keys are\noptional shortcuts, not a required composite-widget navigation contract. Visible durations are\nassociated with their row through `aria-describedby`. Child presentation overrides are owned\nreversibly while the child belongs to this playlist and restored on removal/reparenting.\n\n---\n\n**Component metadata**\n\n- Status: `experimental`\n- Since: `8.0.0`\n- Rationale: This newly introduced Lyra tag mirrors an experimental Web Awesome 3.11 public surface and remains experimental while production compatibility evidence is gathered.\n- Graduation: Eligible for stable status once the mapped public surface, populated accessibility states, cross-browser media behavior, and lifecycle edge cases demonstrate sustained reliability.\n- Deprecated part `base`: Deprecated since `8.0.0`. Use part `::part(video-playlist)`. Removal is not permitted before `10.0.0`. The video-playlist part identifies the root component explicitly; base remains on the same root node for migration compatibility.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Direct `<lr-video>` children. Other elements are not playlist items. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | Deprecated alias on the same root node as `video-playlist`. |\n| `playlist` | Playlist sidebar container. |\n| `playlist-duration` | Duration text within a playlist item. |\n| `playlist-item` | An individual playlist item button. |\n| `playlist-thumbnail` | Thumbnail within a playlist item. |\n| `playlist-title` | Title text within a playlist item. |\n| `video-playlist` | Root video-and-playlist layout. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-video-playlist-item-current-background` (default: `var(--lr-color-brand-fill-quiet)`) — Current playlist-item background.\n- `--lr-video-playlist-item-current-border-color` (default: `var(--lr-color-brand)`) — Current playlist-item border color.",
25253
+ "description": "`<lr-video-playlist>` — a direct-child `<lr-video>` playlist with a navigable current-item\nlist. It mirrors the public `<wa-video-playlist>` surface under the `lr-` prefix.\n\nLyra additionally exposes `autoAdvance` and `repeat`. `autoAdvance` defaults to `true` to\npreserve the mirrored ended behavior; `repeat=\"one\"` restarts the current video and\n`repeat=\"all\"` wraps the final video to the first.\n`items` can seed deterministic playlist-row metadata for server rendering. Seeded rows are\nvisible but disabled until the browser can adopt the indexed direct video children; live child\nmetadata is authoritative after that corrective update.\n\nA child marked `inert` is unavailable: it never becomes the active video,\n`next()`/`previous()`/auto-advance step past it, and its playlist row renders `disabled` so the\nrow cannot enter the sequential or arrow-key path. Only the child's *own* `inert` counts — a\nplaylist inerted wholesale by an open modal keeps playing. `<lr-video>` has no `disabled`\ncontract; use the native `inert` property to make a child unavailable.\nEvery enabled row is an ordinary sequentially reachable button (`tabindex=\"0\"`); arrow keys are\noptional shortcuts, not a required composite-widget navigation contract. Visible durations are\nassociated with their row through `aria-describedby`. Child presentation overrides are owned\nreversibly while the child belongs to this playlist and restored on removal/reparenting.\n\n---\n\n**Component metadata**\n\n- Status: `experimental`\n- Since: `8.0.0`\n- Rationale: This newly introduced Lyra tag mirrors an experimental Web Awesome 3.11 public surface and remains experimental while production compatibility evidence is gathered.\n- Graduation: Eligible for stable status once the mapped public surface, populated accessibility states, cross-browser media behavior, and lifecycle edge cases demonstrate sustained reliability.\n- Deprecated part `base`: Deprecated since `8.0.0`. Use part `::part(video-playlist)`. Removal is not permitted before `10.0.0`. The video-playlist part identifies the root component explicitly; base remains on the same root node for migration compatibility. That version is a policy floor, not a plan: `wa-video-playlist` still publishes its own deprecated `base` part, so this alias is removed only when upstream's is.\n\n---\n\n**Slots**\n\n| Name | Description |\n| --- | --- |\n| (default) | Direct `<lr-video>` children. Other elements are not playlist items. |\n\n---\n\n**CSS Shadow Parts**\n\n| Name | Description |\n| --- | --- |\n| `base` | Deprecated alias on the same root node as `video-playlist`. |\n| `playlist` | Playlist sidebar container. |\n| `playlist-duration` | Duration text within a playlist item. |\n| `playlist-item` | An individual playlist item button. |\n| `playlist-thumbnail` | Thumbnail within a playlist item. |\n| `playlist-title` | Title text within a playlist item. |\n| `video-playlist` | Root video-and-playlist layout. |\n\n---\n\n**CSS Custom Properties**\n\n- `--lr-video-playlist-item-current-background` (default: `var(--lr-color-brand-fill-quiet)`) — Current playlist-item background.\n- `--lr-video-playlist-item-current-border-color` (default: `var(--lr-color-brand)`) — Current playlist-item border color.",
25030
25254
  "attributes": [
25031
25255
  {
25032
25256
  "name": "auto-advance",
@@ -25372,7 +25596,7 @@
25372
25596
  },
25373
25597
  {
25374
25598
  "name": "lr-widget",
25375
- "description": "`<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**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\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. Assigned content is decorative, inert, and aria-hidden so the outer toggle remains the sole action. 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). Assigned content is decorative, inert, and aria-hidden so the outer toggle remains the sole action. Only meaningful while `expandable`. |\n| `icon` | Optional decorative leading icon in the title row. Its flattened subtree is inert and hidden from assistive technology. |\n| `label` | Rich label content (overrides the `label` attribute). |\n| `sublabel` | Rich sublabel content (overrides the `sublabel` attribute). |\n| `view-{viewId}` | Content for the view whose `LyraWidgetView.viewId` matches `{viewId}`, 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-icon` | Decorative icon content inside a view toggle; its subtree is inert and hidden from assistive technology. |\n| `view-label` | Visible label text inside a view toggle. |\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-backdrop-inset` (default: `0`) — 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. `fullscreen-inset` overrides the safe-area panel inset while the viewport-filling backdrop stays at zero by default. `compact` tightens header/body padding — same convention as `lr-empty`.\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-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-border-color` (default: `transparent`) — Border color of the pressed view toggle. Like the active background and text hooks, it is an inline inherited fallback.\n- `--lr-widget-view-toggle-active-color` (default: `var(--lr-color-brand)`) — Text color of the pressed view toggle.\n- `--lr-widget-view-toggle-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Background of a hovered `[part=\"view-toggle\"]`.\n- `--lr-widget-view-toggle-hover-color` (default: `var(--lr-color-text)`) — Text color of a hovered `[part=\"view-toggle\"]`.",
25599
+ "description": "`<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**Component metadata**\n\n- Status: `stable`\n- Since: `4.0.0`\n- Rationale: This exact lr-* tag appears in a published Lyra release manifest and remains a supported public contract under semver.\n- Graduation: Already stable; it retains that status while its documented behavior, accessibility, compatibility, and cross-browser support remain part of the public contract.\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. Assigned content is decorative, inert, and aria-hidden so the outer toggle remains the sole action. 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). Assigned content is decorative, inert, and aria-hidden so the outer toggle remains the sole action. Only meaningful while `expandable`. |\n| `icon` | Optional decorative leading icon in the title row. Its flattened subtree is inert and hidden from assistive technology. |\n| `label` | Rich label content (overrides the `label` attribute). |\n| `sublabel` | Rich sublabel content (overrides the `sublabel` attribute). |\n| `view-{viewId}` | Content for the view whose `LyraWidgetView.viewId` matches `{viewId}`, 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-icon` | Decorative icon content inside a view toggle; its subtree is inert and hidden from assistive technology. |\n| `view-label` | Visible label text inside a view toggle. |\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-scroll-fade-size` (default: `2rem`) — Width of the fade at each horizontal scroll edge of the `actions`/`view-toggles` header rows. The fade is applied only while a row actually overflows, so a row that fits is never dimmed. `fullscreen-inset` overrides the safe-area panel inset while the viewport-filling backdrop stays at zero by default. `compact` tightens header/body padding — same convention as `lr-empty`.\n- `--lr-widget-backdrop-inset` (default: `0`) — 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.\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-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-border-color` (default: `transparent`) — Border color of the pressed view toggle. Like the active background and text hooks, it is an inline inherited fallback.\n- `--lr-widget-view-toggle-active-color` (default: `var(--lr-color-brand)`) — Text color of the pressed view toggle.\n- `--lr-widget-view-toggle-hover-bg` (default: `var(--lr-color-brand-quiet)`) — Background of a hovered `[part=\"view-toggle\"]`.\n- `--lr-widget-view-toggle-hover-color` (default: `var(--lr-color-text)`) — Text color of a hovered `[part=\"view-toggle\"]`.",
25376
25600
  "attributes": [
25377
25601
  {
25378
25602
  "name": "aria-label",
@@ -30635,7 +30859,7 @@
30635
30859
  },
30636
30860
  {
30637
30861
  "name": "--lr-scroll-fade-size",
30638
- "description": "**`<lr-segmented>`** (default: `2rem`) — Width of the fade at each horizontal scroll edge. The fade is applied only while the track actually overflows, so a row that fits is never dimmed.\n\n**`<lr-stepper>`** (default: `2rem`) — Width of each decorative horizontal overflow fade. Pointer-state hooks use inline `var()` fallbacks rather than a `:host` declaration, so they inherit from the stepper or any ancestor without retheming another state.\n\n**`<lr-tab-group>`** (default: `2rem`) — Width of the fade at each horizontal scroll edge. The fade is applied only while the tablist actually overflows, so a row that fits is never dimmed.\n\n**`<lr-timeline>`** (default: `2rem`) — Inline size of each edge fade while a horizontal timeline overflows. Forced-colors mode disables the masks while retaining native scrolling.\n\n**Shared design token** — Canonical shared component token for scroll fade size. Reads `--lr-theme-scroll-fade-size`."
30862
+ "description": "**`<lr-segmented>`** (default: `2rem`) — Width of the fade at each horizontal scroll edge. The fade is applied only while the track actually overflows, so a row that fits is never dimmed.\n\n**`<lr-stepper>`** (default: `2rem`) — Width of each decorative horizontal overflow fade. Pointer-state hooks use inline `var()` fallbacks rather than a `:host` declaration, so they inherit from the stepper or any ancestor without retheming another state.\n\n**`<lr-tab-group>`** (default: `2rem`) — Width of the fade at each horizontal scroll edge. The fade is applied only while the tablist actually overflows, so a row that fits is never dimmed.\n\n**`<lr-timeline>`** (default: `2rem`) — Inline size of each edge fade while a horizontal timeline overflows. Forced-colors mode disables the masks while retaining native scrolling.\n\n**`<lr-widget>`** (default: `2rem`) — Width of the fade at each horizontal scroll edge of the `actions`/`view-toggles` header rows. The fade is applied only while a row actually overflows, so a row that fits is never dimmed. `fullscreen-inset` overrides the safe-area panel inset while the viewport-filling backdrop stays at zero by default. `compact` tightens header/body padding — same convention as `lr-empty`.\n\n**Shared design token** — Canonical shared component token for scroll fade size. Reads `--lr-theme-scroll-fade-size`."
30639
30863
  },
30640
30864
  {
30641
30865
  "name": "--lr-scroller-control-size",
@@ -31689,6 +31913,18 @@
31689
31913
  "name": "--lr-tab-group-vertical-nav-max-inline-size",
31690
31914
  "description": "**`<lr-tab-group>`** (default: `var(--lr-size-12rem)`) — Maximum logical inline size of a vertical `start`/`end` nav. Long labels ellipsize inside that bound so the panel remains usable at narrow allocations."
31691
31915
  },
31916
+ {
31917
+ "name": "--lr-table-cell-color",
31918
+ "description": "**`<lr-table>`** (default: `inherit`) — Text colour of body cells; inherits the host's own colour by default."
31919
+ },
31920
+ {
31921
+ "name": "--lr-table-cell-link-color",
31922
+ "description": "**`<lr-table>`** (default: `var(--lr-color-brand)`) — Colour of an anchor returned from a column's `cell(row)`. Such an anchor renders inside this component's shadow root, so page CSS cannot reach it and `::part()` cannot select past the first compound selector to reach it either; without this hook it computes to the UA default link blue. Set `revert` for the UA default."
31923
+ },
31924
+ {
31925
+ "name": "--lr-table-cell-link-hover-color",
31926
+ "description": "**`<lr-table>`** (default: `var(--lr-table-cell-link-color,var(--lr-color-brand))`) — Colour of that anchor on hover and `:focus-visible`, which also thicken its underline."
31927
+ },
31692
31928
  {
31693
31929
  "name": "--lr-table-header-sorted-bg",
31694
31930
  "description": "**`<lr-table>`** (default: `var(--lr-color-surface)`) — Background of the currently-sorted column's header cell (`[aria-sort]` other than `none`). Same rationale as `--lr-table-row-selected-bg`: `::part(header-cell)[aria-sort]` is invalid CSS, so this token is the supported way to recolor the sorted header without hijacking a library-wide token."
@@ -33273,6 +33509,10 @@
33273
33509
  "name": "--lr-timeline-active-ring-color",
33274
33510
  "description": "**`<lr-timeline-item>`** (default: `var(--lr-timeline-marker-color)`) — Static outline color for the current/in-progress marker. The outline remains visible when reduced motion disables the optional pulse animation."
33275
33511
  },
33512
+ {
33513
+ "name": "--lr-timeline-collision-offset",
33514
+ "description": "**`<lr-timeline>`** (default: `var(--lr-space-l)`) — Cross-axis step between items stacked by `collision=\"stack\"`. Each collision lane is indented one step further, so a wider marker can claim more room without the lanes overlapping again. Ignored unless both `scale=\"time\"` and `collision=\"stack\"` are set."
33515
+ },
33276
33516
  {
33277
33517
  "name": "--lr-timeline-gap",
33278
33518
  "description": "**`<lr-timeline>`** (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."
@@ -33293,6 +33533,10 @@
33293
33533
  "name": "--lr-timeline-rail-width",
33294
33534
  "description": "**`<lr-timeline-item>`** (default: `var(--lr-border-width-medium)`) — Thickness of the connecting rail line. Inherits from theme ancestors."
33295
33535
  },
33536
+ {
33537
+ "name": "--lr-timeline-time-extent",
33538
+ "description": "**`<lr-timeline>`** (default: `var(--lr-size-20rem)`) — Distance the `scale=\"time\"` axis distributes items along: `block-size` when vertical, `inline-size` when horizontal. Time-scaled items are absolutely positioned, and a percentage offset against an auto-sized track resolves to zero, so the axis needs a definite extent. Ignored in the default `scale=\"flow\"`."
33539
+ },
33296
33540
  {
33297
33541
  "name": "--lr-toast-accent-color",
33298
33542
  "description": "**`<lr-toast>`** (default: `var(--lr-color-border)`) — Accent bar / icon color of a slotted item. Its private default follows `variant`; an inherited or direct public value wins.\n\n**`<lr-toast-item>`** (default: `var(--lr-color-border)`) — Color of the accent bar and the icon. Its private default follows each non-neutral `variant`'s loud fill from the shared semantic grid; `neutral` keeps the plain border color, so an informational toast reads as unaccented. An inherited or direct public value remains authoritative."
@@ -33863,7 +34107,7 @@
33863
34107
  },
33864
34108
  {
33865
34109
  "name": "--lr-widget-backdrop-inset",
33866
- "description": "**`<lr-widget>`** (default: `0`) — 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. `fullscreen-inset` overrides the safe-area panel inset while the viewport-filling backdrop stays at zero by default. `compact` tightens header/body padding — same convention as `lr-empty`."
34110
+ "description": "**`<lr-widget>`** (default: `0`) — 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."
33867
34111
  },
33868
34112
  {
33869
34113
  "name": "--lr-widget-fullscreen-inset",