@remotion/promo-pages 4.0.477 → 4.0.479

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/team.js CHANGED
@@ -5746,7 +5746,7 @@ var getComponentsToAddStacksTo = () => componentsToAddStacksTo;
5746
5746
  var addSequenceStackTraces = (component) => {
5747
5747
  componentsToAddStacksTo.push(component);
5748
5748
  };
5749
- var VERSION = "4.0.477";
5749
+ var VERSION = "4.0.479";
5750
5750
  var checkMultipleRemotionVersions = () => {
5751
5751
  if (typeof globalThis === "undefined") {
5752
5752
  return;
@@ -6109,10 +6109,7 @@ var Freeze = ({
6109
6109
  })
6110
6110
  });
6111
6111
  };
6112
- var PremountContext = createContext14({
6113
- premountFramesRemaining: 0
6114
- });
6115
- var sequenceVisualStyleSchema = {
6112
+ var transformSchema = {
6116
6113
  "style.transformOrigin": {
6117
6114
  type: "transform-origin",
6118
6115
  step: 1,
@@ -6148,7 +6145,8 @@ var sequenceVisualStyleSchema = {
6148
6145
  hiddenFromList: false
6149
6146
  }
6150
6147
  };
6151
- var sequencePremountSchema = {
6148
+ var sequenceVisualStyleSchema = transformSchema;
6149
+ var premountSchema = {
6152
6150
  premountFor: {
6153
6151
  type: "number",
6154
6152
  default: 0,
@@ -6171,9 +6169,10 @@ var sequencePremountSchema = {
6171
6169
  type: "hidden"
6172
6170
  }
6173
6171
  };
6172
+ var sequencePremountSchema = premountSchema;
6174
6173
  var sequenceStyleSchema = {
6175
- ...sequenceVisualStyleSchema,
6176
- ...sequencePremountSchema
6174
+ ...transformSchema,
6175
+ ...premountSchema
6177
6176
  };
6178
6177
  var hiddenField = {
6179
6178
  type: "boolean",
@@ -6211,12 +6210,16 @@ var freezeField = {
6211
6210
  step: 1,
6212
6211
  hiddenFromList: true
6213
6212
  };
6214
- var sequenceSchema = extendSchemaWithSequenceName({
6215
- hidden: hiddenField,
6216
- showInTimeline: showInTimelineField,
6213
+ var baseSchema = {
6214
+ durationInFrames: durationInFramesField,
6217
6215
  from: fromField,
6218
6216
  freeze: freezeField,
6219
- durationInFrames: durationInFramesField,
6217
+ hidden: hiddenField,
6218
+ name: sequenceNameField,
6219
+ showInTimeline: showInTimelineField
6220
+ };
6221
+ var sequenceSchema = {
6222
+ ...baseSchema,
6220
6223
  layout: {
6221
6224
  type: "enum",
6222
6225
  default: "absolute-fill",
@@ -6226,14 +6229,18 @@ var sequenceSchema = extendSchemaWithSequenceName({
6226
6229
  none: {}
6227
6230
  }
6228
6231
  }
6229
- });
6230
- var sequenceSchemaWithoutFrom = extendSchemaWithSequenceName({
6231
- hidden: hiddenField,
6232
- showInTimeline: showInTimelineField,
6233
- freeze: freezeField,
6232
+ };
6233
+ var baseSchemaWithoutFrom = {
6234
6234
  durationInFrames: durationInFramesField,
6235
+ freeze: freezeField,
6236
+ hidden: hiddenField,
6237
+ name: sequenceNameField,
6238
+ showInTimeline: showInTimelineField
6239
+ };
6240
+ var sequenceSchemaWithoutFrom = {
6241
+ ...baseSchemaWithoutFrom,
6235
6242
  layout: sequenceSchema.layout
6236
- });
6243
+ };
6237
6244
  var sequenceSchemaDefaultLayoutNone = {
6238
6245
  ...sequenceSchema,
6239
6246
  layout: {
@@ -6241,6 +6248,9 @@ var sequenceSchemaDefaultLayoutNone = {
6241
6248
  default: "none"
6242
6249
  }
6243
6250
  };
6251
+ var PremountContext = createContext14({
6252
+ premountFramesRemaining: 0
6253
+ });
6244
6254
  var SequenceManager = React11.createContext({
6245
6255
  registerSequence: () => {
6246
6256
  throw new Error("SequenceManagerContext not initialized");
@@ -7925,10 +7935,21 @@ var interpolateColors = (input, inputRange, outputRange, options) => {
7925
7935
  return interpolateColorsRGB(input, inputRange, processedOutputRange, options);
7926
7936
  };
7927
7937
  var easingToFn = (e) => {
7928
- if (e === "linear") {
7929
- return Easing.linear;
7938
+ switch (e.type) {
7939
+ case "linear":
7940
+ return Easing.linear;
7941
+ case "spring":
7942
+ return Easing.spring({
7943
+ damping: e.damping,
7944
+ mass: e.mass,
7945
+ overshootClamping: e.overshootClamping,
7946
+ stiffness: e.stiffness
7947
+ });
7948
+ case "bezier":
7949
+ return bezier(e.x1, e.y1, e.x2, e.y2);
7950
+ default:
7951
+ throw new TypeError(`Unsupported easing: ${JSON.stringify(e)}`);
7930
7952
  }
7931
- return bezier(e[0], e[1], e[2], e[3]);
7932
7953
  };
7933
7954
  var interpolateKeyframedStatus = ({
7934
7955
  frame,
@@ -8250,6 +8271,9 @@ var findPropsToDelete = ({
8250
8271
  }
8251
8272
  return [...otherKeys];
8252
8273
  };
8274
+ var DEFAULT_LINEAR_EASING = {
8275
+ type: "linear"
8276
+ };
8253
8277
  var makeStaticDragOverride = (value) => {
8254
8278
  return { type: "static", value };
8255
8279
  };
@@ -8262,7 +8286,7 @@ var makeKeyframedDragOverride = ({
8262
8286
  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);
8263
8287
  const easing = [...status.easing];
8264
8288
  while (easing.length < keyframes.length - 1) {
8265
- easing.push("linear");
8289
+ easing.push(DEFAULT_LINEAR_EASING);
8266
8290
  }
8267
8291
  if (easing.length > keyframes.length - 1) {
8268
8292
  easing.length = keyframes.length - 1;
@@ -8420,7 +8444,7 @@ var mergeValues = ({
8420
8444
  return merged;
8421
8445
  };
8422
8446
  var stackToOverrideMap = {};
8423
- var wrapInSchema = ({
8447
+ var withInteractivitySchema = ({
8424
8448
  Component,
8425
8449
  componentIdentity,
8426
8450
  schema,
@@ -8434,7 +8458,7 @@ var wrapInSchema = ({
8434
8458
  if (!env.isStudio || env.isReadOnlyStudio || env.isRendering) {
8435
8459
  return React13.createElement(Component, {
8436
8460
  ...props,
8437
- _experimentalControls: null,
8461
+ controls: null,
8438
8462
  ref
8439
8463
  });
8440
8464
  }
@@ -8442,7 +8466,7 @@ var wrapInSchema = ({
8442
8466
  const { getDragOverrides } = useContext16(VisualModeDragOverridesContext);
8443
8467
  const nodePathMapping = useContext16(OverrideIdsToNodePathsGettersContext);
8444
8468
  const frame = useCurrentFrame();
8445
- if (props._experimentalControls) {
8469
+ if (props.controls) {
8446
8470
  return React13.createElement(Component, {
8447
8471
  ...props,
8448
8472
  ref
@@ -8497,11 +8521,11 @@ var wrapInSchema = ({
8497
8521
  });
8498
8522
  return React13.createElement(Component, {
8499
8523
  ...mergedProps,
8500
- _experimentalControls: controls,
8524
+ controls,
8501
8525
  ref
8502
8526
  });
8503
8527
  });
8504
- Wrapped.displayName = `wrapInSchema(${Component.displayName || Component.name || "Component"})`;
8528
+ Wrapped.displayName = `withInteractivitySchema(${Component.displayName || Component.name || "Component"})`;
8505
8529
  return Wrapped;
8506
8530
  };
8507
8531
  var EMPTY_EFFECTS = [];
@@ -8515,7 +8539,7 @@ var RegularSequenceRefForwardingFunction = ({
8515
8539
  width,
8516
8540
  showInTimeline = true,
8517
8541
  hidden = false,
8518
- _experimentalControls: controls,
8542
+ controls,
8519
8543
  _remotionInternalEffects,
8520
8544
  _remotionInternalLoopDisplay: loopDisplay,
8521
8545
  _remotionInternalStack: stack,
@@ -8523,7 +8547,7 @@ var RegularSequenceRefForwardingFunction = ({
8523
8547
  _remotionInternalPremountDisplay: premountDisplay,
8524
8548
  _remotionInternalPostmountDisplay: postmountDisplay,
8525
8549
  _remotionInternalIsMedia: isMedia,
8526
- _remotionInternalRefForOutline: passedRefForOutline,
8550
+ outlineRef: passedRefForOutline,
8527
8551
  ...other
8528
8552
  }, ref) => {
8529
8553
  const { layout = "absolute-fill" } = other;
@@ -8620,6 +8644,11 @@ var RegularSequenceRefForwardingFunction = ({
8620
8644
  const inheritedStack = other?.stack ?? null;
8621
8645
  const stackRef = useRef6(null);
8622
8646
  stackRef.current = stack ?? inheritedStack;
8647
+ const registeredFrozenFrame = typeof freeze === "number" ? freeze : null;
8648
+ const parentCumulatedNegativeFrom = parentSequence?.cumulatedNegativeFrom ?? 0;
8649
+ const startMediaFrom = isMedia && isMedia.type !== "image" ? isMedia.data.startMediaFrom + parentCumulatedNegativeFrom - cumulatedNegativeFrom : null;
8650
+ const mediaFrameAtSequenceZero = isMedia && isMedia.type !== "image" ? isMedia.data.startMediaFrom + parentCumulatedNegativeFrom : null;
8651
+ const frozenMediaFrame = isMedia && isMedia.type !== "image" && mediaFrameAtSequenceZero !== null ? registeredFrozenFrame === null ? null : mediaFrameAtSequenceZero + (loopDisplay ? registeredFrozenFrame % loopDisplay.durationInFrames : registeredFrozenFrame) * isMedia.data.playbackRate : null;
8623
8652
  useEffect3(() => {
8624
8653
  if (!env.isStudio) {
8625
8654
  return;
@@ -8645,7 +8674,8 @@ var RegularSequenceRefForwardingFunction = ({
8645
8674
  src: isMedia.src,
8646
8675
  getStack: () => stackRef.current,
8647
8676
  refForOutline: refForOutline ?? null,
8648
- isInsideSeries
8677
+ isInsideSeries,
8678
+ frozenFrame: registeredFrozenFrame
8649
8679
  });
8650
8680
  } else {
8651
8681
  registerSequence({
@@ -8668,10 +8698,12 @@ var RegularSequenceRefForwardingFunction = ({
8668
8698
  showInTimeline,
8669
8699
  src: isMedia.data.src,
8670
8700
  getStack: () => stackRef.current,
8671
- startMediaFrom: isMedia.data.startMediaFrom,
8701
+ startMediaFrom: startMediaFrom ?? isMedia.data.startMediaFrom,
8672
8702
  volume: isMedia.data.volumes,
8673
8703
  refForOutline: refForOutline ?? null,
8674
- isInsideSeries
8704
+ isInsideSeries,
8705
+ frozenFrame: registeredFrozenFrame,
8706
+ frozenMediaFrame
8675
8707
  });
8676
8708
  }
8677
8709
  return () => {
@@ -8696,7 +8728,8 @@ var RegularSequenceRefForwardingFunction = ({
8696
8728
  controls: controls ?? null,
8697
8729
  effects: _remotionInternalEffects ?? EMPTY_EFFECTS,
8698
8730
  refForOutline: refForOutline ?? null,
8699
- isInsideSeries
8731
+ isInsideSeries,
8732
+ frozenFrame: registeredFrozenFrame
8700
8733
  });
8701
8734
  return () => {
8702
8735
  unregisterSequence(id);
@@ -8723,7 +8756,10 @@ var RegularSequenceRefForwardingFunction = ({
8723
8756
  isMedia,
8724
8757
  resolvedDocumentationLink,
8725
8758
  refForOutline,
8726
- isInsideSeries
8759
+ isInsideSeries,
8760
+ registeredFrozenFrame,
8761
+ startMediaFrom,
8762
+ frozenMediaFrame
8727
8763
  ]);
8728
8764
  const endThreshold = Math.ceil(cumulatedFrom + from + durationInFrames - 1);
8729
8765
  const content = absoluteFrame < cumulatedFrom + from ? null : absoluteFrame > endThreshold ? null : children;
@@ -8838,13 +8874,13 @@ var SequenceRefForwardingFunction = (props, ref) => {
8838
8874
  };
8839
8875
  var SequenceInner = forwardRef3(SequenceRefForwardingFunction);
8840
8876
  var SequenceWithoutSchema = SequenceInner;
8841
- var Sequence = wrapInSchema({
8877
+ var Sequence = withInteractivitySchema({
8842
8878
  Component: SequenceInner,
8843
8879
  componentIdentity: "dev.remotion.remotion.Sequence",
8844
8880
  schema: sequenceSchema,
8845
8881
  supportsEffects: false
8846
8882
  });
8847
- var SequenceWithoutFrom = wrapInSchema({
8883
+ var SequenceWithoutFrom = withInteractivitySchema({
8848
8884
  Component: SequenceInner,
8849
8885
  componentIdentity: null,
8850
8886
  schema: sequenceSchemaWithoutFrom,
@@ -9383,9 +9419,7 @@ var resolveAnimatedImageSource = (src) => {
9383
9419
  return new URL(src, window.origin).href;
9384
9420
  };
9385
9421
  var animatedImageSchema = {
9386
- durationInFrames: durationInFramesField,
9387
- from: fromField,
9388
- freeze: freezeField,
9422
+ ...baseSchema,
9389
9423
  playbackRate: {
9390
9424
  type: "number",
9391
9425
  min: 0,
@@ -9396,8 +9430,7 @@ var animatedImageSchema = {
9396
9430
  hiddenFromList: false,
9397
9431
  keyframable: false
9398
9432
  },
9399
- ...sequenceVisualStyleSchema,
9400
- hidden: hiddenField
9433
+ ...transformSchema
9401
9434
  };
9402
9435
  var AnimatedImageContent = forwardRef4(({
9403
9436
  src,
@@ -9542,7 +9575,7 @@ var AnimatedImageInner = ({
9542
9575
  durationInFrames,
9543
9576
  requestInit,
9544
9577
  effects = [],
9545
- _experimentalControls: controls,
9578
+ controls,
9546
9579
  ref,
9547
9580
  ...sequenceProps
9548
9581
  }) => {
@@ -9571,10 +9604,10 @@ var AnimatedImageInner = ({
9571
9604
  durationInFrames: resolvedDuration,
9572
9605
  name: "<AnimatedImage>",
9573
9606
  _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/animatedimage",
9574
- _experimentalControls: controls,
9607
+ controls,
9575
9608
  _remotionInternalEffects: memoizedEffectDefinitions,
9576
9609
  ...sequenceProps,
9577
- _remotionInternalRefForOutline: actualRef,
9610
+ outlineRef: actualRef,
9578
9611
  children: /* @__PURE__ */ jsx14(AnimatedImageContent, {
9579
9612
  ...animatedImageProps,
9580
9613
  ref: actualRef,
@@ -9583,7 +9616,7 @@ var AnimatedImageInner = ({
9583
9616
  })
9584
9617
  });
9585
9618
  };
9586
- var AnimatedImage = wrapInSchema({
9619
+ var AnimatedImage = withInteractivitySchema({
9587
9620
  Component: AnimatedImageInner,
9588
9621
  componentIdentity: "dev.remotion.remotion.AnimatedImage",
9589
9622
  schema: animatedImageSchema,
@@ -9591,6 +9624,36 @@ var AnimatedImage = wrapInSchema({
9591
9624
  });
9592
9625
  AnimatedImage.displayName = "AnimatedImage";
9593
9626
  addSequenceStackTraces(AnimatedImage);
9627
+ var disabledEffectField = {
9628
+ type: "boolean",
9629
+ default: false,
9630
+ description: "Disabled"
9631
+ };
9632
+ var createEffect = (definition) => {
9633
+ const { calculateKey: userCalculateKey, validateParams } = definition;
9634
+ const widened = {
9635
+ ...definition,
9636
+ documentationLink: definition.documentationLink ?? null,
9637
+ calculateKey: (params) => {
9638
+ const disabled = params.disabled ?? false;
9639
+ return `${userCalculateKey(params)}-disabled-${disabled}`;
9640
+ },
9641
+ schema: {
9642
+ disabled: disabledEffectField,
9643
+ ...definition.schema
9644
+ }
9645
+ };
9646
+ const factory = (params = {}) => {
9647
+ validateParams(params);
9648
+ return {
9649
+ definition: widened,
9650
+ params,
9651
+ effectKey: widened.calculateKey(params),
9652
+ memoized: false
9653
+ };
9654
+ };
9655
+ return factory;
9656
+ };
9594
9657
  var validateArtifactFilename = (filename) => {
9595
9658
  if (typeof filename !== "string") {
9596
9659
  throw new TypeError(`The "filename" must be a string, but you passed a value of type ${typeof filename}`);
@@ -11218,7 +11281,9 @@ var useMediaInTimeline = ({
11218
11281
  controls: null,
11219
11282
  effects: [],
11220
11283
  refForOutline,
11221
- isInsideSeries: false
11284
+ isInsideSeries: false,
11285
+ frozenFrame: null,
11286
+ frozenMediaFrame: null
11222
11287
  });
11223
11288
  return () => {
11224
11289
  unregisterSequence(id);
@@ -12534,9 +12599,7 @@ var resolveSolidPixelDensity = (pixelDensity) => {
12534
12599
  return pixelDensity;
12535
12600
  };
12536
12601
  var solidSchema = {
12537
- durationInFrames: durationInFramesField,
12538
- from: fromField,
12539
- freeze: freezeField,
12602
+ ...baseSchema,
12540
12603
  color: {
12541
12604
  type: "color",
12542
12605
  default: "transparent",
@@ -12558,8 +12621,7 @@ var solidSchema = {
12558
12621
  description: "Height",
12559
12622
  hiddenFromList: false
12560
12623
  },
12561
- ...sequenceVisualStyleSchema,
12562
- hidden: hiddenField
12624
+ ...transformSchema
12563
12625
  };
12564
12626
  var SolidInner = ({
12565
12627
  color,
@@ -12666,7 +12728,7 @@ var SolidInner = ({
12666
12728
  };
12667
12729
  var SolidOuter = forwardRef8(({
12668
12730
  effects = [],
12669
- _experimentalControls: controls,
12731
+ controls,
12670
12732
  color,
12671
12733
  height,
12672
12734
  width,
@@ -12692,11 +12754,11 @@ var SolidOuter = forwardRef8(({
12692
12754
  freeze,
12693
12755
  hidden,
12694
12756
  showInTimeline,
12695
- _experimentalControls: controls,
12757
+ controls,
12696
12758
  _remotionInternalEffects: memoizedEffectDefinitions,
12697
12759
  durationInFrames,
12698
12760
  name: name ?? "<Solid>",
12699
- _remotionInternalRefForOutline: actualRef,
12761
+ outlineRef: actualRef,
12700
12762
  _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/solid",
12701
12763
  ...props2,
12702
12764
  children: /* @__PURE__ */ jsx24(SolidInner, {
@@ -12712,7 +12774,7 @@ var SolidOuter = forwardRef8(({
12712
12774
  })
12713
12775
  });
12714
12776
  });
12715
- var Solid = wrapInSchema({
12777
+ var Solid = withInteractivitySchema({
12716
12778
  Component: SolidOuter,
12717
12779
  componentIdentity: "dev.remotion.remotion.Solid",
12718
12780
  schema: solidSchema,
@@ -12989,7 +13051,7 @@ var HtmlInCanvasInner = forwardRef9(({
12989
13051
  onPaint,
12990
13052
  onInit,
12991
13053
  pixelDensity,
12992
- _experimentalControls: controls,
13054
+ controls,
12993
13055
  style,
12994
13056
  durationInFrames,
12995
13057
  name,
@@ -13011,9 +13073,9 @@ var HtmlInCanvasInner = forwardRef9(({
13011
13073
  durationInFrames: resolvedDuration,
13012
13074
  name: name ?? "<HtmlInCanvas>",
13013
13075
  _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/remotion/html-in-canvas",
13014
- _experimentalControls: controls,
13076
+ controls,
13015
13077
  _remotionInternalEffects: memoizedEffectDefinitions,
13016
- _remotionInternalRefForOutline: actualRef,
13078
+ outlineRef: actualRef,
13017
13079
  layout: "none",
13018
13080
  ...sequenceProps,
13019
13081
  children: /* @__PURE__ */ jsx25(HtmlInCanvasContent, {
@@ -13032,13 +13094,10 @@ var HtmlInCanvasInner = forwardRef9(({
13032
13094
  });
13033
13095
  HtmlInCanvasInner.displayName = "HtmlInCanvas";
13034
13096
  var htmlInCanvasSchema = {
13035
- durationInFrames: durationInFramesField,
13036
- from: fromField,
13037
- freeze: freezeField,
13038
- ...sequenceVisualStyleSchema,
13039
- hidden: hiddenField
13097
+ ...baseSchema,
13098
+ ...transformSchema
13040
13099
  };
13041
- var HtmlInCanvasWrapped = wrapInSchema({
13100
+ var HtmlInCanvasWrapped = withInteractivitySchema({
13042
13101
  Component: HtmlInCanvasInner,
13043
13102
  componentIdentity: "dev.remotion.remotion.HtmlInCanvas",
13044
13103
  schema: htmlInCanvasSchema,
@@ -13056,9 +13115,7 @@ function truncateSrcForLabel(src) {
13056
13115
  return src;
13057
13116
  }
13058
13117
  var canvasImageSchema = {
13059
- durationInFrames: durationInFramesField,
13060
- from: fromField,
13061
- freeze: freezeField,
13118
+ ...baseSchema,
13062
13119
  fit: {
13063
13120
  type: "enum",
13064
13121
  default: "fill",
@@ -13069,8 +13126,7 @@ var canvasImageSchema = {
13069
13126
  cover: {}
13070
13127
  }
13071
13128
  },
13072
- ...sequenceVisualStyleSchema,
13073
- hidden: hiddenField
13129
+ ...transformSchema
13074
13130
  };
13075
13131
  var makeAbortError = () => {
13076
13132
  if (typeof DOMException !== "undefined") {
@@ -13151,6 +13207,7 @@ var CanvasImageContent = forwardRef10(({
13151
13207
  const { delayRender: delayRender2, continueRender: continueRender2, cancelRender: cancelRender2 } = useDelayRender();
13152
13208
  const { delayPlayback } = useBufferState();
13153
13209
  const [outputCanvas, setOutputCanvas] = useState16(null);
13210
+ const [loadedImage, setLoadedImage] = useState16(null);
13154
13211
  const actualSrc = usePreload(src);
13155
13212
  const chainState = useEffectChainState();
13156
13213
  const memoizedEffects = useMemoizedEffects({
@@ -13176,9 +13233,6 @@ var CanvasImageContent = forwardRef10(({
13176
13233
  }
13177
13234
  }, [ref, refForOutline]);
13178
13235
  useEffect17(() => {
13179
- if (!outputCanvas || !sourceCanvas) {
13180
- return;
13181
- }
13182
13236
  const isPremounting = Boolean(sequenceContext?.premounting);
13183
13237
  const isPostmounting = Boolean(sequenceContext?.postmounting);
13184
13238
  const handle = delayRender2(`Rendering <CanvasImage> with src="${truncateSrcForLabel(actualSrc)}"`, {
@@ -13193,6 +13247,7 @@ var CanvasImageContent = forwardRef10(({
13193
13247
  let continued = false;
13194
13248
  let errorCount = 0;
13195
13249
  let timeoutId = null;
13250
+ setLoadedImage(null);
13196
13251
  const continueRenderOnce = () => {
13197
13252
  if (continued) {
13198
13253
  return;
@@ -13206,30 +13261,9 @@ var CanvasImageContent = forwardRef10(({
13206
13261
  if (cancelled) {
13207
13262
  return;
13208
13263
  }
13209
- const canvasWidth = width ?? image.width;
13210
- const canvasHeight = height ?? image.height;
13211
- const sourceContext = sourceCanvas.getContext("2d", {
13212
- colorSpace: "srgb"
13213
- });
13214
- if (!sourceContext) {
13215
- throw new Error("Could not get 2D context for <CanvasImage> source canvas");
13216
- }
13217
- sourceCanvas.width = canvasWidth;
13218
- sourceCanvas.height = canvasHeight;
13219
- outputCanvas.width = canvasWidth;
13220
- outputCanvas.height = canvasHeight;
13221
- sourceContext.clearRect(0, 0, canvasWidth, canvasHeight);
13222
- sourceContext.drawImage(image.element, ...calculateImageFit(fit, { width: image.width, height: image.height }, { width: canvasWidth, height: canvasHeight }));
13223
- return runEffectChain({
13224
- state: chainState.get(canvasWidth, canvasHeight),
13225
- source: sourceCanvas,
13226
- effects: memoizedEffects,
13227
- output: outputCanvas,
13228
- width: canvasWidth,
13229
- height: canvasHeight
13230
- });
13231
- }).then((completed) => {
13232
- if (completed && !cancelled) {
13264
+ setLoadedImage(image);
13265
+ }).then(() => {
13266
+ if (!cancelled) {
13233
13267
  continueRenderOnce();
13234
13268
  }
13235
13269
  }).catch((err) => {
@@ -13266,21 +13300,87 @@ var CanvasImageContent = forwardRef10(({
13266
13300
  }, [
13267
13301
  actualSrc,
13268
13302
  cancelRender2,
13269
- chainState,
13270
13303
  continueRender2,
13271
13304
  delayPlayback,
13272
13305
  delayRender2,
13273
13306
  delayRenderRetries,
13274
13307
  delayRenderTimeoutInMilliseconds,
13308
+ maxRetries,
13309
+ onError,
13310
+ pauseWhenLoading,
13311
+ sequenceContext?.postmounting,
13312
+ sequenceContext?.premounting
13313
+ ]);
13314
+ useEffect17(() => {
13315
+ if (!loadedImage || !outputCanvas || !sourceCanvas) {
13316
+ return;
13317
+ }
13318
+ const handle = delayRender2(`Applying effects to <CanvasImage> with src="${truncateSrcForLabel(actualSrc)}"`);
13319
+ let cancelled = false;
13320
+ let continued = false;
13321
+ const continueRenderOnce = () => {
13322
+ if (continued) {
13323
+ return;
13324
+ }
13325
+ continued = true;
13326
+ continueRender2(handle);
13327
+ };
13328
+ const canvasWidth = width ?? loadedImage.width;
13329
+ const canvasHeight = height ?? loadedImage.height;
13330
+ const sourceContext = sourceCanvas.getContext("2d", {
13331
+ colorSpace: "srgb"
13332
+ });
13333
+ if (!sourceContext) {
13334
+ cancelRender2(new Error("Could not get 2D context for <CanvasImage> source canvas"));
13335
+ continueRenderOnce();
13336
+ return () => {
13337
+ continueRenderOnce();
13338
+ };
13339
+ }
13340
+ sourceCanvas.width = canvasWidth;
13341
+ sourceCanvas.height = canvasHeight;
13342
+ outputCanvas.width = canvasWidth;
13343
+ outputCanvas.height = canvasHeight;
13344
+ sourceContext.clearRect(0, 0, canvasWidth, canvasHeight);
13345
+ sourceContext.drawImage(loadedImage.element, ...calculateImageFit(fit, { width: loadedImage.width, height: loadedImage.height }, { width: canvasWidth, height: canvasHeight }));
13346
+ runEffectChain({
13347
+ state: chainState.get(canvasWidth, canvasHeight),
13348
+ source: sourceCanvas,
13349
+ effects: memoizedEffects,
13350
+ output: outputCanvas,
13351
+ width: canvasWidth,
13352
+ height: canvasHeight
13353
+ }).then((completed) => {
13354
+ if (completed && !cancelled) {
13355
+ continueRenderOnce();
13356
+ }
13357
+ }).catch((err) => {
13358
+ if (cancelled) {
13359
+ return;
13360
+ }
13361
+ if (onError) {
13362
+ onError(err);
13363
+ continueRenderOnce();
13364
+ } else {
13365
+ cancelRender2(err);
13366
+ }
13367
+ });
13368
+ return () => {
13369
+ cancelled = true;
13370
+ continueRenderOnce();
13371
+ };
13372
+ }, [
13373
+ actualSrc,
13374
+ cancelRender2,
13375
+ chainState,
13376
+ continueRender2,
13377
+ delayRender2,
13275
13378
  fit,
13276
13379
  height,
13277
- maxRetries,
13380
+ loadedImage,
13278
13381
  memoizedEffects,
13279
13382
  onError,
13280
13383
  outputCanvas,
13281
- pauseWhenLoading,
13282
- sequenceContext?.postmounting,
13283
- sequenceContext?.premounting,
13284
13384
  sourceCanvas,
13285
13385
  width
13286
13386
  ]);
@@ -13316,9 +13416,9 @@ var CanvasImageInner = forwardRef10(({
13316
13416
  name,
13317
13417
  showInTimeline,
13318
13418
  stack,
13319
- _experimentalControls: controls,
13419
+ controls,
13320
13420
  _remotionInternalDocumentationLink,
13321
- _remotionInternalRefForOutline,
13421
+ outlineRef,
13322
13422
  ...canvasProps
13323
13423
  }, ref) => {
13324
13424
  if (!src) {
@@ -13338,11 +13438,11 @@ var CanvasImageInner = forwardRef10(({
13338
13438
  showInTimeline: showInTimeline ?? true,
13339
13439
  name: name ?? "<CanvasImage>",
13340
13440
  _remotionInternalDocumentationLink: _remotionInternalDocumentationLink ?? "https://www.remotion.dev/docs/canvasimage",
13341
- _experimentalControls: controls,
13441
+ controls,
13342
13442
  _remotionInternalEffects: memoizedEffectDefinitions,
13343
13443
  _remotionInternalIsMedia: { type: "image", src },
13344
13444
  _remotionInternalStack: stack,
13345
- _remotionInternalRefForOutline: _remotionInternalRefForOutline ?? actualRef,
13445
+ outlineRef: outlineRef ?? actualRef,
13346
13446
  children: /* @__PURE__ */ jsx26(CanvasImageContent, {
13347
13447
  ref: actualRef,
13348
13448
  src,
@@ -13359,12 +13459,12 @@ var CanvasImageInner = forwardRef10(({
13359
13459
  maxRetries,
13360
13460
  delayRenderRetries,
13361
13461
  delayRenderTimeoutInMilliseconds,
13362
- refForOutline: _remotionInternalRefForOutline ?? null,
13462
+ refForOutline: outlineRef ?? null,
13363
13463
  ...canvasProps
13364
13464
  })
13365
13465
  });
13366
13466
  });
13367
- var CanvasImage = wrapInSchema({
13467
+ var CanvasImage = withInteractivitySchema({
13368
13468
  Component: CanvasImageInner,
13369
13469
  componentIdentity: "dev.remotion.remotion.CanvasImage",
13370
13470
  schema: canvasImageSchema,
@@ -13569,8 +13669,8 @@ var NativeImgInner = ({
13569
13669
  from,
13570
13670
  durationInFrames,
13571
13671
  freeze,
13572
- _experimentalControls: controls,
13573
- _remotionInternalRefForOutline: refForOutline,
13672
+ controls,
13673
+ outlineRef: refForOutline,
13574
13674
  ...props2
13575
13675
  }) => {
13576
13676
  if (!src) {
@@ -13585,10 +13685,10 @@ var NativeImgInner = ({
13585
13685
  _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/img",
13586
13686
  _remotionInternalIsMedia: { type: "image", src },
13587
13687
  name: name ?? "<Img>",
13588
- _experimentalControls: controls,
13688
+ controls,
13589
13689
  showInTimeline: showInTimeline ?? true,
13590
13690
  hidden,
13591
- _remotionInternalRefForOutline: refForOutline,
13691
+ outlineRef: refForOutline,
13592
13692
  children: /* @__PURE__ */ jsx28(ImgContent, {
13593
13693
  src,
13594
13694
  refForOutline,
@@ -13598,11 +13698,8 @@ var NativeImgInner = ({
13598
13698
  };
13599
13699
  var CanvasImageWithPrivateProps = CanvasImage;
13600
13700
  var imgSchema = {
13601
- durationInFrames: durationInFramesField,
13602
- from: fromField,
13603
- freeze: freezeField,
13604
- ...sequenceVisualStyleSchema,
13605
- hidden: hiddenField
13701
+ ...baseSchema,
13702
+ ...transformSchema
13606
13703
  };
13607
13704
  var imgCanvasFallbackIncompatibleProps = new Set([
13608
13705
  "alt",
@@ -13657,7 +13754,7 @@ var ImgInner = ({
13657
13754
  from,
13658
13755
  durationInFrames,
13659
13756
  freeze,
13660
- _experimentalControls: controls,
13757
+ controls,
13661
13758
  width,
13662
13759
  height,
13663
13760
  className,
@@ -13682,7 +13779,7 @@ var ImgInner = ({
13682
13779
  from,
13683
13780
  durationInFrames,
13684
13781
  freeze,
13685
- _experimentalControls: controls,
13782
+ controls,
13686
13783
  width,
13687
13784
  height,
13688
13785
  className,
@@ -13692,7 +13789,7 @@ var ImgInner = ({
13692
13789
  maxRetries,
13693
13790
  delayRenderRetries,
13694
13791
  delayRenderTimeoutInMilliseconds,
13695
- _remotionInternalRefForOutline: refForOutline
13792
+ outlineRef: refForOutline
13696
13793
  });
13697
13794
  }
13698
13795
  if (!src) {
@@ -13729,12 +13826,12 @@ var ImgInner = ({
13729
13826
  showInTimeline,
13730
13827
  stack,
13731
13828
  _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/img",
13732
- _experimentalControls: controls,
13733
- _remotionInternalRefForOutline: refForOutline,
13829
+ controls,
13830
+ outlineRef: refForOutline,
13734
13831
  ...canvasProps
13735
13832
  });
13736
13833
  };
13737
- var Img = wrapInSchema({
13834
+ var Img = withInteractivitySchema({
13738
13835
  Component: ImgInner,
13739
13836
  componentIdentity: "dev.remotion.remotion.Img",
13740
13837
  schema: imgSchema,
@@ -13742,11 +13839,8 @@ var Img = wrapInSchema({
13742
13839
  });
13743
13840
  addSequenceStackTraces(Img);
13744
13841
  var interactiveElementSchema = {
13745
- durationInFrames: durationInFramesField,
13746
- from: fromField,
13747
- freeze: freezeField,
13748
- ...sequenceVisualStyleSchema,
13749
- hidden: hiddenField
13842
+ ...baseSchema,
13843
+ ...transformSchema
13750
13844
  };
13751
13845
  var setRef = (ref, value) => {
13752
13846
  if (typeof ref === "function") {
@@ -13765,7 +13859,7 @@ var makeInteractiveElement = (tag, displayName) => {
13765
13859
  name,
13766
13860
  showInTimeline,
13767
13861
  stack,
13768
- _experimentalControls,
13862
+ controls,
13769
13863
  ...props2
13770
13864
  } = propsWithControls;
13771
13865
  const refForOutline = useRef25(null);
@@ -13781,10 +13875,10 @@ var makeInteractiveElement = (tag, displayName) => {
13781
13875
  hidden,
13782
13876
  name: name ?? displayName,
13783
13877
  showInTimeline: showInTimeline ?? true,
13784
- _experimentalControls,
13878
+ controls,
13785
13879
  _remotionInternalStack: stack,
13786
13880
  _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/interactive",
13787
- _remotionInternalRefForOutline: refForOutline,
13881
+ outlineRef: refForOutline,
13788
13882
  children: React29.createElement(tag, {
13789
13883
  ...props2,
13790
13884
  ref: callbackRef
@@ -13792,7 +13886,7 @@ var makeInteractiveElement = (tag, displayName) => {
13792
13886
  });
13793
13887
  });
13794
13888
  Inner.displayName = displayName;
13795
- const Wrapped = wrapInSchema({
13889
+ const Wrapped = withInteractivitySchema({
13796
13890
  Component: Inner,
13797
13891
  componentIdentity: `dev.remotion.remotion.${displayName.slice(1, -1)}`,
13798
13892
  schema: interactiveElementSchema,
@@ -13803,6 +13897,11 @@ var makeInteractiveElement = (tag, displayName) => {
13803
13897
  return Wrapped;
13804
13898
  };
13805
13899
  var Interactive = {
13900
+ baseSchema,
13901
+ transformSchema,
13902
+ premountSchema,
13903
+ sequenceSchema,
13904
+ withSchema: withInteractivitySchema,
13806
13905
  A: makeInteractiveElement("a", "<Interactive.A>"),
13807
13906
  Article: makeInteractiveElement("article", "<Interactive.Article>"),
13808
13907
  Aside: makeInteractiveElement("aside", "<Interactive.Aside>"),
@@ -13984,36 +14083,6 @@ var makeDefaultPreviewCSS = (scope, backgroundColor) => {
13984
14083
  }
13985
14084
  `;
13986
14085
  };
13987
- var disabledEffectField = {
13988
- type: "boolean",
13989
- default: false,
13990
- description: "Disabled"
13991
- };
13992
- var createEffect = (definition) => {
13993
- const { calculateKey: userCalculateKey, validateParams } = definition;
13994
- const widened = {
13995
- ...definition,
13996
- documentationLink: definition.documentationLink ?? null,
13997
- calculateKey: (params) => {
13998
- const disabled = params.disabled ?? false;
13999
- return `${userCalculateKey(params)}-disabled-${disabled}`;
14000
- },
14001
- schema: {
14002
- disabled: disabledEffectField,
14003
- ...definition.schema
14004
- }
14005
- };
14006
- const factory = (params = {}) => {
14007
- validateParams(params);
14008
- return {
14009
- definition: widened,
14010
- params,
14011
- effectKey: widened.calculateKey(params),
14012
- memoized: false
14013
- };
14014
- };
14015
- return factory;
14016
- };
14017
14086
  var REMOTION_STUDIO_CONTAINER_ELEMENT = "__remotion-studio-container";
14018
14087
  var getPreviewDomElement = () => {
14019
14088
  return document.getElementById(REMOTION_STUDIO_CONTAINER_ELEMENT);
@@ -15100,12 +15169,14 @@ var Internals = {
15100
15169
  SequenceManager,
15101
15170
  SequenceManagerRefContext,
15102
15171
  SequenceStackTracesUpdateContext,
15103
- wrapInSchema,
15172
+ baseSchema,
15104
15173
  sequenceSchema,
15105
15174
  SequenceWithoutSchema,
15106
15175
  sequenceStyleSchema,
15107
15176
  sequenceVisualStyleSchema,
15108
15177
  sequencePremountSchema,
15178
+ transformSchema,
15179
+ premountSchema,
15109
15180
  flattenActiveSchema,
15110
15181
  getFlatSchemaWithAllKeys,
15111
15182
  RemotionRootContexts,
@@ -15305,7 +15376,7 @@ var SeriesInner = (props2) => {
15305
15376
  })
15306
15377
  });
15307
15378
  };
15308
- var Series = Object.assign(wrapInSchema({
15379
+ var Series = Object.assign(withInteractivitySchema({
15309
15380
  Component: SeriesInner,
15310
15381
  componentIdentity: "dev.remotion.remotion.Series",
15311
15382
  schema: sequenceSchemaDefaultLayoutNone,
@@ -15895,6 +15966,7 @@ import { jsx as jsx82 } from "react/jsx-runtime";
15895
15966
  import { jsx as jsx92 } from "react/jsx-runtime";
15896
15967
  import { jsx as jsx102 } from "react/jsx-runtime";
15897
15968
  import { jsx as jsx112 } from "react/jsx-runtime";
15969
+ import { jsx as jsx122 } from "react/jsx-runtime";
15898
15970
  var unitDir = (from, to) => {
15899
15971
  const dx = to[0] - from[0];
15900
15972
  const dy = to[1] - from[1];
@@ -16038,6 +16110,7 @@ var doesReactSupportTransformOriginProperty = (version2) => {
16038
16110
  const [major] = version2.split(".").map(Number);
16039
16111
  return major > 18;
16040
16112
  };
16113
+ var HtmlInCanvasWithPrivateProps = HtmlInCanvas;
16041
16114
  var RenderSvg = ({
16042
16115
  defaultName,
16043
16116
  documentationLink,
@@ -16057,7 +16130,7 @@ var RenderSvg = ({
16057
16130
  hidden,
16058
16131
  name,
16059
16132
  showInTimeline,
16060
- _experimentalControls: controls,
16133
+ controls,
16061
16134
  stack,
16062
16135
  ...props
16063
16136
  }) => {
@@ -16144,7 +16217,7 @@ var RenderSvg = ({
16144
16217
  }) : null
16145
16218
  ]
16146
16219
  });
16147
- const content = effects.length === 0 ? svg : /* @__PURE__ */ jsx40(HtmlInCanvas, {
16220
+ const content = effects.length === 0 ? svg : /* @__PURE__ */ jsx40(HtmlInCanvasWithPrivateProps, {
16148
16221
  ref: setCanvasRef,
16149
16222
  width: Math.ceil(width),
16150
16223
  height: Math.ceil(height),
@@ -16152,7 +16225,7 @@ var RenderSvg = ({
16152
16225
  pixelDensity,
16153
16226
  showInTimeline: false,
16154
16227
  style: actualStyle,
16155
- _experimentalControls: controls,
16228
+ controls,
16156
16229
  children: svg
16157
16230
  });
16158
16231
  const stackProps = stack === undefined ? null : { stack };
@@ -16165,11 +16238,11 @@ var RenderSvg = ({
16165
16238
  freeze,
16166
16239
  hidden,
16167
16240
  showInTimeline,
16168
- _experimentalControls: controls,
16241
+ controls,
16169
16242
  _remotionInternalEffects: memoizedEffectDefinitions,
16170
16243
  durationInFrames,
16171
16244
  name: name ?? defaultName,
16172
- _remotionInternalRefForOutline: outlineRef,
16245
+ outlineRef,
16173
16246
  _remotionInternalDocumentationLink: name === undefined ? documentationLink : undefined,
16174
16247
  ...stackProps,
16175
16248
  children: content
@@ -16227,16 +16300,13 @@ var enumField = ({
16227
16300
  };
16228
16301
  var makeShapeSchema = (shapeFields) => {
16229
16302
  return {
16230
- from: Internals.sequenceSchema.from,
16231
- freeze: Internals.sequenceSchema.freeze,
16232
- durationInFrames: Internals.sequenceSchema.durationInFrames,
16303
+ ...Internals.baseSchema,
16233
16304
  ...shapeFields,
16234
16305
  fill: colorField({
16235
16306
  defaultValue: "#0b84ff",
16236
16307
  description: "Fill"
16237
16308
  }),
16238
- ...Internals.sequenceVisualStyleSchema,
16239
- hidden: Internals.sequenceSchema.hidden
16309
+ ...Internals.transformSchema
16240
16310
  };
16241
16311
  };
16242
16312
  var arrowSchema = makeShapeSchema({
@@ -16294,7 +16364,7 @@ var ArrowInner = ({
16294
16364
  ...props
16295
16365
  });
16296
16366
  };
16297
- var Arrow = Internals.wrapInSchema({
16367
+ var Arrow = Interactive.withSchema({
16298
16368
  Component: ArrowInner,
16299
16369
  componentIdentity: "dev.remotion.shapes.Arrow",
16300
16370
  schema: arrowSchema,
@@ -16718,7 +16788,7 @@ var CalloutInner = ({
16718
16788
  ...props
16719
16789
  });
16720
16790
  };
16721
- var Callout = Internals.wrapInSchema({
16791
+ var Callout = Interactive.withSchema({
16722
16792
  Component: CalloutInner,
16723
16793
  componentIdentity: "dev.remotion.shapes.Callout",
16724
16794
  schema: calloutSchema,
@@ -16780,7 +16850,7 @@ var CircleInner = ({ radius, ...props }) => {
16780
16850
  ...props
16781
16851
  });
16782
16852
  };
16783
- var Circle = Internals.wrapInSchema({
16853
+ var Circle = Interactive.withSchema({
16784
16854
  Component: CircleInner,
16785
16855
  componentIdentity: "dev.remotion.shapes.Circle",
16786
16856
  schema: circleSchema,
@@ -16837,7 +16907,7 @@ var EllipseInner = ({ rx, ry, ...props }) => {
16837
16907
  ...props
16838
16908
  });
16839
16909
  };
16840
- var Ellipse = Internals.wrapInSchema({
16910
+ var Ellipse = Interactive.withSchema({
16841
16911
  Component: EllipseInner,
16842
16912
  componentIdentity: "dev.remotion.shapes.Ellipse",
16843
16913
  schema: ellipseSchema,
@@ -16975,7 +17045,7 @@ var HeartInner = ({
16975
17045
  ...props
16976
17046
  });
16977
17047
  };
16978
- var Heart = Internals.wrapInSchema({
17048
+ var Heart = Interactive.withSchema({
16979
17049
  Component: HeartInner,
16980
17050
  componentIdentity: "dev.remotion.shapes.Heart",
16981
17051
  schema: heartSchema,
@@ -17129,7 +17199,7 @@ var PieInner = ({
17129
17199
  ...props
17130
17200
  });
17131
17201
  };
17132
- var Pie = Internals.wrapInSchema({
17202
+ var Pie = Interactive.withSchema({
17133
17203
  Component: PieInner,
17134
17204
  componentIdentity: "dev.remotion.shapes.Pie",
17135
17205
  schema: pieSchema,
@@ -17228,7 +17298,7 @@ var PolygonInner = ({
17228
17298
  ...props
17229
17299
  });
17230
17300
  };
17231
- var Polygon = Internals.wrapInSchema({
17301
+ var Polygon = Interactive.withSchema({
17232
17302
  Component: PolygonInner,
17233
17303
  componentIdentity: "dev.remotion.shapes.Polygon",
17234
17304
  schema: polygonSchema,
@@ -17294,13 +17364,224 @@ var RectInner = ({
17294
17364
  ...props
17295
17365
  });
17296
17366
  };
17297
- var Rect = Internals.wrapInSchema({
17367
+ var Rect = Interactive.withSchema({
17298
17368
  Component: RectInner,
17299
17369
  componentIdentity: "dev.remotion.shapes.Rect",
17300
17370
  schema: rectSchema,
17301
17371
  supportsEffects: true
17302
17372
  });
17303
17373
  Internals.addSequenceStackTraces(Rect);
17374
+ var KAPPA = 0.5522847498307936;
17375
+ var CAP_HANDLE = 4 / 3;
17376
+ var curve = ({
17377
+ to,
17378
+ cp1,
17379
+ cp2
17380
+ }) => {
17381
+ return {
17382
+ type: "C",
17383
+ cp1x: cp1[0],
17384
+ cp1y: cp1[1],
17385
+ cp2x: cp2[0],
17386
+ cp2y: cp2[1],
17387
+ x: to[0],
17388
+ y: to[1]
17389
+ };
17390
+ };
17391
+ var cap = ({
17392
+ from,
17393
+ to,
17394
+ radius,
17395
+ direction
17396
+ }) => {
17397
+ if (direction === "top") {
17398
+ return curve({
17399
+ to,
17400
+ cp1: [from[0], from[1] - radius * CAP_HANDLE],
17401
+ cp2: [to[0], to[1] - radius * CAP_HANDLE]
17402
+ });
17403
+ }
17404
+ if (direction === "right") {
17405
+ return curve({
17406
+ to,
17407
+ cp1: [from[0] + radius * CAP_HANDLE, from[1]],
17408
+ cp2: [to[0] + radius * CAP_HANDLE, to[1]]
17409
+ });
17410
+ }
17411
+ if (direction === "bottom") {
17412
+ return curve({
17413
+ to,
17414
+ cp1: [from[0], from[1] + radius * CAP_HANDLE],
17415
+ cp2: [to[0], to[1] + radius * CAP_HANDLE]
17416
+ });
17417
+ }
17418
+ return curve({
17419
+ to,
17420
+ cp1: [from[0] - radius * CAP_HANDLE, from[1]],
17421
+ cp2: [to[0] - radius * CAP_HANDLE, to[1]]
17422
+ });
17423
+ };
17424
+ var edge = ({
17425
+ from,
17426
+ to,
17427
+ edgeRoundness,
17428
+ direction
17429
+ }) => {
17430
+ const dx = to[0] - from[0];
17431
+ const dy = to[1] - from[1];
17432
+ const handleX = Math.abs(dx) * KAPPA * edgeRoundness;
17433
+ const handleY = Math.abs(dy) * KAPPA * edgeRoundness;
17434
+ if (direction === "top-right") {
17435
+ return curve({
17436
+ to,
17437
+ cp1: [from[0], from[1] + handleY],
17438
+ cp2: [to[0] - handleX, to[1]]
17439
+ });
17440
+ }
17441
+ if (direction === "right-bottom") {
17442
+ return curve({
17443
+ to,
17444
+ cp1: [from[0] - handleX, from[1]],
17445
+ cp2: [to[0], to[1] - handleY]
17446
+ });
17447
+ }
17448
+ if (direction === "bottom-left") {
17449
+ return curve({
17450
+ to,
17451
+ cp1: [from[0], from[1] - handleY],
17452
+ cp2: [to[0] + handleX, to[1]]
17453
+ });
17454
+ }
17455
+ return curve({
17456
+ to,
17457
+ cp1: [from[0] + handleX, from[1]],
17458
+ cp2: [to[0], to[1] + handleY]
17459
+ });
17460
+ };
17461
+ var clampCornerRadius = ({
17462
+ cornerRadius,
17463
+ width,
17464
+ height
17465
+ }) => {
17466
+ return Math.min(Math.max(cornerRadius, 0), width / 2, height / 2);
17467
+ };
17468
+ var makeSpark = ({
17469
+ width,
17470
+ height,
17471
+ edgeRoundness = 1,
17472
+ cornerRadius = 0
17473
+ }) => {
17474
+ const centerX = width / 2;
17475
+ const centerY = height / 2;
17476
+ const radius = clampCornerRadius({ cornerRadius, width, height });
17477
+ const top = [centerX, 0];
17478
+ const right = [width, centerY];
17479
+ const bottom = [centerX, height];
17480
+ const left = [0, centerY];
17481
+ const topRight = radius === 0 ? top : [centerX + radius, radius];
17482
+ const rightTop = radius === 0 ? right : [width - radius, centerY - radius];
17483
+ const rightBottom = radius === 0 ? right : [width - radius, centerY + radius];
17484
+ const bottomRight = radius === 0 ? bottom : [centerX + radius, height - radius];
17485
+ const bottomLeft = radius === 0 ? bottom : [centerX - radius, height - radius];
17486
+ const leftBottom = radius === 0 ? left : [radius, centerY + radius];
17487
+ const leftTop = radius === 0 ? left : [radius, centerY - radius];
17488
+ const topLeft = radius === 0 ? top : [centerX - radius, radius];
17489
+ const instructions = [
17490
+ {
17491
+ type: "M",
17492
+ x: topRight[0],
17493
+ y: topRight[1]
17494
+ },
17495
+ edge({
17496
+ from: topRight,
17497
+ to: rightTop,
17498
+ edgeRoundness,
17499
+ direction: "top-right"
17500
+ })
17501
+ ];
17502
+ if (radius > 0) {
17503
+ instructions.push(cap({ from: rightTop, to: rightBottom, radius, direction: "right" }));
17504
+ }
17505
+ instructions.push(edge({
17506
+ from: rightBottom,
17507
+ to: bottomRight,
17508
+ edgeRoundness,
17509
+ direction: "right-bottom"
17510
+ }));
17511
+ if (radius > 0) {
17512
+ instructions.push(cap({ from: bottomRight, to: bottomLeft, radius, direction: "bottom" }));
17513
+ }
17514
+ instructions.push(edge({
17515
+ from: bottomLeft,
17516
+ to: leftBottom,
17517
+ edgeRoundness,
17518
+ direction: "bottom-left"
17519
+ }));
17520
+ if (radius > 0) {
17521
+ instructions.push(cap({ from: leftBottom, to: leftTop, radius, direction: "left" }));
17522
+ }
17523
+ instructions.push(edge({
17524
+ from: leftTop,
17525
+ to: topLeft,
17526
+ edgeRoundness,
17527
+ direction: "left-top"
17528
+ }));
17529
+ if (radius > 0) {
17530
+ instructions.push(cap({ from: topLeft, to: topRight, radius, direction: "top" }));
17531
+ }
17532
+ instructions.push({ type: "Z" });
17533
+ return {
17534
+ path: serializeInstructions(instructions),
17535
+ width,
17536
+ height,
17537
+ transformOrigin: `${centerX} ${centerY}`,
17538
+ instructions
17539
+ };
17540
+ };
17541
+ var sparkSchema = makeShapeSchema({
17542
+ width: numberField({
17543
+ defaultValue: 100,
17544
+ description: "Width",
17545
+ min: 0
17546
+ }),
17547
+ height: numberField({
17548
+ defaultValue: 140,
17549
+ description: "Height",
17550
+ min: 0
17551
+ }),
17552
+ edgeRoundness: numberField({
17553
+ defaultValue: 1,
17554
+ description: "Edge Roundness",
17555
+ min: 0,
17556
+ step: 0.01
17557
+ }),
17558
+ cornerRadius: numberField({
17559
+ defaultValue: 0,
17560
+ description: "Corner Radius",
17561
+ min: 0
17562
+ })
17563
+ });
17564
+ var SparkInner = ({
17565
+ width,
17566
+ height,
17567
+ edgeRoundness,
17568
+ cornerRadius,
17569
+ ...props
17570
+ }) => {
17571
+ return /* @__PURE__ */ jsx102(RenderSvg, {
17572
+ defaultName: "<Spark>",
17573
+ documentationLink: "https://www.remotion.dev/docs/shapes/spark",
17574
+ ...makeSpark({ width, height, edgeRoundness, cornerRadius }),
17575
+ ...props
17576
+ });
17577
+ };
17578
+ var Spark = Interactive.withSchema({
17579
+ Component: SparkInner,
17580
+ componentIdentity: "dev.remotion.shapes.Spark",
17581
+ schema: sparkSchema,
17582
+ supportsEffects: true
17583
+ });
17584
+ Internals.addSequenceStackTraces(Spark);
17304
17585
  var star = ({
17305
17586
  centerX,
17306
17587
  centerY,
@@ -17391,7 +17672,7 @@ var StarInner = ({
17391
17672
  edgeRoundness,
17392
17673
  ...props
17393
17674
  }) => {
17394
- return /* @__PURE__ */ jsx102(RenderSvg, {
17675
+ return /* @__PURE__ */ jsx112(RenderSvg, {
17395
17676
  defaultName: "<Star>",
17396
17677
  documentationLink: "https://www.remotion.dev/docs/shapes/star",
17397
17678
  ...makeStar({
@@ -17404,7 +17685,7 @@ var StarInner = ({
17404
17685
  ...props
17405
17686
  });
17406
17687
  };
17407
- var Star = Internals.wrapInSchema({
17688
+ var Star = Interactive.withSchema({
17408
17689
  Component: StarInner,
17409
17690
  componentIdentity: "dev.remotion.shapes.Star",
17410
17691
  schema: starSchema,
@@ -17503,14 +17784,14 @@ var TriangleInner = ({
17503
17784
  cornerRadius,
17504
17785
  ...props
17505
17786
  }) => {
17506
- return /* @__PURE__ */ jsx112(RenderSvg, {
17787
+ return /* @__PURE__ */ jsx122(RenderSvg, {
17507
17788
  defaultName: "<Triangle>",
17508
17789
  documentationLink: "https://www.remotion.dev/docs/shapes/triangle",
17509
17790
  ...makeTriangle({ length: length2, direction, edgeRoundness, cornerRadius }),
17510
17791
  ...props
17511
17792
  });
17512
17793
  };
17513
- var Triangle = Internals.wrapInSchema({
17794
+ var Triangle = Interactive.withSchema({
17514
17795
  Component: TriangleInner,
17515
17796
  componentIdentity: "dev.remotion.shapes.Triangle",
17516
17797
  schema: triangleSchema,
@@ -17976,18 +18257,18 @@ function arcToCircle2({
17976
18257
  result.push(approximate_unit_arc2(theta1, delta_theta));
17977
18258
  theta1 += delta_theta;
17978
18259
  }
17979
- return result.map((curve) => {
17980
- for (let i = 0;i < curve.length; i += 2) {
17981
- let x = curve[i + 0];
17982
- let y = curve[i + 1];
18260
+ return result.map((curve2) => {
18261
+ for (let i = 0;i < curve2.length; i += 2) {
18262
+ let x = curve2[i + 0];
18263
+ let y = curve2[i + 1];
17983
18264
  x *= rx;
17984
18265
  y *= ry;
17985
18266
  const xp = cos_phi * x - sin_phi * y;
17986
18267
  const yp = sin_phi * x + cos_phi * y;
17987
- curve[i + 0] = xp + cc[0];
17988
- curve[i + 1] = yp + cc[1];
18268
+ curve2[i + 0] = xp + cc[0];
18269
+ curve2[i + 1] = yp + cc[1];
17989
18270
  }
17990
- return curve;
18271
+ return curve2;
17991
18272
  });
17992
18273
  }
17993
18274
  var removeATSHVQInstructions2 = (segments) => {
@@ -18594,7 +18875,7 @@ import { jsx as jsx93 } from "react/jsx-runtime";
18594
18875
  import React72 from "react";
18595
18876
  import { jsx as jsx103 } from "react/jsx-runtime";
18596
18877
  import { jsx as jsx113 } from "react/jsx-runtime";
18597
- import { jsx as jsx122 } from "react/jsx-runtime";
18878
+ import { jsx as jsx123 } from "react/jsx-runtime";
18598
18879
  import * as React36 from "react";
18599
18880
  import * as ReactDOM4 from "react-dom";
18600
18881
  import React112 from "react";
@@ -19408,11 +19689,11 @@ var Link = ({
19408
19689
  });
19409
19690
  };
19410
19691
  var PlanePaperIcon = (props) => {
19411
- return /* @__PURE__ */ jsx122("svg", {
19692
+ return /* @__PURE__ */ jsx123("svg", {
19412
19693
  xmlns: "http://www.w3.org/2000/svg",
19413
19694
  ...props,
19414
19695
  viewBox: "0 0 576 512",
19415
- children: /* @__PURE__ */ jsx122("path", {
19696
+ children: /* @__PURE__ */ jsx123("path", {
19416
19697
  fill: "currentcolor",
19417
19698
  d: "M169.9 280L94.9 448.6 461.2 280 169.9 280zm291.3-48L94.9 63.4 169.9 232 461.2 232zM34.8 465.6L128 256 34.8 46.4C33 42.2 32 37.6 32 33 32 14.8 46.7 0 64.8 0 69.5 0 74.2 1 78.5 3L554.2 222c13.3 6.1 21.8 19.4 21.8 34s-8.5 27.9-21.8 34L78.5 509c-4.3 2-9 3-13.7 3-18.1 0-32.8-14.8-32.8-33 0-4.6 1-9.2 2.8-13.4z"
19418
19699
  })
@@ -25481,7 +25762,7 @@ var TrustSection = () => {
25481
25762
  }),
25482
25763
  /* @__PURE__ */ jsx46("div", {
25483
25764
  className: "font-brand",
25484
- children: "Us founders own the company. And we just want one thing: Make programmatic video glorious."
25765
+ children: "We, the founders, own the company. And we just want one thing: Make programmatic video glorious."
25485
25766
  })
25486
25767
  ]
25487
25768
  })
@@ -25547,11 +25828,11 @@ var TrustSection = () => {
25547
25828
  }),
25548
25829
  /* @__PURE__ */ jsx46("div", {
25549
25830
  className: "font-brand font-bold text-2xl mb-2",
25550
- children: "200+ customers"
25831
+ children: "300+ customers"
25551
25832
  }),
25552
25833
  /* @__PURE__ */ jsx46("div", {
25553
25834
  className: "font-brand",
25554
- children: "More than 200 companies trust Remotion, from small businesses to FAANG."
25835
+ children: "More than 300 companies trust Remotion, from small businesses to FAANG."
25555
25836
  })
25556
25837
  ]
25557
25838
  })
@@ -25589,7 +25870,7 @@ var TrustSection = () => {
25589
25870
  }),
25590
25871
  /* @__PURE__ */ jsx46("div", {
25591
25872
  className: "font-brand font-bold text-2xl mb-2",
25592
- children: "1M+ videos/month"
25873
+ children: "2M+ videos/month"
25593
25874
  }),
25594
25875
  /* @__PURE__ */ jsx46("div", {
25595
25876
  className: "font-brand",
@@ -25606,7 +25887,7 @@ var TrustSection = () => {
25606
25887
  }),
25607
25888
  /* @__PURE__ */ jsx46("div", {
25608
25889
  className: "font-brand font-bold text-2xl mb-2",
25609
- children: "40,000+ GitHub stars"
25890
+ children: "50,000+ GitHub stars"
25610
25891
  }),
25611
25892
  /* @__PURE__ */ jsx46("div", {
25612
25893
  className: "font-brand",