remotion 4.0.537 → 4.0.539

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 (179) hide show
  1. package/dist/cjs/AbsoluteFill.d.ts +62 -62
  2. package/dist/cjs/AbsoluteFill.js +3 -3
  3. package/dist/cjs/AbsoluteFillElement.d.ts +1 -1
  4. package/dist/cjs/AbsoluteFillElement.js +43 -5
  5. package/dist/cjs/CanUseRemotionHooks.js +1 -1
  6. package/dist/cjs/Composition.js +5 -11
  7. package/dist/cjs/CompositionErrorBoundary.js +5 -2
  8. package/dist/cjs/CompositionManager.d.ts +1 -0
  9. package/dist/cjs/CompositionManagerProvider.d.ts +1 -1
  10. package/dist/cjs/CompositionManagerProvider.js +1 -1
  11. package/dist/cjs/CompositionRegistryProvider.d.ts +1 -1
  12. package/dist/cjs/CompositionRegistryProvider.js +1 -1
  13. package/dist/cjs/EditorProps.d.ts +2 -2
  14. package/dist/cjs/EditorProps.js +1 -1
  15. package/dist/cjs/Folder.js +1 -1
  16. package/dist/cjs/HtmlInCanvas.d.ts +58 -67
  17. package/dist/cjs/HtmlInCanvas.js +22 -9
  18. package/dist/cjs/HtmlInCanvasFallback.d.ts +6 -0
  19. package/dist/cjs/HtmlInCanvasFallback.js +39 -0
  20. package/dist/cjs/IFrame.d.ts +2 -2
  21. package/dist/cjs/IFrame.js +1 -1
  22. package/dist/cjs/Img.d.ts +62 -62
  23. package/dist/cjs/Img.js +160 -132
  24. package/dist/cjs/Interactive.d.ts +147 -145
  25. package/dist/cjs/Interactive.js +2 -2
  26. package/dist/cjs/RemotionRoot.js +1 -1
  27. package/dist/cjs/RenderAssetManager.js +1 -1
  28. package/dist/cjs/Sequence.js +37 -27
  29. package/dist/cjs/SequenceActivityBoundary.js +1 -1
  30. package/dist/cjs/SequenceActivityBudget.js +1 -1
  31. package/dist/cjs/SequenceActivitySuspensionProvider.js +1 -1
  32. package/dist/cjs/SequenceManager.d.ts +6 -0
  33. package/dist/cjs/SequenceManager.js +71 -27
  34. package/dist/cjs/SequenceRegistryProvider.js +16 -3
  35. package/dist/cjs/TimelineContext.js +1 -1
  36. package/dist/cjs/Track.js +2 -2
  37. package/dist/cjs/animated-image/AnimatedImage.d.ts +69 -69
  38. package/dist/cjs/animated-image/AnimatedImage.js +6 -6
  39. package/dist/cjs/animated-image/canvas.d.ts +6 -5
  40. package/dist/cjs/animated-image/canvas.js +1 -1
  41. package/dist/cjs/animated-image/create-image-decoder.d.ts +1 -1
  42. package/dist/cjs/animated-image/decode-image.d.ts +1 -1
  43. package/dist/cjs/animated-image/decode-image.js +2 -0
  44. package/dist/cjs/animated-image/get-duration-in-seconds.d.ts +1 -1
  45. package/dist/cjs/animated-image/index.js +1 -1
  46. package/dist/cjs/audio/AudioForPreview.js +5 -28
  47. package/dist/cjs/audio/AudioForRendering.d.ts +5 -20
  48. package/dist/cjs/audio/AudioForRendering.js +44 -5
  49. package/dist/cjs/audio/html5-audio.d.ts +36 -36
  50. package/dist/cjs/audio/html5-audio.js +8 -10
  51. package/dist/cjs/audio/index.js +1 -1
  52. package/dist/cjs/audio/shared-audio-tags.js +10 -16
  53. package/dist/cjs/audio/shared-element-source-node.d.ts +1 -1
  54. package/dist/cjs/audio/use-audio-context.d.ts +2 -1
  55. package/dist/cjs/audio/wait-until-actually-resumed.d.ts +2 -1
  56. package/dist/cjs/buffer-until-first-frame.d.ts +4 -3
  57. package/dist/cjs/buffering.js +1 -1
  58. package/dist/cjs/cancel-render.js +3 -0
  59. package/dist/cjs/canvas-image/CanvasImage.d.ts +71 -71
  60. package/dist/cjs/canvas-image/CanvasImage.js +27 -24
  61. package/dist/cjs/canvas-image/index.js +1 -1
  62. package/dist/cjs/codec.d.ts +1 -1
  63. package/dist/cjs/committed-metadata.d.ts +4 -2
  64. package/dist/cjs/composition-registry-fallback.d.ts +4 -2
  65. package/dist/cjs/composition-registry-fallback.js +12 -10
  66. package/dist/cjs/create-element-source-proxy.js +46 -6
  67. package/dist/cjs/default-css.d.ts +1 -1
  68. package/dist/cjs/delay-render.d.ts +2 -1
  69. package/dist/cjs/delay-render.js +4 -2
  70. package/dist/cjs/easing.js +3 -1
  71. package/dist/cjs/effects/Solid.d.ts +60 -60
  72. package/dist/cjs/effects/Solid.js +2 -2
  73. package/dist/cjs/effects/canvas-pool.js +6 -9
  74. package/dist/cjs/effects/create-curve-sampler.d.ts +1 -0
  75. package/dist/cjs/effects/create-curve-sampler.js +100 -0
  76. package/dist/cjs/effects/effect-source-observer.d.ts +13 -0
  77. package/dist/cjs/effects/effect-source-observer.js +177 -0
  78. package/dist/cjs/effects/index.js +1 -1
  79. package/dist/cjs/effects/run-effect-chain.js +3 -0
  80. package/dist/cjs/effects/use-memoized-effects.d.ts +2 -1
  81. package/dist/cjs/effects/use-memoized-effects.js +29 -13
  82. package/dist/cjs/freeze.js +2 -2
  83. package/dist/cjs/get-cross-origin-value.d.ts +1 -1
  84. package/dist/cjs/get-effective-visual-mode-value.d.ts +2 -2
  85. package/dist/cjs/index.d.ts +3 -1
  86. package/dist/cjs/index.js +32 -32
  87. package/dist/cjs/interactivity-schema.d.ts +286 -286
  88. package/dist/cjs/internals.d.ts +412 -595
  89. package/dist/cjs/internals.js +11 -0
  90. package/dist/cjs/interpolate-colors.d.ts +1 -1
  91. package/dist/cjs/interpolate-colors.js +28 -23
  92. package/dist/cjs/interpolate.d.ts +2 -9
  93. package/dist/cjs/interpolate.js +37 -33
  94. package/dist/cjs/is-player.js +1 -1
  95. package/dist/cjs/loading-indicator.js +2 -6
  96. package/dist/cjs/log-level-context.d.ts +1 -1
  97. package/dist/cjs/log.d.ts +12 -7
  98. package/dist/cjs/loop/index.js +1 -1
  99. package/dist/cjs/media-resource-manager.d.ts +1 -1
  100. package/dist/cjs/media-tag-current-time-timestamp.d.ts +1 -1
  101. package/dist/cjs/no-react.d.ts +85 -91
  102. package/dist/cjs/no-react.js +2 -2
  103. package/dist/cjs/nonce.d.ts +11 -0
  104. package/dist/cjs/nonce.js +42 -0
  105. package/dist/cjs/play-and-handle-not-allowed-error.d.ts +5 -4
  106. package/dist/cjs/playback-logging.d.ts +2 -1
  107. package/dist/cjs/playback-pitch-context.d.ts +1 -0
  108. package/dist/cjs/playback-pitch-context.js +5 -0
  109. package/dist/cjs/prefetch-state.js +1 -1
  110. package/dist/cjs/prefetch.d.ts +7 -6
  111. package/dist/cjs/prefetch.js +30 -5
  112. package/dist/cjs/props-if-has-props.d.ts +2 -1
  113. package/dist/cjs/prores-profile.d.ts +1 -1
  114. package/dist/cjs/register-root.d.ts +2 -2
  115. package/dist/cjs/render-resource-manager.d.ts +1 -1
  116. package/dist/cjs/render-types.d.ts +2 -2
  117. package/dist/cjs/resolve-video-config.d.ts +8 -8
  118. package/dist/cjs/runtime-value-store.d.ts +1 -1
  119. package/dist/cjs/scale-value.d.ts +1 -1
  120. package/dist/cjs/seek.d.ts +3 -2
  121. package/dist/cjs/sequence-activity-context.js +1 -1
  122. package/dist/cjs/sequence-crop.js +1 -4
  123. package/dist/cjs/sequence-order-marker.d.ts +58 -0
  124. package/dist/cjs/sequence-order-marker.js +44 -0
  125. package/dist/cjs/series/flatten-children.d.ts +3 -1
  126. package/dist/cjs/series/index.js +4 -5
  127. package/dist/cjs/series/is-inside-series.js +2 -2
  128. package/dist/cjs/spring/index.d.ts +1 -1
  129. package/dist/cjs/spring/index.js +2 -4
  130. package/dist/cjs/spring/measure-spring.d.ts +1 -1
  131. package/dist/cjs/spring/spring-utils.d.ts +1 -1
  132. package/dist/cjs/spring/spring-utils.js +11 -5
  133. package/dist/cjs/timeline-position-state.d.ts +1 -1
  134. package/dist/cjs/timeline-position-state.js +2 -2
  135. package/dist/cjs/use-amplification.d.ts +4 -7
  136. package/dist/cjs/use-current-scale.d.ts +2 -2
  137. package/dist/cjs/use-delay-render.d.ts +2 -1
  138. package/dist/cjs/use-lazy-component.d.ts +1 -1
  139. package/dist/cjs/use-lazy-component.js +20 -9
  140. package/dist/cjs/use-media-buffering.d.ts +3 -2
  141. package/dist/cjs/use-media-duration.d.ts +4 -0
  142. package/dist/cjs/use-media-duration.js +36 -0
  143. package/dist/cjs/use-media-enabled.d.ts +1 -1
  144. package/dist/cjs/use-media-enabled.js +1 -1
  145. package/dist/cjs/use-media-in-timeline.d.ts +1 -1
  146. package/dist/cjs/use-media-playback.d.ts +3 -3
  147. package/dist/cjs/use-media-tag.d.ts +2 -2
  148. package/dist/cjs/use-pixel-density.d.ts +1 -1
  149. package/dist/cjs/use-premounting.d.ts +1 -1
  150. package/dist/cjs/use-premounting.js +6 -2
  151. package/dist/cjs/use-request-video-callback-time.d.ts +3 -3
  152. package/dist/cjs/use-schema.d.ts +4 -4
  153. package/dist/cjs/use-video.js +1 -1
  154. package/dist/cjs/validate-media-props.d.ts +1 -1
  155. package/dist/cjs/validation/validate-default-props.d.ts +1 -1
  156. package/dist/cjs/version.d.ts +1 -1
  157. package/dist/cjs/version.js +1 -1
  158. package/dist/cjs/video/MediaPlaybackError.js +0 -1
  159. package/dist/cjs/video/OffthreadVideo.js +5 -5
  160. package/dist/cjs/video/OffthreadVideoForRendering.js +9 -7
  161. package/dist/cjs/video/VideoForPreview.js +6 -28
  162. package/dist/cjs/video/VideoForRendering.d.ts +5 -3
  163. package/dist/cjs/video/VideoForRendering.js +4 -2
  164. package/dist/cjs/video/duration-state.d.ts +1 -0
  165. package/dist/cjs/video/duration-state.js +8 -2
  166. package/dist/cjs/video/emit-video-frame.d.ts +1 -1
  167. package/dist/cjs/video/html5-video.d.ts +36 -36
  168. package/dist/cjs/video/html5-video.js +8 -10
  169. package/dist/cjs/video/index.js +2 -2
  170. package/dist/cjs/video/seek-until-right.d.ts +3 -2
  171. package/dist/cjs/warn-about-non-seekable-media.d.ts +1 -1
  172. package/dist/cjs/with-interactivity-schema.d.ts +1 -1
  173. package/dist/cjs/with-interactivity-schema.js +3 -8
  174. package/dist/cjs/wrap-remotion-context.d.ts +4 -4
  175. package/dist/cjs/wrap-remotion-context.js +2 -2
  176. package/dist/esm/index.mjs +1304 -819
  177. package/dist/esm/no-react.mjs +74 -52
  178. package/dist/esm/version.mjs +1 -1
  179. package/package.json +4 -4
@@ -157,7 +157,7 @@ const withSchema = (untypedOptions) => {
157
157
  style: premountingStyle,
158
158
  componentName,
159
159
  });
160
- return (jsx_runtime_1.jsx(freeze_js_1.Freeze, { frame: freezeFrame, active: isPremountingOrPostmounting, children: jsx_runtime_1.jsx(Sequence_js_1.SequenceWithoutSchema, { _remotionInternalSingleChildComponent: isCurrentComposition ? null : componentIdentity, layout: layout, ...(layout === 'absolute-fill'
160
+ return ((0, jsx_runtime_1.jsx)(freeze_js_1.Freeze, { frame: freezeFrame, active: isPremountingOrPostmounting, children: (0, jsx_runtime_1.jsx)(Sequence_js_1.SequenceWithoutSchema, { _remotionInternalSingleChildComponent: isCurrentComposition ? null : componentIdentity, layout: layout, ...(layout === 'absolute-fill'
161
161
  ? {
162
162
  width,
163
163
  height,
@@ -228,7 +228,7 @@ const makeInteractiveElement = (tag, displayName, schema) => {
228
228
  const callbackRef = (0, react_1.useCallback)((element) => {
229
229
  setRef(ref, element);
230
230
  }, [ref]);
231
- 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, trimBefore: trimBefore, playbackRate: playbackRate, loop: loop, durationInFrames: durationInFrames, freeze: freeze, hidden: hidden, name: name !== null && name !== void 0 ? name : displayName, showInTimeline: showInTimeline !== null && showInTimeline !== void 0 ? showInTimeline : true, controls: controls, _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/interactive", _remotionInternalPremountDisplay: effectivePremountFor || null, _remotionInternalPostmountDisplay: effectivePostmountFor || null, _remotionInternalIsPremounting: premountingActive, _remotionInternalIsPostmounting: postmountingActive, children: react_1.default.createElement(tag, {
231
+ return ((0, jsx_runtime_1.jsx)(freeze_js_1.Freeze, { frame: freezeFrame, active: isPremountingOrPostmounting, _remotionInternalIsPremounting: premountingActive, children: (0, jsx_runtime_1.jsx)(Sequence_js_1.Sequence, { layout: "none", from: from !== null && from !== void 0 ? from : 0, trimBefore: trimBefore, playbackRate: playbackRate, loop: loop, durationInFrames: durationInFrames, freeze: freeze, hidden: hidden, name: name !== null && name !== void 0 ? name : displayName, showInTimeline: showInTimeline !== null && showInTimeline !== void 0 ? showInTimeline : true, controls: controls, _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/interactive", _remotionInternalPremountDisplay: effectivePremountFor || null, _remotionInternalPostmountDisplay: effectivePostmountFor || null, _remotionInternalIsPremounting: premountingActive, _remotionInternalIsPostmounting: postmountingActive, children: react_1.default.createElement(tag, {
232
232
  ...props,
233
233
  style: croppedStyle !== null && croppedStyle !== void 0 ? croppedStyle : undefined,
234
234
  ref: callbackRef,
@@ -17,6 +17,6 @@ const RemotionRootContexts = ({ children, numberOfAudioTags, logLevel, audioLate
17
17
  const logging = (0, react_1.useMemo)(() => {
18
18
  return { logLevel, mountTime: Date.now() };
19
19
  }, [logLevel]);
20
- return (jsx_runtime_1.jsx(log_level_context_js_1.LogLevelContext.Provider, { value: logging, children: jsx_runtime_1.jsx(TimelineContext_js_1.TimelineContextProvider, { frameState: frameState, children: jsx_runtime_1.jsx(use_media_enabled_js_1.MediaEnabledProvider, { videoEnabled: videoEnabled, audioEnabled: audioEnabled, children: jsx_runtime_1.jsx(EditorProps_js_1.EditorPropsProvider, { children: jsx_runtime_1.jsx(prefetch_state_js_1.PrefetchProvider, { children: jsx_runtime_1.jsx(SequenceManager_js_1.SequenceManagerProvider, { children: jsx_runtime_1.jsx(duration_state_js_1.DurationsContextProvider, { children: jsx_runtime_1.jsx(buffering_js_1.BufferingProvider, { children: jsx_runtime_1.jsx(shared_audio_tags_js_1.SharedAudioContextProvider, { audioLatencyHint: audioLatencyHint, audioEnabled: audioEnabled, previewSampleRate: previewSampleRate, _experimentalKeepAudioContextAlive: _experimentalKeepAudioContextAlive, children: jsx_runtime_1.jsx(shared_audio_tags_js_1.SharedAudioTagsContextProvider, { numberOfAudioTags: numberOfAudioTags, children: jsx_runtime_1.jsx(use_video_js_1.VideoProvider, { children: children }) }) }) }) }) }) }) }) }) }) }));
20
+ return ((0, jsx_runtime_1.jsx)(log_level_context_js_1.LogLevelContext.Provider, { value: logging, children: (0, jsx_runtime_1.jsx)(TimelineContext_js_1.TimelineContextProvider, { frameState: frameState, children: (0, jsx_runtime_1.jsx)(use_media_enabled_js_1.MediaEnabledProvider, { videoEnabled: videoEnabled, audioEnabled: audioEnabled, children: (0, jsx_runtime_1.jsx)(EditorProps_js_1.EditorPropsProvider, { children: (0, jsx_runtime_1.jsx)(prefetch_state_js_1.PrefetchProvider, { children: (0, jsx_runtime_1.jsx)(SequenceManager_js_1.SequenceManagerProvider, { children: (0, jsx_runtime_1.jsx)(duration_state_js_1.DurationsContextProvider, { children: (0, jsx_runtime_1.jsx)(buffering_js_1.BufferingProvider, { children: (0, jsx_runtime_1.jsx)(shared_audio_tags_js_1.SharedAudioContextProvider, { audioLatencyHint: audioLatencyHint, audioEnabled: audioEnabled, previewSampleRate: previewSampleRate, _experimentalKeepAudioContextAlive: _experimentalKeepAudioContextAlive, children: (0, jsx_runtime_1.jsx)(shared_audio_tags_js_1.SharedAudioTagsContextProvider, { numberOfAudioTags: numberOfAudioTags, children: (0, jsx_runtime_1.jsx)(use_video_js_1.VideoProvider, { children: children }) }) }) }) }) }) }) }) }) }) }));
21
21
  };
22
22
  exports.RemotionRootContexts = RemotionRootContexts;
@@ -52,6 +52,6 @@ const RenderAssetManagerProvider = ({ children, collectAssets }) => {
52
52
  renderAssets,
53
53
  };
54
54
  }, [renderAssets, registerRenderAsset, unregisterRenderAsset]);
55
- return (jsx_runtime_1.jsx(exports.RenderAssetManager.Provider, { value: contextValue, children: children }));
55
+ return ((0, jsx_runtime_1.jsx)(exports.RenderAssetManager.Provider, { value: contextValue, children: children }));
56
56
  };
57
57
  exports.RenderAssetManagerProvider = RenderAssetManagerProvider;
@@ -64,6 +64,26 @@ const with_interactivity_schema_js_1 = require("./with-interactivity-schema.js")
64
64
  const SeriesContentVisibilityContext = (0, react_1.createContext)(true);
65
65
  const SequenceContextProvider = (0, committed_metadata_js_1.withCommittedMetadata)(SequenceContext_js_1.SequenceContext.Provider);
66
66
  const EMPTY_EFFECTS = [];
67
+ // Bind explicit arguments instead of capturing render variables. Extracted hooks
68
+ // can be inlined by minifiers and retain children through their shared scope.
69
+ const getSequenceRegistration = (sequence) => {
70
+ return sequence;
71
+ };
72
+ const getSequenceStack = (stack) => {
73
+ return stack;
74
+ };
75
+ const getSequenceCurrentFrame = (ref) => {
76
+ return ref.current;
77
+ };
78
+ const setSequenceWrapperRef = (ref, wrapperRef, node) => {
79
+ wrapperRef.current = node;
80
+ if (typeof ref === 'function') {
81
+ ref(node);
82
+ }
83
+ else if (ref) {
84
+ ref.current = node;
85
+ }
86
+ };
67
87
  const RegularSequenceRefForwardingFunction = ({ from = 0, trimBefore = 0, playbackRate = 1, loop = false, freeze, durationInFrames, children, name, height, width, showInTimeline = true, hidden = false, controls, _remotionInternalEffects, _remotionInternalTimelineTrack: timelineTrackItem, _remotionInternalLoopDisplay: loopDisplay, _remotionInternalStack: stack, _remotionInternalSingleChildComponent: childComponentOverride, _remotionInternalDocumentationLink: documentationLink, _remotionInternalPremountDisplay: premountDisplay, _remotionInternalPostmountDisplay: postmountDisplay, _remotionInternalIsMedia: isMedia, cropLeft, cropRight, cropTop, cropBottom, ...other }, ref) => {
68
88
  var _a, _b, _c, _d, _e, _f, _g, _h, _j;
69
89
  const { layout = 'absolute-fill' } = other;
@@ -307,14 +327,14 @@ const RegularSequenceRefForwardingFunction = ({ from = 0, trimBefore = 0, playba
307
327
  const registrationStack = controls
308
328
  ? ((_f = (_e = (0, enable_sequence_stack_traces_js_1.getStackForControls)(controls)) !== null && _e !== void 0 ? _e : stack) !== null && _f !== void 0 ? _f : null)
309
329
  : (stack !== null && stack !== void 0 ? stack : null);
310
- const getStack = (0, react_1.useCallback)(() => registrationStack, [registrationStack]);
330
+ const getStack = (0, react_1.useMemo)(() => getSequenceStack.bind(null, registrationStack), [registrationStack]);
311
331
  const registeredFrozenFrame = typeof freeze === 'number' ? freeze : null;
312
332
  const currentFrame = registeredFrozenFrame !== null && registeredFrozenFrame !== void 0 ? registeredFrozenFrame : (absoluteFrame - currentSequenceStart) * cumulativePlaybackRate;
313
333
  const currentFrameRef = (0, react_1.useRef)(currentFrame);
314
334
  (0, react_1.useLayoutEffect)(() => {
315
335
  currentFrameRef.current = currentFrame;
316
336
  }, [currentFrame]);
317
- const getCurrentFrame = (0, react_1.useCallback)(() => currentFrameRef.current, []);
337
+ const getCurrentFrame = (0, react_1.useMemo)(() => getSequenceCurrentFrame.bind(null, currentFrameRef), [currentFrameRef]);
318
338
  const registeredTrimBefore = trimBefore === 0 ? null : trimBefore;
319
339
  const parentCumulatedNegativeFrom = (_g = parentSequence === null || parentSequence === void 0 ? void 0 : parentSequence.cumulatedNegativeFrom) !== null && _g !== void 0 ? _g : 0;
320
340
  const startMediaFrom = isMedia && isMedia.type !== 'image'
@@ -358,10 +378,7 @@ const RegularSequenceRefForwardingFunction = ({ from = 0, trimBefore = 0, playba
358
378
  controlsComponentIdentity ===
359
379
  'dev.remotion.transitions.TransitionSeries.Overlay';
360
380
  const seriesContentVisible = (0, react_1.useContext)(SeriesContentVisibilityContext);
361
- const effectRuntimeValues = (0, react_1.useMemo)(() => {
362
- var _a;
363
- return (_a = _remotionInternalEffects === null || _remotionInternalEffects === void 0 ? void 0 : _remotionInternalEffects.runtimeValues) !== null && _a !== void 0 ? _a : null;
364
- }, [_remotionInternalEffects]);
381
+ const effectRuntimeValues = (0, react_1.useMemo)(() => { var _a; return (_a = _remotionInternalEffects === null || _remotionInternalEffects === void 0 ? void 0 : _remotionInternalEffects.runtimeValues) !== null && _a !== void 0 ? _a : null; }, [_remotionInternalEffects]);
365
382
  const registrationControls = (0, react_1.useMemo)(() => {
366
383
  if (controlsSchema === undefined ||
367
384
  controlsRuntimeValues === undefined ||
@@ -390,7 +407,7 @@ const RegularSequenceRefForwardingFunction = ({ from = 0, trimBefore = 0, playba
390
407
  controlsSchema,
391
408
  controlsSupportsEffects,
392
409
  ]);
393
- const getSequenceForRegistration = (0, react_1.useCallback)(() => {
410
+ const sequenceForRegistration = (0, react_1.useMemo)(() => {
394
411
  var _a, _b, _c;
395
412
  const trackRegistration = timelineTrack
396
413
  ? {
@@ -527,6 +544,7 @@ const RegularSequenceRefForwardingFunction = ({ from = 0, trimBefore = 0, playba
527
544
  frozenMediaFrame,
528
545
  singleChildComponent,
529
546
  ]);
547
+ const getSequenceForRegistration = (0, react_1.useMemo)(() => getSequenceRegistration.bind(null, sequenceForRegistration), [sequenceForRegistration]);
530
548
  const registration = (0, use_sequence_registration_js_1.useSequenceRegistration)({
531
549
  getSequence: env.isStudio || sequenceRegistrationEnabled
532
550
  ? getSequenceForRegistration
@@ -569,8 +587,8 @@ const RegularSequenceRefForwardingFunction = ({ from = 0, trimBefore = 0, playba
569
587
  const content = (activityEnabled ? renderActivity : contentVisible)
570
588
  ? children
571
589
  : null;
572
- const frozenContent = content === null || typeof freeze === 'undefined' || freeze === null ? (content) : (jsx_runtime_1.jsx(freeze_js_1.Freeze, { frame: freeze, children: content }));
573
- const loopedContent = frozenContent === null || loopContextValue === null ? (frozenContent) : (jsx_runtime_1.jsx(loop_context_js_1.LoopContext.Provider, { value: loopContextValue, children: frozenContent }));
590
+ const frozenContent = content === null || typeof freeze === 'undefined' || freeze === null ? (content) : ((0, jsx_runtime_1.jsx)(freeze_js_1.Freeze, { frame: freeze, children: content }));
591
+ const loopedContent = frozenContent === null || loopContextValue === null ? (frozenContent) : ((0, jsx_runtime_1.jsx)(loop_context_js_1.LoopContext.Provider, { value: loopContextValue, children: frozenContent }));
574
592
  const styleIfThere = other.layout === 'none' ? undefined : other.style;
575
593
  const cropClipPath = (0, sequence_crop_js_1.getSequenceCropClipPath)({
576
594
  left: resolvedCropLeft,
@@ -579,15 +597,7 @@ const RegularSequenceRefForwardingFunction = ({ from = 0, trimBefore = 0, playba
579
597
  bottom: resolvedCropBottom,
580
598
  style: styleIfThere,
581
599
  });
582
- const sequenceRef = (0, react_1.useCallback)((node) => {
583
- wrapperRefForOutline.current = node;
584
- if (typeof ref === 'function') {
585
- ref(node);
586
- }
587
- else if (ref) {
588
- ref.current = node;
589
- }
590
- }, [ref]);
600
+ const sequenceRef = (0, react_1.useMemo)(() => setSequenceWrapperRef.bind(null, ref, wrapperRefForOutline), [ref, wrapperRefForOutline]);
591
601
  const defaultStyle = (0, react_1.useMemo)(() => {
592
602
  return {
593
603
  flexDirection: undefined,
@@ -613,17 +623,17 @@ const RegularSequenceRefForwardingFunction = ({ from = 0, trimBefore = 0, playba
613
623
  }
614
624
  : null, [automaticOutlineRef, id, registration, shouldDiscoverOutline]);
615
625
  if (hidden) {
616
- return shouldDiscoverOutline || registration !== null ? (jsx_runtime_1.jsx(SequenceContextProvider, { value: contextValue, _remotionCommitMetadata: metadata, children: null })) : null;
626
+ return shouldDiscoverOutline || registration !== null ? ((0, jsx_runtime_1.jsx)(SequenceContextProvider, { value: contextValue, _remotionCommitMetadata: metadata, children: null })) : null;
617
627
  }
618
628
  // Retain resolved scene registrations so Studio can recover the natural end
619
629
  // even when seeking past an explicit wrapper trim. Scene contents stay hidden.
620
630
  const retainSeriesRegistration = env.isStudio && canInferDuration;
621
- const contentForLayout = renderActivity ? (jsx_runtime_1.jsx(SequenceActivityBoundary_js_1.SequenceActivityContent, { dormant: activityDormant, children: loopedContent })) : (loopedContent);
622
- const renderedContent = loopedContent === null ? (retainSeriesRegistration ? (children) : null) : other.layout === 'none' ? (contentForLayout) : (jsx_runtime_1.jsx(AbsoluteFillElement_js_1.AbsoluteFillElement, { ref: sequenceRef, style: defaultStyle, className: other.className, children: contentForLayout }));
623
- const activityContent = renderActivity ? (jsx_runtime_1.jsx(SequenceActivityBoundary_js_1.SequenceActivityBoundary, { dormant: activityDormant, frame: firstFrame, children: renderedContent })) : (renderedContent);
624
- const sequenceContent = (jsx_runtime_1.jsx(SequenceContextProvider, { value: contextValue, _remotionCommitMetadata: metadata, children: retainSeriesRegistration ? (jsx_runtime_1.jsx(SeriesContentVisibilityContext.Provider, { value: renderActivity || contentVisible, children: activityContent })) : (activityContent) }));
631
+ const contentForLayout = renderActivity ? ((0, jsx_runtime_1.jsx)(SequenceActivityBoundary_js_1.SequenceActivityContent, { dormant: activityDormant, children: loopedContent })) : (loopedContent);
632
+ const renderedContent = loopedContent === null ? (retainSeriesRegistration ? (children) : null) : other.layout === 'none' ? (contentForLayout) : ((0, jsx_runtime_1.jsx)(AbsoluteFillElement_js_1.AbsoluteFillElement, { ref: sequenceRef, style: defaultStyle, className: other.className, children: contentForLayout }));
633
+ const activityContent = renderActivity ? ((0, jsx_runtime_1.jsx)(SequenceActivityBoundary_js_1.SequenceActivityBoundary, { dormant: activityDormant, frame: firstFrame, children: renderedContent })) : (renderedContent);
634
+ const sequenceContent = ((0, jsx_runtime_1.jsx)(SequenceContextProvider, { value: contextValue, _remotionCommitMetadata: metadata, children: retainSeriesRegistration ? ((0, jsx_runtime_1.jsx)(SeriesContentVisibilityContext.Provider, { value: renderActivity || contentVisible, children: activityContent })) : (activityContent) }));
625
635
  // Keep the provider mounted when track grouping changes so clip state survives.
626
- const sequence = (jsx_runtime_1.jsx(timeline_track_context_js_1.TimelineTrackContext.Provider, { value: timelineTrackRole === 'track' ||
636
+ const sequence = ((0, jsx_runtime_1.jsx)(timeline_track_context_js_1.TimelineTrackContext.Provider, { value: timelineTrackRole === 'track' ||
627
637
  (timelineTrackRole === 'clip' && !showInTimeline)
628
638
  ? timelineTrack
629
639
  : null, children: sequenceContent }));
@@ -649,7 +659,7 @@ const PremountedPostmountedSequenceRefForwardingFunction = (props, ref) => {
649
659
  styleWhilePostmounted: styleWhilePostmounted !== null && styleWhilePostmounted !== void 0 ? styleWhilePostmounted : null,
650
660
  hideWhilePremounted: 'opacity',
651
661
  });
652
- return (jsx_runtime_1.jsx(freeze_js_1.Freeze, { frame: freezeFrame, active: isPremountingOrPostmounting, _remotionInternalIsPremounting: premountingActive, children: jsx_runtime_1.jsx(RegularSequence, { ref: ref, from: from, durationInFrames: durationInFrames, style: premountingStyle !== null && premountingStyle !== void 0 ? premountingStyle : undefined, _remotionInternalPremountDisplay: premountFor, _remotionInternalPostmountDisplay: postmountFor, _remotionInternalIsPremounting: premountingActive, _remotionInternalIsPostmounting: postmountingActive, ...otherProps }) }));
662
+ return ((0, jsx_runtime_1.jsx)(freeze_js_1.Freeze, { frame: freezeFrame, active: isPremountingOrPostmounting, _remotionInternalIsPremounting: premountingActive, children: (0, jsx_runtime_1.jsx)(RegularSequence, { ref: ref, from: from, durationInFrames: durationInFrames, style: premountingStyle !== null && premountingStyle !== void 0 ? premountingStyle : undefined, _remotionInternalPremountDisplay: premountFor, _remotionInternalPostmountDisplay: postmountFor, _remotionInternalIsPremounting: premountingActive, _remotionInternalIsPostmounting: postmountingActive, ...otherProps }) }));
653
663
  };
654
664
  const PremountedPostmountedSequence = (0, react_1.forwardRef)(PremountedPostmountedSequenceRefForwardingFunction);
655
665
  const SequenceRefForwardingFunction = (props, ref) => {
@@ -660,10 +670,10 @@ const SequenceRefForwardingFunction = (props, ref) => {
660
670
  if (props.layout !== 'none' && !env.isRendering) {
661
671
  const effectivePremountFor = (_a = props.premountFor) !== null && _a !== void 0 ? _a : Math.round(defaultPremountInSeconds * fps);
662
672
  if (effectivePremountFor || props.postmountFor) {
663
- return (jsx_runtime_1.jsx(PremountedPostmountedSequence, { ref: ref, ...props, premountFor: effectivePremountFor }));
673
+ return ((0, jsx_runtime_1.jsx)(PremountedPostmountedSequence, { ref: ref, ...props, premountFor: effectivePremountFor }));
664
674
  }
665
675
  }
666
- return jsx_runtime_1.jsx(RegularSequence, { ...props, ref: ref });
676
+ return (0, jsx_runtime_1.jsx)(RegularSequence, { ...props, ref: ref });
667
677
  };
668
678
  const SequenceInner = (0, react_1.forwardRef)(SequenceRefForwardingFunction);
669
679
  exports.SequenceWithoutSchema = SequenceInner;
@@ -96,6 +96,6 @@ const SequenceActivityBoundary = ({ children, dormant, frame }) => {
96
96
  // Keep the providers and Activity at the same position when activating a
97
97
  // scene. Unlike Freeze, discovery does not reset SequenceContext origins or
98
98
  // disable Series duration inference.
99
- return (jsx_runtime_1.jsx(sequence_activity_context_js_1.SequenceActivityDormantContext.Provider, { value: dormant, children: jsx_runtime_1.jsx(sequence_activity_context_js_1.SequenceActivityTimelineContext.Provider, { value: dormant ? dormantTimeline : null, children: jsx_runtime_1.jsx(sequence_activity_context_js_1.SequenceActivityAbsoluteTimeContext.Provider, { value: dormant ? dormantTimeline : null, children: jsx_runtime_1.jsx(TimelineContext_js_1.TimelineContext.Provider, { value: dormant ? dormantTimeline : timeline, children: jsx_runtime_1.jsx(TimelineContext_js_1.AbsoluteTimeContext.Provider, { value: dormant ? dormantTimeline : absoluteTime, children: jsx_runtime_1.jsx(react_1.default.Activity, { mode: dormant && !parentDormant ? 'hidden' : 'visible', children: jsx_runtime_1.jsx(SuspendSequenceActivity, { dormant: dormant, children: children }) }) }) }) }) }) }));
99
+ return ((0, jsx_runtime_1.jsx)(sequence_activity_context_js_1.SequenceActivityDormantContext.Provider, { value: dormant, children: (0, jsx_runtime_1.jsx)(sequence_activity_context_js_1.SequenceActivityTimelineContext.Provider, { value: dormant ? dormantTimeline : null, children: (0, jsx_runtime_1.jsx)(sequence_activity_context_js_1.SequenceActivityAbsoluteTimeContext.Provider, { value: dormant ? dormantTimeline : null, children: (0, jsx_runtime_1.jsx)(TimelineContext_js_1.TimelineContext.Provider, { value: dormant ? dormantTimeline : timeline, children: (0, jsx_runtime_1.jsx)(TimelineContext_js_1.AbsoluteTimeContext.Provider, { value: dormant ? dormantTimeline : absoluteTime, children: (0, jsx_runtime_1.jsx)(react_1.default.Activity, { mode: dormant && !parentDormant ? 'hidden' : 'visible', children: (0, jsx_runtime_1.jsx)(SuspendSequenceActivity, { dormant: dormant, children: children }) }) }) }) }) }) }));
100
100
  };
101
101
  exports.SequenceActivityBoundary = SequenceActivityBoundary;
@@ -165,7 +165,7 @@ const SequenceActivityBudgetProvider = ({ children }) => {
165
165
  budget.setFrame(timeline.frame);
166
166
  }
167
167
  }, [admitting, budget, limit, suspended, timeline]);
168
- return (jsx_runtime_1.jsx(ActivityBudgetContext.Provider, { value: admitting ? budget : null, children: jsx_runtime_1.jsx(ActivitySelectionContext.Provider, { value: admitted, children: children }) }));
168
+ return ((0, jsx_runtime_1.jsx)(ActivityBudgetContext.Provider, { value: admitting ? budget : null, children: (0, jsx_runtime_1.jsx)(ActivitySelectionContext.Provider, { value: admitted, children: children }) }));
169
169
  };
170
170
  exports.SequenceActivityBudgetProvider = SequenceActivityBudgetProvider;
171
171
  const useSequenceActivityAdmission = (candidate) => {
@@ -40,6 +40,6 @@ const SequenceActivitySuspensionProvider = ({ children }) => {
40
40
  }
41
41
  };
42
42
  }, [enabled, isPlaying, seek, subscribePlaying]);
43
- return (jsx_runtime_1.jsx(sequence_activity_context_js_1.SequenceActivitySuspensionContext.Provider, { value: suspended, children: children }));
43
+ return ((0, jsx_runtime_1.jsx)(sequence_activity_context_js_1.SequenceActivitySuspensionContext.Provider, { value: suspended, children: children }));
44
44
  };
45
45
  exports.SequenceActivitySuspensionProvider = SequenceActivitySuspensionProvider;
@@ -81,9 +81,15 @@ export type CanUpdateSequencePropsResponse<Numeric = SourceNumericValue> = CanUp
81
81
  export declare const makeSequencePropsSubscriptionKey: (key: SequencePropsSubscriptionKey) => string;
82
82
  export declare const VisualModePropStatusesContext: React.Context<VisualModePropStatuses>;
83
83
  export declare const VisualModePropStatusesRefContext: React.Context<VisualModePropStatusesRef>;
84
+ export type VisualModePropStatusesSubscription = {
85
+ subscribe: (key: string | null, listener: () => void) => () => void;
86
+ getSnapshot: (key: string | null) => CanUpdateSequencePropsResponse | null;
87
+ };
88
+ export declare const VisualModePropStatusesSubscriptionContext: React.Context<VisualModePropStatusesSubscription>;
84
89
  export declare const VisualModeDragOverridesContext: React.Context<VisualModeDragOverrides>;
85
90
  export declare const VisualModeDragOverridesRefContext: React.Context<React.RefObject<VisualModeDragOverrides>>;
86
91
  export declare const useDragOverridesForNodePath: (nodePath: SequencePropsSubscriptionKey | null) => Record<string, DragOverrideValue>;
92
+ export declare const usePropStatusForNodePath: (nodePath: SequencePropsSubscriptionKey | null) => CanUpdateSequencePropsResponse | null;
87
93
  export declare const useActiveFromDragOverrideKeys: () => ReadonlySet<string>;
88
94
  export declare const useEffectDragOverridesForNodePath: (nodePath: SequencePropsSubscriptionKey | null) => Record<string, Record<string, DragOverrideValue>>;
89
95
  export declare const VisualModeSettersContext: React.Context<VisualModeSetters>;
@@ -37,7 +37,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
37
37
  };
38
38
  var _a;
39
39
  Object.defineProperty(exports, "__esModule", { value: true });
40
- 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;
40
+ exports.SequenceManagerProvider = exports.VisualModeBatchSettersContext = exports.VisualModeSettersContext = exports.useEffectDragOverridesForNodePath = exports.useActiveFromDragOverrideKeys = exports.usePropStatusForNodePath = exports.useDragOverridesForNodePath = exports.VisualModeDragOverridesRefContext = exports.VisualModeDragOverridesContext = exports.VisualModePropStatusesSubscriptionContext = exports.VisualModePropStatusesRefContext = exports.VisualModePropStatusesContext = exports.makeSequencePropsSubscriptionKey = exports.VisualModeDragOverridesSubscriptionContext = void 0;
41
41
  const jsx_runtime_1 = require("react/jsx-runtime");
42
42
  const react_1 = __importStar(require("react"));
43
43
  __exportStar(require("./sequence-registry-context.js"), exports);
@@ -60,10 +60,10 @@ const SequenceManagerScopeProviders = ({ children, dragOverridesSubscription, fr
60
60
  const manager = (0, react_1.useContext)(sequence_registry_context_js_1.SequenceManagerActionsContext);
61
61
  const scopedDragOverridesSubscription = (0, react_1.useMemo)(() => ({ ...dragOverridesSubscription, manager }), [dragOverridesSubscription, manager]);
62
62
  const activeFromDragOverrideKeys = (0, react_1.useMemo)(() => ({ manager, keys: fromKeys }), [fromKeys, manager]);
63
- 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: ((_a = activitySettings === null || activitySettings === void 0 ? void 0 : activitySettings.limit) !== null && _a !== void 0 ? _a : sequence_activity_context_js_1.DEFAULT_SEQUENCE_ACTIVITY_LIMIT) > 0 &&
63
+ return ((0, jsx_runtime_1.jsx)(ActiveFromDragOverrideKeysContext.Provider, { value: activeFromDragOverrideKeys, children: (0, jsx_runtime_1.jsx)(exports.VisualModeDragOverridesSubscriptionContext.Provider, { value: scopedDragOverridesSubscription, children: (0, jsx_runtime_1.jsx)(sequence_activity_context_js_1.SequenceActivityContext.Provider, { value: ((_a = activitySettings === null || activitySettings === void 0 ? void 0 : activitySettings.limit) !== null && _a !== void 0 ? _a : sequence_activity_context_js_1.DEFAULT_SEQUENCE_ACTIVITY_LIMIT) > 0 &&
64
64
  isStudio &&
65
65
  commitRegistrationEnabled &&
66
- typeof react_1.default.Activity !== 'undefined', children: jsx_runtime_1.jsx(SequenceActivitySuspensionProvider_js_1.SequenceActivitySuspensionProvider, { children: jsx_runtime_1.jsx(SequenceActivityBudget_js_1.SequenceActivityBudgetProvider, { children: children }) }) }) }) }));
66
+ typeof react_1.default.Activity !== 'undefined', children: (0, jsx_runtime_1.jsx)(SequenceActivitySuspensionProvider_js_1.SequenceActivitySuspensionProvider, { children: (0, jsx_runtime_1.jsx)(SequenceActivityBudget_js_1.SequenceActivityBudgetProvider, { children: children }) }) }) }) }));
67
67
  };
68
68
  const emptyDragOverrides = {};
69
69
  const emptyFromOverrideKeys = new Set();
@@ -78,6 +78,10 @@ exports.VisualModePropStatusesContext = react_1.default.createContext({
78
78
  exports.VisualModePropStatusesRefContext = react_1.default.createContext({
79
79
  current: {},
80
80
  });
81
+ exports.VisualModePropStatusesSubscriptionContext = react_1.default.createContext({
82
+ subscribe: () => () => undefined,
83
+ getSnapshot: () => null,
84
+ });
81
85
  const defaultVisualModeDragOverrides = {
82
86
  getDragOverrides: () => {
83
87
  throw new Error('VisualModeDragOverridesContext not initialized');
@@ -88,7 +92,7 @@ const defaultVisualModeDragOverrides = {
88
92
  };
89
93
  exports.VisualModeDragOverridesContext = react_1.default.createContext(defaultVisualModeDragOverrides);
90
94
  exports.VisualModeDragOverridesRefContext = react_1.default.createContext({ current: defaultVisualModeDragOverrides });
91
- const useDragOverrideSnapshot = (subscribe, getSnapshot) => {
95
+ const useVisualModeSnapshot = (subscribe, getSnapshot) => {
92
96
  const dormant = (0, react_1.useContext)(sequence_activity_context_js_1.SequenceActivityDormantContext);
93
97
  const [, forceUpdate] = (0, react_1.useState)(0);
94
98
  const snapshot = (0, use_sync_external_store_js_1.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
@@ -107,17 +111,21 @@ const useDragOverridesForNodePath = (nodePath) => {
107
111
  const manager = (0, react_1.useContext)(sequence_registry_context_js_1.SequenceManagerActionsContext);
108
112
  const scopedSubscription = (subscription === null || subscription === void 0 ? void 0 : subscription.manager) === manager ? subscription : null;
109
113
  const key = nodePath === null ? null : (0, exports.makeSequencePropsSubscriptionKey)(nodePath);
110
- const subscribe = (0, react_1.useCallback)((listener) => {
111
- var _a;
112
- return (_a = scopedSubscription === null || scopedSubscription === void 0 ? void 0 : scopedSubscription.subscribe(key, listener)) !== null && _a !== void 0 ? _a : (() => undefined);
113
- }, [key, scopedSubscription]);
114
- const getSnapshot = (0, react_1.useCallback)(() => {
115
- var _a;
116
- return (_a = scopedSubscription === null || scopedSubscription === void 0 ? void 0 : scopedSubscription.getSnapshot(key)) !== null && _a !== void 0 ? _a : emptyDragOverrides;
117
- }, [key, scopedSubscription]);
118
- return useDragOverrideSnapshot(subscribe, getSnapshot);
114
+ const subscribe = (0, react_1.useCallback)((listener) => { var _a; return (_a = scopedSubscription === null || scopedSubscription === void 0 ? void 0 : scopedSubscription.subscribe(key, listener)) !== null && _a !== void 0 ? _a : (() => undefined); }, [key, scopedSubscription]);
115
+ const getSnapshot = (0, react_1.useCallback)(() => { var _a; return (_a = scopedSubscription === null || scopedSubscription === void 0 ? void 0 : scopedSubscription.getSnapshot(key)) !== null && _a !== void 0 ? _a : emptyDragOverrides; }, [key, scopedSubscription]);
116
+ return useVisualModeSnapshot(subscribe, getSnapshot);
119
117
  };
120
118
  exports.useDragOverridesForNodePath = useDragOverridesForNodePath;
119
+ // Every visual element reads its own status. Subscribing to the whole map would
120
+ // rerender all of them whenever any status in the project changes.
121
+ const usePropStatusForNodePath = (nodePath) => {
122
+ const subscription = (0, react_1.useContext)(exports.VisualModePropStatusesSubscriptionContext);
123
+ const key = nodePath === null ? null : (0, exports.makeSequencePropsSubscriptionKey)(nodePath);
124
+ const subscribe = (0, react_1.useCallback)((listener) => subscription.subscribe(key, listener), [key, subscription]);
125
+ const getSnapshot = (0, react_1.useCallback)(() => subscription.getSnapshot(key), [key, subscription]);
126
+ return useVisualModeSnapshot(subscribe, getSnapshot);
127
+ };
128
+ exports.usePropStatusForNodePath = usePropStatusForNodePath;
121
129
  const useActiveFromDragOverrideKeys = () => {
122
130
  const snapshot = (0, react_1.useContext)(ActiveFromDragOverrideKeysContext);
123
131
  const manager = (0, react_1.useContext)(sequence_registry_context_js_1.SequenceManagerActionsContext);
@@ -129,15 +137,9 @@ const useEffectDragOverridesForNodePath = (nodePath) => {
129
137
  const manager = (0, react_1.useContext)(sequence_registry_context_js_1.SequenceManagerActionsContext);
130
138
  const scopedSubscription = (subscription === null || subscription === void 0 ? void 0 : subscription.manager) === manager ? subscription : null;
131
139
  const key = nodePath === null ? null : (0, exports.makeSequencePropsSubscriptionKey)(nodePath);
132
- const subscribe = (0, react_1.useCallback)((listener) => {
133
- var _a;
134
- return (_a = scopedSubscription === null || scopedSubscription === void 0 ? void 0 : scopedSubscription.subscribeEffects(key, listener)) !== null && _a !== void 0 ? _a : (() => undefined);
135
- }, [key, scopedSubscription]);
136
- const getSnapshot = (0, react_1.useCallback)(() => {
137
- var _a;
138
- return (_a = scopedSubscription === null || scopedSubscription === void 0 ? void 0 : scopedSubscription.getEffectSnapshot(key)) !== null && _a !== void 0 ? _a : emptyEffectDragOverrides;
139
- }, [key, scopedSubscription]);
140
- return useDragOverrideSnapshot(subscribe, getSnapshot);
140
+ const subscribe = (0, react_1.useCallback)((listener) => { var _a; return (_a = scopedSubscription === null || scopedSubscription === void 0 ? void 0 : scopedSubscription.subscribeEffects(key, listener)) !== null && _a !== void 0 ? _a : (() => undefined); }, [key, scopedSubscription]);
141
+ const getSnapshot = (0, react_1.useCallback)(() => { var _a; return (_a = scopedSubscription === null || scopedSubscription === void 0 ? void 0 : scopedSubscription.getEffectSnapshot(key)) !== null && _a !== void 0 ? _a : emptyEffectDragOverrides; }, [key, scopedSubscription]);
142
+ return useVisualModeSnapshot(subscribe, getSnapshot);
141
143
  };
142
144
  exports.useEffectDragOverridesForNodePath = useEffectDragOverridesForNodePath;
143
145
  exports.VisualModeSettersContext = react_1.default.createContext({
@@ -180,8 +182,21 @@ const SequenceManagerProvider = ({ children }) => {
180
182
  });
181
183
  const [propStatuses, setPropStatusesMapState] = (0, react_1.useState)({});
182
184
  const propStatusesRef = (0, react_1.useRef)(propStatuses);
185
+ // Elements read their own status from the latest requested map, so one that
186
+ // rerenders together with a status update never renders the previous status.
187
+ // The layout effect wakes up the elements that did not rerender.
188
+ const requestedPropStatusesRef = (0, react_1.useRef)(propStatuses);
189
+ const propStatusListeners = (0, react_1.useRef)(new Map());
183
190
  useIsomorphicLayoutEffect(() => {
191
+ const previous = propStatusesRef.current;
184
192
  propStatusesRef.current = propStatuses;
193
+ for (const [key, listeners] of propStatusListeners.current) {
194
+ if (previous[key] !== propStatuses[key]) {
195
+ for (const listener of listeners) {
196
+ listener();
197
+ }
198
+ }
199
+ }
185
200
  }, [propStatuses]);
186
201
  const setDragOverridesBatch = (0, react_1.useCallback)((overrides) => {
187
202
  setDragOverrideState((prevState) => {
@@ -372,8 +387,17 @@ const SequenceManagerProvider = ({ children }) => {
372
387
  return next;
373
388
  });
374
389
  }, []);
390
+ const updatePropStatuses = (0, react_1.useCallback)((update) => {
391
+ const previous = requestedPropStatusesRef.current;
392
+ const next = update(previous);
393
+ if (next === previous) {
394
+ return;
395
+ }
396
+ requestedPropStatusesRef.current = next;
397
+ setPropStatusesMapState(next);
398
+ }, []);
375
399
  const setPropStatuses = (0, react_1.useCallback)((nodePath, values) => {
376
- setPropStatusesMapState((prev) => {
400
+ updatePropStatuses((prev) => {
377
401
  const key = (0, exports.makeSequencePropsSubscriptionKey)(nodePath);
378
402
  const prevKey = prev[key];
379
403
  const newKey = values(prevKey);
@@ -382,9 +406,9 @@ const SequenceManagerProvider = ({ children }) => {
382
406
  }
383
407
  return { ...prev, [key]: newKey };
384
408
  });
385
- }, []);
409
+ }, [updatePropStatuses]);
386
410
  const remapPropStatuses = (0, react_1.useCallback)((remappings) => {
387
- setPropStatusesMapState((prev) => {
411
+ updatePropStatuses((prev) => {
388
412
  const next = { ...prev };
389
413
  for (const remapping of remappings) {
390
414
  delete next[(0, exports.makeSequencePropsSubscriptionKey)(remapping.previousNodePath)];
@@ -397,7 +421,7 @@ const SequenceManagerProvider = ({ children }) => {
397
421
  }
398
422
  return next;
399
423
  });
400
- }, []);
424
+ }, [updatePropStatuses]);
401
425
  const dragOverridesSubscription = (0, react_1.useMemo)(() => ({
402
426
  subscribe: subscribeDragOverrides,
403
427
  getSnapshot: getDragOverridesSnapshot,
@@ -422,6 +446,26 @@ const SequenceManagerProvider = ({ children }) => {
422
446
  propStatuses,
423
447
  };
424
448
  }, [propStatuses]);
449
+ const propStatusesSubscription = (0, react_1.useMemo)(() => ({
450
+ subscribe: (key, listener) => {
451
+ if (key === null) {
452
+ return () => undefined;
453
+ }
454
+ let listeners = propStatusListeners.current.get(key);
455
+ if (!listeners) {
456
+ listeners = new Set();
457
+ propStatusListeners.current.set(key, listeners);
458
+ }
459
+ listeners.add(listener);
460
+ return () => {
461
+ listeners.delete(listener);
462
+ if (listeners.size === 0) {
463
+ propStatusListeners.current.delete(key);
464
+ }
465
+ };
466
+ },
467
+ getSnapshot: (key) => { var _a; return key === null ? null : ((_a = requestedPropStatusesRef.current[key]) !== null && _a !== void 0 ? _a : null); },
468
+ }), []);
425
469
  const dragOverridesContext = (0, react_1.useMemo)(() => {
426
470
  return {
427
471
  getDragOverrides,
@@ -451,6 +495,6 @@ const SequenceManagerProvider = ({ children }) => {
451
495
  remapPropStatuses,
452
496
  ]);
453
497
  const batchSettersContext = (0, react_1.useMemo)(() => ({ setDragOverridesBatch, setEffectDragOverridesBatch }), [setDragOverridesBatch, setEffectDragOverridesBatch]);
454
- 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 }) }) }) }) }) }) }) }));
498
+ return ((0, jsx_runtime_1.jsx)(SequenceRegistryProvider_js_1.SequenceRegistryProvider, { children: (0, jsx_runtime_1.jsx)(exports.VisualModePropStatusesRefContext.Provider, { value: propStatusesRef, children: (0, jsx_runtime_1.jsx)(exports.VisualModePropStatusesSubscriptionContext.Provider, { value: propStatusesSubscription, children: (0, jsx_runtime_1.jsx)(exports.VisualModePropStatusesContext.Provider, { value: propStatusesContext, children: (0, jsx_runtime_1.jsx)(SequenceManagerScopeProviders, { dragOverridesSubscription: dragOverridesSubscription, fromKeys: dragOverrideState.fromKeys, children: (0, jsx_runtime_1.jsx)(exports.VisualModeDragOverridesContext.Provider, { value: dragOverridesContext, children: (0, jsx_runtime_1.jsx)(exports.VisualModeDragOverridesRefContext.Provider, { value: dragOverridesRef, children: (0, jsx_runtime_1.jsx)(exports.VisualModeSettersContext.Provider, { value: settersContext, children: (0, jsx_runtime_1.jsx)(exports.VisualModeBatchSettersContext.Provider, { value: batchSettersContext, children: children }) }) }) }) }) }) }) }) }));
455
499
  };
456
500
  exports.SequenceManagerProvider = SequenceManagerProvider;
@@ -37,6 +37,8 @@ exports.SequenceRegistryProvider = void 0;
37
37
  const jsx_runtime_1 = require("react/jsx-runtime");
38
38
  const react_1 = __importStar(require("react"));
39
39
  const committed_metadata_js_1 = require("./committed-metadata.js");
40
+ const log_level_context_js_1 = require("./log-level-context.js");
41
+ const log_js_1 = require("./log.js");
40
42
  const registry_store_js_1 = require("./registry-store.js");
41
43
  const sequence_registry_context_js_1 = require("./sequence-registry-context.js");
42
44
  const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
@@ -44,6 +46,7 @@ const useIsomorphicLayoutEffect = typeof window === 'undefined' ? react_1.defaul
44
46
  const SequenceManagerRefProvider = (0, committed_metadata_js_1.withCommittedMetadata)(sequence_registry_context_js_1.SequenceManagerRefContext.Provider);
45
47
  const SequenceRegistryProvider = ({ children }) => {
46
48
  const { isStudio } = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
49
+ const logLevel = (0, log_level_context_js_1.useLogLevel)();
47
50
  const sequenceRegistrationEnabled = (0, react_1.useContext)(sequence_registry_context_js_1.SequenceRegistrationContext);
48
51
  const shouldObserveCommits = isStudio || sequenceRegistrationEnabled;
49
52
  const [sequenceManagerId] = (0, react_1.useState)(() => String(Math.random()));
@@ -116,6 +119,13 @@ const SequenceRegistryProvider = ({ children }) => {
116
119
  committedOrderIdsRef.current = ids;
117
120
  committedOrderRef.current = order;
118
121
  committedRegistrationIdsRef.current = nextIds;
122
+ if (isStudio && logLevel === 'trace') {
123
+ for (const sequence of sequences) {
124
+ if (!previousIds.has(sequence.id)) {
125
+ log_js_1.Log.trace({ logLevel, tag: null }, `[Sequence registration] Registered "${sequence.displayName}" (${sequence.id}) after commit`, sequence);
126
+ }
127
+ }
128
+ }
119
129
  setSequences((current) => (0, registry_store_js_1.reconcileRegistryEntries)({
120
130
  current,
121
131
  entries: sequences,
@@ -127,7 +137,7 @@ const SequenceRegistryProvider = ({ children }) => {
127
137
  orderProperty: 'timelineOrder',
128
138
  }));
129
139
  });
130
- }, [sequenceManagerId, setSequences]);
140
+ }, [isStudio, logLevel, sequenceManagerId, setSequences]);
131
141
  const onCommitRootSequences = (0, react_1.useCallback)((sequences, sequenceIds) => {
132
142
  if (!rootObservationFailedRef.current) {
133
143
  observedCommitRef.current = true;
@@ -233,6 +243,9 @@ const SequenceRegistryProvider = ({ children }) => {
233
243
  onCommitSequences,
234
244
  ]);
235
245
  const registerSequence = (0, react_1.useCallback)((seq) => {
246
+ if (isStudio) {
247
+ log_js_1.Log.trace({ logLevel, tag: null }, `[Sequence registration] Registered "${seq.displayName}" (${seq.id}) after commit`, seq);
248
+ }
236
249
  setSequences((seqs) => {
237
250
  var _a;
238
251
  var _b;
@@ -244,7 +257,7 @@ const SequenceRegistryProvider = ({ children }) => {
244
257
  },
245
258
  ];
246
259
  });
247
- }, [setSequences]);
260
+ }, [isStudio, logLevel, setSequences]);
248
261
  const updateSequence = (0, react_1.useCallback)((seq) => {
249
262
  setSequences((seqs) => {
250
263
  var _a;
@@ -287,6 +300,6 @@ const SequenceRegistryProvider = ({ children }) => {
287
300
  sequenceManagerId,
288
301
  shouldObserveCommits,
289
302
  ]);
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 }) }) }) }) }));
303
+ return ((0, jsx_runtime_1.jsx)(SequenceManagerRefProvider, { value: sequencesRef, _remotionCommitMetadata: metadata, children: (0, jsx_runtime_1.jsx)(sequence_registry_context_js_1.SequenceRegistryScopeContext.Provider, { value: registryScope, children: (0, jsx_runtime_1.jsx)(sequence_registry_context_js_1.SequenceManagerActionsContext.Provider, { value: actions, children: (0, jsx_runtime_1.jsx)(sequence_registry_context_js_1.SequenceRegistryContext.Provider, { value: registry, children: (0, jsx_runtime_1.jsx)(sequence_registry_context_js_1.SequenceCommitRegistrationContext.Provider, { value: commitRegistrationEnabled, children: children }) }) }) }) }));
291
304
  };
292
305
  exports.SequenceRegistryProvider = SequenceRegistryProvider;
@@ -110,6 +110,6 @@ const TimelineContextProvider = ({ children, frameState }) => {
110
110
  audioAndVideoTags,
111
111
  };
112
112
  }, [bufferingStore, playingStore, readIsBuffering, readIsPlaying, seek]);
113
- return (jsx_runtime_1.jsx(exports.AbsoluteTimeContext.Provider, { value: timelineContextValue, children: jsx_runtime_1.jsx(exports.PlaybackRateContext.Provider, { value: playbackRateContextValue, children: jsx_runtime_1.jsx(exports.TimelineContext.Provider, { value: timelineContextValue, children: jsx_runtime_1.jsx(exports.SetTimelineContext.Provider, { value: setTimelineContextValue, children: children }) }) }) }));
113
+ return ((0, jsx_runtime_1.jsx)(exports.AbsoluteTimeContext.Provider, { value: timelineContextValue, children: (0, jsx_runtime_1.jsx)(exports.PlaybackRateContext.Provider, { value: playbackRateContextValue, children: (0, jsx_runtime_1.jsx)(exports.TimelineContext.Provider, { value: timelineContextValue, children: (0, jsx_runtime_1.jsx)(exports.SetTimelineContext.Provider, { value: setTimelineContextValue, children: children }) }) }) }));
114
114
  };
115
115
  exports.TimelineContextProvider = TimelineContextProvider;
package/dist/cjs/Track.js CHANGED
@@ -18,12 +18,12 @@ const trackSchema = {
18
18
  const TrackWithoutSchema = ({ name = 'Track', children, layout = 'none', ...props }) => {
19
19
  const [id] = (0, react_1.useState)(() => String(Math.random()));
20
20
  const value = (0, react_1.useMemo)(() => ({ id, name }), [id, name]);
21
- 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 }) }));
21
+ return ((0, jsx_runtime_1.jsx)(timeline_track_context_js_1.TimelineTrackContext.Provider, { value: value, children: (0, 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 }) }));
22
22
  };
23
23
  exports.TrackWithoutSchema = TrackWithoutSchema;
24
24
  /** Groups clips on one Studio timeline row and applies Sequence timing. */
25
25
  exports.Track = (0, with_interactivity_schema_js_1.withInteractivitySchema)({
26
- Component: (props) => jsx_runtime_1.jsx(exports.TrackWithoutSchema, { ...props, layout: "none" }),
26
+ Component: (props) => (0, jsx_runtime_1.jsx)(exports.TrackWithoutSchema, { ...props, layout: "none" }),
27
27
  componentName: '<Track>',
28
28
  componentIdentity: 'dev.remotion.remotion.Track',
29
29
  schema: trackSchema,