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