unified-video-framework 1.4.161 → 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.
@@ -4329,138 +4329,6 @@ export class WebPlayer extends BasePlayer {
4329
4329
  @media screen and (max-width: 767px) {
4330
4330
  html, body {
4331
4331
  overflow-x: hidden;
4332
- background: #000;
4333
- }
4334
-
4335
- /* Mobile Portrait Layout - Centered Player with Top/Bottom Black Areas */
4336
- @media screen and (orientation: portrait) {
4337
- .uvf-responsive-container {
4338
- display: flex;
4339
- flex-direction: column;
4340
- height: 100vh;
4341
- height: 100dvh;
4342
- background: #000;
4343
- overflow: hidden;
4344
- position: fixed;
4345
- top: 0;
4346
- left: 0;
4347
- width: 100vw;
4348
- }
4349
-
4350
- /* Top black area - 25% of viewport */
4351
- .uvf-responsive-container::before {
4352
- content: '';
4353
- flex: 0 0 25vh;
4354
- background: #000;
4355
- pointer-events: none;
4356
- }
4357
-
4358
- /* Bottom black area - 25% of viewport */
4359
- .uvf-responsive-container::after {
4360
- content: '';
4361
- flex: 0 0 25vh;
4362
- background: #000;
4363
- pointer-events: none;
4364
- }
4365
-
4366
- /* Centered video player wrapper - 50% of viewport */
4367
- .uvf-responsive-container .uvf-player-wrapper {
4368
- flex: 1;
4369
- width: 100vw;
4370
- display: flex;
4371
- align-items: center;
4372
- justify-content: center;
4373
- background: #000;
4374
- position: relative;
4375
- }
4376
-
4377
- /* Video container fills player wrapper */
4378
- .uvf-responsive-container .uvf-video-container {
4379
- width: 100%;
4380
- height: 100%;
4381
- position: relative;
4382
- background: #000;
4383
- border-radius: 0;
4384
- overflow: hidden;
4385
- }
4386
-
4387
- /* Video element fills container */
4388
- .uvf-responsive-container .uvf-video {
4389
- width: 100%;
4390
- height: 100%;
4391
- object-fit: contain;
4392
- background: #000;
4393
- }
4394
-
4395
- /* All controls positioned inside video container */
4396
- .uvf-controls-bar {
4397
- position: absolute !important;
4398
- bottom: 0 !important;
4399
- left: 0 !important;
4400
- right: 0 !important;
4401
- background: linear-gradient(to top, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.6) 60%, transparent 100%);
4402
- padding: 12px 16px;
4403
- padding-bottom: calc(12px + var(--uvf-safe-area-bottom));
4404
- z-index: 1000;
4405
- /* Ensure hardware acceleration */
4406
- -webkit-transform: translate3d(0,0,0);
4407
- transform: translate3d(0,0,0);
4408
- }
4409
-
4410
- /* Progress section */
4411
- .uvf-progress-section {
4412
- width: 100%;
4413
- margin-bottom: 8px;
4414
- }
4415
-
4416
- /* Controls row alignment */
4417
- .uvf-controls-row {
4418
- width: 100%;
4419
- display: flex;
4420
- align-items: center;
4421
- justify-content: flex-start;
4422
- gap: 12px;
4423
- }
4424
-
4425
- /* Right controls */
4426
- .uvf-right-controls {
4427
- margin-left: auto;
4428
- display: flex;
4429
- align-items: center;
4430
- gap: 8px;
4431
- }
4432
-
4433
- /* Center play button positioned within video */
4434
- .uvf-center-play-container {
4435
- position: absolute;
4436
- top: 50%;
4437
- left: 50%;
4438
- transform: translate(-50%, -50%);
4439
- z-index: 8;
4440
- pointer-events: none;
4441
- }
4442
-
4443
- .uvf-center-play-btn {
4444
- pointer-events: auto;
4445
- }
4446
-
4447
- /* Top controls within video */
4448
- .uvf-top-controls {
4449
- position: absolute;
4450
- top: calc(12px + var(--uvf-safe-area-top));
4451
- right: calc(16px + var(--uvf-safe-area-right));
4452
- z-index: 9;
4453
- }
4454
-
4455
- /* Title bar within video */
4456
- .uvf-title-bar {
4457
- position: absolute;
4458
- top: calc(12px + var(--uvf-safe-area-top));
4459
- left: calc(16px + var(--uvf-safe-area-left));
4460
- right: calc(80px + var(--uvf-safe-area-right));
4461
- z-index: 9;
4462
- padding: 8px 0;
4463
- }
4464
4332
  }
4465
4333
 
4466
4334
  .uvf-player-wrapper {
@@ -4484,37 +4352,6 @@ export class WebPlayer extends BasePlayer {
4484
4352
  transform: translateZ(0);
4485
4353
  }
4486
4354
 
4487
- /* Mobile controls optimization for touch */
4488
- .uvf-control-btn {
4489
- min-width: 44px;
4490
- min-height: 44px;
4491
- display: flex;
4492
- align-items: center;
4493
- justify-content: center;
4494
- border-radius: 50%;
4495
- transition: all 0.2s ease;
4496
- background: rgba(255, 255, 255, 0.1);
4497
- backdrop-filter: blur(8px);
4498
- }
4499
-
4500
- .uvf-control-btn:active {
4501
- transform: scale(0.95);
4502
- background: rgba(255, 255, 255, 0.2);
4503
- }
4504
-
4505
- /* Play/pause button prominence */
4506
- .uvf-control-btn.play-pause {
4507
- background: linear-gradient(135deg, var(--uvf-accent-1), var(--uvf-accent-2));
4508
- min-width: 52px;
4509
- min-height: 52px;
4510
- box-shadow: 0 2px 8px rgba(0,0,0,0.3);
4511
- }
4512
-
4513
- .uvf-control-btn.play-pause:active {
4514
- transform: scale(0.92);
4515
- box-shadow: 0 1px 4px rgba(0,0,0,0.4);
4516
- }
4517
-
4518
4355
  /* Fix for controls being cut off by virtual keyboard */
4519
4356
  .uvf-controls-bar {
4520
4357
  position: absolute !important;
@@ -4561,61 +4398,244 @@ export class WebPlayer extends BasePlayer {
4561
4398
  }
4562
4399
 
4563
4400
  /* Enhanced Responsive Media Queries with UX Best Practices */
4564
- /* Mobile devices (portrait) - Enhanced UX with Safe Areas */
4401
+ /* Mobile Portrait Layout - CENTERED PLAYER with TOP/BOTTOM BLACK AREAS */
4565
4402
  @media screen and (max-width: 767px) and (orientation: portrait) {
4403
+ /* CENTERED LAYOUT: 25% top black + 50% player + 25% bottom black */
4566
4404
  .uvf-responsive-container {
4405
+ display: flex;
4406
+ flex-direction: column;
4407
+ height: 100vh;
4408
+ height: 100dvh;
4409
+ background: #000;
4410
+ overflow: hidden;
4411
+ position: fixed;
4412
+ top: 0;
4413
+ left: 0;
4414
+ width: 100vw;
4567
4415
  padding: 0;
4568
- width: 100vw !important;
4569
- height: calc(100vh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
4570
4416
  margin: 0;
4571
- position: relative;
4572
- overflow: hidden;
4573
4417
  }
4574
4418
 
4575
- @supports (height: 100dvh) {
4576
- .uvf-responsive-container {
4577
- height: calc(100dvh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
4578
- }
4419
+ /* TOP BLACK AREA - 25% of viewport - COMPLETELY EMPTY */
4420
+ .uvf-responsive-container::before {
4421
+ content: '';
4422
+ flex: 0 0 25vh;
4423
+ background: #000;
4424
+ pointer-events: none;
4579
4425
  }
4580
4426
 
4581
- .uvf-responsive-container .uvf-player-wrapper {
4582
- width: 100vw !important;
4583
- height: 100% !important;
4584
- min-height: calc(100vh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
4427
+ /* BOTTOM BLACK AREA - 25% of viewport - COMPLETELY EMPTY */
4428
+ .uvf-responsive-container::after {
4429
+ content: '';
4430
+ flex: 0 0 25vh;
4431
+ background: #000;
4432
+ pointer-events: none;
4585
4433
  }
4586
4434
 
4587
- @supports (height: 100dvh) {
4588
- .uvf-responsive-container .uvf-player-wrapper {
4589
- min-height: calc(100dvh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
4590
- }
4435
+ /* CENTERED VIDEO PLAYER WRAPPER - 50% of viewport */
4436
+ .uvf-responsive-container .uvf-player-wrapper {
4437
+ flex: 1; /* Takes remaining 50% */
4438
+ width: 100vw;
4439
+ display: flex;
4440
+ align-items: center;
4441
+ justify-content: center;
4442
+ background: #000;
4443
+ position: relative;
4444
+ overflow: hidden; /* CRITICAL: Ensure nothing extends beyond this area */
4591
4445
  }
4592
4446
 
4447
+ /* Video container fills player wrapper */
4593
4448
  .uvf-responsive-container .uvf-video-container {
4594
- width: 100vw !important;
4595
- height: 100% !important;
4596
- aspect-ratio: unset !important;
4597
- min-height: inherit;
4449
+ width: 100%;
4450
+ height: 100%;
4451
+ position: relative;
4452
+ background: #000;
4453
+ border-radius: 0;
4454
+ overflow: hidden;
4455
+ }
4456
+
4457
+ /* Video element fills container */
4458
+ .uvf-responsive-container .uvf-video {
4459
+ width: 100%;
4460
+ height: 100%;
4461
+ object-fit: contain;
4462
+ background: #000;
4598
4463
  }
4599
4464
 
4600
- /* Enhanced mobile controls bar with safe area padding - iOS Safari specific fixes */
4465
+ /* CONTROLS STRICTLY CONTAINED WITHIN VIDEO AREA - NEVER EXTEND TO BLACK AREAS */
4601
4466
  .uvf-controls-bar {
4602
4467
  position: absolute !important;
4603
- bottom: 0 !important;
4604
- left: 0 !important;
4605
- right: 0 !important;
4606
- padding: 16px 12px;
4607
- padding-bottom: calc(16px + var(--uvf-safe-area-bottom, 0px));
4608
- padding-left: calc(12px + var(--uvf-safe-area-left, 0px));
4609
- padding-right: calc(12px + var(--uvf-safe-area-right, 0px));
4610
- background: linear-gradient(to top, var(--uvf-overlay-strong) 0%, var(--uvf-overlay-medium) 80%, var(--uvf-overlay-transparent) 100%);
4468
+ /* Keep controls INSIDE video container with margins from all edges */
4469
+ bottom: 20px !important; /* 20px margin from video bottom */
4470
+ left: 16px !important; /* 16px margin from video left */
4471
+ right: 16px !important; /* 16px margin from video right */
4472
+ top: auto !important;
4473
+ background: linear-gradient(to top, rgba(0,0,0,0.9) 0%, rgba(0,0,0,0.7) 60%, transparent 100%);
4474
+ padding: 12px 16px;
4475
+ border-radius: 12px;
4476
+ z-index: 1000;
4477
+ /* Ensure controls are visible and contained */
4478
+ opacity: 1 !important;
4479
+ visibility: visible !important;
4480
+ display: flex !important;
4481
+ flex-direction: column !important;
4482
+ /* Hardware acceleration */
4483
+ -webkit-transform: translate3d(0,0,0);
4484
+ transform: translate3d(0,0,0);
4485
+ /* CRITICAL: Prevent any overflow into black areas */
4486
+ max-height: calc(100% - 40px); /* Leave 20px margin from top and bottom */
4487
+ max-width: calc(100% - 32px); /* Leave 16px margin from left and right */
4611
4488
  box-sizing: border-box;
4612
- z-index: 1000 !important;
4613
- /* iOS Safari specific fixes */
4614
- transform: translateZ(0);
4615
- -webkit-transform: translateZ(0);
4616
- will-change: transform;
4617
- /* Ensure proper stacking */
4618
- isolation: isolate;
4489
+ /* Visual containment indicators */
4490
+ border: 1px solid rgba(255, 255, 255, 0.1);
4491
+ backdrop-filter: blur(10px);
4492
+ contain: layout style paint; /* CSS containment */
4493
+ }
4494
+
4495
+ /* Force controls and all child elements to stay within video container */
4496
+ .uvf-responsive-container .uvf-controls-bar {
4497
+ opacity: 1 !important;
4498
+ visibility: visible !important;
4499
+ transform: translateY(0) !important;
4500
+ pointer-events: auto !important;
4501
+ /* Ensure no child elements extend beyond container */
4502
+ contain: layout style paint;
4503
+ }
4504
+
4505
+ /* Ensure all child elements of controls stay within bounds */
4506
+ .uvf-responsive-container .uvf-controls-bar * {
4507
+ max-width: 100%;
4508
+ box-sizing: border-box;
4509
+ }
4510
+
4511
+ /* Progress section contained within controls */
4512
+ .uvf-progress-section {
4513
+ width: 100%;
4514
+ margin-bottom: 8px;
4515
+ opacity: 1 !important;
4516
+ visibility: visible !important;
4517
+ display: block !important;
4518
+ }
4519
+
4520
+ /* Progress bar styling */
4521
+ .uvf-progress-bar-wrapper {
4522
+ opacity: 1 !important;
4523
+ visibility: visible !important;
4524
+ }
4525
+
4526
+ .uvf-progress-bar {
4527
+ height: 4px;
4528
+ background: rgba(255, 255, 255, 0.3);
4529
+ border-radius: 2px;
4530
+ }
4531
+
4532
+ .uvf-progress-filled {
4533
+ background: var(--uvf-accent-1, #8B5CF6);
4534
+ height: 100%;
4535
+ border-radius: 2px;
4536
+ }
4537
+
4538
+ /* Controls row alignment - ensure visibility */
4539
+ .uvf-controls-row {
4540
+ width: 100%;
4541
+ display: flex !important;
4542
+ align-items: center;
4543
+ justify-content: flex-start;
4544
+ gap: 12px;
4545
+ opacity: 1 !important;
4546
+ visibility: visible !important;
4547
+ margin-top: 8px;
4548
+ }
4549
+
4550
+ /* Time display visibility */
4551
+ .uvf-time-display {
4552
+ color: #fff;
4553
+ font-size: 12px;
4554
+ font-weight: 500;
4555
+ opacity: 1 !important;
4556
+ visibility: visible !important;
4557
+ display: block !important;
4558
+ }
4559
+
4560
+ /* Control buttons visibility */
4561
+ .uvf-control-btn {
4562
+ min-width: 44px;
4563
+ min-height: 44px;
4564
+ display: flex !important;
4565
+ align-items: center;
4566
+ justify-content: center;
4567
+ border-radius: 50%;
4568
+ background: rgba(255, 255, 255, 0.1);
4569
+ backdrop-filter: blur(8px);
4570
+ color: #fff;
4571
+ opacity: 1 !important;
4572
+ visibility: visible !important;
4573
+ transition: all 0.2s ease;
4574
+ }
4575
+
4576
+ .uvf-control-btn:active {
4577
+ transform: scale(0.95);
4578
+ background: rgba(255, 255, 255, 0.2);
4579
+ }
4580
+
4581
+ /* Play/pause button prominence */
4582
+ .uvf-control-btn.play-pause {
4583
+ background: linear-gradient(135deg, var(--uvf-accent-1), var(--uvf-accent-2));
4584
+ min-width: 52px;
4585
+ min-height: 52px;
4586
+ box-shadow: 0 2px 8px rgba(0,0,0,0.3);
4587
+ }
4588
+
4589
+ .uvf-control-btn.play-pause:active {
4590
+ transform: scale(0.92);
4591
+ box-shadow: 0 1px 4px rgba(0,0,0,0.4);
4592
+ }
4593
+
4594
+ .uvf-control-btn svg {
4595
+ fill: #fff;
4596
+ opacity: 1;
4597
+ }
4598
+
4599
+ /* Right controls */
4600
+ .uvf-right-controls {
4601
+ margin-left: auto;
4602
+ display: flex !important;
4603
+ align-items: center;
4604
+ gap: 8px;
4605
+ opacity: 1 !important;
4606
+ visibility: visible !important;
4607
+ }
4608
+
4609
+ /* Center play button positioned within video */
4610
+ .uvf-center-play-container {
4611
+ position: absolute;
4612
+ top: 50%;
4613
+ left: 50%;
4614
+ transform: translate(-50%, -50%);
4615
+ z-index: 8;
4616
+ pointer-events: none;
4617
+ }
4618
+
4619
+ .uvf-center-play-btn {
4620
+ pointer-events: auto;
4621
+ }
4622
+
4623
+ /* Top controls within video */
4624
+ .uvf-top-controls {
4625
+ position: absolute;
4626
+ top: calc(12px + var(--uvf-safe-area-top));
4627
+ right: calc(16px + var(--uvf-safe-area-right));
4628
+ z-index: 9;
4629
+ }
4630
+
4631
+ /* Title bar within video */
4632
+ .uvf-title-bar {
4633
+ position: absolute;
4634
+ top: calc(12px + var(--uvf-safe-area-top));
4635
+ left: calc(16px + var(--uvf-safe-area-left));
4636
+ right: calc(80px + var(--uvf-safe-area-right));
4637
+ z-index: 9;
4638
+ padding: 8px 0;
4619
4639
  }
4620
4640
 
4621
4641
  .uvf-progress-section {
@@ -4996,69 +5016,55 @@ export class WebPlayer extends BasePlayer {
4996
5016
  }
4997
5017
  }
4998
5018
 
4999
- /* Mobile devices (landscape) - Fullscreen with controls inside video */
5019
+ /* Mobile devices (landscape) - Optimized for fullscreen viewing with safe areas */
5000
5020
  @media screen and (max-width: 767px) and (orientation: landscape) {
5001
5021
  .uvf-responsive-container {
5002
- position: fixed;
5003
- top: 0;
5004
- left: 0;
5005
5022
  width: 100vw !important;
5006
- height: 100vh !important;
5007
- height: 100dvh !important;
5008
- background: #000;
5009
- z-index: 9999;
5010
- display: block; /* Override portrait flexbox */
5023
+ height: calc(100vh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
5011
5024
  margin: 0;
5012
5025
  padding: 0;
5026
+ position: relative;
5013
5027
  overflow: hidden;
5014
5028
  }
5015
5029
 
5016
- /* Remove pseudo-elements in landscape */
5017
- .uvf-responsive-container::before,
5018
- .uvf-responsive-container::after {
5019
- display: none !important;
5030
+ @supports (height: 100dvh) {
5031
+ .uvf-responsive-container {
5032
+ height: calc(100dvh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
5033
+ }
5020
5034
  }
5021
5035
 
5022
5036
  .uvf-responsive-container .uvf-player-wrapper {
5023
5037
  width: 100vw !important;
5024
- height: 100vh !important;
5025
- height: 100dvh !important;
5026
- position: relative;
5027
- display: block;
5038
+ height: 100% !important;
5039
+ min-height: calc(100vh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
5028
5040
  }
5029
5041
 
5030
- .uvf-responsive-container .uvf-video-container {
5031
- width: 100vw !important;
5032
- height: 100vh !important;
5033
- height: 100dvh !important;
5034
- position: relative;
5035
- background: #000;
5036
- overflow: hidden;
5042
+ @supports (height: 100dvh) {
5043
+ .uvf-responsive-container .uvf-player-wrapper {
5044
+ min-height: calc(100dvh - var(--uvf-safe-area-top) - var(--uvf-safe-area-bottom));
5045
+ }
5037
5046
  }
5038
5047
 
5039
- .uvf-responsive-container .uvf-video {
5040
- width: 100%;
5041
- height: 100%;
5042
- object-fit: contain;
5043
- background: #000;
5048
+ .uvf-responsive-container .uvf-video-container {
5049
+ width: 100vw !important;
5050
+ height: 100% !important;
5051
+ aspect-ratio: unset !important;
5052
+ min-height: inherit;
5044
5053
  }
5045
5054
 
5046
- /* Compact controls for landscape - positioned inside video container */
5055
+ /* Compact controls for landscape with safe area padding */
5047
5056
  .uvf-controls-bar {
5048
- position: absolute !important;
5049
- bottom: 0 !important;
5050
- left: 0 !important;
5051
- right: 0 !important;
5057
+ position: absolute;
5058
+ bottom: 0;
5059
+ left: 0;
5060
+ right: 0;
5052
5061
  padding: 10px 12px;
5053
5062
  padding-bottom: calc(10px + var(--uvf-safe-area-bottom));
5054
5063
  padding-left: calc(12px + var(--uvf-safe-area-left));
5055
5064
  padding-right: calc(12px + var(--uvf-safe-area-right));
5056
- background: linear-gradient(to top, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.6) 60%, transparent 100%);
5065
+ background: linear-gradient(to top, var(--uvf-overlay-strong) 0%, var(--uvf-overlay-medium) 80%, var(--uvf-overlay-transparent) 100%);
5057
5066
  box-sizing: border-box;
5058
5067
  z-index: 1000;
5059
- /* Ensure hardware acceleration */
5060
- -webkit-transform: translate3d(0,0,0);
5061
- transform: translate3d(0,0,0);
5062
5068
  }
5063
5069
 
5064
5070
  .uvf-progress-section {
@@ -5094,36 +5100,16 @@ export class WebPlayer extends BasePlayer {
5094
5100
  height: 22px;
5095
5101
  }
5096
5102
 
5097
- /* Compact top controls with safe area padding - inside video container */
5103
+ /* Compact top controls with safe area padding */
5098
5104
  .uvf-top-controls {
5099
- position: absolute;
5100
5105
  top: calc(8px + var(--uvf-safe-area-top));
5101
5106
  right: calc(12px + var(--uvf-safe-area-right));
5102
5107
  gap: 6px;
5103
- z-index: 9;
5104
- }
5105
-
5106
- /* Center play button positioned within video container */
5107
- .uvf-center-play-container {
5108
- position: absolute;
5109
- top: 50%;
5110
- left: 50%;
5111
- transform: translate(-50%, -50%);
5112
- z-index: 8;
5113
- pointer-events: none;
5114
- }
5115
-
5116
- .uvf-center-play-btn {
5117
- pointer-events: auto;
5118
5108
  }
5119
5109
 
5120
5110
  .uvf-title-bar {
5121
- position: absolute;
5122
- top: calc(8px + var(--uvf-safe-area-top));
5123
- left: calc(12px + var(--uvf-safe-area-left));
5124
- right: calc(80px + var(--uvf-safe-area-right));
5125
- z-index: 9;
5126
- padding: 8px 0;
5111
+ padding: 8px 12px;
5112
+ padding-top: calc(8px + var(--uvf-safe-area-top));
5127
5113
  padding-left: calc(12px + var(--uvf-safe-area-left));
5128
5114
  padding-right: calc(12px + var(--uvf-safe-area-right));
5129
5115
  }