@aceshooting/lyra-ui 3.5.0 → 3.6.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 (269) hide show
  1. package/README.md +110 -2
  2. package/custom-elements.json +48093 -40204
  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/calendar/calendar.class.d.ts.map +1 -1
  40. package/dist/components/calendar/calendar.class.js +1 -12
  41. package/dist/components/calendar/calendar.class.js.map +1 -1
  42. package/dist/components/calendar-viewer/calendar-viewer.class.d.ts +1 -1
  43. package/dist/components/calendar-viewer/calendar-viewer.class.d.ts.map +1 -1
  44. package/dist/components/calendar-viewer/calendar-viewer.class.js +2 -2
  45. package/dist/components/calendar-viewer/calendar-viewer.class.js.map +1 -1
  46. package/dist/components/chart/box-plot.class.d.ts.map +1 -1
  47. package/dist/components/chart/box-plot.class.js +1 -3
  48. package/dist/components/chart/box-plot.class.js.map +1 -1
  49. package/dist/components/chart/chart.class.d.ts.map +1 -1
  50. package/dist/components/chart/chart.class.js +1 -3
  51. package/dist/components/chart/chart.class.js.map +1 -1
  52. package/dist/components/code-editor/code-editor.styles.d.ts.map +1 -1
  53. package/dist/components/code-editor/code-editor.styles.js +5 -2
  54. package/dist/components/code-editor/code-editor.styles.js.map +1 -1
  55. package/dist/components/contact-viewer/contact-viewer.class.d.ts +4 -1
  56. package/dist/components/contact-viewer/contact-viewer.class.d.ts.map +1 -1
  57. package/dist/components/contact-viewer/contact-viewer.class.js +5 -2
  58. package/dist/components/contact-viewer/contact-viewer.class.js.map +1 -1
  59. package/dist/components/email-viewer/email-viewer.class.d.ts +4 -1
  60. package/dist/components/email-viewer/email-viewer.class.d.ts.map +1 -1
  61. package/dist/components/email-viewer/email-viewer.class.js +5 -2
  62. package/dist/components/email-viewer/email-viewer.class.js.map +1 -1
  63. package/dist/components/graph/graph.class.d.ts.map +1 -1
  64. package/dist/components/graph/graph.class.js +1 -3
  65. package/dist/components/graph/graph.class.js.map +1 -1
  66. package/dist/components/heatmap/heatmap.class.d.ts.map +1 -1
  67. package/dist/components/heatmap/heatmap.class.js +1 -8
  68. package/dist/components/heatmap/heatmap.class.js.map +1 -1
  69. package/dist/components/icon/icon.styles.d.ts.map +1 -1
  70. package/dist/components/icon/icon.styles.js +1 -1
  71. package/dist/components/icon/icon.styles.js.map +1 -1
  72. package/dist/components/include/include.class.d.ts +104 -0
  73. package/dist/components/include/include.class.d.ts.map +1 -0
  74. package/dist/components/include/include.class.js +149 -0
  75. package/dist/components/include/include.class.js.map +1 -0
  76. package/dist/components/include/include.d.ts +2 -0
  77. package/dist/components/include/include.d.ts.map +1 -0
  78. package/dist/components/include/include.js +5 -0
  79. package/dist/components/include/include.js.map +1 -0
  80. package/dist/components/include/include.styles.d.ts +2 -0
  81. package/dist/components/include/include.styles.d.ts.map +1 -0
  82. package/dist/components/include/include.styles.js +14 -0
  83. package/dist/components/include/include.styles.js.map +1 -0
  84. package/dist/components/kbd/kbd.class.d.ts.map +1 -1
  85. package/dist/components/kbd/kbd.class.js +1 -11
  86. package/dist/components/kbd/kbd.class.js.map +1 -1
  87. package/dist/components/known-date/known-date.class.d.ts +208 -0
  88. package/dist/components/known-date/known-date.class.d.ts.map +1 -0
  89. package/dist/components/known-date/known-date.class.js +588 -0
  90. package/dist/components/known-date/known-date.class.js.map +1 -0
  91. package/dist/components/known-date/known-date.d.ts +2 -0
  92. package/dist/components/known-date/known-date.d.ts.map +1 -0
  93. package/dist/components/known-date/known-date.js +5 -0
  94. package/dist/components/known-date/known-date.js.map +1 -0
  95. package/dist/components/known-date/known-date.styles.d.ts +2 -0
  96. package/dist/components/known-date/known-date.styles.d.ts.map +1 -0
  97. package/dist/components/known-date/known-date.styles.js +134 -0
  98. package/dist/components/known-date/known-date.styles.js.map +1 -0
  99. package/dist/components/lightbox/lightbox.class.d.ts +187 -0
  100. package/dist/components/lightbox/lightbox.class.d.ts.map +1 -0
  101. package/dist/components/lightbox/lightbox.class.js +415 -0
  102. package/dist/components/lightbox/lightbox.class.js.map +1 -0
  103. package/dist/components/lightbox/lightbox.d.ts +3 -0
  104. package/dist/components/lightbox/lightbox.d.ts.map +1 -0
  105. package/dist/components/lightbox/lightbox.js +6 -0
  106. package/dist/components/lightbox/lightbox.js.map +1 -0
  107. package/dist/components/lightbox/lightbox.styles.d.ts +2 -0
  108. package/dist/components/lightbox/lightbox.styles.d.ts.map +1 -0
  109. package/dist/components/lightbox/lightbox.styles.js +179 -0
  110. package/dist/components/lightbox/lightbox.styles.js.map +1 -0
  111. package/dist/components/map/map.class.d.ts.map +1 -1
  112. package/dist/components/map/map.class.js +1 -23
  113. package/dist/components/map/map.class.js.map +1 -1
  114. package/dist/components/menu/menu.class.d.ts +1 -1
  115. package/dist/components/model-settings-panel/model-settings-panel.class.d.ts.map +1 -1
  116. package/dist/components/model-settings-panel/model-settings-panel.class.js +1 -10
  117. package/dist/components/model-settings-panel/model-settings-panel.class.js.map +1 -1
  118. package/dist/components/qr-code/qr-code-loader.d.ts +15 -0
  119. package/dist/components/qr-code/qr-code-loader.d.ts.map +1 -0
  120. package/dist/components/qr-code/qr-code-loader.js +28 -0
  121. package/dist/components/qr-code/qr-code-loader.js.map +1 -0
  122. package/dist/components/qr-code/qr-code.class.d.ts +121 -0
  123. package/dist/components/qr-code/qr-code.class.d.ts.map +1 -0
  124. package/dist/components/qr-code/qr-code.class.js +392 -0
  125. package/dist/components/qr-code/qr-code.class.js.map +1 -0
  126. package/dist/components/qr-code/qr-code.d.ts +2 -0
  127. package/dist/components/qr-code/qr-code.d.ts.map +1 -0
  128. package/dist/components/qr-code/qr-code.js +5 -0
  129. package/dist/components/qr-code/qr-code.js.map +1 -0
  130. package/dist/components/qr-code/qr-code.styles.d.ts +2 -0
  131. package/dist/components/qr-code/qr-code.styles.d.ts.map +1 -0
  132. package/dist/components/qr-code/qr-code.styles.js +48 -0
  133. package/dist/components/qr-code/qr-code.styles.js.map +1 -0
  134. package/dist/components/random-content/random-content.class.d.ts +99 -0
  135. package/dist/components/random-content/random-content.class.d.ts.map +1 -0
  136. package/dist/components/random-content/random-content.class.js +268 -0
  137. package/dist/components/random-content/random-content.class.js.map +1 -0
  138. package/dist/components/random-content/random-content.d.ts +2 -0
  139. package/dist/components/random-content/random-content.d.ts.map +1 -0
  140. package/dist/components/random-content/random-content.js +5 -0
  141. package/dist/components/random-content/random-content.js.map +1 -0
  142. package/dist/components/random-content/random-content.styles.d.ts +2 -0
  143. package/dist/components/random-content/random-content.styles.d.ts.map +1 -0
  144. package/dist/components/random-content/random-content.styles.js +94 -0
  145. package/dist/components/random-content/random-content.styles.js.map +1 -0
  146. package/dist/components/result-card/result-card.class.d.ts +9 -8
  147. package/dist/components/result-card/result-card.class.d.ts.map +1 -1
  148. package/dist/components/result-card/result-card.class.js +7 -26
  149. package/dist/components/result-card/result-card.class.js.map +1 -1
  150. package/dist/components/result-card/result-field.class.d.ts.map +1 -1
  151. package/dist/components/result-card/result-field.class.js +1 -11
  152. package/dist/components/result-card/result-field.class.js.map +1 -1
  153. package/dist/components/slider/slider.class.d.ts.map +1 -1
  154. package/dist/components/slider/slider.class.js +1 -19
  155. package/dist/components/slider/slider.class.js.map +1 -1
  156. package/dist/components/source-card/source-card.class.d.ts +8 -7
  157. package/dist/components/source-card/source-card.class.d.ts.map +1 -1
  158. package/dist/components/source-card/source-card.class.js +6 -25
  159. package/dist/components/source-card/source-card.class.js.map +1 -1
  160. package/dist/components/stat/stat.class.js +1 -1
  161. package/dist/components/stat/stat.class.js.map +1 -1
  162. package/dist/components/time-range/time-range.class.d.ts.map +1 -1
  163. package/dist/components/time-range/time-range.class.js +1 -21
  164. package/dist/components/time-range/time-range.class.js.map +1 -1
  165. package/dist/components/timeline/timeline-item.class.d.ts +120 -0
  166. package/dist/components/timeline/timeline-item.class.d.ts.map +1 -0
  167. package/dist/components/timeline/timeline-item.class.js +203 -0
  168. package/dist/components/timeline/timeline-item.class.js.map +1 -0
  169. package/dist/components/timeline/timeline-item.d.ts +3 -0
  170. package/dist/components/timeline/timeline-item.d.ts.map +1 -0
  171. package/dist/components/timeline/timeline-item.js +10 -0
  172. package/dist/components/timeline/timeline-item.js.map +1 -0
  173. package/dist/components/timeline/timeline-item.styles.d.ts +2 -0
  174. package/dist/components/timeline/timeline-item.styles.d.ts.map +1 -0
  175. package/dist/components/timeline/timeline-item.styles.js +149 -0
  176. package/dist/components/timeline/timeline-item.styles.js.map +1 -0
  177. package/dist/components/timeline/timeline.class.d.ts +59 -0
  178. package/dist/components/timeline/timeline.class.d.ts.map +1 -0
  179. package/dist/components/timeline/timeline.class.js +100 -0
  180. package/dist/components/timeline/timeline.class.js.map +1 -0
  181. package/dist/components/timeline/timeline.d.ts +2 -0
  182. package/dist/components/timeline/timeline.d.ts.map +1 -0
  183. package/dist/components/timeline/timeline.js +5 -0
  184. package/dist/components/timeline/timeline.js.map +1 -0
  185. package/dist/components/timeline/timeline.styles.d.ts +2 -0
  186. package/dist/components/timeline/timeline.styles.d.ts.map +1 -0
  187. package/dist/components/timeline/timeline.styles.js +52 -0
  188. package/dist/components/timeline/timeline.styles.js.map +1 -0
  189. package/dist/components/toast/toast-item.class.d.ts.map +1 -1
  190. package/dist/components/toast/toast-item.class.js +1 -3
  191. package/dist/components/toast/toast-item.class.js.map +1 -1
  192. package/dist/components/tool-param-form/tool-param-form.class.d.ts.map +1 -1
  193. package/dist/components/tool-param-form/tool-param-form.class.js +0 -1
  194. package/dist/components/tool-param-form/tool-param-form.class.js.map +1 -1
  195. package/dist/components/tour/tour.class.d.ts +250 -0
  196. package/dist/components/tour/tour.class.d.ts.map +1 -0
  197. package/dist/components/tour/tour.class.js +530 -0
  198. package/dist/components/tour/tour.class.js.map +1 -0
  199. package/dist/components/tour/tour.d.ts +2 -0
  200. package/dist/components/tour/tour.d.ts.map +1 -0
  201. package/dist/components/tour/tour.js +5 -0
  202. package/dist/components/tour/tour.js.map +1 -0
  203. package/dist/components/tour/tour.styles.d.ts +2 -0
  204. package/dist/components/tour/tour.styles.d.ts.map +1 -0
  205. package/dist/components/tour/tour.styles.js +165 -0
  206. package/dist/components/tour/tour.styles.js.map +1 -0
  207. package/dist/components/virtual-list/virtual-list.class.d.ts.map +1 -1
  208. package/dist/components/virtual-list/virtual-list.class.js +1 -3
  209. package/dist/components/virtual-list/virtual-list.class.js.map +1 -1
  210. package/dist/components/word-cloud/word-cloud.class.d.ts.map +1 -1
  211. package/dist/components/word-cloud/word-cloud.class.js +1 -8
  212. package/dist/components/word-cloud/word-cloud.class.js.map +1 -1
  213. package/dist/components/zoomable-frame/zoomable-frame.class.d.ts +15 -0
  214. package/dist/components/zoomable-frame/zoomable-frame.class.d.ts.map +1 -1
  215. package/dist/components/zoomable-frame/zoomable-frame.class.js +18 -0
  216. package/dist/components/zoomable-frame/zoomable-frame.class.js.map +1 -1
  217. package/dist/internal/a11y.d.ts +4 -0
  218. package/dist/internal/a11y.d.ts.map +1 -1
  219. package/dist/internal/a11y.js +17 -0
  220. package/dist/internal/a11y.js.map +1 -1
  221. package/dist/internal/canvas.d.ts +8 -0
  222. package/dist/internal/canvas.d.ts.map +1 -0
  223. package/dist/internal/canvas.js +14 -0
  224. package/dist/internal/canvas.js.map +1 -0
  225. package/dist/internal/localization.d.ts +1 -1
  226. package/dist/internal/localization.d.ts.map +1 -1
  227. package/dist/internal/localization.js +20 -2
  228. package/dist/internal/localization.js.map +1 -1
  229. package/dist/internal/motion.d.ts +5 -0
  230. package/dist/internal/motion.d.ts.map +1 -0
  231. package/dist/internal/motion.js +7 -0
  232. package/dist/internal/motion.js.map +1 -0
  233. package/dist/internal/numbers.d.ts +11 -0
  234. package/dist/internal/numbers.d.ts.map +1 -1
  235. package/dist/internal/numbers.js +21 -0
  236. package/dist/internal/numbers.js.map +1 -1
  237. package/dist/internal/positioner.d.ts +14 -0
  238. package/dist/internal/positioner.d.ts.map +1 -1
  239. package/dist/internal/positioner.js +27 -0
  240. package/dist/internal/positioner.js.map +1 -1
  241. package/dist/internal/root-registration-allowlist.d.ts +1 -1
  242. package/dist/internal/root-registration-allowlist.d.ts.map +1 -1
  243. package/dist/internal/root-registration-allowlist.js +11 -0
  244. package/dist/internal/root-registration-allowlist.js.map +1 -1
  245. package/dist/internal/rtl.d.ts +0 -11
  246. package/dist/internal/rtl.d.ts.map +1 -1
  247. package/dist/internal/rtl.js +0 -13
  248. package/dist/internal/rtl.js.map +1 -1
  249. package/dist/internal/safe-css.d.ts +15 -0
  250. package/dist/internal/safe-css.d.ts.map +1 -0
  251. package/dist/internal/safe-css.js +25 -0
  252. package/dist/internal/safe-css.js.map +1 -0
  253. package/dist/internal/strip-host-title.d.ts +24 -0
  254. package/dist/internal/strip-host-title.d.ts.map +1 -0
  255. package/dist/internal/strip-host-title.js +46 -0
  256. package/dist/internal/strip-host-title.js.map +1 -0
  257. package/dist/internal/tokens.styles.d.ts.map +1 -1
  258. package/dist/internal/tokens.styles.js +4 -0
  259. package/dist/internal/tokens.styles.js.map +1 -1
  260. package/dist/lyra.d.ts +33 -0
  261. package/dist/lyra.d.ts.map +1 -1
  262. package/dist/lyra.js +22 -0
  263. package/dist/lyra.js.map +1 -1
  264. package/llms-full.txt +90 -0
  265. package/llms.txt +3 -0
  266. package/package.json +43 -6
  267. package/vscode-css-data.json +719 -0
  268. package/vscode-html-data.json +10579 -0
  269. package/web-types.json +12161 -0
@@ -0,0 +1,131 @@
1
+ import { type PropertyValues, type TemplateResult } from 'lit';
2
+ import { LyraElement } from '../../internal/lyra-element.js';
3
+ export interface LyraAnimatedImageEventMap {
4
+ 'lyra-load': CustomEvent<undefined>;
5
+ 'lyra-error': CustomEvent<undefined>;
6
+ 'lyra-play': CustomEvent<undefined>;
7
+ 'lyra-pause': CustomEvent<undefined>;
8
+ blur: CustomEvent<undefined>;
9
+ focus: CustomEvent<undefined>;
10
+ }
11
+ /**
12
+ * `<lyra-animated-image>` -- displays an animated GIF/APNG/WebP with a
13
+ * play/pause control, defaulting to a frozen first frame both at rest and
14
+ * automatically under `prefers-reduced-motion: reduce` (unless the page
15
+ * author explicitly opts back in via `respect-reduced-motion="false"`), so
16
+ * motion is never forced on a user who asked for less of it.
17
+ *
18
+ * **Freeze-frame mechanism.** The live `<img>`'s `load` event handler
19
+ * synchronously draws the just-loaded image to `[part="canvas"]` (a
20
+ * DPR-aware `drawImage()`, the same pattern `<lyra-heatmap>` uses for its own
21
+ * canvas sizing) before any animation frames have had a chance to advance.
22
+ * That captured frame is what pausing always reverts to -- it is not
23
+ * re-captured on every pause, only once per successful `src` load. Both
24
+ * `[part="image"]` and `[part="canvas"]` stay mounted at all times (never
25
+ * `display: none`/removed) so the browser's native decode loop keeps running
26
+ * even while visually covered by the frozen canvas; only opacity and
27
+ * `aria-hidden` swap between them, driven by the effective `playing` state.
28
+ *
29
+ * **`play` vs. `playing`.** `play` is the caller's intent (settable,
30
+ * reflects nothing on its own). `playing` is the read-only, reflected effect
31
+ * after reduced-motion arbitration: `play && !(respectReducedMotion &&
32
+ * <OS prefers-reduced-motion: reduce>)`. A page can set `.play = true` while
33
+ * reduced motion still keeps the visual frozen -- `lyra-play`/`lyra-pause`
34
+ * only fire on a real transition of the resolved `playing` value, never on a
35
+ * `play` assignment that reduced motion blocks from taking visible effect.
36
+ *
37
+ * **Safety.** `src` is re-validated through `safeMediaSrc()` (the same
38
+ * allowlist `<lyra-media-card>` uses) before it is ever assigned to the real
39
+ * `<img src>`. An empty `src` renders no `src` attribute and is not an
40
+ * error; a non-empty `src` that fails the check is treated exactly like a
41
+ * native image decode failure -- `lyra-error` fires and no request is ever
42
+ * attempted.
43
+ *
44
+ * **Decorative-only is not supported.** An explicit `alt=""` still falls
45
+ * back to the localized `animatedImageDefaultAlt` string rather than staying
46
+ * empty/presentational -- the same deliberate tradeoff `<lyra-media-card>`'s
47
+ * `imgAlt` getter already makes for its own `alt`/`filename` fallback chain.
48
+ *
49
+ * Deliberately no label/hint/error chrome -- this is not a form-associated
50
+ * control (nothing resembling a value the user submits).
51
+ *
52
+ * @customElement lyra-animated-image
53
+ * @slot play-icon - Custom icon shown on `[part="play-button"]` while frozen/paused. Defaults to a play glyph.
54
+ * @slot pause-icon - Custom icon shown on `[part="play-button"]` while playing. Defaults to a pause glyph.
55
+ * @event lyra-load - The live `<img>` finished loading. Fires again on every successful subsequent `src` change.
56
+ * @event lyra-error - The live `<img>` failed to load, or `src` was non-empty but failed the safe-URL check. Never fires for an empty `src`.
57
+ * @event lyra-play - The effective `playing` state transitioned `false` -> `true`.
58
+ * @event lyra-pause - The effective `playing` state transitioned `true` -> `false` (including a reduced-motion change forcing a freeze while `play` stays `true`).
59
+ * @event blur - Re-dispatched from the internal play/pause button as a bubbling, composed event.
60
+ * @event focus - Re-dispatched from the internal play/pause button as a bubbling, composed event.
61
+ * @csspart base - Root wrapper; positioning context for `control-box`.
62
+ * @csspart image - The live `<img>`.
63
+ * @csspart canvas - The frozen-frame `<canvas>`, shown in place of `image` while not playing.
64
+ * @csspart control-box - The container that surrounds and backgrounds the play/pause button. Only rendered once loaded and error-free.
65
+ * @csspart play-button - The `<button type="button">` inside `control-box` that toggles `play`.
66
+ * @cssprop --lyra-animated-image-control-box-size - The size of `control-box`. Defaults to `var(--lyra-icon-button-size)`.
67
+ * @cssprop --lyra-animated-image-icon-size - The size of the play/pause icons. Defaults to `calc(var(--lyra-icon-button-size) * 0.35)`.
68
+ * @cssprop --lyra-animated-image-max-height - Caps the rendered media's block-size. Defaults to `var(--lyra-size-20rem)`.
69
+ */
70
+ export declare class LyraAnimatedImage extends LyraElement<LyraAnimatedImageEventMap> {
71
+ static styles: import("lit").CSSResultGroup[];
72
+ /** The path to the image to load. Always re-validated against a
73
+ * safe-scheme allowlist before use -- see the class doc. */
74
+ src: string;
75
+ /** A description of the image used by assistive devices. Falls back to
76
+ * the localized `animatedImageDefaultAlt` when empty -- see the class doc. */
77
+ alt: string;
78
+ /** Requests animated playback. Distinct from the read-only `playing`
79
+ * effect -- see the class doc's "`play` vs. `playing`" section. */
80
+ play: boolean;
81
+ /** When `true` (default) and the platform reports
82
+ * `prefers-reduced-motion: reduce`, playback stays frozen and
83
+ * `[part="play-button"]` is disabled regardless of `play`. Set to `false`
84
+ * to let `play` take effect even under a reduced-motion preference -- a
85
+ * deliberate, page-author-level override. */
86
+ respectReducedMotion: boolean;
87
+ /** Accessible-name override for `[part="play-button"]`. Maps to the
88
+ * host's `aria-label` attribute and, once set, wins verbatim over the
89
+ * computed per-state Play/Pause label in both play and pause states --
90
+ * it does not itself vary by state. Never touches `[part="image"]`'s
91
+ * `alt` / `[part="canvas"]`'s `aria-label`, which stay independently
92
+ * sourced from `alt`. A consumer wanting state-sensitive custom wording
93
+ * without losing the Play/Pause distinction should override the
94
+ * `playWithContext`/`pauseWithContext`/`animatedImageDefaultAlt` strings
95
+ * instead. */
96
+ accessibleLabel: string;
97
+ private hasLoaded;
98
+ private hasError;
99
+ private _playing;
100
+ private mediaQuery?;
101
+ private imageEl?;
102
+ private canvasEl?;
103
+ private playButtonEl?;
104
+ /** The effective playing state after reduced-motion arbitration -- also
105
+ * reflected as a `playing` host attribute. Read-only; control playback
106
+ * via `play`. */
107
+ get playing(): boolean;
108
+ set playing(_value: boolean);
109
+ connectedCallback(): void;
110
+ disconnectedCallback(): void;
111
+ private onMotionPreferenceChange;
112
+ protected willUpdate(changed: PropertyValues): void;
113
+ private get effectiveAlt();
114
+ private get toggleLabel();
115
+ private onImageLoad;
116
+ private onImageError;
117
+ private onToggleClick;
118
+ /** Focus the play/pause control. */
119
+ focus(options?: FocusOptions): void;
120
+ /** Blur the play/pause control. */
121
+ blur(): void;
122
+ private onControlFocus;
123
+ private onControlBlur;
124
+ render(): TemplateResult;
125
+ }
126
+ declare global {
127
+ interface HTMLElementTagNameMap {
128
+ 'lyra-animated-image': LyraAnimatedImage;
129
+ }
130
+ }
131
+ //# sourceMappingURL=animated-image.class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animated-image.class.d.ts","sourceRoot":"","sources":["../../../src/components/animated-image/animated-image.class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAE9E,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAM7D,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACpC,YAAY,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACrC,WAAW,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACpC,YAAY,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IAC7B,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,qBAAa,iBAAkB,SAAQ,WAAW,CAAC,yBAAyB,CAAC;IAC3E,MAAM,CAAC,MAAM,iCAAgC;IAE7C;iEAC6D;IACjD,GAAG,SAAM;IAErB;mFAC+E;IACnE,GAAG,SAAM;IAErB;wEACoE;IACvC,IAAI,UAAS;IAE1C;;;;kDAI8C;IACmC,oBAAoB,UAAQ;IAE7G;;;;;;;;mBAQe;IACwB,eAAe,SAAM;IAEnD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;IAElC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAC,CAAiB;IAEX,OAAO,CAAC,OAAO,CAAC,CAAmB;IAClC,OAAO,CAAC,QAAQ,CAAC,CAAoB;IAChC,OAAO,CAAC,YAAY,CAAC,CAAoB;IAExE;;sBAEkB;IAClB,IAAI,OAAO,IAAI,OAAO,CAErB;IAID,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAI;IAE/B,iBAAiB,IAAI,IAAI,CAKxB;IAED,oBAAoB,IAAI,IAAI,CAI3B;IAED,OAAO,CAAC,wBAAwB,CAI9B;IAEF,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAyBlD;IAED,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,KAAK,WAAW,GAMtB;IAED,OAAO,CAAC,WAAW,CAqBjB;IAEF,OAAO,CAAC,YAAY,CAIlB;IAEF,OAAO,CAAC,aAAa,CAEnB;IAEF,oCAAoC;IAC3B,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAE3C;IAED,mCAAmC;IAC1B,IAAI,IAAI,IAAI,CAEpB;IAED,OAAO,CAAC,cAAc,CAGpB;IAEF,OAAO,CAAC,aAAa,CAGnB;IAEF,MAAM,IAAI,cAAc,CAmDvB;CACF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,qBAAqB,EAAE,iBAAiB,CAAC;KAC1C;CACF"}
@@ -0,0 +1,296 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { html, nothing } from 'lit';
8
+ import { property, query, state } from 'lit/decorators.js';
9
+ import { LyraElement } from '../../internal/lyra-element.js';
10
+ import { playIcon, pauseIcon } from '../../internal/icons.js';
11
+ import { safeMediaSrc } from '../../internal/safe-url.js';
12
+ import { prefersReducedMotion } from '../../internal/motion.js';
13
+ import { styles } from './animated-image.styles.js';
14
+ /**
15
+ * `<lyra-animated-image>` -- displays an animated GIF/APNG/WebP with a
16
+ * play/pause control, defaulting to a frozen first frame both at rest and
17
+ * automatically under `prefers-reduced-motion: reduce` (unless the page
18
+ * author explicitly opts back in via `respect-reduced-motion="false"`), so
19
+ * motion is never forced on a user who asked for less of it.
20
+ *
21
+ * **Freeze-frame mechanism.** The live `<img>`'s `load` event handler
22
+ * synchronously draws the just-loaded image to `[part="canvas"]` (a
23
+ * DPR-aware `drawImage()`, the same pattern `<lyra-heatmap>` uses for its own
24
+ * canvas sizing) before any animation frames have had a chance to advance.
25
+ * That captured frame is what pausing always reverts to -- it is not
26
+ * re-captured on every pause, only once per successful `src` load. Both
27
+ * `[part="image"]` and `[part="canvas"]` stay mounted at all times (never
28
+ * `display: none`/removed) so the browser's native decode loop keeps running
29
+ * even while visually covered by the frozen canvas; only opacity and
30
+ * `aria-hidden` swap between them, driven by the effective `playing` state.
31
+ *
32
+ * **`play` vs. `playing`.** `play` is the caller's intent (settable,
33
+ * reflects nothing on its own). `playing` is the read-only, reflected effect
34
+ * after reduced-motion arbitration: `play && !(respectReducedMotion &&
35
+ * <OS prefers-reduced-motion: reduce>)`. A page can set `.play = true` while
36
+ * reduced motion still keeps the visual frozen -- `lyra-play`/`lyra-pause`
37
+ * only fire on a real transition of the resolved `playing` value, never on a
38
+ * `play` assignment that reduced motion blocks from taking visible effect.
39
+ *
40
+ * **Safety.** `src` is re-validated through `safeMediaSrc()` (the same
41
+ * allowlist `<lyra-media-card>` uses) before it is ever assigned to the real
42
+ * `<img src>`. An empty `src` renders no `src` attribute and is not an
43
+ * error; a non-empty `src` that fails the check is treated exactly like a
44
+ * native image decode failure -- `lyra-error` fires and no request is ever
45
+ * attempted.
46
+ *
47
+ * **Decorative-only is not supported.** An explicit `alt=""` still falls
48
+ * back to the localized `animatedImageDefaultAlt` string rather than staying
49
+ * empty/presentational -- the same deliberate tradeoff `<lyra-media-card>`'s
50
+ * `imgAlt` getter already makes for its own `alt`/`filename` fallback chain.
51
+ *
52
+ * Deliberately no label/hint/error chrome -- this is not a form-associated
53
+ * control (nothing resembling a value the user submits).
54
+ *
55
+ * @customElement lyra-animated-image
56
+ * @slot play-icon - Custom icon shown on `[part="play-button"]` while frozen/paused. Defaults to a play glyph.
57
+ * @slot pause-icon - Custom icon shown on `[part="play-button"]` while playing. Defaults to a pause glyph.
58
+ * @event lyra-load - The live `<img>` finished loading. Fires again on every successful subsequent `src` change.
59
+ * @event lyra-error - The live `<img>` failed to load, or `src` was non-empty but failed the safe-URL check. Never fires for an empty `src`.
60
+ * @event lyra-play - The effective `playing` state transitioned `false` -> `true`.
61
+ * @event lyra-pause - The effective `playing` state transitioned `true` -> `false` (including a reduced-motion change forcing a freeze while `play` stays `true`).
62
+ * @event blur - Re-dispatched from the internal play/pause button as a bubbling, composed event.
63
+ * @event focus - Re-dispatched from the internal play/pause button as a bubbling, composed event.
64
+ * @csspart base - Root wrapper; positioning context for `control-box`.
65
+ * @csspart image - The live `<img>`.
66
+ * @csspart canvas - The frozen-frame `<canvas>`, shown in place of `image` while not playing.
67
+ * @csspart control-box - The container that surrounds and backgrounds the play/pause button. Only rendered once loaded and error-free.
68
+ * @csspart play-button - The `<button type="button">` inside `control-box` that toggles `play`.
69
+ * @cssprop --lyra-animated-image-control-box-size - The size of `control-box`. Defaults to `var(--lyra-icon-button-size)`.
70
+ * @cssprop --lyra-animated-image-icon-size - The size of the play/pause icons. Defaults to `calc(var(--lyra-icon-button-size) * 0.35)`.
71
+ * @cssprop --lyra-animated-image-max-height - Caps the rendered media's block-size. Defaults to `var(--lyra-size-20rem)`.
72
+ */
73
+ export class LyraAnimatedImage extends LyraElement {
74
+ constructor() {
75
+ super(...arguments);
76
+ /** The path to the image to load. Always re-validated against a
77
+ * safe-scheme allowlist before use -- see the class doc. */
78
+ this.src = '';
79
+ /** A description of the image used by assistive devices. Falls back to
80
+ * the localized `animatedImageDefaultAlt` when empty -- see the class doc. */
81
+ this.alt = '';
82
+ /** Requests animated playback. Distinct from the read-only `playing`
83
+ * effect -- see the class doc's "`play` vs. `playing`" section. */
84
+ this.play = false;
85
+ /** When `true` (default) and the platform reports
86
+ * `prefers-reduced-motion: reduce`, playback stays frozen and
87
+ * `[part="play-button"]` is disabled regardless of `play`. Set to `false`
88
+ * to let `play` take effect even under a reduced-motion preference -- a
89
+ * deliberate, page-author-level override. */
90
+ this.respectReducedMotion = true;
91
+ /** Accessible-name override for `[part="play-button"]`. Maps to the
92
+ * host's `aria-label` attribute and, once set, wins verbatim over the
93
+ * computed per-state Play/Pause label in both play and pause states --
94
+ * it does not itself vary by state. Never touches `[part="image"]`'s
95
+ * `alt` / `[part="canvas"]`'s `aria-label`, which stay independently
96
+ * sourced from `alt`. A consumer wanting state-sensitive custom wording
97
+ * without losing the Play/Pause distinction should override the
98
+ * `playWithContext`/`pauseWithContext`/`animatedImageDefaultAlt` strings
99
+ * instead. */
100
+ this.accessibleLabel = '';
101
+ this.hasLoaded = false;
102
+ this.hasError = false;
103
+ this._playing = false;
104
+ this.onMotionPreferenceChange = () => {
105
+ // Picks up a live OS-level preference change while already connected --
106
+ // recomputed in willUpdate() below, not read directly off this event.
107
+ this.requestUpdate();
108
+ };
109
+ this.onImageLoad = () => {
110
+ this.hasError = false;
111
+ this.hasLoaded = true;
112
+ const img = this.imageEl;
113
+ const canvas = this.canvasEl;
114
+ if (img && canvas) {
115
+ const width = img.naturalWidth;
116
+ const height = img.naturalHeight;
117
+ const dpr = window.devicePixelRatio || 1;
118
+ // Setting width/height resets any prior transform, so a fresh
119
+ // ctx.scale() below is always relative to an untransformed canvas --
120
+ // safe to call again on every subsequent src's own load.
121
+ canvas.width = width * dpr;
122
+ canvas.height = height * dpr;
123
+ const ctx = canvas.getContext('2d');
124
+ if (ctx) {
125
+ ctx.scale(dpr, dpr);
126
+ ctx.drawImage(img, 0, 0, width, height);
127
+ }
128
+ }
129
+ this.emit('lyra-load');
130
+ };
131
+ this.onImageError = () => {
132
+ this.hasLoaded = false;
133
+ this.hasError = true;
134
+ this.emit('lyra-error');
135
+ };
136
+ this.onToggleClick = () => {
137
+ this.play = !this.play;
138
+ };
139
+ this.onControlFocus = (event) => {
140
+ event.stopPropagation();
141
+ this.emit('focus');
142
+ };
143
+ this.onControlBlur = (event) => {
144
+ event.stopPropagation();
145
+ this.emit('blur');
146
+ };
147
+ }
148
+ static { this.styles = [LyraElement.styles, styles]; }
149
+ /** The effective playing state after reduced-motion arbitration -- also
150
+ * reflected as a `playing` host attribute. Read-only; control playback
151
+ * via `play`. */
152
+ get playing() {
153
+ return this._playing;
154
+ }
155
+ // Kept as a no-op setter (rather than omitted) so `el.playing = x` doesn't
156
+ // throw in this strict-mode class body -- assigning has no defined
157
+ // effect, per the class doc; control playback via `.play` instead.
158
+ set playing(_value) { }
159
+ connectedCallback() {
160
+ super.connectedCallback();
161
+ this.mediaQuery =
162
+ typeof matchMedia === 'function' ? matchMedia('(prefers-reduced-motion: reduce)') : undefined;
163
+ this.mediaQuery?.addEventListener('change', this.onMotionPreferenceChange);
164
+ }
165
+ disconnectedCallback() {
166
+ this.mediaQuery?.removeEventListener('change', this.onMotionPreferenceChange);
167
+ this.mediaQuery = undefined;
168
+ super.disconnectedCallback();
169
+ }
170
+ willUpdate(changed) {
171
+ if (changed.has('src')) {
172
+ this.hasLoaded = false;
173
+ this.hasError = false;
174
+ const trimmed = this.src.trim();
175
+ // An empty src never asked for anything to load -- not an error. A
176
+ // non-empty src that fails the safe-URL check never reaches the real
177
+ // <img src> sink, so its failure has to be reported here instead of
178
+ // waiting on a native `error` event that will never fire.
179
+ if (trimmed !== '' && safeMediaSrc(this.src) === null) {
180
+ this.hasError = true;
181
+ this.emit('lyra-error');
182
+ }
183
+ }
184
+ const nextPlaying = this.play && !(this.respectReducedMotion && prefersReducedMotion());
185
+ if (nextPlaying !== this._playing) {
186
+ this._playing = nextPlaying;
187
+ this.toggleAttribute('playing', nextPlaying);
188
+ this.emit(nextPlaying ? 'lyra-play' : 'lyra-pause');
189
+ }
190
+ // Private CSS-only hook (see the stylesheet) -- keeps the live <img>
191
+ // visible while still loading or after a decode failure, independent of
192
+ // the `playing` attribute above.
193
+ this.toggleAttribute('data-loaded', this.hasLoaded);
194
+ }
195
+ get effectiveAlt() {
196
+ return this.alt || this.localize('animatedImageDefaultAlt');
197
+ }
198
+ get toggleLabel() {
199
+ if (this.accessibleLabel)
200
+ return this.accessibleLabel;
201
+ const name = this.effectiveAlt;
202
+ return this.playing
203
+ ? this.localize('pauseWithContext', undefined, { name })
204
+ : this.localize('playWithContext', undefined, { name });
205
+ }
206
+ /** Focus the play/pause control. */
207
+ focus(options) {
208
+ this.playButtonEl?.focus(options);
209
+ }
210
+ /** Blur the play/pause control. */
211
+ blur() {
212
+ this.playButtonEl?.blur();
213
+ }
214
+ render() {
215
+ const src = safeMediaSrc(this.src);
216
+ const alt = this.effectiveAlt;
217
+ // The single condition both the stylesheet's [data-loaded]:not([playing])
218
+ // rule and the aria-hidden bindings below key off of -- kept as one
219
+ // local so the two never drift out of sync with each other.
220
+ const frozen = this.hasLoaded && !this.playing;
221
+ const showControls = this.hasLoaded && !this.hasError;
222
+ const disabled = this.respectReducedMotion && prefersReducedMotion();
223
+ return html `
224
+ <div part="base">
225
+ <img
226
+ part="image"
227
+ src=${src ?? nothing}
228
+ alt=${alt}
229
+ aria-hidden=${frozen ? 'true' : nothing}
230
+ @load=${this.onImageLoad}
231
+ @error=${this.onImageError}
232
+ />
233
+ <canvas
234
+ part="canvas"
235
+ role="img"
236
+ aria-label=${alt}
237
+ tabindex="-1"
238
+ aria-hidden=${frozen ? nothing : 'true'}
239
+ ></canvas>
240
+ ${showControls
241
+ ? html `
242
+ <div part="control-box">
243
+ <button
244
+ part="play-button"
245
+ type="button"
246
+ aria-label=${this.toggleLabel}
247
+ ?disabled=${disabled}
248
+ @click=${this.onToggleClick}
249
+ @focus=${this.onControlFocus}
250
+ @blur=${this.onControlBlur}
251
+ >
252
+ <span class="icon" ?hidden=${this.playing}>
253
+ <slot name="play-icon">${playIcon()}</slot>
254
+ </span>
255
+ <span class="icon" ?hidden=${!this.playing}>
256
+ <slot name="pause-icon">${pauseIcon()}</slot>
257
+ </span>
258
+ </button>
259
+ </div>
260
+ `
261
+ : nothing}
262
+ </div>
263
+ `;
264
+ }
265
+ }
266
+ __decorate([
267
+ property()
268
+ ], LyraAnimatedImage.prototype, "src", void 0);
269
+ __decorate([
270
+ property()
271
+ ], LyraAnimatedImage.prototype, "alt", void 0);
272
+ __decorate([
273
+ property({ type: Boolean })
274
+ ], LyraAnimatedImage.prototype, "play", void 0);
275
+ __decorate([
276
+ property({ type: Boolean, reflect: true, attribute: 'respect-reduced-motion' })
277
+ ], LyraAnimatedImage.prototype, "respectReducedMotion", void 0);
278
+ __decorate([
279
+ property({ attribute: 'aria-label' })
280
+ ], LyraAnimatedImage.prototype, "accessibleLabel", void 0);
281
+ __decorate([
282
+ state()
283
+ ], LyraAnimatedImage.prototype, "hasLoaded", void 0);
284
+ __decorate([
285
+ state()
286
+ ], LyraAnimatedImage.prototype, "hasError", void 0);
287
+ __decorate([
288
+ query('[part="image"]')
289
+ ], LyraAnimatedImage.prototype, "imageEl", void 0);
290
+ __decorate([
291
+ query('[part="canvas"]')
292
+ ], LyraAnimatedImage.prototype, "canvasEl", void 0);
293
+ __decorate([
294
+ query('[part="play-button"]')
295
+ ], LyraAnimatedImage.prototype, "playButtonEl", void 0);
296
+ //# sourceMappingURL=animated-image.class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animated-image.class.js","sourceRoot":"","sources":["../../../src/components/animated-image/animated-image.class.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './animated-image.class.js';
2
+ //# sourceMappingURL=animated-image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animated-image.d.ts","sourceRoot":"","sources":["../../../src/components/animated-image/animated-image.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './animated-image.class.js';
2
+ import { LyraAnimatedImage } from './animated-image.class.js';
3
+ import { defineElement } from '../../internal/prefix.js';
4
+ defineElement('animated-image', LyraAnimatedImage);
5
+ //# sourceMappingURL=animated-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animated-image.js","sourceRoot":"","sources":["../../../src/components/animated-image/animated-image.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,aAAa,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const styles: import("lit").CSSResult;
2
+ //# sourceMappingURL=animated-image.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animated-image.styles.d.ts","sourceRoot":"","sources":["../../../src/components/animated-image/animated-image.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,yBAkHlB,CAAC"}
@@ -0,0 +1,117 @@
1
+ import { css } from 'lit';
2
+ export const styles = css `
3
+ :host {
4
+ display: inline-block;
5
+ max-inline-size: 100%;
6
+ /* Mirrors wa-animated-image/sl-animated-image's --control-box-size and
7
+ --icon-size (component-prefixed per this library's own convention) --
8
+ both chain through the existing icon-button-size token rather than a
9
+ new bespoke literal, so the toggle reads at the same scale as
10
+ lyra-playback's own play/pause button. */
11
+ --lyra-animated-image-control-box-size: var(--lyra-icon-button-size);
12
+ --lyra-animated-image-icon-size: calc(var(--lyra-icon-button-size) * 0.35);
13
+ /* Same purpose/default as --lyra-media-card-max-height -- caps the
14
+ rendered media's block-size so one oversized animated image can't blow
15
+ out a layout. */
16
+ --lyra-animated-image-max-height: var(--lyra-size-20rem);
17
+ }
18
+
19
+ [part='base'] {
20
+ position: relative;
21
+ display: grid;
22
+ max-inline-size: 100%;
23
+ }
24
+
25
+ /* image/canvas overlap in the same grid cell so the crossfade below is a
26
+ pure opacity swap with no layout shift. */
27
+ [part='image'],
28
+ [part='canvas'] {
29
+ grid-area: 1 / 1;
30
+ inline-size: 100%;
31
+ block-size: 100%;
32
+ max-block-size: var(--lyra-animated-image-max-height);
33
+ object-fit: contain;
34
+ }
35
+
36
+ [part='image'] {
37
+ opacity: 1;
38
+ transition: opacity var(--lyra-transition-fast);
39
+ }
40
+ [part='canvas'] {
41
+ opacity: 0;
42
+ pointer-events: none;
43
+ transition: opacity var(--lyra-transition-fast);
44
+ }
45
+ /* [data-loaded] is a private, JS-driven hook (not part of the public
46
+ contract -- same pattern as this library's existing [data-invalid]
47
+ hooks) that keeps the live <img> visible while still loading or after a
48
+ decode failure, so the browser's own loading/broken-image affordance is
49
+ never hidden behind an undrawn canvas. Only once a frame has actually
50
+ been captured does the reflected [playing] host attribute get to decide
51
+ which of the two is shown. */
52
+ :host([data-loaded]:not([playing])) [part='image'] {
53
+ opacity: 0;
54
+ pointer-events: none;
55
+ }
56
+ :host([data-loaded]:not([playing])) [part='canvas'] {
57
+ opacity: 1;
58
+ pointer-events: auto;
59
+ }
60
+
61
+ [part='control-box'] {
62
+ position: absolute;
63
+ inset-block-start: var(--lyra-space-s);
64
+ inset-inline-end: var(--lyra-space-s);
65
+ inline-size: var(--lyra-animated-image-control-box-size);
66
+ block-size: var(--lyra-animated-image-control-box-size);
67
+ display: inline-flex;
68
+ align-items: center;
69
+ justify-content: center;
70
+ border-radius: 50%;
71
+ background: color-mix(in srgb, var(--lyra-color-surface) 78%, transparent);
72
+ }
73
+
74
+ [part='play-button'] {
75
+ inline-size: 100%;
76
+ block-size: 100%;
77
+ border: none;
78
+ border-radius: 50%;
79
+ background: transparent;
80
+ color: var(--lyra-color-text);
81
+ cursor: pointer;
82
+ display: inline-flex;
83
+ align-items: center;
84
+ justify-content: center;
85
+ font-size: var(--lyra-animated-image-icon-size);
86
+ -webkit-tap-highlight-color: transparent;
87
+ transition: background-color var(--lyra-transition-fast);
88
+ }
89
+ [part='play-button']:hover:not(:disabled) {
90
+ background: color-mix(in srgb, var(--lyra-color-surface) 100%, transparent);
91
+ }
92
+ [part='play-button']:disabled {
93
+ opacity: var(--lyra-opacity-disabled);
94
+ cursor: not-allowed;
95
+ }
96
+ [part='play-button']:focus-visible {
97
+ outline: var(--lyra-focus-ring-width) solid var(--lyra-focus-ring-color);
98
+ outline-offset: var(--lyra-focus-ring-offset);
99
+ }
100
+ [part='play-button'] svg {
101
+ display: block;
102
+ }
103
+
104
+ .icon {
105
+ display: inline-flex;
106
+ align-items: center;
107
+ justify-content: center;
108
+ }
109
+ /* Both play-icon/pause-icon slots render persistently (see the class doc)
110
+ and are toggled via the native hidden attribute; a plain .icon display
111
+ rule at equal specificity is not guaranteed to lose to the UA [hidden]
112
+ rule, so the override is pinned explicitly here. */
113
+ .icon[hidden] {
114
+ display: none;
115
+ }
116
+ `;
117
+ //# sourceMappingURL=animated-image.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animated-image.styles.js","sourceRoot":"","sources":["../../../src/components/animated-image/animated-image.styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkHxB,CAAC"}