@remotion/promo-pages 4.0.485 → 4.0.487

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
@@ -1559,7 +1559,7 @@ var getDefaultConfig = () => {
1559
1559
  var twMerge = /* @__PURE__ */ createTailwindMerge(getDefaultConfig);
1560
1560
 
1561
1561
  // ../design/dist/esm/index.mjs
1562
- import React32, { useEffect as useEffect22, useMemo as useMemo42, useState as useState21 } from "react";
1562
+ import React32, { useEffect as useEffect21, useMemo as useMemo42, useState as useState21 } from "react";
1563
1563
 
1564
1564
  // ../paths/dist/esm/index.mjs
1565
1565
  var cutLInstruction = ({
@@ -3665,6 +3665,94 @@ var getBoundingBox = (d) => {
3665
3665
  const unarced = removeATSHVQInstructions(normalizeInstructions(parsed));
3666
3666
  return getBoundingBoxFromInstructions(unarced);
3667
3667
  };
3668
+ var translateSegments = (segments, x, y) => {
3669
+ return segments.map((segment) => {
3670
+ if (segment.type === "a" || segment.type === "c" || segment.type === "v" || segment.type === "s" || segment.type === "h" || segment.type === "l" || segment.type === "m" || segment.type === "q" || segment.type === "t") {
3671
+ return segment;
3672
+ }
3673
+ if (segment.type === "V") {
3674
+ return {
3675
+ type: "V",
3676
+ y: segment.y + y
3677
+ };
3678
+ }
3679
+ if (segment.type === "H") {
3680
+ return {
3681
+ type: "H",
3682
+ x: segment.x + x
3683
+ };
3684
+ }
3685
+ if (segment.type === "A") {
3686
+ return {
3687
+ type: "A",
3688
+ rx: segment.rx,
3689
+ ry: segment.ry,
3690
+ largeArcFlag: segment.largeArcFlag,
3691
+ sweepFlag: segment.sweepFlag,
3692
+ xAxisRotation: segment.xAxisRotation,
3693
+ x: segment.x + x,
3694
+ y: segment.y + y
3695
+ };
3696
+ }
3697
+ if (segment.type === "Z") {
3698
+ return segment;
3699
+ }
3700
+ if (segment.type === "C") {
3701
+ return {
3702
+ type: "C",
3703
+ cp1x: segment.cp1x + x,
3704
+ cp1y: segment.cp1y + y,
3705
+ cp2x: segment.cp2x + x,
3706
+ cp2y: segment.cp2y + y,
3707
+ x: segment.x + x,
3708
+ y: segment.y + y
3709
+ };
3710
+ }
3711
+ if (segment.type === "Q") {
3712
+ return {
3713
+ type: "Q",
3714
+ cpx: segment.cpx + x,
3715
+ cpy: segment.cpy + y,
3716
+ x: segment.x + x,
3717
+ y: segment.y + y
3718
+ };
3719
+ }
3720
+ if (segment.type === "S") {
3721
+ return {
3722
+ type: "S",
3723
+ cpx: segment.cpx + x,
3724
+ cpy: segment.cpy + y,
3725
+ x: segment.x + x,
3726
+ y: segment.y + y
3727
+ };
3728
+ }
3729
+ if (segment.type === "T") {
3730
+ return {
3731
+ type: "T",
3732
+ x: segment.x + x,
3733
+ y: segment.y + y
3734
+ };
3735
+ }
3736
+ if (segment.type === "L") {
3737
+ return {
3738
+ type: "L",
3739
+ x: segment.x + x,
3740
+ y: segment.y + y
3741
+ };
3742
+ }
3743
+ if (segment.type === "M") {
3744
+ return {
3745
+ type: "M",
3746
+ x: segment.x + x,
3747
+ y: segment.y + y
3748
+ };
3749
+ }
3750
+ throw new Error(`Unknown segment type: ${segment.type}`);
3751
+ });
3752
+ };
3753
+ var translatePath = (path, x, y) => {
3754
+ return serializeInstructions(translateSegments(parsePath(path), x, y));
3755
+ };
3668
3756
  var mod = (x, m) => {
3669
3757
  return (x % m + m) % m;
3670
3758
  };
@@ -4226,94 +4314,6 @@ var getLength = (path) => {
4226
4314
  const constructucted = construct(path);
4227
4315
  return constructucted.totalLength;
4228
4316
  };
4229
- var translateSegments = (segments, x, y) => {
4230
- return segments.map((segment) => {
4231
- if (segment.type === "a" || segment.type === "c" || segment.type === "v" || segment.type === "s" || segment.type === "h" || segment.type === "l" || segment.type === "m" || segment.type === "q" || segment.type === "t") {
4232
- return segment;
4233
- }
4234
- if (segment.type === "V") {
4235
- return {
4236
- type: "V",
4237
- y: segment.y + y
4238
- };
4239
- }
4240
- if (segment.type === "H") {
4241
- return {
4242
- type: "H",
4243
- x: segment.x + x
4244
- };
4245
- }
4246
- if (segment.type === "A") {
4247
- return {
4248
- type: "A",
4249
- rx: segment.rx,
4250
- ry: segment.ry,
4251
- largeArcFlag: segment.largeArcFlag,
4252
- sweepFlag: segment.sweepFlag,
4253
- xAxisRotation: segment.xAxisRotation,
4254
- x: segment.x + x,
4255
- y: segment.y + y
4256
- };
4257
- }
4258
- if (segment.type === "Z") {
4259
- return segment;
4260
- }
4261
- if (segment.type === "C") {
4262
- return {
4263
- type: "C",
4264
- cp1x: segment.cp1x + x,
4265
- cp1y: segment.cp1y + y,
4266
- cp2x: segment.cp2x + x,
4267
- cp2y: segment.cp2y + y,
4268
- x: segment.x + x,
4269
- y: segment.y + y
4270
- };
4271
- }
4272
- if (segment.type === "Q") {
4273
- return {
4274
- type: "Q",
4275
- cpx: segment.cpx + x,
4276
- cpy: segment.cpy + y,
4277
- x: segment.x + x,
4278
- y: segment.y + y
4279
- };
4280
- }
4281
- if (segment.type === "S") {
4282
- return {
4283
- type: "S",
4284
- cpx: segment.cpx + x,
4285
- cpy: segment.cpy + y,
4286
- x: segment.x + x,
4287
- y: segment.y + y
4288
- };
4289
- }
4290
- if (segment.type === "T") {
4291
- return {
4292
- type: "T",
4293
- x: segment.x + x,
4294
- y: segment.y + y
4295
- };
4296
- }
4297
- if (segment.type === "L") {
4298
- return {
4299
- type: "L",
4300
- x: segment.x + x,
4301
- y: segment.y + y
4302
- };
4303
- }
4304
- if (segment.type === "M") {
4305
- return {
4306
- type: "M",
4307
- x: segment.x + x,
4308
- y: segment.y + y
4309
- };
4310
- }
4311
- throw new Error(`Unknown segment type: ${segment.type}`);
4312
- });
4313
- };
4314
- var translatePath = (path, x, y) => {
4315
- return serializeInstructions(translateSegments(parsePath(path), x, y));
4316
- };
4317
4317
  var resetPath = (d) => {
4318
4318
  const box = getBoundingBox(d);
4319
4319
  return translatePath(d, -box.x1, -box.y1);
@@ -4502,8 +4502,8 @@ import {
4502
4502
  forwardRef as forwardRef10,
4503
4503
  useCallback as useCallback17,
4504
4504
  useContext as useContext32,
4505
- useEffect as useEffect17,
4506
4505
  useImperativeHandle as useImperativeHandle7,
4506
+ useLayoutEffect as useLayoutEffect10,
4507
4507
  useMemo as useMemo31,
4508
4508
  useRef as useRef23,
4509
4509
  useState as useState16
@@ -4511,7 +4511,7 @@ import {
4511
4511
  import { jsx as jsx26 } from "react/jsx-runtime";
4512
4512
  import { forwardRef as forwardRef11, useCallback as useCallback18, useState as useState17 } from "react";
4513
4513
  import { jsx as jsx27 } from "react/jsx-runtime";
4514
- import { useCallback as useCallback19, useContext as useContext33, useLayoutEffect as useLayoutEffect10, useRef as useRef24 } from "react";
4514
+ import { useCallback as useCallback19, useContext as useContext33, useLayoutEffect as useLayoutEffect11, useRef as useRef24 } from "react";
4515
4515
  import { jsx as jsx28 } from "react/jsx-runtime";
4516
4516
  import React29, { forwardRef as forwardRef12, useCallback as useCallback20, useRef as useRef25 } from "react";
4517
4517
  import { jsx as jsx29 } from "react/jsx-runtime";
@@ -4537,8 +4537,8 @@ import { useCallback as useCallback24 } from "react";
4537
4537
  import {
4538
4538
  useCallback as useCallback22,
4539
4539
  useContext as useContext36,
4540
- useEffect as useEffect18,
4541
- useLayoutEffect as useLayoutEffect11,
4540
+ useEffect as useEffect17,
4541
+ useLayoutEffect as useLayoutEffect12,
4542
4542
  useMemo as useMemo35,
4543
4543
  useState as useState19
4544
4544
  } from "react";
@@ -4547,13 +4547,13 @@ import React37, {
4547
4547
  forwardRef as forwardRef13,
4548
4548
  useCallback as useCallback23,
4549
4549
  useContext as useContext37,
4550
- useEffect as useEffect20,
4550
+ useEffect as useEffect19,
4551
4551
  useImperativeHandle as useImperativeHandle9,
4552
4552
  useMemo as useMemo36,
4553
4553
  useRef as useRef27,
4554
4554
  useState as useState20
4555
4555
  } from "react";
4556
- import { useEffect as useEffect19 } from "react";
4556
+ import { useEffect as useEffect18 } from "react";
4557
4557
  import { jsx as jsx34 } from "react/jsx-runtime";
4558
4558
  import { jsx as jsx35 } from "react/jsx-runtime";
4559
4559
  import React39, { useMemo as useMemo37 } from "react";
@@ -4570,9 +4570,9 @@ import { forwardRef as forwardRef16, useCallback as useCallback25, useContext as
4570
4570
  import {
4571
4571
  forwardRef as forwardRef15,
4572
4572
  useContext as useContext38,
4573
- useEffect as useEffect21,
4573
+ useEffect as useEffect20,
4574
4574
  useImperativeHandle as useImperativeHandle10,
4575
- useLayoutEffect as useLayoutEffect12,
4575
+ useLayoutEffect as useLayoutEffect13,
4576
4576
  useMemo as useMemo39,
4577
4577
  useRef as useRef28
4578
4578
  } from "react";
@@ -5746,7 +5746,7 @@ var getComponentsToAddStacksTo = () => componentsToAddStacksTo;
5746
5746
  var addSequenceStackTraces = (component) => {
5747
5747
  componentsToAddStacksTo.push(component);
5748
5748
  };
5749
- var VERSION = "4.0.485";
5749
+ var VERSION = "4.0.487";
5750
5750
  var checkMultipleRemotionVersions = () => {
5751
5751
  if (typeof globalThis === "undefined") {
5752
5752
  return;
@@ -6152,6 +6152,12 @@ var textSchema = {
6152
6152
  default: undefined,
6153
6153
  description: "Color"
6154
6154
  },
6155
+ "style.fontFamily": {
6156
+ type: "font-family",
6157
+ default: undefined,
6158
+ description: "Font family",
6159
+ keyframable: false
6160
+ },
6155
6161
  "style.fontSize": {
6156
6162
  type: "number",
6157
6163
  default: undefined,
@@ -11610,7 +11616,8 @@ var useBufferManager = (logLevel, mountTime) => {
11610
11616
  if (rendering) {
11611
11617
  return;
11612
11618
  }
11613
- if (blocks.length > 0) {
11619
+ if (blocks.length > 0 && !buffering.current) {
11620
+ buffering.current = true;
11614
11621
  onBufferingCallbacks.forEach((c2) => c2());
11615
11622
  playbackLogging({
11616
11623
  logLevel,
@@ -11625,7 +11632,8 @@ var useBufferManager = (logLevel, mountTime) => {
11625
11632
  if (rendering) {
11626
11633
  return;
11627
11634
  }
11628
- if (blocks.length === 0) {
11635
+ if (blocks.length === 0 && buffering.current) {
11636
+ buffering.current = false;
11629
11637
  onResumeCallbacks.forEach((c2) => c2());
11630
11638
  playbackLogging({
11631
11639
  logLevel,
@@ -11658,15 +11666,11 @@ var useIsPlayerBuffering = (bufferManager) => {
11658
11666
  const onResume = () => {
11659
11667
  setIsBuffering(false);
11660
11668
  };
11661
- bufferManager.listenForBuffering(onBuffer);
11662
- bufferManager.listenForResume(onResume);
11669
+ const buffer = bufferManager.listenForBuffering(onBuffer);
11670
+ const resume = bufferManager.listenForResume(onResume);
11663
11671
  return () => {
11664
- bufferManager.listenForBuffering(() => {
11665
- return;
11666
- });
11667
- bufferManager.listenForResume(() => {
11668
- return;
11669
- });
11672
+ buffer.remove();
11673
+ resume.remove();
11670
11674
  };
11671
11675
  }, [bufferManager]);
11672
11676
  return isBuffering;
@@ -11790,6 +11794,72 @@ var useBufferUntilFirstFrame = ({
11790
11794
  };
11791
11795
  }, [bufferUntilFirstFrame]);
11792
11796
  };
11797
+ var getMediaSyncAction = (input) => {
11798
+ const {
11799
+ duration,
11800
+ currentTime,
11801
+ paused,
11802
+ ended,
11803
+ desiredUnclampedTime,
11804
+ mediaTagTime,
11805
+ mediaTagLastUpdate,
11806
+ rvcTime,
11807
+ rvcLastUpdate,
11808
+ isVariableFpsVideo,
11809
+ acceptableTimeShift,
11810
+ lastSeekDueToShift,
11811
+ playing,
11812
+ playbackRate,
11813
+ mediaTagBufferingOrStalled,
11814
+ playerBuffering,
11815
+ absoluteFrame,
11816
+ onlyWarnForMediaSeekingError,
11817
+ isPremounting,
11818
+ isPostmounting,
11819
+ pauseWhenBuffering
11820
+ } = input;
11821
+ const shouldBeTime = !Number.isNaN(duration) && Number.isFinite(duration) ? Math.min(duration, desiredUnclampedTime) : desiredUnclampedTime;
11822
+ const timeShiftMediaTag = Math.abs(shouldBeTime - mediaTagTime);
11823
+ const timeShiftRvcTag = rvcTime ? Math.abs(shouldBeTime - rvcTime) : null;
11824
+ const mostRecentTimeshift = rvcLastUpdate && rvcTime > mediaTagLastUpdate ? timeShiftRvcTag : timeShiftMediaTag;
11825
+ const timeShift = timeShiftRvcTag && !isVariableFpsVideo ? mostRecentTimeshift : timeShiftMediaTag;
11826
+ if (timeShift > acceptableTimeShift && lastSeekDueToShift !== shouldBeTime) {
11827
+ return {
11828
+ type: "seek-due-to-shift",
11829
+ shouldBeTime,
11830
+ why: `because time shift is too big. shouldBeTime = ${shouldBeTime}, isTime = ${mediaTagTime}, requestVideoCallbackTime = ${rvcTime}, timeShift = ${timeShift}${isVariableFpsVideo ? ", isVariableFpsVideo = true" : ""}, isPremounting = ${isPremounting}, isPostmounting = ${isPostmounting}, pauseWhenBuffering = ${pauseWhenBuffering}`,
11831
+ bufferUntilFirstFrame: playing && playbackRate > 0,
11832
+ playReason: playing && paused ? "player is playing but media tag is paused, and just seeked" : null,
11833
+ warnAboutNonSeekable: !onlyWarnForMediaSeekingError
11834
+ };
11835
+ }
11836
+ const seekThreshold = playing ? 0.15 : 0.01;
11837
+ const makesSenseToSeek = Math.abs(currentTime - shouldBeTime) > seekThreshold;
11838
+ const isSomethingElseBuffering = playerBuffering && !mediaTagBufferingOrStalled;
11839
+ if (!playing || isSomethingElseBuffering) {
11840
+ return {
11841
+ type: "seek-if-not-playing",
11842
+ shouldBeTime,
11843
+ why: makesSenseToSeek ? `not playing or something else is buffering. time offset is over seek threshold (${seekThreshold})` : null
11844
+ };
11845
+ }
11846
+ if (!playing || playerBuffering) {
11847
+ return { type: "none" };
11848
+ }
11849
+ const pausedCondition = paused && !ended;
11850
+ const firstFrameCondition = absoluteFrame === 0;
11851
+ if (pausedCondition || firstFrameCondition) {
11852
+ const reason = pausedCondition ? "media tag is paused" : "absolute frame is 0";
11853
+ return {
11854
+ type: "play-and-seek",
11855
+ shouldBeTime,
11856
+ why: makesSenseToSeek ? `is over timeshift threshold (threshold = ${seekThreshold}) and ${reason}` : null,
11857
+ playReason: `player is playing and ${reason}`,
11858
+ bufferUntilFirstFrame: !isVariableFpsVideo && playbackRate > 0
11859
+ };
11860
+ }
11861
+ return { type: "none" };
11862
+ };
11793
11863
  var useCurrentTimeOfMediaTagWithUpdateTimeStamp = (mediaRef) => {
11794
11864
  const lastUpdate = React21.useRef({
11795
11865
  time: mediaRef.current?.currentTime ?? 0,
@@ -12209,89 +12279,93 @@ var useMediaPlayback = ({
12209
12279
  if (!src) {
12210
12280
  throw new Error(`No 'src' attribute was passed to the ${tagName} element.`);
12211
12281
  }
12212
- const { duration } = mediaRef.current;
12213
- const shouldBeTime = !Number.isNaN(duration) && Number.isFinite(duration) ? Math.min(duration, desiredUnclampedTime) : desiredUnclampedTime;
12214
- const mediaTagTime = mediaTagCurrentTime.current.time;
12215
- const rvcTime = rvcCurrentTime.current?.time ?? null;
12216
- const isVariableFpsVideo = isVariableFpsVideoMap.current[src];
12217
- const timeShiftMediaTag = Math.abs(shouldBeTime - mediaTagTime);
12218
- const timeShiftRvcTag = rvcTime ? Math.abs(shouldBeTime - rvcTime) : null;
12219
- const mostRecentTimeshift = rvcCurrentTime.current?.lastUpdate && rvcCurrentTime.current.time > mediaTagCurrentTime.current.lastUpdate ? timeShiftRvcTag : timeShiftMediaTag;
12220
- const timeShift = timeShiftRvcTag && !isVariableFpsVideo ? mostRecentTimeshift : timeShiftMediaTag;
12221
- if (timeShift > acceptableTimeShiftButLessThanDuration && lastSeekDueToShift.current !== shouldBeTime) {
12282
+ const { current } = mediaRef;
12283
+ const action = getMediaSyncAction({
12284
+ duration: current.duration,
12285
+ currentTime: current.currentTime,
12286
+ paused: current.paused,
12287
+ ended: current.ended,
12288
+ desiredUnclampedTime,
12289
+ mediaTagTime: mediaTagCurrentTime.current.time,
12290
+ mediaTagLastUpdate: mediaTagCurrentTime.current.lastUpdate,
12291
+ rvcTime: rvcCurrentTime.current?.time ?? null,
12292
+ rvcLastUpdate: rvcCurrentTime.current?.lastUpdate ?? null,
12293
+ isVariableFpsVideo: Boolean(isVariableFpsVideoMap.current[src]),
12294
+ acceptableTimeShift: acceptableTimeShiftButLessThanDuration,
12295
+ lastSeekDueToShift: lastSeekDueToShift.current,
12296
+ playing,
12297
+ playbackRate,
12298
+ mediaTagBufferingOrStalled: isMediaTagBuffering || isBuffering(),
12299
+ playerBuffering: buffering.buffering.current,
12300
+ absoluteFrame,
12301
+ onlyWarnForMediaSeekingError,
12302
+ isPremounting,
12303
+ isPostmounting,
12304
+ pauseWhenBuffering
12305
+ });
12306
+ if (action.type === "none") {
12307
+ return;
12308
+ }
12309
+ if (action.type === "seek-due-to-shift") {
12222
12310
  lastSeek.current = seek({
12223
- mediaRef: mediaRef.current,
12224
- time: shouldBeTime,
12311
+ mediaRef: current,
12312
+ time: action.shouldBeTime,
12225
12313
  logLevel,
12226
- why: `because time shift is too big. shouldBeTime = ${shouldBeTime}, isTime = ${mediaTagTime}, requestVideoCallbackTime = ${rvcTime}, timeShift = ${timeShift}${isVariableFpsVideo ? ", isVariableFpsVideo = true" : ""}, isPremounting = ${isPremounting}, isPostmounting = ${isPostmounting}, pauseWhenBuffering = ${pauseWhenBuffering}`,
12314
+ why: action.why,
12227
12315
  mountTime
12228
12316
  });
12229
12317
  lastSeekDueToShift.current = lastSeek.current;
12230
- if (playing) {
12231
- if (playbackRate > 0) {
12232
- bufferUntilFirstFrame(shouldBeTime);
12233
- }
12234
- if (mediaRef.current.paused) {
12235
- playAndHandleNotAllowedError({
12236
- mediaRef,
12237
- mediaType,
12238
- onAutoPlayError,
12239
- logLevel,
12240
- mountTime,
12241
- reason: "player is playing but media tag is paused, and just seeked",
12242
- isPlayer: env.isPlayer
12243
- });
12244
- }
12245
- }
12246
- if (!onlyWarnForMediaSeekingError) {
12247
- warnAboutNonSeekableMedia(mediaRef.current, onlyWarnForMediaSeekingError ? "console-warning" : "console-error");
12318
+ if (action.bufferUntilFirstFrame) {
12319
+ bufferUntilFirstFrame(action.shouldBeTime);
12248
12320
  }
12249
- return;
12250
- }
12251
- const seekThreshold = playing ? 0.15 : 0.01;
12252
- const makesSenseToSeek = Math.abs(mediaRef.current.currentTime - shouldBeTime) > seekThreshold;
12253
- const isMediaTagBufferingOrStalled = isMediaTagBuffering || isBuffering();
12254
- const isSomethingElseBuffering = buffering.buffering.current && !isMediaTagBufferingOrStalled;
12255
- if (!playing || isSomethingElseBuffering) {
12256
- if (makesSenseToSeek) {
12257
- lastSeek.current = seek({
12258
- mediaRef: mediaRef.current,
12259
- time: shouldBeTime,
12321
+ if (action.playReason !== null) {
12322
+ playAndHandleNotAllowedError({
12323
+ mediaRef,
12324
+ mediaType,
12325
+ onAutoPlayError,
12260
12326
  logLevel,
12261
- why: `not playing or something else is buffering. time offset is over seek threshold (${seekThreshold})`,
12262
- mountTime
12327
+ mountTime,
12328
+ reason: action.playReason,
12329
+ isPlayer: env.isPlayer
12263
12330
  });
12264
12331
  }
12332
+ if (action.warnAboutNonSeekable) {
12333
+ warnAboutNonSeekableMedia(current, "console-error");
12334
+ }
12265
12335
  return;
12266
12336
  }
12267
- if (!playing || buffering.buffering.current) {
12268
- return;
12269
- }
12270
- const pausedCondition = mediaRef.current.paused && !mediaRef.current.ended;
12271
- const firstFrameCondition = absoluteFrame === 0;
12272
- if (pausedCondition || firstFrameCondition) {
12273
- const reason = pausedCondition ? "media tag is paused" : "absolute frame is 0";
12274
- if (makesSenseToSeek) {
12337
+ if (action.type === "seek-if-not-playing") {
12338
+ if (action.why !== null) {
12275
12339
  lastSeek.current = seek({
12276
- mediaRef: mediaRef.current,
12277
- time: shouldBeTime,
12340
+ mediaRef: current,
12341
+ time: action.shouldBeTime,
12278
12342
  logLevel,
12279
- why: `is over timeshift threshold (threshold = ${seekThreshold}) and ${reason}`,
12343
+ why: action.why,
12280
12344
  mountTime
12281
12345
  });
12282
12346
  }
12283
- playAndHandleNotAllowedError({
12284
- mediaRef,
12285
- mediaType,
12286
- onAutoPlayError,
12347
+ return;
12348
+ }
12349
+ if (action.why !== null) {
12350
+ lastSeek.current = seek({
12351
+ mediaRef: current,
12352
+ time: action.shouldBeTime,
12287
12353
  logLevel,
12288
- mountTime,
12289
- reason: `player is playing and ${reason}`,
12290
- isPlayer: env.isPlayer
12354
+ why: action.why,
12355
+ mountTime
12291
12356
  });
12292
- if (!isVariableFpsVideo && playbackRate > 0) {
12293
- bufferUntilFirstFrame(shouldBeTime);
12294
- }
12357
+ }
12358
+ playAndHandleNotAllowedError({
12359
+ mediaRef,
12360
+ mediaType,
12361
+ onAutoPlayError,
12362
+ logLevel,
12363
+ mountTime,
12364
+ reason: action.playReason,
12365
+ isPlayer: env.isPlayer
12366
+ });
12367
+ if (action.bufferUntilFirstFrame) {
12368
+ bufferUntilFirstFrame(action.shouldBeTime);
12295
12369
  }
12296
12370
  }, [
12297
12371
  absoluteFrame,
@@ -13482,6 +13556,18 @@ var loadImage = ({
13482
13556
  function exponentialBackoff(errorCount) {
13483
13557
  return 1000 * 2 ** (errorCount - 1);
13484
13558
  }
13559
+ var waitForNextFrame = ({
13560
+ onFrame
13561
+ }) => {
13562
+ if (typeof requestAnimationFrame === "undefined") {
13563
+ onFrame();
13564
+ return () => {
13565
+ return;
13566
+ };
13567
+ }
13568
+ const frame = requestAnimationFrame(onFrame);
13569
+ return () => cancelAnimationFrame(frame);
13570
+ };
13485
13571
  var CanvasImageContent = forwardRef10(({
13486
13572
  src,
13487
13573
  width,
@@ -13511,6 +13597,17 @@ var CanvasImageContent = forwardRef10(({
13511
13597
  overrideId: controls?.overrideId ?? null
13512
13598
  });
13513
13599
  const sequenceContext = useContext32(SequenceContext);
13600
+ const pendingLoadDelayRef = useRef23(null);
13601
+ const continuePendingLoadDelay = useCallback17(() => {
13602
+ const pending = pendingLoadDelayRef.current;
13603
+ if (!pending || pending.continued) {
13604
+ return;
13605
+ }
13606
+ pending.continued = true;
13607
+ pending.unblock();
13608
+ continueRender2(pending.handle);
13609
+ pendingLoadDelayRef.current = null;
13610
+ }, [continueRender2]);
13514
13611
  const sourceCanvas = useMemo31(() => {
13515
13612
  if (typeof document === "undefined") {
13516
13613
  return null;
@@ -13528,7 +13625,7 @@ var CanvasImageContent = forwardRef10(({
13528
13625
  ref.current = canvas;
13529
13626
  }
13530
13627
  }, [ref, refForOutline]);
13531
- useEffect17(() => {
13628
+ useLayoutEffect10(() => {
13532
13629
  const isPremounting = Boolean(sequenceContext?.premounting);
13533
13630
  const isPostmounting = Boolean(sequenceContext?.postmounting);
13534
13631
  const handle = delayRender2(`Rendering <CanvasImage> with src="${truncateSrcForLabel(actualSrc)}"`, {
@@ -13540,17 +13637,13 @@ var CanvasImageContent = forwardRef10(({
13540
13637
  };
13541
13638
  const controller = new AbortController;
13542
13639
  let cancelled = false;
13543
- let continued = false;
13544
13640
  let errorCount = 0;
13545
13641
  let timeoutId = null;
13546
13642
  setLoadedImage(null);
13547
- const continueRenderOnce = () => {
13548
- if (continued) {
13549
- return;
13550
- }
13551
- continued = true;
13552
- unblock();
13553
- continueRender2(handle);
13643
+ pendingLoadDelayRef.current = {
13644
+ handle,
13645
+ unblock,
13646
+ continued: false
13554
13647
  };
13555
13648
  const attemptLoad = () => {
13556
13649
  loadImage({ src: actualSrc, signal: controller.signal }).then((image) => {
@@ -13558,13 +13651,9 @@ var CanvasImageContent = forwardRef10(({
13558
13651
  return;
13559
13652
  }
13560
13653
  setLoadedImage(image);
13561
- }).then(() => {
13562
- if (!cancelled) {
13563
- continueRenderOnce();
13564
- }
13565
13654
  }).catch((err) => {
13566
13655
  if (err.name === "AbortError") {
13567
- continueRenderOnce();
13656
+ continuePendingLoadDelay();
13568
13657
  return;
13569
13658
  }
13570
13659
  errorCount++;
@@ -13578,7 +13667,7 @@ var CanvasImageContent = forwardRef10(({
13578
13667
  }, backoff);
13579
13668
  } else if (onError) {
13580
13669
  onError(err);
13581
- continueRenderOnce();
13670
+ continuePendingLoadDelay();
13582
13671
  } else {
13583
13672
  cancelRender2(err);
13584
13673
  }
@@ -13591,12 +13680,12 @@ var CanvasImageContent = forwardRef10(({
13591
13680
  clearTimeout(timeoutId);
13592
13681
  }
13593
13682
  controller.abort();
13594
- continueRenderOnce();
13683
+ continuePendingLoadDelay();
13595
13684
  };
13596
13685
  }, [
13597
13686
  actualSrc,
13598
13687
  cancelRender2,
13599
- continueRender2,
13688
+ continuePendingLoadDelay,
13600
13689
  delayPlayback,
13601
13690
  delayRender2,
13602
13691
  delayRenderRetries,
@@ -13607,13 +13696,16 @@ var CanvasImageContent = forwardRef10(({
13607
13696
  sequenceContext?.postmounting,
13608
13697
  sequenceContext?.premounting
13609
13698
  ]);
13610
- useEffect17(() => {
13699
+ useLayoutEffect10(() => {
13611
13700
  if (!loadedImage || !outputCanvas || !sourceCanvas) {
13612
13701
  return;
13613
13702
  }
13614
13703
  const handle = delayRender2(`Applying effects to <CanvasImage> with src="${truncateSrcForLabel(actualSrc)}"`);
13615
13704
  let cancelled = false;
13616
13705
  let continued = false;
13706
+ let cancelWaitForNextFrame = () => {
13707
+ return;
13708
+ };
13617
13709
  const continueRenderOnce = () => {
13618
13710
  if (continued) {
13619
13711
  return;
@@ -13648,7 +13740,15 @@ var CanvasImageContent = forwardRef10(({
13648
13740
  height: canvasHeight
13649
13741
  }).then((completed) => {
13650
13742
  if (completed && !cancelled) {
13651
- continueRenderOnce();
13743
+ cancelWaitForNextFrame = waitForNextFrame({
13744
+ onFrame: () => {
13745
+ if (cancelled) {
13746
+ return;
13747
+ }
13748
+ continueRenderOnce();
13749
+ continuePendingLoadDelay();
13750
+ }
13751
+ });
13652
13752
  }
13653
13753
  }).catch((err) => {
13654
13754
  if (cancelled) {
@@ -13657,12 +13757,14 @@ var CanvasImageContent = forwardRef10(({
13657
13757
  if (onError) {
13658
13758
  onError(err);
13659
13759
  continueRenderOnce();
13760
+ continuePendingLoadDelay();
13660
13761
  } else {
13661
13762
  cancelRender2(err);
13662
13763
  }
13663
13764
  });
13664
13765
  return () => {
13665
13766
  cancelled = true;
13767
+ cancelWaitForNextFrame();
13666
13768
  continueRenderOnce();
13667
13769
  };
13668
13770
  }, [
@@ -13670,6 +13772,7 @@ var CanvasImageContent = forwardRef10(({
13670
13772
  cancelRender2,
13671
13773
  chainState,
13672
13774
  continueRender2,
13775
+ continuePendingLoadDelay,
13673
13776
  delayRender2,
13674
13777
  fit,
13675
13778
  height,
@@ -13879,7 +13982,7 @@ var ImgContent = ({
13879
13982
  if (typeof window !== "undefined") {
13880
13983
  const isPremounting = Boolean(sequenceContext?.premounting);
13881
13984
  const isPostmounting = Boolean(sequenceContext?.postmounting);
13882
- useLayoutEffect10(() => {
13985
+ useLayoutEffect11(() => {
13883
13986
  if (window.process?.env?.NODE_ENV === "test") {
13884
13987
  if (imageRef.current) {
13885
13988
  imageRef.current.src = actualSrc;
@@ -14775,7 +14878,7 @@ var OffthreadVideoForRendering = ({
14775
14878
  mediaVolume: 1
14776
14879
  });
14777
14880
  warnAboutTooHighVolume(volume);
14778
- useEffect18(() => {
14881
+ useEffect17(() => {
14779
14882
  if (!src) {
14780
14883
  throw new Error("No src passed");
14781
14884
  }
@@ -14832,7 +14935,7 @@ var OffthreadVideoForRendering = ({
14832
14935
  }, [toneMapped, currentTime, src, transparent]);
14833
14936
  const [imageSrc, setImageSrc] = useState19(null);
14834
14937
  const { delayRender: delayRender2, continueRender: continueRender2 } = useDelayRender();
14835
- useLayoutEffect11(() => {
14938
+ useLayoutEffect12(() => {
14836
14939
  if (!window.remotion_videoEnabled) {
14837
14940
  return;
14838
14941
  }
@@ -14936,7 +15039,7 @@ var useEmitVideoFrame = ({
14936
15039
  ref,
14937
15040
  onVideoFrame
14938
15041
  }) => {
14939
- useEffect19(() => {
15042
+ useEffect18(() => {
14940
15043
  const { current } = ref;
14941
15044
  if (!current) {
14942
15045
  return;
@@ -15111,7 +15214,7 @@ var VideoForDevelopmentRefForwardingFunction = (props2, ref) => {
15111
15214
  tag: "video",
15112
15215
  mountTime
15113
15216
  }));
15114
- useEffect20(() => {
15217
+ useEffect19(() => {
15115
15218
  const { current } = videoRef;
15116
15219
  if (!current) {
15117
15220
  return;
@@ -15154,7 +15257,7 @@ var VideoForDevelopmentRefForwardingFunction = (props2, ref) => {
15154
15257
  const currentOnDurationCallback = useRef27(onDuration);
15155
15258
  currentOnDurationCallback.current = onDuration;
15156
15259
  useEmitVideoFrame({ ref: videoRef, onVideoFrame });
15157
- useEffect20(() => {
15260
+ useEffect19(() => {
15158
15261
  const { current } = videoRef;
15159
15262
  if (!current) {
15160
15263
  return;
@@ -15171,7 +15274,7 @@ var VideoForDevelopmentRefForwardingFunction = (props2, ref) => {
15171
15274
  current.removeEventListener("loadedmetadata", onLoadedMetadata);
15172
15275
  };
15173
15276
  }, [src]);
15174
- useEffect20(() => {
15277
+ useEffect19(() => {
15175
15278
  const { current } = videoRef;
15176
15279
  if (!current) {
15177
15280
  return;
@@ -15786,6 +15889,15 @@ var staticFile = (path) => {
15786
15889
  }
15787
15890
  return preparsed;
15788
15891
  };
15892
+ var Still = (props2) => {
15893
+ const newProps = {
15894
+ ...props2,
15895
+ durationInFrames: 1,
15896
+ fps: 1
15897
+ };
15898
+ return React42.createElement(Composition, newProps);
15899
+ };
15900
+ addSequenceStackTraces(Still);
15789
15901
  var roundTo6Commas = (num) => {
15790
15902
  return Math.round(num * 1e5) / 1e5;
15791
15903
  };
@@ -15952,7 +16064,7 @@ var VideoForRenderingForwardFunction = ({
15952
16064
  mediaVolume: 1
15953
16065
  });
15954
16066
  warnAboutTooHighVolume(volume);
15955
- useEffect21(() => {
16067
+ useEffect20(() => {
15956
16068
  if (!props2.src) {
15957
16069
  throw new Error("No src passed");
15958
16070
  }
@@ -15996,7 +16108,7 @@ var VideoForRenderingForwardFunction = ({
15996
16108
  return videoRef.current;
15997
16109
  }, []);
15998
16110
  useEmitVideoFrame({ ref: videoRef, onVideoFrame });
15999
- useEffect21(() => {
16111
+ useEffect20(() => {
16000
16112
  if (!window.remotion_videoEnabled) {
16001
16113
  return;
16002
16114
  }
@@ -16086,7 +16198,7 @@ var VideoForRenderingForwardFunction = ({
16086
16198
  ]);
16087
16199
  const { src } = props2;
16088
16200
  if (environment.isRendering) {
16089
- useLayoutEffect12(() => {
16201
+ useLayoutEffect13(() => {
16090
16202
  if (window.process?.env?.NODE_ENV === "test") {
16091
16203
  return;
16092
16204
  }
@@ -19190,7 +19302,7 @@ var extrudeAndTransformElement = (options) => {
19190
19302
  // ../design/dist/esm/index.mjs
19191
19303
  import { jsx as jsx212, Fragment as Fragment3 } from "react/jsx-runtime";
19192
19304
  import { jsx as jsx312, jsxs as jsxs5 } from "react/jsx-runtime";
19193
- import { useEffect as useEffect23, useMemo as useMemo210, useRef as useRef31 } from "react";
19305
+ import { useEffect as useEffect22, useMemo as useMemo210, useRef as useRef31 } from "react";
19194
19306
  import { jsx as jsx45 } from "react/jsx-runtime";
19195
19307
  import { jsx as jsx53, jsxs as jsxs23 } from "react/jsx-runtime";
19196
19308
  import React62 from "react";
@@ -19445,7 +19557,7 @@ var useHoverTransforms = (ref, disabled) => {
19445
19557
  isActive: false
19446
19558
  });
19447
19559
  const eventTarget = useMemo42(() => new EventTarget, []);
19448
- useEffect22(() => {
19560
+ useEffect21(() => {
19449
19561
  if (disabled) {
19450
19562
  eventTarget.dispatchEvent(new Event("disabled"));
19451
19563
  } else {
@@ -19592,7 +19704,7 @@ var getAngle = (ref, coordinates) => {
19592
19704
  var lastCoordinates = null;
19593
19705
  var useMousePosition = (ref) => {
19594
19706
  const [angle, setAngle] = useState21(getAngle(ref.current, lastCoordinates));
19595
- useEffect22(() => {
19707
+ useEffect21(() => {
19596
19708
  const element = ref.current;
19597
19709
  if (!element) {
19598
19710
  return;
@@ -19713,7 +19825,7 @@ var Spinner = ({ size, duration }) => {
19713
19825
  };
19714
19826
  }, [size]);
19715
19827
  const pathsRef = useRef31([]);
19716
- useEffect23(() => {
19828
+ useEffect22(() => {
19717
19829
  const animate = () => {
19718
19830
  const now = performance.now();
19719
19831
  for (let index = 0;index < lines; index++) {