@hanifhan1f/vidstack-react 1.12.13

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 (284) hide show
  1. package/.templates/sandbox/document.css +27 -0
  2. package/.templates/sandbox/favicon-32x32.png +0 -0
  3. package/.templates/sandbox/index.html +21 -0
  4. package/.templates/sandbox/main.tsx +12 -0
  5. package/.templates/sandbox/player.css +39 -0
  6. package/.templates/sandbox/player.tsx +121 -0
  7. package/.templates/sandbox/tracks.ts +23 -0
  8. package/LICENSE +21 -0
  9. package/README.md +23 -0
  10. package/analyze.config.ts +7 -0
  11. package/build/build-icons.js +62 -0
  12. package/npm/analyze.json.d.ts +7 -0
  13. package/package.json +162 -0
  14. package/rollup.config.ts +256 -0
  15. package/src/components/announcer.tsx +47 -0
  16. package/src/components/layouts/default/audio-layout.tsx +231 -0
  17. package/src/components/layouts/default/context.ts +28 -0
  18. package/src/components/layouts/default/hooks.ts +13 -0
  19. package/src/components/layouts/default/icons.tsx +225 -0
  20. package/src/components/layouts/default/index.ts +11 -0
  21. package/src/components/layouts/default/media-layout.tsx +259 -0
  22. package/src/components/layouts/default/slots.tsx +98 -0
  23. package/src/components/layouts/default/ui/announcer.tsx +22 -0
  24. package/src/components/layouts/default/ui/buttons.tsx +301 -0
  25. package/src/components/layouts/default/ui/captions.tsx +16 -0
  26. package/src/components/layouts/default/ui/controls.tsx +12 -0
  27. package/src/components/layouts/default/ui/keyboard-display.tsx +132 -0
  28. package/src/components/layouts/default/ui/menus/accessibility-menu.tsx +100 -0
  29. package/src/components/layouts/default/ui/menus/audio-menu.tsx +167 -0
  30. package/src/components/layouts/default/ui/menus/captions-menu.tsx +61 -0
  31. package/src/components/layouts/default/ui/menus/chapters-menu.tsx +132 -0
  32. package/src/components/layouts/default/ui/menus/font-menu.tsx +331 -0
  33. package/src/components/layouts/default/ui/menus/items/menu-checkbox.tsx +72 -0
  34. package/src/components/layouts/default/ui/menus/items/menu-items.tsx +135 -0
  35. package/src/components/layouts/default/ui/menus/items/menu-slider.tsx +92 -0
  36. package/src/components/layouts/default/ui/menus/playback-menu.tsx +232 -0
  37. package/src/components/layouts/default/ui/menus/settings-menu.tsx +114 -0
  38. package/src/components/layouts/default/ui/menus/utils.ts +12 -0
  39. package/src/components/layouts/default/ui/sliders.tsx +136 -0
  40. package/src/components/layouts/default/ui/time.tsx +73 -0
  41. package/src/components/layouts/default/ui/title.tsx +24 -0
  42. package/src/components/layouts/default/ui/tooltip.tsx +27 -0
  43. package/src/components/layouts/default/ui.ts +8 -0
  44. package/src/components/layouts/default/video-layout.tsx +344 -0
  45. package/src/components/layouts/plyr/context.ts +26 -0
  46. package/src/components/layouts/plyr/icons/plyr-airplay.js +1 -0
  47. package/src/components/layouts/plyr/icons/plyr-captions-off.js +1 -0
  48. package/src/components/layouts/plyr/icons/plyr-captions-on.js +1 -0
  49. package/src/components/layouts/plyr/icons/plyr-download.js +1 -0
  50. package/src/components/layouts/plyr/icons/plyr-enter-fullscreen.js +1 -0
  51. package/src/components/layouts/plyr/icons/plyr-exit-fullscreen.js +1 -0
  52. package/src/components/layouts/plyr/icons/plyr-fast-forward.js +1 -0
  53. package/src/components/layouts/plyr/icons/plyr-muted.js +1 -0
  54. package/src/components/layouts/plyr/icons/plyr-pause.js +1 -0
  55. package/src/components/layouts/plyr/icons/plyr-pip.js +1 -0
  56. package/src/components/layouts/plyr/icons/plyr-play.js +1 -0
  57. package/src/components/layouts/plyr/icons/plyr-restart.js +1 -0
  58. package/src/components/layouts/plyr/icons/plyr-rewind.js +1 -0
  59. package/src/components/layouts/plyr/icons/plyr-settings.js +1 -0
  60. package/src/components/layouts/plyr/icons/plyr-volume.js +1 -0
  61. package/src/components/layouts/plyr/icons.tsx +71 -0
  62. package/src/components/layouts/plyr/index.ts +11 -0
  63. package/src/components/layouts/plyr/layout.tsx +1024 -0
  64. package/src/components/layouts/plyr/props.ts +104 -0
  65. package/src/components/layouts/plyr/slots.tsx +52 -0
  66. package/src/components/layouts/remotion-ui.ts +13 -0
  67. package/src/components/layouts/utils.ts +17 -0
  68. package/src/components/player-callbacks.ts +67 -0
  69. package/src/components/player.tsx +67 -0
  70. package/src/components/primitives/instances.ts +92 -0
  71. package/src/components/primitives/nodes.tsx +58 -0
  72. package/src/components/primitives/slot.tsx +132 -0
  73. package/src/components/provider.tsx +187 -0
  74. package/src/components/text-track.tsx +106 -0
  75. package/src/components/ui/buttons/airplay-button.tsx +53 -0
  76. package/src/components/ui/buttons/caption-button.tsx +55 -0
  77. package/src/components/ui/buttons/fullscreen-button.tsx +55 -0
  78. package/src/components/ui/buttons/google-cast-button.tsx +53 -0
  79. package/src/components/ui/buttons/live-button.tsx +56 -0
  80. package/src/components/ui/buttons/mute-button.tsx +60 -0
  81. package/src/components/ui/buttons/pip-button.tsx +54 -0
  82. package/src/components/ui/buttons/play-button.tsx +53 -0
  83. package/src/components/ui/buttons/seek-button.tsx +55 -0
  84. package/src/components/ui/buttons/toggle-button.tsx +51 -0
  85. package/src/components/ui/caption.tsx +70 -0
  86. package/src/components/ui/captions.tsx +41 -0
  87. package/src/components/ui/chapter-title.tsx +40 -0
  88. package/src/components/ui/controls.tsx +90 -0
  89. package/src/components/ui/gesture.tsx +43 -0
  90. package/src/components/ui/menu.tsx +251 -0
  91. package/src/components/ui/poster.tsx +101 -0
  92. package/src/components/ui/radio-group.tsx +88 -0
  93. package/src/components/ui/sliders/audio-gain-slider.tsx +55 -0
  94. package/src/components/ui/sliders/quality-slider.tsx +54 -0
  95. package/src/components/ui/sliders/slider-callbacks.ts +14 -0
  96. package/src/components/ui/sliders/slider-value.tsx +13 -0
  97. package/src/components/ui/sliders/slider.tsx +254 -0
  98. package/src/components/ui/sliders/speed-slider.tsx +54 -0
  99. package/src/components/ui/sliders/time-slider.tsx +379 -0
  100. package/src/components/ui/sliders/volume-slider.tsx +55 -0
  101. package/src/components/ui/spinner.tsx +105 -0
  102. package/src/components/ui/thumbnail.tsx +82 -0
  103. package/src/components/ui/time.tsx +77 -0
  104. package/src/components/ui/title.tsx +32 -0
  105. package/src/components/ui/tooltip.tsx +135 -0
  106. package/src/globals.d.ts +3 -0
  107. package/src/hooks/create-text-track.ts +22 -0
  108. package/src/hooks/options/use-audio-gain-options.ts +75 -0
  109. package/src/hooks/options/use-audio-options.ts +71 -0
  110. package/src/hooks/options/use-caption-options.ts +95 -0
  111. package/src/hooks/options/use-chapter-options.ts +97 -0
  112. package/src/hooks/options/use-playback-rate-options.ts +75 -0
  113. package/src/hooks/options/use-video-quality-options.ts +123 -0
  114. package/src/hooks/use-active-text-cues.ts +28 -0
  115. package/src/hooks/use-active-text-track.ts +19 -0
  116. package/src/hooks/use-chapter-title.ts +12 -0
  117. package/src/hooks/use-dom.ts +121 -0
  118. package/src/hooks/use-media-context.ts +6 -0
  119. package/src/hooks/use-media-player.ts +19 -0
  120. package/src/hooks/use-media-provider.ts +31 -0
  121. package/src/hooks/use-media-remote.ts +37 -0
  122. package/src/hooks/use-media-state.ts +58 -0
  123. package/src/hooks/use-signals.ts +24 -0
  124. package/src/hooks/use-slider-preview.ts +126 -0
  125. package/src/hooks/use-slider-state.ts +63 -0
  126. package/src/hooks/use-state.ts +47 -0
  127. package/src/hooks/use-text-cues.ts +33 -0
  128. package/src/hooks/use-thumbnails.ts +69 -0
  129. package/src/icon.ts +37 -0
  130. package/src/icons.ts +754 -0
  131. package/src/index.ts +181 -0
  132. package/src/providers/remotion/index.ts +10 -0
  133. package/src/providers/remotion/layout-engine.ts +123 -0
  134. package/src/providers/remotion/loader.ts +35 -0
  135. package/src/providers/remotion/playback-engine.ts +142 -0
  136. package/src/providers/remotion/provider.tsx +514 -0
  137. package/src/providers/remotion/type-check.ts +13 -0
  138. package/src/providers/remotion/types.ts +94 -0
  139. package/src/providers/remotion/ui/context.tsx +120 -0
  140. package/src/providers/remotion/ui/error-boundary.tsx +57 -0
  141. package/src/providers/remotion/ui/poster.tsx +33 -0
  142. package/src/providers/remotion/ui/slider-thumbnail.tsx +41 -0
  143. package/src/providers/remotion/ui/thumbnail.tsx +166 -0
  144. package/src/providers/remotion/validate.ts +220 -0
  145. package/src/source.ts +5 -0
  146. package/src/utils.ts +27 -0
  147. package/tsconfig.build.json +10 -0
  148. package/tsconfig.json +11 -0
  149. package/types/react/src/components/announcer.d.ts +16 -0
  150. package/types/react/src/components/layouts/default/audio-layout.d.ts +27 -0
  151. package/types/react/src/components/layouts/default/context.d.ts +14 -0
  152. package/types/react/src/components/layouts/default/hooks.d.ts +2 -0
  153. package/types/react/src/components/layouts/default/icons.d.ts +95 -0
  154. package/types/react/src/components/layouts/default/index.d.ts +5 -0
  155. package/types/react/src/components/layouts/default/media-layout.d.ts +133 -0
  156. package/types/react/src/components/layouts/default/slots.d.ts +22 -0
  157. package/types/react/src/components/layouts/default/ui/announcer.d.ts +6 -0
  158. package/types/react/src/components/layouts/default/ui/buttons.d.ts +54 -0
  159. package/types/react/src/components/layouts/default/ui/captions.d.ts +6 -0
  160. package/types/react/src/components/layouts/default/ui/controls.d.ts +6 -0
  161. package/types/react/src/components/layouts/default/ui/keyboard-display.d.ts +8 -0
  162. package/types/react/src/components/layouts/default/ui/menus/accessibility-menu.d.ts +10 -0
  163. package/types/react/src/components/layouts/default/ui/menus/audio-menu.d.ts +10 -0
  164. package/types/react/src/components/layouts/default/ui/menus/captions-menu.d.ts +10 -0
  165. package/types/react/src/components/layouts/default/ui/menus/chapters-menu.d.ts +7 -0
  166. package/types/react/src/components/layouts/default/ui/menus/font-menu.d.ts +6 -0
  167. package/types/react/src/components/layouts/default/ui/menus/items/menu-checkbox.d.ts +13 -0
  168. package/types/react/src/components/layouts/default/ui/menus/items/menu-items.d.ts +49 -0
  169. package/types/react/src/components/layouts/default/ui/menus/items/menu-slider.d.ts +26 -0
  170. package/types/react/src/components/layouts/default/ui/menus/playback-menu.d.ts +10 -0
  171. package/types/react/src/components/layouts/default/ui/menus/settings-menu.d.ts +15 -0
  172. package/types/react/src/components/layouts/default/ui/menus/utils.d.ts +1 -0
  173. package/types/react/src/components/layouts/default/ui/sliders.d.ts +24 -0
  174. package/types/react/src/components/layouts/default/ui/time.d.ts +30 -0
  175. package/types/react/src/components/layouts/default/ui/title.d.ts +6 -0
  176. package/types/react/src/components/layouts/default/ui/tooltip.d.ts +12 -0
  177. package/types/react/src/components/layouts/default/ui.d.ts +8 -0
  178. package/types/react/src/components/layouts/default/video-layout.d.ts +47 -0
  179. package/types/react/src/components/layouts/plyr/context.d.ts +12 -0
  180. package/types/react/src/components/layouts/plyr/icons/plyr-airplay.d.ts +2 -0
  181. package/types/react/src/components/layouts/plyr/icons/plyr-captions-off.d.ts +2 -0
  182. package/types/react/src/components/layouts/plyr/icons/plyr-captions-on.d.ts +2 -0
  183. package/types/react/src/components/layouts/plyr/icons/plyr-download.d.ts +2 -0
  184. package/types/react/src/components/layouts/plyr/icons/plyr-enter-fullscreen.d.ts +2 -0
  185. package/types/react/src/components/layouts/plyr/icons/plyr-exit-fullscreen.d.ts +2 -0
  186. package/types/react/src/components/layouts/plyr/icons/plyr-fast-forward.d.ts +2 -0
  187. package/types/react/src/components/layouts/plyr/icons/plyr-muted.d.ts +2 -0
  188. package/types/react/src/components/layouts/plyr/icons/plyr-pause.d.ts +2 -0
  189. package/types/react/src/components/layouts/plyr/icons/plyr-pip.d.ts +2 -0
  190. package/types/react/src/components/layouts/plyr/icons/plyr-play.d.ts +2 -0
  191. package/types/react/src/components/layouts/plyr/icons/plyr-restart.d.ts +2 -0
  192. package/types/react/src/components/layouts/plyr/icons/plyr-rewind.d.ts +2 -0
  193. package/types/react/src/components/layouts/plyr/icons/plyr-settings.d.ts +2 -0
  194. package/types/react/src/components/layouts/plyr/icons/plyr-volume.d.ts +2 -0
  195. package/types/react/src/components/layouts/plyr/icons.d.ts +25 -0
  196. package/types/react/src/components/layouts/plyr/index.d.ts +6 -0
  197. package/types/react/src/components/layouts/plyr/layout.d.ts +17 -0
  198. package/types/react/src/components/layouts/plyr/props.d.ts +71 -0
  199. package/types/react/src/components/layouts/plyr/slots.d.ts +9 -0
  200. package/types/react/src/components/layouts/remotion-ui.d.ts +3 -0
  201. package/types/react/src/components/layouts/utils.d.ts +1 -0
  202. package/types/react/src/components/player-callbacks.d.ts +6 -0
  203. package/types/react/src/components/player.d.ts +32 -0
  204. package/types/react/src/components/primitives/instances.d.ts +83 -0
  205. package/types/react/src/components/primitives/nodes.d.ts +15 -0
  206. package/types/react/src/components/primitives/slot.d.ts +11 -0
  207. package/types/react/src/components/provider.d.ts +26 -0
  208. package/types/react/src/components/text-track.d.ts +100 -0
  209. package/types/react/src/components/ui/buttons/airplay-button.d.ts +22 -0
  210. package/types/react/src/components/ui/buttons/caption-button.d.ts +24 -0
  211. package/types/react/src/components/ui/buttons/fullscreen-button.d.ts +24 -0
  212. package/types/react/src/components/ui/buttons/google-cast-button.d.ts +22 -0
  213. package/types/react/src/components/ui/buttons/live-button.d.ts +26 -0
  214. package/types/react/src/components/ui/buttons/mute-button.d.ts +30 -0
  215. package/types/react/src/components/ui/buttons/pip-button.d.ts +24 -0
  216. package/types/react/src/components/ui/buttons/play-button.d.ts +23 -0
  217. package/types/react/src/components/ui/buttons/seek-button.d.ts +25 -0
  218. package/types/react/src/components/ui/buttons/toggle-button.d.ts +22 -0
  219. package/types/react/src/components/ui/caption.d.ts +11 -0
  220. package/types/react/src/components/ui/captions.d.ts +20 -0
  221. package/types/react/src/components/ui/chapter-title.d.ts +20 -0
  222. package/types/react/src/components/ui/controls.d.ts +40 -0
  223. package/types/react/src/components/ui/gesture.d.ts +20 -0
  224. package/types/react/src/components/ui/menu.d.ts +102 -0
  225. package/types/react/src/components/ui/poster.d.ts +25 -0
  226. package/types/react/src/components/ui/radio-group.d.ts +39 -0
  227. package/types/react/src/components/ui/sliders/audio-gain-slider.d.ts +29 -0
  228. package/types/react/src/components/ui/sliders/quality-slider.d.ts +28 -0
  229. package/types/react/src/components/ui/sliders/slider-callbacks.d.ts +6 -0
  230. package/types/react/src/components/ui/sliders/slider-value.d.ts +9 -0
  231. package/types/react/src/components/ui/sliders/slider.d.ts +134 -0
  232. package/types/react/src/components/ui/sliders/speed-slider.d.ts +28 -0
  233. package/types/react/src/components/ui/sliders/time-slider.d.ts +124 -0
  234. package/types/react/src/components/ui/sliders/volume-slider.d.ts +29 -0
  235. package/types/react/src/components/ui/spinner.d.ts +31 -0
  236. package/types/react/src/components/ui/thumbnail.d.ts +26 -0
  237. package/types/react/src/components/ui/time.d.ts +20 -0
  238. package/types/react/src/components/ui/title.d.ts +15 -0
  239. package/types/react/src/components/ui/tooltip.d.ts +63 -0
  240. package/types/react/src/hooks/create-text-track.d.ts +7 -0
  241. package/types/react/src/hooks/options/use-audio-gain-options.d.ts +22 -0
  242. package/types/react/src/hooks/options/use-audio-options.d.ts +17 -0
  243. package/types/react/src/hooks/options/use-caption-options.d.ts +24 -0
  244. package/types/react/src/hooks/options/use-chapter-options.d.ts +18 -0
  245. package/types/react/src/hooks/options/use-playback-rate-options.d.ts +22 -0
  246. package/types/react/src/hooks/options/use-video-quality-options.d.ts +35 -0
  247. package/types/react/src/hooks/use-active-text-cues.d.ts +6 -0
  248. package/types/react/src/hooks/use-active-text-track.d.ts +5 -0
  249. package/types/react/src/hooks/use-chapter-title.d.ts +4 -0
  250. package/types/react/src/hooks/use-dom.d.ts +9 -0
  251. package/types/react/src/hooks/use-media-context.d.ts +1 -0
  252. package/types/react/src/hooks/use-media-player.d.ts +7 -0
  253. package/types/react/src/hooks/use-media-provider.d.ts +7 -0
  254. package/types/react/src/hooks/use-media-remote.d.ts +12 -0
  255. package/types/react/src/hooks/use-media-state.d.ts +15 -0
  256. package/types/react/src/hooks/use-signals.d.ts +5 -0
  257. package/types/react/src/hooks/use-slider-preview.d.ts +27 -0
  258. package/types/react/src/hooks/use-slider-state.d.ts +16 -0
  259. package/types/react/src/hooks/use-state.d.ts +18 -0
  260. package/types/react/src/hooks/use-text-cues.d.ts +6 -0
  261. package/types/react/src/hooks/use-thumbnails.d.ts +16 -0
  262. package/types/react/src/icon.d.ts +17 -0
  263. package/types/react/src/icons.d.ts +215 -0
  264. package/types/react/src/index.d.ts +78 -0
  265. package/types/react/src/providers/remotion/index.d.ts +7 -0
  266. package/types/react/src/providers/remotion/layout-engine.d.ts +8 -0
  267. package/types/react/src/providers/remotion/loader.d.ts +9 -0
  268. package/types/react/src/providers/remotion/playback-engine.d.ts +11 -0
  269. package/types/react/src/providers/remotion/provider.d.ts +26 -0
  270. package/types/react/src/providers/remotion/type-check.d.ts +6 -0
  271. package/types/react/src/providers/remotion/types.d.ts +91 -0
  272. package/types/react/src/providers/remotion/ui/context.d.ts +17 -0
  273. package/types/react/src/providers/remotion/ui/error-boundary.d.ts +21 -0
  274. package/types/react/src/providers/remotion/ui/poster.d.ts +18 -0
  275. package/types/react/src/providers/remotion/ui/slider-thumbnail.d.ts +17 -0
  276. package/types/react/src/providers/remotion/ui/thumbnail.d.ts +32 -0
  277. package/types/react/src/providers/remotion/validate.d.ts +12 -0
  278. package/types/react/src/source.d.ts +3 -0
  279. package/types/react/src/utils.d.ts +3 -0
  280. package/types/vidstack/src/core/api/src-types.d.ts +50 -0
  281. package/types/vidstack/src/utils/mime.d.ts +15 -0
  282. package/types/vidstack/src/utils/network.d.ts +17 -0
  283. package/types/vidstack/src/utils/support.d.ts +72 -0
  284. package/vite.config.ts +23 -0
package/src/index.ts ADDED
@@ -0,0 +1,181 @@
1
+ export * from 'vidstack/exports/core.ts';
2
+ export * from 'vidstack/exports/events.ts';
3
+ export * from 'vidstack/exports/foundation.ts';
4
+ export * from 'vidstack/exports/maverick.ts';
5
+ export * from 'vidstack/exports/providers.ts';
6
+ export * from 'vidstack/exports/utils.ts';
7
+
8
+ export {
9
+ DEFAULT_AUDIO_GAINS,
10
+ DEFAULT_PLAYBACK_RATES,
11
+ sliderState,
12
+ type AudioGainSliderState,
13
+ type GestureAction,
14
+ type MediaAnnouncerState,
15
+ type MediaAnnouncerTranslations,
16
+ type MediaAnnouncerWord,
17
+ type MediaProviderState,
18
+ type MenuPlacement,
19
+ type MenuPlacementAlign,
20
+ type MenuPlacementSide,
21
+ type PosterState,
22
+ type QualitySliderState,
23
+ type SliderCSSVars,
24
+ type SliderOrientation,
25
+ type SliderState,
26
+ type SliderVideoState,
27
+ type SpeedSliderState,
28
+ type ThumbnailState,
29
+ type TimeSliderState,
30
+ type TimeState,
31
+ type TooltipPlacement,
32
+ type TooltipPlacementAlign,
33
+ type TooltipPlacementSide,
34
+ type VolumeSliderState,
35
+ } from 'vidstack/exports/components.ts';
36
+
37
+ // Primitives
38
+ export * from './components/primitives/instances';
39
+
40
+ // Core
41
+ export type { PlayerSrc } from './source';
42
+ export { type MediaPlayerProps, MediaPlayer } from './components/player';
43
+ export { type MediaAnnouncerProps, MediaAnnouncer } from './components/announcer';
44
+ export { type MediaProviderProps, MediaProvider } from './components/provider';
45
+ export { type IconProps, Icon, type IconComponent } from './icon';
46
+ export { Track, type TrackProps } from './components/text-track';
47
+
48
+ // Controls
49
+ export * as Controls from './components/ui/controls';
50
+ export type {
51
+ RootProps as ControlsProps,
52
+ GroupProps as ControlsGroupProps,
53
+ } from './components/ui/controls';
54
+
55
+ // Tooltip
56
+ export * as Tooltip from './components/ui/tooltip';
57
+ export type {
58
+ RootProps as TooltipProps,
59
+ TriggerProps as TooltipTriggerProps,
60
+ ContentProps as TooltipContentProps,
61
+ } from './components/ui/tooltip';
62
+
63
+ // Buttons
64
+ export { type ToggleButtonProps, ToggleButton } from './components/ui/buttons/toggle-button';
65
+ export { type AirPlayButtonProps, AirPlayButton } from './components/ui/buttons/airplay-button';
66
+ export {
67
+ type GoogleCastButtonProps,
68
+ GoogleCastButton,
69
+ } from './components/ui/buttons/google-cast-button';
70
+ export { type PlayButtonProps, PlayButton } from './components/ui/buttons/play-button';
71
+ export { type CaptionButtonProps, CaptionButton } from './components/ui/buttons/caption-button';
72
+ export {
73
+ type FullscreenButtonProps,
74
+ FullscreenButton,
75
+ } from './components/ui/buttons/fullscreen-button';
76
+ export { type MuteButtonProps, MuteButton } from './components/ui/buttons/mute-button';
77
+ export { type PIPButtonProps, PIPButton } from './components/ui/buttons/pip-button';
78
+ export { type SeekButtonProps, SeekButton } from './components/ui/buttons/seek-button';
79
+ export { type LiveButtonProps, LiveButton } from './components/ui/buttons/live-button';
80
+
81
+ // Slider
82
+ export * as Slider from './components/ui/sliders/slider';
83
+ export * as VolumeSlider from './components/ui/sliders/volume-slider';
84
+ export * as QualitySlider from './components/ui/sliders/quality-slider';
85
+ export * as AudioGainSlider from './components/ui/sliders/audio-gain-slider';
86
+ export * as SpeedSlider from './components/ui/sliders/speed-slider';
87
+ export * as TimeSlider from './components/ui/sliders/time-slider';
88
+ export type {
89
+ RootProps as SliderProps,
90
+ ValueProps as SliderValueProps,
91
+ PreviewProps as SliderPreviewProps,
92
+ StepsProps as SliderStepsProps,
93
+ } from './components/ui/sliders/slider';
94
+ export type { RootProps as VolumeSliderProps } from './components/ui/sliders/volume-slider';
95
+ export type { RootProps as AudioGainSliderProps } from './components/ui/sliders/audio-gain-slider';
96
+ export type { RootProps as SpeedSliderProps } from './components/ui/sliders/speed-slider';
97
+ export type { RootProps as QualitySliderProps } from './components/ui/sliders/quality-slider';
98
+ export type {
99
+ RootProps as TimeSliderProps,
100
+ ChaptersProps as SliderChapterProps,
101
+ ChapterTitleProps as SliderChapterTitleProps,
102
+ ThumbnailProps as SliderThumbnailProps,
103
+ ThumbnailImgProps as SliderThumbnailImgProps,
104
+ VideoProps as SliderVideoProps,
105
+ } from './components/ui/sliders/time-slider';
106
+
107
+ // Radio
108
+ export * as RadioGroup from './components/ui/radio-group';
109
+ export type {
110
+ RootProps as RadioGroupProps,
111
+ ItemProps as RadioProps,
112
+ } from './components/ui/radio-group';
113
+
114
+ // Menu
115
+ export * as Menu from './components/ui/menu';
116
+ export type {
117
+ RootProps as MenuProps,
118
+ ButtonProps as MenuButtonProps,
119
+ PortalProps as MenuPortalProps,
120
+ ItemsProps as MenuItemsProps,
121
+ ContentProps as MenuContentProps,
122
+ ItemProps as MenuItemProps,
123
+ RadioGroupProps as MenuRadioGroupProps,
124
+ RadioProps as MenuRadioProps,
125
+ } from './components/ui/menu';
126
+
127
+ // Display
128
+ export { Title, type TitleProps } from './components/ui/title';
129
+ export { ChapterTitle, type ChapterTitleProps } from './components/ui/chapter-title';
130
+ export { type GestureProps, Gesture } from './components/ui/gesture';
131
+ export { Captions, type CaptionsProps } from './components/ui/captions';
132
+ export { type PosterProps, Poster } from './components/ui/poster';
133
+ export { type TimeProps, Time } from './components/ui/time';
134
+
135
+ // Caption
136
+ export * as Caption from './components/ui/caption';
137
+ export type {
138
+ RootProps as CaptionProps,
139
+ TextProps as CaptionTextProps,
140
+ } from './components/ui/caption';
141
+
142
+ // Thumbnail
143
+ export * as Thumbnail from './components/ui/thumbnail';
144
+ export type {
145
+ RootProps as ThumbnailProps,
146
+ ImgProps as ThumbnailImgProps,
147
+ } from './components/ui/thumbnail';
148
+
149
+ // Spinner
150
+ export * as Spinner from './components/ui/spinner';
151
+ export type {
152
+ RootProps as SpinnerProps,
153
+ TrackProps as SpinnerTrackProps,
154
+ TrackFillProps as SpinnerTrackFillProps,
155
+ } from './components/ui/spinner';
156
+
157
+ // Hooks
158
+ export * from './hooks/use-state';
159
+ export * from './hooks/use-media-context';
160
+ export * from './hooks/use-media-player';
161
+ export * from './hooks/use-media-provider';
162
+ export * from './hooks/use-media-remote';
163
+ export * from './hooks/use-media-state';
164
+ export * from './hooks/use-thumbnails';
165
+ export * from './hooks/use-slider-state';
166
+ export * from './hooks/use-slider-preview';
167
+ export * from './hooks/use-text-cues';
168
+ export * from './hooks/use-active-text-cues';
169
+ export * from './hooks/use-active-text-track';
170
+ export * from './hooks/use-chapter-title';
171
+ export * from './hooks/create-text-track';
172
+ export * from './hooks/options/use-audio-gain-options';
173
+ export * from './hooks/options/use-audio-options';
174
+ export * from './hooks/options/use-caption-options';
175
+ export * from './hooks/options/use-chapter-options';
176
+ export * from './hooks/options/use-video-quality-options';
177
+ export * from './hooks/options/use-playback-rate-options';
178
+
179
+ // Layouts
180
+ export type { DefaultLayoutProps } from './components/layouts/default';
181
+ export type { PlyrLayoutProps } from './components/layouts/plyr';
@@ -0,0 +1,10 @@
1
+ export { type RemotionThumbnailProps, default as RemotionThumbnail } from './ui/thumbnail';
2
+ export { type RemotionPosterProps, default as RemotionPoster } from './ui/poster';
3
+ export {
4
+ type RemotionSliderThumbnailProps,
5
+ default as RemotionSliderThumbnail,
6
+ } from './ui/slider-thumbnail';
7
+ export { RemotionProviderLoader } from './loader';
8
+ export type { RemotionProvider } from './provider';
9
+ export type * from './types';
10
+ export { isRemotionProvider, isRemotionSrc as isRemotionSource, isRemotionSrc } from './type-check';
@@ -0,0 +1,123 @@
1
+ import { animationFrameThrottle, createDisposalBin } from 'maverick.js/std';
2
+
3
+ import type { RemotionSrc } from './types';
4
+
5
+ export class RemotionLayoutEngine {
6
+ #src: RemotionSrc | null = null;
7
+ #viewport: HTMLElement | null = null;
8
+ #canvas: HTMLElement | null = null;
9
+ #container: HTMLElement | null = null;
10
+ #disposal = createDisposalBin();
11
+
12
+ constructor() {}
13
+
14
+ setSrc(src: RemotionSrc | null) {
15
+ this.#src = src;
16
+ this.setContainer(this.#container);
17
+ }
18
+
19
+ setContainer(container: HTMLElement | null) {
20
+ if (__SERVER__) return;
21
+
22
+ this.#disposal.empty();
23
+
24
+ this.#container = container;
25
+ this.#canvas = container?.parentElement ?? null;
26
+ this.#viewport = this.#canvas?.parentElement ?? null;
27
+
28
+ if (this.#src && this.#viewport) {
29
+ const onResize = animationFrameThrottle(this.#onResize.bind(this));
30
+
31
+ onResize();
32
+ const observer = new ResizeObserver(onResize);
33
+ observer.observe(this.#viewport);
34
+
35
+ this.#disposal.add(() => observer.disconnect());
36
+ }
37
+ }
38
+
39
+ destroy() {
40
+ this.#disposal.empty();
41
+ }
42
+
43
+ #onResize(entries?: ResizeObserverEntry[]) {
44
+ if (!this.#viewport || !this.#src) return;
45
+
46
+ const rect = this.#getRect(this.#viewport, entries?.[0]),
47
+ scale = this.#calcScale(rect),
48
+ transform = this.#calcTransform(rect, scale);
49
+
50
+ Object.assign(this.#canvas!.style, {
51
+ width: this.#src.compositionWidth! * scale + 'px',
52
+ height: this.#src.compositionHeight! * scale + 'px',
53
+ display: 'flex',
54
+ flexDirection: 'column',
55
+ position: 'absolute',
56
+ left: transform.centerX,
57
+ top: transform.centerY,
58
+ overflow: 'hidden',
59
+ });
60
+
61
+ Object.assign(this.#container!.style, {
62
+ position: 'absolute',
63
+ width: this.#src.compositionWidth + 'px',
64
+ height: this.#src.compositionHeight + 'px',
65
+ display: 'flex',
66
+ transform: `scale(${scale})`,
67
+ marginLeft: transform.x,
68
+ marginTop: transform.y,
69
+ overflow: 'hidden',
70
+ });
71
+ }
72
+
73
+ #getRect(el: HTMLElement, entry?: ResizeObserverEntry): LayoutRect {
74
+ const rect = el.getBoundingClientRect();
75
+ if (!entry) return rect;
76
+
77
+ const { contentRect, target } = entry,
78
+ newSize = target.getClientRects();
79
+
80
+ if (!newSize?.[0]) return rect;
81
+
82
+ const scale = contentRect.width === 0 ? 1 : newSize[0].width / contentRect.width,
83
+ width = newSize[0].width * (1 / scale),
84
+ height = newSize[0].height * (1 / scale);
85
+
86
+ return {
87
+ width,
88
+ height,
89
+ top: newSize[0].y,
90
+ left: newSize[0].x,
91
+ };
92
+ }
93
+
94
+ #calcScale(rect: LayoutRect) {
95
+ if (!this.#src) return 0;
96
+
97
+ const heightRatio = rect.height / this.#src.compositionHeight!,
98
+ widthRatio = rect.width / this.#src.compositionWidth!;
99
+
100
+ return Math.min(heightRatio || 0, widthRatio || 0);
101
+ }
102
+
103
+ #calcTransform(rect: LayoutRect, scale: number) {
104
+ if (!this.#src) return {};
105
+
106
+ const correction = 0 - (1 - scale) / 2,
107
+ x = correction * this.#src.compositionWidth!,
108
+ y = correction * this.#src.compositionHeight!,
109
+ width = this.#src.compositionWidth! * scale,
110
+ height = this.#src.compositionHeight! * scale,
111
+ centerX = rect.width / 2 - width / 2,
112
+ centerY = rect.height / 2 - height / 2;
113
+
114
+ return { x, y, centerX, centerY };
115
+ }
116
+ }
117
+
118
+ interface LayoutRect {
119
+ width: number;
120
+ height: number;
121
+ top: number;
122
+ left: number;
123
+ }
@@ -0,0 +1,35 @@
1
+ import * as React from 'react';
2
+
3
+ import type {
4
+ MediaContext,
5
+ MediaProviderAdapter,
6
+ MediaProviderLoader,
7
+ MediaType,
8
+ Src,
9
+ } from 'vidstack';
10
+
11
+ import * as UI from '../../components/layouts/remotion-ui';
12
+
13
+ export class RemotionProviderLoader implements MediaProviderLoader {
14
+ readonly name = 'remotion';
15
+
16
+ target!: HTMLElement;
17
+
18
+ constructor() {
19
+ UI.RemotionThumbnail.set(React.lazy(() => import('./ui/thumbnail')));
20
+ UI.RemotionSliderThumbnail.set(React.lazy(() => import('./ui/slider-thumbnail')));
21
+ UI.RemotionPoster.set(React.lazy(() => import('./ui/poster')));
22
+ }
23
+
24
+ canPlay(src: Src): boolean {
25
+ return src.type === 'video/remotion';
26
+ }
27
+
28
+ mediaType(): MediaType {
29
+ return 'video';
30
+ }
31
+
32
+ async load(ctx: MediaContext): Promise<MediaProviderAdapter> {
33
+ return new (await import('./provider')).RemotionProvider(this.target, ctx);
34
+ }
35
+ }
@@ -0,0 +1,142 @@
1
+ import { createDisposalBin, listenEvent } from 'maverick.js/std';
2
+
3
+ import type { RemotionSrc } from './types';
4
+
5
+ export class RemotionPlaybackEngine {
6
+ #src: RemotionSrc;
7
+ #onFrameChange: (frame: number) => void;
8
+ #onEnd: () => void;
9
+ #disposal = createDisposalBin();
10
+ #frame = 0;
11
+ #framesAdvanced = 0;
12
+ #playbackRate = 1;
13
+ #playing = false;
14
+ #rafId = -1;
15
+ #timerId = -1;
16
+ #startedAt = 0;
17
+ #isRunningInBackground = false;
18
+
19
+ get frame() {
20
+ return this.#frame;
21
+ }
22
+
23
+ set frame(frame) {
24
+ this.#frame = frame;
25
+ this.#onFrameChange(frame);
26
+ }
27
+
28
+ constructor(src: RemotionSrc, onFrameChange: (frame: number) => void, onEnd: () => void) {
29
+ this.#src = src;
30
+ this.#onFrameChange = onFrameChange;
31
+ this.#onEnd = onEnd;
32
+ this.#frame = src.initialFrame ?? 0;
33
+ this.#disposal.add(
34
+ listenEvent(document, 'visibilitychange' as any, this.#onVisibilityChange.bind(this)),
35
+ );
36
+ }
37
+
38
+ play() {
39
+ this.#framesAdvanced = 0;
40
+ this.#playing = true;
41
+ this.#startedAt = performance.now();
42
+ this.#tick();
43
+ }
44
+
45
+ stop() {
46
+ this.#playing = false;
47
+
48
+ if (this.#rafId >= 0) {
49
+ cancelAnimationFrame(this.#rafId);
50
+ this.#rafId = -1;
51
+ }
52
+
53
+ if (this.#timerId >= 0) {
54
+ clearTimeout(this.#timerId);
55
+ this.#timerId = -1;
56
+ }
57
+ }
58
+
59
+ setPlaybackRate(rate: number) {
60
+ this.#playbackRate = rate;
61
+ }
62
+
63
+ destroy() {
64
+ this.#disposal.empty();
65
+ this.stop();
66
+ }
67
+
68
+ #update() {
69
+ const { nextFrame, framesToAdvance, ended } = this.#calculateNextFrame();
70
+ this.#framesAdvanced += framesToAdvance;
71
+
72
+ if (nextFrame !== this.#frame) {
73
+ this.#onFrameChange(nextFrame);
74
+ this.#frame = nextFrame;
75
+ }
76
+
77
+ if (ended) {
78
+ this.#frame = this.#src.outFrame!;
79
+ this.stop();
80
+ this.#onEnd();
81
+ }
82
+ }
83
+
84
+ #tick = () => {
85
+ this.#update();
86
+ if (this.#playing) {
87
+ this.#queueNextFrame(this.#tick);
88
+ }
89
+ };
90
+
91
+ #queueNextFrame(callback: () => void) {
92
+ if (this.#isRunningInBackground) {
93
+ this.#timerId = window.setTimeout(callback, 1000 / this.#src.fps!);
94
+ } else {
95
+ this.#rafId = requestAnimationFrame(callback);
96
+ }
97
+ }
98
+
99
+ #calculateNextFrame() {
100
+ const round = this.#playbackRate < 0 ? Math.ceil : Math.floor,
101
+ time = performance.now() - this.#startedAt,
102
+ framesToAdvance =
103
+ round((time * this.#playbackRate) / (1000 / this.#src.fps!)) - this.#framesAdvanced,
104
+ nextFrame = framesToAdvance + this.#frame,
105
+ isCurrentFrameOutOfBounds =
106
+ this.#frame > this.#src.outFrame! || this.#frame < this.#src.inFrame!,
107
+ isNextFrameOutOfBounds = nextFrame > this.#src.outFrame! || nextFrame < this.#src.inFrame!,
108
+ ended = isNextFrameOutOfBounds && !isCurrentFrameOutOfBounds;
109
+
110
+ if (this.#playbackRate > 0 && !ended) {
111
+ // Play forwards
112
+ if (isNextFrameOutOfBounds) {
113
+ return {
114
+ nextFrame: this.#src.inFrame!,
115
+ framesToAdvance,
116
+ ended,
117
+ };
118
+ }
119
+
120
+ return { nextFrame, framesToAdvance, ended };
121
+ }
122
+
123
+ // Reverse playback
124
+ if (isNextFrameOutOfBounds) {
125
+ return {
126
+ nextFrame: this.#src.outFrame!,
127
+ framesToAdvance,
128
+ ended,
129
+ };
130
+ }
131
+
132
+ return { nextFrame, framesToAdvance, ended };
133
+ }
134
+
135
+ #onVisibilityChange() {
136
+ this.#isRunningInBackground = document.visibilityState === 'hidden';
137
+ if (this.#playing) {
138
+ this.stop();
139
+ this.play();
140
+ }
141
+ }
142
+ }