@pixerate/editor 0.124.1 → 0.125.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +424 -85
  5. package/dist/animation-editor/index.cjs.map +1 -1
  6. package/dist/animation-editor/index.d.cts +174 -7
  7. package/dist/animation-editor/index.d.ts +174 -7
  8. package/dist/animation-editor/index.js +348 -9
  9. package/dist/animation-editor/index.js.map +1 -1
  10. package/dist/chunk-FJ3324TZ.js +59 -0
  11. package/dist/chunk-FJ3324TZ.js.map +1 -0
  12. package/dist/{chunk-5EO2IXQE.js → chunk-FPRIUR4T.js} +1 -1
  13. package/dist/chunk-FPRIUR4T.js.map +1 -0
  14. package/dist/{chunk-ORHMVUR6.js → chunk-G6WXWS4Y.js} +5 -3
  15. package/dist/{chunk-ORHMVUR6.js.map → chunk-G6WXWS4Y.js.map} +1 -1
  16. package/dist/{chunk-CN4PJHUG.cjs → chunk-IOXKXQNW.cjs} +3 -59
  17. package/dist/chunk-IOXKXQNW.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-FHYDQOPC.cjs → chunk-QDJKUBWE.cjs} +5 -5
  22. package/dist/{chunk-FHYDQOPC.cjs.map → chunk-QDJKUBWE.cjs.map} +1 -1
  23. package/dist/{chunk-5XXMLBH4.cjs → chunk-QQKTOA4U.cjs} +1 -1
  24. package/dist/chunk-QQKTOA4U.cjs.map +1 -0
  25. package/dist/{chunk-QEG3GRN2.js → chunk-TGKT5QAB.js} +2 -58
  26. package/dist/chunk-TGKT5QAB.js.map +1 -0
  27. package/dist/{chunk-4QQZV5Y5.cjs → chunk-UXFI3CDZ.cjs} +11 -9
  28. package/dist/chunk-UXFI3CDZ.cjs.map +1 -0
  29. package/dist/{chunk-WE25VLCO.cjs → chunk-V5YGPRCZ.cjs} +36 -36
  30. package/dist/{chunk-WE25VLCO.cjs.map → chunk-V5YGPRCZ.cjs.map} +1 -1
  31. package/dist/chunk-W6QTLHZ3.cjs +59 -0
  32. package/dist/chunk-W6QTLHZ3.cjs.map +1 -0
  33. package/dist/{chunk-WATAQ2Z2.js → chunk-WUDPFWAN.js} +2 -2
  34. package/dist/{chunk-JRXJTPES.js → chunk-XZWOLXWA.js} +4 -4
  35. package/dist/{chunk-JRXJTPES.js.map → chunk-XZWOLXWA.js.map} +1 -1
  36. package/dist/effects/index.cjs +61 -33
  37. package/dist/effects/index.cjs.map +1 -1
  38. package/dist/effects/index.d.cts +4 -5
  39. package/dist/effects/index.d.ts +4 -5
  40. package/dist/effects/index.js +32 -4
  41. package/dist/effects/index.js.map +1 -1
  42. package/dist/{export-WmYoWmLM.d.cts → export-Bp7ji2r4.d.cts} +1 -2
  43. package/dist/{export-BdfY_lH0.d.ts → export-C1s4eolZ.d.ts} +1 -1
  44. package/dist/{export-BGtXgMJ3.d.ts → export-DAyPY94f.d.ts} +1 -2
  45. package/dist/{export-CbpjwxaI.d.cts → export-DVl4fWy5.d.cts} +1 -1
  46. package/dist/generation/index.cjs +3 -3
  47. package/dist/generation/index.cjs.map +1 -1
  48. package/dist/generation/index.js +3 -3
  49. package/dist/helpers-BBLlekuM.d.ts +2009 -0
  50. package/dist/helpers-i95Ob6Vi.d.cts +2009 -0
  51. package/dist/image-editor/index.cjs +629 -627
  52. package/dist/image-editor/index.cjs.map +1 -1
  53. package/dist/image-editor/index.d.cts +5 -7
  54. package/dist/image-editor/index.d.ts +5 -7
  55. package/dist/image-editor/index.js +15 -13
  56. package/dist/image-editor/index.js.map +1 -1
  57. package/dist/paint-editor/index.cjs +12 -11
  58. package/dist/paint-editor/index.cjs.map +1 -1
  59. package/dist/paint-editor/index.d.cts +3 -5
  60. package/dist/paint-editor/index.d.ts +3 -5
  61. package/dist/paint-editor/index.js +6 -5
  62. package/dist/paint-editor/index.js.map +1 -1
  63. package/dist/{svg-BDrjRnL1.d.cts → svg-BkRL-fZJ.d.cts} +1 -1
  64. package/dist/{svg-C-vZ3q50.d.ts → svg-DJKriJ4A.d.ts} +1 -1
  65. package/dist/tools/index.cjs +2 -2
  66. package/dist/tools/index.cjs.map +1 -1
  67. package/dist/tools/index.js +3 -3
  68. package/dist/{tools-C7JtLYzo.d.ts → tools-CM8Oe8F3.d.ts} +1 -1
  69. package/dist/{tools-DHKGHiSK.d.cts → tools-DZCv2kX1.d.cts} +1 -1
  70. package/dist/vector/index.cjs +1032 -883
  71. package/dist/vector/index.cjs.map +1 -1
  72. package/dist/vector/index.d.cts +61 -6
  73. package/dist/vector/index.d.ts +61 -6
  74. package/dist/vector/index.js +155 -6
  75. package/dist/vector/index.js.map +1 -1
  76. package/dist/video-editor/index.cjs +273 -272
  77. package/dist/video-editor/index.cjs.map +1 -1
  78. package/dist/video-editor/index.d.cts +4 -6
  79. package/dist/video-editor/index.d.ts +4 -6
  80. package/dist/video-editor/index.js +7 -6
  81. package/dist/video-editor/index.js.map +1 -1
  82. package/package.json +1 -1
  83. package/skills/pixerate-animation-editor/SKILL.md +24 -1
  84. package/skills/pixerate-vector/SKILL.md +15 -0
  85. package/dist/chunk-4QQZV5Y5.cjs.map +0 -1
  86. package/dist/chunk-5EO2IXQE.js.map +0 -1
  87. package/dist/chunk-5XXMLBH4.cjs.map +0 -1
  88. package/dist/chunk-CN4PJHUG.cjs.map +0 -1
  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
@@ -155,61 +155,6 @@ var EffectsSlot = class {
155
155
  }
156
156
  };
157
157
 
158
- // src/effects/pool.ts
159
- var EffectRendererPool = class {
160
- entries = /* @__PURE__ */ new Map();
161
- maxRenderers;
162
- constructor(options = {}) {
163
- this.maxRenderers = Math.max(1, options.maxRenderers ?? 4);
164
- }
165
- /** Live renderers now. */
166
- get size() {
167
- return this.entries.size;
168
- }
169
- /** Renders `request` with the provider's renderer for this effect, size and depth (made on first use). */
170
- render(provider, id, size, request) {
171
- const depth = size.depth ?? 8;
172
- const key = `${provider.id}:${id}@${size.width}x${size.height}x${depth}`;
173
- let entry = this.entries.get(key);
174
- if (entry) {
175
- this.entries.delete(key);
176
- this.entries.set(key, entry);
177
- } else {
178
- const renderer = Promise.resolve().then(() => provider.createRenderer(id, { width: size.width, height: size.height, depth }));
179
- renderer.catch(() => {
180
- if (this.entries.get(key)?.renderer === renderer) this.entries.delete(key);
181
- });
182
- entry = { renderer, queue: Promise.resolve() };
183
- this.entries.set(key, entry);
184
- this.evict();
185
- }
186
- const e = entry;
187
- const next = e.queue.then(() => e.renderer).then((r) => r.render(request));
188
- e.queue = next.catch(() => void 0);
189
- return next;
190
- }
191
- /** Disposes the least recently used renderers over the limit, after their queued renders. */
192
- evict() {
193
- while (this.entries.size > this.maxRenderers) {
194
- const [key, entry] = this.entries.entries().next().value;
195
- this.entries.delete(key);
196
- dispose(entry);
197
- }
198
- }
199
- /** Disposes every renderer (after its queued renders). */
200
- clear() {
201
- for (const entry of this.entries.values()) dispose(entry);
202
- this.entries.clear();
203
- }
204
- };
205
- function dispose(entry) {
206
- entry.queue.then(() => entry.renderer).then(
207
- (r) => r.dispose(),
208
- () => {
209
- }
210
- );
211
- }
212
-
213
158
  export {
214
159
  EFFECT_ERROR_CODES,
215
160
  EffectError,
@@ -228,7 +173,6 @@ export {
228
173
  linearToSrgb,
229
174
  encodeEffectFloat,
230
175
  applyEffectMask,
231
- EffectsSlot,
232
- EffectRendererPool
176
+ EffectsSlot
233
177
  };
234
- //# sourceMappingURL=chunk-QEG3GRN2.js.map
178
+ //# sourceMappingURL=chunk-TGKT5QAB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/effects/errors.ts","../src/effects/helpers.ts"],"sourcesContent":["import type { SchemaValidationError } from '../tools/schema.js';\n\nexport type EffectErrorCode = 'unknown_effect' | 'invalid_values' | 'unsupported' | 'disposed' | 'no_provider';\n\nexport const EFFECT_ERROR_CODES: readonly EffectErrorCode[] = ['unknown_effect', 'invalid_values', 'unsupported', 'disposed', 'no_provider'];\n\n/**\n * Base of every effects error. Check `code` (or use `isEffectError`) rather than `instanceof`\n * across packages, since a provider may be bundled with its own copy of this class.\n */\nexport class EffectError extends Error {\n\treadonly code: EffectErrorCode;\n\treadonly effectId?: string;\n\n\tconstructor(code: EffectErrorCode, message: string, effectId?: string) {\n\t\tsuper(message);\n\t\tthis.name = 'EffectError';\n\t\tthis.code = code;\n\t\tthis.effectId = effectId;\n\t}\n}\n\n/** No effect has this id. */\nexport class UnknownEffectError extends EffectError {\n\tconstructor(effectId: string, providerName?: string) {\n\t\tsuper(\n\t\t\t'unknown_effect',\n\t\t\t`Unknown effect \"${effectId}\"${providerName ? ` in ${providerName}` : ''}. Call search_effects or list() for valid ids.`,\n\t\t\teffectId\n\t\t);\n\t\tthis.name = 'UnknownEffectError';\n\t}\n}\n\n/** Control values do not match the effect's control schema (unknown control, wrong type, out of range). */\nexport class EffectControlError extends EffectError {\n\treadonly details: readonly SchemaValidationError[];\n\n\tconstructor(effectId: string, details: readonly SchemaValidationError[]) {\n\t\tconst lines = details.map((d) => `- ${d.path || '/'}: ${d.message}`).join('\\n');\n\t\tsuper('invalid_values', `Invalid values for effect \"${effectId}\":\\n${lines}`, effectId);\n\t\tthis.name = 'EffectControlError';\n\t\tthis.details = details;\n\t}\n}\n\n/** The provider cannot do this (a vector effect asked for pixels, a size above `maxSize`, a missing input...). */\nexport class EffectUnsupportedError extends EffectError {\n\tconstructor(message: string, effectId?: string) {\n\t\tsuper('unsupported', message, effectId);\n\t\tthis.name = 'EffectUnsupportedError';\n\t}\n}\n\n/** The renderer was disposed. Create a new one. */\nexport class EffectDisposedError extends EffectError {\n\tconstructor(effectId: string) {\n\t\tsuper('disposed', `The renderer for \"${effectId}\" was disposed. Create a new renderer.`, effectId);\n\t\tthis.name = 'EffectDisposedError';\n\t}\n}\n\n/** No effects provider is registered with this editor. */\nexport class NoEffectsProviderError extends EffectError {\n\tconstructor() {\n\t\tsuper('no_provider', 'No effects provider is registered with this editor. The host must call setEffectsProvider(provider) first.');\n\t\tthis.name = 'NoEffectsProviderError';\n\t}\n}\n\n/** True for any effects error, including one thrown by another copy of this module. */\nexport function isEffectError(error: unknown): error is EffectError {\n\tif (error instanceof EffectError) return true;\n\tconst code = error instanceof Error ? (error as unknown as { code?: unknown }).code : undefined;\n\treturn typeof code === 'string' && EFFECT_ERROR_CODES.includes(code as EffectErrorCode);\n}\n","/**\n * Helpers for providers and editors: value validation, catalog search, pixel buffers, masking,\n * and a provider slot editors hold.\n */\n\nimport { validateJsonSchema, type SchemaValidationError } from '../tools/schema.js';\nimport { EffectControlError, NoEffectsProviderError } from './errors.js';\nimport type {\n\tEffectDescription,\n\tEffectImageSource,\n\tEffectPixels,\n\tEffectProvider,\n\tEffectSearchOptions,\n\tEffectSummary,\n\tEffectValues\n} from './types.js';\n\n// ---------------------------------------------------------------------------\n// Values\n// ---------------------------------------------------------------------------\n\n/** Problems with `values` against an effect's control schema (unknown controls, types, ranges). Partial values are fine. */\nexport function effectValueErrors(description: Pick<EffectDescription, 'controls'>, values: unknown): SchemaValidationError[] {\n\tif (values === undefined) return [];\n\treturn validateJsonSchema(values, { ...description.controls, required: [] });\n}\n\n/**\n * `values` over the effect's defaults, validated against its control schema. Throws\n * `EffectControlError` naming every bad control. Providers call this in `render`; editors call\n * it before saving values.\n */\nexport function resolveEffectValues(description: Pick<EffectDescription, 'id' | 'controls' | 'defaults'>, values?: EffectValues): Record<string, EffectValues[string]> {\n\tconst errors = effectValueErrors(description, values);\n\tif (errors.length) throw new EffectControlError(description.id, errors);\n\treturn { ...description.defaults, ...(values ?? {}) };\n}\n\n// ---------------------------------------------------------------------------\n// Search\n// ---------------------------------------------------------------------------\n\nconst matchesFilters = (e: EffectSummary, o: EffectSearchOptions) =>\n\t(!o.kind || e.kind === o.kind) && (!o.category || e.category === o.category) && (!o.use || e.uses.includes(o.use));\n\n/**\n * Filters a catalog and ranks it against `query` (every word must appear in the id, name,\n * category, tags or description; name matches rank first). An empty query keeps catalog order.\n * Providers can implement `list` and `search` with it.\n */\nexport function searchEffectSummaries<T extends EffectSummary>(catalog: readonly T[], query = '', options: EffectSearchOptions = {}): T[] {\n\tconst words = query.toLowerCase().split(/\\s+/).filter(Boolean);\n\tconst scored: { e: T; score: number; i: number }[] = [];\n\tcatalog.forEach((e, i) => {\n\t\tif (!matchesFilters(e, options)) return;\n\t\tconst name = e.name.toLowerCase();\n\t\tconst hay = [e.id, e.name, e.category, ...(e.tags ?? []), e.description ?? ''].join(' ').toLowerCase();\n\t\tlet score = 0;\n\t\tfor (const w of words) {\n\t\t\tif (!hay.includes(w)) return;\n\t\t\tscore += name.startsWith(w) ? 3 : name.includes(w) ? 2 : 1;\n\t\t}\n\t\tscored.push({ e, score, i });\n\t});\n\tscored.sort((a, b) => b.score - a.score || a.i - b.i);\n\tconst out = scored.map((s) => s.e);\n\treturn options.limit !== undefined ? out.slice(0, Math.max(0, options.limit)) : out;\n}\n\n// ---------------------------------------------------------------------------\n// Pixels\n// ---------------------------------------------------------------------------\n\n/** A transparent picture, with float samples when `float` is set. */\nexport function createEffectPixels(width: number, height: number, float = false): EffectPixels {\n\tconst n = Math.max(0, width * height * 4);\n\treturn { width, height, data: new Uint8ClampedArray(n), ...(float ? { float: new Float32Array(n) } : {}) };\n}\n\n/** True for an `EffectPixels` (rather than a host image object). */\nexport function isEffectPixels(source: EffectImageSource | unknown): source is EffectPixels {\n\treturn (\n\t\t!!source &&\n\t\ttypeof source === 'object' &&\n\t\t(source as EffectPixels).data instanceof Uint8ClampedArray &&\n\t\ttypeof (source as EffectPixels).width === 'number' &&\n\t\ttypeof (source as EffectPixels).height === 'number'\n\t);\n}\n\n/** sRGB-encoded 0–1 to linear light. */\nexport const srgbToLinear = (v: number) => (v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4));\n/** Linear light to sRGB-encoded (clamped below at 0; may exceed 1). */\nexport const linearToSrgb = (v: number) => (v > 0 ? (v <= 0.0031308 ? v * 12.92 : 1.055 * Math.pow(v, 1 / 2.4) - 0.055) : 0);\n\n/** Fills `pixels.data` from `pixels.float` (linear float to clamped 8-bit sRGB). */\nexport function encodeEffectFloat(pixels: EffectPixels): EffectPixels {\n\tconst f = pixels.float;\n\tif (!f) return pixels;\n\tconst d = pixels.data;\n\tfor (let i = 0; i < d.length; i += 4) {\n\t\td[i] = Math.round(linearToSrgb(f[i]) * 255);\n\t\td[i + 1] = Math.round(linearToSrgb(f[i + 1]) * 255);\n\t\td[i + 2] = Math.round(linearToSrgb(f[i + 2]) * 255);\n\t\td[i + 3] = Math.round(Math.min(1, Math.max(0, f[i + 3])) * 255);\n\t}\n\treturn pixels;\n}\n\n/**\n * Blends an effect `result` back over its `source` by `mask` coverage (alpha channel), in place\n * on `result`: where the mask is 0 the source shows, where it is 255 the result. Without a\n * source (generators), the result's alpha is multiplied by coverage. Editors use it when the\n * provider does not `supportsMask`. All three must have the same size.\n */\nexport function applyEffectMask(result: EffectPixels, mask: EffectPixels, source?: EffectPixels): EffectPixels {\n\tconst { data } = result;\n\tconst m = mask.data;\n\tfor (let i = 0; i < data.length; i += 4) {\n\t\tconst k = m[i + 3] / 255;\n\t\tif (k >= 1) continue;\n\t\tif (source) {\n\t\t\tfor (let c = 0; c < 4; c++) data[i + c] = source.data[i + c] + (data[i + c] - source.data[i + c]) * k;\n\t\t\tif (result.float && source.float) {\n\t\t\t\tfor (let c = 0; c < 4; c++) result.float[i + c] = source.float[i + c] + (result.float[i + c] - source.float[i + c]) * k;\n\t\t\t}\n\t\t} else {\n\t\t\tdata[i + 3] = data[i + 3] * k;\n\t\t\tif (result.float) result.float[i + 3] *= k;\n\t\t}\n\t}\n\treturn result;\n}\n\n// ---------------------------------------------------------------------------\n// The slot an editor keeps\n// ---------------------------------------------------------------------------\n\n/**\n * Holds an editor's effects provider. Controllers expose it as `effectsProvider`,\n * `setEffectsProvider(provider | null)` and `useEffects(provider)`; listeners hear every change.\n */\nexport class EffectsSlot {\n\tprivate current: EffectProvider | null = null;\n\tprivate readonly listeners = new Set<(provider: EffectProvider | null) => void>();\n\n\tget provider(): EffectProvider | null {\n\t\treturn this.current;\n\t}\n\n\tset(provider: EffectProvider | null): void {\n\t\tif (provider === this.current) return;\n\t\tthis.current = provider;\n\t\tfor (const l of [...this.listeners]) l(provider);\n\t}\n\n\t/** Sets `provider` and returns a function that clears it again (if it is still the one set). */\n\tuse(provider: EffectProvider): () => void {\n\t\tthis.set(provider);\n\t\treturn () => {\n\t\t\tif (this.current === provider) this.set(null);\n\t\t};\n\t}\n\n\t/** The provider, or a `NoEffectsProviderError`. */\n\trequire(): EffectProvider {\n\t\tif (!this.current) throw new NoEffectsProviderError();\n\t\treturn this.current;\n\t}\n\n\tsubscribe(listener: (provider: EffectProvider | null) => void): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => this.listeners.delete(listener);\n\t}\n}\n"],"mappings":"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","names":[]}
@@ -1,11 +1,13 @@
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;
2
2
 
3
+ var _chunkW6QTLHZ3cjs = require('./chunk-W6QTLHZ3.cjs');
3
4
 
4
5
 
5
6
 
6
7
 
7
8
 
8
- var _chunkCN4PJHUGcjs = require('./chunk-CN4PJHUG.cjs');
9
+
10
+ var _chunkIOXKXQNWcjs = require('./chunk-IOXKXQNW.cjs');
9
11
 
10
12
 
11
13
  var _chunkRIWPYSKUcjs = require('./chunk-RIWPYSKU.cjs');
@@ -1172,12 +1174,12 @@ function videoEffectLayerKey(layer, width, height) {
1172
1174
  }
1173
1175
  function mixEffectPixels(a, b, k) {
1174
1176
  if (k >= 1) return b;
1175
- const out = _chunkCN4PJHUGcjs.createEffectPixels.call(void 0, a.width, a.height);
1177
+ const out = _chunkIOXKXQNWcjs.createEffectPixels.call(void 0, a.width, a.height);
1176
1178
  for (let i = 0; i < out.data.length; i++) out.data[i] = a.data[i] + (b.data[i] - a.data[i]) * k;
1177
1179
  return out;
1178
1180
  }
1179
1181
  function overEffectPixels(base, top, opacity = 1) {
1180
- const out = _chunkCN4PJHUGcjs.createEffectPixels.call(void 0, base.width, base.height);
1182
+ const out = _chunkIOXKXQNWcjs.createEffectPixels.call(void 0, base.width, base.height);
1181
1183
  const o = out.data;
1182
1184
  const b = base.data;
1183
1185
  const t = top.data;
@@ -1222,10 +1224,10 @@ var VideoEffectsEngine = (_class2 = class {
1222
1224
  __init10() {this.generation = 0}
1223
1225
 
1224
1226
  constructor(options = {}) {;_class2.prototype.__init5.call(this);_class2.prototype.__init6.call(this);_class2.prototype.__init7.call(this);_class2.prototype.__init8.call(this);_class2.prototype.__init9.call(this);_class2.prototype.__init10.call(this);
1225
- this.slot = _nullishCoalesce(options.slot, () => ( new (0, _chunkCN4PJHUGcjs.EffectsSlot)()));
1227
+ this.slot = _nullishCoalesce(options.slot, () => ( new (0, _chunkIOXKXQNWcjs.EffectsSlot)()));
1226
1228
  this.maxEntries = _nullishCoalesce(options.maxEntries, () => ( 120));
1227
1229
  this.toImage = _nullishCoalesce(options.toImage, () => ( defaultToImage));
1228
- this.pool = new (0, _chunkCN4PJHUGcjs.EffectRendererPool)({ maxRenderers: options.maxRenderers });
1230
+ this.pool = new (0, _chunkW6QTLHZ3cjs.EffectRendererPool)({ maxRenderers: options.maxRenderers });
1229
1231
  this.detach = this.slot.subscribe(() => {
1230
1232
  this.reset();
1231
1233
  this.notify();
@@ -1364,7 +1366,7 @@ function checkVideoEffectPlace(d, place) {
1364
1366
  if (d.kind === "motion" || !d.uses.some((u) => allowed.includes(u))) {
1365
1367
  const where = place === "clip" ? "on a clip" : place === "transition" ? "as a transition" : "as an effect clip";
1366
1368
  const instead = d.uses.includes("transition") ? "set_video_effect_transition" : d.uses.some((u) => VIDEO_EFFECT_PLACES.generator.includes(u)) ? "add_video_effect_clip" : d.uses.some((u) => u === "filter") ? "apply_effect" : null;
1367
- throw new (0, _chunkCN4PJHUGcjs.EffectUnsupportedError)(
1369
+ throw new (0, _chunkIOXKXQNWcjs.EffectUnsupportedError)(
1368
1370
  `"${d.id}" (${d.name}) is a ${d.uses.join(" / ")} effect and cannot be used ${where}, which takes ${allowed.join(" or ")} effects${instead ? `; use ${instead} instead` : ""}. search_effects with use "${allowed[0]}" lists ones that fit.`,
1369
1371
  d.id
1370
1372
  );
@@ -1385,12 +1387,12 @@ function checkVideoEffectValues(d, values, options = {}) {
1385
1387
  else if (type !== "number" && type !== "integer") errors.push({ path: `/${k}`, message: "only number controls can be keyframed." });
1386
1388
  else for (const [i, key] of v.keys.entries()) for (const e of _chunkRIWPYSKUcjs.validateJsonSchema.call(void 0, key.v, schema)) errors.push({ path: `/${k}/keys/${i}/v`, message: e.message });
1387
1389
  }
1388
- for (const e of _chunkCN4PJHUGcjs.effectValueErrors.call(void 0, d, plain)) {
1390
+ for (const e of _chunkIOXKXQNWcjs.effectValueErrors.call(void 0, d, plain)) {
1389
1391
  const name = e.path.split("/")[1];
1390
1392
  const about = name && _optionalChain([d, 'access', _46 => _46.controls, 'access', _47 => _47.properties, 'access', _48 => _48[name], 'optionalAccess', _49 => _49.description]);
1391
1393
  errors.push(about ? { path: e.path, message: `${e.message} (${about})` } : e);
1392
1394
  }
1393
- if (errors.length) throw new (0, _chunkCN4PJHUGcjs.EffectControlError)(d.id, errors);
1395
+ if (errors.length) throw new (0, _chunkIOXKXQNWcjs.EffectControlError)(d.id, errors);
1394
1396
  return { ..._nullishCoalesce(options.base, () => ( d.defaults)), ..._nullishCoalesce(values, () => ( {})) };
1395
1397
  }
1396
1398
 
@@ -2378,4 +2380,4 @@ function buildFfmpeg(project, options, measure) {
2378
2380
 
2379
2381
 
2380
2382
  exports.VIDEO_FITS = VIDEO_FITS; exports.VIDEO_TRANSITION_TYPES = VIDEO_TRANSITION_TYPES; exports.VIDEO_WIPE_DIRECTIONS = VIDEO_WIPE_DIRECTIONS; exports.videoTransitionAudioCurve = videoTransitionAudioCurve; exports.VIDEO_BLEND_MODES = VIDEO_BLEND_MODES; exports.VIDEO_CLIP_ANIMATION_EFFECTS = VIDEO_CLIP_ANIMATION_EFFECTS; exports.VIDEO_FADE_CURVES = VIDEO_FADE_CURVES; exports.VIDEO_PLACEMENT_MODES = VIDEO_PLACEMENT_MODES; exports.VIDEO_CLIP_TYPES = VIDEO_CLIP_TYPES; exports.VIDEO_EASE_NAMES = VIDEO_EASE_NAMES; exports.VIDEO_KEYFRAME_PROPERTIES = VIDEO_KEYFRAME_PROPERTIES; exports.VIDEO_TRANSFORM_PROPERTIES = VIDEO_TRANSFORM_PROPERTIES; exports.VIDEO_KEYFRAME_LIMITS = VIDEO_KEYFRAME_LIMITS; exports.isVideoKeyframes = isVideoKeyframes; exports.videoEaseBezier = videoEaseBezier; exports.videoEaseProgress = videoEaseProgress; exports.videoValueAt = videoValueAt; exports.videoKeysOf = videoKeysOf; exports.retimeVideoAnimatable = retimeVideoAnimatable; exports.splitVideoAnimatable = splitVideoAnimatable; exports.sortVideoKeys = sortVideoKeys; exports.setVideoKey = setVideoKey; exports.removeVideoKey = removeVideoKey; exports.videoKeyframeBreakpoints = videoKeyframeBreakpoints; exports.videoKeyframeFfmpegExpr = videoKeyframeFfmpegExpr; exports.VIDEO_LUT_MAX_SIZE = VIDEO_LUT_MAX_SIZE; exports.parseVideoCubeLut = parseVideoCubeLut; exports.videoLutFromFunction = videoLutFromFunction; exports.videoLutToCube = videoLutToCube; exports.applyVideoLut = applyVideoLut; exports.applyVideoLutToPixels = applyVideoLutToPixels; exports.videoLutSvgApproximation = videoLutSvgApproximation; exports.VideoLutCache = VideoLutCache; exports.VIDEO_GRADE_CONTROLS = VIDEO_GRADE_CONTROLS; exports.VIDEO_GRADE_PRESETS = VIDEO_GRADE_PRESETS; exports.VIDEO_GRADE_PRESET_NAMES = VIDEO_GRADE_PRESET_NAMES; exports.normalizeVideoGradeLut = normalizeVideoGradeLut; exports.normalizeVideoGrade = normalizeVideoGrade; exports.videoGradePreset = videoGradePreset; exports.videoGradeLook = videoGradeLook; exports.videoGradeSteps = videoGradeSteps; exports.videoGradeStepMatrix = videoGradeStepMatrix; exports.applyVideoGrade = applyVideoGrade; exports.videoGradeStepSvgValues = videoGradeStepSvgValues; exports.videoLutSvgPrimitives = videoLutSvgPrimitives; exports.videoGradeSvgFilter = videoGradeSvgFilter; exports.videoGradeGainsFilterId = videoGradeGainsFilterId; exports.videoGradeCssFilter = videoGradeCssFilter; exports.videoGradeSvgDefs = videoGradeSvgDefs; exports.videoGradeFfmpegFilters = videoGradeFfmpegFilters; exports.videoClipSourceTime = videoClipSourceTime; exports.videoClipSpeedAt = videoClipSpeedAt; exports.videoSpeedRampKeys = videoSpeedRampKeys; exports.checkVideoTimeRemap = checkVideoTimeRemap; exports.videoTimeRemapSpan = videoTimeRemapSpan; exports.videoTimeRemapBreakpoints = videoTimeRemapBreakpoints; exports.videoSpeedRampEdit = videoSpeedRampEdit; exports.videoFreezeFrameEdit = videoFreezeFrameEdit; exports.videoSlowMotionRamp = videoSlowMotionRamp; exports.VIDEO_TIME_EPSILON = VIDEO_TIME_EPSILON; exports.videoClipEnd = videoClipEnd; exports.videoTrackSyncLocked = videoTrackSyncLocked; exports.videoClipSpeed = videoClipSpeed; exports.videoClipSourceRange = videoClipSourceRange; exports.videoFrameDuration = videoFrameDuration; exports.snapToVideoFrame = snapToVideoFrame; exports.videoFrames = videoFrames; exports.isVideoDropFrameRate = isVideoDropFrameRate; exports.videoTimecodeFrames = videoTimecodeFrames; exports.formatVideoTimecode = formatVideoTimecode; exports.formatVideoTimecodeFrames = formatVideoTimecodeFrames; exports.videoHourFrames = videoHourFrames; exports.formatVideoSeconds = formatVideoSeconds; exports.videoAssetHasSound = videoAssetHasSound; exports.videoAssetMap = videoAssetMap; exports.videoSequenceMap = videoSequenceMap; exports.videoSequenceDuration = videoSequenceDuration; exports.videoSequenceChildren = videoSequenceChildren; exports.findVideoSequenceCycle = findVideoSequenceCycle; exports.allVideoTracks = allVideoTracks; exports.sortedVideoClips = sortedVideoClips; exports.findVideoClip = findVideoClip; exports.allVideoClipIds = allVideoClipIds; exports.findVideoSequenceClip = findVideoSequenceClip; exports.videoProjectDuration = videoProjectDuration; exports.videoClipBefore = videoClipBefore; exports.videoClipAfter = videoClipAfter; exports.videoClipHandles = videoClipHandles; exports.videoClipOverhang = videoClipOverhang; exports.videoSnapPoints = videoSnapPoints; exports.snapVideoTime = snapVideoTime; exports.findVideoGaps = findVideoGaps; exports.videoOverlap = videoOverlap; exports.nextFreeVideoSlot = nextFreeVideoSlot; exports.videoClipsAt = videoClipsAt; exports.VIDEO_CLIP_ANIMATION_DURATION = VIDEO_CLIP_ANIMATION_DURATION; exports.videoClipAnimationProperties = videoClipAnimationProperties; exports.videoClipAnimationSpans = videoClipAnimationSpans; exports.videoClipAnimated = videoClipAnimated; exports.videoEffectValuesAt = videoEffectValuesAt; exports.videoTransformAt = videoTransformAt; exports.placeVideoRect = placeVideoRect; exports.videoTextStyle = videoTextStyle; exports.videoTitleFrame = videoTitleFrame; exports.videoTransitionEase = videoTransitionEase; exports.videoFadeCurveGain = videoFadeCurveGain; exports.videoClipSoundGain = videoClipSoundGain; exports.videoFrameAt = videoFrameAt; exports.videoLayersWithoutTransitionEffects = videoLayersWithoutTransitionEffects; exports.videoFrameLeafLayers = videoFrameLeafLayers; exports.videoProjectEffects = videoProjectEffects; exports.videoClipEffectUses = videoClipEffectUses; exports.videoLayersUseEffects = videoLayersUseEffects; exports.videoEffectFrameTime = videoEffectFrameTime; exports.videoEffectLayerKey = videoEffectLayerKey; exports.mixEffectPixels = mixEffectPixels; exports.overEffectPixels = overEffectPixels; exports.VideoEffectsEngine = VideoEffectsEngine; exports.VIDEO_EFFECT_PLACES = VIDEO_EFFECT_PLACES; exports.checkVideoEffectPlace = checkVideoEffectPlace; exports.checkVideoEffectValues = checkVideoEffectValues; exports.videoIrisRadius = videoIrisRadius; exports.videoWipeRect = videoWipeRect; exports.videoFrameToSvg = videoFrameToSvg; exports.videoProjectSvg = videoProjectSvg; exports.videoContactSheetSvg = videoContactSheetSvg; exports.drawVideoFrame = drawVideoFrame; exports.renderVideoFrameExact = renderVideoFrameExact; exports.toVideoEdl = toVideoEdl; exports.videoFfmpegUnsupportedEffects = videoFfmpegUnsupportedEffects; exports.parseVideoLoudnessMeasurement = parseVideoLoudnessMeasurement; exports.ffmpegFilterValue = ffmpegFilterValue; exports.videoShellQuote = videoShellQuote; exports.toVideoFfmpeg = toVideoFfmpeg; exports.toVideoLoudnessMeasure = toVideoLoudnessMeasure;
2381
- //# sourceMappingURL=chunk-4QQZV5Y5.cjs.map
2383
+ //# sourceMappingURL=chunk-UXFI3CDZ.cjs.map