@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.
- package/README.md +111 -2
- package/custom-elements.json +50239 -41857
- package/dist/components/animated-image/animated-image.class.d.ts +131 -0
- package/dist/components/animated-image/animated-image.class.d.ts.map +1 -0
- package/dist/components/animated-image/animated-image.class.js +296 -0
- package/dist/components/animated-image/animated-image.class.js.map +1 -0
- package/dist/components/animated-image/animated-image.d.ts +2 -0
- package/dist/components/animated-image/animated-image.d.ts.map +1 -0
- package/dist/components/animated-image/animated-image.js +5 -0
- package/dist/components/animated-image/animated-image.js.map +1 -0
- package/dist/components/animated-image/animated-image.styles.d.ts +2 -0
- package/dist/components/animated-image/animated-image.styles.d.ts.map +1 -0
- package/dist/components/animated-image/animated-image.styles.js +117 -0
- package/dist/components/animated-image/animated-image.styles.js.map +1 -0
- package/dist/components/animation/animation.class.d.ts +119 -0
- package/dist/components/animation/animation.class.d.ts.map +1 -0
- package/dist/components/animation/animation.class.js +420 -0
- package/dist/components/animation/animation.class.js.map +1 -0
- package/dist/components/animation/animation.d.ts +2 -0
- package/dist/components/animation/animation.d.ts.map +1 -0
- package/dist/components/animation/animation.js +5 -0
- package/dist/components/animation/animation.js.map +1 -0
- package/dist/components/animation/animation.styles.d.ts +2 -0
- package/dist/components/animation/animation.styles.d.ts.map +1 -0
- package/dist/components/animation/animation.styles.js +18 -0
- package/dist/components/animation/animation.styles.js.map +1 -0
- package/dist/components/avatar-group/avatar-group.class.d.ts +110 -0
- package/dist/components/avatar-group/avatar-group.class.d.ts.map +1 -0
- package/dist/components/avatar-group/avatar-group.class.js +182 -0
- package/dist/components/avatar-group/avatar-group.class.js.map +1 -0
- package/dist/components/avatar-group/avatar-group.d.ts +2 -0
- package/dist/components/avatar-group/avatar-group.d.ts.map +1 -0
- package/dist/components/avatar-group/avatar-group.js +5 -0
- package/dist/components/avatar-group/avatar-group.js.map +1 -0
- package/dist/components/avatar-group/avatar-group.styles.d.ts +2 -0
- package/dist/components/avatar-group/avatar-group.styles.d.ts.map +1 -0
- package/dist/components/avatar-group/avatar-group.styles.js +112 -0
- package/dist/components/avatar-group/avatar-group.styles.js.map +1 -0
- package/dist/components/button/button.class.d.ts +5 -2
- package/dist/components/button/button.class.d.ts.map +1 -1
- package/dist/components/button/button.class.js +4 -1
- package/dist/components/button/button.class.js.map +1 -1
- package/dist/components/button/button.styles.d.ts.map +1 -1
- package/dist/components/button/button.styles.js +16 -0
- package/dist/components/button/button.styles.js.map +1 -1
- package/dist/components/calendar/calendar.class.d.ts.map +1 -1
- package/dist/components/calendar/calendar.class.js +1 -12
- package/dist/components/calendar/calendar.class.js.map +1 -1
- package/dist/components/calendar-viewer/calendar-viewer.class.d.ts +1 -1
- package/dist/components/calendar-viewer/calendar-viewer.class.d.ts.map +1 -1
- package/dist/components/calendar-viewer/calendar-viewer.class.js +2 -2
- package/dist/components/calendar-viewer/calendar-viewer.class.js.map +1 -1
- package/dist/components/chart/box-plot.class.d.ts.map +1 -1
- package/dist/components/chart/box-plot.class.js +1 -3
- package/dist/components/chart/box-plot.class.js.map +1 -1
- package/dist/components/chart/chart.class.d.ts.map +1 -1
- package/dist/components/chart/chart.class.js +1 -3
- package/dist/components/chart/chart.class.js.map +1 -1
- package/dist/components/code-editor/code-editor.styles.d.ts.map +1 -1
- package/dist/components/code-editor/code-editor.styles.js +5 -2
- package/dist/components/code-editor/code-editor.styles.js.map +1 -1
- package/dist/components/contact-viewer/contact-viewer.class.d.ts +4 -1
- package/dist/components/contact-viewer/contact-viewer.class.d.ts.map +1 -1
- package/dist/components/contact-viewer/contact-viewer.class.js +5 -2
- package/dist/components/contact-viewer/contact-viewer.class.js.map +1 -1
- package/dist/components/email-viewer/email-viewer.class.d.ts +4 -1
- package/dist/components/email-viewer/email-viewer.class.d.ts.map +1 -1
- package/dist/components/email-viewer/email-viewer.class.js +5 -2
- package/dist/components/email-viewer/email-viewer.class.js.map +1 -1
- package/dist/components/file-icon/file-icon.class.d.ts +5 -1
- package/dist/components/file-icon/file-icon.class.d.ts.map +1 -1
- package/dist/components/file-icon/file-icon.class.js +20 -2
- package/dist/components/file-icon/file-icon.class.js.map +1 -1
- package/dist/components/file-icon/file-icon.styles.d.ts.map +1 -1
- package/dist/components/file-icon/file-icon.styles.js +4 -0
- package/dist/components/file-icon/file-icon.styles.js.map +1 -1
- package/dist/components/graph/graph.class.d.ts.map +1 -1
- package/dist/components/graph/graph.class.js +1 -3
- package/dist/components/graph/graph.class.js.map +1 -1
- package/dist/components/heatmap/heatmap.class.d.ts.map +1 -1
- package/dist/components/heatmap/heatmap.class.js +1 -8
- package/dist/components/heatmap/heatmap.class.js.map +1 -1
- package/dist/components/icon/icon.styles.d.ts.map +1 -1
- package/dist/components/icon/icon.styles.js +1 -1
- package/dist/components/icon/icon.styles.js.map +1 -1
- package/dist/components/include/include.class.d.ts +104 -0
- package/dist/components/include/include.class.d.ts.map +1 -0
- package/dist/components/include/include.class.js +149 -0
- package/dist/components/include/include.class.js.map +1 -0
- package/dist/components/include/include.d.ts +2 -0
- package/dist/components/include/include.d.ts.map +1 -0
- package/dist/components/include/include.js +5 -0
- package/dist/components/include/include.js.map +1 -0
- package/dist/components/include/include.styles.d.ts +2 -0
- package/dist/components/include/include.styles.d.ts.map +1 -0
- package/dist/components/include/include.styles.js +14 -0
- package/dist/components/include/include.styles.js.map +1 -0
- package/dist/components/kbd/kbd.class.d.ts.map +1 -1
- package/dist/components/kbd/kbd.class.js +1 -11
- package/dist/components/kbd/kbd.class.js.map +1 -1
- package/dist/components/known-date/known-date.class.d.ts +208 -0
- package/dist/components/known-date/known-date.class.d.ts.map +1 -0
- package/dist/components/known-date/known-date.class.js +588 -0
- package/dist/components/known-date/known-date.class.js.map +1 -0
- package/dist/components/known-date/known-date.d.ts +2 -0
- package/dist/components/known-date/known-date.d.ts.map +1 -0
- package/dist/components/known-date/known-date.js +5 -0
- package/dist/components/known-date/known-date.js.map +1 -0
- package/dist/components/known-date/known-date.styles.d.ts +2 -0
- package/dist/components/known-date/known-date.styles.d.ts.map +1 -0
- package/dist/components/known-date/known-date.styles.js +134 -0
- package/dist/components/known-date/known-date.styles.js.map +1 -0
- package/dist/components/lightbox/lightbox.class.d.ts +187 -0
- package/dist/components/lightbox/lightbox.class.d.ts.map +1 -0
- package/dist/components/lightbox/lightbox.class.js +415 -0
- package/dist/components/lightbox/lightbox.class.js.map +1 -0
- package/dist/components/lightbox/lightbox.d.ts +3 -0
- package/dist/components/lightbox/lightbox.d.ts.map +1 -0
- package/dist/components/lightbox/lightbox.js +6 -0
- package/dist/components/lightbox/lightbox.js.map +1 -0
- package/dist/components/lightbox/lightbox.styles.d.ts +2 -0
- package/dist/components/lightbox/lightbox.styles.d.ts.map +1 -0
- package/dist/components/lightbox/lightbox.styles.js +179 -0
- package/dist/components/lightbox/lightbox.styles.js.map +1 -0
- package/dist/components/map/map.class.d.ts.map +1 -1
- package/dist/components/map/map.class.js +11 -23
- package/dist/components/map/map.class.js.map +1 -1
- package/dist/components/menu/menu.class.d.ts +1 -1
- package/dist/components/model-settings-panel/model-settings-panel.class.d.ts.map +1 -1
- package/dist/components/model-settings-panel/model-settings-panel.class.js +1 -10
- package/dist/components/model-settings-panel/model-settings-panel.class.js.map +1 -1
- package/dist/components/qr-code/qr-code-loader.d.ts +15 -0
- package/dist/components/qr-code/qr-code-loader.d.ts.map +1 -0
- package/dist/components/qr-code/qr-code-loader.js +28 -0
- package/dist/components/qr-code/qr-code-loader.js.map +1 -0
- package/dist/components/qr-code/qr-code.class.d.ts +121 -0
- package/dist/components/qr-code/qr-code.class.d.ts.map +1 -0
- package/dist/components/qr-code/qr-code.class.js +392 -0
- package/dist/components/qr-code/qr-code.class.js.map +1 -0
- package/dist/components/qr-code/qr-code.d.ts +2 -0
- package/dist/components/qr-code/qr-code.d.ts.map +1 -0
- package/dist/components/qr-code/qr-code.js +5 -0
- package/dist/components/qr-code/qr-code.js.map +1 -0
- package/dist/components/qr-code/qr-code.styles.d.ts +2 -0
- package/dist/components/qr-code/qr-code.styles.d.ts.map +1 -0
- package/dist/components/qr-code/qr-code.styles.js +48 -0
- package/dist/components/qr-code/qr-code.styles.js.map +1 -0
- package/dist/components/random-content/random-content.class.d.ts +99 -0
- package/dist/components/random-content/random-content.class.d.ts.map +1 -0
- package/dist/components/random-content/random-content.class.js +268 -0
- package/dist/components/random-content/random-content.class.js.map +1 -0
- package/dist/components/random-content/random-content.d.ts +2 -0
- package/dist/components/random-content/random-content.d.ts.map +1 -0
- package/dist/components/random-content/random-content.js +5 -0
- package/dist/components/random-content/random-content.js.map +1 -0
- package/dist/components/random-content/random-content.styles.d.ts +2 -0
- package/dist/components/random-content/random-content.styles.d.ts.map +1 -0
- package/dist/components/random-content/random-content.styles.js +94 -0
- package/dist/components/random-content/random-content.styles.js.map +1 -0
- package/dist/components/result-card/result-card.class.d.ts +9 -8
- package/dist/components/result-card/result-card.class.d.ts.map +1 -1
- package/dist/components/result-card/result-card.class.js +7 -26
- package/dist/components/result-card/result-card.class.js.map +1 -1
- package/dist/components/result-card/result-field.class.d.ts.map +1 -1
- package/dist/components/result-card/result-field.class.js +1 -11
- package/dist/components/result-card/result-field.class.js.map +1 -1
- package/dist/components/slider/slider.class.d.ts.map +1 -1
- package/dist/components/slider/slider.class.js +1 -19
- package/dist/components/slider/slider.class.js.map +1 -1
- package/dist/components/source-card/source-card.class.d.ts +8 -7
- package/dist/components/source-card/source-card.class.d.ts.map +1 -1
- package/dist/components/source-card/source-card.class.js +6 -25
- package/dist/components/source-card/source-card.class.js.map +1 -1
- package/dist/components/stat/stat.class.js +1 -1
- package/dist/components/stat/stat.class.js.map +1 -1
- package/dist/components/swatch-picker/swatch-picker.class.d.ts +55 -0
- package/dist/components/swatch-picker/swatch-picker.class.d.ts.map +1 -0
- package/dist/components/swatch-picker/swatch-picker.class.js +120 -0
- package/dist/components/swatch-picker/swatch-picker.class.js.map +1 -0
- package/dist/components/swatch-picker/swatch-picker.d.ts +2 -0
- package/dist/components/swatch-picker/swatch-picker.d.ts.map +1 -0
- package/dist/components/swatch-picker/swatch-picker.js +5 -0
- package/dist/components/swatch-picker/swatch-picker.js.map +1 -0
- package/dist/components/swatch-picker/swatch-picker.styles.d.ts +2 -0
- package/dist/components/swatch-picker/swatch-picker.styles.d.ts.map +1 -0
- package/dist/components/swatch-picker/swatch-picker.styles.js +55 -0
- package/dist/components/swatch-picker/swatch-picker.styles.js.map +1 -0
- package/dist/components/time-range/time-range.class.d.ts.map +1 -1
- package/dist/components/time-range/time-range.class.js +1 -21
- package/dist/components/time-range/time-range.class.js.map +1 -1
- package/dist/components/timeline/timeline-item.class.d.ts +120 -0
- package/dist/components/timeline/timeline-item.class.d.ts.map +1 -0
- package/dist/components/timeline/timeline-item.class.js +203 -0
- package/dist/components/timeline/timeline-item.class.js.map +1 -0
- package/dist/components/timeline/timeline-item.d.ts +3 -0
- package/dist/components/timeline/timeline-item.d.ts.map +1 -0
- package/dist/components/timeline/timeline-item.js +10 -0
- package/dist/components/timeline/timeline-item.js.map +1 -0
- package/dist/components/timeline/timeline-item.styles.d.ts +2 -0
- package/dist/components/timeline/timeline-item.styles.d.ts.map +1 -0
- package/dist/components/timeline/timeline-item.styles.js +149 -0
- package/dist/components/timeline/timeline-item.styles.js.map +1 -0
- package/dist/components/timeline/timeline.class.d.ts +59 -0
- package/dist/components/timeline/timeline.class.d.ts.map +1 -0
- package/dist/components/timeline/timeline.class.js +100 -0
- package/dist/components/timeline/timeline.class.js.map +1 -0
- package/dist/components/timeline/timeline.d.ts +2 -0
- package/dist/components/timeline/timeline.d.ts.map +1 -0
- package/dist/components/timeline/timeline.js +5 -0
- package/dist/components/timeline/timeline.js.map +1 -0
- package/dist/components/timeline/timeline.styles.d.ts +2 -0
- package/dist/components/timeline/timeline.styles.d.ts.map +1 -0
- package/dist/components/timeline/timeline.styles.js +52 -0
- package/dist/components/timeline/timeline.styles.js.map +1 -0
- package/dist/components/toast/toast-item.class.d.ts.map +1 -1
- package/dist/components/toast/toast-item.class.js +1 -3
- package/dist/components/toast/toast-item.class.js.map +1 -1
- package/dist/components/tool-param-form/tool-param-form.class.d.ts.map +1 -1
- package/dist/components/tool-param-form/tool-param-form.class.js +0 -1
- package/dist/components/tool-param-form/tool-param-form.class.js.map +1 -1
- package/dist/components/tour/tour.class.d.ts +250 -0
- package/dist/components/tour/tour.class.d.ts.map +1 -0
- package/dist/components/tour/tour.class.js +530 -0
- package/dist/components/tour/tour.class.js.map +1 -0
- package/dist/components/tour/tour.d.ts +2 -0
- package/dist/components/tour/tour.d.ts.map +1 -0
- package/dist/components/tour/tour.js +5 -0
- package/dist/components/tour/tour.js.map +1 -0
- package/dist/components/tour/tour.styles.d.ts +2 -0
- package/dist/components/tour/tour.styles.d.ts.map +1 -0
- package/dist/components/tour/tour.styles.js +165 -0
- package/dist/components/tour/tour.styles.js.map +1 -0
- package/dist/components/virtual-list/virtual-list.class.d.ts.map +1 -1
- package/dist/components/virtual-list/virtual-list.class.js +1 -3
- package/dist/components/virtual-list/virtual-list.class.js.map +1 -1
- package/dist/components/word-cloud/word-cloud.class.d.ts.map +1 -1
- package/dist/components/word-cloud/word-cloud.class.js +1 -8
- package/dist/components/word-cloud/word-cloud.class.js.map +1 -1
- package/dist/components/zoomable-frame/zoomable-frame.class.d.ts +15 -0
- package/dist/components/zoomable-frame/zoomable-frame.class.d.ts.map +1 -1
- package/dist/components/zoomable-frame/zoomable-frame.class.js +18 -0
- package/dist/components/zoomable-frame/zoomable-frame.class.js.map +1 -1
- package/dist/internal/a11y.d.ts +4 -0
- package/dist/internal/a11y.d.ts.map +1 -1
- package/dist/internal/a11y.js +17 -0
- package/dist/internal/a11y.js.map +1 -1
- package/dist/internal/canvas.d.ts +8 -0
- package/dist/internal/canvas.d.ts.map +1 -0
- package/dist/internal/canvas.js +14 -0
- package/dist/internal/canvas.js.map +1 -0
- package/dist/internal/localization.d.ts +1 -1
- package/dist/internal/localization.d.ts.map +1 -1
- package/dist/internal/localization.js +21 -2
- package/dist/internal/localization.js.map +1 -1
- package/dist/internal/motion.d.ts +5 -0
- package/dist/internal/motion.d.ts.map +1 -0
- package/dist/internal/motion.js +7 -0
- package/dist/internal/motion.js.map +1 -0
- package/dist/internal/numbers.d.ts +11 -0
- package/dist/internal/numbers.d.ts.map +1 -1
- package/dist/internal/numbers.js +21 -0
- package/dist/internal/numbers.js.map +1 -1
- package/dist/internal/positioner.d.ts +14 -0
- package/dist/internal/positioner.d.ts.map +1 -1
- package/dist/internal/positioner.js +27 -0
- package/dist/internal/positioner.js.map +1 -1
- package/dist/internal/root-registration-allowlist.d.ts +1 -1
- package/dist/internal/root-registration-allowlist.d.ts.map +1 -1
- package/dist/internal/root-registration-allowlist.js +12 -0
- package/dist/internal/root-registration-allowlist.js.map +1 -1
- package/dist/internal/rtl.d.ts +0 -11
- package/dist/internal/rtl.d.ts.map +1 -1
- package/dist/internal/rtl.js +0 -13
- package/dist/internal/rtl.js.map +1 -1
- package/dist/internal/safe-css.d.ts +15 -0
- package/dist/internal/safe-css.d.ts.map +1 -0
- package/dist/internal/safe-css.js +25 -0
- package/dist/internal/safe-css.js.map +1 -0
- package/dist/internal/strip-host-title.d.ts +24 -0
- package/dist/internal/strip-host-title.d.ts.map +1 -0
- package/dist/internal/strip-host-title.js +46 -0
- package/dist/internal/strip-host-title.js.map +1 -0
- package/dist/internal/tokens.styles.d.ts.map +1 -1
- package/dist/internal/tokens.styles.js +4 -0
- package/dist/internal/tokens.styles.js.map +1 -1
- package/dist/lyra.d.ts +37 -0
- package/dist/lyra.d.ts.map +1 -1
- package/dist/lyra.js +24 -0
- package/dist/lyra.js.map +1 -1
- package/llms-full.txt +161 -5
- package/llms.txt +5 -2
- package/package.json +43 -6
- package/vscode-css-data.json +733 -0
- package/vscode-html-data.json +10616 -0
- package/web-types.json +12206 -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|