remotion 4.0.478 → 4.0.481

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 (45) hide show
  1. package/dist/cjs/CompositionManager.d.ts +3 -2
  2. package/dist/cjs/HtmlInCanvas.d.ts +4 -3
  3. package/dist/cjs/HtmlInCanvas.js +8 -10
  4. package/dist/cjs/Img.d.ts +6 -4
  5. package/dist/cjs/Img.js +11 -13
  6. package/dist/cjs/Interactive.d.ts +188 -2
  7. package/dist/cjs/Interactive.js +13 -10
  8. package/dist/cjs/Sequence.d.ts +4 -3
  9. package/dist/cjs/Sequence.js +9 -7
  10. package/dist/cjs/animated-image/AnimatedImage.d.ts +2 -3
  11. package/dist/cjs/animated-image/AnimatedImage.js +8 -10
  12. package/dist/cjs/animated-image/props.d.ts +2 -3
  13. package/dist/cjs/canvas-image/CanvasImage.d.ts +5 -3
  14. package/dist/cjs/canvas-image/CanvasImage.js +87 -42
  15. package/dist/cjs/canvas-image/props.d.ts +5 -4
  16. package/dist/cjs/effects/Solid.d.ts +2 -2
  17. package/dist/cjs/effects/Solid.js +8 -10
  18. package/dist/cjs/effects/create-effect.d.ts +2 -2
  19. package/dist/cjs/effects/effect-types.d.ts +2 -2
  20. package/dist/cjs/effects/index.d.ts +2 -1
  21. package/dist/cjs/effects/index.js +3 -0
  22. package/dist/cjs/find-props-to-delete.d.ts +2 -2
  23. package/dist/cjs/flatten-schema.d.ts +3 -3
  24. package/dist/cjs/index.d.ts +4 -4
  25. package/dist/cjs/index.js +16 -14
  26. package/dist/cjs/interactivity-schema.d.ts +524 -0
  27. package/dist/cjs/interactivity-schema.js +143 -0
  28. package/dist/cjs/internals.d.ts +95 -21
  29. package/dist/cjs/internals.js +12 -11
  30. package/dist/cjs/interpolate-keyframed-status.js +14 -3
  31. package/dist/cjs/no-react.d.ts +11 -12
  32. package/dist/cjs/no-react.js +2 -2
  33. package/dist/cjs/series/index.js +5 -4
  34. package/dist/cjs/use-schema.d.ts +21 -3
  35. package/dist/cjs/use-schema.js +5 -2
  36. package/dist/cjs/version.d.ts +1 -1
  37. package/dist/cjs/version.js +1 -1
  38. package/dist/cjs/with-interactivity-schema.d.ts +21 -0
  39. package/dist/cjs/with-interactivity-schema.js +204 -0
  40. package/dist/cjs/wrap-in-schema.d.ts +3 -3
  41. package/dist/cjs/wrap-in-schema.js +2 -2
  42. package/dist/esm/index.mjs +234 -166
  43. package/dist/esm/no-react.mjs +133 -131
  44. package/dist/esm/version.mjs +1 -1
  45. package/package.json +2 -2
@@ -1291,7 +1291,7 @@ var addSequenceStackTraces = (component) => {
1291
1291
  };
1292
1292
 
1293
1293
  // src/version.ts
1294
- var VERSION = "4.0.478";
1294
+ var VERSION = "4.0.481";
1295
1295
 
1296
1296
  // src/multiple-versions-warning.ts
1297
1297
  var checkMultipleRemotionVersions = () => {
@@ -1712,14 +1712,8 @@ var Freeze = ({
1712
1712
  });
1713
1713
  };
1714
1714
 
1715
- // src/PremountContext.tsx
1716
- import { createContext as createContext14 } from "react";
1717
- var PremountContext = createContext14({
1718
- premountFramesRemaining: 0
1719
- });
1720
-
1721
- // src/sequence-field-schema.ts
1722
- var sequenceVisualStyleSchema = {
1715
+ // src/interactivity-schema.ts
1716
+ var transformSchema = {
1723
1717
  "style.transformOrigin": {
1724
1718
  type: "transform-origin",
1725
1719
  step: 1,
@@ -1755,7 +1749,8 @@ var sequenceVisualStyleSchema = {
1755
1749
  hiddenFromList: false
1756
1750
  }
1757
1751
  };
1758
- var sequencePremountSchema = {
1752
+ var sequenceVisualStyleSchema = transformSchema;
1753
+ var premountSchema = {
1759
1754
  premountFor: {
1760
1755
  type: "number",
1761
1756
  default: 0,
@@ -1778,9 +1773,10 @@ var sequencePremountSchema = {
1778
1773
  type: "hidden"
1779
1774
  }
1780
1775
  };
1776
+ var sequencePremountSchema = premountSchema;
1781
1777
  var sequenceStyleSchema = {
1782
- ...sequenceVisualStyleSchema,
1783
- ...sequencePremountSchema
1778
+ ...transformSchema,
1779
+ ...premountSchema
1784
1780
  };
1785
1781
  var hiddenField = {
1786
1782
  type: "boolean",
@@ -1818,12 +1814,16 @@ var freezeField = {
1818
1814
  step: 1,
1819
1815
  hiddenFromList: true
1820
1816
  };
1821
- var sequenceSchema = extendSchemaWithSequenceName({
1822
- hidden: hiddenField,
1823
- showInTimeline: showInTimelineField,
1817
+ var baseSchema = {
1818
+ durationInFrames: durationInFramesField,
1824
1819
  from: fromField,
1825
1820
  freeze: freezeField,
1826
- durationInFrames: durationInFramesField,
1821
+ hidden: hiddenField,
1822
+ name: sequenceNameField,
1823
+ showInTimeline: showInTimelineField
1824
+ };
1825
+ var sequenceSchema = {
1826
+ ...baseSchema,
1827
1827
  layout: {
1828
1828
  type: "enum",
1829
1829
  default: "absolute-fill",
@@ -1833,14 +1833,18 @@ var sequenceSchema = extendSchemaWithSequenceName({
1833
1833
  none: {}
1834
1834
  }
1835
1835
  }
1836
- });
1837
- var sequenceSchemaWithoutFrom = extendSchemaWithSequenceName({
1838
- hidden: hiddenField,
1839
- showInTimeline: showInTimelineField,
1840
- freeze: freezeField,
1836
+ };
1837
+ var baseSchemaWithoutFrom = {
1841
1838
  durationInFrames: durationInFramesField,
1839
+ freeze: freezeField,
1840
+ hidden: hiddenField,
1841
+ name: sequenceNameField,
1842
+ showInTimeline: showInTimelineField
1843
+ };
1844
+ var sequenceSchemaWithoutFrom = {
1845
+ ...baseSchemaWithoutFrom,
1842
1846
  layout: sequenceSchema.layout
1843
- });
1847
+ };
1844
1848
  var sequenceSchemaDefaultLayoutNone = {
1845
1849
  ...sequenceSchema,
1846
1850
  layout: {
@@ -1849,6 +1853,12 @@ var sequenceSchemaDefaultLayoutNone = {
1849
1853
  }
1850
1854
  };
1851
1855
 
1856
+ // src/PremountContext.tsx
1857
+ import { createContext as createContext14 } from "react";
1858
+ var PremountContext = createContext14({
1859
+ premountFramesRemaining: 0
1860
+ });
1861
+
1852
1862
  // src/SequenceManager.tsx
1853
1863
  import React11, { useCallback as useCallback5, useMemo as useMemo12, useRef as useRef4, useState as useState3 } from "react";
1854
1864
  import { jsx as jsx10 } from "react/jsx-runtime";
@@ -2058,7 +2068,7 @@ var useRequireToBeInsideSeries = () => {
2058
2068
  // src/v5-flag.ts
2059
2069
  var ENABLE_V5_BREAKING_CHANGES = false;
2060
2070
 
2061
- // src/wrap-in-schema.ts
2071
+ // src/with-interactivity-schema.ts
2062
2072
  import React13, { forwardRef as forwardRef2, useContext as useContext16, useMemo as useMemo13, useState as useState4 } from "react";
2063
2073
 
2064
2074
  // src/delete-nested-key.ts
@@ -3572,10 +3582,21 @@ var interpolateColors = (input, inputRange, outputRange, options) => {
3572
3582
 
3573
3583
  // src/interpolate-keyframed-status.ts
3574
3584
  var easingToFn = (e) => {
3575
- if (e === "linear") {
3576
- return Easing.linear;
3585
+ switch (e.type) {
3586
+ case "linear":
3587
+ return Easing.linear;
3588
+ case "spring":
3589
+ return Easing.spring({
3590
+ damping: e.damping,
3591
+ mass: e.mass,
3592
+ overshootClamping: e.overshootClamping,
3593
+ stiffness: e.stiffness
3594
+ });
3595
+ case "bezier":
3596
+ return bezier(e.x1, e.y1, e.x2, e.y2);
3597
+ default:
3598
+ throw new TypeError(`Unsupported easing: ${JSON.stringify(e)}`);
3577
3599
  }
3578
- return bezier(e[0], e[1], e[2], e[3]);
3579
3600
  };
3580
3601
  var interpolateKeyframedStatus = ({
3581
3602
  frame,
@@ -3910,6 +3931,9 @@ var findPropsToDelete = ({
3910
3931
  };
3911
3932
 
3912
3933
  // src/use-schema.ts
3934
+ var DEFAULT_LINEAR_EASING = {
3935
+ type: "linear"
3936
+ };
3913
3937
  var makeStaticDragOverride = (value) => {
3914
3938
  return { type: "static", value };
3915
3939
  };
@@ -3922,7 +3946,7 @@ var makeKeyframedDragOverride = ({
3922
3946
  const keyframes = existingIndex === -1 ? [...status.keyframes, { frame, value }].sort((first, second) => first.frame - second.frame) : status.keyframes.map((keyframe, index) => index === existingIndex ? { frame, value } : keyframe);
3923
3947
  const easing = [...status.easing];
3924
3948
  while (easing.length < keyframes.length - 1) {
3925
- easing.push("linear");
3949
+ easing.push(DEFAULT_LINEAR_EASING);
3926
3950
  }
3927
3951
  if (easing.length > keyframes.length - 1) {
3928
3952
  easing.length = keyframes.length - 1;
@@ -4031,7 +4055,7 @@ var computeEffectiveSchemaValuesDotNotation = ({
4031
4055
  return { merged, propsToDelete };
4032
4056
  };
4033
4057
 
4034
- // src/wrap-in-schema.ts
4058
+ // src/with-interactivity-schema.ts
4035
4059
  var getNestedValue = (obj, key) => {
4036
4060
  const parts = key.split(".");
4037
4061
  let current = obj;
@@ -4082,8 +4106,9 @@ var mergeValues = ({
4082
4106
  return merged;
4083
4107
  };
4084
4108
  var stackToOverrideMap = {};
4085
- var wrapInSchema = ({
4109
+ var withInteractivitySchema = ({
4086
4110
  Component,
4111
+ componentName,
4087
4112
  componentIdentity,
4088
4113
  schema,
4089
4114
  supportsEffects
@@ -4096,7 +4121,7 @@ var wrapInSchema = ({
4096
4121
  if (!env.isStudio || env.isReadOnlyStudio || env.isRendering) {
4097
4122
  return React13.createElement(Component, {
4098
4123
  ...props,
4099
- _experimentalControls: null,
4124
+ controls: null,
4100
4125
  ref
4101
4126
  });
4102
4127
  }
@@ -4104,7 +4129,7 @@ var wrapInSchema = ({
4104
4129
  const { getDragOverrides } = useContext16(VisualModeDragOverridesContext);
4105
4130
  const nodePathMapping = useContext16(OverrideIdsToNodePathsGettersContext);
4106
4131
  const frame = useCurrentFrame();
4107
- if (props._experimentalControls) {
4132
+ if (props.controls) {
4108
4133
  return React13.createElement(Component, {
4109
4134
  ...props,
4110
4135
  ref
@@ -4132,7 +4157,8 @@ var wrapInSchema = ({
4132
4157
  currentRuntimeValueDotNotation,
4133
4158
  overrideId,
4134
4159
  supportsEffects,
4135
- componentIdentity
4160
+ componentIdentity,
4161
+ componentName
4136
4162
  };
4137
4163
  }, [currentRuntimeValueDotNotation, overrideId]);
4138
4164
  const { merged: valuesDotNotation, propsToDelete } = useMemo13(() => {
@@ -4159,11 +4185,11 @@ var wrapInSchema = ({
4159
4185
  });
4160
4186
  return React13.createElement(Component, {
4161
4187
  ...mergedProps,
4162
- _experimentalControls: controls,
4188
+ controls,
4163
4189
  ref
4164
4190
  });
4165
4191
  });
4166
- Wrapped.displayName = `wrapInSchema(${Component.displayName || Component.name || "Component"})`;
4192
+ Wrapped.displayName = `withInteractivitySchema(${Component.displayName || Component.name || "Component"})`;
4167
4193
  return Wrapped;
4168
4194
  };
4169
4195
 
@@ -4180,7 +4206,7 @@ var RegularSequenceRefForwardingFunction = ({
4180
4206
  width,
4181
4207
  showInTimeline = true,
4182
4208
  hidden = false,
4183
- _experimentalControls: controls,
4209
+ controls,
4184
4210
  _remotionInternalEffects,
4185
4211
  _remotionInternalLoopDisplay: loopDisplay,
4186
4212
  _remotionInternalStack: stack,
@@ -4188,7 +4214,7 @@ var RegularSequenceRefForwardingFunction = ({
4188
4214
  _remotionInternalPremountDisplay: premountDisplay,
4189
4215
  _remotionInternalPostmountDisplay: postmountDisplay,
4190
4216
  _remotionInternalIsMedia: isMedia,
4191
- _remotionInternalRefForOutline: passedRefForOutline,
4217
+ outlineRef: passedRefForOutline,
4192
4218
  ...other
4193
4219
  }, ref) => {
4194
4220
  const { layout = "absolute-fill" } = other;
@@ -4515,14 +4541,16 @@ var SequenceRefForwardingFunction = (props, ref) => {
4515
4541
  };
4516
4542
  var SequenceInner = forwardRef3(SequenceRefForwardingFunction);
4517
4543
  var SequenceWithoutSchema = SequenceInner;
4518
- var Sequence = wrapInSchema({
4544
+ var Sequence = withInteractivitySchema({
4519
4545
  Component: SequenceInner,
4546
+ componentName: "<Sequence>",
4520
4547
  componentIdentity: "dev.remotion.remotion.Sequence",
4521
4548
  schema: sequenceSchema,
4522
4549
  supportsEffects: false
4523
4550
  });
4524
- var SequenceWithoutFrom = wrapInSchema({
4551
+ var SequenceWithoutFrom = withInteractivitySchema({
4525
4552
  Component: SequenceInner,
4553
+ componentName: "<Sequence>",
4526
4554
  componentIdentity: null,
4527
4555
  schema: sequenceSchemaWithoutFrom,
4528
4556
  supportsEffects: false
@@ -5098,9 +5126,7 @@ var resolveAnimatedImageSource = (src) => {
5098
5126
  // src/animated-image/AnimatedImage.tsx
5099
5127
  import { jsx as jsx14 } from "react/jsx-runtime";
5100
5128
  var animatedImageSchema = {
5101
- durationInFrames: durationInFramesField,
5102
- from: fromField,
5103
- freeze: freezeField,
5129
+ ...baseSchema,
5104
5130
  playbackRate: {
5105
5131
  type: "number",
5106
5132
  min: 0,
@@ -5111,8 +5137,7 @@ var animatedImageSchema = {
5111
5137
  hiddenFromList: false,
5112
5138
  keyframable: false
5113
5139
  },
5114
- ...sequenceVisualStyleSchema,
5115
- hidden: hiddenField
5140
+ ...transformSchema
5116
5141
  };
5117
5142
  var AnimatedImageContent = forwardRef4(({
5118
5143
  src,
@@ -5257,7 +5282,7 @@ var AnimatedImageInner = ({
5257
5282
  durationInFrames,
5258
5283
  requestInit,
5259
5284
  effects = [],
5260
- _experimentalControls: controls,
5285
+ controls,
5261
5286
  ref,
5262
5287
  ...sequenceProps
5263
5288
  }) => {
@@ -5286,10 +5311,10 @@ var AnimatedImageInner = ({
5286
5311
  durationInFrames: resolvedDuration,
5287
5312
  name: "<AnimatedImage>",
5288
5313
  _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/animatedimage",
5289
- _experimentalControls: controls,
5314
+ controls,
5290
5315
  _remotionInternalEffects: memoizedEffectDefinitions,
5291
5316
  ...sequenceProps,
5292
- _remotionInternalRefForOutline: actualRef,
5317
+ outlineRef: actualRef,
5293
5318
  children: /* @__PURE__ */ jsx14(AnimatedImageContent, {
5294
5319
  ...animatedImageProps,
5295
5320
  ref: actualRef,
@@ -5298,14 +5323,46 @@ var AnimatedImageInner = ({
5298
5323
  })
5299
5324
  });
5300
5325
  };
5301
- var AnimatedImage = wrapInSchema({
5326
+ var AnimatedImage = withInteractivitySchema({
5302
5327
  Component: AnimatedImageInner,
5328
+ componentName: "<AnimatedImage>",
5303
5329
  componentIdentity: "dev.remotion.remotion.AnimatedImage",
5304
5330
  schema: animatedImageSchema,
5305
5331
  supportsEffects: true
5306
5332
  });
5307
5333
  AnimatedImage.displayName = "AnimatedImage";
5308
5334
  addSequenceStackTraces(AnimatedImage);
5335
+ // src/effects/create-effect.ts
5336
+ var disabledEffectField = {
5337
+ type: "boolean",
5338
+ default: false,
5339
+ description: "Disabled"
5340
+ };
5341
+ var createEffect = (definition) => {
5342
+ const { calculateKey: userCalculateKey, validateParams } = definition;
5343
+ const widened = {
5344
+ ...definition,
5345
+ documentationLink: definition.documentationLink ?? null,
5346
+ calculateKey: (params) => {
5347
+ const disabled = params.disabled ?? false;
5348
+ return `${userCalculateKey(params)}-disabled-${disabled}`;
5349
+ },
5350
+ schema: {
5351
+ disabled: disabledEffectField,
5352
+ ...definition.schema
5353
+ }
5354
+ };
5355
+ const factory = (params = {}) => {
5356
+ validateParams(params);
5357
+ return {
5358
+ definition: widened,
5359
+ params,
5360
+ effectKey: widened.calculateKey(params),
5361
+ memoized: false
5362
+ };
5363
+ };
5364
+ return factory;
5365
+ };
5309
5366
  // src/Artifact.tsx
5310
5367
  import { useContext as useContext18, useLayoutEffect as useLayoutEffect4, useState as useState8 } from "react";
5311
5368
 
@@ -8447,9 +8504,7 @@ var resolveSolidPixelDensity = (pixelDensity) => {
8447
8504
  return pixelDensity;
8448
8505
  };
8449
8506
  var solidSchema = {
8450
- durationInFrames: durationInFramesField,
8451
- from: fromField,
8452
- freeze: freezeField,
8507
+ ...baseSchema,
8453
8508
  color: {
8454
8509
  type: "color",
8455
8510
  default: "transparent",
@@ -8471,8 +8526,7 @@ var solidSchema = {
8471
8526
  description: "Height",
8472
8527
  hiddenFromList: false
8473
8528
  },
8474
- ...sequenceVisualStyleSchema,
8475
- hidden: hiddenField
8529
+ ...transformSchema
8476
8530
  };
8477
8531
  var SolidInner = ({
8478
8532
  color,
@@ -8579,7 +8633,7 @@ var SolidInner = ({
8579
8633
  };
8580
8634
  var SolidOuter = forwardRef8(({
8581
8635
  effects = [],
8582
- _experimentalControls: controls,
8636
+ controls,
8583
8637
  color,
8584
8638
  height,
8585
8639
  width,
@@ -8605,11 +8659,11 @@ var SolidOuter = forwardRef8(({
8605
8659
  freeze,
8606
8660
  hidden,
8607
8661
  showInTimeline,
8608
- _experimentalControls: controls,
8662
+ controls,
8609
8663
  _remotionInternalEffects: memoizedEffectDefinitions,
8610
8664
  durationInFrames,
8611
8665
  name: name ?? "<Solid>",
8612
- _remotionInternalRefForOutline: actualRef,
8666
+ outlineRef: actualRef,
8613
8667
  _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/solid",
8614
8668
  ...props2,
8615
8669
  children: /* @__PURE__ */ jsx24(SolidInner, {
@@ -8625,8 +8679,9 @@ var SolidOuter = forwardRef8(({
8625
8679
  })
8626
8680
  });
8627
8681
  });
8628
- var Solid = wrapInSchema({
8682
+ var Solid = withInteractivitySchema({
8629
8683
  Component: SolidOuter,
8684
+ componentName: "<Solid>",
8630
8685
  componentIdentity: "dev.remotion.remotion.Solid",
8631
8686
  schema: solidSchema,
8632
8687
  supportsEffects: true
@@ -8913,7 +8968,7 @@ var HtmlInCanvasInner = forwardRef9(({
8913
8968
  onPaint,
8914
8969
  onInit,
8915
8970
  pixelDensity,
8916
- _experimentalControls: controls,
8971
+ controls,
8917
8972
  style,
8918
8973
  durationInFrames,
8919
8974
  name,
@@ -8935,9 +8990,9 @@ var HtmlInCanvasInner = forwardRef9(({
8935
8990
  durationInFrames: resolvedDuration,
8936
8991
  name: name ?? "<HtmlInCanvas>",
8937
8992
  _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/remotion/html-in-canvas",
8938
- _experimentalControls: controls,
8993
+ controls,
8939
8994
  _remotionInternalEffects: memoizedEffectDefinitions,
8940
- _remotionInternalRefForOutline: actualRef,
8995
+ outlineRef: actualRef,
8941
8996
  layout: "none",
8942
8997
  ...sequenceProps,
8943
8998
  children: /* @__PURE__ */ jsx25(HtmlInCanvasContent, {
@@ -8956,14 +9011,12 @@ var HtmlInCanvasInner = forwardRef9(({
8956
9011
  });
8957
9012
  HtmlInCanvasInner.displayName = "HtmlInCanvas";
8958
9013
  var htmlInCanvasSchema = {
8959
- durationInFrames: durationInFramesField,
8960
- from: fromField,
8961
- freeze: freezeField,
8962
- ...sequenceVisualStyleSchema,
8963
- hidden: hiddenField
9014
+ ...baseSchema,
9015
+ ...transformSchema
8964
9016
  };
8965
- var HtmlInCanvasWrapped = wrapInSchema({
9017
+ var HtmlInCanvasWrapped = withInteractivitySchema({
8966
9018
  Component: HtmlInCanvasInner,
9019
+ componentName: "<HtmlInCanvas>",
8967
9020
  componentIdentity: "dev.remotion.remotion.HtmlInCanvas",
8968
9021
  schema: htmlInCanvasSchema,
8969
9022
  supportsEffects: true
@@ -8996,9 +9049,7 @@ function truncateSrcForLabel(src) {
8996
9049
  // src/canvas-image/CanvasImage.tsx
8997
9050
  import { jsx as jsx26 } from "react/jsx-runtime";
8998
9051
  var canvasImageSchema = {
8999
- durationInFrames: durationInFramesField,
9000
- from: fromField,
9001
- freeze: freezeField,
9052
+ ...baseSchema,
9002
9053
  fit: {
9003
9054
  type: "enum",
9004
9055
  default: "fill",
@@ -9009,8 +9060,7 @@ var canvasImageSchema = {
9009
9060
  cover: {}
9010
9061
  }
9011
9062
  },
9012
- ...sequenceVisualStyleSchema,
9013
- hidden: hiddenField
9063
+ ...transformSchema
9014
9064
  };
9015
9065
  var makeAbortError = () => {
9016
9066
  if (typeof DOMException !== "undefined") {
@@ -9091,6 +9141,7 @@ var CanvasImageContent = forwardRef10(({
9091
9141
  const { delayRender: delayRender2, continueRender: continueRender2, cancelRender: cancelRender2 } = useDelayRender();
9092
9142
  const { delayPlayback } = useBufferState();
9093
9143
  const [outputCanvas, setOutputCanvas] = useState16(null);
9144
+ const [loadedImage, setLoadedImage] = useState16(null);
9094
9145
  const actualSrc = usePreload(src);
9095
9146
  const chainState = useEffectChainState();
9096
9147
  const memoizedEffects = useMemoizedEffects({
@@ -9116,9 +9167,6 @@ var CanvasImageContent = forwardRef10(({
9116
9167
  }
9117
9168
  }, [ref, refForOutline]);
9118
9169
  useEffect17(() => {
9119
- if (!outputCanvas || !sourceCanvas) {
9120
- return;
9121
- }
9122
9170
  const isPremounting = Boolean(sequenceContext?.premounting);
9123
9171
  const isPostmounting = Boolean(sequenceContext?.postmounting);
9124
9172
  const handle = delayRender2(`Rendering <CanvasImage> with src="${truncateSrcForLabel(actualSrc)}"`, {
@@ -9133,6 +9181,7 @@ var CanvasImageContent = forwardRef10(({
9133
9181
  let continued = false;
9134
9182
  let errorCount = 0;
9135
9183
  let timeoutId = null;
9184
+ setLoadedImage(null);
9136
9185
  const continueRenderOnce = () => {
9137
9186
  if (continued) {
9138
9187
  return;
@@ -9146,30 +9195,9 @@ var CanvasImageContent = forwardRef10(({
9146
9195
  if (cancelled) {
9147
9196
  return;
9148
9197
  }
9149
- const canvasWidth = width ?? image.width;
9150
- const canvasHeight = height ?? image.height;
9151
- const sourceContext = sourceCanvas.getContext("2d", {
9152
- colorSpace: "srgb"
9153
- });
9154
- if (!sourceContext) {
9155
- throw new Error("Could not get 2D context for <CanvasImage> source canvas");
9156
- }
9157
- sourceCanvas.width = canvasWidth;
9158
- sourceCanvas.height = canvasHeight;
9159
- outputCanvas.width = canvasWidth;
9160
- outputCanvas.height = canvasHeight;
9161
- sourceContext.clearRect(0, 0, canvasWidth, canvasHeight);
9162
- sourceContext.drawImage(image.element, ...calculateImageFit(fit, { width: image.width, height: image.height }, { width: canvasWidth, height: canvasHeight }));
9163
- return runEffectChain({
9164
- state: chainState.get(canvasWidth, canvasHeight),
9165
- source: sourceCanvas,
9166
- effects: memoizedEffects,
9167
- output: outputCanvas,
9168
- width: canvasWidth,
9169
- height: canvasHeight
9170
- });
9171
- }).then((completed) => {
9172
- if (completed && !cancelled) {
9198
+ setLoadedImage(image);
9199
+ }).then(() => {
9200
+ if (!cancelled) {
9173
9201
  continueRenderOnce();
9174
9202
  }
9175
9203
  }).catch((err) => {
@@ -9206,21 +9234,87 @@ var CanvasImageContent = forwardRef10(({
9206
9234
  }, [
9207
9235
  actualSrc,
9208
9236
  cancelRender2,
9209
- chainState,
9210
9237
  continueRender2,
9211
9238
  delayPlayback,
9212
9239
  delayRender2,
9213
9240
  delayRenderRetries,
9214
9241
  delayRenderTimeoutInMilliseconds,
9242
+ maxRetries,
9243
+ onError,
9244
+ pauseWhenLoading,
9245
+ sequenceContext?.postmounting,
9246
+ sequenceContext?.premounting
9247
+ ]);
9248
+ useEffect17(() => {
9249
+ if (!loadedImage || !outputCanvas || !sourceCanvas) {
9250
+ return;
9251
+ }
9252
+ const handle = delayRender2(`Applying effects to <CanvasImage> with src="${truncateSrcForLabel(actualSrc)}"`);
9253
+ let cancelled = false;
9254
+ let continued = false;
9255
+ const continueRenderOnce = () => {
9256
+ if (continued) {
9257
+ return;
9258
+ }
9259
+ continued = true;
9260
+ continueRender2(handle);
9261
+ };
9262
+ const canvasWidth = width ?? loadedImage.width;
9263
+ const canvasHeight = height ?? loadedImage.height;
9264
+ const sourceContext = sourceCanvas.getContext("2d", {
9265
+ colorSpace: "srgb"
9266
+ });
9267
+ if (!sourceContext) {
9268
+ cancelRender2(new Error("Could not get 2D context for <CanvasImage> source canvas"));
9269
+ continueRenderOnce();
9270
+ return () => {
9271
+ continueRenderOnce();
9272
+ };
9273
+ }
9274
+ sourceCanvas.width = canvasWidth;
9275
+ sourceCanvas.height = canvasHeight;
9276
+ outputCanvas.width = canvasWidth;
9277
+ outputCanvas.height = canvasHeight;
9278
+ sourceContext.clearRect(0, 0, canvasWidth, canvasHeight);
9279
+ sourceContext.drawImage(loadedImage.element, ...calculateImageFit(fit, { width: loadedImage.width, height: loadedImage.height }, { width: canvasWidth, height: canvasHeight }));
9280
+ runEffectChain({
9281
+ state: chainState.get(canvasWidth, canvasHeight),
9282
+ source: sourceCanvas,
9283
+ effects: memoizedEffects,
9284
+ output: outputCanvas,
9285
+ width: canvasWidth,
9286
+ height: canvasHeight
9287
+ }).then((completed) => {
9288
+ if (completed && !cancelled) {
9289
+ continueRenderOnce();
9290
+ }
9291
+ }).catch((err) => {
9292
+ if (cancelled) {
9293
+ return;
9294
+ }
9295
+ if (onError) {
9296
+ onError(err);
9297
+ continueRenderOnce();
9298
+ } else {
9299
+ cancelRender2(err);
9300
+ }
9301
+ });
9302
+ return () => {
9303
+ cancelled = true;
9304
+ continueRenderOnce();
9305
+ };
9306
+ }, [
9307
+ actualSrc,
9308
+ cancelRender2,
9309
+ chainState,
9310
+ continueRender2,
9311
+ delayRender2,
9215
9312
  fit,
9216
9313
  height,
9217
- maxRetries,
9314
+ loadedImage,
9218
9315
  memoizedEffects,
9219
9316
  onError,
9220
9317
  outputCanvas,
9221
- pauseWhenLoading,
9222
- sequenceContext?.postmounting,
9223
- sequenceContext?.premounting,
9224
9318
  sourceCanvas,
9225
9319
  width
9226
9320
  ]);
@@ -9256,9 +9350,9 @@ var CanvasImageInner = forwardRef10(({
9256
9350
  name,
9257
9351
  showInTimeline,
9258
9352
  stack,
9259
- _experimentalControls: controls,
9353
+ controls,
9260
9354
  _remotionInternalDocumentationLink,
9261
- _remotionInternalRefForOutline,
9355
+ outlineRef,
9262
9356
  ...canvasProps
9263
9357
  }, ref) => {
9264
9358
  if (!src) {
@@ -9278,11 +9372,11 @@ var CanvasImageInner = forwardRef10(({
9278
9372
  showInTimeline: showInTimeline ?? true,
9279
9373
  name: name ?? "<CanvasImage>",
9280
9374
  _remotionInternalDocumentationLink: _remotionInternalDocumentationLink ?? "https://www.remotion.dev/docs/canvasimage",
9281
- _experimentalControls: controls,
9375
+ controls,
9282
9376
  _remotionInternalEffects: memoizedEffectDefinitions,
9283
9377
  _remotionInternalIsMedia: { type: "image", src },
9284
9378
  _remotionInternalStack: stack,
9285
- _remotionInternalRefForOutline: _remotionInternalRefForOutline ?? actualRef,
9379
+ outlineRef: outlineRef ?? actualRef,
9286
9380
  children: /* @__PURE__ */ jsx26(CanvasImageContent, {
9287
9381
  ref: actualRef,
9288
9382
  src,
@@ -9299,13 +9393,14 @@ var CanvasImageInner = forwardRef10(({
9299
9393
  maxRetries,
9300
9394
  delayRenderRetries,
9301
9395
  delayRenderTimeoutInMilliseconds,
9302
- refForOutline: _remotionInternalRefForOutline ?? null,
9396
+ refForOutline: outlineRef ?? null,
9303
9397
  ...canvasProps
9304
9398
  })
9305
9399
  });
9306
9400
  });
9307
- var CanvasImage = wrapInSchema({
9401
+ var CanvasImage = withInteractivitySchema({
9308
9402
  Component: CanvasImageInner,
9403
+ componentName: "<CanvasImage>",
9309
9404
  componentIdentity: "dev.remotion.remotion.CanvasImage",
9310
9405
  schema: canvasImageSchema,
9311
9406
  supportsEffects: true
@@ -9546,8 +9641,8 @@ var NativeImgInner = ({
9546
9641
  from,
9547
9642
  durationInFrames,
9548
9643
  freeze,
9549
- _experimentalControls: controls,
9550
- _remotionInternalRefForOutline: refForOutline,
9644
+ controls,
9645
+ outlineRef: refForOutline,
9551
9646
  ...props2
9552
9647
  }) => {
9553
9648
  if (!src) {
@@ -9562,10 +9657,10 @@ var NativeImgInner = ({
9562
9657
  _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/img",
9563
9658
  _remotionInternalIsMedia: { type: "image", src },
9564
9659
  name: name ?? "<Img>",
9565
- _experimentalControls: controls,
9660
+ controls,
9566
9661
  showInTimeline: showInTimeline ?? true,
9567
9662
  hidden,
9568
- _remotionInternalRefForOutline: refForOutline,
9663
+ outlineRef: refForOutline,
9569
9664
  children: /* @__PURE__ */ jsx28(ImgContent, {
9570
9665
  src,
9571
9666
  refForOutline,
@@ -9575,11 +9670,8 @@ var NativeImgInner = ({
9575
9670
  };
9576
9671
  var CanvasImageWithPrivateProps = CanvasImage;
9577
9672
  var imgSchema = {
9578
- durationInFrames: durationInFramesField,
9579
- from: fromField,
9580
- freeze: freezeField,
9581
- ...sequenceVisualStyleSchema,
9582
- hidden: hiddenField
9673
+ ...baseSchema,
9674
+ ...transformSchema
9583
9675
  };
9584
9676
  var imgCanvasFallbackIncompatibleProps = new Set([
9585
9677
  "alt",
@@ -9634,7 +9726,7 @@ var ImgInner = ({
9634
9726
  from,
9635
9727
  durationInFrames,
9636
9728
  freeze,
9637
- _experimentalControls: controls,
9729
+ controls,
9638
9730
  width,
9639
9731
  height,
9640
9732
  className,
@@ -9659,7 +9751,7 @@ var ImgInner = ({
9659
9751
  from,
9660
9752
  durationInFrames,
9661
9753
  freeze,
9662
- _experimentalControls: controls,
9754
+ controls,
9663
9755
  width,
9664
9756
  height,
9665
9757
  className,
@@ -9669,7 +9761,7 @@ var ImgInner = ({
9669
9761
  maxRetries,
9670
9762
  delayRenderRetries,
9671
9763
  delayRenderTimeoutInMilliseconds,
9672
- _remotionInternalRefForOutline: refForOutline
9764
+ outlineRef: refForOutline
9673
9765
  });
9674
9766
  }
9675
9767
  if (!src) {
@@ -9706,13 +9798,14 @@ var ImgInner = ({
9706
9798
  showInTimeline,
9707
9799
  stack,
9708
9800
  _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/img",
9709
- _experimentalControls: controls,
9710
- _remotionInternalRefForOutline: refForOutline,
9801
+ controls,
9802
+ outlineRef: refForOutline,
9711
9803
  ...canvasProps
9712
9804
  });
9713
9805
  };
9714
- var Img = wrapInSchema({
9806
+ var Img = withInteractivitySchema({
9715
9807
  Component: ImgInner,
9808
+ componentName: "<Img>",
9716
9809
  componentIdentity: "dev.remotion.remotion.Img",
9717
9810
  schema: imgSchema,
9718
9811
  supportsEffects: true
@@ -9722,11 +9815,8 @@ addSequenceStackTraces(Img);
9722
9815
  import React29, { forwardRef as forwardRef12, useCallback as useCallback20, useRef as useRef25 } from "react";
9723
9816
  import { jsx as jsx29 } from "react/jsx-runtime";
9724
9817
  var interactiveElementSchema = {
9725
- durationInFrames: durationInFramesField,
9726
- from: fromField,
9727
- freeze: freezeField,
9728
- ...sequenceVisualStyleSchema,
9729
- hidden: hiddenField
9818
+ ...baseSchema,
9819
+ ...transformSchema
9730
9820
  };
9731
9821
  var setRef = (ref, value) => {
9732
9822
  if (typeof ref === "function") {
@@ -9745,7 +9835,7 @@ var makeInteractiveElement = (tag, displayName) => {
9745
9835
  name,
9746
9836
  showInTimeline,
9747
9837
  stack,
9748
- _experimentalControls,
9838
+ controls,
9749
9839
  ...props2
9750
9840
  } = propsWithControls;
9751
9841
  const refForOutline = useRef25(null);
@@ -9761,10 +9851,10 @@ var makeInteractiveElement = (tag, displayName) => {
9761
9851
  hidden,
9762
9852
  name: name ?? displayName,
9763
9853
  showInTimeline: showInTimeline ?? true,
9764
- _experimentalControls,
9854
+ controls,
9765
9855
  _remotionInternalStack: stack,
9766
9856
  _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/interactive",
9767
- _remotionInternalRefForOutline: refForOutline,
9857
+ outlineRef: refForOutline,
9768
9858
  children: React29.createElement(tag, {
9769
9859
  ...props2,
9770
9860
  ref: callbackRef
@@ -9772,8 +9862,9 @@ var makeInteractiveElement = (tag, displayName) => {
9772
9862
  });
9773
9863
  });
9774
9864
  Inner.displayName = displayName;
9775
- const Wrapped = wrapInSchema({
9865
+ const Wrapped = withInteractivitySchema({
9776
9866
  Component: Inner,
9867
+ componentName: displayName,
9777
9868
  componentIdentity: `dev.remotion.remotion.${displayName.slice(1, -1)}`,
9778
9869
  schema: interactiveElementSchema,
9779
9870
  supportsEffects: false
@@ -9783,6 +9874,11 @@ var makeInteractiveElement = (tag, displayName) => {
9783
9874
  return Wrapped;
9784
9875
  };
9785
9876
  var Interactive = {
9877
+ baseSchema,
9878
+ transformSchema,
9879
+ premountSchema,
9880
+ sequenceSchema,
9881
+ withSchema: withInteractivitySchema,
9786
9882
  A: makeInteractiveElement("a", "<Interactive.A>"),
9787
9883
  Article: makeInteractiveElement("article", "<Interactive.Article>"),
9788
9884
  Aside: makeInteractiveElement("aside", "<Interactive.Aside>"),
@@ -9982,38 +10078,6 @@ var makeDefaultPreviewCSS = (scope, backgroundColor) => {
9982
10078
  `;
9983
10079
  };
9984
10080
 
9985
- // src/effects/create-effect.ts
9986
- var disabledEffectField = {
9987
- type: "boolean",
9988
- default: false,
9989
- description: "Disabled"
9990
- };
9991
- var createEffect = (definition) => {
9992
- const { calculateKey: userCalculateKey, validateParams } = definition;
9993
- const widened = {
9994
- ...definition,
9995
- documentationLink: definition.documentationLink ?? null,
9996
- calculateKey: (params) => {
9997
- const disabled = params.disabled ?? false;
9998
- return `${userCalculateKey(params)}-disabled-${disabled}`;
9999
- },
10000
- schema: {
10001
- disabled: disabledEffectField,
10002
- ...definition.schema
10003
- }
10004
- };
10005
- const factory = (params = {}) => {
10006
- validateParams(params);
10007
- return {
10008
- definition: widened,
10009
- params,
10010
- effectKey: widened.calculateKey(params),
10011
- memoized: false
10012
- };
10013
- };
10014
- return factory;
10015
- };
10016
-
10017
10081
  // src/get-preview-dom-element.ts
10018
10082
  var REMOTION_STUDIO_CONTAINER_ELEMENT = "__remotion-studio-container";
10019
10083
  var getPreviewDomElement = () => {
@@ -11280,12 +11344,14 @@ var Internals = {
11280
11344
  SequenceManager,
11281
11345
  SequenceManagerRefContext,
11282
11346
  SequenceStackTracesUpdateContext,
11283
- wrapInSchema,
11347
+ baseSchema,
11284
11348
  sequenceSchema,
11285
11349
  SequenceWithoutSchema,
11286
11350
  sequenceStyleSchema,
11287
11351
  sequenceVisualStyleSchema,
11288
11352
  sequencePremountSchema,
11353
+ transformSchema,
11354
+ premountSchema,
11289
11355
  flattenActiveSchema,
11290
11356
  getFlatSchemaWithAllKeys,
11291
11357
  RemotionRootContexts,
@@ -11497,8 +11563,9 @@ var SeriesInner = (props2) => {
11497
11563
  })
11498
11564
  });
11499
11565
  };
11500
- var Series = Object.assign(wrapInSchema({
11566
+ var Series = Object.assign(withInteractivitySchema({
11501
11567
  Component: SeriesInner,
11568
+ componentName: "<Series>",
11502
11569
  componentIdentity: "dev.remotion.remotion.Series",
11503
11570
  schema: sequenceSchemaDefaultLayoutNone,
11504
11571
  supportsEffects: false
@@ -12133,6 +12200,7 @@ export {
12133
12200
  getRemotionEnvironment,
12134
12201
  getInputProps,
12135
12202
  delayRender,
12203
+ createEffect,
12136
12204
  continueRender,
12137
12205
  cancelRender,
12138
12206
  assertValidInterpolatePosterizeOption,