@videojs/react 10.0.0-alpha.4 → 10.0.0-alpha.5

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 (286) hide show
  1. package/dist/default/_virtual/_rolldown/runtime.js +1 -19
  2. package/dist/default/index.js +10 -33
  3. package/dist/default/player/context.js +11 -1
  4. package/dist/default/player/context.js.map +1 -1
  5. package/dist/default/presets/audio/index.js +2 -8
  6. package/dist/default/presets/audio/skin.css +1 -0
  7. package/dist/default/presets/background/index.js +2 -8
  8. package/dist/default/presets/background/skin.css +1 -0
  9. package/dist/default/presets/video/index.js +2 -8
  10. package/dist/default/presets/video/minimal-skin.css +178 -53
  11. package/dist/default/presets/video/minimal-skin.js +63 -90
  12. package/dist/default/presets/video/minimal-skin.js.map +1 -1
  13. package/dist/default/presets/video/minimal-skin.tailwind.js +126 -107
  14. package/dist/default/presets/video/minimal-skin.tailwind.js.map +1 -1
  15. package/dist/default/presets/video/skin.css +179 -54
  16. package/dist/default/presets/video/skin.js +61 -88
  17. package/dist/default/presets/video/skin.js.map +1 -1
  18. package/dist/default/presets/video/skin.tailwind.js +121 -104
  19. package/dist/default/presets/video/skin.tailwind.js.map +1 -1
  20. package/dist/default/skins/dist/default/video/default.tailwind.js +90 -0
  21. package/dist/default/skins/dist/default/video/default.tailwind.js.map +1 -0
  22. package/dist/default/skins/dist/default/video/minimal.tailwind.js +86 -0
  23. package/dist/default/skins/dist/default/video/minimal.tailwind.js.map +1 -0
  24. package/dist/default/ui/captions-button/captions-button.js +1 -16
  25. package/dist/default/ui/captions-button/captions-button.js.map +1 -1
  26. package/dist/default/ui/controls/context.js +16 -0
  27. package/dist/default/ui/controls/context.js.map +1 -0
  28. package/dist/default/ui/controls/controls-group.js +4 -1
  29. package/dist/default/ui/controls/controls-group.js.map +1 -1
  30. package/dist/default/ui/controls/controls-root.js +19 -10
  31. package/dist/default/ui/controls/controls-root.js.map +1 -1
  32. package/dist/default/ui/create-context-part.js +29 -0
  33. package/dist/default/ui/create-context-part.js.map +1 -0
  34. package/dist/default/ui/create-media-button.js +52 -0
  35. package/dist/default/ui/create-media-button.js.map +1 -0
  36. package/dist/default/ui/fullscreen-button/fullscreen-button.js +8 -33
  37. package/dist/default/ui/fullscreen-button/fullscreen-button.js.map +1 -1
  38. package/dist/default/ui/hooks/use-slider.js +75 -0
  39. package/dist/default/ui/hooks/use-slider.js.map +1 -0
  40. package/dist/default/ui/mute-button/mute-button.js +8 -36
  41. package/dist/default/ui/mute-button/mute-button.js.map +1 -1
  42. package/dist/default/ui/pip-button/pip-button.js +8 -33
  43. package/dist/default/ui/pip-button/pip-button.js.map +1 -1
  44. package/dist/default/ui/play-button/play-button.js +7 -33
  45. package/dist/default/ui/play-button/play-button.js.map +1 -1
  46. package/dist/default/ui/playback-rate-button/index.js +3 -0
  47. package/dist/default/ui/playback-rate-button/playback-rate-button.js +34 -0
  48. package/dist/default/ui/playback-rate-button/playback-rate-button.js.map +1 -0
  49. package/dist/default/ui/popover/context.js +16 -0
  50. package/dist/default/ui/popover/context.js.map +1 -0
  51. package/dist/default/ui/popover/index.js +4 -0
  52. package/dist/default/ui/popover/index.parts.js +17 -0
  53. package/dist/default/ui/popover/index.parts.js.map +1 -0
  54. package/dist/default/ui/popover/popover-arrow.js +17 -0
  55. package/dist/default/ui/popover/popover-arrow.js.map +1 -0
  56. package/dist/default/ui/popover/popover-popup.js +94 -0
  57. package/dist/default/ui/popover/popover-popup.js.map +1 -0
  58. package/dist/default/ui/popover/popover-root.js +69 -0
  59. package/dist/default/ui/popover/popover-root.js.map +1 -0
  60. package/dist/default/ui/popover/popover-trigger.js +43 -0
  61. package/dist/default/ui/popover/popover-trigger.js.map +1 -0
  62. package/dist/default/ui/poster/poster.js +2 -1
  63. package/dist/default/ui/poster/poster.js.map +1 -1
  64. package/dist/default/ui/seek-button/seek-button.js +7 -34
  65. package/dist/default/ui/seek-button/seek-button.js.map +1 -1
  66. package/dist/default/ui/slider/context.js +22 -0
  67. package/dist/default/ui/slider/context.js.map +1 -0
  68. package/dist/default/ui/slider/index.js +3 -0
  69. package/dist/default/ui/slider/index.parts.js +21 -0
  70. package/dist/default/ui/slider/index.parts.js.map +1 -0
  71. package/dist/default/ui/slider/slider-buffer.js +16 -0
  72. package/dist/default/ui/slider/slider-buffer.js.map +1 -0
  73. package/dist/default/ui/slider/slider-fill.js +16 -0
  74. package/dist/default/ui/slider/slider-fill.js.map +1 -0
  75. package/dist/default/ui/slider/slider-root.js +71 -0
  76. package/dist/default/ui/slider/slider-root.js.map +1 -0
  77. package/dist/default/ui/slider/slider-thumb.js +32 -0
  78. package/dist/default/ui/slider/slider-thumb.js.map +1 -0
  79. package/dist/default/ui/slider/slider-track.js +16 -0
  80. package/dist/default/ui/slider/slider-track.js.map +1 -0
  81. package/dist/default/ui/slider/slider-value.js +32 -0
  82. package/dist/default/ui/slider/slider-value.js.map +1 -0
  83. package/dist/default/ui/thumbnail/thumbnail.js +87 -0
  84. package/dist/default/ui/thumbnail/thumbnail.js.map +1 -0
  85. package/dist/default/ui/time/time-value.js +2 -1
  86. package/dist/default/ui/time/time-value.js.map +1 -1
  87. package/dist/default/ui/time-slider/index.js +3 -0
  88. package/dist/default/ui/time-slider/index.parts.js +21 -0
  89. package/dist/default/ui/time-slider/index.parts.js.map +1 -0
  90. package/dist/default/ui/time-slider/time-slider-root.js +96 -0
  91. package/dist/default/ui/time-slider/time-slider-root.js.map +1 -0
  92. package/dist/default/ui/volume-slider/index.js +3 -0
  93. package/dist/default/ui/volume-slider/index.parts.js +19 -0
  94. package/dist/default/ui/volume-slider/index.parts.js.map +1 -0
  95. package/dist/default/ui/volume-slider/volume-slider-root.js +86 -0
  96. package/dist/default/ui/volume-slider/volume-slider-root.js.map +1 -0
  97. package/dist/default/utils/use-force-render.js +13 -0
  98. package/dist/default/utils/use-force-render.js.map +1 -0
  99. package/dist/default/utils/use-latest-ref.js +20 -0
  100. package/dist/default/utils/use-latest-ref.js.map +1 -0
  101. package/dist/default/utils/use-safe-id.js +22 -0
  102. package/dist/default/utils/use-safe-id.js.map +1 -0
  103. package/dist/dev/_virtual/_rolldown/runtime.js +1 -19
  104. package/dist/dev/index.d.ts +20 -2
  105. package/dist/dev/index.js +10 -33
  106. package/dist/dev/player/context.d.ts.map +1 -1
  107. package/dist/dev/player/context.js +11 -1
  108. package/dist/dev/player/context.js.map +1 -1
  109. package/dist/dev/presets/audio/index.d.ts +2 -9
  110. package/dist/dev/presets/audio/index.js +2 -8
  111. package/dist/dev/presets/audio/skin.css +1 -0
  112. package/dist/dev/presets/background/index.d.ts +2 -9
  113. package/dist/dev/presets/background/index.js +2 -8
  114. package/dist/dev/presets/background/skin.css +1 -0
  115. package/dist/dev/presets/video/index.d.ts +2 -9
  116. package/dist/dev/presets/video/index.js +2 -8
  117. package/dist/dev/presets/video/minimal-skin.css +178 -53
  118. package/dist/dev/presets/video/minimal-skin.d.ts.map +1 -1
  119. package/dist/dev/presets/video/minimal-skin.js +61 -88
  120. package/dist/dev/presets/video/minimal-skin.js.map +1 -1
  121. package/dist/dev/presets/video/minimal-skin.tailwind.d.ts.map +1 -1
  122. package/dist/dev/presets/video/minimal-skin.tailwind.js +124 -105
  123. package/dist/dev/presets/video/minimal-skin.tailwind.js.map +1 -1
  124. package/dist/dev/presets/video/skin.css +179 -54
  125. package/dist/dev/presets/video/skin.d.ts.map +1 -1
  126. package/dist/dev/presets/video/skin.js +61 -88
  127. package/dist/dev/presets/video/skin.js.map +1 -1
  128. package/dist/dev/presets/video/skin.tailwind.d.ts.map +1 -1
  129. package/dist/dev/presets/video/skin.tailwind.js +121 -104
  130. package/dist/dev/presets/video/skin.tailwind.js.map +1 -1
  131. package/dist/dev/skins/dist/default/video/default.tailwind.js +90 -0
  132. package/dist/dev/skins/dist/default/video/default.tailwind.js.map +1 -0
  133. package/dist/dev/skins/dist/default/video/minimal.tailwind.js +86 -0
  134. package/dist/dev/skins/dist/default/video/minimal.tailwind.js.map +1 -0
  135. package/dist/dev/ui/captions-button/captions-button.d.ts.map +1 -1
  136. package/dist/dev/ui/captions-button/captions-button.js +1 -16
  137. package/dist/dev/ui/captions-button/captions-button.js.map +1 -1
  138. package/dist/dev/ui/controls/context.js +16 -0
  139. package/dist/dev/ui/controls/context.js.map +1 -0
  140. package/dist/dev/ui/controls/controls-group.d.ts +2 -2
  141. package/dist/dev/ui/controls/controls-group.d.ts.map +1 -1
  142. package/dist/dev/ui/controls/controls-group.js +4 -1
  143. package/dist/dev/ui/controls/controls-group.js.map +1 -1
  144. package/dist/dev/ui/controls/controls-root.d.ts.map +1 -1
  145. package/dist/dev/ui/controls/controls-root.js +19 -10
  146. package/dist/dev/ui/controls/controls-root.js.map +1 -1
  147. package/dist/dev/ui/create-context-part.js +29 -0
  148. package/dist/dev/ui/create-context-part.js.map +1 -0
  149. package/dist/dev/ui/create-media-button.js +55 -0
  150. package/dist/dev/ui/create-media-button.js.map +1 -0
  151. package/dist/dev/ui/fullscreen-button/fullscreen-button.d.ts +2 -1
  152. package/dist/dev/ui/fullscreen-button/fullscreen-button.d.ts.map +1 -1
  153. package/dist/dev/ui/fullscreen-button/fullscreen-button.js +9 -37
  154. package/dist/dev/ui/fullscreen-button/fullscreen-button.js.map +1 -1
  155. package/dist/dev/ui/hooks/use-slider.d.ts +36 -0
  156. package/dist/dev/ui/hooks/use-slider.d.ts.map +1 -0
  157. package/dist/dev/ui/hooks/use-slider.js +75 -0
  158. package/dist/dev/ui/hooks/use-slider.js.map +1 -0
  159. package/dist/dev/ui/mute-button/mute-button.d.ts +2 -4
  160. package/dist/dev/ui/mute-button/mute-button.d.ts.map +1 -1
  161. package/dist/dev/ui/mute-button/mute-button.js +9 -40
  162. package/dist/dev/ui/mute-button/mute-button.js.map +1 -1
  163. package/dist/dev/ui/pip-button/pip-button.d.ts +2 -1
  164. package/dist/dev/ui/pip-button/pip-button.d.ts.map +1 -1
  165. package/dist/dev/ui/pip-button/pip-button.js +9 -37
  166. package/dist/dev/ui/pip-button/pip-button.js.map +1 -1
  167. package/dist/dev/ui/play-button/play-button.d.ts +1 -1
  168. package/dist/dev/ui/play-button/play-button.d.ts.map +1 -1
  169. package/dist/dev/ui/play-button/play-button.js +8 -37
  170. package/dist/dev/ui/play-button/play-button.js.map +1 -1
  171. package/dist/dev/ui/playback-rate-button/index.d.ts +2 -0
  172. package/dist/dev/ui/playback-rate-button/index.js +3 -0
  173. package/dist/dev/ui/playback-rate-button/playback-rate-button.d.ts +30 -0
  174. package/dist/dev/ui/playback-rate-button/playback-rate-button.d.ts.map +1 -0
  175. package/dist/dev/ui/playback-rate-button/playback-rate-button.js +34 -0
  176. package/dist/dev/ui/playback-rate-button/playback-rate-button.js.map +1 -0
  177. package/dist/dev/ui/popover/context.d.ts +17 -0
  178. package/dist/dev/ui/popover/context.d.ts.map +1 -0
  179. package/dist/dev/ui/popover/context.js +16 -0
  180. package/dist/dev/ui/popover/context.js.map +1 -0
  181. package/dist/dev/ui/popover/index.d.ts +3 -0
  182. package/dist/dev/ui/popover/index.js +4 -0
  183. package/dist/dev/ui/popover/index.parts.d.ts +12 -0
  184. package/dist/dev/ui/popover/index.parts.d.ts.map +1 -0
  185. package/dist/dev/ui/popover/index.parts.js +17 -0
  186. package/dist/dev/ui/popover/index.parts.js.map +1 -0
  187. package/dist/dev/ui/popover/popover-arrow.d.ts +15 -0
  188. package/dist/dev/ui/popover/popover-arrow.d.ts.map +1 -0
  189. package/dist/dev/ui/popover/popover-arrow.js +17 -0
  190. package/dist/dev/ui/popover/popover-arrow.js.map +1 -0
  191. package/dist/dev/ui/popover/popover-popup.d.ts +15 -0
  192. package/dist/dev/ui/popover/popover-popup.d.ts.map +1 -0
  193. package/dist/dev/ui/popover/popover-popup.js +94 -0
  194. package/dist/dev/ui/popover/popover-popup.js.map +1 -0
  195. package/dist/dev/ui/popover/popover-root.d.ts +29 -0
  196. package/dist/dev/ui/popover/popover-root.d.ts.map +1 -0
  197. package/dist/dev/ui/popover/popover-root.js +69 -0
  198. package/dist/dev/ui/popover/popover-root.js.map +1 -0
  199. package/dist/dev/ui/popover/popover-trigger.d.ts +15 -0
  200. package/dist/dev/ui/popover/popover-trigger.d.ts.map +1 -0
  201. package/dist/dev/ui/popover/popover-trigger.js +43 -0
  202. package/dist/dev/ui/popover/popover-trigger.js.map +1 -0
  203. package/dist/dev/ui/poster/poster.d.ts.map +1 -1
  204. package/dist/dev/ui/poster/poster.js +2 -1
  205. package/dist/dev/ui/poster/poster.js.map +1 -1
  206. package/dist/dev/ui/seek-button/seek-button.d.ts +1 -1
  207. package/dist/dev/ui/seek-button/seek-button.d.ts.map +1 -1
  208. package/dist/dev/ui/seek-button/seek-button.js +8 -38
  209. package/dist/dev/ui/seek-button/seek-button.js.map +1 -1
  210. package/dist/dev/ui/slider/context.js +22 -0
  211. package/dist/dev/ui/slider/context.js.map +1 -0
  212. package/dist/dev/ui/slider/index.d.ts +2 -0
  213. package/dist/dev/ui/slider/index.js +3 -0
  214. package/dist/dev/ui/slider/index.parts.d.ts +14 -0
  215. package/dist/dev/ui/slider/index.parts.d.ts.map +1 -0
  216. package/dist/dev/ui/slider/index.parts.js +21 -0
  217. package/dist/dev/ui/slider/index.parts.js.map +1 -0
  218. package/dist/dev/ui/slider/slider-buffer.d.ts +14 -0
  219. package/dist/dev/ui/slider/slider-buffer.d.ts.map +1 -0
  220. package/dist/dev/ui/slider/slider-buffer.js +16 -0
  221. package/dist/dev/ui/slider/slider-buffer.js.map +1 -0
  222. package/dist/dev/ui/slider/slider-fill.d.ts +14 -0
  223. package/dist/dev/ui/slider/slider-fill.d.ts.map +1 -0
  224. package/dist/dev/ui/slider/slider-fill.js +16 -0
  225. package/dist/dev/ui/slider/slider-fill.js.map +1 -0
  226. package/dist/dev/ui/slider/slider-root.d.ts +19 -0
  227. package/dist/dev/ui/slider/slider-root.d.ts.map +1 -0
  228. package/dist/dev/ui/slider/slider-root.js +71 -0
  229. package/dist/dev/ui/slider/slider-root.js.map +1 -0
  230. package/dist/dev/ui/slider/slider-thumb.d.ts +14 -0
  231. package/dist/dev/ui/slider/slider-thumb.d.ts.map +1 -0
  232. package/dist/dev/ui/slider/slider-thumb.js +32 -0
  233. package/dist/dev/ui/slider/slider-thumb.js.map +1 -0
  234. package/dist/dev/ui/slider/slider-track.d.ts +14 -0
  235. package/dist/dev/ui/slider/slider-track.d.ts.map +1 -0
  236. package/dist/dev/ui/slider/slider-track.js +16 -0
  237. package/dist/dev/ui/slider/slider-track.js.map +1 -0
  238. package/dist/dev/ui/slider/slider-value.d.ts +19 -0
  239. package/dist/dev/ui/slider/slider-value.d.ts.map +1 -0
  240. package/dist/dev/ui/slider/slider-value.js +32 -0
  241. package/dist/dev/ui/slider/slider-value.js.map +1 -0
  242. package/dist/dev/ui/thumbnail/thumbnail.d.ts +17 -0
  243. package/dist/dev/ui/thumbnail/thumbnail.d.ts.map +1 -0
  244. package/dist/dev/ui/thumbnail/thumbnail.js +87 -0
  245. package/dist/dev/ui/thumbnail/thumbnail.js.map +1 -0
  246. package/dist/dev/ui/time/time-value.d.ts.map +1 -1
  247. package/dist/dev/ui/time/time-value.js +2 -1
  248. package/dist/dev/ui/time/time-value.js.map +1 -1
  249. package/dist/dev/ui/time-slider/index.d.ts +2 -0
  250. package/dist/dev/ui/time-slider/index.js +3 -0
  251. package/dist/dev/ui/time-slider/index.parts.d.ts +15 -0
  252. package/dist/dev/ui/time-slider/index.parts.d.ts.map +1 -0
  253. package/dist/dev/ui/time-slider/index.parts.js +21 -0
  254. package/dist/dev/ui/time-slider/index.parts.js.map +1 -0
  255. package/dist/dev/ui/time-slider/time-slider-root.d.ts +17 -0
  256. package/dist/dev/ui/time-slider/time-slider-root.d.ts.map +1 -0
  257. package/dist/dev/ui/time-slider/time-slider-root.js +99 -0
  258. package/dist/dev/ui/time-slider/time-slider-root.js.map +1 -0
  259. package/dist/dev/ui/volume-slider/index.d.ts +2 -0
  260. package/dist/dev/ui/volume-slider/index.js +3 -0
  261. package/dist/dev/ui/volume-slider/index.parts.d.ts +14 -0
  262. package/dist/dev/ui/volume-slider/index.parts.d.ts.map +1 -0
  263. package/dist/dev/ui/volume-slider/index.parts.js +19 -0
  264. package/dist/dev/ui/volume-slider/index.parts.js.map +1 -0
  265. package/dist/dev/ui/volume-slider/volume-slider-root.d.ts +17 -0
  266. package/dist/dev/ui/volume-slider/volume-slider-root.d.ts.map +1 -0
  267. package/dist/dev/ui/volume-slider/volume-slider-root.js +89 -0
  268. package/dist/dev/ui/volume-slider/volume-slider-root.js.map +1 -0
  269. package/dist/dev/utils/use-force-render.js +13 -0
  270. package/dist/dev/utils/use-force-render.js.map +1 -0
  271. package/dist/dev/utils/use-latest-ref.js +20 -0
  272. package/dist/dev/utils/use-latest-ref.js.map +1 -0
  273. package/dist/dev/utils/use-safe-id.js +22 -0
  274. package/dist/dev/utils/use-safe-id.js.map +1 -0
  275. package/package.json +6 -5
  276. package/dist/default/index.js.map +0 -1
  277. package/dist/default/presets/audio/index.js.map +0 -1
  278. package/dist/default/presets/background/index.js.map +0 -1
  279. package/dist/default/presets/video/index.js.map +0 -1
  280. package/dist/dev/index.js.map +0 -1
  281. package/dist/dev/presets/audio/index.d.ts.map +0 -1
  282. package/dist/dev/presets/audio/index.js.map +0 -1
  283. package/dist/dev/presets/background/index.d.ts.map +0 -1
  284. package/dist/dev/presets/background/index.js.map +0 -1
  285. package/dist/dev/presets/video/index.d.ts.map +0 -1
  286. package/dist/dev/presets/video/index.js.map +0 -1
@@ -1,8 +1,5 @@
1
1
  //#region \0rolldown/runtime.js
2
2
  var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
3
  var __exportAll = (all, no_symbols) => {
7
4
  let target = {};
8
5
  for (var name in all) {
@@ -16,21 +13,6 @@ var __exportAll = (all, no_symbols) => {
16
13
  }
17
14
  return target;
18
15
  };
19
- var __copyProps = (to, from, except, desc) => {
20
- if (from && typeof from === "object" || typeof from === "function") {
21
- for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
22
- key = keys[i];
23
- if (!__hasOwnProp.call(to, key) && key !== except) {
24
- __defProp(to, key, {
25
- get: ((k) => from[k]).bind(null, key),
26
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
27
- });
28
- }
29
- }
30
- }
31
- return to;
32
- };
33
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
34
16
 
35
17
  //#endregion
36
- export { __exportAll, __reExport };
18
+ export { __exportAll };
@@ -1,6 +1,5 @@
1
1
  'use client';
2
2
 
3
- import { __exportAll, __reExport } from "./_virtual/_rolldown/runtime.js";
4
3
  import { Container, useMedia, useMediaRegistration, usePlayer, usePlayerContext } from "./player/context.js";
5
4
  import { createPlayer } from "./player/create-player.js";
6
5
  import { mergeProps } from "./utils/merge-props.js";
@@ -9,45 +8,23 @@ import { BufferingIndicator } from "./ui/buffering-indicator/buffering-indicator
9
8
  import { index_parts_exports } from "./ui/controls/index.parts.js";
10
9
  import { useButton } from "./ui/hooks/use-button.js";
11
10
  import { FullscreenButton } from "./ui/fullscreen-button/fullscreen-button.js";
11
+ import { useSlider } from "./ui/hooks/use-slider.js";
12
12
  import { MuteButton } from "./ui/mute-button/mute-button.js";
13
13
  import { PiPButton } from "./ui/pip-button/pip-button.js";
14
14
  import { PlayButton } from "./ui/play-button/play-button.js";
15
+ import { PlaybackRateButton } from "./ui/playback-rate-button/playback-rate-button.js";
16
+ import { usePopoverContext } from "./ui/popover/context.js";
17
+ import { index_parts_exports as index_parts_exports$1 } from "./ui/popover/index.parts.js";
15
18
  import { Poster } from "./ui/poster/poster.js";
16
19
  import { SeekButton } from "./ui/seek-button/seek-button.js";
17
- import { index_parts_exports as index_parts_exports$1 } from "./ui/time/index.parts.js";
20
+ import { index_parts_exports as index_parts_exports$2 } from "./ui/slider/index.parts.js";
21
+ import { Thumbnail } from "./ui/thumbnail/thumbnail.js";
22
+ import { index_parts_exports as index_parts_exports$3 } from "./ui/time/index.parts.js";
23
+ import { index_parts_exports as index_parts_exports$4 } from "./ui/time-slider/index.parts.js";
24
+ import { index_parts_exports as index_parts_exports$5 } from "./ui/volume-slider/index.parts.js";
18
25
  import { createSelector, shallowEqual } from "@videojs/store";
19
26
  import { useSelector, useStore } from "@videojs/store/react";
20
27
 
21
28
  export * from "@videojs/core/dom"
22
29
 
23
- //#region src/index.ts
24
- var src_exports = /* @__PURE__ */ __exportAll({
25
- BufferingIndicator: () => BufferingIndicator,
26
- Container: () => Container,
27
- Controls: () => index_parts_exports,
28
- FullscreenButton: () => FullscreenButton,
29
- MuteButton: () => MuteButton,
30
- PiPButton: () => PiPButton,
31
- PlayButton: () => PlayButton,
32
- Poster: () => Poster,
33
- SeekButton: () => SeekButton,
34
- Time: () => index_parts_exports$1,
35
- createPlayer: () => createPlayer,
36
- createSelector: () => createSelector,
37
- mergeProps: () => mergeProps,
38
- renderElement: () => renderElement,
39
- shallowEqual: () => shallowEqual,
40
- useButton: () => useButton,
41
- useMedia: () => useMedia,
42
- useMediaRegistration: () => useMediaRegistration,
43
- usePlayer: () => usePlayer,
44
- usePlayerContext: () => usePlayerContext,
45
- useSelector: () => useSelector,
46
- useStore: () => useStore
47
- });
48
- import * as import__videojs_core_dom from "@videojs/core/dom";
49
- __reExport(src_exports, import__videojs_core_dom);
50
-
51
- //#endregion
52
- export { BufferingIndicator, Container, index_parts_exports as Controls, FullscreenButton, MuteButton, PiPButton, PlayButton, Poster, SeekButton, index_parts_exports$1 as Time, createPlayer, createSelector, mergeProps, renderElement, shallowEqual, src_exports, useButton, useMedia, useMediaRegistration, usePlayer, usePlayerContext, useSelector, useStore };
53
- //# sourceMappingURL=index.js.map
30
+ export { BufferingIndicator, Container, index_parts_exports as Controls, FullscreenButton, MuteButton, PiPButton, PlayButton, PlaybackRateButton, index_parts_exports$1 as Popover, Poster, SeekButton, index_parts_exports$2 as Slider, Thumbnail, index_parts_exports$3 as Time, index_parts_exports$4 as TimeSlider, index_parts_exports$5 as VolumeSlider, createPlayer, createSelector, mergeProps, renderElement, shallowEqual, useButton, useMedia, useMediaRegistration, usePlayer, usePlayerContext, usePopoverContext, useSelector, useSlider, useStore };
@@ -7,6 +7,11 @@ import { jsx } from "react/jsx-runtime";
7
7
 
8
8
  //#region src/player/context.tsx
9
9
  const PlayerContext = createContext(null);
10
+ const EMPTY_UNSUBSCRIBE = () => {};
11
+ const EMPTY_STORE = {
12
+ state: {},
13
+ subscribe: () => EMPTY_UNSUBSCRIBE
14
+ };
10
15
  function PlayerContextProvider({ value, children }) {
11
16
  return /* @__PURE__ */ jsx(PlayerContext.Provider, {
12
17
  value,
@@ -23,6 +28,11 @@ function usePlayer(selector) {
23
28
  const { store } = usePlayerContext();
24
29
  return useStore(store, selector);
25
30
  }
31
+ function useOptionalPlayer(selector) {
32
+ const ctx = useContext(PlayerContext);
33
+ const value = useStore(ctx?.store ?? EMPTY_STORE, ctx ? selector : void 0);
34
+ return ctx ? value : void 0;
35
+ }
26
36
  /** Access the media element from within a Player Provider. */
27
37
  function useMedia() {
28
38
  const { media } = usePlayerContext();
@@ -51,5 +61,5 @@ const Container = forwardRef(function Container({ children, ...props }, ref) {
51
61
  });
52
62
 
53
63
  //#endregion
54
- export { Container, PlayerContextProvider, useMedia, useMediaRegistration, usePlayer, usePlayerContext };
64
+ export { Container, PlayerContextProvider, useMedia, useMediaRegistration, useOptionalPlayer, usePlayer, usePlayerContext };
55
65
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../../src/player/context.tsx"],"sourcesContent":["'use client';\n\nimport type { Media } from '@videojs/core/dom';\nimport type { UnknownState, UnknownStore } from '@videojs/store';\nimport { useStore } from '@videojs/store/react';\nimport type { Dispatch, HTMLAttributes, ReactNode, SetStateAction } from 'react';\nimport { createContext, forwardRef, useContext, useEffect, useRef } from 'react';\n\nimport { useComposedRefs } from '../utils/use-composed-refs';\n\nexport interface PlayerContextValue {\n store: UnknownStore;\n media: Media | null;\n setMedia: Dispatch<SetStateAction<Media | null>>;\n}\n\nconst PlayerContext = createContext<PlayerContextValue | null>(null);\n\nexport function PlayerContextProvider({\n value,\n children,\n}: {\n value: PlayerContextValue;\n children: ReactNode;\n}): ReactNode {\n return <PlayerContext.Provider value={value}>{children}</PlayerContext.Provider>;\n}\n\n/** Access the full player context value. Throws if used outside a Player Provider. */\nexport function usePlayerContext(): PlayerContextValue {\n const ctx = useContext(PlayerContext);\n if (!ctx) throw new Error('usePlayerContext must be used within a Player Provider');\n return ctx;\n}\n\n/**\n * Access the player store from within a Player Provider.\n *\n * @label Without Selector\n */\nexport function usePlayer(): UnknownStore;\n/**\n * Select a value from the player store. Re-renders when the selected value changes.\n *\n * @label With Selector\n * @param selector - Derives a value from the player store state.\n */\nexport function usePlayer<R>(selector: (state: UnknownState) => R): R;\nexport function usePlayer<R>(selector?: (state: UnknownState) => R) {\n const { store } = usePlayerContext();\n return useStore(store, selector as any);\n}\n\n/** Access the media element from within a Player Provider. */\nexport function useMedia(): Media | null {\n const { media } = usePlayerContext();\n return media;\n}\n\n/** Access the media registration setter for connecting a media element to the player. */\nexport function useMediaRegistration(): Dispatch<SetStateAction<Media | null>> | undefined {\n const ctx = useContext(PlayerContext);\n return ctx?.setMedia;\n}\n\nexport interface ContainerProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n}\n\nexport const Container = forwardRef<HTMLDivElement, ContainerProps>(function Container({ children, ...props }, ref) {\n const { store, media } = usePlayerContext();\n const internalRef = useRef<HTMLDivElement>(null);\n const composedRef = useComposedRefs(ref, internalRef);\n\n useEffect(() => {\n if (!media) return;\n return store.attach({ media, container: internalRef.current });\n }, [media, store]);\n\n return (\n <div ref={composedRef} {...props}>\n {children}\n </div>\n );\n});\n\nexport namespace Container {\n export type Props = ContainerProps;\n}\n"],"mappings":";;;;;;;;AAgBA,MAAM,gBAAgB,cAAyC,KAAK;AAEpE,SAAgB,sBAAsB,EACpC,OACA,YAIY;AACZ,QAAO,oBAAC,cAAc;EAAgB;EAAQ;GAAkC;;;AAIlF,SAAgB,mBAAuC;CACrD,MAAM,MAAM,WAAW,cAAc;AACrC,KAAI,CAAC,IAAK,OAAM,IAAI,MAAM,yDAAyD;AACnF,QAAO;;AAgBT,SAAgB,UAAa,UAAuC;CAClE,MAAM,EAAE,UAAU,kBAAkB;AACpC,QAAO,SAAS,OAAO,SAAgB;;;AAIzC,SAAgB,WAAyB;CACvC,MAAM,EAAE,UAAU,kBAAkB;AACpC,QAAO;;;AAIT,SAAgB,uBAA2E;AAEzF,QADY,WAAW,cAAc,EACzB;;AAOd,MAAa,YAAY,WAA2C,SAAS,UAAU,EAAE,UAAU,GAAG,SAAS,KAAK;CAClH,MAAM,EAAE,OAAO,UAAU,kBAAkB;CAC3C,MAAM,cAAc,OAAuB,KAAK;CAChD,MAAM,cAAc,gBAAgB,KAAK,YAAY;AAErD,iBAAgB;AACd,MAAI,CAAC,MAAO;AACZ,SAAO,MAAM,OAAO;GAAE;GAAO,WAAW,YAAY;GAAS,CAAC;IAC7D,CAAC,OAAO,MAAM,CAAC;AAElB,QACE,oBAAC;EAAI,KAAK;EAAa,GAAI;EACxB;GACG;EAER"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../src/player/context.tsx"],"sourcesContent":["'use client';\n\nimport type { Media } from '@videojs/core/dom';\nimport type { UnknownState, UnknownStore } from '@videojs/store';\nimport { useStore } from '@videojs/store/react';\nimport type { Dispatch, HTMLAttributes, ReactNode, SetStateAction } from 'react';\nimport { createContext, forwardRef, useContext, useEffect, useRef } from 'react';\n\nimport { useComposedRefs } from '../utils/use-composed-refs';\n\nexport interface PlayerContextValue {\n store: UnknownStore;\n media: Media | null;\n setMedia: Dispatch<SetStateAction<Media | null>>;\n}\n\nconst PlayerContext = createContext<PlayerContextValue | null>(null);\nconst EMPTY_UNSUBSCRIBE = () => {};\nconst EMPTY_STORE = {\n state: {} as UnknownState,\n subscribe: () => EMPTY_UNSUBSCRIBE,\n} as Pick<UnknownStore, 'state' | 'subscribe'>;\n\nexport function PlayerContextProvider({\n value,\n children,\n}: {\n value: PlayerContextValue;\n children: ReactNode;\n}): ReactNode {\n return <PlayerContext.Provider value={value}>{children}</PlayerContext.Provider>;\n}\n\n/** Access the full player context value. Throws if used outside a Player Provider. */\nexport function usePlayerContext(): PlayerContextValue {\n const ctx = useContext(PlayerContext);\n if (!ctx) throw new Error('usePlayerContext must be used within a Player Provider');\n return ctx;\n}\n\n/**\n * Access the player store from within a Player Provider.\n *\n * @label Without Selector\n */\nexport function usePlayer(): UnknownStore;\n/**\n * Select a value from the player store. Re-renders when the selected value changes.\n *\n * @label With Selector\n * @param selector - Derives a value from the player store state.\n */\nexport function usePlayer<R>(selector: (state: UnknownState) => R): R;\nexport function usePlayer<R>(selector?: (state: UnknownState) => R) {\n const { store } = usePlayerContext();\n return useStore(store, selector as any);\n}\n\n/**\n * Access player state when available, but return `undefined` outside Provider.\n *\n * This is useful for components that can operate without player context\n * (e.g. they accept fully explicit props as a fallback).\n */\n/** @label Without Selector */\nexport function useOptionalPlayer(): UnknownStore | undefined;\n/** @label With Selector */\nexport function useOptionalPlayer<R>(selector: (state: UnknownState) => R): R | undefined;\nexport function useOptionalPlayer<R>(selector?: (state: UnknownState) => R) {\n const ctx = useContext(PlayerContext);\n const store = (ctx?.store ?? (EMPTY_STORE as unknown as UnknownStore)) as UnknownStore;\n const value = useStore(store, (ctx ? selector : undefined) as any);\n return ctx ? value : undefined;\n}\n\n/** Access the media element from within a Player Provider. */\nexport function useMedia(): Media | null {\n const { media } = usePlayerContext();\n return media;\n}\n\n/** Access the media registration setter for connecting a media element to the player. */\nexport function useMediaRegistration(): Dispatch<SetStateAction<Media | null>> | undefined {\n const ctx = useContext(PlayerContext);\n return ctx?.setMedia;\n}\n\nexport interface ContainerProps extends HTMLAttributes<HTMLDivElement> {\n children?: ReactNode;\n}\n\nexport const Container = forwardRef<HTMLDivElement, ContainerProps>(function Container({ children, ...props }, ref) {\n const { store, media } = usePlayerContext();\n const internalRef = useRef<HTMLDivElement>(null);\n const composedRef = useComposedRefs(ref, internalRef);\n\n useEffect(() => {\n if (!media) return;\n return store.attach({ media, container: internalRef.current });\n }, [media, store]);\n\n return (\n <div ref={composedRef} {...props}>\n {children}\n </div>\n );\n});\n\nexport namespace Container {\n export type Props = ContainerProps;\n}\n"],"mappings":";;;;;;;;AAgBA,MAAM,gBAAgB,cAAyC,KAAK;AACpE,MAAM,0BAA0B;AAChC,MAAM,cAAc;CAClB,OAAO,EAAE;CACT,iBAAiB;CAClB;AAED,SAAgB,sBAAsB,EACpC,OACA,YAIY;AACZ,QAAO,oBAAC,cAAc;EAAgB;EAAQ;GAAkC;;;AAIlF,SAAgB,mBAAuC;CACrD,MAAM,MAAM,WAAW,cAAc;AACrC,KAAI,CAAC,IAAK,OAAM,IAAI,MAAM,yDAAyD;AACnF,QAAO;;AAgBT,SAAgB,UAAa,UAAuC;CAClE,MAAM,EAAE,UAAU,kBAAkB;AACpC,QAAO,SAAS,OAAO,SAAgB;;AAazC,SAAgB,kBAAqB,UAAuC;CAC1E,MAAM,MAAM,WAAW,cAAc;CAErC,MAAM,QAAQ,SADC,KAAK,SAAU,aACC,MAAM,WAAW,OAAkB;AAClE,QAAO,MAAM,QAAQ;;;AAIvB,SAAgB,WAAyB;CACvC,MAAM,EAAE,UAAU,kBAAkB;AACpC,QAAO;;;AAIT,SAAgB,uBAA2E;AAEzF,QADY,WAAW,cAAc,EACzB;;AAOd,MAAa,YAAY,WAA2C,SAAS,UAAU,EAAE,UAAU,GAAG,SAAS,KAAK;CAClH,MAAM,EAAE,OAAO,UAAU,kBAAkB;CAC3C,MAAM,cAAc,OAAuB,KAAK;CAChD,MAAM,cAAc,gBAAgB,KAAK,YAAY;AAErD,iBAAgB;AACd,MAAI,CAAC,MAAO;AACZ,SAAO,MAAM,OAAO;GAAE;GAAO,WAAW,YAAY;GAAS,CAAC;IAC7D,CAAC,OAAO,MAAM,CAAC;AAElB,QACE,oBAAC;EAAI,KAAK;EAAa,GAAI;EACxB;GACG;EAER"}
@@ -1,12 +1,6 @@
1
- import { createPlayer } from "../../player/create-player.js";
2
- import { src_exports } from "../../index.js";
3
1
  import { Audio } from "../../media/audio.js";
4
2
  import { MinimalAudioSkin } from "./minimal-skin.js";
5
3
  import { AudioSkin } from "./skin.js";
4
+ import { audioFeatures } from "@videojs/core/dom";
6
5
 
7
- //#region src/presets/audio/index.ts
8
- const { Provider: AudioProvider } = createPlayer({ features: src_exports.features.audio });
9
-
10
- //#endregion
11
- export { Audio, AudioProvider, AudioSkin, MinimalAudioSkin };
12
- //# sourceMappingURL=index.js.map
6
+ export { Audio, AudioSkin, MinimalAudioSkin, audioFeatures };
@@ -1,3 +1,4 @@
1
1
  .media-skin {
2
2
  color: var(--media-color, red);
3
3
  }
4
+
@@ -1,11 +1,5 @@
1
- import { createPlayer } from "../../player/create-player.js";
2
- import { src_exports } from "../../index.js";
3
1
  import { BackgroundVideo } from "../../media/background-video/index.js";
4
2
  import { BackgroundVideoSkin } from "./skin.js";
3
+ import { backgroundFeatures } from "@videojs/core/dom";
5
4
 
6
- //#region src/presets/background/index.ts
7
- const { Provider: BackgroundVideoProvider } = createPlayer({ features: src_exports.features.background });
8
-
9
- //#endregion
10
- export { BackgroundVideo, BackgroundVideoProvider, BackgroundVideoSkin };
11
- //# sourceMappingURL=index.js.map
5
+ export { BackgroundVideo, BackgroundVideoSkin, backgroundFeatures };
@@ -19,3 +19,4 @@
19
19
  height: 100%;
20
20
  object-fit: inherit;
21
21
  }
22
+
@@ -1,14 +1,8 @@
1
- import { createPlayer } from "../../player/create-player.js";
2
- import { src_exports } from "../../index.js";
3
1
  import { Video } from "../../media/video.js";
4
2
  import { MinimalVideoSkin } from "./minimal-skin.js";
5
3
  import { MinimalVideoSkinTailwind } from "./minimal-skin.tailwind.js";
6
4
  import { VideoSkin } from "./skin.js";
7
5
  import { VideoSkinTailwind } from "./skin.tailwind.js";
6
+ import { videoFeatures } from "@videojs/core/dom";
8
7
 
9
- //#region src/presets/video/index.ts
10
- const { Provider: VideoProvider } = createPlayer({ features: src_exports.features.video });
11
-
12
- //#endregion
13
- export { MinimalVideoSkin, MinimalVideoSkinTailwind, Video, VideoProvider, VideoSkin, VideoSkinTailwind };
14
- //# sourceMappingURL=index.js.map
8
+ export { MinimalVideoSkin, MinimalVideoSkinTailwind, Video, VideoSkin, VideoSkinTailwind, videoFeatures };
@@ -1,3 +1,54 @@
1
+ /* ==========================================================================
2
+ Icon State Visibility
3
+
4
+ Data-attribute-driven visibility rules for multi-state icon buttons.
5
+ Uses :is() with both element selectors (for HTML custom element wrappers)
6
+ and class selectors (for React rendered SVG elements).
7
+ ========================================================================== */
8
+
9
+ /* --- All icons hidden by default --- */
10
+
11
+ .media-button--play .media-icon--restart,
12
+ .media-button--play .media-icon--play,
13
+ .media-button--play .media-icon--pause,
14
+ .media-button--mute .media-icon--volume-off,
15
+ .media-button--mute .media-icon--volume-low,
16
+ .media-button--mute .media-icon--volume-high,
17
+ .media-button--fullscreen .media-icon--fullscreen-enter,
18
+ .media-button--fullscreen .media-icon--fullscreen-exit,
19
+ .media-button--captions .media-icon--captions-off,
20
+ .media-button--captions .media-icon--captions-on {
21
+ display: none;
22
+ opacity: 0;
23
+ }
24
+
25
+ /* --- Active icon per state --- */
26
+
27
+ /* Play: ended → restart */
28
+ .media-button--play[data-ended] .media-icon--restart,
29
+ /* Play: paused (not ended) → play */
30
+ .media-button--play:not([data-ended])[data-paused] .media-icon--play,
31
+ /* Play: playing (not paused, not ended) → pause */
32
+ .media-button--play:not([data-paused]):not([data-ended]) .media-icon--pause,
33
+ /* Mute: muted → volume off */
34
+ .media-button--mute[data-muted] .media-icon--volume-off,
35
+ /* Mute: volume low (not muted) → volume low */
36
+ .media-button--mute:not([data-muted])[data-volume-level="low"] .media-icon--volume-low,
37
+ /* Mute: volume high (not muted, not low) → volume high */
38
+ .media-button--mute:not([data-muted]):not([data-volume-level="low"]) .media-icon--volume-high,
39
+ /* Fullscreen: not fullscreen → enter */
40
+ .media-button--fullscreen:not([data-fullscreen]) .media-icon--fullscreen-enter,
41
+ /* Fullscreen: fullscreen → exit */
42
+ .media-button--fullscreen[data-fullscreen] .media-icon--fullscreen-exit,
43
+ /* Captions: not active → captions off */
44
+ .media-button--captions:not([data-active]) .media-icon--captions-off,
45
+ /* Captions: active → captions on */
46
+ .media-button--captions[data-active] .media-icon--captions-on {
47
+ display: block;
48
+ opacity: 1;
49
+ }
50
+
51
+
1
52
  /* ==========================================================================
2
53
  Reset
3
54
  ========================================================================== */
@@ -30,6 +81,7 @@
30
81
  .media-minimal-skin {
31
82
  position: relative;
32
83
  isolation: isolate;
84
+ display: block;
33
85
  container: media-root / inline-size;
34
86
  overflow: clip;
35
87
  border-radius: var(--media-border-radius, 0.75rem);
@@ -75,6 +127,7 @@
75
127
  .media-minimal-skin > video {
76
128
  width: 100%;
77
129
  height: 100%;
130
+ border-radius: inherit;
78
131
  }
79
132
 
80
133
  /* ==========================================================================
@@ -86,6 +139,7 @@
86
139
  inset: 0;
87
140
  width: 100%;
88
141
  height: 100%;
142
+ border-radius: inherit;
89
143
  object-fit: cover;
90
144
  transition: opacity 0.25s;
91
145
  pointer-events: none;
@@ -101,6 +155,7 @@
101
155
  .media-minimal-skin .media-overlay {
102
156
  position: absolute;
103
157
  inset: 0;
158
+ z-index: 1;
104
159
  border-radius: inherit;
105
160
  background-image: linear-gradient(to top, oklch(0 0 0 / 0.7), oklch(0 0 0 / 0.5) 7.5rem, oklch(0 0 0 / 0));
106
161
  backdrop-filter: blur(0) saturate(1.2) brightness(0.9);
@@ -134,12 +189,15 @@
134
189
  position: absolute;
135
190
  inset: 0;
136
191
  z-index: 10;
137
- display: flex;
192
+ display: none;
138
193
  align-items: center;
139
194
  justify-content: center;
140
195
  color: oklch(1 0 0);
141
196
  pointer-events: none;
142
197
  }
198
+ .media-minimal-skin .media-buffering-indicator[data-visible] {
199
+ display: flex;
200
+ }
143
201
 
144
202
  /* ==========================================================================
145
203
  Error Dialog
@@ -327,6 +385,7 @@
327
385
  outline-offset: -2px;
328
386
  color: oklch(0 0 0);
329
387
  font-weight: 500;
388
+ text-align: center;
330
389
  transition-property: background-color, color, outline-offset;
331
390
  transition-duration: 150ms;
332
391
  transition-timing-function: ease-out;
@@ -346,7 +405,9 @@
346
405
  /* Icon button variant */
347
406
  .media-minimal-skin .media-button--icon {
348
407
  display: grid;
349
- padding: 0.625rem;
408
+ width: 2.375rem;
409
+ padding: 0;
410
+ aspect-ratio: 1;
350
411
  background: transparent;
351
412
  color: oklch(1 0 0);
352
413
  }
@@ -360,13 +421,35 @@
360
421
  filter: drop-shadow(0 1px 0 oklch(0 0 0 / 0.25));
361
422
  }
362
423
 
363
- /* Seek button variant — hidden at small sizes */
424
+ /* Seek button */
425
+ .media-minimal-skin .media-button--seek .media-icon__label {
426
+ position: absolute;
427
+ right: -1px;
428
+ bottom: -3px;
429
+ font-size: 0.75em;
430
+ font-weight: 480;
431
+ font-variant-numeric: tabular-nums;
432
+ }
433
+ .media-minimal-skin .media-button--seek:has(.media-icon--flipped) .media-icon__label {
434
+ right: unset;
435
+ left: -1px;
436
+ }
364
437
  @container media-controls (width < 28rem) {
365
438
  .media-minimal-skin .media-button--seek {
366
439
  display: none;
367
440
  }
368
441
  }
369
442
 
443
+ /* Playback rate button */
444
+ .media-minimal-skin .media-button--playback-rate {
445
+ padding: 0;
446
+ }
447
+ .media-minimal-skin .media-button--playback-rate::after {
448
+ content: attr(data-rate) "\00D7";
449
+ width: 4ch;
450
+ font-variant-numeric: tabular-nums;
451
+ }
452
+
370
453
  /* ==========================================================================
371
454
  Icons
372
455
  ========================================================================== */
@@ -375,6 +458,8 @@
375
458
  position: relative;
376
459
  }
377
460
  .media-minimal-skin .media-icon {
461
+ display: block;
462
+ flex-shrink: 0;
378
463
  grid-area: 1 / 1;
379
464
  width: 18px;
380
465
  height: 18px;
@@ -383,28 +468,10 @@
383
468
  transition-duration: 150ms;
384
469
  transition-timing-function: ease-out;
385
470
  }
386
- .media-minimal-skin .media-icon--hidden {
387
- display: none;
388
- opacity: 0;
389
- }
390
471
  .media-minimal-skin .media-icon--flipped {
391
472
  scale: -1 1;
392
473
  }
393
474
 
394
- /* Seek icon label positioning */
395
- .media-minimal-skin .media-icon--seek ~ .media-icon__label {
396
- position: absolute;
397
- right: 0;
398
- bottom: -3px;
399
- font-size: 0.75em;
400
- font-weight: 480;
401
- font-variant-numeric: tabular-nums;
402
- }
403
- .media-minimal-skin .media-icon--seek.media-icon--flipped ~ .media-icon__label {
404
- right: unset;
405
- left: 0;
406
- }
407
-
408
475
  /* ==========================================================================
409
476
  Slider
410
477
  ========================================================================== */
@@ -439,10 +506,7 @@
439
506
  overflow: hidden;
440
507
  background-color: oklch(1 0 0 / 0.2);
441
508
  border-radius: inherit;
442
- outline: 2px solid transparent;
443
- outline-offset: -2px;
444
509
  box-shadow: 0 0 0 1px oklch(0 0 0 / 0.05);
445
- transition: outline-offset 150ms ease-out;
446
510
  user-select: none;
447
511
  }
448
512
  .media-minimal-skin .media-slider__track[data-orientation="horizontal"] {
@@ -453,13 +517,11 @@
453
517
  width: 0.1875rem;
454
518
  height: 100%;
455
519
  }
456
- .media-minimal-skin .media-slider:focus-visible .media-slider__track {
457
- outline-color: oklch(1 0 0);
458
- outline-offset: 6px;
459
- }
460
520
 
461
521
  /* Thumb */
462
522
  .media-minimal-skin .media-slider__thumb {
523
+ position: absolute;
524
+ transform: translate(-50%, -50%);
463
525
  z-index: 10;
464
526
  width: 0.75rem;
465
527
  height: 0.75rem;
@@ -472,32 +534,74 @@
472
534
  opacity: 0;
473
535
  scale: 0.7;
474
536
  transform-origin: center;
475
- transition-property: opacity, scale;
537
+ transition-property: opacity, scale, outline-offset;
476
538
  transition-duration: 150ms;
477
539
  transition-timing-function: ease-out;
478
540
  user-select: none;
541
+ outline: 2px solid transparent;
542
+ outline-offset: -2px;
543
+ }
544
+ .media-minimal-skin .media-slider__thumb[data-orientation="horizontal"] {
545
+ top: 50%;
546
+ left: var(--media-slider-fill);
547
+ }
548
+ .media-minimal-skin .media-slider__thumb[data-orientation="vertical"] {
549
+ left: 50%;
550
+ top: calc(100% - var(--media-slider-fill));
551
+ }
552
+ .media-minimal-skin .media-slider__thumb:focus-visible {
553
+ outline-color: oklch(1 0 0);
554
+ outline-offset: 2px;
479
555
  }
480
556
  .media-minimal-skin .media-slider:hover .media-slider__thumb,
481
- .media-minimal-skin .media-slider:focus-within .media-slider__thumb {
557
+ .media-minimal-skin .media-slider:focus-within .media-slider__thumb,
558
+ .media-minimal-skin .media-slider__thumb--persistent {
482
559
  opacity: 1;
483
560
  scale: 1;
484
561
  }
485
- .media-minimal-skin .media-slider__track[data-orientation="horizontal"] .media-slider__thumb {
486
- cursor: ew-resize;
562
+
563
+ /* Shared track fills */
564
+ .media-minimal-skin .media-slider__buffer,
565
+ .media-minimal-skin .media-slider__fill {
566
+ position: absolute;
567
+ border-radius: inherit;
568
+ pointer-events: none;
569
+ }
570
+ .media-minimal-skin .media-slider__buffer[data-orientation="horizontal"],
571
+ .media-minimal-skin .media-slider__fill[data-orientation="horizontal"] {
572
+ inset-block: 0;
573
+ left: 0;
487
574
  }
488
- .media-minimal-skin .media-slider__track[data-orientation="vertical"] .media-slider__thumb {
489
- cursor: ns-resize;
575
+ .media-minimal-skin .media-slider__buffer[data-orientation="vertical"],
576
+ .media-minimal-skin .media-slider__fill[data-orientation="vertical"] {
577
+ inset-inline: 0;
578
+ bottom: 0;
490
579
  }
491
580
 
492
- /* Pointer (hidden in minimal skin) */
493
- .media-minimal-skin .media-slider__pointer {
494
- display: none;
581
+ /* Buffer */
582
+ .media-minimal-skin .media-slider__buffer {
583
+ background-color: oklch(1 0 0 / 0.2);
584
+ transition-duration: 0.25s;
585
+ transition-timing-function: ease-out;
586
+ }
587
+ .media-minimal-skin .media-slider__buffer[data-orientation="horizontal"] {
588
+ width: var(--media-slider-buffer);
589
+ transition-property: width;
590
+ }
591
+ .media-minimal-skin .media-slider__buffer[data-orientation="vertical"] {
592
+ height: var(--media-slider-buffer);
593
+ transition-property: height;
495
594
  }
496
595
 
497
- /* Progress fill */
498
- .media-minimal-skin .media-slider__progress {
596
+ /* Fill */
597
+ .media-minimal-skin .media-slider__fill {
499
598
  background-color: oklch(1 0 0);
500
- border-radius: inherit;
599
+ }
600
+ .media-minimal-skin .media-slider__fill[data-orientation="horizontal"] {
601
+ width: var(--media-slider-fill);
602
+ }
603
+ .media-minimal-skin .media-slider__fill[data-orientation="vertical"] {
604
+ height: var(--media-slider-fill);
501
605
  }
502
606
 
503
607
  /* Time display within slider */
@@ -527,11 +631,14 @@
527
631
  transition-duration: 0ms;
528
632
  }
529
633
 
530
- .media-minimal-skin .media-popover-popup {
634
+ .media-minimal-skin .media-popup {
531
635
  margin: 0;
532
- padding: 0.5rem;
533
636
  border: 0;
534
637
  background: transparent;
638
+ --media-popover-side-offset: 0.5rem;
639
+ }
640
+ .media-minimal-skin .media-popup--volume {
641
+ padding: 0.25rem;
535
642
  }
536
643
 
537
644
  /* ==========================================================================
@@ -573,16 +680,8 @@
573
680
  z-index: 20;
574
681
  font-size: 1rem;
575
682
  text-wrap: balance;
576
- /* The delay must account for the controls delay/duration */
577
- transition: transform 150ms ease-out;
578
- transition-delay: 600ms;
579
683
  pointer-events: none;
580
684
  }
581
- @media (prefers-reduced-motion: reduce) {
582
- .media-minimal-skin .media-captions {
583
- transition-duration: 50ms;
584
- }
585
- }
586
685
  .media-minimal-skin .media-captions__container {
587
686
  display: flex;
588
687
  flex-direction: column;
@@ -630,8 +729,34 @@
630
729
  }
631
730
  }
632
731
 
633
- /* Shift captions up when controls visible */
732
+ /* Caption shifting styles (custom and native) */
733
+ .media-minimal-skin {
734
+ --media-caption-track-delay: 600ms;
735
+ --media-caption-track-y: -0.5rem;
736
+ }
737
+ .media-minimal-skin:has(.media-controls[data-visible]) {
738
+ --media-caption-track-delay: 25ms;
739
+ --media-caption-track-y: -3rem;
740
+ }
741
+ .media-minimal-skin .media-captions,
742
+ .media-minimal-skin video::-webkit-media-text-track-container {
743
+ /* NOTE: The delay must account for the controls delay/duration */
744
+ transition: transform 150ms ease-out;
745
+ transition-delay: var(--media-caption-track-delay);
746
+ }
747
+ .media-minimal-skin video::-webkit-media-text-track-container {
748
+ transform: translateY(var(--media-caption-track-y)) scale(0.98);
749
+ z-index: 1;
750
+ font-family: inherit;
751
+ }
752
+ /* When controls are visible, shift captions up to avoid overlap */
634
753
  .media-minimal-skin .media-controls[data-visible] ~ .media-captions {
635
- transform: translateY(-2.5rem);
636
- transition-delay: 25ms;
754
+ transform: translateY(calc(var(--media-caption-track-y) - 0.5rem));
637
755
  }
756
+ @media (prefers-reduced-motion: reduce) {
757
+ .media-minimal-skin .media-captions,
758
+ .media-minimal-skin video::-webkit-media-text-track-container {
759
+ transition-duration: 50ms;
760
+ }
761
+ }
762
+