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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -5,9 +5,19 @@ 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";
13
23
  import CaptionsOffIcon from "../../icons/dist/react/default/captions-off.js";
@@ -24,7 +34,7 @@ import VolumeHighIcon from "../../icons/dist/react/default/volume-high.js";
24
34
  import VolumeLowIcon from "../../icons/dist/react/default/volume-low.js";
25
35
  import VolumeOffIcon from "../../icons/dist/react/default/volume-off.js";
26
36
  import { forwardRef } from "react";
27
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
37
+ import { jsx, jsxs } from "react/jsx-runtime";
28
38
  import { cn } from "@videojs/utils/style";
29
39
 
30
40
  //#region src/presets/video/skin.tsx
@@ -37,75 +47,20 @@ const Button = forwardRef(function Button({ className, ...props }, ref) {
37
47
  ...props
38
48
  });
39
49
  });
40
- function PlayButtonIcon({ state, className, ...rest }) {
41
- const { ended, paused } = state;
42
- return /* @__PURE__ */ jsxs(Fragment, { children: [
43
- /* @__PURE__ */ jsx(RestartIcon, {
44
- ...rest,
45
- className: cn(className, { "media-icon--hidden": !ended })
46
- }),
47
- /* @__PURE__ */ jsx(PlayIcon, {
48
- ...rest,
49
- className: cn(className, { "media-icon--hidden": ended || !paused })
50
- }),
51
- /* @__PURE__ */ jsx(PauseIcon, {
52
- ...rest,
53
- className: cn(className, { "media-icon--hidden": paused })
54
- })
55
- ] });
56
- }
57
- function MuteButtonIcon({ state, className, ...rest }) {
58
- const { muted, volumeLevel } = state;
59
- return /* @__PURE__ */ jsxs(Fragment, { children: [
60
- /* @__PURE__ */ jsx(VolumeOffIcon, {
61
- ...rest,
62
- className: cn(className, { "media-icon--hidden": !muted })
63
- }),
64
- /* @__PURE__ */ jsx(VolumeLowIcon, {
65
- ...rest,
66
- className: cn(className, { "media-icon--hidden": muted || volumeLevel !== "low" })
67
- }),
68
- /* @__PURE__ */ jsx(VolumeHighIcon, {
69
- ...rest,
70
- className: cn(className, { "media-icon--hidden": muted || volumeLevel === "low" })
71
- })
72
- ] });
73
- }
74
- function CaptionsButtonIcon({ state, className, ...rest }) {
75
- const { active } = state;
76
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(CaptionsOffIcon, {
77
- ...rest,
78
- className: cn(className, { "media-icon--hidden": active })
79
- }), /* @__PURE__ */ jsx(CaptionsOnIcon, {
80
- ...rest,
81
- className: cn(className, { "media-icon--hidden": !active })
82
- })] });
83
- }
84
- function FullscreenButtonIcon({ state, className, ...rest }) {
85
- const { fullscreen } = state;
86
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(FullscreenExitIcon, {
87
- ...rest,
88
- className: cn(className, { "media-icon--hidden": !fullscreen })
89
- }), /* @__PURE__ */ jsx(FullscreenEnterIcon, {
90
- ...rest,
91
- className: cn(className, { "media-icon--hidden": fullscreen })
92
- })] });
93
- }
94
50
  function VideoSkin(props) {
95
51
  const { children, className, ...rest } = props;
96
52
  return /* @__PURE__ */ jsxs(Container, {
97
53
  className: cn("media-default-skin", className),
98
54
  ...rest,
99
55
  children: [
100
- children,
101
- /* @__PURE__ */ jsx(BufferingIndicator, { render: (props, state) => state.visible ? /* @__PURE__ */ jsx("div", {
56
+ /* @__PURE__ */ jsx(BufferingIndicator, { render: (props) => /* @__PURE__ */ jsx("div", {
102
57
  ...props,
103
58
  className: "media-buffering-indicator",
104
59
  children: /* @__PURE__ */ jsx("div", {
105
60
  className: "media-surface",
106
61
  children: /* @__PURE__ */ jsx(SpinnerIcon, { className: "media-icon" })
107
62
  })
108
- }) : null }),
63
+ }) }),
109
64
  /* @__PURE__ */ jsx(ErrorDialog, {
110
65
  "aria-labelledby": "media-error-title",
111
66
  "aria-describedby": "media-error-description",
@@ -138,13 +93,14 @@ function VideoSkin(props) {
138
93
  /* @__PURE__ */ jsxs(ControlsRoot, {
139
94
  className: "media-surface media-controls",
140
95
  children: [
141
- /* @__PURE__ */ jsx(PlayButton, { render: (props, state) => /* @__PURE__ */ jsx(Button, {
96
+ /* @__PURE__ */ jsx(PlayButton, { render: (props) => /* @__PURE__ */ jsxs(Button, {
142
97
  ...props,
143
- className: "media-button--icon",
144
- children: /* @__PURE__ */ jsx(PlayButtonIcon, {
145
- state,
146
- className: "media-icon"
147
- })
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
+ ]
148
104
  }) }),
149
105
  /* @__PURE__ */ jsx(SeekButton, {
150
106
  seconds: -SEEK_TIME,
@@ -181,12 +137,12 @@ function VideoSkin(props) {
181
137
  type: "current",
182
138
  className: "media-time__value"
183
139
  }),
184
- /* @__PURE__ */ jsx("div", {
140
+ /* @__PURE__ */ jsxs(TimeSliderRoot, {
185
141
  className: "media-slider",
186
- style: {
187
- height: "4px",
188
- background: "oklab(1 0 0 / 0.2)"
189
- }
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" })]
190
146
  }),
191
147
  /* @__PURE__ */ jsx(Value, {
192
148
  type: "duration",
@@ -194,38 +150,55 @@ function VideoSkin(props) {
194
150
  })
195
151
  ]
196
152
  }),
197
- /* @__PURE__ */ jsx(MuteButton, { render: (props, state) => /* @__PURE__ */ jsx(Button, {
153
+ /* @__PURE__ */ jsx(PlaybackRateButton, { render: (props) => /* @__PURE__ */ jsx(Button, {
198
154
  ...props,
199
- className: "media-button--icon",
200
- children: /* @__PURE__ */ jsx(MuteButtonIcon, {
201
- state,
202
- className: "media-icon"
203
- })
155
+ className: "media-button--icon media-button--playback-rate"
204
156
  }) }),
205
- /* @__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, {
206
184
  ...props,
207
- className: "media-button--icon",
208
- children: /* @__PURE__ */ jsx(CaptionsButtonIcon, {
209
- state,
210
- className: "media-icon"
211
- })
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" })]
212
187
  }) }),
213
188
  /* @__PURE__ */ jsx(PiPButton, { render: (props) => /* @__PURE__ */ jsx(Button, {
214
189
  ...props,
215
190
  className: "media-button--icon",
216
191
  children: /* @__PURE__ */ jsx(PipIcon, { className: "media-icon" })
217
192
  }) }),
218
- /* @__PURE__ */ jsx(FullscreenButton, { render: (props, state) => /* @__PURE__ */ jsx(Button, {
193
+ /* @__PURE__ */ jsx(FullscreenButton, { render: (props) => /* @__PURE__ */ jsxs(Button, {
219
194
  ...props,
220
- className: "media-button--icon",
221
- children: /* @__PURE__ */ jsx(FullscreenButtonIcon, {
222
- state,
223
- className: "media-icon"
224
- })
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" })]
225
197
  }) })
226
198
  ]
227
199
  }),
228
- /* @__PURE__ */ jsx("div", { className: "media-overlay" })
200
+ /* @__PURE__ */ jsx("div", { className: "media-overlay" }),
201
+ children
229
202
  ]
230
203
  });
231
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,MAAM,YAAY;AAIlB,MAAM,SAAS,WAAwD,SAAS,OAAO,EAAE,WAAW,GAAG,SAAS,KAAK;AACnH,QAAO,oBAAC;EAAY;EAAK,MAAK;EAAS,WAAW,GAAG,gBAAgB,UAAU;EAAE,GAAI;GAAS;EAC9F;AAEF,SAAS,eAAe,EAAE,OAAO,WAAW,GAAG,QAA4D;CACzG,MAAM,EAAE,OAAO,WAAW;AAC1B,QACE;EACE,oBAAC;GAAY,GAAI;GAAM,WAAW,GAAG,WAAW,EAAE,sBAAsB,CAAC,OAAO,CAAC;IAAI;EACrF,oBAAC;GAAS,GAAI;GAAM,WAAW,GAAG,WAAW,EAAE,sBAAsB,SAAS,CAAC,QAAQ,CAAC;IAAI;EAC5F,oBAAC;GAAU,GAAI;GAAM,WAAW,GAAG,WAAW,EAAE,sBAAsB,QAAQ,CAAC;IAAI;KAClF;;AAIP,SAAS,eAAe,EAAE,OAAO,WAAW,GAAG,QAA4D;CACzG,MAAM,EAAE,OAAO,gBAAgB;AAC/B,QACE;EACE,oBAAC;GAAc,GAAI;GAAM,WAAW,GAAG,WAAW,EAAE,sBAAsB,CAAC,OAAO,CAAC;IAAI;EACvF,oBAAC;GAAc,GAAI;GAAM,WAAW,GAAG,WAAW,EAAE,sBAAsB,SAAS,gBAAgB,OAAO,CAAC;IAAI;EAC/G,oBAAC;GAAe,GAAI;GAAM,WAAW,GAAG,WAAW,EAAE,sBAAsB,SAAS,gBAAgB,OAAO,CAAC;IAAI;KAC/G;;AAIP,SAAS,mBAAmB,EAAE,OAAO,WAAW,GAAG,QAAgE;CACjH,MAAM,EAAE,WAAW;AACnB,QACE,4CACE,oBAAC;EAAgB,GAAI;EAAM,WAAW,GAAG,WAAW,EAAE,sBAAsB,QAAQ,CAAC;GAAI,EACzF,oBAAC;EAAe,GAAI;EAAM,WAAW,GAAG,WAAW,EAAE,sBAAsB,CAAC,QAAQ,CAAC;GAAI,IACxF;;AAIP,SAAS,qBAAqB,EAAE,OAAO,WAAW,GAAG,QAAkE;CACrH,MAAM,EAAE,eAAe;AACvB,QACE,4CACE,oBAAC;EAAmB,GAAI;EAAM,WAAW,GAAG,WAAW,EAAE,sBAAsB,CAAC,YAAY,CAAC;GAAI,EACjG,oBAAC;EAAoB,GAAI;EAAM,WAAW,GAAG,WAAW,EAAE,sBAAsB,YAAY,CAAC;GAAI,IAChG;;AAIP,SAAgB,UAAU,OAAkC;CAC1D,MAAM,EAAE,UAAU,WAAW,GAAG,SAAS;AAEzC,QACE,qBAAC;EAAU,WAAW,GAAG,sBAAsB,UAAU;EAAE,GAAI;;GAC5D;GAED,oBAAC,sBACC,SAAS,OAAO,UACd,MAAM,UACJ,oBAAC;IAAI,GAAI;IAAO,WAAU;cACxB,oBAAC;KAAI,WAAU;eACb,oBAAC,eAAY,WAAU,eAAe;MAClC;KACF,GACJ,OAEN;GAEF,oBAAC;IACC,mBAAgB;IAChB,oBAAiB;IACjB,SAAS,OAAO,EAAE,gBAChB,oBAAC;KAAI,GAAI;KAAO,WAAU;eACxB,qBAAC;MAAI,WAAU;iBACb,qBAAC;OAAI,WAAU;kBACb,oBAAC;QAAE,IAAG;QAAoB,WAAU;kBAAqB;SAErD,EACJ,oBAAC;QAAE,IAAG;QAA0B,WAAU;kBAA2B;SAEjE;QACA,EACN,oBAAC;OAAI,WAAU;iBACb,oBAAC;QAAO,SAAS;kBAAW;SAAW;QACnC;OACF;MACF;KAER;GAEF,qBAACA;IAAc,WAAU;;KACvB,oBAAC,cACC,SAAS,OAAO,UACd,oBAAC;MAAO,GAAI;MAAO,WAAU;gBAC3B,oBAAC;OAAsB;OAAO,WAAU;QAAe;OAChD,GAEX;KAEF,oBAAC;MACC,SAAS,CAAC;MACV,SAAS,UACP,oBAAC;OAAO,GAAI;OAAO,WAAU;iBAC3B,qBAAC;QAAK,WAAU;mBACd,oBAAC,YAAS,WAAU,oDAAoD,EACxE,oBAAC;SAAK,WAAU;mBAAqB;UAAiB;SACjD;QACA;OAEX;KAEF,oBAAC;MACC,SAAS;MACT,SAAS,UACP,oBAAC;OAAO,GAAI;OAAO,WAAU;iBAC3B,qBAAC;QAAK,WAAU;mBACd,oBAAC,YAAS,WAAU,gCAAgC,EACpD,oBAAC;SAAK,WAAU;mBAAqB;UAAiB;SACjD;QACA;OAEX;KAEF,qBAACC;MAAW,WAAU;;OACpB,oBAACC;QAAW,MAAK;QAAU,WAAU;SAAsB;OAE3D,oBAAC;QAAI,WAAU;QAAe,OAAO;SAAE,QAAQ;SAAO,YAAY;SAAsB;SAAI;OAC5F,oBAACA;QAAW,MAAK;QAAW,WAAU;SAAsB;;OACjD;KAEb,oBAAC,cACC,SAAS,OAAO,UACd,oBAAC;MAAO,GAAI;MAAO,WAAU;gBAC3B,oBAAC;OAAsB;OAAO,WAAU;QAAe;OAChD,GAEX;KAEF,oBAAC,kBACC,SAAS,OAAO,UACd,oBAAC;MAAO,GAAI;MAAO,WAAU;gBAC3B,oBAAC;OAA0B;OAAO,WAAU;QAAe;OACpD,GAEX;KAEF,oBAAC,aACC,SAAS,UACP,oBAAC;MAAO,GAAI;MAAO,WAAU;gBAC3B,oBAAC,WAAQ,WAAU,eAAe;OAC3B,GAEX;KAEF,oBAAC,oBACC,SAAS,OAAO,UACd,oBAAC;MAAO,GAAI;MAAO,WAAU;gBAC3B,oBAAC;OAA4B;OAAO,WAAU;QAAe;OACtD,GAEX;;KACY;GAWhB,oBAAC,SAAI,WAAU,kBAAkB;;GACvB"}
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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"}
@@ -5,11 +5,22 @@ 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 as SliderFill$1 } from "../../ui/slider/slider-fill.js";
15
+ import { SliderThumb as SliderThumb$1 } from "../../ui/slider/slider-thumb.js";
16
+ import { SliderTrack as SliderTrack$1 } 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 { bufferingIndicator, button, controls, error, icon, iconContainer, iconFlipped, iconState, overlay, playbackRate, popup, root, seek, slider, time } from "../../skins/dist/default/video/default.tailwind.js";
13
24
  import CaptionsOffIcon from "../../icons/dist/react/default/captions-off.js";
14
25
  import CaptionsOnIcon from "../../icons/dist/react/default/captions-on.js";
15
26
  import FullscreenEnterIcon from "../../icons/dist/react/default/fullscreen-enter.js";
@@ -24,112 +35,82 @@ import VolumeHighIcon from "../../icons/dist/react/default/volume-high.js";
24
35
  import VolumeLowIcon from "../../icons/dist/react/default/volume-low.js";
25
36
  import VolumeOffIcon from "../../icons/dist/react/default/volume-off.js";
26
37
  import { forwardRef } from "react";
27
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
38
+ import { jsx, jsxs } from "react/jsx-runtime";
28
39
  import { cn } from "@videojs/utils/style";
29
40
 
30
41
  //#region src/presets/video/skin.tailwind.tsx
31
42
  const SEEK_TIME = 10;
32
- const surface = cn("bg-white/10", "backdrop-blur-3xl backdrop-brightness-90 backdrop-saturate-150", "ring ring-white/5 ring-inset shadow-sm shadow-black/15", "after:absolute after:inset-0 after:ring after:rounded-[inherit] after:ring-black/15 after:pointer-events-none after:z-10", "[@media(prefers-reduced-transparency:reduce)]:bg-black/70 [@media(prefers-reduced-transparency:reduce)]:ring-black [@media(prefers-reduced-transparency:reduce)]:after:ring-white/20", "contrast-more:bg-black/90 contrast-more:ring-black contrast-more:after:ring-white/20");
33
- const icon = cn("[grid-area:1/1] size-4.5 shrink-0", "drop-shadow-[0_1px_0_var(--tw-drop-shadow-color)] drop-shadow-black/25", "transition-discrete transition-[display,opacity] duration-150 ease-out");
34
- const iconHidden = "hidden opacity-0";
35
43
  const Button = forwardRef(function Button({ className, variant, ...props }, ref) {
36
44
  return /* @__PURE__ */ jsx("button", {
37
45
  ref,
38
46
  type: "button",
39
- className: cn("shrink-0 border-none cursor-pointer select-none", "outline-2 outline-transparent -outline-offset-2", "transition-[background-color,color,outline-offset] duration-150 ease-out", "disabled:cursor-not-allowed disabled:opacity-50 disabled:grayscale", variant === "icon" ? cn("grid p-2 bg-transparent rounded-full", "text-white/90", "text-shadow-2xs text-shadow-black/25", "hover:bg-white/10 hover:text-white hover:no-underline", "focus-visible:bg-white/10 focus-visible:text-white", "focus-visible:outline-blue-500 focus-visible:outline-offset-2", "aria-expanded:bg-white/10 aria-expanded:text-white") : cn("flex items-center justify-center py-2 px-4 bg-white rounded-full", "text-black font-medium", "focus-visible:outline-blue-500 focus-visible:outline-offset-2"), className),
47
+ className: cn(button.base, variant === "icon" ? button.icon : button.default, className),
48
+ ...props
49
+ });
50
+ });
51
+ const SliderRoot = forwardRef(function SliderRoot({ className, ...props }, ref) {
52
+ return /* @__PURE__ */ jsx("div", {
53
+ ref,
54
+ className: cn(slider.root, className),
55
+ ...props
56
+ });
57
+ });
58
+ const SliderTrack = forwardRef(function SliderTrack({ className, ...props }, ref) {
59
+ return /* @__PURE__ */ jsx("div", {
60
+ ref,
61
+ className: cn(slider.track, className),
62
+ ...props
63
+ });
64
+ });
65
+ const SliderFill = forwardRef(function SliderFill({ type = "fill", className, ...props }, ref) {
66
+ return /* @__PURE__ */ jsx("div", {
67
+ ref,
68
+ className: cn(slider.fill.base, type === "fill" ? slider.fill.fill : slider.fill.buffer, className),
69
+ ...props
70
+ });
71
+ });
72
+ const SliderThumb = forwardRef(function SliderThumb({ persistent, className, ...props }, ref) {
73
+ return /* @__PURE__ */ jsx("div", {
74
+ ref,
75
+ className: cn(slider.thumb.base, persistent ? slider.thumb.persistent : slider.thumb.interactive, className),
40
76
  ...props
41
77
  });
42
78
  });
43
- function PlayButtonIcon({ state, className, ...rest }) {
44
- const { ended, paused } = state;
45
- return /* @__PURE__ */ jsxs(Fragment, { children: [
46
- /* @__PURE__ */ jsx(RestartIcon, {
47
- ...rest,
48
- className: cn(className, { [iconHidden]: !ended })
49
- }),
50
- /* @__PURE__ */ jsx(PlayIcon, {
51
- ...rest,
52
- className: cn(className, { [iconHidden]: ended || !paused })
53
- }),
54
- /* @__PURE__ */ jsx(PauseIcon, {
55
- ...rest,
56
- className: cn(className, { [iconHidden]: paused })
57
- })
58
- ] });
59
- }
60
- function MuteButtonIcon({ state, className, ...rest }) {
61
- const { muted, volumeLevel } = state;
62
- return /* @__PURE__ */ jsxs(Fragment, { children: [
63
- /* @__PURE__ */ jsx(VolumeOffIcon, {
64
- ...rest,
65
- className: cn(className, { [iconHidden]: !muted })
66
- }),
67
- /* @__PURE__ */ jsx(VolumeLowIcon, {
68
- ...rest,
69
- className: cn(className, { [iconHidden]: muted || volumeLevel !== "low" })
70
- }),
71
- /* @__PURE__ */ jsx(VolumeHighIcon, {
72
- ...rest,
73
- className: cn(className, { [iconHidden]: muted || volumeLevel === "low" })
74
- })
75
- ] });
76
- }
77
- function CaptionsButtonIcon({ state, className, ...rest }) {
78
- const { active } = state;
79
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(CaptionsOffIcon, {
80
- ...rest,
81
- className: cn(className, { [iconHidden]: active })
82
- }), /* @__PURE__ */ jsx(CaptionsOnIcon, {
83
- ...rest,
84
- className: cn(className, { [iconHidden]: !active })
85
- })] });
86
- }
87
- function FullscreenButtonIcon({ state, className, ...rest }) {
88
- const { fullscreen } = state;
89
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(FullscreenExitIcon, {
90
- ...rest,
91
- className: cn(className, { [iconHidden]: !fullscreen })
92
- }), /* @__PURE__ */ jsx(FullscreenEnterIcon, {
93
- ...rest,
94
- className: cn(className, { [iconHidden]: fullscreen })
95
- })] });
96
- }
97
79
  function VideoSkinTailwind(props) {
98
80
  const { children, className, ...rest } = props;
99
81
  return /* @__PURE__ */ jsxs(Container, {
100
- className: cn("relative isolate overflow-clip @container/media-root", "rounded-[var(--media-border-radius,2rem)] bg-black", "font-[Inter_Variable,Inter,ui-sans-serif,system-ui,sans-serif] text-[0.8125rem] leading-normal subpixel-antialiased", "**:box-border **:m-0", "[&_button]:font-[inherit]", "motion-safe:[interpolate-size:allow-keywords]", "before:absolute before:pointer-events-none before:rounded-[inherit] before:z-10", "before:inset-px before:ring-1 before:ring-inset before:ring-white/15", "after:absolute after:pointer-events-none after:rounded-[inherit] after:z-10", "after:inset-0 after:ring-1 after:ring-inset after:ring-black/10", "[&>video]:block [&>video]:w-full [&>video]:h-full", "[&>img]:absolute [&>img]:inset-0 [&>img]:w-full [&>img]:h-full", "[&>img]:object-cover [&>img]:pointer-events-none", "[&>img]:transition-opacity [&>img]:duration-[250ms]", "[&>img:not([data-visible])]:opacity-0", "[&:fullscreen]:rounded-none", className),
82
+ className: cn(root, className),
101
83
  ...rest,
102
84
  children: [
103
- children,
104
- /* @__PURE__ */ jsx(BufferingIndicator, { render: (props, state) => state.visible ? /* @__PURE__ */ jsx("div", {
85
+ /* @__PURE__ */ jsx(BufferingIndicator, { render: (props) => /* @__PURE__ */ jsx("div", {
105
86
  ...props,
106
- className: "absolute inset-0 flex items-center justify-center pointer-events-none z-10 text-white",
87
+ className: bufferingIndicator.root,
107
88
  children: /* @__PURE__ */ jsx("div", {
108
- className: cn("p-1 rounded-full", surface),
89
+ className: bufferingIndicator.container,
109
90
  children: /* @__PURE__ */ jsx(SpinnerIcon, { className: icon })
110
91
  })
111
- }) : null }),
92
+ }) }),
112
93
  /* @__PURE__ */ jsx(ErrorDialog, {
113
94
  "aria-labelledby": "media-error-title",
114
95
  "aria-describedby": "media-error-description",
115
96
  render: (props, { onDismiss }) => /* @__PURE__ */ jsx("div", {
116
97
  ...props,
117
- className: "peer/error group/error absolute inset-0 z-20 items-center justify-center pointer-events-none hidden data-[visible]:flex",
98
+ className: error.root,
118
99
  children: /* @__PURE__ */ jsxs("div", {
119
- className: cn("hidden flex-col gap-3 max-w-72 p-3 rounded-[1.75rem] text-white text-sm pointer-events-auto", "group-data-[visible]/error:flex", "transition-[display,opacity,scale,transform] duration-500 delay-100 transition-discrete", "starting:opacity-0 starting:scale-50", "ease-[linear(0,0.034_1.5%,0.763_9.7%,1.066_13.9%,1.198_19.9%,1.184_21.8%,0.963_37.5%,0.997_50.9%,1)]", surface),
100
+ className: error.dialog,
120
101
  children: [/* @__PURE__ */ jsxs("div", {
121
- className: "flex flex-col gap-2 px-2 pt-2 pb-1.5",
102
+ className: error.content,
122
103
  children: [/* @__PURE__ */ jsx("p", {
123
104
  id: "media-error-title",
124
- className: "font-semibold leading-tight",
105
+ className: error.title,
125
106
  children: "Something went wrong."
126
107
  }), /* @__PURE__ */ jsx("p", {
127
108
  id: "media-error-description",
128
- className: "opacity-70",
109
+ className: error.description,
129
110
  children: "An error occurred while trying to play the video. Please try again."
130
111
  })]
131
112
  }), /* @__PURE__ */ jsx("div", {
132
- className: "flex gap-2 *:flex-1",
113
+ className: error.actions,
133
114
  children: /* @__PURE__ */ jsx(Button, {
134
115
  onClick: onDismiss,
135
116
  children: "OK"
@@ -139,26 +120,29 @@ function VideoSkinTailwind(props) {
139
120
  })
140
121
  }),
141
122
  /* @__PURE__ */ jsxs(ControlsRoot, {
142
- className: cn("peer/controls", surface, "absolute @container/media-controls bottom-3 inset-x-3", "p-[0.175rem] flex items-center gap-[0.075rem]", "text-white rounded-full z-10", "will-change-[scale,transform,filter,opacity]", "transition-[scale,transform,filter,opacity] ease-out", "delay-0 duration-100 origin-bottom", "not-data-[visible]:pointer-events-none not-data-[visible]:blur-[8px]", "not-data-[visible]:scale-90 not-data-[visible]:opacity-0", "not-data-[visible]:delay-500 not-data-[visible]:duration-300", "motion-reduce:not-data-[visible]:duration-100", "motion-reduce:not-data-[visible]:blur-none", "motion-reduce:not-data-[visible]:scale-100", "@2xl/media-root:p-1 @2xl/media-root:gap-0.5"),
123
+ "data-controls": "",
124
+ className: controls,
143
125
  children: [
144
- /* @__PURE__ */ jsx(PlayButton, { render: (props, state) => /* @__PURE__ */ jsx(Button, {
126
+ /* @__PURE__ */ jsx(PlayButton, { render: (props) => /* @__PURE__ */ jsxs(Button, {
145
127
  variant: "icon",
146
128
  ...props,
147
- children: /* @__PURE__ */ jsx(PlayButtonIcon, {
148
- state,
149
- className: icon
150
- })
129
+ className: iconState.play.button,
130
+ children: [
131
+ /* @__PURE__ */ jsx(RestartIcon, { className: cn(icon, iconState.play.restart) }),
132
+ /* @__PURE__ */ jsx(PlayIcon, { className: cn(icon, iconState.play.play) }),
133
+ /* @__PURE__ */ jsx(PauseIcon, { className: cn(icon, iconState.play.pause) })
134
+ ]
151
135
  }) }),
152
136
  /* @__PURE__ */ jsx(SeekButton, {
153
137
  seconds: -SEEK_TIME,
154
138
  render: (props) => /* @__PURE__ */ jsx(Button, {
155
139
  variant: "icon",
156
140
  ...props,
157
- className: "@max-md/media-controls:hidden",
141
+ className: seek.button,
158
142
  children: /* @__PURE__ */ jsxs("span", {
159
- className: "relative",
160
- children: [/* @__PURE__ */ jsx(SeekIcon, { className: cn(icon, "[scale:-1_1]") }), /* @__PURE__ */ jsx("span", {
161
- className: "absolute left-0 -bottom-0.75 text-[0.75em] font-[480] tabular-nums",
143
+ className: iconContainer,
144
+ children: [/* @__PURE__ */ jsx(SeekIcon, { className: cn(icon, iconFlipped) }), /* @__PURE__ */ jsx("span", {
145
+ className: cn(seek.label, seek.labelBackward),
162
146
  children: SEEK_TIME
163
147
  })]
164
148
  })
@@ -169,62 +153,95 @@ function VideoSkinTailwind(props) {
169
153
  render: (props) => /* @__PURE__ */ jsx(Button, {
170
154
  variant: "icon",
171
155
  ...props,
172
- className: "@max-md/media-controls:hidden",
156
+ className: seek.button,
173
157
  children: /* @__PURE__ */ jsxs("span", {
174
- className: "relative",
158
+ className: iconContainer,
175
159
  children: [/* @__PURE__ */ jsx(SeekIcon, { className: icon }), /* @__PURE__ */ jsx("span", {
176
- className: "absolute right-0 -bottom-0.75 text-[0.75em] font-[480] tabular-nums",
160
+ className: cn(seek.label, seek.labelForward),
177
161
  children: SEEK_TIME
178
162
  })]
179
163
  })
180
164
  })
181
165
  }),
182
166
  /* @__PURE__ */ jsxs(Group, {
183
- className: "@container/media-time flex items-center flex-1 gap-3 px-2",
167
+ className: time.group,
184
168
  children: [
185
169
  /* @__PURE__ */ jsx(Value, {
186
170
  type: "current",
187
- className: "hidden @2xs/media-time:block text-shadow-2xs text-shadow-black/25 tabular-nums"
171
+ className: time.current
172
+ }),
173
+ /* @__PURE__ */ jsxs(TimeSliderRoot, {
174
+ render: (props) => /* @__PURE__ */ jsx(SliderRoot, { ...props }),
175
+ children: [/* @__PURE__ */ jsxs(SliderTrack$1, {
176
+ render: (props) => /* @__PURE__ */ jsx(SliderTrack, { ...props }),
177
+ children: [/* @__PURE__ */ jsx(SliderFill$1, { render: (props) => /* @__PURE__ */ jsx(SliderFill, { ...props }) }), /* @__PURE__ */ jsx(SliderBuffer, { render: (props) => /* @__PURE__ */ jsx(SliderFill, {
178
+ type: "buffer",
179
+ ...props
180
+ }) })]
181
+ }), /* @__PURE__ */ jsx(SliderThumb$1, { render: (props) => /* @__PURE__ */ jsx(SliderThumb, { ...props }) })]
188
182
  }),
189
- /* @__PURE__ */ jsx("div", { className: "flex-1 h-1 rounded-full bg-white/20" }),
190
183
  /* @__PURE__ */ jsx(Value, {
191
184
  type: "duration",
192
- className: "text-shadow-2xs text-shadow-black/25 tabular-nums"
185
+ className: time.duration
193
186
  })
194
187
  ]
195
188
  }),
196
- /* @__PURE__ */ jsx(CaptionsButton, { render: (props, state) => /* @__PURE__ */ jsx(Button, {
189
+ /* @__PURE__ */ jsx(PlaybackRateButton, { render: (props) => /* @__PURE__ */ jsx(Button, {
197
190
  variant: "icon",
198
191
  ...props,
199
- children: /* @__PURE__ */ jsx(CaptionsButtonIcon, {
200
- state,
201
- className: icon
202
- })
192
+ className: playbackRate.button
203
193
  }) }),
204
- /* @__PURE__ */ jsx(MuteButton, { render: (props, state) => /* @__PURE__ */ jsx(Button, {
194
+ /* @__PURE__ */ jsxs(PopoverRoot, {
195
+ openOnHover: true,
196
+ delay: 200,
197
+ closeDelay: 100,
198
+ side: "top",
199
+ children: [/* @__PURE__ */ jsx(PopoverTrigger, { render: /* @__PURE__ */ jsx(MuteButton, { render: (props) => /* @__PURE__ */ jsxs(Button, {
200
+ variant: "icon",
201
+ ...props,
202
+ className: iconState.mute.button,
203
+ children: [
204
+ /* @__PURE__ */ jsx(VolumeOffIcon, { className: cn(icon, iconState.mute.volumeOff) }),
205
+ /* @__PURE__ */ jsx(VolumeLowIcon, { className: cn(icon, iconState.mute.volumeLow) }),
206
+ /* @__PURE__ */ jsx(VolumeHighIcon, { className: cn(icon, iconState.mute.volumeHigh) })
207
+ ]
208
+ }) }) }), /* @__PURE__ */ jsx(PopoverPopup, {
209
+ className: cn(popup.base, popup.volume),
210
+ children: /* @__PURE__ */ jsxs(VolumeSliderRoot, {
211
+ orientation: "vertical",
212
+ thumbAlignment: "edge",
213
+ render: (props) => /* @__PURE__ */ jsx(SliderRoot, { ...props }),
214
+ children: [/* @__PURE__ */ jsx(SliderTrack$1, {
215
+ render: (props) => /* @__PURE__ */ jsx(SliderTrack, { ...props }),
216
+ children: /* @__PURE__ */ jsx(SliderFill$1, { render: (props) => /* @__PURE__ */ jsx(SliderFill, { ...props }) })
217
+ }), /* @__PURE__ */ jsx(SliderThumb$1, { render: (props) => /* @__PURE__ */ jsx(SliderThumb, {
218
+ persistent: true,
219
+ ...props
220
+ }) })]
221
+ })
222
+ })]
223
+ }),
224
+ /* @__PURE__ */ jsx(CaptionsButton, { render: (props) => /* @__PURE__ */ jsxs(Button, {
205
225
  variant: "icon",
206
226
  ...props,
207
- children: /* @__PURE__ */ jsx(MuteButtonIcon, {
208
- state,
209
- className: icon
210
- })
227
+ className: iconState.captions.button,
228
+ children: [/* @__PURE__ */ jsx(CaptionsOffIcon, { className: cn(icon, iconState.captions.off) }), /* @__PURE__ */ jsx(CaptionsOnIcon, { className: cn(icon, iconState.captions.on) })]
211
229
  }) }),
212
230
  /* @__PURE__ */ jsx(PiPButton, { render: (props) => /* @__PURE__ */ jsx(Button, {
213
231
  variant: "icon",
214
232
  ...props,
215
233
  children: /* @__PURE__ */ jsx(PipIcon, { className: icon })
216
234
  }) }),
217
- /* @__PURE__ */ jsx(FullscreenButton, { render: (props, state) => /* @__PURE__ */ jsx(Button, {
235
+ /* @__PURE__ */ jsx(FullscreenButton, { render: (props) => /* @__PURE__ */ jsxs(Button, {
218
236
  variant: "icon",
219
237
  ...props,
220
- children: /* @__PURE__ */ jsx(FullscreenButtonIcon, {
221
- state,
222
- className: icon
223
- })
238
+ className: iconState.fullscreen.button,
239
+ children: [/* @__PURE__ */ jsx(FullscreenEnterIcon, { className: cn(icon, iconState.fullscreen.enter) }), /* @__PURE__ */ jsx(FullscreenExitIcon, { className: cn(icon, iconState.fullscreen.exit) })]
224
240
  }) })
225
241
  ]
226
242
  }),
227
- /* @__PURE__ */ jsx("div", { className: cn("absolute inset-0 flex flex-col items-start", "pointer-events-none rounded-[inherit]", "opacity-0", "bg-gradient-to-t from-black/50 via-black/30 to-transparent", "backdrop-blur-[0px] backdrop-saturate-120 backdrop-brightness-90", "transition-[opacity,backdrop-filter] ease-out", "duration-300 delay-500", "peer-data-[visible]/controls:opacity-100", "peer-data-[visible]/controls:duration-150", "peer-data-[visible]/controls:delay-0", "peer-data-[visible]/error:opacity-100", "peer-data-[visible]/error:duration-150", "peer-data-[visible]/error:delay-0", "peer-data-[visible]/error:backdrop-blur-[8px]", "motion-reduce:duration-100") })
243
+ /* @__PURE__ */ jsx("div", { className: overlay }),
244
+ children
228
245
  ]
229
246
  });
230
247
  }