pixi-effects 0.14.0 → 0.16.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 +13 -6
- package/ai/CHAT.md +103 -0
- package/ai/SKILL.md +2 -1
- package/ai/chat-template.html +113 -0
- package/ai/reference/cheatsheet.md +2 -1
- package/ai/reference/pitfalls.md +6 -0
- package/ai/reference/recipes.md +25 -0
- package/ai/template.html +5 -5
- package/dist/{Base-CQOlB2VH.d.ts → Base-DPEqyeB0.d.cts} +1 -1
- package/dist/{Base-C6ZnJ9pD.d.cts → Base-qvqNxvyt.d.ts} +1 -1
- package/dist/Composition-X2VZSVPD.js +5 -0
- package/dist/{Composition-HIISJAX2.js.map → Composition-X2VZSVPD.js.map} +1 -1
- package/dist/Composition-ZZGSMQ4E.cjs +14 -0
- package/dist/{Composition-7TEKHZNQ.cjs.map → Composition-ZZGSMQ4E.cjs.map} +1 -1
- package/dist/Controller.d.cts +2 -2
- package/dist/Controller.d.ts +2 -2
- package/dist/{Movie-BwT6XtGz.d.ts → Movie-BIGDIla0.d.ts} +1 -1
- package/dist/{Movie-qmgOU4in.d.cts → Movie-CJMfAizW.d.cts} +1 -1
- package/dist/Presenter.d.cts +2 -2
- package/dist/Presenter.d.ts +2 -2
- package/dist/{chunk-C6QHKYC5.js → chunk-7D7RAQWM.js} +29 -4
- package/dist/chunk-7D7RAQWM.js.map +1 -0
- package/dist/{chunk-3IPDNC3E.js → chunk-I2YXLHIU.js} +3 -3
- package/dist/{chunk-3IPDNC3E.js.map → chunk-I2YXLHIU.js.map} +1 -1
- package/dist/{chunk-6NWJLVCA.cjs → chunk-SPPNTV7E.cjs} +29 -4
- package/dist/chunk-SPPNTV7E.cjs.map +1 -0
- package/dist/{chunk-F7NCHS6Q.cjs → chunk-V54NBCWG.cjs} +26 -26
- package/dist/{chunk-F7NCHS6Q.cjs.map → chunk-V54NBCWG.cjs.map} +1 -1
- package/dist/index.cjs +40 -25
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +18 -5
- package/dist/index.d.ts +18 -5
- package/dist/index.js +18 -4
- package/dist/index.js.map +1 -1
- package/dist/loader.css +1 -1
- package/dist/music-3OF5C6X5.cjs +826 -0
- package/dist/music-3OF5C6X5.cjs.map +1 -0
- package/dist/music-4HDFULNR.js +809 -0
- package/dist/music-4HDFULNR.js.map +1 -0
- package/dist/three.cjs +5 -5
- package/dist/three.d.cts +2 -2
- package/dist/three.d.ts +2 -2
- package/dist/three.js +1 -1
- package/dist/{types-CBSiUKau.d.cts → types-C8XEUoqe.d.cts} +76 -2
- package/dist/{types-CBSiUKau.d.ts → types-C8XEUoqe.d.ts} +76 -2
- package/docs/api.md +10 -0
- package/docs/dsl.md +39 -0
- package/llms-full.txt +83 -2
- package/llms.txt +3 -2
- package/package.json +1 -1
- package/dist/Composition-7TEKHZNQ.cjs +0 -14
- package/dist/Composition-HIISJAX2.js +0 -5
- package/dist/chunk-6NWJLVCA.cjs.map +0 -1
- package/dist/chunk-C6QHKYC5.js.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/motionBlur.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/poster.ts","../src/core/pdf.ts","../src/core/stops.ts","../src/core/loader.ts","../src/core/Movie.ts","../src/text/measure.ts","../src/presets/kenBurns.ts","../src/presets/_ease.ts","../src/presets/orbit.ts","../src/presets/particles.ts","../src/presets/followPath.ts","../src/presets/stagger.ts","../src/presets/wiggle.ts","../src/presets/animateText.ts","../src/presets/react.ts","../src/audio/envelope.ts","../src/presets/deck.ts","../src/transforms/withFade.ts"],"names":["extensions","ExtensionType","Input","BlobSource","ALL_FORMATS","Output","WavOutputFormat","BufferTarget","Conversion","VideoSampleSink","Assets","num","windows","warnUnknownOptions","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","Application","Container","Rectangle","ensureFilterLibrary","Culler","CanvasTextMetrics","TextStyle","suggestName","homeDistance","DEFAULT_FOV","DEG","KEYS","round","random","a","noise","flattenSvgPath","out","MAX_STEPS","rand","range","mono","round6"],"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). */\nexport function 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 { warnUnknownOptions } from './options';\n\nexport interface MotionBlurOptions {\n /** How many moments one frame is drawn at before they are averaged (2–64). More is smoother and slower. Default 8. */\n samples?: number;\n /** How long the shutter is open, as a fraction of the frame time (0–1]. `0.5` is a 180° shutter (the film look). Default 0.5. */\n shutter?: number;\n}\n\n/** `true` (8 samples, 180° shutter), a sample count, or `{ samples, shutter }`; `false` is off. */\nexport type MotionBlurSpec = boolean | number | MotionBlurOptions;\n\nexport interface ResolvedMotionBlur { samples: number; shutter: number }\n\nconst DEFAULTS: ResolvedMotionBlur = { samples: 8, shutter: 0.5 };\n\n/** A motion blur setting as `{ samples, shutter }`, or null for off. Says which option is wrong. */\nexport function resolveMotionBlur(spec: MotionBlurSpec | null | undefined, where: string): ResolvedMotionBlur | null {\n if (spec === undefined || spec === null || spec === false) return null;\n const o: MotionBlurOptions = spec === true ? {} : typeof spec === 'number' ? { samples: spec } : spec;\n if (typeof spec === 'object') warnUnknownOptions(`${where} motionBlur`, o, ['samples', 'shutter']);\n const samples = o.samples ?? DEFAULTS.samples, shutter = o.shutter ?? DEFAULTS.shutter;\n if (!(Number.isInteger(samples) && samples >= 2 && samples <= 64)) throw new Error(`pixi-effects: ${where}: motionBlur samples must be a whole number from 2 to 64, got ${samples}`);\n if (!(Number.isFinite(shutter) && shutter > 0 && shutter <= 1)) throw new Error(`pixi-effects: ${where}: motionBlur shutter must be a fraction of the frame time above 0 and up to 1 (0.5 is a 180° shutter), got ${shutter}`);\n return { samples, shutter };\n}\n\n/** The moments (seconds) frame `frame` is exposed over: the middles of `samples` equal slices of the shutter interval, centred on the frame time, kept inside the movie. */\nexport function blurTimes(frame: number, frameRate: number, mb: ResolvedMotionBlur, duration: number): number[] {\n const t = frame / frameRate, width = mb.shutter / frameRate;\n return Array.from({ length: mb.samples }, (_, k) => Math.min(Math.max(t + ((k + 0.5) / mb.samples - 0.5) * width, 0), duration));\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';\nimport { resolveMotionBlur } from './motionBlur';\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 // With motion blur every frame is drawn several times and averaged into this canvas, which is what gets encoded.\n const mb = options.motionBlur !== undefined ? resolveMotionBlur(options.motionBlur, 'movie.render()') : (movie.motionBlur ?? null);\n const stage = movie.app!.canvas as HTMLCanvasElement;\n const blurCanvas = mb ? Object.assign(document.createElement('canvas'), { width: stage.width, height: stage.height }) : null;\n const canvasSource = new CanvasSource(blurCanvas ?? stage, {\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 if (mb && blurCanvas) await movie._exposeFrame(frame, mb, blurCanvas, false);\n else 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 if (mb) await movie.gotoFrame(movie.totalFrames, true); // the stage shows the last frame itself, not its last sample\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';\n\n/** Sums of decimal seconds (6 + 0.7 against 6.699999999999999) must not fail a coverage check. */\nconst EPS = 1e-6;\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 - EPS || tEnd > fromEnd + EPS) {\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 - EPS || tEnd > toEnd + EPS) {\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, carriers }, 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 // a null layer that carries this layer hides it, fades it and moves it too\n const alpha = (t?.alpha ?? 1) * carriers.reduce((a, c) => a * ((c.target as { alpha?: number } | null)?.alpha ?? 1), 1);\n const alive = (threeD ? display.visible : (t?.renderable ?? true)) && carriers.every(c => c.target?.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 carried = carriers.some(c => { const k = collectPropKeys(c.spec); return (c.spec.keyframes ?? []).length > 0 && (k.has('x') || k.has('y') || k.has('rotation') || k.has('scale')); });\n const moving = parentMoving || carried || ((seq.spec.keyframes ?? []).length > 0 && (keys.has('x') || keys.has('y')));\n const zeroScale = (o: unknown): boolean => { const s = (o as { scale?: { x: number; y: number } } | null)?.scale; return !!s && (s.x === 0 || s.y === 0); };\n const zero = parentZero || zeroScale(t) || carriers.some(c => zeroScale(c.target));\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', null: '#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","/** The poster time of a movie: the moment that stands for it before it plays (a title card, the best frame). */\nexport interface PosterTime { seconds: number | null; frame: number | null }\n\n/**\n * `movie.init({ poster })` in seconds. A negative value counts back from the end (like a keyframe's `at`); one past the end is\n * clamped to the last frame; anything that is not a finite number is ignored. Each of those says so.\n */\nexport function normalizePoster(poster: unknown, duration: number, frameRate: number): PosterTime {\n if (poster === undefined || poster === null) return { seconds: null, frame: null };\n if (typeof poster !== 'number' || !Number.isFinite(poster)) {\n console.warn(`pixi-effects: movie.init({ poster }): ${JSON.stringify(poster)} is not a time in seconds; ignored`);\n return { seconds: null, frame: null };\n }\n let seconds = poster < 0 ? Math.max(0, duration + poster) : poster;\n if (seconds > duration) {\n console.warn(`pixi-effects: movie.init({ poster }): the poster time ${poster} s is past the end of the movie (${duration} s); using the last frame`);\n seconds = duration;\n }\n return { seconds, frame: Math.round(seconds * frameRate) };\n}\n","/**\n * A minimal PDF writer: one JPEG per page, full page, no dependencies. Enough for a deck exported as pages (`movie.exportPDF()`).\n */\nexport interface PdfPage {\n /** A JPEG file (baseline or progressive, RGB), embedded as it is. */\n jpeg: Uint8Array;\n /** The picture's size in pixels; the page is that size in CSS pixels (a pixel is 0.75 pt). */\n width: number;\n height: number;\n}\n\nconst enc = (s: string): Uint8Array => { const out = new Uint8Array(s.length); for (let i = 0; i < s.length; i++) out[i] = s.charCodeAt(i) & 0xff; return out; };\nconst num = (n: number): string => String(Math.round(n * 1000) / 1000);\n/** A PDF text string: plain ASCII in parentheses, anything else (a dash, Japanese) as UTF-16BE in hex with its byte order mark. */\nconst textString = (s: string): string => {\n if (/^[\\x20-\\x7e]*$/.test(s)) return `(${s.replace(/[\\\\()]/g, m => `\\\\${m}`)})`;\n let hex = 'FEFF';\n for (let i = 0; i < s.length; i++) hex += s.charCodeAt(i).toString(16).toUpperCase().padStart(4, '0');\n return `<${hex}>`;\n};\n\nexport function buildPdf(pages: PdfPage[], opts: { title?: string } = {}): Uint8Array {\n if (pages.length === 0) throw new Error('pixi-effects: a PDF needs at least one page');\n // object numbers: 1 catalog, 2 page tree, then (page, contents, image) × n, then the info\n const first = (i: number) => 3 + i * 3;\n const objects: Uint8Array[][] = []; // each object: the byte chunks between \"n 0 obj\\n\" and \"\\nendobj\\n\"\n objects[1] = [enc('<< /Type /Catalog /Pages 2 0 R >>')];\n objects[2] = [enc(`<< /Type /Pages /Kids [${pages.map((_, i) => `${first(i)} 0 R`).join(' ')}] /Count ${pages.length} >>`)];\n pages.forEach((p, i) => {\n const w = p.width * 0.75, h = p.height * 0.75, n = first(i);\n objects[n] = [enc(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${num(w)} ${num(h)}] /Resources << /XObject << /Im0 ${n + 2} 0 R >> >> /Contents ${n + 1} 0 R >>`)];\n const content = `q ${num(w)} 0 0 ${num(h)} 0 0 cm /Im0 Do Q`;\n objects[n + 1] = [enc(`<< /Length ${content.length} >>\\nstream\\n${content}\\nendstream`)];\n objects[n + 2] = [enc(`<< /Type /XObject /Subtype /Image /Width ${p.width} /Height ${p.height} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${p.jpeg.length} >>\\nstream\\n`), p.jpeg, enc('\\nendstream')];\n });\n const infoNo = opts.title !== undefined ? first(pages.length) : 0;\n if (infoNo) objects[infoNo] = [enc(`<< /Title ${textString(opts.title!)} /Producer (pixi-effects) >>`)];\n const count = (infoNo || first(pages.length)) ; // highest object number + 1 is the /Size\n\n const chunks: Uint8Array[] = [enc('%PDF-1.4\\n%\\xe2\\xe3\\xcf\\xd3\\n')];\n let offset = chunks[0]!.length;\n const offsets: number[] = [];\n for (let n = 1; n < count + (infoNo ? 1 : 0); n++) {\n const body = objects[n];\n if (!body) continue;\n offsets[n] = offset;\n const parts = [enc(`${n} 0 obj\\n`), ...body, enc('\\nendobj\\n')];\n for (const part of parts) { chunks.push(part); offset += part.length; }\n }\n const size = (infoNo || first(pages.length)) + (infoNo ? 1 : 0);\n let xref = `xref\\n0 ${size}\\n0000000000 65535 f \\n`;\n for (let n = 1; n < size; n++) xref += `${String(offsets[n] ?? 0).padStart(10, '0')} 00000 n \\n`;\n xref += `trailer\\n<< /Size ${size} /Root 1 0 R${infoNo ? ` /Info ${infoNo} 0 R` : ''} >>\\nstartxref\\n${offset}\\n%%EOF\\n`;\n chunks.push(enc(xref));\n\n const total = chunks.reduce((sum, c) => sum + c.length, 0);\n const out = new Uint8Array(total);\n let at = 0;\n for (const c of chunks) { out.set(c, at); at += c.length; }\n return out;\n}\n","import { warnUnknownOptions } from './options';\n\n/** What an author writes in `composition.stops`: a time in seconds, or an object. */\nexport interface StopSpec {\n /** Where playback stops, in seconds (negative counts back from the end). */\n at: number;\n /** This stop is the settled state of a new page. A name (shown in the page list), or `true` for an unnamed page. Without it the stop is a step of the page before. */\n page?: string | true;\n /** Speaker notes for this stop. */\n notes?: string;\n /** Move on by itself after this many seconds (a kiosk, a looping demo). */\n advance?: number;\n /**\n * Which picture stands for a page in a PDF (and in the page overview). `true`: this stop's picture IS the page's picture (use it when the\n * last stop is mid-exit or a step you do not want on paper). `false`: never use this stop's picture for the PDF. Default: the page's last stop.\n */\n pdf?: boolean;\n}\n\n/** A stop, normalised: its frame, and which page it belongs to. */\nexport interface Stop {\n index: number;\n at: number;\n frame: number;\n /** The name of the page this stop belongs to (null if it has none). */\n page: string | null;\n /** Which page (0-based) this stop belongs to. */\n pageIndex: number;\n /** True for the stop that begins its page. */\n pageStart: boolean;\n notes?: string;\n advance?: number;\n pdf?: boolean;\n}\n\nconst KEYS = ['at', 'page', 'notes', 'advance', 'pdf'] as const;\n\n/**\n * The stops of a composition, checked and in order. Numbers are stops; with no `page` anywhere every stop is a page of its\n * own, otherwise only the stops that say `page` start one (the first stop always does). Negative times count back from the end;\n * two stops on the same frame are one; anything outside the movie or not a number is dropped, with a warning that names it.\n */\nexport function normalizeStops(raw: ReadonlyArray<number | StopSpec> | undefined, duration: number, frameRate: number): Stop[] {\n if (!raw || raw.length === 0) return [];\n const total = Math.round(duration * frameRate);\n const specs: StopSpec[] = [];\n raw.forEach((r, i) => {\n const spec: StopSpec | null = typeof r === 'number' ? { at: r } : (r && typeof r === 'object' ? r : null);\n if (!spec || typeof spec.at !== 'number' || !Number.isFinite(spec.at)) {\n console.warn(`pixi-effects: stops[${i}] ${JSON.stringify(r)} is not a time in seconds (or { at, page?, notes?, advance?, pdf? }); ignored`);\n return;\n }\n if (typeof r === 'object') warnUnknownOptions(`stops[${i}]`, r, KEYS);\n const at = spec.at < 0 ? duration + spec.at : spec.at;\n if (at < -1e-9 || at > duration + 1e-9) {\n console.warn(`pixi-effects: stops[${i}] at ${spec.at} s is outside the movie (0 to ${duration} s); ignored`);\n return;\n }\n specs.push({ ...spec, at });\n });\n specs.sort((a, b) => a.at - b.at);\n\n const kept: StopSpec[] = [];\n for (const s of specs) {\n const frame = Math.min(total, Math.max(0, Math.round(s.at * frameRate)));\n const last = kept[kept.length - 1];\n if (last && Math.min(total, Math.max(0, Math.round(last.at * frameRate))) === frame) {\n console.warn(`pixi-effects: two stops are on the same frame (${frame}, about ${s.at.toFixed(2)} s); one is kept`);\n continue;\n }\n kept.push(s);\n }\n\n const anyPage = kept.some(s => s.page !== undefined);\n let pageIndex = -1, pageName: string | null = null;\n return kept.map((s, index) => {\n const pageStart = index === 0 || (anyPage ? s.page !== undefined : true);\n if (pageStart) { pageIndex++; pageName = typeof s.page === 'string' ? s.page : null; }\n const stop: Stop = { index, at: s.at, frame: Math.min(total, Math.max(0, Math.round(s.at * frameRate))), page: pageName, pageIndex, pageStart };\n if (typeof s.notes === 'string') stop.notes = s.notes;\n if (s.advance !== undefined) {\n if (typeof s.advance === 'number' && Number.isFinite(s.advance) && s.advance >= 0) stop.advance = s.advance;\n else console.warn(`pixi-effects: stops[${index}] advance must be a number of seconds >= 0, got ${JSON.stringify(s.advance)}; ignored`);\n }\n if (s.pdf !== undefined) {\n if (typeof s.pdf === 'boolean') stop.pdf = s.pdf;\n else console.warn(`pixi-effects: stops[${index}] pdf must be true or false, got ${JSON.stringify(s.pdf)}; ignored`);\n }\n return stop;\n });\n}\n\n/** The first stop beyond `frame` (standing on a stop, the next one). */\nexport function nextStopAfter(stops: readonly Stop[], frame: number): Stop | null {\n return stops.find(s => s.frame > frame) ?? null;\n}\n\n/** The last stop before `frame` (standing on a stop, the one before it). */\nexport function previousStopBefore(stops: readonly Stop[], frame: number): Stop | null {\n for (let i = stops.length - 1; i >= 0; i--) if (stops[i]!.frame < frame) return stops[i]!;\n return null;\n}\n\n/** The stop the playhead is on or has just passed, or null before the first. */\nexport function stopAtOrBefore(stops: readonly Stop[], frame: number): Stop | null {\n for (let i = stops.length - 1; i >= 0; i--) if (stops[i]!.frame <= frame) return stops[i]!;\n return null;\n}\n\n/** The stop that begins each page. */\nexport function pageStarts(stops: readonly Stop[]): Stop[] {\n return stops.filter(s => s.pageStart);\n}\n\n/**\n * The stops whose pictures stand for the pages (`which: 'pages'`, default) or for every stop. A page's picture is, in order: the stop flagged\n * `pdf: true` (the last such one, or the first with `pick: 'first'`), else the last (or first) stop not flagged `pdf: false`, else, for a page\n * list, its last (or first) stop, and for a PDF (`pdf: true` here) nothing: the page is left out. With `which: 'stops'` a PDF leaves out the\n * stops flagged `pdf: false`.\n */\nexport function pictureStops(stops: readonly Stop[], opts: { which?: 'pages' | 'stops'; pick?: 'last' | 'first'; pdf?: boolean } = {}): Stop[] {\n if (opts.which === 'stops') return opts.pdf ? stops.filter(s => s.pdf !== false) : [...stops];\n const byPage = new Map<number, Stop[]>();\n for (const s of stops) byPage.set(s.pageIndex, [...(byPage.get(s.pageIndex) ?? []), s]);\n const take = (list: Stop[]): Stop | undefined => (opts.pick === 'first' ? list[0] : list[list.length - 1]);\n const picks: Stop[] = [];\n for (const list of byPage.values()) {\n const flagged = list.filter(s => s.pdf === true);\n const usable = list.filter(s => s.pdf !== false);\n const one = take(flagged.length ? flagged : usable.length ? usable : (opts.pdf ? [] : list));\n if (one) picks.push(one);\n }\n return picks;\n}\n\n/** The share (0–1) of pixels that differ by more than `threshold` (0–255) in any colour channel between two RGBA pixel arrays of the same size. */\nexport function changedFraction(a: Uint8ClampedArray, b: Uint8ClampedArray, threshold = 12): number {\n const n = Math.min(a.length, b.length) >> 2;\n if (n === 0) return 0;\n let changed = 0;\n for (let i = 0; i < n; i++) {\n const k = i << 2;\n if (Math.abs(a[k]! - b[k]!) > threshold || Math.abs(a[k + 1]! - b[k + 1]!) > threshold || Math.abs(a[k + 2]! - b[k + 2]!) > threshold) changed++;\n }\n return changed / n;\n}\n","/**\n * The page's loader (see `src/loader.css`): a `.pe-loader` element that is on screen before any script runs. `movie.init()` finds it,\n * fades it out when the movie is ready and, if init fails, stops it and says so.\n */\nexport type LoaderOption = HTMLElement | string | false;\n\nconst FADE_FALLBACK_MS = 900;\n\n/** The loader element for a canvas: the one named (element or selector), none (`false`), or a `.pe-loader` near the canvas (its box or a few levels up). */\nexport function resolveLoader(option: LoaderOption | undefined, canvas: HTMLCanvasElement | null): HTMLElement | null {\n if (option === false) return null;\n if (option instanceof HTMLElement) return option;\n if (typeof option === 'string') return document.querySelector<HTMLElement>(option);\n let box: Element | null = canvas?.parentElement ?? null;\n for (let level = 0; box && level < 4; level++, box = box.parentElement) {\n if (level > 0 && (box === document.body || box === document.documentElement)) break; // never the whole page: that could be another movie's loader\n const found = box.querySelector<HTMLElement>('.pe-loader');\n if (found) return found;\n }\n return null;\n}\n\n/** Fade the loader out (a class, so the CSS transition runs) and take it away. Safe to call twice, or with null. */\nexport function dismissLoader(loader: HTMLElement | null): void {\n if (!loader || loader.classList.contains('pe-loader--done')) return;\n loader.classList.add('pe-loader--done');\n loader.setAttribute('aria-hidden', 'true');\n let removed = false;\n const remove = () => { if (!removed) { removed = true; loader.remove(); } };\n loader.addEventListener('transitionend', remove, { once: true });\n setTimeout(remove, FADE_FALLBACK_MS); // no transition (display: none, reduced styles): still gone\n}\n\n/** init failed: stop the animation and say so, and leave the box on screen so the page does not look merely stuck. */\nexport function failLoader(loader: HTMLElement | null, message: string): void {\n if (!loader) return;\n loader.setAttribute('data-state', 'error');\n if (loader.hasAttribute('data-label')) loader.setAttribute('data-label', message);\n loader.setAttribute('aria-busy', 'false');\n}\n","import * as PIXI from 'pixi.js';\nimport { Application, Container, Culler, Rectangle, extensions, CullerPlugin } from 'pixi.js';\nimport { gsap } from 'gsap';\nimport { PixiPlugin } from 'gsap/PixiPlugin';\nimport { loadAssetBundle } from './AssetLoader';\nimport { CompositionSequence } from '../sequences/Composition';\nimport { mixdown, 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 { normalizePoster } from './poster';\nimport { buildPdf } from './pdf';\nimport { normalizeStops, nextStopAfter, previousStopBefore, stopAtOrBefore, pageStarts, pictureStops, changedFraction, type Stop } from './stops';\nimport { resolveLoader, dismissLoader, failLoader, type LoaderOption } from './loader';\nimport { resolveMotionBlur, blurTimes, type MotionBlurSpec, type MotionBlurOptions, type ResolvedMotionBlur } from './motionBlur';\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 * The poster time in seconds: the moment that stands for the movie before it plays. The canvas shows that frame once the movie is\n * ready, the playhead stays at 0 and play starts from 0 (like `<video poster>`); `movie.posterImage()` is that picture. A negative\n * value counts back from the end. Default: none (the first frame).\n */\n poster?: number;\n /**\n * Motion blur for everything that is *made* (not for live playback): `render()`, `snapshot()` and `contactSheet()` expose each frame\n * over a shutter interval and average `samples` renders of it, so fast motion smears like on film. `true` is 8 samples at a 180° shutter,\n * a number is the sample count, `{ samples, shutter }` sets both. Default: off. Each of those calls can override it (`false` turns it off).\n */\n motionBlur?: MotionBlurSpec;\n /**\n * The page's loader (see `pixi-effects/loader.css`): an element, a selector, or `false` for none. By default a `.pe-loader` next to\n * the canvas is used. It is faded out once the movie is ready (the poster is on the canvas) and, if `init()` fails, it stops and says so.\n */\n loader?: LoaderOption;\n}\n\nexport type { MotionBlurSpec, MotionBlurOptions };\n\nexport interface RenderOptions {\n /** Motion blur for this export (see `MovieOptions.motionBlur`); overrides the movie's own setting, `false` turns it off. */\n motionBlur?: MotionBlurSpec;\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 /** Motion blur for this picture (see `MovieOptions.motionBlur`); overrides the movie's own setting, `false` turns it off. */\n motionBlur?: MotionBlurSpec;\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\n/** One picture of a stop (see `movie.stopImages()`). */\nexport interface StopImage { stop: Stop; /** The page it belongs to (0-based). */ page: number; image: Blob | string }\n\nexport interface StopImagesOptions {\n /** One picture per page (default) or one per stop. */\n which?: 'pages' | 'stops';\n /** With `which: 'pages'`: the page's last stop (default: the page fully built) or its first. */\n pick?: 'last' | 'first';\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 /** JPEG quality, 0–1. */\n quality?: number;\n /** Return `data:` URLs instead of Blobs. */\n as?: 'blob' | 'dataURL';\n /** Motion blur for the pictures (off unless you ask: they are usually for looking at). */\n motionBlur?: MotionBlurSpec;\n /** Pictures for a PDF: stops flagged `pdf: false` are left out (a page whose stops are all flagged has no picture). `exportPDF` sets it. */\n pdf?: boolean;\n /** Called as each picture is ready, in order. */\n onImage?: (image: StopImage) => void;\n}\n\nexport interface ContactSheetOptions {\n /** Motion blur for these pictures (see `MovieOptions.motionBlur`); overrides the movie's own setting, `false` turns it off. */\n motionBlur?: MotionBlurSpec;\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 }\n/** A presentation reached a stop (`movie.next()` played to it, or `prev()` / `goToStop()` / `goToPage()` jumped to it). */\nexport interface StopEvent { index: number; stop: Stop; pageIndex: 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 /** The poster time in seconds (`movie.init({ poster })`), or null. */\n poster: number | null = null;\n /** The stops of the composition (`composition.stops`), checked and in order: where `next()` pauses. Empty for an ordinary movie. */\n stops: Stop[] = [];\n /** The frame `next()` is playing toward, or null. */\n private _stopAt: number | null = null;\n private _stopWaiters: Array<() => void> = [];\n private _arriving = false;\n /** The motion blur `render()`, `snapshot()` and `contactSheet()` apply unless told otherwise (`movie.init({ motionBlur })`), or null. */\n motionBlur: ResolvedMotionBlur | null = null;\n private _posterFrame: number | null = null;\n /** The canvas shows the poster picture while the playhead is still at frame 0 (like `<video poster>`): the first seek or play replaces it. */\n private _atPoster = false;\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 /** A presentation is now on a stop (see `stops` in the composition, `next()`, `prev()`). */\n on(event: 'stop', fn: (e: StopEvent) => 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 /** The poster time as a frame number, or null. */\n get posterFrame(): number | null { return this._posterFrame; }\n\n /** Draw the poster frame on the canvas and leave the playhead where it is (frame 0): the picture before the movie plays. */\n private async _showPoster(): Promise<void> {\n if (this._posterFrame === null || !this.timeline) return;\n const back = this.currentFrame;\n this.currentFrame = this._posterFrame; // the drawing steps read the playhead\n try {\n this.timeline.time(this._timeOf(this._posterFrame));\n await this._awaitVideoFrames();\n this._updateSpace();\n this._renderNow();\n } finally {\n this.currentFrame = back;\n }\n this._atPoster = true;\n }\n\n /**\n * The picture at the poster time (frame 0 if the movie has none), as `snapshot()` returns it, and the movie is left as it was:\n * still showing the poster, or back at the frame it was at.\n */\n async posterImage(opts?: SnapshotOptions & { as?: 'blob' }): Promise<Blob>;\n async posterImage(opts: SnapshotOptions & { as: 'dataURL' }): Promise<string>;\n async posterImage(opts: SnapshotOptions = {}): Promise<Blob | string> {\n this._requireReady('posterImage');\n const back = this.currentFrame, wasAtPoster = this._atPoster;\n try {\n return await (this.snapshot as (f: number, o: SnapshotOptions) => Promise<Blob | string>)(this._posterFrame ?? 0, opts);\n } finally {\n this.currentFrame = back; // snapshot() moved the playhead to the poster: put it back before restoring the display\n if (wasAtPoster) await this._showPoster();\n else await this._quietly(() => this.gotoFrame(back, true));\n }\n }\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', 'poster', 'motionBlur', 'loader']);\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 const poster = normalizePoster(options.poster, this.duration, this.frameRate);\n this.poster = poster.seconds;\n this.motionBlur = resolveMotionBlur(options.motionBlur, 'movie.init()');\n this.stops = normalizeStops(options.composition?.stops, this.duration, this.frameRate);\n this._posterFrame = poster.frame;\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 if (this._posterFrame !== null) await this._showPoster(); // the canvas shows the poster until the first seek or play\n this.emit('ready');\n dismissLoader(resolveLoader(options.loader, options.canvas ?? (this.app?.canvas as HTMLCanvasElement | undefined) ?? null));\n } catch (err) {\n failLoader(resolveLoader(options.loader, options.canvas ?? null), 'COULD NOT LOAD');\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 (!this._arriving) this._cancelStop(); // a seek by someone else ends \"play to the next stop\"\n if (!force && !this._atPoster && this.currentFrame === frame) return; // (at the poster the canvas shows another frame)\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._atPoster = false;\n this.currentFrame = Math.max(0, Math.min(frame, this.totalFrames));\n this.timeline!.time(this._timeOf(this.currentFrame));\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 /**\n * The moment frame `frame` shows. The very last frame (`totalFrames`) is at the end of the movie, where every layer's lifespan\n * has just closed: it is drawn a hair before, so a layer that lasts to the end is still on screen in the final frame\n * (it used to be an empty one, the last frame of every export).\n */\n private _timeOf(frame: number): number {\n return Math.min(frame / this.frameRate, Math.max(0, this.duration - END_MARGIN));\n }\n\n private async _awaitVideoFrames(t: number = this._timeOf(this.currentFrame)): Promise<void> {\n if (!this._rootSequence) return;\n const collected: VideoLike[] = [];\n collectVideoSequences(this._rootSequence, collected);\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', 'motionBlur']);\n this._requireReady('snapshot');\n return this._captureFrame(clampFrame(frame, this.totalFrames), { scale: opts.scale ?? 1, type: opts.type ?? 'image/png', as: opts.as ?? 'blob', motionBlur: opts.motionBlur });\n }\n\n /** Seek to `frame` (quietly, and stay there) and draw the canvas on a new canvas of `scale` times its size. */\n private async _frameCanvas(frame: number, scale: number, motionBlur?: MotionBlurSpec): Promise<HTMLCanvasElement> {\n const mb = this._blurFor(motionBlur, 'a picture'); // undefined: the movie's own setting; false: none\n let source = this.app!.canvas as HTMLCanvasElement;\n if (mb) { source = this._blurCanvas(); await this._quietly(() => this._exposeFrame(frame, mb, source, true)); }\n else await this._quietly(() => this.gotoFrame(frame, true));\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(source, 0, 0, out.width, out.height);\n return out;\n }\n\n /** The pixels of `frame`, small (about 320 px wide) and without motion blur, to compare pictures. */\n private async _framePixels(frame: number): Promise<Uint8ClampedArray> {\n const c = await this._frameCanvas(frame, Math.min(1, 320 / Math.max(1, this.width)), false);\n return c.getContext('2d')!.getImageData(0, 0, c.width, c.height).data;\n }\n\n /** Seek to `frame` (quietly, and stay there) and encode the canvas as a picture. */\n private async _captureFrame(frame: number, o: { scale: number; type: string; quality?: number; as: 'blob' | 'dataURL'; motionBlur?: MotionBlurSpec }): Promise<Blob | string> {\n const out = await this._frameCanvas(frame, o.scale, o.motionBlur);\n return encodeCanvas(out, o.type, o.as, o.quality);\n }\n\n /**\n * A picture of the settled state of each page (default: the page's last stop, fully built) or of every stop, for a page list, an\n * overview, an export. Pauses the movie, and leaves the playhead where it was. `onImage` is called as each picture is ready.\n */\n async stopImages(opts: StopImagesOptions & { as: 'dataURL' }): Promise<Array<StopImage & { image: string }>>;\n async stopImages(opts?: StopImagesOptions): Promise<StopImage[]>;\n async stopImages(opts: StopImagesOptions = {}): Promise<StopImage[]> {\n warnUnknownOptions('movie.stopImages()', opts, ['which', 'pick', 'scale', 'type', 'quality', 'as', 'motionBlur', 'pdf', 'onImage']);\n this._requireReady('stopImages');\n if (this.stops.length === 0) return [];\n const picks = pictureStops(this.stops, { which: opts.which, pick: opts.pick, pdf: opts.pdf });\n this.pause();\n const back = this.currentFrame, wasAtPoster = this._atPoster;\n const out: StopImage[] = [];\n try {\n for (const stop of picks) {\n const image = await this._captureFrame(stop.frame, {\n scale: opts.scale ?? 1, type: opts.type ?? 'image/png', quality: opts.quality, as: opts.as ?? 'blob', motionBlur: opts.motionBlur === undefined ? false : opts.motionBlur,\n });\n const item: StopImage = { stop, page: stop.pageIndex, image };\n out.push(item);\n opts.onImage?.(item);\n }\n } finally {\n if (wasAtPoster) await this._showPoster();\n else await this._quietly(() => this.gotoFrame(back, true));\n }\n return out;\n }\n\n /**\n * Look at every stop: is the picture there still changing? A stop is compared with the picture `lookback` frames before it (default 3):\n * when more than `tolerance` (default 0.4 %) of the picture differs, the audience, a page overview and a PDF all see a half-finished\n * animation. `issues` says which stop, which page and what to do; leaves the playhead where it was.\n */\n async inspectStops(opts: { lookback?: number; tolerance?: number } = {}): Promise<{ stops: Array<{ index: number; page: string | null; at: number; frame: number; moving: number; settled: boolean }>; issues: string[] }> {\n warnUnknownOptions('movie.inspectStops()', opts, ['lookback', 'tolerance']);\n this._requireReady('inspectStops');\n const out: { stops: Array<{ index: number; page: string | null; at: number; frame: number; moving: number; settled: boolean }>; issues: string[] } = { stops: [], issues: [] };\n if (this.stops.length === 0) return out;\n const lookback = Math.max(1, Math.round(opts.lookback ?? 3));\n const tolerance = opts.tolerance ?? 0.004;\n this.pause();\n const back = this.currentFrame, wasAtPoster = this._atPoster;\n try {\n for (const stop of this.stops) {\n const before = Math.max(0, stop.frame - lookback);\n let moving = 0;\n if (before < stop.frame) {\n const now = await this._framePixels(stop.frame);\n moving = changedFraction(now, await this._framePixels(before));\n }\n const settled = moving <= tolerance;\n out.stops.push({ index: stop.index, page: stop.page, at: stop.at, frame: stop.frame, moving, settled });\n if (!settled) {\n out.issues.push(`stop ${stop.index + 1}${stop.page ? ` (page \"${stop.page}\")` : ''} at ${stop.at.toFixed(1)} s: the picture is still changing there (${moving < 0.1 ? (moving * 100).toFixed(1) : Math.round(moving * 100)}% of it changed in the last ${stop.frame - before} frames), so the audience, the page overview and a PDF see it mid-animation. Move the stop to after the animation has finished, or flag a settled stop of the page with \\`pdf: true\\`.`);\n }\n }\n } finally {\n if (wasAtPoster) await this._showPoster();\n else await this._quietly(() => this.gotoFrame(back, true));\n }\n return out;\n }\n\n /**\n * The deck as a PDF: one page per page of the talk (the page's last stop, fully built, unless a stop says `pdf: true` or `pdf: false`;\n * `which: 'stops'` makes a page of every stop that is not `pdf: false`), each a\n * JPEG at the canvas size. Needs `composition.stops`. A transparent background comes out black: give the movie a `background`.\n */\n async exportPDF(opts: { which?: 'pages' | 'stops'; pick?: 'last' | 'first'; scale?: number; quality?: number; title?: string; motionBlur?: MotionBlurSpec; onImage?: (image: StopImage) => void } = {}): Promise<Blob> {\n warnUnknownOptions('movie.exportPDF()', opts, ['which', 'pick', 'scale', 'quality', 'title', 'motionBlur', 'onImage']);\n this._requireReady('exportPDF');\n if (this.stops.length === 0) throw new Error('pixi-effects: movie.exportPDF(): this movie has no stops, so there are no pages; add `stops` to the composition (or build it with deck())');\n const scale = opts.scale ?? 1;\n const images = await this.stopImages({\n which: opts.which, pick: opts.pick, scale, type: 'image/jpeg', quality: opts.quality ?? 0.92, as: 'blob', motionBlur: opts.motionBlur, pdf: true, onImage: opts.onImage,\n });\n const pages = await Promise.all(images.map(async i => ({\n jpeg: new Uint8Array(await (i.image as Blob).arrayBuffer()), width: Math.max(1, Math.round(this.width * scale)), height: Math.max(1, Math.round(this.height * scale)),\n })));\n return new Blob([buildPdf(pages, { title: opts.title }) as unknown as BlobPart], { type: 'application/pdf' });\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', 'motionBlur']);\n this._requireReady('contactSheet');\n const mb = this._blurFor(opts.motionBlur, 'movie.contactSheet()');\n const blurred = mb ? this._blurCanvas() : null;\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, wasAtPoster = this._atPoster;\n try {\n for (let i = 0; i < frames.length; i++) {\n const f = frames[i]!;\n if (mb && blurred) await this._quietly(() => this._exposeFrame(f, mb, blurred, true));\n else await this._quietly(() => this.gotoFrame(f, true));\n const { x, y } = L.positions[i]!;\n g.drawImage(blurred ?? (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 if (wasAtPoster) await this._showPoster(); // the movie is left as it was: still showing its poster\n else 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(t: number = this._timeOf(this.currentFrame)): void {\n if (!this._rootSequence || !this.app) return;\n this._rootSequence.updateSpace(t, this.app.renderer);\n }\n\n /** The motion blur an operation uses: its own option when given (`false` is off), otherwise the movie's. */\n private _blurFor(option: MotionBlurSpec | undefined, where: string): ResolvedMotionBlur | null {\n return option === undefined ? this.motionBlur : resolveMotionBlur(option, where);\n }\n\n /**\n * @internal Draw `frame` with motion blur into `target` (a canvas the size of the stage): the average of `mb.samples` renders at moments\n * spread over the shutter interval around the frame time. With `settle` the playhead and the stage are left exactly on the frame.\n */\n async _exposeFrame(frame: number, mb: ResolvedMotionBlur, target: HTMLCanvasElement, settle: boolean): Promise<void> {\n const g = target.getContext('2d')!;\n const stage = this.app!.canvas as HTMLCanvasElement;\n this._atPoster = false;\n const times = blurTimes(frame, this.frameRate, mb, Math.max(0, this.duration - END_MARGIN));\n for (let k = 0; k < times.length; k++) {\n const t = times[k]!;\n this.timeline!.time(t);\n await this._awaitVideoFrames(t);\n this._updateSpace(t);\n this._renderNow();\n if (k === 0) g.clearRect(0, 0, target.width, target.height);\n g.globalAlpha = 1 / (k + 1); // a running mean: sample k weighs 1/(k + 1)\n g.drawImage(stage, 0, 0, target.width, target.height);\n }\n g.globalAlpha = 1;\n if (settle) await this._goto(frame);\n else {\n this.currentFrame = Math.max(0, Math.min(frame, this.totalFrames));\n this.emit('frame', { frame: this.currentFrame, totalFrames: this.totalFrames } satisfies FrameEvent);\n }\n }\n\n private _blurCanvas(): HTMLCanvasElement {\n const stage = this.app!.canvas as HTMLCanvasElement;\n const c = document.createElement('canvas');\n c.width = stage.width; c.height = stage.height;\n return c;\n }\n\n /** Which stop the playhead is on or has passed (-1 before the first). */\n get stopIndex(): number { return stopAtOrBefore(this.stops, this.currentFrame)?.index ?? -1; }\n /** The stop the playhead is on or has passed, or null. */\n get currentStop(): Stop | null { return stopAtOrBefore(this.stops, this.currentFrame); }\n /** Which page the playhead is in (0-based), -1 before the first stop. */\n get pageIndex(): number { return this.currentStop?.pageIndex ?? -1; }\n /** How many pages the stops make. */\n get pageCount(): number { return pageStarts(this.stops).length; }\n\n private _cancelStop(): void {\n this._stopAt = null;\n this._settleStopWaiters();\n }\n private _settleStopWaiters(): void {\n const waiters = this._stopWaiters; this._stopWaiters = [];\n waiters.forEach(w => w());\n }\n private _emitStop(stop: Stop): void {\n this.emit('stop', { index: stop.index, stop, pageIndex: stop.pageIndex } satisfies StopEvent);\n }\n /** Land exactly on a stop's frame, pause, and say so. */\n private async _arriveAtStop(frame: number): Promise<void> {\n this._arriving = true;\n this._stopAt = null;\n try {\n this.pause();\n await this._goto(frame);\n } catch (err) {\n console.warn('pixi-effects: could not land on a stop:', err);\n this._emitError('playback', err);\n } finally { this._arriving = false; }\n const stop = this.stops.find(s => s.frame === frame);\n if (stop) this._emitStop(stop);\n this._settleStopWaiters();\n }\n\n /**\n * Play to the next stop and pause exactly there (a presentation's \"next\"). Pressed again while it is playing toward a stop, it skips the\n * rest of the animation and lands on that stop at once. After the last stop it plays to the end. Resolves when it has landed (or\n * stopped for another reason). An ordinary `play()` ignores the stops.\n */\n async next(): Promise<void> {\n if (this._initState !== 'ready') return;\n if (this._stopAt !== null) { await this._arriveAtStop(this._stopAt); return; }\n if (this.currentFrame >= this.totalFrames) return;\n const target = nextStopAfter(this.stops, this.currentFrame);\n this._stopAt = target ? target.frame : null;\n const landed = new Promise<void>(resolve => this._stopWaiters.push(resolve));\n this.play();\n await landed;\n }\n\n /** Jump back to the previous stop at once (no reverse playback); from the first stop, to the start. */\n async prev(): Promise<void> {\n if (this._initState !== 'ready') return;\n this.pause();\n const target = previousStopBefore(this.stops, this.currentFrame);\n await this.gotoFrame(target ? target.frame : 0, true);\n if (target) this._emitStop(target);\n }\n\n /** Jump to stop `index` (0-based). */\n async goToStop(index: number): Promise<void> {\n if (this._initState !== 'ready') return;\n const stop = this.stops[index];\n if (!stop) { console.warn(`pixi-effects: movie.goToStop(${index}): there are ${this.stops.length} stops (0 to ${this.stops.length - 1})`); return; }\n this.pause();\n await this.gotoFrame(stop.frame, true);\n this._emitStop(stop);\n }\n\n /** Jump to the first stop of page `page` (0-based). */\n async goToPage(page: number): Promise<void> {\n const starts = pageStarts(this.stops);\n const stop = starts[page];\n if (!stop) { console.warn(`pixi-effects: movie.goToPage(${page}): there are ${starts.length} pages (0 to ${starts.length - 1})`); return; }\n await this.goToStop(stop.index);\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 (this._stopAt !== null && frame >= this._stopAt) { void this._arriveAtStop(this._stopAt); return; }\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 this._settleStopWaiters();\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 if (!this._arriving) this._cancelStop();\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', 'motionBlur']);\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\n/** How far before the end of the movie its last frame is drawn (seconds): inside every layer's lifespan, far below a frame. */\nconst END_MARGIN = 1e-4;\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', quality?: number): Promise<Blob | string> {\n if (as === 'dataURL') return Promise.resolve(canvas.toDataURL(type, quality));\n return new Promise((resolve, reject) => canvas.toBlob(b => (b ? resolve(b) : reject(new Error('pixi-effects: could not encode the image'))), type, quality));\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 { SequenceSpec, Keyframe } from '../types';\nimport { warnUnknownOptions, suggestName } from '../core/options';\nimport { random, noise } from '../expr/random';\n\nconst KEYS = ['count', 'at', 'emit', 'life', 'area', 'angle', 'speed', 'gravity', 'wind', 'drag', 'sway', 'size', 'scale', 'fade', 'colors', 'shape', 'spin', 'seed', 'name', 'blendMode', 'template', 'sampleRate'] as const;\nconst SHAPES = ['circle', 'rect', 'star'] as const;\nconst MAX_KEYFRAMES = 30000;\n\ntype Range = number | [number, number];\n\nexport interface ParticlesOptions {\n /** How many particles. Required. */\n count: number;\n /** When the first one can be born, in composition seconds. Default 0. */\n at?: number;\n /** Births are spread over this many seconds (0, the default, is a burst: all at once). */\n emit?: number;\n /** How long each lives, in seconds: a number or `[min, max]`. Required. */\n life: Range;\n /** Where they start: the centre `x`, `y`, and optionally a `width` / `height` to spread over (snow: `{ x: 640, y: -20, width: 1280 }`). Required. */\n area: { x: number; y: number; width?: number; height?: number };\n /** Direction of the launch, degrees: 0 is right, 90 down, −90 up. A number or `[min, max]`. Default `[0, 360]`. */\n angle?: Range;\n /** Launch speed in px per second. Default `[100, 300]`. */\n speed?: Range;\n /** Acceleration down, px/s² (negative floats up). Default 0. */\n gravity?: number;\n /** Acceleration sideways, px/s². Default 0. */\n wind?: number;\n /** Air drag per second: they slow toward a terminal speed. Default 0. */\n drag?: number;\n /** A smooth side-to-side wobble: up to about ±`amp` px, `freq` wobbles per second (default 1). Snow, leaves, embers. */\n sway?: { amp: number; freq?: number };\n /** Radius in px (a square's half-side): a number or `[min, max]`. Default `[3, 6]`. */\n size?: Range;\n /** Scale over the life, `[start, end]` (`[1, 0]` shrinks away). Default none. */\n scale?: [number, number];\n /** Alpha ramps in seconds: `in` from transparent at birth, `out` back to transparent at the end of the life. */\n fade?: { in?: number; out?: number };\n /** Fill colours, picked at random for each particle. Default white. */\n colors?: string[];\n /** `'circle'` (default), `'rect'` (a square) or `'star'`. */\n shape?: 'circle' | 'rect' | 'star';\n /** Turning speed in degrees per second (a number or `[min, max]`; they also start at a random angle). Default none. */\n spin?: Range;\n /** Another seed is another burst. Default 0. */\n seed?: number;\n /** Layers are named `<name>-0`, `<name>-1`, … (default `'particle'`). */\n name?: string;\n /** `'add'` makes overlapping particles glow. */\n blendMode?: string;\n /** Use this layer (any type: an image, a text) for every particle instead of a shape; its keyframes are kept. */\n template?: SequenceSpec;\n /** Samples per second of a curved path (gravity, wind, drag, sway): straight steps between them. Default 20. */\n sampleRate?: number;\n}\n\n/**\n * Particles as plain layers: a burst, a fountain, snow, confetti, sparks. Each one is a layer with its own seeded start,\n * velocity, size, colour and life, and a path baked into keyframes (so playback, seeking and export agree), living only\n * while it is alive. Spread the result into `sequences`.\n *\n * ```js\n * ...particles({ count: 80, at: 2, life: [0.8, 1.6], area: { x: 640, y: 400 }, speed: [150, 450], gravity: 500,\n * size: [3, 7], colors: ['#ffd166', '#ff6b9d', '#4cc9f0'], fade: { out: 0.4 }, blendMode: 'add' })\n * ```\n *\n * A particle with no gravity, wind, drag or sway is one straight tween; a curved path is sampled `sampleRate` times a second.\n */\nexport function particles(opts: ParticlesOptions): SequenceSpec[] {\n warnUnknownOptions('particles()', opts, KEYS);\n const { count, at = 0, emit = 0, gravity = 0, wind = 0, drag = 0, sway, fade, colors = ['#ffffff'], shape = 'circle', seed = 0, name = 'particle', template, sampleRate = 20 } = opts;\n if (!(Number.isInteger(count) && count > 0)) throw new Error(`particles(): count must be a whole number of particles (at least 1), got ${count}`);\n const life = range('life', opts.life, 1e-6);\n if (!opts.area || !Number.isFinite(opts.area.x) || !Number.isFinite(opts.area.y)) throw new Error('particles(): area is required: { x, y } (the centre) and optionally width / height to spread over');\n if (!(Number.isFinite(emit) && emit >= 0)) throw new Error(`particles(): emit must be a number of seconds >= 0, got ${emit}`);\n if (!(Number.isFinite(sampleRate) && sampleRate > 0)) throw new Error(`particles(): sampleRate must be a positive number (samples per second), got ${sampleRate}`);\n if (!(SHAPES as readonly string[]).includes(shape)) {\n const g = suggestName(String(shape), SHAPES);\n throw new Error(`particles(): shape \"${shape}\" is not one of ${SHAPES.map(s => `\"${s}\"`).join(', ')}${g ? `; did you mean \"${g}\"?` : ''}`);\n }\n const angle = range('angle', opts.angle ?? [0, 360], -Infinity);\n const speed = range('speed', opts.speed ?? [100, 300], 0);\n const size = range('size', opts.size ?? [3, 6], 0);\n const spin = opts.spin === undefined ? null : range('spin', opts.spin, -Infinity);\n const curved = gravity !== 0 || wind !== 0 || drag !== 0 || !!sway;\n const worst = curved ? Math.max(1, Math.ceil(life[1] * sampleRate)) : 1;\n if (count * worst > MAX_KEYFRAMES) {\n throw new Error(`particles(): too many keyframes (${count} particles × up to ${worst} samples each): lower count or life, or lower sampleRate (now ${sampleRate})`);\n }\n\n const round = (v: number) => Math.round(v * 1e6) / 1e6;\n const out: SequenceSpec[] = [];\n for (let i = 0; i < count; i++) {\n const r = random(seed * 1000003 + i * 7919 + 17);\n const pick = ([a, b]: [number, number]) => a + r() * (b - a);\n const born = at + r() * emit;\n const lifetime = pick(life);\n const ax = (r() - 0.5) * (opts.area.width ?? 0), ay = (r() - 0.5) * (opts.area.height ?? 0);\n const x0 = opts.area.x + ax, y0 = opts.area.y + ay;\n const a = pick(angle) * Math.PI / 180, v = pick(speed);\n const vx = v * Math.cos(a), vy = v * Math.sin(a);\n const s = pick(size);\n const color = colors[Math.min(colors.length - 1, Math.floor(r() * colors.length))]!;\n const turn = spin ? pick(spin) : 0;\n const startAngle = spin ? r() * 360 : 0;\n const swayAmp = sway?.amp ?? 0, swayFreq = sway?.freq ?? 1;\n const n0 = sway ? noise(0, seed * 1000003 + i) : 0;\n\n const at_ = (t: number) => { // position t seconds after birth\n const axis = (p0: number, v0: number, acc: number) => {\n if (drag > 0) { const vInf = acc / drag; return p0 + vInf * t + (v0 - vInf) * (1 - Math.exp(-drag * t)) / drag; }\n return p0 + v0 * t + 0.5 * acc * t * t;\n };\n const sw = sway ? swayAmp * (noise(t * swayFreq, seed * 1000003 + i) - n0) : 0;\n return { x: axis(x0, vx, wind) + sw, y: axis(y0, vy, gravity) };\n };\n\n const kfs: Keyframe[] = [];\n const steps = curved ? Math.max(1, Math.ceil(lifetime * sampleRate)) : 1;\n const step = lifetime / steps;\n for (let k = 1; k <= steps; k++) {\n const p = at_(k * step);\n kfs.push({ at: round((k - 1) * step), to: { x: round(p.x), y: round(p.y) }, duration: round(step), ease: 'none' });\n }\n if (opts.scale) kfs.push({ at: 0, to: { scale: opts.scale[1] }, duration: round(lifetime), ease: 'none' });\n if (turn !== 0) kfs.push({ at: 0, to: { rotation: round(startAngle + turn * lifetime) }, duration: round(lifetime), ease: 'none' });\n if (fade?.in) kfs.push({ at: 0, to: { alpha: 1 }, duration: fade.in, ease: 'none' });\n if (fade?.out) kfs.push({ at: -fade.out, from: { alpha: 1 }, to: { alpha: 0 }, duration: fade.out, ease: 'none' });\n\n const initial: Record<string, number | string> = { x: round(x0), y: round(y0) };\n if (opts.scale) initial.scale = opts.scale[0];\n if (fade?.in) initial.alpha = 0;\n if (spin) initial.rotation = round(startAngle);\n\n const common = { name: `${name}-${i}`, at: round(born), duration: round(lifetime), ...(opts.blendMode ? { blendMode: opts.blendMode } : {}) };\n if (template) {\n const t = template as unknown as Record<string, unknown> & { initial?: Record<string, unknown>; keyframes?: Keyframe[] };\n out.push({ ...t, ...common, initial: { ...t.initial, ...initial }, keyframes: [...(t.keyframes ?? []), ...kfs] } as unknown as SequenceSpec);\n continue;\n }\n const style = { ...initial, fillColor: color };\n if (shape === 'circle') out.push({ type: 'shape', shape: 'circle', radius: round(s), ...common, initial: style, keyframes: kfs } as SequenceSpec);\n else if (shape === 'rect') out.push({ type: 'shape', shape: 'rect', width: round(s * 2), height: round(s * 2), ...common, initial: style, keyframes: kfs } as SequenceSpec);\n else {\n const points: Array<[number, number]> = [];\n for (let p = 0; p < 10; p++) {\n const rad = (p % 2 === 0 ? s : s * 0.45), ang = -Math.PI / 2 + (p * Math.PI) / 5;\n points.push([round(rad * Math.cos(ang)), round(rad * Math.sin(ang))]);\n }\n out.push({ type: 'shape', shape: 'polygon', points, ...common, initial: style, keyframes: kfs } as SequenceSpec);\n }\n }\n return out;\n}\n\nfunction range(name: string, v: Range, min: number): [number, number] {\n const [a, b] = typeof v === 'number' ? [v, v] : v;\n if (!(Number.isFinite(a) && Number.isFinite(b)) || a > b || a < min || (min > 0 && a <= 0)) {\n throw new Error(`particles(): ${name} must be a number or [min, max] with min <= max${min > -Infinity ? ` and min >= ${min}` : ''}, got ${JSON.stringify(v)}`);\n }\n return [a, b];\n}\n","import type { Keyframe } from '../types';\nimport { warnUnknownOptions } from '../core/options';\nimport { flattenSvgPath } from '../sequences/trimPath';\nimport { parseEase } from './_ease';\n\nconst KEYS = ['d', 'at', 'duration', 'ease', 'from', 'to', 'orient', 'rotate', 'frameRate'] as const;\nconst MAX_STEPS = 2000;\n\nexport interface FollowPathOptions {\n /** The route, as SVG path data in the same canvas coordinates the layer's `x` / `y` use. Several sub-paths are walked in order. */\n d: string;\n /** Start, in seconds from the start of the layer. Default 0. */\n at?: number;\n /** How long the trip takes, in seconds. Required. */\n duration: number;\n /** GSAP ease for the progress along the path (default `'none'`: constant speed). */\n ease?: string;\n /** Where on the path to start and stop, as fractions 0–1 of its length (default 0 → 1). `from: 1, to: 0` goes backwards. */\n from?: number;\n to?: number;\n /** Turn the layer to face the way it is going (keyframes `rotation`, in degrees). Default false. */\n orient?: boolean;\n /** With `orient`: degrees added to the heading (`-90` for an image that points up). Default 0. */\n rotate?: number;\n /** Samples per second: set it to your movie's `frameRate` so the layer is exactly on the path at every frame. Default 30. */\n frameRate?: number;\n}\n\ninterface Segment { x0: number; y0: number; x1: number; y1: number; start: number; len: number }\n\n/**\n * A layer travelling along an SVG path, as keyframes for `x` and `y` (and `rotation` with `orient`). Put the result in a\n * layer's `keyframes`; the layer's own `x` / `y` are the points of the path, so give circles and shapes their centre there\n * and text `anchorX: 0.5, anchorY: 0.5`.\n *\n * The path is walked by arc length (so the speed is even whatever the curve) and sampled once per frame as short straight\n * steps, which keeps the layer on the path at every rendered frame when `frameRate` matches the movie's.\n *\n * ```js\n * { type: 'shape', shape: 'circle', radius: 12, initial: { fillColor: '#ffd166' },\n * keyframes: followPath({ d: 'M 100 600 C 300 100 900 100 1180 600', duration: 4, ease: 'power2.inOut', frameRate: 30 }) }\n * ```\n */\nexport function followPath(opts: FollowPathOptions): Keyframe[] {\n warnUnknownOptions('followPath()', opts, KEYS);\n const { d, at = 0, duration, ease = 'none', from = 0, to = 1, orient = false, rotate = 0, frameRate = 30 } = opts;\n if (typeof d !== 'string' || d.trim() === '') throw new Error('followPath(): d must be SVG path data, e.g. \"M 100 600 C 300 100 900 100 1180 600\"');\n if (!(Number.isFinite(duration) && duration > 0)) throw new Error(`followPath(): duration must be a positive number of seconds, got ${duration}`);\n if (!(Number.isFinite(frameRate) && frameRate > 0)) throw new Error(`followPath(): frameRate must be a positive number (samples per second), got ${frameRate}`);\n for (const [n, v] of [['from', from], ['to', to]] as const) {\n if (!(Number.isFinite(v) && v >= 0 && v <= 1)) throw new Error(`followPath(): ${n} must be a fraction of the path between 0 and 1, got ${v}`);\n }\n const steps = Math.max(1, Math.round(duration * frameRate));\n if (steps > MAX_STEPS) throw new Error(`followPath(): ${steps} samples is too many (max ${MAX_STEPS}); lower frameRate or duration`);\n\n const segments: Segment[] = [];\n let total = 0;\n for (const line of flattenSvgPath(d)) {\n const p = line.closed ? [...line.pts, line.pts[0]!, line.pts[1]!] : line.pts;\n for (let i = 2; i < p.length; i += 2) {\n const len = Math.hypot(p[i]! - p[i - 2]!, p[i + 1]! - p[i - 1]!);\n if (len === 0) continue;\n segments.push({ x0: p[i - 2]!, y0: p[i - 1]!, x1: p[i]!, y1: p[i + 1]!, start: total, len });\n total += len;\n }\n }\n if (!(total > 0)) throw new Error(`followPath(): the path \"${d}\" has no length (it needs at least two different points)`);\n\n const find = (s: number): Segment => {\n let lo = 0, hi = segments.length - 1;\n while (lo < hi) { const mid = (lo + hi) >> 1; if (segments[mid]!.start + segments[mid]!.len < s) lo = mid + 1; else hi = mid; }\n return segments[lo]!;\n };\n const at_ = (fraction: number): { x: number; y: number; heading: number } => {\n const s = Math.min(Math.max(fraction, 0), 1) * total;\n const g = find(s);\n const t = Math.min(Math.max((s - g.start) / g.len, 0), 1);\n return { x: g.x0 + (g.x1 - g.x0) * t, y: g.y0 + (g.y1 - g.y0) * t, heading: Math.atan2(g.y1 - g.y0, g.x1 - g.x0) * 180 / Math.PI };\n };\n\n const shape = parseEase(ease);\n const round = (v: number) => Math.round(v * 1e6) / 1e6;\n let turn = 0; // heading is kept continuous: 179° → 181°, not −179°\n const sample = (k: number): Record<string, number> => {\n const p = from + (to - from) * shape(k / steps);\n const pt = at_(p);\n const out: Record<string, number> = { x: round(pt.x), y: round(pt.y) };\n if (orient) {\n let h = pt.heading + rotate;\n if (k === 0) turn = h;\n else { let delta = h - turn; delta -= 360 * Math.round(delta / 360); turn += delta; }\n out.rotation = round(turn);\n }\n return out;\n };\n\n const out: Keyframe[] = [{ at, set: sample(0) }];\n const step = duration / steps;\n for (let k = 1; k <= steps; k++) out.push({ at: round(at + (k - 1) * step), to: sample(k), duration: round(step), ease: 'none' });\n return out;\n}\n","import { warnUnknownOptions } from '../core/options';\nimport { random } from '../expr/random';\nimport { parseEase } from './_ease';\n\nconst STAGGER_KEYS = ['each', 'amount', 'from', 'grid', 'ease', 'seed'] as const;\nconst FROM_NAMES = ['start', 'end', 'center', 'edges', 'random'] as const;\n\nexport interface StaggerOptions {\n /** Seconds between neighbours (the farthest one waits `each` × its distance). Default 0.1. Not together with `amount`. */\n each?: number;\n /** Seconds from the first to the last, however many there are. Not together with `each`. */\n amount?: number;\n /**\n * Where the wave starts: `'start'` (default), `'end'`, `'center'` (outward), `'edges'` (inward), `'random'` (a seeded\n * shuffle of the same delays), or the index of one item.\n */\n from?: 'start' | 'end' | 'center' | 'edges' | 'random' | number;\n /** `[columns, rows]`: the items fill a grid row by row and the wave travels by straight-line distance across it. */\n grid?: [number, number];\n /** GSAP ease that reshapes the spread (default `'none'`: even steps). The first stays at 0, the last at the full spread. */\n ease?: string;\n /** For `from: 'random'`: another seed is another order. Default 0. */\n seed?: number;\n}\n\n/**\n * Delays for a wave of items, in seconds, in the style of GSAP's `stagger`.\n *\n * stagger(6, { each: 0.08 }) // [0, 0.08, 0.16, …] use: `at: 1 + d[i]`\n * stagger(letters, { each: 0.05, from: 'center' }) // the same layers with their `at` pushed back\n *\n * Given a layer array it returns new layers whose `at` is shifted by their delay; the originals are not touched.\n * Everything is a pure function of the options (`from: 'random'` is seeded), so playback and export agree.\n */\nexport function stagger(count: number, options?: StaggerOptions): number[];\nexport function stagger<T extends { at?: number }>(layers: readonly T[], options?: StaggerOptions): T[];\nexport function stagger<T extends { at?: number }>(items: number | readonly T[], options: StaggerOptions = {}): number[] | T[] {\n const isCount = typeof items === 'number';\n const n = isCount ? items : items.length;\n if (!Number.isInteger(n) || n < 0) throw new Error(`stagger(): count must be a whole number of items, got ${n}`);\n warnUnknownOptions('stagger()', options, STAGGER_KEYS);\n const { each, amount, from = 'start', grid, ease = 'none', seed = 0 } = options;\n if (each !== undefined && amount !== undefined) throw new Error('stagger(): give `each` (seconds between neighbours) or `amount` (seconds in total), not both');\n if (each !== undefined && !(Number.isFinite(each) && each >= 0)) throw new Error(`stagger(): each must be a number of seconds >= 0, got ${each}`);\n if (amount !== undefined && !(Number.isFinite(amount) && amount >= 0)) throw new Error(`stagger(): amount must be a number of seconds >= 0, got ${amount}`);\n if (typeof from === 'string' && !(FROM_NAMES as readonly string[]).includes(from)) {\n throw new Error(`stagger(): from \"${from}\" is not one of ${FROM_NAMES.map(f => `\"${f}\"`).join(', ')} or an item index`);\n }\n if (typeof from === 'number' && !(Number.isInteger(from) && from >= 0 && from < Math.max(n, 1))) throw new Error(`stagger(): from ${from} is not an index of the ${n} items`);\n if (grid && !(Array.isArray(grid) && grid.length === 2 && grid.every(g => Number.isInteger(g) && g > 0) && grid[0]! * grid[1]! >= n)) {\n throw new Error(`stagger(): grid must be [columns, rows] and hold all ${n} items, got ${JSON.stringify(grid)}`);\n }\n\n const dist = distances(n, from, grid, seed);\n const max = dist.reduce((m, d) => Math.max(m, d), 0);\n const total = amount !== undefined ? amount : (each ?? 0.1) * max;\n const shape = parseEase(ease);\n const delays = dist.map(d => (max === 0 ? 0 : Math.round(total * shape(d / max) * 1e6) / 1e6));\n if (isCount) return delays;\n return (items as readonly T[]).map((layer, i) => ({ ...layer, at: Math.round(((layer.at ?? 0) + delays[i]!) * 1e6) / 1e6 }));\n}\n\n/** How far each item is from where the wave starts, in item steps (a straight line across a grid). */\nfunction distances(n: number, from: NonNullable<StaggerOptions['from']>, grid: [number, number] | undefined, seed: number): number[] {\n if (n === 0) return [];\n if (from === 'random') {\n const order = Array.from({ length: n }, (_, i) => i);\n const r = random(seed);\n for (let i = n - 1; i > 0; i--) { const j = Math.floor(r() * (i + 1)); [order[i], order[j]] = [order[j]!, order[i]!]; }\n return order;\n }\n if (!grid) {\n const mid = (n - 1) / 2;\n return Array.from({ length: n }, (_, i) => {\n switch (from) {\n case 'start': return i;\n case 'end': return n - 1 - i;\n case 'center': return Math.abs(i - mid);\n case 'edges': return mid - Math.abs(i - mid);\n default: return Math.abs(i - from);\n }\n });\n }\n const [cols, rows] = grid;\n const at = (i: number) => ({ x: i % cols, y: Math.floor(i / cols) });\n const origin = from === 'start' ? { x: 0, y: 0 }\n : from === 'end' ? { x: cols - 1, y: rows - 1 }\n : from === 'center' || from === 'edges' ? { x: (cols - 1) / 2, y: (rows - 1) / 2 }\n : at(from);\n const d = Array.from({ length: n }, (_, i) => Math.hypot(at(i).x - origin.x, at(i).y - origin.y));\n if (from !== 'edges') return d;\n const far = Math.max(...d);\n return d.map(v => far - v);\n}\n","import type { Keyframe } from '../types';\nimport { warnUnknownOptions } from '../core/options';\nimport { rand } from '../expr/random';\n\nconst WIGGLE_KEYS = ['at', 'duration', 'freq', 'seed', 'ease', 'props'] as const;\nconst MAX_STEPS = 2000;\n\nexport interface WiggleProp {\n /** The value the property rests at: a number or an expression (`'W/2'`). The wiggle starts and ends here. */\n around: number | string;\n /** How far it strays from `around` (same unit as the property). */\n amp: number;\n}\n\nexport interface WiggleOptions {\n /** Start, in seconds from the start of the layer. Default 0. */\n at?: number;\n /** How long it shakes, in seconds. Required. */\n duration: number;\n /** New random targets per second. Default 3 (a drift); 8 and up reads as a shake. */\n freq?: number;\n /** Another seed is another take of the same shake. Default 0. */\n seed?: number;\n /** GSAP ease between targets. Default `'sine.inOut'`; `'none'` gives straight, jittery lines. */\n ease?: string;\n /** The properties to move, each independently: `{ x: { around: 960, amp: 6 }, rotation: { around: 0, amp: 1.5 } }`. */\n props: Record<string, WiggleProp>;\n}\n\n/**\n * A seeded wiggle as keyframes: put the result in a layer's `keyframes`\n * (spread it next to others: `keyframes: [...wiggle({ … }), { at: 4, to: … }]`).\n *\n * Expressions are evaluated once when the layer is built, so a wiggle cannot\n * be an expression; it is baked into ordinary keyframes instead. The targets\n * come from the seed, so playback, seeking and export all agree. The last step\n * returns every property to `around`, so the layer is not left offset.\n */\nexport function wiggle(opts: WiggleOptions): Keyframe[] {\n warnUnknownOptions('wiggle()', opts, WIGGLE_KEYS);\n const { at = 0, duration, freq = 3, seed = 0, ease = 'sine.inOut', props } = opts;\n if (!(Number.isFinite(duration) && duration > 0)) throw new Error(`wiggle(): duration must be a positive number of seconds, got ${duration}`);\n if (!(Number.isFinite(freq) && freq > 0)) throw new Error(`wiggle(): freq must be a positive number (steps per second), got ${freq}`);\n const names = Object.keys(props ?? {});\n if (names.length === 0) throw new Error('wiggle(): props is empty; name at least one property, e.g. props: { x: { around: 100, amp: 8 } }');\n for (const n of names) {\n const p = props[n]!;\n if (!Number.isFinite(p.amp)) throw new Error(`wiggle(): props.${n}.amp must be a number, got ${p.amp}`);\n if (p.around === undefined || p.around === null || p.around === '') throw new Error(`wiggle(): props.${n}.around is missing`);\n }\n const steps = Math.ceil(duration * freq - 1e-9);\n if (steps > MAX_STEPS) throw new Error(`wiggle(): ${steps} steps is too many (max ${MAX_STEPS}); lower freq or duration`);\n\n const set: Record<string, number | string> = {};\n for (const n of names) set[n] = props[n]!.around;\n const out: Keyframe[] = [{ at, set }];\n const stepLen = duration / steps;\n for (let s = 0; s < steps; s++) {\n const to: Record<string, number | string> = {};\n names.forEach((n, pi) => {\n const p = props[n]!;\n if (s === steps - 1) { to[n] = p.around; return; }\n const off = (rand(seed * 7919 + pi * 104729 + s * 31 + 1) * 2 - 1) * p.amp;\n to[n] = typeof p.around === 'number'\n ? p.around + off\n : `(${p.around}) ${off < 0 ? '-' : '+'} ${Math.abs(off)}`;\n });\n out.push({ at: at + s * stepLen, to, duration: stepLen, ease });\n }\n return out;\n}\n","import type { Keyframe, TextSequenceSpec } from '../types';\nimport { warnUnknownOptions, suggestName } from '../core/options';\nimport { measureText, splitText, type MeasureStyle, type TextPiece } from '../text/measure';\nimport { stagger, type StaggerOptions } from './stagger';\nimport { wiggle } from './wiggle';\n\nconst KEYS = ['by', 'x', 'y', 'align', 'name', 'at', 'duration', 'in', 'out', 'stagger', 'idle', 'styleFor'] as const;\n\n/** Where a piece starts (`from`), as offsets in x / y and absolute values for the rest, and how it gets to its resting place. */\nconst PRESETS = {\n rise: { from: { y: 40, alpha: 0 }, duration: 0.5, ease: 'back.out(2)' },\n drop: { from: { y: -50, alpha: 0 }, duration: 0.7, ease: 'bounce.out' },\n fade: { from: { alpha: 0 }, duration: 0.5, ease: 'power1.out' },\n pop: { from: { scale: 0, alpha: 0 }, duration: 0.45, ease: 'back.out(2.4)' },\n zoom: { from: { scale: 2.5, alpha: 0 }, duration: 0.6, ease: 'power3.out' },\n slide: { from: { x: -60, alpha: 0 }, duration: 0.5, ease: 'power3.out' },\n spin: { from: { rotation: -90, scale: 0, alpha: 0 }, duration: 0.6, ease: 'back.out(1.7)' },\n} as const;\nexport type TextPreset = keyof typeof PRESETS;\nconst PRESET_NAMES = Object.keys(PRESETS);\n\nexport interface AnimateTextTween {\n /** Start from this preset and change what you give below. */\n preset?: TextPreset;\n /** The hidden state: `x` / `y` are offsets from the resting place, everything else (`alpha`, `scale`, `rotation`, …) is absolute. */\n from?: Record<string, number>;\n /** The resting state, for properties that have none of their own (`alpha` 1, `scale` 1, `rotation` 0 and the place are known). */\n to?: Record<string, number>;\n /** Seconds each piece takes. */\n duration?: number;\n /** GSAP ease. */\n ease?: string;\n}\n\nexport interface AnimateTextOptions {\n /** What a piece is: a character (default), a word or a line. */\n by?: 'chars' | 'words' | 'lines';\n /** Where the text goes: `x` is its left edge, or its centre / right edge with `align`. */\n x?: number;\n /** Top of the first line. */\n y?: number;\n align?: 'left' | 'center' | 'right';\n /** Layers are named `<name>-0`, `<name>-1`, … (default `'text'`). */\n name?: string;\n /** When the first piece starts, in composition seconds. Default 0. */\n at?: number;\n /** Seconds from `at` until every piece is gone, the last one included. Required. */\n duration: number;\n /** How a piece arrives: a preset (`'rise'` default, `'drop'`, `'fade'`, `'pop'`, `'zoom'`, `'slide'`, `'spin'`), your own tween, or `false` for none. */\n in?: TextPreset | AnimateTextTween | false;\n /** How a piece leaves, in the same wave (the entrance backwards, eased the other way). Default none. */\n out?: TextPreset | AnimateTextTween | false;\n /** The wave: see {@link stagger}. Default `{ each: 0.04 }`. */\n stagger?: StaggerOptions;\n /** A seeded drift between the entrance and the exit, each piece its own: `{ y: 4, rotation: 1 }` (amounts), `freq` (default 1 target per second), `seed`. */\n idle?: { x?: number; y?: number; rotation?: number; scale?: number; freq?: number; seed?: number };\n /** Style changes for one piece (a colour for the first letter): merged over `style`. */\n styleFor?: (piece: TextPiece) => MeasureStyle;\n}\n\ninterface Resolved { from: Record<string, number>; to: Record<string, number>; duration: number; ease: string }\n\n/**\n * Per-character, per-word or per-line text animation in one call: one text layer per piece, laid out exactly like the\n * whole text, each entering (and optionally leaving) in a wave. It is `splitText` + `stagger` + a preset, so the result\n * is plain layers you can spread into `sequences`, add to, or change.\n *\n * ```js\n * ...animateText('Hello world', style, { x: 640, y: 300, align: 'center', at: 0.5, duration: 5,\n * in: 'rise', out: 'fade', stagger: { each: 0.05, from: 'center' } })\n * ```\n *\n * Pieces rotate and scale about their own centre. All pieces are gone at `at + duration`.\n */\nexport function animateText(text: string, style: MeasureStyle, options: AnimateTextOptions): TextSequenceSpec[] {\n warnUnknownOptions('animateText()', options, KEYS);\n const { by = 'chars', x = 0, y = 0, align = 'left', name = 'text', at = 0, duration, idle, styleFor } = options;\n if (!(Number.isFinite(duration) && duration > 0)) throw new Error(`animateText(): duration must be a positive number of seconds (how long until the last piece is gone), got ${duration}`);\n const pieces = splitText(text, style, { by, x, y, align });\n if (pieces.length === 0) return [];\n\n const lineHeight = measureText('M', style).height;\n const inTween = options.in === false ? null : resolveTween(options.in ?? 'rise', 'in');\n const outTween = options.out === undefined || options.out === false ? null : resolveTween(options.out, 'out');\n const delays = stagger(pieces.length, options.stagger ?? { each: 0.04 });\n const wave = Math.max(...delays);\n const need = (inTween?.duration ?? 0) + (outTween?.duration ?? 0) + wave;\n if (duration < need - 1e-9) {\n throw new Error(`animateText(): duration ${duration} is too short for this wave: the entrance${outTween ? ', the exit' : ''} and the stagger need at least ${+need.toFixed(3)} s`);\n }\n\n const end = at + duration;\n return pieces.map((p, i) => {\n const cx = p.x + p.width / 2, cy = p.y + lineHeight / 2;\n const rest: Record<string, number> = { x: cx, y: cy, alpha: 1, scale: 1, scaleX: 1, scaleY: 1, rotation: 0 };\n const start = at + delays[i]!;\n const len = end - start;\n const keyframes: Keyframe[] = [];\n const place = (key: string, v: number) => (key === 'x' || key === 'y' ? rest[key]! + v : v);\n if (inTween) {\n keyframes.push({\n at: 0, duration: inTween.duration, ease: inTween.ease,\n from: Object.fromEntries(Object.entries(inTween.from).map(([k, v]) => [k, place(k, v)])),\n to: Object.fromEntries(Object.keys(inTween.from).map(k => [k, inTween.to[k] ?? rest[k]!])),\n });\n }\n let idleEnd = len;\n if (outTween) {\n const begin = outTween.duration + (wave - delays[i]!); // seconds before this piece's end\n idleEnd = len - begin;\n keyframes.push({\n at: -begin, duration: outTween.duration, ease: outTween.ease,\n from: Object.fromEntries(Object.keys(outTween.from).map(k => [k, outTween.to[k] ?? rest[k]!])),\n to: Object.fromEntries(Object.entries(outTween.from).map(([k, v]) => [k, place(k, v)])),\n });\n }\n if (idle) {\n const props: Record<string, { around: number; amp: number }> = {};\n for (const k of ['x', 'y', 'rotation', 'scale'] as const) if (idle[k] !== undefined) props[k] = { around: rest[k]!, amp: idle[k]! };\n const freq = idle.freq ?? 1;\n const from = inTween?.duration ?? 0;\n if (Object.keys(props).length > 0 && idleEnd - from >= 1 / freq) {\n keyframes.push(...wiggle({ at: from, duration: idleEnd - from, freq, seed: (idle.seed ?? 0) * 1000 + i, props }));\n }\n }\n return {\n type: 'text', name: `${name}-${i}`, text: p.text, style: styleFor ? { ...style, ...styleFor(p) } : style,\n at: start, duration: len,\n initial: { x: cx, y: cy, anchorX: 0.5, anchorY: 0.5 },\n keyframes,\n } as TextSequenceSpec;\n });\n}\n\nfunction resolveTween(spec: TextPreset | AnimateTextTween, which: 'in' | 'out'): Resolved {\n const t: AnimateTextTween = typeof spec === 'string' ? { preset: spec } : spec;\n if (t.preset !== undefined && !(t.preset in PRESETS)) {\n const guess = suggestName(String(t.preset), PRESET_NAMES);\n throw new Error(`animateText(): ${which} \"${t.preset}\" is not a preset${guess ? `; did you mean \"${guess}\"?` : ''} (presets: ${PRESET_NAMES.map(n => `\"${n}\"`).join(', ')})`);\n }\n const base = t.preset ? PRESETS[t.preset] : undefined;\n const from: Record<string, number> = { ...(base?.from ?? {}), ...(t.from ?? {}) };\n const to = t.to ?? {};\n const known = new Set(['x', 'y', 'alpha', 'scale', 'scaleX', 'scaleY', 'rotation']);\n for (const k of Object.keys(from)) {\n if (!known.has(k) && to[k] === undefined) throw new Error(`animateText(): ${which}.from has \"${k}\", which has no resting value; give ${which}.to: { ${k}: … }`);\n }\n if (Object.keys(from).length === 0) throw new Error(`animateText(): ${which} needs a preset or a from`);\n let ease = t.ease ?? base?.ease ?? 'power2.out';\n if (which === 'out' && t.ease === undefined) ease = ease.replace('.out', '.in');\n return { from, to: { ...to }, duration: t.duration ?? base?.duration ?? 0.5, ease };\n}\n","import type { Keyframe } from '../types';\nimport type { AudioEnvelope } from '../audio/envelope';\nimport { warnUnknownOptions } from '../core/options';\n\nconst KEYS = ['at', 'duration', 'props', 'audioOffset', 'loop', 'frameRate'] as const;\nconst PROP_KEYS = ['base', 'amount', 'band', 'beats', 'decay', 'attack', 'release', 'invert', 'curve'] as const;\nconst MAX_STEPS = 4000;\n\nexport interface ReactProp {\n /** The value at rest (a level of 0). Default 0. */\n base?: number;\n /** How far the value goes at a level of 1 (can be negative). Required. */\n amount: number;\n /** Which series of the envelope drives it: `'level'` (default) or a band (`'bass'`, `'mid'`, `'treble'`, or your own). */\n band?: string;\n /** Follow the beats instead: a jump to full on each beat, falling off after it (see `decay`). */\n beats?: boolean;\n /** With `beats`: seconds for the pulse to fall to 37 %. Default 0.2. */\n decay?: number;\n /** Smoothing, in seconds, for a level that rises (`attack`) and falls (`release`), like a level meter: a quick rise and a slow fall looks like a bounce. Default none. */\n attack?: number;\n release?: number;\n /** Use 1 − level (it gets smaller as the sound gets louder). */\n invert?: boolean;\n /** Raise the level to this power first: above 1 only the loud parts move it (a punchier look), below 1 even the quiet ones do. Default 1. */\n curve?: number;\n}\n\nexport interface ReactOptions {\n /** Start, in seconds from the start of the layer. Default 0. */\n at?: number;\n /** How long it follows the sound, in seconds. Required. */\n duration: number;\n /** The properties to move and how, each its own way: `{ scale: { base: 1, amount: 0.3, band: 'bass' }, alpha: { base: 0.3, amount: 0.7 } }`. */\n props: Record<string, ReactProp>;\n /** Where in the sound the layer's start is, in seconds (the layer starts 2 s after the music began: `audioOffset: 2`). Default 0. */\n audioOffset?: number;\n /** The sound repeats (a looping music layer) instead of the last value being held. */\n loop?: boolean;\n /** Samples per second (default: the envelope's, so one per video frame). Lower it for a long layer, the steps get longer. */\n frameRate?: number;\n}\n\n/**\n * Keyframes that follow a sound: `base + amount × level` sampled once per frame from an envelope (`audioEnvelope()` for a real file,\n * `bpmEnvelope()` for a tempo), so playback, seeking and export all agree. Put the result in a layer's `keyframes`.\n *\n * ```js\n * const env = await audioEnvelope('music.mp3', { frameRate: 30 });\n * { type: 'shape', shape: 'circle', radius: 120, initial: { x: 640, y: 360 },\n * keyframes: react(env, { duration: 12, props: { scale: { base: 1, amount: 0.4, band: 'bass', attack: 0.02, release: 0.2 } } }) }\n * ```\n */\nexport function react(env: AudioEnvelope, options: ReactOptions): Keyframe[] {\n warnUnknownOptions('react()', options, KEYS);\n const { at = 0, duration, props, audioOffset = 0, loop = false } = options;\n const frameRate = options.frameRate ?? env.frameRate;\n if (!(Number.isFinite(duration) && duration > 0)) throw new Error(`react(): duration must be a positive number of seconds, got ${duration}`);\n if (!(Number.isFinite(frameRate) && frameRate > 0)) throw new Error(`react(): frameRate must be a positive number, got ${frameRate}`);\n const names = Object.keys(props ?? {});\n if (names.length === 0) throw new Error('react(): props is empty; name at least one property, e.g. props: { scale: { base: 1, amount: 0.3 } }');\n for (const n of names) {\n const p = props[n]!;\n warnUnknownOptions(`react() props.${n}`, p, PROP_KEYS);\n if (!Number.isFinite(p.amount)) throw new Error(`react(): props.${n}.amount must be a number, got ${p.amount}`);\n if (!p.beats && p.band !== undefined && !env.series[p.band]) throw new Error(`react(): props.${n}: band \"${p.band}\" is not in this envelope (it has: ${Object.keys(env.series).join(', ')})`);\n if (p.beats && !(p.decay === undefined || (Number.isFinite(p.decay) && p.decay > 0))) throw new Error(`react(): props.${n}.decay must be a positive number of seconds, got ${p.decay}`);\n }\n const steps = Math.max(1, Math.round(duration * frameRate));\n if (steps > MAX_STEPS) throw new Error(`react(): too many keyframes (${steps} steps, max ${MAX_STEPS}); lower frameRate (now ${frameRate}) or duration`);\n\n const wrap = (a: number): number => (loop && env.duration > 0 ? ((a % env.duration) + env.duration) % env.duration : a);\n const beatPulse = (a: number, decay: number): number => {\n const beats = env.beats;\n let lo = 0, hi = beats.length - 1, found = -1;\n while (lo <= hi) { const mid = (lo + hi) >> 1; if (beats[mid]! <= a + 1e-9) { found = mid; lo = mid + 1; } else hi = mid - 1; }\n if (found < 0) return 0;\n return Math.exp(-(a - beats[found]!) / decay);\n };\n\n const round = (v: number) => Math.round(v * 1e4) / 1e4;\n const state: Record<string, number> = {};\n const values = (k: number): Record<string, number> => {\n const t = k / frameRate, a = wrap(audioOffset + t);\n const out: Record<string, number> = {};\n for (const n of names) {\n const p = props[n]!;\n let x = p.beats ? beatPulse(a, p.decay ?? 0.2) : env.at(a, p.band ?? 'level');\n if (p.invert) x = 1 - x;\n const prev = state[n];\n if (prev !== undefined && (p.attack || p.release)) {\n const tau = x > prev ? p.attack ?? 0 : p.release ?? 0;\n if (tau > 0) x = prev + (x - prev) * (1 - Math.exp(-(1 / frameRate) / tau));\n }\n state[n] = x;\n const shaped = p.curve && p.curve !== 1 ? Math.pow(Math.max(0, x), p.curve) : x;\n out[n] = round((p.base ?? 0) + p.amount * shaped);\n }\n return out;\n };\n\n const out: Keyframe[] = [{ at, set: values(0) }];\n const step = duration / steps;\n for (let k = 1; k <= steps; k++) out.push({ at: round6(at + (k - 1) * step), to: values(k), duration: round6(step), ease: 'none' });\n return out;\n}\n\nconst round6 = (v: number): number => Math.round(v * 1e6) / 1e6;\n","import { fft } from '../core/spectrum';\nimport { warnUnknownOptions } from '../core/options';\n\n/** The part of an `AudioBuffer` the analysis reads (so it can be tested with plain arrays). */\nexport interface AudioLike {\n sampleRate: number;\n numberOfChannels: number;\n length: number;\n getChannelData(channel: number): Float32Array;\n}\n\nexport interface EnvelopeOptions {\n /** One value per video frame: use your movie's `frameRate`. Default 30. */\n frameRate?: number;\n /** Frequency bands in Hz, `{ name: [from, to] }`. Default `{ bass: [20, 150], mid: [150, 2000], treble: [2000, 10000] }`. */\n bands?: Record<string, [number, number]>;\n /** The band the beats are looked for in (default `'bass'`, or `'level'` if there is no such band). */\n beatBand?: string;\n /** More (above 1) or fewer (below 1) beats. Default 1. */\n beatSensitivity?: number;\n}\n\n/** What a piece of sound does over time, as numbers between 0 and 1, one per video frame, plus where its beats are. */\nexport interface AudioEnvelope {\n frameRate: number;\n /** Seconds of sound. */\n duration: number;\n /** Values per series (`frames`). */\n frames: number;\n /** `level` (the overall loudness) and one series per band, each 0–1 on a log (perceptual) scale. */\n series: Record<string, Float32Array>;\n /** Times of the beats, in seconds. */\n beats: number[];\n /** The tempo estimated from the beats (null if there are too few). */\n bpm: number | null;\n /** The value of a series at a time (seconds): interpolated between frames, held at the ends. `series` defaults to `'level'`. */\n at(time: number, series?: string): number;\n}\n\nconst DEFAULT_BANDS: Record<string, [number, number]> = { bass: [20, 150], mid: [150, 2000], treble: [2000, 10000] };\nconst WINDOW = 2048;\nconst RANGE_DB = 36; // 36 dB below the loudest is zero\nconst MIN_BEAT_GAP = 0.2; // seconds\nconst OPTION_KEYS = ['frameRate', 'bands', 'beatBand', 'beatSensitivity'] as const;\n\nfunction makeAt(frameRate: number, series: Record<string, Float32Array>): AudioEnvelope['at'] {\n return (time, name = 'level') => {\n const s = series[name];\n if (!s) throw new Error(`pixi-effects: this envelope has no series \"${name}\" (it has: ${Object.keys(series).join(', ')})`);\n const x = Math.min(Math.max(time * frameRate, 0), s.length - 1);\n const i = Math.floor(x), f = x - i;\n return i + 1 < s.length ? s[i]! + (s[i + 1]! - s[i]!) * f : s[i]!;\n };\n}\n\nfunction percentile(values: Float32Array | Float64Array, p: number): number {\n if (values.length === 0) return 0;\n const sorted = Float64Array.from(values).sort();\n return sorted[Math.min(sorted.length - 1, Math.floor(p * (sorted.length - 1)))]!;\n}\n\nfunction pickBeats(strength: Float32Array, frameRate: number, sensitivity: number): number[] {\n const n = strength.length;\n const flux = new Float64Array(n);\n for (let i = 1; i < n; i++) flux[i] = Math.max(0, strength[i]! - strength[i - 1]!);\n const half = Math.max(2, Math.round(frameRate * 0.5));\n const gap = Math.max(1, Math.round(MIN_BEAT_GAP * frameRate));\n const beats: number[] = [];\n let last = -gap;\n for (let i = 1; i < n; i++) {\n const v = flux[i]!;\n if (v < 0.12 / sensitivity || v < flux[i - 1]! || v <= (flux[i + 1] ?? 0)) continue; // big enough, and the top of its little hill\n let mean = 0, sq = 0, count = 0;\n for (let j = Math.max(0, i - half); j <= Math.min(n - 1, i + half); j++) { mean += flux[j]!; sq += flux[j]! * flux[j]!; count++; }\n mean /= count;\n const std = Math.sqrt(Math.max(0, sq / count - mean * mean));\n if (v < mean + 1.0 * std / sensitivity) continue; // and clearly above what is around it\n if (i - last < gap) { if (beats.length && v > flux[last]!) { beats[beats.length - 1] = i / frameRate; last = i; } continue; }\n beats.push(i / frameRate); last = i;\n }\n return beats;\n}\n\nfunction tempo(beats: number[]): number | null {\n if (beats.length < 4) return null;\n const gaps = beats.slice(1).map((b, i) => b - beats[i]!).sort((a, b) => a - b);\n const median = gaps[Math.floor(gaps.length / 2)]!;\n return Math.round((60 / median) * 10) / 10;\n}\n\n/**\n * Analyse a sound: its loudness and the energy in a few frequency bands, one value per video frame (0–1 on a log scale, all measured\n * against the loudest of them, so the balance between bands is kept and a quiet file looks like a loud one), and where its beats are.\n * Pure and deterministic: the same sound gives the same numbers.\n */\nexport function computeEnvelope(audio: AudioLike, options: EnvelopeOptions = {}): AudioEnvelope {\n warnUnknownOptions('audioEnvelope()', options, OPTION_KEYS);\n const frameRate = options.frameRate ?? 30;\n if (!(Number.isFinite(frameRate) && frameRate > 0)) throw new Error(`pixi-effects: audioEnvelope(): frameRate must be a positive number, got ${frameRate}`);\n const bands = options.bands ?? DEFAULT_BANDS;\n for (const [name, range] of Object.entries(bands)) {\n if (!(Array.isArray(range) && range.length === 2 && range[0] >= 0 && range[0] < range[1])) throw new Error(`pixi-effects: audioEnvelope(): band \"${name}\" must be [from, to] in Hz with from < to, got ${JSON.stringify(range)}`);\n }\n const sr = audio.sampleRate, length = audio.length;\n const mono = new Float32Array(length);\n for (let c = 0; c < audio.numberOfChannels; c++) { const d = audio.getChannelData(c); for (let i = 0; i < length; i++) mono[i]! += d[i]! / audio.numberOfChannels; }\n\n const duration = length / sr;\n const frames = Math.floor(duration * frameRate + 1e-9) + 1;\n const hop = sr / frameRate;\n const names = Object.keys(bands);\n const raw: Record<string, Float64Array> = { level: new Float64Array(frames) };\n for (const n of names) raw[n] = new Float64Array(frames);\n\n const re = new Float64Array(WINDOW), im = new Float64Array(WINDOW);\n const win = new Float64Array(WINDOW);\n let winPower = 0;\n for (let i = 0; i < WINDOW; i++) { win[i] = 0.5 - 0.5 * Math.cos((2 * Math.PI * i) / (WINDOW - 1)); winPower += win[i]! * win[i]!; }\n winPower /= WINDOW;\n const binHz = sr / WINDOW;\n for (let f = 0; f < frames; f++) {\n const center = Math.round((f / frameRate) * sr);\n // the level: the RMS of one frame's worth of samples around the frame time\n let sum = 0, cnt = 0;\n for (let i = Math.max(0, Math.round(center - hop / 2)); i < Math.min(length, Math.round(center + hop / 2)); i++) { sum += mono[i]! * mono[i]!; cnt++; }\n raw.level![f] = cnt ? Math.sqrt(sum / cnt) : 0;\n // the bands: a Hann-windowed FFT around the frame time; power scaled so the bands add up to the RMS\n for (let i = 0; i < WINDOW; i++) { const k = center - WINDOW / 2 + i; re[i] = k >= 0 && k < length ? mono[k]! * win[i]! : 0; im[i] = 0; }\n fft(re, im);\n for (const n of names) {\n const [lo, hi] = bands[n]!;\n let p = 0;\n for (let b = Math.max(1, Math.ceil(lo / binHz)); b <= Math.min(WINDOW / 2 - 1, Math.floor(hi / binHz)); b++) p += re[b]! * re[b]! + im[b]! * im[b]!;\n raw[n]![f] = Math.sqrt((2 * p) / (WINDOW * WINDOW * winPower));\n }\n }\n\n let ref = 0;\n for (const s of Object.values(raw)) ref = Math.max(ref, percentile(s, 0.98));\n const series: Record<string, Float32Array> = {};\n for (const [name, s] of Object.entries(raw)) {\n const out = new Float32Array(frames);\n if (ref > 1e-7) for (let f = 0; f < frames; f++) { const v = s[f]!; out[f] = v > 0 ? Math.min(1, Math.max(0, 1 + (20 * Math.log10(v / ref)) / RANGE_DB)) : 0; }\n series[name] = out;\n }\n\n const beatName = options.beatBand ?? (series.bass ? 'bass' : 'level');\n if (!series[beatName]) throw new Error(`pixi-effects: audioEnvelope(): beatBand \"${beatName}\" is not one of ${Object.keys(series).join(', ')}`);\n const beats = ref > 1e-7 ? pickBeats(series[beatName]!, frameRate, options.beatSensitivity ?? 1) : [];\n return { frameRate, duration, frames, series, beats, bpm: tempo(beats), at: makeAt(frameRate, series) };\n}\n\n/**\n * A stand-in for analysed music, on a tempo you choose: a kick on every beat (`bass`), a snare on 2 and 4 (`mid`), hats on the eighth\n * notes (`treble`), each a pulse that decays; `level` follows them. Beats are exactly on the beat. Use it with no audio file, or to\n * make visuals that match sound effects you place on the same tempo.\n */\nexport function bpmEnvelope(bpm: number, options: { duration: number; frameRate?: number; swing?: number }): AudioEnvelope {\n const { duration, frameRate = 30, swing = 0 } = options;\n if (!(Number.isFinite(bpm) && bpm > 0)) throw new Error(`pixi-effects: bpmEnvelope(): bpm must be a positive number, got ${bpm}`);\n if (!(Number.isFinite(duration) && duration > 0)) throw new Error(`pixi-effects: bpmEnvelope(): duration must be a positive number of seconds, got ${duration}`);\n const beat = 60 / bpm;\n const frames = Math.round(duration * frameRate) + 1;\n const pulse = (hits: number[], decay: number, t: number): number => {\n let v = 0;\n for (let i = hits.length - 1; i >= 0; i--) { if (hits[i]! <= t + 1e-9) { v = Math.exp(-(t - hits[i]!) / decay); break; } }\n return v;\n };\n const beats: number[] = [], snares: number[] = [], hats: number[] = [];\n for (let k = 0; k * beat < duration - 1e-9; k++) {\n beats.push(round6(k * beat));\n if (k % 2 === 1) snares.push(round6(k * beat));\n hats.push(round6(k * beat), round6(k * beat + beat / 2 + swing * beat));\n }\n hats.sort((a, b) => a - b);\n const series: Record<string, Float32Array> = { level: new Float32Array(frames), bass: new Float32Array(frames), mid: new Float32Array(frames), treble: new Float32Array(frames) };\n for (let f = 0; f < frames; f++) {\n const t = f / frameRate;\n const b = pulse(beats, 0.14, t), m = pulse(snares, 0.1, t), h = pulse(hats, 0.045, t);\n series.bass![f] = b; series.mid![f] = m; series.treble![f] = h;\n series.level![f] = Math.max(b, m * 0.9, h * 0.55);\n }\n return { frameRate, duration, frames, series, beats, bpm, at: makeAt(frameRate, series) };\n}\n\nconst round6 = (v: number): number => Math.round(v * 1e6) / 1e6;\n\n/** What `audioEnvelope()` can read: a URL (string), a Blob / File, the raw bytes of a file, or an `AudioBuffer` you already decoded. */\nexport type AudioEnvelopeSource = string | URL | Blob | ArrayBuffer | AudioBuffer;\n\n/**\n * Decode an audio file and analyse it (see {@link computeEnvelope}). Do it before `movie.init`, with the same file the music layer plays,\n * and feed the result to `react()`:\n *\n * ```js\n * const env = await audioEnvelope('music.mp3', { frameRate: 30 });\n * ```\n */\nexport async function audioEnvelope(source: AudioEnvelopeSource, options: EnvelopeOptions = {}): Promise<AudioEnvelope> {\n let audio: AudioLike;\n if (typeof (source as AudioBuffer).getChannelData === 'function') audio = source as AudioBuffer;\n else {\n let data: ArrayBuffer;\n if (typeof source === 'string' || source instanceof URL) {\n const res = await fetch(String(source));\n if (!res.ok) throw new Error(`pixi-effects: audioEnvelope(): could not fetch ${String(source)} (${res.status})`);\n data = await res.arrayBuffer();\n } else if (source instanceof Blob) data = await source.arrayBuffer();\n else data = source as ArrayBuffer;\n const Ctx = (globalThis as unknown as { OfflineAudioContext?: typeof OfflineAudioContext; webkitOfflineAudioContext?: typeof OfflineAudioContext }).OfflineAudioContext\n ?? (globalThis as unknown as { webkitOfflineAudioContext?: typeof OfflineAudioContext }).webkitOfflineAudioContext;\n if (!Ctx) throw new Error('pixi-effects: audioEnvelope() needs a browser with Web Audio (OfflineAudioContext)');\n try { audio = await new Ctx(1, 1, 44100).decodeAudioData(data.slice(0)); }\n catch (err) { throw new Error(`pixi-effects: audioEnvelope(): could not decode the audio (${err instanceof Error ? err.message : String(err)}); is it an mp3, wav, ogg, m4a or webm file?`); }\n }\n return computeEnvelope(audio, options);\n}\n","import type { CompositionSpec, SequenceSpec, TransitionSpec, Keyframe, Props } from '../types';\nimport type { StopSpec } from '../core/stops';\nimport { warnUnknownOptions } from '../core/options';\n\nconst PAGE_KEYS = ['name', 'duration', 'sequences', 'stops', 'notes', 'advance', 'initial', 'keyframes', 'filters', 'filterArea', 'blendMode', 'mask', 'maskInverted'] as const;\nconst DECK_KEYS = ['pages', 'transition', 'width', 'height', 'frameRate', 'background', 'canvas', 'assets', 'poster', 'motionBlur', 'loader'] as const;\n\nexport interface DeckPage {\n /** The page's name: shown by the Presenter, and in the stops list. */\n name?: string;\n /** How long the page lasts, seconds (including any transition into the next page, see `DeckOptions.transition`). Required. */\n duration: number;\n /** The page's layers, written in the page's own time (`at: 0` is the start of the page). */\n sequences: SequenceSpec[];\n /** Where the page stops, in the page's own time: the first is the page settled, the rest are steps (a bullet appears, a chart grows). Default: where the transition into the next page begins (the end for the last page). */\n stops?: Array<number | { at: number; pdf?: boolean }>;\n /** Speaker notes (kept on the page's first stop). */\n notes?: string;\n /** Move on by itself this many seconds after the page's last stop (kiosk mode). */\n advance?: number;\n /** The page is itself a layer: it may carry `initial`, `keyframes`, `filters`, … (fade or slide the whole page, for instance). */\n initial?: Props;\n keyframes?: Keyframe[];\n}\n\n/** A transition spec without the parts `deck()` fills in (which two pages, and when). */\nexport type DeckTransition = TransitionSpec extends infer T ? (T extends TransitionSpec ? Omit<T, 'from' | 'to' | 'at'> : never) : never;\n\nexport interface DeckOptions {\n pages: DeckPage[];\n /**\n * A transition between every two pages: `{ kind: 'crossfade' | 'slide' | 'wipe' | 'iris' | 'dip' | 'zoom' | 'dissolve', duration, …its own options }` (see Transitions). The next page starts\n * `duration` seconds before the current one ends, and the transition plays across the overlap.\n */\n transition?: DeckTransition;\n}\n\n/** What `deck()` returns: spread it into `movie.init` (`{ duration, composition: { sequences, transitions?, stops } }` plus any movie option you passed). */\nexport interface DeckResult {\n duration: number;\n composition: CompositionSpec;\n [movieOption: string]: unknown;\n}\n\n/**\n * A deck of pages as one movie. Each page is a nested composition laid out after the one before (so its layers use the page's own\n * time), the stops (where a `Presenter` pauses) come from the pages, and an optional `transition` joins the pages with the existing\n * crossfade / slide / wipe / … transitions.\n *\n * ```js\n * await movie.init({ canvas, width: 1280, height: 720, frameRate: 30, ...deck({\n * transition: { kind: 'slide', duration: 0.6, direction: 'left' },\n * pages: [\n * { name: 'Hello', duration: 5, stops: [1.2], sequences: [ …title, subtitle… ] },\n * { name: 'Why', duration: 8, stops: [1.2, 3, 5], sequences: [ …three bullets, at 1.2, 3, 5… ] },\n * ],\n * }) });\n * movie.on('ready', …); new Presenter(movie, { canvas });\n * ```\n */\nexport function deck(options: DeckOptions): DeckResult {\n if (!options || !Array.isArray(options.pages) || options.pages.length === 0) throw new Error('deck(): pages must be a list with at least one page: { pages: [{ name, duration, stops, sequences }] }');\n warnUnknownOptions('deck()', options, DECK_KEYS);\n const { pages, transition, ...movieOptions } = options as DeckOptions & Record<string, unknown>;\n pages.forEach((p, i) => {\n if (!p || typeof p !== 'object') throw new Error(`deck(): pages[${i}] must be an object`);\n warnUnknownOptions(`deck() pages[${i}]`, p, PAGE_KEYS);\n if (!(typeof p.duration === 'number' && Number.isFinite(p.duration) && p.duration > 0)) throw new Error(`deck(): pages[${i}].duration must be a positive number of seconds, got ${String(p.duration)}`);\n if (!Array.isArray(p.sequences)) throw new Error(`deck(): pages[${i}].sequences must be a list of layers (it may be empty), got ${typeof p.sequences}`);\n });\n let overlap = 0;\n if (transition) {\n if (!(typeof transition.duration === 'number' && transition.duration > 0)) throw new Error('deck(): transition needs a duration in seconds: { kind: \\'crossfade\\', duration: 0.6 }');\n const shortest = Math.min(...pages.map(p => p.duration));\n if (pages.length > 1 && transition.duration >= shortest) throw new Error(`deck(): the transition (${transition.duration} s) must be shorter than every page (the shortest is ${shortest} s)`);\n overlap = pages.length > 1 ? transition.duration : 0;\n }\n\n const sequences: SequenceSpec[] = [];\n const transitions: TransitionSpec[] = [];\n const stops: StopSpec[] = [];\n let start = 0;\n pages.forEach((page, i) => {\n const id = `page-${i + 1}`;\n const label = page.name ? `\"${page.name}\"` : `pages[${i}]`;\n const isLast = i === pages.length - 1;\n const entries = (page.stops ?? [isLast ? page.duration : page.duration - overlap]).map((e, k) => {\n if (e && typeof e === 'object') warnUnknownOptions(`deck() page ${label} stops[${k}]`, e, ['at', 'pdf']);\n return typeof e === 'object' && e !== null ? e : { at: e as number };\n });\n const local = entries.map(e => e.at);\n local.forEach((s, k) => {\n if (!(typeof s === 'number' && Number.isFinite(s) && s > 0 && s <= page.duration + 1e-9)) throw new Error(`deck(): page ${label} has stop ${String(s)}, outside the page (0 to ${page.duration} s)`);\n if (k > 0 && s <= local[k - 1]!) throw new Error(`deck(): page ${label} stops must be in order, earliest first (got ${local.join(', ')})`);\n });\n const { name: _n, duration: _d, sequences: inner, stops: _s, notes: _no, advance: _a, ...layerProps } = page;\n sequences.push({ type: 'composition', name: id, at: round(start), duration: page.duration, ...layerProps, sequences: inner } as unknown as SequenceSpec);\n local.forEach((s, k) => {\n const stop: StopSpec = { at: round(start + s) };\n if (k === 0) { stop.page = page.name ?? true; if (page.notes !== undefined) stop.notes = page.notes; }\n if (k === local.length - 1 && page.advance !== undefined) stop.advance = page.advance;\n if (entries[k]!.pdf !== undefined) stop.pdf = entries[k]!.pdf;\n stops.push(stop);\n });\n if (transition && !isLast) {\n const next = start + page.duration - overlap;\n transitions.push({ ...transition, from: id, to: `page-${i + 2}`, at: round(next), duration: transition.duration } as unknown as TransitionSpec);\n }\n start = start + page.duration - (isLast ? 0 : overlap);\n });\n\n const composition: CompositionSpec = { sequences, stops };\n if (transitions.length > 0) composition.transitions = transitions;\n return { ...movieOptions, duration: round(start), composition };\n}\n\nconst round = (v: number): number => Math.round(v * 1e6) / 1e6;\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/motionBlur.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/poster.ts","../src/core/pdf.ts","../src/core/stops.ts","../src/core/loader.ts","../src/core/Movie.ts","../src/text/measure.ts","../src/presets/kenBurns.ts","../src/presets/_ease.ts","../src/presets/orbit.ts","../src/presets/particles.ts","../src/presets/followPath.ts","../src/presets/stagger.ts","../src/presets/wiggle.ts","../src/presets/animateText.ts","../src/presets/react.ts","../src/audio/envelope.ts","../src/audio/musicEnvelope.ts","../src/presets/deck.ts","../src/transforms/withFade.ts"],"names":["extensions","ExtensionType","Input","BlobSource","ALL_FORMATS","Output","WavOutputFormat","BufferTarget","Conversion","VideoSampleSink","Assets","num","windows","warnUnknownOptions","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","Application","Container","Rectangle","ensureFilterLibrary","Culler","CanvasTextMetrics","TextStyle","suggestName","homeDistance","DEFAULT_FOV","DEG","KEYS","round","random","a","noise","flattenSvgPath","out","MAX_STEPS","rand","range","mono","round6"],"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). */\nexport function 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 { warnUnknownOptions } from './options';\n\nexport interface MotionBlurOptions {\n /** How many moments one frame is drawn at before they are averaged (2–64). More is smoother and slower. Default 8. */\n samples?: number;\n /** How long the shutter is open, as a fraction of the frame time (0–1]. `0.5` is a 180° shutter (the film look). Default 0.5. */\n shutter?: number;\n}\n\n/** `true` (8 samples, 180° shutter), a sample count, or `{ samples, shutter }`; `false` is off. */\nexport type MotionBlurSpec = boolean | number | MotionBlurOptions;\n\nexport interface ResolvedMotionBlur { samples: number; shutter: number }\n\nconst DEFAULTS: ResolvedMotionBlur = { samples: 8, shutter: 0.5 };\n\n/** A motion blur setting as `{ samples, shutter }`, or null for off. Says which option is wrong. */\nexport function resolveMotionBlur(spec: MotionBlurSpec | null | undefined, where: string): ResolvedMotionBlur | null {\n if (spec === undefined || spec === null || spec === false) return null;\n const o: MotionBlurOptions = spec === true ? {} : typeof spec === 'number' ? { samples: spec } : spec;\n if (typeof spec === 'object') warnUnknownOptions(`${where} motionBlur`, o, ['samples', 'shutter']);\n const samples = o.samples ?? DEFAULTS.samples, shutter = o.shutter ?? DEFAULTS.shutter;\n if (!(Number.isInteger(samples) && samples >= 2 && samples <= 64)) throw new Error(`pixi-effects: ${where}: motionBlur samples must be a whole number from 2 to 64, got ${samples}`);\n if (!(Number.isFinite(shutter) && shutter > 0 && shutter <= 1)) throw new Error(`pixi-effects: ${where}: motionBlur shutter must be a fraction of the frame time above 0 and up to 1 (0.5 is a 180° shutter), got ${shutter}`);\n return { samples, shutter };\n}\n\n/** The moments (seconds) frame `frame` is exposed over: the middles of `samples` equal slices of the shutter interval, centred on the frame time, kept inside the movie. */\nexport function blurTimes(frame: number, frameRate: number, mb: ResolvedMotionBlur, duration: number): number[] {\n const t = frame / frameRate, width = mb.shutter / frameRate;\n return Array.from({ length: mb.samples }, (_, k) => Math.min(Math.max(t + ((k + 0.5) / mb.samples - 0.5) * width, 0), duration));\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';\nimport { resolveMotionBlur } from './motionBlur';\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 // With motion blur every frame is drawn several times and averaged into this canvas, which is what gets encoded.\n const mb = options.motionBlur !== undefined ? resolveMotionBlur(options.motionBlur, 'movie.render()') : (movie.motionBlur ?? null);\n const stage = movie.app!.canvas as HTMLCanvasElement;\n const blurCanvas = mb ? Object.assign(document.createElement('canvas'), { width: stage.width, height: stage.height }) : null;\n const canvasSource = new CanvasSource(blurCanvas ?? stage, {\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 if (mb && blurCanvas) await movie._exposeFrame(frame, mb, blurCanvas, false);\n else 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 if (mb) await movie.gotoFrame(movie.totalFrames, true); // the stage shows the last frame itself, not its last sample\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';\n\n/** Sums of decimal seconds (6 + 0.7 against 6.699999999999999) must not fail a coverage check. */\nconst EPS = 1e-6;\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 - EPS || tEnd > fromEnd + EPS) {\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 - EPS || tEnd > toEnd + EPS) {\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, carriers }, 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 // a null layer that carries this layer hides it, fades it and moves it too\n const alpha = (t?.alpha ?? 1) * carriers.reduce((a, c) => a * ((c.target as { alpha?: number } | null)?.alpha ?? 1), 1);\n const alive = (threeD ? display.visible : (t?.renderable ?? true)) && carriers.every(c => c.target?.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 carried = carriers.some(c => { const k = collectPropKeys(c.spec); return (c.spec.keyframes ?? []).length > 0 && (k.has('x') || k.has('y') || k.has('rotation') || k.has('scale')); });\n const moving = parentMoving || carried || ((seq.spec.keyframes ?? []).length > 0 && (keys.has('x') || keys.has('y')));\n const zeroScale = (o: unknown): boolean => { const s = (o as { scale?: { x: number; y: number } } | null)?.scale; return !!s && (s.x === 0 || s.y === 0); };\n const zero = parentZero || zeroScale(t) || carriers.some(c => zeroScale(c.target));\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; music?: 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 if (s.music && typeof s.music === 'object') return 'music';\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', null: '#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","/** The poster time of a movie: the moment that stands for it before it plays (a title card, the best frame). */\nexport interface PosterTime { seconds: number | null; frame: number | null }\n\n/**\n * `movie.init({ poster })` in seconds. A negative value counts back from the end (like a keyframe's `at`); one past the end is\n * clamped to the last frame; anything that is not a finite number is ignored. Each of those says so.\n */\nexport function normalizePoster(poster: unknown, duration: number, frameRate: number): PosterTime {\n if (poster === undefined || poster === null) return { seconds: null, frame: null };\n if (typeof poster !== 'number' || !Number.isFinite(poster)) {\n console.warn(`pixi-effects: movie.init({ poster }): ${JSON.stringify(poster)} is not a time in seconds; ignored`);\n return { seconds: null, frame: null };\n }\n let seconds = poster < 0 ? Math.max(0, duration + poster) : poster;\n if (seconds > duration) {\n console.warn(`pixi-effects: movie.init({ poster }): the poster time ${poster} s is past the end of the movie (${duration} s); using the last frame`);\n seconds = duration;\n }\n return { seconds, frame: Math.round(seconds * frameRate) };\n}\n","/**\n * A minimal PDF writer: one JPEG per page, full page, no dependencies. Enough for a deck exported as pages (`movie.exportPDF()`).\n */\nexport interface PdfPage {\n /** A JPEG file (baseline or progressive, RGB), embedded as it is. */\n jpeg: Uint8Array;\n /** The picture's size in pixels; the page is that size in CSS pixels (a pixel is 0.75 pt). */\n width: number;\n height: number;\n}\n\nconst enc = (s: string): Uint8Array => { const out = new Uint8Array(s.length); for (let i = 0; i < s.length; i++) out[i] = s.charCodeAt(i) & 0xff; return out; };\nconst num = (n: number): string => String(Math.round(n * 1000) / 1000);\n/** A PDF text string: plain ASCII in parentheses, anything else (a dash, Japanese) as UTF-16BE in hex with its byte order mark. */\nconst textString = (s: string): string => {\n if (/^[\\x20-\\x7e]*$/.test(s)) return `(${s.replace(/[\\\\()]/g, m => `\\\\${m}`)})`;\n let hex = 'FEFF';\n for (let i = 0; i < s.length; i++) hex += s.charCodeAt(i).toString(16).toUpperCase().padStart(4, '0');\n return `<${hex}>`;\n};\n\nexport function buildPdf(pages: PdfPage[], opts: { title?: string } = {}): Uint8Array {\n if (pages.length === 0) throw new Error('pixi-effects: a PDF needs at least one page');\n // object numbers: 1 catalog, 2 page tree, then (page, contents, image) × n, then the info\n const first = (i: number) => 3 + i * 3;\n const objects: Uint8Array[][] = []; // each object: the byte chunks between \"n 0 obj\\n\" and \"\\nendobj\\n\"\n objects[1] = [enc('<< /Type /Catalog /Pages 2 0 R >>')];\n objects[2] = [enc(`<< /Type /Pages /Kids [${pages.map((_, i) => `${first(i)} 0 R`).join(' ')}] /Count ${pages.length} >>`)];\n pages.forEach((p, i) => {\n const w = p.width * 0.75, h = p.height * 0.75, n = first(i);\n objects[n] = [enc(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${num(w)} ${num(h)}] /Resources << /XObject << /Im0 ${n + 2} 0 R >> >> /Contents ${n + 1} 0 R >>`)];\n const content = `q ${num(w)} 0 0 ${num(h)} 0 0 cm /Im0 Do Q`;\n objects[n + 1] = [enc(`<< /Length ${content.length} >>\\nstream\\n${content}\\nendstream`)];\n objects[n + 2] = [enc(`<< /Type /XObject /Subtype /Image /Width ${p.width} /Height ${p.height} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${p.jpeg.length} >>\\nstream\\n`), p.jpeg, enc('\\nendstream')];\n });\n const infoNo = opts.title !== undefined ? first(pages.length) : 0;\n if (infoNo) objects[infoNo] = [enc(`<< /Title ${textString(opts.title!)} /Producer (pixi-effects) >>`)];\n const count = (infoNo || first(pages.length)) ; // highest object number + 1 is the /Size\n\n const chunks: Uint8Array[] = [enc('%PDF-1.4\\n%\\xe2\\xe3\\xcf\\xd3\\n')];\n let offset = chunks[0]!.length;\n const offsets: number[] = [];\n for (let n = 1; n < count + (infoNo ? 1 : 0); n++) {\n const body = objects[n];\n if (!body) continue;\n offsets[n] = offset;\n const parts = [enc(`${n} 0 obj\\n`), ...body, enc('\\nendobj\\n')];\n for (const part of parts) { chunks.push(part); offset += part.length; }\n }\n const size = (infoNo || first(pages.length)) + (infoNo ? 1 : 0);\n let xref = `xref\\n0 ${size}\\n0000000000 65535 f \\n`;\n for (let n = 1; n < size; n++) xref += `${String(offsets[n] ?? 0).padStart(10, '0')} 00000 n \\n`;\n xref += `trailer\\n<< /Size ${size} /Root 1 0 R${infoNo ? ` /Info ${infoNo} 0 R` : ''} >>\\nstartxref\\n${offset}\\n%%EOF\\n`;\n chunks.push(enc(xref));\n\n const total = chunks.reduce((sum, c) => sum + c.length, 0);\n const out = new Uint8Array(total);\n let at = 0;\n for (const c of chunks) { out.set(c, at); at += c.length; }\n return out;\n}\n","import { warnUnknownOptions } from './options';\n\n/** What an author writes in `composition.stops`: a time in seconds, or an object. */\nexport interface StopSpec {\n /** Where playback stops, in seconds (negative counts back from the end). */\n at: number;\n /** This stop is the settled state of a new page. A name (shown in the page list), or `true` for an unnamed page. Without it the stop is a step of the page before. */\n page?: string | true;\n /** Speaker notes for this stop. */\n notes?: string;\n /** Move on by itself after this many seconds (a kiosk, a looping demo). */\n advance?: number;\n /**\n * Which picture stands for a page in a PDF (and in the page overview). `true`: this stop's picture IS the page's picture (use it when the\n * last stop is mid-exit or a step you do not want on paper). `false`: never use this stop's picture for the PDF. Default: the page's last stop.\n */\n pdf?: boolean;\n}\n\n/** A stop, normalised: its frame, and which page it belongs to. */\nexport interface Stop {\n index: number;\n at: number;\n frame: number;\n /** The name of the page this stop belongs to (null if it has none). */\n page: string | null;\n /** Which page (0-based) this stop belongs to. */\n pageIndex: number;\n /** True for the stop that begins its page. */\n pageStart: boolean;\n notes?: string;\n advance?: number;\n pdf?: boolean;\n}\n\nconst KEYS = ['at', 'page', 'notes', 'advance', 'pdf'] as const;\n\n/**\n * The stops of a composition, checked and in order. Numbers are stops; with no `page` anywhere every stop is a page of its\n * own, otherwise only the stops that say `page` start one (the first stop always does). Negative times count back from the end;\n * two stops on the same frame are one; anything outside the movie or not a number is dropped, with a warning that names it.\n */\nexport function normalizeStops(raw: ReadonlyArray<number | StopSpec> | undefined, duration: number, frameRate: number): Stop[] {\n if (!raw || raw.length === 0) return [];\n const total = Math.round(duration * frameRate);\n const specs: StopSpec[] = [];\n raw.forEach((r, i) => {\n const spec: StopSpec | null = typeof r === 'number' ? { at: r } : (r && typeof r === 'object' ? r : null);\n if (!spec || typeof spec.at !== 'number' || !Number.isFinite(spec.at)) {\n console.warn(`pixi-effects: stops[${i}] ${JSON.stringify(r)} is not a time in seconds (or { at, page?, notes?, advance?, pdf? }); ignored`);\n return;\n }\n if (typeof r === 'object') warnUnknownOptions(`stops[${i}]`, r, KEYS);\n const at = spec.at < 0 ? duration + spec.at : spec.at;\n if (at < -1e-9 || at > duration + 1e-9) {\n console.warn(`pixi-effects: stops[${i}] at ${spec.at} s is outside the movie (0 to ${duration} s); ignored`);\n return;\n }\n specs.push({ ...spec, at });\n });\n specs.sort((a, b) => a.at - b.at);\n\n const kept: StopSpec[] = [];\n for (const s of specs) {\n const frame = Math.min(total, Math.max(0, Math.round(s.at * frameRate)));\n const last = kept[kept.length - 1];\n if (last && Math.min(total, Math.max(0, Math.round(last.at * frameRate))) === frame) {\n console.warn(`pixi-effects: two stops are on the same frame (${frame}, about ${s.at.toFixed(2)} s); one is kept`);\n continue;\n }\n kept.push(s);\n }\n\n const anyPage = kept.some(s => s.page !== undefined);\n let pageIndex = -1, pageName: string | null = null;\n return kept.map((s, index) => {\n const pageStart = index === 0 || (anyPage ? s.page !== undefined : true);\n if (pageStart) { pageIndex++; pageName = typeof s.page === 'string' ? s.page : null; }\n const stop: Stop = { index, at: s.at, frame: Math.min(total, Math.max(0, Math.round(s.at * frameRate))), page: pageName, pageIndex, pageStart };\n if (typeof s.notes === 'string') stop.notes = s.notes;\n if (s.advance !== undefined) {\n if (typeof s.advance === 'number' && Number.isFinite(s.advance) && s.advance >= 0) stop.advance = s.advance;\n else console.warn(`pixi-effects: stops[${index}] advance must be a number of seconds >= 0, got ${JSON.stringify(s.advance)}; ignored`);\n }\n if (s.pdf !== undefined) {\n if (typeof s.pdf === 'boolean') stop.pdf = s.pdf;\n else console.warn(`pixi-effects: stops[${index}] pdf must be true or false, got ${JSON.stringify(s.pdf)}; ignored`);\n }\n return stop;\n });\n}\n\n/** The first stop beyond `frame` (standing on a stop, the next one). */\nexport function nextStopAfter(stops: readonly Stop[], frame: number): Stop | null {\n return stops.find(s => s.frame > frame) ?? null;\n}\n\n/** The last stop before `frame` (standing on a stop, the one before it). */\nexport function previousStopBefore(stops: readonly Stop[], frame: number): Stop | null {\n for (let i = stops.length - 1; i >= 0; i--) if (stops[i]!.frame < frame) return stops[i]!;\n return null;\n}\n\n/** The stop the playhead is on or has just passed, or null before the first. */\nexport function stopAtOrBefore(stops: readonly Stop[], frame: number): Stop | null {\n for (let i = stops.length - 1; i >= 0; i--) if (stops[i]!.frame <= frame) return stops[i]!;\n return null;\n}\n\n/** The stop that begins each page. */\nexport function pageStarts(stops: readonly Stop[]): Stop[] {\n return stops.filter(s => s.pageStart);\n}\n\n/**\n * The stops whose pictures stand for the pages (`which: 'pages'`, default) or for every stop. A page's picture is, in order: the stop flagged\n * `pdf: true` (the last such one, or the first with `pick: 'first'`), else the last (or first) stop not flagged `pdf: false`, else, for a page\n * list, its last (or first) stop, and for a PDF (`pdf: true` here) nothing: the page is left out. With `which: 'stops'` a PDF leaves out the\n * stops flagged `pdf: false`.\n */\nexport function pictureStops(stops: readonly Stop[], opts: { which?: 'pages' | 'stops'; pick?: 'last' | 'first'; pdf?: boolean } = {}): Stop[] {\n if (opts.which === 'stops') return opts.pdf ? stops.filter(s => s.pdf !== false) : [...stops];\n const byPage = new Map<number, Stop[]>();\n for (const s of stops) byPage.set(s.pageIndex, [...(byPage.get(s.pageIndex) ?? []), s]);\n const take = (list: Stop[]): Stop | undefined => (opts.pick === 'first' ? list[0] : list[list.length - 1]);\n const picks: Stop[] = [];\n for (const list of byPage.values()) {\n const flagged = list.filter(s => s.pdf === true);\n const usable = list.filter(s => s.pdf !== false);\n const one = take(flagged.length ? flagged : usable.length ? usable : (opts.pdf ? [] : list));\n if (one) picks.push(one);\n }\n return picks;\n}\n\n/** The share (0–1) of pixels that differ by more than `threshold` (0–255) in any colour channel between two RGBA pixel arrays of the same size. */\nexport function changedFraction(a: Uint8ClampedArray, b: Uint8ClampedArray, threshold = 12): number {\n const n = Math.min(a.length, b.length) >> 2;\n if (n === 0) return 0;\n let changed = 0;\n for (let i = 0; i < n; i++) {\n const k = i << 2;\n if (Math.abs(a[k]! - b[k]!) > threshold || Math.abs(a[k + 1]! - b[k + 1]!) > threshold || Math.abs(a[k + 2]! - b[k + 2]!) > threshold) changed++;\n }\n return changed / n;\n}\n","/**\n * The page's loader (see `src/loader.css`): a `.pe-loader` element that is on screen before any script runs. `movie.init()` finds it,\n * fades it out when the movie is ready and, if init fails, stops it and says so.\n */\nexport type LoaderOption = HTMLElement | string | false;\n\nconst FADE_FALLBACK_MS = 900;\n\n/** The loader element for a canvas: the one named (element or selector), none (`false`), or a `.pe-loader` near the canvas (its box or a few levels up). */\nexport function resolveLoader(option: LoaderOption | undefined, canvas: HTMLCanvasElement | null): HTMLElement | null {\n if (option === false) return null;\n if (option instanceof HTMLElement) return option;\n if (typeof option === 'string') return document.querySelector<HTMLElement>(option);\n let box: Element | null = canvas?.parentElement ?? null;\n for (let level = 0; box && level < 4; level++, box = box.parentElement) {\n if (level > 0 && (box === document.body || box === document.documentElement)) break; // never the whole page: that could be another movie's loader\n const found = box.querySelector<HTMLElement>('.pe-loader');\n if (found) return found;\n }\n return null;\n}\n\n/** Fade the loader out (a class, so the CSS transition runs) and take it away. Safe to call twice, or with null. */\nexport function dismissLoader(loader: HTMLElement | null): void {\n if (!loader || loader.classList.contains('pe-loader--done')) return;\n loader.classList.add('pe-loader--done');\n loader.setAttribute('aria-hidden', 'true');\n let removed = false;\n const remove = () => { if (!removed) { removed = true; loader.remove(); } };\n loader.addEventListener('transitionend', remove, { once: true });\n setTimeout(remove, FADE_FALLBACK_MS); // no transition (display: none, reduced styles): still gone\n}\n\n/** init failed: stop the animation and say so, and leave the box on screen so the page does not look merely stuck. */\nexport function failLoader(loader: HTMLElement | null, message: string): void {\n if (!loader) return;\n loader.setAttribute('data-state', 'error');\n if (loader.hasAttribute('data-label')) loader.setAttribute('data-label', message);\n loader.setAttribute('aria-busy', 'false');\n}\n","import * as PIXI from 'pixi.js';\nimport { Application, Container, Culler, Rectangle, extensions, CullerPlugin } from 'pixi.js';\nimport { gsap } from 'gsap';\nimport { PixiPlugin } from 'gsap/PixiPlugin';\nimport { loadAssetBundle } from './AssetLoader';\nimport { CompositionSequence } from '../sequences/Composition';\nimport { mixdown, 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 { normalizePoster } from './poster';\nimport { buildPdf } from './pdf';\nimport { normalizeStops, nextStopAfter, previousStopBefore, stopAtOrBefore, pageStarts, pictureStops, changedFraction, type Stop } from './stops';\nimport { resolveLoader, dismissLoader, failLoader, type LoaderOption } from './loader';\nimport { resolveMotionBlur, blurTimes, type MotionBlurSpec, type MotionBlurOptions, type ResolvedMotionBlur } from './motionBlur';\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 * The poster time in seconds: the moment that stands for the movie before it plays. The canvas shows that frame once the movie is\n * ready, the playhead stays at 0 and play starts from 0 (like `<video poster>`); `movie.posterImage()` is that picture. A negative\n * value counts back from the end. Default: none (the first frame).\n */\n poster?: number;\n /**\n * Motion blur for everything that is *made* (not for live playback): `render()`, `snapshot()` and `contactSheet()` expose each frame\n * over a shutter interval and average `samples` renders of it, so fast motion smears like on film. `true` is 8 samples at a 180° shutter,\n * a number is the sample count, `{ samples, shutter }` sets both. Default: off. Each of those calls can override it (`false` turns it off).\n */\n motionBlur?: MotionBlurSpec;\n /**\n * The page's loader (see `pixi-effects/loader.css`): an element, a selector, or `false` for none. By default a `.pe-loader` next to\n * the canvas is used. It is faded out once the movie is ready (the poster is on the canvas) and, if `init()` fails, it stops and says so.\n */\n loader?: LoaderOption;\n}\n\nexport type { MotionBlurSpec, MotionBlurOptions };\n\nexport interface RenderOptions {\n /** Motion blur for this export (see `MovieOptions.motionBlur`); overrides the movie's own setting, `false` turns it off. */\n motionBlur?: MotionBlurSpec;\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 /** Motion blur for this picture (see `MovieOptions.motionBlur`); overrides the movie's own setting, `false` turns it off. */\n motionBlur?: MotionBlurSpec;\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\n/** One picture of a stop (see `movie.stopImages()`). */\nexport interface StopImage { stop: Stop; /** The page it belongs to (0-based). */ page: number; image: Blob | string }\n\nexport interface StopImagesOptions {\n /** One picture per page (default) or one per stop. */\n which?: 'pages' | 'stops';\n /** With `which: 'pages'`: the page's last stop (default: the page fully built) or its first. */\n pick?: 'last' | 'first';\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 /** JPEG quality, 0–1. */\n quality?: number;\n /** Return `data:` URLs instead of Blobs. */\n as?: 'blob' | 'dataURL';\n /** Motion blur for the pictures (off unless you ask: they are usually for looking at). */\n motionBlur?: MotionBlurSpec;\n /** Pictures for a PDF: stops flagged `pdf: false` are left out (a page whose stops are all flagged has no picture). `exportPDF` sets it. */\n pdf?: boolean;\n /** Called as each picture is ready, in order. */\n onImage?: (image: StopImage) => void;\n}\n\nexport interface ContactSheetOptions {\n /** Motion blur for these pictures (see `MovieOptions.motionBlur`); overrides the movie's own setting, `false` turns it off. */\n motionBlur?: MotionBlurSpec;\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 }\n/** A presentation reached a stop (`movie.next()` played to it, or `prev()` / `goToStop()` / `goToPage()` jumped to it). */\nexport interface StopEvent { index: number; stop: Stop; pageIndex: 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 /** The poster time in seconds (`movie.init({ poster })`), or null. */\n poster: number | null = null;\n /** The stops of the composition (`composition.stops`), checked and in order: where `next()` pauses. Empty for an ordinary movie. */\n stops: Stop[] = [];\n /** The frame `next()` is playing toward, or null. */\n private _stopAt: number | null = null;\n private _stopWaiters: Array<() => void> = [];\n private _arriving = false;\n /** The motion blur `render()`, `snapshot()` and `contactSheet()` apply unless told otherwise (`movie.init({ motionBlur })`), or null. */\n motionBlur: ResolvedMotionBlur | null = null;\n private _posterFrame: number | null = null;\n /** The canvas shows the poster picture while the playhead is still at frame 0 (like `<video poster>`): the first seek or play replaces it. */\n private _atPoster = false;\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 /** A presentation is now on a stop (see `stops` in the composition, `next()`, `prev()`). */\n on(event: 'stop', fn: (e: StopEvent) => 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 /** The poster time as a frame number, or null. */\n get posterFrame(): number | null { return this._posterFrame; }\n\n /** Draw the poster frame on the canvas and leave the playhead where it is (frame 0): the picture before the movie plays. */\n private async _showPoster(): Promise<void> {\n if (this._posterFrame === null || !this.timeline) return;\n const back = this.currentFrame;\n this.currentFrame = this._posterFrame; // the drawing steps read the playhead\n try {\n this.timeline.time(this._timeOf(this._posterFrame));\n await this._awaitVideoFrames();\n this._updateSpace();\n this._renderNow();\n } finally {\n this.currentFrame = back;\n }\n this._atPoster = true;\n }\n\n /**\n * The picture at the poster time (frame 0 if the movie has none), as `snapshot()` returns it, and the movie is left as it was:\n * still showing the poster, or back at the frame it was at.\n */\n async posterImage(opts?: SnapshotOptions & { as?: 'blob' }): Promise<Blob>;\n async posterImage(opts: SnapshotOptions & { as: 'dataURL' }): Promise<string>;\n async posterImage(opts: SnapshotOptions = {}): Promise<Blob | string> {\n this._requireReady('posterImage');\n const back = this.currentFrame, wasAtPoster = this._atPoster;\n try {\n return await (this.snapshot as (f: number, o: SnapshotOptions) => Promise<Blob | string>)(this._posterFrame ?? 0, opts);\n } finally {\n this.currentFrame = back; // snapshot() moved the playhead to the poster: put it back before restoring the display\n if (wasAtPoster) await this._showPoster();\n else await this._quietly(() => this.gotoFrame(back, true));\n }\n }\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', 'poster', 'motionBlur', 'loader']);\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 const poster = normalizePoster(options.poster, this.duration, this.frameRate);\n this.poster = poster.seconds;\n this.motionBlur = resolveMotionBlur(options.motionBlur, 'movie.init()');\n this.stops = normalizeStops(options.composition?.stops, this.duration, this.frameRate);\n this._posterFrame = poster.frame;\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 if (this._posterFrame !== null) await this._showPoster(); // the canvas shows the poster until the first seek or play\n this.emit('ready');\n dismissLoader(resolveLoader(options.loader, options.canvas ?? (this.app?.canvas as HTMLCanvasElement | undefined) ?? null));\n } catch (err) {\n failLoader(resolveLoader(options.loader, options.canvas ?? null), 'COULD NOT LOAD');\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 (!this._arriving) this._cancelStop(); // a seek by someone else ends \"play to the next stop\"\n if (!force && !this._atPoster && this.currentFrame === frame) return; // (at the poster the canvas shows another frame)\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._atPoster = false;\n this.currentFrame = Math.max(0, Math.min(frame, this.totalFrames));\n this.timeline!.time(this._timeOf(this.currentFrame));\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 /**\n * The moment frame `frame` shows. The very last frame (`totalFrames`) is at the end of the movie, where every layer's lifespan\n * has just closed: it is drawn a hair before, so a layer that lasts to the end is still on screen in the final frame\n * (it used to be an empty one, the last frame of every export).\n */\n private _timeOf(frame: number): number {\n return Math.min(frame / this.frameRate, Math.max(0, this.duration - END_MARGIN));\n }\n\n private async _awaitVideoFrames(t: number = this._timeOf(this.currentFrame)): Promise<void> {\n if (!this._rootSequence) return;\n const collected: VideoLike[] = [];\n collectVideoSequences(this._rootSequence, collected);\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', 'motionBlur']);\n this._requireReady('snapshot');\n return this._captureFrame(clampFrame(frame, this.totalFrames), { scale: opts.scale ?? 1, type: opts.type ?? 'image/png', as: opts.as ?? 'blob', motionBlur: opts.motionBlur });\n }\n\n /** Seek to `frame` (quietly, and stay there) and draw the canvas on a new canvas of `scale` times its size. */\n private async _frameCanvas(frame: number, scale: number, motionBlur?: MotionBlurSpec): Promise<HTMLCanvasElement> {\n const mb = this._blurFor(motionBlur, 'a picture'); // undefined: the movie's own setting; false: none\n let source = this.app!.canvas as HTMLCanvasElement;\n if (mb) { source = this._blurCanvas(); await this._quietly(() => this._exposeFrame(frame, mb, source, true)); }\n else await this._quietly(() => this.gotoFrame(frame, true));\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(source, 0, 0, out.width, out.height);\n return out;\n }\n\n /** The pixels of `frame`, small (about 320 px wide) and without motion blur, to compare pictures. */\n private async _framePixels(frame: number): Promise<Uint8ClampedArray> {\n const c = await this._frameCanvas(frame, Math.min(1, 320 / Math.max(1, this.width)), false);\n return c.getContext('2d')!.getImageData(0, 0, c.width, c.height).data;\n }\n\n /** Seek to `frame` (quietly, and stay there) and encode the canvas as a picture. */\n private async _captureFrame(frame: number, o: { scale: number; type: string; quality?: number; as: 'blob' | 'dataURL'; motionBlur?: MotionBlurSpec }): Promise<Blob | string> {\n const out = await this._frameCanvas(frame, o.scale, o.motionBlur);\n return encodeCanvas(out, o.type, o.as, o.quality);\n }\n\n /**\n * A picture of the settled state of each page (default: the page's last stop, fully built) or of every stop, for a page list, an\n * overview, an export. Pauses the movie, and leaves the playhead where it was. `onImage` is called as each picture is ready.\n */\n async stopImages(opts: StopImagesOptions & { as: 'dataURL' }): Promise<Array<StopImage & { image: string }>>;\n async stopImages(opts?: StopImagesOptions): Promise<StopImage[]>;\n async stopImages(opts: StopImagesOptions = {}): Promise<StopImage[]> {\n warnUnknownOptions('movie.stopImages()', opts, ['which', 'pick', 'scale', 'type', 'quality', 'as', 'motionBlur', 'pdf', 'onImage']);\n this._requireReady('stopImages');\n if (this.stops.length === 0) return [];\n const picks = pictureStops(this.stops, { which: opts.which, pick: opts.pick, pdf: opts.pdf });\n this.pause();\n const back = this.currentFrame, wasAtPoster = this._atPoster;\n const out: StopImage[] = [];\n try {\n for (const stop of picks) {\n const image = await this._captureFrame(stop.frame, {\n scale: opts.scale ?? 1, type: opts.type ?? 'image/png', quality: opts.quality, as: opts.as ?? 'blob', motionBlur: opts.motionBlur === undefined ? false : opts.motionBlur,\n });\n const item: StopImage = { stop, page: stop.pageIndex, image };\n out.push(item);\n opts.onImage?.(item);\n }\n } finally {\n if (wasAtPoster) await this._showPoster();\n else await this._quietly(() => this.gotoFrame(back, true));\n }\n return out;\n }\n\n /**\n * Look at every stop: is the picture there still changing? A stop is compared with the picture `lookback` frames before it (default 3):\n * when more than `tolerance` (default 0.4 %) of the picture differs, the audience, a page overview and a PDF all see a half-finished\n * animation. `issues` says which stop, which page and what to do; leaves the playhead where it was.\n */\n async inspectStops(opts: { lookback?: number; tolerance?: number } = {}): Promise<{ stops: Array<{ index: number; page: string | null; at: number; frame: number; moving: number; settled: boolean }>; issues: string[] }> {\n warnUnknownOptions('movie.inspectStops()', opts, ['lookback', 'tolerance']);\n this._requireReady('inspectStops');\n const out: { stops: Array<{ index: number; page: string | null; at: number; frame: number; moving: number; settled: boolean }>; issues: string[] } = { stops: [], issues: [] };\n if (this.stops.length === 0) return out;\n const lookback = Math.max(1, Math.round(opts.lookback ?? 3));\n const tolerance = opts.tolerance ?? 0.004;\n this.pause();\n const back = this.currentFrame, wasAtPoster = this._atPoster;\n try {\n for (const stop of this.stops) {\n const before = Math.max(0, stop.frame - lookback);\n let moving = 0;\n if (before < stop.frame) {\n const now = await this._framePixels(stop.frame);\n moving = changedFraction(now, await this._framePixels(before));\n }\n const settled = moving <= tolerance;\n out.stops.push({ index: stop.index, page: stop.page, at: stop.at, frame: stop.frame, moving, settled });\n if (!settled) {\n out.issues.push(`stop ${stop.index + 1}${stop.page ? ` (page \"${stop.page}\")` : ''} at ${stop.at.toFixed(1)} s: the picture is still changing there (${moving < 0.1 ? (moving * 100).toFixed(1) : Math.round(moving * 100)}% of it changed in the last ${stop.frame - before} frames), so the audience, the page overview and a PDF see it mid-animation. Move the stop to after the animation has finished, or flag a settled stop of the page with \\`pdf: true\\`.`);\n }\n }\n } finally {\n if (wasAtPoster) await this._showPoster();\n else await this._quietly(() => this.gotoFrame(back, true));\n }\n return out;\n }\n\n /**\n * The deck as a PDF: one page per page of the talk (the page's last stop, fully built, unless a stop says `pdf: true` or `pdf: false`;\n * `which: 'stops'` makes a page of every stop that is not `pdf: false`), each a\n * JPEG at the canvas size. Needs `composition.stops`. A transparent background comes out black: give the movie a `background`.\n */\n async exportPDF(opts: { which?: 'pages' | 'stops'; pick?: 'last' | 'first'; scale?: number; quality?: number; title?: string; motionBlur?: MotionBlurSpec; onImage?: (image: StopImage) => void } = {}): Promise<Blob> {\n warnUnknownOptions('movie.exportPDF()', opts, ['which', 'pick', 'scale', 'quality', 'title', 'motionBlur', 'onImage']);\n this._requireReady('exportPDF');\n if (this.stops.length === 0) throw new Error('pixi-effects: movie.exportPDF(): this movie has no stops, so there are no pages; add `stops` to the composition (or build it with deck())');\n const scale = opts.scale ?? 1;\n const images = await this.stopImages({\n which: opts.which, pick: opts.pick, scale, type: 'image/jpeg', quality: opts.quality ?? 0.92, as: 'blob', motionBlur: opts.motionBlur, pdf: true, onImage: opts.onImage,\n });\n const pages = await Promise.all(images.map(async i => ({\n jpeg: new Uint8Array(await (i.image as Blob).arrayBuffer()), width: Math.max(1, Math.round(this.width * scale)), height: Math.max(1, Math.round(this.height * scale)),\n })));\n return new Blob([buildPdf(pages, { title: opts.title }) as unknown as BlobPart], { type: 'application/pdf' });\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', 'motionBlur']);\n this._requireReady('contactSheet');\n const mb = this._blurFor(opts.motionBlur, 'movie.contactSheet()');\n const blurred = mb ? this._blurCanvas() : null;\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, wasAtPoster = this._atPoster;\n try {\n for (let i = 0; i < frames.length; i++) {\n const f = frames[i]!;\n if (mb && blurred) await this._quietly(() => this._exposeFrame(f, mb, blurred, true));\n else await this._quietly(() => this.gotoFrame(f, true));\n const { x, y } = L.positions[i]!;\n g.drawImage(blurred ?? (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 if (wasAtPoster) await this._showPoster(); // the movie is left as it was: still showing its poster\n else 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(t: number = this._timeOf(this.currentFrame)): void {\n if (!this._rootSequence || !this.app) return;\n this._rootSequence.updateSpace(t, this.app.renderer);\n }\n\n /** The motion blur an operation uses: its own option when given (`false` is off), otherwise the movie's. */\n private _blurFor(option: MotionBlurSpec | undefined, where: string): ResolvedMotionBlur | null {\n return option === undefined ? this.motionBlur : resolveMotionBlur(option, where);\n }\n\n /**\n * @internal Draw `frame` with motion blur into `target` (a canvas the size of the stage): the average of `mb.samples` renders at moments\n * spread over the shutter interval around the frame time. With `settle` the playhead and the stage are left exactly on the frame.\n */\n async _exposeFrame(frame: number, mb: ResolvedMotionBlur, target: HTMLCanvasElement, settle: boolean): Promise<void> {\n const g = target.getContext('2d')!;\n const stage = this.app!.canvas as HTMLCanvasElement;\n this._atPoster = false;\n const times = blurTimes(frame, this.frameRate, mb, Math.max(0, this.duration - END_MARGIN));\n for (let k = 0; k < times.length; k++) {\n const t = times[k]!;\n this.timeline!.time(t);\n await this._awaitVideoFrames(t);\n this._updateSpace(t);\n this._renderNow();\n if (k === 0) g.clearRect(0, 0, target.width, target.height);\n g.globalAlpha = 1 / (k + 1); // a running mean: sample k weighs 1/(k + 1)\n g.drawImage(stage, 0, 0, target.width, target.height);\n }\n g.globalAlpha = 1;\n if (settle) await this._goto(frame);\n else {\n this.currentFrame = Math.max(0, Math.min(frame, this.totalFrames));\n this.emit('frame', { frame: this.currentFrame, totalFrames: this.totalFrames } satisfies FrameEvent);\n }\n }\n\n private _blurCanvas(): HTMLCanvasElement {\n const stage = this.app!.canvas as HTMLCanvasElement;\n const c = document.createElement('canvas');\n c.width = stage.width; c.height = stage.height;\n return c;\n }\n\n /** Which stop the playhead is on or has passed (-1 before the first). */\n get stopIndex(): number { return stopAtOrBefore(this.stops, this.currentFrame)?.index ?? -1; }\n /** The stop the playhead is on or has passed, or null. */\n get currentStop(): Stop | null { return stopAtOrBefore(this.stops, this.currentFrame); }\n /** Which page the playhead is in (0-based), -1 before the first stop. */\n get pageIndex(): number { return this.currentStop?.pageIndex ?? -1; }\n /** How many pages the stops make. */\n get pageCount(): number { return pageStarts(this.stops).length; }\n\n private _cancelStop(): void {\n this._stopAt = null;\n this._settleStopWaiters();\n }\n private _settleStopWaiters(): void {\n const waiters = this._stopWaiters; this._stopWaiters = [];\n waiters.forEach(w => w());\n }\n private _emitStop(stop: Stop): void {\n this.emit('stop', { index: stop.index, stop, pageIndex: stop.pageIndex } satisfies StopEvent);\n }\n /** Land exactly on a stop's frame, pause, and say so. */\n private async _arriveAtStop(frame: number): Promise<void> {\n this._arriving = true;\n this._stopAt = null;\n try {\n this.pause();\n await this._goto(frame);\n } catch (err) {\n console.warn('pixi-effects: could not land on a stop:', err);\n this._emitError('playback', err);\n } finally { this._arriving = false; }\n const stop = this.stops.find(s => s.frame === frame);\n if (stop) this._emitStop(stop);\n this._settleStopWaiters();\n }\n\n /**\n * Play to the next stop and pause exactly there (a presentation's \"next\"). Pressed again while it is playing toward a stop, it skips the\n * rest of the animation and lands on that stop at once. After the last stop it plays to the end. Resolves when it has landed (or\n * stopped for another reason). An ordinary `play()` ignores the stops.\n */\n async next(): Promise<void> {\n if (this._initState !== 'ready') return;\n if (this._stopAt !== null) { await this._arriveAtStop(this._stopAt); return; }\n if (this.currentFrame >= this.totalFrames) return;\n const target = nextStopAfter(this.stops, this.currentFrame);\n this._stopAt = target ? target.frame : null;\n const landed = new Promise<void>(resolve => this._stopWaiters.push(resolve));\n this.play();\n await landed;\n }\n\n /** Jump back to the previous stop at once (no reverse playback); from the first stop, to the start. */\n async prev(): Promise<void> {\n if (this._initState !== 'ready') return;\n this.pause();\n const target = previousStopBefore(this.stops, this.currentFrame);\n await this.gotoFrame(target ? target.frame : 0, true);\n if (target) this._emitStop(target);\n }\n\n /** Jump to stop `index` (0-based). */\n async goToStop(index: number): Promise<void> {\n if (this._initState !== 'ready') return;\n const stop = this.stops[index];\n if (!stop) { console.warn(`pixi-effects: movie.goToStop(${index}): there are ${this.stops.length} stops (0 to ${this.stops.length - 1})`); return; }\n this.pause();\n await this.gotoFrame(stop.frame, true);\n this._emitStop(stop);\n }\n\n /** Jump to the first stop of page `page` (0-based). */\n async goToPage(page: number): Promise<void> {\n const starts = pageStarts(this.stops);\n const stop = starts[page];\n if (!stop) { console.warn(`pixi-effects: movie.goToPage(${page}): there are ${starts.length} pages (0 to ${starts.length - 1})`); return; }\n await this.goToStop(stop.index);\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 (this._stopAt !== null && frame >= this._stopAt) { void this._arriveAtStop(this._stopAt); return; }\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 this._settleStopWaiters();\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 if (!this._arriving) this._cancelStop();\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', 'motionBlur']);\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\n/** How far before the end of the movie its last frame is drawn (seconds): inside every layer's lifespan, far below a frame. */\nconst END_MARGIN = 1e-4;\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', quality?: number): Promise<Blob | string> {\n if (as === 'dataURL') return Promise.resolve(canvas.toDataURL(type, quality));\n return new Promise((resolve, reject) => canvas.toBlob(b => (b ? resolve(b) : reject(new Error('pixi-effects: could not encode the image'))), type, quality));\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 { SequenceSpec, Keyframe } from '../types';\nimport { warnUnknownOptions, suggestName } from '../core/options';\nimport { random, noise } from '../expr/random';\n\nconst KEYS = ['count', 'at', 'emit', 'life', 'area', 'angle', 'speed', 'gravity', 'wind', 'drag', 'sway', 'size', 'scale', 'fade', 'colors', 'shape', 'spin', 'seed', 'name', 'blendMode', 'template', 'sampleRate'] as const;\nconst SHAPES = ['circle', 'rect', 'star'] as const;\nconst MAX_KEYFRAMES = 30000;\n\ntype Range = number | [number, number];\n\nexport interface ParticlesOptions {\n /** How many particles. Required. */\n count: number;\n /** When the first one can be born, in composition seconds. Default 0. */\n at?: number;\n /** Births are spread over this many seconds (0, the default, is a burst: all at once). */\n emit?: number;\n /** How long each lives, in seconds: a number or `[min, max]`. Required. */\n life: Range;\n /** Where they start: the centre `x`, `y`, and optionally a `width` / `height` to spread over (snow: `{ x: 640, y: -20, width: 1280 }`). Required. */\n area: { x: number; y: number; width?: number; height?: number };\n /** Direction of the launch, degrees: 0 is right, 90 down, −90 up. A number or `[min, max]`. Default `[0, 360]`. */\n angle?: Range;\n /** Launch speed in px per second. Default `[100, 300]`. */\n speed?: Range;\n /** Acceleration down, px/s² (negative floats up). Default 0. */\n gravity?: number;\n /** Acceleration sideways, px/s². Default 0. */\n wind?: number;\n /** Air drag per second: they slow toward a terminal speed. Default 0. */\n drag?: number;\n /** A smooth side-to-side wobble: up to about ±`amp` px, `freq` wobbles per second (default 1). Snow, leaves, embers. */\n sway?: { amp: number; freq?: number };\n /** Radius in px (a square's half-side): a number or `[min, max]`. Default `[3, 6]`. */\n size?: Range;\n /** Scale over the life, `[start, end]` (`[1, 0]` shrinks away). Default none. */\n scale?: [number, number];\n /** Alpha ramps in seconds: `in` from transparent at birth, `out` back to transparent at the end of the life. */\n fade?: { in?: number; out?: number };\n /** Fill colours, picked at random for each particle. Default white. */\n colors?: string[];\n /** `'circle'` (default), `'rect'` (a square) or `'star'`. */\n shape?: 'circle' | 'rect' | 'star';\n /** Turning speed in degrees per second (a number or `[min, max]`; they also start at a random angle). Default none. */\n spin?: Range;\n /** Another seed is another burst. Default 0. */\n seed?: number;\n /** Layers are named `<name>-0`, `<name>-1`, … (default `'particle'`). */\n name?: string;\n /** `'add'` makes overlapping particles glow. */\n blendMode?: string;\n /** Use this layer (any type: an image, a text) for every particle instead of a shape; its keyframes are kept. */\n template?: SequenceSpec;\n /** Samples per second of a curved path (gravity, wind, drag, sway): straight steps between them. Default 20. */\n sampleRate?: number;\n}\n\n/**\n * Particles as plain layers: a burst, a fountain, snow, confetti, sparks. Each one is a layer with its own seeded start,\n * velocity, size, colour and life, and a path baked into keyframes (so playback, seeking and export agree), living only\n * while it is alive. Spread the result into `sequences`.\n *\n * ```js\n * ...particles({ count: 80, at: 2, life: [0.8, 1.6], area: { x: 640, y: 400 }, speed: [150, 450], gravity: 500,\n * size: [3, 7], colors: ['#ffd166', '#ff6b9d', '#4cc9f0'], fade: { out: 0.4 }, blendMode: 'add' })\n * ```\n *\n * A particle with no gravity, wind, drag or sway is one straight tween; a curved path is sampled `sampleRate` times a second.\n */\nexport function particles(opts: ParticlesOptions): SequenceSpec[] {\n warnUnknownOptions('particles()', opts, KEYS);\n const { count, at = 0, emit = 0, gravity = 0, wind = 0, drag = 0, sway, fade, colors = ['#ffffff'], shape = 'circle', seed = 0, name = 'particle', template, sampleRate = 20 } = opts;\n if (!(Number.isInteger(count) && count > 0)) throw new Error(`particles(): count must be a whole number of particles (at least 1), got ${count}`);\n const life = range('life', opts.life, 1e-6);\n if (!opts.area || !Number.isFinite(opts.area.x) || !Number.isFinite(opts.area.y)) throw new Error('particles(): area is required: { x, y } (the centre) and optionally width / height to spread over');\n if (!(Number.isFinite(emit) && emit >= 0)) throw new Error(`particles(): emit must be a number of seconds >= 0, got ${emit}`);\n if (!(Number.isFinite(sampleRate) && sampleRate > 0)) throw new Error(`particles(): sampleRate must be a positive number (samples per second), got ${sampleRate}`);\n if (!(SHAPES as readonly string[]).includes(shape)) {\n const g = suggestName(String(shape), SHAPES);\n throw new Error(`particles(): shape \"${shape}\" is not one of ${SHAPES.map(s => `\"${s}\"`).join(', ')}${g ? `; did you mean \"${g}\"?` : ''}`);\n }\n const angle = range('angle', opts.angle ?? [0, 360], -Infinity);\n const speed = range('speed', opts.speed ?? [100, 300], 0);\n const size = range('size', opts.size ?? [3, 6], 0);\n const spin = opts.spin === undefined ? null : range('spin', opts.spin, -Infinity);\n const curved = gravity !== 0 || wind !== 0 || drag !== 0 || !!sway;\n const worst = curved ? Math.max(1, Math.ceil(life[1] * sampleRate)) : 1;\n if (count * worst > MAX_KEYFRAMES) {\n throw new Error(`particles(): too many keyframes (${count} particles × up to ${worst} samples each): lower count or life, or lower sampleRate (now ${sampleRate})`);\n }\n\n const round = (v: number) => Math.round(v * 1e6) / 1e6;\n const out: SequenceSpec[] = [];\n for (let i = 0; i < count; i++) {\n const r = random(seed * 1000003 + i * 7919 + 17);\n const pick = ([a, b]: [number, number]) => a + r() * (b - a);\n const born = at + r() * emit;\n const lifetime = pick(life);\n const ax = (r() - 0.5) * (opts.area.width ?? 0), ay = (r() - 0.5) * (opts.area.height ?? 0);\n const x0 = opts.area.x + ax, y0 = opts.area.y + ay;\n const a = pick(angle) * Math.PI / 180, v = pick(speed);\n const vx = v * Math.cos(a), vy = v * Math.sin(a);\n const s = pick(size);\n const color = colors[Math.min(colors.length - 1, Math.floor(r() * colors.length))]!;\n const turn = spin ? pick(spin) : 0;\n const startAngle = spin ? r() * 360 : 0;\n const swayAmp = sway?.amp ?? 0, swayFreq = sway?.freq ?? 1;\n const n0 = sway ? noise(0, seed * 1000003 + i) : 0;\n\n const at_ = (t: number) => { // position t seconds after birth\n const axis = (p0: number, v0: number, acc: number) => {\n if (drag > 0) { const vInf = acc / drag; return p0 + vInf * t + (v0 - vInf) * (1 - Math.exp(-drag * t)) / drag; }\n return p0 + v0 * t + 0.5 * acc * t * t;\n };\n const sw = sway ? swayAmp * (noise(t * swayFreq, seed * 1000003 + i) - n0) : 0;\n return { x: axis(x0, vx, wind) + sw, y: axis(y0, vy, gravity) };\n };\n\n const kfs: Keyframe[] = [];\n const steps = curved ? Math.max(1, Math.ceil(lifetime * sampleRate)) : 1;\n const step = lifetime / steps;\n for (let k = 1; k <= steps; k++) {\n const p = at_(k * step);\n kfs.push({ at: round((k - 1) * step), to: { x: round(p.x), y: round(p.y) }, duration: round(step), ease: 'none' });\n }\n if (opts.scale) kfs.push({ at: 0, to: { scale: opts.scale[1] }, duration: round(lifetime), ease: 'none' });\n if (turn !== 0) kfs.push({ at: 0, to: { rotation: round(startAngle + turn * lifetime) }, duration: round(lifetime), ease: 'none' });\n if (fade?.in) kfs.push({ at: 0, to: { alpha: 1 }, duration: fade.in, ease: 'none' });\n if (fade?.out) kfs.push({ at: -fade.out, from: { alpha: 1 }, to: { alpha: 0 }, duration: fade.out, ease: 'none' });\n\n const initial: Record<string, number | string> = { x: round(x0), y: round(y0) };\n if (opts.scale) initial.scale = opts.scale[0];\n if (fade?.in) initial.alpha = 0;\n if (spin) initial.rotation = round(startAngle);\n\n const common = { name: `${name}-${i}`, at: round(born), duration: round(lifetime), ...(opts.blendMode ? { blendMode: opts.blendMode } : {}) };\n if (template) {\n const t = template as unknown as Record<string, unknown> & { initial?: Record<string, unknown>; keyframes?: Keyframe[] };\n out.push({ ...t, ...common, initial: { ...t.initial, ...initial }, keyframes: [...(t.keyframes ?? []), ...kfs] } as unknown as SequenceSpec);\n continue;\n }\n const style = { ...initial, fillColor: color };\n if (shape === 'circle') out.push({ type: 'shape', shape: 'circle', radius: round(s), ...common, initial: style, keyframes: kfs } as SequenceSpec);\n else if (shape === 'rect') out.push({ type: 'shape', shape: 'rect', width: round(s * 2), height: round(s * 2), ...common, initial: style, keyframes: kfs } as SequenceSpec);\n else {\n const points: Array<[number, number]> = [];\n for (let p = 0; p < 10; p++) {\n const rad = (p % 2 === 0 ? s : s * 0.45), ang = -Math.PI / 2 + (p * Math.PI) / 5;\n points.push([round(rad * Math.cos(ang)), round(rad * Math.sin(ang))]);\n }\n out.push({ type: 'shape', shape: 'polygon', points, ...common, initial: style, keyframes: kfs } as SequenceSpec);\n }\n }\n return out;\n}\n\nfunction range(name: string, v: Range, min: number): [number, number] {\n const [a, b] = typeof v === 'number' ? [v, v] : v;\n if (!(Number.isFinite(a) && Number.isFinite(b)) || a > b || a < min || (min > 0 && a <= 0)) {\n throw new Error(`particles(): ${name} must be a number or [min, max] with min <= max${min > -Infinity ? ` and min >= ${min}` : ''}, got ${JSON.stringify(v)}`);\n }\n return [a, b];\n}\n","import type { Keyframe } from '../types';\nimport { warnUnknownOptions } from '../core/options';\nimport { flattenSvgPath } from '../sequences/trimPath';\nimport { parseEase } from './_ease';\n\nconst KEYS = ['d', 'at', 'duration', 'ease', 'from', 'to', 'orient', 'rotate', 'frameRate'] as const;\nconst MAX_STEPS = 2000;\n\nexport interface FollowPathOptions {\n /** The route, as SVG path data in the same canvas coordinates the layer's `x` / `y` use. Several sub-paths are walked in order. */\n d: string;\n /** Start, in seconds from the start of the layer. Default 0. */\n at?: number;\n /** How long the trip takes, in seconds. Required. */\n duration: number;\n /** GSAP ease for the progress along the path (default `'none'`: constant speed). */\n ease?: string;\n /** Where on the path to start and stop, as fractions 0–1 of its length (default 0 → 1). `from: 1, to: 0` goes backwards. */\n from?: number;\n to?: number;\n /** Turn the layer to face the way it is going (keyframes `rotation`, in degrees). Default false. */\n orient?: boolean;\n /** With `orient`: degrees added to the heading (`-90` for an image that points up). Default 0. */\n rotate?: number;\n /** Samples per second: set it to your movie's `frameRate` so the layer is exactly on the path at every frame. Default 30. */\n frameRate?: number;\n}\n\ninterface Segment { x0: number; y0: number; x1: number; y1: number; start: number; len: number }\n\n/**\n * A layer travelling along an SVG path, as keyframes for `x` and `y` (and `rotation` with `orient`). Put the result in a\n * layer's `keyframes`; the layer's own `x` / `y` are the points of the path, so give circles and shapes their centre there\n * and text `anchorX: 0.5, anchorY: 0.5`.\n *\n * The path is walked by arc length (so the speed is even whatever the curve) and sampled once per frame as short straight\n * steps, which keeps the layer on the path at every rendered frame when `frameRate` matches the movie's.\n *\n * ```js\n * { type: 'shape', shape: 'circle', radius: 12, initial: { fillColor: '#ffd166' },\n * keyframes: followPath({ d: 'M 100 600 C 300 100 900 100 1180 600', duration: 4, ease: 'power2.inOut', frameRate: 30 }) }\n * ```\n */\nexport function followPath(opts: FollowPathOptions): Keyframe[] {\n warnUnknownOptions('followPath()', opts, KEYS);\n const { d, at = 0, duration, ease = 'none', from = 0, to = 1, orient = false, rotate = 0, frameRate = 30 } = opts;\n if (typeof d !== 'string' || d.trim() === '') throw new Error('followPath(): d must be SVG path data, e.g. \"M 100 600 C 300 100 900 100 1180 600\"');\n if (!(Number.isFinite(duration) && duration > 0)) throw new Error(`followPath(): duration must be a positive number of seconds, got ${duration}`);\n if (!(Number.isFinite(frameRate) && frameRate > 0)) throw new Error(`followPath(): frameRate must be a positive number (samples per second), got ${frameRate}`);\n for (const [n, v] of [['from', from], ['to', to]] as const) {\n if (!(Number.isFinite(v) && v >= 0 && v <= 1)) throw new Error(`followPath(): ${n} must be a fraction of the path between 0 and 1, got ${v}`);\n }\n const steps = Math.max(1, Math.round(duration * frameRate));\n if (steps > MAX_STEPS) throw new Error(`followPath(): ${steps} samples is too many (max ${MAX_STEPS}); lower frameRate or duration`);\n\n const segments: Segment[] = [];\n let total = 0;\n for (const line of flattenSvgPath(d)) {\n const p = line.closed ? [...line.pts, line.pts[0]!, line.pts[1]!] : line.pts;\n for (let i = 2; i < p.length; i += 2) {\n const len = Math.hypot(p[i]! - p[i - 2]!, p[i + 1]! - p[i - 1]!);\n if (len === 0) continue;\n segments.push({ x0: p[i - 2]!, y0: p[i - 1]!, x1: p[i]!, y1: p[i + 1]!, start: total, len });\n total += len;\n }\n }\n if (!(total > 0)) throw new Error(`followPath(): the path \"${d}\" has no length (it needs at least two different points)`);\n\n const find = (s: number): Segment => {\n let lo = 0, hi = segments.length - 1;\n while (lo < hi) { const mid = (lo + hi) >> 1; if (segments[mid]!.start + segments[mid]!.len < s) lo = mid + 1; else hi = mid; }\n return segments[lo]!;\n };\n const at_ = (fraction: number): { x: number; y: number; heading: number } => {\n const s = Math.min(Math.max(fraction, 0), 1) * total;\n const g = find(s);\n const t = Math.min(Math.max((s - g.start) / g.len, 0), 1);\n return { x: g.x0 + (g.x1 - g.x0) * t, y: g.y0 + (g.y1 - g.y0) * t, heading: Math.atan2(g.y1 - g.y0, g.x1 - g.x0) * 180 / Math.PI };\n };\n\n const shape = parseEase(ease);\n const round = (v: number) => Math.round(v * 1e6) / 1e6;\n let turn = 0; // heading is kept continuous: 179° → 181°, not −179°\n const sample = (k: number): Record<string, number> => {\n const p = from + (to - from) * shape(k / steps);\n const pt = at_(p);\n const out: Record<string, number> = { x: round(pt.x), y: round(pt.y) };\n if (orient) {\n let h = pt.heading + rotate;\n if (k === 0) turn = h;\n else { let delta = h - turn; delta -= 360 * Math.round(delta / 360); turn += delta; }\n out.rotation = round(turn);\n }\n return out;\n };\n\n const out: Keyframe[] = [{ at, set: sample(0) }];\n const step = duration / steps;\n for (let k = 1; k <= steps; k++) out.push({ at: round(at + (k - 1) * step), to: sample(k), duration: round(step), ease: 'none' });\n return out;\n}\n","import { warnUnknownOptions } from '../core/options';\nimport { random } from '../expr/random';\nimport { parseEase } from './_ease';\n\nconst STAGGER_KEYS = ['each', 'amount', 'from', 'grid', 'ease', 'seed'] as const;\nconst FROM_NAMES = ['start', 'end', 'center', 'edges', 'random'] as const;\n\nexport interface StaggerOptions {\n /** Seconds between neighbours (the farthest one waits `each` × its distance). Default 0.1. Not together with `amount`. */\n each?: number;\n /** Seconds from the first to the last, however many there are. Not together with `each`. */\n amount?: number;\n /**\n * Where the wave starts: `'start'` (default), `'end'`, `'center'` (outward), `'edges'` (inward), `'random'` (a seeded\n * shuffle of the same delays), or the index of one item.\n */\n from?: 'start' | 'end' | 'center' | 'edges' | 'random' | number;\n /** `[columns, rows]`: the items fill a grid row by row and the wave travels by straight-line distance across it. */\n grid?: [number, number];\n /** GSAP ease that reshapes the spread (default `'none'`: even steps). The first stays at 0, the last at the full spread. */\n ease?: string;\n /** For `from: 'random'`: another seed is another order. Default 0. */\n seed?: number;\n}\n\n/**\n * Delays for a wave of items, in seconds, in the style of GSAP's `stagger`.\n *\n * stagger(6, { each: 0.08 }) // [0, 0.08, 0.16, …] use: `at: 1 + d[i]`\n * stagger(letters, { each: 0.05, from: 'center' }) // the same layers with their `at` pushed back\n *\n * Given a layer array it returns new layers whose `at` is shifted by their delay; the originals are not touched.\n * Everything is a pure function of the options (`from: 'random'` is seeded), so playback and export agree.\n */\nexport function stagger(count: number, options?: StaggerOptions): number[];\nexport function stagger<T extends { at?: number }>(layers: readonly T[], options?: StaggerOptions): T[];\nexport function stagger<T extends { at?: number }>(items: number | readonly T[], options: StaggerOptions = {}): number[] | T[] {\n const isCount = typeof items === 'number';\n const n = isCount ? items : items.length;\n if (!Number.isInteger(n) || n < 0) throw new Error(`stagger(): count must be a whole number of items, got ${n}`);\n warnUnknownOptions('stagger()', options, STAGGER_KEYS);\n const { each, amount, from = 'start', grid, ease = 'none', seed = 0 } = options;\n if (each !== undefined && amount !== undefined) throw new Error('stagger(): give `each` (seconds between neighbours) or `amount` (seconds in total), not both');\n if (each !== undefined && !(Number.isFinite(each) && each >= 0)) throw new Error(`stagger(): each must be a number of seconds >= 0, got ${each}`);\n if (amount !== undefined && !(Number.isFinite(amount) && amount >= 0)) throw new Error(`stagger(): amount must be a number of seconds >= 0, got ${amount}`);\n if (typeof from === 'string' && !(FROM_NAMES as readonly string[]).includes(from)) {\n throw new Error(`stagger(): from \"${from}\" is not one of ${FROM_NAMES.map(f => `\"${f}\"`).join(', ')} or an item index`);\n }\n if (typeof from === 'number' && !(Number.isInteger(from) && from >= 0 && from < Math.max(n, 1))) throw new Error(`stagger(): from ${from} is not an index of the ${n} items`);\n if (grid && !(Array.isArray(grid) && grid.length === 2 && grid.every(g => Number.isInteger(g) && g > 0) && grid[0]! * grid[1]! >= n)) {\n throw new Error(`stagger(): grid must be [columns, rows] and hold all ${n} items, got ${JSON.stringify(grid)}`);\n }\n\n const dist = distances(n, from, grid, seed);\n const max = dist.reduce((m, d) => Math.max(m, d), 0);\n const total = amount !== undefined ? amount : (each ?? 0.1) * max;\n const shape = parseEase(ease);\n const delays = dist.map(d => (max === 0 ? 0 : Math.round(total * shape(d / max) * 1e6) / 1e6));\n if (isCount) return delays;\n return (items as readonly T[]).map((layer, i) => ({ ...layer, at: Math.round(((layer.at ?? 0) + delays[i]!) * 1e6) / 1e6 }));\n}\n\n/** How far each item is from where the wave starts, in item steps (a straight line across a grid). */\nfunction distances(n: number, from: NonNullable<StaggerOptions['from']>, grid: [number, number] | undefined, seed: number): number[] {\n if (n === 0) return [];\n if (from === 'random') {\n const order = Array.from({ length: n }, (_, i) => i);\n const r = random(seed);\n for (let i = n - 1; i > 0; i--) { const j = Math.floor(r() * (i + 1)); [order[i], order[j]] = [order[j]!, order[i]!]; }\n return order;\n }\n if (!grid) {\n const mid = (n - 1) / 2;\n return Array.from({ length: n }, (_, i) => {\n switch (from) {\n case 'start': return i;\n case 'end': return n - 1 - i;\n case 'center': return Math.abs(i - mid);\n case 'edges': return mid - Math.abs(i - mid);\n default: return Math.abs(i - from);\n }\n });\n }\n const [cols, rows] = grid;\n const at = (i: number) => ({ x: i % cols, y: Math.floor(i / cols) });\n const origin = from === 'start' ? { x: 0, y: 0 }\n : from === 'end' ? { x: cols - 1, y: rows - 1 }\n : from === 'center' || from === 'edges' ? { x: (cols - 1) / 2, y: (rows - 1) / 2 }\n : at(from);\n const d = Array.from({ length: n }, (_, i) => Math.hypot(at(i).x - origin.x, at(i).y - origin.y));\n if (from !== 'edges') return d;\n const far = Math.max(...d);\n return d.map(v => far - v);\n}\n","import type { Keyframe } from '../types';\nimport { warnUnknownOptions } from '../core/options';\nimport { rand } from '../expr/random';\n\nconst WIGGLE_KEYS = ['at', 'duration', 'freq', 'seed', 'ease', 'props'] as const;\nconst MAX_STEPS = 2000;\n\nexport interface WiggleProp {\n /** The value the property rests at: a number or an expression (`'W/2'`). The wiggle starts and ends here. */\n around: number | string;\n /** How far it strays from `around` (same unit as the property). */\n amp: number;\n}\n\nexport interface WiggleOptions {\n /** Start, in seconds from the start of the layer. Default 0. */\n at?: number;\n /** How long it shakes, in seconds. Required. */\n duration: number;\n /** New random targets per second. Default 3 (a drift); 8 and up reads as a shake. */\n freq?: number;\n /** Another seed is another take of the same shake. Default 0. */\n seed?: number;\n /** GSAP ease between targets. Default `'sine.inOut'`; `'none'` gives straight, jittery lines. */\n ease?: string;\n /** The properties to move, each independently: `{ x: { around: 960, amp: 6 }, rotation: { around: 0, amp: 1.5 } }`. */\n props: Record<string, WiggleProp>;\n}\n\n/**\n * A seeded wiggle as keyframes: put the result in a layer's `keyframes`\n * (spread it next to others: `keyframes: [...wiggle({ … }), { at: 4, to: … }]`).\n *\n * Expressions are evaluated once when the layer is built, so a wiggle cannot\n * be an expression; it is baked into ordinary keyframes instead. The targets\n * come from the seed, so playback, seeking and export all agree. The last step\n * returns every property to `around`, so the layer is not left offset.\n */\nexport function wiggle(opts: WiggleOptions): Keyframe[] {\n warnUnknownOptions('wiggle()', opts, WIGGLE_KEYS);\n const { at = 0, duration, freq = 3, seed = 0, ease = 'sine.inOut', props } = opts;\n if (!(Number.isFinite(duration) && duration > 0)) throw new Error(`wiggle(): duration must be a positive number of seconds, got ${duration}`);\n if (!(Number.isFinite(freq) && freq > 0)) throw new Error(`wiggle(): freq must be a positive number (steps per second), got ${freq}`);\n const names = Object.keys(props ?? {});\n if (names.length === 0) throw new Error('wiggle(): props is empty; name at least one property, e.g. props: { x: { around: 100, amp: 8 } }');\n for (const n of names) {\n const p = props[n]!;\n if (!Number.isFinite(p.amp)) throw new Error(`wiggle(): props.${n}.amp must be a number, got ${p.amp}`);\n if (p.around === undefined || p.around === null || p.around === '') throw new Error(`wiggle(): props.${n}.around is missing`);\n }\n const steps = Math.ceil(duration * freq - 1e-9);\n if (steps > MAX_STEPS) throw new Error(`wiggle(): ${steps} steps is too many (max ${MAX_STEPS}); lower freq or duration`);\n\n const set: Record<string, number | string> = {};\n for (const n of names) set[n] = props[n]!.around;\n const out: Keyframe[] = [{ at, set }];\n const stepLen = duration / steps;\n for (let s = 0; s < steps; s++) {\n const to: Record<string, number | string> = {};\n names.forEach((n, pi) => {\n const p = props[n]!;\n if (s === steps - 1) { to[n] = p.around; return; }\n const off = (rand(seed * 7919 + pi * 104729 + s * 31 + 1) * 2 - 1) * p.amp;\n to[n] = typeof p.around === 'number'\n ? p.around + off\n : `(${p.around}) ${off < 0 ? '-' : '+'} ${Math.abs(off)}`;\n });\n out.push({ at: at + s * stepLen, to, duration: stepLen, ease });\n }\n return out;\n}\n","import type { Keyframe, TextSequenceSpec } from '../types';\nimport { warnUnknownOptions, suggestName } from '../core/options';\nimport { measureText, splitText, type MeasureStyle, type TextPiece } from '../text/measure';\nimport { stagger, type StaggerOptions } from './stagger';\nimport { wiggle } from './wiggle';\n\nconst KEYS = ['by', 'x', 'y', 'align', 'name', 'at', 'duration', 'in', 'out', 'stagger', 'idle', 'styleFor'] as const;\n\n/** Where a piece starts (`from`), as offsets in x / y and absolute values for the rest, and how it gets to its resting place. */\nconst PRESETS = {\n rise: { from: { y: 40, alpha: 0 }, duration: 0.5, ease: 'back.out(2)' },\n drop: { from: { y: -50, alpha: 0 }, duration: 0.7, ease: 'bounce.out' },\n fade: { from: { alpha: 0 }, duration: 0.5, ease: 'power1.out' },\n pop: { from: { scale: 0, alpha: 0 }, duration: 0.45, ease: 'back.out(2.4)' },\n zoom: { from: { scale: 2.5, alpha: 0 }, duration: 0.6, ease: 'power3.out' },\n slide: { from: { x: -60, alpha: 0 }, duration: 0.5, ease: 'power3.out' },\n spin: { from: { rotation: -90, scale: 0, alpha: 0 }, duration: 0.6, ease: 'back.out(1.7)' },\n} as const;\nexport type TextPreset = keyof typeof PRESETS;\nconst PRESET_NAMES = Object.keys(PRESETS);\n\nexport interface AnimateTextTween {\n /** Start from this preset and change what you give below. */\n preset?: TextPreset;\n /** The hidden state: `x` / `y` are offsets from the resting place, everything else (`alpha`, `scale`, `rotation`, …) is absolute. */\n from?: Record<string, number>;\n /** The resting state, for properties that have none of their own (`alpha` 1, `scale` 1, `rotation` 0 and the place are known). */\n to?: Record<string, number>;\n /** Seconds each piece takes. */\n duration?: number;\n /** GSAP ease. */\n ease?: string;\n}\n\nexport interface AnimateTextOptions {\n /** What a piece is: a character (default), a word or a line. */\n by?: 'chars' | 'words' | 'lines';\n /** Where the text goes: `x` is its left edge, or its centre / right edge with `align`. */\n x?: number;\n /** Top of the first line. */\n y?: number;\n align?: 'left' | 'center' | 'right';\n /** Layers are named `<name>-0`, `<name>-1`, … (default `'text'`). */\n name?: string;\n /** When the first piece starts, in composition seconds. Default 0. */\n at?: number;\n /** Seconds from `at` until every piece is gone, the last one included. Required. */\n duration: number;\n /** How a piece arrives: a preset (`'rise'` default, `'drop'`, `'fade'`, `'pop'`, `'zoom'`, `'slide'`, `'spin'`), your own tween, or `false` for none. */\n in?: TextPreset | AnimateTextTween | false;\n /** How a piece leaves, in the same wave (the entrance backwards, eased the other way). Default none. */\n out?: TextPreset | AnimateTextTween | false;\n /** The wave: see {@link stagger}. Default `{ each: 0.04 }`. */\n stagger?: StaggerOptions;\n /** A seeded drift between the entrance and the exit, each piece its own: `{ y: 4, rotation: 1 }` (amounts), `freq` (default 1 target per second), `seed`. */\n idle?: { x?: number; y?: number; rotation?: number; scale?: number; freq?: number; seed?: number };\n /** Style changes for one piece (a colour for the first letter): merged over `style`. */\n styleFor?: (piece: TextPiece) => MeasureStyle;\n}\n\ninterface Resolved { from: Record<string, number>; to: Record<string, number>; duration: number; ease: string }\n\n/**\n * Per-character, per-word or per-line text animation in one call: one text layer per piece, laid out exactly like the\n * whole text, each entering (and optionally leaving) in a wave. It is `splitText` + `stagger` + a preset, so the result\n * is plain layers you can spread into `sequences`, add to, or change.\n *\n * ```js\n * ...animateText('Hello world', style, { x: 640, y: 300, align: 'center', at: 0.5, duration: 5,\n * in: 'rise', out: 'fade', stagger: { each: 0.05, from: 'center' } })\n * ```\n *\n * Pieces rotate and scale about their own centre. All pieces are gone at `at + duration`.\n */\nexport function animateText(text: string, style: MeasureStyle, options: AnimateTextOptions): TextSequenceSpec[] {\n warnUnknownOptions('animateText()', options, KEYS);\n const { by = 'chars', x = 0, y = 0, align = 'left', name = 'text', at = 0, duration, idle, styleFor } = options;\n if (!(Number.isFinite(duration) && duration > 0)) throw new Error(`animateText(): duration must be a positive number of seconds (how long until the last piece is gone), got ${duration}`);\n const pieces = splitText(text, style, { by, x, y, align });\n if (pieces.length === 0) return [];\n\n const lineHeight = measureText('M', style).height;\n const inTween = options.in === false ? null : resolveTween(options.in ?? 'rise', 'in');\n const outTween = options.out === undefined || options.out === false ? null : resolveTween(options.out, 'out');\n const delays = stagger(pieces.length, options.stagger ?? { each: 0.04 });\n const wave = Math.max(...delays);\n const need = (inTween?.duration ?? 0) + (outTween?.duration ?? 0) + wave;\n if (duration < need - 1e-9) {\n throw new Error(`animateText(): duration ${duration} is too short for this wave: the entrance${outTween ? ', the exit' : ''} and the stagger need at least ${+need.toFixed(3)} s`);\n }\n\n const end = at + duration;\n return pieces.map((p, i) => {\n const cx = p.x + p.width / 2, cy = p.y + lineHeight / 2;\n const rest: Record<string, number> = { x: cx, y: cy, alpha: 1, scale: 1, scaleX: 1, scaleY: 1, rotation: 0 };\n const start = at + delays[i]!;\n const len = end - start;\n const keyframes: Keyframe[] = [];\n const place = (key: string, v: number) => (key === 'x' || key === 'y' ? rest[key]! + v : v);\n if (inTween) {\n keyframes.push({\n at: 0, duration: inTween.duration, ease: inTween.ease,\n from: Object.fromEntries(Object.entries(inTween.from).map(([k, v]) => [k, place(k, v)])),\n to: Object.fromEntries(Object.keys(inTween.from).map(k => [k, inTween.to[k] ?? rest[k]!])),\n });\n }\n let idleEnd = len;\n if (outTween) {\n const begin = outTween.duration + (wave - delays[i]!); // seconds before this piece's end\n idleEnd = len - begin;\n keyframes.push({\n at: -begin, duration: outTween.duration, ease: outTween.ease,\n from: Object.fromEntries(Object.keys(outTween.from).map(k => [k, outTween.to[k] ?? rest[k]!])),\n to: Object.fromEntries(Object.entries(outTween.from).map(([k, v]) => [k, place(k, v)])),\n });\n }\n if (idle) {\n const props: Record<string, { around: number; amp: number }> = {};\n for (const k of ['x', 'y', 'rotation', 'scale'] as const) if (idle[k] !== undefined) props[k] = { around: rest[k]!, amp: idle[k]! };\n const freq = idle.freq ?? 1;\n const from = inTween?.duration ?? 0;\n if (Object.keys(props).length > 0 && idleEnd - from >= 1 / freq) {\n keyframes.push(...wiggle({ at: from, duration: idleEnd - from, freq, seed: (idle.seed ?? 0) * 1000 + i, props }));\n }\n }\n return {\n type: 'text', name: `${name}-${i}`, text: p.text, style: styleFor ? { ...style, ...styleFor(p) } : style,\n at: start, duration: len,\n initial: { x: cx, y: cy, anchorX: 0.5, anchorY: 0.5 },\n keyframes,\n } as TextSequenceSpec;\n });\n}\n\nfunction resolveTween(spec: TextPreset | AnimateTextTween, which: 'in' | 'out'): Resolved {\n const t: AnimateTextTween = typeof spec === 'string' ? { preset: spec } : spec;\n if (t.preset !== undefined && !(t.preset in PRESETS)) {\n const guess = suggestName(String(t.preset), PRESET_NAMES);\n throw new Error(`animateText(): ${which} \"${t.preset}\" is not a preset${guess ? `; did you mean \"${guess}\"?` : ''} (presets: ${PRESET_NAMES.map(n => `\"${n}\"`).join(', ')})`);\n }\n const base = t.preset ? PRESETS[t.preset] : undefined;\n const from: Record<string, number> = { ...(base?.from ?? {}), ...(t.from ?? {}) };\n const to = t.to ?? {};\n const known = new Set(['x', 'y', 'alpha', 'scale', 'scaleX', 'scaleY', 'rotation']);\n for (const k of Object.keys(from)) {\n if (!known.has(k) && to[k] === undefined) throw new Error(`animateText(): ${which}.from has \"${k}\", which has no resting value; give ${which}.to: { ${k}: … }`);\n }\n if (Object.keys(from).length === 0) throw new Error(`animateText(): ${which} needs a preset or a from`);\n let ease = t.ease ?? base?.ease ?? 'power2.out';\n if (which === 'out' && t.ease === undefined) ease = ease.replace('.out', '.in');\n return { from, to: { ...to }, duration: t.duration ?? base?.duration ?? 0.5, ease };\n}\n","import type { Keyframe } from '../types';\nimport type { AudioEnvelope } from '../audio/envelope';\nimport { warnUnknownOptions } from '../core/options';\n\nconst KEYS = ['at', 'duration', 'props', 'audioOffset', 'loop', 'frameRate'] as const;\nconst PROP_KEYS = ['base', 'amount', 'band', 'beats', 'decay', 'attack', 'release', 'invert', 'curve'] as const;\nconst MAX_STEPS = 4000;\n\nexport interface ReactProp {\n /** The value at rest (a level of 0). Default 0. */\n base?: number;\n /** How far the value goes at a level of 1 (can be negative). Required. */\n amount: number;\n /** Which series of the envelope drives it: `'level'` (default) or a band (`'bass'`, `'mid'`, `'treble'`, or your own). */\n band?: string;\n /** Follow the beats instead: a jump to full on each beat, falling off after it (see `decay`). */\n beats?: boolean;\n /** With `beats`: seconds for the pulse to fall to 37 %. Default 0.2. */\n decay?: number;\n /** Smoothing, in seconds, for a level that rises (`attack`) and falls (`release`), like a level meter: a quick rise and a slow fall looks like a bounce. Default none. */\n attack?: number;\n release?: number;\n /** Use 1 − level (it gets smaller as the sound gets louder). */\n invert?: boolean;\n /** Raise the level to this power first: above 1 only the loud parts move it (a punchier look), below 1 even the quiet ones do. Default 1. */\n curve?: number;\n}\n\nexport interface ReactOptions {\n /** Start, in seconds from the start of the layer. Default 0. */\n at?: number;\n /** How long it follows the sound, in seconds. Required. */\n duration: number;\n /** The properties to move and how, each its own way: `{ scale: { base: 1, amount: 0.3, band: 'bass' }, alpha: { base: 0.3, amount: 0.7 } }`. */\n props: Record<string, ReactProp>;\n /** Where in the sound the layer's start is, in seconds (the layer starts 2 s after the music began: `audioOffset: 2`). Default 0. */\n audioOffset?: number;\n /** The sound repeats (a looping music layer) instead of the last value being held. */\n loop?: boolean;\n /** Samples per second (default: the envelope's, so one per video frame). Lower it for a long layer, the steps get longer. */\n frameRate?: number;\n}\n\n/**\n * Keyframes that follow a sound: `base + amount × level` sampled once per frame from an envelope (`audioEnvelope()` for a real file,\n * `bpmEnvelope()` for a tempo), so playback, seeking and export all agree. Put the result in a layer's `keyframes`.\n *\n * ```js\n * const env = await audioEnvelope('music.mp3', { frameRate: 30 });\n * { type: 'shape', shape: 'circle', radius: 120, initial: { x: 640, y: 360 },\n * keyframes: react(env, { duration: 12, props: { scale: { base: 1, amount: 0.4, band: 'bass', attack: 0.02, release: 0.2 } } }) }\n * ```\n */\nexport function react(env: AudioEnvelope, options: ReactOptions): Keyframe[] {\n warnUnknownOptions('react()', options, KEYS);\n const { at = 0, duration, props, audioOffset = 0, loop = false } = options;\n const frameRate = options.frameRate ?? env.frameRate;\n if (!(Number.isFinite(duration) && duration > 0)) throw new Error(`react(): duration must be a positive number of seconds, got ${duration}`);\n if (!(Number.isFinite(frameRate) && frameRate > 0)) throw new Error(`react(): frameRate must be a positive number, got ${frameRate}`);\n const names = Object.keys(props ?? {});\n if (names.length === 0) throw new Error('react(): props is empty; name at least one property, e.g. props: { scale: { base: 1, amount: 0.3 } }');\n for (const n of names) {\n const p = props[n]!;\n warnUnknownOptions(`react() props.${n}`, p, PROP_KEYS);\n if (!Number.isFinite(p.amount)) throw new Error(`react(): props.${n}.amount must be a number, got ${p.amount}`);\n if (!p.beats && p.band !== undefined && !env.series[p.band]) throw new Error(`react(): props.${n}: band \"${p.band}\" is not in this envelope (it has: ${Object.keys(env.series).join(', ')})`);\n if (p.beats && !(p.decay === undefined || (Number.isFinite(p.decay) && p.decay > 0))) throw new Error(`react(): props.${n}.decay must be a positive number of seconds, got ${p.decay}`);\n }\n const steps = Math.max(1, Math.round(duration * frameRate));\n if (steps > MAX_STEPS) throw new Error(`react(): too many keyframes (${steps} steps, max ${MAX_STEPS}); lower frameRate (now ${frameRate}) or duration`);\n\n const wrap = (a: number): number => (loop && env.duration > 0 ? ((a % env.duration) + env.duration) % env.duration : a);\n const beatPulse = (a: number, decay: number): number => {\n const beats = env.beats;\n let lo = 0, hi = beats.length - 1, found = -1;\n while (lo <= hi) { const mid = (lo + hi) >> 1; if (beats[mid]! <= a + 1e-9) { found = mid; lo = mid + 1; } else hi = mid - 1; }\n if (found < 0) return 0;\n return Math.exp(-(a - beats[found]!) / decay);\n };\n\n const round = (v: number) => Math.round(v * 1e4) / 1e4;\n const state: Record<string, number> = {};\n const values = (k: number): Record<string, number> => {\n const t = k / frameRate, a = wrap(audioOffset + t);\n const out: Record<string, number> = {};\n for (const n of names) {\n const p = props[n]!;\n let x = p.beats ? beatPulse(a, p.decay ?? 0.2) : env.at(a, p.band ?? 'level');\n if (p.invert) x = 1 - x;\n const prev = state[n];\n if (prev !== undefined && (p.attack || p.release)) {\n const tau = x > prev ? p.attack ?? 0 : p.release ?? 0;\n if (tau > 0) x = prev + (x - prev) * (1 - Math.exp(-(1 / frameRate) / tau));\n }\n state[n] = x;\n const shaped = p.curve && p.curve !== 1 ? Math.pow(Math.max(0, x), p.curve) : x;\n out[n] = round((p.base ?? 0) + p.amount * shaped);\n }\n return out;\n };\n\n const out: Keyframe[] = [{ at, set: values(0) }];\n const step = duration / steps;\n for (let k = 1; k <= steps; k++) out.push({ at: round6(at + (k - 1) * step), to: values(k), duration: round6(step), ease: 'none' });\n return out;\n}\n\nconst round6 = (v: number): number => Math.round(v * 1e6) / 1e6;\n","import { fft } from '../core/spectrum';\nimport { warnUnknownOptions } from '../core/options';\n\n/** The part of an `AudioBuffer` the analysis reads (so it can be tested with plain arrays). */\nexport interface AudioLike {\n sampleRate: number;\n numberOfChannels: number;\n length: number;\n getChannelData(channel: number): Float32Array;\n}\n\nexport interface EnvelopeOptions {\n /** One value per video frame: use your movie's `frameRate`. Default 30. */\n frameRate?: number;\n /** Frequency bands in Hz, `{ name: [from, to] }`. Default `{ bass: [20, 150], mid: [150, 2000], treble: [2000, 10000] }`. */\n bands?: Record<string, [number, number]>;\n /** The band the beats are looked for in (default `'bass'`, or `'level'` if there is no such band). */\n beatBand?: string;\n /** More (above 1) or fewer (below 1) beats. Default 1. */\n beatSensitivity?: number;\n}\n\n/** What a piece of sound does over time, as numbers between 0 and 1, one per video frame, plus where its beats are. */\nexport interface AudioEnvelope {\n frameRate: number;\n /** Seconds of sound. */\n duration: number;\n /** Values per series (`frames`). */\n frames: number;\n /** `level` (the overall loudness) and one series per band, each 0–1 on a log (perceptual) scale. */\n series: Record<string, Float32Array>;\n /** Times of the beats, in seconds. */\n beats: number[];\n /** The tempo estimated from the beats (null if there are too few). */\n bpm: number | null;\n /** The value of a series at a time (seconds): interpolated between frames, held at the ends. `series` defaults to `'level'`. */\n at(time: number, series?: string): number;\n}\n\nconst DEFAULT_BANDS: Record<string, [number, number]> = { bass: [20, 150], mid: [150, 2000], treble: [2000, 10000] };\nconst WINDOW = 2048;\nconst RANGE_DB = 36; // 36 dB below the loudest is zero\nconst MIN_BEAT_GAP = 0.2; // seconds\nconst OPTION_KEYS = ['frameRate', 'bands', 'beatBand', 'beatSensitivity'] as const;\n\nfunction makeAt(frameRate: number, series: Record<string, Float32Array>): AudioEnvelope['at'] {\n return (time, name = 'level') => {\n const s = series[name];\n if (!s) throw new Error(`pixi-effects: this envelope has no series \"${name}\" (it has: ${Object.keys(series).join(', ')})`);\n const x = Math.min(Math.max(time * frameRate, 0), s.length - 1);\n const i = Math.floor(x), f = x - i;\n return i + 1 < s.length ? s[i]! + (s[i + 1]! - s[i]!) * f : s[i]!;\n };\n}\n\nfunction percentile(values: Float32Array | Float64Array, p: number): number {\n if (values.length === 0) return 0;\n const sorted = Float64Array.from(values).sort();\n return sorted[Math.min(sorted.length - 1, Math.floor(p * (sorted.length - 1)))]!;\n}\n\nfunction pickBeats(strength: Float32Array, frameRate: number, sensitivity: number): number[] {\n const n = strength.length;\n const flux = new Float64Array(n);\n for (let i = 1; i < n; i++) flux[i] = Math.max(0, strength[i]! - strength[i - 1]!);\n const half = Math.max(2, Math.round(frameRate * 0.5));\n const gap = Math.max(1, Math.round(MIN_BEAT_GAP * frameRate));\n const beats: number[] = [];\n let last = -gap;\n for (let i = 1; i < n; i++) {\n const v = flux[i]!;\n if (v < 0.12 / sensitivity || v < flux[i - 1]! || v <= (flux[i + 1] ?? 0)) continue; // big enough, and the top of its little hill\n let mean = 0, sq = 0, count = 0;\n for (let j = Math.max(0, i - half); j <= Math.min(n - 1, i + half); j++) { mean += flux[j]!; sq += flux[j]! * flux[j]!; count++; }\n mean /= count;\n const std = Math.sqrt(Math.max(0, sq / count - mean * mean));\n if (v < mean + 1.0 * std / sensitivity) continue; // and clearly above what is around it\n if (i - last < gap) { if (beats.length && v > flux[last]!) { beats[beats.length - 1] = i / frameRate; last = i; } continue; }\n beats.push(i / frameRate); last = i;\n }\n return beats;\n}\n\nfunction tempo(beats: number[]): number | null {\n if (beats.length < 4) return null;\n const gaps = beats.slice(1).map((b, i) => b - beats[i]!).sort((a, b) => a - b);\n const median = gaps[Math.floor(gaps.length / 2)]!;\n return Math.round((60 / median) * 10) / 10;\n}\n\n/**\n * Analyse a sound: its loudness and the energy in a few frequency bands, one value per video frame (0–1 on a log scale, all measured\n * against the loudest of them, so the balance between bands is kept and a quiet file looks like a loud one), and where its beats are.\n * Pure and deterministic: the same sound gives the same numbers.\n */\nexport function computeEnvelope(audio: AudioLike, options: EnvelopeOptions = {}): AudioEnvelope {\n warnUnknownOptions('audioEnvelope()', options, OPTION_KEYS);\n const frameRate = options.frameRate ?? 30;\n if (!(Number.isFinite(frameRate) && frameRate > 0)) throw new Error(`pixi-effects: audioEnvelope(): frameRate must be a positive number, got ${frameRate}`);\n const bands = options.bands ?? DEFAULT_BANDS;\n for (const [name, range] of Object.entries(bands)) {\n if (!(Array.isArray(range) && range.length === 2 && range[0] >= 0 && range[0] < range[1])) throw new Error(`pixi-effects: audioEnvelope(): band \"${name}\" must be [from, to] in Hz with from < to, got ${JSON.stringify(range)}`);\n }\n const sr = audio.sampleRate, length = audio.length;\n const mono = new Float32Array(length);\n for (let c = 0; c < audio.numberOfChannels; c++) { const d = audio.getChannelData(c); for (let i = 0; i < length; i++) mono[i]! += d[i]! / audio.numberOfChannels; }\n\n const duration = length / sr;\n const frames = Math.floor(duration * frameRate + 1e-9) + 1;\n const hop = sr / frameRate;\n const names = Object.keys(bands);\n const raw: Record<string, Float64Array> = { level: new Float64Array(frames) };\n for (const n of names) raw[n] = new Float64Array(frames);\n\n const re = new Float64Array(WINDOW), im = new Float64Array(WINDOW);\n const win = new Float64Array(WINDOW);\n let winPower = 0;\n for (let i = 0; i < WINDOW; i++) { win[i] = 0.5 - 0.5 * Math.cos((2 * Math.PI * i) / (WINDOW - 1)); winPower += win[i]! * win[i]!; }\n winPower /= WINDOW;\n const binHz = sr / WINDOW;\n for (let f = 0; f < frames; f++) {\n const center = Math.round((f / frameRate) * sr);\n // the level: the RMS of one frame's worth of samples around the frame time\n let sum = 0, cnt = 0;\n for (let i = Math.max(0, Math.round(center - hop / 2)); i < Math.min(length, Math.round(center + hop / 2)); i++) { sum += mono[i]! * mono[i]!; cnt++; }\n raw.level![f] = cnt ? Math.sqrt(sum / cnt) : 0;\n // the bands: a Hann-windowed FFT around the frame time; power scaled so the bands add up to the RMS\n for (let i = 0; i < WINDOW; i++) { const k = center - WINDOW / 2 + i; re[i] = k >= 0 && k < length ? mono[k]! * win[i]! : 0; im[i] = 0; }\n fft(re, im);\n for (const n of names) {\n const [lo, hi] = bands[n]!;\n let p = 0;\n for (let b = Math.max(1, Math.ceil(lo / binHz)); b <= Math.min(WINDOW / 2 - 1, Math.floor(hi / binHz)); b++) p += re[b]! * re[b]! + im[b]! * im[b]!;\n raw[n]![f] = Math.sqrt((2 * p) / (WINDOW * WINDOW * winPower));\n }\n }\n\n let ref = 0;\n for (const s of Object.values(raw)) ref = Math.max(ref, percentile(s, 0.98));\n const series: Record<string, Float32Array> = {};\n for (const [name, s] of Object.entries(raw)) {\n const out = new Float32Array(frames);\n if (ref > 1e-7) for (let f = 0; f < frames; f++) { const v = s[f]!; out[f] = v > 0 ? Math.min(1, Math.max(0, 1 + (20 * Math.log10(v / ref)) / RANGE_DB)) : 0; }\n series[name] = out;\n }\n\n const beatName = options.beatBand ?? (series.bass ? 'bass' : 'level');\n if (!series[beatName]) throw new Error(`pixi-effects: audioEnvelope(): beatBand \"${beatName}\" is not one of ${Object.keys(series).join(', ')}`);\n const beats = ref > 1e-7 ? pickBeats(series[beatName]!, frameRate, options.beatSensitivity ?? 1) : [];\n return { frameRate, duration, frames, series, beats, bpm: tempo(beats), at: makeAt(frameRate, series) };\n}\n\n/**\n * A stand-in for analysed music, on a tempo you choose: a kick on every beat (`bass`), a snare on 2 and 4 (`mid`), hats on the eighth\n * notes (`treble`), each a pulse that decays; `level` follows them. Beats are exactly on the beat. Use it with no audio file, or to\n * make visuals that match sound effects you place on the same tempo.\n */\nexport function bpmEnvelope(bpm: number, options: { duration: number; frameRate?: number; swing?: number }): AudioEnvelope {\n const { duration, frameRate = 30, swing = 0 } = options;\n if (!(Number.isFinite(bpm) && bpm > 0)) throw new Error(`pixi-effects: bpmEnvelope(): bpm must be a positive number, got ${bpm}`);\n if (!(Number.isFinite(duration) && duration > 0)) throw new Error(`pixi-effects: bpmEnvelope(): duration must be a positive number of seconds, got ${duration}`);\n const beat = 60 / bpm;\n const frames = Math.round(duration * frameRate) + 1;\n const pulse = (hits: number[], decay: number, t: number): number => {\n let v = 0;\n for (let i = hits.length - 1; i >= 0; i--) { if (hits[i]! <= t + 1e-9) { v = Math.exp(-(t - hits[i]!) / decay); break; } }\n return v;\n };\n const beats: number[] = [], snares: number[] = [], hats: number[] = [];\n for (let k = 0; k * beat < duration - 1e-9; k++) {\n beats.push(round6(k * beat));\n if (k % 2 === 1) snares.push(round6(k * beat));\n hats.push(round6(k * beat), round6(k * beat + beat / 2 + swing * beat));\n }\n hats.sort((a, b) => a - b);\n const series: Record<string, Float32Array> = { level: new Float32Array(frames), bass: new Float32Array(frames), mid: new Float32Array(frames), treble: new Float32Array(frames) };\n for (let f = 0; f < frames; f++) {\n const t = f / frameRate;\n const b = pulse(beats, 0.14, t), m = pulse(snares, 0.1, t), h = pulse(hats, 0.045, t);\n series.bass![f] = b; series.mid![f] = m; series.treble![f] = h;\n series.level![f] = Math.max(b, m * 0.9, h * 0.55);\n }\n return { frameRate, duration, frames, series, beats, bpm, at: makeAt(frameRate, series) };\n}\n\nconst round6 = (v: number): number => Math.round(v * 1e6) / 1e6;\n\n/** What `audioEnvelope()` can read: a URL (string), a Blob / File, the raw bytes of a file, or an `AudioBuffer` you already decoded. */\nexport type AudioEnvelopeSource = string | URL | Blob | ArrayBuffer | AudioBuffer;\n\n/**\n * Decode an audio file and analyse it (see {@link computeEnvelope}). Do it before `movie.init`, with the same file the music layer plays,\n * and feed the result to `react()`:\n *\n * ```js\n * const env = await audioEnvelope('music.mp3', { frameRate: 30 });\n * ```\n */\nexport async function audioEnvelope(source: AudioEnvelopeSource, options: EnvelopeOptions = {}): Promise<AudioEnvelope> {\n let audio: AudioLike;\n if (typeof (source as AudioBuffer).getChannelData === 'function') audio = source as AudioBuffer;\n else {\n let data: ArrayBuffer;\n if (typeof source === 'string' || source instanceof URL) {\n const res = await fetch(String(source));\n if (!res.ok) throw new Error(`pixi-effects: audioEnvelope(): could not fetch ${String(source)} (${res.status})`);\n data = await res.arrayBuffer();\n } else if (source instanceof Blob) data = await source.arrayBuffer();\n else data = source as ArrayBuffer;\n const Ctx = (globalThis as unknown as { OfflineAudioContext?: typeof OfflineAudioContext; webkitOfflineAudioContext?: typeof OfflineAudioContext }).OfflineAudioContext\n ?? (globalThis as unknown as { webkitOfflineAudioContext?: typeof OfflineAudioContext }).webkitOfflineAudioContext;\n if (!Ctx) throw new Error('pixi-effects: audioEnvelope() needs a browser with Web Audio (OfflineAudioContext)');\n try { audio = await new Ctx(1, 1, 44100).decodeAudioData(data.slice(0)); }\n catch (err) { throw new Error(`pixi-effects: audioEnvelope(): could not decode the audio (${err instanceof Error ? err.message : String(err)}); is it an mp3, wav, ogg, m4a or webm file?`); }\n }\n return computeEnvelope(audio, options);\n}\n","import type { MusicOptions } from '../types';\nimport { computeEnvelope, type AudioEnvelope, type EnvelopeOptions } from './envelope';\n\n/**\n * What the `music` of an audio layer does over time, as numbers for `react()`: `level`, `bass`, `mid`, `treble` (or your own `bands`), one\n * value per video frame, from analysing the very sound the layer will play. The beats are exact (the kick hits, or every beat when there\n * is no kick) and `bpm` is the starting tempo. Do it before `movie.init`, with the same `music` object the layer uses:\n *\n * ```js\n * const music = { bpm: 96, tracks: [...], drums: {...} };\n * const env = await musicEnvelope(music, { frameRate: 30 });\n * // sequences: [{ type: 'audio', music }, { type: 'shape', ..., keyframes: react(env, { duration, props: { scale: { base: 1, amount: 0.3, band: 'bass' } } }) }]\n * ```\n */\nexport async function musicEnvelope(music: MusicOptions, options: EnvelopeOptions = {}): Promise<AudioEnvelope> {\n // The synthesiser is its own chunk: pages that never use music never load it.\n const { resolveMusic, renderMusic, musicLength, musicBeatTimes, TempoMap } = await import('./music');\n const messages: string[] = [];\n const m = resolveMusic(music, 'musicEnvelope()', msg => messages.push(msg));\n if (!m) throw new Error(`pixi-effects: musicEnvelope(): ${messages.join(' ') || 'the music has nothing to play'}`);\n for (const msg of messages) console.warn(msg);\n const sampleRate = 22050;\n const [left, right] = renderMusic(m, sampleRate, musicLength(m), false);\n const env = computeEnvelope({ sampleRate, numberOfChannels: 2, length: left.length, getChannelData: c => (c === 0 ? left : right) }, options);\n return { ...env, beats: musicBeatTimes(m, env.duration), bpm: Math.round(new TempoMap(m.tempo).bpmAt(0) * 100) / 100 };\n}\n","import type { CompositionSpec, SequenceSpec, TransitionSpec, Keyframe, Props } from '../types';\nimport type { StopSpec } from '../core/stops';\nimport { warnUnknownOptions } from '../core/options';\n\nconst PAGE_KEYS = ['name', 'duration', 'sequences', 'stops', 'notes', 'advance', 'initial', 'keyframes', 'filters', 'filterArea', 'blendMode', 'mask', 'maskInverted'] as const;\nconst DECK_KEYS = ['pages', 'transition', 'width', 'height', 'frameRate', 'background', 'canvas', 'assets', 'poster', 'motionBlur', 'loader'] as const;\n\nexport interface DeckPage {\n /** The page's name: shown by the Presenter, and in the stops list. */\n name?: string;\n /** How long the page lasts, seconds (including any transition into the next page, see `DeckOptions.transition`). Required. */\n duration: number;\n /** The page's layers, written in the page's own time (`at: 0` is the start of the page). */\n sequences: SequenceSpec[];\n /** Where the page stops, in the page's own time: the first is the page settled, the rest are steps (a bullet appears, a chart grows). Default: where the transition into the next page begins (the end for the last page). */\n stops?: Array<number | { at: number; pdf?: boolean }>;\n /** Speaker notes (kept on the page's first stop). */\n notes?: string;\n /** Move on by itself this many seconds after the page's last stop (kiosk mode). */\n advance?: number;\n /** The page is itself a layer: it may carry `initial`, `keyframes`, `filters`, … (fade or slide the whole page, for instance). */\n initial?: Props;\n keyframes?: Keyframe[];\n}\n\n/** A transition spec without the parts `deck()` fills in (which two pages, and when). */\nexport type DeckTransition = TransitionSpec extends infer T ? (T extends TransitionSpec ? Omit<T, 'from' | 'to' | 'at'> : never) : never;\n\nexport interface DeckOptions {\n pages: DeckPage[];\n /**\n * A transition between every two pages: `{ kind: 'crossfade' | 'slide' | 'wipe' | 'iris' | 'dip' | 'zoom' | 'dissolve', duration, …its own options }` (see Transitions). The next page starts\n * `duration` seconds before the current one ends, and the transition plays across the overlap.\n */\n transition?: DeckTransition;\n}\n\n/** What `deck()` returns: spread it into `movie.init` (`{ duration, composition: { sequences, transitions?, stops } }` plus any movie option you passed). */\nexport interface DeckResult {\n duration: number;\n composition: CompositionSpec;\n [movieOption: string]: unknown;\n}\n\n/**\n * A deck of pages as one movie. Each page is a nested composition laid out after the one before (so its layers use the page's own\n * time), the stops (where a `Presenter` pauses) come from the pages, and an optional `transition` joins the pages with the existing\n * crossfade / slide / wipe / … transitions.\n *\n * ```js\n * await movie.init({ canvas, width: 1280, height: 720, frameRate: 30, ...deck({\n * transition: { kind: 'slide', duration: 0.6, direction: 'left' },\n * pages: [\n * { name: 'Hello', duration: 5, stops: [1.2], sequences: [ …title, subtitle… ] },\n * { name: 'Why', duration: 8, stops: [1.2, 3, 5], sequences: [ …three bullets, at 1.2, 3, 5… ] },\n * ],\n * }) });\n * movie.on('ready', …); new Presenter(movie, { canvas });\n * ```\n */\nexport function deck(options: DeckOptions): DeckResult {\n if (!options || !Array.isArray(options.pages) || options.pages.length === 0) throw new Error('deck(): pages must be a list with at least one page: { pages: [{ name, duration, stops, sequences }] }');\n warnUnknownOptions('deck()', options, DECK_KEYS);\n const { pages, transition, ...movieOptions } = options as DeckOptions & Record<string, unknown>;\n pages.forEach((p, i) => {\n if (!p || typeof p !== 'object') throw new Error(`deck(): pages[${i}] must be an object`);\n warnUnknownOptions(`deck() pages[${i}]`, p, PAGE_KEYS);\n if (!(typeof p.duration === 'number' && Number.isFinite(p.duration) && p.duration > 0)) throw new Error(`deck(): pages[${i}].duration must be a positive number of seconds, got ${String(p.duration)}`);\n if (!Array.isArray(p.sequences)) throw new Error(`deck(): pages[${i}].sequences must be a list of layers (it may be empty), got ${typeof p.sequences}`);\n });\n let overlap = 0;\n if (transition) {\n if (!(typeof transition.duration === 'number' && transition.duration > 0)) throw new Error('deck(): transition needs a duration in seconds: { kind: \\'crossfade\\', duration: 0.6 }');\n const shortest = Math.min(...pages.map(p => p.duration));\n if (pages.length > 1 && transition.duration >= shortest) throw new Error(`deck(): the transition (${transition.duration} s) must be shorter than every page (the shortest is ${shortest} s)`);\n overlap = pages.length > 1 ? transition.duration : 0;\n }\n\n const sequences: SequenceSpec[] = [];\n const transitions: TransitionSpec[] = [];\n const stops: StopSpec[] = [];\n let start = 0;\n pages.forEach((page, i) => {\n const id = `page-${i + 1}`;\n const label = page.name ? `\"${page.name}\"` : `pages[${i}]`;\n const isLast = i === pages.length - 1;\n const entries = (page.stops ?? [isLast ? page.duration : page.duration - overlap]).map((e, k) => {\n if (e && typeof e === 'object') warnUnknownOptions(`deck() page ${label} stops[${k}]`, e, ['at', 'pdf']);\n return typeof e === 'object' && e !== null ? e : { at: e as number };\n });\n const local = entries.map(e => e.at);\n local.forEach((s, k) => {\n if (!(typeof s === 'number' && Number.isFinite(s) && s > 0 && s <= page.duration + 1e-9)) throw new Error(`deck(): page ${label} has stop ${String(s)}, outside the page (0 to ${page.duration} s)`);\n if (k > 0 && s <= local[k - 1]!) throw new Error(`deck(): page ${label} stops must be in order, earliest first (got ${local.join(', ')})`);\n });\n const { name: _n, duration: _d, sequences: inner, stops: _s, notes: _no, advance: _a, ...layerProps } = page;\n sequences.push({ type: 'composition', name: id, at: round(start), duration: page.duration, ...layerProps, sequences: inner } as unknown as SequenceSpec);\n local.forEach((s, k) => {\n const stop: StopSpec = { at: round(start + s) };\n if (k === 0) { stop.page = page.name ?? true; if (page.notes !== undefined) stop.notes = page.notes; }\n if (k === local.length - 1 && page.advance !== undefined) stop.advance = page.advance;\n if (entries[k]!.pdf !== undefined) stop.pdf = entries[k]!.pdf;\n stops.push(stop);\n });\n if (transition && !isLast) {\n const next = start + page.duration - overlap;\n transitions.push({ ...transition, from: id, to: `page-${i + 2}`, at: round(next), duration: transition.duration } as unknown as TransitionSpec);\n }\n start = start + page.duration - (isLast ? 0 : overlap);\n });\n\n const composition: CompositionSpec = { sequences, stops };\n if (transitions.length > 0) composition.transitions = transitions;\n return { ...movieOptions, duration: round(start), composition };\n}\n\nconst round = (v: number): number => Math.round(v * 1e6) / 1e6;\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"]}
|