@remotion/promo-pages 4.0.486 → 4.0.488

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/Homepage.css +1 -1
  2. package/dist/Homepage.js +1147 -2270
  3. package/dist/components/Homepage.js +21 -5
  4. package/dist/components/homepage/CanvasSectionTitle.d.ts +4 -0
  5. package/dist/components/homepage/CanvasSectionTitle.js +14 -0
  6. package/dist/components/homepage/CommunityStatsItems.js +2 -2
  7. package/dist/components/homepage/Demo/DemoRender.d.ts +1 -1
  8. package/dist/components/homepage/Demo/DisplayedEmoji.js +3 -5
  9. package/dist/components/homepage/Demo/math.d.ts +1 -1
  10. package/dist/components/homepage/EditorStarterSection.d.ts +3 -0
  11. package/dist/components/homepage/EditorStarterSection.js +8 -0
  12. package/dist/components/homepage/GitHubButton.js +1 -1
  13. package/dist/components/homepage/MakeVideosAgentically.d.ts +10 -0
  14. package/dist/components/homepage/MakeVideosAgentically.js +37 -0
  15. package/dist/components/homepage/MakeVideosInteractively.d.ts +9 -0
  16. package/dist/components/homepage/MakeVideosInteractively.js +16 -0
  17. package/dist/components/homepage/MakeVideosLinks.d.ts +9 -0
  18. package/dist/components/homepage/MakeVideosLinks.js +17 -0
  19. package/dist/components/homepage/MakeVideosProgrammatically.d.ts +9 -0
  20. package/dist/components/homepage/MakeVideosProgrammatically.js +8 -0
  21. package/dist/components/homepage/Pricing.d.ts +1 -3
  22. package/dist/components/homepage/Pricing.js +2 -6
  23. package/dist/components/homepage/WriteInReact.js +1 -2
  24. package/dist/components/team/TrustSection.js +1 -1
  25. package/dist/design.js +241 -130
  26. package/dist/experts.js +230 -119
  27. package/dist/homepage/Pricing.js +255 -128
  28. package/dist/prompts/PromptsGallery.js +241 -130
  29. package/dist/prompts/PromptsShow.js +247 -136
  30. package/dist/prompts/PromptsSubmit.js +232 -121
  31. package/dist/tailwind.css +21 -3
  32. package/dist/team.js +232 -121
  33. package/dist/template-modal-content.css +1 -1
  34. package/dist/template-modal-content.js +238 -127
  35. package/dist/templates.js +232 -121
  36. package/package.json +17 -17
  37. package/public/img/editing-safari.mp4 +0 -0
  38. package/public/img/editing-vp9-chrome.webm +0 -0
  39. package/public/img/homepage-assets-master.mp4 +0 -0
  40. package/public/img/homepage-assets-master.webm +0 -0
  41. package/public/img/what-is-remotion.mp4 +0 -0
  42. package/public/img/what-is-remotion.webm +0 -0
@@ -1381,7 +1381,7 @@ var getDefaultConfig = () => {
1381
1381
  var twMerge = /* @__PURE__ */ createTailwindMerge(getDefaultConfig);
1382
1382
 
1383
1383
  // ../design/dist/esm/index.mjs
1384
- import React32, { useEffect as useEffect21, useMemo as useMemo42, useState as useState21 } from "react";
1384
+ import React32, { useEffect as useEffect21, useMemo as useMemo42, useState as useState23 } from "react";
1385
1385
 
1386
1386
  // ../paths/dist/esm/index.mjs
1387
1387
  var cutLInstruction = ({
@@ -4333,7 +4333,13 @@ import {
4333
4333
  import { jsx as jsx26 } from "react/jsx-runtime";
4334
4334
  import { forwardRef as forwardRef11, useCallback as useCallback18, useState as useState17 } from "react";
4335
4335
  import { jsx as jsx27 } from "react/jsx-runtime";
4336
- import { useCallback as useCallback19, useContext as useContext33, useLayoutEffect as useLayoutEffect11, useRef as useRef24 } from "react";
4336
+ import {
4337
+ useCallback as useCallback19,
4338
+ useContext as useContext33,
4339
+ useLayoutEffect as useLayoutEffect11,
4340
+ useRef as useRef24,
4341
+ useState as useState18
4342
+ } from "react";
4337
4343
  import { jsx as jsx28 } from "react/jsx-runtime";
4338
4344
  import React29, { forwardRef as forwardRef12, useCallback as useCallback20, useRef as useRef25 } from "react";
4339
4345
  import { jsx as jsx29 } from "react/jsx-runtime";
@@ -4344,7 +4350,7 @@ import {
4344
4350
  useImperativeHandle as useImperativeHandle8,
4345
4351
  useMemo as useMemo32,
4346
4352
  useRef as useRef26,
4347
- useState as useState18
4353
+ useState as useState19
4348
4354
  } from "react";
4349
4355
  import { jsx as jsx30 } from "react/jsx-runtime";
4350
4356
  import React31 from "react";
@@ -4362,7 +4368,7 @@ import {
4362
4368
  useEffect as useEffect17,
4363
4369
  useLayoutEffect as useLayoutEffect12,
4364
4370
  useMemo as useMemo35,
4365
- useState as useState19
4371
+ useState as useState20
4366
4372
  } from "react";
4367
4373
  import { jsx as jsx33 } from "react/jsx-runtime";
4368
4374
  import React37, {
@@ -4373,7 +4379,7 @@ import React37, {
4373
4379
  useImperativeHandle as useImperativeHandle9,
4374
4380
  useMemo as useMemo36,
4375
4381
  useRef as useRef27,
4376
- useState as useState20
4382
+ useState as useState21
4377
4383
  } from "react";
4378
4384
  import { useEffect as useEffect18 } from "react";
4379
4385
  import { jsx as jsx34 } from "react/jsx-runtime";
@@ -5568,7 +5574,7 @@ var getComponentsToAddStacksTo = () => componentsToAddStacksTo;
5568
5574
  var addSequenceStackTraces = (component) => {
5569
5575
  componentsToAddStacksTo.push(component);
5570
5576
  };
5571
- var VERSION = "4.0.486";
5577
+ var VERSION = "4.0.488";
5572
5578
  var checkMultipleRemotionVersions = () => {
5573
5579
  if (typeof globalThis === "undefined") {
5574
5580
  return;
@@ -9252,7 +9258,7 @@ var useEffectChainState = () => {
9252
9258
  }
9253
9259
  }), []);
9254
9260
  };
9255
- var CanvasRefForwardingFunction = ({ width, height, fit, className, style, effects }, ref) => {
9261
+ var CanvasRefForwardingFunction = ({ width, height, fit, className, style, effects, ...props }, ref) => {
9256
9262
  const canvasRef = useRef8(null);
9257
9263
  const chainState = useEffectChainState();
9258
9264
  const sourceCanvas = useMemo16(() => {
@@ -9316,7 +9322,8 @@ var CanvasRefForwardingFunction = ({ width, height, fit, className, style, effec
9316
9322
  return /* @__PURE__ */ jsx13("canvas", {
9317
9323
  ref: canvasRef,
9318
9324
  className,
9319
- style
9325
+ style,
9326
+ ...props
9320
9327
  });
9321
9328
  };
9322
9329
  var Canvas = React15.forwardRef(CanvasRefForwardingFunction);
@@ -9493,6 +9500,16 @@ var animatedImageSchema = {
9493
9500
  },
9494
9501
  ...transformSchema
9495
9502
  };
9503
+ var getCanvasPropsFromSequenceProps = (props) => {
9504
+ const canvasProps = {};
9505
+ const mutableCanvasProps = canvasProps;
9506
+ for (const key in props) {
9507
+ if (Object.prototype.hasOwnProperty.call(props, key) && (key.startsWith("data-") || key.startsWith("aria-"))) {
9508
+ mutableCanvasProps[key] = props[key];
9509
+ }
9510
+ }
9511
+ return canvasProps;
9512
+ };
9496
9513
  var AnimatedImageContent = forwardRef4(({
9497
9514
  src,
9498
9515
  width,
@@ -9647,6 +9664,7 @@ var AnimatedImageInner = ({
9647
9664
  useImperativeHandle2(ref, () => {
9648
9665
  return actualRef.current;
9649
9666
  }, []);
9667
+ const canvasProps = getCanvasPropsFromSequenceProps(sequenceProps);
9650
9668
  const animatedImageProps = {
9651
9669
  src,
9652
9670
  width,
@@ -9658,7 +9676,8 @@ var AnimatedImageInner = ({
9658
9676
  id,
9659
9677
  className,
9660
9678
  style,
9661
- requestInit
9679
+ requestInit,
9680
+ ...canvasProps
9662
9681
  };
9663
9682
  return /* @__PURE__ */ jsx14(Sequence, {
9664
9683
  layout: "none",
@@ -10595,6 +10614,7 @@ var SharedAudioContextProvider = ({ children, audioLatencyHint, audioEnabled, pr
10595
10614
  return ({
10596
10615
  node,
10597
10616
  mediaTimestamp,
10617
+ sourceOffset,
10598
10618
  scheduledTime,
10599
10619
  duration,
10600
10620
  offset,
@@ -10623,7 +10643,7 @@ var SharedAudioContextProvider = ({ children, audioLatencyHint, audioEnabled, pr
10623
10643
  }
10624
10644
  }
10625
10645
  const scheduledEndTime = scheduledTime + duration / node.playbackRate.value;
10626
- const mediaTime = mediaTimestamp + offset;
10646
+ const mediaTime = mediaTimestamp + offset - sourceOffset;
10627
10647
  const mediaEndTime = mediaTime + duration;
10628
10648
  const latency = ctxAndGain.audioContext.baseLatency + ctxAndGain.audioContext.outputLatency;
10629
10649
  const timeDiff = scheduledTime - ctxAndGain.audioContext.currentTime;
@@ -11438,7 +11458,8 @@ var useBufferManager = (logLevel, mountTime) => {
11438
11458
  if (rendering) {
11439
11459
  return;
11440
11460
  }
11441
- if (blocks.length > 0) {
11461
+ if (blocks.length > 0 && !buffering.current) {
11462
+ buffering.current = true;
11442
11463
  onBufferingCallbacks.forEach((c2) => c2());
11443
11464
  playbackLogging({
11444
11465
  logLevel,
@@ -11453,7 +11474,8 @@ var useBufferManager = (logLevel, mountTime) => {
11453
11474
  if (rendering) {
11454
11475
  return;
11455
11476
  }
11456
- if (blocks.length === 0) {
11477
+ if (blocks.length === 0 && buffering.current) {
11478
+ buffering.current = false;
11457
11479
  onResumeCallbacks.forEach((c2) => c2());
11458
11480
  playbackLogging({
11459
11481
  logLevel,
@@ -11486,15 +11508,11 @@ var useIsPlayerBuffering = (bufferManager) => {
11486
11508
  const onResume = () => {
11487
11509
  setIsBuffering(false);
11488
11510
  };
11489
- bufferManager.listenForBuffering(onBuffer);
11490
- bufferManager.listenForResume(onResume);
11511
+ const buffer = bufferManager.listenForBuffering(onBuffer);
11512
+ const resume = bufferManager.listenForResume(onResume);
11491
11513
  return () => {
11492
- bufferManager.listenForBuffering(() => {
11493
- return;
11494
- });
11495
- bufferManager.listenForResume(() => {
11496
- return;
11497
- });
11514
+ buffer.remove();
11515
+ resume.remove();
11498
11516
  };
11499
11517
  }, [bufferManager]);
11500
11518
  return isBuffering;
@@ -11618,6 +11636,72 @@ var useBufferUntilFirstFrame = ({
11618
11636
  };
11619
11637
  }, [bufferUntilFirstFrame]);
11620
11638
  };
11639
+ var getMediaSyncAction = (input) => {
11640
+ const {
11641
+ duration,
11642
+ currentTime,
11643
+ paused,
11644
+ ended,
11645
+ desiredUnclampedTime,
11646
+ mediaTagTime,
11647
+ mediaTagLastUpdate,
11648
+ rvcTime,
11649
+ rvcLastUpdate,
11650
+ isVariableFpsVideo,
11651
+ acceptableTimeShift,
11652
+ lastSeekDueToShift,
11653
+ playing,
11654
+ playbackRate,
11655
+ mediaTagBufferingOrStalled,
11656
+ playerBuffering,
11657
+ absoluteFrame,
11658
+ onlyWarnForMediaSeekingError,
11659
+ isPremounting,
11660
+ isPostmounting,
11661
+ pauseWhenBuffering
11662
+ } = input;
11663
+ const shouldBeTime = !Number.isNaN(duration) && Number.isFinite(duration) ? Math.min(duration, desiredUnclampedTime) : desiredUnclampedTime;
11664
+ const timeShiftMediaTag = Math.abs(shouldBeTime - mediaTagTime);
11665
+ const timeShiftRvcTag = rvcTime ? Math.abs(shouldBeTime - rvcTime) : null;
11666
+ const mostRecentTimeshift = rvcLastUpdate && rvcTime > mediaTagLastUpdate ? timeShiftRvcTag : timeShiftMediaTag;
11667
+ const timeShift = timeShiftRvcTag && !isVariableFpsVideo ? mostRecentTimeshift : timeShiftMediaTag;
11668
+ if (timeShift > acceptableTimeShift && lastSeekDueToShift !== shouldBeTime) {
11669
+ return {
11670
+ type: "seek-due-to-shift",
11671
+ shouldBeTime,
11672
+ why: `because time shift is too big. shouldBeTime = ${shouldBeTime}, isTime = ${mediaTagTime}, requestVideoCallbackTime = ${rvcTime}, timeShift = ${timeShift}${isVariableFpsVideo ? ", isVariableFpsVideo = true" : ""}, isPremounting = ${isPremounting}, isPostmounting = ${isPostmounting}, pauseWhenBuffering = ${pauseWhenBuffering}`,
11673
+ bufferUntilFirstFrame: playing && playbackRate > 0,
11674
+ playReason: playing && paused ? "player is playing but media tag is paused, and just seeked" : null,
11675
+ warnAboutNonSeekable: !onlyWarnForMediaSeekingError
11676
+ };
11677
+ }
11678
+ const seekThreshold = playing ? 0.15 : 0.01;
11679
+ const makesSenseToSeek = Math.abs(currentTime - shouldBeTime) > seekThreshold;
11680
+ const isSomethingElseBuffering = playerBuffering && !mediaTagBufferingOrStalled;
11681
+ if (!playing || isSomethingElseBuffering) {
11682
+ return {
11683
+ type: "seek-if-not-playing",
11684
+ shouldBeTime,
11685
+ why: makesSenseToSeek ? `not playing or something else is buffering. time offset is over seek threshold (${seekThreshold})` : null
11686
+ };
11687
+ }
11688
+ if (!playing || playerBuffering) {
11689
+ return { type: "none" };
11690
+ }
11691
+ const pausedCondition = paused && !ended;
11692
+ const firstFrameCondition = absoluteFrame === 0;
11693
+ if (pausedCondition || firstFrameCondition) {
11694
+ const reason = pausedCondition ? "media tag is paused" : "absolute frame is 0";
11695
+ return {
11696
+ type: "play-and-seek",
11697
+ shouldBeTime,
11698
+ why: makesSenseToSeek ? `is over timeshift threshold (threshold = ${seekThreshold}) and ${reason}` : null,
11699
+ playReason: `player is playing and ${reason}`,
11700
+ bufferUntilFirstFrame: !isVariableFpsVideo && playbackRate > 0
11701
+ };
11702
+ }
11703
+ return { type: "none" };
11704
+ };
11621
11705
  var useCurrentTimeOfMediaTagWithUpdateTimeStamp = (mediaRef) => {
11622
11706
  const lastUpdate = React21.useRef({
11623
11707
  time: mediaRef.current?.currentTime ?? 0,
@@ -12037,89 +12121,93 @@ var useMediaPlayback = ({
12037
12121
  if (!src) {
12038
12122
  throw new Error(`No 'src' attribute was passed to the ${tagName} element.`);
12039
12123
  }
12040
- const { duration } = mediaRef.current;
12041
- const shouldBeTime = !Number.isNaN(duration) && Number.isFinite(duration) ? Math.min(duration, desiredUnclampedTime) : desiredUnclampedTime;
12042
- const mediaTagTime = mediaTagCurrentTime.current.time;
12043
- const rvcTime = rvcCurrentTime.current?.time ?? null;
12044
- const isVariableFpsVideo = isVariableFpsVideoMap.current[src];
12045
- const timeShiftMediaTag = Math.abs(shouldBeTime - mediaTagTime);
12046
- const timeShiftRvcTag = rvcTime ? Math.abs(shouldBeTime - rvcTime) : null;
12047
- const mostRecentTimeshift = rvcCurrentTime.current?.lastUpdate && rvcCurrentTime.current.time > mediaTagCurrentTime.current.lastUpdate ? timeShiftRvcTag : timeShiftMediaTag;
12048
- const timeShift = timeShiftRvcTag && !isVariableFpsVideo ? mostRecentTimeshift : timeShiftMediaTag;
12049
- if (timeShift > acceptableTimeShiftButLessThanDuration && lastSeekDueToShift.current !== shouldBeTime) {
12124
+ const { current } = mediaRef;
12125
+ const action = getMediaSyncAction({
12126
+ duration: current.duration,
12127
+ currentTime: current.currentTime,
12128
+ paused: current.paused,
12129
+ ended: current.ended,
12130
+ desiredUnclampedTime,
12131
+ mediaTagTime: mediaTagCurrentTime.current.time,
12132
+ mediaTagLastUpdate: mediaTagCurrentTime.current.lastUpdate,
12133
+ rvcTime: rvcCurrentTime.current?.time ?? null,
12134
+ rvcLastUpdate: rvcCurrentTime.current?.lastUpdate ?? null,
12135
+ isVariableFpsVideo: Boolean(isVariableFpsVideoMap.current[src]),
12136
+ acceptableTimeShift: acceptableTimeShiftButLessThanDuration,
12137
+ lastSeekDueToShift: lastSeekDueToShift.current,
12138
+ playing,
12139
+ playbackRate,
12140
+ mediaTagBufferingOrStalled: isMediaTagBuffering || isBuffering(),
12141
+ playerBuffering: buffering.buffering.current,
12142
+ absoluteFrame,
12143
+ onlyWarnForMediaSeekingError,
12144
+ isPremounting,
12145
+ isPostmounting,
12146
+ pauseWhenBuffering
12147
+ });
12148
+ if (action.type === "none") {
12149
+ return;
12150
+ }
12151
+ if (action.type === "seek-due-to-shift") {
12050
12152
  lastSeek.current = seek({
12051
- mediaRef: mediaRef.current,
12052
- time: shouldBeTime,
12153
+ mediaRef: current,
12154
+ time: action.shouldBeTime,
12053
12155
  logLevel,
12054
- why: `because time shift is too big. shouldBeTime = ${shouldBeTime}, isTime = ${mediaTagTime}, requestVideoCallbackTime = ${rvcTime}, timeShift = ${timeShift}${isVariableFpsVideo ? ", isVariableFpsVideo = true" : ""}, isPremounting = ${isPremounting}, isPostmounting = ${isPostmounting}, pauseWhenBuffering = ${pauseWhenBuffering}`,
12156
+ why: action.why,
12055
12157
  mountTime
12056
12158
  });
12057
12159
  lastSeekDueToShift.current = lastSeek.current;
12058
- if (playing) {
12059
- if (playbackRate > 0) {
12060
- bufferUntilFirstFrame(shouldBeTime);
12061
- }
12062
- if (mediaRef.current.paused) {
12063
- playAndHandleNotAllowedError({
12064
- mediaRef,
12065
- mediaType,
12066
- onAutoPlayError,
12067
- logLevel,
12068
- mountTime,
12069
- reason: "player is playing but media tag is paused, and just seeked",
12070
- isPlayer: env.isPlayer
12071
- });
12072
- }
12073
- }
12074
- if (!onlyWarnForMediaSeekingError) {
12075
- warnAboutNonSeekableMedia(mediaRef.current, onlyWarnForMediaSeekingError ? "console-warning" : "console-error");
12160
+ if (action.bufferUntilFirstFrame) {
12161
+ bufferUntilFirstFrame(action.shouldBeTime);
12076
12162
  }
12077
- return;
12078
- }
12079
- const seekThreshold = playing ? 0.15 : 0.01;
12080
- const makesSenseToSeek = Math.abs(mediaRef.current.currentTime - shouldBeTime) > seekThreshold;
12081
- const isMediaTagBufferingOrStalled = isMediaTagBuffering || isBuffering();
12082
- const isSomethingElseBuffering = buffering.buffering.current && !isMediaTagBufferingOrStalled;
12083
- if (!playing || isSomethingElseBuffering) {
12084
- if (makesSenseToSeek) {
12085
- lastSeek.current = seek({
12086
- mediaRef: mediaRef.current,
12087
- time: shouldBeTime,
12163
+ if (action.playReason !== null) {
12164
+ playAndHandleNotAllowedError({
12165
+ mediaRef,
12166
+ mediaType,
12167
+ onAutoPlayError,
12088
12168
  logLevel,
12089
- why: `not playing or something else is buffering. time offset is over seek threshold (${seekThreshold})`,
12090
- mountTime
12169
+ mountTime,
12170
+ reason: action.playReason,
12171
+ isPlayer: env.isPlayer
12091
12172
  });
12092
12173
  }
12174
+ if (action.warnAboutNonSeekable) {
12175
+ warnAboutNonSeekableMedia(current, "console-error");
12176
+ }
12093
12177
  return;
12094
12178
  }
12095
- if (!playing || buffering.buffering.current) {
12096
- return;
12097
- }
12098
- const pausedCondition = mediaRef.current.paused && !mediaRef.current.ended;
12099
- const firstFrameCondition = absoluteFrame === 0;
12100
- if (pausedCondition || firstFrameCondition) {
12101
- const reason = pausedCondition ? "media tag is paused" : "absolute frame is 0";
12102
- if (makesSenseToSeek) {
12179
+ if (action.type === "seek-if-not-playing") {
12180
+ if (action.why !== null) {
12103
12181
  lastSeek.current = seek({
12104
- mediaRef: mediaRef.current,
12105
- time: shouldBeTime,
12182
+ mediaRef: current,
12183
+ time: action.shouldBeTime,
12106
12184
  logLevel,
12107
- why: `is over timeshift threshold (threshold = ${seekThreshold}) and ${reason}`,
12185
+ why: action.why,
12108
12186
  mountTime
12109
12187
  });
12110
12188
  }
12111
- playAndHandleNotAllowedError({
12112
- mediaRef,
12113
- mediaType,
12114
- onAutoPlayError,
12189
+ return;
12190
+ }
12191
+ if (action.why !== null) {
12192
+ lastSeek.current = seek({
12193
+ mediaRef: current,
12194
+ time: action.shouldBeTime,
12115
12195
  logLevel,
12116
- mountTime,
12117
- reason: `player is playing and ${reason}`,
12118
- isPlayer: env.isPlayer
12196
+ why: action.why,
12197
+ mountTime
12119
12198
  });
12120
- if (!isVariableFpsVideo && playbackRate > 0) {
12121
- bufferUntilFirstFrame(shouldBeTime);
12122
- }
12199
+ }
12200
+ playAndHandleNotAllowedError({
12201
+ mediaRef,
12202
+ mediaType,
12203
+ onAutoPlayError,
12204
+ logLevel,
12205
+ mountTime,
12206
+ reason: action.playReason,
12207
+ isPlayer: env.isPlayer
12208
+ });
12209
+ if (action.bufferUntilFirstFrame) {
12210
+ bufferUntilFirstFrame(action.shouldBeTime);
12123
12211
  }
12124
12212
  }, [
12125
12213
  absoluteFrame,
@@ -13352,13 +13440,18 @@ var CanvasImageContent = forwardRef10(({
13352
13440
  });
13353
13441
  const sequenceContext = useContext32(SequenceContext);
13354
13442
  const pendingLoadDelayRef = useRef23(null);
13355
- const continuePendingLoadDelay = useCallback17(() => {
13443
+ const [isLoadPending, setIsLoadPending] = useState16(false);
13444
+ const isPremounting = Boolean(sequenceContext?.premounting);
13445
+ const isPostmounting = Boolean(sequenceContext?.postmounting);
13446
+ const continuePendingLoadDelay = useCallback17(({ markAsReady }) => {
13356
13447
  const pending = pendingLoadDelayRef.current;
13357
13448
  if (!pending || pending.continued) {
13358
13449
  return;
13359
13450
  }
13360
13451
  pending.continued = true;
13361
- pending.unblock();
13452
+ if (markAsReady) {
13453
+ setIsLoadPending(false);
13454
+ }
13362
13455
  continueRender2(pending.handle);
13363
13456
  pendingLoadDelayRef.current = null;
13364
13457
  }, [continueRender2]);
@@ -13380,23 +13473,30 @@ var CanvasImageContent = forwardRef10(({
13380
13473
  }
13381
13474
  }, [ref, refForOutline]);
13382
13475
  useLayoutEffect10(() => {
13383
- const isPremounting = Boolean(sequenceContext?.premounting);
13384
- const isPostmounting = Boolean(sequenceContext?.postmounting);
13476
+ if (!pauseWhenLoading || !isLoadPending || isPremounting || isPostmounting) {
13477
+ return;
13478
+ }
13479
+ return delayPlayback().unblock;
13480
+ }, [
13481
+ delayPlayback,
13482
+ isLoadPending,
13483
+ isPostmounting,
13484
+ isPremounting,
13485
+ pauseWhenLoading
13486
+ ]);
13487
+ useLayoutEffect10(() => {
13385
13488
  const handle = delayRender2(`Rendering <CanvasImage> with src="${truncateSrcForLabel(actualSrc)}"`, {
13386
13489
  retries: delayRenderRetries ?? undefined,
13387
13490
  timeoutInMilliseconds: delayRenderTimeoutInMilliseconds ?? undefined
13388
13491
  });
13389
- const unblock = pauseWhenLoading && !isPremounting && !isPostmounting ? delayPlayback().unblock : () => {
13390
- return;
13391
- };
13392
13492
  const controller = new AbortController;
13393
13493
  let cancelled = false;
13394
13494
  let errorCount = 0;
13395
13495
  let timeoutId = null;
13396
13496
  setLoadedImage(null);
13497
+ setIsLoadPending(true);
13397
13498
  pendingLoadDelayRef.current = {
13398
13499
  handle,
13399
- unblock,
13400
13500
  continued: false
13401
13501
  };
13402
13502
  const attemptLoad = () => {
@@ -13407,7 +13507,7 @@ var CanvasImageContent = forwardRef10(({
13407
13507
  setLoadedImage(image);
13408
13508
  }).catch((err) => {
13409
13509
  if (err.name === "AbortError") {
13410
- continuePendingLoadDelay();
13510
+ continuePendingLoadDelay({ markAsReady: false });
13411
13511
  return;
13412
13512
  }
13413
13513
  errorCount++;
@@ -13421,7 +13521,7 @@ var CanvasImageContent = forwardRef10(({
13421
13521
  }, backoff);
13422
13522
  } else if (onError) {
13423
13523
  onError(err);
13424
- continuePendingLoadDelay();
13524
+ continuePendingLoadDelay({ markAsReady: true });
13425
13525
  } else {
13426
13526
  cancelRender2(err);
13427
13527
  }
@@ -13434,21 +13534,17 @@ var CanvasImageContent = forwardRef10(({
13434
13534
  clearTimeout(timeoutId);
13435
13535
  }
13436
13536
  controller.abort();
13437
- continuePendingLoadDelay();
13537
+ continuePendingLoadDelay({ markAsReady: false });
13438
13538
  };
13439
13539
  }, [
13440
13540
  actualSrc,
13441
13541
  cancelRender2,
13442
13542
  continuePendingLoadDelay,
13443
- delayPlayback,
13444
13543
  delayRender2,
13445
13544
  delayRenderRetries,
13446
13545
  delayRenderTimeoutInMilliseconds,
13447
13546
  maxRetries,
13448
- onError,
13449
- pauseWhenLoading,
13450
- sequenceContext?.postmounting,
13451
- sequenceContext?.premounting
13547
+ onError
13452
13548
  ]);
13453
13549
  useLayoutEffect10(() => {
13454
13550
  if (!loadedImage || !outputCanvas || !sourceCanvas) {
@@ -13500,7 +13596,7 @@ var CanvasImageContent = forwardRef10(({
13500
13596
  return;
13501
13597
  }
13502
13598
  continueRenderOnce();
13503
- continuePendingLoadDelay();
13599
+ continuePendingLoadDelay({ markAsReady: true });
13504
13600
  }
13505
13601
  });
13506
13602
  }
@@ -13511,7 +13607,7 @@ var CanvasImageContent = forwardRef10(({
13511
13607
  if (onError) {
13512
13608
  onError(err);
13513
13609
  continueRenderOnce();
13514
- continuePendingLoadDelay();
13610
+ continuePendingLoadDelay({ markAsReady: true });
13515
13611
  } else {
13516
13612
  cancelRender2(err);
13517
13613
  }
@@ -13682,6 +13778,7 @@ var ImgContent = ({
13682
13778
  const errors = useRef24({});
13683
13779
  const { delayPlayback } = useBufferState();
13684
13780
  const sequenceContext = useContext33(SequenceContext);
13781
+ const [isLoading, setIsLoading] = useState18(false);
13685
13782
  const _propsValid = true;
13686
13783
  if (!_propsValid) {
13687
13784
  throw new Error("typecheck error");
@@ -13714,6 +13811,8 @@ var ImgContent = ({
13714
13811
  }, timeout);
13715
13812
  }, []);
13716
13813
  const { delayRender: delayRender2, continueRender: continueRender2, cancelRender: cancelRender2 } = useDelayRender();
13814
+ const isPremounting = Boolean(sequenceContext?.premounting);
13815
+ const isPostmounting = Boolean(sequenceContext?.postmounting);
13717
13816
  const didGetError = useCallback19((e) => {
13718
13817
  if (!errors.current) {
13719
13818
  return;
@@ -13734,8 +13833,18 @@ var ImgContent = ({
13734
13833
  } catch {}
13735
13834
  }, [cancelRender2, maxRetries, onError, retryIn]);
13736
13835
  if (typeof window !== "undefined") {
13737
- const isPremounting = Boolean(sequenceContext?.premounting);
13738
- const isPostmounting = Boolean(sequenceContext?.postmounting);
13836
+ useLayoutEffect11(() => {
13837
+ if (!pauseWhenLoading || !isLoading || isPremounting || isPostmounting) {
13838
+ return;
13839
+ }
13840
+ return delayPlayback().unblock;
13841
+ }, [
13842
+ delayPlayback,
13843
+ isLoading,
13844
+ isPostmounting,
13845
+ isPremounting,
13846
+ pauseWhenLoading
13847
+ ]);
13739
13848
  useLayoutEffect11(() => {
13740
13849
  if (window.process?.env?.NODE_ENV === "test") {
13741
13850
  if (imageRef.current) {
@@ -13747,13 +13856,11 @@ var ImgContent = ({
13747
13856
  if (!current) {
13748
13857
  return;
13749
13858
  }
13859
+ setIsLoading(true);
13750
13860
  const newHandle = delayRender2("Loading <Img> with src=" + truncateSrcForLabel(actualSrc), {
13751
13861
  retries: delayRenderRetries ?? undefined,
13752
13862
  timeoutInMilliseconds: delayRenderTimeoutInMilliseconds ?? undefined
13753
13863
  });
13754
- const unblock = pauseWhenLoading && !isPremounting && !isPostmounting ? delayPlayback().unblock : () => {
13755
- return;
13756
- };
13757
13864
  let unmounted = false;
13758
13865
  const onComplete = () => {
13759
13866
  if (unmounted) {
@@ -13767,7 +13874,7 @@ var ImgContent = ({
13767
13874
  if (current) {
13768
13875
  onImageFrame?.(current);
13769
13876
  }
13770
- unblock();
13877
+ setIsLoading(false);
13771
13878
  continueRender2(newHandle);
13772
13879
  };
13773
13880
  if (!imageRef.current) {
@@ -13786,17 +13893,12 @@ var ImgContent = ({
13786
13893
  return () => {
13787
13894
  unmounted = true;
13788
13895
  current.removeEventListener("load", onComplete);
13789
- unblock();
13790
13896
  continueRender2(newHandle);
13791
13897
  };
13792
13898
  }, [
13793
13899
  actualSrc,
13794
- delayPlayback,
13795
13900
  delayRenderRetries,
13796
13901
  delayRenderTimeoutInMilliseconds,
13797
- pauseWhenLoading,
13798
- isPremounting,
13799
- isPostmounting,
13800
13902
  onImageFrame,
13801
13903
  continueRender2,
13802
13904
  delayRender2
@@ -14114,9 +14216,9 @@ var CompositionManagerProvider = ({
14114
14216
  initialCompositions,
14115
14217
  initialCanvasContent
14116
14218
  }) => {
14117
- const [folders, setFolders] = useState18([]);
14118
- const [canvasContent, setCanvasContent] = useState18(initialCanvasContent);
14119
- const [compositions, setCompositions] = useState18(initialCompositions);
14219
+ const [folders, setFolders] = useState19([]);
14220
+ const [canvasContent, setCanvasContent] = useState19(initialCanvasContent);
14221
+ const [compositions, setCompositions] = useState19(initialCompositions);
14120
14222
  const currentcompositionsRef = useRef26(compositions);
14121
14223
  const updateCompositions = useCallback21((updateComps) => {
14122
14224
  setCompositions((comps) => {
@@ -14687,7 +14789,7 @@ var OffthreadVideoForRendering = ({
14687
14789
  toneMapped
14688
14790
  });
14689
14791
  }, [toneMapped, currentTime, src, transparent]);
14690
- const [imageSrc, setImageSrc] = useState19(null);
14792
+ const [imageSrc, setImageSrc] = useState20(null);
14691
14793
  const { delayRender: delayRender2, continueRender: continueRender2 } = useDelayRender();
14692
14794
  useLayoutEffect12(() => {
14693
14795
  if (!window.remotion_videoEnabled) {
@@ -14891,7 +14993,7 @@ var VideoForDevelopmentRefForwardingFunction = (props2, ref) => {
14891
14993
  const parentSequence = useContext37(SequenceContext);
14892
14994
  const logLevel = useLogLevel();
14893
14995
  const mountTime = useMountTime();
14894
- const [timelineId] = useState20(() => String(Math.random()));
14996
+ const [timelineId] = useState21(() => String(Math.random()));
14895
14997
  if (typeof acceptableTimeShift !== "undefined") {
14896
14998
  throw new Error("acceptableTimeShift has been removed. Use acceptableTimeShiftInSeconds instead.");
14897
14999
  }
@@ -14962,7 +15064,7 @@ var VideoForDevelopmentRefForwardingFunction = (props2, ref) => {
14962
15064
  useImperativeHandle9(ref, () => {
14963
15065
  return videoRef.current;
14964
15066
  }, []);
14965
- useState20(() => playbackLogging({
15067
+ useState21(() => playbackLogging({
14966
15068
  logLevel,
14967
15069
  message: `Mounting video with source = ${actualSrc}, v=${VERSION}, user agent=${typeof navigator === "undefined" ? "server" : navigator.userAgent}`,
14968
15070
  tag: "video",
@@ -15643,6 +15745,15 @@ var staticFile = (path) => {
15643
15745
  }
15644
15746
  return preparsed;
15645
15747
  };
15748
+ var Still = (props2) => {
15749
+ const newProps = {
15750
+ ...props2,
15751
+ durationInFrames: 1,
15752
+ fps: 1
15753
+ };
15754
+ return React42.createElement(Composition, newProps);
15755
+ };
15756
+ addSequenceStackTraces(Still);
15646
15757
  var roundTo6Commas = (num) => {
15647
15758
  return Math.round(num * 1e5) / 1e5;
15648
15759
  };
@@ -19448,7 +19559,7 @@ var getAngle = (ref, coordinates) => {
19448
19559
  };
19449
19560
  var lastCoordinates = null;
19450
19561
  var useMousePosition = (ref) => {
19451
- const [angle, setAngle] = useState21(getAngle(ref.current, lastCoordinates));
19562
+ const [angle, setAngle] = useState23(getAngle(ref.current, lastCoordinates));
19452
19563
  useEffect21(() => {
19453
19564
  const element = ref.current;
19454
19565
  if (!element) {
@@ -27636,10 +27747,21 @@ var CompanyPricing = () => {
27636
27747
 
27637
27748
  // src/components/homepage/Pricing.tsx
27638
27749
  import { jsx as jsx47, jsxs as jsxs8 } from "react/jsx-runtime";
27639
- var Pricing = ({ faqHref = "/docs/pricing#faq" }) => {
27750
+ var Pricing = ({
27751
+ faqHref = "/docs/license/faq",
27752
+ faqLabel = "License FAQ",
27753
+ licenseHref = "https://github.com/remotion-dev/remotion/blob/main/LICENSE.md",
27754
+ termsHref = "https://www.remotion.pro/terms"
27755
+ }) => {
27640
27756
  const faqLinkTarget = useMemo52(() => {
27641
27757
  return faqHref.startsWith("http") ? "_blank" : undefined;
27642
27758
  }, [faqHref]);
27759
+ const licenseLinkTarget = useMemo52(() => {
27760
+ return licenseHref.startsWith("http") ? "_blank" : undefined;
27761
+ }, [licenseHref]);
27762
+ const termsLinkTarget = useMemo52(() => {
27763
+ return termsHref.startsWith("http") ? "_blank" : undefined;
27764
+ }, [termsHref]);
27643
27765
  return /* @__PURE__ */ jsxs8("div", {
27644
27766
  style: {
27645
27767
  display: "flex",
@@ -27663,19 +27785,24 @@ var Pricing = ({ faqHref = "/docs/pricing#faq" }) => {
27663
27785
  children: [
27664
27786
  "See our",
27665
27787
  " ",
27788
+ /* @__PURE__ */ jsx47("a", {
27789
+ target: licenseLinkTarget,
27790
+ className: "bluelink",
27791
+ href: licenseHref,
27792
+ children: "LICENSE.md"
27793
+ }),
27794
+ ", ",
27666
27795
  /* @__PURE__ */ jsx47("a", {
27667
27796
  target: faqLinkTarget,
27668
27797
  className: "bluelink",
27669
27798
  href: faqHref,
27670
- children: "FAQ"
27799
+ children: faqLabel
27671
27800
  }),
27672
- " ",
27673
- "and",
27674
- " ",
27801
+ ", and ",
27675
27802
  /* @__PURE__ */ jsx47("a", {
27676
- target: "_blank",
27803
+ target: termsLinkTarget,
27677
27804
  className: "bluelink",
27678
- href: "https://www.remotion.pro/terms",
27805
+ href: termsHref,
27679
27806
  children: "Terms and Conditions"
27680
27807
  }),
27681
27808
  " ",