vidply 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1711 @@
1
+ /**
2
+ * VidPly - Modern Video Player Styles
3
+ */
4
+
5
+ /* CSS Custom Properties (Root Variables) */
6
+ :root {
7
+ /* Primary Brand Colors */
8
+ --vidply-active-bg: var(--vidply-white-05);
9
+ --vidply-bg-caption: var(--vidply-black-80);
10
+ --vidply-bg-controls: linear-gradient(180deg, rgb(var(--vidply-black-rgb), 0) 0%, rgb(var(--vidply-black-rgb), 0.9) 100%);
11
+ --vidply-bg-dialog: rgb(20 20 20 / 98%);
12
+ --vidply-bg-dialog-dark: rgb(18 18 18 / 98%);
13
+
14
+ /* Primary Color Variations */
15
+ --vidply-bg-menu: rgb(20 20 20 / 98%);
16
+ --vidply-bg-menu-rgb: 20, 20, 20;
17
+ --vidply-bg-overlay: var(--vidply-black-80);
18
+ --vidply-bg-playlist: #1a1a1a;
19
+ --vidply-bg-playlist-header: var(--vidply-black-40);
20
+ --vidply-bg-track-info: linear-gradient(180deg, var(--vidply-black-80) 0%, var(--vidply-black-60) 100%);
21
+ --vidply-bg-transcript: rgb(30 30 30 / 98%);
22
+ --vidply-black: #000;
23
+ --vidply-black-30: rgb(var(--vidply-black-rgb), 0.3);
24
+ --vidply-black-40: rgb(var(--vidply-black-rgb), 0.4);
25
+
26
+ /* White Color Variations */
27
+ --vidply-black-50: rgb(var(--vidply-black-rgb), 0.5);
28
+ --vidply-black-60: rgb(var(--vidply-black-rgb), 0.6);
29
+ --vidply-black-80: rgb(var(--vidply-black-rgb), 0.8);
30
+ --vidply-black-90: rgb(var(--vidply-black-rgb), 0.9);
31
+ --vidply-black-98: rgb(var(--vidply-black-rgb), 0.98);
32
+ --vidply-black-rgb: 0, 0, 0;
33
+ --vidply-border: var(--vidply-white-15);
34
+ --vidply-border-focus: var(--vidply-primary);
35
+ --vidply-border-hover: var(--vidply-white-30);
36
+ --vidply-border-light: var(--vidply-white-10);
37
+ --vidply-focus-outline: 2px solid var(--vidply-primary);
38
+ --vidply-focus-outline-white: 2px solid var(--vidply-primary-light);
39
+ --vidply-hover-bg: var(--vidply-white-10);
40
+ --vidply-primary: #0a406e;
41
+ --vidply-primary-10: rgb(var(--vidply-primary-rgb), 0.1);
42
+ --vidply-primary-15: rgb(var(--vidply-primary-rgb), 0.15);
43
+
44
+ /* Black Color Variations */
45
+ --vidply-primary-20: rgb(var(--vidply-primary-rgb), 0.2);
46
+ --vidply-primary-25: rgb(var(--vidply-primary-rgb), 0.25);
47
+ --vidply-primary-30: rgb(var(--vidply-primary-rgb), 0.3);
48
+ --vidply-primary-40: rgb(var(--vidply-primary-rgb), 0.4);
49
+ --vidply-primary-50: rgb(var(--vidply-primary-rgb), 0.5);
50
+ --vidply-primary-60: rgb(var(--vidply-primary-rgb), 0.6);
51
+ --vidply-primary-70: rgb(var(--vidply-primary-rgb), 0.7);
52
+ --vidply-primary-80: rgb(var(--vidply-primary-rgb), 0.8);
53
+ --vidply-primary-dark: #083358;
54
+
55
+ /* UI Background Colors */
56
+ --vidply-primary-dark-rgb: 8, 51, 88;
57
+ --vidply-primary-light: #60a5fa;
58
+ --vidply-primary-rgb: 10, 64, 110;
59
+ --vidply-shadow-lg: 0 12px 48px var(--vidply-black-80);
60
+ --vidply-shadow-md: 0 4px 12px var(--vidply-black-40);
61
+ --vidply-shadow-sm: 0 2px 4px var(--vidply-black-30);
62
+ --vidply-text-disabled: var(--vidply-white-60);
63
+ --vidply-text-muted: var(--vidply-white-70);
64
+ --vidply-text-primary: var(--vidply-white);
65
+ --vidply-text-secondary: var(--vidply-white-90);
66
+ --vidply-text-subtle: var(--vidply-white-50);
67
+
68
+ /* Border Colors */
69
+ --vidply-white: #fff;
70
+ --vidply-white-05: rgb(var(--vidply-white-rgb), 0.05);
71
+ --vidply-white-08: rgb(var(--vidply-white-rgb), 0.08);
72
+ --vidply-white-10: rgb(var(--vidply-white-rgb), 0.1);
73
+
74
+ /* Shadow Colors */
75
+ --vidply-white-15: rgb(var(--vidply-white-rgb), 0.15);
76
+ --vidply-white-20: rgb(var(--vidply-white-rgb), 0.2);
77
+ --vidply-white-25: rgb(var(--vidply-white-rgb), 0.25);
78
+
79
+ /* Text Colors */
80
+ --vidply-white-30: rgb(var(--vidply-white-rgb), 0.3);
81
+ --vidply-white-40: rgb(var(--vidply-white-rgb), 0.4);
82
+ --vidply-white-50: rgb(var(--vidply-white-rgb), 0.5);
83
+ --vidply-white-60: rgb(var(--vidply-white-rgb), 0.6);
84
+ --vidply-white-70: rgb(var(--vidply-white-rgb), 0.7);
85
+
86
+ /* State Colors */
87
+ --vidply-white-80: rgb(var(--vidply-white-rgb), 0.8);
88
+ --vidply-white-90: rgb(var(--vidply-white-rgb), 0.9);
89
+ --vidply-white-95: rgb(var(--vidply-white-rgb), 0.95);
90
+ --vidply-white-rgb: 255, 255, 255;
91
+ }
92
+
93
+ /* Reset and Base Styles */
94
+ .vidply-player {
95
+ background: var(--vidply-black);
96
+ box-sizing: border-box;
97
+ color: var(--vidply-text-primary);
98
+ contain: layout style;
99
+ display: flex;
100
+ flex-direction: column;
101
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
102
+ font-size: 14px;
103
+ line-height: 1.5;
104
+ max-width: 100%;
105
+ overflow: visible;
106
+ position: relative;
107
+ text-size-adjust: 100%;
108
+ width: 100%;
109
+ }
110
+
111
+ /* Player Focus Outline */
112
+ .vidply-player:focus {
113
+ outline: 3px solid var(--vidply-primary-light);
114
+ outline-offset: 4px;
115
+ }
116
+
117
+ .vidply-player:focus:not(:focus-visible) {
118
+ outline: none;
119
+ }
120
+
121
+ .vidply-player:focus-visible {
122
+ outline: 3px solid var(--vidply-primary-light);
123
+ outline-offset: 4px;
124
+ }
125
+
126
+ /* Mobile: Ensure player contains all elements properly */
127
+ @media (width <= 640px) {
128
+ .vidply-player {
129
+ isolation: isolate; /* Create stacking context */
130
+ overflow: visible; /* Allow menus to overflow but within bounds */
131
+ }
132
+ }
133
+
134
+ .vidply-player *,
135
+ .vidply-player *::before,
136
+ .vidply-player *::after {
137
+ box-sizing: inherit;
138
+ }
139
+
140
+ /* Responsive container */
141
+
142
+ .vidply-player.vidply-audio {
143
+ aspect-ratio: auto;
144
+ background: linear-gradient(135deg, var(--vidply-primary-20) 0%, rgb(var(--vidply-primary-dark-rgb), 0.2) 100%);
145
+ height: auto;
146
+ }
147
+
148
+ /* Video/Audio Element */
149
+ .vidply-player video,
150
+ .vidply-player audio {
151
+ display: block;
152
+ height: 100%;
153
+ object-fit: contain;
154
+ width: 100%;
155
+ }
156
+
157
+ /* Mobile: Video element order and sizing */
158
+ @media (width <= 640px) {
159
+ .vidply-player video,
160
+ .vidply-player audio {
161
+ flex: 0 0 auto; /* Don't grow or shrink */
162
+ height: auto;
163
+ order: 1; /* Before controls */
164
+ }
165
+ }
166
+
167
+ /* Hide native browser captions - we'll display our own */
168
+ .vidply-player video::cue {
169
+ display: none;
170
+ }
171
+
172
+ .vidply-player video::-webkit-media-text-track-container {
173
+ display: none !important;
174
+ }
175
+
176
+ .vidply-player video::-webkit-media-text-track-display {
177
+ display: none !important;
178
+ }
179
+
180
+ /* Video wrapper for proper clipping */
181
+ .vidply-video-wrapper {
182
+ background: linear-gradient(135deg, var(--vidply-black) 0%, #2a2a2a 100%);
183
+ height: 100%;
184
+ order: 1; /* First in flex order */
185
+ overflow: hidden;
186
+ position: relative;
187
+ width: 100%;
188
+ z-index: 10; /* Above track-info and playlist siblings */
189
+ }
190
+
191
+ /* Mobile: Simplify video wrapper */
192
+ @media (width <= 640px) {
193
+ .vidply-video-wrapper {
194
+ display: block;
195
+ height: auto;
196
+ overflow: visible;
197
+ }
198
+ }
199
+
200
+ /* For audio players, allow menus to overflow */
201
+ .vidply-player.vidply-audio .vidply-video-wrapper {
202
+ overflow: visible;
203
+ }
204
+
205
+ /* Hide fullscreen button in audio players */
206
+ .vidply-player.vidply-audio .vidply-fullscreen {
207
+ display: none;
208
+ }
209
+
210
+ /* Centered Play Button Overlay */
211
+ .vidply-play-overlay {
212
+ cursor: pointer;
213
+ filter: drop-shadow(0 8px 32px rgb(0 0 0 / 30%));
214
+ left: 50%;
215
+ position: absolute;
216
+ top: 50%;
217
+ transform: translate(-50%, -50%);
218
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
219
+ z-index: 15;
220
+ }
221
+
222
+ .vidply-play-overlay:hover {
223
+ filter: drop-shadow(0 12px 48px rgb(0 0 0 / 40%));
224
+ transform: translate(-50%, -50%) scale(1.1);
225
+ }
226
+
227
+ .vidply-play-overlay:hover .vidply-play-overlay-bg {
228
+ fill: rgb(255 255 255 / 100%);
229
+ }
230
+
231
+ .vidply-play-overlay:active {
232
+ transform: translate(-50%, -50%) scale(0.95);
233
+ }
234
+
235
+ /* Hide play overlay in audio players */
236
+ .vidply-player.vidply-audio .vidply-play-overlay {
237
+ display: none;
238
+ }
239
+
240
+ /* Controls Container */
241
+ .vidply-controls {
242
+ background: linear-gradient(to top, var(--vidply-black-90) 0%, var(--vidply-black-50) 100%);
243
+ bottom: 0;
244
+ left: 0;
245
+ opacity: 0;
246
+ overflow: visible;
247
+ padding: 20px 16px 16px;
248
+ pointer-events: none;
249
+ position: absolute;
250
+ right: 0;
251
+ transition: opacity 0.3s ease;
252
+ z-index: 10;
253
+ }
254
+
255
+ .vidply-controls.vidply-controls-visible,
256
+ .vidply-player:hover .vidply-controls,
257
+ .vidply-player.vidply-paused .vidply-controls {
258
+ opacity: 1;
259
+ pointer-events: auto;
260
+ }
261
+
262
+ /* For audio players, always show controls */
263
+ .vidply-audio .vidply-controls {
264
+ background: var(--vidply-black-50);
265
+ opacity: 1;
266
+ pointer-events: auto;
267
+ position: relative;
268
+ }
269
+
270
+ /* Mobile: Controls underneath video */
271
+ @media (width <= 640px) {
272
+ .vidply-controls {
273
+ background: var(--vidply-black-90);
274
+ border-top: 1px solid var(--vidply-border-light);
275
+ bottom: auto;
276
+ left: 0;
277
+ opacity: 1;
278
+ order: 2; /* After video-wrapper (1) */
279
+ padding: 12px;
280
+ pointer-events: auto;
281
+ position: relative;
282
+ right: 0;
283
+ width: 100%;
284
+ z-index: 100;
285
+ }
286
+
287
+ /* Allow menus to position within controls */
288
+ .vidply-controls-buttons,
289
+ .vidply-controls-left,
290
+ .vidply-controls-right {
291
+ position: relative;
292
+ }
293
+ }
294
+
295
+ /* Progress Bar */
296
+ .vidply-progress-container {
297
+ background: var(--vidply-white-20);
298
+ border-radius: 3px;
299
+ cursor: pointer;
300
+ height: 5px;
301
+ margin-bottom: 12px;
302
+ position: relative;
303
+ transition: height 0.2s ease;
304
+ width: 100%;
305
+ }
306
+
307
+ .vidply-progress-container:hover,
308
+ .vidply-progress-container:focus {
309
+ height: 8px;
310
+ }
311
+
312
+ .vidply-progress-container:focus {
313
+ outline: var(--vidply-focus-outline-white);
314
+ outline-offset: 2px;
315
+ }
316
+
317
+ .vidply-progress-buffered {
318
+ background: var(--vidply-white-40);
319
+ border-radius: 3px;
320
+ height: 100%;
321
+ left: 0;
322
+ position: absolute;
323
+ top: 0;
324
+ transition: width 0.2s ease;
325
+ width: 0;
326
+ }
327
+
328
+ .vidply-progress-played {
329
+ background: var(--vidply-primary-light);
330
+ border-radius: 3px;
331
+ height: 100%;
332
+ left: 0;
333
+ position: absolute;
334
+ top: 0;
335
+ transition: width 0.1s linear;
336
+ width: 0;
337
+ }
338
+
339
+ .vidply-progress-handle {
340
+ background: var(--vidply-white);
341
+ border-radius: 50%;
342
+ box-shadow: var(--vidply-shadow-sm);
343
+ height: 12px;
344
+ opacity: 0;
345
+ position: absolute;
346
+ right: -6px;
347
+ top: 50%;
348
+ transform: translateY(-50%);
349
+ transition: opacity 0.2s ease;
350
+ width: 12px;
351
+ }
352
+
353
+ .vidply-progress-container:hover .vidply-progress-handle,
354
+ .vidply-progress-container:focus .vidply-progress-handle {
355
+ opacity: 1;
356
+ }
357
+
358
+ .vidply-progress-tooltip {
359
+ background: var(--vidply-black-90);
360
+ border-radius: 4px;
361
+ bottom: 12px;
362
+ color: var(--vidply-white);
363
+ display: none;
364
+ font-size: 12px;
365
+ padding: 4px 8px;
366
+ pointer-events: none;
367
+ position: absolute;
368
+ transform: translateX(-50%);
369
+ white-space: nowrap;
370
+ }
371
+
372
+ /* Button Container */
373
+ .vidply-controls-buttons {
374
+ align-items: center;
375
+ display: flex;
376
+ gap: 8px;
377
+ justify-content: space-between;
378
+ }
379
+
380
+ .vidply-controls-left,
381
+ .vidply-controls-right {
382
+ align-items: center;
383
+ display: flex;
384
+ gap: 8px;
385
+ overflow: visible;
386
+ position: relative;
387
+ }
388
+
389
+
390
+ /* Buttons */
391
+ .vidply-button {
392
+ align-items: center;
393
+ background: transparent;
394
+ border: none;
395
+ border-radius: 4px;
396
+ color: var(--vidply-white);
397
+ cursor: pointer;
398
+ display: inline-flex;
399
+ justify-content: center;
400
+ min-height: 32px;
401
+ min-width: 32px;
402
+ padding: 6px;
403
+ position: relative;
404
+ transition: background-color 0.2s ease, transform 0.1s ease;
405
+ }
406
+
407
+ .vidply-button:hover {
408
+ background: var(--vidply-hover-bg);
409
+ }
410
+
411
+ .vidply-button:active {
412
+ transform: scale(0.95);
413
+ }
414
+
415
+ .vidply-button:focus {
416
+ outline: var(--vidply-focus-outline-white);
417
+ outline-offset: 2px;
418
+ }
419
+
420
+ .vidply-button:focus:not(:focus-visible) {
421
+ outline: none;
422
+ }
423
+
424
+ .vidply-button:disabled {
425
+ cursor: not-allowed;
426
+ opacity: 0.5;
427
+ }
428
+
429
+ /* Icons */
430
+ .vidply-icon {
431
+ display: inline-block;
432
+ fill: currentcolor;
433
+ height: 26px;
434
+ width: 26px;
435
+ }
436
+
437
+ .vidply-icon svg {
438
+ display: block;
439
+ height: 100%;
440
+ width: 100%;
441
+ }
442
+
443
+ /* Volume Control */
444
+ .vidply-volume-slider {
445
+ background: var(--vidply-white-20);
446
+ border-radius: 3px;
447
+ cursor: pointer;
448
+ height: 100px;
449
+ margin: 0 auto;
450
+ position: relative;
451
+ width: 6px;
452
+ }
453
+
454
+ .vidply-volume-slider:focus {
455
+ outline: var(--vidply-focus-outline-white);
456
+ outline-offset: 2px;
457
+ }
458
+
459
+ .vidply-volume-track {
460
+ height: 100%;
461
+ position: relative;
462
+ width: 100%;
463
+ }
464
+
465
+ .vidply-volume-fill {
466
+ background: var(--vidply-primary-light);
467
+ border-radius: 2px;
468
+ bottom: 0;
469
+ height: 80%;
470
+ left: 0;
471
+ position: absolute;
472
+ transition: height 0.1s ease;
473
+ width: 100%;
474
+ }
475
+
476
+ .vidply-volume-handle {
477
+ background: var(--vidply-white);
478
+ border-radius: 50%;
479
+ box-shadow: var(--vidply-shadow-sm);
480
+ height: 10px;
481
+ left: 50%;
482
+ position: absolute;
483
+ top: -4px;
484
+ transform: translateX(-50%);
485
+ width: 10px;
486
+ }
487
+
488
+ /* Time Display */
489
+ .vidply-time {
490
+ align-items: center;
491
+ color: #fff;
492
+ display: flex;
493
+ font-size: 13px;
494
+ font-variant-numeric: tabular-nums;
495
+ gap: 4px;
496
+ padding: 0 4px;
497
+ user-select: none;
498
+ }
499
+
500
+ /* Speed Button */
501
+ .vidply-speed {
502
+ gap: 4px;
503
+ }
504
+
505
+ .vidply-speed-text {
506
+ font-size: 12px;
507
+ min-width: 28px;
508
+ text-align: center;
509
+ }
510
+
511
+ /* Menu Backdrop (for mobile) */
512
+ .vidply-menu-backdrop {
513
+ animation: fadeIn 0.2s ease;
514
+ background: rgb(0 0 0 / 50%);
515
+ bottom: 0;
516
+ display: none;
517
+ left: 0;
518
+ position: fixed;
519
+ right: 0;
520
+ top: 0;
521
+ z-index: 999;
522
+ }
523
+
524
+ .vidply-menu-backdrop.visible {
525
+ display: block;
526
+ }
527
+
528
+ /* Mobile: Don't use backdrop, menus position above buttons */
529
+ @media (width <= 640px) {
530
+ .vidply-menu-backdrop {
531
+ display: none !important;
532
+ }
533
+ }
534
+
535
+ @keyframes fadeIn {
536
+ from {
537
+ opacity: 0;
538
+ }
539
+
540
+ to {
541
+ opacity: 1;
542
+ }
543
+ }
544
+
545
+ /* Menus */
546
+ .vidply-menu {
547
+ backdrop-filter: blur(10px);
548
+ background: var(--vidply-bg-menu);
549
+ border: 1px solid var(--vidply-border);
550
+ border-radius: 8px;
551
+ bottom: calc(100% + 8px);
552
+ box-shadow: var(--vidply-shadow-lg), 0 0 0 1px var(--vidply-white-10);
553
+ max-height: 250px;
554
+ min-width: 200px;
555
+ -webkit-overflow-scrolling: touch;
556
+ overflow-y: auto;
557
+ padding: 8px 0;
558
+ position: absolute;
559
+ right: 50%;
560
+ touch-action: pan-y;
561
+
562
+ /* iOS momentum scrolling */
563
+ transform: translateX(50%);
564
+
565
+ /* Ensure touch events work on iOS */
566
+ z-index: 1000;
567
+ }
568
+
569
+ /* Menu positioned below button */
570
+ .vidply-menu.vidply-menu-below::after {
571
+ border-bottom: 6px solid var(--vidply-bg-menu);
572
+ border-top: none;
573
+ bottom: auto;
574
+ top: -6px;
575
+ }
576
+
577
+ /* Arrow pointing to button */
578
+ .vidply-menu::after {
579
+ border-left: 6px solid transparent;
580
+ border-right: 6px solid transparent;
581
+ border-top: 6px solid var(--vidply-bg-menu);
582
+ bottom: -6px;
583
+ content: '';
584
+ height: 0;
585
+ position: absolute;
586
+ right: 50%;
587
+ transform: translateX(50%);
588
+ width: 0;
589
+ }
590
+
591
+ /* Volume menu popup */
592
+ .vidply-volume-menu {
593
+ min-width: 50px;
594
+ overflow-y: hidden;
595
+ padding: 16px 12px;
596
+ width: 50px;
597
+ }
598
+
599
+ /* For audio players, show menus below buttons */
600
+ .vidply-player.vidply-audio .vidply-menu {
601
+ bottom: auto;
602
+ top: calc(100% + 8px);
603
+ }
604
+
605
+ .vidply-player.vidply-audio .vidply-menu::after {
606
+ border-bottom: 6px solid var(--vidply-bg-menu);
607
+ border-top: none;
608
+ bottom: auto;
609
+ top: -6px;
610
+ }
611
+
612
+ .vidply-menu-item {
613
+ align-items: center;
614
+ background: transparent;
615
+ border: none;
616
+ color: var(--vidply-white);
617
+ cursor: pointer;
618
+ display: flex;
619
+ font-size: 14px;
620
+ font-weight: 400;
621
+ justify-content: space-between;
622
+ padding: 12px 16px;
623
+ text-align: left;
624
+ transition: background-color 0.15s ease, color 0.15s ease;
625
+ white-space: nowrap;
626
+ width: 100%;
627
+ }
628
+
629
+ .vidply-menu-item:hover {
630
+ background: var(--vidply-primary-20);
631
+ color: var(--vidply-white);
632
+ }
633
+
634
+ .vidply-menu-item:focus {
635
+ background: var(--vidply-primary-25);
636
+ color: var(--vidply-white);
637
+ outline: none;
638
+ }
639
+
640
+ .vidply-menu-item:active {
641
+ background: var(--vidply-primary-30);
642
+ }
643
+
644
+ .vidply-captions-menu .vidply-menu-item:hover,
645
+ .vidply-captions-menu .vidply-menu-item:focus,
646
+ .vidply-speed-menu .vidply-menu-item:hover,
647
+ .vidply-speed-menu .vidply-menu-item:focus {
648
+ text-decoration: underline;
649
+ }
650
+
651
+ .vidply-menu-item:hover .vidply-chapter-title,
652
+ .vidply-menu-item:focus .vidply-chapter-title {
653
+ text-decoration: underline;
654
+ }
655
+
656
+ .vidply-menu-item-active {
657
+ background: var(--vidply-primary-15);
658
+ color: var(--vidply-primary-light);
659
+ }
660
+
661
+ .vidply-menu-item-active .vidply-icon {
662
+ color: var(--vidply-primary-light);
663
+ height: 20px;
664
+ width: 20px;
665
+ }
666
+
667
+ .vidply-menu-item-with-value {
668
+ align-items: center;
669
+ display: flex;
670
+ gap: 20px;
671
+ justify-content: space-between;
672
+ }
673
+
674
+ .vidply-menu-item-label {
675
+ align-items: center;
676
+ display: flex;
677
+ flex: 1;
678
+ gap: 10px;
679
+ }
680
+
681
+ .vidply-menu-item-label .vidply-icon {
682
+ height: 24px;
683
+ opacity: 0.9;
684
+ width: 24px;
685
+ }
686
+
687
+ .vidply-menu-item-value {
688
+ background: var(--vidply-white-10);
689
+ border-radius: 4px;
690
+ color: var(--vidply-text-muted);
691
+ font-size: 13px;
692
+ font-weight: 500;
693
+ padding: 2px 8px;
694
+ white-space: nowrap;
695
+ }
696
+
697
+ /* Chapter menu specific */
698
+ .vidply-chapter-time {
699
+ color: var(--vidply-text-muted);
700
+ display: inline-block;
701
+ font-family: 'Courier New', monospace;
702
+ font-size: 13px;
703
+ font-weight: 500;
704
+ margin-right: 12px;
705
+ min-width: 60px;
706
+ }
707
+
708
+ .vidply-chapter-title {
709
+ color: var(--vidply-white-95);
710
+ flex: 1;
711
+ }
712
+
713
+ /* Caption style menu */
714
+ .vidply-caption-style-menu.vidply-settings-menu {
715
+ background: var(--vidply-bg-menu);
716
+ padding: 16px;
717
+ }
718
+
719
+ .vidply-style-group {
720
+ margin-bottom: 16px;
721
+ }
722
+
723
+ .vidply-style-group:last-child {
724
+ margin-bottom: 0;
725
+ }
726
+
727
+ .vidply-style-group label {
728
+ font-weight: 500;
729
+ letter-spacing: 0.01em;
730
+ }
731
+
732
+ .vidply-style-select,
733
+ .vidply-style-group input[type="color"],
734
+ .vidply-style-group input[type="range"] {
735
+ -webkit-appearance: none;
736
+ appearance: none;
737
+ }
738
+
739
+ .vidply-style-select {
740
+ outline: none;
741
+ transition: border-color 0.2s ease, background 0.2s ease;
742
+ }
743
+
744
+ .vidply-style-select:hover {
745
+ background: var(--vidply-white-15);
746
+ border-color: var(--vidply-border-hover);
747
+ }
748
+
749
+ .vidply-style-select:focus {
750
+ background: var(--vidply-white-15);
751
+ border-color: var(--vidply-border-focus);
752
+ }
753
+
754
+ .vidply-style-group input[type="color"] {
755
+ outline: none;
756
+ transition: border-color 0.2s ease;
757
+ }
758
+
759
+ .vidply-style-group input[type="color"]:hover {
760
+ border-color: var(--vidply-border-hover);
761
+ }
762
+
763
+ .vidply-style-group input[type="color"]:focus {
764
+ border-color: var(--vidply-border-focus);
765
+ }
766
+
767
+ .vidply-style-group input[type="range"]::-webkit-slider-thumb {
768
+ -webkit-appearance: none;
769
+ appearance: none;
770
+ background: var(--vidply-primary);
771
+ border: 2px solid var(--vidply-white);
772
+ border-radius: 50%;
773
+ box-shadow: var(--vidply-shadow-sm);
774
+ cursor: pointer;
775
+ height: 16px;
776
+ transition: transform 0.15s ease, background 0.15s ease;
777
+ width: 16px;
778
+ }
779
+
780
+ .vidply-style-group input[type="range"]::-webkit-slider-thumb:hover {
781
+ background: var(--vidply-primary-80);
782
+ transform: scale(1.15);
783
+ }
784
+
785
+ .vidply-style-group input[type="range"]::-moz-range-thumb {
786
+ background: var(--vidply-primary);
787
+ border: 2px solid var(--vidply-white);
788
+ border-radius: 50%;
789
+ box-shadow: var(--vidply-shadow-sm);
790
+ cursor: pointer;
791
+ height: 16px;
792
+ transition: transform 0.15s ease, background 0.15s ease;
793
+ width: 16px;
794
+ }
795
+
796
+ .vidply-style-group input[type="range"]::-moz-range-thumb:hover {
797
+ background: var(--vidply-primary-80);
798
+ transform: scale(1.15);
799
+ }
800
+
801
+ .vidply-style-group input[type="range"]::-webkit-slider-runnable-track {
802
+ background: var(--vidply-white-20);
803
+ border-radius: 3px;
804
+ height: 6px;
805
+ width: 100%;
806
+ }
807
+
808
+ .vidply-style-group input[type="range"]::-moz-range-track {
809
+ background: var(--vidply-white-20);
810
+ border-radius: 3px;
811
+ height: 6px;
812
+ width: 100%;
813
+ }
814
+
815
+ /* Captions */
816
+ .vidply-captions {
817
+ background: var(--vidply-bg-caption);
818
+ border-radius: 4px;
819
+ bottom: 16px;
820
+ color: var(--vidply-white);
821
+ display: none;
822
+ font-family: sans-serif;
823
+ font-size: 100%;
824
+ left: 50%;
825
+ line-height: 1.4;
826
+ max-width: 90%;
827
+ padding: 8px 16px;
828
+ pointer-events: none;
829
+ position: absolute;
830
+ text-align: center;
831
+ transform: translateX(-50%);
832
+ transition: bottom 0.3s ease;
833
+ z-index: 5;
834
+ }
835
+
836
+ .vidply-captions:empty {
837
+ display: none;
838
+ }
839
+
840
+ /* Desktop only: Move captions up when controls are visible */
841
+ @media (width >= 641px) {
842
+ .vidply-controls-visible .vidply-captions {
843
+ bottom: 96px;
844
+ }
845
+ }
846
+
847
+ /* Mobile: Always at 121px */
848
+ @media (width <= 640px) {
849
+ .vidply-captions {
850
+ bottom: 122px;
851
+ }
852
+ }
853
+
854
+ /* Settings Dialog */
855
+ .vidply-settings-overlay {
856
+ align-items: center;
857
+ animation: vidply-fade-in 0.2s ease;
858
+ backdrop-filter: blur(8px);
859
+ background: var(--vidply-bg-overlay);
860
+ bottom: 0;
861
+ display: flex;
862
+ justify-content: center;
863
+ left: 0;
864
+ position: absolute;
865
+ right: 0;
866
+ top: 0;
867
+ z-index: 2000;
868
+ }
869
+
870
+ @keyframes vidply-fade-in {
871
+ from {
872
+ opacity: 0;
873
+ }
874
+
875
+ to {
876
+ opacity: 1;
877
+ }
878
+ }
879
+
880
+ .vidply-settings-dialog {
881
+ animation: vidply-slide-up 0.3s ease;
882
+ background: var(--vidply-bg-dialog);
883
+ border: 1px solid var(--vidply-border);
884
+ border-radius: 12px;
885
+ box-shadow: var(--vidply-shadow-lg);
886
+ max-height: 80%;
887
+ max-width: 500px;
888
+ -webkit-overflow-scrolling: touch;
889
+ overflow-y: auto;
890
+ padding: 24px;
891
+
892
+ /* iOS momentum scrolling */
893
+ touch-action: pan-y;
894
+ width: 90%;
895
+ }
896
+
897
+ @keyframes vidply-slide-up {
898
+ from {
899
+ transform: translateY(20px);
900
+ opacity: 0;
901
+ }
902
+
903
+ to {
904
+ transform: translateY(0);
905
+ opacity: 1;
906
+ }
907
+ }
908
+
909
+ .vidply-settings-header {
910
+ align-items: center;
911
+ display: flex;
912
+ justify-content: space-between;
913
+ margin-bottom: 20px;
914
+ }
915
+
916
+ .vidply-settings-header h2 {
917
+ color: var(--vidply-white);
918
+ font-size: 20px;
919
+ font-weight: 600;
920
+ margin: 0;
921
+ }
922
+
923
+ .vidply-settings-close {
924
+ min-height: auto;
925
+ min-width: auto;
926
+ padding: 4px;
927
+ }
928
+
929
+ .vidply-settings-content {
930
+ display: flex;
931
+ flex-direction: column;
932
+ gap: 20px;
933
+ }
934
+
935
+ .vidply-settings-section {
936
+ display: flex;
937
+ flex-direction: column;
938
+ gap: 12px;
939
+ }
940
+
941
+ .vidply-settings-section h3 {
942
+ color: var(--vidply-white);
943
+ font-size: 16px;
944
+ font-weight: 600;
945
+ margin: 0;
946
+ }
947
+
948
+ .vidply-settings-section label {
949
+ color: var(--vidply-white-90);
950
+ display: block;
951
+ font-size: 14px;
952
+ margin-bottom: 4px;
953
+ }
954
+
955
+ .vidply-settings-select,
956
+ .vidply-settings-color,
957
+ .vidply-settings-range {
958
+ background: var(--vidply-white-10);
959
+ border: 1px solid var(--vidply-white-20);
960
+ border-radius: 6px;
961
+ color: var(--vidply-white);
962
+ font-size: 14px;
963
+ padding: 8px 12px;
964
+ transition: border-color 0.2s ease, background 0.2s ease;
965
+ width: 100%;
966
+ }
967
+
968
+ /* Fix select option colors - black text on white background */
969
+ .vidply-settings-select option {
970
+ background: #fff;
971
+ color: #000;
972
+ }
973
+
974
+ .vidply-settings-select:hover,
975
+ .vidply-settings-color:hover,
976
+ .vidply-settings-range:hover {
977
+ background: var(--vidply-white-15);
978
+ border-color: var(--vidply-border-hover);
979
+ }
980
+
981
+ .vidply-settings-select:focus,
982
+ .vidply-settings-color:focus,
983
+ .vidply-settings-range:focus {
984
+ background: var(--vidply-white-15);
985
+ border-color: var(--vidply-border-focus);
986
+ box-shadow: 0 0 0 3px var(--vidply-primary-20);
987
+ outline: none;
988
+ }
989
+
990
+ .vidply-settings-control {
991
+ display: flex;
992
+ flex-direction: column;
993
+ gap: 8px;
994
+ }
995
+
996
+ .vidply-settings-value {
997
+ color: var(--vidply-text-muted);
998
+ display: inline-block;
999
+ font-size: 13px;
1000
+ min-width: 40px;
1001
+ text-align: right;
1002
+ }
1003
+
1004
+ .vidply-settings-footer {
1005
+ border-top: 1px solid var(--vidply-white-10);
1006
+ display: flex;
1007
+ justify-content: flex-end;
1008
+ margin-top: 20px;
1009
+ padding-top: 20px;
1010
+ }
1011
+
1012
+ .vidply-settings-footer .vidply-button {
1013
+ background: var(--vidply-white-10);
1014
+ border-radius: 6px;
1015
+ min-width: auto;
1016
+ padding: 10px 20px;
1017
+ }
1018
+
1019
+ .vidply-settings-footer .vidply-button:hover {
1020
+ background: var(--vidply-white-20);
1021
+ }
1022
+
1023
+ /* Fullscreen Styles */
1024
+ .vidply-player.vidply-fullscreen,
1025
+ .vidply-player:fullscreen {
1026
+ height: 100vh;
1027
+ max-width: none;
1028
+ width: 100vw;
1029
+ }
1030
+
1031
+ /* Transcript in Fullscreen */
1032
+ .vidply-player.vidply-fullscreen .vidply-transcript-window,
1033
+ .vidply-player:fullscreen .vidply-transcript-window {
1034
+ bottom: 80px !important;
1035
+ height: auto !important;
1036
+ left: auto !important;
1037
+ max-height: calc(100vh - 180px) !important;
1038
+ max-width: 400px;
1039
+ position: fixed !important;
1040
+ right: 20px !important;
1041
+ top: auto !important;
1042
+ width: 400px;
1043
+ }
1044
+
1045
+ /* Loading State */
1046
+ .vidply-loading {
1047
+ display: none;
1048
+ height: 50px;
1049
+ left: 50%;
1050
+ position: absolute;
1051
+ top: 50%;
1052
+ transform: translate(-50%, -50%);
1053
+ width: 50px;
1054
+ }
1055
+
1056
+ .vidply-player.vidply-buffering .vidply-loading {
1057
+ display: block;
1058
+ }
1059
+
1060
+ .vidply-loading::after {
1061
+ animation: vidply-spin 0.8s linear infinite;
1062
+ border: 4px solid var(--vidply-white-20);
1063
+ border-radius: 50%;
1064
+ border-top-color: var(--vidply-white);
1065
+ content: '';
1066
+ display: block;
1067
+ height: 100%;
1068
+ width: 100%;
1069
+ }
1070
+
1071
+ @keyframes vidply-spin {
1072
+ to {
1073
+ transform: rotate(360deg);
1074
+ }
1075
+ }
1076
+
1077
+ /* Screen Reader Only */
1078
+ .vidply-sr-only {
1079
+ height: 1px;
1080
+ left: -10000px;
1081
+ overflow: hidden;
1082
+ position: absolute;
1083
+ width: 1px;
1084
+ }
1085
+
1086
+ /* High Contrast Mode Support */
1087
+ @media (prefers-contrast: high) {
1088
+ .vidply-controls {
1089
+ background: var(--vidply-black);
1090
+ }
1091
+
1092
+ .vidply-button:focus {
1093
+ outline: 3px solid;
1094
+ }
1095
+
1096
+ .vidply-progress-played {
1097
+ background: currentcolor;
1098
+ }
1099
+ }
1100
+
1101
+ /* Reduced Motion Support */
1102
+ @media (prefers-reduced-motion: reduce) {
1103
+ .vidply-player *,
1104
+ .vidply-player *::before,
1105
+ .vidply-player *::after {
1106
+ animation-duration: 0.01ms !important;
1107
+ animation-iteration-count: 1 !important;
1108
+ transition-duration: 0.01ms !important;
1109
+ }
1110
+ }
1111
+
1112
+ /* Dark Mode (default) - additional contrast */
1113
+ @media (prefers-color-scheme: dark) {
1114
+ .vidply-settings-dialog {
1115
+ background: var(--vidply-bg-dialog-dark);
1116
+ }
1117
+ }
1118
+
1119
+ /* Touch Device Optimizations */
1120
+ @media (hover: none) and (pointer: coarse) {
1121
+ .vidply-button {
1122
+ min-height: 48px;
1123
+ min-width: 48px;
1124
+ }
1125
+
1126
+ .vidply-progress-container {
1127
+ height: 10px;
1128
+ }
1129
+
1130
+ .vidply-menu-item {
1131
+ font-size: 16px;
1132
+ padding: 16px 20px;
1133
+ }
1134
+ }
1135
+
1136
+ /* Responsive Breakpoints */
1137
+ @media (width <= 640px) {
1138
+ .vidply-controls {
1139
+ padding: 16px 12px 12px;
1140
+ }
1141
+
1142
+ .vidply-time {
1143
+ font-size: 11px;
1144
+ }
1145
+
1146
+ .vidply-speed-text {
1147
+ display: none;
1148
+ }
1149
+
1150
+ .vidply-settings-dialog {
1151
+ animation: slideUpFromBottom 0.3s ease;
1152
+ border-radius: 16px 16px 0 0;
1153
+ bottom: 0;
1154
+ margin: 0;
1155
+ max-height: 90vh;
1156
+ max-width: 100%;
1157
+ padding: 20px;
1158
+ position: fixed;
1159
+ top: auto;
1160
+ width: 100%;
1161
+ }
1162
+
1163
+ .vidply-settings-overlay {
1164
+ align-items: flex-end;
1165
+ }
1166
+
1167
+ /* Bottom sheet style for menus - positioned within controls */
1168
+ .vidply-menu {
1169
+ border-radius: 8px;
1170
+ bottom: calc(100% + 4px);
1171
+ left: 50%;
1172
+ max-height: 250px;
1173
+ min-width: 200px;
1174
+ position: absolute;
1175
+ right: auto;
1176
+ top: auto;
1177
+ transform: translateX(-50%);
1178
+ width: auto;
1179
+ z-index: 200;
1180
+ }
1181
+
1182
+ .vidply-menu::after {
1183
+ border-bottom: 6px solid var(--vidply-bg-menu);
1184
+ border-left: 6px solid transparent;
1185
+ border-right: 6px solid transparent;
1186
+ border-top: none;
1187
+ bottom: -6px;
1188
+ content: '';
1189
+ height: 0;
1190
+ left: 50%;
1191
+ position: absolute;
1192
+ transform: translateX(-50%);
1193
+ width: 0;
1194
+ }
1195
+
1196
+ /* Remove the drag handle on mobile menus */
1197
+ .vidply-menu::before {
1198
+ display: none;
1199
+ }
1200
+
1201
+ /* Caption style menu - narrower on mobile */
1202
+ .vidply-caption-style-menu.vidply-settings-menu {
1203
+ left: 50%;
1204
+ max-width: calc(100vw - 40px);
1205
+ min-width: 280px;
1206
+ padding: 16px;
1207
+ transform: translateX(-50%);
1208
+ width: auto;
1209
+ }
1210
+
1211
+ .vidply-style-group {
1212
+ margin-bottom: 20px;
1213
+ }
1214
+
1215
+ .vidply-style-group label {
1216
+ font-size: 14px;
1217
+ margin-bottom: 8px;
1218
+ }
1219
+
1220
+ .vidply-style-select,
1221
+ .vidply-style-group input[type="color"] {
1222
+ font-size: 16px;
1223
+ padding: 12px;
1224
+ }
1225
+
1226
+ /* Stack controls vertically on mobile */
1227
+ .vidply-controls-buttons {
1228
+ flex-direction: column;
1229
+ gap: 8px;
1230
+ width: 100%;
1231
+ }
1232
+
1233
+ .vidply-controls-left,
1234
+ .vidply-controls-right {
1235
+ flex-wrap: wrap;
1236
+ justify-content: center;
1237
+ width: 100%;
1238
+ }
1239
+
1240
+ /* Smaller buttons and icons */
1241
+ .vidply-button {
1242
+ min-height: 36px;
1243
+ min-width: 36px;
1244
+ padding: 5px;
1245
+ }
1246
+
1247
+ .vidply-icon {
1248
+ height: 22px;
1249
+ width: 22px;
1250
+ }
1251
+
1252
+ /* Reduce gaps */
1253
+ .vidply-controls-left,
1254
+ .vidply-controls-right {
1255
+ gap: 4px;
1256
+ }
1257
+ }
1258
+
1259
+ @keyframes slideUpFromBottom {
1260
+ from {
1261
+ transform: translateY(100%);
1262
+ opacity: 0;
1263
+ }
1264
+
1265
+ to {
1266
+ transform: translateY(0);
1267
+ opacity: 1;
1268
+ }
1269
+ }
1270
+
1271
+ /* Landscape mobile optimization */
1272
+ @media (width <= 896px) and (orientation: landscape) {
1273
+ .vidply-menu {
1274
+ max-height: 50vh;
1275
+ }
1276
+
1277
+ .vidply-transcript-window {
1278
+ max-height: 70vh;
1279
+ }
1280
+
1281
+ .vidply-settings-dialog {
1282
+ max-height: 80vh;
1283
+ }
1284
+ }
1285
+
1286
+ /* Extra small screens */
1287
+ @media (width <= 480px) {
1288
+ .vidply-speed-text {
1289
+ display: none;
1290
+ }
1291
+
1292
+ .vidply-button {
1293
+ min-height: 32px;
1294
+ min-width: 32px;
1295
+ padding: 4px;
1296
+ }
1297
+
1298
+ .vidply-icon {
1299
+ height: 20px;
1300
+ width: 20px;
1301
+ }
1302
+ }
1303
+
1304
+ /* Focus Visible Polyfill */
1305
+ .vidply-player :focus:not(:focus-visible) {
1306
+ outline: none;
1307
+ }
1308
+
1309
+ .vidply-player :focus-visible {
1310
+ outline: var(--vidply-focus-outline-white);
1311
+ outline-offset: 2px;
1312
+ }
1313
+
1314
+ /* Print Styles */
1315
+ @media print {
1316
+ .vidply-controls {
1317
+ display: none;
1318
+ }
1319
+ }
1320
+
1321
+ /* ============================================================================
1322
+ Playlist Styles
1323
+ ============================================================================ */
1324
+
1325
+ /* Track Info Display (below video, above playlist) */
1326
+ .vidply-track-info {
1327
+ background: var(--vidply-bg-track-info);
1328
+ border-bottom: 1px solid var(--vidply-border-light);
1329
+ order: 2; /* After video-wrapper */
1330
+ padding: 16px 20px;
1331
+ }
1332
+
1333
+ .vidply-track-number {
1334
+ color: var(--vidply-text-muted);
1335
+ font-size: 12px;
1336
+ letter-spacing: 0.5px;
1337
+ margin-bottom: 4px;
1338
+ text-transform: uppercase;
1339
+ }
1340
+
1341
+ .vidply-track-title {
1342
+ color: var(--vidply-white);
1343
+ font-size: 18px;
1344
+ font-weight: 600;
1345
+ margin-bottom: 4px;
1346
+ }
1347
+
1348
+ .vidply-track-artist {
1349
+ color: var(--vidply-white-80);
1350
+ font-size: 14px;
1351
+ }
1352
+
1353
+ /* Playlist Panel */
1354
+ .vidply-playlist-panel {
1355
+ background: var(--vidply-bg-playlist);
1356
+ border-top: 1px solid var(--vidply-border-light);
1357
+ max-height: 400px;
1358
+ order: 3; /* After track info */
1359
+ -webkit-overflow-scrolling: touch;
1360
+
1361
+ /* iOS momentum scrolling */
1362
+ overflow-y: auto;
1363
+ touch-action: pan-y;
1364
+ }
1365
+
1366
+ .vidply-playlist-header {
1367
+ background: var(--vidply-bg-playlist-header);
1368
+ border-bottom: 1px solid var(--vidply-border-light);
1369
+ color: var(--vidply-white-90);
1370
+ font-size: 13px;
1371
+ font-weight: 600;
1372
+ letter-spacing: 0.5px;
1373
+ padding: 12px 16px;
1374
+ position: sticky;
1375
+ text-transform: uppercase;
1376
+ top: 0;
1377
+ z-index: 10;
1378
+ }
1379
+
1380
+ .vidply-playlist-list {
1381
+ padding: 4px 0;
1382
+ }
1383
+
1384
+ /* Playlist Items */
1385
+ .vidply-playlist-item {
1386
+ align-items: center;
1387
+ background: transparent;
1388
+ border-left: 3px solid transparent;
1389
+ cursor: pointer;
1390
+ display: flex;
1391
+ gap: 12px;
1392
+ padding: 12px 16px;
1393
+ transition: all 0.2s ease;
1394
+ }
1395
+
1396
+ .vidply-playlist-item:hover {
1397
+ background: var(--vidply-active-bg);
1398
+ border-left-color: var(--vidply-primary-50);
1399
+ }
1400
+
1401
+ .vidply-playlist-item:focus {
1402
+ background: var(--vidply-white-08);
1403
+ border-left-color: var(--vidply-primary);
1404
+ outline: none;
1405
+ }
1406
+
1407
+ .vidply-playlist-item-active {
1408
+ background: var(--vidply-primary-15);
1409
+ border-left-color: var(--vidply-primary);
1410
+ }
1411
+
1412
+ .vidply-playlist-item-active:hover {
1413
+ background: var(--vidply-primary-20);
1414
+ }
1415
+
1416
+ /* Playlist Thumbnail */
1417
+ .vidply-playlist-thumbnail {
1418
+ align-items: center;
1419
+ background-color: var(--vidply-white-10);
1420
+ background-position: center;
1421
+ background-size: cover;
1422
+ border-radius: 4px;
1423
+ display: flex;
1424
+ flex-shrink: 0;
1425
+ height: 45px;
1426
+ justify-content: center;
1427
+ overflow: hidden;
1428
+ width: 80px;
1429
+ }
1430
+
1431
+ .vidply-playlist-thumbnail-icon {
1432
+ color: var(--vidply-text-subtle);
1433
+ height: 32px;
1434
+ transition: all 0.2s ease;
1435
+ width: 32px;
1436
+ }
1437
+
1438
+ .vidply-playlist-item:hover .vidply-playlist-thumbnail-icon {
1439
+ color: var(--vidply-text-muted);
1440
+ transform: scale(1.1);
1441
+ }
1442
+
1443
+ .vidply-playlist-item-active .vidply-playlist-thumbnail-icon {
1444
+ color: var(--vidply-primary-light);
1445
+ }
1446
+
1447
+ /* Playlist Item Info */
1448
+ .vidply-playlist-item-info {
1449
+ flex: 1;
1450
+ min-width: 0;
1451
+ }
1452
+
1453
+ .vidply-playlist-item-title {
1454
+ color: var(--vidply-white);
1455
+ font-size: 14px;
1456
+ font-weight: 500;
1457
+ margin-bottom: 4px;
1458
+ overflow: hidden;
1459
+ text-overflow: ellipsis;
1460
+ white-space: nowrap;
1461
+ }
1462
+
1463
+ .vidply-playlist-item-active .vidply-playlist-item-title {
1464
+ color: var(--vidply-primary-light);
1465
+ }
1466
+
1467
+ .vidply-playlist-item-artist {
1468
+ color: var(--vidply-text-disabled);
1469
+ font-size: 12px;
1470
+ overflow: hidden;
1471
+ text-overflow: ellipsis;
1472
+ white-space: nowrap;
1473
+ }
1474
+
1475
+ /* Playlist Item Icon */
1476
+ .vidply-playlist-item-icon {
1477
+ flex-shrink: 0;
1478
+ height: 20px;
1479
+ opacity: 0;
1480
+ transition: opacity 0.2s ease;
1481
+ width: 20px;
1482
+ }
1483
+
1484
+ .vidply-playlist-item:hover .vidply-playlist-item-icon,
1485
+ .vidply-playlist-item-active .vidply-playlist-item-icon {
1486
+ opacity: 0.7;
1487
+ }
1488
+
1489
+ .vidply-playlist-item-active .vidply-playlist-item-icon {
1490
+ color: var(--vidply-primary-light);
1491
+ opacity: 1;
1492
+ }
1493
+
1494
+ /* Playlist Scrollbar */
1495
+ .vidply-playlist-panel::-webkit-scrollbar {
1496
+ width: 8px;
1497
+ }
1498
+
1499
+ .vidply-playlist-panel::-webkit-scrollbar-track {
1500
+ background: var(--vidply-black-30);
1501
+ }
1502
+
1503
+ .vidply-playlist-panel::-webkit-scrollbar-thumb {
1504
+ background: var(--vidply-white-20);
1505
+ border-radius: 4px;
1506
+ }
1507
+
1508
+ .vidply-playlist-panel::-webkit-scrollbar-thumb:hover {
1509
+ background: var(--vidply-border-hover);
1510
+ }
1511
+
1512
+ /* Audio Player with Playlist */
1513
+ .vidply-player.vidply-audio.vidply-has-playlist {
1514
+ min-height: 200px;
1515
+ }
1516
+
1517
+ .vidply-player.vidply-audio.vidply-has-playlist audio {
1518
+ display: none;
1519
+ }
1520
+
1521
+ .vidply-player.vidply-audio.vidply-has-playlist .vidply-video-wrapper {
1522
+ flex: 1;
1523
+ }
1524
+
1525
+ .vidply-player.vidply-audio.vidply-has-playlist .vidply-controls {
1526
+ margin-top: auto;
1527
+ }
1528
+
1529
+ /* Transcript Window */
1530
+ .vidply-transcript-window {
1531
+ backdrop-filter: blur(10px);
1532
+ background: var(--vidply-bg-transcript);
1533
+ border: 1px solid var(--vidply-border);
1534
+ border-radius: 8px;
1535
+ box-shadow: 0 10px 40px var(--vidply-black-60);
1536
+ display: none;
1537
+ flex-direction: column;
1538
+ max-width: 400px;
1539
+ order: 4; /* After video-wrapper (1), track-info (2), and playlist-panel (3) */
1540
+ position: absolute;
1541
+ top: 0;
1542
+ width: 400px;
1543
+ z-index: 100;
1544
+ }
1545
+
1546
+ /* Minimum height for audio player transcript */
1547
+ .vidply-player.vidply-audio .vidply-transcript-window {
1548
+ min-height: 200px;
1549
+ }
1550
+
1551
+ .vidply-transcript-header {
1552
+ align-items: center;
1553
+ background: var(--vidply-active-bg);
1554
+ border-bottom: 1px solid var(--vidply-border-light);
1555
+ border-radius: 8px 8px 0 0;
1556
+ cursor: move;
1557
+ display: flex;
1558
+ justify-content: space-between;
1559
+ padding: 16px 20px;
1560
+ user-select: none;
1561
+ }
1562
+
1563
+ .vidply-transcript-header h3 {
1564
+ color: var(--vidply-white);
1565
+ font-size: 16px;
1566
+ font-weight: 600;
1567
+ margin: 0;
1568
+ }
1569
+
1570
+ .vidply-transcript-close {
1571
+ align-items: center;
1572
+ background: transparent;
1573
+ border: none;
1574
+ border-radius: 4px;
1575
+ color: var(--vidply-text-muted);
1576
+ cursor: pointer;
1577
+ display: flex;
1578
+ height: 28px;
1579
+ justify-content: center;
1580
+ padding: 4px;
1581
+ transition: all 0.2s ease;
1582
+ width: 28px;
1583
+ }
1584
+
1585
+ .vidply-transcript-close:hover {
1586
+ background: var(--vidply-white-10);
1587
+ color: var(--vidply-white);
1588
+ }
1589
+
1590
+ .vidply-transcript-close .vidply-icon {
1591
+ height: 18px;
1592
+ width: 18px;
1593
+ }
1594
+
1595
+ .vidply-transcript-content {
1596
+ flex: 1;
1597
+ -webkit-overflow-scrolling: touch;
1598
+ overflow-y: auto;
1599
+
1600
+ /* iOS momentum scrolling */
1601
+ padding: 12px 0;
1602
+ touch-action: pan-y;
1603
+ }
1604
+
1605
+ .vidply-transcript-entry {
1606
+ border-left: 3px solid transparent;
1607
+ cursor: pointer;
1608
+ padding: 12px 20px;
1609
+ transition: background 0.2s ease;
1610
+ }
1611
+
1612
+ .vidply-transcript-entry:hover,
1613
+ .vidply-transcript-entry:focus {
1614
+ background: var(--vidply-active-bg);
1615
+ }
1616
+
1617
+ .vidply-transcript-entry-active {
1618
+ background: var(--vidply-primary-15);
1619
+ border-left-color: var(--vidply-primary-light);
1620
+ }
1621
+
1622
+ .vidply-transcript-time {
1623
+ color: var(--vidply-primary-light);
1624
+ font-family: 'Courier New', monospace;
1625
+ font-size: 14px;
1626
+ font-weight: 600;
1627
+ margin-bottom: 4px;
1628
+ margin-right: 8px;
1629
+ }
1630
+
1631
+ .vidply-transcript-text {
1632
+ color: var(--vidply-white-90);
1633
+ font-size: 14px;
1634
+ line-height: 1.6;
1635
+ }
1636
+
1637
+ .vidply-transcript-entry-active .vidply-transcript-text {
1638
+ color: var(--vidply-white);
1639
+ text-decoration: underline;
1640
+ }
1641
+
1642
+ .vidply-transcript-entry:hover .vidply-transcript-text,
1643
+ .vidply-transcript-entry:focus .vidply-transcript-text {
1644
+ text-decoration: underline;
1645
+ }
1646
+
1647
+ /* Transcript Scrollbar */
1648
+ .vidply-transcript-content::-webkit-scrollbar {
1649
+ width: 8px;
1650
+ }
1651
+
1652
+ .vidply-transcript-content::-webkit-scrollbar-track {
1653
+ background: var(--vidply-black-30);
1654
+ }
1655
+
1656
+ .vidply-transcript-content::-webkit-scrollbar-thumb {
1657
+ background: var(--vidply-white-20);
1658
+ border-radius: 4px;
1659
+ }
1660
+
1661
+ .vidply-transcript-content::-webkit-scrollbar-thumb:hover {
1662
+ background: var(--vidply-border-hover);
1663
+ }
1664
+
1665
+ /* Responsive Adjustments */
1666
+ @media (width <= 640px) {
1667
+ .vidply-playlist-thumbnail {
1668
+ height: 34px;
1669
+ width: 60px;
1670
+ }
1671
+
1672
+ .vidply-playlist-item {
1673
+ gap: 10px;
1674
+ padding: 10px 12px;
1675
+ }
1676
+
1677
+ .vidply-track-info {
1678
+ padding: 12px 16px;
1679
+ }
1680
+
1681
+ .vidply-track-title {
1682
+ font-size: 16px;
1683
+ }
1684
+
1685
+ /* Mobile transcript underneath video and controls */
1686
+ .vidply-transcript-window {
1687
+ border: none;
1688
+ border-radius: 0;
1689
+ border-top: 1px solid var(--vidply-border-light);
1690
+ box-shadow: none;
1691
+ order: 3; /* After controls (which are order: 2) */
1692
+ position: relative;
1693
+ width: 100%;
1694
+ z-index: 50;
1695
+ }
1696
+
1697
+ .vidply-transcript-header {
1698
+ border-radius: 0;
1699
+ padding: 12px 16px;
1700
+ }
1701
+
1702
+ .vidply-transcript-content {
1703
+ max-height: 400px;
1704
+ }
1705
+
1706
+ /* Don't show dragging cursor on mobile */
1707
+ .vidply-transcript-header {
1708
+ cursor: default !important;
1709
+ }
1710
+ }
1711
+