@videojs/react 10.0.0-alpha.3 → 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 (382) hide show
  1. package/dist/default/icons/dist/react/default/captions-off.js +66 -0
  2. package/dist/default/icons/dist/react/default/captions-off.js.map +1 -0
  3. package/dist/default/icons/dist/react/default/captions-on.js +19 -0
  4. package/dist/default/icons/dist/react/default/captions-on.js.map +1 -0
  5. package/dist/default/icons/dist/react/default/fullscreen-enter.js +19 -0
  6. package/dist/default/icons/dist/react/default/fullscreen-enter.js.map +1 -0
  7. package/dist/default/icons/dist/react/default/fullscreen-exit.js +19 -0
  8. package/dist/default/icons/dist/react/default/fullscreen-exit.js.map +1 -0
  9. package/dist/default/icons/dist/react/default/pause.js +30 -0
  10. package/dist/default/icons/dist/react/default/pause.js.map +1 -0
  11. package/dist/default/icons/dist/react/default/pip.js +26 -0
  12. package/dist/default/icons/dist/react/default/pip.js.map +1 -0
  13. package/dist/default/icons/dist/react/default/play.js +19 -0
  14. package/dist/default/icons/dist/react/default/play.js.map +1 -0
  15. package/dist/default/icons/dist/react/default/restart.js +22 -0
  16. package/dist/default/icons/dist/react/default/restart.js.map +1 -0
  17. package/dist/default/icons/dist/react/default/seek.js +19 -0
  18. package/dist/default/icons/dist/react/default/seek.js.map +1 -0
  19. package/dist/default/icons/dist/react/default/spinner.js +149 -0
  20. package/dist/default/icons/dist/react/default/spinner.js.map +1 -0
  21. package/dist/default/icons/dist/react/default/volume-high.js +22 -0
  22. package/dist/default/icons/dist/react/default/volume-high.js.map +1 -0
  23. package/dist/default/icons/dist/react/default/volume-low.js +19 -0
  24. package/dist/default/icons/dist/react/default/volume-low.js.map +1 -0
  25. package/dist/default/icons/dist/react/default/volume-off.js +19 -0
  26. package/dist/default/icons/dist/react/default/volume-off.js.map +1 -0
  27. package/dist/default/icons/dist/react/minimal/captions-off.js +66 -0
  28. package/dist/default/icons/dist/react/minimal/captions-off.js.map +1 -0
  29. package/dist/default/icons/dist/react/minimal/captions-on.js +19 -0
  30. package/dist/default/icons/dist/react/minimal/captions-on.js.map +1 -0
  31. package/dist/default/icons/dist/react/minimal/fullscreen-enter.js +29 -0
  32. package/dist/default/icons/dist/react/minimal/fullscreen-enter.js.map +1 -0
  33. package/dist/default/icons/dist/react/minimal/fullscreen-exit.js +29 -0
  34. package/dist/default/icons/dist/react/minimal/fullscreen-exit.js.map +1 -0
  35. package/dist/default/icons/dist/react/minimal/pause.js +30 -0
  36. package/dist/default/icons/dist/react/minimal/pause.js.map +1 -0
  37. package/dist/default/icons/dist/react/minimal/pip.js +26 -0
  38. package/dist/default/icons/dist/react/minimal/pip.js.map +1 -0
  39. package/dist/default/icons/dist/react/minimal/play.js +19 -0
  40. package/dist/default/icons/dist/react/minimal/play.js.map +1 -0
  41. package/dist/default/icons/dist/react/minimal/restart.js +22 -0
  42. package/dist/default/icons/dist/react/minimal/restart.js.map +1 -0
  43. package/dist/default/icons/dist/react/minimal/seek.js +19 -0
  44. package/dist/default/icons/dist/react/minimal/seek.js.map +1 -0
  45. package/dist/default/icons/dist/react/minimal/spinner.js +149 -0
  46. package/dist/default/icons/dist/react/minimal/spinner.js.map +1 -0
  47. package/dist/default/icons/dist/react/minimal/volume-high.js +22 -0
  48. package/dist/default/icons/dist/react/minimal/volume-high.js.map +1 -0
  49. package/dist/default/icons/dist/react/minimal/volume-low.js +19 -0
  50. package/dist/default/icons/dist/react/minimal/volume-low.js.map +1 -0
  51. package/dist/default/icons/dist/react/minimal/volume-off.js +19 -0
  52. package/dist/default/icons/dist/react/minimal/volume-off.js.map +1 -0
  53. package/dist/default/index.js +10 -2
  54. package/dist/default/player/context.js +11 -1
  55. package/dist/default/player/context.js.map +1 -1
  56. package/dist/default/presets/audio/index.js +2 -1
  57. package/dist/default/presets/audio/skin.css +1 -0
  58. package/dist/default/presets/background/index.js +2 -1
  59. package/dist/default/presets/background/skin.css +21 -2
  60. package/dist/default/presets/background/skin.js +7 -2
  61. package/dist/default/presets/background/skin.js.map +1 -1
  62. package/dist/default/presets/video/index.js +2 -1
  63. package/dist/default/presets/video/minimal-skin.css +178 -53
  64. package/dist/default/presets/video/minimal-skin.js +74 -89
  65. package/dist/default/presets/video/minimal-skin.js.map +1 -1
  66. package/dist/default/presets/video/minimal-skin.tailwind.js +137 -106
  67. package/dist/default/presets/video/minimal-skin.tailwind.js.map +1 -1
  68. package/dist/default/presets/video/skin.css +179 -54
  69. package/dist/default/presets/video/skin.js +74 -89
  70. package/dist/default/presets/video/skin.js.map +1 -1
  71. package/dist/default/presets/video/skin.tailwind.js +134 -105
  72. package/dist/default/presets/video/skin.tailwind.js.map +1 -1
  73. package/dist/default/skins/dist/default/video/default.tailwind.js +90 -0
  74. package/dist/default/skins/dist/default/video/default.tailwind.js.map +1 -0
  75. package/dist/default/skins/dist/default/video/minimal.tailwind.js +86 -0
  76. package/dist/default/skins/dist/default/video/minimal.tailwind.js.map +1 -0
  77. package/dist/default/ui/captions-button/captions-button.js +1 -16
  78. package/dist/default/ui/captions-button/captions-button.js.map +1 -1
  79. package/dist/default/ui/controls/context.js +16 -0
  80. package/dist/default/ui/controls/context.js.map +1 -0
  81. package/dist/default/ui/controls/controls-group.js +4 -1
  82. package/dist/default/ui/controls/controls-group.js.map +1 -1
  83. package/dist/default/ui/controls/controls-root.js +19 -10
  84. package/dist/default/ui/controls/controls-root.js.map +1 -1
  85. package/dist/default/ui/create-context-part.js +29 -0
  86. package/dist/default/ui/create-context-part.js.map +1 -0
  87. package/dist/default/ui/create-media-button.js +52 -0
  88. package/dist/default/ui/create-media-button.js.map +1 -0
  89. package/dist/default/ui/fullscreen-button/fullscreen-button.js +8 -33
  90. package/dist/default/ui/fullscreen-button/fullscreen-button.js.map +1 -1
  91. package/dist/default/ui/hooks/use-slider.js +75 -0
  92. package/dist/default/ui/hooks/use-slider.js.map +1 -0
  93. package/dist/default/ui/mute-button/mute-button.js +8 -36
  94. package/dist/default/ui/mute-button/mute-button.js.map +1 -1
  95. package/dist/default/ui/pip-button/pip-button.js +8 -33
  96. package/dist/default/ui/pip-button/pip-button.js.map +1 -1
  97. package/dist/default/ui/play-button/play-button.js +7 -33
  98. package/dist/default/ui/play-button/play-button.js.map +1 -1
  99. package/dist/default/ui/playback-rate-button/index.js +3 -0
  100. package/dist/default/ui/playback-rate-button/playback-rate-button.js +34 -0
  101. package/dist/default/ui/playback-rate-button/playback-rate-button.js.map +1 -0
  102. package/dist/default/ui/popover/context.js +16 -0
  103. package/dist/default/ui/popover/context.js.map +1 -0
  104. package/dist/default/ui/popover/index.js +4 -0
  105. package/dist/default/ui/popover/index.parts.js +17 -0
  106. package/dist/default/ui/popover/index.parts.js.map +1 -0
  107. package/dist/default/ui/popover/popover-arrow.js +17 -0
  108. package/dist/default/ui/popover/popover-arrow.js.map +1 -0
  109. package/dist/default/ui/popover/popover-popup.js +94 -0
  110. package/dist/default/ui/popover/popover-popup.js.map +1 -0
  111. package/dist/default/ui/popover/popover-root.js +69 -0
  112. package/dist/default/ui/popover/popover-root.js.map +1 -0
  113. package/dist/default/ui/popover/popover-trigger.js +43 -0
  114. package/dist/default/ui/popover/popover-trigger.js.map +1 -0
  115. package/dist/default/ui/poster/poster.js +2 -1
  116. package/dist/default/ui/poster/poster.js.map +1 -1
  117. package/dist/default/ui/seek-button/seek-button.js +7 -34
  118. package/dist/default/ui/seek-button/seek-button.js.map +1 -1
  119. package/dist/default/ui/slider/context.js +22 -0
  120. package/dist/default/ui/slider/context.js.map +1 -0
  121. package/dist/default/ui/slider/index.js +3 -0
  122. package/dist/default/ui/slider/index.parts.js +21 -0
  123. package/dist/default/ui/slider/index.parts.js.map +1 -0
  124. package/dist/default/ui/slider/slider-buffer.js +16 -0
  125. package/dist/default/ui/slider/slider-buffer.js.map +1 -0
  126. package/dist/default/ui/slider/slider-fill.js +16 -0
  127. package/dist/default/ui/slider/slider-fill.js.map +1 -0
  128. package/dist/default/ui/slider/slider-root.js +71 -0
  129. package/dist/default/ui/slider/slider-root.js.map +1 -0
  130. package/dist/default/ui/slider/slider-thumb.js +32 -0
  131. package/dist/default/ui/slider/slider-thumb.js.map +1 -0
  132. package/dist/default/ui/slider/slider-track.js +16 -0
  133. package/dist/default/ui/slider/slider-track.js.map +1 -0
  134. package/dist/default/ui/slider/slider-value.js +32 -0
  135. package/dist/default/ui/slider/slider-value.js.map +1 -0
  136. package/dist/default/ui/thumbnail/thumbnail.js +87 -0
  137. package/dist/default/ui/thumbnail/thumbnail.js.map +1 -0
  138. package/dist/default/ui/time/time-value.js +2 -1
  139. package/dist/default/ui/time/time-value.js.map +1 -1
  140. package/dist/default/ui/time-slider/index.js +3 -0
  141. package/dist/default/ui/time-slider/index.parts.js +21 -0
  142. package/dist/default/ui/time-slider/index.parts.js.map +1 -0
  143. package/dist/default/ui/time-slider/time-slider-root.js +96 -0
  144. package/dist/default/ui/time-slider/time-slider-root.js.map +1 -0
  145. package/dist/default/ui/volume-slider/index.js +3 -0
  146. package/dist/default/ui/volume-slider/index.parts.js +19 -0
  147. package/dist/default/ui/volume-slider/index.parts.js.map +1 -0
  148. package/dist/default/ui/volume-slider/volume-slider-root.js +86 -0
  149. package/dist/default/ui/volume-slider/volume-slider-root.js.map +1 -0
  150. package/dist/default/utils/use-force-render.js +13 -0
  151. package/dist/default/utils/use-force-render.js.map +1 -0
  152. package/dist/default/utils/use-latest-ref.js +20 -0
  153. package/dist/default/utils/use-latest-ref.js.map +1 -0
  154. package/dist/default/utils/use-safe-id.js +22 -0
  155. package/dist/default/utils/use-safe-id.js.map +1 -0
  156. package/dist/dev/icons/dist/react/default/captions-off.js +66 -0
  157. package/dist/dev/icons/dist/react/default/captions-off.js.map +1 -0
  158. package/dist/dev/icons/dist/react/default/captions-on.js +19 -0
  159. package/dist/dev/icons/dist/react/default/captions-on.js.map +1 -0
  160. package/dist/dev/icons/dist/react/default/fullscreen-enter.js +19 -0
  161. package/dist/dev/icons/dist/react/default/fullscreen-enter.js.map +1 -0
  162. package/dist/dev/icons/dist/react/default/fullscreen-exit.js +19 -0
  163. package/dist/dev/icons/dist/react/default/fullscreen-exit.js.map +1 -0
  164. package/dist/dev/icons/dist/react/default/pause.js +30 -0
  165. package/dist/dev/icons/dist/react/default/pause.js.map +1 -0
  166. package/dist/dev/icons/dist/react/default/pip.js +26 -0
  167. package/dist/dev/icons/dist/react/default/pip.js.map +1 -0
  168. package/dist/dev/icons/dist/react/default/play.js +19 -0
  169. package/dist/dev/icons/dist/react/default/play.js.map +1 -0
  170. package/dist/dev/icons/dist/react/default/restart.js +22 -0
  171. package/dist/dev/icons/dist/react/default/restart.js.map +1 -0
  172. package/dist/dev/icons/dist/react/default/seek.js +19 -0
  173. package/dist/dev/icons/dist/react/default/seek.js.map +1 -0
  174. package/dist/dev/icons/dist/react/default/spinner.js +149 -0
  175. package/dist/dev/icons/dist/react/default/spinner.js.map +1 -0
  176. package/dist/dev/icons/dist/react/default/volume-high.js +22 -0
  177. package/dist/dev/icons/dist/react/default/volume-high.js.map +1 -0
  178. package/dist/dev/icons/dist/react/default/volume-low.js +19 -0
  179. package/dist/dev/icons/dist/react/default/volume-low.js.map +1 -0
  180. package/dist/dev/icons/dist/react/default/volume-off.js +19 -0
  181. package/dist/dev/icons/dist/react/default/volume-off.js.map +1 -0
  182. package/dist/dev/icons/dist/react/minimal/captions-off.js +66 -0
  183. package/dist/dev/icons/dist/react/minimal/captions-off.js.map +1 -0
  184. package/dist/dev/icons/dist/react/minimal/captions-on.js +19 -0
  185. package/dist/dev/icons/dist/react/minimal/captions-on.js.map +1 -0
  186. package/dist/dev/icons/dist/react/minimal/fullscreen-enter.js +29 -0
  187. package/dist/dev/icons/dist/react/minimal/fullscreen-enter.js.map +1 -0
  188. package/dist/dev/icons/dist/react/minimal/fullscreen-exit.js +29 -0
  189. package/dist/dev/icons/dist/react/minimal/fullscreen-exit.js.map +1 -0
  190. package/dist/dev/icons/dist/react/minimal/pause.js +30 -0
  191. package/dist/dev/icons/dist/react/minimal/pause.js.map +1 -0
  192. package/dist/dev/icons/dist/react/minimal/pip.js +26 -0
  193. package/dist/dev/icons/dist/react/minimal/pip.js.map +1 -0
  194. package/dist/dev/icons/dist/react/minimal/play.js +19 -0
  195. package/dist/dev/icons/dist/react/minimal/play.js.map +1 -0
  196. package/dist/dev/icons/dist/react/minimal/restart.js +22 -0
  197. package/dist/dev/icons/dist/react/minimal/restart.js.map +1 -0
  198. package/dist/dev/icons/dist/react/minimal/seek.js +19 -0
  199. package/dist/dev/icons/dist/react/minimal/seek.js.map +1 -0
  200. package/dist/dev/icons/dist/react/minimal/spinner.js +149 -0
  201. package/dist/dev/icons/dist/react/minimal/spinner.js.map +1 -0
  202. package/dist/dev/icons/dist/react/minimal/volume-high.js +22 -0
  203. package/dist/dev/icons/dist/react/minimal/volume-high.js.map +1 -0
  204. package/dist/dev/icons/dist/react/minimal/volume-low.js +19 -0
  205. package/dist/dev/icons/dist/react/minimal/volume-low.js.map +1 -0
  206. package/dist/dev/icons/dist/react/minimal/volume-off.js +19 -0
  207. package/dist/dev/icons/dist/react/minimal/volume-off.js.map +1 -0
  208. package/dist/dev/index.d.ts +20 -2
  209. package/dist/dev/index.js +10 -2
  210. package/dist/dev/player/context.d.ts.map +1 -1
  211. package/dist/dev/player/context.js +11 -1
  212. package/dist/dev/player/context.js.map +1 -1
  213. package/dist/dev/presets/audio/index.d.ts +2 -1
  214. package/dist/dev/presets/audio/index.js +2 -1
  215. package/dist/dev/presets/audio/skin.css +1 -0
  216. package/dist/dev/presets/background/index.d.ts +2 -1
  217. package/dist/dev/presets/background/index.js +2 -1
  218. package/dist/dev/presets/background/skin.css +21 -2
  219. package/dist/dev/presets/background/skin.d.ts.map +1 -1
  220. package/dist/dev/presets/background/skin.js +7 -2
  221. package/dist/dev/presets/background/skin.js.map +1 -1
  222. package/dist/dev/presets/video/index.d.ts +2 -1
  223. package/dist/dev/presets/video/index.js +2 -1
  224. package/dist/dev/presets/video/minimal-skin.css +178 -53
  225. package/dist/dev/presets/video/minimal-skin.d.ts.map +1 -1
  226. package/dist/dev/presets/video/minimal-skin.js +74 -89
  227. package/dist/dev/presets/video/minimal-skin.js.map +1 -1
  228. package/dist/dev/presets/video/minimal-skin.tailwind.d.ts.map +1 -1
  229. package/dist/dev/presets/video/minimal-skin.tailwind.js +137 -106
  230. package/dist/dev/presets/video/minimal-skin.tailwind.js.map +1 -1
  231. package/dist/dev/presets/video/skin.css +179 -54
  232. package/dist/dev/presets/video/skin.d.ts.map +1 -1
  233. package/dist/dev/presets/video/skin.js +74 -89
  234. package/dist/dev/presets/video/skin.js.map +1 -1
  235. package/dist/dev/presets/video/skin.tailwind.d.ts.map +1 -1
  236. package/dist/dev/presets/video/skin.tailwind.js +134 -105
  237. package/dist/dev/presets/video/skin.tailwind.js.map +1 -1
  238. package/dist/dev/skins/dist/default/video/default.tailwind.js +90 -0
  239. package/dist/dev/skins/dist/default/video/default.tailwind.js.map +1 -0
  240. package/dist/dev/skins/dist/default/video/minimal.tailwind.js +86 -0
  241. package/dist/dev/skins/dist/default/video/minimal.tailwind.js.map +1 -0
  242. package/dist/dev/ui/captions-button/captions-button.d.ts.map +1 -1
  243. package/dist/dev/ui/captions-button/captions-button.js +1 -16
  244. package/dist/dev/ui/captions-button/captions-button.js.map +1 -1
  245. package/dist/dev/ui/controls/context.js +16 -0
  246. package/dist/dev/ui/controls/context.js.map +1 -0
  247. package/dist/dev/ui/controls/controls-group.d.ts +2 -2
  248. package/dist/dev/ui/controls/controls-group.d.ts.map +1 -1
  249. package/dist/dev/ui/controls/controls-group.js +4 -1
  250. package/dist/dev/ui/controls/controls-group.js.map +1 -1
  251. package/dist/dev/ui/controls/controls-root.d.ts.map +1 -1
  252. package/dist/dev/ui/controls/controls-root.js +19 -10
  253. package/dist/dev/ui/controls/controls-root.js.map +1 -1
  254. package/dist/dev/ui/create-context-part.js +29 -0
  255. package/dist/dev/ui/create-context-part.js.map +1 -0
  256. package/dist/dev/ui/create-media-button.js +55 -0
  257. package/dist/dev/ui/create-media-button.js.map +1 -0
  258. package/dist/dev/ui/fullscreen-button/fullscreen-button.d.ts +2 -1
  259. package/dist/dev/ui/fullscreen-button/fullscreen-button.d.ts.map +1 -1
  260. package/dist/dev/ui/fullscreen-button/fullscreen-button.js +9 -37
  261. package/dist/dev/ui/fullscreen-button/fullscreen-button.js.map +1 -1
  262. package/dist/dev/ui/hooks/use-slider.d.ts +36 -0
  263. package/dist/dev/ui/hooks/use-slider.d.ts.map +1 -0
  264. package/dist/dev/ui/hooks/use-slider.js +75 -0
  265. package/dist/dev/ui/hooks/use-slider.js.map +1 -0
  266. package/dist/dev/ui/mute-button/mute-button.d.ts +2 -4
  267. package/dist/dev/ui/mute-button/mute-button.d.ts.map +1 -1
  268. package/dist/dev/ui/mute-button/mute-button.js +9 -40
  269. package/dist/dev/ui/mute-button/mute-button.js.map +1 -1
  270. package/dist/dev/ui/pip-button/pip-button.d.ts +2 -1
  271. package/dist/dev/ui/pip-button/pip-button.d.ts.map +1 -1
  272. package/dist/dev/ui/pip-button/pip-button.js +9 -37
  273. package/dist/dev/ui/pip-button/pip-button.js.map +1 -1
  274. package/dist/dev/ui/play-button/play-button.d.ts +1 -1
  275. package/dist/dev/ui/play-button/play-button.d.ts.map +1 -1
  276. package/dist/dev/ui/play-button/play-button.js +8 -37
  277. package/dist/dev/ui/play-button/play-button.js.map +1 -1
  278. package/dist/dev/ui/playback-rate-button/index.d.ts +2 -0
  279. package/dist/dev/ui/playback-rate-button/index.js +3 -0
  280. package/dist/dev/ui/playback-rate-button/playback-rate-button.d.ts +30 -0
  281. package/dist/dev/ui/playback-rate-button/playback-rate-button.d.ts.map +1 -0
  282. package/dist/dev/ui/playback-rate-button/playback-rate-button.js +34 -0
  283. package/dist/dev/ui/playback-rate-button/playback-rate-button.js.map +1 -0
  284. package/dist/dev/ui/popover/context.d.ts +17 -0
  285. package/dist/dev/ui/popover/context.d.ts.map +1 -0
  286. package/dist/dev/ui/popover/context.js +16 -0
  287. package/dist/dev/ui/popover/context.js.map +1 -0
  288. package/dist/dev/ui/popover/index.d.ts +3 -0
  289. package/dist/dev/ui/popover/index.js +4 -0
  290. package/dist/dev/ui/popover/index.parts.d.ts +12 -0
  291. package/dist/dev/ui/popover/index.parts.d.ts.map +1 -0
  292. package/dist/dev/ui/popover/index.parts.js +17 -0
  293. package/dist/dev/ui/popover/index.parts.js.map +1 -0
  294. package/dist/dev/ui/popover/popover-arrow.d.ts +15 -0
  295. package/dist/dev/ui/popover/popover-arrow.d.ts.map +1 -0
  296. package/dist/dev/ui/popover/popover-arrow.js +17 -0
  297. package/dist/dev/ui/popover/popover-arrow.js.map +1 -0
  298. package/dist/dev/ui/popover/popover-popup.d.ts +15 -0
  299. package/dist/dev/ui/popover/popover-popup.d.ts.map +1 -0
  300. package/dist/dev/ui/popover/popover-popup.js +94 -0
  301. package/dist/dev/ui/popover/popover-popup.js.map +1 -0
  302. package/dist/dev/ui/popover/popover-root.d.ts +29 -0
  303. package/dist/dev/ui/popover/popover-root.d.ts.map +1 -0
  304. package/dist/dev/ui/popover/popover-root.js +69 -0
  305. package/dist/dev/ui/popover/popover-root.js.map +1 -0
  306. package/dist/dev/ui/popover/popover-trigger.d.ts +15 -0
  307. package/dist/dev/ui/popover/popover-trigger.d.ts.map +1 -0
  308. package/dist/dev/ui/popover/popover-trigger.js +43 -0
  309. package/dist/dev/ui/popover/popover-trigger.js.map +1 -0
  310. package/dist/dev/ui/poster/poster.d.ts.map +1 -1
  311. package/dist/dev/ui/poster/poster.js +2 -1
  312. package/dist/dev/ui/poster/poster.js.map +1 -1
  313. package/dist/dev/ui/seek-button/seek-button.d.ts +1 -1
  314. package/dist/dev/ui/seek-button/seek-button.d.ts.map +1 -1
  315. package/dist/dev/ui/seek-button/seek-button.js +8 -38
  316. package/dist/dev/ui/seek-button/seek-button.js.map +1 -1
  317. package/dist/dev/ui/slider/context.js +22 -0
  318. package/dist/dev/ui/slider/context.js.map +1 -0
  319. package/dist/dev/ui/slider/index.d.ts +2 -0
  320. package/dist/dev/ui/slider/index.js +3 -0
  321. package/dist/dev/ui/slider/index.parts.d.ts +14 -0
  322. package/dist/dev/ui/slider/index.parts.d.ts.map +1 -0
  323. package/dist/dev/ui/slider/index.parts.js +21 -0
  324. package/dist/dev/ui/slider/index.parts.js.map +1 -0
  325. package/dist/dev/ui/slider/slider-buffer.d.ts +14 -0
  326. package/dist/dev/ui/slider/slider-buffer.d.ts.map +1 -0
  327. package/dist/dev/ui/slider/slider-buffer.js +16 -0
  328. package/dist/dev/ui/slider/slider-buffer.js.map +1 -0
  329. package/dist/dev/ui/slider/slider-fill.d.ts +14 -0
  330. package/dist/dev/ui/slider/slider-fill.d.ts.map +1 -0
  331. package/dist/dev/ui/slider/slider-fill.js +16 -0
  332. package/dist/dev/ui/slider/slider-fill.js.map +1 -0
  333. package/dist/dev/ui/slider/slider-root.d.ts +19 -0
  334. package/dist/dev/ui/slider/slider-root.d.ts.map +1 -0
  335. package/dist/dev/ui/slider/slider-root.js +71 -0
  336. package/dist/dev/ui/slider/slider-root.js.map +1 -0
  337. package/dist/dev/ui/slider/slider-thumb.d.ts +14 -0
  338. package/dist/dev/ui/slider/slider-thumb.d.ts.map +1 -0
  339. package/dist/dev/ui/slider/slider-thumb.js +32 -0
  340. package/dist/dev/ui/slider/slider-thumb.js.map +1 -0
  341. package/dist/dev/ui/slider/slider-track.d.ts +14 -0
  342. package/dist/dev/ui/slider/slider-track.d.ts.map +1 -0
  343. package/dist/dev/ui/slider/slider-track.js +16 -0
  344. package/dist/dev/ui/slider/slider-track.js.map +1 -0
  345. package/dist/dev/ui/slider/slider-value.d.ts +19 -0
  346. package/dist/dev/ui/slider/slider-value.d.ts.map +1 -0
  347. package/dist/dev/ui/slider/slider-value.js +32 -0
  348. package/dist/dev/ui/slider/slider-value.js.map +1 -0
  349. package/dist/dev/ui/thumbnail/thumbnail.d.ts +17 -0
  350. package/dist/dev/ui/thumbnail/thumbnail.d.ts.map +1 -0
  351. package/dist/dev/ui/thumbnail/thumbnail.js +87 -0
  352. package/dist/dev/ui/thumbnail/thumbnail.js.map +1 -0
  353. package/dist/dev/ui/time/time-value.d.ts.map +1 -1
  354. package/dist/dev/ui/time/time-value.js +2 -1
  355. package/dist/dev/ui/time/time-value.js.map +1 -1
  356. package/dist/dev/ui/time-slider/index.d.ts +2 -0
  357. package/dist/dev/ui/time-slider/index.js +3 -0
  358. package/dist/dev/ui/time-slider/index.parts.d.ts +15 -0
  359. package/dist/dev/ui/time-slider/index.parts.d.ts.map +1 -0
  360. package/dist/dev/ui/time-slider/index.parts.js +21 -0
  361. package/dist/dev/ui/time-slider/index.parts.js.map +1 -0
  362. package/dist/dev/ui/time-slider/time-slider-root.d.ts +17 -0
  363. package/dist/dev/ui/time-slider/time-slider-root.d.ts.map +1 -0
  364. package/dist/dev/ui/time-slider/time-slider-root.js +99 -0
  365. package/dist/dev/ui/time-slider/time-slider-root.js.map +1 -0
  366. package/dist/dev/ui/volume-slider/index.d.ts +2 -0
  367. package/dist/dev/ui/volume-slider/index.js +3 -0
  368. package/dist/dev/ui/volume-slider/index.parts.d.ts +14 -0
  369. package/dist/dev/ui/volume-slider/index.parts.d.ts.map +1 -0
  370. package/dist/dev/ui/volume-slider/index.parts.js +19 -0
  371. package/dist/dev/ui/volume-slider/index.parts.js.map +1 -0
  372. package/dist/dev/ui/volume-slider/volume-slider-root.d.ts +17 -0
  373. package/dist/dev/ui/volume-slider/volume-slider-root.d.ts.map +1 -0
  374. package/dist/dev/ui/volume-slider/volume-slider-root.js +89 -0
  375. package/dist/dev/ui/volume-slider/volume-slider-root.js.map +1 -0
  376. package/dist/dev/utils/use-force-render.js +13 -0
  377. package/dist/dev/utils/use-force-render.js.map +1 -0
  378. package/dist/dev/utils/use-latest-ref.js +20 -0
  379. package/dist/dev/utils/use-latest-ref.js.map +1 -0
  380. package/dist/dev/utils/use-safe-id.js +22 -0
  381. package/dist/dev/utils/use-safe-id.js.map +1 -0
  382. package/package.json +11 -20
@@ -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-default-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, 2rem);
@@ -78,6 +130,7 @@
78
130
  display: block;
79
131
  width: 100%;
80
132
  height: 100%;
133
+ border-radius: inherit;
81
134
  }
82
135
 
83
136
  /* ==========================================================================
@@ -89,6 +142,7 @@
89
142
  inset: 0;
90
143
  width: 100%;
91
144
  height: 100%;
145
+ border-radius: inherit;
92
146
  object-fit: cover;
93
147
  transition: opacity 0.25s;
94
148
  pointer-events: none;
@@ -104,6 +158,7 @@
104
158
  .media-default-skin .media-overlay {
105
159
  position: absolute;
106
160
  inset: 0;
161
+ z-index: 1;
107
162
  border-radius: inherit;
108
163
  background-image: linear-gradient(to top, oklch(0 0 0 / 0.5), oklch(0 0 0 / 0.3), oklch(0 0 0 / 0));
109
164
  backdrop-filter: blur(0) saturate(1.2) brightness(0.9);
@@ -137,12 +192,15 @@
137
192
  position: absolute;
138
193
  inset: 0;
139
194
  z-index: 10;
140
- display: flex;
195
+ display: none;
141
196
  align-items: center;
142
197
  justify-content: center;
143
198
  color: oklch(1 0 0);
144
199
  pointer-events: none;
145
200
  }
201
+ .media-default-skin .media-buffering-indicator[data-visible] {
202
+ display: flex;
203
+ }
146
204
  .media-default-skin .media-buffering-indicator .media-surface {
147
205
  padding: 0.25rem;
148
206
  border-radius: 100%;
@@ -339,6 +397,7 @@
339
397
  outline-offset: -2px;
340
398
  color: oklch(0 0 0);
341
399
  font-weight: 500;
400
+ text-align: center;
342
401
  transition-property: background-color, color, outline-offset;
343
402
  transition-duration: 150ms;
344
403
  transition-timing-function: ease-out;
@@ -358,7 +417,9 @@
358
417
  /* Icon button variant */
359
418
  .media-default-skin .media-button--icon {
360
419
  display: grid;
361
- padding: 0.5rem;
420
+ width: 2.125rem;
421
+ padding: 0;
422
+ aspect-ratio: 1;
362
423
  background: transparent;
363
424
  color: oklch(1 0 0 / 0.9);
364
425
  text-shadow: 0 1px 0 oklch(0 0 0 / 0.25);
@@ -374,13 +435,35 @@
374
435
  filter: drop-shadow(0 1px 0 oklch(0 0 0 / 0.25));
375
436
  }
376
437
 
377
- /* Seek button variant — hidden at small sizes */
438
+ /* Seek button */
439
+ .media-default-skin .media-button--seek .media-icon__label {
440
+ position: absolute;
441
+ right: -1px;
442
+ bottom: -3px;
443
+ font-size: 0.75em;
444
+ font-weight: 480;
445
+ font-variant-numeric: tabular-nums;
446
+ }
447
+ .media-default-skin .media-button--seek:has(.media-icon--flipped) .media-icon__label {
448
+ right: unset;
449
+ left: -1px;
450
+ }
378
451
  @container media-controls (width < 28rem) {
379
452
  .media-default-skin .media-button--seek {
380
453
  display: none;
381
454
  }
382
455
  }
383
456
 
457
+ /* Playback rate button */
458
+ .media-default-skin .media-button--playback-rate {
459
+ padding: 0;
460
+ }
461
+ .media-default-skin .media-button--playback-rate::after {
462
+ content: attr(data-rate) "\00D7";
463
+ width: 4ch;
464
+ font-variant-numeric: tabular-nums;
465
+ }
466
+
384
467
  /* ==========================================================================
385
468
  Icons
386
469
  ========================================================================== */
@@ -389,6 +472,8 @@
389
472
  position: relative;
390
473
  }
391
474
  .media-default-skin .media-icon {
475
+ display: block;
476
+ flex-shrink: 0;
392
477
  grid-area: 1 / 1;
393
478
  width: 18px;
394
479
  height: 18px;
@@ -397,28 +482,10 @@
397
482
  transition-duration: 150ms;
398
483
  transition-timing-function: ease-out;
399
484
  }
400
- .media-default-skin .media-icon--hidden {
401
- display: none;
402
- opacity: 0;
403
- }
404
485
  .media-default-skin .media-icon--flipped {
405
486
  scale: -1 1;
406
487
  }
407
488
 
408
- /* Seek icon label positioning */
409
- .media-default-skin .media-icon--seek ~ .media-icon__label {
410
- position: absolute;
411
- right: 0;
412
- bottom: -3px;
413
- font-size: 0.75em;
414
- font-weight: 480;
415
- font-variant-numeric: tabular-nums;
416
- }
417
- .media-default-skin .media-icon--seek.media-icon--flipped ~ .media-icon__label {
418
- right: unset;
419
- left: 0;
420
- }
421
-
422
489
  /* ==========================================================================
423
490
  Slider
424
491
  ========================================================================== */
@@ -453,10 +520,7 @@
453
520
  overflow: hidden;
454
521
  background-color: oklch(1 0 0 / 0.2);
455
522
  border-radius: inherit;
456
- outline: 2px solid transparent;
457
- outline-offset: -2px;
458
523
  box-shadow: 0 0 0 1px oklch(0 0 0 / 0.05);
459
- transition: outline-offset 150ms ease-out;
460
524
  user-select: none;
461
525
  }
462
526
  .media-default-skin .media-slider__track[data-orientation="horizontal"] {
@@ -467,14 +531,12 @@
467
531
  width: 0.25rem;
468
532
  height: 100%;
469
533
  }
470
- .media-default-skin .media-slider:focus-visible .media-slider__track {
471
- outline-color: oklch(62.3% 0.214 259.815);
472
- outline-offset: 6px;
473
- }
474
534
 
475
535
  /* Thumb */
476
536
  .media-default-skin .media-slider__thumb {
477
537
  z-index: 10;
538
+ position: absolute;
539
+ transform: translate(-50%, -50%);
478
540
  width: 0.625rem;
479
541
  height: 0.625rem;
480
542
  background-color: oklch(1 0 0);
@@ -484,36 +546,78 @@
484
546
  0 1px 3px 0 oklch(0 0 0 / 0.15),
485
547
  0 1px 2px -1px oklch(0 0 0 / 0.15);
486
548
  opacity: 0;
487
- transition-property: opacity, height, width;
549
+ transition-property: opacity, height, width, outline-offset;
488
550
  transition-duration: 150ms;
489
551
  transition-timing-function: ease-out;
490
552
  user-select: none;
553
+ outline: 2px solid transparent;
554
+ outline-offset: -2px;
491
555
  }
492
- .media-default-skin .media-slider__thumb:active {
556
+ .media-default-skin .media-slider__thumb[data-orientation="horizontal"] {
557
+ top: 50%;
558
+ left: var(--media-slider-fill);
559
+ }
560
+ .media-default-skin .media-slider__thumb[data-orientation="vertical"] {
561
+ left: 50%;
562
+ top: calc(100% - var(--media-slider-fill));
563
+ }
564
+ .media-default-skin .media-slider__thumb:focus-visible {
565
+ outline-color: oklch(62.3% 0.214 259.815);
566
+ outline-offset: 2px;
567
+ }
568
+ .media-default-skin .media-slider:active .media-slider__thumb,
569
+ .media-default-skin .media-slider__thumb--persistent {
493
570
  width: 0.75rem;
494
571
  height: 0.75rem;
495
572
  }
496
573
  .media-default-skin .media-slider:hover .media-slider__thumb,
497
- .media-default-skin .media-slider:focus-within .media-slider__thumb {
574
+ .media-default-skin .media-slider__thumb:focus-visible,
575
+ .media-default-skin .media-slider__thumb--persistent {
498
576
  opacity: 1;
499
577
  }
500
- .media-default-skin .media-slider__track[data-orientation="horizontal"] .media-slider__thumb {
501
- cursor: ew-resize;
578
+
579
+ /* Shared track fills */
580
+ .media-default-skin .media-slider__buffer,
581
+ .media-default-skin .media-slider__fill {
582
+ position: absolute;
583
+ border-radius: inherit;
584
+ pointer-events: none;
502
585
  }
503
- .media-default-skin .media-slider__track[data-orientation="vertical"] .media-slider__thumb {
504
- cursor: ns-resize;
586
+ .media-default-skin .media-slider__buffer[data-orientation="horizontal"],
587
+ .media-default-skin .media-slider__fill[data-orientation="horizontal"] {
588
+ inset-block: 0;
589
+ left: 0;
590
+ }
591
+ .media-default-skin .media-slider__buffer[data-orientation="vertical"],
592
+ .media-default-skin .media-slider__fill[data-orientation="vertical"] {
593
+ inset-inline: 0;
594
+ bottom: 0;
505
595
  }
506
596
 
507
- /* Pointer (hover preview) */
508
- .media-default-skin .media-slider__pointer {
597
+ /* Buffer */
598
+ .media-default-skin .media-slider__buffer {
509
599
  background-color: oklch(1 0 0 / 0.2);
510
- border-radius: inherit;
600
+ transition-duration: 0.25s;
601
+ transition-timing-function: ease-out;
602
+ }
603
+ .media-default-skin .media-slider__buffer[data-orientation="horizontal"] {
604
+ width: var(--media-slider-buffer);
605
+ transition-property: width;
606
+ }
607
+ .media-default-skin .media-slider__buffer[data-orientation="vertical"] {
608
+ height: var(--media-slider-buffer);
609
+ transition-property: height;
511
610
  }
512
611
 
513
- /* Progress fill */
514
- .media-default-skin .media-slider__progress {
612
+ /* Fill */
613
+ .media-default-skin .media-slider__fill {
515
614
  background-color: oklch(1 0 0);
516
- border-radius: inherit;
615
+ }
616
+ .media-default-skin .media-slider__fill[data-orientation="horizontal"] {
617
+ width: var(--media-slider-fill);
618
+ }
619
+ .media-default-skin .media-slider__fill[data-orientation="vertical"] {
620
+ height: var(--media-slider-fill);
517
621
  }
518
622
 
519
623
  /* Time display within slider */
@@ -543,10 +647,13 @@
543
647
  transition-duration: 0ms;
544
648
  }
545
649
 
546
- .media-default-skin .media-popover-popup {
650
+ .media-default-skin .media-popup {
547
651
  margin: 0;
548
- padding: 0.75rem 0.25rem;
549
652
  border: 0;
653
+ --media-popover-side-offset: 0.5rem;
654
+ }
655
+ .media-default-skin .media-popup--volume {
656
+ padding: 0.625rem 0.25rem;
550
657
  border-radius: calc(infinity * 1px);
551
658
  }
552
659
 
@@ -574,16 +681,8 @@
574
681
  z-index: 20;
575
682
  font-size: 1rem;
576
683
  text-wrap: balance;
577
- /* The delay must account for the controls delay/duration */
578
- transition: transform 150ms ease-out;
579
- transition-delay: 600ms;
580
684
  pointer-events: none;
581
685
  }
582
- @media (prefers-reduced-motion: reduce) {
583
- .media-default-skin .media-captions {
584
- transition-duration: 50ms;
585
- }
586
- }
587
686
  .media-default-skin .media-captions__container {
588
687
  display: flex;
589
688
  flex-direction: column;
@@ -631,8 +730,34 @@
631
730
  }
632
731
  }
633
732
 
634
- /* Shift captions up when controls visible */
733
+ /* Caption shifting styles (custom and native) */
734
+ .media-default-skin {
735
+ --media-caption-track-delay: 600ms;
736
+ --media-caption-track-y: -0.5rem;
737
+ }
738
+ .media-default-skin:has(.media-controls[data-visible]) {
739
+ --media-caption-track-delay: 25ms;
740
+ --media-caption-track-y: -3.5rem;
741
+ }
742
+ .media-default-skin .media-captions,
743
+ .media-default-skin video::-webkit-media-text-track-container {
744
+ /* NOTE: The delay must account for the controls delay/duration */
745
+ transition: transform 150ms ease-out;
746
+ transition-delay: var(--media-caption-track-delay);
747
+ }
748
+ .media-default-skin video::-webkit-media-text-track-container {
749
+ transform: translateY(var(--media-caption-track-y)) scale(0.98);
750
+ z-index: 1;
751
+ font-family: inherit;
752
+ }
753
+ /* When controls are visible, shift captions up to avoid overlap */
635
754
  .media-default-skin .media-controls[data-visible] ~ .media-captions {
636
- transform: translateY(-3rem);
637
- transition-delay: 25ms;
755
+ transform: translateY(calc(var(--media-caption-track-y) - 0.5rem));
638
756
  }
757
+ @media (prefers-reduced-motion: reduce) {
758
+ .media-default-skin .media-captions,
759
+ .media-default-skin video::-webkit-media-text-track-container {
760
+ transition-duration: 50ms;
761
+ }
762
+ }
763
+
@@ -1 +1 @@
1
- {"version":3,"file":"skin.d.ts","names":[],"sources":["../../../../src/presets/video/skin.tsx"],"mappings":";;;;KAiCY,cAAA,GAAiB,aAAA;AAAA,iBAgDb,SAAA,CAAU,KAAA,EAAO,cAAA,GAAiB,SAAA"}
1
+ {"version":3,"file":"skin.d.ts","names":[],"sources":["../../../../src/presets/video/skin.tsx"],"mappings":";;;;KAoCY,cAAA,GAAiB,aAAA;AAAA,iBAMb,SAAA,CAAU,KAAA,EAAO,cAAA,GAAiB,SAAA"}
@@ -5,15 +5,37 @@ import { FullscreenButton } from "../../ui/fullscreen-button/fullscreen-button.j
5
5
  import { MuteButton } from "../../ui/mute-button/mute-button.js";
6
6
  import { PiPButton } from "../../ui/pip-button/pip-button.js";
7
7
  import { PlayButton } from "../../ui/play-button/play-button.js";
8
+ import { PlaybackRateButton } from "../../ui/playback-rate-button/playback-rate-button.js";
9
+ import { PopoverPopup } from "../../ui/popover/popover-popup.js";
10
+ import { PopoverRoot } from "../../ui/popover/popover-root.js";
11
+ import { PopoverTrigger } from "../../ui/popover/popover-trigger.js";
8
12
  import { SeekButton } from "../../ui/seek-button/seek-button.js";
13
+ import { SliderBuffer } from "../../ui/slider/slider-buffer.js";
14
+ import { SliderFill } from "../../ui/slider/slider-fill.js";
15
+ import { SliderThumb } from "../../ui/slider/slider-thumb.js";
16
+ import { SliderTrack } from "../../ui/slider/slider-track.js";
9
17
  import { Group } from "../../ui/time/time-group.js";
10
18
  import { Value } from "../../ui/time/time-value.js";
19
+ import { TimeSliderRoot } from "../../ui/time-slider/time-slider-root.js";
20
+ import { VolumeSliderRoot } from "../../ui/volume-slider/volume-slider-root.js";
11
21
  import { CaptionsButton } from "../../ui/captions-button/captions-button.js";
12
22
  import { ErrorDialog } from "../../ui/error-dialog/error-dialog.js";
23
+ import CaptionsOffIcon from "../../icons/dist/react/default/captions-off.js";
24
+ import CaptionsOnIcon from "../../icons/dist/react/default/captions-on.js";
25
+ import FullscreenEnterIcon from "../../icons/dist/react/default/fullscreen-enter.js";
26
+ import FullscreenExitIcon from "../../icons/dist/react/default/fullscreen-exit.js";
27
+ import PauseIcon from "../../icons/dist/react/default/pause.js";
28
+ import PipIcon from "../../icons/dist/react/default/pip.js";
29
+ import PlayIcon from "../../icons/dist/react/default/play.js";
30
+ import RestartIcon from "../../icons/dist/react/default/restart.js";
31
+ import SeekIcon from "../../icons/dist/react/default/seek.js";
32
+ import SpinnerIcon from "../../icons/dist/react/default/spinner.js";
33
+ import VolumeHighIcon from "../../icons/dist/react/default/volume-high.js";
34
+ import VolumeLowIcon from "../../icons/dist/react/default/volume-low.js";
35
+ import VolumeOffIcon from "../../icons/dist/react/default/volume-off.js";
13
36
  import { forwardRef } from "react";
14
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
37
+ import { jsx, jsxs } from "react/jsx-runtime";
15
38
  import { cn } from "@videojs/utils/style";
16
- import { CaptionsOffIcon, CaptionsOnIcon, FullscreenEnterIcon, FullscreenExitIcon, PauseIcon, PipIcon, PlayIcon, RestartIcon, SeekIcon, SpinnerIcon, VolumeHighIcon, VolumeLowIcon, VolumeOffIcon } from "@videojs/icons/react";
17
39
 
18
40
  //#region src/presets/video/skin.tsx
19
41
  const SEEK_TIME = 10;
@@ -25,75 +47,20 @@ const Button = forwardRef(function Button({ className, ...props }, ref) {
25
47
  ...props
26
48
  });
27
49
  });
28
- function PlayButtonIcon({ state, className, ...rest }) {
29
- const { ended, paused } = state;
30
- return /* @__PURE__ */ jsxs(Fragment, { children: [
31
- /* @__PURE__ */ jsx(RestartIcon, {
32
- ...rest,
33
- className: cn(className, { "media-icon--hidden": !ended })
34
- }),
35
- /* @__PURE__ */ jsx(PlayIcon, {
36
- ...rest,
37
- className: cn(className, { "media-icon--hidden": ended || !paused })
38
- }),
39
- /* @__PURE__ */ jsx(PauseIcon, {
40
- ...rest,
41
- className: cn(className, { "media-icon--hidden": paused })
42
- })
43
- ] });
44
- }
45
- function MuteButtonIcon({ state, className, ...rest }) {
46
- const { muted, volumeLevel } = state;
47
- return /* @__PURE__ */ jsxs(Fragment, { children: [
48
- /* @__PURE__ */ jsx(VolumeOffIcon, {
49
- ...rest,
50
- className: cn(className, { "media-icon--hidden": !muted })
51
- }),
52
- /* @__PURE__ */ jsx(VolumeLowIcon, {
53
- ...rest,
54
- className: cn(className, { "media-icon--hidden": muted || volumeLevel !== "low" })
55
- }),
56
- /* @__PURE__ */ jsx(VolumeHighIcon, {
57
- ...rest,
58
- className: cn(className, { "media-icon--hidden": muted || volumeLevel === "low" })
59
- })
60
- ] });
61
- }
62
- function CaptionsButtonIcon({ state, className, ...rest }) {
63
- const { active } = state;
64
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(CaptionsOffIcon, {
65
- ...rest,
66
- className: cn(className, { "media-icon--hidden": active })
67
- }), /* @__PURE__ */ jsx(CaptionsOnIcon, {
68
- ...rest,
69
- className: cn(className, { "media-icon--hidden": !active })
70
- })] });
71
- }
72
- function FullscreenButtonIcon({ state, className, ...rest }) {
73
- const { fullscreen } = state;
74
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(FullscreenExitIcon, {
75
- ...rest,
76
- className: cn(className, { "media-icon--hidden": !fullscreen })
77
- }), /* @__PURE__ */ jsx(FullscreenEnterIcon, {
78
- ...rest,
79
- className: cn(className, { "media-icon--hidden": fullscreen })
80
- })] });
81
- }
82
50
  function VideoSkin(props) {
83
51
  const { children, className, ...rest } = props;
84
52
  return /* @__PURE__ */ jsxs(Container, {
85
53
  className: cn("media-default-skin", className),
86
54
  ...rest,
87
55
  children: [
88
- children,
89
- /* @__PURE__ */ jsx(BufferingIndicator, { render: (props, state) => state.visible ? /* @__PURE__ */ jsx("div", {
56
+ /* @__PURE__ */ jsx(BufferingIndicator, { render: (props) => /* @__PURE__ */ jsx("div", {
90
57
  ...props,
91
58
  className: "media-buffering-indicator",
92
59
  children: /* @__PURE__ */ jsx("div", {
93
60
  className: "media-surface",
94
61
  children: /* @__PURE__ */ jsx(SpinnerIcon, { className: "media-icon" })
95
62
  })
96
- }) : null }),
63
+ }) }),
97
64
  /* @__PURE__ */ jsx(ErrorDialog, {
98
65
  "aria-labelledby": "media-error-title",
99
66
  "aria-describedby": "media-error-description",
@@ -126,13 +93,14 @@ function VideoSkin(props) {
126
93
  /* @__PURE__ */ jsxs(ControlsRoot, {
127
94
  className: "media-surface media-controls",
128
95
  children: [
129
- /* @__PURE__ */ jsx(PlayButton, { render: (props, state) => /* @__PURE__ */ jsx(Button, {
96
+ /* @__PURE__ */ jsx(PlayButton, { render: (props) => /* @__PURE__ */ jsxs(Button, {
130
97
  ...props,
131
- className: "media-button--icon",
132
- children: /* @__PURE__ */ jsx(PlayButtonIcon, {
133
- state,
134
- className: "media-icon"
135
- })
98
+ className: "media-button--icon media-button--play",
99
+ children: [
100
+ /* @__PURE__ */ jsx(RestartIcon, { className: "media-icon media-icon--restart" }),
101
+ /* @__PURE__ */ jsx(PlayIcon, { className: "media-icon media-icon--play" }),
102
+ /* @__PURE__ */ jsx(PauseIcon, { className: "media-icon media-icon--pause" })
103
+ ]
136
104
  }) }),
137
105
  /* @__PURE__ */ jsx(SeekButton, {
138
106
  seconds: -SEEK_TIME,
@@ -169,12 +137,12 @@ function VideoSkin(props) {
169
137
  type: "current",
170
138
  className: "media-time__value"
171
139
  }),
172
- /* @__PURE__ */ jsx("div", {
140
+ /* @__PURE__ */ jsxs(TimeSliderRoot, {
173
141
  className: "media-slider",
174
- style: {
175
- height: "4px",
176
- background: "oklab(1 0 0 / 0.2)"
177
- }
142
+ children: [/* @__PURE__ */ jsxs(SliderTrack, {
143
+ className: "media-slider__track",
144
+ children: [/* @__PURE__ */ jsx(SliderFill, { className: "media-slider__fill" }), /* @__PURE__ */ jsx(SliderBuffer, { className: "media-slider__buffer" })]
145
+ }), /* @__PURE__ */ jsx(SliderThumb, { className: "media-slider__thumb" })]
178
146
  }),
179
147
  /* @__PURE__ */ jsx(Value, {
180
148
  type: "duration",
@@ -182,38 +150,55 @@ function VideoSkin(props) {
182
150
  })
183
151
  ]
184
152
  }),
185
- /* @__PURE__ */ jsx(MuteButton, { render: (props, state) => /* @__PURE__ */ jsx(Button, {
153
+ /* @__PURE__ */ jsx(PlaybackRateButton, { render: (props) => /* @__PURE__ */ jsx(Button, {
186
154
  ...props,
187
- className: "media-button--icon",
188
- children: /* @__PURE__ */ jsx(MuteButtonIcon, {
189
- state,
190
- className: "media-icon"
191
- })
155
+ className: "media-button--icon media-button--playback-rate"
192
156
  }) }),
193
- /* @__PURE__ */ jsx(CaptionsButton, { render: (props, state) => /* @__PURE__ */ jsx(Button, {
157
+ /* @__PURE__ */ jsxs(PopoverRoot, {
158
+ openOnHover: true,
159
+ delay: 200,
160
+ closeDelay: 100,
161
+ side: "top",
162
+ children: [/* @__PURE__ */ jsx(PopoverTrigger, { render: /* @__PURE__ */ jsx(MuteButton, { render: (props) => /* @__PURE__ */ jsxs(Button, {
163
+ ...props,
164
+ className: "media-button--icon media-button--mute",
165
+ children: [
166
+ /* @__PURE__ */ jsx(VolumeOffIcon, { className: "media-icon media-icon--volume-off" }),
167
+ /* @__PURE__ */ jsx(VolumeLowIcon, { className: "media-icon media-icon--volume-low" }),
168
+ /* @__PURE__ */ jsx(VolumeHighIcon, { className: "media-icon media-icon--volume-high" })
169
+ ]
170
+ }) }) }), /* @__PURE__ */ jsx(PopoverPopup, {
171
+ className: "media-surface media-popup media-popup--volume media-popup-animation",
172
+ children: /* @__PURE__ */ jsxs(VolumeSliderRoot, {
173
+ className: "media-slider",
174
+ orientation: "vertical",
175
+ thumbAlignment: "edge",
176
+ children: [/* @__PURE__ */ jsx(SliderTrack, {
177
+ className: "media-slider__track",
178
+ children: /* @__PURE__ */ jsx(SliderFill, { className: "media-slider__fill" })
179
+ }), /* @__PURE__ */ jsx(SliderThumb, { className: "media-slider__thumb media-slider__thumb--persistent" })]
180
+ })
181
+ })]
182
+ }),
183
+ /* @__PURE__ */ jsx(CaptionsButton, { render: (props) => /* @__PURE__ */ jsxs(Button, {
194
184
  ...props,
195
- className: "media-button--icon",
196
- children: /* @__PURE__ */ jsx(CaptionsButtonIcon, {
197
- state,
198
- className: "media-icon"
199
- })
185
+ className: "media-button--icon media-button--captions",
186
+ children: [/* @__PURE__ */ jsx(CaptionsOffIcon, { className: "media-icon media-icon--captions-off" }), /* @__PURE__ */ jsx(CaptionsOnIcon, { className: "media-icon media-icon--captions-on" })]
200
187
  }) }),
201
188
  /* @__PURE__ */ jsx(PiPButton, { render: (props) => /* @__PURE__ */ jsx(Button, {
202
189
  ...props,
203
190
  className: "media-button--icon",
204
191
  children: /* @__PURE__ */ jsx(PipIcon, { className: "media-icon" })
205
192
  }) }),
206
- /* @__PURE__ */ jsx(FullscreenButton, { render: (props, state) => /* @__PURE__ */ jsx(Button, {
193
+ /* @__PURE__ */ jsx(FullscreenButton, { render: (props) => /* @__PURE__ */ jsxs(Button, {
207
194
  ...props,
208
- className: "media-button--icon",
209
- children: /* @__PURE__ */ jsx(FullscreenButtonIcon, {
210
- state,
211
- className: "media-icon"
212
- })
195
+ className: "media-button--icon media-button--fullscreen",
196
+ children: [/* @__PURE__ */ jsx(FullscreenEnterIcon, { className: "media-icon media-icon--fullscreen-enter" }), /* @__PURE__ */ jsx(FullscreenExitIcon, { className: "media-icon media-icon--fullscreen-exit" })]
213
197
  }) })
214
198
  ]
215
199
  }),
216
- /* @__PURE__ */ jsx("div", { className: "media-overlay" })
200
+ /* @__PURE__ */ jsx("div", { className: "media-overlay" }),
201
+ children
217
202
  ]
218
203
  });
219
204
  }
@@ -1 +1 @@
1
- {"version":3,"file":"skin.js","names":["Controls.Root","Time.Group","Time.Value"],"sources":["../../../../src/presets/video/skin.tsx"],"sourcesContent":["import type { FullscreenButtonState, MuteButtonState, PlayButtonState } from '@videojs/core';\nimport {\n CaptionsOffIcon,\n CaptionsOnIcon,\n FullscreenEnterIcon,\n FullscreenExitIcon,\n PauseIcon,\n PipIcon,\n PlayIcon,\n RestartIcon,\n SeekIcon,\n SpinnerIcon,\n VolumeHighIcon,\n VolumeLowIcon,\n VolumeOffIcon,\n} from '@videojs/icons/react';\nimport { cn } from '@videojs/utils/style';\nimport { type ComponentProps, forwardRef, type ReactNode } from 'react';\nimport { Container } from '@/player/context';\nimport { BufferingIndicator } from '@/ui/buffering-indicator';\nimport { CaptionsButton, type CaptionsButtonState } from '@/ui/captions-button';\nimport { Controls } from '@/ui/controls';\nimport { ErrorDialog } from '@/ui/error-dialog';\nimport { FullscreenButton } from '@/ui/fullscreen-button';\nimport { MuteButton } from '@/ui/mute-button';\nimport { PiPButton } from '@/ui/pip-button';\nimport { PlayButton } from '@/ui/play-button';\nimport { SeekButton } from '@/ui/seek-button';\nimport { Time } from '@/ui/time';\nimport type { BaseSkinProps } from '../types';\n\nconst SEEK_TIME = 10;\n\nexport type VideoSkinProps = BaseSkinProps;\n\nconst Button = forwardRef<HTMLButtonElement, ComponentProps<'button'>>(function Button({ className, ...props }, ref) {\n return <button ref={ref} type=\"button\" className={cn('media-button', className)} {...props} />;\n});\n\nfunction PlayButtonIcon({ state, className, ...rest }: { state: PlayButtonState } & ComponentProps<'svg'>) {\n const { ended, paused } = state;\n return (\n <>\n <RestartIcon {...rest} className={cn(className, { 'media-icon--hidden': !ended })} />\n <PlayIcon {...rest} className={cn(className, { 'media-icon--hidden': ended || !paused })} />\n <PauseIcon {...rest} className={cn(className, { 'media-icon--hidden': paused })} />\n </>\n );\n}\n\nfunction MuteButtonIcon({ state, className, ...rest }: { state: MuteButtonState } & ComponentProps<'svg'>) {\n const { muted, volumeLevel } = state;\n return (\n <>\n <VolumeOffIcon {...rest} className={cn(className, { 'media-icon--hidden': !muted })} />\n <VolumeLowIcon {...rest} className={cn(className, { 'media-icon--hidden': muted || volumeLevel !== 'low' })} />\n <VolumeHighIcon {...rest} className={cn(className, { 'media-icon--hidden': muted || volumeLevel === 'low' })} />\n </>\n );\n}\n\nfunction CaptionsButtonIcon({ state, className, ...rest }: { state: CaptionsButtonState } & ComponentProps<'svg'>) {\n const { active } = state;\n return (\n <>\n <CaptionsOffIcon {...rest} className={cn(className, { 'media-icon--hidden': active })} />\n <CaptionsOnIcon {...rest} className={cn(className, { 'media-icon--hidden': !active })} />\n </>\n );\n}\n\nfunction FullscreenButtonIcon({ state, className, ...rest }: { state: FullscreenButtonState } & ComponentProps<'svg'>) {\n const { fullscreen } = state;\n return (\n <>\n <FullscreenExitIcon {...rest} className={cn(className, { 'media-icon--hidden': !fullscreen })} />\n <FullscreenEnterIcon {...rest} className={cn(className, { 'media-icon--hidden': fullscreen })} />\n </>\n );\n}\n\nexport function VideoSkin(props: VideoSkinProps): ReactNode {\n const { children, className, ...rest } = props;\n\n return (\n <Container className={cn('media-default-skin', className)} {...rest}>\n {children}\n\n <BufferingIndicator\n render={(props, state) =>\n state.visible ? (\n <div {...props} className=\"media-buffering-indicator\">\n <div className=\"media-surface\">\n <SpinnerIcon className=\"media-icon\" />\n </div>\n </div>\n ) : null\n }\n />\n\n <ErrorDialog\n aria-labelledby=\"media-error-title\"\n aria-describedby=\"media-error-description\"\n render={(props, { onDismiss }) => (\n <div {...props} className=\"media-error\">\n <div className=\"media-error__dialog media-surface\">\n <div className=\"media-error__content\">\n <p id=\"media-error-title\" className=\"media-error__title\">\n Something went wrong.\n </p>\n <p id=\"media-error-description\" className=\"media-error__description\">\n An error occurred while trying to play the video. Please try again.\n </p>\n </div>\n <div className=\"media-error__actions\">\n <Button onClick={onDismiss}>OK</Button>\n </div>\n </div>\n </div>\n )}\n />\n\n <Controls.Root className=\"media-surface media-controls\">\n <PlayButton\n render={(props, state) => (\n <Button {...props} className=\"media-button--icon\">\n <PlayButtonIcon state={state} className=\"media-icon\" />\n </Button>\n )}\n />\n\n <SeekButton\n seconds={-SEEK_TIME}\n render={(props) => (\n <Button {...props} className=\"media-button--icon media-button--seek\">\n <span className=\"media-icon__container\">\n <SeekIcon className=\"media-icon media-icon--seek media-icon--flipped\" />\n <span className=\"media-icon__label\">{SEEK_TIME}</span>\n </span>\n </Button>\n )}\n />\n\n <SeekButton\n seconds={SEEK_TIME}\n render={(props) => (\n <Button {...props} className=\"media-button--icon media-button--seek\">\n <span className=\"media-icon__container\">\n <SeekIcon className=\"media-icon media-icon--seek\" />\n <span className=\"media-icon__label\">{SEEK_TIME}</span>\n </span>\n </Button>\n )}\n />\n\n <Time.Group className=\"media-time\">\n <Time.Value type=\"current\" className=\"media-time__value\" />\n {/* Temporary spacer */}\n <div className=\"media-slider\" style={{ height: '4px', background: 'oklab(1 0 0 / 0.2)' }} />\n <Time.Value type=\"duration\" className=\"media-time__value\" />\n </Time.Group>\n\n <MuteButton\n render={(props, state) => (\n <Button {...props} className=\"media-button--icon\">\n <MuteButtonIcon state={state} className=\"media-icon\" />\n </Button>\n )}\n />\n\n <CaptionsButton\n render={(props, state) => (\n <Button {...props} className=\"media-button--icon\">\n <CaptionsButtonIcon state={state} className=\"media-icon\" />\n </Button>\n )}\n />\n\n <PiPButton\n render={(props) => (\n <Button {...props} className=\"media-button--icon\">\n <PipIcon className=\"media-icon\" />\n </Button>\n )}\n />\n\n <FullscreenButton\n render={(props, state) => (\n <Button {...props} className=\"media-button--icon\">\n <FullscreenButtonIcon state={state} className=\"media-icon\" />\n </Button>\n )}\n />\n </Controls.Root>\n\n {/* <div className=\"media-captions\">\n <div className=\"media-captions__container\">\n <span className=\"media-captions__text\">An example cue</span>\n <span className=\"media-captions__text\">\n <p>Another example cue with HTML</p>\n </span>\n </div>\n </div> */}\n\n <div className=\"media-overlay\" />\n </Container>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"skin.js","names":["Controls.Root","Time.Group","Time.Value","TimeSlider.Root","TimeSlider.Track","TimeSlider.Fill","TimeSlider.Buffer","TimeSlider.Thumb","Popover.Root","Popover.Trigger","Popover.Popup","VolumeSlider.Root","VolumeSlider.Track","VolumeSlider.Fill","VolumeSlider.Thumb"],"sources":["../../../../src/presets/video/skin.tsx"],"sourcesContent":["import {\n CaptionsOffIcon,\n CaptionsOnIcon,\n FullscreenEnterIcon,\n FullscreenExitIcon,\n PauseIcon,\n PipIcon,\n PlayIcon,\n RestartIcon,\n SeekIcon,\n SpinnerIcon,\n VolumeHighIcon,\n VolumeLowIcon,\n VolumeOffIcon,\n} from '@videojs/icons/react';\nimport { cn } from '@videojs/utils/style';\nimport { type ComponentProps, forwardRef, type ReactNode } from 'react';\nimport { Container } from '@/player/context';\nimport { BufferingIndicator } from '@/ui/buffering-indicator';\nimport { CaptionsButton } from '@/ui/captions-button';\nimport { Controls } from '@/ui/controls';\nimport { ErrorDialog } from '@/ui/error-dialog';\nimport { FullscreenButton } from '@/ui/fullscreen-button';\nimport { MuteButton } from '@/ui/mute-button';\nimport { PiPButton } from '@/ui/pip-button';\nimport { PlayButton } from '@/ui/play-button';\nimport { PlaybackRateButton } from '@/ui/playback-rate-button';\nimport { Popover } from '@/ui/popover';\nimport { SeekButton } from '@/ui/seek-button';\nimport { Time } from '@/ui/time';\nimport { TimeSlider } from '@/ui/time-slider';\nimport { VolumeSlider } from '@/ui/volume-slider';\nimport type { BaseSkinProps } from '../types';\n\nconst SEEK_TIME = 10;\n\nexport type VideoSkinProps = BaseSkinProps;\n\nconst Button = forwardRef<HTMLButtonElement, ComponentProps<'button'>>(function Button({ className, ...props }, ref) {\n return <button ref={ref} type=\"button\" className={cn('media-button', className)} {...props} />;\n});\n\nexport function VideoSkin(props: VideoSkinProps): ReactNode {\n const { children, className, ...rest } = props;\n\n return (\n <Container className={cn('media-default-skin', className)} {...rest}>\n <BufferingIndicator\n render={(props) => (\n <div {...props} className=\"media-buffering-indicator\">\n <div className=\"media-surface\">\n <SpinnerIcon className=\"media-icon\" />\n </div>\n </div>\n )}\n />\n\n <ErrorDialog\n aria-labelledby=\"media-error-title\"\n aria-describedby=\"media-error-description\"\n render={(props, { onDismiss }) => (\n <div {...props} className=\"media-error\">\n <div className=\"media-error__dialog media-surface\">\n <div className=\"media-error__content\">\n <p id=\"media-error-title\" className=\"media-error__title\">\n Something went wrong.\n </p>\n <p id=\"media-error-description\" className=\"media-error__description\">\n An error occurred while trying to play the video. Please try again.\n </p>\n </div>\n <div className=\"media-error__actions\">\n <Button onClick={onDismiss}>OK</Button>\n </div>\n </div>\n </div>\n )}\n />\n\n <Controls.Root className=\"media-surface media-controls\">\n <PlayButton\n render={(props) => (\n <Button {...props} className=\"media-button--icon media-button--play\">\n <RestartIcon className=\"media-icon media-icon--restart\" />\n <PlayIcon className=\"media-icon media-icon--play\" />\n <PauseIcon className=\"media-icon media-icon--pause\" />\n </Button>\n )}\n />\n\n <SeekButton\n seconds={-SEEK_TIME}\n render={(props) => (\n <Button {...props} className=\"media-button--icon media-button--seek\">\n <span className=\"media-icon__container\">\n <SeekIcon className=\"media-icon media-icon--seek media-icon--flipped\" />\n <span className=\"media-icon__label\">{SEEK_TIME}</span>\n </span>\n </Button>\n )}\n />\n\n <SeekButton\n seconds={SEEK_TIME}\n render={(props) => (\n <Button {...props} className=\"media-button--icon media-button--seek\">\n <span className=\"media-icon__container\">\n <SeekIcon className=\"media-icon media-icon--seek\" />\n <span className=\"media-icon__label\">{SEEK_TIME}</span>\n </span>\n </Button>\n )}\n />\n\n <Time.Group className=\"media-time\">\n <Time.Value type=\"current\" className=\"media-time__value\" />\n <TimeSlider.Root className=\"media-slider\">\n <TimeSlider.Track className=\"media-slider__track\">\n <TimeSlider.Fill className=\"media-slider__fill\" />\n <TimeSlider.Buffer className=\"media-slider__buffer\" />\n </TimeSlider.Track>\n <TimeSlider.Thumb className=\"media-slider__thumb\" />\n </TimeSlider.Root>\n <Time.Value type=\"duration\" className=\"media-time__value\" />\n </Time.Group>\n\n <PlaybackRateButton\n render={(props) => <Button {...props} className=\"media-button--icon media-button--playback-rate\" />}\n />\n\n <Popover.Root openOnHover delay={200} closeDelay={100} side=\"top\">\n <Popover.Trigger\n render={\n <MuteButton\n render={(props) => (\n <Button {...props} className=\"media-button--icon media-button--mute\">\n <VolumeOffIcon className=\"media-icon media-icon--volume-off\" />\n <VolumeLowIcon className=\"media-icon media-icon--volume-low\" />\n <VolumeHighIcon className=\"media-icon media-icon--volume-high\" />\n </Button>\n )}\n />\n }\n />\n <Popover.Popup className=\"media-surface media-popup media-popup--volume media-popup-animation\">\n <VolumeSlider.Root className=\"media-slider\" orientation=\"vertical\" thumbAlignment=\"edge\">\n <VolumeSlider.Track className=\"media-slider__track\">\n <VolumeSlider.Fill className=\"media-slider__fill\" />\n </VolumeSlider.Track>\n <VolumeSlider.Thumb className=\"media-slider__thumb media-slider__thumb--persistent\" />\n </VolumeSlider.Root>\n </Popover.Popup>\n </Popover.Root>\n\n <CaptionsButton\n render={(props) => (\n <Button {...props} className=\"media-button--icon media-button--captions\">\n <CaptionsOffIcon className=\"media-icon media-icon--captions-off\" />\n <CaptionsOnIcon className=\"media-icon media-icon--captions-on\" />\n </Button>\n )}\n />\n\n <PiPButton\n render={(props) => (\n <Button {...props} className=\"media-button--icon\">\n <PipIcon className=\"media-icon\" />\n </Button>\n )}\n />\n\n <FullscreenButton\n render={(props) => (\n <Button {...props} className=\"media-button--icon media-button--fullscreen\">\n <FullscreenEnterIcon className=\"media-icon media-icon--fullscreen-enter\" />\n <FullscreenExitIcon className=\"media-icon media-icon--fullscreen-exit\" />\n </Button>\n )}\n />\n </Controls.Root>\n\n {/* <div className=\"media-captions\">\n <div className=\"media-captions__container\">\n <span className=\"media-captions__text\">An example cue</span>\n <span className=\"media-captions__text\">\n <p>Another example cue with HTML</p>\n </span>\n </div>\n </div> */}\n\n <div className=\"media-overlay\" />\n\n {children}\n </Container>\n );\n}\n"],"mappings":"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"}