@aceshooting/lyra-ui 2.11.0 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (651) hide show
  1. package/README.md +31 -2
  2. package/custom-elements.json +38146 -19163
  3. package/dist/components/app-rail/app-rail.class.d.ts.map +1 -1
  4. package/dist/components/app-rail/app-rail.class.js +2 -1
  5. package/dist/components/app-rail/app-rail.class.js.map +1 -1
  6. package/dist/components/attachment-chip/attachment-chip.class.d.ts +16 -22
  7. package/dist/components/attachment-chip/attachment-chip.class.d.ts.map +1 -1
  8. package/dist/components/attachment-chip/attachment-chip.class.js +37 -42
  9. package/dist/components/attachment-chip/attachment-chip.class.js.map +1 -1
  10. package/dist/components/attachment-chip/attachment-chip.styles.d.ts.map +1 -1
  11. package/dist/components/attachment-chip/attachment-chip.styles.js +3 -2
  12. package/dist/components/attachment-chip/attachment-chip.styles.js.map +1 -1
  13. package/dist/components/avatar/avatar.class.d.ts +4 -3
  14. package/dist/components/avatar/avatar.class.d.ts.map +1 -1
  15. package/dist/components/avatar/avatar.class.js +12 -6
  16. package/dist/components/avatar/avatar.class.js.map +1 -1
  17. package/dist/components/badge/badge.class.d.ts +21 -0
  18. package/dist/components/badge/badge.class.d.ts.map +1 -0
  19. package/dist/components/badge/badge.class.js +29 -0
  20. package/dist/components/badge/badge.class.js.map +1 -0
  21. package/dist/components/badge/badge.d.ts +2 -0
  22. package/dist/components/badge/badge.d.ts.map +1 -0
  23. package/dist/components/badge/badge.js +5 -0
  24. package/dist/components/badge/badge.js.map +1 -0
  25. package/dist/components/badge/badge.styles.d.ts +2 -0
  26. package/dist/components/badge/badge.styles.d.ts.map +1 -0
  27. package/dist/components/badge/badge.styles.js +10 -0
  28. package/dist/components/badge/badge.styles.js.map +1 -0
  29. package/dist/components/badge/tag.class.d.ts +10 -0
  30. package/dist/components/badge/tag.class.d.ts.map +1 -0
  31. package/dist/components/badge/tag.class.js +5 -0
  32. package/dist/components/badge/tag.class.js.map +1 -0
  33. package/dist/components/badge/tag.d.ts +2 -0
  34. package/dist/components/badge/tag.d.ts.map +1 -0
  35. package/dist/components/badge/tag.js +5 -0
  36. package/dist/components/badge/tag.js.map +1 -0
  37. package/dist/components/breadcrumb/breadcrumb-item.class.d.ts +22 -0
  38. package/dist/components/breadcrumb/breadcrumb-item.class.d.ts.map +1 -0
  39. package/dist/components/breadcrumb/breadcrumb-item.class.js +40 -0
  40. package/dist/components/breadcrumb/breadcrumb-item.class.js.map +1 -0
  41. package/dist/components/breadcrumb/breadcrumb-item.d.ts +2 -0
  42. package/dist/components/breadcrumb/breadcrumb-item.d.ts.map +1 -0
  43. package/dist/components/breadcrumb/breadcrumb-item.js +5 -0
  44. package/dist/components/breadcrumb/breadcrumb-item.js.map +1 -0
  45. package/dist/components/breadcrumb/breadcrumb.class.d.ts +20 -0
  46. package/dist/components/breadcrumb/breadcrumb.class.d.ts.map +1 -0
  47. package/dist/components/breadcrumb/breadcrumb.class.js +29 -0
  48. package/dist/components/breadcrumb/breadcrumb.class.js.map +1 -0
  49. package/dist/components/breadcrumb/breadcrumb.d.ts +2 -0
  50. package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -0
  51. package/dist/components/breadcrumb/breadcrumb.js +5 -0
  52. package/dist/components/breadcrumb/breadcrumb.js.map +1 -0
  53. package/dist/components/breadcrumb/breadcrumb.styles.d.ts +2 -0
  54. package/dist/components/breadcrumb/breadcrumb.styles.d.ts.map +1 -0
  55. package/dist/components/breadcrumb/breadcrumb.styles.js +8 -0
  56. package/dist/components/breadcrumb/breadcrumb.styles.js.map +1 -0
  57. package/dist/components/button/button.class.d.ts +8 -1
  58. package/dist/components/button/button.class.d.ts.map +1 -1
  59. package/dist/components/button/button.class.js +14 -2
  60. package/dist/components/button/button.class.js.map +1 -1
  61. package/dist/components/button/button.styles.d.ts.map +1 -1
  62. package/dist/components/button/button.styles.js +34 -0
  63. package/dist/components/button/button.styles.js.map +1 -1
  64. package/dist/components/button-group/button-group.class.d.ts +25 -0
  65. package/dist/components/button-group/button-group.class.d.ts.map +1 -0
  66. package/dist/components/button-group/button-group.class.js +39 -0
  67. package/dist/components/button-group/button-group.class.js.map +1 -0
  68. package/dist/components/button-group/button-group.d.ts +2 -0
  69. package/dist/components/button-group/button-group.d.ts.map +1 -0
  70. package/dist/components/button-group/button-group.js +5 -0
  71. package/dist/components/button-group/button-group.js.map +1 -0
  72. package/dist/components/button-group/button-group.styles.d.ts +2 -0
  73. package/dist/components/button-group/button-group.styles.d.ts.map +1 -0
  74. package/dist/components/button-group/button-group.styles.js +33 -0
  75. package/dist/components/button-group/button-group.styles.js.map +1 -0
  76. package/dist/components/callout/callout.class.d.ts +39 -0
  77. package/dist/components/callout/callout.class.d.ts.map +1 -0
  78. package/dist/components/callout/callout.class.js +85 -0
  79. package/dist/components/callout/callout.class.js.map +1 -0
  80. package/dist/components/callout/callout.d.ts +2 -0
  81. package/dist/components/callout/callout.d.ts.map +1 -0
  82. package/dist/components/callout/callout.js +5 -0
  83. package/dist/components/callout/callout.js.map +1 -0
  84. package/dist/components/callout/callout.styles.d.ts +2 -0
  85. package/dist/components/callout/callout.styles.d.ts.map +1 -0
  86. package/dist/components/callout/callout.styles.js +16 -0
  87. package/dist/components/callout/callout.styles.js.map +1 -0
  88. package/dist/components/card/card.class.d.ts +3 -0
  89. package/dist/components/card/card.class.d.ts.map +1 -1
  90. package/dist/components/card/card.class.js +3 -0
  91. package/dist/components/card/card.class.js.map +1 -1
  92. package/dist/components/card/card.styles.d.ts.map +1 -1
  93. package/dist/components/card/card.styles.js +7 -0
  94. package/dist/components/card/card.styles.js.map +1 -1
  95. package/dist/components/carousel/carousel-item.class.d.ts +21 -0
  96. package/dist/components/carousel/carousel-item.class.d.ts.map +1 -0
  97. package/dist/components/carousel/carousel-item.class.js +19 -0
  98. package/dist/components/carousel/carousel-item.class.js.map +1 -0
  99. package/dist/components/carousel/carousel-item.d.ts +2 -0
  100. package/dist/components/carousel/carousel-item.d.ts.map +1 -0
  101. package/dist/components/carousel/carousel-item.js +5 -0
  102. package/dist/components/carousel/carousel-item.js.map +1 -0
  103. package/dist/components/carousel/carousel-item.styles.d.ts +2 -0
  104. package/dist/components/carousel/carousel-item.styles.d.ts.map +1 -0
  105. package/dist/components/carousel/carousel-item.styles.js +12 -0
  106. package/dist/components/carousel/carousel-item.styles.js.map +1 -0
  107. package/dist/components/carousel/carousel.class.d.ts +61 -0
  108. package/dist/components/carousel/carousel.class.d.ts.map +1 -0
  109. package/dist/components/carousel/carousel.class.js +223 -0
  110. package/dist/components/carousel/carousel.class.js.map +1 -0
  111. package/dist/components/carousel/carousel.d.ts +3 -0
  112. package/dist/components/carousel/carousel.d.ts.map +1 -0
  113. package/dist/components/carousel/carousel.js +5 -0
  114. package/dist/components/carousel/carousel.js.map +1 -0
  115. package/dist/components/carousel/carousel.styles.d.ts +2 -0
  116. package/dist/components/carousel/carousel.styles.d.ts.map +1 -0
  117. package/dist/components/carousel/carousel.styles.js +81 -0
  118. package/dist/components/carousel/carousel.styles.js.map +1 -0
  119. package/dist/components/chart/box-plot.class.d.ts +4 -1
  120. package/dist/components/chart/box-plot.class.d.ts.map +1 -1
  121. package/dist/components/chart/box-plot.class.js +28 -8
  122. package/dist/components/chart/box-plot.class.js.map +1 -1
  123. package/dist/components/chart/box-plot.styles.d.ts.map +1 -1
  124. package/dist/components/chart/box-plot.styles.js +2 -0
  125. package/dist/components/chart/box-plot.styles.js.map +1 -1
  126. package/dist/components/chart/chart.class.d.ts +3 -1
  127. package/dist/components/chart/chart.class.d.ts.map +1 -1
  128. package/dist/components/chart/chart.class.js +17 -6
  129. package/dist/components/chart/chart.class.js.map +1 -1
  130. package/dist/components/chart/chart.styles.d.ts.map +1 -1
  131. package/dist/components/chart/chart.styles.js +2 -0
  132. package/dist/components/chart/chart.styles.js.map +1 -1
  133. package/dist/components/chart/histogram.class.d.ts +2 -0
  134. package/dist/components/chart/histogram.class.d.ts.map +1 -1
  135. package/dist/components/chart/histogram.class.js +6 -0
  136. package/dist/components/chart/histogram.class.js.map +1 -1
  137. package/dist/components/chart/lite-chart.class.d.ts +5 -5
  138. package/dist/components/chart/lite-chart.class.d.ts.map +1 -1
  139. package/dist/components/chart/lite-chart.class.js +35 -9
  140. package/dist/components/chart/lite-chart.class.js.map +1 -1
  141. package/dist/components/chart/lite-chart.styles.d.ts.map +1 -1
  142. package/dist/components/chart/lite-chart.styles.js +5 -0
  143. package/dist/components/chart/lite-chart.styles.js.map +1 -1
  144. package/dist/components/chat-composer/chat-composer.class.d.ts +28 -3
  145. package/dist/components/chat-composer/chat-composer.class.d.ts.map +1 -1
  146. package/dist/components/chat-composer/chat-composer.class.js +82 -4
  147. package/dist/components/chat-composer/chat-composer.class.js.map +1 -1
  148. package/dist/components/chat-message/chat-message.class.d.ts +3 -0
  149. package/dist/components/chat-message/chat-message.class.d.ts.map +1 -1
  150. package/dist/components/chat-message/chat-message.class.js +8 -6
  151. package/dist/components/chat-message/chat-message.class.js.map +1 -1
  152. package/dist/components/chat-message/chat-message.styles.d.ts.map +1 -1
  153. package/dist/components/chat-message/chat-message.styles.js +2 -1
  154. package/dist/components/chat-message/chat-message.styles.js.map +1 -1
  155. package/dist/components/checkbox/checkbox.class.d.ts +15 -2
  156. package/dist/components/checkbox/checkbox.class.d.ts.map +1 -1
  157. package/dist/components/checkbox/checkbox.class.js +28 -8
  158. package/dist/components/checkbox/checkbox.class.js.map +1 -1
  159. package/dist/components/chip/chip-group.class.d.ts +3 -3
  160. package/dist/components/chip/chip-group.class.d.ts.map +1 -1
  161. package/dist/components/chip/chip-group.class.js +3 -1
  162. package/dist/components/chip/chip-group.class.js.map +1 -1
  163. package/dist/components/citation-badge/citation-badge.class.d.ts +4 -1
  164. package/dist/components/citation-badge/citation-badge.class.d.ts.map +1 -1
  165. package/dist/components/citation-badge/citation-badge.class.js +8 -3
  166. package/dist/components/citation-badge/citation-badge.class.js.map +1 -1
  167. package/dist/components/code-block/code-block-core.class.d.ts +7 -1
  168. package/dist/components/code-block/code-block-core.class.d.ts.map +1 -1
  169. package/dist/components/code-block/code-block-core.class.js +11 -2
  170. package/dist/components/code-block/code-block-core.class.js.map +1 -1
  171. package/dist/components/code-block/code-block.class.d.ts +9 -0
  172. package/dist/components/code-block/code-block.class.d.ts.map +1 -1
  173. package/dist/components/code-block/code-block.class.js +13 -1
  174. package/dist/components/code-block/code-block.class.js.map +1 -1
  175. package/dist/components/color-picker/color-picker.class.d.ts +46 -0
  176. package/dist/components/color-picker/color-picker.class.d.ts.map +1 -0
  177. package/dist/components/color-picker/color-picker.class.js +81 -0
  178. package/dist/components/color-picker/color-picker.class.js.map +1 -0
  179. package/dist/components/color-picker/color-picker.d.ts +2 -0
  180. package/dist/components/color-picker/color-picker.d.ts.map +1 -0
  181. package/dist/components/color-picker/color-picker.js +5 -0
  182. package/dist/components/color-picker/color-picker.js.map +1 -0
  183. package/dist/components/color-picker/color-picker.styles.d.ts +2 -0
  184. package/dist/components/color-picker/color-picker.styles.d.ts.map +1 -0
  185. package/dist/components/color-picker/color-picker.styles.js +9 -0
  186. package/dist/components/color-picker/color-picker.styles.js.map +1 -0
  187. package/dist/components/combobox/combobox.class.d.ts +36 -0
  188. package/dist/components/combobox/combobox.class.d.ts.map +1 -1
  189. package/dist/components/combobox/combobox.class.js +111 -4
  190. package/dist/components/combobox/combobox.class.js.map +1 -1
  191. package/dist/components/combobox/option.class.d.ts.map +1 -1
  192. package/dist/components/combobox/option.class.js +3 -9
  193. package/dist/components/combobox/option.class.js.map +1 -1
  194. package/dist/components/combobox/option.styles.d.ts +2 -0
  195. package/dist/components/combobox/option.styles.d.ts.map +1 -0
  196. package/dist/components/combobox/option.styles.js +7 -0
  197. package/dist/components/combobox/option.styles.js.map +1 -0
  198. package/dist/components/context-meter/context-meter.class.d.ts +2 -0
  199. package/dist/components/context-meter/context-meter.class.d.ts.map +1 -1
  200. package/dist/components/context-meter/context-meter.class.js +18 -7
  201. package/dist/components/context-meter/context-meter.class.js.map +1 -1
  202. package/dist/components/context-meter/context-meter.styles.d.ts.map +1 -1
  203. package/dist/components/context-meter/context-meter.styles.js +3 -0
  204. package/dist/components/context-meter/context-meter.styles.js.map +1 -1
  205. package/dist/components/conversation-item/conversation-item.class.d.ts +5 -4
  206. package/dist/components/conversation-item/conversation-item.class.d.ts.map +1 -1
  207. package/dist/components/conversation-item/conversation-item.class.js +2 -0
  208. package/dist/components/conversation-item/conversation-item.class.js.map +1 -1
  209. package/dist/components/copy-button/copy-button.class.d.ts +10 -0
  210. package/dist/components/copy-button/copy-button.class.d.ts.map +1 -1
  211. package/dist/components/copy-button/copy-button.class.js +35 -4
  212. package/dist/components/copy-button/copy-button.class.js.map +1 -1
  213. package/dist/components/copy-button/copy-button.styles.d.ts.map +1 -1
  214. package/dist/components/copy-button/copy-button.styles.js +5 -1
  215. package/dist/components/copy-button/copy-button.styles.js.map +1 -1
  216. package/dist/components/date-picker/date-input.styles.d.ts.map +1 -1
  217. package/dist/components/date-picker/date-input.styles.js +4 -0
  218. package/dist/components/date-picker/date-input.styles.js.map +1 -1
  219. package/dist/components/details/accordion-item.class.d.ts +10 -0
  220. package/dist/components/details/accordion-item.class.d.ts.map +1 -0
  221. package/dist/components/details/accordion-item.class.js +5 -0
  222. package/dist/components/details/accordion-item.class.js.map +1 -0
  223. package/dist/components/details/accordion-item.d.ts +2 -0
  224. package/dist/components/details/accordion-item.d.ts.map +1 -0
  225. package/dist/components/details/accordion-item.js +5 -0
  226. package/dist/components/details/accordion-item.js.map +1 -0
  227. package/dist/components/details/accordion.class.d.ts +23 -0
  228. package/dist/components/details/accordion.class.d.ts.map +1 -0
  229. package/dist/components/details/accordion.class.js +48 -0
  230. package/dist/components/details/accordion.class.js.map +1 -0
  231. package/dist/components/details/accordion.d.ts +2 -0
  232. package/dist/components/details/accordion.d.ts.map +1 -0
  233. package/dist/components/details/accordion.js +5 -0
  234. package/dist/components/details/accordion.js.map +1 -0
  235. package/dist/components/details/details.class.d.ts +33 -0
  236. package/dist/components/details/details.class.d.ts.map +1 -0
  237. package/dist/components/details/details.class.js +63 -0
  238. package/dist/components/details/details.class.js.map +1 -0
  239. package/dist/components/details/details.d.ts +2 -0
  240. package/dist/components/details/details.d.ts.map +1 -0
  241. package/dist/components/details/details.js +5 -0
  242. package/dist/components/details/details.js.map +1 -0
  243. package/dist/components/details/details.styles.d.ts +2 -0
  244. package/dist/components/details/details.styles.d.ts.map +1 -0
  245. package/dist/components/details/details.styles.js +13 -0
  246. package/dist/components/details/details.styles.js.map +1 -0
  247. package/dist/components/diff-view/diff-view.styles.d.ts.map +1 -1
  248. package/dist/components/diff-view/diff-view.styles.js +3 -0
  249. package/dist/components/diff-view/diff-view.styles.js.map +1 -1
  250. package/dist/components/divider/divider.class.d.ts +20 -0
  251. package/dist/components/divider/divider.class.d.ts.map +1 -0
  252. package/dist/components/divider/divider.class.js +28 -0
  253. package/dist/components/divider/divider.class.js.map +1 -0
  254. package/dist/components/divider/divider.d.ts +2 -0
  255. package/dist/components/divider/divider.d.ts.map +1 -0
  256. package/dist/components/divider/divider.js +5 -0
  257. package/dist/components/divider/divider.js.map +1 -0
  258. package/dist/components/divider/divider.styles.d.ts +2 -0
  259. package/dist/components/divider/divider.styles.d.ts.map +1 -0
  260. package/dist/components/divider/divider.styles.js +8 -0
  261. package/dist/components/divider/divider.styles.js.map +1 -0
  262. package/dist/components/document-preview/document-preview.class.d.ts +14 -2
  263. package/dist/components/document-preview/document-preview.class.d.ts.map +1 -1
  264. package/dist/components/document-preview/document-preview.class.js +45 -6
  265. package/dist/components/document-preview/document-preview.class.js.map +1 -1
  266. package/dist/components/document-preview/document-preview.styles.js +1 -1
  267. package/dist/components/drawer/drawer.class.d.ts +26 -0
  268. package/dist/components/drawer/drawer.class.d.ts.map +1 -0
  269. package/dist/components/drawer/drawer.class.js +34 -0
  270. package/dist/components/drawer/drawer.class.js.map +1 -0
  271. package/dist/components/drawer/drawer.d.ts +3 -0
  272. package/dist/components/drawer/drawer.d.ts.map +1 -0
  273. package/dist/components/drawer/drawer.js +5 -0
  274. package/dist/components/drawer/drawer.js.map +1 -0
  275. package/dist/components/drawer/drawer.styles.d.ts +2 -0
  276. package/dist/components/drawer/drawer.styles.d.ts.map +1 -0
  277. package/dist/components/drawer/drawer.styles.js +73 -0
  278. package/dist/components/drawer/drawer.styles.js.map +1 -0
  279. package/dist/components/export-button/export-button.class.d.ts +9 -2
  280. package/dist/components/export-button/export-button.class.d.ts.map +1 -1
  281. package/dist/components/export-button/export-button.class.js +21 -3
  282. package/dist/components/export-button/export-button.class.js.map +1 -1
  283. package/dist/components/export-button/export-button.styles.d.ts.map +1 -1
  284. package/dist/components/export-button/export-button.styles.js +21 -2
  285. package/dist/components/export-button/export-button.styles.js.map +1 -1
  286. package/dist/components/file-input/file-input.class.d.ts +9 -3
  287. package/dist/components/file-input/file-input.class.d.ts.map +1 -1
  288. package/dist/components/file-input/file-input.class.js +23 -8
  289. package/dist/components/file-input/file-input.class.js.map +1 -1
  290. package/dist/components/flag/flag.class.d.ts +7 -1
  291. package/dist/components/flag/flag.class.d.ts.map +1 -1
  292. package/dist/components/flag/flag.class.js +11 -3
  293. package/dist/components/flag/flag.class.js.map +1 -1
  294. package/dist/components/flag/flag.styles.js +2 -2
  295. package/dist/components/format/format-bytes.class.d.ts +21 -0
  296. package/dist/components/format/format-bytes.class.d.ts.map +1 -0
  297. package/dist/components/format/format-bytes.class.js +46 -0
  298. package/dist/components/format/format-bytes.class.js.map +1 -0
  299. package/dist/components/format/format-bytes.d.ts +2 -0
  300. package/dist/components/format/format-bytes.d.ts.map +1 -0
  301. package/dist/components/format/format-bytes.js +5 -0
  302. package/dist/components/format/format-bytes.js.map +1 -0
  303. package/dist/components/format/format-date.class.d.ts +25 -0
  304. package/dist/components/format/format-date.class.d.ts.map +1 -0
  305. package/dist/components/format/format-date.class.js +59 -0
  306. package/dist/components/format/format-date.class.js.map +1 -0
  307. package/dist/components/format/format-date.d.ts +2 -0
  308. package/dist/components/format/format-date.d.ts.map +1 -0
  309. package/dist/components/format/format-date.js +5 -0
  310. package/dist/components/format/format-date.js.map +1 -0
  311. package/dist/components/format/format-number.class.d.ts +24 -0
  312. package/dist/components/format/format-number.class.d.ts.map +1 -0
  313. package/dist/components/format/format-number.class.js +58 -0
  314. package/dist/components/format/format-number.class.js.map +1 -0
  315. package/dist/components/format/format-number.d.ts +2 -0
  316. package/dist/components/format/format-number.d.ts.map +1 -0
  317. package/dist/components/format/format-number.js +5 -0
  318. package/dist/components/format/format-number.js.map +1 -0
  319. package/dist/components/format/format.styles.d.ts +2 -0
  320. package/dist/components/format/format.styles.d.ts.map +1 -0
  321. package/dist/components/format/format.styles.js +3 -0
  322. package/dist/components/format/format.styles.js.map +1 -0
  323. package/dist/components/format/relative-time.class.d.ts +29 -0
  324. package/dist/components/format/relative-time.class.d.ts.map +1 -0
  325. package/dist/components/format/relative-time.class.js +62 -0
  326. package/dist/components/format/relative-time.class.js.map +1 -0
  327. package/dist/components/format/relative-time.d.ts +2 -0
  328. package/dist/components/format/relative-time.d.ts.map +1 -0
  329. package/dist/components/format/relative-time.js +5 -0
  330. package/dist/components/format/relative-time.js.map +1 -0
  331. package/dist/components/generation-status/generation-status.class.d.ts.map +1 -1
  332. package/dist/components/generation-status/generation-status.class.js +35 -27
  333. package/dist/components/generation-status/generation-status.class.js.map +1 -1
  334. package/dist/components/graph/graph.class.d.ts +1 -0
  335. package/dist/components/graph/graph.class.d.ts.map +1 -1
  336. package/dist/components/graph/graph.class.js +11 -3
  337. package/dist/components/graph/graph.class.js.map +1 -1
  338. package/dist/components/heatmap/calendar-grid.d.ts +7 -1
  339. package/dist/components/heatmap/calendar-grid.d.ts.map +1 -1
  340. package/dist/components/heatmap/calendar-grid.js +9 -2
  341. package/dist/components/heatmap/calendar-grid.js.map +1 -1
  342. package/dist/components/heatmap/heatmap.class.d.ts +9 -0
  343. package/dist/components/heatmap/heatmap.class.d.ts.map +1 -1
  344. package/dist/components/heatmap/heatmap.class.js +33 -12
  345. package/dist/components/heatmap/heatmap.class.js.map +1 -1
  346. package/dist/components/heatmap/heatmap.styles.d.ts.map +1 -1
  347. package/dist/components/heatmap/heatmap.styles.js +6 -0
  348. package/dist/components/heatmap/heatmap.styles.js.map +1 -1
  349. package/dist/components/image-comparer/image-comparer.class.d.ts +43 -0
  350. package/dist/components/image-comparer/image-comparer.class.d.ts.map +1 -0
  351. package/dist/components/image-comparer/image-comparer.class.js +92 -0
  352. package/dist/components/image-comparer/image-comparer.class.js.map +1 -0
  353. package/dist/components/image-comparer/image-comparer.d.ts +3 -0
  354. package/dist/components/image-comparer/image-comparer.d.ts.map +1 -0
  355. package/dist/components/image-comparer/image-comparer.js +5 -0
  356. package/dist/components/image-comparer/image-comparer.js.map +1 -0
  357. package/dist/components/image-comparer/image-comparer.styles.d.ts +2 -0
  358. package/dist/components/image-comparer/image-comparer.styles.d.ts.map +1 -0
  359. package/dist/components/image-comparer/image-comparer.styles.js +70 -0
  360. package/dist/components/image-comparer/image-comparer.styles.js.map +1 -0
  361. package/dist/components/input/input.class.d.ts +12 -3
  362. package/dist/components/input/input.class.d.ts.map +1 -1
  363. package/dist/components/input/input.class.js +35 -2
  364. package/dist/components/input/input.class.js.map +1 -1
  365. package/dist/components/input/input.styles.d.ts.map +1 -1
  366. package/dist/components/input/input.styles.js +3 -0
  367. package/dist/components/input/input.styles.js.map +1 -1
  368. package/dist/components/input/number-input.class.d.ts +17 -0
  369. package/dist/components/input/number-input.class.d.ts.map +1 -0
  370. package/dist/components/input/number-input.class.js +18 -0
  371. package/dist/components/input/number-input.class.js.map +1 -0
  372. package/dist/components/input/number-input.d.ts +2 -0
  373. package/dist/components/input/number-input.d.ts.map +1 -0
  374. package/dist/components/input/number-input.js +5 -0
  375. package/dist/components/input/number-input.js.map +1 -0
  376. package/dist/components/input/time-input.class.d.ts +16 -0
  377. package/dist/components/input/time-input.class.d.ts.map +1 -0
  378. package/dist/components/input/time-input.class.js +17 -0
  379. package/dist/components/input/time-input.class.js.map +1 -0
  380. package/dist/components/input/time-input.d.ts +2 -0
  381. package/dist/components/input/time-input.d.ts.map +1 -0
  382. package/dist/components/input/time-input.js +5 -0
  383. package/dist/components/input/time-input.js.map +1 -0
  384. package/dist/components/intersection-observer/intersection-observer.class.d.ts +37 -0
  385. package/dist/components/intersection-observer/intersection-observer.class.d.ts.map +1 -0
  386. package/dist/components/intersection-observer/intersection-observer.class.js +77 -0
  387. package/dist/components/intersection-observer/intersection-observer.class.js.map +1 -0
  388. package/dist/components/intersection-observer/intersection-observer.d.ts +2 -0
  389. package/dist/components/intersection-observer/intersection-observer.d.ts.map +1 -0
  390. package/dist/components/intersection-observer/intersection-observer.js +5 -0
  391. package/dist/components/intersection-observer/intersection-observer.js.map +1 -0
  392. package/dist/components/intersection-observer/intersection-observer.styles.d.ts +2 -0
  393. package/dist/components/intersection-observer/intersection-observer.styles.d.ts.map +1 -0
  394. package/dist/components/intersection-observer/intersection-observer.styles.js +8 -0
  395. package/dist/components/intersection-observer/intersection-observer.styles.js.map +1 -0
  396. package/dist/components/json-viewer/json-viewer.class.js +1 -1
  397. package/dist/components/json-viewer/json-viewer.class.js.map +1 -1
  398. package/dist/components/json-viewer/json-viewer.styles.d.ts.map +1 -1
  399. package/dist/components/json-viewer/json-viewer.styles.js +7 -0
  400. package/dist/components/json-viewer/json-viewer.styles.js.map +1 -1
  401. package/dist/components/map/map.class.d.ts +3 -5
  402. package/dist/components/map/map.class.d.ts.map +1 -1
  403. package/dist/components/map/map.class.js +8 -6
  404. package/dist/components/map/map.class.js.map +1 -1
  405. package/dist/components/markdown/markdown.class.d.ts +5 -5
  406. package/dist/components/markdown/markdown.class.d.ts.map +1 -1
  407. package/dist/components/markdown/markdown.class.js +6 -6
  408. package/dist/components/markdown/markdown.class.js.map +1 -1
  409. package/dist/components/markdown/markdown.styles.d.ts.map +1 -1
  410. package/dist/components/markdown/markdown.styles.js +11 -4
  411. package/dist/components/markdown/markdown.styles.js.map +1 -1
  412. package/dist/components/media-card/media-card.class.d.ts +12 -1
  413. package/dist/components/media-card/media-card.class.d.ts.map +1 -1
  414. package/dist/components/media-card/media-card.class.js +27 -7
  415. package/dist/components/media-card/media-card.class.js.map +1 -1
  416. package/dist/components/mention-popover/mention-popover.styles.d.ts.map +1 -1
  417. package/dist/components/mention-popover/mention-popover.styles.js +2 -0
  418. package/dist/components/mention-popover/mention-popover.styles.js.map +1 -1
  419. package/dist/components/menu/dropdown-item.class.d.ts +18 -0
  420. package/dist/components/menu/dropdown-item.class.d.ts.map +1 -0
  421. package/dist/components/menu/dropdown-item.class.js +13 -0
  422. package/dist/components/menu/dropdown-item.class.js.map +1 -0
  423. package/dist/components/menu/dropdown-item.d.ts +2 -0
  424. package/dist/components/menu/dropdown-item.d.ts.map +1 -0
  425. package/dist/components/menu/dropdown-item.js +5 -0
  426. package/dist/components/menu/dropdown-item.js.map +1 -0
  427. package/dist/components/mutation-observer/mutation-observer.class.d.ts +40 -0
  428. package/dist/components/mutation-observer/mutation-observer.class.d.ts.map +1 -0
  429. package/dist/components/mutation-observer/mutation-observer.class.js +96 -0
  430. package/dist/components/mutation-observer/mutation-observer.class.js.map +1 -0
  431. package/dist/components/mutation-observer/mutation-observer.d.ts +2 -0
  432. package/dist/components/mutation-observer/mutation-observer.d.ts.map +1 -0
  433. package/dist/components/mutation-observer/mutation-observer.js +5 -0
  434. package/dist/components/mutation-observer/mutation-observer.js.map +1 -0
  435. package/dist/components/mutation-observer/mutation-observer.styles.d.ts +2 -0
  436. package/dist/components/mutation-observer/mutation-observer.styles.d.ts.map +1 -0
  437. package/dist/components/mutation-observer/mutation-observer.styles.js +8 -0
  438. package/dist/components/mutation-observer/mutation-observer.styles.js.map +1 -0
  439. package/dist/components/overlay/dropdown.class.d.ts +21 -0
  440. package/dist/components/overlay/dropdown.class.d.ts.map +1 -0
  441. package/dist/components/overlay/dropdown.class.js +18 -0
  442. package/dist/components/overlay/dropdown.class.js.map +1 -0
  443. package/dist/components/overlay/dropdown.d.ts +2 -0
  444. package/dist/components/overlay/dropdown.d.ts.map +1 -0
  445. package/dist/components/overlay/dropdown.js +5 -0
  446. package/dist/components/overlay/dropdown.js.map +1 -0
  447. package/dist/components/overlay/overlay.styles.d.ts +3 -0
  448. package/dist/components/overlay/overlay.styles.d.ts.map +1 -0
  449. package/dist/components/overlay/overlay.styles.js +29 -0
  450. package/dist/components/overlay/overlay.styles.js.map +1 -0
  451. package/dist/components/overlay/popover.class.d.ts +48 -0
  452. package/dist/components/overlay/popover.class.d.ts.map +1 -0
  453. package/dist/components/overlay/popover.class.js +132 -0
  454. package/dist/components/overlay/popover.class.js.map +1 -0
  455. package/dist/components/overlay/popover.d.ts +2 -0
  456. package/dist/components/overlay/popover.d.ts.map +1 -0
  457. package/dist/components/overlay/popover.js +5 -0
  458. package/dist/components/overlay/popover.js.map +1 -0
  459. package/dist/components/overlay/tooltip.class.d.ts +41 -0
  460. package/dist/components/overlay/tooltip.class.d.ts.map +1 -0
  461. package/dist/components/overlay/tooltip.class.js +118 -0
  462. package/dist/components/overlay/tooltip.class.js.map +1 -0
  463. package/dist/components/overlay/tooltip.d.ts +2 -0
  464. package/dist/components/overlay/tooltip.d.ts.map +1 -0
  465. package/dist/components/overlay/tooltip.js +5 -0
  466. package/dist/components/overlay/tooltip.js.map +1 -0
  467. package/dist/components/pagination/pagination.class.d.ts +11 -0
  468. package/dist/components/pagination/pagination.class.d.ts.map +1 -1
  469. package/dist/components/pagination/pagination.class.js +28 -1
  470. package/dist/components/pagination/pagination.class.js.map +1 -1
  471. package/dist/components/phone-input/phone-input.class.d.ts +16 -2
  472. package/dist/components/phone-input/phone-input.class.d.ts.map +1 -1
  473. package/dist/components/phone-input/phone-input.class.js +43 -2
  474. package/dist/components/phone-input/phone-input.class.js.map +1 -1
  475. package/dist/components/playback/playback.class.d.ts +11 -0
  476. package/dist/components/playback/playback.class.d.ts.map +1 -1
  477. package/dist/components/playback/playback.class.js +26 -1
  478. package/dist/components/playback/playback.class.js.map +1 -1
  479. package/dist/components/poll-status/poll-status.styles.d.ts.map +1 -1
  480. package/dist/components/poll-status/poll-status.styles.js +4 -0
  481. package/dist/components/poll-status/poll-status.styles.js.map +1 -1
  482. package/dist/components/progress/progress-bar.class.d.ts +30 -0
  483. package/dist/components/progress/progress-bar.class.d.ts.map +1 -0
  484. package/dist/components/progress/progress-bar.class.js +61 -0
  485. package/dist/components/progress/progress-bar.class.js.map +1 -0
  486. package/dist/components/progress/progress-bar.d.ts +2 -0
  487. package/dist/components/progress/progress-bar.d.ts.map +1 -0
  488. package/dist/components/progress/progress-bar.js +5 -0
  489. package/dist/components/progress/progress-bar.js.map +1 -0
  490. package/dist/components/progress/progress-ring.class.d.ts +27 -0
  491. package/dist/components/progress/progress-ring.class.d.ts.map +1 -0
  492. package/dist/components/progress/progress-ring.class.js +59 -0
  493. package/dist/components/progress/progress-ring.class.js.map +1 -0
  494. package/dist/components/progress/progress-ring.d.ts +2 -0
  495. package/dist/components/progress/progress-ring.d.ts.map +1 -0
  496. package/dist/components/progress/progress-ring.js +5 -0
  497. package/dist/components/progress/progress-ring.js.map +1 -0
  498. package/dist/components/progress/progress.styles.d.ts +3 -0
  499. package/dist/components/progress/progress.styles.d.ts.map +1 -0
  500. package/dist/components/progress/progress.styles.js +23 -0
  501. package/dist/components/progress/progress.styles.js.map +1 -0
  502. package/dist/components/radio/radio-group.class.d.ts +49 -0
  503. package/dist/components/radio/radio-group.class.d.ts.map +1 -0
  504. package/dist/components/radio/radio-group.class.js +137 -0
  505. package/dist/components/radio/radio-group.class.js.map +1 -0
  506. package/dist/components/radio/radio-group.d.ts +2 -0
  507. package/dist/components/radio/radio-group.d.ts.map +1 -0
  508. package/dist/components/radio/radio-group.js +5 -0
  509. package/dist/components/radio/radio-group.js.map +1 -0
  510. package/dist/components/radio/radio-group.styles.d.ts +2 -0
  511. package/dist/components/radio/radio-group.styles.d.ts.map +1 -0
  512. package/dist/components/radio/radio-group.styles.js +11 -0
  513. package/dist/components/radio/radio-group.styles.js.map +1 -0
  514. package/dist/components/radio/radio.class.d.ts +97 -0
  515. package/dist/components/radio/radio.class.d.ts.map +1 -0
  516. package/dist/components/radio/radio.class.js +159 -0
  517. package/dist/components/radio/radio.class.js.map +1 -0
  518. package/dist/components/radio/radio.d.ts +2 -0
  519. package/dist/components/radio/radio.d.ts.map +1 -0
  520. package/dist/components/radio/radio.js +5 -0
  521. package/dist/components/radio/radio.js.map +1 -0
  522. package/dist/components/radio/radio.styles.d.ts +2 -0
  523. package/dist/components/radio/radio.styles.d.ts.map +1 -0
  524. package/dist/components/radio/radio.styles.js +57 -0
  525. package/dist/components/radio/radio.styles.js.map +1 -0
  526. package/dist/components/rating/rating.class.d.ts +34 -0
  527. package/dist/components/rating/rating.class.d.ts.map +1 -0
  528. package/dist/components/rating/rating.class.js +92 -0
  529. package/dist/components/rating/rating.class.js.map +1 -0
  530. package/dist/components/rating/rating.d.ts +2 -0
  531. package/dist/components/rating/rating.d.ts.map +1 -0
  532. package/dist/components/rating/rating.js +5 -0
  533. package/dist/components/rating/rating.js.map +1 -0
  534. package/dist/components/rating/rating.styles.d.ts +2 -0
  535. package/dist/components/rating/rating.styles.d.ts.map +1 -0
  536. package/dist/components/rating/rating.styles.js +10 -0
  537. package/dist/components/rating/rating.styles.js.map +1 -0
  538. package/dist/components/resize-observer/resize-observer.class.d.ts +37 -0
  539. package/dist/components/resize-observer/resize-observer.class.d.ts.map +1 -0
  540. package/dist/components/resize-observer/resize-observer.class.js +74 -0
  541. package/dist/components/resize-observer/resize-observer.class.js.map +1 -0
  542. package/dist/components/resize-observer/resize-observer.d.ts +2 -0
  543. package/dist/components/resize-observer/resize-observer.d.ts.map +1 -0
  544. package/dist/components/resize-observer/resize-observer.js +5 -0
  545. package/dist/components/resize-observer/resize-observer.js.map +1 -0
  546. package/dist/components/resize-observer/resize-observer.styles.d.ts +2 -0
  547. package/dist/components/resize-observer/resize-observer.styles.d.ts.map +1 -0
  548. package/dist/components/resize-observer/resize-observer.styles.js +11 -0
  549. package/dist/components/resize-observer/resize-observer.styles.js.map +1 -0
  550. package/dist/components/scroller/scroller.class.d.ts +54 -0
  551. package/dist/components/scroller/scroller.class.d.ts.map +1 -0
  552. package/dist/components/scroller/scroller.class.js +138 -0
  553. package/dist/components/scroller/scroller.class.js.map +1 -0
  554. package/dist/components/scroller/scroller.d.ts +2 -0
  555. package/dist/components/scroller/scroller.d.ts.map +1 -0
  556. package/dist/components/scroller/scroller.js +5 -0
  557. package/dist/components/scroller/scroller.js.map +1 -0
  558. package/dist/components/scroller/scroller.styles.d.ts +2 -0
  559. package/dist/components/scroller/scroller.styles.d.ts.map +1 -0
  560. package/dist/components/scroller/scroller.styles.js +94 -0
  561. package/dist/components/scroller/scroller.styles.js.map +1 -0
  562. package/dist/components/segmented/segmented.styles.d.ts.map +1 -1
  563. package/dist/components/segmented/segmented.styles.js +3 -0
  564. package/dist/components/segmented/segmented.styles.js.map +1 -1
  565. package/dist/components/select/select.class.d.ts +10 -0
  566. package/dist/components/select/select.class.d.ts.map +1 -1
  567. package/dist/components/select/select.class.js +22 -2
  568. package/dist/components/select/select.class.js.map +1 -1
  569. package/dist/components/skeleton/skeleton.class.d.ts +5 -0
  570. package/dist/components/skeleton/skeleton.class.d.ts.map +1 -1
  571. package/dist/components/skeleton/skeleton.class.js +17 -2
  572. package/dist/components/skeleton/skeleton.class.js.map +1 -1
  573. package/dist/components/skeleton/skeleton.styles.js +2 -2
  574. package/dist/components/sparkline/sparkline.class.d.ts +3 -1
  575. package/dist/components/sparkline/sparkline.class.d.ts.map +1 -1
  576. package/dist/components/sparkline/sparkline.class.js +24 -8
  577. package/dist/components/sparkline/sparkline.class.js.map +1 -1
  578. package/dist/components/spinner/spinner.class.d.ts +24 -0
  579. package/dist/components/spinner/spinner.class.d.ts.map +1 -0
  580. package/dist/components/spinner/spinner.class.js +41 -0
  581. package/dist/components/spinner/spinner.class.js.map +1 -0
  582. package/dist/components/spinner/spinner.d.ts +2 -0
  583. package/dist/components/spinner/spinner.d.ts.map +1 -0
  584. package/dist/components/spinner/spinner.js +5 -0
  585. package/dist/components/spinner/spinner.js.map +1 -0
  586. package/dist/components/spinner/spinner.styles.d.ts +2 -0
  587. package/dist/components/spinner/spinner.styles.d.ts.map +1 -0
  588. package/dist/components/spinner/spinner.styles.js +17 -0
  589. package/dist/components/spinner/spinner.styles.js.map +1 -0
  590. package/dist/components/stepper/stepper.styles.d.ts.map +1 -1
  591. package/dist/components/stepper/stepper.styles.js +4 -0
  592. package/dist/components/stepper/stepper.styles.js.map +1 -1
  593. package/dist/components/table/table.class.d.ts +134 -0
  594. package/dist/components/table/table.class.d.ts.map +1 -1
  595. package/dist/components/table/table.class.js +446 -80
  596. package/dist/components/table/table.class.js.map +1 -1
  597. package/dist/components/table/table.styles.d.ts.map +1 -1
  598. package/dist/components/table/table.styles.js +95 -0
  599. package/dist/components/table/table.styles.js.map +1 -1
  600. package/dist/components/textarea/textarea.class.d.ts +6 -2
  601. package/dist/components/textarea/textarea.class.d.ts.map +1 -1
  602. package/dist/components/textarea/textarea.class.js +6 -2
  603. package/dist/components/textarea/textarea.class.js.map +1 -1
  604. package/dist/components/tool-call-chip/tool-call-chip.class.d.ts +8 -1
  605. package/dist/components/tool-call-chip/tool-call-chip.class.d.ts.map +1 -1
  606. package/dist/components/tool-call-chip/tool-call-chip.class.js +19 -16
  607. package/dist/components/tool-call-chip/tool-call-chip.class.js.map +1 -1
  608. package/dist/components/tool-call-chip/tool-call-chip.styles.d.ts.map +1 -1
  609. package/dist/components/tool-call-chip/tool-call-chip.styles.js +3 -2
  610. package/dist/components/tool-call-chip/tool-call-chip.styles.js.map +1 -1
  611. package/dist/components/tool-result-dialog/tool-result-dialog.class.d.ts +12 -1
  612. package/dist/components/tool-result-dialog/tool-result-dialog.class.d.ts.map +1 -1
  613. package/dist/components/tool-result-dialog/tool-result-dialog.class.js +25 -11
  614. package/dist/components/tool-result-dialog/tool-result-dialog.class.js.map +1 -1
  615. package/dist/components/tool-result-dialog/tool-result-dialog.styles.d.ts.map +1 -1
  616. package/dist/components/tool-result-dialog/tool-result-dialog.styles.js +3 -1
  617. package/dist/components/tool-result-dialog/tool-result-dialog.styles.js.map +1 -1
  618. package/dist/components/zoomable-frame/zoomable-frame.class.d.ts +48 -0
  619. package/dist/components/zoomable-frame/zoomable-frame.class.d.ts.map +1 -0
  620. package/dist/components/zoomable-frame/zoomable-frame.class.js +115 -0
  621. package/dist/components/zoomable-frame/zoomable-frame.class.js.map +1 -0
  622. package/dist/components/zoomable-frame/zoomable-frame.d.ts +3 -0
  623. package/dist/components/zoomable-frame/zoomable-frame.d.ts.map +1 -0
  624. package/dist/components/zoomable-frame/zoomable-frame.js +5 -0
  625. package/dist/components/zoomable-frame/zoomable-frame.js.map +1 -0
  626. package/dist/components/zoomable-frame/zoomable-frame.styles.d.ts +2 -0
  627. package/dist/components/zoomable-frame/zoomable-frame.styles.d.ts.map +1 -0
  628. package/dist/components/zoomable-frame/zoomable-frame.styles.js +77 -0
  629. package/dist/components/zoomable-frame/zoomable-frame.styles.js.map +1 -0
  630. package/dist/internal/localization.d.ts +1 -1
  631. package/dist/internal/localization.d.ts.map +1 -1
  632. package/dist/internal/localization.js +46 -0
  633. package/dist/internal/localization.js.map +1 -1
  634. package/dist/internal/root-registration-allowlist.d.ts +1 -1
  635. package/dist/internal/root-registration-allowlist.d.ts.map +1 -1
  636. package/dist/internal/root-registration-allowlist.js +36 -0
  637. package/dist/internal/root-registration-allowlist.js.map +1 -1
  638. package/dist/internal/tokens.styles.d.ts.map +1 -1
  639. package/dist/internal/tokens.styles.js +17 -0
  640. package/dist/internal/tokens.styles.js.map +1 -1
  641. package/dist/lyra.d.ts +97 -4
  642. package/dist/lyra.d.ts.map +1 -1
  643. package/dist/lyra.js +72 -0
  644. package/dist/lyra.js.map +1 -1
  645. package/dist/testing/happy-dom-shims.d.ts +5 -1
  646. package/dist/testing/happy-dom-shims.d.ts.map +1 -1
  647. package/dist/testing/happy-dom-shims.js +7 -1
  648. package/dist/testing/happy-dom-shims.js.map +1 -1
  649. package/llms-full.txt +643 -82
  650. package/llms.txt +13 -0
  651. package/package.json +73 -1
package/llms-full.txt CHANGED
@@ -206,7 +206,13 @@ shared `FormAssociated` mixin — see gotchas).
206
206
  - `errorText: string = ''` (attribute `error-text` — static error copy shown below the hint;
207
207
  overridden by slotted `error` content when provided)
208
208
  - `open: boolean = false` (reflected)
209
- - `withClear: boolean = false` (attribute **`with-clear`** not `clearable`, see gotchas)
209
+ - `clearable: boolean = false` (reflected) — displays the clear button while a value is selected
210
+ - `withClear: boolean = false` (attribute `with-clear`) — deprecated compatibility alias for
211
+ `clearable`; either property enables the same clear button
212
+ - `autocomplete: string = 'off'`, `inputMode: string = ''` (attribute `inputmode`),
213
+ `enterKeyHint: string = ''` (attribute `enterkeyhint`), `spellcheck: boolean = true`,
214
+ `autocapitalize: string = ''`, and `autoCorrect: string = ''` (attribute `autocorrect`) — native
215
+ editing-assistance attributes forwarded to the internal filter input
210
216
  - `maxOptionsVisible: number = 3` (attribute `max-options-visible` — caps how many selected tags
211
217
  show before collapsing to `+N`)
212
218
  - `emptyText: string = 'No results'` (attribute `empty-text`)
@@ -229,6 +235,11 @@ shared `FormAssociated` mixin — see gotchas).
229
235
  - `selectedRows: ComboboxSourceRow[]` (read-only getter) — structured rows for the current
230
236
  selection, including any opaque `data` payload supplied by an async source. Selected async rows
231
237
  remain available after the query changes or a later source result no longer contains them
238
+ - `selectionStart`, `selectionEnd`, and `selectionDirection` — selection getters/setters forwarded
239
+ to the internal input
240
+
241
+ **Methods:** `focus(options?)`, `blur()`, `select()`, `setSelectionRange()`, and `setRangeText()`
242
+ forward to the internal input. `setRangeText()` synchronizes the filter query and visible options.
232
243
 
233
244
  `ComboboxSourceRow = { value: string; label: string; sub?: string; icon?: unknown; badge?: string |
234
245
  number; accessibleLabel?: string; data?: unknown; dotColor?: string; group?: string; disabled?:
@@ -245,6 +256,7 @@ one bubbling/composed, non-cancelable plain `input` `Event`, immediately followe
245
256
  of `change` `Event`. Re-picking the current single value and programmatic/default/reset/restore
246
257
  writes are silent. The clear button emits one `lyra-clear` after its `input`/`change` pair.
247
258
  `lyra-show` and `lyra-hide` report listbox visibility transitions.
259
+ The internal input's `focus` and `blur` are re-dispatched as bubbling, composed host events.
248
260
 
249
261
  **Slots:** default (`<lyra-option>` children), `label`, `hint`, `error` (overrides the `errorText`
250
262
  attribute when provided)
@@ -315,9 +327,8 @@ collection, while `form.reset()` still returns to the declarative selected defau
315
327
  synchronous and fires no `input`/`change` event.
316
328
 
317
329
  **Known gotchas:**
318
- - naming drift from Web Awesome parity: the shipped attribute is **`with-clear`**, not
319
- `clearable` (which is what `<wa-combobox>` uses) — don't copy-paste WA docs assuming a 1:1
320
- attribute name here.
330
+ - `with-clear` remains supported for compatibility, but new code should use the mirrored
331
+ `clearable` property/attribute.
321
332
  - a host-level `aria-label` attribute on `<lyra-combobox>` now takes priority over `label`/
322
333
  `placeholder`/`"Combobox"` when resolving the accessible name on `[part="combobox-input"]` —
323
334
  previously it was silently ignored. Matches the same fallback on `<lyra-select>`.
@@ -716,7 +727,10 @@ shadow-internal native button doesn't participate in an ancestor form's submissi
716
727
 
717
728
  **Properties:**
718
729
  - `variant: 'neutral' | 'brand' | 'success' | 'warning' | 'danger' = 'neutral'` (reflected)
719
- - `appearance: 'filled' | 'outlined' | 'plain' = 'filled'` (reflected)
730
+ - `appearance: 'accent' | 'filled' | 'outlined' | 'plain' = 'filled'` (reflected) — `'accent'` is a
731
+ loud, high-contrast filled tier (equivalent to `wa-button`'s own runtime-default appearance),
732
+ distinct from `'filled'` for `variant="neutral"` specifically (`'filled'` reads the ambient
733
+ surface color there; `'accent'` reads a solid neutral fill)
720
734
  - `size: 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected)
721
735
  - `type: 'button' | 'submit' | 'reset' = 'button'`
722
736
  - `loading: boolean = false` (reflected) — shows an internal spinner and disables the button without
@@ -734,12 +748,18 @@ unmodified; disabled while `disabled` or `loading`).
734
748
 
735
749
  **Themeable custom properties:** `--lyra-button-accent`, `--lyra-button-fill`,
736
750
  `--lyra-button-on-fill`, `--lyra-button-border` (each swapped by the active `variant`, default
737
- `neutral` falls back to plain text/surface/border tokens).
751
+ `neutral` falls back to plain text/surface/border tokens), `--lyra-button-accent-fill`,
752
+ `--lyra-button-accent-on-fill` (the `appearance="accent"` fill/foreground pair; `neutral` falls
753
+ back to `--wa-color-neutral-fill-loud`/`-on-loud`, every other variant reuses that variant's own
754
+ loud fill token), `--lyra-button-hover-brightness` (default `1.08`, the `:hover` filter intensity),
755
+ `--lyra-button-active-scale` (default `0.9875`, the `:active` press-scale, disabled under
756
+ `prefers-reduced-motion`).
738
757
 
739
758
  **Optional peer deps:** none.
740
759
 
741
760
  ```html
742
761
  <lyra-button variant="brand" appearance="filled">Save</lyra-button>
762
+ <lyra-button variant="neutral" appearance="accent">Save</lyra-button>
743
763
  <lyra-button appearance="plain" aria-label="Close dialog"><svg slot="start">...</svg></lyra-button>
744
764
  ```
745
765
 
@@ -747,6 +767,9 @@ unmodified; disabled while `disabled` or `loading`).
747
767
  - A host `aria-label` is forwarded to the internal button as a literal string (for an icon-only
748
768
  button); an external `aria-labelledby`/`aria-describedby` idref is not copied across the shadow
749
769
  boundary.
770
+ - Is form-associated (`static formAssociated = true` + `attachInternals()`), so it participates in
771
+ an ancestor `<form>.elements` the same way `wa-button` does — a sibling text field's own
772
+ Enter-to-submit lookup (which scans `form.elements` for a `type === 'submit'` control) finds it.
750
773
 
751
774
  ---
752
775
 
@@ -767,13 +790,17 @@ form-associated via the same `FormAssociated` mixin as `lyra-textarea`. Ships th
767
790
  - `errorText: string = ''` (attribute `error-text`)
768
791
  - `accessibleLabel: string | null = null` (attribute `aria-label`)
769
792
  - `autocomplete: string = ''`
793
+ - `spellcheck: boolean = true` — forwarded to the native input, including `spellcheck="false"`
794
+ - `autocapitalize: string = ''` / `autoCorrect: string = ''`
795
+ - `inputMode: string = ''` / `enterKeyHint: string = ''`
770
796
  - `min?: number` / `max?: number` / `step?: number` (attribute: false — `type="number"` only)
771
797
  - `passwordVisible: boolean = false` (attribute `password-visible` — `type="password"` only)
772
798
  - `name`/`disabled`/`required` (from `FormAssociated`)
773
799
 
774
- **Events:** `lyra-input` (`detail: { value }`, fired on every user-driven edit), `lyra-change`
775
- (`detail: { value }`, fired on the native `change` timing), `blur`/`focus` (re-dispatched bubbling +
776
- composed from the internal native input's own `blur`/`focus`).
800
+ **Events:** native-style composed `input` and `change`, plus `lyra-input` (`detail: { value }`,
801
+ fired on every user-driven edit) and `lyra-change` (`detail: { value }`, fired on the native
802
+ `change` timing), `blur`/`focus` (re-dispatched bubbling + composed from the internal native input's
803
+ own `blur`/`focus`).
777
804
 
778
805
  **Slots:** `label`, `hint`, `error`.
779
806
 
@@ -798,6 +825,18 @@ composed from the internal native input's own `blur`/`focus`).
798
825
  `ElementInternals` — not a second hand-rolled regex check.
799
826
  - `type="password"` always renders the `password-toggle` button; there is no separate opt-out.
800
827
 
828
+ ## `lyra-number-input`
829
+
830
+ A migration-friendly numeric alias of `lyra-input`. It forces `type="number"` while retaining the
831
+ same form association, label/hint/error chrome, native editing passthrough, input/change events,
832
+ and `min`/`max`/`step` validation. It exposes the same properties, slots, events, and CSS parts as
833
+ `lyra-input`.
834
+
835
+ ## `lyra-time-input`
836
+
837
+ A migration-friendly time alias of `lyra-input`. It forces the native `type="time"` while retaining
838
+ the same form association, chrome, native editing passthrough, events, slots, and CSS parts.
839
+
801
840
  ---
802
841
 
803
842
  ## `lyra-phone-input`
@@ -851,8 +890,9 @@ interface PhoneNumberAdapter {
851
890
  - `label: string = ''`, `hint: string = ''`, `errorText: string = ''` (attribute `error-text`) —
852
891
  visible form-field chrome; each has a matching named slot.
853
892
  - `placeholder: string = ''` — forwarded to the native telephone input.
854
- - host `aria-label` — forwarded to the internal telephone input. Name precedence is `phoneLabel`,
855
- host `aria-label`, visible `label`, then `placeholder`.
893
+ - `accessibleLabel: string | null = null` (attribute `aria-label`) — forwarded to the internal
894
+ telephone input. Name precedence is host `aria-label`, `phoneLabel`, visible `label`, then
895
+ `placeholder`.
856
896
  - `phoneLabel: string = ''` (attribute `phone-label`) — explicit accessible-name override for the
857
897
  native telephone input.
858
898
  - `countryLabel: string = 'Select'` (attribute `country-label`) — country-selector accessible name;
@@ -867,6 +907,8 @@ interface PhoneNumberAdapter {
867
907
  - readonly `input: HTMLInputElement | undefined` — the internal native telephone input.
868
908
  - readonly `inputValue: string` — editable formatted/partial text, which remains available even when
869
909
  canonical `value` is `''`.
910
+ - `selectionStart`, `selectionEnd`, and `selectionDirection` — native selection getters/setters
911
+ forwarded to the telephone input
870
912
  - readonly `phoneStatus: PhoneNumberStatus` — current parse state. The host also reflects it through
871
913
  `data-phone-status`.
872
914
  - readonly `form`, `labels`, `validity`, `validationMessage`, `willValidate`, and
@@ -878,7 +920,9 @@ text remains in `inputValue`/the native input so validation never makes a number
878
920
  but its canonical submitted `value` is blank. Native validation feedback is anchored to the
879
921
  telephone input, not the adjacent country selector.
880
922
 
881
- **Methods:** `focus(options?)`, `blur()`, and `select()` forward to the native telephone input.
923
+ **Methods:** `focus(options?)`, `blur()`, `select()`, `setSelectionRange()`, and `setRangeText()`
924
+ forward to the native telephone input. Range-text edits reparse the number and synchronize the
925
+ canonical value, form value, and validity.
882
926
  `setFormValue(value)`, `checkValidity()`, and `reportValidity()` come from `FormAssociated`.
883
927
  `form.reset()` restores the original declarative `value` and the default country.
884
928
 
@@ -1061,6 +1105,8 @@ Zero-dependency inline SVG trend chart (mirrors `<wa-sparkline>`).
1061
1105
  - `type: 'line' | 'bar' | 'area' = 'line'`
1062
1106
  - `min?: number` (defaults to data minimum)
1063
1107
  - `max?: number` (defaults to data maximum)
1108
+ - `accessibleLabel: string | null = null` (attribute `aria-label`) — overrides the localized
1109
+ generated summary on the internal SVG
1064
1110
 
1065
1111
  **Events:** none.
1066
1112
 
@@ -1081,9 +1127,9 @@ the reviewed family (pure CSS cascade, no JS/`getComputedStyle` bridging needed)
1081
1127
  ```
1082
1128
 
1083
1129
  **Known gotchas:**
1084
- - Auto-sets `role="img"` + a descriptive `aria-label` ("Trend of N values, last X" / "No data" when
1085
- empty) good default, but still just a single summary sentence with no tabular fallback; fine for
1086
- a glance-value sparkline, worth reconsidering if it's ever the *sole* representation of a metric.
1130
+ - The semantic `role="img"` and accessible name live on the SVG that owns the graphic. The generated
1131
+ summary is localized, formats the last value with `effectiveLocale`, and can be replaced through
1132
+ `accessibleLabel`/host `aria-label`. It remains a concise summary rather than a tabular fallback.
1087
1133
  - flat data (every value equal, so the auto-computed range spans zero) now renders a centered
1088
1134
  midline/mid-height bars instead of collapsing every point to the bottom edge, and a single-value
1089
1135
  series renders a visible flat line (a zero-length path was previously invisible). **Every** `type`
@@ -1113,6 +1159,8 @@ Country/language flag image. Flag artwork ships in a **separate, optional peer p
1113
1159
  alongside `src` since there's no `country`/`language` to derive a fallback `alt` from.)
1114
1160
  - `label?: string` (accessible name / `alt` text — **defaults to a localized, human-readable region
1115
1161
  name derived from the *resolved country* code via `Intl.DisplayNames` if omitted**, see gotchas)
1162
+ - `accessibleLabel: string | null = null` (attribute `aria-label`) — takes precedence over `label`
1163
+ and the derived region name; an explicit empty value marks the image decorative
1116
1164
  - `round: boolean = false` (reflected — circular crop)
1117
1165
  - `variant?: 'compact' | 'standard' | 'detailed'` (attribute `variant`, not reflected — picks a
1118
1166
  fidelity tier for the ~65 codes whose source art embeds a coat of arms/seal/emblem; every other
@@ -1132,9 +1180,8 @@ Country/language flag image. Flag artwork ships in a **separate, optional peer p
1132
1180
  **CSS parts:** `image`
1133
1181
 
1134
1182
  **Themeable custom properties:** `--lyra-flag-radius` (default `calc(var(--lyra-radius) * 0.33)` —
1135
- ≈2px at the library's default `--lyra-radius` of `0.375rem`; scales with `--lyra-radius` unless
1136
- overridden directly — non-`round` corner radius); also consumes `--lyra-color-border` (the inset
1137
- ring around the flag image).
1183
+ non-`round` corner radius), `--lyra-flag-aspect-ratio` (default `4 / 3`), and
1184
+ `--lyra-flag-object-fit` (default `cover`); also consumes `--lyra-color-border` for the inset ring.
1138
1185
 
1139
1186
  **Optional peer deps:** `@aceshooting/lyra-flags` — required for the component to actually render an
1140
1187
  image when `country` or `language` is used. Import `components/flag/flag-peer.js` once to opt into
@@ -1172,8 +1219,8 @@ import '@aceshooting/lyra-ui/components/flag/flag-peer.js';
1172
1219
  - Rendering is async even when the peer *is* installed: `src` resolves after an `import()` +
1173
1220
  resolver call, so there's a brief loading-skeleton window on first paint/attribute change — don't
1174
1221
  assume the `<img>` exists synchronously right after setting `country`/`language`.
1175
- - if `label` is omitted, the accessible name (`alt`) falls back to a localized region name via
1176
- `Intl.DisplayNames([navigator.language], { type: 'region' })` (e.g. `"United Kingdom"`) instead of
1222
+ - if both `aria-label` and `label` are omitted, the accessible name (`alt`) falls back to a localized
1223
+ region name via `Intl.DisplayNames([effectiveLocale], { type: 'region' })` (e.g. `"United Kingdom"`) instead of
1177
1224
  a bare code — for `language="en"` that's derived from `"GB"` (the mapped country), not `"EN"` (the
1178
1225
  language tag itself). Falls back further to the bare uppercase code if `Intl.DisplayNames` throws
1179
1226
  for an unrecognized region or isn't available. You can still pass an explicit `label` (e.g.
@@ -1265,6 +1312,9 @@ Loading placeholder (`text`/`circle`/`rect` shapes, `pulse`/`sheen` effects).
1265
1312
  - `label: string = 'Loading…'` — accessible name for this instance's own `role="status"` (rendered as
1266
1313
  visually-hidden text inside `[part="base"]`); override with a description of what's actually
1267
1314
  loading, e.g. `label="Loading chart"`
1315
+ - `announce: boolean = true` (reflected) — set false for decorative members of a skeleton group;
1316
+ removes the status role, live-region state, and visually hidden announcement while preserving
1317
+ the visual placeholder
1268
1318
 
1269
1319
  **Events:** none.
1270
1320
 
@@ -1273,7 +1323,8 @@ Loading placeholder (`text`/`circle`/`rect` shapes, `pulse`/`sheen` effects).
1273
1323
  **CSS parts:** `base`
1274
1324
 
1275
1325
  **Themeable custom properties:** `--lyra-skeleton-w`, `--lyra-skeleton-h` (set/cleared by the
1276
- `width`/`height` properties; default `100%` / `1em`).
1326
+ `width`/`height` properties; default `100%` / `1em`) and shared `--lyra-transition-ambient` for
1327
+ the pulse/sheen timing.
1277
1328
 
1278
1329
  **Optional peer deps:** none.
1279
1330
 
@@ -1283,14 +1334,8 @@ Loading placeholder (`text`/`circle`/`rect` shapes, `pulse`/`sheen` effects).
1283
1334
  ```
1284
1335
 
1285
1336
  **Known gotchas:**
1286
- - every instance is an independent, simultaneously-firing `role="status"` live region (set via
1287
- `willUpdate`) with its own visually-hidden `label` text (default `"Loading…"`). A realistic loading
1288
- state (e.g. a 10×5 skeleton table = 50 instances) mounts 50 separate live regions at nearly the same
1289
- tick — expect screen readers to announce the label dozens of times, not once, even if every
1290
- instance shares the same default `label`. A more specific per-instance `label` doesn't fix the
1291
- fan-out by itself; there's still no grouping primitive to dedupe it — if it matters, wrap your own
1292
- single `role="status"` region around the set of skeletons and mark the individual ones
1293
- `aria-hidden`.
1337
+ - Each instance announces by default. In a repeated skeleton layout, provide one parent status and
1338
+ set `announce="false"` on the decorative child placeholders to avoid duplicate announcements.
1294
1339
  - no `lines`/`count` shorthand for "N lines of skeleton text" — stamp out N elements
1295
1340
  yourself.
1296
1341
  - Respects `prefers-reduced-motion` (both effects) — safe to leave as-is for that concern.
@@ -1371,25 +1416,27 @@ accent edge and value tint).
1371
1416
 
1372
1417
  ## `lyra-table`
1373
1418
 
1374
- Presentational, sort/select-aware data table. **The host owns actual sorting/filtering/pagination**
1375
- of `rows` this component only renders and emits intents.
1419
+ Sort/select-aware data table. Sorting remains consumer-controlled; optional filtering, pagination,
1420
+ and loading chrome are built in while remaining controlled at the public API boundary.
1376
1421
 
1377
1422
  **Properties:**
1378
- - `columns: TableColumn<T>[] = []` (attribute: false) — `{ key, label, sortable?, align?:
1379
- 'start'|'end', priority?: 'medium'|'low', sticky?: boolean, cell: (row) => unknown }` —
1423
+ - `columns: TableColumn<T>[] = []` (attribute: false) — `{ key, label, headerCell?, width?,
1424
+ minWidth?, sortable?, align?: 'start'|'end', priority?: 'medium'|'low', sticky?: boolean |
1425
+ 'start' | 'end', footer?, cellStyle?, cell: (row) => unknown }` —
1380
1426
  `priority` progressively hides that column via a `@container` query as `[part='base']` narrows
1381
1427
  (`'low'` hides first, under a ~900px container width; `'medium'` next, under ~640px; both
1382
1428
  breakpoints are fixed in `table.styles.ts`, not themeable tokens), reversible via
1383
- `[part='reveal-columns-button']`; `sticky` pins that column's header cell/cells to the inline-start
1384
- edge (`position: sticky`) while the table scrolls horizontally — multiple `sticky` columns stack
1385
- left-to-right (each measures every earlier sticky column's rendered width via
1429
+ `[part='reveal-columns-button']`; `sticky` pins that column's header/cells to the logical start
1430
+ (`true`/`'start'`) or end edge while the table scrolls horizontally — multiple sticky columns stack
1431
+ in logical order (each measures every earlier sticky column's rendered width via
1386
1432
  `--lyra-table-sticky-offset`) instead of overlapping at the same edge; `footer` renders a
1387
1433
  sticky-bottom footer cell for that column, computed from every currently-rendered row (post-sort,
1388
1434
  pre-pagination) — e.g. a column total — omit it for a column with no footer value, and a
1389
1435
  `[part='foot']` (`<tfoot>`) only renders at all when at least one column defines `footer`;
1390
1436
  `cellStyle` is applied directly to the generated `<td>` via `styleMap` — e.g. a computed heat-tint
1391
1437
  background a `cell()`-returned inner element can't paint into the cell's own padding — omit it for
1392
- no per-cell style override (the default, unchanged output)
1438
+ no per-cell style override (the default, unchanged output); `editable` enables double-click
1439
+ editing, `editValue` supplies the editor value, and `editType` selects `text` or `number`
1393
1440
  - `columnsHidden: boolean = false` (attribute `columns-hidden`, reflected) — computed/read-only: true
1394
1441
  when a `priority` column is *actually* hidden right now by the `@container` breakpoints above, or
1395
1442
  `showAllColumns` force-visible mode is currently active. Measured via a `ResizeObserver` on
@@ -1407,6 +1454,36 @@ of `rows` — this component only renders and emits intents.
1407
1454
  when omitted, which is only safe while `rows` never reorders — set it whenever `rows` can be
1408
1455
  sorted/filtered/re-ordered across renders, or selection/click can silently attach to the wrong row
1409
1456
  - `selectedKey: string | number | null = null` (attribute: false) — **single**-selection only
1457
+ - `selectionMode: 'none'|'single'|'multiple' = 'none'` (attribute `selection-mode`, reflected) —
1458
+ opt-in self-managed row selection; the default remains presentational
1459
+ - `selectedKeys: Set<string | number> = new Set()` (attribute: false) — the selected raw row keys
1460
+ used by multiple selection
1461
+ - `filterable: boolean = false` (attribute `filterable`, reflected) — renders a localized search
1462
+ field above the grid
1463
+ - `filterText: string = ''` (attribute `filter-text`) — controlled filter text
1464
+ - `filter?: (row: T, text: string) => boolean` (attribute: false) — typed predicate used by the
1465
+ filter field; when omitted, rows are matched against their JSON representation
1466
+ - `filterLabel: string = ''` (attribute `filter-label`) and `filterPlaceholder: string = ''`
1467
+ (attribute `filter-placeholder`) — optional localized-label overrides
1468
+ - `loading: boolean = false` (attribute `loading`, reflected) and `loadingLabel: string = ''`
1469
+ (attribute `loading-label`) — renders a busy spinner and suppresses the grid while loading
1470
+ - `pageSize: number = 0` (attribute `page-size`) — positive values enable controlled pagination;
1471
+ zero disables the pagination footer
1472
+ - `page: number = 1` (attribute `page`, reflected) — controlled current page
1473
+ - `totalItems: number = -1` (attribute `total-items`) — server-side total item count; `-1` derives
1474
+ the total from filtered rows
1475
+ - `paginationMode: 'client'|'server' = 'client'` (attribute `pagination-mode`, reflected) — client
1476
+ mode slices rows; server mode renders the supplied page unchanged
1477
+ - Editable columns emit `lyra-cell-edit` on commit and never mutate the supplied row object.
1478
+ - `groupBy?: (row: T) => string | number` (attribute: false) — inserts a non-focusable full-width
1479
+ group row before each group
1480
+ - `groupLabel?: (key: string | number, rows: T[]) => unknown` (attribute: false) — custom group
1481
+ header content; without it, the group key is rendered as text
1482
+ - `expandedContent?: (row: T) => unknown` (attribute: false) — enables a leading expand toggle and
1483
+ renders a full-width detail row beneath expanded records
1484
+ - `canExpand?: (row: T) => boolean` (attribute: false) — optional per-row gate for expansion
1485
+ - `expandedKeys: Set<string | number> = new Set()` (attribute: false) — consumer-controlled expanded
1486
+ state; update it in response to `lyra-row-expand-toggle`
1410
1487
  - `hasMore: boolean = false` (attribute `has-more`, reflected)
1411
1488
  - `moreLabel: string = 'Load more'` (attribute `more-label`)
1412
1489
  - `emptyHeading: string = 'No data'` (attribute `empty-heading`)
@@ -1417,17 +1494,27 @@ of `rows` — this component only renders and emits intents.
1417
1494
  reveal-button's label while `priority`-hidden columns are hidden)
1418
1495
  - `hideColumnsLabel: string = 'Show fewer columns'` (attribute `hide-columns-label` — the same
1419
1496
  button's label once they've been revealed)
1497
+ - `showAllColumns: boolean = false` (attribute `show-all-columns`, reflected) — forces responsive
1498
+ priority columns visible and is updated by the built-in reveal button
1420
1499
 
1421
1500
  **Events:** `lyra-sort` (`detail: { key }`, fired on sortable-header activation), `lyra-row-click`
1422
1501
  (`detail: { row }`), `lyra-load-more` (fired on the "load more" button), `lyra-columns-hidden-change`
1423
- (`detail: { hidden: boolean }`, fired only on a real `columnsHidden` transition)
1502
+ (`detail: { hidden: boolean }`, fired only on a real `columnsHidden` transition),
1503
+ `lyra-columns-revealed` (`detail: { revealed: boolean }`), and `lyra-row-expand-toggle`
1504
+ (`detail: { row, key }`; the table does not mutate `expandedKeys`), and
1505
+ `lyra-selection-change` (`detail: { keys }`) when selection is enabled, `lyra-filter-change`
1506
+ (`detail: { text }`), and `lyra-page-change` (`detail: { page }`) from the controlled
1507
+ filter/pagination surfaces, and `lyra-cell-edit` (`detail: { row, key, value }`) for editable
1508
+ columns
1424
1509
 
1425
1510
  **Slots:** none — content comes entirely from `columns`/`rows`.
1426
1511
 
1427
1512
  **CSS parts:** `base`, `table`, `head`, `header-cell`, `row`, `cell`, `more-button`, `sort-icon` (a
1428
1513
  chevron indicator shown on the active sortable header, rotated per `sortDir`), `reveal-columns-button`
1429
1514
  (shown only when `columnsHidden` is true), `foot` (the `<tfoot>`, only rendered when at least one
1430
- column defines `footer`), `footer-row` (the single footer row), `footer-cell` (a single footer cell)
1515
+ column defines `footer`), `footer-row`, `footer-cell`, `expand-toggle-cell`, `row-expand-toggle`,
1516
+ `row-expand-icon`, `expanded-row`, `expanded-cell`, `filter-label`, `filter`, `loading`, and
1517
+ `pagination`, `cell-editor`, `group-row`, and `group-cell`
1431
1518
 
1432
1519
  **Themeable custom properties:** `--lyra-table-max-height` (default `none`; controls the scrollable
1433
1520
  body's `max-block-size`).
@@ -1510,6 +1597,9 @@ from its built-in default is treated as an explicit per-instance wording overrid
1510
1597
  **Events:** `lyra-page-change` (`detail: { page: number }`, bubbles and composes, non-cancelable) —
1511
1598
  emitted for a valid, different requested page. The host applies `event.detail.page` back to `page`
1512
1599
  after routing, fetching, or any other policy decision.
1600
+ The internal page input's `focus` and `blur` are also bridged as bubbling, composed host events.
1601
+
1602
+ **Methods:** `focus(options?)` and `blur()` forward to the numeric page input.
1513
1603
 
1514
1604
  **Slots:** none.
1515
1605
 
@@ -1625,8 +1715,12 @@ immediately) or multi-format (click opens a small menu).
1625
1715
  not toggle it automatically
1626
1716
  - `label: string = 'Export'` — trigger button text; also feeds the format-choice menu's `aria-label`
1627
1717
  as `` `${label} format` `` so assistive tech gets an accessible name for the menu
1718
+ - `accessibleLabel: string = ''` (attribute `aria-label`) — overrides the trigger's accessible
1719
+ name and feeds the localized format-menu name without changing the visible label
1628
1720
  - `open: boolean = false` (reflected)
1629
1721
 
1722
+ **Methods:** `focus(options?)` and `blur()` forward to the native trigger button.
1723
+
1630
1724
  **Events:** `lyra-export` (`detail: { format: string }`, **cancelable** — call `preventDefault()` to
1631
1725
  substitute your own server-generated download instead of the built-in client-side one),
1632
1726
  `lyra-export-complete` (`detail: { format: 'csv' | 'json' }`, fires only after a non-cancelled
@@ -1684,6 +1778,9 @@ downloadBlob(content: string, filename: string, mime: string): void // trig
1684
1778
  jump to the first/last item once open, Escape closes it and returns focus to the trigger button,
1685
1779
  and a completed export also returns focus to the trigger — not just Escape/click-outside as
1686
1780
  before.
1781
+ - the positioned menu is constrained to the inline/block space reported by the positioner, wraps
1782
+ long localized format labels/descriptions, scrolls when necessary, and disables its transition
1783
+ under reduced motion.
1687
1784
 
1688
1785
  ---
1689
1786
 
@@ -1697,6 +1794,13 @@ buttons, this has no code/JSON content model to adopt just to reuse the copy aff
1697
1794
 
1698
1795
  **Properties:**
1699
1796
  - `value: string = ''` — the plain text to copy.
1797
+ - `accessibleLabel: string | null = null` (attribute `aria-label`) — overrides the localized
1798
+ Copy/Copied accessible name without changing the icon
1799
+ - `disabled: boolean = false` (reflected)
1800
+ - `feedbackDuration: number = 1500` (attribute `feedback-duration`) — milliseconds before the
1801
+ copied checkmark returns to the copy icon; finite values are clamped at zero
1802
+
1803
+ **Methods:** `focus(options?)` and `blur()` forward to the native button.
1700
1804
 
1701
1805
  **Events:** `lyra-copy` (`detail: { text: string }`) — fires on activation, always with the current
1702
1806
  `value`, regardless of whether the OS clipboard write actually succeeded (same convention as
@@ -2112,10 +2216,11 @@ Steps an index through `[0, length)` on a fixed interval — play/pause for time
2112
2216
  change-tracking sees it and auto-pauses on `hidden = true`)
2113
2217
 
2114
2218
  **Methods:** `play()`, `pause()`, `toggle()`, `next()`, `previous()`, `goTo(index: number)` — all
2115
- idempotent/clamped; `length <= 1` is a no-op degenerate case.
2219
+ idempotent/clamped; `length <= 1` is a no-op degenerate case. `focus(options?)` and `blur()` forward
2220
+ to the play button.
2116
2221
 
2117
2222
  **Events:** `lyra-play`, `lyra-pause` (no detail), `lyra-step` (`detail: { index }`, fired on every
2118
- tick and manual step)
2223
+ tick and manual step); internal `focus`/`blur` are bridged as bubbling, composed host events.
2119
2224
 
2120
2225
  **Slots:** none.
2121
2226
 
@@ -2242,6 +2347,14 @@ click, or Enter/Space on the focused cell, fires `lyra-cell-click`.
2242
2347
  `6` Saturday) for a row that would otherwise render a label and, when it returns a string, uses it
2243
2348
  instead of the built-in `Intl.DateTimeFormat`-derived short weekday name. Unset (the default)
2244
2349
  reproduces today's exact locale-derived output.
2350
+ - `monthLabelText?: (jsMonth: number, year: number) => string | undefined` (attribute: false,
2351
+ calendar mode only) — the month-axis analogue of `weekdayLabelText`: receives the real JS month
2352
+ index (`0` January .. `11` December) and full year for a month boundary that would otherwise
2353
+ render a label, and, when it returns a string, uses it instead of the built-in
2354
+ `Intl.DateTimeFormat`-derived short month name. Unset (the default) reproduces today's exact
2355
+ locale-derived output. Lets month labels track the same locale signal (e.g. an app's own i18n
2356
+ store) as `weekdayLabelText` and the component's other localizable strings, instead of always
2357
+ following the browser/OS-language default.
2245
2358
  - `colorSteps?: string[]` (attribute: false) — a discrete array (≥2 entries) of CSS colors used as
2246
2359
  exact ramp steps instead of linearly interpolating between `--lyra-heatmap-scale-lo`/`-hi`;
2247
2360
  governs both `mode`s and both `scale` values, discretizing whichever scale would otherwise
@@ -2599,6 +2712,12 @@ Chart.js wrapper every other `lyra-*-chart` tag subclasses; supports both a simp
2599
2712
  - `config?: Partial<ChartConfiguration>` (attribute: false) — deep-merged over the generated
2600
2713
  config; any nested key wins without clobbering sibling generated keys. This is the raw Chart.js
2601
2714
  escape hatch, so a caller-supplied `config.type` is passed through rather than normalized.
2715
+ - `accessibleLabel: string = ''` (attribute `accessible-label`) — canvas name override; a host
2716
+ `aria-label` has highest precedence
2717
+ - `accessibleDescription: string = ''` (attribute `accessible-description`) — overrides the
2718
+ localized data/trend summary
2719
+ - `showDataTable: boolean = false` (attribute `show-data-table`) — makes the always-available
2720
+ accessible data table visible rather than screen-reader-only
2602
2721
 
2603
2722
  **Methods:** `resetZoom()` (reset any active zoom/pan to the original view), `refreshTheme()`
2604
2723
  (forces a redraw so the `--lyra-chart-*` tokens below are re-read from the current computed style —
@@ -2642,9 +2761,8 @@ subset actually used.
2642
2761
  ```
2643
2762
 
2644
2763
  **Known gotchas:**
2645
- - `type` at the `lyra-chart` (core) level is completely unchecked `buildConfig()` passes it
2646
- straight to Chart.js as-is, so `<lyra-chart type="pie">` already works today with no subclass
2647
- needed. Each typed subclass below locks its *own* `type` via a real prototype accessor (see the
2764
+ - supported `type` values are normalized before reaching Chart.js; unknown runtime attribute or
2765
+ property values fall back to `line`. Each typed subclass below locks its *own* `type` via a real prototype accessor (see the
2648
2766
  typed-subclasses section) — a genuine runtime lock, not just a compile-time default.
2649
2767
  - no global theme-broadcast event exists to auto-retheme an already-drawn chart on a theme switch —
2650
2768
  a consumer flipping something upstream (e.g. a `data-theme` attribute) that doesn't otherwise
@@ -2678,6 +2796,9 @@ subset actually used.
2678
2796
  changed since the last draw (e.g. an unrelated property/state update, or a bare `requestUpdate()`).
2679
2797
  `refreshTheme()` calls `draw()` directly and is unaffected by either gate — it always redraws, since
2680
2798
  a theme change isn't reflected in any tracked property.
2799
+ - Chart.js receives `effectiveLocale`; generated summary values use the same locale. Cartesian y/y2
2800
+ axes swap logical sides under RTL, and host `aria-label` is forwarded to the canvas and data-table
2801
+ caption.
2681
2802
 
2682
2803
  ---
2683
2804
 
@@ -2746,11 +2867,18 @@ passthrough). Not a subclass of `LyraChart`.
2746
2867
  column in a stacked chart. Empty (the default) reproduces the exact existing output: no bar
2747
2868
  carries `data-selected`. This component takes no opinion on what the highlight looks like, only
2748
2869
  which bars it applies to — style it via `::part(bar)[data-selected]`.
2870
+ - `minBarHeight?: number` (attribute `min-bar-height`) — optional minimum visible bar height for
2871
+ small non-zero values
2872
+ - `accessibleLabel?: string` (attribute `accessible-label`) — SVG accessible-name override; a host
2873
+ `aria-label` wins
2749
2874
 
2750
2875
  **Events:** `lyra-point-click` — fired when a bar/point is activated (click, or Enter/Space while
2751
2876
  focused). `detail: { datasetIndex: number, index: number, label: string | undefined, value: number
2752
2877
  | null }` — same shape as `lyra-chart`'s `lyra-point-click`.
2753
2878
 
2879
+ The axis gutter/title and y-axis labels mirror to logical start under RTL. Built-in mark summaries
2880
+ are complete localized templates and format values with `effectiveLocale`.
2881
+
2754
2882
  **Performance:** rendering is `IntersectionObserver`-gated and content-signature-memoized — `render()`
2755
2883
  skips recomputing the grid/marks (and reuses the previous `TemplateResult`) while the host is scrolled
2756
2884
  off-screen, or when none of the content-affecting properties (`type`, `labels`, `datasets`, `legend`,
@@ -2880,6 +3008,13 @@ browser). Does **not** extend `LyraChart` — a deliberately bespoke API.
2880
3008
  - `height: string = '280px'`
2881
3009
  - `yLabel: string = ''` (attribute `y-label`)
2882
3010
  - `beginAtZero: boolean = true` (attribute `begin-at-zero`)
3011
+ - `accessibleLabel: string = ''` (attribute `accessible-label`) — canvas name override; host
3012
+ `aria-label` wins
3013
+ - `accessibleDescription: string = ''` (attribute `accessible-description`) — overrides the
3014
+ localized five-number summary
3015
+ - `showDataTable: boolean = false` (attribute `show-data-table`) — reveals the accessible data table
3016
+
3017
+ **Methods:** `refreshTheme()` re-reads canvas theme custom properties after an ancestor theme change.
2883
3018
 
2884
3019
  **Events:** none.
2885
3020
 
@@ -2903,9 +3038,11 @@ independently of the base `chart-loader.ts`).
2903
3038
  ```
2904
3039
 
2905
3040
  **Known gotchas:**
2906
- - no raw `config` passthrough (unlike every other chart tag) limited to
2907
- `labels`/`boxes`/`legend`/`height`/`yLabel`/`beginAtZero`; can't reach the underlying
3041
+ - no raw `config` passthrough limited to the properties above; can't reach the underlying
2908
3042
  controller's own options (`itemRadius`, `outlierRadius`, `coef`).
3043
+ - Chart.js receives `effectiveLocale`; generated numeric summaries use it, the y axis moves to
3044
+ logical start in RTL, canvas tooltip/axis colors are token-driven, and animation is disabled
3045
+ under reduced motion.
2909
3046
  - The peer-dependency-missing failure path (`.catch()` → warn + resolve `null`) is untested —
2910
3047
  verify it manually if shipping without the peer installed.
2911
3048
 
@@ -3030,8 +3167,11 @@ parsing (that's left entirely to the host).
3030
3167
  **before** (and takes precedence over) `allowedMimeTypes`
3031
3168
  - `maxFileSize: number = 0` (attribute `max-file-size` — bytes; `0` disables the check)
3032
3169
  - `label: string = 'Drop files here or click to browse'`
3170
+ - `accessibleLabel: string = ''` (attribute `aria-label`) — overrides `label` as the internal
3171
+ dropzone/button accessible name without changing visible copy
3033
3172
 
3034
- **Methods:** `openPicker()` programmatically opens the native file dialog.
3173
+ **Methods:** `openPicker()` programmatically opens the native file dialog; `focus(options?)`
3174
+ forwards to the interactive dropzone.
3035
3175
 
3036
3176
  **Events:** `lyra-files` (`detail: { files: File[], rejected: RejectedFile[] }`, fired on both drop
3037
3177
  and manual file-picker selection) — `RejectedFile = { file: File; reason: 'type' | 'count' | 'size'
@@ -3088,6 +3228,219 @@ an extension-only `accept` list.
3088
3228
 
3089
3229
  ---
3090
3230
 
3231
+ ## `lyra-drawer`
3232
+
3233
+ A modal panel anchored to one edge of the viewport. It inherits the dialog overlay contract:
3234
+ focus trapping, Escape and optional backdrop dismissal, document scroll locking, overlay stacking,
3235
+ accessible naming, and the cancelable `lyra-dialog-close` event.
3236
+
3237
+ **Properties:**
3238
+ - `open: boolean = false` (attribute `open`, reflected) — controls visibility
3239
+ - `placement: 'start'|'end'|'top'|'bottom' = 'start'` (attribute `placement`, reflected)
3240
+ - `heading?: string`, `label: string`, `closable: boolean`, and `noLightDismiss: boolean` — inherited
3241
+ dialog naming and dismissal options
3242
+
3243
+ **CSS parts:** `backdrop`, `panel`, `header`, `heading`, `close-button`, `label`, `body`, `footer`.
3244
+
3245
+ **Themeable custom properties:** `--lyra-drawer-width`, `--lyra-drawer-height`, and inherited
3246
+ dialog surface/overlay tokens.
3247
+
3248
+ ```html
3249
+ <lyra-drawer open placement="end" heading="Filters" closable>
3250
+ <lyra-checkbox label="Only active"></lyra-checkbox>
3251
+ </lyra-drawer>
3252
+ ```
3253
+
3254
+ ---
3255
+
3256
+ ## `lyra-carousel`
3257
+
3258
+ Accessible carousel for arbitrary slotted slide elements. It shows one assigned element at a time,
3259
+ adds slide semantics and localized position labels, and provides keyboard, button, and indicator
3260
+ navigation.
3261
+
3262
+ **Properties:**
3263
+ - `index: number = 0` (attribute `index`, reflected) — active slide index
3264
+ - `loop: boolean = false` (attribute `loop`, reflected) — wraps navigation at either end
3265
+ - `autoplay: boolean = false` (attribute `autoplay`, reflected) and `autoplayInterval: number = 5000`
3266
+ (attribute `autoplay-interval`) — optional timed advance; autoplay is disabled under reduced motion
3267
+ - `showIndicators: boolean = true` (attribute `show-indicators`) — renders slide indicator buttons
3268
+ - `accessibleLabel: string = ''` (attribute `accessible-label`) — fallback landmark name; a host
3269
+ `aria-label` takes precedence
3270
+
3271
+ **Methods:** `next()`, `previous()`, and `goTo(index)` update the active index and emit
3272
+ `lyra-slide-change` (`detail: { index }`).
3273
+
3274
+ **CSS parts:** `base`, `viewport`, `track`, `controls`, `previous-button`, `next-button`,
3275
+ `indicators`, and `indicator`.
3276
+
3277
+ ```html
3278
+ <lyra-carousel aria-label="Screenshots">
3279
+ <img alt="Dashboard overview" src="overview.png">
3280
+ <img alt="Dashboard details" src="details.png">
3281
+ </lyra-carousel>
3282
+ ```
3283
+
3284
+ ---
3285
+
3286
+ ## `lyra-carousel-item`
3287
+
3288
+ Optional semantic wrapper for one slide in `<lyra-carousel>`. The carousel also accepts arbitrary
3289
+ slotted elements, so this element is useful when a migration needs the explicit item tag.
3290
+
3291
+ **Slots:** default slide content.
3292
+
3293
+ **CSS parts:** `base`.
3294
+
3295
+ ```html
3296
+ <lyra-carousel>
3297
+ <lyra-carousel-item>Dashboard overview</lyra-carousel-item>
3298
+ <lyra-carousel-item>Dashboard details</lyra-carousel-item>
3299
+ </lyra-carousel>
3300
+ ```
3301
+
3302
+ ---
3303
+
3304
+ ## `lyra-button-group`
3305
+
3306
+ Responsive semantic grouping primitive for related action controls. It preserves the slotted
3307
+ controls and exposes `role="group"` on its internal wrapper.
3308
+
3309
+ **Properties:**
3310
+ - `orientation: 'horizontal' | 'vertical' = 'horizontal'` (reflected)
3311
+ - `label: string = ''` — accessible group name; a host `aria-label` is used when `label` is empty
3312
+
3313
+ **Slots:** default action controls.
3314
+
3315
+ **CSS parts:** `base`.
3316
+
3317
+ ---
3318
+
3319
+ ## `lyra-image-comparer`
3320
+
3321
+ Before/after comparison surface with two named slots and a keyboard-accessible native range handle.
3322
+
3323
+ **Properties:**
3324
+ - `position: number = 50` (attribute `position`, reflected) — divider position from 0 to 100
3325
+ - `orientation: 'horizontal'|'vertical' = 'horizontal'` (attribute `orientation`, reflected)
3326
+ - `accessibleLabel: string | null` (attribute `aria-label`) — accessible name for the comparison
3327
+ and its range handle
3328
+ - `beforeLabel`/`afterLabel` — fallback text for empty named slots
3329
+
3330
+ **Events:** `lyra-position-change` (`detail: { position }`), plus composed `focus` and `blur` events
3331
+ from the internal range handle.
3332
+
3333
+ **Slots:** `before`, `after`.
3334
+
3335
+ **CSS parts:** `base`, `before`, `after`, `divider`, and `handle`.
3336
+
3337
+ ```html
3338
+ <lyra-image-comparer aria-label="Before and after">
3339
+ <img slot="before" alt="Before" src="before.png">
3340
+ <img slot="after" alt="After" src="after.png">
3341
+ </lyra-image-comparer>
3342
+ ```
3343
+
3344
+ ---
3345
+
3346
+ ## `lyra-zoomable-frame`
3347
+
3348
+ Scrollable inspection frame with bounded zoom controls and keyboard shortcuts. Scrolling provides
3349
+ panning when zoomed content exceeds the viewport.
3350
+
3351
+ **Properties:**
3352
+ - `zoom: number = 1` (attribute `zoom`, reflected), `minZoom: number = 0.5`, `maxZoom: number = 4`,
3353
+ and `zoomStep: number = 0.25` — bounded zoom configuration
3354
+ - `src: string = ''` and `alt: string = ''` — optional image source; otherwise the default slot is
3355
+ rendered
3356
+ - `accessibleLabel: string | null` (attribute `aria-label`) — host-level accessible name
3357
+
3358
+ **Methods:** `zoomIn()`, `zoomOut()`, and `resetZoom()` update the zoom and emit
3359
+ `lyra-zoom-change` (`detail: { zoom }`). The viewport also accepts `+`, `-`, and `0` keyboard
3360
+ shortcuts.
3361
+
3362
+ **CSS parts:** `base`, `viewport`, `content`, `controls`, `zoom-out`, `zoom-in`, and `reset`.
3363
+
3364
+ ```html
3365
+ <lyra-zoomable-frame src="map-preview.png" alt="Map preview" aria-label="Map preview"></lyra-zoomable-frame>
3366
+ ```
3367
+
3368
+ ---
3369
+
3370
+ ## `lyra-scroller`
3371
+
3372
+ Responsive overflow surface with optional previous/next controls. The default slot remains the
3373
+ consumer's content, and the viewport is a native scroll container that works in narrow panels as
3374
+ well as full-width layouts.
3375
+
3376
+ **Properties:**
3377
+ - `orientation: 'horizontal' | 'vertical' = 'horizontal'` (reflected)
3378
+ - `controls: boolean = false` (reflected) — show previous/next controls
3379
+ - `hideScrollbar: boolean = false` (attribute `hide-scrollbar`, reflected)
3380
+ - `scrollStep: number = 0` (attribute `scroll-step`) — custom step; zero uses 80% of the viewport
3381
+ - `label: string = ''` — accessible region name; a host `aria-label` is used when set
3382
+
3383
+ **Events:** `lyra-scroll` with `scrollStart`, `scrollEnd`, `scrollLeft`, and `scrollTop` in the
3384
+ detail object.
3385
+
3386
+ **Slots:** default scrollable content.
3387
+
3388
+ **CSS parts:** `base`, `viewport`, `content`, `previous`, and `next`.
3389
+
3390
+ ```html
3391
+ <lyra-scroller controls label="Project cards">
3392
+ <lyra-card>Solar</lyra-card>
3393
+ <lyra-card>Wind</lyra-card>
3394
+ <lyra-card>Battery</lyra-card>
3395
+ </lyra-scroller>
3396
+ ```
3397
+
3398
+ ---
3399
+
3400
+ ## `lyra-resize-observer`
3401
+
3402
+ Lifecycle-managed wrapper around the native `ResizeObserver`. It observes all element children in
3403
+ the default slot and emits a composed event, while adding no layout of its own.
3404
+
3405
+ **Properties:** `disabled: boolean = false` (reflected) and `box: 'content-box' | 'border-box' |
3406
+ 'device-pixel-content-box' = 'content-box'` (reflected).
3407
+
3408
+ **Events:** `lyra-resize` with `{ entries: ResizeObserverEntry[] }` in `detail`.
3409
+
3410
+ **Slots:** default observed elements. **CSS parts:** `base`.
3411
+
3412
+ ---
3413
+
3414
+ ## `lyra-intersection-observer`
3415
+
3416
+ Lifecycle-managed wrapper around the native `IntersectionObserver`. It observes all element children
3417
+ in the default slot and emits a composed event, while adding no layout of its own.
3418
+
3419
+ **Properties:** `disabled: boolean = false` (reflected), `rootMargin: string = '0px'` (attribute
3420
+ `root-margin`), `threshold: number | number[] = 0`, and `root: Element | null = null`.
3421
+
3422
+ **Events:** `lyra-intersection` with `{ entries: IntersectionObserverEntry[] }` in `detail`.
3423
+
3424
+ **Slots:** default observed elements. **CSS parts:** `base`.
3425
+
3426
+ ---
3427
+
3428
+ ## `lyra-mutation-observer`
3429
+
3430
+ Lifecycle-managed wrapper around the native `MutationObserver`. All element children in the default
3431
+ slot are observed and their mutation records are emitted as a composed event; the wrapper itself
3432
+ adds no layout.
3433
+
3434
+ **Properties:** `disabled: boolean = false` (reflected), `childList: boolean = true` (attribute
3435
+ `child-list`), `observeAttributes: boolean = false` (attribute `attributes`), `characterData: boolean = false` (attribute
3436
+ `character-data`), `subtree: boolean = true`, and `attributeFilter: string[] = []`.
3437
+
3438
+ **Events:** `lyra-mutation` with `{ records: MutationRecord[] }` in `detail`.
3439
+
3440
+ **Slots:** default observed elements. **CSS parts:** `base`.
3441
+
3442
+ ---
3443
+
3091
3444
  ## `lyra-dialog` / `confirm()`
3092
3445
 
3093
3446
  General-purpose modal/overlay plus a promise-based confirmation helper built on top of it.
@@ -3445,7 +3798,7 @@ keyboard.
3445
3798
 
3446
3799
  A boolean form control. `role="checkbox"` with an `aria-checked` that can also be `"mixed"`, and a
3447
3800
  visual box/checkmark. Structurally the same idea as `<lyra-switch>` (form-associated via
3448
- `ElementInternals`, click and Space/Enter both toggle) but with checkbox semantics.
3801
+ `ElementInternals`, click and Space toggle) but with checkbox semantics.
3449
3802
 
3450
3803
  **Properties:**
3451
3804
  - `checked: boolean = false` (reflected)
@@ -3458,8 +3811,11 @@ visual box/checkmark. Structurally the same idea as `<lyra-switch>` (form-associ
3458
3811
  - `value: string = 'on'` — only contributed to form submission while `checked` (a native checkbox
3459
3812
  submits nothing at all, not even an empty string, while unchecked)
3460
3813
 
3461
- **Events:** `lyra-change` (`detail: { checked: boolean }`) fired on a user toggle (click or
3462
- Space/Enter); not fired for a programmatic `.checked` assignment.
3814
+ **Events:** user toggles emit bubbling/composed `input`, then `change`, then the compatibility
3815
+ `lyra-change` alias (`detail: { checked: boolean }`). Programmatic `.checked` assignments are
3816
+ silent. Internal `focus`/`blur` are re-dispatched as bubbling, composed host events.
3817
+
3818
+ **Methods:** `focus(options?)` and `blur()` forward to the internal checkbox control.
3463
3819
 
3464
3820
  **Slots:** default — label text, rendered next to the box. Clicking it toggles the checkbox, the
3465
3821
  same as clicking a native checkbox's associated `<label>`. If left empty, set `aria-label` on the
@@ -3785,8 +4141,9 @@ produced HTML in a single pass (no second DOM walk after insertion).
3785
4141
  the page already finished loading); falls back to the normal async path (with its brief
3786
4142
  plain-text-fallback first paint) when the cache isn't warm yet. `false` (the default) is
3787
4143
  byte-identical to always taking the async path
3788
- - `streaming: boolean = false` (reflected) — reserved hint for a host-provided streaming renderer;
3789
- setting it has no rendering effect, but lets a consumer target `lyra-markdown[streaming]` in CSS
4144
+ - `streaming: boolean = false` (reflected) — marks the host `aria-busy="true"` while partial Markdown
4145
+ is still arriving and lets consumers target `lyra-markdown[streaming]`; busy state also remains
4146
+ true while parser dependencies are loading
3790
4147
 
3791
4148
  **Events:** `lyra-link-click` (`detail: { href: string, internal: true }`, fired — with the click
3792
4149
  prevented — when a rendered link's `href` starts with `internal-link-prefix`; ordinary external
@@ -4030,7 +4387,7 @@ decorative; `label` is the entire accessible content, nothing narrates individua
4030
4387
  A compact inline pill representing one tool/function call an agent made mid-conversation, e.g.
4031
4388
  `web_search: Searching web…` with a `running` spinner. First-party invention (no Web Awesome
4032
4389
  equivalent). It owns no detail surface of its own — activating it (click or Enter/Space while
4033
- focused) only fires `lyra-tool-chip-select`; a consumer wires that to opening a
4390
+ focused) fires `lyra-tool-call-chip-select`; a consumer wires that to opening a
4034
4391
  `<lyra-tool-result-dialog>` (or anything else) at the call site, keeping the chip reusable wherever
4035
4392
  a compact call summary is useful, with or without a detail surface behind it.
4036
4393
 
@@ -4047,10 +4404,11 @@ a compact call summary is useful, with or without a detail surface behind it.
4047
4404
  - `icon: string = ''` — literal icon hint (e.g. an emoji) rendered when the `icon` slot is empty;
4048
4405
  ignored once anything is assigned to `slot="icon"`
4049
4406
  - `callId: string = ''` (attribute `call-id`) — unique identifier for this invocation, echoed back
4050
- in `lyra-tool-chip-select`'s detail so a listener can correlate the click with the call it fired for
4407
+ in `lyra-tool-call-chip-select`'s detail so a listener can correlate the click with the call it fired for
4051
4408
 
4052
- **Events:** `lyra-tool-chip-select` (`detail: { name: string; callId: string }`) — fired on click or
4053
- Enter/Space activation of the pill.
4409
+ **Events:** `lyra-tool-call-chip-select` (`detail: { name: string; callId: string }`) — fired on
4410
+ click or Enter/Space activation of the pill. The deprecated `lyra-tool-chip-select` alias is fired
4411
+ alongside it for one minor compatibility cycle.
4054
4412
 
4055
4413
  **Slots:** default (rich tooltip/detail content — e.g. the tool's raw arguments or a short preview —
4056
4414
  shown in a floating tooltip on hover/focus; nothing renders at all, no hover affordance, when this
@@ -4080,7 +4438,7 @@ rules, not part of the public theming API); shared tokens referenced: `--lyra-co
4080
4438
  summary="Searching web…"
4081
4439
  duration-ms="820"
4082
4440
  call-id="call_123"
4083
- @lyra-tool-chip-select=${(e) => openDetail(e.detail.callId)}
4441
+ @lyra-tool-call-chip-select=${(e) => openDetail(e.detail.callId)}
4084
4442
  >
4085
4443
  <pre slot="icon" style="display:none"></pre>
4086
4444
  <code>{"query": "lyra ui components"}</code>
@@ -4271,6 +4629,8 @@ overlay stack.
4271
4629
  **Properties:**
4272
4630
  - `open: boolean = false` (reflected) — whether the dialog is open; set this (or call `close()`) —
4273
4631
  there is no separate `show()`/`hide()` pair
4632
+ - `accessibleLabel: string | null = null` (attribute `aria-label`) — directly names the internal
4633
+ dialog panel; otherwise the tool-name title supplies `aria-labelledby`
4274
4634
  - `toolName: string = ''` (attribute `tool-name`) — the tool's name, rendered prominently in the
4275
4635
  header
4276
4636
  - `status: 'pending'|'running'|'success'|'error'|'denied' = 'pending'` (reflected) — drives the
@@ -4280,12 +4640,12 @@ overlay stack.
4280
4640
  - `maximized: boolean = false` (reflected) — near-fullscreen presentation of the same open dialog
4281
4641
 
4282
4642
  **Methods:** `close(reason: ToolResultDialogCloseReason = 'api'): void` — closes the dialog (no-op if
4283
- already closed), emits `lyra-dialog-close` with `reason`, and returns focus to whatever had it before
4643
+ already closed), emits `lyra-close` with `reason`, and returns focus to whatever had it before
4284
4644
  the dialog opened. Built-in triggers call this with `'escape'`/`'backdrop'`/`'close-button'`; a
4285
4645
  consumer's own close affordance (e.g. a footer action button) should call it directly with its own
4286
4646
  reason string so every dismissal path funnels through the same event.
4287
4647
 
4288
- **Events:** `lyra-dialog-close` (`detail: ToolResultDialogCloseReason` — `'escape'|'backdrop'|
4648
+ **Events:** `lyra-close` (`detail: ToolResultDialogCloseReason` — `'escape'|'backdrop'|
4289
4649
  'close-button'|'api'|string`) fired exactly once per dismissal; `lyra-maximize-change` (`detail:
4290
4650
  boolean`, the new `maximized` state) fired when the header's maximize/restore toggle is clicked.
4291
4651
 
@@ -4300,7 +4660,8 @@ tool name/status/duration), `tool-name`, `status`, `duration`, `header-actions`,
4300
4660
  **Themeable custom properties:** `--lyra-tool-result-dialog-overlay-color` (default `rgb(0 0 0 /
4301
4661
  0.5)` — the backdrop scrim color; component-specific since no shared overlay token exists),
4302
4662
  `--lyra-tool-result-dialog-maximized-inset` (default `var(--lyra-space-l)` — inset applied to the
4303
- panel while `[maximized]`, overridable e.g. to leave a persistent app rail visible), plus shared
4663
+ panel while `[maximized]`, overridable e.g. to leave a persistent app rail visible), and
4664
+ `--lyra-tool-result-dialog-spin` (default `1s linear`, stopped under reduced motion), plus shared
4304
4665
  tokens `--lyra-color-surface/-border/-text-quiet/-brand/-brand-quiet/-success/-success-quiet/
4305
4666
  -danger/-danger-quiet/-warning/-warning-quiet`, `--lyra-space-*`, `--lyra-radius`, `--lyra-shadow`,
4306
4667
  `--lyra-icon-button-size`, `--lyra-focus-ring-*`, `--lyra-transition-base`.
@@ -4313,7 +4674,7 @@ tokens `--lyra-color-surface/-border/-text-quiet/-brand/-brand-quiet/-success/-s
4313
4674
  status="success"
4314
4675
  duration-ms="1240"
4315
4676
  ?open=${dialogOpen}
4316
- @lyra-dialog-close=${(e) => (dialogOpen = false)}
4677
+ @lyra-close=${(e) => (dialogOpen = false)}
4317
4678
  @lyra-maximize-change=${(e) => console.log('maximized:', e.detail)}
4318
4679
  >
4319
4680
  <lyra-tabs slot="body">
@@ -4344,7 +4705,7 @@ state, so no additional scroll-lock/focus-trap bookkeeping is needed for that tr
4344
4705
  panel template so a slotted `<lyra-tabs>` (or any other light-DOM-scanning child) sees real
4345
4706
  projected content rather than a forwarding `<slot>`, while still sharing the overlay stack
4346
4707
  - `close()` is a no-op when `open` is already `false` — calling it twice in a row only fires
4347
- `lyra-dialog-close` once
4708
+ `lyra-close` once
4348
4709
  - the `maximize`/`close` buttons are always the first elements in the Tab order while open,
4349
4710
  regardless of visual position, followed by `body` then `footer` content
4350
4711
 
@@ -4374,14 +4735,24 @@ reveals the invalid state, and `form.reset()` clears the touched presentation.
4374
4735
  built-in button's icon/label (send vs. stop) and whether Enter still submits
4375
4736
  - `submitOnEnter: boolean = true` (reflected, attribute `submit-on-enter`) — when `false`, Enter
4376
4737
  always inserts a newline instead of submitting
4738
+ - `stoppable: boolean = true` (reflected) — when false, busy states keep a disabled Send button
4739
+ instead of exposing a Stop action
4740
+ - `accessibleLabel: string | null = null` (attribute `aria-label`) — names the internal textarea;
4741
+ wins over placeholder and the localized composer label
4377
4742
  - `spellcheck: boolean = true` — forwarded to the internal `<textarea>`
4378
4743
  - `autocapitalize: string = ''` — forwarded to the internal `<textarea>`; empty omits the attribute
4379
4744
  - `autoCorrect: string = ''` (attribute `autocorrect`) — forwarded to the internal `<textarea>`
4380
4745
  (Safari/WebKit-specific); empty omits the attribute. Named `autoCorrect`, not `autocorrect`, only
4381
4746
  to dodge a `lib.dom.d.ts` collision with `HTMLElement`'s own `boolean`-typed `autocorrect` IDL
4382
4747
  member; the host attribute is explicitly mapped to plain `autocorrect`.
4748
+ - `wrap: 'hard' | 'soft' | 'off' = 'soft'`, `autocomplete: string = ''`, `inputMode: string = ''`
4749
+ (attribute `inputmode`), and `enterKeyHint: string = ''` (attribute `enterkeyhint`) — forwarded to
4750
+ the native textarea
4751
+ - `selectionStart`, `selectionEnd`, and `selectionDirection` — native selection getters/setters
4383
4752
 
4384
- **Methods (own):** none beyond the inherited `checkValidity()`/`reportValidity()`.
4753
+ **Methods (own):** `focus(options?)`, `blur()`, `select()`, `setSelectionRange()`, and
4754
+ `setRangeText()` forward to the textarea; `setRangeText()` synchronizes reactive/form value and
4755
+ auto-sizing. `checkValidity()`/`reportValidity()` remain inherited.
4385
4756
 
4386
4757
  **Events:**
4387
4758
  - `lyra-input` (`detail: { value }`) — fired on every user-driven edit of the textarea, not a
@@ -4496,12 +4867,12 @@ wins when both are present.
4496
4867
  attachment, leaving only the thumbnail. Has no effect for a non-image chip, or when `compact` is
4497
4868
  unset. `false` (the default) reproduces the chip's exact existing output.
4498
4869
  - `removeLabel: string = 'Remove'` (attribute `remove-label`) — verb used in the remove button's
4499
- `aria-label`, interpolated as `` `${removeLabel} ${displayName}` ``; override for i18n/locale
4870
+ accessible name; the default routes through the complete localized `removeWithContext` template
4500
4871
  - `retryLabel: string = 'Retry'` (attribute `retry-label`) — verb used in the retry button's
4501
- `aria-label`, interpolated as `` `${retryLabel} ${displayName}` ``; override for i18n/locale
4872
+ accessible name; the default routes through the complete localized attachment template
4502
4873
  - `uploadingLabel: string = 'Uploading'` (attribute `uploading-label`) — verb used in the visible
4503
- uploading status text, rendered as `` `${uploadingLabel} ${percent}%` `` once progress is a
4504
- meaningful number, else `` `${uploadingLabel}…` ``; override for i18n/locale
4874
+ uploading status; the untouched default uses complete localized messages for progress,
4875
+ indeterminate state, and filename context so translators can reorder every value
4505
4876
  - `uploadFailedLabel: string = 'Upload failed'` (attribute `upload-failed-label`) — visible status
4506
4877
  text shown for `status="error"`; override for i18n/locale
4507
4878
 
@@ -4526,7 +4897,8 @@ generated internal id is used as a last resort.
4526
4897
  `done` → success/success-quiet/transparent); `--lyra-attachment-chip-compact-thumbnail-size` (default
4527
4898
  `1.75rem`), `--lyra-attachment-chip-compact-font-size` (default `var(--lyra-font-size-xs)`),
4528
4899
  `--lyra-attachment-chip-compact-gap` (default `0.25rem`) — govern the chip's thumbnail size, text
4529
- size, and internal gap while `compact` is set; plus shared tokens `--lyra-space-xs`, `--lyra-space-s`,
4900
+ size, and internal gap while `compact` is set; `--lyra-attachment-chip-spinner-duration` (default
4901
+ `0.8s`) controls the indeterminate rotation and stops under reduced motion; plus shared tokens `--lyra-space-xs`, `--lyra-space-s`,
4530
4902
  `--lyra-radius`, `--lyra-color-text`, `--lyra-color-danger`, `--lyra-icon-button-size`,
4531
4903
  `--lyra-transition-fast`, `--lyra-transition-base`, `--lyra-focus-ring-width`,
4532
4904
  `--lyra-focus-ring-color`, `--lyra-focus-ring-offset`.
@@ -5287,7 +5659,8 @@ anything about `<lyra-source-card>`, it only carries the id through its event de
5287
5659
  echoed back verbatim in both events; never read or validated by this component.
5288
5660
  - `href: string = ''` — optional direct link target for the citation's source, carried into
5289
5661
  `lyra-citation-open`'s detail as-is; this component never navigates.
5290
- - `label: string = ''` — overrides the computed accessible name (`"Citation {index}[, {status}]"`).
5662
+ - `label: string = ''` — overrides the computed accessible name. The built-in citation/status
5663
+ summary is a complete localized template; a host `aria-label` has highest precedence.
5291
5664
 
5292
5665
  **Events:**
5293
5666
  - `lyra-citation-activate` (`detail: { sourceId: string; index: number }`) — fires on click, or on
@@ -5301,6 +5674,8 @@ anything about `<lyra-source-card>`, it only carries the id through its event de
5301
5674
  **Slots:** default — rich preview/tooltip content (e.g. a filename + excerpt), shown in a floating
5302
5675
  popover on hover/focus. This is *not* the badge's visible content (the badge always renders
5303
5676
  `[index]`); nothing renders at all (no hover affordance) when this slot is empty.
5677
+ When populated, the button carries `aria-describedby` referencing the same-shadow-tree popover,
5678
+ which owns `role="tooltip"` whether currently shown or hidden.
5304
5679
 
5305
5680
  **CSS parts:** `base` (the clickable `<button>`), `bracket` (each of the two literal `[`/`]` glyphs),
5306
5681
  `index` (the citation number), `popover` (the floating preview panel, only meaningful while open).
@@ -5412,7 +5787,8 @@ while collapsed).
5412
5787
  expand/collapse, which only ever hides/shows the *set* of cards, never a single card's own content.
5413
5788
  - `lyra-open` (`detail: { sourceId: string; href?: string }`) — the title was activated. This
5414
5789
  component never navigates on its own (a controlled component, the same convention
5415
- `<lyra-tool-call-chip>`'s `lyra-tool-chip-select` follows); a listener decides what "open" means.
5790
+ `<lyra-tool-call-chip>`'s `lyra-tool-call-chip-select` follows); a listener decides what "open"
5791
+ means.
5416
5792
 
5417
5793
  **Slots:** `excerpt` (a short preview; when left empty, the `excerpt` part collapses away entirely —
5418
5794
  its wrapper is `hidden`, not just visually empty), `full` (the complete source text/chunk, hidden
@@ -6192,6 +6568,8 @@ and it's what every instance renders at zero extra bytes until shiki resolves.
6192
6568
  `"json"`); when unset, or when shiki doesn't recognize it, the code renders as plain unhighlighted
6193
6569
  text regardless of whether shiki itself is available
6194
6570
  - `filename: string = ''` — shown in the header, when set
6571
+ - `accessibleLabel: string = ''` (attribute `aria-label`) — names the internal focusable code-body
6572
+ region; otherwise a localized filename/language description is generated
6195
6573
  - `collapsible: boolean = false` (reflected) — shows the collapse/expand chevron button
6196
6574
  - `collapsed: boolean = false` (reflected) — only has a visible effect while `collapsible` is also
6197
6575
  true
@@ -6302,6 +6680,8 @@ toggle, the loading-skeleton behavior while the fine-grained highlighter resolve
6302
6680
  key in `languages`, the code renders as plain unhighlighted text — this component has no
6303
6681
  default/full-table highlighter to fall back to.
6304
6682
  - `filename: string = ''` — shown in the header, when set.
6683
+ - `accessibleLabel: string = ''` (attribute `aria-label`) — names the internal focusable code-body
6684
+ region; otherwise a localized filename/language description is generated.
6305
6685
  - `collapsible: boolean = false` (reflected) — shows the collapse/expand chevron button.
6306
6686
  - `collapsed: boolean = false` (reflected) — only has a visible effect while `collapsible` is also
6307
6687
  true.
@@ -6749,6 +7129,21 @@ not rendered at all for `type="normal"`)
6749
7129
 
6750
7130
  **Optional peer deps:** none.
6751
7131
 
7132
+ ### `lyra-dropdown-item`
7133
+
7134
+ Compatibility naming alias for `<lyra-menu-item>`. It is a subclass of the same implementation,
7135
+ so `value`, `disabled`, `destructive`, `type`, `checked`, `select()`, checkbox events, and menu
7136
+ roving focus behave identically.
7137
+
7138
+ **Slots:** default label content and optional `icon`.
7139
+
7140
+ ```html
7141
+ <lyra-menu>
7142
+ <button slot="trigger">Actions</button>
7143
+ <lyra-dropdown-item value="archive">Archive</lyra-dropdown-item>
7144
+ </lyra-menu>
7145
+ ```
7146
+
6752
7147
  ```html
6753
7148
  <lyra-menu label="Row actions">
6754
7149
  <button slot="trigger" aria-label="More actions">⋮</button>
@@ -6871,9 +7266,9 @@ children are the chips (the same shape `<lyra-split>`'s panels / `<lyra-source-l
6871
7266
  no `.items` array prop).
6872
7267
 
6873
7268
  **Properties:**
6874
- - `maxVisible?: number` (attribute `max-visible`) — maximum number of direct children shown before
6875
- the rest collapse behind a "+N" indicator; unset (the default) means no limit, every child is
6876
- always shown
7269
+ - `maxVisible?: number` (attribute `max-visible`) — maximum number of assigned children shown before
7270
+ the rest collapse behind a "+N" indicator; flattened slot-forwarded children count the same as
7271
+ direct children. Unset means no limit
6877
7272
 
6878
7273
  **Events:** `lyra-overflow-toggle` (`detail: { expanded }` — the overflow indicator was activated,
6879
7274
  revealing or re-collapsing the excess children; fires only from that click, i.e. only when
@@ -7032,6 +7427,9 @@ used" summary.
7032
7427
  - `label: string = ''` — overall accessible caption, e.g. `"128K context window"`. Also rendered
7033
7428
  visually (`[part="label"]`) when set.
7034
7429
 
7430
+ Accessible summaries, segment tooltips, and ring titles format quantities using `effectiveLocale`.
7431
+ A host `aria-label` overrides the generated meter summary and is preserved across reactive updates.
7432
+
7035
7433
  **Events:** none.
7036
7434
 
7037
7435
  **Slots:** none.
@@ -7228,6 +7626,8 @@ fallback simply omits `[part="download-link"]` entirely.
7228
7626
  `<img>`/the anchor.
7229
7627
  - `mimeType: string = ''` (attribute `mime-type`) — drives format dispatch (see above).
7230
7628
  - `filename: string = ''` — shown in the header and used as the download link's suggested filename.
7629
+ - `alt?: string` — image description. When omitted, the filename/localized image-preview fallback
7630
+ is used; an explicit empty string keeps a decorative preview's `alt=""` intact.
7231
7631
  - `status: 'idle' | 'converting' | 'ready' | 'error' = 'idle'` (reflected) — host-owned lifecycle
7232
7632
  state. `"converting"` shows the spinner regardless of `mimeType`/`src`; `"error"` shows
7233
7633
  `errorMessage` regardless of either. `"idle"`/`"ready"` both resume normal format dispatch — a host
@@ -7262,8 +7662,8 @@ above; excludes `data:` even though the other two sinks allow it)
7262
7662
  **Themeable custom properties:** `--lyra-document-preview-max-height` (default `none`) — the
7263
7663
  consumer-tunable scroll cap on `[part="body"]`, set from `max-height`; `none` means the preview grows
7264
7664
  with its content until a caller opts in. `--lyra-document-preview-font` (default `ui-monospace,
7265
- SFMono-Regular, Menlo, Consolas, monospace`) no shared `--wa-*`/`--lyra-*` monospace token exists yet
7266
- (the same gap `lyra-json-viewer`'s own `--lyra-json-viewer-font` documents). Plus shared tokens
7665
+ SFMono-Regular, Menlo, Consolas, monospace`) and `--lyra-document-preview-spin-duration` (default
7666
+ `0.8s`, stopped under reduced motion). Plus shared tokens
7267
7667
  `--lyra-color-border`, `--lyra-radius`, `--lyra-color-surface`, `--lyra-space-s/-m/-l/-xs`,
7268
7668
  `--lyra-color-text`, `--lyra-color-text-quiet`, `--lyra-color-danger`, `--lyra-color-brand`,
7269
7669
  `--lyra-color-on-brand`, `--lyra-focus-ring-width/-color/-offset`, `--lyra-transition-fast`.
@@ -7304,6 +7704,8 @@ available, the region becomes a standard `role="progressbar"` instead, self-desc
7304
7704
  - The component's own text/JSON `fetch(src)` is a *different* async operation from the host-driven
7305
7705
  `status="converting"` conversion. A failed fetch fires `lyra-render-error` and renders
7306
7706
  `[part="error"]` on its own; it never sets `status="error"` itself.
7707
+ - changing `src` aborts the superseded text fetch as well as ignoring any stale completion; removing
7708
+ the component aborts its active request.
7307
7709
  - `progress` is only ever consulted for the host-driven `"converting"` state — this component's own
7308
7710
  in-flight text fetch always renders the indeterminate spinner, with no numeric-progress path.
7309
7711
  - The `unsupported` slot's initial presence is detected once, before the first render, by scanning
@@ -7340,6 +7742,8 @@ final.
7340
7742
  filename, and folded into the accessible name.
7341
7743
  - `alt: string = ''` — alt text for the image case (and reused as a video label fallback). Falls
7342
7744
  back to `filename`, then a generic per-kind description.
7745
+ - `accessibleLabel: string = ''` (attribute `aria-label`) — overrides the localized action name on
7746
+ the actual button/link without replacing image alt text or the video control's own label
7343
7747
  - `maxHeight: string = ''` (attribute `max-height`) — a CSS length (e.g. `"16rem"`); once set,
7344
7748
  overrides the `--lyra-media-card-max-height` custom property for this instance only (applied
7345
7749
  inline on `[part="base"]`, so it reliably wins over a `:host{}`-declared default from outside the
@@ -7638,6 +8042,8 @@ user-menu affordance.
7638
8042
  - `src?: string` — image URL; takes priority over `initials` when set and loads successfully, falling
7639
8043
  back to `initials` on a load error.
7640
8044
  - `alt: string = ''` — image alt text; set alongside `src` for accessibility.
8045
+ - host `aria-label` — overrides `alt` as the image/fallback accessible name without changing the
8046
+ visible initials or image
7641
8047
  - `size: 'sm' | 'md' | 'lg' = 'md'` (reflected).
7642
8048
  - `shape: 'circle' | 'square' = 'circle'` (reflected).
7643
8049
  - `tone: 'neutral' | 'brand' | 'success' | 'warning' | 'danger' = 'neutral'` (reflected) — recolors
@@ -7666,13 +8072,10 @@ var(--lyra-color-border))`, swapped per `tone`), `--lyra-avatar-color` (default
7666
8072
  ```
7667
8073
 
7668
8074
  **Known gotchas:**
7669
- - an image load failure falls back to `initials` automatically (an `error` listener flips internal
7670
- state) there's no manual reset/retry method; reassigning `src` (even to the same value)
7671
- re-attempts the load.
7672
- - the initials fallback is `aria-hidden="true"` whenever `alt` is set, regardless of whether an image
7673
- is actually showing — so if `src`/`alt` are both set but the image fails to load, the rendered
7674
- initials text is still hidden from assistive tech, leaving the avatar with no accessible name of
7675
- its own unless the surrounding context supplies one.
8075
+ - an image load failure falls back to `initials` automatically. Changing `src` clears the failure
8076
+ state so the replacement URL gets its own load attempt.
8077
+ - when `alt` or host `aria-label` supplies a name, the base preserves that name through the
8078
+ initials fallback while hiding duplicate initials text from assistive technology.
7676
8079
 
7677
8080
  ---
7678
8081
 
@@ -7732,6 +8135,164 @@ the `footer` slot, hidden entirely when empty).
7732
8135
 
7733
8136
  ---
7734
8137
 
8138
+ ## `lyra-radio`
8139
+
8140
+ A form-associated single-choice control. Use it alone or inside `lyra-radio-group`.
8141
+
8142
+ **Properties:** `checked`, `disabled`, `required`, `name`, and `value` (all reflected where
8143
+ applicable). A selected radio submits its value through `ElementInternals`.
8144
+
8145
+ **Events:** native-style composed `input` and `change`, plus `lyra-change` with
8146
+ `{ checked, value }`.
8147
+
8148
+ **Slots:** default label content.
8149
+
8150
+ **CSS parts:** `base`, `circle`, `dot`, `label`.
8151
+
8152
+ ```html
8153
+ <lyra-radio name="format" value="json">JSON</lyra-radio>
8154
+ ```
8155
+
8156
+ ## `lyra-popover`
8157
+
8158
+ A click-triggered, light-dismiss floating surface positioned with the shared Floating UI positioner.
8159
+
8160
+ **Properties:** `open`, `placement`, `distance`, `accessibleLabel` (`aria-label`), and `popupRole` (`popup-role`).
8161
+ **Events:** `lyra-show`, `lyra-hide`. **Slots:** `trigger`, default content. **CSS parts:** `trigger`,
8162
+ `popup`, `content`.
8163
+
8164
+ ## `lyra-tooltip`
8165
+
8166
+ A hover/focus tooltip positioned with the shared Floating UI positioner.
8167
+
8168
+ **Properties:** `open`, `manual`, `delay`, `placement`, `distance`, `content`, and
8169
+ `accessibleLabel` (`aria-label`). **Slots:** `trigger`, default content. **CSS parts:**
8170
+ `trigger`, `popup`.
8171
+
8172
+ ## `lyra-dropdown`
8173
+
8174
+ A menu-role popover for consumer-supplied action content. Compose `lyra-menu` when full roving
8175
+ menu-item behavior is needed.
8176
+
8177
+ **Properties:** `open`, `placement`, `distance`, `accessibleLabel` (`aria-label`), and `popupRole` (`popup-role`).
8178
+ **Slots:** `trigger`, default menu content. **CSS parts:** `trigger`, `popup`, `content`.
8179
+
8180
+ ## `lyra-radio-group`
8181
+
8182
+ A labeled, keyboard-navigable group of `lyra-radio` controls. Arrow keys, Home, and End move
8183
+ focus; arrow navigation selects the next enabled radio.
8184
+
8185
+ **Properties:** `label`, `hint`, `errorText` (`error-text`), `name`, `required`, `disabled`, and
8186
+ `aria-label` (through `accessibleLabel`).
8187
+
8188
+ **Events:** `lyra-change` with `{ value, radio }`.
8189
+
8190
+ **Slots:** default radios, `label`, `hint`, `error`.
8191
+
8192
+ **CSS parts:** `base`, `label`, `hint`, `error`.
8193
+
8194
+ ## `lyra-spinner`
8195
+
8196
+ An indeterminate busy indicator with a localized `role="status"` name.
8197
+
8198
+ **Properties:** `labelPlacement` (`label-placement`): `'none' | 'after'` and `accessibleLabel`
8199
+ (`accessible-label`).
8200
+
8201
+ **Slots:** default optional visible label. **CSS parts:** `base`, `spinner`, `label`.
8202
+
8203
+ ## `lyra-progress-bar`
8204
+
8205
+ A determinate or indeterminate progress bar.
8206
+
8207
+ **Properties:** `value`, `max`, `indeterminate`, `variant`, `showValue` (`show-value`), and
8208
+ `accessibleLabel` (`accessible-label`).
8209
+ The rendered progressbar exposes `aria-valuemin`, `aria-valuemax`, and `aria-valuenow` when
8210
+ determinate.
8211
+
8212
+ **Slots:** `label`. **CSS parts:** `base`, `track`, `indicator`, `label`.
8213
+
8214
+ ## `lyra-progress-ring`
8215
+
8216
+ A circular progress indicator with the same value contract as `lyra-progress-bar`.
8217
+
8218
+ **Properties:** `value`, `max`, `indeterminate`, and `accessibleLabel` (`accessible-label`).
8219
+ **Slots:** default center label. **CSS parts:** `base`, `track`, `indicator`, `label`.
8220
+
8221
+ ## `lyra-badge` and `lyra-tag`
8222
+
8223
+ Compact status labels. Both expose `variant: 'neutral' | 'brand' | 'success' | 'warning' | 'danger'`.
8224
+ The two tags share the same visual contract; `lyra-tag` is a semantic alias for migration-friendly
8225
+ markup.
8226
+
8227
+ **Slots:** default content. **CSS parts:** `base`.
8228
+
8229
+ ## `lyra-callout`
8230
+
8231
+ An inline status, warning, or error surface.
8232
+
8233
+ **Properties:** `variant`, `heading`, `closable`, `open`, and `accessibleLabel` (`accessible-label`).
8234
+
8235
+ **Events:** cancelable `lyra-close`; the callout hides after the event unless a listener calls
8236
+ `preventDefault()`.
8237
+
8238
+ **Slots:** default message, `heading`, `icon`. **CSS parts:** `base`, `icon`, `content`, `heading`,
8239
+ `close-button`.
8240
+
8241
+ ## `lyra-details`, `lyra-accordion`, and `lyra-accordion-item`
8242
+
8243
+ `lyra-details` is a native-semantics disclosure panel. `lyra-accordion` coordinates slotted
8244
+ details panels and closes siblings unless `multiple` is true. `lyra-accordion-item` is an
8245
+ accordion-compatible alias.
8246
+
8247
+ **Properties:** `open`, `disabled`, and `summary` on details/items; `multiple` on accordion.
8248
+ **Events:** `lyra-toggle` with `{ open }` from details/items. **Slots:** `summary` and default
8249
+ content on details/items; default panels on accordion. **CSS parts:** `base`, `summary`, `content`
8250
+ on details/items; `base` on accordion.
8251
+
8252
+ ## `lyra-divider`
8253
+
8254
+ A semantic separator with `orientation: 'horizontal' | 'vertical'`. **CSS part:** `base`.
8255
+
8256
+ ## `lyra-breadcrumb` and `lyra-breadcrumb-item`
8257
+
8258
+ Responsive navigation trail primitives. Breadcrumb has `accessibleLabel` (`accessible-label`);
8259
+ items have `href` and `current`. Breadcrumb slots default items; item slots default label content.
8260
+ Breadcrumb exposes `base`; item exposes `base`.
8261
+
8262
+ ## `lyra-format-number`
8263
+
8264
+ Locale-aware `Intl.NumberFormat` output. **Properties:** `value`, `locale`, `currency`, `notation`,
8265
+ `minimumFractionDigits`, and `maximumFractionDigits`. Default slot is fallback content for a
8266
+ non-finite value.
8267
+
8268
+ ## `lyra-format-date`
8269
+
8270
+ Locale-aware `Intl.DateTimeFormat` output. **Properties:** `date`, `locale`, `year`, `month`, `day`,
8271
+ `dateStyle`, and `timeStyle`. Default slot is fallback content for an invalid date.
8272
+
8273
+ ## `lyra-format-bytes`
8274
+
8275
+ Locale-aware byte-size output. **Properties:** `value`, `locale`, `unitStep` (`unit-step`), and
8276
+ `decimals`.
8277
+
8278
+ ## `lyra-relative-time`
8279
+
8280
+ Locale-aware relative time output. **Properties:** `date`, `locale`, `unit`, `numeric`, and `sync`.
8281
+ When `sync` is true the displayed value refreshes periodically.
8282
+
8283
+ ## `lyra-rating`
8284
+
8285
+ A keyboard-accessible star rating control with slider semantics. **Properties:** `value`, `max`,
8286
+ `precision`, `readonly`, `disabled`, and `accessibleLabel` (`aria-label`). **Events:**
8287
+ `lyra-change` with `{ value }`. **CSS parts:** `base`, `star`.
8288
+
8289
+ ## `lyra-color-picker`
8290
+
8291
+ A form-associated native color picker with label and hint chrome. **Properties:** the shared form
8292
+ properties `name`, `value`, `disabled`, and `required`, plus `label`, `hint`, and `accessibleLabel`
8293
+ (`aria-label`). **Slots:** `label`, `hint`. **Events:** composed `input` and `change`, plus
8294
+ `lyra-change` with `{ value }`. **CSS parts:** `form-control`, `label`, `input`, `hint`.
8295
+
7735
8296
  ## Cross-cutting notes
7736
8297
 
7737
8298
  These apply across the whole library rather than to any one component: