@vonage/vivid 3.56.0 → 3.58.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 (40) hide show
  1. package/custom-elements.json +183 -0
  2. package/lib/audio-player/audio-player.d.ts +17 -0
  3. package/lib/fab/fab.d.ts +1 -1
  4. package/package.json +1 -1
  5. package/shared/definition16.cjs +1 -1
  6. package/shared/definition16.js +1 -1
  7. package/shared/definition24.cjs +1 -1
  8. package/shared/definition24.js +1 -1
  9. package/shared/definition35.cjs +1 -1
  10. package/shared/definition35.js +1 -1
  11. package/shared/definition42.cjs +1 -1
  12. package/shared/definition42.js +1 -1
  13. package/shared/definition43.cjs +2 -2
  14. package/shared/definition43.js +2 -2
  15. package/shared/definition46.cjs +1 -1
  16. package/shared/definition46.js +1 -1
  17. package/shared/definition5.cjs +138 -120
  18. package/shared/definition5.js +139 -121
  19. package/shared/definition50.cjs +1 -1
  20. package/shared/definition50.js +1 -1
  21. package/shared/definition58.cjs +1 -1
  22. package/shared/definition58.js +1 -1
  23. package/shared/definition61.cjs +23 -9
  24. package/shared/definition61.js +23 -9
  25. package/shared/definition7.cjs +1 -1
  26. package/shared/definition7.js +1 -1
  27. package/shared/icon.cjs +1 -1
  28. package/shared/icon.js +1 -1
  29. package/shared/patterns/anchored.d.ts +4 -4
  30. package/shared/slider.template.cjs +3 -3
  31. package/shared/slider.template.js +3 -3
  32. package/shared/text-field.cjs +1 -1
  33. package/shared/text-field.js +1 -1
  34. package/styles/core/all.css +1 -1
  35. package/styles/core/theme.css +1 -1
  36. package/styles/core/typography.css +1 -1
  37. package/styles/tokens/theme-dark.css +4 -4
  38. package/styles/tokens/theme-light.css +4 -4
  39. package/styles/tokens/vivid-2-compat.css +1 -1
  40. package/vivid.api.json +10 -1
@@ -484,7 +484,7 @@ index.__decorate([
484
484
  index.attr
485
485
  ], Slider$1.prototype, "mode", void 0);
486
486
 
487
- const styles = ":host{display:inline-block}:host(:not([orientation=vertical])){inline-size:100%}:host([orientation=vertical]){block-size:100%;min-block-size:calc(var(--_thumb-interaction-indicator-size) * 5)}:host([disabled]){cursor:not-allowed}.control{--_thumb-size: 12px;--_thumb-interaction-indicator-size: 36px;--_track-start-inset-inline-start: 0;--_track-start-inset-block-start: 0;cursor:pointer;outline:none;user-select:none}.control.connotation-cta{--_connotation-color-primary: var(--vvd-slider-cta-primary, var(--vvd-color-cta-500))}.control:not(.connotation-cta){--_connotation-color-primary: var(--vvd-slider-accent-primary, var(--vvd-color-canvas-text))}.control{--_appearance-color-text: var(--_connotation-color-primary-text);--_appearance-color-fill: var(--_connotation-color-primary);--_appearance-color-outline: transparent}.control .positioning-region{position:relative}.control .track{position:absolute;border-radius:4px;background:var(--_track-background-color)}.control .track-start{position:absolute;border-radius:inherit;background:var(--_track-start-background-color);block-size:100%;inset-inline-start:var(--_track-start-inset-inline-start)}.control.horizontal{block-size:var(--_thumb-interaction-indicator-size);inline-size:calc(100% - var(--_thumb-size));margin-inline-start:calc(var(--_thumb-size) / 2);min-inline-size:var(--_thumb-size)}.control.horizontal .track{top:calc((var(--_thumb-interaction-indicator-size) - 2px) / 2);right:0;left:0;block-size:2px}.control.horizontal .track .mark{block-size:4px;inline-size:100%}.control.vertical{margin-top:calc(var(--_thumb-interaction-indicator-size) / 2);block-size:calc(100% - var(--_thumb-interaction-indicator-size));inline-size:var(--_thumb-interaction-indicator-size);min-block-size:var(--_thumb-interaction-indicator-size)}.control.vertical .positioning-region{block-size:100%}.control.vertical .track{left:calc((var(--_thumb-interaction-indicator-size) - 2px) / 2);block-size:100%;inline-size:2px}.control.vertical .track .mark{block-size:100%;inline-size:4px}.control.vertical .track-start{block-size:auto;inline-size:100%;inset-block-start:var(--_track-start-inset-block-start)}.control.disabled{--_track-background-color: var(--vvd-color-neutral-100);--_track-start-background-color: var(--vvd-color-neutral-300);pointer-events:none}.control:not(.disabled){--_track-background-color: var(--vvd-color-neutral-300);--_track-start-background-color: var(--_appearance-color-fill)}.thumb-container{position:absolute;border-radius:50%;block-size:var(--_thumb-interaction-indicator-size);cursor:inherit;inline-size:var(--_thumb-interaction-indicator-size);outline-color:transparent;touch-action:none}:focus-visible .thumb-container,.thumb-container:focus-visible{box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px));--focus-stroke-gap-color: transparent;--_thumb-interaction-indicator-alpha: .05;border-radius:50%}.control.horizontal .thumb-container{transform:translate(calc(var(--_thumb-interaction-indicator-size) / 2))}.control.vertical .thumb-container{transform:translateY(calc(var(--_thumb-interaction-indicator-size) / 2))}.control:not(.disabled) .thumb-container:hover{--_thumb-interaction-indicator-alpha: .12}.control:not(.disabled) .thumb-container:active{--_thumb-interaction-indicator-alpha: .25}.thumb-container:before{position:absolute;display:block;border-radius:inherit;background-color:var(--_track-start-background-color);block-size:var(--_thumb-interaction-indicator-size);content:\"\";inline-size:var(--_thumb-interaction-indicator-size);opacity:var(--_thumb-interaction-indicator-alpha, 0);transition:opacity .2s ease-out 0s}.thumb-container:after{position:absolute;display:block;border-radius:inherit;background-color:var(--_track-start-background-color);block-size:var(--_thumb-size);content:\"\";inline-size:var(--_thumb-size);inset:calc((var(--_thumb-interaction-indicator-size) - var(--_thumb-size)) / 2)}";
487
+ const styles = ":host{display:inline-block}:host(:not([orientation=vertical])){inline-size:100%}:host([orientation=vertical]){block-size:100%;min-block-size:calc(var(--_thumb-interaction-indicator-size) * 5)}:host([disabled]){cursor:not-allowed}.control{--_thumb-size: 12px;--_thumb-interaction-indicator-size: 36px;--_track-start-inset-inline-start: 0;--_track-start-inset-block-start: 0;cursor:pointer;outline:none;user-select:none}.control.connotation-cta{--_connotation-color-primary: var(--vvd-slider-cta-primary, var(--vvd-color-cta-500))}.control:not(.connotation-cta){--_connotation-color-primary: var(--vvd-slider-accent-primary, var(--vvd-color-canvas-text))}.control{--_appearance-color-text: var(--_connotation-color-primary-text);--_appearance-color-fill: var(--_connotation-color-primary);--_appearance-color-outline: transparent}.control .positioning-region{position:relative}.control .track{position:absolute;border-radius:4px;background:var(--_track-background-color)}.control .track-start{position:absolute;border-radius:inherit;background:var(--_track-start-background-color);block-size:100%;inset-inline-start:var(--_track-start-inset-inline-start)}.control.horizontal{block-size:var(--_thumb-interaction-indicator-size);inline-size:calc(100% - var(--_thumb-size));margin-inline-start:calc(var(--_thumb-size) / 2);min-inline-size:var(--_thumb-size)}.control.horizontal .track{top:calc((var(--_thumb-interaction-indicator-size) - 2px) / 2);right:0;left:0;block-size:2px}:host([markers]) .control.horizontal .track-start{--_track-start-inset-inline-start: 1px;border-bottom-left-radius:0;border-top-left-radius:0}.control.horizontal .track .mark{position:absolute;block-size:6px;inline-size:100%;inset-block-start:-2px;inset-inline-start:0}.control.vertical{margin-top:calc(var(--_thumb-interaction-indicator-size) / 2);block-size:calc(100% - var(--_thumb-interaction-indicator-size));inline-size:var(--_thumb-interaction-indicator-size);min-block-size:var(--_thumb-interaction-indicator-size)}.control.vertical .positioning-region{block-size:100%}.control.vertical .track{left:calc((var(--_thumb-interaction-indicator-size) - 2px) / 2);block-size:100%;inline-size:2px}.control.vertical .track .mark{position:absolute;block-size:100%;inline-size:6px;inset-block-start:0;inset-inline-start:-2px}.control.vertical .track-start{block-size:auto;inline-size:100%;inset-block-start:var(--_track-start-inset-block-start)}:host([markers]) .control.vertical .track-start{--_track-start-inset-block-start: 1px;border-radius:0}.control.disabled{--_track-background-color: var(--vvd-color-neutral-100);--_track-start-background-color: var(--vvd-color-neutral-300);pointer-events:none}.control:not(.disabled){--_track-background-color: var(--vvd-color-neutral-300);--_track-start-background-color: var(--_appearance-color-fill)}.control:not(.disabled) .mark{color:var(--vvd-color-neutral-950)}.control.disabled .mark{color:var(--_track-start-background-color)}.thumb-container{position:absolute;border-radius:50%;block-size:var(--_thumb-interaction-indicator-size);cursor:inherit;inline-size:var(--_thumb-interaction-indicator-size);outline-color:transparent;touch-action:none}:focus-visible .thumb-container,.thumb-container:focus-visible{box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px));--focus-stroke-gap-color: transparent;--_thumb-interaction-indicator-alpha: .05;border-radius:50%}.control.horizontal .thumb-container{transform:translate(calc(var(--_thumb-interaction-indicator-size) / 2))}.control.vertical .thumb-container{transform:translateY(calc(var(--_thumb-interaction-indicator-size) / 2))}.control:not(.disabled) .thumb-container:hover{--_thumb-interaction-indicator-alpha: .12}.control:not(.disabled) .thumb-container:active{--_thumb-interaction-indicator-alpha: .25}.thumb-container:before{position:absolute;display:block;border-radius:inherit;background-color:var(--_track-start-background-color);block-size:var(--_thumb-interaction-indicator-size);content:\"\";inline-size:var(--_thumb-interaction-indicator-size);opacity:var(--_thumb-interaction-indicator-alpha, 0);transition:opacity .2s ease-out 0s}.thumb-container:after{position:absolute;display:block;border-radius:inherit;background-color:var(--_track-start-background-color);block-size:var(--_thumb-size);content:\"\";inline-size:var(--_thumb-size);inset:calc((var(--_thumb-interaction-indicator-size) - var(--_thumb-size)) / 2)}";
488
488
 
489
489
  var __defProp = Object.defineProperty;
490
490
  var __decorateClass = (decorators, target, key, kind) => {
@@ -482,7 +482,7 @@ __decorate([
482
482
  attr
483
483
  ], Slider$1.prototype, "mode", void 0);
484
484
 
485
- const styles = ":host{display:inline-block}:host(:not([orientation=vertical])){inline-size:100%}:host([orientation=vertical]){block-size:100%;min-block-size:calc(var(--_thumb-interaction-indicator-size) * 5)}:host([disabled]){cursor:not-allowed}.control{--_thumb-size: 12px;--_thumb-interaction-indicator-size: 36px;--_track-start-inset-inline-start: 0;--_track-start-inset-block-start: 0;cursor:pointer;outline:none;user-select:none}.control.connotation-cta{--_connotation-color-primary: var(--vvd-slider-cta-primary, var(--vvd-color-cta-500))}.control:not(.connotation-cta){--_connotation-color-primary: var(--vvd-slider-accent-primary, var(--vvd-color-canvas-text))}.control{--_appearance-color-text: var(--_connotation-color-primary-text);--_appearance-color-fill: var(--_connotation-color-primary);--_appearance-color-outline: transparent}.control .positioning-region{position:relative}.control .track{position:absolute;border-radius:4px;background:var(--_track-background-color)}.control .track-start{position:absolute;border-radius:inherit;background:var(--_track-start-background-color);block-size:100%;inset-inline-start:var(--_track-start-inset-inline-start)}.control.horizontal{block-size:var(--_thumb-interaction-indicator-size);inline-size:calc(100% - var(--_thumb-size));margin-inline-start:calc(var(--_thumb-size) / 2);min-inline-size:var(--_thumb-size)}.control.horizontal .track{top:calc((var(--_thumb-interaction-indicator-size) - 2px) / 2);right:0;left:0;block-size:2px}.control.horizontal .track .mark{block-size:4px;inline-size:100%}.control.vertical{margin-top:calc(var(--_thumb-interaction-indicator-size) / 2);block-size:calc(100% - var(--_thumb-interaction-indicator-size));inline-size:var(--_thumb-interaction-indicator-size);min-block-size:var(--_thumb-interaction-indicator-size)}.control.vertical .positioning-region{block-size:100%}.control.vertical .track{left:calc((var(--_thumb-interaction-indicator-size) - 2px) / 2);block-size:100%;inline-size:2px}.control.vertical .track .mark{block-size:100%;inline-size:4px}.control.vertical .track-start{block-size:auto;inline-size:100%;inset-block-start:var(--_track-start-inset-block-start)}.control.disabled{--_track-background-color: var(--vvd-color-neutral-100);--_track-start-background-color: var(--vvd-color-neutral-300);pointer-events:none}.control:not(.disabled){--_track-background-color: var(--vvd-color-neutral-300);--_track-start-background-color: var(--_appearance-color-fill)}.thumb-container{position:absolute;border-radius:50%;block-size:var(--_thumb-interaction-indicator-size);cursor:inherit;inline-size:var(--_thumb-interaction-indicator-size);outline-color:transparent;touch-action:none}:focus-visible .thumb-container,.thumb-container:focus-visible{box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px));--focus-stroke-gap-color: transparent;--_thumb-interaction-indicator-alpha: .05;border-radius:50%}.control.horizontal .thumb-container{transform:translate(calc(var(--_thumb-interaction-indicator-size) / 2))}.control.vertical .thumb-container{transform:translateY(calc(var(--_thumb-interaction-indicator-size) / 2))}.control:not(.disabled) .thumb-container:hover{--_thumb-interaction-indicator-alpha: .12}.control:not(.disabled) .thumb-container:active{--_thumb-interaction-indicator-alpha: .25}.thumb-container:before{position:absolute;display:block;border-radius:inherit;background-color:var(--_track-start-background-color);block-size:var(--_thumb-interaction-indicator-size);content:\"\";inline-size:var(--_thumb-interaction-indicator-size);opacity:var(--_thumb-interaction-indicator-alpha, 0);transition:opacity .2s ease-out 0s}.thumb-container:after{position:absolute;display:block;border-radius:inherit;background-color:var(--_track-start-background-color);block-size:var(--_thumb-size);content:\"\";inline-size:var(--_thumb-size);inset:calc((var(--_thumb-interaction-indicator-size) - var(--_thumb-size)) / 2)}";
485
+ const styles = ":host{display:inline-block}:host(:not([orientation=vertical])){inline-size:100%}:host([orientation=vertical]){block-size:100%;min-block-size:calc(var(--_thumb-interaction-indicator-size) * 5)}:host([disabled]){cursor:not-allowed}.control{--_thumb-size: 12px;--_thumb-interaction-indicator-size: 36px;--_track-start-inset-inline-start: 0;--_track-start-inset-block-start: 0;cursor:pointer;outline:none;user-select:none}.control.connotation-cta{--_connotation-color-primary: var(--vvd-slider-cta-primary, var(--vvd-color-cta-500))}.control:not(.connotation-cta){--_connotation-color-primary: var(--vvd-slider-accent-primary, var(--vvd-color-canvas-text))}.control{--_appearance-color-text: var(--_connotation-color-primary-text);--_appearance-color-fill: var(--_connotation-color-primary);--_appearance-color-outline: transparent}.control .positioning-region{position:relative}.control .track{position:absolute;border-radius:4px;background:var(--_track-background-color)}.control .track-start{position:absolute;border-radius:inherit;background:var(--_track-start-background-color);block-size:100%;inset-inline-start:var(--_track-start-inset-inline-start)}.control.horizontal{block-size:var(--_thumb-interaction-indicator-size);inline-size:calc(100% - var(--_thumb-size));margin-inline-start:calc(var(--_thumb-size) / 2);min-inline-size:var(--_thumb-size)}.control.horizontal .track{top:calc((var(--_thumb-interaction-indicator-size) - 2px) / 2);right:0;left:0;block-size:2px}:host([markers]) .control.horizontal .track-start{--_track-start-inset-inline-start: 1px;border-bottom-left-radius:0;border-top-left-radius:0}.control.horizontal .track .mark{position:absolute;block-size:6px;inline-size:100%;inset-block-start:-2px;inset-inline-start:0}.control.vertical{margin-top:calc(var(--_thumb-interaction-indicator-size) / 2);block-size:calc(100% - var(--_thumb-interaction-indicator-size));inline-size:var(--_thumb-interaction-indicator-size);min-block-size:var(--_thumb-interaction-indicator-size)}.control.vertical .positioning-region{block-size:100%}.control.vertical .track{left:calc((var(--_thumb-interaction-indicator-size) - 2px) / 2);block-size:100%;inline-size:2px}.control.vertical .track .mark{position:absolute;block-size:100%;inline-size:6px;inset-block-start:0;inset-inline-start:-2px}.control.vertical .track-start{block-size:auto;inline-size:100%;inset-block-start:var(--_track-start-inset-block-start)}:host([markers]) .control.vertical .track-start{--_track-start-inset-block-start: 1px;border-radius:0}.control.disabled{--_track-background-color: var(--vvd-color-neutral-100);--_track-start-background-color: var(--vvd-color-neutral-300);pointer-events:none}.control:not(.disabled){--_track-background-color: var(--vvd-color-neutral-300);--_track-start-background-color: var(--_appearance-color-fill)}.control:not(.disabled) .mark{color:var(--vvd-color-neutral-950)}.control.disabled .mark{color:var(--_track-start-background-color)}.thumb-container{position:absolute;border-radius:50%;block-size:var(--_thumb-interaction-indicator-size);cursor:inherit;inline-size:var(--_thumb-interaction-indicator-size);outline-color:transparent;touch-action:none}:focus-visible .thumb-container,.thumb-container:focus-visible{box-shadow:inset 0 0 0 3px var(--focus-stroke-gap-color, currentColor);outline:2px solid var(--focus-stroke-color, var(--vvd-color-canvas-text));outline-offset:calc(-2px - var(--focus-inset, 0px));--focus-stroke-gap-color: transparent;--_thumb-interaction-indicator-alpha: .05;border-radius:50%}.control.horizontal .thumb-container{transform:translate(calc(var(--_thumb-interaction-indicator-size) / 2))}.control.vertical .thumb-container{transform:translateY(calc(var(--_thumb-interaction-indicator-size) / 2))}.control:not(.disabled) .thumb-container:hover{--_thumb-interaction-indicator-alpha: .12}.control:not(.disabled) .thumb-container:active{--_thumb-interaction-indicator-alpha: .25}.thumb-container:before{position:absolute;display:block;border-radius:inherit;background-color:var(--_track-start-background-color);block-size:var(--_thumb-interaction-indicator-size);content:\"\";inline-size:var(--_thumb-interaction-indicator-size);opacity:var(--_thumb-interaction-indicator-alpha, 0);transition:opacity .2s ease-out 0s}.thumb-container:after{position:absolute;display:block;border-radius:inherit;background-color:var(--_track-start-background-color);block-size:var(--_thumb-size);content:\"\";inline-size:var(--_thumb-size);inset:calc((var(--_thumb-interaction-indicator-size) - var(--_thumb-size)) / 2)}";
486
486
 
487
487
  var __defProp = Object.defineProperty;
488
488
  var __decorateClass = (decorators, target, key, kind) => {
@@ -9,7 +9,6 @@ require('./index2.cjs');
9
9
  const localized = require('./localized.cjs');
10
10
  const applyMixins = require('./apply-mixins.cjs');
11
11
  const when = require('./when.cjs');
12
- const ref = require('./ref.cjs');
13
12
  const classNames = require('./class-names.cjs');
14
13
 
15
14
  const styles = ":host{display:block;max-inline-size:350px}.wrapper{container-type:inline-size}.base{display:inline-flex;box-sizing:border-box;align-items:center;padding:8px;color:var(--vvd-color-canvas-text);gap:16px;inline-size:100%;user-select:none}.base .slider{flex:1;grid-area:slider;min-inline-size:var(--audio-player-min-inline-size, 200px)}.base .controls{display:flex;align-items:center;justify-content:center;gap:8px;grid-area:controls}.base .time-stamp{display:inline-flex}.base .time-stamp .current-time,.base .time-stamp .total-time{margin-inline:6px;min-inline-size:32px}.base .playback{grid-area:playback}@container (max-width: 500px){.base.two-lines{display:inline-grid;grid-template:auto auto/1fr;grid-template-areas:\"slider\" \"controls\";inline-size:100%;row-gap:4px}.base.two-lines .time-stamp{margin-inline:auto 2px}.base.two-lines.playback{grid-template-areas:\"slider slider\" \"controls playback\";grid-template-columns:1fr auto}.base.two-lines.playback .time-stamp{margin-inline:auto}.base .slider{box-sizing:border-box;min-inline-size:auto;padding-inline:2px}}";
@@ -24,6 +23,20 @@ var __decorateClass = (decorators, target, key, kind) => {
24
23
  __defProp(target, key, result);
25
24
  return result;
26
25
  };
26
+ const SKIP_DIRECTIONS = {
27
+ FORWARD: 1,
28
+ BACKWARD: -1
29
+ };
30
+ function formatTime(time) {
31
+ if (!time || Number.isNaN(time)) {
32
+ return "0:00";
33
+ }
34
+ const min = Math.floor(time / 60);
35
+ const sec = Math.floor(time % 60);
36
+ return min + ":" + (sec < 10 ? "0" + sec : sec);
37
+ }
38
+ const PAUSE = true;
39
+ const PLAY = false;
27
40
  const validSkipByConverter = {
28
41
  toView(value) {
29
42
  return value;
@@ -34,7 +47,7 @@ const validSkipByConverter = {
34
47
  };
35
48
  class AudioPlayer extends index.FoundationElement {
36
49
  constructor() {
37
- super(...arguments);
50
+ super();
38
51
  this.playButtonAriaLabel = null;
39
52
  this.pauseButtonAriaLabel = null;
40
53
  this.sliderAriaLabel = null;
@@ -42,106 +55,109 @@ class AudioPlayer extends index.FoundationElement {
42
55
  this.skipBackwardButtonAriaLabel = null;
43
56
  this.disabled = false;
44
57
  this.notime = false;
45
- this.paused = true;
46
- /**
47
- * @internal
48
- */
49
- this._rewind = () => {
50
- if (this._playerEl) {
51
- this._playerEl.currentTime = this._playerEl.duration * (Number(this._sliderEl.value) / 100);
58
+ this.#playerEl = new Audio();
59
+ this.#pausedChanged = (pausing) => {
60
+ if (pausing === this.paused) {
61
+ return;
62
+ }
63
+ if (!this.paused) {
64
+ this.#playerEl.pause();
65
+ } else {
66
+ this.#updateProgress();
67
+ this.#playerEl.play();
68
+ }
69
+ this.#setPausedState();
70
+ };
71
+ this.#updateProgress = () => {
72
+ index.Observable.notify(this, "currentTime");
73
+ const percent = this.currentTime / this.duration * 100;
74
+ if (percent === 100) {
75
+ this.pause();
76
+ }
77
+ };
78
+ this.#updateTotalTime = () => {
79
+ index.Observable.notify(this, "duration");
80
+ };
81
+ this.#rewind = () => {
82
+ if (this.#playerEl) {
83
+ this.currentTime = this.duration * Number(this.#sliderEl.value) / 100;
84
+ }
85
+ };
86
+ this.#handleSliderEvent = (event) => {
87
+ if (event.target === this.#sliderEl) {
88
+ this.pause();
89
+ this.#rewind();
52
90
  }
91
+ return true;
53
92
  };
93
+ this.#setPausedState = () => {
94
+ index.Observable.notify(this, "paused");
95
+ };
96
+ this.#playerEl.addEventListener("timeupdate", this.#updateProgress);
97
+ this.#playerEl.addEventListener("loadedmetadata", this.#updateTotalTime);
98
+ }
99
+ srcChanged() {
100
+ if (this.src === void 0) {
101
+ this.#playerEl.removeAttribute("src");
102
+ } else {
103
+ this.#playerEl.src = this.src;
104
+ }
105
+ }
106
+ get paused() {
107
+ index.Observable.track(this, "paused");
108
+ return this.#playerEl.paused;
109
+ }
110
+ set paused(_) {
111
+ }
112
+ get duration() {
113
+ index.Observable.track(this, "duration");
114
+ return this.#playerEl.duration;
115
+ }
116
+ set duration(_) {
117
+ }
118
+ get currentTime() {
119
+ index.Observable.track(this, "currentTime");
120
+ return this.#playerEl.currentTime;
121
+ }
122
+ set currentTime(value) {
123
+ this.#playerEl.currentTime = value;
124
+ }
125
+ get #sliderEl() {
126
+ return this.shadowRoot.querySelector(".slider");
127
+ }
128
+ #playerEl;
129
+ get #baseElement() {
130
+ return this.shadowRoot.querySelector(".base");
54
131
  }
55
132
  connectedCallback() {
56
133
  super.connectedCallback();
57
- document.addEventListener("mouseup", this._rewind);
134
+ document.addEventListener("mouseup", this.#rewind);
135
+ this.#setInteractionListeners();
136
+ this.#setPausedState();
58
137
  }
59
138
  disconnectedCallback() {
60
139
  super.disconnectedCallback();
61
- document.addEventListener("mouseup", this._rewind);
140
+ document.addEventListener("mouseup", this.#rewind);
141
+ this.#setInteractionListeners(false);
62
142
  }
63
- /**
64
- * @internal
65
- */
66
- _togglePlay() {
67
- if (this.paused) {
68
- this._updateProgress();
69
- this._playerEl.play();
70
- } else {
71
- this._playerEl.pause();
72
- }
73
- this.paused = !this.paused;
143
+ play() {
144
+ this.#pausedChanged(PLAY);
74
145
  }
75
- /**
76
- * @internal
77
- */
78
- _onSkipButtonClick(isForward) {
79
- if (this._playerEl) {
80
- const currentTime = this._playerEl.currentTime;
81
- const skipDirection = isForward ? 1 : -1;
82
- const skipValue = parseInt(this.skipBy) * skipDirection;
83
- const newTime = currentTime + skipValue;
84
- this._playerEl.currentTime = Math.max(
85
- 0,
86
- Math.min(this._playerEl.duration, newTime)
87
- );
88
- this._updateProgress();
89
- }
146
+ pause() {
147
+ this.#pausedChanged(PAUSE);
90
148
  }
91
- /**
92
- * @internal
93
- */
94
- _updateProgress() {
95
- let currentTime;
96
- const current = this._playerEl.currentTime;
97
- const percent = current / this._playerEl.duration * 100;
98
- if (this._sliderEl) {
99
- this._sliderEl.value = percent.toString();
100
- this._sliderEl.ariaValuetext = this._formatTime(current);
101
- }
102
- if (percent === 100) {
103
- this.paused = true;
104
- }
105
- if (this._timeStampEl) {
106
- currentTime = this._timeStampEl.querySelector(".current-time");
107
- if (currentTime)
108
- currentTime.textContent = this._formatTime(current);
109
- }
110
- }
111
- /**
112
- * @internal
113
- */
114
- _updateTotalTime() {
115
- let totalTime;
116
- if (this._playerEl)
117
- this.duration = this._playerEl.duration;
118
- if (this._timeStampEl) {
119
- totalTime = this._timeStampEl.querySelector(".total-time");
120
- if (totalTime)
121
- totalTime.textContent = this._formatTime(this._playerEl.duration);
122
- }
123
- }
124
- /**
125
- * @internal
126
- */
127
- _handleSliderEvent(event) {
128
- if (event.target === this._sliderEl) {
129
- this.paused = true;
130
- if (this._playerEl) {
131
- this._playerEl.pause();
132
- }
133
- this._rewind();
134
- }
135
- return true;
136
- }
137
- /**
138
- * @internal
139
- */
140
- _formatTime(time) {
141
- const min = Math.floor(time / 60);
142
- const sec = Math.floor(time % 60);
143
- return min + ":" + (sec < 10 ? "0" + sec : sec);
149
+ #setInteractionListeners(add = true) {
150
+ const action = add ? "addEventListener" : "removeEventListener";
151
+ this.#baseElement[action]("keyup", this.#handleSliderEvent);
152
+ this.#baseElement[action]("keydown", this.#handleSliderEvent);
153
+ this.#baseElement[action]("mousedown", this.#handleSliderEvent);
144
154
  }
155
+ #pausedChanged;
156
+ #updateProgress;
157
+ #updateTotalTime;
158
+ #rewind;
159
+ #handleSliderEvent;
160
+ #setPausedState;
145
161
  }
146
162
  __decorateClass([
147
163
  index.attr({ attribute: "play-button-aria-label" })
@@ -176,18 +192,27 @@ __decorateClass([
176
192
  converter: validSkipByConverter
177
193
  })
178
194
  ], AudioPlayer.prototype, "skipBy");
179
- __decorateClass([
180
- index.observable
181
- ], AudioPlayer.prototype, "paused");
182
- __decorateClass([
183
- index.observable
184
- ], AudioPlayer.prototype, "duration");
185
195
  applyMixins.applyMixins(AudioPlayer, localized.Localized);
186
196
 
197
+ function getCurrentTimePercentage(x) {
198
+ if (Number.isNaN(x.currentTime) || Number.isNaN(x.duration)) {
199
+ return 0;
200
+ }
201
+ return x.currentTime / x.duration * 100;
202
+ }
203
+ function skip(audioElement, skipDirection) {
204
+ const currentTime = audioElement.currentTime;
205
+ const skipValue = parseInt(audioElement.skipBy) * skipDirection;
206
+ const newTime = currentTime + skipValue;
207
+ audioElement.currentTime = Math.max(
208
+ 0,
209
+ Math.min(audioElement.duration, newTime)
210
+ );
211
+ }
187
212
  const getClasses = ({ disabled, duration }) => classNames.classNames(["disabled", Boolean(disabled) || !duration]);
188
213
  function renderButton(context) {
189
214
  const buttonTag = context.tagFor(definition.Button);
190
- return index.html`<${buttonTag} class="pause" @click="${(x) => x._togglePlay()}"
215
+ return index.html`<${buttonTag} class="pause" @click="${(x) => x.paused ? x.play() : x.pause()}"
191
216
  icon="${(x) => x.paused ? "play-solid" : "pause-solid"}"
192
217
  aria-label="${(x) => x.paused ? x.playButtonAriaLabel || x.locale.audioPlayer.playButtonLabel : x.pauseButtonAriaLabel || x.locale.audioPlayer.pauseButtonLabel}"
193
218
  size='condensed'
@@ -198,7 +223,8 @@ function renderButton(context) {
198
223
  function renderBackwardSkipButtons(context) {
199
224
  const buttonTag = context.tagFor(definition.Button);
200
225
  return index.html`
201
- <${buttonTag} class="skip backward" @click="${(x) => x._onSkipButtonClick(false)}"
226
+ <${buttonTag} class="skip backward"
227
+ @click="${(element) => skip(element, SKIP_DIRECTIONS.BACKWARD)}"
202
228
  icon="${(x) => x.skipBy == enums.MediaSkipBy.Five ? "5-sec-backward-line" : x.skipBy == enums.MediaSkipBy.Thirty ? "30-sec-backward-line" : "10-sec-backward-line"}"
203
229
  size='condensed'
204
230
  aria-label="${(x) => x.skipBackwardButtonAriaLabel || x.locale.audioPlayer.skipBackwardButton}"
@@ -210,7 +236,8 @@ function renderBackwardSkipButtons(context) {
210
236
  function renderForwardSkipButtons(context) {
211
237
  const buttonTag = context.tagFor(definition.Button);
212
238
  return index.html`
213
- <${buttonTag} class="skip forward" @click="${(x) => x._onSkipButtonClick(true)}"
239
+ <${buttonTag} class="skip forward"
240
+ @click="${(element) => skip(element, SKIP_DIRECTIONS.FORWARD)}"
214
241
  icon="${(x) => x.skipBy == enums.MediaSkipBy.Five ? "5-sec-forward-line" : x.skipBy == enums.MediaSkipBy.Thirty ? "30-sec-forward-line" : "10-sec-forward-line"}"
215
242
  size='condensed'
216
243
  aria-label="${(x) => x.skipForwardButtonAriaLabel || x.locale.audioPlayer.skipForwardButton}"
@@ -221,29 +248,26 @@ function renderForwardSkipButtons(context) {
221
248
  }
222
249
  function renderSlider(context) {
223
250
  const sliderTag = context.tagFor(definition$1.Slider);
224
- return index.html`<${sliderTag}
225
- ${ref.ref("_sliderEl")} class="slider"
226
- aria-label="${(x) => x.sliderAriaLabel || x.locale.audioPlayer.sliderLabel}"
227
- value="0" max="100"
228
- connotation="${(x) => x.connotation}"
229
- ?disabled="${(x) => x.disabled || !x.duration}">
251
+ return index.html`
252
+ <${sliderTag}
253
+ class="slider"
254
+ aria-label="${(x) => x.sliderAriaLabel || x.locale.audioPlayer.sliderLabel}"
255
+ value="${getCurrentTimePercentage}" max="100"
256
+ ariaValuetext="${(x) => formatTime(x.currentTime)}"
257
+ connotation="${(x) => x.connotation}"
258
+ ?disabled="${(x) => x.disabled || !x.duration}">
230
259
  </${sliderTag}>`;
231
260
  }
232
261
  function renderTimestamp() {
233
- return index.html` <div class="time-stamp" ${ref.ref("_timeStampEl")}>
234
- <span class="current-time">0:00</span>
262
+ return index.html` <div class="time-stamp">
263
+ <span class="current-time">${(x) => formatTime(x.currentTime)}</span>
235
264
  <span>/</span>
236
- <span class="total-time">0:00</span>
265
+ <span class="total-time">${(x) => formatTime(x.duration)}</span>
237
266
  </div>`;
238
267
  }
239
268
  const AudioPlayerTemplate = (context) => {
240
269
  return index.html` <div class="wrapper">
241
- <div
242
- class="base ${getClasses}"
243
- @keyup="${(x, c) => x._handleSliderEvent(c.event)}"
244
- @keydown="${(x, c) => x._handleSliderEvent(c.event)}"
245
- @mousedown="${(x, c) => x._handleSliderEvent(c.event)}"
246
- >
270
+ <div class="base ${getClasses}">
247
271
  <div class="controls">
248
272
  ${when.when(
249
273
  (x) => x.skipBy && x.skipBy != enums.MediaSkipBy.Zero,
@@ -257,12 +281,6 @@ const AudioPlayerTemplate = (context) => {
257
281
  ${when.when((x) => !x.notime, renderTimestamp())}
258
282
  </div>
259
283
  ${renderSlider(context)}
260
- <audio
261
- ${ref.ref("_playerEl")}
262
- src="${(x) => x.src}"
263
- @timeupdate="${(x) => x._updateProgress()}"
264
- @loadedmetadata="${(x) => x._updateTotalTime()}"
265
- ></audio>
266
284
  </div>
267
285
  </div>`;
268
286
  };