pixi-effects 0.18.0 → 0.19.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 (52) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +6 -6
  3. package/ai/CHAT.md +1 -1
  4. package/ai/SKILL.md +1 -1
  5. package/ai/chat-template.html +4 -4
  6. package/ai/reference/cheatsheet.md +5 -5
  7. package/ai/reference/pitfalls.md +5 -1
  8. package/ai/reference/recipes.md +65 -0
  9. package/ai/template.html +5 -5
  10. package/ai/tools/check.mjs +14 -3
  11. package/dist/{Base-BQUodYZK.d.ts → Base-B4WbUJO2.d.ts} +1 -1
  12. package/dist/{Base-OHqp8qvX.d.cts → Base-i88XXaiP.d.cts} +1 -1
  13. package/dist/Composition-KYNPRWK3.cjs +14 -0
  14. package/dist/{Composition-6JMXWNVV.cjs.map → Composition-KYNPRWK3.cjs.map} +1 -1
  15. package/dist/Composition-QBKEEJBV.js +5 -0
  16. package/dist/{Composition-MLBHYYFF.js.map → Composition-QBKEEJBV.js.map} +1 -1
  17. package/dist/Controller.d.cts +2 -2
  18. package/dist/Controller.d.ts +2 -2
  19. package/dist/{Movie-DlHQ9C02.d.ts → Movie-8IrqL3kO.d.ts} +6 -1
  20. package/dist/{Movie-K2YuVAdg.d.cts → Movie-CpmdNadg.d.cts} +6 -1
  21. package/dist/Presenter.d.cts +2 -2
  22. package/dist/Presenter.d.ts +2 -2
  23. package/dist/{chunk-UXDR3ZDU.js → chunk-B3YB2TNY.js} +4 -3
  24. package/dist/chunk-B3YB2TNY.js.map +1 -0
  25. package/dist/{chunk-JW67MDHQ.cjs → chunk-CTZRFSVU.cjs} +27 -26
  26. package/dist/chunk-CTZRFSVU.cjs.map +1 -0
  27. package/dist/{chunk-ANO5R2E6.cjs → chunk-VTBT6NNE.cjs} +755 -48
  28. package/dist/chunk-VTBT6NNE.cjs.map +1 -0
  29. package/dist/{chunk-SG3Y66FN.js → chunk-YRXTKOV5.js} +757 -51
  30. package/dist/chunk-YRXTKOV5.js.map +1 -0
  31. package/dist/index.cjs +73 -36
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.d.cts +5 -5
  34. package/dist/index.d.ts +5 -5
  35. package/dist/index.js +50 -13
  36. package/dist/index.js.map +1 -1
  37. package/dist/loader.css +1 -1
  38. package/dist/three.cjs +5 -5
  39. package/dist/three.d.cts +2 -2
  40. package/dist/three.d.ts +2 -2
  41. package/dist/three.js +1 -1
  42. package/dist/{types-SS51lP6O.d.cts → types-bzLJ7aUx.d.cts} +16 -6
  43. package/dist/{types-SS51lP6O.d.ts → types-bzLJ7aUx.d.ts} +16 -6
  44. package/docs/dsl.md +36 -5
  45. package/llms-full.txt +112 -11
  46. package/package.json +1 -1
  47. package/dist/Composition-6JMXWNVV.cjs +0 -14
  48. package/dist/Composition-MLBHYYFF.js +0 -5
  49. package/dist/chunk-ANO5R2E6.cjs.map +0 -1
  50. package/dist/chunk-JW67MDHQ.cjs.map +0 -1
  51. package/dist/chunk-SG3Y66FN.js.map +0 -1
  52. package/dist/chunk-UXDR3ZDU.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkJW67MDHQ_cjs = require('./chunk-JW67MDHQ.cjs');
4
- var chunkANO5R2E6_cjs = require('./chunk-ANO5R2E6.cjs');
3
+ var chunkCTZRFSVU_cjs = require('./chunk-CTZRFSVU.cjs');
4
+ var chunkVTBT6NNE_cjs = require('./chunk-VTBT6NNE.cjs');
5
5
  var chunkUQBGW5DO_cjs = require('./chunk-UQBGW5DO.cjs');
6
6
  var PIXI = require('pixi.js');
7
7
  var gsap = require('gsap');
@@ -489,6 +489,14 @@ function namedScenes(rows) {
489
489
  return rows.filter((r) => r.depth === 0 && r.type === "composition" && !/[#×]/.test(r.name) && r.end - r.start >= 1).map((r) => ({ name: r.name, start: r.start, end: r.end }));
490
490
  }
491
491
 
492
+ // src/core/timeFilters.ts
493
+ function collectTimeFilters(seq, out = []) {
494
+ for (const f of seq.filters ?? []) if (typeof f.setTime === "function") out.push(f);
495
+ if (seq.maskSequence) collectTimeFilters(seq.maskSequence, out);
496
+ for (const child of seq._children ?? []) collectTimeFilters(child, out);
497
+ return out;
498
+ }
499
+
492
500
  // src/core/review.ts
493
501
  function sampleFrames({ totalFrames, frameRate, scenes = [], step = 0.25, cap = 240 }) {
494
502
  const last = totalFrames;
@@ -1225,16 +1233,16 @@ function expandTransitions(spec) {
1225
1233
  if (toUses > 1) {
1226
1234
  throw new Error(`pixi-effects: ${tag} sequence "${t.to}" is used as \`to\` in more than one transition`);
1227
1235
  }
1228
- const tStart = chunkANO5R2E6_cjs.resolveAt(t.at, parentDuration);
1236
+ const tStart = chunkVTBT6NNE_cjs.resolveAt(t.at, parentDuration);
1229
1237
  const tEnd = tStart + t.duration;
1230
1238
  const fromSeq = fromEntry.seq;
1231
- const fromStart = chunkANO5R2E6_cjs.resolveAt(fromSeq.at, parentDuration);
1239
+ const fromStart = chunkVTBT6NNE_cjs.resolveAt(fromSeq.at, parentDuration);
1232
1240
  const fromEnd = fromStart + (fromSeq.duration ?? parentDuration);
1233
1241
  if (tStart < fromStart - EPS || tEnd > fromEnd + EPS) {
1234
1242
  throw new Error(`pixi-effects: ${tag} window [${tStart}, ${tEnd}] is not covered by \`from\` "${t.from}" (lives [${fromStart}, ${fromEnd}], so it ends at ${fromEnd})`);
1235
1243
  }
1236
1244
  const toSeq = toEntry.seq;
1237
- const toStart = chunkANO5R2E6_cjs.resolveAt(toSeq.at, parentDuration);
1245
+ const toStart = chunkVTBT6NNE_cjs.resolveAt(toSeq.at, parentDuration);
1238
1246
  const toEnd = toStart + (toSeq.duration ?? parentDuration);
1239
1247
  if (tStart < toStart - EPS || tEnd > toEnd + EPS) {
1240
1248
  throw new Error(`pixi-effects: ${tag} window [${tStart}, ${tEnd}] is not covered by \`to\` "${t.to}" (lives [${toStart}, ${toEnd}], so it starts at ${toStart})`);
@@ -1574,9 +1582,9 @@ function inspectScene(root, frame, time, canvas, opts = {}) {
1574
1582
  onCanvas = inter === 0 && area > 0 ? "none" : inter >= area - 1e-6 ? "full" : "partial";
1575
1583
  if (area === 0) onCanvas = "none";
1576
1584
  }
1577
- const keys = chunkANO5R2E6_cjs.collectPropKeys(seq.spec);
1585
+ const keys = chunkVTBT6NNE_cjs.collectPropKeys(seq.spec);
1578
1586
  const carried = carriers.some((c) => {
1579
- const k = chunkANO5R2E6_cjs.collectPropKeys(c.spec);
1587
+ const k = chunkVTBT6NNE_cjs.collectPropKeys(c.spec);
1580
1588
  return (c.spec.keyframes ?? []).length > 0 && (k.has("x") || k.has("y") || k.has("rotation") || k.has("scale"));
1581
1589
  });
1582
1590
  const moving = parentMoving || carried || (seq.spec.keyframes ?? []).length > 0 && (keys.has("x") || keys.has("y"));
@@ -1597,7 +1605,7 @@ function inspectScene(root, frame, time, canvas, opts = {}) {
1597
1605
  const group = parentScene ?? (name !== void 0 && blending.has(name) ? name : void 0);
1598
1606
  if (group) scene.set(info, group);
1599
1607
  if (zero || seq.showsNothingYet) scaledToNothing.add(info);
1600
- if (seq instanceof chunkJW67MDHQ_cjs.CompositionSequence) walk2(seq, prefix + label + "/", insideThreeD || threeD, visible, group, moving, zero);
1608
+ if (seq instanceof chunkCTZRFSVU_cjs.CompositionSequence) walk2(seq, prefix + label + "/", insideThreeD || threeD, visible, group, moving, zero);
1601
1609
  });
1602
1610
  };
1603
1611
  walk2(root, "", false, true);
@@ -1658,10 +1666,10 @@ function walk(comp, parentStart, parentEnd, depth, prefix, rows, transitions) {
1658
1666
  const start = parentStart + (seq.at ?? 0);
1659
1667
  const end = Math.min(parentEnd, seq.duration !== void 0 ? start + seq.duration : parentEnd);
1660
1668
  const span = end - start;
1661
- const keys = (seq.spec.keyframes ?? []).map((kf) => round(start + chunkANO5R2E6_cjs.resolveAt(kf.at, span))).sort((a, b) => a - b).slice(0, MAX_KEYS);
1669
+ const keys = (seq.spec.keyframes ?? []).map((kf) => round(start + chunkVTBT6NNE_cjs.resolveAt(kf.at, span))).sort((a, b) => a - b).slice(0, MAX_KEYS);
1662
1670
  const row = { path: prefix + name, name, type: seq.spec.type, depth, start: round(start), end: round(end), keys, detail: detailOf(seq) };
1663
1671
  const inner = [];
1664
- const isComp = seq instanceof chunkJW67MDHQ_cjs.CompositionSequence;
1672
+ const isComp = seq instanceof chunkCTZRFSVU_cjs.CompositionSequence;
1665
1673
  if (isComp) walk(seq, start, end, depth + 1, prefix + name + "/", inner, transitions);
1666
1674
  entries.push({ row, inner, groupable: !isComp });
1667
1675
  });
@@ -2094,6 +2102,15 @@ var Movie = class {
2094
2102
  background = "#000000";
2095
2103
  _audioContext = null;
2096
2104
  _rootSequence = null;
2105
+ /** The filters that take the time of the frame they draw (`grain`), collected once after the build. */
2106
+ _timeFilters = [];
2107
+ /** While a motion-blurred frame is exposed: the frame's own time, so all its sub-frames share one grain frame (and not the playhead's). */
2108
+ _nominalTime = null;
2109
+ _feedTimeFilters() {
2110
+ if (!this._timeFilters.length) return;
2111
+ const t = this._nominalTime ?? this._timeOf(this.currentFrame);
2112
+ for (const f of this._timeFilters) f.setTime(t);
2113
+ }
2097
2114
  _rootContainer = null;
2098
2115
  _raf = null;
2099
2116
  /** What went into the mix, and its peak before limiting — kept for inspectAudio(). */
@@ -2210,7 +2227,7 @@ var Movie = class {
2210
2227
  height: options.composition.height ?? this.height,
2211
2228
  duration: options.composition.duration ?? this.duration
2212
2229
  } : void 0;
2213
- await chunkANO5R2E6_cjs.ensureFilterLibrary(seededComposition);
2230
+ await chunkVTBT6NNE_cjs.ensureFilterLibrary(seededComposition);
2214
2231
  const userComposition = seededComposition ? expandTransitions(seededComposition) : void 0;
2215
2232
  const rootSeqSpec = {
2216
2233
  type: "composition",
@@ -2220,11 +2237,12 @@ var Movie = class {
2220
2237
  ...userComposition
2221
2238
  };
2222
2239
  if (userComposition) carryTransitionWindows(userComposition, rootSeqSpec);
2223
- const composition = new chunkJW67MDHQ_cjs.CompositionSequence(rootSeqSpec, null, rootShape);
2240
+ const composition = new chunkCTZRFSVU_cjs.CompositionSequence(rootSeqSpec, null, rootShape);
2224
2241
  await composition.build();
2225
2242
  this._rootSequence = composition;
2226
2243
  if (composition.target) root.addChild(composition.target);
2227
2244
  composition.bindTimeline(this.timeline);
2245
+ this._timeFilters = collectTimeFilters(composition);
2228
2246
  const audios = [];
2229
2247
  composition.collectAudio(audios, 0);
2230
2248
  if (audios.length > 0) {
@@ -2562,6 +2580,7 @@ var Movie = class {
2562
2580
  if (!app?.renderer) return;
2563
2581
  if (!this._synced) this._rootSequence?.syncFrame();
2564
2582
  this._synced = false;
2583
+ this._feedTimeFilters();
2565
2584
  PIXI.Culler.shared.cull(app.stage, app.renderer.screen, false);
2566
2585
  app.renderer.render({ container: app.stage });
2567
2586
  }
@@ -2578,6 +2597,7 @@ var Movie = class {
2578
2597
  * the frame before (after a jump seek, a card whose children were animated showed a stale picture).
2579
2598
  */
2580
2599
  _updateSpace(t = this._timeOf(this.currentFrame)) {
2600
+ this._feedTimeFilters();
2581
2601
  if (!this._rootSequence || !this.app) return;
2582
2602
  this._rootSequence.syncFrame();
2583
2603
  this._synced = true;
@@ -2596,15 +2616,20 @@ var Movie = class {
2596
2616
  const stage = this.app.canvas;
2597
2617
  this._atPoster = false;
2598
2618
  const times = blurTimes(frame, this.frameRate, mb, Math.max(0, this.duration - END_MARGIN));
2599
- for (let k = 0; k < times.length; k++) {
2600
- const t = times[k];
2601
- this.timeline.time(t);
2602
- await this._awaitVideoFrames(t);
2603
- this._updateSpace(t);
2604
- this._renderNow();
2605
- if (k === 0) g.clearRect(0, 0, target.width, target.height);
2606
- g.globalAlpha = 1 / (k + 1);
2607
- g.drawImage(stage, 0, 0, target.width, target.height);
2619
+ this._nominalTime = this._timeOf(Math.max(0, Math.min(frame, this.totalFrames)));
2620
+ try {
2621
+ for (let k = 0; k < times.length; k++) {
2622
+ const t = times[k];
2623
+ this.timeline.time(t);
2624
+ await this._awaitVideoFrames(t);
2625
+ this._updateSpace(t);
2626
+ this._renderNow();
2627
+ if (k === 0) g.clearRect(0, 0, target.width, target.height);
2628
+ g.globalAlpha = 1 / (k + 1);
2629
+ g.drawImage(stage, 0, 0, target.width, target.height);
2630
+ }
2631
+ } finally {
2632
+ this._nominalTime = null;
2608
2633
  }
2609
2634
  g.globalAlpha = 1;
2610
2635
  if (settle) await this._goto(frame);
@@ -2826,6 +2851,7 @@ var Movie = class {
2826
2851
  }
2827
2852
  async destroy() {
2828
2853
  safeRun(() => this.pause());
2854
+ this._timeFilters = [];
2829
2855
  safeRun(() => this._rootSequence?.destroy());
2830
2856
  this._rootSequence = null;
2831
2857
  safeRun(() => this.timeline?.kill());
@@ -3027,7 +3053,7 @@ function clamp(v, lo, hi) {
3027
3053
  return Math.max(lo, Math.min(hi, v));
3028
3054
  }
3029
3055
  function parseEase(name) {
3030
- chunkANO5R2E6_cjs.checkEase(name, "a preset");
3056
+ chunkVTBT6NNE_cjs.checkEase(name, "a preset");
3031
3057
  return gsap.gsap.parseEase(name);
3032
3058
  }
3033
3059
 
@@ -3050,17 +3076,17 @@ function orbit(opts) {
3050
3076
  throw new Error("pixi-effects: orbit() cannot combine `radius` with `dollyZoom` \u2014 the radius follows the animated fov");
3051
3077
  }
3052
3078
  const [cx, cy] = opts.center ?? [width / 2, height / 2];
3053
- const fixedR = opts.radius ?? chunkANO5R2E6_cjs.homeDistance(height, fov ?? chunkANO5R2E6_cjs.DEFAULT_FOV);
3079
+ const fixedR = opts.radius ?? chunkVTBT6NNE_cjs.homeDistance(height, fov ?? chunkVTBT6NNE_cjs.DEFAULT_FOV);
3054
3080
  const start = opts.start ?? -degrees / 2;
3055
3081
  const steps = Math.max(1, Math.round(duration * stepsPerSecond));
3056
3082
  const easeFn = parseEase(ease);
3057
3083
  const dollyEase = dolly ? parseEase(dolly.ease ?? ease) : null;
3058
3084
  const pos = (i) => {
3059
3085
  const p = i / steps;
3060
- const a = (start + degrees * easeFn(p)) * chunkANO5R2E6_cjs.DEG;
3086
+ const a = (start + degrees * easeFn(p)) * chunkVTBT6NNE_cjs.DEG;
3061
3087
  if (!dolly) return { x: cx + fixedR * Math.sin(a), z: fixedR * Math.cos(a) };
3062
3088
  const f = dolly.from + (dolly.to - dolly.from) * dollyEase(p);
3063
- const R = chunkANO5R2E6_cjs.homeDistance(height, f);
3089
+ const R = chunkVTBT6NNE_cjs.homeDistance(height, f);
3064
3090
  return { x: cx + R * Math.sin(a), z: R * Math.cos(a), fov: f };
3065
3091
  };
3066
3092
  const keyframes = [];
@@ -3115,7 +3141,7 @@ function particles(opts) {
3115
3141
  const round3 = (v) => Math.round(v * 1e6) / 1e6;
3116
3142
  const out = [];
3117
3143
  for (let i = 0; i < count; i++) {
3118
- const r = chunkANO5R2E6_cjs.random(seed * 1000003 + i * 7919 + 17);
3144
+ const r = chunkVTBT6NNE_cjs.random(seed * 1000003 + i * 7919 + 17);
3119
3145
  const pick = ([a2, b]) => a2 + r() * (b - a2);
3120
3146
  const born = at + r() * emit;
3121
3147
  const lifetime = pick(life);
@@ -3128,7 +3154,7 @@ function particles(opts) {
3128
3154
  const turn = spin ? pick(spin) : 0;
3129
3155
  const startAngle = spin ? r() * 360 : 0;
3130
3156
  const swayAmp = sway?.amp ?? 0, swayFreq = sway?.freq ?? 1;
3131
- const n0 = sway ? chunkANO5R2E6_cjs.noise(0, seed * 1000003 + i) : 0;
3157
+ const n0 = sway ? chunkVTBT6NNE_cjs.noise(0, seed * 1000003 + i) : 0;
3132
3158
  const at_ = (t) => {
3133
3159
  const axis = (p0, v0, acc) => {
3134
3160
  if (drag > 0) {
@@ -3137,7 +3163,7 @@ function particles(opts) {
3137
3163
  }
3138
3164
  return p0 + v0 * t + 0.5 * acc * t * t;
3139
3165
  };
3140
- const sw = sway ? swayAmp * (chunkANO5R2E6_cjs.noise(t * swayFreq, seed * 1000003 + i) - n0) : 0;
3166
+ const sw = sway ? swayAmp * (chunkVTBT6NNE_cjs.noise(t * swayFreq, seed * 1000003 + i) - n0) : 0;
3141
3167
  return { x: axis(x0, vx, wind) + sw, y: axis(y0, vy, gravity) };
3142
3168
  };
3143
3169
  const kfs = [];
@@ -3199,7 +3225,7 @@ function followPath(opts) {
3199
3225
  if (steps > MAX_STEPS) throw new Error(`followPath(): ${steps} samples is too many (max ${MAX_STEPS}); lower frameRate or duration`);
3200
3226
  const segments = [];
3201
3227
  let total = 0;
3202
- for (const line of chunkANO5R2E6_cjs.flattenSvgPath(d)) {
3228
+ for (const line of chunkVTBT6NNE_cjs.flattenSvgPath(d)) {
3203
3229
  const p = line.closed ? [...line.pts, line.pts[0], line.pts[1]] : line.pts;
3204
3230
  for (let i = 2; i < p.length; i += 2) {
3205
3231
  const len = Math.hypot(p[i] - p[i - 2], p[i + 1] - p[i - 1]);
@@ -3344,7 +3370,8 @@ function stagger(items, options = {}) {
3344
3370
  const max = dist2.reduce((m, d) => Math.max(m, d), 0);
3345
3371
  const total = amount !== void 0 ? amount : (each ?? 0.1) * max;
3346
3372
  const shape = parseEase(ease);
3347
- const delays = dist2.map((d) => max === 0 ? 0 : Math.round(total * shape(d / max) * 1e6) / 1e6);
3373
+ const clamp01 = (v) => Math.min(1, Math.max(0, v));
3374
+ const delays = dist2.map((d) => max === 0 ? 0 : Math.round(total * clamp01(shape(d / max)) * 1e6) / 1e6);
3348
3375
  if (isCount) return delays;
3349
3376
  return items.map((layer, i) => ({ ...layer, at: Math.round(((layer.at ?? 0) + delays[i]) * 1e6) / 1e6 }));
3350
3377
  }
@@ -3352,7 +3379,7 @@ function distances(n, from, grid, seed) {
3352
3379
  if (n === 0) return [];
3353
3380
  if (from === "random") {
3354
3381
  const order = Array.from({ length: n }, (_, i) => i);
3355
- const r = chunkANO5R2E6_cjs.random(seed);
3382
+ const r = chunkVTBT6NNE_cjs.random(seed);
3356
3383
  for (let i = n - 1; i > 0; i--) {
3357
3384
  const j = Math.floor(r() * (i + 1));
3358
3385
  [order[i], order[j]] = [order[j], order[i]];
@@ -3414,7 +3441,7 @@ function wiggle(opts) {
3414
3441
  to[n] = p.around;
3415
3442
  return;
3416
3443
  }
3417
- const off = (chunkANO5R2E6_cjs.rand(seed * 7919 + pi * 104729 + s * 31 + 1) * 2 - 1) * p.amp;
3444
+ const off = (chunkVTBT6NNE_cjs.rand(seed * 7919 + pi * 104729 + s * 31 + 1) * 2 - 1) * p.amp;
3418
3445
  to[n] = typeof p.around === "number" ? p.around + off : `(${p.around}) ${off < 0 ? "-" : "+"} ${Math.abs(off)}`;
3419
3446
  });
3420
3447
  out.push({ at: at + s * stepLen, to, duration: stepLen, ease });
@@ -3423,6 +3450,8 @@ function wiggle(opts) {
3423
3450
  }
3424
3451
 
3425
3452
  // src/presets/animateText.ts
3453
+ var TWEEN_KEYS = ["preset", "from", "to", "duration", "ease"];
3454
+ var TIME_KEYS = ["at", "delay", "start", "begin", "time"];
3426
3455
  var KEYS5 = ["by", "x", "y", "align", "name", "at", "duration", "in", "out", "stagger", "idle", "styleFor"];
3427
3456
  var PRESETS = {
3428
3457
  rise: { from: { y: 40, alpha: 0 }, duration: 0.5, ease: "back.out(2)" },
@@ -3506,6 +3535,14 @@ function animateText(text, style, options) {
3506
3535
  }
3507
3536
  function resolveTween(spec, which) {
3508
3537
  const t = typeof spec === "string" ? { preset: spec } : spec;
3538
+ if (typeof spec === "object" && spec) {
3539
+ for (const key of Object.keys(spec)) {
3540
+ if (TWEEN_KEYS.includes(key)) continue;
3541
+ if (TIME_KEYS.includes(key)) {
3542
+ console.warn(`pixi-effects: animateText(): ${which}.${key} ("${key}") is ignored: ${which === "out" ? "an out leaves from the END of the layer (at + duration), so to make the text gone at a time T set duration to T \u2212 at" : "the entrance starts when the piece starts (the options' at, plus the stagger)"}`);
3543
+ } else chunkUQBGW5DO_cjs.warnUnknownOptions(`animateText() ${which}`, { [key]: 1 }, TWEEN_KEYS);
3544
+ }
3545
+ }
3509
3546
  if (t.preset !== void 0 && !(t.preset in PRESETS)) {
3510
3547
  const guess = chunkUQBGW5DO_cjs.suggestName(String(t.preset), PRESET_NAMES);
3511
3548
  throw new Error(`animateText(): ${which} "${t.preset}" is not a preset${guess ? `; did you mean "${guess}"?` : ""} (presets: ${PRESET_NAMES.map((n) => `"${n}"`).join(", ")})`);
@@ -3879,19 +3916,19 @@ function withFade(spec, opts) {
3879
3916
 
3880
3917
  Object.defineProperty(exports, "noise", {
3881
3918
  enumerable: true,
3882
- get: function () { return chunkANO5R2E6_cjs.noise; }
3919
+ get: function () { return chunkVTBT6NNE_cjs.noise; }
3883
3920
  });
3884
3921
  Object.defineProperty(exports, "rand", {
3885
3922
  enumerable: true,
3886
- get: function () { return chunkANO5R2E6_cjs.rand; }
3923
+ get: function () { return chunkVTBT6NNE_cjs.rand; }
3887
3924
  });
3888
3925
  Object.defineProperty(exports, "random", {
3889
3926
  enumerable: true,
3890
- get: function () { return chunkANO5R2E6_cjs.random; }
3927
+ get: function () { return chunkVTBT6NNE_cjs.random; }
3891
3928
  });
3892
3929
  Object.defineProperty(exports, "registerSequenceType", {
3893
3930
  enumerable: true,
3894
- get: function () { return chunkANO5R2E6_cjs.registerSequenceType; }
3931
+ get: function () { return chunkVTBT6NNE_cjs.registerSequenceType; }
3895
3932
  });
3896
3933
  exports.Movie = Movie;
3897
3934
  exports.animateText = animateText;