@remotion/player 4.0.0-alpha.4 → 4.0.0-alpha5

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 (209) hide show
  1. package/LICENSE.md +8 -8
  2. package/README.md +1 -1
  3. package/dist/cjs/MediaVolumeSlider.d.ts +5 -0
  4. package/dist/cjs/MediaVolumeSlider.js +143 -0
  5. package/dist/cjs/Player.d.ts +51 -0
  6. package/dist/{Player.js → cjs/Player.js} +42 -78
  7. package/dist/{PlayerControls.d.ts → cjs/PlayerControls.d.ts} +17 -2
  8. package/dist/cjs/PlayerControls.js +153 -0
  9. package/dist/{PlayerSeekBar.d.ts → cjs/PlayerSeekBar.d.ts} +4 -0
  10. package/dist/{PlayerSeekBar.js → cjs/PlayerSeekBar.js} +41 -17
  11. package/dist/cjs/PlayerUI.d.ts +39 -0
  12. package/dist/{PlayerUI.js → cjs/PlayerUI.js} +105 -87
  13. package/dist/cjs/SharedPlayerContext.d.ts +15 -0
  14. package/dist/cjs/SharedPlayerContext.js +73 -0
  15. package/dist/cjs/Thumbnail.d.ts +24 -0
  16. package/dist/cjs/Thumbnail.js +46 -0
  17. package/dist/cjs/ThumbnailUI.d.ts +11 -0
  18. package/dist/cjs/ThumbnailUI.js +107 -0
  19. package/dist/{calculate-next-frame.d.ts → cjs/calculate-next-frame.d.ts} +0 -0
  20. package/dist/{calculate-next-frame.js → cjs/calculate-next-frame.js} +0 -0
  21. package/dist/cjs/calculate-scale.d.ts +39 -0
  22. package/dist/cjs/calculate-scale.js +85 -0
  23. package/dist/cjs/emitter-context.d.ts +4 -0
  24. package/dist/{emitter-context.js → cjs/emitter-context.js} +2 -1
  25. package/dist/{error-boundary.d.ts → cjs/error-boundary.d.ts} +1 -1
  26. package/dist/{error-boundary.js → cjs/error-boundary.js} +0 -0
  27. package/dist/cjs/event-emitter.d.ts +76 -0
  28. package/dist/{event-emitter.js → cjs/event-emitter.js} +46 -2
  29. package/dist/{format-time.d.ts → cjs/format-time.d.ts} +0 -0
  30. package/dist/{format-time.js → cjs/format-time.js} +0 -0
  31. package/dist/{icons.d.ts → cjs/icons.d.ts} +2 -1
  32. package/dist/{icons.js → cjs/icons.js} +7 -7
  33. package/dist/{index.d.ts → cjs/index.d.ts} +22 -13
  34. package/dist/cjs/index.js +25 -0
  35. package/dist/cjs/is-backgrounded.d.ts +1 -0
  36. package/dist/cjs/is-backgrounded.js +24 -0
  37. package/dist/{player-css-classname.d.ts → cjs/player-css-classname.d.ts} +0 -1
  38. package/dist/cjs/player-css-classname.js +4 -0
  39. package/dist/{player-methods.d.ts → cjs/player-methods.d.ts} +8 -4
  40. package/dist/{player-methods.js → cjs/player-methods.js} +0 -0
  41. package/dist/{test → cjs/test}/index.test.d.ts +0 -0
  42. package/dist/cjs/test/index.test.js +9 -0
  43. package/dist/{test → cjs/test}/test-utils.d.ts +0 -0
  44. package/dist/{test → cjs/test}/test-utils.js +0 -0
  45. package/dist/{test/validate-prop.test.d.ts → cjs/test/validate-in-out-frames.test.d.ts} +0 -0
  46. package/dist/cjs/test/validate-in-out-frames.test.js +56 -0
  47. package/dist/cjs/test/validate-prop.test.d.ts +1 -0
  48. package/dist/cjs/test/validate-prop.test.js +131 -0
  49. package/dist/{use-hover-state.d.ts → cjs/use-hover-state.d.ts} +0 -0
  50. package/dist/{use-hover-state.js → cjs/use-hover-state.js} +0 -0
  51. package/dist/{use-playback.d.ts → cjs/use-playback.d.ts} +0 -0
  52. package/dist/{use-playback.js → cjs/use-playback.js} +49 -9
  53. package/dist/{use-player.d.ts → cjs/use-player.d.ts} +3 -1
  54. package/dist/{use-player.js → cjs/use-player.js} +15 -8
  55. package/dist/cjs/use-thumbnail.d.ts +6 -0
  56. package/dist/cjs/use-thumbnail.js +18 -0
  57. package/dist/cjs/use-video-controls-resize.d.ts +11 -0
  58. package/dist/cjs/use-video-controls-resize.js +39 -0
  59. package/dist/{utils → cjs/utils}/calculate-player-size.d.ts +1 -1
  60. package/dist/{utils → cjs/utils}/calculate-player-size.js +9 -10
  61. package/dist/{utils → cjs/utils}/cancellable-promise.d.ts +0 -0
  62. package/dist/{utils → cjs/utils}/cancellable-promise.js +0 -0
  63. package/dist/{utils → cjs/utils}/delay.d.ts +0 -0
  64. package/dist/{utils → cjs/utils}/delay.js +0 -0
  65. package/dist/{utils → cjs/utils}/is-node.d.ts +0 -0
  66. package/dist/{utils → cjs/utils}/is-node.js +0 -0
  67. package/dist/cjs/utils/preview-size.d.ts +8 -0
  68. package/dist/{utils → cjs/utils}/preview-size.js +0 -0
  69. package/dist/cjs/utils/props-if-has-props.d.ts +10 -0
  70. package/dist/cjs/utils/props-if-has-props.js +2 -0
  71. package/dist/{utils → cjs/utils}/use-cancellable-promises.d.ts +1 -1
  72. package/dist/{utils → cjs/utils}/use-cancellable-promises.js +0 -0
  73. package/dist/{utils → cjs/utils}/use-click-prevention-on-double-click.d.ts +0 -0
  74. package/dist/{utils → cjs/utils}/use-click-prevention-on-double-click.js +5 -5
  75. package/dist/{utils → cjs/utils}/use-element-size.d.ts +1 -0
  76. package/dist/{utils → cjs/utils}/use-element-size.js +24 -12
  77. package/dist/cjs/utils/validate-in-out-frame.d.ts +6 -0
  78. package/dist/cjs/utils/validate-in-out-frame.js +54 -0
  79. package/dist/cjs/utils/validate-initial-frame.d.ts +4 -0
  80. package/dist/cjs/utils/validate-initial-frame.js +27 -0
  81. package/dist/{utils → cjs/utils}/validate-playbackrate.d.ts +0 -0
  82. package/dist/{utils → cjs/utils}/validate-playbackrate.js +0 -0
  83. package/dist/{volume-persistance.d.ts → cjs/volume-persistance.d.ts} +0 -0
  84. package/dist/{volume-persistance.js → cjs/volume-persistance.js} +0 -0
  85. package/dist/esm/MediaVolumeSlider.d.ts +5 -0
  86. package/dist/esm/Player.d.ts +51 -0
  87. package/dist/esm/PlayerControls.d.ts +40 -0
  88. package/dist/esm/PlayerSeekBar.d.ts +8 -0
  89. package/dist/esm/PlayerUI.d.ts +39 -0
  90. package/dist/esm/SharedPlayerContext.d.ts +15 -0
  91. package/dist/esm/Thumbnail.d.ts +24 -0
  92. package/dist/esm/ThumbnailUI.d.ts +11 -0
  93. package/dist/esm/calculate-next-frame.d.ts +14 -0
  94. package/dist/esm/calculate-scale.d.ts +39 -0
  95. package/dist/esm/emitter-context.d.ts +4 -0
  96. package/dist/esm/error-boundary.d.ts +19 -0
  97. package/dist/esm/event-emitter.d.ts +76 -0
  98. package/dist/esm/format-time.d.ts +1 -0
  99. package/dist/esm/icons.d.ts +10 -0
  100. package/dist/esm/index.d.ts +60 -0
  101. package/dist/esm/index.mjs +1929 -0
  102. package/dist/esm/is-backgrounded.d.ts +1 -0
  103. package/dist/esm/player-css-classname.d.ts +1 -0
  104. package/dist/esm/player-methods.d.ts +24 -0
  105. package/dist/esm/test/index.test.d.ts +1 -0
  106. package/dist/esm/test/test-utils.d.ts +6 -0
  107. package/dist/esm/test/validate-in-out-frames.test.d.ts +1 -0
  108. package/dist/esm/test/validate-prop.test.d.ts +1 -0
  109. package/dist/esm/use-hover-state.d.ts +1 -0
  110. package/dist/esm/use-playback.d.ts +7 -0
  111. package/dist/esm/use-player.d.ts +19 -0
  112. package/dist/esm/use-thumbnail.d.ts +6 -0
  113. package/dist/esm/use-video-controls-resize.d.ts +11 -0
  114. package/dist/esm/utils/calculate-player-size.d.ts +9 -0
  115. package/dist/esm/utils/cancellable-promise.d.ts +5 -0
  116. package/dist/esm/utils/delay.d.ts +1 -0
  117. package/dist/esm/utils/is-node.d.ts +1 -0
  118. package/dist/esm/utils/preview-size.d.ts +8 -0
  119. package/dist/esm/utils/props-if-has-props.d.ts +10 -0
  120. package/dist/esm/utils/use-cancellable-promises.d.ts +7 -0
  121. package/dist/esm/utils/use-click-prevention-on-double-click.d.ts +3 -0
  122. package/dist/esm/utils/use-element-size.d.ts +16 -0
  123. package/dist/esm/utils/validate-in-out-frame.d.ts +6 -0
  124. package/dist/esm/utils/validate-initial-frame.d.ts +4 -0
  125. package/dist/esm/utils/validate-playbackrate.d.ts +1 -0
  126. package/dist/esm/volume-persistance.d.ts +2 -0
  127. package/dist/tsconfig-esm.tsbuildinfo +1 -0
  128. package/dist/tsconfig.tsbuildinfo +1 -0
  129. package/package.json +78 -66
  130. package/dist/MediaVolumeSlider.d.ts +0 -2
  131. package/dist/MediaVolumeSlider.d.ts.map +0 -1
  132. package/dist/MediaVolumeSlider.js +0 -93
  133. package/dist/MediaVolumeSlider.js.map +0 -1
  134. package/dist/Player.d.ts +0 -41
  135. package/dist/Player.d.ts.map +0 -1
  136. package/dist/Player.js.map +0 -1
  137. package/dist/PlayerControls.d.ts.map +0 -1
  138. package/dist/PlayerControls.js +0 -95
  139. package/dist/PlayerControls.js.map +0 -1
  140. package/dist/PlayerSeekBar.d.ts.map +0 -1
  141. package/dist/PlayerSeekBar.js.map +0 -1
  142. package/dist/PlayerUI.d.ts +0 -31
  143. package/dist/PlayerUI.d.ts.map +0 -1
  144. package/dist/PlayerUI.js.map +0 -1
  145. package/dist/calculate-next-frame.d.ts.map +0 -1
  146. package/dist/calculate-next-frame.js.map +0 -1
  147. package/dist/calculate-scale.d.ts +0 -14
  148. package/dist/calculate-scale.d.ts.map +0 -1
  149. package/dist/calculate-scale.js +0 -24
  150. package/dist/calculate-scale.js.map +0 -1
  151. package/dist/emitter-context.d.ts +0 -3
  152. package/dist/emitter-context.d.ts.map +0 -1
  153. package/dist/emitter-context.js.map +0 -1
  154. package/dist/error-boundary.d.ts.map +0 -1
  155. package/dist/error-boundary.js.map +0 -1
  156. package/dist/event-emitter.d.ts +0 -42
  157. package/dist/event-emitter.d.ts.map +0 -1
  158. package/dist/event-emitter.js.map +0 -1
  159. package/dist/format-time.d.ts.map +0 -1
  160. package/dist/format-time.js.map +0 -1
  161. package/dist/icons.d.ts.map +0 -1
  162. package/dist/icons.js.map +0 -1
  163. package/dist/index.d.ts.map +0 -1
  164. package/dist/index.js +0 -22
  165. package/dist/index.js.map +0 -1
  166. package/dist/player-css-classname.d.ts.map +0 -1
  167. package/dist/player-css-classname.js +0 -5
  168. package/dist/player-css-classname.js.map +0 -1
  169. package/dist/player-methods.d.ts.map +0 -1
  170. package/dist/player-methods.js.map +0 -1
  171. package/dist/test/index.test.d.ts.map +0 -1
  172. package/dist/test/index.test.js +0 -8
  173. package/dist/test/index.test.js.map +0 -1
  174. package/dist/test/test-utils.d.ts.map +0 -1
  175. package/dist/test/test-utils.js.map +0 -1
  176. package/dist/test/validate-prop.test.d.ts.map +0 -1
  177. package/dist/test/validate-prop.test.js +0 -130
  178. package/dist/test/validate-prop.test.js.map +0 -1
  179. package/dist/use-hover-state.d.ts.map +0 -1
  180. package/dist/use-hover-state.js.map +0 -1
  181. package/dist/use-playback.d.ts.map +0 -1
  182. package/dist/use-playback.js.map +0 -1
  183. package/dist/use-player.d.ts.map +0 -1
  184. package/dist/use-player.js.map +0 -1
  185. package/dist/utils/browser-supports-fullscreen.d.ts +0 -12
  186. package/dist/utils/browser-supports-fullscreen.d.ts.map +0 -1
  187. package/dist/utils/browser-supports-fullscreen.js +0 -6
  188. package/dist/utils/browser-supports-fullscreen.js.map +0 -1
  189. package/dist/utils/calculate-player-size.d.ts.map +0 -1
  190. package/dist/utils/calculate-player-size.js.map +0 -1
  191. package/dist/utils/cancellable-promise.d.ts.map +0 -1
  192. package/dist/utils/cancellable-promise.js.map +0 -1
  193. package/dist/utils/delay.d.ts.map +0 -1
  194. package/dist/utils/delay.js.map +0 -1
  195. package/dist/utils/is-node.d.ts.map +0 -1
  196. package/dist/utils/is-node.js.map +0 -1
  197. package/dist/utils/preview-size.d.ts +0 -1
  198. package/dist/utils/preview-size.d.ts.map +0 -1
  199. package/dist/utils/preview-size.js.map +0 -1
  200. package/dist/utils/use-cancellable-promises.d.ts.map +0 -1
  201. package/dist/utils/use-cancellable-promises.js.map +0 -1
  202. package/dist/utils/use-click-prevention-on-double-click.d.ts.map +0 -1
  203. package/dist/utils/use-click-prevention-on-double-click.js.map +0 -1
  204. package/dist/utils/use-element-size.d.ts.map +0 -1
  205. package/dist/utils/use-element-size.js.map +0 -1
  206. package/dist/utils/validate-playbackrate.d.ts.map +0 -1
  207. package/dist/utils/validate-playbackrate.js.map +0 -1
  208. package/dist/volume-persistance.d.ts.map +0 -1
  209. package/dist/volume-persistance.js.map +0 -1
@@ -4,9 +4,9 @@ exports.PlayerSeekBar = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const remotion_1 = require("remotion");
7
- const use_hover_state_1 = require("./use-hover-state");
8
- const use_player_1 = require("./use-player");
9
- const use_element_size_1 = require("./utils/use-element-size");
7
+ const use_hover_state_js_1 = require("./use-hover-state.js");
8
+ const use_player_js_1 = require("./use-player.js");
9
+ const use_element_size_js_1 = require("./utils/use-element-size.js");
10
10
  const getFrameFromX = (clientX, durationInFrames, width) => {
11
11
  var _a;
12
12
  const pos = clientX;
@@ -30,18 +30,25 @@ const containerStyle = {
30
30
  };
31
31
  const barBackground = {
32
32
  height: BAR_HEIGHT,
33
- backgroundColor: 'rgba(255, 255, 255, 0.5)',
33
+ backgroundColor: 'rgba(255, 255, 255, 0.25)',
34
34
  width: '100%',
35
35
  borderRadius: BAR_HEIGHT / 2,
36
36
  };
37
- const PlayerSeekBar = ({ durationInFrames }) => {
37
+ const findBodyInWhichDivIsLocated = (div) => {
38
+ let current = div;
39
+ while (current.parentElement) {
40
+ current = current.parentElement;
41
+ }
42
+ return current;
43
+ };
44
+ const PlayerSeekBar = ({ durationInFrames, onSeekEnd, onSeekStart, inFrame, outFrame }) => {
38
45
  const containerRef = (0, react_1.useRef)(null);
39
- const barHovered = (0, use_hover_state_1.useHoverState)(containerRef);
40
- const size = (0, use_element_size_1.useElementSize)(containerRef, {
46
+ const barHovered = (0, use_hover_state_js_1.useHoverState)(containerRef);
47
+ const size = (0, use_element_size_js_1.useElementSize)(containerRef, {
41
48
  triggerOnWindowResize: true,
42
49
  shouldApplyCssTransforms: true,
43
50
  });
44
- const { seek, play, pause, playing } = (0, use_player_1.usePlayer)();
51
+ const { seek, play, pause, playing } = (0, use_player_js_1.usePlayer)();
45
52
  const frame = remotion_1.Internals.Timeline.useTimelinePosition();
46
53
  const [dragging, setDragging] = (0, react_1.useState)({
47
54
  dragging: false,
@@ -57,7 +64,8 @@ const PlayerSeekBar = ({ durationInFrames }) => {
57
64
  dragging: true,
58
65
  wasPlaying: playing,
59
66
  });
60
- }, [size, durationInFrames, pause, seek, playing]);
67
+ onSeekStart();
68
+ }, [size, durationInFrames, pause, seek, playing, onSeekStart]);
61
69
  const onPointerMove = (0, react_1.useCallback)((e) => {
62
70
  var _a;
63
71
  if (!size) {
@@ -82,16 +90,18 @@ const PlayerSeekBar = ({ durationInFrames }) => {
82
90
  else {
83
91
  pause();
84
92
  }
85
- }, [dragging, pause, play]);
93
+ onSeekEnd();
94
+ }, [dragging, onSeekEnd, pause, play]);
86
95
  (0, react_1.useEffect)(() => {
87
96
  if (!dragging.dragging) {
88
97
  return;
89
98
  }
90
- window.addEventListener('pointermove', onPointerMove);
91
- window.addEventListener('pointerup', onPointerUp);
99
+ const body = findBodyInWhichDivIsLocated(containerRef.current);
100
+ body.addEventListener('pointermove', onPointerMove);
101
+ body.addEventListener('pointerup', onPointerUp);
92
102
  return () => {
93
- window.removeEventListener('pointermove', onPointerMove);
94
- window.removeEventListener('pointerup', onPointerUp);
103
+ body.removeEventListener('pointermove', onPointerMove);
104
+ body.removeEventListener('pointerup', onPointerUp);
95
105
  };
96
106
  }, [dragging.dragging, onPointerMove, onPointerUp]);
97
107
  const knobStyle = (0, react_1.useMemo)(() => {
@@ -113,10 +123,24 @@ const PlayerSeekBar = ({ durationInFrames }) => {
113
123
  return {
114
124
  height: BAR_HEIGHT,
115
125
  backgroundColor: 'rgba(255, 255, 255, 1)',
116
- width: (frame / (durationInFrames - 1)) * 100 + '%',
126
+ width: ((frame - (inFrame !== null && inFrame !== void 0 ? inFrame : 0)) / (durationInFrames - 1)) * 100 + '%',
127
+ marginLeft: ((inFrame !== null && inFrame !== void 0 ? inFrame : 0) / (durationInFrames - 1)) * 100 + '%',
128
+ borderRadius: BAR_HEIGHT / 2,
129
+ };
130
+ }, [durationInFrames, frame, inFrame]);
131
+ const active = (0, react_1.useMemo)(() => {
132
+ return {
133
+ height: BAR_HEIGHT,
134
+ backgroundColor: 'rgba(255, 255, 255, 0.25)',
135
+ width: (((outFrame !== null && outFrame !== void 0 ? outFrame : durationInFrames - 1) - (inFrame !== null && inFrame !== void 0 ? inFrame : 0)) /
136
+ (durationInFrames - 1)) *
137
+ 100 +
138
+ '%',
139
+ marginLeft: ((inFrame !== null && inFrame !== void 0 ? inFrame : 0) / (durationInFrames - 1)) * 100 + '%',
117
140
  borderRadius: BAR_HEIGHT / 2,
141
+ position: 'absolute',
118
142
  };
119
- }, [durationInFrames, frame]);
120
- return ((0, jsx_runtime_1.jsxs)("div", { ref: containerRef, onPointerDown: onPointerDown, style: containerStyle, children: [(0, jsx_runtime_1.jsx)("div", { style: barBackground, children: (0, jsx_runtime_1.jsx)("div", { style: fillStyle }) }), (0, jsx_runtime_1.jsx)("div", { style: knobStyle })] }));
143
+ }, [durationInFrames, inFrame, outFrame]);
144
+ return ((0, jsx_runtime_1.jsxs)("div", { ref: containerRef, onPointerDown: onPointerDown, style: containerStyle, children: [(0, jsx_runtime_1.jsxs)("div", { style: barBackground, children: [(0, jsx_runtime_1.jsx)("div", { style: active }), (0, jsx_runtime_1.jsx)("div", { style: fillStyle })] }), (0, jsx_runtime_1.jsx)("div", { style: knobStyle })] }));
121
145
  };
122
146
  exports.PlayerSeekBar = PlayerSeekBar;
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import type { PlayerRef } from './player-methods.js';
3
+ import type { RenderFullscreenButton, RenderPlayPauseButton } from './PlayerControls.js';
4
+ export declare type ErrorFallback = (info: {
5
+ error: Error;
6
+ }) => React.ReactNode;
7
+ export declare type RenderLoading = (canvas: {
8
+ height: number;
9
+ width: number;
10
+ }) => React.ReactNode;
11
+ export declare type RenderPoster = RenderLoading;
12
+ declare const _default: React.ForwardRefExoticComponent<{
13
+ controls: boolean;
14
+ loop: boolean;
15
+ autoPlay: boolean;
16
+ allowFullscreen: boolean;
17
+ inputProps: unknown;
18
+ showVolumeControls: boolean;
19
+ style?: React.CSSProperties | undefined;
20
+ clickToPlay: boolean;
21
+ doubleClickToFullscreen: boolean;
22
+ spaceKeyToPlayOrPause: boolean;
23
+ errorFallback: ErrorFallback;
24
+ playbackRate: number;
25
+ renderLoading: RenderLoading | undefined;
26
+ renderPoster: RenderLoading | undefined;
27
+ className: string | undefined;
28
+ moveToBeginningWhenEnded: boolean;
29
+ showPosterWhenPaused: boolean;
30
+ showPosterWhenEnded: boolean;
31
+ showPosterWhenUnplayed: boolean;
32
+ inFrame: number | null;
33
+ outFrame: number | null;
34
+ initiallyShowControls: number | boolean;
35
+ renderPlayPauseButton: RenderPlayPauseButton | null;
36
+ renderFullscreen: RenderFullscreenButton | null;
37
+ alwaysShowControls: boolean;
38
+ } & React.RefAttributes<PlayerRef>>;
39
+ export default _default;
@@ -26,43 +26,43 @@ Object.defineProperty(exports, "__esModule", { value: true });
26
26
  const jsx_runtime_1 = require("react/jsx-runtime");
27
27
  const react_1 = __importStar(require("react"));
28
28
  const remotion_1 = require("remotion");
29
- const calculate_scale_1 = require("./calculate-scale");
30
- const error_boundary_1 = require("./error-boundary");
31
- const player_css_classname_1 = require("./player-css-classname");
32
- const PlayerControls_1 = require("./PlayerControls");
33
- const use_hover_state_1 = require("./use-hover-state");
34
- const use_playback_1 = require("./use-playback");
35
- const use_player_1 = require("./use-player");
36
- const calculate_player_size_1 = require("./utils/calculate-player-size");
37
- const is_node_1 = require("./utils/is-node");
38
- const use_click_prevention_on_double_click_1 = require("./utils/use-click-prevention-on-double-click");
39
- const use_element_size_1 = require("./utils/use-element-size");
29
+ const calculate_scale_js_1 = require("./calculate-scale.js");
30
+ const error_boundary_js_1 = require("./error-boundary.js");
31
+ const player_css_classname_js_1 = require("./player-css-classname.js");
32
+ const PlayerControls_js_1 = require("./PlayerControls.js");
33
+ const use_hover_state_js_1 = require("./use-hover-state.js");
34
+ const use_playback_js_1 = require("./use-playback.js");
35
+ const use_player_js_1 = require("./use-player.js");
36
+ const is_node_js_1 = require("./utils/is-node.js");
37
+ const use_click_prevention_on_double_click_js_1 = require("./utils/use-click-prevention-on-double-click.js");
38
+ const use_element_size_js_1 = require("./utils/use-element-size.js");
40
39
  const reactVersion = react_1.default.version.split('.')[0];
41
40
  if (reactVersion === '0') {
42
41
  throw new Error(`Version ${reactVersion} of "react" is not supported by Remotion`);
43
42
  }
44
43
  const doesReactVersionSupportSuspense = parseInt(reactVersion, 10) >= 18;
45
- const PlayerUI = ({ controls, style, loop, autoPlay, allowFullscreen, inputProps, clickToPlay, showVolumeControls, mediaVolume, mediaMuted, doubleClickToFullscreen, setMediaMuted, setMediaVolume, spaceKeyToPlayOrPause, errorFallback, playbackRate, renderLoading, className, moveToBeginningWhenEnded, }, ref) => {
46
- var _a, _b, _c;
44
+ const PlayerUI = ({ controls, style, loop, autoPlay, allowFullscreen, inputProps, clickToPlay, showVolumeControls, doubleClickToFullscreen, spaceKeyToPlayOrPause, errorFallback, playbackRate, renderLoading, renderPoster, className, moveToBeginningWhenEnded, showPosterWhenUnplayed, showPosterWhenEnded, showPosterWhenPaused, inFrame, outFrame, initiallyShowControls, renderFullscreen: renderFullscreenButton, renderPlayPauseButton, alwaysShowControls, }, ref) => {
45
+ var _a, _b, _c, _d, _e;
47
46
  const config = remotion_1.Internals.useUnsafeVideoConfig();
48
47
  const video = remotion_1.Internals.useVideo();
49
48
  const container = (0, react_1.useRef)(null);
50
- const hovered = (0, use_hover_state_1.useHoverState)(container);
51
- const canvasSize = (0, use_element_size_1.useElementSize)(container, {
49
+ const hovered = (0, use_hover_state_js_1.useHoverState)(container);
50
+ const canvasSize = (0, use_element_size_js_1.useElementSize)(container, {
52
51
  triggerOnWindowResize: false,
53
52
  shouldApplyCssTransforms: false,
54
53
  });
55
54
  const [hasPausedToResume, setHasPausedToResume] = (0, react_1.useState)(false);
56
55
  const [shouldAutoplay, setShouldAutoPlay] = (0, react_1.useState)(autoPlay);
57
56
  const [isFullscreen, setIsFullscreen] = (0, react_1.useState)(() => false);
58
- (0, use_playback_1.usePlayback)({
57
+ const [seeking, setSeeking] = (0, react_1.useState)(false);
58
+ (0, use_playback_js_1.usePlayback)({
59
59
  loop,
60
60
  playbackRate,
61
61
  moveToBeginningWhenEnded,
62
- inFrame: null,
63
- outFrame: null,
62
+ inFrame,
63
+ outFrame,
64
64
  });
65
- const player = (0, use_player_1.usePlayer)();
65
+ const player = (0, use_player_js_1.usePlayer)();
66
66
  (0, react_1.useEffect)(() => {
67
67
  if (hasPausedToResume && !player.playing) {
68
68
  setHasPausedToResume(false);
@@ -119,7 +119,55 @@ const PlayerUI = ({ controls, style, loop, autoPlay, allowFullscreen, inputProps
119
119
  document.exitFullscreen();
120
120
  }
121
121
  }, []);
122
+ (0, react_1.useEffect)(() => {
123
+ const { current } = container;
124
+ if (!current) {
125
+ return;
126
+ }
127
+ const fullscreenChange = () => {
128
+ var _a;
129
+ const element = (_a = document.webkitFullscreenElement) !== null && _a !== void 0 ? _a : document.fullscreenElement;
130
+ if (element && element === container.current) {
131
+ player.emitter.dispatchFullscreenChange({
132
+ isFullscreen: true,
133
+ });
134
+ }
135
+ else {
136
+ player.emitter.dispatchFullscreenChange({
137
+ isFullscreen: false,
138
+ });
139
+ }
140
+ };
141
+ current.addEventListener('webkitfullscreenchange', fullscreenChange);
142
+ current.addEventListener('fullscreenchange', fullscreenChange);
143
+ return () => {
144
+ current.removeEventListener('webkitfullscreenchange', fullscreenChange);
145
+ current.removeEventListener('fullscreenchange', fullscreenChange);
146
+ };
147
+ }, [player.emitter]);
122
148
  const durationInFrames = (_a = config === null || config === void 0 ? void 0 : config.durationInFrames) !== null && _a !== void 0 ? _a : 1;
149
+ const layout = (0, react_1.useMemo)(() => {
150
+ if (!config || !canvasSize) {
151
+ return null;
152
+ }
153
+ return (0, calculate_scale_js_1.calculateCanvasTransformation)({
154
+ canvasSize,
155
+ compositionHeight: config.height,
156
+ compositionWidth: config.width,
157
+ previewSize: 'auto',
158
+ });
159
+ }, [canvasSize, config]);
160
+ const scale = (_b = layout === null || layout === void 0 ? void 0 : layout.scale) !== null && _b !== void 0 ? _b : 1;
161
+ const initialScaleIgnored = (0, react_1.useRef)(false);
162
+ (0, react_1.useEffect)(() => {
163
+ if (!initialScaleIgnored.current) {
164
+ initialScaleIgnored.current = true;
165
+ return;
166
+ }
167
+ player.emitter.dispatchScaleChange(scale);
168
+ }, [player.emitter, scale]);
169
+ const { setMediaVolume, setMediaMuted } = (0, react_1.useContext)(remotion_1.Internals.SetMediaVolumeContext);
170
+ const { mediaMuted, mediaVolume } = (0, react_1.useContext)(remotion_1.Internals.MediaVolumeContext);
123
171
  (0, react_1.useImperativeHandle)(ref, () => {
124
172
  const methods = {
125
173
  play: player.play,
@@ -161,6 +209,7 @@ const PlayerUI = ({ controls, style, loop, autoPlay, allowFullscreen, inputProps
161
209
  throw new TypeError(`setVolume() got a number that is out of range. Must be between 0 and 1, got ${typeof vol}`);
162
210
  }
163
211
  setMediaVolume(vol);
212
+ player.emitter.dispatchVolumeChange(vol);
164
213
  },
165
214
  isMuted: () => mediaMuted || mediaVolume === 0,
166
215
  mute: () => {
@@ -169,6 +218,7 @@ const PlayerUI = ({ controls, style, loop, autoPlay, allowFullscreen, inputProps
169
218
  unmute: () => {
170
219
  setMediaMuted(false);
171
220
  },
221
+ getScale: () => scale,
172
222
  };
173
223
  return Object.assign(player.emitter, methods);
174
224
  }, [
@@ -183,73 +233,18 @@ const PlayerUI = ({ controls, style, loop, autoPlay, allowFullscreen, inputProps
183
233
  setMediaMuted,
184
234
  setMediaVolume,
185
235
  toggle,
236
+ scale,
186
237
  ]);
187
238
  const VideoComponent = video ? video.component : null;
188
239
  const outerStyle = (0, react_1.useMemo)(() => {
189
- if (!config) {
190
- return {};
191
- }
192
- return {
193
- position: 'relative',
194
- overflow: 'hidden',
195
- ...(0, calculate_player_size_1.calculatePlayerSize)({
196
- compositionHeight: config.height,
197
- compositionWidth: config.width,
198
- currentSize: canvasSize,
199
- height: style === null || style === void 0 ? void 0 : style.height,
200
- width: style === null || style === void 0 ? void 0 : style.width,
201
- }),
202
- ...style,
203
- };
240
+ return (0, calculate_scale_js_1.calculateOuterStyle)({ canvasSize, config, style });
204
241
  }, [canvasSize, config, style]);
205
- const layout = (0, react_1.useMemo)(() => {
206
- if (!config || !canvasSize) {
207
- return null;
208
- }
209
- return (0, calculate_scale_1.calculateScale)({
210
- canvasSize,
211
- compositionHeight: config.height,
212
- compositionWidth: config.width,
213
- previewSize: 'auto',
214
- });
215
- }, [canvasSize, config]);
216
242
  const outer = (0, react_1.useMemo)(() => {
217
- if (!layout || !config) {
218
- return {};
219
- }
220
- const { centerX, centerY, scale } = layout;
221
- return {
222
- width: config.width * scale,
223
- height: config.height * scale,
224
- display: 'flex',
225
- flexDirection: 'column',
226
- position: 'absolute',
227
- left: centerX,
228
- top: centerY,
229
- overflow: 'hidden',
230
- };
231
- }, [config, layout]);
243
+ return (0, calculate_scale_js_1.calculateOuter)({ config, layout, scale });
244
+ }, [config, layout, scale]);
232
245
  const containerStyle = (0, react_1.useMemo)(() => {
233
- if (!config || !canvasSize) {
234
- return {};
235
- }
236
- const { scale, xCorrection, yCorrection } = (0, calculate_scale_1.calculateScale)({
237
- canvasSize,
238
- compositionHeight: config.height,
239
- compositionWidth: config.width,
240
- previewSize: 'auto',
241
- });
242
- return {
243
- position: 'absolute',
244
- width: config.width,
245
- height: config.height,
246
- display: 'flex',
247
- transform: `scale(${scale})`,
248
- marginLeft: xCorrection,
249
- marginTop: yCorrection,
250
- overflow: 'hidden',
251
- };
252
- }, [canvasSize, config]);
246
+ return (0, calculate_scale_js_1.calculateContainerStyle)({ canvasSize, config, layout, scale });
247
+ }, [canvasSize, config, layout, scale]);
253
248
  const onError = (0, react_1.useCallback)((error) => {
254
249
  player.pause();
255
250
  // Pay attention to `this context`
@@ -266,6 +261,12 @@ const PlayerUI = ({ controls, style, loop, autoPlay, allowFullscreen, inputProps
266
261
  const onSingleClick = (0, react_1.useCallback)((e) => {
267
262
  toggle(e);
268
263
  }, [toggle]);
264
+ const onSeekStart = (0, react_1.useCallback)(() => {
265
+ setSeeking(true);
266
+ }, []);
267
+ const onSeekEnd = (0, react_1.useCallback)(() => {
268
+ setSeeking(false);
269
+ }, []);
269
270
  const onDoubleClick = (0, react_1.useCallback)(() => {
270
271
  if (isFullscreen) {
271
272
  exitFullscreen();
@@ -274,26 +275,43 @@ const PlayerUI = ({ controls, style, loop, autoPlay, allowFullscreen, inputProps
274
275
  requestFullscreen();
275
276
  }
276
277
  }, [exitFullscreen, isFullscreen, requestFullscreen]);
277
- const [handleClick, handleDoubleClick] = (0, use_click_prevention_on_double_click_1.useClickPreventionOnDoubleClick)(onSingleClick, onDoubleClick, doubleClickToFullscreen);
278
+ const [handleClick, handleDoubleClick] = (0, use_click_prevention_on_double_click_js_1.useClickPreventionOnDoubleClick)(onSingleClick, onDoubleClick, doubleClickToFullscreen);
278
279
  (0, react_1.useEffect)(() => {
279
280
  if (shouldAutoplay) {
280
281
  player.play();
281
282
  setShouldAutoPlay(false);
282
283
  }
283
284
  }, [shouldAutoplay, player]);
285
+ const loadingMarkup = (0, react_1.useMemo)(() => {
286
+ return renderLoading
287
+ ? renderLoading({
288
+ height: outerStyle.height,
289
+ width: outerStyle.width,
290
+ })
291
+ : null;
292
+ }, [outerStyle.height, outerStyle.width, renderLoading]);
284
293
  if (!config) {
285
294
  return null;
286
295
  }
287
- const content = ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { style: outer, onClick: clickToPlay ? handleClick : undefined, onDoubleClick: doubleClickToFullscreen ? handleDoubleClick : undefined, children: (0, jsx_runtime_1.jsx)("div", { style: containerStyle, className: player_css_classname_1.PLAYER_CSS_CLASSNAME, children: VideoComponent ? ((0, jsx_runtime_1.jsx)(error_boundary_1.ErrorBoundary, { onError: onError, errorFallback: errorFallback, children: (0, jsx_runtime_1.jsx)(VideoComponent, { ...((_b = video === null || video === void 0 ? void 0 : video.defaultProps) !== null && _b !== void 0 ? _b : {}), ...((_c = inputProps) !== null && _c !== void 0 ? _c : {}) }) })) : null }) }), controls ? ((0, jsx_runtime_1.jsx)(PlayerControls_1.Controls, { fps: config.fps, durationInFrames: config.durationInFrames, hovered: hovered, player: player, onFullscreenButtonClick: onFullscreenButtonClick, isFullscreen: isFullscreen, allowFullscreen: allowFullscreen, showVolumeControls: showVolumeControls, onExitFullscreenButtonClick: onExitFullscreenButtonClick, spaceKeyToPlayOrPause: spaceKeyToPlayOrPause })) : null] }));
288
- if (is_node_1.IS_NODE && !doesReactVersionSupportSuspense) {
289
- return ((0, jsx_runtime_1.jsx)("div", { ref: container, style: outerStyle, className: className, children: content }));
290
- }
291
- const loadingMarkup = renderLoading
292
- ? renderLoading({
296
+ const poster = renderPoster
297
+ ? renderPoster({
293
298
  height: outerStyle.height,
294
299
  width: outerStyle.width,
295
300
  })
296
301
  : null;
302
+ if (poster === undefined) {
303
+ throw new TypeError('renderPoster() must return a React element, but undefined was returned');
304
+ }
305
+ const shouldShowPoster = poster &&
306
+ [
307
+ showPosterWhenPaused && !player.isPlaying() && !seeking,
308
+ showPosterWhenEnded && player.isLastFrame && !player.isPlaying(),
309
+ showPosterWhenUnplayed && !player.hasPlayed && !player.isPlaying(),
310
+ ].some(Boolean);
311
+ const content = ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { style: outer, onClick: clickToPlay ? handleClick : undefined, onDoubleClick: doubleClickToFullscreen ? handleDoubleClick : undefined, children: (0, jsx_runtime_1.jsx)("div", { style: containerStyle, className: player_css_classname_js_1.PLAYER_CSS_CLASSNAME, children: VideoComponent ? ((0, jsx_runtime_1.jsx)(error_boundary_js_1.ErrorBoundary, { onError: onError, errorFallback: errorFallback, children: (0, jsx_runtime_1.jsx)(VideoComponent, { ...((_c = video === null || video === void 0 ? void 0 : video.defaultProps) !== null && _c !== void 0 ? _c : {}), ...((_d = inputProps) !== null && _d !== void 0 ? _d : {}) }) })) : null }) }), shouldShowPoster ? ((0, jsx_runtime_1.jsx)("div", { style: outer, onClick: clickToPlay ? handleClick : undefined, onDoubleClick: doubleClickToFullscreen ? handleDoubleClick : undefined, children: poster })) : null, controls ? ((0, jsx_runtime_1.jsx)(PlayerControls_js_1.Controls, { fps: config.fps, durationInFrames: config.durationInFrames, hovered: hovered, player: player, onFullscreenButtonClick: onFullscreenButtonClick, isFullscreen: isFullscreen, allowFullscreen: allowFullscreen, showVolumeControls: showVolumeControls, onExitFullscreenButtonClick: onExitFullscreenButtonClick, spaceKeyToPlayOrPause: spaceKeyToPlayOrPause, onSeekEnd: onSeekEnd, onSeekStart: onSeekStart, inFrame: inFrame, outFrame: outFrame, initiallyShowControls: initiallyShowControls, playerWidth: (_e = canvasSize === null || canvasSize === void 0 ? void 0 : canvasSize.width) !== null && _e !== void 0 ? _e : 0, renderFullscreenButton: renderFullscreenButton, renderPlayPauseButton: renderPlayPauseButton, alwaysShowControls: alwaysShowControls })) : null] }));
312
+ if (is_node_js_1.IS_NODE && !doesReactVersionSupportSuspense) {
313
+ return ((0, jsx_runtime_1.jsx)("div", { ref: container, style: outerStyle, className: className, children: content }));
314
+ }
297
315
  return ((0, jsx_runtime_1.jsx)("div", { ref: container, style: outerStyle, className: className, children: (0, jsx_runtime_1.jsx)(react_1.Suspense, { fallback: loadingMarkup, children: content }) }));
298
316
  };
299
317
  exports.default = (0, react_1.forwardRef)(PlayerUI);
@@ -0,0 +1,15 @@
1
+ import type { ComponentType, LazyExoticComponent } from 'react';
2
+ import React from 'react';
3
+ import type { TimelineContextValue } from 'remotion';
4
+ export declare const SharedPlayerContexts: React.FC<{
5
+ children: React.ReactNode;
6
+ timelineContext: TimelineContextValue;
7
+ inputProps?: unknown;
8
+ fps: number;
9
+ compositionWidth: number;
10
+ compositionHeight: number;
11
+ durationInFrames: number;
12
+ component: LazyExoticComponent<ComponentType<unknown>>;
13
+ numberOfSharedAudioTags: number;
14
+ initiallyMuted: boolean;
15
+ }>;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SharedPlayerContexts = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const remotion_1 = require("remotion");
7
+ const volume_persistance_js_1 = require("./volume-persistance.js");
8
+ const SharedPlayerContexts = ({ children, timelineContext, inputProps, fps, compositionHeight, compositionWidth, durationInFrames, component, numberOfSharedAudioTags, initiallyMuted, }) => {
9
+ const compositionManagerContext = (0, react_1.useMemo)(() => {
10
+ return {
11
+ compositions: [
12
+ {
13
+ component: component,
14
+ durationInFrames,
15
+ height: compositionHeight,
16
+ width: compositionWidth,
17
+ fps,
18
+ id: 'player-comp',
19
+ props: inputProps,
20
+ nonce: 777,
21
+ scale: 1,
22
+ folderName: null,
23
+ defaultProps: undefined,
24
+ parentFolderName: null,
25
+ schema: null,
26
+ },
27
+ ],
28
+ folders: [],
29
+ registerFolder: () => undefined,
30
+ unregisterFolder: () => undefined,
31
+ currentComposition: 'player-comp',
32
+ registerComposition: () => undefined,
33
+ registerSequence: () => undefined,
34
+ sequences: [],
35
+ setCurrentComposition: () => undefined,
36
+ unregisterComposition: () => undefined,
37
+ unregisterSequence: () => undefined,
38
+ registerAsset: () => undefined,
39
+ unregisterAsset: () => undefined,
40
+ currentCompositionMetadata: null,
41
+ setCurrentCompositionMetadata: () => undefined,
42
+ assets: [],
43
+ setClipRegion: () => undefined,
44
+ };
45
+ }, [
46
+ component,
47
+ durationInFrames,
48
+ compositionHeight,
49
+ compositionWidth,
50
+ fps,
51
+ inputProps,
52
+ ]);
53
+ const [mediaMuted, setMediaMuted] = (0, react_1.useState)(() => initiallyMuted);
54
+ const [mediaVolume, setMediaVolume] = (0, react_1.useState)(() => (0, volume_persistance_js_1.getPreferredVolume)());
55
+ const mediaVolumeContextValue = (0, react_1.useMemo)(() => {
56
+ return {
57
+ mediaMuted,
58
+ mediaVolume,
59
+ };
60
+ }, [mediaMuted, mediaVolume]);
61
+ const setMediaVolumeAndPersist = (0, react_1.useCallback)((vol) => {
62
+ setMediaVolume(vol);
63
+ (0, volume_persistance_js_1.persistVolume)(vol);
64
+ }, []);
65
+ const setMediaVolumeContextValue = (0, react_1.useMemo)(() => {
66
+ return {
67
+ setMediaMuted,
68
+ setMediaVolume: setMediaVolumeAndPersist,
69
+ };
70
+ }, [setMediaVolumeAndPersist]);
71
+ return ((0, jsx_runtime_1.jsx)(remotion_1.Internals.CanUseRemotionHooksProvider, { children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.Timeline.TimelineContext.Provider, { value: timelineContext, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.CompositionManager.Provider, { value: compositionManagerContext, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.PrefetchProvider, { children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.DurationsContextProvider, { children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.MediaVolumeContext.Provider, { value: mediaVolumeContextValue, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.SetMediaVolumeContext.Provider, { value: setMediaVolumeContextValue, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.SharedAudioContextProvider, { numberOfAudioTags: numberOfSharedAudioTags, component: component, children: children }) }) }) }) }) }) }) }));
72
+ };
73
+ exports.SharedPlayerContexts = SharedPlayerContexts;
@@ -0,0 +1,24 @@
1
+ import type { CSSProperties, MutableRefObject } from 'react';
2
+ import type { CompProps } from 'remotion';
3
+ import type { z } from 'zod';
4
+ import type { ThumbnailMethods } from './player-methods.js';
5
+ import type { ErrorFallback, RenderLoading } from './PlayerUI.js';
6
+ import type { PropsIfHasProps } from './utils/props-if-has-props.js';
7
+ declare type ThumbnailProps<Schema extends z.ZodTypeAny, Props> = PropsIfHasProps<Schema, Props> & CompProps<Schema> & {
8
+ frameToDisplay: number;
9
+ style?: CSSProperties;
10
+ durationInFrames: number;
11
+ compositionWidth: number;
12
+ compositionHeight: number;
13
+ fps: number;
14
+ errorFallback?: ErrorFallback;
15
+ renderLoading?: RenderLoading;
16
+ className?: string;
17
+ };
18
+ export declare const ThumbnailFn: <Schema extends z.ZodTypeAny, Props>({ frameToDisplay, style, inputProps, compositionHeight, compositionWidth, durationInFrames, fps, className, errorFallback, renderLoading, ...componentProps }: ThumbnailProps<Schema, Props>, ref: MutableRefObject<ThumbnailMethods>) => JSX.Element;
19
+ /**
20
+ * @description A component which can be rendered in a regular React App (for example: Create React App, Next.js) to display a single frame of a video.
21
+ * @see [Documentation](https://www.remotion.dev/docs/player/thumbnail)
22
+ */
23
+ export declare const Thumbnail: <Schema extends z.ZodTypeAny, Props>(props: ThumbnailProps<Schema, Props> & import("react").RefAttributes<ThumbnailMethods>) => React.ReactElement | null;
24
+ export {};
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Thumbnail = exports.ThumbnailFn = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = require("react");
9
+ const remotion_1 = require("remotion");
10
+ const emitter_context_js_1 = require("./emitter-context.js");
11
+ const event_emitter_js_1 = require("./event-emitter.js");
12
+ const SharedPlayerContext_js_1 = require("./SharedPlayerContext.js");
13
+ const ThumbnailUI_js_1 = __importDefault(require("./ThumbnailUI.js"));
14
+ const ThumbnailFn = ({ frameToDisplay, style, inputProps, compositionHeight, compositionWidth, durationInFrames, fps, className, errorFallback = () => '⚠️', renderLoading, ...componentProps }, ref) => {
15
+ const [thumbnailId] = (0, react_1.useState)(() => String((0, remotion_1.random)(null)));
16
+ const rootRef = (0, react_1.useRef)(null);
17
+ const timelineState = (0, react_1.useMemo)(() => {
18
+ return {
19
+ playing: false,
20
+ frame: frameToDisplay,
21
+ rootId: thumbnailId,
22
+ imperativePlaying: {
23
+ current: false,
24
+ },
25
+ playbackRate: 1,
26
+ setPlaybackRate: () => {
27
+ throw new Error('thumbnail');
28
+ },
29
+ audioAndVideoTags: { current: [] },
30
+ };
31
+ }, [frameToDisplay, thumbnailId]);
32
+ (0, react_1.useImperativeHandle)(ref, () => rootRef.current, []);
33
+ const Component = remotion_1.Internals.useLazyComponent(componentProps);
34
+ const [emitter] = (0, react_1.useState)(() => new event_emitter_js_1.ThumbnailEmitter());
35
+ const passedInputProps = (0, react_1.useMemo)(() => {
36
+ return inputProps !== null && inputProps !== void 0 ? inputProps : {};
37
+ }, [inputProps]);
38
+ return ((0, jsx_runtime_1.jsx)(remotion_1.Internals.IsPlayerContextProvider, { children: (0, jsx_runtime_1.jsx)(SharedPlayerContext_js_1.SharedPlayerContexts, { timelineContext: timelineState, component: Component, compositionHeight: compositionHeight, compositionWidth: compositionWidth, durationInFrames: durationInFrames, fps: fps, inputProps: inputProps, numberOfSharedAudioTags: 0, initiallyMuted: true, children: (0, jsx_runtime_1.jsx)(emitter_context_js_1.ThumbnailEmitterContext.Provider, { value: emitter, children: (0, jsx_runtime_1.jsx)(ThumbnailUI_js_1.default, { className: className, errorFallback: errorFallback, inputProps: passedInputProps, renderLoading: renderLoading, style: style }) }) }) }));
39
+ };
40
+ exports.ThumbnailFn = ThumbnailFn;
41
+ const forward = react_1.forwardRef;
42
+ /**
43
+ * @description A component which can be rendered in a regular React App (for example: Create React App, Next.js) to display a single frame of a video.
44
+ * @see [Documentation](https://www.remotion.dev/docs/player/thumbnail)
45
+ */
46
+ exports.Thumbnail = forward(exports.ThumbnailFn);
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import type { ThumbnailMethods } from './player-methods.js';
3
+ import type { ErrorFallback, RenderLoading } from './PlayerUI.js';
4
+ declare const _default: React.ForwardRefExoticComponent<{
5
+ inputProps: unknown;
6
+ style?: React.CSSProperties | undefined;
7
+ errorFallback: ErrorFallback;
8
+ renderLoading: RenderLoading | undefined;
9
+ className: string | undefined;
10
+ } & React.RefAttributes<ThumbnailMethods>>;
11
+ export default _default;