@videojs/react 10.0.0-alpha.7 → 10.0.0-beta.1

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 (505) hide show
  1. package/README.md +2 -2
  2. package/dist/default/icons/dist/react/default/captions-off.js +1 -0
  3. package/dist/default/icons/dist/react/default/captions-off.js.map +1 -1
  4. package/dist/default/icons/dist/react/default/captions-on.js +1 -0
  5. package/dist/default/icons/dist/react/default/captions-on.js.map +1 -1
  6. package/dist/default/icons/dist/react/default/fullscreen-enter.js +1 -0
  7. package/dist/default/icons/dist/react/default/fullscreen-enter.js.map +1 -1
  8. package/dist/default/icons/dist/react/default/fullscreen-exit.js +1 -0
  9. package/dist/default/icons/dist/react/default/fullscreen-exit.js.map +1 -1
  10. package/dist/default/icons/dist/react/default/pause.js +1 -0
  11. package/dist/default/icons/dist/react/default/pause.js.map +1 -1
  12. package/dist/default/icons/dist/react/default/pip.js +1 -0
  13. package/dist/default/icons/dist/react/default/pip.js.map +1 -1
  14. package/dist/default/icons/dist/react/default/play.js +1 -0
  15. package/dist/default/icons/dist/react/default/play.js.map +1 -1
  16. package/dist/default/icons/dist/react/default/restart.js +1 -0
  17. package/dist/default/icons/dist/react/default/restart.js.map +1 -1
  18. package/dist/default/icons/dist/react/default/seek.js +1 -0
  19. package/dist/default/icons/dist/react/default/seek.js.map +1 -1
  20. package/dist/default/icons/dist/react/default/spinner.js +1 -0
  21. package/dist/default/icons/dist/react/default/spinner.js.map +1 -1
  22. package/dist/default/icons/dist/react/default/volume-high.js +1 -0
  23. package/dist/default/icons/dist/react/default/volume-high.js.map +1 -1
  24. package/dist/default/icons/dist/react/default/volume-low.js +1 -0
  25. package/dist/default/icons/dist/react/default/volume-low.js.map +1 -1
  26. package/dist/default/icons/dist/react/default/volume-off.js +1 -0
  27. package/dist/default/icons/dist/react/default/volume-off.js.map +1 -1
  28. package/dist/default/icons/dist/react/minimal/captions-off.js +1 -0
  29. package/dist/default/icons/dist/react/minimal/captions-off.js.map +1 -1
  30. package/dist/default/icons/dist/react/minimal/captions-on.js +1 -0
  31. package/dist/default/icons/dist/react/minimal/captions-on.js.map +1 -1
  32. package/dist/default/icons/dist/react/minimal/fullscreen-enter.js +1 -0
  33. package/dist/default/icons/dist/react/minimal/fullscreen-enter.js.map +1 -1
  34. package/dist/default/icons/dist/react/minimal/fullscreen-exit.js +1 -0
  35. package/dist/default/icons/dist/react/minimal/fullscreen-exit.js.map +1 -1
  36. package/dist/default/icons/dist/react/minimal/pause.js +1 -0
  37. package/dist/default/icons/dist/react/minimal/pause.js.map +1 -1
  38. package/dist/default/icons/dist/react/minimal/pip.js +1 -0
  39. package/dist/default/icons/dist/react/minimal/pip.js.map +1 -1
  40. package/dist/default/icons/dist/react/minimal/play.js +1 -0
  41. package/dist/default/icons/dist/react/minimal/play.js.map +1 -1
  42. package/dist/default/icons/dist/react/minimal/restart.js +1 -0
  43. package/dist/default/icons/dist/react/minimal/restart.js.map +1 -1
  44. package/dist/default/icons/dist/react/minimal/seek.js +1 -0
  45. package/dist/default/icons/dist/react/minimal/seek.js.map +1 -1
  46. package/dist/default/icons/dist/react/minimal/spinner.js +1 -0
  47. package/dist/default/icons/dist/react/minimal/spinner.js.map +1 -1
  48. package/dist/default/icons/dist/react/minimal/volume-high.js +1 -0
  49. package/dist/default/icons/dist/react/minimal/volume-high.js.map +1 -1
  50. package/dist/default/icons/dist/react/minimal/volume-low.js +1 -0
  51. package/dist/default/icons/dist/react/minimal/volume-low.js.map +1 -1
  52. package/dist/default/icons/dist/react/minimal/volume-off.js +1 -0
  53. package/dist/default/icons/dist/react/minimal/volume-off.js.map +1 -1
  54. package/dist/default/index.js +12 -7
  55. package/dist/default/media/hls-video/index.js +4 -3
  56. package/dist/default/media/hls-video/index.js.map +1 -1
  57. package/dist/default/media/simple-hls-video/index.js +25 -0
  58. package/dist/default/media/simple-hls-video/index.js.map +1 -0
  59. package/dist/default/player/create-player.js +3 -2
  60. package/dist/default/player/create-player.js.map +1 -1
  61. package/dist/default/presets/audio/index.js +3 -1
  62. package/dist/default/presets/audio/minimal-skin.css +634 -1
  63. package/dist/default/presets/audio/minimal-skin.js +183 -3
  64. package/dist/default/presets/audio/minimal-skin.js.map +1 -1
  65. package/dist/default/presets/audio/minimal-skin.tailwind.js +238 -0
  66. package/dist/default/presets/audio/minimal-skin.tailwind.js.map +1 -0
  67. package/dist/default/presets/audio/skin.css +659 -2
  68. package/dist/default/presets/audio/skin.js +172 -3
  69. package/dist/default/presets/audio/skin.js.map +1 -1
  70. package/dist/default/presets/audio/skin.tailwind.js +226 -0
  71. package/dist/default/presets/audio/skin.tailwind.js.map +1 -0
  72. package/dist/default/presets/background/skin.css +13 -13
  73. package/dist/default/presets/video/error-dialog.js +51 -0
  74. package/dist/default/presets/video/error-dialog.js.map +1 -0
  75. package/dist/default/presets/video/minimal-skin.css +367 -256
  76. package/dist/default/presets/video/minimal-skin.js +136 -88
  77. package/dist/default/presets/video/minimal-skin.js.map +1 -1
  78. package/dist/default/presets/video/minimal-skin.tailwind.js +151 -94
  79. package/dist/default/presets/video/minimal-skin.tailwind.js.map +1 -1
  80. package/dist/default/presets/video/skin.css +395 -280
  81. package/dist/default/presets/video/skin.js +136 -88
  82. package/dist/default/presets/video/skin.js.map +1 -1
  83. package/dist/default/presets/video/skin.tailwind.js +149 -94
  84. package/dist/default/presets/video/skin.tailwind.js.map +1 -1
  85. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js +52 -0
  86. package/dist/default/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -0
  87. package/dist/default/skins/dist/default/default/tailwind/components/buffering.js +9 -0
  88. package/dist/default/skins/dist/default/default/tailwind/components/buffering.js.map +1 -0
  89. package/dist/default/skins/dist/default/default/tailwind/components/button.js +12 -0
  90. package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -0
  91. package/dist/default/skins/dist/default/default/tailwind/components/controls.js +8 -0
  92. package/dist/default/skins/dist/default/default/tailwind/components/controls.js.map +1 -0
  93. package/dist/default/skins/dist/default/default/tailwind/components/error.js +15 -0
  94. package/dist/default/skins/dist/default/default/tailwind/components/error.js.map +1 -0
  95. package/dist/default/skins/dist/default/default/tailwind/components/icon-state.js +29 -0
  96. package/dist/default/skins/dist/default/default/tailwind/components/icon-state.js.map +1 -0
  97. package/dist/default/skins/dist/default/default/tailwind/components/icon.js +10 -0
  98. package/dist/default/skins/dist/default/default/tailwind/components/icon.js.map +1 -0
  99. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js +8 -0
  100. package/dist/default/skins/dist/default/default/tailwind/components/overlay.js.map +1 -0
  101. package/dist/default/skins/dist/default/default/tailwind/components/playback-rate.js +6 -0
  102. package/dist/default/skins/dist/default/default/tailwind/components/playback-rate.js.map +1 -0
  103. package/dist/default/skins/dist/default/default/tailwind/components/popup.js +13 -0
  104. package/dist/default/skins/dist/default/default/tailwind/components/popup.js.map +1 -0
  105. package/dist/default/skins/dist/default/default/tailwind/components/root.js +8 -0
  106. package/dist/default/skins/dist/default/default/tailwind/components/root.js.map +1 -0
  107. package/dist/default/skins/dist/default/default/tailwind/components/seek.js +11 -0
  108. package/dist/default/skins/dist/default/default/tailwind/components/seek.js.map +1 -0
  109. package/dist/default/skins/dist/default/default/tailwind/components/slider.js +21 -0
  110. package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -0
  111. package/dist/default/skins/dist/default/default/tailwind/components/surface.js +8 -0
  112. package/dist/default/skins/dist/default/default/tailwind/components/surface.js.map +1 -0
  113. package/dist/default/skins/dist/default/default/tailwind/components/time.js +10 -0
  114. package/dist/default/skins/dist/default/default/tailwind/components/time.js.map +1 -0
  115. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +54 -0
  116. package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -0
  117. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js +38 -0
  118. package/dist/default/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -0
  119. package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js +6 -0
  120. package/dist/default/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -0
  121. package/dist/default/skins/dist/default/minimal/tailwind/components/button-group.js +8 -0
  122. package/dist/default/skins/dist/default/minimal/tailwind/components/button-group.js.map +1 -0
  123. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js +12 -0
  124. package/dist/default/skins/dist/default/minimal/tailwind/components/button.js.map +1 -0
  125. package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js +8 -0
  126. package/dist/default/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -0
  127. package/dist/default/skins/dist/default/minimal/tailwind/components/error.js +15 -0
  128. package/dist/default/skins/dist/default/minimal/tailwind/components/error.js.map +1 -0
  129. package/dist/default/skins/dist/default/minimal/tailwind/components/icon-state.js +29 -0
  130. package/dist/default/skins/dist/default/minimal/tailwind/components/icon-state.js.map +1 -0
  131. package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js +10 -0
  132. package/dist/default/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -0
  133. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js +8 -0
  134. package/dist/default/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -0
  135. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js +12 -0
  136. package/dist/default/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -0
  137. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js +8 -0
  138. package/dist/default/skins/dist/default/minimal/tailwind/components/root.js.map +1 -0
  139. package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js +11 -0
  140. package/dist/default/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -0
  141. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +20 -0
  142. package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -0
  143. package/dist/default/skins/dist/default/minimal/tailwind/components/time.js +14 -0
  144. package/dist/default/skins/dist/default/minimal/tailwind/components/time.js.map +1 -0
  145. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +43 -0
  146. package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -0
  147. package/dist/default/ui/alert-dialog/alert-dialog-close.js +31 -0
  148. package/dist/default/ui/alert-dialog/alert-dialog-close.js.map +1 -0
  149. package/dist/default/ui/alert-dialog/alert-dialog-description.js +16 -0
  150. package/dist/default/ui/alert-dialog/alert-dialog-description.js.map +1 -0
  151. package/dist/default/ui/alert-dialog/alert-dialog-popup.js +32 -0
  152. package/dist/default/ui/alert-dialog/alert-dialog-popup.js.map +1 -0
  153. package/dist/default/ui/alert-dialog/alert-dialog-root.js +59 -0
  154. package/dist/default/ui/alert-dialog/alert-dialog-root.js.map +1 -0
  155. package/dist/default/ui/alert-dialog/alert-dialog-title.js +16 -0
  156. package/dist/default/ui/alert-dialog/alert-dialog-title.js.map +1 -0
  157. package/dist/default/ui/alert-dialog/context.js +16 -0
  158. package/dist/default/ui/alert-dialog/context.js.map +1 -0
  159. package/dist/default/ui/alert-dialog/index.js +4 -0
  160. package/dist/default/ui/alert-dialog/index.parts.js +19 -0
  161. package/dist/default/ui/alert-dialog/index.parts.js.map +1 -0
  162. package/dist/default/ui/captions-button/captions-button.js +10 -27
  163. package/dist/default/ui/captions-button/captions-button.js.map +1 -1
  164. package/dist/default/ui/create-context-part.js +7 -2
  165. package/dist/default/ui/create-context-part.js.map +1 -1
  166. package/dist/default/ui/hooks/use-slider.js +7 -17
  167. package/dist/default/ui/hooks/use-slider.js.map +1 -1
  168. package/dist/default/ui/popover/popover-arrow.js +1 -1
  169. package/dist/default/ui/popover/popover-popup.js +4 -2
  170. package/dist/default/ui/popover/popover-popup.js.map +1 -1
  171. package/dist/default/ui/popover/popover-root.js +3 -2
  172. package/dist/default/ui/popover/popover-root.js.map +1 -1
  173. package/dist/default/ui/popover/popover-trigger.js +4 -5
  174. package/dist/default/ui/popover/popover-trigger.js.map +1 -1
  175. package/dist/default/ui/slider/index.parts.js +4 -0
  176. package/dist/default/ui/slider/index.parts.js.map +1 -1
  177. package/dist/default/ui/slider/slider-preview.js +40 -0
  178. package/dist/default/ui/slider/slider-preview.js.map +1 -0
  179. package/dist/default/ui/slider/slider-root.js +5 -2
  180. package/dist/default/ui/slider/slider-root.js.map +1 -1
  181. package/dist/default/ui/slider/slider-thumbnail.js +20 -0
  182. package/dist/default/ui/slider/slider-thumbnail.js.map +1 -0
  183. package/dist/default/ui/thumbnail/thumbnail.js +3 -5
  184. package/dist/default/ui/thumbnail/thumbnail.js.map +1 -1
  185. package/dist/default/ui/time-slider/index.parts.js +2 -0
  186. package/dist/default/ui/time-slider/index.parts.js.map +1 -1
  187. package/dist/default/ui/time-slider/time-slider-root.js +5 -2
  188. package/dist/default/ui/time-slider/time-slider-root.js.map +1 -1
  189. package/dist/default/ui/tooltip/context.js +16 -0
  190. package/dist/default/ui/tooltip/context.js.map +1 -0
  191. package/dist/default/ui/tooltip/group-context.js +15 -0
  192. package/dist/default/ui/tooltip/group-context.js.map +1 -0
  193. package/dist/default/ui/tooltip/index.js +4 -0
  194. package/dist/default/ui/tooltip/index.parts.js +19 -0
  195. package/dist/default/ui/tooltip/index.parts.js.map +1 -0
  196. package/dist/default/ui/tooltip/tooltip-arrow.js +17 -0
  197. package/dist/default/ui/tooltip/tooltip-arrow.js.map +1 -0
  198. package/dist/default/ui/tooltip/tooltip-popup.js +97 -0
  199. package/dist/default/ui/tooltip/tooltip-popup.js.map +1 -0
  200. package/dist/default/ui/tooltip/tooltip-provider.js +28 -0
  201. package/dist/default/ui/tooltip/tooltip-provider.js.map +1 -0
  202. package/dist/default/ui/tooltip/tooltip-root.js +71 -0
  203. package/dist/default/ui/tooltip/tooltip-root.js.map +1 -0
  204. package/dist/default/ui/tooltip/tooltip-trigger.js +42 -0
  205. package/dist/default/ui/tooltip/tooltip-trigger.js.map +1 -0
  206. package/dist/default/ui/volume-slider/index.parts.js +2 -0
  207. package/dist/default/ui/volume-slider/index.parts.js.map +1 -1
  208. package/dist/default/ui/volume-slider/volume-slider-root.js +9 -6
  209. package/dist/default/ui/volume-slider/volume-slider-root.js.map +1 -1
  210. package/dist/default/utils/use-destroy.js +33 -0
  211. package/dist/default/utils/use-destroy.js.map +1 -0
  212. package/dist/dev/icons/dist/react/default/captions-off.js +1 -0
  213. package/dist/dev/icons/dist/react/default/captions-off.js.map +1 -1
  214. package/dist/dev/icons/dist/react/default/captions-on.js +1 -0
  215. package/dist/dev/icons/dist/react/default/captions-on.js.map +1 -1
  216. package/dist/dev/icons/dist/react/default/fullscreen-enter.js +1 -0
  217. package/dist/dev/icons/dist/react/default/fullscreen-enter.js.map +1 -1
  218. package/dist/dev/icons/dist/react/default/fullscreen-exit.js +1 -0
  219. package/dist/dev/icons/dist/react/default/fullscreen-exit.js.map +1 -1
  220. package/dist/dev/icons/dist/react/default/pause.js +1 -0
  221. package/dist/dev/icons/dist/react/default/pause.js.map +1 -1
  222. package/dist/dev/icons/dist/react/default/pip.js +1 -0
  223. package/dist/dev/icons/dist/react/default/pip.js.map +1 -1
  224. package/dist/dev/icons/dist/react/default/play.js +1 -0
  225. package/dist/dev/icons/dist/react/default/play.js.map +1 -1
  226. package/dist/dev/icons/dist/react/default/restart.js +1 -0
  227. package/dist/dev/icons/dist/react/default/restart.js.map +1 -1
  228. package/dist/dev/icons/dist/react/default/seek.js +1 -0
  229. package/dist/dev/icons/dist/react/default/seek.js.map +1 -1
  230. package/dist/dev/icons/dist/react/default/spinner.js +1 -0
  231. package/dist/dev/icons/dist/react/default/spinner.js.map +1 -1
  232. package/dist/dev/icons/dist/react/default/volume-high.js +1 -0
  233. package/dist/dev/icons/dist/react/default/volume-high.js.map +1 -1
  234. package/dist/dev/icons/dist/react/default/volume-low.js +1 -0
  235. package/dist/dev/icons/dist/react/default/volume-low.js.map +1 -1
  236. package/dist/dev/icons/dist/react/default/volume-off.js +1 -0
  237. package/dist/dev/icons/dist/react/default/volume-off.js.map +1 -1
  238. package/dist/dev/icons/dist/react/minimal/captions-off.js +1 -0
  239. package/dist/dev/icons/dist/react/minimal/captions-off.js.map +1 -1
  240. package/dist/dev/icons/dist/react/minimal/captions-on.js +1 -0
  241. package/dist/dev/icons/dist/react/minimal/captions-on.js.map +1 -1
  242. package/dist/dev/icons/dist/react/minimal/fullscreen-enter.js +1 -0
  243. package/dist/dev/icons/dist/react/minimal/fullscreen-enter.js.map +1 -1
  244. package/dist/dev/icons/dist/react/minimal/fullscreen-exit.js +1 -0
  245. package/dist/dev/icons/dist/react/minimal/fullscreen-exit.js.map +1 -1
  246. package/dist/dev/icons/dist/react/minimal/pause.js +1 -0
  247. package/dist/dev/icons/dist/react/minimal/pause.js.map +1 -1
  248. package/dist/dev/icons/dist/react/minimal/pip.js +1 -0
  249. package/dist/dev/icons/dist/react/minimal/pip.js.map +1 -1
  250. package/dist/dev/icons/dist/react/minimal/play.js +1 -0
  251. package/dist/dev/icons/dist/react/minimal/play.js.map +1 -1
  252. package/dist/dev/icons/dist/react/minimal/restart.js +1 -0
  253. package/dist/dev/icons/dist/react/minimal/restart.js.map +1 -1
  254. package/dist/dev/icons/dist/react/minimal/seek.js +1 -0
  255. package/dist/dev/icons/dist/react/minimal/seek.js.map +1 -1
  256. package/dist/dev/icons/dist/react/minimal/spinner.js +1 -0
  257. package/dist/dev/icons/dist/react/minimal/spinner.js.map +1 -1
  258. package/dist/dev/icons/dist/react/minimal/volume-high.js +1 -0
  259. package/dist/dev/icons/dist/react/minimal/volume-high.js.map +1 -1
  260. package/dist/dev/icons/dist/react/minimal/volume-low.js +1 -0
  261. package/dist/dev/icons/dist/react/minimal/volume-low.js.map +1 -1
  262. package/dist/dev/icons/dist/react/minimal/volume-off.js +1 -0
  263. package/dist/dev/icons/dist/react/minimal/volume-off.js.map +1 -1
  264. package/dist/dev/index.d.ts +14 -14
  265. package/dist/dev/index.js +12 -7
  266. package/dist/dev/media/hls-video/index.d.ts.map +1 -1
  267. package/dist/dev/media/hls-video/index.js +4 -3
  268. package/dist/dev/media/hls-video/index.js.map +1 -1
  269. package/dist/dev/media/simple-hls-video/index.d.ts +11 -0
  270. package/dist/dev/media/simple-hls-video/index.d.ts.map +1 -0
  271. package/dist/dev/media/simple-hls-video/index.js +25 -0
  272. package/dist/dev/media/simple-hls-video/index.js.map +1 -0
  273. package/dist/dev/player/create-player.d.ts.map +1 -1
  274. package/dist/dev/player/create-player.js +3 -2
  275. package/dist/dev/player/create-player.js.map +1 -1
  276. package/dist/dev/presets/audio/index.d.ts +3 -1
  277. package/dist/dev/presets/audio/index.js +3 -1
  278. package/dist/dev/presets/audio/minimal-skin.css +634 -1
  279. package/dist/dev/presets/audio/minimal-skin.d.ts +2 -2
  280. package/dist/dev/presets/audio/minimal-skin.d.ts.map +1 -1
  281. package/dist/dev/presets/audio/minimal-skin.js +183 -3
  282. package/dist/dev/presets/audio/minimal-skin.js.map +1 -1
  283. package/dist/dev/presets/audio/minimal-skin.tailwind.d.ts +8 -0
  284. package/dist/dev/presets/audio/minimal-skin.tailwind.d.ts.map +1 -0
  285. package/dist/dev/presets/audio/minimal-skin.tailwind.js +238 -0
  286. package/dist/dev/presets/audio/minimal-skin.tailwind.js.map +1 -0
  287. package/dist/dev/presets/audio/skin.css +659 -2
  288. package/dist/dev/presets/audio/skin.d.ts +2 -2
  289. package/dist/dev/presets/audio/skin.d.ts.map +1 -1
  290. package/dist/dev/presets/audio/skin.js +172 -3
  291. package/dist/dev/presets/audio/skin.js.map +1 -1
  292. package/dist/dev/presets/audio/skin.tailwind.d.ts +8 -0
  293. package/dist/dev/presets/audio/skin.tailwind.d.ts.map +1 -0
  294. package/dist/dev/presets/audio/skin.tailwind.js +226 -0
  295. package/dist/dev/presets/audio/skin.tailwind.js.map +1 -0
  296. package/dist/dev/presets/background/skin.css +13 -13
  297. package/dist/dev/presets/video/error-dialog.js +51 -0
  298. package/dist/dev/presets/video/error-dialog.js.map +1 -0
  299. package/dist/dev/presets/video/minimal-skin.css +367 -256
  300. package/dist/dev/presets/video/minimal-skin.d.ts.map +1 -1
  301. package/dist/dev/presets/video/minimal-skin.js +136 -88
  302. package/dist/dev/presets/video/minimal-skin.js.map +1 -1
  303. package/dist/dev/presets/video/minimal-skin.tailwind.d.ts.map +1 -1
  304. package/dist/dev/presets/video/minimal-skin.tailwind.js +151 -94
  305. package/dist/dev/presets/video/minimal-skin.tailwind.js.map +1 -1
  306. package/dist/dev/presets/video/skin.css +395 -280
  307. package/dist/dev/presets/video/skin.d.ts.map +1 -1
  308. package/dist/dev/presets/video/skin.js +136 -88
  309. package/dist/dev/presets/video/skin.js.map +1 -1
  310. package/dist/dev/presets/video/skin.tailwind.d.ts.map +1 -1
  311. package/dist/dev/presets/video/skin.tailwind.js +149 -94
  312. package/dist/dev/presets/video/skin.tailwind.js.map +1 -1
  313. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js +52 -0
  314. package/dist/dev/skins/dist/default/default/tailwind/audio.tailwind.js.map +1 -0
  315. package/dist/dev/skins/dist/default/default/tailwind/components/buffering.js +9 -0
  316. package/dist/dev/skins/dist/default/default/tailwind/components/buffering.js.map +1 -0
  317. package/dist/dev/skins/dist/default/default/tailwind/components/button.js +12 -0
  318. package/dist/dev/skins/dist/default/default/tailwind/components/button.js.map +1 -0
  319. package/dist/dev/skins/dist/default/default/tailwind/components/controls.js +8 -0
  320. package/dist/dev/skins/dist/default/default/tailwind/components/controls.js.map +1 -0
  321. package/dist/dev/skins/dist/default/default/tailwind/components/error.js +15 -0
  322. package/dist/dev/skins/dist/default/default/tailwind/components/error.js.map +1 -0
  323. package/dist/dev/skins/dist/default/default/tailwind/components/icon-state.js +29 -0
  324. package/dist/dev/skins/dist/default/default/tailwind/components/icon-state.js.map +1 -0
  325. package/dist/dev/skins/dist/default/default/tailwind/components/icon.js +10 -0
  326. package/dist/dev/skins/dist/default/default/tailwind/components/icon.js.map +1 -0
  327. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js +8 -0
  328. package/dist/dev/skins/dist/default/default/tailwind/components/overlay.js.map +1 -0
  329. package/dist/dev/skins/dist/default/default/tailwind/components/playback-rate.js +6 -0
  330. package/dist/dev/skins/dist/default/default/tailwind/components/playback-rate.js.map +1 -0
  331. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js +13 -0
  332. package/dist/dev/skins/dist/default/default/tailwind/components/popup.js.map +1 -0
  333. package/dist/dev/skins/dist/default/default/tailwind/components/root.js +8 -0
  334. package/dist/dev/skins/dist/default/default/tailwind/components/root.js.map +1 -0
  335. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js +11 -0
  336. package/dist/dev/skins/dist/default/default/tailwind/components/seek.js.map +1 -0
  337. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js +21 -0
  338. package/dist/dev/skins/dist/default/default/tailwind/components/slider.js.map +1 -0
  339. package/dist/dev/skins/dist/default/default/tailwind/components/surface.js +8 -0
  340. package/dist/dev/skins/dist/default/default/tailwind/components/surface.js.map +1 -0
  341. package/dist/dev/skins/dist/default/default/tailwind/components/time.js +10 -0
  342. package/dist/dev/skins/dist/default/default/tailwind/components/time.js.map +1 -0
  343. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js +54 -0
  344. package/dist/dev/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -0
  345. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js +38 -0
  346. package/dist/dev/skins/dist/default/minimal/tailwind/audio.tailwind.js.map +1 -0
  347. package/dist/dev/skins/dist/default/minimal/tailwind/components/buffering.js +6 -0
  348. package/dist/dev/skins/dist/default/minimal/tailwind/components/buffering.js.map +1 -0
  349. package/dist/dev/skins/dist/default/minimal/tailwind/components/button-group.js +8 -0
  350. package/dist/dev/skins/dist/default/minimal/tailwind/components/button-group.js.map +1 -0
  351. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js +12 -0
  352. package/dist/dev/skins/dist/default/minimal/tailwind/components/button.js.map +1 -0
  353. package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js +8 -0
  354. package/dist/dev/skins/dist/default/minimal/tailwind/components/controls.js.map +1 -0
  355. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js +15 -0
  356. package/dist/dev/skins/dist/default/minimal/tailwind/components/error.js.map +1 -0
  357. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon-state.js +29 -0
  358. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon-state.js.map +1 -0
  359. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js +10 -0
  360. package/dist/dev/skins/dist/default/minimal/tailwind/components/icon.js.map +1 -0
  361. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js +8 -0
  362. package/dist/dev/skins/dist/default/minimal/tailwind/components/overlay.js.map +1 -0
  363. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js +12 -0
  364. package/dist/dev/skins/dist/default/minimal/tailwind/components/popup.js.map +1 -0
  365. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js +8 -0
  366. package/dist/dev/skins/dist/default/minimal/tailwind/components/root.js.map +1 -0
  367. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js +11 -0
  368. package/dist/dev/skins/dist/default/minimal/tailwind/components/seek.js.map +1 -0
  369. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js +20 -0
  370. package/dist/dev/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -0
  371. package/dist/dev/skins/dist/default/minimal/tailwind/components/time.js +14 -0
  372. package/dist/dev/skins/dist/default/minimal/tailwind/components/time.js.map +1 -0
  373. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js +43 -0
  374. package/dist/dev/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -0
  375. package/dist/dev/ui/alert-dialog/alert-dialog-close.d.ts +14 -0
  376. package/dist/dev/ui/alert-dialog/alert-dialog-close.d.ts.map +1 -0
  377. package/dist/dev/ui/alert-dialog/alert-dialog-close.js +31 -0
  378. package/dist/dev/ui/alert-dialog/alert-dialog-close.js.map +1 -0
  379. package/dist/dev/ui/alert-dialog/alert-dialog-description.d.ts +14 -0
  380. package/dist/dev/ui/alert-dialog/alert-dialog-description.d.ts.map +1 -0
  381. package/dist/dev/ui/alert-dialog/alert-dialog-description.js +16 -0
  382. package/dist/dev/ui/alert-dialog/alert-dialog-description.js.map +1 -0
  383. package/dist/dev/ui/alert-dialog/alert-dialog-popup.d.ts +14 -0
  384. package/dist/dev/ui/alert-dialog/alert-dialog-popup.d.ts.map +1 -0
  385. package/dist/dev/ui/alert-dialog/alert-dialog-popup.js +32 -0
  386. package/dist/dev/ui/alert-dialog/alert-dialog-popup.js.map +1 -0
  387. package/dist/dev/ui/alert-dialog/alert-dialog-root.d.ts +24 -0
  388. package/dist/dev/ui/alert-dialog/alert-dialog-root.d.ts.map +1 -0
  389. package/dist/dev/ui/alert-dialog/alert-dialog-root.js +59 -0
  390. package/dist/dev/ui/alert-dialog/alert-dialog-root.js.map +1 -0
  391. package/dist/dev/ui/alert-dialog/alert-dialog-title.d.ts +14 -0
  392. package/dist/dev/ui/alert-dialog/alert-dialog-title.d.ts.map +1 -0
  393. package/dist/dev/ui/alert-dialog/alert-dialog-title.js +16 -0
  394. package/dist/dev/ui/alert-dialog/alert-dialog-title.js.map +1 -0
  395. package/dist/dev/ui/alert-dialog/context.d.ts +14 -0
  396. package/dist/dev/ui/alert-dialog/context.d.ts.map +1 -0
  397. package/dist/dev/ui/alert-dialog/context.js +16 -0
  398. package/dist/dev/ui/alert-dialog/context.js.map +1 -0
  399. package/dist/dev/ui/alert-dialog/index.d.ts +3 -0
  400. package/dist/dev/ui/alert-dialog/index.js +4 -0
  401. package/dist/dev/ui/alert-dialog/index.parts.d.ts +13 -0
  402. package/dist/dev/ui/alert-dialog/index.parts.d.ts.map +1 -0
  403. package/dist/dev/ui/alert-dialog/index.parts.js +19 -0
  404. package/dist/dev/ui/alert-dialog/index.parts.js.map +1 -0
  405. package/dist/dev/ui/captions-button/captions-button.d.ts +6 -27
  406. package/dist/dev/ui/captions-button/captions-button.d.ts.map +1 -1
  407. package/dist/dev/ui/captions-button/captions-button.js +10 -27
  408. package/dist/dev/ui/captions-button/captions-button.js.map +1 -1
  409. package/dist/dev/ui/captions-button/index.d.ts +2 -2
  410. package/dist/dev/ui/create-context-part.js +7 -2
  411. package/dist/dev/ui/create-context-part.js.map +1 -1
  412. package/dist/dev/ui/hooks/use-slider.d.ts +2 -1
  413. package/dist/dev/ui/hooks/use-slider.d.ts.map +1 -1
  414. package/dist/dev/ui/hooks/use-slider.js +7 -17
  415. package/dist/dev/ui/hooks/use-slider.js.map +1 -1
  416. package/dist/dev/ui/popover/context.d.ts +0 -1
  417. package/dist/dev/ui/popover/context.d.ts.map +1 -1
  418. package/dist/dev/ui/popover/popover-arrow.js +1 -1
  419. package/dist/dev/ui/popover/popover-popup.d.ts.map +1 -1
  420. package/dist/dev/ui/popover/popover-popup.js +4 -2
  421. package/dist/dev/ui/popover/popover-popup.js.map +1 -1
  422. package/dist/dev/ui/popover/popover-root.d.ts.map +1 -1
  423. package/dist/dev/ui/popover/popover-root.js +3 -2
  424. package/dist/dev/ui/popover/popover-root.js.map +1 -1
  425. package/dist/dev/ui/popover/popover-trigger.js +4 -5
  426. package/dist/dev/ui/popover/popover-trigger.js.map +1 -1
  427. package/dist/dev/ui/slider/index.parts.d.ts +3 -1
  428. package/dist/dev/ui/slider/index.parts.js +4 -0
  429. package/dist/dev/ui/slider/index.parts.js.map +1 -1
  430. package/dist/dev/ui/slider/slider-preview.d.ts +18 -0
  431. package/dist/dev/ui/slider/slider-preview.d.ts.map +1 -0
  432. package/dist/dev/ui/slider/slider-preview.js +40 -0
  433. package/dist/dev/ui/slider/slider-preview.js.map +1 -0
  434. package/dist/dev/ui/slider/slider-root.d.ts.map +1 -1
  435. package/dist/dev/ui/slider/slider-root.js +5 -2
  436. package/dist/dev/ui/slider/slider-root.js.map +1 -1
  437. package/dist/dev/ui/slider/slider-thumbnail.d.ts +14 -0
  438. package/dist/dev/ui/slider/slider-thumbnail.d.ts.map +1 -0
  439. package/dist/dev/ui/slider/slider-thumbnail.js +20 -0
  440. package/dist/dev/ui/slider/slider-thumbnail.js.map +1 -0
  441. package/dist/dev/ui/thumbnail/thumbnail.d.ts.map +1 -1
  442. package/dist/dev/ui/thumbnail/thumbnail.js +3 -5
  443. package/dist/dev/ui/thumbnail/thumbnail.js.map +1 -1
  444. package/dist/dev/ui/time-slider/index.parts.d.ts +2 -2
  445. package/dist/dev/ui/time-slider/index.parts.js +2 -0
  446. package/dist/dev/ui/time-slider/index.parts.js.map +1 -1
  447. package/dist/dev/ui/time-slider/time-slider-root.js +5 -2
  448. package/dist/dev/ui/time-slider/time-slider-root.js.map +1 -1
  449. package/dist/dev/ui/tooltip/context.d.ts +16 -0
  450. package/dist/dev/ui/tooltip/context.d.ts.map +1 -0
  451. package/dist/dev/ui/tooltip/context.js +16 -0
  452. package/dist/dev/ui/tooltip/context.js.map +1 -0
  453. package/dist/dev/ui/tooltip/group-context.js +15 -0
  454. package/dist/dev/ui/tooltip/group-context.js.map +1 -0
  455. package/dist/dev/ui/tooltip/index.d.ts +3 -0
  456. package/dist/dev/ui/tooltip/index.js +4 -0
  457. package/dist/dev/ui/tooltip/index.parts.d.ts +13 -0
  458. package/dist/dev/ui/tooltip/index.parts.d.ts.map +1 -0
  459. package/dist/dev/ui/tooltip/index.parts.js +19 -0
  460. package/dist/dev/ui/tooltip/index.parts.js.map +1 -0
  461. package/dist/dev/ui/tooltip/tooltip-arrow.d.ts +15 -0
  462. package/dist/dev/ui/tooltip/tooltip-arrow.d.ts.map +1 -0
  463. package/dist/dev/ui/tooltip/tooltip-arrow.js +17 -0
  464. package/dist/dev/ui/tooltip/tooltip-arrow.js.map +1 -0
  465. package/dist/dev/ui/tooltip/tooltip-popup.d.ts +15 -0
  466. package/dist/dev/ui/tooltip/tooltip-popup.d.ts.map +1 -0
  467. package/dist/dev/ui/tooltip/tooltip-popup.js +97 -0
  468. package/dist/dev/ui/tooltip/tooltip-popup.js.map +1 -0
  469. package/dist/dev/ui/tooltip/tooltip-provider.d.ts +19 -0
  470. package/dist/dev/ui/tooltip/tooltip-provider.d.ts.map +1 -0
  471. package/dist/dev/ui/tooltip/tooltip-provider.js +28 -0
  472. package/dist/dev/ui/tooltip/tooltip-provider.js.map +1 -0
  473. package/dist/dev/ui/tooltip/tooltip-root.d.ts +30 -0
  474. package/dist/dev/ui/tooltip/tooltip-root.d.ts.map +1 -0
  475. package/dist/dev/ui/tooltip/tooltip-root.js +71 -0
  476. package/dist/dev/ui/tooltip/tooltip-root.js.map +1 -0
  477. package/dist/dev/ui/tooltip/tooltip-trigger.d.ts +15 -0
  478. package/dist/dev/ui/tooltip/tooltip-trigger.d.ts.map +1 -0
  479. package/dist/dev/ui/tooltip/tooltip-trigger.js +42 -0
  480. package/dist/dev/ui/tooltip/tooltip-trigger.js.map +1 -0
  481. package/dist/dev/ui/volume-slider/index.parts.d.ts +2 -2
  482. package/dist/dev/ui/volume-slider/index.parts.js +2 -0
  483. package/dist/dev/ui/volume-slider/index.parts.js.map +1 -1
  484. package/dist/dev/ui/volume-slider/volume-slider-root.js +9 -6
  485. package/dist/dev/ui/volume-slider/volume-slider-root.js.map +1 -1
  486. package/dist/dev/utils/use-destroy.js +33 -0
  487. package/dist/dev/utils/use-destroy.js.map +1 -0
  488. package/package.json +39 -11
  489. package/dist/default/skins/dist/default/video/default.tailwind.js +0 -90
  490. package/dist/default/skins/dist/default/video/default.tailwind.js.map +0 -1
  491. package/dist/default/skins/dist/default/video/minimal.tailwind.js +0 -86
  492. package/dist/default/skins/dist/default/video/minimal.tailwind.js.map +0 -1
  493. package/dist/default/ui/error-dialog/error-dialog.js +0 -54
  494. package/dist/default/ui/error-dialog/error-dialog.js.map +0 -1
  495. package/dist/default/ui/error-dialog/index.js +0 -3
  496. package/dist/dev/skins/dist/default/video/default.tailwind.js +0 -90
  497. package/dist/dev/skins/dist/default/video/default.tailwind.js.map +0 -1
  498. package/dist/dev/skins/dist/default/video/minimal.tailwind.js +0 -86
  499. package/dist/dev/skins/dist/default/video/minimal.tailwind.js.map +0 -1
  500. package/dist/dev/ui/error-dialog/error-dialog.d.ts +0 -35
  501. package/dist/dev/ui/error-dialog/error-dialog.d.ts.map +0 -1
  502. package/dist/dev/ui/error-dialog/error-dialog.js +0 -54
  503. package/dist/dev/ui/error-dialog/error-dialog.js.map +0 -1
  504. package/dist/dev/ui/error-dialog/index.d.ts +0 -2
  505. package/dist/dev/ui/error-dialog/index.js +0 -3
@@ -1,8 +1,10 @@
1
1
  import { __exportAll } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { SliderBuffer } from "./slider-buffer.js";
3
3
  import { SliderFill } from "./slider-fill.js";
4
+ import { SliderPreview } from "./slider-preview.js";
4
5
  import { SliderRoot } from "./slider-root.js";
5
6
  import { SliderThumb } from "./slider-thumb.js";
7
+ import { SliderThumbnail } from "./slider-thumbnail.js";
6
8
  import { SliderTrack } from "./slider-track.js";
7
9
  import { SliderValue } from "./slider-value.js";
8
10
 
@@ -10,8 +12,10 @@ import { SliderValue } from "./slider-value.js";
10
12
  var index_parts_exports = /* @__PURE__ */ __exportAll({
11
13
  Buffer: () => SliderBuffer,
12
14
  Fill: () => SliderFill,
15
+ Preview: () => SliderPreview,
13
16
  Root: () => SliderRoot,
14
17
  Thumb: () => SliderThumb,
18
+ Thumbnail: () => SliderThumbnail,
15
19
  Track: () => SliderTrack,
16
20
  Value: () => SliderValue
17
21
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.parts.js","names":[],"sources":["../../../../src/ui/slider/index.parts.ts"],"sourcesContent":["export { SliderBuffer as Buffer, type SliderBufferProps as BufferProps } from './slider-buffer';\nexport { SliderFill as Fill, type SliderFillProps as FillProps } from './slider-fill';\nexport { SliderRoot as Root, type SliderRootProps as RootProps } from './slider-root';\nexport { SliderThumb as Thumb, type SliderThumbProps as ThumbProps } from './slider-thumb';\nexport { SliderTrack as Track, type SliderTrackProps as TrackProps } from './slider-track';\nexport { SliderValue as Value, type SliderValueProps as ValueProps } from './slider-value';\n"],"mappings":""}
1
+ {"version":3,"file":"index.parts.js","names":[],"sources":["../../../../src/ui/slider/index.parts.ts"],"sourcesContent":["export { SliderBuffer as Buffer, type SliderBufferProps as BufferProps } from './slider-buffer';\nexport { SliderFill as Fill, type SliderFillProps as FillProps } from './slider-fill';\nexport { SliderPreview as Preview, type SliderPreviewProps as PreviewProps } from './slider-preview';\nexport { SliderRoot as Root, type SliderRootProps as RootProps } from './slider-root';\nexport { SliderThumb as Thumb, type SliderThumbProps as ThumbProps } from './slider-thumb';\nexport { SliderThumbnail as Thumbnail, type SliderThumbnailProps as ThumbnailProps } from './slider-thumbnail';\nexport { SliderTrack as Track, type SliderTrackProps as TrackProps } from './slider-track';\nexport { SliderValue as Value, type SliderValueProps as ValueProps } from './slider-value';\n"],"mappings":""}
@@ -0,0 +1,40 @@
1
+ 'use client';
2
+
3
+ import { renderElement } from "../../utils/use-render.js";
4
+ import { useSliderContext } from "./context.js";
5
+ import { getSliderPreviewStyle } from "@videojs/core/dom";
6
+ import { forwardRef, useEffect, useRef, useState } from "react";
7
+
8
+ //#region src/ui/slider/slider-preview.tsx
9
+ /** Positioning container for preview content that tracks the pointer along the slider. */
10
+ const SliderPreview = forwardRef(function SliderPreview(componentProps, forwardedRef) {
11
+ const { render, className, style, overflow = "clamp", ...elementProps } = componentProps;
12
+ const context = useSliderContext();
13
+ const { state } = context;
14
+ const measureRef = useRef(null);
15
+ const [width, setWidth] = useState(0);
16
+ useEffect(() => {
17
+ const el = measureRef.current;
18
+ if (!el) return;
19
+ const observer = new ResizeObserver(([entry]) => {
20
+ setWidth(entry.contentRect.width);
21
+ });
22
+ observer.observe(el);
23
+ return () => observer.disconnect();
24
+ }, []);
25
+ const positionStyle = getSliderPreviewStyle(width, overflow);
26
+ return renderElement("div", {
27
+ render,
28
+ className,
29
+ style
30
+ }, {
31
+ state,
32
+ stateAttrMap: context.stateAttrMap,
33
+ ref: [forwardedRef, measureRef],
34
+ props: [{ style: positionStyle }, elementProps]
35
+ });
36
+ });
37
+
38
+ //#endregion
39
+ export { SliderPreview };
40
+ //# sourceMappingURL=slider-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider-preview.js","names":[],"sources":["../../../../src/ui/slider/slider-preview.tsx"],"sourcesContent":["'use client';\n\nimport type { SliderState } from '@videojs/core';\nimport type { SliderPreviewOverflow } from '@videojs/core/dom';\nimport { getSliderPreviewStyle } from '@videojs/core/dom';\nimport type { ForwardedRef } from 'react';\nimport { forwardRef, useEffect, useRef, useState } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\nimport { useSliderContext } from './context';\n\nexport interface SliderPreviewProps extends UIComponentProps<'div', SliderState> {\n /** How the preview handles the slider boundaries. `'clamp'` keeps the preview within bounds, `'visible'` allows it to extend beyond the edges. */\n overflow?: SliderPreviewOverflow | undefined;\n}\n\n/** Positioning container for preview content that tracks the pointer along the slider. */\nexport const SliderPreview = forwardRef(function SliderPreview(\n componentProps: SliderPreviewProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const { render, className, style, overflow = 'clamp', ...elementProps } = componentProps;\n\n const context = useSliderContext();\n const { state } = context;\n\n const measureRef = useRef<HTMLDivElement>(null);\n const [width, setWidth] = useState(0);\n\n useEffect(() => {\n const el = measureRef.current;\n if (!el) return;\n\n const observer = new ResizeObserver(([entry]) => {\n setWidth(entry!.contentRect.width);\n });\n\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n const positionStyle = getSliderPreviewStyle(width, overflow);\n\n return renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap: context.stateAttrMap,\n ref: [forwardedRef, measureRef],\n props: [{ style: positionStyle }, elementProps],\n }\n );\n});\n\nexport namespace SliderPreview {\n export type Props = SliderPreviewProps;\n}\n"],"mappings":";;;;;;;;;AAkBA,MAAa,gBAAgB,WAAW,SAAS,cAC/C,gBACA,cACA;CACA,MAAM,EAAE,QAAQ,WAAW,OAAO,WAAW,SAAS,GAAG,iBAAiB;CAE1E,MAAM,UAAU,kBAAkB;CAClC,MAAM,EAAE,UAAU;CAElB,MAAM,aAAa,OAAuB,KAAK;CAC/C,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;AAErC,iBAAgB;EACd,MAAM,KAAK,WAAW;AACtB,MAAI,CAAC,GAAI;EAET,MAAM,WAAW,IAAI,gBAAgB,CAAC,WAAW;AAC/C,YAAS,MAAO,YAAY,MAAM;IAClC;AAEF,WAAS,QAAQ,GAAG;AACpB,eAAa,SAAS,YAAY;IACjC,EAAE,CAAC;CAEN,MAAM,gBAAgB,sBAAsB,OAAO,SAAS;AAE5D,QAAO,cACL,OACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE;EACA,cAAc,QAAQ;EACtB,KAAK,CAAC,cAAc,WAAW;EAC/B,OAAO,CAAC,EAAE,OAAO,eAAe,EAAE,aAAa;EAChD,CACF;EACD"}
@@ -22,7 +22,7 @@ const SliderRoot = forwardRef(function SliderRoot(componentProps, forwardedRef)
22
22
  disabled,
23
23
  thumbAlignment
24
24
  });
25
- const { state, cssVars, rootRef, thumbRef: sliderThumbRef, rootProps, thumbProps } = useSlider({
25
+ const { state, cssVars, rootRef, thumbRef: sliderThumbRef, rootProps, rootStyle, thumbProps } = useSlider({
26
26
  computeState: (input) => {
27
27
  core.setInput(input);
28
28
  return core.getSliderState(value);
@@ -58,7 +58,10 @@ const SliderRoot = forwardRef(function SliderRoot(componentProps, forwardedRef)
58
58
  stateAttrMap: SliderDataAttrs,
59
59
  ref: [forwardedRef, rootRef],
60
60
  props: [
61
- { style: cssVars },
61
+ { style: {
62
+ ...cssVars,
63
+ ...rootStyle
64
+ } },
62
65
  rootProps,
63
66
  elementProps
64
67
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"slider-root.js","names":[],"sources":["../../../../src/ui/slider/slider-root.tsx"],"sourcesContent":["'use client';\n\nimport { SliderCore, SliderDataAttrs } from '@videojs/core';\nimport { getSliderCSSVars } from '@videojs/core/dom';\nimport type { ForwardedRef } from 'react';\nimport { forwardRef, useState } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\nimport { useSlider } from '../hooks/use-slider';\nimport { SliderProvider } from './context';\n\nexport interface SliderRootProps extends UIComponentProps<'div', SliderCore.State>, SliderCore.Props {\n onValueChange?: ((value: number) => void) | undefined;\n onValueCommit?: ((value: number) => void) | undefined;\n onDragStart?: (() => void) | undefined;\n onDragEnd?: (() => void) | undefined;\n}\n\nexport const SliderRoot = forwardRef(function SliderRoot(\n componentProps: SliderRootProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const {\n render,\n className,\n style,\n label,\n min,\n max,\n step,\n largeStep,\n orientation,\n disabled,\n thumbAlignment,\n value = 0,\n onValueChange,\n onValueCommit,\n onDragStart,\n onDragEnd,\n ...elementProps\n } = componentProps;\n\n const [core] = useState(() => new SliderCore());\n core.setProps({ label, min, max, step, largeStep, orientation, disabled, thumbAlignment });\n\n const {\n state,\n cssVars,\n rootRef,\n thumbRef: sliderThumbRef,\n rootProps,\n thumbProps,\n } = useSlider({\n computeState: (input) => {\n core.setInput(input);\n return core.getSliderState(value);\n },\n getPercent: () => core.percentFromValue(value),\n getStepPercent: () => core.getStepPercent(),\n getLargeStepPercent: () => core.getLargeStepPercent(),\n orientation,\n disabled,\n adjustPercent: (rawPercent, thumbSize, trackSize) =>\n core.adjustPercentForAlignment(rawPercent, thumbSize, trackSize),\n getCSSVars: getSliderCSSVars,\n onValueChange: (percent) => onValueChange?.(core.valueFromPercent(percent)),\n onValueCommit: (percent) => onValueCommit?.(core.valueFromPercent(percent)),\n onDragStart,\n onDragEnd,\n });\n\n return (\n <SliderProvider\n value={{\n state,\n pointerValue: core.valueFromPercent(state.pointerPercent),\n thumbRef: sliderThumbRef,\n thumbProps,\n stateAttrMap: SliderDataAttrs,\n getAttrs: (sliderState) => core.getAttrs(sliderState),\n formatValue: undefined,\n }}\n >\n {renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap: SliderDataAttrs,\n ref: [forwardedRef, rootRef],\n props: [{ style: cssVars }, rootProps, elementProps],\n }\n )}\n </SliderProvider>\n );\n});\n\nexport namespace SliderRoot {\n export type Props = SliderRootProps;\n export type State = SliderCore.State;\n}\n"],"mappings":";;;;;;;;;;;AAmBA,MAAa,aAAa,WAAW,SAAS,WAC5C,gBACA,cACA;CACA,MAAM,EACJ,QACA,WACA,OACA,OACA,KACA,KACA,MACA,WACA,aACA,UACA,gBACA,QAAQ,GACR,eACA,eACA,aACA,WACA,GAAG,iBACD;CAEJ,MAAM,CAAC,QAAQ,eAAe,IAAI,YAAY,CAAC;AAC/C,MAAK,SAAS;EAAE;EAAO;EAAK;EAAK;EAAM;EAAW;EAAa;EAAU;EAAgB,CAAC;CAE1F,MAAM,EACJ,OACA,SACA,SACA,UAAU,gBACV,WACA,eACE,UAAU;EACZ,eAAe,UAAU;AACvB,QAAK,SAAS,MAAM;AACpB,UAAO,KAAK,eAAe,MAAM;;EAEnC,kBAAkB,KAAK,iBAAiB,MAAM;EAC9C,sBAAsB,KAAK,gBAAgB;EAC3C,2BAA2B,KAAK,qBAAqB;EACrD;EACA;EACA,gBAAgB,YAAY,WAAW,cACrC,KAAK,0BAA0B,YAAY,WAAW,UAAU;EAClE,YAAY;EACZ,gBAAgB,YAAY,gBAAgB,KAAK,iBAAiB,QAAQ,CAAC;EAC3E,gBAAgB,YAAY,gBAAgB,KAAK,iBAAiB,QAAQ,CAAC;EAC3E;EACA;EACD,CAAC;AAEF,QACE,oBAAC;EACC,OAAO;GACL;GACA,cAAc,KAAK,iBAAiB,MAAM,eAAe;GACzD,UAAU;GACV;GACA,cAAc;GACd,WAAW,gBAAgB,KAAK,SAAS,YAAY;GACrD,aAAa;GACd;YAEA,cACC,OACA;GAAE;GAAQ;GAAW;GAAO,EAC5B;GACE;GACA,cAAc;GACd,KAAK,CAAC,cAAc,QAAQ;GAC5B,OAAO;IAAC,EAAE,OAAO,SAAS;IAAE;IAAW;IAAa;GACrD,CACF;GACc;EAEnB"}
1
+ {"version":3,"file":"slider-root.js","names":[],"sources":["../../../../src/ui/slider/slider-root.tsx"],"sourcesContent":["'use client';\n\nimport { SliderCore, SliderDataAttrs } from '@videojs/core';\nimport { getSliderCSSVars } from '@videojs/core/dom';\nimport type { ForwardedRef } from 'react';\nimport { forwardRef, useState } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\nimport { useSlider } from '../hooks/use-slider';\nimport { SliderProvider } from './context';\n\nexport interface SliderRootProps extends UIComponentProps<'div', SliderCore.State>, SliderCore.Props {\n onValueChange?: ((value: number) => void) | undefined;\n onValueCommit?: ((value: number) => void) | undefined;\n onDragStart?: (() => void) | undefined;\n onDragEnd?: (() => void) | undefined;\n}\n\nexport const SliderRoot = forwardRef(function SliderRoot(\n componentProps: SliderRootProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const {\n render,\n className,\n style,\n label,\n min,\n max,\n step,\n largeStep,\n orientation,\n disabled,\n thumbAlignment,\n value = 0,\n onValueChange,\n onValueCommit,\n onDragStart,\n onDragEnd,\n ...elementProps\n } = componentProps;\n\n const [core] = useState(() => new SliderCore());\n core.setProps({ label, min, max, step, largeStep, orientation, disabled, thumbAlignment });\n\n const {\n state,\n cssVars,\n rootRef,\n thumbRef: sliderThumbRef,\n rootProps,\n rootStyle,\n thumbProps,\n } = useSlider({\n computeState: (input) => {\n core.setInput(input);\n return core.getSliderState(value);\n },\n getPercent: () => core.percentFromValue(value),\n getStepPercent: () => core.getStepPercent(),\n getLargeStepPercent: () => core.getLargeStepPercent(),\n orientation,\n disabled,\n adjustPercent: (rawPercent, thumbSize, trackSize) =>\n core.adjustPercentForAlignment(rawPercent, thumbSize, trackSize),\n getCSSVars: getSliderCSSVars,\n onValueChange: (percent) => onValueChange?.(core.valueFromPercent(percent)),\n onValueCommit: (percent) => onValueCommit?.(core.valueFromPercent(percent)),\n onDragStart,\n onDragEnd,\n });\n\n return (\n <SliderProvider\n value={{\n state,\n pointerValue: core.valueFromPercent(state.pointerPercent),\n thumbRef: sliderThumbRef,\n thumbProps,\n stateAttrMap: SliderDataAttrs,\n getAttrs: (sliderState) => core.getAttrs(sliderState),\n formatValue: undefined,\n }}\n >\n {renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap: SliderDataAttrs,\n ref: [forwardedRef, rootRef],\n props: [{ style: { ...cssVars, ...rootStyle } }, rootProps, elementProps],\n }\n )}\n </SliderProvider>\n );\n});\n\nexport namespace SliderRoot {\n export type Props = SliderRootProps;\n export type State = SliderCore.State;\n}\n"],"mappings":";;;;;;;;;;;AAmBA,MAAa,aAAa,WAAW,SAAS,WAC5C,gBACA,cACA;CACA,MAAM,EACJ,QACA,WACA,OACA,OACA,KACA,KACA,MACA,WACA,aACA,UACA,gBACA,QAAQ,GACR,eACA,eACA,aACA,WACA,GAAG,iBACD;CAEJ,MAAM,CAAC,QAAQ,eAAe,IAAI,YAAY,CAAC;AAC/C,MAAK,SAAS;EAAE;EAAO;EAAK;EAAK;EAAM;EAAW;EAAa;EAAU;EAAgB,CAAC;CAE1F,MAAM,EACJ,OACA,SACA,SACA,UAAU,gBACV,WACA,WACA,eACE,UAAU;EACZ,eAAe,UAAU;AACvB,QAAK,SAAS,MAAM;AACpB,UAAO,KAAK,eAAe,MAAM;;EAEnC,kBAAkB,KAAK,iBAAiB,MAAM;EAC9C,sBAAsB,KAAK,gBAAgB;EAC3C,2BAA2B,KAAK,qBAAqB;EACrD;EACA;EACA,gBAAgB,YAAY,WAAW,cACrC,KAAK,0BAA0B,YAAY,WAAW,UAAU;EAClE,YAAY;EACZ,gBAAgB,YAAY,gBAAgB,KAAK,iBAAiB,QAAQ,CAAC;EAC3E,gBAAgB,YAAY,gBAAgB,KAAK,iBAAiB,QAAQ,CAAC;EAC3E;EACA;EACD,CAAC;AAEF,QACE,oBAAC;EACC,OAAO;GACL;GACA,cAAc,KAAK,iBAAiB,MAAM,eAAe;GACzD,UAAU;GACV;GACA,cAAc;GACd,WAAW,gBAAgB,KAAK,SAAS,YAAY;GACrD,aAAa;GACd;YAEA,cACC,OACA;GAAE;GAAQ;GAAW;GAAO,EAC5B;GACE;GACA,cAAc;GACd,KAAK,CAAC,cAAc,QAAQ;GAC5B,OAAO;IAAC,EAAE,OAAO;KAAE,GAAG;KAAS,GAAG;KAAW,EAAE;IAAE;IAAW;IAAa;GAC1E,CACF;GACc;EAEnB"}
@@ -0,0 +1,20 @@
1
+ 'use client';
2
+
3
+ import { useSliderContext } from "./context.js";
4
+ import { Thumbnail } from "../thumbnail/thumbnail.js";
5
+ import { forwardRef } from "react";
6
+ import { jsx } from "react/jsx-runtime";
7
+
8
+ //#region src/ui/slider/slider-thumbnail.tsx
9
+ const SliderThumbnail = forwardRef(function SliderThumbnail(componentProps, forwardedRef) {
10
+ const { pointerValue } = useSliderContext();
11
+ return /* @__PURE__ */ jsx(Thumbnail, {
12
+ ref: forwardedRef,
13
+ ...componentProps,
14
+ time: pointerValue
15
+ });
16
+ });
17
+
18
+ //#endregion
19
+ export { SliderThumbnail };
20
+ //# sourceMappingURL=slider-thumbnail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slider-thumbnail.js","names":[],"sources":["../../../../src/ui/slider/slider-thumbnail.tsx"],"sourcesContent":["'use client';\n\nimport type { ThumbnailCore } from '@videojs/core';\nimport { forwardRef } from 'react';\n\nimport { Thumbnail, type ThumbnailProps } from '../thumbnail/thumbnail';\nimport { useSliderContext } from './context';\n\nexport interface SliderThumbnailProps extends Omit<ThumbnailProps, 'time'> {}\n\nexport const SliderThumbnail = forwardRef<HTMLDivElement, SliderThumbnailProps>(\n function SliderThumbnail(componentProps, forwardedRef) {\n const { pointerValue } = useSliderContext();\n return <Thumbnail ref={forwardedRef} {...componentProps} time={pointerValue} />;\n }\n);\n\nexport namespace SliderThumbnail {\n export type Props = SliderThumbnailProps;\n export type State = ThumbnailCore.State;\n}\n"],"mappings":";;;;;;;;AAUA,MAAa,kBAAkB,WAC7B,SAAS,gBAAgB,gBAAgB,cAAc;CACrD,MAAM,EAAE,iBAAiB,kBAAkB;AAC3C,QAAO,oBAAC;EAAU,KAAK;EAAc,GAAI;EAAgB,MAAM;GAAgB;EAElF"}
@@ -1,9 +1,10 @@
1
1
  'use client';
2
2
 
3
3
  import { useOptionalPlayer } from "../../player/context.js";
4
+ import { useDestroy } from "../../utils/use-destroy.js";
4
5
  import { renderElement } from "../../utils/use-render.js";
5
6
  import { createThumbnail, selectTextTrack } from "@videojs/core/dom";
6
- import { forwardRef, useEffect, useMemo, useRef, useState } from "react";
7
+ import { forwardRef, useMemo, useRef, useState } from "react";
7
8
  import { jsx } from "react/jsx-runtime";
8
9
  import { ThumbnailCore, ThumbnailDataAttrs, mapCuesToThumbnails } from "@videojs/core";
9
10
 
@@ -20,10 +21,7 @@ const Thumbnail = forwardRef(function Thumbnail(componentProps, forwardedRef) {
20
21
  getImg: () => imgRef.current,
21
22
  onStateChange: () => setRenderToken((n) => n + 1)
22
23
  }));
23
- useEffect(() => {
24
- handle.connect();
25
- return () => handle.destroy();
26
- }, [handle]);
24
+ useDestroy(handle, () => handle.connect());
27
25
  const thumbnails = useMemo(() => {
28
26
  if (externalThumbnails && externalThumbnails.length > 0) return externalThumbnails;
29
27
  if (!textTrack?.thumbnailCues.length) return [];
@@ -1 +1 @@
1
- {"version":3,"file":"thumbnail.js","names":[],"sources":["../../../../src/ui/thumbnail/thumbnail.tsx"],"sourcesContent":["'use client';\n\nimport {\n mapCuesToThumbnails,\n ThumbnailCore,\n ThumbnailDataAttrs,\n type ThumbnailFetchPriority,\n type ThumbnailImage,\n} from '@videojs/core';\nimport { createThumbnail, selectTextTrack } from '@videojs/core/dom';\nimport type { CSSProperties } from 'react';\nimport { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { useOptionalPlayer } from '../../player/context';\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\n\nexport interface ThumbnailProps extends UIComponentProps<'div', ThumbnailCore.State>, ThumbnailCore.Props {\n /** Pre-parsed thumbnail images — bypasses the automatic `<track>` detection. */\n thumbnails?: ThumbnailImage[] | undefined;\n}\n\nexport const Thumbnail = forwardRef<HTMLDivElement, ThumbnailProps>(function Thumbnail(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n time = 0,\n thumbnails: externalThumbnails,\n crossOrigin,\n loading,\n fetchPriority,\n ...elementProps\n } = componentProps;\n\n const [core] = useState(() => new ThumbnailCore());\n const divRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n const textTrack = useOptionalPlayer(selectTextTrack);\n\n // Force re-render when the handle's state changes (img load/error, resize).\n const [, setRenderToken] = useState(0);\n\n const [handle] = useState(() =>\n createThumbnail({\n getContainer: () => divRef.current,\n getImg: () => imgRef.current,\n onStateChange: () => setRenderToken((n) => n + 1),\n })\n );\n\n useEffect(() => {\n handle.connect();\n return () => handle.destroy();\n }, [handle]);\n\n // Resolve thumbnails: external prop takes priority over auto <track> path.\n const thumbnails = useMemo(() => {\n if (externalThumbnails && externalThumbnails.length > 0) return externalThumbnails;\n if (!textTrack?.thumbnailCues.length) return [];\n return mapCuesToThumbnails(textTrack.thumbnailCues, textTrack.thumbnailTrackSrc ?? undefined);\n }, [externalThumbnails, textTrack]);\n\n const thumbnail = useMemo(() => core.findActiveThumbnail(thumbnails, time), [core, thumbnails, time]);\n\n // Track src changes via the handle.\n handle.updateSrc(thumbnail?.url);\n\n const state = core.getState(handle.loading, handle.error, thumbnail);\n\n // Compute styles declaratively from resize result.\n let containerStyle: CSSProperties = { overflow: 'hidden' };\n let imgStyle: CSSProperties | undefined;\n\n if (thumbnail && handle.naturalWidth && handle.naturalHeight) {\n const constraints = handle.readConstraints();\n const result = core.resize(thumbnail, handle.naturalWidth, handle.naturalHeight, constraints);\n\n if (result) {\n containerStyle = {\n overflow: 'hidden',\n width: result.containerWidth,\n height: result.containerHeight,\n };\n imgStyle = {\n width: result.imageWidth,\n height: result.imageHeight,\n maxWidth: 'none',\n transform:\n result.offsetX || result.offsetY ? `translate(-${result.offsetX}px, -${result.offsetY}px)` : undefined,\n };\n }\n }\n\n return renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap: ThumbnailDataAttrs,\n ref: [forwardedRef, divRef],\n props: [\n core.getAttrs(state),\n { style: containerStyle },\n elementProps,\n {\n children: (\n <img\n ref={imgRef}\n alt=\"\"\n aria-hidden=\"true\"\n decoding=\"async\"\n src={thumbnail?.url}\n crossOrigin={crossOrigin === '' || crossOrigin === null ? undefined : crossOrigin}\n loading={loading}\n style={imgStyle}\n // React's types omit `| undefined` from fetchPriority — cast to satisfy exactOptionalPropertyTypes.\n fetchPriority={fetchPriority as ThumbnailFetchPriority}\n />\n ),\n },\n ],\n }\n );\n});\n\nexport namespace Thumbnail {\n export type Props = ThumbnailProps;\n export type State = ThumbnailCore.State;\n}\n"],"mappings":";;;;;;;;;;AAsBA,MAAa,YAAY,WAA2C,SAAS,UAAU,gBAAgB,cAAc;CACnH,MAAM,EACJ,QACA,WACA,OACA,OAAO,GACP,YAAY,oBACZ,aACA,SACA,eACA,GAAG,iBACD;CAEJ,MAAM,CAAC,QAAQ,eAAe,IAAI,eAAe,CAAC;CAClD,MAAM,SAAS,OAAuB,KAAK;CAC3C,MAAM,SAAS,OAAyB,KAAK;CAC7C,MAAM,YAAY,kBAAkB,gBAAgB;CAGpD,MAAM,GAAG,kBAAkB,SAAS,EAAE;CAEtC,MAAM,CAAC,UAAU,eACf,gBAAgB;EACd,oBAAoB,OAAO;EAC3B,cAAc,OAAO;EACrB,qBAAqB,gBAAgB,MAAM,IAAI,EAAE;EAClD,CAAC,CACH;AAED,iBAAgB;AACd,SAAO,SAAS;AAChB,eAAa,OAAO,SAAS;IAC5B,CAAC,OAAO,CAAC;CAGZ,MAAM,aAAa,cAAc;AAC/B,MAAI,sBAAsB,mBAAmB,SAAS,EAAG,QAAO;AAChE,MAAI,CAAC,WAAW,cAAc,OAAQ,QAAO,EAAE;AAC/C,SAAO,oBAAoB,UAAU,eAAe,UAAU,qBAAqB,OAAU;IAC5F,CAAC,oBAAoB,UAAU,CAAC;CAEnC,MAAM,YAAY,cAAc,KAAK,oBAAoB,YAAY,KAAK,EAAE;EAAC;EAAM;EAAY;EAAK,CAAC;AAGrG,QAAO,UAAU,WAAW,IAAI;CAEhC,MAAM,QAAQ,KAAK,SAAS,OAAO,SAAS,OAAO,OAAO,UAAU;CAGpE,IAAI,iBAAgC,EAAE,UAAU,UAAU;CAC1D,IAAI;AAEJ,KAAI,aAAa,OAAO,gBAAgB,OAAO,eAAe;EAC5D,MAAM,cAAc,OAAO,iBAAiB;EAC5C,MAAM,SAAS,KAAK,OAAO,WAAW,OAAO,cAAc,OAAO,eAAe,YAAY;AAE7F,MAAI,QAAQ;AACV,oBAAiB;IACf,UAAU;IACV,OAAO,OAAO;IACd,QAAQ,OAAO;IAChB;AACD,cAAW;IACT,OAAO,OAAO;IACd,QAAQ,OAAO;IACf,UAAU;IACV,WACE,OAAO,WAAW,OAAO,UAAU,cAAc,OAAO,QAAQ,OAAO,OAAO,QAAQ,OAAO;IAChG;;;AAIL,QAAO,cACL,OACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE;EACA,cAAc;EACd,KAAK,CAAC,cAAc,OAAO;EAC3B,OAAO;GACL,KAAK,SAAS,MAAM;GACpB,EAAE,OAAO,gBAAgB;GACzB;GACA,EACE,UACE,oBAAC;IACC,KAAK;IACL,KAAI;IACJ,eAAY;IACZ,UAAS;IACT,KAAK,WAAW;IAChB,aAAa,gBAAgB,MAAM,gBAAgB,OAAO,SAAY;IAC7D;IACT,OAAO;IAEQ;KACf,EAEL;GACF;EACF,CACF;EACD"}
1
+ {"version":3,"file":"thumbnail.js","names":[],"sources":["../../../../src/ui/thumbnail/thumbnail.tsx"],"sourcesContent":["'use client';\n\nimport {\n mapCuesToThumbnails,\n ThumbnailCore,\n ThumbnailDataAttrs,\n type ThumbnailFetchPriority,\n type ThumbnailImage,\n} from '@videojs/core';\nimport { createThumbnail, selectTextTrack } from '@videojs/core/dom';\nimport type { CSSProperties } from 'react';\nimport { forwardRef, useMemo, useRef, useState } from 'react';\n\nimport { useOptionalPlayer } from '../../player/context';\nimport type { UIComponentProps } from '../../utils/types';\nimport { useDestroy } from '../../utils/use-destroy';\nimport { renderElement } from '../../utils/use-render';\n\nexport interface ThumbnailProps extends UIComponentProps<'div', ThumbnailCore.State>, ThumbnailCore.Props {\n /** Pre-parsed thumbnail images — bypasses the automatic `<track>` detection. */\n thumbnails?: ThumbnailImage[] | undefined;\n}\n\nexport const Thumbnail = forwardRef<HTMLDivElement, ThumbnailProps>(function Thumbnail(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n time = 0,\n thumbnails: externalThumbnails,\n crossOrigin,\n loading,\n fetchPriority,\n ...elementProps\n } = componentProps;\n\n const [core] = useState(() => new ThumbnailCore());\n const divRef = useRef<HTMLDivElement>(null);\n const imgRef = useRef<HTMLImageElement>(null);\n const textTrack = useOptionalPlayer(selectTextTrack);\n\n // Force re-render when the handle's state changes (img load/error, resize).\n const [, setRenderToken] = useState(0);\n\n const [handle] = useState(() =>\n createThumbnail({\n getContainer: () => divRef.current,\n getImg: () => imgRef.current,\n onStateChange: () => setRenderToken((n) => n + 1),\n })\n );\n\n useDestroy(handle, () => handle.connect());\n\n // Resolve thumbnails: external prop takes priority over auto <track> path.\n const thumbnails = useMemo(() => {\n if (externalThumbnails && externalThumbnails.length > 0) return externalThumbnails;\n if (!textTrack?.thumbnailCues.length) return [];\n return mapCuesToThumbnails(textTrack.thumbnailCues, textTrack.thumbnailTrackSrc ?? undefined);\n }, [externalThumbnails, textTrack]);\n\n const thumbnail = useMemo(() => core.findActiveThumbnail(thumbnails, time), [core, thumbnails, time]);\n\n // Track src changes via the handle.\n handle.updateSrc(thumbnail?.url);\n\n const state = core.getState(handle.loading, handle.error, thumbnail);\n\n // Compute styles declaratively from resize result.\n let containerStyle: CSSProperties = { overflow: 'hidden' };\n let imgStyle: CSSProperties | undefined;\n\n if (thumbnail && handle.naturalWidth && handle.naturalHeight) {\n const constraints = handle.readConstraints();\n const result = core.resize(thumbnail, handle.naturalWidth, handle.naturalHeight, constraints);\n\n if (result) {\n containerStyle = {\n overflow: 'hidden',\n width: result.containerWidth,\n height: result.containerHeight,\n };\n imgStyle = {\n width: result.imageWidth,\n height: result.imageHeight,\n maxWidth: 'none',\n transform:\n result.offsetX || result.offsetY ? `translate(-${result.offsetX}px, -${result.offsetY}px)` : undefined,\n };\n }\n }\n\n return renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap: ThumbnailDataAttrs,\n ref: [forwardedRef, divRef],\n props: [\n core.getAttrs(state),\n { style: containerStyle },\n elementProps,\n {\n children: (\n <img\n ref={imgRef}\n alt=\"\"\n aria-hidden=\"true\"\n decoding=\"async\"\n src={thumbnail?.url}\n crossOrigin={crossOrigin === '' || crossOrigin === null ? undefined : crossOrigin}\n loading={loading}\n style={imgStyle}\n // React's types omit `| undefined` from fetchPriority — cast to satisfy exactOptionalPropertyTypes.\n fetchPriority={fetchPriority as ThumbnailFetchPriority}\n />\n ),\n },\n ],\n }\n );\n});\n\nexport namespace Thumbnail {\n export type Props = ThumbnailProps;\n export type State = ThumbnailCore.State;\n}\n"],"mappings":";;;;;;;;;;;AAuBA,MAAa,YAAY,WAA2C,SAAS,UAAU,gBAAgB,cAAc;CACnH,MAAM,EACJ,QACA,WACA,OACA,OAAO,GACP,YAAY,oBACZ,aACA,SACA,eACA,GAAG,iBACD;CAEJ,MAAM,CAAC,QAAQ,eAAe,IAAI,eAAe,CAAC;CAClD,MAAM,SAAS,OAAuB,KAAK;CAC3C,MAAM,SAAS,OAAyB,KAAK;CAC7C,MAAM,YAAY,kBAAkB,gBAAgB;CAGpD,MAAM,GAAG,kBAAkB,SAAS,EAAE;CAEtC,MAAM,CAAC,UAAU,eACf,gBAAgB;EACd,oBAAoB,OAAO;EAC3B,cAAc,OAAO;EACrB,qBAAqB,gBAAgB,MAAM,IAAI,EAAE;EAClD,CAAC,CACH;AAED,YAAW,cAAc,OAAO,SAAS,CAAC;CAG1C,MAAM,aAAa,cAAc;AAC/B,MAAI,sBAAsB,mBAAmB,SAAS,EAAG,QAAO;AAChE,MAAI,CAAC,WAAW,cAAc,OAAQ,QAAO,EAAE;AAC/C,SAAO,oBAAoB,UAAU,eAAe,UAAU,qBAAqB,OAAU;IAC5F,CAAC,oBAAoB,UAAU,CAAC;CAEnC,MAAM,YAAY,cAAc,KAAK,oBAAoB,YAAY,KAAK,EAAE;EAAC;EAAM;EAAY;EAAK,CAAC;AAGrG,QAAO,UAAU,WAAW,IAAI;CAEhC,MAAM,QAAQ,KAAK,SAAS,OAAO,SAAS,OAAO,OAAO,UAAU;CAGpE,IAAI,iBAAgC,EAAE,UAAU,UAAU;CAC1D,IAAI;AAEJ,KAAI,aAAa,OAAO,gBAAgB,OAAO,eAAe;EAC5D,MAAM,cAAc,OAAO,iBAAiB;EAC5C,MAAM,SAAS,KAAK,OAAO,WAAW,OAAO,cAAc,OAAO,eAAe,YAAY;AAE7F,MAAI,QAAQ;AACV,oBAAiB;IACf,UAAU;IACV,OAAO,OAAO;IACd,QAAQ,OAAO;IAChB;AACD,cAAW;IACT,OAAO,OAAO;IACd,QAAQ,OAAO;IACf,UAAU;IACV,WACE,OAAO,WAAW,OAAO,UAAU,cAAc,OAAO,QAAQ,OAAO,OAAO,QAAQ,OAAO;IAChG;;;AAIL,QAAO,cACL,OACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE;EACA,cAAc;EACd,KAAK,CAAC,cAAc,OAAO;EAC3B,OAAO;GACL,KAAK,SAAS,MAAM;GACpB,EAAE,OAAO,gBAAgB;GACzB;GACA,EACE,UACE,oBAAC;IACC,KAAK;IACL,KAAI;IACJ,eAAY;IACZ,UAAS;IACT,KAAK,WAAW;IAChB,aAAa,gBAAgB,MAAM,gBAAgB,OAAO,SAAY;IAC7D;IACT,OAAO;IAEQ;KACf,EAEL;GACF;EACF,CACF;EACD"}
@@ -1,6 +1,7 @@
1
1
  import { __exportAll } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { SliderBuffer } from "../slider/slider-buffer.js";
3
3
  import { SliderFill } from "../slider/slider-fill.js";
4
+ import { SliderPreview } from "../slider/slider-preview.js";
4
5
  import { SliderThumb } from "../slider/slider-thumb.js";
5
6
  import { SliderTrack } from "../slider/slider-track.js";
6
7
  import { SliderValue } from "../slider/slider-value.js";
@@ -10,6 +11,7 @@ import { TimeSliderRoot } from "./time-slider-root.js";
10
11
  var index_parts_exports = /* @__PURE__ */ __exportAll({
11
12
  Buffer: () => SliderBuffer,
12
13
  Fill: () => SliderFill,
14
+ Preview: () => SliderPreview,
13
15
  Root: () => TimeSliderRoot,
14
16
  Thumb: () => SliderThumb,
15
17
  Track: () => SliderTrack,
@@ -1 +1 @@
1
- {"version":3,"file":"index.parts.js","names":[],"sources":["../../../../src/ui/time-slider/index.parts.ts"],"sourcesContent":["export {\n Buffer,\n type BufferProps,\n Fill,\n type FillProps,\n Thumb,\n type ThumbProps,\n Track,\n type TrackProps,\n Value,\n type ValueProps,\n} from '../slider/index.parts';\nexport { TimeSliderRoot as Root, type TimeSliderRootProps as RootProps } from './time-slider-root';\n"],"mappings":""}
1
+ {"version":3,"file":"index.parts.js","names":[],"sources":["../../../../src/ui/time-slider/index.parts.ts"],"sourcesContent":["export {\n Buffer,\n type BufferProps,\n Fill,\n type FillProps,\n Preview,\n type PreviewProps,\n Thumb,\n type ThumbProps,\n Track,\n type TrackProps,\n Value,\n type ValueProps,\n} from '../slider/index.parts';\nexport { TimeSliderRoot as Root, type TimeSliderRootProps as RootProps } from './time-slider-root';\n"],"mappings":""}
@@ -31,7 +31,7 @@ const TimeSliderRoot = forwardRef(function TimeSliderRoot(componentProps, forwar
31
31
  ...buffer
32
32
  } : null);
33
33
  const duration = time?.duration ?? 0;
34
- const { state, cssVars, rootRef, thumbRef, rootProps, thumbProps } = useSlider({
34
+ const { state, cssVars, rootRef, thumbRef, rootProps, rootStyle, thumbProps } = useSlider({
35
35
  computeState: (input) => {
36
36
  core.setInput(input);
37
37
  if (!time || !buffer) core.setMedia({
@@ -83,7 +83,10 @@ const TimeSliderRoot = forwardRef(function TimeSliderRoot(componentProps, forwar
83
83
  stateAttrMap: TimeSliderDataAttrs,
84
84
  ref: [forwardedRef, rootRef],
85
85
  props: [
86
- { style: cssVars },
86
+ { style: {
87
+ ...cssVars,
88
+ ...rootStyle
89
+ } },
87
90
  rootProps,
88
91
  elementProps
89
92
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"time-slider-root.js","names":[],"sources":["../../../../src/ui/time-slider/time-slider-root.tsx"],"sourcesContent":["'use client';\n\nimport { TimeSliderCore, TimeSliderDataAttrs } from '@videojs/core';\nimport { getTimeSliderCSSVars, logMissingFeature, selectBuffer, selectTime } from '@videojs/core/dom';\nimport { formatTime } from '@videojs/utils/time';\nimport { forwardRef, useState } from 'react';\n\nimport { usePlayer } from '../../player/context';\nimport type { UIComponentProps } from '../../utils/types';\nimport { useLatestRef } from '../../utils/use-latest-ref';\nimport { renderElement } from '../../utils/use-render';\nimport { useSlider } from '../hooks/use-slider';\nimport { SliderProvider } from '../slider/context';\n\nconst noopSeek = (): Promise<number> => Promise.resolve(0);\n\nexport interface TimeSliderRootProps extends UIComponentProps<'div', TimeSliderCore.State>, TimeSliderCore.Props {\n onDragStart?: (() => void) | undefined;\n onDragEnd?: (() => void) | undefined;\n}\n\nexport const TimeSliderRoot = forwardRef<HTMLDivElement, TimeSliderRootProps>(\n function TimeSliderRoot(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n label,\n commitThrottle = TimeSliderCore.defaultProps.commitThrottle,\n step = TimeSliderCore.defaultProps.step,\n largeStep = TimeSliderCore.defaultProps.largeStep,\n orientation,\n disabled,\n thumbAlignment,\n onDragStart,\n onDragEnd,\n ...elementProps\n } = componentProps;\n\n const time = usePlayer(selectTime);\n const buffer = usePlayer(selectBuffer);\n\n const [core] = useState(() => new TimeSliderCore());\n core.setProps({ label, step, largeStep, orientation, disabled, thumbAlignment });\n\n // Keep a ref to the latest media state for callbacks that fire outside the render cycle.\n const mediaRef = useLatestRef(time && buffer ? { ...time, ...buffer } : null);\n\n const duration = time?.duration ?? 0;\n\n const { state, cssVars, rootRef, thumbRef, rootProps, thumbProps } = useSlider<TimeSliderCore.State>({\n computeState: (input) => {\n core.setInput(input);\n if (!time || !buffer) {\n core.setMedia({\n currentTime: 0,\n duration: 0,\n seeking: false,\n seek: noopSeek,\n buffered: [],\n seekable: [],\n });\n } else {\n core.setMedia({ ...time, ...buffer });\n }\n\n return core.getState();\n },\n getPercent: () => (duration > 0 ? ((time?.currentTime ?? 0) / duration) * 100 : 0),\n getStepPercent: () => core.getStepPercent(),\n getLargeStepPercent: () => core.getLargeStepPercent(),\n orientation,\n disabled,\n commitThrottle,\n adjustPercent: (rawPercent, thumbSize, trackSize) =>\n core.adjustPercentForAlignment(rawPercent, thumbSize, trackSize),\n getCSSVars: getTimeSliderCSSVars,\n onValueCommit: (percent) => {\n const media = mediaRef.current;\n if (media) media.seek(core.valueFromPercent(percent));\n },\n onDragStart,\n onDragEnd,\n });\n\n if (!time) {\n if (__DEV__) logMissingFeature('TimeSlider', 'time');\n return null;\n }\n\n return (\n <SliderProvider\n value={{\n state,\n pointerValue: core.valueFromPercent(state.pointerPercent),\n thumbRef,\n thumbProps,\n stateAttrMap: TimeSliderDataAttrs,\n getAttrs: (sliderState) => core.getAttrs(sliderState as TimeSliderCore.State),\n formatValue: (value) => formatTime(value, duration),\n }}\n >\n {renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap: TimeSliderDataAttrs,\n ref: [forwardedRef, rootRef],\n props: [{ style: cssVars }, rootProps, elementProps],\n }\n )}\n </SliderProvider>\n );\n }\n);\n\nexport namespace TimeSliderRoot {\n export type Props = TimeSliderRootProps;\n export type State = TimeSliderCore.State;\n}\n"],"mappings":";;;;;;;;;;;;;;AAcA,MAAM,iBAAkC,QAAQ,QAAQ,EAAE;AAO1D,MAAa,iBAAiB,WAC5B,SAAS,eAAe,gBAAgB,cAAc;CACpD,MAAM,EACJ,QACA,WACA,OACA,OACA,iBAAiB,eAAe,aAAa,gBAC7C,OAAO,eAAe,aAAa,MACnC,YAAY,eAAe,aAAa,WACxC,aACA,UACA,gBACA,aACA,WACA,GAAG,iBACD;CAEJ,MAAM,OAAO,UAAU,WAAW;CAClC,MAAM,SAAS,UAAU,aAAa;CAEtC,MAAM,CAAC,QAAQ,eAAe,IAAI,gBAAgB,CAAC;AACnD,MAAK,SAAS;EAAE;EAAO;EAAM;EAAW;EAAa;EAAU;EAAgB,CAAC;CAGhF,MAAM,WAAW,aAAa,QAAQ,SAAS;EAAE,GAAG;EAAM,GAAG;EAAQ,GAAG,KAAK;CAE7E,MAAM,WAAW,MAAM,YAAY;CAEnC,MAAM,EAAE,OAAO,SAAS,SAAS,UAAU,WAAW,eAAe,UAAgC;EACnG,eAAe,UAAU;AACvB,QAAK,SAAS,MAAM;AACpB,OAAI,CAAC,QAAQ,CAAC,OACZ,MAAK,SAAS;IACZ,aAAa;IACb,UAAU;IACV,SAAS;IACT,MAAM;IACN,UAAU,EAAE;IACZ,UAAU,EAAE;IACb,CAAC;OAEF,MAAK,SAAS;IAAE,GAAG;IAAM,GAAG;IAAQ,CAAC;AAGvC,UAAO,KAAK,UAAU;;EAExB,kBAAmB,WAAW,KAAM,MAAM,eAAe,KAAK,WAAY,MAAM;EAChF,sBAAsB,KAAK,gBAAgB;EAC3C,2BAA2B,KAAK,qBAAqB;EACrD;EACA;EACA;EACA,gBAAgB,YAAY,WAAW,cACrC,KAAK,0BAA0B,YAAY,WAAW,UAAU;EAClE,YAAY;EACZ,gBAAgB,YAAY;GAC1B,MAAM,QAAQ,SAAS;AACvB,OAAI,MAAO,OAAM,KAAK,KAAK,iBAAiB,QAAQ,CAAC;;EAEvD;EACA;EACD,CAAC;AAEF,KAAI,CAAC,KAEH,QAAO;AAGT,QACE,oBAAC;EACC,OAAO;GACL;GACA,cAAc,KAAK,iBAAiB,MAAM,eAAe;GACzD;GACA;GACA,cAAc;GACd,WAAW,gBAAgB,KAAK,SAAS,YAAoC;GAC7E,cAAc,UAAU,WAAW,OAAO,SAAS;GACpD;YAEA,cACC,OACA;GAAE;GAAQ;GAAW;GAAO,EAC5B;GACE;GACA,cAAc;GACd,KAAK,CAAC,cAAc,QAAQ;GAC5B,OAAO;IAAC,EAAE,OAAO,SAAS;IAAE;IAAW;IAAa;GACrD,CACF;GACc;EAGtB"}
1
+ {"version":3,"file":"time-slider-root.js","names":[],"sources":["../../../../src/ui/time-slider/time-slider-root.tsx"],"sourcesContent":["'use client';\n\nimport { TimeSliderCore, TimeSliderDataAttrs } from '@videojs/core';\nimport { getTimeSliderCSSVars, logMissingFeature, selectBuffer, selectTime } from '@videojs/core/dom';\nimport { formatTime } from '@videojs/utils/time';\nimport { forwardRef, useState } from 'react';\n\nimport { usePlayer } from '../../player/context';\nimport type { UIComponentProps } from '../../utils/types';\nimport { useLatestRef } from '../../utils/use-latest-ref';\nimport { renderElement } from '../../utils/use-render';\nimport { useSlider } from '../hooks/use-slider';\nimport { SliderProvider } from '../slider/context';\n\nconst noopSeek = (): Promise<number> => Promise.resolve(0);\n\nexport interface TimeSliderRootProps extends UIComponentProps<'div', TimeSliderCore.State>, TimeSliderCore.Props {\n onDragStart?: (() => void) | undefined;\n onDragEnd?: (() => void) | undefined;\n}\n\nexport const TimeSliderRoot = forwardRef<HTMLDivElement, TimeSliderRootProps>(\n function TimeSliderRoot(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n label,\n commitThrottle = TimeSliderCore.defaultProps.commitThrottle,\n step = TimeSliderCore.defaultProps.step,\n largeStep = TimeSliderCore.defaultProps.largeStep,\n orientation,\n disabled,\n thumbAlignment,\n onDragStart,\n onDragEnd,\n ...elementProps\n } = componentProps;\n\n const time = usePlayer(selectTime);\n const buffer = usePlayer(selectBuffer);\n\n const [core] = useState(() => new TimeSliderCore());\n core.setProps({ label, step, largeStep, orientation, disabled, thumbAlignment });\n\n // Keep a ref to the latest media state for callbacks that fire outside the render cycle.\n const mediaRef = useLatestRef(time && buffer ? { ...time, ...buffer } : null);\n\n const duration = time?.duration ?? 0;\n\n const { state, cssVars, rootRef, thumbRef, rootProps, rootStyle, thumbProps } = useSlider<TimeSliderCore.State>({\n computeState: (input) => {\n core.setInput(input);\n if (!time || !buffer) {\n core.setMedia({\n currentTime: 0,\n duration: 0,\n seeking: false,\n seek: noopSeek,\n buffered: [],\n seekable: [],\n });\n } else {\n core.setMedia({ ...time, ...buffer });\n }\n\n return core.getState();\n },\n getPercent: () => (duration > 0 ? ((time?.currentTime ?? 0) / duration) * 100 : 0),\n getStepPercent: () => core.getStepPercent(),\n getLargeStepPercent: () => core.getLargeStepPercent(),\n orientation,\n disabled,\n commitThrottle,\n adjustPercent: (rawPercent, thumbSize, trackSize) =>\n core.adjustPercentForAlignment(rawPercent, thumbSize, trackSize),\n getCSSVars: getTimeSliderCSSVars,\n onValueCommit: (percent) => {\n const media = mediaRef.current;\n if (media) media.seek(core.valueFromPercent(percent));\n },\n onDragStart,\n onDragEnd,\n });\n\n if (!time) {\n if (__DEV__) logMissingFeature('TimeSlider', 'time');\n return null;\n }\n\n return (\n <SliderProvider\n value={{\n state,\n pointerValue: core.valueFromPercent(state.pointerPercent),\n thumbRef,\n thumbProps,\n stateAttrMap: TimeSliderDataAttrs,\n getAttrs: (sliderState) => core.getAttrs(sliderState as TimeSliderCore.State),\n formatValue: (value) => formatTime(value, duration),\n }}\n >\n {renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap: TimeSliderDataAttrs,\n ref: [forwardedRef, rootRef],\n props: [{ style: { ...cssVars, ...rootStyle } }, rootProps, elementProps],\n }\n )}\n </SliderProvider>\n );\n }\n);\n\nexport namespace TimeSliderRoot {\n export type Props = TimeSliderRootProps;\n export type State = TimeSliderCore.State;\n}\n"],"mappings":";;;;;;;;;;;;;;AAcA,MAAM,iBAAkC,QAAQ,QAAQ,EAAE;AAO1D,MAAa,iBAAiB,WAC5B,SAAS,eAAe,gBAAgB,cAAc;CACpD,MAAM,EACJ,QACA,WACA,OACA,OACA,iBAAiB,eAAe,aAAa,gBAC7C,OAAO,eAAe,aAAa,MACnC,YAAY,eAAe,aAAa,WACxC,aACA,UACA,gBACA,aACA,WACA,GAAG,iBACD;CAEJ,MAAM,OAAO,UAAU,WAAW;CAClC,MAAM,SAAS,UAAU,aAAa;CAEtC,MAAM,CAAC,QAAQ,eAAe,IAAI,gBAAgB,CAAC;AACnD,MAAK,SAAS;EAAE;EAAO;EAAM;EAAW;EAAa;EAAU;EAAgB,CAAC;CAGhF,MAAM,WAAW,aAAa,QAAQ,SAAS;EAAE,GAAG;EAAM,GAAG;EAAQ,GAAG,KAAK;CAE7E,MAAM,WAAW,MAAM,YAAY;CAEnC,MAAM,EAAE,OAAO,SAAS,SAAS,UAAU,WAAW,WAAW,eAAe,UAAgC;EAC9G,eAAe,UAAU;AACvB,QAAK,SAAS,MAAM;AACpB,OAAI,CAAC,QAAQ,CAAC,OACZ,MAAK,SAAS;IACZ,aAAa;IACb,UAAU;IACV,SAAS;IACT,MAAM;IACN,UAAU,EAAE;IACZ,UAAU,EAAE;IACb,CAAC;OAEF,MAAK,SAAS;IAAE,GAAG;IAAM,GAAG;IAAQ,CAAC;AAGvC,UAAO,KAAK,UAAU;;EAExB,kBAAmB,WAAW,KAAM,MAAM,eAAe,KAAK,WAAY,MAAM;EAChF,sBAAsB,KAAK,gBAAgB;EAC3C,2BAA2B,KAAK,qBAAqB;EACrD;EACA;EACA;EACA,gBAAgB,YAAY,WAAW,cACrC,KAAK,0BAA0B,YAAY,WAAW,UAAU;EAClE,YAAY;EACZ,gBAAgB,YAAY;GAC1B,MAAM,QAAQ,SAAS;AACvB,OAAI,MAAO,OAAM,KAAK,KAAK,iBAAiB,QAAQ,CAAC;;EAEvD;EACA;EACD,CAAC;AAEF,KAAI,CAAC,KAEH,QAAO;AAGT,QACE,oBAAC;EACC,OAAO;GACL;GACA,cAAc,KAAK,iBAAiB,MAAM,eAAe;GACzD;GACA;GACA,cAAc;GACd,WAAW,gBAAgB,KAAK,SAAS,YAAoC;GAC7E,cAAc,UAAU,WAAW,OAAO,SAAS;GACpD;YAEA,cACC,OACA;GAAE;GAAQ;GAAW;GAAO,EAC5B;GACE;GACA,cAAc;GACd,KAAK,CAAC,cAAc,QAAQ;GAC5B,OAAO;IAAC,EAAE,OAAO;KAAE,GAAG;KAAS,GAAG;KAAW,EAAE;IAAE;IAAW;IAAa;GAC1E,CACF;GACc;EAGtB"}
@@ -0,0 +1,16 @@
1
+ 'use client';
2
+
3
+ import { createContext, useContext } from "react";
4
+
5
+ //#region src/ui/tooltip/context.tsx
6
+ const TooltipContext = createContext(null);
7
+ const TooltipContextProvider = TooltipContext.Provider;
8
+ function useTooltipContext() {
9
+ const ctx = useContext(TooltipContext);
10
+ if (!ctx) throw new Error("Tooltip compound components must be used within a Tooltip.Root");
11
+ return ctx;
12
+ }
13
+
14
+ //#endregion
15
+ export { TooltipContextProvider, useTooltipContext };
16
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../../src/ui/tooltip/context.tsx"],"sourcesContent":["'use client';\n\nimport type { StateAttrMap, TooltipCore } from '@videojs/core';\nimport type { TooltipApi } from '@videojs/core/dom';\nimport { createContext, useContext } from 'react';\n\nexport interface TooltipContextValue {\n core: TooltipCore;\n tooltip: TooltipApi;\n state: TooltipCore.State;\n stateAttrMap: StateAttrMap<TooltipCore.State>;\n anchorName: string;\n popupId: string;\n}\n\nconst TooltipContext = createContext<TooltipContextValue | null>(null);\n\nexport const TooltipContextProvider = TooltipContext.Provider;\n\nexport function useTooltipContext(): TooltipContextValue {\n const ctx = useContext(TooltipContext);\n if (!ctx) throw new Error('Tooltip compound components must be used within a Tooltip.Root');\n return ctx;\n}\n"],"mappings":";;;;;AAeA,MAAM,iBAAiB,cAA0C,KAAK;AAEtE,MAAa,yBAAyB,eAAe;AAErD,SAAgB,oBAAyC;CACvD,MAAM,MAAM,WAAW,eAAe;AACtC,KAAI,CAAC,IAAK,OAAM,IAAI,MAAM,iEAAiE;AAC3F,QAAO"}
@@ -0,0 +1,15 @@
1
+ 'use client';
2
+
3
+ import { createContext, useContext } from "react";
4
+
5
+ //#region src/ui/tooltip/group-context.tsx
6
+ const TooltipGroupContext = createContext(null);
7
+ const TooltipGroupContextProvider = TooltipGroupContext.Provider;
8
+ /** Returns the nearest `TooltipGroupCore`, or `undefined` when used outside a `Tooltip.Provider`. */
9
+ function useTooltipGroup() {
10
+ return useContext(TooltipGroupContext)?.group;
11
+ }
12
+
13
+ //#endregion
14
+ export { TooltipGroupContextProvider, useTooltipGroup };
15
+ //# sourceMappingURL=group-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-context.js","names":[],"sources":["../../../../src/ui/tooltip/group-context.tsx"],"sourcesContent":["'use client';\n\nimport type { TooltipGroupCore } from '@videojs/core';\nimport { createContext, useContext } from 'react';\n\ninterface TooltipGroupContextValue {\n group: TooltipGroupCore;\n}\n\nconst TooltipGroupContext = createContext<TooltipGroupContextValue | null>(null);\n\nexport const TooltipGroupContextProvider = TooltipGroupContext.Provider;\n\n/** Returns the nearest `TooltipGroupCore`, or `undefined` when used outside a `Tooltip.Provider`. */\nexport function useTooltipGroup(): TooltipGroupCore | undefined {\n return useContext(TooltipGroupContext)?.group;\n}\n"],"mappings":";;;;;AASA,MAAM,sBAAsB,cAA+C,KAAK;AAEhF,MAAa,8BAA8B,oBAAoB;;AAG/D,SAAgB,kBAAgD;AAC9D,QAAO,WAAW,oBAAoB,EAAE"}
@@ -0,0 +1,4 @@
1
+ import { useTooltipContext } from "./context.js";
2
+ import { index_parts_exports } from "./index.parts.js";
3
+
4
+ export { index_parts_exports as Tooltip, useTooltipContext };
@@ -0,0 +1,19 @@
1
+ import { __exportAll } from "../../_virtual/_rolldown/runtime.js";
2
+ import { TooltipArrow } from "./tooltip-arrow.js";
3
+ import { TooltipPopup } from "./tooltip-popup.js";
4
+ import { TooltipProvider } from "./tooltip-provider.js";
5
+ import { TooltipRoot } from "./tooltip-root.js";
6
+ import { TooltipTrigger } from "./tooltip-trigger.js";
7
+
8
+ //#region src/ui/tooltip/index.parts.ts
9
+ var index_parts_exports = /* @__PURE__ */ __exportAll({
10
+ Arrow: () => TooltipArrow,
11
+ Popup: () => TooltipPopup,
12
+ Provider: () => TooltipProvider,
13
+ Root: () => TooltipRoot,
14
+ Trigger: () => TooltipTrigger
15
+ });
16
+
17
+ //#endregion
18
+ export { index_parts_exports };
19
+ //# sourceMappingURL=index.parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.parts.js","names":[],"sources":["../../../../src/ui/tooltip/index.parts.ts"],"sourcesContent":["export { TooltipArrow as Arrow, type TooltipArrowProps as ArrowProps } from './tooltip-arrow';\nexport { TooltipPopup as Popup, type TooltipPopupProps as PopupProps } from './tooltip-popup';\nexport { TooltipProvider as Provider, type TooltipProviderProps as ProviderProps } from './tooltip-provider';\nexport { TooltipRoot as Root, type TooltipRootProps as RootProps } from './tooltip-root';\nexport { TooltipTrigger as Trigger, type TooltipTriggerProps as TriggerProps } from './tooltip-trigger';\n"],"mappings":""}
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+
3
+ import { createContextPart } from "../create-context-part.js";
4
+ import { useTooltipContext } from "./context.js";
5
+
6
+ //#region src/ui/tooltip/tooltip-arrow.tsx
7
+ /** Decorative arrow pointing from the tooltip toward the trigger. Hidden from assistive technology. */
8
+ const TooltipArrow = createContextPart({
9
+ displayName: "TooltipArrow",
10
+ tag: "div",
11
+ useContext: useTooltipContext,
12
+ staticProps: { "aria-hidden": "true" }
13
+ });
14
+
15
+ //#endregion
16
+ export { TooltipArrow };
17
+ //# sourceMappingURL=tooltip-arrow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip-arrow.js","names":[],"sources":["../../../../src/ui/tooltip/tooltip-arrow.tsx"],"sourcesContent":["'use client';\n\nimport type { TooltipState } from '@videojs/core';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { createContextPart } from '../create-context-part';\nimport { useTooltipContext } from './context';\n\nexport interface TooltipArrowProps extends UIComponentProps<'div', TooltipState> {}\n\n/** Decorative arrow pointing from the tooltip toward the trigger. Hidden from assistive technology. */\nexport const TooltipArrow = createContextPart<TooltipArrowProps, TooltipState>({\n displayName: 'TooltipArrow',\n tag: 'div',\n useContext: useTooltipContext,\n staticProps: { 'aria-hidden': 'true' as const },\n});\n\nexport namespace TooltipArrow {\n export type Props = TooltipArrowProps;\n export type State = TooltipState;\n}\n"],"mappings":";;;;;;;AAWA,MAAa,eAAe,kBAAmD;CAC7E,aAAa;CACb,KAAK;CACL,YAAY;CACZ,aAAa,EAAE,eAAe,QAAiB;CAChD,CAAC"}
@@ -0,0 +1,97 @@
1
+ 'use client';
2
+
3
+ import { useComposedRefs } from "../../utils/use-composed-refs.js";
4
+ import { renderElement } from "../../utils/use-render.js";
5
+ import { useTooltipContext } from "./context.js";
6
+ import { getAnchorPositionStyle, resolveOffsets } from "@videojs/core/dom";
7
+ import { forwardRef, useCallback, useLayoutEffect, useMemo, useRef, useState } from "react";
8
+ import { TooltipCSSVars } from "@videojs/core";
9
+ import { supportsAnchorPositioning } from "@videojs/utils/dom";
10
+
11
+ //#region src/ui/tooltip/tooltip-popup.tsx
12
+ const POPUP_RESET = {
13
+ position: "fixed",
14
+ inset: "auto",
15
+ margin: 0
16
+ };
17
+ /** Container for the tooltip content. Positioned relative to the trigger using CSS anchor positioning with a JavaScript fallback. */
18
+ const TooltipPopup = forwardRef(function TooltipPopup({ render, className, style, ...elementProps }, forwardedRef) {
19
+ const { core, tooltip, state, stateAttrMap, anchorName, popupId } = useTooltipContext();
20
+ const internalRef = useRef(null);
21
+ const composedRef = useComposedRefs(forwardedRef, useCallback((el) => {
22
+ tooltip.setPopupElement(el);
23
+ if (el && supportsAnchorPositioning()) el.style.setProperty("position-anchor", `--${anchorName}`);
24
+ }, [tooltip, anchorName]), internalRef);
25
+ const posOpts = useMemo(() => ({
26
+ side: state.side,
27
+ align: state.align
28
+ }), [state.side, state.align]);
29
+ const anchorStyle = useMemo(() => {
30
+ if (!supportsAnchorPositioning()) return null;
31
+ const { positionAnchor: _, ...rest } = getAnchorPositionStyle(anchorName, posOpts, void 0, void 0, void 0, void 0, TooltipCSSVars);
32
+ return rest;
33
+ }, [anchorName, posOpts]);
34
+ const [manualStyle, setManualStyle] = useState(null);
35
+ useLayoutEffect(() => {
36
+ if (supportsAnchorPositioning()) return;
37
+ if (!state.open) {
38
+ setManualStyle(null);
39
+ return;
40
+ }
41
+ function measure() {
42
+ const triggerEl = tooltip.triggerElement;
43
+ const popupEl = internalRef.current;
44
+ if (!triggerEl || !popupEl) return;
45
+ setManualStyle(getAnchorPositionStyle(anchorName, posOpts, triggerEl.getBoundingClientRect(), popupEl.getBoundingClientRect(), document.documentElement.getBoundingClientRect(), resolveOffsets(popupEl, TooltipCSSVars), TooltipCSSVars));
46
+ }
47
+ measure();
48
+ let rafId = 0;
49
+ function reposition() {
50
+ cancelAnimationFrame(rafId);
51
+ rafId = requestAnimationFrame(measure);
52
+ }
53
+ window.addEventListener("scroll", reposition, {
54
+ capture: true,
55
+ passive: true
56
+ });
57
+ window.addEventListener("resize", reposition);
58
+ return () => {
59
+ cancelAnimationFrame(rafId);
60
+ window.removeEventListener("scroll", reposition, true);
61
+ window.removeEventListener("resize", reposition);
62
+ };
63
+ }, [
64
+ state.open,
65
+ anchorName,
66
+ posOpts,
67
+ tooltip
68
+ ]);
69
+ const positioningStyle = anchorStyle ?? manualStyle ?? POPUP_RESET;
70
+ if (!state.open) return null;
71
+ const { onFocusOut, ...restPopupProps } = tooltip.popupProps;
72
+ return renderElement("div", {
73
+ render,
74
+ className,
75
+ style
76
+ }, {
77
+ state,
78
+ stateAttrMap,
79
+ ref: composedRef,
80
+ props: [
81
+ {
82
+ id: popupId,
83
+ style: positioningStyle,
84
+ ...core.getPopupAttrs(state)
85
+ },
86
+ {
87
+ ...restPopupProps,
88
+ onBlur: onFocusOut
89
+ },
90
+ elementProps
91
+ ]
92
+ });
93
+ });
94
+
95
+ //#endregion
96
+ export { TooltipPopup };
97
+ //# sourceMappingURL=tooltip-popup.js.map
@@ -0,0 +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 { getAnchorPositionStyle, resolveOffsets } 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 } = 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 (supportsAnchorPositioning()) return;\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 popupRect = popupEl.getBoundingClientRect();\n const boundaryRect = document.documentElement.getBoundingClientRect();\n const offsets = resolveOffsets(popupEl, TooltipCSSVars);\n\n setManualStyle(\n getAnchorPositionStyle(\n anchorName,\n posOpts,\n triggerRect,\n popupRect,\n boundaryRect,\n offsets,\n TooltipCSSVars\n ) as CSSProperties\n );\n }\n\n measure();\n\n // Recompute on scroll/resize so the tooltip tracks its trigger.\n let rafId = 0;\n function reposition(): void {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(measure);\n }\n\n window.addEventListener('scroll', reposition, { capture: true, passive: true });\n window.addEventListener('resize', reposition);\n\n return () => {\n cancelAnimationFrame(rafId);\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }, [state.open, anchorName, posOpts, tooltip]);\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 = anchorStyle ?? manualStyle ?? 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 { ...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":";;;;;;;;;;;AAgBA,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,YAAY,mBAAmB;CACvF,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,QACA,QACA,QACA,QACA,eACD;AACD,SAAO;IACN,CAAC,YAAY,QAAQ,CAAC;CAGzB,MAAM,CAAC,aAAa,kBAAkB,SAA+B,KAAK;AAE1E,uBAAsB;AACpB,MAAI,2BAA2B,CAAE;AACjC,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;AAO5B,kBACE,uBACE,YACA,SARgB,UAAU,uBAAuB,EACnC,QAAQ,uBAAuB,EAC5B,SAAS,gBAAgB,uBAAuB,EACrD,eAAe,SAAS,eAAe,EAUnD,eACD,CACF;;AAGH,WAAS;EAGT,IAAI,QAAQ;EACZ,SAAS,aAAmB;AAC1B,wBAAqB,MAAM;AAC3B,WAAQ,sBAAsB,QAAQ;;AAGxC,SAAO,iBAAiB,UAAU,YAAY;GAAE,SAAS;GAAM,SAAS;GAAM,CAAC;AAC/E,SAAO,iBAAiB,UAAU,WAAW;AAE7C,eAAa;AACX,wBAAqB,MAAM;AAC3B,UAAO,oBAAoB,UAAU,YAAY,KAAK;AACtD,UAAO,oBAAoB,UAAU,WAAW;;IAEjD;EAAC,MAAM;EAAM;EAAY;EAAS;EAAQ,CAAC;CAI9C,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;GACD;IAAE,GAAG;IAAgB,QAAQ;IAAY;GACzC;GACD;EACF,CACF;EACD"}
@@ -0,0 +1,28 @@
1
+ 'use client';
2
+
3
+ import { TooltipGroupContextProvider } from "./group-context.js";
4
+ import { useState } from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import { TooltipGroupCore } from "@videojs/core";
7
+
8
+ //#region src/ui/tooltip/tooltip-provider.tsx
9
+ function TooltipProvider({ delay, closeDelay, timeout, children }) {
10
+ const [group] = useState(() => new TooltipGroupCore({
11
+ delay,
12
+ closeDelay,
13
+ timeout
14
+ }));
15
+ group.setProps({
16
+ delay,
17
+ closeDelay,
18
+ timeout
19
+ });
20
+ return /* @__PURE__ */ jsx(TooltipGroupContextProvider, {
21
+ value: { group },
22
+ children
23
+ });
24
+ }
25
+
26
+ //#endregion
27
+ export { TooltipProvider };
28
+ //# sourceMappingURL=tooltip-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip-provider.js","names":[],"sources":["../../../../src/ui/tooltip/tooltip-provider.tsx"],"sourcesContent":["'use client';\n\nimport { TooltipGroupCore, type TooltipGroupProps } from '@videojs/core';\nimport type { ReactNode } from 'react';\nimport { useState } from 'react';\n\nimport { TooltipGroupContextProvider } from './group-context';\n\nexport interface TooltipProviderProps extends TooltipGroupProps {\n children?: ReactNode;\n}\n\nexport function TooltipProvider({ delay, closeDelay, timeout, children }: TooltipProviderProps): ReactNode {\n const [group] = useState(() => new TooltipGroupCore({ delay, closeDelay, timeout }));\n group.setProps({ delay, closeDelay, timeout });\n\n return <TooltipGroupContextProvider value={{ group }}>{children}</TooltipGroupContextProvider>;\n}\n\nexport namespace TooltipProvider {\n export type Props = TooltipProviderProps;\n}\n"],"mappings":";;;;;;;;AAYA,SAAgB,gBAAgB,EAAE,OAAO,YAAY,SAAS,YAA6C;CACzG,MAAM,CAAC,SAAS,eAAe,IAAI,iBAAiB;EAAE;EAAO;EAAY;EAAS,CAAC,CAAC;AACpF,OAAM,SAAS;EAAE;EAAO;EAAY;EAAS,CAAC;AAE9C,QAAO,oBAAC;EAA4B,OAAO,EAAE,OAAO;EAAG;GAAuC"}
@@ -0,0 +1,71 @@
1
+ 'use client';
2
+
3
+ import { useLatestRef } from "../../utils/use-latest-ref.js";
4
+ import { useSafeId } from "../../utils/use-safe-id.js";
5
+ import { TooltipContextProvider } from "./context.js";
6
+ import { useTooltipGroup } from "./group-context.js";
7
+ import { createTooltip, createTransition } from "@videojs/core/dom";
8
+ import { useSnapshot } from "@videojs/store/react";
9
+ import { useEffect, useState } from "react";
10
+ import { jsx } from "react/jsx-runtime";
11
+ import { TooltipCore, TooltipDataAttrs } from "@videojs/core";
12
+
13
+ //#region src/ui/tooltip/tooltip-root.tsx
14
+ function TooltipRoot({ open: controlledOpen, defaultOpen = TooltipCore.defaultProps.defaultOpen, onOpenChange: onOpenChangeProp, onOpenChangeComplete: onOpenChangeCompleteProp, delay = TooltipCore.defaultProps.delay, closeDelay = TooltipCore.defaultProps.closeDelay, disableHoverablePopup = TooltipCore.defaultProps.disableHoverablePopup, disabled = TooltipCore.defaultProps.disabled, children, ...coreProps }) {
15
+ const [core] = useState(() => new TooltipCore(coreProps));
16
+ core.setProps(coreProps);
17
+ const isControlled = controlledOpen !== void 0;
18
+ const groupFromContext = useTooltipGroup();
19
+ const onOpenChangeRef = useLatestRef(onOpenChangeProp);
20
+ const onOpenChangeCompleteRef = useLatestRef(onOpenChangeCompleteProp);
21
+ const delayRef = useLatestRef(delay);
22
+ const closeDelayRef = useLatestRef(closeDelay);
23
+ const disableHoverablePopupRef = useLatestRef(disableHoverablePopup);
24
+ const disabledRef = useLatestRef(disabled);
25
+ const groupRef = useLatestRef(groupFromContext);
26
+ const [tooltip] = useState(() => {
27
+ const instance = createTooltip({
28
+ transition: createTransition(),
29
+ onOpenChange: (nextOpen, details) => {
30
+ onOpenChangeRef.current?.(nextOpen, details);
31
+ },
32
+ onOpenChangeComplete: (nextOpen) => {
33
+ onOpenChangeCompleteRef.current?.(nextOpen);
34
+ },
35
+ delay: () => delayRef.current,
36
+ closeDelay: () => closeDelayRef.current,
37
+ disableHoverablePopup: () => disableHoverablePopupRef.current,
38
+ disabled: () => disabledRef.current,
39
+ group: () => groupRef.current
40
+ });
41
+ if (!isControlled && defaultOpen) instance.open();
42
+ return instance;
43
+ });
44
+ const anchorName = useSafeId();
45
+ const popupId = useSafeId("tooltip-");
46
+ useEffect(() => {
47
+ if (controlledOpen === void 0) return;
48
+ const { active: inputOpen } = tooltip.input.current;
49
+ if (controlledOpen === inputOpen) return;
50
+ if (controlledOpen) tooltip.open();
51
+ else tooltip.close();
52
+ }, [controlledOpen, tooltip]);
53
+ useEffect(() => () => tooltip.destroy(), [tooltip]);
54
+ const input = useSnapshot(tooltip.input);
55
+ core.setInput(input);
56
+ return /* @__PURE__ */ jsx(TooltipContextProvider, {
57
+ value: {
58
+ core,
59
+ tooltip,
60
+ state: core.getState(),
61
+ stateAttrMap: TooltipDataAttrs,
62
+ anchorName,
63
+ popupId
64
+ },
65
+ children
66
+ });
67
+ }
68
+
69
+ //#endregion
70
+ export { TooltipRoot };
71
+ //# sourceMappingURL=tooltip-root.js.map
@@ -0,0 +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 { createTooltip, createTransition, type TooltipChangeDetails } from '@videojs/core/dom';\nimport { useSnapshot } from '@videojs/store/react';\nimport type { ReactNode } from 'react';\nimport { useEffect, useState } from 'react';\n\nimport { useLatestRef } from '../../utils/use-latest-ref';\nimport { useSafeId } from '../../utils/use-safe-id';\nimport { TooltipContextProvider } from './context';\nimport { useTooltipGroup } from './group-context';\n\nexport interface TooltipRootProps extends CoreTooltipProps {\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 children,\n ...coreProps\n}: TooltipRootProps): ReactNode {\n const [core] = useState(() => new TooltipCore(coreProps));\n core.setProps(coreProps);\n\n const isControlled = controlledOpen !== undefined;\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 anchorName = useSafeId();\n const popupId = useSafeId('tooltip-');\n\n // Sync controlled open prop -> internal input state.\n useEffect(() => {\n if (controlledOpen === undefined) 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 // Cleanup on unmount\n useEffect(() => () => tooltip.destroy(), [tooltip]);\n\n const input = useSnapshot(tooltip.input);\n core.setInput(input);\n const state = core.getState();\n\n return (\n <TooltipContextProvider value={{ core, tooltip, state, stateAttrMap: TooltipDataAttrs, anchorName, popupId }}>\n {children}\n </TooltipContextProvider>\n );\n}\n\nexport namespace TooltipRoot {\n export type Props = TooltipRootProps;\n}\n"],"mappings":";;;;;;;;;;;;;AAqBA,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,UACA,GAAG,aAC2B;CAC9B,MAAM,CAAC,QAAQ,eAAe,IAAI,YAAY,UAAU,CAAC;AACzD,MAAK,SAAS,UAAU;CAExB,MAAM,eAAe,mBAAmB;CAExC,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,aAAa,WAAW;CAC9B,MAAM,UAAU,UAAU,WAAW;AAGrC,iBAAgB;AACd,MAAI,mBAAmB,OAAW;EAElC,MAAM,EAAE,QAAQ,cAAc,QAAQ,MAAM;AAC5C,MAAI,mBAAmB,UAAW;AAElC,MAAI,eACF,SAAQ,MAAM;MAEd,SAAQ,OAAO;IAEhB,CAAC,gBAAgB,QAAQ,CAAC;AAG7B,uBAAsB,QAAQ,SAAS,EAAE,CAAC,QAAQ,CAAC;CAEnD,MAAM,QAAQ,YAAY,QAAQ,MAAM;AACxC,MAAK,SAAS,MAAM;AAGpB,QACE,oBAAC;EAAuB,OAAO;GAAE;GAAM;GAAS,OAHpC,KAAK,UAAU;GAG4B,cAAc;GAAkB;GAAY;GAAS;EACzG;GACsB"}