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