pixi-effects 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +15 -5
  3. package/ai/SKILL.md +44 -0
  4. package/ai/reference/cheatsheet.md +120 -0
  5. package/ai/reference/pitfalls.md +54 -0
  6. package/ai/reference/recipes.md +375 -0
  7. package/ai/template.html +82 -0
  8. package/ai/tools/save-image.py +24 -0
  9. package/dist/{Base-B1Tdn0Cv.d.cts → Base-BDw6dKRB.d.cts} +1 -1
  10. package/dist/{Base-Bh_VSusi.d.ts → Base-Ba4Ta4ap.d.ts} +1 -1
  11. package/dist/Composition-6FDH5OPM.cjs +13 -0
  12. package/dist/{Composition-BI5HZJFL.cjs.map → Composition-6FDH5OPM.cjs.map} +1 -1
  13. package/dist/Composition-FEYAUMFI.js +4 -0
  14. package/dist/{Composition-IO7ZN32J.js.map → Composition-FEYAUMFI.js.map} +1 -1
  15. package/dist/Controller.d.cts +2 -2
  16. package/dist/Controller.d.ts +2 -2
  17. package/dist/Movie-DMpaT67V.d.ts +179 -0
  18. package/dist/Movie-W8ISiEBB.d.cts +179 -0
  19. package/dist/{chunk-H55V3U56.js → chunk-DIJG2RSF.js} +28 -11
  20. package/dist/chunk-DIJG2RSF.js.map +1 -0
  21. package/dist/{chunk-VJCDG6YG.js → chunk-PN5A6QA7.js} +248 -64
  22. package/dist/chunk-PN5A6QA7.js.map +1 -0
  23. package/dist/{chunk-7OIWYXGV.cjs → chunk-SIRVULFF.cjs} +251 -62
  24. package/dist/chunk-SIRVULFF.cjs.map +1 -0
  25. package/dist/{chunk-64IHCYYN.cjs → chunk-ZL262ZRM.cjs} +37 -20
  26. package/dist/chunk-ZL262ZRM.cjs.map +1 -0
  27. package/dist/index.cjs +324 -24
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.d.cts +61 -31
  30. package/dist/index.d.ts +61 -31
  31. package/dist/index.js +321 -22
  32. package/dist/index.js.map +1 -1
  33. package/dist/three.cjs +5 -5
  34. package/dist/three.d.cts +2 -2
  35. package/dist/three.d.ts +2 -2
  36. package/dist/three.js +1 -1
  37. package/dist/{types-CNBilhpz.d.cts → types-3c8Vymgw.d.cts} +53 -6
  38. package/dist/{types-CNBilhpz.d.ts → types-3c8Vymgw.d.ts} +53 -6
  39. package/docs/api.md +333 -0
  40. package/docs/dsl.md +1017 -0
  41. package/llms-full.txt +1966 -0
  42. package/llms.txt +30 -0
  43. package/package.json +4 -3
  44. package/dist/Composition-BI5HZJFL.cjs +0 -13
  45. package/dist/Composition-IO7ZN32J.js +0 -4
  46. package/dist/Movie-CcR6h2jO.d.cts +0 -82
  47. package/dist/Movie-D-n8glA6.d.ts +0 -82
  48. package/dist/chunk-64IHCYYN.cjs.map +0 -1
  49. package/dist/chunk-7OIWYXGV.cjs.map +0 -1
  50. package/dist/chunk-H55V3U56.js.map +0 -1
  51. package/dist/chunk-VJCDG6YG.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/AssetLoader.ts","../src/core/AudioMixer.ts","../src/core/Renderer.ts","../src/filters/TransitionMask.ts","../src/core/Transitions.ts","../src/core/Movie.ts","../src/presets/kenBurns.ts","../src/transforms/withFade.ts"],"names":["Output","BufferTarget","extensions"],"mappings":"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","file":"index.js","sourcesContent":["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 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 { 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 {\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 // threeD participants get wrapped in a 2D full-size composition below, which\n // would silently drop the camera and their depth group — say so.\n const threeDByName = new Set(sequences.filter(s => s.name && s.threeD).map(s => s.name as string));\n transitions.forEach((t, i) => {\n for (const name of [t.from, t.to]) {\n if (threeDByName.has(name)) {\n console.warn(`pixi-effects: transitions[${i}]: \"${name}\" is threeD, but transitions are not supported on threeD layers yet — it will render without the camera`);\n }\n }\n });\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 * 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 await this._awaitVideoFrames();\n this._updateSpace();\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._updateSpace();\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.absoluteStart ?? v.at);\n if (local < 0 || local > (v.duration ?? 0)) return Promise.resolve();\n return v.awaitFrameAt(local);\n }));\n }\n\n /** Projects every `threeD` layer for the current frame (see src/space). */\n private _updateSpace(): void {\n if (!this._rootSequence || !this.app) return;\n this._rootSequence.updateSpace(this.currentFrame / this.frameRate, this.app.renderer);\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 absoluteStart?: number | null;\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\n/**\n * Exported for tests/internal use only — not part of the public API.\n * Walks a sequence tree (including mask sequences) collecting any node\n * that exposes `awaitFrameAt`, so Movie can await frame-driven sequences\n * (video, three) wherever they appear, including inside masks.\n */\nexport function 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 if (seq.maskSequence) collectVideoSequences(seq.maskSequence, out);\n for (const child of (seq as Sequence & { _children?: Sequence[] })._children ?? []) {\n collectVideoSequences(child, out);\n }\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) = (ox*W, oy*H) — the focal point on the\n // canvas matches the origin's image-relative position.\n //\n // This is the only constant pivot position that keeps the image\n // covering the canvas at every scale s ≥ baseScale, for any\n // origin in [0,1]². Coverage requires:\n // W - w·(1-ox)·s ≤ x ≤ w·ox·s\n // At s = baseScale = max(W/w, H/h) the inequalities collapse to a\n // single point x = ox·W (and y = oy·H), so any pivot that doesn't\n // sit there will expose a canvas edge once the animation reaches\n // baseScale. For s > baseScale the range widens and ox·W stays\n // within it, so the same constant pivot works throughout.\n const pivotXExpr = `w * ${origin[0]}`;\n const pivotYExpr = `h * ${origin[1]}`;\n const initialScale = `${baseScale} * ${fromZ}`;\n const xExpr = `W * ${origin[0]}`;\n const yExpr = `H * ${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","import type { SequenceCommon, Keyframe } from '../types';\n\nexport interface WithFadeOptions {\n /** Fade-in duration (seconds), anchored to the sequence's `at`. */\n in?: number;\n /** Fade-out duration (seconds), anchored to `at + duration`. Requires `duration` to be set on the spec. */\n out?: number;\n}\n\n/**\n * Add alpha fade-in / fade-out keyframes to a sequence spec. Mutates and\n * returns the spec so the result can be dropped straight into `sequences[]`.\n *\n * ```ts\n * sequences: [\n * withFade(\n * kenBurns({ asset: 'p', at: 0, duration: 6, motion: 'scale' }),\n * { in: 0.5, out: 0.5 },\n * ),\n *\n * withFade(\n * { type: 'text', text: 'hi', at: 5, duration: 3, initial: { x: 'GW/2' } },\n * { in: 0.4 },\n * ),\n * ]\n * ```\n *\n * The added keyframes are layered on top of any keyframes the spec already\n * has — kenBurns's scale / position / rotation tweens keep working.\n *\n * The keyframe `at` values use the sequence's own `at` and `at + duration`,\n * which the runtime interprets parent-relative. Works the same whether the\n * spec sits directly under the root composition or nested inside another.\n */\nexport function withFade<T extends SequenceCommon>(spec: T, opts: WithFadeOptions): T {\n const at = spec.at ?? 0;\n if (opts.in != null && opts.in > 0) {\n spec.initial = { ...(spec.initial ?? {}), alpha: 0 };\n const kf: Keyframe = { at, to: { alpha: 1 }, duration: opts.in };\n spec.keyframes = [...(spec.keyframes ?? []), kf];\n }\n if (opts.out != null && opts.out > 0) {\n if (spec.duration == null) {\n throw new Error(\n 'withFade(spec, { out }) requires spec.duration to be set so the ' +\n 'fade-out can be anchored to the sequence end. Set spec.duration ' +\n 'before passing the spec in.',\n );\n }\n const kf: Keyframe = { at: at + spec.duration - opts.out, to: { alpha: 0 }, duration: opts.out };\n spec.keyframes = [...(spec.keyframes ?? []), kf];\n }\n return spec;\n}\n"]}
1
+ {"version":3,"sources":["../src/core/AssetLoader.ts","../src/core/AudioMixer.ts","../src/core/Renderer.ts","../src/filters/TransitionMask.ts","../src/core/Transitions.ts","../src/core/inspect.ts","../src/core/frames.ts","../src/core/options.ts","../src/core/Movie.ts","../src/presets/kenBurns.ts","../src/presets/_ease.ts","../src/presets/orbit.ts","../src/transforms/withFade.ts"],"names":["Output","BufferTarget","extensions","gsap"],"mappings":"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","file":"index.js","sourcesContent":["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 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 { 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 {\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 // threeD participants get wrapped in a 2D full-size composition below, which\n // would silently drop the camera and their depth group — say so.\n const threeDByName = new Set(sequences.filter(s => s.name && s.threeD).map(s => s.name as string));\n transitions.forEach((t, i) => {\n for (const name of [t.from, t.to]) {\n if (threeDByName.has(name)) {\n console.warn(`pixi-effects: transitions[${i}]: \"${name}\" is threeD, but transitions are not supported on threeD layers yet — it will render without the camera`);\n }\n }\n });\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 //\n // The expanders think in parent-composition time, so they get the\n // transition with its `at` already resolved to an absolute (non-negative)\n // time. Keyframe `at` is sequence-local, so whatever keyframes an expander\n // appends to a participant are rebased afterwards by that participant's\n // own start time.\n const abs = { ...t, at: tStart } as typeof t;\n const nFrom = keyframeCount(fromEntry.seq);\n const nTo = keyframeCount(toEntry.seq);\n switch (abs.kind) {\n case 'crossfade':\n expandCrossfade(out, abs, fromEntry.seq, toEntry.seq);\n break;\n case 'wipe':\n expandMask(out, abs, fromEntry.seq, toEntry.seq, i, wipeMode(abs.direction), abs.smoothing);\n break;\n case 'iris':\n expandMask(out, abs, fromEntry.seq, toEntry.seq, i, abs.mode === 'out' ? 'iris-out' : 'iris-in', abs.smoothing);\n break;\n case 'slide':\n expandSlide(out, abs, fromEntry.seq, toEntry.seq);\n break;\n case 'dip':\n expandDip(out, abs, fromEntry.seq, toEntry.seq);\n break;\n case 'zoom':\n expandZoom(out, abs, fromEntry.seq, toEntry.seq);\n break;\n case 'dissolve':\n expandDissolve(out, abs, fromEntry.seq, toEntry.seq, i);\n break;\n }\n rebaseNewKeyframes(fromEntry.seq, nFrom, fromStart);\n rebaseNewKeyframes(toEntry.seq, nTo, toStart);\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 keyframeCount(seq: SequenceSpec): number {\n return (seq as { keyframes?: Keyframe[] }).keyframes?.length ?? 0;\n}\n\n/** Keyframes the expanders appended (index >= `from`) carry parent-time `at`; make them sequence-local. */\nfunction rebaseNewKeyframes(seq: SequenceSpec, from: number, seqStart: number): void {\n const kfs = (seq as { keyframes?: Keyframe[] }).keyframes;\n if (!kfs) return;\n for (let i = from; i < kfs.length; i++) {\n const kf = kfs[i]!;\n if (typeof kf.at === 'number') kfs[i] = { ...kf, at: kf.at - seqStart };\n }\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 type { Container } from 'pixi.js';\nimport type { Sequence } from '../sequences/Base';\nimport { CompositionSequence } from '../sequences/Composition';\nimport { collectPropKeys } from '../space/specKeys';\n\nexport interface Rect { x: number; y: number; width: number; height: number }\n\nexport interface LayerInfo {\n /** Names (or `type#index`) from the root, joined by `/`. */\n path: string;\n name?: string;\n type: string;\n threeD: boolean;\n /** Alive at this frame, not hidden by an ancestor, and alpha > 0. */\n visible: boolean;\n alpha: number;\n /** Its `x` or `y` is animated: text that moves across the canvas on purpose (a ticker) is not reported as cut off. */\n moving: boolean;\n /** Where it is drawn, in canvas pixels. `null` inside a `threeD` layer (it is rendered into that layer's texture). */\n bounds: Rect | null;\n onCanvas: 'full' | 'partial' | 'none' | null;\n}\n\nexport interface InspectReport {\n frame: number;\n time: number;\n canvas: { width: number; height: number };\n /** Layer counts (of the whole tree) — present even when `layers` is filtered out. */\n summary: { layers: number; visible: number };\n /** Human-readable problems worth a look: text off-canvas / cut off / empty / overlapping text. Read this first. */\n issues: string[];\n layers: LayerInfo[];\n}\n\nexport interface InspectOptions {\n /** Which layers to list: every layer, only those drawn at this frame, or none (just `issues` + `summary`). Default `'all'`. */\n layers?: 'all' | 'visible' | 'none';\n}\n\n/** Layers below this alpha are ignored by the layout checks. */\nconst FAINT = 0.3;\n\nconst intersection = (a: Rect, b: Rect): number => {\n const w = Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x);\n const h = Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y);\n return w > 0 && h > 0 ? w * h : 0;\n};\n\n/**\n * Describe where every layer is drawn at the CURRENT timeline position, and flag layout problems an AI\n * cannot see without looking: text that is off the canvas or cut by an edge, empty text, and text layers\n * that overlap each other. Call after seeking (Movie.inspect does).\n */\nexport function inspectScene(\n root: CompositionSequence, frame: number, time: number, canvas: { width: number; height: number }, opts: InspectOptions = {},\n): InspectReport {\n const layers: LayerInfo[] = [];\n const view: Rect = { x: 0, y: 0, width: canvas.width, height: canvas.height };\n\n const walk = (comp: CompositionSequence, prefix: string, insideThreeD: boolean, parentVisible: boolean): void => {\n comp.layers().forEach(({ seq, display, threeD }, i) => {\n const t = seq.target as (Container & { renderable: boolean; alpha: number }) | null;\n const name = seq.spec.name;\n const label = name ?? `${seq.spec.type}#${i}`;\n const alpha = t?.alpha ?? 1;\n const alive = threeD ? display.visible : (t?.renderable ?? true);\n const visible = parentVisible && alive && alpha > 0;\n let bounds: Rect | null = null;\n if (!insideThreeD) {\n const b = display.getBounds();\n bounds = { x: b.x, y: b.y, width: b.width, height: b.height };\n }\n let onCanvas: LayerInfo['onCanvas'] = null;\n if (bounds) {\n const inter = intersection(bounds, view);\n const area = bounds.width * bounds.height;\n onCanvas = inter === 0 && area > 0 ? 'none' : inter >= area - 1e-6 ? 'full' : 'partial';\n if (area === 0) onCanvas = 'none';\n }\n const keys = collectPropKeys(seq.spec);\n const moving = (seq.spec.keyframes ?? []).length > 0 && (keys.has('x') || keys.has('y'));\n layers.push({ path: prefix + label, name, type: seq.spec.type, threeD, visible, alpha, moving, bounds, onCanvas });\n if (seq instanceof CompositionSequence) walk(seq, prefix + label + '/', insideThreeD || threeD, visible);\n });\n };\n walk(root, '', false, true);\n\n const issues: string[] = [];\n // Faint layers (mid-fade) are not worth flagging.\n const texts = layers.filter(l => l.type === 'text' && l.visible && l.alpha >= FAINT && l.bounds);\n for (const l of texts) {\n const b = l.bounds!;\n const who = `text layer \"${l.path}\"`;\n if (b.width < 1 || b.height < 1) {\n issues.push(`${who} has no size (empty text, or not drawn yet)`);\n } else if (l.moving) {\n // on purpose crossing the canvas edge (marquee, slide-in): not a layout problem\n } else if (l.onCanvas === 'none') {\n issues.push(`${who} is entirely outside the canvas (at ${Math.round(b.x)},${Math.round(b.y)}, ${Math.round(b.width)}×${Math.round(b.height)})`);\n } else if (l.onCanvas === 'partial') {\n const over: string[] = [];\n if (b.x < 0) over.push(`${Math.round(-b.x)}px beyond the left edge`);\n if (b.x + b.width > canvas.width) over.push(`${Math.round(b.x + b.width - canvas.width)}px beyond the right edge`);\n if (b.y < 0) over.push(`${Math.round(-b.y)}px beyond the top edge`);\n if (b.y + b.height > canvas.height) over.push(`${Math.round(b.y + b.height - canvas.height)}px beyond the bottom edge`);\n issues.push(`${who} is cut off by the canvas edge: ${over.join(', ')}`);\n }\n }\n for (let i = 0; i < texts.length; i++) {\n for (let j = i + 1; j < texts.length; j++) {\n const a = texts[i]!.bounds!, b = texts[j]!.bounds!;\n const smaller = Math.min(a.width * a.height, b.width * b.height);\n if (smaller <= 0) continue;\n const share = intersection(a, b) / smaller;\n if (share > 0.25) issues.push(`text layers \"${texts[i]!.path}\" and \"${texts[j]!.path}\" overlap by ${Math.round(share * 100)}% of the smaller one`);\n }\n }\n const mode = opts.layers ?? 'all';\n const listed = mode === 'none' ? [] : mode === 'visible' ? layers.filter(l => l.visible) : layers;\n return { frame, time, canvas, summary: { layers: layers.length, visible: layers.filter(l => l.visible).length }, issues, layers: listed };\n}\n","/** `count` frame numbers spread evenly from 0 to `lastFrame` (inclusive), deduplicated. */\nexport function pickFrames(lastFrame: number, count: number): number[] {\n const last = Math.max(0, Math.floor(lastFrame));\n const n = Math.max(1, Math.floor(count));\n if (n === 1) return [0];\n const out: number[] = [];\n for (let i = 0; i < n; i++) {\n const f = Math.round((last * i) / (n - 1));\n if (out[out.length - 1] !== f) out.push(f);\n }\n return out;\n}\n\nexport interface SheetLayout {\n cols: number;\n rows: number;\n cellW: number;\n /** Height of the picture part of a cell (the label strip is extra). */\n cellH: number;\n width: number;\n height: number;\n /** Top-left of each cell (picture + label strip), row-major. */\n positions: Array<{ x: number; y: number }>;\n}\n\n/** Grid for a contact sheet of `n` frames of size `srcW × srcH`, each cell `cellW` wide with a `labelH` strip under the picture. */\nexport function sheetLayout(n: number, columns: number, cellW: number, srcW: number, srcH: number, labelH: number): SheetLayout {\n const cols = Math.max(1, Math.min(Math.floor(columns), n));\n const rows = Math.ceil(n / cols);\n const cellH = Math.round((cellW * srcH) / srcW);\n const positions = Array.from({ length: n }, (_, i) => ({ x: (i % cols) * cellW, y: Math.floor(i / cols) * (cellH + labelH) }));\n return { cols, rows, cellW, cellH, width: cols * cellW, height: rows * (cellH + labelH), positions };\n}\n","/** Edit distance, small inputs only. */\nfunction distance(a: string, b: string): number {\n const dp = Array.from({ length: a.length + 1 }, (_, i) => [i, ...Array(b.length).fill(0)] as number[]);\n for (let j = 1; j <= b.length; j++) dp[0]![j] = j;\n for (let i = 1; i <= a.length; i++) {\n for (let j = 1; j <= b.length; j++) {\n dp[i]![j] = Math.min(dp[i - 1]![j]! + 1, dp[i]![j - 1]! + 1, dp[i - 1]![j - 1]! + (a[i - 1] === b[j - 1] ? 0 : 1));\n // swapping two neighbouring letters (sacle / scale) counts as one slip\n if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) dp[i]![j] = Math.min(dp[i]![j]!, dp[i - 2]![j - 2]! + 1);\n }\n }\n return dp[a.length]![b.length]!;\n}\n\nconst isSubsequence = (small: string, big: string): boolean => {\n let i = 0;\n for (const ch of big) if (i < small.length && ch === small[i]) i++;\n return i === small.length;\n};\n\n/** Names AI authors commonly guess, mapped to the real option (only suggested when the real option exists here). */\nconst COMMON_ALIASES: Record<string, string> = {\n fps: 'frameRate', framerate: 'frameRate', frame_rate: 'frameRate',\n bg: 'background', backgroundcolor: 'background', bgcolor: 'background',\n seconds: 'duration', length: 'duration', time: 'duration',\n w: 'width', h: 'height', cols: 'columns', sweep: 'degrees', angle: 'degrees',\n};\n\n/** The valid name an author most likely meant by `name` (alias, typo, abbreviation or case slip), or null. */\nexport function suggestName(name: string, valid: readonly string[]): string | null {\n const n = name.toLowerCase();\n const alias = COMMON_ALIASES[n];\n if (alias && valid.includes(alias)) return alias;\n let best: { v: string; score: number } | null = null;\n for (const v of valid) {\n const lv = v.toLowerCase();\n const d = distance(n, lv);\n const close = d <= Math.max(1, Math.floor(Math.min(n.length, lv.length) / 3));\n // an abbreviation (cols → columns) or a longer phrase containing the name (fadeIn → in)\n const abbreviation = (n.length >= 3 && isSubsequence(n, lv)) || (lv.length >= 2 && n.length > lv.length && n.includes(lv));\n if (!close && !abbreviation) continue;\n const score = close ? d : 3 + (lv.length - n.length) / 100; // typos first, then abbreviations\n if (!best || score < best.score) best = { v, score };\n }\n return best ? best.v : null;\n}\n\n/**\n * Unknown option keys are silently ignored by JavaScript, which is how a guessed name like `cols`\n * or `fps` quietly does nothing. Say so, and say what was probably meant.\n */\nexport function warnUnknownOptions(where: string, opts: object | undefined | null, valid: readonly string[]): void {\n if (!opts || typeof opts !== 'object') return;\n for (const key of Object.keys(opts)) {\n if (valid.includes(key)) continue;\n const guess = suggestName(key, valid);\n console.warn(`pixi-effects: ${where}: unknown option \"${key}\"${guess ? ` — did you mean \"${guess}\"?` : ''} (valid: ${valid.join(', ')})`);\n }\n}\n","import * as PIXI from 'pixi.js';\nimport { Application, Container, Culler, 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 { inspectScene, type InspectReport, type InspectOptions } from './inspect';\nimport { pickFrames, sheetLayout } from './frames';\nimport { warnUnknownOptions } from './options';\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 SnapshotOptions {\n /** Output size relative to the canvas (default 1). */\n scale?: number;\n /** `'image/png'` (default) or `'image/jpeg'`. */\n type?: 'image/png' | 'image/jpeg';\n /** Return a `data:` URL string instead of a Blob (handy for scripts that can only return text). */\n as?: 'blob' | 'dataURL';\n}\n\nexport interface ContactSheetOptions {\n /** Frames to show. Default: `count` frames spread evenly over the movie. */\n frames?: number[];\n /** Times in seconds to show (used when `frames` is not given). */\n times?: number[];\n /** How many frames when neither `frames` nor `times` is given. Default 6. */\n count?: number;\n /** Columns in the grid. Default 3. */\n columns?: number;\n /** Width of each picture in pixels. Default 480. */\n cellWidth?: number;\n as?: 'blob' | 'dataURL';\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 warnUnknownOptions('movie.init()', options, ['width', 'height', 'duration', 'frameRate', 'background', 'canvas', 'assets', 'composition']);\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 await this._awaitVideoFrames();\n this._updateSpace();\n this._renderNow();\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._updateSpace();\n this._renderNow();\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.absoluteStart ?? v.at);\n if (local < 0 || local > (v.duration ?? 0)) return Promise.resolve();\n return v.awaitFrameAt(local);\n }));\n }\n\n /**\n * A picture of one frame (the canvas only: the player bar is not included). Seeks there first and\n * stays there. Use it to LOOK at your composition.\n */\n async snapshot(frame?: number, opts?: SnapshotOptions & { as?: 'blob' }): Promise<Blob>;\n async snapshot(frame: number | undefined, opts: SnapshotOptions & { as: 'dataURL' }): Promise<string>;\n async snapshot(frame: number = this.currentFrame, opts: SnapshotOptions = {}): Promise<Blob | string> {\n warnUnknownOptions('movie.snapshot()', opts, ['scale', 'type', 'as']);\n this._requireReady('snapshot');\n await this.gotoFrame(clampFrame(frame, this.totalFrames), true);\n const scale = opts.scale ?? 1;\n const out = document.createElement('canvas');\n out.width = Math.max(1, Math.round(this.width * scale));\n out.height = Math.max(1, Math.round(this.height * scale));\n out.getContext('2d')!.drawImage(this.app!.canvas as HTMLCanvasElement, 0, 0, out.width, out.height);\n return encodeCanvas(out, opts.type ?? 'image/png', opts.as ?? 'blob');\n }\n\n /**\n * Several frames on ONE image, each labelled with its frame number and time — the cheapest way to\n * check a whole animation by eye. Restores the current frame afterwards.\n */\n async contactSheet(opts?: ContactSheetOptions & { as?: 'blob' }): Promise<Blob>;\n async contactSheet(opts: ContactSheetOptions & { as: 'dataURL' }): Promise<string>;\n async contactSheet(opts: ContactSheetOptions = {}): Promise<Blob | string> {\n warnUnknownOptions('movie.contactSheet()', opts, ['frames', 'times', 'count', 'columns', 'cellWidth', 'as']);\n this._requireReady('contactSheet');\n const frames = (opts.frames\n ?? opts.times?.map(t => Math.round(t * this.frameRate))\n ?? pickFrames(this.totalFrames, opts.count ?? 6)).map(f => clampFrame(f, this.totalFrames));\n const LABEL_H = 26;\n const L = sheetLayout(frames.length, opts.columns ?? 3, opts.cellWidth ?? 480, this.width, this.height, LABEL_H);\n const sheet = document.createElement('canvas');\n sheet.width = L.width;\n sheet.height = L.height;\n const g = sheet.getContext('2d')!;\n g.fillStyle = '#10131c';\n g.fillRect(0, 0, L.width, L.height);\n const back = this.currentFrame;\n try {\n for (let i = 0; i < frames.length; i++) {\n const f = frames[i]!;\n await this.gotoFrame(f, true);\n const { x, y } = L.positions[i]!;\n g.drawImage(this.app!.canvas as HTMLCanvasElement, x, y + LABEL_H, L.cellW, L.cellH);\n g.fillStyle = '#e8ecf8';\n g.font = '600 15px system-ui, sans-serif';\n g.textBaseline = 'middle';\n g.fillText(`frame ${f} · ${(f / this.frameRate).toFixed(2)}s`, x + 8, y + LABEL_H / 2);\n }\n } finally {\n await this.gotoFrame(back, true);\n }\n return encodeCanvas(sheet, 'image/png', opts.as ?? 'blob');\n }\n\n /**\n * Where every layer is drawn at `frame` (canvas pixels, visibility) plus `issues` — text that is off\n * the canvas, cut by an edge, empty, or overlapping other text. Seeks there and stays there.\n */\n async inspect(frame: number = this.currentFrame, opts: InspectOptions = { layers: 'visible' }): Promise<InspectReport> {\n warnUnknownOptions('movie.inspect()', opts, ['layers']);\n this._requireReady('inspect');\n const f = clampFrame(frame, this.totalFrames);\n await this.gotoFrame(f, true);\n return inspectScene(this._rootSequence as CompositionSequence, f, f / this.frameRate, { width: this.width, height: this.height }, opts);\n }\n\n /**\n * Draw the stage now. PixiJS's CullerPlugin only culls inside `app.render()` (the ticker), and we render\n * by hand — while seeking and especially during `render()`, which stops the ticker — so without this the\n * `culled` flags are whatever the last tick left: a layer that is now on screen can stay culled and be\n * missing from the frame or from the exported video. Cull again (updating transforms: the timeline just\n * moved things) right before drawing.\n */\n private _renderNow(): void {\n const app = this.app;\n if (!app?.renderer) return;\n Culler.shared.cull(app.stage, app.renderer.screen, false);\n app.renderer.render({ container: app.stage });\n }\n\n private _requireReady(what: string): void {\n if (this._initState !== 'ready' || !this._rootSequence || !this.app) {\n throw new Error(`pixi-effects: movie.${what}() needs a ready movie — await movie.init(...) first`);\n }\n }\n\n /** Projects every `threeD` layer for the current frame (see src/space). */\n private _updateSpace(): void {\n if (!this._rootSequence || !this.app) return;\n this._rootSequence.updateSpace(this.currentFrame / this.frameRate, this.app.renderer);\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 warnUnknownOptions('movie.render()', options, ['format', 'video', 'audio']);\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\nconst clampFrame = (f: number, last: number): number => Math.max(0, Math.min(Math.round(f), last));\n\nfunction encodeCanvas(canvas: HTMLCanvasElement, type: string, as: 'blob' | 'dataURL'): Promise<Blob | string> {\n if (as === 'dataURL') return Promise.resolve(canvas.toDataURL(type));\n return new Promise((resolve, reject) => canvas.toBlob(b => (b ? resolve(b) : reject(new Error('pixi-effects: could not encode the image'))), type));\n}\n\ninterface VideoLike {\n at: number;\n duration: number | undefined;\n absoluteStart?: number | null;\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\n/**\n * Exported for tests/internal use only — not part of the public API.\n * Walks a sequence tree (including mask sequences) collecting any node\n * that exposes `awaitFrameAt`, so Movie can await frame-driven sequences\n * (video, three) wherever they appear, including inside masks.\n */\nexport function 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 if (seq.maskSequence) collectVideoSequences(seq.maskSequence, out);\n for (const child of (seq as Sequence & { _children?: Sequence[] })._children ?? []) {\n collectVideoSequences(child, out);\n }\n}\n","import type { ImageSequenceSpec, Props } from '../types';\nimport { warnUnknownOptions } from '../core/options';\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 */\nconst KEN_BURNS_KEYS = ['asset', 'name', 'at', 'duration', 'fit', 'ease', 'motion', 'origin', 'zoom', 'direction', 'angle', 'from', 'to'] as const;\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 warnUnknownOptions('kenBurns()', opts, KEN_BURNS_KEYS);\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 sequence-local, so the motion simply starts at 0 whatever `at` is.\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) = (ox*W, oy*H) — the focal point on the\n // canvas matches the origin's image-relative position.\n //\n // This is the only constant pivot position that keeps the image\n // covering the canvas at every scale s ≥ baseScale, for any\n // origin in [0,1]². Coverage requires:\n // W - w·(1-ox)·s ≤ x ≤ w·ox·s\n // At s = baseScale = max(W/w, H/h) the inequalities collapse to a\n // single point x = ox·W (and y = oy·H), so any pivot that doesn't\n // sit there will expose a canvas edge once the animation reaches\n // baseScale. For s > baseScale the range widens and ox·W stays\n // within it, so the same constant pivot works throughout.\n const pivotXExpr = `w * ${origin[0]}`;\n const pivotYExpr = `h * ${origin[1]}`;\n const initialScale = `${baseScale} * ${fromZ}`;\n const xExpr = `W * ${origin[0]}`;\n const yExpr = `H * ${origin[1]}`;\n initial = {\n x: xExpr, y: yExpr,\n pivotX: pivotXExpr, pivotY: pivotYExpr,\n scale: initialScale,\n };\n keyframes = [\n { at: 0, 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: 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: 0, 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","import { gsap } from 'gsap';\n\n/** Resolve a GSAP ease name to a function (0–1 → 0–1). */\nexport function parseEase(name: string): (p: number) => number {\n return gsap.parseEase(name) as (p: number) => number;\n}\n","import { parseEase } from './_ease';\nimport { warnUnknownOptions } from '../core/options';\nimport { homeDistance, DEFAULT_FOV, DEG } from '../space/math';\nimport type { CameraSequenceSpec, Keyframe } from '../types';\n\nconst ORBIT_KEYS = ['duration', 'degrees', 'start', 'radius', 'center', 'width', 'height', 'fov', 'ease', 'dollyZoom', 'at', 'name', 'stepsPerSecond'] as const;\n\nexport interface OrbitOptions {\n /** Length of the move in seconds. Required, > 0. */\n duration: number;\n /** Total sweep in degrees (negative = the other way). The camera passes straight-ahead (angle 0) in the middle when `start` is left at its default. */\n degrees: number;\n /** Angle the move starts at, in degrees (0 = straight in front of the centre). Default `-degrees / 2`. */\n start?: number;\n /** Distance from the centre. Default: the default camera distance for `height` and `fov` (so `z = 0` is 1:1 at angle 0). */\n radius?: number;\n /** The point to circle around and look at, in composition pixels. Default: the centre of `width` × `height`. */\n center?: [number, number];\n /** Composition size, used for the default `center` and `radius`. Default 1280 × 720. */\n width?: number;\n height?: number;\n /** Vertical field of view, degrees. Default 40. Written to the camera. */\n fov?: number;\n /** Easing of the sweep as a whole (any GSAP ease). Default `'sine.inOut'`. */\n ease?: string;\n /**\n * A dolly zoom while orbiting: `fov` animates from `from` to `to` (degrees) and the radius follows it\n * (`R = (height/2) / tan(fov/2)`), so the `z = 0` plane keeps its size while the perspective changes.\n * Cannot be combined with `radius`. `ease` defaults to the sweep's ease.\n */\n dollyZoom?: { from: number; to: number; ease?: string };\n /** Start time in seconds (composition time, like any layer). */\n at?: number;\n name?: string;\n /** Sampling density. Default one segment per 0.1 s. */\n stepsPerSecond?: number;\n}\n\n/**\n * A camera that orbits a point. There is no per-frame expression in the DSL, so the circle is sampled\n * into short linear keyframes (the easing is applied to the angle). Drop the result into `sequences[]`\n * next to `threeD` layers.\n *\n * ```ts\n * orbit({ duration: 6, degrees: 40 }) // sweep ±20° around the centre\n * orbit({ duration: 4, degrees: 90, start: 0, radius: 900 })\n * ```\n *\n * `z` is specified, so it no longer follows `fov`. For a dolly zoom WHILE orbiting pass\n * `dollyZoom: { from: 38, to: 64 }`: `fov` animates and the radius follows it (`z = (H/2) / tan(fov/2)`),\n * keeping the `z = 0` plane the same size.\n */\nexport function orbit(opts: OrbitOptions): CameraSequenceSpec {\n warnUnknownOptions('orbit()', opts, ORBIT_KEYS);\n const {\n duration, degrees, width = 1280, height = 720, fov, ease = 'sine.inOut', stepsPerSecond = 10,\n } = opts;\n if (!(duration > 0)) throw new Error(`pixi-effects: orbit duration must be > 0 (got ${duration})`);\n const dolly = opts.dollyZoom;\n if (dolly && opts.radius !== undefined) {\n throw new Error('pixi-effects: orbit() cannot combine `radius` with `dollyZoom` — the radius follows the animated fov');\n }\n const [cx, cy] = opts.center ?? [width / 2, height / 2];\n const fixedR = opts.radius ?? homeDistance(height, fov ?? DEFAULT_FOV);\n const start = opts.start ?? -degrees / 2;\n const steps = Math.max(1, Math.round(duration * stepsPerSecond));\n const easeFn = parseEase(ease);\n const dollyEase = dolly ? parseEase(dolly.ease ?? ease) : null;\n const pos = (i: number): Record<string, number> => {\n const p = i / steps;\n const a = (start + degrees * easeFn(p)) * DEG;\n if (!dolly) return { x: cx + fixedR * Math.sin(a), z: fixedR * Math.cos(a) };\n const f = dolly.from + (dolly.to - dolly.from) * dollyEase!(p);\n const R = homeDistance(height, f);\n return { x: cx + R * Math.sin(a), z: R * Math.cos(a), fov: f };\n };\n\n const keyframes: Keyframe[] = [];\n for (let i = 0; i < steps; i++) {\n keyframes.push({ at: (duration * i) / steps, to: pos(i + 1), duration: duration / steps, ease: 'none' });\n }\n const p0 = pos(0);\n const spec: CameraSequenceSpec = {\n type: 'camera',\n duration,\n initial: {\n x: p0.x!, y: cy, z: p0.z!, lookAtX: cx, lookAtY: cy, lookAtZ: 0,\n ...(p0.fov !== undefined ? { fov: p0.fov } : fov !== undefined ? { fov } : {}),\n },\n keyframes,\n };\n if (opts.at !== undefined) spec.at = opts.at;\n if (opts.name !== undefined) spec.name = opts.name;\n return spec;\n}\n","import type { SequenceCommon, Keyframe } from '../types';\nimport { warnUnknownOptions } from '../core/options';\n\nexport interface WithFadeOptions {\n /** Fade-in duration (seconds), at the start of the sequence. */\n in?: number;\n /** Fade-out duration (seconds), ending at the end of the sequence. Requires `duration` to be set on the spec. */\n out?: number;\n}\n\n/**\n * Add alpha fade-in / fade-out keyframes to a sequence spec. Mutates and\n * returns the spec so the result can be dropped straight into `sequences[]`.\n *\n * ```ts\n * sequences: [\n * withFade(\n * kenBurns({ asset: 'p', at: 0, duration: 6, motion: 'scale' }),\n * { in: 0.5, out: 0.5 },\n * ),\n *\n * withFade(\n * { type: 'text', text: 'hi', at: 5, duration: 3, initial: { x: 'GW/2' } },\n * { in: 0.4 },\n * ),\n * ]\n * ```\n *\n * The added keyframes are layered on top of any keyframes the spec already\n * has — kenBurns's scale / position / rotation tweens keep working.\n *\n * Keyframe `at` is sequence-local: the fade-in starts at 0 and the fade-out\n * at `duration - out`, whatever the sequence's own `at` is. Works the same\n * whether the spec sits directly under the root composition or nested inside\n * another.\n */\nexport function withFade<T extends SequenceCommon>(spec: T, opts: WithFadeOptions): T {\n warnUnknownOptions('withFade()', opts, ['in', 'out']);\n if (opts.in != null && opts.in > 0) {\n spec.initial = { ...(spec.initial ?? {}), alpha: 0 };\n const kf: Keyframe = { at: 0, to: { alpha: 1 }, duration: opts.in };\n spec.keyframes = [...(spec.keyframes ?? []), kf];\n }\n if (opts.out != null && opts.out > 0) {\n if (spec.duration == null) {\n throw new Error(\n 'withFade(spec, { out }) requires spec.duration to be set so the ' +\n 'fade-out can be anchored to the sequence end. Set spec.duration ' +\n 'before passing the spec in.',\n );\n }\n const kf: Keyframe = { at: spec.duration - opts.out, to: { alpha: 0 }, duration: opts.out };\n spec.keyframes = [...(spec.keyframes ?? []), kf];\n }\n return spec;\n}\n"]}