@pixerate/editor 0.125.0 → 0.126.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/animation-editor/index.cjs +9 -11
  2. package/dist/animation-editor/index.cjs.map +1 -1
  3. package/dist/animation-editor/index.js +2 -4
  4. package/dist/animation-editor/index.js.map +1 -1
  5. package/dist/{chunk-G6WXWS4Y.js → chunk-FICSDDDF.js} +2 -2
  6. package/dist/{chunk-QDJKUBWE.cjs → chunk-JODTP4DP.cjs} +176 -5
  7. package/dist/chunk-JODTP4DP.cjs.map +1 -0
  8. package/dist/{chunk-XZWOLXWA.js → chunk-QFSTQHZY.js} +174 -3
  9. package/dist/chunk-QFSTQHZY.js.map +1 -0
  10. package/dist/{chunk-UXFI3CDZ.cjs → chunk-SFCPGMCT.cjs} +8 -8
  11. package/dist/{chunk-UXFI3CDZ.cjs.map → chunk-SFCPGMCT.cjs.map} +1 -1
  12. package/dist/effects/index.cjs +32 -34
  13. package/dist/effects/index.cjs.map +1 -1
  14. package/dist/effects/index.js +3 -5
  15. package/dist/effects/index.js.map +1 -1
  16. package/dist/image-editor/index.cjs +13 -15
  17. package/dist/image-editor/index.cjs.map +1 -1
  18. package/dist/image-editor/index.js +2 -4
  19. package/dist/image-editor/index.js.map +1 -1
  20. package/dist/paint-editor/index.cjs +728 -108
  21. package/dist/paint-editor/index.cjs.map +1 -1
  22. package/dist/paint-editor/index.d.cts +246 -9
  23. package/dist/paint-editor/index.d.ts +246 -9
  24. package/dist/paint-editor/index.js +631 -11
  25. package/dist/paint-editor/index.js.map +1 -1
  26. package/dist/vector/index.cjs +6 -8
  27. package/dist/vector/index.cjs.map +1 -1
  28. package/dist/vector/index.js +2 -4
  29. package/dist/vector/index.js.map +1 -1
  30. package/dist/video-editor/index.cjs +269 -271
  31. package/dist/video-editor/index.cjs.map +1 -1
  32. package/dist/video-editor/index.js +3 -5
  33. package/dist/video-editor/index.js.map +1 -1
  34. package/package.json +1 -1
  35. package/skills/pixerate-paint-editor/SKILL.md +40 -1
  36. package/dist/chunk-IOXKXQNW.cjs +0 -178
  37. package/dist/chunk-IOXKXQNW.cjs.map +0 -1
  38. package/dist/chunk-QDJKUBWE.cjs.map +0 -1
  39. package/dist/chunk-TGKT5QAB.js +0 -178
  40. package/dist/chunk-TGKT5QAB.js.map +0 -1
  41. package/dist/chunk-XZWOLXWA.js.map +0 -1
  42. /package/dist/{chunk-G6WXWS4Y.js.map → chunk-FICSDDDF.js.map} +0 -0
@@ -134,18 +134,16 @@
134
134
 
135
135
 
136
136
 
137
- var _chunkUXFI3CDZcjs = require('../chunk-UXFI3CDZ.cjs');
137
+ var _chunkSFCPGMCTcjs = require('../chunk-SFCPGMCT.cjs');
138
138
  require('../chunk-W6QTLHZ3.cjs');
139
139
 
140
140
 
141
141
  var _chunkWAJQKWQUcjs = require('../chunk-WAJQKWQU.cjs');
142
142
 
143
143
 
144
- var _chunkQDJKUBWEcjs = require('../chunk-QDJKUBWE.cjs');
145
144
 
146
145
 
147
-
148
- var _chunkIOXKXQNWcjs = require('../chunk-IOXKXQNW.cjs');
146
+ var _chunkJODTP4DPcjs = require('../chunk-JODTP4DP.cjs');
149
147
  require('../chunk-RIWPYSKU.cjs');
150
148
 
151
149
 
@@ -193,7 +191,7 @@ function parseVideoEase(v, path) {
193
191
  if (v[0] < 0 || v[0] > 1 || v[2] < 0 || v[2] > 1) fail(path, "must have x1 and x2 between 0 and 1");
194
192
  return [v[0], v[1], v[2], v[3]];
195
193
  }
196
- return oneOf(v, _chunkUXFI3CDZcjs.VIDEO_EASE_NAMES, path);
194
+ return oneOf(v, _chunkSFCPGMCTcjs.VIDEO_EASE_NAMES, path);
197
195
  }
198
196
  function parseVideoKeyframes(v, path, { min, max } = {}) {
199
197
  if (!isObject(v)) return fail(path, "must be a number or keyframes { keys: [{ t, v, ease }] }");
@@ -231,7 +229,7 @@ function parseVideoTimeRemap(v, speed, path) {
231
229
  if (typeof remap === "number" || remap === void 0) return fail(path, "must be keyframes { keys: [{ t, v, ease }] } (v: ms of source after the in point)");
232
230
  if (speed !== void 0 && speed !== 1) fail(path, 'cannot be used with a speed; a ramp sets the speed itself (remove "speed")');
233
231
  try {
234
- _chunkUXFI3CDZcjs.checkVideoTimeRemap.call(void 0, remap, path);
232
+ _chunkSFCPGMCTcjs.checkVideoTimeRemap.call(void 0, remap, path);
235
233
  } catch (e) {
236
234
  throw new Error(e.message.replace(/\.?$/, "."));
237
235
  }
@@ -241,17 +239,17 @@ function parseVideoClipAnimation(v, path) {
241
239
  if (v === void 0) return void 0;
242
240
  if (!isObject(v)) return fail(path, "must be an object { effect, duration }");
243
241
  return compact({
244
- effect: oneOf(v.effect, _chunkUXFI3CDZcjs.VIDEO_CLIP_ANIMATION_EFFECTS, `${path}.effect`, false),
242
+ effect: oneOf(v.effect, _chunkSFCPGMCTcjs.VIDEO_CLIP_ANIMATION_EFFECTS, `${path}.effect`, false),
245
243
  duration: num(v.duration, `${path}.duration`, { optional: true, positive: true })
246
244
  });
247
245
  }
248
246
  function parseVideoGrade(v, path) {
249
247
  if (v === void 0) return void 0;
250
248
  if (!isObject(v)) return fail(path, "must be an object such as { exposure, contrast, saturation }");
251
- const known = /* @__PURE__ */ new Set([..._chunkUXFI3CDZcjs.VIDEO_GRADE_CONTROLS.map((c) => c.key), "lut"]);
249
+ const known = /* @__PURE__ */ new Set([..._chunkSFCPGMCTcjs.VIDEO_GRADE_CONTROLS.map((c) => c.key), "lut"]);
252
250
  const unknown = Object.keys(v).find((k) => !known.has(k));
253
251
  if (unknown) fail(`${path}.${unknown}`, `is not a grade setting; use ${[...known].join(", ")}`);
254
- return compact({ ...Object.fromEntries(_chunkUXFI3CDZcjs.VIDEO_GRADE_CONTROLS.map((c) => [c.key, num(v[c.key], `${path}.${c.key}`, { optional: true, min: c.min, max: c.max })])), lut: parseVideoGradeLut(v.lut, `${path}.lut`) });
252
+ return compact({ ...Object.fromEntries(_chunkSFCPGMCTcjs.VIDEO_GRADE_CONTROLS.map((c) => [c.key, num(v[c.key], `${path}.${c.key}`, { optional: true, min: c.min, max: c.max })])), lut: parseVideoGradeLut(v.lut, `${path}.lut`) });
255
253
  }
256
254
  function parseVideoGradeLut(v, path) {
257
255
  if (v === void 0) return void 0;
@@ -263,15 +261,15 @@ function parseVideoGradeLut(v, path) {
263
261
  function parseVideoTransition(v, path) {
264
262
  if (v === void 0) return void 0;
265
263
  if (!isObject(v)) return fail(path, "must be an object { type, duration }");
266
- const type = oneOf(v.type, _chunkUXFI3CDZcjs.VIDEO_TRANSITION_TYPES, `${path}.type`, false);
264
+ const type = oneOf(v.type, _chunkSFCPGMCTcjs.VIDEO_TRANSITION_TYPES, `${path}.type`, false);
267
265
  if (type === "effect" && v.effect === void 0) fail(`${path}.effect`, 'is required for an effect transition: { effect: "<effect id>", values }');
268
266
  if (type !== "effect" && v.effect !== void 0) fail(`${path}.effect`, 'is only for transitions of type "effect"');
269
267
  return compact({
270
268
  type,
271
269
  duration: num(v.duration, `${path}.duration`, { positive: true }),
272
270
  color: str(v.color, `${path}.color`, true),
273
- direction: oneOf(v.direction, _chunkUXFI3CDZcjs.VIDEO_WIPE_DIRECTIONS, `${path}.direction`),
274
- audioCurve: oneOf(v.audioCurve, _chunkUXFI3CDZcjs.VIDEO_FADE_CURVES, `${path}.audioCurve`),
271
+ direction: oneOf(v.direction, _chunkSFCPGMCTcjs.VIDEO_WIPE_DIRECTIONS, `${path}.direction`),
272
+ audioCurve: oneOf(v.audioCurve, _chunkSFCPGMCTcjs.VIDEO_FADE_CURVES, `${path}.audioCurve`),
275
273
  effect: v.effect === void 0 ? void 0 : parseVideoEffectRef(v.effect, `${path}.effect`, false)
276
274
  });
277
275
  }
@@ -364,7 +362,7 @@ function parseVideoAssetProxies(v, path) {
364
362
  }
365
363
  function parseVideoClip(v, path = "clip") {
366
364
  if (!isObject(v)) return fail(path, "must be an object");
367
- const type = oneOf(_nullishCoalesce(v.type, () => ( "media")), _chunkUXFI3CDZcjs.VIDEO_CLIP_TYPES, `${path}.type`, false);
365
+ const type = oneOf(_nullishCoalesce(v.type, () => ( "media")), _chunkSFCPGMCTcjs.VIDEO_CLIP_TYPES, `${path}.type`, false);
368
366
  const base = {
369
367
  id: str(v.id, `${path}.id`),
370
368
  name: str(v.name, `${path}.name`, true),
@@ -372,8 +370,8 @@ function parseVideoClip(v, path = "clip") {
372
370
  duration: num(v.duration, `${path}.duration`, { positive: true }),
373
371
  opacity: parseVideoAnimatable(v.opacity, `${path}.opacity`, { optional: true, min: 0, max: 1 }),
374
372
  transform: parseVideoTransform(v.transform, `${path}.transform`),
375
- fit: oneOf(v.fit, _chunkUXFI3CDZcjs.VIDEO_FITS, `${path}.fit`),
376
- blend: oneOf(v.blend, _chunkUXFI3CDZcjs.VIDEO_BLEND_MODES, `${path}.blend`),
373
+ fit: oneOf(v.fit, _chunkSFCPGMCTcjs.VIDEO_FITS, `${path}.fit`),
374
+ blend: oneOf(v.blend, _chunkSFCPGMCTcjs.VIDEO_BLEND_MODES, `${path}.blend`),
377
375
  grade: parseVideoGrade(v.grade, `${path}.grade`),
378
376
  animateIn: parseVideoClipAnimation(v.animateIn, `${path}.animateIn`),
379
377
  animateOut: parseVideoClipAnimation(v.animateOut, `${path}.animateOut`),
@@ -392,8 +390,8 @@ function parseVideoClip(v, path = "clip") {
392
390
  volume: parseVideoAnimatable(v.volume, `${path}.volume`, { optional: true, min: 0, max: 4 }),
393
391
  muted: bool(v.muted, `${path}.muted`),
394
392
  timeRemap: parseVideoTimeRemap(v.timeRemap, v.speed, `${path}.timeRemap`),
395
- fadeInCurve: oneOf(v.fadeInCurve, _chunkUXFI3CDZcjs.VIDEO_FADE_CURVES, `${path}.fadeInCurve`),
396
- fadeOutCurve: oneOf(v.fadeOutCurve, _chunkUXFI3CDZcjs.VIDEO_FADE_CURVES, `${path}.fadeOutCurve`)
393
+ fadeInCurve: oneOf(v.fadeInCurve, _chunkSFCPGMCTcjs.VIDEO_FADE_CURVES, `${path}.fadeInCurve`),
394
+ fadeOutCurve: oneOf(v.fadeOutCurve, _chunkSFCPGMCTcjs.VIDEO_FADE_CURVES, `${path}.fadeOutCurve`)
397
395
  });
398
396
  if (type === "sequence") {
399
397
  for (const key of ["speed", "timeRemap"])
@@ -405,8 +403,8 @@ function parseVideoClip(v, path = "clip") {
405
403
  in: num(v.in, `${path}.in`, { optional: true, min: 0 }),
406
404
  volume: parseVideoAnimatable(v.volume, `${path}.volume`, { optional: true, min: 0, max: 4 }),
407
405
  muted: bool(v.muted, `${path}.muted`),
408
- fadeInCurve: oneOf(v.fadeInCurve, _chunkUXFI3CDZcjs.VIDEO_FADE_CURVES, `${path}.fadeInCurve`),
409
- fadeOutCurve: oneOf(v.fadeOutCurve, _chunkUXFI3CDZcjs.VIDEO_FADE_CURVES, `${path}.fadeOutCurve`)
406
+ fadeInCurve: oneOf(v.fadeInCurve, _chunkSFCPGMCTcjs.VIDEO_FADE_CURVES, `${path}.fadeInCurve`),
407
+ fadeOutCurve: oneOf(v.fadeOutCurve, _chunkSFCPGMCTcjs.VIDEO_FADE_CURVES, `${path}.fadeOutCurve`)
410
408
  });
411
409
  }
412
410
  if (type === "text")
@@ -517,9 +515,9 @@ function createVideoProject(options = {}) {
517
515
  // src/video-editor/check.ts
518
516
  function videoClipKeyframes(clip) {
519
517
  const out = [
520
- { property: "opacity", keys: _chunkUXFI3CDZcjs.videoKeysOf.call(void 0, clip.opacity) },
521
- { property: "volume", keys: clip.type === "media" || clip.type === "sequence" ? _chunkUXFI3CDZcjs.videoKeysOf.call(void 0, clip.volume) : [] },
522
- ..._chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES.map((p) => ({ property: p, keys: _chunkUXFI3CDZcjs.videoKeysOf.call(void 0, _optionalChain([clip, 'access', _2 => _2.transform, 'optionalAccess', _3 => _3[p]])) }))
518
+ { property: "opacity", keys: _chunkSFCPGMCTcjs.videoKeysOf.call(void 0, clip.opacity) },
519
+ { property: "volume", keys: clip.type === "media" || clip.type === "sequence" ? _chunkSFCPGMCTcjs.videoKeysOf.call(void 0, clip.volume) : [] },
520
+ ..._chunkSFCPGMCTcjs.VIDEO_TRANSFORM_PROPERTIES.map((p) => ({ property: p, keys: _chunkSFCPGMCTcjs.videoKeysOf.call(void 0, _optionalChain([clip, 'access', _2 => _2.transform, 'optionalAccess', _3 => _3[p]])) }))
523
521
  ];
524
522
  return out.filter((o) => o.keys.length);
525
523
  }
@@ -546,8 +544,8 @@ var VIDEO_ISSUE_CODES = [
546
544
  var videoIssueKey = (i) => [i.code, _nullishCoalesce(i.sequence, () => ( "")), _nullishCoalesce(i.track, () => ( "")), _nullishCoalesce(i.clip, () => ( "")), _nullishCoalesce(i.asset, () => ( "")), _nullishCoalesce(i.marker, () => ( ""))].join("|");
547
545
  function checkVideoProject(project) {
548
546
  const issues = [];
549
- const assets = _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, project);
550
- const sequences = _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, project);
547
+ const assets = _chunkSFCPGMCTcjs.videoAssetMap.call(void 0, project);
548
+ const sequences = _chunkSFCPGMCTcjs.videoSequenceMap.call(void 0, project);
551
549
  const used = /* @__PURE__ */ new Set();
552
550
  const usedSequences = /* @__PURE__ */ new Set();
553
551
  const cycles = /* @__PURE__ */ new Map();
@@ -555,7 +553,7 @@ function checkVideoProject(project) {
555
553
  if ((asset.kind === "video" || asset.kind === "audio") && asset.duration === void 0)
556
554
  issues.push({ code: "unknown-duration", severity: "warning", asset: asset.id, message: `Asset "${asset.id}" has no duration, so clips of it cannot be checked against its length; set "duration" in ms.` });
557
555
  const checkTrack = (track, sequence) => {
558
- const clips = _chunkUXFI3CDZcjs.sortedVideoClips.call(void 0, track);
556
+ const clips = _chunkSFCPGMCTcjs.sortedVideoClips.call(void 0, track);
559
557
  const where = sequence ? ` in sequence "${sequence}"` : "";
560
558
  for (let i = 0; i < clips.length; i++) {
561
559
  const clip = clips[i];
@@ -565,13 +563,13 @@ function checkVideoProject(project) {
565
563
  const seq = sequences.get(clip.sequence);
566
564
  if (!seq) issues.push({ code: "missing-sequence", severity: "error", ...at, message: `Compound clip "${clip.id}" plays sequence "${clip.sequence}", which is not in the project; add the sequence or delete the clip.` });
567
565
  else {
568
- if (!cycles.has(seq.id)) cycles.set(seq.id, _chunkUXFI3CDZcjs.findVideoSequenceCycle.call(void 0, project, seq.id));
566
+ if (!cycles.has(seq.id)) cycles.set(seq.id, _chunkSFCPGMCTcjs.findVideoSequenceCycle.call(void 0, project, seq.id));
569
567
  const cycle = cycles.get(seq.id);
570
568
  if (cycle) issues.push({ code: "sequence-cycle", severity: "error", ...at, message: `Compound clip "${clip.id}" plays sequence "${seq.id}", which contains itself (${cycle.join(" \u2192 ")}), so it is left out of the picture and sound; remove the compound clip that closes the loop.` });
571
- const length = _chunkUXFI3CDZcjs.videoSequenceDuration.call(void 0, seq);
572
- const range = _chunkUXFI3CDZcjs.videoClipSourceRange.call(void 0, clip);
573
- if (range.out > length + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
574
- issues.push({ code: "source-overrun", severity: "error", ...at, message: `Compound clip "${clip.id}" plays to ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, range.out)} of sequence "${seq.id}", which is only ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, length)} long; shorten the clip or move its in point.` });
569
+ const length = _chunkSFCPGMCTcjs.videoSequenceDuration.call(void 0, seq);
570
+ const range = _chunkSFCPGMCTcjs.videoClipSourceRange.call(void 0, clip);
571
+ if (range.out > length + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON)
572
+ issues.push({ code: "source-overrun", severity: "error", ...at, message: `Compound clip "${clip.id}" plays to ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, range.out)} of sequence "${seq.id}", which is only ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, length)} long; shorten the clip or move its in point.` });
575
573
  }
576
574
  } else if (clip.type === "media") {
577
575
  used.add(clip.asset);
@@ -580,28 +578,28 @@ function checkVideoProject(project) {
580
578
  else {
581
579
  if (track.kind === "audio" && asset.kind === "image") issues.push({ code: "wrong-track", severity: "error", ...at, message: `Clip "${clip.id}" is an image on audio track "${track.id}"; move it to a video track.` });
582
580
  if (track.kind === "video" && asset.kind === "audio") issues.push({ code: "wrong-track", severity: "error", ...at, message: `Clip "${clip.id}" is audio on video track "${track.id}"; move it to an audio track.` });
583
- const range = _chunkUXFI3CDZcjs.videoClipSourceRange.call(void 0, clip);
584
- if (asset.duration !== void 0 && range.out > asset.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
585
- issues.push({ code: "source-overrun", severity: "error", ...at, message: `Clip "${clip.id}" plays to ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, range.out)} of "${asset.id}", which is only ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, asset.duration)} long; shorten the clip or move its in point.` });
581
+ const range = _chunkSFCPGMCTcjs.videoClipSourceRange.call(void 0, clip);
582
+ if (asset.duration !== void 0 && range.out > asset.duration + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON)
583
+ issues.push({ code: "source-overrun", severity: "error", ...at, message: `Clip "${clip.id}" plays to ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, range.out)} of "${asset.id}", which is only ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, asset.duration)} long; shorten the clip or move its in point.` });
586
584
  }
587
585
  } else if (track.kind === "audio") issues.push({ code: "wrong-track", severity: "error", ...at, message: `Clip "${clip.id}" is a ${clip.type} clip on audio track "${track.id}"; move it to a video track.` });
588
586
  const next = clips[i + 1];
589
- if (next && next.start < _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip) - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
590
- issues.push({ code: "overlap", severity: "error", ...at, message: `Clips "${clip.id}" and "${next.id}" overlap on track "${track.id}"${where} from ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, next.start)}; move one of them.` });
591
- if ((_nullishCoalesce(clip.fadeIn, () => ( 0))) + (_nullishCoalesce(clip.fadeOut, () => ( 0))) > clip.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
587
+ if (next && next.start < _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, clip) - _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON)
588
+ issues.push({ code: "overlap", severity: "error", ...at, message: `Clips "${clip.id}" and "${next.id}" overlap on track "${track.id}"${where} from ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, next.start)}; move one of them.` });
589
+ if ((_nullishCoalesce(clip.fadeIn, () => ( 0))) + (_nullishCoalesce(clip.fadeOut, () => ( 0))) > clip.duration + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON)
592
590
  issues.push({ code: "fades-too-long", severity: "warning", ...at, message: `Clip "${clip.id}"'s fades (${_nullishCoalesce(clip.fadeIn, () => ( 0))} + ${_nullishCoalesce(clip.fadeOut, () => ( 0))} ms) are longer than the clip (${clip.duration} ms); shorten them.` });
593
- const anim = (clip.animateIn ? _nullishCoalesce(clip.animateIn.duration, () => ( _chunkUXFI3CDZcjs.VIDEO_CLIP_ANIMATION_DURATION)) : 0) + (clip.animateOut ? _nullishCoalesce(clip.animateOut.duration, () => ( _chunkUXFI3CDZcjs.VIDEO_CLIP_ANIMATION_DURATION)) : 0);
594
- if (anim > clip.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
591
+ const anim = (clip.animateIn ? _nullishCoalesce(clip.animateIn.duration, () => ( _chunkSFCPGMCTcjs.VIDEO_CLIP_ANIMATION_DURATION)) : 0) + (clip.animateOut ? _nullishCoalesce(clip.animateOut.duration, () => ( _chunkSFCPGMCTcjs.VIDEO_CLIP_ANIMATION_DURATION)) : 0);
592
+ if (anim > clip.duration + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON)
595
593
  issues.push({ code: "animations-too-long", severity: "warning", ...at, message: `Clip "${clip.id}"'s entrance and exit (${anim} ms together) are longer than the clip (${clip.duration} ms), so both are shortened; give them shorter durations.` });
596
594
  for (const which of ["animateIn", "animateOut"]) {
597
595
  const a = clip[which];
598
596
  if (!a) continue;
599
- const keyed = _chunkUXFI3CDZcjs.videoClipAnimationProperties.call(void 0, a).filter((p) => _chunkUXFI3CDZcjs.videoKeysOf.call(void 0, p === "opacity" ? clip.opacity : _optionalChain([clip, 'access', _4 => _4.transform, 'optionalAccess', _5 => _5[p]])).length);
597
+ const keyed = _chunkSFCPGMCTcjs.videoClipAnimationProperties.call(void 0, a).filter((p) => _chunkSFCPGMCTcjs.videoKeysOf.call(void 0, p === "opacity" ? clip.opacity : _optionalChain([clip, 'access', _4 => _4.transform, 'optionalAccess', _5 => _5[p]])).length);
600
598
  if (keyed.length)
601
599
  issues.push({ code: "animation-keyed", severity: "note", ...at, message: `Clip "${clip.id}"'s ${a.effect} ${which === "animateIn" ? "entrance" : "exit"} leaves ${keyed.join(", ")} alone, because the clip keys ${keyed.length > 1 ? "them" : "it"} itself; remove those keyframes or the animation.` });
602
600
  }
603
601
  for (const { property, keys } of videoClipKeyframes(clip)) {
604
- const outside = keys.filter((k) => k.t < -_chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON || k.t > clip.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON);
602
+ const outside = keys.filter((k) => k.t < -_chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON || k.t > clip.duration + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON);
605
603
  if (outside.length)
606
604
  issues.push({
607
605
  code: "keyframes-outside-clip",
@@ -612,20 +610,20 @@ function checkVideoProject(project) {
612
610
  }
613
611
  if (clip.transition) {
614
612
  const d = clip.transition.duration;
615
- const before = _chunkUXFI3CDZcjs.videoClipBefore.call(void 0, track, clip);
613
+ const before = _chunkSFCPGMCTcjs.videoClipBefore.call(void 0, track, clip);
616
614
  if (!before) {
617
615
  issues.push({ code: "transition-without-cut", severity: "warning", ...at, message: `Clip "${clip.id}" has a transition but no clip ends where it starts on track "${track.id}", so it plays as nothing; butt a clip up against it or remove the transition.` });
618
616
  continue;
619
617
  }
620
- if (d > clip.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON || d > before.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) {
618
+ if (d > clip.duration + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON || d > before.duration + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) {
621
619
  issues.push({ code: "transition-too-long", severity: "error", ...at, message: `The ${d} ms transition into "${clip.id}" is longer than "${clip.id}" (${clip.duration} ms) or "${before.id}" (${before.duration} ms); make it at most ${Math.min(clip.duration, before.duration)} ms.` });
622
620
  continue;
623
621
  }
624
622
  if (clip.transition.type === "dip") continue;
625
- const outgoing = _chunkUXFI3CDZcjs.videoClipHandles.call(void 0, before, assets, sequences).after;
626
- const incoming = _chunkUXFI3CDZcjs.videoClipHandles.call(void 0, clip, assets, sequences).before;
623
+ const outgoing = _chunkSFCPGMCTcjs.videoClipHandles.call(void 0, before, assets, sequences).after;
624
+ const incoming = _chunkSFCPGMCTcjs.videoClipHandles.call(void 0, clip, assets, sequences).before;
627
625
  const half = d / 2;
628
- if (outgoing < half - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON || incoming < half - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) {
626
+ if (outgoing < half - _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON || incoming < half - _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) {
629
627
  const fits = 2 * Math.min(outgoing, incoming);
630
628
  issues.push({
631
629
  code: "transition-handles",
@@ -642,9 +640,9 @@ function checkVideoProject(project) {
642
640
  for (const sequence of _nullishCoalesce(project.sequences, () => ( [])))
643
641
  if (!usedSequences.has(sequence.id)) issues.push({ code: "unused-sequence", severity: "note", sequence: sequence.id, message: `Sequence "${sequence.id}" is not played by any compound clip.` });
644
642
  for (const asset of project.assets) if (!used.has(asset.id)) issues.push({ code: "unused-asset", severity: "note", asset: asset.id, message: `Asset "${asset.id}" is not used by any clip.` });
645
- const end = _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, project);
643
+ const end = _chunkSFCPGMCTcjs.videoProjectDuration.call(void 0, project);
646
644
  for (const marker of _nullishCoalesce(project.markers, () => ( [])))
647
- if (marker.time > end + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) issues.push({ code: "marker-past-end", severity: "note", marker: marker.id, message: `Marker "${marker.id}" at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, marker.time)} is past the end (${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, end)}).` });
645
+ if (marker.time > end + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) issues.push({ code: "marker-past-end", severity: "note", marker: marker.id, message: `Marker "${marker.id}" at ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, marker.time)} is past the end (${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, end)}).` });
648
646
  if (!project.tracks.some((t) => t.clips.length)) issues.push({ code: "empty", severity: "note", message: "The project has no clips yet; add assets and then clips." });
649
647
  const rank = { error: 0, warning: 1, note: 2 };
650
648
  return issues.sort((a, b) => rank[a.severity] - rank[b.severity]);
@@ -698,7 +696,7 @@ function mergeSpans(spans) {
698
696
  const out = [];
699
697
  for (const [from, to] of [...spans].sort((a, b) => a[0] - b[0])) {
700
698
  const last = out[out.length - 1];
701
- if (last && from <= last[1] + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) last[1] = Math.max(last[1], to);
699
+ if (last && from <= last[1] + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) last[1] = Math.max(last[1], to);
702
700
  else out.push([from, to]);
703
701
  }
704
702
  return out;
@@ -712,13 +710,13 @@ function clipAnimatables(clip) {
712
710
  // A speed ramp is keys in clip time too, so trims and splits keep it on the same frames of source.
713
711
  { get: () => c.timeRemap, set: (v) => c.timeRemap = v }
714
712
  ];
715
- for (const p of _chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES) out.push({ get: () => _optionalChain([c, 'access', _6 => _6.transform, 'optionalAccess', _7 => _7[p]]), set: (v) => c.transform && (c.transform[p] = v) });
713
+ for (const p of _chunkSFCPGMCTcjs.VIDEO_TRANSFORM_PROPERTIES) out.push({ get: () => _optionalChain([c, 'access', _6 => _6.transform, 'optionalAccess', _7 => _7[p]]), set: (v) => c.transform && (c.transform[p] = v) });
716
714
  return out;
717
715
  }
718
716
  function retimeClipKeys(clip, fn) {
719
717
  for (const a of clipAnimatables(clip)) {
720
718
  const v = a.get();
721
- if (_chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, v)) a.set(fn(v));
719
+ if (_chunkSFCPGMCTcjs.isVideoKeyframes.call(void 0, v)) a.set(fn(v));
722
720
  }
723
721
  }
724
722
  var OPTIONAL_CLIP_FIELDS = ["name", "effects", "values", "provider", "opacity", "transform", "fit", "blend", "grade", "animateIn", "animateOut", "fadeIn", "fadeOut", "fadeInCurve", "fadeOutCurve", "transition", "in", "speed", "timeRemap", "volume", "muted", "color", "fontSize", "fontFamily", "fontWeight", "background"];
@@ -735,8 +733,8 @@ var Editor = (_class = class {
735
733
  return t;
736
734
  }
737
735
  clip(id) {
738
- const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, this.p, id);
739
- const nested = at ? null : _chunkUXFI3CDZcjs.findVideoSequenceClip.call(void 0, this.p, id);
736
+ const at = _chunkSFCPGMCTcjs.findVideoClip.call(void 0, this.p, id);
737
+ const nested = at ? null : _chunkSFCPGMCTcjs.findVideoSequenceClip.call(void 0, this.p, id);
740
738
  if (nested) refuse(`Clip "${id}" is inside sequence "${nested.sequence.id}", and clips inside sequences cannot be edited yet; edit the compound clip that plays the sequence instead (list_video_sequences shows which).`);
741
739
  if (!at) {
742
740
  const ids = this.p.tracks.flatMap((t) => t.clips.map((c) => c.id));
@@ -753,10 +751,10 @@ var Editor = (_class = class {
753
751
  return a;
754
752
  }
755
753
  fits(track, start, duration, ignore, what) {
756
- const hit = _chunkUXFI3CDZcjs.videoOverlap.call(void 0, track, start, start + duration, ignore);
754
+ const hit = _chunkSFCPGMCTcjs.videoOverlap.call(void 0, track, start, start + duration, ignore);
757
755
  if (hit) {
758
- const free = _chunkUXFI3CDZcjs.nextFreeVideoSlot.call(void 0, track, start, duration, ignore);
759
- refuse(`${what} at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, start)}\u2013${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, start + duration)} would overlap clip "${hit.id}" (${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, hit.start)}\u2013${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, hit))}) on track "${track.id}"; the next free place is ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, free)}, or use mode "insert" to push later clips along or "overwrite" to replace what is there.`);
756
+ const free = _chunkSFCPGMCTcjs.nextFreeVideoSlot.call(void 0, track, start, duration, ignore);
757
+ refuse(`${what} at ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, start)}\u2013${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, start + duration)} would overlap clip "${hit.id}" (${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, hit.start)}\u2013${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, hit))}) on track "${track.id}"; the next free place is ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, free)}, or use mode "insert" to push later clips along or "overwrite" to replace what is there.`);
760
758
  }
761
759
  }
762
760
  kindFits(track, clip) {
@@ -772,14 +770,14 @@ var Editor = (_class = class {
772
770
  /** Moves every clip on `track` starting at or after `from` by `delta`. */
773
771
  shift(track, from, delta, except = /* @__PURE__ */ new Set()) {
774
772
  if (!delta) return;
775
- for (const c of track.clips) if (!except.has(c.id) && c.start >= from - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) c.start = Math.max(0, c.start + delta);
773
+ for (const c of track.clips) if (!except.has(c.id) && c.start >= from - _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) c.start = Math.max(0, c.start + delta);
776
774
  track.clips.sort((a, b) => a.start - b.start);
777
775
  }
778
776
  get frame() {
779
777
  return 1e3 / this.p.fps;
780
778
  }
781
779
  ids() {
782
- return _chunkUXFI3CDZcjs.allVideoClipIds.call(void 0, this.p);
780
+ return _chunkSFCPGMCTcjs.allVideoClipIds.call(void 0, this.p);
783
781
  }
784
782
  /**
785
783
  * The tracks a ripple on `sources` moves, top to bottom: the sources, and every unlocked
@@ -787,8 +785,8 @@ var Editor = (_class = class {
787
785
  */
788
786
  rippleTracks(sources) {
789
787
  const set = new Set(sources);
790
- if ([...set].some(_chunkUXFI3CDZcjs.videoTrackSyncLocked)) {
791
- for (const t of this.p.tracks) if (_chunkUXFI3CDZcjs.videoTrackSyncLocked.call(void 0, t) && !t.locked) set.add(t);
788
+ if ([...set].some(_chunkSFCPGMCTcjs.videoTrackSyncLocked)) {
789
+ for (const t of this.p.tracks) if (_chunkSFCPGMCTcjs.videoTrackSyncLocked.call(void 0, t) && !t.locked) set.add(t);
792
790
  }
793
791
  return this.p.tracks.filter((t) => set.has(t));
794
792
  }
@@ -805,7 +803,7 @@ var Editor = (_class = class {
805
803
  return open;
806
804
  }
807
805
  range(from, to) {
808
- if (!(to - from > _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)) refuse(`"to" (${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, to)}) must be after "from" (${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, from)}).`);
806
+ if (!(to - from > _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON)) refuse(`"to" (${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, to)}) must be after "from" (${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, from)}).`);
809
807
  }
810
808
  /** Moves a media or compound clip's in point by `delta` of timeline time (stills, titles and colours have none). */
811
809
  moveIn(clip, delta) {
@@ -814,18 +812,18 @@ var Editor = (_class = class {
814
812
  if (clip.in < 1e-9) delete clip.in;
815
813
  return;
816
814
  }
817
- if (clip.type !== "media" || _optionalChain([_chunkUXFI3CDZcjs.videoAssetMap.call(void 0, this.p), 'access', _9 => _9.get, 'call', _10 => _10(clip.asset), 'optionalAccess', _11 => _11.kind]) === "image") return;
818
- clip.in = Math.max(0, (_nullishCoalesce(clip.in, () => ( 0))) + delta * _chunkUXFI3CDZcjs.videoClipSpeed.call(void 0, clip));
815
+ if (clip.type !== "media" || _optionalChain([_chunkSFCPGMCTcjs.videoAssetMap.call(void 0, this.p), 'access', _9 => _9.get, 'call', _10 => _10(clip.asset), 'optionalAccess', _11 => _11.kind]) === "image") return;
816
+ clip.in = Math.max(0, (_nullishCoalesce(clip.in, () => ( 0))) + delta * _chunkSFCPGMCTcjs.videoClipSpeed.call(void 0, clip));
819
817
  if (clip.in < 1e-9) delete clip.in;
820
818
  }
821
819
  /** Moves a clip's head `delta` later in time (start, in point and keys); the caller sets start and duration. */
822
820
  trimHead(clip, delta) {
823
821
  if (!isRamped(clip)) this.moveIn(clip, delta);
824
- retimeClipKeys(clip, (v) => _chunkUXFI3CDZcjs.retimeVideoAnimatable.call(void 0, v, -delta));
822
+ retimeClipKeys(clip, (v) => _chunkSFCPGMCTcjs.retimeVideoAnimatable.call(void 0, v, -delta));
825
823
  }
826
824
  /** Cuts `clip` at `at` (inside it): the left part keeps the id, the right part is returned. */
827
825
  cut(track, clip, at, id) {
828
- const end = _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip);
826
+ const end = _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, clip);
829
827
  const right = { ...structuredClone(clip), id: _nullishCoalesce(id, () => ( freshId(`${clip.id}-`, this.ids()))), start: at, duration: end - at };
830
828
  delete right.transition;
831
829
  delete right.fadeIn;
@@ -833,9 +831,9 @@ var Editor = (_class = class {
833
831
  delete right.animateIn;
834
832
  const leftValues = clipAnimatables(clip);
835
833
  clipAnimatables(right).forEach((r, i) => {
836
- const [l, rr] = _chunkUXFI3CDZcjs.splitVideoAnimatable.call(void 0, leftValues[i].get(), at - clip.start);
837
- if (_chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, l)) leftValues[i].set(l);
838
- if (_chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, rr)) r.set(rr);
834
+ const [l, rr] = _chunkSFCPGMCTcjs.splitVideoAnimatable.call(void 0, leftValues[i].get(), at - clip.start);
835
+ if (_chunkSFCPGMCTcjs.isVideoKeyframes.call(void 0, l)) leftValues[i].set(l);
836
+ if (_chunkSFCPGMCTcjs.isVideoKeyframes.call(void 0, rr)) r.set(rr);
839
837
  });
840
838
  if (!isRamped(right)) this.moveIn(right, at - clip.start);
841
839
  clip.duration = at - clip.start;
@@ -849,7 +847,7 @@ var Editor = (_class = class {
849
847
  /** Cuts every clip on `tracks` that runs across `at`; returns the new right-hand parts. */
850
848
  cutAcross(tracks, at) {
851
849
  const made = [];
852
- for (const t of tracks) for (const c of [...t.clips]) if (c.start < at - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON && _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c) > at + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) made.push(this.cut(t, c, at));
850
+ for (const t of tracks) for (const c of [...t.clips]) if (c.start < at - _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON && _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, c) > at + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) made.push(this.cut(t, c, at));
853
851
  return made;
854
852
  }
855
853
  /**
@@ -867,10 +865,10 @@ var Editor = (_class = class {
867
865
  */
868
866
  close(tracks, from, to) {
869
867
  for (const t of tracks) {
870
- const hit = _chunkUXFI3CDZcjs.videoOverlap.call(void 0, t, from, to);
868
+ const hit = _chunkSFCPGMCTcjs.videoOverlap.call(void 0, t, from, to);
871
869
  if (hit)
872
870
  refuse(
873
- `Rippling out ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, from)}\u2013${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, to)} would pull track "${t.id}" out of sync: clip "${hit.id}" (${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, hit.start)}\u2013${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, hit))}) is in that stretch. Extract the range across "${t.id}" too (extract_range with its id in "tracks"), turn its sync lock off (update_track with syncLocked false) or lock it, or lift instead of rippling.`
871
+ `Rippling out ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, from)}\u2013${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, to)} would pull track "${t.id}" out of sync: clip "${hit.id}" (${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, hit.start)}\u2013${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, hit))}) is in that stretch. Extract the range across "${t.id}" too (extract_range with its id in "tracks"), turn its sync lock off (update_track with syncLocked false) or lock it, or lift instead of rippling.`
874
872
  );
875
873
  }
876
874
  for (const t of tracks) this.shift(t, to, from - to);
@@ -882,10 +880,10 @@ var Editor = (_class = class {
882
880
  clear(track, from, to, report) {
883
881
  for (const c of [...track.clips]) {
884
882
  const start = c.start;
885
- const end = _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c);
886
- if (end <= from + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON || start >= to - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) continue;
887
- const coversHead = start >= from - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON;
888
- const coversTail = end <= to + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON;
883
+ const end = _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, c);
884
+ if (end <= from + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON || start >= to - _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) continue;
885
+ const coversHead = start >= from - _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON;
886
+ const coversTail = end <= to + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON;
889
887
  if (coversHead && coversTail) {
890
888
  track.clips = track.clips.filter((x) => x !== c);
891
889
  report.removed.push(c.id);
@@ -908,8 +906,8 @@ var Editor = (_class = class {
908
906
  /** Clamps a slip, roll or slide to `[lo, hi]`, refusing when it cannot move that way at all. */
909
907
  clamp(delta, lo, hi, why) {
910
908
  const applied = Math.min(Math.max(delta, Math.min(0, lo)), Math.max(0, hi));
911
- if (Math.abs(delta) > _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON && Math.abs(applied) <= _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) refuse(why());
912
- return Math.abs(applied) <= _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON ? 0 : applied;
909
+ if (Math.abs(delta) > _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON && Math.abs(applied) <= _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) refuse(why());
910
+ return Math.abs(applied) <= _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON ? 0 : applied;
913
911
  }
914
912
  /** Places a clip on a track by `mode`, returning what it cut, trimmed, removed and rippled. */
915
913
  place(track, clip, mode, outcome) {
@@ -919,14 +917,14 @@ var Editor = (_class = class {
919
917
  outcome.rippled = tracks.map((t) => t.id);
920
918
  } else if (mode === "overwrite") {
921
919
  const report = { removed: [], trimmed: [], created: [] };
922
- this.clear(track, clip.start, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip), report);
920
+ this.clear(track, clip.start, _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, clip), report);
923
921
  Object.assign(outcome, report);
924
922
  } else this.fits(track, clip.start, clip.duration, /* @__PURE__ */ new Set([clip.id]), `Clip "${clip.id}"`);
925
923
  track.clips.push(clip);
926
924
  track.clips.sort((a, b) => a.start - b.start);
927
925
  }
928
926
  placement(mode, ripple) {
929
- if (mode !== void 0 && !_chunkUXFI3CDZcjs.VIDEO_PLACEMENT_MODES.includes(mode)) refuse(`"mode" must be ${_chunkUXFI3CDZcjs.VIDEO_PLACEMENT_MODES.map((m) => `"${m}"`).join(", ")}.`);
927
+ if (mode !== void 0 && !_chunkSFCPGMCTcjs.VIDEO_PLACEMENT_MODES.includes(mode)) refuse(`"mode" must be ${_chunkSFCPGMCTcjs.VIDEO_PLACEMENT_MODES.map((m) => `"${m}"`).join(", ")}.`);
930
928
  if (ripple && mode !== void 0 && mode !== "insert") refuse(`"ripple" means mode "insert", so it cannot go with mode "${mode}"; pass one or the other.`);
931
929
  return _nullishCoalesce(mode, () => ( (ripple ? "insert" : "refuse")));
932
930
  }
@@ -963,7 +961,7 @@ var Editor = (_class = class {
963
961
  }
964
962
  case "remove_asset": {
965
963
  const asset = this.asset(e.asset);
966
- const users = _chunkUXFI3CDZcjs.allVideoTracks.call(void 0, this.p).flatMap(({ track: t }) => t.clips.filter((c) => c.type === "media" && c.asset === asset.id).map((c) => c.id));
964
+ const users = _chunkSFCPGMCTcjs.allVideoTracks.call(void 0, this.p).flatMap(({ track: t }) => t.clips.filter((c) => c.type === "media" && c.asset === asset.id).map((c) => c.id));
967
965
  if (users.length) refuse(`Asset "${asset.id}" is used by clip${users.length > 1 ? "s" : ""} ${users.map((u) => `"${u}"`).join(", ")}; delete ${users.length > 1 ? "them" : "it"} first.`);
968
966
  this.p.assets = this.p.assets.filter((a) => a !== asset);
969
967
  return this.outcomes.push({ op: e.op, asset: asset.id });
@@ -1016,12 +1014,12 @@ var Editor = (_class = class {
1016
1014
  else draft.duration = (asset.duration - (_nullishCoalesce(draft.in, () => ( 0)))) / (_nullishCoalesce(draft.speed, () => ( 1)));
1017
1015
  if (!(draft.duration > 0)) refuse(`"in" (${draft.in} ms) is at or past the end of "${asset.id}" (${asset.duration} ms).`);
1018
1016
  } else if (draft.type === "sequence") {
1019
- const length = _chunkUXFI3CDZcjs.videoSequenceDuration.call(void 0, _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, this.p).get(draft.sequence)) - (_nullishCoalesce(draft.in, () => ( 0)));
1017
+ const length = _chunkSFCPGMCTcjs.videoSequenceDuration.call(void 0, _chunkSFCPGMCTcjs.videoSequenceMap.call(void 0, this.p).get(draft.sequence)) - (_nullishCoalesce(draft.in, () => ( 0)));
1020
1018
  if (!(length > 0)) refuse(`"in" (${_nullishCoalesce(draft.in, () => ( 0))} ms) is at or past the end of sequence "${draft.sequence}".`);
1021
1019
  draft.duration = length;
1022
1020
  } else draft.duration = VIDEO_DEFAULT_TITLE_DURATION;
1023
1021
  }
1024
- const end = _chunkUXFI3CDZcjs.sortedVideoClips.call(void 0, track).reduce((m, c) => Math.max(m, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c)), 0);
1022
+ const end = _chunkSFCPGMCTcjs.sortedVideoClips.call(void 0, track).reduce((m, c) => Math.max(m, _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, c)), 0);
1025
1023
  draft.start ??= end;
1026
1024
  const clip = parseVideoClip(draft, "clip");
1027
1025
  const outcome = { op: e.op, clip: clip.id, track: track.id };
@@ -1046,20 +1044,20 @@ var Editor = (_class = class {
1046
1044
  case "trim_clip": {
1047
1045
  const { track, clip } = this.clip(e.clip);
1048
1046
  this.unlocked(track);
1049
- const speed = _chunkUXFI3CDZcjs.videoClipSpeed.call(void 0, clip);
1050
- const end = _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip);
1047
+ const speed = _chunkSFCPGMCTcjs.videoClipSpeed.call(void 0, clip);
1048
+ const end = _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, clip);
1051
1049
  const minimum = 1e3 / this.p.fps;
1052
- const assets = _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, this.p);
1050
+ const assets = _chunkSFCPGMCTcjs.videoAssetMap.call(void 0, this.p);
1053
1051
  if (e.edge === "start") {
1054
1052
  const delta = e.to - clip.start;
1055
- if (clip.duration - delta < minimum - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) refuse(`Trimming the start to ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, e.to)} would leave "${clip.id}" shorter than a frame; it ends at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, end)}.`);
1053
+ if (clip.duration - delta < minimum - _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) refuse(`Trimming the start to ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, e.to)} would leave "${clip.id}" shorter than a frame; it ends at ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, end)}.`);
1056
1054
  if (clip.type === "media" && !isRamped(clip) || clip.type === "sequence") {
1057
1055
  const sourceIn = (_nullishCoalesce(clip.in, () => ( 0))) + delta * speed;
1058
- if (sourceIn < -_chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) refuse(`"${clip.id}" starts ${Math.round((_nullishCoalesce(clip.in, () => ( 0))) / speed)} ms into its source, so its start can move at most that far earlier (to ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, clip.start - (_nullishCoalesce(clip.in, () => ( 0))) / speed)}).`);
1056
+ if (sourceIn < -_chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) refuse(`"${clip.id}" starts ${Math.round((_nullishCoalesce(clip.in, () => ( 0))) / speed)} ms into its source, so its start can move at most that far earlier (to ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, clip.start - (_nullishCoalesce(clip.in, () => ( 0))) / speed)}).`);
1059
1057
  clip.in = Math.max(0, sourceIn);
1060
1058
  if (clip.in === 0) delete clip.in;
1061
1059
  }
1062
- retimeClipKeys(clip, (v) => _chunkUXFI3CDZcjs.retimeVideoAnimatable.call(void 0, v, -delta));
1060
+ retimeClipKeys(clip, (v) => _chunkSFCPGMCTcjs.retimeVideoAnimatable.call(void 0, v, -delta));
1063
1061
  if (e.ripple) {
1064
1062
  const tracks = this.rippleTracks([track]);
1065
1063
  if (delta > 0) {
@@ -1080,17 +1078,17 @@ var Editor = (_class = class {
1080
1078
  }
1081
1079
  } else {
1082
1080
  const duration = e.to - clip.start;
1083
- if (duration < minimum - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) refuse(`Trimming the end to ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, e.to)} would leave "${clip.id}" shorter than a frame; it starts at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, clip.start)}.`);
1081
+ if (duration < minimum - _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) refuse(`Trimming the end to ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, e.to)} would leave "${clip.id}" shorter than a frame; it starts at ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, clip.start)}.`);
1084
1082
  if (clip.type === "media" && !isRamped(clip)) {
1085
1083
  const asset = assets.get(clip.asset);
1086
1084
  const out = (_nullishCoalesce(clip.in, () => ( 0))) + duration * speed;
1087
- if (_optionalChain([asset, 'optionalAccess', _12 => _12.duration]) !== void 0 && out > asset.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
1088
- refuse(`"${clip.id}" can end at most at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, clip.start + (asset.duration - (_nullishCoalesce(clip.in, () => ( 0)))) / speed)}, where "${asset.id}" runs out.`);
1085
+ if (_optionalChain([asset, 'optionalAccess', _12 => _12.duration]) !== void 0 && out > asset.duration + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON)
1086
+ refuse(`"${clip.id}" can end at most at ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, clip.start + (asset.duration - (_nullishCoalesce(clip.in, () => ( 0)))) / speed)}, where "${asset.id}" runs out.`);
1089
1087
  }
1090
1088
  if (clip.type === "sequence") {
1091
- const seq = _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, this.p).get(clip.sequence);
1092
- const length = seq ? _chunkUXFI3CDZcjs.videoSequenceDuration.call(void 0, seq) : Infinity;
1093
- if ((_nullishCoalesce(clip.in, () => ( 0))) + duration > length + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) refuse(`"${clip.id}" can end at most at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, clip.start + length - (_nullishCoalesce(clip.in, () => ( 0))))}, where sequence "${clip.sequence}" ends.`);
1089
+ const seq = _chunkSFCPGMCTcjs.videoSequenceMap.call(void 0, this.p).get(clip.sequence);
1090
+ const length = seq ? _chunkSFCPGMCTcjs.videoSequenceDuration.call(void 0, seq) : Infinity;
1091
+ if ((_nullishCoalesce(clip.in, () => ( 0))) + duration > length + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) refuse(`"${clip.id}" can end at most at ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, clip.start + length - (_nullishCoalesce(clip.in, () => ( 0))))}, where sequence "${clip.sequence}" ends.`);
1094
1092
  }
1095
1093
  if (e.ripple) {
1096
1094
  const tracks = this.rippleTracks([track]);
@@ -1112,9 +1110,9 @@ var Editor = (_class = class {
1112
1110
  case "split_clip": {
1113
1111
  const { track, clip } = this.clip(e.clip);
1114
1112
  this.unlocked(track);
1115
- const end = _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip);
1113
+ const end = _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, clip);
1116
1114
  const minimum = 1e3 / this.p.fps;
1117
- if (e.at < clip.start + minimum - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON || e.at > end - minimum + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) refuse(`${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, e.at)} is not inside "${clip.id}" (${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, clip.start)}\u2013${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, end)}), at least a frame from either end.`);
1115
+ if (e.at < clip.start + minimum - _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON || e.at > end - minimum + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) refuse(`${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, e.at)} is not inside "${clip.id}" (${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, clip.start)}\u2013${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, end)}), at least a frame from either end.`);
1118
1116
  if (e.id !== void 0 && this.ids().includes(e.id)) refuse(`There is already a clip "${e.id}".`);
1119
1117
  const right = this.cut(track, clip, e.at, e.id);
1120
1118
  return this.outcomes.push({ op: e.op, clips: [clip.id, right.id], clip: right.id, track: track.id });
@@ -1125,12 +1123,12 @@ var Editor = (_class = class {
1125
1123
  for (const track of new Set(found.map((f) => f.track))) track.clips = track.clips.filter((c) => !found.some((f) => f.clip === c));
1126
1124
  if (!e.ripple) return this.outcomes.push({ op: e.op, clips: found.map((f) => f.clip.id) });
1127
1125
  const rippled = /* @__PURE__ */ new Set();
1128
- const groups = [...new Set(found.map((f) => f.track))].filter((t) => !_chunkUXFI3CDZcjs.videoTrackSyncLocked.call(void 0, t)).map((t) => [t]);
1129
- if (found.some((f) => _chunkUXFI3CDZcjs.videoTrackSyncLocked.call(void 0, f.track))) groups.push(found.filter((f) => _chunkUXFI3CDZcjs.videoTrackSyncLocked.call(void 0, f.track)).map((f) => f.track));
1126
+ const groups = [...new Set(found.map((f) => f.track))].filter((t) => !_chunkSFCPGMCTcjs.videoTrackSyncLocked.call(void 0, t)).map((t) => [t]);
1127
+ if (found.some((f) => _chunkSFCPGMCTcjs.videoTrackSyncLocked.call(void 0, f.track))) groups.push(found.filter((f) => _chunkSFCPGMCTcjs.videoTrackSyncLocked.call(void 0, f.track)).map((f) => f.track));
1130
1128
  for (const sources of groups) {
1131
1129
  const tracks = this.rippleTracks(sources);
1132
1130
  tracks.forEach((t) => rippled.add(t));
1133
- const spans = mergeSpans(found.filter((f) => sources.includes(f.track)).map((f) => [f.clip.start, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, f.clip)]));
1131
+ const spans = mergeSpans(found.filter((f) => sources.includes(f.track)).map((f) => [f.clip.start, _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, f.clip)]));
1134
1132
  for (const [from, to] of spans.reverse()) this.close(tracks, from, to);
1135
1133
  }
1136
1134
  return this.outcomes.push({ op: e.op, clips: found.map((f) => f.clip.id), rippled: this.p.tracks.filter((t) => rippled.has(t)).map((t) => t.id) });
@@ -1146,7 +1144,7 @@ var Editor = (_class = class {
1146
1144
  if ("timeRemap" in set) refuse("Set a speed ramp with set_time_remap, which checks it against the media and moves later clips if asked.");
1147
1145
  let stretch = 1;
1148
1146
  if (at.clip.type === "media" && !("duration" in set)) {
1149
- const was = _chunkUXFI3CDZcjs.videoClipSpeed.call(void 0, at.clip);
1147
+ const was = _chunkSFCPGMCTcjs.videoClipSpeed.call(void 0, at.clip);
1150
1148
  const now = "speed" in set ? set.speed : _optionalChain([e, 'access', _13 => _13.remove, 'optionalAccess', _14 => _14.includes, 'call', _15 => _15("speed")]) ? 1 : was;
1151
1149
  if (now !== was) {
1152
1150
  set.duration = at.clip.duration * was / now;
@@ -1154,7 +1152,7 @@ var Editor = (_class = class {
1154
1152
  }
1155
1153
  }
1156
1154
  const next = { ...structuredClone(at.clip), ...set };
1157
- if (stretch !== 1) retimeClipKeys(next, (v) => _chunkUXFI3CDZcjs.retimeVideoAnimatable.call(void 0, v, 0, stretch));
1155
+ if (stretch !== 1) retimeClipKeys(next, (v) => _chunkSFCPGMCTcjs.retimeVideoAnimatable.call(void 0, v, 0, stretch));
1158
1156
  for (const k of _nullishCoalesce(e.remove, () => ( []))) delete next[k];
1159
1157
  const clip = parseVideoClip(next, "set");
1160
1158
  if (clip.type === "media" && clip.asset !== at.clip.asset) this.kindFits(at.track, clip);
@@ -1171,13 +1169,13 @@ var Editor = (_class = class {
1171
1169
  const asset = this.asset(clip.asset);
1172
1170
  if (asset.kind === "image") refuse(`Clip "${clip.id}" is a still ("${asset.id}"), so it has no motion to ramp.`);
1173
1171
  const media = clip;
1174
- const end = _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, media);
1172
+ const end = _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, media);
1175
1173
  const duration = _nullishCoalesce(e.duration, () => ( media.duration));
1176
- if (!(duration >= 1e3 / this.p.fps - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)) refuse(`"duration" must be at least a frame (${Math.ceil(1e3 / this.p.fps)} ms).`);
1174
+ if (!(duration >= 1e3 / this.p.fps - _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON)) refuse(`"duration" must be at least a frame (${Math.ceil(1e3 / this.p.fps)} ms).`);
1177
1175
  if (e.keys === null) {
1178
1176
  if (!media.timeRemap) refuse(`Clip "${clip.id}" has no speed ramp to remove.`);
1179
1177
  const from = (_nullishCoalesce(media.in, () => ( 0))) + media.timeRemap.keys[0].v;
1180
- if (asset.duration !== void 0 && from + duration > asset.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
1178
+ if (asset.duration !== void 0 && from + duration > asset.duration + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON)
1181
1179
  refuse(`At normal speed from ${Math.round(from)} ms, "${clip.id}" would run past the end of "${asset.id}" (${asset.duration} ms); give a duration of at most ${Math.floor(asset.duration - from)} ms.`);
1182
1180
  delete media.timeRemap;
1183
1181
  media.in = from;
@@ -1185,17 +1183,17 @@ var Editor = (_class = class {
1185
1183
  } else {
1186
1184
  if (!Array.isArray(e.keys) || !e.keys.length) refuse('"keys" must be a list of at least one { t, v, ease } (or null to remove the ramp).');
1187
1185
  const remap = parseVideoTimeRemap({ keys: e.keys }, void 0, "keys");
1188
- remap.keys = _chunkUXFI3CDZcjs.sortVideoKeys.call(void 0, remap.keys);
1189
- _chunkUXFI3CDZcjs.checkVideoTimeRemap.call(void 0, remap, "keys");
1190
- const span = _chunkUXFI3CDZcjs.videoTimeRemapSpan.call(void 0, remap);
1191
- if (asset.duration !== void 0 && (_nullishCoalesce(media.in, () => ( 0))) + span.to > asset.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON)
1186
+ remap.keys = _chunkSFCPGMCTcjs.sortVideoKeys.call(void 0, remap.keys);
1187
+ _chunkSFCPGMCTcjs.checkVideoTimeRemap.call(void 0, remap, "keys");
1188
+ const span = _chunkSFCPGMCTcjs.videoTimeRemapSpan.call(void 0, remap);
1189
+ if (asset.duration !== void 0 && (_nullishCoalesce(media.in, () => ( 0))) + span.to > asset.duration + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON)
1192
1190
  refuse(`The ramp plays ${Math.round(span.to)} ms of source from the in point (${_nullishCoalesce(media.in, () => ( 0))} ms), past the end of "${asset.id}" (${asset.duration} ms); it can use at most ${Math.floor(asset.duration - (_nullishCoalesce(media.in, () => ( 0))))} ms.`);
1193
1191
  media.timeRemap = remap;
1194
1192
  delete media.speed;
1195
1193
  }
1196
1194
  const newEnd = media.start + duration;
1197
1195
  const outcome = { op: e.op, clip: clip.id, track: track.id };
1198
- if (Math.abs(newEnd - end) > _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) {
1196
+ if (Math.abs(newEnd - end) > _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) {
1199
1197
  if (e.ripple) {
1200
1198
  const tracks = this.rippleTracks([track]);
1201
1199
  if (newEnd < end) {
@@ -1227,8 +1225,8 @@ var Editor = (_class = class {
1227
1225
  if (clip.type !== "media" && clip.type !== "sequence") refuse(`Clip "${clip.id}" is a ${clip.type === "text" ? "title" : clip.type === "effect" ? "effect clip" : "colour"}, so it has no source to slip; only video, audio and compound clips slip.`);
1228
1226
  const source = clip.type === "sequence" ? `sequence "${clip.sequence}"` : `"${this.asset(clip.asset).id}"`;
1229
1227
  if (clip.type === "media" && this.asset(clip.asset).kind === "image") refuse(`Clip "${clip.id}" is a still ("${clip.asset}"), so it has no source to slip; only video and audio clips slip.`);
1230
- const handles = _chunkUXFI3CDZcjs.videoClipHandles.call(void 0, clip, _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, this.p), _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, this.p));
1231
- const { lead, tail } = _chunkUXFI3CDZcjs.videoClipOverhang.call(void 0, track, clip);
1228
+ const handles = _chunkSFCPGMCTcjs.videoClipHandles.call(void 0, clip, _chunkSFCPGMCTcjs.videoAssetMap.call(void 0, this.p), _chunkSFCPGMCTcjs.videoSequenceMap.call(void 0, this.p));
1229
+ const { lead, tail } = _chunkSFCPGMCTcjs.videoClipOverhang.call(void 0, track, clip);
1232
1230
  const delta = this.clamp(
1233
1231
  e.delta,
1234
1232
  lead - handles.before,
@@ -1246,13 +1244,13 @@ var Editor = (_class = class {
1246
1244
  this.unlocked(track);
1247
1245
  const L = left.clip;
1248
1246
  const R = right.clip;
1249
- if (Math.abs(_chunkUXFI3CDZcjs.videoClipEnd.call(void 0, L) - R.start) > _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) {
1250
- if (Math.abs(_chunkUXFI3CDZcjs.videoClipEnd.call(void 0, R) - L.start) <= _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) refuse(`"${R.id}" comes before "${L.id}"; pass left "${R.id}" and right "${L.id}".`);
1251
- refuse(`"${L.id}" ends at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, L))} but "${R.id}" starts at ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, R.start)}; a roll needs two clips that meet at a cut (use trim_clip to move one edge).`);
1247
+ if (Math.abs(_chunkSFCPGMCTcjs.videoClipEnd.call(void 0, L) - R.start) > _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) {
1248
+ if (Math.abs(_chunkSFCPGMCTcjs.videoClipEnd.call(void 0, R) - L.start) <= _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) refuse(`"${R.id}" comes before "${L.id}"; pass left "${R.id}" and right "${L.id}".`);
1249
+ refuse(`"${L.id}" ends at ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, L))} but "${R.id}" starts at ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, R.start)}; a roll needs two clips that meet at a cut (use trim_clip to move one edge).`);
1252
1250
  }
1253
- const assets = _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, this.p);
1254
- const lo = Math.max(-(L.duration - this.frame), -(_chunkUXFI3CDZcjs.videoClipHandles.call(void 0, R, assets, _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, this.p)).before - _chunkUXFI3CDZcjs.videoClipOverhang.call(void 0, track, R).lead));
1255
- const hi = Math.min(R.duration - this.frame, _chunkUXFI3CDZcjs.videoClipHandles.call(void 0, L, assets, _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, this.p)).after - _chunkUXFI3CDZcjs.videoClipOverhang.call(void 0, track, L).tail);
1251
+ const assets = _chunkSFCPGMCTcjs.videoAssetMap.call(void 0, this.p);
1252
+ const lo = Math.max(-(L.duration - this.frame), -(_chunkSFCPGMCTcjs.videoClipHandles.call(void 0, R, assets, _chunkSFCPGMCTcjs.videoSequenceMap.call(void 0, this.p)).before - _chunkSFCPGMCTcjs.videoClipOverhang.call(void 0, track, R).lead));
1253
+ const hi = Math.min(R.duration - this.frame, _chunkSFCPGMCTcjs.videoClipHandles.call(void 0, L, assets, _chunkSFCPGMCTcjs.videoSequenceMap.call(void 0, this.p)).after - _chunkSFCPGMCTcjs.videoClipOverhang.call(void 0, track, L).tail);
1256
1254
  const delta = this.clamp(
1257
1255
  e.delta,
1258
1256
  lo,
@@ -1268,18 +1266,18 @@ var Editor = (_class = class {
1268
1266
  case "slide_clip": {
1269
1267
  const { track, clip } = this.clip(e.clip);
1270
1268
  this.unlocked(track);
1271
- const before = _chunkUXFI3CDZcjs.videoClipBefore.call(void 0, track, clip);
1272
- const after = _chunkUXFI3CDZcjs.videoClipAfter.call(void 0, track, clip);
1269
+ const before = _chunkSFCPGMCTcjs.videoClipBefore.call(void 0, track, clip);
1270
+ const after = _chunkSFCPGMCTcjs.videoClipAfter.call(void 0, track, clip);
1273
1271
  if (!before && !after) refuse(`"${clip.id}" has no clip right before or after it on track "${track.id}", so there is nothing to slide against; use move_clip.`);
1274
- const assets = _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, this.p);
1275
- const end = _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip);
1272
+ const assets = _chunkSFCPGMCTcjs.videoAssetMap.call(void 0, this.p);
1273
+ const end = _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, clip);
1276
1274
  const others = track.clips.filter((c) => c !== clip);
1277
1275
  const room = {
1278
- earlier: before ? before.duration - this.frame : clip.start - others.filter((c) => _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c) <= clip.start + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON).reduce((m, c) => Math.max(m, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c)), 0),
1279
- later: after ? after.duration - this.frame : others.filter((c) => c.start >= end - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON).reduce((m, c) => Math.min(m, c.start - end), Infinity)
1276
+ earlier: before ? before.duration - this.frame : clip.start - others.filter((c) => _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, c) <= clip.start + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON).reduce((m, c) => Math.max(m, _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, c)), 0),
1277
+ later: after ? after.duration - this.frame : others.filter((c) => c.start >= end - _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON).reduce((m, c) => Math.min(m, c.start - end), Infinity)
1280
1278
  };
1281
- const lo = -Math.min(room.earlier, after ? _chunkUXFI3CDZcjs.videoClipHandles.call(void 0, after, assets, _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, this.p)).before - _chunkUXFI3CDZcjs.videoClipOverhang.call(void 0, track, after).lead : Infinity);
1282
- const hi = Math.min(room.later, before ? _chunkUXFI3CDZcjs.videoClipHandles.call(void 0, before, assets, _chunkUXFI3CDZcjs.videoSequenceMap.call(void 0, this.p)).after - _chunkUXFI3CDZcjs.videoClipOverhang.call(void 0, track, before).tail : Infinity);
1279
+ const lo = -Math.min(room.earlier, after ? _chunkSFCPGMCTcjs.videoClipHandles.call(void 0, after, assets, _chunkSFCPGMCTcjs.videoSequenceMap.call(void 0, this.p)).before - _chunkSFCPGMCTcjs.videoClipOverhang.call(void 0, track, after).lead : Infinity);
1280
+ const hi = Math.min(room.later, before ? _chunkSFCPGMCTcjs.videoClipHandles.call(void 0, before, assets, _chunkSFCPGMCTcjs.videoSequenceMap.call(void 0, this.p)).after - _chunkSFCPGMCTcjs.videoClipOverhang.call(void 0, track, before).tail : Infinity);
1283
1281
  const delta = this.clamp(
1284
1282
  e.delta,
1285
1283
  lo,
@@ -1312,29 +1310,29 @@ var Editor = (_class = class {
1312
1310
  }
1313
1311
  case "split_at": {
1314
1312
  const tracks = this.rangeTracks(e.tracks);
1315
- const lefts = tracks.flatMap((t) => t.clips.filter((c) => c.start < e.at - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON && _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c) > e.at + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON).map((c) => c.id));
1316
- if (!lefts.length) refuse(`No clip runs across ${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, e.at)} on ${e.tracks ? `track${tracks.length > 1 ? "s" : ""} ${tracks.map((t) => `"${t.id}"`).join(", ")}` : "the unlocked tracks"}, so there is nothing to split there.`);
1313
+ const lefts = tracks.flatMap((t) => t.clips.filter((c) => c.start < e.at - _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON && _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, c) > e.at + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON).map((c) => c.id));
1314
+ if (!lefts.length) refuse(`No clip runs across ${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, e.at)} on ${e.tracks ? `track${tracks.length > 1 ? "s" : ""} ${tracks.map((t) => `"${t.id}"`).join(", ")}` : "the unlocked tracks"}, so there is nothing to split there.`);
1317
1315
  const created = this.cutAcross(tracks, e.at).map((c) => c.id);
1318
1316
  return this.outcomes.push({ op: e.op, clips: lefts, created });
1319
1317
  }
1320
1318
  case "set_keyframes": {
1321
1319
  const { track, clip } = this.clip(e.clip);
1322
1320
  this.unlocked(track);
1323
- if (!_chunkUXFI3CDZcjs.VIDEO_KEYFRAME_PROPERTIES.includes(e.property)) refuse(`"${e.property}" cannot be keyframed; use one of ${_chunkUXFI3CDZcjs.VIDEO_KEYFRAME_PROPERTIES.join(", ")}.`);
1321
+ if (!_chunkSFCPGMCTcjs.VIDEO_KEYFRAME_PROPERTIES.includes(e.property)) refuse(`"${e.property}" cannot be keyframed; use one of ${_chunkSFCPGMCTcjs.VIDEO_KEYFRAME_PROPERTIES.join(", ")}.`);
1324
1322
  if (e.property === "volume" && clip.type !== "media" && clip.type !== "sequence") refuse(`Clip "${clip.id}" is a ${clip.type} clip and has no volume; volume keys go on media and compound clips.`);
1325
- const limits = _chunkUXFI3CDZcjs.VIDEO_KEYFRAME_LIMITS[e.property];
1326
- const transform = _chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES.includes(e.property);
1323
+ const limits = _chunkSFCPGMCTcjs.VIDEO_KEYFRAME_LIMITS[e.property];
1324
+ const transform = _chunkSFCPGMCTcjs.VIDEO_TRANSFORM_PROPERTIES.includes(e.property);
1327
1325
  const c = clip;
1328
1326
  const current = transform ? _optionalChain([c, 'access', _18 => _18.transform, 'optionalAccess', _19 => _19[e.property]]) : c[e.property];
1329
1327
  let value;
1330
1328
  if (e.keys === null) {
1331
- const v = _chunkUXFI3CDZcjs.videoValueAt.call(void 0, current, 0, limits.default);
1332
- value = _chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, current) ? v === limits.default ? void 0 : v : current;
1329
+ const v = _chunkSFCPGMCTcjs.videoValueAt.call(void 0, current, 0, limits.default);
1330
+ value = _chunkSFCPGMCTcjs.isVideoKeyframes.call(void 0, current) ? v === limits.default ? void 0 : v : current;
1333
1331
  } else {
1334
1332
  if (!Array.isArray(e.keys) || !e.keys.length) refuse('"keys" must list at least one key { t, v }; pass null to remove the keyframes.');
1335
1333
  let sorted = [];
1336
1334
  try {
1337
- sorted = _chunkUXFI3CDZcjs.sortVideoKeys.call(void 0, e.keys);
1335
+ sorted = _chunkSFCPGMCTcjs.sortVideoKeys.call(void 0, e.keys);
1338
1336
  } catch (error) {
1339
1337
  refuse(error.message);
1340
1338
  }
@@ -1353,12 +1351,12 @@ var Editor = (_class = class {
1353
1351
  this.unlocked(track);
1354
1352
  let at = 0;
1355
1353
  const moved = [];
1356
- for (const clip of _chunkUXFI3CDZcjs.sortedVideoClips.call(void 0, track)) {
1357
- if (clip.start >= (_nullishCoalesce(e.from, () => ( 0))) - _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON && clip.start > at + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) {
1354
+ for (const clip of _chunkSFCPGMCTcjs.sortedVideoClips.call(void 0, track)) {
1355
+ if (clip.start >= (_nullishCoalesce(e.from, () => ( 0))) - _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON && clip.start > at + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) {
1358
1356
  clip.start = Math.max(at, _nullishCoalesce(e.from, () => ( 0)));
1359
1357
  moved.push(clip.id);
1360
1358
  }
1361
- at = Math.max(at, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip));
1359
+ at = Math.max(at, _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, clip));
1362
1360
  }
1363
1361
  return this.outcomes.push({ op: e.op, track: track.id, clips: moved });
1364
1362
  }
@@ -1513,7 +1511,7 @@ function videoClipWaveform(clip, peaks, columns) {
1513
1511
  const step = clip.duration / Math.max(1, n);
1514
1512
  for (let c = 0; c < n; c++) {
1515
1513
  const { min, max } = videoAudioPeakRange(peaks, start + c * step * speed, start + (c + 1) * step * speed);
1516
- const gain = _chunkUXFI3CDZcjs.videoClipSoundGain.call(void 0, clip, (c + 0.5) * step);
1514
+ const gain = _chunkSFCPGMCTcjs.videoClipSoundGain.call(void 0, clip, (c + 0.5) * step);
1517
1515
  out[2 * c] = min * gain;
1518
1516
  out[2 * c + 1] = max * gain;
1519
1517
  }
@@ -2078,7 +2076,7 @@ function videoTranscriptTrack(project, track) {
2078
2076
  if (!project.tracks.some((t) => t.id === track)) throw new Error(`There is no track "${track}"; the tracks are ${project.tracks.map((t) => `"${t.id}"`).join(", ")}.`);
2079
2077
  return track;
2080
2078
  }
2081
- const assets = _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, project);
2079
+ const assets = _chunkSFCPGMCTcjs.videoAssetMap.call(void 0, project);
2082
2080
  const transcribed = (t) => t.clips.some((c) => c.type === "media" && _optionalChain([assets, 'access', _21 => _21.get, 'call', _22 => _22(c.asset), 'optionalAccess', _23 => _23.transcript, 'optionalAccess', _24 => _24.length]));
2083
2081
  return _nullishCoalesce(_optionalChain([(_nullishCoalesce(project.tracks.find((t) => t.kind === "audio" && transcribed(t)), () => ( project.tracks.find(transcribed)))), 'optionalAccess', _25 => _25.id]), () => ( null));
2084
2082
  }
@@ -2086,16 +2084,16 @@ function videoTimelineTranscript(project, options = {}) {
2086
2084
  const id = videoTranscriptTrack(project, options.track);
2087
2085
  if (!id) return [];
2088
2086
  const track = project.tracks.find((t) => t.id === id);
2089
- const assets = _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, project);
2087
+ const assets = _chunkSFCPGMCTcjs.videoAssetMap.call(void 0, project);
2090
2088
  const out = [];
2091
- for (const clip of _chunkUXFI3CDZcjs.sortedVideoClips.call(void 0, track)) {
2089
+ for (const clip of _chunkSFCPGMCTcjs.sortedVideoClips.call(void 0, track)) {
2092
2090
  if (clip.type !== "media") continue;
2093
2091
  const words = _optionalChain([assets, 'access', _26 => _26.get, 'call', _27 => _27(clip.asset), 'optionalAccess', _28 => _28.transcript]);
2094
2092
  if (!_optionalChain([words, 'optionalAccess', _29 => _29.length])) continue;
2095
- const speed = _chunkUXFI3CDZcjs.videoClipSpeed.call(void 0, clip);
2093
+ const speed = _chunkSFCPGMCTcjs.videoClipSpeed.call(void 0, clip);
2096
2094
  const from = _nullishCoalesce(clip.in, () => ( 0));
2097
2095
  const to = from + clip.duration * speed;
2098
- const toTimeline = (s) => Math.min(_chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip), Math.max(clip.start, clip.start + (s - from) / speed));
2096
+ const toTimeline = (s) => Math.min(_chunkSFCPGMCTcjs.videoClipEnd.call(void 0, clip), Math.max(clip.start, clip.start + (s - from) / speed));
2099
2097
  words.forEach((w, index) => {
2100
2098
  const mid = (w.start + w.end) / 2;
2101
2099
  if (mid < from || mid >= to) return;
@@ -2140,19 +2138,19 @@ function findVideoTranscriptPauses(words, options = {}) {
2140
2138
  let to = b.start - keep;
2141
2139
  if (options.fps) {
2142
2140
  const f = 1e3 / options.fps;
2143
- from = _chunkUXFI3CDZcjs.snapToVideoFrame.call(void 0, Math.ceil(from / f - 1e-9) * f, options.fps);
2144
- to = _chunkUXFI3CDZcjs.snapToVideoFrame.call(void 0, Math.floor(to / f + 1e-9) * f, options.fps);
2141
+ from = _chunkSFCPGMCTcjs.snapToVideoFrame.call(void 0, Math.ceil(from / f - 1e-9) * f, options.fps);
2142
+ to = _chunkSFCPGMCTcjs.snapToVideoFrame.call(void 0, Math.floor(to / f + 1e-9) * f, options.fps);
2145
2143
  }
2146
- if (to - from > _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) out.push({ from, to, text: `(pause after "${a.word}")` });
2144
+ if (to - from > _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) out.push({ from, to, text: `(pause after "${a.word}")` });
2147
2145
  }
2148
2146
  return out;
2149
2147
  }
2150
2148
  function mergeVideoRanges(ranges) {
2151
- const sorted = ranges.filter((r) => r.to - r.from > _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON).map((r) => ({ from: r.from, to: r.to })).sort((a, b) => a.from - b.from);
2149
+ const sorted = ranges.filter((r) => r.to - r.from > _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON).map((r) => ({ from: r.from, to: r.to })).sort((a, b) => a.from - b.from);
2152
2150
  const out = [];
2153
2151
  for (const r of sorted) {
2154
2152
  const last = out[out.length - 1];
2155
- if (last && r.from <= last.to + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON) last.to = Math.max(last.to, r.to);
2153
+ if (last && r.from <= last.to + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON) last.to = Math.max(last.to, r.to);
2156
2154
  else out.push(r);
2157
2155
  }
2158
2156
  return out;
@@ -2236,7 +2234,7 @@ function videoProxyFfmpeg(asset, options = {}) {
2236
2234
  output
2237
2235
  ];
2238
2236
  const proxy = { scale, src: output, ...asset.width && asset.height ? { width: Math.trunc(asset.width * scale / 2) * 2, height: Math.trunc(asset.height * scale / 2) * 2 } : {} };
2239
- return { asset: asset.id, args, command: ["ffmpeg", ...args].map(_chunkUXFI3CDZcjs.videoShellQuote).join(" "), proxy };
2237
+ return { asset: asset.id, args, command: ["ffmpeg", ...args].map(_chunkSFCPGMCTcjs.videoShellQuote).join(" "), proxy };
2240
2238
  }
2241
2239
  function videoProxyPlan(project, options = {}) {
2242
2240
  const scale = _nullishCoalesce(options.scale, () => ( 0.5));
@@ -2262,7 +2260,7 @@ var videoSourceFrameTime = (frame, fps) => (frame + 0.5) * 1e3 / fps;
2262
2260
  var videoFrameCacheKey = (src, frame) => `${frame}@${src}`;
2263
2261
  function videoFrameRequestsAt(project, time, srcFor = (l) => l.src) {
2264
2262
  const out = [];
2265
- for (const layer of _chunkUXFI3CDZcjs.videoFrameLeafLayers.call(void 0, _chunkUXFI3CDZcjs.videoFrameAt.call(void 0, project, time).layers)) {
2263
+ for (const layer of _chunkSFCPGMCTcjs.videoFrameLeafLayers.call(void 0, _chunkSFCPGMCTcjs.videoFrameAt.call(void 0, project, time).layers)) {
2266
2264
  if (layer.type !== "media" || layer.assetKind !== "video") continue;
2267
2265
  const src = srcFor(layer);
2268
2266
  if (!src) continue;
@@ -2603,7 +2601,7 @@ var VideoPreviewEngine = (_class5 = class {
2603
2601
  if (this.destroyed) return;
2604
2602
  const state = this.source.getState();
2605
2603
  const { project, time, playing } = state;
2606
- const frame = _chunkUXFI3CDZcjs.videoFrameAt.call(void 0, project, time);
2604
+ const frame = _chunkSFCPGMCTcjs.videoFrameAt.call(void 0, project, time);
2607
2605
  const scale = resolveVideoPreviewScale(_nullishCoalesce(this.options.previewScale, () => ( state.previewScale)), this.resolutionFor(project.width));
2608
2606
  const assets = new Map(project.assets.map((a) => [a.id, a]));
2609
2607
  this.srcFor = (layer) => videoPreviewSrc(assets.get(_nullishCoalesce(layer.asset, () => ( ""))), scale, layer.src);
@@ -2633,7 +2631,7 @@ var VideoPreviewEngine = (_class5 = class {
2633
2631
  }
2634
2632
  };
2635
2633
  const sounding = new Map(frame.audio.map((a) => [a.clip, a]));
2636
- for (const layer of _chunkUXFI3CDZcjs.videoFrameLeafLayers.call(void 0, frame.layers)) {
2634
+ for (const layer of _chunkSFCPGMCTcjs.videoFrameLeafLayers.call(void 0, frame.layers)) {
2637
2635
  if (layer.type !== "media" || layer.assetKind !== "video" || !layer.src) continue;
2638
2636
  const sound = sounding.get(layer.clip);
2639
2637
  sync(layer.clip, this.srcFor(layer), "video", _nullishCoalesce(layer.sourceTime, () => ( 0)), _nullishCoalesce(_optionalChain([sound, 'optionalAccess', _71 => _71.speed]), () => ( 1)), sound ? sound.gain : null);
@@ -2645,9 +2643,9 @@ var VideoPreviewEngine = (_class5 = class {
2645
2643
  }
2646
2644
  /** With effects, the frame is drawn at the start of its frame, so effect pictures are cached once per frame. */
2647
2645
  drawable(project, frame) {
2648
- if (!_optionalChain([this, 'access', _72 => _72.effects, 'optionalAccess', _73 => _73.available]) || !_chunkUXFI3CDZcjs.videoLayersUseEffects.call(void 0, frame.layers)) return frame;
2649
- const at = _chunkUXFI3CDZcjs.videoEffectFrameTime.call(void 0, frame.time, project.fps);
2650
- return at === frame.time ? frame : { ..._chunkUXFI3CDZcjs.videoFrameAt.call(void 0, project, at), time: frame.time };
2646
+ if (!_optionalChain([this, 'access', _72 => _72.effects, 'optionalAccess', _73 => _73.available]) || !_chunkSFCPGMCTcjs.videoLayersUseEffects.call(void 0, frame.layers)) return frame;
2647
+ const at = _chunkSFCPGMCTcjs.videoEffectFrameTime.call(void 0, frame.time, project.fps);
2648
+ return at === frame.time ? frame : { ..._chunkSFCPGMCTcjs.videoFrameAt.call(void 0, project, at), time: frame.time };
2651
2649
  }
2652
2650
  redraw() {
2653
2651
  if (this.scheduled || this.destroyed) return;
@@ -2656,7 +2654,7 @@ var VideoPreviewEngine = (_class5 = class {
2656
2654
  this.scheduled = false;
2657
2655
  if (this.destroyed) return;
2658
2656
  const { project, time } = this.source.getState();
2659
- this.draw(this.drawable(project, _chunkUXFI3CDZcjs.videoFrameAt.call(void 0, project, time)));
2657
+ this.draw(this.drawable(project, _chunkSFCPGMCTcjs.videoFrameAt.call(void 0, project, time)));
2660
2658
  });
2661
2659
  }
2662
2660
  __init33() {this.sourceFor = (layer) => {
@@ -2699,7 +2697,7 @@ var VideoPreviewEngine = (_class5 = class {
2699
2697
  if (!source) this.complete = false;
2700
2698
  return source;
2701
2699
  };
2702
- _chunkUXFI3CDZcjs.drawVideoFrame.call(void 0, this.ctx, frame, sourceFor, resolution, {
2700
+ _chunkSFCPGMCTcjs.drawVideoFrame.call(void 0, this.ctx, frame, sourceFor, resolution, {
2703
2701
  defineSvgFilter: this.defineSvgFilter,
2704
2702
  lutFor: this.lutFor,
2705
2703
  scratch: this.scratch,
@@ -2799,17 +2797,17 @@ var VideoEditorController = (_class6 = class {
2799
2797
  constructor(options = {}) {;_class6.prototype.__init37.call(this);_class6.prototype.__init38.call(this);_class6.prototype.__init39.call(this);_class6.prototype.__init40.call(this);_class6.prototype.__init41.call(this);_class6.prototype.__init42.call(this);_class6.prototype.__init43.call(this);_class6.prototype.__init44.call(this);_class6.prototype.__init45.call(this);
2800
2798
  this.history = _nullishCoalesce(options.history, () => ( new (0, _chunkQKLRAA4Tcjs.HistoryManager)()));
2801
2799
  this.audioPeaks = options.audioPeaks instanceof VideoAudioPeaksCache ? options.audioPeaks : new VideoAudioPeaksCache(options.audioPeaks);
2802
- this.luts = options.luts instanceof _chunkUXFI3CDZcjs.VideoLutCache ? options.luts : new (0, _chunkUXFI3CDZcjs.VideoLutCache)(options.luts);
2800
+ this.luts = options.luts instanceof _chunkSFCPGMCTcjs.VideoLutCache ? options.luts : new (0, _chunkSFCPGMCTcjs.VideoLutCache)(options.luts);
2803
2801
  this.frameCache = _nullishCoalesce(options.frameCache, () => ( null));
2804
- this.effects = new (0, _chunkIOXKXQNWcjs.EffectsSlot)();
2802
+ this.effects = new (0, _chunkJODTP4DPcjs.EffectsSlot)();
2805
2803
  if (options.effects) this.effects.set(options.effects);
2806
- this.effectsEngine = new (0, _chunkUXFI3CDZcjs.VideoEffectsEngine)({ slot: this.effects });
2804
+ this.effectsEngine = new (0, _chunkSFCPGMCTcjs.VideoEffectsEngine)({ slot: this.effects });
2807
2805
  this.project = options.project ? parseVideoProject(options.project) : createVideoProject();
2808
2806
  this.issues = checkVideoProject(this.project);
2809
2807
  this.readOnly = _nullishCoalesce(options.readOnly, () => ( false));
2810
2808
  this.previewScale = checkPreviewScale(_nullishCoalesce(options.previewScale, () => ( "auto")));
2811
2809
  this.onChange = options.onChange;
2812
- this.player = new (0, _chunk477UVMNRcjs.AnimationPlayer)({ clock: options.clock, duration: () => _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, this.project), loop: "none" });
2810
+ this.player = new (0, _chunk477UVMNRcjs.AnimationPlayer)({ clock: options.clock, duration: () => _chunkSFCPGMCTcjs.videoProjectDuration.call(void 0, this.project), loop: "none" });
2813
2811
  this.state = this.computeState();
2814
2812
  this.connect();
2815
2813
  }
@@ -2846,12 +2844,12 @@ var VideoEditorController = (_class6 = class {
2846
2844
  const h = this.history.getState();
2847
2845
  return {
2848
2846
  project: this.project,
2849
- duration: _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, this.project),
2847
+ duration: _chunkSFCPGMCTcjs.videoProjectDuration.call(void 0, this.project),
2850
2848
  time: p.time,
2851
2849
  playing: p.playing,
2852
2850
  loop: p.loop,
2853
2851
  selection: this.selection,
2854
- current: _chunkUXFI3CDZcjs.videoClipsAt.call(void 0, this.project, p.time).map((c) => c.clip.id),
2852
+ current: _chunkSFCPGMCTcjs.videoClipsAt.call(void 0, this.project, p.time).map((c) => c.clip.id),
2855
2853
  issues: this.issues,
2856
2854
  readOnly: this.readOnly,
2857
2855
  error: this.error,
@@ -2883,7 +2881,7 @@ var VideoEditorController = (_class6 = class {
2883
2881
  this.issues = checkVideoProject(project);
2884
2882
  const ids = new Set(project.tracks.flatMap((t) => t.clips.map((c) => c.id)));
2885
2883
  if (this.selection.some((id) => !ids.has(id))) this.selection = this.selection.filter((id) => ids.has(id));
2886
- this.player.setDuration(() => _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, this.project));
2884
+ this.player.setDuration(() => _chunkSFCPGMCTcjs.videoProjectDuration.call(void 0, this.project));
2887
2885
  } finally {
2888
2886
  this.applying = false;
2889
2887
  }
@@ -2965,7 +2963,7 @@ var VideoEditorController = (_class6 = class {
2965
2963
  }
2966
2964
  /** Selects clips (unknown ids are dropped). `add` toggles them into the current selection. */
2967
2965
  select(clips, options = {}) {
2968
- const known = _nullishCoalesce(_optionalChain([clips, 'optionalAccess', _89 => _89.filter, 'call', _90 => _90((id) => _chunkUXFI3CDZcjs.findVideoClip.call(void 0, this.project, id))]), () => ( []));
2966
+ const known = _nullishCoalesce(_optionalChain([clips, 'optionalAccess', _89 => _89.filter, 'call', _90 => _90((id) => _chunkSFCPGMCTcjs.findVideoClip.call(void 0, this.project, id))]), () => ( []));
2969
2967
  let next;
2970
2968
  if (options.add) {
2971
2969
  next = [...this.selection];
@@ -2992,7 +2990,7 @@ var VideoEditorController = (_class6 = class {
2992
2990
  step(frames) {
2993
2991
  this.player.pause();
2994
2992
  const fps = this.project.fps;
2995
- this.player.seek(Math.max(0, _chunkUXFI3CDZcjs.snapToVideoFrame.call(void 0, this.player.currentTime, fps) + frames * 1e3 / fps));
2993
+ this.player.seek(Math.max(0, _chunkSFCPGMCTcjs.snapToVideoFrame.call(void 0, this.player.currentTime, fps) + frames * 1e3 / fps));
2996
2994
  }
2997
2995
  setLoop(loop) {
2998
2996
  this.player.setLoop(loop);
@@ -3009,14 +3007,14 @@ var VideoEditorController = (_class6 = class {
3009
3007
  */
3010
3008
  snap(time, options = {}) {
3011
3009
  const threshold = _nullishCoalesce(options.threshold, () => ( 8 * 1e3 / this.project.fps));
3012
- const points = _chunkUXFI3CDZcjs.videoSnapPoints.call(void 0, this.project, { exclude: options.exclude, playhead: options.playhead === false ? void 0 : this.player.currentTime });
3013
- const hit = _chunkUXFI3CDZcjs.snapVideoTime.call(void 0, time, points, threshold);
3014
- return hit.snapped !== null ? hit : { time: Math.max(0, _chunkUXFI3CDZcjs.snapToVideoFrame.call(void 0, time, this.project.fps)), snapped: null };
3010
+ const points = _chunkSFCPGMCTcjs.videoSnapPoints.call(void 0, this.project, { exclude: options.exclude, playhead: options.playhead === false ? void 0 : this.player.currentTime });
3011
+ const hit = _chunkSFCPGMCTcjs.snapVideoTime.call(void 0, time, points, threshold);
3012
+ return hit.snapped !== null ? hit : { time: Math.max(0, _chunkSFCPGMCTcjs.snapToVideoFrame.call(void 0, time, this.project.fps)), snapped: null };
3015
3013
  }
3016
3014
  /** Splits the selected clips (or every clip) under the playhead there, as one undo step. */
3017
3015
  splitAtPlayhead() {
3018
- const t = _chunkUXFI3CDZcjs.snapToVideoFrame.call(void 0, this.player.currentTime, this.project.fps);
3019
- const under = _chunkUXFI3CDZcjs.videoClipsAt.call(void 0, this.project, t).filter(({ clip }) => t > clip.start && t < _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip));
3016
+ const t = _chunkSFCPGMCTcjs.snapToVideoFrame.call(void 0, this.player.currentTime, this.project.fps);
3017
+ const under = _chunkSFCPGMCTcjs.videoClipsAt.call(void 0, this.project, t).filter(({ clip }) => t > clip.start && t < _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, clip));
3020
3018
  const chosen = this.selection.length ? under.filter(({ clip }) => this.selection.includes(clip.id)) : under;
3021
3019
  if (!chosen.length) return this.refuse("No clip is under the playhead to split.");
3022
3020
  return this.apply(chosen.map(({ clip }) => ({ op: "split_clip", clip: clip.id, at: t })), "Split");
@@ -3044,7 +3042,7 @@ var VideoEditorController = (_class6 = class {
3044
3042
  /** The provider's description of an effect, checked for `place` (rejects without a provider or for an unknown id). */
3045
3043
  async describeEffect(effect, place) {
3046
3044
  const d = await this.effects.require().describe(effect);
3047
- if (place) _chunkUXFI3CDZcjs.checkVideoEffectPlace.call(void 0, d, place);
3045
+ if (place) _chunkSFCPGMCTcjs.checkVideoEffectPlace.call(void 0, d, place);
3048
3046
  return d;
3049
3047
  }
3050
3048
  refused(message) {
@@ -3057,7 +3055,7 @@ var VideoEditorController = (_class6 = class {
3057
3055
  try {
3058
3056
  plan = await run();
3059
3057
  } catch (error) {
3060
- if (_chunkIOXKXQNWcjs.isEffectError.call(void 0, error) || error instanceof Error) return this.refused(error.message);
3058
+ if (_chunkJODTP4DPcjs.isEffectError.call(void 0, error) || error instanceof Error) return this.refused(error.message);
3061
3059
  throw error;
3062
3060
  }
3063
3061
  const result = this.apply(plan.edit, plan.label, { merge });
@@ -3065,7 +3063,7 @@ var VideoEditorController = (_class6 = class {
3065
3063
  return { ...result, clip: plan.clip, ...plan.effect ? { effect: plan.effect() } : {} };
3066
3064
  }
3067
3065
  clipOrThrow(id) {
3068
- const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, this.project, id);
3066
+ const at = _chunkSFCPGMCTcjs.findVideoClip.call(void 0, this.project, id);
3069
3067
  if (!at) throw new Error(`There is no clip "${id}"; list_applied_effects or get_video_project lists the clips.`);
3070
3068
  return at.clip;
3071
3069
  }
@@ -3078,7 +3076,7 @@ var VideoEditorController = (_class6 = class {
3078
3076
  return this.effectEdit(async () => {
3079
3077
  const current = this.clipOrThrow(clip);
3080
3078
  const d = await this.describeEffect(effect, "clip");
3081
- const values = _chunkUXFI3CDZcjs.checkVideoEffectValues.call(void 0, d, options.values, { keyframes: true });
3079
+ const values = _chunkSFCPGMCTcjs.checkVideoEffectValues.call(void 0, d, options.values, { keyframes: true });
3082
3080
  const stack = [..._nullishCoalesce(current.effects, () => ( []))];
3083
3081
  const taken = new Set(stack.map((e) => e.id));
3084
3082
  let n = 1;
@@ -3114,7 +3112,7 @@ var VideoEditorController = (_class6 = class {
3114
3112
  if (!(k in d.controls.properties)) throw new Error(`"${k}" is not a control of "${d.id}"; its controls are ${Object.keys(d.controls.properties).join(", ")}.`);
3115
3113
  base[k] = d.defaults[k];
3116
3114
  }
3117
- next.values = _chunkUXFI3CDZcjs.checkVideoEffectValues.call(void 0, d, given, { base, keyframes: true });
3115
+ next.values = _chunkSFCPGMCTcjs.checkVideoEffectValues.call(void 0, d, given, { base, keyframes: true });
3118
3116
  }
3119
3117
  if (changes.enabled !== void 0) {
3120
3118
  if (changes.enabled) delete next.enabled;
@@ -3132,7 +3130,7 @@ var VideoEditorController = (_class6 = class {
3132
3130
  removeClipEffect(clip, instance) {
3133
3131
  const reason = this.readOnlyReason();
3134
3132
  if (reason) return this.refused(reason);
3135
- const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, this.project, clip);
3133
+ const at = _chunkSFCPGMCTcjs.findVideoClip.call(void 0, this.project, clip);
3136
3134
  if (!at) return this.refused(`There is no clip "${clip}".`);
3137
3135
  const stack = _nullishCoalesce(at.clip.effects, () => ( []));
3138
3136
  const was = stack.find((e) => e.id === instance);
@@ -3149,7 +3147,7 @@ var VideoEditorController = (_class6 = class {
3149
3147
  return this.effectEdit(async () => {
3150
3148
  this.clipOrThrow(clip);
3151
3149
  const d = await this.describeEffect(effect, "transition");
3152
- const values = _chunkUXFI3CDZcjs.checkVideoEffectValues.call(void 0, d, options.values);
3150
+ const values = _chunkSFCPGMCTcjs.checkVideoEffectValues.call(void 0, d, options.values);
3153
3151
  const duration = _nullishCoalesce(_nullishCoalesce(options.duration, () => ( d.duration)), () => ( 1e3));
3154
3152
  return { edit: { op: "set_transition", clip, transition: { type: "effect", duration, effect: { effect: d.id, provider: this.effects.require().id, name: d.name, values } } }, label: `Transition ${d.name}`, clip };
3155
3153
  });
@@ -3162,7 +3160,7 @@ var VideoEditorController = (_class6 = class {
3162
3160
  addEffectClip(track, effect, options = {}) {
3163
3161
  return this.effectEdit(async () => {
3164
3162
  const d = await this.describeEffect(effect, "generator");
3165
- const values = _chunkUXFI3CDZcjs.checkVideoEffectValues.call(void 0, d, options.values, { keyframes: true });
3163
+ const values = _chunkSFCPGMCTcjs.checkVideoEffectValues.call(void 0, d, options.values, { keyframes: true });
3166
3164
  const duration = _nullishCoalesce(_nullishCoalesce(options.duration, () => ( d.duration)), () => ( 5e3));
3167
3165
  const label = `Add ${d.name}`;
3168
3166
  const clipId = _nullishCoalesce(options.id, () => ( ""));
@@ -3184,42 +3182,42 @@ var VideoEditorController = (_class6 = class {
3184
3182
  if (part === "generator") {
3185
3183
  if (current.type !== "effect") throw new Error(`Clip "${clip}" is not an effect clip.`);
3186
3184
  const d2 = await this.describeEffect(current.effect);
3187
- return { edit: { op: "update_clip", clip, set: { values: _chunkUXFI3CDZcjs.checkVideoEffectValues.call(void 0, d2, values, { base: _nullishCoalesce(current.values, () => ( {})), keyframes: true }) } }, label: `Change ${_nullishCoalesce(current.name, () => ( d2.name))}`, clip };
3185
+ return { edit: { op: "update_clip", clip, set: { values: _chunkSFCPGMCTcjs.checkVideoEffectValues.call(void 0, d2, values, { base: _nullishCoalesce(current.values, () => ( {})), keyframes: true }) } }, label: `Change ${_nullishCoalesce(current.name, () => ( d2.name))}`, clip };
3188
3186
  }
3189
3187
  const t = current.transition;
3190
3188
  if (_optionalChain([t, 'optionalAccess', _94 => _94.type]) !== "effect" || !t.effect) throw new Error(`Clip "${clip}" has no effect transition.`);
3191
3189
  const d = await this.describeEffect(t.effect.effect);
3192
- const merged = _chunkUXFI3CDZcjs.checkVideoEffectValues.call(void 0, d, values, { base: _nullishCoalesce(t.effect.values, () => ( {})) });
3190
+ const merged = _chunkSFCPGMCTcjs.checkVideoEffectValues.call(void 0, d, values, { base: _nullishCoalesce(t.effect.values, () => ( {})) });
3193
3191
  return { edit: { op: "set_transition", clip, transition: { ...t, effect: { ...t.effect, values: merged } } }, label: `Change transition ${d.name}`, clip };
3194
3192
  }, options.merge);
3195
3193
  }
3196
3194
  /** Keys for one numeric control of a clip effect (clip-relative ms), or `null` to stop animating it (keeping its value at the clip's start). */
3197
3195
  setClipEffectKeyframes(clip, instance, control, keys) {
3198
- const current = _optionalChain([_chunkUXFI3CDZcjs.findVideoClip.call(void 0, this.project, clip), 'optionalAccess', _95 => _95.clip]);
3196
+ const current = _optionalChain([_chunkSFCPGMCTcjs.findVideoClip.call(void 0, this.project, clip), 'optionalAccess', _95 => _95.clip]);
3199
3197
  const was = _optionalChain([current, 'optionalAccess', _96 => _96.effects, 'optionalAccess', _97 => _97.find, 'call', _98 => _98((e) => e.id === instance)]);
3200
3198
  const value = _optionalChain([was, 'optionalAccess', _99 => _99.values, 'optionalAccess', _100 => _100[control]]);
3201
- const plain = keys === null ? _chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, value) ? _optionalChain([value, 'access', _101 => _101.keys, 'access', _102 => _102[0], 'optionalAccess', _103 => _103.v]) : value : { keys: [...keys].sort((a, b) => a.t - b.t) };
3199
+ const plain = keys === null ? _chunkSFCPGMCTcjs.isVideoKeyframes.call(void 0, value) ? _optionalChain([value, 'access', _101 => _101.keys, 'access', _102 => _102[0], 'optionalAccess', _103 => _103.v]) : value : { keys: [...keys].sort((a, b) => a.t - b.t) };
3202
3200
  return this.updateClipEffect(clip, instance, { values: { [control]: _nullishCoalesce(plain, () => ( null)) } });
3203
3201
  }
3204
3202
  /** What plays at `time` (default: the playhead). */
3205
3203
  frame(time = this.player.currentTime) {
3206
- return _chunkUXFI3CDZcjs.videoFrameAt.call(void 0, this.project, time);
3204
+ return _chunkSFCPGMCTcjs.videoFrameAt.call(void 0, this.project, time);
3207
3205
  }
3208
3206
  /** The frame at `time` (default: the playhead) as SVG. */
3209
3207
  toSvg(time = this.player.currentTime, options = {}) {
3210
- return _chunkUXFI3CDZcjs.videoProjectSvg.call(void 0, this.project, time, { lutFor: (src) => this.luts.peek(src), ...options });
3208
+ return _chunkSFCPGMCTcjs.videoProjectSvg.call(void 0, this.project, time, { lutFor: (src) => this.luts.peek(src), ...options });
3211
3209
  }
3212
3210
  /** The project as an ffmpeg command. */
3213
3211
  toFfmpeg(options = {}) {
3214
- return _chunkUXFI3CDZcjs.toVideoFfmpeg.call(void 0, this.project, options);
3212
+ return _chunkSFCPGMCTcjs.toVideoFfmpeg.call(void 0, this.project, options);
3215
3213
  }
3216
3214
  /** The ffmpeg command that measures the mix's loudness (see `toVideoLoudnessMeasure`). */
3217
3215
  toLoudnessMeasure(options = {}) {
3218
- return _chunkUXFI3CDZcjs.toVideoLoudnessMeasure.call(void 0, this.project, options);
3216
+ return _chunkSFCPGMCTcjs.toVideoLoudnessMeasure.call(void 0, this.project, options);
3219
3217
  }
3220
3218
  /** One track as a CMX 3600 EDL. */
3221
3219
  toEdl(options = {}) {
3222
- return _chunkUXFI3CDZcjs.toVideoEdl.call(void 0, this.project, options);
3220
+ return _chunkSFCPGMCTcjs.toVideoEdl.call(void 0, this.project, options);
3223
3221
  }
3224
3222
  }, _class6);
3225
3223
  function checkPreviewScale(scale) {
@@ -3238,12 +3236,12 @@ function videoRulerTicks(duration, pxPerSecond, fps) {
3238
3236
  const ticks = [];
3239
3237
  for (let t = 0; t <= duration + 1e-6; t += step) {
3240
3238
  const isMajor = Math.abs(t / major - Math.round(t / major)) < 1e-9;
3241
- ticks.push({ time: t, x: t * pxPerMs, major: isMajor, ...isMajor ? { label: _chunkUXFI3CDZcjs.formatVideoTimecode.call(void 0, t, fps).replace(/^00:/, "") } : {} });
3239
+ ticks.push({ time: t, x: t * pxPerMs, major: isMajor, ...isMajor ? { label: _chunkSFCPGMCTcjs.formatVideoTimecode.call(void 0, t, fps).replace(/^00:/, "") } : {} });
3242
3240
  }
3243
3241
  return ticks;
3244
3242
  }
3245
3243
  function videoClipShowsWaveform(clip, asset, mode = "audio") {
3246
- if (clip.type !== "media" || mode === "none" || !_chunkUXFI3CDZcjs.videoAssetHasSound.call(void 0, asset)) return false;
3244
+ if (clip.type !== "media" || mode === "none" || !_chunkSFCPGMCTcjs.videoAssetHasSound.call(void 0, asset)) return false;
3247
3245
  return mode === "all" || asset.kind === "audio";
3248
3246
  }
3249
3247
  var VIDEO_CLIP_ANIMATION_LABELS = {
@@ -3302,11 +3300,11 @@ function videoClipLabel(clip, asset, sequence) {
3302
3300
  if (clip.type === "sequence") return `Compound: ${_nullishCoalesce(_optionalChain([sequence, 'optionalAccess', _104 => _104.name]), () => ( clip.sequence))}`;
3303
3301
  if (clip.type === "effect") return `Effect: ${clip.effect}`;
3304
3302
  const base = _nullishCoalesce(_nullishCoalesce(_optionalChain([asset, 'optionalAccess', _105 => _105.name]), () => ( _optionalChain([asset, 'optionalAccess', _106 => _106.src, 'access', _107 => _107.replace, 'call', _108 => _108(/^.*[\\/]/, "")]))), () => ( clip.asset));
3305
- const speed = _chunkUXFI3CDZcjs.videoClipSpeed.call(void 0, clip);
3303
+ const speed = _chunkSFCPGMCTcjs.videoClipSpeed.call(void 0, clip);
3306
3304
  return speed !== 1 ? `${base} (${Math.round(speed * 100)}%)` : base;
3307
3305
  }
3308
3306
  function planVideoClipDrag(project, input) {
3309
- const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project, input.clip);
3307
+ const at = _chunkSFCPGMCTcjs.findVideoClip.call(void 0, project, input.clip);
3310
3308
  if (!at) return null;
3311
3309
  const { clip, track } = at;
3312
3310
  const snap = _nullishCoalesce(input.snap, () => ( ((t) => t)));
@@ -3323,17 +3321,17 @@ function planVideoClipDrag(project, input) {
3323
3321
  }
3324
3322
  const minimum = 1e3 / project.fps;
3325
3323
  if (input.mode === "trim-start") {
3326
- const to2 = Math.min(snap(Math.max(0, clip.start + input.delta)), _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip) - minimum);
3324
+ const to2 = Math.min(snap(Math.max(0, clip.start + input.delta)), _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, clip) - minimum);
3327
3325
  const changed2 = Math.abs(to2 - clip.start) > 1e-6;
3328
- const plan = input.ripple ? { start: clip.start, duration: clip.duration - (to2 - clip.start) } : { start: to2, duration: _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip) - to2 };
3326
+ const plan = input.ripple ? { start: clip.start, duration: clip.duration - (to2 - clip.start) } : { start: to2, duration: _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, clip) - to2 };
3329
3327
  return { ...plan, track: track.id, edit: changed2 ? { op: "trim_clip", clip: clip.id, edge: "start", to: to2, ...input.ripple ? { ripple: true } : {} } : null };
3330
3328
  }
3331
- const to = Math.max(snap(_chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip) + input.delta), clip.start + minimum);
3332
- const changed = Math.abs(to - _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, clip)) > 1e-6;
3329
+ const to = Math.max(snap(_chunkSFCPGMCTcjs.videoClipEnd.call(void 0, clip) + input.delta), clip.start + minimum);
3330
+ const changed = Math.abs(to - _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, clip)) > 1e-6;
3333
3331
  return { start: clip.start, duration: to - clip.start, track: track.id, edit: changed ? { op: "trim_clip", clip: clip.id, edge: "end", to, ...input.ripple ? { ripple: true } : {} } : null };
3334
3332
  }
3335
3333
  function videoDropTracks(project, clipId) {
3336
- const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project, clipId);
3334
+ const at = _chunkSFCPGMCTcjs.findVideoClip.call(void 0, project, clipId);
3337
3335
  if (!at) return [];
3338
3336
  return project.tracks.filter((t) => t.kind === at.track.kind && !t.locked).map((t) => t.id);
3339
3337
  }
@@ -3342,7 +3340,7 @@ function videoDragLabel(edit) {
3342
3340
  return edit.op === "trim_clip" && edit.ripple ? "Ripple trim" : "Trim clip";
3343
3341
  }
3344
3342
  function videoAssetDropEdit(project, assetId, options = {}) {
3345
- const asset = _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, project).get(assetId);
3343
+ const asset = _chunkSFCPGMCTcjs.videoAssetMap.call(void 0, project).get(assetId);
3346
3344
  if (!asset) return null;
3347
3345
  const kind = asset.kind === "audio" ? "audio" : "video";
3348
3346
  const track = _nullishCoalesce(options.track, () => ( _optionalChain([project, 'access', _109 => _109.tracks, 'access', _110 => _110.find, 'call', _111 => _111((t) => t.kind === kind && !t.locked), 'optionalAccess', _112 => _112.id])));
@@ -3394,25 +3392,25 @@ var KEY_LABELS = {
3394
3392
  scale: { label: "Scale", step: 0.05 },
3395
3393
  rotation: { label: "Rotation", step: 1 }
3396
3394
  };
3397
- var animatableOf = (clip, property) => _chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([clip, 'access', _113 => _113.transform, 'optionalAccess', _114 => _114[property]]) : property === "volume" ? clip.type === "media" || clip.type === "sequence" ? clip.volume : void 0 : clip.opacity;
3395
+ var animatableOf = (clip, property) => _chunkSFCPGMCTcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([clip, 'access', _113 => _113.transform, 'optionalAccess', _114 => _114[property]]) : property === "volume" ? clip.type === "media" || clip.type === "sequence" ? clip.volume : void 0 : clip.opacity;
3398
3396
  var playheadInClip = (clip, time) => Math.round(Math.min(clip.duration, Math.max(0, time - clip.start)));
3399
3397
  function videoKeyframeRows(project, clipId, time) {
3400
- const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project, clipId);
3398
+ const at = _chunkSFCPGMCTcjs.findVideoClip.call(void 0, project, clipId);
3401
3399
  if (!at) return [];
3402
3400
  const { clip } = at;
3403
- const asset = clip.type === "media" ? _chunkUXFI3CDZcjs.videoAssetMap.call(void 0, project).get(clip.asset) : void 0;
3401
+ const asset = clip.type === "media" ? _chunkSFCPGMCTcjs.videoAssetMap.call(void 0, project).get(clip.asset) : void 0;
3404
3402
  const visual = !(_optionalChain([asset, 'optionalAccess', _115 => _115.kind]) === "audio" || at.track.kind === "audio");
3405
- const audible = clip.type === "media" && _chunkUXFI3CDZcjs.videoAssetHasSound.call(void 0, asset) || clip.type === "sequence";
3406
- const properties = [...visual ? ["opacity"] : [], ...audible ? ["volume"] : [], ...visual ? _chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES : []];
3403
+ const audible = clip.type === "media" && _chunkSFCPGMCTcjs.videoAssetHasSound.call(void 0, asset) || clip.type === "sequence";
3404
+ const properties = [...visual ? ["opacity"] : [], ...audible ? ["volume"] : [], ...visual ? _chunkSFCPGMCTcjs.VIDEO_TRANSFORM_PROPERTIES : []];
3407
3405
  const clipTime = playheadInClip(clip, time);
3408
3406
  return properties.map((property) => {
3409
3407
  const prop = animatableOf(clip, property);
3410
- const keys = _chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, prop) ? prop.keys : [];
3411
- const limits = _chunkUXFI3CDZcjs.VIDEO_KEYFRAME_LIMITS[property];
3408
+ const keys = _chunkSFCPGMCTcjs.isVideoKeyframes.call(void 0, prop) ? prop.keys : [];
3409
+ const limits = _chunkSFCPGMCTcjs.VIDEO_KEYFRAME_LIMITS[property];
3412
3410
  return {
3413
3411
  property,
3414
3412
  ...KEY_LABELS[property],
3415
- value: Math.round(_chunkUXFI3CDZcjs.videoValueAt.call(void 0, prop, clipTime, limits.default) * 1e3) / 1e3,
3413
+ value: Math.round(_chunkSFCPGMCTcjs.videoValueAt.call(void 0, prop, clipTime, limits.default) * 1e3) / 1e3,
3416
3414
  keyed: keys.length > 0,
3417
3415
  keys: keys.length,
3418
3416
  onKey: keys.some((k) => Math.abs(k.t - clipTime) < 0.5),
@@ -3423,44 +3421,44 @@ function videoKeyframeRows(project, clipId, time) {
3423
3421
  });
3424
3422
  }
3425
3423
  function plainValueEdit(clip, property, value) {
3426
- if (!_chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property))
3424
+ if (!_chunkSFCPGMCTcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property))
3427
3425
  return value === void 0 ? { op: "update_clip", clip: clip.id, remove: [property] } : { op: "update_clip", clip: clip.id, set: { [property]: value } };
3428
3426
  const transform = { ...clip.transform, [property]: value };
3429
3427
  if (value === void 0) delete transform[property];
3430
3428
  return Object.keys(transform).length ? { op: "update_clip", clip: clip.id, set: { transform } } : { op: "update_clip", clip: clip.id, remove: ["transform"] };
3431
3429
  }
3432
3430
  function videoKeyframeValueEdit(project, clipId, property, time, value) {
3433
- const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project, clipId);
3431
+ const at = _chunkSFCPGMCTcjs.findVideoClip.call(void 0, project, clipId);
3434
3432
  if (!at) return null;
3435
3433
  const prop = animatableOf(at.clip, property);
3436
- if (!_chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, prop)) return plainValueEdit(at.clip, property, value);
3434
+ if (!_chunkSFCPGMCTcjs.isVideoKeyframes.call(void 0, prop)) return plainValueEdit(at.clip, property, value);
3437
3435
  if (value === void 0) return null;
3438
- return { op: "set_keyframes", clip: clipId, property, keys: _chunkUXFI3CDZcjs.setVideoKey.call(void 0, prop, { t: playheadInClip(at.clip, time), v: value }, _chunkUXFI3CDZcjs.VIDEO_KEYFRAME_LIMITS[property].default).keys };
3436
+ return { op: "set_keyframes", clip: clipId, property, keys: _chunkSFCPGMCTcjs.setVideoKey.call(void 0, prop, { t: playheadInClip(at.clip, time), v: value }, _chunkSFCPGMCTcjs.VIDEO_KEYFRAME_LIMITS[property].default).keys };
3439
3437
  }
3440
3438
  function videoKeyframeToggleEdit(project, clipId, property, time) {
3441
- const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project, clipId);
3439
+ const at = _chunkSFCPGMCTcjs.findVideoClip.call(void 0, project, clipId);
3442
3440
  if (!at) return null;
3443
3441
  const prop = animatableOf(at.clip, property);
3444
3442
  const t = playheadInClip(at.clip, time);
3445
- const fallback = _chunkUXFI3CDZcjs.VIDEO_KEYFRAME_LIMITS[property].default;
3446
- if (_chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, prop)) {
3443
+ const fallback = _chunkSFCPGMCTcjs.VIDEO_KEYFRAME_LIMITS[property].default;
3444
+ if (_chunkSFCPGMCTcjs.isVideoKeyframes.call(void 0, prop)) {
3447
3445
  const key = prop.keys.find((k) => Math.abs(k.t - t) < 0.5);
3448
3446
  if (key) {
3449
- const rest = _chunkUXFI3CDZcjs.removeVideoKey.call(void 0, prop, key.t);
3450
- return _chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, rest) ? { op: "set_keyframes", clip: clipId, property, keys: rest.keys } : plainValueEdit(at.clip, property, rest === fallback ? void 0 : rest);
3447
+ const rest = _chunkSFCPGMCTcjs.removeVideoKey.call(void 0, prop, key.t);
3448
+ return _chunkSFCPGMCTcjs.isVideoKeyframes.call(void 0, rest) ? { op: "set_keyframes", clip: clipId, property, keys: rest.keys } : plainValueEdit(at.clip, property, rest === fallback ? void 0 : rest);
3451
3449
  }
3452
3450
  }
3453
- const v = _chunkUXFI3CDZcjs.videoValueAt.call(void 0, prop, t, fallback);
3454
- return { op: "set_keyframes", clip: clipId, property, keys: _chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, prop) ? _chunkUXFI3CDZcjs.setVideoKey.call(void 0, prop, { t, v }, fallback).keys : [{ t, v }] };
3451
+ const v = _chunkSFCPGMCTcjs.videoValueAt.call(void 0, prop, t, fallback);
3452
+ return { op: "set_keyframes", clip: clipId, property, keys: _chunkSFCPGMCTcjs.isVideoKeyframes.call(void 0, prop) ? _chunkSFCPGMCTcjs.setVideoKey.call(void 0, prop, { t, v }, fallback).keys : [{ t, v }] };
3455
3453
  }
3456
3454
  function videoLutEdits(project, clips, lut) {
3457
3455
  const edits = [];
3458
3456
  for (const id of clips) {
3459
- const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project, id);
3457
+ const at = _chunkSFCPGMCTcjs.findVideoClip.call(void 0, project, id);
3460
3458
  if (!at) continue;
3461
3459
  const { lut: current, ...rest } = _nullishCoalesce(at.clip.grade, () => ( {}));
3462
3460
  if (!lut && !current) continue;
3463
- const grade = _chunkUXFI3CDZcjs.normalizeVideoGrade.call(void 0, lut ? { ...rest, lut } : rest);
3461
+ const grade = _chunkSFCPGMCTcjs.normalizeVideoGrade.call(void 0, lut ? { ...rest, lut } : rest);
3464
3462
  edits.push(grade ? { op: "update_clip", clip: id, set: { grade } } : { op: "update_clip", clip: id, remove: ["grade"] });
3465
3463
  }
3466
3464
  return edits;
@@ -3490,7 +3488,7 @@ var RIPPLE = {
3490
3488
  };
3491
3489
  var MODE = {
3492
3490
  type: "string",
3493
- enum: [..._chunkUXFI3CDZcjs.VIDEO_PLACEMENT_MODES],
3491
+ enum: [..._chunkSFCPGMCTcjs.VIDEO_PLACEMENT_MODES],
3494
3492
  description: 'What to do with clips already where it lands: "refuse" (default) fails with the next free place; "overwrite" cuts, trims or removes what is underneath on that track; "insert" cuts everything across the start and pushes later material along by its length on this track and every sync-locked track.'
3495
3493
  };
3496
3494
  var DELTA = (what) => ({ type: "number", description: `${what}, in milliseconds of timeline time: positive is later, negative earlier. It is clamped to what the media and neighbours allow; the result says how far it went.` });
@@ -3507,11 +3505,11 @@ var TRANSFORM = object(
3507
3505
  );
3508
3506
  var TRANSITION = object(
3509
3507
  {
3510
- type: { type: "string", enum: _chunkUXFI3CDZcjs.VIDEO_TRANSITION_TYPES.filter((t) => t !== "effect"), description: "crossfade (this clip fades up over the one before), dip (down into a colour and up out of it), wipe (an edge travels across revealing this clip), push (this clip slides in and pushes the one before out), slide (this clip slides in over the one before) or iris (a circle opens from the centre). For a transition effect from the effects provider use set_video_effect_transition." },
3508
+ type: { type: "string", enum: _chunkSFCPGMCTcjs.VIDEO_TRANSITION_TYPES.filter((t) => t !== "effect"), description: "crossfade (this clip fades up over the one before), dip (down into a colour and up out of it), wipe (an edge travels across revealing this clip), push (this clip slides in and pushes the one before out), slide (this clip slides in over the one before) or iris (a circle opens from the centre). For a transition effect from the effects provider use set_video_effect_transition." },
3511
3509
  duration: { type: "number", exclusiveMinimum: 0, description: "Length in ms, centred on the cut. Every type but dip needs half of it in media past the cut on both sides (handles); a dip needs none." },
3512
3510
  color: COLOR("For dip: the colour passed through (default black)"),
3513
- direction: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_WIPE_DIRECTIONS], description: "For wipe, push and slide: the way the edge or picture travels (default right, coming in from the left)." },
3514
- audioCurve: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fades through it: default equal-power for every type but dip (steady loudness while the two sounds overlap), linear for dip; or s-curve, exponential, logarithmic." }
3511
+ direction: { type: "string", enum: [..._chunkSFCPGMCTcjs.VIDEO_WIPE_DIRECTIONS], description: "For wipe, push and slide: the way the edge or picture travels (default right, coming in from the left)." },
3512
+ audioCurve: { type: "string", enum: [..._chunkSFCPGMCTcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fades through it: default equal-power for every type but dip (steady loudness while the two sounds overlap), linear for dip; or s-curve, exponential, logarithmic." }
3515
3513
  },
3516
3514
  ["type", "duration"],
3517
3515
  "A transition from the clip that ends where this one starts on the same track."
@@ -3520,7 +3518,7 @@ var LUT_SRC = { type: "string", minLength: 1, description: 'A .cube 3D LUT file
3520
3518
  var LUT_STRENGTH = { type: "number", minimum: 0, maximum: 1, description: "How much of the LUT's change to apply, 0 (none) to 1 (full, the default); 0.3-0.7 for a subtler look." };
3521
3519
  var GRADE = object(
3522
3520
  {
3523
- ...Object.fromEntries(_chunkUXFI3CDZcjs.VIDEO_GRADE_CONTROLS.map((c) => [c.key, { type: "number", minimum: c.min, maximum: c.max, description: c.description }])),
3521
+ ...Object.fromEntries(_chunkSFCPGMCTcjs.VIDEO_GRADE_CONTROLS.map((c) => [c.key, { type: "number", minimum: c.min, maximum: c.max, description: c.description }])),
3524
3522
  lut: object({ src: LUT_SRC, strength: LUT_STRENGTH, name: { type: "string", minLength: 1, description: "A label for the look." } }, ["src"], "A 3D LUT applied after the other settings (set_video_lut checks the file first).")
3525
3523
  },
3526
3524
  [],
@@ -3528,7 +3526,7 @@ var GRADE = object(
3528
3526
  );
3529
3527
  var ANIMATION = (when) => object(
3530
3528
  {
3531
- effect: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_CLIP_ANIMATION_EFFECTS], description: "fade; rise (up into place) or drop (down into place); slide-left / slide-right (moving that way); zoom (grows into place); pop (grows past its size and settles). Each also fades; an exit plays the movement backwards." },
3529
+ effect: { type: "string", enum: [..._chunkSFCPGMCTcjs.VIDEO_CLIP_ANIMATION_EFFECTS], description: "fade; rise (up into place) or drop (down into place); slide-left / slide-right (moving that way); zoom (grows into place); pop (grows past its size and settles). Each also fades; an exit plays the movement backwards." },
3532
3530
  duration: { type: "number", exclusiveMinimum: 0, description: "Length in ms (default 500)." }
3533
3531
  },
3534
3532
  ["effect"],
@@ -3538,11 +3536,11 @@ var CLIP_COMMON = {
3538
3536
  name: { type: "string", description: "A label for the clip." },
3539
3537
  opacity: { type: "number", minimum: 0, maximum: 1, description: "Opacity 0\u20131 (default 1). A number replaces any keyframes; set_video_keyframes animates it." },
3540
3538
  transform: TRANSFORM,
3541
- fit: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_FITS], description: "How the picture fits the frame before the transform, as CSS object-fit (default contain for media, fill for colours)." },
3539
+ fit: { type: "string", enum: [..._chunkSFCPGMCTcjs.VIDEO_FITS], description: "How the picture fits the frame before the transform, as CSS object-fit (default contain for media, fill for colours)." },
3542
3540
  grade: GRADE,
3543
3541
  animateIn: ANIMATION("How the picture enters, from the clip's start (on top of any fade in). Titles usually rise, pop or fade in."),
3544
3542
  animateOut: ANIMATION("How the picture leaves, ending at the clip's end."),
3545
- blend: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_BLEND_MODES], description: "How the picture mixes with what is beneath it, as CSS mix-blend-mode (default normal): multiply darkens (shadows, textures), screen and add lighten (light leaks, flares, glows), overlay and soft-light add contrast, difference and exclusion invert." },
3543
+ blend: { type: "string", enum: [..._chunkSFCPGMCTcjs.VIDEO_BLEND_MODES], description: "How the picture mixes with what is beneath it, as CSS mix-blend-mode (default normal): multiply darkens (shadows, textures), screen and add lighten (light leaks, flares, glows), overlay and soft-light add contrast, difference and exclusion invert." },
3546
3544
  fadeIn: MS("Fade up from nothing (picture and sound) over this long"),
3547
3545
  fadeOut: MS("Fade down to nothing over this long")
3548
3546
  };
@@ -3551,8 +3549,8 @@ var MEDIA_FIELDS = {
3551
3549
  speed: { type: "number", minimum: 0.05, maximum: 20, description: "Playback speed (default 1). Changing it keeps the stretch of source, so the clip gets shorter or longer." },
3552
3550
  volume: { type: "number", minimum: 0, maximum: 4, description: "Gain (1 = unchanged, default 1). A number replaces any keyframes; set_video_keyframes animates it." },
3553
3551
  muted: { type: "boolean", description: "Silence this clip (default false)." },
3554
- fadeInCurve: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fade in (default linear; the picture always fades linearly): linear, equal-power (steady loudness, best for crossfades), s-curve (gentle at both ends), exponential (slow start, natural from silence) or logarithmic (fast start)." },
3555
- fadeOutCurve: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fade out (default linear), the same choices as fadeInCurve; exponential sounds natural fading to silence." }
3552
+ fadeInCurve: { type: "string", enum: [..._chunkSFCPGMCTcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fade in (default linear; the picture always fades linearly): linear, equal-power (steady loudness, best for crossfades), s-curve (gentle at both ends), exponential (slow start, natural from silence) or logarithmic (fast start)." },
3553
+ fadeOutCurve: { type: "string", enum: [..._chunkSFCPGMCTcjs.VIDEO_FADE_CURVES], description: "Shape of the sound's fade out (default linear), the same choices as fadeInCurve; exponential sounds natural fading to silence." }
3556
3554
  };
3557
3555
  var TEXT_FIELDS = {
3558
3556
  text: { type: "string", minLength: 1, description: `The title's text ("\\n" breaks lines).` },
@@ -3601,7 +3599,7 @@ var ASSET_FIELDS = {
3601
3599
  };
3602
3600
  var KEY_PROPERTY = {
3603
3601
  type: "string",
3604
- enum: [..._chunkUXFI3CDZcjs.VIDEO_KEYFRAME_PROPERTIES],
3602
+ enum: [..._chunkSFCPGMCTcjs.VIDEO_KEYFRAME_PROPERTIES],
3605
3603
  description: "Which property: opacity (0\u20131), volume (media only, 0\u20134 gain), x / y (pixels from the frame's centre, right / down), scale (1 = fitted size) or rotation (degrees clockwise)."
3606
3604
  };
3607
3605
  var KEYS = {
@@ -3616,7 +3614,7 @@ var KEYS = {
3616
3614
  ease: {
3617
3615
  description: "How the value moves from this key to the next (default linear): linear, hold (stays, then jumps at the next key), ease-in, ease-out, ease-in-out, or CSS cubic-bezier points [x1, y1, x2, y2] with x1 and x2 in 0\u20131.",
3618
3616
  anyOf: [
3619
- { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_EASE_NAMES] },
3617
+ { type: "string", enum: [..._chunkSFCPGMCTcjs.VIDEO_EASE_NAMES] },
3620
3618
  { type: "array", items: { type: "number" }, minItems: 4, maxItems: 4 }
3621
3619
  ]
3622
3620
  }
@@ -3645,19 +3643,19 @@ var describeVideoTracks = (tracks) => tracks.map((t, index) => ({
3645
3643
  ...t.locked ? { locked: true } : {},
3646
3644
  ...t.syncLocked === false ? { syncLocked: false } : {},
3647
3645
  ...t.volume !== void 0 ? { volume: t.volume } : {},
3648
- clips: _chunkUXFI3CDZcjs.sortedVideoClips.call(void 0, t).map((c) => ({ ...c, end: _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c), ...c.type === "media" || c.type === "sequence" ? { source: _chunkUXFI3CDZcjs.videoClipSourceRange.call(void 0, c) } : {} }))
3646
+ clips: _chunkSFCPGMCTcjs.sortedVideoClips.call(void 0, t).map((c) => ({ ...c, end: _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, c), ...c.type === "media" || c.type === "sequence" ? { source: _chunkSFCPGMCTcjs.videoClipSourceRange.call(void 0, c) } : {} }))
3649
3647
  }));
3650
- var videoSequenceUsers = (project, id) => _chunkUXFI3CDZcjs.allVideoTracks.call(void 0, project).flatMap(
3651
- ({ sequence, track }) => track.clips.flatMap((c) => c.type === "sequence" && c.sequence === id ? [{ clip: c.id, ...sequence ? { inSequence: sequence } : {}, track: track.id, start: c.start, end: _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c), source: _chunkUXFI3CDZcjs.videoClipSourceRange.call(void 0, c) }] : [])
3648
+ var videoSequenceUsers = (project, id) => _chunkSFCPGMCTcjs.allVideoTracks.call(void 0, project).flatMap(
3649
+ ({ sequence, track }) => track.clips.flatMap((c) => c.type === "sequence" && c.sequence === id ? [{ clip: c.id, ...sequence ? { inSequence: sequence } : {}, track: track.id, start: c.start, end: _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, c), source: _chunkSFCPGMCTcjs.videoClipSourceRange.call(void 0, c) }] : [])
3652
3650
  );
3653
3651
  function describeVideoSequence(project, sequence, tracks = true) {
3654
- const cycle = _chunkUXFI3CDZcjs.findVideoSequenceCycle.call(void 0, project, sequence.id);
3652
+ const cycle = _chunkSFCPGMCTcjs.findVideoSequenceCycle.call(void 0, project, sequence.id);
3655
3653
  return {
3656
3654
  id: sequence.id,
3657
3655
  ...sequence.name ? { name: sequence.name } : {},
3658
- duration: _chunkUXFI3CDZcjs.videoSequenceDuration.call(void 0, sequence),
3656
+ duration: _chunkSFCPGMCTcjs.videoSequenceDuration.call(void 0, sequence),
3659
3657
  clipCount: sequence.tracks.reduce((n, t) => n + t.clips.length, 0),
3660
- nests: _chunkUXFI3CDZcjs.videoSequenceChildren.call(void 0, sequence),
3658
+ nests: _chunkSFCPGMCTcjs.videoSequenceChildren.call(void 0, sequence),
3661
3659
  usedBy: videoSequenceUsers(project, sequence.id),
3662
3660
  ...cycle ? { cycle } : {},
3663
3661
  ...tracks ? { tracks: describeVideoTracks(sequence.tracks) } : { trackCount: sequence.tracks.length }
@@ -3669,7 +3667,7 @@ function describeVideoProject(project) {
3669
3667
  width: project.width,
3670
3668
  height: project.height,
3671
3669
  fps: project.fps,
3672
- duration: _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, project),
3670
+ duration: _chunkSFCPGMCTcjs.videoProjectDuration.call(void 0, project),
3673
3671
  ...project.background ? { background: project.background } : {},
3674
3672
  assets: project.assets.map(videoAssetOut),
3675
3673
  tracks: describeVideoTracks(project.tracks),
@@ -3686,7 +3684,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
3686
3684
  const project = () => controller.getProject();
3687
3685
  const outcome = (result, extra = {}) => {
3688
3686
  if (!result.ok) throw new Error(result.error);
3689
- return { ...extra, duration: _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, result.project), issues: issueSummary(result.issues) };
3687
+ return { ...extra, duration: _chunkSFCPGMCTcjs.videoProjectDuration.call(void 0, result.project), issues: issueSummary(result.issues) };
3690
3688
  };
3691
3689
  const apply = (edits, label, extra) => {
3692
3690
  const result = controller.apply(edits, label);
@@ -3695,7 +3693,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
3695
3693
  const clipOut = (p, id) => {
3696
3694
  for (const t of p.tracks) {
3697
3695
  const c = t.clips.find((x) => x.id === id);
3698
- if (c) return { track: t.id, ...c, end: _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c), ...c.type === "media" || c.type === "sequence" ? { source: _chunkUXFI3CDZcjs.videoClipSourceRange.call(void 0, c) } : {} };
3696
+ if (c) return { track: t.id, ...c, end: _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, c), ...c.type === "media" || c.type === "sequence" ? { source: _chunkSFCPGMCTcjs.videoClipSourceRange.call(void 0, c) } : {} };
3699
3697
  }
3700
3698
  return null;
3701
3699
  };
@@ -3707,7 +3705,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
3707
3705
  });
3708
3706
  const keysOut = (p, clip, property) => {
3709
3707
  const c = clipOut(p, clip);
3710
- const value = _chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([c, 'optionalAccess', _124 => _124.transform, 'optionalAccess', _125 => _125[property]]) : _optionalChain([c, 'optionalAccess', _126 => _126[property]]);
3708
+ const value = _chunkSFCPGMCTcjs.VIDEO_TRANSFORM_PROPERTIES.includes(property) ? _optionalChain([c, 'optionalAccess', _124 => _124.transform, 'optionalAccess', _125 => _125[property]]) : _optionalChain([c, 'optionalAccess', _126 => _126[property]]);
3711
3709
  return typeof value === "object" ? { keys: value.keys } : { keys: [], value: _nullishCoalesce(value, () => ( null)) };
3712
3710
  };
3713
3711
  const getProject = {
@@ -3729,8 +3727,8 @@ function createVideoEditorToolProvider(controller, options = {}) {
3729
3727
  inputSchema: object({ time: MS("Time from the start (default: the playhead)") }),
3730
3728
  annotations: { title: "What plays at a moment", ...READ },
3731
3729
  handler: ({ time }) => {
3732
- const frame = _chunkUXFI3CDZcjs.videoFrameAt.call(void 0, project(), _nullishCoalesce(time, () => ( controller.getState().time)));
3733
- return { ...frame, timecode: _chunkUXFI3CDZcjs.formatVideoTimecode.call(void 0, frame.time, project().fps) };
3730
+ const frame = _chunkSFCPGMCTcjs.videoFrameAt.call(void 0, project(), _nullishCoalesce(time, () => ( controller.getState().time)));
3731
+ return { ...frame, timecode: _chunkSFCPGMCTcjs.formatVideoTimecode.call(void 0, frame.time, project().fps) };
3734
3732
  }
3735
3733
  };
3736
3734
  const listSequences = {
@@ -3758,7 +3756,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
3758
3756
  annotations: { title: "Find gaps", ...READ },
3759
3757
  handler: ({ track }) => {
3760
3758
  if (track !== void 0 && !project().tracks.some((t) => t.id === track)) throw new Error(`There is no track "${track}"; the tracks are ${project().tracks.map((t) => `"${t.id}"`).join(", ")}.`);
3761
- return { gaps: _chunkUXFI3CDZcjs.findVideoGaps.call(void 0, project(), track) };
3759
+ return { gaps: _chunkSFCPGMCTcjs.findVideoGaps.call(void 0, project(), track) };
3762
3760
  }
3763
3761
  };
3764
3762
  const checkProject = {
@@ -3788,7 +3786,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
3788
3786
  const lutSrcs = [...new Set(p.tracks.flatMap((t) => t.clips.map((c) => _optionalChain([c, 'access', _127 => _127.grade, 'optionalAccess', _128 => _128.lut, 'optionalAccess', _129 => _129.src])).filter((x) => !!x)))];
3789
3787
  const missing = (await Promise.all(lutSrcs.map((src) => controller.luts.load(src).then(() => null, (e) => e.message)))).filter((m) => !!m);
3790
3788
  const svgOptions = { lutFor: (src) => controller.luts.peek(src), ...columns ? { columns } : {} };
3791
- const svg = times ? _chunkUXFI3CDZcjs.videoContactSheetSvg.call(void 0, p, times, svgOptions) : _chunkUXFI3CDZcjs.videoProjectSvg.call(void 0, p, _nullishCoalesce(time, () => ( controller.getState().time)), svgOptions);
3789
+ const svg = times ? _chunkSFCPGMCTcjs.videoContactSheetSvg.call(void 0, p, times, svgOptions) : _chunkSFCPGMCTcjs.videoProjectSvg.call(void 0, p, _nullishCoalesce(time, () => ( controller.getState().time)), svgOptions);
3792
3790
  const notes = [...missing.map((m) => `${m}; that LUT is left out of the picture.`), ...lutSrcs.length > missing.length ? ["LUTs are drawn approximately in SVG (curves and a colour matrix); the preview and export apply them exactly."] : []];
3793
3791
  if (format === "png") {
3794
3792
  if (!options.rasterize) throw new Error('This host cannot make PNG images; call render_video_frame with format "svg".');
@@ -3878,7 +3876,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
3878
3876
  if (play === true) controller.play();
3879
3877
  if (play === false) controller.pause();
3880
3878
  const state = controller.getState();
3881
- return { time: state.time, timecode: _chunkUXFI3CDZcjs.formatVideoTimecode.call(void 0, state.time, p.fps), playing: state.playing, clips: state.current };
3879
+ return { time: state.time, timecode: _chunkSFCPGMCTcjs.formatVideoTimecode.call(void 0, state.time, p.fps), playing: state.playing, clips: state.current };
3882
3880
  }
3883
3881
  };
3884
3882
  const setSettings = {
@@ -4023,7 +4021,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4023
4021
  const gradeTargets = (ids) => {
4024
4022
  const p = project();
4025
4023
  for (const id of ids) {
4026
- const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, p, id);
4024
+ const at = _chunkSFCPGMCTcjs.findVideoClip.call(void 0, p, id);
4027
4025
  if (!at) throw new Error(`There is no clip "${id}"; get_video_project lists the clips.`);
4028
4026
  const { clip } = at;
4029
4027
  if (at.track.kind !== "video" || clip.type === "media" && _optionalChain([p, 'access', _130 => _130.assets, 'access', _131 => _131.find, 'call', _132 => _132((a) => a.id === clip.asset), 'optionalAccess', _133 => _133.kind]) === "audio")
@@ -4037,7 +4035,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4037
4035
  inputSchema: object(
4038
4036
  {
4039
4037
  clips: { type: "array", items: CLIP_ID, minItems: 1, description: "Clips on video tracks to grade." },
4040
- preset: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_GRADE_PRESET_NAMES], description: "The look." },
4038
+ preset: { type: "string", enum: [..._chunkSFCPGMCTcjs.VIDEO_GRADE_PRESET_NAMES], description: "The look." },
4041
4039
  amount: { type: "number", minimum: 0, maximum: 1, description: "Strength, 0 (none) to 1 (full, the default); 0.5 is a subtler version." }
4042
4040
  },
4043
4041
  ["clips", "preset"]
@@ -4046,10 +4044,10 @@ function createVideoEditorToolProvider(controller, options = {}) {
4046
4044
  handler: ({ clips, preset, amount }) => {
4047
4045
  gradeTargets(clips);
4048
4046
  const edits = clips.map((clip) => {
4049
- const grade = _chunkUXFI3CDZcjs.videoGradeLook.call(void 0, _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project(), clip).clip.grade, preset, _nullishCoalesce(amount, () => ( 1)));
4047
+ const grade = _chunkSFCPGMCTcjs.videoGradeLook.call(void 0, _chunkSFCPGMCTcjs.findVideoClip.call(void 0, project(), clip).clip.grade, preset, _nullishCoalesce(amount, () => ( 1)));
4050
4048
  return grade ? { op: "update_clip", clip, set: { grade } } : { op: "update_clip", clip, remove: ["grade"] };
4051
4049
  });
4052
- return apply(edits, `Apply ${preset} look`, (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkUXFI3CDZcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _134 => _134.clip, 'access', _135 => _135.grade]), () => ( null)) })) }));
4050
+ return apply(edits, `Apply ${preset} look`, (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkSFCPGMCTcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _134 => _134.clip, 'access', _135 => _135.grade]), () => ( null)) })) }));
4053
4051
  }
4054
4052
  };
4055
4053
  const copyGrade = {
@@ -4060,7 +4058,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4060
4058
  annotations: { title: "Copy a colour grade", ...WRITE_IDEMPOTENT },
4061
4059
  handler: ({ from, to }) => {
4062
4060
  gradeTargets([from, ...to]);
4063
- const grade = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project(), from).clip.grade;
4061
+ const grade = _chunkSFCPGMCTcjs.findVideoClip.call(void 0, project(), from).clip.grade;
4064
4062
  const edits = to.map((clip) => grade ? { op: "update_clip", clip, set: { grade: { ...grade } } } : { op: "update_clip", clip, remove: ["grade"] });
4065
4063
  return apply(edits, "Copy grade", () => ({ grade: _nullishCoalesce(grade, () => ( null)), clips: to }));
4066
4064
  }
@@ -4085,7 +4083,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4085
4083
  const lut = await controller.luts.load(src);
4086
4084
  const label = _nullishCoalesce(name, () => ( lut.title));
4087
4085
  const setting = { src, ...strength !== void 0 && strength !== 1 ? { strength } : {}, ...label ? { name: label } : {} };
4088
- return apply(videoLutEdits(project(), clips, setting), "Apply LUT", (r) => ({ lut: { src, ...lut.title ? { title: lut.title } : {}, size: lut.size }, clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkUXFI3CDZcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _136 => _136.clip, 'access', _137 => _137.grade]), () => ( null)) })) }));
4086
+ return apply(videoLutEdits(project(), clips, setting), "Apply LUT", (r) => ({ lut: { src, ...lut.title ? { title: lut.title } : {}, size: lut.size }, clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkSFCPGMCTcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _136 => _136.clip, 'access', _137 => _137.grade]), () => ( null)) })) }));
4089
4087
  }
4090
4088
  };
4091
4089
  const removeLut = {
@@ -4097,9 +4095,9 @@ function createVideoEditorToolProvider(controller, options = {}) {
4097
4095
  handler: ({ clips }) => {
4098
4096
  gradeTargets(clips);
4099
4097
  const p = project();
4100
- const withLut = clips.filter((id) => _optionalChain([_chunkUXFI3CDZcjs.findVideoClip.call(void 0, p, id), 'access', _138 => _138.clip, 'access', _139 => _139.grade, 'optionalAccess', _140 => _140.lut]));
4098
+ const withLut = clips.filter((id) => _optionalChain([_chunkSFCPGMCTcjs.findVideoClip.call(void 0, p, id), 'access', _138 => _138.clip, 'access', _139 => _139.grade, 'optionalAccess', _140 => _140.lut]));
4101
4099
  if (!withLut.length) throw new Error(`None of ${clips.map((c) => `"${c}"`).join(", ")} has a LUT; get_video_project shows each clip's grade.`);
4102
- return apply(videoLutEdits(p, withLut, null), "Remove LUT", (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkUXFI3CDZcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _141 => _141.clip, 'access', _142 => _142.grade]), () => ( null)) })) }));
4100
+ return apply(videoLutEdits(p, withLut, null), "Remove LUT", (r) => ({ clips: clips.map((id) => ({ id, grade: _nullishCoalesce(_optionalChain([_chunkSFCPGMCTcjs.findVideoClip.call(void 0, r.project, id), 'optionalAccess', _141 => _141.clip, 'access', _142 => _142.grade]), () => ( null)) })) }));
4103
4101
  }
4104
4102
  };
4105
4103
  const PROXY_SCALE = { type: "number", exclusiveMinimum: 0, exclusiveMaximum: 1, description: "Proxy size as a fraction of the original: 0.5 (half width and height, the default) or 0.25 for very large footage." };
@@ -4208,7 +4206,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4208
4206
  approximate: parsed.approximate,
4209
4207
  first: list[0],
4210
4208
  last: list[list.length - 1],
4211
- ...a.duration !== void 0 && list[list.length - 1].end > a.duration + _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON ? { warning: `The transcript runs to ${list[list.length - 1].end} ms, past the asset's ${a.duration} ms: is it for this asset?` } : {}
4209
+ ...a.duration !== void 0 && list[list.length - 1].end > a.duration + _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON ? { warning: `The transcript runs to ${list[list.length - 1].end} ms, past the asset's ${a.duration} ms: is it for this asset?` } : {}
4212
4210
  }));
4213
4211
  }
4214
4212
  };
@@ -4279,12 +4277,12 @@ function createVideoEditorToolProvider(controller, options = {}) {
4279
4277
  const bad = ranges.findIndex((r) => !(r.to > r.from));
4280
4278
  if (bad >= 0) throw new Error(`Range ${bad + 1} is empty or backwards (${ranges[bad].from}\u2013${ranges[bad].to} ms); "to" must be after "from".`);
4281
4279
  const merged = mergeVideoRanges(ranges);
4282
- const before = _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, project());
4283
- return apply(videoRemoveRangesEdits(merged, tracks), merged.length > 1 ? `Cut ${merged.length} stretches` : "Cut stretch", (r) => ({ removed: merged.length, time: round(before - _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, r.project)), duration: _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, r.project) }));
4280
+ const before = _chunkSFCPGMCTcjs.videoProjectDuration.call(void 0, project());
4281
+ return apply(videoRemoveRangesEdits(merged, tracks), merged.length > 1 ? `Cut ${merged.length} stretches` : "Cut stretch", (r) => ({ removed: merged.length, time: round(before - _chunkSFCPGMCTcjs.videoProjectDuration.call(void 0, r.project)), duration: _chunkSFCPGMCTcjs.videoProjectDuration.call(void 0, r.project) }));
4284
4282
  }
4285
4283
  };
4286
4284
  const rampTarget = (id) => {
4287
- const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, project(), id);
4285
+ const at = _chunkSFCPGMCTcjs.findVideoClip.call(void 0, project(), id);
4288
4286
  if (!at) throw new Error(`There is no clip "${id}"; get_video_project lists the clips.`);
4289
4287
  const { clip } = at;
4290
4288
  if (clip.type === "sequence") throw new Error(`Clip "${id}" is a compound clip, which plays its sequence at normal speed; change the speed of the clips inside the sequence instead.`);
@@ -4294,7 +4292,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4294
4292
  };
4295
4293
  const rampOut = (r, id) => {
4296
4294
  const outcome2 = r.outcomes[r.outcomes.length - 1];
4297
- return { clip: clipOut(r.project, id), ...outcome2.rippled ? { rippled: outcome2.rippled } : {}, duration: _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, r.project) };
4295
+ return { clip: clipOut(r.project, id), ...outcome2.rippled ? { rippled: outcome2.rippled } : {}, duration: _chunkSFCPGMCTcjs.videoProjectDuration.call(void 0, r.project) };
4298
4296
  };
4299
4297
  const RIPPLE_RAMP = { type: "boolean", description: "Move later material on every sync-locked track by the change in length (default true); false refuses if the clip would overlap the next one." };
4300
4298
  const setSpeedRamp = {
@@ -4325,8 +4323,8 @@ function createVideoEditorToolProvider(controller, options = {}) {
4325
4323
  ),
4326
4324
  annotations: { title: "Ramp the speed", ...WRITE_IDEMPOTENT },
4327
4325
  handler: ({ clip, segments, ripple }) => {
4328
- const edit = _chunkUXFI3CDZcjs.videoSpeedRampEdit.call(void 0, rampTarget(clip), segments, _nullishCoalesce(ripple, () => ( true)));
4329
- return apply(edit, "Speed ramp", (r) => ({ ...rampOut(r, clip), source: Math.round(_chunkUXFI3CDZcjs.videoSpeedRampKeys.call(void 0, segments).source) }));
4326
+ const edit = _chunkSFCPGMCTcjs.videoSpeedRampEdit.call(void 0, rampTarget(clip), segments, _nullishCoalesce(ripple, () => ( true)));
4327
+ return apply(edit, "Speed ramp", (r) => ({ ...rampOut(r, clip), source: Math.round(_chunkSFCPGMCTcjs.videoSpeedRampKeys.call(void 0, segments).source) }));
4330
4328
  }
4331
4329
  };
4332
4330
  const addFreeze = {
@@ -4346,8 +4344,8 @@ function createVideoEditorToolProvider(controller, options = {}) {
4346
4344
  handler: ({ clip, at, duration, ripple }) => {
4347
4345
  const c = rampTarget(clip);
4348
4346
  const t = at - c.start;
4349
- if (t < 0 || t > c.duration) throw new Error(`${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, at)} is outside clip "${clip}" (${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, c.start)}\u2013${_chunkUXFI3CDZcjs.formatVideoSeconds.call(void 0, _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c))}); pick a time inside it.`);
4350
- return apply(_chunkUXFI3CDZcjs.videoFreezeFrameEdit.call(void 0, c, t, duration, _nullishCoalesce(ripple, () => ( true))), "Freeze frame", (r) => rampOut(r, clip));
4347
+ if (t < 0 || t > c.duration) throw new Error(`${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, at)} is outside clip "${clip}" (${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, c.start)}\u2013${_chunkSFCPGMCTcjs.formatVideoSeconds.call(void 0, _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, c))}); pick a time inside it.`);
4348
+ return apply(_chunkSFCPGMCTcjs.videoFreezeFrameEdit.call(void 0, c, t, duration, _nullishCoalesce(ripple, () => ( true))), "Freeze frame", (r) => rampOut(r, clip));
4351
4349
  }
4352
4350
  };
4353
4351
  const removeRamp = {
@@ -4520,7 +4518,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4520
4518
  let from;
4521
4519
  let to;
4522
4520
  if (args.clip !== void 0) {
4523
- const found = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, p, args.clip);
4521
+ const found = _chunkSFCPGMCTcjs.findVideoClip.call(void 0, p, args.clip);
4524
4522
  if (!found) throw new Error(`There is no clip "${args.clip}"; get_video_project lists the clips.`);
4525
4523
  const c = found.clip;
4526
4524
  if (c.type === "sequence") throw new Error(`Clip "${c.id}" is a compound clip; its sound is the mix of its sequence "${c.sequence}", so read the levels of the media in it (list_video_sequences lists its clips and assets).`);
@@ -4530,7 +4528,7 @@ function createVideoEditorToolProvider(controller, options = {}) {
4530
4528
  toSource = (t) => (_nullishCoalesce(c.in, () => ( 0))) + (t - c.start) * speed;
4531
4529
  toOut = (s) => c.start + (s - (_nullishCoalesce(c.in, () => ( 0)))) / speed;
4532
4530
  from = Math.max(c.start, _nullishCoalesce(args.from, () => ( c.start)));
4533
- to = Math.min(_chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c), _nullishCoalesce(args.to, () => ( _chunkUXFI3CDZcjs.videoClipEnd.call(void 0, c))));
4531
+ to = Math.min(_chunkSFCPGMCTcjs.videoClipEnd.call(void 0, c), _nullishCoalesce(args.to, () => ( _chunkSFCPGMCTcjs.videoClipEnd.call(void 0, c))));
4534
4532
  } else {
4535
4533
  asset = p.assets.find((a) => a.id === args.asset);
4536
4534
  if (!asset) throw new Error(`There is no asset "${args.asset}"; the assets are ${p.assets.map((a) => `"${a.id}"`).join(", ") || "none"}.`);
@@ -4611,11 +4609,11 @@ function createVideoEditorToolProvider(controller, options = {}) {
4611
4609
  annotations: { title: "Measure a frame with scopes", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
4612
4610
  handler: async ({ time, bins, columns }) => {
4613
4611
  const p = project();
4614
- const end = _chunkUXFI3CDZcjs.videoProjectDuration.call(void 0, p);
4612
+ const end = _chunkSFCPGMCTcjs.videoProjectDuration.call(void 0, p);
4615
4613
  const t = _nullishCoalesce(time, () => ( controller.getState().time));
4616
4614
  if (time !== void 0 && time > end) throw new Error(`Time ${time} ms is past the end of the project (${end} ms).`);
4617
4615
  const pixels = await pixelsAt(t);
4618
- return { time: t, timecode: _chunkUXFI3CDZcjs.formatVideoTimecode.call(void 0, t, p.fps), width: pixels.width, height: pixels.height, ...summarizeVideoScopes(pixels, { bins, columns }) };
4616
+ return { time: t, timecode: _chunkSFCPGMCTcjs.formatVideoTimecode.call(void 0, t, p.fps), width: pixels.width, height: pixels.height, ...summarizeVideoScopes(pixels, { bins, columns }) };
4619
4617
  }
4620
4618
  };
4621
4619
  const reads = [getProject, listSequences, getFrame, getTranscript, findText, findFillers, findPauses, findGaps, checkProject, renderFrame, getScopes, previewCache, planProxies, exportFfmpeg, exportLoudnessMeasure, exportEdl, audioLevels, findSilences, seek, setPreviewScale];
@@ -4655,7 +4653,7 @@ var KEYS2 = {
4655
4653
  properties: {
4656
4654
  t: { type: "number", description: "Clip-relative time in ms (0 = the clip's start)." },
4657
4655
  v: { type: "number", description: "The control's value at t, within its range from describe_effect." },
4658
- ease: { anyOf: [{ type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_EASE_NAMES] }, { type: "array", items: { type: "number" }, minItems: 4, maxItems: 4 }], description: "How the value moves to the next key: linear (default), hold, ease-in, ease-out, ease-in-out, or CSS cubic-bezier [x1, y1, x2, y2]." }
4656
+ ease: { anyOf: [{ type: "string", enum: [..._chunkSFCPGMCTcjs.VIDEO_EASE_NAMES] }, { type: "array", items: { type: "number" }, minItems: 4, maxItems: 4 }], description: "How the value moves to the next key: linear (default), hold, ease-in, ease-out, ease-in-out, or CSS cubic-bezier [x1, y1, x2, y2]." }
4659
4657
  },
4660
4658
  required: ["t", "v"],
4661
4659
  additionalProperties: false
@@ -4669,7 +4667,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
4669
4667
  return controller.readOnlyReason();
4670
4668
  };
4671
4669
  const clipOf = (id) => {
4672
- const at = _chunkUXFI3CDZcjs.findVideoClip.call(void 0, controller.getProject(), id);
4670
+ const at = _chunkSFCPGMCTcjs.findVideoClip.call(void 0, controller.getProject(), id);
4673
4671
  if (!at) {
4674
4672
  const ids = controller.getProject().tracks.flatMap((t) => t.clips.map((c) => c.id));
4675
4673
  throw new Error(`There is no clip "${id}"; the clips are ${ids.map((c) => `"${c}"`).join(", ") || "none"} (get_video_project lists them).`);
@@ -4682,7 +4680,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
4682
4680
  const effect = _nullishCoalesce(effects.find((e) => e.id === (_nullishCoalesce(instance, () => ( _optionalChain([r, 'access', _154 => _154.effect, 'optionalAccess', _155 => _155.id]))))), () => ( (r.effect ? { id: r.effect.id, effect: r.effect.effect, role: "clip effect", enabled: r.effect.enabled !== false, values: _nullishCoalesce(r.effect.values, () => ( {})) } : effects[0])));
4683
4681
  return { target, effect, effects, ...extra };
4684
4682
  };
4685
- return _chunkQDJKUBWEcjs.createEffectToolProvider.call(void 0, {
4683
+ return _chunkJODTP4DPcjs.createEffectToolProvider.call(void 0, {
4686
4684
  id: _nullishCoalesce(options.id, () => ( "video-effects")),
4687
4685
  namespace: options.namespace,
4688
4686
  target: { noun: "clip", id: 'A clip id from get_video_project (e.g. "c1").' },
@@ -4737,7 +4735,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
4737
4735
  duration: { type: "number", exclusiveMinimum: 0, description: "Length in ms (default: the effect's own length, else 5000)." },
4738
4736
  values: ctx.valuesSchema("Control values over the effect's defaults", true),
4739
4737
  name: { type: "string", minLength: 1, description: "A label for the clip (default: the effect's name)." },
4740
- mode: { type: "string", enum: [..._chunkUXFI3CDZcjs.VIDEO_PLACEMENT_MODES], description: "What to do with clips already there: refuse (default), overwrite or insert." }
4738
+ mode: { type: "string", enum: [..._chunkSFCPGMCTcjs.VIDEO_PLACEMENT_MODES], description: "What to do with clips already there: refuse (default), overwrite or insert." }
4741
4739
  },
4742
4740
  required: ["track", "effect"],
4743
4741
  additionalProperties: false
@@ -4797,7 +4795,7 @@ function createVideoEffectsToolProvider(controller, options = {}) {
4797
4795
  const clip = clipOf(args.clip);
4798
4796
  if (clip.type !== "effect") throw new Error(`Clip "${args.clip}" is not an effect clip; give the id of one of its effects (list_applied_effects).`);
4799
4797
  const was = _optionalChain([clip, 'access', _156 => _156.values, 'optionalAccess', _157 => _157[args.control]]);
4800
- const plain = keys === null ? _chunkUXFI3CDZcjs.isVideoKeyframes.call(void 0, was) ? _optionalChain([was, 'access', _158 => _158.keys, 'access', _159 => _159[0], 'optionalAccess', _160 => _160.v]) : was : { keys: [...keys].sort((a, b) => a.t - b.t) };
4798
+ const plain = keys === null ? _chunkSFCPGMCTcjs.isVideoKeyframes.call(void 0, was) ? _optionalChain([was, 'access', _158 => _158.keys, 'access', _159 => _159[0], 'optionalAccess', _160 => _160.v]) : was : { keys: [...keys].sort((a, b) => a.t - b.t) };
4801
4799
  if (plain === void 0) throw new Error(`"${args.control}" has no value to keep; give keys instead.`);
4802
4800
  r = await controller.updateEffectValues(args.clip, "generator", { [args.control]: plain });
4803
4801
  } else r = await controller.setClipEffectKeyframes(args.clip, args.effect, args.control, keys);
@@ -5060,5 +5058,5 @@ function createVideoEffectsToolProvider(controller, options = {}) {
5060
5058
 
5061
5059
 
5062
5060
 
5063
- exports.VIDEO_BLEND_MODES = _chunkUXFI3CDZcjs.VIDEO_BLEND_MODES; exports.VIDEO_BLEND_MODE_LABELS = VIDEO_BLEND_MODE_LABELS; exports.VIDEO_CLIP_ANIMATION_DURATION = _chunkUXFI3CDZcjs.VIDEO_CLIP_ANIMATION_DURATION; exports.VIDEO_CLIP_ANIMATION_EFFECTS = _chunkUXFI3CDZcjs.VIDEO_CLIP_ANIMATION_EFFECTS; exports.VIDEO_CLIP_ANIMATION_LABELS = VIDEO_CLIP_ANIMATION_LABELS; exports.VIDEO_CLIP_TYPES = _chunkUXFI3CDZcjs.VIDEO_CLIP_TYPES; exports.VIDEO_DEFAULT_FILLERS = VIDEO_DEFAULT_FILLERS; exports.VIDEO_DEFAULT_STILL_DURATION = VIDEO_DEFAULT_STILL_DURATION; exports.VIDEO_DEFAULT_TITLE_DURATION = VIDEO_DEFAULT_TITLE_DURATION; exports.VIDEO_EASE_NAMES = _chunkUXFI3CDZcjs.VIDEO_EASE_NAMES; exports.VIDEO_EDIT_OPS = VIDEO_EDIT_OPS; exports.VIDEO_EFFECT_PLACES = _chunkUXFI3CDZcjs.VIDEO_EFFECT_PLACES; exports.VIDEO_FADE_CURVES = _chunkUXFI3CDZcjs.VIDEO_FADE_CURVES; exports.VIDEO_FADE_CURVE_LABELS = VIDEO_FADE_CURVE_LABELS; exports.VIDEO_FITS = _chunkUXFI3CDZcjs.VIDEO_FITS; exports.VIDEO_GRADE_CONTROLS = _chunkUXFI3CDZcjs.VIDEO_GRADE_CONTROLS; exports.VIDEO_GRADE_PRESETS = _chunkUXFI3CDZcjs.VIDEO_GRADE_PRESETS; exports.VIDEO_GRADE_PRESET_NAMES = _chunkUXFI3CDZcjs.VIDEO_GRADE_PRESET_NAMES; exports.VIDEO_ISSUE_CODES = VIDEO_ISSUE_CODES; exports.VIDEO_KEYFRAME_LIMITS = _chunkUXFI3CDZcjs.VIDEO_KEYFRAME_LIMITS; exports.VIDEO_KEYFRAME_PROPERTIES = _chunkUXFI3CDZcjs.VIDEO_KEYFRAME_PROPERTIES; exports.VIDEO_LUT_MAX_SIZE = _chunkUXFI3CDZcjs.VIDEO_LUT_MAX_SIZE; exports.VIDEO_PEAK_BLOCK = VIDEO_PEAK_BLOCK; exports.VIDEO_PLACEMENT_MODES = _chunkUXFI3CDZcjs.VIDEO_PLACEMENT_MODES; exports.VIDEO_PREVIEW_SCALE_OPTIONS = VIDEO_PREVIEW_SCALE_OPTIONS; exports.VIDEO_PROXY_SCALES = VIDEO_PROXY_SCALES; exports.VIDEO_SCOPE_KINDS = VIDEO_SCOPE_KINDS; exports.VIDEO_TIME_EPSILON = _chunkUXFI3CDZcjs.VIDEO_TIME_EPSILON; exports.VIDEO_TRANSFORM_PROPERTIES = _chunkUXFI3CDZcjs.VIDEO_TRANSFORM_PROPERTIES; exports.VIDEO_TRANSITION_LABELS = VIDEO_TRANSITION_LABELS; exports.VIDEO_TRANSITION_TYPES = _chunkUXFI3CDZcjs.VIDEO_TRANSITION_TYPES; exports.VIDEO_VECTORSCOPE_TARGETS = VIDEO_VECTORSCOPE_TARGETS; exports.VIDEO_WIPE_DIRECTIONS = _chunkUXFI3CDZcjs.VIDEO_WIPE_DIRECTIONS; exports.VideoAudioPeaksCache = VideoAudioPeaksCache; exports.VideoEditorController = VideoEditorController; exports.VideoEffectsEngine = _chunkUXFI3CDZcjs.VideoEffectsEngine; exports.VideoFrameCache = VideoFrameCache; exports.VideoLutCache = _chunkUXFI3CDZcjs.VideoLutCache; exports.VideoPreviewEngine = VideoPreviewEngine; exports.VideoPreviewPixels = VideoPreviewPixels; exports.allVideoClipIds = _chunkUXFI3CDZcjs.allVideoClipIds; exports.allVideoTracks = _chunkUXFI3CDZcjs.allVideoTracks; exports.applyVideoEdits = applyVideoEdits; exports.applyVideoGrade = _chunkUXFI3CDZcjs.applyVideoGrade; exports.applyVideoLut = _chunkUXFI3CDZcjs.applyVideoLut; exports.applyVideoLutToPixels = _chunkUXFI3CDZcjs.applyVideoLutToPixels; exports.buildVideoAudioPeaks = buildVideoAudioPeaks; exports.checkVideoEffectPlace = _chunkUXFI3CDZcjs.checkVideoEffectPlace; exports.checkVideoEffectValues = _chunkUXFI3CDZcjs.checkVideoEffectValues; exports.checkVideoProject = checkVideoProject; exports.checkVideoTimeRemap = _chunkUXFI3CDZcjs.checkVideoTimeRemap; exports.createVideoEditorToolProvider = createVideoEditorToolProvider; exports.createVideoEffectsToolProvider = createVideoEffectsToolProvider; exports.createVideoElementDecoder = createVideoElementDecoder; exports.createVideoProject = createVideoProject; exports.decodeVideoAudioPeaks = decodeVideoAudioPeaks; exports.describeVideoProject = describeVideoProject; exports.describeVideoSequence = describeVideoSequence; exports.drawVideoFrame = _chunkUXFI3CDZcjs.drawVideoFrame; exports.ffmpegFilterValue = _chunkUXFI3CDZcjs.ffmpegFilterValue; exports.findVideoAudioSilences = findVideoAudioSilences; exports.findVideoClip = _chunkUXFI3CDZcjs.findVideoClip; exports.findVideoFillers = findVideoFillers; exports.findVideoGaps = _chunkUXFI3CDZcjs.findVideoGaps; exports.findVideoSequenceClip = _chunkUXFI3CDZcjs.findVideoSequenceClip; exports.findVideoSequenceCycle = _chunkUXFI3CDZcjs.findVideoSequenceCycle; exports.findVideoTranscriptPauses = findVideoTranscriptPauses; exports.findVideoTranscriptText = findVideoTranscriptText; exports.formatVideoSeconds = _chunkUXFI3CDZcjs.formatVideoSeconds; exports.formatVideoTimecode = _chunkUXFI3CDZcjs.formatVideoTimecode; exports.formatVideoTimecodeFrames = _chunkUXFI3CDZcjs.formatVideoTimecodeFrames; exports.isVideoDropFrameRate = _chunkUXFI3CDZcjs.isVideoDropFrameRate; exports.isVideoKeyframes = _chunkUXFI3CDZcjs.isVideoKeyframes; exports.mergeVideoRanges = mergeVideoRanges; exports.mixEffectPixels = _chunkUXFI3CDZcjs.mixEffectPixels; exports.nextFreeVideoSlot = _chunkUXFI3CDZcjs.nextFreeVideoSlot; exports.normalizeVideoGrade = _chunkUXFI3CDZcjs.normalizeVideoGrade; exports.normalizeVideoGradeLut = _chunkUXFI3CDZcjs.normalizeVideoGradeLut; exports.normalizeVideoWord = normalizeVideoWord; exports.overEffectPixels = _chunkUXFI3CDZcjs.overEffectPixels; exports.parseVideoAnimatable = parseVideoAnimatable; exports.parseVideoAsset = parseVideoAsset; exports.parseVideoAssetProxies = parseVideoAssetProxies; exports.parseVideoClip = parseVideoClip; exports.parseVideoClipAnimation = parseVideoClipAnimation; exports.parseVideoClipEffects = parseVideoClipEffects; exports.parseVideoCubeLut = _chunkUXFI3CDZcjs.parseVideoCubeLut; exports.parseVideoEffectRef = parseVideoEffectRef; exports.parseVideoEffectValues = parseVideoEffectValues; exports.parseVideoGrade = parseVideoGrade; exports.parseVideoGradeLut = parseVideoGradeLut; exports.parseVideoKeyframes = parseVideoKeyframes; exports.parseVideoLoudnessMeasurement = _chunkUXFI3CDZcjs.parseVideoLoudnessMeasurement; exports.parseVideoMarker = parseVideoMarker; exports.parseVideoPreviewScale = parseVideoPreviewScale; exports.parseVideoProject = parseVideoProject; exports.parseVideoSequence = parseVideoSequence; exports.parseVideoTimeRemap = parseVideoTimeRemap; exports.parseVideoTrack = parseVideoTrack; exports.parseVideoTranscript = parseVideoTranscript; exports.parseVideoTranscriptWords = parseVideoTranscriptWords; exports.parseVideoTransform = parseVideoTransform; exports.parseVideoTransition = parseVideoTransition; exports.placeVideoRect = _chunkUXFI3CDZcjs.placeVideoRect; exports.planVideoClipDrag = planVideoClipDrag; exports.planVideoPrefetch = planVideoPrefetch; exports.probeVideoMedia = probeVideoMedia; exports.readVideoScopesPanel = readVideoScopesPanel; exports.removeVideoKey = _chunkUXFI3CDZcjs.removeVideoKey; exports.renderVideoFrameExact = _chunkUXFI3CDZcjs.renderVideoFrameExact; exports.resolveVideoPreviewScale = resolveVideoPreviewScale; exports.retimeVideoAnimatable = _chunkUXFI3CDZcjs.retimeVideoAnimatable; exports.setVideoKey = _chunkUXFI3CDZcjs.setVideoKey; exports.snapToVideoFrame = _chunkUXFI3CDZcjs.snapToVideoFrame; exports.snapVideoTime = _chunkUXFI3CDZcjs.snapVideoTime; exports.sortVideoKeys = _chunkUXFI3CDZcjs.sortVideoKeys; exports.sortedVideoClips = _chunkUXFI3CDZcjs.sortedVideoClips; exports.splitVideoAnimatable = _chunkUXFI3CDZcjs.splitVideoAnimatable; exports.summarizeVideoScopes = summarizeVideoScopes; exports.toVideoEdl = _chunkUXFI3CDZcjs.toVideoEdl; exports.toVideoFfmpeg = _chunkUXFI3CDZcjs.toVideoFfmpeg; exports.toVideoLoudnessMeasure = _chunkUXFI3CDZcjs.toVideoLoudnessMeasure; exports.videoAssetDropEdit = videoAssetDropEdit; exports.videoAssetHasSound = _chunkUXFI3CDZcjs.videoAssetHasSound; exports.videoAssetKindOf = videoAssetKindOf; exports.videoAssetMap = _chunkUXFI3CDZcjs.videoAssetMap; exports.videoAssetProxy = videoAssetProxy; exports.videoAudioLevels = videoAudioLevels; exports.videoAudioPeakRange = videoAudioPeakRange; exports.videoAudioPeakSpans = videoAudioPeakSpans; exports.videoAudioPeaksDuration = videoAudioPeaksDuration; exports.videoCacheEvictions = videoCacheEvictions; exports.videoChroma = videoChroma; exports.videoClipAfter = _chunkUXFI3CDZcjs.videoClipAfter; exports.videoClipAnimated = _chunkUXFI3CDZcjs.videoClipAnimated; exports.videoClipAnimationProperties = _chunkUXFI3CDZcjs.videoClipAnimationProperties; exports.videoClipAnimationSpans = _chunkUXFI3CDZcjs.videoClipAnimationSpans; exports.videoClipAppliedEffects = videoClipAppliedEffects; exports.videoClipBefore = _chunkUXFI3CDZcjs.videoClipBefore; exports.videoClipEffectUses = _chunkUXFI3CDZcjs.videoClipEffectUses; exports.videoClipEnd = _chunkUXFI3CDZcjs.videoClipEnd; exports.videoClipHandles = _chunkUXFI3CDZcjs.videoClipHandles; exports.videoClipKeyframes = videoClipKeyframes; exports.videoClipLabel = videoClipLabel; exports.videoClipOverhang = _chunkUXFI3CDZcjs.videoClipOverhang; exports.videoClipShowsWaveform = videoClipShowsWaveform; exports.videoClipSoundGain = _chunkUXFI3CDZcjs.videoClipSoundGain; exports.videoClipSourceRange = _chunkUXFI3CDZcjs.videoClipSourceRange; exports.videoClipSourceTime = _chunkUXFI3CDZcjs.videoClipSourceTime; exports.videoClipSpeed = _chunkUXFI3CDZcjs.videoClipSpeed; exports.videoClipSpeedAt = _chunkUXFI3CDZcjs.videoClipSpeedAt; exports.videoClipTint = videoClipTint; exports.videoClipWaveform = videoClipWaveform; exports.videoClipWaveformPath = videoClipWaveformPath; exports.videoClipsAt = _chunkUXFI3CDZcjs.videoClipsAt; exports.videoContactSheetSvg = _chunkUXFI3CDZcjs.videoContactSheetSvg; exports.videoDragLabel = videoDragLabel; exports.videoDropTracks = videoDropTracks; exports.videoEaseBezier = _chunkUXFI3CDZcjs.videoEaseBezier; exports.videoEaseProgress = _chunkUXFI3CDZcjs.videoEaseProgress; exports.videoEffectFrameTime = _chunkUXFI3CDZcjs.videoEffectFrameTime; exports.videoEffectLayerKey = _chunkUXFI3CDZcjs.videoEffectLayerKey; exports.videoEffectValuesAt = _chunkUXFI3CDZcjs.videoEffectValuesAt; exports.videoExposureNotes = videoExposureNotes; exports.videoExposureStats = videoExposureStats; exports.videoFadeCurveGain = _chunkUXFI3CDZcjs.videoFadeCurveGain; exports.videoFfmpegUnsupportedEffects = _chunkUXFI3CDZcjs.videoFfmpegUnsupportedEffects; exports.videoFrameAt = _chunkUXFI3CDZcjs.videoFrameAt; exports.videoFrameCacheKey = videoFrameCacheKey; exports.videoFrameDuration = _chunkUXFI3CDZcjs.videoFrameDuration; exports.videoFrameLeafLayers = _chunkUXFI3CDZcjs.videoFrameLeafLayers; exports.videoFrameRequestsAt = videoFrameRequestsAt; exports.videoFrameToSvg = _chunkUXFI3CDZcjs.videoFrameToSvg; exports.videoFrames = _chunkUXFI3CDZcjs.videoFrames; exports.videoFreezeFrameEdit = _chunkUXFI3CDZcjs.videoFreezeFrameEdit; exports.videoGradeCssFilter = _chunkUXFI3CDZcjs.videoGradeCssFilter; exports.videoGradeFfmpegFilters = _chunkUXFI3CDZcjs.videoGradeFfmpegFilters; exports.videoGradeGainsFilterId = _chunkUXFI3CDZcjs.videoGradeGainsFilterId; exports.videoGradeLook = _chunkUXFI3CDZcjs.videoGradeLook; exports.videoGradePreset = _chunkUXFI3CDZcjs.videoGradePreset; exports.videoGradeStepMatrix = _chunkUXFI3CDZcjs.videoGradeStepMatrix; exports.videoGradeStepSvgValues = _chunkUXFI3CDZcjs.videoGradeStepSvgValues; exports.videoGradeSteps = _chunkUXFI3CDZcjs.videoGradeSteps; exports.videoGradeSvgDefs = _chunkUXFI3CDZcjs.videoGradeSvgDefs; exports.videoGradeSvgFilter = _chunkUXFI3CDZcjs.videoGradeSvgFilter; exports.videoHistogram = videoHistogram; exports.videoHistogramImage = videoHistogramImage; exports.videoHourFrames = _chunkUXFI3CDZcjs.videoHourFrames; exports.videoIrisRadius = _chunkUXFI3CDZcjs.videoIrisRadius; exports.videoIssueKey = videoIssueKey; exports.videoKeyframeBreakpoints = _chunkUXFI3CDZcjs.videoKeyframeBreakpoints; exports.videoKeyframeFfmpegExpr = _chunkUXFI3CDZcjs.videoKeyframeFfmpegExpr; exports.videoKeyframeRows = videoKeyframeRows; exports.videoKeyframeToggleEdit = videoKeyframeToggleEdit; exports.videoKeyframeValueEdit = videoKeyframeValueEdit; exports.videoKeysOf = _chunkUXFI3CDZcjs.videoKeysOf; exports.videoLayersUseEffects = _chunkUXFI3CDZcjs.videoLayersUseEffects; exports.videoLayersWithoutTransitionEffects = _chunkUXFI3CDZcjs.videoLayersWithoutTransitionEffects; exports.videoLuma = videoLuma; exports.videoLumaWaveform = videoLumaWaveform; exports.videoLutEdits = videoLutEdits; exports.videoLutFromFunction = _chunkUXFI3CDZcjs.videoLutFromFunction; exports.videoLutSvgApproximation = _chunkUXFI3CDZcjs.videoLutSvgApproximation; exports.videoLutSvgPrimitives = _chunkUXFI3CDZcjs.videoLutSvgPrimitives; exports.videoLutToCube = _chunkUXFI3CDZcjs.videoLutToCube; exports.videoOverlap = _chunkUXFI3CDZcjs.videoOverlap; exports.videoPeakDb = videoPeakDb; exports.videoPreviewSrc = videoPreviewSrc; exports.videoProjectDuration = _chunkUXFI3CDZcjs.videoProjectDuration; exports.videoProjectEffects = _chunkUXFI3CDZcjs.videoProjectEffects; exports.videoProjectHasProxies = videoProjectHasProxies; exports.videoProjectSvg = _chunkUXFI3CDZcjs.videoProjectSvg; exports.videoProxyFfmpeg = videoProxyFfmpeg; exports.videoProxyName = videoProxyName; exports.videoProxyPlan = videoProxyPlan; exports.videoRemoveRangesEdits = videoRemoveRangesEdits; exports.videoRulerTicks = videoRulerTicks; exports.videoScopeImage = videoScopeImage; exports.videoSequenceChildren = _chunkUXFI3CDZcjs.videoSequenceChildren; exports.videoSequenceDuration = _chunkUXFI3CDZcjs.videoSequenceDuration; exports.videoSequenceMap = _chunkUXFI3CDZcjs.videoSequenceMap; exports.videoShellQuote = _chunkUXFI3CDZcjs.videoShellQuote; exports.videoSlowMotionRamp = _chunkUXFI3CDZcjs.videoSlowMotionRamp; exports.videoSnapPoints = _chunkUXFI3CDZcjs.videoSnapPoints; exports.videoSourceFrame = videoSourceFrame; exports.videoSourceFrameTime = videoSourceFrameTime; exports.videoSpeedRampEdit = _chunkUXFI3CDZcjs.videoSpeedRampEdit; exports.videoSpeedRampKeys = _chunkUXFI3CDZcjs.videoSpeedRampKeys; exports.videoTextStyle = _chunkUXFI3CDZcjs.videoTextStyle; exports.videoTimeRemapBreakpoints = _chunkUXFI3CDZcjs.videoTimeRemapBreakpoints; exports.videoTimeRemapSpan = _chunkUXFI3CDZcjs.videoTimeRemapSpan; exports.videoTimecodeFrames = _chunkUXFI3CDZcjs.videoTimecodeFrames; exports.videoTimelineTranscript = videoTimelineTranscript; exports.videoTitleFrame = _chunkUXFI3CDZcjs.videoTitleFrame; exports.videoTrackSyncLocked = _chunkUXFI3CDZcjs.videoTrackSyncLocked; exports.videoTranscriptEdit = videoTranscriptEdit; exports.videoTranscriptTrack = videoTranscriptTrack; exports.videoTransformAt = _chunkUXFI3CDZcjs.videoTransformAt; exports.videoTransitionAudioCurve = _chunkUXFI3CDZcjs.videoTransitionAudioCurve; exports.videoTransitionEase = _chunkUXFI3CDZcjs.videoTransitionEase; exports.videoTransitionHasDirection = videoTransitionHasDirection; exports.videoValueAt = _chunkUXFI3CDZcjs.videoValueAt; exports.videoVectorscope = videoVectorscope; exports.videoVectorscopeAngle = videoVectorscopeAngle; exports.videoVectorscopeImage = videoVectorscopeImage; exports.videoVectorscopePoint = videoVectorscopePoint; exports.videoWaveformImage = videoWaveformImage; exports.videoWaveformPath = videoWaveformPath; exports.videoWipeRect = _chunkUXFI3CDZcjs.videoWipeRect; exports.videoWordAt = videoWordAt; exports.videoWordsRange = videoWordsRange;
5061
+ exports.VIDEO_BLEND_MODES = _chunkSFCPGMCTcjs.VIDEO_BLEND_MODES; exports.VIDEO_BLEND_MODE_LABELS = VIDEO_BLEND_MODE_LABELS; exports.VIDEO_CLIP_ANIMATION_DURATION = _chunkSFCPGMCTcjs.VIDEO_CLIP_ANIMATION_DURATION; exports.VIDEO_CLIP_ANIMATION_EFFECTS = _chunkSFCPGMCTcjs.VIDEO_CLIP_ANIMATION_EFFECTS; exports.VIDEO_CLIP_ANIMATION_LABELS = VIDEO_CLIP_ANIMATION_LABELS; exports.VIDEO_CLIP_TYPES = _chunkSFCPGMCTcjs.VIDEO_CLIP_TYPES; exports.VIDEO_DEFAULT_FILLERS = VIDEO_DEFAULT_FILLERS; exports.VIDEO_DEFAULT_STILL_DURATION = VIDEO_DEFAULT_STILL_DURATION; exports.VIDEO_DEFAULT_TITLE_DURATION = VIDEO_DEFAULT_TITLE_DURATION; exports.VIDEO_EASE_NAMES = _chunkSFCPGMCTcjs.VIDEO_EASE_NAMES; exports.VIDEO_EDIT_OPS = VIDEO_EDIT_OPS; exports.VIDEO_EFFECT_PLACES = _chunkSFCPGMCTcjs.VIDEO_EFFECT_PLACES; exports.VIDEO_FADE_CURVES = _chunkSFCPGMCTcjs.VIDEO_FADE_CURVES; exports.VIDEO_FADE_CURVE_LABELS = VIDEO_FADE_CURVE_LABELS; exports.VIDEO_FITS = _chunkSFCPGMCTcjs.VIDEO_FITS; exports.VIDEO_GRADE_CONTROLS = _chunkSFCPGMCTcjs.VIDEO_GRADE_CONTROLS; exports.VIDEO_GRADE_PRESETS = _chunkSFCPGMCTcjs.VIDEO_GRADE_PRESETS; exports.VIDEO_GRADE_PRESET_NAMES = _chunkSFCPGMCTcjs.VIDEO_GRADE_PRESET_NAMES; exports.VIDEO_ISSUE_CODES = VIDEO_ISSUE_CODES; exports.VIDEO_KEYFRAME_LIMITS = _chunkSFCPGMCTcjs.VIDEO_KEYFRAME_LIMITS; exports.VIDEO_KEYFRAME_PROPERTIES = _chunkSFCPGMCTcjs.VIDEO_KEYFRAME_PROPERTIES; exports.VIDEO_LUT_MAX_SIZE = _chunkSFCPGMCTcjs.VIDEO_LUT_MAX_SIZE; exports.VIDEO_PEAK_BLOCK = VIDEO_PEAK_BLOCK; exports.VIDEO_PLACEMENT_MODES = _chunkSFCPGMCTcjs.VIDEO_PLACEMENT_MODES; exports.VIDEO_PREVIEW_SCALE_OPTIONS = VIDEO_PREVIEW_SCALE_OPTIONS; exports.VIDEO_PROXY_SCALES = VIDEO_PROXY_SCALES; exports.VIDEO_SCOPE_KINDS = VIDEO_SCOPE_KINDS; exports.VIDEO_TIME_EPSILON = _chunkSFCPGMCTcjs.VIDEO_TIME_EPSILON; exports.VIDEO_TRANSFORM_PROPERTIES = _chunkSFCPGMCTcjs.VIDEO_TRANSFORM_PROPERTIES; exports.VIDEO_TRANSITION_LABELS = VIDEO_TRANSITION_LABELS; exports.VIDEO_TRANSITION_TYPES = _chunkSFCPGMCTcjs.VIDEO_TRANSITION_TYPES; exports.VIDEO_VECTORSCOPE_TARGETS = VIDEO_VECTORSCOPE_TARGETS; exports.VIDEO_WIPE_DIRECTIONS = _chunkSFCPGMCTcjs.VIDEO_WIPE_DIRECTIONS; exports.VideoAudioPeaksCache = VideoAudioPeaksCache; exports.VideoEditorController = VideoEditorController; exports.VideoEffectsEngine = _chunkSFCPGMCTcjs.VideoEffectsEngine; exports.VideoFrameCache = VideoFrameCache; exports.VideoLutCache = _chunkSFCPGMCTcjs.VideoLutCache; exports.VideoPreviewEngine = VideoPreviewEngine; exports.VideoPreviewPixels = VideoPreviewPixels; exports.allVideoClipIds = _chunkSFCPGMCTcjs.allVideoClipIds; exports.allVideoTracks = _chunkSFCPGMCTcjs.allVideoTracks; exports.applyVideoEdits = applyVideoEdits; exports.applyVideoGrade = _chunkSFCPGMCTcjs.applyVideoGrade; exports.applyVideoLut = _chunkSFCPGMCTcjs.applyVideoLut; exports.applyVideoLutToPixels = _chunkSFCPGMCTcjs.applyVideoLutToPixels; exports.buildVideoAudioPeaks = buildVideoAudioPeaks; exports.checkVideoEffectPlace = _chunkSFCPGMCTcjs.checkVideoEffectPlace; exports.checkVideoEffectValues = _chunkSFCPGMCTcjs.checkVideoEffectValues; exports.checkVideoProject = checkVideoProject; exports.checkVideoTimeRemap = _chunkSFCPGMCTcjs.checkVideoTimeRemap; exports.createVideoEditorToolProvider = createVideoEditorToolProvider; exports.createVideoEffectsToolProvider = createVideoEffectsToolProvider; exports.createVideoElementDecoder = createVideoElementDecoder; exports.createVideoProject = createVideoProject; exports.decodeVideoAudioPeaks = decodeVideoAudioPeaks; exports.describeVideoProject = describeVideoProject; exports.describeVideoSequence = describeVideoSequence; exports.drawVideoFrame = _chunkSFCPGMCTcjs.drawVideoFrame; exports.ffmpegFilterValue = _chunkSFCPGMCTcjs.ffmpegFilterValue; exports.findVideoAudioSilences = findVideoAudioSilences; exports.findVideoClip = _chunkSFCPGMCTcjs.findVideoClip; exports.findVideoFillers = findVideoFillers; exports.findVideoGaps = _chunkSFCPGMCTcjs.findVideoGaps; exports.findVideoSequenceClip = _chunkSFCPGMCTcjs.findVideoSequenceClip; exports.findVideoSequenceCycle = _chunkSFCPGMCTcjs.findVideoSequenceCycle; exports.findVideoTranscriptPauses = findVideoTranscriptPauses; exports.findVideoTranscriptText = findVideoTranscriptText; exports.formatVideoSeconds = _chunkSFCPGMCTcjs.formatVideoSeconds; exports.formatVideoTimecode = _chunkSFCPGMCTcjs.formatVideoTimecode; exports.formatVideoTimecodeFrames = _chunkSFCPGMCTcjs.formatVideoTimecodeFrames; exports.isVideoDropFrameRate = _chunkSFCPGMCTcjs.isVideoDropFrameRate; exports.isVideoKeyframes = _chunkSFCPGMCTcjs.isVideoKeyframes; exports.mergeVideoRanges = mergeVideoRanges; exports.mixEffectPixels = _chunkSFCPGMCTcjs.mixEffectPixels; exports.nextFreeVideoSlot = _chunkSFCPGMCTcjs.nextFreeVideoSlot; exports.normalizeVideoGrade = _chunkSFCPGMCTcjs.normalizeVideoGrade; exports.normalizeVideoGradeLut = _chunkSFCPGMCTcjs.normalizeVideoGradeLut; exports.normalizeVideoWord = normalizeVideoWord; exports.overEffectPixels = _chunkSFCPGMCTcjs.overEffectPixels; exports.parseVideoAnimatable = parseVideoAnimatable; exports.parseVideoAsset = parseVideoAsset; exports.parseVideoAssetProxies = parseVideoAssetProxies; exports.parseVideoClip = parseVideoClip; exports.parseVideoClipAnimation = parseVideoClipAnimation; exports.parseVideoClipEffects = parseVideoClipEffects; exports.parseVideoCubeLut = _chunkSFCPGMCTcjs.parseVideoCubeLut; exports.parseVideoEffectRef = parseVideoEffectRef; exports.parseVideoEffectValues = parseVideoEffectValues; exports.parseVideoGrade = parseVideoGrade; exports.parseVideoGradeLut = parseVideoGradeLut; exports.parseVideoKeyframes = parseVideoKeyframes; exports.parseVideoLoudnessMeasurement = _chunkSFCPGMCTcjs.parseVideoLoudnessMeasurement; exports.parseVideoMarker = parseVideoMarker; exports.parseVideoPreviewScale = parseVideoPreviewScale; exports.parseVideoProject = parseVideoProject; exports.parseVideoSequence = parseVideoSequence; exports.parseVideoTimeRemap = parseVideoTimeRemap; exports.parseVideoTrack = parseVideoTrack; exports.parseVideoTranscript = parseVideoTranscript; exports.parseVideoTranscriptWords = parseVideoTranscriptWords; exports.parseVideoTransform = parseVideoTransform; exports.parseVideoTransition = parseVideoTransition; exports.placeVideoRect = _chunkSFCPGMCTcjs.placeVideoRect; exports.planVideoClipDrag = planVideoClipDrag; exports.planVideoPrefetch = planVideoPrefetch; exports.probeVideoMedia = probeVideoMedia; exports.readVideoScopesPanel = readVideoScopesPanel; exports.removeVideoKey = _chunkSFCPGMCTcjs.removeVideoKey; exports.renderVideoFrameExact = _chunkSFCPGMCTcjs.renderVideoFrameExact; exports.resolveVideoPreviewScale = resolveVideoPreviewScale; exports.retimeVideoAnimatable = _chunkSFCPGMCTcjs.retimeVideoAnimatable; exports.setVideoKey = _chunkSFCPGMCTcjs.setVideoKey; exports.snapToVideoFrame = _chunkSFCPGMCTcjs.snapToVideoFrame; exports.snapVideoTime = _chunkSFCPGMCTcjs.snapVideoTime; exports.sortVideoKeys = _chunkSFCPGMCTcjs.sortVideoKeys; exports.sortedVideoClips = _chunkSFCPGMCTcjs.sortedVideoClips; exports.splitVideoAnimatable = _chunkSFCPGMCTcjs.splitVideoAnimatable; exports.summarizeVideoScopes = summarizeVideoScopes; exports.toVideoEdl = _chunkSFCPGMCTcjs.toVideoEdl; exports.toVideoFfmpeg = _chunkSFCPGMCTcjs.toVideoFfmpeg; exports.toVideoLoudnessMeasure = _chunkSFCPGMCTcjs.toVideoLoudnessMeasure; exports.videoAssetDropEdit = videoAssetDropEdit; exports.videoAssetHasSound = _chunkSFCPGMCTcjs.videoAssetHasSound; exports.videoAssetKindOf = videoAssetKindOf; exports.videoAssetMap = _chunkSFCPGMCTcjs.videoAssetMap; exports.videoAssetProxy = videoAssetProxy; exports.videoAudioLevels = videoAudioLevels; exports.videoAudioPeakRange = videoAudioPeakRange; exports.videoAudioPeakSpans = videoAudioPeakSpans; exports.videoAudioPeaksDuration = videoAudioPeaksDuration; exports.videoCacheEvictions = videoCacheEvictions; exports.videoChroma = videoChroma; exports.videoClipAfter = _chunkSFCPGMCTcjs.videoClipAfter; exports.videoClipAnimated = _chunkSFCPGMCTcjs.videoClipAnimated; exports.videoClipAnimationProperties = _chunkSFCPGMCTcjs.videoClipAnimationProperties; exports.videoClipAnimationSpans = _chunkSFCPGMCTcjs.videoClipAnimationSpans; exports.videoClipAppliedEffects = videoClipAppliedEffects; exports.videoClipBefore = _chunkSFCPGMCTcjs.videoClipBefore; exports.videoClipEffectUses = _chunkSFCPGMCTcjs.videoClipEffectUses; exports.videoClipEnd = _chunkSFCPGMCTcjs.videoClipEnd; exports.videoClipHandles = _chunkSFCPGMCTcjs.videoClipHandles; exports.videoClipKeyframes = videoClipKeyframes; exports.videoClipLabel = videoClipLabel; exports.videoClipOverhang = _chunkSFCPGMCTcjs.videoClipOverhang; exports.videoClipShowsWaveform = videoClipShowsWaveform; exports.videoClipSoundGain = _chunkSFCPGMCTcjs.videoClipSoundGain; exports.videoClipSourceRange = _chunkSFCPGMCTcjs.videoClipSourceRange; exports.videoClipSourceTime = _chunkSFCPGMCTcjs.videoClipSourceTime; exports.videoClipSpeed = _chunkSFCPGMCTcjs.videoClipSpeed; exports.videoClipSpeedAt = _chunkSFCPGMCTcjs.videoClipSpeedAt; exports.videoClipTint = videoClipTint; exports.videoClipWaveform = videoClipWaveform; exports.videoClipWaveformPath = videoClipWaveformPath; exports.videoClipsAt = _chunkSFCPGMCTcjs.videoClipsAt; exports.videoContactSheetSvg = _chunkSFCPGMCTcjs.videoContactSheetSvg; exports.videoDragLabel = videoDragLabel; exports.videoDropTracks = videoDropTracks; exports.videoEaseBezier = _chunkSFCPGMCTcjs.videoEaseBezier; exports.videoEaseProgress = _chunkSFCPGMCTcjs.videoEaseProgress; exports.videoEffectFrameTime = _chunkSFCPGMCTcjs.videoEffectFrameTime; exports.videoEffectLayerKey = _chunkSFCPGMCTcjs.videoEffectLayerKey; exports.videoEffectValuesAt = _chunkSFCPGMCTcjs.videoEffectValuesAt; exports.videoExposureNotes = videoExposureNotes; exports.videoExposureStats = videoExposureStats; exports.videoFadeCurveGain = _chunkSFCPGMCTcjs.videoFadeCurveGain; exports.videoFfmpegUnsupportedEffects = _chunkSFCPGMCTcjs.videoFfmpegUnsupportedEffects; exports.videoFrameAt = _chunkSFCPGMCTcjs.videoFrameAt; exports.videoFrameCacheKey = videoFrameCacheKey; exports.videoFrameDuration = _chunkSFCPGMCTcjs.videoFrameDuration; exports.videoFrameLeafLayers = _chunkSFCPGMCTcjs.videoFrameLeafLayers; exports.videoFrameRequestsAt = videoFrameRequestsAt; exports.videoFrameToSvg = _chunkSFCPGMCTcjs.videoFrameToSvg; exports.videoFrames = _chunkSFCPGMCTcjs.videoFrames; exports.videoFreezeFrameEdit = _chunkSFCPGMCTcjs.videoFreezeFrameEdit; exports.videoGradeCssFilter = _chunkSFCPGMCTcjs.videoGradeCssFilter; exports.videoGradeFfmpegFilters = _chunkSFCPGMCTcjs.videoGradeFfmpegFilters; exports.videoGradeGainsFilterId = _chunkSFCPGMCTcjs.videoGradeGainsFilterId; exports.videoGradeLook = _chunkSFCPGMCTcjs.videoGradeLook; exports.videoGradePreset = _chunkSFCPGMCTcjs.videoGradePreset; exports.videoGradeStepMatrix = _chunkSFCPGMCTcjs.videoGradeStepMatrix; exports.videoGradeStepSvgValues = _chunkSFCPGMCTcjs.videoGradeStepSvgValues; exports.videoGradeSteps = _chunkSFCPGMCTcjs.videoGradeSteps; exports.videoGradeSvgDefs = _chunkSFCPGMCTcjs.videoGradeSvgDefs; exports.videoGradeSvgFilter = _chunkSFCPGMCTcjs.videoGradeSvgFilter; exports.videoHistogram = videoHistogram; exports.videoHistogramImage = videoHistogramImage; exports.videoHourFrames = _chunkSFCPGMCTcjs.videoHourFrames; exports.videoIrisRadius = _chunkSFCPGMCTcjs.videoIrisRadius; exports.videoIssueKey = videoIssueKey; exports.videoKeyframeBreakpoints = _chunkSFCPGMCTcjs.videoKeyframeBreakpoints; exports.videoKeyframeFfmpegExpr = _chunkSFCPGMCTcjs.videoKeyframeFfmpegExpr; exports.videoKeyframeRows = videoKeyframeRows; exports.videoKeyframeToggleEdit = videoKeyframeToggleEdit; exports.videoKeyframeValueEdit = videoKeyframeValueEdit; exports.videoKeysOf = _chunkSFCPGMCTcjs.videoKeysOf; exports.videoLayersUseEffects = _chunkSFCPGMCTcjs.videoLayersUseEffects; exports.videoLayersWithoutTransitionEffects = _chunkSFCPGMCTcjs.videoLayersWithoutTransitionEffects; exports.videoLuma = videoLuma; exports.videoLumaWaveform = videoLumaWaveform; exports.videoLutEdits = videoLutEdits; exports.videoLutFromFunction = _chunkSFCPGMCTcjs.videoLutFromFunction; exports.videoLutSvgApproximation = _chunkSFCPGMCTcjs.videoLutSvgApproximation; exports.videoLutSvgPrimitives = _chunkSFCPGMCTcjs.videoLutSvgPrimitives; exports.videoLutToCube = _chunkSFCPGMCTcjs.videoLutToCube; exports.videoOverlap = _chunkSFCPGMCTcjs.videoOverlap; exports.videoPeakDb = videoPeakDb; exports.videoPreviewSrc = videoPreviewSrc; exports.videoProjectDuration = _chunkSFCPGMCTcjs.videoProjectDuration; exports.videoProjectEffects = _chunkSFCPGMCTcjs.videoProjectEffects; exports.videoProjectHasProxies = videoProjectHasProxies; exports.videoProjectSvg = _chunkSFCPGMCTcjs.videoProjectSvg; exports.videoProxyFfmpeg = videoProxyFfmpeg; exports.videoProxyName = videoProxyName; exports.videoProxyPlan = videoProxyPlan; exports.videoRemoveRangesEdits = videoRemoveRangesEdits; exports.videoRulerTicks = videoRulerTicks; exports.videoScopeImage = videoScopeImage; exports.videoSequenceChildren = _chunkSFCPGMCTcjs.videoSequenceChildren; exports.videoSequenceDuration = _chunkSFCPGMCTcjs.videoSequenceDuration; exports.videoSequenceMap = _chunkSFCPGMCTcjs.videoSequenceMap; exports.videoShellQuote = _chunkSFCPGMCTcjs.videoShellQuote; exports.videoSlowMotionRamp = _chunkSFCPGMCTcjs.videoSlowMotionRamp; exports.videoSnapPoints = _chunkSFCPGMCTcjs.videoSnapPoints; exports.videoSourceFrame = videoSourceFrame; exports.videoSourceFrameTime = videoSourceFrameTime; exports.videoSpeedRampEdit = _chunkSFCPGMCTcjs.videoSpeedRampEdit; exports.videoSpeedRampKeys = _chunkSFCPGMCTcjs.videoSpeedRampKeys; exports.videoTextStyle = _chunkSFCPGMCTcjs.videoTextStyle; exports.videoTimeRemapBreakpoints = _chunkSFCPGMCTcjs.videoTimeRemapBreakpoints; exports.videoTimeRemapSpan = _chunkSFCPGMCTcjs.videoTimeRemapSpan; exports.videoTimecodeFrames = _chunkSFCPGMCTcjs.videoTimecodeFrames; exports.videoTimelineTranscript = videoTimelineTranscript; exports.videoTitleFrame = _chunkSFCPGMCTcjs.videoTitleFrame; exports.videoTrackSyncLocked = _chunkSFCPGMCTcjs.videoTrackSyncLocked; exports.videoTranscriptEdit = videoTranscriptEdit; exports.videoTranscriptTrack = videoTranscriptTrack; exports.videoTransformAt = _chunkSFCPGMCTcjs.videoTransformAt; exports.videoTransitionAudioCurve = _chunkSFCPGMCTcjs.videoTransitionAudioCurve; exports.videoTransitionEase = _chunkSFCPGMCTcjs.videoTransitionEase; exports.videoTransitionHasDirection = videoTransitionHasDirection; exports.videoValueAt = _chunkSFCPGMCTcjs.videoValueAt; exports.videoVectorscope = videoVectorscope; exports.videoVectorscopeAngle = videoVectorscopeAngle; exports.videoVectorscopeImage = videoVectorscopeImage; exports.videoVectorscopePoint = videoVectorscopePoint; exports.videoWaveformImage = videoWaveformImage; exports.videoWaveformPath = videoWaveformPath; exports.videoWipeRect = _chunkSFCPGMCTcjs.videoWipeRect; exports.videoWordAt = videoWordAt; exports.videoWordsRange = videoWordsRange;
5064
5062
  //# sourceMappingURL=index.cjs.map