vidply 1.0.33 → 1.0.35

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 (64) hide show
  1. package/dist/dev/{vidply.HLSRenderer-LIFBU6UD.js → vidply.HLSRenderer-YGWCAICA.js} +3 -3
  2. package/dist/dev/{vidply.HTML5Renderer-YWMVYWFS.js → vidply.HTML5Renderer-PMNFHAKW.js} +3 -3
  3. package/dist/dev/{vidply.SoundCloudRenderer-CD7VJKNS.js → vidply.SoundCloudRenderer-HCMKXHSX.js} +2 -4
  4. package/dist/dev/vidply.SoundCloudRenderer-HCMKXHSX.js.map +7 -0
  5. package/dist/dev/{vidply.TranscriptManager-R7NJRU7E.js → vidply.TranscriptManager-EIIN5YOF.js} +3 -3
  6. package/dist/dev/{vidply.VimeoRenderer-VPH4RNES.js → vidply.VimeoRenderer-SLEBCZTT.js} +2 -3
  7. package/dist/dev/vidply.VimeoRenderer-SLEBCZTT.js.map +7 -0
  8. package/dist/dev/{vidply.YouTubeRenderer-6MGKEFTZ.js → vidply.YouTubeRenderer-E6F4UGVF.js} +2 -3
  9. package/dist/dev/vidply.YouTubeRenderer-E6F4UGVF.js.map +7 -0
  10. package/dist/dev/{vidply.chunk-PMRKJBGH.js → vidply.chunk-AXXU22HR.js} +92 -15
  11. package/dist/dev/{vidply.chunk-PMRKJBGH.js.map → vidply.chunk-AXXU22HR.js.map} +2 -2
  12. package/dist/dev/{vidply.chunk-UVO24MXU.js → vidply.chunk-IIN4G4UQ.js} +2 -2
  13. package/dist/dev/{vidply.de-CEGBLV67.js → vidply.de-YBEYEXBL.js} +2 -2
  14. package/dist/dev/{vidply.es-2QCQKZ4U.js → vidply.es-QA4YSA5S.js} +2 -2
  15. package/dist/dev/vidply.esm.js +56 -68
  16. package/dist/dev/vidply.esm.js.map +2 -2
  17. package/dist/dev/{vidply.fr-FJAZRL4L.js → vidply.fr-LAM3XJZI.js} +2 -2
  18. package/dist/dev/{vidply.ja-2XQOW53T.js → vidply.ja-FTBFZD66.js} +2 -2
  19. package/dist/legacy/vidply.js +142 -74
  20. package/dist/legacy/vidply.js.map +3 -3
  21. package/dist/legacy/vidply.min.js +2 -2
  22. package/dist/legacy/vidply.min.meta.json +20 -20
  23. package/dist/prod/{vidply.HLSRenderer-ESR6NAMI.min.js → vidply.HLSRenderer-D2KTBEEI.min.js} +2 -2
  24. package/dist/prod/{vidply.HTML5Renderer-6ROXQSQY.min.js → vidply.HTML5Renderer-ZSV6PDOH.min.js} +2 -2
  25. package/dist/prod/vidply.SoundCloudRenderer-D2FNOEG6.min.js +6 -0
  26. package/dist/prod/{vidply.TranscriptManager-B65LKXGG.min.js → vidply.TranscriptManager-VXCTCJ7X.min.js} +2 -2
  27. package/dist/prod/vidply.VimeoRenderer-QELFZVDU.min.js +6 -0
  28. package/dist/prod/vidply.YouTubeRenderer-ZL6YUHTF.min.js +6 -0
  29. package/dist/prod/{vidply.chunk-7HVHEUHH.min.js → vidply.chunk-SQVOYVKH.min.js} +1 -1
  30. package/dist/prod/{vidply.chunk-IQKD4GUB.min.js → vidply.chunk-Z6BHMOGK.min.js} +2 -2
  31. package/dist/prod/{vidply.de-IHKC573T.min.js → vidply.de-WCUZUF3T.min.js} +1 -1
  32. package/dist/prod/{vidply.es-3IJCQLJ7.min.js → vidply.es-54CIIDMO.min.js} +1 -1
  33. package/dist/prod/vidply.esm.min.js +4 -4
  34. package/dist/prod/{vidply.fr-NC4VEAPH.min.js → vidply.fr-7FYGFFK2.min.js} +1 -1
  35. package/dist/prod/{vidply.ja-4ZC6ZQLV.min.js → vidply.ja-E4UTAURP.min.js} +1 -1
  36. package/dist/vidply.css +219 -109
  37. package/dist/vidply.esm.min.meta.json +50 -50
  38. package/dist/vidply.min.css +2 -2
  39. package/package.json +3 -3
  40. package/src/controls/ControlBar.js +3 -0
  41. package/src/controls/KeyboardManager.js +19 -0
  42. package/src/core/Player.js +1 -64
  43. package/src/core/SignLanguageManager.js +18 -4
  44. package/src/features/PlaylistManager.js +31 -19
  45. package/src/index.js +3 -1
  46. package/src/renderers/SoundCloudRenderer.js +0 -2
  47. package/src/renderers/VimeoRenderer.js +0 -1
  48. package/src/renderers/YouTubeRenderer.js +0 -1
  49. package/src/styles/vidply.css +218 -108
  50. package/src/utils/DraggableResizable.js +123 -12
  51. package/dist/dev/vidply.SoundCloudRenderer-CD7VJKNS.js.map +0 -7
  52. package/dist/dev/vidply.VimeoRenderer-VPH4RNES.js.map +0 -7
  53. package/dist/dev/vidply.YouTubeRenderer-6MGKEFTZ.js.map +0 -7
  54. package/dist/prod/vidply.SoundCloudRenderer-MOR2CUFH.min.js +0 -6
  55. package/dist/prod/vidply.VimeoRenderer-3HBMM2WR.min.js +0 -6
  56. package/dist/prod/vidply.YouTubeRenderer-MFC2GMAC.min.js +0 -6
  57. /package/dist/dev/{vidply.HLSRenderer-LIFBU6UD.js.map → vidply.HLSRenderer-YGWCAICA.js.map} +0 -0
  58. /package/dist/dev/{vidply.HTML5Renderer-YWMVYWFS.js.map → vidply.HTML5Renderer-PMNFHAKW.js.map} +0 -0
  59. /package/dist/dev/{vidply.TranscriptManager-R7NJRU7E.js.map → vidply.TranscriptManager-EIIN5YOF.js.map} +0 -0
  60. /package/dist/dev/{vidply.chunk-UVO24MXU.js.map → vidply.chunk-IIN4G4UQ.js.map} +0 -0
  61. /package/dist/dev/{vidply.de-CEGBLV67.js.map → vidply.de-YBEYEXBL.js.map} +0 -0
  62. /package/dist/dev/{vidply.es-2QCQKZ4U.js.map → vidply.es-QA4YSA5S.js.map} +0 -0
  63. /package/dist/dev/{vidply.fr-FJAZRL4L.js.map → vidply.fr-LAM3XJZI.js.map} +0 -0
  64. /package/dist/dev/{vidply.ja-2XQOW53T.js.map → vidply.ja-FTBFZD66.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * Universal, Accessible Video Player
3
- * (c) 2025 Matthias Peltzer
3
+ * (c) 2026 Matthias Peltzer
4
4
  * Released under GPL-2.0-or-later License
5
5
  */
6
6
 
@@ -278,4 +278,4 @@ var HTML5Renderer = class {
278
278
  export {
279
279
  HTML5Renderer
280
280
  };
281
- //# sourceMappingURL=vidply.chunk-UVO24MXU.js.map
281
+ //# sourceMappingURL=vidply.chunk-IIN4G4UQ.js.map
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * Universal, Accessible Video Player
3
- * (c) 2025 Matthias Peltzer
3
+ * (c) 2026 Matthias Peltzer
4
4
  * Released under GPL-2.0-or-later License
5
5
  */
6
6
 
@@ -188,4 +188,4 @@ var de = {
188
188
  export {
189
189
  de
190
190
  };
191
- //# sourceMappingURL=vidply.de-CEGBLV67.js.map
191
+ //# sourceMappingURL=vidply.de-YBEYEXBL.js.map
@@ -1,6 +1,6 @@
1
1
  /*!
2
2
  * Universal, Accessible Video Player
3
- * (c) 2025 Matthias Peltzer
3
+ * (c) 2026 Matthias Peltzer
4
4
  * Released under GPL-2.0-or-later License
5
5
  */
6
6
 
@@ -185,4 +185,4 @@ var es = {
185
185
  export {
186
186
  es
187
187
  };
188
- //# sourceMappingURL=vidply.es-2QCQKZ4U.js.map
188
+ //# sourceMappingURL=vidply.es-QA4YSA5S.js.map
@@ -1,11 +1,11 @@
1
1
  /*!
2
2
  * Universal, Accessible Video Player
3
- * (c) 2025 Matthias Peltzer
3
+ * (c) 2026 Matthias Peltzer
4
4
  * Released under GPL-2.0-or-later License
5
5
  */
6
6
  import {
7
7
  HTML5Renderer
8
- } from "./vidply.chunk-UVO24MXU.js";
8
+ } from "./vidply.chunk-IIN4G4UQ.js";
9
9
  import {
10
10
  DOMUtils,
11
11
  DraggableResizable,
@@ -21,7 +21,7 @@ import {
21
21
  focusFirstMenuItem,
22
22
  i18n,
23
23
  preventDragOnElement
24
- } from "./vidply.chunk-PMRKJBGH.js";
24
+ } from "./vidply.chunk-AXXU22HR.js";
25
25
 
26
26
  // src/utils/EventEmitter.js
27
27
  var EventEmitter = class {
@@ -271,6 +271,7 @@ var ControlBar = class {
271
271
  }
272
272
  if (menuRect.top < 10) {
273
273
  menu.style.top = "10px";
274
+ menu.style.bottom = "auto";
274
275
  }
275
276
  if (menuRect.bottom > viewportHeight - 10) {
276
277
  menu.style.bottom = "10px";
@@ -3235,6 +3236,20 @@ var KeyboardManager = class {
3235
3236
  if (playlistButton) {
3236
3237
  return;
3237
3238
  }
3239
+ const signWrapper = activeElement.closest(".vidply-sign-language-wrapper");
3240
+ if (signWrapper) {
3241
+ const draggable = this.player.signLanguageManager?.draggable;
3242
+ if (draggable?.keyboardDragMode || draggable?.keyboardResizeMode) {
3243
+ return;
3244
+ }
3245
+ }
3246
+ const transcriptWindow = activeElement.closest(".vidply-transcript-window");
3247
+ if (transcriptWindow) {
3248
+ const draggable = this.player.transcriptManager?.draggableResizable;
3249
+ if (draggable?.keyboardDragMode || draggable?.keyboardResizeMode) {
3250
+ return;
3251
+ }
3252
+ }
3238
3253
  }
3239
3254
  const key = e.key;
3240
3255
  let handled = false;
@@ -4298,7 +4313,7 @@ var SignLanguageManager = class {
4298
4313
  _setupInteraction() {
4299
4314
  const isMobile2 = window.innerWidth < 768;
4300
4315
  const isFullscreen = this.player.state.fullscreen;
4301
- if (isMobile2 && !isFullscreen) {
4316
+ if (isMobile2 && !isFullscreen && this.player?.options?.signLanguageDragOnMobile === false) {
4302
4317
  if (this.draggable) {
4303
4318
  this.draggable.destroy();
4304
4319
  this.draggable = null;
@@ -4308,7 +4323,9 @@ var SignLanguageManager = class {
4308
4323
  if (this.draggable) return;
4309
4324
  const classPrefix = this.player.options.classPrefix;
4310
4325
  this.draggable = new DraggableResizable(this.wrapper, {
4311
- dragHandle: this.header,
4326
+ // Allow dragging from anywhere on the sign-language window (better for touch).
4327
+ // We still block dragging when interacting with controls via `onDragStart` below.
4328
+ dragHandle: this.wrapper,
4312
4329
  resizeHandles: this.resizeHandles,
4313
4330
  constrainToViewport: true,
4314
4331
  maintainAspectRatio: true,
@@ -4557,9 +4574,15 @@ var SignLanguageManager = class {
4557
4574
  hasTextClass: true,
4558
4575
  onClick: () => {
4559
4576
  this.toggleKeyboardDragMode();
4560
- this.hideSettingsMenu();
4577
+ this.hideSettingsMenu({ focusButton: false });
4578
+ if (this.draggable?.keyboardDragMode) {
4579
+ setTimeout(() => {
4580
+ this.wrapper?.focus?.({ preventScroll: true });
4581
+ }, 20);
4582
+ }
4561
4583
  }
4562
4584
  });
4585
+ dragOption.setAttribute("data-setting", "keyboard-drag");
4563
4586
  dragOption.setAttribute("role", "switch");
4564
4587
  dragOption.setAttribute("aria-checked", "false");
4565
4588
  this._removeTooltipFromMenuItem(dragOption);
@@ -5251,7 +5274,7 @@ var Player = class _Player extends EventEmitter {
5251
5274
  if (!this.options.transcript && !this.options.transcriptButton) {
5252
5275
  return null;
5253
5276
  }
5254
- const module = await import("./vidply.TranscriptManager-R7NJRU7E.js");
5277
+ const module = await import("./vidply.TranscriptManager-EIIN5YOF.js");
5255
5278
  const Manager = module.TranscriptManager || module.default;
5256
5279
  if (!Manager) {
5257
5280
  return null;
@@ -5335,23 +5358,9 @@ var Player = class _Player extends EventEmitter {
5335
5358
  if (this.options.height) {
5336
5359
  this.container.style.height = typeof this.options.height === "number" ? `${this.options.height}px` : this.options.height;
5337
5360
  }
5338
- if (this.element.tagName === "VIDEO" && !this.options.height) {
5339
- const wAttr = parseInt(this.element.getAttribute("width") || "", 10);
5340
- const hAttr = parseInt(this.element.getAttribute("height") || "", 10);
5341
- if (Number.isFinite(wAttr) && Number.isFinite(hAttr) && wAttr > 0 && hAttr > 0) {
5342
- if (!this.container.style.aspectRatio) {
5343
- this.container.style.aspectRatio = `${wAttr} / ${hAttr}`;
5344
- }
5345
- if (this.videoWrapper && !this.videoWrapper.style.aspectRatio) {
5346
- this.videoWrapper.style.aspectRatio = `${wAttr} / ${hAttr}`;
5347
- this.videoWrapper.style.height = "auto";
5348
- }
5349
- }
5350
- }
5351
5361
  if (this.options.poster && this.element.tagName === "VIDEO") {
5352
5362
  const resolvedPoster = this.resolvePosterPath(this.options.poster);
5353
5363
  this.element.poster = resolvedPoster;
5354
- this.applyPosterAspectRatio(resolvedPoster);
5355
5364
  }
5356
5365
  if (this.element.tagName === "VIDEO") {
5357
5366
  this.createPlayButtonOverlay();
@@ -5379,34 +5388,6 @@ var Player = class _Player extends EventEmitter {
5379
5388
  }
5380
5389
  }, { once: true });
5381
5390
  }
5382
- /**
5383
- * Apply aspect ratio to the video wrapper based on the poster's intrinsic size.
5384
- * This helps render correct poster sizing before media metadata is available.
5385
- */
5386
- applyPosterAspectRatio(posterUrl) {
5387
- try {
5388
- if (!posterUrl) return;
5389
- if (this.element.tagName !== "VIDEO") return;
5390
- if (!this.videoWrapper) return;
5391
- if (this.options.width || this.options.height) return;
5392
- if (this._posterAspectAppliedFor === posterUrl) return;
5393
- this._posterAspectAppliedFor = posterUrl;
5394
- const img = new Image();
5395
- img.decoding = "async";
5396
- img.onload = () => {
5397
- const w = img.naturalWidth;
5398
- const h = img.naturalHeight;
5399
- if (!w || !h) return;
5400
- this.videoWrapper.style.aspectRatio = `${w} / ${h}`;
5401
- this.videoWrapper.style.height = "auto";
5402
- if (this.container && !this.container.style.aspectRatio) {
5403
- this.container.style.aspectRatio = `${w} / ${h}`;
5404
- }
5405
- };
5406
- img.src = posterUrl;
5407
- } catch (e) {
5408
- }
5409
- }
5410
5391
  createPlayButtonOverlay() {
5411
5392
  this.playButtonOverlay = createPlayOverlay();
5412
5393
  this.playButtonOverlay.addEventListener("click", () => {
@@ -5468,16 +5449,16 @@ var Player = class _Player extends EventEmitter {
5468
5449
  }
5469
5450
  let rendererClass = HTML5Renderer;
5470
5451
  if (src.includes("youtube.com") || src.includes("youtu.be")) {
5471
- const module = await import("./vidply.YouTubeRenderer-6MGKEFTZ.js");
5452
+ const module = await import("./vidply.YouTubeRenderer-E6F4UGVF.js");
5472
5453
  rendererClass = module.YouTubeRenderer || module.default;
5473
5454
  } else if (src.includes("vimeo.com")) {
5474
- const module = await import("./vidply.VimeoRenderer-VPH4RNES.js");
5455
+ const module = await import("./vidply.VimeoRenderer-SLEBCZTT.js");
5475
5456
  rendererClass = module.VimeoRenderer || module.default;
5476
5457
  } else if (src.includes(".m3u8")) {
5477
- const module = await import("./vidply.HLSRenderer-LIFBU6UD.js");
5458
+ const module = await import("./vidply.HLSRenderer-YGWCAICA.js");
5478
5459
  rendererClass = module.HLSRenderer || module.default;
5479
5460
  } else if (src.includes("soundcloud.com") || src.includes("api.soundcloud.com")) {
5480
- const module = await import("./vidply.SoundCloudRenderer-CD7VJKNS.js");
5461
+ const module = await import("./vidply.SoundCloudRenderer-HCMKXHSX.js");
5481
5462
  rendererClass = module.SoundCloudRenderer || module.default;
5482
5463
  }
5483
5464
  this.log(`Using ${rendererClass?.name || "HTML5Renderer"} renderer`);
@@ -9244,21 +9225,6 @@ var PlaylistManager = class {
9244
9225
  console.warn("VidPly Playlist: No container found");
9245
9226
  return;
9246
9227
  }
9247
- if (this.player.element.tagName === "AUDIO") {
9248
- this.trackArtworkElement = DOMUtils.createElement("div", {
9249
- className: "vidply-track-artwork",
9250
- attributes: {
9251
- "aria-hidden": "true"
9252
- }
9253
- });
9254
- this.trackArtworkElement.style.display = "none";
9255
- const videoWrapper = this.container.querySelector(".vidply-video-wrapper");
9256
- if (videoWrapper) {
9257
- this.container.insertBefore(this.trackArtworkElement, videoWrapper);
9258
- } else {
9259
- this.container.appendChild(this.trackArtworkElement);
9260
- }
9261
- }
9262
9228
  this.trackInfoElement = DOMUtils.createElement("div", {
9263
9229
  className: "vidply-track-info",
9264
9230
  attributes: {
@@ -9331,6 +9297,27 @@ var PlaylistManager = class {
9331
9297
  * Update track artwork display (for audio playlists)
9332
9298
  */
9333
9299
  updateTrackArtwork(track) {
9300
+ if (this.player?.element?.tagName !== "AUDIO") {
9301
+ if (this.trackArtworkElement) {
9302
+ this.trackArtworkElement.style.display = "none";
9303
+ }
9304
+ return;
9305
+ }
9306
+ if (!this.trackArtworkElement && this.container) {
9307
+ this.trackArtworkElement = DOMUtils.createElement("div", {
9308
+ className: "vidply-track-artwork",
9309
+ attributes: {
9310
+ "aria-hidden": "true"
9311
+ }
9312
+ });
9313
+ this.trackArtworkElement.style.display = "none";
9314
+ const videoWrapper = this.container.querySelector(".vidply-video-wrapper");
9315
+ if (videoWrapper) {
9316
+ this.container.insertBefore(this.trackArtworkElement, videoWrapper);
9317
+ } else {
9318
+ this.container.appendChild(this.trackArtworkElement);
9319
+ }
9320
+ }
9334
9321
  if (!this.trackArtworkElement) return;
9335
9322
  if (track.poster) {
9336
9323
  this.trackArtworkElement.style.backgroundImage = `url(${track.poster})`;
@@ -9803,6 +9790,7 @@ function parseDataAttributes(dataset) {
9803
9790
  "responsive": "responsive",
9804
9791
  "pipButton": "pipButton",
9805
9792
  "fullscreenButton": "fullscreenButton"
9793
+ // Layout
9806
9794
  };
9807
9795
  Object.keys(attributeMap).forEach((dataKey) => {
9808
9796
  const optionKey = attributeMap[dataKey];