unified-video-framework 1.4.188 → 1.4.190

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.
@@ -3651,25 +3651,35 @@ export class WebPlayer extends BasePlayer {
3651
3651
  margin-left: 10px;
3652
3652
  }
3653
3653
 
3654
- /* Title Bar */
3655
- .uvf-title-bar {
3654
+ /* Top Bar Container - Contains Title (left) and Controls (right) */
3655
+ .uvf-top-bar {
3656
3656
  position: absolute;
3657
3657
  top: 0;
3658
3658
  left: 0;
3659
3659
  right: 0;
3660
3660
  padding: 20px;
3661
3661
  z-index: 7;
3662
+ display: flex;
3663
+ justify-content: space-between;
3664
+ align-items: flex-start;
3665
+ gap: 20px;
3662
3666
  opacity: 0;
3663
3667
  transform: translateY(-10px);
3664
3668
  transition: all 0.3s ease;
3665
3669
  }
3666
3670
 
3667
- .uvf-player-wrapper:hover .uvf-title-bar,
3668
- .uvf-player-wrapper.controls-visible .uvf-title-bar {
3671
+ .uvf-player-wrapper:hover .uvf-top-bar,
3672
+ .uvf-player-wrapper.controls-visible .uvf-top-bar {
3669
3673
  opacity: 1;
3670
3674
  transform: translateY(0);
3671
3675
  }
3672
3676
 
3677
+ /* Title Bar - Left side of top bar */
3678
+ .uvf-title-bar {
3679
+ flex: 0 1 auto;
3680
+ max-width: 60%;
3681
+ }
3682
+
3673
3683
  .uvf-title-content {
3674
3684
  display: flex;
3675
3685
  align-items: center;
@@ -3811,29 +3821,13 @@ export class WebPlayer extends BasePlayer {
3811
3821
  }
3812
3822
  }
3813
3823
 
3814
- /* Top Controls */
3824
+ /* Top Controls - Right side of top bar */
3815
3825
  .uvf-top-controls {
3816
- position: absolute;
3817
- top: 20px;
3818
- right: 0;
3819
- left: 0;
3820
- z-index: 10;
3821
3826
  display: flex;
3822
3827
  align-items: center;
3823
3828
  justify-content: flex-end;
3824
3829
  gap: 12px;
3825
- padding-right: 20px;
3826
- padding-left: 20px;
3827
- opacity: 0;
3828
- transform: translateY(-10px);
3829
- transition: all 0.3s ease;
3830
- }
3831
-
3832
- .uvf-player-wrapper:hover .uvf-top-controls,
3833
- .uvf-player-wrapper.controls-visible .uvf-top-controls,
3834
- .uvf-player-wrapper.uvf-casting .uvf-top-controls {
3835
- opacity: 1;
3836
- transform: translateY(0);
3830
+ flex-shrink: 0;
3837
3831
  }
3838
3832
 
3839
3833
  .uvf-top-btn {
@@ -4060,9 +4054,8 @@ export class WebPlayer extends BasePlayer {
4060
4054
  100% { opacity: 0; transform: translate(-50%, -50%) scale(0.8); }
4061
4055
  }
4062
4056
 
4063
- /* Hide top elements with controls */
4064
- .uvf-player-wrapper.no-cursor .uvf-title-bar,
4065
- .uvf-player-wrapper.no-cursor .uvf-top-controls {
4057
+ /* Hide top bar when no cursor */
4058
+ .uvf-player-wrapper.no-cursor .uvf-top-bar {
4066
4059
  opacity: 0 !important;
4067
4060
  transform: translateY(-10px) !important;
4068
4061
  pointer-events: none;
@@ -4147,8 +4140,7 @@ export class WebPlayer extends BasePlayer {
4147
4140
  }
4148
4141
 
4149
4142
  /* Ensure overlays remain visible in fullscreen with consistent spacing */
4150
- .uvf-player-wrapper.uvf-fullscreen .uvf-title-bar,
4151
- .uvf-player-wrapper.uvf-fullscreen .uvf-top-controls,
4143
+ .uvf-player-wrapper.uvf-fullscreen .uvf-top-bar,
4152
4144
  .uvf-player-wrapper.uvf-fullscreen .uvf-controls-bar,
4153
4145
  .uvf-player-wrapper.uvf-fullscreen .uvf-top-gradient,
4154
4146
  .uvf-player-wrapper.uvf-fullscreen .uvf-controls-gradient {
@@ -4163,22 +4155,13 @@ export class WebPlayer extends BasePlayer {
4163
4155
  gap: 15px; /* Consistent gap in fullscreen */
4164
4156
  }
4165
4157
 
4166
- .uvf-player-wrapper.uvf-fullscreen .uvf-title-bar {
4158
+ .uvf-player-wrapper.uvf-fullscreen .uvf-top-bar {
4167
4159
  padding: 20px 30px;
4168
4160
  }
4169
4161
 
4170
- .uvf-player-wrapper.uvf-fullscreen .uvf-top-controls {
4171
- top: 20px;
4172
- padding-right: 30px;
4173
- padding-left: 30px;
4174
- gap: 10px;
4175
- }
4176
-
4177
4162
  /* Fullscreen hover and visibility states */
4178
- .uvf-player-wrapper.uvf-fullscreen:hover .uvf-title-bar,
4179
- .uvf-player-wrapper.uvf-fullscreen:hover .uvf-top-controls,
4180
- .uvf-player-wrapper.uvf-fullscreen.controls-visible .uvf-title-bar,
4181
- .uvf-player-wrapper.uvf-fullscreen.controls-visible .uvf-top-controls {
4163
+ .uvf-player-wrapper.uvf-fullscreen:hover .uvf-top-bar,
4164
+ .uvf-player-wrapper.uvf-fullscreen.controls-visible .uvf-top-bar {
4182
4165
  opacity: 1;
4183
4166
  transform: translateY(0);
4184
4167
  }
@@ -4502,42 +4485,53 @@ export class WebPlayer extends BasePlayer {
4502
4485
  display: none !important;
4503
4486
  }
4504
4487
 
4505
- /* Title bar positioned in top-left of middle 50% video area */
4506
- .uvf-video-container .uvf-title-bar,
4507
- .uvf-responsive-container .uvf-video-container .uvf-title-bar {
4508
- display: flex !important;
4488
+ /* Top bar container - Mobile portrait uses separate positioning */
4489
+ .uvf-video-container .uvf-top-bar,
4490
+ .uvf-responsive-container .uvf-video-container .uvf-top-bar {
4509
4491
  position: absolute !important;
4510
4492
  top: 12px !important;
4511
4493
  left: 16px !important;
4512
- right: auto !important;
4513
- width: auto !important;
4514
- max-width: 50% !important;
4515
- height: auto !important;
4494
+ right: 16px !important;
4516
4495
  padding: 0 !important;
4517
- background: transparent !important;
4518
4496
  z-index: 10 !important;
4519
4497
  opacity: 0 !important;
4520
4498
  transform: translateY(-10px) !important;
4521
4499
  transition: opacity 0.3s ease, transform 0.3s ease !important;
4522
- flex-direction: column !important;
4523
- justify-content: flex-start !important;
4500
+ display: flex !important;
4501
+ justify-content: space-between !important;
4524
4502
  align-items: flex-start !important;
4503
+ gap: 12px !important;
4525
4504
  }
4526
4505
 
4527
- /* Show title bar when controls are visible or on hover */
4528
- .uvf-player-wrapper:hover .uvf-title-bar,
4529
- .uvf-player-wrapper.controls-visible .uvf-title-bar {
4506
+ /* Show top bar when controls are visible or on hover */
4507
+ .uvf-player-wrapper:hover .uvf-top-bar,
4508
+ .uvf-player-wrapper.controls-visible .uvf-top-bar {
4530
4509
  opacity: 1 !important;
4531
4510
  transform: translateY(0) !important;
4532
4511
  }
4533
4512
 
4534
- /* Hide title bar when controls are hidden (no-cursor class) */
4535
- .uvf-player-wrapper.no-cursor .uvf-title-bar {
4513
+ /* Hide top bar when controls are hidden (no-cursor class) */
4514
+ .uvf-player-wrapper.no-cursor .uvf-top-bar {
4536
4515
  opacity: 0 !important;
4537
4516
  transform: translateY(-10px) !important;
4538
4517
  pointer-events: none !important;
4539
4518
  }
4540
4519
 
4520
+ /* Title bar within top bar - mobile portrait */
4521
+ .uvf-video-container .uvf-top-bar .uvf-title-bar,
4522
+ .uvf-responsive-container .uvf-video-container .uvf-top-bar .uvf-title-bar {
4523
+ display: flex !important;
4524
+ width: auto !important;
4525
+ max-width: 50% !important;
4526
+ height: auto !important;
4527
+ padding: 0 !important;
4528
+ background: transparent !important;
4529
+ flex-direction: column !important;
4530
+ justify-content: flex-start !important;
4531
+ align-items: flex-start !important;
4532
+ position: relative !important;
4533
+ }
4534
+
4541
4535
  /* Title content layout */
4542
4536
  .uvf-title-bar .uvf-title-content {
4543
4537
  display: flex !important;
@@ -4591,45 +4585,23 @@ export class WebPlayer extends BasePlayer {
4591
4585
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) !important;
4592
4586
  }
4593
4587
 
4594
- /* Top controls positioned in top-right of middle 50% video area */
4595
- .uvf-video-container .uvf-top-controls,
4596
- .uvf-responsive-container .uvf-video-container .uvf-top-controls {
4588
+ /* Top controls within top bar - mobile portrait */
4589
+ .uvf-video-container .uvf-top-bar .uvf-top-controls,
4590
+ .uvf-responsive-container .uvf-video-container .uvf-top-bar .uvf-top-controls {
4597
4591
  display: flex !important;
4598
- position: absolute !important;
4599
- top: 12px !important;
4600
- left: 0 !important;
4601
- right: 0 !important;
4602
- width: 100% !important;
4603
- height: auto !important;
4604
- padding-left: 16px !important;
4605
- padding-right: 16px !important;
4606
- background: transparent !important;
4607
- z-index: 10 !important;
4608
- opacity: 0 !important;
4609
- transform: translateY(-10px) !important;
4610
- transition: opacity 0.3s ease, transform 0.3s ease !important;
4611
4592
  gap: 12px !important;
4612
4593
  align-items: flex-start !important;
4613
4594
  justify-content: flex-end !important;
4614
4595
  flex-direction: row !important;
4596
+ position: relative !important;
4615
4597
  }
4616
4598
 
4617
- /* Show top controls when controls are visible, on hover, or when casting */
4618
- .uvf-player-wrapper:hover .uvf-top-controls,
4619
- .uvf-player-wrapper.controls-visible .uvf-top-controls,
4620
- .uvf-player-wrapper.uvf-casting .uvf-top-controls {
4599
+ /* Keep top bar visible when casting */
4600
+ .uvf-player-wrapper.uvf-casting .uvf-top-bar {
4621
4601
  opacity: 1 !important;
4622
4602
  transform: translateY(0) !important;
4623
4603
  }
4624
4604
 
4625
- /* Hide top controls when controls are hidden (no-cursor class) */
4626
- /* Exception: Keep visible when casting */
4627
- .uvf-player-wrapper.no-cursor:not(.uvf-casting) .uvf-top-controls {
4628
- opacity: 0 !important;
4629
- transform: translateY(-10px) !important;
4630
- pointer-events: none !important;
4631
- }
4632
-
4633
4605
  /* Material You top buttons (cast & share) */
4634
4606
  .uvf-top-controls .uvf-top-btn {
4635
4607
  width: 48px !important;
@@ -4861,27 +4833,17 @@ export class WebPlayer extends BasePlayer {
4861
4833
  height: 22px;
4862
4834
  }
4863
4835
 
4864
- /* Compact top controls with safe area padding */
4865
- .uvf-top-controls,
4866
- .uvf-video-container .uvf-top-controls,
4867
- .uvf-responsive-container .uvf-video-container .uvf-top-controls {
4868
- position: absolute !important;
4869
- top: calc(8px + var(--uvf-safe-area-top)) !important;
4870
- left: 0 !important;
4871
- right: 0 !important;
4872
- padding-right: calc(12px + var(--uvf-safe-area-right)) !important;
4836
+ /* Top bar for landscape - compact padding */
4837
+ .uvf-top-bar,
4838
+ .uvf-video-container .uvf-top-bar,
4839
+ .uvf-responsive-container .uvf-video-container .uvf-top-bar {
4840
+ padding: 8px 12px !important;
4841
+ padding-top: calc(8px + var(--uvf-safe-area-top)) !important;
4873
4842
  padding-left: calc(12px + var(--uvf-safe-area-left)) !important;
4874
- justify-content: flex-end !important;
4843
+ padding-right: calc(12px + var(--uvf-safe-area-right)) !important;
4875
4844
  gap: 6px !important;
4876
4845
  }
4877
4846
 
4878
- .uvf-title-bar {
4879
- padding: 8px 12px;
4880
- padding-top: calc(8px + var(--uvf-safe-area-top));
4881
- padding-left: calc(12px + var(--uvf-safe-area-left));
4882
- padding-right: calc(12px + var(--uvf-safe-area-right));
4883
- }
4884
-
4885
4847
  .uvf-top-btn {
4886
4848
  width: 40px;
4887
4849
  height: 40px;
@@ -4894,8 +4856,9 @@ export class WebPlayer extends BasePlayer {
4894
4856
  height: 18px;
4895
4857
  }
4896
4858
 
4897
- .uvf-title-bar {
4898
- padding: 8px 12px;
4859
+ /* Title bar within top bar - landscape */
4860
+ .uvf-top-bar .uvf-title-bar {
4861
+ padding: 0;
4899
4862
  }
4900
4863
 
4901
4864
  .uvf-video-title {
@@ -4927,40 +4890,16 @@ export class WebPlayer extends BasePlayer {
4927
4890
  height: 16px;
4928
4891
  }
4929
4892
 
4930
- /* CRITICAL FIX: Force top-controls to right side in fullscreen landscape */
4931
- /* Using flexbox dynamic alignment instead of static positioning */
4932
- .uvf-player-wrapper.uvf-fullscreen .uvf-top-controls,
4933
- .uvf-player-wrapper.uvf-fullscreen .uvf-video-container .uvf-top-controls,
4934
- .uvf-responsive-container .uvf-player-wrapper.uvf-fullscreen .uvf-top-controls,
4935
- .uvf-responsive-container .uvf-player-wrapper.uvf-fullscreen .uvf-video-container .uvf-top-controls {
4936
- position: absolute !important;
4937
- top: calc(8px + var(--uvf-safe-area-top)) !important;
4938
- left: 0 !important;
4939
- right: 0 !important;
4940
- padding-right: calc(12px + var(--uvf-safe-area-right)) !important;
4941
- padding-left: calc(12px + var(--uvf-safe-area-left)) !important;
4942
- justify-content: flex-end !important;
4893
+ /* Top bar in fullscreen landscape */
4894
+ .uvf-player-wrapper.uvf-fullscreen .uvf-top-bar,
4895
+ .uvf-player-wrapper.uvf-fullscreen .uvf-video-container .uvf-top-bar,
4896
+ .uvf-responsive-container .uvf-player-wrapper.uvf-fullscreen .uvf-top-bar,
4897
+ .uvf-responsive-container .uvf-player-wrapper.uvf-fullscreen .uvf-video-container .uvf-top-bar {
4943
4898
  display: flex !important;
4944
4899
  }
4945
4900
  }
4946
4901
  }
4947
4902
 
4948
- /* Universal fullscreen landscape fix: covers large phones/phablets/tablets */
4949
- @media screen and (orientation: landscape) {
4950
- .uvf-player-wrapper.uvf-fullscreen .uvf-top-controls,
4951
- .uvf-player-wrapper.uvf-fullscreen .uvf-video-container .uvf-top-controls,
4952
- .uvf-responsive-container .uvf-player-wrapper.uvf-fullscreen .uvf-top-controls,
4953
- .uvf-responsive-container .uvf-player-wrapper.uvf-fullscreen .uvf-video-container .uvf-top-controls {
4954
- position: absolute !important;
4955
- top: calc(8px + var(--uvf-safe-area-top)) !important;
4956
- left: 0 !important;
4957
- right: 0 !important;
4958
- padding-right: calc(12px + var(--uvf-safe-area-right)) !important;
4959
- padding-left: calc(12px + var(--uvf-safe-area-left)) !important;
4960
- justify-content: flex-end !important;
4961
- display: flex !important;
4962
- }
4963
- }
4964
4903
 
4965
4904
  /* Tablet devices - Enhanced UX with desktop features */
4966
4905
  @media screen and (min-width: 768px) and (max-width: 1023px) {
@@ -5015,15 +4954,14 @@ export class WebPlayer extends BasePlayer {
5015
4954
  height: 19px;
5016
4955
  }
5017
4956
 
5018
- .uvf-top-controls {
5019
- top: 16px;
5020
- padding-right: 16px;
5021
- padding-left: 16px;
5022
- gap: 8px;
4957
+ /* Top bar for tablet */
4958
+ .uvf-top-bar {
4959
+ padding: 16px;
4960
+ gap: 12px;
5023
4961
  }
5024
4962
 
5025
- .uvf-title-bar {
5026
- padding: 16px;
4963
+ .uvf-top-controls {
4964
+ gap: 8px;
5027
4965
  }
5028
4966
 
5029
4967
  .uvf-video-title {
@@ -5175,18 +5113,14 @@ export class WebPlayer extends BasePlayer {
5175
5113
  height: 20px;
5176
5114
  }
5177
5115
 
5178
- .uvf-top-controls {
5179
- position: absolute;
5180
- top: 20px;
5181
- right: 20px;
5182
- display: flex;
5183
- align-items: center;
5184
- gap: 12px;
5185
- z-index: 10;
5116
+ /* Top bar for desktop 1024px+ */
5117
+ .uvf-top-bar {
5118
+ padding: 20px;
5119
+ gap: 20px;
5186
5120
  }
5187
5121
 
5188
- .uvf-title-bar {
5189
- padding: 20px;
5122
+ .uvf-top-controls {
5123
+ gap: 12px;
5190
5124
  }
5191
5125
 
5192
5126
  .uvf-video-title {
@@ -5648,7 +5582,11 @@ export class WebPlayer extends BasePlayer {
5648
5582
  controlsGradient.className = 'uvf-controls-gradient';
5649
5583
  container.appendChild(controlsGradient);
5650
5584
 
5651
- // Add title bar
5585
+ // Combined top bar: title on left, controls on right
5586
+ const topBar = document.createElement('div');
5587
+ topBar.className = 'uvf-top-bar';
5588
+
5589
+ // Title bar (left side)
5652
5590
  const titleBar = document.createElement('div');
5653
5591
  titleBar.className = 'uvf-title-bar';
5654
5592
  titleBar.innerHTML = `
@@ -5660,9 +5598,9 @@ export class WebPlayer extends BasePlayer {
5660
5598
  </div>
5661
5599
  </div>
5662
5600
  `;
5663
- container.appendChild(titleBar);
5601
+ topBar.appendChild(titleBar);
5664
5602
 
5665
- // Add top controls (Cast and Share buttons) - Always positioned at TOP-RIGHT using flexbox
5603
+ // Top controls (right side - Cast and Share buttons)
5666
5604
  const topControls = document.createElement('div');
5667
5605
  topControls.className = 'uvf-top-controls';
5668
5606
  topControls.innerHTML = `
@@ -5683,7 +5621,9 @@ export class WebPlayer extends BasePlayer {
5683
5621
  </svg>
5684
5622
  </div>
5685
5623
  `;
5686
- container.appendChild(topControls);
5624
+ topBar.appendChild(topControls);
5625
+
5626
+ container.appendChild(topBar);
5687
5627
 
5688
5628
  // Add loading spinner
5689
5629
  const loadingContainer = document.createElement('div');