@remotion/promo-pages 4.0.486 → 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/Homepage.js CHANGED
@@ -2335,7 +2335,7 @@ var getComponentsToAddStacksTo = () => componentsToAddStacksTo;
2335
2335
  var addSequenceStackTraces = (component) => {
2336
2336
  componentsToAddStacksTo.push(component);
2337
2337
  };
2338
- var VERSION = "4.0.486";
2338
+ var VERSION = "4.0.487";
2339
2339
  var checkMultipleRemotionVersions = () => {
2340
2340
  if (typeof globalThis === "undefined") {
2341
2341
  return;
@@ -8205,7 +8205,8 @@ var useBufferManager = (logLevel, mountTime) => {
8205
8205
  if (rendering) {
8206
8206
  return;
8207
8207
  }
8208
- if (blocks.length > 0) {
8208
+ if (blocks.length > 0 && !buffering.current) {
8209
+ buffering.current = true;
8209
8210
  onBufferingCallbacks.forEach((c2) => c2());
8210
8211
  playbackLogging({
8211
8212
  logLevel,
@@ -8220,7 +8221,8 @@ var useBufferManager = (logLevel, mountTime) => {
8220
8221
  if (rendering) {
8221
8222
  return;
8222
8223
  }
8223
- if (blocks.length === 0) {
8224
+ if (blocks.length === 0 && buffering.current) {
8225
+ buffering.current = false;
8224
8226
  onResumeCallbacks.forEach((c2) => c2());
8225
8227
  playbackLogging({
8226
8228
  logLevel,
@@ -8253,15 +8255,11 @@ var useIsPlayerBuffering = (bufferManager) => {
8253
8255
  const onResume = () => {
8254
8256
  setIsBuffering(false);
8255
8257
  };
8256
- bufferManager.listenForBuffering(onBuffer);
8257
- bufferManager.listenForResume(onResume);
8258
+ const buffer = bufferManager.listenForBuffering(onBuffer);
8259
+ const resume = bufferManager.listenForResume(onResume);
8258
8260
  return () => {
8259
- bufferManager.listenForBuffering(() => {
8260
- return;
8261
- });
8262
- bufferManager.listenForResume(() => {
8263
- return;
8264
- });
8261
+ buffer.remove();
8262
+ resume.remove();
8265
8263
  };
8266
8264
  }, [bufferManager]);
8267
8265
  return isBuffering;
@@ -8385,6 +8383,72 @@ var useBufferUntilFirstFrame = ({
8385
8383
  };
8386
8384
  }, [bufferUntilFirstFrame]);
8387
8385
  };
8386
+ var getMediaSyncAction = (input) => {
8387
+ const {
8388
+ duration,
8389
+ currentTime,
8390
+ paused,
8391
+ ended,
8392
+ desiredUnclampedTime,
8393
+ mediaTagTime,
8394
+ mediaTagLastUpdate,
8395
+ rvcTime,
8396
+ rvcLastUpdate,
8397
+ isVariableFpsVideo,
8398
+ acceptableTimeShift,
8399
+ lastSeekDueToShift,
8400
+ playing,
8401
+ playbackRate,
8402
+ mediaTagBufferingOrStalled,
8403
+ playerBuffering,
8404
+ absoluteFrame,
8405
+ onlyWarnForMediaSeekingError,
8406
+ isPremounting,
8407
+ isPostmounting,
8408
+ pauseWhenBuffering
8409
+ } = input;
8410
+ const shouldBeTime = !Number.isNaN(duration) && Number.isFinite(duration) ? Math.min(duration, desiredUnclampedTime) : desiredUnclampedTime;
8411
+ const timeShiftMediaTag = Math.abs(shouldBeTime - mediaTagTime);
8412
+ const timeShiftRvcTag = rvcTime ? Math.abs(shouldBeTime - rvcTime) : null;
8413
+ const mostRecentTimeshift = rvcLastUpdate && rvcTime > mediaTagLastUpdate ? timeShiftRvcTag : timeShiftMediaTag;
8414
+ const timeShift = timeShiftRvcTag && !isVariableFpsVideo ? mostRecentTimeshift : timeShiftMediaTag;
8415
+ if (timeShift > acceptableTimeShift && lastSeekDueToShift !== shouldBeTime) {
8416
+ return {
8417
+ type: "seek-due-to-shift",
8418
+ shouldBeTime,
8419
+ why: `because time shift is too big. shouldBeTime = ${shouldBeTime}, isTime = ${mediaTagTime}, requestVideoCallbackTime = ${rvcTime}, timeShift = ${timeShift}${isVariableFpsVideo ? ", isVariableFpsVideo = true" : ""}, isPremounting = ${isPremounting}, isPostmounting = ${isPostmounting}, pauseWhenBuffering = ${pauseWhenBuffering}`,
8420
+ bufferUntilFirstFrame: playing && playbackRate > 0,
8421
+ playReason: playing && paused ? "player is playing but media tag is paused, and just seeked" : null,
8422
+ warnAboutNonSeekable: !onlyWarnForMediaSeekingError
8423
+ };
8424
+ }
8425
+ const seekThreshold = playing ? 0.15 : 0.01;
8426
+ const makesSenseToSeek = Math.abs(currentTime - shouldBeTime) > seekThreshold;
8427
+ const isSomethingElseBuffering = playerBuffering && !mediaTagBufferingOrStalled;
8428
+ if (!playing || isSomethingElseBuffering) {
8429
+ return {
8430
+ type: "seek-if-not-playing",
8431
+ shouldBeTime,
8432
+ why: makesSenseToSeek ? `not playing or something else is buffering. time offset is over seek threshold (${seekThreshold})` : null
8433
+ };
8434
+ }
8435
+ if (!playing || playerBuffering) {
8436
+ return { type: "none" };
8437
+ }
8438
+ const pausedCondition = paused && !ended;
8439
+ const firstFrameCondition = absoluteFrame === 0;
8440
+ if (pausedCondition || firstFrameCondition) {
8441
+ const reason = pausedCondition ? "media tag is paused" : "absolute frame is 0";
8442
+ return {
8443
+ type: "play-and-seek",
8444
+ shouldBeTime,
8445
+ why: makesSenseToSeek ? `is over timeshift threshold (threshold = ${seekThreshold}) and ${reason}` : null,
8446
+ playReason: `player is playing and ${reason}`,
8447
+ bufferUntilFirstFrame: !isVariableFpsVideo && playbackRate > 0
8448
+ };
8449
+ }
8450
+ return { type: "none" };
8451
+ };
8388
8452
  var useCurrentTimeOfMediaTagWithUpdateTimeStamp = (mediaRef) => {
8389
8453
  const lastUpdate = React21.useRef({
8390
8454
  time: mediaRef.current?.currentTime ?? 0,
@@ -8804,89 +8868,93 @@ var useMediaPlayback = ({
8804
8868
  if (!src) {
8805
8869
  throw new Error(`No 'src' attribute was passed to the ${tagName} element.`);
8806
8870
  }
8807
- const { duration } = mediaRef.current;
8808
- const shouldBeTime = !Number.isNaN(duration) && Number.isFinite(duration) ? Math.min(duration, desiredUnclampedTime) : desiredUnclampedTime;
8809
- const mediaTagTime = mediaTagCurrentTime.current.time;
8810
- const rvcTime = rvcCurrentTime.current?.time ?? null;
8811
- const isVariableFpsVideo = isVariableFpsVideoMap.current[src];
8812
- const timeShiftMediaTag = Math.abs(shouldBeTime - mediaTagTime);
8813
- const timeShiftRvcTag = rvcTime ? Math.abs(shouldBeTime - rvcTime) : null;
8814
- const mostRecentTimeshift = rvcCurrentTime.current?.lastUpdate && rvcCurrentTime.current.time > mediaTagCurrentTime.current.lastUpdate ? timeShiftRvcTag : timeShiftMediaTag;
8815
- const timeShift = timeShiftRvcTag && !isVariableFpsVideo ? mostRecentTimeshift : timeShiftMediaTag;
8816
- if (timeShift > acceptableTimeShiftButLessThanDuration && lastSeekDueToShift.current !== shouldBeTime) {
8871
+ const { current } = mediaRef;
8872
+ const action = getMediaSyncAction({
8873
+ duration: current.duration,
8874
+ currentTime: current.currentTime,
8875
+ paused: current.paused,
8876
+ ended: current.ended,
8877
+ desiredUnclampedTime,
8878
+ mediaTagTime: mediaTagCurrentTime.current.time,
8879
+ mediaTagLastUpdate: mediaTagCurrentTime.current.lastUpdate,
8880
+ rvcTime: rvcCurrentTime.current?.time ?? null,
8881
+ rvcLastUpdate: rvcCurrentTime.current?.lastUpdate ?? null,
8882
+ isVariableFpsVideo: Boolean(isVariableFpsVideoMap.current[src]),
8883
+ acceptableTimeShift: acceptableTimeShiftButLessThanDuration,
8884
+ lastSeekDueToShift: lastSeekDueToShift.current,
8885
+ playing,
8886
+ playbackRate,
8887
+ mediaTagBufferingOrStalled: isMediaTagBuffering || isBuffering(),
8888
+ playerBuffering: buffering.buffering.current,
8889
+ absoluteFrame,
8890
+ onlyWarnForMediaSeekingError,
8891
+ isPremounting,
8892
+ isPostmounting,
8893
+ pauseWhenBuffering
8894
+ });
8895
+ if (action.type === "none") {
8896
+ return;
8897
+ }
8898
+ if (action.type === "seek-due-to-shift") {
8817
8899
  lastSeek.current = seek({
8818
- mediaRef: mediaRef.current,
8819
- time: shouldBeTime,
8900
+ mediaRef: current,
8901
+ time: action.shouldBeTime,
8820
8902
  logLevel,
8821
- why: `because time shift is too big. shouldBeTime = ${shouldBeTime}, isTime = ${mediaTagTime}, requestVideoCallbackTime = ${rvcTime}, timeShift = ${timeShift}${isVariableFpsVideo ? ", isVariableFpsVideo = true" : ""}, isPremounting = ${isPremounting}, isPostmounting = ${isPostmounting}, pauseWhenBuffering = ${pauseWhenBuffering}`,
8903
+ why: action.why,
8822
8904
  mountTime
8823
8905
  });
8824
8906
  lastSeekDueToShift.current = lastSeek.current;
8825
- if (playing) {
8826
- if (playbackRate > 0) {
8827
- bufferUntilFirstFrame(shouldBeTime);
8828
- }
8829
- if (mediaRef.current.paused) {
8830
- playAndHandleNotAllowedError({
8831
- mediaRef,
8832
- mediaType,
8833
- onAutoPlayError,
8834
- logLevel,
8835
- mountTime,
8836
- reason: "player is playing but media tag is paused, and just seeked",
8837
- isPlayer: env.isPlayer
8838
- });
8839
- }
8840
- }
8841
- if (!onlyWarnForMediaSeekingError) {
8842
- warnAboutNonSeekableMedia(mediaRef.current, onlyWarnForMediaSeekingError ? "console-warning" : "console-error");
8907
+ if (action.bufferUntilFirstFrame) {
8908
+ bufferUntilFirstFrame(action.shouldBeTime);
8843
8909
  }
8844
- return;
8845
- }
8846
- const seekThreshold = playing ? 0.15 : 0.01;
8847
- const makesSenseToSeek = Math.abs(mediaRef.current.currentTime - shouldBeTime) > seekThreshold;
8848
- const isMediaTagBufferingOrStalled = isMediaTagBuffering || isBuffering();
8849
- const isSomethingElseBuffering = buffering.buffering.current && !isMediaTagBufferingOrStalled;
8850
- if (!playing || isSomethingElseBuffering) {
8851
- if (makesSenseToSeek) {
8852
- lastSeek.current = seek({
8853
- mediaRef: mediaRef.current,
8854
- time: shouldBeTime,
8910
+ if (action.playReason !== null) {
8911
+ playAndHandleNotAllowedError({
8912
+ mediaRef,
8913
+ mediaType,
8914
+ onAutoPlayError,
8855
8915
  logLevel,
8856
- why: `not playing or something else is buffering. time offset is over seek threshold (${seekThreshold})`,
8857
- mountTime
8916
+ mountTime,
8917
+ reason: action.playReason,
8918
+ isPlayer: env.isPlayer
8858
8919
  });
8859
8920
  }
8921
+ if (action.warnAboutNonSeekable) {
8922
+ warnAboutNonSeekableMedia(current, "console-error");
8923
+ }
8860
8924
  return;
8861
8925
  }
8862
- if (!playing || buffering.buffering.current) {
8863
- return;
8864
- }
8865
- const pausedCondition = mediaRef.current.paused && !mediaRef.current.ended;
8866
- const firstFrameCondition = absoluteFrame === 0;
8867
- if (pausedCondition || firstFrameCondition) {
8868
- const reason = pausedCondition ? "media tag is paused" : "absolute frame is 0";
8869
- if (makesSenseToSeek) {
8926
+ if (action.type === "seek-if-not-playing") {
8927
+ if (action.why !== null) {
8870
8928
  lastSeek.current = seek({
8871
- mediaRef: mediaRef.current,
8872
- time: shouldBeTime,
8929
+ mediaRef: current,
8930
+ time: action.shouldBeTime,
8873
8931
  logLevel,
8874
- why: `is over timeshift threshold (threshold = ${seekThreshold}) and ${reason}`,
8932
+ why: action.why,
8875
8933
  mountTime
8876
8934
  });
8877
8935
  }
8878
- playAndHandleNotAllowedError({
8879
- mediaRef,
8880
- mediaType,
8881
- onAutoPlayError,
8936
+ return;
8937
+ }
8938
+ if (action.why !== null) {
8939
+ lastSeek.current = seek({
8940
+ mediaRef: current,
8941
+ time: action.shouldBeTime,
8882
8942
  logLevel,
8883
- mountTime,
8884
- reason: `player is playing and ${reason}`,
8885
- isPlayer: env.isPlayer
8943
+ why: action.why,
8944
+ mountTime
8886
8945
  });
8887
- if (!isVariableFpsVideo && playbackRate > 0) {
8888
- bufferUntilFirstFrame(shouldBeTime);
8889
- }
8946
+ }
8947
+ playAndHandleNotAllowedError({
8948
+ mediaRef,
8949
+ mediaType,
8950
+ onAutoPlayError,
8951
+ logLevel,
8952
+ mountTime,
8953
+ reason: action.playReason,
8954
+ isPlayer: env.isPlayer
8955
+ });
8956
+ if (action.bufferUntilFirstFrame) {
8957
+ bufferUntilFirstFrame(action.shouldBeTime);
8890
8958
  }
8891
8959
  }, [
8892
8960
  absoluteFrame,
@@ -12410,6 +12478,15 @@ var staticFile = (path) => {
12410
12478
  }
12411
12479
  return preparsed;
12412
12480
  };
12481
+ var Still = (props2) => {
12482
+ const newProps = {
12483
+ ...props2,
12484
+ durationInFrames: 1,
12485
+ fps: 1
12486
+ };
12487
+ return React42.createElement(Composition, newProps);
12488
+ };
12489
+ addSequenceStackTraces(Still);
12413
12490
  var roundTo6Commas = (num) => {
12414
12491
  return Math.round(num * 1e5) / 1e5;
12415
12492
  };
@@ -28952,10 +29029,21 @@ var CompanyPricing = () => {
28952
29029
 
28953
29030
  // src/components/homepage/Pricing.tsx
28954
29031
  import { jsx as jsx50, jsxs as jsxs9 } from "react/jsx-runtime";
28955
- var Pricing = ({ faqHref = "/docs/pricing#faq" }) => {
29032
+ var Pricing = ({
29033
+ faqHref = "/docs/license/faq",
29034
+ faqLabel = "License FAQ",
29035
+ licenseHref = "https://github.com/remotion-dev/remotion/blob/main/LICENSE.md",
29036
+ termsHref = "https://www.remotion.pro/terms"
29037
+ }) => {
28956
29038
  const faqLinkTarget = useMemo53(() => {
28957
29039
  return faqHref.startsWith("http") ? "_blank" : undefined;
28958
29040
  }, [faqHref]);
29041
+ const licenseLinkTarget = useMemo53(() => {
29042
+ return licenseHref.startsWith("http") ? "_blank" : undefined;
29043
+ }, [licenseHref]);
29044
+ const termsLinkTarget = useMemo53(() => {
29045
+ return termsHref.startsWith("http") ? "_blank" : undefined;
29046
+ }, [termsHref]);
28959
29047
  return /* @__PURE__ */ jsxs9("div", {
28960
29048
  style: {
28961
29049
  display: "flex",
@@ -28979,19 +29067,24 @@ var Pricing = ({ faqHref = "/docs/pricing#faq" }) => {
28979
29067
  children: [
28980
29068
  "See our",
28981
29069
  " ",
29070
+ /* @__PURE__ */ jsx50("a", {
29071
+ target: licenseLinkTarget,
29072
+ className: "bluelink",
29073
+ href: licenseHref,
29074
+ children: "LICENSE.md"
29075
+ }),
29076
+ ", ",
28982
29077
  /* @__PURE__ */ jsx50("a", {
28983
29078
  target: faqLinkTarget,
28984
29079
  className: "bluelink",
28985
29080
  href: faqHref,
28986
- children: "FAQ"
29081
+ children: faqLabel
28987
29082
  }),
28988
- " ",
28989
- "and",
28990
- " ",
29083
+ ", and ",
28991
29084
  /* @__PURE__ */ jsx50("a", {
28992
- target: "_blank",
29085
+ target: termsLinkTarget,
28993
29086
  className: "bluelink",
28994
- href: "https://www.remotion.pro/terms",
29087
+ href: termsHref,
28995
29088
  children: "Terms and Conditions"
28996
29089
  }),
28997
29090
  " ",
@@ -29485,7 +29578,7 @@ var InstallsPerMonth = () => {
29485
29578
  },
29486
29579
  children: [
29487
29580
  /* @__PURE__ */ jsx57(StatItemContent, {
29488
- content: "3M+",
29581
+ content: "4M+",
29489
29582
  width: "100px",
29490
29583
  fontSize: "2.5rem",
29491
29584
  fontWeight: "bold"
@@ -29507,7 +29600,7 @@ var InstallsPerMonth = () => {
29507
29600
  ]
29508
29601
  }),
29509
29602
  /* @__PURE__ */ jsx57(StatItemContent, {
29510
- content: "installs",
29603
+ content: "installs per month",
29511
29604
  width: "75%",
29512
29605
  fontSize: "1.0rem",
29513
29606
  fontWeight: "bold"
@@ -29768,8 +29861,8 @@ var CommunityStats_default = CommunityStats;
29768
29861
 
29769
29862
  // ../player/dist/esm/index.mjs
29770
29863
  import { createContext as createContext32 } from "react";
29771
- import { jsx as jsx59, jsxs as jsxs14, Fragment as Fragment12 } from "react/jsx-runtime";
29772
- import { jsx as jsx214, jsxs as jsxs24, Fragment as Fragment23 } from "react/jsx-runtime";
29864
+ import { jsx as jsx59, jsxs as jsxs14 } from "react/jsx-runtime";
29865
+ import { jsx as jsx214, jsxs as jsxs24, Fragment as Fragment12 } from "react/jsx-runtime";
29773
29866
  import React57 from "react";
29774
29867
  import { useContext as useContext210, useEffect as useEffect41, useState as useState38 } from "react";
29775
29868
  import { useContext as useContext46, useLayoutEffect as useLayoutEffect18 } from "react";
@@ -29819,10 +29912,10 @@ import { jsx as jsx104, jsxs as jsxs62 } from "react/jsx-runtime";
29819
29912
  import { useMemo as useMemo72 } from "react";
29820
29913
  import { jsxs as jsxs72 } from "react/jsx-runtime";
29821
29914
  import { useMemo as useMemo82 } from "react";
29822
- import { jsx as jsx114, jsxs as jsxs82, Fragment as Fragment32 } from "react/jsx-runtime";
29915
+ import { jsx as jsx114, jsxs as jsxs82, Fragment as Fragment23 } from "react/jsx-runtime";
29823
29916
  import { useCallback as useCallback92, useMemo as useMemo112 } from "react";
29824
29917
  import { useCallback as useCallback82, useMemo as useMemo102, useRef as useRef92 } from "react";
29825
- import { jsx as jsx124, jsxs as jsxs92, Fragment as Fragment42 } from "react/jsx-runtime";
29918
+ import { jsx as jsx124, jsxs as jsxs92, Fragment as Fragment32 } from "react/jsx-runtime";
29826
29919
  import { useCallback as useCallback112, useMemo as useMemo132, useState as useState122 } from "react";
29827
29920
  import { jsx as jsx133 } from "react/jsx-runtime";
29828
29921
 
@@ -31315,113 +31408,27 @@ if (typeof createContext32 !== "function") {
31315
31408
  }
31316
31409
  var ICON_SIZE2 = 25;
31317
31410
  var fullscreenIconSize = 16;
31318
- var focusRingFallbackColor = "Highlight";
31319
- var focusRingColor = "-webkit-focus-ring-color";
31320
- var focusRingStyle = {
31321
- stroke: focusRingColor
31322
- };
31323
- var playPath = "M8 6.375C7.40904 8.17576 7.06921 10.2486 7.01438 12.3871C6.95955 14.5255 7.19163 16.6547 7.6875 18.5625C9.95364 18.2995 12.116 17.6164 14.009 16.5655C15.902 15.5147 17.4755 14.124 18.6088 12.5C17.5158 10.8949 15.9949 9.51103 14.1585 8.45082C12.3222 7.3906 10.2174 6.68116 8 6.375Z";
31324
- var playFocusPath = "M93.4691 0.0367432C84.4873 0.520935 77.2494 1.93634 69.9553 4.69266C66.3176 6.05219 60.3548 9.0134 57.0734 11.062C43.3476 19.6103 32.8846 32.4606 27.428 47.4154C26.3405 50.3766 23.3966 59.8188 21.5027 66.3185C8.88329 109.768 1.7204 157.277 0.182822 207.561C-0.0609408 215.569 -0.0609408 234.639 0.182822 242.517C1.21413 275.854 4.42055 305.949 10.2334 336.641C12.596 349.063 16.3837 365.75 18.5776 373.33C23.059 388.732 32.2095 401.843 45.2227 411.453C53.9419 417.896 63.8425 422.217 74.8118 424.34C80.0996 425.365 87.075 425.83 92.2127 425.495C99.3194 425.029 113.42 423.148 124.877 421.118C176.517 411.974 224.22 395.604 267.478 372.175C294.874 357.332 318.294 341.26 340.888 321.761C363.408 302.355 382.609 281.478 399.504 258.049C403.423 252.63 405.392 249.464 407.361 245.478C412.424 235.198 414.805 224.974 414.786 213.539C414.786 202.886 412.761 193.425 408.392 183.741C406.292 179.066 404.286 175.714 399.785 169.345C383.21 145.898 364.815 125.467 342.389 105.614C307.624 74.8481 266.335 49.613 220.226 30.9334C210.232 26.8921 200.387 23.335 188.537 19.4799C163.448 11.3413 132.396 4.28293 106.126 0.763062C102.001 0.204346 96.3942 -0.112244 93.4691 0.0367432Z";
31325
- var playIconStrokeWidth = 6.25;
31326
- var playFocusStrokeWidth = 1.5;
31327
- var playFocusPadding = 2;
31328
- var playPathBounds = {
31329
- x1: 7.006500987565134,
31330
- y1: 6.375,
31331
- x2: 18.6088,
31332
- y2: 18.5625
31333
- };
31334
- var playFocusPathBounds = {
31335
- x1: -0.00000009999999999649709,
31336
- y1: 0.000013203698169792638,
31337
- x2: 414.7861127950162,
31338
- y2: 425.60252460486765
31339
- };
31340
- var expandBounds = (bounds, padding) => {
31341
- return {
31342
- x1: bounds.x1 - padding,
31343
- y1: bounds.y1 - padding,
31344
- x2: bounds.x2 + padding,
31345
- y2: bounds.y2 + padding
31346
- };
31347
- };
31348
- var getBoundsWidth = (bounds) => bounds.x2 - bounds.x1;
31349
- var getBoundsHeight = (bounds) => bounds.y2 - bounds.y1;
31350
- var fitBoundsTransform = ({
31351
- source,
31352
- target
31353
- }) => {
31354
- const scale = Math.min(getBoundsWidth(target) / getBoundsWidth(source), getBoundsHeight(target) / getBoundsHeight(source));
31355
- const x = target.x1 + (getBoundsWidth(target) - getBoundsWidth(source) * scale) / 2 - source.x1 * scale;
31356
- const y = target.y1 + (getBoundsHeight(target) - getBoundsHeight(source) * scale) / 2 - source.y1 * scale;
31357
- return `translate(${x.toFixed(4)} ${y.toFixed(4)}) scale(${scale.toFixed(5)})`;
31358
- };
31359
- var playFocusTransform = fitBoundsTransform({
31360
- source: playFocusPathBounds,
31361
- target: expandBounds(expandBounds(playPathBounds, playIconStrokeWidth / 2), playFocusPadding)
31362
- });
31363
- var PlayIcon = ({ focused }) => {
31364
- return /* @__PURE__ */ jsxs14("svg", {
31411
+ var PlayIcon = () => {
31412
+ return /* @__PURE__ */ jsx59("svg", {
31365
31413
  width: ICON_SIZE2,
31366
31414
  height: ICON_SIZE2,
31367
31415
  viewBox: "0 0 25 25",
31368
31416
  fill: "none",
31369
- children: [
31370
- focused ? /* @__PURE__ */ jsx59("path", {
31371
- d: playFocusPath,
31372
- fill: "none",
31373
- stroke: focusRingFallbackColor,
31374
- strokeWidth: playFocusStrokeWidth,
31375
- style: focusRingStyle,
31376
- transform: playFocusTransform,
31377
- vectorEffect: "non-scaling-stroke"
31378
- }) : null,
31379
- /* @__PURE__ */ jsx59("path", {
31380
- d: playPath,
31381
- fill: "white",
31382
- stroke: "white",
31383
- strokeWidth: playIconStrokeWidth,
31384
- strokeLinejoin: "round"
31385
- })
31386
- ]
31417
+ children: /* @__PURE__ */ jsx59("path", {
31418
+ d: "M8 6.375C7.40904 8.17576 7.06921 10.2486 7.01438 12.3871C6.95955 14.5255 7.19163 16.6547 7.6875 18.5625C9.95364 18.2995 12.116 17.6164 14.009 16.5655C15.902 15.5147 17.4755 14.124 18.6088 12.5C17.5158 10.8949 15.9949 9.51103 14.1585 8.45082C12.3222 7.3906 10.2174 6.68116 8 6.375Z",
31419
+ fill: "white",
31420
+ stroke: "white",
31421
+ strokeWidth: "6.25",
31422
+ strokeLinejoin: "round"
31423
+ })
31387
31424
  });
31388
31425
  };
31389
- var PauseIcon = ({
31390
- focused
31391
- }) => {
31426
+ var PauseIcon = () => {
31392
31427
  return /* @__PURE__ */ jsxs14("svg", {
31393
31428
  viewBox: "0 0 100 100",
31394
31429
  width: ICON_SIZE2,
31395
31430
  height: ICON_SIZE2,
31396
31431
  children: [
31397
- focused ? /* @__PURE__ */ jsxs14(Fragment12, {
31398
- children: [
31399
- /* @__PURE__ */ jsx59("rect", {
31400
- x: "21",
31401
- y: "16",
31402
- width: "28",
31403
- height: "68",
31404
- fill: "none",
31405
- stroke: focusRingFallbackColor,
31406
- strokeWidth: "4",
31407
- ry: "9",
31408
- rx: "9",
31409
- style: focusRingStyle
31410
- }),
31411
- /* @__PURE__ */ jsx59("rect", {
31412
- x: "51",
31413
- y: "16",
31414
- width: "28",
31415
- height: "68",
31416
- fill: "none",
31417
- stroke: focusRingFallbackColor,
31418
- strokeWidth: "4",
31419
- ry: "9",
31420
- rx: "9",
31421
- style: focusRingStyle
31422
- })
31423
- ]
31424
- }) : null,
31425
31432
  /* @__PURE__ */ jsx59("rect", {
31426
31433
  x: "25",
31427
31434
  y: "20",
@@ -31539,7 +31546,7 @@ var studioStyle = {
31539
31546
  };
31540
31547
  var BufferingIndicator = ({ type }) => {
31541
31548
  const style = type === "player" ? playerStyle : studioStyle;
31542
- return /* @__PURE__ */ jsxs24(Fragment23, {
31549
+ return /* @__PURE__ */ jsxs24(Fragment12, {
31543
31550
  children: [
31544
31551
  /* @__PURE__ */ jsx214("style", {
31545
31552
  type: "text/css",
@@ -32753,20 +32760,16 @@ var RenderWarningIfBlacklist = () => {
32753
32760
  })
32754
32761
  });
32755
32762
  };
32756
- var DefaultPlayPauseButton = ({ playing, buffering, focused }) => {
32763
+ var DefaultPlayPauseButton = ({ playing, buffering }) => {
32757
32764
  if (playing && buffering) {
32758
32765
  return /* @__PURE__ */ jsx64(BufferingIndicator, {
32759
32766
  type: "player"
32760
32767
  });
32761
32768
  }
32762
32769
  if (playing) {
32763
- return /* @__PURE__ */ jsx64(PauseIcon, {
32764
- focused
32765
- });
32770
+ return /* @__PURE__ */ jsx64(PauseIcon, {});
32766
32771
  }
32767
- return /* @__PURE__ */ jsx64(PlayIcon, {
32768
- focused
32769
- });
32772
+ return /* @__PURE__ */ jsx64(PlayIcon, {});
32770
32773
  };
32771
32774
  var KNOB_SIZE = 12;
32772
32775
  var BAR_HEIGHT = 5;
@@ -33490,7 +33493,6 @@ var Controls = ({
33490
33493
  renderCustomControls
33491
33494
  }) => {
33492
33495
  const playButtonRef = useRef82(null);
33493
- const [playButtonFocused, setPlayButtonFocused] = useState102(false);
33494
33496
  const [supportsFullscreen, setSupportsFullscreen] = useState102(false);
33495
33497
  const hovered = useHoverState(containerRef, hideControlsWhenPointerDoesntMove);
33496
33498
  const { maxTimeLabelWidth, displayVerticalVolumeSlider } = useVideoControlsResize({
@@ -33525,15 +33527,6 @@ var Controls = ({
33525
33527
  opacity: Number(shouldShow)
33526
33528
  };
33527
33529
  }, [hovered, shouldShowInitially, playing, alwaysShowControls]);
33528
- const playPauseButtonStyle = useMemo92(() => {
33529
- if (renderPlayPauseButton !== null || playing && buffering) {
33530
- return playerButtonStyle;
33531
- }
33532
- return {
33533
- ...playerButtonStyle,
33534
- outline: "none"
33535
- };
33536
- }, [buffering, playing, renderPlayPauseButton]);
33537
33530
  useEffect112(() => {
33538
33531
  if (playButtonRef.current && spaceKeyToPlayOrPause) {
33539
33532
  playButtonRef.current.focus({
@@ -33586,12 +33579,6 @@ var Controls = ({
33586
33579
  onDoubleClick?.(e);
33587
33580
  }
33588
33581
  }, [onDoubleClick]);
33589
- const onPlayButtonFocus = useCallback72(() => {
33590
- setPlayButtonFocused(true);
33591
- }, []);
33592
- const onPlayButtonBlur = useCallback72(() => {
33593
- setPlayButtonFocused(false);
33594
- }, []);
33595
33582
  return /* @__PURE__ */ jsxs82("div", {
33596
33583
  ref,
33597
33584
  style: containerCss,
@@ -33608,26 +33595,22 @@ var Controls = ({
33608
33595
  /* @__PURE__ */ jsx114("button", {
33609
33596
  ref: playButtonRef,
33610
33597
  type: "button",
33611
- style: playPauseButtonStyle,
33598
+ style: playerButtonStyle,
33612
33599
  onClick: toggle,
33613
- onFocus: onPlayButtonFocus,
33614
- onBlur: onPlayButtonBlur,
33615
33600
  "aria-label": playing ? "Pause video" : "Play video",
33616
33601
  title: playing ? "Pause video" : "Play video",
33617
33602
  children: renderPlayPauseButton === null ? /* @__PURE__ */ jsx114(DefaultPlayPauseButton, {
33618
33603
  buffering,
33619
- focused: playButtonFocused,
33620
33604
  playing
33621
33605
  }) : renderPlayPauseButton({
33622
33606
  playing,
33623
33607
  isBuffering: buffering
33624
33608
  }) ?? /* @__PURE__ */ jsx114(DefaultPlayPauseButton, {
33625
33609
  buffering,
33626
- focused: false,
33627
33610
  playing
33628
33611
  })
33629
33612
  }),
33630
- showVolumeControls ? /* @__PURE__ */ jsxs82(Fragment32, {
33613
+ showVolumeControls ? /* @__PURE__ */ jsxs82(Fragment23, {
33631
33614
  children: [
33632
33615
  /* @__PURE__ */ jsx114("div", {
33633
33616
  style: xSpacer
@@ -34164,7 +34147,7 @@ var PlayerUI = ({
34164
34147
  showPosterWhenBufferingAndPaused && showBufferIndicator && !player.isPlaying()
34165
34148
  ].some(Boolean);
34166
34149
  const { left, top, width, height, ...outerWithoutScale } = outer;
34167
- const content = /* @__PURE__ */ jsxs92(Fragment42, {
34150
+ const content = /* @__PURE__ */ jsxs92(Fragment32, {
34168
34151
  children: [
34169
34152
  /* @__PURE__ */ jsxs92("div", {
34170
34153
  style: outer,
@@ -36962,6 +36945,7 @@ var makePrewarmedVideoIteratorCache = (videoSink) => {
36962
36945
  destroy
36963
36946
  };
36964
36947
  };
36948
+ var MAXIMUM_AWAITED_PEEK_DISTANCE_SECONDS = 0.05;
36965
36949
  var createVideoIterator = async (timeToSeek, cache2) => {
36966
36950
  let destroyed = false;
36967
36951
  const iterator = cache2.makeIteratorOrUsePrewarmed(timeToSeek);
@@ -36976,17 +36960,61 @@ var createVideoIterator = async (timeToSeek, cache2) => {
36976
36960
  }
36977
36961
  lastReturnedFrame = frame;
36978
36962
  };
36979
- const peek = async () => {
36963
+ const setPeekedFrame = (frame) => {
36964
+ peekedFrame = frame;
36965
+ if (peekedFrame === null) {
36966
+ iteratorEnded = true;
36967
+ }
36968
+ return peekedFrame;
36969
+ };
36970
+ const peekIfReady = () => {
36980
36971
  if (peekedFrame) {
36981
- return peekedFrame;
36972
+ return { type: "ready", frame: peekedFrame };
36973
+ }
36974
+ if (iteratorEnded) {
36975
+ return { type: "ready", frame: null };
36982
36976
  }
36983
36977
  const next = iterator.next();
36984
36978
  if (next.type === "ready") {
36985
- peekedFrame = next.frame;
36986
- } else {
36987
- peekedFrame = await next.wait();
36979
+ return { type: "ready", frame: setPeekedFrame(next.frame) };
36988
36980
  }
36989
- return peekedFrame;
36981
+ return {
36982
+ type: "pending",
36983
+ wait: next.wait
36984
+ };
36985
+ };
36986
+ const peek = async () => {
36987
+ const peeked = peekIfReady();
36988
+ if (peeked.type === "ready") {
36989
+ return peeked.frame;
36990
+ }
36991
+ return setPeekedFrame(await peeked.wait());
36992
+ };
36993
+ const getFrameEndTimestampFromPeek = (frame) => {
36994
+ return frame ? roundTo4Digits(frame.timestamp) : Infinity;
36995
+ };
36996
+ const getFrameEndTimestamp = async () => {
36997
+ return getFrameEndTimestampFromPeek(await peek());
36998
+ };
36999
+ const getFrameEndTimestampIfCloseEnough = async ({
37000
+ timestamp,
37001
+ frameTimestamp
37002
+ }) => {
37003
+ const peeked = peekIfReady();
37004
+ if (peeked.type === "ready") {
37005
+ return {
37006
+ type: "ready",
37007
+ timestamp: getFrameEndTimestampFromPeek(peeked.frame)
37008
+ };
37009
+ }
37010
+ if (timestamp - frameTimestamp > MAXIMUM_AWAITED_PEEK_DISTANCE_SECONDS) {
37011
+ return { type: "pending" };
37012
+ }
37013
+ const awaitedPeeked = setPeekedFrame(await peeked.wait());
37014
+ return {
37015
+ type: "ready",
37016
+ timestamp: getFrameEndTimestampFromPeek(awaitedPeeked)
37017
+ };
36990
37018
  };
36991
37019
  const getNextOrNullIfNotAvailable = () => {
36992
37020
  if (peekedFrame) {
@@ -37054,14 +37082,7 @@ var createVideoIterator = async (timeToSeek, cache2) => {
37054
37082
  reason: `iterator is too far, most recently returned ${frameTimestamp}`
37055
37083
  };
37056
37084
  }
37057
- let lastFrameDuration = lastReturnedFrame.duration;
37058
- if (lastFrameDuration === 0) {
37059
- const peeked = await peek();
37060
- if (peeked) {
37061
- lastFrameDuration = peeked.timestamp - lastReturnedFrame.timestamp;
37062
- }
37063
- }
37064
- const frameEndTimestamp = roundTo4Digits(lastReturnedFrame.timestamp + lastFrameDuration);
37085
+ const frameEndTimestamp = await getFrameEndTimestamp();
37065
37086
  if (frameTimestamp <= timestamp && frameEndTimestamp > timestamp) {
37066
37087
  return {
37067
37088
  type: "satisfied",
@@ -37104,8 +37125,17 @@ var createVideoIterator = async (timeToSeek, cache2) => {
37104
37125
  };
37105
37126
  }
37106
37127
  const frameTimestamp = roundTo4Digits(frame.frame.timestamp);
37107
- const frameEndTimestamp = roundTo4Digits(frame.frame.timestamp + frame.frame.duration);
37108
- if (frameTimestamp <= timestamp && frameEndTimestamp > timestamp) {
37128
+ const frameEndTimestamp = await getFrameEndTimestampIfCloseEnough({
37129
+ frameTimestamp,
37130
+ timestamp
37131
+ });
37132
+ if (frameEndTimestamp.type === "pending") {
37133
+ return {
37134
+ type: "not-satisfied",
37135
+ reason: "iterator did not have next frame ready"
37136
+ };
37137
+ }
37138
+ if (frameTimestamp <= timestamp && frameEndTimestamp.timestamp > timestamp) {
37109
37139
  return {
37110
37140
  type: "satisfied",
37111
37141
  frame: frame.frame
@@ -38668,17 +38698,30 @@ var makeKeyframeBank = async ({
38668
38698
  let hasReachedEndOfVideo = false;
38669
38699
  let lastUsed = Date.now();
38670
38700
  let allocationSize = 0;
38671
- const getDurationOfFrame = (timestamp) => {
38701
+ const getMeasuredDurationOfFrame = (timestamp) => {
38672
38702
  const index2 = frameTimestamps.indexOf(timestamp);
38673
38703
  if (index2 === -1) {
38674
38704
  throw new Error(`Frame ${timestamp} not found`);
38675
38705
  }
38676
38706
  const nextTimestamp = frameTimestamps[index2 + 1];
38677
- if (!nextTimestamp) {
38707
+ if (nextTimestamp === undefined) {
38678
38708
  return null;
38679
38709
  }
38680
38710
  return nextTimestamp - timestamp;
38681
38711
  };
38712
+ const getKnownDurationOfFrame = (timestamp) => {
38713
+ const measuredDuration = getMeasuredDurationOfFrame(timestamp);
38714
+ if (measuredDuration !== null) {
38715
+ return measuredDuration;
38716
+ }
38717
+ if (!hasReachedEndOfVideo) {
38718
+ return null;
38719
+ }
38720
+ return frames[timestamp].duration ?? 0;
38721
+ };
38722
+ const getEstimatedDurationOfFrame = (timestamp) => {
38723
+ return getMeasuredDurationOfFrame(timestamp) ?? frames[timestamp].duration ?? 0;
38724
+ };
38682
38725
  const deleteFrameAtTimestamp = (timestamp) => {
38683
38726
  allocationSize -= getAllocationSize(frames[timestamp]);
38684
38727
  frameTimestamps.splice(frameTimestamps.indexOf(timestamp), 1);
@@ -38700,7 +38743,10 @@ var makeKeyframeBank = async ({
38700
38743
  if (!frames[frameTimestamp]) {
38701
38744
  continue;
38702
38745
  }
38703
- const duration = getDurationOfFrame(frameTimestamp) ?? frames[frameTimestamp].duration;
38746
+ const duration = getKnownDurationOfFrame(frameTimestamp);
38747
+ if (duration === null) {
38748
+ continue;
38749
+ }
38704
38750
  if (frameTimestamp + duration < timestampInSeconds) {
38705
38751
  deleteFrameAtTimestamp(frameTimestamp);
38706
38752
  deletedTimestamps.push(frameTimestamp);
@@ -38712,14 +38758,20 @@ var makeKeyframeBank = async ({
38712
38758
  };
38713
38759
  const hasDecodedEnoughForTimestamp = (timestamp) => {
38714
38760
  const lastFrameTimestamp = frameTimestamps[frameTimestamps.length - 1];
38715
- if (!lastFrameTimestamp) {
38761
+ if (lastFrameTimestamp === undefined) {
38716
38762
  return false;
38717
38763
  }
38718
38764
  const lastFrame = frames[lastFrameTimestamp];
38719
38765
  if (!lastFrame) {
38720
38766
  return true;
38721
38767
  }
38722
- const duration = getDurationOfFrame(lastFrameTimestamp) ?? lastFrame.duration;
38768
+ if (roundTo4Digits(lastFrameTimestamp) >= roundTo4Digits(timestamp)) {
38769
+ return true;
38770
+ }
38771
+ const duration = getKnownDurationOfFrame(lastFrameTimestamp);
38772
+ if (duration === null) {
38773
+ return false;
38774
+ }
38723
38775
  return roundTo4Digits(lastFrameTimestamp + duration) > roundTo4Digits(timestamp);
38724
38776
  };
38725
38777
  const addFrame = (frame, logLevel) => {
@@ -38793,8 +38845,7 @@ var makeKeyframeBank = async ({
38793
38845
  }
38794
38846
  const firstTimestamp = frameTimestamps[0];
38795
38847
  const lastTimestamp = frameTimestamps[frameTimestamps.length - 1];
38796
- const lastFrame = frames[lastTimestamp];
38797
- const lastFrameDuration = getDurationOfFrame(lastTimestamp) ?? lastFrame.duration ?? 0;
38848
+ const lastFrameDuration = getEstimatedDurationOfFrame(lastTimestamp);
38798
38849
  return {
38799
38850
  firstTimestamp,
38800
38851
  lastTimestamp: lastTimestamp + lastFrameDuration
@@ -42044,6 +42095,7 @@ var DisplayedEmoji = ({ emoji }) => {
42044
42095
  const { durationInFrames, fps } = useVideoConfig();
42045
42096
  const [browser, setBrowser] = useState46(typeof document !== "undefined");
42046
42097
  const { delayRender: delayRender2, continueRender, cancelRender: cancelRender2 } = useDelayRender();
42098
+ const { isRendering } = useRemotionEnvironment();
42047
42099
  const src = useMemo59(() => {
42048
42100
  if (emoji === "melting") {
42049
42101
  return "https://fonts.gstatic.com/s/e/notoemoji/latest/1fae0/lottie.json";
@@ -42065,9 +42117,13 @@ var DisplayedEmoji = ({ emoji }) => {
42065
42117
  });
42066
42118
  continueRender(handle);
42067
42119
  }).catch((err) => {
42068
- cancelRender2(err);
42120
+ if (isRendering) {
42121
+ cancelRender2(err);
42122
+ }
42123
+ console.warn("Could not load emoji animation", err);
42124
+ continueRender(handle);
42069
42125
  });
42070
- }, [handle, src, continueRender, cancelRender2]);
42126
+ }, [handle, src, continueRender, cancelRender2, isRendering]);
42071
42127
  useEffect46(() => {
42072
42128
  if (typeof document !== "undefined") {
42073
42129
  setBrowser(true);
@@ -42785,7 +42841,7 @@ import {
42785
42841
  import { BufferTarget, StreamTarget } from "mediabunny";
42786
42842
 
42787
42843
  // ../core/dist/esm/version.mjs
42788
- var VERSION2 = "4.0.486";
42844
+ var VERSION2 = "4.0.487";
42789
42845
 
42790
42846
  // ../web-renderer/dist/esm/index.mjs
42791
42847
  import { AudioSample, VideoSample } from "mediabunny";
@@ -43748,6 +43804,51 @@ var makeVideoSampleSourceCleanup = (encodingConfig) => {
43748
43804
  }
43749
43805
  };
43750
43806
  };
43807
+ var PRESET_INTERVALS = {
43808
+ low: 100,
43809
+ medium: 33,
43810
+ high: 16
43811
+ };
43812
+ var resolvePageResponsivenessInterval = (pageResponsiveness) => {
43813
+ if (pageResponsiveness === "disabled") {
43814
+ return null;
43815
+ }
43816
+ if (pageResponsiveness === "low" || pageResponsiveness === "medium" || pageResponsiveness === "high") {
43817
+ return PRESET_INTERVALS[pageResponsiveness];
43818
+ }
43819
+ if (typeof pageResponsiveness === "number") {
43820
+ if (Number.isNaN(pageResponsiveness)) {
43821
+ throw new Error("`pageResponsiveness` should not be NaN, but is NaN");
43822
+ }
43823
+ if (!Number.isFinite(pageResponsiveness)) {
43824
+ throw new Error(`"pageResponsiveness" must be finite, but is ${pageResponsiveness}`);
43825
+ }
43826
+ if (pageResponsiveness <= 0) {
43827
+ throw new Error(`"pageResponsiveness" must be greater than 0, but is ${pageResponsiveness}`);
43828
+ }
43829
+ return pageResponsiveness;
43830
+ }
43831
+ throw new Error(`"pageResponsiveness" must be one of "disabled", "low", "medium", "high", or a number, but got ${JSON.stringify(pageResponsiveness)}`);
43832
+ };
43833
+ var createPageResponsivenessController = ({
43834
+ intervalInMilliseconds,
43835
+ now,
43836
+ wait
43837
+ }) => {
43838
+ let lastYieldAt = now();
43839
+ return {
43840
+ waitIfNeeded: async () => {
43841
+ if (intervalInMilliseconds === null) {
43842
+ return;
43843
+ }
43844
+ if (now() - lastYieldAt < intervalInMilliseconds) {
43845
+ return;
43846
+ }
43847
+ await wait();
43848
+ lastYieldAt = now();
43849
+ }
43850
+ };
43851
+ };
43751
43852
  var onlyOneRenderAtATimeQueue = {
43752
43853
  ref: Promise.resolve()
43753
43854
  };
@@ -44512,6 +44613,38 @@ var filterRequiresPrecompositing = (filter) => {
44512
44613
  }
44513
44614
  return null;
44514
44615
  };
44616
+ var isReplacedElement = (element) => {
44617
+ return element instanceof HTMLImageElement || element instanceof HTMLVideoElement || element instanceof HTMLCanvasElement || element instanceof HTMLIFrameElement || element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement || element instanceof HTMLObjectElement || element instanceof HTMLEmbedElement;
44618
+ };
44619
+ var canApplyCssTransforms = ({
44620
+ element,
44621
+ computedStyle
44622
+ }) => {
44623
+ if (element instanceof SVGElement) {
44624
+ return true;
44625
+ }
44626
+ if (computedStyle.display !== "inline") {
44627
+ return true;
44628
+ }
44629
+ return isReplacedElement(element);
44630
+ };
44631
+ var makeTransformResetter = (element) => {
44632
+ const { transform, scale, rotate: rotate2 } = element.style;
44633
+ return (hasApplicableTransformCssValue) => {
44634
+ if (hasApplicableTransformCssValue) {
44635
+ element.style.transform = "none";
44636
+ element.style.scale = "none";
44637
+ element.style.rotate = "none";
44638
+ }
44639
+ return () => {
44640
+ if (hasApplicableTransformCssValue) {
44641
+ element.style.transform = transform;
44642
+ element.style.scale = scale;
44643
+ element.style.rotate = rotate2;
44644
+ }
44645
+ };
44646
+ };
44647
+ };
44515
44648
  var getInternalTransformOrigin = (transform) => {
44516
44649
  const centerX = transform.boundingClientRect.width / 2;
44517
44650
  const centerY = transform.boundingClientRect.height / 2;
@@ -44566,21 +44699,21 @@ var calculateTransforms = ({
44566
44699
  }
44567
44700
  });
44568
44701
  }
44569
- if (hasAnyTransformCssValue(computedStyle) || parent === element) {
44570
- const toParse = hasTransformCssValue(computedStyle) ? computedStyle.transform : undefined;
44702
+ const hasApplicableTransformCssValue = canApplyCssTransforms({ computedStyle, element: parent }) && hasAnyTransformCssValue(computedStyle);
44703
+ if (hasApplicableTransformCssValue || parent === element) {
44704
+ const toParse = hasApplicableTransformCssValue && hasTransformCssValue(computedStyle) ? computedStyle.transform : undefined;
44571
44705
  const matrix = new DOMMatrix(toParse);
44572
- const { transform, scale, rotate: rotate2 } = parent.style;
44706
+ const resetTransforms = makeTransformResetter(parent);
44707
+ const { scale, rotate: rotate2 } = parent.style;
44573
44708
  const additionalMatrices = [];
44574
- if (rotate2 !== "" && rotate2 !== "none") {
44709
+ if (hasApplicableTransformCssValue && rotate2 !== "" && rotate2 !== "none") {
44575
44710
  additionalMatrices.push(new DOMMatrix(`rotate(${rotate2})`));
44576
44711
  }
44577
- if (scale !== "" && scale !== "none") {
44712
+ if (hasApplicableTransformCssValue && scale !== "" && scale !== "none") {
44578
44713
  additionalMatrices.push(new DOMMatrix(`scale(${scale})`));
44579
44714
  }
44580
44715
  additionalMatrices.push(matrix);
44581
- parent.style.transform = "none";
44582
- parent.style.scale = "none";
44583
- parent.style.rotate = "none";
44716
+ const cleanup = resetTransforms(hasApplicableTransformCssValue);
44584
44717
  transforms.push({
44585
44718
  element: parent,
44586
44719
  transformOrigin: computedStyle.transformOrigin,
@@ -44589,9 +44722,7 @@ var calculateTransforms = ({
44589
44722
  });
44590
44723
  const parentRef = parent;
44591
44724
  toReset.push(() => {
44592
- parentRef.style.transform = transform;
44593
- parentRef.style.scale = scale;
44594
- parentRef.style.rotate = rotate2;
44725
+ cleanup();
44595
44726
  parentRef.style.transition = originalTransition;
44596
44727
  });
44597
44728
  } else {
@@ -45176,7 +45307,8 @@ var drawBackground = async ({
45176
45307
  logLevel,
45177
45308
  internalState,
45178
45309
  scale,
45179
- onlyBackgroundClipText: true
45310
+ onlyBackgroundClipText: true,
45311
+ waitForPageResponsiveness: null
45180
45312
  });
45181
45313
  onlyBackgroundClipText.setTransform(new DOMMatrix().scale(scale, scale));
45182
45314
  element.style.backgroundClip = originalBackgroundClip;
@@ -46329,7 +46461,8 @@ var processNode = async ({
46329
46461
  parentRect,
46330
46462
  internalState,
46331
46463
  rootElement,
46332
- scale
46464
+ scale,
46465
+ waitForPageResponsiveness
46333
46466
  }) => {
46334
46467
  let __stack = [];
46335
46468
  try {
@@ -46393,8 +46526,12 @@ var processNode = async ({
46393
46526
  logLevel,
46394
46527
  internalState,
46395
46528
  scale,
46396
- onlyBackgroundClipText: false
46529
+ onlyBackgroundClipText: false,
46530
+ waitForPageResponsiveness
46397
46531
  });
46532
+ if (waitForPageResponsiveness !== null) {
46533
+ await waitForPageResponsiveness();
46534
+ }
46398
46535
  let drawable = tempContext.canvas;
46399
46536
  const rectAfterTransforms = roundToExpandRect(scaleRect({
46400
46537
  scale,
@@ -46411,6 +46548,9 @@ var processNode = async ({
46411
46548
  tempContext,
46412
46549
  scale
46413
46550
  });
46551
+ if (waitForPageResponsiveness !== null) {
46552
+ await waitForPageResponsiveness();
46553
+ }
46414
46554
  }
46415
46555
  if (precompositing.needs3DTransformViaWebGL) {
46416
46556
  const t = handle3dTransform({
@@ -46424,6 +46564,9 @@ var processNode = async ({
46424
46564
  if (t) {
46425
46565
  drawable = t;
46426
46566
  }
46567
+ if (waitForPageResponsiveness !== null) {
46568
+ await waitForPageResponsiveness();
46569
+ }
46427
46570
  }
46428
46571
  const previousTransform = context.getTransform();
46429
46572
  context.setTransform(new DOMMatrix);
@@ -46440,6 +46583,9 @@ var processNode = async ({
46440
46583
  drawPrecomposedCanvas();
46441
46584
  }
46442
46585
  context.setTransform(previousTransform);
46586
+ if (waitForPageResponsiveness !== null) {
46587
+ await waitForPageResponsiveness();
46588
+ }
46443
46589
  Internals.Log.trace({
46444
46590
  logLevel,
46445
46591
  tag: "@remotion/web-renderer"
@@ -46850,7 +46996,8 @@ var handleTextNode = async ({
46850
46996
  internalState,
46851
46997
  rootElement,
46852
46998
  onlyBackgroundClipText,
46853
- scale
46999
+ scale,
47000
+ waitForPageResponsiveness
46854
47001
  }) => {
46855
47002
  const span = document.createElement("span");
46856
47003
  const parent = node.parentNode;
@@ -46867,7 +47014,8 @@ var handleTextNode = async ({
46867
47014
  parentRect,
46868
47015
  internalState,
46869
47016
  rootElement,
46870
- scale
47017
+ scale,
47018
+ waitForPageResponsiveness
46871
47019
  });
46872
47020
  parent.insertBefore(node, span);
46873
47021
  parent.removeChild(span);
@@ -46881,7 +47029,8 @@ var walkOverNode = ({
46881
47029
  internalState,
46882
47030
  rootElement,
46883
47031
  onlyBackgroundClipText,
46884
- scale
47032
+ scale,
47033
+ waitForPageResponsiveness
46885
47034
  }) => {
46886
47035
  if (node instanceof HTMLElement || node instanceof SVGElement) {
46887
47036
  return processNode({
@@ -46892,7 +47041,8 @@ var walkOverNode = ({
46892
47041
  parentRect,
46893
47042
  internalState,
46894
47043
  rootElement,
46895
- scale
47044
+ scale,
47045
+ waitForPageResponsiveness
46896
47046
  });
46897
47047
  }
46898
47048
  if (node instanceof Text) {
@@ -46904,7 +47054,8 @@ var walkOverNode = ({
46904
47054
  internalState,
46905
47055
  rootElement,
46906
47056
  onlyBackgroundClipText,
46907
- scale
47057
+ scale,
47058
+ waitForPageResponsiveness
46908
47059
  });
46909
47060
  }
46910
47061
  throw new Error("Unknown node type");
@@ -46929,7 +47080,8 @@ var compose = async ({
46929
47080
  parentRect,
46930
47081
  internalState,
46931
47082
  onlyBackgroundClipText,
46932
- scale
47083
+ scale,
47084
+ waitForPageResponsiveness
46933
47085
  }) => {
46934
47086
  let __stack = [];
46935
47087
  try {
@@ -46952,7 +47104,8 @@ var compose = async ({
46952
47104
  internalState,
46953
47105
  rootElement: element,
46954
47106
  onlyBackgroundClipText,
46955
- scale
47107
+ scale,
47108
+ waitForPageResponsiveness
46956
47109
  });
46957
47110
  if (val.type === "skip-children") {
46958
47111
  if (!skipToNextNonDescendant(treeWalker)) {
@@ -46966,6 +47119,9 @@ var compose = async ({
46966
47119
  break;
46967
47120
  }
46968
47121
  }
47122
+ if (waitForPageResponsiveness !== null) {
47123
+ await waitForPageResponsiveness();
47124
+ }
46969
47125
  }
46970
47126
  } catch (_catch) {
46971
47127
  var _err = _catch, _hasErr = 1;
@@ -46981,7 +47137,8 @@ var createLayer = async ({
46981
47137
  onlyBackgroundClipText,
46982
47138
  cutout,
46983
47139
  htmlInCanvasContext,
46984
- onHtmlInCanvasLayerOutcome
47140
+ onHtmlInCanvasLayerOutcome,
47141
+ waitForPageResponsiveness
46985
47142
  }) => {
46986
47143
  const scaledWidth = Math.ceil(cutout.width * scale);
46987
47144
  const scaledHeight = Math.ceil(cutout.height * scale);
@@ -47017,7 +47174,8 @@ var createLayer = async ({
47017
47174
  parentRect: cutout,
47018
47175
  internalState,
47019
47176
  onlyBackgroundClipText,
47020
- scale
47177
+ scale,
47178
+ waitForPageResponsiveness
47021
47179
  });
47022
47180
  return context;
47023
47181
  };
@@ -47231,6 +47389,7 @@ var internalRenderMediaOnWeb = async ({
47231
47389
  transparent,
47232
47390
  onArtifact,
47233
47391
  onFrame,
47392
+ pageResponsiveness,
47234
47393
  outputTarget: userDesiredOutputTarget,
47235
47394
  licenseKey,
47236
47395
  muted,
@@ -47242,6 +47401,7 @@ var internalRenderMediaOnWeb = async ({
47242
47401
  let __stack2 = [];
47243
47402
  try {
47244
47403
  validateScale(scale);
47404
+ const pageResponsivenessIntervalInMilliseconds = resolvePageResponsivenessInterval(pageResponsiveness);
47245
47405
  let htmlInCanvasLayerOutcomeReported = false;
47246
47406
  const onHtmlInCanvasLayerOutcome = (outcome) => {
47247
47407
  if (htmlInCanvasLayerOutcomeReported) {
@@ -47353,6 +47513,19 @@ var internalRenderMediaOnWeb = async ({
47353
47513
  });
47354
47514
  }
47355
47515
  const internalState = __using2(__stack2, makeInternalState(), 0);
47516
+ const pageResponsivenessController = createPageResponsivenessController({
47517
+ intervalInMilliseconds: pageResponsivenessIntervalInMilliseconds,
47518
+ now: () => performance.now(),
47519
+ wait: () => new Promise((resolve) => {
47520
+ setTimeout(resolve, 0);
47521
+ })
47522
+ });
47523
+ const waitForPageResponsiveness = async () => {
47524
+ await pageResponsivenessController.waitIfNeeded();
47525
+ if (signal?.aborted) {
47526
+ throw new Error("renderMediaOnWeb() was cancelled");
47527
+ }
47528
+ };
47356
47529
  const keepalive = __using2(__stack2, createBackgroundKeepalive({
47357
47530
  fps: resolved.fps,
47358
47531
  logLevel
@@ -47466,13 +47639,15 @@ var internalRenderMediaOnWeb = async ({
47466
47639
  onlyBackgroundClipText: false,
47467
47640
  cutout: new DOMRect(0, 0, resolved.width, resolved.height),
47468
47641
  htmlInCanvasContext,
47469
- onHtmlInCanvasLayerOutcome: htmlInCanvasContext ? onHtmlInCanvasLayerOutcome : undefined
47642
+ onHtmlInCanvasLayerOutcome: htmlInCanvasContext ? onHtmlInCanvasLayerOutcome : undefined,
47643
+ waitForPageResponsiveness
47470
47644
  });
47471
47645
  internalState.addCreateFrameTime(performance.now() - createFrameStart);
47472
47646
  layerCanvas = layer.canvas;
47473
47647
  if (signal?.aborted) {
47474
47648
  throw new Error("renderMediaOnWeb() was cancelled");
47475
47649
  }
47650
+ await waitForPageResponsiveness();
47476
47651
  const videoFrame = new VideoFrame(layer.canvas, {
47477
47652
  timestamp
47478
47653
  });
@@ -47489,6 +47664,7 @@ var internalRenderMediaOnWeb = async ({
47489
47664
  expectedHeight: Math.round(resolved.height * scale),
47490
47665
  expectedTimestamp: timestamp
47491
47666
  });
47667
+ await waitForPageResponsiveness();
47492
47668
  }
47493
47669
  }
47494
47670
  const now = Date.now();
@@ -47514,11 +47690,10 @@ var internalRenderMediaOnWeb = async ({
47514
47690
  onArtifact
47515
47691
  });
47516
47692
  }
47517
- if (signal?.aborted) {
47518
- throw new Error("renderMediaOnWeb() was cancelled");
47519
- }
47693
+ await waitForPageResponsiveness();
47520
47694
  const audio = muted ? null : onlyInlineAudio({ assets, fps: resolved.fps, timestamp, sampleRate });
47521
47695
  internalState.addAudioMixingTime(performance.now() - audioCombineStart);
47696
+ await waitForPageResponsiveness();
47522
47697
  const addSampleStart = performance.now();
47523
47698
  const encodingPromises = [];
47524
47699
  if (frameToEncode && videoSampleSource) {
@@ -47537,8 +47712,10 @@ var internalRenderMediaOnWeb = async ({
47537
47712
  if (signal?.aborted) {
47538
47713
  throw new Error("renderMediaOnWeb() was cancelled");
47539
47714
  }
47715
+ await waitForPageResponsiveness();
47540
47716
  }
47541
47717
  onProgress?.(getProgressPayload());
47718
+ await waitForPageResponsiveness();
47542
47719
  videoSampleSource?.videoSampleSource.close();
47543
47720
  audioSampleSource?.audioSampleSource.close();
47544
47721
  await outputWithCleanup.output.finalize();
@@ -47626,6 +47803,7 @@ var renderMediaOnWeb = (options2) => {
47626
47803
  transparent: options2.transparent ?? false,
47627
47804
  onArtifact: options2.onArtifact ?? null,
47628
47805
  onFrame: options2.onFrame ?? null,
47806
+ pageResponsiveness: options2.pageResponsiveness ?? "medium",
47629
47807
  outputTarget: options2.outputTarget ?? null,
47630
47808
  licenseKey: options2.licenseKey ?? null,
47631
47809
  muted: options2.muted ?? false,
@@ -48899,75 +49077,287 @@ var EvaluateRemotionSection = () => {
48899
49077
  };
48900
49078
  var EvaluateRemotion_default = EvaluateRemotionSection;
48901
49079
 
48902
- // src/components/homepage/IfYouKnowReact.tsx
48903
- import { useEffect as useEffect59, useState as useState58 } from "react";
48904
- import { jsx as jsx119, jsxs as jsxs41 } from "react/jsx-runtime";
48905
- var isWebkit = () => {
48906
- if (typeof window === "undefined") {
48907
- return false;
48908
- }
48909
- const isSafariUserAgent = Boolean(navigator.userAgent.match(/Version\/[\d.]+.*Safari/));
48910
- const isChrome = Boolean(navigator.userAgent.match(/CriOS\//));
48911
- return isSafariUserAgent || isChrome;
48912
- };
49080
+ // src/components/homepage/MakeVideosAgentically.tsx
49081
+ import { useEffect as useEffect59, useRef as useRef60 } from "react";
49082
+
49083
+ // src/components/homepage/MakeVideosLinks.tsx
49084
+ import React80 from "react";
49085
+ import { jsx as jsx119, jsxs as jsxs41, Fragment as Fragment16 } from "react/jsx-runtime";
48913
49086
  var icon3 = {
48914
49087
  height: 16,
48915
49088
  marginLeft: 10
48916
49089
  };
48917
- var IfYouKnowReact = () => {
48918
- const [vid, setVid] = useState58("/img/compose.webm");
49090
+ var MakeVideosLinkItem = ({ href, label: label3 }) => {
49091
+ return /* @__PURE__ */ jsxs41("a", {
49092
+ className: "no-underline text-[var(--subtitle)] font-brand font-medium text-sm inline-flex flex-row items-center",
49093
+ href,
49094
+ children: [
49095
+ label3,
49096
+ /* @__PURE__ */ jsx119("svg", {
49097
+ style: icon3,
49098
+ xmlns: "http://www.w3.org/2000/svg",
49099
+ viewBox: "0 0 448 512",
49100
+ children: /* @__PURE__ */ jsx119("path", {
49101
+ fill: "currentColor",
49102
+ d: "M438.6 278.6l-160 160C272.4 444.9 264.2 448 256 448s-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L338.8 288H32C14.33 288 .0016 273.7 .0016 256S14.33 224 32 224h306.8l-105.4-105.4c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l160 160C451.1 245.9 451.1 266.1 438.6 278.6z"
49103
+ })
49104
+ })
49105
+ ]
49106
+ });
49107
+ };
49108
+ var MakeVideosLinks = ({ links }) => {
49109
+ if (links.length === 0) {
49110
+ return null;
49111
+ }
49112
+ return /* @__PURE__ */ jsxs41(Fragment16, {
49113
+ children: [
49114
+ /* @__PURE__ */ jsx119("div", {
49115
+ className: "h-4"
49116
+ }),
49117
+ /* @__PURE__ */ jsx119("div", {
49118
+ className: "leading-6",
49119
+ children: links.map((link) => {
49120
+ return /* @__PURE__ */ jsxs41(React80.Fragment, {
49121
+ children: [
49122
+ /* @__PURE__ */ jsx119(MakeVideosLinkItem, {
49123
+ ...link
49124
+ }),
49125
+ /* @__PURE__ */ jsx119("br", {})
49126
+ ]
49127
+ }, link.href);
49128
+ })
49129
+ })
49130
+ ]
49131
+ });
49132
+ };
49133
+
49134
+ // src/components/homepage/MakeVideosAgentically.tsx
49135
+ import { jsx as jsx120, jsxs as jsxs44, Fragment as Fragment17 } from "react/jsx-runtime";
49136
+ var MakeVideosAgentically = ({
49137
+ title = /* @__PURE__ */ jsxs44(Fragment17, {
49138
+ children: [
49139
+ /* @__PURE__ */ jsx120("span", {
49140
+ className: "text-[var(--subtitle)]",
49141
+ children: "Make videos"
49142
+ }),
49143
+ /* @__PURE__ */ jsx120("br", {}),
49144
+ " agentically"
49145
+ ]
49146
+ }),
49147
+ description = "Turn your idea into a video using your coding agent.",
49148
+ showLinks = true,
49149
+ links = [
49150
+ { label: "Agent Skills", href: "/docs/ai/skills" },
49151
+ { label: "Prompts", href: "/prompts" }
49152
+ ],
49153
+ showVideo = true,
49154
+ videoSrc = "/img/render-progress.webm",
49155
+ fallbackVideoSrc = "/img/render-progress.mp4"
49156
+ }) => {
49157
+ const ref = useRef60(null);
49158
+ const videoRef = useRef60(null);
48919
49159
  useEffect59(() => {
48920
- if (isWebkit()) {
48921
- setVid("/img/compose.mp4");
49160
+ const { current } = ref;
49161
+ if (!current) {
49162
+ return;
48922
49163
  }
49164
+ const callback = (data2) => {
49165
+ if (data2[0].isIntersecting) {
49166
+ videoRef.current?.play();
49167
+ }
49168
+ };
49169
+ const observer = new IntersectionObserver(callback, {
49170
+ root: null,
49171
+ threshold: 0.5
49172
+ });
49173
+ observer.observe(current);
49174
+ return () => observer.unobserve(current);
48923
49175
  }, []);
48924
- return /* @__PURE__ */ jsxs41("div", {
48925
- className: "flex flex-col lg:flex-row text-left justify-start lg:justify-end items-start lg:mb-0 gap-6 mt-8",
49176
+ return /* @__PURE__ */ jsxs44("div", {
49177
+ ref,
49178
+ className: "flex min-w-0 basis-0 flex-col flex-1",
49179
+ children: [
49180
+ /* @__PURE__ */ jsx120("div", {
49181
+ className: "flex aspect-square w-full items-start",
49182
+ children: showVideo ? /* @__PURE__ */ jsxs44("video", {
49183
+ ref: videoRef,
49184
+ muted: true,
49185
+ autoPlay: true,
49186
+ playsInline: true,
49187
+ loop: true,
49188
+ preload: "metadata",
49189
+ style: {
49190
+ width: 400,
49191
+ maxWidth: "100%",
49192
+ maxHeight: "100%",
49193
+ borderRadius: 7,
49194
+ overflow: "hidden"
49195
+ },
49196
+ className: "cursor-default! relative object-contain",
49197
+ children: [
49198
+ /* @__PURE__ */ jsx120("source", {
49199
+ src: fallbackVideoSrc,
49200
+ type: "video/mp4"
49201
+ }),
49202
+ /* @__PURE__ */ jsx120("source", {
49203
+ src: videoSrc,
49204
+ type: "video/webm"
49205
+ })
49206
+ ]
49207
+ }) : null
49208
+ }),
49209
+ /* @__PURE__ */ jsxs44("div", {
49210
+ className: "font-brand",
49211
+ children: [
49212
+ /* @__PURE__ */ jsx120("h2", {
49213
+ className: "text-2xl fontbrand leading-[1.1] font-medium",
49214
+ children: title
49215
+ }),
49216
+ /* @__PURE__ */ jsx120("p", {
49217
+ className: "leading-relaxed",
49218
+ children: description
49219
+ }),
49220
+ showLinks ? /* @__PURE__ */ jsx120(MakeVideosLinks, {
49221
+ links
49222
+ }) : null
49223
+ ]
49224
+ })
49225
+ ]
49226
+ });
49227
+ };
49228
+
49229
+ // src/components/homepage/MakeVideosInteractively.tsx
49230
+ import { useRef as useRef61 } from "react";
49231
+ import { jsx as jsx121, jsxs as jsxs46, Fragment as Fragment18 } from "react/jsx-runtime";
49232
+ var MakeVideosInteractively = ({
49233
+ title = /* @__PURE__ */ jsxs46(Fragment18, {
48926
49234
  children: [
48927
- /* @__PURE__ */ jsx119("video", {
48928
- src: vid,
48929
- muted: true,
48930
- autoPlay: true,
48931
- playsInline: true,
48932
- loop: true,
48933
- className: "w-[500px] h-[500px] cursor-default! relative lg:-translate-x-8 -mb-40 lg:mt-0 lg:mb-0"
49235
+ /* @__PURE__ */ jsx121("span", {
49236
+ className: "text-[var(--subtitle)]",
49237
+ children: "Make videos"
48934
49238
  }),
48935
- /* @__PURE__ */ jsxs41("div", {
49239
+ /* @__PURE__ */ jsx121("br", {}),
49240
+ " interactively"
49241
+ ]
49242
+ }),
49243
+ description = "Edit and animate using drag and drop and save back to code.",
49244
+ showLinks = true,
49245
+ links = [{ label: "Remotion Studio", href: "/docs/studio" }],
49246
+ showVideo = true,
49247
+ videoSrc = "/img/editing-vp9-chrome.webm",
49248
+ fallbackVideoSrc = "/img/editing-safari.mp4"
49249
+ }) => {
49250
+ const ref = useRef61(null);
49251
+ return /* @__PURE__ */ jsxs46("div", {
49252
+ ref,
49253
+ className: "flex min-w-0 basis-0 flex-col justify-start items-start lg:mt-0 flex-1",
49254
+ children: [
49255
+ /* @__PURE__ */ jsx121("div", {
49256
+ className: "flex aspect-square w-full items-start",
49257
+ children: showVideo ? /* @__PURE__ */ jsxs46("video", {
49258
+ autoPlay: true,
49259
+ muted: true,
49260
+ playsInline: true,
49261
+ loop: true,
49262
+ preload: "metadata",
49263
+ style: {
49264
+ width: 500,
49265
+ maxWidth: "100%",
49266
+ maxHeight: "100%",
49267
+ borderRadius: 7,
49268
+ overflow: "hidden"
49269
+ },
49270
+ className: "object-contain",
49271
+ children: [
49272
+ /* @__PURE__ */ jsx121("source", {
49273
+ src: fallbackVideoSrc,
49274
+ type: "video/mp4"
49275
+ }),
49276
+ /* @__PURE__ */ jsx121("source", {
49277
+ src: videoSrc,
49278
+ type: "video/webm"
49279
+ })
49280
+ ]
49281
+ }) : null
49282
+ }),
49283
+ /* @__PURE__ */ jsxs46("div", {
49284
+ className: "font-brand",
48936
49285
  children: [
48937
- /* @__PURE__ */ jsxs41("h2", {
48938
- className: "text-4xl fontbrand pt-20",
48939
- children: [
48940
- /* @__PURE__ */ jsx119("span", {
48941
- className: "text-brand",
48942
- children: "Compose"
48943
- }),
48944
- " with code"
48945
- ]
49286
+ /* @__PURE__ */ jsx121("h2", {
49287
+ className: "text-2xl fontbrand leading-[1.1] font-medium",
49288
+ children: title
48946
49289
  }),
48947
- /* @__PURE__ */ jsx119("p", {
48948
- className: "leading-relaxed font-brand",
48949
- children: "Use React, a powerful frontend technology, to create sophisticated videos with code."
49290
+ /* @__PURE__ */ jsx121("p", {
49291
+ className: "leading-relaxed",
49292
+ children: description
48950
49293
  }),
48951
- /* @__PURE__ */ jsx119("div", {
48952
- className: "h-4"
49294
+ showLinks ? /* @__PURE__ */ jsx121(MakeVideosLinks, {
49295
+ links
49296
+ }) : null
49297
+ ]
49298
+ })
49299
+ ]
49300
+ });
49301
+ };
49302
+
49303
+ // src/components/homepage/MakeVideosProgrammatically.tsx
49304
+ import { jsx as jsx125, jsxs as jsxs47, Fragment as Fragment19 } from "react/jsx-runtime";
49305
+ var MakeVideosProgrammatically = ({
49306
+ title = /* @__PURE__ */ jsxs47(Fragment19, {
49307
+ children: [
49308
+ /* @__PURE__ */ jsx125("span", {
49309
+ className: "text-[var(--subtitle)]",
49310
+ children: "Make videos"
49311
+ }),
49312
+ /* @__PURE__ */ jsx125("br", {}),
49313
+ " programmatically"
49314
+ ]
49315
+ }),
49316
+ description = "Connect data and manage complexity with code.",
49317
+ showLinks = true,
49318
+ links = [],
49319
+ showVideo = true,
49320
+ videoSrc = "/img/what-is-remotion.webm",
49321
+ fallbackVideoSrc = "/img/what-is-remotion.mp4"
49322
+ }) => {
49323
+ return /* @__PURE__ */ jsxs47("div", {
49324
+ className: "flex min-w-0 basis-0 flex-col flex-1",
49325
+ children: [
49326
+ /* @__PURE__ */ jsx125("div", {
49327
+ className: "flex aspect-square w-full items-start",
49328
+ children: showVideo ? /* @__PURE__ */ jsxs47("video", {
49329
+ muted: true,
49330
+ autoPlay: true,
49331
+ playsInline: true,
49332
+ loop: true,
49333
+ preload: "metadata",
49334
+ className: "relative max-h-full max-w-full cursor-default! object-contain lg:mb-0 lg:mt-0",
49335
+ children: [
49336
+ /* @__PURE__ */ jsx125("source", {
49337
+ src: fallbackVideoSrc,
49338
+ type: "video/mp4"
49339
+ }),
49340
+ /* @__PURE__ */ jsx125("source", {
49341
+ src: videoSrc,
49342
+ type: "video/webm"
49343
+ })
49344
+ ]
49345
+ }) : null
49346
+ }),
49347
+ /* @__PURE__ */ jsxs47("div", {
49348
+ className: "font-brand",
49349
+ children: [
49350
+ /* @__PURE__ */ jsx125("h2", {
49351
+ className: "text-2xl fontbrand leading-[1.1] font-medium",
49352
+ children: title
48953
49353
  }),
48954
- /* @__PURE__ */ jsxs41("a", {
48955
- className: "no-underline text-brand font-brand font-bold inline-flex flex-row items-center",
48956
- href: "/docs/the-fundamentals",
48957
- children: [
48958
- "Learn Remotion",
48959
- " ",
48960
- /* @__PURE__ */ jsx119("svg", {
48961
- style: icon3,
48962
- xmlns: "http://www.w3.org/2000/svg",
48963
- viewBox: "0 0 448 512",
48964
- children: /* @__PURE__ */ jsx119("path", {
48965
- fill: "currentColor",
48966
- d: "M438.6 278.6l-160 160C272.4 444.9 264.2 448 256 448s-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L338.8 288H32C14.33 288 .0016 273.7 .0016 256S14.33 224 32 224h306.8l-105.4-105.4c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l160 160C451.1 245.9 451.1 266.1 438.6 278.6z"
48967
- })
48968
- })
48969
- ]
48970
- })
49354
+ /* @__PURE__ */ jsx125("p", {
49355
+ className: "leading-relaxed",
49356
+ children: description
49357
+ }),
49358
+ showLinks ? /* @__PURE__ */ jsx125(MakeVideosLinks, {
49359
+ links
49360
+ }) : null
48971
49361
  ]
48972
49362
  })
48973
49363
  ]
@@ -48975,12 +49365,12 @@ var IfYouKnowReact = () => {
48975
49365
  };
48976
49366
 
48977
49367
  // src/components/homepage/NewsletterButton.tsx
48978
- import { useCallback as useCallback56, useState as useState59 } from "react";
48979
- import { jsx as jsx120, jsxs as jsxs44 } from "react/jsx-runtime";
49368
+ import { useCallback as useCallback56, useState as useState58 } from "react";
49369
+ import { jsx as jsx127, jsxs as jsxs48 } from "react/jsx-runtime";
48980
49370
  var NewsletterButton = () => {
48981
- const [email, setEmail] = useState59("");
48982
- const [submitting, setSubmitting] = useState59(false);
48983
- const [subscribed, setSubscribed] = useState59(false);
49371
+ const [email, setEmail] = useState58("");
49372
+ const [submitting, setSubmitting] = useState58(false);
49373
+ const [subscribed, setSubscribed] = useState58(false);
48984
49374
  const handleSubmit = useCallback56(async (e) => {
48985
49375
  try {
48986
49376
  setSubmitting(true);
@@ -49003,34 +49393,34 @@ var NewsletterButton = () => {
49003
49393
  alert("Something went wrong. Please try again later.");
49004
49394
  }
49005
49395
  }, [email]);
49006
- return /* @__PURE__ */ jsx120("div", {
49007
- children: /* @__PURE__ */ jsx120("div", {
49396
+ return /* @__PURE__ */ jsx127("div", {
49397
+ children: /* @__PURE__ */ jsx127("div", {
49008
49398
  className: "flex flex-col",
49009
- children: /* @__PURE__ */ jsx120("div", {
49399
+ children: /* @__PURE__ */ jsx127("div", {
49010
49400
  className: "w-full",
49011
- children: /* @__PURE__ */ jsxs44("div", {
49401
+ children: /* @__PURE__ */ jsxs48("div", {
49012
49402
  className: "flex flex-col flex-1",
49013
49403
  children: [
49014
- /* @__PURE__ */ jsx120(SectionTitle, {
49404
+ /* @__PURE__ */ jsx127(SectionTitle, {
49015
49405
  children: "Newsletter"
49016
49406
  }),
49017
- /* @__PURE__ */ jsxs44("form", {
49407
+ /* @__PURE__ */ jsxs48("form", {
49018
49408
  onSubmit: handleSubmit,
49019
49409
  style: {
49020
49410
  width: "100%"
49021
49411
  },
49022
49412
  children: [
49023
- /* @__PURE__ */ jsxs44("div", {
49413
+ /* @__PURE__ */ jsxs48("div", {
49024
49414
  className: "fontbrand text-center mb-10 -mt-4",
49025
49415
  children: [
49026
49416
  "Read about new features and noteworthy updates we have made on Remotion once in a while.",
49027
49417
  " "
49028
49418
  ]
49029
49419
  }),
49030
- /* @__PURE__ */ jsxs44("div", {
49420
+ /* @__PURE__ */ jsxs48("div", {
49031
49421
  className: "flex flex-col md:flex-row gap-2 justify-center",
49032
49422
  children: [
49033
- /* @__PURE__ */ jsx120(Input, {
49423
+ /* @__PURE__ */ jsx127(Input, {
49034
49424
  disabled: submitting,
49035
49425
  value: email,
49036
49426
  className: "md:max-w-[400px]",
@@ -49039,14 +49429,14 @@ var NewsletterButton = () => {
49039
49429
  required: true,
49040
49430
  placeholder: "animator@gmail.com"
49041
49431
  }),
49042
- /* @__PURE__ */ jsx120("div", {
49043
- children: /* @__PURE__ */ jsx120(Button, {
49432
+ /* @__PURE__ */ jsx127("div", {
49433
+ children: /* @__PURE__ */ jsx127(Button, {
49044
49434
  type: "submit",
49045
49435
  className: "w-14 rounded-full h-14 bg-brand text-white font-bold disabled:text-white/50 disabled:border-black px-0 py-0",
49046
49436
  disabled: submitting || subscribed,
49047
- children: subscribed ? /* @__PURE__ */ jsx120(CheckIcon, {
49437
+ children: subscribed ? /* @__PURE__ */ jsx127(CheckIcon, {
49048
49438
  className: " size-5 mt-[1px]"
49049
- }) : /* @__PURE__ */ jsx120(PlanePaperIcon, {
49439
+ }) : /* @__PURE__ */ jsx127(PlanePaperIcon, {
49050
49440
  className: " size-6 ml-[2px]"
49051
49441
  })
49052
49442
  })
@@ -49062,269 +49452,19 @@ var NewsletterButton = () => {
49062
49452
  });
49063
49453
  };
49064
49454
 
49065
- // src/components/homepage/ParameterizeAndEdit.tsx
49066
- import { useEffect as useEffect60, useRef as useRef60, useState as useState60 } from "react";
49067
- import { jsx as jsx121, jsxs as jsxs46 } from "react/jsx-runtime";
49068
- var icon4 = {
49069
- height: 16,
49070
- marginLeft: 10
49071
- };
49072
- var ParameterizeAndEdit = () => {
49073
- const ref = useRef60(null);
49074
- const [vid, setVid] = useState60("/img/editing-vp9-chrome.webm");
49075
- useEffect60(() => {
49076
- if (isWebkit()) {
49077
- setVid("/img/editing-safari.mp4");
49078
- }
49079
- }, []);
49080
- return /* @__PURE__ */ jsxs46("div", {
49081
- ref,
49082
- className: "flex flex-col lg:flex-row justify-start lg:justify-end items-start gap-6 mt-20 lg:mt-0",
49083
- children: [
49084
- /* @__PURE__ */ jsx121("div", {
49085
- children: /* @__PURE__ */ jsx121("video", {
49086
- src: vid,
49087
- autoPlay: true,
49088
- muted: true,
49089
- playsInline: true,
49090
- loop: true,
49091
- style: {
49092
- width: 500,
49093
- maxWidth: "100%",
49094
- borderRadius: 7,
49095
- overflow: "hidden"
49096
- }
49097
- })
49098
- }),
49099
- /* @__PURE__ */ jsxs46("div", {
49100
- style: { flex: 1 },
49101
- className: "font-brand pt-4",
49102
- children: [
49103
- /* @__PURE__ */ jsxs46("h2", {
49104
- className: "fontbrand text-4xl",
49105
- children: [
49106
- "Edit ",
49107
- /* @__PURE__ */ jsx121("span", {
49108
- className: "text-brand",
49109
- children: "dynamically"
49110
- })
49111
- ]
49112
- }),
49113
- /* @__PURE__ */ jsxs46("p", {
49114
- className: "leading-relaxed",
49115
- children: [
49116
- "Parameterize your video by passing data.",
49117
- /* @__PURE__ */ jsx121("br", {}),
49118
- "Or embed it into your app and build an interface around it."
49119
- ]
49120
- }),
49121
- /* @__PURE__ */ jsx121("div", {
49122
- className: "h-4"
49123
- }),
49124
- /* @__PURE__ */ jsxs46("div", {
49125
- className: "leading-6",
49126
- children: [
49127
- /* @__PURE__ */ jsxs46("a", {
49128
- className: "no-underline text-brand font-brand font-bold inline-flex flex-row items-center",
49129
- href: "/docs/studio",
49130
- children: [
49131
- "Remotion Studio",
49132
- " ",
49133
- /* @__PURE__ */ jsx121("svg", {
49134
- style: icon4,
49135
- xmlns: "http://www.w3.org/2000/svg",
49136
- viewBox: "0 0 448 512",
49137
- children: /* @__PURE__ */ jsx121("path", {
49138
- fill: "currentColor",
49139
- d: "M438.6 278.6l-160 160C272.4 444.9 264.2 448 256 448s-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L338.8 288H32C14.33 288 .0016 273.7 .0016 256S14.33 224 32 224h306.8l-105.4-105.4c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l160 160C451.1 245.9 451.1 266.1 438.6 278.6z"
49140
- })
49141
- })
49142
- ]
49143
- }),
49144
- /* @__PURE__ */ jsx121("br", {}),
49145
- /* @__PURE__ */ jsxs46("a", {
49146
- className: "no-underline text-brand font-brand font-bold inline-flex flex-row items-center",
49147
- href: "/player",
49148
- children: [
49149
- "Remotion Player",
49150
- " ",
49151
- /* @__PURE__ */ jsx121("svg", {
49152
- style: icon4,
49153
- xmlns: "http://www.w3.org/2000/svg",
49154
- viewBox: "0 0 448 512",
49155
- children: /* @__PURE__ */ jsx121("path", {
49156
- fill: "currentColor",
49157
- d: "M438.6 278.6l-160 160C272.4 444.9 264.2 448 256 448s-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L338.8 288H32C14.33 288 .0016 273.7 .0016 256S14.33 224 32 224h306.8l-105.4-105.4c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l160 160C451.1 245.9 451.1 266.1 438.6 278.6z"
49158
- })
49159
- })
49160
- ]
49161
- }),
49162
- /* @__PURE__ */ jsx121("br", {}),
49163
- /* @__PURE__ */ jsxs46("a", {
49164
- className: "no-underline text-brand font-brand font-bold inline-flex flex-row items-center",
49165
- href: "/docs/editor-starter",
49166
- children: [
49167
- "Remotion Editor Starter",
49168
- " ",
49169
- /* @__PURE__ */ jsx121("svg", {
49170
- style: icon4,
49171
- xmlns: "http://www.w3.org/2000/svg",
49172
- viewBox: "0 0 448 512",
49173
- children: /* @__PURE__ */ jsx121("path", {
49174
- fill: "currentColor",
49175
- d: "M438.6 278.6l-160 160C272.4 444.9 264.2 448 256 448s-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L338.8 288H32C14.33 288 .0016 273.7 .0016 256S14.33 224 32 224h306.8l-105.4-105.4c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l160 160C451.1 245.9 451.1 266.1 438.6 278.6z"
49176
- })
49177
- })
49178
- ]
49179
- })
49180
- ]
49181
- })
49182
- ]
49183
- })
49184
- ]
49185
- });
49186
- };
49187
-
49188
- // src/components/homepage/RealMp4Videos.tsx
49189
- import { useEffect as useEffect61, useRef as useRef61, useState as useState61 } from "react";
49190
- import { jsx as jsx125, jsxs as jsxs47 } from "react/jsx-runtime";
49191
- var icon5 = {
49192
- height: 16,
49193
- marginLeft: 10
49194
- };
49195
- var RealMP4Videos = () => {
49196
- const ref = useRef61(null);
49197
- const videoRef = useRef61(null);
49198
- const [vid, setVid] = useState61("/img/render-progress.webm");
49199
- useEffect61(() => {
49200
- if (isWebkit()) {
49201
- setVid("/img/render-progress.mp4");
49202
- }
49203
- }, []);
49204
- useEffect61(() => {
49205
- const { current } = ref;
49206
- if (!current) {
49207
- return;
49208
- }
49209
- const callback = (data2) => {
49210
- if (data2[0].isIntersecting) {
49211
- videoRef.current?.play();
49212
- }
49213
- };
49214
- const observer = new IntersectionObserver(callback, {
49215
- root: null,
49216
- threshold: 0.5
49217
- });
49218
- observer.observe(current);
49219
- return () => observer.unobserve(current);
49220
- }, []);
49221
- return /* @__PURE__ */ jsxs47("div", {
49222
- ref,
49223
- className: "flex flex-col lg:flex-row mt-40 lg:mt-30 gap-6",
49224
- children: [
49225
- /* @__PURE__ */ jsx125("div", {
49226
- className: "flex w-[500px] justify-start lg:justify-start items-end",
49227
- children: /* @__PURE__ */ jsx125("video", {
49228
- ref: videoRef,
49229
- src: vid,
49230
- muted: true,
49231
- autoPlay: true,
49232
- playsInline: true,
49233
- loop: true,
49234
- style: {
49235
- width: 400,
49236
- maxWidth: "100%",
49237
- borderRadius: 7,
49238
- overflow: "hidden"
49239
- },
49240
- className: "w-[550px] cursor-default! relative lg:translate-x-8 -mt-20 lg:mt-0"
49241
- })
49242
- }),
49243
- " ",
49244
- /* @__PURE__ */ jsxs47("div", {
49245
- className: "font-brand",
49246
- children: [
49247
- /* @__PURE__ */ jsxs47("h2", {
49248
- className: "text-4xl fontbrand",
49249
- children: [
49250
- /* @__PURE__ */ jsx125("span", {
49251
- className: "text-brand",
49252
- children: "Scalable"
49253
- }),
49254
- " rendering"
49255
- ]
49256
- }),
49257
- /* @__PURE__ */ jsxs47("p", {
49258
- className: "leading-relaxed",
49259
- children: [
49260
- "Render the video as .mp4 or other formats. ",
49261
- /* @__PURE__ */ jsx125("br", {}),
49262
- "Locally, on the server or serverless."
49263
- ]
49264
- }),
49265
- " ",
49266
- /* @__PURE__ */ jsx125("div", {
49267
- className: "h-4"
49268
- }),
49269
- /* @__PURE__ */ jsxs47("div", {
49270
- className: "leading-6",
49271
- children: [
49272
- /* @__PURE__ */ jsxs47("a", {
49273
- className: "no-underline text-brand font-brand font-bold inline-flex flex-row items-center",
49274
- href: "/docs/render",
49275
- children: [
49276
- "Render options",
49277
- " ",
49278
- /* @__PURE__ */ jsx125("svg", {
49279
- style: icon5,
49280
- xmlns: "http://www.w3.org/2000/svg",
49281
- viewBox: "0 0 448 512",
49282
- children: /* @__PURE__ */ jsx125("path", {
49283
- fill: "currentColor",
49284
- d: "M438.6 278.6l-160 160C272.4 444.9 264.2 448 256 448s-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L338.8 288H32C14.33 288 .0016 273.7 .0016 256S14.33 224 32 224h306.8l-105.4-105.4c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l160 160C451.1 245.9 451.1 266.1 438.6 278.6z"
49285
- })
49286
- })
49287
- ]
49288
- }),
49289
- /* @__PURE__ */ jsx125("br", {}),
49290
- /* @__PURE__ */ jsxs47("a", {
49291
- className: "no-underline text-brand font-brand font-bold inline-flex flex-row items-center",
49292
- href: "/lambda",
49293
- children: [
49294
- "Remotion Lambda",
49295
- " ",
49296
- /* @__PURE__ */ jsx125("svg", {
49297
- style: icon5,
49298
- xmlns: "http://www.w3.org/2000/svg",
49299
- viewBox: "0 0 448 512",
49300
- children: /* @__PURE__ */ jsx125("path", {
49301
- fill: "currentColor",
49302
- d: "M438.6 278.6l-160 160C272.4 444.9 264.2 448 256 448s-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L338.8 288H32C14.33 288 .0016 273.7 .0016 256S14.33 224 32 224h306.8l-105.4-105.4c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l160 160C451.1 245.9 451.1 266.1 438.6 278.6z"
49303
- })
49304
- })
49305
- ]
49306
- })
49307
- ]
49308
- })
49309
- ]
49310
- })
49311
- ]
49312
- });
49313
- };
49314
-
49315
49455
  // src/components/homepage/TrustedByBanner.tsx
49316
- import { jsx as jsx127, jsxs as jsxs48, Fragment as Fragment16 } from "react/jsx-runtime";
49456
+ import { jsx as jsx128, jsxs as jsxs49, Fragment as Fragment20 } from "react/jsx-runtime";
49317
49457
  var TrustedByBanner = () => {
49318
49458
  const logos = [
49319
49459
  {
49320
49460
  id: "logo1",
49321
49461
  url: "https://www.github.com/",
49322
- light: /* @__PURE__ */ jsx127("svg", {
49462
+ light: /* @__PURE__ */ jsx128("svg", {
49323
49463
  height: "50",
49324
49464
  viewBox: "0 0 64 62",
49325
49465
  fill: "none",
49326
49466
  xmlns: "http://www.w3.org/2000/svg",
49327
- children: /* @__PURE__ */ jsx127("path", {
49467
+ children: /* @__PURE__ */ jsx128("path", {
49328
49468
  d: "M21.3033 49.7496C21.3033 50.0051 21.0079 50.2095 20.6355 50.2095C20.2118 50.2478 19.9164 50.0434 19.9164 49.7496C19.9164 49.4941 20.2118 49.2896 20.5842 49.2896C20.9694 49.2513 21.3033 49.4557 21.3033 49.7496ZM17.3097 49.1747C17.2198 49.4302 17.4766 49.724 17.8619 49.8007C18.1957 49.9284 18.581 49.8007 18.658 49.5452C18.7351 49.2896 18.4911 48.9958 18.1059 48.8808C17.772 48.7914 17.3996 48.9191 17.3097 49.1747ZM22.9854 48.9575C22.6131 49.0469 22.3562 49.2896 22.3948 49.5835C22.4333 49.839 22.7671 50.0051 23.1524 49.9157C23.5248 49.8262 23.7816 49.5835 23.7431 49.328C23.7045 49.0852 23.3578 48.9191 22.9854 48.9575ZM31.4348 0C13.6243 0 0 13.4531 0 31.1733C0 45.3419 8.96304 57.4663 21.7655 61.7334C23.4092 62.0273 23.987 61.018 23.987 60.1875C23.987 59.3954 23.9485 55.0261 23.9485 52.3431C23.9485 52.3431 14.9598 54.2595 13.0722 48.5359C13.0722 48.5359 11.6083 44.8181 9.50236 43.8599C9.50236 43.8599 6.56177 41.854 9.70782 41.8924C9.70782 41.8924 12.9052 42.1479 14.6645 45.1886C17.4766 50.1201 22.1893 48.702 24.0256 47.8587C24.3209 45.8146 25.1556 44.3965 26.0801 43.5532C18.902 42.7611 11.6597 41.7263 11.6597 29.4358C11.6597 25.9224 12.6356 24.1593 14.6901 21.9108C14.3563 21.0803 13.2648 17.6564 15.024 13.2359C17.7078 12.4055 23.8843 16.6854 23.8843 16.6854C26.4525 15.9699 29.2133 15.5994 31.9485 15.5994C34.6836 15.5994 37.4444 15.9699 40.0126 16.6854C40.0126 16.6854 46.1892 12.3927 48.873 13.2359C50.6322 17.6691 49.5407 21.0803 49.2068 21.9108C51.2614 24.1721 52.5198 25.9352 52.5198 29.4358C52.5198 41.7646 44.9564 42.7484 37.7783 43.5532C38.9597 44.5625 39.9613 46.4789 39.9613 49.4813C39.9613 53.7868 39.9228 59.1144 39.9228 60.162C39.9228 60.9924 40.5134 62.0017 42.1443 61.7079C54.9853 57.4663 63.6915 45.3419 63.6915 31.1733C63.6915 13.4531 49.2453 0 31.4348 0ZM12.4815 44.0643C12.3145 44.192 12.3531 44.4859 12.5714 44.7286C12.7768 44.933 13.0722 45.0225 13.2391 44.8564C13.406 44.7286 13.3675 44.4348 13.1492 44.192C12.9438 43.9876 12.6484 43.8982 12.4815 44.0643ZM11.0946 43.0294C11.0048 43.1955 11.1332 43.3999 11.39 43.5277C11.5954 43.6554 11.8523 43.6171 11.9422 43.4383C12.032 43.2722 11.9036 43.0678 11.6468 42.94C11.39 42.8633 11.1845 42.9017 11.0946 43.0294ZM15.2551 47.5777C15.0497 47.7438 15.1267 48.127 15.4221 48.3698C15.7174 48.6636 16.0898 48.702 16.2567 48.4975C16.4237 48.3314 16.3466 47.9482 16.0898 47.7054C15.8073 47.4116 15.4221 47.3732 15.2551 47.5777ZM13.7913 45.6996C13.5858 45.8274 13.5858 46.1595 13.7913 46.4534C13.9967 46.7472 14.3434 46.875 14.5104 46.7472C14.7158 46.5811 14.7158 46.249 14.5104 45.9551C14.3306 45.6613 13.9967 45.5335 13.7913 45.6996Z",
49329
49469
  fill: "var(--text-color)"
49330
49470
  })
@@ -49333,57 +49473,57 @@ var TrustedByBanner = () => {
49333
49473
  {
49334
49474
  id: "logo2",
49335
49475
  url: "https://www.musixmatch.com/",
49336
- light: /* @__PURE__ */ jsxs48("svg", {
49476
+ light: /* @__PURE__ */ jsxs49("svg", {
49337
49477
  height: "40",
49338
49478
  viewBox: "0 0 229 48",
49339
49479
  fill: "none",
49340
49480
  xmlns: "http://www.w3.org/2000/svg",
49341
49481
  children: [
49342
- /* @__PURE__ */ jsx127("path", {
49482
+ /* @__PURE__ */ jsx128("path", {
49343
49483
  d: "M6.51644 0.088258C4.05524 0.528184 1.89128 2.12143 0.856857 4.24972C-0.058664 6.12832 0.000785433 4.71342 0.000785433 23.7491C0.000785433 38.5758 0.0245652 40.9181 0.179134 41.5245C0.892527 44.3543 2.99704 46.4826 5.82683 47.2435C6.77802 47.4932 8.49017 47.5289 9.48892 47.303C11.0465 46.9582 11.855 46.4113 18.9889 40.9538C22.7224 38.1002 25.8137 35.7579 25.8613 35.7579C25.897 35.7579 29.0002 38.1002 32.7336 40.9538C36.5622 43.8906 39.9033 46.3518 40.367 46.6015C40.8307 46.8393 41.5441 47.1246 41.9721 47.2435C43.0065 47.517 44.8613 47.517 45.8958 47.2435C48.4996 46.5302 50.5328 44.5921 51.4364 41.9407C51.6505 41.3105 51.6623 40.5733 51.6623 23.7491V6.21155L51.377 5.34359C50.6398 3.08451 48.7255 1.19402 46.3595 0.385505C45.4796 0.088258 45.1943 0.0406985 43.9339 0.0406985C42.6855 0.0406985 42.3882 0.088258 41.5559 0.373615C41.0328 0.551964 40.3432 0.861101 40.0103 1.06323C39.6892 1.26536 36.3957 3.70278 32.7099 6.48502C29.0121 9.26725 25.9326 11.5382 25.8613 11.5382C25.79 11.5382 22.7105 9.26725 19.0127 6.48502C15.3269 3.70278 12.0334 1.26536 11.7123 1.06323C10.3569 0.230937 8.06213 -0.197099 6.51644 0.088258ZM8.82308 4.63019C9.13222 4.72531 11.5459 6.46124 15.6835 9.57639C19.1911 12.2159 22.0684 14.4037 22.0803 14.4512C22.1279 14.582 14.1141 20.7172 13.912 20.7053C13.8168 20.7053 11.6291 19.0764 9.06088 17.0908L4.38815 13.4882L4.42382 10.2066L4.45949 6.92494L4.78052 6.33045C5.06588 5.7954 5.39879 5.40304 5.96951 4.975C6.57589 4.5113 7.91945 4.35673 8.82308 4.63019ZM45.0872 4.67775C45.8125 4.91555 46.5497 5.5695 46.9421 6.31856L47.2631 6.92494L47.2988 10.2066L47.3344 13.4882L42.6617 17.0908C40.0935 19.0764 37.9057 20.7053 37.7987 20.7053C37.5966 20.7172 29.5947 14.582 29.6423 14.4512C29.7017 14.2491 42.519 4.71342 42.8519 4.6183C43.4345 4.43996 44.4927 4.47563 45.0872 4.67775ZM30.0346 20.5032C32.2818 22.251 34.0891 23.7135 34.0415 23.7491C33.8632 23.9156 26.0991 29.8843 25.9683 29.9675C25.8375 30.0389 17.7167 23.868 17.6929 23.6778C17.6929 23.5827 25.6948 17.3405 25.8375 17.3405C25.897 17.3286 27.7875 18.7554 30.0346 20.5032ZM7.37252 21.4425C9.72671 23.2616 10.2142 23.6897 10.0834 23.8086C9.80994 24.082 4.51894 28.1484 4.45949 28.1484C4.42382 28.1484 4.40004 26.139 4.40004 23.6897C4.40004 21.2404 4.42382 19.231 4.4476 19.231C4.48327 19.231 5.80305 20.2297 7.37252 21.4425ZM47.3225 23.6897C47.3225 26.139 47.2988 28.1484 47.2631 28.1484C47.2274 28.1484 45.9195 27.1496 44.3501 25.9369C42.2456 24.308 41.5203 23.6778 41.6154 23.5827C41.8651 23.333 47.1442 19.2548 47.2393 19.2429C47.2869 19.231 47.3225 21.2404 47.3225 23.6897ZM20.3682 31.4776C21.3312 32.2147 22.116 32.8568 22.116 32.8925C22.1041 33.047 9.59592 42.4995 9.07277 42.7373C7.51519 43.4745 5.58903 42.7492 4.79241 41.1321L4.45949 40.4544L4.42382 37.1847L4.38815 33.9031L9.156 30.2053L13.9357 26.5076L16.2662 28.3148C17.5621 29.3017 19.3932 30.7285 20.3682 31.4776ZM42.6617 30.3005L47.3344 33.915L47.2988 37.2442L47.2631 40.5733L46.9421 41.1678C46.5378 41.9288 46.1217 42.3211 45.3013 42.7016C44.4452 43.1059 43.4583 43.1178 42.6498 42.7373C42.0197 42.4519 29.5947 33.0232 29.6423 32.8687C29.7017 32.6665 37.7631 26.5195 37.8701 26.6027C37.9414 26.6503 40.0935 28.303 42.6617 30.3005Z",
49344
49484
  fill: "var(--text-color)"
49345
49485
  }),
49346
- /* @__PURE__ */ jsx127("path", {
49486
+ /* @__PURE__ */ jsx128("path", {
49347
49487
  d: "M120.255 8.16145C119.673 8.43492 118.983 9.20776 118.805 9.82604C118.484 10.8842 118.709 11.7998 119.47 12.5607C120.374 13.4643 121.563 13.6546 122.681 13.0958C124.785 12.0494 124.678 9.00564 122.502 8.09011C121.955 7.86421 120.838 7.89988 120.255 8.16145Z",
49348
49488
  fill: "var(--text-color)"
49349
49489
  }),
49350
- /* @__PURE__ */ jsx127("path", {
49490
+ /* @__PURE__ */ jsx128("path", {
49351
49491
  d: "M214.613 19.7065V31.4775H216.801H219.001L219.036 26.8048C219.084 21.6446 219.084 21.6327 219.88 20.7885C220.427 20.2178 221.081 19.9443 221.926 19.9443C222.817 19.9443 223.507 20.2535 223.947 20.8123C224.565 21.6327 224.601 21.9656 224.601 26.9237V31.4775H226.8H229V26.0914C229 21.6446 228.964 20.5864 228.822 20.0038C228.382 18.2916 227.478 17.1145 226.087 16.4249C223.935 15.3667 221.414 15.6759 219.809 17.1978C219.452 17.5307 219.131 17.8042 219.096 17.8042C219.048 17.8042 219.013 15.5807 219.013 12.8699V7.93555H216.813H214.613V19.7065Z",
49352
49492
  fill: "var(--text-color)"
49353
49493
  }),
49354
- /* @__PURE__ */ jsx127("path", {
49494
+ /* @__PURE__ */ jsx128("path", {
49355
49495
  d: "M188.574 13.6427V16.0207H187.088H185.602V17.9825V19.9443H187.076H188.563L188.598 23.8323C188.646 27.4587 188.67 27.7917 188.907 28.5051C189.383 29.9437 190.477 30.9781 191.963 31.43C192.819 31.6915 194.757 31.7629 195.827 31.5726L196.719 31.4181L196.755 29.6108L196.79 27.8154L195.482 27.7679C194.032 27.7322 193.723 27.6014 193.271 26.8286C193.045 26.4481 193.033 26.2103 193.033 23.2141V20.0038L194.971 19.9681L196.897 19.9443V17.9825V16.0207H194.935H192.974V13.6427V11.2647H190.774H188.574V13.6427Z",
49356
49496
  fill: "var(--text-color)"
49357
49497
  }),
49358
- /* @__PURE__ */ jsx127("path", {
49498
+ /* @__PURE__ */ jsx128("path", {
49359
49499
  d: "M109.768 15.8423C106.82 16.3774 104.763 18.6959 105.048 21.1809C105.321 23.654 106.736 24.8192 110.196 25.4137C110.957 25.5445 111.813 25.7466 112.087 25.8417C113.775 26.46 113.145 28.3862 111.266 28.3862C110.089 28.3862 109.233 27.8511 108.829 26.8999C108.71 26.6027 108.532 26.3649 108.437 26.3649C108.341 26.3649 107.485 26.5789 106.534 26.8286C104.81 27.2804 104.81 27.2923 104.822 27.6252C104.87 28.6834 106.273 30.3837 107.652 31.0614C109.804 32.1196 112.8 32.0839 114.869 30.9901C115.796 30.4907 116.783 29.4206 117.104 28.5764C117.616 27.1972 117.544 25.6039 116.902 24.4268C116.141 23.0238 114.477 22.1797 111.778 21.8467C110.47 21.6803 109.673 21.4187 109.447 21.0977C108.936 20.3605 109.554 19.3261 110.612 19.1715C111.742 19.0051 112.574 19.3974 113.074 20.3367C113.24 20.6459 113.43 20.8955 113.49 20.8955C113.561 20.8955 114.417 20.6815 115.392 20.4318C117.425 19.9206 117.342 20.0157 116.759 18.8029C116.046 17.3167 114.405 16.1753 112.515 15.8423C111.385 15.6402 110.898 15.6402 109.768 15.8423Z",
49360
49500
  fill: "var(--text-color)"
49361
49501
  }),
49362
- /* @__PURE__ */ jsx127("path", {
49502
+ /* @__PURE__ */ jsx128("path", {
49363
49503
  d: "M70.1511 15.9493C69.4496 16.1515 68.9146 16.4249 68.1655 16.9838L67.5353 17.4593V16.7341V16.0207H65.3357H63.1361V23.7491V31.4775H65.3952H67.6424L67.678 26.6265C67.7137 21.9299 67.7256 21.7754 67.9753 21.3117C68.4865 20.3605 69.2237 19.9443 70.3889 19.9443C71.5541 19.9443 72.2675 20.3961 72.7312 21.4306C72.9215 21.8586 72.9452 22.3937 72.9809 26.6859L73.0166 31.4775H75.2043H77.3921L77.4277 26.6265C77.4634 21.9299 77.4753 21.7754 77.725 21.3117C78.2362 20.3486 78.9734 19.9443 80.1624 19.9443C81.0304 19.9443 81.7557 20.2297 82.1361 20.7172C82.7068 21.4425 82.7544 21.9181 82.7544 26.8642V31.4775H85.0254H87.2963L87.2488 26.0914C87.2012 20.9431 87.1893 20.6815 86.9396 19.9324C86.4284 18.3749 85.4058 17.2216 83.8602 16.4487C82.9565 15.9969 81.9102 15.7829 80.5548 15.7829C78.7832 15.7829 77.5942 16.1515 76.5003 17.0432L76.0009 17.4356L75.561 17.0194C74.6574 16.1634 73.4684 15.7829 71.8276 15.7948C71.1974 15.7948 70.4484 15.8661 70.1511 15.9493Z",
49364
49504
  fill: "var(--text-color)"
49365
49505
  }),
49366
- /* @__PURE__ */ jsx127("path", {
49506
+ /* @__PURE__ */ jsx128("path", {
49367
49507
  d: "M149.064 15.9018C148.434 16.0682 147.459 16.5676 146.877 17.0551L146.365 17.4593V16.746V16.0207H144.166H141.966V23.7491V31.4775H144.154H146.353L146.401 26.8048C146.425 23.7253 146.484 22.0013 146.579 21.7278C146.781 21.1333 147.4 20.4199 147.959 20.1702C148.624 19.873 149.801 19.873 150.384 20.1702C150.943 20.4556 151.169 20.7053 151.466 21.3711C151.704 21.8824 151.716 22.1321 151.716 26.6859V31.4775H153.975H156.234V26.8286C156.234 21.7873 156.258 21.5614 156.864 20.8242C157.363 20.2178 158.017 19.9443 158.98 19.9443C160.134 19.9443 160.704 20.2654 161.168 21.1928L161.525 21.9062L161.561 26.6859L161.596 31.4775H163.796H165.984V26.1509C165.984 20.3961 165.96 20.194 165.318 18.9218C164.628 17.5664 162.833 16.2704 161.133 15.9137C160.324 15.7472 158.445 15.7472 157.637 15.9137C156.793 16.092 155.913 16.52 155.306 17.0432L154.807 17.4712L154.201 16.9243C153.321 16.1277 152.536 15.878 150.883 15.8304C150.134 15.8067 149.314 15.8423 149.064 15.9018Z",
49368
49508
  fill: "var(--text-color)"
49369
49509
  }),
49370
- /* @__PURE__ */ jsx127("path", {
49510
+ /* @__PURE__ */ jsx128("path", {
49371
49511
  d: "M173.95 15.8661C171.203 16.2823 168.849 18.4224 167.934 21.3236C167.232 23.5351 167.541 26.2103 168.742 28.2435C169.23 29.0758 170.49 30.3718 171.239 30.8117C172.583 31.5964 174.211 31.9056 175.924 31.7153C177.267 31.5727 178.385 31.2278 179.074 30.7641L179.598 30.4193L179.633 30.9425L179.669 31.4775H181.869H184.056V23.8086V16.1396H181.857H179.657V16.6746V17.2216L179.122 16.853C177.957 16.0563 175.614 15.6045 173.95 15.8661ZM177.113 20.0038C178.04 20.2891 178.813 20.955 179.3 21.8943C179.693 22.6552 179.716 22.786 179.716 23.7967C179.705 24.6408 179.657 24.9975 179.455 25.4375C179.098 26.2222 178.313 27.0188 177.529 27.3993C176.97 27.6847 176.72 27.7322 175.912 27.7203C175.127 27.7203 174.842 27.6609 174.283 27.3993C173.486 27.0069 172.844 26.3292 172.428 25.4256C171.976 24.4625 171.976 23.0238 172.428 22.0607C173.248 20.2891 175.21 19.4331 177.113 20.0038Z",
49372
49512
  fill: "var(--text-color)"
49373
49513
  }),
49374
- /* @__PURE__ */ jsx127("path", {
49514
+ /* @__PURE__ */ jsx128("path", {
49375
49515
  d: "M203.615 15.9612C200.607 16.6152 198.181 18.9575 197.432 21.9062C197.004 23.5708 197.29 25.9725 198.11 27.649C198.669 28.7904 200.215 30.3123 201.416 30.9068C202.902 31.6202 203.615 31.7748 205.577 31.7629C207.099 31.7629 207.408 31.7272 208.217 31.4538C210.369 30.7404 211.831 29.5276 212.723 27.7441C213.02 27.1258 213.186 26.674 213.115 26.6146C212.996 26.4957 209.501 25.4137 209.251 25.4137C209.156 25.4137 209.013 25.5564 208.942 25.7347C208.656 26.3768 208.062 26.9475 207.301 27.328C206.635 27.6609 206.409 27.7084 205.577 27.7084C204.745 27.7084 204.531 27.6609 203.853 27.328C201.094 25.9606 201.118 21.5733 203.889 20.2178C204.471 19.9325 204.709 19.8849 205.577 19.8849C206.362 19.8849 206.718 19.9443 207.135 20.1465C207.8 20.4437 208.538 21.1571 208.823 21.7516L209.025 22.1915L209.596 22.0132C209.905 21.9181 210.809 21.6446 211.617 21.4068L213.079 20.9669L212.996 20.6102C212.961 20.408 212.735 19.8849 212.509 19.445C211.665 17.8161 209.715 16.4368 207.634 15.9731C206.599 15.7472 204.614 15.7353 203.615 15.9612Z",
49376
49516
  fill: "var(--text-color)"
49377
49517
  }),
49378
- /* @__PURE__ */ jsx127("path", {
49518
+ /* @__PURE__ */ jsx128("path", {
49379
49519
  d: "M119.256 23.7491V31.4775H121.456H123.656V23.7491V16.0207H121.456H119.256V23.7491Z",
49380
49520
  fill: "var(--text-color)"
49381
49521
  }),
49382
- /* @__PURE__ */ jsx127("path", {
49522
+ /* @__PURE__ */ jsx128("path", {
49383
49523
  d: "M125.082 16.0801C125.082 16.1158 126.283 17.8517 127.746 19.9443L130.409 23.7491L127.686 27.5539C126.188 29.6584 124.964 31.3943 124.964 31.4181C124.964 31.4537 126.057 31.4775 127.401 31.4775H129.838L131.277 29.2779C132.074 28.0651 132.763 27.0783 132.811 27.0783C132.858 27.0783 133.548 28.0651 134.333 29.2779L135.771 31.4775H138.28H140.801L140.385 30.9068C138.661 28.5407 135.308 23.7372 135.308 23.6421C135.308 23.5826 136.473 21.9062 137.9 19.9206C139.326 17.9231 140.539 16.2347 140.587 16.1634C140.646 16.0563 140.087 16.0207 138.221 16.0207H135.771L134.333 18.2203C133.548 19.4212 132.858 20.3961 132.823 20.3724C132.787 20.3486 132.133 19.3498 131.384 18.1727L130.017 16.0207H127.556C126.188 16.0207 125.082 16.0445 125.082 16.0801Z",
49384
49524
  fill: "var(--text-color)"
49385
49525
  }),
49386
- /* @__PURE__ */ jsx127("path", {
49526
+ /* @__PURE__ */ jsx128("path", {
49387
49527
  d: "M88.9728 21.0382C89.0323 26.5076 89.0679 26.7929 89.8527 28.291C90.9228 30.3361 93.051 31.6083 95.7144 31.7986C98.5561 32.0007 101.41 30.5501 102.575 28.3267C103.336 26.8643 103.36 26.6978 103.407 21.1571L103.455 16.1396H101.196H98.9246V20.8123C98.9246 26.1033 98.9009 26.2698 98.0924 27.0069C97.0579 27.9343 95.2269 27.8987 94.2638 26.9356C93.491 26.1627 93.4553 25.8655 93.4553 20.6934V16.1396H91.1843H88.9134L88.9728 21.0382Z",
49388
49528
  fill: "var(--text-color)"
49389
49529
  })
@@ -49393,18 +49533,18 @@ var TrustedByBanner = () => {
49393
49533
  {
49394
49534
  id: "logo3",
49395
49535
  url: "https://www.wistia.com/",
49396
- light: /* @__PURE__ */ jsxs48("svg", {
49536
+ light: /* @__PURE__ */ jsxs49("svg", {
49397
49537
  height: "30",
49398
49538
  viewBox: "0 0 165 36",
49399
49539
  fill: "none",
49400
49540
  className: "-mt-2",
49401
49541
  xmlns: "http://www.w3.org/2000/svg",
49402
49542
  children: [
49403
- /* @__PURE__ */ jsx127("path", {
49543
+ /* @__PURE__ */ jsx128("path", {
49404
49544
  d: "M16.4128 26.0434H11.2775C9.66644 26.0434 8.15605 26.4461 7.04844 27.6544L0.302047 35.4078C5.23597 35.7098 10.3713 35.7098 13.9962 35.7098C32.4229 35.7098 35.343 24.6337 35.4437 19.0956C33.8326 21.1094 28.9994 26.0434 16.4128 26.0434ZM33.1278 8.22082C33.0271 9.12705 32.5236 13.0541 21.4474 13.0541C12.4858 13.0541 8.8609 13.054 -3.05176e-05 12.8527L6.64567 20.5053C7.95467 22.0157 9.76713 22.5191 11.781 22.6198C13.9962 22.6198 17.017 22.7205 17.4198 22.7205C29.8049 22.7205 35.0409 16.9811 35.0409 12.8527C35.1416 10.6374 34.4368 9.22774 33.1278 8.22082Z",
49405
49545
  fill: "var(--light-text-color)"
49406
49546
  }),
49407
- /* @__PURE__ */ jsx127("path", {
49547
+ /* @__PURE__ */ jsx128("path", {
49408
49548
  d: "M68.0509 9.70953H75.3052V27.0081C75.3052 28.9054 74.8588 30.5795 74.0776 31.9187C73.2963 33.258 72.2919 34.1508 70.9526 34.8204C69.6134 35.49 68.1625 35.7132 66.4885 35.7132C64.8144 35.7132 63.3636 35.3784 62.0243 34.8204C60.6851 34.1508 59.6807 33.258 58.8994 31.9187C58.7878 31.8071 58.7878 31.5839 58.6762 31.4723C58.5646 31.5839 58.5646 31.8071 58.453 31.9187C57.6718 33.258 56.6673 34.1508 55.3281 34.8204C53.9889 35.49 52.538 35.7132 50.8639 35.7132C49.1899 35.7132 47.739 35.3784 46.5114 34.8204C45.1722 34.1508 44.1677 33.258 43.3865 31.9187C42.6053 30.5795 42.2704 29.017 42.2704 27.0081L42.0472 9.70953H49.3015V25.6689C49.3015 26.7849 49.5247 27.5662 50.0827 28.0126C50.6407 28.459 51.3104 28.6822 52.0916 28.6822C52.8728 28.6822 53.654 28.459 54.2121 28.0126C54.7701 27.5662 55.1049 26.7849 55.1049 25.6689V9.70953H57.7834H59.6807H62.3592V25.6689C62.3592 26.7849 62.694 27.5662 63.252 28.0126C63.81 28.459 64.5912 28.6822 65.3725 28.6822C66.1537 28.6822 66.8233 28.459 67.3813 28.0126C67.8277 27.5662 68.0509 26.7849 68.0509 25.6689V9.70953ZM85.796 0.446408C85.2379 0.111596 84.5683 -7.62939e-06 83.7871 -7.62939e-06C83.0059 -7.62939e-06 82.3362 0.111596 81.7782 0.446408C81.2202 0.78122 80.6622 1.22764 80.3274 1.78565C79.9926 2.34367 79.7694 3.0133 79.7694 3.68292C79.7694 4.79896 80.1042 5.69179 80.8854 6.36141C81.6666 7.03104 82.6711 7.36585 83.7871 7.36585C84.5683 7.36585 85.2379 7.25425 85.796 6.91943C86.4656 6.58462 86.912 6.13821 87.2468 5.58019C87.5816 5.02217 87.8048 4.35254 87.8048 3.57132C87.8048 2.79009 87.5816 2.23207 87.2468 1.67405C86.912 1.22764 86.4656 0.78122 85.796 0.446408ZM80.1042 35.1552H87.3584V10.0443H80.1042V35.1552ZM104.211 23.4368C103.876 22.8788 103.318 22.3208 102.871 21.7628C102.425 21.3163 101.867 20.8699 101.309 20.3119C100.862 19.8655 100.528 19.5307 100.193 19.1959C99.9697 18.8611 99.8581 18.5262 99.8581 18.0798C99.8581 17.4102 100.193 16.9638 100.974 16.629C101.755 16.2942 102.648 16.1826 103.764 16.1826H104.88L104.211 9.48632C103.541 9.37472 102.871 9.37472 102.202 9.37472C100.416 9.37472 98.742 9.59793 97.068 10.0443C95.5055 10.4908 94.1663 11.272 93.1618 12.388C92.1574 13.5041 91.5994 14.9549 91.5994 16.8522C91.5994 18.1914 91.8226 19.3075 92.3806 20.3119C92.9386 21.3163 93.6082 22.2092 94.3895 23.102C94.8359 23.5484 95.2823 23.9948 95.7287 24.4412C96.1751 24.8877 96.6215 25.3341 96.8448 25.6689C97.068 26.0037 97.1796 26.3385 97.1796 26.7849C97.1796 27.4546 96.8447 28.0126 96.0635 28.3474C95.2823 28.6822 94.2779 28.9054 92.827 28.9054C92.269 28.9054 91.8226 28.9054 91.5994 28.7938L92.4922 35.49C93.1618 35.7132 93.7198 35.7132 94.5011 35.7132C96.6215 35.7132 98.4072 35.3784 100.081 34.8204C101.755 34.2624 103.095 33.3696 104.099 32.1419C105.103 30.9143 105.55 29.4634 105.55 27.5662C105.55 26.7849 105.438 26.0037 105.215 25.2225C104.88 24.5529 104.657 23.9948 104.211 23.4368ZM117.491 28.0126C116.933 27.4546 116.71 26.6733 116.71 25.6689V16.4058H121.956V10.0443H116.71V3.68292L109.456 5.8034V28.0126C109.456 30.5795 110.014 32.5883 111.018 33.816C112.134 35.0436 113.697 35.7132 115.817 35.7132C116.933 35.7132 117.938 35.6016 118.942 35.49C119.947 35.3784 120.728 35.1552 121.509 34.8204L122.848 28.5706C122.067 28.7938 121.063 28.9054 119.947 28.9054C118.719 28.7938 117.938 28.5706 117.491 28.0126ZM126.531 35.1552H133.786V10.0443H126.531V35.1552ZM132.223 0.446408C131.665 0.111596 130.996 -7.62939e-06 130.214 -7.62939e-06C129.433 -7.62939e-06 128.763 0.111596 128.205 0.446408C127.647 0.78122 127.089 1.22764 126.755 1.78565C126.42 2.34367 126.197 3.0133 126.197 3.68292C126.197 4.79896 126.531 5.69179 127.313 6.36141C128.094 7.03104 129.098 7.36585 130.214 7.36585C130.996 7.36585 131.665 7.25425 132.223 6.91943C132.893 6.58462 133.339 6.13821 133.674 5.58019C134.009 5.02217 134.232 4.35254 134.232 3.57132C134.232 2.79009 134.009 2.23207 133.674 1.67405C133.339 1.22764 132.893 0.78122 132.223 0.446408ZM164.477 10.0443V35.1552H157.222V31.0259C156.441 32.2535 155.548 33.258 154.432 34.0392C152.87 35.1552 150.973 35.7132 148.852 35.7132C146.732 35.7132 144.834 35.1552 143.272 34.0392C141.71 32.9231 140.482 31.3607 139.589 29.3518C138.696 27.3429 138.25 25.1109 138.25 22.544C138.25 19.9771 138.696 17.745 139.589 15.8477C140.482 13.8389 141.71 12.2764 143.272 11.1604C144.834 10.0443 146.732 9.48632 148.852 9.48632C150.973 9.48632 152.87 10.0443 154.432 11.1604C155.548 11.9416 156.441 12.946 157.222 14.1737V10.0443H164.477ZM156.664 25.6689C157.222 24.7761 157.446 23.66 157.446 22.544C157.446 21.4279 157.222 20.3119 156.664 19.4191C156.218 18.5262 155.548 17.745 154.656 17.2986C153.763 16.7406 152.87 16.5174 151.754 16.5174C150.749 16.5174 149.745 16.7406 148.852 17.2986C147.959 17.8566 147.29 18.5262 146.843 19.4191C146.285 20.3119 146.062 21.3163 146.062 22.544C146.062 23.66 146.285 24.7761 146.843 25.6689C147.401 26.5617 148.071 27.3429 148.852 27.7894C149.745 28.3474 150.638 28.5706 151.754 28.5706C152.758 28.5706 153.763 28.3474 154.656 27.7894C155.548 27.3429 156.218 26.5617 156.664 25.6689Z",
49409
49549
  fill: "var(--text-color)"
49410
49550
  })
@@ -49414,27 +49554,27 @@ var TrustedByBanner = () => {
49414
49554
  {
49415
49555
  id: "logo5",
49416
49556
  url: "https://www.soundcloud.com/",
49417
- light: /* @__PURE__ */ jsx127("svg", {
49557
+ light: /* @__PURE__ */ jsx128("svg", {
49418
49558
  height: "40",
49419
49559
  viewBox: "0 0 129 57",
49420
49560
  fill: "none",
49421
49561
  xmlns: "http://www.w3.org/2000/svg",
49422
- children: /* @__PURE__ */ jsx127("path", {
49562
+ children: /* @__PURE__ */ jsx128("path", {
49423
49563
  d: "M68.962 1.89524C67.7646 2.35781 67.4474 2.83682 67.4351 3.75787V54.1228C67.4597 55.093 68.2007 55.9034 69.1483 55.9976C69.1893 55.9996 112.847 56.0222 113.134 56.0222C121.898 56.0222 129 48.9199 129 40.1536C129 31.3872 121.898 24.287 113.134 24.287C111.027 24.286 108.941 24.7042 106.997 25.5171C105.734 11.2183 93.7445 -2.25304e-06 79.1141 -2.25304e-06C75.643 0.00545336 72.2022 0.649256 68.964 1.89936M62.4471 5.46073L61.7308 41.2056L62.4471 54.1781C62.4717 55.1257 63.2454 55.9055 64.1951 55.9055C64.6562 55.9018 65.0976 55.7172 65.4241 55.3915C65.7506 55.0657 65.9362 54.6249 65.941 54.1637V54.1761L66.7188 41.2036L65.941 5.45461C65.9165 4.49876 65.1427 3.7149 64.1951 3.7149C63.2474 3.7149 62.4553 4.50079 62.4471 5.46073ZM57.1398 8.42858L56.5259 41.1913C56.5259 41.2118 57.1398 54.3643 57.1398 54.3643C57.1643 55.2547 57.889 55.9875 58.7773 55.9875C59.2089 55.9827 59.6215 55.8099 59.9276 55.5056C60.2338 55.2014 60.4094 54.7897 60.4168 54.3582L61.1064 41.2036L60.4168 8.42645C60.3923 7.52996 59.6656 6.7993 58.7793 6.7993C58.3481 6.80456 57.9359 6.97771 57.6302 7.28189C57.3245 7.58607 57.1495 7.99738 57.142 8.42858M41.2713 11.863L40.4588 41.1933L41.2733 54.6611C41.2938 55.3816 41.8872 55.9506 42.579 55.9506C43.2708 55.9506 43.8625 55.3775 43.885 54.655V54.6488L44.7999 41.1913L43.885 11.861C43.8604 11.1303 43.2872 10.5613 42.579 10.5613C41.8708 10.5613 41.2898 11.1303 41.2693 11.861M46.5171 12.6122L45.7721 41.1953L46.5191 54.5301C46.5437 55.314 47.1577 55.9343 47.9375 55.9343C48.7174 55.9343 49.3294 55.312 49.3539 54.522V54.5301L50.1727 41.1933L49.3539 12.6101C49.3294 11.818 48.7112 11.1978 47.9375 11.1978C47.1639 11.1978 46.5356 11.82 46.5171 12.6101M36.0642 12.8148L35.1842 41.1892L36.0642 54.7388C36.0711 55.0527 36.1999 55.3516 36.4234 55.5721C36.647 55.7926 36.9477 55.9173 37.2617 55.9199C37.9064 55.9199 38.4324 55.402 38.459 54.7327L39.4496 41.1892L38.459 12.8127C38.4324 12.1475 37.9064 11.6257 37.2617 11.6257C36.9467 11.6283 36.6451 11.7538 36.4214 11.9756C36.1978 12.1974 36.0695 12.4978 36.0642 12.8127M51.808 13.6561L51.1244 41.1933L51.808 54.4461C51.8325 55.2915 52.4979 55.9567 53.3371 55.9567C54.1762 55.9567 54.8435 55.2915 54.8619 54.438V54.4483L55.6272 41.1953L54.8619 13.6539C54.8581 13.2511 54.6962 12.8658 54.4109 12.5813C54.1256 12.2968 53.7399 12.1359 53.3371 12.1332C52.5184 12.1332 51.8223 12.8026 51.808 13.6561ZM30.8982 14.9946C30.8982 14.9967 29.9566 41.1831 29.9566 41.1831L30.8982 54.8719C30.9066 55.1562 31.0241 55.4263 31.2266 55.6261C31.429 55.8258 31.7008 55.9398 31.9851 55.9444C32.5643 55.9444 33.041 55.4736 33.0697 54.8678L34.1341 41.1831L33.0697 14.9946C33.039 14.3908 32.5623 13.918 31.9851 13.918C31.7001 13.9227 31.4278 14.0372 31.2253 14.2378C31.0228 14.4385 30.9056 14.7097 30.8982 14.9946ZM25.7751 19.866L24.7659 41.1831L25.7751 54.9578C25.8017 55.4961 26.2296 55.9199 26.7515 55.9199C27.0066 55.9138 27.2498 55.8107 27.4316 55.6316C27.6133 55.4525 27.7198 55.2108 27.7296 54.9558V54.96L28.872 41.1851L27.7296 19.868C27.6969 19.3276 27.2673 18.9019 26.7515 18.9019C26.2357 18.9019 25.8017 19.3256 25.7751 19.866ZM15.6516 27.0563L14.5138 41.179L15.6516 54.8412C15.6844 55.2648 16.008 55.5821 16.4092 55.5821C16.8103 55.5821 17.1296 55.2648 17.1665 54.8412L18.4559 41.179L17.1665 27.0522C17.1296 26.6326 16.8062 26.3112 16.4092 26.3112C16.0121 26.3112 15.6823 26.6306 15.6516 27.0563ZM10.6514 27.4308C10.6514 27.4329 9.44385 41.177 9.44385 41.177L10.6514 54.4195C10.6882 54.788 10.9585 55.0337 11.2982 55.0337C11.638 55.0337 11.9042 54.7676 11.9431 54.3992L13.3103 41.1565L11.9451 27.4103C11.9042 27.0419 11.6319 26.7758 11.2982 26.7758C10.9646 26.7758 10.6841 27.0419 10.6514 27.4103M20.6929 28.0592L19.6205 41.1585L20.6929 54.9334C20.7256 55.4184 21.0942 55.7888 21.5588 55.7888C22.0235 55.7888 22.3898 55.4204 22.4246 54.9354L23.6423 41.1606L22.4246 28.0531C22.3877 27.5721 22.0194 27.2057 21.5588 27.2057C21.0983 27.2057 20.7236 27.57 20.6929 28.0592ZM5.69409 29.5738C5.69409 29.5758 4.4251 41.1585 4.4251 41.1585L5.69409 52.4894C5.73093 52.7924 5.9603 53.0094 6.23252 53.0094C6.50474 53.0094 6.72376 52.7965 6.7647 52.4916L8.20559 41.1585L6.7647 29.5738C6.71762 29.2668 6.49869 29.0539 6.22852 29.0539C5.95835 29.0539 5.72693 29.2729 5.69009 29.5738M0.941686 33.9948L0 41.1585L0.941686 48.1994C0.978528 48.4962 1.19125 48.705 1.45938 48.705C1.7275 48.705 1.93013 48.4962 1.97107 48.2015L3.08865 41.1565L1.97107 33.9928C1.93013 33.698 1.71727 33.4913 1.45938 33.4913C1.20148 33.4913 0.976481 33.7 0.941686 33.9948Z",
49424
49564
  fill: "var(--text-color)"
49425
49565
  })
49426
49566
  })
49427
49567
  }
49428
49568
  ];
49429
- return /* @__PURE__ */ jsxs48(Fragment16, {
49569
+ return /* @__PURE__ */ jsxs49(Fragment20, {
49430
49570
  children: [
49431
- /* @__PURE__ */ jsx127("h3", {
49571
+ /* @__PURE__ */ jsx128("h3", {
49432
49572
  className: "text-center mt-20 mb-10",
49433
49573
  children: "Trusted by"
49434
49574
  }),
49435
- /* @__PURE__ */ jsx127("div", {
49575
+ /* @__PURE__ */ jsx128("div", {
49436
49576
  className: "text-center flex flex-col lg:flex-row flex-nowrap justify-center items-center gap-10 mb-20",
49437
- children: logos.map((logo) => /* @__PURE__ */ jsx127("a", {
49577
+ children: logos.map((logo) => /* @__PURE__ */ jsx128("a", {
49438
49578
  href: logo.url,
49439
49579
  target: "_blank",
49440
49580
  className: "opacity-80 hover:opacity-100 transition-opacity",
@@ -49447,20 +49587,20 @@ var TrustedByBanner = () => {
49447
49587
  var TrustedByBanner_default = TrustedByBanner;
49448
49588
 
49449
49589
  // src/components/homepage/VideoAppsShowcase.tsx
49450
- import { useRef as useRef66, useState as useState66 } from "react";
49590
+ import { useRef as useRef66, useState as useState60 } from "react";
49451
49591
 
49452
49592
  // src/components/homepage/MuxVideo.tsx
49453
49593
  import Hls2 from "hls.js";
49454
- import { forwardRef as forwardRef41, useEffect as useEffect65, useImperativeHandle as useImperativeHandle15, useRef as useRef65 } from "react";
49594
+ import { forwardRef as forwardRef41, useEffect as useEffect61, useImperativeHandle as useImperativeHandle15, useRef as useRef65 } from "react";
49455
49595
 
49456
49596
  // src/components/homepage/VideoPlayerWithControls.tsx
49457
49597
  import Hls from "hls.js";
49458
49598
  import"plyr/dist/plyr.css";
49459
- import { forwardRef as forwardRef40, useCallback as useCallback57, useEffect as useEffect63, useRef as useRef63, useState as useState64 } from "react";
49460
- import { jsx as jsx128 } from "react/jsx-runtime";
49599
+ import { forwardRef as forwardRef40, useCallback as useCallback57, useEffect as useEffect60, useRef as useRef63, useState as useState59 } from "react";
49600
+ import { jsx as jsx129 } from "react/jsx-runtime";
49461
49601
  var useCombinedRefs = function(...refs) {
49462
49602
  const targetRef = useRef63(null);
49463
- useEffect63(() => {
49603
+ useEffect60(() => {
49464
49604
  refs.forEach((ref) => {
49465
49605
  if (!ref)
49466
49606
  return;
@@ -49477,7 +49617,7 @@ var VideoPlayerWithControls = forwardRef40(({ playbackId, poster, currentTime, o
49477
49617
  const videoRef = useRef63(null);
49478
49618
  const metaRef = useCombinedRefs(ref, videoRef);
49479
49619
  const playerRef = useRef63(null);
49480
- const [playerInitTime] = useState64(Date.now());
49620
+ const [playerInitTime] = useState59(Date.now());
49481
49621
  const videoError = useCallback57((event) => onError(event), [onError]);
49482
49622
  const onImageLoad = useCallback57((event) => {
49483
49623
  const [w, h] = [event.target.width, event.target.height];
@@ -49489,12 +49629,12 @@ var VideoPlayerWithControls = forwardRef40(({ playbackId, poster, currentTime, o
49489
49629
  console.error("Error getting img dimensions", event);
49490
49630
  }
49491
49631
  }, [onLoaded, onSize]);
49492
- useEffect63(() => {
49632
+ useEffect60(() => {
49493
49633
  const img = new Image;
49494
49634
  img.onload = (evt) => onImageLoad(evt);
49495
49635
  img.src = poster;
49496
49636
  }, [onImageLoad, poster]);
49497
- useEffect63(() => {
49637
+ useEffect60(() => {
49498
49638
  const video = videoRef.current;
49499
49639
  const src = `https://stream.mux.com/${playbackId}.m3u8`;
49500
49640
  let hls;
@@ -49537,15 +49677,15 @@ var VideoPlayerWithControls = forwardRef40(({ playbackId, poster, currentTime, o
49537
49677
  }
49538
49678
  };
49539
49679
  }, [playbackId, playerInitTime, videoError, videoRef]);
49540
- useEffect63(() => {
49680
+ useEffect60(() => {
49541
49681
  const video = videoRef.current;
49542
49682
  if (currentTime && video) {
49543
49683
  video.currentTime = currentTime;
49544
49684
  }
49545
49685
  }, [currentTime]);
49546
- return /* @__PURE__ */ jsx128("div", {
49686
+ return /* @__PURE__ */ jsx129("div", {
49547
49687
  className: "video-container",
49548
- children: /* @__PURE__ */ jsx128("video", {
49688
+ children: /* @__PURE__ */ jsx129("video", {
49549
49689
  ref: metaRef,
49550
49690
  autoPlay,
49551
49691
  poster,
@@ -49556,7 +49696,7 @@ var VideoPlayerWithControls = forwardRef40(({ playbackId, poster, currentTime, o
49556
49696
  });
49557
49697
 
49558
49698
  // src/components/homepage/MuxVideo.tsx
49559
- import { jsx as jsx129 } from "react/jsx-runtime";
49699
+ import { jsx as jsx130 } from "react/jsx-runtime";
49560
49700
  var getVideoToPlayUrl = (muxId) => {
49561
49701
  return `https://stream.mux.com/${muxId}.m3u8`;
49562
49702
  };
@@ -49564,7 +49704,7 @@ var MuxVideoForward = ({ muxId, ...props }, ref) => {
49564
49704
  const videoRef = useRef65(null);
49565
49705
  const vidUrl = getVideoToPlayUrl(muxId);
49566
49706
  useImperativeHandle15(ref, () => videoRef.current, []);
49567
- useEffect65(() => {
49707
+ useEffect61(() => {
49568
49708
  let hls;
49569
49709
  if (videoRef.current) {
49570
49710
  const { current } = videoRef;
@@ -49584,7 +49724,7 @@ var MuxVideoForward = ({ muxId, ...props }, ref) => {
49584
49724
  }
49585
49725
  };
49586
49726
  }, [vidUrl, videoRef]);
49587
- return /* @__PURE__ */ jsx129("video", {
49727
+ return /* @__PURE__ */ jsx130("video", {
49588
49728
  ref: videoRef,
49589
49729
  ...props
49590
49730
  });
@@ -49592,7 +49732,7 @@ var MuxVideoForward = ({ muxId, ...props }, ref) => {
49592
49732
  var MuxVideo = forwardRef41(MuxVideoForward);
49593
49733
 
49594
49734
  // src/components/homepage/VideoAppsShowcase.tsx
49595
- import { jsx as jsx130, jsxs as jsxs49 } from "react/jsx-runtime";
49735
+ import { jsx as jsx131, jsxs as jsxs50 } from "react/jsx-runtime";
49596
49736
  var tabs = [
49597
49737
  "Music visualization",
49598
49738
  "Captions",
@@ -49639,24 +49779,24 @@ var videoApps = [
49639
49779
  buttonText: "GitHub Unwrapped website"
49640
49780
  }
49641
49781
  ];
49642
- var icon6 = {
49782
+ var icon4 = {
49643
49783
  height: 16,
49644
49784
  marginLeft: 10
49645
49785
  };
49646
- var Arrow4 = () => /* @__PURE__ */ jsx130("svg", {
49647
- style: icon6,
49786
+ var Arrow4 = () => /* @__PURE__ */ jsx131("svg", {
49787
+ style: icon4,
49648
49788
  xmlns: "http://www.w3.org/2000/svg",
49649
49789
  viewBox: "0 0 448 512",
49650
- children: /* @__PURE__ */ jsx130("path", {
49790
+ children: /* @__PURE__ */ jsx131("path", {
49651
49791
  fill: "currentColor",
49652
49792
  d: "M438.6 278.6l-160 160C272.4 444.9 264.2 448 256 448s-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L338.8 288H32C14.33 288 .0016 273.7 .0016 256S14.33 224 32 224h306.8l-105.4-105.4c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l160 160C451.1 245.9 451.1 266.1 438.6 278.6z"
49653
49793
  })
49654
49794
  });
49655
49795
  var BuiltWithRemotionShowcase = () => {
49656
- const [activeTab, setActiveTab] = useState66(0);
49657
- const [isMuted, setIsMuted] = useState66(true);
49658
- const [isPlaying, setIsPlaying] = useState66(false);
49659
- const [videoLoaded, setVideoLoaded] = useState66(false);
49796
+ const [activeTab, setActiveTab] = useState60(0);
49797
+ const [isMuted, setIsMuted] = useState60(true);
49798
+ const [isPlaying, setIsPlaying] = useState60(false);
49799
+ const [videoLoaded, setVideoLoaded] = useState60(false);
49660
49800
  const videoRef = useRef66(null);
49661
49801
  const containerRef = useRef66(null);
49662
49802
  const handleTabChange = (index2) => {
@@ -49699,15 +49839,15 @@ var BuiltWithRemotionShowcase = () => {
49699
49839
  setIsMuted(newMutedState);
49700
49840
  }
49701
49841
  };
49702
- return /* @__PURE__ */ jsxs49("div", {
49842
+ return /* @__PURE__ */ jsxs50("div", {
49703
49843
  ref: containerRef,
49704
49844
  children: [
49705
- /* @__PURE__ */ jsx130(SectionTitle, {
49845
+ /* @__PURE__ */ jsx131(SectionTitle, {
49706
49846
  children: "Built with Remotion"
49707
49847
  }),
49708
- /* @__PURE__ */ jsx130("div", {
49848
+ /* @__PURE__ */ jsx131("div", {
49709
49849
  className: "flex flex-wrap justify-center gap-x-8 gap-y-3 mb-6 mt-1",
49710
- children: tabs.map((tab, index2) => /* @__PURE__ */ jsx130("button", {
49850
+ children: tabs.map((tab, index2) => /* @__PURE__ */ jsx131("button", {
49711
49851
  type: "button",
49712
49852
  "data-active": index2 === activeTab,
49713
49853
  className: `bg-transparent border-none m-0 p-0 cursor-pointer text-sm fontbrand font-bold transition-colors text-muted data-[active=true]:text-brand`,
@@ -49715,17 +49855,17 @@ var BuiltWithRemotionShowcase = () => {
49715
49855
  children: tab
49716
49856
  }, tab))
49717
49857
  }),
49718
- /* @__PURE__ */ jsx130("div", {
49858
+ /* @__PURE__ */ jsx131("div", {
49719
49859
  className: "card flex p-0 overflow-hidden",
49720
49860
  "data-nosnippet": true,
49721
- children: /* @__PURE__ */ jsxs49("div", {
49861
+ children: /* @__PURE__ */ jsxs50("div", {
49722
49862
  className: "flex-1 grid grid-cols-1 lg:grid-cols-2",
49723
49863
  children: [
49724
- /* @__PURE__ */ jsxs49("div", {
49864
+ /* @__PURE__ */ jsxs50("div", {
49725
49865
  className: "w-full aspect-video lg:aspect-square relative overflow-hidden bg-[#eee] cursor-pointer",
49726
49866
  onClick: handlePlayPause,
49727
49867
  children: [
49728
- videoLoaded ? /* @__PURE__ */ jsx130(MuxVideo, {
49868
+ videoLoaded ? /* @__PURE__ */ jsx131(MuxVideo, {
49729
49869
  ref: videoRef,
49730
49870
  muxId: videoApps[activeTab].muxId,
49731
49871
  className: "absolute left-0 top-0 w-full h-full object-contain rounded-sm rounded-tr-none rounded-br-none",
@@ -49734,26 +49874,26 @@ var BuiltWithRemotionShowcase = () => {
49734
49874
  muted: isMuted,
49735
49875
  autoPlay: true,
49736
49876
  onPlay: () => setIsPlaying(true)
49737
- }) : /* @__PURE__ */ jsx130("img", {
49877
+ }) : /* @__PURE__ */ jsx131("img", {
49738
49878
  src: `https://image.mux.com/${videoApps[activeTab].muxId}/thumbnail.png?time=1`,
49739
49879
  className: "absolute left-0 top-0 w-full h-full object-contain rounded-sm rounded-tr-none rounded-br-none",
49740
49880
  alt: videoApps[activeTab].title
49741
49881
  }),
49742
- /* @__PURE__ */ jsx130("button", {
49882
+ /* @__PURE__ */ jsx131("button", {
49743
49883
  type: "button",
49744
49884
  className: "absolute bottom-2.5 left-2.5 bg-white text-black rounded-full w-8 h-8 flex justify-center items-center text-base cursor-pointer transition-colors border-2 border-black border-solid",
49745
49885
  onClick: (e) => {
49746
49886
  e.stopPropagation();
49747
49887
  handlePlayPause();
49748
49888
  },
49749
- children: isPlaying ? /* @__PURE__ */ jsx130(PlayingIcon, {
49889
+ children: isPlaying ? /* @__PURE__ */ jsx131(PlayingIcon, {
49750
49890
  style: {
49751
49891
  width: 12,
49752
49892
  height: 20,
49753
49893
  marginLeft: "2px",
49754
49894
  marginTop: "1px"
49755
49895
  }
49756
- }) : /* @__PURE__ */ jsx130(PausedIcon, {
49896
+ }) : /* @__PURE__ */ jsx131(PausedIcon, {
49757
49897
  style: {
49758
49898
  width: 14,
49759
49899
  height: 16,
@@ -49762,20 +49902,20 @@ var BuiltWithRemotionShowcase = () => {
49762
49902
  }
49763
49903
  })
49764
49904
  }),
49765
- /* @__PURE__ */ jsx130("button", {
49905
+ /* @__PURE__ */ jsx131("button", {
49766
49906
  type: "button",
49767
49907
  className: "absolute bottom-2.5 right-2.5 bg-white text-black rounded-full w-8 h-8 flex justify-center items-center text-base cursor-pointer transition-colors border-2 border-black border-solid",
49768
49908
  onClick: (e) => {
49769
49909
  e.stopPropagation();
49770
49910
  handleMuteToggle();
49771
49911
  },
49772
- children: isMuted ? /* @__PURE__ */ jsx130(IsMutedIcon, {
49912
+ children: isMuted ? /* @__PURE__ */ jsx131(IsMutedIcon, {
49773
49913
  style: {
49774
49914
  width: 16,
49775
49915
  height: 16,
49776
49916
  marginTop: "1px"
49777
49917
  }
49778
- }) : /* @__PURE__ */ jsx130(NotMutedIcon, {
49918
+ }) : /* @__PURE__ */ jsx131(NotMutedIcon, {
49779
49919
  style: {
49780
49920
  width: 16,
49781
49921
  height: 16,
@@ -49785,30 +49925,30 @@ var BuiltWithRemotionShowcase = () => {
49785
49925
  })
49786
49926
  ]
49787
49927
  }),
49788
- /* @__PURE__ */ jsxs49("div", {
49928
+ /* @__PURE__ */ jsxs50("div", {
49789
49929
  className: "p-6 lg:p-10 flex min-w-0 flex-col justify-center",
49790
49930
  children: [
49791
- /* @__PURE__ */ jsx130("div", {
49931
+ /* @__PURE__ */ jsx131("div", {
49792
49932
  className: "text-3xl font-bold fontbrand mt-0",
49793
49933
  children: videoApps[activeTab].title
49794
49934
  }),
49795
- /* @__PURE__ */ jsx130("div", {
49935
+ /* @__PURE__ */ jsx131("div", {
49796
49936
  className: "text-muted mt-3 text-base fontbrand leading-relaxed",
49797
49937
  children: videoApps[activeTab].description
49798
49938
  }),
49799
- videoApps[activeTab].additionalInfo ? /* @__PURE__ */ jsx130("div", {
49939
+ videoApps[activeTab].additionalInfo ? /* @__PURE__ */ jsx131("div", {
49800
49940
  className: "text-muted mt-4 text-base fontbrand",
49801
49941
  children: videoApps[activeTab].additionalInfo
49802
49942
  }) : null,
49803
- /* @__PURE__ */ jsx130("div", {
49943
+ /* @__PURE__ */ jsx131("div", {
49804
49944
  className: "h-5"
49805
49945
  }),
49806
- /* @__PURE__ */ jsxs49("a", {
49946
+ /* @__PURE__ */ jsxs50("a", {
49807
49947
  className: "no-underline text-brand font-brand font-bold inline-flex flex-row items-center",
49808
49948
  href: videoApps[activeTab].link,
49809
49949
  children: [
49810
49950
  videoApps[activeTab].buttonText,
49811
- /* @__PURE__ */ jsx130(Arrow4, {})
49951
+ /* @__PURE__ */ jsx131(Arrow4, {})
49812
49952
  ]
49813
49953
  })
49814
49954
  ]
@@ -49816,20 +49956,20 @@ var BuiltWithRemotionShowcase = () => {
49816
49956
  ]
49817
49957
  })
49818
49958
  }),
49819
- /* @__PURE__ */ jsx130("div", {
49959
+ /* @__PURE__ */ jsx131("div", {
49820
49960
  style: {
49821
49961
  marginTop: "1rem",
49822
49962
  justifyContent: "center",
49823
49963
  display: "flex"
49824
49964
  },
49825
- children: /* @__PURE__ */ jsxs49("div", {
49965
+ children: /* @__PURE__ */ jsxs50("div", {
49826
49966
  style: {
49827
49967
  fontFamily: "GTPlanar"
49828
49968
  },
49829
49969
  children: [
49830
49970
  "For more examples of products and workflows, see our",
49831
49971
  " ",
49832
- /* @__PURE__ */ jsx130("a", {
49972
+ /* @__PURE__ */ jsx131("a", {
49833
49973
  href: "/showcase",
49834
49974
  className: "bluelink",
49835
49975
  children: "Showcase page"
@@ -49842,1358 +49982,32 @@ var BuiltWithRemotionShowcase = () => {
49842
49982
  });
49843
49983
  };
49844
49984
 
49845
- // ../create-video/dist/esm/index.mjs
49846
- var listOfRemotionPackages = [
49847
- "@remotion/svg-3d-engine",
49848
- "@remotion/animation-utils",
49849
- "@remotion/animated-emoji",
49850
- "@remotion/astro-example",
49851
- "@remotion/babel-loader",
49852
- "@remotion/bugs",
49853
- "@remotion/brand",
49854
- "@remotion/bundler",
49855
- "@remotion/browser-studio",
49856
- "@remotion/canvas-capture",
49857
- "@remotion/cli",
49858
- "@remotion/cloudrun",
49859
- "@remotion/codex-plugin",
49860
- "@remotion/compositor-darwin-arm64",
49861
- "@remotion/compositor-darwin-x64",
49862
- "@remotion/compositor-linux-arm64-gnu",
49863
- "@remotion/compositor-linux-arm64-musl",
49864
- "@remotion/compositor-linux-x64-gnu",
49865
- "@remotion/compositor-linux-x64-musl",
49866
- "@remotion/compositor-win32-x64-msvc",
49867
- "remotion",
49868
- "@remotion/create-video",
49869
- "@remotion/discord-poster",
49870
- "@remotion/docusaurus-plugin",
49871
- "@remotion/docs",
49872
- "@remotion/enable-scss",
49873
- "@remotion/eslint-config",
49874
- "@remotion/eslint-config-flat",
49875
- "@remotion/eslint-config-internal",
49876
- "@remotion/eslint-plugin",
49877
- "@remotion/example-without-zod",
49878
- "@remotion/example",
49879
- "@remotion/fonts",
49880
- "@remotion/gif",
49881
- "@remotion/google-fonts",
49882
- "@remotion/install-whisper-cpp",
49883
- "@remotion/it-tests",
49884
- "@remotion/react18-tests",
49885
- "@remotion/lambda-go-example",
49886
- "@remotion/lambda-go",
49887
- "@remotion/lambda-php",
49888
- "@remotion/lambda-ruby",
49889
- "@remotion/lambda-python",
49890
- "@remotion/lambda",
49891
- "@remotion/lambda-client",
49892
- "@remotion/layout-utils",
49893
- "@remotion/rounded-text-box",
49894
- "@remotion/licensing",
49895
- "@remotion/lottie",
49896
- "@remotion/mcp",
49897
- "@remotion/media-utils",
49898
- "@remotion/motion-blur",
49899
- "@remotion/noise",
49900
- "@remotion/paths",
49901
- "@remotion/player-a11y",
49902
- "@remotion/player-example",
49903
- "@remotion/player",
49904
- "@remotion/preload",
49905
- "@remotion/renderer",
49906
- "@remotion/rive",
49907
- "@remotion/shapes",
49908
- "@remotion/skia",
49909
- "@remotion/promo-pages",
49910
- "@remotion/streaming",
49911
- "@remotion/serverless",
49912
- "@remotion/serverless-client",
49913
- "@remotion/skills",
49914
- "@remotion/skills-evals",
49915
- "@remotion/studio-server",
49916
- "@remotion/studio-shared",
49917
- "@remotion/studio",
49918
- "@remotion/tailwind",
49919
- "@remotion/tailwind-v4",
49920
- "@remotion/timeline-utils",
49921
- "@remotion/test-utils",
49922
- "@remotion/three",
49923
- "@remotion/transitions",
49924
- "@remotion/media-parser",
49925
- "@remotion/zod-types",
49926
- "@remotion/zod-types-v3",
49927
- "@remotion/webcodecs",
49928
- "@remotion/convert",
49929
- "@remotion/captions",
49930
- "@remotion/openai-whisper",
49931
- "@remotion/elevenlabs",
49932
- "@remotion/compositor",
49933
- "@remotion/example-videos",
49934
- "@remotion/whisper-web",
49935
- "@remotion/media",
49936
- "@remotion/remotion-media",
49937
- "@remotion/web-renderer",
49938
- "@remotion/design",
49939
- "@remotion/light-leaks",
49940
- "@remotion/starburst",
49941
- "@remotion/vercel",
49942
- "@remotion/sfx",
49943
- "@remotion/effects"
49944
- ];
49945
- function truthy4(value) {
49946
- return Boolean(value);
49947
- }
49948
- var FEATURED_TEMPLATES = [
49949
- {
49950
- homePageLabel: "Blank",
49951
- shortName: "Blank",
49952
- description: "Nothing except an empty canvas",
49953
- org: "remotion-dev",
49954
- repoName: "template-empty",
49955
- longerDescription: "A template containing nothing but an empty canvas. Recommended if you already used Remotion or plan to write your code with AI.",
49956
- promoVideo: {
49957
- muxId: "JD00x15y859GjqO7C9hpILkrSddGzd55K4lfj02dv8gU4",
49958
- width: 1280,
49959
- height: 720
49960
- },
49961
- cliId: "blank",
49962
- type: "video",
49963
- defaultBranch: "main",
49964
- featuredOnHomePage: "Blank",
49965
- previewURL: "https://template-empty.vercel.app/?/MyComp",
49966
- previewLabel: null,
49967
- templateInMonorepo: "template-blank",
49968
- allowEnableTailwind: true,
49969
- contributedBy: null,
49970
- showStackblitz: true
49971
- },
49972
- {
49973
- homePageLabel: "Hello World",
49974
- shortName: "Hello World",
49975
- org: "remotion-dev",
49976
- repoName: "template-helloworld",
49977
- description: "A playground with a simple animation",
49978
- longerDescription: "A basic template with TypeScript, Prettier and ESLint preconfigured.",
49979
- promoVideo: {
49980
- muxId: "vKvV6aa7GXGlR01cmpc6J8Zz4Gkj9d2hBSnVYoef00900I",
49981
- height: 1080,
49982
- width: 1920
49983
- },
49984
- cliId: "hello-world",
49985
- type: "video",
49986
- defaultBranch: "main",
49987
- featuredOnHomePage: "Hello World",
49988
- previewURL: "https://remotion-helloworld.vercel.app/?/HelloWorld",
49989
- previewLabel: null,
49990
- templateInMonorepo: "template-helloworld",
49991
- allowEnableTailwind: true,
49992
- contributedBy: null,
49993
- showStackblitz: true
49994
- },
49995
- {
49996
- homePageLabel: "Next.js",
49997
- shortName: "Next.js",
49998
- org: "remotion-dev",
49999
- repoName: "template-next-app-dir-tailwind",
50000
- description: "SaaS template for video generation apps",
50001
- longerDescription: "A SaaS starter kit which has the Remotion Player and rendering via Remotion Lambda built-in. Our recommended choice for people who want to build an app that can generate videos.",
50002
- promoVideo: {
50003
- width: 1280,
50004
- height: 720,
50005
- muxId: "RufnZIJZh6L1MAaeG02jnXuM9pK96tNuHRxmXHbWqCBI"
50006
- },
50007
- cliId: "next",
50008
- type: "video",
50009
- defaultBranch: "main",
50010
- featuredOnHomePage: "Next.js",
50011
- previewURL: "https://next.remotion.dev",
50012
- templateInMonorepo: "template-next-app-tailwind",
50013
- previewLabel: "Live Demo",
50014
- allowEnableTailwind: false,
50015
- contributedBy: null,
50016
- showStackblitz: true
50017
- },
50018
- {
50019
- homePageLabel: "Next.js (Vercel Sandbox)",
50020
- shortName: "Next.js (Vercel Sandbox)",
50021
- org: "remotion-dev",
50022
- repoName: "template-vercel",
50023
- description: "Render videos on-demand using Vercel Sandbox",
50024
- longerDescription: "A template for rendering videos on-demand using Vercel Sandbox. Spawns ephemeral Linux VMs to render videos and stores them in Vercel Blob storage.",
50025
- cliId: "vercel",
50026
- promoVideo: {
50027
- width: 1280,
50028
- height: 720,
50029
- muxId: "RufnZIJZh6L1MAaeG02jnXuM9pK96tNuHRxmXHbWqCBI"
50030
- },
50031
- type: "video",
50032
- defaultBranch: "main",
50033
- featuredOnHomePage: null,
50034
- previewURL: "https://template-vercel.remotion.dev",
50035
- templateInMonorepo: "template-vercel",
50036
- allowEnableTailwind: false,
50037
- contributedBy: null,
50038
- showStackblitz: false,
50039
- previewLabel: "Live Demo"
50040
- },
50041
- {
50042
- homePageLabel: "Next.js (No Tailwind)",
50043
- shortName: "Next.js (No Tailwind)",
50044
- org: "remotion-dev",
50045
- repoName: "template-next-app-dir",
50046
- description: "SaaS template for video generation apps",
50047
- longerDescription: "A SaaS starter kit which has the Remotion Player and rendering via Remotion Lambda built-in. Our recommended choice for people who want to build an app that can generate videos.",
50048
- promoVideo: {
50049
- width: 1280,
50050
- height: 720,
50051
- muxId: "RufnZIJZh6L1MAaeG02jnXuM9pK96tNuHRxmXHbWqCBI"
50052
- },
50053
- cliId: "next-no-tailwind",
50054
- type: "video",
50055
- defaultBranch: "main",
50056
- featuredOnHomePage: null,
50057
- previewURL: "https://next.remotion.dev",
50058
- templateInMonorepo: "template-next-app",
50059
- previewLabel: "Live Demo",
50060
- allowEnableTailwind: false,
50061
- contributedBy: null,
50062
- showStackblitz: true
50063
- },
50064
- {
50065
- homePageLabel: "Next.js (Pages dir)",
50066
- shortName: "Next.js (Pages dir)",
50067
- org: "remotion-dev",
50068
- repoName: "template-next-pages-dir",
50069
- description: "SaaS template for video generation apps",
50070
- longerDescription: "A SaaS starter kit which has the Remotion Player and rendering via Remotion Lambda built-in. Our recommended choice for people who want to build an app that can generate videos.",
50071
- promoVideo: {
50072
- width: 1280,
50073
- height: 720,
50074
- muxId: "RufnZIJZh6L1MAaeG02jnXuM9pK96tNuHRxmXHbWqCBI"
50075
- },
50076
- cliId: "next-pages-dir",
50077
- type: "video",
50078
- defaultBranch: "main",
50079
- featuredOnHomePage: null,
50080
- previewURL: "https://next.remotion.dev",
50081
- previewLabel: "Live Demo",
50082
- templateInMonorepo: "template-next-pages",
50083
- allowEnableTailwind: false,
50084
- contributedBy: null,
50085
- showStackblitz: true
50086
- },
50087
- {
50088
- homePageLabel: "Recorder",
50089
- shortName: "Recorder",
50090
- org: "remotion-dev",
50091
- repoName: "recorder",
50092
- description: "A video production tool built entirely in JavaScript",
50093
- longerDescription: 'The Remotion Recorder is a video production tool that allows you to record webcam and screen content, generate captions, add music, end-to-end in JavaScript. <a href="https://remotion.dev/recorder">See docs</a>',
50094
- promoVideo: {
50095
- muxId: "2A4z88QNjBTbxziIKqbI7IKLUO9iuaMp6UTZUBOItx00",
50096
- height: 1080,
50097
- width: 1080
50098
- },
50099
- cliId: "recorder",
50100
- type: "video",
50101
- defaultBranch: "main",
50102
- featuredOnHomePage: null,
50103
- previewURL: null,
50104
- previewLabel: null,
50105
- templateInMonorepo: "template-recorder",
50106
- allowEnableTailwind: false,
50107
- contributedBy: null,
50108
- showStackblitz: true
50109
- },
50110
- {
50111
- homePageLabel: "Prompt to Motion Graphics SaaS Starter Kit",
50112
- shortName: "Prompt to Motion Graphics SaaS Starter Kit",
50113
- org: "remotion-dev",
50114
- repoName: "template-prompt-to-motion-graphics-saas",
50115
- description: "SaaS template for AI-powered animation generation",
50116
- longerDescription: 'A SaaS template for "Prompt to Motion Graphics" products. Generates Remotion code, streams it to the frontend, and compiles and previews it in the browser. See the <a href="/docs/ai/ai-saas-template">documentation page</a> for more details.',
50117
- promoBanner: {
50118
- width: 2880,
50119
- height: 1512,
50120
- src: "/img/prompt-to-motion-graphics.png"
50121
- },
50122
- cliId: "prompt-to-motion-graphics",
50123
- type: "image",
50124
- defaultBranch: "main",
50125
- featuredOnHomePage: null,
50126
- previewURL: null,
50127
- previewLabel: "Live Demo",
50128
- templateInMonorepo: "template-prompt-to-motion-graphics",
50129
- allowEnableTailwind: false,
50130
- contributedBy: "ASchwad",
50131
- showStackblitz: false
50132
- },
50133
- {
50134
- homePageLabel: "JavaScript",
50135
- shortName: "Hello World (JavaScript)",
50136
- org: "remotion-dev",
50137
- repoName: "template-helloworld-javascript",
50138
- description: "The default starter template in plain JS",
50139
- longerDescription: "The Hello World template, but in plain JavaScript. Recommended for people who detest TypeScript.",
50140
- promoVideo: {
50141
- muxId: "dRIuc00f8QWnKedM8GBGPqXJWqU01DPJFgPTHpJgixxas",
50142
- width: 1920,
50143
- height: 1080
50144
- },
50145
- cliId: "javascript",
50146
- type: "video",
50147
- defaultBranch: "main",
50148
- featuredOnHomePage: null,
50149
- previewURL: "https://template-helloworld-javascript.vercel.app/?/HelloWorld",
50150
- previewLabel: null,
50151
- templateInMonorepo: "template-javascript",
50152
- allowEnableTailwind: true,
50153
- contributedBy: null,
50154
- showStackblitz: true
50155
- },
50156
- {
50157
- homePageLabel: "Render Server (Express.js)",
50158
- shortName: "Render Server",
50159
- org: "remotion-dev",
50160
- repoName: "template-render-server",
50161
- description: "An Express.js server for rendering videos with Remotion",
50162
- longerDescription: "A template that provides an Express.js server starting, tracking, and canceling Remotion renders.",
50163
- promoVideo: {
50164
- muxId: "JhsWde00fJ6L00SUrIwOZv2XOl7j00DgT5kED01FVVOUJTU",
50165
- width: 1920,
50166
- height: 1080
50167
- },
50168
- cliId: "render-server",
50169
- type: "video",
50170
- defaultBranch: "main",
50171
- featuredOnHomePage: null,
50172
- previewURL: null,
50173
- previewLabel: null,
50174
- templateInMonorepo: "template-render-server",
50175
- allowEnableTailwind: false,
50176
- contributedBy: null,
50177
- showStackblitz: true
50178
- },
50179
- {
50180
- homePageLabel: "Electron",
50181
- shortName: "Electron",
50182
- org: "remotion-dev",
50183
- repoName: "template-electron",
50184
- description: "Render Remotion videos from a desktop app",
50185
- longerDescription: "An Electron Forge + Vite starter template that renders Remotion videos from the Electron main process.",
50186
- promoVideo: {
50187
- muxId: "EvaWtUbbZ5zuYQ5EZFcZ501fg4JPtdVXXt9K02Rf62xcM",
50188
- width: 1920,
50189
- height: 1080
50190
- },
50191
- cliId: "electron",
50192
- type: "video",
50193
- defaultBranch: "main",
50194
- featuredOnHomePage: null,
50195
- previewURL: null,
50196
- previewLabel: null,
50197
- templateInMonorepo: "template-electron",
50198
- allowEnableTailwind: false,
50199
- contributedBy: null,
50200
- showStackblitz: false
50201
- },
50202
- {
50203
- homePageLabel: "React Router 7",
50204
- shortName: "React Router",
50205
- org: "remotion-dev",
50206
- repoName: "template-react-router",
50207
- description: "SaaS template for video generation apps",
50208
- longerDescription: "A software-as-a-service starter kit which has the Remotion Player and rendering via Remotion Lambda built-in. Built with React Router 7.",
50209
- promoBanner: {
50210
- width: 918,
50211
- height: 720,
50212
- src: "/img/remix-template.png"
50213
- },
50214
- cliId: "react-router",
50215
- type: "image",
50216
- defaultBranch: "main",
50217
- featuredOnHomePage: "React Router",
50218
- previewURL: null,
50219
- previewLabel: null,
50220
- templateInMonorepo: "template-react-router",
50221
- allowEnableTailwind: false,
50222
- contributedBy: null,
50223
- showStackblitz: true
50224
- },
50225
- {
50226
- homePageLabel: "3D",
50227
- shortName: "React Three Fiber",
50228
- org: "remotion-dev",
50229
- repoName: "template-three",
50230
- description: "Remotion + React Three Fiber Starter Template",
50231
- longerDescription: "A template with a React Three Fiber scene to play around.",
50232
- promoVideo: {
50233
- muxId: "mN40242xogVDx023lCChyg8JJBLT02Mqu01Pp00rbbk00SL8M",
50234
- width: 1280,
50235
- height: 720
50236
- },
50237
- cliId: "three",
50238
- type: "video",
50239
- defaultBranch: "main",
50240
- featuredOnHomePage: null,
50241
- previewURL: "https://template-three-remotion.vercel.app/",
50242
- previewLabel: null,
50243
- templateInMonorepo: "template-three",
50244
- allowEnableTailwind: false,
50245
- contributedBy: null,
50246
- showStackblitz: true
50247
- },
50248
- {
50249
- homePageLabel: "Stills",
50250
- shortName: "Still images",
50251
- org: "remotion-dev",
50252
- repoName: "template-still",
50253
- description: "Dynamic PNG/JPEG template with built-in server",
50254
- longerDescription: "A template for creating still images. Includes a built-in HTTP server that can be deployed to Heroku.",
50255
- promoVideo: {
50256
- muxId: "admEY3QofSXUf01YbLKR8KqoZXhhprTvEZCM9onSo0001o",
50257
- height: 628,
50258
- width: 1200
50259
- },
50260
- cliId: "still",
50261
- type: "video",
50262
- defaultBranch: "main",
50263
- featuredOnHomePage: null,
50264
- previewURL: "https://template-still.vercel.app/?/PreviewCard",
50265
- previewLabel: null,
50266
- templateInMonorepo: "template-still",
50267
- allowEnableTailwind: false,
50268
- contributedBy: null,
50269
- showStackblitz: true
50270
- },
50271
- {
50272
- homePageLabel: "Audiogram",
50273
- shortName: "Audiogram",
50274
- org: "remotion-dev",
50275
- repoName: "template-audiogram",
50276
- description: "Text and waveform visualization for podcasts",
50277
- longerDescription: "A template that turns podcast snippets into videos that can be posted on Social Media.",
50278
- promoVideo: {
50279
- muxId: "7RwHiqZX5k5radAqZpGq7x02jJhi5j4OD8BMiM1z7nmE",
50280
- height: 1080,
50281
- width: 1080
50282
- },
50283
- cliId: "audiogram",
50284
- type: "video",
50285
- defaultBranch: "main",
50286
- featuredOnHomePage: null,
50287
- previewURL: "https://template-audiogram-1nrh.vercel.app",
50288
- previewLabel: null,
50289
- templateInMonorepo: "template-audiogram",
50290
- allowEnableTailwind: true,
50291
- contributedBy: null,
50292
- showStackblitz: true
50293
- },
50294
- {
50295
- homePageLabel: "Music Visualization",
50296
- shortName: "Music Visualization",
50297
- org: "remotion-dev",
50298
- repoName: "template-music-visualization",
50299
- description: "Text and waveform visualization for podcasts",
50300
- longerDescription: "A template that turns music snippets into videos that can be posted on Social Media.",
50301
- promoVideo: {
50302
- muxId: "8msABU02zPeFOGdvUWChssvsLVJZgFNWGWaVKA9hNAlw",
50303
- height: 1080,
50304
- width: 1080
50305
- },
50306
- cliId: "music-visualization",
50307
- type: "video",
50308
- defaultBranch: "main",
50309
- featuredOnHomePage: null,
50310
- previewURL: null,
50311
- previewLabel: null,
50312
- templateInMonorepo: "template-music-visualization",
50313
- allowEnableTailwind: true,
50314
- contributedBy: null,
50315
- showStackblitz: true
50316
- },
50317
- {
50318
- homePageLabel: "Prompt to Video",
50319
- shortName: "Prompt to Video",
50320
- org: "remotion-dev",
50321
- repoName: "template-prompt-to-video",
50322
- description: "Create a story with images and voiceover from a prompt",
50323
- longerDescription: "A template that turns prompts into short videos with a script, images and voiceover. Uses OpenAI and ElevenLabs to generate the content.",
50324
- promoVideo: {
50325
- muxId: "FGl01Rw6c5YOjBCTdVhn5wrmVaRWDOjDeT28iY3Sv47w",
50326
- height: 1920,
50327
- width: 1080
50328
- },
50329
- cliId: "prompt-to-video",
50330
- type: "video",
50331
- defaultBranch: "main",
50332
- featuredOnHomePage: null,
50333
- previewURL: null,
50334
- previewLabel: null,
50335
- templateInMonorepo: "template-prompt-to-video",
50336
- allowEnableTailwind: true,
50337
- contributedBy: "webmonch",
50338
- showStackblitz: true
50339
- },
50340
- {
50341
- homePageLabel: "Skia",
50342
- shortName: "Skia",
50343
- org: "remotion-dev",
50344
- repoName: "template-skia",
50345
- description: "React Native Skia starter",
50346
- longerDescription: "A template with React Native Skia already setup.",
50347
- promoVideo: {
50348
- muxId: "ecORcc01sP94IsTRGLwngxH4PC1r1kQq6iXpn00HqCIGI",
50349
- height: 1080,
50350
- width: 1920
50351
- },
50352
- cliId: "skia",
50353
- type: "video",
50354
- defaultBranch: "main",
50355
- featuredOnHomePage: null,
50356
- previewURL: null,
50357
- previewLabel: null,
50358
- templateInMonorepo: "template-skia",
50359
- allowEnableTailwind: false,
50360
- contributedBy: null,
50361
- showStackblitz: true
50362
- },
50363
- {
50364
- homePageLabel: "Overlay",
50365
- shortName: "Overlay",
50366
- org: "remotion-dev",
50367
- repoName: "template-overlay",
50368
- description: "Overlays for video editing software",
50369
- longerDescription: `
50370
- <span>
50371
- A starter template to create overlays to use in conventional video
50372
- editing software.
50373
- <a href="/docs/overlay">Read more about creating overlays.</a>
50374
- </span>
50375
- `,
50376
- promoVideo: {
50377
- muxId: "zgy7XK01009y33Vfzhns02cZS00rOyeZ6WaanaxcrDysqmU",
50378
- height: 720,
50379
- width: 1280
50380
- },
50381
- cliId: "overlay",
50382
- type: "video",
50383
- defaultBranch: "main",
50384
- featuredOnHomePage: null,
50385
- previewURL: null,
50386
- previewLabel: null,
50387
- templateInMonorepo: "template-overlay",
50388
- allowEnableTailwind: true,
50389
- contributedBy: null,
50390
- showStackblitz: true
50391
- },
50392
- {
50393
- homePageLabel: "Code Hike",
50394
- shortName: "Code Hike",
50395
- org: "remotion-dev",
50396
- repoName: "template-code-hike",
50397
- description: "Beautiful code animations",
50398
- longerDescription: `
50399
- Add code snippets and animate between them using
50400
- <a href="https://codehike.org/">Code Hike</a>. Supports many languages,
50401
- TypeScript error annotations, and many themes.
50402
- `,
50403
- promoVideo: {
50404
- muxId: "fKwnpTAOqvnZpu00fwEezi00cpF3927NumGcS1gGdUj8A",
50405
- width: 1080,
50406
- height: 1080
50407
- },
50408
- cliId: "code-hike",
50409
- type: "video",
50410
- defaultBranch: "main",
50411
- featuredOnHomePage: null,
50412
- previewURL: "https://template-code-hike.vercel.app/",
50413
- previewLabel: null,
50414
- templateInMonorepo: "template-code-hike",
50415
- allowEnableTailwind: false,
50416
- contributedBy: null,
50417
- showStackblitz: true
50418
- },
50419
- {
50420
- homePageLabel: "Stargazer",
50421
- shortName: "Stargazer",
50422
- org: "pomber",
50423
- repoName: "stargazer",
50424
- description: "Celebrate your repo stars with a video",
50425
- longerDescription: "Your repo reached a stars milestone? Celebrate with a video of your stargazers!",
50426
- promoVideo: {
50427
- muxId: "y9rC1DoQ7rCzzI9TGeUywyTliOVU8xhHTHHZZ2BhM014",
50428
- height: 540,
50429
- width: 960
50430
- },
50431
- cliId: "stargazer",
50432
- type: "video",
50433
- defaultBranch: "main",
50434
- featuredOnHomePage: null,
50435
- previewURL: null,
50436
- previewLabel: null,
50437
- templateInMonorepo: "template-stargazer",
50438
- allowEnableTailwind: true,
50439
- contributedBy: "pomber",
50440
- showStackblitz: true
50441
- },
50442
- {
50443
- homePageLabel: "TikTok",
50444
- shortName: "TikTok",
50445
- org: "remotion-dev",
50446
- repoName: "template-tiktok",
50447
- description: "Generate animated word-by-word captions",
50448
- longerDescription: "Caption a video of your choice locally with animated word-by-word captions. Automatically installs Whisper.cpp for you and allows you to customize the animation style.",
50449
- promoVideo: {
50450
- muxId: "BzwCAYgGPqNtLk301tsgWCDvuWVWfEvaO2bIo2lGEd300",
50451
- height: 1920,
50452
- width: 1080
50453
- },
50454
- cliId: "tiktok",
50455
- type: "video",
50456
- defaultBranch: "main",
50457
- featuredOnHomePage: null,
50458
- previewURL: null,
50459
- previewLabel: null,
50460
- templateInMonorepo: "template-tiktok",
50461
- allowEnableTailwind: true,
50462
- contributedBy: null,
50463
- showStackblitz: true
50464
- }
50465
- ].filter(truthy4);
50466
- var PAID_TEMPLATES = [
50467
- {
50468
- homePageLabel: "Editor Starter",
50469
- shortName: "Editor Starter",
50470
- org: "remotion-dev",
50471
- repoName: "editor-starter",
50472
- description: "A boilerplate for starting a video editor",
50473
- longerDescription: "A starting point for building your own video editor.",
50474
- cliId: "editor-starter",
50475
- defaultBranch: "main",
50476
- previewURL: "https://www.remotion.pro/editor-starter"
50477
- }
50478
- ].filter(truthy4);
50479
- var CreateVideoInternals = {
50480
- FEATURED_TEMPLATES,
50481
- listOfRemotionPackages
50482
- };
50483
-
50484
- // src/components/icons/blank.tsx
50485
- import { jsx as jsx131 } from "react/jsx-runtime";
50486
- var Blank = (props) => {
50487
- return /* @__PURE__ */ jsx131("svg", {
50488
- xmlns: "http://www.w3.org/2000/svg",
50489
- viewBox: "0 0 384 512",
50490
- ...props,
50491
- children: /* @__PURE__ */ jsx131("path", {
50492
- fill: "currentColor",
50493
- d: "M0 64C0 28.65 28.65 0 64 0H220.1C232.8 0 245.1 5.057 254.1 14.06L369.9 129.9C378.9 138.9 384 151.2 384 163.9V448C384 483.3 355.3 512 320 512H64C28.65 512 0 483.3 0 448V64zM352 192H240C213.5 192 192 170.5 192 144V32H64C46.33 32 32 46.33 32 64V448C32 465.7 46.33 480 64 480H320C337.7 480 352 465.7 352 448V192zM347.3 152.6L231.4 36.69C229.4 34.62 226.8 33.18 224 32.48V144C224 152.8 231.2 160 240 160H351.5C350.8 157.2 349.4 154.6 347.3 152.6z"
50494
- })
50495
- });
50496
- };
50497
-
50498
- // src/components/icons/brain.tsx
50499
- import { jsx as jsx134, jsxs as jsxs50 } from "react/jsx-runtime";
50500
- var BrainIcon = (props) => {
50501
- return /* @__PURE__ */ jsxs50("svg", {
50502
- xmlns: "http://www.w3.org/2000/svg",
50503
- viewBox: "0 0 24 24",
50504
- fill: "none",
50505
- stroke: "currentColor",
50506
- strokeWidth: "2",
50507
- strokeLinecap: "round",
50508
- strokeLinejoin: "round",
50509
- ...props,
50510
- children: [
50511
- /* @__PURE__ */ jsx134("path", {
50512
- d: "M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z"
50513
- }),
50514
- /* @__PURE__ */ jsx134("path", {
50515
- d: "M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z"
50516
- }),
50517
- /* @__PURE__ */ jsx134("path", {
50518
- d: "M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4"
50519
- }),
50520
- /* @__PURE__ */ jsx134("path", {
50521
- d: "M17.599 6.5a3 3 0 0 0 .399-1.375"
50522
- }),
50523
- /* @__PURE__ */ jsx134("path", {
50524
- d: "M6.003 5.125A3 3 0 0 0 6.401 6.5"
50525
- }),
50526
- /* @__PURE__ */ jsx134("path", {
50527
- d: "M3.477 10.896a4 4 0 0 1 .585-.396"
50528
- }),
50529
- /* @__PURE__ */ jsx134("path", {
50530
- d: "M19.938 10.5a4 4 0 0 1 .585.396"
50531
- }),
50532
- /* @__PURE__ */ jsx134("path", {
50533
- d: "M6 18a4 4 0 0 1-1.967-.516"
50534
- }),
50535
- /* @__PURE__ */ jsx134("path", {
50536
- d: "M19.967 17.484A4 4 0 0 1 18 18"
50537
- })
50538
- ]
50539
- });
50540
- };
50541
-
50542
- // src/components/icons/code-hike.tsx
50543
- import { jsx as jsx136, jsxs as jsxs51 } from "react/jsx-runtime";
50544
- var CodeHike = (props) => {
50545
- return /* @__PURE__ */ jsxs51("svg", {
50546
- ...props,
50547
- viewBox: "-100 -100 200 200",
50548
- fill: "currentColor",
50549
- children: [
50550
- /* @__PURE__ */ jsx136("path", {
50551
- d: "M 70 60 L 42 -27 L 72 -27 L 100 60 Z"
50552
- }),
50553
- /* @__PURE__ */ jsx136("path", {
50554
- d: "M 20.419540229885058 40.05357142857142 L 42 -27 L 72 -27 L 50.41954022988506 40.05357142857142 Z"
50555
- }),
50556
- /* @__PURE__ */ jsx136("path", {
50557
- d: "M 20.419540229885058 40.05357142857142 L -15 -70 L 15 -70 L 50.41954022988506 40.05357142857142 Z"
50558
- }),
50559
- /* @__PURE__ */ jsx136("path", {
50560
- d: "M -50.41954022988506 40.05357142857142 L -15 -70 L 15 -70 L -20.419540229885058 40.05357142857142 Z"
50561
- }),
50562
- /* @__PURE__ */ jsx136("path", {
50563
- d: "M -50.41954022988506 40.05357142857142 L -72 -27 L -42 -27 L -20.419540229885058 40.05357142857142 Z"
50564
- }),
50565
- /* @__PURE__ */ jsx136("path", {
50566
- d: "M -100 60 L -72 -27 L -42 -27 L -70 60 Z"
50567
- })
50568
- ]
50569
- });
50570
- };
50571
-
50572
- // src/components/icons/cubes.tsx
50573
- import { jsx as jsx137 } from "react/jsx-runtime";
50574
- var Cubes = (props) => {
50575
- return /* @__PURE__ */ jsx137("svg", {
50576
- xmlns: "http://www.w3.org/2000/svg",
50577
- viewBox: "0 0 512 512",
50578
- ...props,
50579
- children: /* @__PURE__ */ jsx137("path", {
50580
- fill: "currentColor",
50581
- d: "M239.5 5.018C250.1 1.106 261.9 1.106 272.5 5.018L480.5 81.28C499.4 88.22 512 106.2 512 126.4V385.7C512 405.8 499.4 423.8 480.5 430.7L272.5 506.1C261.9 510.9 250.1 510.9 239.5 506.1L31.48 430.7C12.57 423.8 0 405.8 0 385.7V126.4C0 106.2 12.57 88.22 31.48 81.28L239.5 5.018zM261.5 35.06C257.1 33.76 254 33.76 250.5 35.06L44.14 110.7L256 193.1L467.9 110.7L261.5 35.06zM42.49 400.7L240 473.1V222L32 140.3V385.7C32 392.4 36.19 398.4 42.49 400.7V400.7zM272 473.1L469.5 400.7C475.8 398.4 480 392.4 480 385.7V140.3L272 222V473.1z"
50582
- })
50583
- });
50584
- };
50585
-
50586
- // src/components/icons/electron.tsx
50587
- import { jsx as jsx138 } from "react/jsx-runtime";
50588
- var ElectronIcon = ({ style: style4 }) => {
50589
- return /* @__PURE__ */ jsx138("svg", {
50590
- viewBox: "0 0 640 640",
50591
- style: style4,
50592
- xmlns: "http://www.w3.org/2000/svg",
50593
- children: /* @__PURE__ */ jsx138("path", {
50594
- d: "M402 488.7C376.3 484 348.5 475.2 320 462.8C291.4 475.3 263.7 484.1 238 488.7C238.8 490.5 239.6 492.3 240.5 494.1C261.3 538 289.1 559.9 320 559.9C350.9 559.9 378.7 537.9 399.5 494.1C400.3 492.3 401.2 490.5 402 488.7zM320 576C277.2 576 243.6 543.3 221.6 491.2C168.9 497.3 126.6 484.4 106.4 448C85.7 410.9 97 365.2 130 320C97 274.8 85.7 229.1 106.4 192C126.6 155.7 168.9 142.7 221.6 148.8C243.6 96.7 277.3 64 320 64C362.7 64 396.4 96.7 418.4 148.8C471.1 142.7 513.4 155.6 533.6 192C554.3 229.1 543 274.8 510 320C543 365.2 554.3 410.9 533.6 448C513.4 484.3 471.1 497.3 418.4 491.2C396.4 543.3 362.7 576 320 576zM300.3 453.7C286.4 446.9 272.4 439.3 258.3 430.9C242.6 421.5 227.7 411.6 213.8 401.4C217.8 428 223.9 452.4 231.8 473.7C253.1 470.1 276.2 463.4 300.3 453.8zM408.2 473.6C416 452.4 422.1 428 426.2 401.3C412.3 411.6 397.4 421.5 381.7 430.8C367.7 439.2 353.6 446.8 339.7 453.6C363.8 463.2 386.9 469.9 408.2 473.5zM373.5 417.2C393.6 405.2 412.2 392.4 429.1 379.1C431.1 360.3 432.1 340.5 432.1 320.1C432.1 299.7 431.1 279.9 429.1 261.1C412.2 247.8 393.6 235 373.5 223C355.5 212.2 337.6 202.8 320.1 194.8C302.6 202.8 284.7 212.2 266.7 223C246.6 235 228 247.8 211.1 261.1C209.1 279.9 208.1 299.7 208.1 320.1C208.1 340.5 209.1 360.3 211.1 379.1C228 392.4 246.6 405.2 266.7 417.2C284.7 428 302.6 437.4 320.1 445.4C337.6 437.4 355.5 428 373.5 417.2zM424.5 475.8C425.4 475.9 426.3 476 427.2 476C473.5 479.9 504.8 467 519.7 440.2C534.8 413.1 529.6 377.9 503.1 337.9C502 336.3 501 334.7 499.8 333.1C484.5 351.6 465.8 369.9 444.2 387.3C440.4 419.8 433.7 449.7 424.5 475.6zM446.4 364.7C463.2 350.1 477.8 335 489.9 320C477.9 305 463.2 290 446.4 275.3C447.5 289.8 448.1 304.7 448.1 320C448.1 335.3 447.5 350.2 446.4 364.7zM503 302C529.6 262 534.7 226.8 519.6 199.7C504.7 172.9 473.3 160.1 427.1 164C426.2 164.1 425.3 164.2 424.4 164.2C433.6 190.2 440.3 220.1 444.1 252.5C465.7 270 484.4 288.2 499.7 306.7C500.8 305.1 501.9 303.5 503 301.9zM399.5 145.8C378.7 102 351 80 320 80C289 80 261.3 102 240.5 145.8C239.7 147.6 238.8 149.4 238 151.2C263.7 155.9 291.5 164.7 320 177.1C348.6 164.6 376.3 155.8 402 151.2C401.2 149.4 400.4 147.6 399.5 145.8zM408.1 166.4C386.8 170 363.7 176.7 339.6 186.3C353.5 193.1 367.5 200.7 381.6 209.1C397.3 218.5 412.2 228.4 426.1 238.6C422.1 212 416 187.6 408.1 166.3zM231.7 166.4C223.9 187.6 217.8 212 213.7 238.7C227.6 228.4 242.5 218.6 258.2 209.2C272.2 200.8 286.3 193.2 300.2 186.4C276.1 176.8 253 170.1 231.7 166.5zM215.5 164.2C214.6 164.1 213.7 164 212.8 164C166.5 160.1 135.2 173 120.3 199.7C105.2 226.8 110.4 262 136.9 302C138 303.6 139 305.2 140.2 306.8C155.5 288.3 174.2 270 195.8 252.6C199.6 220.1 206.3 190.2 215.5 164.3zM195.8 387.4C174.2 369.9 155.5 351.7 140.2 333.2C139.1 334.8 138 336.4 136.9 338C110.3 378 105.2 413.2 120.3 440.3C135.2 467.1 166.6 479.9 212.8 476.1C213.7 476 214.6 475.9 215.5 475.9C206.3 449.9 199.6 420 195.8 387.6zM193.7 275.3C176.9 289.9 162.3 305 150.2 320C162.2 335 176.9 350 193.7 364.7C192.6 350.2 192 335.3 192 320C192 304.7 192.6 289.8 193.7 275.3zM320 272C346.5 272 368 293.5 368 320C368 346.5 346.5 368 320 368C293.5 368 272 346.5 272 320C272 293.5 293.5 272 320 272zM352 320C352 302.3 337.7 288 320 288C302.3 288 288 302.3 288 320C288 337.7 302.3 352 320 352C337.7 352 352 337.7 352 320z",
50595
- fill: "currentColor"
50596
- })
50597
- });
50598
- };
50599
-
50600
- // src/components/icons/js.tsx
50601
- import { jsx as jsx139 } from "react/jsx-runtime";
50602
- var JSIcon = (props) => {
50603
- return /* @__PURE__ */ jsx139("svg", {
50604
- className: "svg-inline--fa fa-js-square fa-w-14",
50605
- viewBox: "0 0 448 512",
50606
- ...props,
50607
- children: /* @__PURE__ */ jsx139("path", {
50608
- fill: "currentColor",
50609
- d: "M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zM243.8 381.4c0 43.6-25.6 63.5-62.9 63.5-33.7 0-53.2-17.4-63.2-38.5l34.3-20.7c6.6 11.7 12.6 21.6 27.1 21.6 13.8 0 22.6-5.4 22.6-26.5V237.7h42.1v143.7zm99.6 63.5c-39.1 0-64.4-18.6-76.7-43l34.3-19.8c9 14.7 20.8 25.6 41.5 25.6 17.4 0 28.6-8.7 28.6-20.8 0-14.4-11.4-19.5-30.7-28l-10.5-4.5c-30.4-12.9-50.5-29.2-50.5-63.5 0-31.6 24.1-55.6 61.6-55.6 26.8 0 46 9.3 59.8 33.7L368 290c-7.2-12.9-15-18-27.1-18-12.3 0-20.1 7.8-20.1 18 0 12.6 7.8 17.7 25.9 25.6l10.5 4.5c35.8 15.3 55.9 31 55.9 66.2 0 37.8-29.8 58.6-69.7 58.6z"
50610
- })
50611
- });
50612
- };
50613
-
50614
- // src/components/icons/music.tsx
50615
- import { jsx as jsx140 } from "react/jsx-runtime";
50616
- var MusicIcon = (props) => {
50617
- return /* @__PURE__ */ jsx140("svg", {
50618
- ...props,
50619
- xmlns: "http://www.w3.org/2000/svg",
50620
- viewBox: "0 0 512 512",
50621
- children: /* @__PURE__ */ jsx140("path", {
50622
- fill: "currentColor",
50623
- d: "M499.1 6.3c8.1 6 12.9 15.6 12.9 25.7l0 72 0 264c0 44.2-43 80-96 80s-96-35.8-96-80s43-80 96-80c11.2 0 22 1.6 32 4.6L448 147 192 223.8 192 432c0 44.2-43 80-96 80s-96-35.8-96-80s43-80 96-80c11.2 0 22 1.6 32 4.6L128 200l0-72c0-14.1 9.3-26.6 22.8-30.7l320-96c9.7-2.9 20.2-1.1 28.3 5z"
50624
- })
50625
- });
50626
- };
50627
-
50628
- // src/components/icons/next.tsx
50629
- import { jsx as jsx141, jsxs as jsxs54 } from "react/jsx-runtime";
50630
- var NextIcon = ({ style: style4 }) => {
50631
- return /* @__PURE__ */ jsxs54("svg", {
50632
- fill: "none",
50633
- viewBox: "0 0 180 180",
50634
- style: style4,
50635
- xmlns: "http://www.w3.org/2000/svg",
50636
- children: [
50637
- /* @__PURE__ */ jsx141("mask", {
50638
- height: "180",
50639
- id: "mask0_292_250",
50640
- maskUnits: "userSpaceOnUse",
50641
- style: { maskType: "alpha" },
50642
- width: "180",
50643
- x: "0",
50644
- y: "0",
50645
- children: /* @__PURE__ */ jsx141("circle", {
50646
- cx: "90",
50647
- cy: "90",
50648
- fill: "currentcolor",
50649
- r: "90"
50650
- })
50651
- }),
50652
- /* @__PURE__ */ jsxs54("g", {
50653
- mask: "url(#mask0_292_250)",
50654
- children: [
50655
- /* @__PURE__ */ jsx141("circle", {
50656
- cx: "90",
50657
- cy: "90",
50658
- fill: "currentcolor",
50659
- r: "90"
50660
- }),
50661
- /* @__PURE__ */ jsx141("path", {
50662
- d: "M149.508 157.52L69.142 54H54V125.97H66.1136V69.3836L139.999 164.845C143.333 162.614 146.509 160.165 149.508 157.52Z",
50663
- fill: "url(#paint0_linear_292_250)"
50664
- }),
50665
- /* @__PURE__ */ jsx141("rect", {
50666
- fill: "url(#paint1_linear_292_250)",
50667
- height: "72",
50668
- width: "12",
50669
- x: "115",
50670
- y: "54"
50671
- })
50672
- ]
50673
- }),
50674
- /* @__PURE__ */ jsxs54("defs", {
50675
- children: [
50676
- /* @__PURE__ */ jsxs54("linearGradient", {
50677
- gradientUnits: "userSpaceOnUse",
50678
- id: "paint0_linear_292_250",
50679
- x1: "109",
50680
- x2: "144.5",
50681
- y1: "116.5",
50682
- y2: "160.5",
50683
- children: [
50684
- /* @__PURE__ */ jsx141("stop", {
50685
- stopColor: "var(--background)"
50686
- }),
50687
- /* @__PURE__ */ jsx141("stop", {
50688
- offset: "1",
50689
- stopColor: "var(--background)",
50690
- stopOpacity: "0"
50691
- })
50692
- ]
50693
- }),
50694
- /* @__PURE__ */ jsxs54("linearGradient", {
50695
- gradientUnits: "userSpaceOnUse",
50696
- id: "paint1_linear_292_250",
50697
- x1: "121",
50698
- x2: "120.799",
50699
- y1: "54",
50700
- y2: "106.875",
50701
- children: [
50702
- /* @__PURE__ */ jsx141("stop", {
50703
- stopColor: "var(--background)"
50704
- }),
50705
- /* @__PURE__ */ jsx141("stop", {
50706
- offset: "1",
50707
- stopColor: "var(--background)",
50708
- stopOpacity: "0"
50709
- })
50710
- ]
50711
- })
50712
- ]
50713
- })
50714
- ]
50715
- });
50716
- };
50717
-
50718
- // src/components/icons/overlay.tsx
50719
- import { jsx as jsx144, jsxs as jsxs56 } from "react/jsx-runtime";
50720
- var OverlayIcon = (props) => {
50721
- return /* @__PURE__ */ jsxs56("svg", {
50722
- viewBox: "0 0 576 512",
50723
- fill: "none",
50724
- xmlns: "http://www.w3.org/2000/svg",
50725
- ...props,
50726
- children: [
50727
- /* @__PURE__ */ jsx144("path", {
50728
- d: "M251.1 407.9C274.5 418.7 301.5 418.7 324.9 407.9V407.8L476.9 337.6L530.1 362.2C538.6 366.1 544 374.6 544 384C544 393.4 538.6 401.9 530.1 405.8L311.5 506.8C296.6 513.7 279.4 513.7 264.5 506.8L45.9 405.8C37.4 401.9 32 393.4 32 384C32 374.6 37.4 366.1 45.9 362.2L99.1 337.7L251.1 407.9Z",
50729
- fill: "currentcolor"
50730
- }),
50731
- /* @__PURE__ */ jsx144("path", {
50732
- d: "M277.8 132.7L495.2 230.1C505.4 234.7 512 244.8 512 256C512 267.2 505.4 277.3 495.2 281.9L277.8 379.3C270.1 382.4 263.5 384 256 384C248.5 384 241 382.4 234.2 379.3L16.76 281.9C6.561 277.3 0.0003 267.2 0.0003 256C0.0003 244.8 6.561 234.7 16.76 230.1L234.2 132.7C241 129.6 248.5 128 256 128C263.5 128 270.1 129.6 277.8 132.7Z",
50733
- stroke: "currentcolor",
50734
- transform: "translate(32, -25)",
50735
- strokeWidth: "36"
50736
- })
50737
- ]
50738
- });
50739
- };
50740
-
50741
- // src/components/icons/prompt-to-video.tsx
50742
- import { jsx as jsx146 } from "react/jsx-runtime";
50743
- var PromptToVideoIcon = (props) => {
50744
- return /* @__PURE__ */ jsx146("svg", {
50745
- xmlns: "http://www.w3.org/2000/svg",
50746
- viewBox: "0 0 512 512",
50747
- ...props,
50748
- children: /* @__PURE__ */ jsx146("path", {
50749
- d: "M278.5 15.6C275 6.2 266 0 256 0s-19 6.2-22.5 15.6L174.2 174.2 15.6 233.5C6.2 237 0 246 0 256s6.2 19 15.6 22.5l158.6 59.4 59.4 158.6C237 505.8 246 512 256 512s19-6.2 22.5-15.6l59.4-158.6 158.6-59.4C505.8 275 512 266 512 256s-6.2-19-15.6-22.5L337.8 174.2 278.5 15.6z",
50750
- fill: "currentColor"
50751
- })
50752
- });
50753
- };
50754
-
50755
- // src/components/icons/recorder.tsx
50756
- import { jsx as jsx147, jsxs as jsxs57 } from "react/jsx-runtime";
50757
- var Recorder = (props) => {
50758
- return /* @__PURE__ */ jsxs57("svg", {
50759
- viewBox: "0 0 700 700",
50760
- ...props,
50761
- children: [
50762
- /* @__PURE__ */ jsx147("path", {
50763
- d: "M0 350C0 115.5 115.5 0 350 0C584.5 0 700 115.5 700 350C700 584.5 584.5 700 350 700C115.5 700 0 584.5 0 350Z",
50764
- fill: "#F43B00",
50765
- fillOpacity: "0.15"
50766
- }),
50767
- /* @__PURE__ */ jsx147("path", {
50768
- d: "M79.4595 344.324C79.4595 161.794 169.362 71.8915 351.892 71.8915C534.422 71.8915 624.324 161.794 624.324 344.324C624.324 526.854 534.422 616.756 351.892 616.756C169.362 616.756 79.4595 526.854 79.4595 344.324Z",
50769
- fill: "#F43B00",
50770
- fillOpacity: "0.3"
50771
- }),
50772
- /* @__PURE__ */ jsx147("path", {
50773
- d: "M155.135 343.378C155.135 212.185 219.752 147.567 350.946 147.567C482.139 147.567 546.756 212.185 546.756 343.378C546.756 474.571 482.139 539.189 350.946 539.189C219.752 539.189 155.135 474.571 155.135 343.378Z",
50774
- fill: "#F43B00"
50775
- })
50776
- ]
50777
- });
50778
- };
50779
-
50780
- // src/components/icons/remix.tsx
50781
- import { jsx as jsx148, jsxs as jsxs58 } from "react/jsx-runtime";
50782
- var ReactRouterIcon = (props) => {
50783
- return /* @__PURE__ */ jsx148("svg", {
50784
- xmlns: "http://www.w3.org/2000/svg",
50785
- width: "800px",
50786
- height: "800px",
50787
- viewBox: "0 -58 256 256",
50788
- version: "1.1",
50789
- preserveAspectRatio: "xMidYMid",
50790
- ...props,
50791
- children: /* @__PURE__ */ jsxs58("g", {
50792
- children: [
50793
- /* @__PURE__ */ jsx148("path", {
50794
- d: "M78.0659341,92.5875806 C90.8837956,92.5875806 101.274726,82.1966508 101.274726,69.3787894 C101.274726,56.5609279 90.8837956,46.1699982 78.0659341,46.1699982 C65.2480726,46.1699982 54.8571429,56.5609279 54.8571429,69.3787894 C54.8571429,82.1966508 65.2480726,92.5875806 78.0659341,92.5875806 Z M23.2087913,139.005163 C36.0266526,139.005163 46.4175825,128.614233 46.4175825,115.796372 C46.4175825,102.97851 36.0266526,92.5875806 23.2087913,92.5875806 C10.3909298,92.5875806 0,102.97851 0,115.796372 C0,128.614233 10.3909298,139.005163 23.2087913,139.005163 Z M232.791209,139.005163 C245.60907,139.005163 256,128.614233 256,115.796372 C256,102.97851 245.60907,92.5875806 232.791209,92.5875806 C219.973347,92.5875806 209.582418,102.97851 209.582418,115.796372 C209.582418,128.614233 219.973347,139.005163 232.791209,139.005163 Z",
50795
- fill: "currentcolor"
50796
- }),
50797
- /* @__PURE__ */ jsx148("path", {
50798
- d: "M156.565464,70.3568084 C155.823426,62.6028163 155.445577,56.1490255 149.505494,51.6131676 C141.982638,45.8687002 133.461166,49.5960243 122.964463,45.8072968 C112.650326,43.3121427 105,34.1545727 105,23.2394367 C105,10.4046502 115.577888,0 128.626373,0 C138.29063,0 146.599638,5.70747659 150.259573,13.8825477 C155.861013,24.5221258 152.220489,35.3500418 159.258242,40.8041273 C167.591489,47.2621895 178.826167,42.5329154 191.362109,48.6517412 C195.390112,50.5026944 198.799584,53.4384578 201.202056,57.0769224 C203.604528,60.7153869 205,65.0565524 205,69.7183101 C205,80.633446 197.349674,89.7910161 187.035538,92.2861702 C176.538834,96.0748977 168.017363,92.3475736 160.494506,98.092041 C152.03503,104.551712 156.563892,115.358642 149.669352,126.774447 C145.756163,134.291567 137.802119,139.43662 128.626373,139.43662 C115.577888,139.43662 105,129.03197 105,116.197184 C105,106.873668 110.581887,98.832521 118.637891,95.1306146 C131.173833,89.0117889 142.408511,93.7410629 150.741758,87.2830007 C155.549106,83.5574243 156.565464,77.8102648 156.565464,70.3568084 Z",
50799
- fill: "currentcolor"
50800
- })
50801
- ]
50802
- })
50803
- });
50804
- };
50805
-
50806
- // src/components/icons/render-server.tsx
50807
- import { jsx as jsx149, jsxs as jsxs59 } from "react/jsx-runtime";
50808
- var RenderServerIcon = (props) => {
50809
- return /* @__PURE__ */ jsxs59("svg", {
50810
- ...props,
50811
- xmlns: "http://www.w3.org/2000/svg",
50812
- viewBox: "0 0 24 24",
50813
- fill: "none",
50814
- stroke: "currentColor",
50815
- strokeWidth: "1.5",
50816
- strokeLinecap: "round",
50817
- strokeLinejoin: "round",
50818
- children: [
50819
- /* @__PURE__ */ jsx149("rect", {
50820
- width: "18",
50821
- height: "18",
50822
- x: "3",
50823
- y: "3",
50824
- rx: "2"
50825
- }),
50826
- /* @__PURE__ */ jsx149("path", {
50827
- d: "m10 8 4 4-4 4"
50828
- })
50829
- ]
50830
- });
50831
- };
50832
-
50833
- // src/components/icons/skia.tsx
50834
- import { jsx as jsx150 } from "react/jsx-runtime";
50835
- var SkiaIcon = (props) => {
50836
- return /* @__PURE__ */ jsx150("svg", {
50837
- ...props,
50838
- xmlns: "http://www.w3.org/2000/svg",
50839
- viewBox: "0 0 576 512",
50840
- children: /* @__PURE__ */ jsx150("path", {
50841
- fill: "currentColor",
50842
- d: "M288 400C288 461.9 237.9 512 176 512H32C14.33 512 0 497.7 0 480C0 462.3 14.33 448 32 448H36.81C54.44 448 66.4 429.1 64.59 411.6C64.2 407.8 64 403.9 64 400C64 338.1 114.1 288 176 288C178.8 288 181.5 288.1 184.3 288.3C184.1 285.7 183.1 282.1 183.1 280.3C183.1 244.6 201.1 210.1 229.1 189.1L474.3 12.25C499.7-6.279 534.9-3.526 557.2 18.74C579.4 41 582.2 76.16 563.7 101.6L386.1 345.1C365 374.9 331.4 392 295.7 392C293 392 290.3 391.9 287.7 391.7C287.9 394.5 287.1 397.2 287.1 400H288zM295.7 360C321.2 360 345.2 347.8 360.2 327.2L537.8 82.82C547.1 70.08 545.7 52.5 534.5 41.37C523.4 30.24 505.8 28.86 493.1 38.12L248.8 215.8C228.2 230.8 215.1 254.8 215.1 280.3C215.1 285.7 216.5 290.9 217.5 295.1L217.6 295.1C217.9 297.3 218.2 298.6 218.5 299.9L276.1 357.5C277.4 357.8 278.7 358.1 280 358.4L280 358.5C285.1 359.5 290.3 360 295.7 360L295.7 360zM253.5 380.1L195.9 322.5C194.5 322.2 193.2 321.8 191.9 321.6C186.7 320.5 181.4 320 176 320C131.8 320 96 355.8 96 400C96 402.8 96.14 405.6 96.43 408.3C98.15 425 93.42 441.9 83.96 455.1C74.31 468.5 58 480 36.81 480H176C220.2 480 256 444.2 256 400C256 394.6 255.5 389.3 254.4 384.1C254.2 382.8 253.9 381.5 253.5 380.1V380.1z"
50843
- })
50844
- });
50845
- };
50846
-
50847
- // src/components/icons/stargazer.tsx
50848
- import { jsx as jsx151 } from "react/jsx-runtime";
50849
- var Stargazer = (props) => {
50850
- return /* @__PURE__ */ jsx151("svg", {
50851
- height: "1em",
50852
- viewBox: "0 0 512 512",
50853
- ...props,
50854
- children: /* @__PURE__ */ jsx151("path", {
50855
- fill: "currentcolor",
50856
- d: "M325.8 152.3c1.3 4.6 5.5 7.7 10.2 7.7s8.9-3.1 10.2-7.7L360 104l48.3-13.8c4.6-1.3 7.7-5.5 7.7-10.2s-3.1-8.9-7.7-10.2L360 56 346.2 7.7C344.9 3.1 340.7 0 336 0s-8.9 3.1-10.2 7.7L312 56 263.7 69.8c-4.6 1.3-7.7 5.5-7.7 10.2s3.1 8.9 7.7 10.2L312 104l13.8 48.3zM115.7 346.2L75.5 307l55.5-8.1c15.6-2.3 29.2-12.1 36.1-26.3l24.8-50.3 24.8 50.3c7 14.2 20.5 24 36.1 26.3l55.5 8.1-40.2 39.2c-11.3 11-16.4 26.9-13.8 42.4l9.5 55.4-49.5-26.1c-14-7.4-30.7-7.4-44.7 0L120 444l9.5-55.4c2.7-15.6-2.5-31.4-13.8-42.4zm54.7-188.8l-46.3 94L20.5 266.5C.9 269.3-7 293.5 7.2 307.4l74.9 73.2L64.5 483.9c-3.4 19.6 17.2 34.6 34.8 25.3l92.6-48.8 92.6 48.8c17.6 9.3 38.2-5.7 34.8-25.3L301.6 380.6l74.9-73.2c14.2-13.9 6.4-38.1-13.3-40.9L259.7 251.4l-46.3-94c-8.8-17.9-34.3-17.9-43.1 0zm258.4 85.8l11 38.6c1 3.6 4.4 6.2 8.2 6.2s7.1-2.5 8.2-6.2l11-38.6 38.6-11c3.6-1 6.2-4.4 6.2-8.2s-2.5-7.1-6.2-8.2l-38.6-11-11-38.6c-1-3.6-4.4-6.2-8.2-6.2s-7.1 2.5-8.2 6.2l-11 38.6-38.6 11c-3.6 1-6.2 4.4-6.2 8.2s2.5 7.1 6.2 8.2l38.6 11z"
50857
- })
50858
- });
50859
- };
50860
-
50861
- // src/components/icons/still.tsx
50862
- import { jsx as jsx154 } from "react/jsx-runtime";
50863
- var StillIcon = (props) => {
50864
- return /* @__PURE__ */ jsx154("svg", {
50865
- xmlns: "http://www.w3.org/2000/svg",
50866
- viewBox: "0 0 512 512",
50867
- ...props,
50868
- children: /* @__PURE__ */ jsx154("path", {
50869
- fill: "currentColor",
50870
- d: "M324.9 157.8c-11.38-17.38-39.89-17.31-51.23-.0625L200.5 268.5L184.1 245.9C172.7 229.1 145.9 229.9 134.4 245.9l-64.52 89.16c-6.797 9.406-7.75 21.72-2.547 32C72.53 377.5 83.05 384 94.75 384h322.5c11.41 0 21.8-6.281 27.14-16.38c5.312-10 4.734-22.09-1.516-31.56L324.9 157.8zM95.8 352l62.39-87.38l29.91 41.34C191.2 310.2 196.4 313.2 201.4 312.6c5.25-.125 10.12-2.781 13.02-7.188l83.83-129.9L415 352H95.8zM447.1 32h-384C28.65 32-.0091 60.65-.0091 96v320c0 35.35 28.65 64 63.1 64h384c35.35 0 64-28.65 64-64V96C511.1 60.65 483.3 32 447.1 32zM480 416c0 17.64-14.36 32-32 32H64c-17.64 0-32-14.36-32-32V96c0-17.64 14.36-32 32-32h384c17.64 0 32 14.36 32 32V416zM144 192C170.5 192 192 170.5 192 144S170.5 96 144 96S96 117.5 96 144S117.5 192 144 192zM144 128c8.822 0 15.1 7.178 15.1 16S152.8 160 144 160S128 152.8 128 144S135.2 128 144 128z"
50871
- })
50872
- });
50873
- };
50874
-
50875
- // src/components/icons/tiktok.tsx
50876
- import { jsx as jsx156 } from "react/jsx-runtime";
50877
- var TikTok = (props) => {
50878
- return /* @__PURE__ */ jsx156("svg", {
50879
- ...props,
50880
- viewBox: "0 0 448 512",
50881
- children: /* @__PURE__ */ jsx156("path", {
50882
- fill: "currentcolor",
50883
- d: "M448 209.9a210.1 210.1 0 0 1 -122.8-39.3V349.4A162.6 162.6 0 1 1 185 188.3V278.2a74.6 74.6 0 1 0 52.2 71.2V0l88 0a121.2 121.2 0 0 0 1.9 22.2h0A122.2 122.2 0 0 0 381 102.4a121.4 121.4 0 0 0 67 20.1z"
50884
- })
50885
- });
50886
- };
50887
-
50888
- // src/components/icons/ts.tsx
50889
- import { jsx as jsx157 } from "react/jsx-runtime";
50890
- var TypeScriptIcon = (props) => {
50891
- return /* @__PURE__ */ jsx157("svg", {
50892
- fill: "#000000",
50893
- xmlns: "http://www.w3.org/2000/svg",
50894
- viewBox: "0 0 24 24",
50895
- ...props,
50896
- children: /* @__PURE__ */ jsx157("path", {
50897
- fill: "currentColor",
50898
- d: "M3,5v14c0,1.105,0.895,2,2,2h14c1.105,0,2-0.895,2-2V5c0-1.105-0.895-2-2-2H5C3.895,3,3,3.895,3,5z M13.666,12.451h-2.118\tV19H9.841v-6.549H7.767V11h5.899V12.451z M13.998,18.626v-1.751c0,0,0.956,0.721,2.104,0.721c1.148,0,1.103-0.75,1.103-0.853\tc0-1.089-3.251-1.089-3.251-3.501c0-3.281,4.737-1.986,4.737-1.986l-0.059,1.559c0,0-0.794-0.53-1.692-0.53\tc-0.897,0-1.221,0.427-1.221,0.883c0,1.177,3.281,1.059,3.281,3.428C19,20.244,13.998,18.626,13.998,18.626z"
50899
- })
50900
- });
50901
- };
50902
-
50903
- // src/components/icons/vercel.tsx
50904
- import { jsx as jsx158 } from "react/jsx-runtime";
50905
- var VercelIcon = ({ style: style4 }) => {
50906
- return /* @__PURE__ */ jsx158("svg", {
50907
- fill: "currentcolor",
50908
- viewBox: "0 0 76 65",
50909
- style: style4,
50910
- xmlns: "http://www.w3.org/2000/svg",
50911
- children: /* @__PURE__ */ jsx158("path", {
50912
- d: "M37.5274 0L75.0548 65H0L37.5274 0Z"
50913
- })
50914
- });
50915
- };
50916
-
50917
- // src/components/icons/waveform.tsx
50918
- import { jsx as jsx159 } from "react/jsx-runtime";
50919
- var Waveform = (props) => {
50920
- return /* @__PURE__ */ jsx159("svg", {
50921
- xmlns: "http://www.w3.org/2000/svg",
50922
- viewBox: "0 0 640 512",
50923
- ...props,
50924
- children: /* @__PURE__ */ jsx159("path", {
50925
- fill: "currentColor",
50926
- d: "M224 96C215.2 96 208 103.2 208 111.1v288C208 408.8 215.2 416 223.1 416C232.8 416 240 408.8 240 400V111.1C240 103.2 232.8 96 224 96zM128 192C119.2 192 112 199.2 112 207.1V304C112 312.8 119.2 320 127.1 320S144 312.8 144 304V207.1C144 199.2 136.8 192 128 192zM32 224C23.2 224 16 231.2 16 239.1V272C16 280.8 23.2 288 31.1 288S48 280.8 48 272V239.1C48 231.2 40.8 224 32 224zM416 128C407.2 128 400 135.2 400 143.1v224C400 376.8 407.2 384 415.1 384S432 376.8 432 368V143.1C432 135.2 424.8 128 416 128zM608 224c-8.8 0-16 7.2-16 15.1V272C592 280.8 599.2 288 608 288s16-7.2 16-15.1V239.1C624 231.2 616.8 224 608 224zM512 64c-8.8 0-16 7.2-16 15.1V432C496 440.8 503.2 448 511.1 448C520.8 448 528 440.8 528 432V79.1C528 71.2 520.8 64 512 64zM320 0C311.2 0 304 7.2 304 15.1V496C304 504.8 311.2 512 319.1 512S336 504.8 336 496V15.1C336 7.2 328.8 0 320 0z"
50927
- })
50928
- });
50929
- };
50930
-
50931
- // src/components/homepage/IconForTemplate.tsx
50932
- import { jsx as jsx160 } from "react/jsx-runtime";
50933
- var IconForTemplate = ({ template, scale: scale4 = 1 }) => {
50934
- if (template.cliId === "hello-world") {
50935
- return /* @__PURE__ */ jsx160(TypeScriptIcon, {
50936
- style: {
50937
- height: scale4 * 48
50938
- }
50939
- });
50940
- }
50941
- if (template.cliId === "blank") {
50942
- return /* @__PURE__ */ jsx160(Blank, {
50943
- style: {
50944
- height: scale4 * 36,
50945
- overflow: "visible"
50946
- }
50947
- });
50948
- }
50949
- if (template.cliId === "javascript") {
50950
- return /* @__PURE__ */ jsx160(JSIcon, {
50951
- style: {
50952
- height: scale4 * 40
50953
- }
50954
- });
50955
- }
50956
- if (template.cliId === "three") {
50957
- return /* @__PURE__ */ jsx160(Cubes, {
50958
- style: {
50959
- height: scale4 * 36
50960
- }
50961
- });
50962
- }
50963
- if (template.cliId === "still") {
50964
- return /* @__PURE__ */ jsx160(StillIcon, {
50965
- style: {
50966
- height: scale4 * 36
50967
- }
50968
- });
50969
- }
50970
- if (template.cliId === "audiogram") {
50971
- return /* @__PURE__ */ jsx160(Waveform, {
50972
- style: {
50973
- height: scale4 * 36
50974
- }
50975
- });
50976
- }
50977
- if (template.cliId === "skia") {
50978
- return /* @__PURE__ */ jsx160(SkiaIcon, {
50979
- style: {
50980
- height: scale4 * 32
50981
- }
50982
- });
50983
- }
50984
- if (template.cliId === "music-visualization") {
50985
- return /* @__PURE__ */ jsx160(MusicIcon, {
50986
- style: {
50987
- height: scale4 * 32
50988
- }
50989
- });
50990
- }
50991
- if (template.cliId === "react-router") {
50992
- return /* @__PURE__ */ jsx160(ReactRouterIcon, {
50993
- style: {
50994
- height: scale4 * 32
50995
- }
50996
- });
50997
- }
50998
- if (template.cliId === "overlay") {
50999
- return /* @__PURE__ */ jsx160(OverlayIcon, {
51000
- style: { height: scale4 * 42 }
51001
- });
51002
- }
51003
- if (template.cliId === "render-server") {
51004
- return /* @__PURE__ */ jsx160(RenderServerIcon, {
51005
- style: { height: scale4 * 36 }
51006
- });
51007
- }
51008
- if (template.cliId === "electron") {
51009
- return /* @__PURE__ */ jsx160(ElectronIcon, {
51010
- style: { height: scale4 * 36 }
51011
- });
51012
- }
51013
- if (template.cliId === "recorder") {
51014
- return /* @__PURE__ */ jsx160(Recorder, {
51015
- style: { height: scale4 * 36 }
51016
- });
51017
- }
51018
- if (template.cliId === "next" || template.cliId === "next-no-tailwind" || template.cliId === "next-pages-dir") {
51019
- return /* @__PURE__ */ jsx160(NextIcon, {
51020
- style: { height: scale4 * 36 }
51021
- });
51022
- }
51023
- if (template.cliId === "stargazer") {
51024
- return /* @__PURE__ */ jsx160(Stargazer, {
51025
- style: { height: scale4 * 36 }
51026
- });
51027
- }
51028
- if (template.cliId === "tiktok") {
51029
- return /* @__PURE__ */ jsx160(TikTok, {
51030
- style: { height: scale4 * 36 }
51031
- });
51032
- }
51033
- if (template.cliId === "code-hike") {
51034
- return /* @__PURE__ */ jsx160(CodeHike, {
51035
- style: { height: scale4 * 36 }
51036
- });
51037
- }
51038
- if (template.cliId === "prompt-to-video") {
51039
- return /* @__PURE__ */ jsx160(PromptToVideoIcon, {
51040
- style: { height: scale4 * 36 }
51041
- });
51042
- }
51043
- if (template.cliId === "prompt-to-motion-graphics") {
51044
- return /* @__PURE__ */ jsx160(BrainIcon, {
51045
- style: { height: scale4 * 36 }
51046
- });
51047
- }
51048
- if (template.cliId === "vercel") {
51049
- return /* @__PURE__ */ jsx160(VercelIcon, {
51050
- style: { height: scale4 * 28 }
51051
- });
51052
- }
51053
- throw new Error(`Unknown template: ${template.cliId}`);
51054
- };
51055
-
51056
- // src/components/homepage/layout/use-mobile-layout.ts
51057
- var useMobileLayout = () => {
51058
- const containerSize = useElementSize2(typeof document === "undefined" ? null : document.body);
51059
- return (containerSize?.width ?? Infinity) < 900;
51060
- };
51061
-
51062
- // src/components/homepage/MoreTemplatesButton.tsx
51063
- import { jsx as jsx161, jsxs as jsxs60 } from "react/jsx-runtime";
51064
- var icon7 = {
51065
- height: 16,
51066
- marginLeft: 10
51067
- };
51068
- var MoreTemplatesButton = () => {
51069
- const mobileLayout = useMobileLayout();
51070
- return /* @__PURE__ */ jsxs60(Button, {
51071
- href: "/templates",
51072
- className: "right-0 border-2 rounded-full text-inherit px-4 py-2 fontbrand font-semibold text-sm flex flex-row items-center h-10",
51073
- children: [
51074
- mobileLayout ? "Templates" : "Find a template",
51075
- /* @__PURE__ */ jsx161("svg", {
51076
- style: icon7,
51077
- xmlns: "http://www.w3.org/2000/svg",
51078
- viewBox: "0 0 448 512",
51079
- children: /* @__PURE__ */ jsx161("path", {
51080
- fill: "currentColor",
51081
- d: "M438.6 278.6l-160 160C272.4 444.9 264.2 448 256 448s-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L338.8 288H32C14.33 288 .0016 273.7 .0016 256S14.33 224 32 224h306.8l-105.4-105.4c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l160 160C451.1 245.9 451.1 266.1 438.6 278.6z"
51082
- })
51083
- })
51084
- ]
51085
- });
51086
- };
51087
-
51088
- // src/components/homepage/TemplateIcon.tsx
51089
- import { jsx as jsx164, jsxs as jsxs61 } from "react/jsx-runtime";
51090
- var icon8 = {
51091
- display: "flex",
51092
- width: 36,
51093
- height: 36,
51094
- justifyContent: "center",
51095
- alignItems: "center",
51096
- margin: 0
51097
- };
51098
- var outer = {
51099
- textAlign: "center",
51100
- display: "flex",
51101
- alignItems: "center",
51102
- flexDirection: "column",
51103
- color: "var(--ifm-font-color-base)",
51104
- cursor: "pointer",
51105
- filter: "drop-shadow(0px 0px 4px var(--background))",
51106
- textDecoration: "none"
51107
- };
51108
- var TemplateIcon = ({ children, label: label3 }) => {
51109
- const mobileLayout = useMobileLayout();
51110
- return /* @__PURE__ */ jsxs61("span", {
51111
- style: outer,
51112
- children: [
51113
- /* @__PURE__ */ jsx164("div", {
51114
- style: icon8,
51115
- children
51116
- }),
51117
- mobileLayout ? null : /* @__PURE__ */ jsx164("div", {
51118
- className: "text-xs fontbrand",
51119
- children: label3
51120
- })
51121
- ]
51122
- });
51123
- };
51124
-
51125
- // src/components/homepage/ChooseTemplate.tsx
51126
- import { jsx as jsx166, jsxs as jsxs63 } from "react/jsx-runtime";
51127
- var ChooseTemplate = () => {
51128
- return /* @__PURE__ */ jsx166("div", {
51129
- style: {
51130
- display: "flex",
51131
- flexDirection: "column"
51132
- },
51133
- children: /* @__PURE__ */ jsx166("div", {
51134
- style: {
51135
- position: "relative",
51136
- textAlign: "center"
51137
- },
51138
- children: /* @__PURE__ */ jsxs63("div", {
51139
- className: "no-scroll-bar",
51140
- style: {
51141
- display: "inline-flex",
51142
- flexDirection: "row",
51143
- justifyContent: "space-around",
51144
- borderRadius: 50,
51145
- alignItems: "center",
51146
- padding: 8,
51147
- width: "100%",
51148
- maxWidth: "550px"
51149
- },
51150
- children: [
51151
- CreateVideoInternals.FEATURED_TEMPLATES.filter((f) => f.featuredOnHomePage).map((template) => {
51152
- return /* @__PURE__ */ jsx166("a", {
51153
- className: "text-inherit no-underline",
51154
- href: `/templates/${template.cliId}`,
51155
- children: /* @__PURE__ */ jsx166(TemplateIcon, {
51156
- label: template.featuredOnHomePage,
51157
- children: /* @__PURE__ */ jsx166(IconForTemplate, {
51158
- scale: 0.7,
51159
- template
51160
- })
51161
- })
51162
- }, template.cliId);
51163
- }),
51164
- /* @__PURE__ */ jsx166(MoreTemplatesButton, {})
51165
- ]
51166
- })
51167
- })
51168
- });
51169
- };
51170
-
51171
49985
  // src/components/homepage/GetStartedStrip.tsx
51172
- import { useState as useState67 } from "react";
49986
+ import { useState as useState61 } from "react";
51173
49987
 
51174
49988
  // src/components/homepage/GitHubButton.tsx
51175
- import { jsx as jsx167, jsxs as jsxs65 } from "react/jsx-runtime";
49989
+ import { jsx as jsx134, jsxs as jsxs51 } from "react/jsx-runtime";
51176
49990
  var GithubIcon = () => {
51177
- return /* @__PURE__ */ jsx167("svg", {
49991
+ return /* @__PURE__ */ jsx134("svg", {
51178
49992
  viewBox: "0 0 496 512",
51179
49993
  style: { height: 24, marginRight: 8 },
51180
- children: /* @__PURE__ */ jsx167("path", {
49994
+ children: /* @__PURE__ */ jsx134("path", {
51181
49995
  fill: "currentColor",
51182
49996
  d: "M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"
51183
49997
  })
51184
49998
  });
51185
49999
  };
51186
50000
  var GithubButton = () => {
51187
- return /* @__PURE__ */ jsxs65("div", {
50001
+ return /* @__PURE__ */ jsxs51("div", {
51188
50002
  className: "flex flex-row items-center text-base",
51189
50003
  children: [
51190
- /* @__PURE__ */ jsx167(GithubIcon, {}),
50004
+ /* @__PURE__ */ jsx134(GithubIcon, {}),
51191
50005
  " ",
51192
- /* @__PURE__ */ jsx167("span", {
50006
+ /* @__PURE__ */ jsx134("span", {
51193
50007
  children: "GitHub"
51194
50008
  }),
51195
50009
  " ",
51196
- /* @__PURE__ */ jsx167("div", {
50010
+ /* @__PURE__ */ jsx134("div", {
51197
50011
  className: "text-xs inline-block ml-2 leading-none mt-[3px] self-center",
51198
50012
  children: "52k"
51199
50013
  })
@@ -51202,18 +50016,18 @@ var GithubButton = () => {
51202
50016
  };
51203
50017
 
51204
50018
  // src/components/homepage/GetStartedStrip.tsx
51205
- import { jsx as jsx168, jsxs as jsxs66 } from "react/jsx-runtime";
50019
+ import { jsx as jsx136, jsxs as jsxs54 } from "react/jsx-runtime";
51206
50020
  var GetStarted = () => {
51207
- const [clicked, setClicked] = useState67(null);
51208
- return /* @__PURE__ */ jsxs66("div", {
50021
+ const [clicked, setClicked] = useState61(null);
50022
+ return /* @__PURE__ */ jsxs54("div", {
51209
50023
  className: "flex flex-col lg:flex-row items-center justify-center text-center w-full",
51210
50024
  children: [
51211
- /* @__PURE__ */ jsx168("div", {
50025
+ /* @__PURE__ */ jsx136("div", {
51212
50026
  className: "w-full lg:w-auto",
51213
- children: /* @__PURE__ */ jsxs66("div", {
50027
+ children: /* @__PURE__ */ jsxs54("div", {
51214
50028
  className: "flex flex-row w-full relative",
51215
50029
  children: [
51216
- clicked ? /* @__PURE__ */ jsx168("div", {
50030
+ clicked ? /* @__PURE__ */ jsx136("div", {
51217
50031
  style: {
51218
50032
  animation: "click 0.7s linear",
51219
50033
  animationFillMode: "forwards"
@@ -51221,7 +50035,7 @@ var GetStarted = () => {
51221
50035
  className: "absolute z-0 top-[-10px] font-mono text-sm text-center w-full",
51222
50036
  children: "Copied!"
51223
50037
  }, clicked) : null,
51224
- /* @__PURE__ */ jsx168(Button, {
50038
+ /* @__PURE__ */ jsx136(Button, {
51225
50039
  className: "bg-[#333] text-white rounded-lg px-4 font-mono hover:[#444] cursor-pointer w-full",
51226
50040
  onClick: () => {
51227
50041
  navigator.clipboard.writeText("npx create-video@latest");
@@ -51233,39 +50047,39 @@ var GetStarted = () => {
51233
50047
  ]
51234
50048
  })
51235
50049
  }),
51236
- /* @__PURE__ */ jsx168("div", {
50050
+ /* @__PURE__ */ jsx136("div", {
51237
50051
  style: { width: 10, height: 10 }
51238
50052
  }),
51239
- /* @__PURE__ */ jsx168("div", {
50053
+ /* @__PURE__ */ jsx136("div", {
51240
50054
  className: "w-full lg:w-auto",
51241
- children: /* @__PURE__ */ jsx168(Button, {
50055
+ children: /* @__PURE__ */ jsx136(Button, {
51242
50056
  href: "/docs",
51243
50057
  className: "w-full",
51244
50058
  children: "Docs"
51245
50059
  })
51246
50060
  }),
51247
- /* @__PURE__ */ jsx168("div", {
50061
+ /* @__PURE__ */ jsx136("div", {
51248
50062
  className: "w-2 h-2"
51249
50063
  }),
51250
- /* @__PURE__ */ jsx168("div", {
50064
+ /* @__PURE__ */ jsx136("div", {
51251
50065
  className: "w-full lg:w-auto",
51252
- children: /* @__PURE__ */ jsx168(Button, {
50066
+ children: /* @__PURE__ */ jsx136(Button, {
51253
50067
  href: "https://remotion.dev/discord",
51254
50068
  target: "_blank",
51255
50069
  className: "w-full",
51256
50070
  children: "Discord"
51257
50071
  })
51258
50072
  }),
51259
- /* @__PURE__ */ jsx168("div", {
50073
+ /* @__PURE__ */ jsx136("div", {
51260
50074
  className: "w-2 h-2"
51261
50075
  }),
51262
- /* @__PURE__ */ jsx168("div", {
50076
+ /* @__PURE__ */ jsx136("div", {
51263
50077
  className: "w-full lg:w-auto",
51264
- children: /* @__PURE__ */ jsx168(Button, {
50078
+ children: /* @__PURE__ */ jsx136(Button, {
51265
50079
  href: "https://github.com/remotion-dev/remotion",
51266
50080
  target: "_blank",
51267
50081
  className: "w-full",
51268
- children: /* @__PURE__ */ jsx168(GithubButton, {})
50082
+ children: /* @__PURE__ */ jsx136(GithubButton, {})
51269
50083
  })
51270
50084
  })
51271
50085
  ]
@@ -51273,102 +50087,115 @@ var GetStarted = () => {
51273
50087
  };
51274
50088
 
51275
50089
  // src/components/homepage/WriteInReact.tsx
51276
- import { jsx as jsx169, jsxs as jsxs67 } from "react/jsx-runtime";
50090
+ import { jsx as jsx137, jsxs as jsxs56 } from "react/jsx-runtime";
51277
50091
  var WriteInReact = () => {
51278
- return /* @__PURE__ */ jsxs67("div", {
50092
+ return /* @__PURE__ */ jsxs56("div", {
51279
50093
  children: [
51280
- /* @__PURE__ */ jsx169("h1", {
50094
+ /* @__PURE__ */ jsx137("h1", {
51281
50095
  className: "text-4xl sm:text-5xl lg:text-[5em] text-center fontbrand font-black leading-none text-balance",
51282
50096
  style: {
51283
50097
  textShadow: "0 5px 30px var(--background)"
51284
50098
  },
51285
50099
  children: "Make videos programmatically."
51286
50100
  }),
51287
- /* @__PURE__ */ jsxs67("p", {
50101
+ /* @__PURE__ */ jsxs56("p", {
51288
50102
  style: {
51289
50103
  textShadow: "0 5px 30px var(--background)"
51290
50104
  },
51291
50105
  className: "font-medium text-center text-lg",
51292
50106
  children: [
51293
50107
  "Create real MP4 videos with React. ",
51294
- /* @__PURE__ */ jsx169("br", {}),
50108
+ /* @__PURE__ */ jsx137("br", {}),
51295
50109
  "Use coding agents, build apps and render in bulk."
51296
50110
  ]
51297
50111
  }),
51298
- /* @__PURE__ */ jsx169("br", {}),
51299
- /* @__PURE__ */ jsx169("div", {
51300
- children: /* @__PURE__ */ jsx169(GetStarted, {})
50112
+ /* @__PURE__ */ jsx137("br", {}),
50113
+ /* @__PURE__ */ jsx137("div", {
50114
+ children: /* @__PURE__ */ jsx137(GetStarted, {})
51301
50115
  }),
51302
- /* @__PURE__ */ jsx169("br", {}),
51303
- /* @__PURE__ */ jsx169("br", {}),
51304
- /* @__PURE__ */ jsx169(ChooseTemplate, {})
50116
+ /* @__PURE__ */ jsx137("br", {}),
50117
+ /* @__PURE__ */ jsx137("br", {})
51305
50118
  ]
51306
50119
  });
51307
50120
  };
51308
50121
 
51309
50122
  // src/components/Homepage.tsx
51310
- import { jsx as jsx170, jsxs as jsxs68 } from "react/jsx-runtime";
50123
+ import { jsx as jsx138, jsxs as jsxs57 } from "react/jsx-runtime";
51311
50124
  "use client";
50125
+ var makeVideosRowClassName = "mt-4 md:mt-6 flex flex-col lg:flex-row gap-10";
51312
50126
  var NewLanding = ({ colorMode, setColorMode }) => {
51313
- return /* @__PURE__ */ jsx170(ColorModeProvider, {
50127
+ return /* @__PURE__ */ jsx138(ColorModeProvider, {
51314
50128
  colorMode,
51315
50129
  setColorMode,
51316
- children: /* @__PURE__ */ jsx170("div", {
50130
+ children: /* @__PURE__ */ jsx138("div", {
51317
50131
  className: "w-full relative",
51318
- children: /* @__PURE__ */ jsxs68("div", {
50132
+ children: /* @__PURE__ */ jsxs57("div", {
51319
50133
  style: { overflow: "hidden" },
51320
50134
  children: [
51321
- /* @__PURE__ */ jsx170("div", {
51322
- children: /* @__PURE__ */ jsx170(BackgroundAnimation, {})
50135
+ /* @__PURE__ */ jsx138("div", {
50136
+ children: /* @__PURE__ */ jsx138(BackgroundAnimation, {})
51323
50137
  }),
51324
- /* @__PURE__ */ jsx170("br", {}),
51325
- /* @__PURE__ */ jsx170("br", {}),
51326
- /* @__PURE__ */ jsx170("br", {}),
51327
- /* @__PURE__ */ jsx170("br", {}),
51328
- /* @__PURE__ */ jsxs68("div", {
50138
+ /* @__PURE__ */ jsx138("br", {}),
50139
+ /* @__PURE__ */ jsx138("br", {}),
50140
+ /* @__PURE__ */ jsx138("br", {}),
50141
+ /* @__PURE__ */ jsx138("br", {}),
50142
+ /* @__PURE__ */ jsxs57("div", {
51329
50143
  className: "max-w-[500px] lg:max-w-[1000px] m-auto pl-5 pr-5 overflow-x-clip md:overflow-x-visible relative",
51330
50144
  children: [
51331
- /* @__PURE__ */ jsx170(WriteInReact, {}),
51332
- /* @__PURE__ */ jsx170("br", {}),
51333
- /* @__PURE__ */ jsx170(IfYouKnowReact, {}),
51334
- /* @__PURE__ */ jsx170(ParameterizeAndEdit, {}),
51335
- /* @__PURE__ */ jsx170(RealMP4Videos, {}),
51336
- /* @__PURE__ */ jsx170("br", {}),
51337
- /* @__PURE__ */ jsx170("br", {}),
51338
- /* @__PURE__ */ jsx170("br", {}),
51339
- /* @__PURE__ */ jsx170("div", {
50145
+ /* @__PURE__ */ jsx138(WriteInReact, {}),
50146
+ /* @__PURE__ */ jsx138("br", {}),
50147
+ /* @__PURE__ */ jsxs57("div", {
50148
+ className: makeVideosRowClassName,
50149
+ children: [
50150
+ /* @__PURE__ */ jsx138(MakeVideosAgentically, {
50151
+ videoSrc: "/img/homepage-assets-master.webm",
50152
+ fallbackVideoSrc: "/img/homepage-assets-master.mp4"
50153
+ }),
50154
+ /* @__PURE__ */ jsx138(MakeVideosInteractively, {}),
50155
+ /* @__PURE__ */ jsx138(MakeVideosProgrammatically, {
50156
+ links: [
50157
+ { label: "API Docs", href: "/docs/api" },
50158
+ { label: "Resources", href: "/docs/resources" }
50159
+ ]
50160
+ })
50161
+ ]
50162
+ }),
50163
+ /* @__PURE__ */ jsx138("br", {}),
50164
+ /* @__PURE__ */ jsx138("br", {}),
50165
+ /* @__PURE__ */ jsx138("br", {}),
50166
+ /* @__PURE__ */ jsx138("div", {
51340
50167
  className: "pt-6 md:pt-8",
51341
- children: /* @__PURE__ */ jsx170(AutomationsSection_default, {})
50168
+ children: /* @__PURE__ */ jsx138(AutomationsSection_default, {})
51342
50169
  }),
51343
- /* @__PURE__ */ jsx170("br", {}),
51344
- /* @__PURE__ */ jsx170("br", {}),
51345
- /* @__PURE__ */ jsx170(Demo, {}),
51346
- /* @__PURE__ */ jsx170("br", {}),
51347
- /* @__PURE__ */ jsx170("br", {}),
51348
- /* @__PURE__ */ jsx170("br", {}),
51349
- /* @__PURE__ */ jsx170(BuiltWithRemotionShowcase, {}),
51350
- /* @__PURE__ */ jsx170("br", {}),
51351
- /* @__PURE__ */ jsx170("br", {}),
51352
- /* @__PURE__ */ jsx170("br", {}),
51353
- /* @__PURE__ */ jsx170(SectionTitle, {
50170
+ /* @__PURE__ */ jsx138("br", {}),
50171
+ /* @__PURE__ */ jsx138("br", {}),
50172
+ /* @__PURE__ */ jsx138(Demo, {}),
50173
+ /* @__PURE__ */ jsx138("br", {}),
50174
+ /* @__PURE__ */ jsx138("br", {}),
50175
+ /* @__PURE__ */ jsx138("br", {}),
50176
+ /* @__PURE__ */ jsx138(BuiltWithRemotionShowcase, {}),
50177
+ /* @__PURE__ */ jsx138("br", {}),
50178
+ /* @__PURE__ */ jsx138("br", {}),
50179
+ /* @__PURE__ */ jsx138("br", {}),
50180
+ /* @__PURE__ */ jsx138(SectionTitle, {
51354
50181
  children: "Pricing"
51355
50182
  }),
51356
- /* @__PURE__ */ jsx170(Pricing, {}),
51357
- /* @__PURE__ */ jsx170(TrustedByBanner_default, {}),
51358
- /* @__PURE__ */ jsx170("br", {}),
51359
- /* @__PURE__ */ jsx170(EvaluateRemotion_default, {}),
51360
- /* @__PURE__ */ jsx170("br", {}),
51361
- /* @__PURE__ */ jsx170("br", {}),
51362
- /* @__PURE__ */ jsx170("br", {}),
51363
- /* @__PURE__ */ jsx170(CommunityStats_default, {}),
51364
- /* @__PURE__ */ jsx170("br", {}),
51365
- /* @__PURE__ */ jsx170("br", {}),
51366
- /* @__PURE__ */ jsx170("br", {}),
51367
- /* @__PURE__ */ jsx170("br", {}),
51368
- /* @__PURE__ */ jsx170(NewsletterButton, {}),
51369
- /* @__PURE__ */ jsx170("br", {}),
51370
- /* @__PURE__ */ jsx170("br", {}),
51371
- /* @__PURE__ */ jsx170("br", {})
50183
+ /* @__PURE__ */ jsx138(Pricing, {}),
50184
+ /* @__PURE__ */ jsx138(TrustedByBanner_default, {}),
50185
+ /* @__PURE__ */ jsx138("br", {}),
50186
+ /* @__PURE__ */ jsx138(EvaluateRemotion_default, {}),
50187
+ /* @__PURE__ */ jsx138("br", {}),
50188
+ /* @__PURE__ */ jsx138("br", {}),
50189
+ /* @__PURE__ */ jsx138("br", {}),
50190
+ /* @__PURE__ */ jsx138(CommunityStats_default, {}),
50191
+ /* @__PURE__ */ jsx138("br", {}),
50192
+ /* @__PURE__ */ jsx138("br", {}),
50193
+ /* @__PURE__ */ jsx138("br", {}),
50194
+ /* @__PURE__ */ jsx138("br", {}),
50195
+ /* @__PURE__ */ jsx138(NewsletterButton, {}),
50196
+ /* @__PURE__ */ jsx138("br", {}),
50197
+ /* @__PURE__ */ jsx138("br", {}),
50198
+ /* @__PURE__ */ jsx138("br", {})
51372
50199
  ]
51373
50200
  })
51374
50201
  ]