pixi-effects 0.47.5 → 0.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +8 -6
- package/ai/chat-template.html +3 -3
- package/dist/Controller.cjs +3 -0
- package/dist/Controller.cjs.map +1 -1
- package/dist/Controller.js +3 -0
- package/dist/Controller.js.map +1 -1
- package/dist/{chunk-LHUIEFMH.js → chunk-GX2WQV4A.js} +43 -33
- package/dist/chunk-GX2WQV4A.js.map +1 -0
- package/dist/chunk-K3XOEC3C.js +53 -0
- package/dist/chunk-K3XOEC3C.js.map +1 -0
- package/dist/{chunk-2AT5WSSV.cjs → chunk-NGK4E536.cjs} +47 -37
- package/dist/chunk-NGK4E536.cjs.map +1 -0
- package/dist/chunk-VQXZ2NOI.cjs +56 -0
- package/dist/chunk-VQXZ2NOI.cjs.map +1 -0
- package/dist/index.cjs +30 -25
- package/dist/index.d.cts +18 -1
- package/dist/index.d.ts +18 -1
- package/dist/index.js +2 -1
- package/dist/loader.css +1 -1
- package/dist/present.cjs +2 -1
- package/dist/present.cjs.map +1 -1
- package/dist/present.js +2 -1
- package/dist/present.js.map +1 -1
- package/docs/api.md +15 -0
- package/llms-full.txt +16 -1
- package/package.json +1 -1
- package/skills/pixi-effects/SKILL.md +1 -1
- package/skills/pixi-effects/template.html +6 -6
- package/dist/chunk-2AT5WSSV.cjs.map +0 -1
- package/dist/chunk-LHUIEFMH.js.map +0 -1
package/dist/present.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/present/stops.ts","../src/present/navigation.ts","../src/present/pdf.ts","../src/present/images.ts","../src/present/Presenter.ts","../src/present/deck.ts"],"names":["warnUnknownOptions","pageIndex","next","stopIndex"],"mappings":"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","file":"present.cjs","sourcesContent":["import type { Stop } from '../index';\n\n/** The first stop beyond `frame` (standing on a stop, the next one). */\nexport function nextStopAfter(stops: readonly Stop[], frame: number): Stop | null {\n return stops.find(s => s.frame > frame) ?? null;\n}\n\n/** The last stop before `frame` (standing on a stop, the one before it). */\nexport function previousStopBefore(stops: readonly Stop[], frame: number): Stop | null {\n for (let i = stops.length - 1; i >= 0; i--) if (stops[i]!.frame < frame) return stops[i]!;\n return null;\n}\n\n/** The stop the playhead is on or has just passed, or null before the first. */\nexport function stopAtOrBefore(stops: readonly Stop[], frame: number): Stop | null {\n for (let i = stops.length - 1; i >= 0; i--) if (stops[i]!.frame <= frame) return stops[i]!;\n return null;\n}\n\n/** The stop that begins each page. */\nexport function pageStarts(stops: readonly Stop[]): Stop[] {\n return stops.filter(s => s.pageStart);\n}\n\n/**\n * The stops whose pictures stand for the pages (`which: 'pages'`, default) or for every stop. A page's picture is, in order: the stop flagged\n * `pdf: true` (the last such one, or the first with `pick: 'first'`), else the last (or first) stop not flagged `pdf: false`, else, for a page\n * list, its last (or first) stop, and for a PDF (`pdf: true` here) nothing: the page is left out. With `which: 'stops'` a PDF leaves out the\n * stops flagged `pdf: false`.\n */\nexport function pictureStops(stops: readonly Stop[], opts: { which?: 'pages' | 'stops'; pick?: 'last' | 'first'; pdf?: boolean } = {}): Stop[] {\n if (opts.which === 'stops') return opts.pdf ? stops.filter(s => s.pdf !== false) : [...stops];\n const byPage = new Map<number, Stop[]>();\n for (const s of stops) byPage.set(s.pageIndex, [...(byPage.get(s.pageIndex) ?? []), s]);\n const take = (list: Stop[]): Stop | undefined => (opts.pick === 'first' ? list[0] : list[list.length - 1]);\n const picks: Stop[] = [];\n for (const list of byPage.values()) {\n const flagged = list.filter(s => s.pdf === true);\n const usable = list.filter(s => s.pdf !== false);\n const one = take(flagged.length ? flagged : usable.length ? usable : (opts.pdf ? [] : list));\n if (one) picks.push(one);\n }\n return picks;\n}\n\n/** The share (0–1) of pixels that differ by more than `threshold` (0–255) in any colour channel between two RGBA pixel arrays of the same size. */\nexport function changedFraction(a: Uint8ClampedArray, b: Uint8ClampedArray, threshold = 12): number {\n const n = Math.min(a.length, b.length) >> 2;\n if (n === 0) return 0;\n let changed = 0;\n for (let i = 0; i < n; i++) {\n const k = i << 2;\n if (Math.abs(a[k]! - b[k]!) > threshold || Math.abs(a[k + 1]! - b[k + 1]!) > threshold || Math.abs(a[k + 2]! - b[k + 2]!) > threshold) changed++;\n }\n return changed / n;\n}\n","import type { Movie, Stop } from '../index';\nimport { nextStopAfter, previousStopBefore, stopAtOrBefore, pageStarts } from './stops';\n\n/** A presentation is now on a stop (`next()` played to it, or `prev()` / `goToStop()` / `goToPage()` jumped to it). */\nexport interface StopEvent { index: number; stop: Stop; pageIndex: number }\n\nconst listeners = new WeakMap<Movie, Set<(e: StopEvent) => void>>();\nconst toward = new WeakMap<Movie, Stop>(); // the stop `next()` is playing toward, per movie\n\n/** Call `fn` every time a presentation lands on a stop. Returns the function that stops listening. */\nexport function onStop(movie: Movie, fn: (e: StopEvent) => void): () => void {\n let set = listeners.get(movie);\n if (!set) { set = new Set(); listeners.set(movie, set); }\n set.add(fn);\n return () => { set!.delete(fn); };\n}\n\nfunction emit(movie: Movie, stop: Stop): void {\n const e: StopEvent = { index: stop.index, stop, pageIndex: stop.pageIndex };\n for (const fn of [...(listeners.get(movie) ?? [])]) fn(e);\n}\n\n/** Which stop the playhead is on or has passed (-1 before the first). */\nexport const stopIndex = (movie: Movie): number => stopAtOrBefore(movie.stops, movie.currentFrame)?.index ?? -1;\n/** The stop the playhead is on or has passed, or null. */\nexport const currentStop = (movie: Movie): Stop | null => stopAtOrBefore(movie.stops, movie.currentFrame);\n/** Which page the playhead is in (0-based), -1 before the first stop. */\nexport const pageIndex = (movie: Movie): number => currentStop(movie)?.pageIndex ?? -1;\n/** How many pages the stops make. */\nexport const pageCount = (movie: Movie): number => pageStarts(movie.stops).length;\n\n/**\n * Play to the next stop and pause exactly there (a presentation's \"next\"). Pressed again while it is playing toward a stop, it skips the\n * rest of the animation and lands on that stop at once. After the last stop it plays to the end. Resolves when it has landed (or\n * stopped for another reason). An ordinary `movie.play()` ignores the stops.\n */\nexport async function next(movie: Movie): Promise<void> {\n if (!movie.isReady) return;\n const going = toward.get(movie);\n if (going && movie.isPlaying) { // still on its way: skip the rest of the animation\n toward.delete(movie);\n movie.pause(); // (this settles the first call's playUntil as \"not landed\": it says nothing)\n await movie.gotoFrame(going.frame, true);\n emit(movie, going);\n return;\n }\n toward.delete(movie); // (a press while it is already landing goes on to the next stop, as it always did)\n if (movie.currentFrame >= movie.totalFrames) return;\n const target = nextStopAfter(movie.stops, movie.currentFrame);\n if (!target) { await movie.playUntil(); return; }\n toward.set(movie, target);\n const landed = await movie.playUntil(target.frame / movie.frameRate);\n if (toward.get(movie) === target) toward.delete(movie);\n if (landed) emit(movie, target);\n}\n\n/** Jump back to the previous stop at once (no reverse playback); from the first stop, to the start. */\nexport async function prev(movie: Movie): Promise<void> {\n if (!movie.isReady) return;\n toward.delete(movie);\n movie.pause();\n const target = previousStopBefore(movie.stops, movie.currentFrame);\n await movie.gotoFrame(target ? target.frame : 0, true);\n if (target) emit(movie, target);\n}\n\n/** Jump to stop `index` (0-based). */\nexport async function goToStop(movie: Movie, index: number): Promise<void> {\n if (!movie.isReady) return;\n const stop = movie.stops[index];\n if (!stop) { console.warn(`pixi-effects: goToStop(movie, ${index}): there are ${movie.stops.length} stops (0 to ${movie.stops.length - 1})`); return; }\n toward.delete(movie);\n movie.pause();\n await movie.gotoFrame(stop.frame, true);\n emit(movie, stop);\n}\n\n/** Jump to the first stop of page `page` (0-based). */\nexport async function goToPage(movie: Movie, page: number): Promise<void> {\n const starts = pageStarts(movie.stops);\n const stop = starts[page];\n if (!stop) { console.warn(`pixi-effects: goToPage(movie, ${page}): there are ${starts.length} pages (0 to ${starts.length - 1})`); return; }\n await goToStop(movie, stop.index);\n}\n","/**\n * A minimal PDF writer: one JPEG per page, full page, no dependencies. Enough for a deck exported as pages (`movie.exportPDF()`).\n */\nexport interface PdfPage {\n /** A JPEG file (baseline or progressive, RGB), embedded as it is. */\n jpeg: Uint8Array;\n /** The picture's size in pixels; the page is that size in CSS pixels (a pixel is 0.75 pt). */\n width: number;\n height: number;\n}\n\nconst enc = (s: string): Uint8Array => { const out = new Uint8Array(s.length); for (let i = 0; i < s.length; i++) out[i] = s.charCodeAt(i) & 0xff; return out; };\nconst num = (n: number): string => String(Math.round(n * 1000) / 1000);\n/** A PDF text string: plain ASCII in parentheses, anything else (a dash, Japanese) as UTF-16BE in hex with its byte order mark. */\nconst textString = (s: string): string => {\n if (/^[\\x20-\\x7e]*$/.test(s)) return `(${s.replace(/[\\\\()]/g, m => `\\\\${m}`)})`;\n let hex = 'FEFF';\n for (let i = 0; i < s.length; i++) hex += s.charCodeAt(i).toString(16).toUpperCase().padStart(4, '0');\n return `<${hex}>`;\n};\n\nexport function buildPdf(pages: PdfPage[], opts: { title?: string } = {}): Uint8Array {\n if (pages.length === 0) throw new Error('pixi-effects: a PDF needs at least one page');\n // object numbers: 1 catalog, 2 page tree, then (page, contents, image) × n, then the info\n const first = (i: number) => 3 + i * 3;\n const objects: Uint8Array[][] = []; // each object: the byte chunks between \"n 0 obj\\n\" and \"\\nendobj\\n\"\n objects[1] = [enc('<< /Type /Catalog /Pages 2 0 R >>')];\n objects[2] = [enc(`<< /Type /Pages /Kids [${pages.map((_, i) => `${first(i)} 0 R`).join(' ')}] /Count ${pages.length} >>`)];\n pages.forEach((p, i) => {\n const w = p.width * 0.75, h = p.height * 0.75, n = first(i);\n objects[n] = [enc(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${num(w)} ${num(h)}] /Resources << /XObject << /Im0 ${n + 2} 0 R >> >> /Contents ${n + 1} 0 R >>`)];\n const content = `q ${num(w)} 0 0 ${num(h)} 0 0 cm /Im0 Do Q`;\n objects[n + 1] = [enc(`<< /Length ${content.length} >>\\nstream\\n${content}\\nendstream`)];\n objects[n + 2] = [enc(`<< /Type /XObject /Subtype /Image /Width ${p.width} /Height ${p.height} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${p.jpeg.length} >>\\nstream\\n`), p.jpeg, enc('\\nendstream')];\n });\n const infoNo = opts.title !== undefined ? first(pages.length) : 0;\n if (infoNo) objects[infoNo] = [enc(`<< /Title ${textString(opts.title!)} /Producer (pixi-effects) >>`)];\n const count = (infoNo || first(pages.length)) ; // highest object number + 1 is the /Size\n\n const chunks: Uint8Array[] = [enc('%PDF-1.4\\n%\\xe2\\xe3\\xcf\\xd3\\n')];\n let offset = chunks[0]!.length;\n const offsets: number[] = [];\n for (let n = 1; n < count + (infoNo ? 1 : 0); n++) {\n const body = objects[n];\n if (!body) continue;\n offsets[n] = offset;\n const parts = [enc(`${n} 0 obj\\n`), ...body, enc('\\nendobj\\n')];\n for (const part of parts) { chunks.push(part); offset += part.length; }\n }\n const size = (infoNo || first(pages.length)) + (infoNo ? 1 : 0);\n let xref = `xref\\n0 ${size}\\n0000000000 65535 f \\n`;\n for (let n = 1; n < size; n++) xref += `${String(offsets[n] ?? 0).padStart(10, '0')} 00000 n \\n`;\n xref += `trailer\\n<< /Size ${size} /Root 1 0 R${infoNo ? ` /Info ${infoNo} 0 R` : ''} >>\\nstartxref\\n${offset}\\n%%EOF\\n`;\n chunks.push(enc(xref));\n\n const total = chunks.reduce((sum, c) => sum + c.length, 0);\n const out = new Uint8Array(total);\n let at = 0;\n for (const c of chunks) { out.set(c, at); at += c.length; }\n return out;\n}\n","import type { Movie, MotionBlurSpec, Stop, SnapshotOptions } from '../index';\nimport { warnUnknownOptions } from '../index';\nimport { pictureStops, changedFraction } from './stops';\nimport { buildPdf } from './pdf';\n\n/** One picture of a stop (see `stopImages()`). */\nexport interface StopImage { stop: Stop; /** The page it belongs to (0-based). */ page: number; image: Blob | string }\n\nexport interface StopImagesOptions {\n /** One picture per page (default) or one per stop. */\n which?: 'pages' | 'stops';\n /** With `which: 'pages'`: the page's last stop (default: the page fully built) or its first. */\n pick?: 'last' | 'first';\n /** Output size relative to the canvas. Default 1. */\n scale?: number;\n /** `'image/png'` (default) or `'image/jpeg'`. */\n type?: 'image/png' | 'image/jpeg';\n /** JPEG quality, 0–1. */\n quality?: number;\n /** Return `data:` URLs instead of Blobs. */\n as?: 'blob' | 'dataURL';\n /** Motion blur for the pictures (off unless you ask: they are usually for looking at). */\n motionBlur?: MotionBlurSpec;\n /** Pictures for a PDF: stops flagged `pdf: false` are left out (a page whose stops are all flagged has no picture). `exportPDF` sets it. */\n pdf?: boolean;\n /** Called as each picture is ready, in order. */\n onImage?: (image: StopImage) => void;\n}\n\nexport interface InspectStopsReport {\n stops: Array<{ index: number; page: string | null; at: number; frame: number; moving: number; settled: boolean }>;\n issues: string[];\n}\n\nfunction requireReady(movie: Movie, what: string): void {\n if (!movie.isReady) throw new Error(`pixi-effects: ${what}() needs a ready movie — await movie.init(...) first`);\n}\n\n/**\n * A picture of the settled state of each page (default: the page's last stop, fully built) or of every stop, for a page list, an\n * overview, an export. Pauses the movie, and leaves the playhead where it was. `onImage` is called as each picture is ready.\n */\nexport async function stopImages(movie: Movie, opts: StopImagesOptions & { as: 'dataURL' }): Promise<Array<StopImage & { image: string }>>;\nexport async function stopImages(movie: Movie, opts?: StopImagesOptions): Promise<StopImage[]>;\nexport async function stopImages(movie: Movie, opts: StopImagesOptions = {}): Promise<StopImage[]> {\n warnUnknownOptions('stopImages()', opts, ['which', 'pick', 'scale', 'type', 'quality', 'as', 'motionBlur', 'pdf', 'onImage']);\n requireReady(movie, 'stopImages');\n if (movie.stops.length === 0) return [];\n const picks = pictureStops(movie.stops, { which: opts.which, pick: opts.pick, pdf: opts.pdf });\n const shot = { scale: opts.scale ?? 1, type: opts.type ?? 'image/png', quality: opts.quality, as: opts.as ?? 'blob', motionBlur: opts.motionBlur === undefined ? false : opts.motionBlur };\n return movie.peek(async () => {\n const out: StopImage[] = [];\n for (const stop of picks) {\n const image = await movie.snapshot(stop.frame, shot as SnapshotOptions & { as: 'dataURL' });\n const item: StopImage = { stop, page: stop.pageIndex, image };\n out.push(item);\n opts.onImage?.(item);\n }\n return out;\n });\n}\n\n/**\n * Look at every stop: is the picture there still changing? A stop is compared with the picture `lookback` frames before it (default 3):\n * when more than `tolerance` (default 0.4 %) of the picture differs, the audience, a page overview and a PDF all see a half-finished\n * animation. `issues` says which stop, which page and what to do; leaves the playhead where it was.\n */\nexport async function inspectStops(movie: Movie, opts: { lookback?: number; tolerance?: number } = {}): Promise<InspectStopsReport> {\n warnUnknownOptions('inspectStops()', opts, ['lookback', 'tolerance']);\n requireReady(movie, 'inspectStops');\n const out: InspectStopsReport = { stops: [], issues: [] };\n if (movie.stops.length === 0) return out;\n const lookback = Math.max(1, Math.round(opts.lookback ?? 3));\n const tolerance = opts.tolerance ?? 0.004;\n const small = Math.min(1, 320 / Math.max(1, movie.width)); // pictures about 320 px wide, no blur: they are only compared\n const pixels = async (frame: number): Promise<Uint8ClampedArray> => (await movie.snapshot(frame, { scale: small, motionBlur: false, as: 'imageData' })).data;\n return movie.peek(async () => {\n for (const stop of movie.stops) {\n const before = Math.max(0, stop.frame - lookback);\n let moving = 0;\n if (before < stop.frame) {\n const now = await pixels(stop.frame);\n moving = changedFraction(now, await pixels(before));\n }\n const settled = moving <= tolerance;\n out.stops.push({ index: stop.index, page: stop.page, at: stop.at, frame: stop.frame, moving, settled });\n if (!settled) {\n out.issues.push(`stop ${stop.index + 1}${stop.page ? ` (page \"${stop.page}\")` : ''} at ${stop.at.toFixed(1)} s: the picture is still changing there (${moving < 0.1 ? (moving * 100).toFixed(1) : Math.round(moving * 100)}% of it changed in the last ${stop.frame - before} frames), so the audience, the page overview and a PDF see it mid-animation. Move the stop to after the animation has finished, or flag a settled stop of the page with \\`pdf: true\\`.`);\n }\n }\n return out;\n });\n}\n\n/**\n * The deck as a PDF: one page per page of the talk (the page's last stop, fully built, unless a stop says `pdf: true` or `pdf: false`;\n * `which: 'stops'` makes a page of every stop that is not `pdf: false`), each a\n * JPEG at the canvas size. Needs `composition.stops`. A transparent background comes out black: give the movie a `background`.\n */\nexport async function exportPDF(movie: Movie, opts: { which?: 'pages' | 'stops'; pick?: 'last' | 'first'; scale?: number; quality?: number; title?: string; motionBlur?: MotionBlurSpec; onImage?: (image: StopImage) => void } = {}): Promise<Blob> {\n warnUnknownOptions('exportPDF()', opts, ['which', 'pick', 'scale', 'quality', 'title', 'motionBlur', 'onImage']);\n requireReady(movie, 'exportPDF');\n if (movie.stops.length === 0) throw new Error('pixi-effects: exportPDF(): this movie has no stops, so there are no pages; add `stops` to the composition (or build it with deck())');\n const scale = opts.scale ?? 1;\n const images = await stopImages(movie, {\n which: opts.which, pick: opts.pick, scale, type: 'image/jpeg', quality: opts.quality ?? 0.92, as: 'blob', motionBlur: opts.motionBlur, pdf: true, onImage: opts.onImage,\n });\n const pages = await Promise.all(images.map(async i => ({\n jpeg: new Uint8Array(await (i.image as Blob).arrayBuffer()), width: Math.max(1, Math.round(movie.width * scale)), height: Math.max(1, Math.round(movie.height * scale)),\n })));\n return new Blob([buildPdf(pages, { title: opts.title }) as unknown as BlobPart], { type: 'application/pdf' });\n}\n","import type { Movie, Stop } from '../index';\nimport { warnUnknownOptions } from '../index';\nimport * as nav from './navigation';\nimport type { StopEvent } from './navigation';\nimport { stopImages } from './images';\n\nexport interface PresenterOptions {\n canvas: HTMLCanvasElement;\n /** Keys on the page: arrows, Space, Enter, PageUp / PageDown, Home / End, page number + Enter, B / W, F, ?, Esc. Default true. */\n keyboard?: boolean;\n /** A click (or tap) on the picture is \"next\". Default true. */\n clickToAdvance?: boolean;\n /** A swipe to the left is \"next\", to the right \"back\" (touch screens). Default true. */\n swipe?: boolean;\n /** The page counter, the page name and a progress line (they fade out when nothing happens). Default true. */\n indicator?: boolean;\n /** Stops with `advance: seconds` move on by themselves. Default true. */\n autoAdvance?: boolean;\n /** Run off the end: go back to the start and play again (a kiosk, a looping demo). Default false. */\n loop?: boolean;\n /** The accent of the progress line (any CSS colour). */\n accent?: string;\n /** Called when the audience-facing session is over: Escape with nothing left to close, or fullscreen left. (`Controller`'s Present button uses it to bring its bar back.) */\n onExit?: () => void;\n}\n\nconst OPTION_KEYS = ['canvas', 'keyboard', 'clickToAdvance', 'swipe', 'indicator', 'autoAdvance', 'loop', 'accent', 'onExit'] as const;\nconst NEXT_KEYS = new Set(['ArrowRight', 'ArrowDown', ' ', 'Enter', 'PageDown']);\nconst PREV_KEYS = new Set(['ArrowLeft', 'ArrowUp', 'Backspace', 'PageUp']);\nconst clock = (ms: number): string => { const s = Math.floor(ms / 1000); return `${String(Math.floor(s / 60)).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}`; };\nconst IDLE_MS = 2500;\nconst DIGITS_MS = 2000;\nconst SWIPE_PX = 50;\n\nconst CSS = `\n.movie-presenter { position: absolute; inset: 0; z-index: 3; pointer-events: none; font: 500 13px/1.3 system-ui, -apple-system, 'Helvetica Neue', Arial, sans-serif; color: #fff; }\n.movie-presenter .mp-info { position: absolute; left: 50%; bottom: 14px; transform: translateX(-50%); white-space: nowrap; display: flex; align-items: baseline; gap: 12px; padding: 6px 12px; border-radius: 999px; background: rgba(0, 0, 0, 0.45); transition: opacity 0.4s ease; }\n.movie-presenter .mp-title { opacity: 0.75; }\n.movie-presenter .mp-title:empty { display: none; }\n.movie-presenter .mp-counter { font-variant-numeric: tabular-nums; letter-spacing: 0.04em; }\n.movie-presenter .mp-progress { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: rgba(255, 255, 255, 0.14); transition: opacity 0.4s ease; }\n.movie-presenter .mp-progress::after { content: ''; position: absolute; inset: 0; background: var(--mp-accent, #ffffff); transform-origin: 0 50%; transform: scaleX(var(--mp-fill, 0)); transition: transform 0.4s ease; }\n.movie-presenter[data-idle=\"true\"] .mp-info, .movie-presenter[data-idle=\"true\"] .mp-progress { opacity: 0; }\n.movie-presenter .mp-cover { position: absolute; inset: 0; z-index: 4; opacity: 0; pointer-events: none; background: #000; transition: opacity 0.25s ease; }\n.movie-presenter .mp-cover[data-mode=\"black\"] { opacity: 1; pointer-events: auto; background: #000; }\n.movie-presenter .mp-cover[data-mode=\"white\"] { opacity: 1; pointer-events: auto; background: #fff; }\n.movie-presenter .mp-jump { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); padding: 10px 22px; border-radius: 12px; background: rgba(0, 0, 0, 0.6); font-size: 34px; font-weight: 600; letter-spacing: 0.06em; opacity: 0; transition: opacity 0.15s ease; }\n.movie-presenter .mp-jump[data-active=\"true\"] { opacity: 1; }\n.movie-presenter .mp-help { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); z-index: 5; padding: 18px 26px; border-radius: 14px; background: rgba(12, 14, 24, 0.92); box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5); pointer-events: auto; }\n.movie-presenter .mp-help[data-open=\"false\"] { display: none; }\n.movie-presenter .mp-help h3 { margin: 0 0 10px; font-size: 13px; letter-spacing: 0.12em; opacity: 0.7; }\n.movie-presenter .mp-help dl { display: grid; grid-template-columns: auto auto; gap: 6px 22px; margin: 0; }\n.movie-presenter .mp-help dt { opacity: 0.95; font-weight: 600; white-space: nowrap; }\n.movie-presenter .mp-help dd { margin: 0; opacity: 0.75; }\n.movie-presenter .mp-wait { position: absolute; inset: 0; z-index: 7; display: grid; place-items: center; background: #000; font-size: 13px; letter-spacing: 0.4em; opacity: 0.9; padding-left: 0.4em; }\n.movie-presenter .mp-wait[data-open=\"false\"] { display: none; }\n.movie-presenter .mp-overview { position: absolute; inset: 0; z-index: 6; display: flex; flex-direction: column; gap: 14px; padding: 26px 30px 18px; overflow: auto; background: rgba(8, 10, 18, 0.985); pointer-events: auto; }\n.movie-presenter .mp-overview[data-open=\"false\"] { display: none; }\n.movie-presenter .mp-grid { display: grid; grid-template-columns: repeat(var(--mp-cols, 3), minmax(0, 1fr)); gap: 14px; }\n.movie-presenter .mp-cell { position: relative; aspect-ratio: var(--mp-ratio, 16 / 9); overflow: hidden; border-radius: 8px; background: #000; border: 2px solid transparent; cursor: pointer; }\n.movie-presenter .mp-cell img { display: block; width: 100%; height: 100%; object-fit: cover; }\n.movie-presenter .mp-cell[data-current=\"true\"] { border-color: rgba(255, 255, 255, 0.45); }\n.movie-presenter .mp-cell[data-selected=\"true\"] { border-color: var(--mp-accent, #ffffff); box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.18); }\n.movie-presenter .mp-cell-label { position: absolute; left: 0; right: 0; bottom: 0; display: flex; gap: 8px; align-items: baseline; padding: 18px 10px 7px; background: linear-gradient(to top, rgba(0, 0, 0, 0.7), transparent); font-size: 12px; }\n.movie-presenter .mp-cell-num { font-weight: 700; font-variant-numeric: tabular-nums; }\n.movie-presenter .mp-cell-name { opacity: 0.85; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.movie-presenter .mp-overview-hint { margin-top: auto; opacity: 0.55; font-size: 12px; letter-spacing: 0.04em; }\n[data-pr-wrap] .movie-controller { display: none !important; }\n[data-pr-wrap]:fullscreen { width: 100vw; height: 100vh; display: flex; align-items: center; justify-content: center; background: #000; }\n[data-pr-wrap]:fullscreen > canvas { width: 100% !important; height: 100% !important; max-width: none !important; max-height: none !important; object-fit: contain; border-radius: 0; }\n@media (prefers-reduced-motion: reduce) { .movie-presenter * { transition: none !important; } }\n`;\nfunction installStyles(): void {\n if (typeof document === 'undefined' || document.head.querySelector('style[data-movie-presenter]')) return;\n const el = document.createElement('style');\n el.setAttribute('data-movie-presenter', '');\n el.textContent = CSS;\n document.head.appendChild(el);\n}\n\nconst HELP: Array<[string, string]> = [\n ['→ ↓ Space Enter PageDown click', 'next (plays to the next stop)'],\n ['← ↑ Backspace PageUp', 'back one stop'],\n ['Home / End', 'first page / last stop'],\n ['number, then Enter', 'jump to that page'],\n ['B or .', 'black screen'],\n ['W or ,', 'white screen'],\n ['G', 'overview of all pages (arrows + Enter, or click)'],\n ['P', 'presenter view: notes, next picture, timer (a second window)'],\n ['F', 'fullscreen'],\n ['Esc', 'close this / black screen / fullscreen'],\n ['swipe ← →', 'next / back (touch)'],\n];\n\nconst VIEW_CSS = `\nhtml, body { margin: 0; height: 100%; background: #0c0e16; color: #e8ecf8; font: 500 15px/1.4 system-ui, -apple-system, 'Helvetica Neue', Arial, sans-serif; }\n.pv { display: grid; grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr); gap: 18px; height: 100%; padding: 18px; box-sizing: border-box; }\n.pv-label { margin: 0 0 6px; font-size: 11px; font-weight: 700; letter-spacing: 0.18em; opacity: 0.55; }\n.pv-main { display: flex; flex-direction: column; min-height: 0; }\n.pv-now { width: 100%; height: auto; background: #000; border-radius: 8px; }\n.pv-side { display: flex; flex-direction: column; gap: 12px; min-height: 0; }\n.pv-top { display: flex; align-items: baseline; gap: 14px; }\n.pv-count { font-size: 30px; font-weight: 700; font-variant-numeric: tabular-nums; }\n.pv-title { flex: 1; opacity: 0.75; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.pv-timer { font-size: 30px; font-weight: 600; font-variant-numeric: tabular-nums; letter-spacing: 0.04em; }\n.pv-nextbox { position: relative; aspect-ratio: var(--pv-ratio, 16 / 9); background: #000; border-radius: 8px; overflow: hidden; }\n.pv-next { display: block; width: 100%; height: 100%; object-fit: cover; }\n.pv-nextbox[data-end=\"true\"] .pv-next { display: none; }\n.pv-end { position: absolute; inset: 0; display: none; place-items: center; opacity: 0.6; letter-spacing: 0.2em; font-size: 12px; }\n.pv-nextbox[data-end=\"true\"] .pv-end { display: grid; }\n.pv-notes { flex: 1; min-height: 80px; overflow: auto; padding: 12px 14px; border-radius: 8px; background: #151927; font-size: 20px; line-height: 1.5; white-space: pre-wrap; }\n.pv-notes[data-empty=\"true\"] { opacity: 0.4; font-size: 14px; }\n.pv-notes[data-empty=\"true\"]::before { content: 'No notes for this page.'; }\n.pv-buttons { display: flex; gap: 10px; }\n.pv button { font: inherit; color: inherit; border: 0; border-radius: 8px; padding: 10px 16px; background: #232a40; cursor: pointer; }\n.pv button:hover { background: #2e3754; }\n.pv .pv-nextbtn { flex: 1; background: #3b5bdb; font-weight: 600; }\n.pv .pv-nextbtn:hover { background: #4c6ef5; }\n.pv .pv-reset { padding: 4px 10px; font-size: 12px; opacity: 0.7; }\n`;\n\n/**\n * A presentation player for a movie with `stops` (`composition.stops`): it stops where the stops are, and moves on with the keys,\n * a click, a tap or a swipe, like slides with animation. It draws only a small page counter, the page name and a progress line (they\n * fade out when idle), and a black / white screen, a list of keys (`?`) and fullscreen (`F`). Use it instead of `Controller` on the page.\n */\nexport class Presenter {\n readonly movie: Movie;\n readonly options: Required<Omit<PresenterOptions, 'accent' | 'onExit'>> & { accent?: string; onExit?: () => void };\n\n private box: HTMLElement;\n private wrappedHere = false;\n private root: HTMLDivElement;\n private counterEl: HTMLElement | null = null;\n private titleEl: HTMLElement | null = null;\n private progressEl: HTMLElement | null = null;\n private coverEl!: HTMLElement;\n private helpEl!: HTMLElement;\n private jumpEl!: HTMLElement;\n private idleTimer: ReturnType<typeof setTimeout> | null = null;\n private digitsTimer: ReturnType<typeof setTimeout> | null = null;\n private advanceTimer: ReturnType<typeof setTimeout> | null = null;\n private loopTimer: ReturnType<typeof setTimeout> | null = null;\n private overviewEl!: HTMLElement;\n private gridEl!: HTMLElement;\n private overviewSel = 0;\n /** A picture of every stop (by stop index), made once before the talk: for the overview and the presenter view's \"next\". */\n private thumbs = new Map<number, string>();\n private thumbsPromise: Promise<void> | null = null;\n private waitEl!: HTMLElement;\n private view: { win: Window; timer: ReturnType<typeof setInterval>; started: number; els: Record<string, HTMLElement>; onClose: () => void } | null = null;\n private digits = '';\n private downAt: { x: number; y: number } | null = null;\n private swiped = false;\n private canvasCursor = '';\n private destroyed = false;\n private wasWrapAttr = false;\n\n private onKey = (e: KeyboardEvent) => this.handleKey(e);\n private onStop = (e: StopEvent) => this.handleStop(e);\n private offStop: (() => void) | null = null;\n private onSeeked = () => this.refresh();\n private onFrame = () => this.mirror();\n private onEnded = () => this.handleEnded();\n private onPointerDown = (e: PointerEvent) => { this.downAt = { x: e.clientX, y: e.clientY }; this.swiped = false; };\n private onPointerUp = (e: PointerEvent) => this.handlePointerUp(e);\n private onPointerMove = () => this.wake();\n private onClick = () => this.handleClick();\n private wasFullscreen = false;\n private onFullscreenChange = () => {\n const now = document.fullscreenElement === this.box;\n if (this.wasFullscreen && !now) this.options.onExit?.();\n this.wasFullscreen = now;\n };\n\n constructor(movie: Movie, options: PresenterOptions) {\n if (!options || !options.canvas) throw new Error('Presenter requires options.canvas (HTMLCanvasElement).');\n warnUnknownOptions('Presenter', options, OPTION_KEYS);\n this.movie = movie;\n this.options = {\n canvas: options.canvas, keyboard: options.keyboard ?? true, clickToAdvance: options.clickToAdvance ?? true, swipe: options.swipe ?? true,\n indicator: options.indicator ?? true, autoAdvance: options.autoAdvance ?? true, loop: options.loop ?? false, accent: options.accent, onExit: options.onExit,\n };\n if ((movie.stops?.length ?? 0) === 0) {\n console.warn('pixi-effects: Presenter: this movie has no stops, so there is nowhere to pause; add `stops: [2, 5, 9]` (seconds) to the composition. next() and back still work.');\n }\n installStyles();\n const canvas = this.options.canvas;\n this.box = this.positioningBox(canvas);\n this.wasWrapAttr = this.box.hasAttribute('data-pr-wrap');\n this.box.setAttribute('data-pr-wrap', '');\n this.root = document.createElement('div');\n this.root.className = 'movie-presenter';\n this.root.setAttribute('data-idle', 'false');\n if (this.options.accent) this.root.style.setProperty('--mp-accent', this.options.accent);\n this.root.innerHTML = `\n ${this.options.indicator ? '<div class=\"mp-progress\"></div><div class=\"mp-info\"><span class=\"mp-title\"></span><span class=\"mp-counter\"></span></div>' : ''}\n <div class=\"mp-wait\" data-open=\"false\">Preparing…</div>\n <div class=\"mp-jump\" data-active=\"false\"></div>\n <div class=\"mp-overview\" data-open=\"false\" role=\"dialog\" aria-label=\"Pages\"><div class=\"mp-grid\"></div><div class=\"mp-overview-hint\">← → ↑ ↓ choose · Enter or click: go · G or Esc: close</div></div>\n <div class=\"mp-cover\" data-mode=\"off\"></div>\n <div class=\"mp-help\" data-open=\"false\" role=\"dialog\" aria-label=\"Keys\"><h3>KEYS</h3><dl>${HELP.map(([k, d]) => `<dt>${k}</dt><dd>${d}</dd>`).join('')}</dl></div>`;\n this.box.appendChild(this.root);\n this.counterEl = this.root.querySelector('.mp-counter');\n this.titleEl = this.root.querySelector('.mp-title');\n this.progressEl = this.root.querySelector('.mp-progress');\n this.coverEl = this.root.querySelector('.mp-cover') as HTMLElement;\n this.helpEl = this.root.querySelector('.mp-help') as HTMLElement;\n this.jumpEl = this.root.querySelector('.mp-jump') as HTMLElement;\n this.waitEl = this.root.querySelector('.mp-wait') as HTMLElement;\n this.overviewEl = this.root.querySelector('.mp-overview') as HTMLElement;\n this.gridEl = this.root.querySelector('.mp-grid') as HTMLElement;\n this.coverEl.addEventListener('click', () => this.setCover('off'));\n\n this.canvasCursor = canvas.style.cursor;\n if (this.options.clickToAdvance) { canvas.style.cursor = 'pointer'; canvas.addEventListener('click', this.onClick); }\n if (this.options.swipe) { canvas.addEventListener('pointerdown', this.onPointerDown); canvas.addEventListener('pointerup', this.onPointerUp); }\n canvas.addEventListener('pointermove', this.onPointerMove);\n if (this.options.keyboard) document.addEventListener('keydown', this.onKey);\n document.addEventListener('fullscreenchange', this.onFullscreenChange);\n this.offStop = nav.onStop(movie, this.onStop);\n movie.on('seeked', this.onSeeked);\n movie.on('ended', this.onEnded);\n this.refresh();\n this.wake();\n }\n\n /** Enter presentation: ask for fullscreen (a browser needs a click or key press for that) and play to the first stop. */\n async start(): Promise<void> {\n this.waitEl.setAttribute('data-open', 'true'); // \"Preparing\": the pictures are made before the audience sees a thing\n try { await this.ensureThumbs(); } finally { this.waitEl.setAttribute('data-open', 'false'); }\n await this.enterFullscreen();\n await this.next();\n }\n\n /** Leave fullscreen. */\n async exit(): Promise<void> {\n if (document.fullscreenElement === this.box) await document.exitFullscreen?.().catch(() => {});\n }\n\n next(): Promise<void> { this.cancelAdvance(); return this.run(() => nav.next(this.movie)); }\n prev(): Promise<void> { this.cancelAdvance(); return this.run(() => nav.prev(this.movie)); }\n\n /** Black out (`'black'`), white out (`'white'`) or bring the picture back (`'off'`). */\n setCover(mode: 'black' | 'white' | 'off'): void {\n this.coverEl.setAttribute('data-mode', mode);\n if (mode !== 'off') this.cancelAdvance();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n const canvas = this.options.canvas;\n document.removeEventListener('keydown', this.onKey);\n document.removeEventListener('fullscreenchange', this.onFullscreenChange);\n canvas.removeEventListener('click', this.onClick);\n canvas.removeEventListener('pointerdown', this.onPointerDown);\n canvas.removeEventListener('pointerup', this.onPointerUp);\n canvas.removeEventListener('pointermove', this.onPointerMove);\n this.closePresenterView();\n this.offStop?.(); this.offStop = null;\n this.movie.off('seeked', this.onSeeked);\n this.movie.off('ended', this.onEnded);\n for (const t of [this.idleTimer, this.digitsTimer, this.advanceTimer, this.loopTimer]) if (t) clearTimeout(t);\n canvas.style.cursor = this.canvasCursor;\n this.root.remove();\n if (!this.wasWrapAttr) this.box.removeAttribute('data-pr-wrap');\n if (this.wrappedHere) {\n const parent = this.box.parentElement;\n if (parent) { parent.insertBefore(canvas, this.box); this.box.remove(); }\n }\n }\n\n // ── internals ──\n\n private positioningBox(canvas: HTMLCanvasElement): HTMLElement {\n const parent = canvas.parentElement;\n if (!parent) throw new Error('Presenter: canvas must be attached to the DOM before constructing.');\n const pos = getComputedStyle(parent).position;\n if (pos === 'relative' || pos === 'absolute' || pos === 'fixed' || pos === 'sticky') return parent;\n const wrap = document.createElement('div');\n wrap.className = 'movie-presenter-wrap';\n wrap.style.cssText = 'position: relative; display: inline-block; line-height: 0;';\n parent.insertBefore(wrap, canvas);\n wrap.appendChild(canvas);\n this.wrappedHere = true;\n return wrap;\n }\n\n private run(fn: () => Promise<void>): Promise<void> {\n return fn().catch(err => { console.warn('pixi-effects: Presenter:', err); });\n }\n\n private async enterFullscreen(): Promise<void> {\n const box = this.box as HTMLElement & { requestFullscreen?: () => Promise<void> };\n try { await box.requestFullscreen?.(); } catch { /* the browser said no (no gesture, or iPhone Safari): present in the page */ }\n }\n\n private toggleFullscreen(): void {\n if (document.fullscreenElement === this.box) void this.exit();\n else void this.enterFullscreen();\n }\n\n private cancelAdvance(): void {\n if (this.advanceTimer) { clearTimeout(this.advanceTimer); this.advanceTimer = null; }\n if (this.loopTimer) { clearTimeout(this.loopTimer); this.loopTimer = null; }\n }\n\n private handleStop(e: StopEvent): void {\n this.refresh();\n this.cancelAdvance();\n if (this.options.autoAdvance && e.stop.advance !== undefined && this.coverEl.getAttribute('data-mode') === 'off') {\n this.advanceTimer = setTimeout(() => { this.advanceTimer = null; void this.next(); }, e.stop.advance * 1000);\n }\n }\n\n private handleEnded(): void {\n this.refresh();\n if (!this.options.loop) return;\n this.cancelAdvance();\n this.loopTimer = setTimeout(() => {\n this.loopTimer = null;\n void this.run(async () => { await this.movie.gotoFrame(0, true); await nav.next(this.movie); });\n }, 800);\n }\n\n private refresh(): void {\n const m = this.movie;\n const pages = nav.pageCount(m), stops = m.stops?.length ?? 0;\n if (this.counterEl) {\n this.counterEl.textContent = pages > 0 ? `${nav.pageIndex(m) >= 0 ? nav.pageIndex(m) + 1 : '–'} / ${pages}` : '';\n this.counterEl.style.display = pages > 0 ? '' : 'none';\n }\n if (this.titleEl) this.titleEl.textContent = nav.currentStop(m)?.page ?? '';\n if (this.progressEl) this.progressEl.style.setProperty('--mp-fill', String(stops > 0 ? (nav.stopIndex(m) + 1) / stops : 0));\n this.refreshView();\n }\n\n private wake(): void {\n this.root.setAttribute('data-idle', 'false');\n if (this.options.clickToAdvance) this.options.canvas.style.cursor = 'pointer';\n if (this.idleTimer) clearTimeout(this.idleTimer);\n this.idleTimer = setTimeout(() => {\n this.root.setAttribute('data-idle', 'true');\n this.options.canvas.style.cursor = 'none';\n }, IDLE_MS);\n }\n\n private showDigits(): void {\n this.jumpEl.textContent = this.digits ? `→ ${this.digits}` : '';\n this.jumpEl.setAttribute('data-active', this.digits ? 'true' : 'false');\n if (this.digitsTimer) clearTimeout(this.digitsTimer);\n this.digitsTimer = this.digits ? setTimeout(() => { this.digits = ''; this.showDigits(); }, DIGITS_MS) : null;\n }\n\n /** Something that moves the presentation: if the screen is blacked out (or the key list is open) the first press only brings it back. */\n private navigate(go: () => void): void {\n if (this.coverEl.getAttribute('data-mode') !== 'off') { this.setCover('off'); return; }\n if (this.helpEl.getAttribute('data-open') === 'true') { this.helpEl.setAttribute('data-open', 'false'); return; }\n go();\n }\n\n private handleKey(e: KeyboardEvent): void {\n if (this.destroyed || e.ctrlKey || e.metaKey || e.altKey) return;\n const t = e.target as HTMLElement | null;\n if (t && (t.tagName === 'INPUT' || t.tagName === 'TEXTAREA' || t.tagName === 'SELECT' || t.isContentEditable)) return;\n const k = e.key;\n let handled = true;\n this.wake();\n if (k === 'g' || k === 'G') { this.toggleOverview(); e.preventDefault(); return; }\n if (this.overviewOpen()) { if (this.handleOverviewKey(e)) e.preventDefault(); return; }\n if (k >= '0' && k <= '9' && k.length === 1) { this.digits = (this.digits + k).slice(0, 4); this.showDigits(); }\n else if (k === 'Enter' && this.digits) {\n const page = Number(this.digits) - 1; this.digits = ''; this.showDigits();\n this.navigate(() => { this.cancelAdvance(); void this.run(() => nav.goToPage(this.movie, page)); });\n }\n else if (k === 'Backspace' && this.digits) { this.digits = this.digits.slice(0, -1); this.showDigits(); }\n else if (NEXT_KEYS.has(k)) this.navigate(() => void this.next());\n else if (PREV_KEYS.has(k)) this.navigate(() => void this.prev());\n else if (k === 'Home') this.navigate(() => { this.cancelAdvance(); void this.run(() => nav.goToPage(this.movie, 0)); });\n else if (k === 'End') this.navigate(() => { this.cancelAdvance(); void this.run(() => nav.goToStop(this.movie, Math.max(0, (this.movie.stops?.length ?? 1) - 1))); });\n else if (k === 'b' || k === 'B' || k === '.') this.setCover(this.coverEl.getAttribute('data-mode') === 'black' ? 'off' : 'black');\n else if (k === 'w' || k === 'W' || k === ',') this.setCover(this.coverEl.getAttribute('data-mode') === 'white' ? 'off' : 'white');\n else if (k === 'p' || k === 'P') this.togglePresenterView();\n else if (k === 'f' || k === 'F') this.toggleFullscreen();\n else if (k === '?' || k === 'h' || k === 'H') this.helpEl.setAttribute('data-open', this.helpEl.getAttribute('data-open') === 'true' ? 'false' : 'true');\n else if (k === 'Escape') {\n if (this.helpEl.getAttribute('data-open') === 'true') this.helpEl.setAttribute('data-open', 'false');\n else if (this.coverEl.getAttribute('data-mode') !== 'off') this.setCover('off');\n else if (this.digits) { this.digits = ''; this.showDigits(); }\n else if (document.fullscreenElement === this.box) handled = false; // the browser's own Escape leaves fullscreen (and the change ends the session)\n else if (this.options.onExit) this.options.onExit();\n }\n else handled = false;\n if (handled) e.preventDefault();\n }\n\n // ── the presenter view: a second window for the speaker ──\n\n private togglePresenterView(): void {\n if (this.view && !this.view.win.closed) this.closePresenterView();\n else this.openPresenterView();\n }\n\n /** Open the speaker's window: what is on screen (live), the next picture, the notes of the page, a timer, and next / back. Returns it (null if the browser blocked the popup). */\n openPresenterView(): Window | null {\n if (this.view && !this.view.win.closed) { this.view.win.focus(); return this.view.win; }\n this.closePresenterView();\n const win = window.open('', 'pixi-effects-presenter-view', 'popup=yes,width=1180,height=720');\n if (!win) { console.warn('pixi-effects: Presenter: the browser blocked the presenter view popup; allow popups for this page and press P again.'); return null; }\n const doc = win.document;\n doc.title = 'Presenter view';\n const style = doc.createElement('style');\n style.textContent = VIEW_CSS;\n doc.head.appendChild(style);\n const { width, height } = this.options.canvas;\n doc.body.innerHTML = `<div class=\"pv\" style=\"--pv-ratio: ${width} / ${height}\">\n <div class=\"pv-main\"><div class=\"pv-label\">NOW</div><canvas class=\"pv-now\" width=\"${Math.min(width, 960)}\" height=\"${Math.round(height * Math.min(width, 960) / width)}\"></canvas></div>\n <div class=\"pv-side\">\n <div class=\"pv-top\"><span class=\"pv-count\"></span><span class=\"pv-title\"></span><span class=\"pv-timer\">00:00</span><button class=\"pv-reset\" type=\"button\">reset</button></div>\n <div><div class=\"pv-label\">NEXT</div><div class=\"pv-nextbox\" data-end=\"false\"><img class=\"pv-next\" alt=\"\"><div class=\"pv-end\">END OF THE TALK</div></div></div>\n <div class=\"pv-notes\" data-empty=\"true\"></div>\n <div class=\"pv-buttons\"><button class=\"pv-prev\" type=\"button\">◀ Back</button><button class=\"pv-nextbtn\" type=\"button\">Next ▶</button></div>\n </div></div>`;\n const els: Record<string, HTMLElement> = {};\n for (const c of ['count', 'title', 'timer', 'next', 'nextbox', 'notes', 'now']) els[c] = doc.querySelector(`.pv-${c}`) as HTMLElement;\n const started = Date.now();\n const onClose = () => { if (this.view && this.view.win === win) this.closePresenterView(); };\n const timer = setInterval(() => { els.timer!.textContent = clock(Date.now() - this.view!.started); }, 1000);\n this.view = { win, timer, started, els, onClose };\n (doc.querySelector('.pv-nextbtn') as HTMLElement).addEventListener('click', () => void this.next());\n (doc.querySelector('.pv-prev') as HTMLElement).addEventListener('click', () => void this.prev());\n (doc.querySelector('.pv-reset') as HTMLElement).addEventListener('click', () => { this.view!.started = Date.now(); els.timer!.textContent = '00:00'; });\n if (this.options.keyboard) doc.addEventListener('keydown', this.onKey);\n win.addEventListener?.('pagehide', onClose);\n this.movie.on('frame', this.onFrame);\n void this.ensureThumbs();\n this.refreshView();\n this.mirror();\n return win;\n }\n\n closePresenterView(): void {\n const v = this.view;\n if (!v) return;\n this.view = null;\n clearInterval(v.timer);\n this.movie.off('frame', this.onFrame);\n try { v.win.document.removeEventListener('keydown', this.onKey); v.win.removeEventListener?.('pagehide', v.onClose); } catch { /* the window is already gone */ }\n if (!v.win.closed) { try { v.win.close(); } catch { /* ignore */ } }\n }\n\n /** Copy what the movie has just drawn into the view (called from the `frame` event, right after the render, when the canvas can be read). */\n private mirror(): void {\n const v = this.view;\n if (!v || v.win.closed) return;\n const c = v.els.now as HTMLCanvasElement;\n c.getContext('2d')?.drawImage(this.options.canvas, 0, 0, c.width, c.height);\n }\n\n private refreshView(): void {\n const v = this.view;\n if (!v || v.win.closed) return;\n const m = this.movie;\n const stops = m.stops ?? [];\n const pages = nav.pageCount(m);\n const cur = nav.stopIndex(m);\n v.els.count!.textContent = pages > 0 ? `${nav.pageIndex(m) >= 0 ? nav.pageIndex(m) + 1 : '–'} / ${pages}` : '';\n v.els.title!.textContent = nav.currentStop(m)?.page ?? (cur < 0 ? stops[0]?.page ?? '' : '');\n // the notes of the page the talk is in (before the first stop: of the first page, \"coming up\"): the latest ones written on or before this stop\n const upTo = cur < 0 ? 0 : cur, pageIndex = stops[upTo]?.pageIndex;\n let notes = '';\n for (const s of stops) if (s.pageIndex === pageIndex && s.index <= upTo && s.notes) notes = s.notes;\n v.els.notes!.textContent = notes;\n v.els.notes!.setAttribute('data-empty', String(notes === ''));\n const next = stops[cur + 1];\n v.els.nextbox!.setAttribute('data-end', String(!next));\n const src = next ? this.thumbs.get(next.index) : undefined;\n if (src) v.els.next!.setAttribute('src', src); else v.els.next!.removeAttribute('src');\n }\n\n // ── the overview ──\n\n private pageStops(): Stop[] { return (this.movie.stops ?? []).filter(s => s.pageStart); }\n private overviewOpen(): boolean { return this.overviewEl.getAttribute('data-open') === 'true'; }\n\n private toggleOverview(): void {\n if (this.overviewOpen()) { this.overviewEl.setAttribute('data-open', 'false'); return; }\n if (this.pageStops().length === 0) return;\n this.cancelAdvance();\n if (this.movie.isPlaying) this.movie.pause();\n this.helpEl.setAttribute('data-open', 'false');\n this.buildOverview();\n this.overviewEl.setAttribute('data-open', 'true');\n void this.ensureThumbs();\n }\n\n /**\n * Make a picture of every stop, once. Taking them moves the playhead through the stops and back, which the audience would see:\n * `start()` does it before anything is shown (behind a \"Preparing\" cover), and an overview opened before that does it on the spot.\n */\n /** Make the page pictures now (the overview and the presenter view use them): `start()` does it before the audience sees anything. */\n ensureThumbs(): Promise<void> {\n this.thumbsPromise ??= (async () => {\n try {\n await stopImages(this.movie, {\n which: 'stops', as: 'dataURL', type: 'image/jpeg', quality: 0.72, scale: Math.min(1, 480 / Math.max(1, this.options.canvas.width)),\n onImage: img => { this.thumbs.set(img.stop.index, img.image as string); this.onThumb(img.stop.index); },\n });\n } catch (err) {\n console.warn('pixi-effects: Presenter: could not make the page pictures:', err);\n this.thumbsPromise = null;\n }\n })();\n return this.thumbsPromise;\n }\n\n /** A page's picture is its last stop's (the page fully built). */\n private pageThumb(page: number): string | undefined {\n const stops = (this.movie.stops ?? []).filter(s => s.pageIndex === page);\n return stops.length ? this.thumbs.get(stops[stops.length - 1]!.index) : undefined;\n }\n\n private onThumb(stopIndex: number): void {\n const stop = this.movie.stops?.[stopIndex];\n if (stop) this.fillThumb(stop.pageIndex);\n this.refreshView();\n }\n\n private buildOverview(): void {\n const pages = this.pageStops();\n const { width, height } = this.options.canvas;\n const cols = Math.min(5, Math.max(2, Math.ceil(Math.sqrt(pages.length))));\n this.gridEl.style.setProperty('--mp-cols', String(cols));\n this.gridEl.style.setProperty('--mp-ratio', `${width} / ${height}`);\n this.gridEl.innerHTML = '';\n const current = Math.max(0, nav.pageIndex(this.movie));\n pages.forEach((s, i) => {\n const cell = document.createElement('div');\n cell.className = 'mp-cell';\n cell.setAttribute('data-current', String(i === nav.pageIndex(this.movie)));\n cell.setAttribute('data-selected', String(i === current));\n cell.innerHTML = `<div class=\"mp-cell-label\"><span class=\"mp-cell-num\">${i + 1}</span><span class=\"mp-cell-name\"></span></div>`;\n (cell.querySelector('.mp-cell-name') as HTMLElement).textContent = s.page ?? '';\n cell.addEventListener('click', () => { this.overviewEl.setAttribute('data-open', 'false'); this.cancelAdvance(); void this.run(() => nav.goToPage(this.movie, i)); });\n this.gridEl.appendChild(cell);\n this.fillThumb(i);\n });\n this.overviewSel = current;\n }\n\n private fillThumb(page: number): void {\n const cell = this.gridEl.children[page] as HTMLElement | undefined;\n const src = this.pageThumb(page);\n if (!cell || !src || cell.querySelector('img')) return;\n const img = document.createElement('img');\n img.alt = ''; img.src = src;\n cell.insertBefore(img, cell.firstChild);\n }\n\n private select(i: number): void {\n const cells = [...this.gridEl.children] as HTMLElement[];\n this.overviewSel = Math.min(cells.length - 1, Math.max(0, i));\n cells.forEach((c, k) => c.setAttribute('data-selected', String(k === this.overviewSel)));\n cells[this.overviewSel]?.scrollIntoView?.({ block: 'nearest' });\n }\n\n private handleOverviewKey(e: KeyboardEvent): boolean {\n const cols = Number(this.gridEl.style.getPropertyValue('--mp-cols')) || 3;\n switch (e.key) {\n case 'ArrowRight': this.select(this.overviewSel + 1); return true;\n case 'ArrowLeft': this.select(this.overviewSel - 1); return true;\n case 'ArrowDown': this.select(this.overviewSel + cols); return true;\n case 'ArrowUp': this.select(this.overviewSel - cols); return true;\n case 'Enter': { const page = this.overviewSel; this.overviewEl.setAttribute('data-open', 'false'); this.cancelAdvance(); void this.run(() => nav.goToPage(this.movie, page)); return true; }\n case 'Escape': this.overviewEl.setAttribute('data-open', 'false'); return true;\n default: return NEXT_KEYS.has(e.key) || PREV_KEYS.has(e.key); // swallowed: the presentation does not move underneath\n }\n }\n\n private handleClick(): void {\n if (this.swiped) { this.swiped = false; return; }\n this.wake();\n this.navigate(() => void this.next());\n }\n\n private handlePointerUp(e: PointerEvent): void {\n const d = this.downAt; this.downAt = null;\n if (!d) return;\n const dx = e.clientX - d.x, dy = e.clientY - d.y;\n if (Math.abs(dx) < SWIPE_PX || Math.abs(dy) > Math.abs(dx)) return;\n this.swiped = true;\n this.wake();\n this.navigate(() => void (dx < 0 ? this.next() : this.prev()));\n }\n}\n","import type { CompositionSpec, SequenceSpec, TransitionSpec, Keyframe, Props, StopSpec } from '../index';\nimport { warnUnknownOptions } from '../index';\n\nconst PAGE_KEYS = ['name', 'duration', 'sequences', 'stops', 'notes', 'advance', 'initial', 'keyframes', 'filters', 'filterArea', 'blendMode', 'mask'] as const;\nconst DECK_KEYS = ['pages', 'transition', 'width', 'height', 'frameRate', 'background', 'canvas', 'assets', 'poster', 'motionBlur', 'loader'] as const;\n\nexport interface DeckPage {\n /** The page's name: shown by the Presenter, and in the stops list. */\n name?: string;\n /** How long the page lasts, seconds (including any transition into the next page, see `DeckOptions.transition`). Required. */\n duration: number;\n /** The page's layers, written in the page's own time (`at: 0` is the start of the page). */\n sequences: SequenceSpec[];\n /** Where the page stops, in the page's own time: the first is the page settled, the rest are steps (a bullet appears, a chart grows). Default: where the transition into the next page begins (the end for the last page). */\n stops?: Array<number | { at: number; pdf?: boolean }>;\n /** Speaker notes (kept on the page's first stop). */\n notes?: string;\n /** Move on by itself this many seconds after the page's last stop (kiosk mode). */\n advance?: number;\n /** The page is itself a layer: it may carry `initial`, `keyframes`, `filters`, … (fade or slide the whole page, for instance). */\n initial?: Props;\n keyframes?: Keyframe[];\n}\n\n/** A transition spec without the parts `deck()` fills in (which two pages, and when). */\nexport type DeckTransition = TransitionSpec extends infer T ? (T extends TransitionSpec ? Omit<T, 'from' | 'to' | 'at'> : never) : never;\n\nexport interface DeckOptions {\n pages: DeckPage[];\n /**\n * A transition between every two pages: `{ kind: 'crossfade' | 'slide' | 'wipe' | 'iris' | 'dip' | 'zoom' | 'dissolve' | 'luma', duration, …its own options }` (see Transitions). The next page starts\n * `duration` seconds before the current one ends, and the transition plays across the overlap.\n */\n transition?: DeckTransition;\n}\n\n/** What `deck()` returns: spread it into `movie.init` (`{ duration, composition: { sequences, transitions?, stops } }` plus any movie option you passed). */\nexport interface DeckResult {\n duration: number;\n composition: CompositionSpec;\n [movieOption: string]: unknown;\n}\n\n/**\n * A deck of pages as one movie. Each page is a nested composition laid out after the one before (so its layers use the page's own\n * time), the stops (where a `Presenter` pauses) come from the pages, and an optional `transition` joins the pages with the existing\n * crossfade / slide / wipe / … transitions.\n *\n * ```js\n * await movie.init({ canvas, width: 1280, height: 720, frameRate: 30, ...deck({\n * transition: { kind: 'slide', duration: 0.6, direction: 'left' },\n * pages: [\n * { name: 'Hello', duration: 5, stops: [1.2], sequences: [ …title, subtitle… ] },\n * { name: 'Why', duration: 8, stops: [1.2, 3, 5], sequences: [ …three bullets, at 1.2, 3, 5… ] },\n * ],\n * }) });\n * movie.on('ready', …); new Presenter(movie, { canvas });\n * ```\n */\nexport function deck(options: DeckOptions): DeckResult {\n if (!options || !Array.isArray(options.pages) || options.pages.length === 0) throw new Error('deck(): pages must be a list with at least one page: { pages: [{ name, duration, stops, sequences }] }');\n warnUnknownOptions('deck()', options, DECK_KEYS);\n const { pages, transition, ...movieOptions } = options as DeckOptions & Record<string, unknown>;\n pages.forEach((p, i) => {\n if (!p || typeof p !== 'object') throw new Error(`deck(): pages[${i}] must be an object`);\n warnUnknownOptions(`deck() pages[${i}]`, p, PAGE_KEYS);\n if (!(typeof p.duration === 'number' && Number.isFinite(p.duration) && p.duration > 0)) throw new Error(`deck(): pages[${i}].duration must be a positive number of seconds, got ${String(p.duration)}`);\n if (!Array.isArray(p.sequences)) throw new Error(`deck(): pages[${i}].sequences must be a list of layers (it may be empty), got ${typeof p.sequences}`);\n });\n let overlap = 0;\n if (transition) {\n if (!(typeof transition.duration === 'number' && transition.duration > 0)) throw new Error('deck(): transition needs a duration in seconds: { kind: \\'crossfade\\', duration: 0.6 }');\n const shortest = Math.min(...pages.map(p => p.duration));\n if (pages.length > 1 && transition.duration >= shortest) throw new Error(`deck(): the transition (${transition.duration} s) must be shorter than every page (the shortest is ${shortest} s)`);\n overlap = pages.length > 1 ? transition.duration : 0;\n }\n\n const sequences: SequenceSpec[] = [];\n const transitions: TransitionSpec[] = [];\n const stops: StopSpec[] = [];\n let start = 0;\n pages.forEach((page, i) => {\n const id = `page-${i + 1}`;\n const label = page.name ? `\"${page.name}\"` : `pages[${i}]`;\n const isLast = i === pages.length - 1;\n const entries = (page.stops ?? [isLast ? page.duration : page.duration - overlap]).map((e, k) => {\n if (e && typeof e === 'object') warnUnknownOptions(`deck() page ${label} stops[${k}]`, e, ['at', 'pdf']);\n return typeof e === 'object' && e !== null ? e : { at: e as number };\n });\n const local = entries.map(e => e.at);\n local.forEach((s, k) => {\n if (!(typeof s === 'number' && Number.isFinite(s) && s > 0 && s <= page.duration + 1e-9)) throw new Error(`deck(): page ${label} has stop ${String(s)}, outside the page (0 to ${page.duration} s)`);\n if (k > 0 && s <= local[k - 1]!) throw new Error(`deck(): page ${label} stops must be in order, earliest first (got ${local.join(', ')})`);\n });\n const { name: _n, duration: _d, sequences: inner, stops: _s, notes: _no, advance: _a, ...layerProps } = page;\n sequences.push({ type: 'composition', name: id, at: round(start), duration: page.duration, ...layerProps, sequences: inner } as unknown as SequenceSpec);\n local.forEach((s, k) => {\n const stop: StopSpec = { at: round(start + s) };\n if (k === 0) { stop.page = page.name ?? true; if (page.notes !== undefined) stop.notes = page.notes; }\n if (k === local.length - 1 && page.advance !== undefined) stop.advance = page.advance;\n if (entries[k]!.pdf !== undefined) stop.pdf = entries[k]!.pdf;\n stops.push(stop);\n });\n if (transition && !isLast) {\n const next = start + page.duration - overlap;\n transitions.push({ ...transition, from: id, to: `page-${i + 2}`, at: round(next), duration: transition.duration } as unknown as TransitionSpec);\n }\n start = start + page.duration - (isLast ? 0 : overlap);\n });\n\n const composition: CompositionSpec = { sequences, stops };\n if (transitions.length > 0) composition.transitions = transitions;\n return { ...movieOptions, duration: round(start), composition };\n}\n\nconst round = (v: number): number => Math.round(v * 1e6) / 1e6;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/present/stops.ts","../src/present/navigation.ts","../src/present/pdf.ts","../src/present/images.ts","../src/present/Presenter.ts","../src/present/deck.ts"],"names":["warnUnknownOptions","pageIndex","next","stopIndex"],"mappings":"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","file":"present.cjs","sourcesContent":["import type { Stop } from '../index';\n\n/** The first stop beyond `frame` (standing on a stop, the next one). */\nexport function nextStopAfter(stops: readonly Stop[], frame: number): Stop | null {\n return stops.find(s => s.frame > frame) ?? null;\n}\n\n/** The last stop before `frame` (standing on a stop, the one before it). */\nexport function previousStopBefore(stops: readonly Stop[], frame: number): Stop | null {\n for (let i = stops.length - 1; i >= 0; i--) if (stops[i]!.frame < frame) return stops[i]!;\n return null;\n}\n\n/** The stop the playhead is on or has just passed, or null before the first. */\nexport function stopAtOrBefore(stops: readonly Stop[], frame: number): Stop | null {\n for (let i = stops.length - 1; i >= 0; i--) if (stops[i]!.frame <= frame) return stops[i]!;\n return null;\n}\n\n/** The stop that begins each page. */\nexport function pageStarts(stops: readonly Stop[]): Stop[] {\n return stops.filter(s => s.pageStart);\n}\n\n/**\n * The stops whose pictures stand for the pages (`which: 'pages'`, default) or for every stop. A page's picture is, in order: the stop flagged\n * `pdf: true` (the last such one, or the first with `pick: 'first'`), else the last (or first) stop not flagged `pdf: false`, else, for a page\n * list, its last (or first) stop, and for a PDF (`pdf: true` here) nothing: the page is left out. With `which: 'stops'` a PDF leaves out the\n * stops flagged `pdf: false`.\n */\nexport function pictureStops(stops: readonly Stop[], opts: { which?: 'pages' | 'stops'; pick?: 'last' | 'first'; pdf?: boolean } = {}): Stop[] {\n if (opts.which === 'stops') return opts.pdf ? stops.filter(s => s.pdf !== false) : [...stops];\n const byPage = new Map<number, Stop[]>();\n for (const s of stops) byPage.set(s.pageIndex, [...(byPage.get(s.pageIndex) ?? []), s]);\n const take = (list: Stop[]): Stop | undefined => (opts.pick === 'first' ? list[0] : list[list.length - 1]);\n const picks: Stop[] = [];\n for (const list of byPage.values()) {\n const flagged = list.filter(s => s.pdf === true);\n const usable = list.filter(s => s.pdf !== false);\n const one = take(flagged.length ? flagged : usable.length ? usable : (opts.pdf ? [] : list));\n if (one) picks.push(one);\n }\n return picks;\n}\n\n/** The share (0–1) of pixels that differ by more than `threshold` (0–255) in any colour channel between two RGBA pixel arrays of the same size. */\nexport function changedFraction(a: Uint8ClampedArray, b: Uint8ClampedArray, threshold = 12): number {\n const n = Math.min(a.length, b.length) >> 2;\n if (n === 0) return 0;\n let changed = 0;\n for (let i = 0; i < n; i++) {\n const k = i << 2;\n if (Math.abs(a[k]! - b[k]!) > threshold || Math.abs(a[k + 1]! - b[k + 1]!) > threshold || Math.abs(a[k + 2]! - b[k + 2]!) > threshold) changed++;\n }\n return changed / n;\n}\n","import type { Movie, Stop } from '../index';\nimport { nextStopAfter, previousStopBefore, stopAtOrBefore, pageStarts } from './stops';\n\n/** A presentation is now on a stop (`next()` played to it, or `prev()` / `goToStop()` / `goToPage()` jumped to it). */\nexport interface StopEvent { index: number; stop: Stop; pageIndex: number }\n\nconst listeners = new WeakMap<Movie, Set<(e: StopEvent) => void>>();\nconst toward = new WeakMap<Movie, Stop>(); // the stop `next()` is playing toward, per movie\n\n/** Call `fn` every time a presentation lands on a stop. Returns the function that stops listening. */\nexport function onStop(movie: Movie, fn: (e: StopEvent) => void): () => void {\n let set = listeners.get(movie);\n if (!set) { set = new Set(); listeners.set(movie, set); }\n set.add(fn);\n return () => { set!.delete(fn); };\n}\n\nfunction emit(movie: Movie, stop: Stop): void {\n const e: StopEvent = { index: stop.index, stop, pageIndex: stop.pageIndex };\n for (const fn of [...(listeners.get(movie) ?? [])]) fn(e);\n}\n\n/** Which stop the playhead is on or has passed (-1 before the first). */\nexport const stopIndex = (movie: Movie): number => stopAtOrBefore(movie.stops, movie.currentFrame)?.index ?? -1;\n/** The stop the playhead is on or has passed, or null. */\nexport const currentStop = (movie: Movie): Stop | null => stopAtOrBefore(movie.stops, movie.currentFrame);\n/** Which page the playhead is in (0-based), -1 before the first stop. */\nexport const pageIndex = (movie: Movie): number => currentStop(movie)?.pageIndex ?? -1;\n/** How many pages the stops make. */\nexport const pageCount = (movie: Movie): number => pageStarts(movie.stops).length;\n\n/**\n * Play to the next stop and pause exactly there (a presentation's \"next\"). Pressed again while it is playing toward a stop, it skips the\n * rest of the animation and lands on that stop at once. After the last stop it plays to the end. Resolves when it has landed (or\n * stopped for another reason). An ordinary `movie.play()` ignores the stops.\n */\nexport async function next(movie: Movie): Promise<void> {\n if (!movie.isReady) return;\n const going = toward.get(movie);\n if (going && movie.isPlaying) { // still on its way: skip the rest of the animation\n toward.delete(movie);\n movie.pause(); // (this settles the first call's playUntil as \"not landed\": it says nothing)\n await movie.gotoFrame(going.frame, true);\n emit(movie, going);\n return;\n }\n toward.delete(movie); // (a press while it is already landing goes on to the next stop, as it always did)\n if (movie.currentFrame >= movie.totalFrames) return;\n const target = nextStopAfter(movie.stops, movie.currentFrame);\n if (!target) { await movie.playUntil(); return; }\n toward.set(movie, target);\n const landed = await movie.playUntil(target.frame / movie.frameRate);\n if (toward.get(movie) === target) toward.delete(movie);\n if (landed) emit(movie, target);\n}\n\n/** Jump back to the previous stop at once (no reverse playback); from the first stop, to the start. */\nexport async function prev(movie: Movie): Promise<void> {\n if (!movie.isReady) return;\n toward.delete(movie);\n movie.pause();\n const target = previousStopBefore(movie.stops, movie.currentFrame);\n await movie.gotoFrame(target ? target.frame : 0, true);\n if (target) emit(movie, target);\n}\n\n/** Jump to stop `index` (0-based). */\nexport async function goToStop(movie: Movie, index: number): Promise<void> {\n if (!movie.isReady) return;\n const stop = movie.stops[index];\n if (!stop) { console.warn(`pixi-effects: goToStop(movie, ${index}): there are ${movie.stops.length} stops (0 to ${movie.stops.length - 1})`); return; }\n toward.delete(movie);\n movie.pause();\n await movie.gotoFrame(stop.frame, true);\n emit(movie, stop);\n}\n\n/** Jump to the first stop of page `page` (0-based). */\nexport async function goToPage(movie: Movie, page: number): Promise<void> {\n const starts = pageStarts(movie.stops);\n const stop = starts[page];\n if (!stop) { console.warn(`pixi-effects: goToPage(movie, ${page}): there are ${starts.length} pages (0 to ${starts.length - 1})`); return; }\n await goToStop(movie, stop.index);\n}\n","/**\n * A minimal PDF writer: one JPEG per page, full page, no dependencies. Enough for a deck exported as pages (`movie.exportPDF()`).\n */\nexport interface PdfPage {\n /** A JPEG file (baseline or progressive, RGB), embedded as it is. */\n jpeg: Uint8Array;\n /** The picture's size in pixels; the page is that size in CSS pixels (a pixel is 0.75 pt). */\n width: number;\n height: number;\n}\n\nconst enc = (s: string): Uint8Array => { const out = new Uint8Array(s.length); for (let i = 0; i < s.length; i++) out[i] = s.charCodeAt(i) & 0xff; return out; };\nconst num = (n: number): string => String(Math.round(n * 1000) / 1000);\n/** A PDF text string: plain ASCII in parentheses, anything else (a dash, Japanese) as UTF-16BE in hex with its byte order mark. */\nconst textString = (s: string): string => {\n if (/^[\\x20-\\x7e]*$/.test(s)) return `(${s.replace(/[\\\\()]/g, m => `\\\\${m}`)})`;\n let hex = 'FEFF';\n for (let i = 0; i < s.length; i++) hex += s.charCodeAt(i).toString(16).toUpperCase().padStart(4, '0');\n return `<${hex}>`;\n};\n\nexport function buildPdf(pages: PdfPage[], opts: { title?: string } = {}): Uint8Array {\n if (pages.length === 0) throw new Error('pixi-effects: a PDF needs at least one page');\n // object numbers: 1 catalog, 2 page tree, then (page, contents, image) × n, then the info\n const first = (i: number) => 3 + i * 3;\n const objects: Uint8Array[][] = []; // each object: the byte chunks between \"n 0 obj\\n\" and \"\\nendobj\\n\"\n objects[1] = [enc('<< /Type /Catalog /Pages 2 0 R >>')];\n objects[2] = [enc(`<< /Type /Pages /Kids [${pages.map((_, i) => `${first(i)} 0 R`).join(' ')}] /Count ${pages.length} >>`)];\n pages.forEach((p, i) => {\n const w = p.width * 0.75, h = p.height * 0.75, n = first(i);\n objects[n] = [enc(`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${num(w)} ${num(h)}] /Resources << /XObject << /Im0 ${n + 2} 0 R >> >> /Contents ${n + 1} 0 R >>`)];\n const content = `q ${num(w)} 0 0 ${num(h)} 0 0 cm /Im0 Do Q`;\n objects[n + 1] = [enc(`<< /Length ${content.length} >>\\nstream\\n${content}\\nendstream`)];\n objects[n + 2] = [enc(`<< /Type /XObject /Subtype /Image /Width ${p.width} /Height ${p.height} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode /Length ${p.jpeg.length} >>\\nstream\\n`), p.jpeg, enc('\\nendstream')];\n });\n const infoNo = opts.title !== undefined ? first(pages.length) : 0;\n if (infoNo) objects[infoNo] = [enc(`<< /Title ${textString(opts.title!)} /Producer (pixi-effects) >>`)];\n const count = (infoNo || first(pages.length)) ; // highest object number + 1 is the /Size\n\n const chunks: Uint8Array[] = [enc('%PDF-1.4\\n%\\xe2\\xe3\\xcf\\xd3\\n')];\n let offset = chunks[0]!.length;\n const offsets: number[] = [];\n for (let n = 1; n < count + (infoNo ? 1 : 0); n++) {\n const body = objects[n];\n if (!body) continue;\n offsets[n] = offset;\n const parts = [enc(`${n} 0 obj\\n`), ...body, enc('\\nendobj\\n')];\n for (const part of parts) { chunks.push(part); offset += part.length; }\n }\n const size = (infoNo || first(pages.length)) + (infoNo ? 1 : 0);\n let xref = `xref\\n0 ${size}\\n0000000000 65535 f \\n`;\n for (let n = 1; n < size; n++) xref += `${String(offsets[n] ?? 0).padStart(10, '0')} 00000 n \\n`;\n xref += `trailer\\n<< /Size ${size} /Root 1 0 R${infoNo ? ` /Info ${infoNo} 0 R` : ''} >>\\nstartxref\\n${offset}\\n%%EOF\\n`;\n chunks.push(enc(xref));\n\n const total = chunks.reduce((sum, c) => sum + c.length, 0);\n const out = new Uint8Array(total);\n let at = 0;\n for (const c of chunks) { out.set(c, at); at += c.length; }\n return out;\n}\n","import type { Movie, MotionBlurSpec, Stop, SnapshotOptions } from '../index';\nimport { warnUnknownOptions } from '../index';\nimport { pictureStops, changedFraction } from './stops';\nimport { buildPdf } from './pdf';\n\n/** One picture of a stop (see `stopImages()`). */\nexport interface StopImage { stop: Stop; /** The page it belongs to (0-based). */ page: number; image: Blob | string }\n\nexport interface StopImagesOptions {\n /** One picture per page (default) or one per stop. */\n which?: 'pages' | 'stops';\n /** With `which: 'pages'`: the page's last stop (default: the page fully built) or its first. */\n pick?: 'last' | 'first';\n /** Output size relative to the canvas. Default 1. */\n scale?: number;\n /** `'image/png'` (default) or `'image/jpeg'`. */\n type?: 'image/png' | 'image/jpeg';\n /** JPEG quality, 0–1. */\n quality?: number;\n /** Return `data:` URLs instead of Blobs. */\n as?: 'blob' | 'dataURL';\n /** Motion blur for the pictures (off unless you ask: they are usually for looking at). */\n motionBlur?: MotionBlurSpec;\n /** Pictures for a PDF: stops flagged `pdf: false` are left out (a page whose stops are all flagged has no picture). `exportPDF` sets it. */\n pdf?: boolean;\n /** Called as each picture is ready, in order. */\n onImage?: (image: StopImage) => void;\n}\n\nexport interface InspectStopsReport {\n stops: Array<{ index: number; page: string | null; at: number; frame: number; moving: number; settled: boolean }>;\n issues: string[];\n}\n\nfunction requireReady(movie: Movie, what: string): void {\n if (!movie.isReady) throw new Error(`pixi-effects: ${what}() needs a ready movie — await movie.init(...) first`);\n}\n\n/**\n * A picture of the settled state of each page (default: the page's last stop, fully built) or of every stop, for a page list, an\n * overview, an export. Pauses the movie, and leaves the playhead where it was. `onImage` is called as each picture is ready.\n */\nexport async function stopImages(movie: Movie, opts: StopImagesOptions & { as: 'dataURL' }): Promise<Array<StopImage & { image: string }>>;\nexport async function stopImages(movie: Movie, opts?: StopImagesOptions): Promise<StopImage[]>;\nexport async function stopImages(movie: Movie, opts: StopImagesOptions = {}): Promise<StopImage[]> {\n warnUnknownOptions('stopImages()', opts, ['which', 'pick', 'scale', 'type', 'quality', 'as', 'motionBlur', 'pdf', 'onImage']);\n requireReady(movie, 'stopImages');\n if (movie.stops.length === 0) return [];\n const picks = pictureStops(movie.stops, { which: opts.which, pick: opts.pick, pdf: opts.pdf });\n const shot = { scale: opts.scale ?? 1, type: opts.type ?? 'image/png', quality: opts.quality, as: opts.as ?? 'blob', motionBlur: opts.motionBlur === undefined ? false : opts.motionBlur };\n return movie.peek(async () => {\n const out: StopImage[] = [];\n for (const stop of picks) {\n const image = await movie.snapshot(stop.frame, shot as SnapshotOptions & { as: 'dataURL' });\n const item: StopImage = { stop, page: stop.pageIndex, image };\n out.push(item);\n opts.onImage?.(item);\n }\n return out;\n });\n}\n\n/**\n * Look at every stop: is the picture there still changing? A stop is compared with the picture `lookback` frames before it (default 3):\n * when more than `tolerance` (default 0.4 %) of the picture differs, the audience, a page overview and a PDF all see a half-finished\n * animation. `issues` says which stop, which page and what to do; leaves the playhead where it was.\n */\nexport async function inspectStops(movie: Movie, opts: { lookback?: number; tolerance?: number } = {}): Promise<InspectStopsReport> {\n warnUnknownOptions('inspectStops()', opts, ['lookback', 'tolerance']);\n requireReady(movie, 'inspectStops');\n const out: InspectStopsReport = { stops: [], issues: [] };\n if (movie.stops.length === 0) return out;\n const lookback = Math.max(1, Math.round(opts.lookback ?? 3));\n const tolerance = opts.tolerance ?? 0.004;\n const small = Math.min(1, 320 / Math.max(1, movie.width)); // pictures about 320 px wide, no blur: they are only compared\n const pixels = async (frame: number): Promise<Uint8ClampedArray> => (await movie.snapshot(frame, { scale: small, motionBlur: false, as: 'imageData' })).data;\n return movie.peek(async () => {\n for (const stop of movie.stops) {\n const before = Math.max(0, stop.frame - lookback);\n let moving = 0;\n if (before < stop.frame) {\n const now = await pixels(stop.frame);\n moving = changedFraction(now, await pixels(before));\n }\n const settled = moving <= tolerance;\n out.stops.push({ index: stop.index, page: stop.page, at: stop.at, frame: stop.frame, moving, settled });\n if (!settled) {\n out.issues.push(`stop ${stop.index + 1}${stop.page ? ` (page \"${stop.page}\")` : ''} at ${stop.at.toFixed(1)} s: the picture is still changing there (${moving < 0.1 ? (moving * 100).toFixed(1) : Math.round(moving * 100)}% of it changed in the last ${stop.frame - before} frames), so the audience, the page overview and a PDF see it mid-animation. Move the stop to after the animation has finished, or flag a settled stop of the page with \\`pdf: true\\`.`);\n }\n }\n return out;\n });\n}\n\n/**\n * The deck as a PDF: one page per page of the talk (the page's last stop, fully built, unless a stop says `pdf: true` or `pdf: false`;\n * `which: 'stops'` makes a page of every stop that is not `pdf: false`), each a\n * JPEG at the canvas size. Needs `composition.stops`. A transparent background comes out black: give the movie a `background`.\n */\nexport async function exportPDF(movie: Movie, opts: { which?: 'pages' | 'stops'; pick?: 'last' | 'first'; scale?: number; quality?: number; title?: string; motionBlur?: MotionBlurSpec; onImage?: (image: StopImage) => void } = {}): Promise<Blob> {\n warnUnknownOptions('exportPDF()', opts, ['which', 'pick', 'scale', 'quality', 'title', 'motionBlur', 'onImage']);\n requireReady(movie, 'exportPDF');\n if (movie.stops.length === 0) throw new Error('pixi-effects: exportPDF(): this movie has no stops, so there are no pages; add `stops` to the composition (or build it with deck())');\n const scale = opts.scale ?? 1;\n const images = await stopImages(movie, {\n which: opts.which, pick: opts.pick, scale, type: 'image/jpeg', quality: opts.quality ?? 0.92, as: 'blob', motionBlur: opts.motionBlur, pdf: true, onImage: opts.onImage,\n });\n const pages = await Promise.all(images.map(async i => ({\n jpeg: new Uint8Array(await (i.image as Blob).arrayBuffer()), width: Math.max(1, Math.round(movie.width * scale)), height: Math.max(1, Math.round(movie.height * scale)),\n })));\n return new Blob([buildPdf(pages, { title: opts.title }) as unknown as BlobPart], { type: 'application/pdf' });\n}\n","import type { Movie, Stop } from '../index';\nimport { warnUnknownOptions } from '../index';\nimport * as nav from './navigation';\nimport type { StopEvent } from './navigation';\nimport { stopImages } from './images';\n\nexport interface PresenterOptions {\n canvas: HTMLCanvasElement;\n /** Keys on the page: arrows, Space, Enter, PageUp / PageDown, Home / End, page number + Enter, B / W, F, ?, Esc. Default true. */\n keyboard?: boolean;\n /** A click (or tap) on the picture is \"next\". Default true. */\n clickToAdvance?: boolean;\n /** A swipe to the left is \"next\", to the right \"back\" (touch screens). Default true. */\n swipe?: boolean;\n /** The page counter, the page name and a progress line (they fade out when nothing happens). Default true. */\n indicator?: boolean;\n /** Stops with `advance: seconds` move on by themselves. Default true. */\n autoAdvance?: boolean;\n /** Run off the end: go back to the start and play again (a kiosk, a looping demo). Default false. */\n loop?: boolean;\n /** The accent of the progress line (any CSS colour). */\n accent?: string;\n /** Called when the audience-facing session is over: Escape with nothing left to close, or fullscreen left. (`Controller`'s Present button uses it to bring its bar back.) */\n onExit?: () => void;\n}\n\nconst OPTION_KEYS = ['canvas', 'keyboard', 'clickToAdvance', 'swipe', 'indicator', 'autoAdvance', 'loop', 'accent', 'onExit'] as const;\nconst NEXT_KEYS = new Set(['ArrowRight', 'ArrowDown', ' ', 'Enter', 'PageDown']);\nconst PREV_KEYS = new Set(['ArrowLeft', 'ArrowUp', 'Backspace', 'PageUp']);\nconst clock = (ms: number): string => { const s = Math.floor(ms / 1000); return `${String(Math.floor(s / 60)).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}`; };\nconst IDLE_MS = 2500;\nconst DIGITS_MS = 2000;\nconst SWIPE_PX = 50;\n\nconst CSS = `\n.movie-presenter { position: absolute; inset: 0; z-index: 3; pointer-events: none; font: 500 13px/1.3 system-ui, -apple-system, 'Helvetica Neue', Arial, sans-serif; color: #fff; }\n.movie-presenter .mp-info { position: absolute; left: 50%; bottom: 14px; transform: translateX(-50%); white-space: nowrap; display: flex; align-items: baseline; gap: 12px; padding: 6px 12px; border-radius: 999px; background: rgba(0, 0, 0, 0.45); transition: opacity 0.4s ease; }\n.movie-presenter .mp-title { opacity: 0.75; }\n.movie-presenter .mp-title:empty { display: none; }\n.movie-presenter .mp-counter { font-variant-numeric: tabular-nums; letter-spacing: 0.04em; }\n.movie-presenter .mp-progress { position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: rgba(255, 255, 255, 0.14); transition: opacity 0.4s ease; }\n.movie-presenter .mp-progress::after { content: ''; position: absolute; inset: 0; background: var(--mp-accent, #ffffff); transform-origin: 0 50%; transform: scaleX(var(--mp-fill, 0)); transition: transform 0.4s ease; }\n.movie-presenter[data-idle=\"true\"] .mp-info, .movie-presenter[data-idle=\"true\"] .mp-progress { opacity: 0; }\n.movie-presenter .mp-cover { position: absolute; inset: 0; z-index: 4; opacity: 0; pointer-events: none; background: #000; transition: opacity 0.25s ease; }\n.movie-presenter .mp-cover[data-mode=\"black\"] { opacity: 1; pointer-events: auto; background: #000; }\n.movie-presenter .mp-cover[data-mode=\"white\"] { opacity: 1; pointer-events: auto; background: #fff; }\n.movie-presenter .mp-jump { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); padding: 10px 22px; border-radius: 12px; background: rgba(0, 0, 0, 0.6); font-size: 34px; font-weight: 600; letter-spacing: 0.06em; opacity: 0; transition: opacity 0.15s ease; }\n.movie-presenter .mp-jump[data-active=\"true\"] { opacity: 1; }\n.movie-presenter .mp-help { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); z-index: 5; padding: 18px 26px; border-radius: 14px; background: rgba(12, 14, 24, 0.92); box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5); pointer-events: auto; }\n.movie-presenter .mp-help[data-open=\"false\"] { display: none; }\n.movie-presenter .mp-help h3 { margin: 0 0 10px; font-size: 13px; letter-spacing: 0.12em; opacity: 0.7; }\n.movie-presenter .mp-help dl { display: grid; grid-template-columns: auto auto; gap: 6px 22px; margin: 0; }\n.movie-presenter .mp-help dt { opacity: 0.95; font-weight: 600; white-space: nowrap; }\n.movie-presenter .mp-help dd { margin: 0; opacity: 0.75; }\n.movie-presenter .mp-wait { position: absolute; inset: 0; z-index: 7; display: grid; place-items: center; background: #000; font-size: 13px; letter-spacing: 0.4em; opacity: 0.9; padding-left: 0.4em; }\n.movie-presenter .mp-wait[data-open=\"false\"] { display: none; }\n.movie-presenter .mp-overview { position: absolute; inset: 0; z-index: 6; display: flex; flex-direction: column; gap: 14px; padding: 26px 30px 18px; overflow: auto; background: rgba(8, 10, 18, 0.985); pointer-events: auto; }\n.movie-presenter .mp-overview[data-open=\"false\"] { display: none; }\n.movie-presenter .mp-grid { display: grid; grid-template-columns: repeat(var(--mp-cols, 3), minmax(0, 1fr)); gap: 14px; }\n.movie-presenter .mp-cell { position: relative; aspect-ratio: var(--mp-ratio, 16 / 9); overflow: hidden; border-radius: 8px; background: #000; border: 2px solid transparent; cursor: pointer; }\n.movie-presenter .mp-cell img { display: block; width: 100%; height: 100%; object-fit: cover; }\n.movie-presenter .mp-cell[data-current=\"true\"] { border-color: rgba(255, 255, 255, 0.45); }\n.movie-presenter .mp-cell[data-selected=\"true\"] { border-color: var(--mp-accent, #ffffff); box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.18); }\n.movie-presenter .mp-cell-label { position: absolute; left: 0; right: 0; bottom: 0; display: flex; gap: 8px; align-items: baseline; padding: 18px 10px 7px; background: linear-gradient(to top, rgba(0, 0, 0, 0.7), transparent); font-size: 12px; }\n.movie-presenter .mp-cell-num { font-weight: 700; font-variant-numeric: tabular-nums; }\n.movie-presenter .mp-cell-name { opacity: 0.85; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.movie-presenter .mp-overview-hint { margin-top: auto; opacity: 0.55; font-size: 12px; letter-spacing: 0.04em; }\n[data-pr-wrap] .movie-controller { display: none !important; }\n[data-pr-wrap]:fullscreen { width: 100vw; height: 100vh; display: flex; align-items: center; justify-content: center; background: #000; }\n[data-pr-wrap]:fullscreen > canvas { width: 100% !important; height: 100% !important; max-width: none !important; max-height: none !important; object-fit: contain; border-radius: 0; }\n@media (prefers-reduced-motion: reduce) { .movie-presenter * { transition: none !important; } }\n`;\nfunction installStyles(): void {\n if (typeof document === 'undefined' || document.head.querySelector('style[data-movie-presenter]')) return;\n const el = document.createElement('style');\n el.setAttribute('data-movie-presenter', '');\n el.textContent = CSS;\n document.head.appendChild(el);\n}\n\nconst HELP: Array<[string, string]> = [\n ['→ ↓ Space Enter PageDown click', 'next (plays to the next stop)'],\n ['← ↑ Backspace PageUp', 'back one stop'],\n ['Home / End', 'first page / last stop'],\n ['number, then Enter', 'jump to that page'],\n ['B or .', 'black screen'],\n ['W or ,', 'white screen'],\n ['G', 'overview of all pages (arrows + Enter, or click)'],\n ['P', 'presenter view: notes, next picture, timer (a second window)'],\n ['F', 'fullscreen'],\n ['Esc', 'close this / black screen / fullscreen'],\n ['swipe ← →', 'next / back (touch)'],\n];\n\nconst VIEW_CSS = `\nhtml, body { margin: 0; height: 100%; background: #0c0e16; color: #e8ecf8; font: 500 15px/1.4 system-ui, -apple-system, 'Helvetica Neue', Arial, sans-serif; }\n.pv { display: grid; grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr); gap: 18px; height: 100%; padding: 18px; box-sizing: border-box; }\n.pv-label { margin: 0 0 6px; font-size: 11px; font-weight: 700; letter-spacing: 0.18em; opacity: 0.55; }\n.pv-main { display: flex; flex-direction: column; min-height: 0; }\n.pv-now { width: 100%; height: auto; background: #000; border-radius: 8px; }\n.pv-side { display: flex; flex-direction: column; gap: 12px; min-height: 0; }\n.pv-top { display: flex; align-items: baseline; gap: 14px; }\n.pv-count { font-size: 30px; font-weight: 700; font-variant-numeric: tabular-nums; }\n.pv-title { flex: 1; opacity: 0.75; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.pv-timer { font-size: 30px; font-weight: 600; font-variant-numeric: tabular-nums; letter-spacing: 0.04em; }\n.pv-nextbox { position: relative; aspect-ratio: var(--pv-ratio, 16 / 9); background: #000; border-radius: 8px; overflow: hidden; }\n.pv-next { display: block; width: 100%; height: 100%; object-fit: cover; }\n.pv-nextbox[data-end=\"true\"] .pv-next { display: none; }\n.pv-end { position: absolute; inset: 0; display: none; place-items: center; opacity: 0.6; letter-spacing: 0.2em; font-size: 12px; }\n.pv-nextbox[data-end=\"true\"] .pv-end { display: grid; }\n.pv-notes { flex: 1; min-height: 80px; overflow: auto; padding: 12px 14px; border-radius: 8px; background: #151927; font-size: 20px; line-height: 1.5; white-space: pre-wrap; }\n.pv-notes[data-empty=\"true\"] { opacity: 0.4; font-size: 14px; }\n.pv-notes[data-empty=\"true\"]::before { content: 'No notes for this page.'; }\n.pv-buttons { display: flex; gap: 10px; }\n.pv button { font: inherit; color: inherit; border: 0; border-radius: 8px; padding: 10px 16px; background: #232a40; cursor: pointer; }\n.pv button:hover { background: #2e3754; }\n.pv .pv-nextbtn { flex: 1; background: #3b5bdb; font-weight: 600; }\n.pv .pv-nextbtn:hover { background: #4c6ef5; }\n.pv .pv-reset { padding: 4px 10px; font-size: 12px; opacity: 0.7; }\n`;\n\n/**\n * A presentation player for a movie with `stops` (`composition.stops`): it stops where the stops are, and moves on with the keys,\n * a click, a tap or a swipe, like slides with animation. It draws only a small page counter, the page name and a progress line (they\n * fade out when idle), and a black / white screen, a list of keys (`?`) and fullscreen (`F`). Use it instead of `Controller` on the page.\n */\nexport class Presenter {\n readonly movie: Movie;\n readonly options: Required<Omit<PresenterOptions, 'accent' | 'onExit'>> & { accent?: string; onExit?: () => void };\n\n private box: HTMLElement;\n private wrappedHere = false;\n private root: HTMLDivElement;\n private counterEl: HTMLElement | null = null;\n private titleEl: HTMLElement | null = null;\n private progressEl: HTMLElement | null = null;\n private coverEl!: HTMLElement;\n private helpEl!: HTMLElement;\n private jumpEl!: HTMLElement;\n private idleTimer: ReturnType<typeof setTimeout> | null = null;\n private digitsTimer: ReturnType<typeof setTimeout> | null = null;\n private advanceTimer: ReturnType<typeof setTimeout> | null = null;\n private loopTimer: ReturnType<typeof setTimeout> | null = null;\n private overviewEl!: HTMLElement;\n private gridEl!: HTMLElement;\n private overviewSel = 0;\n /** A picture of every stop (by stop index), made once before the talk: for the overview and the presenter view's \"next\". */\n private thumbs = new Map<number, string>();\n private thumbsPromise: Promise<void> | null = null;\n private waitEl!: HTMLElement;\n private view: { win: Window; timer: ReturnType<typeof setInterval>; started: number; els: Record<string, HTMLElement>; onClose: () => void } | null = null;\n private digits = '';\n private downAt: { x: number; y: number } | null = null;\n private swiped = false;\n private canvasCursor = '';\n private destroyed = false;\n private wasWrapAttr = false;\n\n private onKey = (e: KeyboardEvent) => this.handleKey(e);\n private onStop = (e: StopEvent) => this.handleStop(e);\n private offStop: (() => void) | null = null;\n private onSeeked = () => this.refresh();\n private onFrame = () => this.mirror();\n private onEnded = () => this.handleEnded();\n private onPointerDown = (e: PointerEvent) => { this.downAt = { x: e.clientX, y: e.clientY }; this.swiped = false; };\n private onPointerUp = (e: PointerEvent) => this.handlePointerUp(e);\n private onPointerMove = () => this.wake();\n private onClick = () => this.handleClick();\n private wasFullscreen = false;\n private onFullscreenChange = () => {\n const now = document.fullscreenElement === this.box;\n if (this.wasFullscreen && !now) this.options.onExit?.();\n this.wasFullscreen = now;\n };\n\n constructor(movie: Movie, options: PresenterOptions) {\n if (!options || !options.canvas) throw new Error('Presenter requires options.canvas (HTMLCanvasElement).');\n warnUnknownOptions('Presenter', options, OPTION_KEYS);\n this.movie = movie;\n this.options = {\n canvas: options.canvas, keyboard: options.keyboard ?? true, clickToAdvance: options.clickToAdvance ?? true, swipe: options.swipe ?? true,\n indicator: options.indicator ?? true, autoAdvance: options.autoAdvance ?? true, loop: options.loop ?? false, accent: options.accent, onExit: options.onExit,\n };\n if ((movie.stops?.length ?? 0) === 0) {\n console.warn('pixi-effects: Presenter: this movie has no stops, so there is nowhere to pause; add `stops: [2, 5, 9]` (seconds) to the composition. next() and back still work.');\n }\n installStyles();\n const canvas = this.options.canvas;\n this.box = this.positioningBox(canvas);\n this.wasWrapAttr = this.box.hasAttribute('data-pr-wrap');\n this.box.setAttribute('data-pr-wrap', '');\n this.root = document.createElement('div');\n this.root.className = 'movie-presenter';\n this.root.setAttribute('data-idle', 'false');\n if (this.options.accent) this.root.style.setProperty('--mp-accent', this.options.accent);\n this.root.innerHTML = `\n ${this.options.indicator ? '<div class=\"mp-progress\"></div><div class=\"mp-info\"><span class=\"mp-title\"></span><span class=\"mp-counter\"></span></div>' : ''}\n <div class=\"mp-wait\" data-open=\"false\">Preparing…</div>\n <div class=\"mp-jump\" data-active=\"false\"></div>\n <div class=\"mp-overview\" data-open=\"false\" role=\"dialog\" aria-label=\"Pages\"><div class=\"mp-grid\"></div><div class=\"mp-overview-hint\">← → ↑ ↓ choose · Enter or click: go · G or Esc: close</div></div>\n <div class=\"mp-cover\" data-mode=\"off\"></div>\n <div class=\"mp-help\" data-open=\"false\" role=\"dialog\" aria-label=\"Keys\"><h3>KEYS</h3><dl>${HELP.map(([k, d]) => `<dt>${k}</dt><dd>${d}</dd>`).join('')}</dl></div>`;\n this.box.appendChild(this.root);\n this.counterEl = this.root.querySelector('.mp-counter');\n this.titleEl = this.root.querySelector('.mp-title');\n this.progressEl = this.root.querySelector('.mp-progress');\n this.coverEl = this.root.querySelector('.mp-cover') as HTMLElement;\n this.helpEl = this.root.querySelector('.mp-help') as HTMLElement;\n this.jumpEl = this.root.querySelector('.mp-jump') as HTMLElement;\n this.waitEl = this.root.querySelector('.mp-wait') as HTMLElement;\n this.overviewEl = this.root.querySelector('.mp-overview') as HTMLElement;\n this.gridEl = this.root.querySelector('.mp-grid') as HTMLElement;\n this.coverEl.addEventListener('click', () => this.setCover('off'));\n\n this.canvasCursor = canvas.style.cursor;\n if (this.options.clickToAdvance) { canvas.style.cursor = 'pointer'; canvas.addEventListener('click', this.onClick); }\n if (this.options.swipe) { canvas.addEventListener('pointerdown', this.onPointerDown); canvas.addEventListener('pointerup', this.onPointerUp); }\n canvas.addEventListener('pointermove', this.onPointerMove);\n if (this.options.keyboard) document.addEventListener('keydown', this.onKey);\n document.addEventListener('fullscreenchange', this.onFullscreenChange);\n this.offStop = nav.onStop(movie, this.onStop);\n movie.on('seeked', this.onSeeked);\n movie.on('ended', this.onEnded);\n this.refresh();\n this.wake();\n }\n\n /** Enter presentation: ask for fullscreen (a browser needs a click or key press for that) and play to the first stop. */\n async start(): Promise<void> {\n this.waitEl.setAttribute('data-open', 'true'); // \"Preparing\": the pictures are made before the audience sees a thing\n try { await this.ensureThumbs(); } finally { this.waitEl.setAttribute('data-open', 'false'); }\n await this.enterFullscreen();\n await this.next();\n }\n\n /** Leave fullscreen. */\n async exit(): Promise<void> {\n if (document.fullscreenElement === this.box) await document.exitFullscreen?.().catch(() => {});\n }\n\n next(): Promise<void> { this.cancelAdvance(); return this.run(() => nav.next(this.movie)); }\n prev(): Promise<void> { this.cancelAdvance(); return this.run(() => nav.prev(this.movie)); }\n\n /** Black out (`'black'`), white out (`'white'`) or bring the picture back (`'off'`). */\n setCover(mode: 'black' | 'white' | 'off'): void {\n this.coverEl.setAttribute('data-mode', mode);\n if (mode !== 'off') this.cancelAdvance();\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n const canvas = this.options.canvas;\n document.removeEventListener('keydown', this.onKey);\n document.removeEventListener('fullscreenchange', this.onFullscreenChange);\n canvas.removeEventListener('click', this.onClick);\n canvas.removeEventListener('pointerdown', this.onPointerDown);\n canvas.removeEventListener('pointerup', this.onPointerUp);\n canvas.removeEventListener('pointermove', this.onPointerMove);\n this.closePresenterView();\n this.offStop?.(); this.offStop = null;\n this.movie.off('seeked', this.onSeeked);\n this.movie.off('ended', this.onEnded);\n for (const t of [this.idleTimer, this.digitsTimer, this.advanceTimer, this.loopTimer]) if (t) clearTimeout(t);\n canvas.style.cursor = this.canvasCursor;\n this.root.remove();\n if (!this.wasWrapAttr) this.box.removeAttribute('data-pr-wrap');\n if (this.wrappedHere) {\n const parent = this.box.parentElement;\n if (parent) { parent.insertBefore(canvas, this.box); this.box.remove(); }\n }\n }\n\n // ── internals ──\n\n private positioningBox(canvas: HTMLCanvasElement): HTMLElement {\n const parent = canvas.parentElement;\n if (!parent) throw new Error('Presenter: canvas must be attached to the DOM before constructing.');\n const pos = getComputedStyle(parent).position;\n if (pos === 'relative' || pos === 'absolute' || pos === 'fixed' || pos === 'sticky') return parent;\n const wrap = document.createElement('div');\n wrap.className = 'movie-presenter-wrap';\n wrap.style.cssText = 'position: relative; display: inline-block; line-height: 0;';\n parent.insertBefore(wrap, canvas);\n wrap.appendChild(canvas);\n this.wrappedHere = true;\n return wrap;\n }\n\n private run(fn: () => Promise<void>): Promise<void> {\n return fn().catch(err => { console.warn('pixi-effects: Presenter:', err); });\n }\n\n private async enterFullscreen(): Promise<void> {\n const box = this.box as HTMLElement & { requestFullscreen?: () => Promise<void> };\n try { await box.requestFullscreen?.(); } catch { /* the browser said no (no gesture, or iPhone Safari): present in the page */ }\n }\n\n private toggleFullscreen(): void {\n if (document.fullscreenElement === this.box) void this.exit();\n else void this.enterFullscreen();\n }\n\n private cancelAdvance(): void {\n if (this.advanceTimer) { clearTimeout(this.advanceTimer); this.advanceTimer = null; }\n if (this.loopTimer) { clearTimeout(this.loopTimer); this.loopTimer = null; }\n }\n\n private handleStop(e: StopEvent): void {\n this.refresh();\n this.cancelAdvance();\n if (this.options.autoAdvance && e.stop.advance !== undefined && this.coverEl.getAttribute('data-mode') === 'off') {\n this.advanceTimer = setTimeout(() => { this.advanceTimer = null; void this.next(); }, e.stop.advance * 1000);\n }\n }\n\n private handleEnded(): void {\n this.refresh();\n if (!this.options.loop) return;\n this.cancelAdvance();\n this.loopTimer = setTimeout(() => {\n this.loopTimer = null;\n void this.run(async () => { await this.movie.gotoFrame(0, true); await nav.next(this.movie); });\n }, 800);\n }\n\n private refresh(): void {\n const m = this.movie;\n const pages = nav.pageCount(m), stops = m.stops?.length ?? 0;\n if (this.counterEl) {\n this.counterEl.textContent = pages > 0 ? `${nav.pageIndex(m) >= 0 ? nav.pageIndex(m) + 1 : '–'} / ${pages}` : '';\n this.counterEl.style.display = pages > 0 ? '' : 'none';\n }\n if (this.titleEl) this.titleEl.textContent = nav.currentStop(m)?.page ?? '';\n if (this.progressEl) this.progressEl.style.setProperty('--mp-fill', String(stops > 0 ? (nav.stopIndex(m) + 1) / stops : 0));\n this.refreshView();\n }\n\n private wake(): void {\n this.root.setAttribute('data-idle', 'false');\n if (this.options.clickToAdvance) this.options.canvas.style.cursor = 'pointer';\n if (this.idleTimer) clearTimeout(this.idleTimer);\n this.idleTimer = setTimeout(() => {\n this.root.setAttribute('data-idle', 'true');\n this.options.canvas.style.cursor = 'none';\n }, IDLE_MS);\n }\n\n private showDigits(): void {\n this.jumpEl.textContent = this.digits ? `→ ${this.digits}` : '';\n this.jumpEl.setAttribute('data-active', this.digits ? 'true' : 'false');\n if (this.digitsTimer) clearTimeout(this.digitsTimer);\n this.digitsTimer = this.digits ? setTimeout(() => { this.digits = ''; this.showDigits(); }, DIGITS_MS) : null;\n }\n\n /** Something that moves the presentation: if the screen is blacked out (or the key list is open) the first press only brings it back. */\n private navigate(go: () => void): void {\n if (this.coverEl.getAttribute('data-mode') !== 'off') { this.setCover('off'); return; }\n if (this.helpEl.getAttribute('data-open') === 'true') { this.helpEl.setAttribute('data-open', 'false'); return; }\n go();\n }\n\n private handleKey(e: KeyboardEvent): void {\n if (this.destroyed || e.ctrlKey || e.metaKey || e.altKey) return;\n const t = e.target as HTMLElement | null;\n if (t && (t.tagName === 'INPUT' || t.tagName === 'TEXTAREA' || t.tagName === 'SELECT' || t.isContentEditable)) return;\n const k = e.key;\n let handled = true;\n this.wake();\n if (k === 'g' || k === 'G') { this.toggleOverview(); e.preventDefault(); return; }\n if (this.overviewOpen()) { if (this.handleOverviewKey(e)) e.preventDefault(); return; }\n if (k >= '0' && k <= '9' && k.length === 1) { this.digits = (this.digits + k).slice(0, 4); this.showDigits(); }\n else if (k === 'Enter' && this.digits) {\n const page = Number(this.digits) - 1; this.digits = ''; this.showDigits();\n this.navigate(() => { this.cancelAdvance(); void this.run(() => nav.goToPage(this.movie, page)); });\n }\n else if (k === 'Backspace' && this.digits) { this.digits = this.digits.slice(0, -1); this.showDigits(); }\n else if (NEXT_KEYS.has(k)) this.navigate(() => void this.next());\n else if (PREV_KEYS.has(k)) this.navigate(() => void this.prev());\n else if (k === 'Home') this.navigate(() => { this.cancelAdvance(); void this.run(() => nav.goToPage(this.movie, 0)); });\n else if (k === 'End') this.navigate(() => { this.cancelAdvance(); void this.run(() => nav.goToStop(this.movie, Math.max(0, (this.movie.stops?.length ?? 1) - 1))); });\n else if (k === 'b' || k === 'B' || k === '.') this.setCover(this.coverEl.getAttribute('data-mode') === 'black' ? 'off' : 'black');\n else if (k === 'w' || k === 'W' || k === ',') this.setCover(this.coverEl.getAttribute('data-mode') === 'white' ? 'off' : 'white');\n else if (k === 'p' || k === 'P') this.togglePresenterView();\n else if (k === 'f' || k === 'F') this.toggleFullscreen();\n else if (k === '?' || k === 'h' || k === 'H') this.helpEl.setAttribute('data-open', this.helpEl.getAttribute('data-open') === 'true' ? 'false' : 'true');\n else if (k === 'Escape') {\n if (this.helpEl.getAttribute('data-open') === 'true') this.helpEl.setAttribute('data-open', 'false');\n else if (this.coverEl.getAttribute('data-mode') !== 'off') this.setCover('off');\n else if (this.digits) { this.digits = ''; this.showDigits(); }\n else if (document.fullscreenElement === this.box) handled = false; // the browser's own Escape leaves fullscreen (and the change ends the session)\n else if (this.options.onExit) this.options.onExit();\n }\n else handled = false;\n if (handled) e.preventDefault();\n }\n\n // ── the presenter view: a second window for the speaker ──\n\n private togglePresenterView(): void {\n if (this.view && !this.view.win.closed) this.closePresenterView();\n else this.openPresenterView();\n }\n\n /** Open the speaker's window: what is on screen (live), the next picture, the notes of the page, a timer, and next / back. Returns it (null if the browser blocked the popup). */\n openPresenterView(): Window | null {\n if (this.view && !this.view.win.closed) { this.view.win.focus(); return this.view.win; }\n this.closePresenterView();\n const win = window.open('', 'pixi-effects-presenter-view', 'popup=yes,width=1180,height=720');\n if (!win) { console.warn('pixi-effects: Presenter: the browser blocked the presenter view popup; allow popups for this page and press P again.'); return null; }\n const doc = win.document;\n doc.title = 'Presenter view';\n const style = doc.createElement('style');\n style.textContent = VIEW_CSS;\n doc.head.appendChild(style);\n const { width, height } = this.options.canvas;\n doc.body.innerHTML = `<div class=\"pv\" style=\"--pv-ratio: ${width} / ${height}\">\n <div class=\"pv-main\"><div class=\"pv-label\">NOW</div><canvas class=\"pv-now\" width=\"${Math.min(width, 960)}\" height=\"${Math.round(height * Math.min(width, 960) / width)}\"></canvas></div>\n <div class=\"pv-side\">\n <div class=\"pv-top\"><span class=\"pv-count\"></span><span class=\"pv-title\"></span><span class=\"pv-timer\">00:00</span><button class=\"pv-reset\" type=\"button\">reset</button></div>\n <div><div class=\"pv-label\">NEXT</div><div class=\"pv-nextbox\" data-end=\"false\"><img class=\"pv-next\" alt=\"\"><div class=\"pv-end\">END OF THE TALK</div></div></div>\n <div class=\"pv-notes\" data-empty=\"true\"></div>\n <div class=\"pv-buttons\"><button class=\"pv-prev\" type=\"button\">◀ Back</button><button class=\"pv-nextbtn\" type=\"button\">Next ▶</button></div>\n </div></div>`;\n const els: Record<string, HTMLElement> = {};\n for (const c of ['count', 'title', 'timer', 'next', 'nextbox', 'notes', 'now']) els[c] = doc.querySelector(`.pv-${c}`) as HTMLElement;\n const started = Date.now();\n const onClose = () => { if (this.view && this.view.win === win) this.closePresenterView(); };\n const timer = setInterval(() => { els.timer!.textContent = clock(Date.now() - this.view!.started); }, 1000);\n this.view = { win, timer, started, els, onClose };\n (doc.querySelector('.pv-nextbtn') as HTMLElement).addEventListener('click', () => void this.next());\n (doc.querySelector('.pv-prev') as HTMLElement).addEventListener('click', () => void this.prev());\n (doc.querySelector('.pv-reset') as HTMLElement).addEventListener('click', () => { this.view!.started = Date.now(); els.timer!.textContent = '00:00'; });\n if (this.options.keyboard) doc.addEventListener('keydown', this.onKey);\n win.addEventListener?.('pagehide', onClose);\n this.movie.on('frame', this.onFrame);\n void this.ensureThumbs();\n this.refreshView();\n this.mirror();\n return win;\n }\n\n closePresenterView(): void {\n const v = this.view;\n if (!v) return;\n this.view = null;\n clearInterval(v.timer);\n this.movie.off('frame', this.onFrame);\n try { v.win.document.removeEventListener('keydown', this.onKey); v.win.removeEventListener?.('pagehide', v.onClose); } catch { /* the window is already gone */ }\n if (!v.win.closed) { try { v.win.close(); } catch { /* ignore */ } }\n }\n\n /** Copy what the movie has just drawn into the view (called from the `frame` event, right after the render, when the canvas can be read). */\n private mirror(): void {\n const v = this.view;\n if (!v || v.win.closed) return;\n const c = v.els.now as HTMLCanvasElement;\n c.getContext('2d')?.drawImage(this.options.canvas, 0, 0, c.width, c.height);\n }\n\n private refreshView(): void {\n const v = this.view;\n if (!v || v.win.closed) return;\n const m = this.movie;\n const stops = m.stops ?? [];\n const pages = nav.pageCount(m);\n const cur = nav.stopIndex(m);\n v.els.count!.textContent = pages > 0 ? `${nav.pageIndex(m) >= 0 ? nav.pageIndex(m) + 1 : '–'} / ${pages}` : '';\n v.els.title!.textContent = nav.currentStop(m)?.page ?? (cur < 0 ? stops[0]?.page ?? '' : '');\n // the notes of the page the talk is in (before the first stop: of the first page, \"coming up\"): the latest ones written on or before this stop\n const upTo = cur < 0 ? 0 : cur, pageIndex = stops[upTo]?.pageIndex;\n let notes = '';\n for (const s of stops) if (s.pageIndex === pageIndex && s.index <= upTo && s.notes) notes = s.notes;\n v.els.notes!.textContent = notes;\n v.els.notes!.setAttribute('data-empty', String(notes === ''));\n const next = stops[cur + 1];\n v.els.nextbox!.setAttribute('data-end', String(!next));\n const src = next ? this.thumbs.get(next.index) : undefined;\n if (src) v.els.next!.setAttribute('src', src); else v.els.next!.removeAttribute('src');\n }\n\n // ── the overview ──\n\n private pageStops(): Stop[] { return (this.movie.stops ?? []).filter(s => s.pageStart); }\n private overviewOpen(): boolean { return this.overviewEl.getAttribute('data-open') === 'true'; }\n\n private toggleOverview(): void {\n if (this.overviewOpen()) { this.overviewEl.setAttribute('data-open', 'false'); return; }\n if (this.pageStops().length === 0) return;\n this.cancelAdvance();\n if (this.movie.isPlaying) this.movie.pause();\n this.helpEl.setAttribute('data-open', 'false');\n this.buildOverview();\n this.overviewEl.setAttribute('data-open', 'true');\n void this.ensureThumbs();\n }\n\n /**\n * Make a picture of every stop, once. Taking them moves the playhead through the stops and back, which the audience would see:\n * `start()` does it before anything is shown (behind a \"Preparing\" cover), and an overview opened before that does it on the spot.\n */\n /** Make the page pictures now (the overview and the presenter view use them): `start()` does it before the audience sees anything. */\n ensureThumbs(): Promise<void> {\n this.thumbsPromise ??= (async () => {\n try {\n await stopImages(this.movie, {\n which: 'stops', as: 'dataURL', type: 'image/jpeg', quality: 0.72, scale: Math.min(1, 480 / Math.max(1, this.options.canvas.width)),\n onImage: img => { this.thumbs.set(img.stop.index, img.image as string); this.onThumb(img.stop.index); },\n });\n } catch (err) {\n console.warn('pixi-effects: Presenter: could not make the page pictures:', err);\n this.thumbsPromise = null;\n }\n })();\n return this.thumbsPromise;\n }\n\n /** A page's picture is its last stop's (the page fully built). */\n private pageThumb(page: number): string | undefined {\n const stops = (this.movie.stops ?? []).filter(s => s.pageIndex === page);\n return stops.length ? this.thumbs.get(stops[stops.length - 1]!.index) : undefined;\n }\n\n private onThumb(stopIndex: number): void {\n const stop = this.movie.stops?.[stopIndex];\n if (stop) this.fillThumb(stop.pageIndex);\n this.refreshView();\n }\n\n private buildOverview(): void {\n const pages = this.pageStops();\n const { width, height } = this.options.canvas;\n const cols = Math.min(5, Math.max(2, Math.ceil(Math.sqrt(pages.length))));\n this.gridEl.style.setProperty('--mp-cols', String(cols));\n this.gridEl.style.setProperty('--mp-ratio', `${width} / ${height}`);\n this.gridEl.innerHTML = '';\n const current = Math.max(0, nav.pageIndex(this.movie));\n pages.forEach((s, i) => {\n const cell = document.createElement('div');\n cell.className = 'mp-cell';\n cell.setAttribute('data-current', String(i === nav.pageIndex(this.movie)));\n cell.setAttribute('data-selected', String(i === current));\n cell.innerHTML = `<div class=\"mp-cell-label\"><span class=\"mp-cell-num\">${i + 1}</span><span class=\"mp-cell-name\"></span></div>`;\n (cell.querySelector('.mp-cell-name') as HTMLElement).textContent = s.page ?? '';\n cell.addEventListener('click', () => { this.overviewEl.setAttribute('data-open', 'false'); this.cancelAdvance(); void this.run(() => nav.goToPage(this.movie, i)); });\n this.gridEl.appendChild(cell);\n this.fillThumb(i);\n });\n this.overviewSel = current;\n }\n\n private fillThumb(page: number): void {\n const cell = this.gridEl.children[page] as HTMLElement | undefined;\n const src = this.pageThumb(page);\n if (!cell || !src || cell.querySelector('img')) return;\n const img = document.createElement('img');\n img.alt = ''; img.src = src;\n cell.insertBefore(img, cell.firstChild);\n }\n\n private select(i: number): void {\n const cells = [...this.gridEl.children] as HTMLElement[];\n this.overviewSel = Math.min(cells.length - 1, Math.max(0, i));\n cells.forEach((c, k) => c.setAttribute('data-selected', String(k === this.overviewSel)));\n cells[this.overviewSel]?.scrollIntoView?.({ block: 'nearest' });\n }\n\n private handleOverviewKey(e: KeyboardEvent): boolean {\n const cols = Number(this.gridEl.style.getPropertyValue('--mp-cols')) || 3;\n switch (e.key) {\n case 'ArrowRight': this.select(this.overviewSel + 1); return true;\n case 'ArrowLeft': this.select(this.overviewSel - 1); return true;\n case 'ArrowDown': this.select(this.overviewSel + cols); return true;\n case 'ArrowUp': this.select(this.overviewSel - cols); return true;\n case 'Enter': { const page = this.overviewSel; this.overviewEl.setAttribute('data-open', 'false'); this.cancelAdvance(); void this.run(() => nav.goToPage(this.movie, page)); return true; }\n case 'Escape': this.overviewEl.setAttribute('data-open', 'false'); return true;\n default: return NEXT_KEYS.has(e.key) || PREV_KEYS.has(e.key); // swallowed: the presentation does not move underneath\n }\n }\n\n private handleClick(): void {\n if (this.swiped) { this.swiped = false; return; }\n this.wake();\n this.navigate(() => void this.next());\n }\n\n private handlePointerUp(e: PointerEvent): void {\n const d = this.downAt; this.downAt = null;\n if (!d) return;\n const dx = e.clientX - d.x, dy = e.clientY - d.y;\n if (Math.abs(dx) < SWIPE_PX || Math.abs(dy) > Math.abs(dx)) return;\n this.swiped = true;\n this.wake();\n this.navigate(() => void (dx < 0 ? this.next() : this.prev()));\n }\n}\n","import type { CompositionSpec, SequenceSpec, TransitionSpec, Keyframe, Props, StopSpec } from '../index';\nimport { warnUnknownOptions } from '../index';\n\nconst PAGE_KEYS = ['name', 'duration', 'sequences', 'stops', 'notes', 'advance', 'initial', 'keyframes', 'filters', 'filterArea', 'blendMode', 'mask'] as const;\nconst DECK_KEYS = ['pages', 'transition', 'width', 'height', 'frameRate', 'background', 'canvas', 'assets', 'poster', 'motionBlur', 'loader'] as const;\n\nexport interface DeckPage {\n /** The page's name: shown by the Presenter, and in the stops list. */\n name?: string;\n /** How long the page lasts, seconds (including any transition into the next page, see `DeckOptions.transition`). Required. */\n duration: number;\n /** The page's layers, written in the page's own time (`at: 0` is the start of the page). */\n sequences: SequenceSpec[];\n /** Where the page stops, in the page's own time: the first is the page settled, the rest are steps (a bullet appears, a chart grows). Default: where the transition into the next page begins (the end for the last page). */\n stops?: Array<number | { at: number; pdf?: boolean }>;\n /** Speaker notes (kept on the page's first stop). */\n notes?: string;\n /** Move on by itself this many seconds after the page's last stop (kiosk mode). */\n advance?: number;\n /** The page is itself a layer: it may carry `initial`, `keyframes`, `filters`, … (fade or slide the whole page, for instance). */\n initial?: Props;\n keyframes?: Keyframe[];\n}\n\n/** A transition spec without the parts `deck()` fills in (which two pages, and when). */\nexport type DeckTransition = TransitionSpec extends infer T ? (T extends TransitionSpec ? Omit<T, 'from' | 'to' | 'at'> : never) : never;\n\nexport interface DeckOptions {\n pages: DeckPage[];\n /**\n * A transition between every two pages: `{ kind: 'crossfade' | 'slide' | 'wipe' | 'iris' | 'dip' | 'zoom' | 'dissolve' | 'luma', duration, …its own options }` (see Transitions). The next page starts\n * `duration` seconds before the current one ends, and the transition plays across the overlap.\n */\n transition?: DeckTransition;\n}\n\n/** What `deck()` returns: spread it into `movie.init` (`{ duration, composition: { sequences, transitions?, stops } }` plus any movie option you passed). */\nexport interface DeckResult {\n duration: number;\n composition: CompositionSpec;\n [movieOption: string]: unknown;\n}\n\n/**\n * A deck of pages as one movie. Each page is a nested composition laid out after the one before (so its layers use the page's own\n * time), the stops (where a `Presenter` pauses) come from the pages, and an optional `transition` joins the pages with the existing\n * crossfade / slide / wipe / … transitions.\n *\n * ```js\n * await movie.init({ canvas, width: 1280, height: 720, frameRate: 30, ...deck({\n * transition: { kind: 'slide', duration: 0.6, direction: 'left' },\n * pages: [\n * { name: 'Hello', duration: 5, stops: [1.2], sequences: [ …title, subtitle… ] },\n * { name: 'Why', duration: 8, stops: [1.2, 3, 5], sequences: [ …three bullets, at 1.2, 3, 5… ] },\n * ],\n * }) });\n * movie.on('ready', …); new Presenter(movie, { canvas });\n * ```\n */\nexport function deck(options: DeckOptions): DeckResult {\n if (!options || !Array.isArray(options.pages) || options.pages.length === 0) throw new Error('deck(): pages must be a list with at least one page: { pages: [{ name, duration, stops, sequences }] }');\n warnUnknownOptions('deck()', options, DECK_KEYS);\n const { pages, transition, ...movieOptions } = options as DeckOptions & Record<string, unknown>;\n pages.forEach((p, i) => {\n if (!p || typeof p !== 'object') throw new Error(`deck(): pages[${i}] must be an object`);\n warnUnknownOptions(`deck() pages[${i}]`, p, PAGE_KEYS);\n if (!(typeof p.duration === 'number' && Number.isFinite(p.duration) && p.duration > 0)) throw new Error(`deck(): pages[${i}].duration must be a positive number of seconds, got ${String(p.duration)}`);\n if (!Array.isArray(p.sequences)) throw new Error(`deck(): pages[${i}].sequences must be a list of layers (it may be empty), got ${typeof p.sequences}`);\n });\n let overlap = 0;\n if (transition) {\n if (!(typeof transition.duration === 'number' && transition.duration > 0)) throw new Error('deck(): transition needs a duration in seconds: { kind: \\'crossfade\\', duration: 0.6 }');\n const shortest = Math.min(...pages.map(p => p.duration));\n if (pages.length > 1 && transition.duration >= shortest) throw new Error(`deck(): the transition (${transition.duration} s) must be shorter than every page (the shortest is ${shortest} s)`);\n overlap = pages.length > 1 ? transition.duration : 0;\n }\n\n const sequences: SequenceSpec[] = [];\n const transitions: TransitionSpec[] = [];\n const stops: StopSpec[] = [];\n let start = 0;\n pages.forEach((page, i) => {\n const id = `page-${i + 1}`;\n const label = page.name ? `\"${page.name}\"` : `pages[${i}]`;\n const isLast = i === pages.length - 1;\n const entries = (page.stops ?? [isLast ? page.duration : page.duration - overlap]).map((e, k) => {\n if (e && typeof e === 'object') warnUnknownOptions(`deck() page ${label} stops[${k}]`, e, ['at', 'pdf']);\n return typeof e === 'object' && e !== null ? e : { at: e as number };\n });\n const local = entries.map(e => e.at);\n local.forEach((s, k) => {\n if (!(typeof s === 'number' && Number.isFinite(s) && s > 0 && s <= page.duration + 1e-9)) throw new Error(`deck(): page ${label} has stop ${String(s)}, outside the page (0 to ${page.duration} s)`);\n if (k > 0 && s <= local[k - 1]!) throw new Error(`deck(): page ${label} stops must be in order, earliest first (got ${local.join(', ')})`);\n });\n const { name: _n, duration: _d, sequences: inner, stops: _s, notes: _no, advance: _a, ...layerProps } = page;\n sequences.push({ type: 'composition', name: id, at: round(start), duration: page.duration, ...layerProps, sequences: inner } as unknown as SequenceSpec);\n local.forEach((s, k) => {\n const stop: StopSpec = { at: round(start + s) };\n if (k === 0) { stop.page = page.name ?? true; if (page.notes !== undefined) stop.notes = page.notes; }\n if (k === local.length - 1 && page.advance !== undefined) stop.advance = page.advance;\n if (entries[k]!.pdf !== undefined) stop.pdf = entries[k]!.pdf;\n stops.push(stop);\n });\n if (transition && !isLast) {\n const next = start + page.duration - overlap;\n transitions.push({ ...transition, from: id, to: `page-${i + 2}`, at: round(next), duration: transition.duration } as unknown as TransitionSpec);\n }\n start = start + page.duration - (isLast ? 0 : overlap);\n });\n\n const composition: CompositionSpec = { sequences, stops };\n if (transitions.length > 0) composition.transitions = transitions;\n return { ...movieOptions, duration: round(start), composition };\n}\n\nconst round = (v: number): number => Math.round(v * 1e6) / 1e6;\n"]}
|