unified-video-framework 1.4.189 → 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,22 +3821,13 @@ export class WebPlayer extends BasePlayer {
3811
3821
  }
3812
3822
  }
3813
3823
 
3814
- /* Top Controls - No position CSS, relies on HTML structure */
3824
+ /* Top Controls - Right side of top bar */
3815
3825
  .uvf-top-controls {
3816
3826
  display: flex;
3817
3827
  align-items: center;
3818
3828
  justify-content: flex-end;
3819
3829
  gap: 12px;
3820
- opacity: 0;
3821
- transform: translateY(-10px);
3822
- transition: all 0.3s ease;
3823
- }
3824
-
3825
- .uvf-player-wrapper:hover .uvf-top-controls,
3826
- .uvf-player-wrapper.controls-visible .uvf-top-controls,
3827
- .uvf-player-wrapper.uvf-casting .uvf-top-controls {
3828
- opacity: 1;
3829
- transform: translateY(0);
3830
+ flex-shrink: 0;
3830
3831
  }
3831
3832
 
3832
3833
  .uvf-top-btn {
@@ -4053,9 +4054,8 @@ export class WebPlayer extends BasePlayer {
4053
4054
  100% { opacity: 0; transform: translate(-50%, -50%) scale(0.8); }
4054
4055
  }
4055
4056
 
4056
- /* Hide top elements with controls */
4057
- .uvf-player-wrapper.no-cursor .uvf-title-bar,
4058
- .uvf-player-wrapper.no-cursor .uvf-top-controls {
4057
+ /* Hide top bar when no cursor */
4058
+ .uvf-player-wrapper.no-cursor .uvf-top-bar {
4059
4059
  opacity: 0 !important;
4060
4060
  transform: translateY(-10px) !important;
4061
4061
  pointer-events: none;
@@ -4140,8 +4140,7 @@ export class WebPlayer extends BasePlayer {
4140
4140
  }
4141
4141
 
4142
4142
  /* Ensure overlays remain visible in fullscreen with consistent spacing */
4143
- .uvf-player-wrapper.uvf-fullscreen .uvf-title-bar,
4144
- .uvf-player-wrapper.uvf-fullscreen .uvf-top-controls,
4143
+ .uvf-player-wrapper.uvf-fullscreen .uvf-top-bar,
4145
4144
  .uvf-player-wrapper.uvf-fullscreen .uvf-controls-bar,
4146
4145
  .uvf-player-wrapper.uvf-fullscreen .uvf-top-gradient,
4147
4146
  .uvf-player-wrapper.uvf-fullscreen .uvf-controls-gradient {
@@ -4156,19 +4155,13 @@ export class WebPlayer extends BasePlayer {
4156
4155
  gap: 15px; /* Consistent gap in fullscreen */
4157
4156
  }
4158
4157
 
4159
- .uvf-player-wrapper.uvf-fullscreen .uvf-title-bar {
4158
+ .uvf-player-wrapper.uvf-fullscreen .uvf-top-bar {
4160
4159
  padding: 20px 30px;
4161
4160
  }
4162
4161
 
4163
- .uvf-player-wrapper.uvf-fullscreen .uvf-top-controls {
4164
- gap: 10px;
4165
- }
4166
-
4167
4162
  /* Fullscreen hover and visibility states */
4168
- .uvf-player-wrapper.uvf-fullscreen:hover .uvf-title-bar,
4169
- .uvf-player-wrapper.uvf-fullscreen:hover .uvf-top-controls,
4170
- .uvf-player-wrapper.uvf-fullscreen.controls-visible .uvf-title-bar,
4171
- .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 {
4172
4165
  opacity: 1;
4173
4166
  transform: translateY(0);
4174
4167
  }
@@ -4492,42 +4485,53 @@ export class WebPlayer extends BasePlayer {
4492
4485
  display: none !important;
4493
4486
  }
4494
4487
 
4495
- /* Title bar positioned in top-left of middle 50% video area */
4496
- .uvf-video-container .uvf-title-bar,
4497
- .uvf-responsive-container .uvf-video-container .uvf-title-bar {
4498
- 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 {
4499
4491
  position: absolute !important;
4500
4492
  top: 12px !important;
4501
4493
  left: 16px !important;
4502
- right: auto !important;
4503
- width: auto !important;
4504
- max-width: 50% !important;
4505
- height: auto !important;
4494
+ right: 16px !important;
4506
4495
  padding: 0 !important;
4507
- background: transparent !important;
4508
4496
  z-index: 10 !important;
4509
4497
  opacity: 0 !important;
4510
4498
  transform: translateY(-10px) !important;
4511
4499
  transition: opacity 0.3s ease, transform 0.3s ease !important;
4512
- flex-direction: column !important;
4513
- justify-content: flex-start !important;
4500
+ display: flex !important;
4501
+ justify-content: space-between !important;
4514
4502
  align-items: flex-start !important;
4503
+ gap: 12px !important;
4515
4504
  }
4516
4505
 
4517
- /* Show title bar when controls are visible or on hover */
4518
- .uvf-player-wrapper:hover .uvf-title-bar,
4519
- .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 {
4520
4509
  opacity: 1 !important;
4521
4510
  transform: translateY(0) !important;
4522
4511
  }
4523
4512
 
4524
- /* Hide title bar when controls are hidden (no-cursor class) */
4525
- .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 {
4526
4515
  opacity: 0 !important;
4527
4516
  transform: translateY(-10px) !important;
4528
4517
  pointer-events: none !important;
4529
4518
  }
4530
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
+
4531
4535
  /* Title content layout */
4532
4536
  .uvf-title-bar .uvf-title-content {
4533
4537
  display: flex !important;
@@ -4581,35 +4585,23 @@ export class WebPlayer extends BasePlayer {
4581
4585
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4) !important;
4582
4586
  }
4583
4587
 
4584
- /* Top controls - No position CSS for mobile portrait */
4585
- .uvf-video-container .uvf-top-controls,
4586
- .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 {
4587
4591
  display: flex !important;
4588
- opacity: 0 !important;
4589
- transform: translateY(-10px) !important;
4590
- transition: opacity 0.3s ease, transform 0.3s ease !important;
4591
4592
  gap: 12px !important;
4592
4593
  align-items: flex-start !important;
4593
4594
  justify-content: flex-end !important;
4594
4595
  flex-direction: row !important;
4596
+ position: relative !important;
4595
4597
  }
4596
4598
 
4597
- /* Show top controls when controls are visible, on hover, or when casting */
4598
- .uvf-player-wrapper:hover .uvf-top-controls,
4599
- .uvf-player-wrapper.controls-visible .uvf-top-controls,
4600
- .uvf-player-wrapper.uvf-casting .uvf-top-controls {
4599
+ /* Keep top bar visible when casting */
4600
+ .uvf-player-wrapper.uvf-casting .uvf-top-bar {
4601
4601
  opacity: 1 !important;
4602
4602
  transform: translateY(0) !important;
4603
4603
  }
4604
4604
 
4605
- /* Hide top controls when controls are hidden (no-cursor class) */
4606
- /* Exception: Keep visible when casting */
4607
- .uvf-player-wrapper.no-cursor:not(.uvf-casting) .uvf-top-controls {
4608
- opacity: 0 !important;
4609
- transform: translateY(-10px) !important;
4610
- pointer-events: none !important;
4611
- }
4612
-
4613
4605
  /* Material You top buttons (cast & share) */
4614
4606
  .uvf-top-controls .uvf-top-btn {
4615
4607
  width: 48px !important;
@@ -4841,21 +4833,17 @@ export class WebPlayer extends BasePlayer {
4841
4833
  height: 22px;
4842
4834
  }
4843
4835
 
4844
- /* Compact top controls - No position CSS for landscape */
4845
- .uvf-top-controls,
4846
- .uvf-video-container .uvf-top-controls,
4847
- .uvf-responsive-container .uvf-video-container .uvf-top-controls {
4848
- justify-content: flex-end !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;
4842
+ padding-left: calc(12px + var(--uvf-safe-area-left)) !important;
4843
+ padding-right: calc(12px + var(--uvf-safe-area-right)) !important;
4849
4844
  gap: 6px !important;
4850
4845
  }
4851
4846
 
4852
- .uvf-title-bar {
4853
- padding: 8px 12px;
4854
- padding-top: calc(8px + var(--uvf-safe-area-top));
4855
- padding-left: calc(12px + var(--uvf-safe-area-left));
4856
- padding-right: calc(12px + var(--uvf-safe-area-right));
4857
- }
4858
-
4859
4847
  .uvf-top-btn {
4860
4848
  width: 40px;
4861
4849
  height: 40px;
@@ -4868,8 +4856,9 @@ export class WebPlayer extends BasePlayer {
4868
4856
  height: 18px;
4869
4857
  }
4870
4858
 
4871
- .uvf-title-bar {
4872
- padding: 8px 12px;
4859
+ /* Title bar within top bar - landscape */
4860
+ .uvf-top-bar .uvf-title-bar {
4861
+ padding: 0;
4873
4862
  }
4874
4863
 
4875
4864
  .uvf-video-title {
@@ -4901,12 +4890,11 @@ export class WebPlayer extends BasePlayer {
4901
4890
  height: 16px;
4902
4891
  }
4903
4892
 
4904
- /* Top-controls in fullscreen landscape - No position CSS */
4905
- .uvf-player-wrapper.uvf-fullscreen .uvf-top-controls,
4906
- .uvf-player-wrapper.uvf-fullscreen .uvf-video-container .uvf-top-controls,
4907
- .uvf-responsive-container .uvf-player-wrapper.uvf-fullscreen .uvf-top-controls,
4908
- .uvf-responsive-container .uvf-player-wrapper.uvf-fullscreen .uvf-video-container .uvf-top-controls {
4909
- 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 {
4910
4898
  display: flex !important;
4911
4899
  }
4912
4900
  }
@@ -4966,13 +4954,14 @@ export class WebPlayer extends BasePlayer {
4966
4954
  height: 19px;
4967
4955
  }
4968
4956
 
4969
- .uvf-top-controls {
4970
- justify-content: flex-end;
4971
- gap: 8px;
4957
+ /* Top bar for tablet */
4958
+ .uvf-top-bar {
4959
+ padding: 16px;
4960
+ gap: 12px;
4972
4961
  }
4973
4962
 
4974
- .uvf-title-bar {
4975
- padding: 16px;
4963
+ .uvf-top-controls {
4964
+ gap: 8px;
4976
4965
  }
4977
4966
 
4978
4967
  .uvf-video-title {
@@ -5124,18 +5113,14 @@ export class WebPlayer extends BasePlayer {
5124
5113
  height: 20px;
5125
5114
  }
5126
5115
 
5127
- .uvf-top-controls {
5128
- position: absolute;
5129
- top: 20px;
5130
- right: 20px;
5131
- display: flex;
5132
- align-items: center;
5133
- gap: 12px;
5134
- z-index: 10;
5116
+ /* Top bar for desktop 1024px+ */
5117
+ .uvf-top-bar {
5118
+ padding: 20px;
5119
+ gap: 20px;
5135
5120
  }
5136
5121
 
5137
- .uvf-title-bar {
5138
- padding: 20px;
5122
+ .uvf-top-controls {
5123
+ gap: 12px;
5139
5124
  }
5140
5125
 
5141
5126
  .uvf-video-title {
@@ -5597,7 +5582,11 @@ export class WebPlayer extends BasePlayer {
5597
5582
  controlsGradient.className = 'uvf-controls-gradient';
5598
5583
  container.appendChild(controlsGradient);
5599
5584
 
5600
- // 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)
5601
5590
  const titleBar = document.createElement('div');
5602
5591
  titleBar.className = 'uvf-title-bar';
5603
5592
  titleBar.innerHTML = `
@@ -5609,9 +5598,9 @@ export class WebPlayer extends BasePlayer {
5609
5598
  </div>
5610
5599
  </div>
5611
5600
  `;
5612
- container.appendChild(titleBar);
5601
+ topBar.appendChild(titleBar);
5613
5602
 
5614
- // Add top controls (Cast and Share buttons) - Always positioned at TOP-RIGHT using flexbox
5603
+ // Top controls (right side - Cast and Share buttons)
5615
5604
  const topControls = document.createElement('div');
5616
5605
  topControls.className = 'uvf-top-controls';
5617
5606
  topControls.innerHTML = `
@@ -5632,7 +5621,9 @@ export class WebPlayer extends BasePlayer {
5632
5621
  </svg>
5633
5622
  </div>
5634
5623
  `;
5635
- container.appendChild(topControls);
5624
+ topBar.appendChild(topControls);
5625
+
5626
+ container.appendChild(topBar);
5636
5627
 
5637
5628
  // Add loading spinner
5638
5629
  const loadingContainer = document.createElement('div');