@remotion/player 4.0.0-lambda.3 → 4.0.0-newpaths.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.
- package/LICENSE.md +8 -8
- package/README.md +1 -1
- package/dist/cjs/MediaVolumeSlider.d.ts +5 -0
- package/dist/cjs/MediaVolumeSlider.js +118 -0
- package/dist/cjs/Player.d.ts +43 -0
- package/dist/{Player.js → cjs/Player.js} +26 -70
- package/dist/cjs/PlayerControls.d.ts +41 -0
- package/dist/cjs/PlayerControls.js +152 -0
- package/dist/{PlayerSeekBar.d.ts → cjs/PlayerSeekBar.d.ts} +4 -0
- package/dist/{PlayerSeekBar.js → cjs/PlayerSeekBar.js} +35 -11
- package/dist/cjs/PlayerUI.d.ts +38 -0
- package/dist/{PlayerUI.js → cjs/PlayerUI.js} +118 -76
- package/dist/cjs/SharedPlayerContext.d.ts +14 -0
- package/dist/cjs/SharedPlayerContext.js +72 -0
- package/dist/cjs/Thumbnail.d.ts +20 -0
- package/dist/cjs/Thumbnail.js +42 -0
- package/dist/cjs/ThumbnailUI.d.ts +11 -0
- package/dist/cjs/ThumbnailUI.js +107 -0
- package/dist/{calculate-next-frame.d.ts → cjs/calculate-next-frame.d.ts} +0 -0
- package/dist/{calculate-next-frame.js → cjs/calculate-next-frame.js} +0 -0
- package/dist/cjs/calculate-scale.d.ts +39 -0
- package/dist/cjs/calculate-scale.js +85 -0
- package/dist/cjs/emitter-context.d.ts +4 -0
- package/dist/{emitter-context.js → cjs/emitter-context.js} +2 -1
- package/dist/{error-boundary.d.ts → cjs/error-boundary.d.ts} +0 -0
- package/dist/{error-boundary.js → cjs/error-boundary.js} +0 -0
- package/dist/cjs/event-emitter.d.ts +66 -0
- package/dist/{event-emitter.js → cjs/event-emitter.js} +33 -1
- package/dist/{format-time.d.ts → cjs/format-time.d.ts} +0 -0
- package/dist/{format-time.js → cjs/format-time.js} +0 -0
- package/dist/{icons.d.ts → cjs/icons.d.ts} +2 -1
- package/dist/{icons.js → cjs/icons.js} +7 -7
- package/dist/cjs/index.d.ts +61 -0
- package/dist/{index.js → cjs/index.js} +5 -2
- package/dist/{player-css-classname.d.ts → cjs/player-css-classname.d.ts} +0 -1
- package/dist/cjs/player-css-classname.js +4 -0
- package/dist/{player-methods.d.ts → cjs/player-methods.d.ts} +8 -4
- package/dist/{player-methods.js → cjs/player-methods.js} +0 -0
- package/dist/{test → cjs/test}/index.test.d.ts +0 -0
- package/dist/{test → cjs/test}/index.test.js +3 -2
- package/dist/{test → cjs/test}/test-utils.d.ts +2 -2
- package/dist/{test → cjs/test}/test-utils.js +0 -0
- package/dist/{test/validate-prop.test.d.ts → cjs/test/validate-in-out-frames.test.d.ts} +0 -0
- package/dist/cjs/test/validate-in-out-frames.test.js +56 -0
- package/dist/cjs/test/validate-prop.test.d.ts +1 -0
- package/dist/{test → cjs/test}/validate-prop.test.js +24 -23
- package/dist/{use-hover-state.d.ts → cjs/use-hover-state.d.ts} +0 -0
- package/dist/{use-hover-state.js → cjs/use-hover-state.js} +0 -0
- package/dist/cjs/use-playback.d.ts +7 -0
- package/dist/{use-playback.js → cjs/use-playback.js} +7 -3
- package/dist/{use-player.d.ts → cjs/use-player.d.ts} +8 -3
- package/dist/{use-player.js → cjs/use-player.js} +23 -4
- package/dist/cjs/use-thumbnail.d.ts +6 -0
- package/dist/cjs/use-thumbnail.js +18 -0
- package/dist/cjs/use-video-controls-resize.d.ts +7 -0
- package/dist/cjs/use-video-controls-resize.js +36 -0
- package/dist/{utils → cjs/utils}/calculate-player-size.d.ts +2 -2
- package/dist/{utils → cjs/utils}/calculate-player-size.js +0 -0
- package/dist/{utils → cjs/utils}/cancellable-promise.d.ts +0 -0
- package/dist/{utils → cjs/utils}/cancellable-promise.js +0 -0
- package/dist/{utils → cjs/utils}/delay.d.ts +0 -0
- package/dist/{utils → cjs/utils}/delay.js +0 -0
- package/dist/{utils → cjs/utils}/is-node.d.ts +0 -0
- package/dist/{utils → cjs/utils}/is-node.js +0 -0
- package/dist/cjs/utils/preview-size.d.ts +8 -0
- package/dist/{utils → cjs/utils}/preview-size.js +0 -0
- package/dist/cjs/utils/props-if-has-props.d.ts +5 -0
- package/dist/cjs/utils/props-if-has-props.js +2 -0
- package/dist/{utils → cjs/utils}/use-cancellable-promises.d.ts +1 -1
- package/dist/{utils → cjs/utils}/use-cancellable-promises.js +0 -0
- package/dist/{utils → cjs/utils}/use-click-prevention-on-double-click.d.ts +1 -1
- package/dist/{utils → cjs/utils}/use-click-prevention-on-double-click.js +0 -0
- package/dist/{utils → cjs/utils}/use-element-size.d.ts +5 -0
- package/dist/{utils → cjs/utils}/use-element-size.js +9 -1
- package/dist/cjs/utils/validate-in-out-frame.d.ts +6 -0
- package/dist/cjs/utils/validate-in-out-frame.js +54 -0
- package/dist/cjs/utils/validate-initial-frame.d.ts +4 -0
- package/dist/cjs/utils/validate-initial-frame.js +27 -0
- package/dist/{utils → cjs/utils}/validate-playbackrate.d.ts +0 -0
- package/dist/{utils → cjs/utils}/validate-playbackrate.js +0 -0
- package/dist/{volume-persistance.d.ts → cjs/volume-persistance.d.ts} +0 -0
- package/dist/{volume-persistance.js → cjs/volume-persistance.js} +0 -0
- package/dist/esm/MediaVolumeSlider.d.ts +5 -0
- package/dist/esm/MediaVolumeSlider.js +114 -0
- package/dist/esm/Player.d.ts +43 -0
- package/dist/esm/Player.js +136 -0
- package/dist/esm/PlayerControls.d.ts +41 -0
- package/dist/esm/PlayerControls.js +148 -0
- package/dist/esm/PlayerSeekBar.d.ts +8 -0
- package/dist/esm/PlayerSeekBar.js +142 -0
- package/dist/esm/PlayerUI.d.ts +38 -0
- package/dist/esm/PlayerUI.js +283 -0
- package/dist/esm/SharedPlayerContext.d.ts +14 -0
- package/dist/esm/SharedPlayerContext.js +68 -0
- package/dist/esm/Thumbnail.d.ts +20 -0
- package/dist/esm/Thumbnail.js +35 -0
- package/dist/esm/ThumbnailUI.d.ts +11 -0
- package/dist/esm/ThumbnailUI.js +82 -0
- package/dist/esm/calculate-next-frame.d.ts +14 -0
- package/dist/esm/calculate-next-frame.js +24 -0
- package/dist/esm/calculate-scale.d.ts +39 -0
- package/dist/esm/calculate-scale.js +77 -0
- package/dist/esm/emitter-context.d.ts +4 -0
- package/dist/esm/emitter-context.js +3 -0
- package/dist/esm/error-boundary.d.ts +19 -0
- package/dist/esm/error-boundary.js +32 -0
- package/dist/esm/event-emitter.d.ts +66 -0
- package/dist/esm/event-emitter.js +82 -0
- package/dist/esm/format-time.d.ts +1 -0
- package/dist/esm/format-time.js +5 -0
- package/dist/esm/icons.d.ts +10 -0
- package/dist/esm/icons.js +42 -0
- package/dist/esm/index.d.ts +61 -0
- package/dist/esm/index.js +20 -0
- package/dist/esm/player-css-classname.d.ts +1 -0
- package/dist/esm/player-css-classname.js +1 -0
- package/dist/esm/player-methods.d.ts +24 -0
- package/dist/esm/player-methods.js +1 -0
- package/dist/esm/test/index.test.d.ts +1 -0
- package/dist/esm/test/index.test.js +7 -0
- package/dist/esm/test/test-utils.d.ts +6 -0
- package/dist/esm/test/test-utils.js +14 -0
- package/dist/esm/test/validate-in-out-frames.test.d.ts +1 -0
- package/dist/esm/test/validate-in-out-frames.test.js +54 -0
- package/dist/esm/test/validate-prop.test.d.ts +1 -0
- package/dist/esm/test/validate-prop.test.js +129 -0
- package/dist/esm/use-hover-state.d.ts +1 -0
- package/dist/esm/use-hover-state.js +23 -0
- package/dist/esm/use-playback.d.ts +7 -0
- package/dist/esm/use-playback.js +88 -0
- package/dist/esm/use-player.d.ts +19 -0
- package/dist/esm/use-player.js +128 -0
- package/dist/esm/use-thumbnail.d.ts +6 -0
- package/dist/esm/use-thumbnail.js +14 -0
- package/dist/esm/use-video-controls-resize.d.ts +7 -0
- package/dist/esm/use-video-controls-resize.js +32 -0
- package/dist/esm/utils/calculate-player-size.d.ts +9 -0
- package/dist/esm/utils/calculate-player-size.js +25 -0
- package/dist/esm/utils/cancellable-promise.d.ts +5 -0
- package/dist/esm/utils/cancellable-promise.js +22 -0
- package/dist/esm/utils/delay.d.ts +1 -0
- package/dist/esm/utils/delay.js +2 -0
- package/dist/esm/utils/is-node.d.ts +1 -0
- package/dist/esm/utils/is-node.js +1 -0
- package/dist/esm/utils/preview-size.d.ts +8 -0
- package/dist/esm/utils/preview-size.js +1 -0
- package/dist/esm/utils/props-if-has-props.d.ts +5 -0
- package/dist/esm/utils/props-if-has-props.js +1 -0
- package/dist/esm/utils/use-cancellable-promises.d.ts +7 -0
- package/dist/esm/utils/use-cancellable-promises.js +18 -0
- package/dist/esm/utils/use-click-prevention-on-double-click.d.ts +3 -0
- package/dist/esm/utils/use-click-prevention-on-double-click.js +42 -0
- package/dist/esm/utils/use-element-size.d.ts +16 -0
- package/dist/esm/utils/use-element-size.js +93 -0
- package/dist/esm/utils/validate-in-out-frame.d.ts +6 -0
- package/dist/esm/utils/validate-in-out-frame.js +49 -0
- package/dist/esm/utils/validate-initial-frame.d.ts +4 -0
- package/dist/esm/utils/validate-initial-frame.js +23 -0
- package/dist/esm/utils/validate-playbackrate.d.ts +1 -0
- package/dist/esm/utils/validate-playbackrate.js +14 -0
- package/dist/esm/volume-persistance.d.ts +2 -0
- package/dist/esm/volume-persistance.js +14 -0
- package/dist/tsconfig-cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +26 -17
- package/dist/MediaVolumeSlider.d.ts +0 -2
- package/dist/MediaVolumeSlider.d.ts.map +0 -1
- package/dist/MediaVolumeSlider.js +0 -93
- package/dist/MediaVolumeSlider.js.map +0 -1
- package/dist/Player.d.ts +0 -38
- package/dist/Player.d.ts.map +0 -1
- package/dist/Player.js.map +0 -1
- package/dist/PlayerControls.d.ts +0 -14
- package/dist/PlayerControls.d.ts.map +0 -1
- package/dist/PlayerControls.js +0 -87
- package/dist/PlayerControls.js.map +0 -1
- package/dist/PlayerSeekBar.d.ts.map +0 -1
- package/dist/PlayerSeekBar.js.map +0 -1
- package/dist/PlayerUI.d.ts +0 -29
- package/dist/PlayerUI.d.ts.map +0 -1
- package/dist/PlayerUI.js.map +0 -1
- package/dist/calculate-next-frame.d.ts.map +0 -1
- package/dist/calculate-next-frame.js.map +0 -1
- package/dist/calculate-scale.d.ts +0 -14
- package/dist/calculate-scale.d.ts.map +0 -1
- package/dist/calculate-scale.js +0 -24
- package/dist/calculate-scale.js.map +0 -1
- package/dist/emitter-context.d.ts +0 -3
- package/dist/emitter-context.d.ts.map +0 -1
- package/dist/emitter-context.js.map +0 -1
- package/dist/error-boundary.d.ts.map +0 -1
- package/dist/error-boundary.js.map +0 -1
- package/dist/event-emitter.d.ts +0 -42
- package/dist/event-emitter.d.ts.map +0 -1
- package/dist/event-emitter.js.map +0 -1
- package/dist/format-time.d.ts.map +0 -1
- package/dist/format-time.js.map +0 -1
- package/dist/icons.d.ts.map +0 -1
- package/dist/icons.js.map +0 -1
- package/dist/index.d.ts +0 -45
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/player-css-classname.d.ts.map +0 -1
- package/dist/player-css-classname.js +0 -5
- package/dist/player-css-classname.js.map +0 -1
- package/dist/player-methods.d.ts.map +0 -1
- package/dist/player-methods.js.map +0 -1
- package/dist/test/index.test.d.ts.map +0 -1
- package/dist/test/index.test.js.map +0 -1
- package/dist/test/test-utils.d.ts.map +0 -1
- package/dist/test/test-utils.js.map +0 -1
- package/dist/test/validate-prop.test.d.ts.map +0 -1
- package/dist/test/validate-prop.test.js.map +0 -1
- package/dist/use-hover-state.d.ts.map +0 -1
- package/dist/use-hover-state.js.map +0 -1
- package/dist/use-playback.d.ts +0 -4
- package/dist/use-playback.d.ts.map +0 -1
- package/dist/use-playback.js.map +0 -1
- package/dist/use-player.d.ts.map +0 -1
- package/dist/use-player.js.map +0 -1
- package/dist/utils/browser-supports-fullscreen.d.ts +0 -11
- package/dist/utils/browser-supports-fullscreen.d.ts.map +0 -1
- package/dist/utils/browser-supports-fullscreen.js +0 -5
- package/dist/utils/browser-supports-fullscreen.js.map +0 -1
- package/dist/utils/calculate-player-size.d.ts.map +0 -1
- package/dist/utils/calculate-player-size.js.map +0 -1
- package/dist/utils/cancellable-promise.d.ts.map +0 -1
- package/dist/utils/cancellable-promise.js.map +0 -1
- package/dist/utils/delay.d.ts.map +0 -1
- package/dist/utils/delay.js.map +0 -1
- package/dist/utils/is-node.d.ts.map +0 -1
- package/dist/utils/is-node.js.map +0 -1
- package/dist/utils/preview-size.d.ts +0 -1
- package/dist/utils/preview-size.d.ts.map +0 -1
- package/dist/utils/preview-size.js.map +0 -1
- package/dist/utils/use-cancellable-promises.d.ts.map +0 -1
- package/dist/utils/use-cancellable-promises.js.map +0 -1
- package/dist/utils/use-click-prevention-on-double-click.d.ts.map +0 -1
- package/dist/utils/use-click-prevention-on-double-click.js.map +0 -1
- package/dist/utils/use-element-size.d.ts.map +0 -1
- package/dist/utils/use-element-size.js.map +0 -1
- package/dist/utils/validate-playbackrate.d.ts.map +0 -1
- package/dist/utils/validate-playbackrate.js.map +0 -1
- package/dist/volume-persistance.d.ts.map +0 -1
- package/dist/volume-persistance.js.map +0 -1
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { calculatePlayerSize } from './utils/calculate-player-size';
|
|
2
|
+
export const calculateScale = ({ canvasSize, compositionHeight, compositionWidth, previewSize, }) => {
|
|
3
|
+
const heightRatio = canvasSize.height / compositionHeight;
|
|
4
|
+
const widthRatio = canvasSize.width / compositionWidth;
|
|
5
|
+
const ratio = Math.min(heightRatio, widthRatio);
|
|
6
|
+
return previewSize === 'auto' ? ratio : Number(previewSize);
|
|
7
|
+
};
|
|
8
|
+
export const calculateCanvasTransformation = ({ previewSize, compositionWidth, compositionHeight, canvasSize, }) => {
|
|
9
|
+
const scale = calculateScale({
|
|
10
|
+
canvasSize,
|
|
11
|
+
compositionHeight,
|
|
12
|
+
compositionWidth,
|
|
13
|
+
previewSize,
|
|
14
|
+
});
|
|
15
|
+
const correction = 0 - (1 - scale) / 2;
|
|
16
|
+
const xCorrection = correction * compositionWidth;
|
|
17
|
+
const yCorrection = correction * compositionHeight;
|
|
18
|
+
const width = compositionWidth * scale;
|
|
19
|
+
const height = compositionHeight * scale;
|
|
20
|
+
const centerX = canvasSize.width / 2 - width / 2;
|
|
21
|
+
const centerY = canvasSize.height / 2 - height / 2;
|
|
22
|
+
return {
|
|
23
|
+
centerX,
|
|
24
|
+
centerY,
|
|
25
|
+
xCorrection,
|
|
26
|
+
yCorrection,
|
|
27
|
+
scale,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
export const calculateOuterStyle = ({ config, style, canvasSize, }) => {
|
|
31
|
+
if (!config) {
|
|
32
|
+
return {};
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
position: 'relative',
|
|
36
|
+
overflow: 'hidden',
|
|
37
|
+
...calculatePlayerSize({
|
|
38
|
+
compositionHeight: config.height,
|
|
39
|
+
compositionWidth: config.width,
|
|
40
|
+
currentSize: canvasSize,
|
|
41
|
+
height: style === null || style === void 0 ? void 0 : style.height,
|
|
42
|
+
width: style === null || style === void 0 ? void 0 : style.width,
|
|
43
|
+
}),
|
|
44
|
+
...style,
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
export const calculateContainerStyle = ({ config, canvasSize, layout, scale, }) => {
|
|
48
|
+
if (!config || !canvasSize || !layout) {
|
|
49
|
+
return {};
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
position: 'absolute',
|
|
53
|
+
width: config.width,
|
|
54
|
+
height: config.height,
|
|
55
|
+
display: 'flex',
|
|
56
|
+
transform: `scale(${scale})`,
|
|
57
|
+
marginLeft: layout.xCorrection,
|
|
58
|
+
marginTop: layout.yCorrection,
|
|
59
|
+
overflow: 'hidden',
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
export const calculateOuter = ({ layout, scale, config, }) => {
|
|
63
|
+
if (!layout || !config) {
|
|
64
|
+
return {};
|
|
65
|
+
}
|
|
66
|
+
const { centerX, centerY } = layout;
|
|
67
|
+
return {
|
|
68
|
+
width: config.width * scale,
|
|
69
|
+
height: config.height * scale,
|
|
70
|
+
display: 'flex',
|
|
71
|
+
flexDirection: 'column',
|
|
72
|
+
position: 'absolute',
|
|
73
|
+
left: centerX,
|
|
74
|
+
top: centerY,
|
|
75
|
+
overflow: 'hidden',
|
|
76
|
+
};
|
|
77
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { PlayerEmitter, ThumbnailEmitter } from './event-emitter';
|
|
3
|
+
export declare const PlayerEventEmitterContext: React.Context<PlayerEmitter | undefined>;
|
|
4
|
+
export declare const ThumbnailEmitterContext: React.Context<ThumbnailEmitter | undefined>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export declare class ErrorBoundary extends React.Component<{
|
|
3
|
+
onError: (error: Error) => void;
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
errorFallback: (info: {
|
|
6
|
+
error: Error;
|
|
7
|
+
}) => React.ReactNode;
|
|
8
|
+
}, {
|
|
9
|
+
hasError: Error | null;
|
|
10
|
+
}> {
|
|
11
|
+
state: {
|
|
12
|
+
hasError: null;
|
|
13
|
+
};
|
|
14
|
+
static getDerivedStateFromError(error: Error): {
|
|
15
|
+
hasError: Error;
|
|
16
|
+
};
|
|
17
|
+
componentDidCatch(error: Error): void;
|
|
18
|
+
render(): string | number | boolean | JSX.Element | React.ReactFragment | null | undefined;
|
|
19
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
const errorStyle = {
|
|
4
|
+
display: 'flex',
|
|
5
|
+
justifyContent: 'center',
|
|
6
|
+
alignItems: 'center',
|
|
7
|
+
flex: 1,
|
|
8
|
+
height: '100%',
|
|
9
|
+
width: '100%',
|
|
10
|
+
};
|
|
11
|
+
export class ErrorBoundary extends React.Component {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.state = { hasError: null };
|
|
15
|
+
}
|
|
16
|
+
static getDerivedStateFromError(error) {
|
|
17
|
+
// Update state so the next render will show the fallback UI.
|
|
18
|
+
return { hasError: error };
|
|
19
|
+
}
|
|
20
|
+
componentDidCatch(error) {
|
|
21
|
+
this.props.onError(error);
|
|
22
|
+
}
|
|
23
|
+
render() {
|
|
24
|
+
if (this.state.hasError) {
|
|
25
|
+
// You can render any custom fallback UI
|
|
26
|
+
return (_jsx("div", { style: errorStyle, children: this.props.errorFallback({
|
|
27
|
+
error: this.state.hasError,
|
|
28
|
+
}) }));
|
|
29
|
+
}
|
|
30
|
+
return this.props.children;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
declare type SeekPayload = {
|
|
2
|
+
frame: number;
|
|
3
|
+
};
|
|
4
|
+
declare type ErrorPayload = {
|
|
5
|
+
error: Error;
|
|
6
|
+
};
|
|
7
|
+
declare type TimeUpdateEventPayload = {
|
|
8
|
+
frame: number;
|
|
9
|
+
};
|
|
10
|
+
declare type FrameUpdateEventPayload = {
|
|
11
|
+
frame: number;
|
|
12
|
+
};
|
|
13
|
+
declare type RateChangeEventPayload = {
|
|
14
|
+
playbackRate: number;
|
|
15
|
+
};
|
|
16
|
+
declare type FullscreenChangeEventPayload = {
|
|
17
|
+
isFullscreen: boolean;
|
|
18
|
+
};
|
|
19
|
+
declare type PlayerStateEventMap = {
|
|
20
|
+
seeked: SeekPayload;
|
|
21
|
+
pause: undefined;
|
|
22
|
+
play: undefined;
|
|
23
|
+
ratechange: RateChangeEventPayload;
|
|
24
|
+
ended: undefined;
|
|
25
|
+
error: ErrorPayload;
|
|
26
|
+
timeupdate: TimeUpdateEventPayload;
|
|
27
|
+
frameupdate: FrameUpdateEventPayload;
|
|
28
|
+
fullscreenchange: FullscreenChangeEventPayload;
|
|
29
|
+
};
|
|
30
|
+
declare type ThumbnailStateEventMap = {
|
|
31
|
+
error: ErrorPayload;
|
|
32
|
+
};
|
|
33
|
+
export declare type PlayerEventTypes = keyof PlayerStateEventMap;
|
|
34
|
+
export declare type ThumbnailEventTypes = keyof ThumbnailStateEventMap;
|
|
35
|
+
export declare type CallbackListener<T extends PlayerEventTypes> = (data: {
|
|
36
|
+
detail: PlayerStateEventMap[T];
|
|
37
|
+
}) => void;
|
|
38
|
+
declare type PlayerListeners = {
|
|
39
|
+
[EventType in PlayerEventTypes]: CallbackListener<EventType>[];
|
|
40
|
+
};
|
|
41
|
+
declare type ThumbnailListeners = {
|
|
42
|
+
[EventType in ThumbnailEventTypes]: CallbackListener<EventType>[];
|
|
43
|
+
};
|
|
44
|
+
export declare class PlayerEmitter {
|
|
45
|
+
listeners: PlayerListeners;
|
|
46
|
+
addEventListener<Q extends PlayerEventTypes>(name: Q, callback: CallbackListener<Q>): void;
|
|
47
|
+
removeEventListener<Q extends PlayerEventTypes>(name: Q, callback: CallbackListener<Q>): void;
|
|
48
|
+
private dispatchEvent;
|
|
49
|
+
dispatchSeek(frame: number): void;
|
|
50
|
+
dispatchPause(): void;
|
|
51
|
+
dispatchPlay(): void;
|
|
52
|
+
dispatchEnded(): void;
|
|
53
|
+
dispatchRatechange(playbackRate: number): void;
|
|
54
|
+
dispatchError(error: Error): void;
|
|
55
|
+
dispatchTimeUpdate(event: TimeUpdateEventPayload): void;
|
|
56
|
+
dispatchFrameUpdate(event: FrameUpdateEventPayload): void;
|
|
57
|
+
dispatchFullscreenChangeUpdate(event: FullscreenChangeEventPayload): void;
|
|
58
|
+
}
|
|
59
|
+
export declare class ThumbnailEmitter {
|
|
60
|
+
listeners: ThumbnailListeners;
|
|
61
|
+
addEventListener<Q extends ThumbnailEventTypes>(name: Q, callback: CallbackListener<Q>): void;
|
|
62
|
+
removeEventListener<Q extends ThumbnailEventTypes>(name: Q, callback: CallbackListener<Q>): void;
|
|
63
|
+
private dispatchEvent;
|
|
64
|
+
dispatchError(error: Error): void;
|
|
65
|
+
}
|
|
66
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export class PlayerEmitter {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.listeners = {
|
|
4
|
+
ended: [],
|
|
5
|
+
error: [],
|
|
6
|
+
pause: [],
|
|
7
|
+
play: [],
|
|
8
|
+
ratechange: [],
|
|
9
|
+
seeked: [],
|
|
10
|
+
timeupdate: [],
|
|
11
|
+
frameupdate: [],
|
|
12
|
+
fullscreenchange: [],
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
addEventListener(name, callback) {
|
|
16
|
+
this.listeners[name].push(callback);
|
|
17
|
+
}
|
|
18
|
+
removeEventListener(name, callback) {
|
|
19
|
+
this.listeners[name] = this.listeners[name].filter((l) => l !== callback);
|
|
20
|
+
}
|
|
21
|
+
dispatchEvent(dispatchName, context) {
|
|
22
|
+
this.listeners[dispatchName].forEach((callback) => {
|
|
23
|
+
callback({ detail: context });
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
dispatchSeek(frame) {
|
|
27
|
+
this.dispatchEvent('seeked', {
|
|
28
|
+
frame,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
dispatchPause() {
|
|
32
|
+
this.dispatchEvent('pause', undefined);
|
|
33
|
+
}
|
|
34
|
+
dispatchPlay() {
|
|
35
|
+
this.dispatchEvent('play', undefined);
|
|
36
|
+
}
|
|
37
|
+
dispatchEnded() {
|
|
38
|
+
this.dispatchEvent('ended', undefined);
|
|
39
|
+
}
|
|
40
|
+
dispatchRatechange(playbackRate) {
|
|
41
|
+
this.dispatchEvent('ratechange', {
|
|
42
|
+
playbackRate,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
dispatchError(error) {
|
|
46
|
+
this.dispatchEvent('error', {
|
|
47
|
+
error,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
dispatchTimeUpdate(event) {
|
|
51
|
+
this.dispatchEvent('timeupdate', event);
|
|
52
|
+
}
|
|
53
|
+
dispatchFrameUpdate(event) {
|
|
54
|
+
this.dispatchEvent('frameupdate', event);
|
|
55
|
+
}
|
|
56
|
+
dispatchFullscreenChangeUpdate(event) {
|
|
57
|
+
this.dispatchEvent('fullscreenchange', event);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export class ThumbnailEmitter {
|
|
61
|
+
constructor() {
|
|
62
|
+
this.listeners = {
|
|
63
|
+
error: [],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
addEventListener(name, callback) {
|
|
67
|
+
this.listeners[name].push(callback);
|
|
68
|
+
}
|
|
69
|
+
removeEventListener(name, callback) {
|
|
70
|
+
this.listeners[name] = this.listeners[name].filter((l) => l !== callback);
|
|
71
|
+
}
|
|
72
|
+
dispatchEvent(dispatchName, context) {
|
|
73
|
+
this.listeners[dispatchName].forEach((callback) => {
|
|
74
|
+
callback({ detail: context });
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
dispatchError(error) {
|
|
78
|
+
this.dispatchEvent('error', {
|
|
79
|
+
error,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const formatTime: (timeInSeconds: number) => string;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export declare const ICON_SIZE = 25;
|
|
3
|
+
export declare const fullscreenIconSize = 16;
|
|
4
|
+
export declare const PlayIcon: React.FC;
|
|
5
|
+
export declare const PauseIcon: React.FC;
|
|
6
|
+
export declare const FullscreenIcon: React.FC<{
|
|
7
|
+
isFullscreen: boolean;
|
|
8
|
+
}>;
|
|
9
|
+
export declare const VolumeOffIcon: React.FC;
|
|
10
|
+
export declare const VolumeOnIcon: React.FC;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
export const ICON_SIZE = 25;
|
|
3
|
+
export const fullscreenIconSize = 16;
|
|
4
|
+
const rotate = {
|
|
5
|
+
transform: `rotate(90deg)`,
|
|
6
|
+
};
|
|
7
|
+
export const PlayIcon = () => {
|
|
8
|
+
return (_jsx("svg", { width: ICON_SIZE, height: ICON_SIZE, viewBox: "-100 -100 400 400", style: rotate, children: _jsx("path", { fill: "#fff", stroke: "#fff", strokeWidth: "100", strokeLinejoin: "round", d: "M 2 172 a 196 100 0 0 0 195 5 A 196 240 0 0 0 100 2.259 A 196 240 0 0 0 2 172 z" }) }));
|
|
9
|
+
};
|
|
10
|
+
export const PauseIcon = () => {
|
|
11
|
+
return (_jsxs("svg", { viewBox: "0 0 100 100", width: ICON_SIZE, height: ICON_SIZE, children: [_jsx("rect", { x: "25", y: "20", width: "20", height: "60", fill: "#fff", ry: "5", rx: "5" }), _jsx("rect", { x: "55", y: "20", width: "20", height: "60", fill: "#fff", ry: "5", rx: "5" })] }));
|
|
12
|
+
};
|
|
13
|
+
export const FullscreenIcon = ({ isFullscreen, }) => {
|
|
14
|
+
const strokeWidth = 6;
|
|
15
|
+
const viewSize = 32;
|
|
16
|
+
const out = isFullscreen ? 0 : strokeWidth / 2;
|
|
17
|
+
const middleInset = isFullscreen ? strokeWidth * 1.6 : strokeWidth / 2;
|
|
18
|
+
const inset = isFullscreen ? strokeWidth * 1.6 : strokeWidth * 2;
|
|
19
|
+
return (_jsxs("svg", { viewBox: `0 0 ${viewSize} ${viewSize}`, height: fullscreenIconSize, width: fullscreenIconSize, children: [_jsx("path", { d: `
|
|
20
|
+
M ${out} ${inset}
|
|
21
|
+
L ${middleInset} ${middleInset}
|
|
22
|
+
L ${inset} ${out}
|
|
23
|
+
`, stroke: "#fff", strokeWidth: strokeWidth, fill: "none" }), _jsx("path", { d: `
|
|
24
|
+
M ${viewSize - out} ${inset}
|
|
25
|
+
L ${viewSize - middleInset} ${middleInset}
|
|
26
|
+
L ${viewSize - inset} ${out}
|
|
27
|
+
`, stroke: "#fff", strokeWidth: strokeWidth, fill: "none" }), _jsx("path", { d: `
|
|
28
|
+
M ${out} ${viewSize - inset}
|
|
29
|
+
L ${middleInset} ${viewSize - middleInset}
|
|
30
|
+
L ${inset} ${viewSize - out}
|
|
31
|
+
`, stroke: "#fff", strokeWidth: strokeWidth, fill: "none" }), _jsx("path", { d: `
|
|
32
|
+
M ${viewSize - out} ${viewSize - inset}
|
|
33
|
+
L ${viewSize - middleInset} ${viewSize - middleInset}
|
|
34
|
+
L ${viewSize - inset} ${viewSize - out}
|
|
35
|
+
`, stroke: "#fff", strokeWidth: strokeWidth, fill: "none" })] }));
|
|
36
|
+
};
|
|
37
|
+
export const VolumeOffIcon = () => {
|
|
38
|
+
return (_jsx("svg", { width: ICON_SIZE, height: ICON_SIZE, viewBox: "0 0 24 24", children: _jsx("path", { d: "M3.63 3.63a.996.996 0 000 1.41L7.29 8.7 7 9H4c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1h3l3.29 3.29c.63.63 1.71.18 1.71-.71v-4.17l4.18 4.18c-.49.37-1.02.68-1.6.91-.36.15-.58.53-.58.92 0 .72.73 1.18 1.39.91.8-.33 1.55-.77 2.22-1.31l1.34 1.34a.996.996 0 101.41-1.41L5.05 3.63c-.39-.39-1.02-.39-1.42 0zM19 12c0 .82-.15 1.61-.41 2.34l1.53 1.53c.56-1.17.88-2.48.88-3.87 0-3.83-2.4-7.11-5.78-8.4-.59-.23-1.22.23-1.22.86v.19c0 .38.25.71.61.85C17.18 6.54 19 9.06 19 12zm-8.71-6.29l-.17.17L12 7.76V6.41c0-.89-1.08-1.33-1.71-.7zM16.5 12A4.5 4.5 0 0014 7.97v1.79l2.48 2.48c.01-.08.02-.16.02-.24z", fill: "#fff" }) }));
|
|
39
|
+
};
|
|
40
|
+
export const VolumeOnIcon = () => {
|
|
41
|
+
return (_jsx("svg", { width: ICON_SIZE, height: ICON_SIZE, viewBox: "0 0 24 24", children: _jsx("path", { d: "M3 10v4c0 .55.45 1 1 1h3l3.29 3.29c.63.63 1.71.18 1.71-.71V6.41c0-.89-1.08-1.34-1.71-.71L7 9H4c-.55 0-1 .45-1 1zm13.5 2A4.5 4.5 0 0014 7.97v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 4.45v.2c0 .38.25.71.6.85C17.18 6.53 19 9.06 19 12s-1.82 5.47-4.4 6.5c-.36.14-.6.47-.6.85v.2c0 .63.63 1.07 1.21.85C18.6 19.11 21 15.84 21 12s-2.4-7.11-5.79-8.4c-.58-.23-1.21.22-1.21.85z", fill: "#fff" }) }));
|
|
42
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { CallbackListener, PlayerEventTypes } from './event-emitter';
|
|
3
|
+
import { PlayerEmitter } from './event-emitter';
|
|
4
|
+
export { Player, PlayerProps } from './Player';
|
|
5
|
+
export { PlayerMethods, PlayerRef, ThumbnailMethods, ThumbnailRef, } from './player-methods';
|
|
6
|
+
export type { RenderFullscreenButton, RenderPlayPauseButton, } from './PlayerControls';
|
|
7
|
+
export type { ErrorFallback, RenderLoading, RenderPoster } from './PlayerUI';
|
|
8
|
+
export { Thumbnail } from './Thumbnail';
|
|
9
|
+
export { PreviewSize, Translation } from './utils/preview-size';
|
|
10
|
+
export { Size } from './utils/use-element-size';
|
|
11
|
+
export type { CallbackListener, PlayerEventTypes as EventTypes };
|
|
12
|
+
export declare const PlayerInternals: {
|
|
13
|
+
PlayerEventEmitterContext: import("react").Context<PlayerEmitter | undefined>;
|
|
14
|
+
PlayerEmitter: typeof PlayerEmitter;
|
|
15
|
+
usePlayer: () => {
|
|
16
|
+
frameBack: (frames: number) => void;
|
|
17
|
+
frameForward: (frames: number) => void;
|
|
18
|
+
isLastFrame: boolean;
|
|
19
|
+
isFirstFrame: boolean;
|
|
20
|
+
emitter: PlayerEmitter;
|
|
21
|
+
playing: boolean;
|
|
22
|
+
play: (e?: import("react").SyntheticEvent<Element, Event> | undefined) => void;
|
|
23
|
+
pause: () => void;
|
|
24
|
+
pauseAndReturnToPlayStart: () => void;
|
|
25
|
+
seek: (newFrame: number) => void;
|
|
26
|
+
getCurrentFrame: () => number;
|
|
27
|
+
isPlaying: () => boolean;
|
|
28
|
+
hasPlayed: boolean;
|
|
29
|
+
};
|
|
30
|
+
usePlayback: ({ loop, playbackRate, moveToBeginningWhenEnded, inFrame, outFrame, }: {
|
|
31
|
+
loop: boolean;
|
|
32
|
+
playbackRate: number;
|
|
33
|
+
moveToBeginningWhenEnded: boolean;
|
|
34
|
+
inFrame: number | null;
|
|
35
|
+
outFrame: number | null;
|
|
36
|
+
}) => void;
|
|
37
|
+
useElementSize: (ref: import("react").RefObject<HTMLElement>, options: {
|
|
38
|
+
triggerOnWindowResize: boolean;
|
|
39
|
+
shouldApplyCssTransforms: boolean;
|
|
40
|
+
}) => import("./utils/use-element-size").Size | null;
|
|
41
|
+
calculateCanvasTransformation: ({ previewSize, compositionWidth, compositionHeight, canvasSize, }: {
|
|
42
|
+
previewSize: number | "auto";
|
|
43
|
+
compositionWidth: number;
|
|
44
|
+
compositionHeight: number;
|
|
45
|
+
canvasSize: import("./utils/use-element-size").Size;
|
|
46
|
+
}) => {
|
|
47
|
+
centerX: number;
|
|
48
|
+
centerY: number;
|
|
49
|
+
xCorrection: number;
|
|
50
|
+
yCorrection: number;
|
|
51
|
+
scale: number;
|
|
52
|
+
};
|
|
53
|
+
useHoverState: (ref: import("react").RefObject<HTMLDivElement>) => boolean;
|
|
54
|
+
updateAllElementsSizes: () => void;
|
|
55
|
+
calculateScale: ({ canvasSize, compositionHeight, compositionWidth, previewSize, }: {
|
|
56
|
+
previewSize: number | "auto";
|
|
57
|
+
compositionWidth: number;
|
|
58
|
+
compositionHeight: number;
|
|
59
|
+
canvasSize: import("./utils/use-element-size").Size;
|
|
60
|
+
}) => number;
|
|
61
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { calculateCanvasTransformation, calculateScale } from './calculate-scale';
|
|
2
|
+
import { PlayerEventEmitterContext } from './emitter-context';
|
|
3
|
+
import { PlayerEmitter } from './event-emitter';
|
|
4
|
+
import { useHoverState } from './use-hover-state';
|
|
5
|
+
import { usePlayback } from './use-playback';
|
|
6
|
+
import { usePlayer } from './use-player';
|
|
7
|
+
import { updateAllElementsSizes, useElementSize } from './utils/use-element-size';
|
|
8
|
+
export { Player } from './Player';
|
|
9
|
+
export { Thumbnail } from './Thumbnail';
|
|
10
|
+
export const PlayerInternals = {
|
|
11
|
+
PlayerEventEmitterContext,
|
|
12
|
+
PlayerEmitter,
|
|
13
|
+
usePlayer,
|
|
14
|
+
usePlayback,
|
|
15
|
+
useElementSize,
|
|
16
|
+
calculateCanvasTransformation,
|
|
17
|
+
useHoverState,
|
|
18
|
+
updateAllElementsSizes,
|
|
19
|
+
calculateScale,
|
|
20
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const PLAYER_CSS_CLASSNAME = "__remotion-player";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const PLAYER_CSS_CLASSNAME = '__remotion-player';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { SyntheticEvent } from 'react';
|
|
2
|
+
import type { PlayerEmitter } from './event-emitter';
|
|
3
|
+
export declare type ThumbnailMethods = {
|
|
4
|
+
getContainerNode: () => HTMLDivElement | null;
|
|
5
|
+
getScale: () => number;
|
|
6
|
+
};
|
|
7
|
+
export declare type PlayerMethods = ThumbnailMethods & {
|
|
8
|
+
play: (e?: SyntheticEvent) => void;
|
|
9
|
+
pause: () => void;
|
|
10
|
+
toggle: (e?: SyntheticEvent) => void;
|
|
11
|
+
seekTo: (frame: number) => void;
|
|
12
|
+
getCurrentFrame: () => number;
|
|
13
|
+
requestFullscreen: () => void;
|
|
14
|
+
exitFullscreen: () => void;
|
|
15
|
+
isFullscreen: () => void;
|
|
16
|
+
setVolume: (num: number) => void;
|
|
17
|
+
getVolume: () => number;
|
|
18
|
+
isMuted: () => boolean;
|
|
19
|
+
isPlaying: () => boolean;
|
|
20
|
+
mute: () => void;
|
|
21
|
+
unmute: () => void;
|
|
22
|
+
};
|
|
23
|
+
export declare type ThumbnailRef = PlayerEmitter & ThumbnailMethods;
|
|
24
|
+
export declare type PlayerRef = PlayerEmitter & PlayerMethods;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { queries, RenderOptions } from '@testing-library/react';
|
|
2
|
+
import type { FC, ReactElement } from 'react';
|
|
3
|
+
declare const HelloWorld: FC;
|
|
4
|
+
declare const customRender: (ui: ReactElement, options?: Omit<RenderOptions, 'queries'>) => import("@testing-library/react").RenderResult<typeof queries, HTMLElement, HTMLElement>;
|
|
5
|
+
export * from '@testing-library/react';
|
|
6
|
+
export { customRender as render, HelloWorld };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { render } from '@testing-library/react';
|
|
3
|
+
const HelloWorld = () => {
|
|
4
|
+
return _jsx("div", { children: "Hello World" });
|
|
5
|
+
};
|
|
6
|
+
const AllTheProviders = ({ children }) => {
|
|
7
|
+
// overwriting console.error console does not gets poluted with all the errors
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
9
|
+
window.console.error = () => { };
|
|
10
|
+
return _jsx("div", { children: children });
|
|
11
|
+
};
|
|
12
|
+
const customRender = (ui, options) => render(ui, { wrapper: AllTheProviders, ...options });
|
|
13
|
+
export * from '@testing-library/react';
|
|
14
|
+
export { customRender as render, HelloWorld };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { expect, test } from 'vitest';
|
|
2
|
+
import { validateInOutFrames } from '../utils/validate-in-out-frame';
|
|
3
|
+
test('Validate in out frames', () => {
|
|
4
|
+
expect(() => validateInOutFrames({
|
|
5
|
+
durationInFrames: 200,
|
|
6
|
+
inFrame: 201,
|
|
7
|
+
outFrame: undefined,
|
|
8
|
+
})).toThrow(/inFrame must be less than \(durationInFrames - 1\)/);
|
|
9
|
+
expect(() => validateInOutFrames({
|
|
10
|
+
durationInFrames: 200,
|
|
11
|
+
inFrame: 199,
|
|
12
|
+
outFrame: 201,
|
|
13
|
+
})).toThrow(/outFrame must be less than \(durationInFrames - 1\)/);
|
|
14
|
+
expect(() => validateInOutFrames({
|
|
15
|
+
durationInFrames: 200,
|
|
16
|
+
inFrame: -10,
|
|
17
|
+
outFrame: null,
|
|
18
|
+
})).toThrow(/inFrame must be greater than 0, but is -10/);
|
|
19
|
+
expect(() => validateInOutFrames({
|
|
20
|
+
durationInFrames: 200,
|
|
21
|
+
inFrame: null,
|
|
22
|
+
outFrame: -10,
|
|
23
|
+
})).toThrow(/outFrame must be greater than 0, but is -10/);
|
|
24
|
+
expect(() => validateInOutFrames({
|
|
25
|
+
durationInFrames: 200,
|
|
26
|
+
inFrame: 1.5,
|
|
27
|
+
outFrame: null,
|
|
28
|
+
})).toThrow(/"inFrame" must be an integer, but is 1.5/);
|
|
29
|
+
expect(() => validateInOutFrames({
|
|
30
|
+
durationInFrames: 200,
|
|
31
|
+
inFrame: 20,
|
|
32
|
+
outFrame: 20,
|
|
33
|
+
})).toThrow(/outFrame must be greater than inFrame, but is 20/);
|
|
34
|
+
expect(() => validateInOutFrames({
|
|
35
|
+
durationInFrames: 200,
|
|
36
|
+
inFrame: 21,
|
|
37
|
+
outFrame: 20,
|
|
38
|
+
})).toThrow(/outFrame must be greater than inFrame, but is 20 <= 21/);
|
|
39
|
+
expect(() => validateInOutFrames({
|
|
40
|
+
durationInFrames: 200,
|
|
41
|
+
inFrame: null,
|
|
42
|
+
outFrame: 20,
|
|
43
|
+
})).not.toThrow();
|
|
44
|
+
expect(() => validateInOutFrames({
|
|
45
|
+
durationInFrames: 200,
|
|
46
|
+
inFrame: null,
|
|
47
|
+
outFrame: null,
|
|
48
|
+
})).not.toThrow();
|
|
49
|
+
expect(() => validateInOutFrames({
|
|
50
|
+
durationInFrames: 200,
|
|
51
|
+
inFrame: 10,
|
|
52
|
+
outFrame: 20,
|
|
53
|
+
})).not.toThrow();
|
|
54
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|