@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
@@ -1 +1 @@
1
- {"version":3,"file":"minimal-skin.tailwind.js","names":["Controls.Root","Time.Group","Time.Value","Time.Separator"],"sources":["../../../../src/presets/video/minimal-skin.tailwind.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/minimal';\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 { MinimalVideoSkinProps } from './minimal-skin';\n\nconst SEEK_TIME = 10;\n\n/* ------------------------------------ Reused fragments ------------------------------------- */\n\nconst icon = cn(\n '[grid-area:1/1] size-4.5',\n 'drop-shadow-[0_1px_0_var(--tw-drop-shadow-color)] drop-shadow-black/25',\n 'transition-discrete transition-[display,opacity] duration-150 ease-out'\n);\n\nconst iconHidden = 'hidden opacity-0';\n\n/* --------------------------------------- Components ---------------------------------------- */\n\nconst Button = forwardRef<HTMLButtonElement, ComponentProps<'button'> & { variant?: 'icon' }>(function Button(\n { className, variant, ...props },\n ref\n) {\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n // Shared\n 'shrink-0 border-none cursor-pointer select-none',\n 'outline-2 outline-transparent -outline-offset-2',\n 'transition-[background-color,color,outline-offset] duration-150 ease-out',\n 'disabled:cursor-not-allowed disabled:opacity-50 disabled:grayscale',\n // Variant\n variant === 'icon'\n ? cn(\n 'grid p-2.5 bg-transparent rounded-md',\n 'text-white',\n 'hover:text-white/80 hover:no-underline',\n 'focus-visible:text-white/80',\n 'focus-visible:outline-white focus-visible:outline-offset-2',\n 'aria-expanded:text-white/80'\n )\n : cn(\n 'flex items-center justify-center py-2 px-4 bg-white rounded-lg',\n 'text-black font-medium',\n 'focus-visible:outline-white focus-visible:outline-offset-2'\n ),\n className\n )}\n {...props}\n />\n );\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, { [iconHidden]: !ended })} />\n <PlayIcon {...rest} className={cn(className, { [iconHidden]: ended || !paused })} />\n <PauseIcon {...rest} className={cn(className, { [iconHidden]: 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, { [iconHidden]: !muted })} />\n <VolumeLowIcon {...rest} className={cn(className, { [iconHidden]: muted || volumeLevel !== 'low' })} />\n <VolumeHighIcon {...rest} className={cn(className, { [iconHidden]: 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, { [iconHidden]: active })} />\n <CaptionsOnIcon {...rest} className={cn(className, { [iconHidden]: !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, { [iconHidden]: !fullscreen })} />\n <FullscreenEnterIcon {...rest} className={cn(className, { [iconHidden]: fullscreen })} />\n </>\n );\n}\n\n/* ------------------------------------------ Skin ------------------------------------------- */\n\nexport function MinimalVideoSkinTailwind(props: MinimalVideoSkinProps): ReactNode {\n const { children, className, ...rest } = props;\n\n return (\n <Container\n className={cn(\n // Layout & containment\n 'relative isolate overflow-clip @container/media-root',\n // Appearance\n 'rounded-[var(--media-border-radius,0.75rem)] bg-black',\n 'font-[Inter_Variable,Inter,ui-sans-serif,system-ui,sans-serif] text-[0.8125rem] leading-normal subpixel-antialiased',\n // Resets\n '**:box-border **:m-0',\n '[&_button]:font-[inherit]',\n 'motion-safe:[interpolate-size:allow-keywords]',\n // Outer border ring (::after only)\n 'after:absolute after:pointer-events-none after:rounded-[inherit] after:z-10',\n 'after:inset-0 after:ring-1 after:ring-inset after:ring-black/15',\n 'dark:after:ring-white/15',\n // Video element\n '[&>video]:block [&>video]:w-full [&>video]:h-full',\n // Poster image\n '[&>img]:absolute [&>img]:inset-0 [&>img]:w-full [&>img]:h-full',\n '[&>img]:object-cover [&>img]:pointer-events-none',\n '[&>img]:transition-opacity [&>img]:duration-[250ms]',\n '[&>img:not([data-visible])]:opacity-0',\n // Fullscreen\n '[&:fullscreen]:rounded-none',\n className\n )}\n {...rest}\n >\n {children}\n\n <BufferingIndicator\n render={(props, state) =>\n state.visible ? (\n <div\n {...props}\n className=\"absolute inset-0 flex items-center justify-center pointer-events-none z-10 text-white\"\n >\n <SpinnerIcon className={icon} />\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\n {...props}\n className=\"peer/error group/error absolute inset-0 z-20 items-center justify-center pointer-events-none hidden data-[visible]:flex\"\n >\n <div\n className={cn(\n 'hidden flex-col gap-3 max-w-64 p-4 text-white text-sm pointer-events-auto',\n 'group-data-[visible]/error:flex',\n 'text-shadow-2xs text-shadow-black/50',\n 'transition-[display,opacity,scale,transform] duration-500 delay-100 transition-discrete',\n 'starting:opacity-0 starting:scale-50',\n '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)]'\n )}\n >\n <div className=\"flex flex-col gap-2 py-1.5\">\n <p id=\"media-error-title\" className=\"font-semibold leading-tight\">\n Something went wrong.\n </p>\n <p id=\"media-error-description\">An error occurred while trying to play the video. Please try again.</p>\n </div>\n <div className=\"flex gap-2 *:flex-1\">\n <Button onClick={onDismiss}>OK</Button>\n </div>\n </div>\n </div>\n )}\n />\n\n <Controls.Root\n className={cn(\n // Peer marker for overlay/captions\n 'peer/controls',\n // Layout\n 'absolute @container/media-controls bottom-0 inset-x-0',\n 'pt-8 px-1.5 pb-1.5 flex items-center gap-2',\n 'text-white z-10',\n // Transitions\n 'will-change-[translate,filter,opacity]',\n 'transition-[translate,filter,opacity] ease-out',\n 'delay-0 duration-75',\n // Hidden state\n 'not-data-[visible]:opacity-0 not-data-[visible]:translate-y-full',\n 'not-data-[visible]:blur-[8px] not-data-[visible]:pointer-events-none',\n 'not-data-[visible]:delay-500 not-data-[visible]:duration-500',\n // Reduced motion + hidden\n 'motion-reduce:not-data-[visible]:duration-100',\n 'motion-reduce:not-data-[visible]:translate-y-0',\n 'motion-reduce:not-data-[visible]:blur-none motion-reduce:not-data-[visible]:scale-100',\n // Wider container\n '@sm/media-root:pt-10 @sm/media-root:px-3 @sm/media-root:pb-3',\n '@sm/media-root:gap-3.5'\n )}\n >\n <span className={cn('flex items-center gap-[0.075rem]', '@2xl/media-root:gap-0.5')}>\n <PlayButton\n render={(props, state) => (\n <Button variant=\"icon\" {...props}>\n <PlayButtonIcon state={state} className={icon} />\n </Button>\n )}\n />\n\n <SeekButton\n seconds={-SEEK_TIME}\n render={(props) => (\n <Button variant=\"icon\" {...props} className=\"@max-md/media-controls:hidden\">\n <span className=\"relative\">\n <SeekIcon className={cn(icon, '[scale:-1_1]')} />\n <span className=\"absolute left-0 -bottom-0.75 text-[0.75em] font-[480] tabular-nums\">\n {SEEK_TIME}\n </span>\n </span>\n </Button>\n )}\n />\n\n <SeekButton\n seconds={SEEK_TIME}\n render={(props) => (\n <Button variant=\"icon\" {...props} className=\"@max-md/media-controls:hidden\">\n <span className=\"relative\">\n <SeekIcon className={icon} />\n <span className=\"absolute right-0 -bottom-0.75 text-[0.75em] font-[480] tabular-nums\">\n {SEEK_TIME}\n </span>\n </span>\n </Button>\n )}\n />\n </span>\n\n <span className={cn('flex flex-row-reverse items-center flex-1 gap-3', '@md/media-controls:flex-row')}>\n <Time.Group className=\"flex items-center gap-1\">\n <Time.Value\n type=\"current\"\n className={cn('hidden tabular-nums text-shadow-2xs text-shadow-black/25', '@md/media-controls:inline')}\n />\n <Time.Separator className={cn('hidden', '@md/media-controls:inline @md/media-controls:text-white/50')} />\n <Time.Value\n type=\"duration\"\n className={cn('tabular-nums text-shadow-2xs text-shadow-black/25', '@md/media-controls:text-white/50')}\n />\n </Time.Group>\n\n {/* Temporary spacer */}\n <span className=\"flex-1 h-[3px] rounded-full bg-white/20\" />\n </span>\n\n <span className={cn('flex items-center gap-[0.075rem]', '@2xl/media-root:gap-0.5')}>\n <MuteButton\n render={(props, state) => (\n <Button variant=\"icon\" {...props}>\n <MuteButtonIcon state={state} className={icon} />\n </Button>\n )}\n />\n\n <CaptionsButton\n render={(props, state) => (\n <Button variant=\"icon\" {...props}>\n <CaptionsButtonIcon state={state} className={icon} />\n </Button>\n )}\n />\n\n <PiPButton\n render={(props) => (\n <Button variant=\"icon\" {...props}>\n <PipIcon className={icon} />\n </Button>\n )}\n />\n\n <FullscreenButton\n render={(props, state) => (\n <Button variant=\"icon\" {...props}>\n <FullscreenButtonIcon state={state} className={icon} />\n </Button>\n )}\n />\n </span>\n </Controls.Root>\n\n {/* <div\n className={cn(\n 'absolute z-20 pointer-events-none text-balance text-base',\n 'inset-x-4 bottom-6',\n 'transition-transform duration-150 ease-out delay-600',\n 'motion-reduce:duration-50',\n // Responsive font sizes\n '@xs/media-root:text-2xl',\n '@3xl/media-root:text-3xl',\n '@7xl/media-root:text-4xl',\n // Shift up when controls visible\n 'peer-data-[visible]/controls:-translate-y-10 peer-data-[visible]/controls:delay-25',\n )}\n >\n <div className=\"max-w-[42ch] mx-auto text-center flex flex-col items-center\">\n <span className={cn(\n 'block py-0.5 px-2 text-white text-center whitespace-pre-wrap leading-1.2',\n '[text-shadow:0_0_1px_oklab(0_0_0_/_0.7),0_0_8px_oklab(0_0_0_/_0.7)]',\n 'contrast-more:[text-shadow:none] contrast-more:[box-decoration-break:clone] contrast-more:bg-black/70',\n '*:inline',\n )}>\n An example cue\n </span>\n </div>\n </div> */}\n\n <div\n className={cn(\n // Layout\n 'absolute inset-0 flex flex-col items-start',\n 'pointer-events-none rounded-[inherit]',\n // Default: hidden\n 'opacity-0',\n 'bg-gradient-to-t from-black/70 via-black/50 via-[7.5rem] to-transparent',\n 'backdrop-blur-[0px] backdrop-saturate-120 backdrop-brightness-90',\n // Transitions\n 'transition-[opacity,backdrop-filter] ease-out',\n 'duration-500 delay-500',\n // Shown when controls visible\n 'peer-data-[visible]/controls:opacity-100',\n 'peer-data-[visible]/controls:duration-150',\n 'peer-data-[visible]/controls:delay-0',\n // Shown when error visible (+ blur)\n 'peer-data-[visible]/error:opacity-100',\n 'peer-data-[visible]/error:duration-150',\n 'peer-data-[visible]/error:delay-0',\n 'peer-data-[visible]/error:backdrop-blur-[8px]',\n // Reduced motion\n 'motion-reduce:duration-100'\n )}\n />\n </Container>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"minimal-skin.tailwind.js","names":["Controls.Root","Time.Group","Time.Value","Time.Separator","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/minimal-skin.tailwind.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/minimal';\nimport { playbackRate } from '@videojs/skins/video/default.tailwind';\nimport {\n bufferingIndicator,\n button,\n buttonGroup,\n controls,\n error,\n icon,\n iconContainer,\n iconFlipped,\n iconState,\n overlay,\n popup,\n root,\n seek,\n slider,\n time,\n} from '@videojs/skins/video/minimal.tailwind';\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 { MinimalVideoSkinProps } from './minimal-skin';\n\nconst SEEK_TIME = 10;\n\n/* --------------------------------------- Components ---------------------------------------- */\n\nconst Button = forwardRef<HTMLButtonElement, ComponentProps<'button'> & { variant?: 'icon' }>(function Button(\n { className, variant, ...props },\n ref\n) {\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(button.base, variant === 'icon' ? button.icon : button.default, className)}\n {...props}\n />\n );\n});\n\nconst SliderRoot = forwardRef<HTMLDivElement, ComponentProps<'div'>>(function SliderRoot({ className, ...props }, ref) {\n return <div ref={ref} className={cn(slider.root, className)} {...props} />;\n});\n\nconst SliderTrack = forwardRef<HTMLDivElement, ComponentProps<'div'>>(function SliderTrack(\n { className, ...props },\n ref\n) {\n return <div ref={ref} className={cn(slider.track, className)} {...props} />;\n});\n\nconst SliderFill = forwardRef<HTMLDivElement, ComponentProps<'div'> & { type?: 'fill' | 'buffer' }>(function SliderFill(\n { type = 'fill', className, ...props },\n ref\n) {\n return (\n <div\n ref={ref}\n className={cn(slider.fill.base, type === 'fill' ? slider.fill.fill : slider.fill.buffer, className)}\n {...props}\n />\n );\n});\n\nconst SliderThumb = forwardRef<HTMLDivElement, ComponentProps<'div'> & { persistent?: boolean }>(function SliderThumb(\n { persistent, className, ...props },\n ref\n) {\n return (\n <div\n ref={ref}\n className={cn(slider.thumb.base, persistent ? undefined : slider.thumb.interactive, className)}\n {...props}\n />\n );\n});\n\n/* ------------------------------------------ Skin ------------------------------------------- */\n\nexport function MinimalVideoSkinTailwind(props: MinimalVideoSkinProps): ReactNode {\n const { children, className, ...rest } = props;\n\n return (\n <Container className={cn(root, className)} {...rest}>\n <BufferingIndicator\n render={(props) => (\n <div {...props} className={bufferingIndicator}>\n <SpinnerIcon className={icon} />\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={error.root}>\n <div className={error.dialog}>\n <div className={error.content}>\n <p id=\"media-error-title\" className={error.title}>\n Something went wrong.\n </p>\n <p id=\"media-error-description\">An error occurred while trying to play the video. Please try again.</p>\n </div>\n <div className={error.actions}>\n <Button onClick={onDismiss}>OK</Button>\n </div>\n </div>\n </div>\n )}\n />\n\n <Controls.Root\n data-controls=\"\" // Used as a hook for Tailwind has-[] styles\n className={controls}\n >\n <span className={buttonGroup}>\n <PlayButton\n render={(props) => (\n <Button variant=\"icon\" {...props} className={iconState.play.button}>\n <RestartIcon className={cn(icon, iconState.play.restart)} />\n <PlayIcon className={cn(icon, iconState.play.play)} />\n <PauseIcon className={cn(icon, iconState.play.pause)} />\n </Button>\n )}\n />\n\n <SeekButton\n seconds={-SEEK_TIME}\n render={(props) => (\n <Button variant=\"icon\" {...props} className={seek.button}>\n <span className={iconContainer}>\n <SeekIcon className={cn(icon, iconFlipped)} />\n <span className={cn(seek.label, seek.labelBackward)}>{SEEK_TIME}</span>\n </span>\n </Button>\n )}\n />\n\n <SeekButton\n seconds={SEEK_TIME}\n render={(props) => (\n <Button variant=\"icon\" {...props} className={seek.button}>\n <span className={iconContainer}>\n <SeekIcon className={icon} />\n <span className={cn(seek.label, seek.labelForward)}>{SEEK_TIME}</span>\n </span>\n </Button>\n )}\n />\n </span>\n\n <span className={time.controls}>\n <Time.Group className={time.group}>\n <Time.Value type=\"current\" className={time.current} />\n <Time.Separator className={time.separator} />\n <Time.Value type=\"duration\" className={time.duration} />\n </Time.Group>\n\n <TimeSlider.Root render={(props) => <SliderRoot {...props} />}>\n <TimeSlider.Track render={(props) => <SliderTrack {...props} />}>\n <TimeSlider.Fill render={(props) => <SliderFill {...props} />} />\n <TimeSlider.Buffer render={(props) => <SliderFill type=\"buffer\" {...props} />} />\n </TimeSlider.Track>\n <TimeSlider.Thumb render={(props) => <SliderThumb {...props} />} />\n </TimeSlider.Root>\n </span>\n\n <span className={buttonGroup}>\n <PlaybackRateButton\n render={(props) => <Button variant=\"icon\" {...props} className={playbackRate.button} />}\n />\n\n <Popover.Root openOnHover delay={200} closeDelay={100} side=\"top\">\n <Popover.Trigger\n render={\n <MuteButton\n render={(props) => (\n <Button variant=\"icon\" {...props} className={iconState.mute.button}>\n <VolumeOffIcon className={cn(icon, iconState.mute.volumeOff)} />\n <VolumeLowIcon className={cn(icon, iconState.mute.volumeLow)} />\n <VolumeHighIcon className={cn(icon, iconState.mute.volumeHigh)} />\n </Button>\n )}\n />\n }\n />\n <Popover.Popup className={cn(popup.base, popup.volume)}>\n <VolumeSlider.Root\n orientation=\"vertical\"\n thumbAlignment=\"edge\"\n render={(props) => <SliderRoot {...props} />}\n >\n <VolumeSlider.Track render={(props) => <SliderTrack {...props} />}>\n <VolumeSlider.Fill render={(props) => <SliderFill {...props} />} />\n </VolumeSlider.Track>\n <VolumeSlider.Thumb render={(props) => <SliderThumb persistent {...props} />} />\n </VolumeSlider.Root>\n </Popover.Popup>\n </Popover.Root>\n\n <CaptionsButton\n render={(props) => (\n <Button variant=\"icon\" {...props} className={iconState.captions.button}>\n <CaptionsOffIcon className={cn(icon, iconState.captions.off)} />\n <CaptionsOnIcon className={cn(icon, iconState.captions.on)} />\n </Button>\n )}\n />\n\n <PiPButton\n render={(props) => (\n <Button variant=\"icon\" {...props}>\n <PipIcon className={icon} />\n </Button>\n )}\n />\n\n <FullscreenButton\n render={(props) => (\n <Button variant=\"icon\" {...props} className={iconState.fullscreen.button}>\n <FullscreenEnterIcon className={cn(icon, iconState.fullscreen.enter)} />\n <FullscreenExitIcon className={cn(icon, iconState.fullscreen.exit)} />\n </Button>\n )}\n />\n </span>\n </Controls.Root>\n\n {/* <div className={captions.root}>\n <div className={captions.container}>\n <span className={captions.cue}>\n An example cue\n </span>\n </div>\n </div> */}\n\n <div className={overlay} />\n\n {children}\n </Container>\n );\n}\n"],"mappings":"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"}
@@ -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
+