@remotion/promo-pages 4.0.487 → 4.0.488

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/Homepage.js +246 -196
  2. package/dist/components/Homepage.js +21 -5
  3. package/dist/components/homepage/CanvasSectionTitle.d.ts +4 -0
  4. package/dist/components/homepage/CanvasSectionTitle.js +14 -0
  5. package/dist/components/homepage/CommunityStatsItems.js +2 -2
  6. package/dist/components/homepage/Demo/DemoRender.d.ts +1 -1
  7. package/dist/components/homepage/Demo/DisplayedEmoji.js +3 -5
  8. package/dist/components/homepage/Demo/math.d.ts +1 -1
  9. package/dist/components/homepage/EditorStarterSection.d.ts +3 -0
  10. package/dist/components/homepage/EditorStarterSection.js +8 -0
  11. package/dist/components/homepage/GitHubButton.js +1 -1
  12. package/dist/components/homepage/MakeVideosAgentically.d.ts +10 -0
  13. package/dist/components/homepage/MakeVideosAgentically.js +37 -0
  14. package/dist/components/homepage/MakeVideosInteractively.d.ts +9 -0
  15. package/dist/components/homepage/MakeVideosInteractively.js +16 -0
  16. package/dist/components/homepage/MakeVideosLinks.d.ts +9 -0
  17. package/dist/components/homepage/MakeVideosLinks.js +17 -0
  18. package/dist/components/homepage/MakeVideosProgrammatically.d.ts +9 -0
  19. package/dist/components/homepage/MakeVideosProgrammatically.js +8 -0
  20. package/dist/components/homepage/Pricing.d.ts +1 -3
  21. package/dist/components/homepage/Pricing.js +2 -6
  22. package/dist/components/homepage/WriteInReact.js +1 -2
  23. package/dist/components/team/TrustSection.js +1 -1
  24. package/dist/design.js +89 -55
  25. package/dist/experts.js +78 -44
  26. package/dist/homepage/Pricing.js +80 -46
  27. package/dist/prompts/PromptsGallery.js +89 -55
  28. package/dist/prompts/PromptsShow.js +95 -61
  29. package/dist/prompts/PromptsSubmit.js +80 -46
  30. package/dist/team.js +80 -46
  31. package/dist/template-modal-content.js +86 -52
  32. package/dist/templates.js +80 -46
  33. package/package.json +17 -17
package/dist/Homepage.js CHANGED
@@ -1100,7 +1100,13 @@ import {
1100
1100
  import { jsx as jsx26 } from "react/jsx-runtime";
1101
1101
  import { forwardRef as forwardRef11, useCallback as useCallback18, useState as useState17 } from "react";
1102
1102
  import { jsx as jsx27 } from "react/jsx-runtime";
1103
- import { useCallback as useCallback19, useContext as useContext33, useLayoutEffect as useLayoutEffect11, useRef as useRef24 } from "react";
1103
+ import {
1104
+ useCallback as useCallback19,
1105
+ useContext as useContext33,
1106
+ useLayoutEffect as useLayoutEffect11,
1107
+ useRef as useRef24,
1108
+ useState as useState18
1109
+ } from "react";
1104
1110
  import { jsx as jsx28 } from "react/jsx-runtime";
1105
1111
  import React29, { forwardRef as forwardRef12, useCallback as useCallback20, useRef as useRef25 } from "react";
1106
1112
  import { jsx as jsx29 } from "react/jsx-runtime";
@@ -1111,7 +1117,7 @@ import {
1111
1117
  useImperativeHandle as useImperativeHandle8,
1112
1118
  useMemo as useMemo32,
1113
1119
  useRef as useRef26,
1114
- useState as useState18
1120
+ useState as useState19
1115
1121
  } from "react";
1116
1122
  import { jsx as jsx30 } from "react/jsx-runtime";
1117
1123
  import React31 from "react";
@@ -1129,7 +1135,7 @@ import {
1129
1135
  useEffect as useEffect17,
1130
1136
  useLayoutEffect as useLayoutEffect12,
1131
1137
  useMemo as useMemo35,
1132
- useState as useState19
1138
+ useState as useState20
1133
1139
  } from "react";
1134
1140
  import { jsx as jsx33 } from "react/jsx-runtime";
1135
1141
  import React37, {
@@ -1140,7 +1146,7 @@ import React37, {
1140
1146
  useImperativeHandle as useImperativeHandle9,
1141
1147
  useMemo as useMemo36,
1142
1148
  useRef as useRef27,
1143
- useState as useState20
1149
+ useState as useState21
1144
1150
  } from "react";
1145
1151
  import { useEffect as useEffect18 } from "react";
1146
1152
  import { jsx as jsx34 } from "react/jsx-runtime";
@@ -2335,7 +2341,7 @@ var getComponentsToAddStacksTo = () => componentsToAddStacksTo;
2335
2341
  var addSequenceStackTraces = (component) => {
2336
2342
  componentsToAddStacksTo.push(component);
2337
2343
  };
2338
- var VERSION = "4.0.487";
2344
+ var VERSION = "4.0.488";
2339
2345
  var checkMultipleRemotionVersions = () => {
2340
2346
  if (typeof globalThis === "undefined") {
2341
2347
  return;
@@ -6019,7 +6025,7 @@ var useEffectChainState = () => {
6019
6025
  }
6020
6026
  }), []);
6021
6027
  };
6022
- var CanvasRefForwardingFunction = ({ width, height, fit, className, style, effects }, ref) => {
6028
+ var CanvasRefForwardingFunction = ({ width, height, fit, className, style, effects, ...props }, ref) => {
6023
6029
  const canvasRef = useRef8(null);
6024
6030
  const chainState = useEffectChainState();
6025
6031
  const sourceCanvas = useMemo16(() => {
@@ -6083,7 +6089,8 @@ var CanvasRefForwardingFunction = ({ width, height, fit, className, style, effec
6083
6089
  return /* @__PURE__ */ jsx13("canvas", {
6084
6090
  ref: canvasRef,
6085
6091
  className,
6086
- style
6092
+ style,
6093
+ ...props
6087
6094
  });
6088
6095
  };
6089
6096
  var Canvas = React15.forwardRef(CanvasRefForwardingFunction);
@@ -6260,6 +6267,16 @@ var animatedImageSchema = {
6260
6267
  },
6261
6268
  ...transformSchema
6262
6269
  };
6270
+ var getCanvasPropsFromSequenceProps = (props) => {
6271
+ const canvasProps = {};
6272
+ const mutableCanvasProps = canvasProps;
6273
+ for (const key in props) {
6274
+ if (Object.prototype.hasOwnProperty.call(props, key) && (key.startsWith("data-") || key.startsWith("aria-"))) {
6275
+ mutableCanvasProps[key] = props[key];
6276
+ }
6277
+ }
6278
+ return canvasProps;
6279
+ };
6263
6280
  var AnimatedImageContent = forwardRef4(({
6264
6281
  src,
6265
6282
  width,
@@ -6414,6 +6431,7 @@ var AnimatedImageInner = ({
6414
6431
  useImperativeHandle2(ref, () => {
6415
6432
  return actualRef.current;
6416
6433
  }, []);
6434
+ const canvasProps = getCanvasPropsFromSequenceProps(sequenceProps);
6417
6435
  const animatedImageProps = {
6418
6436
  src,
6419
6437
  width,
@@ -6425,7 +6443,8 @@ var AnimatedImageInner = ({
6425
6443
  id,
6426
6444
  className,
6427
6445
  style,
6428
- requestInit
6446
+ requestInit,
6447
+ ...canvasProps
6429
6448
  };
6430
6449
  return /* @__PURE__ */ jsx14(Sequence, {
6431
6450
  layout: "none",
@@ -7362,6 +7381,7 @@ var SharedAudioContextProvider = ({ children, audioLatencyHint, audioEnabled, pr
7362
7381
  return ({
7363
7382
  node,
7364
7383
  mediaTimestamp,
7384
+ sourceOffset,
7365
7385
  scheduledTime,
7366
7386
  duration,
7367
7387
  offset,
@@ -7390,7 +7410,7 @@ var SharedAudioContextProvider = ({ children, audioLatencyHint, audioEnabled, pr
7390
7410
  }
7391
7411
  }
7392
7412
  const scheduledEndTime = scheduledTime + duration / node.playbackRate.value;
7393
- const mediaTime = mediaTimestamp + offset;
7413
+ const mediaTime = mediaTimestamp + offset - sourceOffset;
7394
7414
  const mediaEndTime = mediaTime + duration;
7395
7415
  const latency = ctxAndGain.audioContext.baseLatency + ctxAndGain.audioContext.outputLatency;
7396
7416
  const timeDiff = scheduledTime - ctxAndGain.audioContext.currentTime;
@@ -10187,13 +10207,18 @@ var CanvasImageContent = forwardRef10(({
10187
10207
  });
10188
10208
  const sequenceContext = useContext32(SequenceContext);
10189
10209
  const pendingLoadDelayRef = useRef23(null);
10190
- const continuePendingLoadDelay = useCallback17(() => {
10210
+ const [isLoadPending, setIsLoadPending] = useState16(false);
10211
+ const isPremounting = Boolean(sequenceContext?.premounting);
10212
+ const isPostmounting = Boolean(sequenceContext?.postmounting);
10213
+ const continuePendingLoadDelay = useCallback17(({ markAsReady }) => {
10191
10214
  const pending = pendingLoadDelayRef.current;
10192
10215
  if (!pending || pending.continued) {
10193
10216
  return;
10194
10217
  }
10195
10218
  pending.continued = true;
10196
- pending.unblock();
10219
+ if (markAsReady) {
10220
+ setIsLoadPending(false);
10221
+ }
10197
10222
  continueRender2(pending.handle);
10198
10223
  pendingLoadDelayRef.current = null;
10199
10224
  }, [continueRender2]);
@@ -10215,23 +10240,30 @@ var CanvasImageContent = forwardRef10(({
10215
10240
  }
10216
10241
  }, [ref, refForOutline]);
10217
10242
  useLayoutEffect10(() => {
10218
- const isPremounting = Boolean(sequenceContext?.premounting);
10219
- const isPostmounting = Boolean(sequenceContext?.postmounting);
10243
+ if (!pauseWhenLoading || !isLoadPending || isPremounting || isPostmounting) {
10244
+ return;
10245
+ }
10246
+ return delayPlayback().unblock;
10247
+ }, [
10248
+ delayPlayback,
10249
+ isLoadPending,
10250
+ isPostmounting,
10251
+ isPremounting,
10252
+ pauseWhenLoading
10253
+ ]);
10254
+ useLayoutEffect10(() => {
10220
10255
  const handle = delayRender2(`Rendering <CanvasImage> with src="${truncateSrcForLabel(actualSrc)}"`, {
10221
10256
  retries: delayRenderRetries ?? undefined,
10222
10257
  timeoutInMilliseconds: delayRenderTimeoutInMilliseconds ?? undefined
10223
10258
  });
10224
- const unblock = pauseWhenLoading && !isPremounting && !isPostmounting ? delayPlayback().unblock : () => {
10225
- return;
10226
- };
10227
10259
  const controller = new AbortController;
10228
10260
  let cancelled = false;
10229
10261
  let errorCount = 0;
10230
10262
  let timeoutId = null;
10231
10263
  setLoadedImage(null);
10264
+ setIsLoadPending(true);
10232
10265
  pendingLoadDelayRef.current = {
10233
10266
  handle,
10234
- unblock,
10235
10267
  continued: false
10236
10268
  };
10237
10269
  const attemptLoad = () => {
@@ -10242,7 +10274,7 @@ var CanvasImageContent = forwardRef10(({
10242
10274
  setLoadedImage(image);
10243
10275
  }).catch((err) => {
10244
10276
  if (err.name === "AbortError") {
10245
- continuePendingLoadDelay();
10277
+ continuePendingLoadDelay({ markAsReady: false });
10246
10278
  return;
10247
10279
  }
10248
10280
  errorCount++;
@@ -10256,7 +10288,7 @@ var CanvasImageContent = forwardRef10(({
10256
10288
  }, backoff);
10257
10289
  } else if (onError) {
10258
10290
  onError(err);
10259
- continuePendingLoadDelay();
10291
+ continuePendingLoadDelay({ markAsReady: true });
10260
10292
  } else {
10261
10293
  cancelRender2(err);
10262
10294
  }
@@ -10269,21 +10301,17 @@ var CanvasImageContent = forwardRef10(({
10269
10301
  clearTimeout(timeoutId);
10270
10302
  }
10271
10303
  controller.abort();
10272
- continuePendingLoadDelay();
10304
+ continuePendingLoadDelay({ markAsReady: false });
10273
10305
  };
10274
10306
  }, [
10275
10307
  actualSrc,
10276
10308
  cancelRender2,
10277
10309
  continuePendingLoadDelay,
10278
- delayPlayback,
10279
10310
  delayRender2,
10280
10311
  delayRenderRetries,
10281
10312
  delayRenderTimeoutInMilliseconds,
10282
10313
  maxRetries,
10283
- onError,
10284
- pauseWhenLoading,
10285
- sequenceContext?.postmounting,
10286
- sequenceContext?.premounting
10314
+ onError
10287
10315
  ]);
10288
10316
  useLayoutEffect10(() => {
10289
10317
  if (!loadedImage || !outputCanvas || !sourceCanvas) {
@@ -10335,7 +10363,7 @@ var CanvasImageContent = forwardRef10(({
10335
10363
  return;
10336
10364
  }
10337
10365
  continueRenderOnce();
10338
- continuePendingLoadDelay();
10366
+ continuePendingLoadDelay({ markAsReady: true });
10339
10367
  }
10340
10368
  });
10341
10369
  }
@@ -10346,7 +10374,7 @@ var CanvasImageContent = forwardRef10(({
10346
10374
  if (onError) {
10347
10375
  onError(err);
10348
10376
  continueRenderOnce();
10349
- continuePendingLoadDelay();
10377
+ continuePendingLoadDelay({ markAsReady: true });
10350
10378
  } else {
10351
10379
  cancelRender2(err);
10352
10380
  }
@@ -10517,6 +10545,7 @@ var ImgContent = ({
10517
10545
  const errors = useRef24({});
10518
10546
  const { delayPlayback } = useBufferState();
10519
10547
  const sequenceContext = useContext33(SequenceContext);
10548
+ const [isLoading, setIsLoading] = useState18(false);
10520
10549
  const _propsValid = true;
10521
10550
  if (!_propsValid) {
10522
10551
  throw new Error("typecheck error");
@@ -10549,6 +10578,8 @@ var ImgContent = ({
10549
10578
  }, timeout);
10550
10579
  }, []);
10551
10580
  const { delayRender: delayRender2, continueRender: continueRender2, cancelRender: cancelRender2 } = useDelayRender();
10581
+ const isPremounting = Boolean(sequenceContext?.premounting);
10582
+ const isPostmounting = Boolean(sequenceContext?.postmounting);
10552
10583
  const didGetError = useCallback19((e) => {
10553
10584
  if (!errors.current) {
10554
10585
  return;
@@ -10569,8 +10600,18 @@ var ImgContent = ({
10569
10600
  } catch {}
10570
10601
  }, [cancelRender2, maxRetries, onError, retryIn]);
10571
10602
  if (typeof window !== "undefined") {
10572
- const isPremounting = Boolean(sequenceContext?.premounting);
10573
- const isPostmounting = Boolean(sequenceContext?.postmounting);
10603
+ useLayoutEffect11(() => {
10604
+ if (!pauseWhenLoading || !isLoading || isPremounting || isPostmounting) {
10605
+ return;
10606
+ }
10607
+ return delayPlayback().unblock;
10608
+ }, [
10609
+ delayPlayback,
10610
+ isLoading,
10611
+ isPostmounting,
10612
+ isPremounting,
10613
+ pauseWhenLoading
10614
+ ]);
10574
10615
  useLayoutEffect11(() => {
10575
10616
  if (window.process?.env?.NODE_ENV === "test") {
10576
10617
  if (imageRef.current) {
@@ -10582,13 +10623,11 @@ var ImgContent = ({
10582
10623
  if (!current) {
10583
10624
  return;
10584
10625
  }
10626
+ setIsLoading(true);
10585
10627
  const newHandle = delayRender2("Loading <Img> with src=" + truncateSrcForLabel(actualSrc), {
10586
10628
  retries: delayRenderRetries ?? undefined,
10587
10629
  timeoutInMilliseconds: delayRenderTimeoutInMilliseconds ?? undefined
10588
10630
  });
10589
- const unblock = pauseWhenLoading && !isPremounting && !isPostmounting ? delayPlayback().unblock : () => {
10590
- return;
10591
- };
10592
10631
  let unmounted = false;
10593
10632
  const onComplete = () => {
10594
10633
  if (unmounted) {
@@ -10602,7 +10641,7 @@ var ImgContent = ({
10602
10641
  if (current) {
10603
10642
  onImageFrame?.(current);
10604
10643
  }
10605
- unblock();
10644
+ setIsLoading(false);
10606
10645
  continueRender2(newHandle);
10607
10646
  };
10608
10647
  if (!imageRef.current) {
@@ -10621,17 +10660,12 @@ var ImgContent = ({
10621
10660
  return () => {
10622
10661
  unmounted = true;
10623
10662
  current.removeEventListener("load", onComplete);
10624
- unblock();
10625
10663
  continueRender2(newHandle);
10626
10664
  };
10627
10665
  }, [
10628
10666
  actualSrc,
10629
- delayPlayback,
10630
10667
  delayRenderRetries,
10631
10668
  delayRenderTimeoutInMilliseconds,
10632
- pauseWhenLoading,
10633
- isPremounting,
10634
- isPostmounting,
10635
10669
  onImageFrame,
10636
10670
  continueRender2,
10637
10671
  delayRender2
@@ -10949,9 +10983,9 @@ var CompositionManagerProvider = ({
10949
10983
  initialCompositions,
10950
10984
  initialCanvasContent
10951
10985
  }) => {
10952
- const [folders, setFolders] = useState18([]);
10953
- const [canvasContent, setCanvasContent] = useState18(initialCanvasContent);
10954
- const [compositions, setCompositions] = useState18(initialCompositions);
10986
+ const [folders, setFolders] = useState19([]);
10987
+ const [canvasContent, setCanvasContent] = useState19(initialCanvasContent);
10988
+ const [compositions, setCompositions] = useState19(initialCompositions);
10955
10989
  const currentcompositionsRef = useRef26(compositions);
10956
10990
  const updateCompositions = useCallback21((updateComps) => {
10957
10991
  setCompositions((comps) => {
@@ -11522,7 +11556,7 @@ var OffthreadVideoForRendering = ({
11522
11556
  toneMapped
11523
11557
  });
11524
11558
  }, [toneMapped, currentTime, src, transparent]);
11525
- const [imageSrc, setImageSrc] = useState19(null);
11559
+ const [imageSrc, setImageSrc] = useState20(null);
11526
11560
  const { delayRender: delayRender2, continueRender: continueRender2 } = useDelayRender();
11527
11561
  useLayoutEffect12(() => {
11528
11562
  if (!window.remotion_videoEnabled) {
@@ -11726,7 +11760,7 @@ var VideoForDevelopmentRefForwardingFunction = (props2, ref) => {
11726
11760
  const parentSequence = useContext37(SequenceContext);
11727
11761
  const logLevel = useLogLevel();
11728
11762
  const mountTime = useMountTime();
11729
- const [timelineId] = useState20(() => String(Math.random()));
11763
+ const [timelineId] = useState21(() => String(Math.random()));
11730
11764
  if (typeof acceptableTimeShift !== "undefined") {
11731
11765
  throw new Error("acceptableTimeShift has been removed. Use acceptableTimeShiftInSeconds instead.");
11732
11766
  }
@@ -11797,7 +11831,7 @@ var VideoForDevelopmentRefForwardingFunction = (props2, ref) => {
11797
11831
  useImperativeHandle9(ref, () => {
11798
11832
  return videoRef.current;
11799
11833
  }, []);
11800
- useState20(() => playbackLogging({
11834
+ useState21(() => playbackLogging({
11801
11835
  logLevel,
11802
11836
  message: `Mounting video with source = ${actualSrc}, v=${VERSION}, user agent=${typeof navigator === "undefined" ? "server" : navigator.userAgent}`,
11803
11837
  tag: "video",
@@ -14750,7 +14784,7 @@ var getDefaultConfig = () => {
14750
14784
  var twMerge = /* @__PURE__ */ createTailwindMerge(getDefaultConfig);
14751
14785
 
14752
14786
  // ../design/dist/esm/index.mjs
14753
- import React32, { useEffect as useEffect21, useMemo as useMemo43, useState as useState21 } from "react";
14787
+ import React32, { useEffect as useEffect21, useMemo as useMemo43, useState as useState23 } from "react";
14754
14788
 
14755
14789
  // ../paths/dist/esm/index.mjs
14756
14790
  var cutLInstruction = ({
@@ -20841,7 +20875,7 @@ var getAngle = (ref, coordinates) => {
20841
20875
  };
20842
20876
  var lastCoordinates = null;
20843
20877
  var useMousePosition = (ref) => {
20844
- const [angle, setAngle] = useState21(getAngle(ref.current, lastCoordinates));
20878
+ const [angle, setAngle] = useState23(getAngle(ref.current, lastCoordinates));
20845
20879
  useEffect21(() => {
20846
20880
  const element = ref.current;
20847
20881
  if (!element) {
@@ -29864,14 +29898,14 @@ import { createContext as createContext32 } from "react";
29864
29898
  import { jsx as jsx59, jsxs as jsxs14 } from "react/jsx-runtime";
29865
29899
  import { jsx as jsx214, jsxs as jsxs24, Fragment as Fragment12 } from "react/jsx-runtime";
29866
29900
  import React57 from "react";
29867
- import { useContext as useContext210, useEffect as useEffect41, useState as useState38 } from "react";
29901
+ import { useContext as useContext210, useEffect as useEffect41, useState as useState40 } from "react";
29868
29902
  import { useContext as useContext46, useLayoutEffect as useLayoutEffect18 } from "react";
29869
29903
  import { jsx as jsx314 } from "react/jsx-runtime";
29870
- import { useEffect as useEffect210, useState as useState210 } from "react";
29904
+ import { useEffect as useEffect210, useState as useState24 } from "react";
29871
29905
  import { useLayoutEffect as useLayoutEffect23 } from "react";
29872
29906
  import { useContext as useContext47, useEffect as useEffect52, useRef as useRef47 } from "react";
29873
29907
  import { useEffect as useEffect310, useRef as useRef212 } from "react";
29874
- import { useCallback as useCallback39, useContext as useContext310, useMemo as useMemo54, useRef as useRef48, useState as useState39 } from "react";
29908
+ import { useCallback as useCallback39, useContext as useContext310, useMemo as useMemo54, useRef as useRef48, useState as useState310 } from "react";
29875
29909
  import { useEffect as useEffect42, useRef as useRef310 } from "react";
29876
29910
  import { useCallback as useCallback210, useEffect as useEffect62, useMemo as useMemo212, useState as useState42 } from "react";
29877
29911
  import {
@@ -31858,7 +31892,7 @@ var useBufferStateEmitter = (emitter) => {
31858
31892
  }, [bufferManager, emitter]);
31859
31893
  };
31860
31894
  var PlayerEmitterProvider = ({ children, currentPlaybackRate }) => {
31861
- const [emitter] = useState38(() => new PlayerEmitter);
31895
+ const [emitter] = useState40(() => new PlayerEmitter);
31862
31896
  const bufferManager = useContext210(Internals.BufferingContextReact);
31863
31897
  if (!bufferManager) {
31864
31898
  throw new Error("BufferingContextReact not found");
@@ -31875,7 +31909,7 @@ var PlayerEmitterProvider = ({ children, currentPlaybackRate }) => {
31875
31909
  });
31876
31910
  };
31877
31911
  var useHoverState = (ref, hideControlsWhenPointerDoesntMove) => {
31878
- const [hovered, setHovered] = useState210(false);
31912
+ const [hovered, setHovered] = useState24(false);
31879
31913
  useEffect210(() => {
31880
31914
  const { current } = ref;
31881
31915
  if (!current) {
@@ -31916,7 +31950,7 @@ var useHoverState = (ref, hideControlsWhenPointerDoesntMove) => {
31916
31950
  };
31917
31951
  var usePlayer = () => {
31918
31952
  const [playing, setPlaying, imperativePlaying] = Internals.Timeline.usePlayingState();
31919
- const [hasPlayed, setHasPlayed] = useState39(false);
31953
+ const [hasPlayed, setHasPlayed] = useState310(false);
31920
31954
  const frame = Internals.Timeline.useTimelinePosition();
31921
31955
  const playStart = useRef48(frame);
31922
31956
  const setFrame = Internals.Timeline.useTimelineSetFrame();
@@ -35767,8 +35801,8 @@ function useColorMode() {
35767
35801
  }
35768
35802
 
35769
35803
  // ../media/dist/esm/index.mjs
35770
- import { useMemo as useMemo312, useState as useState311 } from "react";
35771
- import { useContext as useContext212, useEffect as useEffect43, useMemo as useMemo58, useRef as useRef50, useState as useState40 } from "react";
35804
+ import { useMemo as useMemo312, useState as useState312 } from "react";
35805
+ import { useContext as useContext212, useEffect as useEffect43, useMemo as useMemo58, useRef as useRef50, useState as useState41 } from "react";
35772
35806
  import { ALL_FORMATS, Input as Input2, UrlSource } from "mediabunny";
35773
35807
  import {
35774
35808
  AudioBufferSink,
@@ -35777,7 +35811,7 @@ import {
35777
35811
  import { CanvasSink } from "mediabunny";
35778
35812
  import { useContext as useContext50, useLayoutEffect as useLayoutEffect19 } from "react";
35779
35813
  import { jsx as jsx61 } from "react/jsx-runtime";
35780
- import { useContext as useContext312, useLayoutEffect as useLayoutEffect24, useMemo as useMemo213, useState as useState212 } from "react";
35814
+ import { useContext as useContext312, useLayoutEffect as useLayoutEffect24, useMemo as useMemo213, useState as useState210 } from "react";
35781
35815
  import React211 from "react";
35782
35816
  import {
35783
35817
  ALL_FORMATS as ALL_FORMATS2,
@@ -35921,94 +35955,20 @@ var calculateEndTime = ({
35921
35955
  }) / fps;
35922
35956
  return mediaDuration + (trimBefore ?? 0) / fps;
35923
35957
  };
35924
- var AUDIO_PRIMING_SECONDS = 0.5;
35925
- async function* makeIteratorWithPrimingInner(audioSink, timeToSeek, maximumTimestamp) {
35926
- const primingStart = Math.max(0, timeToSeek - AUDIO_PRIMING_SECONDS);
35927
- const iterator = audioSink.buffers(primingStart, maximumTimestamp);
35928
- for await (const buffer of iterator) {
35929
- if (buffer.timestamp + buffer.duration <= timeToSeek) {
35930
- continue;
35931
- }
35932
- yield {
35933
- buffer,
35934
- timestamp: buffer.timestamp
35935
- };
35936
- }
35937
- }
35938
- async function* makeLoopingIterator({
35939
- audioSink,
35940
- segmentStartInSeconds,
35941
- segmentEndInSeconds,
35942
- playbackRate,
35943
- sequenceDurationInSeconds
35944
- }) {
35945
- const duration = segmentEndInSeconds - segmentStartInSeconds;
35946
- let iteration = 0;
35947
- let broken = false;
35948
- while (true) {
35949
- for await (const item of makeIteratorWithPrimingInner(audioSink, segmentStartInSeconds, segmentEndInSeconds)) {
35950
- const timestamp = item.timestamp + iteration * duration;
35951
- const endTimestamp = duration * iteration + (item.timestamp - segmentStartInSeconds + item.buffer.duration);
35952
- if (endTimestamp > sequenceDurationInSeconds * playbackRate) {
35953
- broken = true;
35954
- break;
35955
- }
35956
- yield {
35957
- buffer: item.buffer,
35958
- timestamp
35959
- };
35960
- }
35961
- if (broken) {
35962
- break;
35963
- }
35964
- iteration++;
35965
- }
35966
- }
35967
- var makeIteratorWithPriming = ({
35968
- audioSink,
35969
- timeToSeek,
35970
- maximumTimestamp,
35971
- loop,
35972
- playbackRate,
35973
- sequenceDurationInSeconds
35974
- }) => {
35975
- if (loop) {
35976
- return makeLoopingIterator({
35977
- audioSink,
35978
- segmentStartInSeconds: timeToSeek,
35979
- segmentEndInSeconds: maximumTimestamp,
35980
- playbackRate,
35981
- sequenceDurationInSeconds
35982
- });
35983
- }
35984
- return makeIteratorWithPrimingInner(audioSink, timeToSeek, maximumTimestamp);
35985
- };
35986
35958
  var ALLOWED_GLOBAL_TIME_ANCHOR_SHIFT2 = 0.1;
35987
35959
  var makeAudioIterator = ({
35988
35960
  startFromSecond,
35989
- maximumTimestamp,
35990
- audioSink,
35991
- loop,
35992
- playbackRate,
35993
- sequenceDurationInSeconds,
35961
+ iterator,
35994
35962
  unscheduleAudioNode
35995
35963
  }) => {
35996
35964
  let destroyed = false;
35997
- const iterator = makeIteratorWithPriming({
35998
- audioSink,
35999
- timeToSeek: startFromSecond,
36000
- maximumTimestamp,
36001
- loop,
36002
- playbackRate,
36003
- sequenceDurationInSeconds
36004
- });
36005
35965
  const queuedAudioNodes = [];
36006
35966
  let mostRecentTimestamp = -Infinity;
36007
35967
  const cleanupAudioQueue = () => {
36008
- for (const node of queuedAudioNodes) {
36009
- unscheduleAudioNode(node.node);
35968
+ for (const { node } of queuedAudioNodes) {
35969
+ unscheduleAudioNode(node);
36010
35970
  try {
36011
- node.node.stop();
35971
+ node.stop();
36012
35972
  } catch {}
36013
35973
  }
36014
35974
  queuedAudioNodes.length = 0;
@@ -36016,7 +35976,7 @@ var makeAudioIterator = ({
36016
35976
  const getNextFn = async () => {
36017
35977
  const next = await iterator.next();
36018
35978
  if (next.value) {
36019
- mostRecentTimestamp = Math.max(mostRecentTimestamp, next.value.timestamp + next.value.buffer.duration);
35979
+ mostRecentTimestamp = Math.max(mostRecentTimestamp, next.value.timelineTimestamp + next.value.sourceDurationInSeconds);
36020
35980
  }
36021
35981
  return next;
36022
35982
  };
@@ -36032,21 +35992,8 @@ var makeAudioIterator = ({
36032
35992
  isDestroyed: () => {
36033
35993
  return destroyed;
36034
35994
  },
36035
- addQueuedAudioNode: ({
36036
- node,
36037
- timestamp,
36038
- buffer,
36039
- scheduledTime,
36040
- scheduledAtAnchor
36041
- }) => {
36042
- queuedAudioNodes.push({
36043
- node,
36044
- timestamp,
36045
- buffer,
36046
- scheduledTime,
36047
- playbackRate,
36048
- scheduledAtAnchor
36049
- });
35995
+ addQueuedAudioNode: (queuedNode) => {
35996
+ queuedAudioNodes.push(queuedNode);
36050
35997
  },
36051
35998
  guessNextTimestamp: () => {
36052
35999
  return !Number.isFinite(mostRecentTimestamp) ? startFromSecond : mostRecentTimestamp;
@@ -36055,7 +36002,7 @@ var makeAudioIterator = ({
36055
36002
  let until = -Infinity;
36056
36003
  let from = Infinity;
36057
36004
  for (const node of queuedAudioNodes) {
36058
- until = Math.max(until, node.timestamp + node.buffer.duration);
36005
+ until = Math.max(until, node.timestamp + node.sourceDurationInSeconds);
36059
36006
  from = Math.min(from, node.timestamp);
36060
36007
  }
36061
36008
  if (!Number.isFinite(from) || !Number.isFinite(until)) {
@@ -36088,27 +36035,23 @@ var getScheduledTime = ({
36088
36035
  return scheduledTime;
36089
36036
  };
36090
36037
  var getDurationOfNode = ({
36091
- bufferDuration,
36092
- loopSegmentMediaEndTimestamp,
36093
- offset: offset4,
36094
- originalUnloopedMediaTimestamp
36038
+ sourceDurationInSeconds,
36039
+ sourceOffsetInSeconds,
36040
+ offset: offset4
36095
36041
  }) => {
36096
- const originalUnloopedMediaEndTime = originalUnloopedMediaTimestamp + bufferDuration;
36097
- const needsTrimEnd = originalUnloopedMediaEndTime > loopSegmentMediaEndTimestamp;
36098
- const durationMinusOffset = bufferDuration - offset4;
36099
- const duration = needsTrimEnd ? durationMinusOffset - Math.max(0, originalUnloopedMediaEndTime - loopSegmentMediaEndTimestamp) : durationMinusOffset;
36100
- return duration;
36042
+ return Math.max(0, sourceDurationInSeconds - (offset4 - sourceOffsetInSeconds));
36101
36043
  };
36102
36044
  var getTrimStartForAudioNode = ({
36103
36045
  mediaTimestamp,
36104
36046
  targetTime,
36105
36047
  sequenceStartTime,
36106
- combinedPlaybackRate
36048
+ combinedPlaybackRate,
36049
+ sourceStartOffsetInSeconds
36107
36050
  }) => {
36108
36051
  const needsTrimStart = mediaTimestamp < sequenceStartTime;
36109
36052
  const offsetBecauseOfTrim = needsTrimStart ? sequenceStartTime - mediaTimestamp : 0;
36110
36053
  const offsetBecauseOfTooLate = targetTime < 0 ? -targetTime * combinedPlaybackRate : 0;
36111
- return offsetBecauseOfTrim + offsetBecauseOfTooLate;
36054
+ return sourceStartOffsetInSeconds + offsetBecauseOfTrim + offsetBecauseOfTooLate;
36112
36055
  };
36113
36056
 
36114
36057
  class StaleWaiterError extends Error {
@@ -36210,6 +36153,76 @@ var waitForTurn = ({
36210
36153
  });
36211
36154
  processNext();
36212
36155
  };
36156
+ var AUDIO_PRIMING_SECONDS = 0.5;
36157
+ async function* makeIteratorWithPriming({
36158
+ audioSink,
36159
+ timeToSeek,
36160
+ maximumTimestamp
36161
+ }) {
36162
+ const primingStart = Math.max(0, timeToSeek - AUDIO_PRIMING_SECONDS);
36163
+ const iterator = audioSink.buffers(primingStart, maximumTimestamp);
36164
+ for await (const buffer of iterator) {
36165
+ const sourceStart = Math.max(buffer.timestamp, timeToSeek);
36166
+ const sourceEnd = Math.min(buffer.timestamp + buffer.duration, maximumTimestamp);
36167
+ if (sourceEnd <= sourceStart) {
36168
+ continue;
36169
+ }
36170
+ yield {
36171
+ buffer,
36172
+ timelineTimestamp: sourceStart,
36173
+ sourceOffsetInSeconds: sourceStart - buffer.timestamp,
36174
+ sourceDurationInSeconds: sourceEnd - sourceStart
36175
+ };
36176
+ }
36177
+ }
36178
+ async function* makeLoopingIterator({
36179
+ audioSink,
36180
+ seekTimeInSeconds,
36181
+ loopStartInSeconds,
36182
+ segmentEndInSeconds,
36183
+ maximumContinuousTimestamp
36184
+ }) {
36185
+ if (segmentEndInSeconds <= loopStartInSeconds) {
36186
+ throw new Error(`Cannot loop audio over an empty range (${loopStartInSeconds} to ${segmentEndInSeconds})`);
36187
+ }
36188
+ let passStartInSeconds = seekTimeInSeconds;
36189
+ let passBaseTimestamp = seekTimeInSeconds;
36190
+ while (true) {
36191
+ let yieldedInPass = false;
36192
+ for await (const item of makeIteratorWithPriming({
36193
+ audioSink,
36194
+ timeToSeek: passStartInSeconds,
36195
+ maximumTimestamp: segmentEndInSeconds
36196
+ })) {
36197
+ yieldedInPass = true;
36198
+ const timelineTimestamp = passBaseTimestamp + (item.timelineTimestamp - passStartInSeconds);
36199
+ const sourceDurationInSeconds = Math.min(item.sourceDurationInSeconds, maximumContinuousTimestamp - timelineTimestamp);
36200
+ if (sourceDurationInSeconds <= 0) {
36201
+ return;
36202
+ }
36203
+ yield {
36204
+ ...item,
36205
+ timelineTimestamp,
36206
+ sourceDurationInSeconds
36207
+ };
36208
+ if (timelineTimestamp + sourceDurationInSeconds >= maximumContinuousTimestamp) {
36209
+ return;
36210
+ }
36211
+ }
36212
+ if (!yieldedInPass) {
36213
+ throw new Error(`Audio loop pass from ${passStartInSeconds} to ${segmentEndInSeconds} yielded no buffers`);
36214
+ }
36215
+ passBaseTimestamp += segmentEndInSeconds - passStartInSeconds;
36216
+ passStartInSeconds = loopStartInSeconds;
36217
+ }
36218
+ }
36219
+ var anchorToContinuousTime = ({
36220
+ anchor,
36221
+ unloopedTimeInSeconds,
36222
+ playbackRate
36223
+ }) => {
36224
+ return anchor.mediaStartInSeconds + (unloopedTimeInSeconds - anchor.unloopedStartInSeconds) * playbackRate;
36225
+ };
36213
36226
  var audioIteratorManager = ({
36214
36227
  audioTrack,
36215
36228
  delayPlaybackHandleIfNotPremounting,
@@ -36244,6 +36257,7 @@ var audioIteratorManager = ({
36244
36257
  gainNode.connect(sharedAudioContext.gainNode);
36245
36258
  const audioSink = new AudioBufferSink(audioTrack);
36246
36259
  let audioBufferIterator = null;
36260
+ let currentAnchor = null;
36247
36261
  let audioIteratorsCreated = 0;
36248
36262
  let totalAudioScheduledInSeconds = 0;
36249
36263
  let currentDelayHandle = null;
@@ -36276,6 +36290,8 @@ var audioIteratorManager = ({
36276
36290
  buffer,
36277
36291
  mediaTimestamp,
36278
36292
  originalUnloopedMediaTimestamp,
36293
+ sourceOffsetInSeconds,
36294
+ sourceDurationInSeconds,
36279
36295
  playbackRate,
36280
36296
  scheduleAudioNode,
36281
36297
  logLevel
@@ -36290,7 +36306,7 @@ var audioIteratorManager = ({
36290
36306
  node.buffer = buffer;
36291
36307
  node.playbackRate.value = playbackRate;
36292
36308
  node.connect(gainNode);
36293
- const started = scheduleAudioNode(node, mediaTimestamp, originalUnloopedMediaTimestamp);
36309
+ const started = scheduleAudioNode(node, mediaTimestamp, originalUnloopedMediaTimestamp, sourceOffsetInSeconds, sourceDurationInSeconds);
36294
36310
  if (started.type === "not-started") {
36295
36311
  Internals.Log.verbose({ logLevel, tag: "audio-scheduling" }, "not started, disconnected: %s %s", mediaTimestamp.toFixed(3), buffer.duration.toFixed(3));
36296
36312
  node.disconnect();
@@ -36300,7 +36316,9 @@ var audioIteratorManager = ({
36300
36316
  node,
36301
36317
  timestamp: mediaTimestamp,
36302
36318
  buffer,
36319
+ sourceDurationInSeconds,
36303
36320
  scheduledTime: started.scheduledTime,
36321
+ playbackRate,
36304
36322
  scheduledAtAnchor: sharedAudioContext.audioSyncAnchor.value
36305
36323
  });
36306
36324
  };
@@ -36315,22 +36333,24 @@ var audioIteratorManager = ({
36315
36333
  }
36316
36334
  const startTime = getStartTime();
36317
36335
  const sequenceEndTime = getSequenceEndTimestamp();
36318
- if (buffer.timestamp + buffer.buffer.duration <= startTime) {
36336
+ if (buffer.timelineTimestamp + buffer.sourceDurationInSeconds <= startTime) {
36319
36337
  return;
36320
36338
  }
36321
- if (buffer.timestamp >= sequenceEndTime) {
36339
+ if (buffer.timelineTimestamp >= sequenceEndTime) {
36322
36340
  return;
36323
36341
  }
36324
- const scheduledStart = Math.max(buffer.timestamp, startTime);
36325
- const scheduledEnd = Math.min(buffer.timestamp + buffer.buffer.duration, sequenceEndTime);
36342
+ const scheduledStart = Math.max(buffer.timelineTimestamp, startTime);
36343
+ const scheduledEnd = Math.min(buffer.timelineTimestamp + buffer.sourceDurationInSeconds, sequenceEndTime);
36326
36344
  totalAudioScheduledInSeconds += Math.max(0, scheduledEnd - scheduledStart);
36327
36345
  scheduleAudioChunk({
36328
36346
  buffer: buffer.buffer.buffer,
36329
- mediaTimestamp: buffer.timestamp,
36347
+ mediaTimestamp: buffer.timelineTimestamp,
36330
36348
  playbackRate,
36331
36349
  scheduleAudioNode,
36332
36350
  logLevel,
36333
- originalUnloopedMediaTimestamp: buffer.buffer.timestamp
36351
+ originalUnloopedMediaTimestamp: buffer.buffer.timestamp,
36352
+ sourceOffsetInSeconds: buffer.sourceOffsetInSeconds,
36353
+ sourceDurationInSeconds: buffer.sourceDurationInSeconds
36334
36354
  });
36335
36355
  drawDebugOverlay();
36336
36356
  };
@@ -36378,7 +36398,7 @@ var audioIteratorManager = ({
36378
36398
  onDone();
36379
36399
  return;
36380
36400
  }
36381
- onScheduled(result.value.timestamp);
36401
+ onScheduled(result.value.timelineTimestamp);
36382
36402
  notifyNodeScheduled();
36383
36403
  onAudioChunk({
36384
36404
  buffer: result.value,
@@ -36418,6 +36438,7 @@ var audioIteratorManager = ({
36418
36438
  nonce,
36419
36439
  playbackRate,
36420
36440
  startFromSecond,
36441
+ unloopedStartFromSecond,
36421
36442
  scheduleAudioNode,
36422
36443
  getTargetTime,
36423
36444
  logLevel,
@@ -36436,14 +36457,25 @@ var audioIteratorManager = ({
36436
36457
  unblockCurrentDelayHandle();
36437
36458
  const delayHandle = delayPlaybackHandleIfNotPremounting();
36438
36459
  currentDelayHandle = delayHandle;
36460
+ currentAnchor = {
36461
+ unloopedStartInSeconds: unloopedStartFromSecond,
36462
+ mediaStartInSeconds: startFromSecond
36463
+ };
36464
+ const maximumContinuousTimestamp = startFromSecond + getSequenceDurationInSeconds() * playbackRate;
36465
+ const source = loop ? makeLoopingIterator({
36466
+ audioSink,
36467
+ seekTimeInSeconds: startFromSecond,
36468
+ loopStartInSeconds: getStartTime(),
36469
+ segmentEndInSeconds: maximumTimestamp,
36470
+ maximumContinuousTimestamp
36471
+ }) : makeIteratorWithPriming({
36472
+ audioSink,
36473
+ timeToSeek: startFromSecond,
36474
+ maximumTimestamp
36475
+ });
36439
36476
  const iterator = makeAudioIterator({
36440
36477
  startFromSecond,
36441
- maximumTimestamp,
36442
- audioSink,
36443
- logLevel,
36444
- loop,
36445
- playbackRate,
36446
- sequenceDurationInSeconds: getSequenceDurationInSeconds(),
36478
+ iterator: source,
36447
36479
  unscheduleAudioNode
36448
36480
  });
36449
36481
  audioIteratorsCreated++;
@@ -36474,8 +36506,10 @@ var audioIteratorManager = ({
36474
36506
  };
36475
36507
  const seek2 = ({
36476
36508
  newTime,
36509
+ unloopedNewTime,
36477
36510
  nonce,
36478
36511
  playbackRate,
36512
+ localPlaybackRate,
36479
36513
  scheduleAudioNode,
36480
36514
  getTargetTime,
36481
36515
  logLevel,
@@ -36507,18 +36541,23 @@ var audioIteratorManager = ({
36507
36541
  return;
36508
36542
  }
36509
36543
  if (audioBufferIterator && !audioBufferIterator.isDestroyed()) {
36544
+ const timeToCheck = loop && currentAnchor ? anchorToContinuousTime({
36545
+ anchor: currentAnchor,
36546
+ unloopedTimeInSeconds: unloopedNewTime,
36547
+ playbackRate: localPlaybackRate
36548
+ }) : newTime;
36510
36549
  const queuedPeriod = audioBufferIterator.getQueuedPeriod();
36511
36550
  const queuedPeriodMinusLatency = queuedPeriod ? {
36512
36551
  from: queuedPeriod.from - ALLOWED_GLOBAL_TIME_ANCHOR_SHIFT2 - sharedAudioContext.audioContext.baseLatency - sharedAudioContext.audioContext.outputLatency,
36513
36552
  until: queuedPeriod.until
36514
36553
  } : null;
36515
- const currentTimeIsAlreadyQueued = isAlreadyQueued(newTime, queuedPeriodMinusLatency);
36554
+ const currentTimeIsAlreadyQueued = isAlreadyQueued(timeToCheck, queuedPeriodMinusLatency);
36516
36555
  if (currentTimeIsAlreadyQueued) {
36517
36556
  processNext();
36518
36557
  return;
36519
36558
  }
36520
36559
  const currentIteratorTimestamp = audioBufferIterator.guessNextTimestamp();
36521
- if (currentIteratorTimestamp < newTime && Math.abs(currentIteratorTimestamp - newTime) < 1) {
36560
+ if (currentIteratorTimestamp < timeToCheck && Math.abs(currentIteratorTimestamp - timeToCheck) < 1) {
36522
36561
  processNext();
36523
36562
  return;
36524
36563
  }
@@ -36527,6 +36566,7 @@ var audioIteratorManager = ({
36527
36566
  nonce,
36528
36567
  playbackRate,
36529
36568
  startFromSecond: newTime,
36569
+ unloopedStartFromSecond: unloopedNewTime,
36530
36570
  scheduleAudioNode,
36531
36571
  getTargetTime,
36532
36572
  logLevel,
@@ -36538,9 +36578,11 @@ var audioIteratorManager = ({
36538
36578
  return {
36539
36579
  startAudioIterator,
36540
36580
  getAudioBufferIterator: () => audioBufferIterator,
36581
+ getCurrentAnchor: () => currentAnchor,
36541
36582
  destroyIterator: () => {
36542
36583
  audioBufferIterator?.destroy();
36543
36584
  audioBufferIterator = null;
36585
+ currentAnchor = null;
36544
36586
  unblockCurrentDelayHandle();
36545
36587
  },
36546
36588
  seek: seek2,
@@ -37556,6 +37598,7 @@ class MediaPlayer {
37556
37598
  nonce,
37557
37599
  playbackRate: this.playbackRate * this.globalPlaybackRate,
37558
37600
  startFromSecond: startTime,
37601
+ unloopedStartFromSecond: startTimeUnresolved,
37559
37602
  scheduleAudioNode: this.scheduleAudioNode,
37560
37603
  getTargetTime: this.getTargetTime,
37561
37604
  logLevel: this.logLevel,
@@ -37587,10 +37630,10 @@ class MediaPlayer {
37587
37630
  __callDispose(__stack, _err, _hasErr);
37588
37631
  }
37589
37632
  }
37590
- seekToWithQueue = async (newTime) => {
37633
+ seekToWithQueue = async (newTime, unloopedNewTime) => {
37591
37634
  const nonce = this.nonceManager.createAsyncOperation();
37592
37635
  await this.seekPromiseChain;
37593
- this.seekPromiseChain = this.seekToDoNotCallDirectly(newTime, nonce);
37636
+ this.seekPromiseChain = this.seekToDoNotCallDirectly(newTime, unloopedNewTime, nonce);
37594
37637
  await this.seekPromiseChain;
37595
37638
  };
37596
37639
  async seekTo(time) {
@@ -37598,9 +37641,9 @@ class MediaPlayer {
37598
37641
  if (newTime === null) {
37599
37642
  throw new Error(`should have asserted that the time is not null`);
37600
37643
  }
37601
- await this.seekToWithQueue(newTime);
37644
+ await this.seekToWithQueue(newTime, time);
37602
37645
  }
37603
- async seekToDoNotCallDirectly(newTime, nonce) {
37646
+ async seekToDoNotCallDirectly(newTime, unloopedNewTime, nonce) {
37604
37647
  if (nonce.isStale()) {
37605
37648
  return;
37606
37649
  }
@@ -37612,8 +37655,10 @@ class MediaPlayer {
37612
37655
  }),
37613
37656
  this.audioIteratorManager?.seek({
37614
37657
  newTime,
37658
+ unloopedNewTime,
37615
37659
  nonce,
37616
37660
  playbackRate: this.playbackRate * this.globalPlaybackRate,
37661
+ localPlaybackRate: this.playbackRate,
37617
37662
  getTargetTime: this.getTargetTime,
37618
37663
  logLevel: this.logLevel,
37619
37664
  loop: this.loop,
@@ -37759,14 +37804,19 @@ class MediaPlayer {
37759
37804
  }
37760
37805
  const globalTime = (currentTime - this.sharedAudioContext.audioSyncAnchor.value) * this.globalPlaybackRate;
37761
37806
  const timeInSeconds = globalTime - this.sequenceOffset;
37762
- const localTime = this.getTrimmedTime(timeInSeconds);
37807
+ const anchor = this.loop ? this.audioIteratorManager?.getCurrentAnchor() ?? null : null;
37808
+ const localTime = anchor ? anchorToContinuousTime({
37809
+ anchor,
37810
+ unloopedTimeInSeconds: timeInSeconds,
37811
+ playbackRate: this.playbackRate
37812
+ }) : this.getTrimmedTime(timeInSeconds);
37763
37813
  if (localTime === null) {
37764
37814
  return null;
37765
37815
  }
37766
37816
  const targetTime = (mediaTimestamp - localTime) / (this.playbackRate * this.globalPlaybackRate);
37767
37817
  return targetTime;
37768
37818
  };
37769
- scheduleAudioNode = (node, mediaTimestamp, originalUnloopedMediaTimestamp) => {
37819
+ scheduleAudioNode = (node, mediaTimestamp, originalUnloopedMediaTimestamp, sourceOffsetInSeconds, sourceDurationInSeconds) => {
37770
37820
  if (!this.sharedAudioContext) {
37771
37821
  throw new Error("Shared audio context not found");
37772
37822
  }
@@ -37779,18 +37829,17 @@ class MediaPlayer {
37779
37829
  };
37780
37830
  }
37781
37831
  const sequenceStartTime = this.getStartTime();
37782
- const loopSegmentMediaEndTimestamp = this.getLoopSegmentMediaEndTimestamp();
37783
37832
  const offset4 = getTrimStartForAudioNode({
37784
37833
  mediaTimestamp,
37785
37834
  targetTime,
37786
37835
  sequenceStartTime,
37787
- combinedPlaybackRate
37836
+ combinedPlaybackRate,
37837
+ sourceStartOffsetInSeconds: sourceOffsetInSeconds
37788
37838
  });
37789
37839
  const duration = getDurationOfNode({
37790
- bufferDuration: node.buffer?.duration ?? 0,
37791
- loopSegmentMediaEndTimestamp,
37792
- offset: offset4,
37793
- originalUnloopedMediaTimestamp
37840
+ sourceDurationInSeconds,
37841
+ sourceOffsetInSeconds,
37842
+ offset: offset4
37794
37843
  });
37795
37844
  const scheduledTime = getScheduledTime({
37796
37845
  mediaTimestamp,
@@ -37801,6 +37850,7 @@ class MediaPlayer {
37801
37850
  return this.sharedAudioContext.scheduleAudioNode({
37802
37851
  node,
37803
37852
  mediaTimestamp,
37853
+ sourceOffset: sourceOffsetInSeconds,
37804
37854
  scheduledTime,
37805
37855
  duration,
37806
37856
  offset: offset4,
@@ -38038,9 +38088,9 @@ var AudioForPreviewAssertedShowing = ({
38038
38088
  const mediaPlayerRef = useRef50(null);
38039
38089
  const initialTrimBeforeRef = useRef50(trimBefore);
38040
38090
  const initialTrimAfterRef = useRef50(trimAfter);
38041
- const [initialRequestInit] = useState40(requestInit);
38042
- const [mediaPlayerReady, setMediaPlayerReady] = useState40(false);
38043
- const [shouldFallbackToNativeAudio, setShouldFallbackToNativeAudio] = useState40(false);
38091
+ const [initialRequestInit] = useState41(requestInit);
38092
+ const [mediaPlayerReady, setMediaPlayerReady] = useState41(false);
38093
+ const [shouldFallbackToNativeAudio, setShouldFallbackToNativeAudio] = useState41(false);
38044
38094
  const [playing] = Timeline.usePlayingState();
38045
38095
  const { playbackRate: globalPlaybackRate } = Internals.usePlaybackRate();
38046
38096
  const sharedAudioContext = useContext212(SharedAudioContext2);
@@ -40221,8 +40271,8 @@ var AudioForRendering2 = ({
40221
40271
  }
40222
40272
  const { fps } = videoConfig;
40223
40273
  const { delayRender: delayRender2, continueRender } = useDelayRender();
40224
- const [replaceWithHtml5Audio, setReplaceWithHtml5Audio] = useState212(false);
40225
- const [initialRequestInit] = useState212(requestInit);
40274
+ const [replaceWithHtml5Audio, setReplaceWithHtml5Audio] = useState210(false);
40275
+ const [initialRequestInit] = useState210(requestInit);
40226
40276
  const sequenceContext = useContext312(Internals.SequenceContext);
40227
40277
  const id = useMemo213(() => `media-audio-${random(src)}-${sequenceContext?.cumulatedFrom}-${sequenceContext?.relativeFrom}-${sequenceContext?.durationInFrames}`, [
40228
40278
  src,
@@ -40444,7 +40494,7 @@ var AudioInner = (props) => {
40444
40494
  mediaStartsAt,
40445
40495
  loop: props.loop ?? false
40446
40496
  });
40447
- const [mediaDurationInSeconds, setMediaDurationInSeconds] = useState311(null);
40497
+ const [mediaDurationInSeconds, setMediaDurationInSeconds] = useState312(null);
40448
40498
  const loopDisplay = useMemo312(() => getLoopDisplay({
40449
40499
  loop: props.loop ?? false,
40450
40500
  mediaDurationInSeconds,
@@ -42841,7 +42891,7 @@ import {
42841
42891
  import { BufferTarget, StreamTarget } from "mediabunny";
42842
42892
 
42843
42893
  // ../core/dist/esm/version.mjs
42844
- var VERSION2 = "4.0.487";
42894
+ var VERSION2 = "4.0.488";
42845
42895
 
42846
42896
  // ../web-renderer/dist/esm/index.mjs
42847
42897
  import { AudioSample, VideoSample } from "mediabunny";