@pixerate/editor 0.124.0 → 0.124.1

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 (41) hide show
  1. package/dist/{chunk-IWSMDQE5.cjs → chunk-4QQZV5Y5.cjs} +18 -29
  2. package/dist/chunk-4QQZV5Y5.cjs.map +1 -0
  3. package/dist/{chunk-IOXKXQNW.cjs → chunk-CN4PJHUG.cjs} +59 -3
  4. package/dist/chunk-CN4PJHUG.cjs.map +1 -0
  5. package/dist/{chunk-TK53AB4Q.cjs → chunk-FHYDQOPC.cjs} +3 -3
  6. package/dist/{chunk-TK53AB4Q.cjs.map → chunk-FHYDQOPC.cjs.map} +1 -1
  7. package/dist/{chunk-VFAKN46Z.js → chunk-JRXJTPES.js} +2 -2
  8. package/dist/{chunk-YVVSTD3B.js → chunk-ORHMVUR6.js} +8 -19
  9. package/dist/chunk-ORHMVUR6.js.map +1 -0
  10. package/dist/{chunk-TGKT5QAB.js → chunk-QEG3GRN2.js} +58 -2
  11. package/dist/chunk-QEG3GRN2.js.map +1 -0
  12. package/dist/effects/index.cjs +51 -34
  13. package/dist/effects/index.cjs.map +1 -1
  14. package/dist/effects/index.d.cts +35 -3
  15. package/dist/effects/index.d.ts +35 -3
  16. package/dist/effects/index.js +20 -3
  17. package/dist/effects/index.js.map +1 -1
  18. package/dist/{export-8RnlngAv.d.ts → export-BGtXgMJ3.d.ts} +3 -1
  19. package/dist/{export-DM3h7QEI.d.ts → export-BdfY_lH0.d.ts} +4 -2
  20. package/dist/{export-BzSRXyH6.d.cts → export-CbpjwxaI.d.cts} +4 -2
  21. package/dist/{export-TqXMOlDt.d.cts → export-WmYoWmLM.d.cts} +3 -1
  22. package/dist/image-editor/index.cjs +110 -121
  23. package/dist/image-editor/index.cjs.map +1 -1
  24. package/dist/image-editor/index.d.cts +2 -2
  25. package/dist/image-editor/index.d.ts +2 -2
  26. package/dist/image-editor/index.js +7 -18
  27. package/dist/image-editor/index.js.map +1 -1
  28. package/dist/paint-editor/index.cjs +3 -3
  29. package/dist/paint-editor/index.d.cts +2 -2
  30. package/dist/paint-editor/index.d.ts +2 -2
  31. package/dist/paint-editor/index.js +2 -2
  32. package/dist/video-editor/index.cjs +270 -270
  33. package/dist/video-editor/index.d.cts +2 -2
  34. package/dist/video-editor/index.d.ts +2 -2
  35. package/dist/video-editor/index.js +3 -3
  36. package/package.json +1 -1
  37. package/dist/chunk-IOXKXQNW.cjs.map +0 -1
  38. package/dist/chunk-IWSMDQE5.cjs.map +0 -1
  39. package/dist/chunk-TGKT5QAB.js.map +0 -1
  40. package/dist/chunk-YVVSTD3B.js.map +0 -1
  41. /package/dist/{chunk-VFAKN46Z.js.map → chunk-JRXJTPES.js.map} +0 -0
@@ -1 +0,0 @@
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":[]}