@videojs/react 10.0.0-beta.28 → 10.0.0-beta.29

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 (259) hide show
  1. package/dist/default/__generated__/skins/default-video/styles/buttons.css +132 -18
  2. package/dist/default/__generated__/skins/default-video/styles/captions.css +22 -0
  3. package/dist/default/__generated__/skins/default-video/styles/container.css +121 -8
  4. package/dist/default/__generated__/skins/default-video/styles/controls.css +436 -21
  5. package/dist/default/__generated__/skins/default-video/styles/dialog.css +169 -0
  6. package/dist/default/__generated__/skins/default-video/styles/indicator.css +459 -0
  7. package/dist/default/__generated__/skins/default-video/styles/menus.css +254 -0
  8. package/dist/default/__generated__/skins/default-video/styles/overlays.css +26 -2
  9. package/dist/default/__generated__/skins/default-video/styles/popups.css +338 -12
  10. package/dist/default/__generated__/skins/default-video/styles/poster.css +4 -4
  11. package/dist/default/__generated__/skins/default-video/styles/sliders.css +355 -31
  12. package/dist/default/__generated__/skins/default-video/styles/styles.css +2455 -216
  13. package/dist/default/__generated__/skins/default-video/styles/theme.css +4 -19
  14. package/dist/default/__generated__/skins/default-video/styles/video.css +29 -0
  15. package/dist/default/__generated__/skins/minimal-video/styles/base.css +25 -0
  16. package/dist/default/__generated__/skins/minimal-video/styles/buttons.css +266 -0
  17. package/dist/default/__generated__/skins/minimal-video/styles/captions.css +22 -0
  18. package/dist/default/__generated__/skins/minimal-video/styles/container.css +158 -0
  19. package/dist/default/__generated__/skins/minimal-video/styles/controls.css +182 -0
  20. package/dist/default/__generated__/skins/minimal-video/styles/dialog.css +77 -0
  21. package/dist/default/__generated__/skins/minimal-video/styles/indicator.css +322 -0
  22. package/dist/default/__generated__/skins/minimal-video/styles/menus.css +254 -0
  23. package/dist/default/__generated__/skins/minimal-video/styles/overlays.css +35 -0
  24. package/dist/default/__generated__/skins/minimal-video/styles/popups.css +371 -0
  25. package/dist/default/__generated__/skins/minimal-video/styles/poster.css +47 -0
  26. package/dist/default/__generated__/skins/minimal-video/styles/sliders.css +436 -0
  27. package/dist/default/__generated__/skins/minimal-video/styles/styles.css +2246 -0
  28. package/dist/default/__generated__/skins/minimal-video/styles/theme.css +7 -0
  29. package/dist/default/__generated__/skins/minimal-video/styles/video.css +29 -0
  30. package/dist/default/i18n/index.js +2 -1
  31. package/dist/default/i18n/text.js +20 -0
  32. package/dist/default/i18n/text.js.map +1 -0
  33. package/dist/default/icons/dist/react/default/airplay-exit.js +3 -3
  34. package/dist/default/icons/dist/react/default/airplay-exit.js.map +1 -1
  35. package/dist/default/icons/dist/react/minimal/airplay-exit.js +3 -3
  36. package/dist/default/icons/dist/react/minimal/airplay-exit.js.map +1 -1
  37. package/dist/default/index.js +2 -1
  38. package/dist/default/media/hls-background-video/media.js +18 -3
  39. package/dist/default/media/hls-background-video/media.js.map +1 -1
  40. package/dist/default/presets/audio/minimal-skin.css +103 -101
  41. package/dist/default/presets/audio/minimal-skin.js +1 -1
  42. package/dist/default/presets/audio/minimal-skin.tailwind.js +1 -1
  43. package/dist/default/presets/audio/skin.css +68 -69
  44. package/dist/default/presets/audio/skin.js +1 -1
  45. package/dist/default/presets/audio/skin.tailwind.js +1 -1
  46. package/dist/default/presets/live-audio/minimal-skin.css +103 -101
  47. package/dist/default/presets/live-audio/skin.css +68 -69
  48. package/dist/default/presets/live-video/minimal-skin.css +140 -120
  49. package/dist/default/presets/live-video/minimal-skin.js +3 -8
  50. package/dist/default/presets/live-video/minimal-skin.js.map +1 -1
  51. package/dist/default/presets/live-video/minimal-skin.tailwind.js +5 -8
  52. package/dist/default/presets/live-video/minimal-skin.tailwind.js.map +1 -1
  53. package/dist/default/presets/live-video/skin.css +89 -76
  54. package/dist/default/presets/live-video/skin.js +3 -8
  55. package/dist/default/presets/live-video/skin.js.map +1 -1
  56. package/dist/default/presets/live-video/skin.tailwind.js +7 -10
  57. package/dist/default/presets/live-video/skin.tailwind.js.map +1 -1
  58. package/dist/default/presets/video/minimal-skin.css +140 -120
  59. package/dist/default/presets/video/minimal-skin.js +3 -8
  60. package/dist/default/presets/video/minimal-skin.js.map +1 -1
  61. package/dist/default/presets/video/minimal-skin.tailwind.js +5 -8
  62. package/dist/default/presets/video/minimal-skin.tailwind.js.map +1 -1
  63. package/dist/default/presets/video/skin.css +89 -76
  64. package/dist/default/presets/video/skin.js +3 -8
  65. package/dist/default/presets/video/skin.js.map +1 -1
  66. package/dist/default/presets/video/skin.tailwind.js +6 -9
  67. package/dist/default/presets/video/skin.tailwind.js.map +1 -1
  68. package/dist/default/skins/dist/default/default/tailwind/components/button.js +3 -1
  69. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  70. package/dist/default/skins/dist/default/default/tailwind/components/poster.js +8 -1
  71. package/dist/default/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
  72. package/dist/default/skins/dist/default/default/tailwind/components/slider.js +10 -10
  73. package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  74. package/dist/default/skins/dist/default/default/tailwind/components/thumbnail.js +1 -1
  75. package/dist/default/skins/dist/default/default/tailwind/components/thumbnail.js.map +1 -1
  76. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +2 -2
  77. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  78. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js +8 -1
  79. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
  80. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +13 -12
  81. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  82. package/dist/default/skins/dist/default/minimal/tailwind/components/thumbnail.js +1 -1
  83. package/dist/default/skins/dist/default/minimal/tailwind/components/thumbnail.js.map +1 -1
  84. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +6 -5
  85. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  86. package/dist/default/skins/dist/default/shared/tailwind/icon-state.js +4 -4
  87. package/dist/default/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
  88. package/dist/default/ui/gesture/gesture.js.map +1 -1
  89. package/dist/default/ui/gesture/use-doubletap-gesture.js.map +1 -1
  90. package/dist/default/ui/gesture/use-tap-gesture.js.map +1 -1
  91. package/dist/default/ui/hotkey/hotkey.js.map +1 -1
  92. package/dist/default/ui/menu/context.js +6 -1
  93. package/dist/default/ui/menu/context.js.map +1 -1
  94. package/dist/default/ui/menu/menu-item-indicator.js +3 -2
  95. package/dist/default/ui/menu/menu-item-indicator.js.map +1 -1
  96. package/dist/default/ui/menu/menu-radio-item.js +19 -15
  97. package/dist/default/ui/menu/menu-radio-item.js.map +1 -1
  98. package/dist/default/ui/menu/menu-root.js +5 -6
  99. package/dist/default/ui/menu/menu-root.js.map +1 -1
  100. package/dist/default/ui/poster/poster.js +64 -17
  101. package/dist/default/ui/poster/poster.js.map +1 -1
  102. package/dist/default/ui/slider/slider-preview.js.map +1 -1
  103. package/dist/default/utils/use-render.js +2 -8
  104. package/dist/default/utils/use-render.js.map +1 -1
  105. package/dist/dev/__generated__/skins/default-video/styles/buttons.css +132 -18
  106. package/dist/dev/__generated__/skins/default-video/styles/captions.css +22 -0
  107. package/dist/dev/__generated__/skins/default-video/styles/container.css +121 -8
  108. package/dist/dev/__generated__/skins/default-video/styles/controls.css +436 -21
  109. package/dist/dev/__generated__/skins/default-video/styles/dialog.css +169 -0
  110. package/dist/dev/__generated__/skins/default-video/styles/indicator.css +459 -0
  111. package/dist/dev/__generated__/skins/default-video/styles/menus.css +254 -0
  112. package/dist/dev/__generated__/skins/default-video/styles/overlays.css +26 -2
  113. package/dist/dev/__generated__/skins/default-video/styles/popups.css +338 -12
  114. package/dist/dev/__generated__/skins/default-video/styles/poster.css +4 -4
  115. package/dist/dev/__generated__/skins/default-video/styles/sliders.css +355 -31
  116. package/dist/dev/__generated__/skins/default-video/styles/styles.css +2455 -216
  117. package/dist/dev/__generated__/skins/default-video/styles/theme.css +4 -19
  118. package/dist/dev/__generated__/skins/default-video/styles/video.css +29 -0
  119. package/dist/dev/__generated__/skins/minimal-video/styles/base.css +25 -0
  120. package/dist/dev/__generated__/skins/minimal-video/styles/buttons.css +266 -0
  121. package/dist/dev/__generated__/skins/minimal-video/styles/captions.css +22 -0
  122. package/dist/dev/__generated__/skins/minimal-video/styles/container.css +158 -0
  123. package/dist/dev/__generated__/skins/minimal-video/styles/controls.css +182 -0
  124. package/dist/dev/__generated__/skins/minimal-video/styles/dialog.css +77 -0
  125. package/dist/dev/__generated__/skins/minimal-video/styles/indicator.css +322 -0
  126. package/dist/dev/__generated__/skins/minimal-video/styles/menus.css +254 -0
  127. package/dist/dev/__generated__/skins/minimal-video/styles/overlays.css +35 -0
  128. package/dist/dev/__generated__/skins/minimal-video/styles/popups.css +371 -0
  129. package/dist/dev/__generated__/skins/minimal-video/styles/poster.css +47 -0
  130. package/dist/dev/__generated__/skins/minimal-video/styles/sliders.css +436 -0
  131. package/dist/dev/__generated__/skins/minimal-video/styles/styles.css +2246 -0
  132. package/dist/dev/__generated__/skins/minimal-video/styles/theme.css +7 -0
  133. package/dist/dev/__generated__/skins/minimal-video/styles/video.css +29 -0
  134. package/dist/dev/i18n/index.d.ts +2 -1
  135. package/dist/dev/i18n/index.js +2 -1
  136. package/dist/dev/i18n/text.d.ts +11 -0
  137. package/dist/dev/i18n/text.d.ts.map +1 -0
  138. package/dist/dev/i18n/text.js +20 -0
  139. package/dist/dev/i18n/text.js.map +1 -0
  140. package/dist/dev/icons/dist/react/default/airplay-exit.js +3 -3
  141. package/dist/dev/icons/dist/react/default/airplay-exit.js.map +1 -1
  142. package/dist/dev/icons/dist/react/minimal/airplay-exit.js +3 -3
  143. package/dist/dev/icons/dist/react/minimal/airplay-exit.js.map +1 -1
  144. package/dist/dev/icons/index.d.ts +6 -1
  145. package/dist/dev/icons/index.d.ts.map +1 -0
  146. package/dist/dev/icons/minimal/index.d.ts +6 -1
  147. package/dist/dev/icons/minimal/index.d.ts.map +1 -0
  148. package/dist/dev/index.d.ts +3 -2
  149. package/dist/dev/index.js +2 -1
  150. package/dist/dev/media/hls-background-video/media.d.ts +8 -0
  151. package/dist/dev/media/hls-background-video/media.d.ts.map +1 -1
  152. package/dist/dev/media/hls-background-video/media.js +18 -3
  153. package/dist/dev/media/hls-background-video/media.js.map +1 -1
  154. package/dist/dev/presets/audio/minimal-skin.css +103 -101
  155. package/dist/dev/presets/audio/minimal-skin.js +1 -1
  156. package/dist/dev/presets/audio/minimal-skin.tailwind.js +1 -1
  157. package/dist/dev/presets/audio/player.d.ts +2 -2
  158. package/dist/dev/presets/audio/skin.css +68 -69
  159. package/dist/dev/presets/audio/skin.js +1 -1
  160. package/dist/dev/presets/audio/skin.tailwind.js +1 -1
  161. package/dist/dev/presets/live-audio/minimal-skin.css +103 -101
  162. package/dist/dev/presets/live-audio/player.d.ts +2 -2
  163. package/dist/dev/presets/live-audio/skin.css +68 -69
  164. package/dist/dev/presets/live-video/minimal-skin.css +140 -120
  165. package/dist/dev/presets/live-video/minimal-skin.d.ts.map +1 -1
  166. package/dist/dev/presets/live-video/minimal-skin.js +3 -8
  167. package/dist/dev/presets/live-video/minimal-skin.js.map +1 -1
  168. package/dist/dev/presets/live-video/minimal-skin.tailwind.d.ts.map +1 -1
  169. package/dist/dev/presets/live-video/minimal-skin.tailwind.js +5 -8
  170. package/dist/dev/presets/live-video/minimal-skin.tailwind.js.map +1 -1
  171. package/dist/dev/presets/live-video/player.d.ts +2 -2
  172. package/dist/dev/presets/live-video/skin.css +89 -76
  173. package/dist/dev/presets/live-video/skin.d.ts.map +1 -1
  174. package/dist/dev/presets/live-video/skin.js +3 -8
  175. package/dist/dev/presets/live-video/skin.js.map +1 -1
  176. package/dist/dev/presets/live-video/skin.tailwind.d.ts.map +1 -1
  177. package/dist/dev/presets/live-video/skin.tailwind.js +7 -10
  178. package/dist/dev/presets/live-video/skin.tailwind.js.map +1 -1
  179. package/dist/dev/presets/types.d.ts +15 -2
  180. package/dist/dev/presets/types.d.ts.map +1 -1
  181. package/dist/dev/presets/video/minimal-skin.css +140 -120
  182. package/dist/dev/presets/video/minimal-skin.d.ts.map +1 -1
  183. package/dist/dev/presets/video/minimal-skin.js +3 -8
  184. package/dist/dev/presets/video/minimal-skin.js.map +1 -1
  185. package/dist/dev/presets/video/minimal-skin.tailwind.d.ts.map +1 -1
  186. package/dist/dev/presets/video/minimal-skin.tailwind.js +5 -8
  187. package/dist/dev/presets/video/minimal-skin.tailwind.js.map +1 -1
  188. package/dist/dev/presets/video/player.d.ts +2 -2
  189. package/dist/dev/presets/video/skin.css +89 -76
  190. package/dist/dev/presets/video/skin.d.ts.map +1 -1
  191. package/dist/dev/presets/video/skin.js +3 -8
  192. package/dist/dev/presets/video/skin.js.map +1 -1
  193. package/dist/dev/presets/video/skin.tailwind.d.ts.map +1 -1
  194. package/dist/dev/presets/video/skin.tailwind.js +6 -9
  195. package/dist/dev/presets/video/skin.tailwind.js.map +1 -1
  196. package/dist/dev/skins/dist/default/default/tailwind/components/button.js +3 -1
  197. package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +1 -1
  198. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js +8 -1
  199. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
  200. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js +10 -10
  201. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  202. package/dist/dev/skins/dist/default/default/tailwind/components/thumbnail.js +1 -1
  203. package/dist/dev/skins/dist/default/default/tailwind/components/thumbnail.js.map +1 -1
  204. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js +2 -2
  205. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  206. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js +8 -1
  207. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
  208. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js +13 -12
  209. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  210. package/dist/dev/skins/dist/default/minimal/tailwind/components/thumbnail.js +1 -1
  211. package/dist/dev/skins/dist/default/minimal/tailwind/components/thumbnail.js.map +1 -1
  212. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js +6 -5
  213. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  214. package/dist/dev/skins/dist/default/shared/tailwind/icon-state.js +4 -4
  215. package/dist/dev/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
  216. package/dist/dev/ui/gesture/gesture.d.ts +6 -13
  217. package/dist/dev/ui/gesture/gesture.d.ts.map +1 -1
  218. package/dist/dev/ui/gesture/gesture.js.map +1 -1
  219. package/dist/dev/ui/gesture/use-doubletap-gesture.d.ts +2 -5
  220. package/dist/dev/ui/gesture/use-doubletap-gesture.d.ts.map +1 -1
  221. package/dist/dev/ui/gesture/use-doubletap-gesture.js.map +1 -1
  222. package/dist/dev/ui/gesture/use-tap-gesture.d.ts +2 -5
  223. package/dist/dev/ui/gesture/use-tap-gesture.d.ts.map +1 -1
  224. package/dist/dev/ui/gesture/use-tap-gesture.js.map +1 -1
  225. package/dist/dev/ui/hotkey/hotkey.d.ts +6 -12
  226. package/dist/dev/ui/hotkey/hotkey.d.ts.map +1 -1
  227. package/dist/dev/ui/hotkey/hotkey.js.map +1 -1
  228. package/dist/dev/ui/menu/context.js +6 -1
  229. package/dist/dev/ui/menu/context.js.map +1 -1
  230. package/dist/dev/ui/menu/menu-item-indicator.d.ts.map +1 -1
  231. package/dist/dev/ui/menu/menu-item-indicator.js +3 -2
  232. package/dist/dev/ui/menu/menu-item-indicator.js.map +1 -1
  233. package/dist/dev/ui/menu/menu-radio-item.d.ts.map +1 -1
  234. package/dist/dev/ui/menu/menu-radio-item.js +19 -15
  235. package/dist/dev/ui/menu/menu-radio-item.js.map +1 -1
  236. package/dist/dev/ui/menu/menu-root.js +5 -6
  237. package/dist/dev/ui/menu/menu-root.js.map +1 -1
  238. package/dist/dev/ui/poster/poster.d.ts +15 -4
  239. package/dist/dev/ui/poster/poster.d.ts.map +1 -1
  240. package/dist/dev/ui/poster/poster.js +64 -17
  241. package/dist/dev/ui/poster/poster.js.map +1 -1
  242. package/dist/dev/ui/slider/slider-preview.d.ts +5 -9
  243. package/dist/dev/ui/slider/slider-preview.d.ts.map +1 -1
  244. package/dist/dev/ui/slider/slider-preview.js.map +1 -1
  245. package/dist/dev/utils/use-render.d.ts.map +1 -1
  246. package/dist/dev/utils/use-render.js +2 -8
  247. package/dist/dev/utils/use-render.js.map +1 -1
  248. package/docs/README.md +1 -1
  249. package/docs/concepts/skins.md +97 -96
  250. package/docs/how-to/customize-skins.md +421 -411
  251. package/docs/reference/create-player.md +2 -2
  252. package/docs/reference/menu.md +6 -18
  253. package/docs/reference/popover.md +6 -6
  254. package/docs/reference/poster.md +187 -13
  255. package/docs/reference/slider.md +1 -1
  256. package/docs/reference/time-slider.md +1 -1
  257. package/docs/reference/tooltip.md +10 -10
  258. package/docs/reference/volume-slider.md +1 -1
  259. package/package.json +13 -8
@@ -64,10 +64,10 @@ skin.css
64
64
  ```
65
65
  'use client';
66
66
 
67
- import { type CSSProperties, type ComponentProps, forwardRef, type ReactNode, isValidElement } from 'react';
67
+ import { type CSSProperties, type ComponentProps, forwardRef, type ReactNode } from 'react';
68
68
  import { audioText, captionsText, playbackRateText, qualityText, settingsText, speedText } from '@videojs/core/i18n/text/menu';
69
69
  import { AirPlayEnterIcon, AirPlayExitIcon, CaptionsOffIcon, CaptionsOnIcon, CastEnterIcon, CastExitIcon, CheckIcon, ChevronIcon, FullscreenEnterIcon, FullscreenExitIcon, GearIcon, PauseIcon, PipEnterIcon, PipExitIcon, PlayIcon, QualityIcon, RestartIcon, SpeechIcon, SpeedIcon, SpinnerIcon, VolumeHighIcon, VolumeLowIcon, VolumeOffIcon } from '@videojs/react/icons';
70
- import { Poster, useTranslator, Container, usePlayer, AirPlayButton, useAudioTrackOptions, AudioTrackRadioGroup, BufferingIndicator, CaptionsButton, CaptionsRadioGroup, useCaptionsOptions, CastButton, Controls, ErrorDialog, FullscreenButton, Gesture, Hotkey, Menu, MuteButton, PiPButton, PlayButton, usePlaybackRateOptions, PlaybackRateRadioGroup, Popover, useQualityOptions, QualityRadioGroup, SeekIndicator, Slider, StatusAnnouncer, StatusIndicator, Time, TimeSlider, Tooltip, VolumeIndicator, VolumeSlider, type RenderProp } from '@videojs/react';
70
+ import { Poster, useTranslator, Container, usePlayer, AirPlayButton, useAudioTrackOptions, AudioTrackRadioGroup, BufferingIndicator, CaptionsButton, CaptionsRadioGroup, useCaptionsOptions, CastButton, Controls, ErrorDialog, FullscreenButton, Gesture, Hotkey, Menu, MuteButton, PiPButton, PlayButton, usePlaybackRateOptions, PlaybackRateRadioGroup, Popover, useQualityOptions, QualityRadioGroup, SeekIndicator, Slider, StatusAnnouncer, StatusIndicator, Time, TimeSlider, Tooltip, VolumeIndicator, VolumeSlider } from '@videojs/react';
71
71
  import { Video } from '@videojs/react/video';
72
72
  import './player.css';
73
73
  import { Player } from './player';
@@ -350,9 +350,11 @@ const SEEK_TIME = 10;
350
350
 
351
351
  export interface VideoPlayerProps {
352
352
  src: string;
353
+ poster?: string | undefined;
353
354
  style?: CSSProperties;
354
355
  className?: string;
355
- poster?: string | RenderProp<Poster.State> | undefined;
356
+ renderPoster?: Poster.Props['render'];
357
+ placeholder?: string | undefined;
356
358
  }
357
359
 
358
360
  /**
@@ -364,13 +366,13 @@ export interface VideoPlayerProps {
364
366
  * />
365
367
  * ```
366
368
  */
367
- export function VideoPlayer({ src, className, poster, placeholder, style, ...rest }: VideoPlayerProps): ReactNode {
369
+ export function VideoPlayer({ src, poster, className, renderPoster, placeholder, style, ...rest }: VideoPlayerProps): ReactNode {
368
370
  const containerStyle = placeholder
369
371
  ? ({ '--media-poster-placeholder': `url(${placeholder})`, ...style } as CSSProperties)
370
372
  : style;
371
373
 
372
374
  return (
373
- <Player>
375
+ <Player poster={poster}>
374
376
  <Container
375
377
  className={`media-default-skin media-default-skin--video ${className ?? ''}`}
376
378
  style={containerStyle}
@@ -378,9 +380,7 @@ export function VideoPlayer({ src, className, poster, placeholder, style, ...res
378
380
  >
379
381
  <Video src={src} playsInline />
380
382
 
381
- {poster && (
382
- <Poster src={isString(poster) ? poster : undefined} render={isRenderProp(poster) ? poster : undefined} />
383
- )}
383
+ <Poster render={renderPoster} />
384
384
 
385
385
  <BufferingIndicator
386
386
  render={(props) => (
@@ -604,18 +604,6 @@ function VolumePopover(): ReactNode {
604
604
  </Popover.Root>
605
605
  );
606
606
  }
607
-
608
- // ================================================================
609
- // Utilities
610
- // ================================================================
611
-
612
- function isString(value: unknown): value is string {
613
- return typeof value === 'string';
614
- }
615
-
616
- function isRenderProp(value: unknown): value is RenderProp<unknown> {
617
- return typeof value === 'function' || isValidElement(value);
618
- }
619
607
  ```
620
608
  ```
621
609
  import { createPlayer } from '@videojs/react';
@@ -1183,7 +1171,7 @@ export const { Player } = createPlayer({ features: videoFeatures });
1183
1171
  position: relative;
1184
1172
  display: block;
1185
1173
  max-width: var(--thumbnail-max-width);
1186
- max-height: var(--max-height);
1174
+ max-height: var(--thumbnail-max-height);
1187
1175
  overflow: clip;
1188
1176
  border-radius: inherit;
1189
1177
 
@@ -1238,8 +1226,7 @@ export const { Player } = createPlayer({ features: videoFeatures });
1238
1226
  --track-size: calc(var(--spacing) * 1);
1239
1227
  --track-highlighted-size: calc(var(--spacing) * 1.75);
1240
1228
  --track-border-radius: 99px;
1241
- --thumb-size: calc(var(--spacing) * 2.5);
1242
- --thumb-active-size: calc(var(--spacing) * 3);
1229
+ --thumb-size: calc(var(--spacing) * 3);
1243
1230
  --chapter-gap: calc(var(--spacing) * 1);
1244
1231
  --chapter-inset-start: calc(var(--chapter-gap) / 2);
1245
1232
  --chapter-inset-end: calc(var(--chapter-gap) / 2);
@@ -1292,13 +1279,22 @@ export const { Player } = createPlayer({ features: videoFeatures });
1292
1279
  inset-block: 0;
1293
1280
  left: 0;
1294
1281
  width: 100%;
1295
- transition-property: clip-path;
1296
1282
  }
1297
1283
  &[data-orientation="vertical"] {
1298
1284
  inset-inline: 0;
1299
1285
  bottom: 0;
1300
1286
  height: 100%;
1301
- transition-property: clip-path;
1287
+ }
1288
+
1289
+ @media (prefers-reduced-motion: no-preference) {
1290
+ transition: clip-path 200ms ease-out;
1291
+ }
1292
+ }
1293
+ &[data-dragging],
1294
+ &[data-seeking] {
1295
+ .media-slider__fill,
1296
+ .media-slider__buffer {
1297
+ transition-duration: 0ms;
1302
1298
  }
1303
1299
  }
1304
1300
 
@@ -1325,6 +1321,14 @@ export const { Player } = createPlayer({ features: videoFeatures });
1325
1321
  clip-path: inset(calc(100% - var(--media-slider-fill)) 0 0 0 round var(--track-border-radius));
1326
1322
  }
1327
1323
  }
1324
+ &[data-dragging] {
1325
+ .media-slider__fill[data-orientation="horizontal"] {
1326
+ clip-path: inset(0 calc(100% - var(--media-slider-pointer)) 0 0 round var(--track-border-radius));
1327
+ }
1328
+ .media-slider__fill[data-orientation="vertical"] {
1329
+ clip-path: inset(calc(100% - var(--media-slider-pointer)) 0 0 0 round var(--track-border-radius));
1330
+ }
1331
+ }
1328
1332
 
1329
1333
  /* Chapters */
1330
1334
  .media-slider__chapters {
@@ -1406,45 +1410,6 @@ export const { Player } = createPlayer({ features: videoFeatures });
1406
1410
  }
1407
1411
  }
1408
1412
 
1409
- /* Dragging — thumb and fill follow the pointer position */
1410
- &[data-dragging] {
1411
- .media-slider__thumb[data-orientation="horizontal"] {
1412
- left: var(--media-slider-pointer);
1413
- }
1414
- .media-slider__thumb[data-orientation="vertical"] {
1415
- top: calc(100% - var(--media-slider-pointer));
1416
- }
1417
- .media-slider__fill[data-orientation="horizontal"] {
1418
- clip-path: inset(0 calc(100% - var(--media-slider-pointer)) 0 0 round var(--track-border-radius));
1419
- }
1420
- .media-slider__fill[data-orientation="vertical"] {
1421
- clip-path: inset(calc(100% - var(--media-slider-pointer)) 0 0 0 round var(--track-border-radius));
1422
- }
1423
- }
1424
-
1425
- @media (prefers-reduced-motion: no-preference) {
1426
- .media-slider__thumb {
1427
- transition-property: opacity, height, width, outline-offset, left, top;
1428
- }
1429
- .media-slider__fill {
1430
- transition-timing-function: linear;
1431
- transition-duration: 200ms;
1432
- }
1433
- .media-slider__buffer {
1434
- transition-timing-function: ease-out;
1435
- transition-duration: 250ms;
1436
- }
1437
- }
1438
-
1439
- &[data-dragging],
1440
- &[data-seeking] {
1441
- .media-slider__thumb,
1442
- .media-slider__fill,
1443
- .media-slider__buffer {
1444
- transition-duration: 0ms;
1445
- }
1446
- }
1447
-
1448
1413
  /* Thumb */
1449
1414
  .media-slider__thumb {
1450
1415
  position: absolute;
@@ -1461,10 +1426,8 @@ export const { Player } = createPlayer({ features: videoFeatures });
1461
1426
  0 1px 3px 0 oklch(0 0 0 / 0.35),
1462
1427
  0 1px 2px -1px oklch(0 0 0 / 0.35);
1463
1428
  opacity: 0;
1429
+ scale: 0.8;
1464
1430
  translate: -50% -50%;
1465
- transition-timing-function: ease-out;
1466
- transition-duration: 150ms;
1467
- transition-property: opacity, height, width, outline-offset;
1468
1431
 
1469
1432
  &[data-orientation="horizontal"] {
1470
1433
  top: 50%;
@@ -1481,22 +1444,12 @@ export const { Player } = createPlayer({ features: videoFeatures });
1481
1444
  opacity: 1;
1482
1445
  }
1483
1446
 
1484
- @media (hover: hover) and (pointer: fine) {
1485
- &:hover {
1486
- outline-color: oklch(from currentColor l c h / 0.15);
1487
- outline-offset: 0;
1488
- }
1489
- }
1490
-
1491
1447
  &::after {
1492
1448
  position: absolute;
1493
1449
  inset: -4px;
1494
1450
  content: "";
1495
1451
  border-radius: inherit;
1496
1452
  box-shadow: 0 0 0 2px currentColor;
1497
- transition-timing-function: ease-out;
1498
- transition-duration: 150ms;
1499
- transition-property: opacity, scale;
1500
1453
  }
1501
1454
 
1502
1455
  &:not(:focus-visible)::after {
@@ -1505,37 +1458,70 @@ export const { Player } = createPlayer({ features: videoFeatures });
1505
1458
  }
1506
1459
 
1507
1460
  &.media-slider__thumb--persistent {
1508
- width: var(--thumb-active-size);
1509
- height: var(--thumb-active-size);
1510
1461
  opacity: 1;
1462
+ scale: 1;
1511
1463
  }
1512
- }
1513
1464
 
1514
- &:active .media-slider__thumb,
1515
- &:focus-within .media-slider__thumb {
1516
- width: var(--thumb-active-size);
1517
- height: var(--thumb-active-size);
1465
+ @media (hover: hover) and (pointer: fine) {
1466
+ &:hover {
1467
+ outline-color: oklch(from currentColor l c h / 0.15);
1468
+ outline-offset: 0;
1469
+ }
1470
+ }
1471
+
1472
+ @media (prefers-reduced-motion: no-preference) {
1473
+ transition-timing-function: ease-out;
1474
+ transition-duration: 150ms;
1475
+ transition-property: opacity, outline-offset, left, top, scale;
1476
+
1477
+ &::after {
1478
+ transition-timing-function: ease-out;
1479
+ transition-duration: 150ms;
1480
+ transition-property: opacity, scale;
1481
+ }
1482
+ }
1518
1483
  }
1519
1484
 
1520
1485
  @media (hover: hover) and (pointer: fine) {
1521
1486
  &:hover .media-slider__thumb {
1522
1487
  opacity: 1;
1488
+ scale: 1;
1489
+ }
1490
+ }
1491
+
1492
+ &[data-dragging] .media-slider__thumb {
1493
+ opacity: 1;
1494
+ scale: 0.9;
1495
+
1496
+ @media (prefers-reduced-motion: no-preference) {
1497
+ transition-property: opacity, outline-offset, scale;
1498
+ }
1499
+
1500
+ &[data-orientation="horizontal"] {
1501
+ left: var(--media-slider-pointer);
1502
+ }
1503
+ &[data-orientation="vertical"] {
1504
+ top: calc(100% - var(--media-slider-pointer));
1523
1505
  }
1524
1506
  }
1525
1507
 
1526
1508
  /* Preview */
1527
1509
  .media-slider__preview {
1528
- --max-width: min(calc(var(--spacing) * 48), 100cqi);
1529
- --max-height: calc(var(--spacing) * 32);
1510
+ --max-size-factor: 36;
1511
+ --max-size: min(calc(var(--spacing) * var(--max-size-factor)), 100cqi);
1530
1512
 
1531
- min-width: var(--max-width);
1513
+ min-width: var(--max-size);
1532
1514
  height: calc(var(--spacing) * 1);
1533
1515
 
1516
+ @container media-root (width > 42rem) {
1517
+ --max-size-factor: 48;
1518
+ }
1519
+
1534
1520
  .media-slider__thumbnail,
1535
1521
  .media-slider__value {
1536
1522
  position: absolute;
1537
1523
  left: 50%;
1538
- max-width: var(--max-width);
1524
+ max-width: var(--max-size);
1539
1525
  opacity: 0;
1540
1526
  filter: blur(8px);
1541
1527
  transform-origin: bottom;
@@ -1546,7 +1532,8 @@ export const { Player } = createPlayer({ features: videoFeatures });
1546
1532
  }
1547
1533
 
1548
1534
  .media-slider__thumbnail {
1549
- --thumbnail-max-width: var(--max-width);
1535
+ --thumbnail-max-width: var(--max-size);
1536
+ --thumbnail-max-height: var(--max-size);
1550
1537
  bottom: calc(100% + (var(--spacing) * 9));
1551
1538
  }
1552
1539
 
@@ -1560,7 +1547,7 @@ export const { Player } = createPlayer({ features: videoFeatures });
1560
1547
 
1561
1548
  .media-slider__chapter-title {
1562
1549
  min-width: 0;
1563
- max-width: var(--max-width);
1550
+ max-width: var(--max-size);
1564
1551
  padding-inline: calc(var(--spacing) * 6);
1565
1552
  overflow: hidden;
1566
1553
  text-overflow: ellipsis;
@@ -2307,8 +2294,8 @@ export const { Player } = createPlayer({ features: videoFeatures });
2307
2294
  still in the DOM — just `display: none` — so its animations would keep
2308
2295
  running. Set the variables to `none` to short-circuit the keyframes. */
2309
2296
  .media-button--airplay:not([data-airplay-state="connected"]) {
2310
- --media-icon--airplay__fill-animation: none;
2311
- --media-icon--airplay__triangle-animation: none;
2297
+ --media-icon-airplay-fill-animation: none;
2298
+ --media-icon-airplay-triangle-animation: none;
2312
2299
  }
2313
2300
 
2314
2301
  @media (prefers-reduced-motion: reduce) {
@@ -2475,6 +2462,12 @@ export const { Player } = createPlayer({ features: videoFeatures });
2475
2462
  .media-controls--primary,
2476
2463
  .media-controls--secondary {
2477
2464
  position: absolute;
2465
+ }
2466
+ /* Primary must be higher for the preview/thumbnail */
2467
+ .media-controls--primary {
2468
+ z-index: 20;
2469
+ }
2470
+ .media-controls--secondary {
2478
2471
  z-index: 10;
2479
2472
  }
2480
2473
 
@@ -2491,6 +2484,11 @@ export const { Player } = createPlayer({ features: videoFeatures });
2491
2484
  transform-origin: top;
2492
2485
  }
2493
2486
 
2487
+ .media-time-controls {
2488
+ flex: 1;
2489
+ padding-inline: calc(var(--spacing) * 2);
2490
+ }
2491
+
2494
2492
  @container media-root (width < 32rem) {
2495
2493
  .media-controls--primary,
2496
2494
  .media-controls--secondary {
@@ -2541,6 +2539,10 @@ export const { Player } = createPlayer({ features: videoFeatures });
2541
2539
  }
2542
2540
  }
2543
2541
  }
2542
+
2543
+ .media-button--captions {
2544
+ display: none;
2545
+ }
2544
2546
  }
2545
2547
 
2546
2548
  @container media-root (width >= 32rem) {
@@ -2577,11 +2579,10 @@ export const { Player } = createPlayer({ features: videoFeatures });
2577
2579
  translate: 0 4px;
2578
2580
  }
2579
2581
  }
2580
- }
2581
2582
 
2582
- .media-time-controls {
2583
- flex: 1;
2584
- padding-inline: calc(var(--spacing) * 3);
2583
+ .media-time-controls {
2584
+ padding-inline: calc(var(--spacing) * 3);
2585
+ }
2585
2586
  }
2586
2587
 
2587
2588
  @media (pointer: fine) {