@aceshooting/lyra-ui 2.13.0 → 3.1.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 (362) hide show
  1. package/README.md +103 -28
  2. package/custom-elements.json +13276 -4793
  3. package/dist/components/archive-viewer/archive-loader.d.ts +8 -0
  4. package/dist/components/archive-viewer/archive-loader.d.ts.map +1 -0
  5. package/dist/components/archive-viewer/archive-loader.js +19 -0
  6. package/dist/components/archive-viewer/archive-loader.js.map +1 -0
  7. package/dist/components/archive-viewer/archive-viewer-register.d.ts +2 -0
  8. package/dist/components/archive-viewer/archive-viewer-register.d.ts.map +1 -0
  9. package/dist/components/archive-viewer/archive-viewer-register.js +8 -0
  10. package/dist/components/archive-viewer/archive-viewer-register.js.map +1 -0
  11. package/dist/components/archive-viewer/archive-viewer.class.d.ts +47 -0
  12. package/dist/components/archive-viewer/archive-viewer.class.d.ts.map +1 -0
  13. package/dist/components/archive-viewer/archive-viewer.class.js +115 -0
  14. package/dist/components/archive-viewer/archive-viewer.class.js.map +1 -0
  15. package/dist/components/archive-viewer/archive-viewer.d.ts +4 -0
  16. package/dist/components/archive-viewer/archive-viewer.d.ts.map +1 -0
  17. package/dist/components/archive-viewer/archive-viewer.js +7 -0
  18. package/dist/components/archive-viewer/archive-viewer.js.map +1 -0
  19. package/dist/components/archive-viewer/archive-viewer.styles.d.ts +2 -0
  20. package/dist/components/archive-viewer/archive-viewer.styles.d.ts.map +1 -0
  21. package/dist/components/archive-viewer/archive-viewer.styles.js +14 -0
  22. package/dist/components/archive-viewer/archive-viewer.styles.js.map +1 -0
  23. package/dist/components/attachment-chip/attachment-chip.styles.js +2 -2
  24. package/dist/components/button/button.class.d.ts +7 -9
  25. package/dist/components/button/button.class.d.ts.map +1 -1
  26. package/dist/components/button/button.class.js +12 -14
  27. package/dist/components/button/button.class.js.map +1 -1
  28. package/dist/components/button/button.styles.d.ts.map +1 -1
  29. package/dist/components/button/button.styles.js +30 -10
  30. package/dist/components/button/button.styles.js.map +1 -1
  31. package/dist/components/calendar-viewer/calendar-loader.d.ts +5 -0
  32. package/dist/components/calendar-viewer/calendar-loader.d.ts.map +1 -0
  33. package/dist/components/calendar-viewer/calendar-loader.js +18 -0
  34. package/dist/components/calendar-viewer/calendar-loader.js.map +1 -0
  35. package/dist/components/calendar-viewer/calendar-viewer.class.d.ts +55 -0
  36. package/dist/components/calendar-viewer/calendar-viewer.class.d.ts.map +1 -0
  37. package/dist/components/calendar-viewer/calendar-viewer.class.js +123 -0
  38. package/dist/components/calendar-viewer/calendar-viewer.class.js.map +1 -0
  39. package/dist/components/calendar-viewer/calendar-viewer.d.ts +3 -0
  40. package/dist/components/calendar-viewer/calendar-viewer.d.ts.map +1 -0
  41. package/dist/components/calendar-viewer/calendar-viewer.js +12 -0
  42. package/dist/components/calendar-viewer/calendar-viewer.js.map +1 -0
  43. package/dist/components/calendar-viewer/calendar-viewer.styles.d.ts +2 -0
  44. package/dist/components/calendar-viewer/calendar-viewer.styles.d.ts.map +1 -0
  45. package/dist/components/calendar-viewer/calendar-viewer.styles.js +16 -0
  46. package/dist/components/calendar-viewer/calendar-viewer.styles.js.map +1 -0
  47. package/dist/components/callout/callout.class.d.ts +4 -0
  48. package/dist/components/callout/callout.class.d.ts.map +1 -1
  49. package/dist/components/callout/callout.class.js +7 -0
  50. package/dist/components/callout/callout.class.js.map +1 -1
  51. package/dist/components/callout/callout.styles.d.ts.map +1 -1
  52. package/dist/components/callout/callout.styles.js +13 -0
  53. package/dist/components/callout/callout.styles.js.map +1 -1
  54. package/dist/components/chat-message/chat-message.styles.js +1 -1
  55. package/dist/components/code-block/code-block-core.class.d.ts +3 -0
  56. package/dist/components/code-block/code-block-core.class.d.ts.map +1 -1
  57. package/dist/components/code-block/code-block-core.class.js +41 -16
  58. package/dist/components/code-block/code-block-core.class.js.map +1 -1
  59. package/dist/components/code-block/code-block.class.d.ts +3 -0
  60. package/dist/components/code-block/code-block.class.d.ts.map +1 -1
  61. package/dist/components/code-block/code-block.class.js +41 -16
  62. package/dist/components/code-block/code-block.class.js.map +1 -1
  63. package/dist/components/code-block/code-block.styles.d.ts.map +1 -1
  64. package/dist/components/code-block/code-block.styles.js +17 -1
  65. package/dist/components/code-block/code-block.styles.js.map +1 -1
  66. package/dist/components/code-block/code-loader.d.ts +2 -0
  67. package/dist/components/code-block/code-loader.d.ts.map +1 -1
  68. package/dist/components/code-block/code-loader.js +14 -4
  69. package/dist/components/code-block/code-loader.js.map +1 -1
  70. package/dist/components/code-block/greycat-language.d.ts +9 -0
  71. package/dist/components/code-block/greycat-language.d.ts.map +1 -0
  72. package/dist/components/code-block/greycat-language.js +73 -0
  73. package/dist/components/code-block/greycat-language.js.map +1 -0
  74. package/dist/components/contact-viewer/contact-viewer.class.d.ts +31 -0
  75. package/dist/components/contact-viewer/contact-viewer.class.d.ts.map +1 -0
  76. package/dist/components/contact-viewer/contact-viewer.class.js +92 -0
  77. package/dist/components/contact-viewer/contact-viewer.class.js.map +1 -0
  78. package/dist/components/contact-viewer/contact-viewer.d.ts +3 -0
  79. package/dist/components/contact-viewer/contact-viewer.d.ts.map +1 -0
  80. package/dist/components/contact-viewer/contact-viewer.js +13 -0
  81. package/dist/components/contact-viewer/contact-viewer.js.map +1 -0
  82. package/dist/components/contact-viewer/contact-viewer.styles.d.ts +2 -0
  83. package/dist/components/contact-viewer/contact-viewer.styles.d.ts.map +1 -0
  84. package/dist/components/contact-viewer/contact-viewer.styles.js +16 -0
  85. package/dist/components/contact-viewer/contact-viewer.styles.js.map +1 -0
  86. package/dist/components/contact-viewer/vcard.d.ts +31 -0
  87. package/dist/components/contact-viewer/vcard.d.ts.map +1 -0
  88. package/dist/components/contact-viewer/vcard.js +87 -0
  89. package/dist/components/contact-viewer/vcard.js.map +1 -0
  90. package/dist/components/csv-viewer/csv-loader.d.ts +8 -0
  91. package/dist/components/csv-viewer/csv-loader.d.ts.map +1 -0
  92. package/dist/components/csv-viewer/csv-loader.js +19 -0
  93. package/dist/components/csv-viewer/csv-loader.js.map +1 -0
  94. package/dist/components/csv-viewer/csv-viewer.class.d.ts +31 -0
  95. package/dist/components/csv-viewer/csv-viewer.class.d.ts.map +1 -0
  96. package/dist/components/csv-viewer/csv-viewer.class.js +108 -0
  97. package/dist/components/csv-viewer/csv-viewer.class.js.map +1 -0
  98. package/dist/components/csv-viewer/csv-viewer.d.ts +3 -0
  99. package/dist/components/csv-viewer/csv-viewer.d.ts.map +1 -0
  100. package/dist/components/csv-viewer/csv-viewer.js +9 -0
  101. package/dist/components/csv-viewer/csv-viewer.js.map +1 -0
  102. package/dist/components/csv-viewer/csv-viewer.styles.d.ts +2 -0
  103. package/dist/components/csv-viewer/csv-viewer.styles.d.ts.map +1 -0
  104. package/dist/components/csv-viewer/csv-viewer.styles.js +14 -0
  105. package/dist/components/csv-viewer/csv-viewer.styles.js.map +1 -0
  106. package/dist/components/dataset-viewer/dataset-loader.d.ts +7 -0
  107. package/dist/components/dataset-viewer/dataset-loader.d.ts.map +1 -0
  108. package/dist/components/dataset-viewer/dataset-loader.js +19 -0
  109. package/dist/components/dataset-viewer/dataset-loader.js.map +1 -0
  110. package/dist/components/dataset-viewer/dataset-viewer.class.d.ts +34 -0
  111. package/dist/components/dataset-viewer/dataset-viewer.class.d.ts.map +1 -0
  112. package/dist/components/dataset-viewer/dataset-viewer.class.js +93 -0
  113. package/dist/components/dataset-viewer/dataset-viewer.class.js.map +1 -0
  114. package/dist/components/dataset-viewer/dataset-viewer.d.ts +3 -0
  115. package/dist/components/dataset-viewer/dataset-viewer.d.ts.map +1 -0
  116. package/dist/components/dataset-viewer/dataset-viewer.js +13 -0
  117. package/dist/components/dataset-viewer/dataset-viewer.js.map +1 -0
  118. package/dist/components/dataset-viewer/dataset-viewer.styles.d.ts +2 -0
  119. package/dist/components/dataset-viewer/dataset-viewer.styles.d.ts.map +1 -0
  120. package/dist/components/dataset-viewer/dataset-viewer.styles.js +13 -0
  121. package/dist/components/dataset-viewer/dataset-viewer.styles.js.map +1 -0
  122. package/dist/components/date-picker/date-input.class.d.ts +4 -0
  123. package/dist/components/date-picker/date-input.class.d.ts.map +1 -1
  124. package/dist/components/date-picker/date-input.class.js +16 -0
  125. package/dist/components/date-picker/date-input.class.js.map +1 -1
  126. package/dist/components/details/details.class.d.ts +7 -2
  127. package/dist/components/details/details.class.d.ts.map +1 -1
  128. package/dist/components/details/details.class.js +23 -3
  129. package/dist/components/details/details.class.js.map +1 -1
  130. package/dist/components/dialog/dialog.styles.js +1 -1
  131. package/dist/components/document-viewer/document-viewer.class.d.ts +47 -0
  132. package/dist/components/document-viewer/document-viewer.class.d.ts.map +1 -0
  133. package/dist/components/document-viewer/document-viewer.class.js +141 -0
  134. package/dist/components/document-viewer/document-viewer.class.js.map +1 -0
  135. package/dist/components/document-viewer/document-viewer.d.ts +5 -0
  136. package/dist/components/document-viewer/document-viewer.d.ts.map +1 -0
  137. package/dist/components/document-viewer/document-viewer.js +8 -0
  138. package/dist/components/document-viewer/document-viewer.js.map +1 -0
  139. package/dist/components/document-viewer/document-viewer.styles.d.ts +2 -0
  140. package/dist/components/document-viewer/document-viewer.styles.d.ts.map +1 -0
  141. package/dist/components/document-viewer/document-viewer.styles.js +24 -0
  142. package/dist/components/document-viewer/document-viewer.styles.js.map +1 -0
  143. package/dist/components/document-viewer/registry.d.ts +30 -0
  144. package/dist/components/document-viewer/registry.d.ts.map +1 -0
  145. package/dist/components/document-viewer/registry.js +42 -0
  146. package/dist/components/document-viewer/registry.js.map +1 -0
  147. package/dist/components/docx-viewer/docx-loader.d.ts +11 -0
  148. package/dist/components/docx-viewer/docx-loader.d.ts.map +1 -0
  149. package/dist/components/docx-viewer/docx-loader.js +39 -0
  150. package/dist/components/docx-viewer/docx-loader.js.map +1 -0
  151. package/dist/components/docx-viewer/docx-viewer.class.d.ts +42 -0
  152. package/dist/components/docx-viewer/docx-viewer.class.d.ts.map +1 -0
  153. package/dist/components/docx-viewer/docx-viewer.class.js +131 -0
  154. package/dist/components/docx-viewer/docx-viewer.class.js.map +1 -0
  155. package/dist/components/docx-viewer/docx-viewer.d.ts +3 -0
  156. package/dist/components/docx-viewer/docx-viewer.d.ts.map +1 -0
  157. package/dist/components/docx-viewer/docx-viewer.js +12 -0
  158. package/dist/components/docx-viewer/docx-viewer.js.map +1 -0
  159. package/dist/components/docx-viewer/docx-viewer.styles.d.ts +2 -0
  160. package/dist/components/docx-viewer/docx-viewer.styles.d.ts.map +1 -0
  161. package/dist/components/docx-viewer/docx-viewer.styles.js +99 -0
  162. package/dist/components/docx-viewer/docx-viewer.styles.js.map +1 -0
  163. package/dist/components/docx-viewer/fixtures/minimal-docx-fixture.d.ts +2 -0
  164. package/dist/components/docx-viewer/fixtures/minimal-docx-fixture.d.ts.map +1 -0
  165. package/dist/components/docx-viewer/fixtures/minimal-docx-fixture.js +3 -0
  166. package/dist/components/docx-viewer/fixtures/minimal-docx-fixture.js.map +1 -0
  167. package/dist/components/ebook-viewer/ebook-loader.d.ts +9 -0
  168. package/dist/components/ebook-viewer/ebook-loader.d.ts.map +1 -0
  169. package/dist/components/ebook-viewer/ebook-loader.js +21 -0
  170. package/dist/components/ebook-viewer/ebook-loader.js.map +1 -0
  171. package/dist/components/ebook-viewer/ebook-viewer-register.d.ts +2 -0
  172. package/dist/components/ebook-viewer/ebook-viewer-register.d.ts.map +1 -0
  173. package/dist/components/ebook-viewer/ebook-viewer-register.js +9 -0
  174. package/dist/components/ebook-viewer/ebook-viewer-register.js.map +1 -0
  175. package/dist/components/ebook-viewer/ebook-viewer.class.d.ts +51 -0
  176. package/dist/components/ebook-viewer/ebook-viewer.class.d.ts.map +1 -0
  177. package/dist/components/ebook-viewer/ebook-viewer.class.js +164 -0
  178. package/dist/components/ebook-viewer/ebook-viewer.class.js.map +1 -0
  179. package/dist/components/ebook-viewer/ebook-viewer.d.ts +2 -0
  180. package/dist/components/ebook-viewer/ebook-viewer.d.ts.map +1 -0
  181. package/dist/components/ebook-viewer/ebook-viewer.js +5 -0
  182. package/dist/components/ebook-viewer/ebook-viewer.js.map +1 -0
  183. package/dist/components/ebook-viewer/ebook-viewer.styles.d.ts +2 -0
  184. package/dist/components/ebook-viewer/ebook-viewer.styles.d.ts.map +1 -0
  185. package/dist/components/ebook-viewer/ebook-viewer.styles.js +73 -0
  186. package/dist/components/ebook-viewer/ebook-viewer.styles.js.map +1 -0
  187. package/dist/components/ebook-viewer/fixtures/minimal-epub-fixture.d.ts +2 -0
  188. package/dist/components/ebook-viewer/fixtures/minimal-epub-fixture.d.ts.map +1 -0
  189. package/dist/components/ebook-viewer/fixtures/minimal-epub-fixture.js +2 -0
  190. package/dist/components/ebook-viewer/fixtures/minimal-epub-fixture.js.map +1 -0
  191. package/dist/components/email-viewer/email-loader.d.ts +10 -0
  192. package/dist/components/email-viewer/email-loader.d.ts.map +1 -0
  193. package/dist/components/email-viewer/email-loader.js +38 -0
  194. package/dist/components/email-viewer/email-loader.js.map +1 -0
  195. package/dist/components/email-viewer/email-viewer.class.d.ts +72 -0
  196. package/dist/components/email-viewer/email-viewer.class.d.ts.map +1 -0
  197. package/dist/components/email-viewer/email-viewer.class.js +154 -0
  198. package/dist/components/email-viewer/email-viewer.class.js.map +1 -0
  199. package/dist/components/email-viewer/email-viewer.d.ts +3 -0
  200. package/dist/components/email-viewer/email-viewer.d.ts.map +1 -0
  201. package/dist/components/email-viewer/email-viewer.js +12 -0
  202. package/dist/components/email-viewer/email-viewer.js.map +1 -0
  203. package/dist/components/email-viewer/email-viewer.styles.d.ts +2 -0
  204. package/dist/components/email-viewer/email-viewer.styles.d.ts.map +1 -0
  205. package/dist/components/email-viewer/email-viewer.styles.js +35 -0
  206. package/dist/components/email-viewer/email-viewer.styles.js.map +1 -0
  207. package/dist/components/file-icon/file-icon.class.d.ts +31 -0
  208. package/dist/components/file-icon/file-icon.class.d.ts.map +1 -0
  209. package/dist/components/file-icon/file-icon.class.js +74 -0
  210. package/dist/components/file-icon/file-icon.class.js.map +1 -0
  211. package/dist/components/file-icon/file-icon.d.ts +3 -0
  212. package/dist/components/file-icon/file-icon.d.ts.map +1 -0
  213. package/dist/components/file-icon/file-icon.js +6 -0
  214. package/dist/components/file-icon/file-icon.js.map +1 -0
  215. package/dist/components/file-icon/file-icon.styles.d.ts +2 -0
  216. package/dist/components/file-icon/file-icon.styles.d.ts.map +1 -0
  217. package/dist/components/file-icon/file-icon.styles.js +23 -0
  218. package/dist/components/file-icon/file-icon.styles.js.map +1 -0
  219. package/dist/components/file-icon/file-type-metadata.d.ts +14 -0
  220. package/dist/components/file-icon/file-type-metadata.d.ts.map +1 -0
  221. package/dist/components/file-icon/file-type-metadata.js +81 -0
  222. package/dist/components/file-icon/file-type-metadata.js.map +1 -0
  223. package/dist/components/heatmap/heatmap.class.d.ts +27 -0
  224. package/dist/components/heatmap/heatmap.class.d.ts.map +1 -1
  225. package/dist/components/heatmap/heatmap.class.js +125 -1
  226. package/dist/components/heatmap/heatmap.class.js.map +1 -1
  227. package/dist/components/heatmap/heatmap.styles.d.ts.map +1 -1
  228. package/dist/components/heatmap/heatmap.styles.js +27 -0
  229. package/dist/components/heatmap/heatmap.styles.js.map +1 -1
  230. package/dist/components/html-viewer/dompurify-loader.d.ts +7 -0
  231. package/dist/components/html-viewer/dompurify-loader.d.ts.map +1 -0
  232. package/dist/components/html-viewer/dompurify-loader.js +19 -0
  233. package/dist/components/html-viewer/dompurify-loader.js.map +1 -0
  234. package/dist/components/html-viewer/html-viewer.class.d.ts +29 -0
  235. package/dist/components/html-viewer/html-viewer.class.d.ts.map +1 -0
  236. package/dist/components/html-viewer/html-viewer.class.js +88 -0
  237. package/dist/components/html-viewer/html-viewer.class.js.map +1 -0
  238. package/dist/components/html-viewer/html-viewer.d.ts +2 -0
  239. package/dist/components/html-viewer/html-viewer.d.ts.map +1 -0
  240. package/dist/components/html-viewer/html-viewer.js +15 -0
  241. package/dist/components/html-viewer/html-viewer.js.map +1 -0
  242. package/dist/components/html-viewer/html-viewer.styles.d.ts +2 -0
  243. package/dist/components/html-viewer/html-viewer.styles.d.ts.map +1 -0
  244. package/dist/components/html-viewer/html-viewer.styles.js +26 -0
  245. package/dist/components/html-viewer/html-viewer.styles.js.map +1 -0
  246. package/dist/components/json-viewer/json-viewer.styles.js +1 -1
  247. package/dist/components/markdown/markdown.styles.js +1 -1
  248. package/dist/components/model-select/model-select.class.d.ts +4 -0
  249. package/dist/components/model-select/model-select.class.d.ts.map +1 -1
  250. package/dist/components/model-select/model-select.class.js +16 -1
  251. package/dist/components/model-select/model-select.class.js.map +1 -1
  252. package/dist/components/overlay/overlay.styles.d.ts.map +1 -1
  253. package/dist/components/overlay/overlay.styles.js +11 -1
  254. package/dist/components/overlay/overlay.styles.js.map +1 -1
  255. package/dist/components/pdf-viewer/pdf-loader.d.ts +6 -0
  256. package/dist/components/pdf-viewer/pdf-loader.d.ts.map +1 -0
  257. package/dist/components/pdf-viewer/pdf-loader.js +22 -0
  258. package/dist/components/pdf-viewer/pdf-loader.js.map +1 -0
  259. package/dist/components/pdf-viewer/pdf-viewer.class.d.ts +80 -0
  260. package/dist/components/pdf-viewer/pdf-viewer.class.d.ts.map +1 -0
  261. package/dist/components/pdf-viewer/pdf-viewer.class.js +296 -0
  262. package/dist/components/pdf-viewer/pdf-viewer.class.js.map +1 -0
  263. package/dist/components/pdf-viewer/pdf-viewer.d.ts +2 -0
  264. package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -0
  265. package/dist/components/pdf-viewer/pdf-viewer.js +13 -0
  266. package/dist/components/pdf-viewer/pdf-viewer.js.map +1 -0
  267. package/dist/components/pdf-viewer/pdf-viewer.styles.d.ts +2 -0
  268. package/dist/components/pdf-viewer/pdf-viewer.styles.d.ts.map +1 -0
  269. package/dist/components/pdf-viewer/pdf-viewer.styles.js +19 -0
  270. package/dist/components/pdf-viewer/pdf-viewer.styles.js.map +1 -0
  271. package/dist/components/pptx-viewer/pptx-loader.d.ts +5 -0
  272. package/dist/components/pptx-viewer/pptx-loader.d.ts.map +1 -0
  273. package/dist/components/pptx-viewer/pptx-loader.js +20 -0
  274. package/dist/components/pptx-viewer/pptx-loader.js.map +1 -0
  275. package/dist/components/pptx-viewer/pptx-viewer.class.d.ts +68 -0
  276. package/dist/components/pptx-viewer/pptx-viewer.class.d.ts.map +1 -0
  277. package/dist/components/pptx-viewer/pptx-viewer.class.js +205 -0
  278. package/dist/components/pptx-viewer/pptx-viewer.class.js.map +1 -0
  279. package/dist/components/pptx-viewer/pptx-viewer.d.ts +2 -0
  280. package/dist/components/pptx-viewer/pptx-viewer.d.ts.map +1 -0
  281. package/dist/components/pptx-viewer/pptx-viewer.js +11 -0
  282. package/dist/components/pptx-viewer/pptx-viewer.js.map +1 -0
  283. package/dist/components/pptx-viewer/pptx-viewer.styles.d.ts +2 -0
  284. package/dist/components/pptx-viewer/pptx-viewer.styles.d.ts.map +1 -0
  285. package/dist/components/pptx-viewer/pptx-viewer.styles.js +66 -0
  286. package/dist/components/pptx-viewer/pptx-viewer.styles.js.map +1 -0
  287. package/dist/components/responsive-panel/responsive-panel.styles.js +1 -1
  288. package/dist/components/segmented/segmented.class.d.ts +6 -4
  289. package/dist/components/segmented/segmented.class.d.ts.map +1 -1
  290. package/dist/components/segmented/segmented.class.js +3 -2
  291. package/dist/components/segmented/segmented.class.js.map +1 -1
  292. package/dist/components/segmented/segmented.styles.js +1 -1
  293. package/dist/components/spreadsheet-viewer/spreadsheet-loader.d.ts +8 -0
  294. package/dist/components/spreadsheet-viewer/spreadsheet-loader.d.ts.map +1 -0
  295. package/dist/components/spreadsheet-viewer/spreadsheet-loader.js +19 -0
  296. package/dist/components/spreadsheet-viewer/spreadsheet-loader.js.map +1 -0
  297. package/dist/components/spreadsheet-viewer/spreadsheet-viewer.class.d.ts +32 -0
  298. package/dist/components/spreadsheet-viewer/spreadsheet-viewer.class.d.ts.map +1 -0
  299. package/dist/components/spreadsheet-viewer/spreadsheet-viewer.class.js +99 -0
  300. package/dist/components/spreadsheet-viewer/spreadsheet-viewer.class.js.map +1 -0
  301. package/dist/components/spreadsheet-viewer/spreadsheet-viewer.d.ts +3 -0
  302. package/dist/components/spreadsheet-viewer/spreadsheet-viewer.d.ts.map +1 -0
  303. package/dist/components/spreadsheet-viewer/spreadsheet-viewer.js +12 -0
  304. package/dist/components/spreadsheet-viewer/spreadsheet-viewer.js.map +1 -0
  305. package/dist/components/spreadsheet-viewer/spreadsheet-viewer.styles.d.ts +2 -0
  306. package/dist/components/spreadsheet-viewer/spreadsheet-viewer.styles.d.ts.map +1 -0
  307. package/dist/components/spreadsheet-viewer/spreadsheet-viewer.styles.js +14 -0
  308. package/dist/components/spreadsheet-viewer/spreadsheet-viewer.styles.js.map +1 -0
  309. package/dist/components/svg-viewer/dompurify-loader.d.ts +7 -0
  310. package/dist/components/svg-viewer/dompurify-loader.d.ts.map +1 -0
  311. package/dist/components/svg-viewer/dompurify-loader.js +19 -0
  312. package/dist/components/svg-viewer/dompurify-loader.js.map +1 -0
  313. package/dist/components/svg-viewer/svg-viewer.class.d.ts +29 -0
  314. package/dist/components/svg-viewer/svg-viewer.class.d.ts.map +1 -0
  315. package/dist/components/svg-viewer/svg-viewer.class.js +95 -0
  316. package/dist/components/svg-viewer/svg-viewer.class.js.map +1 -0
  317. package/dist/components/svg-viewer/svg-viewer.d.ts +2 -0
  318. package/dist/components/svg-viewer/svg-viewer.d.ts.map +1 -0
  319. package/dist/components/svg-viewer/svg-viewer.js +15 -0
  320. package/dist/components/svg-viewer/svg-viewer.js.map +1 -0
  321. package/dist/components/svg-viewer/svg-viewer.styles.d.ts +2 -0
  322. package/dist/components/svg-viewer/svg-viewer.styles.d.ts.map +1 -0
  323. package/dist/components/svg-viewer/svg-viewer.styles.js +50 -0
  324. package/dist/components/svg-viewer/svg-viewer.styles.js.map +1 -0
  325. package/dist/components/tool-approval-dialog/tool-approval-dialog.class.d.ts +13 -6
  326. package/dist/components/tool-approval-dialog/tool-approval-dialog.class.d.ts.map +1 -1
  327. package/dist/components/tool-approval-dialog/tool-approval-dialog.class.js +48 -10
  328. package/dist/components/tool-approval-dialog/tool-approval-dialog.class.js.map +1 -1
  329. package/dist/components/tool-approval-dialog/tool-approval-dialog.styles.js +1 -1
  330. package/dist/components/tool-result-dialog/tool-result-dialog.styles.js +1 -1
  331. package/dist/components/tool-select-dialog/tool-select-dialog.class.d.ts +7 -0
  332. package/dist/components/tool-select-dialog/tool-select-dialog.class.d.ts.map +1 -1
  333. package/dist/components/tool-select-dialog/tool-select-dialog.class.js +31 -0
  334. package/dist/components/tool-select-dialog/tool-select-dialog.class.js.map +1 -1
  335. package/dist/components/tool-select-dialog/tool-select-dialog.styles.js +1 -1
  336. package/dist/components/widget/widget.styles.js +1 -1
  337. package/dist/components/word-cloud/word-cloud.styles.js +4 -4
  338. package/dist/internal/localization.d.ts +1 -1
  339. package/dist/internal/localization.d.ts.map +1 -1
  340. package/dist/internal/localization.js +63 -0
  341. package/dist/internal/localization.js.map +1 -1
  342. package/dist/internal/lyra-element.d.ts +2 -2
  343. package/dist/internal/lyra-element.js +2 -2
  344. package/dist/internal/root-registration-allowlist.d.ts +1 -1
  345. package/dist/internal/root-registration-allowlist.d.ts.map +1 -1
  346. package/dist/internal/root-registration-allowlist.js +15 -0
  347. package/dist/internal/root-registration-allowlist.js.map +1 -1
  348. package/dist/internal/tokens.styles.d.ts.map +1 -1
  349. package/dist/internal/tokens.styles.js +202 -198
  350. package/dist/internal/tokens.styles.js.map +1 -1
  351. package/dist/lyra.d.ts +43 -0
  352. package/dist/lyra.d.ts.map +1 -1
  353. package/dist/lyra.js +32 -0
  354. package/dist/lyra.js.map +1 -1
  355. package/dist/testing/happy-dom-shims.d.ts +4 -2
  356. package/dist/testing/happy-dom-shims.d.ts.map +1 -1
  357. package/dist/testing/happy-dom-shims.js +6 -2
  358. package/dist/testing/happy-dom-shims.js.map +1 -1
  359. package/dist/theme.css +58 -0
  360. package/llms-full.txt +431 -37
  361. package/llms.txt +11 -9
  362. package/package.json +91 -4
package/llms-full.txt CHANGED
@@ -1,18 +1,14 @@
1
1
  # @aceshooting/lyra-ui — LLM API Reference
2
2
 
3
- `@aceshooting/lyra-ui` is a library of free, clean-room [Lit](https://lit.dev) web components — a
4
- companion to [Web Awesome](https://webawesome.com) that reimplements selected Web Awesome **Pro**
5
- components as open-source equivalents (documented compatible tag shape, attributes, slots, events,
6
- and CSS parts under a `lyra-` prefix instead of `wa-`), plus a number of extras that have no Web Awesome
7
- counterpart at all (dashboard atoms, temporal/graph widgets, chart wrappers, a map component, a
8
- file dropzone). It is **token-compatible with Web Awesome**: every component's stylesheet resolves
9
- through Web Awesome's `--wa-*` design tokens first, falling back to its own `--lyra-*` tokens, so
10
- components read as native inside a Web Awesome-themed app and are equally usable standalone with no
11
- theme at all. This document is the complete, component-by-component API reference intended for
12
- coding assistants integrating the library; for install instructions, the full component catalog, and
13
- the `<wa-*>` → `<lyra-*>` migration notes, see the package [README](./README.md) — or the shorter
14
- curated index at [`llms.txt`](./llms.txt) if you just need the shape of the library before diving in
15
- here.
3
+ `@aceshooting/lyra-ui` is a free, independent, MIT-licensed [Lit](https://lit.dev) web-component
4
+ library and an open-source alternative to Shoelace and Web Awesome. It combines accessible form
5
+ controls, layout and overlay primitives, dashboards, charts, data visualization, and Conversation &
6
+ Agent UI. Selected components retain documented Web Awesome-compatible public names under a `lyra-`
7
+ prefix to make migration easier, but Lyra has its own implementation, design tokens, localization
8
+ runtime, RTL behavior, and release surface. It has no runtime dependency on either project. This is
9
+ the complete component-by-component API reference for coding assistants integrating the library; for
10
+ installation, the full catalog, and Web Awesome/Shoelace migration notes, see the package
11
+ [README](./README.md) or the shorter curated index at [`llms.txt`](./llms.txt).
16
12
 
17
13
  Component entry points such as `components/empty/empty.js` register their custom-element tag.
18
14
  Every component also exposes a matching `.class.js` entry for subclassing or type-directed
@@ -38,6 +34,7 @@ composition without registration; for example, `components/empty/empty.class.js`
38
34
  `lyra-thinking-panel`, `lyra-generation-status`, `lyra-code-block`, `lyra-tool-approval-dialog`,
39
35
  `lyra-tool-param-form`, `lyra-menu`/`lyra-menu-item`, `lyra-chip`/`lyra-chip-group`,
40
36
  `lyra-model-settings-panel`, `lyra-context-meter`, `lyra-dock-panel`, `lyra-document-preview`,
37
+ `lyra-document-viewer`, `lyra-docx-viewer`, `lyra-email-viewer`, `lyra-calendar-viewer`, `lyra-archive-viewer`,
41
38
  `lyra-media-card`, `lyra-attachment-trigger`, `lyra-kbd`, `lyra-result-card`/`lyra-result-field`,
42
39
  `lyra-avatar`, `lyra-card`, `lyra-stepper`, `lyra-segmented`, `lyra-diff-view`, `lyra-poll-status`,
43
40
  `lyra-code-block-core` (needs the optional peer `shiki`)
@@ -105,21 +102,22 @@ Not a custom element itself — infrastructure every `lyra-*` component in the l
105
102
  `lyra-citation-badge`, and `lyra-menu` (which resolves its `placement` through
106
103
  `rtlAwarePlacement()` first — see `rtl.ts` below — before handing it to `place()`).
107
104
  - **`tokens.styles.ts` → `tokens`** (a `css` template prepended to every component's stylesheet) —
108
- the whole design-token layer. Every value chains through a `--wa-*` Web Awesome token first, with
109
- a hard-coded fallback, e.g. `--lyra-color-brand: var(--wa-color-brand-fill-loud, #0969da)`. Full
105
+ the whole design-token layer. Every value chains through an independent `--lyra-theme-*` custom
106
+ property and finally a hard-coded fallback, e.g. `--lyra-color-brand: var(--lyra-theme-color-brand-fill-loud, #0969da)`.
107
+ Full
110
108
  set: `--lyra-color-surface / -text / -text-quiet / -border / -brand / -brand-quiet / -success /
111
109
  -success-quiet / -warning / -warning-quiet / -danger / -danger-quiet`,
112
110
  `--lyra-color-on-brand / -on-success / -on-warning / -on-danger` (paired
113
111
  text/icon colors for content painted on the corresponding solid semantic fill; standalone light
114
- and dark fallbacks choose a contrasting foreground for each fill, while a Web Awesome theme can
115
- provide its own `*-on-loud` values), `--lyra-space-xs / -s / -m / -l`, `--lyra-radius`, `--lyra-shadow`,
112
+ and dark fallbacks choose a contrasting foreground for each fill, while a consumer's own theme
113
+ can provide its own `*-on-loud` values), `--lyra-space-xs / -s / -m / -l`, `--lyra-radius`, `--lyra-shadow`,
116
114
  `--lyra-font`, `--lyra-transition-fast` / `-base` (motion timing every animating component should
117
115
  share), `--lyra-opacity-disabled` (one shared disabled-state opacity), `--lyra-focus-ring-width` /
118
116
  `-color` / `-offset` (every `:focus-visible` rule should reference these), `--lyra-icon-button-size`
119
117
  (minimum tappable box for icon-only buttons; the glyph itself doesn't grow). Also sets
120
118
  `:host([hidden]) { display: none !important; }`, an inherited `box-sizing: border-box` reset, and
121
119
  a `prefers-color-scheme: dark` fallback that re-points the color tokens' hard-coded defaults at a
122
- dark palette (only takes effect when no real `--wa-*` theme value is present).
120
+ dark palette (only takes effect when no real `--lyra-theme-*` value is set).
123
121
  - **`prefix.ts`** — `LYRA_PREFIX = 'lyra'`; `tag(name)` → `` `lyra-${name}` ``; `defineElement(name,
124
122
  ctor)` — idempotent `customElements.define`, safe if a module is evaluated twice.
125
123
  - **`a11y.ts`** — `nextId(scope)`: monotonic id generator (e.g. `nextId('combobox-list')` →
@@ -544,6 +542,10 @@ Text field + calendar popover, **form-associated** via the shared `FormAssociate
544
542
  internal `<input>`; empty omits the attribute. Named `autoCorrect` in JS/TS (not `autocorrect`)
545
543
  to dodge a `lib.dom.d.ts` collision with `HTMLElement`'s own boolean `autocorrect` IDL member;
546
544
  the wire attribute is still the plain `autocorrect` name
545
+ - `autocomplete: string = ''`, `inputMode: string = ''` (attribute `inputmode`), and
546
+ `enterKeyHint: string = ''` (attribute `enterkeyhint`) — forwarded to the internal date input
547
+ - `autocomplete: string = ''`, `inputMode: string = ''` (`inputmode`), and `enterKeyHint: string = ''`
548
+ (`enterkeyhint`) — forwarded to the internal `<input>`.
547
549
 
548
550
  **Methods:** `show()`, `hide()`, `clear()`
549
551
 
@@ -720,15 +722,14 @@ original declarative `value`, matching native `defaultValue` behavior.
720
722
 
721
723
  ## `lyra-button`
722
724
 
723
- A generic action-button primitive, the `lyra-*` equivalent of a plain `wa-button`. Renders an
724
- internal native `<button>` (this library has no runtime dependency on Web Awesome); `type="submit"`/
725
+ A generic action-button primitive. Renders an internal native `<button>`; `type="submit"`/
725
726
  `type="reset"` are handled by the component itself via the host's own `closest('form')`, since a
726
727
  shadow-internal native button doesn't participate in an ancestor form's submission on its own.
727
728
 
728
729
  **Properties:**
729
730
  - `variant: 'neutral' | 'brand' | 'success' | 'warning' | 'danger' = 'neutral'` (reflected)
730
731
  - `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
+ loud, high-contrast filled tier,
732
733
  distinct from `'filled'` for `variant="neutral"` specifically (`'filled'` reads the ambient
733
734
  surface color there; `'accent'` reads a solid neutral fill)
734
735
  - `size: 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected)
@@ -737,7 +738,11 @@ shadow-internal native button doesn't participate in an ancestor form's submissi
737
738
  clearing `disabled`
738
739
  - `disabled: boolean = false` (reflected)
739
740
 
740
- **Getters/methods:** `focus(options?)`/`blur()` forwarded to the internal native `<button>`.
741
+ The shared `m` size uses `--lyra-font-size-m`. The internal button follows the host's inline size through `--lyra-button-width` (default
742
+ `100%`), and the size scale is exposed through `--lyra-button-size-xs/-s/-m/-l/-xl`.
743
+
744
+ **Getters/methods:** `click()`, `focus(options?)`, and `blur()` — forwarded to the internal native
745
+ `<button>`; `click()` also runs the component's submit/reset behavior.
741
746
 
742
747
  **Events:** none (a plain native `click` bubbles and composes through the shadow boundary
743
748
  unmodified; disabled while `disabled` or `loading`).
@@ -746,11 +751,12 @@ unmodified; disabled while `disabled` or `loading`).
746
751
 
747
752
  **CSS parts:** `base`, `label`, `start`, `end`, `spinner` (present only while `loading`).
748
753
 
749
- **Themeable custom properties:** `--lyra-button-accent`, `--lyra-button-fill`,
754
+ **Themeable custom properties:** `--lyra-button-width`, `--lyra-button-size-xs/-s/-m/-l/-xl`,
755
+ `--lyra-button-accent`, `--lyra-button-fill`,
750
756
  `--lyra-button-on-fill`, `--lyra-button-border` (each swapped by the active `variant`, default
751
757
  `neutral` falls back to plain text/surface/border tokens), `--lyra-button-accent-fill`,
752
758
  `--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
759
+ back to `--lyra-color-neutral`/`--lyra-color-on-neutral`, every other variant reuses that variant's own
754
760
  loud fill token), `--lyra-button-hover-brightness` (default `1.08`, the `:hover` filter intensity),
755
761
  `--lyra-button-active-scale` (default `0.9875`, the `:active` press-scale, disabled under
756
762
  `prefers-reduced-motion`).
@@ -1880,6 +1886,9 @@ itself (absent for `'wide'`/`collapse="none"`); and the `lyra-split-collapse-cha
1880
1886
  divider adjacent to the collapsed panel is drag/keyboard-disabled (`aria-disabled="true"`) while
1881
1887
  collapsed. `collapse="none"` (the default) is byte-for-byte identical to pre-collapse-feature behavior.
1882
1888
 
1889
+ `dividerLabel?: (index: number, panelCount: number) => string` (attribute: false) customizes the
1890
+ localized accessible label generated for each auto-inserted divider.
1891
+
1883
1892
  **Events:** `lyra-resize` (`detail: { sizes }`, fired on every drag step/release **and** every
1884
1893
  keyboard step), `lyra-split-collapse-change` (`detail: { state: 'wide'|'rail'|'floating' }`, fired only
1885
1894
  on a real `collapse`-state transition, never on every resize/render),
@@ -1959,6 +1968,8 @@ position) survives the transition.
1959
1968
  sidebar/toolbar visible during fullscreen
1960
1969
  - `compact: boolean = false` (reflected) — tighter header/body padding, same convention as
1961
1970
  `lyra-empty`'s `compact`
1971
+ - `backdropInset: string = ''` (attribute `backdrop-inset`) — overrides the fullscreen backdrop's
1972
+ CSS `inset` independently from `fullscreenInset`; when empty, it follows `fullscreenInset`
1962
1973
  - `views: WidgetView[] = []` (attribute: false) — named alternate views for the panel body, e.g. a
1963
1974
  chart/table toggle inside the same card chrome; `WidgetView { id: string; label: string; icon?:
1964
1975
  TemplateResult }`. Each entry gets a header toggle button (`[part='view-toggle']`) and a
@@ -1987,7 +1998,7 @@ empty), `label-group` (wrapper around the label and sublabel), `label`, `sublabe
1987
1998
  `backdrop`
1988
1999
 
1989
2000
  **Themeable custom properties:** `--lyra-widget-overlay-color` (default `rgb(0 0 0 / 0.5)` — the
1990
- fullscreen backdrop scrim color; component-specific since no shared `--wa-*`/`--lyra-*` overlay token
2001
+ fullscreen backdrop scrim color; component-specific since no shared `--lyra-*` overlay token
1991
2002
  exists), plus shared tokens (`--lyra-space-*`, `--lyra-color-border/-surface/-text-quiet`,
1992
2003
  `--lyra-radius`, `--lyra-shadow`, `--lyra-icon-button-size`, `--lyra-focus-ring-*`).
1993
2004
 
@@ -2269,10 +2280,15 @@ A Canvas-rendered heatmap with a DPR-aware, resize-aware redraw loop, in one of
2269
2280
  `"matrix"` (default — a `rowLabels` × `colLabels` grid of `values`) or `"calendar"` (a
2270
2281
  GitHub-style Sunday–Saturday × week grid built from `days`, colored by quartile bucket rather than
2271
2282
  the matrix mode's continuous ramp). Every cell is independently addressable despite being
2272
- canvas-drawn (no per-cell DOM node): a `pointermove` hit-test over the canvas shows `[part="tooltip"]`
2283
+ canvas-drawn (no per-cell DOM node by default): a `pointermove` hit-test over the canvas shows `[part="tooltip"]`
2273
2284
  with that cell's label + value; the canvas is `tabindex="0"` with arrow-key roving focus (a stroked
2274
2285
  ring redrawn over the focused cell on every draw, plus `[part="live-region"]` announcing it); and a
2275
- click, or Enter/Space on the focused cell, fires `lyra-cell-click`.
2286
+ click, or Enter/Space on the focused cell, fires `lyra-cell-click`.
2287
+
2288
+ Set `accessibleCells: true` (`accessible-cells`) to opt into a native-button overlay for each
2289
+ interactive matrix/calendar cell. The overlay uses localized `aria-label`s, explicit
2290
+ `aria-pressed="true"|"false"` from the controlled `selectedCell`, and roving tabindex/arrow-key
2291
+ focus; it continues to emit `lyra-cell-click` and leaves selection state consumer-controlled.
2276
2292
 
2277
2293
  **Properties:**
2278
2294
  - `rowLabels: string[] = []` (attribute: false — matrix mode only)
@@ -2312,6 +2328,11 @@ click, or Enter/Space on the focused cell, fires `lyra-cell-click`.
2312
2328
  announcement when the focused cell is the selection. Purely a controlled property — mirrors
2313
2329
  `<lyra-lite-chart>`'s `selectedIndex`, this component never mutates it itself. Unset (the default,
2314
2330
  `null`) reproduces today's exact output.
2331
+ - `accessibleCells: boolean = false` (attribute `accessible-cells`) — renders `[part="cells"]` with
2332
+ one `[part="cell"]` native button per interactive cell. Buttons expose localized `aria-label`s,
2333
+ explicit `aria-pressed` state from `selectedCell`, and a roving tabindex; the canvas becomes
2334
+ `aria-hidden` while this mode is enabled. The property is opt-in so the default canvas mode keeps
2335
+ its low DOM footprint.
2315
2336
  - `cellText?: (pos: MatrixCellPos | CalendarCellPos, value: number) => string` (attribute: false) —
2316
2337
  formats the per-cell hover tooltip and keyboard live-region announcement text; receives the cell
2317
2338
  position (`{ row, col }` in matrix mode, `{ week, weekday }` in calendar mode) and its value.
@@ -2370,7 +2391,8 @@ force a redraw manually.
2370
2391
 
2371
2392
  **Slots:** none.
2372
2393
 
2373
- **CSS parts:** `base`, `canvas`, `tooltip` (hover tooltip, positioned over the hovered cell),
2394
+ **CSS parts:** `base`, `canvas`, `cells` (opt-in per-cell overlay), `cell` (one opt-in native cell
2395
+ button), `tooltip` (hover tooltip, positioned over the hovered cell),
2374
2396
  `live-region` (visually-hidden `role="status" aria-live="polite"` element announcing the
2375
2397
  keyboard-focused cell), `legend`, `legend-lo`, `legend-hi`, `legend-annotation` (one per labeled
2376
2398
  `annotations` entry)
@@ -2623,6 +2645,8 @@ descendants of the treeitem, matching the WAI-ARIA treeitem pattern's containmen
2623
2645
  - `setSize: number = 1`, `posInSet: number = 1` (attribute: false) — this node's `aria-setsize`/
2624
2646
  `aria-posinset` values among its siblings, pushed down from `<lyra-tree>`; normally set internally,
2625
2647
  not by consumers
2648
+ - `hasChildren: boolean` (read-only getter) — reports whether `item.children` contains at least one
2649
+ child; leaf nodes never expose `aria-expanded` and cannot expand or collapse
2626
2650
 
2627
2651
  **Methods:** `expand()`, `collapse()` (each a no-op if already in that state, or a leaf), `select()`
2628
2652
  (fires `lyra-node-select`).
@@ -3169,6 +3193,10 @@ parsing (that's left entirely to the host).
3169
3193
  - `label: string = 'Drop files here or click to browse'`
3170
3194
  - `accessibleLabel: string = ''` (attribute `aria-label`) — overrides `label` as the internal
3171
3195
  dropzone/button accessible name without changing visible copy
3196
+ - `acceptedMessage: string = '{count} file(s) added.'` (attribute `accepted-message`) — live-region
3197
+ message after an accepted selection; `{count}` is replaced with the accepted count
3198
+ - `rejectedMessage: string = '{count} file(s) rejected.'` (attribute `rejected-message`) — live-region
3199
+ message after rejected files; `{count}` is replaced with the rejected count
3172
3200
 
3173
3201
  **Methods:** `openPicker()` programmatically opens the native file dialog; `focus(options?)`
3174
3202
  forwards to the interactive dropzone.
@@ -3464,6 +3492,8 @@ hand-building that chrome isn't worth it.
3464
3492
  - `closable: boolean = false` (attribute `closable`) — renders a built-in close (X) button in the
3465
3493
  header row (creating one, with no heading text, if `heading` is unset), wired to the same
3466
3494
  `close()` path Escape/backdrop-dismiss already use, with reason `'close-button'`
3495
+ - `noLightDismiss: boolean = false` (attribute `no-light-dismiss`) — prevents a backdrop click from
3496
+ closing the dialog; Escape and explicit `close()` calls remain available
3467
3497
 
3468
3498
  Also settable as a plain `aria-label` attribute (not a public JS property): overrides the panel's
3469
3499
  computed accessible name outright, winning over every other source below (a slotted heading,
@@ -3501,7 +3531,7 @@ when no heading is slotted and `heading` is unset), `body` (wrapper around the d
3501
3531
  `footer` (wrapper around the `footer` slot)
3502
3532
 
3503
3533
  **Themeable custom properties:** `--lyra-dialog-overlay-color` (default `rgb(0 0 0 / 0.5)` — the
3504
- backdrop scrim color; component-specific since no shared `--wa-*`/`--lyra-*` overlay token exists),
3534
+ backdrop scrim color; component-specific since no shared `--lyra-*` overlay token exists),
3505
3535
  `--lyra-dialog-width` (default unset/`auto` — the panel shrink-wraps to content, unchanged; set it
3506
3536
  for an assertive width instead), `--lyra-dialog-max-width` (default `32rem` — the panel's
3507
3537
  max-inline-size cap, via `min(var(--lyra-dialog-max-width, var(--lyra-dialog-width, 32rem)), 100%)`;
@@ -4161,7 +4191,7 @@ fenced/indented `<pre>`), `link` (every rendered `<a>`), `table` (every rendered
4161
4191
 
4162
4192
  **Themeable custom properties:** `--lyra-markdown-font-mono` (default `ui-monospace, SFMono-Regular,
4163
4193
  Menlo, Consolas, monospace` — the code/code-block font; component-specific since no shared
4164
- `--wa-*`/`--lyra-*` monospace token exists), plus shared tokens `--lyra-space-xs/-s/-m/-l`,
4194
+ `--lyra-*` monospace token exists), plus shared tokens `--lyra-space-xs/-s/-m/-l`,
4165
4195
  `--lyra-color-brand-quiet`, `--lyra-color-brand`, `--lyra-color-border`, `--lyra-color-text-quiet`,
4166
4196
  `--lyra-radius`.
4167
4197
 
@@ -4243,6 +4273,8 @@ conversation-surface level).
4243
4273
  - `collapsed: boolean = false` (reflected) — whether the message body is hidden; effective whenever
4244
4274
  set, independent of `collapsible` (which only controls whether the toggle button itself is
4245
4275
  rendered) — mirrors `lyra-widget`'s identical `collapsible`/`collapsed` pair
4276
+ - `attachmentsPosition: 'before'|'after' = 'after'` (attribute `attachments-position`) — places the
4277
+ `attachments` slot before or after the message body; both the visual and reading order follow it
4246
4278
 
4247
4279
  **Events:** `lyra-retry` (no detail payload; fired by the built-in retry button, only rendered when
4248
4280
  `status="failed"`), `lyra-collapse-toggle` (`detail: boolean`, the new `collapsed` state — fired when
@@ -4875,6 +4907,8 @@ wins when both are present.
4875
4907
  indeterminate state, and filename context so translators can reorder every value
4876
4908
  - `uploadFailedLabel: string = 'Upload failed'` (attribute `upload-failed-label`) — visible status
4877
4909
  text shown for `status="error"`; override for i18n/locale
4910
+ - `untitledLabel: string = 'Untitled file'` (attribute `untitled-label`) — fallback filename and
4911
+ tooltip when neither `file` nor `name` supplies a name
4878
4912
 
4879
4913
  The component identifies *which* attachment a `lyra-remove`/`lyra-retry` event is about via the
4880
4914
  platform's own `id` attribute/property rather than a second, differently-named prop. Set `id="..."`
@@ -5369,6 +5403,11 @@ emitting `lyra-change`.
5369
5403
  `<input>`'s own `autocorrect` (Safari/WebKit-specific); empty omits the attribute. Named
5370
5404
  `autoCorrect` in JS purely to dodge a `lib.dom.d.ts` typing collision — the wire attribute is
5371
5405
  still plain `autocorrect`.
5406
+ - `autocomplete: string = 'off'`, `inputMode: string = ''` (attribute `inputmode`), and
5407
+ `enterKeyHint: string = ''` (attribute `enterkeyhint`) — forwarded to the free-text input;
5408
+ they have no effect in closed-dropdown mode
5409
+ - `autocomplete: string = 'off'`, `inputMode: string = ''` (`inputmode`), and `enterKeyHint: string = ''`
5410
+ (`enterkeyhint`) — forwarded to the free-text mode's native `<input>`.
5372
5411
  - `name: string = ''` (reflected)
5373
5412
  - `disabled: boolean = false` (reflected)
5374
5413
  - `required: boolean = false` (reflected — enforced via `internals.setValidity()`)
@@ -5573,6 +5612,9 @@ shared overlay stack. First-party invention (no Web Awesome equivalent).
5573
5612
  - `searchPlaceholder: string = 'Search tools…'` (attribute `search-placeholder`)
5574
5613
  - `filter: ToolSelectFilter | null = null` (attribute: false) — overrides the built-in
5575
5614
  case-insensitive name/description substring match.
5615
+ - `autocomplete: string = ''`, `spellcheck: boolean = true`, `autocapitalize: string = ''`,
5616
+ `autoCorrect: string = ''` (`autocorrect`), `inputMode: string = ''` (`inputmode`), and
5617
+ `enterKeyHint: string = ''` (`enterkeyhint`) — forwarded to the search `<input>`.
5576
5618
 
5577
5619
  **Methods:** `close(reason: ToolSelectDialogCloseReason = 'api'): void` — closes the dialog, emits
5578
5620
  `lyra-close` with `reason`, and returns focus to whatever had it before the dialog opened.
@@ -6556,9 +6598,10 @@ something that announces state *transitions* instead. The Stop button gets a nor
6556
6598
  ## `lyra-code-block`
6557
6599
 
6558
6600
  Fenced code display with optional lazy syntax highlighting and a copy button. First-party invention
6559
- (no Web Awesome equivalent). No highlighting grammar ships in the component itself it lazy-loads
6560
- the optional peer dependency `shiki` (see `code-loader.ts`) for the actual tokenizing, and degrades
6561
- to a plain `<pre><code>` when that peer isn't installed or `language` is unset/unrecognized. That
6601
+ (no Web Awesome equivalent). It lazy-loads the optional peer dependency `shiki` (see
6602
+ `code-loader.ts`) for the actual tokenizing, and includes a compact GreyCat/GCL grammar because
6603
+ Shiki does not bundle one. It falls back to a plain `<pre><code>` when that peer isn't installed or
6604
+ `language` is unset/unrecognized. That
6562
6605
  fallback is the *default* rendering path, not a degraded one: unhighlighted code is perfectly usable,
6563
6606
  and it's what every instance renders at zero extra bytes until shiki resolves.
6564
6607
 
@@ -6566,7 +6609,10 @@ and it's what every instance renders at zero extra bytes until shiki resolves.
6566
6609
  - `code: string = ''` — the raw source text
6567
6610
  - `language: string = ''` — a shiki-recognized language id or alias (e.g. `"javascript"`, `"python"`,
6568
6611
  `"json"`); when unset, or when shiki doesn't recognize it, the code renders as plain unhighlighted
6569
- text regardless of whether shiki itself is available
6612
+ text regardless of whether shiki itself is available. Shiki's bundled catalog covers most common
6613
+ programming, markup, data, and configuration languages, including Python, C, C++, C#, Java,
6614
+ JavaScript, TypeScript, HTML, CSS, JSON, SQL, Go, Rust, YAML, Markdown, and shell scripts. Lyra
6615
+ also includes a built-in GreyCat grammar; use `"gcl"` or `"greycat"` for GreyCat source.
6570
6616
  - `filename: string = ''` — shown in the header, when set
6571
6617
  - `accessibleLabel: string = ''` (attribute `aria-label`) — names the internal focusable code-body
6572
6618
  region; otherwise a localized filename/language description is generated
@@ -6578,6 +6624,8 @@ and it's what every instance renders at zero extra bytes until shiki resolves.
6578
6624
  cannot override a true default)
6579
6625
  - `maxHeight: string = ''` (attribute `max-height`) — a CSS length (e.g. `"20rem"`); once set, the
6580
6626
  code scrolls internally past this height instead of growing the page
6627
+ - `lineNumbers: boolean = false` (attribute `line-numbers`, reflected) — displays one-based line
6628
+ numbers for both highlighted output and the plain-text fallback
6581
6629
  - `languages?: Record<string, ShikiLanguageInput>` (attribute: false) — a map of language id to an
6582
6630
  already-imported shiki grammar module (e.g. `{ bash: bashGrammar }` from a module-scope
6583
6631
  `import bash from 'shiki/langs/bash.mjs'`). When `language` matches a key here, highlighting is
@@ -6586,6 +6634,8 @@ and it's what every instance renders at zero extra bytes until shiki resolves.
6586
6634
  for that language — an additive, opt-in escape hatch for a build scoped to just the languages a
6587
6635
  consumer actually needs. A `language` absent from this map (or `languages` left unset) falls back
6588
6636
  to the default dynamic-import path unchanged.
6637
+ - `languagesOnly: boolean = false` (attribute `languages-only`) — skips the default shiki loader;
6638
+ use when every requested language is supplied through `languages`
6589
6639
 
6590
6640
  **Events:** `lyra-copy` (`detail: { text: string }` — always the raw `code` value, never the
6591
6641
  highlighted HTML, and always fires regardless of whether the actual OS clipboard write succeeded),
@@ -6599,7 +6649,7 @@ button is activated, same event name/shape convention as `<lyra-thinking-panel>`
6599
6649
 
6600
6650
  **Themeable custom properties:** `--lyra-code-block-max-height` (default `none` — the consumer-tunable
6601
6651
  scroll cap; only takes effect once `max-height` is set), `--lyra-code-block-font` (default
6602
- `ui-monospace, SFMono-Regular, Menlo, Consolas, monospace` — no shared `--wa-*`/`--lyra-*` monospace
6652
+ `ui-monospace, SFMono-Regular, Menlo, Consolas, monospace` — no shared `--lyra-*` monospace
6603
6653
  token exists to resolve through), plus shared tokens `--lyra-color-border`, `--lyra-radius`,
6604
6654
  `--lyra-color-surface`, `--lyra-space-xs/-s/-m`, `--lyra-font`, `--lyra-color-text-quiet`,
6605
6655
  `--lyra-color-text`, `--lyra-color-brand`/`-brand-quiet`, `--lyra-transition-fast`,
@@ -6625,6 +6675,9 @@ highlighting).
6625
6675
  ></lyra-code-block>
6626
6676
  ```
6627
6677
 
6678
+ Set `line-numbers` when source context benefits from numbered lines. The option does not change the
6679
+ raw `code` value or the `lyra-copy` event payload.
6680
+
6628
6681
  A `<lyra-skeleton variant="rect">` placeholder (with `aria-busy="true"` on the host) stands in only
6629
6682
  while shiki itself is loading for the very first time on the page and `language` is set — it is
6630
6683
  deliberately *not* shown again for a later per-language grammar fetch (that's typically fast, and the
@@ -6688,6 +6741,8 @@ toggle, the loading-skeleton behavior while the fine-grained highlighter resolve
6688
6741
  - `copyable: boolean = true` (reflected) — shows the copy-to-clipboard button.
6689
6742
  - `maxHeight: string = ''` (attribute `max-height`) — a CSS length (e.g. `"20rem"`); once set, the
6690
6743
  code scrolls internally past this height instead of growing the page.
6744
+ - `lineNumbers: boolean = false` (attribute `line-numbers`, reflected) — displays one-based line
6745
+ numbers for highlighted and plain output.
6691
6746
  - `languages: Record<string, ShikiLanguageInput> = {}` (attribute: false) — grammar definitions this
6692
6747
  instance can highlight, e.g. `{ json: jsonGrammar }` (import from `shiki/langs/<name>.mjs`). Empty
6693
6748
  (the default) never highlights at all — every `language` renders the plain-text fallback.
@@ -6819,6 +6874,15 @@ renders at the start of the action row, before Deny/Edit/Approve.
6819
6874
  `false` via a PROPERTY binding, e.g. `.editable=${false}` — a `?editable=${false}`
6820
6875
  boolean-attribute binding cannot override a true default). When `false`, `args` is always shown
6821
6876
  read-only and can never be changed before approval.
6877
+ - `spellcheck: boolean = false`, `autocapitalize: string = 'off'`,
6878
+ `autoCorrect: string = 'off'` (attribute `autocorrect`), `autocomplete: string = 'off'`,
6879
+ `wrap: 'hard'|'soft'|'off' = 'soft'`, `inputMode: string = ''` (attribute `inputmode`),
6880
+ and `enterKeyHint: string = ''` (attribute `enterkeyhint`) — forwarded to the raw-JSON
6881
+ textarea; the defaults keep browser editing assistance from changing JSON text
6882
+ - `spellcheck: boolean = false`, `autocapitalize: string = 'off'`, `autoCorrect: string = 'off'`
6883
+ (`autocorrect`), `autocomplete: string = 'off'`, `wrap: 'hard'|'soft'|'off' = 'soft'`,
6884
+ `inputMode: string = ''` (`inputmode`), and `enterKeyHint: string = ''` (`enterkeyhint`) —
6885
+ forwarded to the raw-JSON `<textarea>` while editing.
6822
6886
 
6823
6887
  **Methods:** `close(reason: ToolApprovalDialogCloseReason = 'api'): void` — closes the dialog, emits
6824
6888
  `lyra-close` with `reason`, and returns focus to whatever had it before the dialog opened; a no-op if
@@ -7062,6 +7126,10 @@ menu, an avatar menu, or a history row's overflow menu. Uses the WAI-ARIA "menu
7062
7126
  a no-op for existing consumers), matching `lyra-select`/`lyra-model-select`'s
7063
7127
  `this.getAttribute('aria-label') || <computed default>` precedence
7064
7128
 
7129
+ - `closeOnEscapeAnywhere: boolean = false` (attribute `close-on-escape-anywhere`) — lets Escape
7130
+ close the menu when focus is on slotted non-menu-item content inside the popup; item activation
7131
+ remains scoped to actual menu items
7132
+
7065
7133
  **Events:** `lyra-show` (no detail — fires only when `open` transitions to `true`, not for markup
7066
7134
  that renders `open` true from the start), `lyra-hide` (same first-render guard, opposite
7067
7135
  transition), `lyra-menu-select` (`detail: { value }` — a consolidated re-fire of the activated
@@ -7724,6 +7792,304 @@ available, the region becomes a standard `role="progressbar"` instead, self-desc
7724
7792
 
7725
7793
  ---
7726
7794
 
7795
+ ## `lyra-document-viewer`
7796
+
7797
+ A dialog-hosted, format-dispatching full viewer for one document or attachment. It uses a pluggable
7798
+ renderer registry and falls back to `<lyra-document-preview>` when no renderer matches the file's MIME
7799
+ type. First-party invention.
7800
+
7801
+ **Properties:**
7802
+ - `open: boolean = false` (reflected) — opens or closes the viewer dialog.
7803
+ - `name: string = ''` — display name passed to the renderer and used as the dialog heading.
7804
+ - `mimeType: string = ''` (attribute `mime-type`) — MIME type used for exact renderer dispatch.
7805
+ - `src: string = ''` — source URL passed to the selected renderer or the fallback preview.
7806
+ - `registry?: DocumentRendererRegistry` (attribute: false) — optional per-instance registry override;
7807
+ the module-level registry is used when unset.
7808
+
7809
+ **Events:**
7810
+ - `lyra-close` — `detail: DocumentViewerCloseReason`, the nested dialog's dismissal reason. The
7811
+ event is emitted after the viewer sets `open` to `false`.
7812
+
7813
+ **CSS parts:** `body` — wrapper around the active renderer, loading/error state, or fallback preview.
7814
+
7815
+ **Renderer registry exports:**
7816
+ - `DocumentFile` — `{ name: string; mimeType: string; src: string }`, the value passed to renderers.
7817
+ - `DocumentRendererDefinition` — optional `render(file)`, `matches(file)`, and lazy `load()` hooks.
7818
+ - `DocumentRendererRegistry` — `Map<string, DocumentRendererDefinition>`.
7819
+ - `registerDocumentRenderer(key, definition)` — adds or replaces a default-registry entry.
7820
+ - `findDocumentRenderer(file, registry?)` — checks an exact MIME-type key, then the first matching
7821
+ `matches()` entry in registration order.
7822
+ - `loadDocumentRenderer(definition)` — resolves and identity-caches a lazy definition; rejected loads
7823
+ are retried on the next call.
7824
+
7825
+ ```html
7826
+ <lyra-document-viewer
7827
+ open
7828
+ name="report.pdf"
7829
+ mime-type="application/pdf"
7830
+ src="/files/report.pdf"
7831
+ ></lyra-document-viewer>
7832
+ ```
7833
+
7834
+ Register a renderer once during application setup. The definition may load a heavy optional viewer
7835
+ only when a matching document is opened:
7836
+
7837
+ ```ts
7838
+ import { registerDocumentRenderer } from '@aceshooting/lyra-ui';
7839
+
7840
+ registerDocumentRenderer('application/x-example', {
7841
+ render: (file) => `Preview: ${file.name}`,
7842
+ });
7843
+ ```
7844
+
7845
+ When no renderer matches, the viewer renders `<lyra-document-preview>`, which handles text and images
7846
+ inline and provides a safe generic fallback for other formats.
7847
+
7848
+ ## `lyra-docx-viewer`
7849
+
7850
+ Fetches a `.docx` Word document as an `ArrayBuffer`, converts it to semantic HTML with the optional
7851
+ `mammoth` peer, sanitizes that HTML through the optional `dompurify` peer, and renders the result.
7852
+ Mammoth preserves document structure such as headings, paragraphs, lists, tables, and images; it is
7853
+ not intended to reproduce pixel-exact Word page layout. There is no unsanitized rendering escape
7854
+ hatch: if `dompurify` is unavailable, rendering is blocked even when Mammoth converted successfully.
7855
+
7856
+ **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. `maxHeight` caps
7857
+ the scrollable document body.
7858
+
7859
+ **Events:** `lyra-render-error` with `detail.error` when fetching, conversion, sanitization, or a
7860
+ non-fatal Mammoth conversion message occurs.
7861
+
7862
+ **CSS parts:** `base`, `body`, `content`, `spinner`, and `error`.
7863
+
7864
+ **Optional peer dependencies:** install `mammoth` and `dompurify` with `pnpm add mammoth dompurify`.
7865
+ The component registers a lazy `application/vnd.openxmlformats-officedocument.wordprocessingml.document`
7866
+ renderer with `<lyra-document-viewer>` and matches `.docx` filenames when the MIME type is generic.
7867
+
7868
+ ```html
7869
+ <lyra-docx-viewer src="/files/report.docx" name="report.docx" max-height="32rem"></lyra-docx-viewer>
7870
+ ```
7871
+
7872
+ ## `lyra-email-viewer`
7873
+
7874
+ Fetches and parses `.eml` messages with the optional `postal-mime` peer. HTML message bodies are
7875
+ sanitized through the existing optional `dompurify` peer before rendering; plain-text messages
7876
+ remain available without DOMPurify. Attachments are listed as filename/type/size metadata and their
7877
+ content is never rendered by this component.
7878
+
7879
+ **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings.
7880
+
7881
+ **Events:** `lyra-render-error` with `detail.error` when fetching or parsing fails.
7882
+
7883
+ **CSS parts:** `base`, `headers`, `from-label`, `from`, `to-label`, `to`, `subject-label`, `subject`,
7884
+ `date-label`, `date`, `body`, `body-html`, `body-text`, `attachments`, `attachments-label`,
7885
+ `attachment-list`, `attachment-item`, `spinner`, and `error`.
7886
+
7887
+ **Optional peer dependencies:** install `postal-mime` and `dompurify` with
7888
+ `pnpm add postal-mime dompurify`. The component registers `message/rfc822` and falls back to
7889
+ matching `.eml` filenames in `<lyra-document-viewer>`.
7890
+
7891
+ ## `lyra-calendar-viewer`
7892
+
7893
+ Fetches and parses `.ics` calendars with the optional `ical.js` peer and renders each VEVENT as
7894
+ plain text, including its title, start/end time, location, and description. No HTML is injected.
7895
+
7896
+ **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings.
7897
+
7898
+ **Events:** `lyra-render-error` with `detail.error` when fetching or parsing fails.
7899
+
7900
+ **CSS parts:** `base`, `body`, `event-list`, `event`, `event-summary`, `event-time`, `event-location`,
7901
+ `event-description`, `spinner`, and `error`.
7902
+
7903
+ **Optional peer dependency:** install `ical.js` with `pnpm add ical.js`. The component registers
7904
+ `text/calendar` and falls back to matching `.ics` filenames in `<lyra-document-viewer>`.
7905
+
7906
+ ## `lyra-archive-viewer`
7907
+
7908
+ Lists entry names and human-readable uncompressed sizes inside a `.zip` archive using the optional
7909
+ `jszip` peer. It is listing-only: entry content is never rendered or previewed. Files are measured
7910
+ through JSZip's public async API, so every file is decompressed once up front to obtain its size;
7911
+ there is no cheaper public uncompressed-size API. The list composes `<lyra-virtual-list>` for large
7912
+ archives.
7913
+
7914
+ **Properties:** `src` and `name` are strings.
7915
+
7916
+ **Events:** `lyra-render-error` with `detail.error` when fetching or parsing fails.
7917
+
7918
+ **CSS parts:** `base`, `entry`, `entry-icon`, `entry-name`, `entry-size`, `spinner`, and `error`.
7919
+
7920
+ **Exports:** `ArchiveEntry` — `{ name: string; dir: boolean; size: number }`.
7921
+
7922
+ **Optional peer dependency:** install `jszip` with `pnpm add jszip`. The lazy registry registers
7923
+ `application/zip` and `application/x-zip-compressed`, with a `.zip` filename fallback, and imports
7924
+ the viewer only when a matching archive is opened. `.tar`, `.rar`, and other archive formats fall
7925
+ through to `<lyra-document-preview>`'s generic download fallback.
7926
+
7927
+ ## `lyra-ebook-viewer`
7928
+
7929
+ Renders EPUB ebooks through the optional `epubjs` peer. `src` is fetched as an `ArrayBuffer`, and
7930
+ epub.js renders the reading area into its stable `mount` element, using an internal iframe for
7931
+ chapter content.
7932
+
7933
+ **Properties:** `src` and `name` are strings. `accessibleLabel` (attribute `aria-label`) overrides
7934
+ the reading region's accessible name.
7935
+
7936
+ **Events:** `lyra-render-error` with `detail.error` when fetching, opening, or rendering fails.
7937
+
7938
+ **CSS parts:** `base`, `toolbar`, `previous-button`, `next-button`, `previous-icon`, `next-icon`,
7939
+ `mount`, and `error`.
7940
+
7941
+ **Optional peer dependency:** install `epubjs` with `pnpm add epubjs`. The document-viewer registry
7942
+ matches `application/epub+zip` and `.epub` filenames.
7943
+
7944
+ ## `lyra-pptx-viewer`
7945
+
7946
+ Best-effort client-side PPTX viewer backed by the optional `@aiden0z/pptx-renderer` peer. A
7947
+ localized fidelity notice is always visible because animations, equations, embedded objects,
7948
+ speaker notes, and several advanced effects are not rendered.
7949
+
7950
+ **Properties:** `src`, `name`, and `label` are strings. A host `aria-label` also names the viewer
7951
+ region when `label` is unset.
7952
+
7953
+ **Methods:** `goToSlide(index)` returns a promise and navigates the mounted presentation.
7954
+
7955
+ **Events:** `lyra-load` (`detail: { slideCount }`), `lyra-slide-change` (`detail: { index, count }`),
7956
+ and `lyra-render-error` with `detail.error`.
7957
+
7958
+ **CSS parts:** `base`, `header`, `name`, `notice`, `error`, `nav`, `previous-button`,
7959
+ `previous-icon`, `slide-count`, `next-button`, `next-icon`, and `container`.
7960
+
7961
+ **Optional peer dependency:** install `@aiden0z/pptx-renderer` with
7962
+ `pnpm add @aiden0z/pptx-renderer`. The registry matches the official PPTX MIME type and `.pptx`
7963
+ filenames.
7964
+
7965
+ ## `lyra-file-icon`
7966
+
7967
+ Localized, tokenized file-format badge for surrounding upload rows, cards, selectors, and viewer
7968
+ headers. The companion `getFileTypeMetadata(mimeType, fileName?)` utility covers common document,
7969
+ spreadsheet, presentation, code, archive, image, audio, and video formats. An explicit known MIME
7970
+ type wins; filename extension fallback is used only for an empty or `application/octet-stream`
7971
+ MIME type. Unknown values return a generic file result.
7972
+
7973
+ **Properties:** `mimeType` (attribute `mime-type`), `name`, `label`, `decorative`, and
7974
+ `variant: 'icon' | 'label'`.
7975
+
7976
+ **CSS parts:** `base`, `icon`, and `label`.
7977
+
7978
+ **Exports:** `LyraFileTypeMetadata`, `LyraFileTypeIcon`, `LyraFileTypeCategory`,
7979
+ `getFileTypeMetadata()`, and `registerFileTypeMetadata()` for application-specific mappings.
7980
+
7981
+ ```html
7982
+ <lyra-file-icon mime-type="application/pdf" variant="label"></lyra-file-icon>
7983
+ ```
7984
+
7985
+ ## `lyra-svg-viewer`
7986
+
7987
+ Fetches an SVG document, sanitizes it with the optional `dompurify` peer, and renders it inline.
7988
+
7989
+ **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings. `maxHeight` caps
7990
+ the scrollable body.
7991
+
7992
+ **Events:** `lyra-render-error` with `detail.error` when fetching or sanitizing fails.
7993
+
7994
+ **CSS parts:** `base`, `body`, `svg`, `spinner`, and `error`.
7995
+
7996
+ **Optional peer dependency:** `dompurify`.
7997
+
7998
+ ## `lyra-html-viewer`
7999
+
8000
+ Fetches an HTML document, sanitizes it with the optional `dompurify` peer, and renders the safe markup
8001
+ inside a bounded, scrollable body.
8002
+
8003
+ **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings.
8004
+
8005
+ **Events:** `lyra-render-error` with `detail.error` when fetching or sanitizing fails.
8006
+
8007
+ **CSS parts:** `base`, `body`, `html`, `spinner`, and `error`.
8008
+
8009
+ **Optional peer dependency:** `dompurify`.
8010
+
8011
+ ## `lyra-dataset-viewer`
8012
+
8013
+ Fetches tab-, pipe-, or delimiter-separated text and renders an accessible table using the optional
8014
+ `papaparse` peer. The document registry matches `.tsv`, `.psv`, and `.dat` filenames.
8015
+
8016
+ **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings.
8017
+
8018
+ **Events:** `lyra-render-error` with `detail.error` when fetching or parsing fails.
8019
+
8020
+ **CSS parts:** `base`, `body`, `table`, `spinner`, and `error`.
8021
+
8022
+ **Exports:** `DatasetTable` is `{ fields: string[]; rows: Record<string, string>[] }`.
8023
+
8024
+ **Optional peer dependency:** `papaparse`.
8025
+
8026
+ ## `lyra-contact-viewer`
8027
+
8028
+ Fetches a vCard document and renders one accessible card per contact. The document registry matches
8029
+ `.vcf` filenames and common `FN`, `N`, `ORG`, `TEL`, `EMAIL`, and `ADR` fields are displayed.
8030
+
8031
+ **Properties:** `src`, `name`, and `maxHeight` (attribute `max-height`) are strings.
8032
+
8033
+ **Events:** `lyra-render-error` with `detail.error` when fetching or parsing fails.
8034
+
8035
+ **CSS parts:** `base`, `body`, `contact`, `contact-name`, `contact-org`, `contact-tel`,
8036
+ `contact-email`, `contact-adr`, `spinner`, and `error`.
8037
+
8038
+ **Exports:** `parseVCards()` and the `VCardName`, `VCardTypedValue`, `VCardAddress`, and `VCardContact`
8039
+ types.
8040
+
8041
+ ## `lyra-pdf-viewer`
8042
+
8043
+ Fetches a PDF and renders its pages with the optional `pdfjs-dist` peer. Pages are virtualized through
8044
+ `lyra-virtual-list`, and PDF.js's selectable text layer is positioned over each rendered canvas.
8045
+
8046
+ **Properties:** `src` and `name` are strings. `page: number = 1` is the one-based current page and
8047
+ `zoom: number = 1` is clamped to `0.25`–`4`.
8048
+
8049
+ **Events:** `lyra-render-error` with `detail.error` when fetching, parsing, or rendering fails;
8050
+ `lyra-page-change` with `{ page, pageCount }`; and `lyra-zoom-change` with `{ zoom }`.
8051
+
8052
+ **Methods:** `nextPage()`, `previousPage()`, `zoomIn()`, and `zoomOut()` update the corresponding
8053
+ controlled state within its supported range.
8054
+
8055
+ **CSS parts:** `base`, `toolbar`, `page-indicator`, `zoom-indicator`, `pages`, `page`, `text-layer`,
8056
+ `spinner`, and `error`.
8057
+
8058
+ **Optional peer dependency:** install `pdfjs-dist` with `pnpm add pdfjs-dist`. The component registers
8059
+ a lazy `application/pdf` renderer with `<lyra-document-viewer>` so the PDF library is loaded only when
8060
+ a PDF is opened.
8061
+
8062
+ ## `lyra-spreadsheet-viewer`
8063
+
8064
+ Fetches and renders `.xlsx` and `.xls` workbooks with the optional `xlsx` (SheetJS) peer. Multiple
8065
+ worksheets render through a `<lyra-tabs>` switcher, and body rows use `<lyra-virtual-list>`.
8066
+
8067
+ **Properties:** `src` and `name` are strings.
8068
+
8069
+ **Events:** `lyra-render-error` with `detail.error` when fetching or parsing fails.
8070
+
8071
+ **CSS parts:** `base`, `tabs`, `sheet`, `header-row`, `data-row`, `cell`, `rows`, `spinner`, and
8072
+ `error`.
8073
+
8074
+ **Optional peer dependency:** install `xlsx` with `pnpm add xlsx`. The registry matches the official
8075
+ `.xlsx` and `.xls` MIME types and filename extensions.
8076
+
8077
+ ## `lyra-csv-viewer`
8078
+
8079
+ Fetches CSV text, parses quoted fields with the optional `papaparse` peer, and virtualizes body rows.
8080
+
8081
+ **Properties:** `src` and `name` are strings. `hasHeaderRow: boolean = true` (attribute
8082
+ `has-header-row`) controls whether the first parsed row is rendered as a sticky header.
8083
+
8084
+ **Events:** `lyra-render-error` with `detail.error` when fetching or parsing reports an error.
8085
+
8086
+ **CSS parts:** `base`, `sheet`, `header-row`, `data-row`, `cell`, `rows`, `spinner`, and `error`.
8087
+
8088
+ **Optional peer dependency:** install `papaparse` with `pnpm add papaparse`. The registry matches
8089
+ `text/csv` and `.csv` filenames.
8090
+
8091
+ ---
8092
+
7727
8093
  ## `lyra-media-card`
7728
8094
 
7729
8095
  A lightweight inline preview for one already-sent, already-available attachment inside a rendered
@@ -7843,6 +8209,8 @@ capability as a row.
7843
8209
  `'Attach files'`); only affects the single-capability button (`[part='trigger']`) — the
7844
8210
  multi-capability menu's own trigger keeps its fixed `'Add attachment'` label regardless. Unset
7845
8211
  (the default) keeps the built-in English default.
8212
+ - `triggerTitle?: string` (attribute `trigger-title`) — forwards a sighted-user hover tooltip to
8213
+ both the single-capability and multi-capability trigger buttons
7846
8214
 
7847
8215
  **Events:** `lyra-pick` (`detail: { capability: 'files' | 'image'; files: FileList }`) — fired once a
7848
8216
  file-backed capability's hidden input produces a real selection. The `FileList` is an independent
@@ -8228,9 +8596,11 @@ markup.
8228
8596
 
8229
8597
  ## `lyra-callout`
8230
8598
 
8231
- An inline status, warning, or error surface.
8599
+ An inline status, warning, or error surface. Set `inline` for lightweight reactive form or mutation
8600
+ errors without panel chrome.
8232
8601
 
8233
- **Properties:** `variant`, `heading`, `closable`, `open`, and `accessibleLabel` (`accessible-label`).
8602
+ **Properties:** `variant`, `heading`, `closable`, `inline`, `open`, and `accessibleLabel`
8603
+ (`accessible-label`).
8234
8604
 
8235
8605
  **Events:** cancelable `lyra-close`; the callout hides after the event unless a listener calls
8236
8606
  `preventDefault()`.
@@ -8297,6 +8667,30 @@ properties `name`, `value`, `disabled`, and `required`, plus `label`, `hint`, an
8297
8667
 
8298
8668
  These apply across the whole library rather than to any one component:
8299
8669
 
8670
+ - **Independence and migration.** Lyra has no runtime, theme, or design-token dependency on
8671
+ Shoelace or Web Awesome. The documented `wa-*` comparisons are migration references only; Lyra's
8672
+ own `lyra-*` tokens, events, localization runtime, and implementation are the source of truth.
8673
+ For a staged Web Awesome migration, map existing external theme-input values to `--lyra-theme-*` explicitly
8674
+ in application CSS instead of relying on an implicit compatibility layer.
8675
+
8676
+ - **Internationalization.** Built-in UI copy, accessible names, descriptions, validation messages,
8677
+ status announcements, and empty/loading states resolve through `localize()` and the locale runtime.
8678
+ Register an application catalog with `registerLyraLocale()` or override one instance with
8679
+ `.strings`; locale fallback is exact locale, base language, then English. Date, number, byte,
8680
+ relative-time, and calendar output uses `Intl`. Consumer data and slotted content are never
8681
+ translated automatically.
8682
+
8683
+ - **RTL and direction.** Direction is inherited from `dir`/`lang`; components do not force their own
8684
+ direction. CSS logical properties mirror layout, while directional keyboard and pointer math
8685
+ consults the effective direction. Test both LTR and RTL for any component with horizontal order,
8686
+ start/end placement, drag deltas, or previous/next navigation.
8687
+
8688
+ - **Accessibility and responsive behavior.** Semantic roles live on the shadow-DOM element that owns
8689
+ them, with explicit false states for toggle/selection/expansion ARIA attributes and deliberate
8690
+ host-name forwarding. Form-associated controls preserve `ElementInternals`, reset, validity,
8691
+ focus, and native editing behavior. Reusable layouts respond to their allocated container, and
8692
+ decorative/infinite motion simplifies under `prefers-reduced-motion: reduce`.
8693
+
8300
8694
  - **Packaging.** `custom-elements.json` is now in `package.json`'s `files` allowlist and
8301
8695
  regenerated by a `prepack` script (`pnpm run manifest`) before publish, so a manifest-driven IDE/
8302
8696
  tooling integration (e.g. custom-elements-manifest-based autocomplete) does see an up-to-date copy