@remotion/transitions 4.0.490 → 4.0.491
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/dist/TransitionSeries.d.ts +5 -3
- package/dist/TransitionSeries.js +291 -176
- package/dist/esm/index.mjs +357 -218
- package/package.json +8 -8
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import type { FC, PropsWithChildren } from 'react';
|
|
2
|
+
import React from 'react';
|
|
2
3
|
import type { AbsoluteFillLayout, LayoutAndStyle, SequencePropsWithoutDuration } from 'remotion';
|
|
3
4
|
import { NoReactInternals } from 'remotion/no-react';
|
|
4
5
|
import type { TransitionSeriesOverlayProps, TransitionSeriesTransitionProps } from './types.js';
|
|
6
|
+
type TransitionSeriesTransitionComponent = <PresentationProps extends Record<string, unknown>>(props: TransitionSeriesTransitionProps<PresentationProps>) => React.ReactNode;
|
|
5
7
|
type LayoutBasedProps = true extends typeof NoReactInternals.ENABLE_V5_BREAKING_CHANGES ? AbsoluteFillLayout : LayoutAndStyle;
|
|
6
8
|
type SeriesSequenceProps = PropsWithChildren<{
|
|
7
9
|
readonly durationInFrames: number;
|
|
8
10
|
readonly offset?: number;
|
|
9
11
|
readonly className?: string;
|
|
10
|
-
} & LayoutBasedProps & Pick<SequencePropsWithoutDuration, 'name' | 'showInTimeline' | 'freeze'>>;
|
|
12
|
+
} & LayoutBasedProps & Pick<SequencePropsWithoutDuration, 'name' | 'showInTimeline' | 'freeze' | 'hidden'>>;
|
|
11
13
|
export type DrawFunction = (prevImage: ElementImage | null, nextImage: ElementImage | null, progress: number) => void;
|
|
12
14
|
declare const TransitionSeries: FC<SequencePropsWithoutDuration> & {
|
|
13
|
-
Sequence:
|
|
14
|
-
Transition:
|
|
15
|
+
Sequence: FC<SeriesSequenceProps>;
|
|
16
|
+
Transition: TransitionSeriesTransitionComponent;
|
|
15
17
|
Overlay: FC<TransitionSeriesOverlayProps>;
|
|
16
18
|
};
|
|
17
19
|
export { TransitionSeries };
|
package/dist/TransitionSeries.js
CHANGED
|
@@ -1,8 +1,41 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.TransitionSeries = void 0;
|
|
4
37
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
-
const react_1 = require("react");
|
|
38
|
+
const react_1 = __importStar(require("react"));
|
|
6
39
|
const remotion_1 = require("remotion");
|
|
7
40
|
const no_react_1 = require("remotion/no-react");
|
|
8
41
|
const context_js_1 = require("./context.js");
|
|
@@ -10,16 +43,61 @@ const flatten_children_js_1 = require("./flatten-children.js");
|
|
|
10
43
|
const slide_js_1 = require("./presentations/slide.js");
|
|
11
44
|
const validate_js_1 = require("./validate.js");
|
|
12
45
|
const { SequenceWithoutSchema } = remotion_1.Internals;
|
|
13
|
-
const
|
|
46
|
+
const TransitionSeriesTransitionInner = ({ stack = null, _remotionInternalRender = null, ...props }) => {
|
|
47
|
+
if (_remotionInternalRender) {
|
|
48
|
+
return _remotionInternalRender({ ...props, stack });
|
|
49
|
+
}
|
|
14
50
|
return null;
|
|
15
51
|
};
|
|
16
|
-
const
|
|
52
|
+
const transitionSeriesTransitionSchema = {};
|
|
53
|
+
const TransitionSeriesTransition = remotion_1.Interactive.withSchema({
|
|
54
|
+
Component: TransitionSeriesTransitionInner,
|
|
55
|
+
componentName: '<TransitionSeries.Transition>',
|
|
56
|
+
componentIdentity: 'dev.remotion.transitions.TransitionSeries.Transition',
|
|
57
|
+
schema: transitionSeriesTransitionSchema,
|
|
58
|
+
supportsEffects: false,
|
|
59
|
+
});
|
|
60
|
+
const SeriesOverlayInner = ({ stack = null, _remotionInternalRender = null, ...props }) => {
|
|
61
|
+
if (_remotionInternalRender) {
|
|
62
|
+
return _remotionInternalRender({ ...props, stack });
|
|
63
|
+
}
|
|
17
64
|
return null;
|
|
18
65
|
};
|
|
19
|
-
const
|
|
66
|
+
const transitionSeriesOverlaySchema = {};
|
|
67
|
+
const SeriesOverlay = remotion_1.Interactive.withSchema({
|
|
68
|
+
Component: SeriesOverlayInner,
|
|
69
|
+
componentName: '<TransitionSeries.Overlay>',
|
|
70
|
+
componentIdentity: 'dev.remotion.transitions.TransitionSeries.Overlay',
|
|
71
|
+
schema: transitionSeriesOverlaySchema,
|
|
72
|
+
supportsEffects: false,
|
|
73
|
+
});
|
|
74
|
+
const transitionSeriesSequenceSchema = {
|
|
75
|
+
durationInFrames: remotion_1.Internals.durationInFramesField,
|
|
76
|
+
name: remotion_1.Internals.sequenceSchema.name,
|
|
77
|
+
hidden: remotion_1.Internals.sequenceSchema.hidden,
|
|
78
|
+
showInTimeline: remotion_1.Internals.sequenceSchema.showInTimeline,
|
|
79
|
+
freeze: remotion_1.Internals.freezeField,
|
|
80
|
+
layout: remotion_1.Internals.sequenceSchema.layout,
|
|
81
|
+
};
|
|
82
|
+
const SeriesSequenceInner = ({ offset = 0, className = '', stack = null, _remotionInternalRender = null, ...props }) => {
|
|
83
|
+
if (_remotionInternalRender) {
|
|
84
|
+
return _remotionInternalRender({
|
|
85
|
+
...props,
|
|
86
|
+
offset,
|
|
87
|
+
className: className || undefined,
|
|
88
|
+
stack,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
20
91
|
// eslint-disable-next-line react/jsx-no-useless-fragment
|
|
21
|
-
return jsx_runtime_1.jsx(jsx_runtime_1.Fragment, { children: children });
|
|
92
|
+
return jsx_runtime_1.jsx(jsx_runtime_1.Fragment, { children: props.children });
|
|
22
93
|
};
|
|
94
|
+
const SeriesSequence = remotion_1.Interactive.withSchema({
|
|
95
|
+
Component: SeriesSequenceInner,
|
|
96
|
+
componentName: '<TransitionSeries.Sequence>',
|
|
97
|
+
componentIdentity: 'dev.remotion.transitions.TransitionSeries.Sequence',
|
|
98
|
+
schema: transitionSeriesSequenceSchema,
|
|
99
|
+
supportsEffects: false,
|
|
100
|
+
});
|
|
23
101
|
const transitionSeriesSchema = {
|
|
24
102
|
name: remotion_1.Internals.sequenceSchema.name,
|
|
25
103
|
hidden: remotion_1.Internals.sequenceSchema.hidden,
|
|
@@ -67,20 +145,23 @@ const TransitionSeriesChildren = ({ children, }) => {
|
|
|
67
145
|
drawIfSynced(index);
|
|
68
146
|
}, [drawIfSynced]);
|
|
69
147
|
const childrenValue = (0, react_1.useMemo)(() => {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
148
|
+
const renderChildren = (state) => {
|
|
149
|
+
const { index: i, transitionOffsets, startFrame, overlayRenders, sequenceDurations, pendingOverlayValidation, } = state;
|
|
150
|
+
if (i === flattedChildren.length) {
|
|
151
|
+
return overlayRenders.map((info) => {
|
|
152
|
+
var _a, _b;
|
|
153
|
+
return (jsx_runtime_1.jsx(SequenceWithoutSchema, { from: Math.round(info.overlayFrom), durationInFrames: info.durationInFrames, name: "<TS.Overlay>", _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/transitions/transitionseries", _remotionInternalStack: (_a = info.stack) !== null && _a !== void 0 ? _a : undefined, controls: (_b = info.controls) !== null && _b !== void 0 ? _b : undefined, layout: "absolute-fill", children: info.children }, `overlay-${info.index}`));
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
const child = flattedChildren[i];
|
|
79
157
|
const current = child;
|
|
158
|
+
const renderNext = (overrides = {}) => {
|
|
159
|
+
return renderChildren({ ...state, ...overrides, index: i + 1 });
|
|
160
|
+
};
|
|
80
161
|
if (typeof current === 'string') {
|
|
81
162
|
// Don't throw if it's just some accidential whitespace
|
|
82
163
|
if (current.trim() === '') {
|
|
83
|
-
return
|
|
164
|
+
return renderNext();
|
|
84
165
|
}
|
|
85
166
|
throw new TypeError(`The <TransitionSeries /> component only accepts a list of <TransitionSeries.Sequence /> components as its children, but you passed a string "${current}"`);
|
|
86
167
|
}
|
|
@@ -108,49 +189,58 @@ const TransitionSeriesChildren = ({ children, }) => {
|
|
|
108
189
|
if (nextIsTransition) {
|
|
109
190
|
throw new TypeError(`A <TransitionSeries.Overlay /> component must not be followed by a <TransitionSeries.Transition /> component (nth children = ${i} and ${i + 1})`);
|
|
110
191
|
}
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
192
|
+
const castedOverlay = current;
|
|
193
|
+
return react_1.default.cloneElement(castedOverlay, {
|
|
194
|
+
_remotionInternalRender: (overlayProps) => {
|
|
195
|
+
var _a;
|
|
196
|
+
(0, validate_js_1.validateDurationInFrames)(overlayProps.durationInFrames, {
|
|
197
|
+
component: `of a <TransitionSeries.Overlay /> component`,
|
|
198
|
+
allowFloats: false,
|
|
199
|
+
});
|
|
200
|
+
const overlayOffset = (_a = overlayProps.offset) !== null && _a !== void 0 ? _a : 0;
|
|
201
|
+
if (Number.isNaN(overlayOffset)) {
|
|
202
|
+
throw new TypeError(`The "offset" property of a <TransitionSeries.Overlay /> must not be NaN, but got NaN.`);
|
|
203
|
+
}
|
|
204
|
+
if (!Number.isFinite(overlayOffset)) {
|
|
205
|
+
throw new TypeError(`The "offset" property of a <TransitionSeries.Overlay /> must be finite, but got ${overlayOffset}.`);
|
|
206
|
+
}
|
|
207
|
+
if (overlayOffset % 1 !== 0) {
|
|
208
|
+
throw new TypeError(`The "offset" property of a <TransitionSeries.Overlay /> must be an integer, but got ${overlayOffset}.`);
|
|
209
|
+
}
|
|
210
|
+
// Find the previous sequence (the cut point is at startFrame + transitionOffsets)
|
|
211
|
+
const cutPoint = startFrame + transitionOffsets;
|
|
212
|
+
const halfDuration = overlayProps.durationInFrames / 2;
|
|
213
|
+
const overlayFrom = cutPoint - halfDuration + overlayOffset;
|
|
214
|
+
if (overlayFrom < 0) {
|
|
215
|
+
throw new TypeError(`A <TransitionSeries.Overlay /> extends before frame 0. The overlay starts at frame ${overlayFrom}. Reduce the duration or adjust the offset.`);
|
|
216
|
+
}
|
|
217
|
+
// Validate: overlay must not exceed the previous sequence duration
|
|
218
|
+
const prevSeqIdx = sequenceDurations.length - 1;
|
|
219
|
+
if (prevSeqIdx >= 0) {
|
|
220
|
+
const overlayStartInPrev = halfDuration - overlayOffset;
|
|
221
|
+
if (overlayStartInPrev > sequenceDurations[prevSeqIdx]) {
|
|
222
|
+
throw new TypeError(`A <TransitionSeries.Overlay /> extends beyond the previous sequence. The overlay needs ${overlayStartInPrev} frames before the cut, but the previous sequence is only ${sequenceDurations[prevSeqIdx]} frames long.`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Store overlay info for deferred rendering and validate the other
|
|
226
|
+
// side once the next sequence has resolved its interactive props.
|
|
227
|
+
const overlayRender = {
|
|
228
|
+
cutPoint,
|
|
229
|
+
overlayFrom,
|
|
230
|
+
durationInFrames: overlayProps.durationInFrames,
|
|
231
|
+
overlayOffset,
|
|
232
|
+
halfDuration,
|
|
233
|
+
children: overlayProps.children,
|
|
234
|
+
index: i,
|
|
235
|
+
controls: overlayProps.controls,
|
|
236
|
+
stack: overlayProps.stack,
|
|
237
|
+
};
|
|
238
|
+
return renderNext({
|
|
239
|
+
overlayRenders: [...overlayRenders, overlayRender],
|
|
240
|
+
pendingOverlayValidation: true,
|
|
241
|
+
});
|
|
242
|
+
},
|
|
152
243
|
});
|
|
153
|
-
return null;
|
|
154
244
|
}
|
|
155
245
|
if (current.type === TransitionSeriesTransition) {
|
|
156
246
|
if (prevIsTransition) {
|
|
@@ -159,7 +249,15 @@ const TransitionSeriesChildren = ({ children, }) => {
|
|
|
159
249
|
if (prevIsOverlay) {
|
|
160
250
|
throw new TypeError(`A <TransitionSeries.Overlay /> component must not be followed by a <TransitionSeries.Transition /> component (nth children = ${i - 1} and ${i})`);
|
|
161
251
|
}
|
|
162
|
-
|
|
252
|
+
const castedTransition = current;
|
|
253
|
+
return react_1.default.cloneElement(castedTransition, {
|
|
254
|
+
_remotionInternalRender: (transitionProps) => {
|
|
255
|
+
var _a, _b;
|
|
256
|
+
const transitionDuration = transitionProps.timing.getDurationInFrames({ fps });
|
|
257
|
+
const transitionFrom = startFrame + transitionOffsets - transitionDuration;
|
|
258
|
+
return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [transitionDuration > 0 ? (jsx_runtime_1.jsx(SequenceWithoutSchema, { from: transitionFrom, durationInFrames: transitionDuration, name: "<TS.Transition>", _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/transitions/transitionseries", _remotionInternalStack: (_a = transitionProps.stack) !== null && _a !== void 0 ? _a : undefined, controls: (_b = transitionProps.controls) !== null && _b !== void 0 ? _b : undefined, layout: "none" })) : null, renderNext()] }));
|
|
259
|
+
},
|
|
260
|
+
});
|
|
163
261
|
}
|
|
164
262
|
if (current.type !== SeriesSequence) {
|
|
165
263
|
throw new TypeError(`The <TransitionSeries /> component only accepts a list of <TransitionSeries.Sequence />, <TransitionSeries.Transition />, and <TransitionSeries.Overlay /> components as its children, but got ${current} instead`);
|
|
@@ -175,127 +273,144 @@ const TransitionSeriesChildren = ({ children, }) => {
|
|
|
175
273
|
? nextPrev
|
|
176
274
|
: null;
|
|
177
275
|
const castedChildAgain = current;
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
?
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
276
|
+
return react_1.default.cloneElement(castedChildAgain, {
|
|
277
|
+
_remotionInternalRender: (resolvedProps) => {
|
|
278
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
279
|
+
const durationInFramesProp = resolvedProps.durationInFrames;
|
|
280
|
+
const debugInfo = `index = ${i}, duration = ${durationInFramesProp}`;
|
|
281
|
+
const { durationInFrames, children: sequenceChildren, offset: offsetProp, controls, stack, from: _from, ...passedProps } = resolvedProps;
|
|
282
|
+
(0, validate_js_1.validateDurationInFrames)(durationInFramesProp, {
|
|
283
|
+
component: `of a <TransitionSeries.Sequence /> component`,
|
|
284
|
+
allowFloats: true,
|
|
285
|
+
});
|
|
286
|
+
const offset = offsetProp !== null && offsetProp !== void 0 ? offsetProp : 0;
|
|
287
|
+
if (Number.isNaN(offset)) {
|
|
288
|
+
throw new TypeError(`The "offset" property of a <TransitionSeries.Sequence /> must not be NaN, but got NaN (${debugInfo}).`);
|
|
289
|
+
}
|
|
290
|
+
if (!Number.isFinite(offset)) {
|
|
291
|
+
throw new TypeError(`The "offset" property of a <TransitionSeries.Sequence /> must be finite, but got ${offset} (${debugInfo}).`);
|
|
292
|
+
}
|
|
293
|
+
if (offset % 1 !== 0) {
|
|
294
|
+
throw new TypeError(`The "offset" property of a <TransitionSeries.Sequence /> must be finite, but got ${offset} (${debugInfo}).`);
|
|
295
|
+
}
|
|
296
|
+
let resolvedTransitionOffsets = transitionOffsets;
|
|
297
|
+
let resolvedStartFrame = startFrame;
|
|
298
|
+
let resolvedPendingOverlayValidation = pendingOverlayValidation;
|
|
299
|
+
const currentStartFrame = resolvedStartFrame + offset;
|
|
300
|
+
let duration = 0;
|
|
301
|
+
if (prev) {
|
|
302
|
+
duration = prev.props.timing.getDurationInFrames({
|
|
303
|
+
fps,
|
|
304
|
+
});
|
|
305
|
+
resolvedTransitionOffsets -= duration;
|
|
306
|
+
}
|
|
307
|
+
let actualStartFrame = currentStartFrame + resolvedTransitionOffsets;
|
|
308
|
+
resolvedStartFrame += durationInFramesProp + offset;
|
|
309
|
+
// Handle the case where the first item is a transition
|
|
310
|
+
if (actualStartFrame < 0) {
|
|
311
|
+
resolvedStartFrame -= actualStartFrame;
|
|
312
|
+
actualStartFrame = 0;
|
|
313
|
+
}
|
|
314
|
+
// Track resolved durations so later sequences and overlay validation use
|
|
315
|
+
// the live Studio override instead of the original JSX value.
|
|
316
|
+
const nextSequenceDurations = [
|
|
317
|
+
...sequenceDurations,
|
|
318
|
+
durationInFramesProp,
|
|
319
|
+
];
|
|
320
|
+
// Validate: check if a preceding overlay extends beyond this sequence
|
|
321
|
+
if (resolvedPendingOverlayValidation) {
|
|
322
|
+
resolvedPendingOverlayValidation = false;
|
|
323
|
+
const lastOverlay = overlayRenders[overlayRenders.length - 1];
|
|
324
|
+
if (!lastOverlay) {
|
|
325
|
+
throw new Error('Expected an overlay to validate');
|
|
326
|
+
}
|
|
327
|
+
const framesAfterCut = lastOverlay.halfDuration + lastOverlay.overlayOffset;
|
|
328
|
+
if (framesAfterCut > durationInFramesProp) {
|
|
329
|
+
throw new TypeError(`A <TransitionSeries.Overlay /> extends beyond the next sequence. The overlay needs ${framesAfterCut} frames after the cut, but the next sequence is only ${durationInFramesProp} frames long.`);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
const renderSequenceAndRest = (sequence) => {
|
|
333
|
+
return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [sequence, renderNext({
|
|
334
|
+
transitionOffsets: resolvedTransitionOffsets,
|
|
335
|
+
startFrame: resolvedStartFrame,
|
|
336
|
+
sequenceDurations: nextSequenceDurations,
|
|
337
|
+
pendingOverlayValidation: resolvedPendingOverlayValidation,
|
|
338
|
+
})] }));
|
|
339
|
+
};
|
|
340
|
+
const nextProgress = next
|
|
341
|
+
? next.props.timing.getProgress({
|
|
342
|
+
frame: frame -
|
|
343
|
+
actualStartFrame -
|
|
344
|
+
durationInFrames +
|
|
345
|
+
next.props.timing.getDurationInFrames({ fps }),
|
|
346
|
+
fps,
|
|
347
|
+
})
|
|
348
|
+
: null;
|
|
349
|
+
const prevProgress = prev
|
|
350
|
+
? prev.props.timing.getProgress({
|
|
351
|
+
frame: frame - actualStartFrame,
|
|
352
|
+
fps,
|
|
353
|
+
})
|
|
354
|
+
: null;
|
|
355
|
+
if (next &&
|
|
356
|
+
durationInFramesProp < next.props.timing.getDurationInFrames({ fps })) {
|
|
357
|
+
throw new Error(`The duration of a <TransitionSeries.Sequence /> must not be shorter than the duration of the next <TransitionSeries.Transition />. The transition is ${next.props.timing.getDurationInFrames({ fps })} frames long, but the sequence is only ${durationInFramesProp} frames long (${debugInfo})`);
|
|
358
|
+
}
|
|
359
|
+
if (prev &&
|
|
360
|
+
durationInFramesProp < prev.props.timing.getDurationInFrames({ fps })) {
|
|
361
|
+
throw new Error(`The duration of a <TransitionSeries.Sequence /> must not be shorter than the duration of the previous <TransitionSeries.Transition />. The transition is ${prev.props.timing.getDurationInFrames({ fps })} frames long, but the sequence is only ${durationInFramesProp} frames long (${debugInfo})`);
|
|
362
|
+
}
|
|
363
|
+
if (next && prev && nextProgress !== null && prevProgress !== null) {
|
|
364
|
+
const nextPresentation = (_a = next.props.presentation) !== null && _a !== void 0 ? _a : (0, slide_js_1.slide)();
|
|
365
|
+
const prevPresentation = (_b = prev.props.presentation) !== null && _b !== void 0 ? _b : (0, slide_js_1.slide)();
|
|
366
|
+
const UppercaseNextPresentation = nextPresentation.component;
|
|
367
|
+
const UppercasePrevPresentation = prevPresentation.component;
|
|
368
|
+
return renderSequenceAndRest(jsx_runtime_1.jsx(SequenceWithoutSchema, { from: actualStartFrame, durationInFrames: durationInFramesProp, ...passedProps, name: passedProps.name || '<TS.Sequence>', _remotionInternalDocumentationLink: passedProps.name
|
|
369
|
+
? undefined
|
|
370
|
+
: 'https://www.remotion.dev/docs/transitions/transitionseries', _remotionInternalStack: stack !== null && stack !== void 0 ? stack : undefined, controls: controls !== null && controls !== void 0 ? controls : undefined, children: jsx_runtime_1.jsx(UppercaseNextPresentation, { passedProps: (_c = nextPresentation.props) !== null && _c !== void 0 ? _c : {}, presentationDirection: "exiting", presentationProgress: nextProgress, presentationDurationInFrames: next.props.timing.getDurationInFrames({ fps }), onElementImage: () => {
|
|
371
|
+
throw new Error('Should not call when exiting');
|
|
260
372
|
}, onUnmount: () => {
|
|
261
|
-
|
|
373
|
+
throw new Error('Should not call when exiting');
|
|
374
|
+
}, bothEnteringAndExiting: true, children: jsx_runtime_1.jsx(context_js_1.WrapInExitingProgressContext, { presentationProgress: nextProgress, children: jsx_runtime_1.jsx(UppercasePrevPresentation, { passedProps: (_d = prevPresentation.props) !== null && _d !== void 0 ? _d : {}, presentationDirection: "entering", presentationProgress: prevProgress, presentationDurationInFrames: prev.props.timing.getDurationInFrames({ fps }), onElementImage: (elementImage, draw) => {
|
|
375
|
+
onPrevElementImage(elementImage, nextProgress, draw, i + 1);
|
|
376
|
+
onNextElementImage(elementImage, prevProgress, draw, i - 1);
|
|
377
|
+
}, onUnmount: () => {
|
|
378
|
+
onPrevElementImage(null, null, null, i + 1);
|
|
379
|
+
onNextElementImage(null, null, null, i - 1);
|
|
380
|
+
}, bothEnteringAndExiting: true, children: jsx_runtime_1.jsx(context_js_1.WrapInEnteringProgressContext, { presentationProgress: prevProgress, children: sequenceChildren }) }) }) }) }, i));
|
|
381
|
+
}
|
|
382
|
+
if (prevProgress !== null && prev) {
|
|
383
|
+
const prevPresentation = (_e = prev.props.presentation) !== null && _e !== void 0 ? _e : (0, slide_js_1.slide)();
|
|
384
|
+
const UppercasePrevPresentation = prevPresentation.component;
|
|
385
|
+
return renderSequenceAndRest(jsx_runtime_1.jsx(SequenceWithoutSchema, { from: actualStartFrame, durationInFrames: durationInFramesProp, ...passedProps, name: passedProps.name || '<TS.Sequence>', _remotionInternalDocumentationLink: passedProps.name
|
|
386
|
+
? undefined
|
|
387
|
+
: 'https://www.remotion.dev/docs/transitions/transitionseries', _remotionInternalStack: stack !== null && stack !== void 0 ? stack : undefined, controls: controls !== null && controls !== void 0 ? controls : undefined, children: jsx_runtime_1.jsx(UppercasePrevPresentation, { passedProps: (_f = prevPresentation.props) !== null && _f !== void 0 ? _f : {}, presentationDirection: "entering", presentationProgress: prevProgress, presentationDurationInFrames: prev.props.timing.getDurationInFrames({ fps }), onElementImage: (elementImage, draw) => onNextElementImage(elementImage, prevProgress, draw, i - 1), onUnmount: () => {
|
|
262
388
|
onNextElementImage(null, null, null, i - 1);
|
|
263
|
-
}, bothEnteringAndExiting:
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
return (jsx_runtime_1.jsx(SequenceWithoutSchema
|
|
288
|
-
// eslint-disable-next-line react/no-array-index-key
|
|
289
|
-
, { from: actualStartFrame, durationInFrames: durationInFramesProp, ...passedProps, name: passedProps.name || '<TS.Sequence>', _remotionInternalDocumentationLink: passedProps.name
|
|
290
|
-
? undefined
|
|
291
|
-
: 'https://www.remotion.dev/docs/transitions/transitionseries', children: child }, i));
|
|
292
|
-
});
|
|
293
|
-
// Now render overlay sequences
|
|
294
|
-
const overlayElements = overlayRenders.map((overlayInfo) => {
|
|
295
|
-
const info = overlayInfo;
|
|
296
|
-
return (jsx_runtime_1.jsx(SequenceWithoutSchema, { from: Math.round(info.overlayFrom), durationInFrames: info.durationInFrames, name: "<TS.Overlay>", _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/transitions/transitionseries", layout: "absolute-fill", children: info.children }, `overlay-${info.index}`));
|
|
389
|
+
}, bothEnteringAndExiting: false, children: jsx_runtime_1.jsx(context_js_1.WrapInEnteringProgressContext, { presentationProgress: prevProgress, children: sequenceChildren }) }) }, i));
|
|
390
|
+
}
|
|
391
|
+
if (nextProgress !== null && next) {
|
|
392
|
+
const nextPresentation = (_g = next.props.presentation) !== null && _g !== void 0 ? _g : (0, slide_js_1.slide)();
|
|
393
|
+
const UppercaseNextPresentation = nextPresentation.component;
|
|
394
|
+
return renderSequenceAndRest(jsx_runtime_1.jsx(SequenceWithoutSchema, { from: actualStartFrame, durationInFrames: durationInFramesProp, ...passedProps, name: passedProps.name || '<TS.Sequence>', _remotionInternalDocumentationLink: passedProps.name
|
|
395
|
+
? undefined
|
|
396
|
+
: 'https://www.remotion.dev/docs/transitions/transitionseries', _remotionInternalStack: stack !== null && stack !== void 0 ? stack : undefined, controls: controls !== null && controls !== void 0 ? controls : undefined, children: jsx_runtime_1.jsx(UppercaseNextPresentation, { passedProps: (_h = nextPresentation.props) !== null && _h !== void 0 ? _h : {}, presentationDirection: "exiting", presentationProgress: nextProgress, presentationDurationInFrames: next.props.timing.getDurationInFrames({ fps }), onElementImage: (elementImage, draw) => onPrevElementImage(elementImage, nextProgress, draw, i + 1), onUnmount: () => {
|
|
397
|
+
onPrevElementImage(null, null, null, i + 1);
|
|
398
|
+
}, bothEnteringAndExiting: false, children: jsx_runtime_1.jsx(context_js_1.WrapInExitingProgressContext, { presentationProgress: nextProgress, children: sequenceChildren }) }) }, i));
|
|
399
|
+
}
|
|
400
|
+
return renderSequenceAndRest(jsx_runtime_1.jsx(SequenceWithoutSchema, { from: actualStartFrame, durationInFrames: durationInFramesProp, ...passedProps, name: passedProps.name || '<TS.Sequence>', _remotionInternalDocumentationLink: passedProps.name
|
|
401
|
+
? undefined
|
|
402
|
+
: 'https://www.remotion.dev/docs/transitions/transitionseries', _remotionInternalStack: stack !== null && stack !== void 0 ? stack : undefined, controls: controls !== null && controls !== void 0 ? controls : undefined, children: sequenceChildren }, i));
|
|
403
|
+
},
|
|
404
|
+
});
|
|
405
|
+
};
|
|
406
|
+
return renderChildren({
|
|
407
|
+
index: 0,
|
|
408
|
+
transitionOffsets: 0,
|
|
409
|
+
startFrame: 0,
|
|
410
|
+
overlayRenders: [],
|
|
411
|
+
sequenceDurations: [],
|
|
412
|
+
pendingOverlayValidation: false,
|
|
297
413
|
});
|
|
298
|
-
return [...(mainChildren || []), ...overlayElements];
|
|
299
414
|
}, [flattedChildren, fps, frame, onPrevElementImage, onNextElementImage]);
|
|
300
415
|
// eslint-disable-next-line react/jsx-no-useless-fragment
|
|
301
416
|
return jsx_runtime_1.jsx(jsx_runtime_1.Fragment, { children: childrenValue });
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1097,7 +1097,7 @@ var springTiming = (options = {}) => {
|
|
|
1097
1097
|
};
|
|
1098
1098
|
};
|
|
1099
1099
|
// src/TransitionSeries.tsx
|
|
1100
|
-
import {
|
|
1100
|
+
import React4, { useCallback as useCallback2, useMemo as useMemo4, useRef as useRef2 } from "react";
|
|
1101
1101
|
import {
|
|
1102
1102
|
Internals as Internals2,
|
|
1103
1103
|
Interactive,
|
|
@@ -1153,19 +1153,78 @@ import { NoReactInternals } from "remotion/no-react";
|
|
|
1153
1153
|
var validateDurationInFrames = NoReactInternals.validateDurationInFrames;
|
|
1154
1154
|
|
|
1155
1155
|
// src/TransitionSeries.tsx
|
|
1156
|
-
import { jsx as jsx4, Fragment } from "react/jsx-runtime";
|
|
1156
|
+
import { jsx as jsx4, jsxs, Fragment } from "react/jsx-runtime";
|
|
1157
1157
|
var { SequenceWithoutSchema } = Internals2;
|
|
1158
|
-
var
|
|
1158
|
+
var TransitionSeriesTransitionInner = ({
|
|
1159
|
+
stack = null,
|
|
1160
|
+
_remotionInternalRender = null,
|
|
1161
|
+
...props
|
|
1162
|
+
}) => {
|
|
1163
|
+
if (_remotionInternalRender) {
|
|
1164
|
+
return _remotionInternalRender({ ...props, stack });
|
|
1165
|
+
}
|
|
1159
1166
|
return null;
|
|
1160
1167
|
};
|
|
1161
|
-
var
|
|
1168
|
+
var transitionSeriesTransitionSchema = {};
|
|
1169
|
+
var TransitionSeriesTransition = Interactive.withSchema({
|
|
1170
|
+
Component: TransitionSeriesTransitionInner,
|
|
1171
|
+
componentName: "<TransitionSeries.Transition>",
|
|
1172
|
+
componentIdentity: "dev.remotion.transitions.TransitionSeries.Transition",
|
|
1173
|
+
schema: transitionSeriesTransitionSchema,
|
|
1174
|
+
supportsEffects: false
|
|
1175
|
+
});
|
|
1176
|
+
var SeriesOverlayInner = ({
|
|
1177
|
+
stack = null,
|
|
1178
|
+
_remotionInternalRender = null,
|
|
1179
|
+
...props
|
|
1180
|
+
}) => {
|
|
1181
|
+
if (_remotionInternalRender) {
|
|
1182
|
+
return _remotionInternalRender({ ...props, stack });
|
|
1183
|
+
}
|
|
1162
1184
|
return null;
|
|
1163
1185
|
};
|
|
1164
|
-
var
|
|
1186
|
+
var transitionSeriesOverlaySchema = {};
|
|
1187
|
+
var SeriesOverlay = Interactive.withSchema({
|
|
1188
|
+
Component: SeriesOverlayInner,
|
|
1189
|
+
componentName: "<TransitionSeries.Overlay>",
|
|
1190
|
+
componentIdentity: "dev.remotion.transitions.TransitionSeries.Overlay",
|
|
1191
|
+
schema: transitionSeriesOverlaySchema,
|
|
1192
|
+
supportsEffects: false
|
|
1193
|
+
});
|
|
1194
|
+
var transitionSeriesSequenceSchema = {
|
|
1195
|
+
durationInFrames: Internals2.durationInFramesField,
|
|
1196
|
+
name: Internals2.sequenceSchema.name,
|
|
1197
|
+
hidden: Internals2.sequenceSchema.hidden,
|
|
1198
|
+
showInTimeline: Internals2.sequenceSchema.showInTimeline,
|
|
1199
|
+
freeze: Internals2.freezeField,
|
|
1200
|
+
layout: Internals2.sequenceSchema.layout
|
|
1201
|
+
};
|
|
1202
|
+
var SeriesSequenceInner = ({
|
|
1203
|
+
offset = 0,
|
|
1204
|
+
className = "",
|
|
1205
|
+
stack = null,
|
|
1206
|
+
_remotionInternalRender = null,
|
|
1207
|
+
...props
|
|
1208
|
+
}) => {
|
|
1209
|
+
if (_remotionInternalRender) {
|
|
1210
|
+
return _remotionInternalRender({
|
|
1211
|
+
...props,
|
|
1212
|
+
offset,
|
|
1213
|
+
className: className || undefined,
|
|
1214
|
+
stack
|
|
1215
|
+
});
|
|
1216
|
+
}
|
|
1165
1217
|
return /* @__PURE__ */ jsx4(Fragment, {
|
|
1166
|
-
children
|
|
1218
|
+
children: props.children
|
|
1167
1219
|
});
|
|
1168
1220
|
};
|
|
1221
|
+
var SeriesSequence = Interactive.withSchema({
|
|
1222
|
+
Component: SeriesSequenceInner,
|
|
1223
|
+
componentName: "<TransitionSeries.Sequence>",
|
|
1224
|
+
componentIdentity: "dev.remotion.transitions.TransitionSeries.Sequence",
|
|
1225
|
+
schema: transitionSeriesSequenceSchema,
|
|
1226
|
+
supportsEffects: false
|
|
1227
|
+
});
|
|
1169
1228
|
var transitionSeriesSchema = {
|
|
1170
1229
|
name: Internals2.sequenceSchema.name,
|
|
1171
1230
|
hidden: Internals2.sequenceSchema.hidden,
|
|
@@ -1211,16 +1270,35 @@ var TransitionSeriesChildren = ({
|
|
|
1211
1270
|
drawIfSynced(index);
|
|
1212
1271
|
}, [drawIfSynced]);
|
|
1213
1272
|
const childrenValue = useMemo4(() => {
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1273
|
+
const renderChildren = (state) => {
|
|
1274
|
+
const {
|
|
1275
|
+
index: i,
|
|
1276
|
+
transitionOffsets,
|
|
1277
|
+
startFrame,
|
|
1278
|
+
overlayRenders,
|
|
1279
|
+
sequenceDurations,
|
|
1280
|
+
pendingOverlayValidation
|
|
1281
|
+
} = state;
|
|
1282
|
+
if (i === flattedChildren.length) {
|
|
1283
|
+
return overlayRenders.map((info) => /* @__PURE__ */ jsx4(SequenceWithoutSchema, {
|
|
1284
|
+
from: Math.round(info.overlayFrom),
|
|
1285
|
+
durationInFrames: info.durationInFrames,
|
|
1286
|
+
name: "<TS.Overlay>",
|
|
1287
|
+
_remotionInternalDocumentationLink: "https://www.remotion.dev/docs/transitions/transitionseries",
|
|
1288
|
+
_remotionInternalStack: info.stack ?? undefined,
|
|
1289
|
+
controls: info.controls ?? undefined,
|
|
1290
|
+
layout: "absolute-fill",
|
|
1291
|
+
children: info.children
|
|
1292
|
+
}, `overlay-${info.index}`));
|
|
1293
|
+
}
|
|
1294
|
+
const child = flattedChildren[i];
|
|
1220
1295
|
const current = child;
|
|
1296
|
+
const renderNext = (overrides = {}) => {
|
|
1297
|
+
return renderChildren({ ...state, ...overrides, index: i + 1 });
|
|
1298
|
+
};
|
|
1221
1299
|
if (typeof current === "string") {
|
|
1222
1300
|
if (current.trim() === "") {
|
|
1223
|
-
return
|
|
1301
|
+
return renderNext();
|
|
1224
1302
|
}
|
|
1225
1303
|
throw new TypeError(`The <TransitionSeries /> component only accepts a list of <TransitionSeries.Sequence /> components as its children, but you passed a string "${current}"`);
|
|
1226
1304
|
}
|
|
@@ -1239,45 +1317,53 @@ var TransitionSeriesChildren = ({
|
|
|
1239
1317
|
if (nextIsTransition) {
|
|
1240
1318
|
throw new TypeError(`A <TransitionSeries.Overlay /> component must not be followed by a <TransitionSeries.Transition /> component (nth children = ${i} and ${i + 1})`);
|
|
1241
1319
|
}
|
|
1242
|
-
const
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1320
|
+
const castedOverlay = current;
|
|
1321
|
+
return React4.cloneElement(castedOverlay, {
|
|
1322
|
+
_remotionInternalRender: (overlayProps) => {
|
|
1323
|
+
validateDurationInFrames(overlayProps.durationInFrames, {
|
|
1324
|
+
component: `of a <TransitionSeries.Overlay /> component`,
|
|
1325
|
+
allowFloats: false
|
|
1326
|
+
});
|
|
1327
|
+
const overlayOffset = overlayProps.offset ?? 0;
|
|
1328
|
+
if (Number.isNaN(overlayOffset)) {
|
|
1329
|
+
throw new TypeError(`The "offset" property of a <TransitionSeries.Overlay /> must not be NaN, but got NaN.`);
|
|
1330
|
+
}
|
|
1331
|
+
if (!Number.isFinite(overlayOffset)) {
|
|
1332
|
+
throw new TypeError(`The "offset" property of a <TransitionSeries.Overlay /> must be finite, but got ${overlayOffset}.`);
|
|
1333
|
+
}
|
|
1334
|
+
if (overlayOffset % 1 !== 0) {
|
|
1335
|
+
throw new TypeError(`The "offset" property of a <TransitionSeries.Overlay /> must be an integer, but got ${overlayOffset}.`);
|
|
1336
|
+
}
|
|
1337
|
+
const cutPoint = startFrame + transitionOffsets;
|
|
1338
|
+
const halfDuration = overlayProps.durationInFrames / 2;
|
|
1339
|
+
const overlayFrom = cutPoint - halfDuration + overlayOffset;
|
|
1340
|
+
if (overlayFrom < 0) {
|
|
1341
|
+
throw new TypeError(`A <TransitionSeries.Overlay /> extends before frame 0. The overlay starts at frame ${overlayFrom}. Reduce the duration or adjust the offset.`);
|
|
1342
|
+
}
|
|
1343
|
+
const prevSeqIdx = sequenceDurations.length - 1;
|
|
1344
|
+
if (prevSeqIdx >= 0) {
|
|
1345
|
+
const overlayStartInPrev = halfDuration - overlayOffset;
|
|
1346
|
+
if (overlayStartInPrev > sequenceDurations[prevSeqIdx]) {
|
|
1347
|
+
throw new TypeError(`A <TransitionSeries.Overlay /> extends beyond the previous sequence. The overlay needs ${overlayStartInPrev} frames before the cut, but the previous sequence is only ${sequenceDurations[prevSeqIdx]} frames long.`);
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
const overlayRender = {
|
|
1351
|
+
cutPoint,
|
|
1352
|
+
overlayFrom,
|
|
1353
|
+
durationInFrames: overlayProps.durationInFrames,
|
|
1354
|
+
overlayOffset,
|
|
1355
|
+
halfDuration,
|
|
1356
|
+
children: overlayProps.children,
|
|
1357
|
+
index: i,
|
|
1358
|
+
controls: overlayProps.controls,
|
|
1359
|
+
stack: overlayProps.stack
|
|
1360
|
+
};
|
|
1361
|
+
return renderNext({
|
|
1362
|
+
overlayRenders: [...overlayRenders, overlayRender],
|
|
1363
|
+
pendingOverlayValidation: true
|
|
1364
|
+
});
|
|
1268
1365
|
}
|
|
1269
|
-
}
|
|
1270
|
-
pendingOverlayValidation = true;
|
|
1271
|
-
overlayRenders.push({
|
|
1272
|
-
cutPoint,
|
|
1273
|
-
overlayFrom,
|
|
1274
|
-
durationInFrames: overlayProps.durationInFrames,
|
|
1275
|
-
overlayOffset,
|
|
1276
|
-
halfDuration,
|
|
1277
|
-
children: overlayProps.children,
|
|
1278
|
-
index: i
|
|
1279
1366
|
});
|
|
1280
|
-
return null;
|
|
1281
1367
|
}
|
|
1282
1368
|
if (current.type === TransitionSeriesTransition) {
|
|
1283
1369
|
if (prevIsTransition) {
|
|
@@ -1286,7 +1372,27 @@ var TransitionSeriesChildren = ({
|
|
|
1286
1372
|
if (prevIsOverlay) {
|
|
1287
1373
|
throw new TypeError(`A <TransitionSeries.Overlay /> component must not be followed by a <TransitionSeries.Transition /> component (nth children = ${i - 1} and ${i})`);
|
|
1288
1374
|
}
|
|
1289
|
-
|
|
1375
|
+
const castedTransition = current;
|
|
1376
|
+
return React4.cloneElement(castedTransition, {
|
|
1377
|
+
_remotionInternalRender: (transitionProps) => {
|
|
1378
|
+
const transitionDuration = transitionProps.timing.getDurationInFrames({ fps });
|
|
1379
|
+
const transitionFrom = startFrame + transitionOffsets - transitionDuration;
|
|
1380
|
+
return /* @__PURE__ */ jsxs(Fragment, {
|
|
1381
|
+
children: [
|
|
1382
|
+
transitionDuration > 0 ? /* @__PURE__ */ jsx4(SequenceWithoutSchema, {
|
|
1383
|
+
from: transitionFrom,
|
|
1384
|
+
durationInFrames: transitionDuration,
|
|
1385
|
+
name: "<TS.Transition>",
|
|
1386
|
+
_remotionInternalDocumentationLink: "https://www.remotion.dev/docs/transitions/transitionseries",
|
|
1387
|
+
_remotionInternalStack: transitionProps.stack ?? undefined,
|
|
1388
|
+
controls: transitionProps.controls ?? undefined,
|
|
1389
|
+
layout: "none"
|
|
1390
|
+
}) : null,
|
|
1391
|
+
renderNext()
|
|
1392
|
+
]
|
|
1393
|
+
});
|
|
1394
|
+
}
|
|
1395
|
+
});
|
|
1290
1396
|
}
|
|
1291
1397
|
if (current.type !== SeriesSequence) {
|
|
1292
1398
|
throw new TypeError(`The <TransitionSeries /> component only accepts a list of <TransitionSeries.Sequence />, <TransitionSeries.Transition />, and <TransitionSeries.Overlay /> components as its children, but got ${current} instead`);
|
|
@@ -1294,186 +1400,219 @@ var TransitionSeriesChildren = ({
|
|
|
1294
1400
|
const prev = typeof hasPrev === "string" || typeof hasPrev === "undefined" ? null : hasPrev.type === TransitionSeriesTransition ? hasPrev : null;
|
|
1295
1401
|
const next = typeof nextPrev === "string" || typeof nextPrev === "undefined" ? null : nextPrev.type === TransitionSeriesTransition ? nextPrev : null;
|
|
1296
1402
|
const castedChildAgain = current;
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1403
|
+
return React4.cloneElement(castedChildAgain, {
|
|
1404
|
+
_remotionInternalRender: (resolvedProps) => {
|
|
1405
|
+
const durationInFramesProp = resolvedProps.durationInFrames;
|
|
1406
|
+
const debugInfo = `index = ${i}, duration = ${durationInFramesProp}`;
|
|
1407
|
+
const {
|
|
1408
|
+
durationInFrames,
|
|
1409
|
+
children: sequenceChildren,
|
|
1410
|
+
offset: offsetProp,
|
|
1411
|
+
controls,
|
|
1412
|
+
stack,
|
|
1413
|
+
from: _from,
|
|
1414
|
+
...passedProps
|
|
1415
|
+
} = resolvedProps;
|
|
1416
|
+
validateDurationInFrames(durationInFramesProp, {
|
|
1417
|
+
component: `of a <TransitionSeries.Sequence /> component`,
|
|
1418
|
+
allowFloats: true
|
|
1419
|
+
});
|
|
1420
|
+
const offset = offsetProp ?? 0;
|
|
1421
|
+
if (Number.isNaN(offset)) {
|
|
1422
|
+
throw new TypeError(`The "offset" property of a <TransitionSeries.Sequence /> must not be NaN, but got NaN (${debugInfo}).`);
|
|
1423
|
+
}
|
|
1424
|
+
if (!Number.isFinite(offset)) {
|
|
1425
|
+
throw new TypeError(`The "offset" property of a <TransitionSeries.Sequence /> must be finite, but got ${offset} (${debugInfo}).`);
|
|
1426
|
+
}
|
|
1427
|
+
if (offset % 1 !== 0) {
|
|
1428
|
+
throw new TypeError(`The "offset" property of a <TransitionSeries.Sequence /> must be finite, but got ${offset} (${debugInfo}).`);
|
|
1429
|
+
}
|
|
1430
|
+
let resolvedTransitionOffsets = transitionOffsets;
|
|
1431
|
+
let resolvedStartFrame = startFrame;
|
|
1432
|
+
let resolvedPendingOverlayValidation = pendingOverlayValidation;
|
|
1433
|
+
const currentStartFrame = resolvedStartFrame + offset;
|
|
1434
|
+
let duration = 0;
|
|
1435
|
+
if (prev) {
|
|
1436
|
+
duration = prev.props.timing.getDurationInFrames({
|
|
1437
|
+
fps
|
|
1438
|
+
});
|
|
1439
|
+
resolvedTransitionOffsets -= duration;
|
|
1440
|
+
}
|
|
1441
|
+
let actualStartFrame = currentStartFrame + resolvedTransitionOffsets;
|
|
1442
|
+
resolvedStartFrame += durationInFramesProp + offset;
|
|
1443
|
+
if (actualStartFrame < 0) {
|
|
1444
|
+
resolvedStartFrame -= actualStartFrame;
|
|
1445
|
+
actualStartFrame = 0;
|
|
1446
|
+
}
|
|
1447
|
+
const nextSequenceDurations = [
|
|
1448
|
+
...sequenceDurations,
|
|
1449
|
+
durationInFramesProp
|
|
1450
|
+
];
|
|
1451
|
+
if (resolvedPendingOverlayValidation) {
|
|
1452
|
+
resolvedPendingOverlayValidation = false;
|
|
1453
|
+
const lastOverlay = overlayRenders[overlayRenders.length - 1];
|
|
1454
|
+
if (!lastOverlay) {
|
|
1455
|
+
throw new Error("Expected an overlay to validate");
|
|
1456
|
+
}
|
|
1457
|
+
const framesAfterCut = lastOverlay.halfDuration + lastOverlay.overlayOffset;
|
|
1458
|
+
if (framesAfterCut > durationInFramesProp) {
|
|
1459
|
+
throw new TypeError(`A <TransitionSeries.Overlay /> extends beyond the next sequence. The overlay needs ${framesAfterCut} frames after the cut, but the next sequence is only ${durationInFramesProp} frames long.`);
|
|
1460
|
+
}
|
|
1461
|
+
}
|
|
1462
|
+
const renderSequenceAndRest = (sequence) => {
|
|
1463
|
+
return /* @__PURE__ */ jsxs(Fragment, {
|
|
1464
|
+
children: [
|
|
1465
|
+
sequence,
|
|
1466
|
+
renderNext({
|
|
1467
|
+
transitionOffsets: resolvedTransitionOffsets,
|
|
1468
|
+
startFrame: resolvedStartFrame,
|
|
1469
|
+
sequenceDurations: nextSequenceDurations,
|
|
1470
|
+
pendingOverlayValidation: resolvedPendingOverlayValidation
|
|
1471
|
+
})
|
|
1472
|
+
]
|
|
1473
|
+
});
|
|
1474
|
+
};
|
|
1475
|
+
const nextProgress = next ? next.props.timing.getProgress({
|
|
1476
|
+
frame: frame - actualStartFrame - durationInFrames + next.props.timing.getDurationInFrames({ fps }),
|
|
1477
|
+
fps
|
|
1478
|
+
}) : null;
|
|
1479
|
+
const prevProgress = prev ? prev.props.timing.getProgress({
|
|
1480
|
+
frame: frame - actualStartFrame,
|
|
1481
|
+
fps
|
|
1482
|
+
}) : null;
|
|
1483
|
+
if (next && durationInFramesProp < next.props.timing.getDurationInFrames({ fps })) {
|
|
1484
|
+
throw new Error(`The duration of a <TransitionSeries.Sequence /> must not be shorter than the duration of the next <TransitionSeries.Transition />. The transition is ${next.props.timing.getDurationInFrames({ fps })} frames long, but the sequence is only ${durationInFramesProp} frames long (${debugInfo})`);
|
|
1485
|
+
}
|
|
1486
|
+
if (prev && durationInFramesProp < prev.props.timing.getDurationInFrames({ fps })) {
|
|
1487
|
+
throw new Error(`The duration of a <TransitionSeries.Sequence /> must not be shorter than the duration of the previous <TransitionSeries.Transition />. The transition is ${prev.props.timing.getDurationInFrames({ fps })} frames long, but the sequence is only ${durationInFramesProp} frames long (${debugInfo})`);
|
|
1488
|
+
}
|
|
1489
|
+
if (next && prev && nextProgress !== null && prevProgress !== null) {
|
|
1490
|
+
const nextPresentation = next.props.presentation ?? slide();
|
|
1491
|
+
const prevPresentation = prev.props.presentation ?? slide();
|
|
1492
|
+
const UppercaseNextPresentation = nextPresentation.component;
|
|
1493
|
+
const UppercasePrevPresentation = prevPresentation.component;
|
|
1494
|
+
return renderSequenceAndRest(/* @__PURE__ */ jsx4(SequenceWithoutSchema, {
|
|
1495
|
+
from: actualStartFrame,
|
|
1496
|
+
durationInFrames: durationInFramesProp,
|
|
1497
|
+
...passedProps,
|
|
1498
|
+
name: passedProps.name || "<TS.Sequence>",
|
|
1499
|
+
_remotionInternalDocumentationLink: passedProps.name ? undefined : "https://www.remotion.dev/docs/transitions/transitionseries",
|
|
1500
|
+
_remotionInternalStack: stack ?? undefined,
|
|
1501
|
+
controls: controls ?? undefined,
|
|
1502
|
+
children: /* @__PURE__ */ jsx4(UppercaseNextPresentation, {
|
|
1503
|
+
passedProps: nextPresentation.props ?? {},
|
|
1504
|
+
presentationDirection: "exiting",
|
|
1505
|
+
presentationProgress: nextProgress,
|
|
1506
|
+
presentationDurationInFrames: next.props.timing.getDurationInFrames({ fps }),
|
|
1507
|
+
onElementImage: () => {
|
|
1508
|
+
throw new Error("Should not call when exiting");
|
|
1509
|
+
},
|
|
1510
|
+
onUnmount: () => {
|
|
1511
|
+
throw new Error("Should not call when exiting");
|
|
1512
|
+
},
|
|
1513
|
+
bothEnteringAndExiting: true,
|
|
1514
|
+
children: /* @__PURE__ */ jsx4(WrapInExitingProgressContext, {
|
|
1515
|
+
presentationProgress: nextProgress,
|
|
1516
|
+
children: /* @__PURE__ */ jsx4(UppercasePrevPresentation, {
|
|
1517
|
+
passedProps: prevPresentation.props ?? {},
|
|
1518
|
+
presentationDirection: "entering",
|
|
1519
|
+
presentationProgress: prevProgress,
|
|
1520
|
+
presentationDurationInFrames: prev.props.timing.getDurationInFrames({ fps }),
|
|
1521
|
+
onElementImage: (elementImage, draw) => {
|
|
1522
|
+
onPrevElementImage(elementImage, nextProgress, draw, i + 1);
|
|
1523
|
+
onNextElementImage(elementImage, prevProgress, draw, i - 1);
|
|
1524
|
+
},
|
|
1525
|
+
onUnmount: () => {
|
|
1526
|
+
onPrevElementImage(null, null, null, i + 1);
|
|
1527
|
+
onNextElementImage(null, null, null, i - 1);
|
|
1528
|
+
},
|
|
1529
|
+
bothEnteringAndExiting: true,
|
|
1530
|
+
children: /* @__PURE__ */ jsx4(WrapInEnteringProgressContext, {
|
|
1531
|
+
presentationProgress: prevProgress,
|
|
1532
|
+
children: sequenceChildren
|
|
1533
|
+
})
|
|
1534
|
+
})
|
|
1535
|
+
})
|
|
1536
|
+
})
|
|
1537
|
+
}, i));
|
|
1538
|
+
}
|
|
1539
|
+
if (prevProgress !== null && prev) {
|
|
1540
|
+
const prevPresentation = prev.props.presentation ?? slide();
|
|
1541
|
+
const UppercasePrevPresentation = prevPresentation.component;
|
|
1542
|
+
return renderSequenceAndRest(/* @__PURE__ */ jsx4(SequenceWithoutSchema, {
|
|
1543
|
+
from: actualStartFrame,
|
|
1544
|
+
durationInFrames: durationInFramesProp,
|
|
1545
|
+
...passedProps,
|
|
1546
|
+
name: passedProps.name || "<TS.Sequence>",
|
|
1547
|
+
_remotionInternalDocumentationLink: passedProps.name ? undefined : "https://www.remotion.dev/docs/transitions/transitionseries",
|
|
1548
|
+
_remotionInternalStack: stack ?? undefined,
|
|
1549
|
+
controls: controls ?? undefined,
|
|
1381
1550
|
children: /* @__PURE__ */ jsx4(UppercasePrevPresentation, {
|
|
1382
1551
|
passedProps: prevPresentation.props ?? {},
|
|
1383
1552
|
presentationDirection: "entering",
|
|
1384
1553
|
presentationProgress: prevProgress,
|
|
1385
1554
|
presentationDurationInFrames: prev.props.timing.getDurationInFrames({ fps }),
|
|
1386
|
-
onElementImage: (elementImage, draw) =>
|
|
1387
|
-
onPrevElementImage(elementImage, nextProgress, draw, i + 1);
|
|
1388
|
-
onNextElementImage(elementImage, prevProgress, draw, i - 1);
|
|
1389
|
-
},
|
|
1555
|
+
onElementImage: (elementImage, draw) => onNextElementImage(elementImage, prevProgress, draw, i - 1),
|
|
1390
1556
|
onUnmount: () => {
|
|
1391
|
-
onPrevElementImage(null, null, null, i + 1);
|
|
1392
1557
|
onNextElementImage(null, null, null, i - 1);
|
|
1393
1558
|
},
|
|
1394
|
-
bothEnteringAndExiting:
|
|
1559
|
+
bothEnteringAndExiting: false,
|
|
1395
1560
|
children: /* @__PURE__ */ jsx4(WrapInEnteringProgressContext, {
|
|
1396
1561
|
presentationProgress: prevProgress,
|
|
1397
|
-
children:
|
|
1562
|
+
children: sequenceChildren
|
|
1398
1563
|
})
|
|
1399
1564
|
})
|
|
1400
|
-
})
|
|
1401
|
-
}
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
presentationProgress: nextProgress,
|
|
1451
|
-
children: child
|
|
1452
|
-
})
|
|
1453
|
-
})
|
|
1454
|
-
}, i);
|
|
1455
|
-
}
|
|
1456
|
-
return /* @__PURE__ */ jsx4(SequenceWithoutSchema, {
|
|
1457
|
-
from: actualStartFrame,
|
|
1458
|
-
durationInFrames: durationInFramesProp,
|
|
1459
|
-
...passedProps,
|
|
1460
|
-
name: passedProps.name || "<TS.Sequence>",
|
|
1461
|
-
_remotionInternalDocumentationLink: passedProps.name ? undefined : "https://www.remotion.dev/docs/transitions/transitionseries",
|
|
1462
|
-
children: child
|
|
1463
|
-
}, i);
|
|
1464
|
-
});
|
|
1465
|
-
const overlayElements = overlayRenders.map((overlayInfo) => {
|
|
1466
|
-
const info = overlayInfo;
|
|
1467
|
-
return /* @__PURE__ */ jsx4(SequenceWithoutSchema, {
|
|
1468
|
-
from: Math.round(info.overlayFrom),
|
|
1469
|
-
durationInFrames: info.durationInFrames,
|
|
1470
|
-
name: "<TS.Overlay>",
|
|
1471
|
-
_remotionInternalDocumentationLink: "https://www.remotion.dev/docs/transitions/transitionseries",
|
|
1472
|
-
layout: "absolute-fill",
|
|
1473
|
-
children: info.children
|
|
1474
|
-
}, `overlay-${info.index}`);
|
|
1565
|
+
}, i));
|
|
1566
|
+
}
|
|
1567
|
+
if (nextProgress !== null && next) {
|
|
1568
|
+
const nextPresentation = next.props.presentation ?? slide();
|
|
1569
|
+
const UppercaseNextPresentation = nextPresentation.component;
|
|
1570
|
+
return renderSequenceAndRest(/* @__PURE__ */ jsx4(SequenceWithoutSchema, {
|
|
1571
|
+
from: actualStartFrame,
|
|
1572
|
+
durationInFrames: durationInFramesProp,
|
|
1573
|
+
...passedProps,
|
|
1574
|
+
name: passedProps.name || "<TS.Sequence>",
|
|
1575
|
+
_remotionInternalDocumentationLink: passedProps.name ? undefined : "https://www.remotion.dev/docs/transitions/transitionseries",
|
|
1576
|
+
_remotionInternalStack: stack ?? undefined,
|
|
1577
|
+
controls: controls ?? undefined,
|
|
1578
|
+
children: /* @__PURE__ */ jsx4(UppercaseNextPresentation, {
|
|
1579
|
+
passedProps: nextPresentation.props ?? {},
|
|
1580
|
+
presentationDirection: "exiting",
|
|
1581
|
+
presentationProgress: nextProgress,
|
|
1582
|
+
presentationDurationInFrames: next.props.timing.getDurationInFrames({ fps }),
|
|
1583
|
+
onElementImage: (elementImage, draw) => onPrevElementImage(elementImage, nextProgress, draw, i + 1),
|
|
1584
|
+
onUnmount: () => {
|
|
1585
|
+
onPrevElementImage(null, null, null, i + 1);
|
|
1586
|
+
},
|
|
1587
|
+
bothEnteringAndExiting: false,
|
|
1588
|
+
children: /* @__PURE__ */ jsx4(WrapInExitingProgressContext, {
|
|
1589
|
+
presentationProgress: nextProgress,
|
|
1590
|
+
children: sequenceChildren
|
|
1591
|
+
})
|
|
1592
|
+
})
|
|
1593
|
+
}, i));
|
|
1594
|
+
}
|
|
1595
|
+
return renderSequenceAndRest(/* @__PURE__ */ jsx4(SequenceWithoutSchema, {
|
|
1596
|
+
from: actualStartFrame,
|
|
1597
|
+
durationInFrames: durationInFramesProp,
|
|
1598
|
+
...passedProps,
|
|
1599
|
+
name: passedProps.name || "<TS.Sequence>",
|
|
1600
|
+
_remotionInternalDocumentationLink: passedProps.name ? undefined : "https://www.remotion.dev/docs/transitions/transitionseries",
|
|
1601
|
+
_remotionInternalStack: stack ?? undefined,
|
|
1602
|
+
controls: controls ?? undefined,
|
|
1603
|
+
children: sequenceChildren
|
|
1604
|
+
}, i));
|
|
1605
|
+
}
|
|
1606
|
+
});
|
|
1607
|
+
};
|
|
1608
|
+
return renderChildren({
|
|
1609
|
+
index: 0,
|
|
1610
|
+
transitionOffsets: 0,
|
|
1611
|
+
startFrame: 0,
|
|
1612
|
+
overlayRenders: [],
|
|
1613
|
+
sequenceDurations: [],
|
|
1614
|
+
pendingOverlayValidation: false
|
|
1475
1615
|
});
|
|
1476
|
-
return [...mainChildren || [], ...overlayElements];
|
|
1477
1616
|
}, [flattedChildren, fps, frame, onPrevElementImage, onNextElementImage]);
|
|
1478
1617
|
return /* @__PURE__ */ jsx4(Fragment, {
|
|
1479
1618
|
children: childrenValue
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"url": "https://github.com/remotion-dev/remotion/tree/main/packages/transitions"
|
|
4
4
|
},
|
|
5
5
|
"name": "@remotion/transitions",
|
|
6
|
-
"version": "4.0.
|
|
6
|
+
"version": "4.0.491",
|
|
7
7
|
"description": "Library for creating transitions in Remotion",
|
|
8
8
|
"main": "dist/esm/index.mjs",
|
|
9
9
|
"module": "dist/esm/index.js",
|
|
@@ -22,18 +22,18 @@
|
|
|
22
22
|
"url": "https://github.com/remotion-dev/remotion/issues"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"remotion": "4.0.
|
|
26
|
-
"@remotion/shapes": "4.0.
|
|
27
|
-
"@remotion/paths": "4.0.
|
|
25
|
+
"remotion": "4.0.491",
|
|
26
|
+
"@remotion/shapes": "4.0.491",
|
|
27
|
+
"@remotion/paths": "4.0.491"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@happy-dom/global-registrator": "14.5.1",
|
|
31
|
-
"remotion": "4.0.
|
|
31
|
+
"remotion": "4.0.491",
|
|
32
32
|
"react": "19.2.3",
|
|
33
33
|
"react-dom": "19.2.3",
|
|
34
|
-
"@remotion/test-utils": "4.0.
|
|
35
|
-
"@remotion/player": "4.0.
|
|
36
|
-
"@remotion/eslint-config-internal": "4.0.
|
|
34
|
+
"@remotion/test-utils": "4.0.491",
|
|
35
|
+
"@remotion/player": "4.0.491",
|
|
36
|
+
"@remotion/eslint-config-internal": "4.0.491",
|
|
37
37
|
"eslint": "9.19.0",
|
|
38
38
|
"@typescript/native-preview": "7.0.0-dev.20260217.1"
|
|
39
39
|
},
|