pixi-effects 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +7 -6
- package/ai/reference/cheatsheet.md +5 -1
- package/ai/template.html +3 -3
- package/dist/Composition-CM62XJKT.cjs +14 -0
- package/dist/{Composition-3KHQPRBA.cjs.map → Composition-CM62XJKT.cjs.map} +1 -1
- package/dist/Composition-RJDSQYTV.js +5 -0
- package/dist/{Composition-DT657FO5.js.map → Composition-RJDSQYTV.js.map} +1 -1
- package/dist/Controller.cjs +55 -20
- package/dist/Controller.cjs.map +1 -1
- package/dist/Controller.d.cts +31 -2
- package/dist/Controller.d.ts +31 -2
- package/dist/Controller.js +55 -21
- package/dist/Controller.js.map +1 -1
- package/dist/{Movie-BK9daiTt.d.cts → Movie-CQOhUmko.d.cts} +24 -1
- package/dist/{Movie-B0OUKlZI.d.ts → Movie-HF3pSGjQ.d.ts} +24 -1
- package/dist/{chunk-6I55T4OH.cjs → chunk-AGMNSJJH.cjs} +13 -4
- package/dist/chunk-AGMNSJJH.cjs.map +1 -0
- package/dist/{chunk-4O2NYDJG.js → chunk-FNKSXBKB.js} +13 -4
- package/dist/chunk-FNKSXBKB.js.map +1 -0
- package/dist/{chunk-36Z4RIRK.js → chunk-O4AJYUPK.js} +3 -3
- package/dist/{chunk-36Z4RIRK.js.map → chunk-O4AJYUPK.js.map} +1 -1
- package/dist/{chunk-4VSIJLU3.cjs → chunk-PDBDDGG5.cjs} +21 -21
- package/dist/{chunk-4VSIJLU3.cjs.map → chunk-PDBDDGG5.cjs.map} +1 -1
- package/dist/index.cjs +82 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +71 -12
- package/dist/index.js.map +1 -1
- package/dist/three.cjs +5 -5
- package/dist/three.js +1 -1
- package/docs/api.md +51 -0
- package/docs/dsl.md +14 -2
- package/llms-full.txt +70 -3
- package/package.json +1 -1
- package/dist/Composition-3KHQPRBA.cjs +0 -14
- package/dist/Composition-DT657FO5.js +0 -5
- package/dist/chunk-4O2NYDJG.js.map +0 -1
- package/dist/chunk-6I55T4OH.cjs.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/AssetLoader.ts","../src/core/AudioMixer.ts","../src/core/spectrum.ts","../src/core/inspectAudio.ts","../src/core/Renderer.ts","../src/filters/TransitionMask.ts","../src/core/Transitions.ts","../src/core/inspect.ts","../src/core/timelineChart.ts","../src/core/frames.ts","../src/core/startWhenRunning.ts","../src/core/Movie.ts","../src/text/measure.ts","../src/presets/kenBurns.ts","../src/presets/_ease.ts","../src/presets/orbit.ts","../src/transforms/withFade.ts"],"names":["extensions","ExtensionType","Input","BlobSource","ALL_FORMATS","Output","WavOutputFormat","BufferTarget","Conversion","VideoSampleSink","Assets","num","windows","QUALITY_VERY_LOW","QUALITY_LOW","QUALITY_MEDIUM","QUALITY_HIGH","QUALITY_VERY_HIGH","Mp4OutputFormat","MovOutputFormat","WebMOutputFormat","MkvOutputFormat","CanvasSource","AudioBufferSource","Filter","GlProgram","defaultFilterVert","GpuProgram","UniformGroup","resolveAt","walk","collectPropKeys","CompositionSequence","CullerPlugin","gsap","PixiPlugin","PIXI","warnUnknownOptions","Application","Container","Rectangle","ensureFilterLibrary","Culler","CanvasTextMetrics","TextStyle","suggestName","homeDistance","DEFAULT_FOV","DEG"],"mappings":"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","file":"index.cjs","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 // A synthesised sound is rendered once per mix, at the mix's own rate, however often it is used.\n const synthesised = new Map<string, AudioBuffer>();\n const bufferOf = (a: AudioDescriptor): AudioBuffer | null => {\n if (a.buffer) return a.buffer;\n if (!a.synth) return null;\n let buf = synthesised.get(a.synth.key);\n if (!buf) {\n const [left, right] = a.synth.render(sampleRate);\n buf = ctx.createBuffer(2, left.length, sampleRate);\n buf.getChannelData(0).set(left);\n buf.getChannelData(1).set(right);\n synthesised.set(a.synth.key, buf);\n }\n return buf;\n };\n for (const a of audios) {\n const buffer = bufferOf(a);\n if (!buffer) continue;\n // Web Audio throws on a negative time. A sound that starts before the movie (a negative `at`, e.g.\n // `at = hit - duration` near 0) is mixed from 0 with its first seconds cut off, and its volume points\n // are clamped to 0.\n const begin = Math.max(0, a.start);\n const skipped = begin - a.start;\n if (skipped > 0) {\n console.warn(\n `pixi-effects: ${a.layer ?? 'an audio layer'} starts at ${a.start.toFixed(2)}s, before the movie starts, so its first ${skipped.toFixed(2)}s are cut off. ` +\n `Start it at 0 or later.`,\n );\n }\n const src = ctx.createBufferSource();\n src.buffer = buffer;\n src.loop = !!a.loop;\n const gain = ctx.createGain();\n gain.gain.setValueAtTime(a.initialVolume ?? 1, begin);\n for (const kf of a.volumeKeyframes ?? []) {\n gain.gain.linearRampToValueAtTime(kf.value, Math.max(0, kf.time));\n }\n src.connect(gain).connect(ctx.destination);\n src.start(begin, skipped);\n src.stop(Math.max(begin, a.end));\n }\n return await ctx.startRendering();\n}\n\n/** Peak of the mix before limiting, and where it is. `peak > 1` means the mix had to be limited. */\nexport interface MixStats {\n peak: number;\n peakAt: number;\n}\n\n/** Above this the mix is bent smoothly toward 1 instead of clipping. */\nconst KNEE = 0.9;\n\n/**\n * Keep the finished mix inside [-1, 1]: samples above KNEE are soft-limited (tanh), so overlapping sounds\n * never wrap or crackle in the encoder. Pure and deterministic; a mix that never exceeds KNEE is untouched.\n * Warns once, naming the layers that play at the loudest moment, when the mix went over 1.\n */\nexport function limitMix(buffer: AudioBuffer, audios: AudioDescriptor[]): MixStats {\n let peak = 0;\n let peakIndex = 0;\n for (let ch = 0; ch < buffer.numberOfChannels; ch++) {\n const d = buffer.getChannelData(ch);\n for (let i = 0; i < d.length; i++) {\n const x = Math.abs(d[i]!);\n if (x > peak) { peak = x; peakIndex = i; }\n if (x > KNEE) d[i] = Math.sign(d[i]!) * (KNEE + (1 - KNEE) * Math.tanh((x - KNEE) / (1 - KNEE)));\n }\n }\n const peakAt = peakIndex / buffer.sampleRate;\n if (peak > 1) {\n const playing = audios.filter(a => a.start <= peakAt && peakAt < a.end).map(a => a.layer ?? 'an audio layer');\n console.warn(\n `pixi-effects: the audio mix peaks at ${peak.toFixed(2)} (${(20 * Math.log10(peak)).toFixed(1)} dBFS) at ${peakAt.toFixed(2)}s, so it was limited ` +\n `(it would distort). Playing there: ${[...new Set(playing)].join(', ')}. Lower their volume.`,\n );\n }\n return { peak, peakAt };\n}\n","/** In-place radix-2 FFT (re/im arrays of the same power-of-two length). */\nfunction fft(re: Float64Array, im: Float64Array): void {\n const n = re.length;\n for (let i = 1, j = 0; i < n; i++) {\n let bit = n >> 1;\n for (; j & bit; bit >>= 1) j ^= bit;\n j ^= bit;\n if (i < j) { [re[i], re[j]] = [re[j]!, re[i]!]; [im[i], im[j]] = [im[j]!, im[i]!]; }\n }\n for (let len = 2; len <= n; len <<= 1) {\n const ang = (-2 * Math.PI) / len;\n for (let i = 0; i < n; i += len) {\n for (let k = 0; k < len / 2; k++) {\n const wr = Math.cos(ang * k), wi = Math.sin(ang * k);\n const a = i + k, b = a + len / 2;\n const xr = re[b]! * wr - im[b]! * wi, xi = re[b]! * wi + im[b]! * wr;\n re[b] = re[a]! - xr; im[b] = im[a]! - xi;\n re[a] = re[a]! + xr; im[a] = im[a]! + xi;\n }\n }\n }\n}\n\nconst FRAME = 2048;\n\n/**\n * Spectral centroid (\"brightness\") in Hz of `samples[from, to)`: the power-weighted mean frequency\n * over Hann-windowed 2048-sample frames (louder frames count more). 0 for silence.\n * Rough guide: < 500 Hz dark / boomy, 1–3 kHz mid, > 4 kHz bright / airy.\n */\nexport function spectralCentroid(samples: Float32Array, sampleRate: number, from = 0, to = samples.length): number {\n let num = 0;\n let den = 0;\n const re = new Float64Array(FRAME);\n const im = new Float64Array(FRAME);\n const end = Math.min(to, samples.length);\n for (let start = Math.max(0, from); start < end; start += FRAME / 2) {\n for (let i = 0; i < FRAME; i++) {\n const k = start + i;\n const w = 0.5 - 0.5 * Math.cos((2 * Math.PI * i) / (FRAME - 1));\n re[i] = k < end ? samples[k]! * w : 0;\n im[i] = 0;\n }\n fft(re, im);\n for (let b = 1; b < FRAME / 2; b++) {\n const power = re[b]! * re[b]! + im[b]! * im[b]!;\n num += power * ((b * sampleRate) / FRAME);\n den += power;\n }\n }\n return den > 1e-9 ? Math.round(num / den / 10) * 10 : 0;\n}\n","import type { AudioDescriptor } from '../types';\nimport type { MixStats } from './AudioMixer';\nimport { spectralCentroid } from './spectrum';\n\nexport interface AudioInspectOptions {\n /** Width of each loudness window in seconds. Default 0.1. */\n window?: number;\n}\n\n/** One sound measured ON ITS OWN (not mixed), so overlapping layers do not blur it. */\nexport interface SoundMeasure {\n /** Seconds of audio the source has (an sfx: its length; a file: the file's length). */\n length: number;\n /** Its own loudest sample, dBFS (before the layer's volume). */\n peakDb: number;\n /** Seconds from its start to its loudest sample — the moment to line up with the picture. */\n loudestAt: number;\n /** Spectral centroid in Hz: < 500 dark / boomy, 1–4 k mid, > 8 k airy / hissy. */\n brightnessHz: number;\n}\n\nexport interface AudioSourceReport {\n /** `layer \"pop-1\"` (or `unnamed audio layer`). */\n layer: string;\n /** `sfx \"pop\"`, `asset \"bgm\"`, `video \"green\"`. */\n source: string;\n /** Movie time, seconds. */\n start: number;\n end: number;\n /** Loudest sample of the MIX while this source plays, dBFS (−120 = silence). */\n peakDb: number;\n sound: SoundMeasure;\n}\n\nexport interface AudioReport {\n duration: number;\n sampleRate: number;\n /** Loudest sample of the mix before limiting, dBFS. Above 0 the mix was limited. */\n peakDb: number;\n peakAt: number;\n /** Every audio layer / video soundtrack in the mix, in start order. */\n sources: AudioSourceReport[];\n /** The mix over time: one row per window, `t` = window start. */\n windows: Array<{ t: number; rmsDb: number; peakDb: number; brightnessHz: number }>;\n /** Problems worth fixing: limiting, inaudible layers, sounds cut off by the end of the movie. Read this first. */\n issues: string[];\n}\n\ninterface PcmLike {\n numberOfChannels: number;\n sampleRate: number;\n length: number;\n getChannelData(ch: number): Float32Array;\n}\n\n/** Below this a source counts as inaudible. */\nconst INAUDIBLE_DB = -50;\n\nconst db = (x: number): number => Math.round(10 * Math.max(-120, 20 * Math.log10(x))) / 10;\nconst mono = (chans: Float32Array[]): Float32Array => {\n if (chans.length === 1) return chans[0]!;\n const out = new Float32Array(chans[0]!.length);\n for (const d of chans) for (let i = 0; i < out.length; i++) out[i] = out[i]! + d[i]! / chans.length;\n return out;\n};\n\nfunction measure(chans: Float32Array[], sampleRate: number): SoundMeasure {\n let peak = 0;\n let at = 0;\n for (const d of chans) for (let i = 0; i < d.length; i++) if (Math.abs(d[i]!) > peak) { peak = Math.abs(d[i]!); at = i; }\n return {\n length: Math.round((chans[0]!.length / sampleRate) * 1000) / 1000,\n peakDb: db(peak),\n loudestAt: Math.round((at / sampleRate) * 1000) / 1000,\n brightnessHz: spectralCentroid(mono(chans), sampleRate),\n };\n}\n\n/**\n * Measure the soundtrack so an author who cannot listen can still check it: every sound on its own\n * (length, level, loudest moment, brightness), when it plays and how loud the mix is there, the mix over\n * time, and issues. Pure: takes the mix and the list of sources that went into it.\n */\nexport function analyzeAudio(\n mix: PcmLike | null, sources: AudioDescriptor[], stats: MixStats | null, movieDuration: number, opts: AudioInspectOptions = {},\n): AudioReport {\n if (!mix) {\n return { duration: movieDuration, sampleRate: 0, peakDb: -120, peakAt: 0, sources: [], windows: [], issues: ['no audio: the movie has no audio layers (sound effects need no files: { type: \"audio\", sfx: \"pop\", at: 1 })'] };\n }\n const sr = mix.sampleRate;\n const chans = Array.from({ length: mix.numberOfChannels }, (_, c) => mix.getChannelData(c));\n const mixMono = mono(chans);\n const peakIn = (t0: number, t1: number): number => {\n let p = 0;\n const i1 = Math.min(mix.length, Math.ceil(t1 * sr));\n for (const d of chans) for (let i = Math.max(0, Math.floor(t0 * sr)); i < i1; i++) p = Math.max(p, Math.abs(d[i]!));\n return p;\n };\n\n // at least 10 ms: a smaller window would ask for a spectrum per sample\n const win = opts.window && opts.window > 0 ? Math.max(0.01, opts.window) : 0.1;\n const windows: AudioReport['windows'] = [];\n for (let t = 0; t < movieDuration - 1e-9; t += win) {\n const i0 = Math.floor(t * sr);\n const i1 = Math.min(mix.length, Math.floor((t + win) * sr));\n let sum = 0;\n let peak = 0;\n for (const d of chans) {\n for (let i = i0; i < i1; i++) {\n sum += d[i]! * d[i]!;\n peak = Math.max(peak, Math.abs(d[i]!));\n }\n }\n const n = Math.max(1, (i1 - i0) * chans.length);\n windows.push({ t: Math.round(t * 1000) / 1000, rmsDb: db(Math.sqrt(sum / n)), peakDb: db(peak), brightnessHz: spectralCentroid(mixMono, sr, i0, i1) });\n }\n\n const issues: string[] = [];\n if (stats && stats.peak > 1) {\n issues.push(`the mix peaks at ${db(stats.peak)} dBFS at ${stats.peakAt.toFixed(2)}s and was limited — lower the volume of the layers playing there`);\n }\n const rendered = new Map<string, SoundMeasure>();\n const soundOf = (s: AudioDescriptor): SoundMeasure => {\n if (s.synth) {\n let m = rendered.get(s.synth.key);\n if (!m) rendered.set(s.synth.key, (m = measure(s.synth.render(sr), sr)));\n return m;\n }\n const b = s.buffer!;\n return measure(Array.from({ length: b.numberOfChannels }, (_, c) => b.getChannelData(c)), b.sampleRate);\n };\n const list = [...sources].sort((a, b) => a.start - b.start).map(s => {\n const layer = s.layer ?? 'an audio layer';\n const source = s.source ?? 'audio';\n const peakDb = db(peakIn(s.start, Math.min(s.end, movieDuration)));\n const sound = soundOf(s);\n // The layer's OWN level: the sound's peak at the loudest volume it ever has. Judging the mix instead would\n // hide a nearly silent layer under a loud one.\n const topVolume = Math.max(s.initialVolume ?? 1, ...(s.volumeKeyframes ?? []).map(k => k.value));\n const ownDb = db(Math.pow(10, sound.peakDb / 20) * Math.max(0, topVolume));\n if (s.start >= movieDuration) {\n issues.push(`${layer} (${source}) starts at ${s.start.toFixed(2)}s, after the movie ends (${movieDuration}s)`);\n } else if (ownDb < INAUDIBLE_DB || peakDb < INAUDIBLE_DB) {\n issues.push(`${layer} (${source}) is inaudible from ${s.start.toFixed(2)}s to ${s.end.toFixed(2)}s (its own peak ${ownDb} dBFS at volume ${topVolume}; mix peak there ${peakDb} dBFS) — check its volume`);\n }\n if (s.synth && s.end > movieDuration + 1e-6 && s.start < movieDuration) {\n issues.push(`${layer} (${source}) is cut off by the end of the movie at ${movieDuration}s (it runs to ${s.end.toFixed(2)}s)`);\n }\n return { layer, source, start: s.start, end: s.end, peakDb, sound };\n });\n\n return {\n duration: movieDuration,\n sampleRate: sr,\n peakDb: db(stats?.peak ?? peakIn(0, movieDuration)),\n peakAt: stats?.peakAt ?? 0,\n sources: list,\n windows,\n issues,\n };\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\n/** Samples of silence an AAC encoder puts in front of the audio (its priming / encoder delay). */\nconst AAC_PRIMING_SAMPLES = 2112;\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 // AAC encoders emit AAC_PRIMING_SAMPLES of silence first. Starting the track that much earlier makes\n // mediabunny write an edit list that trims them, so the file's audio starts where the browser's does\n // (without it every sound in an MP4 / MOV was ~45 ms late). Opus signals its own pre-skip.\n const audioSource = new AudioBufferSource({\n codec: opts.audio.codec as any,\n bitrate: opts.audio.bitrate,\n }, { startTimestamp: opts.audio.codec === 'aac' ? -AAC_PRIMING_SAMPLES / movie.audioBuffer.sampleRate : 0 });\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\nexport interface TransitionWindow { from: string; to: string; start: number; end: number }\n\nconst windows = new WeakMap<object, TransitionWindow[]>();\n\n/**\n * The time windows (in the composition's own time) of the transitions that were expanded into `spec`.\n * Expansion removes `transitions` from the spec, so `inspect` reads them from here to know when two\n * scenes are blended on purpose.\n */\nexport function transitionWindowsOf(spec: object): readonly TransitionWindow[] {\n return windows.get(spec) ?? [];\n}\n\n/** Keep the windows when a spec is copied (a spread creates a new object, which the WeakMap does not know). */\nexport function carryTransitionWindows<T extends object>(from: object, to: T): T {\n const w = windows.get(from);\n if (w) windows.set(to, w);\n return to;\n}\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 const record = windows.get(out) ?? [];\n record.push({ from: t.from, to: t.to, start: tStart, end: tEnd });\n windows.set(out, record);\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';\nimport { transitionWindowsOf } from './Transitions';\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\nconst clip = (a: Rect, b: Rect): Rect | null => {\n const x = Math.max(a.x, b.x), y = Math.max(a.y, b.y);\n const w = Math.min(a.x + a.width, b.x + b.width) - x, h = Math.min(a.y + a.height, b.y + b.height) - y;\n return w > 0 && h > 0 ? { x, y, width: w, height: h } : null;\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 // What can actually be seen of a layer: its bounds cut to the canvas and to its mask (an inverted mask\n // cuts a hole instead, so it does not clip). Overlaps are judged on this, not on raw bounds.\n const seen = new Map<LayerInfo, Rect | null>();\n // Scenes that a running transition is blending: they overlap and move off the canvas by design.\n const scene = new Map<LayerInfo, string>();\n // Layers whose own or an ancestor's scale is 0, or a typewriter that has not typed yet: no size is expected.\n const scaledToNothing = new Set<LayerInfo>();\n\n const walk = (comp: CompositionSequence, prefix: string, insideThreeD: boolean, parentVisible: boolean, parentScene?: string, parentMoving = false, parentZero = false): void => {\n const blending = new Set<string>();\n for (const w of transitionWindowsOf(comp.spec)) {\n const start = (comp.absoluteStart ?? 0) + w.start, end = (comp.absoluteStart ?? 0) + w.end;\n if (time >= start - 1e-9 && time <= end + 1e-9) { blending.add(w.from); blending.add(w.to); }\n }\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 // moved by its own keyframes, or carried along by a parent that is (a panned timeline)\n const moving = parentMoving || ((seq.spec.keyframes ?? []).length > 0 && (keys.has('x') || keys.has('y')));\n const scale = (t as unknown as { scale?: { x: number; y: number } } | null)?.scale;\n const zero = parentZero || (!!scale && (scale.x === 0 || scale.y === 0));\n const info: LayerInfo = { path: prefix + label, name, type: seq.spec.type, threeD, visible, alpha, moving, bounds, onCanvas };\n layers.push(info);\n let shown = bounds ? clip(bounds, view) : null;\n const maskTarget = seq.maskSequence?.target as Container | null | undefined;\n if (shown && maskTarget && !(seq.spec as { maskInverted?: boolean }).maskInverted) {\n const m = maskTarget.getBounds();\n shown = clip(shown, { x: m.x, y: m.y, width: m.width, height: m.height });\n }\n seen.set(info, shown);\n const group = parentScene ?? (name !== undefined && blending.has(name) ? name : undefined);\n if (group) scene.set(info, group);\n if (zero || (seq as { showsNothingYet?: boolean }).showsNothingYet) scaledToNothing.add(info);\n if (seq instanceof CompositionSequence) walk(seq, prefix + label + '/', insideThreeD || threeD, visible, group, moving, zero);\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 if (scaledToNothing.has(l)) continue;\n issues.push(`${who} has no size (empty text, or not drawn yet)`);\n } else if (l.moving || scene.has(l)) {\n // on purpose crossing the canvas edge (marquee, slide-in, a slide / zoom transition): 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 = seen.get(texts[i]!), b = seen.get(texts[j]!);\n if (!a || !b) continue; // nothing of one of them is on screen\n const sa = scene.get(texts[i]!), sb = scene.get(texts[j]!);\n if (sa && sb && sa !== sb) continue; // the two scenes of a running transition\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","import { CompositionSequence } from '../sequences/Composition';\nimport type { Sequence } from '../sequences/Base';\nimport { transitionWindowsOf } from './Transitions';\nimport { resolveAt } from './Timeline';\n\n/** One layer (or a run of similar layers) on the timeline. Times are in seconds, absolute (from the start of the movie). */\nexport interface TimelineRow {\n /** `parent/child` for a layer inside a composition. */\n path: string;\n name: string;\n type: string;\n /** 0 for a top-level layer, 1 inside a composition, … */\n depth: number;\n start: number;\n end: number;\n /** When each keyframe starts (absolute seconds, sorted). */\n keys: number[];\n /** A grouped run: one span per layer it stands for. */\n parts?: Array<{ start: number; end: number }>;\n /** A short text for the tooltip (a text layer's words, an asset name). */\n detail?: string;\n}\nexport interface TimelineTransition { from: string; to: string; start: number; end: number }\nexport interface TimelineData {\n duration: number;\n rows: TimelineRow[];\n transitions: TimelineTransition[];\n}\n\nconst GROUP_MIN = 4;\nconst MAX_KEYS = 200;\nconst round = (n: number): number => Math.round(n * 1e6) / 1e6;\n\n/** `pop-12`, `ring9-1`, `text#9` → `pop-#`, `ring#-#`, `text#`: the part that makes similar layers one family. */\nconst family = (name: string): string => name.replace(/\\d+/g, '#');\n\nfunction detailOf(seq: Sequence): string | undefined {\n const s = seq.spec as { text?: unknown; asset?: unknown; sfx?: unknown };\n if (typeof s.text === 'string') return s.text.length > 60 ? s.text.slice(0, 57) + '…' : s.text;\n if (typeof s.asset === 'string') return `asset “${s.asset}”`;\n if (typeof s.sfx === 'string') return `sfx “${s.sfx}”`;\n if (s.sfx && typeof s.sfx === 'object') return 'sfx (custom)';\n return undefined;\n}\n\nfunction walk(comp: CompositionSequence, parentStart: number, parentEnd: number, depth: number, prefix: string, rows: TimelineRow[], transitions: TimelineTransition[]): void {\n const entries: Array<{ row: TimelineRow; inner: TimelineRow[]; groupable: boolean }> = [];\n comp._children.forEach((seq, i) => {\n const name = seq.spec.name ?? `${seq.spec.type}#${i}`;\n const start = parentStart + (seq.at ?? 0);\n // a layer without its own duration lasts as long as its parent: from its start, so it can run past the end; the end is the end\n const end = Math.min(parentEnd, seq.duration !== undefined ? start + seq.duration : parentEnd);\n const span = end - start;\n const keys = (seq.spec.keyframes ?? []).map(kf => round(start + resolveAt(kf.at, span))).sort((a, b) => a - b).slice(0, MAX_KEYS);\n const row: TimelineRow = { path: prefix + name, name, type: seq.spec.type, depth, start: round(start), end: round(end), keys, detail: detailOf(seq) };\n const inner: TimelineRow[] = [];\n const isComp = seq instanceof CompositionSequence;\n if (isComp) walk(seq, start, end, depth + 1, prefix + name + '/', inner, transitions);\n entries.push({ row, inner, groupable: !isComp });\n });\n rows.push(...groupFamilies(entries));\n for (const w of transitionWindowsOf(comp.spec)) {\n transitions.push({ from: prefix + w.from, to: prefix + w.to, start: round(parentStart + w.start), end: round(parentStart + w.end) });\n }\n}\n\n/**\n * Siblings of the same type whose names differ only by numbers (`ring10-0`, `ring9-1`, `pop-3` …), four or more, become ONE row\n * at the place of the first, with a part per layer: a movie with hundreds of generated layers stays readable. A composition is never grouped.\n */\nfunction groupFamilies(entries: Array<{ row: TimelineRow; inner: TimelineRow[]; groupable: boolean }>): TimelineRow[] {\n const buckets = new Map<string, TimelineRow[]>();\n for (const e of entries) {\n if (!e.groupable) continue;\n const key = e.row.type + '|' + family(e.row.name);\n (buckets.get(key) ?? buckets.set(key, []).get(key)!).push(e.row);\n }\n const out: TimelineRow[] = [];\n const done = new Set<string>();\n for (const e of entries) {\n const key = e.row.type + '|' + family(e.row.name);\n const members = e.groupable ? buckets.get(key)! : null;\n if (members && members.length >= GROUP_MIN) {\n if (done.has(key)) continue; // already drawn at the first member's place\n done.add(key);\n const label = `${family(e.row.name)} ×${members.length}`;\n out.push({\n path: e.row.path.slice(0, e.row.path.length - e.row.name.length) + label, name: label, type: e.row.type, depth: e.row.depth,\n start: Math.min(...members.map(x => x.start)), end: Math.max(...members.map(x => x.end)),\n keys: members.flatMap(x => x.keys).sort((a, b) => a - b).slice(0, MAX_KEYS),\n parts: members.map(x => ({ start: x.start, end: x.end })),\n });\n } else {\n out.push(e.row, ...e.inner);\n continue;\n }\n out.push(...e.inner);\n }\n return out;\n}\n\n/** Every layer of the movie as rows with absolute times, plus the transition windows. Pure data: read it, or draw it with `timelineHtml`. */\nexport function collectTimeline(root: CompositionSequence, duration: number): TimelineData {\n const rows: TimelineRow[] = [];\n const transitions: TimelineTransition[] = [];\n walk(root, 0, duration, 0, '', rows, transitions);\n return { duration, rows, transitions };\n}\n\n// ───────────────────────────── the chart ─────────────────────────────\n\nconst COLORS: Record<string, string> = {\n text: '#4cc9f0', shape: '#ffd166', image: '#7bd88f', video: '#c77dff', audio: '#ff7aa8',\n composition: '#8ea4c8', three: '#ff9f68', camera: '#b0b0b0',\n};\nconst esc = (s: string): string => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\nconst num = (n: number): string => String(Math.round(n * 100) / 100);\n\n/** The smallest tick spacing (seconds) that is at least ~70 px apart on a chart `chartWidth` px wide. */\nfunction tickStep(duration: number, chartWidth: number): number {\n for (const s of [0.04, 0.1, 0.2, 0.5, 1, 2, 5, 10, 15, 30, 60, 120, 300, 600, 1200, 3600]) if ((s / duration) * chartWidth >= 70) return s;\n return 7200;\n}\n\nexport interface TimelineHtmlOptions { title?: string }\nexport interface TimelineSvgOptions {\n /** How many pixels the whole duration takes (default 950). A viewer re-draws at a wider width to zoom; the ticks get finer with it. */\n chartWidth?: number;\n /** Draw the layer names in a column on the left (default true). A viewer that scrolls sideways keeps its own, fixed column. */\n labels?: boolean;\n}\n\n/**\n * The chart alone: one `<svg>` (inline, no scripts). Its geometry is in data attributes (`data-duration`, `data-x0` / `data-x1`:\n * where 0 s and the end are in the viewBox, `data-top` / `data-bottom`, `data-row`), and every row is `<g class=\"row\" data-start>`,\n * so a viewer can turn a click into a time, draw a playhead, and seek to a row.\n */\nexport function timelineSvg(data: TimelineData, opts: TimelineSvgOptions = {}): string {\n const CHART = Math.max(100, opts.chartWidth ?? 950), withLabels = opts.labels !== false;\n const LABEL = withLabels ? 250 : 0, ROW = 22, TOP = 34, PAD = 16;\n const W = LABEL + CHART + PAD * 2, H = TOP + data.rows.length * ROW + PAD;\n const x = (t: number): number => PAD + LABEL + (Math.max(0, Math.min(data.duration, t)) / data.duration) * CHART;\n const step = tickStep(data.duration, CHART);\n const out: string[] = [];\n\n // ruler and grid\n for (let t = 0; t <= data.duration + 1e-9; t += step) {\n out.push(`<line class=\"grid\" x1=\"${num(x(t))}\" y1=\"${TOP - 6}\" x2=\"${num(x(t))}\" y2=\"${H - PAD}\"/>`);\n out.push(`<text class=\"tick\" x=\"${num(x(t))}\" y=\"${TOP - 12}\" text-anchor=\"middle\">${num(t)}${t === 0 || Math.abs(t - data.duration) < 1e-9 ? ' s' : ''}</text>`);\n }\n if (Math.abs(data.duration % step) > 1e-9) out.push(`<text class=\"tick\" x=\"${num(x(data.duration))}\" y=\"${TOP - 12}\" text-anchor=\"middle\">${num(data.duration)} s</text>`);\n\n // transitions: a band across every row, drawn under the bars\n for (const t of data.transitions) {\n out.push(`<g><title>transition ${esc(t.from)} → ${esc(t.to)} (${num(t.start)}–${num(t.end)} s)</title><rect class=\"transition\" x=\"${num(x(t.start))}\" y=\"${TOP - 4}\" width=\"${num(Math.max(2, x(t.end) - x(t.start)))}\" height=\"${H - TOP - PAD + 4}\"/></g>`);\n }\n\n data.rows.forEach((r, i) => {\n const y = TOP + i * ROW;\n const color = COLORS[r.type] ?? '#9aa7b8';\n const tip = `${r.path} · ${r.type} · ${num(r.start)}–${num(r.end)} s (${num(r.end - r.start)} s)${r.keys.length ? ` · ${r.keys.length} keyframe${r.keys.length > 1 ? 's' : ''}` : ''}${r.detail ? ` · ${r.detail}` : ''}`;\n out.push(`<g class=\"row\" data-start=\"${num(r.start)}\"><title>${esc(tip)}</title>`);\n out.push(`<rect class=\"band\" x=\"${PAD}\" y=\"${y}\" width=\"${LABEL + CHART}\" height=\"${ROW}\" ${i % 2 ? 'fill-opacity=\".05\"' : 'fill-opacity=\"0\"'}/>`);\n if (withLabels) out.push(`<text class=\"label\" x=\"${PAD + 6 + r.depth * 14}\" y=\"${y + 15}\">${esc(r.name)}</text>`);\n for (const p of r.parts ?? [{ start: r.start, end: r.end }]) {\n out.push(`<rect class=\"bar\" x=\"${num(x(p.start))}\" y=\"${y + 4}\" width=\"${num(Math.max(2, x(p.end) - x(p.start)))}\" height=\"${ROW - 8}\" rx=\"3\" fill=\"${color}\"/>`);\n }\n for (const k of r.keys) out.push(`<path class=\"key\" d=\"M ${num(x(k))} ${y + 7} l 3 4 l -3 4 l -3 -4 z\"/>`);\n out.push('</g>');\n });\n\n const legend = Object.entries(COLORS).map(([type, c], i) => `<g transform=\"translate(${PAD + i * 108},${H + 10})\"><rect width=\"12\" height=\"12\" rx=\"3\" fill=\"${c}\"/><text x=\"18\" y=\"10\" class=\"tick\">${type}</text></g>`).join('');\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${W}\" height=\"${H + 32}\" viewBox=\"0 0 ${W} ${H + 32}\" role=\"img\" aria-label=\"Timeline of ${data.rows.length} rows\" data-duration=\"${num(data.duration)}\" data-x0=\"${num(x(0))}\" data-x1=\"${num(x(data.duration))}\" data-top=\"${TOP - 6}\" data-bottom=\"${H - PAD}\" data-row=\"${ROW}\">\n${out.join('\\n')}\n${legend}\n</svg>`;\n}\n\n/** One self-contained HTML page (an inline SVG, no scripts): the layers as bars on a time axis. */\nexport function timelineHtml(data: TimelineData, opts: TimelineHtmlOptions = {}): string {\n const W = 250 + 950 + 32;\n const title = esc(opts.title ?? 'Timeline');\n return `<!doctype html>\n<html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>${title} — timeline</title>\n<style>\n :root { --bg: #f7f5f1; --ink: #1d2433; --dim: #6b7587; --grid: #d9d5cc; --key: #1d2433; --trans: #4cc9f0; }\n @media (prefers-color-scheme: dark) { :root { --bg: #0e1320; --ink: #e8eefc; --dim: #8fa0bf; --grid: #26304a; --key: #ffffff; --trans: #4cc9f0; } }\n body { margin: 0; background: var(--bg); color: var(--ink); font: 14px system-ui, sans-serif; }\n main { padding: 20px 16px 32px; max-width: ${W + 32}px; margin: 0 auto; overflow-x: auto; }\n h1 { font-size: 18px; font-weight: 600; margin: 0 0 4px; }\n p { margin: 0 0 14px; color: var(--dim); font-size: 13px; }\n svg { display: block; }\n .grid { stroke: var(--grid); stroke-width: 1; }\n .tick { fill: var(--dim); font-size: 11px; }\n .label { fill: var(--ink); font-size: 12px; font-family: ui-monospace, Menlo, monospace; }\n .band { fill: var(--ink); }\n .key { fill: var(--key); opacity: .85; }\n .transition { fill: var(--trans); opacity: .16; }\n .bar { opacity: .88; }\n .row:hover .bar { opacity: 1; }\n</style></head>\n<body><main>\n<h1>${title}</h1>\n<p>${data.rows.length} row${data.rows.length === 1 ? '' : 's'} · ${num(data.duration)} s · ◆ keyframe start · shaded band: a transition · hover a bar for details</p>\n${timelineSvg(data)}\n</main></body></html>\n`;\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","/** The part of an AudioContext this needs (so a test can pass a fake). */\nexport interface ResumableContext {\n state: string;\n resume?: () => Promise<void>;\n addEventListener(type: 'statechange', fn: () => void): void;\n removeEventListener(type: 'statechange', fn: () => void): void;\n}\n\n/**\n * Run `start` once the context is `running`. A browser keeps a new AudioContext `suspended` until the user has\n * interacted with the page; scheduling a sound then would play it at a stale position once the context wakes up.\n * So when it is not running we ask it to resume and wait, and `start` reads the movie's position at that moment.\n * `gesture` (the window) is where the user's first click / key press is heard: resume() is asked again then.\n * Returns a cancel function (pause before the browser allowed the sound).\n */\nexport function startWhenRunning(ctx: ResumableContext, start: () => void, gesture?: EventTarget): () => void {\n if (ctx.state === 'running') { start(); return () => {}; }\n let done = false;\n const resume = (): void => { ctx.resume?.()?.catch(() => { /* still blocked: the picture plays silently */ }); };\n const stop = (): void => {\n done = true;\n ctx.removeEventListener('statechange', onState);\n for (const e of GESTURES) gesture?.removeEventListener(e, resume, true);\n };\n const onState = (): void => {\n if (done || ctx.state !== 'running') return;\n stop();\n start();\n };\n ctx.addEventListener('statechange', onState);\n // A resume() asked for before any user gesture is not granted later by itself (Chrome): ask again on the first one.\n for (const e of GESTURES) gesture?.addEventListener(e, resume, true);\n resume();\n return stop;\n}\n\nconst GESTURES = ['pointerdown', 'mousedown', 'touchend', 'keydown'];\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, limitMix, type MixStats } from './AudioMixer';\nimport { analyzeAudio, type AudioReport, type AudioInspectOptions } from './inspectAudio';\nimport { exportFrames } from './Renderer';\nimport { expandTransitions, carryTransitionWindows } from './Transitions';\nimport { inspectScene, type InspectReport, type InspectOptions } from './inspect';\nimport { collectTimeline, timelineHtml, timelineSvg, type TimelineData, type TimelineHtmlOptions, type TimelineSvgOptions } from './timelineChart';\nimport { pickFrames, sheetLayout } from './frames';\nimport { warnUnknownOptions } from './options';\nimport { startWhenRunning } from './startWhenRunning';\nimport { ensureFilterLibrary } from '../filters/named';\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 _cancelAudioStart: (() => void) | 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 /** What went into the mix, and its peak before limiting — kept for inspectAudio(). */\n private _audioSources: AudioDescriptor[] = [];\n private _mixStats: MixStats | 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: 'play', fn: () => 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 await ensureFilterLibrary(seededComposition); // pixi-filters, only when a layer names one of its filters\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 if (userComposition) carryTransitionWindows(userComposition, rootSeqSpec);\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 if (this.audioBuffer) this._mixStats = limitMix(this.audioBuffer, audios);\n }\n this._audioSources = audios;\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 * Every layer as a row with absolute start / end / keyframe times (seconds), plus the transition windows. Runs of\n * similar layers (`pop-1` … `pop-12`) are one row with a `parts` span each. Read it, or draw it with `timelineChart()`.\n */\n timelineData(): TimelineData {\n this._requireReady('timelineData');\n return collectTimeline(this._rootSequence as CompositionSequence, this.duration);\n }\n\n /** The timeline as one self-contained HTML page (an inline SVG, no scripts): layers as bars on a time axis, ◆ keyframes, transition bands. Open it in a browser. */\n timelineChart(opts: TimelineHtmlOptions = {}): string {\n warnUnknownOptions('movie.timelineChart()', opts, ['title']);\n return timelineHtml(this.timelineData(), opts);\n }\n\n /** Just the chart: one `<svg>` whose geometry is in `data-*` attributes (a viewer puts a playhead on it: `pixi-effects-view`). */\n timelineSvg(opts: TimelineSvgOptions = {}): string {\n warnUnknownOptions('movie.timelineSvg()', opts, ['chartWidth', 'labels']);\n return timelineSvg(this.timelineData(), opts);\n }\n\n /**\n * The soundtrack, measured: when every audio layer plays, how loud the mix is over time, and `issues`\n * (limiting, inaudible layers, sounds cut off by the end). Use it to CHECK sound you cannot hear.\n */\n inspectAudio(opts: AudioInspectOptions = {}): AudioReport {\n warnUnknownOptions('movie.inspectAudio()', opts, ['window']);\n this._requireReady('inspectAudio');\n return analyzeAudio(this.audioBuffer, this._audioSources, this._mixStats, this.duration, 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 this._rootSequence?.syncFrame();\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 const wasPlaying = this.isPlaying;\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 const buffer = this.audioBuffer;\n this._cancelAudioStart?.();\n // A browser keeps the context suspended until the user has interacted with the page: start the sound when it\n // runs, from the position the movie has reached by then, instead of at a stale offset.\n this._cancelAudioStart = startWhenRunning(ctx, () => {\n if (!this.isPlaying) return;\n this.audioSource = ctx.createBufferSource();\n this.audioSource.buffer = buffer;\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, Math.min(this.currentFrame / this.frameRate, buffer.duration));\n }, typeof window !== 'undefined' ? window : undefined);\n }\n if (!wasPlaying) this.emit('play');\n }\n\n pause(): void {\n const wasPlaying = this.isPlaying;\n this.isPlaying = false;\n this._cancelAudioStart?.();\n this._cancelAudioStart = null;\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 this._audioSources = [];\n this._mixStats = 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 { CanvasTextMetrics, TextStyle } from 'pixi.js';\nimport { suggestName, warnUnknownOptions } from '../core/options';\n\n/** A text style as written in a `text` layer's `style` (numbers, not expressions, for the fields that size the text). */\nexport type MeasureStyle = Record<string, unknown>;\n\nexport interface TextSize {\n width: number;\n height: number;\n /** Number of lines. */\n lines: number;\n}\n\nexport interface SplitOptions {\n /** What a piece is: one visible character (default), one word, or one line. */\n by?: 'chars' | 'words' | 'lines';\n /** Where the text goes: `x` is its left edge, or its centre / right edge with `align`. Default 0. */\n x?: number;\n /** Top of the first line. Default 0. */\n y?: number;\n /** How each line sits on `x`. Default `'left'`. */\n align?: 'left' | 'center' | 'right';\n}\n\nexport interface TextPiece {\n text: string;\n /** Left edge of the piece, for a text layer with `anchorX: 0` (the default for text). */\n x: number;\n /** Top of the piece's line, for a text layer with `anchorY: 0`. */\n y: number;\n width: number;\n /** Position in the returned list, 0-based. */\n index: number;\n /** Which line (0-based) the piece is on. */\n line: number;\n}\n\nconst BY = ['chars', 'words', 'lines'] as const;\nconst ALIGN = ['left', 'center', 'right'] as const;\n\nconst widthOf = (text: string, style: TextStyle): number => CanvasTextMetrics.measureText(text, style).width;\n\n/**\n * How big `text` is drawn with `style`: the same numbers a text layer with that style has, measured with the font the\n * renderer will use. A web font must be loaded first (`await document.fonts.load('24px \"Name\"')`), or the width is a\n * fallback font's.\n */\nexport function measureText(text: string, style: MeasureStyle = {}): TextSize {\n const m = CanvasTextMetrics.measureText(text, new TextStyle(style as never));\n return { width: m.width, height: m.height, lines: text.split('\\n').length };\n}\n\n/**\n * Cut `text` into characters, words or lines and give each piece the x / y it needs so that one text layer per piece\n * (same `style`, `anchorX: 0`, `anchorY: 0`) reads exactly like the whole text: per-letter and per-word animation without\n * measuring anything by hand. Kerning is kept (a piece's x is the measured width of everything before it). Whitespace is\n * not returned as a piece, but it takes its room. Lines are split on `\\n` and go down by the style's line height.\n *\n * ```js\n * splitText('Hello world', style, { by: 'words', x: 640, y: 300, align: 'center' })\n * .map(p => ({ type: 'text', text: p.text, style, initial: { x: p.x, y: p.y, alpha: 0 }, at: 0.2 * p.index, ... }))\n * ```\n */\nexport function splitText(text: string, style: MeasureStyle = {}, opts: SplitOptions = {}): TextPiece[] {\n warnUnknownOptions('splitText()', opts as Record<string, unknown>, ['by', 'x', 'y', 'align']);\n let by = opts.by ?? 'chars';\n if (!(BY as readonly string[]).includes(by)) {\n const g = suggestName(String(by), BY);\n console.warn(`pixi-effects: splitText(): by \"${by}\" is not one of ${BY.map(b => `\"${b}\"`).join(', ')}${g ? ` — did you mean \"${g}\"?` : ''}; using \"chars\"`);\n by = 'chars';\n }\n let align = opts.align ?? 'left';\n if (!(ALIGN as readonly string[]).includes(align)) {\n const g = suggestName(String(align), ALIGN);\n console.warn(`pixi-effects: splitText(): align \"${align}\" is not one of ${ALIGN.join(', ')}${g ? ` — did you mean \"${g}\"?` : ''}; using \"left\"`);\n align = 'left';\n }\n const x0 = opts.x ?? 0, y0 = opts.y ?? 0;\n if (text === '') return [];\n\n const ts = new TextStyle(style as never);\n const lineHeight = CanvasTextMetrics.measureText('M', ts).lineHeight ?? CanvasTextMetrics.measureText('M', ts).height;\n const sentinel = widthOf('|', ts); // measuring \"prefix|\" − \"|\" keeps trailing spaces in the prefix\n const out: TextPiece[] = [];\n\n text.split('\\n').forEach((line, lineNo) => {\n const lineWidth = widthOf(line, ts);\n const left = align === 'center' ? x0 - lineWidth / 2 : align === 'right' ? x0 - lineWidth : x0;\n const y = y0 + lineNo * lineHeight;\n const advance = (upTo: number): number => (upTo === 0 ? 0 : widthOf(line.slice(0, upTo) + '|', ts) - sentinel);\n\n // [start, end) of every piece on this line\n const spans: Array<[number, number]> = [];\n if (by === 'lines') {\n if (line.trim() !== '') spans.push([0, line.length]);\n } else if (by === 'words') {\n for (const m of line.matchAll(/\\S+/g)) spans.push([m.index!, m.index! + m[0].length]);\n } else {\n for (let i = 0; i < line.length; i++) if (!/\\s/.test(line[i]!)) spans.push([i, i + 1]);\n }\n for (const [a, b] of spans) {\n const piece = line.slice(a, b);\n out.push({ text: piece, x: left + advance(a), y, width: widthOf(piece, ts), index: out.length, line: lineNo });\n }\n });\n return out;\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/AssetLoader.ts","../src/core/AudioMixer.ts","../src/core/spectrum.ts","../src/core/inspectAudio.ts","../src/core/Renderer.ts","../src/filters/TransitionMask.ts","../src/core/Transitions.ts","../src/core/inspect.ts","../src/core/timelineChart.ts","../src/core/frames.ts","../src/core/startWhenRunning.ts","../src/core/Movie.ts","../src/text/measure.ts","../src/presets/kenBurns.ts","../src/presets/_ease.ts","../src/presets/orbit.ts","../src/transforms/withFade.ts"],"names":["extensions","ExtensionType","Input","BlobSource","ALL_FORMATS","Output","WavOutputFormat","BufferTarget","Conversion","VideoSampleSink","Assets","num","windows","getFirstEncodableAudioCodec","QUALITY_VERY_LOW","QUALITY_LOW","QUALITY_MEDIUM","QUALITY_HIGH","QUALITY_VERY_HIGH","Mp4OutputFormat","MovOutputFormat","WebMOutputFormat","MkvOutputFormat","CanvasSource","AudioBufferSource","Filter","GlProgram","defaultFilterVert","GpuProgram","UniformGroup","resolveAt","walk","collectPropKeys","CompositionSequence","CullerPlugin","gsap","PixiPlugin","PIXI","warnUnknownOptions","Application","Container","Rectangle","ensureFilterLibrary","Culler","CanvasTextMetrics","TextStyle","suggestName","homeDistance","DEFAULT_FOV","DEG"],"mappings":"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","file":"index.cjs","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 // A synthesised sound is rendered once per mix, at the mix's own rate, however often it is used.\n const synthesised = new Map<string, AudioBuffer>();\n const bufferOf = (a: AudioDescriptor): AudioBuffer | null => {\n if (a.buffer) return a.buffer;\n if (!a.synth) return null;\n let buf = synthesised.get(a.synth.key);\n if (!buf) {\n const [left, right] = a.synth.render(sampleRate);\n buf = ctx.createBuffer(2, left.length, sampleRate);\n buf.getChannelData(0).set(left);\n buf.getChannelData(1).set(right);\n synthesised.set(a.synth.key, buf);\n }\n return buf;\n };\n for (const a of audios) {\n const buffer = bufferOf(a);\n if (!buffer) continue;\n // Web Audio throws on a negative time. A sound that starts before the movie (a negative `at`, e.g.\n // `at = hit - duration` near 0) is mixed from 0 with its first seconds cut off, and its volume points\n // are clamped to 0.\n const begin = Math.max(0, a.start);\n const skipped = begin - a.start;\n if (skipped > 0) {\n console.warn(\n `pixi-effects: ${a.layer ?? 'an audio layer'} starts at ${a.start.toFixed(2)}s, before the movie starts, so its first ${skipped.toFixed(2)}s are cut off. ` +\n `Start it at 0 or later.`,\n );\n }\n const src = ctx.createBufferSource();\n src.buffer = buffer;\n src.loop = !!a.loop;\n const gain = ctx.createGain();\n gain.gain.setValueAtTime(a.initialVolume ?? 1, begin);\n for (const kf of a.volumeKeyframes ?? []) {\n gain.gain.linearRampToValueAtTime(kf.value, Math.max(0, kf.time));\n }\n src.connect(gain).connect(ctx.destination);\n src.start(begin, skipped);\n src.stop(Math.max(begin, a.end));\n }\n return await ctx.startRendering();\n}\n\n/** Peak of the mix before limiting, and where it is. `peak > 1` means the mix had to be limited. */\nexport interface MixStats {\n peak: number;\n peakAt: number;\n}\n\n/** Above this the mix is bent smoothly toward 1 instead of clipping. */\nconst KNEE = 0.9;\n\n/**\n * Keep the finished mix inside [-1, 1]: samples above KNEE are soft-limited (tanh), so overlapping sounds\n * never wrap or crackle in the encoder. Pure and deterministic; a mix that never exceeds KNEE is untouched.\n * Warns once, naming the layers that play at the loudest moment, when the mix went over 1.\n */\nexport function limitMix(buffer: AudioBuffer, audios: AudioDescriptor[]): MixStats {\n let peak = 0;\n let peakIndex = 0;\n for (let ch = 0; ch < buffer.numberOfChannels; ch++) {\n const d = buffer.getChannelData(ch);\n for (let i = 0; i < d.length; i++) {\n const x = Math.abs(d[i]!);\n if (x > peak) { peak = x; peakIndex = i; }\n if (x > KNEE) d[i] = Math.sign(d[i]!) * (KNEE + (1 - KNEE) * Math.tanh((x - KNEE) / (1 - KNEE)));\n }\n }\n const peakAt = peakIndex / buffer.sampleRate;\n if (peak > 1) {\n const playing = audios.filter(a => a.start <= peakAt && peakAt < a.end).map(a => a.layer ?? 'an audio layer');\n console.warn(\n `pixi-effects: the audio mix peaks at ${peak.toFixed(2)} (${(20 * Math.log10(peak)).toFixed(1)} dBFS) at ${peakAt.toFixed(2)}s, so it was limited ` +\n `(it would distort). Playing there: ${[...new Set(playing)].join(', ')}. Lower their volume.`,\n );\n }\n return { peak, peakAt };\n}\n","/** In-place radix-2 FFT (re/im arrays of the same power-of-two length). */\nfunction fft(re: Float64Array, im: Float64Array): void {\n const n = re.length;\n for (let i = 1, j = 0; i < n; i++) {\n let bit = n >> 1;\n for (; j & bit; bit >>= 1) j ^= bit;\n j ^= bit;\n if (i < j) { [re[i], re[j]] = [re[j]!, re[i]!]; [im[i], im[j]] = [im[j]!, im[i]!]; }\n }\n for (let len = 2; len <= n; len <<= 1) {\n const ang = (-2 * Math.PI) / len;\n for (let i = 0; i < n; i += len) {\n for (let k = 0; k < len / 2; k++) {\n const wr = Math.cos(ang * k), wi = Math.sin(ang * k);\n const a = i + k, b = a + len / 2;\n const xr = re[b]! * wr - im[b]! * wi, xi = re[b]! * wi + im[b]! * wr;\n re[b] = re[a]! - xr; im[b] = im[a]! - xi;\n re[a] = re[a]! + xr; im[a] = im[a]! + xi;\n }\n }\n }\n}\n\nconst FRAME = 2048;\n\n/**\n * Spectral centroid (\"brightness\") in Hz of `samples[from, to)`: the power-weighted mean frequency\n * over Hann-windowed 2048-sample frames (louder frames count more). 0 for silence.\n * Rough guide: < 500 Hz dark / boomy, 1–3 kHz mid, > 4 kHz bright / airy.\n */\nexport function spectralCentroid(samples: Float32Array, sampleRate: number, from = 0, to = samples.length): number {\n let num = 0;\n let den = 0;\n const re = new Float64Array(FRAME);\n const im = new Float64Array(FRAME);\n const end = Math.min(to, samples.length);\n for (let start = Math.max(0, from); start < end; start += FRAME / 2) {\n for (let i = 0; i < FRAME; i++) {\n const k = start + i;\n const w = 0.5 - 0.5 * Math.cos((2 * Math.PI * i) / (FRAME - 1));\n re[i] = k < end ? samples[k]! * w : 0;\n im[i] = 0;\n }\n fft(re, im);\n for (let b = 1; b < FRAME / 2; b++) {\n const power = re[b]! * re[b]! + im[b]! * im[b]!;\n num += power * ((b * sampleRate) / FRAME);\n den += power;\n }\n }\n return den > 1e-9 ? Math.round(num / den / 10) * 10 : 0;\n}\n","import type { AudioDescriptor } from '../types';\nimport type { MixStats } from './AudioMixer';\nimport { spectralCentroid } from './spectrum';\n\nexport interface AudioInspectOptions {\n /** Width of each loudness window in seconds. Default 0.1. */\n window?: number;\n}\n\n/** One sound measured ON ITS OWN (not mixed), so overlapping layers do not blur it. */\nexport interface SoundMeasure {\n /** Seconds of audio the source has (an sfx: its length; a file: the file's length). */\n length: number;\n /** Its own loudest sample, dBFS (before the layer's volume). */\n peakDb: number;\n /** Seconds from its start to its loudest sample — the moment to line up with the picture. */\n loudestAt: number;\n /** Spectral centroid in Hz: < 500 dark / boomy, 1–4 k mid, > 8 k airy / hissy. */\n brightnessHz: number;\n}\n\nexport interface AudioSourceReport {\n /** `layer \"pop-1\"` (or `unnamed audio layer`). */\n layer: string;\n /** `sfx \"pop\"`, `asset \"bgm\"`, `video \"green\"`. */\n source: string;\n /** Movie time, seconds. */\n start: number;\n end: number;\n /** Loudest sample of the MIX while this source plays, dBFS (−120 = silence). */\n peakDb: number;\n sound: SoundMeasure;\n}\n\nexport interface AudioReport {\n duration: number;\n sampleRate: number;\n /** Loudest sample of the mix before limiting, dBFS. Above 0 the mix was limited. */\n peakDb: number;\n peakAt: number;\n /** Every audio layer / video soundtrack in the mix, in start order. */\n sources: AudioSourceReport[];\n /** The mix over time: one row per window, `t` = window start. */\n windows: Array<{ t: number; rmsDb: number; peakDb: number; brightnessHz: number }>;\n /** Problems worth fixing: limiting, inaudible layers, sounds cut off by the end of the movie. Read this first. */\n issues: string[];\n}\n\ninterface PcmLike {\n numberOfChannels: number;\n sampleRate: number;\n length: number;\n getChannelData(ch: number): Float32Array;\n}\n\n/** Below this a source counts as inaudible. */\nconst INAUDIBLE_DB = -50;\n\nconst db = (x: number): number => Math.round(10 * Math.max(-120, 20 * Math.log10(x))) / 10;\nconst mono = (chans: Float32Array[]): Float32Array => {\n if (chans.length === 1) return chans[0]!;\n const out = new Float32Array(chans[0]!.length);\n for (const d of chans) for (let i = 0; i < out.length; i++) out[i] = out[i]! + d[i]! / chans.length;\n return out;\n};\n\nfunction measure(chans: Float32Array[], sampleRate: number): SoundMeasure {\n let peak = 0;\n let at = 0;\n for (const d of chans) for (let i = 0; i < d.length; i++) if (Math.abs(d[i]!) > peak) { peak = Math.abs(d[i]!); at = i; }\n return {\n length: Math.round((chans[0]!.length / sampleRate) * 1000) / 1000,\n peakDb: db(peak),\n loudestAt: Math.round((at / sampleRate) * 1000) / 1000,\n brightnessHz: spectralCentroid(mono(chans), sampleRate),\n };\n}\n\n/**\n * Measure the soundtrack so an author who cannot listen can still check it: every sound on its own\n * (length, level, loudest moment, brightness), when it plays and how loud the mix is there, the mix over\n * time, and issues. Pure: takes the mix and the list of sources that went into it.\n */\nexport function analyzeAudio(\n mix: PcmLike | null, sources: AudioDescriptor[], stats: MixStats | null, movieDuration: number, opts: AudioInspectOptions = {},\n): AudioReport {\n if (!mix) {\n return { duration: movieDuration, sampleRate: 0, peakDb: -120, peakAt: 0, sources: [], windows: [], issues: ['no audio: the movie has no audio layers (sound effects need no files: { type: \"audio\", sfx: \"pop\", at: 1 })'] };\n }\n const sr = mix.sampleRate;\n const chans = Array.from({ length: mix.numberOfChannels }, (_, c) => mix.getChannelData(c));\n const mixMono = mono(chans);\n const peakIn = (t0: number, t1: number): number => {\n let p = 0;\n const i1 = Math.min(mix.length, Math.ceil(t1 * sr));\n for (const d of chans) for (let i = Math.max(0, Math.floor(t0 * sr)); i < i1; i++) p = Math.max(p, Math.abs(d[i]!));\n return p;\n };\n\n // at least 10 ms: a smaller window would ask for a spectrum per sample\n const win = opts.window && opts.window > 0 ? Math.max(0.01, opts.window) : 0.1;\n const windows: AudioReport['windows'] = [];\n for (let t = 0; t < movieDuration - 1e-9; t += win) {\n const i0 = Math.floor(t * sr);\n const i1 = Math.min(mix.length, Math.floor((t + win) * sr));\n let sum = 0;\n let peak = 0;\n for (const d of chans) {\n for (let i = i0; i < i1; i++) {\n sum += d[i]! * d[i]!;\n peak = Math.max(peak, Math.abs(d[i]!));\n }\n }\n const n = Math.max(1, (i1 - i0) * chans.length);\n windows.push({ t: Math.round(t * 1000) / 1000, rmsDb: db(Math.sqrt(sum / n)), peakDb: db(peak), brightnessHz: spectralCentroid(mixMono, sr, i0, i1) });\n }\n\n const issues: string[] = [];\n if (stats && stats.peak > 1) {\n issues.push(`the mix peaks at ${db(stats.peak)} dBFS at ${stats.peakAt.toFixed(2)}s and was limited — lower the volume of the layers playing there`);\n }\n const rendered = new Map<string, SoundMeasure>();\n const soundOf = (s: AudioDescriptor): SoundMeasure => {\n if (s.synth) {\n let m = rendered.get(s.synth.key);\n if (!m) rendered.set(s.synth.key, (m = measure(s.synth.render(sr), sr)));\n return m;\n }\n const b = s.buffer!;\n return measure(Array.from({ length: b.numberOfChannels }, (_, c) => b.getChannelData(c)), b.sampleRate);\n };\n const list = [...sources].sort((a, b) => a.start - b.start).map(s => {\n const layer = s.layer ?? 'an audio layer';\n const source = s.source ?? 'audio';\n const peakDb = db(peakIn(s.start, Math.min(s.end, movieDuration)));\n const sound = soundOf(s);\n // The layer's OWN level: the sound's peak at the loudest volume it ever has. Judging the mix instead would\n // hide a nearly silent layer under a loud one.\n const topVolume = Math.max(s.initialVolume ?? 1, ...(s.volumeKeyframes ?? []).map(k => k.value));\n const ownDb = db(Math.pow(10, sound.peakDb / 20) * Math.max(0, topVolume));\n if (s.start >= movieDuration) {\n issues.push(`${layer} (${source}) starts at ${s.start.toFixed(2)}s, after the movie ends (${movieDuration}s)`);\n } else if (ownDb < INAUDIBLE_DB || peakDb < INAUDIBLE_DB) {\n issues.push(`${layer} (${source}) is inaudible from ${s.start.toFixed(2)}s to ${s.end.toFixed(2)}s (its own peak ${ownDb} dBFS at volume ${topVolume}; mix peak there ${peakDb} dBFS) — check its volume`);\n }\n if (s.synth && s.end > movieDuration + 1e-6 && s.start < movieDuration) {\n issues.push(`${layer} (${source}) is cut off by the end of the movie at ${movieDuration}s (it runs to ${s.end.toFixed(2)}s)`);\n }\n return { layer, source, start: s.start, end: s.end, peakDb, sound };\n });\n\n return {\n duration: movieDuration,\n sampleRate: sr,\n peakDb: db(stats?.peak ?? peakIn(0, movieDuration)),\n peakAt: stats?.peakAt ?? 0,\n sources: list,\n windows,\n issues,\n };\n}\n","import {\n Output, Mp4OutputFormat, MovOutputFormat, WebMOutputFormat, MkvOutputFormat,\n BufferTarget, CanvasSource, AudioBufferSource, getFirstEncodableAudioCodec,\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\n/** Audio codecs to try for each container, best first (the first one the browser can encode wins). */\nconst AUDIO_PREFERENCE = {\n mp4: ['aac', 'opus', 'mp3', 'flac'],\n mov: ['aac', 'mp3'],\n webm: ['opus', 'vorbis'],\n mkv: ['opus', 'vorbis', 'aac', 'flac', 'mp3'],\n} as const;\n\n/**\n * The audio codec to write. Not every browser can encode every codec: Chrome on Linux has no AAC encoder, which used to make every\n * mp4 / mov with sound fail with a message about encoder configurations. Unless the caller named a codec, use the first one in\n * `AUDIO_PREFERENCE` that this browser can encode (and say so); a codec the caller named is never swapped, but a failure says which would work.\n */\nasync function chooseAudioCodec(\n fmt: 'mp4' | 'mov' | 'webm' | 'mkv', requested: string | undefined, container: unknown, audio: AudioBuffer, bitrate: Quality,\n): Promise<string> {\n const supported = (container as { getSupportedAudioCodecs?: () => string[] }).getSupportedAudioCodecs?.();\n const preferred = AUDIO_PREFERENCE[fmt].filter(c => !supported || supported.includes(c));\n const canEncode = (list: readonly string[]): Promise<string | null> =>\n getFirstEncodableAudioCodec(list as never, { numberOfChannels: audio.numberOfChannels ?? 2, sampleRate: audio.sampleRate, bitrate }) as Promise<string | null>;\n if (requested) {\n if (await canEncode([requested])) return requested;\n const alt = await canEncode(preferred.filter(c => c !== requested));\n throw new Error(`pixi-effects: this browser cannot encode \"${requested}\" audio for ${fmt}` +\n (alt ? `; \"${alt}\" would work: render({ format: '${fmt}', audio: { codec: '${alt}' } }), or leave audio.codec out and the best one is chosen.` : '; it has no audio encoder for this format at all (try another browser, or a movie without sound).'));\n }\n const chosen = await canEncode(preferred);\n if (!chosen) throw new Error(`pixi-effects: this browser has no audio encoder for ${fmt} (it tried ${preferred.join(', ')}): try another browser, or render a movie without sound.`);\n if (chosen !== preferred[0]) {\n console.warn(`pixi-effects: this browser cannot encode ${preferred[0]!.toUpperCase()} audio (Chrome on Linux has no AAC encoder), so the ${fmt} carries ${chosen} instead; current players play it. A webm export needs no AAC.`);\n }\n return chosen;\n}\n\n/** Samples of silence an AAC encoder puts in front of the audio (its priming / encoder delay). */\nconst AAC_PRIMING_SAMPLES = 2112;\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 container = makeOutputFormat(opts.format);\n if (movie.audioBuffer) opts.audio.codec = await chooseAudioCodec(fmt, options.audio?.codec, container, movie.audioBuffer, opts.audio.bitrate) as never;\n const output = new Output({\n format: container,\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 // AAC encoders emit AAC_PRIMING_SAMPLES of silence first. Starting the track that much earlier makes\n // mediabunny write an edit list that trims them, so the file's audio starts where the browser's does\n // (without it every sound in an MP4 / MOV was ~45 ms late). Opus signals its own pre-skip.\n const audioSource = new AudioBufferSource({\n codec: opts.audio.codec as any,\n bitrate: opts.audio.bitrate,\n }, { startTimestamp: opts.audio.codec === 'aac' ? -AAC_PRIMING_SAMPLES / movie.audioBuffer.sampleRate : 0 });\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\nexport interface TransitionWindow { from: string; to: string; start: number; end: number }\n\nconst windows = new WeakMap<object, TransitionWindow[]>();\n\n/**\n * The time windows (in the composition's own time) of the transitions that were expanded into `spec`.\n * Expansion removes `transitions` from the spec, so `inspect` reads them from here to know when two\n * scenes are blended on purpose.\n */\nexport function transitionWindowsOf(spec: object): readonly TransitionWindow[] {\n return windows.get(spec) ?? [];\n}\n\n/** Keep the windows when a spec is copied (a spread creates a new object, which the WeakMap does not know). */\nexport function carryTransitionWindows<T extends object>(from: object, to: T): T {\n const w = windows.get(from);\n if (w) windows.set(to, w);\n return to;\n}\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 const record = windows.get(out) ?? [];\n record.push({ from: t.from, to: t.to, start: tStart, end: tEnd });\n windows.set(out, record);\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';\nimport { transitionWindowsOf } from './Transitions';\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\nconst clip = (a: Rect, b: Rect): Rect | null => {\n const x = Math.max(a.x, b.x), y = Math.max(a.y, b.y);\n const w = Math.min(a.x + a.width, b.x + b.width) - x, h = Math.min(a.y + a.height, b.y + b.height) - y;\n return w > 0 && h > 0 ? { x, y, width: w, height: h } : null;\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 // What can actually be seen of a layer: its bounds cut to the canvas and to its mask (an inverted mask\n // cuts a hole instead, so it does not clip). Overlaps are judged on this, not on raw bounds.\n const seen = new Map<LayerInfo, Rect | null>();\n // Scenes that a running transition is blending: they overlap and move off the canvas by design.\n const scene = new Map<LayerInfo, string>();\n // Layers whose own or an ancestor's scale is 0, or a typewriter that has not typed yet: no size is expected.\n const scaledToNothing = new Set<LayerInfo>();\n\n const walk = (comp: CompositionSequence, prefix: string, insideThreeD: boolean, parentVisible: boolean, parentScene?: string, parentMoving = false, parentZero = false): void => {\n const blending = new Set<string>();\n for (const w of transitionWindowsOf(comp.spec)) {\n const start = (comp.absoluteStart ?? 0) + w.start, end = (comp.absoluteStart ?? 0) + w.end;\n if (time >= start - 1e-9 && time <= end + 1e-9) { blending.add(w.from); blending.add(w.to); }\n }\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 // moved by its own keyframes, or carried along by a parent that is (a panned timeline)\n const moving = parentMoving || ((seq.spec.keyframes ?? []).length > 0 && (keys.has('x') || keys.has('y')));\n const scale = (t as unknown as { scale?: { x: number; y: number } } | null)?.scale;\n const zero = parentZero || (!!scale && (scale.x === 0 || scale.y === 0));\n const info: LayerInfo = { path: prefix + label, name, type: seq.spec.type, threeD, visible, alpha, moving, bounds, onCanvas };\n layers.push(info);\n let shown = bounds ? clip(bounds, view) : null;\n const maskTarget = seq.maskSequence?.target as Container | null | undefined;\n if (shown && maskTarget && !(seq.spec as { maskInverted?: boolean }).maskInverted) {\n const m = maskTarget.getBounds();\n shown = clip(shown, { x: m.x, y: m.y, width: m.width, height: m.height });\n }\n seen.set(info, shown);\n const group = parentScene ?? (name !== undefined && blending.has(name) ? name : undefined);\n if (group) scene.set(info, group);\n if (zero || (seq as { showsNothingYet?: boolean }).showsNothingYet) scaledToNothing.add(info);\n if (seq instanceof CompositionSequence) walk(seq, prefix + label + '/', insideThreeD || threeD, visible, group, moving, zero);\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 if (scaledToNothing.has(l)) continue;\n issues.push(`${who} has no size (empty text, or not drawn yet)`);\n } else if (l.moving || scene.has(l)) {\n // on purpose crossing the canvas edge (marquee, slide-in, a slide / zoom transition): 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 = seen.get(texts[i]!), b = seen.get(texts[j]!);\n if (!a || !b) continue; // nothing of one of them is on screen\n const sa = scene.get(texts[i]!), sb = scene.get(texts[j]!);\n if (sa && sb && sa !== sb) continue; // the two scenes of a running transition\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","import { CompositionSequence } from '../sequences/Composition';\nimport type { Sequence } from '../sequences/Base';\nimport { transitionWindowsOf } from './Transitions';\nimport { resolveAt } from './Timeline';\n\n/** One layer (or a run of similar layers) on the timeline. Times are in seconds, absolute (from the start of the movie). */\nexport interface TimelineRow {\n /** `parent/child` for a layer inside a composition. */\n path: string;\n name: string;\n type: string;\n /** 0 for a top-level layer, 1 inside a composition, … */\n depth: number;\n start: number;\n end: number;\n /** When each keyframe starts (absolute seconds, sorted). */\n keys: number[];\n /** A grouped run: one span per layer it stands for. */\n parts?: Array<{ start: number; end: number }>;\n /** A short text for the tooltip (a text layer's words, an asset name). */\n detail?: string;\n}\nexport interface TimelineTransition { from: string; to: string; start: number; end: number }\nexport interface TimelineData {\n duration: number;\n rows: TimelineRow[];\n transitions: TimelineTransition[];\n}\n\nconst GROUP_MIN = 4;\nconst MAX_KEYS = 200;\nconst round = (n: number): number => Math.round(n * 1e6) / 1e6;\n\n/** `pop-12`, `ring9-1`, `text#9` → `pop-#`, `ring#-#`, `text#`: the part that makes similar layers one family. */\nconst family = (name: string): string => name.replace(/\\d+/g, '#');\n\nfunction detailOf(seq: Sequence): string | undefined {\n const s = seq.spec as { text?: unknown; asset?: unknown; sfx?: unknown };\n if (typeof s.text === 'string') return s.text.length > 60 ? s.text.slice(0, 57) + '…' : s.text;\n if (typeof s.asset === 'string') return `asset “${s.asset}”`;\n if (typeof s.sfx === 'string') return `sfx “${s.sfx}”`;\n if (s.sfx && typeof s.sfx === 'object') return 'sfx (custom)';\n return undefined;\n}\n\nfunction walk(comp: CompositionSequence, parentStart: number, parentEnd: number, depth: number, prefix: string, rows: TimelineRow[], transitions: TimelineTransition[]): void {\n const entries: Array<{ row: TimelineRow; inner: TimelineRow[]; groupable: boolean }> = [];\n comp._children.forEach((seq, i) => {\n const name = seq.spec.name ?? `${seq.spec.type}#${i}`;\n const start = parentStart + (seq.at ?? 0);\n // a layer without its own duration lasts as long as its parent: from its start, so it can run past the end; the end is the end\n const end = Math.min(parentEnd, seq.duration !== undefined ? start + seq.duration : parentEnd);\n const span = end - start;\n const keys = (seq.spec.keyframes ?? []).map(kf => round(start + resolveAt(kf.at, span))).sort((a, b) => a - b).slice(0, MAX_KEYS);\n const row: TimelineRow = { path: prefix + name, name, type: seq.spec.type, depth, start: round(start), end: round(end), keys, detail: detailOf(seq) };\n const inner: TimelineRow[] = [];\n const isComp = seq instanceof CompositionSequence;\n if (isComp) walk(seq, start, end, depth + 1, prefix + name + '/', inner, transitions);\n entries.push({ row, inner, groupable: !isComp });\n });\n rows.push(...groupFamilies(entries));\n for (const w of transitionWindowsOf(comp.spec)) {\n transitions.push({ from: prefix + w.from, to: prefix + w.to, start: round(parentStart + w.start), end: round(parentStart + w.end) });\n }\n}\n\n/**\n * Siblings of the same type whose names differ only by numbers (`ring10-0`, `ring9-1`, `pop-3` …), four or more, become ONE row\n * at the place of the first, with a part per layer: a movie with hundreds of generated layers stays readable. A composition is never grouped.\n */\nfunction groupFamilies(entries: Array<{ row: TimelineRow; inner: TimelineRow[]; groupable: boolean }>): TimelineRow[] {\n const buckets = new Map<string, TimelineRow[]>();\n for (const e of entries) {\n if (!e.groupable) continue;\n const key = e.row.type + '|' + family(e.row.name);\n (buckets.get(key) ?? buckets.set(key, []).get(key)!).push(e.row);\n }\n const out: TimelineRow[] = [];\n const done = new Set<string>();\n for (const e of entries) {\n const key = e.row.type + '|' + family(e.row.name);\n const members = e.groupable ? buckets.get(key)! : null;\n if (members && members.length >= GROUP_MIN) {\n if (done.has(key)) continue; // already drawn at the first member's place\n done.add(key);\n const label = `${family(e.row.name)} ×${members.length}`;\n out.push({\n path: e.row.path.slice(0, e.row.path.length - e.row.name.length) + label, name: label, type: e.row.type, depth: e.row.depth,\n start: Math.min(...members.map(x => x.start)), end: Math.max(...members.map(x => x.end)),\n keys: members.flatMap(x => x.keys).sort((a, b) => a - b).slice(0, MAX_KEYS),\n parts: members.map(x => ({ start: x.start, end: x.end })),\n });\n } else {\n out.push(e.row, ...e.inner);\n continue;\n }\n out.push(...e.inner);\n }\n return out;\n}\n\n/** Every layer of the movie as rows with absolute times, plus the transition windows. Pure data: read it, or draw it with `timelineHtml`. */\nexport function collectTimeline(root: CompositionSequence, duration: number): TimelineData {\n const rows: TimelineRow[] = [];\n const transitions: TimelineTransition[] = [];\n walk(root, 0, duration, 0, '', rows, transitions);\n return { duration, rows, transitions };\n}\n\n// ───────────────────────────── the chart ─────────────────────────────\n\nconst COLORS: Record<string, string> = {\n text: '#4cc9f0', shape: '#ffd166', image: '#7bd88f', video: '#c77dff', audio: '#ff7aa8',\n composition: '#8ea4c8', three: '#ff9f68', camera: '#b0b0b0',\n};\nconst esc = (s: string): string => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\nconst num = (n: number): string => String(Math.round(n * 100) / 100);\n\n/** The smallest tick spacing (seconds) that is at least ~70 px apart on a chart `chartWidth` px wide. */\nfunction tickStep(duration: number, chartWidth: number): number {\n for (const s of [0.04, 0.1, 0.2, 0.5, 1, 2, 5, 10, 15, 30, 60, 120, 300, 600, 1200, 3600]) if ((s / duration) * chartWidth >= 70) return s;\n return 7200;\n}\n\nexport interface TimelineHtmlOptions { title?: string }\nexport interface TimelineSvgOptions {\n /** How many pixels the whole duration takes (default 950). A viewer re-draws at a wider width to zoom; the ticks get finer with it. */\n chartWidth?: number;\n /** Draw the layer names in a column on the left (default true). A viewer that scrolls sideways keeps its own, fixed column. */\n labels?: boolean;\n}\n\n/**\n * The chart alone: one `<svg>` (inline, no scripts). Its geometry is in data attributes (`data-duration`, `data-x0` / `data-x1`:\n * where 0 s and the end are in the viewBox, `data-top` / `data-bottom`, `data-row`), and every row is `<g class=\"row\" data-start>`,\n * so a viewer can turn a click into a time, draw a playhead, and seek to a row.\n */\nexport function timelineSvg(data: TimelineData, opts: TimelineSvgOptions = {}): string {\n const CHART = Math.max(100, opts.chartWidth ?? 950), withLabels = opts.labels !== false;\n const LABEL = withLabels ? 250 : 0, ROW = 22, TOP = 34, PAD = 16;\n const W = LABEL + CHART + PAD * 2, H = TOP + data.rows.length * ROW + PAD;\n const x = (t: number): number => PAD + LABEL + (Math.max(0, Math.min(data.duration, t)) / data.duration) * CHART;\n const step = tickStep(data.duration, CHART);\n const out: string[] = [];\n\n // ruler and grid\n for (let t = 0; t <= data.duration + 1e-9; t += step) {\n out.push(`<line class=\"grid\" x1=\"${num(x(t))}\" y1=\"${TOP - 6}\" x2=\"${num(x(t))}\" y2=\"${H - PAD}\"/>`);\n out.push(`<text class=\"tick\" x=\"${num(x(t))}\" y=\"${TOP - 12}\" text-anchor=\"middle\">${num(t)}${t === 0 || Math.abs(t - data.duration) < 1e-9 ? ' s' : ''}</text>`);\n }\n if (Math.abs(data.duration % step) > 1e-9) out.push(`<text class=\"tick\" x=\"${num(x(data.duration))}\" y=\"${TOP - 12}\" text-anchor=\"middle\">${num(data.duration)} s</text>`);\n\n // transitions: a band across every row, drawn under the bars\n for (const t of data.transitions) {\n out.push(`<g><title>transition ${esc(t.from)} → ${esc(t.to)} (${num(t.start)}–${num(t.end)} s)</title><rect class=\"transition\" x=\"${num(x(t.start))}\" y=\"${TOP - 4}\" width=\"${num(Math.max(2, x(t.end) - x(t.start)))}\" height=\"${H - TOP - PAD + 4}\"/></g>`);\n }\n\n data.rows.forEach((r, i) => {\n const y = TOP + i * ROW;\n const color = COLORS[r.type] ?? '#9aa7b8';\n const tip = `${r.path} · ${r.type} · ${num(r.start)}–${num(r.end)} s (${num(r.end - r.start)} s)${r.keys.length ? ` · ${r.keys.length} keyframe${r.keys.length > 1 ? 's' : ''}` : ''}${r.detail ? ` · ${r.detail}` : ''}`;\n out.push(`<g class=\"row\" data-start=\"${num(r.start)}\"><title>${esc(tip)}</title>`);\n out.push(`<rect class=\"band\" x=\"${PAD}\" y=\"${y}\" width=\"${LABEL + CHART}\" height=\"${ROW}\" ${i % 2 ? 'fill-opacity=\".05\"' : 'fill-opacity=\"0\"'}/>`);\n if (withLabels) out.push(`<text class=\"label\" x=\"${PAD + 6 + r.depth * 14}\" y=\"${y + 15}\">${esc(r.name)}</text>`);\n for (const p of r.parts ?? [{ start: r.start, end: r.end }]) {\n out.push(`<rect class=\"bar\" x=\"${num(x(p.start))}\" y=\"${y + 4}\" width=\"${num(Math.max(2, x(p.end) - x(p.start)))}\" height=\"${ROW - 8}\" rx=\"3\" fill=\"${color}\"/>`);\n }\n for (const k of r.keys) out.push(`<path class=\"key\" d=\"M ${num(x(k))} ${y + 7} l 3 4 l -3 4 l -3 -4 z\"/>`);\n out.push('</g>');\n });\n\n const legend = Object.entries(COLORS).map(([type, c], i) => `<g transform=\"translate(${PAD + i * 108},${H + 10})\"><rect width=\"12\" height=\"12\" rx=\"3\" fill=\"${c}\"/><text x=\"18\" y=\"10\" class=\"tick\">${type}</text></g>`).join('');\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${W}\" height=\"${H + 32}\" viewBox=\"0 0 ${W} ${H + 32}\" role=\"img\" aria-label=\"Timeline of ${data.rows.length} rows\" data-duration=\"${num(data.duration)}\" data-x0=\"${num(x(0))}\" data-x1=\"${num(x(data.duration))}\" data-top=\"${TOP - 6}\" data-bottom=\"${H - PAD}\" data-row=\"${ROW}\">\n${out.join('\\n')}\n${legend}\n</svg>`;\n}\n\n/** One self-contained HTML page (an inline SVG, no scripts): the layers as bars on a time axis. */\nexport function timelineHtml(data: TimelineData, opts: TimelineHtmlOptions = {}): string {\n const W = 250 + 950 + 32;\n const title = esc(opts.title ?? 'Timeline');\n return `<!doctype html>\n<html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>${title} — timeline</title>\n<style>\n :root { --bg: #f7f5f1; --ink: #1d2433; --dim: #6b7587; --grid: #d9d5cc; --key: #1d2433; --trans: #4cc9f0; }\n @media (prefers-color-scheme: dark) { :root { --bg: #0e1320; --ink: #e8eefc; --dim: #8fa0bf; --grid: #26304a; --key: #ffffff; --trans: #4cc9f0; } }\n body { margin: 0; background: var(--bg); color: var(--ink); font: 14px system-ui, sans-serif; }\n main { padding: 20px 16px 32px; max-width: ${W + 32}px; margin: 0 auto; overflow-x: auto; }\n h1 { font-size: 18px; font-weight: 600; margin: 0 0 4px; }\n p { margin: 0 0 14px; color: var(--dim); font-size: 13px; }\n svg { display: block; }\n .grid { stroke: var(--grid); stroke-width: 1; }\n .tick { fill: var(--dim); font-size: 11px; }\n .label { fill: var(--ink); font-size: 12px; font-family: ui-monospace, Menlo, monospace; }\n .band { fill: var(--ink); }\n .key { fill: var(--key); opacity: .85; }\n .transition { fill: var(--trans); opacity: .16; }\n .bar { opacity: .88; }\n .row:hover .bar { opacity: 1; }\n</style></head>\n<body><main>\n<h1>${title}</h1>\n<p>${data.rows.length} row${data.rows.length === 1 ? '' : 's'} · ${num(data.duration)} s · ◆ keyframe start · shaded band: a transition · hover a bar for details</p>\n${timelineSvg(data)}\n</main></body></html>\n`;\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","/** The part of an AudioContext this needs (so a test can pass a fake). */\nexport interface ResumableContext {\n state: string;\n resume?: () => Promise<void>;\n addEventListener(type: 'statechange', fn: () => void): void;\n removeEventListener(type: 'statechange', fn: () => void): void;\n}\n\n/**\n * Run `start` once the context is `running`. A browser keeps a new AudioContext `suspended` until the user has\n * interacted with the page; scheduling a sound then would play it at a stale position once the context wakes up.\n * So when it is not running we ask it to resume and wait, and `start` reads the movie's position at that moment.\n * `gesture` (the window) is where the user's first click / key press is heard: resume() is asked again then.\n * Returns a cancel function (pause before the browser allowed the sound).\n */\nexport function startWhenRunning(ctx: ResumableContext, start: () => void, gesture?: EventTarget): () => void {\n if (ctx.state === 'running') { start(); return () => {}; }\n let done = false;\n const resume = (): void => { ctx.resume?.()?.catch(() => { /* still blocked: the picture plays silently */ }); };\n const stop = (): void => {\n done = true;\n ctx.removeEventListener('statechange', onState);\n for (const e of GESTURES) gesture?.removeEventListener(e, resume, true);\n };\n const onState = (): void => {\n if (done || ctx.state !== 'running') return;\n stop();\n start();\n };\n ctx.addEventListener('statechange', onState);\n // A resume() asked for before any user gesture is not granted later by itself (Chrome): ask again on the first one.\n for (const e of GESTURES) gesture?.addEventListener(e, resume, true);\n resume();\n return stop;\n}\n\nconst GESTURES = ['pointerdown', 'mousedown', 'touchend', 'keydown'];\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, limitMix, type MixStats } from './AudioMixer';\nimport { analyzeAudio, type AudioReport, type AudioInspectOptions } from './inspectAudio';\nimport { exportFrames } from './Renderer';\nimport { expandTransitions, carryTransitionWindows } from './Transitions';\nimport { inspectScene, type InspectReport, type InspectOptions } from './inspect';\nimport { collectTimeline, timelineHtml, timelineSvg, type TimelineData, type TimelineHtmlOptions, type TimelineSvgOptions } from './timelineChart';\nimport { pickFrames, sheetLayout } from './frames';\nimport { warnUnknownOptions } from './options';\nimport { startWhenRunning } from './startWhenRunning';\nimport { ensureFilterLibrary } from '../filters/named';\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/** `volumechange`: the values after the change. */\nexport interface VolumeEvent { volume: number; muted: boolean }\n/** `error`: something failed in `init()`, `render()` or during playback. The call that failed still rejects / warns as before. */\nexport interface MovieErrorEvent { where: 'init' | 'render' | 'playback'; message: string; error: unknown }\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 _cancelAudioStart: (() => void) | null = null;\n /** > 0 while the movie moves its own playhead (playback, render, snapshot, contactSheet): those are not the seeks `seeking` / `seeked` report. */\n private _quiet = 0;\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 /** What went into the mix, and its peak before limiting — kept for inspectAudio(). */\n private _audioSources: AudioDescriptor[] = [];\n private _mixStats: MixStats | null = null;\n\n on(event: 'ready', fn: () => void): this;\n on(event: 'frame', fn: (e: FrameEvent) => void): this;\n /** A jump to another frame (`gotoFrame`, a seek bar) starts / finishes. Not emitted for playback ticks, `render()`, `snapshot()` or `contactSheet()`. */\n on(event: 'seeking' | 'seeked', fn: (e: FrameEvent) => void): this;\n /** Playback ran off the end (after `pause`). Pausing by hand does not emit it. */\n on(event: 'ended', fn: () => void): this;\n on(event: 'volumechange', fn: (e: VolumeEvent) => void): this;\n on(event: 'error', fn: (e: MovieErrorEvent) => void): this;\n on(event: 'progress', fn: (e: ProgressEvent) => void): this;\n on(event: 'play', fn: () => 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 await ensureFilterLibrary(seededComposition); // pixi-filters, only when a layer names one of its filters\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 if (userComposition) carryTransitionWindows(userComposition, rootSeqSpec);\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 if (this.audioBuffer) this._mixStats = limitMix(this.audioBuffer, audios);\n }\n this._audioSources = audios;\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 this._emitError('init', err);\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 if (this._quiet > 0) return this._goto(frame);\n const target = Math.max(0, Math.min(frame, this.totalFrames));\n this.emit('seeking', { frame: target, totalFrames: this.totalFrames } satisfies FrameEvent);\n await this._goto(frame);\n this.emit('seeked', { frame: this.currentFrame, totalFrames: this.totalFrames } satisfies FrameEvent);\n }\n\n /** Run `fn` with `seeking` / `seeked` silenced: the movie is moving its own playhead, not answering a seek. */\n private async _quietly<T>(fn: () => Promise<T>): Promise<T> {\n this._quiet++;\n try { return await fn(); } finally { this._quiet--; }\n }\n\n private _emitError(where: MovieErrorEvent['where'], error: unknown): void {\n this.emit('error', { where, message: error instanceof Error ? error.message : String(error), error } satisfies MovieErrorEvent);\n }\n\n private async _goto(frame: number): Promise<void> {\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._quietly(() => 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._quietly(() => 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._quietly(() => 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 * Every layer as a row with absolute start / end / keyframe times (seconds), plus the transition windows. Runs of\n * similar layers (`pop-1` … `pop-12`) are one row with a `parts` span each. Read it, or draw it with `timelineChart()`.\n */\n timelineData(): TimelineData {\n this._requireReady('timelineData');\n return collectTimeline(this._rootSequence as CompositionSequence, this.duration);\n }\n\n /** The timeline as one self-contained HTML page (an inline SVG, no scripts): layers as bars on a time axis, ◆ keyframes, transition bands. Open it in a browser. */\n timelineChart(opts: TimelineHtmlOptions = {}): string {\n warnUnknownOptions('movie.timelineChart()', opts, ['title']);\n return timelineHtml(this.timelineData(), opts);\n }\n\n /** Just the chart: one `<svg>` whose geometry is in `data-*` attributes (a viewer puts a playhead on it: `pixi-effects-view`). */\n timelineSvg(opts: TimelineSvgOptions = {}): string {\n warnUnknownOptions('movie.timelineSvg()', opts, ['chartWidth', 'labels']);\n return timelineSvg(this.timelineData(), opts);\n }\n\n /**\n * The soundtrack, measured: when every audio layer plays, how loud the mix is over time, and `issues`\n * (limiting, inaudible layers, sounds cut off by the end). Use it to CHECK sound you cannot hear.\n */\n inspectAudio(opts: AudioInspectOptions = {}): AudioReport {\n warnUnknownOptions('movie.inspectAudio()', opts, ['window']);\n this._requireReady('inspectAudio');\n return analyzeAudio(this.audioBuffer, this._audioSources, this._mixStats, this.duration, 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 this._rootSequence?.syncFrame();\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 const wasPlaying = this.isPlaying;\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._goto(frame)\n .catch((err) => { console.warn('pixi-effects: gotoFrame failed during playback:', err); this._emitError('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._goto(this.totalFrames).catch((err) => {\n console.warn('pixi-effects: final gotoFrame failed:', err);\n this._emitError('playback', err);\n });\n this.emit('ended');\n }\n };\n this._raf = requestAnimationFrame(tick);\n\n if (this.audioBuffer) {\n const ctx = this._ensureAudioContext();\n const buffer = this.audioBuffer;\n this._cancelAudioStart?.();\n // A browser keeps the context suspended until the user has interacted with the page: start the sound when it\n // runs, from the position the movie has reached by then, instead of at a stale offset.\n this._cancelAudioStart = startWhenRunning(ctx, () => {\n if (!this.isPlaying) return;\n this.audioSource = ctx.createBufferSource();\n this.audioSource.buffer = buffer;\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, Math.min(this.currentFrame / this.frameRate, buffer.duration));\n }, typeof window !== 'undefined' ? window : undefined);\n }\n if (!wasPlaying) this.emit('play');\n }\n\n pause(): void {\n const wasPlaying = this.isPlaying;\n this.isPlaying = false;\n this._cancelAudioStart?.();\n this._cancelAudioStart = null;\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 const next = Math.max(0, Math.min(1, v));\n const changed = next !== this._volume;\n this._volume = next;\n if (this.gainNode) this.gainNode.gain.value = this._muted ? 0 : this._volume;\n if (changed) this.emit('volumechange', { volume: this._volume, muted: this._muted } satisfies VolumeEvent);\n }\n get volume(): number { return this._volume; }\n set muted(v: boolean) {\n const changed = !!v !== this._muted;\n this._muted = !!v;\n if (this.gainNode) this.gainNode.gain.value = this._muted ? 0 : this._volume;\n if (changed) this.emit('volumechange', { volume: this._volume, muted: this._muted } satisfies VolumeEvent);\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 try {\n return await this._quietly(() => exportFrames(this, options));\n } catch (err) {\n this._emitError('render', err);\n throw err;\n }\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 this._audioSources = [];\n this._mixStats = 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 { CanvasTextMetrics, TextStyle } from 'pixi.js';\nimport { suggestName, warnUnknownOptions } from '../core/options';\n\n/** A text style as written in a `text` layer's `style` (numbers, not expressions, for the fields that size the text). */\nexport type MeasureStyle = Record<string, unknown>;\n\nexport interface TextSize {\n width: number;\n height: number;\n /** Number of lines. */\n lines: number;\n}\n\nexport interface SplitOptions {\n /** What a piece is: one visible character (default), one word, or one line. */\n by?: 'chars' | 'words' | 'lines';\n /** Where the text goes: `x` is its left edge, or its centre / right edge with `align`. Default 0. */\n x?: number;\n /** Top of the first line. Default 0. */\n y?: number;\n /** How each line sits on `x`. Default `'left'`. */\n align?: 'left' | 'center' | 'right';\n}\n\nexport interface TextPiece {\n text: string;\n /** Left edge of the piece, for a text layer with `anchorX: 0` (the default for text). */\n x: number;\n /** Top of the piece's line, for a text layer with `anchorY: 0`. */\n y: number;\n width: number;\n /** Position in the returned list, 0-based. */\n index: number;\n /** Which line (0-based) the piece is on. */\n line: number;\n}\n\nconst BY = ['chars', 'words', 'lines'] as const;\nconst ALIGN = ['left', 'center', 'right'] as const;\n\nconst widthOf = (text: string, style: TextStyle): number => CanvasTextMetrics.measureText(text, style).width;\n\n/**\n * How big `text` is drawn with `style`: the same numbers a text layer with that style has, measured with the font the\n * renderer will use. A web font must be loaded first (`await document.fonts.load('24px \"Name\"')`), or the width is a\n * fallback font's.\n */\nexport function measureText(text: string, style: MeasureStyle = {}): TextSize {\n const m = CanvasTextMetrics.measureText(text, new TextStyle(style as never));\n return { width: m.width, height: m.height, lines: text.split('\\n').length };\n}\n\n/**\n * Cut `text` into characters, words or lines and give each piece the x / y it needs so that one text layer per piece\n * (same `style`, `anchorX: 0`, `anchorY: 0`) reads exactly like the whole text: per-letter and per-word animation without\n * measuring anything by hand. Kerning is kept (a piece's x is the measured width of everything before it). Whitespace is\n * not returned as a piece, but it takes its room. Lines are split on `\\n` and go down by the style's line height.\n *\n * ```js\n * splitText('Hello world', style, { by: 'words', x: 640, y: 300, align: 'center' })\n * .map(p => ({ type: 'text', text: p.text, style, initial: { x: p.x, y: p.y, alpha: 0 }, at: 0.2 * p.index, ... }))\n * ```\n */\nexport function splitText(text: string, style: MeasureStyle = {}, opts: SplitOptions = {}): TextPiece[] {\n warnUnknownOptions('splitText()', opts as Record<string, unknown>, ['by', 'x', 'y', 'align']);\n let by = opts.by ?? 'chars';\n if (!(BY as readonly string[]).includes(by)) {\n const g = suggestName(String(by), BY);\n console.warn(`pixi-effects: splitText(): by \"${by}\" is not one of ${BY.map(b => `\"${b}\"`).join(', ')}${g ? ` — did you mean \"${g}\"?` : ''}; using \"chars\"`);\n by = 'chars';\n }\n let align = opts.align ?? 'left';\n if (!(ALIGN as readonly string[]).includes(align)) {\n const g = suggestName(String(align), ALIGN);\n console.warn(`pixi-effects: splitText(): align \"${align}\" is not one of ${ALIGN.join(', ')}${g ? ` — did you mean \"${g}\"?` : ''}; using \"left\"`);\n align = 'left';\n }\n const x0 = opts.x ?? 0, y0 = opts.y ?? 0;\n if (text === '') return [];\n\n const ts = new TextStyle(style as never);\n const lineHeight = CanvasTextMetrics.measureText('M', ts).lineHeight ?? CanvasTextMetrics.measureText('M', ts).height;\n const sentinel = widthOf('|', ts); // measuring \"prefix|\" − \"|\" keeps trailing spaces in the prefix\n const out: TextPiece[] = [];\n\n text.split('\\n').forEach((line, lineNo) => {\n const lineWidth = widthOf(line, ts);\n const left = align === 'center' ? x0 - lineWidth / 2 : align === 'right' ? x0 - lineWidth : x0;\n const y = y0 + lineNo * lineHeight;\n const advance = (upTo: number): number => (upTo === 0 ? 0 : widthOf(line.slice(0, upTo) + '|', ts) - sentinel);\n\n // [start, end) of every piece on this line\n const spans: Array<[number, number]> = [];\n if (by === 'lines') {\n if (line.trim() !== '') spans.push([0, line.length]);\n } else if (by === 'words') {\n for (const m of line.matchAll(/\\S+/g)) spans.push([m.index!, m.index! + m[0].length]);\n } else {\n for (let i = 0; i < line.length; i++) if (!/\\s/.test(line[i]!)) spans.push([i, i + 1]);\n }\n for (const [a, b] of spans) {\n const piece = line.slice(a, b);\n out.push({ text: piece, x: left + advance(a), y, width: widthOf(piece, ts), index: out.length, line: lineNo });\n }\n });\n return out;\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"]}
|