@aceshooting/lyra-ui 3.5.0 → 3.7.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 (295) hide show
  1. package/README.md +111 -2
  2. package/custom-elements.json +50239 -41857
  3. package/dist/components/animated-image/animated-image.class.d.ts +131 -0
  4. package/dist/components/animated-image/animated-image.class.d.ts.map +1 -0
  5. package/dist/components/animated-image/animated-image.class.js +296 -0
  6. package/dist/components/animated-image/animated-image.class.js.map +1 -0
  7. package/dist/components/animated-image/animated-image.d.ts +2 -0
  8. package/dist/components/animated-image/animated-image.d.ts.map +1 -0
  9. package/dist/components/animated-image/animated-image.js +5 -0
  10. package/dist/components/animated-image/animated-image.js.map +1 -0
  11. package/dist/components/animated-image/animated-image.styles.d.ts +2 -0
  12. package/dist/components/animated-image/animated-image.styles.d.ts.map +1 -0
  13. package/dist/components/animated-image/animated-image.styles.js +117 -0
  14. package/dist/components/animated-image/animated-image.styles.js.map +1 -0
  15. package/dist/components/animation/animation.class.d.ts +119 -0
  16. package/dist/components/animation/animation.class.d.ts.map +1 -0
  17. package/dist/components/animation/animation.class.js +420 -0
  18. package/dist/components/animation/animation.class.js.map +1 -0
  19. package/dist/components/animation/animation.d.ts +2 -0
  20. package/dist/components/animation/animation.d.ts.map +1 -0
  21. package/dist/components/animation/animation.js +5 -0
  22. package/dist/components/animation/animation.js.map +1 -0
  23. package/dist/components/animation/animation.styles.d.ts +2 -0
  24. package/dist/components/animation/animation.styles.d.ts.map +1 -0
  25. package/dist/components/animation/animation.styles.js +18 -0
  26. package/dist/components/animation/animation.styles.js.map +1 -0
  27. package/dist/components/avatar-group/avatar-group.class.d.ts +110 -0
  28. package/dist/components/avatar-group/avatar-group.class.d.ts.map +1 -0
  29. package/dist/components/avatar-group/avatar-group.class.js +182 -0
  30. package/dist/components/avatar-group/avatar-group.class.js.map +1 -0
  31. package/dist/components/avatar-group/avatar-group.d.ts +2 -0
  32. package/dist/components/avatar-group/avatar-group.d.ts.map +1 -0
  33. package/dist/components/avatar-group/avatar-group.js +5 -0
  34. package/dist/components/avatar-group/avatar-group.js.map +1 -0
  35. package/dist/components/avatar-group/avatar-group.styles.d.ts +2 -0
  36. package/dist/components/avatar-group/avatar-group.styles.d.ts.map +1 -0
  37. package/dist/components/avatar-group/avatar-group.styles.js +112 -0
  38. package/dist/components/avatar-group/avatar-group.styles.js.map +1 -0
  39. package/dist/components/button/button.class.d.ts +5 -2
  40. package/dist/components/button/button.class.d.ts.map +1 -1
  41. package/dist/components/button/button.class.js +4 -1
  42. package/dist/components/button/button.class.js.map +1 -1
  43. package/dist/components/button/button.styles.d.ts.map +1 -1
  44. package/dist/components/button/button.styles.js +16 -0
  45. package/dist/components/button/button.styles.js.map +1 -1
  46. package/dist/components/calendar/calendar.class.d.ts.map +1 -1
  47. package/dist/components/calendar/calendar.class.js +1 -12
  48. package/dist/components/calendar/calendar.class.js.map +1 -1
  49. package/dist/components/calendar-viewer/calendar-viewer.class.d.ts +1 -1
  50. package/dist/components/calendar-viewer/calendar-viewer.class.d.ts.map +1 -1
  51. package/dist/components/calendar-viewer/calendar-viewer.class.js +2 -2
  52. package/dist/components/calendar-viewer/calendar-viewer.class.js.map +1 -1
  53. package/dist/components/chart/box-plot.class.d.ts.map +1 -1
  54. package/dist/components/chart/box-plot.class.js +1 -3
  55. package/dist/components/chart/box-plot.class.js.map +1 -1
  56. package/dist/components/chart/chart.class.d.ts.map +1 -1
  57. package/dist/components/chart/chart.class.js +1 -3
  58. package/dist/components/chart/chart.class.js.map +1 -1
  59. package/dist/components/code-editor/code-editor.styles.d.ts.map +1 -1
  60. package/dist/components/code-editor/code-editor.styles.js +5 -2
  61. package/dist/components/code-editor/code-editor.styles.js.map +1 -1
  62. package/dist/components/contact-viewer/contact-viewer.class.d.ts +4 -1
  63. package/dist/components/contact-viewer/contact-viewer.class.d.ts.map +1 -1
  64. package/dist/components/contact-viewer/contact-viewer.class.js +5 -2
  65. package/dist/components/contact-viewer/contact-viewer.class.js.map +1 -1
  66. package/dist/components/email-viewer/email-viewer.class.d.ts +4 -1
  67. package/dist/components/email-viewer/email-viewer.class.d.ts.map +1 -1
  68. package/dist/components/email-viewer/email-viewer.class.js +5 -2
  69. package/dist/components/email-viewer/email-viewer.class.js.map +1 -1
  70. package/dist/components/file-icon/file-icon.class.d.ts +5 -1
  71. package/dist/components/file-icon/file-icon.class.d.ts.map +1 -1
  72. package/dist/components/file-icon/file-icon.class.js +20 -2
  73. package/dist/components/file-icon/file-icon.class.js.map +1 -1
  74. package/dist/components/file-icon/file-icon.styles.d.ts.map +1 -1
  75. package/dist/components/file-icon/file-icon.styles.js +4 -0
  76. package/dist/components/file-icon/file-icon.styles.js.map +1 -1
  77. package/dist/components/graph/graph.class.d.ts.map +1 -1
  78. package/dist/components/graph/graph.class.js +1 -3
  79. package/dist/components/graph/graph.class.js.map +1 -1
  80. package/dist/components/heatmap/heatmap.class.d.ts.map +1 -1
  81. package/dist/components/heatmap/heatmap.class.js +1 -8
  82. package/dist/components/heatmap/heatmap.class.js.map +1 -1
  83. package/dist/components/icon/icon.styles.d.ts.map +1 -1
  84. package/dist/components/icon/icon.styles.js +1 -1
  85. package/dist/components/icon/icon.styles.js.map +1 -1
  86. package/dist/components/include/include.class.d.ts +104 -0
  87. package/dist/components/include/include.class.d.ts.map +1 -0
  88. package/dist/components/include/include.class.js +149 -0
  89. package/dist/components/include/include.class.js.map +1 -0
  90. package/dist/components/include/include.d.ts +2 -0
  91. package/dist/components/include/include.d.ts.map +1 -0
  92. package/dist/components/include/include.js +5 -0
  93. package/dist/components/include/include.js.map +1 -0
  94. package/dist/components/include/include.styles.d.ts +2 -0
  95. package/dist/components/include/include.styles.d.ts.map +1 -0
  96. package/dist/components/include/include.styles.js +14 -0
  97. package/dist/components/include/include.styles.js.map +1 -0
  98. package/dist/components/kbd/kbd.class.d.ts.map +1 -1
  99. package/dist/components/kbd/kbd.class.js +1 -11
  100. package/dist/components/kbd/kbd.class.js.map +1 -1
  101. package/dist/components/known-date/known-date.class.d.ts +208 -0
  102. package/dist/components/known-date/known-date.class.d.ts.map +1 -0
  103. package/dist/components/known-date/known-date.class.js +588 -0
  104. package/dist/components/known-date/known-date.class.js.map +1 -0
  105. package/dist/components/known-date/known-date.d.ts +2 -0
  106. package/dist/components/known-date/known-date.d.ts.map +1 -0
  107. package/dist/components/known-date/known-date.js +5 -0
  108. package/dist/components/known-date/known-date.js.map +1 -0
  109. package/dist/components/known-date/known-date.styles.d.ts +2 -0
  110. package/dist/components/known-date/known-date.styles.d.ts.map +1 -0
  111. package/dist/components/known-date/known-date.styles.js +134 -0
  112. package/dist/components/known-date/known-date.styles.js.map +1 -0
  113. package/dist/components/lightbox/lightbox.class.d.ts +187 -0
  114. package/dist/components/lightbox/lightbox.class.d.ts.map +1 -0
  115. package/dist/components/lightbox/lightbox.class.js +415 -0
  116. package/dist/components/lightbox/lightbox.class.js.map +1 -0
  117. package/dist/components/lightbox/lightbox.d.ts +3 -0
  118. package/dist/components/lightbox/lightbox.d.ts.map +1 -0
  119. package/dist/components/lightbox/lightbox.js +6 -0
  120. package/dist/components/lightbox/lightbox.js.map +1 -0
  121. package/dist/components/lightbox/lightbox.styles.d.ts +2 -0
  122. package/dist/components/lightbox/lightbox.styles.d.ts.map +1 -0
  123. package/dist/components/lightbox/lightbox.styles.js +179 -0
  124. package/dist/components/lightbox/lightbox.styles.js.map +1 -0
  125. package/dist/components/map/map.class.d.ts.map +1 -1
  126. package/dist/components/map/map.class.js +11 -23
  127. package/dist/components/map/map.class.js.map +1 -1
  128. package/dist/components/menu/menu.class.d.ts +1 -1
  129. package/dist/components/model-settings-panel/model-settings-panel.class.d.ts.map +1 -1
  130. package/dist/components/model-settings-panel/model-settings-panel.class.js +1 -10
  131. package/dist/components/model-settings-panel/model-settings-panel.class.js.map +1 -1
  132. package/dist/components/qr-code/qr-code-loader.d.ts +15 -0
  133. package/dist/components/qr-code/qr-code-loader.d.ts.map +1 -0
  134. package/dist/components/qr-code/qr-code-loader.js +28 -0
  135. package/dist/components/qr-code/qr-code-loader.js.map +1 -0
  136. package/dist/components/qr-code/qr-code.class.d.ts +121 -0
  137. package/dist/components/qr-code/qr-code.class.d.ts.map +1 -0
  138. package/dist/components/qr-code/qr-code.class.js +392 -0
  139. package/dist/components/qr-code/qr-code.class.js.map +1 -0
  140. package/dist/components/qr-code/qr-code.d.ts +2 -0
  141. package/dist/components/qr-code/qr-code.d.ts.map +1 -0
  142. package/dist/components/qr-code/qr-code.js +5 -0
  143. package/dist/components/qr-code/qr-code.js.map +1 -0
  144. package/dist/components/qr-code/qr-code.styles.d.ts +2 -0
  145. package/dist/components/qr-code/qr-code.styles.d.ts.map +1 -0
  146. package/dist/components/qr-code/qr-code.styles.js +48 -0
  147. package/dist/components/qr-code/qr-code.styles.js.map +1 -0
  148. package/dist/components/random-content/random-content.class.d.ts +99 -0
  149. package/dist/components/random-content/random-content.class.d.ts.map +1 -0
  150. package/dist/components/random-content/random-content.class.js +268 -0
  151. package/dist/components/random-content/random-content.class.js.map +1 -0
  152. package/dist/components/random-content/random-content.d.ts +2 -0
  153. package/dist/components/random-content/random-content.d.ts.map +1 -0
  154. package/dist/components/random-content/random-content.js +5 -0
  155. package/dist/components/random-content/random-content.js.map +1 -0
  156. package/dist/components/random-content/random-content.styles.d.ts +2 -0
  157. package/dist/components/random-content/random-content.styles.d.ts.map +1 -0
  158. package/dist/components/random-content/random-content.styles.js +94 -0
  159. package/dist/components/random-content/random-content.styles.js.map +1 -0
  160. package/dist/components/result-card/result-card.class.d.ts +9 -8
  161. package/dist/components/result-card/result-card.class.d.ts.map +1 -1
  162. package/dist/components/result-card/result-card.class.js +7 -26
  163. package/dist/components/result-card/result-card.class.js.map +1 -1
  164. package/dist/components/result-card/result-field.class.d.ts.map +1 -1
  165. package/dist/components/result-card/result-field.class.js +1 -11
  166. package/dist/components/result-card/result-field.class.js.map +1 -1
  167. package/dist/components/slider/slider.class.d.ts.map +1 -1
  168. package/dist/components/slider/slider.class.js +1 -19
  169. package/dist/components/slider/slider.class.js.map +1 -1
  170. package/dist/components/source-card/source-card.class.d.ts +8 -7
  171. package/dist/components/source-card/source-card.class.d.ts.map +1 -1
  172. package/dist/components/source-card/source-card.class.js +6 -25
  173. package/dist/components/source-card/source-card.class.js.map +1 -1
  174. package/dist/components/stat/stat.class.js +1 -1
  175. package/dist/components/stat/stat.class.js.map +1 -1
  176. package/dist/components/swatch-picker/swatch-picker.class.d.ts +55 -0
  177. package/dist/components/swatch-picker/swatch-picker.class.d.ts.map +1 -0
  178. package/dist/components/swatch-picker/swatch-picker.class.js +120 -0
  179. package/dist/components/swatch-picker/swatch-picker.class.js.map +1 -0
  180. package/dist/components/swatch-picker/swatch-picker.d.ts +2 -0
  181. package/dist/components/swatch-picker/swatch-picker.d.ts.map +1 -0
  182. package/dist/components/swatch-picker/swatch-picker.js +5 -0
  183. package/dist/components/swatch-picker/swatch-picker.js.map +1 -0
  184. package/dist/components/swatch-picker/swatch-picker.styles.d.ts +2 -0
  185. package/dist/components/swatch-picker/swatch-picker.styles.d.ts.map +1 -0
  186. package/dist/components/swatch-picker/swatch-picker.styles.js +55 -0
  187. package/dist/components/swatch-picker/swatch-picker.styles.js.map +1 -0
  188. package/dist/components/time-range/time-range.class.d.ts.map +1 -1
  189. package/dist/components/time-range/time-range.class.js +1 -21
  190. package/dist/components/time-range/time-range.class.js.map +1 -1
  191. package/dist/components/timeline/timeline-item.class.d.ts +120 -0
  192. package/dist/components/timeline/timeline-item.class.d.ts.map +1 -0
  193. package/dist/components/timeline/timeline-item.class.js +203 -0
  194. package/dist/components/timeline/timeline-item.class.js.map +1 -0
  195. package/dist/components/timeline/timeline-item.d.ts +3 -0
  196. package/dist/components/timeline/timeline-item.d.ts.map +1 -0
  197. package/dist/components/timeline/timeline-item.js +10 -0
  198. package/dist/components/timeline/timeline-item.js.map +1 -0
  199. package/dist/components/timeline/timeline-item.styles.d.ts +2 -0
  200. package/dist/components/timeline/timeline-item.styles.d.ts.map +1 -0
  201. package/dist/components/timeline/timeline-item.styles.js +149 -0
  202. package/dist/components/timeline/timeline-item.styles.js.map +1 -0
  203. package/dist/components/timeline/timeline.class.d.ts +59 -0
  204. package/dist/components/timeline/timeline.class.d.ts.map +1 -0
  205. package/dist/components/timeline/timeline.class.js +100 -0
  206. package/dist/components/timeline/timeline.class.js.map +1 -0
  207. package/dist/components/timeline/timeline.d.ts +2 -0
  208. package/dist/components/timeline/timeline.d.ts.map +1 -0
  209. package/dist/components/timeline/timeline.js +5 -0
  210. package/dist/components/timeline/timeline.js.map +1 -0
  211. package/dist/components/timeline/timeline.styles.d.ts +2 -0
  212. package/dist/components/timeline/timeline.styles.d.ts.map +1 -0
  213. package/dist/components/timeline/timeline.styles.js +52 -0
  214. package/dist/components/timeline/timeline.styles.js.map +1 -0
  215. package/dist/components/toast/toast-item.class.d.ts.map +1 -1
  216. package/dist/components/toast/toast-item.class.js +1 -3
  217. package/dist/components/toast/toast-item.class.js.map +1 -1
  218. package/dist/components/tool-param-form/tool-param-form.class.d.ts.map +1 -1
  219. package/dist/components/tool-param-form/tool-param-form.class.js +0 -1
  220. package/dist/components/tool-param-form/tool-param-form.class.js.map +1 -1
  221. package/dist/components/tour/tour.class.d.ts +250 -0
  222. package/dist/components/tour/tour.class.d.ts.map +1 -0
  223. package/dist/components/tour/tour.class.js +530 -0
  224. package/dist/components/tour/tour.class.js.map +1 -0
  225. package/dist/components/tour/tour.d.ts +2 -0
  226. package/dist/components/tour/tour.d.ts.map +1 -0
  227. package/dist/components/tour/tour.js +5 -0
  228. package/dist/components/tour/tour.js.map +1 -0
  229. package/dist/components/tour/tour.styles.d.ts +2 -0
  230. package/dist/components/tour/tour.styles.d.ts.map +1 -0
  231. package/dist/components/tour/tour.styles.js +165 -0
  232. package/dist/components/tour/tour.styles.js.map +1 -0
  233. package/dist/components/virtual-list/virtual-list.class.d.ts.map +1 -1
  234. package/dist/components/virtual-list/virtual-list.class.js +1 -3
  235. package/dist/components/virtual-list/virtual-list.class.js.map +1 -1
  236. package/dist/components/word-cloud/word-cloud.class.d.ts.map +1 -1
  237. package/dist/components/word-cloud/word-cloud.class.js +1 -8
  238. package/dist/components/word-cloud/word-cloud.class.js.map +1 -1
  239. package/dist/components/zoomable-frame/zoomable-frame.class.d.ts +15 -0
  240. package/dist/components/zoomable-frame/zoomable-frame.class.d.ts.map +1 -1
  241. package/dist/components/zoomable-frame/zoomable-frame.class.js +18 -0
  242. package/dist/components/zoomable-frame/zoomable-frame.class.js.map +1 -1
  243. package/dist/internal/a11y.d.ts +4 -0
  244. package/dist/internal/a11y.d.ts.map +1 -1
  245. package/dist/internal/a11y.js +17 -0
  246. package/dist/internal/a11y.js.map +1 -1
  247. package/dist/internal/canvas.d.ts +8 -0
  248. package/dist/internal/canvas.d.ts.map +1 -0
  249. package/dist/internal/canvas.js +14 -0
  250. package/dist/internal/canvas.js.map +1 -0
  251. package/dist/internal/localization.d.ts +1 -1
  252. package/dist/internal/localization.d.ts.map +1 -1
  253. package/dist/internal/localization.js +21 -2
  254. package/dist/internal/localization.js.map +1 -1
  255. package/dist/internal/motion.d.ts +5 -0
  256. package/dist/internal/motion.d.ts.map +1 -0
  257. package/dist/internal/motion.js +7 -0
  258. package/dist/internal/motion.js.map +1 -0
  259. package/dist/internal/numbers.d.ts +11 -0
  260. package/dist/internal/numbers.d.ts.map +1 -1
  261. package/dist/internal/numbers.js +21 -0
  262. package/dist/internal/numbers.js.map +1 -1
  263. package/dist/internal/positioner.d.ts +14 -0
  264. package/dist/internal/positioner.d.ts.map +1 -1
  265. package/dist/internal/positioner.js +27 -0
  266. package/dist/internal/positioner.js.map +1 -1
  267. package/dist/internal/root-registration-allowlist.d.ts +1 -1
  268. package/dist/internal/root-registration-allowlist.d.ts.map +1 -1
  269. package/dist/internal/root-registration-allowlist.js +12 -0
  270. package/dist/internal/root-registration-allowlist.js.map +1 -1
  271. package/dist/internal/rtl.d.ts +0 -11
  272. package/dist/internal/rtl.d.ts.map +1 -1
  273. package/dist/internal/rtl.js +0 -13
  274. package/dist/internal/rtl.js.map +1 -1
  275. package/dist/internal/safe-css.d.ts +15 -0
  276. package/dist/internal/safe-css.d.ts.map +1 -0
  277. package/dist/internal/safe-css.js +25 -0
  278. package/dist/internal/safe-css.js.map +1 -0
  279. package/dist/internal/strip-host-title.d.ts +24 -0
  280. package/dist/internal/strip-host-title.d.ts.map +1 -0
  281. package/dist/internal/strip-host-title.js +46 -0
  282. package/dist/internal/strip-host-title.js.map +1 -0
  283. package/dist/internal/tokens.styles.d.ts.map +1 -1
  284. package/dist/internal/tokens.styles.js +4 -0
  285. package/dist/internal/tokens.styles.js.map +1 -1
  286. package/dist/lyra.d.ts +37 -0
  287. package/dist/lyra.d.ts.map +1 -1
  288. package/dist/lyra.js +24 -0
  289. package/dist/lyra.js.map +1 -1
  290. package/llms-full.txt +161 -5
  291. package/llms.txt +5 -2
  292. package/package.json +43 -6
  293. package/vscode-css-data.json +733 -0
  294. package/vscode-html-data.json +10616 -0
  295. package/web-types.json +12206 -0
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  **Lyra UI — the free, independent web-component alternative.** A MIT-licensed [Lit](https://lit.dev)
6
6
  library for accessible forms, dashboards, charts, data visualization, and Conversation & Agent UI.
7
7
  It is a practical open-source alternative to [Shoelace](https://shoelace.style/) and
8
- [Web Awesome](https://webawesome.com/), with 156 custom elements, native custom-element APIs,
8
+ [Web Awesome](https://webawesome.com/), with 168 custom elements, native custom-element APIs,
9
9
  tree-shakeable imports, its own `--lyra-*` design tokens, built-in localization and RTL support,
10
10
  and no runtime dependency on either project.
11
11
 
@@ -115,6 +115,26 @@ Lyra's combobox uses `with-clear`, while Web Awesome's equivalent uses `clearabl
115
115
  <wa-date-input value="2026-07-15"> → <lyra-date-input value="2026-07-15">
116
116
  ```
117
117
 
118
+ **Automating the rename.** This repo ships a small codemod that performs the mechanical part of
119
+ either migration: [`scripts/migrate-wa.mjs`](https://github.com/aceshooting/lyra-ui/blob/main/packages/lyra-ui/scripts/migrate-wa.mjs)
120
+ (run from a checkout of this repository — it isn't published as part of the npm package) rewrites
121
+ `wa-*`/`sl-*` tag usages and `@shoelace-style/shoelace`/`@awesome.me/webawesome` import specifiers
122
+ to their `lyra-*`/`@aceshooting/lyra-ui` equivalents across a target directory, file, or glob,
123
+ reading the very tables on this page so the rename can't drift out of sync with them:
124
+
125
+ ```bash
126
+ node packages/lyra-ui/scripts/migrate-wa.mjs --dry-run path/to/your/src # preview only
127
+ node packages/lyra-ui/scripts/migrate-wa.mjs path/to/your/src # apply
128
+ ```
129
+
130
+ It only rewrites a tag or import that this page documents a `lyra-*`/`@aceshooting/lyra-ui`
131
+ equivalent for — a component's `— (extra)` row (no Web Awesome/Shoelace counterpart) and any
132
+ `wa-*`/`sl-*` text that isn't an actual tag usage (comments, unrelated identifiers) are left alone.
133
+ It does not rewrite attribute-name differences (e.g. Web Awesome's `clearable` vs. Lyra's
134
+ `with-clear`) or deep import subpaths (`.../dist/components/button/button.js`, since Lyra's own
135
+ subpath layout doesn't mirror Shoelace's or Web Awesome's) — those are flagged instead, and still
136
+ need the component notes below.
137
+
118
138
  Shoelace is now a historical predecessor to Web Awesome, but its component vocabulary remains
119
139
  familiar to many teams. Lyra provides a conceptual migration path rather than claiming a drop-in
120
140
  `sl-*` replacement:
@@ -219,9 +239,82 @@ roving-tabindex list) to match. This covers Arabic, Hebrew, Persian, Urdu, and o
219
239
  through inherited direction; no per-component RTL flag or opt-in is needed. Components do not force
220
240
  their own `dir`, so they remain composable inside mixed-direction layouts.
221
241
 
242
+ ## SSR & Declarative Shadow DOM
243
+
244
+ Every Lyra component is a standard Lit 3 custom element (`extends LitElement` via the shared
245
+ `LyraElement` base), so it follows Lit's own server-rendering story rather than needing anything
246
+ library-specific: [`@lit-labs/ssr`](https://www.npmjs.com/package/@lit-labs/ssr) can render a Lyra
247
+ component to a Declarative Shadow DOM (DSD) `<template shadowrootmode="open">` on the server, so the
248
+ resulting markup paints before any JS runs. A spot check rendering `<lyra-button>` through
249
+ `@lit-labs/ssr`'s `render()` confirms this in practice — the output is a well-formed DSD template
250
+ containing the component's token CSS and internal `<button>` markup, and the constructor's
251
+ `ElementInternals`-based `attachInternals()` call (used for native form association) does not throw
252
+ under `@lit-labs/ssr-dom-shim`'s server DOM shim.
253
+
254
+ That said, **lyra-ui has not been systematically tested or tuned for SSR** across its 168 components:
255
+ no CI job renders the library under `@lit-labs/ssr`, no component has been verified to hydrate
256
+ correctly on the client afterward, and components that reach for browser-only APIs early
257
+ (`ResizeObserver`/`IntersectionObserver`, Floating UI positioning in the popover/tooltip/dropdown
258
+ family, `matchMedia` listeners, canvas-based rendering in `<lyra-heatmap>`/the chart family) have not
259
+ been checked for graceful server-side behavior. Treat SSR/DSD as "should work in principle, unverified
260
+ at scale" rather than a tested, supported deployment target — a meta-framework's own web-component SSR
261
+ integration (or a custom `@lit-labs/ssr` server) is still the right place to start, and an issue report
262
+ with the specific component and framework is welcome if something breaks.
263
+
264
+ ## Framework integration (Vue, Angular, Svelte)
265
+
266
+ Lyra ships plain custom elements with no framework-specific wrapper package, so the friction is the
267
+ same friction any custom-element library has with a non-Lit framework, not anything Lyra-specific:
268
+
269
+ - **Property vs. attribute binding.** A complex-typed property (an object, array, or function — e.g.
270
+ `.strings`, `.selectedRows`, `.markers`) must be bound as a JS *property*, not a stringified
271
+ attribute. Use Vue's `:prop` binding (or the `.prop` modifier), Angular's `[prop]="value"` template
272
+ binding, or a plain property assignment; Svelte's compiler binds to a matching element property
273
+ automatically when one exists, so `prop={value}` mostly just works. A bare `attr="value"` or string
274
+ interpolation only ever sets a string attribute — fine for `variant="brand"`, wrong for anything
275
+ non-string.
276
+ - **Angular needs `CUSTOM_ELEMENTS_SCHEMA`.** Angular's template compiler rejects unknown elements
277
+ and properties by default. Add `schemas: [CUSTOM_ELEMENTS_SCHEMA]` to the module (or standalone
278
+ component) that uses any `<lyra-*>` tag so Angular stops trying to resolve it as an Angular
279
+ component.
280
+ - **Custom events need the framework's DOM event-binding syntax, not its component-event
281
+ shorthand.** A framework's usual event shorthand (Vue's `@event` on a *Vue component*, Angular's
282
+ `(event)` output binding) is wired for that framework's own event system; a plain custom element's
283
+ events are native `CustomEvent`s and need the same binding path used for native DOM events —
284
+ `@lyra-change="handler"` in Vue, `(lyra-change)="handler()"` in Angular, `on:lyra-change` in Svelte,
285
+ or `element.addEventListener('lyra-change', handler)` directly when a template binding isn't
286
+ available. Lyra's own event names are consistently kebab-case (`lyra-change`, `lyra-cell-click`,
287
+ `lyra-selection-change`, …) rather than camelCase, specifically to stay friendly to this binding
288
+ path — some other custom-element libraries use camelCase event names, which can silently fail to
289
+ bind in an in-DOM (non-compiled) Vue template because HTML attribute/directive names are
290
+ case-insensitive there; `addEventListener` works regardless of case either way.
291
+
292
+ ## Editor autocomplete (VS Code, JetBrains)
293
+
294
+ TypeScript consumers already get tag/attribute completion for free from the generated
295
+ `HTMLElementTagNameMap`. Plain HTML, and in-DOM Vue or Angular templates, don't go through that type
296
+ graph, so this package also ships small editor data files generated from `custom-elements.json`:
297
+ `vscode-html-data.json` (tag names, attributes, and slots) and `vscode-css-data.json` (every
298
+ `--lyra-*` custom property). Point VS Code's
299
+ [`html.customData`](https://code.visualstudio.com/docs/languages/html#_html-custom-data) and
300
+ [`css.customData`](https://code.visualstudio.com/docs/languages/css#_css-custom-data) settings at
301
+ them — typically in a workspace `.vscode/settings.json` so the whole team picks it up:
302
+
303
+ ```json
304
+ {
305
+ "html.customData": ["./node_modules/@aceshooting/lyra-ui/vscode-html-data.json"],
306
+ "css.customData": ["./node_modules/@aceshooting/lyra-ui/vscode-css-data.json"]
307
+ }
308
+ ```
309
+
310
+ Both settings accept an array, so add these alongside any other custom-data files the workspace
311
+ already references. WebStorm/IntelliJ users get the same tag/attribute/slot/CSS-part/custom-property
312
+ coverage automatically from the bundled `web-types.json` — JetBrains IDEs pick up a dependency's
313
+ `web-types.json` with no extra configuration once the package is installed.
314
+
222
315
  ## Components
223
316
 
224
- The catalog below lists all 156 tags in the current Custom Elements Manifest, grouped by
317
+ The catalog below lists all 168 tags in the current Custom Elements Manifest, grouped by
225
318
  capability. The manifest and live docs are the authoritative sources for the complete generated
226
319
  API details.
227
320
 
@@ -249,6 +342,21 @@ API details.
249
342
  | `<lyra-progress-bar>` + `<lyra-progress-ring>` | `wa-progress-bar` / `wa-progress-ring` | Determinate or indeterminate progress indicators |
250
343
  | `<lyra-flag>` | — (extra) | Country/language flags for i18n pickers — needs the optional peer `@aceshooting/lyra-flags` |
251
344
 
345
+ **Additional media and interaction primitives**
346
+
347
+ | Component | Mirrors | Notes |
348
+ |-----------|---------|-------|
349
+ | `<lyra-animated-image>` | — (extra) | Animated image playback with a captured still frame and reduced-motion support |
350
+ | `<lyra-animation>` | — (extra) | Web Animations API wrapper for declarative preset or custom animations |
351
+ | `<lyra-avatar-group>` | — (extra) | Responsive avatar grouping with a localized overflow indicator |
352
+ | `<lyra-include>` | — (extra) | Loads sanitized HTML or text content from a URL |
353
+ | `<lyra-known-date>` | — (extra) | Form-associated date entry control with separate day, month, and year fields |
354
+ | `<lyra-lightbox>` | — (extra) | Full-screen modal image viewer with navigation and pan/zoom |
355
+ | `<lyra-qr-code>` | — (extra) | Canvas QR renderer; needs the optional peer `qrcode` |
356
+ | `<lyra-random-content>` | — (extra) | Random, unique, or sequential slotted-content selection with autoplay |
357
+ | `<lyra-timeline>` + `<lyra-timeline-item>` | — (extra) | Vertical or horizontal chronological event layout |
358
+ | `<lyra-tour>` | — (extra) | Anchored onboarding tour with spotlight, keyboard navigation, and focus management |
359
+
252
360
  **Dashboard atoms**
253
361
 
254
362
  | Component | Mirrors | Notes |
@@ -384,6 +492,7 @@ each one-liner below.
384
492
  | `<lyra-card>` | — (extra) | Generic bordered content container (`header`/`media`/`footer`/`actions` slots) — a direct `<lyra-*>` counterpart to `wa-card` |
385
493
  | `<lyra-stepper>` | — (extra) | Ordered multi-step wizard navigation — label + index, current/completed/locked/error state, click-to-jump, data-driven and controlled |
386
494
  | `<lyra-segmented>` | — (extra) | Single-select text/icon button row with the WAI-ARIA APG `radiogroup` contract built in (roving tabindex, automatic activation) |
495
+ | `<lyra-swatch-picker>` | — (extra) | Single-select picker over a fixed set of color swatches — `radiogroup` semantics (roving tabindex, automatic activation), themeable selection ring |
387
496
  | `<lyra-diff-view>` | — (extra) | Real two-string line diff (LCS-aligned), rendered as interleaved unified-diff output |
388
497
  | `<lyra-poll-status>` | — (extra) | "Next scheduled refresh" countdown with a built-in pause control and live-region announcements |
389
498
  | `<lyra-code-block-core>` | — (extra) | Build-lean `lyra-code-block` variant for a consumer whose `languages` map already covers every language it renders — never references shiki's full ~200-language table |