remotion 4.0.533 → 4.0.535
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/README.md +1 -1
- package/dist/cjs/AbsoluteFill.d.ts +1 -6
- package/dist/cjs/AbsoluteFill.js +1 -1
- package/dist/cjs/Composition.js +15 -20
- package/dist/cjs/CompositionManager.d.ts +4 -4
- package/dist/cjs/CompositionManagerContext.d.ts +1 -6
- package/dist/cjs/CompositionManagerContext.js +0 -4
- package/dist/cjs/CompositionManagerProvider.js +77 -172
- package/dist/cjs/CompositionRegistryProvider.d.ts +5 -0
- package/dist/cjs/CompositionRegistryProvider.js +142 -0
- package/dist/cjs/DefaultPremountContext.d.ts +1 -0
- package/dist/cjs/DefaultPremountContext.js +6 -0
- package/dist/cjs/Folder.js +11 -20
- package/dist/cjs/HtmlInCanvas.d.ts +2 -2
- package/dist/cjs/HtmlInCanvas.js +179 -31
- package/dist/cjs/IFrame.js +40 -8
- package/dist/cjs/Img.js +2 -1
- package/dist/cjs/Interactive.d.ts +12 -0
- package/dist/cjs/Interactive.js +19 -8
- package/dist/cjs/RemotionRoot.js +2 -1
- package/dist/cjs/Sequence.d.ts +6 -2
- package/dist/cjs/Sequence.js +107 -40
- package/dist/cjs/SequenceActivityBoundary.d.ts +10 -0
- package/dist/cjs/SequenceActivityBoundary.js +88 -0
- package/dist/cjs/SequenceActivityBudget.d.ts +13 -0
- package/dist/cjs/SequenceActivityBudget.js +181 -0
- package/dist/cjs/SequenceManager.d.ts +13 -29
- package/dist/cjs/SequenceManager.js +36 -176
- package/dist/cjs/SequenceRegistryProvider.d.ts +4 -0
- package/dist/cjs/SequenceRegistryProvider.js +292 -0
- package/dist/cjs/Track.d.ts +13 -0
- package/dist/cjs/Track.js +33 -0
- package/dist/cjs/animated-image/AnimatedImage.js +42 -30
- package/dist/cjs/audio/AudioForPreview.js +54 -41
- package/dist/cjs/audio/get-audio-sync-anchor-tolerance.d.ts +1 -0
- package/dist/cjs/audio/get-audio-sync-anchor-tolerance.js +11 -0
- package/dist/cjs/audio/use-audio-context.js +26 -7
- package/dist/cjs/canvas-image/CanvasImage.js +4 -2
- package/dist/cjs/committed-metadata.d.ts +68 -0
- package/dist/cjs/committed-metadata.js +39 -0
- package/dist/cjs/component-identity.d.ts +6 -0
- package/dist/cjs/component-identity.js +39 -0
- package/dist/cjs/composition-registry-fallback.d.ts +14 -0
- package/dist/cjs/composition-registry-fallback.js +35 -0
- package/dist/cjs/create-element-source-proxy.d.ts +4 -0
- package/dist/cjs/create-element-source-proxy.js +46 -0
- package/dist/cjs/default-premount-in-seconds.d.ts +3 -0
- package/dist/cjs/default-premount-in-seconds.js +12 -0
- package/dist/cjs/effects/Solid.js +5 -3
- package/dist/cjs/effects/canvas-pool.d.ts +1 -0
- package/dist/cjs/effects/canvas-pool.js +15 -10
- package/dist/cjs/effects/run-effect-chain.js +3 -3
- package/dist/cjs/effects/use-memoized-effects.d.ts +3 -1
- package/dist/cjs/effects/use-memoized-effects.js +104 -21
- package/dist/cjs/enable-sequence-stack-traces.d.ts +2 -8
- package/dist/cjs/enable-sequence-stack-traces.js +7 -38
- package/dist/cjs/evaluate-source-expressions.d.ts +5 -0
- package/dist/cjs/evaluate-source-expressions.js +98 -0
- package/dist/cjs/freeze.js +9 -8
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.js +3 -3
- package/dist/cjs/interactivity-schema.d.ts +45 -9
- package/dist/cjs/interactivity-schema.js +30 -3
- package/dist/cjs/internals.d.ts +113 -27
- package/dist/cjs/internals.js +37 -7
- package/dist/cjs/interpolate-keyframed-status.d.ts +4 -0
- package/dist/cjs/interpolate-keyframed-status.js +38 -1
- package/dist/cjs/interpolate.d.ts +12 -0
- package/dist/cjs/interpolate.js +7 -0
- package/dist/cjs/no-react.d.ts +6 -0
- package/dist/cjs/no-react.js +9 -0
- package/dist/cjs/optimistic-sequence-deletion.d.ts +17 -0
- package/dist/cjs/optimistic-sequence-deletion.js +114 -0
- package/dist/cjs/registry-store.d.ts +17 -0
- package/dist/cjs/registry-store.js +68 -0
- package/dist/cjs/sequence-activity-context.d.ts +13 -0
- package/dist/cjs/sequence-activity-context.js +20 -0
- package/dist/cjs/sequence-activity-defaults.d.ts +1 -0
- package/dist/cjs/sequence-activity-defaults.js +4 -0
- package/dist/cjs/sequence-outline.js +1 -2
- package/dist/cjs/sequence-registry-context.d.ts +26 -0
- package/dist/cjs/sequence-registry-context.js +71 -0
- package/dist/cjs/series/index.d.ts +2 -1
- package/dist/cjs/series/index.js +15 -5
- package/dist/cjs/timeline-position-state.js +11 -3
- package/dist/cjs/timeline-track-context.d.ts +10 -0
- package/dist/cjs/timeline-track-context.js +6 -0
- package/dist/cjs/use-lazy-component.js +29 -15
- package/dist/cjs/use-media-in-timeline.d.ts +7 -14
- package/dist/cjs/use-media-in-timeline.js +29 -119
- package/dist/cjs/use-premounting.js +3 -4
- package/dist/cjs/use-schema.d.ts +32 -18
- package/dist/cjs/use-sequence-registration.d.ts +1 -1
- package/dist/cjs/use-sequence-registration.js +22 -6
- package/dist/cjs/use-video.d.ts +7 -2
- package/dist/cjs/use-video.js +11 -3
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/video/VideoForPreview.js +55 -42
- package/dist/cjs/video/html5-video.js +1 -1
- package/dist/cjs/with-interactivity-schema.js +48 -16
- package/dist/cjs/wrap-remotion-context.d.ts +17 -2
- package/dist/cjs/wrap-remotion-context.js +108 -4
- package/dist/esm/index.mjs +3526 -2259
- package/dist/esm/no-react.mjs +149 -35
- package/dist/esm/version.mjs +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,292 @@
|
|
|
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
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SequenceRegistryProvider = void 0;
|
|
37
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
38
|
+
const react_1 = __importStar(require("react"));
|
|
39
|
+
const committed_metadata_js_1 = require("./committed-metadata.js");
|
|
40
|
+
const registry_store_js_1 = require("./registry-store.js");
|
|
41
|
+
const sequence_registry_context_js_1 = require("./sequence-registry-context.js");
|
|
42
|
+
const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
|
|
43
|
+
const useIsomorphicLayoutEffect = typeof window === 'undefined' ? react_1.default.useEffect : react_1.default.useLayoutEffect;
|
|
44
|
+
const SequenceManagerRefProvider = (0, committed_metadata_js_1.withCommittedMetadata)(sequence_registry_context_js_1.SequenceManagerRefContext.Provider);
|
|
45
|
+
const SequenceRegistryProvider = ({ children }) => {
|
|
46
|
+
const { isStudio } = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
|
|
47
|
+
const sequenceRegistrationEnabled = (0, react_1.useContext)(sequence_registry_context_js_1.SequenceRegistrationContext);
|
|
48
|
+
const shouldObserveCommits = isStudio || sequenceRegistrationEnabled;
|
|
49
|
+
const [sequenceManagerId] = (0, react_1.useState)(() => String(Math.random()));
|
|
50
|
+
const [commitRegistrationEnabled, setCommitRegistrationEnabled] = (0, react_1.useState)(() => shouldObserveCommits && (0, committed_metadata_js_1.isCommitRegistrationObserverInstalled)());
|
|
51
|
+
const observedCommitRef = (0, react_1.useRef)(false);
|
|
52
|
+
const rootObservationFailedRef = (0, react_1.useRef)(false);
|
|
53
|
+
const committedRegistrationIdsRef = (0, react_1.useRef)(new Set());
|
|
54
|
+
const committedDescriptorsRef = (0, react_1.useRef)(new Map());
|
|
55
|
+
const pendingCommittedSequencesRef = (0, react_1.useRef)(new Map());
|
|
56
|
+
const committedScopesRef = (0, react_1.useRef)(new Map([
|
|
57
|
+
[sequenceManagerId, { sequences: [], sequenceIds: [] }],
|
|
58
|
+
]));
|
|
59
|
+
const registrationObserverFailedRef = (0, react_1.useRef)(false);
|
|
60
|
+
const registrationUnmountedRef = (0, react_1.useRef)(false);
|
|
61
|
+
const committedOrderRef = (0, react_1.useRef)(null);
|
|
62
|
+
const committedOrderIdsRef = (0, react_1.useRef)(null);
|
|
63
|
+
const [registry] = (0, react_1.useState)(() => (0, registry_store_js_1.createRegistryStore)([]));
|
|
64
|
+
const setSequences = registry.setSnapshot;
|
|
65
|
+
const sequencesRef = (0, react_1.useMemo)(() => ({
|
|
66
|
+
get current() {
|
|
67
|
+
return registry.getSnapshot();
|
|
68
|
+
},
|
|
69
|
+
}), [registry]);
|
|
70
|
+
const onCommitSequences = (0, react_1.useCallback)((scopeId, snapshot, sequenceIds) => {
|
|
71
|
+
var _a;
|
|
72
|
+
if (registrationObserverFailedRef.current ||
|
|
73
|
+
registrationUnmountedRef.current) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const previousSnapshot = (_a = pendingCommittedSequencesRef.current.get(scopeId)) !== null && _a !== void 0 ? _a : committedScopesRef.current.get(scopeId);
|
|
77
|
+
if ((previousSnapshot === null || previousSnapshot === void 0 ? void 0 : previousSnapshot.sequences) === snapshot &&
|
|
78
|
+
previousSnapshot.sequenceIds === sequenceIds) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const alreadyPending = pendingCommittedSequencesRef.current.size > 0;
|
|
82
|
+
pendingCommittedSequencesRef.current.set(scopeId, {
|
|
83
|
+
sequences: snapshot,
|
|
84
|
+
sequenceIds,
|
|
85
|
+
});
|
|
86
|
+
if (alreadyPending) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Publish after React finishes committing, and coalesce successive snapshots.
|
|
90
|
+
queueMicrotask(() => {
|
|
91
|
+
const pending = pendingCommittedSequencesRef.current;
|
|
92
|
+
pendingCommittedSequencesRef.current = new Map();
|
|
93
|
+
if (pending.size === 0 ||
|
|
94
|
+
registrationObserverFailedRef.current ||
|
|
95
|
+
registrationUnmountedRef.current) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const previousIds = committedRegistrationIdsRef.current;
|
|
99
|
+
const previousDescriptors = committedDescriptorsRef.current;
|
|
100
|
+
for (const [id, scope] of pending) {
|
|
101
|
+
if (id !== sequenceManagerId && scope.sequenceIds.length === 0) {
|
|
102
|
+
committedScopesRef.current.delete(id);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
committedScopesRef.current.set(id, scope);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// A forwarded renderer owns only its fragment. Publishing or removing it
|
|
109
|
+
// must never replace the descriptors committed by the other roots.
|
|
110
|
+
const scopes = [...committedScopesRef.current.values()];
|
|
111
|
+
const sequences = scopes.flatMap((scope) => scope.sequences);
|
|
112
|
+
const ids = scopes.flatMap((scope) => scope.sequenceIds);
|
|
113
|
+
committedDescriptorsRef.current = new Map(sequences.map((sequence) => [sequence.id, sequence]));
|
|
114
|
+
const nextIds = new Set(sequences.map((sequence) => sequence.id));
|
|
115
|
+
const order = new Map(ids.map((id, index) => [id, index]));
|
|
116
|
+
committedOrderIdsRef.current = ids;
|
|
117
|
+
committedOrderRef.current = order;
|
|
118
|
+
committedRegistrationIdsRef.current = nextIds;
|
|
119
|
+
setSequences((current) => (0, registry_store_js_1.reconcileRegistryEntries)({
|
|
120
|
+
current,
|
|
121
|
+
entries: sequences,
|
|
122
|
+
previousDescriptors,
|
|
123
|
+
previousKeys: previousIds,
|
|
124
|
+
nextKeys: nextIds,
|
|
125
|
+
getKey: (sequence) => sequence.id,
|
|
126
|
+
order,
|
|
127
|
+
orderProperty: 'timelineOrder',
|
|
128
|
+
}));
|
|
129
|
+
});
|
|
130
|
+
}, [sequenceManagerId, setSequences]);
|
|
131
|
+
const onCommitRootSequences = (0, react_1.useCallback)((sequences, sequenceIds) => {
|
|
132
|
+
if (!rootObservationFailedRef.current) {
|
|
133
|
+
observedCommitRef.current = true;
|
|
134
|
+
onCommitSequences(sequenceManagerId, sequences, sequenceIds);
|
|
135
|
+
}
|
|
136
|
+
}, [onCommitSequences, sequenceManagerId]);
|
|
137
|
+
const registryScope = (0, react_1.useMemo)(() => ({
|
|
138
|
+
onCommitSequences,
|
|
139
|
+
commitRegistrationRequested: shouldObserveCommits,
|
|
140
|
+
}), [onCommitSequences, shouldObserveCommits]);
|
|
141
|
+
useIsomorphicLayoutEffect(() => {
|
|
142
|
+
if (!shouldObserveCommits) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
let unmounted = false;
|
|
146
|
+
registrationUnmountedRef.current = false;
|
|
147
|
+
const onRegistrationError = () => {
|
|
148
|
+
if (registrationObserverFailedRef.current) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
registrationObserverFailedRef.current = true;
|
|
152
|
+
pendingCommittedSequencesRef.current.clear();
|
|
153
|
+
queueMicrotask(() => {
|
|
154
|
+
if (registrationUnmountedRef.current) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const previousIds = committedRegistrationIdsRef.current;
|
|
158
|
+
committedRegistrationIdsRef.current = new Set();
|
|
159
|
+
committedScopesRef.current.clear();
|
|
160
|
+
setSequences((current) => current.filter((sequence) => !previousIds.has(sequence.id)));
|
|
161
|
+
setCommitRegistrationEnabled(false);
|
|
162
|
+
});
|
|
163
|
+
};
|
|
164
|
+
const onCommitOrder = (event) => {
|
|
165
|
+
const { detail } = event;
|
|
166
|
+
const managerOrder = detail.sequenceManagers.find((item) => item.managerId === sequenceManagerId);
|
|
167
|
+
if (!managerOrder) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (commitRegistrationEnabled) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const previousOrder = committedOrderIdsRef.current;
|
|
174
|
+
if (previousOrder === managerOrder.sequenceIds ||
|
|
175
|
+
(previousOrder !== null &&
|
|
176
|
+
previousOrder.length === managerOrder.sequenceIds.length &&
|
|
177
|
+
previousOrder.every((sequenceId, index) => sequenceId === managerOrder.sequenceIds[index]))) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const order = new Map(managerOrder.sequenceIds.map((sequenceId, index) => [
|
|
181
|
+
sequenceId,
|
|
182
|
+
index,
|
|
183
|
+
]));
|
|
184
|
+
committedOrderIdsRef.current = managerOrder.sequenceIds;
|
|
185
|
+
committedOrderRef.current = order;
|
|
186
|
+
queueMicrotask(() => {
|
|
187
|
+
if (unmounted) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
setSequences((currentSequences) => {
|
|
191
|
+
let changed = false;
|
|
192
|
+
const nextSequences = currentSequences.map((sequence) => {
|
|
193
|
+
var _a;
|
|
194
|
+
const timelineOrder = (_a = order.get(sequence.id)) !== null && _a !== void 0 ? _a : null;
|
|
195
|
+
if (sequence.timelineOrder === timelineOrder) {
|
|
196
|
+
return sequence;
|
|
197
|
+
}
|
|
198
|
+
changed = true;
|
|
199
|
+
return { ...sequence, timelineOrder };
|
|
200
|
+
});
|
|
201
|
+
return changed ? nextSequences : currentSequences;
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
};
|
|
205
|
+
window.addEventListener(committed_metadata_js_1.COMMIT_ORDER_EVENT, onCommitOrder);
|
|
206
|
+
window.addEventListener(committed_metadata_js_1.COMMIT_REGISTRATION_ERROR_EVENT, onRegistrationError);
|
|
207
|
+
if (commitRegistrationEnabled) {
|
|
208
|
+
// React invokes its commit hook after layout effects. Installation alone
|
|
209
|
+
// does not prove this renderer connected to the hook during initialization.
|
|
210
|
+
queueMicrotask(() => {
|
|
211
|
+
if (unmounted ||
|
|
212
|
+
observedCommitRef.current ||
|
|
213
|
+
registrationObserverFailedRef.current) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
rootObservationFailedRef.current = true;
|
|
217
|
+
onCommitSequences(sequenceManagerId, [], []);
|
|
218
|
+
setCommitRegistrationEnabled(false);
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
return () => {
|
|
222
|
+
unmounted = true;
|
|
223
|
+
registrationUnmountedRef.current = true;
|
|
224
|
+
// Effect replay must not discard a snapshot already collected by React.
|
|
225
|
+
window.removeEventListener(committed_metadata_js_1.COMMIT_ORDER_EVENT, onCommitOrder);
|
|
226
|
+
window.removeEventListener(committed_metadata_js_1.COMMIT_REGISTRATION_ERROR_EVENT, onRegistrationError);
|
|
227
|
+
};
|
|
228
|
+
}, [
|
|
229
|
+
shouldObserveCommits,
|
|
230
|
+
sequenceManagerId,
|
|
231
|
+
setSequences,
|
|
232
|
+
commitRegistrationEnabled,
|
|
233
|
+
onCommitSequences,
|
|
234
|
+
]);
|
|
235
|
+
const registerSequence = (0, react_1.useCallback)((seq) => {
|
|
236
|
+
setSequences((seqs) => {
|
|
237
|
+
var _a;
|
|
238
|
+
var _b;
|
|
239
|
+
return [
|
|
240
|
+
...seqs,
|
|
241
|
+
{
|
|
242
|
+
...seq,
|
|
243
|
+
timelineOrder: (_b = (_a = committedOrderRef.current) === null || _a === void 0 ? void 0 : _a.get(seq.id)) !== null && _b !== void 0 ? _b : null,
|
|
244
|
+
},
|
|
245
|
+
];
|
|
246
|
+
});
|
|
247
|
+
}, [setSequences]);
|
|
248
|
+
const updateSequence = (0, react_1.useCallback)((seq) => {
|
|
249
|
+
setSequences((seqs) => {
|
|
250
|
+
var _a;
|
|
251
|
+
var _b;
|
|
252
|
+
const index = seqs.findIndex((item) => item.id === seq.id);
|
|
253
|
+
if (index === -1) {
|
|
254
|
+
return seqs;
|
|
255
|
+
}
|
|
256
|
+
const updatedSequence = {
|
|
257
|
+
...seq,
|
|
258
|
+
timelineOrder: (_b = (_a = committedOrderRef.current) === null || _a === void 0 ? void 0 : _a.get(seq.id)) !== null && _b !== void 0 ? _b : null,
|
|
259
|
+
};
|
|
260
|
+
if ((0, registry_store_js_1.areRegistryEntriesEqual)(seqs[index], updatedSequence)) {
|
|
261
|
+
return seqs;
|
|
262
|
+
}
|
|
263
|
+
const next = [...seqs];
|
|
264
|
+
next[index] = updatedSequence;
|
|
265
|
+
return next;
|
|
266
|
+
});
|
|
267
|
+
}, [setSequences]);
|
|
268
|
+
const unregisterSequence = (0, react_1.useCallback)((seq) => {
|
|
269
|
+
setSequences((seqs) => seqs.filter((s) => s.id !== seq));
|
|
270
|
+
}, [setSequences]);
|
|
271
|
+
const actions = (0, react_1.useMemo)(() => {
|
|
272
|
+
return {
|
|
273
|
+
registerSequence,
|
|
274
|
+
updateSequence,
|
|
275
|
+
unregisterSequence,
|
|
276
|
+
};
|
|
277
|
+
}, [registerSequence, unregisterSequence, updateSequence]);
|
|
278
|
+
const metadata = (0, react_1.useMemo)(() => shouldObserveCommits
|
|
279
|
+
? {
|
|
280
|
+
type: 'sequence-manager',
|
|
281
|
+
id: sequenceManagerId,
|
|
282
|
+
onCommit: commitRegistrationEnabled ? onCommitRootSequences : null,
|
|
283
|
+
}
|
|
284
|
+
: null, [
|
|
285
|
+
commitRegistrationEnabled,
|
|
286
|
+
onCommitRootSequences,
|
|
287
|
+
sequenceManagerId,
|
|
288
|
+
shouldObserveCommits,
|
|
289
|
+
]);
|
|
290
|
+
return (jsx_runtime_1.jsx(SequenceManagerRefProvider, { value: sequencesRef, _remotionCommitMetadata: metadata, children: jsx_runtime_1.jsx(sequence_registry_context_js_1.SequenceRegistryScopeContext.Provider, { value: registryScope, children: jsx_runtime_1.jsx(sequence_registry_context_js_1.SequenceManagerActionsContext.Provider, { value: actions, children: jsx_runtime_1.jsx(sequence_registry_context_js_1.SequenceRegistryContext.Provider, { value: registry, children: jsx_runtime_1.jsx(sequence_registry_context_js_1.SequenceCommitRegistrationContext.Provider, { value: commitRegistrationEnabled, children: children }) }) }) }) }));
|
|
291
|
+
};
|
|
292
|
+
exports.SequenceRegistryProvider = SequenceRegistryProvider;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type AbsoluteFillLayout, type SequenceProps } from './Sequence.js';
|
|
3
|
+
export type TrackProps = Omit<SequenceProps, keyof AbsoluteFillLayout | 'cropLeft' | 'cropRight' | 'cropTop' | 'cropBottom' | `_remotionInternal${string}` | 'outlineRef'>;
|
|
4
|
+
export type TrackWithoutSchemaProps = Omit<SequenceProps, keyof AbsoluteFillLayout> & ((AbsoluteFillLayout & {
|
|
5
|
+
layout: 'absolute-fill';
|
|
6
|
+
}) | ({
|
|
7
|
+
layout?: 'none';
|
|
8
|
+
} & {
|
|
9
|
+
[Key in Exclude<keyof AbsoluteFillLayout, 'layout'>]?: never;
|
|
10
|
+
}));
|
|
11
|
+
export declare const TrackWithoutSchema: React.FC<TrackWithoutSchemaProps>;
|
|
12
|
+
/** Groups clips on one Studio timeline row and applies Sequence timing. */
|
|
13
|
+
export declare const Track: React.ComponentType<TrackProps>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Track = exports.TrackWithoutSchema = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const enable_sequence_stack_traces_js_1 = require("./enable-sequence-stack-traces.js");
|
|
7
|
+
const interactivity_schema_js_1 = require("./interactivity-schema.js");
|
|
8
|
+
const Sequence_js_1 = require("./Sequence.js");
|
|
9
|
+
const timeline_track_context_js_1 = require("./timeline-track-context.js");
|
|
10
|
+
const with_interactivity_schema_js_1 = require("./with-interactivity-schema.js");
|
|
11
|
+
// A packed row has no container bar to drag. Expose its linear timing in the
|
|
12
|
+
// inspector, but keep looping and freezing as programmatic operations.
|
|
13
|
+
const { freeze: _freeze, layout: _layout, ...trackSequenceSchema } = interactivity_schema_js_1.sequenceSchema;
|
|
14
|
+
const trackSchema = {
|
|
15
|
+
...trackSequenceSchema,
|
|
16
|
+
...interactivity_schema_js_1.sequenceTimingSchema,
|
|
17
|
+
};
|
|
18
|
+
const TrackWithoutSchema = ({ name = 'Track', children, layout = 'none', ...props }) => {
|
|
19
|
+
const [id] = (0, react_1.useState)(() => String(Math.random()));
|
|
20
|
+
const tracksEnabled = (0, react_1.useContext)(timeline_track_context_js_1.ExperimentalTracksEnabledContext);
|
|
21
|
+
const value = (0, react_1.useMemo)(() => (tracksEnabled ? { id, name } : null), [id, name, tracksEnabled]);
|
|
22
|
+
return (jsx_runtime_1.jsx(timeline_track_context_js_1.TimelineTrackContext.Provider, { value: value, children: jsx_runtime_1.jsx(Sequence_js_1.SequenceWithoutSchema, { _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/track", ...props, name: name, layout: layout, _remotionInternalTimelineTrack: { role: 'track', seriesOffset: null }, children: children }) }));
|
|
23
|
+
};
|
|
24
|
+
exports.TrackWithoutSchema = TrackWithoutSchema;
|
|
25
|
+
/** Groups clips on one Studio timeline row and applies Sequence timing. */
|
|
26
|
+
exports.Track = (0, with_interactivity_schema_js_1.withInteractivitySchema)({
|
|
27
|
+
Component: (props) => jsx_runtime_1.jsx(exports.TrackWithoutSchema, { ...props, layout: "none" }),
|
|
28
|
+
componentName: '<Track>',
|
|
29
|
+
componentIdentity: 'dev.remotion.remotion.Track',
|
|
30
|
+
schema: trackSchema,
|
|
31
|
+
supportsEffects: false,
|
|
32
|
+
});
|
|
33
|
+
(0, enable_sequence_stack_traces_js_1.addSequenceStackTraces)(exports.Track);
|
|
@@ -4,12 +4,12 @@ exports.AnimatedImage = exports.animatedImageSchema = void 0;
|
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
const react_1 = require("react");
|
|
6
6
|
const react_2 = require("react");
|
|
7
|
-
const cancel_render_js_1 = require("../cancel-render.js");
|
|
8
7
|
const use_memoized_effects_js_1 = require("../effects/use-memoized-effects.js");
|
|
9
8
|
const enable_sequence_stack_traces_js_1 = require("../enable-sequence-stack-traces.js");
|
|
10
9
|
const freeze_js_1 = require("../freeze.js");
|
|
11
10
|
const interactivity_schema_js_1 = require("../interactivity-schema.js");
|
|
12
11
|
const resolve_sequence_duration_js_1 = require("../resolve-sequence-duration.js");
|
|
12
|
+
const sequence_activity_context_js_1 = require("../sequence-activity-context.js");
|
|
13
13
|
const Sequence_js_1 = require("../Sequence.js");
|
|
14
14
|
const use_crop_style_js_1 = require("../use-crop-style.js");
|
|
15
15
|
const use_current_frame_js_1 = require("../use-current-frame.js");
|
|
@@ -52,11 +52,11 @@ const getCanvasPropsFromSequenceProps = (props) => {
|
|
|
52
52
|
return canvasProps;
|
|
53
53
|
};
|
|
54
54
|
const AnimatedImageContent = (0, react_2.forwardRef)(({ src, width, height, onError, loopBehavior = 'loop', playbackRate = 1, fit = 'fill', requestInit, effects, controls, ...props }, canvasRef) => {
|
|
55
|
-
var _a;
|
|
55
|
+
var _a, _b, _c;
|
|
56
56
|
const resolvedSrc = (0, resolve_image_source_1.resolveAnimatedImageSource)(src);
|
|
57
|
-
const [
|
|
58
|
-
const
|
|
59
|
-
const
|
|
57
|
+
const [decodedImage, setDecodedImage] = (0, react_2.useState)(null);
|
|
58
|
+
const imageDecoder = (_a = decodedImage === null || decodedImage === void 0 ? void 0 : decodedImage.decoder) !== null && _a !== void 0 ? _a : null;
|
|
59
|
+
const { delayRender, continueRender, cancelRender } = (0, use_delay_render_js_1.useDelayRender)();
|
|
60
60
|
const frame = (0, use_current_frame_js_1.useCurrentFrame)();
|
|
61
61
|
const { fps } = (0, use_video_config_js_1.useVideoConfig)();
|
|
62
62
|
const currentTime = (0, get_current_time_js_1.getCurrentTime)({ frame, playbackRate, fps });
|
|
@@ -68,7 +68,8 @@ const AnimatedImageContent = (0, react_2.forwardRef)(({ src, width, height, onEr
|
|
|
68
68
|
const ref = (0, react_2.useRef)(null);
|
|
69
69
|
const memoizedEffects = (0, use_memoized_effects_js_1.useMemoizedEffects)({
|
|
70
70
|
effects,
|
|
71
|
-
overrideId: (
|
|
71
|
+
overrideId: (_b = controls === null || controls === void 0 ? void 0 : controls.overrideId) !== null && _b !== void 0 ? _b : null,
|
|
72
|
+
videoConfigValues: (_c = controls === null || controls === void 0 ? void 0 : controls.videoConfigValues) !== null && _c !== void 0 ? _c : null,
|
|
72
73
|
});
|
|
73
74
|
(0, react_2.useImperativeHandle)(canvasRef, () => {
|
|
74
75
|
var _a;
|
|
@@ -79,7 +80,8 @@ const AnimatedImageContent = (0, react_2.forwardRef)(({ src, width, height, onEr
|
|
|
79
80
|
return c;
|
|
80
81
|
}, []);
|
|
81
82
|
const [initialLoopBehavior] = (0, react_2.useState)(() => loopBehavior);
|
|
82
|
-
(0, react_2.
|
|
83
|
+
(0, react_2.useLayoutEffect)(() => {
|
|
84
|
+
const decodeHandle = delayRender(`Rendering <AnimatedImage/> with src="${resolvedSrc}"`);
|
|
83
85
|
const controller = new AbortController();
|
|
84
86
|
let cancelled = false;
|
|
85
87
|
let continued = false;
|
|
@@ -102,8 +104,7 @@ const AnimatedImageContent = (0, react_2.forwardRef)(({ src, width, height, onEr
|
|
|
102
104
|
d.close();
|
|
103
105
|
return;
|
|
104
106
|
}
|
|
105
|
-
|
|
106
|
-
continueRenderOnce();
|
|
107
|
+
setDecodedImage({ decoder: d, handle: decodeHandle });
|
|
107
108
|
})
|
|
108
109
|
.catch((err) => {
|
|
109
110
|
if (cancelled) {
|
|
@@ -118,7 +119,7 @@ const AnimatedImageContent = (0, react_2.forwardRef)(({ src, width, height, onEr
|
|
|
118
119
|
continueRenderOnce();
|
|
119
120
|
}
|
|
120
121
|
else {
|
|
121
|
-
|
|
122
|
+
cancelRender(err);
|
|
122
123
|
}
|
|
123
124
|
});
|
|
124
125
|
return () => {
|
|
@@ -128,11 +129,12 @@ const AnimatedImageContent = (0, react_2.forwardRef)(({ src, width, height, onEr
|
|
|
128
129
|
};
|
|
129
130
|
}, [
|
|
130
131
|
resolvedSrc,
|
|
131
|
-
decodeHandle,
|
|
132
132
|
onError,
|
|
133
133
|
requestInitKey,
|
|
134
134
|
initialLoopBehavior,
|
|
135
135
|
continueRender,
|
|
136
|
+
delayRender,
|
|
137
|
+
cancelRender,
|
|
136
138
|
]);
|
|
137
139
|
(0, react_2.useEffect)(() => {
|
|
138
140
|
return () => {
|
|
@@ -140,10 +142,12 @@ const AnimatedImageContent = (0, react_2.forwardRef)(({ src, width, height, onEr
|
|
|
140
142
|
};
|
|
141
143
|
}, [imageDecoder]);
|
|
142
144
|
(0, react_2.useLayoutEffect)(() => {
|
|
143
|
-
if (!imageDecoder) {
|
|
145
|
+
if (!imageDecoder || !decodedImage) {
|
|
144
146
|
return;
|
|
145
147
|
}
|
|
146
148
|
const delay = delayRender(`Rendering frame at ${currentTime} of <AnimatedImage src="${src}"/>`);
|
|
149
|
+
// The frame hold takes over only after the decoded image has committed.
|
|
150
|
+
continueRender(decodedImage.handle);
|
|
147
151
|
let cancelled = false;
|
|
148
152
|
imageDecoder
|
|
149
153
|
.getFrame(currentTime, loopBehavior)
|
|
@@ -171,7 +175,7 @@ const AnimatedImageContent = (0, react_2.forwardRef)(({ src, width, height, onEr
|
|
|
171
175
|
continueRender(delay);
|
|
172
176
|
}
|
|
173
177
|
else {
|
|
174
|
-
|
|
178
|
+
cancelRender(err);
|
|
175
179
|
}
|
|
176
180
|
});
|
|
177
181
|
return () => {
|
|
@@ -181,6 +185,7 @@ const AnimatedImageContent = (0, react_2.forwardRef)(({ src, width, height, onEr
|
|
|
181
185
|
}, [
|
|
182
186
|
currentTime,
|
|
183
187
|
imageDecoder,
|
|
188
|
+
decodedImage,
|
|
184
189
|
loopBehavior,
|
|
185
190
|
onError,
|
|
186
191
|
src,
|
|
@@ -190,6 +195,7 @@ const AnimatedImageContent = (0, react_2.forwardRef)(({ src, width, height, onEr
|
|
|
190
195
|
fit,
|
|
191
196
|
width,
|
|
192
197
|
height,
|
|
198
|
+
cancelRender,
|
|
193
199
|
]);
|
|
194
200
|
return (jsx_runtime_1.jsx(canvas_1.Canvas, { ref: ref, width: width, height: height, fit: fit, effects: memoizedEffects, ...props }));
|
|
195
201
|
});
|
|
@@ -236,20 +242,20 @@ const AnimatedImageInner = ({ src, width, height, onError, fit, playbackRate, lo
|
|
|
236
242
|
requestInit,
|
|
237
243
|
...canvasProps,
|
|
238
244
|
};
|
|
239
|
-
return (jsx_runtime_1.jsx(freeze_js_1.Freeze, { frame: freezeFrame, active: isPremountingOrPostmounting, _remotionInternalIsPremounting: premountingActive, children: jsx_runtime_1.jsx(Sequence_js_1.Sequence, { layout: "none", from: from !== null && from !== void 0 ? from : 0, playbackRate: playbackRate, durationInFrames: durationInFrames, name: "<AnimatedImage>", _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/animatedimage", controls: controls, _remotionInternalEffects: memoizedEffectDefinitions, _remotionInternalPremountDisplay: effectivePremountFor || null, _remotionInternalPostmountDisplay: effectivePostmountFor || null, _remotionInternalIsPremounting: premountingActive, _remotionInternalIsPostmounting: postmountingActive, ...sequenceProps, children: jsx_runtime_1.jsx(AnimatedImageContent, { ...animatedImageProps, ref: actualRef, effects: effects, controls: controls }) }) }));
|
|
245
|
+
return (jsx_runtime_1.jsx(freeze_js_1.Freeze, { frame: freezeFrame, active: isPremountingOrPostmounting, _remotionInternalIsPremounting: premountingActive, children: jsx_runtime_1.jsx(Sequence_js_1.Sequence, { layout: "none", from: from !== null && from !== void 0 ? from : 0, playbackRate: playbackRate, durationInFrames: durationInFrames, name: "<AnimatedImage>", _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/animatedimage", controls: controls, _remotionInternalEffects: memoizedEffectDefinitions, _remotionInternalPremountDisplay: effectivePremountFor || null, _remotionInternalPostmountDisplay: effectivePostmountFor || null, _remotionInternalIsPremounting: premountingActive, _remotionInternalIsPostmounting: postmountingActive, ...sequenceProps, children: jsx_runtime_1.jsx(sequence_activity_context_js_1.SequenceContent, { children: jsx_runtime_1.jsx(AnimatedImageContent, { ...animatedImageProps, ref: actualRef, effects: effects, controls: controls }) }) }) }));
|
|
240
246
|
};
|
|
241
247
|
const AnimatedImageWithIntrinsicDuration = (props) => {
|
|
242
248
|
const { fps } = (0, use_video_config_js_1.useVideoConfig)();
|
|
243
|
-
const { delayRender, continueRender } = (0, use_delay_render_js_1.useDelayRender)();
|
|
249
|
+
const { delayRender, continueRender, cancelRender } = (0, use_delay_render_js_1.useDelayRender)();
|
|
244
250
|
const { src, requestInit, trimBefore } = props;
|
|
245
251
|
const requestInitRef = (0, react_2.useRef)(requestInit);
|
|
246
252
|
requestInitRef.current = requestInit;
|
|
247
253
|
const onErrorRef = (0, react_2.useRef)(props.onError);
|
|
248
254
|
onErrorRef.current = props.onError;
|
|
249
|
-
const [
|
|
250
|
-
const [
|
|
251
|
-
|
|
252
|
-
|
|
255
|
+
const [duration, setDuration] = (0, react_2.useState)(null);
|
|
256
|
+
const [failedHandle, setFailedHandle] = (0, react_2.useState)(null);
|
|
257
|
+
(0, react_2.useLayoutEffect)(() => {
|
|
258
|
+
const handle = delayRender(`Finding duration of <AnimatedImage src="${src}" />`);
|
|
253
259
|
const controller = new AbortController();
|
|
254
260
|
let cancelled = false;
|
|
255
261
|
(0, get_duration_in_seconds_js_1.getAnimatedImageDurationInSeconds)({
|
|
@@ -258,9 +264,12 @@ const AnimatedImageWithIntrinsicDuration = (props) => {
|
|
|
258
264
|
requestInit: requestInitRef.current,
|
|
259
265
|
contentType: null,
|
|
260
266
|
})
|
|
261
|
-
.then((
|
|
267
|
+
.then((durationInSeconds) => {
|
|
262
268
|
if (!cancelled) {
|
|
263
|
-
|
|
269
|
+
setDuration({
|
|
270
|
+
durationInFrames: Math.ceil(durationInSeconds * fps) - (trimBefore !== null && trimBefore !== void 0 ? trimBefore : 0),
|
|
271
|
+
handle,
|
|
272
|
+
});
|
|
264
273
|
}
|
|
265
274
|
})
|
|
266
275
|
.catch((error) => {
|
|
@@ -269,10 +278,10 @@ const AnimatedImageWithIntrinsicDuration = (props) => {
|
|
|
269
278
|
}
|
|
270
279
|
if (onErrorRef.current) {
|
|
271
280
|
onErrorRef.current(error);
|
|
272
|
-
|
|
281
|
+
setFailedHandle(handle);
|
|
273
282
|
}
|
|
274
283
|
else {
|
|
275
|
-
|
|
284
|
+
cancelRender(error);
|
|
276
285
|
}
|
|
277
286
|
});
|
|
278
287
|
return () => {
|
|
@@ -280,16 +289,19 @@ const AnimatedImageWithIntrinsicDuration = (props) => {
|
|
|
280
289
|
controller.abort();
|
|
281
290
|
continueRender(handle);
|
|
282
291
|
};
|
|
283
|
-
}, [continueRender,
|
|
284
|
-
(0, react_2.
|
|
285
|
-
if (
|
|
286
|
-
continueRender(handle);
|
|
292
|
+
}, [cancelRender, continueRender, delayRender, fps, src, trimBefore]);
|
|
293
|
+
(0, react_2.useLayoutEffect)(() => {
|
|
294
|
+
if (duration !== null) {
|
|
295
|
+
continueRender(duration.handle);
|
|
296
|
+
}
|
|
297
|
+
if (failedHandle !== null) {
|
|
298
|
+
continueRender(failedHandle);
|
|
287
299
|
}
|
|
288
|
-
}, [continueRender,
|
|
289
|
-
if (
|
|
300
|
+
}, [continueRender, duration, failedHandle]);
|
|
301
|
+
if (duration === null || failedHandle !== null) {
|
|
290
302
|
return null;
|
|
291
303
|
}
|
|
292
|
-
return jsx_runtime_1.jsx(AnimatedImageInner, { ...props, durationInFrames: durationInFrames });
|
|
304
|
+
return (jsx_runtime_1.jsx(AnimatedImageInner, { ...props, durationInFrames: duration.durationInFrames }));
|
|
293
305
|
};
|
|
294
306
|
const AnimatedImageComponent = (props) => {
|
|
295
307
|
var _a;
|