vidply 1.1.3 → 1.1.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 (83) hide show
  1. package/dist/dev/{vidply.AudioDescriptionManager-AXPP5OKO.js → vidply.AudioDescriptionManager-DCZFE3N2.js} +4 -4
  2. package/dist/dev/vidply.FloatingPlayerManager-5EA4BYSR.js +515 -0
  3. package/dist/dev/vidply.FloatingPlayerManager-5EA4BYSR.js.map +7 -0
  4. package/dist/dev/{vidply.SignLanguageManager-OOZLX2GI.js → vidply.SignLanguageManager-4NOFV4EZ.js} +7 -5
  5. package/dist/dev/{vidply.SignLanguageManager-OOZLX2GI.js.map → vidply.SignLanguageManager-4NOFV4EZ.js.map} +1 -1
  6. package/dist/dev/{vidply.TranscriptManager-BOYEUAA4.js → vidply.TranscriptManager-7TS37MMM.js} +9 -7
  7. package/dist/dev/{vidply.TranscriptManager-BOYEUAA4.js.map → vidply.TranscriptManager-7TS37MMM.js.map} +1 -1
  8. package/dist/dev/{vidply.chunk-55W33EGZ.js → vidply.chunk-2RIPRXWI.js} +3 -3
  9. package/dist/dev/vidply.chunk-2RIPRXWI.js.map +7 -0
  10. package/dist/dev/{vidply.chunk-S36ISCDT.js → vidply.chunk-5SDVVGOD.js} +2 -2
  11. package/dist/dev/vidply.chunk-COW6OPNQ.js +222 -0
  12. package/dist/dev/vidply.chunk-COW6OPNQ.js.map +7 -0
  13. package/dist/dev/{vidply.chunk-37V7VOIQ.js → vidply.chunk-D6GBU4V6.js} +2 -212
  14. package/dist/dev/vidply.chunk-D6GBU4V6.js.map +7 -0
  15. package/dist/dev/{vidply.chunk-VLF6H5PZ.js → vidply.chunk-FDUUJHK6.js} +13 -5
  16. package/dist/dev/vidply.chunk-FDUUJHK6.js.map +7 -0
  17. package/dist/dev/{vidply.chunk-SXDZXXZD.js → vidply.chunk-X6PJOVWZ.js} +7 -1
  18. package/dist/dev/{vidply.chunk-SXDZXXZD.js.map → vidply.chunk-X6PJOVWZ.js.map} +2 -2
  19. package/dist/dev/{vidply.de-HLO4IOPX.js → vidply.de-TEYITA3Z.js} +9 -1
  20. package/dist/dev/vidply.de-TEYITA3Z.js.map +7 -0
  21. package/dist/dev/{vidply.es-OBOYSHKU.js → vidply.es-OKQLRQPJ.js} +9 -1
  22. package/dist/dev/vidply.es-OKQLRQPJ.js.map +7 -0
  23. package/dist/dev/vidply.esm.js +320 -24
  24. package/dist/dev/vidply.esm.js.map +3 -3
  25. package/dist/dev/{vidply.fr-WDRPLLB6.js → vidply.fr-52424DPC.js} +9 -1
  26. package/dist/dev/vidply.fr-52424DPC.js.map +7 -0
  27. package/dist/dev/{vidply.ja-ILEIPUNW.js → vidply.ja-X4QNECSO.js} +9 -1
  28. package/dist/dev/vidply.ja-X4QNECSO.js.map +7 -0
  29. package/dist/legacy/vidply.js +872 -15
  30. package/dist/legacy/vidply.js.map +4 -4
  31. package/dist/legacy/vidply.min.js +1 -1
  32. package/dist/legacy/vidply.min.meta.json +72 -20
  33. package/dist/prod/{vidply.AudioDescriptionManager-623CQKLU.min.js → vidply.AudioDescriptionManager-JJFZSG7G.min.js} +1 -1
  34. package/dist/prod/vidply.FloatingPlayerManager-JVNKAK4N.min.js +6 -0
  35. package/dist/prod/vidply.SignLanguageManager-6FBSQB4U.min.js +6 -0
  36. package/dist/prod/vidply.TranscriptManager-L5E737CR.min.js +6 -0
  37. package/dist/prod/{vidply.chunk-ALJYNEGS.min.js → vidply.chunk-DPEZK7YT.min.js} +1 -1
  38. package/dist/prod/vidply.chunk-KXQK2NF7.min.js +6 -0
  39. package/dist/prod/{vidply.chunk-2YTNSNRD.min.js → vidply.chunk-MOAZJSWV.min.js} +1 -1
  40. package/dist/prod/vidply.chunk-QGVFMQUO.min.js +6 -0
  41. package/dist/prod/vidply.chunk-VSKF7AQ2.min.js +6 -0
  42. package/dist/prod/{vidply.chunk-KYQFJSLN.min.js → vidply.chunk-ZDIQYKKX.min.js} +1 -1
  43. package/dist/prod/vidply.de-EIZK243P.min.js +6 -0
  44. package/dist/prod/vidply.es-JGYFGRSI.min.js +6 -0
  45. package/dist/prod/vidply.esm.min.js +1 -1
  46. package/dist/prod/vidply.fr-XAQ6ZIB7.min.js +6 -0
  47. package/dist/prod/vidply.ja-S77KR54S.min.js +6 -0
  48. package/dist/vidply.css +475 -209
  49. package/dist/vidply.esm.min.meta.json +169 -75
  50. package/dist/vidply.min.css +1 -1
  51. package/package.json +1 -1
  52. package/src/controls/CaptionManager.ts +555 -555
  53. package/src/controls/ControlBar.ts +172 -19
  54. package/src/core/FloatingPlayerManager.ts +631 -0
  55. package/src/core/Player.ts +6036 -5946
  56. package/src/i18n/languages/de.ts +8 -0
  57. package/src/i18n/languages/en.ts +8 -0
  58. package/src/i18n/languages/es.ts +8 -0
  59. package/src/i18n/languages/fr.ts +8 -0
  60. package/src/i18n/languages/ja.ts +8 -0
  61. package/src/index.ts +5 -0
  62. package/src/styles/vidply.css +475 -209
  63. package/src/types/options.ts +6 -0
  64. package/src/types/state.ts +1 -0
  65. package/src/utils/DownloadInfo.ts +148 -0
  66. package/src/utils/StorageManager.ts +8 -0
  67. package/dist/dev/vidply.chunk-37V7VOIQ.js.map +0 -7
  68. package/dist/dev/vidply.chunk-55W33EGZ.js.map +0 -7
  69. package/dist/dev/vidply.chunk-VLF6H5PZ.js.map +0 -7
  70. package/dist/dev/vidply.de-HLO4IOPX.js.map +0 -7
  71. package/dist/dev/vidply.es-OBOYSHKU.js.map +0 -7
  72. package/dist/dev/vidply.fr-WDRPLLB6.js.map +0 -7
  73. package/dist/dev/vidply.ja-ILEIPUNW.js.map +0 -7
  74. package/dist/prod/vidply.SignLanguageManager-UPGXSO5F.min.js +0 -6
  75. package/dist/prod/vidply.TranscriptManager-PLVKPYNB.min.js +0 -6
  76. package/dist/prod/vidply.chunk-UO33KGOT.min.js +0 -6
  77. package/dist/prod/vidply.chunk-XHLTMSR5.min.js +0 -6
  78. package/dist/prod/vidply.de-CKLFPHNF.min.js +0 -6
  79. package/dist/prod/vidply.es-FYZBTBVH.min.js +0 -6
  80. package/dist/prod/vidply.fr-E7FMYILU.min.js +0 -6
  81. package/dist/prod/vidply.ja-NOW6P3IH.min.js +0 -6
  82. /package/dist/dev/{vidply.AudioDescriptionManager-AXPP5OKO.js.map → vidply.AudioDescriptionManager-DCZFE3N2.js.map} +0 -0
  83. /package/dist/dev/{vidply.chunk-S36ISCDT.js.map → vidply.chunk-5SDVVGOD.js.map} +0 -0
@@ -5,9 +5,9 @@
5
5
  */
6
6
  import {
7
7
  CaptionManager
8
- } from "./vidply.chunk-55W33EGZ.js";
9
- import "./vidply.chunk-SXDZXXZD.js";
10
- import "./vidply.chunk-VLF6H5PZ.js";
8
+ } from "./vidply.chunk-2RIPRXWI.js";
9
+ import "./vidply.chunk-X6PJOVWZ.js";
10
+ import "./vidply.chunk-FDUUJHK6.js";
11
11
 
12
12
  // src/core/AudioDescriptionManager.ts
13
13
  var AudioDescriptionManager = class {
@@ -569,4 +569,4 @@ var AudioDescriptionManager = class {
569
569
  export {
570
570
  AudioDescriptionManager
571
571
  };
572
- //# sourceMappingURL=vidply.AudioDescriptionManager-AXPP5OKO.js.map
572
+ //# sourceMappingURL=vidply.AudioDescriptionManager-DCZFE3N2.js.map
@@ -0,0 +1,515 @@
1
+ /*!
2
+ * Universal, Accessible Video Player
3
+ * (c) 2026 Matthias Peltzer
4
+ * Released under GPL-2.0-or-later License
5
+ */
6
+ import {
7
+ DraggableResizable,
8
+ createIconElement
9
+ } from "./vidply.chunk-D6GBU4V6.js";
10
+ import {
11
+ DOMUtils,
12
+ i18n
13
+ } from "./vidply.chunk-FDUUJHK6.js";
14
+
15
+ // src/core/FloatingPlayerManager.ts
16
+ var FLOATING_CLAIM_EVENT = "vidply:floating-claim";
17
+ var DEFAULT_WIDTH = 400;
18
+ var MIN_WIDTH = 240;
19
+ var EDGE_MARGIN = 16;
20
+ var FloatingPlayerManager = class {
21
+ player;
22
+ classPrefix;
23
+ shell;
24
+ dragHandle;
25
+ closeButton;
26
+ resizeHandles;
27
+ placeholder;
28
+ draggable;
29
+ originalParent;
30
+ originalNextSibling;
31
+ intersectionObserver;
32
+ observerTarget;
33
+ lastRatio;
34
+ _autoDismissedThisPlay;
35
+ _playListenerAttached;
36
+ _onPlayAfterDismiss;
37
+ _onClaim;
38
+ _onResize;
39
+ _onKeyDown;
40
+ _onEnterFullscreen;
41
+ _destroyed;
42
+ _triggerFocusEl;
43
+ _claimId;
44
+ constructor(player) {
45
+ this.player = player;
46
+ this.classPrefix = player.options.classPrefix || "vidply";
47
+ this.shell = null;
48
+ this.dragHandle = null;
49
+ this.closeButton = null;
50
+ this.resizeHandles = [];
51
+ this.placeholder = null;
52
+ this.draggable = null;
53
+ this.originalParent = null;
54
+ this.originalNextSibling = null;
55
+ this.intersectionObserver = null;
56
+ this.observerTarget = null;
57
+ this.lastRatio = 1;
58
+ this._autoDismissedThisPlay = false;
59
+ this._playListenerAttached = false;
60
+ this._onPlayAfterDismiss = null;
61
+ this._onClaim = null;
62
+ this._onResize = null;
63
+ this._onKeyDown = null;
64
+ this._onEnterFullscreen = null;
65
+ this._destroyed = false;
66
+ this._triggerFocusEl = null;
67
+ this._claimId = `floating-${player.instanceId}-${Date.now()}`;
68
+ this._setupClaimListener();
69
+ this._setupFullscreenGuard();
70
+ this._startObserving();
71
+ }
72
+ // ---------------------------------------------------------------
73
+ // Public API
74
+ // ---------------------------------------------------------------
75
+ togglePinned(triggerEl) {
76
+ if (this._destroyed) return;
77
+ if (this.player.state.floating === "pinned") {
78
+ this._autoDismissedThisPlay = true;
79
+ this._armPlayListenerToClearDismiss();
80
+ this.exit("manual");
81
+ return;
82
+ }
83
+ this._autoDismissedThisPlay = false;
84
+ this._triggerFocusEl = triggerEl || this._activeElement();
85
+ this.enter("pinned");
86
+ }
87
+ enter(reason) {
88
+ if (this._destroyed) return;
89
+ if (this.player.state.floating === reason) return;
90
+ if (!this._canFloat(reason)) {
91
+ return;
92
+ }
93
+ if (this.player.state.floating && this.player.state.floating !== reason) {
94
+ this.player.state.floating = reason;
95
+ this.player.emit("floatingchange", reason);
96
+ return;
97
+ }
98
+ this._claimSingleton();
99
+ this._ensureShell();
100
+ this._mountIntoShell();
101
+ this._applyInitialGeometry();
102
+ this.player.state.floating = reason;
103
+ this.player.emit("floatingchange", reason);
104
+ queueMicrotask(() => {
105
+ if (this.closeButton && this.player.state.floating) {
106
+ try {
107
+ this.closeButton.focus({ preventScroll: true });
108
+ } catch {
109
+ }
110
+ }
111
+ });
112
+ }
113
+ exit(reason = "manual") {
114
+ if (this._destroyed && reason !== "destroy") return;
115
+ if (!this.player.state.floating) return;
116
+ this._unmountFromShell();
117
+ this._teardownShell();
118
+ const priorTrigger = this._triggerFocusEl;
119
+ this._triggerFocusEl = null;
120
+ this.player.state.floating = null;
121
+ this.player.emit("floatingchange", null);
122
+ if ((reason === "manual" || reason === "dismiss") && priorTrigger) {
123
+ try {
124
+ priorTrigger.focus({ preventScroll: true });
125
+ } catch {
126
+ }
127
+ }
128
+ }
129
+ /**
130
+ * Close button: pause, dismiss, and prevent auto-float until the next
131
+ * user-initiated play event.
132
+ */
133
+ dismiss() {
134
+ if (this._destroyed) return;
135
+ this._autoDismissedThisPlay = true;
136
+ this._armPlayListenerToClearDismiss();
137
+ try {
138
+ this.player.pause();
139
+ } catch {
140
+ }
141
+ this.exit("dismiss");
142
+ }
143
+ destroy() {
144
+ if (this._destroyed) return;
145
+ this._destroyed = true;
146
+ if (this.player.state && this.player.state.floating) {
147
+ try {
148
+ this.exit("destroy");
149
+ } catch {
150
+ }
151
+ }
152
+ if (this.intersectionObserver) {
153
+ try {
154
+ this.intersectionObserver.disconnect();
155
+ } catch {
156
+ }
157
+ this.intersectionObserver = null;
158
+ }
159
+ this.observerTarget = null;
160
+ if (this._onClaim) {
161
+ window.removeEventListener(FLOATING_CLAIM_EVENT, this._onClaim);
162
+ this._onClaim = null;
163
+ }
164
+ if (this._onResize) {
165
+ window.removeEventListener("resize", this._onResize);
166
+ this._onResize = null;
167
+ }
168
+ if (this._onEnterFullscreen) {
169
+ this.player.off("enterfullscreen", this._onEnterFullscreen);
170
+ this._onEnterFullscreen = null;
171
+ }
172
+ if (this._onPlayAfterDismiss && this._playListenerAttached) {
173
+ this.player.off("play", this._onPlayAfterDismiss);
174
+ this._playListenerAttached = false;
175
+ this._onPlayAfterDismiss = null;
176
+ }
177
+ }
178
+ // ---------------------------------------------------------------
179
+ // Internal: guards
180
+ // ---------------------------------------------------------------
181
+ _canFloat(reason) {
182
+ if (!this.player.options.floating) return false;
183
+ if (!this.player.container) return false;
184
+ if (!this.player.element || this.player.element.tagName !== "VIDEO") return false;
185
+ if (this.player.state.fullscreen) return false;
186
+ if (this.player.playlistManager) return false;
187
+ const minWidth = this.player.options.floatingMinViewportWidth ?? 768;
188
+ if (window.innerWidth < minWidth) return false;
189
+ if (reason === "auto") {
190
+ if (this._autoDismissedThisPlay) return false;
191
+ if (this.player.state.paused) return false;
192
+ if (!this.player.state.hasStartedPlayback) return false;
193
+ }
194
+ return true;
195
+ }
196
+ _claimSingleton() {
197
+ try {
198
+ window.dispatchEvent(new CustomEvent(FLOATING_CLAIM_EVENT, {
199
+ detail: { claimId: this._claimId }
200
+ }));
201
+ } catch {
202
+ }
203
+ }
204
+ _setupClaimListener() {
205
+ this._onClaim = (event) => {
206
+ const detail = event.detail;
207
+ if (!detail || detail.claimId === this._claimId) return;
208
+ if (this.player.state.floating) {
209
+ this.exit("claim");
210
+ }
211
+ };
212
+ window.addEventListener(FLOATING_CLAIM_EVENT, this._onClaim);
213
+ this._onResize = () => {
214
+ const minWidth = this.player.options.floatingMinViewportWidth ?? 768;
215
+ if (this.player.state.floating && window.innerWidth < minWidth) {
216
+ this.exit("auto");
217
+ }
218
+ };
219
+ window.addEventListener("resize", this._onResize);
220
+ }
221
+ _setupFullscreenGuard() {
222
+ this._onEnterFullscreen = () => {
223
+ if (this.player.state.floating) {
224
+ this.exit("manual");
225
+ }
226
+ };
227
+ this.player.on("enterfullscreen", this._onEnterFullscreen);
228
+ }
229
+ _armPlayListenerToClearDismiss() {
230
+ if (this._playListenerAttached) return;
231
+ this._onPlayAfterDismiss = () => {
232
+ this._autoDismissedThisPlay = false;
233
+ if (this._onPlayAfterDismiss) {
234
+ this.player.off("play", this._onPlayAfterDismiss);
235
+ }
236
+ this._playListenerAttached = false;
237
+ this._onPlayAfterDismiss = null;
238
+ };
239
+ this.player.on("play", this._onPlayAfterDismiss);
240
+ this._playListenerAttached = true;
241
+ }
242
+ // ---------------------------------------------------------------
243
+ // Internal: IntersectionObserver for scroll-triggered auto-float
244
+ // ---------------------------------------------------------------
245
+ _startObserving() {
246
+ if (!("IntersectionObserver" in window)) return;
247
+ if (!this.player.container) return;
248
+ this.observerTarget = this.player.container;
249
+ this.intersectionObserver = new IntersectionObserver((entries) => {
250
+ const entry = entries[entries.length - 1];
251
+ if (!entry) return;
252
+ this.lastRatio = entry.intersectionRatio;
253
+ if (this.player.options.debug) {
254
+ try {
255
+ console.log("[vidply:floating] intersection", {
256
+ ratio: Number(entry.intersectionRatio.toFixed(3)),
257
+ state: this.player.state.floating,
258
+ paused: this.player.state.paused,
259
+ hasStartedPlayback: this.player.state.hasStartedPlayback,
260
+ dismissed: this._autoDismissedThisPlay
261
+ });
262
+ } catch {
263
+ }
264
+ }
265
+ if (this.player.state.floating === "auto") {
266
+ if (entry.intersectionRatio > 0.5) {
267
+ this.exit("auto");
268
+ }
269
+ return;
270
+ }
271
+ if (this.player.state.floating === "pinned") {
272
+ return;
273
+ }
274
+ if (entry.intersectionRatio < 0.1 && this._canFloat("auto")) {
275
+ this.enter("auto");
276
+ }
277
+ }, { threshold: [0, 0.1, 0.5, 0.9] });
278
+ this.intersectionObserver.observe(this.observerTarget);
279
+ }
280
+ _retargetObserver(target) {
281
+ if (!this.intersectionObserver) return;
282
+ if (this.observerTarget) {
283
+ try {
284
+ this.intersectionObserver.unobserve(this.observerTarget);
285
+ } catch {
286
+ }
287
+ }
288
+ this.observerTarget = target;
289
+ try {
290
+ this.intersectionObserver.observe(target);
291
+ } catch {
292
+ }
293
+ }
294
+ // ---------------------------------------------------------------
295
+ // Internal: shell DOM
296
+ // ---------------------------------------------------------------
297
+ _ensureShell() {
298
+ if (this.shell) return;
299
+ this.shell = DOMUtils.createElement("div", {
300
+ className: `${this.classPrefix}-floating-shell`,
301
+ attributes: {
302
+ "role": "dialog",
303
+ "aria-modal": "false",
304
+ "aria-label": i18n.t("player.floatingPlayer"),
305
+ "data-vidply-floating": "true",
306
+ "tabindex": "-1"
307
+ }
308
+ });
309
+ this.dragHandle = DOMUtils.createElement("div", {
310
+ className: `${this.classPrefix}-floating-drag-handle`,
311
+ attributes: { "aria-hidden": "true" }
312
+ });
313
+ this.shell.appendChild(this.dragHandle);
314
+ this.closeButton = DOMUtils.createElement("button", {
315
+ className: `${this.classPrefix}-floating-close`,
316
+ attributes: {
317
+ "type": "button",
318
+ "aria-label": i18n.t("player.floatingPlayerClose"),
319
+ "title": i18n.t("player.floatingPlayerClose")
320
+ }
321
+ });
322
+ this.closeButton.appendChild(createIconElement("close"));
323
+ this.closeButton.addEventListener("click", (event) => {
324
+ event.stopPropagation();
325
+ this.dismiss();
326
+ });
327
+ this.shell.appendChild(this.closeButton);
328
+ this._createResizeHandles();
329
+ this.resizeHandles.forEach((handle) => this.shell.appendChild(handle));
330
+ this._onKeyDown = (event) => {
331
+ if (event.key === "Escape") {
332
+ event.stopPropagation();
333
+ this.dismiss();
334
+ }
335
+ };
336
+ this.shell.addEventListener("keydown", this._onKeyDown);
337
+ }
338
+ _createResizeHandles() {
339
+ const dirs = ["n", "s", "e", "w", "ne", "nw", "se", "sw"];
340
+ this.resizeHandles = dirs.map((dir) => DOMUtils.createElement("div", {
341
+ className: `${this.classPrefix}-floating-resize-handle ${this.classPrefix}-floating-resize-${dir}`,
342
+ attributes: {
343
+ "data-direction": dir,
344
+ "data-vidply-managed-resize": "true",
345
+ "aria-hidden": "true"
346
+ }
347
+ }));
348
+ }
349
+ _teardownShell() {
350
+ if (this.draggable) {
351
+ try {
352
+ this.draggable.destroy();
353
+ } catch {
354
+ }
355
+ this.draggable = null;
356
+ }
357
+ if (this.shell) {
358
+ if (this._onKeyDown) {
359
+ this.shell.removeEventListener("keydown", this._onKeyDown);
360
+ this._onKeyDown = null;
361
+ }
362
+ if (this.shell.parentNode) {
363
+ this.shell.parentNode.removeChild(this.shell);
364
+ }
365
+ }
366
+ this.shell = null;
367
+ this.dragHandle = null;
368
+ this.closeButton = null;
369
+ this.resizeHandles = [];
370
+ }
371
+ // ---------------------------------------------------------------
372
+ // Internal: mount / unmount the player.container
373
+ // ---------------------------------------------------------------
374
+ _mountIntoShell() {
375
+ const container = this.player.container;
376
+ if (!container || !container.parentNode) return;
377
+ if (!this.shell) return;
378
+ const rect = container.getBoundingClientRect();
379
+ this.originalParent = container.parentNode;
380
+ this.originalNextSibling = container.nextSibling;
381
+ this.placeholder = DOMUtils.createElement("div", {
382
+ className: `${this.classPrefix}-floating-placeholder`,
383
+ attributes: { "aria-hidden": "true" }
384
+ });
385
+ this.placeholder.style.width = `${Math.max(1, rect.width)}px`;
386
+ this.placeholder.style.height = `${Math.max(1, rect.height)}px`;
387
+ this.originalParent.insertBefore(this.placeholder, container);
388
+ this.shell.appendChild(container);
389
+ document.body.appendChild(this.shell);
390
+ container.classList.add(`${this.classPrefix}-is-floating`);
391
+ this._retargetObserver(this.placeholder);
392
+ }
393
+ _unmountFromShell() {
394
+ const container = this.player.container;
395
+ if (container) {
396
+ container.classList.remove(`${this.classPrefix}-is-floating`);
397
+ container.style.removeProperty("width");
398
+ container.style.removeProperty("height");
399
+ }
400
+ if (this.placeholder && this.placeholder.parentNode) {
401
+ if (container) {
402
+ this.placeholder.parentNode.insertBefore(container, this.placeholder);
403
+ }
404
+ this.placeholder.parentNode.removeChild(this.placeholder);
405
+ } else if (container && this.originalParent) {
406
+ if (this.originalNextSibling && this.originalNextSibling.parentNode === this.originalParent) {
407
+ this.originalParent.insertBefore(container, this.originalNextSibling);
408
+ } else {
409
+ this.originalParent.appendChild(container);
410
+ }
411
+ }
412
+ this.placeholder = null;
413
+ this.originalParent = null;
414
+ this.originalNextSibling = null;
415
+ if (container) {
416
+ this._retargetObserver(container);
417
+ }
418
+ }
419
+ // ---------------------------------------------------------------
420
+ // Internal: initial geometry + drag/resize wiring
421
+ // ---------------------------------------------------------------
422
+ _applyInitialGeometry() {
423
+ if (!this.shell) return;
424
+ const prefs = this.player.storage?.getFloatingPreferences?.() || {};
425
+ const vw = window.innerWidth;
426
+ const vh = window.innerHeight;
427
+ let width = prefs.width && prefs.width >= MIN_WIDTH ? prefs.width : DEFAULT_WIDTH;
428
+ width = Math.min(width, Math.max(MIN_WIDTH, vw - EDGE_MARGIN * 2));
429
+ const containerRect = this.player.container?.getBoundingClientRect();
430
+ const aspect = containerRect && containerRect.height > 0 ? containerRect.width / containerRect.height : 16 / 9;
431
+ const defaultHeight = Math.round(width / aspect);
432
+ let height = prefs.height && prefs.height >= 100 ? prefs.height : defaultHeight;
433
+ height = Math.min(height, Math.max(100, vh - EDGE_MARGIN * 2));
434
+ let left;
435
+ let top;
436
+ if (typeof prefs.left === "number" && typeof prefs.top === "number") {
437
+ left = Math.max(EDGE_MARGIN, Math.min(prefs.left, vw - width - EDGE_MARGIN));
438
+ top = Math.max(EDGE_MARGIN, Math.min(prefs.top, vh - height - EDGE_MARGIN));
439
+ } else {
440
+ const pos = this.player.options.floatingPosition || "bottom-right";
441
+ switch (pos) {
442
+ case "bottom-left":
443
+ left = EDGE_MARGIN;
444
+ top = vh - height - EDGE_MARGIN;
445
+ break;
446
+ case "top-right":
447
+ left = vw - width - EDGE_MARGIN;
448
+ top = EDGE_MARGIN;
449
+ break;
450
+ case "top-left":
451
+ left = EDGE_MARGIN;
452
+ top = EDGE_MARGIN;
453
+ break;
454
+ case "bottom-right":
455
+ default:
456
+ left = vw - width - EDGE_MARGIN;
457
+ top = vh - height - EDGE_MARGIN;
458
+ break;
459
+ }
460
+ }
461
+ this.shell.style.width = `${width}px`;
462
+ this.shell.style.height = `${height}px`;
463
+ this.shell.style.left = `${left}px`;
464
+ this.shell.style.top = `${top}px`;
465
+ this._initDraggable();
466
+ }
467
+ _initDraggable() {
468
+ if (!this.shell) return;
469
+ if (this.draggable) return;
470
+ this.draggable = new DraggableResizable(this.shell, {
471
+ dragHandle: this.dragHandle,
472
+ resizeHandles: this.resizeHandles,
473
+ constrainToViewport: true,
474
+ maintainAspectRatio: true,
475
+ minWidth: MIN_WIDTH,
476
+ minHeight: 100,
477
+ maxWidth: () => Math.max(MIN_WIDTH, window.innerWidth - EDGE_MARGIN * 2),
478
+ maxHeight: () => Math.max(100, window.innerHeight - EDGE_MARGIN * 2),
479
+ classPrefix: `${this.classPrefix}-floating`,
480
+ keyboardDragKey: "d",
481
+ keyboardResizeKey: "r",
482
+ keyboardStep: 10,
483
+ keyboardStepLarge: 50,
484
+ pointerResizeIndicatorText: i18n.t("player.floatingPlayerDialog"),
485
+ onDragEnd: () => this._savePrefs(),
486
+ onResizeEnd: () => this._savePrefs(),
487
+ onDragStart: (event) => {
488
+ const target = event.target;
489
+ if (!target) return true;
490
+ if (target.closest(`.${this.classPrefix}-floating-close`)) return false;
491
+ if (target.closest(`.${this.classPrefix}-controls`)) return false;
492
+ if (target.closest(`.${this.classPrefix}-floating-resize-handle`)) return false;
493
+ return true;
494
+ }
495
+ });
496
+ }
497
+ _savePrefs() {
498
+ if (!this.shell || !this.player.storage?.saveFloatingPreferences) return;
499
+ const rect = this.shell.getBoundingClientRect();
500
+ this.player.storage.saveFloatingPreferences({
501
+ width: Math.round(rect.width),
502
+ height: Math.round(rect.height),
503
+ left: Math.round(rect.left),
504
+ top: Math.round(rect.top)
505
+ });
506
+ }
507
+ _activeElement() {
508
+ const active = document.activeElement;
509
+ return active && active instanceof HTMLElement ? active : null;
510
+ }
511
+ };
512
+ export {
513
+ FloatingPlayerManager
514
+ };
515
+ //# sourceMappingURL=vidply.FloatingPlayerManager-5EA4BYSR.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/core/FloatingPlayerManager.ts"],
4
+ "sourcesContent": ["/**\n * Floating Player Manager\n *\n * Custom in-page Picture-in-Picture. Moves the entire player.container\n * into a position:fixed, draggable and resizable shell that lives outside\n * the document flow (appended to document.body). A transparent placeholder\n * preserves layout and, while floating, serves as the IntersectionObserver\n * sentinel so scroll-based auto-float/redock decisions stay anchored to\n * the original slot.\n *\n * Triggers:\n * - pinned: the user clicks the control-bar PiP button (only when\n * options.floating is true; otherwise the button uses native PiP).\n * Pinned floating ignores scroll-based docking.\n * - auto: the video is playing and the original slot has scrolled out\n * of the viewport. Auto-float redocks automatically when the slot\n * scrolls back in.\n *\n * Close button: pauses playback, exits the floating shell and marks the\n * current play session as dismissed so auto-float will not re-trigger\n * until the user presses play again (matches YouTube miniplayer UX).\n *\n * Only one player is allowed to float at a time across a page; enter()\n * broadcasts a 'vidply:floating-claim' CustomEvent that other managers\n * listen for and auto-exit on.\n */\n\nimport { DOMUtils } from '../utils/DOMUtils.js';\nimport { DraggableResizable } from '../utils/DraggableResizable.js';\nimport { createIconElement } from '../icons/Icons.js';\nimport { i18n } from '../i18n/i18n.js';\nimport type { Player } from './Player.js';\n\ntype FloatingState = 'pinned' | 'auto';\ntype ExitReason = 'manual' | 'auto' | 'dismiss' | 'claim' | 'destroy';\n\nconst FLOATING_CLAIM_EVENT = 'vidply:floating-claim';\nconst DEFAULT_WIDTH = 400;\nconst MIN_WIDTH = 240;\nconst EDGE_MARGIN = 16;\n\ninterface FloatingPrefs {\n width?: number;\n height?: number;\n left?: number;\n top?: number;\n}\n\nexport class FloatingPlayerManager {\n player: Player;\n classPrefix: string;\n\n shell: HTMLElement | null;\n dragHandle: HTMLElement | null;\n closeButton: HTMLButtonElement | null;\n resizeHandles: HTMLElement[];\n placeholder: HTMLElement | null;\n draggable: DraggableResizable | null;\n\n originalParent: HTMLElement | null;\n originalNextSibling: Node | null;\n\n intersectionObserver: IntersectionObserver | null;\n observerTarget: HTMLElement | null;\n lastRatio: number;\n\n _autoDismissedThisPlay: boolean;\n _playListenerAttached: boolean;\n _onPlayAfterDismiss: (() => void) | null;\n _onClaim: ((event: Event) => void) | null;\n _onResize: (() => void) | null;\n _onKeyDown: ((event: KeyboardEvent) => void) | null;\n _onEnterFullscreen: (() => void) | null;\n _destroyed: boolean;\n _triggerFocusEl: HTMLElement | null;\n _claimId: string;\n\n constructor(player: Player) {\n this.player = player;\n this.classPrefix = player.options.classPrefix || 'vidply';\n\n this.shell = null;\n this.dragHandle = null;\n this.closeButton = null;\n this.resizeHandles = [];\n this.placeholder = null;\n this.draggable = null;\n\n this.originalParent = null;\n this.originalNextSibling = null;\n\n this.intersectionObserver = null;\n this.observerTarget = null;\n this.lastRatio = 1;\n\n this._autoDismissedThisPlay = false;\n this._playListenerAttached = false;\n this._onPlayAfterDismiss = null;\n this._onClaim = null;\n this._onResize = null;\n this._onKeyDown = null;\n this._onEnterFullscreen = null;\n this._destroyed = false;\n this._triggerFocusEl = null;\n this._claimId = `floating-${player.instanceId}-${Date.now()}`;\n\n this._setupClaimListener();\n this._setupFullscreenGuard();\n this._startObserving();\n }\n\n // ---------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------\n\n togglePinned(triggerEl?: HTMLElement | null) {\n if (this._destroyed) return;\n if (this.player.state.floating === 'pinned') {\n // Manual unpin: suppress auto-float for the remainder of the\n // current play session so scrolling doesn't immediately re-pop\n // the floating shell. A fresh 'play' event clears the flag.\n this._autoDismissedThisPlay = true;\n this._armPlayListenerToClearDismiss();\n this.exit('manual');\n return;\n }\n // If the user pins while in 'auto' mode, that's an explicit request\n // to float; any previous auto-dismiss flag should be cleared so the\n // pinned state behaves naturally.\n this._autoDismissedThisPlay = false;\n this._triggerFocusEl = triggerEl || this._activeElement();\n this.enter('pinned');\n }\n\n enter(reason: FloatingState) {\n if (this._destroyed) return;\n if (this.player.state.floating === reason) return;\n\n if (!this._canFloat(reason)) {\n return;\n }\n\n // Upgrade 'auto' -> 'pinned' without rebuilding the shell\n if (this.player.state.floating && this.player.state.floating !== reason) {\n this.player.state.floating = reason;\n this.player.emit('floatingchange', reason);\n return;\n }\n\n this._claimSingleton();\n\n this._ensureShell();\n this._mountIntoShell();\n this._applyInitialGeometry();\n\n this.player.state.floating = reason;\n this.player.emit('floatingchange', reason);\n\n // Focus the close button after a microtask so screen readers announce\n // the dialog opening.\n queueMicrotask(() => {\n if (this.closeButton && this.player.state.floating) {\n try { this.closeButton.focus({ preventScroll: true }); } catch { /* ignore */ }\n }\n });\n }\n\n exit(reason: ExitReason = 'manual') {\n if (this._destroyed && reason !== 'destroy') return;\n if (!this.player.state.floating) return;\n\n this._unmountFromShell();\n this._teardownShell();\n\n const priorTrigger = this._triggerFocusEl;\n this._triggerFocusEl = null;\n\n this.player.state.floating = null;\n this.player.emit('floatingchange', null);\n\n // Restore focus to the element that triggered floating (pinned flow).\n // For scroll-based exits we leave focus untouched.\n if ((reason === 'manual' || reason === 'dismiss') && priorTrigger) {\n try { priorTrigger.focus({ preventScroll: true }); } catch { /* ignore */ }\n }\n }\n\n /**\n * Close button: pause, dismiss, and prevent auto-float until the next\n * user-initiated play event.\n */\n dismiss() {\n if (this._destroyed) return;\n this._autoDismissedThisPlay = true;\n this._armPlayListenerToClearDismiss();\n\n try {\n this.player.pause();\n } catch { /* ignore */ }\n\n this.exit('dismiss');\n }\n\n destroy() {\n if (this._destroyed) return;\n this._destroyed = true;\n\n if (this.player.state && this.player.state.floating) {\n try { this.exit('destroy'); } catch { /* ignore */ }\n }\n\n if (this.intersectionObserver) {\n try { this.intersectionObserver.disconnect(); } catch { /* ignore */ }\n this.intersectionObserver = null;\n }\n this.observerTarget = null;\n\n if (this._onClaim) {\n window.removeEventListener(FLOATING_CLAIM_EVENT, this._onClaim as EventListener);\n this._onClaim = null;\n }\n if (this._onResize) {\n window.removeEventListener('resize', this._onResize);\n this._onResize = null;\n }\n if (this._onEnterFullscreen) {\n this.player.off('enterfullscreen', this._onEnterFullscreen as any);\n this._onEnterFullscreen = null;\n }\n if (this._onPlayAfterDismiss && this._playListenerAttached) {\n this.player.off('play', this._onPlayAfterDismiss as any);\n this._playListenerAttached = false;\n this._onPlayAfterDismiss = null;\n }\n }\n\n // ---------------------------------------------------------------\n // Internal: guards\n // ---------------------------------------------------------------\n\n _canFloat(reason: FloatingState): boolean {\n if (!this.player.options.floating) return false;\n if (!this.player.container) return false;\n if (!this.player.element || this.player.element.tagName !== 'VIDEO') return false;\n if (this.player.state.fullscreen) return false;\n\n // Playlist players move through multiple tracks and manage their own\n // UI; floating support for playlists is out of scope for this v1.\n if (this.player.playlistManager) return false;\n\n const minWidth = this.player.options.floatingMinViewportWidth ?? 768;\n if (window.innerWidth < minWidth) return false;\n\n // Auto-float only engages when the user is actively watching.\n if (reason === 'auto') {\n if (this._autoDismissedThisPlay) return false;\n if (this.player.state.paused) return false;\n // Never auto-float before the user has started playback; stops\n // auto-entry from firing while the page is still below the fold\n // on initial load.\n if (!this.player.state.hasStartedPlayback) return false;\n }\n\n return true;\n }\n\n _claimSingleton() {\n try {\n window.dispatchEvent(new CustomEvent(FLOATING_CLAIM_EVENT, {\n detail: { claimId: this._claimId }\n }));\n } catch { /* ignore (older browsers) */ }\n }\n\n _setupClaimListener() {\n this._onClaim = (event: Event) => {\n const detail = (event as CustomEvent).detail;\n if (!detail || detail.claimId === this._claimId) return;\n if (this.player.state.floating) {\n this.exit('claim');\n }\n };\n window.addEventListener(FLOATING_CLAIM_EVENT, this._onClaim as EventListener);\n\n this._onResize = () => {\n const minWidth = this.player.options.floatingMinViewportWidth ?? 768;\n if (this.player.state.floating && window.innerWidth < minWidth) {\n this.exit('auto');\n }\n };\n window.addEventListener('resize', this._onResize);\n }\n\n _setupFullscreenGuard() {\n this._onEnterFullscreen = () => {\n if (this.player.state.floating) {\n this.exit('manual');\n }\n };\n this.player.on('enterfullscreen', this._onEnterFullscreen as any);\n }\n\n _armPlayListenerToClearDismiss() {\n if (this._playListenerAttached) return;\n this._onPlayAfterDismiss = () => {\n this._autoDismissedThisPlay = false;\n if (this._onPlayAfterDismiss) {\n this.player.off('play', this._onPlayAfterDismiss as any);\n }\n this._playListenerAttached = false;\n this._onPlayAfterDismiss = null;\n };\n this.player.on('play', this._onPlayAfterDismiss as any);\n this._playListenerAttached = true;\n }\n\n // ---------------------------------------------------------------\n // Internal: IntersectionObserver for scroll-triggered auto-float\n // ---------------------------------------------------------------\n\n _startObserving() {\n if (!('IntersectionObserver' in window)) return;\n if (!this.player.container) return;\n\n this.observerTarget = this.player.container;\n this.intersectionObserver = new IntersectionObserver((entries) => {\n const entry = entries[entries.length - 1];\n if (!entry) return;\n this.lastRatio = entry.intersectionRatio;\n\n if (this.player.options.debug) {\n try {\n console.log('[vidply:floating] intersection', {\n ratio: Number(entry.intersectionRatio.toFixed(3)),\n state: this.player.state.floating,\n paused: this.player.state.paused,\n hasStartedPlayback: this.player.state.hasStartedPlayback,\n dismissed: this._autoDismissedThisPlay\n });\n } catch { /* ignore */ }\n }\n\n if (this.player.state.floating === 'auto') {\n if (entry.intersectionRatio > 0.5) {\n this.exit('auto');\n }\n return;\n }\n\n // Pinned state: scroll is a no-op, the user has taken control.\n if (this.player.state.floating === 'pinned') {\n return;\n }\n\n if (entry.intersectionRatio < 0.1 && this._canFloat('auto')) {\n this.enter('auto');\n }\n }, { threshold: [0, 0.1, 0.5, 0.9] });\n\n this.intersectionObserver.observe(this.observerTarget);\n }\n\n _retargetObserver(target: HTMLElement) {\n if (!this.intersectionObserver) return;\n if (this.observerTarget) {\n try { this.intersectionObserver.unobserve(this.observerTarget); } catch { /* ignore */ }\n }\n this.observerTarget = target;\n try { this.intersectionObserver.observe(target); } catch { /* ignore */ }\n }\n\n // ---------------------------------------------------------------\n // Internal: shell DOM\n // ---------------------------------------------------------------\n\n _ensureShell() {\n if (this.shell) return;\n\n this.shell = DOMUtils.createElement('div', {\n className: `${this.classPrefix}-floating-shell`,\n attributes: {\n 'role': 'dialog',\n 'aria-modal': 'false',\n 'aria-label': i18n.t('player.floatingPlayer'),\n 'data-vidply-floating': 'true',\n 'tabindex': '-1'\n }\n });\n\n this.dragHandle = DOMUtils.createElement('div', {\n className: `${this.classPrefix}-floating-drag-handle`,\n attributes: { 'aria-hidden': 'true' }\n });\n this.shell.appendChild(this.dragHandle);\n\n this.closeButton = DOMUtils.createElement('button', {\n className: `${this.classPrefix}-floating-close`,\n attributes: {\n 'type': 'button',\n 'aria-label': i18n.t('player.floatingPlayerClose'),\n 'title': i18n.t('player.floatingPlayerClose')\n }\n }) as HTMLButtonElement;\n this.closeButton.appendChild(createIconElement('close'));\n this.closeButton.addEventListener('click', (event) => {\n event.stopPropagation();\n this.dismiss();\n });\n this.shell.appendChild(this.closeButton);\n\n this._createResizeHandles();\n this.resizeHandles.forEach(handle => this.shell!.appendChild(handle));\n\n this._onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n this.dismiss();\n }\n };\n this.shell.addEventListener('keydown', this._onKeyDown as EventListener);\n }\n\n _createResizeHandles() {\n const dirs = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\n this.resizeHandles = dirs.map(dir => DOMUtils.createElement('div', {\n className: `${this.classPrefix}-floating-resize-handle ${this.classPrefix}-floating-resize-${dir}`,\n attributes: {\n 'data-direction': dir,\n 'data-vidply-managed-resize': 'true',\n 'aria-hidden': 'true'\n }\n }));\n }\n\n _teardownShell() {\n if (this.draggable) {\n try { this.draggable.destroy(); } catch { /* ignore */ }\n this.draggable = null;\n }\n if (this.shell) {\n if (this._onKeyDown) {\n this.shell.removeEventListener('keydown', this._onKeyDown as EventListener);\n this._onKeyDown = null;\n }\n if (this.shell.parentNode) {\n this.shell.parentNode.removeChild(this.shell);\n }\n }\n this.shell = null;\n this.dragHandle = null;\n this.closeButton = null;\n this.resizeHandles = [];\n }\n\n // ---------------------------------------------------------------\n // Internal: mount / unmount the player.container\n // ---------------------------------------------------------------\n\n _mountIntoShell() {\n const container = this.player.container;\n if (!container || !container.parentNode) return;\n if (!this.shell) return;\n\n const rect = container.getBoundingClientRect();\n this.originalParent = container.parentNode as HTMLElement;\n this.originalNextSibling = container.nextSibling;\n\n this.placeholder = DOMUtils.createElement('div', {\n className: `${this.classPrefix}-floating-placeholder`,\n attributes: { 'aria-hidden': 'true' }\n });\n this.placeholder.style.width = `${Math.max(1, rect.width)}px`;\n this.placeholder.style.height = `${Math.max(1, rect.height)}px`;\n\n this.originalParent.insertBefore(this.placeholder, container);\n\n this.shell.appendChild(container);\n document.body.appendChild(this.shell);\n\n container.classList.add(`${this.classPrefix}-is-floating`);\n\n // Observe the placeholder while floating so scroll-back decisions are\n // anchored to the original slot instead of the moved container.\n this._retargetObserver(this.placeholder);\n }\n\n _unmountFromShell() {\n const container = this.player.container;\n\n if (container) {\n container.classList.remove(`${this.classPrefix}-is-floating`);\n // Clear inline sizes applied while floating\n container.style.removeProperty('width');\n container.style.removeProperty('height');\n }\n\n if (this.placeholder && this.placeholder.parentNode) {\n if (container) {\n this.placeholder.parentNode.insertBefore(container, this.placeholder);\n }\n this.placeholder.parentNode.removeChild(this.placeholder);\n } else if (container && this.originalParent) {\n if (this.originalNextSibling && this.originalNextSibling.parentNode === this.originalParent) {\n this.originalParent.insertBefore(container, this.originalNextSibling);\n } else {\n this.originalParent.appendChild(container);\n }\n }\n\n this.placeholder = null;\n this.originalParent = null;\n this.originalNextSibling = null;\n\n // Retarget the observer to the docked container\n if (container) {\n this._retargetObserver(container);\n }\n }\n\n // ---------------------------------------------------------------\n // Internal: initial geometry + drag/resize wiring\n // ---------------------------------------------------------------\n\n _applyInitialGeometry() {\n if (!this.shell) return;\n\n const prefs = (this.player.storage?.getFloatingPreferences?.() || {}) as FloatingPrefs;\n\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n let width = prefs.width && prefs.width >= MIN_WIDTH ? prefs.width : DEFAULT_WIDTH;\n width = Math.min(width, Math.max(MIN_WIDTH, vw - EDGE_MARGIN * 2));\n\n // If we know the source container's aspect ratio, match it by default.\n const containerRect = this.player.container?.getBoundingClientRect();\n const aspect = containerRect && containerRect.height > 0\n ? containerRect.width / containerRect.height\n : 16 / 9;\n const defaultHeight = Math.round(width / aspect);\n let height = prefs.height && prefs.height >= 100 ? prefs.height : defaultHeight;\n height = Math.min(height, Math.max(100, vh - EDGE_MARGIN * 2));\n\n let left: number;\n let top: number;\n\n if (typeof prefs.left === 'number' && typeof prefs.top === 'number') {\n left = Math.max(EDGE_MARGIN, Math.min(prefs.left, vw - width - EDGE_MARGIN));\n top = Math.max(EDGE_MARGIN, Math.min(prefs.top, vh - height - EDGE_MARGIN));\n } else {\n const pos = this.player.options.floatingPosition || 'bottom-right';\n switch (pos) {\n case 'bottom-left':\n left = EDGE_MARGIN;\n top = vh - height - EDGE_MARGIN;\n break;\n case 'top-right':\n left = vw - width - EDGE_MARGIN;\n top = EDGE_MARGIN;\n break;\n case 'top-left':\n left = EDGE_MARGIN;\n top = EDGE_MARGIN;\n break;\n case 'bottom-right':\n default:\n left = vw - width - EDGE_MARGIN;\n top = vh - height - EDGE_MARGIN;\n break;\n }\n }\n\n this.shell.style.width = `${width}px`;\n this.shell.style.height = `${height}px`;\n this.shell.style.left = `${left}px`;\n this.shell.style.top = `${top}px`;\n\n this._initDraggable();\n }\n\n _initDraggable() {\n if (!this.shell) return;\n if (this.draggable) return;\n\n this.draggable = new DraggableResizable(this.shell, {\n dragHandle: this.dragHandle,\n resizeHandles: this.resizeHandles,\n constrainToViewport: true,\n maintainAspectRatio: true,\n minWidth: MIN_WIDTH,\n minHeight: 100,\n maxWidth: () => Math.max(MIN_WIDTH, window.innerWidth - EDGE_MARGIN * 2),\n maxHeight: () => Math.max(100, window.innerHeight - EDGE_MARGIN * 2),\n classPrefix: `${this.classPrefix}-floating`,\n keyboardDragKey: 'd',\n keyboardResizeKey: 'r',\n keyboardStep: 10,\n keyboardStepLarge: 50,\n pointerResizeIndicatorText: i18n.t('player.floatingPlayerDialog'),\n onDragEnd: () => this._savePrefs(),\n onResizeEnd: () => this._savePrefs(),\n onDragStart: (event: Event) => {\n const target = event.target as HTMLElement;\n if (!target) return true;\n // Don't start drag when interacting with the close button or\n // with any control inside the embedded player (play/pause,\n // captions menu, etc.).\n if (target.closest(`.${this.classPrefix}-floating-close`)) return false;\n if (target.closest(`.${this.classPrefix}-controls`)) return false;\n if (target.closest(`.${this.classPrefix}-floating-resize-handle`)) return false;\n return true;\n }\n });\n }\n\n _savePrefs() {\n if (!this.shell || !this.player.storage?.saveFloatingPreferences) return;\n const rect = this.shell.getBoundingClientRect();\n this.player.storage.saveFloatingPreferences({\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n left: Math.round(rect.left),\n top: Math.round(rect.top)\n });\n }\n\n _activeElement(): HTMLElement | null {\n const active = document.activeElement;\n return active && active instanceof HTMLElement ? active : null;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -4,18 +4,20 @@
4
4
  * Released under GPL-2.0-or-later License
5
5
  */
6
6
  import {
7
- DraggableResizable,
8
7
  attachMenuKeyboardNavigation,
9
- createIconElement,
10
8
  createLabeledSelect,
11
9
  createMenuItem,
12
10
  focusFirstMenuItem,
13
11
  preventDragOnElement
14
- } from "./vidply.chunk-37V7VOIQ.js";
12
+ } from "./vidply.chunk-COW6OPNQ.js";
13
+ import {
14
+ DraggableResizable,
15
+ createIconElement
16
+ } from "./vidply.chunk-D6GBU4V6.js";
15
17
  import {
16
18
  DOMUtils,
17
19
  i18n
18
- } from "./vidply.chunk-VLF6H5PZ.js";
20
+ } from "./vidply.chunk-FDUUJHK6.js";
19
21
 
20
22
  // src/core/SignLanguageManager.ts
21
23
  var SignLanguageManager = class {
@@ -1245,4 +1247,4 @@ var SignLanguageManager = class {
1245
1247
  export {
1246
1248
  SignLanguageManager
1247
1249
  };
1248
- //# sourceMappingURL=vidply.SignLanguageManager-OOZLX2GI.js.map
1250
+ //# sourceMappingURL=vidply.SignLanguageManager-4NOFV4EZ.js.map