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