@videojs/html 0.1.0-preview.3 → 0.1.0-preview.4

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 (123) hide show
  1. package/dist/button-D1DWjsQu.js +57 -0
  2. package/dist/button-D1DWjsQu.js.map +1 -0
  3. package/dist/component-factory-DeAN6cjC.js +47 -0
  4. package/dist/component-factory-DeAN6cjC.js.map +1 -0
  5. package/dist/current-time-display-C3qndGf5.js +47 -0
  6. package/dist/current-time-display-C3qndGf5.js.map +1 -0
  7. package/dist/custom-element-3bDlB2XO.js +10 -0
  8. package/dist/custom-element-3bDlB2XO.js.map +1 -0
  9. package/dist/define/index.d.ts +12 -0
  10. package/dist/define/index.js +27 -0
  11. package/dist/define/media-container.d.ts +1 -0
  12. package/dist/define/media-container.js +3 -0
  13. package/dist/define/media-current-time-display.d.ts +1 -0
  14. package/dist/define/media-current-time-display.js +4 -0
  15. package/dist/define/media-duration-display.d.ts +1 -0
  16. package/dist/define/media-duration-display.js +4 -0
  17. package/dist/define/media-fullscreen-button.d.ts +1 -0
  18. package/dist/define/media-fullscreen-button.js +5 -0
  19. package/dist/define/media-mute-button.d.ts +1 -0
  20. package/dist/define/media-mute-button.js +5 -0
  21. package/dist/define/media-play-button.d.ts +1 -0
  22. package/dist/define/media-play-button.js +5 -0
  23. package/dist/define/media-popover.d.ts +1 -0
  24. package/dist/define/media-popover.js +3 -0
  25. package/dist/define/media-preview-time-display.d.ts +1 -0
  26. package/dist/define/media-preview-time-display.js +4 -0
  27. package/dist/define/media-provider.d.ts +1 -0
  28. package/dist/define/media-provider.js +3 -0
  29. package/dist/define/media-time-slider.d.ts +1 -0
  30. package/dist/define/media-time-slider.js +4 -0
  31. package/dist/define/media-tooltip.d.ts +1 -0
  32. package/dist/define/media-tooltip.js +3 -0
  33. package/dist/define/media-volume-slider.d.ts +1 -0
  34. package/dist/define/media-volume-slider.js +4 -0
  35. package/dist/duration-display-JOPp3bdU.js +49 -0
  36. package/dist/duration-display-JOPp3bdU.js.map +1 -0
  37. package/dist/fullscreen-button-CGO2UJjs.js +48 -0
  38. package/dist/fullscreen-button-CGO2UJjs.js.map +1 -0
  39. package/dist/{icons-eJws_3Te.js → icons-CuxuONCk.js} +20 -57
  40. package/dist/icons-CuxuONCk.js.map +1 -0
  41. package/dist/icons.d.ts +1 -2
  42. package/dist/icons.js +2 -3
  43. package/dist/index-LKrIp3Oo.d.ts +1 -0
  44. package/dist/index.d.ts +172 -4
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +16 -9
  47. package/dist/media-container-BGEXSi9g.js +8 -0
  48. package/dist/media-container-BGEXSi9g.js.map +1 -0
  49. package/dist/media-container-C0MUzkJ_.js +83 -0
  50. package/dist/media-container-C0MUzkJ_.js.map +1 -0
  51. package/dist/media-container-DPnFjmtK.d.ts +1 -0
  52. package/dist/media-current-time-display-B-4Cp845.js +8 -0
  53. package/dist/media-current-time-display-B-4Cp845.js.map +1 -0
  54. package/dist/media-current-time-display-Cd0rPAuj.d.ts +1 -0
  55. package/dist/media-duration-display-BLMr7VHo.js +8 -0
  56. package/dist/media-duration-display-BLMr7VHo.js.map +1 -0
  57. package/dist/media-duration-display-qvm6YX-q.d.ts +1 -0
  58. package/dist/media-fullscreen-button-BgUK3lgu.d.ts +1 -0
  59. package/dist/media-fullscreen-button-Dcflbt54.js +8 -0
  60. package/dist/media-fullscreen-button-Dcflbt54.js.map +1 -0
  61. package/dist/media-mute-button-BOVhZ3aP.js +8 -0
  62. package/dist/media-mute-button-BOVhZ3aP.js.map +1 -0
  63. package/dist/media-mute-button-NVJF2EEW.d.ts +1 -0
  64. package/dist/media-play-button-CLj-hkwn.js +8 -0
  65. package/dist/media-play-button-CLj-hkwn.js.map +1 -0
  66. package/dist/media-play-button-oq8yDlxe.d.ts +1 -0
  67. package/dist/media-popover-BtJmPv0E.d.ts +1 -0
  68. package/dist/media-popover-F4M4Tq4z.js +8 -0
  69. package/dist/media-popover-F4M4Tq4z.js.map +1 -0
  70. package/dist/media-preview-time-display-4YX5Rics.d.ts +1 -0
  71. package/dist/media-preview-time-display-DAiMgLPX.js +8 -0
  72. package/dist/media-preview-time-display-DAiMgLPX.js.map +1 -0
  73. package/dist/media-provider-CyoL0bCx.js +17 -0
  74. package/dist/media-provider-CyoL0bCx.js.map +1 -0
  75. package/dist/media-provider-D7P2TLXG.d.ts +1 -0
  76. package/dist/media-provider-D_GL2_DN.js +8 -0
  77. package/dist/media-provider-D_GL2_DN.js.map +1 -0
  78. package/dist/media-skin-Di3vSHvS.d.ts +11 -0
  79. package/dist/media-skin-Di3vSHvS.d.ts.map +1 -0
  80. package/dist/media-skin-mHWwUPg3.js +36 -0
  81. package/dist/media-skin-mHWwUPg3.js.map +1 -0
  82. package/dist/media-time-slider-Bp2qnwsW.js +12 -0
  83. package/dist/media-time-slider-Bp2qnwsW.js.map +1 -0
  84. package/dist/media-time-slider-DvMnfYXZ.d.ts +1 -0
  85. package/dist/media-tooltip-BqV17mdM.d.ts +1 -0
  86. package/dist/media-tooltip-ClcVafMb.js +14 -0
  87. package/dist/media-tooltip-ClcVafMb.js.map +1 -0
  88. package/dist/media-volume-slider-CKSxmdQv.js +11 -0
  89. package/dist/media-volume-slider-CKSxmdQv.js.map +1 -0
  90. package/dist/media-volume-slider-DP47VLVi.d.ts +1 -0
  91. package/dist/mute-button-vW2sLqqY.js +50 -0
  92. package/dist/mute-button-vW2sLqqY.js.map +1 -0
  93. package/dist/play-button-aVb0g10G.js +44 -0
  94. package/dist/play-button-aVb0g10G.js.map +1 -0
  95. package/dist/popover-Dc0hyhwB.js +187 -0
  96. package/dist/popover-Dc0hyhwB.js.map +1 -0
  97. package/dist/{media-preview-time-display-C7jpAct6.js → preview-time-display-Dax0FQ2X.js} +6 -6
  98. package/dist/preview-time-display-Dax0FQ2X.js.map +1 -0
  99. package/dist/skins/frosted.d.ts +16 -5
  100. package/dist/skins/frosted.d.ts.map +1 -1
  101. package/dist/skins/frosted.js +46 -20
  102. package/dist/skins/frosted.js.map +1 -1
  103. package/dist/skins/minimal.d.ts +16 -5
  104. package/dist/skins/minimal.d.ts.map +1 -1
  105. package/dist/skins/minimal.js +46 -20
  106. package/dist/skins/minimal.js.map +1 -1
  107. package/dist/time-slider-CA1GMs6A.js +201 -0
  108. package/dist/time-slider-CA1GMs6A.js.map +1 -0
  109. package/dist/tooltip-54fBUUpb.js +296 -0
  110. package/dist/tooltip-54fBUUpb.js.map +1 -0
  111. package/dist/volume-slider-guD8gqpi.js +206 -0
  112. package/dist/volume-slider-guD8gqpi.js.map +1 -0
  113. package/package.json +8 -4
  114. package/dist/chunk-Bp6m_JJh.js +0 -13
  115. package/dist/icons-eJws_3Te.js.map +0 -1
  116. package/dist/index-AcYRyuAY.d.ts +0 -76
  117. package/dist/index-AcYRyuAY.d.ts.map +0 -1
  118. package/dist/index.js.map +0 -1
  119. package/dist/media-preview-time-display-C7jpAct6.js.map +0 -1
  120. package/dist/media-skin-D44BfH6y.d.ts +0 -182
  121. package/dist/media-skin-D44BfH6y.d.ts.map +0 -1
  122. package/dist/media-skin-DR8zj-LV.js +0 -1324
  123. package/dist/media-skin-DR8zj-LV.js.map +0 -1
@@ -1,1324 +0,0 @@
1
- import { createMediaStore, currentTimeDisplayStateDefinition, durationDisplayStateDefinition, fullscreenButtonStateDefinition, muteButtonStateDefinition, playButtonStateDefinition, timeSliderStateDefinition, volumeSliderStateDefinition } from "@videojs/core/store";
2
- import { formatDisplayTime, uniqueId } from "@videojs/utils";
3
- import { ConsumerMixin, ProviderMixin } from "@open-wc/context-protocol";
4
- import { contains, getDocument, getDocumentOrShadowRoot, namedNodeMapToObject, safePolygon, setAttributes } from "@videojs/utils/dom";
5
- import { arrow, autoUpdate, computePosition, flip, offset, shift } from "@floating-ui/dom";
6
- import { TimeSlider, VolumeSlider } from "@videojs/core";
7
-
8
- //#region src/utils/component-factory.ts
9
- /**
10
- * Generic factory function to create connected HTML components using hooks pattern.
11
- * Provides equivalent functionality to React's toConnectedComponent but for custom elements.
12
- *
13
- * @param BaseClass - Base custom element class to extend
14
- * @param stateHook - Hook that defines state keys and transformation logic
15
- * @param propsHook - Hook that handles element attributes and properties based on state
16
- * @param eventsHook - Hook that defines event handling logic
17
- * @param displayName - Display name for debugging
18
- * @returns Connected custom element class with media store integration
19
- */
20
- function toConnectedHTMLComponent(BaseClass, stateHook, propsHook, displayName) {
21
- const ConnectedComponent = class extends ConsumerMixin(BaseClass) {
22
- constructor(..._args) {
23
- super(..._args);
24
- this.contexts = { mediaStore: (mediaStore) => {
25
- this._mediaStore = mediaStore;
26
- this._mediaStore.subscribeKeys(stateHook.keys, (rawState) => {
27
- const state = stateHook.transform(rawState, mediaStore);
28
- const props = propsHook(state ?? {}, this);
29
- this._update(props, state, mediaStore);
30
- });
31
- } };
32
- }
33
- static get observedAttributes() {
34
- return [...super.observedAttributes ?? []];
35
- }
36
- connectedCallback() {
37
- super.connectedCallback?.();
38
- }
39
- disconnectedCallback() {
40
- super.disconnectedCallback?.();
41
- }
42
- handleEvent(event) {
43
- super.handleEvent?.(event);
44
- }
45
- };
46
- if (displayName) Object.defineProperty(ConnectedComponent, "name", { value: displayName });
47
- return ConnectedComponent;
48
- }
49
-
50
- //#endregion
51
- //#region src/components/media-current-time-display.ts
52
- var CurrentTimeDisplayBase = class extends HTMLElement {
53
- static {
54
- this.shadowRootOptions = { mode: "open" };
55
- }
56
- static {
57
- this.observedAttributes = ["show-remaining"];
58
- }
59
- constructor() {
60
- super();
61
- if (!this.shadowRoot) this.attachShadow(this.constructor.shadowRootOptions);
62
- }
63
- get currentTime() {
64
- return this._state?.currentTime ?? 0;
65
- }
66
- get duration() {
67
- return this._state?.duration ?? 0;
68
- }
69
- get showRemaining() {
70
- return this.hasAttribute("show-remaining");
71
- }
72
- attributeChangedCallback(name, _oldValue, _newValue) {
73
- if (name === "show-remaining" && this._state) this._update({}, this._state);
74
- }
75
- _update(_props, state) {
76
- this._state = state;
77
- /** @TODO Should this live here or elsewhere? (CJP) */
78
- const timeLabel = this.showRemaining && state.duration != null && state.currentTime != null ? formatDisplayTime(-(state.duration - state.currentTime)) : formatDisplayTime(state.currentTime);
79
- if (this.shadowRoot) this.shadowRoot.textContent = timeLabel;
80
- }
81
- };
82
- const useCurrentTimeDisplayState = {
83
- keys: [...currentTimeDisplayStateDefinition.keys],
84
- transform: (rawState, _mediaStore) => ({ ...currentTimeDisplayStateDefinition.stateTransform(rawState) })
85
- };
86
- const getCurrentTimeDisplayProps = (_state, _element) => {
87
- return {};
88
- };
89
- const CurrentTimeDisplay = toConnectedHTMLComponent(CurrentTimeDisplayBase, useCurrentTimeDisplayState, getCurrentTimeDisplayProps, "CurrentTimeDisplay");
90
- if (!globalThis.customElements.get("media-current-time-display")) globalThis.customElements.define("media-current-time-display", CurrentTimeDisplay);
91
-
92
- //#endregion
93
- //#region src/components/media-duration-display.ts
94
- function getTemplateHTML$3(_attrs, _props = {}) {
95
- return `
96
- <span></span>
97
- `;
98
- }
99
- var DurationDisplayBase = class extends HTMLElement {
100
- static {
101
- this.shadowRootOptions = { mode: "open" };
102
- }
103
- static {
104
- this.getTemplateHTML = getTemplateHTML$3;
105
- }
106
- constructor() {
107
- super();
108
- if (!this.shadowRoot) {
109
- this.attachShadow(this.constructor.shadowRootOptions);
110
- const attrs = namedNodeMapToObject(this.attributes);
111
- const html = this.constructor.getTemplateHTML(attrs);
112
- const shadowRoot = this.shadowRoot;
113
- shadowRoot.setHTMLUnsafe ? shadowRoot.setHTMLUnsafe(html) : shadowRoot.innerHTML = html;
114
- }
115
- }
116
- get duration() {
117
- return this._state?.duration ?? 0;
118
- }
119
- _update(_props, state) {
120
- this._state = state;
121
- const spanElement = this.shadowRoot?.querySelector("span");
122
- if (spanElement) spanElement.textContent = formatDisplayTime(state.duration);
123
- }
124
- };
125
- const useDurationDisplayState = {
126
- keys: [...durationDisplayStateDefinition.keys],
127
- transform: (rawState, _mediaStore) => ({ ...durationDisplayStateDefinition.stateTransform(rawState) })
128
- };
129
- const getDurationDisplayProps = (_state, _element) => {
130
- return {};
131
- };
132
- const DurationDisplay = toConnectedHTMLComponent(DurationDisplayBase, useDurationDisplayState, getDurationDisplayProps, "DurationDisplay");
133
- if (!globalThis.customElements.get("media-duration-display")) globalThis.customElements.define("media-duration-display", DurationDisplay);
134
-
135
- //#endregion
136
- //#region src/components/media-chrome-button.ts
137
- function getTemplateHTML$2(_attrs, _props = {}) {
138
- return `
139
- <style>
140
- /*
141
- NOTE: Even though primitives should aim to be "unstyled" in their core definitions, we should
142
- still add pointer-events, as this defines functionality. (CJP)
143
- */
144
- :host {
145
- pointer-events: auto;
146
- }
147
- </style>
148
- <slot>
149
- </slot>
150
- `;
151
- }
152
- var MediaChromeButton = class extends HTMLElement {
153
- static {
154
- this.shadowRootOptions = { mode: "open" };
155
- }
156
- static {
157
- this.getTemplateHTML = getTemplateHTML$2;
158
- }
159
- constructor() {
160
- super();
161
- if (!this.shadowRoot) {
162
- this.attachShadow(this.constructor.shadowRootOptions);
163
- const attrs = namedNodeMapToObject(this.attributes);
164
- const html = this.constructor.getTemplateHTML(attrs);
165
- const shadowRoot = this.shadowRoot;
166
- shadowRoot.setHTMLUnsafe ? shadowRoot.setHTMLUnsafe(html) : shadowRoot.innerHTML = html;
167
- }
168
- this.addEventListener("click", this);
169
- this.addEventListener("keydown", this);
170
- }
171
- handleEvent(event) {
172
- const { type } = event;
173
- if (type === "keydown") this.#handleKeyDown(event);
174
- }
175
- #handleKeyDown = (event) => {
176
- const { metaKey, altKey, key } = event;
177
- if (metaKey || altKey || !["Enter", " "].includes(key)) {
178
- this.removeEventListener("keyup", this.#handleKeyUp);
179
- return;
180
- }
181
- this.addEventListener("keyup", this.#handleKeyUp, { once: true });
182
- };
183
- #handleKeyUp = (_event) => {
184
- this.handleEvent({ type: "click" });
185
- };
186
- };
187
-
188
- //#endregion
189
- //#region src/components/media-fullscreen-button.ts
190
- var FullscreenButtonBase = class extends MediaChromeButton {
191
- handleEvent(event) {
192
- super.handleEvent(event);
193
- const { type } = event;
194
- const state = this._state;
195
- if (state && type === "click") if (state.fullscreen) state.requestExitFullscreen();
196
- else state.requestEnterFullscreen();
197
- }
198
- get fullscreen() {
199
- return this._state?.fullscreen ?? false;
200
- }
201
- _update(props, state, _mediaStore) {
202
- this._state = state;
203
- /** @TODO Follow up with React vs. W.C. data-* attributes discrepancies (CJP) */
204
- setAttributes(this, props);
205
- }
206
- };
207
- /**
208
- * FullscreenButton state hook - equivalent to React's useFullscreenButtonState
209
- * Handles media store state subscription and transformation
210
- */
211
- const getFullscreenButtonState = {
212
- keys: fullscreenButtonStateDefinition.keys,
213
- transform: (rawState, mediaStore) => ({
214
- ...fullscreenButtonStateDefinition.stateTransform(rawState),
215
- ...fullscreenButtonStateDefinition.createRequestMethods(mediaStore.dispatch)
216
- })
217
- };
218
- const getFullscreenButtonProps = (state, _element) => {
219
- return {
220
- "data-fullscreen": state.fullscreen,
221
- role: "button",
222
- tabindex: "0",
223
- "aria-label": state.fullscreen ? "exit fullscreen" : "enter fullscreen",
224
- "data-tooltip": state.fullscreen ? "Exit Fullscreen" : "Enter Fullscreen"
225
- };
226
- };
227
- const FullscreenButton = toConnectedHTMLComponent(FullscreenButtonBase, getFullscreenButtonState, getFullscreenButtonProps, "FullscreenButton");
228
- if (!globalThis.customElements.get("media-fullscreen-button")) globalThis.customElements.define("media-fullscreen-button", FullscreenButton);
229
-
230
- //#endregion
231
- //#region src/components/media-mute-button.ts
232
- var MuteButtonBase = class extends MediaChromeButton {
233
- handleEvent(event) {
234
- super.handleEvent(event);
235
- const { type } = event;
236
- const state = this._state;
237
- if (state) {
238
- if (type === "click") if (state.volumeLevel === "off") state.requestUnmute();
239
- else state.requestMute();
240
- }
241
- }
242
- get muted() {
243
- return this._state?.muted ?? false;
244
- }
245
- get volumeLevel() {
246
- return this._state?.volumeLevel ?? "high";
247
- }
248
- _update(props, state) {
249
- this._state = state;
250
- /** @TODO Follow up with React vs. W.C. data-* attributes discrepancies (CJP) */
251
- setAttributes(this, props);
252
- }
253
- };
254
- const getMuteButtonState = {
255
- keys: muteButtonStateDefinition.keys,
256
- transform: (rawState, mediaStore) => ({
257
- ...muteButtonStateDefinition.stateTransform(rawState),
258
- ...muteButtonStateDefinition.createRequestMethods(mediaStore.dispatch)
259
- })
260
- };
261
- const getMuteButtonProps = (state, _element) => {
262
- return {
263
- "data-muted": state.muted,
264
- "data-volume-level": state.volumeLevel,
265
- role: "button",
266
- tabindex: "0",
267
- "aria-label": state.muted ? "unmute" : "mute",
268
- "data-tooltip": state.muted ? "Unmute" : "Mute"
269
- };
270
- };
271
- const MuteButton = toConnectedHTMLComponent(MuteButtonBase, getMuteButtonState, getMuteButtonProps, "MuteButton");
272
- if (!globalThis.customElements.get("media-mute-button")) globalThis.customElements.define("media-mute-button", MuteButton);
273
-
274
- //#endregion
275
- //#region src/components/media-play-button.ts
276
- var PlayButtonBase = class extends MediaChromeButton {
277
- handleEvent(event) {
278
- super.handleEvent(event);
279
- const { type } = event;
280
- const state = this._state;
281
- if (state && type === "click") if (state.paused) state.requestPlay();
282
- else state.requestPause();
283
- }
284
- get paused() {
285
- return this._state?.paused ?? true;
286
- }
287
- _update(props, state, _mediaStore) {
288
- this._state = state;
289
- /** @TODO Follow up with React vs. W.C. data-* attributes discrepancies (CJP) */
290
- setAttributes(this, props);
291
- }
292
- };
293
- const getPlayButtonState = {
294
- keys: playButtonStateDefinition.keys,
295
- transform: (rawState, mediaStore) => ({
296
- ...playButtonStateDefinition.stateTransform(rawState),
297
- ...playButtonStateDefinition.createRequestMethods(mediaStore.dispatch)
298
- })
299
- };
300
- const getPlayButtonProps = (state, _element) => {
301
- return {
302
- "data-paused": state.paused,
303
- role: "button",
304
- tabindex: "0",
305
- "aria-label": state.paused ? "play" : "pause",
306
- "data-tooltip": state.paused ? "Play" : "Pause"
307
- };
308
- };
309
- const PlayButton = toConnectedHTMLComponent(PlayButtonBase, getPlayButtonState, getPlayButtonProps, "PlayButton");
310
- if (!globalThis.customElements.get("media-play-button")) globalThis.customElements.define("media-play-button", PlayButton);
311
-
312
- //#endregion
313
- //#region src/components/media-popover.ts
314
- var Popover = class extends HTMLElement {
315
- #open = false;
316
- #transitionStatus = "initial";
317
- #hoverTimeout = null;
318
- #cleanup = null;
319
- #abortController = null;
320
- #floatingContext = null;
321
- connectedCallback() {
322
- this.#abortController ??= new AbortController();
323
- const { signal } = this.#abortController;
324
- const trigger = this.#triggerElement;
325
- if (trigger) {
326
- if (globalThis.matchMedia?.("(hover: hover)")?.matches) {
327
- trigger.addEventListener("pointerenter", this, { signal });
328
- trigger.addEventListener("pointerleave", this, { signal });
329
- }
330
- trigger.addEventListener("focusin", this, { signal });
331
- trigger.addEventListener("focusout", this, { signal });
332
- }
333
- this.addEventListener("pointerenter", this, { signal });
334
- this.addEventListener("focusout", this, { signal });
335
- }
336
- disconnectedCallback() {
337
- this.#clearHoverTimeout();
338
- this.#cleanup?.();
339
- this.#abortController?.abort();
340
- this.#abortController = null;
341
- }
342
- handleEvent(event) {
343
- switch (event.type) {
344
- case "pointerenter":
345
- this.#handlePointerEnter(event);
346
- break;
347
- case "pointerleave":
348
- this.#handlePointerLeave(event);
349
- break;
350
- case "pointermove":
351
- this.#handlePointerMove(event);
352
- break;
353
- case "focusin":
354
- this.#handleFocusIn(event);
355
- break;
356
- case "focusout":
357
- this.#handleFocusOut(event);
358
- break;
359
- default: break;
360
- }
361
- }
362
- static get observedAttributes() {
363
- return [
364
- "open-on-hover",
365
- "delay",
366
- "close-delay",
367
- "side",
368
- "side-offset"
369
- ];
370
- }
371
- get openOnHover() {
372
- return this.hasAttribute("open-on-hover");
373
- }
374
- get delay() {
375
- return Number.parseInt(this.getAttribute("delay") ?? "0", 10);
376
- }
377
- get closeDelay() {
378
- return Number.parseInt(this.getAttribute("close-delay") ?? "0", 10);
379
- }
380
- get side() {
381
- return this.getAttribute("side");
382
- }
383
- get sideOffset() {
384
- return Number.parseInt(this.getAttribute("side-offset") ?? "0", 10);
385
- }
386
- get #triggerElement() {
387
- return getDocumentOrShadowRoot(this)?.querySelector(`[popovertarget="${this.id}"]`);
388
- }
389
- #setOpen(open) {
390
- if (this.#open === open) return;
391
- this.#open = open;
392
- if (open) {
393
- this.#setupFloating();
394
- this.#transitionStatus = "initial";
395
- this.#updateVisibility();
396
- this.showPopover();
397
- requestAnimationFrame(() => {
398
- this.#transitionStatus = "open";
399
- this.#updateVisibility();
400
- });
401
- } else {
402
- this.#transitionStatus = "close";
403
- this.#updateVisibility();
404
- const transitions = this.getAnimations().filter((anim) => anim instanceof CSSTransition);
405
- if (transitions.length > 0) Promise.all(transitions.map((t) => t.finished)).then(() => this.hidePopover()).catch(() => this.hidePopover());
406
- else this.hidePopover();
407
- }
408
- }
409
- #updateVisibility() {
410
- this.toggleAttribute("data-starting-style", this.#transitionStatus === "initial");
411
- this.toggleAttribute("data-open", this.#transitionStatus === "initial" || this.#transitionStatus === "open");
412
- this.toggleAttribute("data-ending-style", this.#transitionStatus === "close" || this.#transitionStatus === "unmounted");
413
- this.toggleAttribute("data-closed", this.#transitionStatus === "close" || this.#transitionStatus === "unmounted");
414
- }
415
- #setupFloating() {
416
- const trigger = this.#triggerElement;
417
- if (!trigger) return;
418
- const placement = this.side ?? "top";
419
- const sideOffset = this.sideOffset;
420
- const updatePosition = () => {
421
- computePosition(trigger, this, {
422
- placement,
423
- middleware: [
424
- offset(sideOffset),
425
- flip(),
426
- shift()
427
- ],
428
- strategy: "fixed"
429
- }).then((data) => {
430
- this.#floatingContext = {
431
- ...data,
432
- elements: {
433
- domReference: trigger,
434
- floating: this
435
- }
436
- };
437
- Object.assign(this.style, {
438
- left: `${data.x}px`,
439
- top: `${data.y}px`
440
- });
441
- });
442
- };
443
- updatePosition();
444
- this.#cleanup = autoUpdate(trigger, this, updatePosition);
445
- }
446
- #clearHoverTimeout() {
447
- if (this.#hoverTimeout) {
448
- globalThis.clearTimeout(this.#hoverTimeout);
449
- this.#hoverTimeout = null;
450
- }
451
- }
452
- #handlePointerEnter(event) {
453
- if (!this.openOnHover) return;
454
- this.#clearHoverTimeout();
455
- if (event.currentTarget === this) this.#addPointerMoveListener();
456
- if (this.#open) return;
457
- this.#hoverTimeout = globalThis.setTimeout(() => {
458
- this.#setOpen(true);
459
- }, this.delay);
460
- }
461
- #handlePointerLeave(_event) {
462
- this.#addPointerMoveListener();
463
- }
464
- #addPointerMoveListener() {
465
- if (!globalThis.matchMedia?.("(hover: hover)")?.matches) return;
466
- const { signal } = this.#abortController;
467
- getDocument(this).documentElement.addEventListener("pointermove", this, { signal });
468
- }
469
- #handlePointerMove(event) {
470
- if (!this.openOnHover || !this.#floatingContext) return;
471
- safePolygon({ blockPointerEvents: true })({
472
- ...this.#floatingContext,
473
- x: event.clientX,
474
- y: event.clientY,
475
- onClose: () => {
476
- getDocument(this).documentElement.removeEventListener("pointermove", this);
477
- this.#clearHoverTimeout();
478
- this.#hoverTimeout = globalThis.setTimeout(() => {
479
- this.#setOpen(false);
480
- }, this.closeDelay);
481
- }
482
- })(event);
483
- }
484
- #handleFocusIn(_event) {
485
- this.#setOpen(true);
486
- }
487
- #handleFocusOut(event) {
488
- const relatedTarget = event.relatedTarget;
489
- if (relatedTarget && contains(this, relatedTarget)) return;
490
- this.#setOpen(false);
491
- }
492
- };
493
- if (!globalThis.customElements.get("media-popover")) globalThis.customElements.define("media-popover", Popover);
494
-
495
- //#endregion
496
- //#region src/components/media-time-slider.ts
497
- /**
498
- * TimeSlider Root props hook - equivalent to React's useTimeSliderRootProps
499
- * Handles element attributes and properties based on state
500
- */
501
- const getTimeSliderRootProps = (state, element) => {
502
- const formatTime = (time) => {
503
- return `${Math.floor(time / 60)}:${Math.floor(time % 60).toString().padStart(2, "0")}`;
504
- };
505
- const currentTimeText = formatTime(state.currentTime);
506
- const durationText = formatTime(state.duration);
507
- return {
508
- role: "slider",
509
- tabindex: element.getAttribute("tabindex") ?? "0",
510
- "data-current-time": state.currentTime.toString(),
511
- "data-duration": state.duration.toString(),
512
- "data-orientation": element.orientation || "horizontal",
513
- "aria-label": "Seek",
514
- "aria-valuemin": "0",
515
- "aria-valuemax": Math.round(state.duration).toString(),
516
- "aria-valuenow": Math.round(state.currentTime).toString(),
517
- "aria-valuetext": `${currentTimeText} of ${durationText}`,
518
- "aria-orientation": element.orientation || "horizontal"
519
- };
520
- };
521
- var TimeSliderRootBase = class extends HTMLElement {
522
- constructor(..._args) {
523
- super(..._args);
524
- this._core = null;
525
- }
526
- static {
527
- this.observedAttributes = ["orientation"];
528
- }
529
- get currentTime() {
530
- return this._state?.currentTime ?? 0;
531
- }
532
- get duration() {
533
- return this._state?.duration ?? 0;
534
- }
535
- get orientation() {
536
- return this.getAttribute("orientation") || "horizontal";
537
- }
538
- attributeChangedCallback(name, _oldValue, _newValue) {
539
- if (name === "orientation" && this._state) this._render(getTimeSliderRootProps(this._state, this), this._state);
540
- }
541
- _update(_props, state) {
542
- this._state = state;
543
- if (state && !this._core) {
544
- this._core = new TimeSlider();
545
- this._core.subscribe(() => this._render(getTimeSliderRootProps(state, this), state));
546
- this._core.attach(this);
547
- state.core = this._core;
548
- }
549
- this._core?.setState(state);
550
- }
551
- _render(props, state) {
552
- const coreState = state?.core?.getState();
553
- if (!coreState) return;
554
- this.style.setProperty("--slider-fill", `${Math.round(coreState._fillWidth)}%`);
555
- this.style.setProperty("--slider-pointer", `${Math.round(coreState._pointerWidth)}%`);
556
- setAttributes(this, props);
557
- }
558
- };
559
- var TimeSliderTrackBase = class extends HTMLElement {
560
- constructor() {
561
- super();
562
- }
563
- connectedCallback() {
564
- const rootElement = this.closest("media-time-slider-root");
565
- if (rootElement?._state?.core) rootElement._state.core.setState({ _trackElement: this });
566
- }
567
- _update(props, _state) {
568
- setAttributes(this, props);
569
- if (props["data-orientation"] === "horizontal") {
570
- this.style.width = "100%";
571
- this.style.removeProperty("height");
572
- } else {
573
- this.style.height = "100%";
574
- this.style.removeProperty("width");
575
- }
576
- }
577
- };
578
- var TimeSliderProgressBase = class extends HTMLElement {
579
- constructor() {
580
- super();
581
- this.style.position = "absolute";
582
- this.style.width = "var(--slider-fill, 0%)";
583
- this.style.height = "100%";
584
- }
585
- _update(props, _state) {
586
- setAttributes(this, props);
587
- if (props["data-orientation"] === "horizontal") {
588
- this.style.width = "var(--slider-fill, 0%)";
589
- this.style.height = "100%";
590
- this.style.top = "0";
591
- this.style.removeProperty("bottom");
592
- } else {
593
- this.style.height = "var(--slider-fill, 0%)";
594
- this.style.width = "100%";
595
- this.style.bottom = "0";
596
- this.style.removeProperty("top");
597
- }
598
- }
599
- };
600
- var TimeSliderPointerBase = class extends HTMLElement {
601
- constructor() {
602
- super();
603
- this.style.position = "absolute";
604
- this.style.width = "var(--slider-pointer, 0%)";
605
- this.style.height = "100%";
606
- }
607
- _update(props, _state) {
608
- setAttributes(this, props);
609
- if (props["data-orientation"] === "horizontal") {
610
- this.style.width = "var(--slider-pointer, 0%)";
611
- this.style.height = "100%";
612
- this.style.top = "0";
613
- this.style.removeProperty("bottom");
614
- } else {
615
- this.style.height = "var(--slider-pointer, 0%)";
616
- this.style.width = "100%";
617
- this.style.bottom = "0";
618
- this.style.removeProperty("top");
619
- }
620
- }
621
- };
622
- var TimeSliderThumbBase = class extends HTMLElement {
623
- constructor() {
624
- super();
625
- this.style.position = "absolute";
626
- }
627
- _update(props, _state) {
628
- setAttributes(this, props);
629
- if (props["data-orientation"] === "horizontal") {
630
- this.style.left = "var(--slider-fill, 0%)";
631
- this.style.top = "50%";
632
- this.style.translate = "-50% -50%";
633
- } else {
634
- this.style.bottom = "var(--slider-fill, 0%)";
635
- this.style.left = "50%";
636
- this.style.translate = "-50% 50%";
637
- }
638
- }
639
- };
640
- const useTimeSliderRootState = {
641
- keys: timeSliderStateDefinition.keys,
642
- transform: (rawState, mediaStore) => ({
643
- ...timeSliderStateDefinition.stateTransform(rawState),
644
- ...timeSliderStateDefinition.createRequestMethods(mediaStore.dispatch),
645
- core: null
646
- })
647
- };
648
- const getTimeSliderTrackProps = (_state, element) => {
649
- const rootElement = element.closest("media-time-slider-root");
650
- return { "data-orientation": rootElement?.orientation || "horizontal" };
651
- };
652
- const getTimeSliderProgressProps = (_state, element) => {
653
- const rootElement = element.closest("media-time-slider-root");
654
- return { "data-orientation": rootElement?.orientation || "horizontal" };
655
- };
656
- const getTimeSliderPointerProps = (_state, element) => {
657
- const rootElement = element.closest("media-time-slider-root");
658
- return { "data-orientation": rootElement?.orientation || "horizontal" };
659
- };
660
- const getTimeSliderThumbProps = (_state, element) => {
661
- const rootElement = element.closest("media-time-slider-root");
662
- return { "data-orientation": rootElement?.orientation || "horizontal" };
663
- };
664
- const TimeSliderRoot = toConnectedHTMLComponent(TimeSliderRootBase, useTimeSliderRootState, getTimeSliderRootProps, "TimeSliderRoot");
665
- const TimeSliderTrack = toConnectedHTMLComponent(TimeSliderTrackBase, {
666
- keys: [],
667
- transform: () => ({})
668
- }, getTimeSliderTrackProps, "TimeSliderTrack");
669
- const TimeSliderProgress = toConnectedHTMLComponent(TimeSliderProgressBase, {
670
- keys: [],
671
- transform: () => ({})
672
- }, getTimeSliderProgressProps, "TimeSliderProgress");
673
- const TimeSliderPointer = toConnectedHTMLComponent(TimeSliderPointerBase, {
674
- keys: [],
675
- transform: () => ({})
676
- }, getTimeSliderPointerProps, "TimeSliderPointer");
677
- const TimeSliderThumb = toConnectedHTMLComponent(TimeSliderThumbBase, {
678
- keys: [],
679
- transform: () => ({})
680
- }, getTimeSliderThumbProps, "TimeSliderThumb");
681
- const TimeSlider$1 = Object.assign({}, {
682
- Root: TimeSliderRoot,
683
- Track: TimeSliderTrack,
684
- Progress: TimeSliderProgress,
685
- Pointer: TimeSliderPointer,
686
- Thumb: TimeSliderThumb
687
- });
688
- if (!globalThis.customElements.get("media-time-slider-root")) globalThis.customElements.define("media-time-slider-root", TimeSliderRoot);
689
- if (!globalThis.customElements.get("media-time-slider-track")) globalThis.customElements.define("media-time-slider-track", TimeSliderTrack);
690
- if (!globalThis.customElements.get("media-time-slider-progress")) globalThis.customElements.define("media-time-slider-progress", TimeSliderProgress);
691
- if (!globalThis.customElements.get("media-time-slider-pointer")) globalThis.customElements.define("media-time-slider-pointer", TimeSliderPointer);
692
- if (!globalThis.customElements.get("media-time-slider-thumb")) globalThis.customElements.define("media-time-slider-thumb", TimeSliderThumb);
693
-
694
- //#endregion
695
- //#region src/components/media-tooltip.ts
696
- var MediaTooltipRoot = class extends HTMLElement {
697
- #open = false;
698
- #hoverTimeout = null;
699
- #cleanup = null;
700
- #arrowElement = null;
701
- #pointerPosition = {
702
- x: 0,
703
- y: 0
704
- };
705
- #transitionStatus = "initial";
706
- constructor() {
707
- super();
708
- if (globalThis.matchMedia?.("(hover: hover)")?.matches) {
709
- this.addEventListener("pointerenter", this);
710
- this.addEventListener("pointerleave", this);
711
- this.addEventListener("pointermove", this);
712
- }
713
- }
714
- handleEvent(event) {
715
- if (event.type === "pointerenter") this.#handlePointerEnter();
716
- else if (event.type === "pointerleave") this.#handlePointerLeave(event);
717
- else if (event.type === "pointermove") this.#handlePointerMove(event);
718
- }
719
- connectedCallback() {
720
- this.#updateVisibility();
721
- }
722
- disconnectedCallback() {
723
- this.#clearHoverTimeout();
724
- this.#cleanup?.();
725
- this.#transitionStatus = "unmounted";
726
- this.#updateVisibility();
727
- }
728
- static get observedAttributes() {
729
- return [
730
- "delay",
731
- "close-delay",
732
- "track-cursor-axis"
733
- ];
734
- }
735
- get delay() {
736
- return Number.parseInt(this.getAttribute("delay") ?? "0", 10);
737
- }
738
- get closeDelay() {
739
- return Number.parseInt(this.getAttribute("close-delay") ?? "0", 10);
740
- }
741
- get trackCursorAxis() {
742
- const value = this.getAttribute("track-cursor-axis");
743
- return value === "x" || value === "y" || value === "both" ? value : void 0;
744
- }
745
- get #triggerElement() {
746
- return this.querySelector("media-tooltip-trigger");
747
- }
748
- get #portalElement() {
749
- return this.querySelector("media-tooltip-portal");
750
- }
751
- get #positionerElement() {
752
- return this.#portalElement?.querySelector("media-tooltip-positioner");
753
- }
754
- get #popupElement() {
755
- return this.#portalElement?.querySelector("media-tooltip-popup");
756
- }
757
- #setOpen(open) {
758
- if (this.#open === open) return;
759
- this.#open = open;
760
- if (open) {
761
- this.#transitionStatus = "initial";
762
- requestAnimationFrame(() => {
763
- this.#transitionStatus = "open";
764
- this.#updateVisibility();
765
- });
766
- } else this.#transitionStatus = "close";
767
- this.#updateVisibility();
768
- if (open) this.#setupFloating();
769
- else {
770
- this.#cleanup?.();
771
- this.#cleanup = null;
772
- }
773
- }
774
- #updateVisibility() {
775
- this.style.display = "contents";
776
- if (this.#popupElement) {
777
- const placement = this.#positionerElement?.side ?? "top";
778
- this.#popupElement.setAttribute("data-side", placement);
779
- this.#popupElement.toggleAttribute("data-starting-style", this.#transitionStatus === "initial");
780
- this.#popupElement.toggleAttribute("data-open", this.#transitionStatus === "initial" || this.#transitionStatus === "open");
781
- this.#popupElement.toggleAttribute("data-ending-style", this.#transitionStatus === "close" || this.#transitionStatus === "unmounted");
782
- this.#popupElement.toggleAttribute("data-closed", this.#transitionStatus === "close" || this.#transitionStatus === "unmounted");
783
- }
784
- const triggerElement = this.#triggerElement?.firstElementChild;
785
- if (triggerElement) triggerElement.toggleAttribute("data-popup-open", this.#open);
786
- }
787
- #setupFloating() {
788
- if (!this.#triggerElement || !this.#popupElement) return;
789
- const trigger = this.#triggerElement.firstElementChild;
790
- const popup = this.#popupElement;
791
- if (!trigger || !popup) return;
792
- const placement = this.#positionerElement?.side ?? "top";
793
- const sideOffset = this.#positionerElement?.sideOffset ?? 0;
794
- const collisionPadding = this.#positionerElement?.collisionPadding ?? 0;
795
- const mediaContainer = this.closest("media-container");
796
- this.#arrowElement = popup.querySelector("media-tooltip-arrow");
797
- const updatePosition = () => {
798
- const middleware = [
799
- offset(sideOffset),
800
- flip(),
801
- shift({
802
- boundary: mediaContainer,
803
- padding: collisionPadding
804
- })
805
- ];
806
- if (this.#arrowElement) middleware.push(arrow({ element: this.#arrowElement }));
807
- computePosition(this.trackCursorAxis ? { getBoundingClientRect: () => {
808
- const triggerRect = trigger.getBoundingClientRect();
809
- if (this.trackCursorAxis === "x") return {
810
- width: 0,
811
- height: 0,
812
- top: triggerRect.top,
813
- right: this.#pointerPosition.x,
814
- bottom: triggerRect.bottom,
815
- left: this.#pointerPosition.x,
816
- x: this.#pointerPosition.x,
817
- y: triggerRect.top
818
- };
819
- else if (this.trackCursorAxis === "y") return {
820
- width: 0,
821
- height: 0,
822
- top: this.#pointerPosition.y,
823
- right: triggerRect.right,
824
- bottom: this.#pointerPosition.y,
825
- left: triggerRect.left,
826
- x: triggerRect.left,
827
- y: this.#pointerPosition.y
828
- };
829
- else return {
830
- width: 0,
831
- height: 0,
832
- top: this.#pointerPosition.y,
833
- right: this.#pointerPosition.x,
834
- bottom: this.#pointerPosition.y,
835
- left: this.#pointerPosition.x,
836
- x: this.#pointerPosition.x,
837
- y: this.#pointerPosition.y
838
- };
839
- } } : trigger, popup, {
840
- placement,
841
- middleware
842
- }).then(({ x, y, middlewareData, placement: computedPlacement }) => {
843
- Object.assign(popup.style, {
844
- left: `${x}px`,
845
- top: `${y}px`
846
- });
847
- popup.setAttribute("data-side", computedPlacement);
848
- if (this.#arrowElement && middlewareData.arrow) {
849
- const { x: arrowX, y: arrowY } = middlewareData.arrow;
850
- Object.assign(this.#arrowElement.style, {
851
- left: arrowX != null ? `${arrowX}px` : void 0,
852
- top: arrowY != null ? `${arrowY}px` : void 0
853
- });
854
- }
855
- });
856
- };
857
- updatePosition();
858
- if (!this.trackCursorAxis) this.#cleanup = autoUpdate(trigger, popup, updatePosition);
859
- }
860
- #updatePosition() {
861
- if (this.#open && this.trackCursorAxis) this.#setupFloating();
862
- }
863
- #clearHoverTimeout() {
864
- if (this.#hoverTimeout) {
865
- clearTimeout(this.#hoverTimeout);
866
- this.#hoverTimeout = null;
867
- }
868
- }
869
- #handlePointerEnter() {
870
- this.#clearHoverTimeout();
871
- this.#hoverTimeout = globalThis.setTimeout(() => {
872
- this.#setOpen(true);
873
- }, this.delay);
874
- }
875
- #handlePointerLeave(_event) {
876
- this.#clearHoverTimeout();
877
- this.#hoverTimeout = globalThis.setTimeout(() => {
878
- this.#setOpen(false);
879
- }, this.closeDelay);
880
- }
881
- #handlePointerMove(event) {
882
- if (this.trackCursorAxis) {
883
- this.#pointerPosition = {
884
- x: event.clientX,
885
- y: event.clientY
886
- };
887
- if (this.#open) this.#updatePosition();
888
- }
889
- }
890
- };
891
- var MediaTooltipTrigger = class extends HTMLElement {
892
- connectedCallback() {
893
- this.style.display = "contents";
894
- const triggerElement = this.firstElementChild;
895
- if (triggerElement) new MutationObserver((mutations) => {
896
- mutations.forEach((mutation) => {
897
- if (mutation.type === "attributes") {
898
- const rootElement = this.closest("media-tooltip-root");
899
- let popupElement = rootElement.querySelector("media-tooltip-popup");
900
- if (!popupElement) {
901
- const portalElement = rootElement.querySelector("media-tooltip-portal");
902
- if (!portalElement) return;
903
- popupElement = portalElement.querySelector("media-tooltip-popup");
904
- if (!popupElement) return;
905
- }
906
- const attributeName = mutation.attributeName;
907
- if (!attributeName || !attributeName.startsWith("data-")) return;
908
- const attributeValue = triggerElement.getAttribute(attributeName);
909
- if (attributeValue !== null) popupElement.setAttribute(attributeName, attributeValue);
910
- else popupElement.removeAttribute(attributeName);
911
- }
912
- });
913
- }).observe(triggerElement, { attributes: true });
914
- }
915
- };
916
- var MediaTooltipPortal = class extends HTMLElement {
917
- #portal = null;
918
- connectedCallback() {
919
- this.style.display = "contents";
920
- this.#setupPortal();
921
- }
922
- disconnectedCallback() {
923
- this.#cleanupPortal();
924
- }
925
- querySelector(selector) {
926
- return this.#portal?.querySelector(selector) ?? null;
927
- }
928
- #setupPortal() {
929
- const portalId = this.getAttribute("root-id") ?? "@default_portal_id";
930
- if (!portalId) return;
931
- const portalContainer = this.getRootNode().getElementById(portalId) ?? this.getRootNode().querySelector("media-container")?.shadowRoot?.getElementById(portalId) ? this.getRootNode().querySelector("media-container") : void 0;
932
- if (!portalContainer) return;
933
- this.#portal = document.createElement("div");
934
- this.#portal.slot = "portal";
935
- this.#portal.id = uniqueId();
936
- portalContainer.append(this.#portal);
937
- this.#portal.append(...this.children);
938
- }
939
- #cleanupPortal() {
940
- if (!this.#portal) return;
941
- this.append(...this.#portal.children);
942
- this.#portal.remove();
943
- this.#portal = null;
944
- }
945
- };
946
- var MediaTooltipPositioner = class extends HTMLElement {
947
- connectedCallback() {
948
- this.style.display = "contents";
949
- const popup = this.firstElementChild;
950
- if (popup) Object.assign(popup.style, {
951
- position: "absolute",
952
- top: "0",
953
- left: "0"
954
- });
955
- }
956
- get side() {
957
- return this.getAttribute("side") ?? "top";
958
- }
959
- get sideOffset() {
960
- return Number.parseInt(this.getAttribute("side-offset") ?? "0", 10);
961
- }
962
- get collisionPadding() {
963
- return Number.parseInt(this.getAttribute("collision-padding") ?? "0", 10);
964
- }
965
- };
966
- var MediaTooltipPopup = class extends HTMLElement {
967
- connectedCallback() {
968
- this.setAttribute("role", "tooltip");
969
- }
970
- };
971
- var MediaTooltipArrow = class extends HTMLElement {
972
- connectedCallback() {
973
- this.setAttribute("aria-hidden", "true");
974
- }
975
- };
976
- if (!globalThis.customElements.get("media-tooltip-root")) globalThis.customElements.define("media-tooltip-root", MediaTooltipRoot);
977
- if (!globalThis.customElements.get("media-tooltip-trigger")) globalThis.customElements.define("media-tooltip-trigger", MediaTooltipTrigger);
978
- if (!globalThis.customElements.get("media-tooltip-portal")) globalThis.customElements.define("media-tooltip-portal", MediaTooltipPortal);
979
- if (!globalThis.customElements.get("media-tooltip-positioner")) globalThis.customElements.define("media-tooltip-positioner", MediaTooltipPositioner);
980
- if (!globalThis.customElements.get("media-tooltip-popup")) globalThis.customElements.define("media-tooltip-popup", MediaTooltipPopup);
981
- if (!globalThis.customElements.get("media-tooltip-arrow")) globalThis.customElements.define("media-tooltip-arrow", MediaTooltipArrow);
982
- const Tooltip = {
983
- Root: MediaTooltipRoot,
984
- Trigger: MediaTooltipTrigger,
985
- Portal: MediaTooltipPortal,
986
- Positioner: MediaTooltipPositioner,
987
- Popup: MediaTooltipPopup,
988
- Arrow: MediaTooltipArrow
989
- };
990
-
991
- //#endregion
992
- //#region src/components/media-volume-slider.ts
993
- /**
994
- * VolumeSlider Root props hook - equivalent to React's useVolumeSliderRootProps
995
- * Handles element attributes and properties based on state
996
- */
997
- const getVolumeSliderRootProps = (state, element) => {
998
- const volumeText = `${Math.round(state.muted ? 0 : state.volume * 100)}%`;
999
- return {
1000
- role: "slider",
1001
- tabindex: element.getAttribute("tabindex") ?? "0",
1002
- "data-muted": state.muted.toString(),
1003
- "data-volume-level": state.volumeLevel,
1004
- "data-orientation": element.orientation || "horizontal",
1005
- "aria-label": "Volume",
1006
- "aria-valuemin": "0",
1007
- "aria-valuemax": "100",
1008
- "aria-valuetext": volumeText,
1009
- "aria-orientation": element.orientation || "horizontal"
1010
- };
1011
- };
1012
- var VolumeSliderRootBase = class extends HTMLElement {
1013
- constructor(..._args) {
1014
- super(..._args);
1015
- this._core = null;
1016
- }
1017
- static {
1018
- this.observedAttributes = ["orientation"];
1019
- }
1020
- get volume() {
1021
- return this._state?.volume;
1022
- }
1023
- get muted() {
1024
- return this._state?.muted ?? false;
1025
- }
1026
- get volumeLevel() {
1027
- return this._state?.volumeLevel ?? "high";
1028
- }
1029
- get orientation() {
1030
- return this.getAttribute("orientation") || "horizontal";
1031
- }
1032
- attributeChangedCallback(name, _oldValue, _newValue) {
1033
- if (name === "orientation" && this._state) this._render(getVolumeSliderRootProps(this._state, this), this._state);
1034
- }
1035
- _update(_props, state) {
1036
- this._state = state;
1037
- if (state && !this._core) {
1038
- this._core = new VolumeSlider();
1039
- this._core.subscribe(() => this._render(getVolumeSliderRootProps(state, this), state));
1040
- this._core.attach(this);
1041
- state.core = this._core;
1042
- }
1043
- this._core?.setState(state);
1044
- }
1045
- _render(props, state) {
1046
- const coreState = state?.core?.getState();
1047
- if (!coreState) return;
1048
- this.style.setProperty("--slider-fill", `${coreState._fillWidth.toFixed(3)}%`);
1049
- this.style.setProperty("--slider-pointer", `${coreState._pointerWidth.toFixed(3)}%`);
1050
- props["aria-valuenow"] = coreState._fillWidth.toString();
1051
- setAttributes(this, props);
1052
- }
1053
- };
1054
- /**
1055
- * VolumeSlider Track component - Track element that captures pointer events
1056
- */
1057
- var VolumeSliderTrackBase = class extends HTMLElement {
1058
- constructor() {
1059
- super();
1060
- }
1061
- connectedCallback() {
1062
- const rootElement = this.closest("media-volume-slider-root");
1063
- if (rootElement?._state?.core) rootElement._state.core.setState({ _trackElement: this });
1064
- }
1065
- _update(props, _state) {
1066
- setAttributes(this, props);
1067
- if (props["data-orientation"] === "horizontal") {
1068
- this.style.width = "100%";
1069
- this.style.removeProperty("height");
1070
- } else {
1071
- this.style.height = "100%";
1072
- this.style.removeProperty("width");
1073
- }
1074
- }
1075
- };
1076
- /**
1077
- * VolumeSlider Progress component - Shows current progress
1078
- */
1079
- var VolumeSliderProgressBase = class extends HTMLElement {
1080
- constructor() {
1081
- super();
1082
- this.style.position = "absolute";
1083
- this.style.width = "var(--slider-fill, 0%)";
1084
- this.style.height = "100%";
1085
- }
1086
- _update(props, _state) {
1087
- setAttributes(this, props);
1088
- if (props["data-orientation"] === "horizontal") {
1089
- this.style.width = "var(--slider-fill, 0%)";
1090
- this.style.height = "100%";
1091
- this.style.top = "0";
1092
- this.style.removeProperty("bottom");
1093
- } else {
1094
- this.style.height = "var(--slider-fill, 0%)";
1095
- this.style.width = "100%";
1096
- this.style.bottom = "0";
1097
- this.style.removeProperty("top");
1098
- }
1099
- }
1100
- };
1101
- /**
1102
- * VolumeSlider Thumb component - Draggable thumb element
1103
- */
1104
- var VolumeSliderThumbBase = class extends HTMLElement {
1105
- constructor() {
1106
- super();
1107
- this.style.position = "absolute";
1108
- }
1109
- _update(props, _state) {
1110
- setAttributes(this, props);
1111
- if (props["data-orientation"] === "horizontal") {
1112
- this.style.left = "var(--slider-fill, 0%)";
1113
- this.style.top = "50%";
1114
- this.style.translate = "-50% -50%";
1115
- } else {
1116
- this.style.bottom = "var(--slider-fill, 0%)";
1117
- this.style.left = "50%";
1118
- this.style.translate = "-50% 50%";
1119
- }
1120
- }
1121
- };
1122
- /**
1123
- * VolumeSlider Root state hook - equivalent to React's useVolumeSliderRootState
1124
- * Handles media store state subscription and transformation
1125
- */
1126
- const useVolumeSliderRootState = {
1127
- keys: volumeSliderStateDefinition.keys,
1128
- transform: (rawState, mediaStore) => ({
1129
- ...volumeSliderStateDefinition.stateTransform(rawState),
1130
- ...volumeSliderStateDefinition.createRequestMethods(mediaStore.dispatch),
1131
- core: null
1132
- })
1133
- };
1134
- /**
1135
- * VolumeSlider Track props hook
1136
- */
1137
- const getVolumeSliderTrackProps = (_state, element) => {
1138
- const rootElement = element.closest("media-volume-slider-root");
1139
- return { "data-orientation": rootElement?.orientation || "horizontal" };
1140
- };
1141
- /**
1142
- * VolumeSlider Progress props hook
1143
- */
1144
- const getVolumeSliderProgressProps = (_state, element) => {
1145
- const rootElement = element.closest("media-volume-slider-root");
1146
- return { "data-orientation": rootElement?.orientation || "horizontal" };
1147
- };
1148
- /**
1149
- * VolumeSlider Thumb props hook
1150
- */
1151
- const getVolumeSliderThumbProps = (_state, element) => {
1152
- const rootElement = element.closest("media-volume-slider-root");
1153
- return { "data-orientation": rootElement?.orientation || "horizontal" };
1154
- };
1155
- /**
1156
- * Connected VolumeSlider Root component using hook-style architecture
1157
- */
1158
- const VolumeSliderRoot = toConnectedHTMLComponent(VolumeSliderRootBase, useVolumeSliderRootState, getVolumeSliderRootProps, "VolumeSliderRoot");
1159
- /**
1160
- * Connected VolumeSlider Track component
1161
- */
1162
- const VolumeSliderTrack = toConnectedHTMLComponent(VolumeSliderTrackBase, {
1163
- keys: [],
1164
- transform: () => ({})
1165
- }, getVolumeSliderTrackProps, "VolumeSliderTrack");
1166
- /**
1167
- * Connected VolumeSlider Progress component
1168
- */
1169
- const VolumeSliderProgress = toConnectedHTMLComponent(VolumeSliderProgressBase, {
1170
- keys: [],
1171
- transform: () => ({})
1172
- }, getVolumeSliderProgressProps, "VolumeSliderProgress");
1173
- /**
1174
- * Connected VolumeSlider Thumb component
1175
- */
1176
- const VolumeSliderThumb = toConnectedHTMLComponent(VolumeSliderThumbBase, {
1177
- keys: [],
1178
- transform: () => ({})
1179
- }, getVolumeSliderThumbProps, "VolumeSliderThumb");
1180
- /**
1181
- * Compound VolumeSlider component object
1182
- */
1183
- const VolumeSlider$1 = Object.assign({}, {
1184
- Root: VolumeSliderRoot,
1185
- Track: VolumeSliderTrack,
1186
- Progress: VolumeSliderProgress,
1187
- Thumb: VolumeSliderThumb
1188
- });
1189
- if (!globalThis.customElements.get("media-volume-slider-root")) globalThis.customElements.define("media-volume-slider-root", VolumeSliderRoot);
1190
- if (!globalThis.customElements.get("media-volume-slider-track")) globalThis.customElements.define("media-volume-slider-track", VolumeSliderTrack);
1191
- if (!globalThis.customElements.get("media-volume-slider-progress")) globalThis.customElements.define("media-volume-slider-progress", VolumeSliderProgress);
1192
- if (!globalThis.customElements.get("media-volume-slider-thumb")) globalThis.customElements.define("media-volume-slider-thumb", VolumeSliderThumb);
1193
-
1194
- //#endregion
1195
- //#region src/media/media-container.ts
1196
- function getTemplateHTML$1() {
1197
- return `
1198
- <slot name="media"></slot>
1199
- <slot></slot>
1200
- <div id="@default_portal_id" style={ position: absolute; zIndex: 10; }>
1201
- <slot name="portal"></slot>
1202
- </div>
1203
- `;
1204
- }
1205
- const CustomElementConsumer = ConsumerMixin(HTMLElement);
1206
- var MediaContainer = class extends CustomElementConsumer {
1207
- static {
1208
- this.shadowRootOptions = { mode: "open" };
1209
- }
1210
- static {
1211
- this.getTemplateHTML = getTemplateHTML$1;
1212
- }
1213
- constructor() {
1214
- super();
1215
- this._paused = true;
1216
- this.contexts = { mediaStore: (mediaStore) => {
1217
- this._mediaStore = mediaStore;
1218
- this._handleMediaSlotChange();
1219
- this._registerContainerStateOwner();
1220
- this._subscribeToPlayState();
1221
- } };
1222
- this._registerContainerStateOwner = () => {
1223
- if (!this._mediaStore) return;
1224
- this._mediaStore.dispatch({
1225
- type: "containerstateownerchangerequest",
1226
- detail: this
1227
- });
1228
- };
1229
- this._unregisterContainerStateOwner = () => {
1230
- if (!this._mediaStore) return;
1231
- this._mediaStore.dispatch({
1232
- type: "containerstateownerchangerequest",
1233
- detail: null
1234
- });
1235
- };
1236
- this._handleMediaSlotChange = () => {
1237
- const media = this._mediaSlot.assignedElements({ flatten: true })[0];
1238
- this._mediaStore.dispatch({
1239
- type: "mediastateownerchangerequest",
1240
- detail: media
1241
- });
1242
- };
1243
- this._handleClick = (event) => {
1244
- if (!this._mediaStore) return;
1245
- if (!["video", "audio"].includes(event.target.localName || "")) return;
1246
- if (this._paused) this._mediaStore.dispatch({ type: "playrequest" });
1247
- else this._mediaStore.dispatch({ type: "pauserequest" });
1248
- };
1249
- this._subscribeToPlayState = () => {
1250
- if (!this._mediaStore) return;
1251
- this._mediaStore.subscribe((state) => {
1252
- this._paused = state.paused ?? true;
1253
- });
1254
- };
1255
- if (!this.shadowRoot) {
1256
- this.attachShadow(this.constructor.shadowRootOptions);
1257
- this.shadowRoot.innerHTML = this.constructor.getTemplateHTML();
1258
- }
1259
- this._mediaSlot = this.shadowRoot.querySelector("slot[name=media]");
1260
- this._mediaSlot.addEventListener("slotchange", this._handleMediaSlotChange);
1261
- this.addEventListener("click", this._handleClick);
1262
- }
1263
- connectedCallback() {
1264
- super.connectedCallback?.();
1265
- this._registerContainerStateOwner();
1266
- }
1267
- disconnectedCallback() {
1268
- super.disconnectedCallback?.();
1269
- this._unregisterContainerStateOwner();
1270
- }
1271
- };
1272
- if (!globalThis.customElements.get("media-container")) globalThis.customElements.define("media-container", MediaContainer);
1273
-
1274
- //#endregion
1275
- //#region src/media/media-provider.ts
1276
- const ProviderHTMLElement = ProviderMixin(HTMLElement);
1277
- var MediaProvider = class extends ProviderHTMLElement {
1278
- constructor(..._args) {
1279
- super(..._args);
1280
- this.contexts = { mediaStore: () => {
1281
- return createMediaStore();
1282
- } };
1283
- }
1284
- };
1285
- customElements.define("media-provider", MediaProvider);
1286
-
1287
- //#endregion
1288
- //#region src/media/media-skin.ts
1289
- function getTemplateHTML() {
1290
- return `
1291
- <style>
1292
- :host {
1293
- display: block;
1294
- }
1295
-
1296
- media-container {
1297
- display: block;
1298
- width: 100%;
1299
- height: 100%;
1300
- }
1301
- </style>
1302
- <slot></slot>
1303
- `;
1304
- }
1305
- var MediaSkin = class extends HTMLElement {
1306
- static {
1307
- this.shadowRootOptions = { mode: "open" };
1308
- }
1309
- static {
1310
- this.getTemplateHTML = getTemplateHTML;
1311
- }
1312
- constructor() {
1313
- super();
1314
- if (!this.shadowRoot) {
1315
- this.attachShadow(this.constructor.shadowRootOptions);
1316
- this.shadowRoot.innerHTML = this.constructor.getTemplateHTML();
1317
- }
1318
- }
1319
- };
1320
- if (!customElements.get("media-skin")) customElements.define("media-skin", MediaSkin);
1321
-
1322
- //#endregion
1323
- export { Tooltip as a, PlayButton as c, DurationDisplay as d, CurrentTimeDisplay as f, VolumeSlider$1 as i, MuteButton as l, MediaProvider as n, TimeSlider$1 as o, toConnectedHTMLComponent as p, MediaContainer as r, Popover as s, MediaSkin as t, FullscreenButton as u };
1324
- //# sourceMappingURL=media-skin-DR8zj-LV.js.map