@pixerate/editor 0.227.0 → 0.228.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 (43) hide show
  1. package/dist/agent/index.cjs +3 -3
  2. package/dist/agent/index.js +2 -2
  3. package/dist/animation-editor/index.cjs +9 -9
  4. package/dist/animation-editor/index.js +1 -1
  5. package/dist/canvas/drawController.d.cts +6 -0
  6. package/dist/canvas/drawController.d.ts +6 -0
  7. package/dist/canvas/effects.d.cts +18 -0
  8. package/dist/canvas/effects.d.ts +18 -0
  9. package/dist/canvas/gestures.d.cts +87 -0
  10. package/dist/canvas/gestures.d.ts +87 -0
  11. package/dist/canvas/index.cjs +56 -9
  12. package/dist/canvas/index.d.cts +1 -0
  13. package/dist/canvas/index.d.ts +1 -0
  14. package/dist/canvas/index.js +50 -3
  15. package/dist/{chunk-ABQ2VGUB.cjs → chunk-5MQOBTNP.cjs} +13 -2
  16. package/dist/{chunk-53GOGBTM.cjs → chunk-CHAWTXBE.cjs} +243 -39
  17. package/dist/{chunk-C6CMQXMI.cjs → chunk-IGPEBXUD.cjs} +7 -7
  18. package/dist/{chunk-4PA6YS6W.cjs → chunk-K5GXW5TR.cjs} +14 -14
  19. package/dist/{chunk-7KZ2HKKC.js → chunk-LPFQHVCO.js} +244 -1
  20. package/dist/{chunk-56RFHF7O.js → chunk-LPTFDCJO.js} +1 -1
  21. package/dist/{chunk-4MDWEX44.js → chunk-PB6JV62G.js} +1 -1
  22. package/dist/{chunk-4EFNS2HV.cjs → chunk-T7QSEKDY.cjs} +248 -5
  23. package/dist/{chunk-7DZ55AIE.js → chunk-UGYUGZE2.js} +13 -2
  24. package/dist/{chunk-ZPJEH456.js → chunk-XVIK73LS.js} +206 -2
  25. package/dist/commands/agentTools.d.cts +14 -0
  26. package/dist/commands/agentTools.d.ts +14 -0
  27. package/dist/commands/builtins.d.cts +11 -1
  28. package/dist/commands/builtins.d.ts +11 -1
  29. package/dist/commands/index.cjs +23 -9
  30. package/dist/commands/index.js +17 -3
  31. package/dist/effects/index.cjs +44 -44
  32. package/dist/effects/index.js +2 -2
  33. package/dist/image-editor/index.cjs +13 -13
  34. package/dist/image-editor/index.js +1 -1
  35. package/dist/paint-editor/index.cjs +7 -7
  36. package/dist/paint-editor/index.js +2 -2
  37. package/dist/vector/index.cjs +6 -6
  38. package/dist/vector/index.js +1 -1
  39. package/dist/video-editor/index.cjs +309 -309
  40. package/dist/video-editor/index.js +3 -3
  41. package/package.json +1 -1
  42. package/skills/pixerate-agent-tools/SKILL.md +5 -0
  43. package/skills/pixerate-canvas/SKILL.md +41 -2
@@ -3,7 +3,7 @@
3
3
  var _chunk4XSBOGMKcjs = require('../chunk-4XSBOGMK.cjs');
4
4
 
5
5
 
6
- var _chunk4PA6YS6Wcjs = require('../chunk-4PA6YS6W.cjs');
6
+ var _chunkK5GXW5TRcjs = require('../chunk-K5GXW5TR.cjs');
7
7
 
8
8
 
9
9
  var _chunkPY4GWSE2cjs = require('../chunk-PY4GWSE2.cjs');
@@ -37,7 +37,7 @@ var _chunkPY4GWSE2cjs = require('../chunk-PY4GWSE2.cjs');
37
37
 
38
38
 
39
39
 
40
- var _chunkABQ2VGUBcjs = require('../chunk-ABQ2VGUB.cjs');
40
+ var _chunk5MQOBTNPcjs = require('../chunk-5MQOBTNP.cjs');
41
41
  require('../chunk-WOFXZ3XU.cjs');
42
42
  require('../chunk-FJ2MSI43.cjs');
43
43
 
@@ -45,7 +45,7 @@ require('../chunk-FJ2MSI43.cjs');
45
45
  var _chunkDWJJI6RTcjs = require('../chunk-DWJJI6RT.cjs');
46
46
 
47
47
  // src/effects/conformance.ts
48
- var codeOf = (e) => _chunkABQ2VGUBcjs.isEffectError.call(void 0, e) ? e.code : e instanceof Error ? `untyped ${e.name}: ${e.message}` : String(e);
48
+ var codeOf = (e) => _chunk5MQOBTNPcjs.isEffectError.call(void 0, e) ? e.code : e instanceof Error ? `untyped ${e.name}: ${e.message}` : String(e);
49
49
  async function rejectsWith(code, run) {
50
50
  try {
51
51
  await run();
@@ -59,10 +59,10 @@ function checkSummary(e, issues) {
59
59
  const at = (message) => issues.push({ effectId: e.id, message });
60
60
  if (!e.id || typeof e.id !== "string") at("summary has no id");
61
61
  if (!e.name) at("summary has no name");
62
- if (!_chunkABQ2VGUBcjs.EFFECT_KINDS.includes(e.kind)) at(`kind "${e.kind}" is not one of ${_chunkABQ2VGUBcjs.EFFECT_KINDS.join(", ")}`);
62
+ if (!_chunk5MQOBTNPcjs.EFFECT_KINDS.includes(e.kind)) at(`kind "${e.kind}" is not one of ${_chunk5MQOBTNPcjs.EFFECT_KINDS.join(", ")}`);
63
63
  if (!e.category) at("summary has no category");
64
64
  if (!Array.isArray(e.uses) || !e.uses.length) at("summary has no uses");
65
- for (const u of _nullishCoalesce(e.uses, () => ( []))) if (!_chunkABQ2VGUBcjs.EFFECT_USES.includes(u)) at(`use "${u}" is not one of ${_chunkABQ2VGUBcjs.EFFECT_USES.join(", ")}`);
65
+ for (const u of _nullishCoalesce(e.uses, () => ( []))) if (!_chunk5MQOBTNPcjs.EFFECT_USES.includes(u)) at(`use "${u}" is not one of ${_chunk5MQOBTNPcjs.EFFECT_USES.join(", ")}`);
66
66
  if (typeof e.transparent !== "boolean") at("transparent is not a boolean");
67
67
  if (typeof e.loop !== "boolean") at("loop is not a boolean");
68
68
  if (e.duration !== void 0 && !(e.duration > 0)) at("duration must be a positive number of ms when present");
@@ -72,7 +72,7 @@ function checkSummary(e, issues) {
72
72
  const m = e.camera;
73
73
  if (!m) at("a camera effect needs camera: { role, durationMs }");
74
74
  else {
75
- if (!_chunkABQ2VGUBcjs.CAMERA_MOVE_ROLES.includes(m.role)) at(`camera.role "${m.role}" is not one of ${_chunkABQ2VGUBcjs.CAMERA_MOVE_ROLES.join(", ")}`);
75
+ if (!_chunk5MQOBTNPcjs.CAMERA_MOVE_ROLES.includes(m.role)) at(`camera.role "${m.role}" is not one of ${_chunk5MQOBTNPcjs.CAMERA_MOVE_ROLES.join(", ")}`);
76
76
  if (!(Number.isFinite(m.durationMs) && m.durationMs >= 0)) at("camera.durationMs must be a number of ms \u2265 0");
77
77
  if (m.cut !== void 0 && !(m.cut >= 0 && m.cut <= 1)) at("camera.cut must be 0\u20131 when present");
78
78
  if (e.duration !== void 0 && e.duration !== m.durationMs) at(`duration ${e.duration} differs from camera.durationMs ${m.durationMs}`);
@@ -98,8 +98,8 @@ function checkDescription(id, d, issues) {
98
98
  if (!control) at(`backgroundOpacity "${d.backgroundOpacity}" is not a control`);
99
99
  else if (control.type !== "number" || control.minimum !== 0 || control.maximum !== 1) at(`backgroundOpacity "${d.backgroundOpacity}" must be a number control from 0 to 1`);
100
100
  }
101
- for (const e of _chunkABQ2VGUBcjs.effectValueErrors.call(void 0, d, d.defaults)) at(`default ${e.path}: ${e.message}`);
102
- for (const p of _nullishCoalesce(d.presets, () => ( []))) for (const e of _chunkABQ2VGUBcjs.effectValueErrors.call(void 0, d, p.values)) at(`preset "${p.name}" ${e.path}: ${e.message}`);
101
+ for (const e of _chunk5MQOBTNPcjs.effectValueErrors.call(void 0, d, d.defaults)) at(`default ${e.path}: ${e.message}`);
102
+ for (const p of _nullishCoalesce(d.presets, () => ( []))) for (const e of _chunk5MQOBTNPcjs.effectValueErrors.call(void 0, d, p.values)) at(`preset "${p.name}" ${e.path}: ${e.message}`);
103
103
  for (const input2 of _nullishCoalesce(d.inputs, () => ( []))) {
104
104
  if (!input2.name || !input2.description) at("every input needs a name and a description");
105
105
  if (input2.kind !== "image" && input2.kind !== "audio") at(`input "${input2.name}" has kind "${input2.kind}"`);
@@ -110,7 +110,7 @@ function checkDescription(id, d, issues) {
110
110
  }
111
111
  }
112
112
  function grey(size) {
113
- const p = _chunkABQ2VGUBcjs.createEffectPixels.call(void 0, size, size);
113
+ const p = _chunk5MQOBTNPcjs.createEffectPixels.call(void 0, size, size);
114
114
  p.data.fill(128);
115
115
  return p;
116
116
  }
@@ -127,7 +127,7 @@ async function checkRender(provider, d, size, issues) {
127
127
  }
128
128
  try {
129
129
  const out = await renderer.render({ time: 0, inputs });
130
- if (!_chunkABQ2VGUBcjs.isEffectPixels.call(void 0, out)) at("render did not return EffectPixels");
130
+ if (!_chunk5MQOBTNPcjs.isEffectPixels.call(void 0, out)) at("render did not return EffectPixels");
131
131
  else if (out.width !== size || out.height !== size || out.data.length !== size * size * 4) at(`render returned ${out.width}\xD7${out.height}, not ${size}\xD7${size}`);
132
132
  } catch (e) {
133
133
  at(`render failed: ${codeOf(e)}`);
@@ -157,10 +157,10 @@ async function checkCamera(provider, d, issues) {
157
157
  at("cameraView must be synchronous; it returned a Promise");
158
158
  return;
159
159
  }
160
- if (!_chunkABQ2VGUBcjs.isCameraView.call(void 0, view)) at(`cameraView at u ${u} is not a CameraView (zoom > 0, finite scrollX and scrollY): ${JSON.stringify(view)}`);
160
+ if (!_chunk5MQOBTNPcjs.isCameraView.call(void 0, view)) at(`cameraView at u ${u} is not a CameraView (zoom > 0, finite scrollX and scrollY): ${JSON.stringify(view)}`);
161
161
  else views.push(view);
162
162
  const again = provider.cameraView(d.id, ctx(u));
163
- if (_chunkABQ2VGUBcjs.isCameraView.call(void 0, view) && !sameView(view, again)) at(`cameraView is not pure: two calls at u ${u} gave different views`);
163
+ if (_chunk5MQOBTNPcjs.isCameraView.call(void 0, view) && !sameView(view, again)) at(`cameraView is not pure: two calls at u ${u} gave different views`);
164
164
  } catch (e) {
165
165
  at(`cameraView at u ${u} failed: ${codeOf(e)}`);
166
166
  }
@@ -173,7 +173,7 @@ async function checkCamera(provider, d, issues) {
173
173
  const keys = _optionalChain([sample, 'optionalAccess', _11 => _11.keys]);
174
174
  if (!Array.isArray(keys) || keys.length < 2) at("sampleCameraMove returned fewer than two keys");
175
175
  else {
176
- if (keys.some((k, i) => !_chunkABQ2VGUBcjs.isCameraView.call(void 0, k.view) || !Number.isFinite(k.t) || i > 0 && k.t < keys[i - 1].t)) at("sampleCameraMove keys must be CameraViews in time order");
176
+ if (keys.some((k, i) => !_chunk5MQOBTNPcjs.isCameraView.call(void 0, k.view) || !Number.isFinite(k.t) || i > 0 && k.t < keys[i - 1].t)) at("sampleCameraMove keys must be CameraViews in time order");
177
177
  if (keys[0].t !== 0 || keys[keys.length - 1].t !== ms) at(`sampleCameraMove keys must run from 0 to ${ms} ms, got ${keys[0].t} to ${keys[keys.length - 1].t}`);
178
178
  else if (!near(keys[0].view, views[0]) || !near(keys[keys.length - 1].view, views[4])) at("sampleCameraMove disagrees with cameraView at the start or end of the move");
179
179
  if (camera.cut !== void 0 && sample.cut === void 0) at("sampleCameraMove gave no cut for a move that cuts");
@@ -543,15 +543,15 @@ var smooth = (t) => t * t * (3 - 2 * t);
543
543
  var clamp01 = (v) => v < 0 ? 0 : v > 1 ? 1 : v;
544
544
  function input(request, name, id, width, height) {
545
545
  const src = _optionalChain([request, 'access', _24 => _24.inputs, 'optionalAccess', _25 => _25[name]]);
546
- if (!src) throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(`Effect "${id}" needs an input named "${name}".`, id);
547
- if (!_chunkABQ2VGUBcjs.isEffectPixels.call(void 0, src)) throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(`The fake provider only takes EffectPixels inputs ("${name}").`, id);
546
+ if (!src) throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`Effect "${id}" needs an input named "${name}".`, id);
547
+ if (!_chunk5MQOBTNPcjs.isEffectPixels.call(void 0, src)) throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`The fake provider only takes EffectPixels inputs ("${name}").`, id);
548
548
  if (src.width !== width || src.height !== height) {
549
- throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(`Input "${name}" is ${src.width}\xD7${src.height}; the renderer is ${width}\xD7${height}.`, id);
549
+ throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`Input "${name}" is ${src.width}\xD7${src.height}; the renderer is ${width}\xD7${height}.`, id);
550
550
  }
551
551
  return src;
552
552
  }
553
553
  function renderPixels(d, v, request, width, height) {
554
- const out = _chunkABQ2VGUBcjs.createEffectPixels.call(void 0, width, height);
554
+ const out = _chunk5MQOBTNPcjs.createEffectPixels.call(void 0, width, height);
555
555
  const o = out.data;
556
556
  switch (d.id) {
557
557
  case "fake.invert": {
@@ -617,7 +617,7 @@ function renderPixels(d, v, request, width, height) {
617
617
  break;
618
618
  }
619
619
  default:
620
- throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(`"${d.id}" is a ${d.kind} effect; use applyVectorEffect.`, d.id);
620
+ throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`"${d.id}" is a ${d.kind} effect; use applyVectorEffect.`, d.id);
621
621
  }
622
622
  return out;
623
623
  }
@@ -647,22 +647,22 @@ function cameraViewOf(d, ctx, v) {
647
647
  case "fake.drift":
648
648
  return viewAt(x0, y0, from.zoom * lerp(1, v.scale, smooth(u)), ctx);
649
649
  default:
650
- throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(`"${d.id}" is a ${d.kind} effect, not a camera move.`, d.id);
650
+ throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`"${d.id}" is a ${d.kind} effect, not a camera move.`, d.id);
651
651
  }
652
652
  }
653
653
  function toFloat(p) {
654
654
  const f = new Float32Array(p.data.length);
655
655
  for (let i = 0; i < f.length; i += 4) {
656
- f[i] = _chunkABQ2VGUBcjs.srgbToLinear.call(void 0, p.data[i] / 255);
657
- f[i + 1] = _chunkABQ2VGUBcjs.srgbToLinear.call(void 0, p.data[i + 1] / 255);
658
- f[i + 2] = _chunkABQ2VGUBcjs.srgbToLinear.call(void 0, p.data[i + 2] / 255);
656
+ f[i] = _chunk5MQOBTNPcjs.srgbToLinear.call(void 0, p.data[i] / 255);
657
+ f[i + 1] = _chunk5MQOBTNPcjs.srgbToLinear.call(void 0, p.data[i + 1] / 255);
658
+ f[i + 2] = _chunk5MQOBTNPcjs.srgbToLinear.call(void 0, p.data[i + 2] / 255);
659
659
  f[i + 3] = p.data[i + 3] / 255;
660
660
  }
661
- return _chunkABQ2VGUBcjs.encodeEffectFloat.call(void 0, { ...p, float: f });
661
+ return _chunk5MQOBTNPcjs.encodeEffectFloat.call(void 0, { ...p, float: f });
662
662
  }
663
663
  function maskResult(out, mask, source, id) {
664
- if (!_chunkABQ2VGUBcjs.isEffectPixels.call(void 0, mask) || mask.width !== out.width || mask.height !== out.height) {
665
- throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)("The mask must be EffectPixels the size of the renderer.", id);
664
+ if (!_chunk5MQOBTNPcjs.isEffectPixels.call(void 0, mask) || mask.width !== out.width || mask.height !== out.height) {
665
+ throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)("The mask must be EffectPixels the size of the renderer.", id);
666
666
  }
667
667
  const o = out.data;
668
668
  for (let i = 0; i < o.length; i += 4) {
@@ -688,32 +688,32 @@ function createFakeEffectProvider(options = {}) {
688
688
  const byId = new Map(all.map((d) => [d.id, d]));
689
689
  const get = (id) => {
690
690
  const d = byId.get(id);
691
- if (!d) throw new (0, _chunkABQ2VGUBcjs.UnknownEffectError)(id, "the fake provider");
691
+ if (!d) throw new (0, _chunk5MQOBTNPcjs.UnknownEffectError)(id, "the fake provider");
692
692
  return d;
693
693
  };
694
694
  const summaries = all.map(summaryOf);
695
695
  const camera = (id, ctx, values) => {
696
696
  const d = get(id);
697
- if (d.kind !== "camera") throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(`"${id}" is a ${d.kind} effect, not a camera move.`, id);
698
- if (!(ctx.u >= 0 && ctx.u <= 1)) throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(`u must be 0\u20131 through the move, got ${ctx.u}.`, id);
699
- return cameraViewOf(d, ctx, _chunkABQ2VGUBcjs.resolveEffectValues.call(void 0, d, values));
697
+ if (d.kind !== "camera") throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`"${id}" is a ${d.kind} effect, not a camera move.`, id);
698
+ if (!(ctx.u >= 0 && ctx.u <= 1)) throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`u must be 0\u20131 through the move, got ${ctx.u}.`, id);
699
+ return cameraViewOf(d, ctx, _chunk5MQOBTNPcjs.resolveEffectValues.call(void 0, d, values));
700
700
  };
701
701
  const provider = {
702
702
  id: "fake",
703
703
  name: "Fake effects",
704
704
  version: "1",
705
705
  capabilities,
706
- list: (o) => _chunkABQ2VGUBcjs.searchEffectSummaries.call(void 0, summaries, "", o),
707
- search: (q, o) => _chunkABQ2VGUBcjs.searchEffectSummaries.call(void 0, summaries, q, o),
706
+ list: (o) => _chunk5MQOBTNPcjs.searchEffectSummaries.call(void 0, summaries, "", o),
707
+ search: (q, o) => _chunk5MQOBTNPcjs.searchEffectSummaries.call(void 0, summaries, q, o),
708
708
  describe: (id) => structuredClone(get(id)),
709
709
  createRenderer(id, ro) {
710
710
  const d = get(id);
711
- if (d.kind === "camera") throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(`"${id}" is a camera move: it moves a scene's camera and draws no pixels. Use cameraView.`, id);
712
- if (d.kind !== "shader") throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(`"${id}" is a ${d.kind} effect; use applyVectorEffect.`, id);
711
+ if (d.kind === "camera") throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`"${id}" is a camera move: it moves a scene's camera and draws no pixels. Use cameraView.`, id);
712
+ if (d.kind !== "shader") throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`"${id}" is a ${d.kind} effect; use applyVectorEffect.`, id);
713
713
  const { width, height } = ro;
714
714
  const depth = _nullishCoalesce(ro.depth, () => ( 8));
715
715
  if (!(width > 0 && height > 0) || width > capabilities.maxSize || height > capabilities.maxSize) {
716
- throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(`Renderer size ${width}\xD7${height} is outside 1\u2013${capabilities.maxSize}.`, id);
716
+ throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`Renderer size ${width}\xD7${height} is outside 1\u2013${capabilities.maxSize}.`, id);
717
717
  }
718
718
  let disposed = false;
719
719
  return {
@@ -722,15 +722,15 @@ function createFakeEffectProvider(options = {}) {
722
722
  height,
723
723
  depth,
724
724
  async render(request) {
725
- if (disposed) throw new (0, _chunkABQ2VGUBcjs.EffectDisposedError)(id);
725
+ if (disposed) throw new (0, _chunk5MQOBTNPcjs.EffectDisposedError)(id);
726
726
  if (!Number.isFinite(request.time) || request.time < 0) {
727
- throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(`time must be a finite number of ms \u2265 0, got ${request.time}.`, id);
727
+ throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`time must be a finite number of ms \u2265 0, got ${request.time}.`, id);
728
728
  }
729
- const values = _chunkABQ2VGUBcjs.resolveEffectValues.call(void 0, d, request.values);
729
+ const values = _chunk5MQOBTNPcjs.resolveEffectValues.call(void 0, d, request.values);
730
730
  _optionalChain([options, 'access', _26 => _26.onRender, 'optionalCall', _27 => _27(id, request)]);
731
731
  const out = renderPixels(d, values, request, width, height);
732
732
  if (request.mask) {
733
- if (!capabilities.supportsMask) throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)("This provider does not take masks.", id);
733
+ if (!capabilities.supportsMask) throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)("This provider does not take masks.", id);
734
734
  const source = d.uses.includes("filter") ? _optionalChain([request, 'access', _28 => _28.inputs, 'optionalAccess', _29 => _29.source]) : void 0;
735
735
  maskResult(out, request.mask, source, id);
736
736
  }
@@ -743,8 +743,8 @@ function createFakeEffectProvider(options = {}) {
743
743
  },
744
744
  applyVectorEffect(id, target, values) {
745
745
  const d = get(id);
746
- if (d.kind !== "motion" && d.kind !== "vector") throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(`"${id}" is a ${d.kind} effect, not a vector one.`, id);
747
- const v = _chunkABQ2VGUBcjs.resolveEffectValues.call(void 0, d, values);
746
+ if (d.kind !== "motion" && d.kind !== "vector") throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`"${id}" is a ${d.kind} effect, not a vector one.`, id);
747
+ const v = _chunk5MQOBTNPcjs.resolveEffectValues.call(void 0, d, values);
748
748
  if (d.kind === "vector") {
749
749
  return { svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="100" height="100"><circle id="badge" cx="50" cy="50" r="40" fill="${v.color}"/></svg>`, animate: [{ id: "badge", ms: v.ms, attrs: { opacity: [0, 1] } }], duration: v.ms, loop: false };
750
750
  }
@@ -764,11 +764,11 @@ function createFakeEffectProvider(options = {}) {
764
764
  sampleCameraMove: (id, request) => {
765
765
  const d = get(id);
766
766
  const { from, to, ms, stage, fps, values } = request;
767
- return _chunkABQ2VGUBcjs.sampleCameraViews.call(void 0, (u) => camera(id, { from, to, u, ms, stage }, values), { ms, fps, cut: _optionalChain([d, 'access', _30 => _30.camera, 'optionalAccess', _31 => _31.cut]) });
767
+ return _chunk5MQOBTNPcjs.sampleCameraViews.call(void 0, (u) => camera(id, { from, to, u, ms, stage }, values), { ms, fps, cut: _optionalChain([d, 'access', _30 => _30.camera, 'optionalAccess', _31 => _31.cut]) });
768
768
  }
769
769
  } : {},
770
770
  ...supportsAuthoring ? {
771
- openAuthoring: (from) => _chunk4PA6YS6Wcjs.createEffectAuthoringSession.call(void 0, from, { provider })
771
+ openAuthoring: (from) => _chunkK5GXW5TRcjs.createEffectAuthoringSession.call(void 0, from, { provider })
772
772
  } : {}
773
773
  };
774
774
  return provider;
@@ -849,7 +849,7 @@ var effectFieldValue = (field, value) => {
849
849
  return value === void 0 || value === null || typeof value === "object" && !Array.isArray(value) ? field.default : value;
850
850
  };
851
851
  function effectSamplePicture(width, height, variant = 0) {
852
- const p = _chunkABQ2VGUBcjs.createEffectPixels.call(void 0, width, height);
852
+ const p = _chunk5MQOBTNPcjs.createEffectPixels.call(void 0, width, height);
853
853
  for (let y = 0, i = 0; y < height; y++) {
854
854
  for (let x = 0; x < width; x++, i += 4) {
855
855
  const u = x / Math.max(1, width - 1);
@@ -1336,4 +1336,4 @@ function createEffectAuthoringToolProvider(host, options) {
1336
1336
 
1337
1337
 
1338
1338
 
1339
- exports.CAMERA_MOVE_ROLES = _chunkABQ2VGUBcjs.CAMERA_MOVE_ROLES; exports.EFFECT_ERROR_CODES = _chunkABQ2VGUBcjs.EFFECT_ERROR_CODES; exports.EFFECT_KINDS = _chunkABQ2VGUBcjs.EFFECT_KINDS; exports.EFFECT_USES = _chunkABQ2VGUBcjs.EFFECT_USES; exports.EFFECT_USE_LABELS = EFFECT_USE_LABELS; exports.EffectControlError = _chunkABQ2VGUBcjs.EffectControlError; exports.EffectDisposedError = _chunkABQ2VGUBcjs.EffectDisposedError; exports.EffectError = _chunkABQ2VGUBcjs.EffectError; exports.EffectRendererPool = _chunkPY4GWSE2cjs.EffectRendererPool; exports.EffectUnsupportedError = _chunkABQ2VGUBcjs.EffectUnsupportedError; exports.EffectsSlot = _chunkABQ2VGUBcjs.EffectsSlot; exports.NoEffectsProviderError = _chunkABQ2VGUBcjs.NoEffectsProviderError; exports.UnknownEffectError = _chunkABQ2VGUBcjs.UnknownEffectError; exports.applyEffectMask = _chunkABQ2VGUBcjs.applyEffectMask; exports.checkEffectProvider = checkEffectProvider; exports.countEffectTags = _chunkABQ2VGUBcjs.countEffectTags; exports.createEffectAuthoringSession = _chunk4PA6YS6Wcjs.createEffectAuthoringSession; exports.createEffectAuthoringToolProvider = createEffectAuthoringToolProvider; exports.createEffectPixels = _chunkABQ2VGUBcjs.createEffectPixels; exports.createEffectToolProvider = _chunkABQ2VGUBcjs.createEffectToolProvider; exports.createFakeEffectProvider = createFakeEffectProvider; exports.effectControlField = effectControlField; exports.effectFieldValue = effectFieldValue; exports.effectFontFamilies = effectFontFamilies; exports.effectOffered = _chunkABQ2VGUBcjs.effectOffered; exports.effectParameterFields = effectParameterFields; exports.effectSampleInputs = effectSampleInputs; exports.effectSamplePicture = effectSamplePicture; exports.effectValueErrors = _chunkABQ2VGUBcjs.effectValueErrors; exports.encodeEffectFloat = _chunkABQ2VGUBcjs.encodeEffectFloat; exports.groupEffectsByCategory = groupEffectsByCategory; exports.hasEffectTags = _chunkABQ2VGUBcjs.hasEffectTags; exports.isCameraView = _chunkABQ2VGUBcjs.isCameraView; exports.isEffectError = _chunkABQ2VGUBcjs.isEffectError; exports.isEffectFontControl = isEffectFontControl; exports.isEffectPixels = _chunkABQ2VGUBcjs.isEffectPixels; exports.linearToSrgb = _chunkABQ2VGUBcjs.linearToSrgb; exports.normaliseEffectTag = _chunkABQ2VGUBcjs.normaliseEffectTag; exports.renderEffectThumbnail = renderEffectThumbnail; exports.resolveEffectValues = _chunkABQ2VGUBcjs.resolveEffectValues; exports.sampleCameraViews = _chunkABQ2VGUBcjs.sampleCameraViews; exports.sampleEffectCameraMove = _chunkABQ2VGUBcjs.sampleEffectCameraMove; exports.searchEffectSummaries = _chunkABQ2VGUBcjs.searchEffectSummaries; exports.srgbToLinear = _chunkABQ2VGUBcjs.srgbToLinear;
1339
+ exports.CAMERA_MOVE_ROLES = _chunk5MQOBTNPcjs.CAMERA_MOVE_ROLES; exports.EFFECT_ERROR_CODES = _chunk5MQOBTNPcjs.EFFECT_ERROR_CODES; exports.EFFECT_KINDS = _chunk5MQOBTNPcjs.EFFECT_KINDS; exports.EFFECT_USES = _chunk5MQOBTNPcjs.EFFECT_USES; exports.EFFECT_USE_LABELS = EFFECT_USE_LABELS; exports.EffectControlError = _chunk5MQOBTNPcjs.EffectControlError; exports.EffectDisposedError = _chunk5MQOBTNPcjs.EffectDisposedError; exports.EffectError = _chunk5MQOBTNPcjs.EffectError; exports.EffectRendererPool = _chunkPY4GWSE2cjs.EffectRendererPool; exports.EffectUnsupportedError = _chunk5MQOBTNPcjs.EffectUnsupportedError; exports.EffectsSlot = _chunk5MQOBTNPcjs.EffectsSlot; exports.NoEffectsProviderError = _chunk5MQOBTNPcjs.NoEffectsProviderError; exports.UnknownEffectError = _chunk5MQOBTNPcjs.UnknownEffectError; exports.applyEffectMask = _chunk5MQOBTNPcjs.applyEffectMask; exports.checkEffectProvider = checkEffectProvider; exports.countEffectTags = _chunk5MQOBTNPcjs.countEffectTags; exports.createEffectAuthoringSession = _chunkK5GXW5TRcjs.createEffectAuthoringSession; exports.createEffectAuthoringToolProvider = createEffectAuthoringToolProvider; exports.createEffectPixels = _chunk5MQOBTNPcjs.createEffectPixels; exports.createEffectToolProvider = _chunk5MQOBTNPcjs.createEffectToolProvider; exports.createFakeEffectProvider = createFakeEffectProvider; exports.effectControlField = effectControlField; exports.effectFieldValue = effectFieldValue; exports.effectFontFamilies = effectFontFamilies; exports.effectOffered = _chunk5MQOBTNPcjs.effectOffered; exports.effectParameterFields = effectParameterFields; exports.effectSampleInputs = effectSampleInputs; exports.effectSamplePicture = effectSamplePicture; exports.effectValueErrors = _chunk5MQOBTNPcjs.effectValueErrors; exports.encodeEffectFloat = _chunk5MQOBTNPcjs.encodeEffectFloat; exports.groupEffectsByCategory = groupEffectsByCategory; exports.hasEffectTags = _chunk5MQOBTNPcjs.hasEffectTags; exports.isCameraView = _chunk5MQOBTNPcjs.isCameraView; exports.isEffectError = _chunk5MQOBTNPcjs.isEffectError; exports.isEffectFontControl = isEffectFontControl; exports.isEffectPixels = _chunk5MQOBTNPcjs.isEffectPixels; exports.linearToSrgb = _chunk5MQOBTNPcjs.linearToSrgb; exports.normaliseEffectTag = _chunk5MQOBTNPcjs.normaliseEffectTag; exports.renderEffectThumbnail = renderEffectThumbnail; exports.resolveEffectValues = _chunk5MQOBTNPcjs.resolveEffectValues; exports.sampleCameraViews = _chunk5MQOBTNPcjs.sampleCameraViews; exports.sampleEffectCameraMove = _chunk5MQOBTNPcjs.sampleEffectCameraMove; exports.searchEffectSummaries = _chunk5MQOBTNPcjs.searchEffectSummaries; exports.srgbToLinear = _chunk5MQOBTNPcjs.srgbToLinear;
@@ -3,7 +3,7 @@ import {
3
3
  } from "../chunk-N4ZXW3WB.js";
4
4
  import {
5
5
  createEffectAuthoringSession
6
- } from "../chunk-4MDWEX44.js";
6
+ } from "../chunk-PB6JV62G.js";
7
7
  import {
8
8
  EffectRendererPool
9
9
  } from "../chunk-EHLOCVWB.js";
@@ -37,7 +37,7 @@ import {
37
37
  sampleEffectCameraMove,
38
38
  searchEffectSummaries,
39
39
  srgbToLinear
40
- } from "../chunk-7DZ55AIE.js";
40
+ } from "../chunk-UGYUGZE2.js";
41
41
  import "../chunk-V2ZCJRDM.js";
42
42
  import "../chunk-RNSANXPT.js";
43
43
  import {
@@ -743,7 +743,7 @@ require('../chunk-NM3G4VQT.cjs');
743
743
 
744
744
 
745
745
 
746
- var _chunkABQ2VGUBcjs = require('../chunk-ABQ2VGUB.cjs');
746
+ var _chunk5MQOBTNPcjs = require('../chunk-5MQOBTNP.cjs');
747
747
  require('../chunk-WOFXZ3XU.cjs');
748
748
 
749
749
 
@@ -4831,7 +4831,7 @@ function checkImageEffectPlace(d, place) {
4831
4831
  const allowed = IMAGE_EFFECT_PLACES[place];
4832
4832
  if (d.kind === "motion" || !d.uses.some((u) => allowed.includes(u))) {
4833
4833
  const instead = place === "filter" && d.uses.some((u) => IMAGE_EFFECT_PLACES.layer.includes(u)) ? "; add it as an effect layer with add_effect_layer instead" : place === "layer" && d.uses.includes("filter") ? "; apply it to a layer as a smart filter with apply_effect instead" : "";
4834
- throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(
4834
+ throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(
4835
4835
  `"${d.id}" (${d.name}) is a ${d.uses.join(" / ")} effect, and ${place === "filter" ? "a smart filter takes filter effects" : "an effect layer takes generator, overlay or title effects"}${instead}.`,
4836
4836
  d.id
4837
4837
  );
@@ -4855,9 +4855,9 @@ function effectPixelsToSurface(p, depth) {
4855
4855
  const d = new Uint16Array(f.length);
4856
4856
  const code = (v) => v > 0 ? v < 1 ? Math.round(v * 65535) : 65535 : 0;
4857
4857
  for (let i = 0; i < f.length; i += 4) {
4858
- d[i] = code(_chunkABQ2VGUBcjs.linearToSrgb.call(void 0, f[i]));
4859
- d[i + 1] = code(_chunkABQ2VGUBcjs.linearToSrgb.call(void 0, f[i + 1]));
4860
- d[i + 2] = code(_chunkABQ2VGUBcjs.linearToSrgb.call(void 0, f[i + 2]));
4858
+ d[i] = code(_chunk5MQOBTNPcjs.linearToSrgb.call(void 0, f[i]));
4859
+ d[i + 1] = code(_chunk5MQOBTNPcjs.linearToSrgb.call(void 0, f[i + 1]));
4860
+ d[i + 2] = code(_chunk5MQOBTNPcjs.linearToSrgb.call(void 0, f[i + 2]));
4861
4861
  d[i + 3] = code(f[i + 3]);
4862
4862
  }
4863
4863
  return _chunkOLNIPTB3cjs.surfaceFromDeepPixels.call(void 0, { width: p.width, height: p.height, data: d }, 4);
@@ -4874,7 +4874,7 @@ var ImageEffectsEngine = (_class9 = class {
4874
4874
  __init49() {this.generation = 0}
4875
4875
 
4876
4876
  constructor(options = {}) {;_class9.prototype.__init44.call(this);_class9.prototype.__init45.call(this);_class9.prototype.__init46.call(this);_class9.prototype.__init47.call(this);_class9.prototype.__init48.call(this);_class9.prototype.__init49.call(this);
4877
- this.slot = _nullishCoalesce(options.slot, () => ( new (0, _chunkABQ2VGUBcjs.EffectsSlot)()));
4877
+ this.slot = _nullishCoalesce(options.slot, () => ( new (0, _chunk5MQOBTNPcjs.EffectsSlot)()));
4878
4878
  this.maxEntries = _nullishCoalesce(options.maxEntries, () => ( 24));
4879
4879
  this.pool = new (0, _chunkPY4GWSE2cjs.EffectRendererPool)({ maxRenderers: options.maxRenderers });
4880
4880
  this.detach = this.slot.subscribe(() => {
@@ -4934,7 +4934,7 @@ var ImageEffectsEngine = (_class9 = class {
4934
4934
  const provider = this.slot.require();
4935
4935
  const depth = _nullishCoalesce(size.depth, () => ( 8));
4936
4936
  const out = await this.render(provider, effect, size.width, size.height, depth, { time: _nullishCoalesce(size.time, () => ( 0)), values });
4937
- return out.width === size.width && out.height === size.height ? out : _chunkABQ2VGUBcjs.createEffectPixels.call(void 0, size.width, size.height);
4937
+ return out.width === size.width && out.height === size.height ? out : _chunk5MQOBTNPcjs.createEffectPixels.call(void 0, size.width, size.height);
4938
4938
  }
4939
4939
  /** Why the result for `key` failed, if it did. */
4940
4940
  failure(key2) {
@@ -6196,7 +6196,7 @@ var ImageEditorController = (_class12 = class {
6196
6196
  __init84() {this.selectionWorker = null}
6197
6197
  __init85() {this.documentOpener = null}
6198
6198
  /** The effects provider slot (see `setEffectsProvider`). */
6199
- __init86() {this.effects = new (0, _chunkABQ2VGUBcjs.EffectsSlot)()}
6199
+ __init86() {this.effects = new (0, _chunk5MQOBTNPcjs.EffectsSlot)()}
6200
6200
  /** Renders provider effects: effect smart filter results and effect layers. */
6201
6201
  __init87() {this.effectsEngine = new ImageEffectsEngine({ slot: this.effects })}
6202
6202
  __init88() {this.effectRefresh = "none"}
@@ -6532,7 +6532,7 @@ var ImageEditorController = (_class12 = class {
6532
6532
  */
6533
6533
  async applyEffectFilter(layerId, effect, options = {}) {
6534
6534
  const d = await this.describeEffect(effect, "filter");
6535
- const values = _chunkABQ2VGUBcjs.resolveEffectValues.call(void 0, d, options.values);
6535
+ const values = _chunk5MQOBTNPcjs.resolveEffectValues.call(void 0, d, options.values);
6536
6536
  const found = _chunkB46UQUDCcjs.findLayer.call(void 0, this.state.layers, layerId);
6537
6537
  if (!found) throw new (0, _chunkMXJP77K4cjs.LayerOperationError)(`There is no layer "${layerId}"; call list_layers for the layer ids.`);
6538
6538
  let layers = this.state.layers;
@@ -6574,7 +6574,7 @@ var ImageEditorController = (_class12 = class {
6574
6574
  else if (k in d.controls.properties) base[k] = d.defaults[k];
6575
6575
  else throw new (0, _chunkMXJP77K4cjs.LayerOperationError)(`"${k}" is not a control of "${d.id}"; its controls are ${Object.keys(d.controls.properties).join(", ")}.`);
6576
6576
  }
6577
- update.values = { ...base, ..._chunkABQ2VGUBcjs.resolveEffectValues.call(void 0, { ...d, defaults: base }, given) };
6577
+ update.values = { ...base, ..._chunk5MQOBTNPcjs.resolveEffectValues.call(void 0, { ...d, defaults: base }, given) };
6578
6578
  }
6579
6579
  for (const k of ["enabled", "blend", "opacity", "preserveTransparency"]) if (changes[k] !== void 0) update[k] = changes[k];
6580
6580
  let res = _chunkMXJP77K4cjs.updateSmartFilter.call(void 0, this.state.layers, layerId, filterId, update, this.canvasSize);
@@ -6601,7 +6601,7 @@ var ImageEditorController = (_class12 = class {
6601
6601
  const id = options.id && !ids.has(options.id) ? options.id : _chunkMXJP77K4cjs.newLayerId.call(void 0, );
6602
6602
  const placed = _chunkMXJP77K4cjs.placeLayer.call(void 0, this.state.layers, { type: "pixel", id, name: "", visible: true, opacity: 1, blend: "normal", surface: _chunk474IQG74cjs.emptySurface.call(void 0, 4), offset: { x: 0, y: 0 } }, this.newLayerPlacement(options));
6603
6603
  if (options.clipped) requireClipBase(placed, id);
6604
- const values = _chunkABQ2VGUBcjs.resolveEffectValues.call(void 0, d, withBackgroundOpacity(d, options.values, hasLayersBelow(placed, id)));
6604
+ const values = _chunk5MQOBTNPcjs.resolveEffectValues.call(void 0, d, withBackgroundOpacity(d, options.values, hasLayersBelow(placed, id)));
6605
6605
  const { width, height } = this.naturalSize;
6606
6606
  const pixels = await this.effectsEngine.renderLayer(d.id, values, { width, height, depth: this.bitDepth, time });
6607
6607
  const layer = {
@@ -6646,7 +6646,7 @@ var ImageEditorController = (_class12 = class {
6646
6646
  else if (k in d.controls.properties) base[k] = d.defaults[k];
6647
6647
  else throw new (0, _chunkMXJP77K4cjs.LayerOperationError)(`"${k}" is not a control of "${d.id}"; its controls are ${Object.keys(d.controls.properties).join(", ")}.`);
6648
6648
  }
6649
- const values = { ...base, ..._chunkABQ2VGUBcjs.resolveEffectValues.call(void 0, { ...d, defaults: base }, given) };
6649
+ const values = { ...base, ..._chunk5MQOBTNPcjs.resolveEffectValues.call(void 0, { ...d, defaults: base }, given) };
6650
6650
  const time = changes.time === void 0 ? _nullishCoalesce(g.time, () => ( 0)) : checkEffectTime(changes.time);
6651
6651
  const animate = changes.animate === void 0 ? g.animate : changes.animate === null ? void 0 : checkEffectAnimation(changes.animate);
6652
6652
  const { width, height } = this.naturalSize;
@@ -21824,7 +21824,7 @@ function createImageEffectsToolProvider(controller, options = {}) {
21824
21824
  return { target, effect: _nullishCoalesce(effects.find((e) => e.id === instance), () => ( effects[effects.length - 1])), effects, ...extra };
21825
21825
  };
21826
21826
  const plainValues = (v) => v;
21827
- return withImagePlayback(_chunkABQ2VGUBcjs.createEffectToolProvider.call(void 0, {
21827
+ return withImagePlayback(_chunk5MQOBTNPcjs.createEffectToolProvider.call(void 0, {
21828
21828
  id: _nullishCoalesce(options.id, () => ( "image-effects")),
21829
21829
  namespace: options.namespace,
21830
21830
  title: "Image effects",
@@ -743,7 +743,7 @@ import {
743
743
  createEffectToolProvider,
744
744
  linearToSrgb,
745
745
  resolveEffectValues
746
- } from "../chunk-7DZ55AIE.js";
746
+ } from "../chunk-UGYUGZE2.js";
747
747
  import "../chunk-V2ZCJRDM.js";
748
748
  import {
749
749
  BrushstrokeCache,
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2; var _class3; var _class4; var _class5; var _class6; var _class7; var _class8; var _class9; var _class10; var _class11; var _class12;
2
2
 
3
- var _chunkC6CMQXMIcjs = require('../chunk-C6CMQXMI.cjs');
3
+ var _chunkIGPEBXUDcjs = require('../chunk-IGPEBXUD.cjs');
4
4
 
5
5
 
6
6
 
@@ -137,7 +137,7 @@ require('../chunk-NM3G4VQT.cjs');
137
137
 
138
138
 
139
139
 
140
- var _chunkABQ2VGUBcjs = require('../chunk-ABQ2VGUB.cjs');
140
+ var _chunk5MQOBTNPcjs = require('../chunk-5MQOBTNP.cjs');
141
141
  require('../chunk-WOFXZ3XU.cjs');
142
142
 
143
143
 
@@ -3213,7 +3213,7 @@ function timeLapseVideo(frameCount, width, height, fps, holdMs, name = "Time-lap
3213
3213
  }
3214
3214
  const video = { version: 1, name, width: w, height: h, fps, background: "#000000", assets, tracks: [{ id: "v1", kind: "video", clips }] };
3215
3215
  const durationMs = frameCount ? clips[clips.length - 1].start + clips[clips.length - 1].duration : 0;
3216
- return { video, ffmpeg: _chunkC6CMQXMIcjs.toVideoFfmpeg.call(void 0, video, { output: "timelapse.mp4" }), durationMs };
3216
+ return { video, ffmpeg: _chunkIGPEBXUDcjs.toVideoFfmpeg.call(void 0, video, { output: "timelapse.mp4" }), durationMs };
3217
3217
  }
3218
3218
  async function buildTimeLapse(source, target, options = {}) {
3219
3219
  const maxSide = Math.max(32, Math.min(4096, Math.round(_nullishCoalesce(options.maxSide, () => ( 720)))));
@@ -3296,7 +3296,7 @@ function checkPaintEffectPlace(d, place) {
3296
3296
  else if (d.uses.includes("filter") && place !== "light") instead = "; run it on a layer's dried paint with apply_effect instead";
3297
3297
  else if (place === "light" && d.uses.some((u) => PAINT_EFFECT_PLACES.layer.includes(u))) instead = "; add it as an effect layer (add_effect_layer) or fill a layer with it (fill_layer_with_effect) instead";
3298
3298
  else if (place === "paper" && d.uses.some((u) => u === "overlay" || u === "title")) instead = "; add it as an effect layer with add_effect_layer instead";
3299
- throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(`"${d.id}" (${d.name}) is a ${d.uses.join(" / ") || d.kind} effect, and ${PLACE_WORDS[place]}${instead}.`, d.id);
3299
+ throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`"${d.id}" (${d.name}) is a ${d.uses.join(" / ") || d.kind} effect, and ${PLACE_WORDS[place]}${instead}.`, d.id);
3300
3300
  }
3301
3301
  var PAPER_EFFECT_BLENDS = ["multiply", "normal", "overlay", "soft-light", "screen", "color"];
3302
3302
  var paperVersion = 1;
@@ -3479,7 +3479,7 @@ var PaintEditorController = (_class10 = class _PaintEditorController {
3479
3479
  /** Set while an operation that changes wet paint runs: the simulation before it (for undo). */
3480
3480
  __init106() {this.wetOp = null}
3481
3481
  /** The effects provider slot (see `setEffectsProvider`). */
3482
- __init107() {this.effects = new (0, _chunkABQ2VGUBcjs.EffectsSlot)()}
3482
+ __init107() {this.effects = new (0, _chunk5MQOBTNPcjs.EffectsSlot)()}
3483
3483
  __init108() {this.effectsRenderer = new PaintEffectsRenderer()}
3484
3484
  __init109() {this.paperEffectNodeCache = null}
3485
3485
  constructor(options = {}) {;_class10.prototype.__init72.call(this);_class10.prototype.__init73.call(this);_class10.prototype.__init74.call(this);_class10.prototype.__init75.call(this);_class10.prototype.__init76.call(this);_class10.prototype.__init77.call(this);_class10.prototype.__init78.call(this);_class10.prototype.__init79.call(this);_class10.prototype.__init80.call(this);_class10.prototype.__init81.call(this);_class10.prototype.__init82.call(this);_class10.prototype.__init83.call(this);_class10.prototype.__init84.call(this);_class10.prototype.__init85.call(this);_class10.prototype.__init86.call(this);_class10.prototype.__init87.call(this);_class10.prototype.__init88.call(this);_class10.prototype.__init89.call(this);_class10.prototype.__init90.call(this);_class10.prototype.__init91.call(this);_class10.prototype.__init92.call(this);_class10.prototype.__init93.call(this);_class10.prototype.__init94.call(this);_class10.prototype.__init95.call(this);_class10.prototype.__init96.call(this);_class10.prototype.__init97.call(this);_class10.prototype.__init98.call(this);_class10.prototype.__init99.call(this);_class10.prototype.__init100.call(this);_class10.prototype.__init101.call(this);_class10.prototype.__init102.call(this);_class10.prototype.__init103.call(this);_class10.prototype.__init104.call(this);_class10.prototype.__init105.call(this);_class10.prototype.__init106.call(this);_class10.prototype.__init107.call(this);_class10.prototype.__init108.call(this);_class10.prototype.__init109.call(this);_class10.prototype.__init110.call(this);_class10.prototype.__init111.call(this);_class10.prototype.__init112.call(this);_class10.prototype.__init113.call(this);
@@ -4154,7 +4154,7 @@ var PaintEditorController = (_class10 = class _PaintEditorController {
4154
4154
  if (v === null) merged[k] = d.defaults[k];
4155
4155
  else given[k] = v;
4156
4156
  }
4157
- return { ...merged, ..._chunkABQ2VGUBcjs.resolveEffectValues.call(void 0, { ...d, defaults: merged }, given) };
4157
+ return { ...merged, ..._chunk5MQOBTNPcjs.resolveEffectValues.call(void 0, { ...d, defaults: merged }, given) };
4158
4158
  }
4159
4159
  /** Renders a generator, overlay or title effect at the canvas size. */
4160
4160
  renderEffectCanvas(d, values, time = 0) {
@@ -8917,7 +8917,7 @@ function createPaintEffectsToolProvider(controller, options = {}) {
8917
8917
  if (changes.enabled !== void 0) throw new Error("enabled does not apply here: hide an effect layer with update_layer visible false, or remove the effect paper.");
8918
8918
  };
8919
8919
  const values = (v) => v;
8920
- return withPaintPlayback(_chunkABQ2VGUBcjs.createEffectToolProvider.call(void 0, {
8920
+ return withPaintPlayback(_chunk5MQOBTNPcjs.createEffectToolProvider.call(void 0, {
8921
8921
  id: _nullishCoalesce(options.id, () => ( "paint-effects")),
8922
8922
  namespace: options.namespace,
8923
8923
  title: "Paint effects",
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  toVideoFfmpeg
3
- } from "../chunk-56RFHF7O.js";
3
+ } from "../chunk-LPTFDCJO.js";
4
4
  import {
5
5
  deserializeLayers,
6
6
  exportPsd,
@@ -137,7 +137,7 @@ import {
137
137
  EffectsSlot,
138
138
  createEffectToolProvider,
139
139
  resolveEffectValues
140
- } from "../chunk-7DZ55AIE.js";
140
+ } from "../chunk-UGYUGZE2.js";
141
141
  import "../chunk-V2ZCJRDM.js";
142
142
  import {
143
143
  CoverageMap,
@@ -558,7 +558,7 @@ var _chunkNM3G4VQTcjs = require('../chunk-NM3G4VQT.cjs');
558
558
 
559
559
 
560
560
 
561
- var _chunkABQ2VGUBcjs = require('../chunk-ABQ2VGUB.cjs');
561
+ var _chunk5MQOBTNPcjs = require('../chunk-5MQOBTNP.cjs');
562
562
  require('../chunk-WOFXZ3XU.cjs');
563
563
 
564
564
 
@@ -7328,7 +7328,7 @@ var VectorEditorController = (_class7 = class _VectorEditorController {
7328
7328
  }
7329
7329
  // --- Provider effects ---
7330
7330
  /** The effects provider slot (see `setEffectsProvider`). */
7331
- __init59() {this.effects = new (0, _chunkABQ2VGUBcjs.EffectsSlot)()}
7331
+ __init59() {this.effects = new (0, _chunk5MQOBTNPcjs.EffectsSlot)()}
7332
7332
  /** The registered effects provider, or `null`. */
7333
7333
  get effectsProvider() {
7334
7334
  return this.effects.provider;
@@ -7352,10 +7352,10 @@ var VectorEditorController = (_class7 = class _VectorEditorController {
7352
7352
  /** The effect's picture as group children, scaled into `box` (an affine fit). */
7353
7353
  async vectorEffectPicture(effect, values) {
7354
7354
  const provider = this.effects.require();
7355
- if (!provider.applyVectorEffect) throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(`${provider.name} has no vector effects.`);
7355
+ if (!provider.applyVectorEffect) throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`${provider.name} has no vector effects.`);
7356
7356
  const d = await provider.describe(effect);
7357
- if (d.kind !== "vector") throw new (0, _chunkABQ2VGUBcjs.EffectUnsupportedError)(`"${d.id}" (${d.name}) is a ${d.kind} effect; the vector editor adds vector effects, which bring their own picture${d.kind === "motion" ? " (apply motion in the animation editor)" : ""}.`, d.id);
7358
- const resolved = _chunkABQ2VGUBcjs.resolveEffectValues.call(void 0, d, values);
7357
+ if (d.kind !== "vector") throw new (0, _chunk5MQOBTNPcjs.EffectUnsupportedError)(`"${d.id}" (${d.name}) is a ${d.kind} effect; the vector editor adds vector effects, which bring their own picture${d.kind === "motion" ? " (apply motion in the animation editor)" : ""}.`, d.id);
7358
+ const resolved = _chunk5MQOBTNPcjs.resolveEffectValues.call(void 0, d, values);
7359
7359
  const motion = await provider.applyVectorEffect(d.id, this.toSvg(), resolved);
7360
7360
  const parsed = _chunkBQE3Y6ZOcjs.parseVectorSvg.call(void 0, motion.svg);
7361
7361
  if (!parsed.nodes.length) throw new Error(`"${d.name}" drew no shapes the editor can read.`);
@@ -18172,7 +18172,7 @@ function createVectorEffectsToolProvider(controller, options = {}) {
18172
18172
  const effects = _optionalChain([g, 'optionalAccess', _765 => _765.providerEffect]) ? [info(g)] : [];
18173
18173
  return { target: id, effect: _nullishCoalesce(removed, () => ( effects[0])), effects };
18174
18174
  };
18175
- return _chunkABQ2VGUBcjs.createEffectToolProvider.call(void 0, {
18175
+ return _chunk5MQOBTNPcjs.createEffectToolProvider.call(void 0, {
18176
18176
  id: _nullishCoalesce(options.id, () => ( "vector-effects")),
18177
18177
  namespace: options.namespace,
18178
18178
  title: "Vector effects",
@@ -558,7 +558,7 @@ import {
558
558
  EffectsSlot,
559
559
  createEffectToolProvider,
560
560
  resolveEffectValues
561
- } from "../chunk-7DZ55AIE.js";
561
+ } from "../chunk-UGYUGZE2.js";
562
562
  import "../chunk-V2ZCJRDM.js";
563
563
  import {
564
564
  GRAIN_PATTERNS