vidply 1.0.24 → 1.0.25

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 (53) hide show
  1. package/dist/dev/vidply.HLSRenderer-PNP5OPES.js +255 -0
  2. package/dist/dev/vidply.HLSRenderer-PNP5OPES.js.map +7 -0
  3. package/dist/dev/vidply.HTML5Renderer-LXQ3I45Q.js +12 -0
  4. package/dist/dev/vidply.HTML5Renderer-LXQ3I45Q.js.map +7 -0
  5. package/dist/dev/vidply.TranscriptManager-GZKY44ON.js +1744 -0
  6. package/dist/dev/vidply.TranscriptManager-GZKY44ON.js.map +7 -0
  7. package/dist/dev/vidply.VimeoRenderer-DCETT5IZ.js +213 -0
  8. package/dist/dev/vidply.VimeoRenderer-DCETT5IZ.js.map +7 -0
  9. package/dist/dev/vidply.YouTubeRenderer-QLMMD757.js +227 -0
  10. package/dist/dev/vidply.YouTubeRenderer-QLMMD757.js.map +7 -0
  11. package/dist/dev/vidply.chunk-UEIJOJH6.js +243 -0
  12. package/dist/dev/vidply.chunk-UEIJOJH6.js.map +7 -0
  13. package/dist/dev/vidply.chunk-UH5MTGKF.js +1630 -0
  14. package/dist/dev/vidply.chunk-UH5MTGKF.js.map +7 -0
  15. package/dist/dev/vidply.de-THBIMP4S.js +180 -0
  16. package/dist/dev/vidply.de-THBIMP4S.js.map +7 -0
  17. package/dist/dev/vidply.es-6VWDNNNL.js +180 -0
  18. package/dist/dev/vidply.es-6VWDNNNL.js.map +7 -0
  19. package/dist/{vidply.esm.js → dev/vidply.esm.js} +280 -5139
  20. package/dist/dev/vidply.esm.js.map +7 -0
  21. package/dist/dev/vidply.fr-WHTWCHWT.js +180 -0
  22. package/dist/dev/vidply.fr-WHTWCHWT.js.map +7 -0
  23. package/dist/dev/vidply.ja-BFQNPOFI.js +180 -0
  24. package/dist/dev/vidply.ja-BFQNPOFI.js.map +7 -0
  25. package/dist/{vidply.js → legacy/vidply.js} +7668 -7459
  26. package/dist/legacy/vidply.js.map +7 -0
  27. package/dist/legacy/vidply.min.js +6 -0
  28. package/dist/{vidply.min.meta.json → legacy/vidply.min.meta.json} +107 -86
  29. package/dist/prod/vidply.HLSRenderer-4PW35TCX.min.js +6 -0
  30. package/dist/prod/vidply.HTML5Renderer-XJCSUETP.min.js +6 -0
  31. package/dist/prod/vidply.TranscriptManager-UZ6DUFB6.min.js +6 -0
  32. package/dist/prod/vidply.VimeoRenderer-P3PU27S7.min.js +6 -0
  33. package/dist/prod/vidply.YouTubeRenderer-DGKKWB5M.min.js +6 -0
  34. package/dist/prod/vidply.chunk-BQBGEJF7.min.js +6 -0
  35. package/dist/prod/vidply.chunk-MBUR3U5L.min.js +6 -0
  36. package/dist/prod/vidply.de-SWFW4HYT.min.js +6 -0
  37. package/dist/prod/vidply.es-7BJ2DJAY.min.js +6 -0
  38. package/dist/prod/vidply.esm.min.js +21 -0
  39. package/dist/prod/vidply.fr-DPVR5DFY.min.js +6 -0
  40. package/dist/prod/vidply.ja-PEBVWKVH.min.js +6 -0
  41. package/dist/vidply.esm.min.meta.json +272 -95
  42. package/package.json +3 -3
  43. package/src/controls/ControlBar.js +2 -4
  44. package/src/core/Player.js +57 -18
  45. package/src/features/PlaylistManager.js +5 -4
  46. package/src/i18n/i18n.js +51 -7
  47. package/src/i18n/translations.js +35 -18
  48. package/src/icons/Icons.js +2 -20
  49. package/src/renderers/HLSRenderer.js +7 -0
  50. package/dist/vidply.esm.js.map +0 -7
  51. package/dist/vidply.esm.min.js +0 -22
  52. package/dist/vidply.js.map +0 -7
  53. package/dist/vidply.min.js +0 -22
@@ -36,7 +36,7 @@
36
36
  "format": "esm"
37
37
  },
38
38
  "src/i18n/translations.js": {
39
- "bytes": 702,
39
+ "bytes": 1382,
40
40
  "imports": [
41
41
  {
42
42
  "path": "src/i18n/languages/en.js",
@@ -45,29 +45,29 @@
45
45
  },
46
46
  {
47
47
  "path": "src/i18n/languages/de.js",
48
- "kind": "import-statement",
48
+ "kind": "dynamic-import",
49
49
  "original": "./languages/de.js"
50
50
  },
51
51
  {
52
52
  "path": "src/i18n/languages/es.js",
53
- "kind": "import-statement",
53
+ "kind": "dynamic-import",
54
54
  "original": "./languages/es.js"
55
55
  },
56
56
  {
57
57
  "path": "src/i18n/languages/fr.js",
58
- "kind": "import-statement",
58
+ "kind": "dynamic-import",
59
59
  "original": "./languages/fr.js"
60
60
  },
61
61
  {
62
62
  "path": "src/i18n/languages/ja.js",
63
- "kind": "import-statement",
63
+ "kind": "dynamic-import",
64
64
  "original": "./languages/ja.js"
65
65
  }
66
66
  ],
67
67
  "format": "esm"
68
68
  },
69
69
  "src/i18n/i18n.js": {
70
- "bytes": 4579,
70
+ "bytes": 6046,
71
71
  "imports": [
72
72
  {
73
73
  "path": "src/i18n/translations.js",
@@ -89,7 +89,7 @@
89
89
  "format": "esm"
90
90
  },
91
91
  "src/icons/Icons.js": {
92
- "bytes": 13120,
92
+ "bytes": 11393,
93
93
  "imports": [],
94
94
  "format": "esm"
95
95
  },
@@ -99,7 +99,7 @@
99
99
  "format": "esm"
100
100
  },
101
101
  "src/controls/ControlBar.js": {
102
- "bytes": 132082,
102
+ "bytes": 132009,
103
103
  "imports": [
104
104
  {
105
105
  "path": "src/utils/DOMUtils.js",
@@ -170,6 +170,16 @@
170
170
  "imports": [],
171
171
  "format": "esm"
172
172
  },
173
+ "src/renderers/HTML5Renderer.js": {
174
+ "bytes": 9169,
175
+ "imports": [],
176
+ "format": "esm"
177
+ },
178
+ "src/utils/DraggableResizable.js": {
179
+ "bytes": 25328,
180
+ "imports": [],
181
+ "format": "esm"
182
+ },
173
183
  "src/utils/MenuUtils.js": {
174
184
  "bytes": 6782,
175
185
  "imports": [
@@ -196,11 +206,6 @@
196
206
  ],
197
207
  "format": "esm"
198
208
  },
199
- "src/utils/DraggableResizable.js": {
200
- "bytes": 25328,
201
- "imports": [],
202
- "format": "esm"
203
- },
204
209
  "src/utils/FormUtils.js": {
205
210
  "bytes": 3078,
206
211
  "imports": [
@@ -268,11 +273,6 @@
268
273
  ],
269
274
  "format": "esm"
270
275
  },
271
- "src/renderers/HTML5Renderer.js": {
272
- "bytes": 9169,
273
- "imports": [],
274
- "format": "esm"
275
- },
276
276
  "src/renderers/YouTubeRenderer.js": {
277
277
  "bytes": 7465,
278
278
  "imports": [],
@@ -295,7 +295,7 @@
295
295
  "format": "esm"
296
296
  },
297
297
  "src/core/Player.js": {
298
- "bytes": 207019,
298
+ "bytes": 208328,
299
299
  "imports": [
300
300
  {
301
301
  "path": "src/utils/EventEmitter.js",
@@ -322,31 +322,11 @@
322
322
  "kind": "import-statement",
323
323
  "original": "../controls/KeyboardManager.js"
324
324
  },
325
- {
326
- "path": "src/controls/TranscriptManager.js",
327
- "kind": "import-statement",
328
- "original": "../controls/TranscriptManager.js"
329
- },
330
325
  {
331
326
  "path": "src/renderers/HTML5Renderer.js",
332
327
  "kind": "import-statement",
333
328
  "original": "../renderers/HTML5Renderer.js"
334
329
  },
335
- {
336
- "path": "src/renderers/YouTubeRenderer.js",
337
- "kind": "import-statement",
338
- "original": "../renderers/YouTubeRenderer.js"
339
- },
340
- {
341
- "path": "src/renderers/VimeoRenderer.js",
342
- "kind": "import-statement",
343
- "original": "../renderers/VimeoRenderer.js"
344
- },
345
- {
346
- "path": "src/renderers/HLSRenderer.js",
347
- "kind": "import-statement",
348
- "original": "../renderers/HLSRenderer.js"
349
- },
350
330
  {
351
331
  "path": "src/icons/Icons.js",
352
332
  "kind": "import-statement",
@@ -381,12 +361,32 @@
381
361
  "path": "src/utils/PerformanceUtils.js",
382
362
  "kind": "import-statement",
383
363
  "original": "../utils/PerformanceUtils.js"
364
+ },
365
+ {
366
+ "path": "src/controls/TranscriptManager.js",
367
+ "kind": "dynamic-import",
368
+ "original": "../controls/TranscriptManager.js"
369
+ },
370
+ {
371
+ "path": "src/renderers/YouTubeRenderer.js",
372
+ "kind": "dynamic-import",
373
+ "original": "../renderers/YouTubeRenderer.js"
374
+ },
375
+ {
376
+ "path": "src/renderers/VimeoRenderer.js",
377
+ "kind": "dynamic-import",
378
+ "original": "../renderers/VimeoRenderer.js"
379
+ },
380
+ {
381
+ "path": "src/renderers/HLSRenderer.js",
382
+ "kind": "dynamic-import",
383
+ "original": "../renderers/HLSRenderer.js"
384
384
  }
385
385
  ],
386
386
  "format": "esm"
387
387
  },
388
388
  "src/features/PlaylistManager.js": {
389
- "bytes": 37428,
389
+ "bytes": 37547,
390
390
  "imports": [
391
391
  {
392
392
  "path": "src/utils/DOMUtils.js",
@@ -429,8 +429,64 @@
429
429
  }
430
430
  },
431
431
  "outputs": {
432
- "dist/vidply.esm.min.js": {
432
+ "dist/prod/vidply.VimeoRenderer-P3PU27S7.min.js": {
433
433
  "imports": [],
434
+ "exports": [
435
+ "VimeoRenderer"
436
+ ],
437
+ "entryPoint": "src/renderers/VimeoRenderer.js",
438
+ "inputs": {
439
+ "src/renderers/VimeoRenderer.js": {
440
+ "bytesInOutput": 4267
441
+ }
442
+ },
443
+ "bytes": 4413
444
+ },
445
+ "dist/prod/vidply.HLSRenderer-4PW35TCX.min.js": {
446
+ "imports": [
447
+ {
448
+ "path": "dist/prod/vidply.HTML5Renderer-XJCSUETP.min.js",
449
+ "kind": "dynamic-import"
450
+ }
451
+ ],
452
+ "exports": [
453
+ "HLSRenderer"
454
+ ],
455
+ "entryPoint": "src/renderers/HLSRenderer.js",
456
+ "inputs": {
457
+ "src/renderers/HLSRenderer.js": {
458
+ "bytesInOutput": 5593
459
+ }
460
+ },
461
+ "bytes": 5737
462
+ },
463
+ "dist/prod/vidply.esm.min.js": {
464
+ "imports": [
465
+ {
466
+ "path": "dist/prod/vidply.chunk-BQBGEJF7.min.js",
467
+ "kind": "import-statement"
468
+ },
469
+ {
470
+ "path": "dist/prod/vidply.chunk-MBUR3U5L.min.js",
471
+ "kind": "import-statement"
472
+ },
473
+ {
474
+ "path": "dist/prod/vidply.TranscriptManager-UZ6DUFB6.min.js",
475
+ "kind": "dynamic-import"
476
+ },
477
+ {
478
+ "path": "dist/prod/vidply.YouTubeRenderer-DGKKWB5M.min.js",
479
+ "kind": "dynamic-import"
480
+ },
481
+ {
482
+ "path": "dist/prod/vidply.VimeoRenderer-P3PU27S7.min.js",
483
+ "kind": "dynamic-import"
484
+ },
485
+ {
486
+ "path": "dist/prod/vidply.HLSRenderer-4PW35TCX.min.js",
487
+ "kind": "dynamic-import"
488
+ }
489
+ ],
434
490
  "exports": [
435
491
  "Player",
436
492
  "PlaylistManager",
@@ -438,92 +494,213 @@
438
494
  ],
439
495
  "entryPoint": "src/index.js",
440
496
  "inputs": {
441
- "src/renderers/HTML5Renderer.js": {
442
- "bytesInOutput": 4803
443
- },
444
497
  "src/utils/EventEmitter.js": {
445
498
  "bytesInOutput": 436
446
499
  },
447
- "src/utils/DOMUtils.js": {
448
- "bytesInOutput": 2244
500
+ "src/controls/ControlBar.js": {
501
+ "bytesInOutput": 56830
449
502
  },
450
- "src/i18n/languages/en.js": {
451
- "bytesInOutput": 5568
503
+ "src/utils/PerformanceUtils.js": {
504
+ "bytesInOutput": 256
452
505
  },
453
- "src/i18n/languages/de.js": {
454
- "bytesInOutput": 6667
506
+ "src/controls/CaptionManager.js": {
507
+ "bytesInOutput": 7279
455
508
  },
456
- "src/i18n/languages/es.js": {
457
- "bytesInOutput": 6802
509
+ "src/controls/KeyboardManager.js": {
510
+ "bytesInOutput": 3991
458
511
  },
459
- "src/i18n/languages/fr.js": {
460
- "bytesInOutput": 7070
512
+ "src/core/Player.js": {
513
+ "bytesInOutput": 76642
461
514
  },
515
+ "src/features/PlaylistManager.js": {
516
+ "bytesInOutput": 16824
517
+ },
518
+ "src/index.js": {
519
+ "bytesInOutput": 1869
520
+ }
521
+ },
522
+ "bytes": 164498
523
+ },
524
+ "dist/prod/vidply.de-SWFW4HYT.min.js": {
525
+ "imports": [],
526
+ "exports": [
527
+ "de"
528
+ ],
529
+ "entryPoint": "src/i18n/languages/de.js",
530
+ "inputs": {
531
+ "src/i18n/languages/de.js": {
532
+ "bytesInOutput": 6470
533
+ }
534
+ },
535
+ "bytes": 6605
536
+ },
537
+ "dist/prod/vidply.es-7BJ2DJAY.min.js": {
538
+ "imports": [],
539
+ "exports": [
540
+ "es"
541
+ ],
542
+ "entryPoint": "src/i18n/languages/es.js",
543
+ "inputs": {
544
+ "src/i18n/languages/es.js": {
545
+ "bytesInOutput": 6637
546
+ }
547
+ },
548
+ "bytes": 6772
549
+ },
550
+ "dist/prod/vidply.fr-DPVR5DFY.min.js": {
551
+ "imports": [],
552
+ "exports": [
553
+ "fr"
554
+ ],
555
+ "entryPoint": "src/i18n/languages/fr.js",
556
+ "inputs": {
557
+ "src/i18n/languages/fr.js": {
558
+ "bytesInOutput": 6847
559
+ }
560
+ },
561
+ "bytes": 6982
562
+ },
563
+ "dist/prod/vidply.ja-PEBVWKVH.min.js": {
564
+ "imports": [],
565
+ "exports": [
566
+ "ja"
567
+ ],
568
+ "entryPoint": "src/i18n/languages/ja.js",
569
+ "inputs": {
462
570
  "src/i18n/languages/ja.js": {
463
- "bytesInOutput": 11960
571
+ "bytesInOutput": 7246
572
+ }
573
+ },
574
+ "bytes": 7381
575
+ },
576
+ "dist/prod/vidply.HTML5Renderer-XJCSUETP.min.js": {
577
+ "imports": [
578
+ {
579
+ "path": "dist/prod/vidply.chunk-BQBGEJF7.min.js",
580
+ "kind": "import-statement"
581
+ }
582
+ ],
583
+ "exports": [
584
+ "HTML5Renderer"
585
+ ],
586
+ "entryPoint": "src/renderers/HTML5Renderer.js",
587
+ "inputs": {},
588
+ "bytes": 192
589
+ },
590
+ "dist/prod/vidply.chunk-BQBGEJF7.min.js": {
591
+ "imports": [],
592
+ "exports": [
593
+ "a"
594
+ ],
595
+ "inputs": {
596
+ "src/renderers/HTML5Renderer.js": {
597
+ "bytesInOutput": 4749
598
+ }
599
+ },
600
+ "bytes": 4883
601
+ },
602
+ "dist/prod/vidply.TranscriptManager-UZ6DUFB6.min.js": {
603
+ "imports": [
604
+ {
605
+ "path": "dist/prod/vidply.chunk-MBUR3U5L.min.js",
606
+ "kind": "import-statement"
607
+ }
608
+ ],
609
+ "exports": [
610
+ "TranscriptManager"
611
+ ],
612
+ "entryPoint": "src/controls/TranscriptManager.js",
613
+ "inputs": {
614
+ "src/controls/TranscriptManager.js": {
615
+ "bytesInOutput": 42852
616
+ }
617
+ },
618
+ "bytes": 43123
619
+ },
620
+ "dist/prod/vidply.chunk-MBUR3U5L.min.js": {
621
+ "imports": [
622
+ {
623
+ "path": "dist/prod/vidply.de-SWFW4HYT.min.js",
624
+ "kind": "dynamic-import"
625
+ },
626
+ {
627
+ "path": "dist/prod/vidply.es-7BJ2DJAY.min.js",
628
+ "kind": "dynamic-import"
629
+ },
630
+ {
631
+ "path": "dist/prod/vidply.fr-DPVR5DFY.min.js",
632
+ "kind": "dynamic-import"
633
+ },
634
+ {
635
+ "path": "dist/prod/vidply.ja-PEBVWKVH.min.js",
636
+ "kind": "dynamic-import"
637
+ }
638
+ ],
639
+ "exports": [
640
+ "a",
641
+ "b",
642
+ "c",
643
+ "d",
644
+ "e",
645
+ "f",
646
+ "g",
647
+ "h",
648
+ "i",
649
+ "j",
650
+ "k",
651
+ "l",
652
+ "m",
653
+ "n"
654
+ ],
655
+ "inputs": {
656
+ "src/utils/DOMUtils.js": {
657
+ "bytesInOutput": 2244
658
+ },
659
+ "src/i18n/languages/en.js": {
660
+ "bytesInOutput": 5561
464
661
  },
465
662
  "src/i18n/translations.js": {
466
- "bytesInOutput": 61
663
+ "bytesInOutput": 340
467
664
  },
468
665
  "src/i18n/i18n.js": {
469
- "bytesInOutput": 1827
666
+ "bytesInOutput": 2400
470
667
  },
471
668
  "src/utils/TimeUtils.js": {
472
669
  "bytesInOutput": 839
473
670
  },
474
671
  "src/icons/Icons.js": {
475
- "bytesInOutput": 10946
672
+ "bytesInOutput": 9302
476
673
  },
477
674
  "src/utils/FocusUtils.js": {
478
- "bytesInOutput": 222
479
- },
480
- "src/controls/ControlBar.js": {
481
- "bytesInOutput": 56900
675
+ "bytesInOutput": 221
482
676
  },
483
677
  "src/utils/StorageManager.js": {
484
678
  "bytesInOutput": 1606
485
679
  },
486
- "src/utils/PerformanceUtils.js": {
487
- "bytesInOutput": 256
488
- },
489
- "src/controls/CaptionManager.js": {
490
- "bytesInOutput": 7325
491
- },
492
- "src/controls/KeyboardManager.js": {
493
- "bytesInOutput": 3991
680
+ "src/utils/DraggableResizable.js": {
681
+ "bytesInOutput": 13775
494
682
  },
495
683
  "src/utils/MenuUtils.js": {
496
684
  "bytesInOutput": 2257
497
685
  },
498
- "src/utils/DraggableResizable.js": {
499
- "bytesInOutput": 13861
500
- },
501
686
  "src/utils/FormUtils.js": {
502
- "bytesInOutput": 774
503
- },
504
- "src/controls/TranscriptManager.js": {
505
- "bytesInOutput": 43008
506
- },
507
- "src/core/Player.js": {
508
- "bytesInOutput": 76057
509
- },
687
+ "bytesInOutput": 776
688
+ }
689
+ },
690
+ "bytes": 39549
691
+ },
692
+ "dist/prod/vidply.YouTubeRenderer-DGKKWB5M.min.js": {
693
+ "imports": [],
694
+ "exports": [
695
+ "YouTubeRenderer"
696
+ ],
697
+ "entryPoint": "src/renderers/YouTubeRenderer.js",
698
+ "inputs": {
510
699
  "src/renderers/YouTubeRenderer.js": {
511
- "bytesInOutput": 4204
512
- },
513
- "src/renderers/VimeoRenderer.js": {
514
- "bytesInOutput": 4268
515
- },
516
- "src/renderers/HLSRenderer.js": {
517
- "bytesInOutput": 5583
518
- },
519
- "src/features/PlaylistManager.js": {
520
- "bytesInOutput": 16735
521
- },
522
- "src/index.js": {
523
- "bytesInOutput": 1869
700
+ "bytesInOutput": 4203
524
701
  }
525
702
  },
526
- "bytes": 298460
703
+ "bytes": 4351
527
704
  }
528
705
  }
529
706
  }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "vidply",
3
- "version": "1.0.24",
3
+ "version": "1.0.25",
4
4
  "description": "Universal, accessible video & audio player with ES6 modules",
5
5
  "type": "module",
6
- "main": "dist/vidply.js",
7
- "module": "dist/vidply.esm.js",
6
+ "main": "dist/prod/vidply.esm.min.js",
7
+ "module": "dist/prod/vidply.esm.min.js",
8
8
  "files": [
9
9
  "dist",
10
10
  "src"
@@ -2436,11 +2436,9 @@ export class ControlBar {
2436
2436
 
2437
2437
  button.appendChild(createIconElement('transcript'));
2438
2438
 
2439
- button.addEventListener('click', () => {
2440
- if (this.player.transcriptManager) {
2441
- this.player.transcriptManager.toggleTranscript();
2439
+ button.addEventListener('click', async () => {
2440
+ await this.player.toggleTranscript();
2442
2441
  this.updateTranscriptButton();
2443
- }
2444
2442
  });
2445
2443
 
2446
2444
  this.controls.transcript = button;
@@ -8,11 +8,7 @@ import {DOMUtils} from '../utils/DOMUtils.js';
8
8
  import {ControlBar} from '../controls/ControlBar.js';
9
9
  import {CaptionManager} from '../controls/CaptionManager.js';
10
10
  import {KeyboardManager} from '../controls/KeyboardManager.js';
11
- import {TranscriptManager} from '../controls/TranscriptManager.js';
12
11
  import {HTML5Renderer} from '../renderers/HTML5Renderer.js';
13
- import {YouTubeRenderer} from '../renderers/YouTubeRenderer.js';
14
- import {VimeoRenderer} from '../renderers/VimeoRenderer.js';
15
- import {HLSRenderer} from '../renderers/HLSRenderer.js';
16
12
  import {createPlayOverlay, createIconElement} from '../icons/Icons.js';
17
13
  import {i18n} from '../i18n/i18n.js';
18
14
  import {StorageManager} from '../utils/StorageManager.js';
@@ -293,6 +289,9 @@ export class Player extends EventEmitter {
293
289
  this.options.language = 'en';
294
290
  }
295
291
 
292
+ // Ensure requested language is available (loads built-ins on demand)
293
+ await i18n.ensureLanguage(this.options.language);
294
+
296
295
  // Set language
297
296
  i18n.setLanguage(this.options.language);
298
297
 
@@ -318,9 +317,9 @@ export class Player extends EventEmitter {
318
317
  this.captionManager = new CaptionManager(this);
319
318
  }
320
319
 
321
- // Initialize transcript
322
- if (this.options.transcript || this.options.transcriptButton) {
323
- this.transcriptManager = new TranscriptManager(this);
320
+ // Initialize transcript lazily unless explicitly requested
321
+ if (this.options.transcript) {
322
+ await this.ensureTranscriptManager();
324
323
  }
325
324
 
326
325
  // Always set up metadata track handling (independent of transcript)
@@ -376,6 +375,43 @@ export class Player extends EventEmitter {
376
375
  }
377
376
  }
378
377
 
378
+ /**
379
+ * Ensure the transcript manager is available, creating it on demand.
380
+ * This keeps initial load fast when transcripts are not needed.
381
+ */
382
+ async ensureTranscriptManager() {
383
+ if (this.transcriptManager) {
384
+ return this.transcriptManager;
385
+ }
386
+
387
+ if (!this.options.transcript && !this.options.transcriptButton) {
388
+ return null;
389
+ }
390
+
391
+ const module = await import('../controls/TranscriptManager.js');
392
+ const Manager = module.TranscriptManager || module.default;
393
+
394
+ if (!Manager) {
395
+ return null;
396
+ }
397
+
398
+ this.transcriptManager = new Manager(this);
399
+ return this.transcriptManager;
400
+ }
401
+
402
+ /**
403
+ * Toggle transcript visibility, lazily creating the manager if necessary.
404
+ */
405
+ async toggleTranscript() {
406
+ const manager = await this.ensureTranscriptManager();
407
+ if (!manager) return;
408
+
409
+ manager.toggleTranscript();
410
+ if (this.controlBar) {
411
+ this.controlBar.updateTranscriptButton();
412
+ }
413
+ }
414
+
379
415
  /**
380
416
  * Detect language from HTML lang attribute
381
417
  * @returns {string|null} Language code if available in translations, null otherwise
@@ -674,21 +710,22 @@ export class Player extends EventEmitter {
674
710
  this.originalSrc = src;
675
711
  }
676
712
 
677
- // Detect media type
678
- let renderer;
713
+ // Detect media type and lazily load heavy renderers
714
+ let rendererClass = HTML5Renderer;
679
715
 
680
716
  if (src.includes('youtube.com') || src.includes('youtu.be')) {
681
- renderer = YouTubeRenderer;
717
+ const module = await import('../renderers/YouTubeRenderer.js');
718
+ rendererClass = module.YouTubeRenderer || module.default;
682
719
  } else if (src.includes('vimeo.com')) {
683
- renderer = VimeoRenderer;
720
+ const module = await import('../renderers/VimeoRenderer.js');
721
+ rendererClass = module.VimeoRenderer || module.default;
684
722
  } else if (src.includes('.m3u8')) {
685
- renderer = HLSRenderer;
686
- } else {
687
- renderer = HTML5Renderer;
723
+ const module = await import('../renderers/HLSRenderer.js');
724
+ rendererClass = module.HLSRenderer || module.default;
688
725
  }
689
726
 
690
- this.log(`Using ${renderer.name} renderer`);
691
- this.renderer = new renderer(this);
727
+ this.log(`Using ${rendererClass?.name || 'HTML5Renderer'} renderer`);
728
+ this.renderer = new rendererClass(this);
692
729
  await this.renderer.init();
693
730
 
694
731
  // Invalidate cache after renderer initialization (tracks may have changed)
@@ -970,11 +1007,13 @@ export class Player extends EventEmitter {
970
1007
  if (this.transcriptManager) {
971
1008
  const wasTranscriptVisible = this.transcriptManager.isVisible;
972
1009
  this.transcriptManager.destroy();
973
- this.transcriptManager = new TranscriptManager(this);
1010
+ this.transcriptManager = null;
1011
+
1012
+ await this.ensureTranscriptManager();
974
1013
 
975
1014
  // Only restore transcript visibility if new track has captions
976
1015
  if (wasTranscriptVisible && this.controlBar && this.controlBar.hasCaptionTracks()) {
977
- this.transcriptManager.showTranscript();
1016
+ this.transcriptManager?.showTranscript();
978
1017
  }
979
1018
  }
980
1019
 
@@ -15,6 +15,7 @@ export class PlaylistManager {
15
15
  constructor(player, options = {}) {
16
16
  this.player = player;
17
17
  this.tracks = [];
18
+ this.initialTracks = Array.isArray(options.tracks) ? options.tracks : [];
18
19
  this.currentIndex = -1;
19
20
 
20
21
  // Generate unique instance ID for this playlist
@@ -53,9 +54,9 @@ export class PlaylistManager {
53
54
  // Update controls to add playlist buttons
54
55
  this.updatePlayerControls();
55
56
 
56
- // Load tracks if provided in options
57
- if (options.tracks && Array.isArray(options.tracks)) {
58
- this.loadPlaylist(options.tracks);
57
+ // Load tracks if provided in options (after UI is ready)
58
+ if (this.initialTracks.length > 0) {
59
+ this.loadPlaylist(this.initialTracks);
59
60
  }
60
61
  }
61
62
 
@@ -81,7 +82,7 @@ export class PlaylistManager {
81
82
  }
82
83
 
83
84
  // Check for data-playlist attribute on player container (only if tracks weren't provided in options)
84
- if (this.tracks.length === 0) {
85
+ if (this.tracks.length === 0 && this.initialTracks.length === 0) {
85
86
  this.loadPlaylistFromAttribute();
86
87
  }
87
88
  }