pixi-effects 0.35.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +5 -5
  3. package/ai/chat-template.html +3 -3
  4. package/ai/tools/check.mjs +38 -9
  5. package/ai/tools/lookup.mjs +15 -2
  6. package/dist/{Base-pNq6sVGl.d.cts → Base-BlA6SeqJ.d.cts} +1 -1
  7. package/dist/{Base-CXsMdmJB.d.ts → Base-YqM0Ljvp.d.ts} +1 -1
  8. package/dist/Composition-5KZETM4J.js +7 -0
  9. package/dist/{Composition-NDXKQHB4.js.map → Composition-5KZETM4J.js.map} +1 -1
  10. package/dist/Composition-MHDI7UNZ.cjs +16 -0
  11. package/dist/{Composition-OLH7RC5Z.cjs.map → Composition-MHDI7UNZ.cjs.map} +1 -1
  12. package/dist/Controller.d.cts +2 -2
  13. package/dist/Controller.d.ts +2 -2
  14. package/dist/{Movie-VYtUN4TS.d.ts → Movie-CJN_gvLB.d.cts} +26 -2
  15. package/dist/{Movie-Db4QnMIH.d.cts → Movie-CfHaGmUP.d.ts} +26 -2
  16. package/dist/{Spans-QHHWC2PB.js → Spans-FSSO2HGX.js} +6 -6
  17. package/dist/{Spans-QHHWC2PB.js.map → Spans-FSSO2HGX.js.map} +1 -1
  18. package/dist/{Spans-QRMN2EZO.cjs → Spans-WVJH77BW.cjs} +11 -11
  19. package/dist/{Spans-QRMN2EZO.cjs.map → Spans-WVJH77BW.cjs.map} +1 -1
  20. package/dist/{blendModes-WIUCYIMC.cjs → blendModes-FD3THLNC.cjs} +5 -5
  21. package/dist/{blendModes-WIUCYIMC.cjs.map → blendModes-FD3THLNC.cjs.map} +1 -1
  22. package/dist/{blendModes-PP5NPBXY.js → blendModes-FMYO6SQN.js} +4 -4
  23. package/dist/{blendModes-PP5NPBXY.js.map → blendModes-FMYO6SQN.js.map} +1 -1
  24. package/dist/{chunk-ITDYFBB6.js → chunk-32MMNDDN.js} +7 -6
  25. package/dist/chunk-32MMNDDN.js.map +1 -0
  26. package/dist/{chunk-GL2AQFLQ.cjs → chunk-3SAS3ZE5.cjs} +7 -6
  27. package/dist/chunk-3SAS3ZE5.cjs.map +1 -0
  28. package/dist/{chunk-7TTCPHAV.cjs → chunk-E26M4NTL.cjs} +235 -49
  29. package/dist/chunk-E26M4NTL.cjs.map +1 -0
  30. package/dist/{chunk-XV4L72FW.js → chunk-IPQNT65V.js} +6 -6
  31. package/dist/chunk-IPQNT65V.js.map +1 -0
  32. package/dist/{chunk-IMQJVRMT.cjs → chunk-JN7JHNZR.cjs} +5 -5
  33. package/dist/{chunk-IMQJVRMT.cjs.map → chunk-JN7JHNZR.cjs.map} +1 -1
  34. package/dist/{chunk-2GNK6DPV.js → chunk-KNDEKWQO.js} +203 -18
  35. package/dist/chunk-KNDEKWQO.js.map +1 -0
  36. package/dist/{chunk-5IJENZOG.cjs → chunk-MJMOPWMK.cjs} +92 -92
  37. package/dist/chunk-MJMOPWMK.cjs.map +1 -0
  38. package/dist/{chunk-LEECUCTG.cjs → chunk-QHIOOK5S.cjs} +436 -29
  39. package/dist/chunk-QHIOOK5S.cjs.map +1 -0
  40. package/dist/{chunk-Y253JQOH.js → chunk-SBR75G73.js} +416 -11
  41. package/dist/chunk-SBR75G73.js.map +1 -0
  42. package/dist/{chunk-RTJD3ZSW.js → chunk-VNP7QCJE.js} +4 -4
  43. package/dist/{chunk-RTJD3ZSW.js.map → chunk-VNP7QCJE.js.map} +1 -1
  44. package/dist/index.cjs +41 -33
  45. package/dist/index.d.cts +47 -7
  46. package/dist/index.d.ts +47 -7
  47. package/dist/index.js +5 -5
  48. package/dist/loader.css +1 -1
  49. package/dist/present.cjs +5 -5
  50. package/dist/present.d.cts +2 -2
  51. package/dist/present.d.ts +2 -2
  52. package/dist/present.js +5 -5
  53. package/dist/three.cjs +6 -6
  54. package/dist/three.d.cts +2 -2
  55. package/dist/three.d.ts +2 -2
  56. package/dist/three.js +2 -2
  57. package/dist/{types-CavnUvd5.d.cts → types-DvnXXm33.d.cts} +67 -3
  58. package/dist/{types-CavnUvd5.d.ts → types-DvnXXm33.d.ts} +67 -3
  59. package/docs/api.md +5 -4
  60. package/docs/dsl.md +42 -5
  61. package/llms-full.txt +305 -22
  62. package/package.json +1 -1
  63. package/skills/pixi-effects/SKILL.md +5 -4
  64. package/skills/pixi-effects/reference/cheatsheet.md +9 -6
  65. package/skills/pixi-effects/reference/pitfalls.md +7 -0
  66. package/skills/pixi-effects/reference/recipes.md +237 -3
  67. package/skills/pixi-effects/template.html +6 -6
  68. package/dist/Composition-NDXKQHB4.js +0 -7
  69. package/dist/Composition-OLH7RC5Z.cjs +0 -16
  70. package/dist/chunk-2GNK6DPV.js.map +0 -1
  71. package/dist/chunk-5IJENZOG.cjs.map +0 -1
  72. package/dist/chunk-7TTCPHAV.cjs.map +0 -1
  73. package/dist/chunk-GL2AQFLQ.cjs.map +0 -1
  74. package/dist/chunk-ITDYFBB6.js.map +0 -1
  75. package/dist/chunk-LEECUCTG.cjs.map +0 -1
  76. package/dist/chunk-XV4L72FW.js.map +0 -1
  77. package/dist/chunk-Y253JQOH.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/AssetLoader.ts","../src/core/audioRemap.ts","../src/core/AudioMixer.ts","../src/core/spectrum.ts","../src/audio/loudness.ts","../src/core/inspectAudio.ts","../src/text/fonts.ts","../src/core/inspectFonts.ts","../src/core/scenes.ts","../src/core/timeFilters.ts","../src/core/review.ts","../src/core/onion.ts","../src/core/motionBlur.ts","../src/core/renderRange.ts","../src/core/renderOptions.ts","../src/core/Renderer.ts","../src/filters/TransitionMask.ts","../src/filters/LumaWipe.ts","../src/core/Transitions.ts","../src/core/inspect.ts","../src/core/timelineChart.ts","../src/core/frames.ts","../src/core/vars.ts","../src/core/mixCache.ts","../src/core/startWhenRunning.ts","../src/core/poster.ts","../src/core/stops.ts","../src/core/loadProgress.ts","../src/core/loader.ts","../src/core/Movie.ts","../src/text/measure.ts","../src/presets/_ease.ts","../src/presets/kenBurns.ts","../src/presets/orbit.ts","../src/presets/particles.ts","../src/presets/followPath.ts","../src/presets/cameraPath.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/audio/musicBuffer.ts","../src/audio/musicEvents.ts","../src/transforms/withFade.ts"],"names":["num","windows","family","walk","clamp","range","WavOutputFormat","Output","BufferTarget","Filter","GlProgram","defaultFilterVert","GpuProgram","UniformGroup","Assets","extensions","parseEase","KEYS","round","a","out","MAX_STEPS","b","dist","mono","round6"],"mappings":"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","file":"chunk-2GNK6DPV.js","sourcesContent":["import { Assets, ExtensionType, extensions } from 'pixi.js';\nimport {\n Input, BlobSource, ALL_FORMATS, Output, WavOutputFormat,\n BufferTarget, Conversion, VideoSampleSink,\n} from 'mediabunny';\nimport type { AssetSpec } from '../types';\n\nexport interface AudioAssetData {\n audioBuffer: AudioBuffer;\n duration: number;\n}\n\nexport interface VideoAssetData {\n videoTrack: unknown;\n audioBuffer: AudioBuffer | null;\n videoDuration: number;\n audioDuration: number;\n duration: number;\n sink: InstanceType<typeof VideoSampleSink>;\n}\n\nlet registered = false;\n\nexport function ensureLoadersRegistered(audioContext: AudioContext): void {\n if (registered) return;\n registered = true;\n\n extensions.add({\n extension: { type: ExtensionType.LoadParser, name: 'pixi-effects-audio' },\n test: (url: string) => /\\.(mp3|wav|ogg)$/i.test(url),\n async load(url: string): Promise<AudioAssetData> {\n const res = await fetch(url);\n if (!res.ok) throw new Error(`pixi-effects: failed to load ${url}: ${res.statusText}`);\n const buffer = await res.arrayBuffer();\n const audioBuffer = await audioContext.decodeAudioData(buffer);\n return { audioBuffer, duration: audioBuffer.duration };\n },\n });\n\n extensions.add({\n extension: { type: ExtensionType.LoadParser, name: 'pixi-effects-video', priority: 1 },\n test: (url: string) => /\\.(mp4|webm|mov|mkv)$/i.test(url),\n async load(url: string): Promise<VideoAssetData> {\n const blob = await fetch(url).then(r => r.blob());\n const input = new Input({ source: new BlobSource(blob), formats: ALL_FORMATS });\n const videoTrack = await input.getPrimaryVideoTrack();\n if (!videoTrack || !await videoTrack.canDecode()) {\n throw new Error('pixi-effects: video track cannot be decoded');\n }\n const audioTrack = await input.getPrimaryAudioTrack();\n const videoDuration = await videoTrack.computeDuration();\n const audioDuration = audioTrack ? await audioTrack.computeDuration() : 0;\n\n let audioBuffer: AudioBuffer | null = null;\n if (audioTrack) {\n try {\n const out = new Output({ format: new WavOutputFormat(), target: new BufferTarget() });\n const conv = await Conversion.init({ input, output: out, video: { discard: true } });\n await conv.execute();\n audioBuffer = await audioContext.decodeAudioData((out.target as BufferTarget).buffer as ArrayBuffer);\n } catch (e) {\n console.warn('pixi-effects: audio extraction failed:', e);\n }\n }\n return {\n videoTrack,\n audioBuffer,\n videoDuration,\n audioDuration,\n duration: Math.max(videoDuration, audioDuration),\n sink: new VideoSampleSink(videoTrack as import('mediabunny').InputVideoTrack),\n };\n },\n });\n}\n\nexport async function loadAssetBundle(\n assets: AssetSpec[],\n audioContext: AudioContext,\n onProgress?: (fraction: number) => void,\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', onProgress);\n}\n","import type { AudioDescriptor } from '../types';\n\ntype RemapFields = Pick<AudioDescriptor, 'start' | 'end' | 'loop' | 'initialVolume' | 'volumeKeyframes' | 'warp' | 'sourceMap'>;\n\n/** The gain of a sound at its own time `u`: `initialVolume` from `start`, then straight lines to each point (what the Web Audio ramps did). */\nfunction gainAt(a: RemapFields, u: number): number {\n let prevT = a.start, prevV = a.initialVolume ?? 1;\n if (u <= prevT) return prevV;\n for (const kf of a.volumeKeyframes ?? []) {\n if (u <= kf.time) return kf.time === prevT ? kf.value : prevV + (kf.value - prevV) * ((u - prevT) / (kf.time - prevT));\n prevT = kf.time; prevV = kf.value;\n }\n return prevV;\n}\n\nconst CELL = 1 / 1000;\n\n/**\n * Render a sound through its time maps. For every output sample T: u = warp(T) (sampled every millisecond, interpolated), the position\n * in the sound is sourceMap(u) (or u - start), and the sample is read with linear interpolation. Where the position hardly moves (a\n * freeze) it fades to silence rather than hold one sample as a DC offset. Returns null when it is never audible. `at` is where in the\n * mix the returned samples begin. Pitch follows speed (a resample, like a tape).\n */\nexport function resampleThrough(\n a: RemapFields, left: Float32Array, right: Float32Array, srcRate: number, outRate: number, total: number,\n): { L: Float32Array; R: Float32Array; at: number } | null {\n const nCell = Math.ceil(total / CELL) + 2;\n const U = new Float64Array(nCell);\n let first = -1, last = -1;\n for (let k = 0; k < nCell; k++) {\n const u = a.warp ? a.warp(k * CELL) : k * CELL;\n U[k] = u;\n if (Number.isFinite(u) && u >= a.start && u < a.end) { if (first < 0) first = k; last = k; }\n }\n if (first < 0) return null;\n const lo = Math.max(0, (first - 1) * CELL), hi = Math.min(total, (last + 2) * CELL);\n const n = Math.max(1, Math.ceil((hi - lo) * outRate));\n const L = new Float32Array(n), R = new Float32Array(n);\n const dur = left.length / srcRate;\n let prevPos = NaN;\n for (let i = 0; i < n; i++) {\n const T = lo + i / outRate;\n const x = T / CELL, k = Math.min(Math.floor(x), nCell - 2), f = x - k;\n const u0 = U[k]!, u1 = U[k + 1]!;\n if (!(Number.isFinite(u0) && Number.isFinite(u1))) { prevPos = NaN; continue; }\n const u = u0 * (1 - f) + u1 * f;\n if (u < a.start || u >= a.end) { prevPos = NaN; continue; }\n const raw = a.sourceMap ? a.sourceMap(u) : u - a.start;\n let pos = raw;\n if (a.loop) pos = ((pos % dur) + dur) % dur;\n const rate = Number.isNaN(prevPos) ? 1 : Math.abs(raw - prevPos) * outRate;\n prevPos = raw;\n if (pos < 0 || pos >= dur) continue;\n const g = gainAt(a, u) * Math.min(1, rate / 0.02);\n const sp = pos * srcRate, j = Math.floor(sp), fr = sp - j, j1 = Math.min(j + 1, left.length - 1);\n L[i] = (left[j]! * (1 - fr) + left[j1]! * fr) * g;\n R[i] = (right[j]! * (1 - fr) + right[j1]! * fr) * g;\n }\n return { L, R, at: lo };\n}\n\n/**\n * When a sound plays, in the MOVIE's time. Without a `warp` that is `start`..`end`; with one (the sound sits in a remapped composition)\n * `start` / `end` are the composition's local times, so the span is where the warp lands inside them. `total` is the movie's length.\n */\nexport function playSpan(a: Pick<AudioDescriptor, 'start' | 'end' | 'warp'>, total: number): { start: number; end: number } {\n if (!a.warp) return { start: a.start, end: a.end };\n let first = -1, last = -1;\n const n = Math.ceil(total / CELL) + 1;\n for (let k = 0; k <= n; k++) {\n const u = a.warp(k * CELL);\n if (Number.isFinite(u) && u >= a.start && u < a.end) { if (first < 0) first = k; last = k; }\n }\n return first < 0 ? { start: total, end: total } : { start: first * CELL, end: (last + 1) * CELL };\n}\n\n/**\n * The farthest local time the warp (the clock of the composition the sound sits in) reaches during the movie. A sound whose local `end` is\n * beyond it is cut short by that clock (it stops or stands still) — a different cause than the end of the movie.\n */\nexport function clockReach(a: Pick<AudioDescriptor, 'warp'>, total: number): number {\n let reach = -Infinity;\n const n = Math.ceil(total / CELL) + 1;\n for (let k = 0; k <= n; k++) {\n const u = a.warp ? a.warp(k * CELL) : k * CELL;\n if (Number.isFinite(u) && u > reach) reach = u;\n }\n return reach;\n}\n","import type { AudioDescriptor } from '../types';\nimport { resampleThrough, playSpan } from './audioRemap';\nexport type { AudioDescriptor };\n\nexport async function mixdown(\n audios: AudioDescriptor[],\n totalDuration: number,\n sampleRate = 44100,\n /** Runs between the slices of the work (`done` is how much of the whole mixdown is made, 0..1) and may wait: the page can paint. */\n pace?: (done: number) => Promise<void> | void,\n): Promise<AudioBuffer | null> {\n if (audios.length === 0) return null;\n // how much each sound weighs in `pace`: a synthesised one by its length (the music is nearly all of the time), a file very little\n const weight = (a: AudioDescriptor): number => (a.synth ? Math.max(1, a.end - a.start) : 0.2);\n const all = audios.reduce((s, a) => s + weight(a), 0) + 0.5; // + the final render\n let made = 0;\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 = async (a: AudioDescriptor, inner?: (done: number) => Promise<void> | void): Promise<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.renderAsync ? await a.synth.renderAsync(sampleRate, inner) : 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 w = weight(a), base = made;\n const buffer = await bufferOf(a, pace ? (f) => pace((base + w * f) / all) : undefined);\n made += w;\n if (pace) await pace(made / all);\n if (!buffer) continue;\n if (a.warp || a.sourceMap) {\n // A time remap: resample the sound through the maps into a buffer of its own, then play that one straight. (`start` is in the\n // sound's own time here, so the \"starts before the movie\" check below does not apply.)\n const r = resampleThrough(a, buffer.getChannelData(0), buffer.numberOfChannels > 1 ? buffer.getChannelData(1) : buffer.getChannelData(0), buffer.sampleRate, sampleRate, totalDuration);\n if (!r) continue;\n const out = ctx.createBuffer(2, r.L.length, sampleRate);\n out.getChannelData(0).set(r.L);\n out.getChannelData(1).set(r.R);\n const rendered = ctx.createBufferSource();\n rendered.buffer = out;\n rendered.connect(ctx.destination);\n rendered.start(r.at);\n continue;\n }\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.map(a => ({ a, ...playSpan(a, buffer.duration) })).filter(s => s.start <= peakAt && peakAt < s.end).map(s => s.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","/** Loudness of a mix, ITU-R BS.1770-4 / EBU R128, without a dependency. Pure: takes channels, returns numbers. */\nexport interface LoudnessReport { integratedLufs: number | null; truePeakDb: number | null; samplePeakDb: number; clippedSamples: number }\n\n/** Where the advice in `inspectAudio().notes` starts: one place, so the docs can point at it. */\nexport const LOUDNESS_NOTES = { quietBelow: -24, loudAbove: -9, headroomDb: -1 } as const;\n\ninterface Biquad { b: [number, number, number]; a: [number, number, number] }\n\n/** The K-weighting of BS.1770-4: a high shelf, then a 38 Hz high-pass, as biquads for any sample rate (bilinear transform). */\nfunction kWeighting(fs: number): [Biquad, Biquad] {\n const f0 = 1681.974450955533, G = 3.999843853973347, Q = 0.7071752369554196;\n const K = Math.tan(Math.PI * f0 / fs), Vh = 10 ** (G / 20), Vb = Vh ** 0.4996667741545416;\n const a0 = 1 + K / Q + K * K;\n const shelf: Biquad = {\n b: [(Vh + Vb * K / Q + K * K) / a0, 2 * (K * K - Vh) / a0, (Vh - Vb * K / Q + K * K) / a0],\n a: [1, 2 * (K * K - 1) / a0, (1 - K / Q + K * K) / a0],\n };\n const f1 = 38.13547087602444, Q1 = 0.5003270373238773, K1 = Math.tan(Math.PI * f1 / fs), a1 = 1 + K1 / Q1 + K1 * K1;\n const high: Biquad = { b: [1, -2, 1], a: [1, 2 * (K1 * K1 - 1) / a1, (1 - K1 / Q1 + K1 * K1) / a1] };\n return [shelf, high];\n}\n\nfunction filter(x: Float32Array, stages: Biquad[]): Float32Array {\n let cur = x;\n for (const { b, a } of stages) {\n const out = new Float32Array(cur.length); // Float32 between stages: half the memory, far below the measurement's resolution\n let x1 = 0, x2 = 0, y1 = 0, y2 = 0;\n for (let i = 0; i < cur.length; i++) {\n const xi = cur[i]!, y = b[0] * xi + b[1] * x1 + b[2] * x2 - a[1] * y1 - a[2] * y2;\n x2 = x1; x1 = xi; y2 = y1; y1 = y; out[i] = y;\n }\n cur = out;\n }\n return cur;\n}\n\nconst toDb = (x: number): number => Math.round(200 * Math.log10(Math.max(x, 1e-6))) / 10; // 0.1 dB, floor -120\n\nconst TP_HALF = 12, TP_BLOCK = 32;\nconst TP_KERNELS = [0.25, 0.5, 0.75].map(p => Float64Array.from({ length: 2 * TP_HALF }, (_, j) => {\n const k = j - TP_HALF + 1, x = k - p, s = x === 0 ? 1 : Math.sin(Math.PI * x) / (Math.PI * x);\n return s * (0.5 + 0.5 * Math.cos(Math.PI * x / (TP_HALF + 1)));\n}));\n/** No interpolated value can exceed (the loudest sample around it) x this: where that cannot beat the peak so far, skip the sums. */\nconst TP_GAIN = Math.max(...TP_KERNELS.map(k => k.reduce((a, v) => a + Math.abs(v), 0)));\n\n/** 4x oversampled peak (windowed-sinc interpolation, 12 samples either side): catches peaks between samples. Equal to checking every phase of every sample, only faster. */\nfunction truePeak(chans: Float32Array[]): number {\n let peak = 0;\n for (const c of chans) {\n const n = c.length;\n const blocks = Math.ceil(n / TP_BLOCK), blockMax = new Float32Array(blocks + 2); // [b + 1] is block b; the ends stay 0\n for (let i = 0; i < n; i++) { const a = Math.abs(c[i]!), b = (i / TP_BLOCK | 0) + 1; if (a > blockMax[b]!) blockMax[b] = a; if (a > peak) peak = a; }\n const padded = new Float32Array(n + 2 * TP_HALF); // zeros around, so the sums need no bounds check\n padded.set(c, TP_HALF);\n for (let i = 0; i < n; i++) {\n const b = (i / TP_BLOCK | 0) + 1;\n const local = Math.max(blockMax[b - 1]!, blockMax[b]!, blockMax[b + 1]!); // the 24 samples around i lie in these three blocks\n if (local * TP_GAIN <= peak) continue;\n for (let pi = 0; pi < 3; pi++) {\n const k = TP_KERNELS[pi]!;\n let v = 0;\n for (let j = 0; j < 2 * TP_HALF; j++) v += padded[i + 1 + j]! * k[j]!;\n const a = Math.abs(v);\n if (a > peak) peak = a;\n }\n }\n }\n return peak;\n}\n\nexport function measureLoudness(channels: Float32Array[], sampleRate: number, opts: { truePeak?: boolean } = {}): LoudnessReport {\n let samplePeak = 0, clipped = 0;\n for (const c of channels) for (let i = 0; i < c.length; i++) { const a = Math.abs(c[i]!); if (a > samplePeak) samplePeak = a; if (a >= 1) clipped++; }\n const stages = kWeighting(sampleRate);\n const weighted = channels.map(c => filter(c, stages));\n const block = Math.round(0.4 * sampleRate), hop = Math.round(0.1 * sampleRate);\n const energies: number[] = [];\n for (let s = 0; s + block <= (weighted[0]?.length ?? 0); s += hop) {\n let sum = 0;\n for (const w of weighted) { let z = 0; for (let i = s; i < s + block; i++) z += w[i]! * w[i]!; sum += z / block; } // the weight is 1 for L, R and mono\n energies.push(sum);\n }\n const lufs = (e: number): number => -0.691 + 10 * Math.log10(e);\n const absolute = energies.filter(e => e > 0 && lufs(e) > -70);\n let integrated: number | null = null;\n if (absolute.length) {\n const relative = lufs(absolute.reduce((a, b) => a + b, 0) / absolute.length) - 10;\n const gated = absolute.filter(e => lufs(e) > relative);\n if (gated.length) integrated = Math.round(10 * lufs(gated.reduce((a, b) => a + b, 0) / gated.length)) / 10;\n }\n return { integratedLufs: integrated, truePeakDb: opts.truePeak === false ? null : toDb(truePeak(channels)), samplePeakDb: toDb(samplePeak), clippedSamples: clipped };\n}\n\n/** Runs of at least `minLength` seconds where every channel stays below `thresholdDb` (default -60 dBFS). */\nexport function findSilences(channels: Float32Array[], sampleRate: number, opts: { minLength?: number; thresholdDb?: number } = {}): Array<{ from: number; to: number }> {\n const min = Math.round((opts.minLength ?? 1) * sampleRate), limit = 10 ** ((opts.thresholdDb ?? -60) / 20);\n const n = channels[0]?.length ?? 0, out: Array<{ from: number; to: number }> = [];\n let start = -1;\n const quiet = (i: number): boolean => channels.every(c => Math.abs(c[i]!) < limit);\n for (let i = 0; i <= n; i++) {\n const q = i < n && quiet(i);\n if (q && start < 0) start = i;\n if (!q && start >= 0) { if (i - start >= min) out.push({ from: Math.round(start / sampleRate * 1000) / 1000, to: Math.round(i / sampleRate * 1000) / 1000 }); start = -1; }\n }\n return out;\n}\n","import type { AudioDescriptor } from '../types';\nimport type { MusicSummary } from '../audio/music/events';\nimport { playSpan, clockReach } from './audioRemap';\nimport type { MixStats } from './AudioMixer';\nimport { spectralCentroid } from './spectrum';\nimport { findSilences, LOUDNESS_NOTES, measureLoudness } from '../audio/loudness';\n\nexport interface AudioInspectOptions {\n /** Width of each loudness window in seconds. Default 0.1. */\n window?: number;\n /** The scenes to measure one by one (`movie.inspectAudio()` fills this from the movie's named top-level compositions). Default: the whole movie as one. */\n scenes?: Array<{ name: string; start: number; end: 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 /** For a `music` layer: its score read back (bars per track, what starts in each bar, the drum spans). */\n music?: MusicSummary;\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, clipping, a true peak above 0 dBTP, inaudible layers, sounds cut off by the end of the movie. Read this first. */\n issues: string[];\n /** The mix as a whole (ITU-R BS.1770 loudness; `integratedLufs` is null for a mix shorter than 0.4 s or with nothing above −70 LUFS). */\n loudness: { integratedLufs: number | null; truePeakDb: number; clippedSamples: number; silences: Array<{ from: number; to: number }> };\n /** The same measure for each scene (`silent`: nothing above −60 dBFS). */\n scenes: Array<{ name: string; from: number; to: number; lufs: number | null; peakDb: number; silent: boolean }>;\n /** When each sound starts: what a waveform marks. */\n cues: Array<{ t: number; name: string }>;\n /** Advice, not faults: a mix that is quiet or loud for web video, little headroom, silent stretches. */\n notes: 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 // A sound inside a remapped composition has `start` / `end` in that composition's local time: report when it plays in the MOVIE's time.\n const warped = new Map<AudioDescriptor, { localEnd: number; reach: number }>();\n sources = sources.map(s => {\n if (!s.warp) return s;\n const moved = { ...s, ...playSpan(s, movieDuration) };\n warped.set(moved, { localEnd: s.end, reach: clockReach(s, movieDuration) });\n return moved;\n });\n if (!mix) {\n return { duration: movieDuration, sampleRate: 0, peakDb: -120, peakAt: 0, sources: [], windows: [],\n loudness: { integratedLufs: null, truePeakDb: -120, clippedSamples: 0, silences: [] }, scenes: [], cues: [], notes: [], 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 scoreNotes: string[] = [];\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 const clock = warped.get(s);\n if (s.synth && s.start < movieDuration) {\n if (clock) {\n // inside a remapped composition: it is cut short when the composition's clock never gets to the end of the sound\n if (clock.reach < clock.localEnd - 1e-3) {\n issues.push(`${layer} (${source}) is cut off: its composition's clock only reaches ${clock.reach.toFixed(2)}s (the sound is ${clock.localEnd.toFixed(2)}s long), because the clock stops or the movie ends first — give the layer a shorter duration, or let the clock run on`);\n }\n } else if (s.end > movieDuration + 1e-6) {\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 }\n // A written score (`music`) much longer than what plays: said as a NOTE (a trial: 19.2 s of music under a 10 s film; the read-back showed it but nothing said it).\n // Not a fault: music that outlasts the movie ends with it (see Audio.ts). A tail under 2 s or 15 % over is only the reverb tail; a looping layer is meant to be cut.\n if (s.music && !s.loop && s.start < movieDuration && !clock) {\n const plays = Math.min(s.end, movieDuration) - s.start;\n const over = s.music.seconds - plays;\n if (over > 2 && over / s.music.seconds > 0.15) scoreNotes.push(`${layer} (${source}): the score is ${Math.round(s.music.seconds * 10) / 10}s long but only ${Math.round(plays * 100) / 100}s of it play, so it is cut off mid-phrase. Write fewer bars (or a faster tempo) so it ends with the movie`);\n }\n return { layer, source, start: s.start, end: s.end, peakDb, sound, ...(s.music ? { music: s.music } : {}) };\n });\n\n // the mix as a whole, scene by scene, and the advice\n const whole = measureLoudness(chans, sr);\n const silences = findSilences(chans, sr, { minLength: 1 });\n if (whole.clippedSamples > 0) issues.push(`${whole.clippedSamples} sample(s) of the mix are at full scale (clipped) — lower the volume of the layers that play loudest`);\n if (whole.truePeakDb! > 0) issues.push(`the mix's true peak is ${whole.truePeakDb} dBTP: it will distort when the video is encoded — lower the volume`);\n const notes: string[] = [...scoreNotes];\n if (whole.integratedLufs !== null) {\n if (whole.integratedLufs < LOUDNESS_NOTES.quietBelow) notes.push(`the mix is quiet for web video: ${whole.integratedLufs} LUFS (typical −14 to −16); raise the volume if that is not on purpose`);\n else if (whole.integratedLufs > LOUDNESS_NOTES.loudAbove) notes.push(`the mix is loud: ${whole.integratedLufs} LUFS (typical web video −14 to −16)`);\n }\n if (whole.truePeakDb! > LOUDNESS_NOTES.headroomDb && whole.truePeakDb! <= 0) notes.push(`the true peak is ${whole.truePeakDb} dBTP: little headroom left for encoding (keep it below ${LOUDNESS_NOTES.headroomDb} dBTP)`);\n for (const q of silences.slice(0, 3)) notes.push(`the mix is silent from ${q.from} s to ${q.to} s (${Math.round((q.to - q.from) * 10) / 10} s)`);\n if (silences.length > 3) notes.push(`and ${silences.length - 3} more silent stretch(es) (loudness.silences lists them all)`);\n const sceneList = (opts.scenes && opts.scenes.length ? opts.scenes : [{ name: 'movie', start: 0, end: movieDuration }]).map(sc => {\n const a = Math.max(0, Math.round(sc.start * sr)), b = Math.min(mix.length, Math.round(sc.end * sr));\n const part = chans.map(c => c.subarray(a, Math.max(a, b)));\n const m = measureLoudness(part, sr, { truePeak: false }); // the true peak is the slow part and is only wanted for the whole mix\n return { name: sc.name, from: sc.start, to: sc.end, lufs: m.integratedLufs, peakDb: m.samplePeakDb, silent: m.samplePeakDb < -60 };\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 loudness: { integratedLufs: whole.integratedLufs, truePeakDb: whole.truePeakDb ?? -120, clippedSamples: whole.clippedSamples, silences },\n scenes: sceneList,\n cues: list.map(s => ({ t: s.start, name: `${s.layer} (${s.source})` })),\n notes,\n };\n}\n","const GENERIC = new Set(['serif', 'sans-serif', 'monospace', 'cursive', 'fantasy', 'system-ui', 'ui-serif', 'ui-sans-serif', 'ui-monospace', 'ui-rounded', 'emoji', 'math', 'fangsong', '-apple-system', 'blinkmacsystemfont']);\n\n/** True when `family` is a real font here: a generic name, a loaded web font, or an installed one (it draws differently from its fallback). */\nexport function fontAvailable(family: string): boolean {\n const f = family.trim().replace(/^[\"']|[\"']$/g, '');\n if (!f || GENERIC.has(f.toLowerCase())) return true;\n const g = document.createElement('canvas').getContext('2d');\n if (!g) return true;\n const sample = 'mmmmmmmmmmlliWWWW 0123 あいう';\n const width = (stack: string): number => { g.font = `72px ${stack}`; return g.measureText(sample).width; };\n const q = JSON.stringify(f);\n return width(`${q}, monospace`) !== width('monospace') || width(`${q}, serif`) !== width('serif');\n}\n","import type { Sequence } from '../sequences/Base';\nimport { fontAvailable } from '../text/fonts';\n\nexport interface FontReport {\n /** Text layers none of whose fonts is available here: they are drawn in a fallback. */\n missing: Array<{ layer: string; family: string }>;\n /** Web fonts (`@font-face`) whose file could not be loaded and that a text layer uses. */\n failed: string[];\n /** Web fonts whose file could not be loaded but no text layer uses (an unused face: worth a look, not a fault). */\n failedUnused: string[];\n}\n\n/** Walks the layer tree (like `collectVideoSequences`): every text layer's `style.fontFamily`, and the state of the page's web fonts. */\nexport function inspectFonts(root: Sequence): FontReport {\n const failed = new Set<string>();\n if (typeof document !== 'undefined' && document.fonts) document.fonts.forEach((face) => { if (face.status === 'error') failed.add(face.family.replace(/^[\"']|[\"']$/g, '')); });\n const missing: FontReport['missing'] = [];\n const used = new Set<string>();\n const walk = (seq: Sequence, index: number): void => {\n const spec = seq.spec as { type?: string; name?: string; style?: { fontFamily?: unknown } };\n if (spec.type === 'text') {\n const raw = spec.style?.fontFamily;\n const family = Array.isArray(raw) ? raw.join(', ') : typeof raw === 'string' ? raw : '';\n const list = family.split(',').map((f) => f.trim()).filter(Boolean);\n for (const f of list) used.add(f.replace(/^[\"']|[\"']$/g, '').toLowerCase());\n // a layer whose web font failed to load is already explained by `failed`: not a second finding\n if (list.length && !list.some(fontAvailable) && !list.some((f) => failed.has(f.replace(/^[\"']|[\"']$/g, '')))) missing.push({ layer: spec.name ?? `text#${index}`, family });\n }\n if (seq.maskSequence) walk(seq.maskSequence, index);\n ((seq as Sequence & { _children?: Sequence[] })._children ?? []).forEach((child, i) => walk(child, i));\n };\n walk(root, 0);\n const all = [...failed];\n return { missing, failed: all.filter((f) => used.has(f.toLowerCase())), failedUnused: all.filter((f) => !used.has(f.toLowerCase())) };\n}\n","/**\n * A movie's scenes, for the tools that talk about \"per scene\" (the audio report, `check`): top-level COMPOSITIONS (a scene is a\n * composition; a film with sixty named text, shape and audio layers does not have sixty scenes) that have a name you\n * gave (not the automatic `text#3`, nor a run of similar layers the timeline folds into one row: `snow-# ×130`) and last at least one second. `ai/tools/check.mjs` has the same rule (`scenesOf`); a test keeps them equal.\n */\nexport function namedScenes<T extends { name: string; type: string; start: number; end: number; depth: number; local?: string }>(rows: T[]): Array<{ name: string; start: number; end: number }> {\n return rows.filter((r) => !r.local && r.depth === 0 && r.type === 'composition' && !/[#×]/.test(r.name) && r.end - r.start >= 1).map((r) => ({ name: r.name, start: r.start, end: r.end }));\n}\n","import type { Sequence } from '../sequences/Base';\n\n/** A filter that wants to know which moment is drawn (`grain`). */\nexport interface TimeFilter { setTime(t: number): void }\n\n/**\n * Every filter in the layer tree that has `setTime`, found once after the build (the movie feeds them before each draw).\n * Inside a time-remapped composition a filter is told the composition's local time, not the movie's.\n */\nexport function collectTimeFilters(seq: Sequence, out: TimeFilter[] = [], clock: (() => number) | null = null): TimeFilter[] {\n for (const f of seq.filters ?? []) {\n if (typeof (f as unknown as Partial<TimeFilter>).setTime === 'function') {\n const tf = f as unknown as TimeFilter;\n out.push(clock ? { setTime: () => tf.setTime(clock()) } : tf);\n }\n }\n if (seq.maskSequence) collectTimeFilters(seq.maskSequence, out, clock);\n const own = (seq as Sequence & { localClock?: () => (() => number) | null }).localClock?.() ?? clock;\n for (const child of (seq as Sequence & { _children?: Sequence[] })._children ?? []) collectTimeFilters(child, out, own);\n return out;\n}\n","import type { Movie } from './Movie';\nimport type { AudioReport } from './inspectAudio';\nimport type { FontReport } from './inspectFonts';\nimport { namedScenes } from './scenes';\n\n/** One kind of issue, with how many frames it was seen in. Issues that differ only by numbers are one kind. */\nexport interface IssueGroup { message: string; count: number; firstFrame: number; lastFrame: number }\n\nexport interface ReviewOptions {\n /** Moments to resolve and report: `3.5`, `50%`, `f120`, `title@end` (comma-separated). */\n at?: string;\n /** Every layout issue is a problem (by default text overlaps are only listed for review). */\n strict?: boolean;\n}\n\nexport interface ReviewReport {\n /** How many frames were inspected. */\n frames: number;\n /** Text cut off by an edge, outside the canvas, or with no size (with `strict`: every issue). */\n problems: IssueGroup[];\n /** Text overlaps and fonts that are not available: often intentional, look at them on the contact sheet. */\n review: IssueGroup[];\n fonts: FontReport;\n /** The sound as numbers (`movie.inspectAudio()`), or null for a movie with no audio. */\n audio: AudioReport | null;\n /** The moments of `at`, as frames with a label that is safe as a file name. */\n at: Array<{ label: string; frame: number }>;\n}\n\ninterface Row { name: string; start: number; end: number; depth?: number; parts?: Array<{ start: number; end: number }>; partNames?: string[]; /** in a remapped composition's LOCAL time (`stage ×0.5`) */ local?: string }\n\n/**\n * The frames movie.inspect looks at: the first and last frame, every scene's first and last frame (where a title is cut off or a\n * wipe leaves an overlap), and one every `step` seconds. At most `cap`: past that the even grid is widened, the scene edges stay.\n */\nexport function sampleFrames({ totalFrames, frameRate, scenes = [], step = 0.25, cap = 240 }: {\n totalFrames: number; frameRate: number; scenes?: Array<{ start: number; end: number }>; step?: number; cap?: number;\n}): number[] {\n const last = totalFrames;\n const clamp = (f: number): number => Math.max(0, Math.min(last, Math.round(f)));\n const edges = new Set<number>([0, last]);\n for (const s of scenes) { edges.add(clamp(s.start * frameRate)); edges.add(clamp(s.end * frameRate - 1)); }\n const room = Math.max(0, cap - edges.size);\n const seconds = totalFrames / frameRate;\n const wanted = Math.floor(seconds / step) + 1;\n const stride = wanted <= room ? step : seconds / Math.max(1, room);\n const frames = new Set(edges);\n for (let t = stride; frames.size < cap && t < seconds; t += stride) frames.add(clamp(t * frameRate));\n return [...frames].sort((a, b) => a - b);\n}\n\nconst AT_HELP = \"use seconds (3.5), a percentage (50%), a frame (f120) or a layer's start / mid / end (name@end)\";\n\n/** A list such as `3.5, 50%, f120, title@end` → frames, each with a label for a file name. A mistake says what could not be read. */\nexport function resolveAtList(list: string, ctx: { frameRate: number; totalFrames: number; duration: number; rows: Row[] }): Array<{ label: string; frame: number }> {\n const { frameRate: fps, totalFrames, duration, rows } = ctx;\n const out: Array<{ label: string; frame: number }> = [], used = new Set<string>();\n // layers by their own names: a family the timeline folds into one row (`pop-# ×4`) gives its members back\n const named = rows.filter((r) => !r.local).flatMap((r) => (r.parts && r.partNames ? r.partNames.map((name, i) => ({ name, start: r.parts![i]!.start, end: r.parts![i]!.end })) : [r]));\n for (const raw of String(list).split(',').map((s) => s.trim()).filter(Boolean)) {\n let frame: number, label: string, m: RegExpMatchArray | null;\n if ((m = raw.match(/^(.+)@(start|mid|end)$/))) {\n const row = named.find((r) => r.name === m![1]);\n const inside = row ? undefined : rows.find((r) => r.local && r.name === m![1]);\n if (inside) throw new Error(`--at \"${raw}\": layer \"${m[1]}\" is inside a time-remapped composition (${inside.local}), so its times are that composition's local seconds, not the movie's; name the composition (${inside.local!.replace(/ (×.*|time keyframes)$/, '')}@${m[2]}) or give seconds`);\n if (!row) throw new Error(`--at \"${raw}\": no layer named \"${m[1]}\" (names: ${named.slice(0, 40).map((r) => r.name).join(', ')}${named.length > 40 ? ', …' : ''})`);\n const t = m[2] === 'start' ? row.start : m[2] === 'mid' ? (row.start + row.end) / 2 : row.end - 1 / fps;\n frame = Math.round(t * fps); label = `${m[1]}-${m[2]}`;\n } else if ((m = raw.match(/^(\\d+(?:\\.\\d+)?)%$/))) { frame = Math.round(Number(m[1]) / 100 * totalFrames); label = `${m[1]}pct`; }\n else if ((m = raw.match(/^f(\\d+)$/i))) { frame = Number(m[1]); label = `f${m[1]}`; }\n else if (/^\\d+(\\.\\d+)?$/.test(raw)) { frame = Math.round(Number(raw) * fps); label = `${Number(raw).toFixed(2)}s`; }\n else throw new Error(`--at: cannot read \"${raw}\": ${AT_HELP}`);\n if (frame > totalFrames || frame < 0) throw new Error(`--at \"${raw}\" is past the end: the movie is ${duration} s (${totalFrames} frames)`);\n label = label.replace(/[\\\\/:*?\"<>|]+/g, '-'); // a layer called a/b must not make a folder\n let unique = label, n = 2;\n while (used.has(unique)) unique = `${label}-${n++}`;\n used.add(unique);\n out.push({ label: unique, frame });\n }\n return out;\n}\n\n/** [{ frame, issues[] }] → one group per kind of issue (numbers do not make a new kind), with count and first / last frame. */\nexport function groupIssues(perFrame: Array<{ frame: number; issues: string[] }>): IssueGroup[] {\n const groups = new Map<string, IssueGroup>();\n for (const { frame, issues } of perFrame) {\n for (const message of issues) {\n const key = message.replace(/-?\\d+(\\.\\d+)?/g, '#');\n const g = groups.get(key);\n if (g) { g.count++; g.lastFrame = frame; }\n else groups.set(key, { message, count: 1, firstFrame: frame, lastFrame: frame });\n }\n }\n return [...groups.values()];\n}\n\n/**\n * Layout issues → { problems, review }. Cut off by an edge, outside the canvas and \"no size\" are exact: problems. Text that\n * overlaps text is judged on layout boxes, not ink, so intentional designs trip it (ghost layers, a glow copy under a title,\n * per-letter boxes, a wipe between two scenes: 7 of 30 gallery pieces): those are `review` items to look at on the contact\n * sheet. `strict` makes every issue a problem.\n */\nexport function splitIssues(groups: IssueGroup[], strict = false): { problems: IssueGroup[]; review: IssueGroup[] } {\n if (strict) return { problems: groups, review: [] };\n const overlap = (g: IssueGroup): boolean => /\\boverlap\\b/.test(g.message);\n return { problems: groups.filter((g) => !overlap(g)), review: groups.filter(overlap) };\n}\n\n/** What `pixi-effects check` and the Playground tell about a movie that is ready. Warnings come from the page (`window.__logs`), the rest from here. */\nexport async function reviewMovie(movie: Movie, opts: ReviewOptions = {}): Promise<ReviewReport> {\n const rows = movie.timelineData().rows;\n const at = opts.at ? resolveAtList(opts.at, { frameRate: movie.frameRate, totalFrames: movie.totalFrames, duration: movie.duration, rows }) : [];\n const frames = sampleFrames({ totalFrames: movie.totalFrames, frameRate: movie.frameRate, scenes: namedScenes(rows) });\n const perFrame: Array<{ frame: number; issues: string[] }> = [];\n for (const frame of frames) {\n const r = await movie.inspect(frame, { layers: 'none' });\n if (r.issues.length) perFrame.push({ frame, issues: r.issues });\n }\n const grouped = splitIssues(groupIssues(perFrame), !!opts.strict);\n const fonts = movie.inspectFonts();\n for (const f of fonts.failedUnused) grouped.review.push({ message: `web font \"${f}\" failed to load, but no text layer uses it (a broken or unused @font-face)`, count: 1, firstFrame: 0, lastFrame: 0 });\n for (const m of fonts.missing) {\n (opts.strict ? grouped.problems : grouped.review).push({ message: `layer \"${m.layer}\": none of the fonts \"${m.family}\" is available here (it is drawn in a fallback font)`, count: 1, firstFrame: 0, lastFrame: 0 });\n }\n return { frames: frames.length, problems: grouped.problems, review: grouped.review, fonts, audio: movie.audioBuffer ? movie.inspectAudio() : null, at };\n}\n","/** The times an onion skin samples: `count` of them from `from` to `to`, both included. */\nexport function onionTimes(from: number, to: number, count: number): number[] {\n if (count <= 1) return [from];\n return Array.from({ length: count }, (_, i) => Math.round((from + ((to - from) * i) / (count - 1)) * 1e6) / 1e6);\n}\n\n/**\n * Alphas to draw `count` frames one over the other so that the result is the weighted mean of them (weights from `ramp` up to 1):\n * the picture that stays still stays itself, a moving thing leaves a trail that is strongest where it ends.\n */\nexport function onionAlphas(count: number, ramp = 0.25): number[] {\n const weights = Array.from({ length: count }, (_, i) => (count === 1 ? 1 : ramp + (1 - ramp) * (i / (count - 1))));\n let sum = 0;\n return weights.map((w) => { sum += w; return w / sum; });\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","/** Which frames an export covers, and the audio for them. Pure: the Renderer calls these. */\nexport interface RangeContext {\n frameRate: number;\n totalFrames: number;\n duration: number;\n /** The movie's timeline rows (`movie.timelineData().rows`): a range may name a top-level layer. */\n rows?: Array<{ name: string; start: number; end: number; depth: number; parts?: Array<{ start: number; end: number }>; partNames?: string[]; local?: string }>;\n}\nexport interface ResolvedRange { fromFrame: number; toFrame: number; fromSec: number; toSec: number; partial: boolean }\n\nexport function resolveRange(range: [number, number] | string | undefined, ctx: RangeContext): ResolvedRange {\n const { frameRate: fps, totalFrames, duration } = ctx;\n if (range === undefined) return { fromFrame: 0, toFrame: totalFrames, fromSec: 0, toSec: duration, partial: false };\n let from: number, to: number;\n if (typeof range === 'string') {\n // top-level layers by their own names (a family the timeline folds into one row, `pop-# ×4`, gives its members back)\n const rows = (ctx.rows ?? []).filter((r) => r.depth === 0 && !r.local).flatMap((r) => (r.parts && r.partNames ? r.partNames.map((name, i) => ({ name, start: r.parts![i]!.start, end: r.parts![i]!.end })) : [r]));\n const row = rows.find((r) => r.name === range);\n if (!row) throw new Error(`pixi-effects: render({ range: \"${range}\" }): no layer named \"${range}\" at the top level (names: ${rows.slice(0, 40).map((r) => r.name).join(', ') || 'none'}${rows.length > 40 ? ', …' : ''})`);\n from = row.start; to = row.end;\n } else {\n if (!Array.isArray(range) || range.length !== 2 || !range.every((n) => typeof n === 'number' && Number.isFinite(n))) {\n throw new Error('pixi-effects: render({ range }) must be [from, to] in seconds (numbers) or the name of a top-level layer');\n }\n [from, to] = range;\n }\n if (from < 0 || to <= from) throw new Error(`pixi-effects: render({ range: [${from}, ${to}] }): a range must start before it ends (from >= 0, from < to)`);\n if (to > duration + 0.5 / fps) throw new Error(`pixi-effects: render({ range: [${from}, ${to}] }) goes past the end: the movie is ${duration} s long`);\n const fromFrame = Math.round(from * fps);\n const toFrame = Math.min(Math.round(to * fps), totalFrames);\n if (toFrame <= fromFrame) throw new Error(`pixi-effects: render({ range: [${from}, ${to}] }) is shorter than one frame (${(1 / fps).toFixed(4)} s at ${fps} fps)`);\n const partial = fromFrame > 0 || toFrame < totalFrames;\n return { fromFrame, toFrame, fromSec: fromFrame / fps, toSec: toFrame / fps, partial };\n}\n\n/** The samples of `channels` between two times (silence past the end), with a short fade on an edge that was cut. */\nexport function sliceChannels(\n channels: Float32Array[], sampleRate: number, fromSec: number, toSec: number,\n opts: { fade?: number; fadeIn?: boolean; fadeOut?: boolean } = {},\n): Float32Array[] {\n const fade = Math.max(0, Math.round((opts.fade ?? 0.01) * sampleRate));\n const from = Math.round(fromSec * sampleRate), len = Math.max(1, Math.round(toSec * sampleRate) - from);\n return channels.map((src) => {\n const out = new Float32Array(len);\n for (let i = 0; i < len; i++) { const j = from + i; if (j >= 0 && j < src.length) out[i] = src[j]!; }\n const f = Math.min(fade, len >> 1);\n if (opts.fadeIn !== false) for (let i = 0; i < f; i++) out[i] = out[i]! * (i / f);\n if (opts.fadeOut !== false) for (let i = 0; i < f; i++) out[len - 1 - i] = out[len - 1 - i]! * (i / f);\n return out;\n });\n}\n\n/**\n * What `draft` stands for, and the checks on `scale`: a draft is half size, low quality and no motion blur (for looking, not for\n * delivering); anything the caller sets itself wins.\n */\nexport function resolveRenderOptions(o: { scale?: number; draft?: boolean; video?: { bitrate?: unknown }; motionBlur?: unknown }): { scale: number; bitrate: unknown; motionBlur: unknown } {\n const draft = !!o.draft;\n const scale = o.scale ?? (draft ? 0.5 : 1);\n if (!(typeof scale === 'number' && scale > 0 && scale <= 1)) throw new Error(`pixi-effects: render({ scale }): scale must be above 0 and at most 1 (got ${scale})`);\n return {\n scale,\n bitrate: o.video?.bitrate ?? (draft ? 'low' : undefined),\n motionBlur: o.motionBlur !== undefined ? o.motionBlur : (draft ? false : undefined),\n };\n}\n","/** Pure parts of the render options: a bitrate, which video codec to write, and the audio-only formats. */\n\nexport const QUALITY_NAMES = ['very-low', 'low', 'medium', 'high', 'very-high'] as const;\nexport type QualityName = (typeof QUALITY_NAMES)[number];\n\n/** A bitrate is a quality name or a number of bits a second (`8000000`, `'8M'`, `'800k'`). */\nexport function parseBitrate(v: unknown): { quality?: QualityName; bps?: number } {\n if (v === undefined || v === null) return {};\n if (typeof v === 'string' && (QUALITY_NAMES as readonly string[]).includes(v)) return { quality: v as QualityName };\n if (typeof v === 'number' && Number.isFinite(v) && v > 0) return { bps: Math.round(v) };\n const m = typeof v === 'string' ? /^\\s*(\\d+(?:\\.\\d+)?)\\s*([kKmM]?)\\s*$/.exec(v) : null;\n if (m) {\n const n = Number(m[1]) * ({ '': 1, k: 1e3, m: 1e6 } as Record<string, number>)[m[2]!.toLowerCase()]!;\n if (n > 0) return { bps: Math.round(n) };\n }\n throw new Error(`pixi-effects: bitrate ${JSON.stringify(v)}: use a quality (${QUALITY_NAMES.join(', ')}) or bits a second (8000000, '8M', '800k')`);\n}\n\nexport const AUDIO_FORMATS = ['wav', 'ogg'] as const;\nexport type AudioFormat = (typeof AUDIO_FORMATS)[number];\nexport const isAudioFormat = (f: unknown): f is AudioFormat => (AUDIO_FORMATS as readonly unknown[]).includes(f);\n\nexport type VideoFormat = 'mp4' | 'mov' | 'webm' | 'mkv';\n\n/** The video codecs each container is asked to hold, the usual one first. */\nexport const VIDEO_CODEC_PREFERENCE: Record<VideoFormat, readonly string[]> = {\n mp4: ['avc', 'hevc', 'vp9', 'av1'],\n mov: ['avc', 'hevc'],\n webm: ['vp9', 'av1', 'vp8'],\n mkv: ['vp9', 'avc', 'hevc', 'av1', 'vp8'],\n};\n\nconst CODEC_ALIASES: Record<string, string> = {\n h264: 'avc', 'h.264': 'avc', x264: 'avc', avc1: 'avc', h265: 'hevc', 'h.265': 'hevc', x265: 'hevc', hvc1: 'hevc', hev1: 'hevc',\n vp09: 'vp9', 'vp-9': 'vp9', av01: 'av1', vp80: 'vp8', 'vp-8': 'vp8',\n};\n\n/**\n * The video codec to write. The usual one for the container is used when this browser can encode it; when it cannot, the next that works (and\n * `fellBackFrom` says so). A codec the caller names is never swapped: it is used, or the error says which one would work.\n */\nexport async function chooseVideoCodec(a: {\n fmt: VideoFormat; requested?: string; canEncode: (codec: string) => Promise<boolean>; supported?: readonly string[];\n}): Promise<{ codec: string; fellBackFrom?: string }> {\n const held = a.supported ?? VIDEO_CODEC_PREFERENCE[a.fmt];\n const order = VIDEO_CODEC_PREFERENCE[a.fmt].filter(c => held.includes(c));\n const firstThatWorks = async (list: readonly string[]): Promise<string | null> => { for (const c of list) if (await a.canEncode(c)) return c; return null; };\n if (a.requested) {\n const alias = CODEC_ALIASES[a.requested.toLowerCase()];\n if (alias) throw new Error(`pixi-effects: render({ video: { codec: \"${a.requested}\" } }): \"${a.requested}\" is not a codec name here; did you mean \"${alias}\"?`);\n if (!order.includes(a.requested)) throw new Error(`pixi-effects: render(): \"${a.requested}\" cannot go in ${a.fmt} (${a.fmt} holds ${order.join(', ')})`);\n if (await a.canEncode(a.requested)) return { codec: a.requested };\n const alt = await firstThatWorks(order.filter(c => c !== a.requested));\n throw new Error(`pixi-effects: this browser cannot encode \"${a.requested}\" video for ${a.fmt}` +\n (alt ? `; \"${alt}\" would work: render({ format: '${a.fmt}', video: { codec: '${alt}' } }), or leave video.codec out and the best one is chosen.` : '; it can encode none of ' + order.join(', ') + '.'));\n }\n const chosen = await firstThatWorks(order);\n if (!chosen) throw new Error(`pixi-effects: this browser has no video encoder for ${a.fmt} (it tried ${order.join(', ')}): try another browser, or another format`);\n return chosen === order[0] ? { codec: chosen } : { codec: chosen, fellBackFrom: order[0]! };\n}\n","import {\n Output, Mp4OutputFormat, MovOutputFormat, WebMOutputFormat, MkvOutputFormat, WavOutputFormat, OggOutputFormat,\n BufferTarget, CanvasSource, AudioBufferSource, getFirstEncodableAudioCodec, canEncodeVideo,\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';\nimport type { MotionBlurSpec } from './motionBlur';\nimport { resolveRange, resolveRenderOptions, sliceChannels } from './renderRange';\nimport { parseBitrate, chooseVideoCodec, isAudioFormat, type AudioFormat } from './renderOptions';\nimport { warnUnknownOptions } from './options';\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 ogg: ['opus', 'vorbis', 'flac'],\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' | 'ogg', requested: string | undefined, container: unknown, audio: AudioBuffer, bitrate: Quality | number,\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\n/** A bitrate option (a quality name, bits a second, '8M') as what mediabunny takes. */\nfunction bitrateOf(v: unknown, fallback: Quality): Quality | number {\n const b = parseBitrate(v);\n return b.bps ?? (b.quality ? qualityMap[b.quality]! : fallback);\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\n/** The audio of `buffer` between two times as a new buffer (see `sliceChannels`). */\nfunction sliceAudio(buffer: AudioBuffer, fromSec: number, toSec: number, fadeIn: boolean, fadeOut: boolean): AudioBuffer {\n const channels = Array.from({ length: buffer.numberOfChannels }, (_, c) => buffer.getChannelData(c));\n const cut = sliceChannels(channels, buffer.sampleRate, fromSec, toSec, { fadeIn, fadeOut });\n const out = new AudioBuffer({ length: cut[0]!.length, numberOfChannels: cut.length, sampleRate: buffer.sampleRate });\n cut.forEach((data, c) => out.copyToChannel(data as Float32Array<ArrayBuffer>, c));\n return out;\n}\n\n/** The audio of the movie as a file of its own (`format: 'wav' | 'ogg'`): no picture is drawn. */\nasync function exportAudioOnly(movie: Movie, options: RenderOptions, fmt: AudioFormat, range: ReturnType<typeof resolveRange>): Promise<Blob> {\n if (!movie.audioBuffer) {\n throw new Error(`pixi-effects: render({ format: '${fmt}' }): this movie has no sound to export (add an audio layer, an sfx or a music score); for the picture use mp4, webm, mov or mkv`);\n }\n if (options.video) console.warn(`pixi-effects: render({ format: '${fmt}' }): video options are ignored, only the sound is written`);\n const audio = range.partial ? sliceAudio(movie.audioBuffer, range.fromSec, range.toSec, range.fromFrame > 0, range.toFrame < movie.totalFrames) : movie.audioBuffer;\n const container = fmt === 'wav' ? new WavOutputFormat() : new OggOutputFormat();\n let codec: string;\n if (fmt === 'wav') {\n codec = options.audio?.codec ?? 'pcm-s16';\n const held = (container as unknown as { getSupportedAudioCodecs(): string[] }).getSupportedAudioCodecs();\n if (!held.includes(codec)) throw new Error(`pixi-effects: render({ format: 'wav', audio: { codec: \"${codec}\" } }): wav holds ${held.join(', ')} (the usual is pcm-s16)`);\n } else {\n codec = await chooseAudioCodec('ogg', options.audio?.codec, container, audio, bitrateOf(options.audio?.bitrate, QUALITY_HIGH));\n }\n const output = new Output({ format: container, target: new BufferTarget() });\n const source = new AudioBufferSource({ codec: codec as never, ...(fmt === 'wav' ? {} : { bitrate: bitrateOf(options.audio?.bitrate, QUALITY_HIGH) }) });\n output.addAudioTrack(source);\n movie.emit('progress', { progress: 0, frame: range.fromFrame, totalFrames: movie.totalFrames });\n await output.start();\n await source.add(audio);\n await source.close();\n await output.finalize();\n movie.emit('progress', { progress: 100, frame: range.toFrame, totalFrames: movie.totalFrames });\n return new Blob([output.target.buffer as ArrayBuffer], { type: output.format.mimeType });\n}\n\nexport async function exportFrames(movie: Movie, options: RenderOptions = {}): Promise<Blob> {\n const fmt = options.format ?? 'mp4';\n const eff = resolveRenderOptions(options); // `draft` expanded, `scale` checked\n const range = resolveRange(options.range, { frameRate: movie.frameRate, totalFrames: movie.totalFrames, duration: movie.duration, rows: typeof options.range === 'string' ? movie.timelineData().rows : undefined });\n if (isAudioFormat(fmt)) return exportAudioOnly(movie, options, fmt, range);\n if (!['mp4', 'mov', 'webm', 'mkv'].includes(fmt)) throw new Error(`pixi-effects: render({ format: \"${String(fmt)}\" }): use mp4, mov, webm, mkv (a picture) or wav, ogg (only the sound)`);\n warnUnknownOptions('movie.render({ video })', options.video, ['codec', 'bitrate', 'hardware', 'keyFrameInterval']);\n warnUnknownOptions('movie.render({ audio })', options.audio, ['codec', 'bitrate']);\n const videoBitrate = bitrateOf(eff.bitrate ?? 'high', QUALITY_HIGH);\n const opts = {\n format: fmt,\n video: { codec: '' as string, bitrate: videoBitrate },\n audio: {\n codec: options.audio?.codec ?? (fmt === 'mp4' || fmt === 'mov' ? 'aac' : 'opus'),\n bitrate: bitrateOf(options.audio?.bitrate, QUALITY_HIGH),\n },\n };\n\n const container = makeOutputFormat(opts.format);\n // a range cuts the audio the same way (with a short fade on a cut edge, not on the movie's own start or end)\n const audio = movie.audioBuffer && range.partial ? sliceAudio(movie.audioBuffer, range.fromSec, range.toSec, range.fromFrame > 0, range.toFrame < movie.totalFrames) : movie.audioBuffer;\n if (audio) opts.audio.codec = await chooseAudioCodec(fmt, options.audio?.codec, container, audio, 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 = eff.motionBlur !== undefined ? resolveMotionBlur(eff.motionBlur as MotionBlurSpec, '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 // `scale` < 1: each frame is copied smaller into this canvas and that is what gets encoded (even sides: H.264 needs them)\n const small = eff.scale < 1\n ? Object.assign(document.createElement('canvas'), { width: Math.max(2, Math.round((stage.width * eff.scale) / 2) * 2), height: Math.max(2, Math.round((stage.height * eff.scale) / 2) * 2) })\n : null;\n const smallCtx = small?.getContext('2d') ?? null;\n const picture = small ?? blurCanvas ?? stage;\n const chosen = await chooseVideoCodec({\n fmt, requested: options.video?.codec,\n supported: (container as unknown as { getSupportedVideoCodecs(): string[] }).getSupportedVideoCodecs(),\n canEncode: c => canEncodeVideo(c as never, { width: picture.width, height: picture.height, bitrate: opts.video.bitrate as never }),\n });\n if (chosen.fellBackFrom) console.warn(`pixi-effects: this browser cannot encode ${chosen.fellBackFrom.toUpperCase()} video, so the ${fmt} carries ${chosen.codec.toUpperCase()} instead (name a codec with render({ video: { codec } }) to choose yourself).`);\n opts.video.codec = chosen.codec;\n const hardware = options.video?.hardware;\n if (hardware !== undefined && !['no-preference', 'prefer-hardware', 'prefer-software'].includes(hardware)) {\n throw new Error(`pixi-effects: render({ video: { hardware: \"${String(hardware)}\" } }): use 'prefer-hardware', 'prefer-software' or 'no-preference'`);\n }\n const canvasSource = new CanvasSource(picture, {\n codec: opts.video.codec as any,\n bitrate: opts.video.bitrate,\n ...(hardware ? { hardwareAcceleration: hardware } : {}),\n });\n output.addVideoTrack(canvasSource, { frameRate: movie.frameRate });\n\n if (audio) {\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 / audio.sampleRate : 0 });\n output.addAudioTrack(audioSource);\n await output.start();\n await audioSource.add(audio);\n await audioSource.close();\n } else {\n await output.start();\n }\n\n movie.app!.ticker.stop();\n // Force a keyframe every `keyFrameInterval` seconds, 2 by default (and at frame 0). Improves seek\n // responsiveness in players without inflating bitrate appreciably.\n const interval = options.video?.keyFrameInterval ?? 2;\n if (!(typeof interval === 'number' && Number.isFinite(interval) && interval > 0)) throw new Error(`pixi-effects: render({ video: { keyFrameInterval: ${String(interval)} } }): seconds between keyframes, above 0 (default 2)`);\n const keyframeIntervalFrames = Math.max(1, Math.round(interval * movie.frameRate));\n try {\n const count = Math.max(1, range.toFrame - range.fromFrame);\n for (let frame = range.fromFrame; frame <= range.toFrame; frame++) {\n if (mb && blurCanvas) await movie._exposeFrame(frame, mb, blurCanvas, false);\n else await movie.gotoFrame(frame, true);\n if (small && smallCtx) smallCtx.drawImage(blurCanvas ?? stage, 0, 0, small.width, small.height);\n const rel = frame - range.fromFrame;\n const isKey = rel === 0 || rel % keyframeIntervalFrames === 0;\n const addOpts = isKey ? { keyFrame: true } : undefined;\n await canvasSource.add(rel / movie.frameRate, 1 / movie.frameRate, addOpts);\n const progress = Math.floor((rel / count) * 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(range.toFrame, true); // the stage shows the last exported 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 highp vec4 uInputSize; // PIXI-bound: xy = sprite render texture size (with padding)\nuniform highp vec4 uInputClamp; // PIXI-bound: xy = min uv of unpadded content, zw = max uv\nuniform highp vec4 uOutputFrame; // PIXI-bound: xy = sprite top-left on output, zw = bbox size in px\nuniform highp 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","// A luma (\"gradient\") wipe: a brightness map covers the whole composition, and as progress goes 0 → 1 a threshold sweeps through the\n// map's brightness, dark parts first (After Effects' Gradient Wipe). The three built-in maps are computed in the shader from the\n// position on screen (no canvas, no texture, nothing to load); any other name is a grayscale image asset.\nimport { Assets, Filter, GlProgram, GpuProgram, Texture, UniformGroup, defaultFilterVert } from 'pixi.js';\nimport { suggestName } from '../core/options';\n\n/** The maps that need no image: left to right, corner to corner, and from the middle out to the corners (a circle on screen). */\nexport const LUMA_MAPS = ['linear', 'diagonal', 'radial'] as const;\n\nconst clamp01 = (x: number) => Math.min(1, Math.max(0, x));\n\n/**\n * The brightness of a built-in map at a point of the composition (`u`, `v` in 0..1, `aspect` = width / height): the same formulas as the\n * shader, so a test can say what the picture must be. 0 = changes first, 1 = changes last.\n */\nexport function builtInLuma(name: string, u: number, v: number, aspect: number): number {\n if (name === 'linear') return clamp01(u);\n if (name === 'diagonal') return clamp01((u + v) / 2);\n if (name === 'radial') return clamp01(Math.hypot((u - 0.5) * aspect, v - 0.5) / (0.5 * Math.hypot(aspect, 1)));\n return 0;\n}\n\nconst GL = `in vec2 vTextureCoord;\nuniform sampler2D uTexture;\nuniform sampler2D uMap;\nuniform highp vec4 uInputClamp;\nuniform highp vec4 uOutputFrame;\nuniform highp vec4 uGlobalFrame;\nuniform float uProgress;\nuniform float uSoftness;\nuniform float uInvert;\nuniform float uFlip;\nuniform float uMode;\nout vec4 finalColor;\nfloat lumaOf(vec2 cuv, float aspect) {\n if (uMode > 2.5) { vec2 p = (cuv - 0.5) * vec2(aspect, 1.0); return clamp(length(p) / (0.5 * length(vec2(aspect, 1.0))), 0.0, 1.0); }\n if (uMode > 1.5) return clamp((cuv.x + cuv.y) * 0.5, 0.0, 1.0);\n if (uMode > 0.5) return clamp(cuv.x, 0.0, 1.0);\n return dot(texture(uMap, cuv).rgb, vec3(0.2126, 0.7152, 0.0722));\n}\nvoid main(void) {\n vec4 raw = texture(uTexture, vTextureCoord);\n vec2 bboxUV = (vTextureCoord - uInputClamp.xy) / (uInputClamp.zw - uInputClamp.xy);\n vec2 cuv = (uOutputFrame.xy + bboxUV * uOutputFrame.zw) / uGlobalFrame.zw;\n float l = lumaOf(cuv, uGlobalFrame.z / uGlobalFrame.w);\n if (uFlip > 0.5) l = 1.0 - l;\n float s = max(uSoftness, 0.0001);\n float ep = uProgress * (1.0 + 2.0 * s) - s;\n float reveal = 1.0 - smoothstep(ep - s, ep + s, l);\n if (uInvert > 0.5) reveal = 1.0 - step(0.99, reveal);\n finalColor = raw * reveal;\n}`;\n\nconst WGSL = `\nstruct GlobalFilterUniforms {\n uInputSize:vec4<f32>, uInputPixel:vec4<f32>, uInputClamp:vec4<f32>, uOutputFrame:vec4<f32>, uGlobalFrame:vec4<f32>, uOutputTexture:vec4<f32>,\n};\nstruct LumaUniforms { uProgress:f32, uSoftness:f32, uInvert:f32, uFlip:f32, uMode:f32, };\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> lumaUniforms : LumaUniforms;\n@group(1) @binding(1) var uMap: texture_2d<f32>;\n@group(1) @binding(2) var uMapSampler : sampler;\nstruct VSOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n@vertex\nfn mainVertex(\n @location(0) aPosition : vec2<f32>,\n) -> VSOutput {\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 VSOutput(vec4<f32>(position, 0.0, 1.0), aPosition * (gfu.uOutputFrame.zw * gfu.uInputSize.zw));\n}\nfn lumaOf(cuv: vec2<f32>, aspect: f32) -> f32 {\n let mode = lumaUniforms.uMode;\n if (mode > 2.5) {\n let p = (cuv - vec2<f32>(0.5)) * vec2<f32>(aspect, 1.0);\n return clamp(length(p) / (0.5 * length(vec2<f32>(aspect, 1.0))), 0.0, 1.0);\n }\n if (mode > 1.5) { return clamp((cuv.x + cuv.y) * 0.5, 0.0, 1.0); }\n if (mode > 0.5) { return clamp(cuv.x, 0.0, 1.0); }\n let m = textureSampleLevel(uMap, uMapSampler, cuv, 0.0).rgb;\n return dot(m, vec3<f32>(0.2126, 0.7152, 0.0722));\n}\n@fragment\nfn mainFragment(@location(0) uv : vec2<f32>) -> @location(0) vec4<f32> {\n let raw = textureSample(uTexture, uSampler, uv);\n let bboxUV = (uv - gfu.uInputClamp.xy) / (gfu.uInputClamp.zw - gfu.uInputClamp.xy);\n let cuv = (gfu.uOutputFrame.xy + bboxUV * gfu.uOutputFrame.zw) / gfu.uGlobalFrame.zw;\n var l = lumaOf(cuv, gfu.uGlobalFrame.z / gfu.uGlobalFrame.w);\n if (lumaUniforms.uFlip > 0.5) { l = 1.0 - l; }\n let s = max(lumaUniforms.uSoftness, 0.0001);\n let ep = lumaUniforms.uProgress * (1.0 + 2.0 * s) - s;\n var reveal = 1.0 - smoothstep(ep - s, ep + s, l);\n if (lumaUniforms.uInvert > 0.5) { reveal = 1.0 - step(0.99, reveal); }\n return raw * reveal;\n}`;\n\nexport interface LumaWipeOptions { map: string; softness?: number; progress?: number; invert?: boolean; flip?: boolean }\n\nexport class LumaWipeFilter extends Filter {\n private readonly _mapName: string;\n private readonly _builtIn: boolean;\n private _resolved = false;\n private _warned = false;\n constructor({ map, softness = 0.1, progress = 0, invert = false, flip = false }: LumaWipeOptions) {\n const t = Texture.WHITE;\n const mode = (LUMA_MAPS as readonly string[]).indexOf(map) + 1; // 0 = a texture\n super({\n glProgram: GlProgram.from({ vertex: defaultFilterVert, fragment: GL, name: 'pe-luma-wipe' }),\n gpuProgram: GpuProgram.from({ vertex: { source: WGSL, entryPoint: 'mainVertex' }, fragment: { source: WGSL, entryPoint: 'mainFragment' } }),\n resources: {\n lumaUniforms: new UniformGroup({\n uProgress: { value: progress, type: 'f32' }, uSoftness: { value: softness, type: 'f32' },\n uInvert: { value: invert ? 1 : 0, type: 'f32' }, uFlip: { value: flip ? 1 : 0, type: 'f32' }, uMode: { value: mode, type: 'f32' },\n }),\n uMap: t.source,\n uMapSampler: t.source.style,\n },\n });\n this._mapName = map;\n this._builtIn = mode > 0;\n }\n get uProgress(): number { return this.resources.lumaUniforms.uniforms.uProgress as number; }\n set uProgress(v: number) { this.resources.lumaUniforms.uniforms.uProgress = v; }\n\n override apply(fm: any, input: any, output: any, clear: any): void {\n if (!this._builtIn && !this._resolved) {\n const t = Assets.get<Texture>(this._mapName) as Texture | undefined;\n if (t) { this.resources.uMap = t.source; this.resources.uMapSampler = t.source.style; this._resolved = true; }\n else if (!this._warned) {\n this._warned = true;\n const guess = suggestName(this._mapName, LUMA_MAPS);\n console.warn(`pixi-effects: luma transition map \"${this._mapName}\" is not a built-in map (${LUMA_MAPS.join(', ')}) and no image asset has that name${guess ? `; did you mean \"${guess}\"?` : ''}; the wipe follows a white map (everything changes at once)`);\n }\n }\n fm.applyFilter(this, input, output, clear);\n }\n}\n","import type {\n CompositionSpec, CompositionSequenceSpec, SequenceSpec, TransitionSpec,\n CrossfadeTransition, WipeTransition, IrisTransition, SlideTransition,\n DipTransition, ZoomTransition, DissolveTransition, LumaTransition,\n Keyframe, FilterSpec,\n} from '../types';\nimport { resolveAt } from './Timeline';\nimport { timeRemapOf, contentLength } from './remap';\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';\nimport { LumaWipeFilter } from '../filters/LumaWipe';\nimport { maskSourceOf } from './matte';\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 // The layers of a composition with its own time (speed / time) live in its LOCAL time, which runs over the content length\n // (speed 2 reads twice as far as `duration`): measure them, and resolve a negative `at`, against that.\n const remap = out.duration !== undefined ? timeRemapOf(out as never) : null;\n const parentDuration = remap ? contentLength(remap, out.duration!) : (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' || t.kind === 'luma') {\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 case 'luma':\n expandLuma(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 // A named matte (`mask: 'name'`, a reference, a list) points at a SIBLING of the layer; inside the wrapper there is none, so the\n // wrapper carries the matte and the layer keeps nothing to look up. An inline mask (a layer spec) is the layer's own and stays.\n const m = (inner as { mask?: unknown }).mask;\n const carriesMatte = m !== undefined && maskSourceOf(m as never).kind === 'refs';\n if (carriesMatte) delete (inner as { mask?: unknown }).mask;\n return {\n ...(carriesMatte ? { mask: m } : {}),\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/**\n * `{ kind: 'luma', map: 'linear' | 'diagonal' | 'radial' | <grayscale image asset>, softness?: 0.1, flip?: false }`: B appears through a\n * soft edge where the map is dark first; A holds until B has covered it (a hard cutoff, as wipe / iris / dissolve do).\n */\nfunction expandLuma(\n comp: CompositionSpec | CompositionSequenceSpec,\n t: LumaTransition,\n fromSeq: SequenceSpec, toSeq: SequenceSpec, transitionIndex: number,\n): void {\n const ease = t.ease ?? 'none';\n const inName = transitionFilterName(transitionIndex);\n const outName = `${transitionFilterName(transitionIndex)}-out`;\n const fullArea = { x: 0, y: 0, width: comp.width ?? 0, height: comp.height ?? 0 };\n const opts = { map: t.map ?? 'linear', softness: t.softness ?? 0.1, flip: t.flip ?? false };\n for (const [seq, name, invert] of [[toSeq, inName, false], [fromSeq, outName, true]] as const) {\n const filters = ensureFilters(seq);\n rejectReservedNameCollision(filters, seq.name);\n filters.push({ type: 'custom', name, filter: new LumaWipeFilter({ ...opts, invert }) });\n ensureKeyframes(seq).push({ at: t.at, to: { [`filters.${name}.uProgress`]: 1 }, duration: t.duration, ease });\n (seq as { filterArea?: typeof fullArea }).filterArea = fullArea;\n }\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 type { Keyframe } from '../types';\nimport { parseSpring, springDuration } from './spring';\nimport { transitionWindowsOf } from './Transitions';\nimport { maskSourceOf } from './matte';\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 /** Depth of field (threeD layers only): the blur radius in canvas pixels this frame, from the layer's depth and the camera's focus; 0 = sharp. */\n depthBlur?: number;\n /** Light (threeD layers that receive lights): how lit the layer is this frame, 0..1+ (the brightness of the light falling on its middle; 1 = as with no light, 0 = black). Left out when there is no light. */\n light?: number;\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/** What a keyframe can move on the canvas: a layer whose own or whose parent's geometry is animated crosses the edge on purpose (a ticker, a zoom-through, a fly-through). */\nconst GEOMETRY = new Set(['x', 'y', 'z', 'scale', 'scaleX', 'scaleY', 'rotation', 'rotationX', 'rotationY', 'skewX', 'skewY', 'positionX', 'positionY', 'pivotX', 'pivotY', 'anchorX', 'anchorY']);\ninterface Motion { running: boolean; ever: boolean }\nconst NO_MOTION: Motion = { running: false, ever: false };\nconst either = (a: Motion, b: Motion): Motion => ({ running: a.running || b.running, ever: a.ever || b.ever });\n\n/** The keys that put a layer on or off the canvas (an entrance, an exit, a fly-through): a layer waiting off the canvas for one of these tweens is not lost. */\nconst TRANSLATION = new Set(['x', 'y', 'z', 'positionX', 'positionY']);\n\n/**\n * Is a keyframe of this layer that animates `keys` running at `local` (seconds since the layer started), and does the layer ever have one? A tween runs from its `at` for its\n * `duration` (repeats included; a spring for the time it takes to settle); a `set` is instant, so it is no motion; a fade (alpha only) is no motion.\n * `ever`: a TRANSLATION tween exists at some time. A text that waits outside the canvas for its entrance, or slid out and stays parked there (an exit), is not called\n * \"entirely outside\"; a layer put off the canvas whose only motion is a scale pop is, and one that stops half cut off is reported.\n */\nfunction motionOf(keyframes: Keyframe[] | undefined, local: number, lives: number, keys: (k: string) => boolean = k => GEOMETRY.has(k)): Motion {\n let running = false, ever = false;\n for (const kf of keyframes ?? []) {\n const names = [kf.set, kf.to, kf.from].flatMap(bag => (bag ? Object.keys(bag) : []));\n if (!names.some(keys)) continue;\n let length = 0;\n if (typeof kf.duration === 'number') length = kf.duration;\n else if (kf.duration === 'auto') { const sp = parseSpring(kf.ease); length = sp ? Math.round(springDuration(sp) * 1000) / 1000 : 0.5; } // what the timeline does with 'auto'\n if (!(length > 0)) continue;\n const kat = kf.at ?? 0;\n const start = kat < 0 ? lives + kat : kat;\n const repeats = kf.repeat ?? 0;\n const end = start + length * (repeats + 1) + (kf.repeatDelay ?? 0) * repeats;\n if (names.some(k => TRANSLATION.has(k))) ever = true;\n if (local >= start - 1e-6 && local <= end + 1e-6) running = true;\n }\n return { running, ever };\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 // Layers with a geometry tween at some time: waiting outside the canvas for an entrance, or parked there after an exit, is on purpose.\n const hasMotion = new Set<LayerInfo>();\n\n const walk = (comp: CompositionSequence, prefix: string, insideThreeD: boolean, parentVisible: boolean, parentScene?: string, parentMotion: Motion = NO_MOTION, parentZero = false): void => {\n const blending = new Set<string>();\n const now = comp.childTime(time); // the time its children live in (local when it is remapped)\n // a camera with a tween running now carries every threeD layer of the composition with it (a pan is not \"cut off\"); one at rest, or one that only `set`s values, carries nothing\n const cameraMotion = (comp.spec.sequences ?? []).filter(q => q.type === 'camera').reduce((m: Motion, q) =>\n either(m, motionOf(q.keyframes, now - comp.childBase - (q.at ?? 0), q.duration ?? comp.duration ?? Infinity, () => true)), NO_MOTION);\n for (const w of transitionWindowsOf(comp.spec)) {\n const start = comp.childBase + w.start, end = comp.childBase + w.end;\n if (now >= start - 1e-9 && now <= end + 1e-9) { blending.add(w.from); blending.add(w.to); }\n }\n comp.layers().forEach(({ seq, display, threeD, carriers, depthBlur, light }, 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 // Moving: a geometry keyframe of its own, of a null parent, of the composition that holds it, or a moving camera for a threeD layer, is running at this frame.\n // An x in `initial` plus a fade is a still layer, and a cut-off one must be reported.\n const localOf = (q: Sequence): number => now - comp.childBase - q.at;\n let motion = either(parentMotion, motionOf(seq.spec.keyframes, localOf(seq), seq.duration ?? Infinity));\n for (const c of carriers) motion = either(motion, motionOf(c.spec.keyframes, localOf(c), c.duration ?? Infinity));\n if (threeD) motion = either(motion, cameraMotion);\n const moving = motion.running;\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 if (threeD) info.depthBlur = Number(depthBlur.toFixed(2));\n if (threeD && light !== undefined) info.light = Number(light.toFixed(2));\n layers.push(info);\n if (motion.ever) hasMotion.add(info);\n let shown = bounds ? clip(bounds, view) : null;\n const maskTarget = seq.maskSequence?.target as Container | null | undefined;\n const maskSrc = maskSourceOf((seq.spec as { mask?: unknown }).mask);\n if (shown && maskTarget && !(maskSrc.kind === 'inline' && maskSrc.invert)) {\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, motion, 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 if (hasMotion.has(l)) continue; // waiting for an entrance, or parked after an exit\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 { spansMeta } from '../text/spans';\nimport { 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 /** With `parts`: the name of each layer the row stands for, in the same order (so `render({ range: 'pop-3' })` can find it). */\n partNames?: string[];\n /** A short text for the tooltip (a text layer's words, an asset name). */\n detail?: string;\n /**\n * Set on every row inside a time-remapped composition: where its time comes from (`stage ×0.5`, `stage time keyframes`). Such rows\n * are in that composition's LOCAL seconds (start, end, keys), not the movie's.\n */\n local?: string;\n}\nexport interface TimelineTransition { from: string; to: string; start: number; end: number; /** as `TimelineRow.local`: the window is in local seconds */ local?: string }\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 const spans = spansMeta.get(seq.spec as object)?.preview; // a text with spans is a group: say what it spells\n if (spans) return spans.length > 60 ? spans.slice(0, 57) + '…' : spans;\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[], local?: string): 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), ...(local ? { local } : {}) };\n const inner: TimelineRow[] = [];\n const isComp = seq instanceof CompositionSequence;\n if (isComp) {\n // A remapped composition's children are in its LOCAL time: from 0, up to its content length.\n const label = seq.remapLabel();\n walk(seq, label ? 0 : start, label ? seq.contentSpan : end, depth + 1, prefix + name + '/', inner, transitions, label ? `${name} ${label}` : local);\n }\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), ...(local ? { local } : {}) });\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 partNames: members.map(x => x.name),\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 const label = root.remapLabel(); // the root composition can be the remapped one: everything under it is local\n walk(root, 0, label ? root.contentSpan : duration, 0, '', rows, transitions, label ? `movie ${label}` : undefined);\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', light: '#b0b0b0', null: '#b0b0b0',\n};\nconst esc = (s: string): string => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\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${t.local ? `, local time of ${esc(t.local)}` : ''})</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}` : ''}${r.local ? ` · local time of ${r.local}` : ''}`;\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 // The legend wraps onto more lines when the chart is narrow (a narrow window must not cut it off at the right edge).\n const LEGEND_STEP = 108, perLine = Math.max(1, Math.floor((W - PAD * 2) / LEGEND_STEP));\n const kinds = Object.entries(COLORS), lines = Math.ceil(kinds.length / perLine), HH = H + 14 + lines * 18;\n const legend = kinds.map(([type, c], i) => `<g transform=\"translate(${PAD + (i % perLine) * LEGEND_STEP},${H + 10 + Math.floor(i / perLine) * 18})\"><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=\"${HH}\" viewBox=\"0 0 ${W} ${HH}\" 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","import { EXPRESSION_NAMES } from '../expr/Parser';\nimport { suggestName } from './options';\n\n/** A variable holds a number (read as an identifier in an expression) or a string (read as `{name}` in any string of the spec). */\nexport type VarValue = number | string;\nexport type Vars = Record<string, VarValue>;\n\n/** Names a variable cannot have: what an expression already means (scope words, functions, PI) and `value` (the counter placeholder `{value}`). */\nexport const RESERVED_NAMES: readonly string[] = ['w', 'h', 'W', 'H', 'GW', 'GH', 't', 'd', 'T', 'contain', 'cover', 'value', ...EXPRESSION_NAMES];\n\nconst NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst isPlain = (v: unknown): v is Record<string, unknown> => !!v && typeof v === 'object' && (Object.getPrototypeOf(v) === Object.prototype || Object.getPrototypeOf(v) === null);\n\n/** What an author declared (`vars` in `movie.init`, or a `setVars` call), checked: a name that is refused or a value of the wrong kind is said and left out. */\nexport function normalizeVars(raw: unknown, where: string, warn: (message: string) => void = m => console.warn(m)): Vars {\n if (raw === undefined) return {};\n if (!isPlain(raw)) { warn(`pixi-effects: ${where}: vars must be an object of names and values ({ title: 'NORD', shift: 40 }); ignored`); return {}; }\n const out: Vars = {};\n for (const [name, value] of Object.entries(raw)) {\n if (!NAME.test(name)) { warn(`pixi-effects: ${where}: \"${name}\" is not a name for a variable (letters, digits and _, not starting with a digit); ignored`); continue; }\n if (RESERVED_NAMES.includes(name)) { warn(`pixi-effects: ${where}: \"${name}\" is reserved (an expression word, a function, PI or the {value} counter); choose another name; ignored`); continue; }\n if (typeof value === 'boolean') { warn(`pixi-effects: ${where}: variable \"${name}\" is a boolean; write 0 or 1 (a variable is a number or a string); ignored`); continue; }\n if (typeof value === 'number' && Number.isFinite(value)) out[name] = value;\n else if (typeof value === 'string') out[name] = value;\n else warn(`pixi-effects: ${where}: variable \"${name}\" must be a number or a string, got ${JSON.stringify(value)}; ignored`);\n }\n return out;\n}\n\n/** The numbers among the variables: what the expression scope gets. */\nexport function numericVars(vars: Vars): Record<string, number> {\n const out: Record<string, number> = {};\n for (const [k, v] of Object.entries(vars)) if (typeof v === 'number') out[k] = v;\n return out;\n}\n\nconst TOKEN = /\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g;\n\nfunction substitute(s: string, vars: Vars): string {\n return s.replace(TOKEN, (whole, name: string) => (Object.prototype.hasOwnProperty.call(vars, name) ? String(vars[name]) : whole));\n}\n\n/**\n * The spec with every `{name}` of a declared variable replaced by its value, in any string anywhere (text, colours, asset names, nested layers).\n * A new object: the input is never changed, and what is not plain data (a filter object, a function, a buffer) is kept as it is. A name that was\n * not declared stays as written (`{value}` is the counter). With nothing declared the same spec comes back.\n */\nexport function applyVars<T>(spec: T, vars: Vars): T {\n if (Object.keys(vars).length === 0) return spec;\n const walk = (v: unknown): unknown => {\n if (typeof v === 'string') return substitute(v, vars);\n if (Array.isArray(v)) return v.map(walk);\n if (isPlain(v)) { const o: Record<string, unknown> = {}; for (const [k, x] of Object.entries(v)) o[k] = walk(x); return o; }\n return v;\n };\n return walk(spec) as T;\n}\n\nconst escapeRe = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n/**\n * What the composition says about its variables, as sentences: a declared variable nothing reads (a `{name}` in a string, or the name as a word in\n * an expression), and a `{name}` that was not declared (with the declared name it looks like). Each problem once. The spec is the one given to\n * `movie.init`, before any `{name}` is replaced.\n */\nexport function lintVars(spec: unknown, vars: Vars): string[] {\n const declared = Object.keys(vars);\n const strings: string[] = [];\n const walk = (v: unknown): void => {\n if (typeof v === 'string') strings.push(v);\n else if (Array.isArray(v)) v.forEach(walk);\n else if (isPlain(v)) Object.values(v).forEach(walk);\n };\n walk(spec);\n\n const out: string[] = [];\n for (const name of declared) {\n const word = new RegExp(`(?<![A-Za-z0-9_.])${escapeRe(name)}(?![A-Za-z0-9_])`);\n if (!strings.some(s => word.test(s))) out.push(`pixi-effects: vars: variable \"${name}\" is declared but nothing uses it (write {${name}} in a string, or \"${name}\" in an expression); a typo on one side?`);\n }\n\n const seen = new Set<string>();\n for (const s of strings) {\n for (const m of s.matchAll(TOKEN)) {\n const name = m[1];\n if (seen.has(name) || Object.prototype.hasOwnProperty.call(vars, name) || RESERVED_NAMES.includes(name) || declared.length === 0) continue;\n seen.add(name);\n const guess = suggestName(name, declared);\n out.push(`pixi-effects: vars: {${name}} is not a declared variable${guess ? ` — did you mean \"${guess}\"?` : ` (declared: ${declared.join(', ')})`}`);\n }\n }\n return out;\n}\n","import type { AudioDescriptor } from '../types';\n\nconst ids = new WeakMap<object, number>();\nlet nextId = 1;\nconst idOf = (o: object): number => { let n = ids.get(o); if (!n) { n = nextId++; ids.set(o, n); } return n; };\n\n/**\n * A string that is the same for two sets of sounds exactly when they mix to the same samples, or null when that cannot be told (a time remap is a\n * function; a sound with neither a buffer nor a synth key): then the sound is mixed again, never reused by guess. What only names a layer is left out.\n */\nexport function mixKey(audios: readonly AudioDescriptor[], duration: number, sampleRate: number): string | null {\n const parts: unknown[] = [];\n for (const a of audios) {\n if (a.warp || a.sourceMap) return null;\n const what = a.buffer ? `b${idOf(a.buffer)}` : a.synth ? `s${a.synth.key}` : null;\n if (what === null) return null;\n parts.push([what, a.loop, a.start, a.end, a.initialVolume, a.volumeKeyframes.map(k => [k.time, k.value])]);\n }\n return JSON.stringify([duration, sampleRate, parts]);\n}\n\n/** The last mix and what was made with it (the loudness statistics), for the next `rebuild` of the same sounds. */\nexport class MixCache<Extra = unknown> {\n private key: string | null = null;\n private buffer: AudioBuffer | null = null;\n private extra: Extra | undefined;\n\n get(key: string | null): { buffer: AudioBuffer; extra: Extra } | null {\n if (key === null || key !== this.key || !this.buffer) return null;\n return { buffer: this.buffer, extra: this.extra as Extra };\n }\n\n /** Keep this mix for `key`; a null key (not comparable) keeps nothing. */\n set(key: string | null, buffer: AudioBuffer | null, extra?: Extra): void {\n this.key = key; this.buffer = key === null ? null : buffer; this.extra = extra;\n }\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\n/** True when the movie has sound and the browser has not let its context run yet (a player can then ask for a tap: the sound starts on the next one). */\nexport function audioIsBlocked(ctx: { state: string } | null, hasAudio: boolean): boolean {\n return !!ctx && hasAudio && ctx.state !== 'running';\n}\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","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 * How far `movie.init()` is: one number from 0 to 1 for a movie that takes seconds to build, the stage it is in and how many of that stage are done.\n * The stages run in a fixed order and carry a share of the whole (the shares come from timings of the reel and the gallery); a stage that is never\n * begun (no assets, no sound) counts as done when a later one starts, and the number never goes down.\n */\nexport type LoadStage = 'assets' | 'build' | 'sound' | 'frames';\n\nexport interface LoadProgressState {\n stage: LoadStage;\n /** Items of this stage that are done, and how many there are (layers, assets, sounds). */\n loaded: number;\n total: number;\n /** The whole init, 0 to 1. */\n progress: number;\n}\n\nexport const STAGE_LABEL: Record<LoadStage, string> = {\n assets: 'LOADING ASSETS',\n build: 'BUILDING LAYERS',\n sound: 'MIXING SOUND',\n frames: 'PREPARING',\n};\n\nconst ORDER: LoadStage[] = ['assets', 'build', 'sound', 'frames'];\nconst WEIGHT: Record<LoadStage, number> = { assets: 0.15, build: 0.6, sound: 0.2, frames: 0.05 };\nconst YIELD_EVERY_MS = 50;\n\nexport interface LoadProgressOptions {\n now?: () => number;\n /** What to await so the page can paint (default: one macrotask). */\n yielder?: () => Promise<void>;\n yieldEveryMs?: number;\n /** True while the page is in a hidden tab (a timer there waits about a second per yield, so none is made). */\n hidden?: () => boolean;\n}\n\n/** One macrotask, through a MessageChannel when there is one: it is not slowed like setTimeout in a tab the viewer is not looking at. */\nfunction defaultYielder(): Promise<void> {\n if (typeof MessageChannel === 'undefined') return new Promise<void>(resolve => setTimeout(resolve, 0));\n return new Promise<void>(resolve => {\n const ch = new MessageChannel();\n ch.port1.onmessage = () => { ch.port1.close(); resolve(); };\n ch.port2.postMessage(0);\n });\n}\n\nexport class LoadProgress {\n private _stage: LoadStage | null = null;\n private _loaded = 0;\n private _part = 0;\n private _total = 0;\n private _high = 0;\n private _started = 0;\n private readonly _ms: Record<LoadStage, number> = { assets: 0, build: 0, sound: 0, frames: 0 };\n private _lastYield: number;\n private readonly _now: () => number;\n private readonly _yielder: () => Promise<void>;\n private readonly _every: number;\n private readonly _hidden: () => boolean;\n\n constructor(private readonly _onChange: (state: LoadProgressState) => void, opts: LoadProgressOptions = {}) {\n this._now = opts.now ?? (() => (typeof performance !== 'undefined' ? performance.now() : Date.now()));\n this._yielder = opts.yielder ?? defaultYielder;\n this._hidden = opts.hidden ?? (() => typeof document !== 'undefined' && document.hidden === true);\n this._every = opts.yieldEveryMs ?? YIELD_EVERY_MS;\n this._lastYield = this._now();\n }\n\n get progress(): number { return this._high; }\n\n /** Start a stage with `total` items (0 = nothing to wait for). Every earlier stage is done. */\n begin(stage: LoadStage, total: number): void {\n this._closeTiming();\n this._stage = stage;\n this._loaded = 0;\n this._part = 0;\n this._total = Math.max(0, total);\n this._started = this._now();\n this._emit();\n }\n\n tick(n = 1): void {\n if (!this._stage) return;\n this._loaded = Math.min(this._total, this._loaded + n);\n this._part = 0;\n this._emit();\n }\n\n /** How much of the item being worked on is done (0..1), for an item that takes long: the number moves between two `tick`s. */\n part(done: number): void {\n if (!this._stage) return;\n this._part = Math.min(1, Math.max(0, done));\n this._emit();\n }\n\n /** Everything is done: 1, whatever stage it was in. */\n finish(): void {\n this._closeTiming();\n this._stage = this._stage ?? 'frames';\n this._loaded = this._total;\n this._high = 1;\n this._onChange({ stage: this._stage, loaded: this._loaded, total: this._total, progress: 1 });\n }\n\n /** Milliseconds each stage took (a stage never begun is 0). */\n timings(): Record<LoadStage, number> { return { ...this._ms }; }\n\n /** Await one macrotask when 50 ms of work have gone by since the last time, so the page can paint the bar. Cheap when it is not due. */\n async yieldIfDue(): Promise<void> {\n const t = this._now();\n if (t - this._lastYield < this._every || this._hidden()) return;\n await this._yielder();\n this._lastYield = this._now();\n }\n\n private _closeTiming(): void {\n if (this._stage) this._ms[this._stage] += Math.max(0, this._now() - this._started);\n }\n\n private _emit(): void {\n const stage = this._stage!;\n let done = 0;\n for (const s of ORDER) { if (s === stage) break; done += WEIGHT[s]; }\n const within = this._total > 0 ? Math.min(1, (this._loaded + this._part) / this._total) : 1;\n this._high = Math.min(1, Math.max(this._high, done + WEIGHT[stage] * within));\n this._onChange({ stage, loaded: this._loaded, total: this._total, progress: this._high });\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 */\nimport { STAGE_LABEL, type LoadProgressState } from './loadProgress';\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', e => { if (e.target === loader && (e as TransitionEvent).propertyName === 'opacity') remove(); }); // not the bar's own transform transition\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 for (const a of ['data-stage', 'data-percent']) loader.removeAttribute(a); // the error label, not \"BUILDING LAYERS 42%\"\n loader.querySelector('.pe-loader__bar')?.remove();\n if (loader.hasAttribute('data-label')) loader.setAttribute('data-label', message);\n loader.setAttribute('aria-busy', 'false');\n}\n\n/** How far init is: the share as `--pe-progress` (0 to 1, the bar scales by it), the stage and the percent as attributes (the label shows them). */\nexport function setLoaderProgress(loader: HTMLElement | null, state: LoadProgressState): void {\n if (!loader || loader.getAttribute('data-state') === 'error' || loader.classList.contains('pe-loader--done')) return;\n if (!loader.querySelector('.pe-loader__bar')) {\n const bar = loader.ownerDocument.createElement('i');\n bar.className = 'pe-loader__bar';\n bar.setAttribute('aria-hidden', 'true');\n loader.appendChild(bar);\n }\n loader.style.setProperty('--pe-progress', String(Math.round(state.progress * 1000) / 1000));\n loader.setAttribute('data-stage', STAGE_LABEL[state.stage]);\n loader.setAttribute('data-percent', String(Math.round(state.progress * 100)));\n}\n","import { usesAdvancedBlend, enableAdvancedBlend } from './blend';\nimport { Application, Container, Culler, Rectangle, extensions, CullerPlugin } from 'pixi.js';\nimport { createTimeline, lengthen, type Timeline } from './timelineEngine';\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 { inspectFonts, type FontReport } from './inspectFonts';\nimport { namedScenes } from './scenes';\nimport { collectTimeFilters, type TimeFilter } from './timeFilters';\nimport { resolveAtList, reviewMovie, type ReviewOptions, type ReviewReport } from './review';\nimport { onionAlphas, onionTimes } from './onion';\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, suggestName } from './options';\nimport { normalizeVars, applyVars, numericVars, lintVars, type Vars } from './vars';\nimport { mixKey, MixCache } from './mixCache';\nimport { startWhenRunning, audioIsBlocked } from './startWhenRunning';\nimport { normalizePoster } from './poster';\nimport { normalizeStops, type Stop } from './stops';\nimport { maskSourceOf } from './matte';\nimport { resolveLoader, dismissLoader, failLoader, setLoaderProgress, type LoaderOption } from './loader';\nimport { LoadProgress, type LoadProgressState, type LoadStage } from './loadProgress';\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\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 * Named variables: numbers an expression reads as identifiers (`x: 'W/2 + shift'`) and strings that `{name}` stands for anywhere in the\n * composition (`text: '{title}'`, `fillColor: '{accent}'`). Change them later with `movie.setVars()`, which rebuilds the movie at the same time.\n * A name an expression already means (`W`, `t`, `sin`, `PI`, `value` …) is refused.\n */\n vars?: Vars;\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 /** Start with `movie.loop` on: playing goes back to the start at the end instead of stopping. Default false (like a `<video>`). */\n loop?: boolean;\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 /** `mp4`, `mov`, `webm`, `mkv`: the picture with its sound. `wav`, `ogg`: only the sound of the movie (an error when it has none). */\n format?: 'mp4' | 'mov' | 'webm' | 'mkv' | 'wav' | 'ogg';\n video?: {\n /** `'avc'` (H.264), `'hevc'`, `'vp9'`, `'av1'`, `'vp8'`: default the usual one for the format, the next that works if this browser cannot encode it; a name you give is never swapped. */\n codec?: string;\n /** A quality name, or bits a second: `8_000_000` or `'8M'`, `'800k'`. */\n bitrate?: 'very-low' | 'low' | 'medium' | 'high' | 'very-high' | number | string;\n /** Where to encode: `'prefer-hardware'`, `'prefer-software'` or `'no-preference'` (default). */\n hardware?: 'no-preference' | 'prefer-hardware' | 'prefer-software';\n /** Seconds between keyframes (default 2): shorter seeks faster and makes a bigger file. */\n keyFrameInterval?: number;\n };\n audio?: { codec?: string; bitrate?: 'very-low' | 'low' | 'medium' | 'high' | 'very-high' | number | string };\n /**\n * Only part of the movie: `[from, to]` in seconds, or the name of a top-level layer (its start to its end). The file starts at 0\n * and its sound is cut the same way (with a 10 ms fade on a cut edge). Past the end, backwards or an unknown name is an error.\n */\n range?: [number, number] | string;\n /** Output size relative to the canvas, above 0 and at most 1. Each frame is drawn at full size and copied smaller before it is encoded: the file and the encoding get smaller, the drawing is not faster. */\n scale?: number;\n /** For looking, not for delivering: `scale: 0.5`, `video.bitrate: 'low'` and no motion blur. Anything you set yourself wins. */\n draft?: boolean;\n}\n\nexport interface ThumbnailOptions {\n /** Width of the picture in px (default 160); the height follows the movie's shape. */\n width?: number;\n /** Instead of `width`: the size relative to the canvas (0 to 4). */\n scale?: number;\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 /** JPEG quality, 0 to 1 (the encoder's default when left out). */\n quality?: number;\n /** Return a `data:` URL string instead of a Blob (handy for scripts that can only return text), or `'imageData'`: the pixels as an `ImageData` (to measure, compare). */\n as?: 'blob' | 'dataURL' | 'imageData';\n}\n\n/** What `movie.rebuild()` may change: the composition itself, variables (a partial set), the size of the movie. */\nexport interface RebuildOptions {\n composition?: CompositionSpec;\n vars?: Vars;\n width?: number;\n height?: number;\n}\nexport type RebuildReason = 'vars' | 'resize' | 'rebuild';\n/** What a rebuild did: how long it took, whether the sound was mixed again (`'mixed'`), reused from the last mix (`'reused'`) or there is none, and where the playhead was put back. */\nexport interface RebuildReport {\n reason: RebuildReason;\n ms: number;\n audio: 'reused' | 'mixed' | 'none';\n frame: number;\n playing: boolean;\n /** True when nothing changed (`setVars` with the values it already has): nothing was rebuilt. */\n unchanged?: boolean;\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 OnionSkinOptions {\n /** Where the movement starts, in seconds. Default 0. */\n from?: number;\n /** Where it ends, in seconds. Default: the end of the movie. */\n to?: number;\n /** How many frames are overlaid, 1–64, spread evenly from `from` to `to`. Default 8. */\n count?: number;\n /** Output size relative to the canvas, above 0 and at most 4. Default 1. */\n scale?: number;\n /** Motion blur for these pictures (see `MovieOptions.motionBlur`); overrides the movie's own setting, `false` turns it off. */\n motionBlur?: MotionBlurSpec;\n as?: 'blob' | 'dataURL';\n}\n\nexport interface FrameEvent { frame: number; totalFrames: number }\nexport interface ProgressEvent { progress: number; frame: number; totalFrames: number }\n/** `volumechange`: the values after the change. */\nexport interface VolumeEvent { volume: number; muted: boolean }\n/** `loopchange`: the value of `movie.loop` after the change. */\nexport interface LoopEvent { loop: 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' | 'rebuild'; 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: Timeline | null = null;\n audioBuffer: AudioBuffer | null = null;\n /** @internal */\n audioSource: AudioBufferSourceNode | null = null;\n /** @internal */\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: named times for a presentation to pause on (`pixi-effects/present`). Empty for an ordinary movie. */\n stops: Stop[] = [];\n /** The frame `playUntil()` is playing toward, or null (also null while it plays to the end). */\n private _until: number | null = null;\n private _untilWaiters: Array<(landed: boolean) => void> = [];\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 private _loop = 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 /** The filters that take the time of the frame they draw (`grain`), collected once after the build. */\n private _timeFilters: TimeFilter[] = [];\n /** While a motion-blurred frame is exposed: the frame's own time, so all its sub-frames share one grain frame (and not the playhead's). */\n private _nominalTime: number | null = null;\n private _feedTimeFilters(): void {\n if (!this._timeFilters.length) return;\n const t = this._nominalTime ?? this._timeOf(this.currentFrame);\n for (const f of this._timeFilters) f.setTime(t);\n }\n private _rootContainer: Container | null = null;\n private _raf: number | null = null;\n /** The variables now, and the names that were declared (a `setVars` of any other name is refused). */\n private _vars: Vars = {};\n private _declared = new Set<string>();\n /** The composition as the author wrote it (before `{name}` is replaced): a rebuild starts from it. */\n private _composition: CompositionSpec | undefined;\n /** True once `resize()` was called: the size of the movie then replaces an explicit `width` / `height` of the composition. */\n private _resized = false;\n private _mixCache = new MixCache<MixStats | null>();\n private _rebuildRun: Promise<RebuildReport> | null = null;\n private _rebuildNext: { change: RebuildOptions; reason: RebuildReason; promise: Promise<RebuildReport>; resolve: (r: RebuildReport) => void; reject: (e: unknown) => void } | null = null;\n /** > 0 while a rebuild stops and restarts playback: `play` / `pause` are not announced then (a player's button must not flicker). */\n private _silent = 0;\n /** render() / peek() in flight: a rebuild does not swap the composition under them. */\n private _busy = 0;\n /** > 0 while the movie is moving its scene to another moment (a seek, a motion-blurred frame, the poster): a thumbnail does not start then. */\n private _moving = 0;\n /** The thumbnail being drawn, if any: a seek waits for it (it has the scene on another moment for a few microtasks). */\n private _thumbRun: Promise<void> | null = null;\n private _idleWaiters: Array<() => void> = [];\n /** What went into the mix, and its peak before limiting — kept for inspectAudio(). */\n private _audioSources: AudioDescriptor[] = [];\n private _mixStats: MixStats | null = null;\n\n on(event: 'ready', fn: () => void): this;\n on(event: 'frame', fn: (e: FrameEvent) => void): this;\n /** A jump to another frame (`gotoFrame`, a seek bar) starts / finishes. Not emitted for playback ticks, `render()`, `snapshot()` or `contactSheet()`. */\n on(event: 'seeking' | 'seeked', fn: (e: FrameEvent) => void): this;\n /** Playback ran off the end (after `pause`). Pausing by hand does not emit it. */\n on(event: 'ended', fn: () => void): this;\n on(event: 'volumechange', fn: (e: VolumeEvent) => void): this;\n /** `movie.loop` changed (set by the page, the bar's loop button or `init({ loop })` is not a change). */\n on(event: 'loopchange', fn: (e: LoopEvent) => void): this;\n on(event: 'error', fn: (e: MovieErrorEvent) => void): this;\n on(event: 'progress', fn: (e: ProgressEvent) => void): this;\n /** How far `init()` is while it builds the movie: `{ stage: 'assets' | 'build' | 'sound' | 'frames', loaded, total, progress }`, `progress` 0 to 1. The page's `.pe-loader` shows it by itself. */\n on(event: 'loadprogress', fn: (e: LoadProgressState) => void): this;\n /** A `rebuild()` (a `setVars()` or a `resize()` too) finished: what it was and what it cost. */\n on(event: 'rebuilt', fn: (e: RebuildReport) => 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 /** @internal */\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 /** Milliseconds `init()` spent in each stage (assets, build, sound, frames), or null before it has finished: `check` says which stage is the slow one. */\n get loadStages(): Record<LoadStage, number> | null { return this._loadStages; }\n private _loadStages: Record<LoadStage, number> | null = null;\n\n /** True while the movie has sound but the browser keeps it silent until the viewer taps (iOS Safari, a page nobody has touched): a player can show \"tap for sound\"; the sound starts at a tap or key press that arrives while play() is pending, or at the next play() made from a tap. */\n get audioBlocked(): boolean { return audioIsBlocked(this._audioContext, !!this.audioBuffer); }\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 this._moving++;\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 this._moving--;\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', 'vars', 'poster', 'motionBlur', 'loader', 'loop']);\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._loop = options.loop === true;\n this._vars = normalizeVars(options.vars, 'movie.init()');\n this._declared = new Set(Object.keys(this._vars));\n this._composition = options.composition;\n this._resized = false;\n for (const w of lintVars(options.composition, this._vars)) console.warn(w);\n this._mixCache.set(null, null);\n this.stops = normalizeStops(applyVars(options.composition, this._vars)?.stops, this.duration, this.frameRate);\n this._posterFrame = poster.frame;\n this.background = options.background ?? '#000000';\n\n this.timeline = createTimeline({ paused: true, defaults: { ease: 'none' } });\n lengthen(this.timeline, 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 let loaderEl: HTMLElement | null | undefined;\n const lp = new LoadProgress(state => {\n if (loaderEl === undefined) loaderEl = resolveLoader(options.loader, options.canvas ?? (this.app?.canvas as HTMLCanvasElement | undefined) ?? null);\n setLoaderProgress(loaderEl, state); // the loader first, so a listener sees what the viewer sees\n this.emit('loadprogress', state);\n }, { yieldEveryMs: (globalThis as { __peLoadYieldMs?: number }).__peLoadYieldMs }); // __peLoadYieldMs: a hook for the test that yielding changes nothing\n const assetCount = (options.assets ?? []).length;\n lp.begin('assets', assetCount);\n let assetsSeen = 0;\n await loadAssetBundle(options.assets ?? [], audioContext, p => { const n = Math.round(p * assetCount); if (n > assetsSeen) { lp.tick(n - assetsSeen); assetsSeen = n; } });\n\n const composition = await this._construct(this._composition, this._vars, this.width, this.height, lp);\n this._rootSequence = composition;\n if (composition.target) root.addChild(composition.target);\n composition.bindTimeline(this.timeline);\n this._timeFilters = collectTimeFilters(composition);\n\n lp.begin('sound', 1); // one whole: `mixdown` says how far it is\n await this._mixSound(composition, audioContext, lp);\n\n lp.begin('frames', 0);\n this.timeline.time(this._timeOf(0)); // the first picture is the movie at its start: a `set` at 0 is already applied\n await this._awaitVideoFrames();\n this._updateSpace();\n this._renderNow();\n\n lp.finish();\n this._loadStages = lp.timings();\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 /**\n * Build the composition tree for these variables and this size, off stage: `{name}` replaced, the root shape (with the numeric variables for the\n * expressions), transitions expanded, every layer built. Used by `init` and by `rebuild`.\n */\n private async _construct(composition: CompositionSpec | undefined, vars: Vars, width: number, height: number, lp?: LoadProgress, sizeWins = this._resized): Promise<CompositionSequence> {\n const spec = applyVars(composition, vars);\n const rootShape: CompositionShape = {\n width, height, duration: this.duration, frameRate: this.frameRate, vars: numericVars(vars),\n ...(lp ? { onLayerBuilt: async () => { lp.tick(); await lp.yieldIfDue(); } } : {}),\n };\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. (After `resize()` the movie's size wins over a size the composition names.)\n const seededComposition = spec\n ? {\n ...spec,\n width: sizeWins ? width : (spec.width ?? width),\n height: sizeWins ? height : (spec.height ?? height),\n duration: spec.duration ?? this.duration,\n }\n : undefined;\n await ensureFilterLibrary(seededComposition); // pixi-filters, only when a layer names one of its filters\n if (usesAdvancedBlend(seededComposition)) await enableAdvancedBlend(this.app!.renderer); // (on the spec after {name} is replaced: a variable may name the mode)\n const userComposition = seededComposition ? expandTransitions(seededComposition) : undefined;\n const rootSeqSpec = {\n type: 'composition' as const,\n width,\n height,\n duration: this.duration,\n ...userComposition,\n };\n if (userComposition) carryTransitionWindows(userComposition, rootSeqSpec);\n const sequence = new CompositionSequence(rootSeqSpec, null, rootShape);\n lp?.begin('build', countLayers(rootSeqSpec));\n try { await sequence.build(); }\n catch (err) { safeRun(() => sequence.destroy()); throw err; }\n return sequence;\n }\n\n /** Make the sound of a built composition: the same mix as last time when the sounds are the same (`'reused'`), else mix it. */\n private async _mixSound(sequence: CompositionSequence, audioContext: AudioContext, lp?: LoadProgress): Promise<'reused' | 'mixed' | 'none'> {\n const audios: AudioDescriptor[] = [];\n sequence.collectAudio(audios, 0);\n let status: 'reused' | 'mixed' | 'none' = 'none';\n if (audios.length === 0) {\n this.audioBuffer = null; this._mixStats = null; this._mixCache.set(null, null);\n } else {\n const key = mixKey(audios, this.duration, audioContext.sampleRate);\n const hit = this._mixCache.get(key);\n if (hit) { this.audioBuffer = hit.buffer; this._mixStats = hit.extra; status = 'reused'; }\n else {\n this.audioBuffer = await mixdown(audios, this.duration, audioContext.sampleRate, lp ? async (done) => { lp.part(done); await lp.yieldIfDue(); } : undefined);\n this._mixStats = this.audioBuffer ? limitMix(this.audioBuffer, audios) : null;\n this._mixCache.set(key, this.audioBuffer, this._mixStats);\n status = 'mixed';\n }\n lp?.tick();\n }\n this._audioSources = audios;\n return status;\n }\n\n /** The variables now (a copy; change them with `setVars()`). */\n get vars(): Readonly<Vars> { return { ...this._vars }; }\n\n /**\n * Change variables and rebuild at the same time. Only the declared names (`movie.init({ vars })`) are accepted; another name says which one it\n * looks like and is ignored. Values it already has change nothing: no rebuild (`unchanged: true`).\n */\n async setVars(changes: Vars): Promise<RebuildReport> {\n this._requireReady('setVars');\n return this.rebuild({ vars: changes }, 'vars');\n }\n\n /** Make the movie `width` x `height` pixels (the canvas, and `W` / `H` / `GW` / `GH` in every expression) and rebuild at the same time. */\n async resize(width: number, height: number): Promise<RebuildReport> {\n this._requireReady('resize');\n return this.rebuild({ width, height }, 'resize');\n }\n\n /**\n * Build the composition again, with what `change` replaces (variables, the composition, the size), and put the movie back where it was: the\n * same frame, playing or not, the poster if that was shown. The new composition is built first: when that fails the old one stays, `error` is\n * emitted and the promise rejects. The sound is mixed again only when it changed (`audio: 'reused'` otherwise). Calls that arrive while a\n * rebuild runs are joined into one more rebuild (the latest values win), so a slider can call it on every move.\n */\n async rebuild(change: RebuildOptions = {}, reason: RebuildReason = 'rebuild'): Promise<RebuildReport> {\n this._requireReady('rebuild');\n warnUnknownOptions('movie.rebuild()', change, ['composition', 'vars', 'width', 'height']);\n if (this._rebuildRun) {\n if (!this._rebuildNext) {\n let resolve!: (r: RebuildReport) => void, reject!: (e: unknown) => void;\n const promise = new Promise<RebuildReport>((res, rej) => { resolve = res; reject = rej; });\n this._rebuildNext = { change: {}, reason, promise, resolve, reject };\n }\n const next = this._rebuildNext;\n next.change = { ...next.change, ...change, vars: { ...(next.change.vars ?? {}), ...(change.vars ?? {}) } };\n if (reason !== 'vars') next.reason = reason;\n return next.promise;\n }\n return this._runRebuild(change, reason);\n }\n\n private _runRebuild(change: RebuildOptions, reason: RebuildReason): Promise<RebuildReport> {\n const run = this._doRebuild(change, reason);\n this._rebuildRun = run;\n const settled = () => {\n if (this._rebuildRun === run) this._rebuildRun = null;\n const next = this._rebuildNext;\n if (next && this._initState === 'ready') { this._rebuildNext = null; this._runRebuild(next.change, next.reason).then(next.resolve, next.reject); }\n else if (next) { this._rebuildNext = null; next.reject(new Error('pixi-effects: the movie was destroyed before the rebuild could run')); }\n };\n run.then(settled, settled);\n return run;\n }\n\n private async _doRebuild(change: RebuildOptions, reason: RebuildReason): Promise<RebuildReport> {\n const started = performance.now();\n const root = this._rootContainer, app = this.app;\n if (!root || !app) throw new Error('pixi-effects: movie.rebuild() needs a ready movie — await movie.init(...) first');\n const who = `movie.${reason === 'vars' ? 'setVars' : 'rebuild'}()`;\n let sequence: CompositionSequence | null = null;\n const alive = () => { if (this._initState !== 'ready') throw new Error('pixi-effects: the movie was destroyed while it was being rebuilt'); };\n try {\n // what changes\n const vars: Vars = { ...this._vars };\n let changed = false;\n if (change.vars !== undefined) {\n const given = normalizeVars(change.vars, who);\n for (const [name, value] of Object.entries(given)) {\n if (!this._declared.has(name)) {\n const guess = suggestName(name, [...this._declared]);\n console.warn(`pixi-effects: ${who}: \"${name}\" is not a declared variable${guess ? ` — did you mean \"${guess}\"?` : ''} (declared in movie.init({ vars }): ${[...this._declared].join(', ') || 'none'}); ignored`);\n continue;\n }\n if (vars[name] !== value) { vars[name] = value; changed = true; }\n }\n }\n for (const [k, v] of [['width', change.width], ['height', change.height]] as const) {\n if (v !== undefined && !(Number.isFinite(v) && v >= 1)) throw new Error(`pixi-effects: movie.rebuild(): ${k} must be a number of pixels (1 or more), got ${JSON.stringify(v)}`);\n }\n const width = change.width ?? this.width, height = change.height ?? this.height;\n const sizeChanged = width !== this.width || height !== this.height;\n const composition = change.composition ?? this._composition;\n if (change.composition !== undefined) for (const w of lintVars(change.composition, vars)) console.warn(w);\n changed = changed || sizeChanged || change.composition !== undefined || reason === 'rebuild';\n if (!changed) return { reason, ms: 0, audio: 'none', frame: this.currentFrame, playing: this.isPlaying, unchanged: true };\n\n // build the new composition and its sound off the stage, while the old one goes on (playing, seekable): the size and the swap come last\n sequence = await this._construct(composition, vars, width, height, undefined, this._resized || sizeChanged);\n alive();\n const timeline = createTimeline({ paused: true, defaults: { ease: 'none' } });\n lengthen(timeline, this.duration);\n sequence.bindTimeline(timeline);\n const hadSound = this.audioBuffer !== null;\n const audio = await this._mixSound(sequence, this._ensureAudioContext());\n const soundChanged = audio === 'mixed' || (audio === 'none' && hadSound);\n while (this._busy > 0) { await new Promise<void>(r => this._idleWaiters.push(r)); } // not under a render() / peek()\n alive();\n\n // the swap, in one go: what the movie is doing NOW (the user may have paused, sought or played meanwhile) is what it keeps doing\n const wasPlaying = this.isPlaying, frame = this.currentFrame, wasAtPoster = this._atPoster;\n const oldSize = { w: this.width, h: this.height }, oldResized = this._resized;\n // a playing movie whose sound stays the same is not stopped at all: the frame clock and the sound go on, only the picture's tree is swapped\n const goOn = wasPlaying && !soundChanged;\n this._silent++;\n try {\n if (goOn) this._cancelUntil(); else this.pause(); // (a `playUntil()` in flight ends here too)\n if (sizeChanged) {\n try {\n this.width = width; this.height = height; this._resized = true;\n app.renderer.resize(width, height);\n root.cullArea = new Rectangle(0, 0, width, height);\n } catch (e) {\n this.width = oldSize.w; this.height = oldSize.h; this._resized = oldResized;\n safeRun(() => app.renderer.resize(oldSize.w, oldSize.h));\n root.cullArea = new Rectangle(0, 0, oldSize.w, oldSize.h);\n if (wasPlaying && !goOn) this.play();\n throw e;\n }\n }\n const old = this._rootSequence, oldTimeline = this.timeline;\n if (old?.target) root.removeChild(old.target);\n if (sequence.target) root.addChild(sequence.target);\n this._rootSequence = sequence;\n this.timeline = timeline;\n this._timeFilters = collectTimeFilters(sequence);\n const unmute = muteBoundTextureWarning();\n try { safeRun(() => old?.destroy()); } finally { unmute(); }\n safeRun(() => oldTimeline?.kill());\n this._vars = vars;\n this._composition = composition;\n this.stops = normalizeStops(applyVars(composition, vars)?.stops, this.duration, this.frameRate);\n sequence = null;\n } finally { this._silent--; }\n\n // put the movie back where it was; the swap has happened, so a picture that cannot be drawn is a playback error, not a failed rebuild\n try {\n if (wasAtPoster) await this._showPoster();\n else await this._quietly(() => this.gotoFrame(frame, true));\n } catch (e) { console.warn('pixi-effects: could not draw the frame after a rebuild:', e); this._emitError('playback', e); }\n if (wasPlaying && !goOn && this._initState === 'ready' && !this.isPlaying) { this._silent++; try { this.play(); } finally { this._silent--; } }\n const report: RebuildReport = { reason, ms: Math.round((performance.now() - started) * 10) / 10, audio, frame, playing: wasPlaying };\n this.emit('rebuilt', report);\n return report;\n } catch (err) {\n if (sequence) safeRun(() => sequence!.destroy());\n this._emitError('rebuild', err);\n throw err;\n }\n }\n\n async gotoFrame(frame: number, force = false): Promise<void> {\n if (this._initState !== 'ready') return;\n this._cancelUntil(); // a seek by someone else ends a `playUntil()` in flight\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 if (this._thumbRun) await this._thumbRun;\n this._moving++;\n try {\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 } finally { this._moving--; }\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 const clocks = new Map<VideoLike, () => number>();\n collectVideoSequences(this._rootSequence, collected, clocks);\n await Promise.all(collected.map(v => {\n if (v.selfTimed) return v.awaitFrameAt(t); // a video knows the playhead its own timeline wrote (remapped, local inside a remapped composition)\n // a layer inside a composition with its own time lives in THAT composition's seconds: its `absoluteStart` is local\n const local = (clocks.get(v)?.() ?? 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 | undefined, opts: SnapshotOptions & { as: 'imageData' }): Promise<ImageData>;\n async snapshot(frame: number = this.currentFrame, opts: SnapshotOptions = {}): Promise<Blob | string | ImageData> {\n warnUnknownOptions('movie.snapshot()', opts, ['scale', 'type', 'quality', 'as', 'motionBlur']);\n this._requireReady('snapshot');\n return this._captureFrame(clampFrame(frame, this.totalFrames), { scale: opts.scale ?? 1, type: opts.type ?? 'image/png', quality: opts.quality, 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 /** 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' | 'imageData'; motionBlur?: MotionBlurSpec }): Promise<Blob | string | ImageData> {\n const out = await this._frameCanvas(frame, o.scale, o.motionBlur);\n if (o.as === 'imageData') return out.getContext('2d')!.getImageData(0, 0, out.width, out.height);\n return encodeCanvas(out, o.type, o.as, o.quality);\n }\n\n /**\n * Why `thumbnail()` is off for this movie: `'variables'` (it declares `vars`: the picture depends on them and changes when they do) or `'video'` (a video\n * layer: its frame must be waited for, which would seek the playing video). `null`: it works.\n */\n get thumbnailsOff(): 'variables' | 'video' | null {\n if (this._declared.size > 0) return 'variables';\n if (!this._rootSequence) return null;\n const found: VideoLike[] = [];\n collectVideoSequences(this._rootSequence, found);\n return found.some(v => (v as unknown as { spec?: { type?: string } }).spec?.type === 'video') ? 'video' : null;\n }\n\n /**\n * A small picture of any frame, drawn WITHOUT moving the playhead or changing what is on the canvas, so it can be made while the movie plays or is\n * paused (a seek-bar preview). The scene is put on that moment, drawn, copied, and put back, all within the microtasks of one task: the browser never\n * shows the in-between. Gives `null` when it cannot be made right now: the movie has thumbnails off (see `thumbnailsOff`), is moving somewhere else\n * (a seek, a render, a peek), or is another thumbnail's turn. It is the picture `snapshot()` gives at that size (without motion blur).\n */\n async thumbnail(frame: number, opts: ThumbnailOptions = {}): Promise<HTMLCanvasElement | null> {\n warnUnknownOptions('movie.thumbnail()', opts, ['width', 'scale']);\n this._requireReady('thumbnail');\n if (opts.width !== undefined && !(opts.width > 0 && opts.width <= this.width * 4)) throw new Error(`pixi-effects: movie.thumbnail(): width must be above 0 and at most ${this.width * 4} px, got ${opts.width}`);\n if (opts.scale !== undefined && !(opts.scale > 0 && opts.scale <= 4)) throw new Error(`pixi-effects: movie.thumbnail(): scale must be above 0 and at most 4, got ${opts.scale}`);\n if (this.thumbnailsOff || this._moving > 0 || this._busy > 0 || this._thumbRun) return null;\n const w = Math.max(1, Math.round(opts.width ?? (opts.scale !== undefined ? this.width * opts.scale : 160)));\n const h = Math.max(1, Math.round(w * this.height / this.width));\n let done!: () => void;\n this._thumbRun = new Promise<void>(r => { done = r; });\n try { return await this._drawThumbnail(clampFrame(frame, this.totalFrames), w, h); }\n finally { this._thumbRun = null; done(); }\n }\n\n private async _drawThumbnail(frame: number, w: number, h: number): Promise<HTMLCanvasElement> {\n const stage = this.app!.canvas as HTMLCanvasElement;\n const out = document.createElement('canvas');\n out.width = w; out.height = h;\n const keep = this.timeline!.time(); // where the scene is now (the playhead's moment, or the poster's)\n const t = this._timeOf(frame);\n this._nominalTime = t; // time-driven filters read the moment being drawn, not the playhead\n try {\n this.timeline!.time(t);\n await this._awaitVideoFrames(t); // 3D and shader layers prepare their picture here, as in a seek\n this._updateSpace(t);\n this._renderNow();\n out.getContext('2d')!.drawImage(stage, 0, 0, w, h);\n } finally {\n this._nominalTime = keep; // and the scene goes back, drawn the same way: the canvas ends as it was\n try {\n this.timeline!.time(keep);\n await this._awaitVideoFrames(keep);\n this._updateSpace(keep);\n this._renderNow();\n } finally { this._nominalTime = null; }\n }\n return out;\n }\n\n /**\n * One picture of a movement: `count` frames from `from` to `to` drawn one over the other, each later one stronger, so a thing that\n * moves leaves a trail (its path and its easing: even steps = constant speed, bunched = slow) and what stays still stays itself.\n * The movie is left where it was.\n */\n async onionSkin(opts?: OnionSkinOptions & { as?: 'blob' }): Promise<Blob>;\n async onionSkin(opts: OnionSkinOptions & { as: 'dataURL' }): Promise<string>;\n async onionSkin(opts: OnionSkinOptions = {}): Promise<Blob | string> {\n warnUnknownOptions('movie.onionSkin()', opts, ['from', 'to', 'count', 'scale', 'as', 'motionBlur']);\n this._requireReady('onionSkin');\n const from = opts.from ?? 0, to = opts.to ?? this.duration, count = opts.count ?? 8, scale = opts.scale ?? 1;\n if (!(Number.isInteger(count) && count >= 1 && count <= 64)) throw new Error(`pixi-effects: movie.onionSkin(): count must be a whole number from 1 to 64, got ${count}`);\n if (!(from >= 0 && to <= this.duration + 1e-9 && (count === 1 || from < to))) throw new Error(`pixi-effects: movie.onionSkin(): from must be before to, inside the movie (0 to ${this.duration} s), got ${from} to ${to}`);\n if (!(scale > 0 && scale <= 4)) throw new Error(`pixi-effects: movie.onionSkin(): scale must be above 0 and at most 4, got ${scale}`);\n const mb = this._blurFor(opts.motionBlur, 'movie.onionSkin()');\n const blurred = mb ? this._blurCanvas() : null;\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 const g = out.getContext('2d')!;\n const alphas = onionAlphas(count);\n const frames = onionTimes(from, to, count).map(t => clampFrame(t * this.frameRate, this.totalFrames));\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 g.globalAlpha = alphas[i]!;\n g.drawImage(blurred ?? (this.app!.canvas as HTMLCanvasElement), 0, 0, out.width, out.height);\n }\n } finally {\n g.globalAlpha = 1;\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(out, 'image/png', opts.as ?? 'blob');\n }\n\n /**\n * Several frames on ONE image, each labelled with its frame number and time — the cheapest way to\n * check a whole animation by eye. Restores the current frame afterwards.\n */\n async contactSheet(opts?: ContactSheetOptions & { as?: 'blob' }): Promise<Blob>;\n async contactSheet(opts: ContactSheetOptions & { as: 'dataURL' }): Promise<string>;\n async contactSheet(opts: ContactSheetOptions = {}): Promise<Blob | string> {\n warnUnknownOptions('movie.contactSheet()', opts, ['frames', 'times', 'count', 'columns', 'cellWidth', 'as', '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 /** The pictures to look at for moments such as `3.5`, `50%`, `f120`, `title@end` (comma-separated). A mistake says what could not be read. */\n resolveAt(list: string): Array<{ label: string; frame: number }> {\n this._requireReady('resolveAt');\n return resolveAtList(list, { frameRate: this.frameRate, totalFrames: this.totalFrames, duration: this.duration, rows: this.timelineData().rows });\n }\n\n /**\n * One call that looks at everything `pixi-effects check` looks at inside the page: layout issues over the whole timeline (every\n * scene's first and last frame and a frame every 0.25 s), fonts and the sound. See `ReviewReport`. Page warnings are in `window.__logs`. The movie is left as it was.\n */\n async review(opts: ReviewOptions = {}): Promise<ReviewReport> {\n warnUnknownOptions('movie.review()', opts, ['at', 'strict']);\n this._requireReady('review');\n const back = this.currentFrame, wasAtPoster = this._atPoster;\n try {\n return await reviewMovie(this, opts);\n } finally { // the movie is left as it was: still showing its poster, or back at its frame\n this.currentFrame = back;\n if (wasAtPoster) await this._showPoster();\n else await this._quietly(() => this.gotoFrame(back, true));\n }\n }\n\n /**\n * The fonts of the text layers: `missing` lists layers none of whose `fontFamily` entries is available in this browser (they are\n * drawn in a fallback font), `failed` lists web fonts (`@font-face`) whose file could not be loaded.\n */\n inspectFonts(): FontReport {\n this._requireReady('inspectFonts');\n return inspectFonts(this._rootSequence as Sequence);\n }\n\n inspectAudio(opts: AudioInspectOptions = {}): AudioReport {\n warnUnknownOptions('movie.inspectAudio()', opts, ['window', 'scenes']);\n this._requireReady('inspectAudio');\n const scenes = opts.scenes ?? namedScenes(this.timelineData().rows); // the scenes of the movie: named top-level compositions of a second or more\n return analyzeAudio(this.audioBuffer, this._audioSources, this._mixStats, this.duration, { ...opts, scenes });\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 if (!this._synced) this._rootSequence?.syncFrame(); // normally _updateSpace() has already done it (see there)\n this._synced = false;\n this._feedTimeFilters(); // the same time again when nothing called _updateSpace first\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 /** True when the layers were already synced to the playhead for the frame about to be drawn (so `_renderNow` need not do it again). */\n private _synced = false;\n\n /**\n * Projects every `threeD` layer for the current frame (see src/space). A threeD card is drawn into its own texture HERE, before the stage is\n * drawn, so the shapes inside it must be brought up to the playhead first: syncing only in `_renderNow` left every card showing the state of\n * the frame before (after a jump seek, a card whose children were animated showed a stale picture).\n */\n private _updateSpace(t: number = this._timeOf(this.currentFrame)): void {\n this._feedTimeFilters(); // before anything is drawn: a threeD card is drawn to its texture right here\n if (!this._rootSequence || !this.app) return;\n this._rootSequence.syncFrame();\n this._synced = true;\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 if (this._thumbRun) await this._thumbRun; // (before the nominal time is set: a thumbnail has its own and clears it when done)\n this._atPoster = false;\n const times = blurTimes(frame, this.frameRate, mb, Math.max(0, this.duration - END_MARGIN));\n this._nominalTime = this._timeOf(Math.max(0, Math.min(frame, this.totalFrames)));\n this._moving++;\n try {\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 } finally { this._nominalTime = null; this._moving--; }\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 /**\n * Play and pause exactly at `seconds`: it resolves `true` when the playhead has landed on that frame, `false` when something else ended it\n * first (a `pause()`, a seek, a newer `playUntil()`), or when there is nothing to play toward (a time at or before the playhead, which also\n * pauses it where it is, or a movie that is not ready). A time at or past the end lands on the last frame; with no time at all it plays to\n * the end and resolves `true` once the movie has ended (and says `ended`). An ordinary `play()` is\n * not affected by it. It is the one primitive a presentation is built on (see `pixi-effects/present`).\n */\n async playUntil(seconds?: number): Promise<boolean> {\n if (this._initState !== 'ready') return false;\n this._settleUntil(false); // a new target replaces the one in flight\n if (this.currentFrame >= this.totalFrames) return false;\n const frame = seconds === undefined ? Infinity : Math.round(seconds * this.frameRate);\n if (frame <= this.currentFrame) { this.pause(); return false; }\n this._until = Number.isFinite(frame) ? Math.min(frame, this.totalFrames) : null; // a time at or past the end lands on the last frame (no 'ended'); only no time at all runs to the end\n const landed = new Promise<boolean>(resolve => this._untilWaiters.push(resolve));\n if (!this.isPlaying) this.play();\n return landed;\n }\n\n /**\n * Look around and put the movie back: pauses, runs `fn` (seek, take pictures: the seeks made inside are not reported as `seeking` / `seeked`),\n * then puts the playhead (or the poster) back where it was, whatever `fn` did, and returns what `fn` returned.\n */\n async peek<T>(fn: () => Promise<T>): Promise<T> {\n this._requireReady('peek');\n return this._exclusive(async () => {\n this.pause();\n const back = this.currentFrame, wasAtPoster = this._atPoster;\n try { return await this._quietly(fn); }\n finally {\n if (wasAtPoster) await this._showPoster();\n else await this._quietly(() => this.gotoFrame(back, true));\n }\n });\n }\n\n /** Run `fn` as the only thing that moves the composition: waits for a rebuild in flight, and holds the next one's swap until `fn` is done. */\n private async _exclusive<T>(fn: () => Promise<T>): Promise<T> {\n while (this._rebuildRun) await this._rebuildRun.catch(() => {});\n this._busy++;\n try { return await fn(); }\n finally { if (--this._busy === 0) { const waiting = this._idleWaiters; this._idleWaiters = []; waiting.forEach(w => w()); } }\n }\n\n private _settleUntil(landed: boolean): void {\n const waiters = this._untilWaiters; this._untilWaiters = []; this._until = null;\n waiters.forEach(w => w(landed));\n }\n private _cancelUntil(): void { if (this._untilWaiters.length > 0 || this._until !== null) this._settleUntil(false); }\n /** The playhead reached the frame `playUntil()` was playing to: land exactly on it, pause, resolve true. */\n private async _arriveUntil(): Promise<void> {\n const frame = this._until!;\n const waiters = this._untilWaiters; this._untilWaiters = []; this._until = null; // (taken first, so the pause below does not cancel them)\n let landed = true;\n try { this.pause(); await this._goto(frame); }\n catch (err) { landed = false; console.warn('pixi-effects: could not land on the frame playUntil() was playing to:', err); this._emitError('playback', err); }\n waiters.forEach(w => w(landed));\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 startFrame = this.currentFrame;\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.max(startFrame, Math.floor(elapsed * this.frameRate)); // (rAF's time is a little before `startTime`: the first tick must not land a frame back)\n if (this._until !== null && frame >= this._until) { void this._arriveUntil(); 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 if (this._loop && this._untilWaiters.length === 0) {\n // loop: back to the start, playing on (the stop and start are the movie's own: no pause / play events, no ended)\n this._silent++;\n try { this.pause(); this._goto(0).catch((err) => { console.warn('pixi-effects: gotoFrame failed at the loop:', err); this._emitError('playback', err); }); this.play(); }\n finally { this._silent--; }\n } else {\n const toEnd = this._untilWaiters; this._untilWaiters = []; this._until = null; // `playUntil()` to the end: it has landed\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 toEnd.forEach(w => w(true));\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._silent) 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._silent) this.emit('pause');\n this._cancelUntil();\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 /**\n * At the end of an ordinary `play()` the movie goes back to the start and plays on (no `ended`, no `pause` / `play` events at the wrap; the sound\n * starts again). Default false. `playUntil()` and `render()` ignore it. Can be changed at any time; `loopchange` says so.\n */\n set loop(v: boolean) {\n const next = !!v;\n if (next === this._loop) return;\n this._loop = next;\n this.emit('loopchange', { loop: next } satisfies LoopEvent);\n }\n get loop(): boolean { return this._loop; }\n\n async render(options?: RenderOptions): Promise<Blob> {\n warnUnknownOptions('movie.render()', options, ['format', 'video', 'audio', 'motionBlur', 'range', 'scale', 'draft']);\n try {\n return await this._exclusive(() => 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 this._timeFilters = [];\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 this._mixCache.set(null, 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\n/**\n * PixiJS warns \"a textureSource was destroyed while still bound to a shader\" when a layer that was drawn a moment ago is destroyed. A rebuild does\n * exactly that to the composition it replaces; the renderer builds its bind groups again on the next draw, so the warning says nothing here and\n * would make `check` count a problem. Silenced for the synchronous destroy only; any other warning goes through.\n */\nfunction muteBoundTextureWarning(): () => void {\n const original = console.warn;\n const ours = (...args: unknown[]) => { if (args.some(a => /destroyed while still bound/.test(String(a)))) return; original.apply(console, args); };\n console.warn = ours;\n return () => { if (console.warn === ours) console.warn = original; };\n}\n\nconst clampFrame = (f: number, last: number): number => Math.max(0, Math.min(Math.round(f), last));\n\nfunction encodeCanvas(canvas: HTMLCanvasElement, type: string, as: 'blob' | 'dataURL', 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 /** The layer draws the frame its own timeline is at (a video): Movie does not compute a local time for it. */\n selfTimed?: boolean;\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[], clocks?: Map<VideoLike, () => number>, clock: (() => number) | null = null): void {\n if (typeof (seq as Sequence & Partial<VideoLike>).awaitFrameAt === 'function') {\n out.push(seq as unknown as VideoLike);\n if (clock && clocks) clocks.set(seq as unknown as VideoLike, clock); // inside a composition with its own time: that composition's clock\n }\n if (seq.maskSequence) collectVideoSequences(seq.maskSequence, out, clocks, clock);\n const own = (seq as Sequence & { localClock?: () => (() => number) | null }).localClock?.() ?? clock;\n for (const child of (seq as Sequence & { _children?: Sequence[] })._children ?? []) {\n collectVideoSequences(child, out, clocks, own);\n }\n}\n\n/** How many layers a composition spec holds (its children, theirs, …): the size of the `build` stage of `loadprogress`. */\nfunction countLayers(spec: { sequences?: unknown[] } | undefined): number {\n let n = 0;\n for (const s of spec?.sequences ?? []) {\n const mask = (s as { mask?: unknown }).mask;\n n += 1 + countLayers(s as { sequences?: unknown[] });\n const spans = (s as { spans?: unknown }).spans;\n if (Array.isArray(spans)) n += spans.length; // a text with spans is built as a group and one layer per piece (at least one per span)\n const src = maskSourceOf(mask);\n if (src.kind === 'inline') n += 1 + countLayers(src.spec as { sequences?: unknown[] }); // an inline mask is built as a layer too\n }\n return 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 for (const [n, v] of [['x', x0], ['y', y0]] as const) {\n if (typeof v !== 'number' || !Number.isFinite(v)) throw new Error(`splitText(): ${n} must be a number of pixels (e.g. ${n}: 640), got ${JSON.stringify(v)}: the pieces are placed by measuring, so an expression such as 'GW/2' cannot be used here. \\`y\\` is the top of the line.`);\n }\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 { parseEase as engineParseEase } from '../core/timelineEngine';\nimport { checkEase } from '../core/ease';\n\n/** Resolve an ease name to a function (0–1 → 0–1). An unknown name warns once and runs as the default ease, `power1.out`. */\nexport function parseEase(name: string): (p: number) => number {\n checkEase(name, 'a preset');\n return engineParseEase(name);\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 /** Ease 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 the timeline 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. the timeline interpolates linearly 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 { 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 ease name). 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 /** 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 type { Keyframe } from '../types';\nimport { warnUnknownOptions } from '../core/options';\nimport { parseEase } from './_ease';\n\nconst KEYS = ['points', 'at', 'duration', 'ease', 'look', 'lookAhead', 'smooth', 'from', 'to', 'frameRate'] as const;\nconst MAX_STEPS = 4000;\nconst PER_SPAN = 48; // samples per span of the curve, for the arc-length table\n\ntype P3 = [number, number, number];\n\nexport interface CameraPathOptions {\n /** The route: `[x, y, z]` points the camera passes, in order (at least two). */\n points: Array<[number, number, number]>;\n /** Start, in seconds from the start of the camera layer. Default 0. */\n at?: number;\n /** How long the flight takes, in seconds. Required. */\n duration: number;\n /** Ease for the progress along the route (default `'none'`: constant speed; `'power2.in'` is an accelerating rush). */\n ease?: string;\n /** Where the camera looks: a fixed `[x, y, z]`, or `'ahead'` (default): a point further along the route, so it faces where it flies. */\n look?: [number, number, number] | 'ahead';\n /** With `look: 'ahead'`: how far ahead, as a fraction 0–1 of the route's length (default 0.08). Past the end it continues along the last direction. */\n lookAhead?: number;\n /** `true` (default): a smooth curve through the points (Catmull-Rom). `false`: straight lines between them. */\n smooth?: boolean;\n /** Where on the route to start and stop, as fractions 0–1 of its length (default 0 → 1). `from: 1, to: 0` flies it backwards. */\n from?: number;\n to?: number;\n /** Samples per second: set it to your movie's `frameRate`. Default 30. */\n frameRate?: number;\n}\n\n/**\n * A camera flight as keyframes for `x`, `y`, `z`, `lookAtX`, `lookAtY` and `lookAtZ`: put the result in a camera layer's `keyframes`.\n * The route is walked by arc length (an even speed whatever the curve; an `ease` shapes it) and sampled once per frame as short\n * straight steps, so the camera is exactly on the route at every rendered frame when `frameRate` matches the movie's.\n *\n * ```js\n * { type: 'camera', keyframes: cameraPath({ points: [[640, 360, 2400], [700, 340, 900], [640, 360, -1500]], duration: 8, ease: 'power2.in', frameRate: 30 }) }\n * ```\n */\nexport function cameraPath(opts: CameraPathOptions): Keyframe[] {\n warnUnknownOptions('cameraPath()', opts, KEYS);\n const { points, at = 0, duration, ease = 'none', look = 'ahead', lookAhead = 0.08, smooth = true, from = 0, to = 1, frameRate = 30 } = opts;\n if (!Array.isArray(points) || points.length < 2) throw new Error('cameraPath(): points needs at least two points: [[x, y, z], [x, y, z], …]');\n points.forEach((p, i) => {\n if (!Array.isArray(p) || p.length !== 3 || !p.every(Number.isFinite)) throw new Error(`cameraPath(): points[${i}] must be [x, y, z] numbers, got ${JSON.stringify(p)}`);\n });\n if (!(Number.isFinite(duration) && duration > 0)) throw new Error(`cameraPath(): duration must be a positive number of seconds, got ${duration}`);\n if (!(Number.isFinite(frameRate) && frameRate > 0)) throw new Error(`cameraPath(): frameRate must be a positive number (samples per second), got ${frameRate}`);\n if (look !== 'ahead' && !(Array.isArray(look) && look.length === 3 && look.every(Number.isFinite))) throw new Error(`cameraPath(): look must be 'ahead' or [x, y, z] numbers, got ${JSON.stringify(look)}`);\n if (!(Number.isFinite(lookAhead) && lookAhead >= 0 && lookAhead <= 1)) throw new Error(`cameraPath(): lookAhead must be a fraction of the route between 0 and 1, got ${lookAhead}`);\n for (const [n, v] of [['from', from], ['to', to]] as const) {\n if (!(Number.isFinite(v) && v >= 0 && v <= 1)) throw new Error(`cameraPath(): ${n} must be a fraction of the route 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(`cameraPath(): ${steps} samples is too many (max ${MAX_STEPS}); lower frameRate or duration`);\n\n // the route as a dense polyline with its cumulative length (the curve is sampled once; the walk is by arc length)\n const curve: P3[] = [];\n if (smooth && points.length > 2) {\n const pts = points as P3[];\n for (let i = 0; i < pts.length - 1; i++) {\n const p0 = pts[Math.max(i - 1, 0)]!, p1 = pts[i]!, p2 = pts[i + 1]!, p3 = pts[Math.min(i + 2, pts.length - 1)]!;\n for (let s = 0; s < PER_SPAN; s++) curve.push(catmullRom(p0, p1, p2, p3, s / PER_SPAN));\n }\n curve.push(pts[pts.length - 1]!);\n } else curve.push(...(points as P3[]));\n const cum = [0];\n for (let i = 1; i < curve.length; i++) cum.push(cum[i - 1]! + dist(curve[i - 1]!, curve[i]!));\n const total = cum[cum.length - 1]!;\n if (!(total > 0)) throw new Error('cameraPath(): the route has no length (the points are all the same)');\n\n const find = (s: number): number => {\n let lo = 0, hi = cum.length - 1;\n while (lo < hi - 1) { const mid = (lo + hi) >> 1; if (cum[mid]! <= s) lo = mid; else hi = mid; }\n return lo;\n };\n const along = (fraction: number): P3 => {\n const s = fraction * total;\n if (s >= total) { // past the end: carry on in the last direction\n const a = curve[curve.length - 2]!, b = curve[curve.length - 1]!, len = dist(a, b) || 1, extra = s - total;\n return [b[0] + ((b[0] - a[0]) / len) * extra, b[1] + ((b[1] - a[1]) / len) * extra, b[2] + ((b[2] - a[2]) / len) * extra];\n }\n const i = find(Math.max(s, 0)), span = cum[i + 1]! - cum[i]!, t = span > 0 ? (s - cum[i]!) / span : 0;\n const a = curve[i]!, b = curve[i + 1]!;\n return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t];\n };\n\n const shape = parseEase(ease);\n const round = (v: number) => Math.round(v * 1e6) / 1e6;\n const sample = (k: number): Record<string, number> => {\n const p = from + (to - from) * shape(k / steps);\n const pos = along(Math.min(Math.max(p, 0), 1));\n const target = look === 'ahead' ? along(Math.max(p + (to >= from ? lookAhead : -lookAhead), 0)) : look;\n return { x: round(pos[0]), y: round(pos[1]), z: round(pos[2]), lookAtX: round(target[0]), lookAtY: round(target[1]), lookAtZ: round(target[2]) };\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\nconst dist = (a: P3, b: P3): number => Math.hypot(b[0] - a[0], b[1] - a[1], b[2] - a[2]);\n\nfunction catmullRom(p0: P3, p1: P3, p2: P3, p3: P3, t: number): P3 {\n const t2 = t * t, t3 = t2 * t;\n const c = (a: number, b: number, d: number, e: number) => 0.5 * (2 * b + (d - a) * t + (2 * a - 5 * b + 4 * d - e) * t2 + (3 * b - a - 3 * d + e) * t3);\n return [c(p0[0], p1[0], p2[0], p3[0]), c(p0[1], p1[1], p2[1], p3[1]), c(p0[2], p1[2], p2[2], p3[2])];\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 /** 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` (its names, with thanks).\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 clamp01 = (v: number): number => Math.min(1, Math.max(0, v)); // a spring (or any overshooting ease) must not push a delay past the spread, or below 0\n const delays = dist.map(d => (max === 0 ? 0 : Math.round(total * clamp01(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 /** 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 TWEEN_KEYS = ['preset', 'from', 'to', 'duration', 'ease'] as const;\nconst TIME_KEYS = ['at', 'delay', 'start', 'begin', 'time'];\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 /** Ease name. */\n ease?: string;\n /** `out` only: the composition second the exit starts at (every piece leaves in the same wave from then on, and holds its exit state until the layer ends). Without it the exit is the end of the layer run backwards. Not for `in` (an entrance starts with its piece: the options' `at`). */\n at?: number;\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). With `{ preset, at: T }` the exit starts at composition second T; without `at` it leaves from the END of the layer (`at + duration`), the last piece finishing exactly then. 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; /** `out` only: the composition second the exit starts at. */ at?: number }\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 for (const [n, v] of [['x', x], ['y', y]] as const) {\n if (typeof v !== 'number' || !Number.isFinite(v)) {\n throw new Error(`animateText(): ${n} must be a number of pixels (e.g. ${n}: 640), got ${JSON.stringify(v)}. The letters are measured once, when the layers are made, so an expression such as 'GW/2' cannot be used here: compute the number (W / 2) yourself. \\`y\\` is the TOP of the line.`);\n }\n }\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 if (outTween?.at !== undefined) {\n if (outTween.at < at - 1e-9) console.warn(`pixi-effects: animateText(): out.at ${outTween.at} is before the layer starts (at ${at}): the exit starts with the piece; use out.at ≥ ${at}`);\n const latest = end - outTween.duration - wave;\n if (outTween.at > latest + 1e-9) console.warn(`pixi-effects: animateText(): out.at ${outTween.at} leaves after the layer ends (the exit and the wave take ${+(outTween.duration + wave).toFixed(3)} s and the layer ends at ${+end.toFixed(3)} s): use out.at ≤ ${+latest.toFixed(3)}, or a longer duration`);\n if (inTween && outTween.at - at < inTween.duration - 1e-9) console.warn(`pixi-effects: animateText(): out.at ${outTween.at} is before the entrance has finished (it takes ${inTween.duration} s from at ${at}): use out.at ≥ ${+(at + inTween.duration).toFixed(3)}`);\n }\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 // `out.at` (composition seconds) starts every piece's exit at the same local time (their own starts shift by their delays, so does the wave);\n // without it the exit is the end of the layer run backwards: the last piece finishes exactly at the end\n const begin = outTween.at !== undefined ? undefined : outTween.duration + (wave - delays[i]!); // seconds before this piece's end\n const local = outTween.at !== undefined ? Math.max(0, outTween.at - at) : -begin!; // (a negative keyframe time means \"from the end\", so an `out.at` before the start is held at 0)\n idleEnd = outTween.at !== undefined ? local : len - begin!;\n keyframes.push({\n at: local, 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 (typeof spec === 'object' && spec) {\n for (const key of Object.keys(spec)) {\n if ((TWEEN_KEYS as readonly string[]).includes(key)) continue;\n if (which === 'out' && key === 'at') {\n if (typeof (spec as AnimateTextTween & { at?: unknown }).at !== 'number' || !Number.isFinite((spec as { at?: number }).at)) console.warn(`pixi-effects: animateText(): out.at must be a number of seconds (the composition second the exit starts at), got ${JSON.stringify((spec as { at?: unknown }).at)}; ignored`);\n continue;\n }\n if (TIME_KEYS.includes(key)) {\n // a time is never read here: the piece's own time comes from the options' `at` and `duration`; an `out` starts at its own `at`, or runs backwards from the END of the layer\n console.warn(`pixi-effects: animateText(): ${which}.${key} (\"${key}\") is ignored: ${which === 'out' ? 'an exit starts at out.at (composition seconds); without it it leaves from the END of the layer (at + duration)' : 'the entrance starts when the piece starts (the options\\' `at`, plus the stagger), and the layer lasts `duration`'}`);\n } else warnUnknownOptions(`animateText() ${which}`, { [key]: 1 }, TWEEN_KEYS);\n }\n }\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 const at = which === 'out' && typeof t.at === 'number' && Number.isFinite(t.at) ? t.at : undefined;\n return { from, to: { ...to }, duration: t.duration ?? base?.duration ?? 0.5, ease, ...(at !== undefined ? { at } : {}) };\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 { MusicOptions } from '../types';\n\n/**\n * The sound of `music` as a Web Audio `AudioBuffer` you can play yourself (a music box page, a jingle on a button, your own player):\n *\n * ```js\n * const buffer = await musicBuffer({ bpm: 96, tracks: [{ inst: 'keys', notes: 'Cmaj7:4 Am7:4' }] });\n * const src = audioContext.createBufferSource(); src.buffer = buffer; src.connect(audioContext.destination); src.start();\n * ```\n *\n * `sampleRate` defaults to 44100; `duration` (seconds) cuts it or, with `loop: true`, repeats the music up to it. Warnings are printed\n * like for an audio layer; throws, saying why, when the score cannot play (no `bpm`, no notes). Async: the synthesiser is its own chunk.\n */\nexport async function musicBuffer(music: MusicOptions, options: { sampleRate?: number; duration?: number; loop?: boolean } = {}): Promise<AudioBuffer> {\n const { resolveMusic, renderMusic, musicLength } = await import('./music');\n const messages: string[] = [];\n const m = resolveMusic(music, 'musicBuffer()', msg => messages.push(msg));\n if (!m) throw new Error(`pixi-effects: musicBuffer(): ${messages.join(' ') || 'the music has nothing to play'}`);\n for (const msg of messages) console.warn(msg);\n const sampleRate = options.sampleRate ?? 44100;\n const length = options.duration ?? musicLength(m);\n if (!(Number.isFinite(length) && length > 0)) throw new Error(`pixi-effects: musicBuffer(): duration must be a positive number of seconds, got ${String(options.duration)}`);\n const [left, right] = renderMusic(m, sampleRate, length, !!options.loop);\n const buffer: AudioBuffer = typeof AudioBuffer === 'function'\n ? new AudioBuffer({ length: left.length, sampleRate, numberOfChannels: 2 })\n : new OfflineAudioContext(2, left.length, sampleRate).createBuffer(2, left.length, sampleRate);\n buffer.copyToChannel(left as Float32Array<ArrayBuffer>, 0);\n buffer.copyToChannel(right as Float32Array<ArrayBuffer>, 1);\n return buffer;\n}\n","import type { MusicOptions } from '../types';\nimport type { MusicEvents } from './music/events';\n\nexport type { MusicEvents, MusicNote, MusicTrackEvents, MusicDrumEvents, MusicDrumHit, MusicSummary } from './music/events';\n\n/**\n * What a `music` score plays, as data: every note and chord with its beat, time, bar, pitches and name, and every drum hit. Use it to make the\n * picture follow the score (light the keys that sound, show the chord name, flash on the snare) without analysing the audio. Do it before\n * `movie.init`, with the same `music` object the layer uses:\n *\n * ```js\n * const ev = await musicEvents(music);\n * ev.tracks[0].notes; // [{ beat: 0, time: 0, duration: 4, bar: 1, name: 'Am7', midi: [57, 60, 64, 67], ... }, ...]\n * ev.drums[0].hits; // [{ beat: 0, time: 0, ... }] (kind: 'kick')\n * ```\n * Swing and humanize are not applied: the times are the written ones. A score that cannot play throws, with the reason.\n */\nexport async function musicEvents(music: MusicOptions): Promise<MusicEvents> {\n // The synthesiser is its own chunk: pages that never use music never load it.\n const { resolveMusic } = await import('./music');\n const { describeEvents } = await import('./music/events');\n const messages: string[] = [];\n const m = resolveMusic(music, 'musicEvents()', msg => messages.push(msg));\n if (!m) throw new Error(`pixi-effects: musicEvents(): ${messages.join(' ') || 'the music has nothing to play'}`);\n for (const msg of messages) console.warn(msg);\n return describeEvents(m);\n}\n","import type { SequenceCommon, Keyframe } from '../types';\nimport { warnUnknownOptions } from '../core/options';\n\nexport interface WithFadeOptions {\n /** Fade-in duration (seconds), at the start of the sequence. */\n in?: number;\n /** Fade-out duration (seconds), ending at the end of the sequence. Requires `duration` to be set on the spec. */\n out?: number;\n}\n\n/**\n * Add alpha fade-in / fade-out keyframes to a sequence spec. Mutates and\n * returns the spec so the result can be dropped straight into `sequences[]`.\n *\n * ```ts\n * sequences: [\n * withFade(\n * kenBurns({ asset: 'p', at: 0, duration: 6, motion: 'scale' }),\n * { in: 0.5, out: 0.5 },\n * ),\n *\n * withFade(\n * { type: 'text', text: 'hi', at: 5, duration: 3, initial: { x: 'GW/2' } },\n * { in: 0.4 },\n * ),\n * ]\n * ```\n *\n * The added keyframes are layered on top of any keyframes the spec already\n * has — kenBurns's scale / position / rotation tweens keep working.\n *\n * Keyframe `at` is sequence-local: the fade-in starts at 0 and the fade-out\n * at `duration - out`, whatever the sequence's own `at` is. Works the same\n * whether the spec sits directly under the root composition or nested inside\n * another.\n */\nexport function withFade<T extends SequenceCommon>(spec: T, opts: WithFadeOptions): T {\n warnUnknownOptions('withFade()', opts, ['in', 'out']);\n if (opts.in != null && opts.in > 0) {\n spec.initial = { ...(spec.initial ?? {}), alpha: 0 };\n const kf: Keyframe = { at: 0, to: { alpha: 1 }, duration: opts.in };\n spec.keyframes = [...(spec.keyframes ?? []), kf];\n }\n if (opts.out != null && opts.out > 0) {\n if (spec.duration == null) {\n throw new Error(\n 'withFade(spec, { out }) requires spec.duration to be set so the ' +\n 'fade-out can be anchored to the sequence end. Set spec.duration ' +\n 'before passing the spec in.',\n );\n }\n const kf: Keyframe = { at: spec.duration - opts.out, to: { alpha: 0 }, duration: opts.out };\n spec.keyframes = [...(spec.keyframes ?? []), kf];\n }\n return spec;\n}\n"]}