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) - Enhanced UX with Safe Areas */
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: calc(100vh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
4406
+ height: 100vh;
4407
+ height: 100dvh;
4410
4408
  margin: 0;
4411
- position: relative;
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: 100% !important;
4424
- min-height: calc(100vh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
4425
- }
4426
-
4427
- @supports (height: 100dvh) {
4428
- .uvf-responsive-container .uvf-player-wrapper {
4429
- min-height: calc(100dvh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
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
- width: 100vw !important;
4435
- height: 100% !important;
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
- min-height: inherit;
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
- /* Enhanced mobile controls bar with safe area padding - iOS Safari specific fixes */
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
- /* Left side controls group */
4476
- .uvf-left-controls {
4477
- display: flex;
4478
- align-items: center;
4479
- gap: 8px;
4480
- flex-shrink: 0;
4481
- }
4482
-
4483
- /* Center controls group */
4484
- .uvf-center-controls {
4485
- display: flex;
4486
- align-items: center;
4487
- gap: 8px;
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
- #uvf-skip-back svg,
4552
- #uvf-skip-forward svg {
4553
- width: 22px;
4554
- height: 22px;
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
- /* Mobile time display - compact but readable */
4558
- .uvf-time-display:not(.uvf-above-seekbar) {
4559
- font-size: 12px;
4560
- font-weight: 600;
4561
- padding: 0 6px;
4562
- text-align: center;
4563
- background: rgba(0,0,0,0.3);
4564
- border-radius: 12px;
4565
- text-shadow: 0 1px 3px rgba(0,0,0,0.8);
4566
- flex-shrink: 0;
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
- /* Above-seekbar time display for mobile */
4570
- .uvf-time-display.uvf-above-seekbar {
4571
- font-size: 12px !important;
4572
- font-weight: 500 !important;
4573
- padding: 3px 6px !important;
4574
- background: rgba(0,0,0,0.4) !important;
4575
- border-radius: 10px !important;
4576
- text-shadow: 0 1px 2px rgba(0,0,0,0.8) !important;
4577
- backdrop-filter: blur(4px) !important;
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
- /* Simplified volume control for mobile */
4582
- .uvf-volume-control {
4583
- order: 3;
4512
+ /* Progress bar with chapter markers */
4513
+ .uvf-progress-section {
4514
+ margin-bottom: 12px;
4584
4515
  position: relative;
4585
4516
  }
4586
4517
 
4587
- /* Hide volume panel on mobile - use device controls */
4588
- .uvf-volume-panel {
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-settings-option {
4634
- padding: 12px 16px;
4635
- font-size: 14px;
4636
- min-height: 44px;
4637
- display: flex;
4638
- align-items: center;
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
- /* Enhanced top controls for mobile with safe area support */
4655
- .uvf-top-controls {
4656
- position: absolute;
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-top-btn svg {
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
- /* Share button - keep visible on all devices */
4682
- #uvf-share-btn {
4683
- display: flex;
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
- .uvf-video-thumb {
4552
+ /* Material Design control buttons */
4553
+ .uvf-control-btn {
4707
4554
  width: 48px;
4708
4555
  height: 48px;
4709
- border-radius: 6px;
4710
- }
4711
-
4712
- /* Touch-optimized center play button - uses same themed style as desktop */
4713
- .uvf-center-play-btn {
4714
- width: clamp(72px, 18vw, 96px);
4715
- height: clamp(72px, 18vw, 96px);
4716
- background: linear-gradient(135deg, var(--uvf-accent-1), var(--uvf-accent-2));
4717
- border: 0;
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
- .uvf-center-play-btn:hover {
4722
- transform: scale(1.06);
4723
- filter: saturate(1.08) brightness(1.05);
4724
- box-shadow: 0 14px 36px var(--uvf-accent-1-20);
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-center-play-btn svg {
4728
- width: clamp(28px, 5.2vw, 38px);
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
- /* Enhanced progress bar for touch */
4734
- .uvf-progress-bar {
4735
- height: 3px;
4736
- margin-bottom: 12px;
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
- /* Larger touch target for progress bar */
4743
- .uvf-progress-bar-wrapper::before {
4744
- content: '';
4745
- position: absolute;
4746
- top: -10px;
4747
- left: 0;
4748
- right: 0;
4749
- bottom: -10px;
4750
- z-index: 1;
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-progress-handle {
4754
- width: 18px;
4755
- height: 18px;
4756
- background: #fff;
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-progress-bar-wrapper:active .uvf-progress-handle {
4761
- transform: translate(-50%, -50%) scale(1.2);
4608
+ .uvf-control-btn svg {
4609
+ width: 20px;
4610
+ height: 20px;
4762
4611
  }
4763
4612
 
4764
- /* Mobile accessibility improvements */
4765
- .uvf-control-btn,
4766
- .uvf-top-btn {
4767
- position: relative;
4768
- overflow: visible;
4613
+ .uvf-control-btn.play-pause svg {
4614
+ width: 24px;
4615
+ height: 24px;
4769
4616
  }
4770
4617
 
4771
- /* Enhanced focus states for mobile */
4772
- .uvf-control-btn:focus,
4773
- .uvf-top-btn:focus {
4774
- outline: 2px solid var(--uvf-accent-1);
4775
- outline-offset: 2px;
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
- /* Show PiP on all devices - modern mobile browsers support it well */
4780
- #uvf-pip-btn {
4781
- display: block;
4782
- background: rgba(255,255,255,0.12);
4783
- border: 1px solid rgba(255,255,255,0.1);
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
- /* Essential controls in right section - Settings, PiP, and Fullscreen only */
4787
- .uvf-right-controls > *:not(#uvf-settings-btn):not(#uvf-fullscreen-btn):not(#uvf-pip-btn) {
4788
- display: none;
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
- /* Ensure settings button is always visible and properly sized on mobile */
4646
+ /* Optimize settings button for Material You */
4792
4647
  #uvf-settings-btn {
4793
- display: flex !important;
4794
- width: 44px !important;
4795
- height: 44px !important;
4796
- min-width: 44px !important;
4797
- min-height: 44px !important;
4798
- backdrop-filter: blur(8px) !important;
4799
- border-radius: 22px !important;
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
- const activating = settingsMenu.classList.contains('active');
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') && !this.isSettingsOpen) {
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
  /**