unified-video-framework 1.4.117 → 1.4.118

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.
@@ -1790,7 +1790,7 @@ export class WebPlayer extends BasePlayer {
1790
1790
  .uvf-video-container {
1791
1791
  position: relative;
1792
1792
  width: 100%;
1793
- // aspect-ratio: 16 / 9;
1793
+ aspect-ratio: 16 / 9;
1794
1794
  background: radial-gradient(ellipse at center, #1a1a2e 0%, #000 100%);
1795
1795
  overflow: hidden;
1796
1796
  }
@@ -1989,6 +1989,7 @@ export class WebPlayer extends BasePlayer {
1989
1989
  width: 100%;
1990
1990
  position: relative;
1991
1991
  cursor: pointer;
1992
+ padding: 16px 0;
1992
1993
  overflow: visible;
1993
1994
  }
1994
1995
 
@@ -2102,105 +2103,10 @@ export class WebPlayer extends BasePlayer {
2102
2103
 
2103
2104
  /* Mobile responsive design with enhanced touch targets */
2104
2105
  @media (max-width: 768px) {
2105
- .uvf-player-wrapper {
2106
- position: relative;
2107
- width: 100% !important;
2108
- height: auto !important;
2109
- min-height: 200px;
2110
- }
2111
-
2112
- .uvf-video-container {
2113
- width: 100% !important;
2114
- height: auto !important;
2115
- aspect-ratio: 16/9;
2116
- position: relative;
2117
- }
2118
-
2119
- .uvf-video {
2120
- width: 100% !important;
2121
- height: 100% !important;
2122
- object-fit: contain;
2123
- }
2124
-
2125
- /* Fix controls bar positioning */
2126
- .uvf-controls-bar {
2127
- position: absolute;
2128
- bottom: 0;
2129
- left: 0;
2130
- right: 0;
2131
- padding: 8px 12px !important;
2132
- padding-bottom: max(8px, env(safe-area-inset-bottom)) !important;
2133
- background: linear-gradient(to top,
2134
- rgba(0,0,0,0.9) 0%,
2135
- rgba(0,0,0,0.7) 70%,
2136
- transparent 100%) !important;
2137
- z-index: 1000;
2138
- }
2139
-
2140
- /* Ensure controls are properly sized */
2141
- .uvf-controls-row {
2142
- display: flex;
2143
- align-items: center;
2144
- gap: 8px;
2145
- flex-wrap: nowrap;
2146
- min-height: 44px; /* Minimum touch target size */
2147
- }
2148
-
2149
- /* Touch-friendly button sizes */
2150
- .uvf-control-btn {
2151
- width: 44px !important;
2152
- height: 44px !important;
2153
- min-width: 44px !important;
2154
- min-height: 44px !important;
2155
- border-radius: 22px !important;
2156
- }
2157
-
2158
- .uvf-control-btn.play-pause {
2159
- width: 52px !important;
2160
- height: 52px !important;
2161
- min-width: 52px !important;
2162
- min-height: 52px !important;
2163
- }
2164
-
2165
- /* Progress bar adjustments */
2166
- .uvf-progress-section {
2167
- margin-bottom: 12px !important;
2168
- padding: 0 8px;
2106
+ .uvf-progress-bar-wrapper {
2107
+ padding: 20px 0; /* Larger touch area */
2169
2108
  }
2170
2109
 
2171
- .uvf-progress-bar {
2172
- height: 4px !important;
2173
- margin-bottom: 8px;
2174
- }
2175
-
2176
- /* Time display adjustments */
2177
- .uvf-time-display {
2178
- font-size: 12px !important;
2179
- min-width: 90px !important;
2180
- padding: 4px 8px !important;
2181
- background: rgba(0,0,0,0.5);
2182
- border-radius: 12px;
2183
- margin: 0 4px;
2184
- }
2185
-
2186
- /* Right controls spacing */
2187
- .uvf-right-controls {
2188
- gap: 6px !important;
2189
- margin-left: auto;
2190
- }
2191
-
2192
- /* Hide non-essential elements on mobile */
2193
- .uvf-quality-badge {
2194
- display: none !important;
2195
- }
2196
-
2197
- /* Ensure settings menu is accessible */
2198
- .uvf-settings-menu {
2199
- bottom: 60px !important;
2200
- right: 12px !important;
2201
- max-height: 60vh !important;
2202
- min-width: 160px !important;
2203
- }
2204
2110
  .uvf-progress-bar {
2205
2111
  height: 3px; /* Slightly thicker on mobile */
2206
2112
  }
@@ -2208,31 +2114,7 @@ export class WebPlayer extends BasePlayer {
2208
2114
  .uvf-progress-bar-wrapper:hover .uvf-progress-bar {
2209
2115
  height: 5px;
2210
2116
  }
2211
- }
2212
-
2213
- /* Mobile Landscape */
2214
- @media screen and (max-width: 767px) and (orientation: landscape) {
2215
- .uvf-controls-bar {
2216
- padding: 6px 10px !important;
2217
- padding-bottom: max(6px, env(safe-area-inset-bottom)) !important;
2218
- }
2219
2117
 
2220
- .uvf-control-btn {
2221
- width: 40px !important;
2222
- height: 40px !important;
2223
- min-width: 40px !important;
2224
- min-height: 40px !important;
2225
- }
2226
-
2227
- .uvf-control-btn.play-pause {
2228
- width: 46px !important;
2229
- height: 46px !important;
2230
- }
2231
-
2232
- .uvf-time-display {
2233
- font-size: 11px !important;
2234
- min-width: 80px !important;
2235
- }
2236
2118
  }
2237
2119
 
2238
2120
  /* Controls Row */
@@ -2962,28 +2844,174 @@ export class WebPlayer extends BasePlayer {
2962
2844
  }
2963
2845
  }
2964
2846
 
2847
+ /* Safe Area Variables - Support for modern mobile devices */
2848
+ :root {
2849
+ /* iOS Safe Area Fallbacks */
2850
+ --uvf-safe-area-top: env(safe-area-inset-top, 0px);
2851
+ --uvf-safe-area-right: env(safe-area-inset-right, 0px);
2852
+ --uvf-safe-area-bottom: env(safe-area-inset-bottom, 0px);
2853
+ --uvf-safe-area-left: env(safe-area-inset-left, 0px);
2854
+
2855
+ /* Dynamic Viewport Support */
2856
+ --uvf-dvh: 1dvh;
2857
+ --uvf-svh: 1svh;
2858
+ --uvf-lvh: 1lvh;
2859
+ }
2860
+
2861
+ /* Cross-Browser Mobile Viewport Fixes */
2862
+
2863
+ /* Modern browsers with dynamic viewport support */
2864
+ @supports (height: 100dvh) {
2865
+ .uvf-player-wrapper,
2866
+ .uvf-video-container {
2867
+ height: 100dvh;
2868
+ }
2869
+
2870
+ .uvf-responsive-container {
2871
+ height: 100dvh;
2872
+ }
2873
+ }
2874
+
2875
+ /* iOS Safari specific fixes - address bar handling */
2876
+ @supports (-webkit-appearance: none) {
2877
+ .uvf-player-wrapper.uvf-fullscreen,
2878
+ .uvf-video-container.uvf-fullscreen {
2879
+ height: -webkit-fill-available;
2880
+ min-height: -webkit-fill-available;
2881
+ }
2882
+
2883
+ /* Handle iOS Safari's dynamic address bar */
2884
+ @media screen and (max-width: 767px) {
2885
+ .uvf-responsive-container {
2886
+ height: -webkit-fill-available;
2887
+ min-height: 100vh;
2888
+ }
2889
+
2890
+ .uvf-player-wrapper {
2891
+ height: -webkit-fill-available;
2892
+ min-height: 100vh;
2893
+ }
2894
+ }
2895
+ }
2896
+
2897
+ /* Android Chrome specific fixes */
2898
+ @supports (display: -webkit-box) {
2899
+ .uvf-responsive-container {
2900
+ min-height: 100vh;
2901
+ }
2902
+
2903
+ /* Fix for Android Chrome's address bar behavior */
2904
+ @media screen and (max-width: 767px) {
2905
+ .uvf-video-container {
2906
+ min-height: calc(100vh - 56px); /* Chrome mobile address bar height */
2907
+ }
2908
+ }
2909
+ }
2910
+
2911
+ /* Samsung Internet Browser fixes */
2912
+ @media screen and (-webkit-min-device-pixel-ratio: 1) {
2913
+ @media screen and (max-width: 767px) {
2914
+ .uvf-responsive-container {
2915
+ position: fixed;
2916
+ top: 0;
2917
+ left: 0;
2918
+ width: 100vw;
2919
+ height: 100vh;
2920
+ }
2921
+ }
2922
+ }
2923
+
2924
+ /* Universal mobile fixes for all browsers */
2925
+ @media screen and (max-width: 767px) {
2926
+ html, body {
2927
+ overflow-x: hidden;
2928
+ }
2929
+
2930
+ .uvf-player-wrapper {
2931
+ /* Prevent scroll bounce on iOS */
2932
+ -webkit-overflow-scrolling: touch;
2933
+ overflow: hidden;
2934
+
2935
+ /* Prevent zoom on double tap */
2936
+ touch-action: manipulation;
2937
+ }
2938
+
2939
+ .uvf-video {
2940
+ /* Prevent video from being selectable */
2941
+ -webkit-user-select: none;
2942
+ -moz-user-select: none;
2943
+ -ms-user-select: none;
2944
+ user-select: none;
2945
+
2946
+ /* Ensure hardware acceleration */
2947
+ -webkit-transform: translateZ(0);
2948
+ transform: translateZ(0);
2949
+ }
2950
+
2951
+ /* Fix for controls being cut off by virtual keyboard */
2952
+ .uvf-controls-bar {
2953
+ position: fixed !important;
2954
+ bottom: var(--uvf-safe-area-bottom, 0) !important;
2955
+ }
2956
+
2957
+ /* Ensure controls stay above virtual keyboards */
2958
+ @supports (bottom: env(keyboard-inset-height)) {
2959
+ .uvf-controls-bar {
2960
+ bottom: max(var(--uvf-safe-area-bottom, 0), env(keyboard-inset-height, 0)) !important;
2961
+ }
2962
+ }
2963
+ }
2964
+
2965
2965
  /* Enhanced Responsive Media Queries with UX Best Practices */
2966
- /* Mobile devices (portrait) - Enhanced UX */
2966
+ /* Mobile devices (portrait) - Enhanced UX with Safe Areas */
2967
2967
  @media screen and (max-width: 767px) and (orientation: portrait) {
2968
2968
  .uvf-responsive-container {
2969
2969
  padding: 0;
2970
2970
  width: 100vw !important;
2971
+ height: calc(100vh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
2971
2972
  margin: 0;
2973
+ position: relative;
2974
+ overflow: hidden;
2975
+ }
2976
+
2977
+ @supports (height: 100dvh) {
2978
+ .uvf-responsive-container {
2979
+ height: calc(100dvh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
2980
+ }
2972
2981
  }
2973
2982
 
2974
2983
  .uvf-responsive-container .uvf-player-wrapper {
2975
2984
  width: 100vw !important;
2985
+ height: 100% !important;
2986
+ min-height: calc(100vh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
2987
+ }
2988
+
2989
+ @supports (height: 100dvh) {
2990
+ .uvf-responsive-container .uvf-player-wrapper {
2991
+ min-height: calc(100dvh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
2992
+ }
2976
2993
  }
2977
2994
 
2978
2995
  .uvf-responsive-container .uvf-video-container {
2979
2996
  width: 100vw !important;
2980
- // aspect-ratio: unset !important;
2997
+ height: 100% !important;
2998
+ aspect-ratio: unset !important;
2999
+ min-height: inherit;
2981
3000
  }
2982
3001
 
2983
- /* Enhanced mobile controls bar with better spacing */
3002
+ /* Enhanced mobile controls bar with safe area padding */
2984
3003
  .uvf-controls-bar {
3004
+ position: absolute;
3005
+ bottom: 0;
3006
+ left: 0;
3007
+ right: 0;
2985
3008
  padding: 16px 12px;
3009
+ padding-bottom: calc(16px + var(--uvf-safe-area-bottom));
3010
+ padding-left: calc(12px + var(--uvf-safe-area-left));
3011
+ padding-right: calc(12px + var(--uvf-safe-area-right));
2986
3012
  background: linear-gradient(to top, var(--uvf-overlay-strong) 0%, var(--uvf-overlay-medium) 80%, var(--uvf-overlay-transparent) 100%);
3013
+ box-sizing: border-box;
3014
+ z-index: 1000;
2987
3015
  }
2988
3016
 
2989
3017
  .uvf-progress-section {
@@ -3155,11 +3183,11 @@ export class WebPlayer extends BasePlayer {
3155
3183
  }
3156
3184
  }
3157
3185
 
3158
- /* Enhanced top controls for mobile with proper alignment */
3186
+ /* Enhanced top controls for mobile with safe area support */
3159
3187
  .uvf-top-controls {
3160
3188
  position: absolute;
3161
- top: 12px;
3162
- right: 12px;
3189
+ top: calc(12px + var(--uvf-safe-area-top));
3190
+ right: calc(12px + var(--uvf-safe-area-right));
3163
3191
  display: flex;
3164
3192
  align-items: center;
3165
3193
  gap: 8px;
@@ -3187,9 +3215,12 @@ export class WebPlayer extends BasePlayer {
3187
3215
  display: flex;
3188
3216
  }
3189
3217
 
3190
- /* Enhanced title bar for mobile */
3218
+ /* Enhanced title bar for mobile with safe area support */
3191
3219
  .uvf-title-bar {
3192
3220
  padding: 12px;
3221
+ padding-top: calc(12px + var(--uvf-safe-area-top));
3222
+ padding-left: calc(12px + var(--uvf-safe-area-left));
3223
+ padding-right: calc(12px + var(--uvf-safe-area-right));
3193
3224
  }
3194
3225
 
3195
3226
  .uvf-video-title {
@@ -3316,30 +3347,55 @@ export class WebPlayer extends BasePlayer {
3316
3347
  }
3317
3348
  }
3318
3349
 
3319
- /* Mobile devices (landscape) - Optimized for fullscreen viewing */
3350
+ /* Mobile devices (landscape) - Optimized for fullscreen viewing with safe areas */
3320
3351
  @media screen and (max-width: 767px) and (orientation: landscape) {
3321
3352
  .uvf-responsive-container {
3322
3353
  width: 100vw !important;
3323
- height: 100vh !important;
3354
+ height: calc(100vh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
3324
3355
  margin: 0;
3325
3356
  padding: 0;
3357
+ position: relative;
3358
+ overflow: hidden;
3359
+ }
3360
+
3361
+ @supports (height: 100dvh) {
3362
+ .uvf-responsive-container {
3363
+ height: calc(100dvh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
3364
+ }
3326
3365
  }
3327
3366
 
3328
3367
  .uvf-responsive-container .uvf-player-wrapper {
3329
3368
  width: 100vw !important;
3330
- height: 100vh !important;
3369
+ height: 100% !important;
3370
+ min-height: calc(100vh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
3371
+ }
3372
+
3373
+ @supports (height: 100dvh) {
3374
+ .uvf-responsive-container .uvf-player-wrapper {
3375
+ min-height: calc(100dvh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
3376
+ }
3331
3377
  }
3332
3378
 
3333
3379
  .uvf-responsive-container .uvf-video-container {
3334
3380
  width: 100vw !important;
3335
- height: 100vh !important;
3381
+ height: 100% !important;
3336
3382
  aspect-ratio: unset !important;
3383
+ min-height: inherit;
3337
3384
  }
3338
3385
 
3339
- /* Compact controls for landscape */
3386
+ /* Compact controls for landscape with safe area padding */
3340
3387
  .uvf-controls-bar {
3388
+ position: absolute;
3389
+ bottom: 0;
3390
+ left: 0;
3391
+ right: 0;
3341
3392
  padding: 10px 12px;
3393
+ padding-bottom: calc(10px + var(--uvf-safe-area-bottom));
3394
+ padding-left: calc(12px + var(--uvf-safe-area-left));
3395
+ padding-right: calc(12px + var(--uvf-safe-area-right));
3342
3396
  background: linear-gradient(to top, var(--uvf-overlay-strong) 0%, var(--uvf-overlay-medium) 80%, var(--uvf-overlay-transparent) 100%);
3397
+ box-sizing: border-box;
3398
+ z-index: 1000;
3343
3399
  }
3344
3400
 
3345
3401
  .uvf-progress-section {
@@ -3375,13 +3431,20 @@ export class WebPlayer extends BasePlayer {
3375
3431
  height: 22px;
3376
3432
  }
3377
3433
 
3378
- /* Compact top controls */
3434
+ /* Compact top controls with safe area padding */
3379
3435
  .uvf-top-controls {
3380
- top: 8px;
3381
- right: 12px;
3436
+ top: calc(8px + var(--uvf-safe-area-top));
3437
+ right: calc(12px + var(--uvf-safe-area-right));
3382
3438
  gap: 6px;
3383
3439
  }
3384
3440
 
3441
+ .uvf-title-bar {
3442
+ padding: 8px 12px;
3443
+ padding-top: calc(8px + var(--uvf-safe-area-top));
3444
+ padding-left: calc(12px + var(--uvf-safe-area-left));
3445
+ padding-right: calc(12px + var(--uvf-safe-area-right));
3446
+ }
3447
+
3385
3448
  .uvf-top-btn {
3386
3449
  width: 40px;
3387
3450
  height: 40px;
@@ -3428,17 +3491,7 @@ export class WebPlayer extends BasePlayer {
3428
3491
  height: 16px;
3429
3492
  }
3430
3493
  }
3431
- @media (max-width: 768px) {
3432
- .uvf-video-container {
3433
- aspect-ratio: auto !important;
3434
- height: 100% !important;
3435
- }
3436
- .uvf-controls-bar {
3437
- bottom: 0 !important;
3438
- padding-bottom: 10px !important;
3439
- }
3440
- }
3441
-
3494
+
3442
3495
  /* Tablet devices - Enhanced UX with desktop features */
3443
3496
  @media screen and (min-width: 768px) and (max-width: 1023px) {
3444
3497
  .uvf-controls-bar {