@squadbase/vantage 0.6.1 → 0.6.2-dev1.3e69e88
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/dist/add-DY4AXANK.js +6 -0
- package/dist/add-DY4AXANK.js.map +1 -0
- package/dist/{build-O5TVNH4E.js → build-JB4VOMUI.js} +3 -3
- package/dist/{build-O5TVNH4E.js.map → build-JB4VOMUI.js.map} +1 -1
- package/dist/{check-WFBEDHDR.js → check-ZJYK6RLG.js} +3 -3
- package/dist/{check-WFBEDHDR.js.map → check-ZJYK6RLG.js.map} +1 -1
- package/dist/{chunk-PLST5Q7T.js → chunk-MP3QSOXL.js} +21 -10
- package/dist/chunk-MP3QSOXL.js.map +1 -0
- package/dist/chunk-PXRX5PEC.js +54 -0
- package/dist/chunk-PXRX5PEC.js.map +1 -0
- package/dist/{chunk-3G43C6OL.js → chunk-QI3XQKHS.js} +39 -3
- package/dist/chunk-QI3XQKHS.js.map +1 -0
- package/dist/{chunk-MXI3PZFT.js → chunk-RPZAALCX.js} +5 -49
- package/dist/chunk-RPZAALCX.js.map +1 -0
- package/dist/{chunk-QDZA5JSL.js → chunk-U2M6HGKQ.js} +3 -3
- package/dist/{chunk-QDZA5JSL.js.map → chunk-U2M6HGKQ.js.map} +1 -1
- package/dist/cli.js +14 -11
- package/dist/cli.js.map +1 -1
- package/dist/components/index.d.ts +7 -0
- package/dist/components/index.js +3 -2
- package/dist/{dev-NZRLOQCL.js → dev-FCEC3UKQ.js} +17 -6
- package/dist/dev-FCEC3UKQ.js.map +1 -0
- package/dist/doc/index.d.ts +4 -0
- package/dist/doc/index.js +107 -11
- package/dist/doc/index.js.map +1 -1
- package/dist/{docs-ZGDJUHJI.js → docs-EJJ3BECT.js} +3 -3
- package/dist/{docs-ZGDJUHJI.js.map → docs-EJJ3BECT.js.map} +1 -1
- package/dist/{doctor-VFKEMR54.js → doctor-WHZXPERA.js} +4 -4
- package/dist/doctor-WHZXPERA.js.map +1 -0
- package/dist/{preview-QDCIVVSR.js → preview-OGMCNQUO.js} +12 -4
- package/dist/preview-OGMCNQUO.js.map +1 -0
- package/dist/{routes-RHP5FVGD.js → routes-GTFO5PUF.js} +3 -3
- package/dist/{routes-RHP5FVGD.js.map → routes-GTFO5PUF.js.map} +1 -1
- package/dist/{search-RFBELGY7.js → search-6Y422SV6.js} +3 -3
- package/dist/{search-RFBELGY7.js.map → search-6Y422SV6.js.map} +1 -1
- package/dist/slide/index.js +61 -15
- package/dist/slide/index.js.map +1 -1
- package/dist/table/index.js +3 -2
- package/dist/table/index.js.map +1 -1
- package/dist/ui/index.js +2 -1
- package/dist/ui/index.js.map +1 -1
- package/dist/{upgrade-GF2P67M6.js → upgrade-AL4KZZR4.js} +4 -4
- package/dist/{upgrade-GF2P67M6.js.map → upgrade-AL4KZZR4.js.map} +1 -1
- package/docs/en/changelog.md +24 -0
- package/docs/en/cli-reference.md +30 -0
- package/docs/en/parts/page-shell.md +1 -1
- package/docs/en/routing.md +4 -2
- package/docs/ja/changelog.md +24 -0
- package/docs/ja/cli-reference.md +29 -0
- package/docs/ja/parts/page-shell.md +1 -1
- package/docs/ja/routing.md +4 -2
- package/package.json +6 -2
- package/templates/agents/doc.md +2 -0
- package/theme.css +44 -0
- package/dist/add-EISGSZAH.js +0 -6
- package/dist/add-EISGSZAH.js.map +0 -1
- package/dist/chunk-3G43C6OL.js.map +0 -1
- package/dist/chunk-MXI3PZFT.js.map +0 -1
- package/dist/chunk-PLST5Q7T.js.map +0 -1
- package/dist/dev-NZRLOQCL.js.map +0 -1
- package/dist/doctor-VFKEMR54.js.map +0 -1
- package/dist/preview-QDCIVVSR.js.map +0 -1
package/dist/slide/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/slide/constants.ts","../../src/slide/canvas.tsx","../../src/slide/dom.ts","../../src/slide/print-ready.ts","../../src/slide/slide-context.tsx","../../src/slide/theme.ts","../../src/slide/export-pptx.ts","../../src/slide/keys.ts","../../src/slide/rail.tsx","../../src/slide/toolbar.tsx","../../src/slide/use-prefers-reduced-motion.ts","../../src/slide/steps.tsx","../../src/slide/transition-layer.tsx","../../src/slide/use-click-nav.ts","../../src/slide/deck.tsx","../../src/slide/morph-element.tsx"],"names":["jsx","useRef","useState","jsxs","useEffect","createContext","useMemo","useLayoutEffect","useContext","to","Fragment","Children","isValidElement","useCallback","cloneElement"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/sdk.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: kept only the canvas dimensions; the slide-module types\n * around them describe open-slide's own file layout, which\n * Vantage replaces with `<SlideDeck>` children.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\n\n/**\n * Every slide is authored against this fixed canvas and scaled to fit the\n * viewport. A fixed pixel canvas is what makes a deck look identical on a\n * laptop, a projector and in the exported pptx — the alternative, responsive\n * layout, means a deck that reflows differently everywhere it is shown.\n */\nexport const CANVAS_WIDTH = 1920\nexport const CANVAS_HEIGHT = 1080\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/components/slide-canvas.tsx\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: Tailwind classes and `cn` replaced with inline styles (the\n * slide runtime emits no utility classes, so a deck looks the\n * same whatever the app's Tailwind content scan picked up);\n * `--osd-*` renamed to `--slide-*`; the chrome-only `flat`,\n * `center` and `freezeMotion` props dropped.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport { useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode } from \"react\"\nimport { CANVAS_HEIGHT, CANVAS_WIDTH } from \"./constants\"\n\nexport interface SlideCanvasProps {\n children: ReactNode\n /** Use this scale instead of fitting to the container (used by thumbnails). */\n scale?: number\n /** Custom properties applied to both the frame and the canvas. */\n themeVars?: CSSProperties\n}\n\n/**\n * The fixed 1920×1080 canvas, scaled to fit whatever box it is given. Slides\n * are authored in canvas pixels and never reflow — resizing the window changes\n * the scale, not the layout.\n */\nexport function SlideCanvas({ children, scale, themeVars }: SlideCanvasProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [fitScale, setFitScale] = useState<number | null>(null)\n\n useLayoutEffect(() => {\n if (scale !== undefined) return\n const el = containerRef.current\n if (!el) return\n const measure = () => {\n const { width, height } = el.getBoundingClientRect()\n if (width === 0 || height === 0) return\n setFitScale(Math.min(width / CANVAS_WIDTH, height / CANVAS_HEIGHT))\n }\n // Measured synchronously before paint, so the fitted scale lands on the\n // first visible frame — with `useEffect` the canvas flashes at full size.\n measure()\n const observer = new ResizeObserver(measure)\n observer.observe(el)\n return () => observer.disconnect()\n }, [scale])\n\n const measured = scale ?? fitScale\n const s = measured ?? 1\n\n return (\n <div ref={containerRef} style={{ position: \"relative\", height: \"100%\", width: \"100%\" }}>\n <div\n style={{\n position: \"absolute\",\n left: \"50%\",\n top: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: CANVAS_WIDTH * s,\n height: CANVAS_HEIGHT * s,\n overflow: \"hidden\",\n background: \"var(--slide-bg)\",\n color: \"var(--slide-fg)\",\n // Hidden until measured — the same flash the layout effect avoids,\n // for the frame this time.\n visibility: measured === null ? \"hidden\" : undefined,\n ...themeVars,\n }}\n >\n <div\n data-slide-canvas=\"\"\n style={{\n width: CANVAS_WIDTH,\n height: CANVAS_HEIGHT,\n transform: `scale(${s})`,\n transformOrigin: \"top left\",\n fontFamily: \"var(--slide-font-body)\",\n fontSize: \"var(--slide-size-body)\",\n ...themeVars,\n }}\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/dom.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: dropped `dragHasFiles` (only the authoring IDE's drop zones\n * used it, and Vantage ports no authoring surface).\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function nextFrame(): Promise<void> {\n return new Promise((resolve) => requestAnimationFrame(() => resolve()))\n}\n\n/** rAF in a real tab; a timeout fallback for hidden or throttled ones. */\nexport function nextPaint(): Promise<void> {\n return new Promise((resolve) => {\n let settled = false\n const settle = () => {\n if (settled) return\n settled = true\n resolve()\n }\n requestAnimationFrame(settle)\n setTimeout(settle, 50)\n })\n}\n\nexport function downloadBlob(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob)\n const a = document.createElement(\"a\")\n a.href = url\n a.download = filename\n a.rel = \"noopener\"\n document.body.appendChild(a)\n a.click()\n a.remove()\n setTimeout(() => URL.revokeObjectURL(url), 0)\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/print-ready.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: none of substance.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport { nextFrame } from \"./dom\"\n\nconst DEFAULT_WAITFOR_TIMEOUT_MS = 10_000\n\n/**\n * `document.fonts.ready` already waits for every face CSS actually asked for.\n * Never call `face.load()` on the rest: unloaded faces were never requested,\n * and `load()` ignores `unicode-range` — so a subsetted CJK family (hundreds\n * of faces) would be force-downloaded whole and hang or crash the tab.\n */\nexport async function waitForFonts(): Promise<void> {\n if (!(\"fonts\" in document)) return\n await document.fonts.ready\n}\n\n/**\n * Wait for anything a slide marked with `data-waitfor=\"<selector>\"` to appear.\n * A chart that draws into a canvas is the usual case: without this the capture\n * happens before the canvas exists and the slide exports blank.\n */\nexport async function waitForDataWaitfor(\n root: HTMLElement,\n timeoutMs = DEFAULT_WAITFOR_TIMEOUT_MS,\n): Promise<void> {\n const targets = Array.from(root.querySelectorAll<HTMLElement>(\"[data-waitfor]\"))\n if (targets.length === 0) return\n const deadline = performance.now() + timeoutMs\n await Promise.all(\n targets.map(async (el) => {\n const selector = el.getAttribute(\"data-waitfor\")\n if (!selector) return\n while (performance.now() < deadline) {\n try {\n if (el.querySelector(selector)) return\n } catch {\n return // invalid selector — skip rather than hang\n }\n await nextFrame()\n }\n }),\n )\n}\n\n/** Whether every finite animation inside a frame has finished playing. */\nexport function isFrameAnimationSettled(frame: Element): boolean {\n if (typeof document.getAnimations !== \"function\") return true\n for (const animation of document.getAnimations()) {\n const effect = animation.effect as KeyframeEffect | null\n if (!effect) continue\n const target = effect.target\n if (!target || !frame.contains(target)) continue\n // A looping animation never finishes; waiting on it would always time out.\n if (effect.getComputedTiming().iterations === Infinity) continue\n if (animation.playState !== \"finished\") return false\n }\n return true\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/page-context.tsx\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: `useSlidePageNumber` renamed to `useSlideNumber`; returns 0\n * of 0 outside a deck instead of throwing, so a slide can be\n * previewed on its own; the globalThis context trick dropped\n * (tsup's shared chunk already gives the whole framework one\n * module instance — the same property `router/registry` rests\n * on).\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport { createContext, useContext, useMemo, type PropsWithChildren } from \"react\"\n\ninterface SlideNumberContextValue {\n index: number\n total: number\n}\n\nconst SlideNumberContext = createContext<SlideNumberContextValue | null>(null)\n\nexport function SlideNumberProvider({\n index,\n total,\n children,\n}: PropsWithChildren<{ index: number; total: number }>) {\n const value = useMemo(() => ({ index, total }), [index, total])\n return <SlideNumberContext.Provider value={value}>{children}</SlideNumberContext.Provider>\n}\n\n/**\n * \"Slide 3 of 12\", for a page-number footer. 1-based, because that is what\n * goes on the slide. Outside a deck it reports 0 of 0 rather than throwing —\n * a slide body should stay renderable in isolation.\n */\nexport function useSlideNumber(): { current: number; total: number } {\n const ctx = useContext(SlideNumberContext)\n if (!ctx) return { current: 0, total: 0 }\n return { current: ctx.index + 1, total: ctx.total }\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/design.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: `--osd-*` renamed to `--slide-*`; every field made optional\n * so an omitted token falls through to theme.css instead of a\n * hard-coded default (that is what keeps a deck following the\n * app's palette and its light/dark switch).\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport type { CSSProperties } from \"react\"\nimport type { SlideTheme } from \"./types\"\n\n/**\n * A deck's theme as inline custom properties. Only the keys the deck actually\n * set are emitted — the rest resolve up the cascade to `theme.css`, where\n * `--slide-*` alias the app's own tokens and therefore follow `.dark` on their\n * own. Writing defaults here instead would freeze every deck to light.\n */\nexport function themeToCssVars(theme: SlideTheme | undefined): CSSProperties | undefined {\n if (!theme) return undefined\n const vars: Record<string, string> = {}\n if (theme.bg) vars[\"--slide-bg\"] = theme.bg\n if (theme.fg) vars[\"--slide-fg\"] = theme.fg\n if (theme.accent) vars[\"--slide-accent\"] = theme.accent\n if (theme.muted) vars[\"--slide-muted\"] = theme.muted\n if (theme.fontDisplay) vars[\"--slide-font-display\"] = theme.fontDisplay\n if (theme.fontBody) vars[\"--slide-font-body\"] = theme.fontBody\n if (theme.sizeHero !== undefined) vars[\"--slide-size-hero\"] = `${theme.sizeHero}px`\n if (theme.sizeBody !== undefined) vars[\"--slide-size-body\"] = `${theme.sizeBody}px`\n if (theme.radius !== undefined) vars[\"--slide-radius\"] = `${theme.radius}px`\n return Object.keys(vars).length > 0 ? (vars as CSSProperties) : undefined\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/export-pptx.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: takes rendered elements instead of a slide module;\n * `designToCssVars` replaced with `themeToCssVars`;\n * `getFontEmbedCSS` is computed once for the whole deck\n * rather than per page; `--osd-*`/`data-osd-*` renamed.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport { createElement, type ReactElement } from \"react\"\nimport { createRoot, type Root } from \"react-dom/client\"\nimport { CANVAS_HEIGHT, CANVAS_WIDTH } from \"./constants\"\nimport { downloadBlob, nextPaint, sleep } from \"./dom\"\nimport { isFrameAnimationSettled, waitForDataWaitfor, waitForFonts } from \"./print-ready\"\nimport { SlideNumberProvider } from \"./slide-context\"\nimport { themeToCssVars } from \"./theme\"\nimport type { SlideTheme } from \"./types\"\n\n/** 16:9 widescreen in English Metric Units (914400 per inch -> 13.333in x 7.5in). */\nconst EMU_W = 12192000\nconst EMU_H = 6858000\n/** 2x the canvas: 3840x2160, which still looks sharp projected. */\nconst CAPTURE_PIXEL_RATIO = 2\n\nconst ANIMATION_TIMEOUT_MS = 15_000\nconst POLL_INTERVAL_MS = 100\n\nconst CAPTURE_CLASS = \"vantage-slide-capture\"\n\n/**\n * Properties an intro animation drives from a hidden start state to a visible\n * end state. They are read back once settled and pinned inline so the capture\n * clone cannot replay the keyframes from their invisible 0% frame.\n */\nconst FROZEN_PROPS = [\"opacity\", \"transform\", \"filter\", \"clip-path\"] as const\n\nexport interface PptxExportProgress {\n phase: \"processing\" | \"generating\" | \"done\"\n /** Slides captured so far (0..total). */\n current: number\n total: number\n /** 0-95 while capturing, 98 while assembling, 100 when done. */\n percent: number\n}\n\nexport interface ExportDeckOptions {\n slides: ReactElement[]\n /** Base name of the downloaded file, without the extension. */\n fileName: string\n theme?: SlideTheme\n onProgress?: (progress: PptxExportProgress) => void\n}\n\n/**\n * Render every slide offscreen, rasterise it, and pack the images into a pptx.\n *\n * The deck is exported as pictures, not text. That is a deliberate trade: the\n * result is not searchable or editable, but it needs no font on the receiving\n * machine and reproduces the slide exactly — including Japanese, which is the\n * case that breaks text-based exporters. It also keeps the whole thing in the\n * browser: no Chromium, no Lambda, nothing to operate.\n */\nexport async function exportDeckAsPptx({\n slides,\n fileName,\n theme,\n onProgress,\n}: ExportDeckOptions): Promise<void> {\n if (slides.length === 0) return\n\n const total = slides.length\n onProgress?.({ phase: \"processing\", current: 0, total, percent: 0 })\n\n const container = document.createElement(\"div\")\n container.className = CAPTURE_CLASS\n container.setAttribute(\"aria-hidden\", \"true\")\n Object.assign(container.style, {\n position: \"fixed\",\n left: \"-99999px\",\n top: \"0\",\n pointerEvents: \"none\",\n })\n document.body.appendChild(container)\n\n // html-to-image clones each frame and copies its computed style — including\n // the intro animation — into the clone, which then replays the keyframes\n // from their hidden 0% frame inside the rasterised SVG. Fast-forwarding\n // every animation to its end frame in the live DOM is what stops the export\n // coming out as blank pages. A large negative delay lands past a 1ms\n // duration, so even pseudo-elements paint their final state immediately.\n const captureStyle = document.createElement(\"style\")\n captureStyle.textContent = `.${CAPTURE_CLASS} *, .${CAPTURE_CLASS} *::before, .${CAPTURE_CLASS} *::after {\n animation-delay: -1s !important;\n animation-duration: 1ms !important;\n animation-iteration-count: 1 !important;\n animation-fill-mode: forwards !important;\n transition: none !important;\n }`\n document.head.appendChild(captureStyle)\n\n const themeVars = themeToCssVars(theme)\n const roots: Root[] = []\n const frames: HTMLElement[] = []\n\n for (let i = 0; i < slides.length; i++) {\n const slide = slides[i]\n if (!slide) continue\n const host = document.createElement(\"div\")\n host.setAttribute(\"data-slide-canvas\", \"\")\n Object.assign(host.style, {\n width: `${CANVAS_WIDTH}px`,\n height: `${CANVAS_HEIGHT}px`,\n overflow: \"hidden\",\n background: \"var(--slide-bg)\",\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n fontSize: \"var(--slide-size-body)\",\n })\n if (themeVars) {\n for (const [key, value] of Object.entries(themeVars)) {\n host.style.setProperty(key, String(value))\n }\n }\n container.appendChild(host)\n frames.push(host)\n const root = createRoot(host)\n // No StepHost here on purpose: without one, `<Steps>` reveals everything,\n // which is the state a slide should be exported in.\n root.render(createElement(SlideNumberProvider, { index: i, total }, slide))\n roots.push(root)\n }\n\n // Yield once so React commits every slide and intro animations actually start.\n await nextPaint()\n\n try {\n await waitForFonts()\n\n const deadline = performance.now() + ANIMATION_TIMEOUT_MS\n while (performance.now() < deadline) {\n if (frames.every((frame) => isFrameAnimationSettled(frame))) break\n await sleep(POLL_INTERVAL_MS)\n }\n await waitForDataWaitfor(container)\n\n const { toBlob, getFontEmbedCSS } = await import(\"html-to-image\")\n // Resolved once for the whole deck rather than per frame: the upstream\n // per-page call re-downloads and re-encodes every webfont for each slide.\n const fontEmbedCSS = await getFontEmbedCSS(container)\n\n const images: Uint8Array[] = []\n for (let i = 0; i < frames.length; i++) {\n const frame = frames[i]!\n freezeForCapture(frame)\n const blob = await toBlob(frame, {\n width: CANVAS_WIDTH,\n height: CANVAS_HEIGHT,\n pixelRatio: CAPTURE_PIXEL_RATIO,\n fontEmbedCSS,\n cacheBust: true,\n })\n if (!blob) throw new Error(`Failed to capture slide ${i + 1}.`)\n images.push(new Uint8Array(await blob.arrayBuffer()))\n onProgress?.({\n phase: \"processing\",\n current: i + 1,\n total,\n percent: Math.min(95, ((i + 1) / total) * 95),\n })\n }\n\n onProgress?.({ phase: \"generating\", current: total, total, percent: 98 })\n const pptx = await buildImagePptx(images)\n downloadBlob(\n new Blob([pptx as BlobPart], {\n type: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n }),\n `${fileName}.pptx`,\n )\n } finally {\n onProgress?.({ phase: \"done\", current: total, total, percent: 100 })\n for (const root of roots) root.unmount()\n container.remove()\n captureStyle.remove()\n }\n}\n\n/**\n * Pin each element's settled visual state inline and drop its animation, so\n * the clone html-to-image rasterises renders the final frame instead of\n * replaying the (initially invisible) keyframes. Pseudo-elements are covered\n * by the capture stylesheet instead, which cannot be reached from script.\n */\nfunction freezeForCapture(root: HTMLElement): void {\n for (const el of root.querySelectorAll<HTMLElement>(\"*\")) {\n const styles = getComputedStyle(el)\n for (const prop of FROZEN_PROPS) {\n el.style.setProperty(prop, styles.getPropertyValue(prop), \"important\")\n }\n el.style.setProperty(\"animation\", \"none\", \"important\")\n el.style.setProperty(\"transition\", \"none\", \"important\")\n }\n}\n\nconst XML_DECL = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n'\nconst REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\"\nconst OD_REL = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n\n/*\n * ---------------------------------------------------------------------------\n * Minimal PresentationML, ported verbatim from open-slide. One full-bleed\n * picture per slide is all the format has to carry, which is why this is a few\n * hundred bytes of string templates and a zip rather than a pptx library —\n * pptxgenjs would add ~1 MB of text and shape authoring that never runs.\n * ---------------------------------------------------------------------------\n */\nasync function buildImagePptx(images: Uint8Array[]): Promise<Uint8Array> {\n const { zipSync, strToU8 } = await import(\"fflate\")\n const n = images.length\n const files: Record<string, Uint8Array> = {}\n\n files[\"[Content_Types].xml\"] = strToU8(contentTypesXml(n))\n files[\"_rels/.rels\"] = strToU8(rootRelsXml())\n files[\"ppt/presentation.xml\"] = strToU8(presentationXml(n))\n files[\"ppt/_rels/presentation.xml.rels\"] = strToU8(presentationRelsXml(n))\n files[\"ppt/presProps.xml\"] = strToU8(presPropsXml())\n files[\"ppt/theme/theme1.xml\"] = strToU8(themeXml())\n files[\"ppt/slideMasters/slideMaster1.xml\"] = strToU8(slideMasterXml())\n files[\"ppt/slideMasters/_rels/slideMaster1.xml.rels\"] = strToU8(slideMasterRelsXml())\n files[\"ppt/slideLayouts/slideLayout1.xml\"] = strToU8(slideLayoutXml())\n files[\"ppt/slideLayouts/_rels/slideLayout1.xml.rels\"] = strToU8(slideLayoutRelsXml())\n\n for (let i = 0; i < n; i++) {\n const image = images[i]\n if (!image) continue\n const idx = i + 1\n files[`ppt/slides/slide${idx}.xml`] = strToU8(slideXml())\n files[`ppt/slides/_rels/slide${idx}.xml.rels`] = strToU8(slideRelsXml(idx))\n files[`ppt/media/image${idx}.png`] = image\n }\n\n return zipSync(files)\n}\n\nfunction contentTypesXml(n: number): string {\n const slideOverrides = Array.from(\n { length: n },\n (_, i) =>\n `<Override PartName=\"/ppt/slides/slide${i + 1}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slide+xml\"/>`,\n ).join(\"\")\n return `${XML_DECL}<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/><Default Extension=\"png\" ContentType=\"image/png\"/><Override PartName=\"/ppt/presentation.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml\"/><Override PartName=\"/ppt/presProps.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.presProps+xml\"/><Override PartName=\"/ppt/slideMasters/slideMaster1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml\"/><Override PartName=\"/ppt/slideLayouts/slideLayout1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml\"/><Override PartName=\"/ppt/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/>${slideOverrides}</Types>`\n}\n\nfunction rootRelsXml(): string {\n return `${XML_DECL}<Relationships xmlns=\"${REL_NS}\"><Relationship Id=\"rId1\" Type=\"${OD_REL}/officeDocument\" Target=\"ppt/presentation.xml\"/></Relationships>`\n}\n\nfunction presentationXml(n: number): string {\n const sldIds = Array.from(\n { length: n },\n (_, i) => `<p:sldId id=\"${256 + i}\" r:id=\"rId${i + 3}\"/>`,\n ).join(\"\")\n return `${XML_DECL}<p:presentation xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"${OD_REL}\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\"><p:sldMasterIdLst><p:sldMasterId id=\"2147483648\" r:id=\"rId1\"/></p:sldMasterIdLst><p:sldIdLst>${sldIds}</p:sldIdLst><p:sldSz cx=\"${EMU_W}\" cy=\"${EMU_H}\"/><p:notesSz cx=\"6858000\" cy=\"9144000\"/></p:presentation>`\n}\n\nfunction presentationRelsXml(n: number): string {\n const rels = [\n `<Relationship Id=\"rId1\" Type=\"${OD_REL}/slideMaster\" Target=\"slideMasters/slideMaster1.xml\"/>`,\n `<Relationship Id=\"rId2\" Type=\"${OD_REL}/presProps\" Target=\"presProps.xml\"/>`,\n ]\n for (let i = 0; i < n; i++) {\n rels.push(\n `<Relationship Id=\"rId${i + 3}\" Type=\"${OD_REL}/slide\" Target=\"slides/slide${i + 1}.xml\"/>`,\n )\n }\n return `${XML_DECL}<Relationships xmlns=\"${REL_NS}\">${rels.join(\"\")}</Relationships>`\n}\n\nfunction presPropsXml(): string {\n return `${XML_DECL}<p:presentationPr xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"${OD_REL}\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\"/>`\n}\n\nfunction slideMasterXml(): string {\n return `${XML_DECL}<p:sldMaster xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"${OD_REL}\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr></p:spTree></p:cSld><p:clrMap bg1=\"lt1\" tx1=\"dk1\" bg2=\"lt2\" tx2=\"dk2\" accent1=\"accent1\" accent2=\"accent2\" accent3=\"accent3\" accent4=\"accent4\" accent5=\"accent5\" accent6=\"accent6\" hlink=\"hlink\" folHlink=\"folHlink\"/><p:sldLayoutIdLst><p:sldLayoutId id=\"2147483649\" r:id=\"rId1\"/></p:sldLayoutIdLst></p:sldMaster>`\n}\n\nfunction slideMasterRelsXml(): string {\n return `${XML_DECL}<Relationships xmlns=\"${REL_NS}\"><Relationship Id=\"rId1\" Type=\"${OD_REL}/slideLayout\" Target=\"../slideLayouts/slideLayout1.xml\"/><Relationship Id=\"rId2\" Type=\"${OD_REL}/theme\" Target=\"../theme/theme1.xml\"/></Relationships>`\n}\n\nfunction slideLayoutXml(): string {\n return `${XML_DECL}<p:sldLayout xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"${OD_REL}\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\" type=\"blank\" preserve=\"1\"><p:cSld name=\"Blank\"><p:spTree><p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr></p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>`\n}\n\nfunction slideLayoutRelsXml(): string {\n return `${XML_DECL}<Relationships xmlns=\"${REL_NS}\"><Relationship Id=\"rId1\" Type=\"${OD_REL}/slideMaster\" Target=\"../slideMasters/slideMaster1.xml\"/></Relationships>`\n}\n\nfunction slideXml(): string {\n return `${XML_DECL}<p:sld xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"${OD_REL}\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr><p:pic><p:nvPicPr><p:cNvPr id=\"2\" name=\"Slide\"/><p:cNvPicPr><a:picLocks noChangeAspect=\"1\"/></p:cNvPicPr><p:nvPr/></p:nvPicPr><p:blipFill><a:blip r:embed=\"rId2\"/><a:stretch><a:fillRect/></a:stretch></p:blipFill><p:spPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"${EMU_W}\" cy=\"${EMU_H}\"/></a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></p:spPr></p:pic></p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld>`\n}\n\nfunction slideRelsXml(idx: number): string {\n return `${XML_DECL}<Relationships xmlns=\"${REL_NS}\"><Relationship Id=\"rId1\" Type=\"${OD_REL}/slideLayout\" Target=\"../slideLayouts/slideLayout1.xml\"/><Relationship Id=\"rId2\" Type=\"${OD_REL}/image\" Target=\"../media/image${idx}.png\"/></Relationships>`\n}\n\nfunction themeXml(): string {\n return `${XML_DECL}<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\"><a:themeElements><a:clrScheme name=\"Office\"><a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1><a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1><a:dk2><a:srgbClr val=\"44546A\"/></a:dk2><a:lt2><a:srgbClr val=\"E7E6E6\"/></a:lt2><a:accent1><a:srgbClr val=\"4472C4\"/></a:accent1><a:accent2><a:srgbClr val=\"ED7D31\"/></a:accent2><a:accent3><a:srgbClr val=\"A5A5A5\"/></a:accent3><a:accent4><a:srgbClr val=\"FFC000\"/></a:accent4><a:accent5><a:srgbClr val=\"5B9BD5\"/></a:accent5><a:accent6><a:srgbClr val=\"70AD47\"/></a:accent6><a:hlink><a:srgbClr val=\"0563C1\"/></a:hlink><a:folHlink><a:srgbClr val=\"954F72\"/></a:folHlink></a:clrScheme><a:fontScheme name=\"Office\"><a:majorFont><a:latin typeface=\"Calibri Light\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:majorFont><a:minorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:minorFont></a:fontScheme><a:fmtScheme name=\"Office\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"110000\"/><a:satMod val=\"105000\"/><a:tint val=\"67000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"103000\"/><a:tint val=\"73000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"109000\"/><a:tint val=\"81000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:satMod val=\"103000\"/><a:lumMod val=\"102000\"/><a:tint val=\"94000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:satMod val=\"110000\"/><a:lumMod val=\"100000\"/><a:shade val=\"100000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"99000\"/><a:satMod val=\"120000\"/><a:shade val=\"78000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w=\"6350\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"12700\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"19050\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"><a:tint val=\"95000\"/><a:satMod val=\"170000\"/></a:schemeClr></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"93000\"/><a:satMod val=\"150000\"/><a:shade val=\"98000\"/><a:lumMod val=\"102000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:tint val=\"98000\"/><a:satMod val=\"130000\"/><a:shade val=\"90000\"/><a:lumMod val=\"103000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:shade val=\"63000\"/><a:satMod val=\"120000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements></a:theme>`\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/keys.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: none.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\n\nexport function isTypingTarget(target: EventTarget | null): boolean {\n return (\n target instanceof HTMLElement && (target.isContentEditable || target.matches(\"input, textarea\"))\n )\n}\n\n/** Single-letter shortcuts bail on this so browser combos (⌘P, ⌘F…) still work. */\nexport function hasModifier(e: KeyboardEvent): boolean {\n return e.altKey || e.ctrlKey || e.metaKey\n}\n\nexport function isForwardKey(e: KeyboardEvent): boolean {\n return e.key === \"ArrowRight\" || e.key === \"ArrowDown\" || e.key === \" \" || e.key === \"PageDown\"\n}\n\nexport function isBackwardKey(e: KeyboardEvent): boolean {\n return e.key === \"ArrowLeft\" || e.key === \"ArrowUp\" || e.key === \"PageUp\"\n}\n","/**\n * The slide list beside the deck. Not a port: open-slide shows the same thing\n * as a full-screen overview grid that replaces the slide, and its rail lives in\n * the authoring IDE with editing affordances Vantage has no counterpart for.\n * A rail keeps the current slide on screen while the reader looks for where to\n * jump, which is what a deck embedded in a dashboard wants.\n *\n * Styled from the deck's tokens rather than the app's, and neutral: every\n * surface here is `color-mix` of `--slide-fg` into `--slide-bg`, so the rail\n * is a tint of the deck's own paper and introduces no hue — a themed deck does\n * not end up with the dashboard's white column beside it, and the accent the\n * author picked stays a thing that only happens on slides.\n */\nimport { useEffect, useRef, type CSSProperties, type ReactElement } from \"react\"\nimport { SlideCanvas } from \"./canvas\"\nimport { CANVAS_HEIGHT, CANVAS_WIDTH } from \"./constants\"\nimport { SlideNumberProvider } from \"./slide-context\"\n\nconst THUMB_WIDTH = 176\nconst THUMB_HEIGHT = Math.round((THUMB_WIDTH * CANVAS_HEIGHT) / CANVAS_WIDTH)\nconst NUMBER_COLUMN = 20\nconst GUTTER = 10\n\n/** Wide enough for the thumbnail, its number and the gutters on both sides. */\nexport const RAIL_WIDTH = NUMBER_COLUMN + THUMB_WIDTH + GUTTER * 3\n\nexport interface SlideRailProps {\n slides: ReactElement[]\n index: number\n onSelect: (index: number) => void\n /** The deck's token overrides, so a thumbnail matches the slide it stands for. */\n themeVars?: CSSProperties\n}\n\nconst ITEM_BUTTON: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: GUTTER,\n width: \"100%\",\n padding: 0,\n border: \"none\",\n background: \"transparent\",\n color: \"inherit\",\n font: \"inherit\",\n cursor: \"pointer\",\n textAlign: \"left\",\n}\n\nexport function SlideRail({ slides, index, onSelect, themeVars }: SlideRailProps) {\n const listRef = useRef<HTMLOListElement>(null)\n\n // Follow the deck: arrow keys and `?p=` move the selection too, and a rail\n // that has scrolled away from it is worse than no rail.\n useEffect(() => {\n const item = listRef.current?.children[index]\n item?.scrollIntoView({ block: \"nearest\" })\n }, [index])\n\n return (\n <div\n // Excluded from click-to-navigate: the rail is beside the slide, not on\n // it, so a click in its padding must not also turn the page.\n data-slide-chrome=\"\"\n aria-label=\"スライド一覧\"\n style={{\n flex: \"0 0 auto\",\n width: RAIL_WIDTH,\n height: \"100%\",\n overflowY: \"auto\",\n overscrollBehavior: \"contain\",\n background: \"color-mix(in oklab, var(--slide-fg) 6%, var(--slide-bg))\",\n color: \"var(--slide-fg)\",\n borderRight: \"1px solid color-mix(in oklab, var(--slide-fg) 14%, transparent)\",\n fontFamily:\n 'system-ui, -apple-system, \"Hiragino Kaku Gothic ProN\", \"Yu Gothic\", Meiryo, sans-serif',\n userSelect: \"none\",\n // An embedded deck does not put the theme on its root, so the rail\n // carries it too rather than reading whatever cascaded in.\n ...themeVars,\n }}\n >\n <ol\n ref={listRef}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: GUTTER,\n margin: 0,\n padding: GUTTER,\n listStyle: \"none\",\n }}\n >\n {slides.map((slide, i) => {\n const active = i === index\n return (\n <li\n key={i}\n // Cheap virtualisation: a deck's slides are real React trees\n // (charts included), and only the few in view need laying out.\n style={{\n contentVisibility: \"auto\",\n containIntrinsicSize: `${THUMB_HEIGHT}px ${RAIL_WIDTH - GUTTER * 2}px`,\n }}\n >\n <button\n type=\"button\"\n style={ITEM_BUTTON}\n onClick={() => onSelect(i)}\n aria-current={active ? \"true\" : undefined}\n aria-label={`スライド ${i + 1}`}\n >\n <span\n style={{\n flex: `0 0 ${NUMBER_COLUMN}px`,\n textAlign: \"right\",\n fontSize: 11,\n fontVariantNumeric: \"tabular-nums\",\n color: active ? \"var(--slide-fg)\" : \"var(--slide-muted)\",\n fontWeight: active ? 600 : 400,\n }}\n >\n {i + 1}\n </span>\n <span\n style={{\n position: \"relative\",\n display: \"block\",\n width: THUMB_WIDTH,\n height: THUMB_HEIGHT,\n overflow: \"hidden\",\n borderRadius: 4,\n background: \"var(--slide-bg)\",\n outline: active\n ? \"2px solid color-mix(in oklab, var(--slide-fg) 55%, transparent)\"\n : \"1px solid color-mix(in oklab, var(--slide-fg) 14%, transparent)\",\n outlineOffset: active ? 1 : 0,\n // The thumbnail is a picture of a slide, not a live copy:\n // clicks belong to the button, never to the slide's own\n // links and buttons.\n pointerEvents: \"none\",\n }}\n >\n <SlideNumberProvider index={i} total={slides.length}>\n {/* No StepHost, as in the pptx export: without one every\n `<Steps>` renders revealed, which is what a thumbnail\n of the finished slide should show. */}\n <SlideCanvas scale={THUMB_WIDTH / CANVAS_WIDTH} themeVars={themeVars}>\n {slide}\n </SlideCanvas>\n </SlideNumberProvider>\n </span>\n </button>\n </li>\n )\n })}\n </ol>\n </div>\n )\n}\n","/**\n * The deck's own controls. Written for Vantage rather than ported: open-slide's\n * present chrome carries a notes drawer and a presenter window, neither of\n * which comes across. What is left is the minimum a viewer needs — where they\n * are, how to move, how much of the deck to show at once, and how to take it\n * with them.\n *\n * Deliberately plain inline styles, like the rest of the slide runtime: the\n * toolbar sits on top of a canvas whose scale it does not share, so a Tailwind\n * `text-sm` here would be a different size than the same class on a slide.\n */\nimport { useState, type CSSProperties } from \"react\"\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n DownloadIcon,\n MaximizeIcon,\n MinimizeIcon,\n PanelLeftCloseIcon,\n PanelLeftOpenIcon,\n} from \"lucide-react\"\nimport type { PptxExportProgress } from \"./export-pptx\"\n\nexport interface SlideToolbarProps {\n current: number\n total: number\n onPrev: () => void\n onNext: () => void\n onFullscreen: () => void\n onExport: () => void\n exportProgress: PptxExportProgress | null\n /** Whether the slide list is showing. */\n railOpen: boolean\n onToggleRail: () => void\n isFullscreen: boolean\n}\n\nconst BUTTON: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n height: 32,\n minWidth: 32,\n padding: \"0 8px\",\n border: \"none\",\n borderRadius: 8,\n background: \"transparent\",\n color: \"inherit\",\n font: \"inherit\",\n fontSize: 13,\n cursor: \"pointer\",\n}\n\nexport function SlideToolbar({\n current,\n total,\n onPrev,\n onNext,\n onFullscreen,\n onExport,\n exportProgress,\n railOpen,\n onToggleRail,\n isFullscreen,\n}: SlideToolbarProps) {\n // The toolbar is chrome over someone else's slide, so it stays out of the\n // way until the pointer is near it.\n const [hovered, setHovered] = useState(false)\n const busy = exportProgress !== null && exportProgress.phase !== \"done\"\n\n return (\n <div\n // Excluded from click-to-navigate: pressing \"next\" should not also turn\n // the page underneath.\n data-slide-chrome=\"\"\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n position: \"absolute\",\n bottom: 16,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n padding: 4,\n borderRadius: 12,\n background: \"rgb(0 0 0 / 0.55)\",\n color: \"#fff\",\n backdropFilter: \"blur(8px)\",\n opacity: hovered || busy ? 1 : 0.25,\n transition: \"opacity 150ms ease\",\n fontFamily:\n 'system-ui, -apple-system, \"Hiragino Kaku Gothic ProN\", \"Yu Gothic\", Meiryo, sans-serif',\n userSelect: \"none\",\n }}\n >\n <button type=\"button\" style={BUTTON} onClick={onPrev} aria-label=\"前のスライド\">\n <ChevronLeftIcon size={16} aria-hidden=\"true\" />\n </button>\n <span style={{ padding: \"0 8px\", fontSize: 13, fontVariantNumeric: \"tabular-nums\" }}>\n {current} / {total}\n </span>\n <button type=\"button\" style={BUTTON} onClick={onNext} aria-label=\"次のスライド\">\n <ChevronRightIcon size={16} aria-hidden=\"true\" />\n </button>\n {/* Fullscreen is the one mode with no room for a list, so the toggle\n goes away there rather than sitting inert. */}\n {isFullscreen ? null : (\n <button\n type=\"button\"\n style={BUTTON}\n onClick={onToggleRail}\n aria-label={railOpen ? \"スライド一覧を閉じる (L)\" : \"スライド一覧を開く (L)\"}\n title={railOpen ? \"スライド一覧を閉じる (L)\" : \"スライド一覧を開く (L)\"}\n aria-pressed={railOpen}\n >\n {railOpen ? (\n <PanelLeftCloseIcon size={16} aria-hidden=\"true\" />\n ) : (\n <PanelLeftOpenIcon size={16} aria-hidden=\"true\" />\n )}\n </button>\n )}\n <button\n type=\"button\"\n style={BUTTON}\n onClick={onFullscreen}\n aria-label={isFullscreen ? \"全画面表示を終了 (F)\" : \"全画面表示 (F)\"}\n title={isFullscreen ? \"全画面表示を終了 (F)\" : \"全画面表示 (F)\"}\n >\n {isFullscreen ? (\n <MinimizeIcon size={16} aria-hidden=\"true\" />\n ) : (\n <MaximizeIcon size={16} aria-hidden=\"true\" />\n )}\n </button>\n <button\n type=\"button\"\n style={{ ...BUTTON, opacity: busy ? 0.6 : 1, cursor: busy ? \"progress\" : \"pointer\" }}\n onClick={onExport}\n disabled={busy}\n aria-label=\"PowerPoint として書き出す\"\n title=\"PowerPoint として書き出す\"\n >\n <DownloadIcon size={16} aria-hidden=\"true\" />\n {busy ? <span>{Math.round(exportProgress.percent)}%</span> : null}\n </button>\n </div>\n )\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/use-media-query.ts,\n * packages/core/src/app/lib/use-prefers-reduced-motion.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: the two files collapsed into one; the generic media-query\n * hook is not part of the public surface.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport { useEffect, useState } from \"react\"\n\nconst QUERY = \"(prefers-reduced-motion: reduce)\"\n\nfunction matches(): boolean {\n if (typeof window === \"undefined\") return false\n return window.matchMedia(QUERY).matches\n}\n\nexport function prefersReducedMotion(): boolean {\n return matches()\n}\n\nexport function usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = useState(matches)\n\n useEffect(() => {\n const mql = window.matchMedia(QUERY)\n setReduced(mql.matches)\n const onChange = (e: MediaQueryListEvent) => setReduced(e.matches)\n mql.addEventListener(\"change\", onChange)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return reduced\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/step-context.tsx\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: the globalThis context trick dropped (tsup's shared chunk\n * already gives the framework one module instance); the\n * `controlledRevealed` path dropped along with the authoring\n * IDE's thumbnail rail, which was its only caller;\n * `data-osd-step` renamed to `data-slide-step`.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport {\n Children,\n cloneElement,\n createContext,\n isValidElement,\n useCallback,\n useContext,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type PropsWithChildren,\n type ReactElement,\n type RefObject,\n} from \"react\"\nimport { usePrefersReducedMotion } from \"./use-prefers-reduced-motion\"\nimport type { EntryDirection } from \"./types\"\n\n/** Advance/retreat one step; returns false when there is nothing left to reveal. */\nexport interface StepController {\n advance: () => boolean\n retreat: () => boolean\n}\n\ninterface Registration {\n id: object\n stepCount: number\n initialRevealed: number\n controller: StepController\n setRevealed: (n: number) => void\n}\n\ninterface StepHostContextValue {\n register: (reg: Registration) => () => void\n entryDirection: EntryDirection\n isActiveSlide: boolean\n}\n\nconst StepHostContext = createContext<StepHostContextValue | null>(null)\n\ninterface StepHostProps {\n isActiveSlide: boolean\n entryDirection: EntryDirection\n controllerRef: RefObject<StepController | null>\n}\n\n/**\n * Collects the `<Steps>` groups on one slide into a single controller the deck\n * can drive. Multiple groups advance in mount order, so \"next\" walks the slide\n * top to bottom before moving on.\n */\nexport function StepHost({\n isActiveSlide,\n entryDirection,\n controllerRef,\n children,\n}: PropsWithChildren<StepHostProps>) {\n const registrations = useRef<Registration[]>([])\n\n const composite = useMemo<StepController>(\n () => ({\n advance: () => {\n for (const r of registrations.current) {\n if (r.controller.advance()) return true\n }\n return false\n },\n retreat: () => {\n for (let i = registrations.current.length - 1; i >= 0; i--) {\n if (registrations.current[i]!.controller.retreat()) return true\n }\n return false\n },\n }),\n [],\n )\n\n // useLayoutEffect cleanup-then-mount ordering keeps the slot continuous\n // across slide swaps: the outgoing host clears its composite before the\n // incoming one installs its own, with no gap and no overlap.\n useLayoutEffect(() => {\n if (!isActiveSlide) return\n controllerRef.current = composite\n return () => {\n if (controllerRef.current === composite) controllerRef.current = null\n }\n }, [isActiveSlide, composite, controllerRef])\n\n const value = useMemo<StepHostContextValue>(\n () => ({\n register: (reg) => {\n registrations.current.push(reg)\n return () => {\n const i = registrations.current.indexOf(reg)\n if (i !== -1) registrations.current.splice(i, 1)\n }\n },\n entryDirection,\n isActiveSlide,\n }),\n [entryDirection, isActiveSlide],\n )\n\n return <StepHostContext.Provider value={value}>{children}</StepHostContext.Provider>\n}\n\n/**\n * Whether this instance of a slide is the one the audience is watching.\n *\n * During a transition the outgoing slide is re-mounted in a second slot so its\n * exit state can be snapshotted, and the pptx export mounts every slide\n * offscreen. An intro animation that replays in those instances snapshots\n * mid-flight, which is how a morph ends up starting from garbage. Gate\n * entrance animations on this: it is true only for the live instance, and\n * every other one should render the settled, finished state.\n */\nexport function useIsActiveSlide(): boolean {\n return useContext(StepHostContext)?.isActiveSlide ?? false\n}\n\n/**\n * Group of `<Step>` children revealed one at a time. Anything that is not a\n * `<Step>` renders immediately, so a heading can sit inside the group.\n */\nexport function Steps({ children }: PropsWithChildren) {\n const host = useContext(StepHostContext)\n const flat = Children.toArray(children)\n const stepCount = flat.filter((c) => isValidElement(c) && c.type === Step).length\n\n // Arriving backwards (or by deep link) shows the slide already fully\n // revealed — walking forward through steps you have just seen is worse than\n // seeing the finished slide.\n const initial = host?.entryDirection === \"forward\" ? 0 : stepCount\n const revealedRef = useRef(initial)\n const [revealed, setRevealed] = useState(initial)\n const idRef = useRef<object>({})\n\n const applyRevealed = useCallback((n: number) => {\n revealedRef.current = n\n setRevealed(n)\n }, [])\n\n useLayoutEffect(() => {\n if (!host) return\n const controller: StepController = {\n advance: () => {\n if (revealedRef.current >= stepCount) return false\n applyRevealed(revealedRef.current + 1)\n return true\n },\n retreat: () => {\n if (revealedRef.current <= 0) return false\n applyRevealed(revealedRef.current - 1)\n return true\n },\n }\n return host.register({\n id: idRef.current,\n stepCount,\n initialRevealed: revealedRef.current,\n controller,\n setRevealed: applyRevealed,\n })\n }, [host, stepCount, applyRevealed])\n\n // Without a host (an offscreen capture for the pptx export, a slide rendered\n // on its own) everything is revealed: there is nobody to press the key.\n const effective = host ? revealed : stepCount\n\n let stepIndex = 0\n return (\n <>\n {flat.map((child, key) => {\n if (isValidElement(child) && child.type === Step) {\n const index = stepIndex++\n return cloneElement(child as ReactElement<{ _revealed?: boolean }>, {\n key: child.key ?? key,\n _revealed: index < effective,\n })\n }\n return child\n })}\n </>\n )\n}\n\nexport interface StepProps {\n /** Fade-in duration in ms. */\n duration?: number\n}\n\ntype InternalStepProps = PropsWithChildren<StepProps> & { _revealed?: boolean }\n\n/** One reveal inside `<Steps>`. */\nexport function Step({ children, duration = 180, _revealed }: InternalStepProps) {\n const reduceMotion = usePrefersReducedMotion()\n const revealed = _revealed ?? true\n const ms = reduceMotion ? 0 : duration\n\n return (\n <div\n data-slide-step={revealed ? \"revealed\" : \"pending\"}\n style={{\n opacity: revealed ? 1 : 0,\n // `visibility` as well as opacity so a pending step is out of the\n // accessibility tree and cannot be tabbed into.\n visibility: revealed ? \"visible\" : \"hidden\",\n transition: `opacity ${ms}ms cubic-bezier(0, 0, 0.2, 1)`,\n }}\n >\n {children}\n </div>\n )\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/components/slide-transition-layer.tsx\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: `pages: Page[]` (component types) became\n * `slides: ReactElement[]`, so a deck is written as children\n * rather than an exported array; `data-osd-*` renamed to\n * `data-slide-*`; Tailwind classes replaced with inline\n * styles; the step-aggregate callback (the authoring IDE's\n * thumbnail rail) dropped.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ReactElement,\n type RefObject,\n} from \"react\"\nimport { SlideNumberProvider } from \"./slide-context\"\nimport { StepHost, type StepController } from \"./steps\"\nimport type { EntryDirection, MorphTransition, SlideTransition, TransitionPhase } from \"./types\"\n\ninterface TransitionLayerProps {\n slides: ReactElement[]\n /** Per-slide transition, index-aligned with `slides`. */\n transitions: (SlideTransition | undefined)[]\n index: number\n disabled?: boolean\n stepControllerRef?: RefObject<StepController | null>\n entryDirection?: EntryDirection\n}\n\ntype Direction = \"forward\" | \"backward\"\n\nconst DEFAULT_EASING = \"cubic-bezier(.4, 0, .2, 1)\"\nconst MORPH_SELECTOR = \"[data-slide-morph]\"\nconst TEXT_FILL_COLOR_PROPERTY = \"-webkit-text-fill-color\"\n\n/**\n * The properties a morph animates in place. Geometry is handled separately by\n * the transform; these are the ones that would otherwise pop at the halfway\n * point because the clone carries the source's colour and the target's shape.\n */\nconst MORPH_VISUAL_PROPERTIES = [\n \"opacity\",\n \"color\",\n \"background-color\",\n \"border-top-color\",\n \"border-right-color\",\n \"border-bottom-color\",\n \"border-left-color\",\n \"outline-color\",\n \"text-decoration-color\",\n TEXT_FILL_COLOR_PROPERTY,\n \"-webkit-text-stroke-color\",\n \"fill\",\n \"stroke\",\n] as const\n\nconst BORDER_COLOR_PROPERTIES = [\n \"border-top-color\",\n \"border-right-color\",\n \"border-bottom-color\",\n \"border-left-color\",\n] as const\n\nconst BORDER_SIDE_PROPERTIES = [\n {\n width: \"borderTopWidth\",\n style: \"borderTopStyle\",\n color: \"borderTopColor\",\n cssWidth: \"border-top-width\",\n cssStyle: \"border-top-style\",\n cssColor: \"border-top-color\",\n },\n {\n width: \"borderRightWidth\",\n style: \"borderRightStyle\",\n color: \"borderRightColor\",\n cssWidth: \"border-right-width\",\n cssStyle: \"border-right-style\",\n cssColor: \"border-right-color\",\n },\n {\n width: \"borderBottomWidth\",\n style: \"borderBottomStyle\",\n color: \"borderBottomColor\",\n cssWidth: \"border-bottom-width\",\n cssStyle: \"border-bottom-style\",\n cssColor: \"border-bottom-color\",\n },\n {\n width: \"borderLeftWidth\",\n style: \"borderLeftStyle\",\n color: \"borderLeftColor\",\n cssWidth: \"border-left-width\",\n cssStyle: \"border-left-style\",\n cssColor: \"border-left-color\",\n },\n] as const\n\n/** Properties a child inherits; copying them onto a clone double-applies them. */\nconst INHERITED_VISUAL_PROPERTIES = new Set<string>([\n \"color\",\n \"text-decoration-color\",\n TEXT_FILL_COLOR_PROPERTY,\n \"-webkit-text-stroke-color\",\n \"fill\",\n \"stroke\",\n])\n\nfunction runPhase(\n el: HTMLElement,\n phase: TransitionPhase | undefined,\n fallbackDuration: number,\n fallbackEasing: string,\n): Animation | null {\n if (!phase) return null\n return el.animate(phase.keyframes, {\n duration: phase.duration ?? fallbackDuration,\n easing: phase.easing ?? fallbackEasing,\n delay: phase.delay ?? 0,\n fill: \"both\",\n })\n}\n\ntype ResolvedMorph = Required<MorphTransition>\n\nfunction resolveMorph(\n morph: SlideTransition[\"morph\"],\n fallbackDuration: number,\n fallbackEasing: string,\n): ResolvedMorph | null {\n if (!morph) return null\n if (morph === true) return { duration: fallbackDuration, easing: fallbackEasing, delay: 0 }\n return {\n duration: morph.duration ?? fallbackDuration,\n easing: morph.easing ?? fallbackEasing,\n delay: morph.delay ?? 0,\n }\n}\n\ninterface LocalRect {\n left: number\n top: number\n width: number\n height: number\n}\n\nfunction localTransform(styles: CSSStyleDeclaration): string {\n return styles.transform && styles.transform !== \"none\" ? styles.transform : \"\"\n}\n\n/**\n * The element's box with its own transform taken off. A morph animates the\n * transform itself, so measuring a transformed box would compound the two.\n */\nfunction measureUntransformedClientRect(el: HTMLElement): DOMRect {\n const styles = getComputedStyle(el)\n if (!localTransform(styles)) return el.getBoundingClientRect()\n\n const value = el.style.getPropertyValue(\"transform\")\n const priority = el.style.getPropertyPriority(\"transform\")\n el.style.setProperty(\"transform\", \"none\", \"important\")\n try {\n return el.getBoundingClientRect()\n } finally {\n if (value) el.style.setProperty(\"transform\", value, priority)\n else el.style.removeProperty(\"transform\")\n }\n}\n\n/**\n * Position relative to the wrapper, in canvas pixels. The canvas is scaled to\n * fit the viewport, so screen coordinates have to be divided back out or every\n * clone lands at the wrong size.\n */\nfunction measureLocalRect(el: HTMLElement, wrapper: HTMLElement, wrapperRect: DOMRect): LocalRect {\n const rect = measureUntransformedClientRect(el)\n const scaleX = wrapperRect.width / (wrapper.offsetWidth || wrapperRect.width || 1) || 1\n const scaleY = wrapperRect.height / (wrapper.offsetHeight || wrapperRect.height || 1) || 1\n return {\n left: (rect.left - wrapperRect.left) / scaleX,\n top: (rect.top - wrapperRect.top) / scaleY,\n width: rect.width / scaleX,\n height: rect.height / scaleY,\n }\n}\n\nfunction hasUsableRect(rect: LocalRect): boolean {\n return rect.width > 0 && rect.height > 0\n}\n\nfunction collectMorphElements(root: HTMLElement): Map<string, HTMLElement> {\n const elements = new Map<string, HTMLElement>()\n for (const el of root.querySelectorAll<HTMLElement>(MORPH_SELECTOR)) {\n const id = el.dataset.slideMorph\n if (id && !elements.has(id)) elements.set(id, el)\n }\n return elements\n}\n\nfunction shouldSkipCopiedStyle(\n source: HTMLElement,\n styles: CSSStyleDeclaration,\n prop: string,\n preserveInherited: boolean,\n): boolean {\n if (prop === TEXT_FILL_COLOR_PROPERTY && styles.getPropertyValue(prop) === styles.color) {\n return true\n }\n if (!preserveInherited || !INHERITED_VISUAL_PROPERTIES.has(prop)) return false\n const parent = source.parentElement\n if (!parent) return false\n return styles.getPropertyValue(prop) === getComputedStyle(parent).getPropertyValue(prop)\n}\n\n/**\n * Flatten computed style onto a clone. The clone is reparented into an overlay\n * outside the slide, so nothing it inherited from its old ancestors survives —\n * it has to carry every resolved value itself.\n */\nfunction copyComputedStyles(\n source: HTMLElement,\n target: HTMLElement,\n preserveInherited = false,\n): void {\n const styles = getComputedStyle(source)\n for (let i = 0; i < styles.length; i++) {\n const prop = styles[i]!\n if (shouldSkipCopiedStyle(source, styles, prop, preserveInherited)) continue\n target.style.setProperty(prop, styles.getPropertyValue(prop), styles.getPropertyPriority(prop))\n }\n\n const sourceChildren = source.querySelectorAll<HTMLElement>(\"*\")\n const targetChildren = target.querySelectorAll<HTMLElement>(\"*\")\n for (let i = 0; i < sourceChildren.length; i++) {\n const child = targetChildren[i]\n if (!child) continue\n copyComputedStyles(sourceChildren[i]!, child, true)\n }\n}\n\nfunction cloneMorphElement(source: HTMLElement): HTMLElement {\n const clone = source.cloneNode(true) as HTMLElement\n copyComputedStyles(source, clone)\n clone.removeAttribute(\"data-slide-morph\")\n return clone\n}\n\nfunction parsePx(value: string): number | null {\n const match = value.trim().match(/^(-?\\d*\\.?\\d+)px$/)\n if (!match) return null\n const n = Number.parseFloat(match[1]!)\n return Number.isFinite(n) ? n : null\n}\n\n/** Divide the radius by the morph's scale so corners keep their visual size. */\nfunction scaleRadius(value: string, scaleX: number, scaleY: number): string {\n const parts = value.trim().split(/\\s+/)\n const x = parsePx(parts[0] ?? \"\")\n const y = parsePx(parts[1] ?? parts[0] ?? \"\")\n if (x === null || y === null) return value\n const nextX = x / scaleX\n const nextY = y / scaleY\n return Math.abs(nextX - nextY) < 0.001 ? `${nextX}px` : `${nextX}px ${nextY}px`\n}\n\nfunction radiusKeyframe(styles: CSSStyleDeclaration, scaleX = 1, scaleY = 1): Keyframe {\n return {\n borderTopLeftRadius: scaleRadius(styles.borderTopLeftRadius, scaleX, scaleY),\n borderTopRightRadius: scaleRadius(styles.borderTopRightRadius, scaleX, scaleY),\n borderBottomRightRadius: scaleRadius(styles.borderBottomRightRadius, scaleX, scaleY),\n borderBottomLeftRadius: scaleRadius(styles.borderBottomLeftRadius, scaleX, scaleY),\n }\n}\n\nfunction morphTransform(rect: LocalRect, scaleX: number, scaleY: number, local: string): string {\n return [`translate(${rect.left}px, ${rect.top}px)`, `scale(${scaleX}, ${scaleY})`, local]\n .filter(Boolean)\n .join(\" \")\n}\n\nfunction morphTranslateTransform(rect: LocalRect, local: string): string {\n return [`translate(${rect.left}px, ${rect.top}px)`, local].filter(Boolean).join(\" \")\n}\n\n/** `element.animate()` silently drops kebab-case keys; keyframes need IDL names. */\nfunction keyframeProperty(css: string): string {\n return css.replace(/^-/, \"\").replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase())\n}\n\nfunction visualStyleKeyframe(\n styles: CSSStyleDeclaration,\n opacity?: string,\n options: { includeBorderColors?: boolean } = {},\n): Keyframe {\n const frame: Record<string, string> = {}\n for (const prop of MORPH_VISUAL_PROPERTIES) {\n if (\n options.includeBorderColors === false &&\n (BORDER_COLOR_PROPERTIES as readonly string[]).includes(prop)\n ) {\n continue\n }\n const value = styles.getPropertyValue(prop)\n if (prop === TEXT_FILL_COLOR_PROPERTY && value === styles.color) continue\n if (value) frame[keyframeProperty(prop)] = value\n }\n if (opacity !== undefined) frame.opacity = opacity\n return frame\n}\n\nfunction hideBorderColors(el: HTMLElement): void {\n for (const { color } of BORDER_SIDE_PROPERTIES) {\n el.style[color] = \"transparent\"\n }\n}\n\nfunction isVisibleBorderSide(\n styles: CSSStyleDeclaration,\n side: (typeof BORDER_SIDE_PROPERTIES)[number],\n): boolean {\n const width = parsePx(styles.getPropertyValue(side.cssWidth)) ?? 0\n const borderStyle = styles.getPropertyValue(side.cssStyle)\n return width > 0 && borderStyle !== \"none\" && borderStyle !== \"hidden\"\n}\n\nfunction hasVisibleBorder(styles: CSSStyleDeclaration): boolean {\n return BORDER_SIDE_PROPERTIES.some((side) => isVisibleBorderSide(styles, side))\n}\n\nfunction borderFrameKeyframe(\n rect: LocalRect,\n styles: CSSStyleDeclaration,\n opacity: string,\n): Keyframe {\n const frame: Keyframe = {\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n opacity,\n transform: morphTranslateTransform(rect, localTransform(styles)),\n ...radiusKeyframe(styles),\n }\n for (const side of BORDER_SIDE_PROPERTIES) {\n frame[side.width] = styles.getPropertyValue(side.cssWidth)\n frame[side.color] = styles.getPropertyValue(side.cssColor)\n }\n return frame\n}\n\n/**\n * A border scaled by the clone's transform would thicken with it. The border\n * is drawn instead by a separate box that only translates and resizes, so its\n * stroke stays the width the author asked for at both ends.\n */\nfunction appendBorderFrame(\n wrapper: HTMLElement,\n overlay: HTMLElement,\n sourceStyles: CSSStyleDeclaration,\n targetStyles: CSSStyleDeclaration,\n rect: LocalRect,\n): HTMLElement {\n if (!overlay.parentElement) wrapper.appendChild(overlay)\n\n const frame = document.createElement(\"div\")\n Object.assign(frame.style, {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n margin: \"0\",\n transformOrigin: \"top left\",\n pointerEvents: \"none\",\n boxSizing: \"border-box\",\n background: \"transparent\",\n })\n\n for (const side of BORDER_SIDE_PROPERTIES) {\n const styles = isVisibleBorderSide(sourceStyles, side) ? sourceStyles : targetStyles\n frame.style[side.style] = styles.getPropertyValue(side.cssStyle)\n frame.style[side.width] = sourceStyles.getPropertyValue(side.cssWidth)\n frame.style[side.color] = sourceStyles.getPropertyValue(side.cssColor)\n }\n\n overlay.appendChild(frame)\n return frame\n}\n\nfunction hasVisualStyleChange(from: CSSStyleDeclaration, to: CSSStyleDeclaration): boolean {\n for (const prop of MORPH_VISUAL_PROPERTIES) {\n if (from.getPropertyValue(prop) !== to.getPropertyValue(prop)) return true\n }\n return false\n}\n\n/** Opacity as it actually renders: every ancestor's opacity multiplied in. */\nfunction effectiveOpacity(el: HTMLElement, boundary: HTMLElement): string {\n let opacity = 1\n let node: HTMLElement | null = el\n while (node && node !== boundary) {\n const value = Number.parseFloat(getComputedStyle(node).opacity)\n if (Number.isFinite(value)) opacity *= value\n node = node.parentElement\n }\n return String(opacity)\n}\n\nfunction hideOriginal(el: HTMLElement): () => void {\n const value = el.style.getPropertyValue(\"visibility\")\n const priority = el.style.getPropertyPriority(\"visibility\")\n el.style.setProperty(\"visibility\", \"hidden\", \"important\")\n return () => {\n if (value) el.style.setProperty(\"visibility\", value, priority)\n else el.style.removeProperty(\"visibility\")\n }\n}\n\nfunction appendPositionedClone(\n wrapper: HTMLElement,\n overlay: HTMLElement,\n source: HTMLElement,\n rect: LocalRect,\n): HTMLElement {\n if (!overlay.parentElement) wrapper.appendChild(overlay)\n\n const clone = cloneMorphElement(source)\n Object.assign(clone.style, {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n margin: \"0\",\n transformOrigin: \"top left\",\n pointerEvents: \"none\",\n boxSizing: \"border-box\",\n })\n overlay.appendChild(clone)\n return clone\n}\n\nfunction morphOptions(phase: ResolvedMorph): KeyframeAnimationOptions {\n return { duration: phase.duration, easing: phase.easing, delay: phase.delay, fill: \"both\" }\n}\n\nfunction runDescendantVisualStyleTransitions(\n clone: HTMLElement,\n source: HTMLElement,\n target: HTMLElement,\n phase: ResolvedMorph,\n): Animation[] {\n const animations: Animation[] = []\n const cloneChildren = clone.querySelectorAll<HTMLElement>(\"*\")\n const sourceChildren = source.querySelectorAll<HTMLElement>(\"*\")\n const targetChildren = target.querySelectorAll<HTMLElement>(\"*\")\n\n for (let i = 0; i < sourceChildren.length; i++) {\n const cloneChild = cloneChildren[i]\n const targetChild = targetChildren[i]\n if (!cloneChild || !targetChild) continue\n\n const sourceStyles = getComputedStyle(sourceChildren[i]!)\n const targetStyles = getComputedStyle(targetChild)\n if (!hasVisualStyleChange(sourceStyles, targetStyles)) continue\n\n animations.push(\n cloneChild.animate(\n [visualStyleKeyframe(sourceStyles), visualStyleKeyframe(targetStyles)],\n morphOptions(phase),\n ),\n )\n }\n return animations\n}\n\nfunction runStationaryMorph(\n clone: HTMLElement,\n rect: LocalRect,\n styles: CSSStyleDeclaration,\n fromOpacity: string,\n toOpacity: string,\n phase: ResolvedMorph,\n): Animation {\n const transform = morphTransform(rect, 1, 1, localTransform(styles))\n return clone.animate(\n [\n { ...visualStyleKeyframe(styles, fromOpacity), ...radiusKeyframe(styles), transform },\n { ...visualStyleKeyframe(styles, toOpacity), ...radiusKeyframe(styles), transform },\n ],\n morphOptions(phase),\n )\n}\n\n/**\n * Animate every `<MorphElement>` from where it sat on the outgoing slide to\n * where it sits on the incoming one. Clones are used rather than the originals\n * because the two slides are separate subtrees that both have to stay laid out.\n */\nfunction runMorphTransition(\n wrapper: HTMLElement,\n outgoingLayer: HTMLElement,\n incomingLayer: HTMLElement,\n phase: ResolvedMorph,\n): { animations: Animation[]; cleanup: () => void } {\n const wrapperRect = wrapper.getBoundingClientRect()\n if (wrapperRect.width === 0 || wrapperRect.height === 0) {\n return { animations: [], cleanup: () => {} }\n }\n\n const incoming = collectMorphElements(incomingLayer)\n const outgoing = collectMorphElements(outgoingLayer)\n\n const overlay = document.createElement(\"div\")\n overlay.setAttribute(\"data-slide-morph-layer\", \"\")\n Object.assign(overlay.style, {\n position: \"absolute\",\n inset: \"0\",\n zIndex: \"2147483647\",\n pointerEvents: \"none\",\n })\n\n const animations: Animation[] = []\n const restore: Array<() => void> = []\n\n // An element with no counterpart (or no usable rect on one side) cannot\n // travel, so it fades in place instead of morphing.\n const fadeOutSource = (source: HTMLElement, from: LocalRect) => {\n const clone = appendPositionedClone(wrapper, overlay, source, from)\n restore.push(hideOriginal(source))\n animations.push(\n runStationaryMorph(\n clone,\n from,\n getComputedStyle(source),\n effectiveOpacity(source, outgoingLayer),\n \"0\",\n phase,\n ),\n )\n }\n\n const fadeInTarget = (target: HTMLElement, to: LocalRect) => {\n const clone = appendPositionedClone(wrapper, overlay, target, to)\n restore.push(hideOriginal(target))\n animations.push(\n runStationaryMorph(\n clone,\n to,\n getComputedStyle(target),\n \"0\",\n effectiveOpacity(target, incomingLayer),\n phase,\n ),\n )\n }\n\n for (const [id, source] of outgoing) {\n const target = incoming.get(id)\n const from = measureLocalRect(source, wrapper, wrapperRect)\n if (!hasUsableRect(from)) {\n if (target) {\n const to = measureLocalRect(target, wrapper, wrapperRect)\n if (hasUsableRect(to)) fadeInTarget(target, to)\n }\n continue\n }\n\n if (!target) {\n fadeOutSource(source, from)\n continue\n }\n\n const to = measureLocalRect(target, wrapper, wrapperRect)\n if (!hasUsableRect(to)) {\n fadeOutSource(source, from)\n continue\n }\n\n const clone = appendPositionedClone(wrapper, overlay, source, from)\n restore.push(hideOriginal(source), hideOriginal(target))\n\n const sourceStyles = getComputedStyle(source)\n const targetStyles = getComputedStyle(target)\n const fromOpacity = effectiveOpacity(source, outgoingLayer)\n const toOpacity = effectiveOpacity(target, incomingLayer)\n const needsBorderFrame = hasVisibleBorder(sourceStyles) || hasVisibleBorder(targetStyles)\n const scaleX = to.width / from.width\n const scaleY = to.height / from.height\n\n if (needsBorderFrame) {\n hideBorderColors(clone)\n const borderFrame = appendBorderFrame(wrapper, overlay, sourceStyles, targetStyles, from)\n animations.push(\n borderFrame.animate(\n [\n borderFrameKeyframe(from, sourceStyles, fromOpacity),\n borderFrameKeyframe(to, targetStyles, toOpacity),\n ],\n morphOptions(phase),\n ),\n )\n }\n\n animations.push(\n clone.animate(\n [\n {\n ...visualStyleKeyframe(sourceStyles, fromOpacity, {\n includeBorderColors: !needsBorderFrame,\n }),\n ...radiusKeyframe(sourceStyles),\n transform: morphTransform(from, 1, 1, localTransform(sourceStyles)),\n },\n {\n ...visualStyleKeyframe(targetStyles, toOpacity, {\n includeBorderColors: !needsBorderFrame,\n }),\n ...radiusKeyframe(targetStyles, scaleX, scaleY),\n transform: morphTransform(to, scaleX, scaleY, localTransform(targetStyles)),\n },\n ],\n morphOptions(phase),\n ),\n ...runDescendantVisualStyleTransitions(clone, source, target, phase),\n )\n }\n\n for (const [id, target] of incoming) {\n if (outgoing.has(id)) continue\n const to = measureLocalRect(target, wrapper, wrapperRect)\n if (!hasUsableRect(to)) continue\n fadeInTarget(target, to)\n }\n\n if (animations.length === 0) overlay.remove()\n\n let cleaned = false\n return {\n animations,\n cleanup: () => {\n if (cleaned) return\n cleaned = true\n for (const fn of restore) fn()\n overlay.remove()\n },\n }\n}\n\n/**\n * Holds the outgoing and incoming slides side by side while their transition\n * plays. Also the only place a slide's `<Steps>` host is mounted, so step\n * state is scoped to the slide that owns it.\n */\nexport function SlideTransitionLayer({\n slides,\n transitions,\n index,\n disabled,\n stepControllerRef,\n entryDirection = \"jump\",\n}: TransitionLayerProps) {\n const [current, setCurrent] = useState(index)\n const [outgoing, setOutgoing] = useState<number | null>(null)\n const [direction, setDirection] = useState<Direction>(\"forward\")\n\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n const outgoingLayerRef = useRef<HTMLDivElement | null>(null)\n const incomingLayerRef = useRef<HTMLDivElement | null>(null)\n const animationsRef = useRef<Animation[]>([])\n const cleanupRef = useRef<(() => void) | null>(null)\n const currentRef = useRef(current)\n currentRef.current = current\n\n useEffect(() => {\n if (index === currentRef.current) return\n\n const prev = currentRef.current\n const next = index\n\n // Interrupt: cancel whatever is in flight. The slide that was arriving\n // becomes the new outgoing one, and React reuses its DOM slot.\n for (const animation of animationsRef.current) {\n try {\n animation.cancel()\n } catch {\n /* already finished or detached */\n }\n }\n animationsRef.current = []\n cleanupRef.current?.()\n cleanupRef.current = null\n\n if (disabled || !transitions[next]) {\n setCurrent(next)\n setOutgoing(null)\n return\n }\n\n setDirection(next > prev ? \"forward\" : \"backward\")\n setOutgoing(prev)\n setCurrent(next)\n }, [index, transitions, disabled])\n\n useLayoutEffect(() => {\n if (outgoing === null) return\n\n const transition = transitions[current]\n const wrapper = wrapperRef.current\n const out = outgoingLayerRef.current\n const inc = incomingLayerRef.current\n if (!transition || !wrapper || !out || !inc) {\n setOutgoing(null)\n return\n }\n\n wrapper.dataset.slideDir = direction\n wrapper.style.setProperty(\"--slide-dir\", direction === \"forward\" ? \"1\" : \"-1\")\n\n const easing = transition.easing ?? DEFAULT_EASING\n const duration = transition.duration\n\n // Morph elements are measured before the enter/exit phases start: phase\n // keyframes apply immediately (fill: both), so a transform in the enter's\n // first keyframe would offset every measured rect and land the clones off\n // their true resting positions.\n const morphPhase = resolveMorph(transition.morph, duration, easing)\n const morphRun = morphPhase ? runMorphTransition(wrapper, out, inc, morphPhase) : null\n\n const animations: Animation[] = []\n const exitAnimation = runPhase(out, transition.exit, duration, easing)\n const enterAnimation = runPhase(inc, transition.enter, duration, easing)\n if (exitAnimation) animations.push(exitAnimation)\n if (enterAnimation) animations.push(enterAnimation)\n\n const cleanups: Array<() => void> = []\n if (morphRun) {\n animations.push(...morphRun.animations)\n cleanups.push(morphRun.cleanup)\n // With no exit phase the outgoing slide would sit under the morphing\n // clones at full opacity; hide it for the duration.\n if (!exitAnimation && morphRun.animations.length > 0) cleanups.push(hideOriginal(out))\n }\n animationsRef.current = animations\n\n if (animations.length === 0) {\n for (const fn of cleanups) fn()\n setOutgoing(null)\n return\n }\n\n let cleaned = false\n const cleanup = () => {\n if (cleaned) return\n cleaned = true\n for (const fn of cleanups) fn()\n if (cleanupRef.current === cleanup) cleanupRef.current = null\n }\n cleanupRef.current = cleanup\n\n let cancelled = false\n Promise.all(animations.map((a) => a.finished))\n .then(() => {\n if (cancelled) return\n cleanup()\n animationsRef.current = []\n setOutgoing(null)\n })\n .catch(() => {\n // AbortError, thrown when an interrupt cancels mid-flight.\n })\n\n return () => {\n cancelled = true\n }\n }, [outgoing, current, direction, transitions])\n\n useEffect(() => {\n return () => {\n for (const animation of animationsRef.current) {\n try {\n animation.cancel()\n } catch {\n /* already finished or detached */\n }\n }\n animationsRef.current = []\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n }, [])\n\n const total = slides.length\n const currentSlide = slides[current]\n const outgoingSlide = outgoing !== null ? slides[outgoing] : null\n\n // The outgoing layer mirrors the direction just navigated, so its `<Steps>`\n // re-mount in the state the audience just saw: going forward, the slide left\n // behind was fully revealed; going back, it was at zero.\n const outgoingEntryDirection: EntryDirection =\n entryDirection === \"backward\" ? \"forward\" : \"backward\"\n\n const fallbackControllerRef = useRef<StepController | null>(null)\n const controllerRef = stepControllerRef ?? fallbackControllerRef\n\n return (\n <div\n ref={wrapperRef}\n style={{\n position: \"relative\",\n height: \"100%\",\n width: \"100%\",\n overflow: \"hidden\",\n background: \"var(--slide-bg)\",\n }}\n >\n {outgoingSlide && outgoing !== null ? (\n <div ref={outgoingLayerRef} style={{ position: \"absolute\", inset: 0 }}>\n <SlideNumberProvider index={outgoing} total={total}>\n <StepHost\n isActiveSlide={false}\n entryDirection={outgoingEntryDirection}\n controllerRef={controllerRef}\n >\n {outgoingSlide}\n </StepHost>\n </SlideNumberProvider>\n </div>\n ) : null}\n {currentSlide ? (\n <div ref={incomingLayerRef} style={{ position: \"absolute\", inset: 0 }}>\n <SlideNumberProvider index={current} total={total}>\n <StepHost isActiveSlide entryDirection={entryDirection} controllerRef={controllerRef}>\n {currentSlide}\n </StepHost>\n </SlideNumberProvider>\n </div>\n ) : null}\n </div>\n )\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/use-click-page-navigation.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: `data-osd-*` selectors renamed to `data-slide-*`; the\n * `onViewportClick` hook (the authoring IDE's comment pins)\n * dropped.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport { useEffect, type RefObject } from \"react\"\n\n/**\n * Clicks landing on (or inside) any of these never navigate, so interactive\n * slide content and the deck's own toolbar keep their clicks. An author can\n * opt anything else out with `data-slide-interactive`.\n */\nconst PASSTHROUGH =\n 'a, button, input, textarea, select, label, summary, iframe, video, audio, embed, object, [role=\"button\"], [role=\"link\"], [contenteditable=\"true\"], [data-slide-interactive], [data-slide-chrome]'\n\ninterface UseClickNavOptions<T extends HTMLElement> {\n ref: RefObject<T | null>\n enabled?: boolean\n /** Fraction of the width on each side that navigates; the middle is inert. */\n edgeRatio?: number\n canPrev: boolean\n canNext: boolean\n onPrev: () => void\n onNext: () => void\n}\n\nexport function useClickNav<T extends HTMLElement>({\n ref,\n enabled = true,\n edgeRatio = 0.3,\n canPrev,\n canNext,\n onPrev,\n onNext,\n}: UseClickNavOptions<T>) {\n useEffect(() => {\n const el = ref.current\n if (!el || !enabled) return\n\n const onClick = (event: MouseEvent) => {\n if (event.button !== 0 || event.defaultPrevented) return\n const target = event.target\n if (target instanceof Element && target.closest(PASSTHROUGH)) return\n // Finishing a text selection should not also turn the page.\n if (window.getSelection()?.toString()) return\n\n const rect = el.getBoundingClientRect()\n if (rect.width === 0) return\n const x = (event.clientX - rect.left) / rect.width\n if (x < edgeRatio) {\n if (canPrev) onPrev()\n } else if (x > 1 - edgeRatio) {\n if (canNext) onNext()\n }\n }\n\n el.addEventListener(\"click\", onClick)\n return () => el.removeEventListener(\"click\", onClick)\n }, [ref, enabled, edgeRatio, canPrev, canNext, onPrev, onNext])\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/components/player.tsx\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: only the playback core was taken. The present chrome,\n * presenter-window BroadcastChannel, overview grid, notes\n * drawer, thumbnail rail and slide-module loading all belong\n * to open-slide's authoring app and have no counterpart here.\n * Slides come from children rather than an exported array,\n * and the current slide is kept in the URL via `useSearchState`.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport {\n Children,\n isValidElement,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type PropsWithChildren,\n type ReactElement,\n type ReactNode,\n} from \"react\"\nimport { useSearchState } from \"../router\"\nimport { SlideCanvas } from \"./canvas\"\nimport { exportDeckAsPptx, type PptxExportProgress } from \"./export-pptx\"\nimport { hasModifier, isBackwardKey, isForwardKey, isTypingTarget } from \"./keys\"\nimport { SlideRail } from \"./rail\"\nimport { SlideToolbar } from \"./toolbar\"\nimport { themeToCssVars } from \"./theme\"\nimport { SlideTransitionLayer } from \"./transition-layer\"\nimport type { StepController } from \"./steps\"\nimport type { EntryDirection, SlideTheme, SlideTransition } from \"./types\"\nimport { useClickNav } from \"./use-click-nav\"\nimport { usePrefersReducedMotion } from \"./use-prefers-reduced-motion\"\n\nexport interface SlideProps {\n /** How this slide arrives when navigated to. Omit for a hard cut. */\n transition?: SlideTransition\n children: ReactNode\n}\n\n/**\n * One slide. A marker component: `<SlideDeck>` reads the children it holds and\n * the `transition` it carries, and renders the body itself so the slide can be\n * mounted offscreen for the pptx export as well as on screen.\n */\nexport function Slide({ children }: SlideProps) {\n return <>{children}</>\n}\nSlide.displayName = \"Slide\"\n\nexport interface SlideDeckProps {\n /** Token overrides for this deck; anything omitted follows the app's theme. */\n theme?: SlideTheme\n /**\n * Render in the page flow at 16:9 instead of covering the viewport. For\n * embedding a deck inside a dashboard page.\n */\n embedded?: boolean\n /** Base name of the exported pptx. Defaults to the last URL segment. */\n exportName?: string\n /**\n * Whether the slide list starts open. Defaults to `true` for a deck that\n * covers the viewport and `false` for an `embedded` one, where a 16:9 box in\n * the page flow has no width to spare. The reader can toggle it either way\n * from the toolbar or with `L`; this only picks where they start.\n */\n rail?: boolean\n children: ReactNode\n}\n\nfunction collectSlides(children: ReactNode): {\n slides: ReactElement[]\n transitions: (SlideTransition | undefined)[]\n} {\n const slides: ReactElement[] = []\n const transitions: (SlideTransition | undefined)[] = []\n for (const child of Children.toArray(children)) {\n if (!isValidElement(child) || child.type !== Slide) continue\n slides.push(child)\n transitions.push((child.props as SlideProps).transition)\n }\n return { slides, transitions }\n}\n\n/** Last non-empty path segment, or \"slides\" at the root. */\nfunction defaultExportName(): string {\n if (typeof window === \"undefined\") return \"slides\"\n const parts = window.location.pathname.split(\"/\").filter(Boolean)\n return parts[parts.length - 1] ?? \"slides\"\n}\n\n/**\n * A deck of slides on one page. Covers the viewport by default so the app's\n * layout is out of the way, without changing the router structure: the layout\n * stays mounted underneath, so the nav and every other page keep working\n * exactly as before.\n */\nexport function SlideDeck({\n theme,\n embedded = false,\n exportName,\n // Reads `embedded` from earlier in this same pattern, which is why the two\n // must stay in this order.\n rail = !embedded,\n children,\n}: SlideDeckProps) {\n const { slides, transitions } = useMemo(() => collectSlides(children), [children])\n const total = slides.length\n\n // The slide number lives in the URL, so a link can point at slide 4 and the\n // browser's back button leaves the deck instead of stepping through it\n // (`useSearchState` replaces by default rather than pushing).\n const [page, setPage] = useSearchState<number>(\"p\", 1)\n const index = Math.min(Math.max(Math.floor(page) - 1, 0), Math.max(total - 1, 0))\n\n // In the URL for the same reason as the slide number: \"open it with the list\n // showing\" is a thing you send someone. Writing the default clears the key,\n // so a deck left as the author set it carries no `?rail` at all.\n const [railOpen, setRailOpen] = useSearchState<boolean>(\"rail\", rail)\n const [isFullscreen, setIsFullscreen] = useState(false)\n\n const [entryDirection, setEntryDirection] = useState<EntryDirection>(\"jump\")\n const [exporting, setExporting] = useState<PptxExportProgress | null>(null)\n const stepControllerRef = useRef<StepController | null>(null)\n const viewportRef = useRef<HTMLDivElement>(null)\n const stageRef = useRef<HTMLDivElement>(null)\n // Honoured here rather than per transition: a reader who asked for less\n // motion wants the cut, not a shorter version of the animation.\n const reduceMotion = usePrefersReducedMotion()\n\n const goTo = useCallback(\n (next: number, direction: EntryDirection) => {\n const clamped = Math.min(Math.max(next, 0), Math.max(total - 1, 0))\n setEntryDirection(direction)\n setPage(clamped + 1)\n },\n [setPage, total],\n )\n\n // Steps come first: \"next\" finishes revealing the current slide before it\n // moves on, which is the whole point of authoring them.\n const goNext = useCallback(() => {\n if (stepControllerRef.current?.advance()) return\n if (index < total - 1) goTo(index + 1, \"forward\")\n }, [goTo, index, total])\n\n const goPrev = useCallback(() => {\n if (stepControllerRef.current?.retreat()) return\n if (index > 0) goTo(index - 1, \"backward\")\n }, [goTo, index])\n\n const toggleRail = useCallback(() => setRailOpen((open) => !open), [setRailOpen])\n\n const toggleFullscreen = useCallback(() => {\n const el = viewportRef.current\n if (!el) return\n if (document.fullscreenElement) void document.exitFullscreen()\n else void el.requestFullscreen?.()\n }, [])\n\n // The browser owns fullscreen — Escape and the window chrome leave it\n // without going through `toggleFullscreen` — so the event is the only\n // trustworthy source for which of the three views is on screen.\n useEffect(() => {\n const onChange = () => setIsFullscreen(document.fullscreenElement === viewportRef.current)\n document.addEventListener(\"fullscreenchange\", onChange)\n return () => document.removeEventListener(\"fullscreenchange\", onChange)\n }, [])\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (isTypingTarget(event.target)) return\n if (isForwardKey(event)) {\n event.preventDefault()\n goNext()\n return\n }\n if (isBackwardKey(event)) {\n event.preventDefault()\n goPrev()\n return\n }\n if (hasModifier(event)) return\n if (event.key === \"Home\") {\n event.preventDefault()\n goTo(0, \"jump\")\n return\n }\n if (event.key === \"End\") {\n event.preventDefault()\n goTo(total - 1, \"jump\")\n return\n }\n if (event.key === \"f\" || event.key === \"F\") {\n event.preventDefault()\n toggleFullscreen()\n return\n }\n if (event.key === \"l\" || event.key === \"L\") {\n event.preventDefault()\n toggleRail()\n return\n }\n // Escape leaves fullscreen when in it (the browser handles that itself),\n // and otherwise leaves the deck — a deck covers the viewport, so there is\n // no visible way back except the toolbar.\n if (event.key === \"Escape\" && !document.fullscreenElement) {\n window.history.back()\n }\n }\n window.addEventListener(\"keydown\", onKeyDown)\n return () => window.removeEventListener(\"keydown\", onKeyDown)\n }, [goNext, goPrev, goTo, toggleFullscreen, toggleRail, total])\n\n useClickNav({\n // The stage, not the whole deck: the edge thirds that turn the page are\n // measured against the slide, so opening the rail must not shift them.\n ref: stageRef,\n canPrev: true,\n canNext: true,\n onPrev: goPrev,\n onNext: goNext,\n })\n\n // A covering deck would otherwise leave the page behind it scrollable, and\n // a stray scroll shifts the canvas out from under the viewer.\n useEffect(() => {\n if (embedded) return\n const previous = document.body.style.overflow\n document.body.style.overflow = \"hidden\"\n return () => {\n document.body.style.overflow = previous\n }\n }, [embedded])\n\n const selectSlide = useCallback(\n (next: number) => goTo(next, \"jump\"),\n [goTo],\n )\n\n const onExport = useCallback(async () => {\n if (exporting) return\n try {\n await exportDeckAsPptx({\n slides,\n theme,\n fileName: exportName ?? defaultExportName(),\n onProgress: setExporting,\n })\n } finally {\n setExporting(null)\n }\n }, [exporting, slides, theme, exportName])\n\n const themeVars = themeToCssVars(theme)\n // Three views, two of them the same one with the list open or shut:\n // fullscreen is the slide alone, so the rail steps aside there without\n // forgetting that the reader had it open.\n const showRail = railOpen && !isFullscreen\n\n return (\n <div\n ref={viewportRef}\n data-slide-deck=\"\"\n style={\n embedded\n ? { position: \"relative\", width: \"100%\", aspectRatio: \"16 / 9\", background: \"var(--slide-bg)\" }\n : {\n position: \"fixed\",\n inset: 0,\n zIndex: 50,\n background: \"var(--slide-bg)\",\n ...themeVars,\n }\n }\n >\n <div style={{ display: \"flex\", height: \"100%\", width: \"100%\" }}>\n {showRail ? (\n <SlideRail slides={slides} index={index} onSelect={selectSlide} themeVars={themeVars} />\n ) : null}\n {/* The stage owns the toolbar and the click targets so both stay\n centred on the slide rather than on the slide plus the rail. */}\n <div ref={stageRef} style={{ position: \"relative\", flex: \"1 1 auto\", minWidth: 0 }}>\n <SlideCanvas themeVars={themeVars}>\n <SlideTransitionLayer\n slides={slides}\n transitions={transitions}\n index={index}\n disabled={reduceMotion}\n stepControllerRef={stepControllerRef}\n entryDirection={entryDirection}\n />\n </SlideCanvas>\n <SlideToolbar\n current={index + 1}\n total={total}\n onPrev={goPrev}\n onNext={goNext}\n onFullscreen={toggleFullscreen}\n onExport={onExport}\n exportProgress={exporting}\n railOpen={railOpen}\n onToggleRail={toggleRail}\n isFullscreen={isFullscreen}\n />\n </div>\n </div>\n </div>\n )\n}\nSlideDeck.displayName = \"SlideDeck\"\n\n/** Convenience wrapper so a deck file can type its children. */\nexport type SlideDeckChildren = PropsWithChildren\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/components/morph-element.tsx\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: `data-osd-morph` renamed to `data-slide-morph`.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport {\n Children,\n cloneElement,\n isValidElement,\n type CSSProperties,\n type ReactElement,\n type ReactNode,\n} from \"react\"\n\nexport interface MorphElementProps {\n /** Shared across slides: the same id on two slides animates between them. */\n id: string\n children: ReactNode\n className?: string\n style?: CSSProperties\n}\n\ninterface MorphChildProps {\n className?: string\n style?: CSSProperties\n \"data-slide-morph\"?: string\n}\n\n/**\n * Marks an element as the same thing on the next slide. A single host child\n * is tagged in place so no wrapper element is added to the layout; anything\n * else gets a `<div>`.\n */\nexport function MorphElement({ id, children, className, style }: MorphElementProps) {\n const child = Children.toArray(children)[0] ?? null\n\n if (\n Children.count(children) === 1 &&\n isValidElement<MorphChildProps>(child) &&\n typeof child.type === \"string\"\n ) {\n return cloneElement(child as ReactElement<MorphChildProps>, {\n \"data-slide-morph\": id,\n className: [child.props.className, className].filter(Boolean).join(\" \") || undefined,\n style: style ? { ...child.props.style, ...style } : child.props.style,\n })\n }\n\n return (\n <div className={className} style={style} data-slide-morph={id}>\n {children}\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/slide/constants.ts","../../src/slide/canvas.tsx","../../src/slide/dom.ts","../../src/slide/print-ready.ts","../../src/slide/slide-context.tsx","../../src/slide/theme.ts","../../src/slide/export-pptx.ts","../../src/slide/keys.ts","../../src/slide/messages.ts","../../src/slide/rail.tsx","../../src/slide/toolbar.tsx","../../src/slide/use-prefers-reduced-motion.ts","../../src/slide/steps.tsx","../../src/slide/transition-layer.tsx","../../src/slide/use-click-nav.ts","../../src/slide/deck.tsx","../../src/slide/morph-element.tsx"],"names":["jsx","useRef","useMemo","useState","jsxs","useEffect","createContext","useLayoutEffect","useContext","to","Fragment","Children","isValidElement","useCallback","cloneElement"],"mappings":";;;;;;;;;;AAiBO,IAAM,YAAA,GAAe;AACrB,IAAM,aAAA,GAAgB;ACUtB,SAAS,WAAA,CAAY,EAAE,QAAA,EAAU,KAAA,EAAO,WAAU,EAAqB;AAC5E,EAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAwB,IAAI,CAAA;AAE5D,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,MAAM,KAAK,YAAA,CAAa,OAAA;AACxB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,GAAG,qBAAA,EAAsB;AACnD,MAAA,IAAI,KAAA,KAAU,CAAA,IAAK,MAAA,KAAW,CAAA,EAAG;AACjC,MAAA,WAAA,CAAY,KAAK,GAAA,CAAI,KAAA,GAAQ,YAAA,EAAc,MAAA,GAAS,aAAa,CAAC,CAAA;AAAA,IACpE,CAAA;AAGA,IAAA,OAAA,EAAQ;AACR,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,OAAO,CAAA;AAC3C,IAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AACnB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,WAAW,KAAA,IAAS,QAAA;AAC1B,EAAA,MAAM,IAAI,QAAA,IAAY,CAAA;AAEtB,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,EACnF,QAAA,kBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,IAAA,EAAM,KAAA;AAAA,QACN,GAAA,EAAK,KAAA;AAAA,QACL,SAAA,EAAW,uBAAA;AAAA,QACX,OAAO,YAAA,GAAe,CAAA;AAAA,QACtB,QAAQ,aAAA,GAAgB,CAAA;AAAA,QACxB,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EAAY,iBAAA;AAAA,QACZ,KAAA,EAAO,iBAAA;AAAA;AAAA;AAAA,QAGP,UAAA,EAAY,QAAA,KAAa,IAAA,GAAO,QAAA,GAAW,MAAA;AAAA,QAC3C,GAAG;AAAA,OACL;AAAA,MAEA,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,mBAAA,EAAkB,EAAA;AAAA,UAClB,KAAA,EAAO;AAAA,YACL,KAAA,EAAO,YAAA;AAAA,YACP,MAAA,EAAQ,aAAA;AAAA,YACR,SAAA,EAAW,SAAS,CAAC,CAAA,CAAA,CAAA;AAAA,YACrB,eAAA,EAAiB,UAAA;AAAA,YACjB,UAAA,EAAY,wBAAA;AAAA,YACZ,QAAA,EAAU,wBAAA;AAAA,YACV,GAAG;AAAA,WACL;AAAA,UAEC;AAAA;AAAA;AACH;AAAA,GACF,EACF,CAAA;AAEJ;;;AC9EO,SAAS,MAAM,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAEO,SAAS,SAAA,GAA2B;AACzC,EAAA,OAAO,IAAI,QAAQ,CAAC,OAAA,KAAY,sBAAsB,MAAM,OAAA,EAAS,CAAC,CAAA;AACxE;AAGO,SAAS,SAAA,GAA2B;AACzC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AACA,IAAA,qBAAA,CAAsB,MAAM,CAAA;AAC5B,IAAA,UAAA,CAAW,QAAQ,EAAE,CAAA;AAAA,EACvB,CAAC,CAAA;AACH;AAEO,SAAS,YAAA,CAAa,MAAY,QAAA,EAAwB;AAC/D,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,EAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,EAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,EAAA,CAAA,CAAE,GAAA,GAAM,UAAA;AACR,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,EAAA,CAAA,CAAE,KAAA,EAAM;AACR,EAAA,CAAA,CAAE,MAAA,EAAO;AACT,EAAA,UAAA,CAAW,MAAM,GAAA,CAAI,eAAA,CAAgB,GAAG,GAAG,CAAC,CAAA;AAC9C;;;AChCA,IAAM,0BAAA,GAA6B,GAAA;AAQnC,eAAsB,YAAA,GAA8B;AAClD,EAAA,IAAI,EAAE,WAAW,QAAA,CAAA,EAAW;AAC5B,EAAA,MAAM,SAAS,KAAA,CAAM,KAAA;AACvB;AAOA,eAAsB,kBAAA,CACpB,IAAA,EACA,SAAA,GAAY,0BAAA,EACG;AACf,EAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAA8B,gBAAgB,CAAC,CAAA;AAC/E,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AACrC,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,OAAA,CAAQ,GAAA,CAAI,OAAO,EAAA,KAAO;AACxB,MAAA,MAAM,QAAA,GAAW,EAAA,CAAG,YAAA,CAAa,cAAc,CAAA;AAC/C,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,OAAO,WAAA,CAAY,GAAA,EAAI,GAAI,QAAA,EAAU;AACnC,QAAA,IAAI;AACF,UAAA,IAAI,EAAA,CAAG,aAAA,CAAc,QAAQ,CAAA,EAAG;AAAA,QAClC,CAAA,CAAA,MAAQ;AACN,UAAA;AAAA,QACF;AACA,QAAA,MAAM,SAAA,EAAU;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,GACH;AACF;AAGO,SAAS,wBAAwB,KAAA,EAAyB;AAC/D,EAAA,IAAI,OAAO,QAAA,CAAS,aAAA,KAAkB,UAAA,EAAY,OAAO,IAAA;AACzD,EAAA,KAAA,MAAW,SAAA,IAAa,QAAA,CAAS,aAAA,EAAc,EAAG;AAChD,IAAA,MAAM,SAAS,SAAA,CAAU,MAAA;AACzB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AAExC,IAAA,IAAI,MAAA,CAAO,iBAAA,EAAkB,CAAE,UAAA,KAAe,QAAA,EAAU;AACxD,IAAA,IAAI,SAAA,CAAU,SAAA,KAAc,UAAA,EAAY,OAAO,KAAA;AAAA,EACjD;AACA,EAAA,OAAO,IAAA;AACT;AC5CA,IAAM,kBAAA,GAAqB,cAA8C,IAAI,CAAA;AAEtE,SAAS,mBAAA,CAAoB;AAAA,EAClC,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAwD;AACtD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAO,EAAE,KAAA,EAAO,OAAM,CAAA,EAAI,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AAC9D,EAAA,uBAAOA,GAAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,OAAe,QAAA,EAAS,CAAA;AAC9D;AAOO,SAAS,cAAA,GAAqD;AACnE,EAAA,MAAM,GAAA,GAAM,WAAW,kBAAkB,CAAA;AACzC,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAE;AACxC,EAAA,OAAO,EAAE,OAAA,EAAS,GAAA,CAAI,QAAQ,CAAA,EAAG,KAAA,EAAO,IAAI,KAAA,EAAM;AACpD;;;ACpBO,SAAS,eAAe,KAAA,EAA0D;AACvF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,OAA+B,EAAC;AACtC,EAAA,IAAI,KAAA,CAAM,EAAA,EAAI,IAAA,CAAK,YAAY,IAAI,KAAA,CAAM,EAAA;AACzC,EAAA,IAAI,KAAA,CAAM,EAAA,EAAI,IAAA,CAAK,YAAY,IAAI,KAAA,CAAM,EAAA;AACzC,EAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,IAAA,CAAK,gBAAgB,IAAI,KAAA,CAAM,MAAA;AACjD,EAAA,IAAI,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,eAAe,IAAI,KAAA,CAAM,KAAA;AAC/C,EAAA,IAAI,KAAA,CAAM,WAAA,EAAa,IAAA,CAAK,sBAAsB,IAAI,KAAA,CAAM,WAAA;AAC5D,EAAA,IAAI,KAAA,CAAM,QAAA,EAAU,IAAA,CAAK,mBAAmB,IAAI,KAAA,CAAM,QAAA;AACtD,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW,IAAA,CAAK,mBAAmB,CAAA,GAAI,CAAA,EAAG,MAAM,QAAQ,CAAA,EAAA,CAAA;AAC/E,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW,IAAA,CAAK,mBAAmB,CAAA,GAAI,CAAA,EAAG,MAAM,QAAQ,CAAA,EAAA,CAAA;AAC/E,EAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAW,IAAA,CAAK,gBAAgB,CAAA,GAAI,CAAA,EAAG,MAAM,MAAM,CAAA,EAAA,CAAA;AACxE,EAAA,OAAO,OAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,IAAK,IAAA,GAAyB,MAAA;AAClE;;;ACZA,IAAM,KAAA,GAAQ,OAAA;AACd,IAAM,KAAA,GAAQ,MAAA;AAEd,IAAM,mBAAA,GAAsB,CAAA;AAE5B,IAAM,oBAAA,GAAuB,IAAA;AAC7B,IAAM,gBAAA,GAAmB,GAAA;AAEzB,IAAM,aAAA,GAAgB,uBAAA;AAOtB,IAAM,YAAA,GAAe,CAAC,SAAA,EAAW,WAAA,EAAa,UAAU,WAAW,CAAA;AA4BnE,eAAsB,gBAAA,CAAiB;AAAA,EACrC,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAqC;AACnC,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAEzB,EAAA,MAAM,QAAQ,MAAA,CAAO,MAAA;AACrB,EAAA,UAAA,GAAa,EAAE,OAAO,YAAA,EAAc,OAAA,EAAS,GAAG,KAAA,EAAO,OAAA,EAAS,GAAG,CAAA;AAEnE,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,SAAA,GAAY,aAAA;AACtB,EAAA,SAAA,CAAU,YAAA,CAAa,eAAe,MAAM,CAAA;AAC5C,EAAA,MAAA,CAAO,MAAA,CAAO,UAAU,KAAA,EAAO;AAAA,IAC7B,QAAA,EAAU,OAAA;AAAA,IACV,IAAA,EAAM,UAAA;AAAA,IACN,GAAA,EAAK,GAAA;AAAA,IACL,aAAA,EAAe;AAAA,GAChB,CAAA;AACD,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,SAAS,CAAA;AAQnC,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AACnD,EAAA,YAAA,CAAa,cAAc,CAAA,CAAA,EAAI,aAAa,CAAA,KAAA,EAAQ,aAAa,gBAAgB,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAA,CAAA;AAO9F,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,YAAY,CAAA;AAEtC,EAAA,MAAM,SAAA,GAAY,eAAe,KAAK,CAAA;AACtC,EAAA,MAAM,QAAgB,EAAC;AACvB,EAAA,MAAM,SAAwB,EAAC;AAE/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,YAAA,CAAa,qBAAqB,EAAE,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,MACxB,KAAA,EAAO,GAAG,YAAY,CAAA,EAAA,CAAA;AAAA,MACtB,MAAA,EAAQ,GAAG,aAAa,CAAA,EAAA,CAAA;AAAA,MACxB,QAAA,EAAU,QAAA;AAAA,MACV,UAAA,EAAY,iBAAA;AAAA,MACZ,KAAA,EAAO,iBAAA;AAAA,MACP,UAAA,EAAY,wBAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,QAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MAC3C;AAAA,IACF;AACA,IAAA,SAAA,CAAU,YAAY,IAAI,CAAA;AAC1B,IAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAChB,IAAA,MAAM,IAAA,GAAO,WAAW,IAAI,CAAA;AAG5B,IAAA,IAAA,CAAK,MAAA,CAAO,cAAc,mBAAA,EAAqB,EAAE,OAAO,CAAA,EAAG,KAAA,EAAM,EAAG,KAAK,CAAC,CAAA;AAC1E,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB;AAGA,EAAA,MAAM,SAAA,EAAU;AAEhB,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,EAAa;AAEnB,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,EAAI,GAAI,oBAAA;AACrC,IAAA,OAAO,WAAA,CAAY,GAAA,EAAI,GAAI,QAAA,EAAU;AACnC,MAAA,IAAI,OAAO,KAAA,CAAM,CAAC,UAAU,uBAAA,CAAwB,KAAK,CAAC,CAAA,EAAG;AAC7D,MAAA,MAAM,MAAM,gBAAgB,CAAA;AAAA,IAC9B;AACA,IAAA,MAAM,mBAAmB,SAAS,CAAA;AAElC,IAAA,MAAM,EAAE,MAAA,EAAQ,eAAA,EAAgB,GAAI,MAAM,OAAO,eAAe,CAAA;AAGhE,IAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,SAAS,CAAA;AAEpD,IAAA,MAAM,SAAuB,EAAC;AAC9B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,MAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,KAAA,EAAO;AAAA,QAC/B,KAAA,EAAO,YAAA;AAAA,QACP,MAAA,EAAQ,aAAA;AAAA,QACR,UAAA,EAAY,mBAAA;AAAA,QACZ,YAAA;AAAA,QACA,SAAA,EAAW;AAAA,OACZ,CAAA;AACD,MAAA,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,CAAA,wBAAA,EAA2B,CAAA,GAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAC9D,MAAA,MAAA,CAAO,KAAK,IAAI,UAAA,CAAW,MAAM,IAAA,CAAK,WAAA,EAAa,CAAC,CAAA;AACpD,MAAA,UAAA,GAAa;AAAA,QACX,KAAA,EAAO,YAAA;AAAA,QACP,SAAS,CAAA,GAAI,CAAA;AAAA,QACb,KAAA;AAAA,QACA,SAAS,IAAA,CAAK,GAAA,CAAI,KAAM,CAAA,GAAI,CAAA,IAAK,QAAS,EAAE;AAAA,OAC7C,CAAA;AAAA,IACH;AAEA,IAAA,UAAA,GAAa,EAAE,OAAO,YAAA,EAAc,OAAA,EAAS,OAAO,KAAA,EAAO,OAAA,EAAS,IAAI,CAAA;AACxE,IAAA,MAAM,IAAA,GAAO,MAAM,cAAA,CAAe,MAAM,CAAA;AACxC,IAAA,YAAA;AAAA,MACE,IAAI,IAAA,CAAK,CAAC,IAAgB,CAAA,EAAG;AAAA,QAC3B,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,MACD,GAAG,QAAQ,CAAA,KAAA;AAAA,KACb;AAAA,EACF,CAAA,SAAE;AACA,IAAA,UAAA,GAAa,EAAE,OAAO,MAAA,EAAQ,OAAA,EAAS,OAAO,KAAA,EAAO,OAAA,EAAS,KAAK,CAAA;AACnE,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,IAAA,CAAK,OAAA,EAAQ;AACvC,IAAA,SAAA,CAAU,MAAA,EAAO;AACjB,IAAA,YAAA,CAAa,MAAA,EAAO;AAAA,EACtB;AACF;AAQA,SAAS,iBAAiB,IAAA,EAAyB;AACjD,EAAA,KAAA,MAAW,EAAA,IAAM,IAAA,CAAK,gBAAA,CAA8B,GAAG,CAAA,EAAG;AACxD,IAAA,MAAM,MAAA,GAAS,iBAAiB,EAAE,CAAA;AAClC,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,EAAA,CAAG,MAAM,WAAA,CAAY,IAAA,EAAM,OAAO,gBAAA,CAAiB,IAAI,GAAG,WAAW,CAAA;AAAA,IACvE;AACA,IAAA,EAAA,CAAG,KAAA,CAAM,WAAA,CAAY,WAAA,EAAa,MAAA,EAAQ,WAAW,CAAA;AACrD,IAAA,EAAA,CAAG,KAAA,CAAM,WAAA,CAAY,YAAA,EAAc,MAAA,EAAQ,WAAW,CAAA;AAAA,EACxD;AACF;AAEA,IAAM,QAAA,GAAW,2DAAA;AACjB,IAAM,MAAA,GAAS,8DAAA;AACf,IAAM,MAAA,GAAS,qEAAA;AAUf,eAAe,eAAe,MAAA,EAA2C;AACvE,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,MAAM,OAAO,QAAQ,CAAA;AAClD,EAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AACjB,EAAA,MAAM,QAAoC,EAAC;AAE3C,EAAA,KAAA,CAAM,qBAAqB,CAAA,GAAI,OAAA,CAAQ,eAAA,CAAgB,CAAC,CAAC,CAAA;AACzD,EAAA,KAAA,CAAM,aAAa,CAAA,GAAI,OAAA,CAAQ,WAAA,EAAa,CAAA;AAC5C,EAAA,KAAA,CAAM,sBAAsB,CAAA,GAAI,OAAA,CAAQ,eAAA,CAAgB,CAAC,CAAC,CAAA;AAC1D,EAAA,KAAA,CAAM,iCAAiC,CAAA,GAAI,OAAA,CAAQ,mBAAA,CAAoB,CAAC,CAAC,CAAA;AACzE,EAAA,KAAA,CAAM,mBAAmB,CAAA,GAAI,OAAA,CAAQ,YAAA,EAAc,CAAA;AACnD,EAAA,KAAA,CAAM,sBAAsB,CAAA,GAAI,OAAA,CAAQ,QAAA,EAAU,CAAA;AAClD,EAAA,KAAA,CAAM,mCAAmC,CAAA,GAAI,OAAA,CAAQ,cAAA,EAAgB,CAAA;AACrE,EAAA,KAAA,CAAM,8CAA8C,CAAA,GAAI,OAAA,CAAQ,kBAAA,EAAoB,CAAA;AACpF,EAAA,KAAA,CAAM,mCAAmC,CAAA,GAAI,OAAA,CAAQ,cAAA,EAAgB,CAAA;AACrE,EAAA,KAAA,CAAM,8CAA8C,CAAA,GAAI,OAAA,CAAQ,kBAAA,EAAoB,CAAA;AAEpF,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,MAAM,CAAA,GAAI,CAAA;AAChB,IAAA,KAAA,CAAM,mBAAmB,GAAG,CAAA,IAAA,CAAM,CAAA,GAAI,OAAA,CAAQ,UAAU,CAAA;AACxD,IAAA,KAAA,CAAM,yBAAyB,GAAG,CAAA,SAAA,CAAW,IAAI,OAAA,CAAQ,YAAA,CAAa,GAAG,CAAC,CAAA;AAC1E,IAAA,KAAA,CAAM,CAAA,eAAA,EAAkB,GAAG,CAAA,IAAA,CAAM,CAAA,GAAI,KAAA;AAAA,EACvC;AAEA,EAAA,OAAO,QAAQ,KAAK,CAAA;AACtB;AAEA,SAAS,gBAAgB,CAAA,EAAmB;AAC1C,EAAA,MAAM,iBAAiB,KAAA,CAAM,IAAA;AAAA,IAC3B,EAAE,QAAQ,CAAA,EAAE;AAAA,IACZ,CAAC,CAAA,EAAG,CAAA,KACF,CAAA,qCAAA,EAAwC,IAAI,CAAC,CAAA,4FAAA;AAAA,GACjD,CAAE,KAAK,EAAE,CAAA;AACT,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,i8BAAA,EAAo8B,cAAc,CAAA,QAAA,CAAA;AACt+B;AAEA,SAAS,WAAA,GAAsB;AAC7B,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,sBAAA,EAAyB,MAAM,mCAAmC,MAAM,CAAA,gEAAA,CAAA;AAC5F;AAEA,SAAS,gBAAgB,CAAA,EAAmB;AAC1C,EAAA,MAAM,SAAS,KAAA,CAAM,IAAA;AAAA,IACnB,EAAE,QAAQ,CAAA,EAAE;AAAA,IACZ,CAAC,GAAG,CAAA,KAAM,CAAA,aAAA,EAAgB,MAAM,CAAC,CAAA,WAAA,EAAc,IAAI,CAAC,CAAA,GAAA;AAAA,GACtD,CAAE,KAAK,EAAE,CAAA;AACT,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,yFAAA,EAA4F,MAAM,uKAAuK,MAAM,CAAA,0BAAA,EAA6B,KAAK,CAAA,MAAA,EAAS,KAAK,CAAA,0DAAA,CAAA;AACnV;AAEA,SAAS,oBAAoB,CAAA,EAAmB;AAC9C,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,iCAAiC,MAAM,CAAA,sDAAA,CAAA;AAAA,IACvC,iCAAiC,MAAM,CAAA,oCAAA;AAAA,GACzC;AACA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAA,CAAK,IAAA;AAAA,MACH,wBAAwB,CAAA,GAAI,CAAC,WAAW,MAAM,CAAA,4BAAA,EAA+B,IAAI,CAAC,CAAA,OAAA;AAAA,KACpF;AAAA,EACF;AACA,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,sBAAA,EAAyB,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,CAAA,gBAAA,CAAA;AACrE;AAEA,SAAS,YAAA,GAAuB;AAC9B,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,2FAAA,EAA8F,MAAM,CAAA,wEAAA,CAAA;AACxH;AAEA,SAAS,cAAA,GAAyB;AAChC,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,sFAAA,EAAyF,MAAM,CAAA,ylBAAA,CAAA;AACnH;AAEA,SAAS,kBAAA,GAA6B;AACpC,EAAA,OAAO,GAAG,QAAQ,CAAA,sBAAA,EAAyB,MAAM,CAAA,gCAAA,EAAmC,MAAM,0FAA0F,MAAM,CAAA,sDAAA,CAAA;AAC5L;AAEA,SAAS,cAAA,GAAyB;AAChC,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,sFAAA,EAAyF,MAAM,CAAA,8ZAAA,CAAA;AACnH;AAEA,SAAS,kBAAA,GAA6B;AACpC,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,sBAAA,EAAyB,MAAM,mCAAmC,MAAM,CAAA,yEAAA,CAAA;AAC5F;AAEA,SAAS,QAAA,GAAmB;AAC1B,EAAA,OAAO,GAAG,QAAQ,CAAA,gFAAA,EAAmF,MAAM,CAAA,uiBAAA,EAA0iB,KAAK,SAAS,KAAK,CAAA,wJAAA,CAAA;AAC1qB;AAEA,SAAS,aAAa,GAAA,EAAqB;AACzC,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,sBAAA,EAAyB,MAAM,mCAAmC,MAAM,CAAA,uFAAA,EAA0F,MAAM,CAAA,8BAAA,EAAiC,GAAG,CAAA,uBAAA,CAAA;AAChO;AAEA,SAAS,QAAA,GAAmB;AAC1B,EAAA,OAAO,GAAG,QAAQ,CAAA,85GAAA,CAAA;AACpB;;;AC7SO,SAAS,eAAe,MAAA,EAAqC;AAClE,EAAA,OACE,kBAAkB,WAAA,KAAgB,MAAA,CAAO,iBAAA,IAAqB,MAAA,CAAO,QAAQ,iBAAiB,CAAA,CAAA;AAElG;AAGO,SAAS,YAAY,CAAA,EAA2B;AACrD,EAAA,OAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA;AACpC;AAEO,SAAS,aAAa,CAAA,EAA2B;AACtD,EAAA,OAAO,CAAA,CAAE,GAAA,KAAQ,YAAA,IAAgB,CAAA,CAAE,GAAA,KAAQ,eAAe,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,GAAA,KAAQ,UAAA;AACvF;AAEO,SAAS,cAAc,CAAA,EAA2B;AACvD,EAAA,OAAO,EAAE,GAAA,KAAQ,WAAA,IAAe,EAAE,GAAA,KAAQ,SAAA,IAAa,EAAE,GAAA,KAAQ,QAAA;AACnE;;;ACRA,IAAM,WAAA,GAA6B;AAAA,EACjC,aAAA,EAAe,sCAAA;AAAA,EACf,SAAA,EAAW,sCAAA;AAAA,EACX,SAAA,EAAW,sCAAA;AAAA,EACX,cAAA,EAAgB,kEAAA;AAAA,EAChB,aAAA,EAAe,4DAAA;AAAA,EACf,UAAA,EAAY,oCAAA;AAAA,EACZ,cAAA,EAAgB,sDAAA;AAAA,EAChB,kBAAA,EAAoB,uDAAA;AAAA,EACpB,WAAA,EAAa,CAAC,CAAA,KAAc,CAAA,yBAAA,EAAQ,CAAC,CAAA;AACvC,CAAA;AAEA,IAAM,WAAA,GAA6B;AAAA,EACjC,aAAA,EAAe,gBAAA;AAAA,EACf,SAAA,EAAW,YAAA;AAAA,EACX,SAAA,EAAW,YAAA;AAAA,EACX,cAAA,EAAgB,sBAAA;AAAA,EAChB,aAAA,EAAe,qBAAA;AAAA,EACf,UAAA,EAAY,gBAAA;AAAA,EACZ,cAAA,EAAgB,qBAAA;AAAA,EAChB,kBAAA,EAAoB,sBAAA;AAAA,EACpB,WAAA,EAAa,CAAC,CAAA,KAAc,CAAA,MAAA,EAAS,CAAC,CAAA;AACxC,CAAA;AAMA,SAAS,cAAA,GAA8B;AACrC,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,SAAS,eAAA,CAAgB,IAAA;AACtC,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,IAAI,KAAK,WAAA,EAAY,CAAE,UAAA,CAAW,IAAI,GAAG,OAAO,IAAA;AAChD,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,gBAAA,GAAkC;AAChD,EAAA,MAAM,OAAO,cAAA,EAAe;AAC5B,EAAA,OAAO,IAAA,KAAS,OAAO,WAAA,GAAc,WAAA;AACvC;AC1CA,IAAM,WAAA,GAAc,GAAA;AACpB,IAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAO,WAAA,GAAc,gBAAiB,YAAY,CAAA;AAC5E,IAAM,aAAA,GAAgB,EAAA;AACtB,IAAM,MAAA,GAAS,EAAA;AAGR,IAAM,UAAA,GAAa,aAAA,GAAgB,WAAA,GAAc,MAAA,GAAS,CAAA;AAUjE,IAAM,WAAA,GAA6B;AAAA,EACjC,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,MAAA;AAAA,EACL,KAAA,EAAO,MAAA;AAAA,EACP,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ,MAAA;AAAA,EACR,UAAA,EAAY,aAAA;AAAA,EACZ,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,MAAA,EAAQ,SAAA;AAAA,EACR,SAAA,EAAW;AACb,CAAA;AAEO,SAAS,UAAU,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,WAAU,EAAmB;AAChF,EAAA,MAAM,OAAA,GAAUC,OAAyB,IAAI,CAAA;AAC7C,EAAA,MAAM,WAAWC,OAAAA,CAAQ,MAAM,gBAAA,EAAiB,EAAG,EAAE,CAAA;AAIrD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,EAAS,QAAA,CAAS,KAAK,CAAA;AAC5C,IAAA,IAAA,EAAM,cAAA,CAAe,EAAE,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,uBACEF,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAGC,mBAAA,EAAkB,EAAA;AAAA,MAClB,cAAY,QAAA,CAAS,SAAA;AAAA,MACrB,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,UAAA;AAAA,QACN,KAAA,EAAO,UAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,SAAA,EAAW,MAAA;AAAA,QACX,kBAAA,EAAoB,SAAA;AAAA,QACpB,UAAA,EAAY,0DAAA;AAAA,QACZ,KAAA,EAAO,iBAAA;AAAA,QACP,WAAA,EAAa,iEAAA;AAAA,QACb,UAAA,EACE,wFAAA;AAAA,QACF,UAAA,EAAY,MAAA;AAAA;AAAA;AAAA,QAGZ,GAAG;AAAA,OACL;AAAA,MAEA,QAAA,kBAAAA,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,OAAA;AAAA,UACL,KAAA,EAAO;AAAA,YACL,OAAA,EAAS,MAAA;AAAA,YACT,aAAA,EAAe,QAAA;AAAA,YACf,GAAA,EAAK,MAAA;AAAA,YACL,MAAA,EAAQ,CAAA;AAAA,YACR,OAAA,EAAS,MAAA;AAAA,YACT,SAAA,EAAW;AAAA,WACb;AAAA,UAEC,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,KAAM;AACxB,YAAA,MAAM,SAAS,CAAA,KAAM,KAAA;AACrB,YAAA,uBACEA,GAAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBAIC,KAAA,EAAO;AAAA,kBACL,iBAAA,EAAmB,MAAA;AAAA,kBACnB,sBAAsB,CAAA,EAAG,YAAY,CAAA,GAAA,EAAM,UAAA,GAAa,SAAS,CAAC,CAAA,EAAA;AAAA,iBACpE;AAAA,gBAEA,QAAA,kBAAA,IAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,KAAA,EAAO,WAAA;AAAA,oBACP,OAAA,EAAS,MAAM,QAAA,CAAS,CAAC,CAAA;AAAA,oBACzB,cAAA,EAAc,SAAS,MAAA,GAAS,MAAA;AAAA,oBAChC,YAAA,EAAY,QAAA,CAAS,WAAA,CAAY,CAAA,GAAI,CAAC,CAAA;AAAA,oBAEtC,QAAA,EAAA;AAAA,sCAAAA,GAAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,KAAA,EAAO;AAAA,4BACL,IAAA,EAAM,OAAO,aAAa,CAAA,EAAA,CAAA;AAAA,4BAC1B,SAAA,EAAW,OAAA;AAAA,4BACX,QAAA,EAAU,EAAA;AAAA,4BACV,kBAAA,EAAoB,cAAA;AAAA,4BACpB,KAAA,EAAO,SAAS,iBAAA,GAAoB,oBAAA;AAAA,4BACpC,UAAA,EAAY,SAAS,GAAA,GAAM;AAAA,2BAC7B;AAAA,0BAEC,QAAA,EAAA,CAAA,GAAI;AAAA;AAAA,uBACP;AAAA,sCACAA,GAAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,KAAA,EAAO;AAAA,4BACL,QAAA,EAAU,UAAA;AAAA,4BACV,OAAA,EAAS,OAAA;AAAA,4BACT,KAAA,EAAO,WAAA;AAAA,4BACP,MAAA,EAAQ,YAAA;AAAA,4BACR,QAAA,EAAU,QAAA;AAAA,4BACV,YAAA,EAAc,CAAA;AAAA,4BACd,UAAA,EAAY,iBAAA;AAAA,4BACZ,OAAA,EAAS,SACL,iEAAA,GACA,iEAAA;AAAA,4BACJ,aAAA,EAAe,SAAS,CAAA,GAAI,CAAA;AAAA;AAAA;AAAA;AAAA,4BAI5B,aAAA,EAAe;AAAA,2BACjB;AAAA,0BAEA,0BAAAA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,KAAA,EAAO,CAAA,EAAG,OAAO,MAAA,CAAO,MAAA,EAI3C,QAAA,kBAAAA,GAAAA,CAAC,eAAY,KAAA,EAAO,WAAA,GAAc,YAAA,EAAc,SAAA,EAC7C,iBACH,CAAA,EACF;AAAA;AAAA;AACF;AAAA;AAAA;AACF,eAAA;AAAA,cAvDK;AAAA,aAwDP;AAAA,UAEJ,CAAC;AAAA;AAAA;AACH;AAAA,GACF;AAEJ;ACxHA,IAAM,MAAA,GAAwB;AAAA,EAC5B,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,GAAA,EAAK,CAAA;AAAA,EACL,MAAA,EAAQ,EAAA;AAAA,EACR,QAAA,EAAU,EAAA;AAAA,EACV,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,MAAA;AAAA,EACR,YAAA,EAAc,CAAA;AAAA,EACd,UAAA,EAAY,aAAA;AAAA,EACZ,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,QAAA,EAAU,EAAA;AAAA,EACV,MAAA,EAAQ;AACV,CAAA;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAsB;AAGpB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIG,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,cAAA,KAAmB,IAAA,IAAQ,cAAA,CAAe,KAAA,KAAU,MAAA;AACjE,EAAA,MAAM,WAAWD,OAAAA,CAAQ,MAAM,gBAAA,EAAiB,EAAG,EAAE,CAAA;AAErD,EAAA,uBACEE,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAGC,mBAAA,EAAkB,EAAA;AAAA,MAClB,YAAA,EAAc,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,MACnC,YAAA,EAAc,MAAM,UAAA,CAAW,KAAK,CAAA;AAAA,MACpC,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,MAAA,EAAQ,EAAA;AAAA,QACR,IAAA,EAAM,KAAA;AAAA,QACN,SAAA,EAAW,kBAAA;AAAA,QACX,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAK,CAAA;AAAA,QACL,OAAA,EAAS,CAAA;AAAA,QACT,YAAA,EAAc,EAAA;AAAA,QACd,UAAA,EAAY,mBAAA;AAAA,QACZ,KAAA,EAAO,MAAA;AAAA,QACP,cAAA,EAAgB,WAAA;AAAA,QAChB,OAAA,EAAS,OAAA,IAAW,IAAA,GAAO,CAAA,GAAI,IAAA;AAAA,QAC/B,UAAA,EAAY,oBAAA;AAAA,QACZ,UAAA,EACE,wFAAA;AAAA,QACF,UAAA,EAAY;AAAA,OACd;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAJ,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,KAAA,EAAO,MAAA,EAAQ,SAAS,MAAA,EAAQ,YAAA,EAAY,QAAA,CAAS,aAAA,EACzE,0BAAAA,GAAAA,CAAC,eAAA,EAAA,EAAgB,MAAM,EAAA,EAAI,aAAA,EAAY,QAAO,CAAA,EAChD,CAAA;AAAA,wBACAI,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,EAAA,EAAI,kBAAA,EAAoB,cAAA,EAAe,EAC/E,QAAA,EAAA;AAAA,UAAA,OAAA;AAAA,UAAQ,KAAA;AAAA,UAAI;AAAA,SAAA,EACf,CAAA;AAAA,wBACAJ,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,KAAA,EAAO,QAAQ,OAAA,EAAS,MAAA,EAAQ,cAAY,QAAA,CAAS,SAAA,EACzE,0BAAAA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,MAAM,EAAA,EAAI,aAAA,EAAY,QAAO,CAAA,EACjD,CAAA;AAAA,QAGC,YAAA,GAAe,uBACdA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAO,MAAA;AAAA,YACP,OAAA,EAAS,YAAA;AAAA,YACT,YAAA,EAAY,QAAA,GAAW,QAAA,CAAS,cAAA,GAAiB,QAAA,CAAS,aAAA;AAAA,YAC1D,KAAA,EAAO,QAAA,GAAW,QAAA,CAAS,cAAA,GAAiB,QAAA,CAAS,aAAA;AAAA,YACrD,cAAA,EAAc,QAAA;AAAA,YAEb,QAAA,EAAA,QAAA,mBACCA,GAAAA,CAAC,kBAAA,EAAA,EAAmB,MAAM,EAAA,EAAI,aAAA,EAAY,MAAA,EAAO,CAAA,mBAEjDA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,IAAA,EAAM,EAAA,EAAI,eAAY,MAAA,EAAO;AAAA;AAAA,SAEpD;AAAA,QAID,gCACCA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAO,MAAA;AAAA,YACP,OAAA,EAAS,YAAA;AAAA,YACT,YAAA,EAAY,YAAA,GAAe,QAAA,CAAS,cAAA,GAAiB,QAAA,CAAS,UAAA;AAAA,YAC9D,KAAA,EAAO,YAAA,GAAe,QAAA,CAAS,cAAA,GAAiB,QAAA,CAAS,UAAA;AAAA,YAExD,QAAA,EAAA,YAAA,mBACCA,GAAAA,CAAC,YAAA,EAAA,EAAa,MAAM,EAAA,EAAI,aAAA,EAAY,MAAA,EAAO,CAAA,mBAE3CA,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,EAAA,EAAI,eAAY,MAAA,EAAO;AAAA;AAAA,SAE/C,GACE,IAAA;AAAA,wBACJI,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAO,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAS,IAAA,GAAO,GAAA,GAAM,CAAA,EAAG,MAAA,EAAQ,IAAA,GAAO,UAAA,GAAa,SAAA,EAAU;AAAA,YACnF,OAAA,EAAS,QAAA;AAAA,YACT,QAAA,EAAU,IAAA;AAAA,YACV,cAAY,QAAA,CAAS,kBAAA;AAAA,YACrB,OAAO,QAAA,CAAS,kBAAA;AAAA,YAEhB,QAAA,EAAA;AAAA,8BAAAJ,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,EAAA,EAAI,eAAY,MAAA,EAAO,CAAA;AAAA,cAC1C,IAAA,mBAAOI,IAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,KAAA,CAAM,eAAe,OAAO,CAAA;AAAA,gBAAE;AAAA,eAAA,EAAC,CAAA,GAAU;AAAA;AAAA;AAAA;AAC/D;AAAA;AAAA,GACF;AAEJ;ACpJA,IAAM,KAAA,GAAQ,kCAAA;AAEd,SAAS,OAAA,GAAmB;AAC1B,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA,CAAE,OAAA;AAClC;AAMO,SAAS,uBAAA,GAAmC;AACjD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAID,SAAS,OAAO,CAAA;AAE9C,EAAAE,UAAU,MAAM;AACd,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AACnC,IAAA,UAAA,CAAW,IAAI,OAAO,CAAA;AACtB,IAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAA2B,UAAA,CAAW,EAAE,OAAO,CAAA;AACjE,IAAA,GAAA,CAAI,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AACvC,IAAA,OAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AAAA,EACzD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,OAAA;AACT;ACeA,IAAM,eAAA,GAAkBC,cAA2C,IAAI,CAAA;AAahE,SAAS,QAAA,CAAS;AAAA,EACvB,aAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAAqC;AACnC,EAAA,MAAM,aAAA,GAAgBL,MAAAA,CAAuB,EAAE,CAAA;AAE/C,EAAA,MAAM,SAAA,GAAYC,OAAAA;AAAA,IAChB,OAAO;AAAA,MACL,SAAS,MAAM;AACb,QAAA,KAAA,MAAW,CAAA,IAAK,cAAc,OAAA,EAAS;AACrC,UAAA,IAAI,CAAA,CAAE,UAAA,CAAW,OAAA,EAAQ,EAAG,OAAO,IAAA;AAAA,QACrC;AACA,QAAA,OAAO,KAAA;AAAA,MACT,CAAA;AAAA,MACA,SAAS,MAAM;AACb,QAAA,KAAA,IAAS,IAAI,aAAA,CAAc,OAAA,CAAQ,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1D,UAAA,IAAI,cAAc,OAAA,CAAQ,CAAC,EAAG,UAAA,CAAW,OAAA,IAAW,OAAO,IAAA;AAAA,QAC7D;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,KACF,CAAA;AAAA,IACA;AAAC,GACH;AAKA,EAAAK,gBAAgB,MAAM;AACpB,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,aAAA,CAAc,OAAA,GAAU,SAAA;AACxB,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,aAAA,CAAc,OAAA,KAAY,SAAA,EAAW,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,IACnE,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,SAAA,EAAW,aAAa,CAAC,CAAA;AAE5C,EAAA,MAAM,KAAA,GAAQL,OAAAA;AAAA,IACZ,OAAO;AAAA,MACL,QAAA,EAAU,CAAC,GAAA,KAAQ;AACjB,QAAA,aAAA,CAAc,OAAA,CAAQ,KAAK,GAAG,CAAA;AAC9B,QAAA,OAAO,MAAM;AACX,UAAA,MAAM,CAAA,GAAI,aAAA,CAAc,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AAC3C,UAAA,IAAI,MAAM,EAAA,EAAI,aAAA,CAAc,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,QACjD,CAAA;AAAA,MACF,CAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,gBAAgB,aAAa;AAAA,GAChC;AAEA,EAAA,uBAAOF,GAAAA,CAAC,eAAA,CAAgB,QAAA,EAAhB,EAAyB,OAAe,QAAA,EAAS,CAAA;AAC3D;AAYO,SAAS,gBAAA,GAA4B;AAC1C,EAAA,OAAOQ,UAAAA,CAAW,eAAe,CAAA,EAAG,aAAA,IAAiB,KAAA;AACvD;AAMO,SAAS,KAAA,CAAM,EAAE,QAAA,EAAS,EAAsB;AACrD,EAAA,MAAM,IAAA,GAAOA,WAAW,eAAe,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AACtC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,cAAA,CAAe,CAAC,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,CAAE,MAAA;AAK3E,EAAA,MAAM,OAAA,GAAU,IAAA,EAAM,cAAA,KAAmB,SAAA,GAAY,CAAA,GAAI,SAAA;AACzD,EAAA,MAAM,WAAA,GAAcP,OAAO,OAAO,CAAA;AAClC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIE,SAAS,OAAO,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQF,MAAAA,CAAe,EAAE,CAAA;AAE/B,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,CAAA,KAAc;AAC/C,IAAA,WAAA,CAAY,OAAA,GAAU,CAAA;AACtB,IAAA,WAAA,CAAY,CAAC,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAM,gBAAgB,MAAM;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,UAAA,GAA6B;AAAA,MACjC,SAAS,MAAM;AACb,QAAA,IAAI,WAAA,CAAY,OAAA,IAAW,SAAA,EAAW,OAAO,KAAA;AAC7C,QAAA,aAAA,CAAc,WAAA,CAAY,UAAU,CAAC,CAAA;AACrC,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MACA,SAAS,MAAM;AACb,QAAA,IAAI,WAAA,CAAY,OAAA,IAAW,CAAA,EAAG,OAAO,KAAA;AACrC,QAAA,aAAA,CAAc,WAAA,CAAY,UAAU,CAAC,CAAA;AACrC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACF;AACA,IAAA,OAAO,KAAK,QAAA,CAAS;AAAA,MACnB,IAAI,KAAA,CAAM,OAAA;AAAA,MACV,SAAA;AAAA,MACA,iBAAiB,WAAA,CAAY,OAAA;AAAA,MAC7B,UAAA;AAAA,MACA,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,IAAA,EAAM,SAAA,EAAW,aAAa,CAAC,CAAA;AAInC,EAAA,MAAM,SAAA,GAAY,OAAO,QAAA,GAAW,SAAA;AAEpC,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,uBACEP,GAAAA,CAAA,QAAA,EAAA,EACG,eAAK,GAAA,CAAI,CAAC,OAAO,GAAA,KAAQ;AACxB,IAAA,IAAI,cAAA,CAAe,KAAK,CAAA,IAAK,KAAA,CAAM,SAAS,IAAA,EAAM;AAChD,MAAA,MAAM,KAAA,GAAQ,SAAA,EAAA;AACd,MAAA,OAAO,aAAa,KAAA,EAAgD;AAAA,QAClE,GAAA,EAAK,MAAM,GAAA,IAAO,GAAA;AAAA,QAClB,WAAW,KAAA,GAAQ;AAAA,OACpB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA,EACH,CAAA;AAEJ;AAUO,SAAS,KAAK,EAAE,QAAA,EAAU,QAAA,GAAW,GAAA,EAAK,WAAU,EAAsB;AAC/E,EAAA,MAAM,eAAe,uBAAA,EAAwB;AAC7C,EAAA,MAAM,WAAW,SAAA,IAAa,IAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,eAAe,CAAA,GAAI,QAAA;AAE9B,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,iBAAA,EAAiB,WAAW,UAAA,GAAa,SAAA;AAAA,MACzC,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,WAAW,CAAA,GAAI,CAAA;AAAA;AAAA;AAAA,QAGxB,UAAA,EAAY,WAAW,SAAA,GAAY,QAAA;AAAA,QACnC,UAAA,EAAY,WAAW,EAAE,CAAA,6BAAA;AAAA,OAC3B;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AC5LA,IAAM,cAAA,GAAiB,4BAAA;AACvB,IAAM,cAAA,GAAiB,oBAAA;AACvB,IAAM,wBAAA,GAA2B,yBAAA;AAOjC,IAAM,uBAAA,GAA0B;AAAA,EAC9B,SAAA;AAAA,EACA,OAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,oBAAA;AAAA,EACA,qBAAA;AAAA,EACA,mBAAA;AAAA,EACA,eAAA;AAAA,EACA,uBAAA;AAAA,EACA,wBAAA;AAAA,EACA,2BAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,uBAAA,GAA0B;AAAA,EAC9B,kBAAA;AAAA,EACA,oBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,sBAAA,GAAyB;AAAA,EAC7B;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,KAAA,EAAO,gBAAA;AAAA,IACP,KAAA,EAAO,gBAAA;AAAA,IACP,QAAA,EAAU,kBAAA;AAAA,IACV,QAAA,EAAU,kBAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,KAAA,EAAO,kBAAA;AAAA,IACP,KAAA,EAAO,kBAAA;AAAA,IACP,KAAA,EAAO,kBAAA;AAAA,IACP,QAAA,EAAU,oBAAA;AAAA,IACV,QAAA,EAAU,oBAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,KAAA,EAAO,mBAAA;AAAA,IACP,KAAA,EAAO,mBAAA;AAAA,IACP,KAAA,EAAO,mBAAA;AAAA,IACP,QAAA,EAAU,qBAAA;AAAA,IACV,QAAA,EAAU,qBAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,KAAA,EAAO,iBAAA;AAAA,IACP,KAAA,EAAO,iBAAA;AAAA,IACP,KAAA,EAAO,iBAAA;AAAA,IACP,QAAA,EAAU,mBAAA;AAAA,IACV,QAAA,EAAU,mBAAA;AAAA,IACV,QAAA,EAAU;AAAA;AAEd,CAAA;AAGA,IAAM,2BAAA,uBAAkC,GAAA,CAAY;AAAA,EAClD,OAAA;AAAA,EACA,uBAAA;AAAA,EACA,wBAAA;AAAA,EACA,2BAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,QAAA,CACP,EAAA,EACA,KAAA,EACA,gBAAA,EACA,cAAA,EACkB;AAClB,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,OAAO,EAAA,CAAG,OAAA,CAAQ,KAAA,CAAM,SAAA,EAAW;AAAA,IACjC,QAAA,EAAU,MAAM,QAAA,IAAY,gBAAA;AAAA,IAC5B,MAAA,EAAQ,MAAM,MAAA,IAAU,cAAA;AAAA,IACxB,KAAA,EAAO,MAAM,KAAA,IAAS,CAAA;AAAA,IACtB,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AAIA,SAAS,YAAA,CACP,KAAA,EACA,gBAAA,EACA,cAAA,EACsB;AACtB,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,EAAE,UAAU,gBAAA,EAAkB,MAAA,EAAQ,cAAA,EAAgB,KAAA,EAAO,CAAA,EAAE;AAC1F,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,MAAM,QAAA,IAAY,gBAAA;AAAA,IAC5B,MAAA,EAAQ,MAAM,MAAA,IAAU,cAAA;AAAA,IACxB,KAAA,EAAO,MAAM,KAAA,IAAS;AAAA,GACxB;AACF;AASA,SAAS,eAAe,MAAA,EAAqC;AAC3D,EAAA,OAAO,OAAO,SAAA,IAAa,MAAA,CAAO,SAAA,KAAc,MAAA,GAAS,OAAO,SAAA,GAAY,EAAA;AAC9E;AAMA,SAAS,+BAA+B,EAAA,EAA0B;AAChE,EAAA,MAAM,MAAA,GAAS,iBAAiB,EAAE,CAAA;AAClC,EAAA,IAAI,CAAC,cAAA,CAAe,MAAM,CAAA,EAAG,OAAO,GAAG,qBAAA,EAAsB;AAE7D,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,gBAAA,CAAiB,WAAW,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,KAAA,CAAM,mBAAA,CAAoB,WAAW,CAAA;AACzD,EAAA,EAAA,CAAG,KAAA,CAAM,WAAA,CAAY,WAAA,EAAa,MAAA,EAAQ,WAAW,CAAA;AACrD,EAAA,IAAI;AACF,IAAA,OAAO,GAAG,qBAAA,EAAsB;AAAA,EAClC,CAAA,SAAE;AACA,IAAA,IAAI,OAAO,EAAA,CAAG,KAAA,CAAM,WAAA,CAAY,WAAA,EAAa,OAAO,QAAQ,CAAA;AAAA,SACvD,EAAA,CAAG,KAAA,CAAM,cAAA,CAAe,WAAW,CAAA;AAAA,EAC1C;AACF;AAOA,SAAS,gBAAA,CAAiB,EAAA,EAAiB,OAAA,EAAsB,WAAA,EAAiC;AAChG,EAAA,MAAM,IAAA,GAAO,+BAA+B,EAAE,CAAA;AAC9C,EAAA,MAAM,SAAS,WAAA,CAAY,KAAA,IAAS,QAAQ,WAAA,IAAe,WAAA,CAAY,SAAS,CAAA,CAAA,IAAM,CAAA;AACtF,EAAA,MAAM,SAAS,WAAA,CAAY,MAAA,IAAU,QAAQ,YAAA,IAAgB,WAAA,CAAY,UAAU,CAAA,CAAA,IAAM,CAAA;AACzF,EAAA,OAAO;AAAA,IACL,IAAA,EAAA,CAAO,IAAA,CAAK,IAAA,GAAO,WAAA,CAAY,IAAA,IAAQ,MAAA;AAAA,IACvC,GAAA,EAAA,CAAM,IAAA,CAAK,GAAA,GAAM,WAAA,CAAY,GAAA,IAAO,MAAA;AAAA,IACpC,KAAA,EAAO,KAAK,KAAA,GAAQ,MAAA;AAAA,IACpB,MAAA,EAAQ,KAAK,MAAA,GAAS;AAAA,GACxB;AACF;AAEA,SAAS,cAAc,IAAA,EAA0B;AAC/C,EAAA,OAAO,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,CAAA;AACzC;AAEA,SAAS,qBAAqB,IAAA,EAA6C;AACzE,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAyB;AAC9C,EAAA,KAAA,MAAW,EAAA,IAAM,IAAA,CAAK,gBAAA,CAA8B,cAAc,CAAA,EAAG;AACnE,IAAA,MAAM,EAAA,GAAK,GAAG,OAAA,CAAQ,UAAA;AACtB,IAAA,IAAI,EAAA,IAAM,CAAC,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,qBAAA,CACP,MAAA,EACA,MAAA,EACA,IAAA,EACA,iBAAA,EACS;AACT,EAAA,IAAI,SAAS,wBAAA,IAA4B,MAAA,CAAO,iBAAiB,IAAI,CAAA,KAAM,OAAO,KAAA,EAAO;AACvF,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,4BAA4B,GAAA,CAAI,IAAI,GAAG,OAAO,KAAA;AACzE,EAAA,MAAM,SAAS,MAAA,CAAO,aAAA;AACtB,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,EAAA,OAAO,MAAA,CAAO,iBAAiB,IAAI,CAAA,KAAM,iBAAiB,MAAM,CAAA,CAAE,iBAAiB,IAAI,CAAA;AACzF;AAOA,SAAS,kBAAA,CACP,MAAA,EACA,MAAA,EACA,iBAAA,GAAoB,KAAA,EACd;AACN,EAAA,MAAM,MAAA,GAAS,iBAAiB,MAAM,CAAA;AACtC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,IAAA,GAAO,OAAO,CAAC,CAAA;AACrB,IAAA,IAAI,qBAAA,CAAsB,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,iBAAiB,CAAA,EAAG;AACpE,IAAA,MAAA,CAAO,KAAA,CAAM,WAAA,CAAY,IAAA,EAAM,MAAA,CAAO,gBAAA,CAAiB,IAAI,CAAA,EAAG,MAAA,CAAO,mBAAA,CAAoB,IAAI,CAAC,CAAA;AAAA,EAChG;AAEA,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,gBAAA,CAA8B,GAAG,CAAA;AAC/D,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,gBAAA,CAA8B,GAAG,CAAA;AAC/D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,IAAA,MAAM,KAAA,GAAQ,eAAe,CAAC,CAAA;AAC9B,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,kBAAA,CAAmB,cAAA,CAAe,CAAC,CAAA,EAAI,KAAA,EAAO,IAAI,CAAA;AAAA,EACpD;AACF;AAEA,SAAS,kBAAkB,MAAA,EAAkC;AAC3D,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA;AACnC,EAAA,kBAAA,CAAmB,QAAQ,KAAK,CAAA;AAChC,EAAA,KAAA,CAAM,gBAAgB,kBAAkB,CAAA;AACxC,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,QAAQ,KAAA,EAA8B;AAC7C,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAK,CAAE,MAAM,mBAAmB,CAAA;AACpD,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,CAAC,CAAE,CAAA;AACrC,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA;AAClC;AAGA,SAAS,WAAA,CAAY,KAAA,EAAe,MAAA,EAAgB,MAAA,EAAwB;AAC1E,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AACtC,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,CAAC,KAAK,EAAE,CAAA;AAChC,EAAA,MAAM,CAAA,GAAI,QAAQ,KAAA,CAAM,CAAC,KAAK,KAAA,CAAM,CAAC,KAAK,EAAE,CAAA;AAC5C,EAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,IAAA,EAAM,OAAO,KAAA;AACrC,EAAA,MAAM,QAAQ,CAAA,GAAI,MAAA;AAClB,EAAA,MAAM,QAAQ,CAAA,GAAI,MAAA;AAClB,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,KAAK,CAAA,GAAI,IAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA,GAAO,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,KAAK,CAAA,EAAA,CAAA;AAC7E;AAEA,SAAS,cAAA,CAAe,MAAA,EAA6B,MAAA,GAAS,CAAA,EAAG,SAAS,CAAA,EAAa;AACrF,EAAA,OAAO;AAAA,IACL,mBAAA,EAAqB,WAAA,CAAY,MAAA,CAAO,mBAAA,EAAqB,QAAQ,MAAM,CAAA;AAAA,IAC3E,oBAAA,EAAsB,WAAA,CAAY,MAAA,CAAO,oBAAA,EAAsB,QAAQ,MAAM,CAAA;AAAA,IAC7E,uBAAA,EAAyB,WAAA,CAAY,MAAA,CAAO,uBAAA,EAAyB,QAAQ,MAAM,CAAA;AAAA,IACnF,sBAAA,EAAwB,WAAA,CAAY,MAAA,CAAO,sBAAA,EAAwB,QAAQ,MAAM;AAAA,GACnF;AACF;AAEA,SAAS,cAAA,CAAe,IAAA,EAAiB,MAAA,EAAgB,MAAA,EAAgB,KAAA,EAAuB;AAC9F,EAAA,OAAO,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,IAAI,CAAA,IAAA,EAAO,IAAA,CAAK,GAAG,CAAA,GAAA,CAAA,EAAO,CAAA,MAAA,EAAS,MAAM,CAAA,EAAA,EAAK,MAAM,KAAK,KAAK,CAAA,CACrF,OAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AACb;AAEA,SAAS,uBAAA,CAAwB,MAAiB,KAAA,EAAuB;AACvE,EAAA,OAAO,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,IAAI,OAAO,IAAA,CAAK,GAAG,CAAA,GAAA,CAAA,EAAO,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACrF;AAGA,SAAS,iBAAiB,GAAA,EAAqB;AAC7C,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAE,OAAA,CAAQ,WAAA,EAAa,CAAC,CAAA,EAAG,MAAA,KAAmB,MAAA,CAAO,WAAA,EAAa,CAAA;AAC/F;AAEA,SAAS,mBAAA,CACP,MAAA,EACA,OAAA,EACA,OAAA,GAA6C,EAAC,EACpC;AACV,EAAA,MAAM,QAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,QAAQ,uBAAA,EAAyB;AAC1C,IAAA,IACE,QAAQ,mBAAA,KAAwB,KAAA,IAC/B,uBAAA,CAA8C,QAAA,CAAS,IAAI,CAAA,EAC5D;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,CAAiB,IAAI,CAAA;AAC1C,IAAA,IAAI,IAAA,KAAS,wBAAA,IAA4B,KAAA,KAAU,MAAA,CAAO,KAAA,EAAO;AACjE,IAAA,IAAI,KAAA,EAAO,KAAA,CAAM,gBAAA,CAAiB,IAAI,CAAC,CAAA,GAAI,KAAA;AAAA,EAC7C;AACA,EAAA,IAAI,OAAA,KAAY,MAAA,EAAW,KAAA,CAAM,OAAA,GAAU,OAAA;AAC3C,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,iBAAiB,EAAA,EAAuB;AAC/C,EAAA,KAAA,MAAW,EAAE,KAAA,EAAM,IAAK,sBAAA,EAAwB;AAC9C,IAAA,EAAA,CAAG,KAAA,CAAM,KAAK,CAAA,GAAI,aAAA;AAAA,EACpB;AACF;AAEA,SAAS,mBAAA,CACP,QACA,IAAA,EACS;AACT,EAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,iBAAiB,IAAA,CAAK,QAAQ,CAAC,CAAA,IAAK,CAAA;AACjE,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA;AACzD,EAAA,OAAO,KAAA,GAAQ,CAAA,IAAK,WAAA,KAAgB,MAAA,IAAU,WAAA,KAAgB,QAAA;AAChE;AAEA,SAAS,iBAAiB,MAAA,EAAsC;AAC9D,EAAA,OAAO,uBAAuB,IAAA,CAAK,CAAC,SAAS,mBAAA,CAAoB,MAAA,EAAQ,IAAI,CAAC,CAAA;AAChF;AAEA,SAAS,mBAAA,CACP,IAAA,EACA,MAAA,EACA,OAAA,EACU;AACV,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAAA,IACpB,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAA,CAAA;AAAA,IACtB,OAAA;AAAA,IACA,SAAA,EAAW,uBAAA,CAAwB,IAAA,EAAM,cAAA,CAAe,MAAM,CAAC,CAAA;AAAA,IAC/D,GAAG,eAAe,MAAM;AAAA,GAC1B;AACA,EAAA,KAAA,MAAW,QAAQ,sBAAA,EAAwB;AACzC,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA,GAAI,MAAA,CAAO,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AACzD,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA,GAAI,MAAA,CAAO,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,KAAA;AACT;AAOA,SAAS,iBAAA,CACP,OAAA,EACA,OAAA,EACA,YAAA,EACA,cACA,IAAA,EACa;AACb,EAAA,IAAI,CAAC,OAAA,CAAQ,aAAA,EAAe,OAAA,CAAQ,YAAY,OAAO,CAAA;AAEvD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,EAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,IACzB,QAAA,EAAU,UAAA;AAAA,IACV,IAAA,EAAM,GAAA;AAAA,IACN,GAAA,EAAK,GAAA;AAAA,IACL,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAAA,IACpB,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAA,CAAA;AAAA,IACtB,MAAA,EAAQ,GAAA;AAAA,IACR,eAAA,EAAiB,UAAA;AAAA,IACjB,aAAA,EAAe,MAAA;AAAA,IACf,SAAA,EAAW,YAAA;AAAA,IACX,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,KAAA,MAAW,QAAQ,sBAAA,EAAwB;AACzC,IAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,YAAA,EAAc,IAAI,IAAI,YAAA,GAAe,YAAA;AACxE,IAAA,KAAA,CAAM,MAAM,IAAA,CAAK,KAAK,IAAI,MAAA,CAAO,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AAC/D,IAAA,KAAA,CAAM,MAAM,IAAA,CAAK,KAAK,IAAI,YAAA,CAAa,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AACrE,IAAA,KAAA,CAAM,MAAM,IAAA,CAAK,KAAK,IAAI,YAAA,CAAa,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AAAA,EACvE;AAEA,EAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AACzB,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,oBAAA,CAAqB,MAA2B,EAAA,EAAkC;AACzF,EAAA,KAAA,MAAW,QAAQ,uBAAA,EAAyB;AAC1C,IAAA,IAAI,IAAA,CAAK,iBAAiB,IAAI,CAAA,KAAM,GAAG,gBAAA,CAAiB,IAAI,GAAG,OAAO,IAAA;AAAA,EACxE;AACA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,gBAAA,CAAiB,IAAiB,QAAA,EAA+B;AACxE,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,IAAA,GAA2B,EAAA;AAC/B,EAAA,OAAO,IAAA,IAAQ,SAAS,QAAA,EAAU;AAChC,IAAA,MAAM,QAAQ,MAAA,CAAO,UAAA,CAAW,gBAAA,CAAiB,IAAI,EAAE,OAAO,CAAA;AAC9D,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG,OAAA,IAAW,KAAA;AACvC,IAAA,IAAA,GAAO,IAAA,CAAK,aAAA;AAAA,EACd;AACA,EAAA,OAAO,OAAO,OAAO,CAAA;AACvB;AAEA,SAAS,aAAa,EAAA,EAA6B;AACjD,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,gBAAA,CAAiB,YAAY,CAAA;AACpD,EAAA,MAAM,QAAA,GAAW,EAAA,CAAG,KAAA,CAAM,mBAAA,CAAoB,YAAY,CAAA;AAC1D,EAAA,EAAA,CAAG,KAAA,CAAM,WAAA,CAAY,YAAA,EAAc,QAAA,EAAU,WAAW,CAAA;AACxD,EAAA,OAAO,MAAM;AACX,IAAA,IAAI,OAAO,EAAA,CAAG,KAAA,CAAM,WAAA,CAAY,YAAA,EAAc,OAAO,QAAQ,CAAA;AAAA,SACxD,EAAA,CAAG,KAAA,CAAM,cAAA,CAAe,YAAY,CAAA;AAAA,EAC3C,CAAA;AACF;AAEA,SAAS,qBAAA,CACP,OAAA,EACA,OAAA,EACA,MAAA,EACA,IAAA,EACa;AACb,EAAA,IAAI,CAAC,OAAA,CAAQ,aAAA,EAAe,OAAA,CAAQ,YAAY,OAAO,CAAA;AAEvD,EAAA,MAAM,KAAA,GAAQ,kBAAkB,MAAM,CAAA;AACtC,EAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,IACzB,QAAA,EAAU,UAAA;AAAA,IACV,IAAA,EAAM,GAAA;AAAA,IACN,GAAA,EAAK,GAAA;AAAA,IACL,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAAA,IACpB,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAA,CAAA;AAAA,IACtB,MAAA,EAAQ,GAAA;AAAA,IACR,eAAA,EAAiB,UAAA;AAAA,IACjB,aAAA,EAAe,MAAA;AAAA,IACf,SAAA,EAAW;AAAA,GACZ,CAAA;AACD,EAAA,OAAA,CAAQ,YAAY,KAAK,CAAA;AACzB,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,aAAa,KAAA,EAAgD;AACpE,EAAA,OAAO,EAAE,QAAA,EAAU,KAAA,CAAM,QAAA,EAAU,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,MAAA,EAAO;AAC5F;AAEA,SAAS,mCAAA,CACP,KAAA,EACA,MAAA,EACA,MAAA,EACA,KAAA,EACa;AACb,EAAA,MAAM,aAA0B,EAAC;AACjC,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,gBAAA,CAA8B,GAAG,CAAA;AAC7D,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,gBAAA,CAA8B,GAAG,CAAA;AAC/D,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,gBAAA,CAA8B,GAAG,CAAA;AAE/D,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,IAAA,MAAM,UAAA,GAAa,cAAc,CAAC,CAAA;AAClC,IAAA,MAAM,WAAA,GAAc,eAAe,CAAC,CAAA;AACpC,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,WAAA,EAAa;AAEjC,IAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,cAAA,CAAe,CAAC,CAAE,CAAA;AACxD,IAAA,MAAM,YAAA,GAAe,iBAAiB,WAAW,CAAA;AACjD,IAAA,IAAI,CAAC,oBAAA,CAAqB,YAAA,EAAc,YAAY,CAAA,EAAG;AAEvD,IAAA,UAAA,CAAW,IAAA;AAAA,MACT,UAAA,CAAW,OAAA;AAAA,QACT,CAAC,mBAAA,CAAoB,YAAY,CAAA,EAAG,mBAAA,CAAoB,YAAY,CAAC,CAAA;AAAA,QACrE,aAAa,KAAK;AAAA;AACpB,KACF;AAAA,EACF;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,mBACP,KAAA,EACA,IAAA,EACA,MAAA,EACA,WAAA,EACA,WACA,KAAA,EACW;AACX,EAAA,MAAM,YAAY,cAAA,CAAe,IAAA,EAAM,GAAG,CAAA,EAAG,cAAA,CAAe,MAAM,CAAC,CAAA;AACnE,EAAA,OAAO,KAAA,CAAM,OAAA;AAAA,IACX;AAAA,MACE,EAAE,GAAG,mBAAA,CAAoB,MAAA,EAAQ,WAAW,GAAG,GAAG,cAAA,CAAe,MAAM,CAAA,EAAG,SAAA,EAAU;AAAA,MACpF,EAAE,GAAG,mBAAA,CAAoB,MAAA,EAAQ,SAAS,GAAG,GAAG,cAAA,CAAe,MAAM,CAAA,EAAG,SAAA;AAAU,KACpF;AAAA,IACA,aAAa,KAAK;AAAA,GACpB;AACF;AAOA,SAAS,kBAAA,CACP,OAAA,EACA,aAAA,EACA,aAAA,EACA,KAAA,EACkD;AAClD,EAAA,MAAM,WAAA,GAAc,QAAQ,qBAAA,EAAsB;AAClD,EAAA,IAAI,WAAA,CAAY,KAAA,KAAU,CAAA,IAAK,WAAA,CAAY,WAAW,CAAA,EAAG;AACvD,IAAA,OAAO,EAAE,UAAA,EAAY,EAAC,EAAG,SAAS,MAAM;AAAA,IAAC,CAAA,EAAE;AAAA,EAC7C;AAEA,EAAA,MAAM,QAAA,GAAW,qBAAqB,aAAa,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,qBAAqB,aAAa,CAAA;AAEnD,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,EAAA,OAAA,CAAQ,YAAA,CAAa,0BAA0B,EAAE,CAAA;AACjD,EAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,EAAO;AAAA,IAC3B,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO,GAAA;AAAA,IACP,MAAA,EAAQ,YAAA;AAAA,IACR,aAAA,EAAe;AAAA,GAChB,CAAA;AAED,EAAA,MAAM,aAA0B,EAAC;AACjC,EAAA,MAAM,UAA6B,EAAC;AAIpC,EAAA,MAAM,aAAA,GAAgB,CAAC,MAAA,EAAqB,IAAA,KAAoB;AAC9D,IAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,OAAA,EAAS,OAAA,EAAS,QAAQ,IAAI,CAAA;AAClE,IAAA,OAAA,CAAQ,IAAA,CAAK,YAAA,CAAa,MAAM,CAAC,CAAA;AACjC,IAAA,UAAA,CAAW,IAAA;AAAA,MACT,kBAAA;AAAA,QACE,KAAA;AAAA,QACA,IAAA;AAAA,QACA,iBAAiB,MAAM,CAAA;AAAA,QACvB,gBAAA,CAAiB,QAAQ,aAAa,CAAA;AAAA,QACtC,GAAA;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,EAAqB,EAAA,KAAkB;AAC3D,IAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,OAAA,EAAS,OAAA,EAAS,QAAQ,EAAE,CAAA;AAChE,IAAA,OAAA,CAAQ,IAAA,CAAK,YAAA,CAAa,MAAM,CAAC,CAAA;AACjC,IAAA,UAAA,CAAW,IAAA;AAAA,MACT,kBAAA;AAAA,QACE,KAAA;AAAA,QACA,EAAA;AAAA,QACA,iBAAiB,MAAM,CAAA;AAAA,QACvB,GAAA;AAAA,QACA,gBAAA,CAAiB,QAAQ,aAAa,CAAA;AAAA,QACtC;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAEA,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,MAAM,CAAA,IAAK,QAAA,EAAU;AACnC,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,MAAA,EAAQ,OAAA,EAAS,WAAW,CAAA;AAC1D,IAAA,IAAI,CAAC,aAAA,CAAc,IAAI,CAAA,EAAG;AACxB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAMS,GAAAA,GAAK,gBAAA,CAAiB,MAAA,EAAQ,OAAA,EAAS,WAAW,CAAA;AACxD,QAAA,IAAI,aAAA,CAAcA,GAAE,CAAA,EAAG,YAAA,CAAa,QAAQA,GAAE,CAAA;AAAA,MAChD;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,aAAA,CAAc,QAAQ,IAAI,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,MAAA,EAAQ,OAAA,EAAS,WAAW,CAAA;AACxD,IAAA,IAAI,CAAC,aAAA,CAAc,EAAE,CAAA,EAAG;AACtB,MAAA,aAAA,CAAc,QAAQ,IAAI,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,OAAA,EAAS,OAAA,EAAS,QAAQ,IAAI,CAAA;AAClE,IAAA,OAAA,CAAQ,KAAK,YAAA,CAAa,MAAM,CAAA,EAAG,YAAA,CAAa,MAAM,CAAC,CAAA;AAEvD,IAAA,MAAM,YAAA,GAAe,iBAAiB,MAAM,CAAA;AAC5C,IAAA,MAAM,YAAA,GAAe,iBAAiB,MAAM,CAAA;AAC5C,IAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,MAAA,EAAQ,aAAa,CAAA;AAC1D,IAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,MAAA,EAAQ,aAAa,CAAA;AACxD,IAAA,MAAM,gBAAA,GAAmB,gBAAA,CAAiB,YAAY,CAAA,IAAK,iBAAiB,YAAY,CAAA;AACxF,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,KAAA,GAAQ,IAAA,CAAK,KAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,MAAA,GAAS,IAAA,CAAK,MAAA;AAEhC,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,MAAA,MAAM,cAAc,iBAAA,CAAkB,OAAA,EAAS,OAAA,EAAS,YAAA,EAAc,cAAc,IAAI,CAAA;AACxF,MAAA,UAAA,CAAW,IAAA;AAAA,QACT,WAAA,CAAY,OAAA;AAAA,UACV;AAAA,YACE,mBAAA,CAAoB,IAAA,EAAM,YAAA,EAAc,WAAW,CAAA;AAAA,YACnD,mBAAA,CAAoB,EAAA,EAAI,YAAA,EAAc,SAAS;AAAA,WACjD;AAAA,UACA,aAAa,KAAK;AAAA;AACpB,OACF;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,IAAA;AAAA,MACT,KAAA,CAAM,OAAA;AAAA,QACJ;AAAA,UACE;AAAA,YACE,GAAG,mBAAA,CAAoB,YAAA,EAAc,WAAA,EAAa;AAAA,cAChD,qBAAqB,CAAC;AAAA,aACvB,CAAA;AAAA,YACD,GAAG,eAAe,YAAY,CAAA;AAAA,YAC9B,WAAW,cAAA,CAAe,IAAA,EAAM,GAAG,CAAA,EAAG,cAAA,CAAe,YAAY,CAAC;AAAA,WACpE;AAAA,UACA;AAAA,YACE,GAAG,mBAAA,CAAoB,YAAA,EAAc,SAAA,EAAW;AAAA,cAC9C,qBAAqB,CAAC;AAAA,aACvB,CAAA;AAAA,YACD,GAAG,cAAA,CAAe,YAAA,EAAc,MAAA,EAAQ,MAAM,CAAA;AAAA,YAC9C,WAAW,cAAA,CAAe,EAAA,EAAI,QAAQ,MAAA,EAAQ,cAAA,CAAe,YAAY,CAAC;AAAA;AAC5E,SACF;AAAA,QACA,aAAa,KAAK;AAAA,OACpB;AAAA,MACA,GAAG,mCAAA,CAAoC,KAAA,EAAO,MAAA,EAAQ,QAAQ,KAAK;AAAA,KACrE;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,MAAM,CAAA,IAAK,QAAA,EAAU;AACnC,IAAA,IAAI,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AACtB,IAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,MAAA,EAAQ,OAAA,EAAS,WAAW,CAAA;AACxD,IAAA,IAAI,CAAC,aAAA,CAAc,EAAE,CAAA,EAAG;AACxB,IAAA,YAAA,CAAa,QAAQ,EAAE,CAAA;AAAA,EACzB;AAEA,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAA,CAAQ,MAAA,EAAO;AAE5C,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,SAAS,MAAM;AACb,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,KAAA,MAAW,EAAA,IAAM,SAAS,EAAA,EAAG;AAC7B,MAAA,OAAA,CAAQ,MAAA,EAAO;AAAA,IACjB;AAAA,GACF;AACF;AAOO,SAAS,oBAAA,CAAqB;AAAA,EACnC,MAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA,GAAiB;AACnB,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIN,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAwB,IAAI,CAAA;AAC5D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAoB,SAAS,CAAA;AAE/D,EAAA,MAAM,UAAA,GAAaF,OAA8B,IAAI,CAAA;AACrD,EAAA,MAAM,gBAAA,GAAmBA,OAA8B,IAAI,CAAA;AAC3D,EAAA,MAAM,gBAAA,GAAmBA,OAA8B,IAAI,CAAA;AAC3D,EAAA,MAAM,aAAA,GAAgBA,MAAAA,CAAoB,EAAE,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAaA,OAA4B,IAAI,CAAA;AACnD,EAAA,MAAM,UAAA,GAAaA,OAAO,OAAO,CAAA;AACjC,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAErB,EAAAI,UAAU,MAAM;AACd,IAAA,IAAI,KAAA,KAAU,WAAW,OAAA,EAAS;AAElC,IAAA,MAAM,OAAO,UAAA,CAAW,OAAA;AACxB,IAAA,MAAM,IAAA,GAAO,KAAA;AAIb,IAAA,KAAA,MAAW,SAAA,IAAa,cAAc,OAAA,EAAS;AAC7C,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,MAAA,EAAO;AAAA,MACnB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,aAAA,CAAc,UAAU,EAAC;AACzB,IAAA,UAAA,CAAW,OAAA,IAAU;AACrB,IAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAErB,IAAA,IAAI,QAAA,IAAY,CAAC,WAAA,CAAY,IAAI,CAAA,EAAG;AAClC,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,IAAA,GAAO,IAAA,GAAO,SAAA,GAAY,UAAU,CAAA;AACjD,IAAA,WAAA,CAAY,IAAI,CAAA;AAChB,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA,EAAG,CAAC,KAAA,EAAO,WAAA,EAAa,QAAQ,CAAC,CAAA;AAEjC,EAAAE,gBAAgB,MAAM;AACpB,IAAA,IAAI,aAAa,IAAA,EAAM;AAEvB,IAAA,MAAM,UAAA,GAAa,YAAY,OAAO,CAAA;AACtC,IAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,IAAA,MAAM,MAAM,gBAAA,CAAiB,OAAA;AAC7B,IAAA,MAAM,MAAM,gBAAA,CAAiB,OAAA;AAC7B,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,WAAW,CAAC,GAAA,IAAO,CAAC,GAAA,EAAK;AAC3C,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,QAAQ,QAAA,GAAW,SAAA;AAC3B,IAAA,OAAA,CAAQ,MAAM,WAAA,CAAY,aAAA,EAAe,SAAA,KAAc,SAAA,GAAY,MAAM,IAAI,CAAA;AAE7E,IAAA,MAAM,MAAA,GAAS,WAAW,MAAA,IAAU,cAAA;AACpC,IAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAM5B,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,UAAA,CAAW,KAAA,EAAO,UAAU,MAAM,CAAA;AAClE,IAAA,MAAM,WAAW,UAAA,GAAa,kBAAA,CAAmB,SAAS,GAAA,EAAK,GAAA,EAAK,UAAU,CAAA,GAAI,IAAA;AAElF,IAAA,MAAM,aAA0B,EAAC;AACjC,IAAA,MAAM,gBAAgB,QAAA,CAAS,GAAA,EAAK,UAAA,CAAW,IAAA,EAAM,UAAU,MAAM,CAAA;AACrE,IAAA,MAAM,iBAAiB,QAAA,CAAS,GAAA,EAAK,UAAA,CAAW,KAAA,EAAO,UAAU,MAAM,CAAA;AACvE,IAAA,IAAI,aAAA,EAAe,UAAA,CAAW,IAAA,CAAK,aAAa,CAAA;AAChD,IAAA,IAAI,cAAA,EAAgB,UAAA,CAAW,IAAA,CAAK,cAAc,CAAA;AAElD,IAAA,MAAM,WAA8B,EAAC;AACrC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,UAAA,CAAW,IAAA,CAAK,GAAG,QAAA,CAAS,UAAU,CAAA;AACtC,MAAA,QAAA,CAAS,IAAA,CAAK,SAAS,OAAO,CAAA;AAG9B,MAAA,IAAI,CAAC,aAAA,IAAiB,QAAA,CAAS,UAAA,CAAW,MAAA,GAAS,GAAG,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IACvF;AACA,IAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AAExB,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,KAAA,MAAW,EAAA,IAAM,UAAU,EAAA,EAAG;AAC9B,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,KAAA,MAAW,EAAA,IAAM,UAAU,EAAA,EAAG;AAC9B,MAAA,IAAI,UAAA,CAAW,OAAA,KAAY,OAAA,EAAS,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IAC3D,CAAA;AACA,IAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AAErB,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAC,CAAA,CAC1C,IAAA,CAAK,MAAM;AACV,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,OAAA,EAAQ;AACR,MAAA,aAAA,CAAc,UAAU,EAAC;AACzB,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAEb,CAAC,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,GAAG,CAAC,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,WAAW,CAAC,CAAA;AAE9C,EAAAF,UAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,KAAA,MAAW,SAAA,IAAa,cAAc,OAAA,EAAS;AAC7C,QAAA,IAAI;AACF,UAAA,SAAA,CAAU,MAAA,EAAO;AAAA,QACnB,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA,aAAA,CAAc,UAAU,EAAC;AACzB,MAAA,UAAA,CAAW,OAAA,IAAU;AACrB,MAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,IACvB,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAQ,MAAA,CAAO,MAAA;AACrB,EAAA,MAAM,YAAA,GAAe,OAAO,OAAO,CAAA;AACnC,EAAA,MAAM,aAAA,GAAgB,QAAA,KAAa,IAAA,GAAO,MAAA,CAAO,QAAQ,CAAA,GAAI,IAAA;AAK7D,EAAA,MAAM,sBAAA,GACJ,cAAA,KAAmB,UAAA,GAAa,SAAA,GAAY,UAAA;AAE9C,EAAA,MAAM,qBAAA,GAAwBJ,OAA8B,IAAI,CAAA;AAChE,EAAA,MAAM,gBAAgB,iBAAA,IAAqB,qBAAA;AAE3C,EAAA,uBACEG,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,MAAA,EAAQ,MAAA;AAAA,QACR,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EAAY;AAAA,OACd;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,aAAA,IAAiB,QAAA,KAAa,uBAC7BJ,GAAAA,CAAC,SAAI,GAAA,EAAK,gBAAA,EAAkB,OAAO,EAAE,QAAA,EAAU,YAAY,KAAA,EAAO,CAAA,IAChE,QAAA,kBAAAA,GAAAA,CAAC,uBAAoB,KAAA,EAAO,QAAA,EAAU,OACpC,QAAA,kBAAAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAe,KAAA;AAAA,YACf,cAAA,EAAgB,sBAAA;AAAA,YAChB,aAAA;AAAA,YAEC,QAAA,EAAA;AAAA;AAAA,SACH,EACF,GACF,CAAA,GACE,IAAA;AAAA,QACH,YAAA,mBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,gBAAA,EAAkB,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,CAAA,EAAE,EAClE,QAAA,kBAAAA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,KAAA,EAAO,OAAA,EAAS,KAAA,EACnC,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,aAAA,EAAa,IAAA,EAAC,cAAA,EAAgC,aAAA,EACrD,QAAA,EAAA,YAAA,EACH,CAAA,EACF,GACF,CAAA,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;AC3zBA,IAAM,WAAA,GACJ,kMAAA;AAaK,SAAS,WAAA,CAAmC;AAAA,EACjD,GAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,SAAA,GAAY,GAAA;AAAA,EACZ,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAAK,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,OAAA,EAAS;AAErB,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAsB;AACrC,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,gBAAA,EAAkB;AAClD,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,MAAA,IAAI,MAAA,YAAkB,OAAA,IAAW,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE9D,MAAA,IAAI,MAAA,CAAO,YAAA,EAAa,EAAG,QAAA,EAAS,EAAG;AAEvC,MAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,MAAA,IAAI,IAAA,CAAK,UAAU,CAAA,EAAG;AACtB,MAAA,MAAM,CAAA,GAAA,CAAK,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAC7C,MAAA,IAAI,IAAI,SAAA,EAAW;AACjB,QAAa,MAAA,EAAO;AAAA,MACtB,CAAA,MAAA,IAAW,CAAA,GAAI,CAAA,GAAI,SAAA,EAAW;AAC5B,QAAa,MAAA,EAAO;AAAA,MACtB;AAAA,IACF,CAAA;AAEA,IAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACpC,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,GAAA,EAAK,OAAA,EAAS,WAAW,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAC,CAAA;AAChE;ACfO,SAAS,KAAA,CAAM,EAAE,QAAA,EAAS,EAAe;AAC9C,EAAA,uBAAOL,GAAAA,CAAAU,QAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB;AACA,KAAA,CAAM,WAAA,GAAc,OAAA;AAsBpB,SAAS,cAAc,QAAA,EAGrB;AACA,EAAA,MAAM,SAAyB,EAAC;AAChC,EAAA,MAAM,cAA+C,EAAC;AACtD,EAAA,KAAA,MAAW,KAAA,IAASC,QAAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC9C,IAAA,IAAI,CAACC,cAAAA,CAAe,KAAK,CAAA,IAAK,KAAA,CAAM,SAAS,KAAA,EAAO;AACpD,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,IAAA,WAAA,CAAY,IAAA,CAAM,KAAA,CAAM,KAAA,CAAqB,UAAU,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,EAAE,QAAQ,WAAA,EAAY;AAC/B;AAMA,SAAS,iBAAA,GAA6B;AACpC,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,KAAA;AAC5C,EAAA,OAAO,SAAS,iBAAA,KAAsB,IAAA;AACxC;AAGA,SAAS,iBAAA,GAA4B;AACnC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,QAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,CAAS,QAAA,CAAS,MAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAChE,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,QAAA;AACpC;AAQO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,UAAA;AAAA;AAAA;AAAA,EAGA,OAAO,CAAC,QAAA;AAAA,EACR;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,EAAE,MAAA,EAAQ,WAAA,EAAY,GAAIV,OAAAA,CAAQ,MAAM,aAAA,CAAc,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AACjF,EAAA,MAAM,QAAQ,MAAA,CAAO,MAAA;AAKrB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,cAAA,CAAuB,KAAK,CAAC,CAAA;AACrD,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAK,KAAA,CAAM,IAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,EAAG,IAAA,CAAK,IAAI,KAAA,GAAQ,CAAA,EAAG,CAAC,CAAC,CAAA;AAKhF,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,cAAA,CAAwB,QAAQ,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIC,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,aAAa,CAAA,GAAIA,QAAAA,CAAS,iBAAiB,CAAA;AAElD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAyB,MAAM,CAAA;AAC3E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAoC,IAAI,CAAA;AAC1E,EAAA,MAAM,iBAAA,GAAoBF,OAA8B,IAAI,CAAA;AAC5D,EAAA,MAAM,WAAA,GAAcA,OAAuB,IAAI,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAWA,OAAuB,IAAI,CAAA;AAG5C,EAAA,MAAM,eAAe,uBAAA,EAAwB;AAE7C,EAAA,MAAM,IAAA,GAAOY,WAAAA;AAAA,IACX,CAAC,MAAc,SAAA,KAA8B;AAC3C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,CAAA,EAAG,CAAC,CAAC,CAAA;AAClE,MAAA,iBAAA,CAAkB,SAAS,CAAA;AAC3B,MAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,CAAC,SAAS,KAAK;AAAA,GACjB;AAIA,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,IAAI,iBAAA,CAAkB,OAAA,EAAS,OAAA,EAAQ,EAAG;AAC1C,IAAA,IAAI,QAAQ,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,KAAA,GAAQ,GAAG,SAAS,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,IAAA,EAAM,KAAA,EAAO,KAAK,CAAC,CAAA;AAEvB,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,IAAI,iBAAA,CAAkB,OAAA,EAAS,OAAA,EAAQ,EAAG;AAC1C,IAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,KAAA,GAAQ,GAAG,UAAU,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAEhB,EAAA,MAAM,UAAA,GAAaA,WAAAA,CAAY,MAAM,WAAA,CAAY,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhF,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,IAAA,MAAM,KAAK,WAAA,CAAY,OAAA;AACvB,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,iBAAA,EAAkB,EAAG;AAGjC,IAAA,IAAI,SAAS,iBAAA,EAAmB,QAAA,CAAS,cAAA,EAAe,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,SACnE,EAAA,CAAG,iBAAA,IAAoB,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAC9C,CAAA,EAAG,EAAE,CAAA;AAKL,EAAAR,UAAU,MAAM;AACd,IAAA,MAAM,WAAW,MAAM,eAAA,CAAgB,QAAA,CAAS,iBAAA,KAAsB,YAAY,OAAO,CAAA;AACzF,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,QAAQ,CAAA;AACtD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,kBAAA,EAAoB,QAAQ,CAAA;AAAA,EACxE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyB;AAC1C,MAAA,IAAI,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA,EAAG;AAClC,MAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACvB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,MAAA,EAAO;AACP,QAAA;AAAA,MACF;AACA,MAAA,IAAI,aAAA,CAAc,KAAK,CAAA,EAAG;AACxB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,MAAA,EAAO;AACP,QAAA;AAAA,MACF;AACA,MAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACxB,MAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,EAAQ;AACxB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,IAAA,CAAK,GAAG,MAAM,CAAA;AACd,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,QAAQ,KAAA,EAAO;AACvB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,IAAA,CAAK,KAAA,GAAQ,GAAG,MAAM,CAAA;AACtB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,GAAA,IAAO,KAAA,CAAM,QAAQ,GAAA,EAAK;AAC1C,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,gBAAA,EAAiB;AACjB,QAAA;AAAA,MACF;AACA,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,GAAA,IAAO,KAAA,CAAM,QAAQ,GAAA,EAAK;AAC1C,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,UAAA,EAAW;AACX,QAAA;AAAA,MACF;AAIA,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,IAAY,CAAC,SAAS,iBAAA,EAAmB;AACzD,QAAA,MAAA,CAAO,QAAQ,IAAA,EAAK;AAAA,MACtB;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC5C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,SAAS,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,gBAAA,EAAkB,UAAA,EAAY,KAAK,CAAC,CAAA;AAE9D,EAAA,WAAA,CAAY;AAAA;AAAA;AAAA,IAGV,GAAA,EAAK,QAAA;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ,MAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACT,CAAA;AAID,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA;AACrC,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAC/B,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAAA,IACjC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,WAAA,GAAcQ,WAAAA;AAAA,IAClB,CAAC,IAAA,KAAiB,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAAA,IACnC,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,MAAM,QAAA,GAAWA,YAAY,YAAY;AACvC,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,IAAI;AACF,MAAA,MAAM,gBAAA,CAAiB;AAAA,QACrB,MAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA,EAAU,cAAc,iBAAA,EAAkB;AAAA,QAC1C,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,SAAA,EAAW,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAC,CAAA;AAEzC,EAAA,MAAM,SAAA,GAAY,eAAe,KAAK,CAAA;AAItC,EAAA,MAAM,QAAA,GAAW,YAAY,CAAC,YAAA;AAE9B,EAAA,uBACEb,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,WAAA;AAAA,MACL,iBAAA,EAAgB,EAAA;AAAA,MAChB,KAAA,EACE,QAAA,GACI,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAa,QAAA,EAAU,UAAA,EAAY,iBAAA,EAAkB,GAC5F;AAAA,QACE,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,UAAA,EAAY,iBAAA;AAAA,QACZ,GAAG;AAAA,OACL;AAAA,MAGN,QAAA,kBAAAI,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO,EAC1D,QAAA,EAAA;AAAA,QAAA,QAAA,mBACCJ,IAAC,SAAA,EAAA,EAAU,MAAA,EAAgB,OAAc,QAAA,EAAU,WAAA,EAAa,WAAsB,CAAA,GACpF,IAAA;AAAA,wBAGJI,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,GAAE,EAC/E,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EACX,QAAA,kBAAAA,GAAAA;AAAA,YAAC,oBAAA;AAAA,YAAA;AAAA,cACC,MAAA;AAAA,cACA,WAAA;AAAA,cACA,KAAA;AAAA,cACA,QAAA,EAAU,YAAA;AAAA,cACV,iBAAA;AAAA,cACA;AAAA;AAAA,WACF,EACF,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,SAAS,KAAA,GAAQ,CAAA;AAAA,cACjB,KAAA;AAAA,cACA,MAAA,EAAQ,MAAA;AAAA,cACR,MAAA,EAAQ,MAAA;AAAA,cACR,YAAA,EAAc,gBAAA;AAAA,cACd,aAAA;AAAA,cACA,QAAA;AAAA,cACA,cAAA,EAAgB,SAAA;AAAA,cAChB,QAAA;AAAA,cACA,YAAA,EAAc,UAAA;AAAA,cACd;AAAA;AAAA;AACF,SAAA,EACF;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;AACA,SAAA,CAAU,WAAA,GAAc,WAAA;ACnSjB,SAAS,aAAa,EAAE,EAAA,EAAI,QAAA,EAAU,SAAA,EAAW,OAAM,EAAsB;AAClF,EAAA,MAAM,QAAQW,QAAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AAE/C,EAAA,IACEA,QAAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,KAAM,CAAA,IAC7BC,cAAAA,CAAgC,KAAK,CAAA,IACrC,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,EACtB;AACA,IAAA,OAAOE,aAAa,KAAA,EAAwC;AAAA,MAC1D,kBAAA,EAAoB,EAAA;AAAA,MACpB,SAAA,EAAW,CAAC,KAAA,CAAM,KAAA,CAAM,SAAA,EAAW,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AAAA,MAC3E,KAAA,EAAO,KAAA,GAAQ,EAAE,GAAG,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,GAAG,KAAA,EAAM,GAAI,KAAA,CAAM,KAAA,CAAM;AAAA,KACjE,CAAA;AAAA,EACH;AAEA,EAAA,uBACEd,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAsB,KAAA,EAAc,kBAAA,EAAkB,IACxD,QAAA,EACH,CAAA;AAEJ","file":"index.js","sourcesContent":["/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/sdk.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: kept only the canvas dimensions; the slide-module types\n * around them describe open-slide's own file layout, which\n * Vantage replaces with `<SlideDeck>` children.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\n\n/**\n * Every slide is authored against this fixed canvas and scaled to fit the\n * viewport. A fixed pixel canvas is what makes a deck look identical on a\n * laptop, a projector and in the exported pptx — the alternative, responsive\n * layout, means a deck that reflows differently everywhere it is shown.\n */\nexport const CANVAS_WIDTH = 1920\nexport const CANVAS_HEIGHT = 1080\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/components/slide-canvas.tsx\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: Tailwind classes and `cn` replaced with inline styles (the\n * slide runtime emits no utility classes, so a deck looks the\n * same whatever the app's Tailwind content scan picked up);\n * `--osd-*` renamed to `--slide-*`; the chrome-only `flat`,\n * `center` and `freezeMotion` props dropped.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport { useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode } from \"react\"\nimport { CANVAS_HEIGHT, CANVAS_WIDTH } from \"./constants\"\n\nexport interface SlideCanvasProps {\n children: ReactNode\n /** Use this scale instead of fitting to the container (used by thumbnails). */\n scale?: number\n /** Custom properties applied to both the frame and the canvas. */\n themeVars?: CSSProperties\n}\n\n/**\n * The fixed 1920×1080 canvas, scaled to fit whatever box it is given. Slides\n * are authored in canvas pixels and never reflow — resizing the window changes\n * the scale, not the layout.\n */\nexport function SlideCanvas({ children, scale, themeVars }: SlideCanvasProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const [fitScale, setFitScale] = useState<number | null>(null)\n\n useLayoutEffect(() => {\n if (scale !== undefined) return\n const el = containerRef.current\n if (!el) return\n const measure = () => {\n const { width, height } = el.getBoundingClientRect()\n if (width === 0 || height === 0) return\n setFitScale(Math.min(width / CANVAS_WIDTH, height / CANVAS_HEIGHT))\n }\n // Measured synchronously before paint, so the fitted scale lands on the\n // first visible frame — with `useEffect` the canvas flashes at full size.\n measure()\n const observer = new ResizeObserver(measure)\n observer.observe(el)\n return () => observer.disconnect()\n }, [scale])\n\n const measured = scale ?? fitScale\n const s = measured ?? 1\n\n return (\n <div ref={containerRef} style={{ position: \"relative\", height: \"100%\", width: \"100%\" }}>\n <div\n style={{\n position: \"absolute\",\n left: \"50%\",\n top: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: CANVAS_WIDTH * s,\n height: CANVAS_HEIGHT * s,\n overflow: \"hidden\",\n background: \"var(--slide-bg)\",\n color: \"var(--slide-fg)\",\n // Hidden until measured — the same flash the layout effect avoids,\n // for the frame this time.\n visibility: measured === null ? \"hidden\" : undefined,\n ...themeVars,\n }}\n >\n <div\n data-slide-canvas=\"\"\n style={{\n width: CANVAS_WIDTH,\n height: CANVAS_HEIGHT,\n transform: `scale(${s})`,\n transformOrigin: \"top left\",\n fontFamily: \"var(--slide-font-body)\",\n fontSize: \"var(--slide-size-body)\",\n ...themeVars,\n }}\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/dom.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: dropped `dragHasFiles` (only the authoring IDE's drop zones\n * used it, and Vantage ports no authoring surface).\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function nextFrame(): Promise<void> {\n return new Promise((resolve) => requestAnimationFrame(() => resolve()))\n}\n\n/** rAF in a real tab; a timeout fallback for hidden or throttled ones. */\nexport function nextPaint(): Promise<void> {\n return new Promise((resolve) => {\n let settled = false\n const settle = () => {\n if (settled) return\n settled = true\n resolve()\n }\n requestAnimationFrame(settle)\n setTimeout(settle, 50)\n })\n}\n\nexport function downloadBlob(blob: Blob, filename: string): void {\n const url = URL.createObjectURL(blob)\n const a = document.createElement(\"a\")\n a.href = url\n a.download = filename\n a.rel = \"noopener\"\n document.body.appendChild(a)\n a.click()\n a.remove()\n setTimeout(() => URL.revokeObjectURL(url), 0)\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/print-ready.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: none of substance.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport { nextFrame } from \"./dom\"\n\nconst DEFAULT_WAITFOR_TIMEOUT_MS = 10_000\n\n/**\n * `document.fonts.ready` already waits for every face CSS actually asked for.\n * Never call `face.load()` on the rest: unloaded faces were never requested,\n * and `load()` ignores `unicode-range` — so a subsetted CJK family (hundreds\n * of faces) would be force-downloaded whole and hang or crash the tab.\n */\nexport async function waitForFonts(): Promise<void> {\n if (!(\"fonts\" in document)) return\n await document.fonts.ready\n}\n\n/**\n * Wait for anything a slide marked with `data-waitfor=\"<selector>\"` to appear.\n * A chart that draws into a canvas is the usual case: without this the capture\n * happens before the canvas exists and the slide exports blank.\n */\nexport async function waitForDataWaitfor(\n root: HTMLElement,\n timeoutMs = DEFAULT_WAITFOR_TIMEOUT_MS,\n): Promise<void> {\n const targets = Array.from(root.querySelectorAll<HTMLElement>(\"[data-waitfor]\"))\n if (targets.length === 0) return\n const deadline = performance.now() + timeoutMs\n await Promise.all(\n targets.map(async (el) => {\n const selector = el.getAttribute(\"data-waitfor\")\n if (!selector) return\n while (performance.now() < deadline) {\n try {\n if (el.querySelector(selector)) return\n } catch {\n return // invalid selector — skip rather than hang\n }\n await nextFrame()\n }\n }),\n )\n}\n\n/** Whether every finite animation inside a frame has finished playing. */\nexport function isFrameAnimationSettled(frame: Element): boolean {\n if (typeof document.getAnimations !== \"function\") return true\n for (const animation of document.getAnimations()) {\n const effect = animation.effect as KeyframeEffect | null\n if (!effect) continue\n const target = effect.target\n if (!target || !frame.contains(target)) continue\n // A looping animation never finishes; waiting on it would always time out.\n if (effect.getComputedTiming().iterations === Infinity) continue\n if (animation.playState !== \"finished\") return false\n }\n return true\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/page-context.tsx\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: `useSlidePageNumber` renamed to `useSlideNumber`; returns 0\n * of 0 outside a deck instead of throwing, so a slide can be\n * previewed on its own; the globalThis context trick dropped\n * (tsup's shared chunk already gives the whole framework one\n * module instance — the same property `router/registry` rests\n * on).\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport { createContext, useContext, useMemo, type PropsWithChildren } from \"react\"\n\ninterface SlideNumberContextValue {\n index: number\n total: number\n}\n\nconst SlideNumberContext = createContext<SlideNumberContextValue | null>(null)\n\nexport function SlideNumberProvider({\n index,\n total,\n children,\n}: PropsWithChildren<{ index: number; total: number }>) {\n const value = useMemo(() => ({ index, total }), [index, total])\n return <SlideNumberContext.Provider value={value}>{children}</SlideNumberContext.Provider>\n}\n\n/**\n * \"Slide 3 of 12\", for a page-number footer. 1-based, because that is what\n * goes on the slide. Outside a deck it reports 0 of 0 rather than throwing —\n * a slide body should stay renderable in isolation.\n */\nexport function useSlideNumber(): { current: number; total: number } {\n const ctx = useContext(SlideNumberContext)\n if (!ctx) return { current: 0, total: 0 }\n return { current: ctx.index + 1, total: ctx.total }\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/design.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: `--osd-*` renamed to `--slide-*`; every field made optional\n * so an omitted token falls through to theme.css instead of a\n * hard-coded default (that is what keeps a deck following the\n * app's palette and its light/dark switch).\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport type { CSSProperties } from \"react\"\nimport type { SlideTheme } from \"./types\"\n\n/**\n * A deck's theme as inline custom properties. Only the keys the deck actually\n * set are emitted — the rest resolve up the cascade to `theme.css`, where\n * `--slide-*` alias the app's own tokens and therefore follow `.dark` on their\n * own. Writing defaults here instead would freeze every deck to light.\n */\nexport function themeToCssVars(theme: SlideTheme | undefined): CSSProperties | undefined {\n if (!theme) return undefined\n const vars: Record<string, string> = {}\n if (theme.bg) vars[\"--slide-bg\"] = theme.bg\n if (theme.fg) vars[\"--slide-fg\"] = theme.fg\n if (theme.accent) vars[\"--slide-accent\"] = theme.accent\n if (theme.muted) vars[\"--slide-muted\"] = theme.muted\n if (theme.fontDisplay) vars[\"--slide-font-display\"] = theme.fontDisplay\n if (theme.fontBody) vars[\"--slide-font-body\"] = theme.fontBody\n if (theme.sizeHero !== undefined) vars[\"--slide-size-hero\"] = `${theme.sizeHero}px`\n if (theme.sizeBody !== undefined) vars[\"--slide-size-body\"] = `${theme.sizeBody}px`\n if (theme.radius !== undefined) vars[\"--slide-radius\"] = `${theme.radius}px`\n return Object.keys(vars).length > 0 ? (vars as CSSProperties) : undefined\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/export-pptx.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: takes rendered elements instead of a slide module;\n * `designToCssVars` replaced with `themeToCssVars`;\n * `getFontEmbedCSS` is computed once for the whole deck\n * rather than per page; `--osd-*`/`data-osd-*` renamed.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport { createElement, type ReactElement } from \"react\"\nimport { createRoot, type Root } from \"react-dom/client\"\nimport { CANVAS_HEIGHT, CANVAS_WIDTH } from \"./constants\"\nimport { downloadBlob, nextPaint, sleep } from \"./dom\"\nimport { isFrameAnimationSettled, waitForDataWaitfor, waitForFonts } from \"./print-ready\"\nimport { SlideNumberProvider } from \"./slide-context\"\nimport { themeToCssVars } from \"./theme\"\nimport type { SlideTheme } from \"./types\"\n\n/** 16:9 widescreen in English Metric Units (914400 per inch -> 13.333in x 7.5in). */\nconst EMU_W = 12192000\nconst EMU_H = 6858000\n/** 2x the canvas: 3840x2160, which still looks sharp projected. */\nconst CAPTURE_PIXEL_RATIO = 2\n\nconst ANIMATION_TIMEOUT_MS = 15_000\nconst POLL_INTERVAL_MS = 100\n\nconst CAPTURE_CLASS = \"vantage-slide-capture\"\n\n/**\n * Properties an intro animation drives from a hidden start state to a visible\n * end state. They are read back once settled and pinned inline so the capture\n * clone cannot replay the keyframes from their invisible 0% frame.\n */\nconst FROZEN_PROPS = [\"opacity\", \"transform\", \"filter\", \"clip-path\"] as const\n\nexport interface PptxExportProgress {\n phase: \"processing\" | \"generating\" | \"done\"\n /** Slides captured so far (0..total). */\n current: number\n total: number\n /** 0-95 while capturing, 98 while assembling, 100 when done. */\n percent: number\n}\n\nexport interface ExportDeckOptions {\n slides: ReactElement[]\n /** Base name of the downloaded file, without the extension. */\n fileName: string\n theme?: SlideTheme\n onProgress?: (progress: PptxExportProgress) => void\n}\n\n/**\n * Render every slide offscreen, rasterise it, and pack the images into a pptx.\n *\n * The deck is exported as pictures, not text. That is a deliberate trade: the\n * result is not searchable or editable, but it needs no font on the receiving\n * machine and reproduces the slide exactly — including Japanese, which is the\n * case that breaks text-based exporters. It also keeps the whole thing in the\n * browser: no Chromium, no Lambda, nothing to operate.\n */\nexport async function exportDeckAsPptx({\n slides,\n fileName,\n theme,\n onProgress,\n}: ExportDeckOptions): Promise<void> {\n if (slides.length === 0) return\n\n const total = slides.length\n onProgress?.({ phase: \"processing\", current: 0, total, percent: 0 })\n\n const container = document.createElement(\"div\")\n container.className = CAPTURE_CLASS\n container.setAttribute(\"aria-hidden\", \"true\")\n Object.assign(container.style, {\n position: \"fixed\",\n left: \"-99999px\",\n top: \"0\",\n pointerEvents: \"none\",\n })\n document.body.appendChild(container)\n\n // html-to-image clones each frame and copies its computed style — including\n // the intro animation — into the clone, which then replays the keyframes\n // from their hidden 0% frame inside the rasterised SVG. Fast-forwarding\n // every animation to its end frame in the live DOM is what stops the export\n // coming out as blank pages. A large negative delay lands past a 1ms\n // duration, so even pseudo-elements paint their final state immediately.\n const captureStyle = document.createElement(\"style\")\n captureStyle.textContent = `.${CAPTURE_CLASS} *, .${CAPTURE_CLASS} *::before, .${CAPTURE_CLASS} *::after {\n animation-delay: -1s !important;\n animation-duration: 1ms !important;\n animation-iteration-count: 1 !important;\n animation-fill-mode: forwards !important;\n transition: none !important;\n }`\n document.head.appendChild(captureStyle)\n\n const themeVars = themeToCssVars(theme)\n const roots: Root[] = []\n const frames: HTMLElement[] = []\n\n for (let i = 0; i < slides.length; i++) {\n const slide = slides[i]\n if (!slide) continue\n const host = document.createElement(\"div\")\n host.setAttribute(\"data-slide-canvas\", \"\")\n Object.assign(host.style, {\n width: `${CANVAS_WIDTH}px`,\n height: `${CANVAS_HEIGHT}px`,\n overflow: \"hidden\",\n background: \"var(--slide-bg)\",\n color: \"var(--slide-fg)\",\n fontFamily: \"var(--slide-font-body)\",\n fontSize: \"var(--slide-size-body)\",\n })\n if (themeVars) {\n for (const [key, value] of Object.entries(themeVars)) {\n host.style.setProperty(key, String(value))\n }\n }\n container.appendChild(host)\n frames.push(host)\n const root = createRoot(host)\n // No StepHost here on purpose: without one, `<Steps>` reveals everything,\n // which is the state a slide should be exported in.\n root.render(createElement(SlideNumberProvider, { index: i, total }, slide))\n roots.push(root)\n }\n\n // Yield once so React commits every slide and intro animations actually start.\n await nextPaint()\n\n try {\n await waitForFonts()\n\n const deadline = performance.now() + ANIMATION_TIMEOUT_MS\n while (performance.now() < deadline) {\n if (frames.every((frame) => isFrameAnimationSettled(frame))) break\n await sleep(POLL_INTERVAL_MS)\n }\n await waitForDataWaitfor(container)\n\n const { toBlob, getFontEmbedCSS } = await import(\"html-to-image\")\n // Resolved once for the whole deck rather than per frame: the upstream\n // per-page call re-downloads and re-encodes every webfont for each slide.\n const fontEmbedCSS = await getFontEmbedCSS(container)\n\n const images: Uint8Array[] = []\n for (let i = 0; i < frames.length; i++) {\n const frame = frames[i]!\n freezeForCapture(frame)\n const blob = await toBlob(frame, {\n width: CANVAS_WIDTH,\n height: CANVAS_HEIGHT,\n pixelRatio: CAPTURE_PIXEL_RATIO,\n fontEmbedCSS,\n cacheBust: true,\n })\n if (!blob) throw new Error(`Failed to capture slide ${i + 1}.`)\n images.push(new Uint8Array(await blob.arrayBuffer()))\n onProgress?.({\n phase: \"processing\",\n current: i + 1,\n total,\n percent: Math.min(95, ((i + 1) / total) * 95),\n })\n }\n\n onProgress?.({ phase: \"generating\", current: total, total, percent: 98 })\n const pptx = await buildImagePptx(images)\n downloadBlob(\n new Blob([pptx as BlobPart], {\n type: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n }),\n `${fileName}.pptx`,\n )\n } finally {\n onProgress?.({ phase: \"done\", current: total, total, percent: 100 })\n for (const root of roots) root.unmount()\n container.remove()\n captureStyle.remove()\n }\n}\n\n/**\n * Pin each element's settled visual state inline and drop its animation, so\n * the clone html-to-image rasterises renders the final frame instead of\n * replaying the (initially invisible) keyframes. Pseudo-elements are covered\n * by the capture stylesheet instead, which cannot be reached from script.\n */\nfunction freezeForCapture(root: HTMLElement): void {\n for (const el of root.querySelectorAll<HTMLElement>(\"*\")) {\n const styles = getComputedStyle(el)\n for (const prop of FROZEN_PROPS) {\n el.style.setProperty(prop, styles.getPropertyValue(prop), \"important\")\n }\n el.style.setProperty(\"animation\", \"none\", \"important\")\n el.style.setProperty(\"transition\", \"none\", \"important\")\n }\n}\n\nconst XML_DECL = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n'\nconst REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\"\nconst OD_REL = \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n\n/*\n * ---------------------------------------------------------------------------\n * Minimal PresentationML, ported verbatim from open-slide. One full-bleed\n * picture per slide is all the format has to carry, which is why this is a few\n * hundred bytes of string templates and a zip rather than a pptx library —\n * pptxgenjs would add ~1 MB of text and shape authoring that never runs.\n * ---------------------------------------------------------------------------\n */\nasync function buildImagePptx(images: Uint8Array[]): Promise<Uint8Array> {\n const { zipSync, strToU8 } = await import(\"fflate\")\n const n = images.length\n const files: Record<string, Uint8Array> = {}\n\n files[\"[Content_Types].xml\"] = strToU8(contentTypesXml(n))\n files[\"_rels/.rels\"] = strToU8(rootRelsXml())\n files[\"ppt/presentation.xml\"] = strToU8(presentationXml(n))\n files[\"ppt/_rels/presentation.xml.rels\"] = strToU8(presentationRelsXml(n))\n files[\"ppt/presProps.xml\"] = strToU8(presPropsXml())\n files[\"ppt/theme/theme1.xml\"] = strToU8(themeXml())\n files[\"ppt/slideMasters/slideMaster1.xml\"] = strToU8(slideMasterXml())\n files[\"ppt/slideMasters/_rels/slideMaster1.xml.rels\"] = strToU8(slideMasterRelsXml())\n files[\"ppt/slideLayouts/slideLayout1.xml\"] = strToU8(slideLayoutXml())\n files[\"ppt/slideLayouts/_rels/slideLayout1.xml.rels\"] = strToU8(slideLayoutRelsXml())\n\n for (let i = 0; i < n; i++) {\n const image = images[i]\n if (!image) continue\n const idx = i + 1\n files[`ppt/slides/slide${idx}.xml`] = strToU8(slideXml())\n files[`ppt/slides/_rels/slide${idx}.xml.rels`] = strToU8(slideRelsXml(idx))\n files[`ppt/media/image${idx}.png`] = image\n }\n\n return zipSync(files)\n}\n\nfunction contentTypesXml(n: number): string {\n const slideOverrides = Array.from(\n { length: n },\n (_, i) =>\n `<Override PartName=\"/ppt/slides/slide${i + 1}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slide+xml\"/>`,\n ).join(\"\")\n return `${XML_DECL}<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/><Default Extension=\"png\" ContentType=\"image/png\"/><Override PartName=\"/ppt/presentation.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml\"/><Override PartName=\"/ppt/presProps.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.presProps+xml\"/><Override PartName=\"/ppt/slideMasters/slideMaster1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml\"/><Override PartName=\"/ppt/slideLayouts/slideLayout1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml\"/><Override PartName=\"/ppt/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/>${slideOverrides}</Types>`\n}\n\nfunction rootRelsXml(): string {\n return `${XML_DECL}<Relationships xmlns=\"${REL_NS}\"><Relationship Id=\"rId1\" Type=\"${OD_REL}/officeDocument\" Target=\"ppt/presentation.xml\"/></Relationships>`\n}\n\nfunction presentationXml(n: number): string {\n const sldIds = Array.from(\n { length: n },\n (_, i) => `<p:sldId id=\"${256 + i}\" r:id=\"rId${i + 3}\"/>`,\n ).join(\"\")\n return `${XML_DECL}<p:presentation xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"${OD_REL}\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\"><p:sldMasterIdLst><p:sldMasterId id=\"2147483648\" r:id=\"rId1\"/></p:sldMasterIdLst><p:sldIdLst>${sldIds}</p:sldIdLst><p:sldSz cx=\"${EMU_W}\" cy=\"${EMU_H}\"/><p:notesSz cx=\"6858000\" cy=\"9144000\"/></p:presentation>`\n}\n\nfunction presentationRelsXml(n: number): string {\n const rels = [\n `<Relationship Id=\"rId1\" Type=\"${OD_REL}/slideMaster\" Target=\"slideMasters/slideMaster1.xml\"/>`,\n `<Relationship Id=\"rId2\" Type=\"${OD_REL}/presProps\" Target=\"presProps.xml\"/>`,\n ]\n for (let i = 0; i < n; i++) {\n rels.push(\n `<Relationship Id=\"rId${i + 3}\" Type=\"${OD_REL}/slide\" Target=\"slides/slide${i + 1}.xml\"/>`,\n )\n }\n return `${XML_DECL}<Relationships xmlns=\"${REL_NS}\">${rels.join(\"\")}</Relationships>`\n}\n\nfunction presPropsXml(): string {\n return `${XML_DECL}<p:presentationPr xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"${OD_REL}\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\"/>`\n}\n\nfunction slideMasterXml(): string {\n return `${XML_DECL}<p:sldMaster xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"${OD_REL}\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr></p:spTree></p:cSld><p:clrMap bg1=\"lt1\" tx1=\"dk1\" bg2=\"lt2\" tx2=\"dk2\" accent1=\"accent1\" accent2=\"accent2\" accent3=\"accent3\" accent4=\"accent4\" accent5=\"accent5\" accent6=\"accent6\" hlink=\"hlink\" folHlink=\"folHlink\"/><p:sldLayoutIdLst><p:sldLayoutId id=\"2147483649\" r:id=\"rId1\"/></p:sldLayoutIdLst></p:sldMaster>`\n}\n\nfunction slideMasterRelsXml(): string {\n return `${XML_DECL}<Relationships xmlns=\"${REL_NS}\"><Relationship Id=\"rId1\" Type=\"${OD_REL}/slideLayout\" Target=\"../slideLayouts/slideLayout1.xml\"/><Relationship Id=\"rId2\" Type=\"${OD_REL}/theme\" Target=\"../theme/theme1.xml\"/></Relationships>`\n}\n\nfunction slideLayoutXml(): string {\n return `${XML_DECL}<p:sldLayout xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"${OD_REL}\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\" type=\"blank\" preserve=\"1\"><p:cSld name=\"Blank\"><p:spTree><p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr></p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>`\n}\n\nfunction slideLayoutRelsXml(): string {\n return `${XML_DECL}<Relationships xmlns=\"${REL_NS}\"><Relationship Id=\"rId1\" Type=\"${OD_REL}/slideMaster\" Target=\"../slideMasters/slideMaster1.xml\"/></Relationships>`\n}\n\nfunction slideXml(): string {\n return `${XML_DECL}<p:sld xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"${OD_REL}\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\"><p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr><p:pic><p:nvPicPr><p:cNvPr id=\"2\" name=\"Slide\"/><p:cNvPicPr><a:picLocks noChangeAspect=\"1\"/></p:cNvPicPr><p:nvPr/></p:nvPicPr><p:blipFill><a:blip r:embed=\"rId2\"/><a:stretch><a:fillRect/></a:stretch></p:blipFill><p:spPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"${EMU_W}\" cy=\"${EMU_H}\"/></a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></p:spPr></p:pic></p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld>`\n}\n\nfunction slideRelsXml(idx: number): string {\n return `${XML_DECL}<Relationships xmlns=\"${REL_NS}\"><Relationship Id=\"rId1\" Type=\"${OD_REL}/slideLayout\" Target=\"../slideLayouts/slideLayout1.xml\"/><Relationship Id=\"rId2\" Type=\"${OD_REL}/image\" Target=\"../media/image${idx}.png\"/></Relationships>`\n}\n\nfunction themeXml(): string {\n return `${XML_DECL}<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\"><a:themeElements><a:clrScheme name=\"Office\"><a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1><a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1><a:dk2><a:srgbClr val=\"44546A\"/></a:dk2><a:lt2><a:srgbClr val=\"E7E6E6\"/></a:lt2><a:accent1><a:srgbClr val=\"4472C4\"/></a:accent1><a:accent2><a:srgbClr val=\"ED7D31\"/></a:accent2><a:accent3><a:srgbClr val=\"A5A5A5\"/></a:accent3><a:accent4><a:srgbClr val=\"FFC000\"/></a:accent4><a:accent5><a:srgbClr val=\"5B9BD5\"/></a:accent5><a:accent6><a:srgbClr val=\"70AD47\"/></a:accent6><a:hlink><a:srgbClr val=\"0563C1\"/></a:hlink><a:folHlink><a:srgbClr val=\"954F72\"/></a:folHlink></a:clrScheme><a:fontScheme name=\"Office\"><a:majorFont><a:latin typeface=\"Calibri Light\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:majorFont><a:minorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:minorFont></a:fontScheme><a:fmtScheme name=\"Office\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"110000\"/><a:satMod val=\"105000\"/><a:tint val=\"67000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"103000\"/><a:tint val=\"73000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:satMod val=\"109000\"/><a:tint val=\"81000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:satMod val=\"103000\"/><a:lumMod val=\"102000\"/><a:tint val=\"94000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:satMod val=\"110000\"/><a:lumMod val=\"100000\"/><a:shade val=\"100000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"99000\"/><a:satMod val=\"120000\"/><a:shade val=\"78000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w=\"6350\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"12700\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln><a:ln w=\"19050\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/><a:miter lim=\"800000\"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"><a:tint val=\"95000\"/><a:satMod val=\"170000\"/></a:schemeClr></a:solidFill><a:gradFill rotWithShape=\"1\"><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"93000\"/><a:satMod val=\"150000\"/><a:shade val=\"98000\"/><a:lumMod val=\"102000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:tint val=\"98000\"/><a:satMod val=\"130000\"/><a:shade val=\"90000\"/><a:lumMod val=\"103000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:shade val=\"63000\"/><a:satMod val=\"120000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements></a:theme>`\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/keys.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: none.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\n\nexport function isTypingTarget(target: EventTarget | null): boolean {\n return (\n target instanceof HTMLElement && (target.isContentEditable || target.matches(\"input, textarea\"))\n )\n}\n\n/** Single-letter shortcuts bail on this so browser combos (⌘P, ⌘F…) still work. */\nexport function hasModifier(e: KeyboardEvent): boolean {\n return e.altKey || e.ctrlKey || e.metaKey\n}\n\nexport function isForwardKey(e: KeyboardEvent): boolean {\n return e.key === \"ArrowRight\" || e.key === \"ArrowDown\" || e.key === \" \" || e.key === \"PageDown\"\n}\n\nexport function isBackwardKey(e: KeyboardEvent): boolean {\n return e.key === \"ArrowLeft\" || e.key === \"ArrowUp\" || e.key === \"PageUp\"\n}\n","/**\n * Localized messages for slide controls. The language is detected from\n * the document's lang attribute, falling back to Japanese when unspecified\n * (for backward compatibility with existing decks that have no lang).\n */\n\nexport interface SlideMessages {\n previousSlide: string\n nextSlide: string\n slideList: string\n closeSlideList: string\n openSlideList: string\n fullscreen: string\n exitFullscreen: string\n exportToPowerPoint: string\n slideNumber: (n: number) => string\n}\n\nconst MESSAGES_JA: SlideMessages = {\n previousSlide: \"前のスライド\",\n nextSlide: \"次のスライド\",\n slideList: \"スライド一覧\",\n closeSlideList: \"スライド一覧を閉じる (L)\",\n openSlideList: \"スライド一覧を開く (L)\",\n fullscreen: \"全画面表示 (F)\",\n exitFullscreen: \"全画面表示を終了 (F)\",\n exportToPowerPoint: \"PowerPoint として書き出す\",\n slideNumber: (n: number) => `スライド ${n}`,\n}\n\nconst MESSAGES_EN: SlideMessages = {\n previousSlide: \"Previous slide\",\n nextSlide: \"Next slide\",\n slideList: \"Slide list\",\n closeSlideList: \"Close slide list (L)\",\n openSlideList: \"Open slide list (L)\",\n fullscreen: \"Fullscreen (F)\",\n exitFullscreen: \"Exit fullscreen (F)\",\n exportToPowerPoint: \"Export to PowerPoint\",\n slideNumber: (n: number) => `Slide ${n}`,\n}\n\n/**\n * Detect the document language from the html[lang] attribute.\n * Returns \"ja\" or \"en\", defaulting to \"ja\" when unspecified.\n */\nfunction detectLanguage(): \"ja\" | \"en\" {\n if (typeof document === \"undefined\") return \"ja\"\n const lang = document.documentElement.lang\n if (!lang) return \"ja\"\n // Match \"en\", \"en-US\", \"en-GB\", etc.\n if (lang.toLowerCase().startsWith(\"en\")) return \"en\"\n return \"ja\"\n}\n\n/**\n * Get localized messages for the current document language.\n */\nexport function getSlideMessages(): SlideMessages {\n const lang = detectLanguage()\n return lang === \"en\" ? MESSAGES_EN : MESSAGES_JA\n}\n","/**\n * The slide list beside the deck. Not a port: open-slide shows the same thing\n * as a full-screen overview grid that replaces the slide, and its rail lives in\n * the authoring IDE with editing affordances Vantage has no counterpart for.\n * A rail keeps the current slide on screen while the reader looks for where to\n * jump, which is what a deck embedded in a dashboard wants.\n *\n * Styled from the deck's tokens rather than the app's, and neutral: every\n * surface here is `color-mix` of `--slide-fg` into `--slide-bg`, so the rail\n * is a tint of the deck's own paper and introduces no hue — a themed deck does\n * not end up with the dashboard's white column beside it, and the accent the\n * author picked stays a thing that only happens on slides.\n */\nimport { useEffect, useMemo, useRef, type CSSProperties, type ReactElement } from \"react\"\nimport { SlideCanvas } from \"./canvas\"\nimport { CANVAS_HEIGHT, CANVAS_WIDTH } from \"./constants\"\nimport { SlideNumberProvider } from \"./slide-context\"\nimport { getSlideMessages } from \"./messages\"\n\nconst THUMB_WIDTH = 176\nconst THUMB_HEIGHT = Math.round((THUMB_WIDTH * CANVAS_HEIGHT) / CANVAS_WIDTH)\nconst NUMBER_COLUMN = 20\nconst GUTTER = 10\n\n/** Wide enough for the thumbnail, its number and the gutters on both sides. */\nexport const RAIL_WIDTH = NUMBER_COLUMN + THUMB_WIDTH + GUTTER * 3\n\nexport interface SlideRailProps {\n slides: ReactElement[]\n index: number\n onSelect: (index: number) => void\n /** The deck's token overrides, so a thumbnail matches the slide it stands for. */\n themeVars?: CSSProperties\n}\n\nconst ITEM_BUTTON: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: GUTTER,\n width: \"100%\",\n padding: 0,\n border: \"none\",\n background: \"transparent\",\n color: \"inherit\",\n font: \"inherit\",\n cursor: \"pointer\",\n textAlign: \"left\",\n}\n\nexport function SlideRail({ slides, index, onSelect, themeVars }: SlideRailProps) {\n const listRef = useRef<HTMLOListElement>(null)\n const messages = useMemo(() => getSlideMessages(), [])\n\n // Follow the deck: arrow keys and `?p=` move the selection too, and a rail\n // that has scrolled away from it is worse than no rail.\n useEffect(() => {\n const item = listRef.current?.children[index]\n item?.scrollIntoView({ block: \"nearest\" })\n }, [index])\n\n return (\n <div\n // Excluded from click-to-navigate: the rail is beside the slide, not on\n // it, so a click in its padding must not also turn the page.\n data-slide-chrome=\"\"\n aria-label={messages.slideList}\n style={{\n flex: \"0 0 auto\",\n width: RAIL_WIDTH,\n height: \"100%\",\n overflowY: \"auto\",\n overscrollBehavior: \"contain\",\n background: \"color-mix(in oklab, var(--slide-fg) 6%, var(--slide-bg))\",\n color: \"var(--slide-fg)\",\n borderRight: \"1px solid color-mix(in oklab, var(--slide-fg) 14%, transparent)\",\n fontFamily:\n 'system-ui, -apple-system, \"Hiragino Kaku Gothic ProN\", \"Yu Gothic\", Meiryo, sans-serif',\n userSelect: \"none\",\n // An embedded deck does not put the theme on its root, so the rail\n // carries it too rather than reading whatever cascaded in.\n ...themeVars,\n }}\n >\n <ol\n ref={listRef}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: GUTTER,\n margin: 0,\n padding: GUTTER,\n listStyle: \"none\",\n }}\n >\n {slides.map((slide, i) => {\n const active = i === index\n return (\n <li\n key={i}\n // Cheap virtualisation: a deck's slides are real React trees\n // (charts included), and only the few in view need laying out.\n style={{\n contentVisibility: \"auto\",\n containIntrinsicSize: `${THUMB_HEIGHT}px ${RAIL_WIDTH - GUTTER * 2}px`,\n }}\n >\n <button\n type=\"button\"\n style={ITEM_BUTTON}\n onClick={() => onSelect(i)}\n aria-current={active ? \"true\" : undefined}\n aria-label={messages.slideNumber(i + 1)}\n >\n <span\n style={{\n flex: `0 0 ${NUMBER_COLUMN}px`,\n textAlign: \"right\",\n fontSize: 11,\n fontVariantNumeric: \"tabular-nums\",\n color: active ? \"var(--slide-fg)\" : \"var(--slide-muted)\",\n fontWeight: active ? 600 : 400,\n }}\n >\n {i + 1}\n </span>\n <span\n style={{\n position: \"relative\",\n display: \"block\",\n width: THUMB_WIDTH,\n height: THUMB_HEIGHT,\n overflow: \"hidden\",\n borderRadius: 4,\n background: \"var(--slide-bg)\",\n outline: active\n ? \"2px solid color-mix(in oklab, var(--slide-fg) 55%, transparent)\"\n : \"1px solid color-mix(in oklab, var(--slide-fg) 14%, transparent)\",\n outlineOffset: active ? 1 : 0,\n // The thumbnail is a picture of a slide, not a live copy:\n // clicks belong to the button, never to the slide's own\n // links and buttons.\n pointerEvents: \"none\",\n }}\n >\n <SlideNumberProvider index={i} total={slides.length}>\n {/* No StepHost, as in the pptx export: without one every\n `<Steps>` renders revealed, which is what a thumbnail\n of the finished slide should show. */}\n <SlideCanvas scale={THUMB_WIDTH / CANVAS_WIDTH} themeVars={themeVars}>\n {slide}\n </SlideCanvas>\n </SlideNumberProvider>\n </span>\n </button>\n </li>\n )\n })}\n </ol>\n </div>\n )\n}\n","/**\n * The deck's own controls. Written for Vantage rather than ported: open-slide's\n * present chrome carries a notes drawer and a presenter window, neither of\n * which comes across. What is left is the minimum a viewer needs — where they\n * are, how to move, how much of the deck to show at once, and how to take it\n * with them.\n *\n * Deliberately plain inline styles, like the rest of the slide runtime: the\n * toolbar sits on top of a canvas whose scale it does not share, so a Tailwind\n * `text-sm` here would be a different size than the same class on a slide.\n */\nimport { useMemo, useState, type CSSProperties } from \"react\"\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n DownloadIcon,\n MaximizeIcon,\n MinimizeIcon,\n PanelLeftCloseIcon,\n PanelLeftOpenIcon,\n} from \"lucide-react\"\nimport type { PptxExportProgress } from \"./export-pptx\"\nimport { getSlideMessages } from \"./messages\"\n\nexport interface SlideToolbarProps {\n current: number\n total: number\n onPrev: () => void\n onNext: () => void\n onFullscreen: () => void\n /** False where the browser will not grant fullscreen (e.g. an iframe without `allow=\"fullscreen\"`). */\n canFullscreen: boolean\n onExport: () => void\n exportProgress: PptxExportProgress | null\n /** Whether the slide list is showing. */\n railOpen: boolean\n onToggleRail: () => void\n isFullscreen: boolean\n}\n\nconst BUTTON: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n height: 32,\n minWidth: 32,\n padding: \"0 8px\",\n border: \"none\",\n borderRadius: 8,\n background: \"transparent\",\n color: \"inherit\",\n font: \"inherit\",\n fontSize: 13,\n cursor: \"pointer\",\n}\n\nexport function SlideToolbar({\n current,\n total,\n onPrev,\n onNext,\n onFullscreen,\n canFullscreen,\n onExport,\n exportProgress,\n railOpen,\n onToggleRail,\n isFullscreen,\n}: SlideToolbarProps) {\n // The toolbar is chrome over someone else's slide, so it stays out of the\n // way until the pointer is near it.\n const [hovered, setHovered] = useState(false)\n const busy = exportProgress !== null && exportProgress.phase !== \"done\"\n const messages = useMemo(() => getSlideMessages(), [])\n\n return (\n <div\n // Excluded from click-to-navigate: pressing \"next\" should not also turn\n // the page underneath.\n data-slide-chrome=\"\"\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n position: \"absolute\",\n bottom: 16,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n padding: 4,\n borderRadius: 12,\n background: \"rgb(0 0 0 / 0.55)\",\n color: \"#fff\",\n backdropFilter: \"blur(8px)\",\n opacity: hovered || busy ? 1 : 0.25,\n transition: \"opacity 150ms ease\",\n fontFamily:\n 'system-ui, -apple-system, \"Hiragino Kaku Gothic ProN\", \"Yu Gothic\", Meiryo, sans-serif',\n userSelect: \"none\",\n }}\n >\n <button type=\"button\" style={BUTTON} onClick={onPrev} aria-label={messages.previousSlide}>\n <ChevronLeftIcon size={16} aria-hidden=\"true\" />\n </button>\n <span style={{ padding: \"0 8px\", fontSize: 13, fontVariantNumeric: \"tabular-nums\" }}>\n {current} / {total}\n </span>\n <button type=\"button\" style={BUTTON} onClick={onNext} aria-label={messages.nextSlide}>\n <ChevronRightIcon size={16} aria-hidden=\"true\" />\n </button>\n {/* Fullscreen is the one mode with no room for a list, so the toggle\n goes away there rather than sitting inert. */}\n {isFullscreen ? null : (\n <button\n type=\"button\"\n style={BUTTON}\n onClick={onToggleRail}\n aria-label={railOpen ? messages.closeSlideList : messages.openSlideList}\n title={railOpen ? messages.closeSlideList : messages.openSlideList}\n aria-pressed={railOpen}\n >\n {railOpen ? (\n <PanelLeftCloseIcon size={16} aria-hidden=\"true\" />\n ) : (\n <PanelLeftOpenIcon size={16} aria-hidden=\"true\" />\n )}\n </button>\n )}\n {/* Hidden where the browser would refuse it, rather than a button that\n does nothing. */}\n {canFullscreen ? (\n <button\n type=\"button\"\n style={BUTTON}\n onClick={onFullscreen}\n aria-label={isFullscreen ? messages.exitFullscreen : messages.fullscreen}\n title={isFullscreen ? messages.exitFullscreen : messages.fullscreen}\n >\n {isFullscreen ? (\n <MinimizeIcon size={16} aria-hidden=\"true\" />\n ) : (\n <MaximizeIcon size={16} aria-hidden=\"true\" />\n )}\n </button>\n ) : null}\n <button\n type=\"button\"\n style={{ ...BUTTON, opacity: busy ? 0.6 : 1, cursor: busy ? \"progress\" : \"pointer\" }}\n onClick={onExport}\n disabled={busy}\n aria-label={messages.exportToPowerPoint}\n title={messages.exportToPowerPoint}\n >\n <DownloadIcon size={16} aria-hidden=\"true\" />\n {busy ? <span>{Math.round(exportProgress.percent)}%</span> : null}\n </button>\n </div>\n )\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/use-media-query.ts,\n * packages/core/src/app/lib/use-prefers-reduced-motion.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: the two files collapsed into one; the generic media-query\n * hook is not part of the public surface.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport { useEffect, useState } from \"react\"\n\nconst QUERY = \"(prefers-reduced-motion: reduce)\"\n\nfunction matches(): boolean {\n if (typeof window === \"undefined\") return false\n return window.matchMedia(QUERY).matches\n}\n\nexport function prefersReducedMotion(): boolean {\n return matches()\n}\n\nexport function usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = useState(matches)\n\n useEffect(() => {\n const mql = window.matchMedia(QUERY)\n setReduced(mql.matches)\n const onChange = (e: MediaQueryListEvent) => setReduced(e.matches)\n mql.addEventListener(\"change\", onChange)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [])\n\n return reduced\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/step-context.tsx\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: the globalThis context trick dropped (tsup's shared chunk\n * already gives the framework one module instance); the\n * `controlledRevealed` path dropped along with the authoring\n * IDE's thumbnail rail, which was its only caller;\n * `data-osd-step` renamed to `data-slide-step`.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport {\n Children,\n cloneElement,\n createContext,\n isValidElement,\n useCallback,\n useContext,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type PropsWithChildren,\n type ReactElement,\n type RefObject,\n} from \"react\"\nimport { usePrefersReducedMotion } from \"./use-prefers-reduced-motion\"\nimport type { EntryDirection } from \"./types\"\n\n/** Advance/retreat one step; returns false when there is nothing left to reveal. */\nexport interface StepController {\n advance: () => boolean\n retreat: () => boolean\n}\n\ninterface Registration {\n id: object\n stepCount: number\n initialRevealed: number\n controller: StepController\n setRevealed: (n: number) => void\n}\n\ninterface StepHostContextValue {\n register: (reg: Registration) => () => void\n entryDirection: EntryDirection\n isActiveSlide: boolean\n}\n\nconst StepHostContext = createContext<StepHostContextValue | null>(null)\n\ninterface StepHostProps {\n isActiveSlide: boolean\n entryDirection: EntryDirection\n controllerRef: RefObject<StepController | null>\n}\n\n/**\n * Collects the `<Steps>` groups on one slide into a single controller the deck\n * can drive. Multiple groups advance in mount order, so \"next\" walks the slide\n * top to bottom before moving on.\n */\nexport function StepHost({\n isActiveSlide,\n entryDirection,\n controllerRef,\n children,\n}: PropsWithChildren<StepHostProps>) {\n const registrations = useRef<Registration[]>([])\n\n const composite = useMemo<StepController>(\n () => ({\n advance: () => {\n for (const r of registrations.current) {\n if (r.controller.advance()) return true\n }\n return false\n },\n retreat: () => {\n for (let i = registrations.current.length - 1; i >= 0; i--) {\n if (registrations.current[i]!.controller.retreat()) return true\n }\n return false\n },\n }),\n [],\n )\n\n // useLayoutEffect cleanup-then-mount ordering keeps the slot continuous\n // across slide swaps: the outgoing host clears its composite before the\n // incoming one installs its own, with no gap and no overlap.\n useLayoutEffect(() => {\n if (!isActiveSlide) return\n controllerRef.current = composite\n return () => {\n if (controllerRef.current === composite) controllerRef.current = null\n }\n }, [isActiveSlide, composite, controllerRef])\n\n const value = useMemo<StepHostContextValue>(\n () => ({\n register: (reg) => {\n registrations.current.push(reg)\n return () => {\n const i = registrations.current.indexOf(reg)\n if (i !== -1) registrations.current.splice(i, 1)\n }\n },\n entryDirection,\n isActiveSlide,\n }),\n [entryDirection, isActiveSlide],\n )\n\n return <StepHostContext.Provider value={value}>{children}</StepHostContext.Provider>\n}\n\n/**\n * Whether this instance of a slide is the one the audience is watching.\n *\n * During a transition the outgoing slide is re-mounted in a second slot so its\n * exit state can be snapshotted, and the pptx export mounts every slide\n * offscreen. An intro animation that replays in those instances snapshots\n * mid-flight, which is how a morph ends up starting from garbage. Gate\n * entrance animations on this: it is true only for the live instance, and\n * every other one should render the settled, finished state.\n */\nexport function useIsActiveSlide(): boolean {\n return useContext(StepHostContext)?.isActiveSlide ?? false\n}\n\n/**\n * Group of `<Step>` children revealed one at a time. Anything that is not a\n * `<Step>` renders immediately, so a heading can sit inside the group.\n */\nexport function Steps({ children }: PropsWithChildren) {\n const host = useContext(StepHostContext)\n const flat = Children.toArray(children)\n const stepCount = flat.filter((c) => isValidElement(c) && c.type === Step).length\n\n // Arriving backwards (or by deep link) shows the slide already fully\n // revealed — walking forward through steps you have just seen is worse than\n // seeing the finished slide.\n const initial = host?.entryDirection === \"forward\" ? 0 : stepCount\n const revealedRef = useRef(initial)\n const [revealed, setRevealed] = useState(initial)\n const idRef = useRef<object>({})\n\n const applyRevealed = useCallback((n: number) => {\n revealedRef.current = n\n setRevealed(n)\n }, [])\n\n useLayoutEffect(() => {\n if (!host) return\n const controller: StepController = {\n advance: () => {\n if (revealedRef.current >= stepCount) return false\n applyRevealed(revealedRef.current + 1)\n return true\n },\n retreat: () => {\n if (revealedRef.current <= 0) return false\n applyRevealed(revealedRef.current - 1)\n return true\n },\n }\n return host.register({\n id: idRef.current,\n stepCount,\n initialRevealed: revealedRef.current,\n controller,\n setRevealed: applyRevealed,\n })\n }, [host, stepCount, applyRevealed])\n\n // Without a host (an offscreen capture for the pptx export, a slide rendered\n // on its own) everything is revealed: there is nobody to press the key.\n const effective = host ? revealed : stepCount\n\n let stepIndex = 0\n return (\n <>\n {flat.map((child, key) => {\n if (isValidElement(child) && child.type === Step) {\n const index = stepIndex++\n return cloneElement(child as ReactElement<{ _revealed?: boolean }>, {\n key: child.key ?? key,\n _revealed: index < effective,\n })\n }\n return child\n })}\n </>\n )\n}\n\nexport interface StepProps {\n /** Fade-in duration in ms. */\n duration?: number\n}\n\ntype InternalStepProps = PropsWithChildren<StepProps> & { _revealed?: boolean }\n\n/** One reveal inside `<Steps>`. */\nexport function Step({ children, duration = 180, _revealed }: InternalStepProps) {\n const reduceMotion = usePrefersReducedMotion()\n const revealed = _revealed ?? true\n const ms = reduceMotion ? 0 : duration\n\n return (\n <div\n data-slide-step={revealed ? \"revealed\" : \"pending\"}\n style={{\n opacity: revealed ? 1 : 0,\n // `visibility` as well as opacity so a pending step is out of the\n // accessibility tree and cannot be tabbed into.\n visibility: revealed ? \"visible\" : \"hidden\",\n transition: `opacity ${ms}ms cubic-bezier(0, 0, 0.2, 1)`,\n }}\n >\n {children}\n </div>\n )\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/components/slide-transition-layer.tsx\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: `pages: Page[]` (component types) became\n * `slides: ReactElement[]`, so a deck is written as children\n * rather than an exported array; `data-osd-*` renamed to\n * `data-slide-*`; Tailwind classes replaced with inline\n * styles; the step-aggregate callback (the authoring IDE's\n * thumbnail rail) dropped.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ReactElement,\n type RefObject,\n} from \"react\"\nimport { SlideNumberProvider } from \"./slide-context\"\nimport { StepHost, type StepController } from \"./steps\"\nimport type { EntryDirection, MorphTransition, SlideTransition, TransitionPhase } from \"./types\"\n\ninterface TransitionLayerProps {\n slides: ReactElement[]\n /** Per-slide transition, index-aligned with `slides`. */\n transitions: (SlideTransition | undefined)[]\n index: number\n disabled?: boolean\n stepControllerRef?: RefObject<StepController | null>\n entryDirection?: EntryDirection\n}\n\ntype Direction = \"forward\" | \"backward\"\n\nconst DEFAULT_EASING = \"cubic-bezier(.4, 0, .2, 1)\"\nconst MORPH_SELECTOR = \"[data-slide-morph]\"\nconst TEXT_FILL_COLOR_PROPERTY = \"-webkit-text-fill-color\"\n\n/**\n * The properties a morph animates in place. Geometry is handled separately by\n * the transform; these are the ones that would otherwise pop at the halfway\n * point because the clone carries the source's colour and the target's shape.\n */\nconst MORPH_VISUAL_PROPERTIES = [\n \"opacity\",\n \"color\",\n \"background-color\",\n \"border-top-color\",\n \"border-right-color\",\n \"border-bottom-color\",\n \"border-left-color\",\n \"outline-color\",\n \"text-decoration-color\",\n TEXT_FILL_COLOR_PROPERTY,\n \"-webkit-text-stroke-color\",\n \"fill\",\n \"stroke\",\n] as const\n\nconst BORDER_COLOR_PROPERTIES = [\n \"border-top-color\",\n \"border-right-color\",\n \"border-bottom-color\",\n \"border-left-color\",\n] as const\n\nconst BORDER_SIDE_PROPERTIES = [\n {\n width: \"borderTopWidth\",\n style: \"borderTopStyle\",\n color: \"borderTopColor\",\n cssWidth: \"border-top-width\",\n cssStyle: \"border-top-style\",\n cssColor: \"border-top-color\",\n },\n {\n width: \"borderRightWidth\",\n style: \"borderRightStyle\",\n color: \"borderRightColor\",\n cssWidth: \"border-right-width\",\n cssStyle: \"border-right-style\",\n cssColor: \"border-right-color\",\n },\n {\n width: \"borderBottomWidth\",\n style: \"borderBottomStyle\",\n color: \"borderBottomColor\",\n cssWidth: \"border-bottom-width\",\n cssStyle: \"border-bottom-style\",\n cssColor: \"border-bottom-color\",\n },\n {\n width: \"borderLeftWidth\",\n style: \"borderLeftStyle\",\n color: \"borderLeftColor\",\n cssWidth: \"border-left-width\",\n cssStyle: \"border-left-style\",\n cssColor: \"border-left-color\",\n },\n] as const\n\n/** Properties a child inherits; copying them onto a clone double-applies them. */\nconst INHERITED_VISUAL_PROPERTIES = new Set<string>([\n \"color\",\n \"text-decoration-color\",\n TEXT_FILL_COLOR_PROPERTY,\n \"-webkit-text-stroke-color\",\n \"fill\",\n \"stroke\",\n])\n\nfunction runPhase(\n el: HTMLElement,\n phase: TransitionPhase | undefined,\n fallbackDuration: number,\n fallbackEasing: string,\n): Animation | null {\n if (!phase) return null\n return el.animate(phase.keyframes, {\n duration: phase.duration ?? fallbackDuration,\n easing: phase.easing ?? fallbackEasing,\n delay: phase.delay ?? 0,\n fill: \"both\",\n })\n}\n\ntype ResolvedMorph = Required<MorphTransition>\n\nfunction resolveMorph(\n morph: SlideTransition[\"morph\"],\n fallbackDuration: number,\n fallbackEasing: string,\n): ResolvedMorph | null {\n if (!morph) return null\n if (morph === true) return { duration: fallbackDuration, easing: fallbackEasing, delay: 0 }\n return {\n duration: morph.duration ?? fallbackDuration,\n easing: morph.easing ?? fallbackEasing,\n delay: morph.delay ?? 0,\n }\n}\n\ninterface LocalRect {\n left: number\n top: number\n width: number\n height: number\n}\n\nfunction localTransform(styles: CSSStyleDeclaration): string {\n return styles.transform && styles.transform !== \"none\" ? styles.transform : \"\"\n}\n\n/**\n * The element's box with its own transform taken off. A morph animates the\n * transform itself, so measuring a transformed box would compound the two.\n */\nfunction measureUntransformedClientRect(el: HTMLElement): DOMRect {\n const styles = getComputedStyle(el)\n if (!localTransform(styles)) return el.getBoundingClientRect()\n\n const value = el.style.getPropertyValue(\"transform\")\n const priority = el.style.getPropertyPriority(\"transform\")\n el.style.setProperty(\"transform\", \"none\", \"important\")\n try {\n return el.getBoundingClientRect()\n } finally {\n if (value) el.style.setProperty(\"transform\", value, priority)\n else el.style.removeProperty(\"transform\")\n }\n}\n\n/**\n * Position relative to the wrapper, in canvas pixels. The canvas is scaled to\n * fit the viewport, so screen coordinates have to be divided back out or every\n * clone lands at the wrong size.\n */\nfunction measureLocalRect(el: HTMLElement, wrapper: HTMLElement, wrapperRect: DOMRect): LocalRect {\n const rect = measureUntransformedClientRect(el)\n const scaleX = wrapperRect.width / (wrapper.offsetWidth || wrapperRect.width || 1) || 1\n const scaleY = wrapperRect.height / (wrapper.offsetHeight || wrapperRect.height || 1) || 1\n return {\n left: (rect.left - wrapperRect.left) / scaleX,\n top: (rect.top - wrapperRect.top) / scaleY,\n width: rect.width / scaleX,\n height: rect.height / scaleY,\n }\n}\n\nfunction hasUsableRect(rect: LocalRect): boolean {\n return rect.width > 0 && rect.height > 0\n}\n\nfunction collectMorphElements(root: HTMLElement): Map<string, HTMLElement> {\n const elements = new Map<string, HTMLElement>()\n for (const el of root.querySelectorAll<HTMLElement>(MORPH_SELECTOR)) {\n const id = el.dataset.slideMorph\n if (id && !elements.has(id)) elements.set(id, el)\n }\n return elements\n}\n\nfunction shouldSkipCopiedStyle(\n source: HTMLElement,\n styles: CSSStyleDeclaration,\n prop: string,\n preserveInherited: boolean,\n): boolean {\n if (prop === TEXT_FILL_COLOR_PROPERTY && styles.getPropertyValue(prop) === styles.color) {\n return true\n }\n if (!preserveInherited || !INHERITED_VISUAL_PROPERTIES.has(prop)) return false\n const parent = source.parentElement\n if (!parent) return false\n return styles.getPropertyValue(prop) === getComputedStyle(parent).getPropertyValue(prop)\n}\n\n/**\n * Flatten computed style onto a clone. The clone is reparented into an overlay\n * outside the slide, so nothing it inherited from its old ancestors survives —\n * it has to carry every resolved value itself.\n */\nfunction copyComputedStyles(\n source: HTMLElement,\n target: HTMLElement,\n preserveInherited = false,\n): void {\n const styles = getComputedStyle(source)\n for (let i = 0; i < styles.length; i++) {\n const prop = styles[i]!\n if (shouldSkipCopiedStyle(source, styles, prop, preserveInherited)) continue\n target.style.setProperty(prop, styles.getPropertyValue(prop), styles.getPropertyPriority(prop))\n }\n\n const sourceChildren = source.querySelectorAll<HTMLElement>(\"*\")\n const targetChildren = target.querySelectorAll<HTMLElement>(\"*\")\n for (let i = 0; i < sourceChildren.length; i++) {\n const child = targetChildren[i]\n if (!child) continue\n copyComputedStyles(sourceChildren[i]!, child, true)\n }\n}\n\nfunction cloneMorphElement(source: HTMLElement): HTMLElement {\n const clone = source.cloneNode(true) as HTMLElement\n copyComputedStyles(source, clone)\n clone.removeAttribute(\"data-slide-morph\")\n return clone\n}\n\nfunction parsePx(value: string): number | null {\n const match = value.trim().match(/^(-?\\d*\\.?\\d+)px$/)\n if (!match) return null\n const n = Number.parseFloat(match[1]!)\n return Number.isFinite(n) ? n : null\n}\n\n/** Divide the radius by the morph's scale so corners keep their visual size. */\nfunction scaleRadius(value: string, scaleX: number, scaleY: number): string {\n const parts = value.trim().split(/\\s+/)\n const x = parsePx(parts[0] ?? \"\")\n const y = parsePx(parts[1] ?? parts[0] ?? \"\")\n if (x === null || y === null) return value\n const nextX = x / scaleX\n const nextY = y / scaleY\n return Math.abs(nextX - nextY) < 0.001 ? `${nextX}px` : `${nextX}px ${nextY}px`\n}\n\nfunction radiusKeyframe(styles: CSSStyleDeclaration, scaleX = 1, scaleY = 1): Keyframe {\n return {\n borderTopLeftRadius: scaleRadius(styles.borderTopLeftRadius, scaleX, scaleY),\n borderTopRightRadius: scaleRadius(styles.borderTopRightRadius, scaleX, scaleY),\n borderBottomRightRadius: scaleRadius(styles.borderBottomRightRadius, scaleX, scaleY),\n borderBottomLeftRadius: scaleRadius(styles.borderBottomLeftRadius, scaleX, scaleY),\n }\n}\n\nfunction morphTransform(rect: LocalRect, scaleX: number, scaleY: number, local: string): string {\n return [`translate(${rect.left}px, ${rect.top}px)`, `scale(${scaleX}, ${scaleY})`, local]\n .filter(Boolean)\n .join(\" \")\n}\n\nfunction morphTranslateTransform(rect: LocalRect, local: string): string {\n return [`translate(${rect.left}px, ${rect.top}px)`, local].filter(Boolean).join(\" \")\n}\n\n/** `element.animate()` silently drops kebab-case keys; keyframes need IDL names. */\nfunction keyframeProperty(css: string): string {\n return css.replace(/^-/, \"\").replace(/-([a-z])/g, (_, letter: string) => letter.toUpperCase())\n}\n\nfunction visualStyleKeyframe(\n styles: CSSStyleDeclaration,\n opacity?: string,\n options: { includeBorderColors?: boolean } = {},\n): Keyframe {\n const frame: Record<string, string> = {}\n for (const prop of MORPH_VISUAL_PROPERTIES) {\n if (\n options.includeBorderColors === false &&\n (BORDER_COLOR_PROPERTIES as readonly string[]).includes(prop)\n ) {\n continue\n }\n const value = styles.getPropertyValue(prop)\n if (prop === TEXT_FILL_COLOR_PROPERTY && value === styles.color) continue\n if (value) frame[keyframeProperty(prop)] = value\n }\n if (opacity !== undefined) frame.opacity = opacity\n return frame\n}\n\nfunction hideBorderColors(el: HTMLElement): void {\n for (const { color } of BORDER_SIDE_PROPERTIES) {\n el.style[color] = \"transparent\"\n }\n}\n\nfunction isVisibleBorderSide(\n styles: CSSStyleDeclaration,\n side: (typeof BORDER_SIDE_PROPERTIES)[number],\n): boolean {\n const width = parsePx(styles.getPropertyValue(side.cssWidth)) ?? 0\n const borderStyle = styles.getPropertyValue(side.cssStyle)\n return width > 0 && borderStyle !== \"none\" && borderStyle !== \"hidden\"\n}\n\nfunction hasVisibleBorder(styles: CSSStyleDeclaration): boolean {\n return BORDER_SIDE_PROPERTIES.some((side) => isVisibleBorderSide(styles, side))\n}\n\nfunction borderFrameKeyframe(\n rect: LocalRect,\n styles: CSSStyleDeclaration,\n opacity: string,\n): Keyframe {\n const frame: Keyframe = {\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n opacity,\n transform: morphTranslateTransform(rect, localTransform(styles)),\n ...radiusKeyframe(styles),\n }\n for (const side of BORDER_SIDE_PROPERTIES) {\n frame[side.width] = styles.getPropertyValue(side.cssWidth)\n frame[side.color] = styles.getPropertyValue(side.cssColor)\n }\n return frame\n}\n\n/**\n * A border scaled by the clone's transform would thicken with it. The border\n * is drawn instead by a separate box that only translates and resizes, so its\n * stroke stays the width the author asked for at both ends.\n */\nfunction appendBorderFrame(\n wrapper: HTMLElement,\n overlay: HTMLElement,\n sourceStyles: CSSStyleDeclaration,\n targetStyles: CSSStyleDeclaration,\n rect: LocalRect,\n): HTMLElement {\n if (!overlay.parentElement) wrapper.appendChild(overlay)\n\n const frame = document.createElement(\"div\")\n Object.assign(frame.style, {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n margin: \"0\",\n transformOrigin: \"top left\",\n pointerEvents: \"none\",\n boxSizing: \"border-box\",\n background: \"transparent\",\n })\n\n for (const side of BORDER_SIDE_PROPERTIES) {\n const styles = isVisibleBorderSide(sourceStyles, side) ? sourceStyles : targetStyles\n frame.style[side.style] = styles.getPropertyValue(side.cssStyle)\n frame.style[side.width] = sourceStyles.getPropertyValue(side.cssWidth)\n frame.style[side.color] = sourceStyles.getPropertyValue(side.cssColor)\n }\n\n overlay.appendChild(frame)\n return frame\n}\n\nfunction hasVisualStyleChange(from: CSSStyleDeclaration, to: CSSStyleDeclaration): boolean {\n for (const prop of MORPH_VISUAL_PROPERTIES) {\n if (from.getPropertyValue(prop) !== to.getPropertyValue(prop)) return true\n }\n return false\n}\n\n/** Opacity as it actually renders: every ancestor's opacity multiplied in. */\nfunction effectiveOpacity(el: HTMLElement, boundary: HTMLElement): string {\n let opacity = 1\n let node: HTMLElement | null = el\n while (node && node !== boundary) {\n const value = Number.parseFloat(getComputedStyle(node).opacity)\n if (Number.isFinite(value)) opacity *= value\n node = node.parentElement\n }\n return String(opacity)\n}\n\nfunction hideOriginal(el: HTMLElement): () => void {\n const value = el.style.getPropertyValue(\"visibility\")\n const priority = el.style.getPropertyPriority(\"visibility\")\n el.style.setProperty(\"visibility\", \"hidden\", \"important\")\n return () => {\n if (value) el.style.setProperty(\"visibility\", value, priority)\n else el.style.removeProperty(\"visibility\")\n }\n}\n\nfunction appendPositionedClone(\n wrapper: HTMLElement,\n overlay: HTMLElement,\n source: HTMLElement,\n rect: LocalRect,\n): HTMLElement {\n if (!overlay.parentElement) wrapper.appendChild(overlay)\n\n const clone = cloneMorphElement(source)\n Object.assign(clone.style, {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n width: `${rect.width}px`,\n height: `${rect.height}px`,\n margin: \"0\",\n transformOrigin: \"top left\",\n pointerEvents: \"none\",\n boxSizing: \"border-box\",\n })\n overlay.appendChild(clone)\n return clone\n}\n\nfunction morphOptions(phase: ResolvedMorph): KeyframeAnimationOptions {\n return { duration: phase.duration, easing: phase.easing, delay: phase.delay, fill: \"both\" }\n}\n\nfunction runDescendantVisualStyleTransitions(\n clone: HTMLElement,\n source: HTMLElement,\n target: HTMLElement,\n phase: ResolvedMorph,\n): Animation[] {\n const animations: Animation[] = []\n const cloneChildren = clone.querySelectorAll<HTMLElement>(\"*\")\n const sourceChildren = source.querySelectorAll<HTMLElement>(\"*\")\n const targetChildren = target.querySelectorAll<HTMLElement>(\"*\")\n\n for (let i = 0; i < sourceChildren.length; i++) {\n const cloneChild = cloneChildren[i]\n const targetChild = targetChildren[i]\n if (!cloneChild || !targetChild) continue\n\n const sourceStyles = getComputedStyle(sourceChildren[i]!)\n const targetStyles = getComputedStyle(targetChild)\n if (!hasVisualStyleChange(sourceStyles, targetStyles)) continue\n\n animations.push(\n cloneChild.animate(\n [visualStyleKeyframe(sourceStyles), visualStyleKeyframe(targetStyles)],\n morphOptions(phase),\n ),\n )\n }\n return animations\n}\n\nfunction runStationaryMorph(\n clone: HTMLElement,\n rect: LocalRect,\n styles: CSSStyleDeclaration,\n fromOpacity: string,\n toOpacity: string,\n phase: ResolvedMorph,\n): Animation {\n const transform = morphTransform(rect, 1, 1, localTransform(styles))\n return clone.animate(\n [\n { ...visualStyleKeyframe(styles, fromOpacity), ...radiusKeyframe(styles), transform },\n { ...visualStyleKeyframe(styles, toOpacity), ...radiusKeyframe(styles), transform },\n ],\n morphOptions(phase),\n )\n}\n\n/**\n * Animate every `<MorphElement>` from where it sat on the outgoing slide to\n * where it sits on the incoming one. Clones are used rather than the originals\n * because the two slides are separate subtrees that both have to stay laid out.\n */\nfunction runMorphTransition(\n wrapper: HTMLElement,\n outgoingLayer: HTMLElement,\n incomingLayer: HTMLElement,\n phase: ResolvedMorph,\n): { animations: Animation[]; cleanup: () => void } {\n const wrapperRect = wrapper.getBoundingClientRect()\n if (wrapperRect.width === 0 || wrapperRect.height === 0) {\n return { animations: [], cleanup: () => {} }\n }\n\n const incoming = collectMorphElements(incomingLayer)\n const outgoing = collectMorphElements(outgoingLayer)\n\n const overlay = document.createElement(\"div\")\n overlay.setAttribute(\"data-slide-morph-layer\", \"\")\n Object.assign(overlay.style, {\n position: \"absolute\",\n inset: \"0\",\n zIndex: \"2147483647\",\n pointerEvents: \"none\",\n })\n\n const animations: Animation[] = []\n const restore: Array<() => void> = []\n\n // An element with no counterpart (or no usable rect on one side) cannot\n // travel, so it fades in place instead of morphing.\n const fadeOutSource = (source: HTMLElement, from: LocalRect) => {\n const clone = appendPositionedClone(wrapper, overlay, source, from)\n restore.push(hideOriginal(source))\n animations.push(\n runStationaryMorph(\n clone,\n from,\n getComputedStyle(source),\n effectiveOpacity(source, outgoingLayer),\n \"0\",\n phase,\n ),\n )\n }\n\n const fadeInTarget = (target: HTMLElement, to: LocalRect) => {\n const clone = appendPositionedClone(wrapper, overlay, target, to)\n restore.push(hideOriginal(target))\n animations.push(\n runStationaryMorph(\n clone,\n to,\n getComputedStyle(target),\n \"0\",\n effectiveOpacity(target, incomingLayer),\n phase,\n ),\n )\n }\n\n for (const [id, source] of outgoing) {\n const target = incoming.get(id)\n const from = measureLocalRect(source, wrapper, wrapperRect)\n if (!hasUsableRect(from)) {\n if (target) {\n const to = measureLocalRect(target, wrapper, wrapperRect)\n if (hasUsableRect(to)) fadeInTarget(target, to)\n }\n continue\n }\n\n if (!target) {\n fadeOutSource(source, from)\n continue\n }\n\n const to = measureLocalRect(target, wrapper, wrapperRect)\n if (!hasUsableRect(to)) {\n fadeOutSource(source, from)\n continue\n }\n\n const clone = appendPositionedClone(wrapper, overlay, source, from)\n restore.push(hideOriginal(source), hideOriginal(target))\n\n const sourceStyles = getComputedStyle(source)\n const targetStyles = getComputedStyle(target)\n const fromOpacity = effectiveOpacity(source, outgoingLayer)\n const toOpacity = effectiveOpacity(target, incomingLayer)\n const needsBorderFrame = hasVisibleBorder(sourceStyles) || hasVisibleBorder(targetStyles)\n const scaleX = to.width / from.width\n const scaleY = to.height / from.height\n\n if (needsBorderFrame) {\n hideBorderColors(clone)\n const borderFrame = appendBorderFrame(wrapper, overlay, sourceStyles, targetStyles, from)\n animations.push(\n borderFrame.animate(\n [\n borderFrameKeyframe(from, sourceStyles, fromOpacity),\n borderFrameKeyframe(to, targetStyles, toOpacity),\n ],\n morphOptions(phase),\n ),\n )\n }\n\n animations.push(\n clone.animate(\n [\n {\n ...visualStyleKeyframe(sourceStyles, fromOpacity, {\n includeBorderColors: !needsBorderFrame,\n }),\n ...radiusKeyframe(sourceStyles),\n transform: morphTransform(from, 1, 1, localTransform(sourceStyles)),\n },\n {\n ...visualStyleKeyframe(targetStyles, toOpacity, {\n includeBorderColors: !needsBorderFrame,\n }),\n ...radiusKeyframe(targetStyles, scaleX, scaleY),\n transform: morphTransform(to, scaleX, scaleY, localTransform(targetStyles)),\n },\n ],\n morphOptions(phase),\n ),\n ...runDescendantVisualStyleTransitions(clone, source, target, phase),\n )\n }\n\n for (const [id, target] of incoming) {\n if (outgoing.has(id)) continue\n const to = measureLocalRect(target, wrapper, wrapperRect)\n if (!hasUsableRect(to)) continue\n fadeInTarget(target, to)\n }\n\n if (animations.length === 0) overlay.remove()\n\n let cleaned = false\n return {\n animations,\n cleanup: () => {\n if (cleaned) return\n cleaned = true\n for (const fn of restore) fn()\n overlay.remove()\n },\n }\n}\n\n/**\n * Holds the outgoing and incoming slides side by side while their transition\n * plays. Also the only place a slide's `<Steps>` host is mounted, so step\n * state is scoped to the slide that owns it.\n */\nexport function SlideTransitionLayer({\n slides,\n transitions,\n index,\n disabled,\n stepControllerRef,\n entryDirection = \"jump\",\n}: TransitionLayerProps) {\n const [current, setCurrent] = useState(index)\n const [outgoing, setOutgoing] = useState<number | null>(null)\n const [direction, setDirection] = useState<Direction>(\"forward\")\n\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n const outgoingLayerRef = useRef<HTMLDivElement | null>(null)\n const incomingLayerRef = useRef<HTMLDivElement | null>(null)\n const animationsRef = useRef<Animation[]>([])\n const cleanupRef = useRef<(() => void) | null>(null)\n const currentRef = useRef(current)\n currentRef.current = current\n\n useEffect(() => {\n if (index === currentRef.current) return\n\n const prev = currentRef.current\n const next = index\n\n // Interrupt: cancel whatever is in flight. The slide that was arriving\n // becomes the new outgoing one, and React reuses its DOM slot.\n for (const animation of animationsRef.current) {\n try {\n animation.cancel()\n } catch {\n /* already finished or detached */\n }\n }\n animationsRef.current = []\n cleanupRef.current?.()\n cleanupRef.current = null\n\n if (disabled || !transitions[next]) {\n setCurrent(next)\n setOutgoing(null)\n return\n }\n\n setDirection(next > prev ? \"forward\" : \"backward\")\n setOutgoing(prev)\n setCurrent(next)\n }, [index, transitions, disabled])\n\n useLayoutEffect(() => {\n if (outgoing === null) return\n\n const transition = transitions[current]\n const wrapper = wrapperRef.current\n const out = outgoingLayerRef.current\n const inc = incomingLayerRef.current\n if (!transition || !wrapper || !out || !inc) {\n setOutgoing(null)\n return\n }\n\n wrapper.dataset.slideDir = direction\n wrapper.style.setProperty(\"--slide-dir\", direction === \"forward\" ? \"1\" : \"-1\")\n\n const easing = transition.easing ?? DEFAULT_EASING\n const duration = transition.duration\n\n // Morph elements are measured before the enter/exit phases start: phase\n // keyframes apply immediately (fill: both), so a transform in the enter's\n // first keyframe would offset every measured rect and land the clones off\n // their true resting positions.\n const morphPhase = resolveMorph(transition.morph, duration, easing)\n const morphRun = morphPhase ? runMorphTransition(wrapper, out, inc, morphPhase) : null\n\n const animations: Animation[] = []\n const exitAnimation = runPhase(out, transition.exit, duration, easing)\n const enterAnimation = runPhase(inc, transition.enter, duration, easing)\n if (exitAnimation) animations.push(exitAnimation)\n if (enterAnimation) animations.push(enterAnimation)\n\n const cleanups: Array<() => void> = []\n if (morphRun) {\n animations.push(...morphRun.animations)\n cleanups.push(morphRun.cleanup)\n // With no exit phase the outgoing slide would sit under the morphing\n // clones at full opacity; hide it for the duration.\n if (!exitAnimation && morphRun.animations.length > 0) cleanups.push(hideOriginal(out))\n }\n animationsRef.current = animations\n\n if (animations.length === 0) {\n for (const fn of cleanups) fn()\n setOutgoing(null)\n return\n }\n\n let cleaned = false\n const cleanup = () => {\n if (cleaned) return\n cleaned = true\n for (const fn of cleanups) fn()\n if (cleanupRef.current === cleanup) cleanupRef.current = null\n }\n cleanupRef.current = cleanup\n\n let cancelled = false\n Promise.all(animations.map((a) => a.finished))\n .then(() => {\n if (cancelled) return\n cleanup()\n animationsRef.current = []\n setOutgoing(null)\n })\n .catch(() => {\n // AbortError, thrown when an interrupt cancels mid-flight.\n })\n\n return () => {\n cancelled = true\n }\n }, [outgoing, current, direction, transitions])\n\n useEffect(() => {\n return () => {\n for (const animation of animationsRef.current) {\n try {\n animation.cancel()\n } catch {\n /* already finished or detached */\n }\n }\n animationsRef.current = []\n cleanupRef.current?.()\n cleanupRef.current = null\n }\n }, [])\n\n const total = slides.length\n const currentSlide = slides[current]\n const outgoingSlide = outgoing !== null ? slides[outgoing] : null\n\n // The outgoing layer mirrors the direction just navigated, so its `<Steps>`\n // re-mount in the state the audience just saw: going forward, the slide left\n // behind was fully revealed; going back, it was at zero.\n const outgoingEntryDirection: EntryDirection =\n entryDirection === \"backward\" ? \"forward\" : \"backward\"\n\n const fallbackControllerRef = useRef<StepController | null>(null)\n const controllerRef = stepControllerRef ?? fallbackControllerRef\n\n return (\n <div\n ref={wrapperRef}\n style={{\n position: \"relative\",\n height: \"100%\",\n width: \"100%\",\n overflow: \"hidden\",\n background: \"var(--slide-bg)\",\n }}\n >\n {outgoingSlide && outgoing !== null ? (\n <div ref={outgoingLayerRef} style={{ position: \"absolute\", inset: 0 }}>\n <SlideNumberProvider index={outgoing} total={total}>\n <StepHost\n isActiveSlide={false}\n entryDirection={outgoingEntryDirection}\n controllerRef={controllerRef}\n >\n {outgoingSlide}\n </StepHost>\n </SlideNumberProvider>\n </div>\n ) : null}\n {currentSlide ? (\n <div ref={incomingLayerRef} style={{ position: \"absolute\", inset: 0 }}>\n <SlideNumberProvider index={current} total={total}>\n <StepHost isActiveSlide entryDirection={entryDirection} controllerRef={controllerRef}>\n {currentSlide}\n </StepHost>\n </SlideNumberProvider>\n </div>\n ) : null}\n </div>\n )\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/lib/use-click-page-navigation.ts\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: `data-osd-*` selectors renamed to `data-slide-*`; the\n * `onViewportClick` hook (the authoring IDE's comment pins)\n * dropped.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport { useEffect, type RefObject } from \"react\"\n\n/**\n * Clicks landing on (or inside) any of these never navigate, so interactive\n * slide content and the deck's own toolbar keep their clicks. An author can\n * opt anything else out with `data-slide-interactive`.\n */\nconst PASSTHROUGH =\n 'a, button, input, textarea, select, label, summary, iframe, video, audio, embed, object, [role=\"button\"], [role=\"link\"], [contenteditable=\"true\"], [data-slide-interactive], [data-slide-chrome]'\n\ninterface UseClickNavOptions<T extends HTMLElement> {\n ref: RefObject<T | null>\n enabled?: boolean\n /** Fraction of the width on each side that navigates; the middle is inert. */\n edgeRatio?: number\n canPrev: boolean\n canNext: boolean\n onPrev: () => void\n onNext: () => void\n}\n\nexport function useClickNav<T extends HTMLElement>({\n ref,\n enabled = true,\n edgeRatio = 0.3,\n canPrev,\n canNext,\n onPrev,\n onNext,\n}: UseClickNavOptions<T>) {\n useEffect(() => {\n const el = ref.current\n if (!el || !enabled) return\n\n const onClick = (event: MouseEvent) => {\n if (event.button !== 0 || event.defaultPrevented) return\n const target = event.target\n if (target instanceof Element && target.closest(PASSTHROUGH)) return\n // Finishing a text selection should not also turn the page.\n if (window.getSelection()?.toString()) return\n\n const rect = el.getBoundingClientRect()\n if (rect.width === 0) return\n const x = (event.clientX - rect.left) / rect.width\n if (x < edgeRatio) {\n if (canPrev) onPrev()\n } else if (x > 1 - edgeRatio) {\n if (canNext) onNext()\n }\n }\n\n el.addEventListener(\"click\", onClick)\n return () => el.removeEventListener(\"click\", onClick)\n }, [ref, enabled, edgeRatio, canPrev, canNext, onPrev, onNext])\n}\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/components/player.tsx\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: only the playback core was taken. The present chrome,\n * presenter-window BroadcastChannel, overview grid, notes\n * drawer, thumbnail rail and slide-module loading all belong\n * to open-slide's authoring app and have no counterpart here.\n * Slides come from children rather than an exported array,\n * and the current slide is kept in the URL via `useSearchState`.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport {\n Children,\n isValidElement,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type PropsWithChildren,\n type ReactElement,\n type ReactNode,\n} from \"react\"\nimport { useSearchState } from \"../router\"\nimport { SlideCanvas } from \"./canvas\"\nimport { exportDeckAsPptx, type PptxExportProgress } from \"./export-pptx\"\nimport { hasModifier, isBackwardKey, isForwardKey, isTypingTarget } from \"./keys\"\nimport { SlideRail } from \"./rail\"\nimport { SlideToolbar } from \"./toolbar\"\nimport { themeToCssVars } from \"./theme\"\nimport { SlideTransitionLayer } from \"./transition-layer\"\nimport type { StepController } from \"./steps\"\nimport type { EntryDirection, SlideTheme, SlideTransition } from \"./types\"\nimport { useClickNav } from \"./use-click-nav\"\nimport { usePrefersReducedMotion } from \"./use-prefers-reduced-motion\"\n\nexport interface SlideProps {\n /** How this slide arrives when navigated to. Omit for a hard cut. */\n transition?: SlideTransition\n children: ReactNode\n}\n\n/**\n * One slide. A marker component: `<SlideDeck>` reads the children it holds and\n * the `transition` it carries, and renders the body itself so the slide can be\n * mounted offscreen for the pptx export as well as on screen.\n */\nexport function Slide({ children }: SlideProps) {\n return <>{children}</>\n}\nSlide.displayName = \"Slide\"\n\nexport interface SlideDeckProps {\n /** Token overrides for this deck; anything omitted follows the app's theme. */\n theme?: SlideTheme\n /**\n * Render in the page flow at 16:9 instead of covering the viewport. For\n * embedding a deck inside a dashboard page.\n */\n embedded?: boolean\n /** Base name of the exported pptx. Defaults to the last URL segment. */\n exportName?: string\n /**\n * Whether the slide list starts open. Defaults to `true` for a deck that\n * covers the viewport and `false` for an `embedded` one, where a 16:9 box in\n * the page flow has no width to spare. The reader can toggle it either way\n * from the toolbar or with `L`; this only picks where they start.\n */\n rail?: boolean\n children: ReactNode\n}\n\nfunction collectSlides(children: ReactNode): {\n slides: ReactElement[]\n transitions: (SlideTransition | undefined)[]\n} {\n const slides: ReactElement[] = []\n const transitions: (SlideTransition | undefined)[] = []\n for (const child of Children.toArray(children)) {\n if (!isValidElement(child) || child.type !== Slide) continue\n slides.push(child)\n transitions.push((child.props as SlideProps).transition)\n }\n return { slides, transitions }\n}\n\n/**\n * Whether this document may go fullscreen. False inside an iframe that was not\n * given `allow=\"fullscreen\"`, where `requestFullscreen()` can only reject.\n */\nfunction fullscreenEnabled(): boolean {\n if (typeof document === \"undefined\") return false\n return document.fullscreenEnabled === true\n}\n\n/** Last non-empty path segment, or \"slides\" at the root. */\nfunction defaultExportName(): string {\n if (typeof window === \"undefined\") return \"slides\"\n const parts = window.location.pathname.split(\"/\").filter(Boolean)\n return parts[parts.length - 1] ?? \"slides\"\n}\n\n/**\n * A deck of slides on one page. Covers the viewport by default so the app's\n * layout is out of the way, without changing the router structure: the layout\n * stays mounted underneath, so the nav and every other page keep working\n * exactly as before.\n */\nexport function SlideDeck({\n theme,\n embedded = false,\n exportName,\n // Reads `embedded` from earlier in this same pattern, which is why the two\n // must stay in this order.\n rail = !embedded,\n children,\n}: SlideDeckProps) {\n const { slides, transitions } = useMemo(() => collectSlides(children), [children])\n const total = slides.length\n\n // The slide number lives in the URL, so a link can point at slide 4 and the\n // browser's back button leaves the deck instead of stepping through it\n // (`useSearchState` replaces by default rather than pushing).\n const [page, setPage] = useSearchState<number>(\"p\", 1)\n const index = Math.min(Math.max(Math.floor(page) - 1, 0), Math.max(total - 1, 0))\n\n // In the URL for the same reason as the slide number: \"open it with the list\n // showing\" is a thing you send someone. Writing the default clears the key,\n // so a deck left as the author set it carries no `?rail` at all.\n const [railOpen, setRailOpen] = useSearchState<boolean>(\"rail\", rail)\n const [isFullscreen, setIsFullscreen] = useState(false)\n const [canFullscreen] = useState(fullscreenEnabled)\n\n const [entryDirection, setEntryDirection] = useState<EntryDirection>(\"jump\")\n const [exporting, setExporting] = useState<PptxExportProgress | null>(null)\n const stepControllerRef = useRef<StepController | null>(null)\n const viewportRef = useRef<HTMLDivElement>(null)\n const stageRef = useRef<HTMLDivElement>(null)\n // Honoured here rather than per transition: a reader who asked for less\n // motion wants the cut, not a shorter version of the animation.\n const reduceMotion = usePrefersReducedMotion()\n\n const goTo = useCallback(\n (next: number, direction: EntryDirection) => {\n const clamped = Math.min(Math.max(next, 0), Math.max(total - 1, 0))\n setEntryDirection(direction)\n setPage(clamped + 1)\n },\n [setPage, total],\n )\n\n // Steps come first: \"next\" finishes revealing the current slide before it\n // moves on, which is the whole point of authoring them.\n const goNext = useCallback(() => {\n if (stepControllerRef.current?.advance()) return\n if (index < total - 1) goTo(index + 1, \"forward\")\n }, [goTo, index, total])\n\n const goPrev = useCallback(() => {\n if (stepControllerRef.current?.retreat()) return\n if (index > 0) goTo(index - 1, \"backward\")\n }, [goTo, index])\n\n const toggleRail = useCallback(() => setRailOpen((open) => !open), [setRailOpen])\n\n const toggleFullscreen = useCallback(() => {\n const el = viewportRef.current\n if (!el || !fullscreenEnabled()) return\n // A rejection leaves the view as it was; `fullscreenchange` stays the only\n // thing that moves `isFullscreen`.\n if (document.fullscreenElement) document.exitFullscreen().catch(() => {})\n else el.requestFullscreen?.().catch(() => {})\n }, [])\n\n // The browser owns fullscreen — Escape and the window chrome leave it\n // without going through `toggleFullscreen` — so the event is the only\n // trustworthy source for which of the three views is on screen.\n useEffect(() => {\n const onChange = () => setIsFullscreen(document.fullscreenElement === viewportRef.current)\n document.addEventListener(\"fullscreenchange\", onChange)\n return () => document.removeEventListener(\"fullscreenchange\", onChange)\n }, [])\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (isTypingTarget(event.target)) return\n if (isForwardKey(event)) {\n event.preventDefault()\n goNext()\n return\n }\n if (isBackwardKey(event)) {\n event.preventDefault()\n goPrev()\n return\n }\n if (hasModifier(event)) return\n if (event.key === \"Home\") {\n event.preventDefault()\n goTo(0, \"jump\")\n return\n }\n if (event.key === \"End\") {\n event.preventDefault()\n goTo(total - 1, \"jump\")\n return\n }\n if (event.key === \"f\" || event.key === \"F\") {\n event.preventDefault()\n toggleFullscreen()\n return\n }\n if (event.key === \"l\" || event.key === \"L\") {\n event.preventDefault()\n toggleRail()\n return\n }\n // Escape leaves fullscreen when in it (the browser handles that itself),\n // and otherwise leaves the deck — a deck covers the viewport, so there is\n // no visible way back except the toolbar.\n if (event.key === \"Escape\" && !document.fullscreenElement) {\n window.history.back()\n }\n }\n window.addEventListener(\"keydown\", onKeyDown)\n return () => window.removeEventListener(\"keydown\", onKeyDown)\n }, [goNext, goPrev, goTo, toggleFullscreen, toggleRail, total])\n\n useClickNav({\n // The stage, not the whole deck: the edge thirds that turn the page are\n // measured against the slide, so opening the rail must not shift them.\n ref: stageRef,\n canPrev: true,\n canNext: true,\n onPrev: goPrev,\n onNext: goNext,\n })\n\n // A covering deck would otherwise leave the page behind it scrollable, and\n // a stray scroll shifts the canvas out from under the viewer.\n useEffect(() => {\n if (embedded) return\n const previous = document.body.style.overflow\n document.body.style.overflow = \"hidden\"\n return () => {\n document.body.style.overflow = previous\n }\n }, [embedded])\n\n const selectSlide = useCallback(\n (next: number) => goTo(next, \"jump\"),\n [goTo],\n )\n\n const onExport = useCallback(async () => {\n if (exporting) return\n try {\n await exportDeckAsPptx({\n slides,\n theme,\n fileName: exportName ?? defaultExportName(),\n onProgress: setExporting,\n })\n } finally {\n setExporting(null)\n }\n }, [exporting, slides, theme, exportName])\n\n const themeVars = themeToCssVars(theme)\n // Three views, two of them the same one with the list open or shut:\n // fullscreen is the slide alone, so the rail steps aside there without\n // forgetting that the reader had it open.\n const showRail = railOpen && !isFullscreen\n\n return (\n <div\n ref={viewportRef}\n data-slide-deck=\"\"\n style={\n embedded\n ? { position: \"relative\", width: \"100%\", aspectRatio: \"16 / 9\", background: \"var(--slide-bg)\" }\n : {\n position: \"fixed\",\n inset: 0,\n zIndex: 50,\n background: \"var(--slide-bg)\",\n ...themeVars,\n }\n }\n >\n <div style={{ display: \"flex\", height: \"100%\", width: \"100%\" }}>\n {showRail ? (\n <SlideRail slides={slides} index={index} onSelect={selectSlide} themeVars={themeVars} />\n ) : null}\n {/* The stage owns the toolbar and the click targets so both stay\n centred on the slide rather than on the slide plus the rail. */}\n <div ref={stageRef} style={{ position: \"relative\", flex: \"1 1 auto\", minWidth: 0 }}>\n <SlideCanvas themeVars={themeVars}>\n <SlideTransitionLayer\n slides={slides}\n transitions={transitions}\n index={index}\n disabled={reduceMotion}\n stepControllerRef={stepControllerRef}\n entryDirection={entryDirection}\n />\n </SlideCanvas>\n <SlideToolbar\n current={index + 1}\n total={total}\n onPrev={goPrev}\n onNext={goNext}\n onFullscreen={toggleFullscreen}\n canFullscreen={canFullscreen}\n onExport={onExport}\n exportProgress={exporting}\n railOpen={railOpen}\n onToggleRail={toggleRail}\n isFullscreen={isFullscreen}\n />\n </div>\n </div>\n </div>\n )\n}\nSlideDeck.displayName = \"SlideDeck\"\n\n/** Convenience wrapper so a deck file can type its children. */\nexport type SlideDeckChildren = PropsWithChildren\n","/**\n * Ported from open-slide (MIT) — https://github.com/1weiho/open-slide\n * Source: packages/core/src/app/components/morph-element.tsx\n * Upstream commit: 90bb86172f7e390c29bbf2f33067c7b05c646b70 (2026-08-29)\n * Changes: `data-osd-morph` renamed to `data-slide-morph`.\n * Copyright (c) 2026 Yiwei Ho. Licensed under the MIT License.\n * See packages/vantage/NOTICE for the full text.\n */\nimport {\n Children,\n cloneElement,\n isValidElement,\n type CSSProperties,\n type ReactElement,\n type ReactNode,\n} from \"react\"\n\nexport interface MorphElementProps {\n /** Shared across slides: the same id on two slides animates between them. */\n id: string\n children: ReactNode\n className?: string\n style?: CSSProperties\n}\n\ninterface MorphChildProps {\n className?: string\n style?: CSSProperties\n \"data-slide-morph\"?: string\n}\n\n/**\n * Marks an element as the same thing on the next slide. A single host child\n * is tagged in place so no wrapper element is added to the layout; anything\n * else gets a `<div>`.\n */\nexport function MorphElement({ id, children, className, style }: MorphElementProps) {\n const child = Children.toArray(children)[0] ?? null\n\n if (\n Children.count(children) === 1 &&\n isValidElement<MorphChildProps>(child) &&\n typeof child.type === \"string\"\n ) {\n return cloneElement(child as ReactElement<MorphChildProps>, {\n \"data-slide-morph\": id,\n className: [child.props.className, className].filter(Boolean).join(\" \") || undefined,\n style: style ? { ...child.props.style, ...style } : child.props.style,\n })\n }\n\n return (\n <div className={className} style={style} data-slide-morph={id}>\n {children}\n </div>\n )\n}\n"]}
|