unified-video-framework 1.4.165 → 1.4.167
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.
|
@@ -51,9 +51,6 @@ export class WebPlayer extends BasePlayer {
|
|
|
51
51
|
private currentPlaybackRate = 1;
|
|
52
52
|
private isDragging: boolean = false;
|
|
53
53
|
|
|
54
|
-
// Settings menu state guard to keep controls interactive while open
|
|
55
|
-
private isSettingsOpen: boolean = false;
|
|
56
|
-
|
|
57
54
|
// Settings configuration
|
|
58
55
|
private settingsConfig = {
|
|
59
56
|
enabled: true, // Show settings button
|
|
@@ -4401,404 +4398,260 @@ export class WebPlayer extends BasePlayer {
|
|
|
4401
4398
|
}
|
|
4402
4399
|
|
|
4403
4400
|
/* Enhanced Responsive Media Queries with UX Best Practices */
|
|
4404
|
-
/* Mobile devices (portrait) -
|
|
4401
|
+
/* Mobile devices (portrait) - Material You Design (25-50-25 Layout) */
|
|
4405
4402
|
@media screen and (max-width: 767px) and (orientation: portrait) {
|
|
4406
4403
|
.uvf-responsive-container {
|
|
4407
4404
|
padding: 0;
|
|
4408
4405
|
width: 100vw !important;
|
|
4409
|
-
height:
|
|
4406
|
+
height: 100vh;
|
|
4407
|
+
height: 100dvh;
|
|
4410
4408
|
margin: 0;
|
|
4411
|
-
position:
|
|
4409
|
+
position: fixed;
|
|
4410
|
+
top: 0;
|
|
4411
|
+
left: 0;
|
|
4412
4412
|
overflow: hidden;
|
|
4413
4413
|
}
|
|
4414
4414
|
|
|
4415
|
-
@supports (height: 100dvh) {
|
|
4416
|
-
.uvf-responsive-container {
|
|
4417
|
-
height: calc(100dvh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
|
|
4418
|
-
}
|
|
4419
|
-
}
|
|
4420
|
-
|
|
4421
4415
|
.uvf-responsive-container .uvf-player-wrapper {
|
|
4422
4416
|
width: 100vw !important;
|
|
4423
|
-
height:
|
|
4424
|
-
|
|
4425
|
-
|
|
4426
|
-
|
|
4427
|
-
|
|
4428
|
-
|
|
4429
|
-
|
|
4430
|
-
|
|
4417
|
+
height: 100vh;
|
|
4418
|
+
height: 100dvh;
|
|
4419
|
+
position: fixed;
|
|
4420
|
+
top: 0;
|
|
4421
|
+
left: 0;
|
|
4422
|
+
display: flex;
|
|
4423
|
+
flex-direction: column;
|
|
4424
|
+
background: #000;
|
|
4425
|
+
overflow: hidden;
|
|
4431
4426
|
}
|
|
4432
4427
|
|
|
4428
|
+
/* Video container occupies middle 50% */
|
|
4433
4429
|
.uvf-responsive-container .uvf-video-container {
|
|
4434
|
-
|
|
4435
|
-
height:
|
|
4430
|
+
height: 50vh;
|
|
4431
|
+
height: 50dvh;
|
|
4432
|
+
width: 100vw;
|
|
4433
|
+
position: relative;
|
|
4434
|
+
margin-top: 25vh;
|
|
4435
|
+
margin-top: 25dvh;
|
|
4436
4436
|
aspect-ratio: unset !important;
|
|
4437
|
-
|
|
4437
|
+
background: radial-gradient(ellipse at center, #1a1a2e 0%, #000 100%);
|
|
4438
|
+
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4),
|
|
4439
|
+
0 4px 16px rgba(0, 0, 0, 0.3),
|
|
4440
|
+
0 2px 8px rgba(0, 0, 0, 0.2);
|
|
4438
4441
|
}
|
|
4439
4442
|
|
|
4440
|
-
|
|
4441
|
-
.uvf-controls-bar {
|
|
4442
|
-
position: absolute !important;
|
|
4443
|
-
bottom: 0 !important;
|
|
4444
|
-
left: 0 !important;
|
|
4445
|
-
right: 0 !important;
|
|
4446
|
-
padding: 16px 12px;
|
|
4447
|
-
padding-bottom: calc(16px + var(--uvf-safe-area-bottom, 0px));
|
|
4448
|
-
padding-left: calc(12px + var(--uvf-safe-area-left, 0px));
|
|
4449
|
-
padding-right: calc(12px + var(--uvf-safe-area-right, 0px));
|
|
4450
|
-
background: linear-gradient(to top, var(--uvf-overlay-strong) 0%, var(--uvf-overlay-medium) 80%, var(--uvf-overlay-transparent) 100%);
|
|
4451
|
-
box-sizing: border-box;
|
|
4452
|
-
z-index: 1000 !important;
|
|
4453
|
-
/* iOS Safari specific fixes */
|
|
4454
|
-
transform: translateZ(0);
|
|
4455
|
-
-webkit-transform: translateZ(0);
|
|
4456
|
-
will-change: transform;
|
|
4457
|
-
/* Ensure proper stacking */
|
|
4458
|
-
isolation: isolate;
|
|
4459
|
-
}
|
|
4460
|
-
|
|
4461
|
-
.uvf-progress-section {
|
|
4462
|
-
margin-bottom: 16px;
|
|
4463
|
-
}
|
|
4464
|
-
|
|
4465
|
-
/* Mobile-first responsive controls layout */
|
|
4466
|
-
.uvf-controls-row {
|
|
4467
|
-
gap: 8px;
|
|
4468
|
-
flex-wrap: nowrap;
|
|
4469
|
-
align-items: center;
|
|
4470
|
-
justify-content: space-between;
|
|
4471
|
-
position: relative;
|
|
4443
|
+
.uvf-video {
|
|
4472
4444
|
width: 100%;
|
|
4445
|
+
height: 100%;
|
|
4446
|
+
object-fit: contain;
|
|
4473
4447
|
}
|
|
4474
4448
|
|
|
4475
|
-
/*
|
|
4476
|
-
.uvf-
|
|
4477
|
-
|
|
4478
|
-
|
|
4479
|
-
|
|
4480
|
-
|
|
4481
|
-
|
|
4482
|
-
|
|
4483
|
-
|
|
4484
|
-
|
|
4485
|
-
|
|
4486
|
-
|
|
4487
|
-
|
|
4488
|
-
flex: 1;
|
|
4489
|
-
justify-content: center;
|
|
4490
|
-
}
|
|
4491
|
-
|
|
4492
|
-
/* Mobile control groups reordering */
|
|
4493
|
-
.uvf-controls-row .uvf-control-btn.play-pause,
|
|
4494
|
-
.uvf-controls-row #uvf-skip-back,
|
|
4495
|
-
.uvf-controls-row #uvf-skip-forward {
|
|
4496
|
-
order: 1;
|
|
4497
|
-
}
|
|
4498
|
-
|
|
4499
|
-
.uvf-controls-row .uvf-volume-control {
|
|
4500
|
-
order: 2;
|
|
4501
|
-
}
|
|
4502
|
-
|
|
4503
|
-
.uvf-controls-row .uvf-time-display:not(.uvf-above-seekbar) {
|
|
4504
|
-
order: 3;
|
|
4505
|
-
margin-left: auto;
|
|
4506
|
-
margin-right: 8px;
|
|
4507
|
-
}
|
|
4508
|
-
|
|
4509
|
-
.uvf-controls-row .uvf-right-controls {
|
|
4510
|
-
order: 4;
|
|
4511
|
-
margin-left: 0;
|
|
4512
|
-
}
|
|
4513
|
-
|
|
4514
|
-
/* Touch-friendly control sizing (minimum 44px touch target) */
|
|
4515
|
-
.uvf-control-btn {
|
|
4516
|
-
width: 44px;
|
|
4517
|
-
height: 44px;
|
|
4518
|
-
min-width: 44px;
|
|
4519
|
-
min-height: 44px;
|
|
4520
|
-
border-radius: 22px;
|
|
4521
|
-
background: rgba(255,255,255,0.15);
|
|
4522
|
-
backdrop-filter: blur(8px);
|
|
4523
|
-
}
|
|
4524
|
-
|
|
4525
|
-
.uvf-control-btn.play-pause {
|
|
4526
|
-
width: 52px;
|
|
4527
|
-
height: 52px;
|
|
4528
|
-
min-width: 52px;
|
|
4529
|
-
min-height: 52px;
|
|
4530
|
-
border-radius: 26px;
|
|
4531
|
-
background: linear-gradient(135deg, var(--uvf-accent-1), var(--uvf-accent-2));
|
|
4532
|
-
box-shadow: 0 4px 12px rgba(var(--uvf-accent-1), 0.3);
|
|
4533
|
-
}
|
|
4534
|
-
|
|
4535
|
-
.uvf-control-btn svg {
|
|
4536
|
-
width: 20px;
|
|
4537
|
-
height: 20px;
|
|
4538
|
-
}
|
|
4539
|
-
|
|
4540
|
-
.uvf-control-btn.play-pause svg {
|
|
4541
|
-
width: 24px;
|
|
4542
|
-
height: 24px;
|
|
4543
|
-
}
|
|
4544
|
-
|
|
4545
|
-
/* Skip buttons with clear visual hierarchy */
|
|
4546
|
-
#uvf-skip-back,
|
|
4547
|
-
#uvf-skip-forward {
|
|
4548
|
-
background: rgba(255,255,255,0.12);
|
|
4449
|
+
/* Top black section (25%) - Tap zone */
|
|
4450
|
+
.uvf-player-wrapper::before {
|
|
4451
|
+
content: '';
|
|
4452
|
+
position: absolute;
|
|
4453
|
+
top: 0;
|
|
4454
|
+
left: 0;
|
|
4455
|
+
width: 100vw;
|
|
4456
|
+
height: 25vh;
|
|
4457
|
+
height: 25dvh;
|
|
4458
|
+
background: #000;
|
|
4459
|
+
z-index: 1;
|
|
4460
|
+
pointer-events: all;
|
|
4461
|
+
touch-action: manipulation;
|
|
4549
4462
|
}
|
|
4550
4463
|
|
|
4551
|
-
|
|
4552
|
-
|
|
4553
|
-
|
|
4554
|
-
|
|
4464
|
+
/* Bottom black section (25%) - Controls area */
|
|
4465
|
+
.uvf-player-wrapper::after {
|
|
4466
|
+
content: '';
|
|
4467
|
+
position: absolute;
|
|
4468
|
+
bottom: 0;
|
|
4469
|
+
left: 0;
|
|
4470
|
+
width: 100vw;
|
|
4471
|
+
height: 25vh;
|
|
4472
|
+
height: 25dvh;
|
|
4473
|
+
background: linear-gradient(to top,
|
|
4474
|
+
#000 0%,
|
|
4475
|
+
rgba(0, 0, 0, 0.98) 20%,
|
|
4476
|
+
rgba(0, 0, 0, 0.95) 100%);
|
|
4477
|
+
z-index: 1;
|
|
4478
|
+
pointer-events: none;
|
|
4555
4479
|
}
|
|
4556
4480
|
|
|
4557
|
-
/*
|
|
4558
|
-
.uvf-
|
|
4559
|
-
|
|
4560
|
-
|
|
4561
|
-
|
|
4562
|
-
|
|
4563
|
-
|
|
4564
|
-
|
|
4565
|
-
|
|
4566
|
-
|
|
4481
|
+
/* Material surface container for controls */
|
|
4482
|
+
.uvf-controls-bar {
|
|
4483
|
+
position: absolute;
|
|
4484
|
+
bottom: 0;
|
|
4485
|
+
left: 0;
|
|
4486
|
+
right: 0;
|
|
4487
|
+
height: auto;
|
|
4488
|
+
max-height: 25vh;
|
|
4489
|
+
max-height: 25dvh;
|
|
4490
|
+
padding: 16px 20px;
|
|
4491
|
+
padding-bottom: calc(16px + var(--uvf-safe-area-bottom, 0px));
|
|
4492
|
+
background: transparent;
|
|
4493
|
+
z-index: 2;
|
|
4494
|
+
display: flex;
|
|
4495
|
+
flex-direction: column;
|
|
4496
|
+
justify-content: flex-end;
|
|
4497
|
+
backdrop-filter: blur(24px);
|
|
4498
|
+
-webkit-backdrop-filter: blur(24px);
|
|
4567
4499
|
}
|
|
4568
4500
|
|
|
4569
|
-
/*
|
|
4570
|
-
.uvf-
|
|
4571
|
-
|
|
4572
|
-
|
|
4573
|
-
|
|
4574
|
-
background: rgba(
|
|
4575
|
-
border-radius:
|
|
4576
|
-
|
|
4577
|
-
|
|
4578
|
-
border: 1px solid rgba(255,255,255,0.1) !important;
|
|
4501
|
+
/* Material surface tint overlay */
|
|
4502
|
+
.uvf-controls-bar::before {
|
|
4503
|
+
content: '';
|
|
4504
|
+
position: absolute;
|
|
4505
|
+
inset: 0;
|
|
4506
|
+
background: var(--uvf-surface-tint, rgba(255, 0, 0, 0.08));
|
|
4507
|
+
border-radius: 28px 28px 0 0;
|
|
4508
|
+
pointer-events: none;
|
|
4509
|
+
z-index: -1;
|
|
4579
4510
|
}
|
|
4580
4511
|
|
|
4581
|
-
/*
|
|
4582
|
-
.uvf-
|
|
4583
|
-
|
|
4512
|
+
/* Progress bar with chapter markers */
|
|
4513
|
+
.uvf-progress-section {
|
|
4514
|
+
margin-bottom: 12px;
|
|
4584
4515
|
position: relative;
|
|
4585
4516
|
}
|
|
4586
4517
|
|
|
4587
|
-
|
|
4588
|
-
|
|
4589
|
-
display: none;
|
|
4590
|
-
}
|
|
4591
|
-
|
|
4592
|
-
/* Mobile volume button as simple mute toggle */
|
|
4593
|
-
.uvf-volume-control .uvf-control-btn {
|
|
4594
|
-
width: 44px;
|
|
4595
|
-
height: 44px;
|
|
4596
|
-
}
|
|
4597
|
-
|
|
4598
|
-
/* Compact right controls for mobile */
|
|
4599
|
-
.uvf-right-controls {
|
|
4600
|
-
gap: 6px;
|
|
4601
|
-
display: flex;
|
|
4602
|
-
align-items: center;
|
|
4603
|
-
flex-shrink: 0;
|
|
4518
|
+
.uvf-progress-bar-wrapper {
|
|
4519
|
+
padding: 12px 0;
|
|
4604
4520
|
position: relative;
|
|
4605
|
-
z-index: 10;
|
|
4606
|
-
}
|
|
4607
|
-
|
|
4608
|
-
/* Ensure settings container is visible */
|
|
4609
|
-
.uvf-right-controls > div[style*="position: relative"],
|
|
4610
|
-
.uvf-settings-container {
|
|
4611
|
-
display: flex !important;
|
|
4612
|
-
position: relative !important;
|
|
4613
|
-
align-items: center !important;
|
|
4614
|
-
justify-content: center !important;
|
|
4615
|
-
min-width: 44px !important;
|
|
4616
|
-
min-height: 44px !important;
|
|
4617
|
-
}
|
|
4618
|
-
|
|
4619
|
-
/* Remove quality badge completely - not essential */
|
|
4620
|
-
.uvf-quality-badge {
|
|
4621
|
-
display: none !important;
|
|
4622
|
-
}
|
|
4623
|
-
|
|
4624
|
-
/* Settings menu - hidden by default, accessible via menu */
|
|
4625
|
-
.uvf-settings-menu {
|
|
4626
|
-
min-width: 160px;
|
|
4627
|
-
bottom: 60px;
|
|
4628
|
-
right: 12px;
|
|
4629
|
-
font-size: 14px;
|
|
4630
|
-
max-height: 50vh;
|
|
4631
4521
|
}
|
|
4632
4522
|
|
|
4633
|
-
.uvf-
|
|
4634
|
-
|
|
4635
|
-
|
|
4636
|
-
|
|
4637
|
-
|
|
4638
|
-
|
|
4639
|
-
|
|
4640
|
-
|
|
4641
|
-
.uvf-settings-option:hover {
|
|
4642
|
-
background: rgba(255,255,255,0.15);
|
|
4643
|
-
padding-left: 20px;
|
|
4644
|
-
}
|
|
4645
|
-
|
|
4646
|
-
/* Simplified settings - hide complex options */
|
|
4647
|
-
.uvf-settings-group:first-child .uvf-settings-option[data-speed="0.5"],
|
|
4648
|
-
.uvf-settings-group:first-child .uvf-settings-option[data-speed="0.75"],
|
|
4649
|
-
.uvf-settings-group:first-child .uvf-settings-option[data-speed="2"] {
|
|
4650
|
-
display: none;
|
|
4651
|
-
}
|
|
4523
|
+
.uvf-progress-bar {
|
|
4524
|
+
height: 4px;
|
|
4525
|
+
background: rgba(255, 255, 255, 0.2);
|
|
4526
|
+
border-radius: 4px;
|
|
4527
|
+
position: relative;
|
|
4528
|
+
overflow: visible;
|
|
4529
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
|
|
4652
4530
|
}
|
|
4653
4531
|
|
|
4654
|
-
|
|
4655
|
-
|
|
4656
|
-
|
|
4657
|
-
top: calc(12px + var(--uvf-safe-area-top));
|
|
4658
|
-
right: calc(12px + var(--uvf-safe-area-right));
|
|
4659
|
-
display: flex;
|
|
4660
|
-
align-items: center;
|
|
4661
|
-
gap: 8px;
|
|
4662
|
-
z-index: 10;
|
|
4663
|
-
}
|
|
4664
|
-
|
|
4665
|
-
/* Touch-friendly top buttons */
|
|
4666
|
-
.uvf-top-btn {
|
|
4667
|
-
width: 44px;
|
|
4668
|
-
height: 44px;
|
|
4669
|
-
min-width: 44px;
|
|
4670
|
-
min-height: 44px;
|
|
4671
|
-
background: rgba(0,0,0,0.7);
|
|
4672
|
-
backdrop-filter: blur(10px);
|
|
4673
|
-
border: 1px solid rgba(255,255,255,0.2);
|
|
4532
|
+
.uvf-progress-filled {
|
|
4533
|
+
background: var(--uvf-accent-1, #ff0000);
|
|
4534
|
+
box-shadow: 0 0 8px var(--uvf-accent-1, #ff0000);
|
|
4674
4535
|
}
|
|
4675
4536
|
|
|
4676
|
-
.uvf-
|
|
4537
|
+
.uvf-progress-handle {
|
|
4677
4538
|
width: 20px;
|
|
4678
4539
|
height: 20px;
|
|
4540
|
+
background: var(--uvf-accent-1, #ff0000);
|
|
4541
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3),
|
|
4542
|
+
0 0 0 0 var(--uvf-accent-1, #ff0000);
|
|
4543
|
+
transition: box-shadow 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
4679
4544
|
}
|
|
4680
4545
|
|
|
4681
|
-
|
|
4682
|
-
|
|
4683
|
-
|
|
4684
|
-
|
|
4685
|
-
|
|
4686
|
-
/* Enhanced title bar for mobile with safe area support */
|
|
4687
|
-
.uvf-title-bar {
|
|
4688
|
-
padding: 12px;
|
|
4689
|
-
padding-top: calc(12px + var(--uvf-safe-area-top));
|
|
4690
|
-
padding-left: calc(12px + var(--uvf-safe-area-left));
|
|
4691
|
-
padding-right: calc(12px + var(--uvf-safe-area-right));
|
|
4692
|
-
}
|
|
4693
|
-
|
|
4694
|
-
.uvf-video-title {
|
|
4695
|
-
font-size: 16px;
|
|
4696
|
-
font-weight: 700;
|
|
4697
|
-
line-height: 1.2;
|
|
4698
|
-
}
|
|
4699
|
-
|
|
4700
|
-
.uvf-video-subtitle {
|
|
4701
|
-
font-size: 12px;
|
|
4702
|
-
margin-top: 4px;
|
|
4703
|
-
opacity: 0.8;
|
|
4546
|
+
.uvf-progress-handle:active {
|
|
4547
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4),
|
|
4548
|
+
0 0 0 12px rgba(255, 0, 0, 0.15);
|
|
4549
|
+
transform: translate(-50%, -50%) scale(1.2);
|
|
4704
4550
|
}
|
|
4705
4551
|
|
|
4706
|
-
|
|
4552
|
+
/* Material Design control buttons */
|
|
4553
|
+
.uvf-control-btn {
|
|
4707
4554
|
width: 48px;
|
|
4708
4555
|
height: 48px;
|
|
4709
|
-
|
|
4710
|
-
|
|
4711
|
-
|
|
4712
|
-
|
|
4713
|
-
|
|
4714
|
-
|
|
4715
|
-
|
|
4716
|
-
|
|
4717
|
-
|
|
4718
|
-
box-shadow: 0 10px 30px var(--uvf-accent-1-20);
|
|
4556
|
+
min-width: 48px;
|
|
4557
|
+
min-height: 48px;
|
|
4558
|
+
background: rgba(255, 255, 255, 0.12);
|
|
4559
|
+
border-radius: 24px;
|
|
4560
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12),
|
|
4561
|
+
0 1px 2px rgba(0, 0, 0, 0.24);
|
|
4562
|
+
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
4563
|
+
position: relative;
|
|
4564
|
+
overflow: hidden;
|
|
4719
4565
|
}
|
|
4720
4566
|
|
|
4721
|
-
|
|
4722
|
-
|
|
4723
|
-
|
|
4724
|
-
|
|
4567
|
+
/* Material ripple effect */
|
|
4568
|
+
.uvf-control-btn::before {
|
|
4569
|
+
content: '';
|
|
4570
|
+
position: absolute;
|
|
4571
|
+
inset: 0;
|
|
4572
|
+
background: rgba(255, 255, 255, 0.1);
|
|
4573
|
+
border-radius: inherit;
|
|
4574
|
+
opacity: 0;
|
|
4575
|
+
transition: opacity 0.2s ease;
|
|
4725
4576
|
}
|
|
4726
4577
|
|
|
4727
|
-
.uvf-
|
|
4728
|
-
|
|
4729
|
-
height: clamp(28px, 5.2vw, 38px);
|
|
4730
|
-
margin-left: 4px;
|
|
4578
|
+
.uvf-control-btn:active::before {
|
|
4579
|
+
opacity: 1;
|
|
4731
4580
|
}
|
|
4732
4581
|
|
|
4733
|
-
|
|
4734
|
-
|
|
4735
|
-
|
|
4736
|
-
|
|
4737
|
-
border-radius: 4px;
|
|
4738
|
-
background: rgba(255,255,255,0.15);
|
|
4739
|
-
position: relative;
|
|
4582
|
+
.uvf-control-btn:active {
|
|
4583
|
+
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16),
|
|
4584
|
+
0 3px 6px rgba(0, 0, 0, 0.23);
|
|
4585
|
+
transform: scale(0.95);
|
|
4740
4586
|
}
|
|
4741
4587
|
|
|
4742
|
-
|
|
4743
|
-
|
|
4744
|
-
|
|
4745
|
-
|
|
4746
|
-
|
|
4747
|
-
|
|
4748
|
-
|
|
4749
|
-
|
|
4750
|
-
|
|
4588
|
+
.uvf-control-btn.play-pause {
|
|
4589
|
+
width: 56px;
|
|
4590
|
+
height: 56px;
|
|
4591
|
+
min-width: 56px;
|
|
4592
|
+
min-height: 56px;
|
|
4593
|
+
border-radius: 28px;
|
|
4594
|
+
background: linear-gradient(135deg,
|
|
4595
|
+
var(--uvf-accent-1, #ff0000),
|
|
4596
|
+
var(--uvf-accent-2, #ff4d4f));
|
|
4597
|
+
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2),
|
|
4598
|
+
0 2px 4px rgba(0, 0, 0, 0.15),
|
|
4599
|
+
0 0 0 0 var(--uvf-accent-1, #ff0000);
|
|
4751
4600
|
}
|
|
4752
4601
|
|
|
4753
|
-
.uvf-
|
|
4754
|
-
|
|
4755
|
-
|
|
4756
|
-
|
|
4757
|
-
box-shadow: 0 2px 8px rgba(0,0,0,0.3);
|
|
4602
|
+
.uvf-control-btn.play-pause:active {
|
|
4603
|
+
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.25),
|
|
4604
|
+
0 4px 8px rgba(0, 0, 0, 0.20),
|
|
4605
|
+
0 0 0 8px rgba(255, 0, 0, 0.12);
|
|
4758
4606
|
}
|
|
4759
4607
|
|
|
4760
|
-
.uvf-
|
|
4761
|
-
|
|
4608
|
+
.uvf-control-btn svg {
|
|
4609
|
+
width: 20px;
|
|
4610
|
+
height: 20px;
|
|
4762
4611
|
}
|
|
4763
4612
|
|
|
4764
|
-
|
|
4765
|
-
|
|
4766
|
-
|
|
4767
|
-
position: relative;
|
|
4768
|
-
overflow: visible;
|
|
4613
|
+
.uvf-control-btn.play-pause svg {
|
|
4614
|
+
width: 24px;
|
|
4615
|
+
height: 24px;
|
|
4769
4616
|
}
|
|
4770
4617
|
|
|
4771
|
-
/*
|
|
4772
|
-
.uvf-
|
|
4773
|
-
|
|
4774
|
-
|
|
4775
|
-
|
|
4618
|
+
/* Controls row with Material spacing */
|
|
4619
|
+
.uvf-controls-row {
|
|
4620
|
+
gap: 16px;
|
|
4621
|
+
padding: 0;
|
|
4622
|
+
align-items: center;
|
|
4776
4623
|
}
|
|
4777
4624
|
|
|
4778
|
-
|
|
4779
|
-
|
|
4780
|
-
|
|
4781
|
-
|
|
4782
|
-
|
|
4783
|
-
|
|
4625
|
+
/* Time display with Material surface */
|
|
4626
|
+
.uvf-time-display {
|
|
4627
|
+
background: rgba(255, 255, 255, 0.1);
|
|
4628
|
+
backdrop-filter: blur(8px);
|
|
4629
|
+
border-radius: 16px;
|
|
4630
|
+
padding: 6px 12px;
|
|
4631
|
+
font-size: 13px;
|
|
4632
|
+
font-weight: 500;
|
|
4633
|
+
font-feature-settings: 'tnum';
|
|
4634
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
|
|
4784
4635
|
}
|
|
4785
4636
|
|
|
4786
|
-
/*
|
|
4787
|
-
.uvf-
|
|
4788
|
-
|
|
4637
|
+
/* Hide desktop elements */
|
|
4638
|
+
.uvf-top-controls,
|
|
4639
|
+
.uvf-title-bar,
|
|
4640
|
+
.uvf-volume-control,
|
|
4641
|
+
#uvf-skip-back,
|
|
4642
|
+
#uvf-skip-forward {
|
|
4643
|
+
display: none !important;
|
|
4789
4644
|
}
|
|
4790
4645
|
|
|
4791
|
-
/*
|
|
4646
|
+
/* Optimize settings button for Material You */
|
|
4792
4647
|
#uvf-settings-btn {
|
|
4793
|
-
|
|
4794
|
-
|
|
4795
|
-
|
|
4796
|
-
min-
|
|
4797
|
-
|
|
4798
|
-
|
|
4799
|
-
|
|
4800
|
-
align-items: center !important;
|
|
4801
|
-
justify-content: center !important;
|
|
4648
|
+
width: 48px !important;
|
|
4649
|
+
height: 48px !important;
|
|
4650
|
+
min-width: 48px !important;
|
|
4651
|
+
min-height: 48px !important;
|
|
4652
|
+
border-radius: 24px !important;
|
|
4653
|
+
}
|
|
4654
|
+
}
|
|
4802
4655
|
}
|
|
4803
4656
|
|
|
4804
4657
|
#uvf-settings-btn svg {
|
|
@@ -6394,12 +6247,7 @@ export class WebPlayer extends BasePlayer {
|
|
|
6394
6247
|
|
|
6395
6248
|
// Force visibility if menu is active, hide if not active
|
|
6396
6249
|
if (settingsMenu) {
|
|
6397
|
-
|
|
6398
|
-
if (activating) {
|
|
6399
|
-
this.isSettingsOpen = true;
|
|
6400
|
-
// Keep controls visible and interactive while menu is open
|
|
6401
|
-
this.showControls();
|
|
6402
|
-
if (this.hideControlsTimeout) clearTimeout(this.hideControlsTimeout);
|
|
6250
|
+
if (settingsMenu.classList.contains('active')) {
|
|
6403
6251
|
settingsMenu.style.display = 'block';
|
|
6404
6252
|
settingsMenu.style.visibility = 'visible';
|
|
6405
6253
|
settingsMenu.style.opacity = '1';
|
|
@@ -6415,13 +6263,10 @@ export class WebPlayer extends BasePlayer {
|
|
|
6415
6263
|
settingsMenu.style.padding = '10px 0';
|
|
6416
6264
|
this.debugLog('Applied fallback styles to show menu');
|
|
6417
6265
|
} else {
|
|
6418
|
-
this.isSettingsOpen = false;
|
|
6419
6266
|
settingsMenu.style.display = 'none';
|
|
6420
6267
|
settingsMenu.style.visibility = 'hidden';
|
|
6421
6268
|
settingsMenu.style.opacity = '0';
|
|
6422
6269
|
this.debugLog('Applied fallback styles to hide menu');
|
|
6423
|
-
// After closing, allow auto-hide again if playing
|
|
6424
|
-
this.scheduleHideControls();
|
|
6425
6270
|
}
|
|
6426
6271
|
}
|
|
6427
6272
|
|
|
@@ -6461,19 +6306,6 @@ export class WebPlayer extends BasePlayer {
|
|
|
6461
6306
|
}
|
|
6462
6307
|
});
|
|
6463
6308
|
|
|
6464
|
-
// Keep controls active while interacting with settings menu
|
|
6465
|
-
if (settingsMenu) {
|
|
6466
|
-
const keepAlive = () => {
|
|
6467
|
-
if (!this.isSettingsOpen) return;
|
|
6468
|
-
this.showControls();
|
|
6469
|
-
if (this.hideControlsTimeout) clearTimeout(this.hideControlsTimeout);
|
|
6470
|
-
};
|
|
6471
|
-
settingsMenu.addEventListener('mouseenter', keepAlive);
|
|
6472
|
-
settingsMenu.addEventListener('mousemove', keepAlive);
|
|
6473
|
-
settingsMenu.addEventListener('touchstart', keepAlive, { passive: true } as any);
|
|
6474
|
-
settingsMenu.addEventListener('touchmove', keepAlive, { passive: true } as any);
|
|
6475
|
-
}
|
|
6476
|
-
|
|
6477
6309
|
// Add Escape key handler for settings menu
|
|
6478
6310
|
document.addEventListener('keydown', (e) => {
|
|
6479
6311
|
if (e.key === 'Escape' && settingsMenu?.classList.contains('active')) {
|
|
@@ -7125,8 +6957,6 @@ export class WebPlayer extends BasePlayer {
|
|
|
7125
6957
|
|
|
7126
6958
|
private hideControls(): void {
|
|
7127
6959
|
if (!this.state.isPlaying) return;
|
|
7128
|
-
// Never hide controls while settings menu is open
|
|
7129
|
-
if (this.isSettingsOpen) return;
|
|
7130
6960
|
|
|
7131
6961
|
const wrapper = this.container?.querySelector('.uvf-player-wrapper');
|
|
7132
6962
|
if (wrapper) {
|
|
@@ -7137,14 +6967,12 @@ export class WebPlayer extends BasePlayer {
|
|
|
7137
6967
|
|
|
7138
6968
|
private scheduleHideControls(): void {
|
|
7139
6969
|
if (!this.state.isPlaying) return;
|
|
7140
|
-
// Do not schedule auto-hide while settings are open
|
|
7141
|
-
if (this.isSettingsOpen) return;
|
|
7142
6970
|
|
|
7143
6971
|
if (this.hideControlsTimeout) clearTimeout(this.hideControlsTimeout);
|
|
7144
6972
|
// Use longer timeout in fullscreen for better UX
|
|
7145
6973
|
const timeout = this.isFullscreen() ? 4000 : 3000;
|
|
7146
6974
|
this.hideControlsTimeout = setTimeout(() => {
|
|
7147
|
-
if (this.state.isPlaying && !this.controlsContainer?.matches(':hover')
|
|
6975
|
+
if (this.state.isPlaying && !this.controlsContainer?.matches(':hover')) {
|
|
7148
6976
|
this.hideControls();
|
|
7149
6977
|
}
|
|
7150
6978
|
}, timeout);
|
|
@@ -8353,7 +8181,6 @@ export class WebPlayer extends BasePlayer {
|
|
|
8353
8181
|
if (!settingsMenu) return;
|
|
8354
8182
|
|
|
8355
8183
|
settingsMenu.classList.remove('active');
|
|
8356
|
-
this.isSettingsOpen = false;
|
|
8357
8184
|
|
|
8358
8185
|
// Apply fallback styles to ensure menu is hidden
|
|
8359
8186
|
settingsMenu.style.display = 'none';
|
|
@@ -8366,8 +8193,6 @@ export class WebPlayer extends BasePlayer {
|
|
|
8366
8193
|
});
|
|
8367
8194
|
|
|
8368
8195
|
this.debugLog('Settings menu hidden via hideSettingsMenu()');
|
|
8369
|
-
// Resume auto-hide if appropriate
|
|
8370
|
-
this.scheduleHideControls();
|
|
8371
8196
|
}
|
|
8372
8197
|
|
|
8373
8198
|
/**
|