unified-video-framework 1.4.162 → 1.4.163

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.
@@ -3861,217 +3861,6 @@ export class WebPlayer extends BasePlayer {
3861
3861
  @media screen and (max-width: 767px) {
3862
3862
  html, body {
3863
3863
  overflow-x: hidden;
3864
- background: #000;
3865
- }
3866
-
3867
- /* Mobile Portrait Layout - Centered Player with Top/Bottom Black Areas */
3868
- @media screen and (orientation: portrait) {
3869
- .uvf-responsive-container {
3870
- display: flex;
3871
- flex-direction: column;
3872
- height: 100vh;
3873
- height: 100dvh;
3874
- background: #000;
3875
- overflow: hidden;
3876
- position: fixed;
3877
- top: 0;
3878
- left: 0;
3879
- width: 100vw;
3880
- }
3881
-
3882
- /* Top black area - 25% of viewport */
3883
- .uvf-responsive-container::before {
3884
- content: '';
3885
- flex: 0 0 25vh;
3886
- background: #000;
3887
- pointer-events: none;
3888
- }
3889
-
3890
- /* Bottom black area - 25% of viewport */
3891
- .uvf-responsive-container::after {
3892
- content: '';
3893
- flex: 0 0 25vh;
3894
- background: #000;
3895
- pointer-events: none;
3896
- }
3897
-
3898
- /* Centered video player wrapper - 50% of viewport */
3899
- .uvf-responsive-container .uvf-player-wrapper {
3900
- flex: 1;
3901
- width: 100vw;
3902
- display: flex;
3903
- align-items: center;
3904
- justify-content: center;
3905
- background: #000;
3906
- position: relative;
3907
- }
3908
-
3909
- /* Video container fills player wrapper */
3910
- .uvf-responsive-container .uvf-video-container {
3911
- width: 100%;
3912
- height: 100%;
3913
- position: relative;
3914
- background: #000;
3915
- border-radius: 0;
3916
- overflow: hidden;
3917
- }
3918
-
3919
- /* Video element fills container */
3920
- .uvf-responsive-container .uvf-video {
3921
- width: 100%;
3922
- height: 100%;
3923
- object-fit: contain;
3924
- background: #000;
3925
- }
3926
-
3927
- /* All controls positioned inside video container */
3928
- .uvf-controls-bar {
3929
- position: absolute !important;
3930
- bottom: 0 !important;
3931
- left: 0 !important;
3932
- right: 0 !important;
3933
- background: linear-gradient(to top, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.6) 60%, transparent 100%);
3934
- padding: 12px 16px;
3935
- padding-bottom: calc(12px + var(--uvf-safe-area-bottom));
3936
- z-index: 1000;
3937
- /* Ensure controls are always visible */
3938
- opacity: 1 !important;
3939
- visibility: visible !important;
3940
- display: flex !important;
3941
- flex-direction: column !important;
3942
- /* Ensure hardware acceleration */
3943
- -webkit-transform: translate3d(0,0,0);
3944
- transform: translate3d(0,0,0);
3945
- }
3946
-
3947
- /* Force controls visibility on mobile portrait */
3948
- .uvf-responsive-container .uvf-controls-bar {
3949
- opacity: 1 !important;
3950
- visibility: visible !important;
3951
- transform: translateY(0) !important;
3952
- pointer-events: auto !important;
3953
- }
3954
-
3955
- /* Progress section - ensure visibility */
3956
- .uvf-progress-section {
3957
- width: 100%;
3958
- margin-bottom: 8px;
3959
- opacity: 1 !important;
3960
- visibility: visible !important;
3961
- display: block !important;
3962
- }
3963
-
3964
- /* Progress bar styling */
3965
- .uvf-progress-bar-wrapper {
3966
- opacity: 1 !important;
3967
- visibility: visible !important;
3968
- }
3969
-
3970
- .uvf-progress-bar {
3971
- height: 4px;
3972
- background: rgba(255, 255, 255, 0.3);
3973
- border-radius: 2px;
3974
- }
3975
-
3976
- .uvf-progress-filled {
3977
- background: var(--uvf-accent-1, #8B5CF6);
3978
- height: 100%;
3979
- border-radius: 2px;
3980
- }
3981
-
3982
- /* Controls row alignment - ensure visibility */
3983
- .uvf-controls-row {
3984
- width: 100%;
3985
- display: flex !important;
3986
- align-items: center;
3987
- justify-content: flex-start;
3988
- gap: 12px;
3989
- opacity: 1 !important;
3990
- visibility: visible !important;
3991
- margin-top: 8px;
3992
- }
3993
-
3994
- /* Time display visibility */
3995
- .uvf-time-display {
3996
- color: #fff;
3997
- font-size: 12px;
3998
- font-weight: 500;
3999
- opacity: 1 !important;
4000
- visibility: visible !important;
4001
- display: block !important;
4002
- }
4003
-
4004
- /* Control buttons visibility */
4005
- .uvf-control-btn {
4006
- opacity: 1 !important;
4007
- visibility: visible !important;
4008
- display: flex !important;
4009
- color: #fff;
4010
- }
4011
-
4012
- .uvf-control-btn svg {
4013
- fill: #fff;
4014
- opacity: 1;
4015
- }
4016
-
4017
- /* Right controls - ensure visibility */
4018
- .uvf-right-controls {
4019
- margin-left: auto;
4020
- display: flex !important;
4021
- align-items: center;
4022
- gap: 8px;
4023
- opacity: 1 !important;
4024
- visibility: visible !important;
4025
- }
4026
-
4027
- /* Force controls to be always visible in portrait mode */
4028
- .uvf-responsive-container .uvf-player-wrapper.uvf-controls-visible .uvf-controls-bar,
4029
- .uvf-responsive-container .uvf-player-wrapper:hover .uvf-controls-bar,
4030
- .uvf-responsive-container .uvf-controls-bar {
4031
- opacity: 1 !important;
4032
- transform: translateY(0) !important;
4033
- visibility: visible !important;
4034
- display: flex !important;
4035
- pointer-events: auto !important;
4036
- }
4037
-
4038
- /* Ensure all child elements are visible */
4039
- .uvf-responsive-container .uvf-controls-bar * {
4040
- opacity: 1 !important;
4041
- visibility: visible !important;
4042
- }
4043
-
4044
- /* Center play button positioned within video */
4045
- .uvf-center-play-container {
4046
- position: absolute;
4047
- top: 50%;
4048
- left: 50%;
4049
- transform: translate(-50%, -50%);
4050
- z-index: 8;
4051
- pointer-events: none;
4052
- }
4053
-
4054
- .uvf-center-play-btn {
4055
- pointer-events: auto;
4056
- }
4057
-
4058
- /* Top controls within video */
4059
- .uvf-top-controls {
4060
- position: absolute;
4061
- top: calc(12px + var(--uvf-safe-area-top));
4062
- right: calc(16px + var(--uvf-safe-area-right));
4063
- z-index: 9;
4064
- }
4065
-
4066
- /* Title bar within video */
4067
- .uvf-title-bar {
4068
- position: absolute;
4069
- top: calc(12px + var(--uvf-safe-area-top));
4070
- left: calc(16px + var(--uvf-safe-area-left));
4071
- right: calc(80px + var(--uvf-safe-area-right));
4072
- z-index: 9;
4073
- padding: 8px 0;
4074
- }
4075
3864
  }
4076
3865
 
4077
3866
  .uvf-player-wrapper {
@@ -4095,37 +3884,6 @@ export class WebPlayer extends BasePlayer {
4095
3884
  transform: translateZ(0);
4096
3885
  }
4097
3886
 
4098
- /* Mobile controls optimization for touch */
4099
- .uvf-control-btn {
4100
- min-width: 44px;
4101
- min-height: 44px;
4102
- display: flex;
4103
- align-items: center;
4104
- justify-content: center;
4105
- border-radius: 50%;
4106
- transition: all 0.2s ease;
4107
- background: rgba(255, 255, 255, 0.1);
4108
- backdrop-filter: blur(8px);
4109
- }
4110
-
4111
- .uvf-control-btn:active {
4112
- transform: scale(0.95);
4113
- background: rgba(255, 255, 255, 0.2);
4114
- }
4115
-
4116
- /* Play/pause button prominence */
4117
- .uvf-control-btn.play-pause {
4118
- background: linear-gradient(135deg, var(--uvf-accent-1), var(--uvf-accent-2));
4119
- min-width: 52px;
4120
- min-height: 52px;
4121
- box-shadow: 0 2px 8px rgba(0,0,0,0.3);
4122
- }
4123
-
4124
- .uvf-control-btn.play-pause:active {
4125
- transform: scale(0.92);
4126
- box-shadow: 0 1px 4px rgba(0,0,0,0.4);
4127
- }
4128
-
4129
3887
  /* Fix for controls being cut off by virtual keyboard */
4130
3888
  .uvf-controls-bar {
4131
3889
  position: absolute !important;
@@ -4172,61 +3930,244 @@ export class WebPlayer extends BasePlayer {
4172
3930
  }
4173
3931
 
4174
3932
  /* Enhanced Responsive Media Queries with UX Best Practices */
4175
- /* Mobile devices (portrait) - Enhanced UX with Safe Areas */
3933
+ /* Mobile Portrait Layout - CENTERED PLAYER with TOP/BOTTOM BLACK AREAS */
4176
3934
  @media screen and (max-width: 767px) and (orientation: portrait) {
3935
+ /* CENTERED LAYOUT: 25% top black + 50% player + 25% bottom black */
4177
3936
  .uvf-responsive-container {
3937
+ display: flex;
3938
+ flex-direction: column;
3939
+ height: 100vh;
3940
+ height: 100dvh;
3941
+ background: #000;
3942
+ overflow: hidden;
3943
+ position: fixed;
3944
+ top: 0;
3945
+ left: 0;
3946
+ width: 100vw;
4178
3947
  padding: 0;
4179
- width: 100vw !important;
4180
- height: calc(100vh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
4181
3948
  margin: 0;
4182
- position: relative;
4183
- overflow: hidden;
4184
3949
  }
4185
3950
 
4186
- @supports (height: 100dvh) {
4187
- .uvf-responsive-container {
4188
- height: calc(100dvh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
4189
- }
3951
+ /* TOP BLACK AREA - 25% of viewport - COMPLETELY EMPTY */
3952
+ .uvf-responsive-container::before {
3953
+ content: '';
3954
+ flex: 0 0 25vh;
3955
+ background: #000;
3956
+ pointer-events: none;
4190
3957
  }
4191
3958
 
4192
- .uvf-responsive-container .uvf-player-wrapper {
4193
- width: 100vw !important;
4194
- height: 100% !important;
4195
- min-height: calc(100vh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
3959
+ /* BOTTOM BLACK AREA - 25% of viewport - COMPLETELY EMPTY */
3960
+ .uvf-responsive-container::after {
3961
+ content: '';
3962
+ flex: 0 0 25vh;
3963
+ background: #000;
3964
+ pointer-events: none;
4196
3965
  }
4197
3966
 
4198
- @supports (height: 100dvh) {
4199
- .uvf-responsive-container .uvf-player-wrapper {
4200
- min-height: calc(100dvh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
4201
- }
3967
+ /* CENTERED VIDEO PLAYER WRAPPER - 50% of viewport */
3968
+ .uvf-responsive-container .uvf-player-wrapper {
3969
+ flex: 1; /* Takes remaining 50% */
3970
+ width: 100vw;
3971
+ display: flex;
3972
+ align-items: center;
3973
+ justify-content: center;
3974
+ background: #000;
3975
+ position: relative;
3976
+ overflow: hidden; /* CRITICAL: Ensure nothing extends beyond this area */
4202
3977
  }
4203
3978
 
3979
+ /* Video container fills player wrapper */
4204
3980
  .uvf-responsive-container .uvf-video-container {
4205
- width: 100vw !important;
4206
- height: 100% !important;
4207
- aspect-ratio: unset !important;
4208
- min-height: inherit;
3981
+ width: 100%;
3982
+ height: 100%;
3983
+ position: relative;
3984
+ background: #000;
3985
+ border-radius: 0;
3986
+ overflow: hidden;
3987
+ }
3988
+
3989
+ /* Video element fills container */
3990
+ .uvf-responsive-container .uvf-video {
3991
+ width: 100%;
3992
+ height: 100%;
3993
+ object-fit: contain;
3994
+ background: #000;
4209
3995
  }
4210
3996
 
4211
- /* Enhanced mobile controls bar with safe area padding - iOS Safari specific fixes */
3997
+ /* CONTROLS STRICTLY CONTAINED WITHIN VIDEO AREA - NEVER EXTEND TO BLACK AREAS */
4212
3998
  .uvf-controls-bar {
4213
3999
  position: absolute !important;
4214
- bottom: 0 !important;
4215
- left: 0 !important;
4216
- right: 0 !important;
4217
- padding: 16px 12px;
4218
- padding-bottom: calc(16px + var(--uvf-safe-area-bottom, 0px));
4219
- padding-left: calc(12px + var(--uvf-safe-area-left, 0px));
4220
- padding-right: calc(12px + var(--uvf-safe-area-right, 0px));
4221
- background: linear-gradient(to top, var(--uvf-overlay-strong) 0%, var(--uvf-overlay-medium) 80%, var(--uvf-overlay-transparent) 100%);
4000
+ /* Keep controls INSIDE video container with margins from all edges */
4001
+ bottom: 20px !important; /* 20px margin from video bottom */
4002
+ left: 16px !important; /* 16px margin from video left */
4003
+ right: 16px !important; /* 16px margin from video right */
4004
+ top: auto !important;
4005
+ background: linear-gradient(to top, rgba(0,0,0,0.9) 0%, rgba(0,0,0,0.7) 60%, transparent 100%);
4006
+ padding: 12px 16px;
4007
+ border-radius: 12px;
4008
+ z-index: 1000;
4009
+ /* Ensure controls are visible and contained */
4010
+ opacity: 1 !important;
4011
+ visibility: visible !important;
4012
+ display: flex !important;
4013
+ flex-direction: column !important;
4014
+ /* Hardware acceleration */
4015
+ -webkit-transform: translate3d(0,0,0);
4016
+ transform: translate3d(0,0,0);
4017
+ /* CRITICAL: Prevent any overflow into black areas */
4018
+ max-height: calc(100% - 40px); /* Leave 20px margin from top and bottom */
4019
+ max-width: calc(100% - 32px); /* Leave 16px margin from left and right */
4222
4020
  box-sizing: border-box;
4223
- z-index: 1000 !important;
4224
- /* iOS Safari specific fixes */
4225
- transform: translateZ(0);
4226
- -webkit-transform: translateZ(0);
4227
- will-change: transform;
4228
- /* Ensure proper stacking */
4229
- isolation: isolate;
4021
+ /* Visual containment indicators */
4022
+ border: 1px solid rgba(255, 255, 255, 0.1);
4023
+ backdrop-filter: blur(10px);
4024
+ contain: layout style paint; /* CSS containment */
4025
+ }
4026
+
4027
+ /* Force controls and all child elements to stay within video container */
4028
+ .uvf-responsive-container .uvf-controls-bar {
4029
+ opacity: 1 !important;
4030
+ visibility: visible !important;
4031
+ transform: translateY(0) !important;
4032
+ pointer-events: auto !important;
4033
+ /* Ensure no child elements extend beyond container */
4034
+ contain: layout style paint;
4035
+ }
4036
+
4037
+ /* Ensure all child elements of controls stay within bounds */
4038
+ .uvf-responsive-container .uvf-controls-bar * {
4039
+ max-width: 100%;
4040
+ box-sizing: border-box;
4041
+ }
4042
+
4043
+ /* Progress section contained within controls */
4044
+ .uvf-progress-section {
4045
+ width: 100%;
4046
+ margin-bottom: 8px;
4047
+ opacity: 1 !important;
4048
+ visibility: visible !important;
4049
+ display: block !important;
4050
+ }
4051
+
4052
+ /* Progress bar styling */
4053
+ .uvf-progress-bar-wrapper {
4054
+ opacity: 1 !important;
4055
+ visibility: visible !important;
4056
+ }
4057
+
4058
+ .uvf-progress-bar {
4059
+ height: 4px;
4060
+ background: rgba(255, 255, 255, 0.3);
4061
+ border-radius: 2px;
4062
+ }
4063
+
4064
+ .uvf-progress-filled {
4065
+ background: var(--uvf-accent-1, #8B5CF6);
4066
+ height: 100%;
4067
+ border-radius: 2px;
4068
+ }
4069
+
4070
+ /* Controls row alignment - ensure visibility */
4071
+ .uvf-controls-row {
4072
+ width: 100%;
4073
+ display: flex !important;
4074
+ align-items: center;
4075
+ justify-content: flex-start;
4076
+ gap: 12px;
4077
+ opacity: 1 !important;
4078
+ visibility: visible !important;
4079
+ margin-top: 8px;
4080
+ }
4081
+
4082
+ /* Time display visibility */
4083
+ .uvf-time-display {
4084
+ color: #fff;
4085
+ font-size: 12px;
4086
+ font-weight: 500;
4087
+ opacity: 1 !important;
4088
+ visibility: visible !important;
4089
+ display: block !important;
4090
+ }
4091
+
4092
+ /* Control buttons visibility */
4093
+ .uvf-control-btn {
4094
+ min-width: 44px;
4095
+ min-height: 44px;
4096
+ display: flex !important;
4097
+ align-items: center;
4098
+ justify-content: center;
4099
+ border-radius: 50%;
4100
+ background: rgba(255, 255, 255, 0.1);
4101
+ backdrop-filter: blur(8px);
4102
+ color: #fff;
4103
+ opacity: 1 !important;
4104
+ visibility: visible !important;
4105
+ transition: all 0.2s ease;
4106
+ }
4107
+
4108
+ .uvf-control-btn:active {
4109
+ transform: scale(0.95);
4110
+ background: rgba(255, 255, 255, 0.2);
4111
+ }
4112
+
4113
+ /* Play/pause button prominence */
4114
+ .uvf-control-btn.play-pause {
4115
+ background: linear-gradient(135deg, var(--uvf-accent-1), var(--uvf-accent-2));
4116
+ min-width: 52px;
4117
+ min-height: 52px;
4118
+ box-shadow: 0 2px 8px rgba(0,0,0,0.3);
4119
+ }
4120
+
4121
+ .uvf-control-btn.play-pause:active {
4122
+ transform: scale(0.92);
4123
+ box-shadow: 0 1px 4px rgba(0,0,0,0.4);
4124
+ }
4125
+
4126
+ .uvf-control-btn svg {
4127
+ fill: #fff;
4128
+ opacity: 1;
4129
+ }
4130
+
4131
+ /* Right controls */
4132
+ .uvf-right-controls {
4133
+ margin-left: auto;
4134
+ display: flex !important;
4135
+ align-items: center;
4136
+ gap: 8px;
4137
+ opacity: 1 !important;
4138
+ visibility: visible !important;
4139
+ }
4140
+
4141
+ /* Center play button positioned within video */
4142
+ .uvf-center-play-container {
4143
+ position: absolute;
4144
+ top: 50%;
4145
+ left: 50%;
4146
+ transform: translate(-50%, -50%);
4147
+ z-index: 8;
4148
+ pointer-events: none;
4149
+ }
4150
+
4151
+ .uvf-center-play-btn {
4152
+ pointer-events: auto;
4153
+ }
4154
+
4155
+ /* Top controls within video */
4156
+ .uvf-top-controls {
4157
+ position: absolute;
4158
+ top: calc(12px + var(--uvf-safe-area-top));
4159
+ right: calc(16px + var(--uvf-safe-area-right));
4160
+ z-index: 9;
4161
+ }
4162
+
4163
+ /* Title bar within video */
4164
+ .uvf-title-bar {
4165
+ position: absolute;
4166
+ top: calc(12px + var(--uvf-safe-area-top));
4167
+ left: calc(16px + var(--uvf-safe-area-left));
4168
+ right: calc(80px + var(--uvf-safe-area-right));
4169
+ z-index: 9;
4170
+ padding: 8px 0;
4230
4171
  }
4231
4172
 
4232
4173
  .uvf-progress-section {
@@ -4607,69 +4548,55 @@ export class WebPlayer extends BasePlayer {
4607
4548
  }
4608
4549
  }
4609
4550
 
4610
- /* Mobile devices (landscape) - Fullscreen with controls inside video */
4551
+ /* Mobile devices (landscape) - Optimized for fullscreen viewing with safe areas */
4611
4552
  @media screen and (max-width: 767px) and (orientation: landscape) {
4612
4553
  .uvf-responsive-container {
4613
- position: fixed;
4614
- top: 0;
4615
- left: 0;
4616
4554
  width: 100vw !important;
4617
- height: 100vh !important;
4618
- height: 100dvh !important;
4619
- background: #000;
4620
- z-index: 9999;
4621
- display: block; /* Override portrait flexbox */
4555
+ height: calc(100vh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
4622
4556
  margin: 0;
4623
4557
  padding: 0;
4558
+ position: relative;
4624
4559
  overflow: hidden;
4625
4560
  }
4626
4561
 
4627
- /* Remove pseudo-elements in landscape */
4628
- .uvf-responsive-container::before,
4629
- .uvf-responsive-container::after {
4630
- display: none !important;
4562
+ @supports (height: 100dvh) {
4563
+ .uvf-responsive-container {
4564
+ height: calc(100dvh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
4565
+ }
4631
4566
  }
4632
4567
 
4633
4568
  .uvf-responsive-container .uvf-player-wrapper {
4634
4569
  width: 100vw !important;
4635
- height: 100vh !important;
4636
- height: 100dvh !important;
4637
- position: relative;
4638
- display: block;
4570
+ height: 100% !important;
4571
+ min-height: calc(100vh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
4639
4572
  }
4640
4573
 
4641
- .uvf-responsive-container .uvf-video-container {
4642
- width: 100vw !important;
4643
- height: 100vh !important;
4644
- height: 100dvh !important;
4645
- position: relative;
4646
- background: #000;
4647
- overflow: hidden;
4574
+ @supports (height: 100dvh) {
4575
+ .uvf-responsive-container .uvf-player-wrapper {
4576
+ min-height: calc(100dvh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
4577
+ }
4648
4578
  }
4649
4579
 
4650
- .uvf-responsive-container .uvf-video {
4651
- width: 100%;
4652
- height: 100%;
4653
- object-fit: contain;
4654
- background: #000;
4580
+ .uvf-responsive-container .uvf-video-container {
4581
+ width: 100vw !important;
4582
+ height: 100% !important;
4583
+ aspect-ratio: unset !important;
4584
+ min-height: inherit;
4655
4585
  }
4656
4586
 
4657
- /* Compact controls for landscape - positioned inside video container */
4587
+ /* Compact controls for landscape with safe area padding */
4658
4588
  .uvf-controls-bar {
4659
- position: absolute !important;
4660
- bottom: 0 !important;
4661
- left: 0 !important;
4662
- right: 0 !important;
4589
+ position: absolute;
4590
+ bottom: 0;
4591
+ left: 0;
4592
+ right: 0;
4663
4593
  padding: 10px 12px;
4664
4594
  padding-bottom: calc(10px + var(--uvf-safe-area-bottom));
4665
4595
  padding-left: calc(12px + var(--uvf-safe-area-left));
4666
4596
  padding-right: calc(12px + var(--uvf-safe-area-right));
4667
- background: linear-gradient(to top, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.6) 60%, transparent 100%);
4597
+ background: linear-gradient(to top, var(--uvf-overlay-strong) 0%, var(--uvf-overlay-medium) 80%, var(--uvf-overlay-transparent) 100%);
4668
4598
  box-sizing: border-box;
4669
4599
  z-index: 1000;
4670
- /* Ensure hardware acceleration */
4671
- -webkit-transform: translate3d(0,0,0);
4672
- transform: translate3d(0,0,0);
4673
4600
  }
4674
4601
 
4675
4602
  .uvf-progress-section {
@@ -4705,36 +4632,16 @@ export class WebPlayer extends BasePlayer {
4705
4632
  height: 22px;
4706
4633
  }
4707
4634
 
4708
- /* Compact top controls with safe area padding - inside video container */
4635
+ /* Compact top controls with safe area padding */
4709
4636
  .uvf-top-controls {
4710
- position: absolute;
4711
4637
  top: calc(8px + var(--uvf-safe-area-top));
4712
4638
  right: calc(12px + var(--uvf-safe-area-right));
4713
4639
  gap: 6px;
4714
- z-index: 9;
4715
- }
4716
-
4717
- /* Center play button positioned within video container */
4718
- .uvf-center-play-container {
4719
- position: absolute;
4720
- top: 50%;
4721
- left: 50%;
4722
- transform: translate(-50%, -50%);
4723
- z-index: 8;
4724
- pointer-events: none;
4725
- }
4726
-
4727
- .uvf-center-play-btn {
4728
- pointer-events: auto;
4729
4640
  }
4730
4641
 
4731
4642
  .uvf-title-bar {
4732
- position: absolute;
4733
- top: calc(8px + var(--uvf-safe-area-top));
4734
- left: calc(12px + var(--uvf-safe-area-left));
4735
- right: calc(80px + var(--uvf-safe-area-right));
4736
- z-index: 9;
4737
- padding: 8px 0;
4643
+ padding: 8px 12px;
4644
+ padding-top: calc(8px + var(--uvf-safe-area-top));
4738
4645
  padding-left: calc(12px + var(--uvf-safe-area-left));
4739
4646
  padding-right: calc(12px + var(--uvf-safe-area-right));
4740
4647
  }
@@ -4922,234 +4829,13 @@ export class WebPlayer extends BasePlayer {
4922
4829
 
4923
4830
  /* Large screens - Enhanced desktop experience */
4924
4831
  @media screen and (min-width: 1024px) {
4925
- /* Reset mobile portrait styles for desktop */
4926
4832
  .uvf-responsive-container {
4927
- display: block !important; /* Override mobile flexbox */
4928
- position: relative !important; /* Override mobile fixed */
4929
- height: auto !important; /* Override mobile viewport height */
4930
- background: transparent !important; /* Override mobile black background */
4931
4833
  padding: 10px;
4932
4834
  }
4933
4835
 
4934
- /* Remove mobile pseudo-elements on desktop */
4935
- .uvf-responsive-container::before,
4936
- .uvf-responsive-container::after {
4937
- display: none !important;
4938
- }
4939
-
4940
- /* Desktop player wrapper */
4941
- .uvf-responsive-container .uvf-player-wrapper {
4942
- width: 100% !important; /* Override mobile width */
4943
- height: auto !important; /* Override mobile height */
4944
- display: block !important; /* Override mobile flexbox */
4945
- position: relative !important;
4946
- max-width: none; /* Allow full width if needed */
4947
- }
4948
-
4949
- /* Desktop video container */
4950
- .uvf-responsive-container .uvf-video-container {
4951
- width: 100% !important;
4952
- height: auto !important;
4953
- position: relative;
4954
- aspect-ratio: 16/9; /* Maintain desktop aspect ratio */
4955
- background: #000;
4956
- }
4957
-
4958
- /* Desktop controls positioning */
4959
4836
  .uvf-controls-bar {
4960
- position: absolute !important;
4961
- bottom: 0 !important;
4962
- left: 0 !important;
4963
- right: 0 !important;
4964
4837
  padding: 20px;
4965
4838
  background: linear-gradient(to top, var(--uvf-overlay-strong) 0%, var(--uvf-overlay-medium) 60%, var(--uvf-overlay-transparent) 100%);
4966
- /* Reset mobile overrides for desktop */
4967
- opacity: 0; /* Default hidden state on desktop */
4968
- transform: translateY(10px); /* Default hidden position */
4969
- transition: all 0.3s ease;
4970
- }
4971
-
4972
- /* Desktop hover behavior */
4973
- .uvf-player-wrapper:hover .uvf-controls-bar,
4974
- .uvf-player-wrapper.controls-visible .uvf-controls-bar {
4975
- opacity: 1 !important;
4976
- transform: translateY(0) !important;
4977
- }
4978
-
4979
- /* Desktop progress section */
4980
- .uvf-progress-section {
4981
- margin-bottom: 15px;
4982
- width: 100%;
4983
- }
4984
-
4985
- /* Desktop controls row */
4986
- .uvf-controls-row {
4987
- display: flex;
4988
- align-items: center;
4989
- justify-content: flex-start;
4990
- gap: 14px;
4991
- width: 100%;
4992
- }
4993
-
4994
- /* Desktop control buttons */
4995
- .uvf-control-btn {
4996
- width: 40px;
4997
- height: 40px;
4998
- min-width: 40px;
4999
- min-height: 40px;
5000
- display: flex;
5001
- align-items: center;
5002
- justify-content: center;
5003
- border: none;
5004
- border-radius: 50%;
5005
- background: rgba(255, 255, 255, 0.1);
5006
- color: #fff;
5007
- cursor: pointer;
5008
- transition: all 0.2s cubic-bezier(0.4, 0.0, 0.2, 1);
5009
- backdrop-filter: blur(8px);
5010
- }
5011
-
5012
- .uvf-control-btn:hover {
5013
- transform: scale(1.1);
5014
- background: rgba(255, 255, 255, 0.2);
5015
- }
5016
-
5017
- .uvf-control-btn.play-pause {
5018
- width: 50px;
5019
- height: 50px;
5020
- min-width: 50px;
5021
- min-height: 50px;
5022
- background: linear-gradient(135deg, var(--uvf-accent-1), var(--uvf-accent-2));
5023
- box-shadow: 0 2px 8px rgba(0,0,0,0.2);
5024
- }
5025
-
5026
- .uvf-control-btn.play-pause:hover {
5027
- transform: scale(1.08);
5028
- box-shadow: 0 4px 12px rgba(0,0,0,0.3);
5029
- }
5030
-
5031
- .uvf-control-btn svg {
5032
- width: 20px;
5033
- height: 20px;
5034
- fill: #fff;
5035
- }
5036
-
5037
- .uvf-control-btn.play-pause svg {
5038
- width: 24px;
5039
- height: 24px;
5040
- }
5041
-
5042
- /* Desktop right controls */
5043
- .uvf-right-controls {
5044
- margin-left: auto;
5045
- display: flex;
5046
- align-items: center;
5047
- gap: 8px;
5048
- }
5049
-
5050
- /* Desktop time display */
5051
- .uvf-time-display {
5052
- color: #fff;
5053
- font-size: 14px;
5054
- font-weight: 500;
5055
- padding: 0 10px;
5056
- }
5057
-
5058
- /* Desktop volume control */
5059
- .uvf-volume-panel {
5060
- display: flex !important; /* Show volume slider on desktop */
5061
- align-items: center;
5062
- gap: 8px;
5063
- }
5064
-
5065
- .uvf-volume-slider {
5066
- width: 80px;
5067
- height: 4px;
5068
- background: rgba(255, 255, 255, 0.3);
5069
- border-radius: 2px;
5070
- cursor: pointer;
5071
- }
5072
-
5073
- /* Desktop settings and other controls */
5074
- .uvf-quality-badge {
5075
- display: block;
5076
- background: rgba(255, 255, 255, 0.1);
5077
- color: #fff;
5078
- padding: 4px 8px;
5079
- border-radius: 4px;
5080
- font-size: 11px;
5081
- font-weight: 500;
5082
- }
5083
-
5084
- /* Desktop progress bar */
5085
- .uvf-progress-bar {
5086
- height: 2px;
5087
- background: rgba(255, 255, 255, 0.2);
5088
- border-radius: 4px;
5089
- cursor: pointer;
5090
- transition: height 0.2s ease;
5091
- }
5092
-
5093
- .uvf-progress-bar-wrapper:hover .uvf-progress-bar {
5094
- height: 4px;
5095
- }
5096
-
5097
- .uvf-progress-filled {
5098
- background: var(--uvf-accent-1, #8B5CF6);
5099
- height: 100%;
5100
- border-radius: 4px;
5101
- }
5102
-
5103
- .uvf-progress-handle {
5104
- width: 12px;
5105
- height: 12px;
5106
- background: #fff;
5107
- border-radius: 50%;
5108
- position: absolute;
5109
- top: 50%;
5110
- transform: translateY(-50%);
5111
- cursor: grab;
5112
- opacity: 0;
5113
- transition: opacity 0.2s ease;
5114
- }
5115
-
5116
- .uvf-progress-bar-wrapper:hover .uvf-progress-handle {
5117
- opacity: 1;
5118
- }
5119
-
5120
- /* Desktop center play button */
5121
- .uvf-center-play-container {
5122
- position: absolute;
5123
- top: 50%;
5124
- left: 50%;
5125
- transform: translate(-50%, -50%);
5126
- z-index: 8;
5127
- }
5128
-
5129
- .uvf-center-play-btn {
5130
- width: clamp(56px, 10vw, 72px);
5131
- height: clamp(56px, 10vw, 72px);
5132
- background: linear-gradient(135deg, var(--uvf-accent-1), var(--uvf-accent-2));
5133
- border: none;
5134
- border-radius: 50%;
5135
- display: flex;
5136
- align-items: center;
5137
- justify-content: center;
5138
- cursor: pointer;
5139
- box-shadow: 0 4px 16px rgba(0,0,0,0.3);
5140
- transition: all 0.25s ease;
5141
- }
5142
-
5143
- .uvf-center-play-btn:hover {
5144
- transform: scale(1.1);
5145
- box-shadow: 0 6px 20px rgba(0,0,0,0.4);
5146
- }
5147
-
5148
- .uvf-center-play-btn svg {
5149
- width: clamp(24px, 4vw, 30px);
5150
- height: clamp(24px, 4vw, 30px);
5151
- fill: #fff;
5152
- margin-left: 2px;
5153
4839
  }
5154
4840
 
5155
4841
  .uvf-progress-section {
@@ -7858,51 +7544,22 @@ export class WebPlayer extends BasePlayer {
7858
7544
  });
7859
7545
  settingsMenu.querySelectorAll('.speed-option').forEach(option => {
7860
7546
  option.addEventListener('click', (e) => {
7861
- e.preventDefault();
7862
- e.stopPropagation();
7863
7547
  const speed = parseFloat(e.target.dataset.speed || '1');
7864
- this.updateSettingsActiveStates('speed-option', e.target);
7865
7548
  this.setPlaybackRateFromSettings(speed);
7866
- const speedLabel = speed === 1 ? 'Normal' : `${speed}x`;
7867
- const accordionCurrent = option.closest('.uvf-accordion-item')?.querySelector('.uvf-accordion-current');
7868
- if (accordionCurrent) {
7869
- accordionCurrent.textContent = speedLabel;
7870
- }
7871
- this.debugLog(`Speed selected: ${speed}x`);
7872
7549
  this.updateAccordionAfterSelection('speed');
7873
7550
  });
7874
7551
  });
7875
7552
  settingsMenu.querySelectorAll('.quality-option').forEach(option => {
7876
7553
  option.addEventListener('click', (e) => {
7877
- e.preventDefault();
7878
- e.stopPropagation();
7879
7554
  const quality = e.target.dataset.quality || 'auto';
7880
- this.updateSettingsActiveStates('quality-option', e.target);
7881
7555
  this.setQualityFromSettings(quality);
7882
- const qualityItem = this.availableQualities.find(q => q.value === quality);
7883
- const qualityLabel = qualityItem ? qualityItem.label : 'Auto';
7884
- const accordionCurrent = option.closest('.uvf-accordion-item')?.querySelector('.uvf-accordion-current');
7885
- if (accordionCurrent) {
7886
- accordionCurrent.textContent = qualityLabel;
7887
- }
7888
- this.debugLog(`Quality selected: ${quality} (${qualityLabel})`);
7889
7556
  this.updateAccordionAfterSelection('quality');
7890
7557
  });
7891
7558
  });
7892
7559
  settingsMenu.querySelectorAll('.subtitle-option').forEach(option => {
7893
7560
  option.addEventListener('click', (e) => {
7894
- e.preventDefault();
7895
- e.stopPropagation();
7896
7561
  const subtitle = e.target.dataset.subtitle || 'off';
7897
- this.updateSettingsActiveStates('subtitle-option', e.target);
7898
7562
  this.setSubtitle(subtitle);
7899
- const subtitleItem = this.availableSubtitles.find(s => s.value === subtitle);
7900
- const subtitleLabel = subtitleItem ? subtitleItem.label : 'Off';
7901
- const accordionCurrent = option.closest('.uvf-accordion-item')?.querySelector('.uvf-accordion-current');
7902
- if (accordionCurrent) {
7903
- accordionCurrent.textContent = subtitleLabel;
7904
- }
7905
- this.debugLog(`Subtitle selected: ${subtitle} (${subtitleLabel})`);
7906
7563
  this.updateAccordionAfterSelection('subtitles');
7907
7564
  });
7908
7565
  });
@@ -7935,19 +7592,10 @@ export class WebPlayer extends BasePlayer {
7935
7592
  this.debugLog('Settings menu hidden via hideSettingsMenu()');
7936
7593
  }
7937
7594
  updateAccordionAfterSelection(section) {
7938
- const settingsMenu = document.getElementById('uvf-settings-menu');
7939
- if (settingsMenu) {
7940
- settingsMenu.querySelectorAll('.uvf-accordion-item.expanded').forEach(item => {
7941
- item.classList.remove('expanded');
7942
- });
7943
- }
7944
7595
  setTimeout(() => {
7945
7596
  this.generateAccordionMenu();
7946
7597
  this.setupSettingsEventListeners();
7947
- }, 50);
7948
- setTimeout(() => {
7949
- this.hideSettingsMenu();
7950
- }, 150);
7598
+ }, 100);
7951
7599
  }
7952
7600
  updateSettingsActiveStates(className, activeElement) {
7953
7601
  const settingsMenu = document.getElementById('uvf-settings-menu');