@pixerate/editor 0.124.1 → 0.126.0

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