pixi-effects 0.1.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.
- package/LICENSE +21 -0
- package/README.md +89 -0
- package/dist/Controller.cjs +940 -0
- package/dist/Controller.cjs.map +1 -0
- package/dist/Controller.d.cts +109 -0
- package/dist/Controller.d.ts +109 -0
- package/dist/Controller.js +933 -0
- package/dist/Controller.js.map +1 -0
- package/dist/Movie-Bp66rkaC.d.cts +364 -0
- package/dist/Movie-Bp66rkaC.d.ts +364 -0
- package/dist/index.cjs +3045 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +79 -0
- package/dist/index.d.ts +79 -0
- package/dist/index.js +3023 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/expr/Parser.ts","../src/expr/normalizeProps.ts","../src/core/Timeline.ts","../src/expr/Scope.ts","../src/filters/ChromaKey.ts","../src/filters/index.ts","../src/sequences/Base.ts","../src/expr/colorInterp.ts","../src/expr/colorTween.ts","../src/sequences/Image.ts","../src/sequences/Text.ts","../src/sequences/Audio.ts","../src/core/FrameCache.ts","../src/sequences/Video.ts","../src/sequences/Shape.ts","../src/core/Composition.ts","../src/sequences/Composition.ts","../src/core/AssetLoader.ts","../src/core/Movie.ts","../src/core/AudioMixer.ts","../src/core/Renderer.ts","../src/core/Transitions.ts","../src/filters/TransitionMask.ts","../src/presets/kenBurns.ts"],"names":["inst","gsap","Assets","Sprite","init_Composition","Rectangle","Output","BufferTarget","GL_FRAGMENT","WGSL_SOURCE","Filter","GlProgram","defaultFilterVert","GpuProgram","UniformGroup","extensions","Container"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Tiny expression parser for the pixi-effects DSL.\n *\n * Supported grammar (recursive descent, LL(1)):\n * expr = additive\n * additive = multiplicative (('+'|'-') multiplicative)*\n * multiplicative = unary (('*'|'/') unary)*\n * unary = ('-'|'+') unary | primary\n * primary = number | identifier ('(' (expr (',' expr)*)? ')')? | '(' expr ')'\n *\n * Numbers are parsed via parseFloat (decimals OK). Identifiers map to keys in\n * the supplied scope. A small fixed function set is exposed: see FUNCS below.\n *\n * Parsed ASTs are cached per source string. CSP-safe: no Function constructor.\n */\nconst FUNCS: Record<string, (...args: number[]) => number> = {\n min: Math.min,\n max: Math.max,\n abs: Math.abs,\n floor: Math.floor,\n ceil: Math.ceil,\n round: Math.round,\n sqrt: Math.sqrt,\n pow: Math.pow,\n sin: Math.sin,\n cos: Math.cos,\n tan: Math.tan,\n};\n\ntype BinOp = '+' | '-' | '*' | '/';\ntype Token =\n | { type: 'num'; value: number }\n | { type: 'id'; name: string }\n | { type: 'op'; op: BinOp }\n | { type: 'lparen' }\n | { type: 'rparen' }\n | { type: 'comma' };\n\ntype Node =\n | { kind: 'num'; value: number }\n | { kind: 'var'; name: string }\n | { kind: 'neg'; child: Node }\n | { kind: 'bin'; op: BinOp; left: Node; right: Node }\n | { kind: 'call'; name: string; args: Node[] };\n\nfunction isDigit(c: string): boolean { return c >= '0' && c <= '9'; }\nfunction isIdStart(c: string): boolean {\n return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c === '_';\n}\nfunction isIdCont(c: string): boolean { return isIdStart(c) || isDigit(c); }\n\nfunction tokenize(src: string): Token[] {\n const out: Token[] = [];\n for (let i = 0; i < src.length;) {\n const c = src[i]!;\n if (c === ' ' || c === '\\t' || c === '\\n' || c === '\\r') { i++; continue; }\n if (isDigit(c) || (c === '.' && isDigit(src[i + 1] ?? ''))) {\n let j = i + 1;\n while (j < src.length && (isDigit(src[j]!) || src[j] === '.')) j++;\n const value = parseFloat(src.slice(i, j));\n if (Number.isNaN(value)) throw new Error(`bad number at ${i}`);\n out.push({ type: 'num', value });\n i = j;\n continue;\n }\n if (isIdStart(c)) {\n let j = i + 1;\n while (j < src.length && isIdCont(src[j]!)) j++;\n out.push({ type: 'id', name: src.slice(i, j) });\n i = j;\n continue;\n }\n if (c === '+' || c === '-' || c === '*' || c === '/') {\n out.push({ type: 'op', op: c });\n i++;\n continue;\n }\n if (c === '(') { out.push({ type: 'lparen' }); i++; continue; }\n if (c === ')') { out.push({ type: 'rparen' }); i++; continue; }\n if (c === ',') { out.push({ type: 'comma' }); i++; continue; }\n throw new Error(`unexpected character \"${c}\" at ${i}`);\n }\n return out;\n}\n\nclass Cursor {\n i = 0;\n constructor(public tokens: Token[]) {}\n peek(): Token | undefined { return this.tokens[this.i]; }\n next(): Token | undefined { return this.tokens[this.i++]; }\n}\n\nfunction parseExpr(c: Cursor): Node { return parseAdd(c); }\n\nfunction parseAdd(c: Cursor): Node {\n let node = parseMul(c);\n for (;;) {\n const t = c.peek();\n if (t?.type !== 'op' || (t.op !== '+' && t.op !== '-')) break;\n c.next();\n node = { kind: 'bin', op: t.op, left: node, right: parseMul(c) };\n }\n return node;\n}\n\nfunction parseMul(c: Cursor): Node {\n let node = parseUnary(c);\n for (;;) {\n const t = c.peek();\n if (t?.type !== 'op' || (t.op !== '*' && t.op !== '/')) break;\n c.next();\n node = { kind: 'bin', op: t.op, left: node, right: parseUnary(c) };\n }\n return node;\n}\n\nfunction parseUnary(c: Cursor): Node {\n const t = c.peek();\n if (t?.type === 'op' && t.op === '-') { c.next(); return { kind: 'neg', child: parseUnary(c) }; }\n if (t?.type === 'op' && t.op === '+') { c.next(); return parseUnary(c); }\n return parsePrimary(c);\n}\n\nfunction parsePrimary(c: Cursor): Node {\n const t = c.next();\n if (!t) throw new Error('unexpected end of expression');\n if (t.type === 'num') return { kind: 'num', value: t.value };\n if (t.type === 'lparen') {\n const node = parseExpr(c);\n const close = c.next();\n if (close?.type !== 'rparen') throw new Error('expected \")\"');\n return node;\n }\n if (t.type === 'id') {\n if (c.peek()?.type === 'lparen') {\n c.next();\n const args: Node[] = [];\n if (c.peek()?.type !== 'rparen') {\n args.push(parseExpr(c));\n while (c.peek()?.type === 'comma') { c.next(); args.push(parseExpr(c)); }\n }\n const close = c.next();\n if (close?.type !== 'rparen') throw new Error('expected \")\"');\n return { kind: 'call', name: t.name, args };\n }\n return { kind: 'var', name: t.name };\n }\n throw new Error(`unexpected token \"${t.type}\"`);\n}\n\nfunction parse(src: string): Node {\n const c = new Cursor(tokenize(src));\n const node = parseExpr(c);\n if (c.peek()) throw new Error('trailing input');\n return node;\n}\n\nfunction evalNode(node: Node, scope: Record<string, number>): number {\n switch (node.kind) {\n case 'num': return node.value;\n case 'var': {\n const v = scope[node.name];\n if (typeof v !== 'number') throw new Error(`undefined variable: ${node.name}`);\n return v;\n }\n case 'neg': return -evalNode(node.child, scope);\n case 'bin': {\n const l = evalNode(node.left, scope);\n const r = evalNode(node.right, scope);\n switch (node.op) {\n case '+': return l + r;\n case '-': return l - r;\n case '*': return l * r;\n case '/': return l / r;\n }\n }\n /* c8 ignore next 5 */\n // eslint-disable-next-line no-fallthrough\n case 'call': {\n const fn = FUNCS[node.name];\n if (!fn) throw new Error(`unknown function: ${node.name}`);\n return fn(...node.args.map(a => evalNode(a, scope)));\n }\n }\n}\n\nconst ZERO_NODE: Node = { kind: 'num', value: 0 };\nconst astCache = new Map<string, Node>();\n\nexport function isExpr(v: unknown): v is string {\n return typeof v === 'string' && v.length > 0;\n}\n\nexport function evaluateExpr(source: string, scope: Record<string, number>): number {\n let ast = astCache.get(source);\n if (ast === undefined) {\n try {\n ast = parse(source);\n } catch (e) {\n console.warn(`pixi-effects: expression failed: ${source}`, e);\n ast = ZERO_NODE;\n }\n astCache.set(source, ast);\n }\n try {\n return evalNode(ast, scope);\n } catch (e) {\n console.warn(`pixi-effects: expression failed: ${source}`, e);\n return 0;\n }\n}\n","import { evaluateExpr, isExpr } from './Parser';\n\nexport interface NormalizeOptions {\n /** Keys whose string values should NOT be evaluated as expressions (e.g. 'fill', 'fontFamily'). */\n skipKeys?: string[];\n}\n\nexport function normalizeProps<T>(\n input: T,\n scope: Record<string, number>,\n options: NormalizeOptions = {},\n): T {\n const skip = new Set(options.skipKeys ?? []);\n return walk(input, scope, skip, null) as T;\n}\n\nfunction walk(\n value: unknown,\n scope: Record<string, number>,\n skip: Set<string>,\n currentKey: string | null,\n): unknown {\n if (Array.isArray(value)) {\n return value.map(v => walk(v, scope, skip, currentKey));\n }\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(value)) {\n out[k] = walk((value as Record<string, unknown>)[k], scope, skip, k);\n }\n return out;\n }\n if (isExpr(value) && !(currentKey !== null && skip.has(currentKey))) {\n // Hex colour strings (`#fff`, `#ff0000`, `#ff0000ff`) are passed through\n // verbatim — they're never expressions. Same for `rgb(...)` /\n // `rgba(...)` / `oklch(...)` etc. Without this, a bare `tint: '#ff0000'`\n // would be evaluated and silently zero out.\n if (looksLikeColorString(value)) return value;\n return evaluateExpr(value, scope);\n }\n return value;\n}\n\nfunction looksLikeColorString(s: string): boolean {\n if (s.length === 0) return false;\n if (s.charCodeAt(0) === 35 /* '#' */) return true;\n // Quick prefix check for css-style colour functions: rgb, rgba, hsl,\n // hsla, oklab, oklch, lab, lch.\n return /^(rgb|hsl|oklab|oklch|lab|lch)\\b/i.test(s);\n}\n","import { gsap } from 'gsap';\nimport { normalizeProps } from '../expr/normalizeProps';\nimport type { Keyframe } from '../types';\nimport type { NamedFilter } from '../filters';\n\nexport type Kind = 'set' | 'to' | 'from' | 'fromTo';\n\nexport interface NormalizedKeyframe {\n at: number;\n duration: number;\n ease: string;\n kind: Kind;\n set?: Record<string, unknown>;\n to?: Record<string, unknown>;\n from?: Record<string, unknown>;\n}\n\nexport function resolveAt(at: number | undefined | null, duration: number): number {\n if (at === undefined || at === null) return 0;\n return at < 0 ? duration + at : at;\n}\n\nexport function normalizeKeyframe(kf: Keyframe, parentDuration: number): NormalizedKeyframe {\n const at = resolveAt(kf.at, parentDuration);\n const duration = kf.duration ?? 0;\n const ease = kf.ease ?? 'none';\n const hasSet = !!kf.set;\n const hasFrom = !!kf.from;\n const hasTo = !!kf.to;\n let kind: Kind;\n if (hasSet) kind = 'set';\n else if (hasFrom && hasTo) kind = 'fromTo';\n else if (hasFrom) kind = 'from';\n else if (hasTo) kind = 'to';\n else kind = 'to';\n return { at, duration, ease, kind, set: kf.set, from: kf.from, to: kf.to };\n}\n\nexport interface Partitioned {\n ownProps: Record<string, unknown>;\n filterProps: Record<string, Record<string, unknown>>;\n}\n\nexport function partitionProps(props: Record<string, unknown>): Partitioned {\n const ownProps: Record<string, unknown> = {};\n const filterProps: Record<string, Record<string, unknown>> = {};\n for (const k of Object.keys(props)) {\n const m = k.match(/^filters\\.([^.]+)\\.(.+)$/);\n if (m) {\n const [, name, sub] = m as unknown as [string, string, string];\n (filterProps[name] ??= {})[sub] = props[k];\n } else {\n ownProps[k] = props[k];\n }\n }\n return { ownProps, filterProps };\n}\n\ninterface FilterTarget { filters?: NamedFilter[] | null }\n\nfunction findFilter(target: FilterTarget, name: string): NamedFilter | null {\n if (!target?.filters) return null;\n for (const f of target.filters) {\n if (f?._name === name) return f;\n }\n return null;\n}\n\nconst PIXI_SHORTHANDS = new Set([\n 'scale', 'scaleX', 'scaleY',\n 'anchor', 'anchorX', 'anchorY',\n 'pivot', 'pivotX', 'pivotY',\n 'skew', 'skewX', 'skewY',\n 'rotation',\n 'position', 'positionX', 'positionY',\n 'tilePosition', 'tilePositionX', 'tilePositionY',\n 'tileScale', 'tileScaleX', 'tileScaleY',\n 'tint',\n 'colorize', 'colorizeAmount',\n 'colorMatrixFilter',\n 'blur', 'blurX', 'blurY', 'blurPadding',\n 'autoAlpha',\n 'lineColor', 'lineAlpha', 'fillColor', 'fillAlpha',\n]);\n\nfunction pixiwrap(props: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const pixi: Record<string, unknown> = {};\n let usedPixi = false;\n for (const [k, v] of Object.entries(props)) {\n if (PIXI_SHORTHANDS.has(k)) { pixi[k] = v; usedPixi = true; }\n else { out[k] = v; }\n }\n if (usedPixi) out.pixi = pixi;\n return out;\n}\n\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\nexport function applyKeyframes(\n timeline: Timeline,\n target: object,\n keyframes: Keyframe[] | undefined,\n parentDuration: number,\n scope: Record<string, number>,\n skipKeys: string[] = [],\n offset = 0,\n): void {\n for (const raw of keyframes ?? []) {\n const kf = normalizeKeyframe(raw, parentDuration);\n const at = offset + kf.at;\n if (kf.kind === 'set') {\n const resolved = normalizeProps(kf.set!, scope, { skipKeys });\n const { ownProps, filterProps } = partitionProps(resolved);\n if (Object.keys(ownProps).length > 0) timeline.set(target, pixiwrap(ownProps), at);\n for (const [name, props] of Object.entries(filterProps)) {\n const f = findFilter(target as FilterTarget, name);\n if (!f) continue;\n timeline.set(f, props, at);\n }\n } else if (kf.kind === 'to') {\n const resolved = normalizeProps(kf.to!, scope, { skipKeys });\n const { ownProps, filterProps } = partitionProps(resolved);\n if (Object.keys(ownProps).length > 0)\n timeline.to(target, { ...pixiwrap(ownProps), duration: kf.duration, ease: kf.ease }, at);\n for (const [name, props] of Object.entries(filterProps)) {\n const f = findFilter(target as FilterTarget, name);\n if (!f) continue;\n timeline.to(f, { ...props, duration: kf.duration, ease: kf.ease }, at);\n }\n } else if (kf.kind === 'from') {\n const resolved = normalizeProps(kf.from!, scope, { skipKeys });\n const { ownProps, filterProps } = partitionProps(resolved);\n if (Object.keys(ownProps).length > 0)\n timeline.from(target, { ...pixiwrap(ownProps), duration: kf.duration, ease: kf.ease }, at);\n for (const [name, props] of Object.entries(filterProps)) {\n const f = findFilter(target as FilterTarget, name);\n if (!f) continue;\n timeline.from(f, { ...props, duration: kf.duration, ease: kf.ease }, at);\n }\n } else {\n const fromResolved = normalizeProps(kf.from!, scope, { skipKeys });\n const toResolved = normalizeProps(kf.to!, scope, { skipKeys });\n const fromSplit = partitionProps(fromResolved);\n const toSplit = partitionProps(toResolved);\n const ownKeys = new Set([...Object.keys(fromSplit.ownProps), ...Object.keys(toSplit.ownProps)]);\n if (ownKeys.size > 0) {\n timeline.fromTo(\n target,\n { ...pixiwrap(fromSplit.ownProps) },\n { ...pixiwrap(toSplit.ownProps), duration: kf.duration, ease: kf.ease },\n at,\n );\n }\n const filterNames = new Set([\n ...Object.keys(fromSplit.filterProps),\n ...Object.keys(toSplit.filterProps),\n ]);\n for (const name of filterNames) {\n const f = findFilter(target as FilterTarget, name);\n if (!f) continue;\n timeline.fromTo(\n f,\n { ...(fromSplit.filterProps[name] ?? {}) },\n { ...(toSplit.filterProps[name] ?? {}), duration: kf.duration, ease: kf.ease },\n at,\n );\n }\n }\n }\n}\n\nexport function applyInitial(\n target: object,\n initial: Record<string, unknown> | undefined,\n scope: Record<string, number>,\n skipKeys: string[] = [],\n): void {\n if (!initial) return;\n const resolved = normalizeProps(initial, scope, { skipKeys });\n const { ownProps, filterProps } = partitionProps(resolved);\n if (Object.keys(ownProps).length > 0) gsap.set(target, pixiwrap(ownProps));\n for (const [name, props] of Object.entries(filterProps)) {\n const f = findFilter(target as FilterTarget, name);\n if (!f) continue;\n gsap.set(f, props);\n }\n}\n","import type { CompositionShape } from '../types';\n\n/** Sequence-shaped input expected by buildScope. */\nexport interface ScopeSequence {\n intrinsicWidth: number;\n intrinsicHeight: number;\n at?: number;\n duration?: number;\n}\n\n/** Variables available to expression evaluation. */\nexport interface Scope {\n w: number; h: number;\n W: number; H: number;\n GW: number; GH: number;\n contain: number; cover: number;\n t: number; d: number; T: number;\n}\n\nexport function buildScope(\n sequence: ScopeSequence,\n parent: CompositionShape | null,\n root: CompositionShape,\n): Scope {\n const w = sequence.intrinsicWidth || 0;\n const h = sequence.intrinsicHeight || 0;\n const W = parent?.width ?? root.width;\n const H = parent?.height ?? root.height;\n const GW = root.width;\n const GH = root.height;\n const contain = (w === 0 || h === 0) ? 1 : Math.min(W / w, H / h);\n const cover = (w === 0 || h === 0) ? 1 : Math.max(W / w, H / h);\n return {\n w, h, W, H, GW, GH,\n contain, cover,\n t: sequence.at ?? 0,\n d: sequence.duration ?? parent?.duration ?? root.duration,\n T: parent?.duration ?? root.duration,\n };\n}\n","import { Filter, GlProgram, GpuProgram, UniformGroup, defaultFilterVert, Color } from 'pixi.js';\n\n// ── Fragment shader ─ GLSL (WebGL renderer) ──────────────────────────────\nconst GL_FRAGMENT = `\nin vec2 vTextureCoord;\nuniform sampler2D uTexture;\nuniform vec3 uKeyColor;\nuniform float uThreshold;\nuniform float uSmoothing;\nuniform float uSpill;\n\nout vec4 finalColor;\n\nvoid main(void) {\n vec4 raw = texture(uTexture, vTextureCoord);\n\n // Pixi passes pre-multiplied alpha into filters. Un-premultiply so the\n // chromakey distance is computed against the source color, not a darkened\n // version that drifts away from the key as sprite.alpha drops.\n vec3 rgb = raw.a > 0.0 ? raw.rgb / raw.a : vec3(0.0);\n\n vec3 ycbcr = vec3(\n 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b,\n -0.169 * rgb.r - 0.331 * rgb.g + 0.5 * rgb.b + 0.5,\n 0.5 * rgb.r - 0.419 * rgb.g - 0.081 * rgb.b + 0.5\n );\n vec3 keyYcbcr = vec3(\n 0.299 * uKeyColor.r + 0.587 * uKeyColor.g + 0.114 * uKeyColor.b,\n -0.169 * uKeyColor.r - 0.331 * uKeyColor.g + 0.5 * uKeyColor.b + 0.5,\n 0.5 * uKeyColor.r - 0.419 * uKeyColor.g - 0.081 * uKeyColor.b + 0.5\n );\n\n float dist = length(ycbcr - keyYcbcr);\n float alpha = smoothstep(uThreshold - uSmoothing, uThreshold + uSmoothing, dist);\n\n vec3 despilled = rgb;\n if (uSpill > 0.0) {\n float spillAmount = max(0.0, rgb.g - max(rgb.r, rgb.b));\n despilled.g -= spillAmount * uSpill;\n }\n\n float outA = raw.a * alpha;\n finalColor = vec4(despilled * outA, outA);\n}\n`;\n\n// ── Combined vertex+fragment ─ WGSL (WebGPU renderer) ────────────────────\n// Layout follows PIXI v8's built-in filter pattern (see NoiseFilter.wgsl):\n// group(0): global filter uniforms + uTexture + uSampler\n// group(1): the filter's own uniform block — name MUST match the resource\n// key passed to the Filter constructor (`chromaUniforms`).\nconst WGSL_SOURCE = `\nstruct GlobalFilterUniforms {\n uInputSize: vec4<f32>,\n uInputPixel: vec4<f32>,\n uInputClamp: vec4<f32>,\n uOutputFrame: vec4<f32>,\n uGlobalFrame: vec4<f32>,\n uOutputTexture: vec4<f32>,\n};\n\nstruct ChromaUniforms {\n uKeyColor: vec3<f32>,\n uThreshold: f32,\n uSmoothing: f32,\n uSpill: f32,\n};\n\n@group(0) @binding(0) var<uniform> gfu: GlobalFilterUniforms;\n@group(0) @binding(1) var uTexture: texture_2d<f32>;\n@group(0) @binding(2) var uSampler : sampler;\n@group(1) @binding(0) var<uniform> chromaUniforms : ChromaUniforms;\n\nstruct VSOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\nfn filterVertexPosition(aPosition : vec2<f32>) -> vec4<f32> {\n var position = aPosition * gfu.uOutputFrame.zw + gfu.uOutputFrame.xy;\n position.x = position.x * (2.0 / gfu.uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * gfu.uOutputTexture.z / gfu.uOutputTexture.y) - gfu.uOutputTexture.z;\n return vec4<f32>(position, 0.0, 1.0);\n}\n\nfn filterTextureCoord(aPosition : vec2<f32>) -> vec2<f32> {\n return aPosition * (gfu.uOutputFrame.zw * gfu.uInputSize.zw);\n}\n\n// NOTE on whitespace: PIXI v8's WGSL attribute extractor is regex-based and\n// expects the noise/blur reference format — multi-line param list + space\n// before the colon. A compact one-liner with no space before the colon parses\n// as having NO vertex attributes, which then causes a \"Vertex attribute slot 0\n// not present in the VertexState\" pipeline validation error.\n@vertex\nfn mainVertex(\n @location(0) aPosition : vec2<f32>,\n) -> VSOutput {\n return VSOutput(\n filterVertexPosition(aPosition),\n filterTextureCoord(aPosition),\n );\n}\n\n@fragment\nfn mainFragment(@location(0) uv : vec2<f32>) -> @location(0) vec4<f32> {\n let raw = textureSample(uTexture, uSampler, uv);\n\n // Un-premultiply (see comment in the GLSL version above).\n var rgb: vec3<f32>;\n if (raw.a > 0.0) {\n rgb = raw.rgb / raw.a;\n } else {\n rgb = vec3<f32>(0.0);\n }\n\n let key = chromaUniforms.uKeyColor;\n\n let ycbcr = vec3<f32>(\n 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b,\n -0.169 * rgb.r - 0.331 * rgb.g + 0.5 * rgb.b + 0.5,\n 0.5 * rgb.r - 0.419 * rgb.g - 0.081 * rgb.b + 0.5,\n );\n let keyYcbcr = vec3<f32>(\n 0.299 * key.r + 0.587 * key.g + 0.114 * key.b,\n -0.169 * key.r - 0.331 * key.g + 0.5 * key.b + 0.5,\n 0.5 * key.r - 0.419 * key.g - 0.081 * key.b + 0.5,\n );\n\n let dist = length(ycbcr - keyYcbcr);\n let alpha = smoothstep(\n chromaUniforms.uThreshold - chromaUniforms.uSmoothing,\n chromaUniforms.uThreshold + chromaUniforms.uSmoothing,\n dist,\n );\n\n var despilled = rgb;\n if (chromaUniforms.uSpill > 0.0) {\n let spillAmount = max(0.0, rgb.g - max(rgb.r, rgb.b));\n despilled.g = despilled.g - spillAmount * chromaUniforms.uSpill;\n }\n\n let outA = raw.a * alpha;\n return vec4<f32>(despilled * outA, outA);\n}\n`;\n\nexport interface ChromaKeyOptions {\n keyColor?: string | [number, number, number];\n threshold?: number;\n smoothing?: number;\n spill?: number;\n}\n\nfunction toRgb01(input: string | [number, number, number]): [number, number, number] {\n if (Array.isArray(input)) return [input[0], input[1], input[2]];\n const c = new Color(input);\n return [c.red, c.green, c.blue];\n}\n\nexport class ChromaKeyFilter extends Filter {\n constructor(options: ChromaKeyOptions = {}) {\n const {\n keyColor = '#00ff00',\n threshold = 0.4,\n smoothing = 0.1,\n spill = 0.2,\n } = options;\n\n const glProgram = GlProgram.from({\n vertex: defaultFilterVert,\n fragment: GL_FRAGMENT,\n name: 'chroma-key-filter',\n });\n\n const gpuProgram = GpuProgram.from({\n vertex: { source: WGSL_SOURCE, entryPoint: 'mainVertex' },\n fragment: { source: WGSL_SOURCE, entryPoint: 'mainFragment' },\n });\n\n super({\n glProgram,\n gpuProgram,\n resources: {\n chromaUniforms: new UniformGroup({\n uKeyColor: { value: toRgb01(keyColor), type: 'vec3<f32>' },\n uThreshold: { value: threshold, type: 'f32' },\n uSmoothing: { value: smoothing, type: 'f32' },\n uSpill: { value: spill, type: 'f32' },\n }),\n },\n });\n }\n\n get threshold(): number { return this.resources.chromaUniforms.uniforms.uThreshold as number; }\n set threshold(v: number) { this.resources.chromaUniforms.uniforms.uThreshold = v; }\n get smoothing(): number { return this.resources.chromaUniforms.uniforms.uSmoothing as number; }\n set smoothing(v: number) { this.resources.chromaUniforms.uniforms.uSmoothing = v; }\n get spill(): number { return this.resources.chromaUniforms.uniforms.uSpill as number; }\n set spill(v: number) { this.resources.chromaUniforms.uniforms.uSpill = v; }\n\n setKeyColor(input: string | [number, number, number]): void {\n const rgb = toRgb01(input);\n const u = this.resources.chromaUniforms.uniforms.uKeyColor as [number, number, number];\n u[0] = rgb[0]; u[1] = rgb[1]; u[2] = rgb[2];\n }\n}\n","import type { Filter } from 'pixi.js';\nimport type { FilterSpec, CustomFilterSpec } from '../types';\nimport { ChromaKeyFilter } from './ChromaKey';\n\ninterface FilterCtor {\n new (params: Record<string, unknown>): Filter;\n}\n\nconst registry: Record<Exclude<FilterSpec['type'], 'custom'>, FilterCtor> = {\n chromaKey: ChromaKeyFilter as unknown as FilterCtor,\n};\n\n/** Internal marker we set on filter instances so partition path resolution finds them. */\nexport interface NamedFilter extends Filter {\n _name?: string;\n}\n\n/**\n * Duck-type check for a PIXI Filter. We can't use `instanceof Filter` because\n * filters loaded from a different bundled copy of `pixi.js` (e.g. via esm.sh\n * or a duplicated install) won't share the same class reference. PIXI's\n * `Filter` exposes an `apply` method on its prototype; check for that instead.\n */\nfunction looksLikePixiFilter(x: unknown): x is Filter {\n return !!x && typeof x === 'object' && typeof (x as { apply?: unknown }).apply === 'function';\n}\n\nexport function createFilter(spec: FilterSpec): NamedFilter {\n if (spec.type === 'custom') {\n const inst = (spec as CustomFilterSpec).filter;\n if (!looksLikePixiFilter(inst)) {\n throw new Error('pixi-effects: { type: \"custom\" } requires a `filter` that is a PIXI Filter instance (duck-typed: must have an `apply` method).');\n }\n const named = inst as NamedFilter;\n named._name = spec.name;\n return named;\n }\n const Cls = registry[spec.type];\n if (!Cls) throw new Error(`pixi-effects: unknown filter type \"${(spec as { type: string }).type}\"`);\n const { type: _t, name, ...params } = spec as Record<string, unknown> & { type: string; name?: string };\n const inst = new Cls(params) as NamedFilter;\n inst._name = name;\n return inst;\n}\n\nexport function findFilterByName(filters: NamedFilter[], name: string): NamedFilter | null {\n return filters.find(f => f._name === name) ?? null;\n}\n","import type { Container } from 'pixi.js';\nimport { Rectangle } from 'pixi.js';\nimport { applyKeyframes, applyInitial } from '../core/Timeline';\nimport { buildScope, type Scope } from '../expr/Scope';\nimport { createFilter, type NamedFilter } from '../filters';\nimport type { CompositionShape, SequenceSpec, AudioDescriptor } from '../types';\n\nimport type { gsap } from 'gsap';\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\nexport abstract class Sequence {\n spec: SequenceSpec;\n parent: CompositionShape | null;\n root: CompositionShape;\n target: Container | null = null;\n intrinsicWidth = 0;\n intrinsicHeight = 0;\n at: number;\n duration: number | undefined;\n filters: NamedFilter[] = [];\n /**\n * Mask sequence built from `spec.mask`, if any. Built and added to the\n * scene graph by the parent CompositionSequence; rendered as a mask\n * (not a normal child) by PIXI when `target.mask = maskSequence.target`.\n */\n maskSequence: Sequence | null = null;\n\n constructor(spec: SequenceSpec, parent: CompositionShape | null, root: CompositionShape) {\n this.spec = spec;\n this.parent = parent;\n this.root = root;\n this.at = spec.at ?? 0;\n this.duration = spec.duration;\n }\n\n abstract build(): Promise<void>;\n\n buildFilters(): void {\n const specs = this.spec.filters ?? [];\n this.filters = specs.map(createFilter);\n if (this.target && 'filters' in this.target) {\n (this.target as unknown as { filters: NamedFilter[] }).filters = this.filters;\n }\n // Honor an explicit filterArea override (e.g. set by expandTransitions so\n // a wipe / iris filter on a small text sprite still covers the whole\n // composition rather than being clipped to the text bbox).\n const fa = this.spec.filterArea;\n if (fa && this.target) {\n this.target.filterArea = new Rectangle(fa.x, fa.y, fa.width, fa.height);\n }\n }\n\n scope(): Scope {\n return buildScope(this, this.parent, this.root);\n }\n\n bindTimeline(timeline: Timeline, offset = 0): void {\n if (!this.target) return;\n const scope = this.scope();\n applyInitial(this.target, this.spec.initial as Record<string, unknown> | undefined, scope as unknown as Record<string, number>);\n applyKeyframes(timeline, this.target, this.spec.keyframes, this.duration!, scope as unknown as Record<string, number>, [], offset);\n // Hide before lifespan starts. GSAP's `set` only fires when the playhead\n // crosses its time, so without this baseline a sequence with at>0 (or any\n // non-zero offset from a nested composition) would render at t<startTime\n // on PIXI's default `renderable: true`.\n const startTime = offset + this.at;\n const endTime = startTime + this.duration!;\n this.target.renderable = startTime <= 0;\n timeline.set(this.target, { renderable: true }, startTime);\n timeline.set(this.target, { renderable: false }, endTime);\n }\n\n collectAudio(_out: AudioDescriptor[], _baseTime: number): void {\n // default: no audio\n }\n\n destroy(): void {\n this.maskSequence?.destroy();\n this.maskSequence = null;\n this.target?.destroy?.();\n this.target = null;\n }\n}\n","/**\n * Perceptually uniform colour interpolation in OKLab / OKLCH.\n *\n * These spaces (Björn Ottosson, 2020) keep saturation and lightness\n * intuitive across a tween — a red → green ramp doesn't pass through\n * the muddy olive / brown that linear sRGB interpolation produces.\n *\n * - `oklab` : straight line in the (a, b) chromaticity plane.\n * - `oklch` : (L, C, h) with hue along the shorter angular path —\n * gives smooth rainbow-style sweeps.\n *\n * Inputs accept any of the formats colours appear in our DSL:\n * - hex string (`'#ff3366'`, `'#f36'`)\n * - 0xRRGGBB number\n * - rgb()/rgba() string\n * Outputs are always `'rgba(r,g,b,a)'` strings — that's what PixiJS's\n * Color() parser handles natively.\n */\n\nexport type ColorSpace = 'rgb' | 'oklab' | 'oklch';\n\nexport type ColorInput = string | number;\n\n/** Build an interpolator function `t ∈ [0, 1] → 'rgba(...)' string`. */\nexport function buildColorInterp(\n from: ColorInput,\n to: ColorInput,\n space: 'oklab' | 'oklch',\n): (t: number) => string {\n const fromRGBA = parseToRGBA(from);\n const toRGBA = parseToRGBA(to);\n const fromOk = rgbToOklab(fromRGBA);\n const toOk = rgbToOklab(toRGBA);\n\n if (space === 'oklab') {\n return (t: number): string => {\n const L = lerp(fromOk.L, toOk.L, t);\n const a = lerp(fromOk.a, toOk.a, t);\n const b = lerp(fromOk.b, toOk.b, t);\n const alpha = lerp(fromRGBA.a, toRGBA.a, t);\n return rgbaString(oklabToRgb({ L, a, b }), alpha);\n };\n }\n\n // OKLCH: convert to polar and interpolate hue along the shorter arc.\n const fromLCH = oklabToOklch(fromOk);\n const toLCH = oklabToOklch(toOk);\n // If either endpoint is achromatic (C ≈ 0), its hue is undefined; carry\n // the other endpoint's hue across so the ramp doesn't sweep through\n // arbitrary colours on the way to / from grey.\n if (fromLCH.C < 1e-4) fromLCH.h = toLCH.h;\n if (toLCH.C < 1e-4) toLCH.h = fromLCH.h;\n const hueDelta = shortestHueDelta(fromLCH.h, toLCH.h);\n\n return (t: number): string => {\n const L = lerp(fromLCH.L, toLCH.L, t);\n const C = lerp(fromLCH.C, toLCH.C, t);\n const h = fromLCH.h + hueDelta * t;\n const alpha = lerp(fromRGBA.a, toRGBA.a, t);\n const ab = oklchToOklab({ L, C, h });\n return rgbaString(oklabToRgb(ab), alpha);\n };\n}\n\n// ─── Parsers / formatters ────────────────────────────────────────────────\n\ninterface RGBA { r: number; g: number; b: number; a: number; } // 0..1 each\n\nfunction parseToRGBA(input: ColorInput): RGBA {\n if (typeof input === 'number') {\n return { r: ((input >> 16) & 0xff) / 255, g: ((input >> 8) & 0xff) / 255, b: (input & 0xff) / 255, a: 1 };\n }\n const s = input.trim();\n if (s.startsWith('#')) return parseHex(s);\n if (s.startsWith('rgb')) return parseRgbFunc(s);\n // Unknown format — fall back to opaque black rather than throwing, since\n // styling is best-effort and a single bad colour shouldn't blow the timeline.\n return { r: 0, g: 0, b: 0, a: 1 };\n}\n\nfunction parseHex(s: string): RGBA {\n const hex = s.slice(1);\n let r = 0, g = 0, b = 0, a = 1;\n if (hex.length === 3 || hex.length === 4) {\n r = parseInt(hex[0]! + hex[0]!, 16) / 255;\n g = parseInt(hex[1]! + hex[1]!, 16) / 255;\n b = parseInt(hex[2]! + hex[2]!, 16) / 255;\n if (hex.length === 4) a = parseInt(hex[3]! + hex[3]!, 16) / 255;\n } else if (hex.length === 6 || hex.length === 8) {\n r = parseInt(hex.slice(0, 2), 16) / 255;\n g = parseInt(hex.slice(2, 4), 16) / 255;\n b = parseInt(hex.slice(4, 6), 16) / 255;\n if (hex.length === 8) a = parseInt(hex.slice(6, 8), 16) / 255;\n }\n return { r, g, b, a };\n}\n\nfunction parseRgbFunc(s: string): RGBA {\n // Accept `rgb(r, g, b)` and `rgba(r, g, b, a)` — channels are 0..255 ints.\n const inner = s.replace(/^rgba?\\(/, '').replace(/\\)$/, '');\n const parts = inner.split(/[,\\s/]+/).filter(Boolean).map(parseFloat);\n return {\n r: (parts[0] ?? 0) / 255,\n g: (parts[1] ?? 0) / 255,\n b: (parts[2] ?? 0) / 255,\n a: parts.length > 3 ? (parts[3] ?? 1) : 1,\n };\n}\n\nfunction rgbaString(rgb: { r: number; g: number; b: number }, alpha: number): string {\n const r = Math.round(clamp01(rgb.r) * 255);\n const g = Math.round(clamp01(rgb.g) * 255);\n const b = Math.round(clamp01(rgb.b) * 255);\n return `rgba(${r},${g},${b},${alpha})`;\n}\n\n// ─── sRGB ↔ linear ↔ OKLab ─────────────────────────────────────────────\n\nfunction srgbToLinear(c: number): number {\n return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n}\nfunction linearToSrgb(c: number): number {\n return c <= 0.0031308 ? 12.92 * c : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\n}\n\ninterface OkLab { L: number; a: number; b: number; }\n\nfunction rgbToOklab(rgba: RGBA): OkLab {\n const r = srgbToLinear(rgba.r);\n const g = srgbToLinear(rgba.g);\n const b = srgbToLinear(rgba.b);\n const l = 0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b;\n const m = 0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b;\n const s = 0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b;\n const l_ = Math.cbrt(l);\n const m_ = Math.cbrt(m);\n const s_ = Math.cbrt(s);\n return {\n L: 0.2104542553 * l_ + 0.7936177850 * m_ - 0.0040720468 * s_,\n a: 1.9779984951 * l_ - 2.4285922050 * m_ + 0.4505937099 * s_,\n b: 0.0259040371 * l_ + 0.7827717662 * m_ - 0.8086757660 * s_,\n };\n}\n\nfunction oklabToRgb(lab: OkLab): { r: number; g: number; b: number } {\n const l_ = lab.L + 0.3963377774 * lab.a + 0.2158037573 * lab.b;\n const m_ = lab.L - 0.1055613458 * lab.a - 0.0638541728 * lab.b;\n const s_ = lab.L - 0.0894841775 * lab.a - 1.2914855480 * lab.b;\n const l = l_ * l_ * l_;\n const m = m_ * m_ * m_;\n const s = s_ * s_ * s_;\n return {\n r: linearToSrgb(+4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s),\n g: linearToSrgb(-1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s),\n b: linearToSrgb(-0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s),\n };\n}\n\ninterface OkLCh { L: number; C: number; h: number; } // h in radians\n\nfunction oklabToOklch(lab: OkLab): OkLCh {\n return { L: lab.L, C: Math.hypot(lab.a, lab.b), h: Math.atan2(lab.b, lab.a) };\n}\n\nfunction oklchToOklab(lch: OkLCh): OkLab {\n return { L: lch.L, a: lch.C * Math.cos(lch.h), b: lch.C * Math.sin(lch.h) };\n}\n\n// ─── helpers ─────────────────────────────────────────────────────────────\n\nfunction lerp(a: number, b: number, t: number): number { return a + (b - a) * t; }\nfunction clamp01(v: number): number { return v < 0 ? 0 : v > 1 ? 1 : v; }\n\nfunction shortestHueDelta(from: number, to: number): number {\n // Both inputs are in [-π, π] from atan2. Pick the path that crosses the\n // smaller arc — never more than ±π.\n const TWO_PI = Math.PI * 2;\n let d = (to - from) % TWO_PI;\n if (d > Math.PI) d -= TWO_PI;\n if (d < -Math.PI) d += TWO_PI;\n return d;\n}\n","import { gsap } from 'gsap';\nimport { buildColorInterp, type ColorSpace, type ColorInput } from './colorInterp';\n\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\n/**\n * Shared colour-tween helper used by every sequence type that wants to\n * interpolate a colour-valued property smoothly through a chosen colour\n * space (sRGB / OKLab / OKLCH).\n *\n * Keys to the design:\n * 1. The interpolator is built inside `onStart`, not at bind time, so a\n * chained-keyframe tween picks up the previous tween's end colour\n * (rather than locking onto the initial spec value).\n * 2. `fromValue` is honoured if explicit; otherwise we read `target[key]`\n * at tween start — matching GSAP's standard `.to()` semantic.\n * 3. The optional `onUpdate` hook lets the caller flag the target as dirty\n * after each write (e.g. PIXI Text needs `_didChange = true` to\n * re-rasterise its fill).\n */\nexport function tweenColor(\n timeline: Timeline,\n target: Record<string, unknown>,\n key: string,\n fromValue: ColorInput | undefined,\n toValue: ColorInput,\n duration: number,\n ease: string,\n at: number,\n colorSpace: ColorSpace,\n onUpdate?: () => void,\n): void {\n let interp: ((p: number) => unknown) | null = null;\n const proxy = { p: 0 };\n timeline.fromTo(\n proxy,\n { p: 0 },\n {\n p: 1, duration, ease,\n onStart: () => {\n const start = (fromValue !== undefined ? fromValue : target[key]) as ColorInput | undefined;\n if (start === undefined) return;\n interp = colorSpace === 'rgb'\n ? (gsap.utils.interpolate(start, toValue) as (p: number) => unknown)\n : buildColorInterp(start, toValue, colorSpace);\n },\n onUpdate: () => {\n if (interp) {\n target[key] = interp(proxy.p);\n if (onUpdate) onUpdate();\n }\n },\n },\n at,\n );\n}\n","import { Sprite, Assets, type Texture } from 'pixi.js';\nimport { gsap } from 'gsap';\nimport { Sequence } from './Base';\nimport { applyKeyframes, applyInitial, resolveAt } from '../core/Timeline';\nimport { tweenColor } from '../expr/colorTween';\nimport type { ColorInput, ColorSpace } from '../expr/colorInterp';\nimport type { ImageSequenceSpec, Keyframe, Props } from '../types';\n\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\nexport class ImageSequence extends Sequence {\n declare spec: ImageSequenceSpec;\n\n async build(): Promise<void> {\n const texture = await Assets.get<Texture>(this.spec.asset);\n const sprite = new Sprite({ texture, label: this.spec.name });\n sprite.cullable = true;\n this.target = sprite;\n this.intrinsicWidth = texture.width;\n this.intrinsicHeight = texture.height;\n if (this.duration === undefined) {\n this.duration = this.parent?.duration ?? this.root.duration;\n }\n this.buildFilters();\n }\n\n override bindTimeline(timeline: Timeline, offset = 0): void {\n if (!this.target) return;\n const colorSpace = this.spec.colorSpace;\n if (!colorSpace || colorSpace === 'rgb') {\n // Default path — tint goes through PixiPlugin's native colour\n // interpolation along with everything else.\n super.bindTimeline(timeline, offset);\n return;\n }\n\n // Custom colour-space path: strip `tint` from the standard pipeline\n // and route it through tweenColor() so the interpolator runs in OKLab\n // / OKLCH instead of linear sRGB.\n const scope = this.scope();\n const initial = stripKeys(this.spec.initial, ['tint']);\n const keyframes = this.spec.keyframes\n ? this.spec.keyframes.map(kf => stripKeysInKeyframe(kf, ['tint']))\n : undefined;\n applyInitial(this.target, initial as Record<string, unknown> | undefined, scope as unknown as Record<string, number>);\n applyKeyframes(timeline, this.target, keyframes, this.duration!, scope as unknown as Record<string, number>, [], offset);\n\n // Seed tint from initial.\n const initTint = (this.spec.initial as Record<string, unknown> | undefined)?.tint as ColorInput | undefined;\n if (initTint !== undefined) (this.target as unknown as { tint: ColorInput }).tint = initTint;\n\n // Walk keyframes and emit a perceptual colour tween for any `tint` key.\n for (const kf of this.spec.keyframes ?? []) {\n const at = offset + resolveAt(kf.at, this.duration!);\n const duration = kf.duration ?? 0;\n const ease = kf.ease ?? 'none';\n const fromTint = (kf.from as Record<string, unknown> | undefined)?.tint as ColorInput | undefined;\n const toTint = (kf.to as Record<string, unknown> | undefined)?.tint as ColorInput | undefined;\n const setTint = (kf.set as Record<string, unknown> | undefined)?.tint as ColorInput | undefined;\n if (setTint !== undefined) {\n timeline.call(() => { (this.target as unknown as { tint: ColorInput }).tint = setTint; }, [], at);\n }\n if (toTint !== undefined) {\n tweenColor(\n timeline,\n this.target as unknown as Record<string, unknown>,\n 'tint',\n fromTint,\n toTint,\n duration, ease, at, colorSpace,\n );\n }\n }\n\n const startTime = offset + this.at;\n const endTime = startTime + this.duration!;\n this.target.renderable = startTime <= 0;\n timeline.set(this.target, { renderable: true }, startTime);\n timeline.set(this.target, { renderable: false }, endTime);\n }\n}\n\nfunction stripKeys(props: Props | undefined, keys: string[]): Props | undefined {\n if (!props) return props;\n const drop = new Set(keys);\n const out: Record<string, unknown> = {};\n let changed = false;\n for (const k of Object.keys(props)) {\n if (drop.has(k)) { changed = true; continue; }\n out[k] = (props as Record<string, unknown>)[k];\n }\n return changed ? (out as unknown as Props) : props;\n}\n\nfunction stripKeysInKeyframe(kf: Keyframe, keys: string[]): Keyframe {\n return {\n ...kf,\n set: stripKeys(kf.set, keys),\n to: stripKeys(kf.to, keys),\n from: stripKeys(kf.from, keys),\n };\n}\n","import { Text } from 'pixi.js';\nimport { gsap } from 'gsap';\nimport { Sequence } from './Base';\nimport { normalizeProps } from '../expr/normalizeProps';\nimport { applyKeyframes, applyInitial, resolveAt } from '../core/Timeline';\nimport { tweenColor } from '../expr/colorTween';\nimport type { ColorInput } from '../expr/colorInterp';\nimport type { TextSequenceSpec, Keyframe, Props } from '../types';\n\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\nconst STYLE_OPAQUE_KEYS = ['fontFamily', 'fill', 'align', 'fontStyle', 'fontWeight'];\n\nexport class TextSequence extends Sequence {\n declare spec: TextSequenceSpec;\n\n async build(): Promise<void> {\n const baseStyle = {\n fontFamily: 'Arial',\n fontSize: 36,\n fill: '#ffffff',\n align: 'center' as const,\n };\n const text = new Text({\n text: this.spec.text ?? '',\n style: baseStyle,\n label: this.spec.name,\n });\n text.cullable = true;\n this.target = text;\n this.intrinsicWidth = text.width;\n this.intrinsicHeight = text.height;\n if (this.duration === undefined) {\n this.duration = this.parent?.duration ?? this.root.duration;\n }\n if (this.spec.style) {\n const scope = this.scope();\n const resolved = normalizeProps(\n this.spec.style as Record<string, unknown>,\n scope as unknown as Record<string, number>,\n { skipKeys: STYLE_OPAQUE_KEYS },\n );\n for (const k of Object.keys(resolved)) {\n (text.style as unknown as Record<string, unknown>)[k] = (resolved as Record<string, unknown>)[k];\n }\n }\n this.buildFilters();\n }\n\n override bindTimeline(timeline: Timeline, offset = 0): void {\n if (!this.target) return;\n const colorSpace = this.spec.colorSpace ?? 'rgb';\n // Run the standard pipeline with `fill` stripped — text doesn't have a\n // top-level `fill` property (it lives on `style`), so leaving it in\n // would make GSAP warn about an unknown prop. Then route fill through\n // our per-frame text.style.fill update, with optional perceptual\n // interpolation.\n const stripped = stripFill(this.spec);\n runSuperWithStrippedSpec(this, stripped, timeline, offset);\n bindFillKeyframes(timeline, this.target as Text, this.spec.keyframes ?? [], this.duration!, offset, colorSpace);\n }\n}\n\n// Helper: temporarily swap in a fill-stripped spec, run the base\n// bindTimeline, restore. Cheaper than reimplementing the entire base\n// behaviour.\nfunction runSuperWithStrippedSpec(\n inst: TextSequence,\n strippedSpec: TextSequenceSpec,\n timeline: Timeline,\n offset: number,\n): void {\n const originalSpec = inst.spec;\n (inst as unknown as { spec: TextSequenceSpec }).spec = strippedSpec;\n try {\n Sequence.prototype.bindTimeline.call(inst, timeline, offset);\n } finally {\n (inst as unknown as { spec: TextSequenceSpec }).spec = originalSpec;\n }\n}\n\nfunction stripFill(spec: TextSequenceSpec): TextSequenceSpec {\n return {\n ...spec,\n initial: stripKey(spec.initial, 'fill'),\n keyframes: spec.keyframes\n ? spec.keyframes.map(kf => ({\n ...kf,\n set: stripKey(kf.set, 'fill'),\n to: stripKey(kf.to, 'fill'),\n from: stripKey(kf.from, 'fill'),\n }))\n : undefined,\n };\n}\n\nfunction stripKey(props: Props | undefined, key: string): Props | undefined {\n if (!props) return props;\n if (!(key in props)) return props;\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(props)) if (k !== key) out[k] = (props as Record<string, unknown>)[k];\n return out as unknown as Props;\n}\n\n// Walk the keyframes and emit colour tweens for any `fill` mutation.\n// Updates `text.style.fill` directly; PIXI v8 marks the text dirty on\n// style mutation, so the fill change is rendered on the next frame.\nfunction bindFillKeyframes(\n timeline: Timeline,\n text: Text,\n keyframes: Keyframe[],\n parentDuration: number,\n offset: number,\n colorSpace: 'rgb' | 'oklab' | 'oklch',\n): void {\n // Mirror state object so tweenColor has somewhere consistent to write.\n // We then mirror back to text.style.fill in the onUpdate callback.\n const state: { fill?: ColorInput } = { fill: text.style.fill as ColorInput | undefined };\n const writeFill = (): void => { text.style.fill = state.fill as never; };\n\n for (const kf of keyframes) {\n const at = offset + resolveAt(kf.at, parentDuration);\n const duration = kf.duration ?? 0;\n const ease = kf.ease ?? 'none';\n const setFill = pickFill(kf.set);\n const fromFill = pickFill(kf.from);\n const toFill = pickFill(kf.to);\n\n if (setFill !== undefined) {\n timeline.call(() => { state.fill = setFill; writeFill(); }, [], at);\n }\n if (toFill !== undefined) {\n tweenColor(\n timeline,\n state as unknown as Record<string, unknown>,\n 'fill',\n fromFill,\n toFill,\n duration, ease, at, colorSpace,\n writeFill,\n );\n }\n }\n}\n\nfunction pickFill(props: Props | undefined): ColorInput | undefined {\n if (!props) return undefined;\n const v = (props as Record<string, unknown>).fill;\n if (typeof v === 'string' || typeof v === 'number') return v as ColorInput;\n return undefined;\n}\n","import { Assets } from 'pixi.js';\nimport { Sequence } from './Base';\nimport { normalizeKeyframe } from '../core/Timeline';\nimport type { AudioSequenceSpec, AudioDescriptor } from '../types';\nimport type { AudioAssetData } from '../core/AssetLoader';\n\nexport class AudioSequence extends Sequence {\n declare spec: AudioSequenceSpec;\n private _audioBuffer: AudioBuffer | null = null;\n\n async build(): Promise<void> {\n const data = await Assets.get<AudioAssetData>(this.spec.asset);\n this._audioBuffer = data.audioBuffer;\n if (this.duration === undefined) {\n this.duration = this.spec.duration ?? data.duration ?? this.root.duration;\n }\n this.target = null;\n }\n\n override bindTimeline(_timeline: unknown): void {\n // Audio has no visual; everything happens at mixdown time via collectAudio.\n }\n\n override collectAudio(out: AudioDescriptor[], baseTime: number): void {\n if (!this._audioBuffer) return;\n const initialVolume = this.spec.volume ?? 1;\n const volumeKeyframes: { time: number; value: number }[] = [];\n const dur = this.duration!;\n for (const raw of this.spec.keyframes ?? []) {\n const kf = normalizeKeyframe(raw, dur);\n const set = kf.set as Record<string, number> | undefined;\n const to = kf.to as Record<string, number> | undefined;\n const from = kf.from as Record<string, number> | undefined;\n if (kf.kind === 'set' && set && 'volume' in set) {\n volumeKeyframes.push({ time: baseTime + this.at + kf.at, value: set.volume! });\n } else if (kf.kind === 'to' && to && 'volume' in to) {\n volumeKeyframes.push({ time: baseTime + this.at + kf.at + kf.duration, value: to.volume! });\n } else if (kf.kind === 'fromTo' && to && 'volume' in to) {\n volumeKeyframes.push({ time: baseTime + this.at + kf.at, value: from?.volume ?? initialVolume });\n volumeKeyframes.push({ time: baseTime + this.at + kf.at + kf.duration, value: to.volume! });\n } else if (kf.kind === 'from' && from && 'volume' in from) {\n volumeKeyframes.push({ time: baseTime + this.at + kf.at, value: from.volume! });\n volumeKeyframes.push({ time: baseTime + this.at + kf.at + kf.duration, value: initialVolume });\n }\n }\n out.push({\n buffer: this._audioBuffer,\n loop: !!this.spec.loop,\n start: baseTime + this.at,\n end: baseTime + this.at + dur,\n initialVolume,\n volumeKeyframes,\n });\n }\n\n override destroy(): void {\n this._audioBuffer = null;\n }\n}\n","/**\n * Subset of the mediabunny VideoSampleSink API we depend on. Exposed as an\n * interface so tests can provide a mock sink.\n */\nexport interface FrameSink {\n getSample(time: number): Promise<{\n timestamp: number;\n toVideoFrame: () => VideoFrame;\n close?: () => void;\n } | null>;\n}\n\nexport interface FrameCacheOptions {\n capacity?: number;\n}\n\nexport class FrameCache {\n sink: FrameSink;\n capacity: number;\n cache: Map<number, VideoFrame> = new Map();\n private _pending: Map<number, Promise<VideoFrame | null>> = new Map();\n\n constructor(sink: FrameSink, options: FrameCacheOptions = {}) {\n this.sink = sink;\n this.capacity = options.capacity ?? 30;\n }\n\n private _key(time: number): number {\n return Math.round(time * 1000);\n }\n\n async getFrameAt(time: number): Promise<VideoFrame | null> {\n const key = this._key(time);\n\n if (this.cache.has(key)) {\n const v = this.cache.get(key)!;\n this.cache.delete(key);\n this.cache.set(key, v);\n return v;\n }\n\n const pending = this._pending.get(key);\n if (pending) return pending;\n\n const promise = this._fetch(time);\n this._pending.set(key, promise);\n try {\n const frame = await promise;\n if (frame) {\n if (this.cache.has(key)) {\n frame.close?.();\n const existing = this.cache.get(key)!;\n this.cache.delete(key);\n this.cache.set(key, existing);\n return existing;\n }\n this.cache.set(key, frame);\n this._evictIfNeeded();\n }\n return frame;\n } finally {\n this._pending.delete(key);\n }\n }\n\n private async _fetch(time: number): Promise<VideoFrame | null> {\n // WebCodecs decoders occasionally surface EncodingError / NotSupportedError\n // on certain seeks (rapid scrubbing, malformed packets at chapter joins,\n // EOF probes). These are known-transient and the next request usually\n // succeeds, so log them at `debug` (hidden in default consoles) instead of\n // `warn`. Anything else still warns loudly.\n try {\n const sample = await this.sink.getSample(time);\n if (!sample) return null;\n const frame = sample.toVideoFrame();\n sample.close?.();\n return frame;\n } catch (err) {\n const isTransient = err instanceof DOMException\n && (err.name === 'EncodingError' || err.name === 'NotSupportedError');\n if (isTransient) {\n console.debug('pixi-effects: transient video decode failure at', time, 's —', err.name);\n } else {\n console.warn('pixi-effects: video frame decode failed at', time, 's —', err);\n }\n return null;\n }\n }\n\n private _evictIfNeeded(): void {\n while (this.cache.size > this.capacity) {\n const oldestKey = this.cache.keys().next().value as number | undefined;\n if (oldestKey === undefined) break;\n const oldestFrame = this.cache.get(oldestKey);\n oldestFrame?.close?.();\n this.cache.delete(oldestKey);\n }\n }\n\n dispose(): void {\n for (const f of this.cache.values()) f?.close?.();\n this.cache.clear();\n this._pending.clear();\n }\n}\n","import { Sprite, Texture, Assets } from 'pixi.js';\nimport { Sequence } from './Base';\nimport { FrameCache, type FrameSink } from '../core/FrameCache';\nimport type { VideoSequenceSpec, AudioDescriptor } from '../types';\nimport type { VideoAssetData } from '../core/AssetLoader';\n\nimport type { gsap } from 'gsap';\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\nexport class VideoSequence extends Sequence {\n declare spec: VideoSequenceSpec;\n private _sourceDuration = 0;\n private _audioBuffer: AudioBuffer | null = null;\n private _cache: FrameCache | null = null;\n private _canvas: HTMLCanvasElement | null = null;\n private _ctx: CanvasRenderingContext2D | null = null;\n private _drawSeq = 0;\n\n async build(): Promise<void> {\n const data = await Assets.get<VideoAssetData>(this.spec.asset);\n this._sourceDuration = data.duration;\n this._audioBuffer = (this.spec.audio !== false) ? data.audioBuffer : null;\n this._cache = new FrameCache(data.sink as unknown as FrameSink, { capacity: 30 });\n\n const probeFrame = await this._cache.getFrameAt(0);\n const w = probeFrame?.displayWidth ?? 1920;\n const h = probeFrame?.displayHeight ?? 1080;\n\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n this._canvas = canvas;\n this._ctx = canvas.getContext('2d', { alpha: true });\n if (probeFrame && this._ctx) this._ctx.drawImage(probeFrame, 0, 0);\n\n const texture = Texture.from(canvas);\n const sprite = new Sprite({ texture, label: this.spec.name });\n sprite.cullable = true;\n this.target = sprite;\n this.intrinsicWidth = w;\n this.intrinsicHeight = h;\n\n if (this.duration === undefined) {\n this.duration = this.spec.duration ?? data.duration ?? this.root.duration;\n }\n\n let currentTime = 0;\n const seq = this;\n Object.defineProperty(sprite, 'currentTime', {\n get(): number { return currentTime; },\n set(v: number) {\n currentTime = v;\n const mySeq = ++seq._drawSeq;\n const lookup = seq.spec.loop && seq._sourceDuration > 0 ? v % seq._sourceDuration : v;\n seq._cache!.getFrameAt(lookup).then(frame => {\n if (mySeq !== seq._drawSeq) return;\n if (!frame || !seq._ctx) return;\n seq._ctx.drawImage(frame, 0, 0);\n texture.source.update();\n }).catch((err) => {\n // FrameCache._fetch already swallows decoder errors; this is defense\n // in depth against any failure inside the .then handler (e.g.\n // drawImage on a frame that became invalid mid-draw).\n console.warn('pixi-effects: video frame draw failed:', err);\n });\n },\n });\n\n this.buildFilters();\n }\n\n override bindTimeline(timeline: Timeline): void {\n super.bindTimeline(timeline);\n const playDuration = this.spec.loop\n ? this.duration!\n : Math.min(this.duration!, this._sourceDuration);\n timeline.fromTo(\n this.target!,\n { currentTime: 0 },\n { currentTime: playDuration, duration: playDuration, ease: 'none' },\n this.at,\n );\n }\n\n override collectAudio(out: AudioDescriptor[], baseTime: number): void {\n if (!this._audioBuffer) return;\n const initialVolume = this.spec.volume ?? 1;\n out.push({\n buffer: this._audioBuffer,\n loop: !!this.spec.loop,\n start: baseTime + this.at,\n end: baseTime + this.at + this.duration!,\n initialVolume,\n volumeKeyframes: [],\n });\n }\n\n async awaitFrameAt(time: number): Promise<void> {\n const mySeq = ++this._drawSeq;\n const lookup = this.spec.loop && this._sourceDuration > 0 ? time % this._sourceDuration : time;\n let frame: VideoFrame | null = null;\n try {\n frame = await this._cache!.getFrameAt(lookup);\n } catch (err) {\n // FrameCache should already handle this, but belt-and-suspenders so a\n // sync render path (Movie.gotoFrame) never rejects mid-pipeline.\n console.warn('pixi-effects: awaitFrameAt failed at', time, 's —', err);\n return;\n }\n if (mySeq !== this._drawSeq) return;\n if (frame && this._ctx) {\n try {\n this._ctx.drawImage(frame, 0, 0);\n (this.target as Sprite).texture.source.update();\n } catch (err) {\n console.warn('pixi-effects: drawImage failed at', time, 's —', err);\n }\n }\n }\n\n override destroy(): void {\n this._cache?.dispose();\n this._cache = null;\n super.destroy();\n }\n}\n","import { Graphics, GraphicsPath } from 'pixi.js';\nimport { gsap } from 'gsap';\nimport { Sequence } from './Base';\nimport { evaluateExpr, isExpr } from '../expr/Parser';\nimport { applyKeyframes, applyInitial, resolveAt } from '../core/Timeline';\nimport { type ColorSpace, type ColorInput } from '../expr/colorInterp';\nimport { tweenColor } from '../expr/colorTween';\nimport type { Scope } from '../expr/Scope';\nimport type {\n ShapeSequenceSpec,\n LineShapeSpec, PolygonShapeSpec, PathShapeSpec,\n Props, Keyframe, PropValue,\n} from '../types';\n\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\n// Style + geometry props live on the shape's `_state`, not on the Graphics.\n// The shape redraws every frame from `_state`, so style AND scalar geometry\n// props (width, radius, …) are both keyframable through the same pipeline.\n//\n// Style is uniform across shape kinds; geometry is shape-kind-specific.\n// `LIVE_KEYS` is the union — any key in this set is stripped from the\n// standard transform/keyframe pipeline and routed through `_state` instead.\ntype StyleKey = 'fillColor' | 'fillAlpha' | 'strokeColor' | 'strokeAlpha' | 'strokeWidth';\ntype GeometryKey = 'width' | 'height' | 'cornerRadius' | 'radius' | 'radiusX' | 'radiusY' | 'anchorX' | 'anchorY';\ntype LiveKey = StyleKey | GeometryKey;\n\nconst STYLE_KEYS = ['fillColor', 'fillAlpha', 'strokeColor', 'strokeAlpha', 'strokeWidth'] as const;\nconst COLOR_KEYS = new Set<LiveKey>(['fillColor', 'strokeColor']);\n\n// Per-shape-kind set of geometry keys that are animatable. Array geometry\n// (polygon points, line endpoints, path `d`) isn't animated in v1 — those\n// are baked once at build. `anchorX` / `anchorY` are also animatable —\n// useful for \"morph from left-anchored to centred\" tricks.\nconst GEOMETRY_KEYS_BY_SHAPE: Record<ShapeSequenceSpec['shape'], readonly GeometryKey[]> = {\n rect: ['width', 'height', 'cornerRadius', 'anchorX', 'anchorY'],\n circle: ['radius', 'anchorX', 'anchorY'],\n ellipse: ['radiusX', 'radiusY', 'anchorX', 'anchorY'],\n line: [],\n polygon: [],\n path: [],\n};\n\n// Shape kinds whose geometry is drawn relative to a configurable anchor —\n// they don't need the build-time auto-pivot that user-coord shapes\n// (line / polygon / path) rely on for visual centring.\nconst ANCHORED_SHAPES = new Set<ShapeSequenceSpec['shape']>(['rect', 'circle', 'ellipse']);\n\ninterface ShapeState {\n // style\n fillColor: string | number | undefined;\n fillAlpha: number;\n strokeColor: string | number | undefined;\n strokeAlpha: number;\n strokeWidth: number;\n // geometry (only the relevant subset for the shape kind is non-undefined)\n width?: number;\n height?: number;\n cornerRadius?: number;\n radius?: number;\n radiusX?: number;\n radiusY?: number;\n anchorX?: number;\n anchorY?: number;\n}\n\nexport class ShapeSequence extends Sequence {\n declare spec: ShapeSequenceSpec;\n private _state: ShapeState = {\n fillColor: undefined,\n fillAlpha: 1,\n strokeColor: undefined,\n strokeAlpha: 1,\n strokeWidth: 0,\n };\n // Closure that draws the path commands for this shape kind from the\n // (possibly tweened) `_state`. Bound once at build; called on every frame\n // by `Container.onRender`.\n private _drawGeometry: (g: Graphics) => void = () => {};\n private _liveKeys = new Set<LiveKey>(STYLE_KEYS);\n\n async build(): Promise<void> {\n const graphics = new Graphics({ label: this.spec.name });\n graphics.cullable = true;\n this.target = graphics;\n if (this.duration === undefined) {\n this.duration = this.parent?.duration ?? this.root.duration;\n }\n\n const scope = this.scope();\n const geomKeys = GEOMETRY_KEYS_BY_SHAPE[this.spec.shape];\n for (const k of geomKeys) this._liveKeys.add(k);\n\n // Seed _state with geometry from the spec (resolved against the scope\n // for expression support like `width: 'W * 0.5'`) and the initial style.\n seedGeometry(this._state, this.spec, scope);\n seedStyle(this._state, this.spec.initial ?? {}, scope);\n\n // Build the per-frame draw closure. For symmetric shapes (rect / circle /\n // ellipse) it pulls from _state so geometry tweens take effect; for\n // user-coord shapes (line / polygon / path) the geometry is immutable\n // and resolved once here.\n this._drawGeometry = makeDrawGeometry(this.spec, scope, this._state);\n\n this._drawGeometry(graphics);\n applyState(graphics, this._state);\n\n const bounds = graphics.getLocalBounds();\n this.intrinsicWidth = bounds.width;\n this.intrinsicHeight = bounds.height;\n // Auto-pivot only for user-coord shapes (line / polygon / path) — they\n // need it to compensate for whatever local origin the user picked.\n // Anchored shapes (rect / circle / ellipse) already control their own\n // origin via `anchorX` / `anchorY`; setting pivot here would double-up\n // and surprise the user.\n // A user-supplied initial.pivotX / pivotY overrides this in bindTimeline.\n if (!ANCHORED_SHAPES.has(this.spec.shape)) {\n graphics.pivot.set(bounds.x + bounds.width / 2, bounds.y + bounds.height / 2);\n }\n\n // Per-frame redraw: PIXI v8 `Container.onRender` fires during render, so\n // we read the (possibly tweened) `_state` and re-issue the geometry +\n // fill / stroke. Clearing first is essential because v8 records each\n // .fill()/.stroke() as a separate instruction — without clear() the\n // instruction list grows unbounded.\n graphics.onRender = () => {\n graphics.clear();\n this._drawGeometry(graphics);\n applyState(graphics, this._state);\n };\n\n this.buildFilters();\n }\n\n override bindTimeline(timeline: Timeline, offset = 0): void {\n if (!this.target) return;\n const scope = this.scope();\n // Non-live props go through the standard pipeline (transform, alpha,\n // filter uniforms, …).\n const initial = stripLive(this.spec.initial, this._liveKeys);\n const keyframes = this.spec.keyframes\n ? this.spec.keyframes.map(kf => stripLiveKeyframe(kf, this._liveKeys))\n : undefined;\n applyInitial(this.target, initial as Record<string, unknown> | undefined, scope as unknown as Record<string, number>);\n applyKeyframes(timeline, this.target, keyframes, this.duration!, scope as unknown as Record<string, number>, [], offset);\n\n // Live props (style + scalar geometry) get a parallel set of tweens\n // targeting `_state`. Colour keys (fillColor / strokeColor) interpolate\n // through gsap.utils.interpolate (or OKLab / OKLCH if `colorSpace` is\n // set on the spec); geometry / alpha / width tween linearly through\n // GSAP's standard numeric interpolation.\n const colorSpace: ColorSpace = (this.spec as { colorSpace?: ColorSpace }).colorSpace ?? 'rgb';\n bindLiveKeyframes(timeline, this._state, this._liveKeys, this.spec.keyframes ?? [], this.duration!, scope, offset, colorSpace);\n\n const startTime = offset + this.at;\n const endTime = startTime + this.duration!;\n this.target.renderable = startTime <= 0;\n timeline.set(this.target, { renderable: true }, startTime);\n timeline.set(this.target, { renderable: false }, endTime);\n }\n}\n\n// ─── State seeding ───────────────────────────────────────────────────────\n\nfunction seedGeometry(state: ShapeState, spec: ShapeSequenceSpec, scope: Scope): void {\n const keys = GEOMETRY_KEYS_BY_SHAPE[spec.shape];\n for (const k of keys) {\n const v = (spec as unknown as Record<string, PropValue | undefined>)[k];\n if (v !== undefined) (state as unknown as Record<string, unknown>)[k] = num(v, scope);\n }\n}\n\nfunction seedStyle(state: ShapeState, initial: Props, scope: Scope): void {\n for (const k of STYLE_KEYS) {\n const v = (initial as Record<string, unknown>)[k];\n if (v === undefined) continue;\n (state as unknown as Record<string, unknown>)[k] = COLOR_KEYS.has(k) ? v : numOrZero(v, scope);\n }\n}\n\n// ─── Strip live keys from the spec.initial / spec.keyframes that go to PixiPlugin ──\n\nfunction stripLive(props: Props | undefined, liveKeys: Set<LiveKey>): Props | undefined {\n if (!props) return props;\n const out: Record<string, unknown> = {};\n let changed = false;\n for (const k of Object.keys(props)) {\n if (liveKeys.has(k as LiveKey)) { changed = true; continue; }\n out[k] = (props as Record<string, unknown>)[k];\n }\n return changed ? (out as unknown as Props) : props;\n}\n\nfunction stripLiveKeyframe(kf: Keyframe, liveKeys: Set<LiveKey>): Keyframe {\n return {\n ...kf,\n set: stripLive(kf.set, liveKeys),\n to: stripLive(kf.to, liveKeys),\n from: stripLive(kf.from, liveKeys),\n };\n}\n\nfunction pickLive(props: Props | undefined, liveKeys: Set<LiveKey>): Record<string, unknown> | null {\n if (!props) return null;\n const out: Record<string, unknown> = {};\n let any = false;\n for (const k of Object.keys(props)) {\n if (liveKeys.has(k as LiveKey)) {\n out[k] = (props as Record<string, unknown>)[k];\n any = true;\n }\n }\n return any ? out : null;\n}\n\nfunction resolveLiveValue(key: LiveKey, value: unknown, scope: Scope): unknown {\n if (COLOR_KEYS.has(key)) return value; // colour: pass through as-is\n return numOrZero(value, scope);\n}\n\n// ─── Per-frame redraw ────────────────────────────────────────────────────\n\nfunction applyState(g: Graphics, s: ShapeState): void {\n if (s.fillColor !== undefined) {\n g.fill({ color: s.fillColor, alpha: s.fillAlpha });\n }\n if (s.strokeColor !== undefined && s.strokeWidth > 0) {\n g.stroke({ color: s.strokeColor, alpha: s.strokeAlpha, width: s.strokeWidth });\n }\n}\n\n// ─── drawShape closures (live for symmetric shapes, frozen for the rest) ──\n//\n// The closure returned here is what `Container.onRender` calls every frame.\n// For rect / circle / ellipse it captures a reference to `_state`, so any\n// tween of width / radius / etc. is reflected on the next render.\n// For line / polygon / path the geometry is baked at build time and the\n// closure is constant — they aren't animatable in v1.\n\nfunction drawRectFromState(g: Graphics, s: ShapeState): void {\n const w = s.width ?? 0;\n const h = s.height ?? 0;\n const r = s.cornerRadius ?? 0;\n const ax = s.anchorX ?? 0.5;\n const ay = s.anchorY ?? 0.5;\n // The local origin sits at (anchorX * w, anchorY * h) of the rect.\n // anchorX:0 → left edge at origin (rect grows rightward when w animates).\n // anchorX:0.5 → centred (default).\n // (`0 - x` rather than `-x` to avoid JS's -0 quirk in the ax=0 case.)\n const x = 0 - ax * w;\n const y = 0 - ay * h;\n if (r > 0) g.roundRect(x, y, w, h, r);\n else g.rect(x, y, w, h);\n}\nfunction drawCircleFromState(g: Graphics, s: ShapeState): void {\n const r = s.radius ?? 0;\n const ax = s.anchorX ?? 0.5;\n const ay = s.anchorY ?? 0.5;\n // Anchor on the bbox of the circle: (ax, ay) in [0..1] × bbox (2r × 2r).\n // ax:0 → left edge at origin (centre at +r along x).\n g.circle((0.5 - ax) * 2 * r, (0.5 - ay) * 2 * r, r);\n}\nfunction drawEllipseFromState(g: Graphics, s: ShapeState): void {\n const rx = s.radiusX ?? 0;\n const ry = s.radiusY ?? 0;\n const ax = s.anchorX ?? 0.5;\n const ay = s.anchorY ?? 0.5;\n g.ellipse((0.5 - ax) * 2 * rx, (0.5 - ay) * 2 * ry, rx, ry);\n}\nfunction makeLineDraw(spec: LineShapeSpec, scope: Scope): (g: Graphics) => void {\n const fx = num(spec.from[0], scope);\n const fy = num(spec.from[1], scope);\n const tx = num(spec.to[0], scope);\n const ty = num(spec.to[1], scope);\n return (g: Graphics) => { g.moveTo(fx, fy); g.lineTo(tx, ty); };\n}\nfunction makePolygonDraw(spec: PolygonShapeSpec, scope: Scope): (g: Graphics) => void {\n if (spec.points.length === 0) return () => {};\n const flat: number[] = [];\n for (const [x, y] of spec.points) flat.push(num(x, scope), num(y, scope));\n const closed = !spec.open;\n return (g: Graphics) => { g.poly(flat, closed); };\n}\nfunction makePathDraw(spec: PathShapeSpec): (g: Graphics) => void {\n // GraphicsPath accepts the SVG `d` directly; we apply it as a sub-path\n // so user fill / stroke aren't clobbered by the SVG parser's defaults.\n return (g: Graphics) => { g.path(new GraphicsPath(spec.d)); };\n}\n\nconst STATE_DRAWERS: Partial<Record<ShapeSequenceSpec['shape'], (g: Graphics, s: ShapeState) => void>> = {\n rect: drawRectFromState,\n circle: drawCircleFromState,\n ellipse: drawEllipseFromState,\n};\n\nfunction makeDrawGeometry(spec: ShapeSequenceSpec, scope: Scope, state: ShapeState): (g: Graphics) => void {\n const stateDrawer = STATE_DRAWERS[spec.shape];\n if (stateDrawer) return (g: Graphics) => stateDrawer(g, state);\n switch (spec.shape) {\n case 'line': return makeLineDraw(spec, scope);\n case 'polygon': return makePolygonDraw(spec, scope);\n case 'path': return makePathDraw(spec);\n }\n return () => {};\n}\n\n// ─── Bind keyframes onto _state ──────────────────────────────────────────\n\nfunction bindLiveKeyframes(\n timeline: Timeline,\n state: ShapeState,\n liveKeys: Set<LiveKey>,\n keyframes: Keyframe[],\n parentDuration: number,\n scope: Scope,\n offset: number,\n colorSpace: ColorSpace,\n): void {\n for (const kf of keyframes) {\n const at = offset + resolveAt(kf.at, parentDuration);\n const duration = kf.duration ?? 0;\n const ease = kf.ease ?? 'none';\n\n if (kf.set) {\n const live = pickLive(kf.set, liveKeys);\n if (live) {\n for (const [k, v] of Object.entries(live)) {\n const resolved = resolveLiveValue(k as LiveKey, v, scope);\n timeline.call(() => { (state as unknown as Record<string, unknown>)[k] = resolved; }, [], at);\n }\n }\n }\n\n const fromLive = pickLive(kf.from, liveKeys);\n const toLive = pickLive(kf.to, liveKeys);\n const allKeys = new Set<string>([\n ...(fromLive ? Object.keys(fromLive) : []),\n ...(toLive ? Object.keys(toLive) : []),\n ]);\n for (const k of allKeys) {\n const key = k as LiveKey;\n const fromRaw = fromLive?.[key];\n const toRaw = toLive?.[key];\n // Only resolve `from` when the user actually specified it.\n // Otherwise leave it undefined so the tween captures the live state\n // value WHEN it starts (not at bind time, which would lock every\n // chained keyframe back to the initial value — masking later changes).\n const fromValue = fromRaw !== undefined ? resolveLiveValue(key, fromRaw, scope) : undefined;\n const toValue = toRaw !== undefined ? resolveLiveValue(key, toRaw, scope) : undefined;\n tweenLiveKey(timeline, state, key, fromValue, toValue, duration, ease, at, colorSpace);\n }\n }\n}\n\nfunction tweenLiveKey(\n timeline: Timeline,\n state: ShapeState,\n key: LiveKey,\n fromValue: unknown, // undefined = pick up live state at tween start\n toValue: unknown,\n duration: number,\n ease: string,\n at: number,\n colorSpace: ColorSpace,\n): void {\n if (COLOR_KEYS.has(key) && toValue !== undefined) {\n tweenColor(\n timeline,\n state as unknown as Record<string, unknown>,\n key,\n fromValue as ColorInput | undefined,\n toValue as ColorInput,\n duration, ease, at, colorSpace,\n );\n } else if (toValue !== undefined) {\n // Numeric keys (alpha, width, geometry).\n if (fromValue !== undefined) {\n // Only force a starting value when `from` was explicit on the keyframe.\n timeline.fromTo(state, { [key]: fromValue }, { [key]: toValue, duration, ease }, at);\n } else {\n // Standard `.to()` picks up the live state value at tween start —\n // chains correctly through prior keyframes.\n timeline.to(state, { [key]: toValue, duration, ease }, at);\n }\n }\n}\n\n// ─── helpers ─────────────────────────────────────────────────────────────\n\nfunction num(v: PropValue, scope: Scope): number {\n if (typeof v === 'number') return v;\n if (isExpr(v)) return evaluateExpr(v, scope as unknown as Record<string, number>);\n const parsed = parseFloat(v);\n return Number.isNaN(parsed) ? 0 : parsed;\n}\nfunction numOrZero(v: unknown, scope: Scope): number {\n if (typeof v === 'number') return v;\n if (typeof v === 'string') return num(v, scope);\n return 0;\n}\n","import { ImageSequence } from '../sequences/Image';\nimport { TextSequence } from '../sequences/Text';\nimport { AudioSequence } from '../sequences/Audio';\nimport { VideoSequence } from '../sequences/Video';\nimport { ShapeSequence } from '../sequences/Shape';\nimport type { Sequence } from '../sequences/Base';\nimport type { SequenceSpec, CompositionShape } from '../types';\n\nlet _CompositionSequence: typeof import('../sequences/Composition').CompositionSequence | null = null;\nasync function getCompositionSequence() {\n if (!_CompositionSequence) {\n _CompositionSequence = (await import('../sequences/Composition')).CompositionSequence;\n }\n return _CompositionSequence;\n}\n\ntype SequenceCtor = { new (spec: SequenceSpec, parent: CompositionShape | null, root: CompositionShape): Sequence };\n\nconst staticTypes: Partial<Record<SequenceSpec['type'], SequenceCtor>> = {\n image: ImageSequence as unknown as SequenceCtor,\n text: TextSequence as unknown as SequenceCtor,\n audio: AudioSequence as unknown as SequenceCtor,\n video: VideoSequence as unknown as SequenceCtor,\n shape: ShapeSequence as unknown as SequenceCtor,\n};\n\nexport async function buildSequenceTree(\n specs: SequenceSpec[],\n parent: CompositionShape | null,\n root: CompositionShape,\n): Promise<Sequence[]> {\n const out: Sequence[] = [];\n for (const spec of specs) {\n let Cls: SequenceCtor | undefined = staticTypes[spec.type];\n if (!Cls && spec.type === 'composition') {\n Cls = (await getCompositionSequence()) as unknown as SequenceCtor;\n }\n if (!Cls) {\n console.warn(`pixi-effects: unknown sequence type \"${(spec as { type: string }).type}\"`);\n continue;\n }\n const seq = new Cls(spec, parent, root);\n await seq.build();\n if (seq.duration === undefined) {\n seq.duration = parent?.duration ?? root.duration;\n }\n out.push(seq);\n }\n return out;\n}\n","import { Container, Rectangle } from 'pixi.js';\nimport { Sequence } from './Base';\nimport { buildSequenceTree } from '../core/Composition';\nimport type { CompositionSequenceSpec, AudioDescriptor, CompositionShape, SequenceSpec } from '../types';\n\nimport type { gsap } from 'gsap';\ntype Timeline = ReturnType<typeof gsap.timeline>;\n\nexport class CompositionSequence extends Sequence {\n declare spec: CompositionSequenceSpec;\n private _innerContainer: Container | null = null;\n private _compositionShape: CompositionShape | null = null;\n _children: Sequence[] = [];\n\n async build(): Promise<void> {\n const width = this.spec.width ?? this.parent?.width ?? this.root.width;\n const height = this.spec.height ?? this.parent?.height ?? this.root.height;\n if (this.duration === undefined) {\n this.duration = this.spec.duration ?? this.parent?.duration ?? this.root.duration;\n }\n const wrapper = new Container();\n wrapper.cullable = true;\n wrapper.cullableChildren = true;\n wrapper.cullArea = new Rectangle(0, 0, width, height);\n\n const inner = new Container();\n inner.cullable = true;\n inner.cullableChildren = true;\n wrapper.addChild(inner);\n\n this.target = wrapper;\n this.intrinsicWidth = width;\n this.intrinsicHeight = height;\n this._innerContainer = inner;\n this._compositionShape = { width, height, duration: this.duration };\n\n this._children = await buildSequenceTree(\n this.spec.sequences ?? [],\n this._compositionShape,\n this.root,\n );\n for (const child of this._children) {\n if (child.target) inner.addChild(child.target);\n // If this child has a `mask` spec, build the mask sequence in the same\n // composition shape, add its target to the same parent (so its\n // transforms resolve in the same coord space), and wire PIXI's\n // mask channel. PIXI v8 renders mask containers into the stencil /\n // alpha buffer; they don't render as normal children.\n const maskSpec = (child.spec as { mask?: SequenceSpec }).mask;\n if (maskSpec && child.target) {\n const built = await buildSequenceTree([maskSpec], this._compositionShape, this.root);\n const maskSeq = built[0];\n if (maskSeq?.target) {\n inner.addChild(maskSeq.target);\n // PIXI v8 `setMask` accepts an `inverse` flag — that's how we\n // expose `maskInverted` from the spec. Falls back to plain\n // `target.mask = …` for runtimes that don't have setMask\n // (older PIXI builds).\n const inverse = (child.spec as { maskInverted?: boolean }).maskInverted ?? false;\n const t = child.target as Container & {\n setMask?: (opts: { mask: Container | null; inverse?: boolean }) => void;\n mask: Container | null;\n };\n if (typeof t.setMask === 'function') {\n t.setMask({ mask: maskSeq.target, inverse });\n } else {\n t.mask = maskSeq.target;\n }\n child.maskSequence = maskSeq;\n }\n }\n }\n\n this.buildFilters();\n }\n\n override bindTimeline(timeline: Timeline, offset = 0): void {\n super.bindTimeline(timeline, offset);\n // Children's `at` is relative to this composition's start, so push them\n // forward by our absolute start time on the global timeline.\n const childOffset = offset + this.at;\n for (const child of this._children) {\n child.bindTimeline(timeline, childOffset);\n // The mask shares the maskee's offset — its `at` is interpreted\n // relative to the composition's start, just like the child itself,\n // so a reveal-from-zero animation lines up naturally.\n child.maskSequence?.bindTimeline(timeline, childOffset);\n }\n }\n\n override collectAudio(out: AudioDescriptor[], baseTime: number): void {\n super.collectAudio(out, baseTime);\n const childBase = baseTime + this.at;\n for (const child of this._children) child.collectAudio(out, childBase);\n }\n\n override destroy(): void {\n for (const c of this._children) c.destroy();\n super.destroy();\n }\n}\n","import { Assets, ExtensionType, extensions } from 'pixi.js';\nimport {\n Input, BlobSource, ALL_FORMATS, Output, WavOutputFormat,\n BufferTarget, Conversion, VideoSampleSink,\n} from 'mediabunny';\nimport type { AssetSpec } from '../types';\n\nexport interface AudioAssetData {\n audioBuffer: AudioBuffer;\n duration: number;\n}\n\nexport interface VideoAssetData {\n videoTrack: unknown;\n audioBuffer: AudioBuffer | null;\n videoDuration: number;\n audioDuration: number;\n duration: number;\n sink: InstanceType<typeof VideoSampleSink>;\n}\n\nlet registered = false;\n\nexport function ensureLoadersRegistered(audioContext: AudioContext): void {\n if (registered) return;\n registered = true;\n\n extensions.add({\n extension: { type: ExtensionType.LoadParser, name: 'pixi-effects-audio' },\n test: (url: string) => /\\.(mp3|wav|ogg)$/i.test(url),\n async load(url: string): Promise<AudioAssetData> {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`pixi-effects: failed to load ${url}: ${res.statusText}`);\n const buffer = await res.arrayBuffer();\n const audioBuffer = await audioContext.decodeAudioData(buffer);\n return { audioBuffer, duration: audioBuffer.duration };\n },\n });\n\n extensions.add({\n extension: { type: ExtensionType.LoadParser, name: 'pixi-effects-video', priority: 1 },\n test: (url: string) => /\\.(mp4|webm|mov|mkv)$/i.test(url),\n async load(url: string): Promise<VideoAssetData> {\n const blob = await fetch(url).then(r => r.blob());\n const input = new Input({ source: new BlobSource(blob), formats: ALL_FORMATS });\n const videoTrack = await input.getPrimaryVideoTrack();\n if (!videoTrack || !await videoTrack.canDecode()) {\n throw new Error('pixi-effects: video track cannot be decoded');\n }\n const audioTrack = await input.getPrimaryAudioTrack();\n const videoDuration = await videoTrack.computeDuration();\n const audioDuration = audioTrack ? await audioTrack.computeDuration() : 0;\n\n let audioBuffer: AudioBuffer | null = null;\n if (audioTrack) {\n try {\n const out = new Output({ format: new WavOutputFormat(), target: new BufferTarget() });\n const conv = await Conversion.init({ input, output: out, video: { discard: true } });\n await conv.execute();\n audioBuffer = await audioContext.decodeAudioData((out.target as BufferTarget).buffer as ArrayBuffer);\n } catch (e) {\n console.warn('pixi-effects: audio extraction failed:', e);\n }\n }\n return {\n videoTrack,\n audioBuffer,\n videoDuration,\n audioDuration,\n duration: Math.max(videoDuration, audioDuration),\n sink: new VideoSampleSink(videoTrack as import('mediabunny').InputVideoTrack),\n };\n },\n });\n}\n\nexport async function loadAssetBundle(\n assets: AssetSpec[],\n audioContext: AudioContext,\n): Promise<Record<string, AudioAssetData | VideoAssetData>> {\n ensureLoadersRegistered(audioContext);\n const bundle = assets.map(a => ({ alias: a.name, src: a.src }));\n Assets.addBundle('pixi-effects', bundle);\n return await Assets.loadBundle('pixi-effects');\n}\n","import * as PIXI from 'pixi.js';\nimport { Application, Container, Rectangle, extensions, CullerPlugin } from 'pixi.js';\nimport { gsap } from 'gsap';\nimport { PixiPlugin } from 'gsap/PixiPlugin';\nimport { loadAssetBundle } from './AssetLoader';\nimport { CompositionSequence } from '../sequences/Composition';\nimport { mixdown } from './AudioMixer';\nimport { exportFrames } from './Renderer';\nimport { expandTransitions } from './Transitions';\nimport type { Sequence } from '../sequences/Base';\nimport type {\n AssetSpec, CompositionSpec, CompositionShape, AudioDescriptor,\n} from '../types';\n\nextensions.add(CullerPlugin);\n\ngsap.registerPlugin(PixiPlugin);\nPixiPlugin.registerPIXI(PIXI);\n\nexport interface MovieOptions {\n width?: number;\n height?: number;\n duration?: number;\n frameRate?: number;\n background?: string;\n canvas?: HTMLCanvasElement;\n assets?: AssetSpec[];\n composition?: CompositionSpec;\n}\n\nexport interface RenderOptions {\n format?: 'mp4' | 'mov' | 'webm' | 'mkv';\n video?: { codec?: string; bitrate?: 'very-low' | 'low' | 'medium' | 'high' | 'very-high' };\n audio?: { codec?: string; bitrate?: 'very-low' | 'low' | 'medium' | 'high' | 'very-high' };\n}\n\nexport interface FrameEvent { frame: number; totalFrames: number }\nexport interface ProgressEvent { progress: number; frame: number; totalFrames: number }\n\ntype Listener = (...args: any[]) => void;\n\nexport class Movie {\n private _events: Record<string, Listener[]> = {};\n private _initState: 'idle' | 'pending' | 'ready' | 'destroyed' = 'idle';\n app: Application | null = null;\n timeline: ReturnType<typeof gsap.timeline> | null = null;\n audioBuffer: AudioBuffer | null = null;\n audioSource: AudioBufferSourceNode | null = null;\n gainNode: GainNode | null = null;\n private _volume = 1;\n private _muted = false;\n isPlaying = false;\n currentFrame = 0;\n totalFrames = 0;\n width = 0;\n height = 0;\n duration = 0;\n frameRate = 30;\n background = '#000000';\n private _audioContext: AudioContext | null = null;\n private _rootSequence: Sequence | null = null;\n private _rootContainer: Container | null = null;\n private _raf: number | null = null;\n\n on(event: 'ready', fn: () => void): this;\n on(event: 'frame', fn: (e: FrameEvent) => void): this;\n on(event: 'progress', fn: (e: ProgressEvent) => void): this;\n on(event: 'pause', fn: () => void): this;\n on(event: string, fn: Listener): this {\n (this._events[event] ??= []).push(fn);\n if (event === 'ready' && this._initState === 'ready') {\n try { fn(); } catch (e) { console.warn('pixi-effects: ready listener threw:', e); }\n }\n return this;\n }\n off(event: string, fn: Listener): this {\n const list = this._events[event];\n if (!list) return this;\n const i = list.indexOf(fn);\n if (i > -1) list.splice(i, 1);\n return this;\n }\n emit(event: string, ...args: unknown[]): void {\n for (const fn of this._events[event] ?? []) fn(...args);\n }\n\n get isReady(): boolean { return this._initState === 'ready'; }\n\n private _ensureAudioContext(): AudioContext {\n if (!this._audioContext) {\n const Ctx = (window as unknown as { AudioContext: typeof AudioContext; webkitAudioContext?: typeof AudioContext })\n .AudioContext ?? (window as unknown as { webkitAudioContext: typeof AudioContext }).webkitAudioContext;\n this._audioContext = new Ctx();\n }\n return this._audioContext;\n }\n\n async init(options: MovieOptions = {}): Promise<void> {\n this._initState = 'pending';\n try {\n this.width = options.width ?? 1920;\n this.height = options.height ?? 1080;\n this.duration = options.duration ?? 10;\n this.frameRate = options.frameRate ?? 30;\n this.totalFrames = Math.round(this.duration * this.frameRate);\n this.background = options.background ?? '#000000';\n\n this.timeline = gsap.timeline({ paused: true, defaults: { ease: 'none' } });\n this.timeline.add(gsap.to({}, { duration: this.duration }));\n\n // Try WebGPU first, fall back to WebGL on any init failure. PIXI's\n // autoDetectRenderer only checks `navigator.gpu` existence — it doesn't\n // catch device-init failures (old drivers, GPU lost, hostile origin\n // policies). We wrap and retry so those cases don't break playback.\n const baseAppOptions = {\n width: this.width,\n height: this.height,\n background: this.background,\n antialias: true,\n resolution: 1,\n autoDensity: false,\n preserveDrawingBuffer: true,\n canvas: options.canvas,\n };\n this.app = new Application();\n try {\n await this.app.init({ ...baseAppOptions, preference: 'webgpu' });\n } catch (err) {\n console.warn('pixi-effects: WebGPU init failed, falling back to WebGL —', err);\n // PIXI's Application.init can't be called twice on the same instance,\n // so create a fresh one for the fallback path.\n this.app = new Application();\n await this.app.init({ ...baseAppOptions, preference: 'webgl' });\n }\n\n const root = new Container();\n root.cullable = true;\n root.cullableChildren = true;\n root.cullArea = new Rectangle(0, 0, this.width, this.height);\n this.app.stage.addChild(root);\n this._rootContainer = root;\n\n const audioContext = this._ensureAudioContext();\n await loadAssetBundle(options.assets ?? [], audioContext);\n\n const rootShape: CompositionShape = { width: this.width, height: this.height, duration: this.duration };\n // Inject root dimensions before expanding transitions: the macro\n // expander reads `width` / `height` to compute filter areas, so the\n // values must be present on the spec it sees rather than being merged\n // in below as overrides.\n const seededComposition = options.composition\n ? {\n ...options.composition,\n width: options.composition.width ?? this.width,\n height: options.composition.height ?? this.height,\n duration: options.composition.duration ?? this.duration,\n }\n : undefined;\n const userComposition = seededComposition ? expandTransitions(seededComposition) : undefined;\n const rootSeqSpec = {\n type: 'composition' as const,\n width: this.width,\n height: this.height,\n duration: this.duration,\n ...userComposition,\n };\n const composition = new CompositionSequence(rootSeqSpec, null, rootShape);\n await composition.build();\n this._rootSequence = composition;\n if (composition.target) root.addChild(composition.target);\n composition.bindTimeline(this.timeline);\n\n const audios: AudioDescriptor[] = [];\n composition.collectAudio(audios, 0);\n if (audios.length > 0) {\n this.audioBuffer = await mixdown(audios, this.duration, audioContext.sampleRate);\n }\n\n this.timeline.progress(1).progress(0);\n this.app.renderer.render({ container: this.app.stage });\n\n this._initState = 'ready';\n this.emit('ready');\n } catch (err) {\n try { await this.destroy(); } catch (cleanupErr) {\n console.warn('pixi-effects: cleanup after init failure also threw:', cleanupErr);\n }\n throw err;\n }\n }\n\n async gotoFrame(frame: number, force = false): Promise<void> {\n if (this._initState !== 'ready') return;\n if (!force && this.currentFrame === frame) return;\n this.currentFrame = Math.max(0, Math.min(frame, this.totalFrames));\n this.timeline!.time(this.currentFrame / this.frameRate);\n await this._awaitVideoFrames();\n this.app?.renderer?.render({ container: this.app.stage });\n this.emit('frame', { frame: this.currentFrame, totalFrames: this.totalFrames } satisfies FrameEvent);\n }\n\n private async _awaitVideoFrames(): Promise<void> {\n if (!this._rootSequence) return;\n const collected: VideoLike[] = [];\n collectVideoSequences(this._rootSequence, collected);\n const t = this.currentFrame / this.frameRate;\n await Promise.all(collected.map(v => {\n const local = t - v.at;\n if (local < 0 || local > (v.duration ?? 0)) return Promise.resolve();\n return v.awaitFrameAt(local);\n }));\n }\n\n play(): void {\n if (this._initState !== 'ready') return;\n if (this.currentFrame >= this.totalFrames) this.currentFrame = 0;\n this.isPlaying = true;\n const startTime = performance.now() - (this.currentFrame / this.frameRate * 1000);\n let inFlight = false;\n const tick = (time: number) => {\n if (!this.isPlaying) return;\n if (inFlight) {\n this._raf = requestAnimationFrame(tick);\n return;\n }\n const elapsed = (time - startTime) / 1000;\n const frame = Math.floor(elapsed * this.frameRate);\n if (frame <= this.totalFrames) {\n inFlight = true;\n this.gotoFrame(frame)\n .catch((err) => { console.warn('pixi-effects: gotoFrame failed during playback:', err); })\n .finally(() => { inFlight = false; });\n this._raf = requestAnimationFrame(tick);\n } else {\n this.pause();\n // Final frame — also catch so the play loop never leaves an unhandled rejection.\n this.gotoFrame(this.totalFrames).catch((err) => {\n console.warn('pixi-effects: final gotoFrame failed:', err);\n });\n }\n };\n this._raf = requestAnimationFrame(tick);\n\n if (this.audioBuffer) {\n const ctx = this._ensureAudioContext();\n this.audioSource = ctx.createBufferSource();\n this.audioSource.buffer = this.audioBuffer;\n this.gainNode = ctx.createGain();\n this.gainNode.gain.value = this._muted ? 0 : this._volume;\n this.audioSource.connect(this.gainNode).connect(ctx.destination);\n this.audioSource.start(0, this.currentFrame / this.frameRate);\n }\n }\n\n pause(): void {\n const wasPlaying = this.isPlaying;\n this.isPlaying = false;\n if (this._raf) {\n cancelAnimationFrame(this._raf);\n this._raf = null;\n }\n if (this.audioSource) {\n try { this.audioSource.stop(); } catch { /* ignore */ }\n this.audioSource.disconnect();\n this.audioSource = null;\n }\n if (this.gainNode) {\n this.gainNode.disconnect();\n this.gainNode = null;\n }\n if (wasPlaying) this.emit('pause');\n }\n\n set volume(v: number) {\n this._volume = Math.max(0, Math.min(1, v));\n if (this.gainNode) this.gainNode.gain.value = this._muted ? 0 : this._volume;\n }\n get volume(): number { return this._volume; }\n set muted(v: boolean) {\n this._muted = !!v;\n if (this.gainNode) this.gainNode.gain.value = this._muted ? 0 : this._volume;\n }\n get muted(): boolean { return this._muted; }\n toggleMute(): boolean { this.muted = !this.muted; return this.muted; }\n\n async render(options?: RenderOptions): Promise<Blob> {\n return await exportFrames(this, options);\n }\n\n async destroy(): Promise<void> {\n safeRun(() => this.pause());\n safeRun(() => this._rootSequence?.destroy());\n this._rootSequence = null;\n safeRun(() => this.timeline?.kill());\n this.timeline = null;\n safeRun(() => this.app?.destroy(true, { children: true, texture: true }));\n this.app = null;\n this.audioBuffer = null;\n safeRun(() => this._audioContext?.close().catch(() => {}));\n this._audioContext = null;\n this._initState = 'destroyed';\n }\n}\n\ninterface VideoLike {\n at: number;\n duration: number | undefined;\n awaitFrameAt(t: number): Promise<void>;\n}\n\nfunction safeRun(fn: () => unknown): void {\n try { fn(); } catch (e) { console.warn('pixi-effects: cleanup step threw, continuing:', e); }\n}\n\nfunction collectVideoSequences(seq: Sequence, out: VideoLike[]): void {\n if (typeof (seq as Sequence & Partial<VideoLike>).awaitFrameAt === 'function') {\n out.push(seq as unknown as VideoLike);\n }\n for (const child of (seq as Sequence & { _children?: Sequence[] })._children ?? []) {\n collectVideoSequences(child, out);\n }\n}\n","import type { AudioDescriptor } from '../types';\nexport type { AudioDescriptor };\n\nexport async function mixdown(\n audios: AudioDescriptor[],\n totalDuration: number,\n sampleRate = 44100,\n): Promise<AudioBuffer | null> {\n if (audios.length === 0) return null;\n const ctx = new OfflineAudioContext(2, Math.ceil(sampleRate * totalDuration), sampleRate);\n for (const a of audios) {\n const src = ctx.createBufferSource();\n src.buffer = a.buffer;\n src.loop = !!a.loop;\n const gain = ctx.createGain();\n gain.gain.setValueAtTime(a.initialVolume ?? 1, a.start);\n for (const kf of a.volumeKeyframes ?? []) {\n gain.gain.linearRampToValueAtTime(kf.value, kf.time);\n }\n src.connect(gain).connect(ctx.destination);\n src.start(a.start);\n src.stop(a.end);\n }\n return await ctx.startRendering();\n}\n","import {\n Output, Mp4OutputFormat, MovOutputFormat, WebMOutputFormat, MkvOutputFormat,\n BufferTarget, CanvasSource, AudioBufferSource,\n QUALITY_VERY_LOW, QUALITY_LOW, QUALITY_MEDIUM, QUALITY_HIGH, QUALITY_VERY_HIGH,\n Quality,\n} from 'mediabunny';\nimport type { Movie, RenderOptions } from './Movie';\n\nconst VIDEO_CODEC_BY_FORMAT = {\n mp4: 'avc',\n mov: 'avc',\n webm: 'vp9',\n mkv: 'vp9',\n} as const;\n\nconst AUDIO_CODEC_BY_FORMAT = {\n mp4: 'aac',\n mov: 'aac',\n webm: 'opus',\n mkv: 'opus',\n} as const;\n\nconst qualityMap: Record<string, Quality> = {\n 'very-low': QUALITY_VERY_LOW,\n 'low': QUALITY_LOW,\n 'medium': QUALITY_MEDIUM,\n 'high': QUALITY_HIGH,\n 'very-high': QUALITY_VERY_HIGH,\n};\n\nfunction makeOutputFormat(name: 'mp4' | 'mov' | 'webm' | 'mkv') {\n switch (name) {\n case 'mp4': return new Mp4OutputFormat({ fastStart: 'in-memory' });\n case 'mov': return new MovOutputFormat({ fastStart: 'in-memory' });\n case 'webm': return new WebMOutputFormat();\n case 'mkv': return new MkvOutputFormat();\n }\n}\n\nexport async function exportFrames(movie: Movie, options: RenderOptions = {}): Promise<Blob> {\n const fmt = options.format ?? 'mp4';\n const opts = {\n format: fmt,\n video: {\n codec: options.video?.codec ?? VIDEO_CODEC_BY_FORMAT[fmt],\n bitrate: qualityMap[options.video?.bitrate ?? 'high'] ?? QUALITY_HIGH,\n },\n audio: {\n codec: options.audio?.codec ?? AUDIO_CODEC_BY_FORMAT[fmt],\n bitrate: qualityMap[options.audio?.bitrate ?? 'high'] ?? QUALITY_HIGH,\n },\n };\n\n const output = new Output({\n format: makeOutputFormat(opts.format),\n target: new BufferTarget(),\n });\n const canvasSource = new CanvasSource(movie.app!.canvas as HTMLCanvasElement, {\n codec: opts.video.codec as any,\n bitrate: opts.video.bitrate,\n });\n output.addVideoTrack(canvasSource, { frameRate: movie.frameRate });\n\n if (movie.audioBuffer) {\n const audioSource = new AudioBufferSource({\n codec: opts.audio.codec as any,\n bitrate: opts.audio.bitrate,\n });\n output.addAudioTrack(audioSource);\n await output.start();\n await audioSource.add(movie.audioBuffer);\n await audioSource.close();\n } else {\n await output.start();\n }\n\n movie.app!.ticker.stop();\n // Force a keyframe every ~2 seconds (and at frame 0). Improves seek\n // responsiveness in players without inflating bitrate appreciably.\n const keyframeIntervalFrames = Math.max(1, Math.round(2 * movie.frameRate));\n try {\n for (let frame = 0; frame <= movie.totalFrames; frame++) {\n await movie.gotoFrame(frame, true);\n const isKey = frame === 0 || frame % keyframeIntervalFrames === 0;\n const addOpts = isKey ? { keyFrame: true } : undefined;\n await canvasSource.add(frame / movie.frameRate, 1 / movie.frameRate, addOpts);\n const progress = Math.floor((frame / movie.totalFrames) * 100);\n movie.emit('progress', { progress, frame, totalFrames: movie.totalFrames });\n }\n await canvasSource.close();\n await output.finalize();\n return new Blob([output.target.buffer as ArrayBuffer], { type: output.format.mimeType });\n } finally {\n movie.app!.ticker.start();\n }\n}\n","import type {\n CompositionSpec, CompositionSequenceSpec, SequenceSpec, TransitionSpec,\n CrossfadeTransition, WipeTransition, IrisTransition, SlideTransition,\n DipTransition, ZoomTransition, DissolveTransition,\n Keyframe, FilterSpec,\n} from '../types';\nimport { resolveAt } from './Timeline';\nimport { TransitionMaskFilter, type TransitionMode } from '../filters/TransitionMask';\n\n/**\n * Pure function: validate the composition's `transitions[]` and rewrite the\n * spec by macro-expanding each transition into existing primitives (extra\n * keyframes / filters on the participating sequences). Returns a new spec\n * tree; does NOT mutate the input.\n *\n * Recurses into nested compositions.\n */\nexport function expandTransitions<T extends CompositionSpec | CompositionSequenceSpec>(spec: T): T {\n // Shallow-clone every sequence (and recurse into nested compositions) so we\n // can append keyframes / set initial without touching the user's input spec.\n const out = {\n ...spec,\n sequences: spec.sequences\n ? spec.sequences.map((s) => {\n const cloned: SequenceSpec = {\n ...s,\n // Deep-clone the mutation surfaces only.\n initial: 'initial' in s && s.initial ? { ...s.initial } : undefined,\n // Shallow: Keyframe / FilterSpec elements are shared references.\n // Expansion only pushes new literals — never mutate existing ones.\n keyframes: 'keyframes' in s && s.keyframes ? s.keyframes.slice() : undefined,\n filters: 'filters' in s && s.filters ? s.filters.slice() : undefined,\n } as SequenceSpec;\n if (cloned.type === 'composition') {\n // Nested composition inherits its parent's dimensions when not\n // explicitly set, so expandTransitions can compute filterArea\n // for any wipe / iris transitions inside it.\n const c = cloned as CompositionSequenceSpec;\n if (c.width === undefined) c.width = spec.width;\n if (c.height === undefined) c.height = spec.height;\n return expandTransitions(c);\n }\n return cloned;\n })\n : undefined,\n };\n if (!out.transitions || out.transitions.length === 0) {\n delete (out as { transitions?: unknown }).transitions;\n return out;\n }\n\n const transitions = out.transitions;\n const sequences = out.sequences ?? [];\n const parentDuration = out.duration ?? Infinity;\n const compW = out.width;\n const compH = out.height;\n\n // Pre-pass: any sequence participating in a transition that needs\n // composition-relative geometry gets wrapped in a full-composition-sized\n // wrapper Composition.\n //\n // - mask transitions (wipe / iris / dissolve) need a target whose local\n // coord origin matches the composition's world origin so the filter's\n // canvas-relative math holds.\n // - zoom needs the scale transform to rotate around the composition\n // centre, not the sprite's top-left; the wrapper sits at the centre\n // with pivot at the centre, so scaling stays centred.\n //\n // Wrapping is a no-op for sequences that are already full-size compositions.\n const masksParticipants = new Set<string>();\n for (const t of transitions) {\n if (t.kind === 'wipe' || t.kind === 'iris' || t.kind === 'dissolve' || t.kind === 'zoom') {\n masksParticipants.add(t.from);\n masksParticipants.add(t.to);\n }\n }\n if (masksParticipants.size > 0 && compW !== undefined && compH !== undefined) {\n for (let i = 0; i < sequences.length; i++) {\n const s = sequences[i]!;\n if (!s.name || !masksParticipants.has(s.name)) continue;\n // Reject user-supplied filters using the reserved prefix BEFORE wrapping\n // so the check sees the user's actual filter list, not the wrapper's\n // (clean) one.\n const userFilters = (s as { filters?: FilterSpec[] }).filters;\n if (userFilters) rejectReservedNameCollision(userFilters, s.name);\n sequences[i] = wrapAsFullComposition(s, compW, compH);\n }\n }\n\n // Build a name → { index, sequence } map for O(1) lookup, and detect duplicate names.\n const byName = new Map<string, { index: number; seq: SequenceSpec }>();\n for (let i = 0; i < sequences.length; i++) {\n const s = sequences[i]!;\n if (!s.name) continue;\n if (byName.has(s.name)) {\n throw new Error(`pixi-effects: composition has two sequences named \"${s.name}\" (transitions need unique names)`);\n }\n byName.set(s.name, { index: i, seq: s });\n }\n\n // Track usage so we can detect a sequence being the `from` of two transitions.\n const fromCount = new Map<string, number>();\n const toCount = new Map<string, number>();\n\n for (let i = 0; i < transitions.length; i++) {\n const t = transitions[i]!;\n const tag = `transitions[${i}] (${t.kind})`;\n\n if (t.from === t.to) {\n throw new Error(`pixi-effects: ${tag} cannot transition a sequence to itself (\"${t.from}\")`);\n }\n if (!(t.duration > 0)) {\n throw new Error(`pixi-effects: ${tag} duration must be > 0 (got ${t.duration})`);\n }\n\n const fromEntry = byName.get(t.from);\n if (!fromEntry) {\n throw new Error(`pixi-effects: ${tag} \\`from\\` \"${t.from}\" is not found among sibling sequences`);\n }\n const toEntry = byName.get(t.to);\n if (!toEntry) {\n throw new Error(`pixi-effects: ${tag} \\`to\\` \"${t.to}\" is not found among sibling sequences`);\n }\n\n if (toEntry.index <= fromEntry.index) {\n throw new Error(`pixi-effects: ${tag} \\`to\\` \"${t.to}\" must be declared after \\`from\\` \"${t.from}\" in sibling order`);\n }\n\n const fromUses = (fromCount.get(t.from) ?? 0) + 1;\n fromCount.set(t.from, fromUses);\n if (fromUses > 1) {\n throw new Error(`pixi-effects: ${tag} sequence \"${t.from}\" is used as \\`from\\` in more than one transition`);\n }\n\n const toUses = (toCount.get(t.to) ?? 0) + 1;\n toCount.set(t.to, toUses);\n if (toUses > 1) {\n throw new Error(`pixi-effects: ${tag} sequence \"${t.to}\" is used as \\`to\\` in more than one transition`);\n }\n\n // Time-coverage validation. Negative `at` (\"from the end\") is supported\n // for both the sequences and the transition itself; resolveAt() implements\n // that semantic, matching how `normalizeKeyframe` later resolves `at`\n // when the expansion's keyframes are built.\n const tStart = resolveAt(t.at, parentDuration);\n const tEnd = tStart + t.duration;\n const fromSeq = fromEntry.seq;\n const fromStart = resolveAt(fromSeq.at, parentDuration);\n const fromEnd = fromStart + (fromSeq.duration ?? parentDuration);\n if (tStart < fromStart || tEnd > fromEnd) {\n throw new Error(`pixi-effects: ${tag} window [${tStart}, ${tEnd}] is not covered by \\`from\\` \"${t.from}\" (lives [${fromStart}, ${fromEnd}], so it ends at ${fromEnd})`);\n }\n const toSeq = toEntry.seq;\n const toStart = resolveAt(toSeq.at, parentDuration);\n const toEnd = toStart + (toSeq.duration ?? parentDuration);\n if (tStart < toStart || tEnd > toEnd) {\n throw new Error(`pixi-effects: ${tag} window [${tStart}, ${tEnd}] is not covered by \\`to\\` \"${t.to}\" (lives [${toStart}, ${toEnd}], so it starts at ${toStart})`);\n }\n // Validation passed; expand this transition into existing primitives.\n switch (t.kind) {\n case 'crossfade':\n expandCrossfade(out, t, fromEntry.seq, toEntry.seq);\n break;\n case 'wipe':\n expandMask(out, t, fromEntry.seq, toEntry.seq, i, wipeMode(t.direction), t.smoothing);\n break;\n case 'iris':\n expandMask(out, t, fromEntry.seq, toEntry.seq, i, t.mode === 'out' ? 'iris-out' : 'iris-in', t.smoothing);\n break;\n case 'slide':\n expandSlide(out, t, fromEntry.seq, toEntry.seq);\n break;\n case 'dip':\n expandDip(out, t, fromEntry.seq, toEntry.seq);\n break;\n case 'zoom':\n expandZoom(out, t, fromEntry.seq, toEntry.seq);\n break;\n case 'dissolve':\n expandDissolve(out, t, fromEntry.seq, toEntry.seq, i);\n break;\n }\n }\n\n delete (out as { transitions?: unknown }).transitions;\n return out;\n}\n\n// Wrap an arbitrary sequence in a Composition that fills the parent. The\n// wrapper takes over the sequence's name / at / duration (so the user's\n// transitions DSL still references the right scene), and the original\n// sequence becomes its sole child.\n//\n// The wrapper is positioned so its pivot sits at the composition centre and\n// its world position is the centre too — visually identical to position\n// (0,0) with no pivot, but it lets the zoom macro scale the wrapper around\n// the centre instead of around its top-left corner. Mask filters\n// (wipe / iris / dissolve) are unaffected because their canvas-relative math\n// only depends on the wrapper's *bbox*, which is still (0,0)-(W,H) in world\n// coords either way.\n//\n// If `seq` is already a Composition that fills the parent, no-op.\nfunction wrapAsFullComposition(seq: SequenceSpec, compW: number, compH: number): SequenceSpec {\n // Centering initial: pivot at composition centre + position at composition\n // centre. Visually identity at scale 1, but it lets zoom scale the target\n // around the centre instead of around the top-left corner.\n const centring: Record<string, unknown> = {\n x: compW / 2,\n y: compH / 2,\n pivotX: compW / 2,\n pivotY: compH / 2,\n };\n if (seq.type === 'composition' && seq.width === compW && seq.height === compH) {\n // Already full-canvas. Merge centring into the existing initial — any\n // user-set value (e.g. an explicit x) takes precedence.\n const existing = (seq as { initial?: Record<string, unknown> }).initial;\n (seq as { initial?: Record<string, unknown> }).initial = { ...centring, ...(existing ?? {}) };\n return seq;\n }\n const inner: SequenceSpec = { ...(seq as object) } as SequenceSpec;\n // The inner sequence runs across the whole wrapper lifetime; its name\n // belongs to the wrapper now (so transitions still resolve), and so do\n // its at / duration on the parent timeline.\n delete (inner as { name?: string }).name;\n delete (inner as { at?: number }).at;\n delete (inner as { duration?: number }).duration;\n return {\n type: 'composition',\n name: seq.name,\n at: seq.at,\n duration: seq.duration,\n width: compW,\n height: compH,\n initial: centring,\n sequences: [inner],\n } as SequenceSpec;\n}\n\nfunction ensureKeyframes(seq: SequenceSpec): Keyframe[] {\n // Sequences are loosely typed; treat keyframes as optional.\n const s = seq as { keyframes?: Keyframe[] };\n if (!s.keyframes) s.keyframes = [];\n return s.keyframes;\n}\n\nfunction ensureInitial(seq: SequenceSpec): Record<string, unknown> {\n const s = seq as { initial?: Record<string, unknown> };\n if (!s.initial) s.initial = {};\n return s.initial;\n}\n\nfunction ensureFilters(seq: SequenceSpec): FilterSpec[] {\n const s = seq as { filters?: FilterSpec[] };\n if (!s.filters) s.filters = [];\n return s.filters;\n}\n\nfunction expandCrossfade(\n _comp: CompositionSpec | CompositionSequenceSpec,\n t: CrossfadeTransition,\n fromSeq: SequenceSpec,\n toSeq: SequenceSpec,\n): void {\n const ease = t.ease ?? 'none';\n\n // Outgoing sequence fades to alpha 0 over the window.\n const fromKfs = ensureKeyframes(fromSeq);\n fromKfs.push({ at: t.at, to: { alpha: 0 }, duration: t.duration, ease });\n\n // Incoming sequence starts invisible (initial.alpha = 0). Reject if user\n // already set initial.alpha — that would be a silent override.\n const toInitial = ensureInitial(toSeq);\n if (toInitial.alpha !== undefined && toInitial.alpha !== 0) {\n throw new Error(\n `pixi-effects: crossfade \"${t.from}\"→\"${t.to}\" requires \"${t.to}\" to start invisible, ` +\n `but it already has initial.alpha=${String(toInitial.alpha)}. Remove the manual setting.`,\n );\n }\n toInitial.alpha = 0;\n\n // Fade in.\n const toKfs = ensureKeyframes(toSeq);\n toKfs.push({ at: t.at, to: { alpha: 1 }, duration: t.duration, ease });\n}\n\nfunction wipeMode(direction: WipeTransition['direction']): TransitionMode {\n switch (direction) {\n case 'left': return 'wipe-left';\n case 'right': return 'wipe-right';\n case 'up': return 'wipe-up';\n case 'down': return 'wipe-down';\n }\n}\n\nfunction transitionFilterName(index: number): string {\n return `_pe-transition-${index}`;\n}\n\nfunction expandSlide(\n _comp: CompositionSpec | CompositionSequenceSpec,\n t: SlideTransition,\n fromSeq: SequenceSpec,\n toSeq: SequenceSpec,\n): void {\n const ease = t.ease ?? 'none';\n const isHorizontal = t.direction === 'left' || t.direction === 'right';\n const axis = isHorizontal ? 'x' : 'y';\n const dim = isHorizontal ? 'W' : 'H';\n // sign of A's motion: -1 for left/up, +1 for right/down. B starts on the\n // opposite side (so it can travel through the natural position in the same\n // direction A is leaving).\n const sign = (t.direction === 'left' || t.direction === 'up') ? -1 : 1;\n\n // Outgoing: slide A from its natural position to (natural ± W/H).\n const fromInitial = ensureInitial(fromSeq);\n const fromNatural = fromInitial[axis];\n const fromTarget = composeDimOffset(fromNatural, sign, dim);\n const fromKfs = ensureKeyframes(fromSeq);\n fromKfs.push({ at: t.at, to: { [axis]: fromTarget }, duration: t.duration, ease });\n\n // Incoming: B starts on the opposite side and slides back to its natural\n // position. We preserve the user's existing initial[axis] (if any) as the\n // destination, so a centered sequence stays centered after the slide.\n const toInitial = ensureInitial(toSeq);\n const toNatural = toInitial[axis];\n toInitial[axis] = composeDimOffset(toNatural, -sign, dim);\n const toKfs = ensureKeyframes(toSeq);\n toKfs.push({ at: t.at, to: { [axis]: (toNatural ?? 0) as string | number }, duration: t.duration, ease });\n}\n\n// Compose `natural + sign*dim` as a string expression (or short literal when\n// natural is 0/undefined). `dim` is 'W' or 'H' (parent width/height), `sign`\n// is +1 or -1.\nfunction composeDimOffset(natural: unknown, sign: number, dim: 'W' | 'H'): string {\n const signed = sign === 1 ? dim : `-${dim}`;\n if (natural === undefined || natural === 0) return signed;\n if (typeof natural === 'number') {\n return sign === 1 ? `${natural} + ${dim}` : `${natural} - ${dim}`;\n }\n // String expression: parenthesize to keep precedence intact.\n return sign === 1 ? `(${String(natural)}) + ${dim}` : `(${String(natural)}) - ${dim}`;\n}\n\nfunction expandMask(\n comp: CompositionSpec | CompositionSequenceSpec,\n t: WipeTransition | IrisTransition,\n fromSeq: SequenceSpec,\n toSeq: SequenceSpec,\n transitionIndex: number,\n mode: TransitionMode,\n smoothing: number | undefined,\n): void {\n const ease = t.ease ?? 'none';\n const inName = transitionFilterName(transitionIndex); // on `to`\n const outName = `${transitionFilterName(transitionIndex)}-out`; // on `from`\n const sm = smoothing ?? 0.02;\n\n // Force the filter region to span the WHOLE composition. Without this PIXI\n // would clip the filter to each sprite's bbox, so a wipe / iris on a small\n // text sprite would only ever modify pixels inside the text's bounding box\n // — the cut would appear to land at different canvas positions for sprites\n // of different sizes (the bbox edge becomes the visual edge). With the\n // filter area expanded to the whole composition, the wipe / iris geometry\n // is computed in canvas space and the boundary is consistent across every\n // participating sprite.\n const compW = comp.width ?? 0;\n const compH = comp.height ?? 0;\n const fullArea = { x: 0, y: 0, width: compW, height: compH };\n\n // Incoming (B): soft mask that reveals B as uProgress 0 → 1.\n const toFilters = ensureFilters(toSeq);\n rejectReservedNameCollision(toFilters, toSeq.name);\n toFilters.push({\n type: 'custom',\n name: inName,\n filter: new TransitionMaskFilter({ mode, smoothing: sm, progress: 0 }),\n });\n ensureKeyframes(toSeq).push({\n at: t.at,\n to: { [`filters.${inName}.uProgress`]: 1 },\n duration: t.duration,\n ease,\n });\n (toSeq as { filterArea?: typeof fullArea }).filterArea = fullArea;\n\n // Outgoing (A): inverted mask with a HARD binary cutoff (see TransitionMask\n // shader for the `step(0.99, reveal)` rationale). A stays at alpha=1 across\n // B's smoothstep zone and snaps off only where B fully covers, giving an\n // alpha-correct blend with no background bleed.\n const fromFilters = ensureFilters(fromSeq);\n rejectReservedNameCollision(fromFilters, fromSeq.name);\n fromFilters.push({\n type: 'custom',\n name: outName,\n filter: new TransitionMaskFilter({ mode, smoothing: sm, progress: 0, invert: true }),\n });\n ensureKeyframes(fromSeq).push({\n at: t.at,\n to: { [`filters.${outName}.uProgress`]: 1 },\n duration: t.duration,\n ease,\n });\n (fromSeq as { filterArea?: typeof fullArea }).filterArea = fullArea;\n}\n\nfunction expandDip(\n _comp: CompositionSpec | CompositionSequenceSpec,\n t: DipTransition,\n fromSeq: SequenceSpec,\n toSeq: SequenceSpec,\n): void {\n // A fades to 0 over the first half, B fades from 0 over the second half.\n // The visible color in between is whatever sits behind A and B (canvas\n // background or any persistent layer), so the user can dip-to-black /\n // dip-to-white by setting `background` on Movie.init().\n const ease = t.ease ?? 'none';\n const half = t.duration / 2;\n\n ensureKeyframes(fromSeq).push({\n at: t.at, to: { alpha: 0 }, duration: half, ease,\n });\n\n const toInitial = ensureInitial(toSeq);\n if (toInitial.alpha !== undefined && toInitial.alpha !== 0) {\n throw new Error(\n `pixi-effects: dip \"${t.from}\"→\"${t.to}\" requires \"${t.to}\" to start invisible, ` +\n `but it already has initial.alpha=${String(toInitial.alpha)}. Remove the manual setting.`,\n );\n }\n toInitial.alpha = 0;\n ensureKeyframes(toSeq).push({\n at: t.at + half, to: { alpha: 1 }, duration: half, ease,\n });\n}\n\nfunction expandZoom(\n _comp: CompositionSpec | CompositionSequenceSpec,\n t: ZoomTransition,\n fromSeq: SequenceSpec,\n toSeq: SequenceSpec,\n): void {\n // mode 'in' (default): B is the focus. B starts large + invisible, zooms\n // to scale 1 + alpha 1. A simply fades.\n // mode 'out': A is the focus. A grows large + fades. B simply fades in.\n const ease = t.ease ?? 'none';\n const startScale = t.fromScale ?? 4;\n const mode = t.mode ?? 'in';\n\n if (mode === 'in') {\n ensureKeyframes(fromSeq).push({\n at: t.at, to: { alpha: 0 }, duration: t.duration, ease,\n });\n const toInitial = ensureInitial(toSeq);\n toInitial.alpha = 0;\n toInitial.scale = startScale;\n ensureKeyframes(toSeq).push({\n at: t.at, to: { alpha: 1, scale: 1 }, duration: t.duration, ease,\n });\n } else {\n ensureKeyframes(fromSeq).push({\n at: t.at, to: { alpha: 0, scale: startScale }, duration: t.duration, ease,\n });\n const toInitial = ensureInitial(toSeq);\n toInitial.alpha = 0;\n ensureKeyframes(toSeq).push({\n at: t.at, to: { alpha: 1 }, duration: t.duration, ease,\n });\n }\n}\n\nfunction expandDissolve(\n comp: CompositionSpec | CompositionSequenceSpec,\n t: DissolveTransition,\n fromSeq: SequenceSpec,\n toSeq: SequenceSpec,\n transitionIndex: number,\n): void {\n const ease = t.ease ?? 'none';\n const inName = transitionFilterName(transitionIndex);\n const outName = `${transitionFilterName(transitionIndex)}-out`;\n const sm = t.smoothing ?? 0.05;\n const scale = t.scale ?? 30;\n const seed = t.seed ?? 0;\n const compW = comp.width ?? 0;\n const compH = comp.height ?? 0;\n const fullArea = { x: 0, y: 0, width: compW, height: compH };\n\n // Incoming (B): noise-thresholded reveal, B appears as uProgress 0→1.\n const toFilters = ensureFilters(toSeq);\n rejectReservedNameCollision(toFilters, toSeq.name);\n toFilters.push({\n type: 'custom',\n name: inName,\n filter: new TransitionMaskFilter({ mode: 'dissolve', smoothing: sm, progress: 0, scale, seed }),\n });\n ensureKeyframes(toSeq).push({\n at: t.at,\n to: { [`filters.${inName}.uProgress`]: 1 },\n duration: t.duration,\n ease,\n });\n (toSeq as { filterArea?: typeof fullArea }).filterArea = fullArea;\n\n // Outgoing (A): inverted mask. Same noise pattern (same seed) so the\n // pixel reveal pattern is consistent — pixels A loses are the pixels B\n // reveals at every progress step.\n const fromFilters = ensureFilters(fromSeq);\n rejectReservedNameCollision(fromFilters, fromSeq.name);\n fromFilters.push({\n type: 'custom',\n name: outName,\n filter: new TransitionMaskFilter({ mode: 'dissolve', smoothing: sm, progress: 0, scale, seed, invert: true }),\n });\n ensureKeyframes(fromSeq).push({\n at: t.at,\n to: { [`filters.${outName}.uProgress`]: 1 },\n duration: t.duration,\n ease,\n });\n (fromSeq as { filterArea?: typeof fullArea }).filterArea = fullArea;\n}\n\n// User-supplied filters with the reserved prefix collide with our internal\n// naming and should fail loud. Our own injected names (`_pe-transition-N` /\n// `_pe-transition-N-out`) are tolerated so a sequence can be `to` of one\n// transition and `from` of another.\nconst OWN_NAME_PATTERN = /^_pe-transition-\\d+(-out)?$/;\n\nfunction rejectReservedNameCollision(filters: FilterSpec[], seqName: string | undefined): void {\n for (const f of filters) {\n if (\n typeof f.name === 'string'\n && f.name.startsWith('_pe-transition-')\n && !OWN_NAME_PATTERN.test(f.name)\n ) {\n throw new Error(\n `pixi-effects: sequence \"${seqName}\" already has a filter named \"${f.name}\" — ` +\n `the reserved name prefix \"_pe-transition-\" is for internally generated transition filters`,\n );\n }\n }\n}\n","import { Filter, GlProgram, GpuProgram, UniformGroup, defaultFilterVert } from 'pixi.js';\n\nconst MODE_CODES = {\n 'wipe-left': 0,\n 'wipe-right': 1,\n 'wipe-up': 2,\n 'wipe-down': 3,\n 'iris-in': 4,\n 'iris-out': 5,\n 'dissolve': 6,\n} as const;\n\nexport type TransitionMode = keyof typeof MODE_CODES;\n\nexport interface TransitionMaskOptions {\n mode?: TransitionMode;\n smoothing?: number;\n progress?: number;\n /**\n * If true, the mask is applied as `1 - reveal` so the filter HIDES the\n * sprite as `uProgress` grows from 0 → 1. Used on the outgoing sequence\n * so wipe / iris transitions work for sequences with transparency\n * (otherwise the outgoing sprite's transparent regions would let the\n * incoming sprite's already-revealed pixels show through prematurely).\n */\n invert?: boolean;\n /** Pattern frequency for `dissolve` mode (sample density of the noise). */\n scale?: number;\n /**\n * Pattern offset for `dissolve` mode. The same seed always produces the\n * same dissolve pattern (the noise is deterministic Perlin), so a render\n * is bit-exact reproducible.\n */\n seed?: number;\n}\n\n// ── GLSL fragment (WebGL renderer) ───────────────────────────────────────\nconst GL_FRAGMENT = `\nin vec2 vTextureCoord;\nuniform sampler2D uTexture;\nuniform vec4 uInputSize; // PIXI-bound: xy = sprite render texture size (with padding)\nuniform vec4 uInputClamp; // PIXI-bound: xy = min uv of unpadded content, zw = max uv\nuniform vec4 uOutputFrame; // PIXI-bound: xy = sprite top-left on output, zw = bbox size in px\nuniform vec4 uGlobalFrame; // PIXI-bound: xy = global frame offset, zw = canvas size in px\nuniform float uProgress;\nuniform float uSmoothing;\nuniform float uMode;\nuniform float uInvert;\nuniform float uScale;\nuniform float uSeed;\n\nout vec4 finalColor;\n\n// Classic 2D Perlin noise (Stefan Gustavson). Deterministic — same input\n// always returns the same output, which is what makes the dissolve pattern\n// reproducible across renders.\nvec4 _permute(vec4 x) { return mod(((x * 34.0) + 1.0) * x, 289.0); }\nvec2 _fade(vec2 t) { return t * t * t * (t * (t * 6.0 - 15.0) + 10.0); }\nfloat perlin2(vec2 P) {\n vec4 Pi = floor(P.xyxy) + vec4(0.0, 0.0, 1.0, 1.0);\n vec4 Pf = fract(P.xyxy) - vec4(0.0, 0.0, 1.0, 1.0);\n Pi = mod(Pi, 289.0);\n vec4 ix = Pi.xzxz;\n vec4 iy = Pi.yyww;\n vec4 fx = Pf.xzxz;\n vec4 fy = Pf.yyww;\n vec4 i = _permute(_permute(ix) + iy);\n vec4 gx = 2.0 * fract(i / 41.0) - 1.0;\n vec4 gy = abs(gx) - 0.5;\n vec4 tx = floor(gx + 0.5);\n gx = gx - tx;\n vec2 g00 = vec2(gx.x, gy.x);\n vec2 g10 = vec2(gx.y, gy.y);\n vec2 g01 = vec2(gx.z, gy.z);\n vec2 g11 = vec2(gx.w, gy.w);\n vec4 norm = 1.79284291400159 - 0.85373472095314 * vec4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11));\n g00 *= norm.x; g01 *= norm.y; g10 *= norm.z; g11 *= norm.w;\n float n00 = dot(g00, vec2(fx.x, fy.x));\n float n10 = dot(g10, vec2(fx.y, fy.y));\n float n01 = dot(g01, vec2(fx.z, fy.z));\n float n11 = dot(g11, vec2(fx.w, fy.w));\n vec2 fade_xy = _fade(Pf.xy);\n vec2 n_x = mix(vec2(n00, n01), vec2(n10, n11), fade_xy.x);\n return 2.3 * mix(n_x.x, n_x.y, fade_xy.y);\n}\n\n// Map sprite-local vTextureCoord → canvas-pixel position. We do this in two\n// steps: first un-pad vTextureCoord (it spans 0..bbox/inputSize because the\n// filter target has padding) into a true 0..1 across the bbox, then offset\n// and scale by uOutputFrame to get canvas pixels. Operating in canvas space\n// (rather than sprite-uv space) is what makes the wipe / iris edge land at\n// the same canvas position for sprites of any size: at uProgress=0.25 the\n// wipe edge is at canvas x = 0.75 * canvasW for every sprite, regardless of\n// each sprite's bbox.\nvec2 toCanvasPx(vec2 uv) {\n vec2 bboxUV = (uv - uInputClamp.xy) / (uInputClamp.zw - uInputClamp.xy);\n return uOutputFrame.xy + bboxUV * uOutputFrame.zw;\n}\n\nvec2 toCanvasUV(vec2 uv) {\n return toCanvasPx(uv) / uGlobalFrame.zw;\n}\n\n// Aspect-corrected, corner-normalized distance from canvas center.\n// Returns 0 at canvas center, 1 at the canvas corner — so iris is a true\n// circle in pixel space and p=1 reveals the entire canvas.\nfloat irisDistCanvas(vec2 uv) {\n vec2 px = toCanvasPx(uv);\n vec2 canvasSize = uGlobalFrame.zw;\n vec2 offsetPx = px - canvasSize * 0.5;\n float halfDiag = 0.5 * length(canvasSize);\n return length(offsetPx) / max(halfDiag, 1.0);\n}\n\nfloat wipeReveal(vec2 uv, float p, float s, float mode) {\n // Remap p so the smoothstep edge lies fully outside [0,1] at p=0 / p=1\n // (otherwise smoothstep returns 0.5 at the very edge instead of 0 or 1).\n float ep = p * (1.0 + 2.0 * s) - s;\n vec2 cuv = toCanvasUV(uv);\n if (mode < 0.5) {\n // wipe-left: B reveals from the right edge moving left\n return smoothstep(1.0 - ep - s, 1.0 - ep + s, cuv.x);\n } else if (mode < 1.5) {\n // wipe-right: B reveals from the left edge moving right\n return smoothstep(1.0 - ep - s, 1.0 - ep + s, 1.0 - cuv.x);\n } else if (mode < 2.5) {\n // wipe-up\n return smoothstep(1.0 - ep - s, 1.0 - ep + s, cuv.y);\n } else if (mode < 3.5) {\n // wipe-down: B reveals from the top edge moving down\n return smoothstep(1.0 - ep - s, 1.0 - ep + s, 1.0 - cuv.y);\n } else if (mode < 4.5) {\n // iris-in: circle grows from center\n float d = irisDistCanvas(uv);\n return 1.0 - smoothstep(ep - s, ep + s, d);\n } else if (mode < 5.5) {\n // iris-out: circle shrinks toward center\n float d = irisDistCanvas(uv);\n return smoothstep(ep - s, ep + s, d);\n } else {\n // dissolve: pixel-grain Perlin noise threshold. Pixels with a low noise\n // value reveal first; as p grows, more pixels reveal.\n vec2 sampleUV = cuv * uScale + vec2(uSeed, uSeed * 0.7);\n float n = perlin2(sampleUV) * 0.5 + 0.5; // remap to 0..1\n return 1.0 - smoothstep(ep - s, ep + s, n);\n }\n}\n\nvoid main(void) {\n vec4 raw = texture(uTexture, vTextureCoord);\n float reveal = wipeReveal(vTextureCoord, uProgress, max(uSmoothing, 0.0001), uMode);\n // Inverted mode uses a HARD binary cutoff: A stays at alpha=1 across\n // B's smoothstep zone and snaps off only where B has fully revealed.\n if (uInvert > 0.5) reveal = 1.0 - step(0.99, reveal);\n finalColor = raw * reveal;\n}\n`;\n\n// ── WGSL combined source (WebGPU renderer) ───────────────────────────────\nconst WGSL_SOURCE = `\nstruct GlobalFilterUniforms {\n uInputSize: vec4<f32>,\n uInputPixel: vec4<f32>,\n uInputClamp: vec4<f32>,\n uOutputFrame: vec4<f32>,\n uGlobalFrame: vec4<f32>,\n uOutputTexture: vec4<f32>,\n};\n\nstruct TransitionUniforms {\n uProgress: f32,\n uMode: f32,\n uSmoothing: f32,\n uInvert: f32,\n uScale: f32,\n uSeed: f32,\n};\n\n@group(0) @binding(0) var<uniform> gfu: GlobalFilterUniforms;\n@group(0) @binding(1) var uTexture: texture_2d<f32>;\n@group(0) @binding(2) var uSampler : sampler;\n@group(1) @binding(0) var<uniform> transitionUniforms : TransitionUniforms;\n\nstruct VSOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\nfn filterVertexPosition(aPosition : vec2<f32>) -> vec4<f32> {\n var position = aPosition * gfu.uOutputFrame.zw + gfu.uOutputFrame.xy;\n position.x = position.x * (2.0 / gfu.uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * gfu.uOutputTexture.z / gfu.uOutputTexture.y) - gfu.uOutputTexture.z;\n return vec4<f32>(position, 0.0, 1.0);\n}\n\nfn filterTextureCoord(aPosition : vec2<f32>) -> vec2<f32> {\n return aPosition * (gfu.uOutputFrame.zw * gfu.uInputSize.zw);\n}\n\n// NOTE on whitespace: PIXI v8's WGSL attribute extractor is regex-based and\n// expects the noise/blur reference format — multi-line param list + space\n// before the colon. A compact one-liner with no space before the colon parses\n// as having NO vertex attributes, which then causes a \"Vertex attribute slot 0\n// not present in the VertexState\" pipeline validation error.\n@vertex\nfn mainVertex(\n @location(0) aPosition : vec2<f32>,\n) -> VSOutput {\n return VSOutput(filterVertexPosition(aPosition), filterTextureCoord(aPosition));\n}\n\n// Aspect-corrected, corner-normalized distance from sprite center.\n// Map sprite-local uv → canvas-pixel position (see GLSL note).\nfn toCanvasPx(uv: vec2<f32>) -> vec2<f32> {\n let bboxUV = (uv - gfu.uInputClamp.xy) / (gfu.uInputClamp.zw - gfu.uInputClamp.xy);\n return gfu.uOutputFrame.xy + bboxUV * gfu.uOutputFrame.zw;\n}\n\nfn toCanvasUV(uv: vec2<f32>) -> vec2<f32> {\n return toCanvasPx(uv) / gfu.uGlobalFrame.zw;\n}\n\nfn irisDistCanvas(uv: vec2<f32>) -> f32 {\n let px = toCanvasPx(uv);\n let canvasSize = gfu.uGlobalFrame.zw;\n let offsetPx = px - canvasSize * 0.5;\n let halfDiag = 0.5 * length(canvasSize);\n return length(offsetPx) / max(halfDiag, 1.0);\n}\n\n// Classic 2D Perlin noise (Stefan Gustavson). Deterministic — same input\n// always returns the same output, so the dissolve pattern is reproducible.\nfn _wgsl_permute(x: vec4<f32>) -> vec4<f32> { return ((x * 34.0) + 1.0) * x % vec4<f32>(289.0); }\nfn _wgsl_fade(t: vec2<f32>) -> vec2<f32> { return t * t * t * (t * (t * 6.0 - 15.0) + 10.0); }\nfn perlin2(P: vec2<f32>) -> f32 {\n var Pi: vec4<f32> = floor(vec4<f32>(P, P)) + vec4<f32>(0.0, 0.0, 1.0, 1.0);\n var Pf: vec4<f32> = fract(vec4<f32>(P, P)) - vec4<f32>(0.0, 0.0, 1.0, 1.0);\n Pi = Pi % vec4<f32>(289.0);\n let ix = vec4<f32>(Pi.x, Pi.z, Pi.x, Pi.z);\n let iy = vec4<f32>(Pi.y, Pi.y, Pi.w, Pi.w);\n let fx = vec4<f32>(Pf.x, Pf.z, Pf.x, Pf.z);\n let fy = vec4<f32>(Pf.y, Pf.y, Pf.w, Pf.w);\n let i = _wgsl_permute(_wgsl_permute(ix) + iy);\n var gx = 2.0 * fract(i / 41.0) - 1.0;\n let gy = abs(gx) - 0.5;\n let tx = floor(gx + 0.5);\n gx = gx - tx;\n var g00 = vec2<f32>(gx.x, gy.x);\n var g10 = vec2<f32>(gx.y, gy.y);\n var g01 = vec2<f32>(gx.z, gy.z);\n var g11 = vec2<f32>(gx.w, gy.w);\n let norm = 1.79284291400159 - 0.85373472095314 * vec4<f32>(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11));\n g00 = g00 * norm.x; g01 = g01 * norm.y; g10 = g10 * norm.z; g11 = g11 * norm.w;\n let n00 = dot(g00, vec2<f32>(fx.x, fy.x));\n let n10 = dot(g10, vec2<f32>(fx.y, fy.y));\n let n01 = dot(g01, vec2<f32>(fx.z, fy.z));\n let n11 = dot(g11, vec2<f32>(fx.w, fy.w));\n let fade_xy = _wgsl_fade(vec2<f32>(Pf.x, Pf.y));\n let n_x = mix(vec2<f32>(n00, n01), vec2<f32>(n10, n11), vec2<f32>(fade_xy.x));\n return 2.3 * mix(n_x.x, n_x.y, fade_xy.y);\n}\n\nfn wipeReveal(uv: vec2<f32>, p: f32, s: f32, mode: f32) -> f32 {\n let ep = p * (1.0 + 2.0 * s) - s;\n let cuv = toCanvasUV(uv);\n if (mode < 0.5) {\n return smoothstep(1.0 - ep - s, 1.0 - ep + s, cuv.x);\n } else if (mode < 1.5) {\n // wipe-right: B reveals from the left edge moving right\n return smoothstep(1.0 - ep - s, 1.0 - ep + s, 1.0 - cuv.x);\n } else if (mode < 2.5) {\n return smoothstep(1.0 - ep - s, 1.0 - ep + s, cuv.y);\n } else if (mode < 3.5) {\n // wipe-down: B reveals from the top edge moving down\n return smoothstep(1.0 - ep - s, 1.0 - ep + s, 1.0 - cuv.y);\n } else if (mode < 4.5) {\n let d = irisDistCanvas(uv);\n return 1.0 - smoothstep(ep - s, ep + s, d);\n } else if (mode < 5.5) {\n let d = irisDistCanvas(uv);\n return smoothstep(ep - s, ep + s, d);\n } else {\n let sampleUV = cuv * transitionUniforms.uScale + vec2<f32>(transitionUniforms.uSeed, transitionUniforms.uSeed * 0.7);\n let n = perlin2(sampleUV) * 0.5 + 0.5;\n return 1.0 - smoothstep(ep - s, ep + s, n);\n }\n}\n\n@fragment\nfn mainFragment(@location(0) uv : vec2<f32>) -> @location(0) vec4<f32> {\n let raw = textureSample(uTexture, uSampler, uv);\n var reveal = wipeReveal(uv, transitionUniforms.uProgress, max(transitionUniforms.uSmoothing, 0.0001), transitionUniforms.uMode);\n if (transitionUniforms.uInvert > 0.5) { reveal = 1.0 - step(0.99, reveal); }\n return raw * reveal;\n}\n`;\n\nexport class TransitionMaskFilter extends Filter {\n constructor(options: TransitionMaskOptions = {}) {\n const mode = options.mode ?? 'wipe-left';\n const smoothing = options.smoothing ?? 0.02;\n const progress = options.progress ?? 0;\n const invert = options.invert ?? false;\n const scale = options.scale ?? 30;\n const seed = options.seed ?? 0;\n\n super({\n glProgram: GlProgram.from({\n vertex: defaultFilterVert,\n fragment: GL_FRAGMENT,\n name: 'transition-mask-filter',\n }),\n gpuProgram: GpuProgram.from({\n vertex: { source: WGSL_SOURCE, entryPoint: 'mainVertex' },\n fragment: { source: WGSL_SOURCE, entryPoint: 'mainFragment' },\n }),\n resources: {\n transitionUniforms: new UniformGroup({\n uProgress: { value: progress, type: 'f32' },\n uMode: { value: MODE_CODES[mode], type: 'f32' },\n uSmoothing: { value: smoothing, type: 'f32' },\n uInvert: { value: invert ? 1 : 0, type: 'f32' },\n uScale: { value: scale, type: 'f32' },\n uSeed: { value: seed, type: 'f32' },\n }),\n },\n });\n }\n\n get uProgress(): number { return this.resources.transitionUniforms.uniforms.uProgress as number; }\n set uProgress(v: number) { this.resources.transitionUniforms.uniforms.uProgress = v; }\n get uMode(): number { return this.resources.transitionUniforms.uniforms.uMode as number; }\n set uMode(v: number) { this.resources.transitionUniforms.uniforms.uMode = v; }\n get uSmoothing(): number { return this.resources.transitionUniforms.uniforms.uSmoothing as number; }\n set uSmoothing(v: number) { this.resources.transitionUniforms.uniforms.uSmoothing = v; }\n get uInvert(): number { return this.resources.transitionUniforms.uniforms.uInvert as number; }\n set uInvert(v: number) { this.resources.transitionUniforms.uniforms.uInvert = v; }\n get uScale(): number { return this.resources.transitionUniforms.uniforms.uScale as number; }\n set uScale(v: number) { this.resources.transitionUniforms.uniforms.uScale = v; }\n get uSeed(): number { return this.resources.transitionUniforms.uniforms.uSeed as number; }\n set uSeed(v: number) { this.resources.transitionUniforms.uniforms.uSeed = v; }\n}\n","import type { ImageSequenceSpec, Props } from '../types';\n\n/**\n * Ken Burns preset for a single image. Returns an `ImageSequenceSpec` ready\n * to drop into a composition's `sequences[]`.\n *\n * Four motion modes:\n * - `still` : just sit at the canvas centre, fitted but unanimated.\n * - `scale` : zoom in or out around an arbitrary 9-point pivot.\n * - `rotation` : gentle rotation while keeping the image filling the\n * canvas (the scale is over-set so even at the steepest\n * rotation the bounding box still covers).\n * - `position` : pan the image between two points within its over-scaled\n * bounds (corner-to-corner by default).\n *\n * The image fits the canvas by `cover` (default) or `contain` — both\n * computed at runtime from the texture's intrinsic size, so you don't pass\n * `imageWidth` / `imageHeight`. Position keyframes assume the image is\n * anchored at its centre (anchor 0.5/0.5).\n *\n * Note: this preset emits no fade keyframes; pair it with `crossfade` /\n * `dip` / etc. transitions to chain images.\n */\nexport type KenBurnsOptions =\n & KenBurnsBase\n & (\n | { motion: 'still' }\n | KenBurnsScale\n | KenBurnsRotation\n | KenBurnsPosition\n );\n\ninterface KenBurnsBase {\n /** Image asset name (registered via `Movie.init({ assets })`). */\n asset: string;\n /** Optional sequence name for transitions / addressing. */\n name?: string;\n /** Start time in seconds (parent-relative). */\n at?: number;\n /** Length of the animation in seconds. Required. */\n duration: number;\n /** How the image fills the canvas. Default `'cover'`. */\n fit?: 'cover' | 'contain';\n /** GSAP easing name. Default `'sine.inOut'`. */\n ease?: string;\n}\n\ninterface KenBurnsScale {\n motion: 'scale';\n /**\n * Pivot point inside the image, in [0..1] coords. The pivot stays pinned\n * to the canvas while the rest of the image zooms around it. Default\n * `[0.5, 0.5]` (centre). The original Yajima-Motion convention uses the\n * 9-point grid `0.25 / 0.5 / 0.75`.\n */\n origin?: [number, number];\n /** Zoom factor relative to the fitted base. Default 1.15. */\n zoom?: number;\n /** `'in'`: 1 → zoom (default). `'out'`: zoom → 1. */\n direction?: 'in' | 'out';\n}\n\ninterface KenBurnsRotation {\n motion: 'rotation';\n /** Total rotation in degrees. Default 8. Capped at 30. */\n angle?: number;\n /** `'cw'`: 0 → +angle (default). `'ccw'`: 0 → -angle. Either way it pivots through 0. */\n direction?: 'cw' | 'ccw' | 'through';\n}\n\ninterface KenBurnsPosition {\n motion: 'position';\n /**\n * Pan start/end in [0..1] of the over-scaled bounds. `[0, 0]` = look at\n * top-left, `[1, 1]` = look at bottom-right. Defaults to diagonal\n * `[0.25, 0.25]` → `[0.75, 0.75]` (matches the Yajima-Motion preset).\n */\n from?: [number, number];\n to?: [number, number];\n /** Over-scale factor. Must be > 1 for any pan to be visible. Default 1.15. */\n zoom?: number;\n}\n\nexport function kenBurns(opts: KenBurnsOptions): ImageSequenceSpec {\n const {\n asset, name, at, duration,\n fit = 'cover',\n ease = 'sine.inOut',\n } = opts;\n const baseScale = fit; // expression: 'cover' | 'contain' (scope variables)\n // Keyframe `at` is interpreted PARENT-relative by the runtime (the same\n // convention transitions use). So every keyframe time we emit must be\n // offset by the sequence's own `at` to land within its lifespan.\n const baseAt = at ?? 0;\n\n let initial: Props;\n let keyframes: ImageSequenceSpec['keyframes'];\n\n if (opts.motion === 'still') {\n initial = {\n x: 'W/2', y: 'H/2',\n anchorX: 0.5, anchorY: 0.5,\n scale: baseScale,\n };\n keyframes = [];\n } else if (opts.motion === 'scale') {\n const origin = opts.origin ?? [0.5, 0.5];\n const zoom = opts.zoom ?? 1.15;\n const direction = opts.direction ?? 'in';\n const fromZ = direction === 'in' ? 1 : zoom;\n const toZ = direction === 'in' ? zoom : 1;\n\n // Pivot at the chosen image-relative origin. The pivot point stays\n // pinned at world (x, y); everything else zooms around it.\n const pivotXExpr = `w * ${origin[0]}`;\n const pivotYExpr = `h * ${origin[1]}`;\n // x positions the pivot so the IMAGE CENTRE lands at the canvas centre\n // at the initial scale. (As scale animates, the centre drifts away\n // from the pivot — that's the focal-point behaviour.)\n const initialScale = `${baseScale} * ${fromZ}`;\n const xExpr = `W/2 - (${baseScale}) * ${fromZ} * w * ${0.5 - origin[0]}`;\n const yExpr = `H/2 - (${baseScale}) * ${fromZ} * h * ${0.5 - origin[1]}`;\n initial = {\n x: xExpr, y: yExpr,\n pivotX: pivotXExpr, pivotY: pivotYExpr,\n scale: initialScale,\n };\n keyframes = [\n { at: baseAt, to: { scale: `${baseScale} * ${toZ}` }, duration, ease },\n ];\n } else if (opts.motion === 'rotation') {\n const angle = clamp(opts.angle ?? 8, 0, 30);\n const direction = opts.direction ?? 'cw';\n const startAngle = direction === 'cw' ? 0 : direction === 'ccw' ? 0 : -angle / 2;\n const endAngle = direction === 'cw' ? +angle : direction === 'ccw' ? -angle : +angle / 2;\n\n // Critical: the image must cover the canvas at *every* angle along the\n // rotation, never just the start / end. For a centred image of intrinsic\n // size (w, h) scaled by `scale` and rotated by θ, the worst-case canvas\n // corner sits at distance (W*|cosθ| + H*|sinθ|) / 2 along the image's\n // local x-axis and (W*|sinθ| + H*|cosθ|) / 2 along its local y-axis. The\n // rotated image then covers the canvas iff:\n //\n // w*scale >= W*|cosθ| + H*|sinθ| and\n // h*scale >= W*|sinθ| + H*|cosθ|\n //\n // We sample 1° apart and emit one keyframe per sample so gsap interpolates\n // rotation AND scale together — never a gap, never an over-scale.\n const sampleStep = 1; // degrees\n const span = Math.abs(endAngle - startAngle);\n const sampleCount = Math.max(2, Math.ceil(span / sampleStep) + 1);\n\n const scaleAt = (deg: number): string => {\n const θ = (Math.abs(deg) * Math.PI) / 180;\n const c = Math.cos(θ);\n const s = Math.sin(θ);\n return `max(${baseScale}, max((W*${c} + H*${s}) / w, (W*${s} + H*${c}) / h))`;\n };\n\n initial = {\n x: 'W/2', y: 'H/2',\n pivotX: 'w * 0.5', pivotY: 'h * 0.5',\n scale: scaleAt(startAngle),\n rotation: startAngle,\n };\n // Build sampled keyframes: each step animates from the previous (rotation,\n // scale) to the next pair. gsap linearly interpolates between samples;\n // with 1° spacing the interpolation error in scale is sub-pixel.\n keyframes = [];\n for (let i = 1; i < sampleCount; i++) {\n const tFrac = i / (sampleCount - 1);\n const angleHere = startAngle + (endAngle - startAngle) * tFrac;\n const tHere = duration * tFrac;\n // segment goes from previous time to this time\n const tPrev = duration * ((i - 1) / (sampleCount - 1));\n keyframes.push({\n at: baseAt + tPrev,\n to: { rotation: angleHere, scale: scaleAt(angleHere) },\n duration: tHere - tPrev,\n ease: i === 1 ? ease : 'none',\n });\n }\n } else {\n // motion === 'position'\n const from = opts.from ?? [0.25, 0.25];\n const to = opts.to ?? [0.75, 0.75];\n const zoom = opts.zoom ?? 1.15;\n // Over-scaled scale. The pivot is at image centre so x/y move the centre.\n const scaleExpr = `(${baseScale}) * ${zoom}`;\n // x at panX = W/2 + (0.5 - panX) * (w * scale - W).\n // (Verified: panX=0 → image's left edge at canvas left. panX=1 → right edge at right.)\n const xExpr = (panX: number) => `W/2 + (${0.5 - panX}) * (w * (${baseScale}) * ${zoom} - W)`;\n const yExpr = (panY: number) => `H/2 + (${0.5 - panY}) * (h * (${baseScale}) * ${zoom} - H)`;\n initial = {\n x: xExpr(from[0]), y: yExpr(from[1]),\n pivotX: 'w * 0.5', pivotY: 'h * 0.5',\n scale: scaleExpr,\n };\n keyframes = [\n { at: baseAt, to: { x: xExpr(to[0]), y: yExpr(to[1]) }, duration, ease },\n ];\n }\n\n const spec: ImageSequenceSpec = {\n type: 'image',\n asset,\n duration,\n initial,\n keyframes,\n };\n if (name !== undefined) spec.name = name;\n if (at !== undefined) spec.at = at;\n return spec;\n}\n\nfunction clamp(v: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, v));\n}\n"]}
|