vidply 1.0.5 → 1.0.7

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.
@@ -1,1807 +1,2422 @@
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
- .vidply-player.vidply-audio .vidply-menu {
149
- max-height: 150px;
150
- }
151
-
152
- /* Video/Audio Element */
153
- .vidply-player video,
154
- .vidply-player audio {
155
- display: block;
156
- height: 100%;
157
- object-fit: contain;
158
- width: 100%;
159
- }
160
-
161
- /* Mobile: Video element order and sizing */
162
- @media (width <= 640px) {
163
- .vidply-player video,
164
- .vidply-player audio {
165
- flex: 0 0 auto; /* Don't grow or shrink */
166
- height: auto;
167
- order: 1; /* Before controls */
168
- }
169
- }
170
-
171
- /* Hide native browser captions - we'll display our own */
172
- .vidply-player video::cue {
173
- display: none;
174
- }
175
-
176
- .vidply-player video::-webkit-media-text-track-container {
177
- display: none !important;
178
- }
179
-
180
- .vidply-player video::-webkit-media-text-track-display {
181
- display: none !important;
182
- }
183
-
184
- /* Video wrapper for proper clipping */
185
- .vidply-video-wrapper {
186
- background: linear-gradient(135deg, var(--vidply-black) 0%, #2a2a2a 100%);
187
- height: 100%;
188
- order: 1; /* First in flex order */
189
- overflow: hidden;
190
- position: relative;
191
- width: 100%;
192
- z-index: 1; /* Base video layer */
193
- }
194
-
195
- /* Mobile: Simplify video wrapper */
196
- @media (width <= 640px) {
197
- .vidply-video-wrapper {
198
- display: block;
199
- height: auto;
200
- overflow: visible;
201
- }
202
- }
203
-
204
- /* For audio players, allow menus to overflow */
205
- .vidply-player.vidply-audio .vidply-video-wrapper {
206
- overflow: visible;
207
- }
208
-
209
- /* Hide fullscreen button in audio players */
210
- .vidply-player.vidply-audio .vidply-fullscreen {
211
- display: none;
212
- }
213
-
214
- /* Centered Play Button Overlay */
215
- .vidply-play-overlay {
216
- cursor: pointer;
217
- filter: drop-shadow(0 8px 32px rgb(0 0 0 / 30%));
218
- left: 50%;
219
- position: absolute;
220
- top: 50%;
221
- transform: translate(-50%, -50%);
222
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
223
- z-index: 2;
224
- }
225
-
226
- .vidply-play-overlay:hover {
227
- filter: drop-shadow(0 12px 48px rgb(0 0 0 / 40%));
228
- transform: translate(-50%, -50%) scale(1.1);
229
- }
230
-
231
- .vidply-play-overlay:hover .vidply-play-overlay-bg {
232
- fill: rgb(255 255 255 / 100%);
233
- }
234
-
235
- .vidply-play-overlay:active {
236
- transform: translate(-50%, -50%) scale(0.95);
237
- }
238
-
239
- /* Hide play overlay in audio players */
240
- .vidply-player.vidply-audio .vidply-play-overlay {
241
- display: none;
242
- }
243
-
244
- /* Controls Container */
245
- .vidply-controls {
246
- background: linear-gradient(to top, var(--vidply-black-90) 0%, var(--vidply-black-50) 100%);
247
- bottom: 0;
248
- left: 0;
249
- opacity: 0;
250
- overflow: visible;
251
- padding: 20px 16px 16px;
252
- pointer-events: none;
253
- position: absolute;
254
- right: 0;
255
- transition: opacity 0.3s ease;
256
- z-index: 10;
257
- }
258
-
259
- .vidply-controls.vidply-controls-visible,
260
- .vidply-player:hover .vidply-controls,
261
- .vidply-player.vidply-paused .vidply-controls {
262
- opacity: 1;
263
- pointer-events: auto;
264
- }
265
-
266
- /* For audio players, always show controls */
267
- .vidply-audio .vidply-controls {
268
- background: var(--vidply-black-50);
269
- opacity: 1;
270
- pointer-events: auto;
271
- position: relative;
272
- }
273
-
274
- /* Mobile: Controls underneath video */
275
- @media (width <= 640px) {
276
- .vidply-controls {
277
- background: var(--vidply-black-90);
278
- border-top: 1px solid var(--vidply-border-light);
279
- bottom: auto;
280
- left: 0;
281
- opacity: 1;
282
- order: 2; /* After video-wrapper (1) */
283
- padding: 12px;
284
- pointer-events: auto;
285
- position: relative;
286
- right: 0;
287
- width: 100%;
288
- z-index: 10;
289
- }
290
-
291
- /* Allow menus to position within controls */
292
- .vidply-controls-buttons,
293
- .vidply-controls-left,
294
- .vidply-controls-right {
295
- position: relative;
296
- }
297
- }
298
-
299
- /* Progress Bar */
300
- .vidply-progress-container {
301
- background: var(--vidply-white-20);
302
- border-radius: 3px;
303
- cursor: pointer;
304
- height: 5px;
305
- margin-bottom: 12px;
306
- position: relative;
307
- transition: height 0.2s ease;
308
- width: 100%;
309
- }
310
-
311
- .vidply-progress-container:hover,
312
- .vidply-progress-container:focus {
313
- height: 8px;
314
- }
315
-
316
- .vidply-progress-container:focus {
317
- outline: var(--vidply-focus-outline-white);
318
- outline-offset: 2px;
319
- }
320
-
321
- .vidply-progress-buffered {
322
- background: var(--vidply-white-40);
323
- border-radius: 3px;
324
- height: 100%;
325
- left: 0;
326
- position: absolute;
327
- top: 0;
328
- transition: width 0.2s ease;
329
- width: 0;
330
- }
331
-
332
- .vidply-progress-played {
333
- background: var(--vidply-primary-light);
334
- border-radius: 3px;
335
- height: 100%;
336
- left: 0;
337
- position: absolute;
338
- top: 0;
339
- transition: width 0.1s linear;
340
- width: 0;
341
- }
342
-
343
- .vidply-progress-handle {
344
- background: var(--vidply-white);
345
- border-radius: 50%;
346
- box-shadow: var(--vidply-shadow-sm);
347
- height: 12px;
348
- opacity: 0;
349
- position: absolute;
350
- right: -6px;
351
- top: 50%;
352
- transform: translateY(-50%);
353
- transition: opacity 0.2s ease;
354
- width: 12px;
355
- }
356
-
357
- .vidply-progress-container:hover .vidply-progress-handle,
358
- .vidply-progress-container:focus .vidply-progress-handle {
359
- opacity: 1;
360
- }
361
-
362
- .vidply-progress-tooltip {
363
- background: var(--vidply-black-90);
364
- border-radius: 4px;
365
- bottom: 12px;
366
- color: var(--vidply-white);
367
- display: none;
368
- font-size: 12px;
369
- padding: 4px 8px;
370
- pointer-events: none;
371
- position: absolute;
372
- transform: translateX(-50%);
373
- white-space: nowrap;
374
- }
375
-
376
- /* Button Container */
377
- .vidply-controls-buttons {
378
- align-items: center;
379
- display: flex;
380
- gap: 8px;
381
- justify-content: space-between;
382
- }
383
-
384
- .vidply-controls-left,
385
- .vidply-controls-right {
386
- align-items: center;
387
- display: flex;
388
- gap: 8px;
389
- overflow: visible;
390
- position: relative;
391
- }
392
-
393
-
394
- /* Buttons */
395
- .vidply-button {
396
- align-items: center;
397
- background: transparent;
398
- border: none;
399
- border-radius: 4px;
400
- color: var(--vidply-white);
401
- cursor: pointer;
402
- display: inline-flex;
403
- justify-content: center;
404
- min-height: 32px;
405
- min-width: 32px;
406
- padding: 6px;
407
- position: relative;
408
- transition: background-color 0.2s ease, transform 0.1s ease;
409
- }
410
-
411
- .vidply-button:hover {
412
- background: var(--vidply-hover-bg);
413
- }
414
-
415
- .vidply-button:active {
416
- transform: scale(0.95);
417
- }
418
-
419
- .vidply-button:focus {
420
- outline: var(--vidply-focus-outline-white);
421
- outline-offset: 2px;
422
- }
423
-
424
- .vidply-button:focus:not(:focus-visible) {
425
- outline: none;
426
- }
427
-
428
- .vidply-button:disabled {
429
- cursor: not-allowed;
430
- opacity: 0.5;
431
- }
432
-
433
- /* Icons */
434
- .vidply-icon {
435
- display: inline-block;
436
- fill: currentcolor;
437
- height: 26px;
438
- width: 26px;
439
- }
440
-
441
- .vidply-icon svg {
442
- display: block;
443
- height: 100%;
444
- width: 100%;
445
- }
446
-
447
- /* Volume Control */
448
- .vidply-volume-slider {
449
- background: var(--vidply-white-20);
450
- border-radius: 3px;
451
- cursor: pointer;
452
- height: 100px;
453
- margin: 0 auto;
454
- position: relative;
455
- width: 6px;
456
- }
457
-
458
- .vidply-volume-slider:focus {
459
- outline: var(--vidply-focus-outline-white);
460
- outline-offset: 2px;
461
- }
462
-
463
- .vidply-volume-track {
464
- height: 100%;
465
- position: relative;
466
- width: 100%;
467
- }
468
-
469
- .vidply-volume-fill {
470
- background: var(--vidply-primary-light);
471
- border-radius: 2px;
472
- bottom: 0;
473
- height: 80%;
474
- left: 0;
475
- position: absolute;
476
- transition: height 0.1s ease;
477
- width: 100%;
478
- }
479
-
480
- .vidply-volume-handle {
481
- background: var(--vidply-white);
482
- border-radius: 50%;
483
- box-shadow: var(--vidply-shadow-sm);
484
- height: 10px;
485
- left: 50%;
486
- position: absolute;
487
- top: -4px;
488
- transform: translateX(-50%);
489
- width: 10px;
490
- }
491
-
492
- /* Time Display */
493
- .vidply-time {
494
- align-items: center;
495
- color: #fff;
496
- display: flex;
497
- font-size: 13px;
498
- font-variant-numeric: tabular-nums;
499
- gap: 4px;
500
- padding: 0 4px;
501
- user-select: none;
502
- }
503
-
504
- /* Speed Button */
505
- .vidply-speed {
506
- gap: 4px;
507
- }
508
-
509
- .vidply-speed-text {
510
- font-size: 12px;
511
- min-width: 28px;
512
- text-align: center;
513
- }
514
-
515
- /* Menu Backdrop (for mobile) */
516
- .vidply-menu-backdrop {
517
- animation: fadeIn 0.2s ease;
518
- background: rgb(0 0 0 / 50%);
519
- bottom: 0;
520
- display: none;
521
- left: 0;
522
- position: fixed;
523
- right: 0;
524
- top: 0;
525
- z-index: 19;
526
- }
527
-
528
- .vidply-menu-backdrop.visible {
529
- display: block;
530
- }
531
-
532
- /* Mobile: Don't use backdrop, menus position above buttons */
533
- @media (width <= 640px) {
534
- .vidply-menu-backdrop {
535
- display: none !important;
536
- }
537
- }
538
-
539
- @keyframes fadeIn {
540
- from {
541
- opacity: 0;
542
- }
543
-
544
- to {
545
- opacity: 1;
546
- }
547
- }
548
-
549
- /* Menus */
550
- .vidply-menu {
551
- backdrop-filter: blur(10px);
552
- background: var(--vidply-bg-menu);
553
- border: 1px solid var(--vidply-border);
554
- border-radius: 8px;
555
- bottom: calc(100% + 8px);
556
- box-shadow: var(--vidply-shadow-lg), 0 0 0 1px var(--vidply-white-10);
557
- max-height: 250px;
558
- min-width: 200px;
559
- -webkit-overflow-scrolling: touch;
560
- overflow-y: auto;
561
- padding: 8px 0;
562
- position: absolute;
563
- right: 50%;
564
- touch-action: pan-y;
565
-
566
- /* iOS momentum scrolling */
567
- transform: translateX(50%);
568
-
569
- /* Ensure menus appear above all player content including overlays */
570
- z-index: 20;
571
- }
572
-
573
- /* Menu positioned below button */
574
- .vidply-menu.vidply-menu-below::after {
575
- border-bottom: 6px solid var(--vidply-bg-menu);
576
- border-top: none;
577
- bottom: auto;
578
- top: -6px;
579
- }
580
-
581
- /* Arrow pointing to button */
582
- .vidply-menu::after {
583
- border-left: 6px solid transparent;
584
- border-right: 6px solid transparent;
585
- border-top: 6px solid var(--vidply-bg-menu);
586
- bottom: -6px;
587
- content: '';
588
- height: 0;
589
- position: absolute;
590
- right: 50%;
591
- transform: translateX(50%);
592
- width: 0;
593
- }
594
-
595
- /* Volume menu popup */
596
- .vidply-volume-menu {
597
- min-width: 50px;
598
- overflow-y: hidden;
599
- padding: 16px 12px;
600
- width: 50px;
601
- }
602
-
603
- /* For audio players, show menus below buttons */
604
- .vidply-player.vidply-audio .vidply-menu {
605
- bottom: auto;
606
- top: calc(100% + 8px);
607
- }
608
-
609
- .vidply-player.vidply-audio .vidply-menu::after {
610
- border-bottom: 6px solid var(--vidply-bg-menu);
611
- border-top: none;
612
- bottom: auto;
613
- top: -6px;
614
- }
615
-
616
- .vidply-menu-item {
617
- align-items: center;
618
- background: transparent;
619
- border: none;
620
- color: var(--vidply-white);
621
- cursor: pointer;
622
- display: flex;
623
- font-size: 14px;
624
- font-weight: 400;
625
- justify-content: space-between;
626
- padding: 12px 16px;
627
- text-align: left;
628
- transition: background-color 0.15s ease, color 0.15s ease;
629
- white-space: nowrap;
630
- width: 100%;
631
- }
632
-
633
- .vidply-menu-item:hover {
634
- background: var(--vidply-primary-20);
635
- color: var(--vidply-white);
636
- }
637
-
638
- .vidply-menu-item:focus {
639
- background: var(--vidply-primary-25);
640
- color: var(--vidply-white);
641
- outline: none;
642
- }
643
-
644
- .vidply-menu-item:active {
645
- background: var(--vidply-primary-30);
646
- }
647
-
648
- .vidply-captions-menu .vidply-menu-item:hover,
649
- .vidply-captions-menu .vidply-menu-item:focus,
650
- .vidply-speed-menu .vidply-menu-item:hover,
651
- .vidply-speed-menu .vidply-menu-item:focus {
652
- text-decoration: underline;
653
- }
654
-
655
- .vidply-menu-item:hover .vidply-chapter-title,
656
- .vidply-menu-item:focus .vidply-chapter-title {
657
- text-decoration: underline;
658
- }
659
-
660
- .vidply-menu-item-active {
661
- background: var(--vidply-primary-15);
662
- color: var(--vidply-primary-light);
663
- }
664
-
665
- .vidply-menu-item-active .vidply-icon {
666
- color: var(--vidply-primary-light);
667
- height: 20px;
668
- width: 20px;
669
- }
670
-
671
- .vidply-menu-item-with-value {
672
- align-items: center;
673
- display: flex;
674
- gap: 20px;
675
- justify-content: space-between;
676
- }
677
-
678
- .vidply-menu-item-label {
679
- align-items: center;
680
- display: flex;
681
- flex: 1;
682
- gap: 10px;
683
- }
684
-
685
- .vidply-menu-item-label .vidply-icon {
686
- height: 24px;
687
- opacity: 0.9;
688
- width: 24px;
689
- }
690
-
691
- .vidply-menu-item-value {
692
- background: var(--vidply-white-10);
693
- border-radius: 4px;
694
- color: var(--vidply-text-muted);
695
- font-size: 13px;
696
- font-weight: 500;
697
- padding: 2px 8px;
698
- white-space: nowrap;
699
- }
700
-
701
- /* Chapter menu specific */
702
- .vidply-chapter-time {
703
- color: var(--vidply-text-muted);
704
- display: inline-block;
705
- font-family: 'Courier New', monospace;
706
- font-size: 13px;
707
- font-weight: 500;
708
- margin-right: 12px;
709
- min-width: 60px;
710
- }
711
-
712
- .vidply-chapter-title {
713
- color: var(--vidply-white-95);
714
- flex: 1;
715
- }
716
-
717
- /* Caption style menu */
718
- .vidply-caption-style-menu.vidply-settings-menu {
719
- background: var(--vidply-bg-menu);
720
- padding: 16px;
721
- }
722
-
723
- .vidply-style-group {
724
- margin-bottom: 16px;
725
- }
726
-
727
- .vidply-style-group:last-child {
728
- margin-bottom: 0;
729
- }
730
-
731
- .vidply-style-group label {
732
- font-weight: 500;
733
- letter-spacing: 0.01em;
734
- }
735
-
736
- .vidply-style-select,
737
- .vidply-style-group input[type="color"],
738
- .vidply-style-group input[type="range"] {
739
- -webkit-appearance: none;
740
- appearance: none;
741
- }
742
-
743
- .vidply-style-select {
744
- outline: none;
745
- transition: border-color 0.2s ease, background 0.2s ease;
746
- }
747
-
748
- .vidply-style-select:hover {
749
- background: var(--vidply-white-15);
750
- border-color: var(--vidply-border-hover);
751
- }
752
-
753
- .vidply-style-select:focus {
754
- background: var(--vidply-white-15);
755
- border-color: var(--vidply-border-focus);
756
- }
757
-
758
- .vidply-style-group input[type="color"] {
759
- outline: none;
760
- transition: border-color 0.2s ease;
761
- }
762
-
763
- .vidply-style-group input[type="color"]:hover {
764
- border-color: var(--vidply-border-hover);
765
- }
766
-
767
- .vidply-style-group input[type="color"]:focus {
768
- border-color: var(--vidply-border-focus);
769
- }
770
-
771
- .vidply-style-group input[type="range"]::-webkit-slider-thumb {
772
- -webkit-appearance: none;
773
- appearance: none;
774
- background: var(--vidply-primary);
775
- border: 2px solid var(--vidply-white);
776
- border-radius: 50%;
777
- box-shadow: var(--vidply-shadow-sm);
778
- cursor: pointer;
779
- height: 16px;
780
- transition: transform 0.15s ease, background 0.15s ease;
781
- width: 16px;
782
- }
783
-
784
- .vidply-style-group input[type="range"]::-webkit-slider-thumb:hover {
785
- background: var(--vidply-primary-80);
786
- transform: scale(1.15);
787
- }
788
-
789
- .vidply-style-group input[type="range"]::-moz-range-thumb {
790
- background: var(--vidply-primary);
791
- border: 2px solid var(--vidply-white);
792
- border-radius: 50%;
793
- box-shadow: var(--vidply-shadow-sm);
794
- cursor: pointer;
795
- height: 16px;
796
- transition: transform 0.15s ease, background 0.15s ease;
797
- width: 16px;
798
- }
799
-
800
- .vidply-style-group input[type="range"]::-moz-range-thumb:hover {
801
- background: var(--vidply-primary-80);
802
- transform: scale(1.15);
803
- }
804
-
805
- .vidply-style-group input[type="range"]::-webkit-slider-runnable-track {
806
- background: var(--vidply-white-20);
807
- border-radius: 3px;
808
- height: 6px;
809
- width: 100%;
810
- }
811
-
812
- .vidply-style-group input[type="range"]::-moz-range-track {
813
- background: var(--vidply-white-20);
814
- border-radius: 3px;
815
- height: 6px;
816
- width: 100%;
817
- }
818
-
819
- /* Captions */
820
- .vidply-captions {
821
- background: var(--vidply-bg-caption);
822
- border-radius: 4px;
823
- bottom: 16px;
824
- color: var(--vidply-white);
825
- display: none;
826
- font-family: sans-serif;
827
- font-size: 100%;
828
- left: 50%;
829
- line-height: 1.4;
830
- max-width: 90%;
831
- padding: 8px 16px;
832
- pointer-events: none;
833
- position: absolute;
834
- text-align: center;
835
- transform: translateX(-50%);
836
- transition: bottom 0.3s ease;
837
- z-index: 4;
838
- }
839
-
840
- .vidply-audio .vidply-captions {
841
- bottom: auto;
842
- top: -42px;
843
- }
844
-
845
- .vidply-captions:empty {
846
- display: none;
847
- }
848
-
849
- /* Desktop only: Move captions up when controls are visible */
850
- @media (width >= 641px) {
851
- .vidply-controls-visible .vidply-captions {
852
- bottom: 96px;
853
- }
854
- }
855
-
856
- /* Mobile: Always at 121px */
857
- @media (width <= 640px) {
858
- .vidply-captions {
859
- bottom: 122px;
860
- }
861
- }
862
-
863
- /* Settings Dialog */
864
- .vidply-settings-overlay {
865
- align-items: center;
866
- animation: vidply-fade-in 0.2s ease;
867
- backdrop-filter: blur(8px);
868
- background: var(--vidply-bg-overlay);
869
- bottom: 0;
870
- display: flex;
871
- justify-content: center;
872
- left: 0;
873
- position: absolute;
874
- right: 0;
875
- top: 0;
876
- z-index: 20;
877
- }
878
-
879
- @keyframes vidply-fade-in {
880
- from {
881
- opacity: 0;
882
- }
883
-
884
- to {
885
- opacity: 1;
886
- }
887
- }
888
-
889
- .vidply-settings-dialog {
890
- animation: vidply-slide-up 0.3s ease;
891
- background: var(--vidply-bg-dialog);
892
- border: 1px solid var(--vidply-border);
893
- border-radius: 12px;
894
- box-shadow: var(--vidply-shadow-lg);
895
- max-height: 80%;
896
- max-width: 500px;
897
- -webkit-overflow-scrolling: touch;
898
- overflow-y: auto;
899
- padding: 24px;
900
-
901
- /* iOS momentum scrolling */
902
- touch-action: pan-y;
903
- width: 90%;
904
- }
905
-
906
- @keyframes vidply-slide-up {
907
- from {
908
- transform: translateY(20px);
909
- opacity: 0;
910
- }
911
-
912
- to {
913
- transform: translateY(0);
914
- opacity: 1;
915
- }
916
- }
917
-
918
- .vidply-settings-header {
919
- align-items: center;
920
- display: flex;
921
- justify-content: space-between;
922
- margin-bottom: 20px;
923
- }
924
-
925
- .vidply-settings-header h2 {
926
- color: var(--vidply-white);
927
- font-size: 20px;
928
- font-weight: 600;
929
- margin: 0;
930
- }
931
-
932
- .vidply-settings-close {
933
- min-height: auto;
934
- min-width: auto;
935
- padding: 4px;
936
- }
937
-
938
- .vidply-settings-content {
939
- display: flex;
940
- flex-direction: column;
941
- gap: 20px;
942
- }
943
-
944
- .vidply-settings-section {
945
- display: flex;
946
- flex-direction: column;
947
- gap: 12px;
948
- }
949
-
950
- .vidply-settings-section h3 {
951
- color: var(--vidply-white);
952
- font-size: 16px;
953
- font-weight: 600;
954
- margin: 0;
955
- }
956
-
957
- .vidply-settings-section label {
958
- color: var(--vidply-white-90);
959
- display: block;
960
- font-size: 14px;
961
- margin-bottom: 4px;
962
- }
963
-
964
- .vidply-settings-select,
965
- .vidply-settings-color,
966
- .vidply-settings-range {
967
- background: var(--vidply-white-10);
968
- border: 1px solid var(--vidply-white-20);
969
- border-radius: 6px;
970
- color: var(--vidply-white);
971
- font-size: 14px;
972
- padding: 8px 12px;
973
- transition: border-color 0.2s ease, background 0.2s ease;
974
- width: 100%;
975
- }
976
-
977
- /* Fix select option colors - black text on white background */
978
- .vidply-settings-select option {
979
- background: #fff;
980
- color: #000;
981
- }
982
-
983
- .vidply-settings-select:hover,
984
- .vidply-settings-color:hover,
985
- .vidply-settings-range:hover {
986
- background: var(--vidply-white-15);
987
- border-color: var(--vidply-border-hover);
988
- }
989
-
990
- .vidply-settings-select:focus,
991
- .vidply-settings-color:focus,
992
- .vidply-settings-range:focus {
993
- background: var(--vidply-white-15);
994
- border-color: var(--vidply-border-focus);
995
- box-shadow: 0 0 0 3px var(--vidply-primary-20);
996
- outline: none;
997
- }
998
-
999
- .vidply-settings-control {
1000
- display: flex;
1001
- flex-direction: column;
1002
- gap: 8px;
1003
- }
1004
-
1005
- .vidply-settings-value {
1006
- color: var(--vidply-text-muted);
1007
- display: inline-block;
1008
- font-size: 13px;
1009
- min-width: 40px;
1010
- text-align: right;
1011
- }
1012
-
1013
- .vidply-settings-footer {
1014
- border-top: 1px solid var(--vidply-white-10);
1015
- display: flex;
1016
- justify-content: flex-end;
1017
- margin-top: 20px;
1018
- padding-top: 20px;
1019
- }
1020
-
1021
- .vidply-settings-footer .vidply-button {
1022
- background: var(--vidply-white-10);
1023
- border-radius: 6px;
1024
- min-width: auto;
1025
- padding: 10px 20px;
1026
- }
1027
-
1028
- .vidply-settings-footer .vidply-button:hover {
1029
- background: var(--vidply-white-20);
1030
- }
1031
-
1032
- /* Fullscreen Styles */
1033
- .vidply-player.vidply-fullscreen,
1034
- .vidply-player:fullscreen {
1035
- height: 100vh;
1036
- max-width: none;
1037
- width: 100vw;
1038
- }
1039
-
1040
- /* Transcript in Fullscreen */
1041
- .vidply-player.vidply-fullscreen .vidply-transcript-window,
1042
- .vidply-player:fullscreen .vidply-transcript-window {
1043
- bottom: 80px !important;
1044
- height: auto !important;
1045
- left: auto !important;
1046
- max-height: calc(100vh - 180px) !important;
1047
- max-width: 400px;
1048
- position: fixed !important;
1049
- right: 20px !important;
1050
- top: auto !important;
1051
- width: 400px;
1052
- }
1053
-
1054
- /* Loading State */
1055
- .vidply-loading {
1056
- display: none;
1057
- height: 50px;
1058
- left: 50%;
1059
- position: absolute;
1060
- top: 50%;
1061
- transform: translate(-50%, -50%);
1062
- width: 50px;
1063
- }
1064
-
1065
- .vidply-player.vidply-buffering .vidply-loading {
1066
- display: block;
1067
- }
1068
-
1069
- .vidply-loading::after {
1070
- animation: vidply-spin 0.8s linear infinite;
1071
- border: 4px solid var(--vidply-white-20);
1072
- border-radius: 50%;
1073
- border-top-color: var(--vidply-white);
1074
- content: '';
1075
- display: block;
1076
- height: 100%;
1077
- width: 100%;
1078
- }
1079
-
1080
- @keyframes vidply-spin {
1081
- to {
1082
- transform: rotate(360deg);
1083
- }
1084
- }
1085
-
1086
- /* Screen Reader Only */
1087
- .vidply-sr-only {
1088
- height: 1px;
1089
- left: -10000px;
1090
- overflow: hidden;
1091
- position: absolute;
1092
- width: 1px;
1093
- }
1094
-
1095
- /* High Contrast Mode Support */
1096
- @media (prefers-contrast: high) {
1097
- .vidply-controls {
1098
- background: var(--vidply-black);
1099
- }
1100
-
1101
- .vidply-button:focus {
1102
- outline: 3px solid;
1103
- }
1104
-
1105
- .vidply-progress-played {
1106
- background: currentcolor;
1107
- }
1108
- }
1109
-
1110
- /* Reduced Motion Support */
1111
- @media (prefers-reduced-motion: reduce) {
1112
- .vidply-player *,
1113
- .vidply-player *::before,
1114
- .vidply-player *::after {
1115
- animation-duration: 0.01ms !important;
1116
- animation-iteration-count: 1 !important;
1117
- transition-duration: 0.01ms !important;
1118
- }
1119
- }
1120
-
1121
- /* Dark Mode (default) - additional contrast */
1122
- @media (prefers-color-scheme: dark) {
1123
- .vidply-settings-dialog {
1124
- background: var(--vidply-bg-dialog-dark);
1125
- }
1126
- }
1127
-
1128
- /* Touch Device Optimizations */
1129
- @media (hover: none) and (pointer: coarse) {
1130
- .vidply-button {
1131
- min-height: 48px;
1132
- min-width: 48px;
1133
- }
1134
-
1135
- .vidply-progress-container {
1136
- height: 10px;
1137
- }
1138
-
1139
- .vidply-menu-item {
1140
- font-size: 16px;
1141
- padding: 16px 20px;
1142
- }
1143
- }
1144
-
1145
- /* Responsive Breakpoints */
1146
- @media (width <= 640px) {
1147
- .vidply-controls {
1148
- padding: 16px 12px 12px;
1149
- }
1150
-
1151
- .vidply-time {
1152
- font-size: 11px;
1153
- }
1154
-
1155
- .vidply-speed-text {
1156
- display: none;
1157
- }
1158
-
1159
- .vidply-settings-dialog {
1160
- animation: slideUpFromBottom 0.3s ease;
1161
- border-radius: 16px 16px 0 0;
1162
- bottom: 0;
1163
- margin: 0;
1164
- max-height: 90vh;
1165
- max-width: 100%;
1166
- padding: 20px;
1167
- position: fixed;
1168
- top: auto;
1169
- width: 100%;
1170
- }
1171
-
1172
- .vidply-settings-overlay {
1173
- align-items: flex-end;
1174
- }
1175
-
1176
- /* Bottom sheet style for menus - positioned within controls */
1177
- .vidply-menu {
1178
- border-radius: 8px;
1179
- bottom: calc(100% + 4px);
1180
- left: 50%;
1181
- max-height: 250px;
1182
- min-width: 200px;
1183
- position: absolute;
1184
- right: auto;
1185
- top: auto;
1186
- transform: translateX(-50%);
1187
- width: auto;
1188
- z-index: 15;
1189
- }
1190
-
1191
- .vidply-menu::after {
1192
- border-bottom: 6px solid var(--vidply-bg-menu);
1193
- border-left: 6px solid transparent;
1194
- border-right: 6px solid transparent;
1195
- border-top: none;
1196
- bottom: -6px;
1197
- content: '';
1198
- height: 0;
1199
- left: 50%;
1200
- position: absolute;
1201
- transform: translateX(-50%);
1202
- width: 0;
1203
- }
1204
-
1205
- /* Remove the drag handle on mobile menus */
1206
- .vidply-menu::before {
1207
- display: none;
1208
- }
1209
-
1210
- /* Caption style menu - narrower on mobile */
1211
- .vidply-caption-style-menu.vidply-settings-menu {
1212
- left: 50%;
1213
- max-width: calc(100vw - 40px);
1214
- min-width: 280px;
1215
- padding: 16px;
1216
- transform: translateX(-50%);
1217
- width: auto;
1218
- }
1219
-
1220
- .vidply-style-group {
1221
- margin-bottom: 20px;
1222
- }
1223
-
1224
- .vidply-style-group label {
1225
- font-size: 14px;
1226
- margin-bottom: 8px;
1227
- }
1228
-
1229
- .vidply-style-select,
1230
- .vidply-style-group input[type="color"] {
1231
- font-size: 16px;
1232
- padding: 12px;
1233
- }
1234
-
1235
- /* Stack controls vertically on mobile */
1236
- .vidply-controls-buttons {
1237
- flex-direction: column;
1238
- gap: 8px;
1239
- width: 100%;
1240
- }
1241
-
1242
- .vidply-controls-left,
1243
- .vidply-controls-right {
1244
- flex-wrap: wrap;
1245
- justify-content: center;
1246
- width: 100%;
1247
- }
1248
-
1249
- /* Smaller buttons and icons */
1250
- .vidply-button {
1251
- min-height: 36px;
1252
- min-width: 36px;
1253
- padding: 5px;
1254
- }
1255
-
1256
- .vidply-icon {
1257
- height: 22px;
1258
- width: 22px;
1259
- }
1260
-
1261
- /* Reduce gaps */
1262
- .vidply-controls-left,
1263
- .vidply-controls-right {
1264
- gap: 4px;
1265
- }
1266
- }
1267
-
1268
- @keyframes slideUpFromBottom {
1269
- from {
1270
- transform: translateY(100%);
1271
- opacity: 0;
1272
- }
1273
-
1274
- to {
1275
- transform: translateY(0);
1276
- opacity: 1;
1277
- }
1278
- }
1279
-
1280
- /* Landscape mobile optimization */
1281
- @media (width <= 896px) and (orientation: landscape) {
1282
- .vidply-menu {
1283
- max-height: 50vh;
1284
- }
1285
-
1286
- .vidply-transcript-window {
1287
- max-height: 70vh;
1288
- }
1289
-
1290
- .vidply-settings-dialog {
1291
- max-height: 80vh;
1292
- }
1293
- }
1294
-
1295
- /* Extra small screens */
1296
- @media (width <= 480px) {
1297
- .vidply-speed-text {
1298
- display: none;
1299
- }
1300
-
1301
- .vidply-button {
1302
- min-height: 32px;
1303
- min-width: 32px;
1304
- padding: 4px;
1305
- }
1306
-
1307
- .vidply-icon {
1308
- height: 20px;
1309
- width: 20px;
1310
- }
1311
- }
1312
-
1313
- /* Focus Visible Polyfill */
1314
- .vidply-player :focus:not(:focus-visible) {
1315
- outline: none;
1316
- }
1317
-
1318
- .vidply-player :focus-visible {
1319
- outline: var(--vidply-focus-outline-white);
1320
- outline-offset: 2px;
1321
- }
1322
-
1323
- /* Print Styles */
1324
- @media print {
1325
- .vidply-controls {
1326
- display: none;
1327
- }
1328
- }
1329
-
1330
- /* ============================================================================
1331
- Playlist Styles
1332
- ============================================================================ */
1333
-
1334
- /* Track Info Display (below video, above playlist) */
1335
- .vidply-track-info {
1336
- background: var(--vidply-bg-track-info);
1337
- border-bottom: 1px solid var(--vidply-border-light);
1338
- order: 2; /* After video-wrapper */
1339
- padding: 16px 20px;
1340
- }
1341
-
1342
- .vidply-track-number {
1343
- color: var(--vidply-text-muted);
1344
- font-size: 12px;
1345
- letter-spacing: 0.5px;
1346
- margin-bottom: 4px;
1347
- text-transform: uppercase;
1348
- }
1349
-
1350
- .vidply-track-title {
1351
- color: var(--vidply-white);
1352
- font-size: 18px;
1353
- font-weight: 600;
1354
- margin-bottom: 4px;
1355
- }
1356
-
1357
- .vidply-track-artist {
1358
- color: var(--vidply-white-80);
1359
- font-size: 14px;
1360
- }
1361
-
1362
- /* Playlist Panel */
1363
- .vidply-playlist-panel {
1364
- background: var(--vidply-bg-playlist);
1365
- border-top: 1px solid var(--vidply-border-light);
1366
- max-height: 400px;
1367
- order: 3; /* After track info */
1368
- -webkit-overflow-scrolling: touch;
1369
-
1370
- /* iOS momentum scrolling */
1371
- overflow-y: auto;
1372
- touch-action: pan-y;
1373
- }
1374
-
1375
- .vidply-playlist-header {
1376
- background: var(--vidply-bg-playlist-header);
1377
- border-bottom: 1px solid var(--vidply-border-light);
1378
- color: var(--vidply-white-90);
1379
- font-size: 13px;
1380
- font-weight: 600;
1381
- letter-spacing: 0.5px;
1382
- padding: 12px 16px;
1383
- position: sticky;
1384
- text-transform: uppercase;
1385
- top: 0;
1386
- z-index: 2;
1387
- }
1388
-
1389
- .vidply-playlist-list {
1390
- list-style: none;
1391
- margin: 0;
1392
- padding: 4px 0;
1393
- }
1394
-
1395
- /* Playlist Items */
1396
- .vidply-playlist-item {
1397
- align-items: center;
1398
- background: transparent;
1399
- border-left: 3px solid transparent;
1400
- cursor: pointer;
1401
- display: flex;
1402
- gap: 12px;
1403
- padding: 12px 16px;
1404
- position: relative;
1405
- transition: all 0.2s ease;
1406
- }
1407
-
1408
- .vidply-playlist-item:hover {
1409
- background: var(--vidply-active-bg);
1410
- border-left-color: var(--vidply-primary-50);
1411
- }
1412
-
1413
- .vidply-playlist-item:focus {
1414
- background: var(--vidply-white-08);
1415
- border-left-color: var(--vidply-primary);
1416
- outline: 2px solid var(--vidply-primary-light);
1417
- outline-offset: -2px;
1418
- z-index: 1;
1419
- }
1420
-
1421
- .vidply-playlist-item:focus:not(:focus-visible) {
1422
- outline: none;
1423
- }
1424
-
1425
- .vidply-playlist-item:focus-visible {
1426
- background: var(--vidply-white-08);
1427
- border-left-color: var(--vidply-primary);
1428
- outline: 2px solid var(--vidply-primary-light);
1429
- outline-offset: -2px;
1430
- z-index: 1;
1431
- }
1432
-
1433
- .vidply-playlist-item-active {
1434
- background: var(--vidply-primary-15);
1435
- border-left-color: var(--vidply-primary);
1436
- }
1437
-
1438
- .vidply-playlist-item-active:hover {
1439
- background: var(--vidply-primary-20);
1440
- }
1441
-
1442
- .vidply-playlist-item-active:focus,
1443
- .vidply-playlist-item-active:focus-visible {
1444
- background: var(--vidply-primary-20);
1445
- outline: 2px solid var(--vidply-primary-light);
1446
- outline-offset: -2px;
1447
- }
1448
-
1449
- /* Playlist Thumbnail */
1450
- .vidply-playlist-thumbnail {
1451
- align-items: center;
1452
- background-color: var(--vidply-white-10);
1453
- background-position: center;
1454
- background-size: cover;
1455
- border-radius: 4px;
1456
- display: flex;
1457
- flex-shrink: 0;
1458
- height: 45px;
1459
- justify-content: center;
1460
- overflow: hidden;
1461
- width: 80px;
1462
- }
1463
-
1464
- .vidply-playlist-thumbnail-icon {
1465
- color: var(--vidply-text-subtle);
1466
- height: 32px;
1467
- transition: all 0.2s ease;
1468
- width: 32px;
1469
- }
1470
-
1471
- .vidply-playlist-item:hover .vidply-playlist-thumbnail-icon {
1472
- color: var(--vidply-text-muted);
1473
- transform: scale(1.1);
1474
- }
1475
-
1476
- .vidply-playlist-item-active .vidply-playlist-thumbnail-icon {
1477
- color: var(--vidply-primary-light);
1478
- }
1479
-
1480
- /* Playlist Item Info */
1481
- .vidply-playlist-item-info {
1482
- flex: 1;
1483
- min-width: 0;
1484
- }
1485
-
1486
- .vidply-playlist-item-title {
1487
- color: var(--vidply-white);
1488
- font-size: 14px;
1489
- font-weight: 500;
1490
- margin-bottom: 4px;
1491
- overflow: hidden;
1492
- text-overflow: ellipsis;
1493
- white-space: nowrap;
1494
- }
1495
-
1496
- .vidply-playlist-item-active .vidply-playlist-item-title {
1497
- color: var(--vidply-primary-light);
1498
- }
1499
-
1500
- .vidply-playlist-item-artist {
1501
- color: var(--vidply-text-disabled);
1502
- font-size: 12px;
1503
- overflow: hidden;
1504
- text-overflow: ellipsis;
1505
- white-space: nowrap;
1506
- }
1507
-
1508
- /* Playlist Item Icon */
1509
- .vidply-playlist-item-icon {
1510
- flex-shrink: 0;
1511
- height: 20px;
1512
- opacity: 0;
1513
- transition: opacity 0.2s ease;
1514
- width: 20px;
1515
- }
1516
-
1517
- .vidply-playlist-item:hover .vidply-playlist-item-icon,
1518
- .vidply-playlist-item-active .vidply-playlist-item-icon {
1519
- opacity: 0.7;
1520
- }
1521
-
1522
- .vidply-playlist-item-active .vidply-playlist-item-icon {
1523
- color: var(--vidply-primary-light);
1524
- opacity: 1;
1525
- }
1526
-
1527
- /* Playlist Scrollbar */
1528
- .vidply-playlist-panel::-webkit-scrollbar {
1529
- width: 8px;
1530
- }
1531
-
1532
- .vidply-playlist-panel::-webkit-scrollbar-track {
1533
- background: var(--vidply-black-30);
1534
- }
1535
-
1536
- .vidply-playlist-panel::-webkit-scrollbar-thumb {
1537
- background: var(--vidply-white-20);
1538
- border-radius: 4px;
1539
- }
1540
-
1541
- .vidply-playlist-panel::-webkit-scrollbar-thumb:hover {
1542
- background: var(--vidply-border-hover);
1543
- }
1544
-
1545
- /* Audio Player with Playlist */
1546
- .vidply-player.vidply-audio.vidply-has-playlist {
1547
- min-height: 200px;
1548
- }
1549
-
1550
- .vidply-player.vidply-audio.vidply-has-playlist audio {
1551
- display: none;
1552
- }
1553
-
1554
- .vidply-player.vidply-audio.vidply-has-playlist .vidply-video-wrapper {
1555
- flex: 1;
1556
- }
1557
-
1558
- .vidply-player.vidply-audio.vidply-has-playlist .vidply-controls {
1559
- margin-top: auto;
1560
- }
1561
-
1562
- /* Transcript Window */
1563
- .vidply-transcript-window {
1564
- backdrop-filter: blur(10px);
1565
- background: var(--vidply-bg-transcript);
1566
- border: 1px solid var(--vidply-border);
1567
- border-radius: 8px;
1568
- box-shadow: 0 10px 40px var(--vidply-black-60);
1569
- display: none;
1570
- flex-direction: column;
1571
- max-width: 400px;
1572
- order: 4; /* After video-wrapper (1), track-info (2), and playlist-panel (3) */
1573
- position: absolute;
1574
- top: 0;
1575
- width: 400px;
1576
- z-index: 5;
1577
- }
1578
-
1579
- /* Minimum height for audio player transcript */
1580
- .vidply-player.vidply-audio .vidply-transcript-window {
1581
- min-height: 200px;
1582
- }
1583
-
1584
- .vidply-transcript-header {
1585
- align-items: center;
1586
- background: var(--vidply-active-bg);
1587
- border-bottom: 1px solid var(--vidply-border-light);
1588
- border-radius: 8px 8px 0 0;
1589
- cursor: move;
1590
- display: flex;
1591
- justify-content: space-between;
1592
- padding: 16px 20px;
1593
- user-select: none;
1594
- }
1595
-
1596
- .vidply-transcript-header h3 {
1597
- color: var(--vidply-white);
1598
- font-size: 16px;
1599
- font-weight: 600;
1600
- margin: 0;
1601
- }
1602
-
1603
- .vidply-transcript-close {
1604
- align-items: center;
1605
- background: transparent;
1606
- border: none;
1607
- border-radius: 4px;
1608
- color: var(--vidply-text-muted);
1609
- cursor: pointer;
1610
- display: flex;
1611
- height: 28px;
1612
- justify-content: center;
1613
- padding: 4px;
1614
- transition: all 0.2s ease;
1615
- width: 28px;
1616
- }
1617
-
1618
- .vidply-transcript-close:hover {
1619
- background: var(--vidply-white-10);
1620
- color: var(--vidply-white);
1621
- }
1622
-
1623
- .vidply-transcript-close .vidply-icon {
1624
- height: 18px;
1625
- width: 18px;
1626
- }
1627
-
1628
- .vidply-transcript-content {
1629
- flex: 1;
1630
- -webkit-overflow-scrolling: touch;
1631
- overflow-y: auto;
1632
-
1633
- /* iOS momentum scrolling */
1634
- padding: 12px 0;
1635
- touch-action: pan-y;
1636
- }
1637
-
1638
- .vidply-transcript-entry {
1639
- border-left: 3px solid transparent;
1640
- cursor: pointer;
1641
- padding: 12px 20px;
1642
- transition: background 0.2s ease;
1643
- }
1644
-
1645
- .vidply-transcript-entry:hover,
1646
- .vidply-transcript-entry:focus {
1647
- background: var(--vidply-active-bg);
1648
- }
1649
-
1650
- .vidply-transcript-entry-active {
1651
- background: var(--vidply-primary-15);
1652
- border-left-color: var(--vidply-primary-light);
1653
- }
1654
-
1655
- .vidply-transcript-time {
1656
- color: var(--vidply-primary-light);
1657
- font-family: 'Courier New', monospace;
1658
- font-size: 14px;
1659
- font-weight: 600;
1660
- margin-bottom: 4px;
1661
- margin-right: 8px;
1662
- }
1663
-
1664
- .vidply-transcript-text {
1665
- color: var(--vidply-white-90);
1666
- font-size: 14px;
1667
- line-height: 1.6;
1668
- }
1669
-
1670
- .vidply-transcript-entry-active .vidply-transcript-text {
1671
- color: var(--vidply-white);
1672
- text-decoration: underline;
1673
- }
1674
-
1675
- .vidply-transcript-entry:hover .vidply-transcript-text,
1676
- .vidply-transcript-entry:focus .vidply-transcript-text {
1677
- text-decoration: underline;
1678
- }
1679
-
1680
- /* Transcript Scrollbar */
1681
- .vidply-transcript-content::-webkit-scrollbar {
1682
- width: 8px;
1683
- }
1684
-
1685
- .vidply-transcript-content::-webkit-scrollbar-track {
1686
- background: var(--vidply-black-30);
1687
- }
1688
-
1689
- .vidply-transcript-content::-webkit-scrollbar-thumb {
1690
- background: var(--vidply-white-20);
1691
- border-radius: 4px;
1692
- }
1693
-
1694
- .vidply-transcript-content::-webkit-scrollbar-thumb:hover {
1695
- background: var(--vidply-border-hover);
1696
- }
1697
-
1698
- /* Sign Language Video */
1699
- .vidply-sign-language-video {
1700
- background: var(--vidply-black);
1701
- border: 2px solid var(--vidply-white-30);
1702
- border-radius: 4px;
1703
- box-shadow: 0 4px 12px var(--vidply-black-60);
1704
- height: auto !important;
1705
- max-width: 400px;
1706
- min-width: 150px;
1707
- position: absolute;
1708
- transition: opacity 0.3s ease;
1709
- width: 35% !important;
1710
- z-index: 3;
1711
- }
1712
-
1713
- .vidply-fullscreen .vidply-sign-language-video {
1714
- max-width: 600px;
1715
- }
1716
-
1717
- /* Sign Language Video Positions */
1718
- .vidply-sign-position-bottom-right {
1719
- bottom: 16px; /* Above controls */
1720
- right: 16px;
1721
- }
1722
-
1723
- .vidply-controls-visible + .vidply-sign-position-bottom-right,
1724
- .vidply-controls-visible + .vidply-captions + .vidply-sign-position-bottom-right {
1725
- bottom: 95px; /* Above controls */
1726
- }
1727
-
1728
- .vidply-sign-position-bottom-left {
1729
- bottom: 16px; /* Above controls */
1730
- left: 16px;
1731
- }
1732
-
1733
- .vidply-controls-visible + .vidply-sign-position-bottom-left,
1734
- .vidply-controls-visible + .vidply-captions + .vidply-sign-position-bottom-left {
1735
- bottom: 95px; /* Above controls */
1736
- }
1737
-
1738
- .vidply-sign-position-top-right {
1739
- right: 16px;
1740
- top: 16px;
1741
- }
1742
-
1743
- .vidply-sign-position-top-left {
1744
- left: 16px;
1745
- top: 16px;
1746
- }
1747
-
1748
- /* Responsive Sign Language Video */
1749
- @media (width <= 640px) {
1750
- .vidply-sign-language-video {
1751
- min-width: 120px;
1752
- width: 35%;
1753
- }
1754
-
1755
- .vidply-sign-position-bottom-right,
1756
- .vidply-sign-position-bottom-left {
1757
- bottom: 126px !important; /* Adjust for smaller controls */
1758
- }
1759
- }
1760
-
1761
- /* Responsive Adjustments */
1762
- @media (width <= 640px) {
1763
- .vidply-playlist-thumbnail {
1764
- height: 34px;
1765
- width: 60px;
1766
- }
1767
-
1768
- .vidply-playlist-item {
1769
- gap: 10px;
1770
- padding: 10px 12px;
1771
- }
1772
-
1773
- .vidply-track-info {
1774
- padding: 12px 16px;
1775
- }
1776
-
1777
- .vidply-track-title {
1778
- font-size: 16px;
1779
- }
1780
-
1781
- /* Mobile transcript underneath video and controls */
1782
- .vidply-transcript-window {
1783
- border: none;
1784
- border-radius: 0;
1785
- border-top: 1px solid var(--vidply-border-light);
1786
- box-shadow: none;
1787
- order: 3; /* After controls (which are order: 2) */
1788
- position: relative;
1789
- width: 100%;
1790
- z-index: 5;
1791
- }
1792
-
1793
- .vidply-transcript-header {
1794
- border-radius: 0;
1795
- padding: 12px 16px;
1796
- }
1797
-
1798
- .vidply-transcript-content {
1799
- max-height: 400px;
1800
- }
1801
-
1802
- /* Don't show dragging cursor on mobile */
1803
- .vidply-transcript-header {
1804
- cursor: default !important;
1805
- }
1806
- }
1807
-
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: #71b7e2;
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: 16px;
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
+ .vidply-player.vidply-audio .vidply-menu {
149
+ max-height: 150px;
150
+ }
151
+
152
+ /* Video/Audio Element */
153
+ .vidply-player video,
154
+ .vidply-player audio {
155
+ display: block;
156
+ height: 100%;
157
+ object-fit: contain;
158
+ width: 100%;
159
+ }
160
+
161
+ /* Mobile: Video element order and sizing */
162
+ @media (width <= 640px) {
163
+ .vidply-player video,
164
+ .vidply-player audio {
165
+ flex: 0 0 auto; /* Don't grow or shrink */
166
+ height: auto;
167
+ order: 1; /* Before controls */
168
+ }
169
+ }
170
+
171
+ /* Hide native browser captions - we'll display our own */
172
+ .vidply-player video::cue {
173
+ display: none;
174
+ }
175
+
176
+ .vidply-player video::-webkit-media-text-track-container {
177
+ display: none !important;
178
+ }
179
+
180
+ .vidply-player video::-webkit-media-text-track-display {
181
+ display: none !important;
182
+ }
183
+
184
+ /* Video wrapper for proper clipping */
185
+ .vidply-video-wrapper {
186
+ background: linear-gradient(135deg, var(--vidply-black) 0%, #2a2a2a 100%);
187
+ height: 100%;
188
+ order: 1; /* First in flex order */
189
+ overflow: hidden;
190
+ position: relative;
191
+ width: 100%;
192
+ z-index: 1; /* Base video layer */
193
+ }
194
+
195
+ /* Mobile: Simplify video wrapper */
196
+ @media (width <= 640px) {
197
+ .vidply-video-wrapper {
198
+ display: block;
199
+ height: auto;
200
+ overflow: visible;
201
+ }
202
+ }
203
+
204
+ /* For audio players, allow menus to overflow */
205
+ .vidply-player.vidply-audio .vidply-video-wrapper {
206
+ overflow: visible;
207
+ }
208
+
209
+ /* Hide fullscreen button in audio players */
210
+ .vidply-player.vidply-audio .vidply-fullscreen {
211
+ display: none;
212
+ }
213
+
214
+ /* Centered Play Button Overlay */
215
+ .vidply-play-overlay {
216
+ cursor: pointer;
217
+ filter: drop-shadow(0 8px 32px rgb(0 0 0 / 30%));
218
+ left: 50%;
219
+ position: absolute;
220
+ top: 50%;
221
+ transform: translate(-50%, -50%);
222
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
223
+ z-index: 2;
224
+ }
225
+
226
+ .vidply-play-overlay:hover {
227
+ filter: drop-shadow(0 12px 48px rgb(0 0 0 / 40%));
228
+ transform: translate(-50%, -50%) scale(1.1);
229
+ }
230
+
231
+ .vidply-play-overlay:hover .vidply-play-overlay-bg {
232
+ fill: rgb(255 255 255 / 100%);
233
+ }
234
+
235
+ .vidply-play-overlay:active {
236
+ transform: translate(-50%, -50%) scale(0.95);
237
+ }
238
+
239
+ /* Hide play overlay in audio players */
240
+ .vidply-player.vidply-audio .vidply-play-overlay {
241
+ display: none;
242
+ }
243
+
244
+ /* Controls Container */
245
+ .vidply-controls {
246
+ background: linear-gradient(to top, var(--vidply-black-90) 0%, var(--vidply-black-50) 100%);
247
+ bottom: 0;
248
+ left: 0;
249
+ opacity: 0;
250
+ overflow: visible;
251
+ padding: 20px 16px 16px;
252
+ pointer-events: none;
253
+ position: absolute;
254
+ right: 0;
255
+ transition: opacity 0.3s ease;
256
+ z-index: 10;
257
+ }
258
+
259
+ .vidply-controls.vidply-controls-visible,
260
+ .vidply-player:hover .vidply-controls,
261
+ .vidply-player.vidply-paused .vidply-controls {
262
+ opacity: 1;
263
+ pointer-events: auto;
264
+ }
265
+
266
+ /* For audio players, always show controls */
267
+ .vidply-audio .vidply-controls {
268
+ background: var(--vidply-black-50);
269
+ opacity: 1;
270
+ pointer-events: auto;
271
+ position: relative;
272
+ }
273
+
274
+ /* Mobile: Controls underneath video */
275
+ @media (width <= 640px) {
276
+ .vidply-controls {
277
+ background: var(--vidply-black-90);
278
+ border-top: 1px solid var(--vidply-border-light);
279
+ bottom: auto;
280
+ left: 0;
281
+ opacity: 1;
282
+ order: 2; /* After video-wrapper (1) */
283
+ padding: 12px;
284
+ pointer-events: auto;
285
+ position: relative;
286
+ right: 0;
287
+ width: 100%;
288
+ z-index: 10;
289
+ }
290
+
291
+ /* Allow menus to position within controls */
292
+ .vidply-controls-buttons,
293
+ .vidply-controls-left,
294
+ .vidply-controls-right {
295
+ position: relative;
296
+ }
297
+ }
298
+
299
+ /* Progress Bar */
300
+ .vidply-progress-container {
301
+ background: var(--vidply-white-20);
302
+ border-radius: 3px;
303
+ cursor: pointer;
304
+ height: 5px;
305
+ margin-bottom: 12px;
306
+ position: relative;
307
+ transition: height 0.2s ease;
308
+ width: 100%;
309
+ }
310
+
311
+ .vidply-progress-container:hover,
312
+ .vidply-progress-container:focus {
313
+ height: 8px;
314
+ }
315
+
316
+ .vidply-progress-container:focus {
317
+ outline: var(--vidply-focus-outline-white);
318
+ outline-offset: 2px;
319
+ }
320
+
321
+ .vidply-progress-buffered {
322
+ background: var(--vidply-white-40);
323
+ border-radius: 3px;
324
+ height: 100%;
325
+ left: 0;
326
+ position: absolute;
327
+ top: 0;
328
+ transition: width 0.2s ease;
329
+ width: 0;
330
+ }
331
+
332
+ .vidply-progress-played {
333
+ background: var(--vidply-primary-light);
334
+ border-radius: 3px;
335
+ height: 100%;
336
+ left: 0;
337
+ position: absolute;
338
+ top: 0;
339
+ transition: width 0.1s linear;
340
+ width: 0;
341
+ }
342
+
343
+ .vidply-progress-handle {
344
+ background: var(--vidply-white);
345
+ border-radius: 50%;
346
+ box-shadow: var(--vidply-shadow-sm);
347
+ height: 12px;
348
+ opacity: 0;
349
+ position: absolute;
350
+ right: -6px;
351
+ top: 50%;
352
+ transform: translateY(-50%);
353
+ transition: opacity 0.2s ease;
354
+ width: 12px;
355
+ }
356
+
357
+ .vidply-progress-container:hover .vidply-progress-handle,
358
+ .vidply-progress-container:focus .vidply-progress-handle {
359
+ opacity: 1;
360
+ }
361
+
362
+ .vidply-progress-tooltip {
363
+ background: var(--vidply-black-90);
364
+ border-radius: 4px;
365
+ bottom: 12px;
366
+ color: var(--vidply-white);
367
+ display: none;
368
+ font-size: 12px;
369
+ padding: 4px 8px;
370
+ pointer-events: none;
371
+ position: absolute;
372
+ transform: translateX(-50%);
373
+ white-space: nowrap;
374
+ }
375
+
376
+ /* Button Container */
377
+ .vidply-controls-buttons {
378
+ align-items: center;
379
+ display: flex;
380
+ gap: 8px;
381
+ justify-content: space-between;
382
+ }
383
+
384
+ .vidply-controls-left,
385
+ .vidply-controls-right {
386
+ align-items: center;
387
+ display: flex;
388
+ gap: 8px;
389
+ overflow: visible;
390
+ position: relative;
391
+ }
392
+
393
+
394
+ /* Buttons */
395
+ .vidply-button {
396
+ align-items: center;
397
+ background: transparent;
398
+ border: none;
399
+ border-radius: 4px;
400
+ color: var(--vidply-white);
401
+ cursor: pointer;
402
+ display: inline-flex;
403
+ justify-content: center;
404
+ min-height: 32px;
405
+ min-width: 32px;
406
+ padding: 6px;
407
+ position: relative;
408
+ transition: background-color 0.2s ease, transform 0.1s ease;
409
+ }
410
+
411
+ .vidply-button:hover {
412
+ background: var(--vidply-hover-bg);
413
+ }
414
+
415
+ .vidply-button:active {
416
+ transform: scale(0.95);
417
+ }
418
+
419
+ .vidply-button:focus {
420
+ outline: var(--vidply-focus-outline-white);
421
+ outline-offset: 2px;
422
+ }
423
+
424
+ .vidply-button:focus:not(:focus-visible) {
425
+ outline: none;
426
+ }
427
+
428
+ .vidply-button:disabled {
429
+ cursor: not-allowed;
430
+ opacity: 0.5;
431
+ }
432
+
433
+ /* Icons */
434
+ .vidply-icon {
435
+ display: inline-block;
436
+ fill: currentcolor;
437
+ height: 26px;
438
+ width: 26px;
439
+ }
440
+
441
+ .vidply-icon svg {
442
+ display: block;
443
+ height: 100%;
444
+ width: 100%;
445
+ }
446
+
447
+ /* Volume Control */
448
+ .vidply-volume-slider {
449
+ background: var(--vidply-white-20);
450
+ border-radius: 3px;
451
+ cursor: pointer;
452
+ height: 100px;
453
+ margin: 0 auto;
454
+ position: relative;
455
+ width: 6px;
456
+ }
457
+
458
+ .vidply-volume-slider:focus {
459
+ outline: var(--vidply-focus-outline-white);
460
+ outline-offset: 2px;
461
+ }
462
+
463
+ .vidply-volume-track {
464
+ height: 100%;
465
+ position: relative;
466
+ width: 100%;
467
+ }
468
+
469
+ .vidply-volume-fill {
470
+ background: var(--vidply-primary-light);
471
+ border-radius: 2px;
472
+ bottom: 0;
473
+ height: 80%;
474
+ left: 0;
475
+ position: absolute;
476
+ transition: height 0.1s ease;
477
+ width: 100%;
478
+ }
479
+
480
+ .vidply-volume-handle {
481
+ background: var(--vidply-white);
482
+ border-radius: 50%;
483
+ box-shadow: var(--vidply-shadow-sm);
484
+ height: 10px;
485
+ left: 50%;
486
+ position: absolute;
487
+ top: -4px;
488
+ transform: translateX(-50%);
489
+ width: 10px;
490
+ }
491
+
492
+ /* Time Display */
493
+ .vidply-time {
494
+ align-items: center;
495
+ color: #fff;
496
+ display: flex;
497
+ font-size: 13px;
498
+ font-variant-numeric: tabular-nums;
499
+ gap: 4px;
500
+ padding: 0 4px;
501
+ user-select: none;
502
+ }
503
+
504
+ /* Speed Button */
505
+ .vidply-speed {
506
+ gap: 4px;
507
+ }
508
+
509
+ .vidply-speed-text {
510
+ font-size: 12px;
511
+ min-width: 28px;
512
+ text-align: center;
513
+ }
514
+
515
+ /* Menu Backdrop (for mobile) */
516
+ .vidply-menu-backdrop {
517
+ animation: fadeIn 0.2s ease;
518
+ background: rgb(0 0 0 / 50%);
519
+ bottom: 0;
520
+ display: none;
521
+ left: 0;
522
+ position: fixed;
523
+ right: 0;
524
+ top: 0;
525
+ z-index: 19;
526
+ }
527
+
528
+ .vidply-menu-backdrop.visible {
529
+ display: block;
530
+ }
531
+
532
+ /* Mobile: Don't use backdrop, menus position above buttons */
533
+ @media (width <= 640px) {
534
+ .vidply-menu-backdrop {
535
+ display: none !important;
536
+ }
537
+ }
538
+
539
+ @keyframes fadeIn {
540
+ from {
541
+ opacity: 0;
542
+ }
543
+
544
+ to {
545
+ opacity: 1;
546
+ }
547
+ }
548
+
549
+ /* Menus */
550
+ .vidply-menu {
551
+ backdrop-filter: blur(10px);
552
+ background: var(--vidply-bg-menu);
553
+ border: 1px solid var(--vidply-border);
554
+ border-radius: 8px;
555
+ bottom: calc(100% + 8px);
556
+ box-shadow: var(--vidply-shadow-lg), 0 0 0 1px var(--vidply-white-10);
557
+ max-height: 250px;
558
+ min-width: 200px;
559
+ -webkit-overflow-scrolling: touch;
560
+ overflow-y: auto;
561
+ padding: 8px 0;
562
+ position: absolute;
563
+ right: 50%;
564
+ touch-action: pan-y;
565
+
566
+ /* iOS momentum scrolling */
567
+ transform: translateX(50%);
568
+
569
+ /* Ensure menus appear above all player content including overlays */
570
+ z-index: 20;
571
+ }
572
+
573
+ /* Menu positioned below button */
574
+ .vidply-menu.vidply-menu-below::after {
575
+ border-bottom: 6px solid var(--vidply-bg-menu);
576
+ border-top: none;
577
+ bottom: auto;
578
+ top: -6px;
579
+ }
580
+
581
+ /* Arrow pointing to button */
582
+ .vidply-menu::after {
583
+ border-left: 6px solid transparent;
584
+ border-right: 6px solid transparent;
585
+ border-top: 6px solid var(--vidply-bg-menu);
586
+ bottom: -6px;
587
+ content: '';
588
+ height: 0;
589
+ position: absolute;
590
+ right: 50%;
591
+ transform: translateX(50%);
592
+ width: 0;
593
+ }
594
+
595
+ /* Volume menu popup */
596
+ .vidply-volume-menu {
597
+ min-width: 50px;
598
+ overflow-y: hidden;
599
+ padding: 16px 12px;
600
+ width: 50px;
601
+ }
602
+
603
+ /* For audio players, show menus below buttons */
604
+ .vidply-player.vidply-audio .vidply-menu {
605
+ bottom: auto;
606
+ top: calc(100% + 8px);
607
+ }
608
+
609
+ .vidply-player.vidply-audio .vidply-menu::after {
610
+ border-bottom: 6px solid var(--vidply-bg-menu);
611
+ border-top: none;
612
+ bottom: auto;
613
+ top: -6px;
614
+ }
615
+
616
+ .vidply-menu-item {
617
+ align-items: center;
618
+ background: transparent;
619
+ border: none;
620
+ color: var(--vidply-white);
621
+ cursor: pointer;
622
+ display: flex;
623
+ font-size: 14px;
624
+ font-weight: 400;
625
+ justify-content: space-between;
626
+ padding: 12px 16px;
627
+ text-align: left;
628
+ transition: background-color 0.15s ease, color 0.15s ease;
629
+ white-space: nowrap;
630
+ width: 100%;
631
+ }
632
+
633
+ .vidply-menu-item:hover {
634
+ background: var(--vidply-primary-20);
635
+ color: var(--vidply-white);
636
+ }
637
+
638
+ .vidply-menu-item:focus {
639
+ background: var(--vidply-primary-25);
640
+ color: var(--vidply-white);
641
+ outline: none;
642
+ }
643
+
644
+ .vidply-menu-item:active {
645
+ background: var(--vidply-primary-30);
646
+ }
647
+
648
+ .vidply-captions-menu .vidply-menu-item:hover,
649
+ .vidply-captions-menu .vidply-menu-item:focus,
650
+ .vidply-speed-menu .vidply-menu-item:hover,
651
+ .vidply-speed-menu .vidply-menu-item:focus {
652
+ text-decoration: underline;
653
+ }
654
+
655
+ .vidply-menu-item:hover .vidply-chapter-title,
656
+ .vidply-menu-item:focus .vidply-chapter-title {
657
+ text-decoration: underline;
658
+ }
659
+
660
+ .vidply-menu-item-active {
661
+ background: var(--vidply-primary-15);
662
+ color: var(--vidply-primary-light);
663
+ }
664
+
665
+ .vidply-menu-item-active .vidply-icon {
666
+ color: var(--vidply-primary-light);
667
+ height: 20px;
668
+ width: 20px;
669
+ }
670
+
671
+ .vidply-menu-item-with-value {
672
+ align-items: center;
673
+ display: flex;
674
+ gap: 20px;
675
+ justify-content: space-between;
676
+ }
677
+
678
+ .vidply-menu-item-label {
679
+ align-items: center;
680
+ display: flex;
681
+ flex: 1;
682
+ gap: 10px;
683
+ }
684
+
685
+ .vidply-menu-item-label .vidply-icon {
686
+ height: 24px;
687
+ opacity: 0.9;
688
+ width: 24px;
689
+ }
690
+
691
+ .vidply-menu-item-value {
692
+ background: var(--vidply-white-10);
693
+ border-radius: 4px;
694
+ color: var(--vidply-text-muted);
695
+ font-size: 13px;
696
+ font-weight: 500;
697
+ padding: 2px 8px;
698
+ white-space: nowrap;
699
+ }
700
+
701
+ /* Chapter menu specific */
702
+ .vidply-chapter-time {
703
+ color: var(--vidply-text-muted);
704
+ display: inline-block;
705
+ font-family: 'Courier New', monospace;
706
+ font-size: 13px;
707
+ font-weight: 500;
708
+ margin-right: 12px;
709
+ min-width: 60px;
710
+ }
711
+
712
+ .vidply-chapter-title {
713
+ color: var(--vidply-white-95);
714
+ flex: 1;
715
+ }
716
+
717
+ /* Caption style menu */
718
+ .vidply-caption-style-menu.vidply-settings-menu {
719
+ background: var(--vidply-bg-menu);
720
+ padding: 16px;
721
+ }
722
+
723
+ .vidply-style-group {
724
+ margin-bottom: 16px;
725
+ }
726
+
727
+ .vidply-style-group:last-child {
728
+ margin-bottom: 0;
729
+ }
730
+
731
+ .vidply-style-group label {
732
+ font-weight: 500;
733
+ letter-spacing: 0.01em;
734
+ }
735
+
736
+ .vidply-style-select,
737
+ .vidply-style-group input[type="color"],
738
+ .vidply-style-group input[type="range"] {
739
+ -webkit-appearance: none;
740
+ appearance: none;
741
+ }
742
+
743
+ .vidply-style-select {
744
+ outline: none;
745
+ transition: border-color 0.2s ease, background 0.2s ease;
746
+ }
747
+
748
+ .vidply-style-select:hover {
749
+ background: var(--vidply-white-15);
750
+ border-color: var(--vidply-border-hover);
751
+ }
752
+
753
+ .vidply-style-select:focus {
754
+ background: var(--vidply-white-15);
755
+ border-color: var(--vidply-border-focus);
756
+ }
757
+
758
+ .vidply-style-group input[type="color"] {
759
+ outline: none;
760
+ transition: border-color 0.2s ease;
761
+ }
762
+
763
+ .vidply-style-group input[type="color"]:hover {
764
+ border-color: var(--vidply-border-hover);
765
+ }
766
+
767
+ .vidply-style-group input[type="color"]:focus {
768
+ border-color: var(--vidply-border-focus);
769
+ }
770
+
771
+ .vidply-style-group input[type="range"]::-webkit-slider-thumb {
772
+ -webkit-appearance: none;
773
+ appearance: none;
774
+ background: var(--vidply-primary);
775
+ border: 2px solid var(--vidply-white);
776
+ border-radius: 50%;
777
+ box-shadow: var(--vidply-shadow-sm);
778
+ cursor: pointer;
779
+ height: 16px;
780
+ transition: transform 0.15s ease, background 0.15s ease;
781
+ width: 16px;
782
+ }
783
+
784
+ .vidply-style-group input[type="range"]::-webkit-slider-thumb:hover {
785
+ background: var(--vidply-primary-80);
786
+ transform: scale(1.15);
787
+ }
788
+
789
+ .vidply-style-group input[type="range"]::-moz-range-thumb {
790
+ background: var(--vidply-primary);
791
+ border: 2px solid var(--vidply-white);
792
+ border-radius: 50%;
793
+ box-shadow: var(--vidply-shadow-sm);
794
+ cursor: pointer;
795
+ height: 16px;
796
+ transition: transform 0.15s ease, background 0.15s ease;
797
+ width: 16px;
798
+ }
799
+
800
+ .vidply-style-group input[type="range"]::-moz-range-thumb:hover {
801
+ background: var(--vidply-primary-80);
802
+ transform: scale(1.15);
803
+ }
804
+
805
+ .vidply-style-group input[type="range"]::-webkit-slider-runnable-track {
806
+ background: var(--vidply-white-20);
807
+ border-radius: 3px;
808
+ height: 6px;
809
+ width: 100%;
810
+ }
811
+
812
+ .vidply-style-group input[type="range"]::-moz-range-track {
813
+ background: var(--vidply-white-20);
814
+ border-radius: 3px;
815
+ height: 6px;
816
+ width: 100%;
817
+ }
818
+
819
+ /* Captions */
820
+ .vidply-captions {
821
+ background: var(--vidply-bg-caption);
822
+ border-radius: 4px;
823
+ bottom: 16px;
824
+ color: var(--vidply-white);
825
+ display: none;
826
+ font-family: sans-serif;
827
+ font-size: 100%;
828
+ left: 50%;
829
+ line-height: 1.4;
830
+ max-width: 90%;
831
+ padding: 8px 16px;
832
+ pointer-events: none;
833
+ position: absolute;
834
+ text-align: center;
835
+ transform: translateX(-50%);
836
+ transition: bottom 0.3s ease;
837
+ z-index: 4;
838
+ }
839
+
840
+ .vidply-audio .vidply-captions {
841
+ bottom: auto;
842
+ top: -42px;
843
+ }
844
+
845
+ .vidply-captions:empty {
846
+ display: none;
847
+ }
848
+
849
+ /* Desktop only: Move captions up when controls are visible */
850
+ @media (width >= 641px) {
851
+ .vidply-controls-visible .vidply-captions {
852
+ bottom: 96px;
853
+ }
854
+ }
855
+
856
+ /* Mobile: Always at 121px */
857
+ @media (width <= 640px) {
858
+ .vidply-captions {
859
+ bottom: 122px;
860
+ }
861
+ }
862
+
863
+ /* Settings Dialog */
864
+ .vidply-settings-overlay {
865
+ align-items: center;
866
+ animation: vidply-fade-in 0.2s ease;
867
+ backdrop-filter: blur(8px);
868
+ background: var(--vidply-bg-overlay);
869
+ bottom: 0;
870
+ display: flex;
871
+ justify-content: center;
872
+ left: 0;
873
+ position: absolute;
874
+ right: 0;
875
+ top: 0;
876
+ z-index: 20;
877
+ }
878
+
879
+ @keyframes vidply-fade-in {
880
+ from {
881
+ opacity: 0;
882
+ }
883
+
884
+ to {
885
+ opacity: 1;
886
+ }
887
+ }
888
+
889
+ .vidply-settings-dialog {
890
+ animation: vidply-slide-up 0.3s ease;
891
+ background: var(--vidply-bg-dialog);
892
+ border: 1px solid var(--vidply-border);
893
+ border-radius: 12px;
894
+ box-shadow: var(--vidply-shadow-lg);
895
+ max-height: 80%;
896
+ max-width: 500px;
897
+ -webkit-overflow-scrolling: touch;
898
+ overflow-y: auto;
899
+ padding: 24px;
900
+
901
+ /* iOS momentum scrolling */
902
+ touch-action: pan-y;
903
+ width: 90%;
904
+ }
905
+
906
+ @keyframes vidply-slide-up {
907
+ from {
908
+ transform: translateY(20px);
909
+ opacity: 0;
910
+ }
911
+
912
+ to {
913
+ transform: translateY(0);
914
+ opacity: 1;
915
+ }
916
+ }
917
+
918
+ .vidply-settings-header {
919
+ align-items: center;
920
+ display: flex;
921
+ justify-content: space-between;
922
+ margin-bottom: 20px;
923
+ }
924
+
925
+ .vidply-settings-header h2 {
926
+ color: var(--vidply-white);
927
+ font-size: 20px;
928
+ font-weight: 600;
929
+ margin: 0;
930
+ }
931
+
932
+ .vidply-settings-close {
933
+ min-height: auto;
934
+ min-width: auto;
935
+ padding: 4px;
936
+ }
937
+
938
+ .vidply-settings-content {
939
+ display: flex;
940
+ flex-direction: column;
941
+ gap: 20px;
942
+ }
943
+
944
+ .vidply-settings-section {
945
+ display: flex;
946
+ flex-direction: column;
947
+ gap: 12px;
948
+ }
949
+
950
+ .vidply-settings-section h3 {
951
+ color: var(--vidply-white);
952
+ font-size: 16px;
953
+ font-weight: 600;
954
+ margin: 0;
955
+ }
956
+
957
+ .vidply-settings-section label {
958
+ color: var(--vidply-white-90);
959
+ display: block;
960
+ font-size: 14px;
961
+ margin-bottom: 4px;
962
+ }
963
+
964
+ .vidply-settings-select,
965
+ .vidply-settings-color,
966
+ .vidply-settings-range {
967
+ background: var(--vidply-white-10);
968
+ border: 1px solid var(--vidply-white-20);
969
+ border-radius: 6px;
970
+ color: var(--vidply-white);
971
+ font-size: 14px;
972
+ padding: 8px 12px;
973
+ transition: border-color 0.2s ease, background 0.2s ease;
974
+ width: 100%;
975
+ }
976
+
977
+ /* Fix select option colors - black text on white background */
978
+ .vidply-settings-select option {
979
+ background: #fff;
980
+ color: #000;
981
+ }
982
+
983
+ .vidply-settings-select:hover,
984
+ .vidply-settings-color:hover,
985
+ .vidply-settings-range:hover {
986
+ background: var(--vidply-white-15);
987
+ border-color: var(--vidply-border-hover);
988
+ }
989
+
990
+ .vidply-settings-select:focus,
991
+ .vidply-settings-color:focus,
992
+ .vidply-settings-range:focus {
993
+ background: var(--vidply-white-15);
994
+ border-color: var(--vidply-border-focus);
995
+ box-shadow: 0 0 0 3px var(--vidply-primary-20);
996
+ outline: none;
997
+ }
998
+
999
+ .vidply-settings-control {
1000
+ display: flex;
1001
+ flex-direction: column;
1002
+ gap: 8px;
1003
+ }
1004
+
1005
+ .vidply-settings-value {
1006
+ color: var(--vidply-text-muted);
1007
+ display: inline-block;
1008
+ font-size: 13px;
1009
+ min-width: 40px;
1010
+ text-align: right;
1011
+ }
1012
+
1013
+ .vidply-settings-footer {
1014
+ border-top: 1px solid var(--vidply-white-10);
1015
+ display: flex;
1016
+ justify-content: flex-end;
1017
+ margin-top: 20px;
1018
+ padding-top: 20px;
1019
+ }
1020
+
1021
+ .vidply-settings-footer .vidply-button {
1022
+ background: var(--vidply-white-10);
1023
+ border-radius: 6px;
1024
+ min-width: auto;
1025
+ padding: 10px 20px;
1026
+ }
1027
+
1028
+ .vidply-settings-footer .vidply-button:hover {
1029
+ background: var(--vidply-white-20);
1030
+ }
1031
+
1032
+ /* Fullscreen Styles */
1033
+ .vidply-player.vidply-fullscreen,
1034
+ .vidply-player:fullscreen {
1035
+ height: 100vh;
1036
+ max-width: none;
1037
+ width: 100vw;
1038
+ }
1039
+
1040
+ /* Transcript in Fullscreen */
1041
+ .vidply-player.vidply-fullscreen .vidply-transcript-window,
1042
+ .vidply-player:fullscreen .vidply-transcript-window {
1043
+ bottom: 80px !important;
1044
+ height: auto !important;
1045
+ left: auto !important;
1046
+ max-height: calc(100vh - 180px) !important;
1047
+ max-width: 400px;
1048
+ position: fixed !important;
1049
+ right: 20px !important;
1050
+ top: auto !important;
1051
+ width: 400px;
1052
+ }
1053
+
1054
+ /* Loading State */
1055
+ .vidply-loading {
1056
+ display: none;
1057
+ height: 50px;
1058
+ left: 50%;
1059
+ position: absolute;
1060
+ top: 50%;
1061
+ transform: translate(-50%, -50%);
1062
+ width: 50px;
1063
+ }
1064
+
1065
+ .vidply-player.vidply-buffering .vidply-loading {
1066
+ display: block;
1067
+ }
1068
+
1069
+ .vidply-loading::after {
1070
+ animation: vidply-spin 0.8s linear infinite;
1071
+ border: 4px solid var(--vidply-white-20);
1072
+ border-radius: 50%;
1073
+ border-top-color: var(--vidply-white);
1074
+ content: '';
1075
+ display: block;
1076
+ height: 100%;
1077
+ width: 100%;
1078
+ }
1079
+
1080
+ @keyframes vidply-spin {
1081
+ to {
1082
+ transform: rotate(360deg);
1083
+ }
1084
+ }
1085
+
1086
+ /* Screen Reader Only */
1087
+ .vidply-sr-only {
1088
+ height: 1px;
1089
+ left: -10000px;
1090
+ overflow: hidden;
1091
+ position: absolute;
1092
+ width: 1px;
1093
+ }
1094
+
1095
+ /* High Contrast Mode Support */
1096
+ @media (prefers-contrast: high) {
1097
+ .vidply-controls {
1098
+ background: var(--vidply-black);
1099
+ }
1100
+
1101
+ .vidply-button:focus {
1102
+ outline: 3px solid;
1103
+ }
1104
+
1105
+ .vidply-progress-played {
1106
+ background: currentcolor;
1107
+ }
1108
+ }
1109
+
1110
+ /* Reduced Motion Support */
1111
+ @media (prefers-reduced-motion: reduce) {
1112
+ .vidply-player *,
1113
+ .vidply-player *::before,
1114
+ .vidply-player *::after {
1115
+ animation-duration: 0.01ms !important;
1116
+ animation-iteration-count: 1 !important;
1117
+ transition-duration: 0.01ms !important;
1118
+ }
1119
+ }
1120
+
1121
+ /* Dark Mode (default) - additional contrast */
1122
+ @media (prefers-color-scheme: dark) {
1123
+ .vidply-settings-dialog {
1124
+ background: var(--vidply-bg-dialog-dark);
1125
+ }
1126
+ }
1127
+
1128
+ /* Touch Device Optimizations */
1129
+ @media (hover: none) and (pointer: coarse) {
1130
+ .vidply-button {
1131
+ min-height: 48px;
1132
+ min-width: 48px;
1133
+ }
1134
+
1135
+ .vidply-progress-container {
1136
+ height: 10px;
1137
+ }
1138
+
1139
+ .vidply-menu-item {
1140
+ font-size: 16px;
1141
+ padding: 16px 20px;
1142
+ }
1143
+ }
1144
+
1145
+ /* Responsive Breakpoints */
1146
+ @media (width <= 640px) {
1147
+ .vidply-controls {
1148
+ padding: 16px 12px 12px;
1149
+ }
1150
+
1151
+ .vidply-time {
1152
+ font-size: 11px;
1153
+ }
1154
+
1155
+ .vidply-speed-text {
1156
+ display: none;
1157
+ }
1158
+
1159
+ .vidply-settings-dialog {
1160
+ animation: slideUpFromBottom 0.3s ease;
1161
+ border-radius: 16px 16px 0 0;
1162
+ bottom: 0;
1163
+ margin: 0;
1164
+ max-height: 90vh;
1165
+ max-width: 100%;
1166
+ padding: 20px;
1167
+ position: fixed;
1168
+ top: auto;
1169
+ width: 100%;
1170
+ }
1171
+
1172
+ .vidply-settings-overlay {
1173
+ align-items: flex-end;
1174
+ }
1175
+
1176
+ /* Bottom sheet style for menus - positioned within controls */
1177
+ .vidply-menu {
1178
+ border-radius: 8px;
1179
+ bottom: calc(100% + 4px);
1180
+ left: 50%;
1181
+ max-height: 250px;
1182
+ min-width: 200px;
1183
+ position: absolute;
1184
+ right: auto;
1185
+ top: auto;
1186
+ transform: translateX(-50%);
1187
+ width: auto;
1188
+ z-index: 15;
1189
+ }
1190
+
1191
+ .vidply-menu::after {
1192
+ border-bottom: 6px solid var(--vidply-bg-menu);
1193
+ border-left: 6px solid transparent;
1194
+ border-right: 6px solid transparent;
1195
+ border-top: none;
1196
+ bottom: -6px;
1197
+ content: '';
1198
+ height: 0;
1199
+ left: 50%;
1200
+ position: absolute;
1201
+ transform: translateX(-50%);
1202
+ width: 0;
1203
+ }
1204
+
1205
+ /* Remove the drag handle on mobile menus */
1206
+ .vidply-menu::before {
1207
+ display: none;
1208
+ }
1209
+
1210
+ /* Caption style menu - narrower on mobile */
1211
+ .vidply-caption-style-menu.vidply-settings-menu {
1212
+ left: 50%;
1213
+ max-width: calc(100vw - 40px);
1214
+ min-width: 280px;
1215
+ padding: 16px;
1216
+ transform: translateX(-50%);
1217
+ width: auto;
1218
+ }
1219
+
1220
+ .vidply-style-group {
1221
+ margin-bottom: 20px;
1222
+ }
1223
+
1224
+ .vidply-style-group label {
1225
+ font-size: 14px;
1226
+ margin-bottom: 8px;
1227
+ }
1228
+
1229
+ .vidply-style-select,
1230
+ .vidply-style-group input[type="color"] {
1231
+ font-size: 16px;
1232
+ padding: 12px;
1233
+ }
1234
+
1235
+ /* Stack controls vertically on mobile */
1236
+ .vidply-controls-buttons {
1237
+ flex-direction: column;
1238
+ gap: 8px;
1239
+ width: 100%;
1240
+ }
1241
+
1242
+ .vidply-controls-left,
1243
+ .vidply-controls-right {
1244
+ flex-wrap: wrap;
1245
+ justify-content: center;
1246
+ width: 100%;
1247
+ }
1248
+
1249
+ /* Smaller buttons and icons */
1250
+ .vidply-button {
1251
+ min-height: 36px;
1252
+ min-width: 36px;
1253
+ padding: 5px;
1254
+ }
1255
+
1256
+ .vidply-icon {
1257
+ height: 22px;
1258
+ width: 22px;
1259
+ }
1260
+
1261
+ /* Reduce gaps */
1262
+ .vidply-controls-left,
1263
+ .vidply-controls-right {
1264
+ gap: 4px;
1265
+ }
1266
+ }
1267
+
1268
+ @keyframes slideUpFromBottom {
1269
+ from {
1270
+ transform: translateY(100%);
1271
+ opacity: 0;
1272
+ }
1273
+
1274
+ to {
1275
+ transform: translateY(0);
1276
+ opacity: 1;
1277
+ }
1278
+ }
1279
+
1280
+ /* Landscape mobile optimization */
1281
+ @media (width <= 896px) and (orientation: landscape) {
1282
+ .vidply-menu {
1283
+ max-height: 50vh;
1284
+ }
1285
+
1286
+ .vidply-transcript-window {
1287
+ max-height: 70vh;
1288
+ }
1289
+
1290
+ .vidply-settings-dialog {
1291
+ max-height: 80vh;
1292
+ }
1293
+ }
1294
+
1295
+ /* Extra small screens */
1296
+ @media (width <= 480px) {
1297
+ .vidply-speed-text {
1298
+ display: none;
1299
+ }
1300
+
1301
+ .vidply-button {
1302
+ min-height: 32px;
1303
+ min-width: 32px;
1304
+ padding: 4px;
1305
+ }
1306
+
1307
+ .vidply-icon {
1308
+ height: 20px;
1309
+ width: 20px;
1310
+ }
1311
+ }
1312
+
1313
+ /* Focus Visible Polyfill */
1314
+ .vidply-player :focus:not(:focus-visible) {
1315
+ outline: none;
1316
+ }
1317
+
1318
+ .vidply-player :focus-visible {
1319
+ outline: var(--vidply-focus-outline-white);
1320
+ outline-offset: 2px;
1321
+ }
1322
+
1323
+ /* Print Styles */
1324
+ @media print {
1325
+ .vidply-controls {
1326
+ display: none;
1327
+ }
1328
+ }
1329
+
1330
+ /* ============================================================================
1331
+ Playlist Styles
1332
+ ============================================================================ */
1333
+
1334
+ /* Track Info Display (below video, above playlist) */
1335
+ .vidply-track-info {
1336
+ background: var(--vidply-bg-track-info);
1337
+ border-bottom: 1px solid var(--vidply-border-light);
1338
+ order: 2; /* After video-wrapper */
1339
+ padding: 16px 20px;
1340
+ }
1341
+
1342
+ .vidply-track-number {
1343
+ color: var(--vidply-text-muted);
1344
+ font-size: 12px;
1345
+ letter-spacing: 0.5px;
1346
+ margin-bottom: 4px;
1347
+ text-transform: uppercase;
1348
+ }
1349
+
1350
+ .vidply-track-title {
1351
+ color: var(--vidply-white);
1352
+ font-size: 18px;
1353
+ font-weight: 600;
1354
+ margin-bottom: 4px;
1355
+ }
1356
+
1357
+ .vidply-track-artist {
1358
+ color: var(--vidply-white-80);
1359
+ font-size: 14px;
1360
+ }
1361
+
1362
+ /* Playlist Panel */
1363
+ .vidply-playlist-panel {
1364
+ background: var(--vidply-bg-playlist);
1365
+ border-top: 1px solid var(--vidply-border-light);
1366
+ max-height: 400px;
1367
+ order: 3; /* After track info */
1368
+ -webkit-overflow-scrolling: touch;
1369
+
1370
+ /* iOS momentum scrolling */
1371
+ overflow-y: auto;
1372
+ touch-action: pan-y;
1373
+ }
1374
+
1375
+ .vidply-playlist-header {
1376
+ background: var(--vidply-bg-playlist-header);
1377
+ border-bottom: 1px solid var(--vidply-border-light);
1378
+ color: var(--vidply-white-90);
1379
+ font-size: 13px;
1380
+ font-weight: 600;
1381
+ letter-spacing: 0.5px;
1382
+ padding: 12px 16px;
1383
+ position: sticky;
1384
+ text-transform: uppercase;
1385
+ top: 0;
1386
+ z-index: 2;
1387
+ }
1388
+
1389
+ .vidply-playlist-list {
1390
+ list-style: none;
1391
+ margin: 0;
1392
+ padding: 4px 0;
1393
+ }
1394
+
1395
+ /* Playlist Items */
1396
+ .vidply-playlist-item {
1397
+ align-items: center;
1398
+ background: transparent;
1399
+ border-left: 3px solid transparent;
1400
+ cursor: pointer;
1401
+ display: flex;
1402
+ gap: 12px;
1403
+ padding: 12px 16px;
1404
+ position: relative;
1405
+ transition: all 0.2s ease;
1406
+ }
1407
+
1408
+ .vidply-playlist-item:hover {
1409
+ background: var(--vidply-active-bg);
1410
+ border-left-color: var(--vidply-primary-50);
1411
+ }
1412
+
1413
+ .vidply-playlist-item:focus {
1414
+ background: var(--vidply-white-08);
1415
+ border-left-color: var(--vidply-primary);
1416
+ outline: 2px solid var(--vidply-primary-light);
1417
+ outline-offset: -2px;
1418
+ z-index: 1;
1419
+ }
1420
+
1421
+ .vidply-playlist-item:focus:not(:focus-visible) {
1422
+ outline: none;
1423
+ }
1424
+
1425
+ .vidply-playlist-item:focus-visible {
1426
+ background: var(--vidply-white-08);
1427
+ border-left-color: var(--vidply-primary);
1428
+ outline: 2px solid var(--vidply-primary-light);
1429
+ outline-offset: -2px;
1430
+ z-index: 1;
1431
+ }
1432
+
1433
+ .vidply-playlist-item-active {
1434
+ background: var(--vidply-primary-15);
1435
+ border-left-color: var(--vidply-primary);
1436
+ }
1437
+
1438
+ .vidply-playlist-item-active:hover {
1439
+ background: var(--vidply-primary-20);
1440
+ }
1441
+
1442
+ .vidply-playlist-item-active:focus,
1443
+ .vidply-playlist-item-active:focus-visible {
1444
+ background: var(--vidply-primary-20);
1445
+ outline: 2px solid var(--vidply-primary-light);
1446
+ outline-offset: -2px;
1447
+ }
1448
+
1449
+ /* Playlist Thumbnail */
1450
+ .vidply-playlist-thumbnail {
1451
+ align-items: center;
1452
+ background-color: var(--vidply-white-10);
1453
+ background-position: center;
1454
+ background-size: cover;
1455
+ border-radius: 4px;
1456
+ display: flex;
1457
+ flex-shrink: 0;
1458
+ height: 45px;
1459
+ justify-content: center;
1460
+ overflow: hidden;
1461
+ width: 80px;
1462
+ }
1463
+
1464
+ .vidply-playlist-thumbnail-icon {
1465
+ color: var(--vidply-text-subtle);
1466
+ height: 32px;
1467
+ transition: all 0.2s ease;
1468
+ width: 32px;
1469
+ }
1470
+
1471
+ .vidply-playlist-item:hover .vidply-playlist-thumbnail-icon {
1472
+ color: var(--vidply-text-muted);
1473
+ transform: scale(1.1);
1474
+ }
1475
+
1476
+ .vidply-playlist-item-active .vidply-playlist-thumbnail-icon {
1477
+ color: var(--vidply-primary-light);
1478
+ }
1479
+
1480
+ /* Playlist Item Info */
1481
+ .vidply-playlist-item-info {
1482
+ flex: 1;
1483
+ min-width: 0;
1484
+ }
1485
+
1486
+ .vidply-playlist-item-title {
1487
+ color: var(--vidply-white);
1488
+ font-size: 14px;
1489
+ font-weight: 500;
1490
+ margin-bottom: 4px;
1491
+ overflow: hidden;
1492
+ text-overflow: ellipsis;
1493
+ white-space: nowrap;
1494
+ }
1495
+
1496
+ .vidply-playlist-item-active .vidply-playlist-item-title {
1497
+ color: var(--vidply-primary-light);
1498
+ }
1499
+
1500
+ .vidply-playlist-item-artist {
1501
+ color: var(--vidply-text-disabled);
1502
+ font-size: 12px;
1503
+ overflow: hidden;
1504
+ text-overflow: ellipsis;
1505
+ white-space: nowrap;
1506
+ }
1507
+
1508
+ /* Playlist Item Icon */
1509
+ .vidply-playlist-item-icon {
1510
+ flex-shrink: 0;
1511
+ height: 20px;
1512
+ opacity: 0;
1513
+ transition: opacity 0.2s ease;
1514
+ width: 20px;
1515
+ }
1516
+
1517
+ .vidply-playlist-item:hover .vidply-playlist-item-icon,
1518
+ .vidply-playlist-item-active .vidply-playlist-item-icon {
1519
+ opacity: 0.7;
1520
+ }
1521
+
1522
+ .vidply-playlist-item-active .vidply-playlist-item-icon {
1523
+ color: var(--vidply-primary-light);
1524
+ opacity: 1;
1525
+ }
1526
+
1527
+ /* Playlist Scrollbar */
1528
+ .vidply-playlist-panel::-webkit-scrollbar {
1529
+ width: 8px;
1530
+ }
1531
+
1532
+ .vidply-playlist-panel::-webkit-scrollbar-track {
1533
+ background: var(--vidply-black-30);
1534
+ }
1535
+
1536
+ .vidply-playlist-panel::-webkit-scrollbar-thumb {
1537
+ background: var(--vidply-white-20);
1538
+ border-radius: 4px;
1539
+ }
1540
+
1541
+ .vidply-playlist-panel::-webkit-scrollbar-thumb:hover {
1542
+ background: var(--vidply-border-hover);
1543
+ }
1544
+
1545
+ /* Audio Player with Playlist */
1546
+ .vidply-player.vidply-audio.vidply-has-playlist {
1547
+ min-height: 200px;
1548
+ }
1549
+
1550
+ .vidply-player.vidply-audio.vidply-has-playlist audio {
1551
+ display: none;
1552
+ }
1553
+
1554
+ .vidply-player.vidply-audio.vidply-has-playlist .vidply-video-wrapper {
1555
+ flex: 1;
1556
+ }
1557
+
1558
+ .vidply-player.vidply-audio.vidply-has-playlist .vidply-controls {
1559
+ margin-top: auto;
1560
+ }
1561
+
1562
+ /* Transcript Window */
1563
+ .vidply-transcript-window {
1564
+ backdrop-filter: blur(10px);
1565
+ background: var(--vidply-bg-transcript);
1566
+ border: 1px solid var(--vidply-border);
1567
+ border-radius: 8px;
1568
+ box-shadow: 0 10px 40px var(--vidply-black-60);
1569
+ display: none;
1570
+ flex-direction: column;
1571
+ max-width: 400px;
1572
+ order: 4; /* After video-wrapper (1), track-info (2), and playlist-panel (3) */
1573
+ position: absolute;
1574
+ top: 0;
1575
+ width: 400px;
1576
+ z-index: 5;
1577
+ }
1578
+
1579
+ /* Minimum height for audio player transcript */
1580
+ .vidply-player.vidply-audio .vidply-transcript-window {
1581
+ min-height: 200px;
1582
+ }
1583
+
1584
+ .vidply-transcript-header {
1585
+ align-items: center;
1586
+ background: var(--vidply-active-bg);
1587
+ border-bottom: 1px solid var(--vidply-border-light);
1588
+ border-radius: 8px 8px 0 0;
1589
+ cursor: move;
1590
+ display: flex;
1591
+ justify-content: space-between;
1592
+ padding: 16px 20px;
1593
+ user-select: none;
1594
+ }
1595
+
1596
+ .vidply-transcript-header h3 {
1597
+ color: var(--vidply-white);
1598
+ font-size: 16px;
1599
+ font-weight: 600;
1600
+ margin: 0;
1601
+ }
1602
+
1603
+ .vidply-transcript-close {
1604
+ align-items: center;
1605
+ background: transparent;
1606
+ border: none;
1607
+ border-radius: 4px;
1608
+ color: var(--vidply-text-muted);
1609
+ cursor: pointer;
1610
+ display: flex;
1611
+ height: 28px;
1612
+ justify-content: center;
1613
+ padding: 4px;
1614
+ transition: all 0.2s ease;
1615
+ width: 28px;
1616
+ }
1617
+
1618
+ .vidply-transcript-close:hover {
1619
+ background: var(--vidply-white-10);
1620
+ color: var(--vidply-white);
1621
+ }
1622
+
1623
+ .vidply-transcript-close .vidply-icon {
1624
+ height: 18px;
1625
+ width: 18px;
1626
+ }
1627
+
1628
+ .vidply-transcript-content {
1629
+ flex: 1;
1630
+ -webkit-overflow-scrolling: touch;
1631
+ overflow-y: auto;
1632
+
1633
+ /* iOS momentum scrolling */
1634
+ padding: 12px 0;
1635
+ touch-action: pan-y;
1636
+ }
1637
+
1638
+ .vidply-transcript-entry {
1639
+ border-left: 3px solid transparent;
1640
+ cursor: pointer;
1641
+ padding: 12px 20px;
1642
+ transition: background 0.2s ease;
1643
+ }
1644
+
1645
+ .vidply-transcript-entry:hover,
1646
+ .vidply-transcript-entry:focus {
1647
+ background: var(--vidply-active-bg);
1648
+ }
1649
+
1650
+ .vidply-transcript-entry-active {
1651
+ background: var(--vidply-primary-15);
1652
+ border-left-color: var(--vidply-primary-light);
1653
+ }
1654
+
1655
+ .vidply-transcript-time {
1656
+ color: var(--vidply-primary-light);
1657
+ font-family: 'Courier New', monospace;
1658
+ font-size: 100%;
1659
+ font-weight: 600;
1660
+ margin-bottom: 4px;
1661
+ margin-right: 8px;
1662
+ }
1663
+
1664
+ .vidply-transcript-text {
1665
+ color: var(--vidply-white-90);
1666
+ font-size: 100%;
1667
+ line-height: 1.6;
1668
+ }
1669
+
1670
+ .vidply-transcript-entry-active .vidply-transcript-text {
1671
+ color: var(--vidply-white);
1672
+ text-decoration: underline;
1673
+ }
1674
+
1675
+ .vidply-transcript-entry:hover .vidply-transcript-text,
1676
+ .vidply-transcript-entry:focus .vidply-transcript-text {
1677
+ text-decoration: underline;
1678
+ }
1679
+
1680
+ /* Transcript entry types */
1681
+ .vidply-transcript-description {
1682
+ background: rgb(100 149 237 / 8%); /* Subtle blue tint for descriptions */
1683
+ border-left: 3px solid rgb(100 149 237 / 60%);
1684
+ }
1685
+
1686
+ .vidply-transcript-description .vidply-transcript-text {
1687
+ color: rgb(135 206 250 / 95%); /* Light sky blue for description text */
1688
+ font-style: italic;
1689
+ opacity: 0.9;
1690
+ }
1691
+
1692
+ .vidply-transcript-description .vidply-transcript-time {
1693
+ color: rgb(100 149 237 / 80%); /* Matching blue for timestamp */
1694
+ }
1695
+
1696
+ .vidply-transcript-description:hover,
1697
+ .vidply-transcript-description:focus {
1698
+ background: rgb(100 149 237 / 14%);
1699
+ }
1700
+
1701
+ .vidply-transcript-description:hover .vidply-transcript-text,
1702
+ .vidply-transcript-description:focus .vidply-transcript-text {
1703
+ opacity: 1;
1704
+ }
1705
+
1706
+ .vidply-transcript-description.vidply-transcript-entry-active {
1707
+ background: rgb(100 149 237 / 18%);
1708
+ border-left-color: #6495ed;
1709
+ }
1710
+
1711
+ .vidply-transcript-description.vidply-transcript-entry-active .vidply-transcript-text {
1712
+ color: rgb(135 206 250); /* Brighter on active */
1713
+ opacity: 1;
1714
+ }
1715
+
1716
+ /* Transcript Scrollbar */
1717
+ .vidply-transcript-content::-webkit-scrollbar {
1718
+ width: 8px;
1719
+ }
1720
+
1721
+ .vidply-transcript-content::-webkit-scrollbar-track {
1722
+ background: var(--vidply-black-30);
1723
+ }
1724
+
1725
+ .vidply-transcript-content::-webkit-scrollbar-thumb {
1726
+ background: var(--vidply-white-20);
1727
+ border-radius: 4px;
1728
+ }
1729
+
1730
+ .vidply-transcript-content::-webkit-scrollbar-thumb:hover {
1731
+ background: var(--vidply-border-hover);
1732
+ }
1733
+
1734
+ /* Transcript Header Left Side (Settings Button + Title) */
1735
+ .vidply-transcript-header-left {
1736
+ align-items: center;
1737
+ display: flex;
1738
+ gap: 8px;
1739
+ position: relative;
1740
+ }
1741
+
1742
+ /* Transcript Settings Button */
1743
+ .vidply-transcript-settings {
1744
+ align-items: center;
1745
+ background: transparent;
1746
+ border: none;
1747
+ border-radius: 4px;
1748
+ color: var(--vidply-text-muted);
1749
+ cursor: pointer;
1750
+ display: flex;
1751
+ height: 28px;
1752
+ justify-content: center;
1753
+ padding: 4px;
1754
+ position: relative;
1755
+ transition: all 0.2s ease;
1756
+ width: 28px;
1757
+ }
1758
+
1759
+ .vidply-transcript-settings:hover {
1760
+ background: var(--vidply-white-10);
1761
+ color: var(--vidply-white);
1762
+ }
1763
+
1764
+ .vidply-transcript-settings:focus {
1765
+ outline: 2px solid var(--vidply-primary-light);
1766
+ outline-offset: 2px;
1767
+ }
1768
+
1769
+ .vidply-transcript-settings .vidply-icon {
1770
+ height: 18px;
1771
+ width: 18px;
1772
+ }
1773
+
1774
+ /* Transcript Settings Menu */
1775
+ .vidply-transcript-settings-menu {
1776
+ background: var(--vidply-bg-menu);
1777
+ border: 1px solid var(--vidply-border);
1778
+ border-radius: 6px;
1779
+ box-shadow: var(--vidply-shadow-lg);
1780
+ display: none;
1781
+ left: 0;
1782
+ min-width: 240px;
1783
+ padding: 6px;
1784
+ position: absolute;
1785
+ top: calc(100% + 4px);
1786
+ z-index: 100;
1787
+ }
1788
+
1789
+ .vidply-transcript-settings-menu::after {
1790
+ border-bottom: 6px solid var(--vidply-bg-menu);
1791
+ border-left: 6px solid transparent;
1792
+ border-right: 6px solid transparent;
1793
+ bottom: 100%;
1794
+ content: '';
1795
+ height: 0;
1796
+ left: 14px;
1797
+ position: absolute;
1798
+ width: 0;
1799
+ }
1800
+
1801
+ /* Transcript Settings Menu Items */
1802
+ .vidply-transcript-settings-item {
1803
+ align-items: flex-start;
1804
+ background: transparent;
1805
+ border: none;
1806
+ border-radius: 4px;
1807
+ color: var(--vidply-white);
1808
+ cursor: pointer;
1809
+ display: flex;
1810
+ font-size: 13px;
1811
+ gap: 8px;
1812
+ padding: 8px 10px;
1813
+ text-align: left;
1814
+ transition: all 0.15s ease;
1815
+ width: 100%;
1816
+ }
1817
+
1818
+ .vidply-transcript-settings-item:hover {
1819
+ background: var(--vidply-primary-20);
1820
+ }
1821
+
1822
+ .vidply-transcript-settings-item:hover span {
1823
+ text-decoration: underline;
1824
+ }
1825
+
1826
+ .vidply-transcript-settings-item:focus {
1827
+ background: var(--vidply-primary-25);
1828
+ outline: none;
1829
+ }
1830
+
1831
+ .vidply-transcript-settings-item:focus span {
1832
+ text-decoration: underline;
1833
+ }
1834
+
1835
+ .vidply-transcript-settings-item:active span {
1836
+ text-decoration: underline;
1837
+ }
1838
+
1839
+ .vidply-transcript-settings-item .vidply-icon {
1840
+ flex-grow: 0.2;
1841
+ height: 20px;
1842
+ opacity: 0.9;
1843
+ width: 20px;
1844
+ }
1845
+
1846
+ .vidply-transcript-settings-item span {
1847
+ flex: 1;
1848
+ }
1849
+
1850
+ /* Move Mode Visual Feedback */
1851
+ .vidply-transcript-move-mode {
1852
+ animation: transcriptPulse 0.5s ease-in-out 2;
1853
+ box-shadow: 0 0 0 3px var(--vidply-primary-light), 0 10px 40px var(--vidply-black-60);
1854
+ }
1855
+
1856
+ @keyframes transcriptPulse {
1857
+ 0%, 100% {
1858
+ box-shadow: 0 0 0 3px var(--vidply-primary-light), 0 10px 40px var(--vidply-black-60);
1859
+ }
1860
+
1861
+ 50% {
1862
+ box-shadow: 0 0 0 6px var(--vidply-primary-light), 0 10px 40px var(--vidply-black-60);
1863
+ }
1864
+ }
1865
+
1866
+ /* Resize Handles */
1867
+ .vidply-transcript-resize-handle {
1868
+ position: absolute;
1869
+ z-index: 10;
1870
+ }
1871
+
1872
+ /* Corner handles - larger hit area */
1873
+ .vidply-transcript-resize-ne,
1874
+ .vidply-transcript-resize-nw,
1875
+ .vidply-transcript-resize-se,
1876
+ .vidply-transcript-resize-sw {
1877
+ height: 16px;
1878
+ width: 16px;
1879
+ }
1880
+
1881
+ /* Edge handles */
1882
+ .vidply-transcript-resize-n,
1883
+ .vidply-transcript-resize-s {
1884
+ cursor: ns-resize;
1885
+ height: 8px;
1886
+ left: 16px;
1887
+ right: 16px;
1888
+ }
1889
+
1890
+ .vidply-transcript-resize-e,
1891
+ .vidply-transcript-resize-w {
1892
+ bottom: 16px;
1893
+ cursor: ew-resize;
1894
+ top: 16px;
1895
+ width: 8px;
1896
+ }
1897
+
1898
+ /* Position each handle */
1899
+ .vidply-transcript-resize-n {
1900
+ top: -4px;
1901
+ }
1902
+
1903
+ .vidply-transcript-resize-s {
1904
+ bottom: -4px;
1905
+ }
1906
+
1907
+ .vidply-transcript-resize-e {
1908
+ right: -4px;
1909
+ }
1910
+
1911
+ .vidply-transcript-resize-w {
1912
+ left: -4px;
1913
+ }
1914
+
1915
+ .vidply-transcript-resize-ne {
1916
+ cursor: nesw-resize;
1917
+ right: -8px;
1918
+ top: -8px;
1919
+ }
1920
+
1921
+ .vidply-transcript-resize-nw {
1922
+ cursor: nwse-resize;
1923
+ left: -8px;
1924
+ top: -8px;
1925
+ }
1926
+
1927
+ .vidply-transcript-resize-se {
1928
+ bottom: -8px;
1929
+ cursor: nwse-resize;
1930
+ right: -8px;
1931
+ }
1932
+
1933
+ .vidply-transcript-resize-sw {
1934
+ bottom: -8px;
1935
+ cursor: nesw-resize;
1936
+ left: -8px;
1937
+ }
1938
+
1939
+ /* Visual indicator for resize handles when active */
1940
+ .vidply-transcript-resizable .vidply-transcript-resize-handle::after {
1941
+ background: var(--vidply-primary-light);
1942
+ border-radius: 50%;
1943
+ content: '';
1944
+ height: 6px;
1945
+ left: 50%;
1946
+ opacity: 0;
1947
+ position: absolute;
1948
+ top: 50%;
1949
+ transform: translate(-50%, -50%);
1950
+ transition: opacity 0.2s ease;
1951
+ width: 6px;
1952
+ }
1953
+
1954
+ .vidply-transcript-resizable:hover .vidply-transcript-resize-handle::after {
1955
+ opacity: 0.8;
1956
+ }
1957
+
1958
+ .vidply-transcript-resizable .vidply-transcript-resize-handle:hover::after {
1959
+ opacity: 1;
1960
+ }
1961
+
1962
+ /* Resizing State */
1963
+ .vidply-transcript-resizing {
1964
+ box-shadow: 0 0 0 2px var(--vidply-primary-light), 0 10px 40px var(--vidply-black-60);
1965
+ transition: none !important;
1966
+ }
1967
+
1968
+ .vidply-transcript-resizing .vidply-transcript-content {
1969
+ pointer-events: none;
1970
+ }
1971
+
1972
+ /* Keyboard Drag Mode */
1973
+ .vidply-transcript-keyboard-drag {
1974
+ box-shadow: 0 0 0 3px var(--vidply-primary-light), 0 10px 40px var(--vidply-black-60);
1975
+ }
1976
+
1977
+ .vidply-transcript-drag-indicator {
1978
+ background: linear-gradient(135deg, var(--vidply-primary) 0%, var(--vidply-primary-light) 100%);
1979
+ border-radius: 0 0 6px 6px;
1980
+ color: var(--vidply-white);
1981
+ font-size: 12px;
1982
+ font-weight: 600;
1983
+ left: 0;
1984
+ padding: 8px 12px;
1985
+ position: absolute;
1986
+ right: 0;
1987
+ text-align: center;
1988
+ top: 100%;
1989
+ z-index: 1000;
1990
+ }
1991
+
1992
+ /* Move Mode Tooltip */
1993
+ .vidply-transcript-move-tooltip {
1994
+ animation: fadeInDown 0.3s ease;
1995
+ background: var(--vidply-black-90);
1996
+ border-radius: 4px;
1997
+ color: var(--vidply-white);
1998
+ font-size: 12px;
1999
+ left: 50%;
2000
+ padding: 6px 12px;
2001
+ position: absolute;
2002
+ text-align: center;
2003
+ top: 100%;
2004
+ transform: translateX(-50%);
2005
+ white-space: nowrap;
2006
+ z-index: 1000;
2007
+ }
2008
+
2009
+ @keyframes fadeInDown {
2010
+ from {
2011
+ opacity: 0;
2012
+ transform: translateX(-50%) translateY(-10px);
2013
+ }
2014
+
2015
+ to {
2016
+ opacity: 1;
2017
+ transform: translateX(-50%) translateY(0);
2018
+ }
2019
+ }
2020
+
2021
+ /* Transcript Style Dialog - Dropdown Menu Style */
2022
+ .vidply-transcript-style-dialog {
2023
+ background: var(--vidply-bg-menu);
2024
+ border: 1px solid var(--vidply-border);
2025
+ border-radius: 8px;
2026
+ box-shadow: var(--vidply-shadow-lg);
2027
+ display: none;
2028
+ left: 0;
2029
+ max-height: 500px;
2030
+ min-width: 280px;
2031
+ overflow-y: auto;
2032
+ padding: 12px;
2033
+ position: absolute;
2034
+ top: 100%;
2035
+ width: auto;
2036
+ z-index: 100;
2037
+ }
2038
+
2039
+ /* Arrow pointing up to settings button */
2040
+ .vidply-transcript-style-dialog::after {
2041
+ border-color: transparent transparent var(--vidply-bg-menu) transparent;
2042
+ border-style: solid;
2043
+ border-width: 0 8px 8px;
2044
+ content: '';
2045
+ height: 0;
2046
+ left: 12px;
2047
+ position: absolute;
2048
+ top: -8px;
2049
+ width: 0;
2050
+ }
2051
+
2052
+ .vidply-transcript-style-title {
2053
+ border-bottom: 1px solid var(--vidply-border);
2054
+ color: var(--vidply-white);
2055
+ font-size: 14px;
2056
+ font-weight: 600;
2057
+ margin: 0 0 12px;
2058
+ padding-bottom: 8px;
2059
+ }
2060
+
2061
+ .vidply-transcript-style-group {
2062
+ margin-bottom: 12px;
2063
+ }
2064
+
2065
+ .vidply-transcript-style-group:last-child {
2066
+ margin-bottom: 0;
2067
+ }
2068
+
2069
+ .vidply-transcript-style-group label {
2070
+ color: var(--vidply-white-90);
2071
+ display: block;
2072
+ font-size: 12px;
2073
+ font-weight: 500;
2074
+ margin-bottom: 6px;
2075
+ }
2076
+
2077
+ /* Style Select */
2078
+ .vidply-transcript-style-select {
2079
+ background: var(--vidply-white-10);
2080
+ border: 1px solid var(--vidply-border);
2081
+ border-radius: 4px;
2082
+ color: var(--vidply-white);
2083
+ cursor: pointer;
2084
+ font-size: 13px;
2085
+ outline: none;
2086
+ padding: 6px 10px;
2087
+ transition: all 0.2s ease;
2088
+ width: 100%;
2089
+ }
2090
+
2091
+ .vidply-transcript-style-select:hover {
2092
+ background: var(--vidply-white-15);
2093
+ border-color: var(--vidply-border-hover);
2094
+ }
2095
+
2096
+ .vidply-transcript-style-select:focus {
2097
+ background: var(--vidply-white-15);
2098
+ border-color: var(--vidply-primary-light);
2099
+ box-shadow: 0 0 0 2px var(--vidply-primary-20);
2100
+ }
2101
+
2102
+ .vidply-transcript-style-select option {
2103
+ background: #1a1a1a;
2104
+ color: #fff;
2105
+ }
2106
+
2107
+ /* Style Color Input */
2108
+ .vidply-transcript-style-color {
2109
+ border: 1px solid var(--vidply-border);
2110
+ border-radius: 4px;
2111
+ cursor: pointer;
2112
+ height: 32px;
2113
+ outline: none;
2114
+ padding: 4px;
2115
+ transition: all 0.2s ease;
2116
+ width: 100%;
2117
+ }
2118
+
2119
+ .vidply-transcript-style-color:hover {
2120
+ border-color: var(--vidply-border-hover);
2121
+ }
2122
+
2123
+ .vidply-transcript-style-color:focus {
2124
+ border-color: var(--vidply-primary-light);
2125
+ box-shadow: 0 0 0 2px var(--vidply-primary-20);
2126
+ }
2127
+
2128
+ /* Style Range Slider */
2129
+ .vidply-transcript-style-range-container {
2130
+ align-items: center;
2131
+ display: flex;
2132
+ gap: 12px;
2133
+ }
2134
+
2135
+ .vidply-transcript-style-range {
2136
+ -webkit-appearance: none;
2137
+ appearance: none;
2138
+ background: var(--vidply-white-20);
2139
+ border-radius: 3px;
2140
+ cursor: pointer;
2141
+ flex: 1;
2142
+ height: 6px;
2143
+ outline: none;
2144
+ }
2145
+
2146
+ .vidply-transcript-style-range::-webkit-slider-thumb {
2147
+ -webkit-appearance: none;
2148
+ appearance: none;
2149
+ background: var(--vidply-primary-light);
2150
+ border: 2px solid var(--vidply-white);
2151
+ border-radius: 50%;
2152
+ box-shadow: var(--vidply-shadow-sm);
2153
+ cursor: pointer;
2154
+ height: 16px;
2155
+ transition: all 0.15s ease;
2156
+ width: 16px;
2157
+ }
2158
+
2159
+ .vidply-transcript-style-range::-webkit-slider-thumb:hover {
2160
+ background: var(--vidply-primary);
2161
+ transform: scale(1.15);
2162
+ }
2163
+
2164
+ .vidply-transcript-style-range::-moz-range-thumb {
2165
+ background: var(--vidply-primary-light);
2166
+ border: 2px solid var(--vidply-white);
2167
+ border-radius: 50%;
2168
+ box-shadow: var(--vidply-shadow-sm);
2169
+ cursor: pointer;
2170
+ height: 16px;
2171
+ transition: all 0.15s ease;
2172
+ width: 16px;
2173
+ }
2174
+
2175
+ .vidply-transcript-style-range::-moz-range-thumb:hover {
2176
+ background: var(--vidply-primary);
2177
+ transform: scale(1.15);
2178
+ }
2179
+
2180
+ .vidply-transcript-style-value {
2181
+ color: var(--vidply-text-muted);
2182
+ font-size: 13px;
2183
+ font-weight: 600;
2184
+ min-width: 40px;
2185
+ text-align: right;
2186
+ }
2187
+
2188
+ /* Style Close Button */
2189
+ .vidply-transcript-style-close {
2190
+ background: var(--vidply-primary);
2191
+ border: none;
2192
+ border-radius: 4px;
2193
+ color: var(--vidply-white);
2194
+ cursor: pointer;
2195
+ font-size: 13px;
2196
+ font-weight: 600;
2197
+ margin-top: 12px;
2198
+ padding: 8px 16px;
2199
+ transition: all 0.2s ease;
2200
+ width: 100%;
2201
+ }
2202
+
2203
+ .vidply-transcript-style-close:hover {
2204
+ background: var(--vidply-primary-light);
2205
+ transform: translateY(-1px);
2206
+ }
2207
+
2208
+ .vidply-transcript-style-close:active {
2209
+ transform: translateY(0);
2210
+ }
2211
+
2212
+ .vidply-transcript-style-close:focus {
2213
+ box-shadow: 0 0 0 3px var(--vidply-primary-20);
2214
+ outline: none;
2215
+ }
2216
+
2217
+ /* Sign Language Video Wrapper */
2218
+ .vidply-sign-language-wrapper {
2219
+ background: transparent;
2220
+ height: auto;
2221
+ max-width: 400px;
2222
+ min-height: 100px;
2223
+ min-width: 150px;
2224
+ position: absolute;
2225
+ transition: opacity 0.3s ease;
2226
+ width: 280px;
2227
+ z-index: 3;
2228
+ }
2229
+
2230
+ .vidply-fullscreen .vidply-sign-language-wrapper {
2231
+ max-width: 600px;
2232
+ }
2233
+
2234
+ .vidply-sign-language-wrapper:focus {
2235
+ outline: 2px solid var(--vidply-primary);
2236
+ outline-offset: 2px;
2237
+ }
2238
+
2239
+ /* Sign Language Video */
2240
+ .vidply-sign-language-video {
2241
+ background: var(--vidply-black);
2242
+ border: 2px solid var(--vidply-white-30);
2243
+ border-radius: 4px;
2244
+ box-shadow: 0 4px 12px var(--vidply-black-60);
2245
+ cursor: move;
2246
+ display: block;
2247
+ height: auto;
2248
+ pointer-events: auto;
2249
+ width: 100%;
2250
+ }
2251
+
2252
+ /* Dragging and Resizing States */
2253
+ .vidply-sign-dragging .vidply-sign-language-video {
2254
+ cursor: grabbing !important;
2255
+ opacity: 0.9;
2256
+ }
2257
+
2258
+ .vidply-sign-resizing .vidply-sign-language-video {
2259
+ cursor: nwse-resize !important;
2260
+ }
2261
+
2262
+ /* Keyboard Drag/Resize Modes */
2263
+ .vidply-sign-keyboard-drag,
2264
+ .vidply-sign-keyboard-resize {
2265
+ box-shadow: 0 0 0 3px var(--vidply-primary), 0 4px 12px var(--vidply-black-60);
2266
+ }
2267
+
2268
+ .vidply-sign-keyboard-drag::after,
2269
+ .vidply-sign-keyboard-resize::after {
2270
+ align-items: center;
2271
+ background: var(--vidply-primary);
2272
+ border-radius: 4px;
2273
+ color: var(--vidply-white);
2274
+ display: flex;
2275
+ font-size: 12px;
2276
+ font-weight: 600;
2277
+ justify-content: center;
2278
+ left: 50%;
2279
+ padding: 4px 8px;
2280
+ pointer-events: none;
2281
+ position: absolute;
2282
+ top: -28px;
2283
+ transform: translateX(-50%);
2284
+ white-space: nowrap;
2285
+ z-index: 10;
2286
+ }
2287
+
2288
+ .vidply-sign-keyboard-drag::after {
2289
+ content: 'DRAG MODE (Arrow keys to move, ESC to exit)';
2290
+ }
2291
+
2292
+ .vidply-sign-keyboard-resize::after {
2293
+ content: 'RESIZE MODE (Arrow keys to resize, ESC to exit)';
2294
+ }
2295
+
2296
+ /* Resize Handles */
2297
+ .vidply-sign-resize-handle {
2298
+ background: var(--vidply-white);
2299
+ border: 1px solid var(--vidply-black-30);
2300
+ border-radius: 50%;
2301
+ height: 12px;
2302
+ opacity: 0;
2303
+ position: absolute;
2304
+ transition: opacity 0.2s ease, background 0.2s ease;
2305
+ width: 12px;
2306
+ z-index: 10;
2307
+ }
2308
+
2309
+ .vidply-sign-language-wrapper:hover .vidply-sign-resize-handle,
2310
+ .vidply-sign-language-wrapper:focus .vidply-sign-resize-handle {
2311
+ opacity: 1;
2312
+ }
2313
+
2314
+ .vidply-sign-resize-handle:hover {
2315
+ background: var(--vidply-primary);
2316
+ }
2317
+
2318
+ .vidply-sign-resize-nw {
2319
+ cursor: nwse-resize;
2320
+ left: -6px;
2321
+ top: -6px;
2322
+ }
2323
+
2324
+ .vidply-sign-resize-ne {
2325
+ cursor: nesw-resize;
2326
+ right: -6px;
2327
+ top: -6px;
2328
+ }
2329
+
2330
+ .vidply-sign-resize-sw {
2331
+ bottom: -6px;
2332
+ cursor: nesw-resize;
2333
+ left: -6px;
2334
+ }
2335
+
2336
+ .vidply-sign-resize-se {
2337
+ bottom: -6px;
2338
+ cursor: nwse-resize;
2339
+ right: -6px;
2340
+ }
2341
+
2342
+ /* Sign Language Video Positions */
2343
+ .vidply-sign-position-bottom-right {
2344
+ bottom: 95px; /* Above controls */
2345
+ right: 16px;
2346
+ }
2347
+
2348
+ .vidply-sign-position-bottom-left {
2349
+ bottom: 95px; /* Above controls */
2350
+ left: 16px;
2351
+ }
2352
+
2353
+ .vidply-sign-position-top-right {
2354
+ right: 16px;
2355
+ top: 16px;
2356
+ }
2357
+
2358
+ .vidply-sign-position-top-left {
2359
+ left: 16px;
2360
+ top: 16px;
2361
+ }
2362
+
2363
+ /* Responsive Sign Language Video */
2364
+ @media (width <= 640px) {
2365
+ .vidply-sign-language-wrapper {
2366
+ min-width: 120px;
2367
+ width: 35%;
2368
+ }
2369
+
2370
+ .vidply-sign-position-bottom-right,
2371
+ .vidply-sign-position-bottom-left {
2372
+ bottom: 126px !important; /* Adjust for smaller controls */
2373
+ }
2374
+ }
2375
+
2376
+ /* Responsive Adjustments */
2377
+ @media (width <= 640px) {
2378
+ .vidply-playlist-thumbnail {
2379
+ height: 34px;
2380
+ width: 60px;
2381
+ }
2382
+
2383
+ .vidply-playlist-item {
2384
+ gap: 10px;
2385
+ padding: 10px 12px;
2386
+ }
2387
+
2388
+ .vidply-track-info {
2389
+ padding: 12px 16px;
2390
+ }
2391
+
2392
+ .vidply-track-title {
2393
+ font-size: 16px;
2394
+ }
2395
+
2396
+ /* Mobile transcript underneath video and controls */
2397
+ .vidply-transcript-window {
2398
+ border: none;
2399
+ border-radius: 0;
2400
+ border-top: 1px solid var(--vidply-border-light);
2401
+ box-shadow: none;
2402
+ order: 3; /* After controls (which are order: 2) */
2403
+ position: relative;
2404
+ width: 100%;
2405
+ z-index: 5;
2406
+ }
2407
+
2408
+ .vidply-transcript-header {
2409
+ border-radius: 0;
2410
+ padding: 12px 16px;
2411
+ }
2412
+
2413
+ .vidply-transcript-content {
2414
+ max-height: 400px;
2415
+ }
2416
+
2417
+ /* Don't show dragging cursor on mobile */
2418
+ .vidply-transcript-header {
2419
+ cursor: default !important;
2420
+ }
2421
+ }
2422
+