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
@@ -3,15 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Folder = exports.FolderContext = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const CompositionManagerContext_js_1 = require("./CompositionManagerContext.js");
7
- const sequence_order_marker_js_1 = require("./sequence-order-marker.js");
6
+ const committed_metadata_js_1 = require("./committed-metadata.js");
7
+ const composition_registry_fallback_js_1 = require("./composition-registry-fallback.js");
8
8
  const truthy_js_1 = require("./truthy.js");
9
- const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
10
9
  const validate_folder_name_js_1 = require("./validation/validate-folder-name.js");
11
10
  exports.FolderContext = (0, react_1.createContext)({
12
11
  folderName: null,
13
12
  parentName: null,
14
13
  });
14
+ const FolderContextProvider = (0, committed_metadata_js_1.withCommittedMetadata)(exports.FolderContext.Provider);
15
15
  /*
16
16
  * @description By wrapping a <Composition /> inside a <Folder />, you can visually categorize it in your sidebar, should you have many compositions.
17
17
  * @see [Documentation](https://remotion.dev/docs/folder)
@@ -20,8 +20,6 @@ const Folder = (props) => {
20
20
  var _a;
21
21
  const { name, children } = props;
22
22
  const parent = (0, react_1.useContext)(exports.FolderContext);
23
- const { registerFolder, unregisterFolder } = (0, react_1.useContext)(CompositionManagerContext_js_1.CompositionSetters);
24
- const environment = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
25
23
  const stack = (_a = props
26
24
  ._remotionInternalStack) !== null && _a !== void 0 ? _a : null;
27
25
  (0, validate_folder_name_js_1.validateFolderName)(name);
@@ -33,20 +31,13 @@ const Folder = (props) => {
33
31
  parentName,
34
32
  };
35
33
  }, [name, parentName]);
36
- (0, react_1.useEffect)(() => {
37
- registerFolder(name, parentName, stack);
38
- return () => {
39
- unregisterFolder(name, parentName);
40
- };
41
- }, [
42
- name,
43
- parent.folderName,
44
- parentName,
45
- registerFolder,
46
- unregisterFolder,
47
- stack,
48
- ]);
49
- const folder = (jsx_runtime_1.jsx(exports.FolderContext.Provider, { value: value, children: children }));
50
- return environment.isStudio ? (jsx_runtime_1.jsx(sequence_order_marker_js_1.FolderOrderMarker, { folderId: (0, sequence_order_marker_js_1.getFolderOrderId)({ name, parent: parentName }), children: folder })) : (folder);
34
+ const registration = (0, react_1.useMemo)(() => ({ name, parent: parentName, order: null, stack }), [name, parentName, stack]);
35
+ const metadata = (0, react_1.useMemo)(() => ({
36
+ type: 'folder',
37
+ id: (0, committed_metadata_js_1.getFolderOrderId)({ name, parent: parentName }),
38
+ value: registration,
39
+ }), [name, parentName, registration]);
40
+ (0, composition_registry_fallback_js_1.useCommittedCompositionEntry)(metadata);
41
+ return (jsx_runtime_1.jsx(FolderContextProvider, { value: value, _remotionCommitMetadata: metadata, children: children }));
51
42
  };
52
43
  exports.Folder = Folder;
@@ -63,8 +63,8 @@ declare global {
63
63
  }
64
64
  export type HtmlInCanvasOnPaintParams = {
65
65
  /**
66
- * The `OffscreenCanvas` from {@link HTMLCanvasElement.transferControlToOffscreen}
67
- * on the layout `<canvas>` (same logical canvas as the forwarded ref).
66
+ * The paint target. During rendering, its pixels are copied to the layout
67
+ * `<canvas>` after painting; during preview, it controls that canvas directly.
68
68
  */
69
69
  readonly canvas: OffscreenCanvas;
70
70
  readonly element: HTMLDivElement;
@@ -12,6 +12,7 @@ const interactivity_schema_js_1 = require("./interactivity-schema.js");
12
12
  const resolve_sequence_duration_js_1 = require("./resolve-sequence-duration.js");
13
13
  const Sequence_js_1 = require("./Sequence.js");
14
14
  const use_crop_style_js_1 = require("./use-crop-style.js");
15
+ const use_current_frame_js_1 = require("./use-current-frame.js");
15
16
  const use_delay_render_js_1 = require("./use-delay-render.js");
16
17
  const use_premounting_js_1 = require("./use-premounting.js");
17
18
  const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
@@ -144,13 +145,12 @@ const defaultOnPaint = ({ canvas, elementImage, }) => {
144
145
  ctx.reset();
145
146
  ctx.drawElementImage(elementImage, 0, 0);
146
147
  };
147
- /* eslint-enable react/require-default-props */
148
- const HtmlInCanvasAncestorContext = (0, react_1.createContext)(false);
149
- const HtmlInCanvasContent = (0, react_1.forwardRef)(({ width, height, effects, children, canvasSiblings, onPaint, onInit, pixelDensity, controls, style, }, ref) => {
148
+ const HtmlInCanvasAncestorContext = (0, react_1.createContext)(null);
149
+ const HtmlInCanvasContent = (0, react_1.forwardRef)(({ width, height, effects, children, canvasSiblings, onPaint, onInit, pixelDensity, controls, style, renderFrame, }, ref) => {
150
150
  var _a, _b;
151
- const isInsideAncestorHtmlInCanvas = (0, react_1.useContext)(HtmlInCanvasAncestorContext);
151
+ const ancestorPaintState = (0, react_1.useContext)(HtmlInCanvasAncestorContext);
152
152
  assertHtmlInCanvasDimensions(width, height);
153
- if (isInsideAncestorHtmlInCanvas && !(0, exports.isHtmlInCanvasNestingSupported)()) {
153
+ if (ancestorPaintState && !(0, exports.isHtmlInCanvasNestingSupported)()) {
154
154
  throw new Error(`Nested <HtmlInCanvas> components require Chrome ${MINIMUM_CHROME_VERSION_FOR_NESTED_HTML_IN_CANVAS} or newer with HTML-in-canvas enabled.`);
155
155
  }
156
156
  const resolvedPixelDensity = resolveHtmlInCanvasPixelDensity(pixelDensity);
@@ -160,22 +160,67 @@ const HtmlInCanvasContent = (0, react_1.forwardRef)(({ width, height, effects, c
160
160
  const { isClientSideRendering, isRendering } = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
161
161
  const canRetryMissingPaintRecord = !isRendering || isClientSideRendering;
162
162
  const usesDirectLayoutCanvas = onPaint === undefined && onInit === undefined;
163
+ const paintTargetMode = usesDirectLayoutCanvas
164
+ ? 'direct'
165
+ : isRendering
166
+ ? 'copied'
167
+ : 'transferred';
163
168
  if (!(0, exports.isHtmlInCanvasSupported)()) {
164
169
  cancelRender(new Error((0, exports.getHtmlInCanvasUnsupportedMessage)()));
165
170
  }
166
171
  const canvas2dRef = (0, react_1.useRef)(null);
172
+ const outputCanvasRef = (0, react_1.useRef)(null);
167
173
  const paintTargetRef = (0, react_1.useRef)(null);
168
174
  const divRef = (0, react_1.useRef)(null);
169
- const canvasSizeKey = `${width}x${height}@${resolvedPixelDensity}-${usesDirectLayoutCanvas ? 'direct' : 'offscreen'}`;
170
- const setLayoutCanvasRef = (0, react_1.useCallback)((node) => {
171
- canvas2dRef.current = node;
175
+ const canvasSizeKey = `${width}x${height}@${resolvedPixelDensity}-${paintTargetMode}`;
176
+ const paintState = (0, react_1.useMemo)(() => {
177
+ const state = {
178
+ pendingChildren: 0,
179
+ generation: 0,
180
+ release: null,
181
+ blockPaint: () => {
182
+ state.pendingChildren++;
183
+ state.generation++;
184
+ if (state.release === null) {
185
+ const handle = delayRender('waiting for nested HtmlInCanvas paint');
186
+ const releaseAncestor = ancestorPaintState === null || ancestorPaintState === void 0 ? void 0 : ancestorPaintState.blockPaint();
187
+ state.release = () => {
188
+ continueRender(handle);
189
+ releaseAncestor === null || releaseAncestor === void 0 ? void 0 : releaseAncestor();
190
+ };
191
+ }
192
+ let released = false;
193
+ return () => {
194
+ var _a, _b;
195
+ if (released) {
196
+ return;
197
+ }
198
+ released = true;
199
+ state.pendingChildren--;
200
+ if (state.pendingChildren === 0) {
201
+ // A child can finish asynchronously after our paint record was
202
+ // taken. Keep capture blocked until we paint its finished pixels.
203
+ (_b = (_a = canvas2dRef.current) === null || _a === void 0 ? void 0 : _a.requestPaint) === null || _b === void 0 ? void 0 : _b.call(_a);
204
+ }
205
+ };
206
+ },
207
+ };
208
+ return state;
209
+ }, [continueRender, delayRender, ancestorPaintState]);
210
+ const setVisibleCanvasRef = (0, react_1.useCallback)((node) => {
211
+ if (paintTargetMode === 'copied') {
212
+ outputCanvasRef.current = node;
213
+ }
214
+ else {
215
+ canvas2dRef.current = node;
216
+ }
172
217
  if (typeof ref === 'function') {
173
218
  ref(node);
174
219
  }
175
220
  else if (ref) {
176
221
  ref.current = node;
177
222
  }
178
- }, [ref]);
223
+ }, [ref, paintTargetMode]);
179
224
  const chainState = (0, use_effect_chain_state_js_1.useEffectChainState)();
180
225
  const memoizedEffects = (0, use_memoized_effects_js_1.useMemoizedEffects)({
181
226
  effects,
@@ -192,7 +237,13 @@ const HtmlInCanvasContent = (0, react_1.forwardRef)(({ width, height, effects, c
192
237
  const initializedRef = (0, react_1.useRef)(false);
193
238
  const onInitCleanupRef = (0, react_1.useRef)(null);
194
239
  const unmountedRef = (0, react_1.useRef)(false);
240
+ const paintingTargets = (0, react_1.useRef)(new WeakMap());
195
241
  const onPaintCb = (0, react_1.useCallback)(async () => {
242
+ var _a, _b;
243
+ if (isRendering && paintState.pendingChildren > 0) {
244
+ return;
245
+ }
246
+ const childrenGeneration = paintState.generation;
196
247
  const element = divRef.current;
197
248
  if (!element) {
198
249
  throw new Error('Canvas or scene element not found');
@@ -201,16 +252,32 @@ const HtmlInCanvasContent = (0, react_1.forwardRef)(({ width, height, effects, c
201
252
  if (!paintTarget) {
202
253
  throw new Error('HtmlInCanvas: paint target is not ready because the canvas is remounting');
203
254
  }
255
+ const inProgress = paintingTargets.current.get(paintTarget);
256
+ if (isRendering && inProgress) {
257
+ // In particular, do not run onPaint while an earlier event is still
258
+ // awaiting onInit (e.g. a WebGPU device).
259
+ inProgress.repaint = true;
260
+ return;
261
+ }
262
+ const painting = { repaint: false };
263
+ if (isRendering) {
264
+ paintingTargets.current.set(paintTarget, painting);
265
+ }
204
266
  resizePaintTarget({
205
267
  target: paintTarget,
206
268
  width: canvasWidth,
207
269
  height: canvasHeight,
208
270
  });
271
+ const releaseAncestor = isRendering
272
+ ? ancestorPaintState === null || ancestorPaintState === void 0 ? void 0 : ancestorPaintState.blockPaint()
273
+ : null;
274
+ let canReleasePaint = false;
209
275
  try {
210
276
  const placeholderCanvas = canvas2dRef.current;
211
277
  if (!placeholderCanvas) {
212
278
  throw new Error('Canvas not found');
213
279
  }
280
+ const outputCanvas = outputCanvasRef.current;
214
281
  const handle = delayRender('onPaint');
215
282
  if (!initializedRef.current) {
216
283
  const currentOnInit = onInitRef.current;
@@ -230,6 +297,7 @@ const HtmlInCanvasContent = (0, react_1.forwardRef)(({ width, height, effects, c
230
297
  canRetryMissingPaintRecord) {
231
298
  // The web renderer explicitly drives additional paint cycles, so a
232
299
  // transient missing record can be retried without failing the render.
300
+ canReleasePaint = true;
233
301
  continueRender(handle);
234
302
  return;
235
303
  }
@@ -252,12 +320,13 @@ const HtmlInCanvasContent = (0, react_1.forwardRef)(({ width, height, effects, c
252
320
  if (typeof cleanup !== 'function') {
253
321
  throw new Error('HtmlInCanvas: when `onInit` is provided, it must return a cleanup function, or a Promise that resolves to one.');
254
322
  }
255
- if (unmountedRef.current) {
323
+ if (unmountedRef.current ||
324
+ paintTargetRef.current !== paintTarget) {
256
325
  cleanup();
326
+ continueRender(handle);
327
+ return;
257
328
  }
258
- else {
259
- onInitCleanupRef.current = cleanup;
260
- }
329
+ onInitCleanupRef.current = cleanup;
261
330
  }
262
331
  finally {
263
332
  initImage.close();
@@ -273,6 +342,7 @@ const HtmlInCanvasContent = (0, react_1.forwardRef)(({ width, height, effects, c
273
342
  // element is outside the viewport (no cached paint record).
274
343
  // Skip this paint cycle — the canvas retains its last state.
275
344
  if (isMissingPaintRecordError(error) && canRetryMissingPaintRecord) {
345
+ canReleasePaint = true;
276
346
  continueRender(handle);
277
347
  return;
278
348
  }
@@ -321,11 +391,39 @@ const HtmlInCanvasContent = (0, react_1.forwardRef)(({ width, height, effects, c
321
391
  finally {
322
392
  elImage.close();
323
393
  }
394
+ if (paintTargetMode === 'copied' &&
395
+ paintTargetRef.current === paintTarget &&
396
+ outputCanvas) {
397
+ const ctx = outputCanvas.getContext('2d');
398
+ if (!ctx) {
399
+ throw new Error('HtmlInCanvas: could not get layout canvas context');
400
+ }
401
+ // A transferred OffscreenCanvas submits its pixels asynchronously.
402
+ // Copy before releasing the render handle so capture sees this paint.
403
+ // drawImage preserves the source for handlers that paint incrementally.
404
+ ctx.reset();
405
+ ctx.drawImage(paintTarget, 0, 0);
406
+ }
407
+ canReleasePaint = true;
324
408
  continueRender(handle);
325
409
  }
326
410
  catch (error) {
327
411
  cancelRender(error);
328
412
  }
413
+ finally {
414
+ if (canReleasePaint &&
415
+ paintState.pendingChildren === 0 &&
416
+ paintState.generation === childrenGeneration) {
417
+ const { release } = paintState;
418
+ paintState.release = null;
419
+ release === null || release === void 0 ? void 0 : release();
420
+ }
421
+ releaseAncestor === null || releaseAncestor === void 0 ? void 0 : releaseAncestor();
422
+ paintingTargets.current.delete(paintTarget);
423
+ if (painting.repaint && paintTargetRef.current === paintTarget) {
424
+ (_b = (_a = canvas2dRef.current) === null || _a === void 0 ? void 0 : _a.requestPaint) === null || _b === void 0 ? void 0 : _b.call(_a);
425
+ }
426
+ }
329
427
  }, [
330
428
  canvasHeight,
331
429
  canvasWidth,
@@ -335,9 +433,22 @@ const HtmlInCanvasContent = (0, react_1.forwardRef)(({ width, height, effects, c
335
433
  delayRender,
336
434
  resolvedPixelDensity,
337
435
  canRetryMissingPaintRecord,
436
+ paintTargetMode,
437
+ isRendering,
438
+ paintState,
439
+ ancestorPaintState,
338
440
  ]);
441
+ (0, react_1.useLayoutEffect)(() => {
442
+ return () => {
443
+ var _a;
444
+ (_a = paintState.release) === null || _a === void 0 ? void 0 : _a.call(paintState);
445
+ paintState.release = null;
446
+ };
447
+ }, [paintState]);
339
448
  // Default paint handlers draw synchronously on the layout canvas itself.
340
- // Custom handlers retain the transferred OffscreenCanvas API.
449
+ // ElementImage can only be drawn into its associated canvas, so custom
450
+ // handlers retain a transferred target. Rendering copies it to a separate
451
+ // visible canvas without waiting for the transferred canvas to present.
341
452
  (0, react_1.useLayoutEffect)(() => {
342
453
  var _a;
343
454
  const placeholder = canvas2dRef.current;
@@ -347,7 +458,7 @@ const HtmlInCanvasContent = (0, react_1.forwardRef)(({ width, height, effects, c
347
458
  placeholder.setAttribute('content', 'drawable');
348
459
  placeholder.layoutSubtree = true;
349
460
  (_a = divRef.current) === null || _a === void 0 ? void 0 : _a.setAttribute('drawable', '');
350
- const paintTarget = usesDirectLayoutCanvas
461
+ const paintTarget = paintTargetMode === 'direct'
351
462
  ? placeholder
352
463
  : getTransferredOffscreenCanvas(placeholder);
353
464
  paintTargetRef.current = paintTarget;
@@ -368,13 +479,7 @@ const HtmlInCanvasContent = (0, react_1.forwardRef)(({ width, height, effects, c
368
479
  (_a = onInitCleanupRef.current) === null || _a === void 0 ? void 0 : _a.call(onInitCleanupRef);
369
480
  onInitCleanupRef.current = null;
370
481
  };
371
- }, [
372
- onPaintCb,
373
- cancelRender,
374
- canvasWidth,
375
- canvasHeight,
376
- usesDirectLayoutCanvas,
377
- ]);
482
+ }, [onPaintCb, cancelRender, canvasWidth, canvasHeight, paintTargetMode]);
378
483
  const onPaintChangedRef = (0, react_1.useRef)(false);
379
484
  (0, react_1.useLayoutEffect)(() => {
380
485
  var _a;
@@ -389,18 +494,37 @@ const HtmlInCanvasContent = (0, react_1.forwardRef)(({ width, height, effects, c
389
494
  (_a = canvas.requestPaint) === null || _a === void 0 ? void 0 : _a.call(canvas);
390
495
  }, [onPaint, memoizedEffects]);
391
496
  (0, react_1.useLayoutEffect)(() => {
497
+ var _a;
392
498
  const canvas = canvas2dRef.current;
393
499
  if (!canvas) {
394
500
  return;
395
501
  }
396
- const handle = delayRender('waiting for first paint after canvas resize');
397
- canvas.addEventListener('paint', () => {
502
+ // Block capture before the paint event begins, including updates that
503
+ // keep the same canvas. onPaintCb holds its own handle through async work.
504
+ const handle = delayRender('waiting for HtmlInCanvas paint');
505
+ const releaseAncestor = isRendering
506
+ ? ancestorPaintState === null || ancestorPaintState === void 0 ? void 0 : ancestorPaintState.blockPaint()
507
+ : null;
508
+ const onPainted = () => {
398
509
  continueRender(handle);
399
- }, { once: true });
510
+ releaseAncestor === null || releaseAncestor === void 0 ? void 0 : releaseAncestor();
511
+ };
512
+ canvas.addEventListener('paint', onPainted, { once: true });
513
+ (_a = canvas.requestPaint) === null || _a === void 0 ? void 0 : _a.call(canvas);
400
514
  return () => {
401
- continueRender(handle);
515
+ canvas.removeEventListener('paint', onPainted);
516
+ onPainted();
402
517
  };
403
- }, [width, height, continueRender, delayRender, canvasSizeKey]);
518
+ }, [
519
+ width,
520
+ height,
521
+ continueRender,
522
+ delayRender,
523
+ canvasSizeKey,
524
+ renderFrame,
525
+ isRendering,
526
+ ancestorPaintState,
527
+ ]);
404
528
  const innerStyle = (0, react_1.useMemo)(() => {
405
529
  return {
406
530
  width,
@@ -414,12 +538,35 @@ const HtmlInCanvasContent = (0, react_1.forwardRef)(({ width, height, effects, c
414
538
  ...(style !== null && style !== void 0 ? style : {}),
415
539
  };
416
540
  }, [height, style, width]);
417
- return (jsx_runtime_1.jsx(HtmlInCanvasAncestorContext.Provider, { value: true, children: jsx_runtime_1.jsxs("canvas", { ref: setLayoutCanvasRef, width: canvasWidth, height: canvasHeight, style: canvasStyle, children: [
418
- jsx_runtime_1.jsx("div", { ref: divRef, style: innerStyle, children: children }), canvasSiblings] }, canvasSizeKey) }));
541
+ return (jsx_runtime_1.jsxs(HtmlInCanvasAncestorContext.Provider, { value: paintState, children: [
542
+ jsx_runtime_1.jsxs("canvas", { ref: paintTargetMode === 'copied' ? canvas2dRef : setVisibleCanvasRef, width: canvasWidth, height: canvasHeight, style: paintTargetMode === 'copied'
543
+ ? {
544
+ ...canvasStyle,
545
+ position: 'absolute',
546
+ // Hide the source canvas while keeping its drawable children
547
+ // visible to captureElementImage. opacity: 0 drops paint records.
548
+ visibility: 'hidden',
549
+ pointerEvents: 'none',
550
+ }
551
+ : canvasStyle, children: [
552
+ jsx_runtime_1.jsx("div", { ref: divRef, style: paintTargetMode === 'copied'
553
+ ? { ...innerStyle, visibility: 'visible' }
554
+ : innerStyle, children: children }), canvasSiblings] }, canvasSizeKey), paintTargetMode === 'copied' ? (jsx_runtime_1.jsx("canvas", { ref: setVisibleCanvasRef, width: canvasWidth, height: canvasHeight, style: canvasStyle }, `output-${canvasSizeKey}`)) : null] }));
419
555
  });
420
556
  HtmlInCanvasContent.displayName = 'HtmlInCanvasContent';
557
+ // Subscribe to frame changes only while rendering. Preview keeps relying on
558
+ // the browser's paints and does not need a capture barrier on every frame.
559
+ const HtmlInCanvasContentForRendering = (0, react_1.forwardRef)((props, ref) => {
560
+ const frame = (0, use_current_frame_js_1.useCurrentFrame)();
561
+ return jsx_runtime_1.jsx(HtmlInCanvasContent, { ...props, ref: ref, renderFrame: frame });
562
+ });
563
+ HtmlInCanvasContentForRendering.displayName = 'HtmlInCanvasContentForRendering';
421
564
  const HtmlInCanvasInner = (0, react_1.forwardRef)(({ width, height, effects = [], children, onPaint, onInit, pixelDensity, _remotionInternalCanvasSiblings, controls, style, cropLeft, cropRight, cropTop, cropBottom, durationInFrames, premountFor, postmountFor, styleWhilePremounted, styleWhilePostmounted, name, ...sequenceProps }, ref) => {
422
565
  var _a;
566
+ const { isRendering } = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
567
+ const Content = isRendering
568
+ ? HtmlInCanvasContentForRendering
569
+ : HtmlInCanvasContent;
423
570
  const memoizedEffectDefinitions = (0, use_memoized_effects_js_1.useMemoizedEffectDefinitions)(effects);
424
571
  const actualRef = (0, react_1.useRef)(null);
425
572
  const setCanvasRef = (0, react_1.useCallback)((node) => {
@@ -453,7 +600,7 @@ const HtmlInCanvasInner = (0, react_1.forwardRef)(({ width, height, effects = []
453
600
  style: premountingStyle,
454
601
  componentName: '<HtmlInCanvas />',
455
602
  });
456
- 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", durationInFrames: durationInFrames, name: name !== null && name !== void 0 ? name : '<HtmlInCanvas>', _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/remotion/html-in-canvas", controls: controls, _remotionInternalEffects: memoizedEffectDefinitions, ...sequenceProps, _remotionInternalPremountDisplay: effectivePremountFor || null, _remotionInternalPostmountDisplay: effectivePostmountFor || null, _remotionInternalIsPremounting: premountingActive, _remotionInternalIsPostmounting: postmountingActive, children: jsx_runtime_1.jsx(HtmlInCanvasContent, { ref: setCanvasRef, width: width, height: height, effects: effects, onPaint: onPaint, onInit: onInit, pixelDensity: pixelDensity, canvasSiblings: _remotionInternalCanvasSiblings !== null && _remotionInternalCanvasSiblings !== void 0 ? _remotionInternalCanvasSiblings : null, controls: controls, style: croppedStyle !== null && croppedStyle !== void 0 ? croppedStyle : undefined, children: children }) }) }));
603
+ 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", durationInFrames: durationInFrames, name: name !== null && name !== void 0 ? name : '<HtmlInCanvas>', _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/remotion/html-in-canvas", controls: controls, _remotionInternalEffects: memoizedEffectDefinitions, ...sequenceProps, _remotionInternalPremountDisplay: effectivePremountFor || null, _remotionInternalPostmountDisplay: effectivePostmountFor || null, _remotionInternalIsPremounting: premountingActive, _remotionInternalIsPostmounting: postmountingActive, children: jsx_runtime_1.jsx(Content, { ref: setCanvasRef, renderFrame: null, width: width, height: height, effects: effects, onPaint: onPaint, onInit: onInit, pixelDensity: pixelDensity, canvasSiblings: _remotionInternalCanvasSiblings !== null && _remotionInternalCanvasSiblings !== void 0 ? _remotionInternalCanvasSiblings : null, controls: controls, style: croppedStyle !== null && croppedStyle !== void 0 ? croppedStyle : undefined, children: children }) }) }));
457
604
  });
458
605
  HtmlInCanvasInner.displayName = 'HtmlInCanvas';
459
606
  exports.htmlInCanvasSchema = {
@@ -6,16 +6,48 @@ const react_1 = require("react");
6
6
  const use_delay_render_js_1 = require("./use-delay-render.js");
7
7
  const IFrameRefForwarding = ({ onLoad, onError, delayRenderRetries, delayRenderTimeoutInMilliseconds, ...props }, ref) => {
8
8
  const { delayRender, continueRender } = (0, use_delay_render_js_1.useDelayRender)();
9
- const [handle] = (0, react_1.useState)(() => delayRender(`Loading <IFrame> with source ${props.src}`, {
10
- retries: delayRenderRetries !== null && delayRenderRetries !== void 0 ? delayRenderRetries : undefined,
11
- timeoutInMilliseconds: delayRenderTimeoutInMilliseconds !== null && delayRenderTimeoutInMilliseconds !== void 0 ? delayRenderTimeoutInMilliseconds : undefined,
12
- }));
9
+ const handle = (0, react_1.useRef)(null);
10
+ const loadedSource = (0, react_1.useRef)(null);
11
+ const { src, srcDoc } = props;
12
+ (0, react_1.useLayoutEffect)(() => {
13
+ var _a, _b;
14
+ if (((_a = loadedSource.current) === null || _a === void 0 ? void 0 : _a.src) === src &&
15
+ ((_b = loadedSource.current) === null || _b === void 0 ? void 0 : _b.srcDoc) === srcDoc &&
16
+ loadedSource.current !== null) {
17
+ return;
18
+ }
19
+ const newHandle = delayRender(`Loading <IFrame> with source ${src}`, {
20
+ retries: delayRenderRetries !== null && delayRenderRetries !== void 0 ? delayRenderRetries : undefined,
21
+ timeoutInMilliseconds: delayRenderTimeoutInMilliseconds !== null && delayRenderTimeoutInMilliseconds !== void 0 ? delayRenderTimeoutInMilliseconds : undefined,
22
+ });
23
+ loadedSource.current = null;
24
+ handle.current = newHandle;
25
+ return () => {
26
+ continueRender(newHandle);
27
+ handle.current = null;
28
+ };
29
+ }, [
30
+ continueRender,
31
+ delayRender,
32
+ delayRenderRetries,
33
+ delayRenderTimeoutInMilliseconds,
34
+ src,
35
+ srcDoc,
36
+ ]);
13
37
  const didLoad = (0, react_1.useCallback)((e) => {
14
- continueRender(handle);
38
+ loadedSource.current = { src, srcDoc };
39
+ if (handle.current !== null) {
40
+ continueRender(handle.current);
41
+ handle.current = null;
42
+ }
15
43
  onLoad === null || onLoad === void 0 ? void 0 : onLoad(e);
16
- }, [handle, onLoad, continueRender]);
44
+ }, [onLoad, continueRender, src, srcDoc]);
17
45
  const didGetError = (0, react_1.useCallback)((e) => {
18
- continueRender(handle);
46
+ loadedSource.current = { src, srcDoc };
47
+ if (handle.current !== null) {
48
+ continueRender(handle.current);
49
+ handle.current = null;
50
+ }
19
51
  if (onError) {
20
52
  onError(e);
21
53
  }
@@ -23,7 +55,7 @@ const IFrameRefForwarding = ({ onLoad, onError, delayRenderRetries, delayRenderT
23
55
  // eslint-disable-next-line no-console
24
56
  console.error('Error loading iframe:', e, 'Handle the event using the onError() prop to make this message disappear.');
25
57
  }
26
- }, [handle, onError, continueRender]);
58
+ }, [onError, continueRender, src, srcDoc]);
27
59
  return (jsx_runtime_1.jsx("iframe", { referrerPolicy: "strict-origin-when-cross-origin", ...props, ref: ref, onError: didGetError, onLoad: didLoad }));
28
60
  };
29
61
  /*
package/dist/cjs/Img.js CHANGED
@@ -10,6 +10,7 @@ const get_cross_origin_value_js_1 = require("./get-cross-origin-value.js");
10
10
  const interactivity_schema_js_1 = require("./interactivity-schema.js");
11
11
  const prefetch_js_1 = require("./prefetch.js");
12
12
  const resolve_sequence_duration_js_1 = require("./resolve-sequence-duration.js");
13
+ const sequence_activity_context_js_1 = require("./sequence-activity-context.js");
13
14
  const Sequence_js_1 = require("./Sequence.js");
14
15
  const SequenceContext_js_1 = require("./SequenceContext.js");
15
16
  const truncate_src_for_label_js_1 = require("./truncate-src-for-label.js");
@@ -228,7 +229,7 @@ const NativeImgInner = ({ hidden, name, showInTimeline, src, from, trimBefore, l
228
229
  style: premountingStyle,
229
230
  componentName: '<Img />',
230
231
  });
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, loop: loop, durationInFrames: durationInFrames, freeze: freeze, _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/img", _remotionInternalIsMedia: isMedia, _remotionInternalPremountDisplay: effectivePremountFor || null, _remotionInternalPostmountDisplay: effectivePostmountFor || null, _remotionInternalIsPremounting: premountingActive, _remotionInternalIsPostmounting: postmountingActive, name: name !== null && name !== void 0 ? name : '<Img>', controls: controls, showInTimeline: showInTimeline !== null && showInTimeline !== void 0 ? showInTimeline : true, hidden: hidden, children: jsx_runtime_1.jsx(ImgContent, { src: src, style: croppedStyle !== null && croppedStyle !== void 0 ? croppedStyle : undefined, ...props }) }) }));
232
+ 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, loop: loop, durationInFrames: durationInFrames, freeze: freeze, _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/img", _remotionInternalIsMedia: isMedia, _remotionInternalPremountDisplay: effectivePremountFor || null, _remotionInternalPostmountDisplay: effectivePostmountFor || null, _remotionInternalIsPremounting: premountingActive, _remotionInternalIsPostmounting: postmountingActive, name: name !== null && name !== void 0 ? name : '<Img>', controls: controls, showInTimeline: showInTimeline !== null && showInTimeline !== void 0 ? showInTimeline : true, hidden: hidden, children: jsx_runtime_1.jsx(sequence_activity_context_js_1.SequenceContent, { children: jsx_runtime_1.jsx(ImgContent, { src: src, style: croppedStyle !== null && croppedStyle !== void 0 ? croppedStyle : undefined, ...props }) }) }) }));
232
233
  };
233
234
  const CanvasImageWithPrivateProps = index_js_1.CanvasImage;
234
235
  exports.imgSchema = {
@@ -25,12 +25,21 @@ type PropsBranchAcceptsStyle<Props> = Props extends unknown ? 'style' extends ke
25
25
  type EveryPropsBranchAcceptsStyle<Props> = [Props] extends [never] ? false : false extends PropsBranchAcceptsStyle<Props> ? false : true;
26
26
  type ComponentAcceptingStyle<Component extends React.ElementType, ReservedKey extends PropertyKey> = ComponentWithoutReservedProps<Component, ReservedKey> & (EveryPropsBranchAcceptsStyle<React.ComponentPropsWithoutRef<Component>> extends true ? unknown : never);
27
27
  type WithSchema = {
28
+ <S extends InteractivitySchema, Component extends React.ElementType>(options: Omit<WithInteractivitySchemaOptions<S, React.ComponentPropsWithoutRef<Component>>, 'Component' | 'supportsEffects'> & {
29
+ readonly Component: ComponentWithoutReservedProps<Component, WithSchemaReservedKey | 'style' | 'width' | 'height'>;
30
+ readonly wrapInSequence: true;
31
+ readonly layout: 'absolute-fill';
32
+ }): React.FC<React.ComponentPropsWithoutRef<Component> & InteractiveBaseProps & InteractivePremountProps & InteractiveCropProps & InteractiveTransformProps & Pick<SequenceProps, 'width' | 'height'> & {
33
+ readonly ref?: React.Ref<HTMLDivElement>;
34
+ }>;
28
35
  <S extends InteractivitySchema, Component extends React.ElementType>(options: Omit<WithInteractivitySchemaOptions<S, React.ComponentPropsWithoutRef<Component>>, 'Component' | 'supportsEffects'> & {
29
36
  readonly Component: ComponentAcceptingStyle<Component, WithSchemaReservedKey>;
30
37
  readonly wrapInSequence: true;
38
+ readonly layout?: 'none';
31
39
  }): React.FC<React.ComponentPropsWithRef<Component> & InteractiveBaseProps & InteractivePremountProps & InteractiveCropProps>;
32
40
  <S extends InteractivitySchema, Props extends object>(options: WithInteractivitySchemaOptions<S, Props> & {
33
41
  readonly wrapInSequence?: false;
42
+ readonly layout?: never;
34
43
  }): React.ComponentType<Props>;
35
44
  };
36
45
  /**
@@ -85,6 +94,9 @@ export declare const Interactive: {
85
94
  readonly keyframable: false;
86
95
  };
87
96
  };
97
+ childrenSchema: {
98
+ children: import("./interactivity-schema.js").InteractivitySchemaField;
99
+ };
88
100
  transformSchema: {
89
101
  readonly 'style.transformOrigin': {
90
102
  readonly type: "transform-origin";
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.Interactive = void 0;
37
37
  const jsx_runtime_1 = require("react/jsx-runtime");
38
38
  const react_1 = __importStar(require("react"));
39
+ const component_identity_js_1 = require("./component-identity.js");
39
40
  const CompositionManagerContext_js_1 = require("./CompositionManagerContext.js");
40
41
  const enable_sequence_stack_traces_js_1 = require("./enable-sequence-stack-traces.js");
41
42
  const freeze_js_1 = require("./freeze.js");
@@ -78,13 +79,13 @@ const interactiveBorderElementSchema = {
78
79
  const interactiveTextElementSchema = {
79
80
  ...interactiveBorderElementSchema,
80
81
  ...interactivity_schema_js_1.textSchema,
81
- ...interactivity_schema_js_1.textContentSchema,
82
+ ...interactivity_schema_js_1.childrenSchema,
82
83
  };
83
84
  const interactiveSvgTextElementSchema = {
84
85
  ...interactiveElementSchema,
85
86
  ...interactivity_schema_js_1.svgPaintSchema,
86
87
  ...interactivity_schema_js_1.textSchema,
87
- ...interactivity_schema_js_1.textContentSchema,
88
+ ...interactivity_schema_js_1.childrenSchema,
88
89
  };
89
90
  const interactiveSvgElementSchema = {
90
91
  ...interactiveElementSchema,
@@ -122,16 +123,17 @@ const withSchema = (untypedOptions) => {
122
123
  (0, enable_sequence_stack_traces_js_1.addSequenceStackTraces)(LegacyWrapped);
123
124
  return LegacyWrapped;
124
125
  }
125
- const { Component, componentName, schema, wrapInSequence: _, ...rest } = options;
126
+ const { Component, componentName, schema, wrapInSequence: _, layout = 'none', ...rest } = options;
126
127
  const ComponentWrappedInSequence = (0, react_1.forwardRef)((props, ref) => {
127
128
  const { canvasContent, compositions } = (0, react_1.useContext)(CompositionManagerContext_js_1.CompositionManager);
128
129
  // The render callback runs after the exported wrapper has been initialized.
129
130
  // eslint-disable-next-line @typescript-eslint/no-use-before-define
130
- const componentIdentity = (0, enable_sequence_stack_traces_js_1.resolveComponentIdentity)(Wrapped);
131
+ const componentIdentity = (0, component_identity_js_1.resolveComponentIdentity)(Wrapped);
131
132
  const isCurrentComposition = compositions.some((composition) => (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition' &&
132
133
  composition.id === canvasContent.compositionId &&
133
134
  composition.componentFromProps === componentIdentity);
134
- const { durationInFrames, from, trimBefore, playbackRate, loop, freeze, hidden, name, showInTimeline, controls, premountFor, postmountFor, styleWhilePremounted, styleWhilePostmounted, ...componentProps } = props;
135
+ const { width, height, ...propsWithoutDimensions } = props;
136
+ const { durationInFrames, from, trimBefore, playbackRate, loop, freeze, hidden, name, showInTimeline, controls, premountFor, postmountFor, styleWhilePremounted, styleWhilePostmounted, ...componentProps } = layout === 'absolute-fill' ? propsWithoutDimensions : props;
135
137
  const { cropLeft, cropRight, cropTop, cropBottom, style, ...componentPropsWithoutCropping } = componentProps;
136
138
  const { effectivePremountFor, effectivePostmountFor, freezeFrame, isPremountingOrPostmounting, premountingActive, postmountingActive, premountingStyle, } = (0, use_premounting_js_1.usePremounting)({
137
139
  from: from !== null && from !== void 0 ? from : 0,
@@ -155,10 +157,18 @@ const withSchema = (untypedOptions) => {
155
157
  style: premountingStyle,
156
158
  componentName,
157
159
  });
158
- 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: "none", durationInFrames: durationInFrames, from: from, trimBefore: trimBefore, playbackRate: playbackRate, loop: loop, freeze: freeze, hidden: hidden, name: name !== null && name !== void 0 ? name : componentName, showInTimeline: isCurrentComposition ? false : showInTimeline, controls: controls, _remotionInternalPremountDisplay: effectivePremountFor || null, _remotionInternalPostmountDisplay: effectivePostmountFor || null, _remotionInternalIsPremounting: premountingActive, _remotionInternalIsPostmounting: postmountingActive, children: react_1.default.createElement(Component, {
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'
161
+ ? {
162
+ width,
163
+ height,
164
+ style: { overflow: 'hidden', ...croppedStyle },
165
+ ref: ref,
166
+ }
167
+ : {}), durationInFrames: durationInFrames, from: from, trimBefore: trimBefore, playbackRate: playbackRate, loop: loop, freeze: freeze, hidden: hidden, name: name !== null && name !== void 0 ? name : componentName, _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/interactive-with-schema", showInTimeline: isCurrentComposition ? false : showInTimeline, controls: controls, _remotionInternalPremountDisplay: effectivePremountFor || null, _remotionInternalPostmountDisplay: effectivePostmountFor || null, _remotionInternalIsPremounting: premountingActive, _remotionInternalIsPostmounting: postmountingActive, children: react_1.default.createElement(Component, {
159
168
  ...componentPropsWithoutCropping,
160
- style: croppedStyle !== null && croppedStyle !== void 0 ? croppedStyle : undefined,
161
- ref,
169
+ ...(layout === 'none'
170
+ ? { style: croppedStyle !== null && croppedStyle !== void 0 ? croppedStyle : undefined, ref }
171
+ : {}),
162
172
  }) }) }));
163
173
  });
164
174
  const Wrapped = (0, with_interactivity_schema_js_1.withInteractivitySchema)({
@@ -240,6 +250,7 @@ const makeInteractiveSvgStrokeElement = (tag, displayName) => {
240
250
  exports.Interactive = {
241
251
  baseSchema: interactivity_schema_js_1.baseSchema,
242
252
  captionsSchema: interactivity_schema_js_1.captionsSchema,
253
+ childrenSchema: interactivity_schema_js_1.childrenSchema,
243
254
  transformSchema: interactivity_schema_js_1.transformSchema,
244
255
  textSchema: interactivity_schema_js_1.textSchema,
245
256
  backgroundSchema: interactivity_schema_js_1.backgroundSchema,
@@ -11,11 +11,12 @@ const prefetch_state_js_1 = require("./prefetch-state.js");
11
11
  const SequenceManager_js_1 = require("./SequenceManager.js");
12
12
  const TimelineContext_js_1 = require("./TimelineContext.js");
13
13
  const use_media_enabled_js_1 = require("./use-media-enabled.js");
14
+ const use_video_js_1 = require("./use-video.js");
14
15
  const duration_state_js_1 = require("./video/duration-state.js");
15
16
  const RemotionRootContexts = ({ children, numberOfAudioTags, logLevel, audioLatencyHint, previewSampleRate, videoEnabled, audioEnabled, frameState, _experimentalKeepAudioContextAlive, }) => {
16
17
  const logging = (0, react_1.useMemo)(() => {
17
18
  return { logLevel, mountTime: Date.now() };
18
19
  }, [logLevel]);
19
- 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: children }) }) }) }) }) }) }) }) }) }));
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
21
  };
21
22
  exports.RemotionRootContexts = RemotionRootContexts;