@videojs/react 10.0.0-beta.24 → 10.0.0-beta.25

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 (713) hide show
  1. package/dist/default/icons/dist/react/default/airplay-enter.js +16 -0
  2. package/dist/default/icons/dist/react/default/airplay-enter.js.map +1 -0
  3. package/dist/default/icons/dist/react/default/airplay-exit.js +28 -0
  4. package/dist/default/icons/dist/react/default/airplay-exit.js.map +1 -0
  5. package/dist/default/icons/dist/react/default/captions-off.js +5 -0
  6. package/dist/default/icons/dist/react/default/captions-off.js.map +1 -1
  7. package/dist/default/icons/dist/react/default/gear.js +16 -0
  8. package/dist/default/icons/dist/react/default/gear.js.map +1 -0
  9. package/dist/default/icons/dist/react/default/quality.js +16 -0
  10. package/dist/default/icons/dist/react/default/quality.js.map +1 -0
  11. package/dist/default/icons/dist/react/default/speech.js +19 -0
  12. package/dist/default/icons/dist/react/default/speech.js.map +1 -0
  13. package/dist/default/icons/dist/react/default/speed.js +52 -0
  14. package/dist/default/icons/dist/react/default/speed.js.map +1 -0
  15. package/dist/default/icons/dist/react/default/switches.js +19 -0
  16. package/dist/default/icons/dist/react/default/switches.js.map +1 -0
  17. package/dist/default/icons/dist/react/minimal/airplay-enter.js +16 -0
  18. package/dist/default/icons/dist/react/minimal/airplay-enter.js.map +1 -0
  19. package/dist/default/icons/dist/react/minimal/airplay-exit.js +28 -0
  20. package/dist/default/icons/dist/react/minimal/airplay-exit.js.map +1 -0
  21. package/dist/default/icons/dist/react/minimal/captions-off.js +5 -0
  22. package/dist/default/icons/dist/react/minimal/captions-off.js.map +1 -1
  23. package/dist/default/icons/dist/react/minimal/gear.js +16 -0
  24. package/dist/default/icons/dist/react/minimal/gear.js.map +1 -0
  25. package/dist/default/icons/dist/react/minimal/quality.js +16 -0
  26. package/dist/default/icons/dist/react/minimal/quality.js.map +1 -0
  27. package/dist/default/icons/dist/react/minimal/speech.js +54 -0
  28. package/dist/default/icons/dist/react/minimal/speech.js.map +1 -0
  29. package/dist/default/icons/dist/react/minimal/speed.js +52 -0
  30. package/dist/default/icons/dist/react/minimal/speed.js.map +1 -0
  31. package/dist/default/icons/dist/react/minimal/switches.js +19 -0
  32. package/dist/default/icons/dist/react/minimal/switches.js.map +1 -0
  33. package/dist/default/icons/index.js +8 -1
  34. package/dist/default/icons/minimal/index.js +8 -1
  35. package/dist/default/index.js +21 -17
  36. package/dist/default/media/dash-video/index.js +5 -1
  37. package/dist/default/media/dash-video/index.js.map +1 -1
  38. package/dist/default/media/{hls-video → hlsjs-video}/index.js +9 -5
  39. package/dist/default/media/hlsjs-video/index.js.map +1 -0
  40. package/dist/default/media/mux-audio/index.js +9 -3
  41. package/dist/default/media/mux-audio/index.js.map +1 -1
  42. package/dist/default/media/mux-video/index.js +9 -3
  43. package/dist/default/media/mux-video/index.js.map +1 -1
  44. package/dist/default/media/native-hls-video/index.js +5 -1
  45. package/dist/default/media/native-hls-video/index.js.map +1 -1
  46. package/dist/default/media/simple-hls-audio-only/index.js +22 -0
  47. package/dist/default/media/simple-hls-audio-only/index.js.map +1 -0
  48. package/dist/default/media/simple-hls-video/index.js +1 -1
  49. package/dist/default/media/vimeo-video/index.js +37 -0
  50. package/dist/default/media/vimeo-video/index.js.map +1 -0
  51. package/dist/default/player/context.js.map +1 -1
  52. package/dist/default/player/create-player.js +13 -4
  53. package/dist/default/player/create-player.js.map +1 -1
  54. package/dist/default/presets/audio/minimal-skin.css +414 -69
  55. package/dist/default/presets/audio/minimal-skin.js +69 -39
  56. package/dist/default/presets/audio/minimal-skin.js.map +1 -1
  57. package/dist/default/presets/audio/minimal-skin.tailwind.js +71 -42
  58. package/dist/default/presets/audio/minimal-skin.tailwind.js.map +1 -1
  59. package/dist/default/presets/audio/skin.css +419 -121
  60. package/dist/default/presets/audio/skin.js +70 -40
  61. package/dist/default/presets/audio/skin.js.map +1 -1
  62. package/dist/default/presets/audio/skin.tailwind.js +72 -42
  63. package/dist/default/presets/audio/skin.tailwind.js.map +1 -1
  64. package/dist/default/presets/live-audio/index.js +2 -2
  65. package/dist/default/presets/live-audio/minimal-skin.css +414 -69
  66. package/dist/default/presets/live-audio/minimal-skin.js +26 -12
  67. package/dist/default/presets/live-audio/minimal-skin.js.map +1 -1
  68. package/dist/default/presets/live-audio/minimal-skin.tailwind.js +27 -14
  69. package/dist/default/presets/live-audio/minimal-skin.tailwind.js.map +1 -1
  70. package/dist/default/presets/live-audio/skin.css +419 -121
  71. package/dist/default/presets/live-audio/skin.js +32 -14
  72. package/dist/default/presets/live-audio/skin.js.map +1 -1
  73. package/dist/default/presets/live-audio/skin.tailwind.js +27 -13
  74. package/dist/default/presets/live-audio/skin.tailwind.js.map +1 -1
  75. package/dist/default/presets/live-video/minimal-skin.css +566 -210
  76. package/dist/default/presets/live-video/minimal-skin.js +93 -12
  77. package/dist/default/presets/live-video/minimal-skin.js.map +1 -1
  78. package/dist/default/presets/live-video/minimal-skin.tailwind.js +94 -13
  79. package/dist/default/presets/live-video/minimal-skin.tailwind.js.map +1 -1
  80. package/dist/default/presets/live-video/skin.css +581 -264
  81. package/dist/default/presets/live-video/skin.js +95 -16
  82. package/dist/default/presets/live-video/skin.js.map +1 -1
  83. package/dist/default/presets/live-video/skin.tailwind.js +95 -17
  84. package/dist/default/presets/live-video/skin.tailwind.js.map +1 -1
  85. package/dist/default/presets/video/minimal-skin.css +566 -210
  86. package/dist/default/presets/video/minimal-skin.js +281 -53
  87. package/dist/default/presets/video/minimal-skin.js.map +1 -1
  88. package/dist/default/presets/video/minimal-skin.tailwind.js +284 -57
  89. package/dist/default/presets/video/minimal-skin.tailwind.js.map +1 -1
  90. package/dist/default/presets/video/skin.css +581 -264
  91. package/dist/default/presets/video/skin.js +282 -57
  92. package/dist/default/presets/video/skin.js.map +1 -1
  93. package/dist/default/presets/video/skin.tailwind.js +285 -61
  94. package/dist/default/presets/video/skin.tailwind.js.map +1 -1
  95. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js +8 -3
  96. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  97. package/dist/default/skins/dist/default/default/tailwind/components/badge.js +6 -0
  98. package/dist/default/skins/dist/default/default/tailwind/components/badge.js.map +1 -0
  99. package/dist/default/skins/dist/default/default/tailwind/components/buffering.js +1 -4
  100. package/dist/default/skins/dist/default/default/tailwind/components/buffering.js.map +1 -1
  101. package/dist/default/skins/dist/default/default/tailwind/components/icon.js +1 -1
  102. package/dist/default/skins/dist/default/default/tailwind/components/icon.js.map +1 -1
  103. package/dist/default/skins/dist/default/default/tailwind/components/input-feedback.js +9 -9
  104. package/dist/default/skins/dist/default/default/tailwind/components/input-feedback.js.map +1 -1
  105. package/dist/default/skins/dist/default/default/tailwind/components/menu.js +26 -4
  106. package/dist/default/skins/dist/default/default/tailwind/components/menu.js.map +1 -1
  107. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js +1 -1
  108. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
  109. package/dist/default/skins/dist/default/default/tailwind/components/popup.js +4 -3
  110. package/dist/default/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  111. package/dist/default/skins/dist/default/default/tailwind/components/poster.js +7 -1
  112. package/dist/default/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
  113. package/dist/default/skins/dist/default/default/tailwind/components/root.js +1 -1
  114. package/dist/default/skins/dist/default/default/tailwind/components/root.js.map +1 -1
  115. package/dist/default/skins/dist/default/default/tailwind/components/seek.js +1 -1
  116. package/dist/default/skins/dist/default/default/tailwind/components/seek.js.map +1 -1
  117. package/dist/default/skins/dist/default/default/tailwind/components/slider.js +5 -3
  118. package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  119. package/dist/default/skins/dist/default/default/tailwind/components/thumbnail.js +12 -0
  120. package/dist/default/skins/dist/default/default/tailwind/components/thumbnail.js.map +1 -0
  121. package/dist/default/skins/dist/default/default/tailwind/components/time.js +1 -1
  122. package/dist/default/skins/dist/default/default/tailwind/components/time.js.map +1 -1
  123. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +26 -13
  124. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  125. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js +13 -3
  126. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  127. package/dist/default/skins/dist/default/minimal/tailwind/components/badge.js +6 -0
  128. package/dist/default/skins/dist/default/minimal/tailwind/components/badge.js.map +1 -0
  129. package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js +1 -1
  130. package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -1
  131. package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js +1 -1
  132. package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -1
  133. package/dist/default/skins/dist/default/minimal/tailwind/components/input-feedback.js +9 -9
  134. package/dist/default/skins/dist/default/minimal/tailwind/components/input-feedback.js.map +1 -1
  135. package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js +25 -4
  136. package/dist/default/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -1
  137. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js +1 -1
  138. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
  139. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js +3 -2
  140. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  141. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js +7 -1
  142. package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
  143. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js +1 -1
  144. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  145. package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js +1 -1
  146. package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -1
  147. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +5 -3
  148. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  149. package/dist/default/skins/dist/default/minimal/tailwind/components/thumbnail.js +13 -0
  150. package/dist/default/skins/dist/default/minimal/tailwind/components/thumbnail.js.map +1 -0
  151. package/dist/default/skins/dist/default/minimal/tailwind/components/time.js +1 -1
  152. package/dist/default/skins/dist/default/minimal/tailwind/components/time.js.map +1 -1
  153. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +27 -11
  154. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  155. package/dist/default/skins/dist/default/shared/tailwind/icon-state.js +17 -2
  156. package/dist/default/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
  157. package/dist/default/tailwind.css +0 -24
  158. package/dist/default/ui/airplay-button/airplay-button.js +17 -0
  159. package/dist/default/ui/airplay-button/airplay-button.js.map +1 -0
  160. package/dist/default/ui/airplay-button/index.js +2 -0
  161. package/dist/default/ui/alert-dialog/alert-dialog-close.js +1 -1
  162. package/dist/default/ui/alert-dialog/alert-dialog-popup.js +1 -1
  163. package/dist/default/ui/audio-track/index.js +2 -0
  164. package/dist/default/ui/audio-track/use-audio-track-options.js +31 -0
  165. package/dist/default/ui/audio-track/use-audio-track-options.js.map +1 -0
  166. package/dist/default/ui/captions-radio-group/index.js +2 -0
  167. package/dist/default/ui/captions-radio-group/use-captions-options.js +37 -0
  168. package/dist/default/ui/captions-radio-group/use-captions-options.js.map +1 -0
  169. package/dist/default/ui/create-media-button.js +23 -10
  170. package/dist/default/ui/create-media-button.js.map +1 -1
  171. package/dist/default/ui/error-dialog/error-dialog-description.js +1 -1
  172. package/dist/default/ui/hooks/use-button.js.map +1 -1
  173. package/dist/default/ui/hotkey/use-hotkey-shortcut.js +28 -0
  174. package/dist/default/ui/hotkey/use-hotkey-shortcut.js.map +1 -0
  175. package/dist/default/ui/hotkey/use-hotkey.js +1 -2
  176. package/dist/default/ui/hotkey/use-hotkey.js.map +1 -1
  177. package/dist/default/ui/input-indicators/use-input-indicator-root.js +2 -2
  178. package/dist/default/ui/input-indicators/use-input-indicator-root.js.map +1 -1
  179. package/dist/default/ui/input-indicators/use-rendered-indicator-state.js +7 -4
  180. package/dist/default/ui/input-indicators/use-rendered-indicator-state.js.map +1 -1
  181. package/dist/default/ui/live-button/live-button.js +1 -1
  182. package/dist/default/ui/live-button/live-button.js.map +1 -1
  183. package/dist/default/ui/menu/context.js +16 -1
  184. package/dist/default/ui/menu/context.js.map +1 -1
  185. package/dist/default/ui/menu/index.parts.js +4 -2
  186. package/dist/default/ui/menu/index.parts.js.map +1 -1
  187. package/dist/default/ui/menu/menu-back.js +0 -1
  188. package/dist/default/ui/menu/menu-back.js.map +1 -1
  189. package/dist/default/ui/menu/menu-checkbox-item.js +1 -2
  190. package/dist/default/ui/menu/menu-checkbox-item.js.map +1 -1
  191. package/dist/default/ui/menu/menu-content.js +23 -5
  192. package/dist/default/ui/menu/menu-content.js.map +1 -1
  193. package/dist/default/ui/menu/menu-group-label.js +29 -0
  194. package/dist/default/ui/menu/menu-group-label.js.map +1 -0
  195. package/dist/default/ui/menu/menu-group.js +7 -9
  196. package/dist/default/ui/menu/menu-group.js.map +1 -1
  197. package/dist/default/ui/menu/menu-item-indicator.js +1 -2
  198. package/dist/default/ui/menu/menu-item-indicator.js.map +1 -1
  199. package/dist/default/ui/menu/menu-item-setting-provider.js +72 -0
  200. package/dist/default/ui/menu/menu-item-setting-provider.js.map +1 -0
  201. package/dist/default/ui/menu/menu-item-value.js +28 -0
  202. package/dist/default/ui/menu/menu-item-value.js.map +1 -0
  203. package/dist/default/ui/menu/menu-item.js +44 -23
  204. package/dist/default/ui/menu/menu-item.js.map +1 -1
  205. package/dist/default/ui/menu/menu-radio-group.js +6 -9
  206. package/dist/default/ui/menu/menu-radio-group.js.map +1 -1
  207. package/dist/default/ui/menu/menu-radio-item.js +1 -2
  208. package/dist/default/ui/menu/menu-radio-item.js.map +1 -1
  209. package/dist/default/ui/menu/menu-root.js +1 -1
  210. package/dist/default/ui/menu/menu-separator.js +1 -2
  211. package/dist/default/ui/menu/menu-separator.js.map +1 -1
  212. package/dist/default/ui/menu/menu-trigger.js +85 -29
  213. package/dist/default/ui/menu/menu-trigger.js.map +1 -1
  214. package/dist/default/ui/menu/use-menu-group.js +31 -0
  215. package/dist/default/ui/menu/use-menu-group.js.map +1 -0
  216. package/dist/default/ui/playback-rate/index.js +2 -0
  217. package/dist/default/ui/playback-rate/use-playback-rate-options.js +34 -0
  218. package/dist/default/ui/playback-rate/use-playback-rate-options.js.map +1 -0
  219. package/dist/default/ui/playback-rate-button/playback-rate-button.js +2 -1
  220. package/dist/default/ui/playback-rate-button/playback-rate-button.js.map +1 -1
  221. package/dist/default/ui/poster/poster.js +17 -3
  222. package/dist/default/ui/poster/poster.js.map +1 -1
  223. package/dist/default/ui/quality/index.js +2 -0
  224. package/dist/default/ui/quality/use-quality-options.js +37 -0
  225. package/dist/default/ui/quality/use-quality-options.js.map +1 -0
  226. package/dist/default/ui/seek-button/seek-button.js +3 -1
  227. package/dist/default/ui/seek-button/seek-button.js.map +1 -1
  228. package/dist/default/ui/time/time-value.js +32 -5
  229. package/dist/default/ui/time/time-value.js.map +1 -1
  230. package/dist/default/ui/time-slider/time-slider-root.js +18 -6
  231. package/dist/default/ui/time-slider/time-slider-root.js.map +1 -1
  232. package/dist/default/ui/tooltip/context.js.map +1 -1
  233. package/dist/default/ui/tooltip/index.parts.js +4 -0
  234. package/dist/default/ui/tooltip/index.parts.js.map +1 -1
  235. package/dist/default/ui/tooltip/tooltip-arrow.js +1 -1
  236. package/dist/default/ui/tooltip/tooltip-label.js +24 -0
  237. package/dist/default/ui/tooltip/tooltip-label.js.map +1 -0
  238. package/dist/default/ui/tooltip/tooltip-popup.js +7 -3
  239. package/dist/default/ui/tooltip/tooltip-popup.js.map +1 -1
  240. package/dist/default/ui/tooltip/tooltip-root.js +1 -1
  241. package/dist/default/ui/tooltip/tooltip-root.js.map +1 -1
  242. package/dist/default/ui/tooltip/tooltip-shortcut.js +25 -0
  243. package/dist/default/ui/tooltip/tooltip-shortcut.js.map +1 -0
  244. package/dist/default/ui/volume-indicator/volume-indicator-root.js +1 -1
  245. package/dist/default/ui/volume-indicator/volume-indicator-root.js.map +1 -1
  246. package/dist/default/utils/use-attach-iframe.js +14 -0
  247. package/dist/default/utils/use-attach-iframe.js.map +1 -0
  248. package/dist/default/utils/use-media-instance.js +11 -3
  249. package/dist/default/utils/use-media-instance.js.map +1 -1
  250. package/dist/default/utils/use-render.js +1 -1
  251. package/dist/default/utils/use-render.js.map +1 -1
  252. package/dist/dev/icons/dist/react/default/airplay-enter.js +16 -0
  253. package/dist/dev/icons/dist/react/default/airplay-enter.js.map +1 -0
  254. package/dist/dev/icons/dist/react/default/airplay-exit.js +28 -0
  255. package/dist/dev/icons/dist/react/default/airplay-exit.js.map +1 -0
  256. package/dist/dev/icons/dist/react/default/captions-off.js +5 -0
  257. package/dist/dev/icons/dist/react/default/captions-off.js.map +1 -1
  258. package/dist/dev/icons/dist/react/default/gear.js +16 -0
  259. package/dist/dev/icons/dist/react/default/gear.js.map +1 -0
  260. package/dist/dev/icons/dist/react/default/index.d.ts +8 -1
  261. package/dist/dev/icons/dist/react/default/index.d.ts.map +1 -1
  262. package/dist/dev/icons/dist/react/default/quality.js +16 -0
  263. package/dist/dev/icons/dist/react/default/quality.js.map +1 -0
  264. package/dist/dev/icons/dist/react/default/speech.js +19 -0
  265. package/dist/dev/icons/dist/react/default/speech.js.map +1 -0
  266. package/dist/dev/icons/dist/react/default/speed.js +52 -0
  267. package/dist/dev/icons/dist/react/default/speed.js.map +1 -0
  268. package/dist/dev/icons/dist/react/default/switches.js +19 -0
  269. package/dist/dev/icons/dist/react/default/switches.js.map +1 -0
  270. package/dist/dev/icons/dist/react/minimal/airplay-enter.js +16 -0
  271. package/dist/dev/icons/dist/react/minimal/airplay-enter.js.map +1 -0
  272. package/dist/dev/icons/dist/react/minimal/airplay-exit.js +28 -0
  273. package/dist/dev/icons/dist/react/minimal/airplay-exit.js.map +1 -0
  274. package/dist/dev/icons/dist/react/minimal/captions-off.js +5 -0
  275. package/dist/dev/icons/dist/react/minimal/captions-off.js.map +1 -1
  276. package/dist/dev/icons/dist/react/minimal/gear.js +16 -0
  277. package/dist/dev/icons/dist/react/minimal/gear.js.map +1 -0
  278. package/dist/dev/icons/dist/react/minimal/index.d.ts +8 -1
  279. package/dist/dev/icons/dist/react/minimal/index.d.ts.map +1 -1
  280. package/dist/dev/icons/dist/react/minimal/quality.js +16 -0
  281. package/dist/dev/icons/dist/react/minimal/quality.js.map +1 -0
  282. package/dist/dev/icons/dist/react/minimal/speech.js +54 -0
  283. package/dist/dev/icons/dist/react/minimal/speech.js.map +1 -0
  284. package/dist/dev/icons/dist/react/minimal/speed.js +52 -0
  285. package/dist/dev/icons/dist/react/minimal/speed.js.map +1 -0
  286. package/dist/dev/icons/dist/react/minimal/switches.js +19 -0
  287. package/dist/dev/icons/dist/react/minimal/switches.js.map +1 -0
  288. package/dist/dev/icons/index.d.ts +2 -2
  289. package/dist/dev/icons/index.js +8 -1
  290. package/dist/dev/icons/minimal/index.d.ts +2 -2
  291. package/dist/dev/icons/minimal/index.js +8 -1
  292. package/dist/dev/index.d.ts +19 -15
  293. package/dist/dev/index.js +21 -17
  294. package/dist/dev/media/dash-video/index.d.ts.map +1 -1
  295. package/dist/dev/media/dash-video/index.js +5 -1
  296. package/dist/dev/media/dash-video/index.js.map +1 -1
  297. package/dist/dev/media/hlsjs-video/index.d.ts +15 -0
  298. package/dist/dev/media/hlsjs-video/index.d.ts.map +1 -0
  299. package/dist/dev/media/{hls-video → hlsjs-video}/index.js +9 -5
  300. package/dist/dev/media/hlsjs-video/index.js.map +1 -0
  301. package/dist/dev/media/mux-audio/index.d.ts +2 -2
  302. package/dist/dev/media/mux-audio/index.d.ts.map +1 -1
  303. package/dist/dev/media/mux-audio/index.js +9 -3
  304. package/dist/dev/media/mux-audio/index.js.map +1 -1
  305. package/dist/dev/media/mux-video/index.d.ts +2 -2
  306. package/dist/dev/media/mux-video/index.d.ts.map +1 -1
  307. package/dist/dev/media/mux-video/index.js +9 -3
  308. package/dist/dev/media/mux-video/index.js.map +1 -1
  309. package/dist/dev/media/native-hls-video/index.d.ts.map +1 -1
  310. package/dist/dev/media/native-hls-video/index.js +5 -1
  311. package/dist/dev/media/native-hls-video/index.js.map +1 -1
  312. package/dist/dev/media/simple-hls-audio-only/index.d.ts +15 -0
  313. package/dist/dev/media/simple-hls-audio-only/index.d.ts.map +1 -0
  314. package/dist/dev/media/simple-hls-audio-only/index.js +22 -0
  315. package/dist/dev/media/simple-hls-audio-only/index.js.map +1 -0
  316. package/dist/dev/media/simple-hls-video/index.js +1 -1
  317. package/dist/dev/media/vimeo-video/index.d.ts +15 -0
  318. package/dist/dev/media/vimeo-video/index.d.ts.map +1 -0
  319. package/dist/dev/media/vimeo-video/index.js +37 -0
  320. package/dist/dev/media/vimeo-video/index.js.map +1 -0
  321. package/dist/dev/player/context.d.ts +8 -0
  322. package/dist/dev/player/context.d.ts.map +1 -1
  323. package/dist/dev/player/context.js.map +1 -1
  324. package/dist/dev/player/create-player.js +13 -4
  325. package/dist/dev/player/create-player.js.map +1 -1
  326. package/dist/dev/presets/audio/minimal-skin.css +414 -69
  327. package/dist/dev/presets/audio/minimal-skin.d.ts.map +1 -1
  328. package/dist/dev/presets/audio/minimal-skin.js +69 -39
  329. package/dist/dev/presets/audio/minimal-skin.js.map +1 -1
  330. package/dist/dev/presets/audio/minimal-skin.tailwind.d.ts.map +1 -1
  331. package/dist/dev/presets/audio/minimal-skin.tailwind.js +71 -42
  332. package/dist/dev/presets/audio/minimal-skin.tailwind.js.map +1 -1
  333. package/dist/dev/presets/audio/skin.css +419 -121
  334. package/dist/dev/presets/audio/skin.d.ts.map +1 -1
  335. package/dist/dev/presets/audio/skin.js +70 -40
  336. package/dist/dev/presets/audio/skin.js.map +1 -1
  337. package/dist/dev/presets/audio/skin.tailwind.d.ts.map +1 -1
  338. package/dist/dev/presets/audio/skin.tailwind.js +72 -42
  339. package/dist/dev/presets/audio/skin.tailwind.js.map +1 -1
  340. package/dist/dev/presets/live-audio/index.d.ts +2 -2
  341. package/dist/dev/presets/live-audio/index.js +2 -2
  342. package/dist/dev/presets/live-audio/minimal-skin.css +414 -69
  343. package/dist/dev/presets/live-audio/minimal-skin.d.ts.map +1 -1
  344. package/dist/dev/presets/live-audio/minimal-skin.js +26 -12
  345. package/dist/dev/presets/live-audio/minimal-skin.js.map +1 -1
  346. package/dist/dev/presets/live-audio/minimal-skin.tailwind.d.ts.map +1 -1
  347. package/dist/dev/presets/live-audio/minimal-skin.tailwind.js +27 -14
  348. package/dist/dev/presets/live-audio/minimal-skin.tailwind.js.map +1 -1
  349. package/dist/dev/presets/live-audio/skin.css +419 -121
  350. package/dist/dev/presets/live-audio/skin.d.ts +3 -1
  351. package/dist/dev/presets/live-audio/skin.d.ts.map +1 -1
  352. package/dist/dev/presets/live-audio/skin.js +32 -14
  353. package/dist/dev/presets/live-audio/skin.js.map +1 -1
  354. package/dist/dev/presets/live-audio/skin.tailwind.d.ts.map +1 -1
  355. package/dist/dev/presets/live-audio/skin.tailwind.js +27 -13
  356. package/dist/dev/presets/live-audio/skin.tailwind.js.map +1 -1
  357. package/dist/dev/presets/live-video/minimal-skin.css +566 -210
  358. package/dist/dev/presets/live-video/minimal-skin.d.ts +0 -7
  359. package/dist/dev/presets/live-video/minimal-skin.d.ts.map +1 -1
  360. package/dist/dev/presets/live-video/minimal-skin.js +93 -12
  361. package/dist/dev/presets/live-video/minimal-skin.js.map +1 -1
  362. package/dist/dev/presets/live-video/minimal-skin.tailwind.d.ts.map +1 -1
  363. package/dist/dev/presets/live-video/minimal-skin.tailwind.js +94 -13
  364. package/dist/dev/presets/live-video/minimal-skin.tailwind.js.map +1 -1
  365. package/dist/dev/presets/live-video/skin.css +581 -264
  366. package/dist/dev/presets/live-video/skin.d.ts +0 -6
  367. package/dist/dev/presets/live-video/skin.d.ts.map +1 -1
  368. package/dist/dev/presets/live-video/skin.js +95 -16
  369. package/dist/dev/presets/live-video/skin.js.map +1 -1
  370. package/dist/dev/presets/live-video/skin.tailwind.d.ts.map +1 -1
  371. package/dist/dev/presets/live-video/skin.tailwind.js +95 -17
  372. package/dist/dev/presets/live-video/skin.tailwind.js.map +1 -1
  373. package/dist/dev/presets/types.d.ts +2 -1
  374. package/dist/dev/presets/types.d.ts.map +1 -1
  375. package/dist/dev/presets/video/minimal-skin.css +566 -210
  376. package/dist/dev/presets/video/minimal-skin.d.ts.map +1 -1
  377. package/dist/dev/presets/video/minimal-skin.js +281 -53
  378. package/dist/dev/presets/video/minimal-skin.js.map +1 -1
  379. package/dist/dev/presets/video/minimal-skin.tailwind.d.ts.map +1 -1
  380. package/dist/dev/presets/video/minimal-skin.tailwind.js +284 -57
  381. package/dist/dev/presets/video/minimal-skin.tailwind.js.map +1 -1
  382. package/dist/dev/presets/video/skin.css +581 -264
  383. package/dist/dev/presets/video/skin.d.ts.map +1 -1
  384. package/dist/dev/presets/video/skin.js +282 -57
  385. package/dist/dev/presets/video/skin.js.map +1 -1
  386. package/dist/dev/presets/video/skin.tailwind.d.ts.map +1 -1
  387. package/dist/dev/presets/video/skin.tailwind.js +285 -61
  388. package/dist/dev/presets/video/skin.tailwind.js.map +1 -1
  389. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js +8 -3
  390. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -1
  391. package/dist/dev/skins/dist/default/default/tailwind/components/badge.js +6 -0
  392. package/dist/dev/skins/dist/default/default/tailwind/components/badge.js.map +1 -0
  393. package/dist/dev/skins/dist/default/default/tailwind/components/buffering.js +1 -4
  394. package/dist/dev/skins/dist/default/default/tailwind/components/buffering.js.map +1 -1
  395. package/dist/dev/skins/dist/default/default/tailwind/components/icon.js +1 -1
  396. package/dist/dev/skins/dist/default/default/tailwind/components/icon.js.map +1 -1
  397. package/dist/dev/skins/dist/default/default/tailwind/components/input-feedback.js +9 -9
  398. package/dist/dev/skins/dist/default/default/tailwind/components/input-feedback.js.map +1 -1
  399. package/dist/dev/skins/dist/default/default/tailwind/components/menu.js +26 -4
  400. package/dist/dev/skins/dist/default/default/tailwind/components/menu.js.map +1 -1
  401. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js +1 -1
  402. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js.map +1 -1
  403. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js +4 -3
  404. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js.map +1 -1
  405. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js +7 -1
  406. package/dist/dev/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
  407. package/dist/dev/skins/dist/default/default/tailwind/components/root.js +1 -1
  408. package/dist/dev/skins/dist/default/default/tailwind/components/root.js.map +1 -1
  409. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js +1 -1
  410. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js.map +1 -1
  411. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js +5 -3
  412. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
  413. package/dist/dev/skins/dist/default/default/tailwind/components/thumbnail.js +12 -0
  414. package/dist/dev/skins/dist/default/default/tailwind/components/thumbnail.js.map +1 -0
  415. package/dist/dev/skins/dist/default/default/tailwind/components/time.js +1 -1
  416. package/dist/dev/skins/dist/default/default/tailwind/components/time.js.map +1 -1
  417. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js +26 -13
  418. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
  419. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js +13 -3
  420. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -1
  421. package/dist/dev/skins/dist/default/minimal/tailwind/components/badge.js +6 -0
  422. package/dist/dev/skins/dist/default/minimal/tailwind/components/badge.js.map +1 -0
  423. package/dist/dev/skins/dist/default/minimal/tailwind/components/buffering.js +1 -1
  424. package/dist/dev/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -1
  425. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js +1 -1
  426. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -1
  427. package/dist/dev/skins/dist/default/minimal/tailwind/components/input-feedback.js +9 -9
  428. package/dist/dev/skins/dist/default/minimal/tailwind/components/input-feedback.js.map +1 -1
  429. package/dist/dev/skins/dist/default/minimal/tailwind/components/menu.js +25 -4
  430. package/dist/dev/skins/dist/default/minimal/tailwind/components/menu.js.map +1 -1
  431. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js +1 -1
  432. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -1
  433. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js +3 -2
  434. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -1
  435. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js +7 -1
  436. package/dist/dev/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
  437. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js +1 -1
  438. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js.map +1 -1
  439. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js +1 -1
  440. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -1
  441. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js +5 -3
  442. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
  443. package/dist/dev/skins/dist/default/minimal/tailwind/components/thumbnail.js +13 -0
  444. package/dist/dev/skins/dist/default/minimal/tailwind/components/thumbnail.js.map +1 -0
  445. package/dist/dev/skins/dist/default/minimal/tailwind/components/time.js +1 -1
  446. package/dist/dev/skins/dist/default/minimal/tailwind/components/time.js.map +1 -1
  447. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js +27 -11
  448. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
  449. package/dist/dev/skins/dist/default/shared/tailwind/icon-state.js +17 -2
  450. package/dist/dev/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
  451. package/dist/dev/tailwind.css +0 -24
  452. package/dist/dev/ui/airplay-button/airplay-button.d.ts +15 -0
  453. package/dist/dev/ui/airplay-button/airplay-button.d.ts.map +1 -0
  454. package/dist/dev/ui/airplay-button/airplay-button.js +17 -0
  455. package/dist/dev/ui/airplay-button/airplay-button.js.map +1 -0
  456. package/dist/dev/ui/airplay-button/index.d.ts +2 -0
  457. package/dist/dev/ui/airplay-button/index.js +2 -0
  458. package/dist/dev/ui/alert-dialog/alert-dialog-close.js +1 -1
  459. package/dist/dev/ui/alert-dialog/alert-dialog-popup.js +1 -1
  460. package/dist/dev/ui/audio-track/index.d.ts +2 -0
  461. package/dist/dev/ui/audio-track/index.js +2 -0
  462. package/dist/dev/ui/audio-track/use-audio-track-options.d.ts +25 -0
  463. package/dist/dev/ui/audio-track/use-audio-track-options.d.ts.map +1 -0
  464. package/dist/dev/ui/audio-track/use-audio-track-options.js +34 -0
  465. package/dist/dev/ui/audio-track/use-audio-track-options.js.map +1 -0
  466. package/dist/dev/ui/captions-radio-group/index.d.ts +2 -0
  467. package/dist/dev/ui/captions-radio-group/index.js +2 -0
  468. package/dist/dev/ui/captions-radio-group/use-captions-options.d.ts +26 -0
  469. package/dist/dev/ui/captions-radio-group/use-captions-options.d.ts.map +1 -0
  470. package/dist/dev/ui/captions-radio-group/use-captions-options.js +40 -0
  471. package/dist/dev/ui/captions-radio-group/use-captions-options.js.map +1 -0
  472. package/dist/dev/ui/create-media-button.js +23 -10
  473. package/dist/dev/ui/create-media-button.js.map +1 -1
  474. package/dist/dev/ui/error-dialog/error-dialog-description.js +1 -1
  475. package/dist/dev/ui/hooks/use-button.d.ts +2 -1
  476. package/dist/dev/ui/hooks/use-button.d.ts.map +1 -1
  477. package/dist/dev/ui/hooks/use-button.js.map +1 -1
  478. package/dist/dev/ui/hotkey/use-hotkey-shortcut.d.ts +7 -0
  479. package/dist/dev/ui/hotkey/use-hotkey-shortcut.d.ts.map +1 -0
  480. package/dist/dev/ui/hotkey/use-hotkey-shortcut.js +28 -0
  481. package/dist/dev/ui/hotkey/use-hotkey-shortcut.js.map +1 -0
  482. package/dist/dev/ui/hotkey/use-hotkey.js +1 -2
  483. package/dist/dev/ui/hotkey/use-hotkey.js.map +1 -1
  484. package/dist/dev/ui/input-indicators/use-input-indicator-root.js +2 -2
  485. package/dist/dev/ui/input-indicators/use-input-indicator-root.js.map +1 -1
  486. package/dist/dev/ui/input-indicators/use-rendered-indicator-state.js +7 -4
  487. package/dist/dev/ui/input-indicators/use-rendered-indicator-state.js.map +1 -1
  488. package/dist/dev/ui/live-button/live-button.js +1 -1
  489. package/dist/dev/ui/live-button/live-button.js.map +1 -1
  490. package/dist/dev/ui/menu/context.d.ts.map +1 -1
  491. package/dist/dev/ui/menu/context.js +16 -1
  492. package/dist/dev/ui/menu/context.js.map +1 -1
  493. package/dist/dev/ui/menu/index.parts.d.ts +3 -2
  494. package/dist/dev/ui/menu/index.parts.js +4 -2
  495. package/dist/dev/ui/menu/index.parts.js.map +1 -1
  496. package/dist/dev/ui/menu/menu-back.d.ts.map +1 -1
  497. package/dist/dev/ui/menu/menu-back.js +0 -1
  498. package/dist/dev/ui/menu/menu-back.js.map +1 -1
  499. package/dist/dev/ui/menu/menu-checkbox-item.d.ts.map +1 -1
  500. package/dist/dev/ui/menu/menu-checkbox-item.js +1 -2
  501. package/dist/dev/ui/menu/menu-checkbox-item.js.map +1 -1
  502. package/dist/dev/ui/menu/menu-content.d.ts.map +1 -1
  503. package/dist/dev/ui/menu/menu-content.js +23 -5
  504. package/dist/dev/ui/menu/menu-content.js.map +1 -1
  505. package/dist/dev/ui/menu/menu-group-label.d.ts +15 -0
  506. package/dist/dev/ui/menu/menu-group-label.d.ts.map +1 -0
  507. package/dist/dev/ui/menu/menu-group-label.js +29 -0
  508. package/dist/dev/ui/menu/menu-group-label.js.map +1 -0
  509. package/dist/dev/ui/menu/menu-group.d.ts +1 -4
  510. package/dist/dev/ui/menu/menu-group.d.ts.map +1 -1
  511. package/dist/dev/ui/menu/menu-group.js +7 -9
  512. package/dist/dev/ui/menu/menu-group.js.map +1 -1
  513. package/dist/dev/ui/menu/menu-item-indicator.d.ts.map +1 -1
  514. package/dist/dev/ui/menu/menu-item-indicator.js +1 -2
  515. package/dist/dev/ui/menu/menu-item-indicator.js.map +1 -1
  516. package/dist/dev/ui/menu/menu-item-setting-provider.js +72 -0
  517. package/dist/dev/ui/menu/menu-item-setting-provider.js.map +1 -0
  518. package/dist/dev/ui/menu/menu-item-type.d.ts +5 -0
  519. package/dist/dev/ui/menu/menu-item-type.d.ts.map +1 -0
  520. package/dist/dev/ui/menu/menu-item-value.d.ts +14 -0
  521. package/dist/dev/ui/menu/menu-item-value.d.ts.map +1 -0
  522. package/dist/dev/ui/menu/menu-item-value.js +28 -0
  523. package/dist/dev/ui/menu/menu-item-value.js.map +1 -0
  524. package/dist/dev/ui/menu/menu-item.d.ts +3 -0
  525. package/dist/dev/ui/menu/menu-item.d.ts.map +1 -1
  526. package/dist/dev/ui/menu/menu-item.js +44 -23
  527. package/dist/dev/ui/menu/menu-item.js.map +1 -1
  528. package/dist/dev/ui/menu/menu-radio-group.d.ts +0 -2
  529. package/dist/dev/ui/menu/menu-radio-group.d.ts.map +1 -1
  530. package/dist/dev/ui/menu/menu-radio-group.js +6 -9
  531. package/dist/dev/ui/menu/menu-radio-group.js.map +1 -1
  532. package/dist/dev/ui/menu/menu-radio-item.d.ts.map +1 -1
  533. package/dist/dev/ui/menu/menu-radio-item.js +1 -2
  534. package/dist/dev/ui/menu/menu-radio-item.js.map +1 -1
  535. package/dist/dev/ui/menu/menu-root.js +1 -1
  536. package/dist/dev/ui/menu/menu-separator.d.ts.map +1 -1
  537. package/dist/dev/ui/menu/menu-separator.js +1 -2
  538. package/dist/dev/ui/menu/menu-separator.js.map +1 -1
  539. package/dist/dev/ui/menu/menu-trigger.d.ts +5 -2
  540. package/dist/dev/ui/menu/menu-trigger.d.ts.map +1 -1
  541. package/dist/dev/ui/menu/menu-trigger.js +85 -29
  542. package/dist/dev/ui/menu/menu-trigger.js.map +1 -1
  543. package/dist/dev/ui/menu/use-menu-group.js +31 -0
  544. package/dist/dev/ui/menu/use-menu-group.js.map +1 -0
  545. package/dist/dev/ui/playback-rate/index.d.ts +2 -0
  546. package/dist/dev/ui/playback-rate/index.js +2 -0
  547. package/dist/dev/ui/playback-rate/use-playback-rate-options.d.ts +28 -0
  548. package/dist/dev/ui/playback-rate/use-playback-rate-options.d.ts.map +1 -0
  549. package/dist/dev/ui/playback-rate/use-playback-rate-options.js +37 -0
  550. package/dist/dev/ui/playback-rate/use-playback-rate-options.js.map +1 -0
  551. package/dist/dev/ui/playback-rate-button/playback-rate-button.d.ts.map +1 -1
  552. package/dist/dev/ui/playback-rate-button/playback-rate-button.js +2 -1
  553. package/dist/dev/ui/playback-rate-button/playback-rate-button.js.map +1 -1
  554. package/dist/dev/ui/poster/poster.d.ts.map +1 -1
  555. package/dist/dev/ui/poster/poster.js +17 -3
  556. package/dist/dev/ui/poster/poster.js.map +1 -1
  557. package/dist/dev/ui/quality/index.d.ts +2 -0
  558. package/dist/dev/ui/quality/index.js +2 -0
  559. package/dist/dev/ui/quality/use-quality-options.d.ts +27 -0
  560. package/dist/dev/ui/quality/use-quality-options.d.ts.map +1 -0
  561. package/dist/dev/ui/quality/use-quality-options.js +40 -0
  562. package/dist/dev/ui/quality/use-quality-options.js.map +1 -0
  563. package/dist/dev/ui/seek-button/seek-button.d.ts.map +1 -1
  564. package/dist/dev/ui/seek-button/seek-button.js +3 -1
  565. package/dist/dev/ui/seek-button/seek-button.js.map +1 -1
  566. package/dist/dev/ui/time/time-value.d.ts.map +1 -1
  567. package/dist/dev/ui/time/time-value.js +32 -5
  568. package/dist/dev/ui/time/time-value.js.map +1 -1
  569. package/dist/dev/ui/time-slider/time-slider-root.d.ts.map +1 -1
  570. package/dist/dev/ui/time-slider/time-slider-root.js +18 -6
  571. package/dist/dev/ui/time-slider/time-slider-root.js.map +1 -1
  572. package/dist/dev/ui/tooltip/context.d.ts +7 -3
  573. package/dist/dev/ui/tooltip/context.d.ts.map +1 -1
  574. package/dist/dev/ui/tooltip/context.js.map +1 -1
  575. package/dist/dev/ui/tooltip/index.d.ts +2 -2
  576. package/dist/dev/ui/tooltip/index.parts.d.ts +3 -1
  577. package/dist/dev/ui/tooltip/index.parts.js +4 -0
  578. package/dist/dev/ui/tooltip/index.parts.js.map +1 -1
  579. package/dist/dev/ui/tooltip/tooltip-arrow.js +1 -1
  580. package/dist/dev/ui/tooltip/tooltip-label.d.ts +15 -0
  581. package/dist/dev/ui/tooltip/tooltip-label.d.ts.map +1 -0
  582. package/dist/dev/ui/tooltip/tooltip-label.js +24 -0
  583. package/dist/dev/ui/tooltip/tooltip-label.js.map +1 -0
  584. package/dist/dev/ui/tooltip/tooltip-popup.d.ts.map +1 -1
  585. package/dist/dev/ui/tooltip/tooltip-popup.js +7 -3
  586. package/dist/dev/ui/tooltip/tooltip-popup.js.map +1 -1
  587. package/dist/dev/ui/tooltip/tooltip-root.js +1 -1
  588. package/dist/dev/ui/tooltip/tooltip-root.js.map +1 -1
  589. package/dist/dev/ui/tooltip/tooltip-shortcut.d.ts +15 -0
  590. package/dist/dev/ui/tooltip/tooltip-shortcut.d.ts.map +1 -0
  591. package/dist/dev/ui/tooltip/tooltip-shortcut.js +25 -0
  592. package/dist/dev/ui/tooltip/tooltip-shortcut.js.map +1 -0
  593. package/dist/dev/ui/volume-indicator/volume-indicator-root.d.ts.map +1 -1
  594. package/dist/dev/ui/volume-indicator/volume-indicator-root.js +1 -1
  595. package/dist/dev/ui/volume-indicator/volume-indicator-root.js.map +1 -1
  596. package/dist/dev/utils/use-attach-iframe.js +14 -0
  597. package/dist/dev/utils/use-attach-iframe.js.map +1 -0
  598. package/dist/dev/utils/use-media-instance.d.ts +7 -2
  599. package/dist/dev/utils/use-media-instance.d.ts.map +1 -1
  600. package/dist/dev/utils/use-media-instance.js +11 -3
  601. package/dist/dev/utils/use-media-instance.js.map +1 -1
  602. package/dist/dev/utils/use-render.d.ts.map +1 -1
  603. package/dist/dev/utils/use-render.js +1 -1
  604. package/dist/dev/utils/use-render.js.map +1 -1
  605. package/docs/README.md +1 -1
  606. package/docs/concepts/browser-support.md +1 -1
  607. package/docs/concepts/cast.md +162 -0
  608. package/docs/concepts/features.md +1 -1
  609. package/docs/concepts/overview.md +4 -4
  610. package/docs/concepts/presets.md +32 -6
  611. package/docs/concepts/skins.md +903 -318
  612. package/docs/concepts/why-videojs.md +1 -1
  613. package/docs/how-to/build-with-ai.md +7 -7
  614. package/docs/how-to/build-your-own-component.md +3 -3
  615. package/docs/how-to/customize-skins.md +2721 -847
  616. package/docs/how-to/installation.md +10 -10
  617. package/docs/llms.txt +23 -1
  618. package/docs/reference/airplay-button.md +264 -0
  619. package/docs/reference/audio-track-radio-group.md +59 -0
  620. package/docs/reference/background-video.md +76 -0
  621. package/docs/reference/captions-button.md +16 -0
  622. package/docs/reference/cast-button.md +236 -0
  623. package/docs/reference/dash-video.md +138 -0
  624. package/docs/reference/feature-audio-track.md +60 -0
  625. package/docs/reference/feature-fullscreen.md +20 -3
  626. package/docs/reference/feature-orientation-lock.md +35 -0
  627. package/docs/reference/feature-quality.md +70 -0
  628. package/docs/reference/feature-remote-playback.md +3 -1
  629. package/docs/reference/feature-text-tracks.md +10 -0
  630. package/docs/reference/hlsjs-video.md +274 -0
  631. package/docs/reference/menu.md +1194 -0
  632. package/docs/reference/mux-audio.md +218 -0
  633. package/docs/reference/mux-video.md +275 -0
  634. package/docs/reference/native-hls-video.md +212 -0
  635. package/docs/reference/play-button.md +1 -1
  636. package/docs/reference/playback-rate-button.md +16 -0
  637. package/docs/reference/player-container.md +9 -3
  638. package/docs/reference/player-provider.md +3 -1
  639. package/docs/reference/quality-radio-group.md +59 -0
  640. package/docs/reference/simple-hls-audio-only.md +93 -0
  641. package/docs/reference/simple-hls-video.md +150 -0
  642. package/docs/reference/time-slider.md +12 -0
  643. package/docs/reference/time.md +24 -0
  644. package/docs/reference/tooltip.md +89 -5
  645. package/docs/reference/use-media-attach.md +2 -2
  646. package/docs/reference/use-media.md +103 -2
  647. package/docs/reference/use-player-context.md +1 -1
  648. package/docs/reference/use-player.md +16 -1
  649. package/docs/reference/use-selector.md +1 -1
  650. package/docs/reference/use-snapshot.md +3 -3
  651. package/docs/reference/volume-slider.md +1 -1
  652. package/package.json +7 -7
  653. package/dist/default/media/hls-video/index.js.map +0 -1
  654. package/dist/default/skins/dist/default/default/tailwind/components/preview.js +0 -12
  655. package/dist/default/skins/dist/default/default/tailwind/components/preview.js.map +0 -1
  656. package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js +0 -13
  657. package/dist/default/skins/dist/default/minimal/tailwind/components/preview.js.map +0 -1
  658. package/dist/default/ui/hotkey/use-aria-key-shortcuts.js +0 -16
  659. package/dist/default/ui/hotkey/use-aria-key-shortcuts.js.map +0 -1
  660. package/dist/default/ui/menu/menu-label.js +0 -23
  661. package/dist/default/ui/menu/menu-label.js.map +0 -1
  662. package/dist/default/ui/playback-rate-menu/context.js +0 -20
  663. package/dist/default/ui/playback-rate-menu/context.js.map +0 -1
  664. package/dist/default/ui/playback-rate-menu/index.js +0 -3
  665. package/dist/default/ui/playback-rate-menu/index.parts.js +0 -17
  666. package/dist/default/ui/playback-rate-menu/index.parts.js.map +0 -1
  667. package/dist/default/ui/playback-rate-menu/playback-rate-menu-content.js +0 -28
  668. package/dist/default/ui/playback-rate-menu/playback-rate-menu-content.js.map +0 -1
  669. package/dist/default/ui/playback-rate-menu/playback-rate-menu-root.js +0 -36
  670. package/dist/default/ui/playback-rate-menu/playback-rate-menu-root.js.map +0 -1
  671. package/dist/default/ui/playback-rate-menu/playback-rate-menu-trigger.js +0 -51
  672. package/dist/default/ui/playback-rate-menu/playback-rate-menu-trigger.js.map +0 -1
  673. package/dist/default/ui/playback-rate-menu/use-playback-rate-menu.js +0 -27
  674. package/dist/default/ui/playback-rate-menu/use-playback-rate-menu.js.map +0 -1
  675. package/dist/dev/media/hls-video/index.d.ts +0 -15
  676. package/dist/dev/media/hls-video/index.d.ts.map +0 -1
  677. package/dist/dev/media/hls-video/index.js.map +0 -1
  678. package/dist/dev/skins/dist/default/default/tailwind/components/preview.js +0 -12
  679. package/dist/dev/skins/dist/default/default/tailwind/components/preview.js.map +0 -1
  680. package/dist/dev/skins/dist/default/minimal/tailwind/components/preview.js +0 -13
  681. package/dist/dev/skins/dist/default/minimal/tailwind/components/preview.js.map +0 -1
  682. package/dist/dev/ui/hotkey/use-aria-key-shortcuts.d.ts +0 -5
  683. package/dist/dev/ui/hotkey/use-aria-key-shortcuts.d.ts.map +0 -1
  684. package/dist/dev/ui/hotkey/use-aria-key-shortcuts.js +0 -16
  685. package/dist/dev/ui/hotkey/use-aria-key-shortcuts.js.map +0 -1
  686. package/dist/dev/ui/menu/menu-label.d.ts +0 -15
  687. package/dist/dev/ui/menu/menu-label.d.ts.map +0 -1
  688. package/dist/dev/ui/menu/menu-label.js +0 -23
  689. package/dist/dev/ui/menu/menu-label.js.map +0 -1
  690. package/dist/dev/ui/playback-rate-menu/context.js +0 -20
  691. package/dist/dev/ui/playback-rate-menu/context.js.map +0 -1
  692. package/dist/dev/ui/playback-rate-menu/index.d.ts +0 -3
  693. package/dist/dev/ui/playback-rate-menu/index.js +0 -3
  694. package/dist/dev/ui/playback-rate-menu/index.parts.d.ts +0 -12
  695. package/dist/dev/ui/playback-rate-menu/index.parts.d.ts.map +0 -1
  696. package/dist/dev/ui/playback-rate-menu/index.parts.js +0 -17
  697. package/dist/dev/ui/playback-rate-menu/index.parts.js.map +0 -1
  698. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-content.d.ts +0 -14
  699. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-content.d.ts.map +0 -1
  700. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-content.js +0 -28
  701. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-content.js.map +0 -1
  702. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-root.d.ts +0 -23
  703. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-root.d.ts.map +0 -1
  704. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-root.js +0 -39
  705. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-root.js.map +0 -1
  706. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger.d.ts +0 -14
  707. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger.d.ts.map +0 -1
  708. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger.js +0 -51
  709. package/dist/dev/ui/playback-rate-menu/playback-rate-menu-trigger.js.map +0 -1
  710. package/dist/dev/ui/playback-rate-menu/use-playback-rate-menu.d.ts +0 -26
  711. package/dist/dev/ui/playback-rate-menu/use-playback-rate-menu.d.ts.map +0 -1
  712. package/dist/dev/ui/playback-rate-menu/use-playback-rate-menu.js +0 -27
  713. package/dist/dev/ui/playback-rate-menu/use-playback-rate-menu.js.map +0 -1
@@ -2,8 +2,11 @@
2
2
  import { useComposedRefs } from "../../utils/use-composed-refs.js";
3
3
  import { renderElement } from "../../utils/use-render.js";
4
4
  import { useTooltipContext } from "./context.js";
5
+ import { TooltipLabel } from "./tooltip-label.js";
6
+ import { TooltipShortcut } from "./tooltip-shortcut.js";
5
7
  import { getAnchorPositionStyle, getPopupPositionRect, getPositioningBoundaryRect, isEventWithinElement, resolveOffsets, resolvePositioningBoundary } from "@videojs/core/dom";
6
8
  import { forwardRef, useCallback, useLayoutEffect, useMemo, useRef, useState } from "react";
9
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
10
  import { TooltipCSSVars } from "@videojs/core";
8
11
  import { supportsAnchorPositioning } from "@videojs/utils/dom";
9
12
  //#region src/ui/tooltip/tooltip-popup.tsx
@@ -13,8 +16,8 @@ const POPUP_RESET = {
13
16
  margin: 0
14
17
  };
15
18
  /** Container for the tooltip content. Positioned relative to the trigger using CSS anchor positioning with a JavaScript fallback. */
16
- const TooltipPopup = forwardRef(function TooltipPopup({ render, className, style, ...elementProps }, forwardedRef) {
17
- const { core, tooltip, state, stateAttrMap, anchorName, popupId, content, boundary, container } = useTooltipContext();
19
+ const TooltipPopup = forwardRef(function TooltipPopup({ render, className, style, children, ...elementProps }, forwardedRef) {
20
+ const { core, tooltip, state, stateAttrMap, anchorName, popupId, boundary, container } = useTooltipContext();
18
21
  const internalRef = useRef(null);
19
22
  const composedRef = useComposedRefs(forwardedRef, useCallback((el) => {
20
23
  tooltip.setPopupElement(el);
@@ -88,6 +91,7 @@ const TooltipPopup = forwardRef(function TooltipPopup({ render, className, style
88
91
  ]);
89
92
  const positioningStyle = manualStyle ?? anchorStyle ?? POPUP_RESET;
90
93
  if (!state.open) return null;
94
+ const body = children !== void 0 ? children : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(TooltipLabel, {}), /* @__PURE__ */ jsx(TooltipShortcut, {})] });
91
95
  const { onFocusOut, ...restPopupProps } = tooltip.popupProps;
92
96
  return renderElement("div", {
93
97
  render,
@@ -103,7 +107,7 @@ const TooltipPopup = forwardRef(function TooltipPopup({ render, className, style
103
107
  style: positioningStyle,
104
108
  ...core.getPopupAttrs(state)
105
109
  },
106
- { children: content },
110
+ { children: body },
107
111
  {
108
112
  ...restPopupProps,
109
113
  onBlur: onFocusOut
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip-popup.js","names":[],"sources":["../../../../src/ui/tooltip/tooltip-popup.tsx"],"sourcesContent":["'use client';\n\nimport type { TooltipState } from '@videojs/core';\nimport { TooltipCSSVars } from '@videojs/core';\nimport {\n getAnchorPositionStyle,\n getPopupPositionRect,\n getPositioningBoundaryRect,\n isEventWithinElement,\n resolveOffsets,\n resolvePositioningBoundary,\n} from '@videojs/core/dom';\nimport { supportsAnchorPositioning } from '@videojs/utils/dom';\nimport type { CSSProperties } from 'react';\nimport { forwardRef, useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { useComposedRefs } from '../../utils/use-composed-refs';\nimport { renderElement } from '../../utils/use-render';\nimport { useTooltipContext } from './context';\n\nexport interface TooltipPopupProps extends UIComponentProps<'div', TooltipState> {}\n\nconst POPUP_RESET: CSSProperties = { position: 'fixed', inset: 'auto', margin: 0 };\n\n/** Container for the tooltip content. Positioned relative to the trigger using CSS anchor positioning with a JavaScript fallback. */\nexport const TooltipPopup = forwardRef<HTMLDivElement, TooltipPopupProps>(function TooltipPopup(\n { render, className, style, ...elementProps },\n forwardedRef\n) {\n const { core, tooltip, state, stateAttrMap, anchorName, popupId, content, boundary, container } = useTooltipContext();\n const internalRef = useRef<HTMLDivElement>(null);\n\n const popupRef = useCallback(\n (el: HTMLDivElement | null) => {\n tooltip.setPopupElement(el);\n if (el && supportsAnchorPositioning()) {\n el.style.setProperty('position-anchor', `--${anchorName}`);\n }\n },\n [tooltip, anchorName]\n );\n\n const composedRef = useComposedRefs(forwardedRef, popupRef, internalRef);\n\n // --- Positioning ---\n\n const posOpts = useMemo(() => ({ side: state.side, align: state.align }), [state.side, state.align]);\n\n // CSS Anchor Positioning — computed from state, no measurement needed.\n // `position-anchor` is set imperatively in the ref callback above\n // because React's style prop silently drops unrecognised CSS properties.\n const anchorStyle = useMemo(() => {\n if (!supportsAnchorPositioning()) return null;\n const { positionAnchor: _, ...rest } = getAnchorPositionStyle(\n anchorName,\n posOpts,\n undefined,\n undefined,\n undefined,\n undefined,\n TooltipCSSVars\n );\n return rest as CSSProperties;\n }, [anchorName, posOpts]);\n\n // Manual fallback — measure rects after layout, before paint.\n const [manualStyle, setManualStyle] = useState<CSSProperties | null>(null);\n\n useLayoutEffect(() => {\n if (!state.open) {\n setManualStyle(null);\n return;\n }\n\n function measure(): void {\n const triggerEl = tooltip.triggerElement;\n const popupEl = internalRef.current;\n if (!triggerEl || !popupEl) return;\n\n const triggerRect = triggerEl.getBoundingClientRect();\n const root = popupEl.getRootNode() as Document | ShadowRoot;\n const boundaryElement = resolvePositioningBoundary(boundary, { container, root });\n const popupRect = supportsAnchorPositioning() ? undefined : getPopupPositionRect(popupEl);\n const boundaryRect = getPositioningBoundaryRect(boundaryElement);\n const offsets = resolveOffsets(popupEl, TooltipCSSVars);\n\n const { positionAnchor: _, ...nextStyle } = getAnchorPositionStyle(\n anchorName,\n posOpts,\n triggerRect,\n popupRect,\n boundaryRect,\n offsets,\n TooltipCSSVars\n );\n\n setManualStyle(nextStyle as CSSProperties);\n }\n\n measure();\n const triggerEl = tooltip.triggerElement;\n const popupEl = internalRef.current;\n const boundaryElement = popupEl\n ? resolvePositioningBoundary(boundary, {\n container,\n root: popupEl.getRootNode() as Document | ShadowRoot,\n })\n : null;\n\n let rafId = 0;\n function reposition(event?: Event): void {\n if (event && isEventWithinElement(event, internalRef.current)) return;\n\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(measure);\n }\n\n // Re-measure after the tooltip has entered the top layer and whenever\n // its own size or the trigger size changes.\n reposition();\n\n const resizeObserver =\n typeof ResizeObserver === 'function'\n ? new ResizeObserver(() => {\n reposition();\n })\n : null;\n\n if (triggerEl && resizeObserver) {\n resizeObserver.observe(triggerEl);\n }\n\n if (popupEl && resizeObserver) {\n resizeObserver.observe(popupEl);\n }\n if (boundaryElement && resizeObserver) {\n resizeObserver.observe(boundaryElement);\n }\n\n window.addEventListener('scroll', reposition, { capture: true, passive: true });\n window.addEventListener('resize', reposition);\n\n return () => {\n cancelAnimationFrame(rafId);\n resizeObserver?.disconnect();\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }, [state.open, anchorName, posOpts, tooltip, boundary, container]);\n\n // Anchor path uses computed styles; manual path uses measured styles;\n // fallback resets UA [popover] defaults until positioning is computed.\n const positioningStyle = manualStyle ?? anchorStyle ?? POPUP_RESET;\n\n // --- Visibility ---\n\n if (!state.open) {\n return null;\n }\n\n // Remap DOM focus events to React synthetic event names.\n const { onFocusOut, ...restPopupProps } = tooltip.popupProps;\n\n return renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap,\n ref: composedRef,\n props: [\n {\n id: popupId,\n style: positioningStyle,\n ...core.getPopupAttrs(state),\n },\n // Forwarded content as default children — explicit children override.\n { children: content },\n { ...restPopupProps, onBlur: onFocusOut },\n elementProps,\n ],\n }\n );\n});\n\nexport namespace TooltipPopup {\n export type Props = TooltipPopupProps;\n export type State = TooltipState;\n}\n"],"mappings":";;;;;;;;;AAuBA,MAAM,cAA6B;CAAE,UAAU;CAAS,OAAO;CAAQ,QAAQ;CAAG;;AAGlF,MAAa,eAAe,WAA8C,SAAS,aACjF,EAAE,QAAQ,WAAW,OAAO,GAAG,gBAC/B,cACA;CACA,MAAM,EAAE,MAAM,SAAS,OAAO,cAAc,YAAY,SAAS,SAAS,UAAU,cAAc,mBAAmB;CACrH,MAAM,cAAc,OAAuB,KAAK;CAYhD,MAAM,cAAc,gBAAgB,cAVnB,aACd,OAA8B;AAC7B,UAAQ,gBAAgB,GAAG;AAC3B,MAAI,MAAM,2BAA2B,CACnC,IAAG,MAAM,YAAY,mBAAmB,KAAK,aAAa;IAG9D,CAAC,SAAS,WAAW,CACtB,EAE2D,YAAY;CAIxE,MAAM,UAAU,eAAe;EAAE,MAAM,MAAM;EAAM,OAAO,MAAM;EAAO,GAAG,CAAC,MAAM,MAAM,MAAM,MAAM,CAAC;CAKpG,MAAM,cAAc,cAAc;AAChC,MAAI,CAAC,2BAA2B,CAAE,QAAO;EACzC,MAAM,EAAE,gBAAgB,GAAG,GAAG,SAAS,uBACrC,YACA,SACA,KAAA,GACA,KAAA,GACA,KAAA,GACA,KAAA,GACA,eACD;AACD,SAAO;IACN,CAAC,YAAY,QAAQ,CAAC;CAGzB,MAAM,CAAC,aAAa,kBAAkB,SAA+B,KAAK;AAE1E,uBAAsB;AACpB,MAAI,CAAC,MAAM,MAAM;AACf,kBAAe,KAAK;AACpB;;EAGF,SAAS,UAAgB;GACvB,MAAM,YAAY,QAAQ;GAC1B,MAAM,UAAU,YAAY;AAC5B,OAAI,CAAC,aAAa,CAAC,QAAS;GAE5B,MAAM,cAAc,UAAU,uBAAuB;GAErD,MAAM,kBAAkB,2BAA2B,UAAU;IAAE;IAAW,MAD7D,QAAQ,aAAa;IAC8C,CAAC;GAKjF,MAAM,EAAE,gBAAgB,GAAG,GAAG,cAAc,uBAC1C,YACA,SACA,aAPgB,2BAA2B,GAAG,KAAA,IAAY,qBAAqB,QAAQ,EACpE,2BAA2B,gBAAgB,EAChD,eAAe,SAAS,eAAe,EASrD,eACD;AAED,kBAAe,UAA2B;;AAG5C,WAAS;EACT,MAAM,YAAY,QAAQ;EAC1B,MAAM,UAAU,YAAY;EAC5B,MAAM,kBAAkB,UACpB,2BAA2B,UAAU;GACnC;GACA,MAAM,QAAQ,aAAa;GAC5B,CAAC,GACF;EAEJ,IAAI,QAAQ;EACZ,SAAS,WAAW,OAAqB;AACvC,OAAI,SAAS,qBAAqB,OAAO,YAAY,QAAQ,CAAE;AAE/D,wBAAqB,MAAM;AAC3B,WAAQ,sBAAsB,QAAQ;;AAKxC,cAAY;EAEZ,MAAM,iBACJ,OAAO,mBAAmB,aACtB,IAAI,qBAAqB;AACvB,eAAY;IACZ,GACF;AAEN,MAAI,aAAa,eACf,gBAAe,QAAQ,UAAU;AAGnC,MAAI,WAAW,eACb,gBAAe,QAAQ,QAAQ;AAEjC,MAAI,mBAAmB,eACrB,gBAAe,QAAQ,gBAAgB;AAGzC,SAAO,iBAAiB,UAAU,YAAY;GAAE,SAAS;GAAM,SAAS;GAAM,CAAC;AAC/E,SAAO,iBAAiB,UAAU,WAAW;AAE7C,eAAa;AACX,wBAAqB,MAAM;AAC3B,mBAAgB,YAAY;AAC5B,UAAO,oBAAoB,UAAU,YAAY,KAAK;AACtD,UAAO,oBAAoB,UAAU,WAAW;;IAEjD;EAAC,MAAM;EAAM;EAAY;EAAS;EAAS;EAAU;EAAU,CAAC;CAInE,MAAM,mBAAmB,eAAe,eAAe;AAIvD,KAAI,CAAC,MAAM,KACT,QAAO;CAIT,MAAM,EAAE,YAAY,GAAG,mBAAmB,QAAQ;AAElD,QAAO,cACL,OACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE;EACA;EACA,KAAK;EACL,OAAO;GACL;IACE,IAAI;IACJ,OAAO;IACP,GAAG,KAAK,cAAc,MAAM;IAC7B;GAED,EAAE,UAAU,SAAS;GACrB;IAAE,GAAG;IAAgB,QAAQ;IAAY;GACzC;GACD;EACF,CACF;EACD"}
1
+ {"version":3,"file":"tooltip-popup.js","names":[],"sources":["../../../../src/ui/tooltip/tooltip-popup.tsx"],"sourcesContent":["'use client';\n\nimport { TooltipCSSVars, type TooltipState } from '@videojs/core';\nimport {\n getAnchorPositionStyle,\n getPopupPositionRect,\n getPositioningBoundaryRect,\n isEventWithinElement,\n resolveOffsets,\n resolvePositioningBoundary,\n} from '@videojs/core/dom';\nimport { supportsAnchorPositioning } from '@videojs/utils/dom';\nimport type { CSSProperties } from 'react';\nimport { forwardRef, useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { useComposedRefs } from '../../utils/use-composed-refs';\nimport { renderElement } from '../../utils/use-render';\nimport { useTooltipContext } from './context';\nimport { TooltipLabel } from './tooltip-label';\nimport { TooltipShortcut } from './tooltip-shortcut';\n\nexport interface TooltipPopupProps extends UIComponentProps<'div', TooltipState> {}\n\nconst POPUP_RESET: CSSProperties = { position: 'fixed', inset: 'auto', margin: 0 };\n\n/** Container for the tooltip content. Positioned relative to the trigger using CSS anchor positioning with a JavaScript fallback. */\nexport const TooltipPopup = forwardRef<HTMLDivElement, TooltipPopupProps>(function TooltipPopup(\n { render, className, style, children, ...elementProps },\n forwardedRef\n) {\n const { core, tooltip, state, stateAttrMap, anchorName, popupId, boundary, container } = useTooltipContext();\n const internalRef = useRef<HTMLDivElement>(null);\n\n const popupRef = useCallback(\n (el: HTMLDivElement | null) => {\n tooltip.setPopupElement(el);\n if (el && supportsAnchorPositioning()) {\n el.style.setProperty('position-anchor', `--${anchorName}`);\n }\n },\n [tooltip, anchorName]\n );\n\n const composedRef = useComposedRefs(forwardedRef, popupRef, internalRef);\n\n // --- Positioning ---\n\n const posOpts = useMemo(() => ({ side: state.side, align: state.align }), [state.side, state.align]);\n\n // CSS Anchor Positioning — computed from state, no measurement needed.\n // `position-anchor` is set imperatively in the ref callback above\n // because React's style prop silently drops unrecognized CSS properties.\n const anchorStyle = useMemo(() => {\n if (!supportsAnchorPositioning()) return null;\n const { positionAnchor: _, ...rest } = getAnchorPositionStyle(\n anchorName,\n posOpts,\n undefined,\n undefined,\n undefined,\n undefined,\n TooltipCSSVars\n );\n return rest as CSSProperties;\n }, [anchorName, posOpts]);\n\n // Manual fallback — measure rects after layout, before paint.\n const [manualStyle, setManualStyle] = useState<CSSProperties | null>(null);\n\n useLayoutEffect(() => {\n if (!state.open) {\n setManualStyle(null);\n return;\n }\n\n function measure(): void {\n const triggerEl = tooltip.triggerElement;\n const popupEl = internalRef.current;\n if (!triggerEl || !popupEl) return;\n\n const triggerRect = triggerEl.getBoundingClientRect();\n const root = popupEl.getRootNode() as Document | ShadowRoot;\n const boundaryElement = resolvePositioningBoundary(boundary, { container, root });\n const popupRect = supportsAnchorPositioning() ? undefined : getPopupPositionRect(popupEl);\n const boundaryRect = getPositioningBoundaryRect(boundaryElement);\n const offsets = resolveOffsets(popupEl, TooltipCSSVars);\n\n const { positionAnchor: _, ...nextStyle } = getAnchorPositionStyle(\n anchorName,\n posOpts,\n triggerRect,\n popupRect,\n boundaryRect,\n offsets,\n TooltipCSSVars\n );\n\n setManualStyle(nextStyle as CSSProperties);\n }\n\n measure();\n const triggerEl = tooltip.triggerElement;\n const popupEl = internalRef.current;\n const boundaryElement = popupEl\n ? resolvePositioningBoundary(boundary, {\n container,\n root: popupEl.getRootNode() as Document | ShadowRoot,\n })\n : null;\n\n let rafId = 0;\n function reposition(event?: Event): void {\n if (event && isEventWithinElement(event, internalRef.current)) return;\n\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(measure);\n }\n\n // Re-measure after the tooltip has entered the top layer and whenever\n // its own size or the trigger size changes.\n reposition();\n\n const resizeObserver =\n typeof ResizeObserver === 'function'\n ? new ResizeObserver(() => {\n reposition();\n })\n : null;\n\n if (triggerEl && resizeObserver) {\n resizeObserver.observe(triggerEl);\n }\n\n if (popupEl && resizeObserver) {\n resizeObserver.observe(popupEl);\n }\n if (boundaryElement && resizeObserver) {\n resizeObserver.observe(boundaryElement);\n }\n\n window.addEventListener('scroll', reposition, { capture: true, passive: true });\n window.addEventListener('resize', reposition);\n\n return () => {\n cancelAnimationFrame(rafId);\n resizeObserver?.disconnect();\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }, [state.open, anchorName, posOpts, tooltip, boundary, container]);\n\n // Anchor path uses computed styles; manual path uses measured styles;\n // fallback resets UA [popover] defaults until positioning is computed.\n const positioningStyle = manualStyle ?? anchorStyle ?? POPUP_RESET;\n\n // --- Visibility ---\n\n if (!state.open) {\n return null;\n }\n\n const body =\n children !== undefined ? (\n children\n ) : (\n <>\n <TooltipLabel />\n <TooltipShortcut />\n </>\n );\n\n // Remap DOM focus events to React synthetic event names.\n const { onFocusOut, ...restPopupProps } = tooltip.popupProps;\n\n return renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap,\n ref: composedRef,\n props: [\n {\n id: popupId,\n style: positioningStyle,\n ...core.getPopupAttrs(state),\n },\n { children: body },\n { ...restPopupProps, onBlur: onFocusOut },\n elementProps,\n ],\n }\n );\n});\n\nexport namespace TooltipPopup {\n export type Props = TooltipPopupProps;\n export type State = TooltipState;\n}\n"],"mappings":";;;;;;;;;;;;AAwBA,MAAM,cAA6B;CAAE,UAAU;CAAS,OAAO;CAAQ,QAAQ;CAAG;;AAGlF,MAAa,eAAe,WAA8C,SAAS,aACjF,EAAE,QAAQ,WAAW,OAAO,UAAU,GAAG,gBACzC,cACA;CACA,MAAM,EAAE,MAAM,SAAS,OAAO,cAAc,YAAY,SAAS,UAAU,cAAc,mBAAmB;CAC5G,MAAM,cAAc,OAAuB,KAAK;CAYhD,MAAM,cAAc,gBAAgB,cAVnB,aACd,OAA8B;AAC7B,UAAQ,gBAAgB,GAAG;AAC3B,MAAI,MAAM,2BAA2B,CACnC,IAAG,MAAM,YAAY,mBAAmB,KAAK,aAAa;IAG9D,CAAC,SAAS,WAAW,CACtB,EAE2D,YAAY;CAIxE,MAAM,UAAU,eAAe;EAAE,MAAM,MAAM;EAAM,OAAO,MAAM;EAAO,GAAG,CAAC,MAAM,MAAM,MAAM,MAAM,CAAC;CAKpG,MAAM,cAAc,cAAc;AAChC,MAAI,CAAC,2BAA2B,CAAE,QAAO;EACzC,MAAM,EAAE,gBAAgB,GAAG,GAAG,SAAS,uBACrC,YACA,SACA,KAAA,GACA,KAAA,GACA,KAAA,GACA,KAAA,GACA,eACD;AACD,SAAO;IACN,CAAC,YAAY,QAAQ,CAAC;CAGzB,MAAM,CAAC,aAAa,kBAAkB,SAA+B,KAAK;AAE1E,uBAAsB;AACpB,MAAI,CAAC,MAAM,MAAM;AACf,kBAAe,KAAK;AACpB;;EAGF,SAAS,UAAgB;GACvB,MAAM,YAAY,QAAQ;GAC1B,MAAM,UAAU,YAAY;AAC5B,OAAI,CAAC,aAAa,CAAC,QAAS;GAE5B,MAAM,cAAc,UAAU,uBAAuB;GAErD,MAAM,kBAAkB,2BAA2B,UAAU;IAAE;IAAW,MAD7D,QAAQ,aAAa;IAC8C,CAAC;GAKjF,MAAM,EAAE,gBAAgB,GAAG,GAAG,cAAc,uBAC1C,YACA,SACA,aAPgB,2BAA2B,GAAG,KAAA,IAAY,qBAAqB,QAAQ,EACpE,2BAA2B,gBAAgB,EAChD,eAAe,SAAS,eAAe,EASrD,eACD;AAED,kBAAe,UAA2B;;AAG5C,WAAS;EACT,MAAM,YAAY,QAAQ;EAC1B,MAAM,UAAU,YAAY;EAC5B,MAAM,kBAAkB,UACpB,2BAA2B,UAAU;GACnC;GACA,MAAM,QAAQ,aAAa;GAC5B,CAAC,GACF;EAEJ,IAAI,QAAQ;EACZ,SAAS,WAAW,OAAqB;AACvC,OAAI,SAAS,qBAAqB,OAAO,YAAY,QAAQ,CAAE;AAE/D,wBAAqB,MAAM;AAC3B,WAAQ,sBAAsB,QAAQ;;AAKxC,cAAY;EAEZ,MAAM,iBACJ,OAAO,mBAAmB,aACtB,IAAI,qBAAqB;AACvB,eAAY;IACZ,GACF;AAEN,MAAI,aAAa,eACf,gBAAe,QAAQ,UAAU;AAGnC,MAAI,WAAW,eACb,gBAAe,QAAQ,QAAQ;AAEjC,MAAI,mBAAmB,eACrB,gBAAe,QAAQ,gBAAgB;AAGzC,SAAO,iBAAiB,UAAU,YAAY;GAAE,SAAS;GAAM,SAAS;GAAM,CAAC;AAC/E,SAAO,iBAAiB,UAAU,WAAW;AAE7C,eAAa;AACX,wBAAqB,MAAM;AAC3B,mBAAgB,YAAY;AAC5B,UAAO,oBAAoB,UAAU,YAAY,KAAK;AACtD,UAAO,oBAAoB,UAAU,WAAW;;IAEjD;EAAC,MAAM;EAAM;EAAY;EAAS;EAAS;EAAU;EAAU,CAAC;CAInE,MAAM,mBAAmB,eAAe,eAAe;AAIvD,KAAI,CAAC,MAAM,KACT,QAAO;CAGT,MAAM,OACJ,aAAa,KAAA,IACX,WAEA,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,cAAD,EAAgB,CAAA,EAChB,oBAAC,iBAAD,EAAmB,CAAA,CAClB,EAAA,CAAA;CAIP,MAAM,EAAE,YAAY,GAAG,mBAAmB,QAAQ;AAElD,QAAO,cACL,OACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE;EACA;EACA,KAAK;EACL,OAAO;GACL;IACE,IAAI;IACJ,OAAO;IACP,GAAG,KAAK,cAAc,MAAM;IAC7B;GACD,EAAE,UAAU,MAAM;GAClB;IAAE,GAAG;IAAgB,QAAQ;IAAY;GACzC;GACD;EACF,CACF;EACD"}
@@ -2,8 +2,8 @@
2
2
  import { useOptionalContainer } from "../../player/context.js";
3
3
  import { useLatestRef } from "../../utils/use-latest-ref.js";
4
4
  import { useDestroy } from "../../utils/use-destroy.js";
5
- import { useSafeId } from "../../utils/use-safe-id.js";
6
5
  import { TooltipContextProvider } from "./context.js";
6
+ import { useSafeId } from "../../utils/use-safe-id.js";
7
7
  import { useOptionalControlsContext } from "../controls/context.js";
8
8
  import { useTooltipGroup } from "./group-context.js";
9
9
  import { createTooltip, createTransition } from "@videojs/core/dom";
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip-root.js","names":[],"sources":["../../../../src/ui/tooltip/tooltip-root.tsx"],"sourcesContent":["'use client';\n\nimport { type TooltipProps as CoreTooltipProps, TooltipCore, TooltipDataAttrs } from '@videojs/core';\nimport {\n createTooltip,\n createTransition,\n type PositioningBoundary,\n type TooltipChangeDetails,\n} from '@videojs/core/dom';\nimport { useSnapshot } from '@videojs/store/react';\nimport { isUndefined } from '@videojs/utils/predicate';\nimport type { ReactNode } from 'react';\nimport { useEffect, useState } from 'react';\nimport { useOptionalContainer } from '../../player/context';\nimport { useDestroy } from '../../utils/use-destroy';\nimport { useLatestRef } from '../../utils/use-latest-ref';\nimport { useSafeId } from '../../utils/use-safe-id';\nimport { useOptionalControlsContext } from '../controls/context';\nimport { TooltipContextProvider } from './context';\nimport { useTooltipGroup } from './group-context';\n\nexport interface TooltipRootProps extends CoreTooltipProps {\n /** Boundary used to constrain the popup size. */\n boundary?: PositioningBoundary;\n /** Called when the tooltip open state changes (fires immediately, before animations). */\n onOpenChange?: (open: boolean, details: TooltipChangeDetails) => void;\n /** Called after open/close animations complete. */\n onOpenChangeComplete?: (open: boolean) => void;\n children?: ReactNode;\n}\n\nexport function TooltipRoot({\n open: controlledOpen,\n defaultOpen = TooltipCore.defaultProps.defaultOpen,\n onOpenChange: onOpenChangeProp,\n onOpenChangeComplete: onOpenChangeCompleteProp,\n delay = TooltipCore.defaultProps.delay,\n closeDelay = TooltipCore.defaultProps.closeDelay,\n disableHoverablePopup = TooltipCore.defaultProps.disableHoverablePopup,\n disabled = TooltipCore.defaultProps.disabled,\n boundary = 'container',\n children,\n ...coreProps\n}: TooltipRootProps): ReactNode {\n const container = useOptionalContainer();\n const controls = useOptionalControlsContext();\n const [core] = useState(() => new TooltipCore(coreProps));\n core.setProps(coreProps);\n\n const isControlled = !isUndefined(controlledOpen);\n\n const groupFromContext = useTooltipGroup();\n\n // Keep refs that always point to the latest values so the\n // createTooltip closure never reads stale props.\n const onOpenChangeRef = useLatestRef(onOpenChangeProp);\n const onOpenChangeCompleteRef = useLatestRef(onOpenChangeCompleteProp);\n const delayRef = useLatestRef(delay);\n const closeDelayRef = useLatestRef(closeDelay);\n const disableHoverablePopupRef = useLatestRef(disableHoverablePopup);\n const disabledRef = useLatestRef(disabled);\n const groupRef = useLatestRef(groupFromContext);\n\n const [tooltip] = useState(() => {\n const instance = createTooltip({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: TooltipChangeDetails) => {\n onOpenChangeRef.current?.(nextOpen, details);\n },\n onOpenChangeComplete: (nextOpen: boolean) => {\n onOpenChangeCompleteRef.current?.(nextOpen);\n },\n delay: () => delayRef.current,\n closeDelay: () => closeDelayRef.current,\n disableHoverablePopup: () => disableHoverablePopupRef.current,\n disabled: () => disabledRef.current,\n group: () => groupRef.current,\n });\n\n // Apply defaultOpen on creation (uncontrolled only)\n if (!isControlled && defaultOpen) {\n instance.open();\n }\n\n return instance;\n });\n\n const [content, setContent] = useState<string | undefined>();\n\n const anchorName = useSafeId();\n const popupId = useSafeId('tooltip');\n\n // Sync controlled open prop -> internal input state.\n useEffect(() => {\n if (isUndefined(controlledOpen)) return;\n\n const { active: inputOpen } = tooltip.input.current;\n if (controlledOpen === inputOpen) return;\n\n if (controlledOpen) {\n tooltip.open();\n } else {\n tooltip.close();\n }\n }, [controlledOpen, tooltip]);\n\n useEffect(() => {\n if (isUndefined(controls?.state.visible)) return;\n if (controls.state.visible) return;\n\n tooltip.close('imperative-action');\n }, [controls?.state.visible, tooltip]);\n\n useDestroy(tooltip);\n\n const input = useSnapshot(tooltip.input);\n core.setInput(input);\n const state = core.getState();\n\n return (\n <TooltipContextProvider\n value={{\n core,\n tooltip,\n state,\n stateAttrMap: TooltipDataAttrs,\n anchorName,\n popupId,\n content,\n setContent,\n boundary,\n container,\n }}\n >\n {children}\n </TooltipContextProvider>\n );\n}\n\nexport namespace TooltipRoot {\n export type Props = TooltipRootProps;\n}\n"],"mappings":";;;;;;;;;;;;;;;AA+BA,SAAgB,YAAY,EAC1B,MAAM,gBACN,cAAc,YAAY,aAAa,aACvC,cAAc,kBACd,sBAAsB,0BACtB,QAAQ,YAAY,aAAa,OACjC,aAAa,YAAY,aAAa,YACtC,wBAAwB,YAAY,aAAa,uBACjD,WAAW,YAAY,aAAa,UACpC,WAAW,aACX,UACA,GAAG,aAC2B;CAC9B,MAAM,YAAY,sBAAsB;CACxC,MAAM,WAAW,4BAA4B;CAC7C,MAAM,CAAC,QAAQ,eAAe,IAAI,YAAY,UAAU,CAAC;AACzD,MAAK,SAAS,UAAU;CAExB,MAAM,eAAe,CAAC,YAAY,eAAe;CAEjD,MAAM,mBAAmB,iBAAiB;CAI1C,MAAM,kBAAkB,aAAa,iBAAiB;CACtD,MAAM,0BAA0B,aAAa,yBAAyB;CACtE,MAAM,WAAW,aAAa,MAAM;CACpC,MAAM,gBAAgB,aAAa,WAAW;CAC9C,MAAM,2BAA2B,aAAa,sBAAsB;CACpE,MAAM,cAAc,aAAa,SAAS;CAC1C,MAAM,WAAW,aAAa,iBAAiB;CAE/C,MAAM,CAAC,WAAW,eAAe;EAC/B,MAAM,WAAW,cAAc;GAC7B,YAAY,kBAAkB;GAC9B,eAAe,UAAmB,YAAkC;AAClE,oBAAgB,UAAU,UAAU,QAAQ;;GAE9C,uBAAuB,aAAsB;AAC3C,4BAAwB,UAAU,SAAS;;GAE7C,aAAa,SAAS;GACtB,kBAAkB,cAAc;GAChC,6BAA6B,yBAAyB;GACtD,gBAAgB,YAAY;GAC5B,aAAa,SAAS;GACvB,CAAC;AAGF,MAAI,CAAC,gBAAgB,YACnB,UAAS,MAAM;AAGjB,SAAO;GACP;CAEF,MAAM,CAAC,SAAS,cAAc,UAA8B;CAE5D,MAAM,aAAa,WAAW;CAC9B,MAAM,UAAU,UAAU,UAAU;AAGpC,iBAAgB;AACd,MAAI,YAAY,eAAe,CAAE;EAEjC,MAAM,EAAE,QAAQ,cAAc,QAAQ,MAAM;AAC5C,MAAI,mBAAmB,UAAW;AAElC,MAAI,eACF,SAAQ,MAAM;MAEd,SAAQ,OAAO;IAEhB,CAAC,gBAAgB,QAAQ,CAAC;AAE7B,iBAAgB;AACd,MAAI,YAAY,UAAU,MAAM,QAAQ,CAAE;AAC1C,MAAI,SAAS,MAAM,QAAS;AAE5B,UAAQ,MAAM,oBAAoB;IACjC,CAAC,UAAU,MAAM,SAAS,QAAQ,CAAC;AAEtC,YAAW,QAAQ;CAEnB,MAAM,QAAQ,YAAY,QAAQ,MAAM;AACxC,MAAK,SAAS,MAAM;AAGpB,QACE,oBAAC,wBAAD;EACE,OAAO;GACL;GACA;GACA,OAPQ,KAAK,UAAU;GAQvB,cAAc;GACd;GACA;GACA;GACA;GACA;GACA;GACD;EAEA;EACsB,CAAA"}
1
+ {"version":3,"file":"tooltip-root.js","names":[],"sources":["../../../../src/ui/tooltip/tooltip-root.tsx"],"sourcesContent":["'use client';\n\nimport { type TooltipProps as CoreTooltipProps, TooltipCore, TooltipDataAttrs } from '@videojs/core';\nimport {\n createTooltip,\n createTransition,\n type PositioningBoundary,\n type TooltipChangeDetails,\n} from '@videojs/core/dom';\nimport { useSnapshot } from '@videojs/store/react';\nimport { isUndefined } from '@videojs/utils/predicate';\nimport type { ReactNode } from 'react';\nimport { useEffect, useState } from 'react';\nimport { useOptionalContainer } from '../../player/context';\nimport { useDestroy } from '../../utils/use-destroy';\nimport { useLatestRef } from '../../utils/use-latest-ref';\nimport { useSafeId } from '../../utils/use-safe-id';\nimport { useOptionalControlsContext } from '../controls/context';\nimport { type TooltipContent, TooltipContextProvider } from './context';\nimport { useTooltipGroup } from './group-context';\n\nexport interface TooltipRootProps extends CoreTooltipProps {\n /** Boundary used to constrain the popup size. */\n boundary?: PositioningBoundary;\n /** Called when the tooltip open state changes (fires immediately, before animations). */\n onOpenChange?: (open: boolean, details: TooltipChangeDetails) => void;\n /** Called after open/close animations complete. */\n onOpenChangeComplete?: (open: boolean) => void;\n children?: ReactNode;\n}\n\nexport function TooltipRoot({\n open: controlledOpen,\n defaultOpen = TooltipCore.defaultProps.defaultOpen,\n onOpenChange: onOpenChangeProp,\n onOpenChangeComplete: onOpenChangeCompleteProp,\n delay = TooltipCore.defaultProps.delay,\n closeDelay = TooltipCore.defaultProps.closeDelay,\n disableHoverablePopup = TooltipCore.defaultProps.disableHoverablePopup,\n disabled = TooltipCore.defaultProps.disabled,\n boundary = 'container',\n children,\n ...coreProps\n}: TooltipRootProps): ReactNode {\n const container = useOptionalContainer();\n const controls = useOptionalControlsContext();\n const [core] = useState(() => new TooltipCore(coreProps));\n core.setProps(coreProps);\n\n const isControlled = !isUndefined(controlledOpen);\n\n const groupFromContext = useTooltipGroup();\n\n // Keep refs that always point to the latest values so the\n // createTooltip closure never reads stale props.\n const onOpenChangeRef = useLatestRef(onOpenChangeProp);\n const onOpenChangeCompleteRef = useLatestRef(onOpenChangeCompleteProp);\n const delayRef = useLatestRef(delay);\n const closeDelayRef = useLatestRef(closeDelay);\n const disableHoverablePopupRef = useLatestRef(disableHoverablePopup);\n const disabledRef = useLatestRef(disabled);\n const groupRef = useLatestRef(groupFromContext);\n\n const [tooltip] = useState(() => {\n const instance = createTooltip({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: TooltipChangeDetails) => {\n onOpenChangeRef.current?.(nextOpen, details);\n },\n onOpenChangeComplete: (nextOpen: boolean) => {\n onOpenChangeCompleteRef.current?.(nextOpen);\n },\n delay: () => delayRef.current,\n closeDelay: () => closeDelayRef.current,\n disableHoverablePopup: () => disableHoverablePopupRef.current,\n disabled: () => disabledRef.current,\n group: () => groupRef.current,\n });\n\n // Apply defaultOpen on creation (uncontrolled only)\n if (!isControlled && defaultOpen) {\n instance.open();\n }\n\n return instance;\n });\n\n const [content, setContent] = useState<TooltipContent | undefined>();\n\n const anchorName = useSafeId();\n const popupId = useSafeId('tooltip');\n\n // Sync controlled open prop -> internal input state.\n useEffect(() => {\n if (isUndefined(controlledOpen)) return;\n\n const { active: inputOpen } = tooltip.input.current;\n if (controlledOpen === inputOpen) return;\n\n if (controlledOpen) {\n tooltip.open();\n } else {\n tooltip.close();\n }\n }, [controlledOpen, tooltip]);\n\n useEffect(() => {\n if (isUndefined(controls?.state.visible)) return;\n if (controls.state.visible) return;\n\n tooltip.close('imperative-action');\n }, [controls?.state.visible, tooltip]);\n\n useDestroy(tooltip);\n\n const input = useSnapshot(tooltip.input);\n core.setInput(input);\n const state = core.getState();\n\n return (\n <TooltipContextProvider\n value={{\n core,\n tooltip,\n state,\n stateAttrMap: TooltipDataAttrs,\n anchorName,\n popupId,\n content,\n setContent,\n boundary,\n container,\n }}\n >\n {children}\n </TooltipContextProvider>\n );\n}\n\nexport namespace TooltipRoot {\n export type Props = TooltipRootProps;\n}\n"],"mappings":";;;;;;;;;;;;;;;AA+BA,SAAgB,YAAY,EAC1B,MAAM,gBACN,cAAc,YAAY,aAAa,aACvC,cAAc,kBACd,sBAAsB,0BACtB,QAAQ,YAAY,aAAa,OACjC,aAAa,YAAY,aAAa,YACtC,wBAAwB,YAAY,aAAa,uBACjD,WAAW,YAAY,aAAa,UACpC,WAAW,aACX,UACA,GAAG,aAC2B;CAC9B,MAAM,YAAY,sBAAsB;CACxC,MAAM,WAAW,4BAA4B;CAC7C,MAAM,CAAC,QAAQ,eAAe,IAAI,YAAY,UAAU,CAAC;AACzD,MAAK,SAAS,UAAU;CAExB,MAAM,eAAe,CAAC,YAAY,eAAe;CAEjD,MAAM,mBAAmB,iBAAiB;CAI1C,MAAM,kBAAkB,aAAa,iBAAiB;CACtD,MAAM,0BAA0B,aAAa,yBAAyB;CACtE,MAAM,WAAW,aAAa,MAAM;CACpC,MAAM,gBAAgB,aAAa,WAAW;CAC9C,MAAM,2BAA2B,aAAa,sBAAsB;CACpE,MAAM,cAAc,aAAa,SAAS;CAC1C,MAAM,WAAW,aAAa,iBAAiB;CAE/C,MAAM,CAAC,WAAW,eAAe;EAC/B,MAAM,WAAW,cAAc;GAC7B,YAAY,kBAAkB;GAC9B,eAAe,UAAmB,YAAkC;AAClE,oBAAgB,UAAU,UAAU,QAAQ;;GAE9C,uBAAuB,aAAsB;AAC3C,4BAAwB,UAAU,SAAS;;GAE7C,aAAa,SAAS;GACtB,kBAAkB,cAAc;GAChC,6BAA6B,yBAAyB;GACtD,gBAAgB,YAAY;GAC5B,aAAa,SAAS;GACvB,CAAC;AAGF,MAAI,CAAC,gBAAgB,YACnB,UAAS,MAAM;AAGjB,SAAO;GACP;CAEF,MAAM,CAAC,SAAS,cAAc,UAAsC;CAEpE,MAAM,aAAa,WAAW;CAC9B,MAAM,UAAU,UAAU,UAAU;AAGpC,iBAAgB;AACd,MAAI,YAAY,eAAe,CAAE;EAEjC,MAAM,EAAE,QAAQ,cAAc,QAAQ,MAAM;AAC5C,MAAI,mBAAmB,UAAW;AAElC,MAAI,eACF,SAAQ,MAAM;MAEd,SAAQ,OAAO;IAEhB,CAAC,gBAAgB,QAAQ,CAAC;AAE7B,iBAAgB;AACd,MAAI,YAAY,UAAU,MAAM,QAAQ,CAAE;AAC1C,MAAI,SAAS,MAAM,QAAS;AAE5B,UAAQ,MAAM,oBAAoB;IACjC,CAAC,UAAU,MAAM,SAAS,QAAQ,CAAC;AAEtC,YAAW,QAAQ;CAEnB,MAAM,QAAQ,YAAY,QAAQ,MAAM;AACxC,MAAK,SAAS,MAAM;AAGpB,QACE,oBAAC,wBAAD;EACE,OAAO;GACL;GACA;GACA,OAPQ,KAAK,UAAU;GAQvB,cAAc;GACd;GACA;GACA;GACA;GACA;GACA;GACD;EAEA;EACsB,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { UIComponentProps } from "../../utils/types.js";
2
+ import * as _$react from "react";
3
+ import { TooltipState } from "@videojs/core";
4
+
5
+ //#region src/ui/tooltip/tooltip-shortcut.d.ts
6
+ interface TooltipShortcutProps extends UIComponentProps<'kbd', TooltipState> {}
7
+ /** Keyboard shortcut hint; apply skin `className` (CSS: `media-tooltip__kbd`; Tailwind: `popup.tooltipShortcut`). */
8
+ declare const TooltipShortcut: _$react.ForwardRefExoticComponent<Omit<TooltipShortcutProps, "ref"> & _$react.RefAttributes<HTMLElement>>;
9
+ declare namespace TooltipShortcut {
10
+ type Props = TooltipShortcutProps;
11
+ type State = TooltipState;
12
+ }
13
+ //#endregion
14
+ export { TooltipShortcut, TooltipShortcutProps };
15
+ //# sourceMappingURL=tooltip-shortcut.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip-shortcut.d.ts","names":[],"sources":["../../../../src/ui/tooltip/tooltip-shortcut.tsx"],"mappings":";;;;;UASiB,oBAAA,SAA6B,gBAAA,QAAwB,YAAA;;cAGzD,eAAA,EAAe,OAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,oBAAA,WAAA,OAAA,CAAA,aAAA,CAAA,WAAA;AAAA,kBAuBX,eAAA;EAAA,KACH,KAAA,GAAQ,oBAAA;EAAA,KACR,KAAA,GAAQ,YAAA;AAAA"}
@@ -0,0 +1,25 @@
1
+ "use client";
2
+ import { renderElement } from "../../utils/use-render.js";
3
+ import { useTooltipContext } from "./context.js";
4
+ import { forwardRef } from "react";
5
+ //#region src/ui/tooltip/tooltip-shortcut.tsx
6
+ /** Keyboard shortcut hint; apply skin `className` (CSS: `media-tooltip__kbd`; Tailwind: `popup.tooltipShortcut`). */
7
+ const TooltipShortcut = forwardRef(function TooltipShortcut({ render, className, style, children, ...elementProps }, forwardedRef) {
8
+ const { state, stateAttrMap, content } = useTooltipContext();
9
+ const shortcut = children !== void 0 && children !== null ? children : content?.shortcut ?? null;
10
+ if (!shortcut) return null;
11
+ return renderElement("kbd", {
12
+ render,
13
+ className,
14
+ style
15
+ }, {
16
+ state,
17
+ stateAttrMap,
18
+ ref: forwardedRef,
19
+ props: [elementProps, { children: shortcut }]
20
+ });
21
+ });
22
+ //#endregion
23
+ export { TooltipShortcut };
24
+
25
+ //# sourceMappingURL=tooltip-shortcut.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip-shortcut.js","names":[],"sources":["../../../../src/ui/tooltip/tooltip-shortcut.tsx"],"sourcesContent":["'use client';\n\nimport type { TooltipState } from '@videojs/core';\nimport { forwardRef } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\nimport { useTooltipContext } from './context';\n\nexport interface TooltipShortcutProps extends UIComponentProps<'kbd', TooltipState> {}\n\n/** Keyboard shortcut hint; apply skin `className` (CSS: `media-tooltip__kbd`; Tailwind: `popup.tooltipShortcut`). */\nexport const TooltipShortcut = forwardRef<HTMLElement, TooltipShortcutProps>(function TooltipShortcut(\n { render, className, style, children, ...elementProps },\n forwardedRef\n) {\n const { state, stateAttrMap, content } = useTooltipContext();\n const shortcut = children !== undefined && children !== null ? children : (content?.shortcut ?? null);\n\n if (!shortcut) {\n return null;\n }\n\n return renderElement(\n 'kbd',\n { render, className, style },\n {\n state,\n stateAttrMap,\n ref: forwardedRef,\n props: [elementProps, { children: shortcut }],\n }\n );\n});\n\nexport namespace TooltipShortcut {\n export type Props = TooltipShortcutProps;\n export type State = TooltipState;\n}\n"],"mappings":";;;;;;AAYA,MAAa,kBAAkB,WAA8C,SAAS,gBACpF,EAAE,QAAQ,WAAW,OAAO,UAAU,GAAG,gBACzC,cACA;CACA,MAAM,EAAE,OAAO,cAAc,YAAY,mBAAmB;CAC5D,MAAM,WAAW,aAAa,KAAA,KAAa,aAAa,OAAO,WAAY,SAAS,YAAY;AAEhG,KAAI,CAAC,SACH,QAAO;AAGT,QAAO,cACL,OACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE;EACA;EACA,KAAK;EACL,OAAO,CAAC,cAAc,EAAE,UAAU,UAAU,CAAC;EAC9C,CACF;EACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"volume-indicator-root.d.ts","names":[],"sources":["../../../../src/ui/volume-indicator/volume-indicator-root.tsx"],"mappings":";;;;;UAWiB,wBAAA,SACP,gBAAA,QAAwB,mBAAA,CAAoB,KAAA,GAClD,mBAAA,CAAoB,KAAA;AAAA,cAEX,mBAAA,EAAmB,OAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,wBAAA,WAAA,OAAA,CAAA,aAAA,CAAA,cAAA;AAAA,kBAyBf,mBAAA;EAAA,KACH,KAAA,GAAQ,wBAAA;EAAA,KACR,KAAA,GAAQ,mBAAA,CAAoB,KAAA;AAAA"}
1
+ {"version":3,"file":"volume-indicator-root.d.ts","names":[],"sources":["../../../../src/ui/volume-indicator/volume-indicator-root.tsx"],"mappings":";;;;;UAWiB,wBAAA,SACP,gBAAA,QAAwB,mBAAA,CAAoB,KAAA,GAClD,mBAAA,CAAoB,KAAA;AAAA,cAEX,mBAAA,EAAmB,OAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,wBAAA,WAAA,OAAA,CAAA,aAAA,CAAA,cAAA;AAAA,kBA6Bf,mBAAA;EAAA,KACH,KAAA,GAAQ,wBAAA;EAAA,KACR,KAAA,GAAQ,mBAAA,CAAoB,KAAA;AAAA"}
@@ -8,7 +8,7 @@ import { VolumeIndicatorCore, VolumeIndicatorDataAttrs } from "@videojs/core";
8
8
  //#region src/ui/volume-indicator/volume-indicator-root.tsx
9
9
  const VolumeIndicatorRoot = forwardRef(function VolumeIndicatorRoot(componentProps, forwardedRef) {
10
10
  const { render, className, style, closeDelay, ...elementProps } = componentProps;
11
- const { elementRef, present, state } = useInputIndicatorRoot(() => new VolumeIndicatorCore(), { closeDelay });
11
+ const { elementRef, present, state } = useInputIndicatorRoot(() => new VolumeIndicatorCore(), { closeDelay }, { replayOnUpdate: false });
12
12
  if (!present) return null;
13
13
  return /* @__PURE__ */ jsx(VolumeIndicatorProvider, {
14
14
  value: { state },
@@ -1 +1 @@
1
- {"version":3,"file":"volume-indicator-root.js","names":[],"sources":["../../../../src/ui/volume-indicator/volume-indicator-root.tsx"],"sourcesContent":["'use client';\n\nimport { VolumeIndicatorCore, VolumeIndicatorDataAttrs } from '@videojs/core';\nimport type { ForwardedRef } from 'react';\nimport { forwardRef } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\nimport { useInputIndicatorRoot } from '../input-indicators/use-input-indicator-root';\nimport { VolumeIndicatorProvider } from './context';\n\nexport interface VolumeIndicatorRootProps\n extends UIComponentProps<'div', VolumeIndicatorCore.State>,\n VolumeIndicatorCore.Props {}\n\nexport const VolumeIndicatorRoot = forwardRef(function VolumeIndicatorRoot(\n componentProps: VolumeIndicatorRootProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const { render, className, style, closeDelay, ...elementProps } = componentProps;\n const { elementRef, present, state } = useInputIndicatorRoot(() => new VolumeIndicatorCore(), { closeDelay });\n\n if (!present) return null;\n\n return (\n <VolumeIndicatorProvider value={{ state }}>\n {renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap: VolumeIndicatorDataAttrs,\n ref: [forwardedRef, elementRef],\n props: [elementProps],\n }\n )}\n </VolumeIndicatorProvider>\n );\n});\n\nexport namespace VolumeIndicatorRoot {\n export type Props = VolumeIndicatorRootProps;\n export type State = VolumeIndicatorCore.State;\n}\n"],"mappings":";;;;;;;;AAeA,MAAa,sBAAsB,WAAW,SAAS,oBACrD,gBACA,cACA;CACA,MAAM,EAAE,QAAQ,WAAW,OAAO,YAAY,GAAG,iBAAiB;CAClE,MAAM,EAAE,YAAY,SAAS,UAAU,4BAA4B,IAAI,qBAAqB,EAAE,EAAE,YAAY,CAAC;AAE7G,KAAI,CAAC,QAAS,QAAO;AAErB,QACE,oBAAC,yBAAD;EAAyB,OAAO,EAAE,OAAO;YACtC,cACC,OACA;GAAE;GAAQ;GAAW;GAAO,EAC5B;GACE;GACA,cAAc;GACd,KAAK,CAAC,cAAc,WAAW;GAC/B,OAAO,CAAC,aAAa;GACtB,CACF;EACuB,CAAA;EAE5B"}
1
+ {"version":3,"file":"volume-indicator-root.js","names":[],"sources":["../../../../src/ui/volume-indicator/volume-indicator-root.tsx"],"sourcesContent":["'use client';\n\nimport { VolumeIndicatorCore, VolumeIndicatorDataAttrs } from '@videojs/core';\nimport type { ForwardedRef } from 'react';\nimport { forwardRef } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\nimport { useInputIndicatorRoot } from '../input-indicators/use-input-indicator-root';\nimport { VolumeIndicatorProvider } from './context';\n\nexport interface VolumeIndicatorRootProps\n extends UIComponentProps<'div', VolumeIndicatorCore.State>,\n VolumeIndicatorCore.Props {}\n\nexport const VolumeIndicatorRoot = forwardRef(function VolumeIndicatorRoot(\n componentProps: VolumeIndicatorRootProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const { render, className, style, closeDelay, ...elementProps } = componentProps;\n const { elementRef, present, state } = useInputIndicatorRoot(\n () => new VolumeIndicatorCore(),\n { closeDelay },\n { replayOnUpdate: false }\n );\n\n if (!present) return null;\n\n return (\n <VolumeIndicatorProvider value={{ state }}>\n {renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap: VolumeIndicatorDataAttrs,\n ref: [forwardedRef, elementRef],\n props: [elementProps],\n }\n )}\n </VolumeIndicatorProvider>\n );\n});\n\nexport namespace VolumeIndicatorRoot {\n export type Props = VolumeIndicatorRootProps;\n export type State = VolumeIndicatorCore.State;\n}\n"],"mappings":";;;;;;;;AAeA,MAAa,sBAAsB,WAAW,SAAS,oBACrD,gBACA,cACA;CACA,MAAM,EAAE,QAAQ,WAAW,OAAO,YAAY,GAAG,iBAAiB;CAClE,MAAM,EAAE,YAAY,SAAS,UAAU,4BAC/B,IAAI,qBAAqB,EAC/B,EAAE,YAAY,EACd,EAAE,gBAAgB,OAAO,CAC1B;AAED,KAAI,CAAC,QAAS,QAAO;AAErB,QACE,oBAAC,yBAAD;EAAyB,OAAO,EAAE,OAAO;YACtC,cACC,OACA;GAAE;GAAQ;GAAW;GAAO,EAC5B;GACE;GACA,cAAc;GACd,KAAK,CAAC,cAAc,WAAW;GAC/B,OAAO,CAAC,aAAa;GACtB,CACF;EACuB,CAAA;EAE5B"}
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import { useCallback } from "react";
3
+ //#region src/utils/use-attach-iframe.ts
4
+ function useAttachIframe(media) {
5
+ return useCallback((element) => {
6
+ if (element) media.attach?.(element);
7
+ else media.detach?.();
8
+ return () => media.detach?.();
9
+ }, [media]);
10
+ }
11
+ //#endregion
12
+ export { useAttachIframe };
13
+
14
+ //# sourceMappingURL=use-attach-iframe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-attach-iframe.js","names":[],"sources":["../../../src/utils/use-attach-iframe.ts"],"sourcesContent":["'use client';\n\nimport type { MediaEngineHost } from '@videojs/core';\nimport type { RefCallback } from 'react';\nimport { useCallback } from 'react';\n\nexport function useAttachIframe<T extends HTMLIFrameElement>(media: MediaEngineHost): RefCallback<T> {\n return useCallback(\n (element: T | null) => {\n if (element) media.attach?.(element);\n else media.detach?.();\n return () => media.detach?.();\n },\n [media]\n );\n}\n"],"mappings":";;;AAMA,SAAgB,gBAA6C,OAAwC;AACnG,QAAO,aACJ,YAAsB;AACrB,MAAI,QAAS,OAAM,SAAS,QAAQ;MAC/B,OAAM,UAAU;AACrB,eAAa,MAAM,UAAU;IAE/B,CAAC,MAAM,CACR"}
@@ -6,11 +6,16 @@ import { Media } from "@videojs/core";
6
6
  *
7
7
  * Instantiates the media class once, attaches it to the player on mount,
8
8
  * and safely detaches on unmount using a functional updater to avoid race
9
- * conditions when swapping media components (e.g. DashVideo → HlsVideo).
9
+ * conditions when swapping media components (e.g. DashVideo → HlsJsVideo).
10
+ *
11
+ * An optional `setup` callback runs once on mount — e.g. to add media
12
+ * components via `addComponent`. Components registered there are destroyed
13
+ * together with the media instance on unmount (`media.destroy()` destroys
14
+ * all of its registered components).
10
15
  */
11
16
  declare function useMediaInstance<Instance extends Media & {
12
17
  destroy(): void;
13
- }>(MediaClass: new () => Instance): Instance;
18
+ }>(MediaClass: new () => Instance, setup?: (media: Instance) => void): Instance;
14
19
  //#endregion
15
20
  export { useMediaInstance };
16
21
  //# sourceMappingURL=use-media-instance.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-media-instance.d.ts","names":[],"sources":["../../../src/utils/use-media-instance.ts"],"mappings":";;;;;AAeA;;;;;iBAAgB,gBAAA,kBAAkC,KAAA;EAAU,OAAA;AAAA,EAAA,CAC1D,UAAA,YAAsB,QAAA,GACrB,QAAA"}
1
+ {"version":3,"file":"use-media-instance.d.ts","names":[],"sources":["../../../src/utils/use-media-instance.ts"],"mappings":";;;;;AAoBA;;;;;;;;;;iBAAgB,gBAAA,kBAAkC,KAAA;EAAU,OAAA;AAAA,EAAA,CAC1D,UAAA,YAAsB,QAAA,EACtB,KAAA,IAAS,KAAA,EAAO,QAAA,YACf,QAAA"}
@@ -8,12 +8,20 @@ import { useState } from "react";
8
8
  *
9
9
  * Instantiates the media class once, attaches it to the player on mount,
10
10
  * and safely detaches on unmount using a functional updater to avoid race
11
- * conditions when swapping media components (e.g. DashVideo → HlsVideo).
11
+ * conditions when swapping media components (e.g. DashVideo → HlsJsVideo).
12
+ *
13
+ * An optional `setup` callback runs once on mount — e.g. to add media
14
+ * components via `addComponent`. Components registered there are destroyed
15
+ * together with the media instance on unmount (`media.destroy()` destroys
16
+ * all of its registered components).
12
17
  */
13
- function useMediaInstance(MediaClass) {
18
+ function useMediaInstance(MediaClass, setup) {
14
19
  const [instance] = useState(() => new MediaClass());
15
20
  const setMedia = useMediaAttach();
16
- useDestroy(instance, () => setMedia?.(instance), () => setMedia?.((prev) => prev === instance ? null : prev));
21
+ useDestroy(instance, () => {
22
+ setup?.(instance);
23
+ setMedia?.(instance);
24
+ }, () => setMedia?.((prev) => prev === instance ? null : prev));
17
25
  return instance;
18
26
  }
19
27
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"use-media-instance.js","names":[],"sources":["../../../src/utils/use-media-instance.ts"],"sourcesContent":["'use client';\n\nimport type { Media } from '@videojs/core';\nimport { useState } from 'react';\n\nimport { useMediaAttach } from '../player/context';\nimport { useDestroy } from './use-destroy';\n\n/**\n * Create and manage a media instance lifecycle within a player context.\n *\n * Instantiates the media class once, attaches it to the player on mount,\n * and safely detaches on unmount using a functional updater to avoid race\n * conditions when swapping media components (e.g. DashVideo → HlsVideo).\n */\nexport function useMediaInstance<Instance extends Media & { destroy(): void }>(\n MediaClass: new () => Instance\n): Instance {\n const [instance] = useState(() => new MediaClass());\n const setMedia = useMediaAttach();\n\n useDestroy(\n instance,\n () => setMedia?.(instance),\n () => setMedia?.((prev) => (prev === instance ? null : prev))\n );\n\n return instance;\n}\n"],"mappings":";;;;;;;;;;;;AAeA,SAAgB,iBACd,YACU;CACV,MAAM,CAAC,YAAY,eAAe,IAAI,YAAY,CAAC;CACnD,MAAM,WAAW,gBAAgB;AAEjC,YACE,gBACM,WAAW,SAAS,QACpB,YAAY,SAAU,SAAS,WAAW,OAAO,KAAM,CAC9D;AAED,QAAO"}
1
+ {"version":3,"file":"use-media-instance.js","names":[],"sources":["../../../src/utils/use-media-instance.ts"],"sourcesContent":["'use client';\n\nimport type { Media } from '@videojs/core';\nimport { useState } from 'react';\n\nimport { useMediaAttach } from '../player/context';\nimport { useDestroy } from './use-destroy';\n\n/**\n * Create and manage a media instance lifecycle within a player context.\n *\n * Instantiates the media class once, attaches it to the player on mount,\n * and safely detaches on unmount using a functional updater to avoid race\n * conditions when swapping media components (e.g. DashVideo → HlsJsVideo).\n *\n * An optional `setup` callback runs once on mount — e.g. to add media\n * components via `addComponent`. Components registered there are destroyed\n * together with the media instance on unmount (`media.destroy()` destroys\n * all of its registered components).\n */\nexport function useMediaInstance<Instance extends Media & { destroy(): void }>(\n MediaClass: new () => Instance,\n setup?: (media: Instance) => void\n): Instance {\n const [instance] = useState(() => new MediaClass());\n const setMedia = useMediaAttach();\n\n useDestroy(\n instance,\n () => {\n setup?.(instance);\n setMedia?.(instance);\n },\n () => setMedia?.((prev) => (prev === instance ? null : prev))\n );\n\n return instance;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAoBA,SAAgB,iBACd,YACA,OACU;CACV,MAAM,CAAC,YAAY,eAAe,IAAI,YAAY,CAAC;CACnD,MAAM,WAAW,gBAAgB;AAEjC,YACE,gBACM;AACJ,UAAQ,SAAS;AACjB,aAAW,SAAS;UAEhB,YAAY,SAAU,SAAS,WAAW,OAAO,KAAM,CAC9D;AAED,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-render.d.ts","names":[],"sources":["../../../src/utils/use-render.tsx"],"mappings":";;;;;KAeK,gBAAA,SAAyB,KAAA,CAAM,GAAA,CAAI,iBAAA;AAAA,UAEvB,uBAAA;EACf,SAAA,cAAuB,KAAA,EAAO,KAAA;EAC9B,KAAA,GAAQ,aAAA,KAAkB,KAAA,EAAO,KAAA,KAAU,aAAA;EAC3C,MAAA,GAAS,UAAA,CAAW,KAAA;AAAA;AAAA,UAGL,mBAAA,oCAAuD,OAAA;EACtE,KAAA,EAAO,KAAA;EACP,GAAA,GAAM,GAAA,CAAI,mBAAA,IAAuB,GAAA,CAAI,mBAAA;EACrC,KAAA;EACA,YAAA,GAAe,YAAA,CAAa,KAAA;AAAA;;;;;;;;;;;;;;;;;;;;;iBA4Cd,aAAA,mDAEc,OAAA,kBACZ,gBAAA,CAAA,CAEhB,OAAA,EAAS,OAAA,EACT,cAAA,EAAgB,uBAAA,CAAwB,KAAA,GACxC,MAAA,EAAQ,mBAAA,CAAoB,KAAA,EAAO,mBAAA,IAClC,YAAA;AAAA,kBAgDc,aAAA;EAAA,KACH,cAAA,UAAwB,uBAAA,CAAwB,KAAA;EAAA,KAChD,UAAA,oCAA8C,OAAA,IAAW,mBAAA,CAAoB,KAAA,EAAO,mBAAA;AAAA"}
1
+ {"version":3,"file":"use-render.d.ts","names":[],"sources":["../../../src/utils/use-render.tsx"],"mappings":";;;;;KAeK,gBAAA,SAAyB,KAAA,CAAM,GAAA,CAAI,iBAAA;AAAA,UAEvB,uBAAA;EACf,SAAA,cAAuB,KAAA,EAAO,KAAA;EAC9B,KAAA,GAAQ,aAAA,KAAkB,KAAA,EAAO,KAAA,KAAU,aAAA;EAC3C,MAAA,GAAS,UAAA,CAAW,KAAA;AAAA;AAAA,UAGL,mBAAA,oCAAuD,OAAA;EACtE,KAAA,EAAO,KAAA;EACP,GAAA,GAAM,GAAA,CAAI,mBAAA,IAAuB,GAAA,CAAI,mBAAA;EACrC,KAAA;EACA,YAAA,GAAe,YAAA,CAAa,KAAA;AAAA;;;;;;;;;;;;;;;;;;;;;iBA4Cd,aAAA,mDAEc,OAAA,kBACZ,gBAAA,CAAA,CAEhB,OAAA,EAAS,OAAA,EACT,cAAA,EAAgB,uBAAA,CAAwB,KAAA,GACxC,MAAA,EAAQ,mBAAA,CAAoB,KAAA,EAAO,mBAAA,IAClC,YAAA;AAAA,kBAiDc,aAAA;EAAA,KACH,cAAA,UAAwB,uBAAA,CAAwB,KAAA;EAAA,KAChD,UAAA,oCAA8C,OAAA,IAAW,mBAAA,CAAoB,KAAA,EAAO,mBAAA;AAAA"}
@@ -44,7 +44,7 @@ function renderElement(element, componentProps, params) {
44
44
  const { state, ref, props, stateAttrMap } = params;
45
45
  const className = resolveClassName(classNameProp, state);
46
46
  const style = resolveStyle(styleProp, state);
47
- const mergedProps = mergeProps(getStateDataAttrs(state, stateAttrMap), ...Array.isArray(props) ? props : props ? [props] : []);
47
+ const mergedProps = mergeProps(stateAttrMap ? getStateDataAttrs(state, stateAttrMap) : {}, ...Array.isArray(props) ? props : props ? [props] : []);
48
48
  if (className !== void 0) mergedProps.className = mergedProps.className ? `${mergedProps.className} ${className}` : className;
49
49
  if (style !== void 0) mergedProps.style = mergedProps.style ? {
50
50
  ...mergedProps.style,
@@ -1 +1 @@
1
- {"version":3,"file":"use-render.js","names":[],"sources":["../../../src/utils/use-render.tsx"],"sourcesContent":["'use client';\n\nimport { getStateDataAttrs, type StateAttrMap } from '@videojs/core/dom';\nimport { isFunction } from '@videojs/utils/predicate';\nimport type { CSSProperties, ReactElement, Ref } from 'react';\nimport { cloneElement, createElement, isValidElement } from 'react';\nimport { mergeProps } from './merge-props';\nimport type { HTMLProps, RenderProp } from './types';\nimport { composeRefs } from './use-composed-refs';\n\n/** Check if a value is a render prop (function or React element). */\nexport function isRenderProp(value: unknown): value is RenderProp<unknown> {\n return isFunction(value) || isValidElement(value);\n}\n\ntype IntrinsicTagName = keyof React.JSX.IntrinsicElements;\n\nexport interface UseRenderComponentProps<State> {\n className?: string | ((state: State) => string | undefined) | undefined;\n style?: CSSProperties | ((state: State) => CSSProperties | undefined) | undefined;\n render?: RenderProp<State> | undefined;\n}\n\nexport interface UseRenderParameters<State, RenderedElementType extends Element> {\n state: State;\n ref?: Ref<RenderedElementType> | Ref<RenderedElementType>[] | undefined;\n props?: object | object[] | undefined;\n stateAttrMap?: StateAttrMap<State> | undefined;\n}\n\nfunction resolveClassName<State>(\n className: string | ((state: State) => string | undefined) | undefined,\n state: State\n): string | undefined {\n return isFunction(className) ? className(state) : className;\n}\n\nfunction resolveStyle<State>(\n style: CSSProperties | ((state: State) => CSSProperties | undefined) | undefined,\n state: State\n): CSSProperties | undefined {\n return isFunction(style) ? style(state) : style;\n}\n\nfunction getElementRef(element: ReactElement): Ref<unknown> | undefined {\n // React 19+ uses element.props.ref, older versions use element.ref\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const elementAny = element as any;\n return elementAny.ref ?? elementAny.props?.ref;\n}\n\n/**\n * Render a UI component element.\n *\n * Handles:\n * - Default tag rendering\n * - Render prop (element or function)\n * - Props merging (event handlers chained, className concatenated, style merged)\n * - Ref composition\n * - className/style as functions of state\n *\n * @public\n * @example\n * ```tsx\n * return renderElement('button', componentProps, {\n * state,\n * ref: [forwardedRef, buttonRef],\n * props: [{ type: 'button' }, elementProps, getButtonProps],\n * });\n * ```\n */\nexport function renderElement<\n State extends object,\n RenderedElementType extends Element,\n TagName extends IntrinsicTagName,\n>(\n element: TagName,\n componentProps: UseRenderComponentProps<State>,\n params: UseRenderParameters<State, RenderedElementType>\n): ReactElement | null {\n const { className: classNameProp, style: styleProp, render } = componentProps;\n const { state, ref, props, stateAttrMap } = params;\n\n // Resolve className and style if they're functions\n const className = resolveClassName(classNameProp, state);\n const style = resolveStyle(styleProp, state);\n\n // Generate data attributes from state\n const stateDataAttrs = getStateDataAttrs(state, stateAttrMap);\n\n // Merge: state data attrs first, then props (so props can override)\n const propsArray = Array.isArray(props) ? props : props ? [props] : [];\n const mergedProps = mergeProps(stateDataAttrs, ...(propsArray as Record<string, unknown>[]));\n\n if (className !== undefined) {\n // Add resolved className and style\n mergedProps.className = mergedProps.className ? `${mergedProps.className} ${className}` : className;\n }\n\n if (style !== undefined) {\n mergedProps.style = mergedProps.style ? { ...(mergedProps.style as CSSProperties), ...style } : style;\n }\n\n if (isFunction(render)) {\n // Render function: call with props and state\n const mergedRef = composeRefs(ref, mergedProps.ref);\n return render({ ...mergedProps, ref: mergedRef } as HTMLProps, state);\n }\n\n if (isValidElement(render)) {\n const elementRef = getElementRef(render);\n\n const mergedRef = composeRefs(ref, mergedProps.ref, elementRef);\n\n const elementProps = mergeProps(mergedProps, render.props as Record<string, unknown>);\n elementProps.ref = mergedRef;\n\n return cloneElement(render, elementProps);\n }\n\n // Default tag\n const mergedRef = composeRefs(ref, mergedProps.ref);\n mergedProps.ref = mergedRef;\n\n return createElement(element, mergedProps);\n}\n\nexport namespace renderElement {\n export type ComponentProps<State> = UseRenderComponentProps<State>;\n export type Parameters<State, RenderedElementType extends Element> = UseRenderParameters<State, RenderedElementType>;\n}\n"],"mappings":";;;;;;;;AAWA,SAAgB,aAAa,OAA8C;AACzE,QAAO,WAAW,MAAM,IAAI,eAAe,MAAM;;AAkBnD,SAAS,iBACP,WACA,OACoB;AACpB,QAAO,WAAW,UAAU,GAAG,UAAU,MAAM,GAAG;;AAGpD,SAAS,aACP,OACA,OAC2B;AAC3B,QAAO,WAAW,MAAM,GAAG,MAAM,MAAM,GAAG;;AAG5C,SAAS,cAAc,SAAiD;CAGtE,MAAM,aAAa;AACnB,QAAO,WAAW,OAAO,WAAW,OAAO;;;;;;;;;;;;;;;;;;;;;;AAuB7C,SAAgB,cAKd,SACA,gBACA,QACqB;CACrB,MAAM,EAAE,WAAW,eAAe,OAAO,WAAW,WAAW;CAC/D,MAAM,EAAE,OAAO,KAAK,OAAO,iBAAiB;CAG5C,MAAM,YAAY,iBAAiB,eAAe,MAAM;CACxD,MAAM,QAAQ,aAAa,WAAW,MAAM;CAO5C,MAAM,cAAc,WAJG,kBAAkB,OAAO,aAAa,EAId,GAD5B,MAAM,QAAQ,MAAM,GAAG,QAAQ,QAAQ,CAAC,MAAM,GAAG,EAAE,CACsB;AAE5F,KAAI,cAAc,KAAA,EAEhB,aAAY,YAAY,YAAY,YAAY,GAAG,YAAY,UAAU,GAAG,cAAc;AAG5F,KAAI,UAAU,KAAA,EACZ,aAAY,QAAQ,YAAY,QAAQ;EAAE,GAAI,YAAY;EAAyB,GAAG;EAAO,GAAG;AAGlG,KAAI,WAAW,OAAO,EAAE;EAEtB,MAAM,YAAY,YAAY,KAAK,YAAY,IAAI;AACnD,SAAO,OAAO;GAAE,GAAG;GAAa,KAAK;GAAW,EAAe,MAAM;;AAGvE,KAAI,eAAe,OAAO,EAAE;EAC1B,MAAM,aAAa,cAAc,OAAO;EAExC,MAAM,YAAY,YAAY,KAAK,YAAY,KAAK,WAAW;EAE/D,MAAM,eAAe,WAAW,aAAa,OAAO,MAAiC;AACrF,eAAa,MAAM;AAEnB,SAAO,aAAa,QAAQ,aAAa;;AAK3C,aAAY,MADM,YAAY,KAAK,YAAY,IAAI;AAGnD,QAAO,cAAc,SAAS,YAAY"}
1
+ {"version":3,"file":"use-render.js","names":[],"sources":["../../../src/utils/use-render.tsx"],"sourcesContent":["'use client';\n\nimport { getStateDataAttrs, type StateAttrMap } from '@videojs/core/dom';\nimport { isFunction } from '@videojs/utils/predicate';\nimport type { CSSProperties, ReactElement, Ref } from 'react';\nimport { cloneElement, createElement, isValidElement } from 'react';\nimport { mergeProps } from './merge-props';\nimport type { HTMLProps, RenderProp } from './types';\nimport { composeRefs } from './use-composed-refs';\n\n/** Check if a value is a render prop (function or React element). */\nexport function isRenderProp(value: unknown): value is RenderProp<unknown> {\n return isFunction(value) || isValidElement(value);\n}\n\ntype IntrinsicTagName = keyof React.JSX.IntrinsicElements;\n\nexport interface UseRenderComponentProps<State> {\n className?: string | ((state: State) => string | undefined) | undefined;\n style?: CSSProperties | ((state: State) => CSSProperties | undefined) | undefined;\n render?: RenderProp<State> | undefined;\n}\n\nexport interface UseRenderParameters<State, RenderedElementType extends Element> {\n state: State;\n ref?: Ref<RenderedElementType> | Ref<RenderedElementType>[] | undefined;\n props?: object | object[] | undefined;\n stateAttrMap?: StateAttrMap<State> | undefined;\n}\n\nfunction resolveClassName<State>(\n className: string | ((state: State) => string | undefined) | undefined,\n state: State\n): string | undefined {\n return isFunction(className) ? className(state) : className;\n}\n\nfunction resolveStyle<State>(\n style: CSSProperties | ((state: State) => CSSProperties | undefined) | undefined,\n state: State\n): CSSProperties | undefined {\n return isFunction(style) ? style(state) : style;\n}\n\nfunction getElementRef(element: ReactElement): Ref<unknown> | undefined {\n // React 19+ uses element.props.ref, older versions use element.ref\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const elementAny = element as any;\n return elementAny.ref ?? elementAny.props?.ref;\n}\n\n/**\n * Render a UI component element.\n *\n * Handles:\n * - Default tag rendering\n * - Render prop (element or function)\n * - Props merging (event handlers chained, className concatenated, style merged)\n * - Ref composition\n * - className/style as functions of state\n *\n * @public\n * @example\n * ```tsx\n * return renderElement('button', componentProps, {\n * state,\n * ref: [forwardedRef, buttonRef],\n * props: [{ type: 'button' }, elementProps, getButtonProps],\n * });\n * ```\n */\nexport function renderElement<\n State extends object,\n RenderedElementType extends Element,\n TagName extends IntrinsicTagName,\n>(\n element: TagName,\n componentProps: UseRenderComponentProps<State>,\n params: UseRenderParameters<State, RenderedElementType>\n): ReactElement | null {\n const { className: classNameProp, style: styleProp, render } = componentProps;\n const { state, ref, props, stateAttrMap } = params;\n\n // Resolve className and style if they're functions\n const className = resolveClassName(classNameProp, state);\n const style = resolveStyle(styleProp, state);\n\n // Generate data attributes only when a component explicitly opts in with a\n // mapping. State is still passed to render/className/style callbacks.\n const stateDataAttrs = stateAttrMap ? getStateDataAttrs(state, stateAttrMap) : {};\n\n // Merge: state data attrs first, then props (so props can override)\n const propsArray = Array.isArray(props) ? props : props ? [props] : [];\n const mergedProps = mergeProps(stateDataAttrs, ...(propsArray as Record<string, unknown>[]));\n\n if (className !== undefined) {\n // Add resolved className and style\n mergedProps.className = mergedProps.className ? `${mergedProps.className} ${className}` : className;\n }\n\n if (style !== undefined) {\n mergedProps.style = mergedProps.style ? { ...(mergedProps.style as CSSProperties), ...style } : style;\n }\n\n if (isFunction(render)) {\n // Render function: call with props and state\n const mergedRef = composeRefs(ref, mergedProps.ref);\n return render({ ...mergedProps, ref: mergedRef } as HTMLProps, state);\n }\n\n if (isValidElement(render)) {\n const elementRef = getElementRef(render);\n\n const mergedRef = composeRefs(ref, mergedProps.ref, elementRef);\n\n const elementProps = mergeProps(mergedProps, render.props as Record<string, unknown>);\n elementProps.ref = mergedRef;\n\n return cloneElement(render, elementProps);\n }\n\n // Default tag\n const mergedRef = composeRefs(ref, mergedProps.ref);\n mergedProps.ref = mergedRef;\n\n return createElement(element, mergedProps);\n}\n\nexport namespace renderElement {\n export type ComponentProps<State> = UseRenderComponentProps<State>;\n export type Parameters<State, RenderedElementType extends Element> = UseRenderParameters<State, RenderedElementType>;\n}\n"],"mappings":";;;;;;;;AAWA,SAAgB,aAAa,OAA8C;AACzE,QAAO,WAAW,MAAM,IAAI,eAAe,MAAM;;AAkBnD,SAAS,iBACP,WACA,OACoB;AACpB,QAAO,WAAW,UAAU,GAAG,UAAU,MAAM,GAAG;;AAGpD,SAAS,aACP,OACA,OAC2B;AAC3B,QAAO,WAAW,MAAM,GAAG,MAAM,MAAM,GAAG;;AAG5C,SAAS,cAAc,SAAiD;CAGtE,MAAM,aAAa;AACnB,QAAO,WAAW,OAAO,WAAW,OAAO;;;;;;;;;;;;;;;;;;;;;;AAuB7C,SAAgB,cAKd,SACA,gBACA,QACqB;CACrB,MAAM,EAAE,WAAW,eAAe,OAAO,WAAW,WAAW;CAC/D,MAAM,EAAE,OAAO,KAAK,OAAO,iBAAiB;CAG5C,MAAM,YAAY,iBAAiB,eAAe,MAAM;CACxD,MAAM,QAAQ,aAAa,WAAW,MAAM;CAQ5C,MAAM,cAAc,WAJG,eAAe,kBAAkB,OAAO,aAAa,GAAG,EAAE,EAIlC,GAD5B,MAAM,QAAQ,MAAM,GAAG,QAAQ,QAAQ,CAAC,MAAM,GAAG,EAAE,CACsB;AAE5F,KAAI,cAAc,KAAA,EAEhB,aAAY,YAAY,YAAY,YAAY,GAAG,YAAY,UAAU,GAAG,cAAc;AAG5F,KAAI,UAAU,KAAA,EACZ,aAAY,QAAQ,YAAY,QAAQ;EAAE,GAAI,YAAY;EAAyB,GAAG;EAAO,GAAG;AAGlG,KAAI,WAAW,OAAO,EAAE;EAEtB,MAAM,YAAY,YAAY,KAAK,YAAY,IAAI;AACnD,SAAO,OAAO;GAAE,GAAG;GAAa,KAAK;GAAW,EAAe,MAAM;;AAGvE,KAAI,eAAe,OAAO,EAAE;EAC1B,MAAM,aAAa,cAAc,OAAO;EAExC,MAAM,YAAY,YAAY,KAAK,YAAY,KAAK,WAAW;EAE/D,MAAM,eAAe,WAAW,aAAa,OAAO,MAAiC;AACrF,eAAa,MAAM;AAEnB,SAAO,aAAa,QAAQ,aAAa;;AAK3C,aAAY,MADM,YAAY,KAAK,YAAY,IAAI;AAGnD,QAAO,cAAc,SAAS,YAAY"}
package/docs/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @videojs/react documentation
2
2
 
3
- Bundled markdown documentation for `@videojs/react` v10.0.0-beta.24.
3
+ Bundled markdown documentation for `@videojs/react` v10.0.0-beta.25.
4
4
 
5
5
  Start at [`./llms.txt`](./llms.txt) — it's the structured index of every page in this directory.
6
6
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Which browsers Video.js 10 supports and how it handles newer platform features
4
4
 
5
- Video.js 10 currently targets **evergreen browsers** : the latest two stable versions of Chrome, Firefox, Safari, and Edge.
5
+ Video.js 10 currently targets **evergreen browsers**: the latest two stable versions of Chrome, Firefox, Safari, and Edge.
6
6
 
7
7
  Note
8
8
 
@@ -0,0 +1,162 @@
1
+ # Google Cast
2
+
3
+ How to add Chromecast support to your Video.js player — lazy SDK loading, session lifecycle, and configuration options
4
+
5
+ Video.js has built-in Google Cast support for HLS and DASH media elements. When a Chromecast device is on the same network, a Cast button appears automatically in Chromium browsers. Tapping it starts a session that moves playback to the TV while the browser stays in control.
6
+
7
+ Note
8
+
9
+ Cast is only available in Chromium-based browsers (Chrome, Edge, and others built on Blink). On other browsers, `remotePlaybackAvailability` is `'unsupported'`.
10
+
11
+ ## How Cast works
12
+
13
+ Cast uses a **sender / receiver** model:
14
+
15
+ * **Sender** — the browser tab. It controls playback commands (play, pause, seek, volume) and sends a load request to the receiver with the source URL and metadata.
16
+ * **Receiver** — the Chromecast device running the default media receiver application (or a custom receiver you configure).
17
+
18
+ ### Session lifecycle
19
+
20
+ A Cast session moves through three states, exposed via the [Remote Playback](../reference/feature-remote-playback.md) feature:
21
+
22
+ State
23
+
24
+ Meaning
25
+
26
+ `'disconnected'`
27
+
28
+ No active session
29
+
30
+ `'connecting'`
31
+
32
+ User accepted; session negotiating
33
+
34
+ `'connected'`
35
+
36
+ Receiver is playing
37
+
38
+ While `connected`, the media element’s `play`, `pause`, `currentTime`, `volume`, `muted`, and `playbackRate` all proxy to the Cast receiver. Local playback is suspended.
39
+
40
+ ### The lazy-loaded SDK
41
+
42
+ The Cast SDK (`cast_sender.js`) is injected into the page as a `<script>` tag the first time a Cast-capable media element is created in a Chromium browser. No SDK cost is paid on browsers that don’t support Cast.
43
+
44
+ Set `disableRemotePlayback` on the media element to opt out:
45
+
46
+ tsx
47
+
48
+ ```
49
+ <HlsJsVideo disableRemotePlayback />
50
+ ```
51
+
52
+ ## Minimal setup
53
+
54
+ Cast works out of the box with the `videoFeatures` preset — no extra configuration needed. Add a `CastButton` to give users a way to start and stop a session:
55
+
56
+ tsx
57
+
58
+ ```
59
+ import { createPlayer, CastButton } from '@videojs/react';
60
+ import { HlsJsVideo } from '@videojs/react/media/hlsjs-video';
61
+ import { videoFeatures } from '@videojs/react/video';
62
+
63
+ const Player = createPlayer({ features: videoFeatures });
64
+
65
+ export default function App() {
66
+ return (
67
+ <Player.Provider>
68
+ <Player.Container>
69
+ <HlsJsVideo src="https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM.m3u8" autoPlay muted playsInline loop />
70
+ <CastButton />
71
+ </Player.Container>
72
+ </Player.Provider>
73
+ );
74
+ }
75
+ ```
76
+
77
+ ## Configuring Cast
78
+
79
+ All Cast configuration is set via the `config.googleCast` property. In React, pass it as a declarative prop. In HTML, set it as a JavaScript property; HTML attributes are not supported.
80
+
81
+ ### Custom receiver application ID
82
+
83
+ By default, Video.js uses Google’s [Default Media Receiver](https://developers.google.com/cast/docs/web_sender/integrate#default_media_web_receiver) (`CC1AD845`). To use your own receiver app, set `receiver`:
84
+
85
+ tsx
86
+
87
+ ```
88
+ <HlsJsVideo src="https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM.m3u8" config={{ googleCast: { receiver: 'YOUR_APP_ID' } }} />
89
+ ```
90
+
91
+ ### Custom data on load
92
+
93
+ Pass arbitrary data to the receiver with each load request via `customData`. The receiver app reads it from the `customData` field of the load request:
94
+
95
+ tsx
96
+
97
+ ```
98
+ <HlsJsVideo
99
+ src="https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM.m3u8"
100
+ config={{ googleCast: { customData: { token: 'abc123', userId: 'u_789' } } }}
101
+ />
102
+ ```
103
+
104
+ ### Cast source override
105
+
106
+ By default the receiver loads the same URL as the browser. Use `src` (and optionally `contentType`) to send a different URL, for example, a separate manifest or CDN-edge URL accessible from the TV network:
107
+
108
+ tsx
109
+
110
+ ```
111
+ <HlsJsVideo
112
+ src="https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4"
113
+ config={{ googleCast: { src: 'https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM.m3u8', contentType: 'application/x-mpegURL' } }}
114
+ />
115
+ ```
116
+
117
+ ### HLS on the receiver
118
+
119
+ When the source (or `config.googleCast.src`) is an HLS playlist, Video.js automatically detects the segment format (TS or fMP4) by inspecting the playlist and sets `hlsSegmentFormat` / `hlsVideoSegmentFormat` on the Cast load request. The default media receiver handles HLS natively, so no extra configuration is needed.
120
+
121
+ Use `streamType` to tell the receiver whether the stream is `'on-demand'` or `'live'` (falls back to the player’s `streamType` when unset):
122
+
123
+ tsx
124
+
125
+ ```
126
+ <HlsJsVideo src="https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM.m3u8" config={{ googleCast: { streamType: 'live' } }} />
127
+ ```
128
+
129
+ ## Cast state and selectors
130
+
131
+ Cast session state lives in the [Remote Playback](../reference/feature-remote-playback.md) feature slice. Use `selectRemotePlayback` to subscribe:
132
+
133
+ tsx
134
+
135
+ ```
136
+ import { selectRemotePlayback, usePlayer } from '@videojs/react';
137
+
138
+ function CastStatus() {
139
+ const remotePlayback = usePlayer(selectRemotePlayback);
140
+ if (!remotePlayback) return null;
141
+
142
+ return <span>{remotePlayback.remotePlaybackState}</span>;
143
+ }
144
+ ```
145
+
146
+ ## Browser availability
147
+
148
+ Cast availability is surfaced as `remotePlaybackAvailability` on the remote playback feature. Hide the button when unsupported:
149
+
150
+ css
151
+
152
+ ```
153
+ .cast-button[data-availability="unsupported"] {
154
+ display: none;
155
+ }
156
+ ```
157
+
158
+ ## See also
159
+
160
+ [CastButton component reference](../reference/cast-button.md)
161
+
162
+ [Remote Playback feature reference](../reference/feature-remote-playback.md)
@@ -21,7 +21,7 @@ import { videoFeatures } from '@videojs/react/video';
21
21
  const Player = createPlayer({ features: videoFeatures });
22
22
  ```
23
23
 
24
- Feature bundles are usually paired with specific skins and media elements in a **preset** . To learn more about this, and the available presets, you’ll want to check out the presets guide.
24
+ Feature bundles are usually paired with specific skins and media elements in a **preset**. To learn more about this, and the available presets, you’ll want to check out the presets guide.
25
25
 
26
26
  [Learn more about presets](./presets.md)
27
27
 
@@ -27,7 +27,7 @@ You can access state and actions from anywhere within the provider with the [`us
27
27
 
28
28
  ## 2\. User interface
29
29
 
30
- Use a prebuilt **skin** or build your own from the individual **UI components** .
30
+ Use a prebuilt **skin** or build your own from the individual **UI components**.
31
31
 
32
32
  ### Skins
33
33
 
@@ -55,10 +55,10 @@ tsx
55
55
  <Player.Provider>
56
56
  <Player.Container>
57
57
  <Video src="video.mp4" />
58
- <MediaControls>
58
+ <Controls.Root>
59
59
  <PlayButton />
60
60
  {/* ... */}
61
- </MediaControls>
61
+ </Controls.Root>
62
62
  </Player.Container>
63
63
  </Player.Provider>
64
64
  ```
@@ -84,7 +84,7 @@ tsx
84
84
  ```
85
85
  <Player.Provider>
86
86
  <VideoSkin>
87
- <HlsVideo src="https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM.m3u8" />
87
+ <HlsJsVideo src="https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM.m3u8" />
88
88
  </VideoSkin>
89
89
  </Player.Provider>
90
90
  ```