@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.
@@ -32,6 +32,9 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
32
32
  throw Error('Dynamic require of "' + x + '" is not supported');
33
33
  });
34
34
 
35
+ // src/components/homepage/Pricing.tsx
36
+ import { useMemo as useMemo52 } from "react";
37
+
35
38
  // ../design/dist/esm/index.mjs
36
39
  import * as React23 from "react";
37
40
  import * as React3 from "react";
@@ -1378,7 +1381,7 @@ var getDefaultConfig = () => {
1378
1381
  var twMerge = /* @__PURE__ */ createTailwindMerge(getDefaultConfig);
1379
1382
 
1380
1383
  // ../design/dist/esm/index.mjs
1381
- import React32, { useEffect as useEffect22, useMemo as useMemo42, useState as useState21 } from "react";
1384
+ import React32, { useEffect as useEffect21, useMemo as useMemo42, useState as useState21 } from "react";
1382
1385
 
1383
1386
  // ../paths/dist/esm/index.mjs
1384
1387
  var cutLInstruction = ({
@@ -3484,6 +3487,94 @@ var getBoundingBox = (d) => {
3484
3487
  const unarced = removeATSHVQInstructions(normalizeInstructions(parsed));
3485
3488
  return getBoundingBoxFromInstructions(unarced);
3486
3489
  };
3490
+ var translateSegments = (segments, x, y) => {
3491
+ return segments.map((segment) => {
3492
+ 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") {
3493
+ return segment;
3494
+ }
3495
+ if (segment.type === "V") {
3496
+ return {
3497
+ type: "V",
3498
+ y: segment.y + y
3499
+ };
3500
+ }
3501
+ if (segment.type === "H") {
3502
+ return {
3503
+ type: "H",
3504
+ x: segment.x + x
3505
+ };
3506
+ }
3507
+ if (segment.type === "A") {
3508
+ return {
3509
+ type: "A",
3510
+ rx: segment.rx,
3511
+ ry: segment.ry,
3512
+ largeArcFlag: segment.largeArcFlag,
3513
+ sweepFlag: segment.sweepFlag,
3514
+ xAxisRotation: segment.xAxisRotation,
3515
+ x: segment.x + x,
3516
+ y: segment.y + y
3517
+ };
3518
+ }
3519
+ if (segment.type === "Z") {
3520
+ return segment;
3521
+ }
3522
+ if (segment.type === "C") {
3523
+ return {
3524
+ type: "C",
3525
+ cp1x: segment.cp1x + x,
3526
+ cp1y: segment.cp1y + y,
3527
+ cp2x: segment.cp2x + x,
3528
+ cp2y: segment.cp2y + y,
3529
+ x: segment.x + x,
3530
+ y: segment.y + y
3531
+ };
3532
+ }
3533
+ if (segment.type === "Q") {
3534
+ return {
3535
+ type: "Q",
3536
+ cpx: segment.cpx + x,
3537
+ cpy: segment.cpy + y,
3538
+ x: segment.x + x,
3539
+ y: segment.y + y
3540
+ };
3541
+ }
3542
+ if (segment.type === "S") {
3543
+ return {
3544
+ type: "S",
3545
+ cpx: segment.cpx + x,
3546
+ cpy: segment.cpy + y,
3547
+ x: segment.x + x,
3548
+ y: segment.y + y
3549
+ };
3550
+ }
3551
+ if (segment.type === "T") {
3552
+ return {
3553
+ type: "T",
3554
+ x: segment.x + x,
3555
+ y: segment.y + y
3556
+ };
3557
+ }
3558
+ if (segment.type === "L") {
3559
+ return {
3560
+ type: "L",
3561
+ x: segment.x + x,
3562
+ y: segment.y + y
3563
+ };
3564
+ }
3565
+ if (segment.type === "M") {
3566
+ return {
3567
+ type: "M",
3568
+ x: segment.x + x,
3569
+ y: segment.y + y
3570
+ };
3571
+ }
3572
+ throw new Error(`Unknown segment type: ${segment.type}`);
3573
+ });
3574
+ };
3575
+ var translatePath = (path, x, y) => {
3576
+ return serializeInstructions(translateSegments(parsePath(path), x, y));
3577
+ };
3487
3578
  var mod = (x, m) => {
3488
3579
  return (x % m + m) % m;
3489
3580
  };
@@ -4045,94 +4136,6 @@ var getLength = (path) => {
4045
4136
  const constructucted = construct(path);
4046
4137
  return constructucted.totalLength;
4047
4138
  };
4048
- var translateSegments = (segments, x, y) => {
4049
- return segments.map((segment) => {
4050
- 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") {
4051
- return segment;
4052
- }
4053
- if (segment.type === "V") {
4054
- return {
4055
- type: "V",
4056
- y: segment.y + y
4057
- };
4058
- }
4059
- if (segment.type === "H") {
4060
- return {
4061
- type: "H",
4062
- x: segment.x + x
4063
- };
4064
- }
4065
- if (segment.type === "A") {
4066
- return {
4067
- type: "A",
4068
- rx: segment.rx,
4069
- ry: segment.ry,
4070
- largeArcFlag: segment.largeArcFlag,
4071
- sweepFlag: segment.sweepFlag,
4072
- xAxisRotation: segment.xAxisRotation,
4073
- x: segment.x + x,
4074
- y: segment.y + y
4075
- };
4076
- }
4077
- if (segment.type === "Z") {
4078
- return segment;
4079
- }
4080
- if (segment.type === "C") {
4081
- return {
4082
- type: "C",
4083
- cp1x: segment.cp1x + x,
4084
- cp1y: segment.cp1y + y,
4085
- cp2x: segment.cp2x + x,
4086
- cp2y: segment.cp2y + y,
4087
- x: segment.x + x,
4088
- y: segment.y + y
4089
- };
4090
- }
4091
- if (segment.type === "Q") {
4092
- return {
4093
- type: "Q",
4094
- cpx: segment.cpx + x,
4095
- cpy: segment.cpy + y,
4096
- x: segment.x + x,
4097
- y: segment.y + y
4098
- };
4099
- }
4100
- if (segment.type === "S") {
4101
- return {
4102
- type: "S",
4103
- cpx: segment.cpx + x,
4104
- cpy: segment.cpy + y,
4105
- x: segment.x + x,
4106
- y: segment.y + y
4107
- };
4108
- }
4109
- if (segment.type === "T") {
4110
- return {
4111
- type: "T",
4112
- x: segment.x + x,
4113
- y: segment.y + y
4114
- };
4115
- }
4116
- if (segment.type === "L") {
4117
- return {
4118
- type: "L",
4119
- x: segment.x + x,
4120
- y: segment.y + y
4121
- };
4122
- }
4123
- if (segment.type === "M") {
4124
- return {
4125
- type: "M",
4126
- x: segment.x + x,
4127
- y: segment.y + y
4128
- };
4129
- }
4130
- throw new Error(`Unknown segment type: ${segment.type}`);
4131
- });
4132
- };
4133
- var translatePath = (path, x, y) => {
4134
- return serializeInstructions(translateSegments(parsePath(path), x, y));
4135
- };
4136
4139
  var resetPath = (d) => {
4137
4140
  const box = getBoundingBox(d);
4138
4141
  return translatePath(d, -box.x1, -box.y1);
@@ -4321,8 +4324,8 @@ import {
4321
4324
  forwardRef as forwardRef10,
4322
4325
  useCallback as useCallback17,
4323
4326
  useContext as useContext32,
4324
- useEffect as useEffect17,
4325
4327
  useImperativeHandle as useImperativeHandle7,
4328
+ useLayoutEffect as useLayoutEffect10,
4326
4329
  useMemo as useMemo31,
4327
4330
  useRef as useRef23,
4328
4331
  useState as useState16
@@ -4330,7 +4333,7 @@ import {
4330
4333
  import { jsx as jsx26 } from "react/jsx-runtime";
4331
4334
  import { forwardRef as forwardRef11, useCallback as useCallback18, useState as useState17 } from "react";
4332
4335
  import { jsx as jsx27 } from "react/jsx-runtime";
4333
- import { useCallback as useCallback19, useContext as useContext33, useLayoutEffect as useLayoutEffect10, useRef as useRef24 } from "react";
4336
+ import { useCallback as useCallback19, useContext as useContext33, useLayoutEffect as useLayoutEffect11, useRef as useRef24 } from "react";
4334
4337
  import { jsx as jsx28 } from "react/jsx-runtime";
4335
4338
  import React29, { forwardRef as forwardRef12, useCallback as useCallback20, useRef as useRef25 } from "react";
4336
4339
  import { jsx as jsx29 } from "react/jsx-runtime";
@@ -4356,8 +4359,8 @@ import { useCallback as useCallback24 } from "react";
4356
4359
  import {
4357
4360
  useCallback as useCallback22,
4358
4361
  useContext as useContext36,
4359
- useEffect as useEffect18,
4360
- useLayoutEffect as useLayoutEffect11,
4362
+ useEffect as useEffect17,
4363
+ useLayoutEffect as useLayoutEffect12,
4361
4364
  useMemo as useMemo35,
4362
4365
  useState as useState19
4363
4366
  } from "react";
@@ -4366,13 +4369,13 @@ import React37, {
4366
4369
  forwardRef as forwardRef13,
4367
4370
  useCallback as useCallback23,
4368
4371
  useContext as useContext37,
4369
- useEffect as useEffect20,
4372
+ useEffect as useEffect19,
4370
4373
  useImperativeHandle as useImperativeHandle9,
4371
4374
  useMemo as useMemo36,
4372
4375
  useRef as useRef27,
4373
4376
  useState as useState20
4374
4377
  } from "react";
4375
- import { useEffect as useEffect19 } from "react";
4378
+ import { useEffect as useEffect18 } from "react";
4376
4379
  import { jsx as jsx34 } from "react/jsx-runtime";
4377
4380
  import { jsx as jsx35 } from "react/jsx-runtime";
4378
4381
  import React39, { useMemo as useMemo37 } from "react";
@@ -4389,9 +4392,9 @@ import { forwardRef as forwardRef16, useCallback as useCallback25, useContext as
4389
4392
  import {
4390
4393
  forwardRef as forwardRef15,
4391
4394
  useContext as useContext38,
4392
- useEffect as useEffect21,
4395
+ useEffect as useEffect20,
4393
4396
  useImperativeHandle as useImperativeHandle10,
4394
- useLayoutEffect as useLayoutEffect12,
4397
+ useLayoutEffect as useLayoutEffect13,
4395
4398
  useMemo as useMemo39,
4396
4399
  useRef as useRef28
4397
4400
  } from "react";
@@ -5565,7 +5568,7 @@ var getComponentsToAddStacksTo = () => componentsToAddStacksTo;
5565
5568
  var addSequenceStackTraces = (component) => {
5566
5569
  componentsToAddStacksTo.push(component);
5567
5570
  };
5568
- var VERSION = "4.0.485";
5571
+ var VERSION = "4.0.487";
5569
5572
  var checkMultipleRemotionVersions = () => {
5570
5573
  if (typeof globalThis === "undefined") {
5571
5574
  return;
@@ -5971,6 +5974,12 @@ var textSchema = {
5971
5974
  default: undefined,
5972
5975
  description: "Color"
5973
5976
  },
5977
+ "style.fontFamily": {
5978
+ type: "font-family",
5979
+ default: undefined,
5980
+ description: "Font family",
5981
+ keyframable: false
5982
+ },
5974
5983
  "style.fontSize": {
5975
5984
  type: "number",
5976
5985
  default: undefined,
@@ -11429,7 +11438,8 @@ var useBufferManager = (logLevel, mountTime) => {
11429
11438
  if (rendering) {
11430
11439
  return;
11431
11440
  }
11432
- if (blocks.length > 0) {
11441
+ if (blocks.length > 0 && !buffering.current) {
11442
+ buffering.current = true;
11433
11443
  onBufferingCallbacks.forEach((c2) => c2());
11434
11444
  playbackLogging({
11435
11445
  logLevel,
@@ -11444,7 +11454,8 @@ var useBufferManager = (logLevel, mountTime) => {
11444
11454
  if (rendering) {
11445
11455
  return;
11446
11456
  }
11447
- if (blocks.length === 0) {
11457
+ if (blocks.length === 0 && buffering.current) {
11458
+ buffering.current = false;
11448
11459
  onResumeCallbacks.forEach((c2) => c2());
11449
11460
  playbackLogging({
11450
11461
  logLevel,
@@ -11477,15 +11488,11 @@ var useIsPlayerBuffering = (bufferManager) => {
11477
11488
  const onResume = () => {
11478
11489
  setIsBuffering(false);
11479
11490
  };
11480
- bufferManager.listenForBuffering(onBuffer);
11481
- bufferManager.listenForResume(onResume);
11491
+ const buffer = bufferManager.listenForBuffering(onBuffer);
11492
+ const resume = bufferManager.listenForResume(onResume);
11482
11493
  return () => {
11483
- bufferManager.listenForBuffering(() => {
11484
- return;
11485
- });
11486
- bufferManager.listenForResume(() => {
11487
- return;
11488
- });
11494
+ buffer.remove();
11495
+ resume.remove();
11489
11496
  };
11490
11497
  }, [bufferManager]);
11491
11498
  return isBuffering;
@@ -11609,6 +11616,72 @@ var useBufferUntilFirstFrame = ({
11609
11616
  };
11610
11617
  }, [bufferUntilFirstFrame]);
11611
11618
  };
11619
+ var getMediaSyncAction = (input) => {
11620
+ const {
11621
+ duration,
11622
+ currentTime,
11623
+ paused,
11624
+ ended,
11625
+ desiredUnclampedTime,
11626
+ mediaTagTime,
11627
+ mediaTagLastUpdate,
11628
+ rvcTime,
11629
+ rvcLastUpdate,
11630
+ isVariableFpsVideo,
11631
+ acceptableTimeShift,
11632
+ lastSeekDueToShift,
11633
+ playing,
11634
+ playbackRate,
11635
+ mediaTagBufferingOrStalled,
11636
+ playerBuffering,
11637
+ absoluteFrame,
11638
+ onlyWarnForMediaSeekingError,
11639
+ isPremounting,
11640
+ isPostmounting,
11641
+ pauseWhenBuffering
11642
+ } = input;
11643
+ const shouldBeTime = !Number.isNaN(duration) && Number.isFinite(duration) ? Math.min(duration, desiredUnclampedTime) : desiredUnclampedTime;
11644
+ const timeShiftMediaTag = Math.abs(shouldBeTime - mediaTagTime);
11645
+ const timeShiftRvcTag = rvcTime ? Math.abs(shouldBeTime - rvcTime) : null;
11646
+ const mostRecentTimeshift = rvcLastUpdate && rvcTime > mediaTagLastUpdate ? timeShiftRvcTag : timeShiftMediaTag;
11647
+ const timeShift = timeShiftRvcTag && !isVariableFpsVideo ? mostRecentTimeshift : timeShiftMediaTag;
11648
+ if (timeShift > acceptableTimeShift && lastSeekDueToShift !== shouldBeTime) {
11649
+ return {
11650
+ type: "seek-due-to-shift",
11651
+ shouldBeTime,
11652
+ why: `because time shift is too big. shouldBeTime = ${shouldBeTime}, isTime = ${mediaTagTime}, requestVideoCallbackTime = ${rvcTime}, timeShift = ${timeShift}${isVariableFpsVideo ? ", isVariableFpsVideo = true" : ""}, isPremounting = ${isPremounting}, isPostmounting = ${isPostmounting}, pauseWhenBuffering = ${pauseWhenBuffering}`,
11653
+ bufferUntilFirstFrame: playing && playbackRate > 0,
11654
+ playReason: playing && paused ? "player is playing but media tag is paused, and just seeked" : null,
11655
+ warnAboutNonSeekable: !onlyWarnForMediaSeekingError
11656
+ };
11657
+ }
11658
+ const seekThreshold = playing ? 0.15 : 0.01;
11659
+ const makesSenseToSeek = Math.abs(currentTime - shouldBeTime) > seekThreshold;
11660
+ const isSomethingElseBuffering = playerBuffering && !mediaTagBufferingOrStalled;
11661
+ if (!playing || isSomethingElseBuffering) {
11662
+ return {
11663
+ type: "seek-if-not-playing",
11664
+ shouldBeTime,
11665
+ why: makesSenseToSeek ? `not playing or something else is buffering. time offset is over seek threshold (${seekThreshold})` : null
11666
+ };
11667
+ }
11668
+ if (!playing || playerBuffering) {
11669
+ return { type: "none" };
11670
+ }
11671
+ const pausedCondition = paused && !ended;
11672
+ const firstFrameCondition = absoluteFrame === 0;
11673
+ if (pausedCondition || firstFrameCondition) {
11674
+ const reason = pausedCondition ? "media tag is paused" : "absolute frame is 0";
11675
+ return {
11676
+ type: "play-and-seek",
11677
+ shouldBeTime,
11678
+ why: makesSenseToSeek ? `is over timeshift threshold (threshold = ${seekThreshold}) and ${reason}` : null,
11679
+ playReason: `player is playing and ${reason}`,
11680
+ bufferUntilFirstFrame: !isVariableFpsVideo && playbackRate > 0
11681
+ };
11682
+ }
11683
+ return { type: "none" };
11684
+ };
11612
11685
  var useCurrentTimeOfMediaTagWithUpdateTimeStamp = (mediaRef) => {
11613
11686
  const lastUpdate = React21.useRef({
11614
11687
  time: mediaRef.current?.currentTime ?? 0,
@@ -12028,89 +12101,93 @@ var useMediaPlayback = ({
12028
12101
  if (!src) {
12029
12102
  throw new Error(`No 'src' attribute was passed to the ${tagName} element.`);
12030
12103
  }
12031
- const { duration } = mediaRef.current;
12032
- const shouldBeTime = !Number.isNaN(duration) && Number.isFinite(duration) ? Math.min(duration, desiredUnclampedTime) : desiredUnclampedTime;
12033
- const mediaTagTime = mediaTagCurrentTime.current.time;
12034
- const rvcTime = rvcCurrentTime.current?.time ?? null;
12035
- const isVariableFpsVideo = isVariableFpsVideoMap.current[src];
12036
- const timeShiftMediaTag = Math.abs(shouldBeTime - mediaTagTime);
12037
- const timeShiftRvcTag = rvcTime ? Math.abs(shouldBeTime - rvcTime) : null;
12038
- const mostRecentTimeshift = rvcCurrentTime.current?.lastUpdate && rvcCurrentTime.current.time > mediaTagCurrentTime.current.lastUpdate ? timeShiftRvcTag : timeShiftMediaTag;
12039
- const timeShift = timeShiftRvcTag && !isVariableFpsVideo ? mostRecentTimeshift : timeShiftMediaTag;
12040
- if (timeShift > acceptableTimeShiftButLessThanDuration && lastSeekDueToShift.current !== shouldBeTime) {
12104
+ const { current } = mediaRef;
12105
+ const action = getMediaSyncAction({
12106
+ duration: current.duration,
12107
+ currentTime: current.currentTime,
12108
+ paused: current.paused,
12109
+ ended: current.ended,
12110
+ desiredUnclampedTime,
12111
+ mediaTagTime: mediaTagCurrentTime.current.time,
12112
+ mediaTagLastUpdate: mediaTagCurrentTime.current.lastUpdate,
12113
+ rvcTime: rvcCurrentTime.current?.time ?? null,
12114
+ rvcLastUpdate: rvcCurrentTime.current?.lastUpdate ?? null,
12115
+ isVariableFpsVideo: Boolean(isVariableFpsVideoMap.current[src]),
12116
+ acceptableTimeShift: acceptableTimeShiftButLessThanDuration,
12117
+ lastSeekDueToShift: lastSeekDueToShift.current,
12118
+ playing,
12119
+ playbackRate,
12120
+ mediaTagBufferingOrStalled: isMediaTagBuffering || isBuffering(),
12121
+ playerBuffering: buffering.buffering.current,
12122
+ absoluteFrame,
12123
+ onlyWarnForMediaSeekingError,
12124
+ isPremounting,
12125
+ isPostmounting,
12126
+ pauseWhenBuffering
12127
+ });
12128
+ if (action.type === "none") {
12129
+ return;
12130
+ }
12131
+ if (action.type === "seek-due-to-shift") {
12041
12132
  lastSeek.current = seek({
12042
- mediaRef: mediaRef.current,
12043
- time: shouldBeTime,
12133
+ mediaRef: current,
12134
+ time: action.shouldBeTime,
12044
12135
  logLevel,
12045
- why: `because time shift is too big. shouldBeTime = ${shouldBeTime}, isTime = ${mediaTagTime}, requestVideoCallbackTime = ${rvcTime}, timeShift = ${timeShift}${isVariableFpsVideo ? ", isVariableFpsVideo = true" : ""}, isPremounting = ${isPremounting}, isPostmounting = ${isPostmounting}, pauseWhenBuffering = ${pauseWhenBuffering}`,
12136
+ why: action.why,
12046
12137
  mountTime
12047
12138
  });
12048
12139
  lastSeekDueToShift.current = lastSeek.current;
12049
- if (playing) {
12050
- if (playbackRate > 0) {
12051
- bufferUntilFirstFrame(shouldBeTime);
12052
- }
12053
- if (mediaRef.current.paused) {
12054
- playAndHandleNotAllowedError({
12055
- mediaRef,
12056
- mediaType,
12057
- onAutoPlayError,
12058
- logLevel,
12059
- mountTime,
12060
- reason: "player is playing but media tag is paused, and just seeked",
12061
- isPlayer: env.isPlayer
12062
- });
12063
- }
12064
- }
12065
- if (!onlyWarnForMediaSeekingError) {
12066
- warnAboutNonSeekableMedia(mediaRef.current, onlyWarnForMediaSeekingError ? "console-warning" : "console-error");
12140
+ if (action.bufferUntilFirstFrame) {
12141
+ bufferUntilFirstFrame(action.shouldBeTime);
12067
12142
  }
12068
- return;
12069
- }
12070
- const seekThreshold = playing ? 0.15 : 0.01;
12071
- const makesSenseToSeek = Math.abs(mediaRef.current.currentTime - shouldBeTime) > seekThreshold;
12072
- const isMediaTagBufferingOrStalled = isMediaTagBuffering || isBuffering();
12073
- const isSomethingElseBuffering = buffering.buffering.current && !isMediaTagBufferingOrStalled;
12074
- if (!playing || isSomethingElseBuffering) {
12075
- if (makesSenseToSeek) {
12076
- lastSeek.current = seek({
12077
- mediaRef: mediaRef.current,
12078
- time: shouldBeTime,
12143
+ if (action.playReason !== null) {
12144
+ playAndHandleNotAllowedError({
12145
+ mediaRef,
12146
+ mediaType,
12147
+ onAutoPlayError,
12079
12148
  logLevel,
12080
- why: `not playing or something else is buffering. time offset is over seek threshold (${seekThreshold})`,
12081
- mountTime
12149
+ mountTime,
12150
+ reason: action.playReason,
12151
+ isPlayer: env.isPlayer
12082
12152
  });
12083
12153
  }
12154
+ if (action.warnAboutNonSeekable) {
12155
+ warnAboutNonSeekableMedia(current, "console-error");
12156
+ }
12084
12157
  return;
12085
12158
  }
12086
- if (!playing || buffering.buffering.current) {
12087
- return;
12088
- }
12089
- const pausedCondition = mediaRef.current.paused && !mediaRef.current.ended;
12090
- const firstFrameCondition = absoluteFrame === 0;
12091
- if (pausedCondition || firstFrameCondition) {
12092
- const reason = pausedCondition ? "media tag is paused" : "absolute frame is 0";
12093
- if (makesSenseToSeek) {
12159
+ if (action.type === "seek-if-not-playing") {
12160
+ if (action.why !== null) {
12094
12161
  lastSeek.current = seek({
12095
- mediaRef: mediaRef.current,
12096
- time: shouldBeTime,
12162
+ mediaRef: current,
12163
+ time: action.shouldBeTime,
12097
12164
  logLevel,
12098
- why: `is over timeshift threshold (threshold = ${seekThreshold}) and ${reason}`,
12165
+ why: action.why,
12099
12166
  mountTime
12100
12167
  });
12101
12168
  }
12102
- playAndHandleNotAllowedError({
12103
- mediaRef,
12104
- mediaType,
12105
- onAutoPlayError,
12169
+ return;
12170
+ }
12171
+ if (action.why !== null) {
12172
+ lastSeek.current = seek({
12173
+ mediaRef: current,
12174
+ time: action.shouldBeTime,
12106
12175
  logLevel,
12107
- mountTime,
12108
- reason: `player is playing and ${reason}`,
12109
- isPlayer: env.isPlayer
12176
+ why: action.why,
12177
+ mountTime
12110
12178
  });
12111
- if (!isVariableFpsVideo && playbackRate > 0) {
12112
- bufferUntilFirstFrame(shouldBeTime);
12113
- }
12179
+ }
12180
+ playAndHandleNotAllowedError({
12181
+ mediaRef,
12182
+ mediaType,
12183
+ onAutoPlayError,
12184
+ logLevel,
12185
+ mountTime,
12186
+ reason: action.playReason,
12187
+ isPlayer: env.isPlayer
12188
+ });
12189
+ if (action.bufferUntilFirstFrame) {
12190
+ bufferUntilFirstFrame(action.shouldBeTime);
12114
12191
  }
12115
12192
  }, [
12116
12193
  absoluteFrame,
@@ -13301,6 +13378,18 @@ var loadImage = ({
13301
13378
  function exponentialBackoff(errorCount) {
13302
13379
  return 1000 * 2 ** (errorCount - 1);
13303
13380
  }
13381
+ var waitForNextFrame = ({
13382
+ onFrame
13383
+ }) => {
13384
+ if (typeof requestAnimationFrame === "undefined") {
13385
+ onFrame();
13386
+ return () => {
13387
+ return;
13388
+ };
13389
+ }
13390
+ const frame = requestAnimationFrame(onFrame);
13391
+ return () => cancelAnimationFrame(frame);
13392
+ };
13304
13393
  var CanvasImageContent = forwardRef10(({
13305
13394
  src,
13306
13395
  width,
@@ -13330,6 +13419,17 @@ var CanvasImageContent = forwardRef10(({
13330
13419
  overrideId: controls?.overrideId ?? null
13331
13420
  });
13332
13421
  const sequenceContext = useContext32(SequenceContext);
13422
+ const pendingLoadDelayRef = useRef23(null);
13423
+ const continuePendingLoadDelay = useCallback17(() => {
13424
+ const pending = pendingLoadDelayRef.current;
13425
+ if (!pending || pending.continued) {
13426
+ return;
13427
+ }
13428
+ pending.continued = true;
13429
+ pending.unblock();
13430
+ continueRender2(pending.handle);
13431
+ pendingLoadDelayRef.current = null;
13432
+ }, [continueRender2]);
13333
13433
  const sourceCanvas = useMemo31(() => {
13334
13434
  if (typeof document === "undefined") {
13335
13435
  return null;
@@ -13347,7 +13447,7 @@ var CanvasImageContent = forwardRef10(({
13347
13447
  ref.current = canvas;
13348
13448
  }
13349
13449
  }, [ref, refForOutline]);
13350
- useEffect17(() => {
13450
+ useLayoutEffect10(() => {
13351
13451
  const isPremounting = Boolean(sequenceContext?.premounting);
13352
13452
  const isPostmounting = Boolean(sequenceContext?.postmounting);
13353
13453
  const handle = delayRender2(`Rendering <CanvasImage> with src="${truncateSrcForLabel(actualSrc)}"`, {
@@ -13359,17 +13459,13 @@ var CanvasImageContent = forwardRef10(({
13359
13459
  };
13360
13460
  const controller = new AbortController;
13361
13461
  let cancelled = false;
13362
- let continued = false;
13363
13462
  let errorCount = 0;
13364
13463
  let timeoutId = null;
13365
13464
  setLoadedImage(null);
13366
- const continueRenderOnce = () => {
13367
- if (continued) {
13368
- return;
13369
- }
13370
- continued = true;
13371
- unblock();
13372
- continueRender2(handle);
13465
+ pendingLoadDelayRef.current = {
13466
+ handle,
13467
+ unblock,
13468
+ continued: false
13373
13469
  };
13374
13470
  const attemptLoad = () => {
13375
13471
  loadImage({ src: actualSrc, signal: controller.signal }).then((image) => {
@@ -13377,13 +13473,9 @@ var CanvasImageContent = forwardRef10(({
13377
13473
  return;
13378
13474
  }
13379
13475
  setLoadedImage(image);
13380
- }).then(() => {
13381
- if (!cancelled) {
13382
- continueRenderOnce();
13383
- }
13384
13476
  }).catch((err) => {
13385
13477
  if (err.name === "AbortError") {
13386
- continueRenderOnce();
13478
+ continuePendingLoadDelay();
13387
13479
  return;
13388
13480
  }
13389
13481
  errorCount++;
@@ -13397,7 +13489,7 @@ var CanvasImageContent = forwardRef10(({
13397
13489
  }, backoff);
13398
13490
  } else if (onError) {
13399
13491
  onError(err);
13400
- continueRenderOnce();
13492
+ continuePendingLoadDelay();
13401
13493
  } else {
13402
13494
  cancelRender2(err);
13403
13495
  }
@@ -13410,12 +13502,12 @@ var CanvasImageContent = forwardRef10(({
13410
13502
  clearTimeout(timeoutId);
13411
13503
  }
13412
13504
  controller.abort();
13413
- continueRenderOnce();
13505
+ continuePendingLoadDelay();
13414
13506
  };
13415
13507
  }, [
13416
13508
  actualSrc,
13417
13509
  cancelRender2,
13418
- continueRender2,
13510
+ continuePendingLoadDelay,
13419
13511
  delayPlayback,
13420
13512
  delayRender2,
13421
13513
  delayRenderRetries,
@@ -13426,13 +13518,16 @@ var CanvasImageContent = forwardRef10(({
13426
13518
  sequenceContext?.postmounting,
13427
13519
  sequenceContext?.premounting
13428
13520
  ]);
13429
- useEffect17(() => {
13521
+ useLayoutEffect10(() => {
13430
13522
  if (!loadedImage || !outputCanvas || !sourceCanvas) {
13431
13523
  return;
13432
13524
  }
13433
13525
  const handle = delayRender2(`Applying effects to <CanvasImage> with src="${truncateSrcForLabel(actualSrc)}"`);
13434
13526
  let cancelled = false;
13435
13527
  let continued = false;
13528
+ let cancelWaitForNextFrame = () => {
13529
+ return;
13530
+ };
13436
13531
  const continueRenderOnce = () => {
13437
13532
  if (continued) {
13438
13533
  return;
@@ -13467,7 +13562,15 @@ var CanvasImageContent = forwardRef10(({
13467
13562
  height: canvasHeight
13468
13563
  }).then((completed) => {
13469
13564
  if (completed && !cancelled) {
13470
- continueRenderOnce();
13565
+ cancelWaitForNextFrame = waitForNextFrame({
13566
+ onFrame: () => {
13567
+ if (cancelled) {
13568
+ return;
13569
+ }
13570
+ continueRenderOnce();
13571
+ continuePendingLoadDelay();
13572
+ }
13573
+ });
13471
13574
  }
13472
13575
  }).catch((err) => {
13473
13576
  if (cancelled) {
@@ -13476,12 +13579,14 @@ var CanvasImageContent = forwardRef10(({
13476
13579
  if (onError) {
13477
13580
  onError(err);
13478
13581
  continueRenderOnce();
13582
+ continuePendingLoadDelay();
13479
13583
  } else {
13480
13584
  cancelRender2(err);
13481
13585
  }
13482
13586
  });
13483
13587
  return () => {
13484
13588
  cancelled = true;
13589
+ cancelWaitForNextFrame();
13485
13590
  continueRenderOnce();
13486
13591
  };
13487
13592
  }, [
@@ -13489,6 +13594,7 @@ var CanvasImageContent = forwardRef10(({
13489
13594
  cancelRender2,
13490
13595
  chainState,
13491
13596
  continueRender2,
13597
+ continuePendingLoadDelay,
13492
13598
  delayRender2,
13493
13599
  fit,
13494
13600
  height,
@@ -13698,7 +13804,7 @@ var ImgContent = ({
13698
13804
  if (typeof window !== "undefined") {
13699
13805
  const isPremounting = Boolean(sequenceContext?.premounting);
13700
13806
  const isPostmounting = Boolean(sequenceContext?.postmounting);
13701
- useLayoutEffect10(() => {
13807
+ useLayoutEffect11(() => {
13702
13808
  if (window.process?.env?.NODE_ENV === "test") {
13703
13809
  if (imageRef.current) {
13704
13810
  imageRef.current.src = actualSrc;
@@ -14594,7 +14700,7 @@ var OffthreadVideoForRendering = ({
14594
14700
  mediaVolume: 1
14595
14701
  });
14596
14702
  warnAboutTooHighVolume(volume);
14597
- useEffect18(() => {
14703
+ useEffect17(() => {
14598
14704
  if (!src) {
14599
14705
  throw new Error("No src passed");
14600
14706
  }
@@ -14651,7 +14757,7 @@ var OffthreadVideoForRendering = ({
14651
14757
  }, [toneMapped, currentTime, src, transparent]);
14652
14758
  const [imageSrc, setImageSrc] = useState19(null);
14653
14759
  const { delayRender: delayRender2, continueRender: continueRender2 } = useDelayRender();
14654
- useLayoutEffect11(() => {
14760
+ useLayoutEffect12(() => {
14655
14761
  if (!window.remotion_videoEnabled) {
14656
14762
  return;
14657
14763
  }
@@ -14755,7 +14861,7 @@ var useEmitVideoFrame = ({
14755
14861
  ref,
14756
14862
  onVideoFrame
14757
14863
  }) => {
14758
- useEffect19(() => {
14864
+ useEffect18(() => {
14759
14865
  const { current } = ref;
14760
14866
  if (!current) {
14761
14867
  return;
@@ -14930,7 +15036,7 @@ var VideoForDevelopmentRefForwardingFunction = (props2, ref) => {
14930
15036
  tag: "video",
14931
15037
  mountTime
14932
15038
  }));
14933
- useEffect20(() => {
15039
+ useEffect19(() => {
14934
15040
  const { current } = videoRef;
14935
15041
  if (!current) {
14936
15042
  return;
@@ -14973,7 +15079,7 @@ var VideoForDevelopmentRefForwardingFunction = (props2, ref) => {
14973
15079
  const currentOnDurationCallback = useRef27(onDuration);
14974
15080
  currentOnDurationCallback.current = onDuration;
14975
15081
  useEmitVideoFrame({ ref: videoRef, onVideoFrame });
14976
- useEffect20(() => {
15082
+ useEffect19(() => {
14977
15083
  const { current } = videoRef;
14978
15084
  if (!current) {
14979
15085
  return;
@@ -14990,7 +15096,7 @@ var VideoForDevelopmentRefForwardingFunction = (props2, ref) => {
14990
15096
  current.removeEventListener("loadedmetadata", onLoadedMetadata);
14991
15097
  };
14992
15098
  }, [src]);
14993
- useEffect20(() => {
15099
+ useEffect19(() => {
14994
15100
  const { current } = videoRef;
14995
15101
  if (!current) {
14996
15102
  return;
@@ -15605,6 +15711,15 @@ var staticFile = (path) => {
15605
15711
  }
15606
15712
  return preparsed;
15607
15713
  };
15714
+ var Still = (props2) => {
15715
+ const newProps = {
15716
+ ...props2,
15717
+ durationInFrames: 1,
15718
+ fps: 1
15719
+ };
15720
+ return React42.createElement(Composition, newProps);
15721
+ };
15722
+ addSequenceStackTraces(Still);
15608
15723
  var roundTo6Commas = (num) => {
15609
15724
  return Math.round(num * 1e5) / 1e5;
15610
15725
  };
@@ -15771,7 +15886,7 @@ var VideoForRenderingForwardFunction = ({
15771
15886
  mediaVolume: 1
15772
15887
  });
15773
15888
  warnAboutTooHighVolume(volume);
15774
- useEffect21(() => {
15889
+ useEffect20(() => {
15775
15890
  if (!props2.src) {
15776
15891
  throw new Error("No src passed");
15777
15892
  }
@@ -15815,7 +15930,7 @@ var VideoForRenderingForwardFunction = ({
15815
15930
  return videoRef.current;
15816
15931
  }, []);
15817
15932
  useEmitVideoFrame({ ref: videoRef, onVideoFrame });
15818
- useEffect21(() => {
15933
+ useEffect20(() => {
15819
15934
  if (!window.remotion_videoEnabled) {
15820
15935
  return;
15821
15936
  }
@@ -15905,7 +16020,7 @@ var VideoForRenderingForwardFunction = ({
15905
16020
  ]);
15906
16021
  const { src } = props2;
15907
16022
  if (environment.isRendering) {
15908
- useLayoutEffect12(() => {
16023
+ useLayoutEffect13(() => {
15909
16024
  if (window.process?.env?.NODE_ENV === "test") {
15910
16025
  return;
15911
16026
  }
@@ -19009,7 +19124,7 @@ var extrudeAndTransformElement = (options) => {
19009
19124
  // ../design/dist/esm/index.mjs
19010
19125
  import { jsx as jsx212, Fragment as Fragment3 } from "react/jsx-runtime";
19011
19126
  import { jsx as jsx312, jsxs as jsxs5 } from "react/jsx-runtime";
19012
- import { useEffect as useEffect23, useMemo as useMemo210, useRef as useRef31 } from "react";
19127
+ import { useEffect as useEffect22, useMemo as useMemo210, useRef as useRef31 } from "react";
19013
19128
  import { jsx as jsx44 } from "react/jsx-runtime";
19014
19129
  import { jsx as jsx53, jsxs as jsxs22 } from "react/jsx-runtime";
19015
19130
  import React62 from "react";
@@ -19264,7 +19379,7 @@ var useHoverTransforms = (ref, disabled) => {
19264
19379
  isActive: false
19265
19380
  });
19266
19381
  const eventTarget = useMemo42(() => new EventTarget, []);
19267
- useEffect22(() => {
19382
+ useEffect21(() => {
19268
19383
  if (disabled) {
19269
19384
  eventTarget.dispatchEvent(new Event("disabled"));
19270
19385
  } else {
@@ -19411,7 +19526,7 @@ var getAngle = (ref, coordinates) => {
19411
19526
  var lastCoordinates = null;
19412
19527
  var useMousePosition = (ref) => {
19413
19528
  const [angle, setAngle] = useState21(getAngle(ref.current, lastCoordinates));
19414
- useEffect22(() => {
19529
+ useEffect21(() => {
19415
19530
  const element = ref.current;
19416
19531
  if (!element) {
19417
19532
  return;
@@ -19532,7 +19647,7 @@ var Spinner = ({ size, duration }) => {
19532
19647
  };
19533
19648
  }, [size]);
19534
19649
  const pathsRef = useRef31([]);
19535
- useEffect23(() => {
19650
+ useEffect22(() => {
19536
19651
  const animate = () => {
19537
19652
  const now = performance.now();
19538
19653
  for (let index = 0;index < lines; index++) {
@@ -27598,7 +27713,21 @@ var CompanyPricing = () => {
27598
27713
 
27599
27714
  // src/components/homepage/Pricing.tsx
27600
27715
  import { jsx as jsx47, jsxs as jsxs8 } from "react/jsx-runtime";
27601
- var Pricing = () => {
27716
+ var Pricing = ({
27717
+ faqHref = "/docs/license/faq",
27718
+ faqLabel = "License FAQ",
27719
+ licenseHref = "https://github.com/remotion-dev/remotion/blob/main/LICENSE.md",
27720
+ termsHref = "https://www.remotion.pro/terms"
27721
+ }) => {
27722
+ const faqLinkTarget = useMemo52(() => {
27723
+ return faqHref.startsWith("http") ? "_blank" : undefined;
27724
+ }, [faqHref]);
27725
+ const licenseLinkTarget = useMemo52(() => {
27726
+ return licenseHref.startsWith("http") ? "_blank" : undefined;
27727
+ }, [licenseHref]);
27728
+ const termsLinkTarget = useMemo52(() => {
27729
+ return termsHref.startsWith("http") ? "_blank" : undefined;
27730
+ }, [termsHref]);
27602
27731
  return /* @__PURE__ */ jsxs8("div", {
27603
27732
  style: {
27604
27733
  display: "flex",
@@ -27623,18 +27752,23 @@ var Pricing = () => {
27623
27752
  "See our",
27624
27753
  " ",
27625
27754
  /* @__PURE__ */ jsx47("a", {
27626
- target: "_blank",
27755
+ target: licenseLinkTarget,
27627
27756
  className: "bluelink",
27628
- href: "https://remotion.pro/faq",
27629
- children: "FAQ"
27757
+ href: licenseHref,
27758
+ children: "LICENSE.md"
27630
27759
  }),
27631
- " ",
27632
- "and",
27633
- " ",
27760
+ ", ",
27761
+ /* @__PURE__ */ jsx47("a", {
27762
+ target: faqLinkTarget,
27763
+ className: "bluelink",
27764
+ href: faqHref,
27765
+ children: faqLabel
27766
+ }),
27767
+ ", and ",
27634
27768
  /* @__PURE__ */ jsx47("a", {
27635
- target: "_blank",
27769
+ target: termsLinkTarget,
27636
27770
  className: "bluelink",
27637
- href: "https://www.remotion.pro/terms",
27771
+ href: termsHref,
27638
27772
  children: "Terms and Conditions"
27639
27773
  }),
27640
27774
  " ",