@videojs/html 10.0.0-beta.5 → 10.0.0-beta.6

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.
Files changed (137) hide show
  1. package/cdn/audio-minimal.css +1 -1
  2. package/cdn/audio-minimal.dev.js +16 -8
  3. package/cdn/audio-minimal.dev.js.map +1 -1
  4. package/cdn/audio-minimal.js +2 -2
  5. package/cdn/audio-minimal.js.map +1 -1
  6. package/cdn/audio.css +1 -1
  7. package/cdn/audio.dev.js +16 -8
  8. package/cdn/audio.dev.js.map +1 -1
  9. package/cdn/audio.js +2 -2
  10. package/cdn/audio.js.map +1 -1
  11. package/cdn/media/hls-video.dev.js +11 -9
  12. package/cdn/media/hls-video.dev.js.map +1 -1
  13. package/cdn/media/hls-video.js +11 -9
  14. package/cdn/media/hls-video.js.map +1 -1
  15. package/cdn/media/simple-hls-video.dev.js +11 -9
  16. package/cdn/media/simple-hls-video.dev.js.map +1 -1
  17. package/cdn/media/simple-hls-video.js +11 -9
  18. package/cdn/media/simple-hls-video.js.map +1 -1
  19. package/cdn/video-minimal.css +1 -1
  20. package/cdn/video-minimal.dev.js +24 -8
  21. package/cdn/video-minimal.dev.js.map +1 -1
  22. package/cdn/video-minimal.js +3 -3
  23. package/cdn/video-minimal.js.map +1 -1
  24. package/cdn/video.css +1 -1
  25. package/cdn/video.dev.js +22 -8
  26. package/cdn/video.dev.js.map +1 -1
  27. package/cdn/video.js +3 -3
  28. package/cdn/video.js.map +1 -1
  29. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  30. package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  31. package/dist/default/_virtual/inline-css_src/define/audio/skin.js +1 -1
  32. package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  33. package/dist/default/_virtual/inline-css_src/define/base.js +1 -1
  34. package/dist/default/_virtual/inline-css_src/define/base.js.map +1 -1
  35. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  36. package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  37. package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
  38. package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  39. package/dist/default/define/audio/minimal-skin.css +60 -9
  40. package/dist/default/define/audio/skin.css +60 -11
  41. package/dist/default/define/base.css +10 -12
  42. package/dist/default/define/shared.css +4 -0
  43. package/dist/default/define/video/minimal-skin.css +173 -25
  44. package/dist/default/define/video/minimal-skin.js +1 -1
  45. package/dist/default/define/video/minimal-skin.js.map +1 -1
  46. package/dist/default/define/video/minimal-skin.tailwind.js +2 -2
  47. package/dist/default/define/video/minimal-skin.tailwind.js.map +1 -1
  48. package/dist/default/define/video/skin.css +163 -21
  49. package/dist/default/define/video/skin.js +1 -1
  50. package/dist/default/define/video/skin.js.map +1 -1
  51. package/dist/default/define/video/skin.tailwind.js +2 -2
  52. package/dist/default/define/video/skin.tailwind.js.map +1 -1
  53. package/dist/default/skins/dist/default/default/tailwind/components/button.js +1 -1
  54. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  55. package/dist/default/skins/dist/default/default/tailwind/components/popup.js +3 -3
  56. package/dist/default/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  57. package/dist/default/skins/dist/default/default/tailwind/components/preview.js +13 -0
  58. package/dist/default/skins/dist/default/default/tailwind/components/preview.js.map +1 -0
  59. package/dist/default/skins/dist/default/default/tailwind/components/root.js +1 -1
  60. package/dist/default/skins/dist/default/default/tailwind/components/root.js.map +1 -1
  61. package/dist/default/skins/dist/default/default/tailwind/components/slider.js +1 -1
  62. package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  63. package/dist/default/skins/dist/default/default/tailwind/components/surface.js +1 -1
  64. package/dist/default/skins/dist/default/default/tailwind/components/surface.js.map +1 -1
  65. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +16 -11
  66. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  67. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js +1 -1
  68. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  69. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +1 -1
  70. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  71. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js +4 -3
  72. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  73. package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js +14 -0
  74. package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js.map +1 -0
  75. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js +1 -1
  76. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  77. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +1 -1
  78. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  79. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +18 -12
  80. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  81. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
  82. package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
  83. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
  84. package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
  85. package/dist/dev/_virtual/inline-css_src/define/base.js +1 -1
  86. package/dist/dev/_virtual/inline-css_src/define/base.js.map +1 -1
  87. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
  88. package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
  89. package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
  90. package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
  91. package/dist/dev/define/audio/minimal-skin.css +60 -9
  92. package/dist/dev/define/audio/skin.css +60 -11
  93. package/dist/dev/define/base.css +10 -12
  94. package/dist/dev/define/shared.css +4 -0
  95. package/dist/dev/define/video/minimal-skin.css +173 -25
  96. package/dist/dev/define/video/minimal-skin.d.ts.map +1 -1
  97. package/dist/dev/define/video/minimal-skin.js +8 -0
  98. package/dist/dev/define/video/minimal-skin.js.map +1 -1
  99. package/dist/dev/define/video/minimal-skin.tailwind.d.ts.map +1 -1
  100. package/dist/dev/define/video/minimal-skin.tailwind.js +9 -1
  101. package/dist/dev/define/video/minimal-skin.tailwind.js.map +1 -1
  102. package/dist/dev/define/video/skin.css +163 -21
  103. package/dist/dev/define/video/skin.d.ts.map +1 -1
  104. package/dist/dev/define/video/skin.js +6 -0
  105. package/dist/dev/define/video/skin.js.map +1 -1
  106. package/dist/dev/define/video/skin.tailwind.d.ts.map +1 -1
  107. package/dist/dev/define/video/skin.tailwind.js +7 -1
  108. package/dist/dev/define/video/skin.tailwind.js.map +1 -1
  109. package/dist/dev/skins/dist/default/default/tailwind/components/button.js +1 -1
  110. package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  111. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js +3 -3
  112. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  113. package/dist/dev/skins/dist/default/default/tailwind/components/preview.js +13 -0
  114. package/dist/dev/skins/dist/default/default/tailwind/components/preview.js.map +1 -0
  115. package/dist/dev/skins/dist/default/default/tailwind/components/root.js +1 -1
  116. package/dist/dev/skins/dist/default/default/tailwind/components/root.js.map +1 -1
  117. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js +1 -1
  118. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  119. package/dist/dev/skins/dist/default/default/tailwind/components/surface.js +1 -1
  120. package/dist/dev/skins/dist/default/default/tailwind/components/surface.js.map +1 -1
  121. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js +16 -11
  122. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  123. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js +1 -1
  124. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  125. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +1 -1
  126. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +1 -1
  127. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js +4 -3
  128. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  129. package/dist/dev/skins/dist/default/minimal/tailwind/components/preview.js +14 -0
  130. package/dist/dev/skins/dist/default/minimal/tailwind/components/preview.js.map +1 -0
  131. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js +1 -1
  132. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  133. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js +1 -1
  134. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  135. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js +18 -12
  136. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  137. package/package.json +8 -8
@@ -70,7 +70,6 @@
70
70
  .media-minimal-skin *::before,
71
71
  .media-minimal-skin *::after {
72
72
  box-sizing: border-box;
73
- margin: 0;
74
73
  }
75
74
  .media-minimal-skin img,
76
75
  .media-minimal-skin video,
@@ -299,6 +298,7 @@
299
298
  transition-timing-function: ease-out;
300
299
  cursor: pointer;
301
300
  user-select: none;
301
+ touch-action: manipulation;
302
302
 
303
303
  &:focus-visible {
304
304
  outline-color: currentColor;
@@ -407,6 +407,7 @@
407
407
  flex: 1;
408
408
  border-radius: calc(infinity * 1px);
409
409
  outline: none;
410
+ cursor: pointer;
410
411
 
411
412
  &[data-orientation="horizontal"] {
412
413
  min-width: 5rem;
@@ -536,11 +537,6 @@
536
537
  }
537
538
  }
538
539
 
539
- /* Time display within slider */
540
- .media-minimal-skin .media-slider__time-display {
541
- font-variant-numeric: tabular-nums;
542
- }
543
-
544
540
  /* ==========================================================================
545
541
  Popups & Animations
546
542
  ========================================================================== */
@@ -552,12 +548,12 @@
552
548
  color: inherit;
553
549
  overflow: visible;
554
550
  transition-property: transform, scale, opacity, filter;
555
- transition-duration: 200ms;
551
+ transition-duration: 150ms;
556
552
 
557
553
  &[data-starting-style],
558
554
  &[data-ending-style] {
559
555
  opacity: 0;
560
- transform: scale(0);
556
+ transform: scale(0.5);
561
557
  filter: blur(8px);
562
558
  }
563
559
 
@@ -577,6 +573,48 @@
577
573
  &[data-side="right"] {
578
574
  transform-origin: left;
579
575
  }
576
+
577
+ /* Safe area between trigger and popup */
578
+ &::before {
579
+ content: "";
580
+ position: absolute;
581
+ pointer-events: inherit;
582
+ }
583
+
584
+ &[data-side="top"]::before,
585
+ &[data-side="bottom"]::before {
586
+ width: 100%;
587
+ inset-inline: 0;
588
+ }
589
+ &[data-side="top"]::before {
590
+ top: 100%;
591
+ }
592
+ &[data-side="bottom"]::before {
593
+ bottom: 100%;
594
+ }
595
+
596
+ &[data-side="left"]::before,
597
+ &[data-side="right"]::before {
598
+ height: 100%;
599
+ inset-block: 0;
600
+ }
601
+ &[data-side="left"]::before {
602
+ left: 100%;
603
+ }
604
+ &[data-side="right"]::before {
605
+ right: 100%;
606
+ }
607
+ }
608
+
609
+ .media-minimal-skin .media-popover {
610
+ &[data-side="top"]::before,
611
+ &[data-side="bottom"]::before {
612
+ height: var(--media-popover-side-offset);
613
+ }
614
+ &[data-side="left"]::before,
615
+ &[data-side="right"]::before {
616
+ width: var(--media-popover-side-offset);
617
+ }
580
618
  }
581
619
 
582
620
  .media-minimal-skin .media-tooltip {
@@ -589,7 +627,16 @@
589
627
  0 2px 4px -2px oklch(0 0 0 / 0.1);
590
628
  font-size: 0.75rem;
591
629
  white-space: nowrap;
592
- --media-tooltip-side-offset: 0.5rem;
630
+ --media-tooltip-side-offset: 0.75rem;
631
+
632
+ &[data-side="top"]::before,
633
+ &[data-side="bottom"]::before {
634
+ height: var(--media-tooltip-side-offset);
635
+ }
636
+ &[data-side="left"]::before,
637
+ &[data-side="right"]::before {
638
+ width: var(--media-tooltip-side-offset);
639
+ }
593
640
 
594
641
  @media (prefers-reduced-transparency: reduce) {
595
642
  background-color: oklch(0 0 0 / 0.7);
@@ -640,3 +687,7 @@ media-tooltip-group {
640
687
  display: contents;
641
688
  }
642
689
 
690
+ :host {
691
+ display: grid;
692
+ }
693
+
@@ -70,7 +70,6 @@
70
70
  .media-default-skin *::before,
71
71
  .media-default-skin *::after {
72
72
  box-sizing: border-box;
73
- margin: 0;
74
73
  }
75
74
  .media-default-skin img,
76
75
  .media-default-skin video,
@@ -120,7 +119,7 @@
120
119
  background-color: var(--media-surface-background-color);
121
120
  backdrop-filter: var(--media-surface-backdrop-filter);
122
121
  box-shadow:
123
- inset 0 0 0 1px var(--media-surface-inner-border-color),
122
+ 0 0 0 1px var(--media-surface-outer-border-color),
124
123
  0 1px 3px 0 var(--media-surface-shadow-color),
125
124
  0 1px 2px -1px var(--media-surface-shadow-color);
126
125
 
@@ -131,7 +130,7 @@
131
130
  inset: 0;
132
131
  z-index: 10;
133
132
  border-radius: inherit;
134
- box-shadow: 0 0 0 1px var(--media-surface-outer-border-color);
133
+ box-shadow: inset 0 0 0 1px var(--media-surface-inner-border-color);
135
134
  pointer-events: none;
136
135
  }
137
136
 
@@ -316,6 +315,7 @@
316
315
  transition-timing-function: ease-out;
317
316
  cursor: pointer;
318
317
  user-select: none;
318
+ touch-action: manipulation;
319
319
 
320
320
  &:focus-visible {
321
321
  outline-color: oklch(62.3% 0.214 259.815);
@@ -425,6 +425,7 @@
425
425
  flex: 1;
426
426
  border-radius: calc(infinity * 1px);
427
427
  outline: none;
428
+ cursor: pointer;
428
429
 
429
430
  &[data-orientation="horizontal"] {
430
431
  min-width: 5rem;
@@ -557,11 +558,6 @@
557
558
  }
558
559
  }
559
560
 
560
- /* Time display within slider */
561
- .media-default-skin .media-slider__time-display {
562
- font-variant-numeric: tabular-nums;
563
- }
564
-
565
561
  /* ==========================================================================
566
562
  Popups & Tooltips
567
563
  ========================================================================== */
@@ -573,12 +569,12 @@
573
569
  color: inherit;
574
570
  overflow: visible;
575
571
  transition-property: transform, scale, opacity, filter;
576
- transition-duration: 200ms;
572
+ transition-duration: 150ms;
577
573
 
578
574
  &[data-starting-style],
579
575
  &[data-ending-style] {
580
576
  opacity: 0;
581
- transform: scale(0);
577
+ transform: scale(0.5);
582
578
  filter: blur(8px);
583
579
  }
584
580
 
@@ -598,10 +594,50 @@
598
594
  &[data-side="right"] {
599
595
  transform-origin: left;
600
596
  }
597
+
598
+ /* Safe area between trigger and popup */
599
+ &::before {
600
+ content: "";
601
+ position: absolute;
602
+ pointer-events: inherit;
603
+ }
604
+
605
+ &[data-side="top"]::before,
606
+ &[data-side="bottom"]::before {
607
+ width: 100%;
608
+ inset-inline: 0;
609
+ }
610
+ &[data-side="top"]::before {
611
+ top: 100%;
612
+ }
613
+ &[data-side="bottom"]::before {
614
+ bottom: 100%;
615
+ }
616
+
617
+ &[data-side="left"]::before,
618
+ &[data-side="right"]::before {
619
+ height: 100%;
620
+ inset-block: 0;
621
+ }
622
+ &[data-side="left"]::before {
623
+ left: 100%;
624
+ }
625
+ &[data-side="right"]::before {
626
+ right: 100%;
627
+ }
601
628
  }
602
629
 
603
630
  .media-default-skin .media-popover {
604
631
  --media-popover-side-offset: 0.5rem;
632
+
633
+ &[data-side="top"]::before,
634
+ &[data-side="bottom"]::before {
635
+ height: var(--media-popover-side-offset);
636
+ }
637
+ &[data-side="left"]::before,
638
+ &[data-side="right"]::before {
639
+ width: var(--media-popover-side-offset);
640
+ }
605
641
  }
606
642
  .media-default-skin .media-popover--volume {
607
643
  padding: 0.625rem 0.25rem;
@@ -613,7 +649,16 @@
613
649
  border-radius: calc(infinity * 1px);
614
650
  font-size: 0.75rem;
615
651
  white-space: nowrap;
616
- --media-tooltip-side-offset: 0.5rem;
652
+ --media-tooltip-side-offset: 0.75rem;
653
+
654
+ &[data-side="top"]::before,
655
+ &[data-side="bottom"]::before {
656
+ height: var(--media-tooltip-side-offset);
657
+ }
658
+ &[data-side="left"]::before,
659
+ &[data-side="right"]::before {
660
+ width: var(--media-tooltip-side-offset);
661
+ }
617
662
  }
618
663
 
619
664
 
@@ -661,3 +706,7 @@ media-tooltip-group {
661
706
  display: contents;
662
707
  }
663
708
 
709
+ :host {
710
+ display: grid;
711
+ }
712
+
@@ -2,24 +2,22 @@ video-player {
2
2
  display: contents;
3
3
  }
4
4
 
5
- video-player video,
6
- video-player hls-video,
7
- video-player simple-hls-video {
5
+ /*
6
+ Required to override any default video styles (such as Tailwind's CSS reset)
7
+ and ensure the video element fills the container as expected.
8
+ */
9
+ video-player video {
8
10
  display: block;
9
11
  width: 100%;
10
12
  height: 100%;
13
+ object-fit: var(--media-object-fit, contain);
14
+ object-position: var(--media-object-position, center);
11
15
  }
12
16
 
13
17
  video-player video::-webkit-media-text-track-container {
14
- transition: transform var(--media-caption-track-duration, 150ms) ease-out;
15
- transition-delay: var(--media-caption-track-delay, 600ms);
18
+ transition: transform var(--media-caption-track-duration, 0) ease-out;
19
+ transition-delay: var(--media-caption-track-delay, 0);
16
20
  transform: translateY(var(--media-caption-track-y, 0)) scale(0.98);
17
- z-index: var(--media-caption-track-z, 1);
21
+ z-index: 1;
18
22
  font-family: inherit;
19
23
  }
20
-
21
- @media (prefers-reduced-motion: reduce) {
22
- video-player video::-webkit-media-text-track-container {
23
- transition-duration: 50ms;
24
- }
25
- }
@@ -1,3 +1,7 @@
1
1
  media-tooltip-group {
2
2
  display: contents;
3
3
  }
4
+
5
+ :host {
6
+ display: grid;
7
+ }
@@ -100,7 +100,6 @@
100
100
  .media-minimal-skin *::before,
101
101
  .media-minimal-skin *::after {
102
102
  box-sizing: border-box;
103
- margin: 0;
104
103
  }
105
104
  .media-minimal-skin img,
106
105
  .media-minimal-skin video,
@@ -151,9 +150,11 @@
151
150
  display: block;
152
151
  width: 100%;
153
152
  height: 100%;
153
+ object-fit: var(--media-object-fit, contain);
154
+ object-position: var(--media-object-position, center);
154
155
  }
155
156
  .media-minimal-skin ::slotted(video) {
156
- border-radius: var(--media-border-radius, 0.75rem);
157
+ border-radius: var(--media-video-border-radius);
157
158
  }
158
159
  .media-minimal-skin video {
159
160
  border-radius: inherit;
@@ -168,10 +169,11 @@
168
169
  inset: 0;
169
170
  width: 100%;
170
171
  height: 100%;
171
- border-radius: inherit;
172
- object-fit: cover;
172
+ object-fit: var(--media-object-fit, contain);
173
+ object-position: var(--media-object-position, center);
173
174
  transition: opacity 0.25s;
174
175
  pointer-events: none;
176
+ border-radius: inherit;
175
177
 
176
178
  &:not([data-visible]) {
177
179
  opacity: 0;
@@ -182,14 +184,10 @@
182
184
  Fullscreen
183
185
  ========================================================================== */
184
186
 
185
- .media-minimal-skin:fullscreen video,
186
187
  .media-minimal-skin:fullscreen ::slotted(video),
187
- .media-minimal-skin:fullscreen > img {
188
+ .media-minimal-skin:fullscreen video {
188
189
  object-fit: contain;
189
190
  }
190
- .media-minimal-skin:fullscreen ::slotted(video) {
191
- border-radius: 0;
192
- }
193
191
 
194
192
  /* ==========================================================================
195
193
  Overlay / Scrim
@@ -417,6 +415,7 @@
417
415
  transition-timing-function: ease-out;
418
416
  cursor: pointer;
419
417
  user-select: none;
418
+ touch-action: manipulation;
420
419
 
421
420
  &:focus-visible {
422
421
  outline-color: currentColor;
@@ -513,6 +512,54 @@
513
512
  scale: -1 1;
514
513
  }
515
514
 
515
+ /* ==========================================================================
516
+ Media preview
517
+ ========================================================================== */
518
+ .media-minimal-skin .media-preview {
519
+ & .media-preview__thumbnail-wrapper {
520
+ position: relative;
521
+ border-radius: 0.5rem;
522
+ background-color: oklch(0 0 0 / 0.9);
523
+ }
524
+ & .media-preview__thumbnail {
525
+ display: block;
526
+ border-radius: inherit;
527
+ }
528
+
529
+ & .media-preview__timestamp {
530
+ display: block;
531
+ font-variant-numeric: tabular-nums;
532
+ text-align: center;
533
+ margin-top: 0.5rem;
534
+ }
535
+
536
+ & .media-overlay {
537
+ opacity: 1;
538
+ }
539
+
540
+ & .media-preview__spinner {
541
+ position: absolute;
542
+ top: 50%;
543
+ left: 50%;
544
+ transform: translate(-50%, -50%);
545
+ opacity: 0;
546
+ }
547
+
548
+ & .media-preview__thumbnail,
549
+ & .media-preview__spinner {
550
+ transition: opacity 150ms ease-out;
551
+ }
552
+
553
+ &:has(.media-preview__thumbnail[data-loading]) {
554
+ & .media-preview__thumbnail {
555
+ opacity: 0;
556
+ }
557
+ & .media-preview__spinner {
558
+ opacity: 1;
559
+ }
560
+ }
561
+ }
562
+
516
563
  /* ==========================================================================
517
564
  Slider
518
565
  ========================================================================== */
@@ -525,6 +572,7 @@
525
572
  flex: 1;
526
573
  border-radius: calc(infinity * 1px);
527
574
  outline: none;
575
+ cursor: pointer;
528
576
 
529
577
  &[data-orientation="horizontal"] {
530
578
  min-width: 5rem;
@@ -654,11 +702,6 @@
654
702
  }
655
703
  }
656
704
 
657
- /* Time display within slider */
658
- .media-minimal-skin .media-slider__time-display {
659
- font-variant-numeric: tabular-nums;
660
- }
661
-
662
705
  /* ==========================================================================
663
706
  Popups & Animations
664
707
  ========================================================================== */
@@ -670,12 +713,12 @@
670
713
  color: inherit;
671
714
  overflow: visible;
672
715
  transition-property: transform, scale, opacity, filter;
673
- transition-duration: 200ms;
716
+ transition-duration: 150ms;
674
717
 
675
718
  &[data-starting-style],
676
719
  &[data-ending-style] {
677
720
  opacity: 0;
678
- transform: scale(0);
721
+ transform: scale(0.5);
679
722
  filter: blur(8px);
680
723
  }
681
724
 
@@ -695,6 +738,48 @@
695
738
  &[data-side="right"] {
696
739
  transform-origin: left;
697
740
  }
741
+
742
+ /* Safe area between trigger and popup */
743
+ &::before {
744
+ content: "";
745
+ position: absolute;
746
+ pointer-events: inherit;
747
+ }
748
+
749
+ &[data-side="top"]::before,
750
+ &[data-side="bottom"]::before {
751
+ width: 100%;
752
+ inset-inline: 0;
753
+ }
754
+ &[data-side="top"]::before {
755
+ top: 100%;
756
+ }
757
+ &[data-side="bottom"]::before {
758
+ bottom: 100%;
759
+ }
760
+
761
+ &[data-side="left"]::before,
762
+ &[data-side="right"]::before {
763
+ height: 100%;
764
+ inset-block: 0;
765
+ }
766
+ &[data-side="left"]::before {
767
+ left: 100%;
768
+ }
769
+ &[data-side="right"]::before {
770
+ right: 100%;
771
+ }
772
+ }
773
+
774
+ .media-minimal-skin .media-popover {
775
+ &[data-side="top"]::before,
776
+ &[data-side="bottom"]::before {
777
+ height: var(--media-popover-side-offset);
778
+ }
779
+ &[data-side="left"]::before,
780
+ &[data-side="right"]::before {
781
+ width: var(--media-popover-side-offset);
782
+ }
698
783
  }
699
784
 
700
785
  .media-minimal-skin .media-tooltip {
@@ -707,7 +792,16 @@
707
792
  0 2px 4px -2px oklch(0 0 0 / 0.1);
708
793
  font-size: 0.75rem;
709
794
  white-space: nowrap;
710
- --media-tooltip-side-offset: 0.5rem;
795
+ --media-tooltip-side-offset: 0.75rem;
796
+
797
+ &[data-side="top"]::before,
798
+ &[data-side="bottom"]::before {
799
+ height: var(--media-tooltip-side-offset);
800
+ }
801
+ &[data-side="left"]::before,
802
+ &[data-side="right"]::before {
803
+ width: var(--media-tooltip-side-offset);
804
+ }
711
805
 
712
806
  @media (prefers-reduced-transparency: reduce) {
713
807
  background-color: oklch(0 0 0 / 0.7);
@@ -723,6 +817,7 @@
723
817
  ========================================================================== */
724
818
 
725
819
  .media-minimal-skin {
820
+ --media-caption-track-duration: 150ms;
726
821
  --media-caption-track-delay: 600ms;
727
822
  --media-caption-track-y: -0.5rem;
728
823
 
@@ -730,23 +825,21 @@
730
825
  --media-caption-track-delay: 25ms;
731
826
  --media-caption-track-y: -3rem;
732
827
  }
828
+
829
+ @media (prefers-reduced-motion: reduce) {
830
+ --media-caption-track-duration: 50ms;
831
+ }
733
832
  }
734
833
 
735
834
  .media-minimal-skin video::-webkit-media-text-track-container {
736
835
  /* NOTE: The delay must account for the controls delay/duration */
737
- transition: transform 150ms ease-out;
836
+ transition: transform var(--media-caption-track-duration) ease-out;
738
837
  transition-delay: var(--media-caption-track-delay);
739
838
  transform: translateY(var(--media-caption-track-y)) scale(0.98);
740
839
  z-index: 1;
741
840
  font-family: inherit;
742
841
  }
743
842
 
744
- @media (prefers-reduced-motion: reduce) {
745
- .media-minimal-skin video::-webkit-media-text-track-container {
746
- transition-duration: 50ms;
747
- }
748
- }
749
-
750
843
 
751
844
  /* ==========================================================================
752
845
  Root
@@ -755,6 +848,7 @@
755
848
  .media-minimal-skin--video {
756
849
  background: oklch(0 0 0);
757
850
  --media-border-color: oklch(0 0 0 / 0.15);
851
+ --media-video-border-radius: var(--media-border-radius, 0.75rem);
758
852
 
759
853
  @media (prefers-color-scheme: dark) {
760
854
  --media-border-color: oklch(1 0 0 / 0.15);
@@ -773,7 +867,7 @@
773
867
 
774
868
  /* Fullscreen */
775
869
  &:fullscreen {
776
- border-radius: 0;
870
+ --media-border-radius: 0;
777
871
  }
778
872
  }
779
873
 
@@ -823,6 +917,11 @@
823
917
  }
824
918
  }
825
919
 
920
+ /* Hide cursor when controls are hidden in fullscreen */
921
+ .media-minimal-skin--video:fullscreen:has(.media-controls:not([data-visible])) {
922
+ cursor: none;
923
+ }
924
+
826
925
  /* ==========================================================================
827
926
  Sliders
828
927
  ========================================================================== */
@@ -841,7 +940,56 @@
841
940
  padding: 0.25rem;
842
941
  }
843
942
 
943
+ /* ==========================================================================
944
+ Slider preview
945
+ ========================================================================== */
946
+
947
+ .media-minimal-skin .media-slider__preview {
948
+ position: absolute;
949
+ left: var(--media-slider-pointer);
950
+ bottom: calc(100% + 0.5rem);
951
+ translate: -50%;
952
+ opacity: 0;
953
+ scale: 0.8;
954
+ filter: blur(8px);
955
+ transition-property: scale, opacity, filter;
956
+ transition-duration: 150ms;
957
+ transform-origin: bottom;
958
+
959
+ & .media-preview__thumbnail-wrapper {
960
+ position: relative;
961
+
962
+ &::after {
963
+ content: "";
964
+ position: absolute;
965
+ inset: 0;
966
+ border-radius: inherit;
967
+ box-shadow:
968
+ 0 0 0 1px oklch(0 0 0 / 0.05),
969
+ 0 1px 3px 0 oklch(0 0 0 / 0.2),
970
+ 0 1px 2px -1px oklch(0 0 0 / 0.2);
971
+ }
972
+ }
973
+
974
+ & .media-preview__thumbnail {
975
+ max-width: 11rem;
976
+ }
977
+
978
+ &:has(.media-preview__thumbnail[data-loading]) {
979
+ max-height: 6rem;
980
+ }
981
+ }
982
+ .media-minimal-skin .media-slider[data-pointing] .media-slider__preview:has([role="img"]:not([data-hidden])) {
983
+ opacity: 1;
984
+ scale: 1;
985
+ filter: blur(0);
986
+ }
987
+
844
988
  media-tooltip-group {
845
989
  display: contents;
846
990
  }
847
991
 
992
+ :host {
993
+ display: grid;
994
+ }
995
+
@@ -21,7 +21,7 @@ import { ReactiveElement } from "@videojs/element";
21
21
  //#region src/define/video/minimal-skin.ts
22
22
  const SEEK_TIME = 10;
23
23
  function getTemplateHTML() {
24
- return `<media-container class="media-minimal-skin media-minimal-skin--video"><slot name="media"></slot><media-buffering-indicator class="media-buffering-indicator"> ${renderIcon("spinner", { class: "media-icon" })} </media-buffering-indicator><media-controls class="media-controls"><media-tooltip-group><div class="media-button-group"><media-play-button commandfor="play-tooltip" class="media-button media-button--icon media-button--play"> ${renderIcon("restart", { class: "media-icon media-icon--restart" })} ${renderIcon("play", { class: "media-icon media-icon--play" })} ${renderIcon("pause", { class: "media-icon media-icon--pause" })} </media-play-button><media-tooltip id="play-tooltip" side="top" class="media-tooltip"><span class="media-tooltip-label media-tooltip-label--replay">Replay</span><span class="media-tooltip-label media-tooltip-label--play">Play</span><span class="media-tooltip-label media-tooltip-label--pause">Pause</span></media-tooltip><media-seek-button commandfor="seek-backward-tooltip" seconds="${-SEEK_TIME}" class="media-button media-button--icon media-button--seek"><span class="media-icon__container"> ${renderIcon("seek", { class: "media-icon media-icon--flipped" })} <span class="media-icon__label">${SEEK_TIME}</span></span></media-seek-button><media-tooltip id="seek-backward-tooltip" side="top" class="media-tooltip"> Seek backward ${SEEK_TIME} seconds </media-tooltip><media-seek-button commandfor="seek-forward-tooltip" seconds="${SEEK_TIME}" class="media-button media-button--icon media-button--seek"><span class="media-icon__container"> ${renderIcon("seek", { class: "media-icon" })} <span class="media-icon__label">${SEEK_TIME}</span></span></media-seek-button><media-tooltip id="seek-forward-tooltip" side="top" class="media-tooltip"> Seek forward ${SEEK_TIME} seconds </media-tooltip></div><div class="media-time-controls"><media-time-group class="media-time"><media-time type="current" class="media-time__value media-time__value--current"></media-time><media-time-separator class="media-time__separator"></media-time-separator><media-time type="duration" class="media-time__value media-time__value--duration"></media-time></media-time-group><media-time-slider class="media-slider"><media-slider-track class="media-slider__track"><media-slider-fill class="media-slider__fill"></media-slider-fill><media-slider-buffer class="media-slider__buffer"></media-slider-buffer></media-slider-track><media-slider-thumb class="media-slider__thumb"></media-slider-thumb></media-time-slider></div><div class="media-button-group"><media-playback-rate-button commandfor="playback-rate-tooltip" class="media-button media-button--icon media-button--playback-rate"></media-playback-rate-button><media-tooltip id="playback-rate-tooltip" side="top" class="media-tooltip"> Toggle playback rate </media-tooltip><media-mute-button commandfor="video-volume-popover" class="media-button media-button--icon media-button--mute"> ${renderIcon("volume-off", { class: "media-icon media-icon--volume-off" })} ${renderIcon("volume-low", { class: "media-icon media-icon--volume-low" })} ${renderIcon("volume-high", { class: "media-icon media-icon--volume-high" })} </media-mute-button><media-popover id="video-volume-popover" open-on-hover delay="200" close-delay="100" side="top" class="media-popover media-popover--volume"><media-volume-slider class="media-slider" orientation="vertical" thumb-alignment="edge"><media-slider-track class="media-slider__track"><media-slider-fill class="media-slider__fill"></media-slider-fill></media-slider-track><media-slider-thumb class="media-slider__thumb media-slider__thumb--persistent"></media-slider-thumb></media-volume-slider></media-popover><media-captions-button commandfor="captions-tooltip" class="media-button media-button--icon media-button--captions"> ${renderIcon("captions-off", { class: "media-icon media-icon--captions-off" })} ${renderIcon("captions-on", { class: "media-icon media-icon--captions-on" })} </media-captions-button><media-tooltip id="captions-tooltip" side="top" class="media-tooltip"> Toggle captions </media-tooltip><media-pip-button commandfor="pip-tooltip" class="media-button media-button--icon"> ${renderIcon("pip", { class: "media-icon" })} </media-pip-button><media-tooltip id="pip-tooltip" side="top" class="media-tooltip"><span class="media-tooltip-label media-tooltip-label--enter-pip">Enter picture-in-picture</span><span class="media-tooltip-label media-tooltip-label--exit-pip">Exit picture-in-picture</span></media-tooltip><media-fullscreen-button commandfor="fullscreen-tooltip" class="media-button media-button--icon media-button--fullscreen"> ${renderIcon("fullscreen-enter", { class: "media-icon media-icon--fullscreen-enter" })} ${renderIcon("fullscreen-exit", { class: "media-icon media-icon--fullscreen-exit" })} </media-fullscreen-button><media-tooltip id="fullscreen-tooltip" side="top" class="media-tooltip"><span class="media-tooltip-label media-tooltip-label--enter-fullscreen">Enter fullscreen</span><span class="media-tooltip-label media-tooltip-label--exit-fullscreen">Exit fullscreen</span></media-tooltip></div></media-tooltip-group></media-controls><div class="media-overlay"></div></media-container>`;
24
+ return `<media-container class="media-minimal-skin media-minimal-skin--video"><slot name="media"></slot><media-buffering-indicator class="media-buffering-indicator"> ${renderIcon("spinner", { class: "media-icon" })} </media-buffering-indicator><media-controls class="media-controls"><media-tooltip-group><div class="media-button-group"><media-play-button commandfor="play-tooltip" class="media-button media-button--icon media-button--play"> ${renderIcon("restart", { class: "media-icon media-icon--restart" })} ${renderIcon("play", { class: "media-icon media-icon--play" })} ${renderIcon("pause", { class: "media-icon media-icon--pause" })} </media-play-button><media-tooltip id="play-tooltip" side="top" class="media-tooltip"><span class="media-tooltip-label media-tooltip-label--replay">Replay</span><span class="media-tooltip-label media-tooltip-label--play">Play</span><span class="media-tooltip-label media-tooltip-label--pause">Pause</span></media-tooltip><media-seek-button commandfor="seek-backward-tooltip" seconds="${-SEEK_TIME}" class="media-button media-button--icon media-button--seek"><span class="media-icon__container"> ${renderIcon("seek", { class: "media-icon media-icon--flipped" })} <span class="media-icon__label">${SEEK_TIME}</span></span></media-seek-button><media-tooltip id="seek-backward-tooltip" side="top" class="media-tooltip"> Seek backward ${SEEK_TIME} seconds </media-tooltip><media-seek-button commandfor="seek-forward-tooltip" seconds="${SEEK_TIME}" class="media-button media-button--icon media-button--seek"><span class="media-icon__container"> ${renderIcon("seek", { class: "media-icon" })} <span class="media-icon__label">${SEEK_TIME}</span></span></media-seek-button><media-tooltip id="seek-forward-tooltip" side="top" class="media-tooltip"> Seek forward ${SEEK_TIME} seconds </media-tooltip></div><div class="media-time-controls"><media-time-group class="media-time"><media-time type="current" class="media-time__value media-time__value--current"></media-time><media-time-separator class="media-time__separator"></media-time-separator><media-time type="duration" class="media-time__value media-time__value--duration"></media-time></media-time-group><media-time-slider class="media-slider"><media-slider-track class="media-slider__track"><media-slider-fill class="media-slider__fill"></media-slider-fill><media-slider-buffer class="media-slider__buffer"></media-slider-buffer></media-slider-track><media-slider-thumb class="media-slider__thumb"></media-slider-thumb><div class="media-preview media-slider__preview"><div class="media-preview__thumbnail-wrapper"><media-slider-thumbnail class="media-preview__thumbnail"></media-slider-thumbnail></div><media-slider-value type="pointer" class="media-preview__timestamp"></media-slider-value> ${renderIcon("spinner", { class: "media-preview__spinner media-icon" })} </div></media-time-slider></div><div class="media-button-group"><media-playback-rate-button commandfor="playback-rate-tooltip" class="media-button media-button--icon media-button--playback-rate"></media-playback-rate-button><media-tooltip id="playback-rate-tooltip" side="top" class="media-tooltip"> Toggle playback rate </media-tooltip><media-mute-button commandfor="video-volume-popover" class="media-button media-button--icon media-button--mute"> ${renderIcon("volume-off", { class: "media-icon media-icon--volume-off" })} ${renderIcon("volume-low", { class: "media-icon media-icon--volume-low" })} ${renderIcon("volume-high", { class: "media-icon media-icon--volume-high" })} </media-mute-button><media-popover id="video-volume-popover" open-on-hover delay="200" close-delay="100" side="top" class="media-popover media-popover--volume"><media-volume-slider class="media-slider" orientation="vertical" thumb-alignment="edge"><media-slider-track class="media-slider__track"><media-slider-fill class="media-slider__fill"></media-slider-fill></media-slider-track><media-slider-thumb class="media-slider__thumb media-slider__thumb--persistent"></media-slider-thumb></media-volume-slider></media-popover><media-captions-button commandfor="captions-tooltip" class="media-button media-button--icon media-button--captions"> ${renderIcon("captions-off", { class: "media-icon media-icon--captions-off" })} ${renderIcon("captions-on", { class: "media-icon media-icon--captions-on" })} </media-captions-button><media-tooltip id="captions-tooltip" side="top" class="media-tooltip"> Toggle captions </media-tooltip><media-pip-button commandfor="pip-tooltip" class="media-button media-button--icon"> ${renderIcon("pip", { class: "media-icon" })} </media-pip-button><media-tooltip id="pip-tooltip" side="top" class="media-tooltip"><span class="media-tooltip-label media-tooltip-label--enter-pip">Enter picture-in-picture</span><span class="media-tooltip-label media-tooltip-label--exit-pip">Exit picture-in-picture</span></media-tooltip><media-fullscreen-button commandfor="fullscreen-tooltip" class="media-button media-button--icon media-button--fullscreen"> ${renderIcon("fullscreen-enter", { class: "media-icon media-icon--fullscreen-enter" })} ${renderIcon("fullscreen-exit", { class: "media-icon media-icon--fullscreen-exit" })} </media-fullscreen-button><media-tooltip id="fullscreen-tooltip" side="top" class="media-tooltip"><span class="media-tooltip-label media-tooltip-label--enter-fullscreen">Enter fullscreen</span><span class="media-tooltip-label media-tooltip-label--exit-fullscreen">Exit fullscreen</span></media-tooltip></div></media-tooltip-group></media-controls><div class="media-overlay"></div></media-container>`;
25
25
  }
26
26
  var MinimalVideoSkinElement = class extends SkinMixin(ReactiveElement) {
27
27
  static {