remotion 4.0.534 → 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.
Files changed (101) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/AbsoluteFill.d.ts +1 -6
  3. package/dist/cjs/AbsoluteFill.js +1 -1
  4. package/dist/cjs/Composition.js +15 -20
  5. package/dist/cjs/CompositionManager.d.ts +0 -4
  6. package/dist/cjs/CompositionManagerContext.d.ts +1 -6
  7. package/dist/cjs/CompositionManagerContext.js +0 -4
  8. package/dist/cjs/CompositionManagerProvider.js +77 -169
  9. package/dist/cjs/CompositionRegistryProvider.d.ts +5 -0
  10. package/dist/cjs/CompositionRegistryProvider.js +142 -0
  11. package/dist/cjs/DefaultPremountContext.d.ts +1 -0
  12. package/dist/cjs/DefaultPremountContext.js +6 -0
  13. package/dist/cjs/Folder.js +11 -20
  14. package/dist/cjs/HtmlInCanvas.d.ts +2 -2
  15. package/dist/cjs/HtmlInCanvas.js +177 -30
  16. package/dist/cjs/IFrame.js +40 -8
  17. package/dist/cjs/Img.js +2 -1
  18. package/dist/cjs/Interactive.d.ts +12 -0
  19. package/dist/cjs/Interactive.js +19 -8
  20. package/dist/cjs/RemotionRoot.js +2 -1
  21. package/dist/cjs/Sequence.d.ts +2 -3
  22. package/dist/cjs/Sequence.js +72 -38
  23. package/dist/cjs/SequenceActivityBoundary.d.ts +10 -0
  24. package/dist/cjs/SequenceActivityBoundary.js +88 -0
  25. package/dist/cjs/SequenceActivityBudget.d.ts +13 -0
  26. package/dist/cjs/SequenceActivityBudget.js +181 -0
  27. package/dist/cjs/SequenceManager.d.ts +4 -22
  28. package/dist/cjs/SequenceManager.js +36 -196
  29. package/dist/cjs/SequenceRegistryProvider.d.ts +4 -0
  30. package/dist/cjs/SequenceRegistryProvider.js +292 -0
  31. package/dist/cjs/Track.d.ts +10 -3
  32. package/dist/cjs/Track.js +7 -6
  33. package/dist/cjs/animated-image/AnimatedImage.js +42 -31
  34. package/dist/cjs/audio/AudioForPreview.js +54 -41
  35. package/dist/cjs/audio/get-audio-sync-anchor-tolerance.d.ts +1 -0
  36. package/dist/cjs/audio/get-audio-sync-anchor-tolerance.js +11 -0
  37. package/dist/cjs/audio/use-audio-context.js +26 -7
  38. package/dist/cjs/canvas-image/CanvasImage.js +2 -1
  39. package/dist/cjs/committed-metadata.d.ts +68 -0
  40. package/dist/cjs/committed-metadata.js +39 -0
  41. package/dist/cjs/component-identity.d.ts +6 -0
  42. package/dist/cjs/component-identity.js +39 -0
  43. package/dist/cjs/composition-registry-fallback.d.ts +14 -0
  44. package/dist/cjs/composition-registry-fallback.js +35 -0
  45. package/dist/cjs/create-element-source-proxy.d.ts +4 -0
  46. package/dist/cjs/create-element-source-proxy.js +46 -0
  47. package/dist/cjs/default-premount-in-seconds.d.ts +3 -0
  48. package/dist/cjs/default-premount-in-seconds.js +12 -0
  49. package/dist/cjs/effects/Solid.js +2 -1
  50. package/dist/cjs/effects/canvas-pool.d.ts +1 -0
  51. package/dist/cjs/effects/canvas-pool.js +15 -10
  52. package/dist/cjs/effects/run-effect-chain.js +3 -3
  53. package/dist/cjs/effects/use-memoized-effects.js +96 -17
  54. package/dist/cjs/enable-sequence-stack-traces.d.ts +2 -8
  55. package/dist/cjs/enable-sequence-stack-traces.js +7 -38
  56. package/dist/cjs/freeze.js +4 -1
  57. package/dist/cjs/index.d.ts +0 -2
  58. package/dist/cjs/index.js +0 -2
  59. package/dist/cjs/interactivity-schema.d.ts +45 -9
  60. package/dist/cjs/interactivity-schema.js +30 -3
  61. package/dist/cjs/internals.d.ts +104 -25
  62. package/dist/cjs/internals.js +29 -7
  63. package/dist/cjs/interpolate-keyframed-status.d.ts +4 -0
  64. package/dist/cjs/interpolate-keyframed-status.js +38 -1
  65. package/dist/cjs/interpolate.d.ts +12 -0
  66. package/dist/cjs/interpolate.js +7 -0
  67. package/dist/cjs/no-react.d.ts +4 -0
  68. package/dist/cjs/no-react.js +6 -0
  69. package/dist/cjs/optimistic-sequence-deletion.d.ts +17 -0
  70. package/dist/cjs/optimistic-sequence-deletion.js +114 -0
  71. package/dist/cjs/registry-store.d.ts +17 -0
  72. package/dist/cjs/registry-store.js +68 -0
  73. package/dist/cjs/sequence-activity-context.d.ts +13 -0
  74. package/dist/cjs/sequence-activity-context.js +20 -0
  75. package/dist/cjs/sequence-activity-defaults.d.ts +1 -0
  76. package/dist/cjs/sequence-activity-defaults.js +4 -0
  77. package/dist/cjs/sequence-outline.js +1 -2
  78. package/dist/cjs/sequence-registry-context.d.ts +26 -0
  79. package/dist/cjs/sequence-registry-context.js +71 -0
  80. package/dist/cjs/series/index.d.ts +2 -1
  81. package/dist/cjs/series/index.js +12 -4
  82. package/dist/cjs/timeline-position-state.js +11 -3
  83. package/dist/cjs/timeline-track-context.d.ts +1 -0
  84. package/dist/cjs/use-lazy-component.js +29 -15
  85. package/dist/cjs/use-media-in-timeline.d.ts +7 -14
  86. package/dist/cjs/use-media-in-timeline.js +15 -117
  87. package/dist/cjs/use-premounting.js +3 -4
  88. package/dist/cjs/use-sequence-registration.d.ts +1 -1
  89. package/dist/cjs/use-sequence-registration.js +22 -6
  90. package/dist/cjs/use-video.d.ts +7 -2
  91. package/dist/cjs/use-video.js +11 -3
  92. package/dist/cjs/version.d.ts +1 -1
  93. package/dist/cjs/version.js +1 -1
  94. package/dist/cjs/video/VideoForPreview.js +55 -42
  95. package/dist/cjs/with-interactivity-schema.js +40 -14
  96. package/dist/cjs/wrap-remotion-context.d.ts +15 -2
  97. package/dist/cjs/wrap-remotion-context.js +101 -4
  98. package/dist/esm/index.mjs +3352 -2284
  99. package/dist/esm/no-react.mjs +71 -35
  100. package/dist/esm/version.mjs +1 -1
  101. package/package.json +2 -2
@@ -32,64 +32,34 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
36
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
37
+ };
35
38
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.SequenceManagerProvider = exports.VisualModeBatchSettersContext = exports.VisualModeSettersContext = exports.useEffectDragOverridesForNodePath = exports.useActiveFromDragOverrideKeys = exports.useDragOverridesForNodePath = exports.VisualModeDragOverridesContext = exports.VisualModePropStatusesRefContext = exports.VisualModePropStatusesContext = exports.makeSequencePropsSubscriptionKey = exports.VisualModeDragOverridesSubscriptionContext = exports.DisableSequenceRegistrationProvider = exports.DisableSequenceRegistrationContext = exports.SequenceRegistrationContext = exports.SequenceManagerRefContext = exports.useSequenceManagerSequences = exports.SequenceManager = exports.SequenceManagerActionsContext = void 0;
39
+ exports.SequenceManagerProvider = exports.VisualModeBatchSettersContext = exports.VisualModeSettersContext = exports.useEffectDragOverridesForNodePath = exports.useActiveFromDragOverrideKeys = exports.useDragOverridesForNodePath = exports.VisualModeDragOverridesRefContext = exports.VisualModeDragOverridesContext = exports.VisualModePropStatusesRefContext = exports.VisualModePropStatusesContext = exports.makeSequencePropsSubscriptionKey = exports.VisualModeDragOverridesSubscriptionContext = void 0;
37
40
  const jsx_runtime_1 = require("react/jsx-runtime");
38
41
  const react_1 = __importStar(require("react"));
39
- const sequence_order_marker_js_1 = require("./sequence-order-marker.js");
42
+ __exportStar(require("./sequence-registry-context.js"), exports);
43
+ const sequence_activity_context_js_1 = require("./sequence-activity-context.js");
44
+ const sequence_registry_context_js_1 = require("./sequence-registry-context.js");
45
+ const SequenceActivityBudget_js_1 = require("./SequenceActivityBudget.js");
46
+ const SequenceRegistryProvider_js_1 = require("./SequenceRegistryProvider.js");
40
47
  const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
41
48
  const use_sync_external_store_js_1 = require("./use-sync-external-store.js");
42
49
  const useIsomorphicLayoutEffect = typeof window === 'undefined' ? react_1.default.useEffect : react_1.default.useLayoutEffect;
43
- const defaultSequenceManager = {
44
- registerSequence: () => {
45
- throw new Error('SequenceManagerContext not initialized');
46
- },
47
- updateSequence: null,
48
- unregisterSequence: () => {
49
- throw new Error('SequenceManagerContext not initialized');
50
- },
51
- sequences: [],
52
- };
53
- exports.SequenceManagerActionsContext = react_1.default.createContext({
54
- registerSequence: defaultSequenceManager.registerSequence,
55
- updateSequence: defaultSequenceManager.updateSequence,
56
- unregisterSequence: defaultSequenceManager.unregisterSequence,
57
- });
58
- exports.SequenceManager = react_1.default.createContext(defaultSequenceManager);
59
- const NativeSequenceManagerProvider = exports.SequenceManager.Provider;
60
- const SequenceManagerProviderWithActions = ({ value, children }) => {
61
- const actions = (0, react_1.useMemo)(() => ({
62
- registerSequence: value.registerSequence,
63
- updateSequence: value.updateSequence,
64
- unregisterSequence: value.unregisterSequence,
65
- }), [value.registerSequence, value.updateSequence, value.unregisterSequence]);
66
- return (jsx_runtime_1.jsx(exports.SequenceManagerActionsContext.Provider, { value: actions, children: jsx_runtime_1.jsx(NativeSequenceManagerProvider, { value: value, children: children }) }));
67
- };
68
- // Keep custom SequenceManager.Provider trees in sync with the stable actions
69
- // context while preserving the legacy reactive sequence-list context.
70
- Object.defineProperty(exports.SequenceManager, 'Provider', {
71
- value: SequenceManagerProviderWithActions,
72
- });
73
- const useSequenceManagerSequences = () => {
74
- return (0, react_1.useContext)(exports.SequenceManager).sequences;
75
- };
76
- exports.useSequenceManagerSequences = useSequenceManagerSequences;
77
- exports.SequenceManagerRefContext = react_1.default.createContext({
78
- current: [],
79
- });
80
- exports.SequenceRegistrationContext = react_1.default.createContext(false);
81
- exports.DisableSequenceRegistrationContext = react_1.default.createContext(false);
82
- const DisableSequenceRegistrationProvider = ({ children }) => {
83
- return react_1.default.createElement(exports.DisableSequenceRegistrationContext.Provider, { value: true }, children);
84
- };
85
- exports.DisableSequenceRegistrationProvider = DisableSequenceRegistrationProvider;
86
50
  exports.VisualModeDragOverridesSubscriptionContext = react_1.default.createContext(null);
87
51
  const ActiveFromDragOverrideKeysContext = react_1.default.createContext(null);
88
52
  const SequenceManagerScopeProviders = ({ children, dragOverridesSubscription, fromKeys }) => {
89
- const manager = (0, react_1.useContext)(exports.SequenceManagerActionsContext);
53
+ const { isStudio } = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
54
+ const activitySettings = (0, react_1.useContext)(sequence_activity_context_js_1.SequenceActivitySettingsContext);
55
+ const commitRegistrationEnabled = (0, react_1.useContext)(sequence_registry_context_js_1.SequenceCommitRegistrationContext);
56
+ const manager = (0, react_1.useContext)(sequence_registry_context_js_1.SequenceManagerActionsContext);
90
57
  const scopedDragOverridesSubscription = (0, react_1.useMemo)(() => ({ ...dragOverridesSubscription, manager }), [dragOverridesSubscription, manager]);
91
58
  const activeFromDragOverrideKeys = (0, react_1.useMemo)(() => ({ manager, keys: fromKeys }), [fromKeys, manager]);
92
- return (jsx_runtime_1.jsx(ActiveFromDragOverrideKeysContext.Provider, { value: activeFromDragOverrideKeys, children: jsx_runtime_1.jsx(exports.VisualModeDragOverridesSubscriptionContext.Provider, { value: scopedDragOverridesSubscription, children: children }) }));
59
+ return (jsx_runtime_1.jsx(ActiveFromDragOverrideKeysContext.Provider, { value: activeFromDragOverrideKeys, children: jsx_runtime_1.jsx(exports.VisualModeDragOverridesSubscriptionContext.Provider, { value: scopedDragOverridesSubscription, children: jsx_runtime_1.jsx(sequence_activity_context_js_1.SequenceActivityContext.Provider, { value: (activitySettings === null || activitySettings === void 0 ? void 0 : activitySettings.enabled) === true &&
60
+ isStudio &&
61
+ commitRegistrationEnabled &&
62
+ typeof react_1.default.Activity !== 'undefined', children: jsx_runtime_1.jsx(SequenceActivityBudget_js_1.SequenceActivityBudgetProvider, { children: children }) }) }) }));
93
63
  };
94
64
  const emptyDragOverrides = {};
95
65
  const emptyFromOverrideKeys = new Set();
@@ -104,24 +74,20 @@ exports.VisualModePropStatusesContext = react_1.default.createContext({
104
74
  exports.VisualModePropStatusesRefContext = react_1.default.createContext({
105
75
  current: {},
106
76
  });
107
- exports.VisualModeDragOverridesContext = react_1.default.createContext({
77
+ const defaultVisualModeDragOverrides = {
108
78
  getDragOverrides: () => {
109
79
  throw new Error('VisualModeDragOverridesContext not initialized');
110
80
  },
111
81
  getEffectDragOverrides: () => {
112
82
  throw new Error('VisualModeDragOverridesContext not initialized');
113
83
  },
114
- });
115
- /* eslint-disable react-hooks/rules-of-hooks */
84
+ };
85
+ exports.VisualModeDragOverridesContext = react_1.default.createContext(defaultVisualModeDragOverrides);
86
+ exports.VisualModeDragOverridesRefContext = react_1.default.createContext({ current: defaultVisualModeDragOverrides });
116
87
  const useDragOverridesForNodePath = (nodePath) => {
117
88
  const subscription = (0, react_1.useContext)(exports.VisualModeDragOverridesSubscriptionContext);
118
- const manager = (0, react_1.useContext)(exports.SequenceManagerActionsContext);
89
+ const manager = (0, react_1.useContext)(sequence_registry_context_js_1.SequenceManagerActionsContext);
119
90
  const scopedSubscription = (subscription === null || subscription === void 0 ? void 0 : subscription.manager) === manager ? subscription : null;
120
- // Legacy providers only supply VisualModeDragOverridesContext. Its presence is
121
- // fixed for the lifetime of a mounted tree.
122
- const legacy = scopedSubscription === null
123
- ? (0, react_1.useContext)(exports.VisualModeDragOverridesContext)
124
- : null;
125
91
  const key = nodePath === null ? null : (0, exports.makeSequencePropsSubscriptionKey)(nodePath);
126
92
  const subscribe = (0, react_1.useCallback)((listener) => {
127
93
  var _a;
@@ -131,27 +97,19 @@ const useDragOverridesForNodePath = (nodePath) => {
131
97
  var _a;
132
98
  return (_a = scopedSubscription === null || scopedSubscription === void 0 ? void 0 : scopedSubscription.getSnapshot(key)) !== null && _a !== void 0 ? _a : emptyDragOverrides;
133
99
  }, [key, scopedSubscription]);
134
- const overrides = (0, use_sync_external_store_js_1.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
135
- return legacy !== null && nodePath !== null
136
- ? legacy.getDragOverrides(nodePath)
137
- : overrides;
100
+ return (0, use_sync_external_store_js_1.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
138
101
  };
139
102
  exports.useDragOverridesForNodePath = useDragOverridesForNodePath;
140
103
  const useActiveFromDragOverrideKeys = () => {
141
104
  const snapshot = (0, react_1.useContext)(ActiveFromDragOverrideKeysContext);
142
- const manager = (0, react_1.useContext)(exports.SequenceManagerActionsContext);
105
+ const manager = (0, react_1.useContext)(sequence_registry_context_js_1.SequenceManagerActionsContext);
143
106
  return (snapshot === null || snapshot === void 0 ? void 0 : snapshot.manager) === manager ? snapshot.keys : emptyFromOverrideKeys;
144
107
  };
145
108
  exports.useActiveFromDragOverrideKeys = useActiveFromDragOverrideKeys;
146
- const useEffectDragOverridesForNodePath = (nodePath, effectCount) => {
109
+ const useEffectDragOverridesForNodePath = (nodePath) => {
147
110
  const subscription = (0, react_1.useContext)(exports.VisualModeDragOverridesSubscriptionContext);
148
- const manager = (0, react_1.useContext)(exports.SequenceManagerActionsContext);
111
+ const manager = (0, react_1.useContext)(sequence_registry_context_js_1.SequenceManagerActionsContext);
149
112
  const scopedSubscription = (subscription === null || subscription === void 0 ? void 0 : subscription.manager) === manager ? subscription : null;
150
- // Legacy providers only supply VisualModeDragOverridesContext. Its presence is
151
- // fixed for the lifetime of a mounted tree.
152
- const legacy = scopedSubscription === null
153
- ? (0, react_1.useContext)(exports.VisualModeDragOverridesContext)
154
- : null;
155
113
  const key = nodePath === null ? null : (0, exports.makeSequencePropsSubscriptionKey)(nodePath);
156
114
  const subscribe = (0, react_1.useCallback)((listener) => {
157
115
  var _a;
@@ -161,18 +119,9 @@ const useEffectDragOverridesForNodePath = (nodePath, effectCount) => {
161
119
  var _a;
162
120
  return (_a = scopedSubscription === null || scopedSubscription === void 0 ? void 0 : scopedSubscription.getEffectSnapshot(key)) !== null && _a !== void 0 ? _a : emptyEffectDragOverrides;
163
121
  }, [key, scopedSubscription]);
164
- const overrides = (0, use_sync_external_store_js_1.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
165
- if (legacy !== null && nodePath !== null) {
166
- const legacyOverrides = {};
167
- for (let index = 0; index < effectCount; index++) {
168
- legacyOverrides[index] = legacy.getEffectDragOverrides(nodePath, index);
169
- }
170
- return legacyOverrides;
171
- }
172
- return overrides;
122
+ return (0, use_sync_external_store_js_1.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
173
123
  };
174
124
  exports.useEffectDragOverridesForNodePath = useEffectDragOverridesForNodePath;
175
- /* eslint-enable react-hooks/rules-of-hooks */
176
125
  exports.VisualModeSettersContext = react_1.default.createContext({
177
126
  setDragOverrides: () => {
178
127
  throw new Error('VisualModeSettersContext not initialized');
@@ -196,13 +145,6 @@ exports.VisualModeSettersContext = react_1.default.createContext({
196
145
  exports.VisualModeBatchSettersContext = react_1.default.createContext(null);
197
146
  const effectDragOverridesKey = (nodePath, effectIndex) => `${(0, exports.makeSequencePropsSubscriptionKey)(nodePath)}.effects.${effectIndex}`;
198
147
  const SequenceManagerProvider = ({ children }) => {
199
- const { isStudio } = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
200
- const [sequenceManagerId] = (0, react_1.useState)(() => String(Math.random()));
201
- const committedOrderRef = (0, react_1.useRef)(null);
202
- const committedOrderIdsRef = (0, react_1.useRef)(null);
203
- const [sequences, setSequences] = (0, react_1.useState)([]);
204
- const sequencesRef = (0, react_1.useRef)(sequences);
205
- sequencesRef.current = sequences;
206
148
  const [dragOverrideState, setDragOverrideState] = (0, react_1.useState)(() => ({
207
149
  overrides: {},
208
150
  fromKeys: new Set(),
@@ -220,7 +162,9 @@ const SequenceManagerProvider = ({ children }) => {
220
162
  });
221
163
  const [propStatuses, setPropStatusesMapState] = (0, react_1.useState)({});
222
164
  const propStatusesRef = (0, react_1.useRef)(propStatuses);
223
- propStatusesRef.current = propStatuses;
165
+ useIsomorphicLayoutEffect(() => {
166
+ propStatusesRef.current = propStatuses;
167
+ }, [propStatuses]);
224
168
  const setDragOverridesBatch = (0, react_1.useCallback)((overrides) => {
225
169
  setDragOverrideState((prevState) => {
226
170
  var _a;
@@ -436,114 +380,6 @@ const SequenceManagerProvider = ({ children }) => {
436
380
  return next;
437
381
  });
438
382
  }, []);
439
- useIsomorphicLayoutEffect(() => {
440
- if (!isStudio) {
441
- return;
442
- }
443
- let unmounted = false;
444
- const onCommitOrder = (event) => {
445
- const { detail } = event;
446
- const managerOrder = detail.sequenceManagers.find((item) => item.managerId === sequenceManagerId);
447
- if (!managerOrder) {
448
- return;
449
- }
450
- const previousOrder = committedOrderIdsRef.current;
451
- if (previousOrder !== null &&
452
- previousOrder.length === managerOrder.sequenceIds.length &&
453
- previousOrder.every((sequenceId, index) => sequenceId === managerOrder.sequenceIds[index])) {
454
- return;
455
- }
456
- const order = new Map(managerOrder.sequenceIds.map((sequenceId, index) => [
457
- sequenceId,
458
- index,
459
- ]));
460
- committedOrderIdsRef.current = managerOrder.sequenceIds;
461
- committedOrderRef.current = order;
462
- queueMicrotask(() => {
463
- if (unmounted) {
464
- return;
465
- }
466
- setSequences((currentSequences) => {
467
- let changed = false;
468
- const nextSequences = currentSequences.map((sequence) => {
469
- var _a;
470
- const timelineOrder = (_a = order.get(sequence.id)) !== null && _a !== void 0 ? _a : null;
471
- if (sequence.timelineOrder === timelineOrder) {
472
- return sequence;
473
- }
474
- changed = true;
475
- return { ...sequence, timelineOrder };
476
- });
477
- return changed ? nextSequences : currentSequences;
478
- });
479
- });
480
- };
481
- window.addEventListener(sequence_order_marker_js_1.COMMIT_ORDER_EVENT, onCommitOrder);
482
- return () => {
483
- unmounted = true;
484
- window.removeEventListener(sequence_order_marker_js_1.COMMIT_ORDER_EVENT, onCommitOrder);
485
- };
486
- }, [isStudio, sequenceManagerId]);
487
- const registerSequence = (0, react_1.useCallback)((seq) => {
488
- setSequences((seqs) => {
489
- var _a;
490
- var _b;
491
- return [
492
- ...seqs,
493
- {
494
- ...seq,
495
- timelineOrder: (_b = (_a = committedOrderRef.current) === null || _a === void 0 ? void 0 : _a.get(seq.id)) !== null && _b !== void 0 ? _b : null,
496
- },
497
- ];
498
- });
499
- }, []);
500
- const updateSequence = (0, react_1.useCallback)((seq) => {
501
- setSequences((seqs) => {
502
- var _a;
503
- var _b;
504
- const index = seqs.findIndex((item) => item.id === seq.id);
505
- if (index === -1) {
506
- return seqs;
507
- }
508
- const previousSequence = seqs[index];
509
- const timelineOrder = (_b = (_a = committedOrderRef.current) === null || _a === void 0 ? void 0 : _a.get(seq.id)) !== null && _b !== void 0 ? _b : null;
510
- // A new registration getter does not necessarily change the metadata.
511
- let unchanged = Object.is(previousSequence.timelineOrder, timelineOrder);
512
- // The manager adds timelineOrder even if the incoming object omits it.
513
- let keyCount = 1;
514
- if (unchanged) {
515
- for (const key in seq) {
516
- if (key === 'timelineOrder' ||
517
- !Object.prototype.hasOwnProperty.call(seq, key)) {
518
- continue;
519
- }
520
- keyCount++;
521
- if (!Object.prototype.hasOwnProperty.call(previousSequence, key) ||
522
- !Object.is(previousSequence[key], seq[key])) {
523
- unchanged = false;
524
- break;
525
- }
526
- }
527
- }
528
- if (unchanged && Object.keys(previousSequence).length === keyCount) {
529
- return seqs;
530
- }
531
- const next = [...seqs];
532
- next[index] = { ...seq, timelineOrder };
533
- return next;
534
- });
535
- }, []);
536
- const unregisterSequence = (0, react_1.useCallback)((seq) => {
537
- setSequences((seqs) => seqs.filter((s) => s.id !== seq));
538
- }, []);
539
- const sequenceContext = (0, react_1.useMemo)(() => {
540
- return {
541
- registerSequence,
542
- sequences,
543
- updateSequence,
544
- unregisterSequence,
545
- };
546
- }, [registerSequence, sequences, unregisterSequence, updateSequence]);
547
383
  const dragOverridesSubscription = (0, react_1.useMemo)(() => ({
548
384
  subscribe: subscribeDragOverrides,
549
385
  getSnapshot: getDragOverridesSnapshot,
@@ -574,6 +410,11 @@ const SequenceManagerProvider = ({ children }) => {
574
410
  getEffectDragOverrides,
575
411
  };
576
412
  }, [getDragOverrides, getEffectDragOverrides]);
413
+ const dragOverridesRef = (0, react_1.useRef)(dragOverridesContext);
414
+ useIsomorphicLayoutEffect(() => {
415
+ // Interaction handlers read the latest committed overrides without subscribing.
416
+ dragOverridesRef.current = dragOverridesContext;
417
+ }, [dragOverridesContext]);
577
418
  const settersContext = (0, react_1.useMemo)(() => {
578
419
  return {
579
420
  setDragOverrides,
@@ -592,7 +433,6 @@ const SequenceManagerProvider = ({ children }) => {
592
433
  remapPropStatuses,
593
434
  ]);
594
435
  const batchSettersContext = (0, react_1.useMemo)(() => ({ setDragOverridesBatch, setEffectDragOverridesBatch }), [setDragOverridesBatch, setEffectDragOverridesBatch]);
595
- const providers = (jsx_runtime_1.jsx(exports.SequenceManagerRefContext.Provider, { value: sequencesRef, children: jsx_runtime_1.jsx(exports.SequenceManager.Provider, { value: sequenceContext, children: jsx_runtime_1.jsx(exports.VisualModePropStatusesRefContext.Provider, { value: propStatusesRef, children: jsx_runtime_1.jsx(exports.VisualModePropStatusesContext.Provider, { value: propStatusesContext, children: jsx_runtime_1.jsx(SequenceManagerScopeProviders, { dragOverridesSubscription: dragOverridesSubscription, fromKeys: dragOverrideState.fromKeys, children: jsx_runtime_1.jsx(exports.VisualModeDragOverridesContext.Provider, { value: dragOverridesContext, children: jsx_runtime_1.jsx(exports.VisualModeSettersContext.Provider, { value: settersContext, children: jsx_runtime_1.jsx(exports.VisualModeBatchSettersContext.Provider, { value: batchSettersContext, children: children }) }) }) }) }) }) }) }));
596
- return isStudio ? (jsx_runtime_1.jsx(sequence_order_marker_js_1.SequenceManagerOrderMarker, { managerId: sequenceManagerId, children: providers })) : (providers);
436
+ return (jsx_runtime_1.jsx(SequenceRegistryProvider_js_1.SequenceRegistryProvider, { children: jsx_runtime_1.jsx(exports.VisualModePropStatusesRefContext.Provider, { value: propStatusesRef, children: jsx_runtime_1.jsx(exports.VisualModePropStatusesContext.Provider, { value: propStatusesContext, children: jsx_runtime_1.jsx(SequenceManagerScopeProviders, { dragOverridesSubscription: dragOverridesSubscription, fromKeys: dragOverrideState.fromKeys, children: jsx_runtime_1.jsx(exports.VisualModeDragOverridesContext.Provider, { value: dragOverridesContext, children: jsx_runtime_1.jsx(exports.VisualModeDragOverridesRefContext.Provider, { value: dragOverridesRef, children: jsx_runtime_1.jsx(exports.VisualModeSettersContext.Provider, { value: settersContext, children: jsx_runtime_1.jsx(exports.VisualModeBatchSettersContext.Provider, { value: batchSettersContext, children: children }) }) }) }) }) }) }) }));
597
437
  };
598
438
  exports.SequenceManagerProvider = SequenceManagerProvider;
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare const SequenceRegistryProvider: React.FC<{
3
+ readonly children: React.ReactNode;
4
+ }>;
@@ -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;
@@ -1,6 +1,13 @@
1
1
  import React from 'react';
2
- import { type SequenceProps } from './Sequence.js';
3
- export type TrackProps = Pick<SequenceProps, 'children' | 'name' | 'from' | 'durationInFrames' | 'hidden' | 'showInTimeline'>;
4
- export declare const TrackWithoutSchema: React.FC<SequenceProps>;
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>;
5
12
  /** Groups clips on one Studio timeline row and applies Sequence timing. */
6
13
  export declare const Track: React.ComponentType<TrackProps>;